aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.mailmap2
-rw-r--r--CREDITS8
-rw-r--r--Documentation/ABI/testing/sysfs-fs-f2fs21
-rw-r--r--Documentation/ABI/testing/sysfs-power2
-rw-r--r--Documentation/DMA-API.txt55
-rw-r--r--Documentation/admin-guide/LSM/tomoyo.rst24
-rw-r--r--Documentation/conf.py62
-rw-r--r--Documentation/core-api/workqueue.rst12
-rw-r--r--Documentation/cpu-freq/index.txt2
-rw-r--r--Documentation/device-mapper/dm-raid.txt1
-rw-r--r--Documentation/devicetree/bindings/arm/amlogic.txt41
-rw-r--r--Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt4
-rw-r--r--Documentation/devicetree/bindings/arm/bhf.txt6
-rw-r--r--Documentation/devicetree/bindings/arm/cpus.txt1
-rw-r--r--Documentation/devicetree/bindings/arm/marvell/armada-8kp.txt15
-rw-r--r--Documentation/devicetree/bindings/arm/mediatek.txt18
-rw-r--r--Documentation/devicetree/bindings/arm/omap/omap.txt9
-rw-r--r--Documentation/devicetree/bindings/arm/qcom.txt2
-rw-r--r--Documentation/devicetree/bindings/arm/rockchip.txt12
-rw-r--r--Documentation/devicetree/bindings/arm/shmobile.txt8
-rw-r--r--Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt22
-rw-r--r--Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt9
-rw-r--r--Documentation/devicetree/bindings/clock/at91-clock.txt10
-rw-r--r--Documentation/devicetree/bindings/clock/idt,versaclock5.txt30
-rw-r--r--Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt3
-rw-r--r--Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt55
-rw-r--r--Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.txt8
-rw-r--r--Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt28
-rw-r--r--Documentation/devicetree/bindings/clock/snps,pll-clock.txt28
-rw-r--r--Documentation/devicetree/bindings/clock/st,stm32h7-rcc.txt71
-rw-r--r--Documentation/devicetree/bindings/clock/sunxi-ccu.txt6
-rw-r--r--Documentation/devicetree/bindings/clock/uniphier-clock.txt8
-rw-r--r--Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt1
-rw-r--r--Documentation/devicetree/bindings/display/renesas,du.txt51
-rw-r--r--Documentation/devicetree/bindings/dma/ti-edma.txt95
-rw-r--r--Documentation/devicetree/bindings/eeprom/eeprom.txt6
-rw-r--r--Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt1
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-altera.txt39
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-mtk.txt15
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-rcar.txt5
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-rk3x.txt1
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt5
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-sprd.txt31
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-stm32.txt29
-rw-r--r--Documentation/devicetree/bindings/input/pwm-vibrator.txt66
-rw-r--r--Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt1
-rw-r--r--Documentation/devicetree/bindings/iommu/qcom,iommu.txt121
-rw-r--r--Documentation/devicetree/bindings/iommu/rockchip,iommu.txt5
-rw-r--r--Documentation/devicetree/bindings/leds/ams,as3645a.txt28
-rw-r--r--Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt15
-rw-r--r--Documentation/devicetree/bindings/mips/lantiq/fpi-bus.txt31
-rw-r--r--Documentation/devicetree/bindings/mips/lantiq/rcu-gphy.txt36
-rw-r--r--Documentation/devicetree/bindings/mips/lantiq/rcu.txt89
-rw-r--r--Documentation/devicetree/bindings/mips/ni.txt7
-rw-r--r--Documentation/devicetree/bindings/mips/ralink.txt1
-rw-r--r--Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt52
-rw-r--r--Documentation/devicetree/bindings/mtd/qcom_nandc.txt65
-rw-r--r--Documentation/devicetree/bindings/net/can/c_can.txt13
-rw-r--r--Documentation/devicetree/bindings/net/marvell-pp2.txt10
-rw-r--r--Documentation/devicetree/bindings/net/mediatek-net.txt6
-rw-r--r--Documentation/devicetree/bindings/net/rockchip-dwmac.txt1
-rw-r--r--Documentation/devicetree/bindings/pci/mvebu-pci.txt2
-rw-r--r--Documentation/devicetree/bindings/phy/phy-lantiq-rcu-usb2.txt40
-rw-r--r--Documentation/devicetree/bindings/power/renesas,apmu.txt3
-rw-r--r--Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt1
-rw-r--r--Documentation/devicetree/bindings/power/supply/bq24190.txt51
-rw-r--r--Documentation/devicetree/bindings/power/supply/ltc2941.txt15
-rw-r--r--Documentation/devicetree/bindings/power/wakeup-source.txt9
-rw-r--r--Documentation/devicetree/bindings/pwm/pwm-bcm2835.txt4
-rw-r--r--Documentation/devicetree/bindings/pwm/pwm-mediatek.txt6
-rw-r--r--Documentation/devicetree/bindings/pwm/pwm-rockchip.txt11
-rw-r--r--Documentation/devicetree/bindings/pwm/pwm-tiecap.txt1
-rw-r--r--Documentation/devicetree/bindings/pwm/pwm-zx.txt22
-rw-r--r--Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt1
-rw-r--r--Documentation/devicetree/bindings/remoteproc/imx-rproc.txt33
-rw-r--r--Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt7
-rw-r--r--Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt5
-rw-r--r--Documentation/devicetree/bindings/remoteproc/ti,davinci-rproc.txt86
-rw-r--r--Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt73
-rw-r--r--Documentation/devicetree/bindings/reset/lantiq,reset.txt30
-rw-r--r--Documentation/devicetree/bindings/reset/renesas,rst.txt1
-rw-r--r--Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt28
-rw-r--r--Documentation/devicetree/bindings/reset/uniphier-reset.txt27
-rw-r--r--Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt17
-rw-r--r--Documentation/devicetree/bindings/rtc/isil,isl12057.txt1
-rw-r--r--Documentation/devicetree/bindings/rtc/realtek,rtd119x.txt16
-rw-r--r--Documentation/devicetree/bindings/rtc/sun6i-rtc.txt4
-rw-r--r--Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt6
-rw-r--r--Documentation/devicetree/bindings/serial/mtk-uart.txt1
-rw-r--r--Documentation/devicetree/bindings/serial/renesas,sci-serial.txt2
-rw-r--r--Documentation/devicetree/bindings/soc/mediatek/scpsys.txt3
-rw-r--r--Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt13
-rw-r--r--Documentation/devicetree/bindings/soc/rockchip/grf.txt3
-rw-r--r--Documentation/devicetree/bindings/soc/rockchip/power_domain.txt3
-rw-r--r--Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt5
-rw-r--r--Documentation/devicetree/bindings/sound/atmel-classd.txt9
-rw-r--r--Documentation/devicetree/bindings/sram/renesas,smp-sram.txt27
-rw-r--r--Documentation/devicetree/bindings/sram/sunxi-sram.txt9
-rw-r--r--Documentation/devicetree/bindings/thermal/mediatek-thermal.txt1
-rw-r--r--Documentation/devicetree/bindings/thermal/rockchip-thermal.txt1
-rw-r--r--Documentation/devicetree/bindings/thermal/uniphier-thermal.txt64
-rw-r--r--Documentation/devicetree/bindings/vendor-prefixes.txt4
-rw-r--r--Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt40
-rw-r--r--Documentation/devicetree/bindings/watchdog/lantiq-wdt.txt24
-rw-r--r--Documentation/devicetree/bindings/watchdog/meson-wdt.txt6
-rw-r--r--Documentation/devicetree/bindings/watchdog/mtk-wdt.txt8
-rw-r--r--Documentation/devicetree/bindings/watchdog/renesas-wdt.txt1
-rw-r--r--Documentation/driver-api/firmware/request_firmware.rst11
-rw-r--r--Documentation/driver-api/mtdnand.rst8
-rw-r--r--Documentation/driver-api/pm/devices.rst2
-rw-r--r--Documentation/driver-model/driver.txt7
-rw-r--r--Documentation/fb/fbcon.txt7
-rw-r--r--Documentation/filesystems/Locking2
-rw-r--r--Documentation/filesystems/cifs/AUTHORS5
-rw-r--r--Documentation/filesystems/cifs/README81
-rw-r--r--Documentation/filesystems/cifs/TODO72
-rw-r--r--Documentation/filesystems/cifs/cifs.txt24
-rw-r--r--Documentation/filesystems/f2fs.txt19
-rw-r--r--Documentation/filesystems/orangefs.txt14
-rw-r--r--Documentation/filesystems/porting2
-rw-r--r--Documentation/filesystems/sysfs.txt3
-rw-r--r--Documentation/filesystems/vfs.txt2
-rw-r--r--Documentation/i2c/i2c-topology6
-rw-r--r--Documentation/networking/bonding.txt2
-rw-r--r--Documentation/networking/filter.txt4
-rw-r--r--Documentation/networking/ip-sysctl.txt18
-rw-r--r--Documentation/networking/switchdev.txt68
-rw-r--r--Documentation/sysctl/kernel.txt1
-rw-r--r--Documentation/translations/ko_KR/memory-barriers.txt132
-rw-r--r--Documentation/userspace-api/seccomp_filter.rst52
-rw-r--r--Documentation/watchdog/watchdog-parameters.txt2
-rw-r--r--MAINTAINERS285
-rw-r--r--Makefile34
-rw-r--r--arch/alpha/include/asm/mmu_context.h1
-rw-r--r--arch/alpha/include/uapi/asm/siginfo.h14
-rw-r--r--arch/alpha/kernel/traps.c6
-rw-r--r--arch/arc/include/asm/processor.h3
-rw-r--r--arch/arc/kernel/setup.c2
-rw-r--r--arch/arc/kernel/troubleshoot.c2
-rw-r--r--arch/arm/Kconfig4
-rw-r--r--arch/arm/Kconfig.debug53
-rw-r--r--arch/arm/boot/dts/Makefile24
-rw-r--r--arch/arm/boot/dts/am335x-bone-common.dtsi3
-rw-r--r--arch/arm/boot/dts/am335x-chiliboard.dts3
-rw-r--r--arch/arm/boot/dts/am335x-evm.dts1
-rw-r--r--arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts525
-rw-r--r--arch/arm/boot/dts/am33xx.dtsi2
-rw-r--r--arch/arm/boot/dts/am437x-gp-evm.dts15
-rw-r--r--arch/arm/boot/dts/am43x-epos-evm.dts7
-rw-r--r--arch/arm/boot/dts/am571x-idk.dts35
-rw-r--r--arch/arm/boot/dts/am572x-idk.dts34
-rw-r--r--arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi36
-rw-r--r--arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts17
-rw-r--r--arch/arm/boot/dts/am57xx-beagle-x15-revc.dts39
-rw-r--r--arch/arm/boot/dts/am57xx-beagle-x15.dts11
-rw-r--r--arch/arm/boot/dts/am57xx-idk-common.dtsi8
-rw-r--r--arch/arm/boot/dts/armada-370.dtsi4
-rw-r--r--arch/arm/boot/dts/armada-375.dtsi4
-rw-r--r--arch/arm/boot/dts/armada-380.dtsi5
-rw-r--r--arch/arm/boot/dts/armada-385-db-ap.dts2
-rw-r--r--arch/arm/boot/dts/armada-385-turris-omnia.dts2
-rw-r--r--arch/arm/boot/dts/armada-385.dtsi6
-rw-r--r--arch/arm/boot/dts/armada-388-clearfog.dts2
-rw-r--r--arch/arm/boot/dts/armada-388-clearfog.dtsi2
-rw-r--r--arch/arm/boot/dts/armada-388-db.dts2
-rw-r--r--arch/arm/boot/dts/armada-388-gp.dts2
-rw-r--r--arch/arm/boot/dts/armada-388-rd.dts2
-rw-r--r--arch/arm/boot/dts/armada-38x.dtsi7
-rw-r--r--arch/arm/boot/dts/armada-390-db.dts2
-rw-r--r--arch/arm/boot/dts/armada-395-gp.dts2
-rw-r--r--arch/arm/boot/dts/armada-398-db.dts2
-rw-r--r--arch/arm/boot/dts/armada-39x.dtsi6
-rw-r--r--arch/arm/boot/dts/armada-xp-98dx3236.dtsi3
-rw-r--r--arch/arm/boot/dts/armada-xp-db.dts2
-rw-r--r--arch/arm/boot/dts/armada-xp-gp.dts2
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78230.dtsi7
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78260.dtsi11
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78460.dtsi14
-rw-r--r--arch/arm/boot/dts/aspeed-g4.dtsi4
-rw-r--r--arch/arm/boot/dts/at91-sama5d27_som1.dtsi102
-rw-r--r--arch/arm/boot/dts/at91-sama5d27_som1_ek.dts540
-rw-r--r--arch/arm/boot/dts/at91-sama5d2_xplained.dts39
-rw-r--r--arch/arm/boot/dts/at91sam9g45.dtsi21
-rw-r--r--arch/arm/boot/dts/at91sam9m10g45ek.dts4
-rw-r--r--arch/arm/boot/dts/bcm-cygnus.dtsi149
-rw-r--r--arch/arm/boot/dts/bcm-nsp.dtsi59
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-a-plus.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-a.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-b-plus.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-b.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-zero-w.dts139
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi-zero.dts6
-rw-r--r--arch/arm/boot/dts/bcm2835-rpi.dtsi2
-rw-r--r--arch/arm/boot/dts/bcm2836-rpi-2-b.dts6
-rw-r--r--arch/arm/boot/dts/bcm2836.dtsi1
-rw-r--r--arch/arm/boot/dts/bcm2837-rpi-3-b.dts52
-rw-r--r--arch/arm/boot/dts/bcm2837.dtsi (renamed from arch/arm64/boot/dts/broadcom/bcm2837.dtsi)1
-rw-r--r--arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts4
-rw-r--r--arch/arm/boot/dts/bcm4708-netgear-r6250.dts3
-rw-r--r--arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts6
-rw-r--r--arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts4
-rw-r--r--arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts5
-rw-r--r--arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts3
-rw-r--r--arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts3
-rw-r--r--arch/arm/boot/dts/bcm47189-tenda-ac9.dts2
-rw-r--r--arch/arm/boot/dts/bcm5301x.dtsi34
-rw-r--r--arch/arm/boot/dts/bcm53573.dtsi4
-rw-r--r--arch/arm/boot/dts/bcm911360_entphn.dts7
-rw-r--r--arch/arm/boot/dts/bcm947189acdbmr.dts97
-rw-r--r--arch/arm/boot/dts/bcm958522er.dts8
-rw-r--r--arch/arm/boot/dts/bcm958525er.dts8
-rw-r--r--arch/arm/boot/dts/bcm958525xmc.dts8
-rw-r--r--arch/arm/boot/dts/bcm958622hr.dts8
-rw-r--r--arch/arm/boot/dts/bcm958623hr.dts8
-rw-r--r--arch/arm/boot/dts/bcm958625hr.dts8
-rw-r--r--arch/arm/boot/dts/bcm958625k.dts8
-rw-r--r--arch/arm/boot/dts/da850-evm.dts7
-rw-r--r--arch/arm/boot/dts/da850-lego-ev3.dts24
-rw-r--r--arch/arm/boot/dts/dove-d3plug.dts4
-rw-r--r--arch/arm/boot/dts/dove.dtsi8
-rw-r--r--arch/arm/boot/dts/dra7-evm-common.dtsi258
-rw-r--r--arch/arm/boot/dts/dra7-evm.dts277
-rw-r--r--arch/arm/boot/dts/dra7.dtsi36
-rw-r--r--arch/arm/boot/dts/dra71-evm.dts32
-rw-r--r--arch/arm/boot/dts/dra72-evm-common.dtsi7
-rw-r--r--arch/arm/boot/dts/dra72-evm-revc.dts34
-rw-r--r--arch/arm/boot/dts/dra72-evm-tps65917.dtsi2
-rw-r--r--arch/arm/boot/dts/dra72-evm.dts32
-rw-r--r--arch/arm/boot/dts/dra72x-mmc-iodelay.dtsi350
-rw-r--r--arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi647
-rw-r--r--arch/arm/boot/dts/dra76-evm.dts423
-rw-r--r--arch/arm/boot/dts/dra76x.dtsi19
-rw-r--r--arch/arm/boot/dts/dra7xx-clocks.dtsi2
-rw-r--r--arch/arm/boot/dts/exynos3250-artik5-eval.dts1
-rw-r--r--arch/arm/boot/dts/exynos3250-artik5.dtsi1
-rw-r--r--arch/arm/boot/dts/exynos3250-monk.dts1
-rw-r--r--arch/arm/boot/dts/exynos3250-rinato.dts22
-rw-r--r--arch/arm/boot/dts/exynos4210-trats.dts21
-rw-r--r--arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi1
-rw-r--r--arch/arm/boot/dts/exynos4412-odroid-common.dtsi1
-rw-r--r--arch/arm/boot/dts/exynos4412-origen.dts1
-rw-r--r--arch/arm/boot/dts/exynos4412-trats2.dts22
-rw-r--r--arch/arm/boot/dts/exynos5250-arndale.dts2
-rw-r--r--arch/arm/boot/dts/exynos5250-smdk5250.dts2
-rw-r--r--arch/arm/boot/dts/exynos5250-snow-common.dtsi3
-rw-r--r--arch/arm/boot/dts/exynos5250-spring.dts2
-rw-r--r--arch/arm/boot/dts/exynos5260-xyref5260.dts2
-rw-r--r--arch/arm/boot/dts/exynos5410-smdk5410.dts2
-rw-r--r--arch/arm/boot/dts/exynos5420-peach-pit.dts3
-rw-r--r--arch/arm/boot/dts/exynos5440.dtsi2
-rw-r--r--arch/arm/boot/dts/exynos5800-peach-pi.dts3
-rw-r--r--arch/arm/boot/dts/gemini-dlink-dir-685.dts246
-rw-r--r--arch/arm/boot/dts/gemini-nas4220b.dts24
-rw-r--r--arch/arm/boot/dts/gemini-rut1xx.dts39
-rw-r--r--arch/arm/boot/dts/gemini-sq201.dts36
-rw-r--r--arch/arm/boot/dts/gemini-wbd111.dts26
-rw-r--r--arch/arm/boot/dts/gemini-wbd222.dts26
-rw-r--r--arch/arm/boot/dts/gemini.dtsi173
-rw-r--r--arch/arm/boot/dts/imx25.dtsi7
-rw-r--r--arch/arm/boot/dts/imx53-cx9020.dts297
-rw-r--r--arch/arm/boot/dts/imx53-pinfunc.h4
-rw-r--r--arch/arm/boot/dts/imx53.dtsi9
-rw-r--r--arch/arm/boot/dts/imx6dl-gw52xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6dl-gw53xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6dl-gw54xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6dl-riotboard.dts45
-rw-r--r--arch/arm/boot/dts/imx6q-apalis-eval.dts278
-rw-r--r--arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts291
-rw-r--r--arch/arm/boot/dts/imx6q-apalis-ixora.dts32
-rw-r--r--arch/arm/boot/dts/imx6q-b850v3.dts2
-rw-r--r--arch/arm/boot/dts/imx6q-bx50v3.dtsi42
-rw-r--r--arch/arm/boot/dts/imx6q-gw52xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6q-gw53xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6q-gw54xx.dts58
-rw-r--r--arch/arm/boot/dts/imx6qdl-apalis.dtsi44
-rw-r--r--arch/arm/boot/dts/imx6qdl-gw51xx.dtsi54
-rw-r--r--arch/arm/boot/dts/imx6qdl-gw52xx.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6qdl-gw53xx.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6qdl-gw54xx.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6qdl-gw553x.dtsi54
-rw-r--r--arch/arm/boot/dts/imx6qdl-icore-rqs.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi19
-rw-r--r--arch/arm/boot/dts/imx6qdl-sabrelite.dtsi19
-rw-r--r--arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi112
-rw-r--r--arch/arm/boot/dts/imx6qdl.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6sl.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6sx.dtsi1
-rw-r--r--arch/arm/boot/dts/imx6ul-14x14-evk.dts40
-rw-r--r--arch/arm/boot/dts/imx6ul-geam.dts (renamed from arch/arm/boot/dts/imx6ul-geam.dtsi)74
-rw-r--r--arch/arm/boot/dts/imx6ul-isiot-common.dtsi141
-rw-r--r--arch/arm/boot/dts/imx6ul-isiot-emmc.dts1
-rw-r--r--arch/arm/boot/dts/imx6ul-isiot-nand.dts1
-rw-r--r--arch/arm/boot/dts/imx6ul-isiot.dtsi183
-rw-r--r--arch/arm/boot/dts/imx6ul-liteboard.dts4
-rw-r--r--arch/arm/boot/dts/imx6ul.dtsi1
-rw-r--r--arch/arm/boot/dts/imx7-colibri.dtsi9
-rw-r--r--arch/arm/boot/dts/imx7d-sdb.dts93
-rw-r--r--arch/arm/boot/dts/imx7s.dtsi32
-rw-r--r--arch/arm/boot/dts/keystone-k2e-evm.dts18
-rw-r--r--arch/arm/boot/dts/keystone-k2e.dtsi20
-rw-r--r--arch/arm/boot/dts/keystone-k2g-evm.dts71
-rw-r--r--arch/arm/boot/dts/keystone-k2g-ice.dts18
-rw-r--r--arch/arm/boot/dts/keystone-k2g.dtsi204
-rw-r--r--arch/arm/boot/dts/keystone-k2hk-evm.dts53
-rw-r--r--arch/arm/boot/dts/keystone-k2hk.dtsi139
-rw-r--r--arch/arm/boot/dts/keystone-k2l-evm.dts33
-rw-r--r--arch/arm/boot/dts/keystone-k2l.dtsi71
-rw-r--r--arch/arm/boot/dts/kirkwood-6192.dtsi3
-rw-r--r--arch/arm/boot/dts/kirkwood-6281.dtsi3
-rw-r--r--arch/arm/boot/dts/kirkwood-6282.dtsi4
-rw-r--r--arch/arm/boot/dts/kirkwood-98dx4122.dtsi3
-rw-r--r--arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts2
-rw-r--r--arch/arm/boot/dts/meson.dtsi30
-rw-r--r--arch/arm/boot/dts/meson6.dtsi28
-rw-r--r--arch/arm/boot/dts/meson8.dtsi16
-rw-r--r--arch/arm/boot/dts/meson8b.dtsi33
-rw-r--r--arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi1
-rw-r--r--arch/arm/boot/dts/mt2701.dtsi106
-rw-r--r--arch/arm/boot/dts/mt6323.dtsi241
-rw-r--r--arch/arm/boot/dts/mt7623-evb.dts33
-rw-r--r--arch/arm/boot/dts/mt7623.dtsi211
-rw-r--r--arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts487
-rw-r--r--arch/arm/boot/dts/mt7623n-rfb-nand.dts111
-rw-r--r--arch/arm/boot/dts/mt7623n-rfb.dtsi92
-rw-r--r--arch/arm/boot/dts/omap3-beagle-xm.dts2
-rw-r--r--arch/arm/boot/dts/omap3-beagle.dts2
-rw-r--r--arch/arm/boot/dts/omap3-cm-t3517.dts2
-rw-r--r--arch/arm/boot/dts/omap3-cm-t3730.dts2
-rw-r--r--arch/arm/boot/dts/omap3-devkit8000-common.dtsi2
-rw-r--r--arch/arm/boot/dts/omap3-evm-common.dtsi2
-rw-r--r--arch/arm/boot/dts/omap3-n900.dts78
-rw-r--r--arch/arm/boot/dts/omap3-n950-n9.dtsi10
-rw-r--r--arch/arm/boot/dts/omap3-overo-base.dtsi2
-rw-r--r--arch/arm/boot/dts/omap3-tao3530.dtsi2
-rw-r--r--arch/arm/boot/dts/omap3-zoom3.dts2
-rw-r--r--arch/arm/boot/dts/omap3.dtsi4
-rw-r--r--arch/arm/boot/dts/omap3430-sdp.dts2
-rw-r--r--arch/arm/boot/dts/omap4-droid4-xt894.dts42
-rw-r--r--arch/arm/boot/dts/omap4-duovero-parlor.dts2
-rw-r--r--arch/arm/boot/dts/omap4-panda-common.dtsi2
-rw-r--r--arch/arm/boot/dts/omap4-sdp-es23plus.dts2
-rw-r--r--arch/arm/boot/dts/omap4-sdp.dts2
-rw-r--r--arch/arm/boot/dts/omap4-var-om44customboard.dtsi2
-rw-r--r--arch/arm/boot/dts/omap5-board-common.dtsi2
-rw-r--r--arch/arm/boot/dts/omap5-cm-t54.dts2
-rw-r--r--arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi29
-rw-r--r--arch/arm/boot/dts/qcom-ipq4019.dtsi109
-rw-r--r--arch/arm/boot/dts/qcom-msm8974.dtsi2
-rw-r--r--arch/arm/boot/dts/r7s72100-genmai.dts71
-rw-r--r--arch/arm/boot/dts/r7s72100-rskrza1.dts61
-rw-r--r--arch/arm/boot/dts/r7s72100.dtsi78
-rw-r--r--arch/arm/boot/dts/r8a7743-iwg20d-q7.dts31
-rw-r--r--arch/arm/boot/dts/r8a7743-iwg20m.dtsi26
-rw-r--r--arch/arm/boot/dts/r8a7743-sk-rzg1m.dts25
-rw-r--r--arch/arm/boot/dts/r8a7743.dtsi301
-rw-r--r--arch/arm/boot/dts/r8a7745-sk-rzg1e.dts25
-rw-r--r--arch/arm/boot/dts/r8a7745.dtsi30
-rw-r--r--arch/arm/boot/dts/r8a7790.dtsi30
-rw-r--r--arch/arm/boot/dts/r8a7791-koelsch.dts10
-rw-r--r--arch/arm/boot/dts/r8a7791.dtsi28
-rw-r--r--arch/arm/boot/dts/r8a7792.dtsi18
-rw-r--r--arch/arm/boot/dts/r8a7793.dtsi18
-rw-r--r--arch/arm/boot/dts/r8a7794.dtsi22
-rw-r--r--arch/arm/boot/dts/rk3036-kylin.dts2
-rw-r--r--arch/arm/boot/dts/rk3036.dtsi3
-rw-r--r--arch/arm/boot/dts/rk3066a-bqcurie2.dts2
-rw-r--r--arch/arm/boot/dts/rk3066a-mk808.dts2
-rw-r--r--arch/arm/boot/dts/rk3066a-rayeager.dts3
-rw-r--r--arch/arm/boot/dts/rk3188-px3-evb.dts2
-rw-r--r--arch/arm/boot/dts/rk3188-radxarock.dts1
-rw-r--r--arch/arm/boot/dts/rk3229-evb.dts129
-rw-r--r--arch/arm/boot/dts/rk3229.dtsi89
-rw-r--r--arch/arm/boot/dts/rk322x.dtsi199
-rw-r--r--arch/arm/boot/dts/rk3288-evb.dtsi51
-rw-r--r--arch/arm/boot/dts/rk3288-fennec.dts8
-rw-r--r--arch/arm/boot/dts/rk3288-firefly-reload-core.dtsi3
-rw-r--r--arch/arm/boot/dts/rk3288-firefly-reload.dts2
-rw-r--r--arch/arm/boot/dts/rk3288-firefly.dtsi5
-rw-r--r--arch/arm/boot/dts/rk3288-miqi.dts4
-rw-r--r--arch/arm/boot/dts/rk3288-phycore-rdk.dts1
-rw-r--r--arch/arm/boot/dts/rk3288-phycore-som.dtsi3
-rw-r--r--arch/arm/boot/dts/rk3288-popmetal.dts4
-rw-r--r--arch/arm/boot/dts/rk3288-r89.dts3
-rw-r--r--arch/arm/boot/dts/rk3288-rock2-som.dtsi3
-rw-r--r--arch/arm/boot/dts/rk3288-rock2-square.dts2
-rw-r--r--arch/arm/boot/dts/rk3288-tinker.dts8
-rw-r--r--arch/arm/boot/dts/rk3288-veyron-sdmmc.dtsi1
-rw-r--r--arch/arm/boot/dts/rk3288-veyron.dtsi4
-rw-r--r--arch/arm/boot/dts/rk3288.dtsi215
-rw-r--r--arch/arm/boot/dts/rv1108-evb.dts190
-rw-r--r--arch/arm/boot/dts/rv1108.dtsi369
-rw-r--r--arch/arm/boot/dts/sama5d2.dtsi77
-rw-r--r--arch/arm/boot/dts/spear1310.dtsi3
-rw-r--r--arch/arm/boot/dts/spear1340.dtsi1
-rw-r--r--arch/arm/boot/dts/ste-dbx5x0.dtsi15
-rw-r--r--arch/arm/boot/dts/stm32429i-eval.dts7
-rw-r--r--arch/arm/boot/dts/stm32f4-pinctrl.dtsi343
-rw-r--r--arch/arm/boot/dts/stm32f429-disco.dts3
-rw-r--r--arch/arm/boot/dts/stm32f429-pinctrl.dtsi (renamed from arch/arm/boot/dts/imx6ul-geam-kit.dts)98
-rw-r--r--arch/arm/boot/dts/stm32f429.dtsi322
-rw-r--r--arch/arm/boot/dts/stm32f469-disco.dts3
-rw-r--r--arch/arm/boot/dts/stm32f469-pinctrl.dtsi96
-rw-r--r--arch/arm/boot/dts/stm32f746.dtsi51
-rw-r--r--arch/arm/boot/dts/stm32f769-disco.dts6
-rw-r--r--arch/arm/boot/dts/stm32h743.dtsi127
-rw-r--r--arch/arm/boot/dts/stm32h743i-eval.dts18
-rw-r--r--arch/arm/boot/dts/sun6i-a31.dtsi6
-rw-r--r--arch/arm/boot/dts/sun7i-a20-cubietruck.dts4
-rw-r--r--arch/arm/boot/dts/sun8i-a23-a33.dtsi6
-rw-r--r--arch/arm/boot/dts/sun8i-a83t-allwinner-h8homlet-v2.dts85
-rw-r--r--arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts148
-rw-r--r--arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts101
-rw-r--r--arch/arm/boot/dts/sun8i-a83t.dtsi176
-rw-r--r--arch/arm/boot/dts/sun8i-h3-beelink-x2.dts22
-rw-r--r--arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts321
-rw-r--r--arch/arm/boot/dts/tegra114-dalmore.dts10
-rw-r--r--arch/arm/boot/dts/tegra124-jetson-tk1.dts12
-rw-r--r--arch/arm/boot/dts/tegra124.dtsi1
-rw-r--r--arch/arm/boot/dts/tegra20-paz00.dts2
-rw-r--r--arch/arm/boot/dts/tegra30-beaver.dts10
-rw-r--r--arch/arm/boot/dts/tps65217.dtsi3
-rw-r--r--arch/arm/boot/dts/uniphier-ld4-ref.dts10
-rw-r--r--arch/arm/boot/dts/uniphier-ld4.dtsi20
-rw-r--r--arch/arm/boot/dts/uniphier-ld6b-ref.dts10
-rw-r--r--arch/arm/boot/dts/uniphier-ld6b.dtsi2
-rw-r--r--arch/arm/boot/dts/uniphier-pinctrl.dtsi58
-rw-r--r--arch/arm/boot/dts/uniphier-pro4-ace.dts2
-rw-r--r--arch/arm/boot/dts/uniphier-pro4-ref.dts10
-rw-r--r--arch/arm/boot/dts/uniphier-pro4-sanji.dts2
-rw-r--r--arch/arm/boot/dts/uniphier-pro4.dtsi20
-rw-r--r--arch/arm/boot/dts/uniphier-pro5.dtsi60
-rw-r--r--arch/arm/boot/dts/uniphier-pxs2-gentil.dts2
-rw-r--r--arch/arm/boot/dts/uniphier-pxs2-vodka.dts2
-rw-r--r--arch/arm/boot/dts/uniphier-pxs2.dtsi22
-rw-r--r--arch/arm/boot/dts/uniphier-sld3-ref.dts75
-rw-r--r--arch/arm/boot/dts/uniphier-sld3.dtsi260
-rw-r--r--arch/arm/boot/dts/uniphier-sld8-ref.dts10
-rw-r--r--arch/arm/boot/dts/uniphier-sld8.dtsi20
-rw-r--r--arch/arm/boot/dts/versatile-pb.dts2
-rw-r--r--arch/arm/boot/dts/zx296702-ad1.dts2
-rw-r--r--arch/arm/boot/dts/zynq-7000.dtsi8
-rw-r--r--arch/arm/boot/dts/zynq-parallella.dts3
-rw-r--r--arch/arm/boot/dts/zynq-zc702.dts20
-rw-r--r--arch/arm/boot/dts/zynq-zc706.dts20
-rw-r--r--arch/arm/boot/dts/zynq-zed.dts5
-rw-r--r--arch/arm/boot/dts/zynq-zybo.dts5
-rw-r--r--arch/arm/configs/aspeed_g4_defconfig5
-rw-r--r--arch/arm/configs/aspeed_g5_defconfig4
-rw-r--r--arch/arm/configs/bcm2835_defconfig7
-rw-r--r--arch/arm/configs/davinci_all_defconfig2
-rw-r--r--arch/arm/configs/exynos_defconfig79
-rw-r--r--arch/arm/configs/ezx_defconfig1
-rw-r--r--arch/arm/configs/gemini_defconfig3
-rw-r--r--arch/arm/configs/imx_v6_v7_defconfig15
-rw-r--r--arch/arm/configs/ixp4xx_defconfig4
-rw-r--r--arch/arm/configs/keystone_defconfig13
-rw-r--r--arch/arm/configs/multi_v7_defconfig17
-rw-r--r--arch/arm/configs/omap2plus_defconfig4
-rw-r--r--arch/arm/configs/pxa_defconfig2
-rw-r--r--arch/arm/configs/qcom_defconfig1
-rw-r--r--arch/arm/configs/shmobile_defconfig18
-rw-r--r--arch/arm/configs/sunxi_defconfig15
-rw-r--r--arch/arm/configs/tegra_defconfig12
-rw-r--r--arch/arm/configs/vexpress_defconfig1
-rw-r--r--arch/arm/configs/viper_defconfig2
-rw-r--r--arch/arm/configs/zeus_defconfig2
-rw-r--r--arch/arm/include/asm/smp_scu.h1
-rw-r--r--arch/arm/include/asm/suspend.h2
-rw-r--r--arch/arm/include/asm/thread_info.h15
-rw-r--r--arch/arm/include/asm/uaccess.h2
-rw-r--r--arch/arm/include/debug/omap2plus.S109
-rw-r--r--arch/arm/kernel/cpuidle.c4
-rw-r--r--arch/arm/kernel/devtree.c5
-rw-r--r--arch/arm/kernel/entry-armv.S2
-rw-r--r--arch/arm/kernel/entry-common.S64
-rw-r--r--arch/arm/kernel/head.S2
-rw-r--r--arch/arm/kernel/hyp-stub.S1
-rw-r--r--arch/arm/kernel/iwmmxt.S1
-rw-r--r--arch/arm/kernel/signal.c10
-rw-r--r--arch/arm/kernel/sleep.S1
-rw-r--r--arch/arm/kernel/stacktrace.c1
-rw-r--r--arch/arm/kernel/topology.c3
-rw-r--r--arch/arm/mach-at91/Kconfig4
-rw-r--r--arch/arm/mach-at91/pm.c4
-rw-r--r--arch/arm/mach-davinci/board-da850-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-dm355-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-dm355-leopard.c2
-rw-r--r--arch/arm/mach-davinci/board-dm365-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-dm644x-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-dm646x-evm.c2
-rw-r--r--arch/arm/mach-davinci/board-sffsdr.c2
-rw-r--r--arch/arm/mach-dove/dove-db-setup.c2
-rw-r--r--arch/arm/mach-ep93xx/clock.c8
-rw-r--r--arch/arm/mach-ep93xx/core.c24
-rw-r--r--arch/arm/mach-ep93xx/edb93xx.c1
-rw-r--r--arch/arm/mach-ep93xx/include/mach/platform.h1
-rw-r--r--arch/arm/mach-ep93xx/snappercl15.c2
-rw-r--r--arch/arm/mach-ep93xx/soc.h1
-rw-r--r--arch/arm/mach-ep93xx/ts72xx.c2
-rw-r--r--arch/arm/mach-exynos/sleep.S1
-rw-r--r--arch/arm/mach-exynos/suspend.c7
-rw-r--r--arch/arm/mach-gemini/Kconfig5
-rw-r--r--arch/arm/mach-hisi/platsmp.c2
-rw-r--r--arch/arm/mach-imx/gpc.c4
-rw-r--r--arch/arm/mach-imx/mach-imx27_visstrim_m10.c44
-rw-r--r--arch/arm/mach-imx/mach-mx31moboard.c12
-rw-r--r--arch/arm/mach-imx/mach-qong.c2
-rw-r--r--arch/arm/mach-ixp4xx/ixdp425-setup.c2
-rw-r--r--arch/arm/mach-mediatek/mediatek.c2
-rw-r--r--arch/arm/mach-mediatek/platsmp.c1
-rw-r--r--arch/arm/mach-mmp/aspenite.c2
-rw-r--r--arch/arm/mach-mvebu/Kconfig2
-rw-r--r--arch/arm/mach-mvebu/kirkwood.c3
-rw-r--r--arch/arm/mach-omap1/board-fsample.c2
-rw-r--r--arch/arm/mach-omap1/board-h2.c2
-rw-r--r--arch/arm/mach-omap1/board-h3.c2
-rw-r--r--arch/arm/mach-omap1/board-nand.c2
-rw-r--r--arch/arm/mach-omap1/board-perseus2.c2
-rw-r--r--arch/arm/mach-omap2/Kconfig1
-rw-r--r--arch/arm/mach-omap2/board-generic.c1
-rw-r--r--arch/arm/mach-omap2/dma.c148
-rw-r--r--arch/arm/mach-omap2/hsmmc.c4
-rw-r--r--arch/arm/mach-omap2/id.c9
-rw-r--r--arch/arm/mach-omap2/omap-smp.c4
-rw-r--r--arch/arm/mach-omap2/omap-wakeupgen.c4
-rw-r--r--arch/arm/mach-omap2/omap_device.c10
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c4
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_7xx_data.c12
-rw-r--r--arch/arm/mach-omap2/pdata-quirks.c31
-rw-r--r--arch/arm/mach-omap2/powerdomains7xx_data.c33
-rw-r--r--arch/arm/mach-omap2/prm3xxx.c2
-rw-r--r--arch/arm/mach-omap2/prm44xx.c4
-rw-r--r--arch/arm/mach-omap2/sleep34xx.S2
-rw-r--r--arch/arm/mach-omap2/sleep44xx.S1
-rw-r--r--arch/arm/mach-omap2/soc.h5
-rw-r--r--arch/arm/mach-orion5x/db88f5281-setup.c2
-rw-r--r--arch/arm/mach-orion5x/kurobox_pro-setup.c2
-rw-r--r--arch/arm/mach-orion5x/ts209-setup.c2
-rw-r--r--arch/arm/mach-orion5x/ts78xx-setup.c2
-rw-r--r--arch/arm/mach-pxa/balloon3.c2
-rw-r--r--arch/arm/mach-pxa/em-x270.c2
-rw-r--r--arch/arm/mach-pxa/eseries.c2
-rw-r--r--arch/arm/mach-pxa/mioa701_bootresume.S2
-rw-r--r--arch/arm/mach-pxa/palmtx.c2
-rw-r--r--arch/arm/mach-pxa/tosa.c2
-rw-r--r--arch/arm/mach-rockchip/Kconfig2
-rw-r--r--arch/arm/mach-rockchip/platsmp.c6
-rw-r--r--arch/arm/mach-rockchip/sleep.S2
-rw-r--r--arch/arm/mach-s3c24xx/Kconfig2
-rw-r--r--arch/arm/mach-s3c24xx/common-smdk.c2
-rw-r--r--arch/arm/mach-s3c24xx/common.c2
-rw-r--r--arch/arm/mach-s3c24xx/include/mach/regs-clock.h4
-rw-r--r--arch/arm/mach-s3c24xx/mach-anubis.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-at2440evb.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-bast.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-gta02.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-jive.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-mini2440.c4
-rw-r--r--arch/arm/mach-s3c24xx/mach-osiris.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-qt2410.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-rx3715.c2
-rw-r--r--arch/arm/mach-s3c24xx/mach-smdk2443.c8
-rw-r--r--arch/arm/mach-s3c24xx/mach-vstms.c2
-rw-r--r--arch/arm/mach-s3c24xx/sleep.S11
-rw-r--r--arch/arm/mach-shmobile/Kconfig4
-rw-r--r--arch/arm/mach-shmobile/pm-rcar-gen2.c33
-rw-r--r--arch/arm/mach-shmobile/pm-rmobile.c7
-rw-r--r--arch/arm/mach-shmobile/setup-rcar-gen2.c21
-rw-r--r--arch/arm/mach-tegra/Kconfig2
-rw-r--r--arch/arm/mach-tegra/tegra.c29
-rw-r--r--arch/arm/mm/cache-v4wb.S1
-rw-r--r--arch/arm/mm/fault.c5
-rw-r--r--arch/arm/mm/proc-v7-3level.S3
-rw-r--r--arch/arm/mm/proc-xscale.S1
-rw-r--r--arch/arm/plat-samsung/include/plat/map-s3c.h2
-rw-r--r--arch/arm64/Kconfig.platforms7
-rw-r--r--arch/arm64/Makefile5
-rw-r--r--arch/arm64/boot/dts/allwinner/Makefile2
-rw-r--r--arch/arm64/boot/dts/allwinner/axp803.dtsi150
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts143
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts207
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts199
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts112
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts22
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi86
-rw-r--r--arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi9
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi17
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gx.dtsi46
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts77
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts19
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts9
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi23
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi10
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts6
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi73
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts8
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts7
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts63
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts77
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts17
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts7
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi10
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxl.dtsi74
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts14
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts1
-rw-r--r--arch/arm64/boot/dts/amlogic/meson-gxm.dtsi4
-rw-r--r--arch/arm64/boot/dts/apm/apm-shadowcat.dtsi2
-rw-r--r--arch/arm64/boot/dts/apm/apm-storm.dtsi5
-rw-r--r--arch/arm64/boot/dts/arm/foundation-v8.dtsi2
-rw-r--r--arch/arm64/boot/dts/arm/juno-base.dtsi14
-rw-r--r--arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi2
-rw-r--r--arch/arm64/boot/dts/broadcom/Makefile4
l---------arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi1
-rw-r--r--arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts42
l---------arch/arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi1
l---------arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-host.dtsi1
l---------arch/arm64/boot/dts/broadcom/bcm283x.dtsi1
-rw-r--r--arch/arm64/boot/dts/broadcom/northstar2/Makefile6
-rw-r--r--arch/arm64/boot/dts/broadcom/northstar2/ns2-clock.dtsi (renamed from arch/arm64/boot/dts/broadcom/ns2-clock.dtsi)0
-rw-r--r--arch/arm64/boot/dts/broadcom/northstar2/ns2-svk.dts (renamed from arch/arm64/boot/dts/broadcom/ns2-svk.dts)0
-rw-r--r--arch/arm64/boot/dts/broadcom/northstar2/ns2-xmc.dts (renamed from arch/arm64/boot/dts/broadcom/ns2-xmc.dts)0
-rw-r--r--arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi (renamed from arch/arm64/boot/dts/broadcom/ns2.dtsi)0
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi78
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts4
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts4
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/stingray-fs4.dtsi118
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/stingray-sata.dtsi278
-rw-r--r--arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi136
-rw-r--r--arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi19
-rw-r--r--arch/arm64/boot/dts/exynos/exynos5433.dtsi4
-rw-r--r--arch/arm64/boot/dts/exynos/exynos7-espresso.dts2
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi17
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts2
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi65
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts5
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts5
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts5
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi17
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts5
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts5
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi17
-rw-r--r--arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi51
-rw-r--r--arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts37
-rw-r--r--arch/arm64/boot/dts/hisilicon/hi3660.dtsi130
-rw-r--r--arch/arm64/boot/dts/hisilicon/hi6220.dtsi9
-rw-r--r--arch/arm64/boot/dts/hisilicon/hip07-d05.dts4
-rw-r--r--arch/arm64/boot/dts/hisilicon/hip07.dtsi22
-rw-r--r--arch/arm64/boot/dts/marvell/Makefile1
-rw-r--r--arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts30
-rw-r--r--arch/arm64/boot/dts/marvell/armada-37xx.dtsi11
-rw-r--r--arch/arm64/boot/dts/marvell/armada-7040-db.dts39
-rw-r--r--arch/arm64/boot/dts/marvell/armada-8040-db.dts65
-rw-r--r--arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts124
-rw-r--r--arch/arm64/boot/dts/marvell/armada-8080-db.dts67
-rw-r--r--arch/arm64/boot/dts/marvell/armada-8080.dtsi53
-rw-r--r--arch/arm64/boot/dts/marvell/armada-ap806.dtsi4
-rw-r--r--arch/arm64/boot/dts/marvell/armada-ap810-ap0-octa-core.dtsi104
-rw-r--r--arch/arm64/boot/dts/marvell/armada-ap810-ap0.dtsi163
-rw-r--r--arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi83
-rw-r--r--arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi83
-rw-r--r--arch/arm64/boot/dts/mediatek/Makefile2
-rw-r--r--arch/arm64/boot/dts/mediatek/mt2712-evb.dts32
-rw-r--r--arch/arm64/boot/dts/mediatek/mt2712e.dtsi171
-rw-r--r--arch/arm64/boot/dts/mediatek/mt6797.dtsi12
-rw-r--r--arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts27
-rw-r--r--arch/arm64/boot/dts/mediatek/mt7622.dtsi110
-rw-r--r--arch/arm64/boot/dts/qcom/Makefile1
-rw-r--r--arch/arm64/boot/dts/qcom/apq8016-sbc-pmic-pins.dtsi1
-rw-r--r--arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi17
-rw-r--r--arch/arm64/boot/dts/qcom/apq8096-db820c-pmic-pins.dtsi24
-rw-r--r--arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi198
-rw-r--r--arch/arm64/boot/dts/qcom/ipq8074-hk01.dts52
-rw-r--r--arch/arm64/boot/dts/qcom/ipq8074.dtsi194
-rw-r--r--arch/arm64/boot/dts/qcom/msm8916.dtsi120
-rw-r--r--arch/arm64/boot/dts/qcom/msm8996.dtsi314
-rw-r--r--arch/arm64/boot/dts/qcom/pmi8994.dtsi17
-rw-r--r--arch/arm64/boot/dts/renesas/Makefile1
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-es1-h3ulcb.dts2
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts2
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi9
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-h3ulcb.dts16
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-salvator-x.dts2
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dts8
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7795.dtsi314
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7796-m3ulcb.dts14
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7796-salvator-x.dts31
-rw-r--r--arch/arm64/boot/dts/renesas/r8a7796.dtsi414
-rw-r--r--arch/arm64/boot/dts/renesas/r8a77995-draak.dts46
-rw-r--r--arch/arm64/boot/dts/renesas/r8a77995.dtsi155
-rw-r--r--arch/arm64/boot/dts/renesas/salvator-common.dtsi4
-rw-r--r--arch/arm64/boot/dts/renesas/salvator-xs.dtsi10
-rw-r--r--arch/arm64/boot/dts/renesas/ulcb.dtsi51
-rw-r--r--arch/arm64/boot/dts/rockchip/Makefile3
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3328-evb.dts164
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3328-rock64.dts333
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3328.dtsi398
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi1
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts1
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts2
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts3
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368-r88.dts2
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3368.dtsi68
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-evb.dts2
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-firefly.dts16
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts44
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi132
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-op1-opp.dtsi33
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi33
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts228
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi547
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts240
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi644
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399.dtsi284
-rw-r--r--arch/arm64/boot/dts/socionext/Makefile3
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts6
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts6
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi35
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts6
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts6
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi37
-rw-r--r--[l---------]arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi2
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts62
-rw-r--r--arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi367
-rw-r--r--[l---------]arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi2
-rw-r--r--[l---------]arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi2
-rw-r--r--arch/arm64/boot/dts/xilinx/zynqmp-ep108-clk.dtsi50
-rw-r--r--arch/arm64/boot/dts/xilinx/zynqmp-ep108.dts18
-rw-r--r--arch/arm64/boot/dts/xilinx/zynqmp.dtsi277
-rw-r--r--arch/arm64/boot/dts/zte/Makefile1
-rw-r--r--arch/arm64/boot/dts/zte/zx296718-evb.dts68
-rw-r--r--arch/arm64/boot/dts/zte/zx296718-pcbox.dts143
-rw-r--r--arch/arm64/boot/dts/zte/zx296718.dtsi171
-rw-r--r--arch/arm64/configs/defconfig40
-rw-r--r--arch/arm64/include/asm/linkage.h4
-rw-r--r--arch/arm64/include/asm/pgtable.h2
-rw-r--r--arch/arm64/kernel/fpsimd.c4
-rw-r--r--arch/arm64/kernel/head.S1
-rw-r--r--arch/arm64/kernel/signal.c6
-rw-r--r--arch/arm64/kernel/signal32.c23
-rw-r--r--arch/arm64/kernel/stacktrace.c18
-rw-r--r--arch/arm64/mm/fault.c2
-rw-r--r--arch/blackfin/include/asm/bfin_twi.h134
-rw-r--r--arch/blackfin/include/uapi/asm/siginfo.h30
-rw-r--r--arch/blackfin/kernel/debug-mmrs.c1
-rw-r--r--arch/blackfin/mach-bf537/boards/dnp5370.c2
-rw-r--r--arch/blackfin/mach-bf537/boards/stamp.c2
-rw-r--r--arch/blackfin/mach-bf561/boards/acvilon.c2
-rw-r--r--arch/c6x/include/asm/processor.h3
-rw-r--r--arch/cris/arch-v32/drivers/mach-a3/nandflash.c2
-rw-r--r--arch/cris/arch-v32/drivers/mach-fs/nandflash.c2
-rw-r--r--arch/frv/include/asm/processor.h4
-rw-r--r--arch/frv/include/uapi/asm/siginfo.h2
-rw-r--r--arch/ia64/Kconfig.debug5
-rw-r--r--arch/ia64/include/uapi/asm/siginfo.h21
-rw-r--r--arch/ia64/kernel/signal.c17
-rw-r--r--arch/ia64/kernel/traps.c4
-rw-r--r--arch/m32r/Kconfig4
-rw-r--r--arch/m32r/include/asm/processor.h8
-rw-r--r--arch/m32r/kernel/traps.c9
-rw-r--r--arch/m68k/coldfire/clk.c3
-rw-r--r--arch/m68k/coldfire/m5441x.c37
-rw-r--r--arch/m68k/include/asm/page.h2
-rw-r--r--arch/metag/include/asm/dma-mapping.h2
-rw-r--r--arch/metag/include/asm/processor.h3
-rw-r--r--arch/microblaze/Kconfig2
-rw-r--r--arch/microblaze/include/uapi/asm/Kbuild1
-rw-r--r--arch/microblaze/kernel/dma.c2
-rw-r--r--arch/mips/Kconfig21
-rw-r--r--arch/mips/Makefile31
-rw-r--r--arch/mips/alchemy/devboards/db1200.c66
-rw-r--r--arch/mips/alchemy/devboards/db1300.c33
-rw-r--r--arch/mips/alchemy/devboards/db1550.c2
-rw-r--r--arch/mips/alchemy/devboards/db1xxx.c2
-rw-r--r--arch/mips/ar7/clock.c3
-rw-r--r--arch/mips/ath79/clock.c9
-rw-r--r--arch/mips/ath79/pci.c12
-rw-r--r--arch/mips/bcm63xx/clk.c3
-rw-r--r--arch/mips/boot/Makefile16
-rw-r--r--arch/mips/boot/dts/Makefile1
-rw-r--r--arch/mips/boot/dts/ingenic/ci20.dts37
-rw-r--r--arch/mips/boot/dts/ingenic/jz4780.dtsi11
-rw-r--r--arch/mips/boot/dts/ni/169445.dts100
-rw-r--r--arch/mips/boot/dts/ni/Makefile7
-rw-r--r--arch/mips/boot/dts/ralink/Makefile2
-rw-r--r--arch/mips/boot/dts/ralink/mt7628a.dtsi126
-rw-r--r--arch/mips/boot/dts/ralink/omega2p.dts18
-rw-r--r--arch/mips/boot/dts/ralink/vocore2.dts18
-rw-r--r--arch/mips/cavium-octeon/executive/Makefile2
-rw-r--r--arch/mips/cavium-octeon/executive/cvmx-boot-vector.c167
-rw-r--r--arch/mips/cavium-octeon/executive/cvmx-bootmem.c85
-rw-r--r--arch/mips/cavium-octeon/octeon-irq.c9
-rw-r--r--arch/mips/cavium-octeon/smp.c14
-rw-r--r--arch/mips/configs/cavium_octeon_defconfig25
-rw-r--r--arch/mips/configs/ci20_defconfig3
-rw-r--r--arch/mips/configs/generic/board-ni169445.config30
-rw-r--r--arch/mips/configs/generic/board-sead-3.config2
-rw-r--r--arch/mips/configs/generic_defconfig3
-rw-r--r--arch/mips/configs/gpr_defconfig4
-rw-r--r--arch/mips/configs/lemote2f_defconfig1
-rw-r--r--arch/mips/configs/malta_defconfig1
-rw-r--r--arch/mips/configs/malta_kvm_defconfig1
-rw-r--r--arch/mips/configs/malta_kvm_guest_defconfig1
-rw-r--r--arch/mips/configs/maltasmvp_defconfig1
-rw-r--r--arch/mips/configs/maltasmvp_eva_defconfig1
-rw-r--r--arch/mips/configs/mtx1_defconfig4
-rw-r--r--arch/mips/configs/nlm_xlp_defconfig1
-rw-r--r--arch/mips/configs/nlm_xlr_defconfig4
-rw-r--r--arch/mips/configs/omega2p_defconfig129
-rw-r--r--arch/mips/configs/pistachio_defconfig5
-rw-r--r--arch/mips/configs/vocore2_defconfig129
-rw-r--r--arch/mips/fw/arc/init.c2
-rw-r--r--arch/mips/generic/Kconfig6
-rw-r--r--arch/mips/generic/Platform4
-rw-r--r--arch/mips/generic/board-boston.its.S22
-rw-r--r--arch/mips/generic/board-ni169445.its.S22
-rw-r--r--arch/mips/generic/init.c5
-rw-r--r--arch/mips/generic/irq.c9
-rw-r--r--arch/mips/generic/vmlinux.its.S25
-rw-r--r--arch/mips/include/asm/asm.h3
-rw-r--r--arch/mips/include/asm/bmips.h4
-rw-r--r--arch/mips/include/asm/cpu-info.h62
-rw-r--r--arch/mips/include/asm/cpu-type.h5
-rw-r--r--arch/mips/include/asm/cpu.h5
-rw-r--r--arch/mips/include/asm/floppy.h4
-rw-r--r--arch/mips/include/asm/fpu_emulator.h118
-rw-r--r--arch/mips/include/asm/io.h2
-rw-r--r--arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h26
-rw-r--r--arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h2
-rw-r--r--arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h6
-rw-r--r--arch/mips/include/asm/mach-ip27/topology.h1
-rw-r--r--arch/mips/include/asm/mach-jz4740/jz4740_nand.h2
-rw-r--r--arch/mips/include/asm/mach-lantiq/lantiq.h2
-rw-r--r--arch/mips/include/asm/mach-loongson64/loongson.h2
-rw-r--r--arch/mips/include/asm/mach-loongson64/topology.h1
-rw-r--r--arch/mips/include/asm/mips-boards/maltaint.h5
-rw-r--r--arch/mips/include/asm/mips-cm.h567
-rw-r--r--arch/mips/include/asm/mips-cpc.h177
-rw-r--r--arch/mips/include/asm/mips-cps.h240
-rw-r--r--arch/mips/include/asm/mips-gic.h347
-rw-r--r--arch/mips/include/asm/mipsregs.h28
-rw-r--r--arch/mips/include/asm/module.h2
-rw-r--r--arch/mips/include/asm/netlogic/common.h2
-rw-r--r--arch/mips/include/asm/octeon/cvmx-boot-vector.h53
-rw-r--r--arch/mips/include/asm/octeon/cvmx-bootmem.h28
-rw-r--r--arch/mips/include/asm/octeon/cvmx-ciu-defs.h10
-rw-r--r--arch/mips/include/asm/octeon/cvmx.h28
-rw-r--r--arch/mips/include/asm/octeon/octeon.h2
-rw-r--r--arch/mips/include/asm/smp-ops.h16
-rw-r--r--arch/mips/include/asm/smp.h10
-rw-r--r--arch/mips/include/asm/stackframe.h280
-rw-r--r--arch/mips/include/asm/stacktrace.h64
-rw-r--r--arch/mips/include/asm/topology.h2
-rw-r--r--arch/mips/include/uapi/asm/inst.h2
-rw-r--r--arch/mips/include/uapi/asm/siginfo.h4
-rw-r--r--arch/mips/kernel/Makefile14
-rw-r--r--arch/mips/kernel/cps-vec.S4
-rw-r--r--arch/mips/kernel/cpu-probe.c59
-rw-r--r--arch/mips/kernel/elf.c12
-rw-r--r--arch/mips/kernel/genex.S13
-rw-r--r--arch/mips/kernel/idle.c1
-rw-r--r--arch/mips/kernel/mips-cm.c94
-rw-r--r--arch/mips/kernel/mips-cpc.c17
-rw-r--r--arch/mips/kernel/mips-r2-to-r6-emul.c16
-rw-r--r--arch/mips/kernel/octeon_switch.S11
-rw-r--r--arch/mips/kernel/perf_event_mipsxx.c3
-rw-r--r--arch/mips/kernel/pm-cps.c17
-rw-r--r--arch/mips/kernel/proc.c6
-rw-r--r--arch/mips/kernel/process.c102
-rw-r--r--arch/mips/kernel/r2300_fpu.S80
-rw-r--r--arch/mips/kernel/r2300_switch.S81
-rw-r--r--arch/mips/kernel/r4k_fpu.S196
-rw-r--r--arch/mips/kernel/r4k_switch.S203
-rw-r--r--arch/mips/kernel/r6000_fpu.S99
-rw-r--r--arch/mips/kernel/signal32.c19
-rw-r--r--arch/mips/kernel/smp-bmips.c10
-rw-r--r--arch/mips/kernel/smp-cmp.c6
-rw-r--r--arch/mips/kernel/smp-cps.c152
-rw-r--r--arch/mips/kernel/smp-mt.c14
-rw-r--r--arch/mips/kernel/smp-up.c5
-rw-r--r--arch/mips/kernel/smp.c24
-rw-r--r--arch/mips/kernel/time.c14
-rw-r--r--arch/mips/kernel/traps.c29
-rw-r--r--arch/mips/kernel/unaligned.c2
-rw-r--r--arch/mips/kernel/vdso.c15
-rw-r--r--arch/mips/kvm/mips.c4
-rw-r--r--arch/mips/lantiq/Kconfig2
-rw-r--r--arch/mips/lantiq/falcon/reset.c23
-rw-r--r--arch/mips/lantiq/irq.c4
-rw-r--r--arch/mips/lantiq/prom.c2
-rw-r--r--arch/mips/lantiq/xway/Makefile4
-rw-r--r--arch/mips/lantiq/xway/reset.c387
-rw-r--r--arch/mips/lantiq/xway/sysctrl.c83
-rw-r--r--arch/mips/lantiq/xway/xrx200_phy_fw.c113
-rw-r--r--arch/mips/lib/Makefile2
-rw-r--r--arch/mips/lib/delay.c1
-rw-r--r--arch/mips/lib/iomap_copy.c42
-rw-r--r--arch/mips/loongson64/lemote-2f/clock.c3
-rw-r--r--arch/mips/loongson64/loongson-3/smp.c16
-rw-r--r--arch/mips/math-emu/Makefile6
-rw-r--r--arch/mips/math-emu/cp1emu.c284
-rw-r--r--arch/mips/math-emu/dp_fmax.c84
-rw-r--r--arch/mips/math-emu/dp_fmin.c86
-rw-r--r--arch/mips/math-emu/dp_maddf.c246
-rw-r--r--arch/mips/math-emu/dp_rint.c89
-rw-r--r--arch/mips/math-emu/ieee754.h2
-rw-r--r--arch/mips/math-emu/ieee754int.h4
-rw-r--r--arch/mips/math-emu/ieee754sp.h4
-rw-r--r--arch/mips/math-emu/me-debugfs.c318
-rw-r--r--arch/mips/math-emu/sp_fmax.c84
-rw-r--r--arch/mips/math-emu/sp_fmin.c86
-rw-r--r--arch/mips/math-emu/sp_maddf.c229
-rw-r--r--arch/mips/math-emu/sp_rint.c90
-rw-r--r--arch/mips/mm/c-r4k.c2
-rw-r--r--arch/mips/mm/cache.c2
-rw-r--r--arch/mips/mm/dma-default.c46
-rw-r--r--arch/mips/mm/init.c1
-rw-r--r--arch/mips/mm/mmap.c1
-rw-r--r--arch/mips/mm/sc-mips.c47
-rw-r--r--arch/mips/mm/tlbex-fault.S7
-rw-r--r--arch/mips/mm/tlbex.c5
-rw-r--r--arch/mips/mti-malta/malta-dtshim.c4
-rw-r--r--arch/mips/mti-malta/malta-init.c3
-rw-r--r--arch/mips/mti-malta/malta-int.c5
-rw-r--r--arch/mips/mti-malta/malta-setup.c4
-rw-r--r--arch/mips/mti-malta/malta-time.c26
-rw-r--r--arch/mips/netlogic/common/smp.c8
-rw-r--r--arch/mips/netlogic/xlr/platform-flash.c2
-rw-r--r--arch/mips/oprofile/op_model_mipsxx.c4
-rw-r--r--arch/mips/paravirt/paravirt-smp.c5
-rw-r--r--arch/mips/paravirt/setup.c2
-rw-r--r--arch/mips/pci/fixup-capcella.c4
-rw-r--r--arch/mips/pci/fixup-cobalt.c8
-rw-r--r--arch/mips/pci/fixup-emma2rh.c4
-rw-r--r--arch/mips/pci/fixup-fuloong2e.c2
-rw-r--r--arch/mips/pci/fixup-ip32.c4
-rw-r--r--arch/mips/pci/fixup-jmr3927.c2
-rw-r--r--arch/mips/pci/fixup-lantiq.c2
-rw-r--r--arch/mips/pci/fixup-lemote2f.c4
-rw-r--r--arch/mips/pci/fixup-loongson3.c2
-rw-r--r--arch/mips/pci/fixup-malta.c4
-rw-r--r--arch/mips/pci/fixup-mpc30x.c6
-rw-r--r--arch/mips/pci/fixup-pmcmsp.c8
-rw-r--r--arch/mips/pci/fixup-rbtx4927.c2
-rw-r--r--arch/mips/pci/fixup-rbtx4938.c2
-rw-r--r--arch/mips/pci/fixup-sni.c12
-rw-r--r--arch/mips/pci/fixup-tb0219.c2
-rw-r--r--arch/mips/pci/fixup-tb0226.c2
-rw-r--r--arch/mips/pci/fixup-tb0287.c2
-rw-r--r--arch/mips/pci/pci-alchemy.c2
-rw-r--r--arch/mips/pci/pci-bcm47xx.c2
-rw-r--r--arch/mips/pci/pci-lasat.c2
-rw-r--r--arch/mips/pci/pci-legacy.c2
-rw-r--r--arch/mips/pci/pci-malta.c6
-rw-r--r--arch/mips/pci/pci-mt7620.c4
-rw-r--r--arch/mips/pci/pci-octeon.c5
-rw-r--r--arch/mips/pci/pci-rt2880.c2
-rw-r--r--arch/mips/pci/pci-rt3883.c13
-rw-r--r--arch/mips/pci/pci-tx4938.c2
-rw-r--r--arch/mips/pci/pci-tx4939.c4
-rw-r--r--arch/mips/pci/pci-xlp.c2
-rw-r--r--arch/mips/pci/pci-xlr.c2
-rw-r--r--arch/mips/pci/pcie-octeon.c3
-rw-r--r--arch/mips/pistachio/init.c3
-rw-r--r--arch/mips/pistachio/irq.c1
-rw-r--r--arch/mips/pistachio/time.c2
-rw-r--r--arch/mips/pmcs-msp71xx/msp_smp.c2
-rw-r--r--arch/mips/pnx833x/common/platform.c2
-rw-r--r--arch/mips/ralink/Kconfig10
-rw-r--r--arch/mips/ralink/clk.c3
-rw-r--r--arch/mips/ralink/irq-gic.c2
-rw-r--r--arch/mips/ralink/mt7621.c5
-rw-r--r--arch/mips/rb532/devices.c2
-rw-r--r--arch/mips/sgi-ip27/ip27-smp.c5
-rw-r--r--arch/mips/sibyte/bcm1480/smp.c5
-rw-r--r--arch/mips/sibyte/common/cfe.c4
-rw-r--r--arch/mips/sibyte/sb1250/smp.c5
-rwxr-xr-xarch/mips/tools/generic-board-config.sh90
-rw-r--r--arch/mips/txx9/generic/pci.c8
-rw-r--r--arch/mips/vdso/gettimeofday.c8
-rw-r--r--arch/mips/vdso/sigreturn.S10
-rw-r--r--arch/mn10300/kernel/process.c12
-rw-r--r--arch/nios2/boot/dts/3c120_devboard.dts3
-rw-r--r--arch/nios2/include/asm/dma-mapping.h2
-rw-r--r--arch/nios2/kernel/time.c5
-rw-r--r--arch/openrisc/include/asm/pgtable.h2
-rw-r--r--arch/parisc/Kconfig12
-rw-r--r--arch/parisc/Makefile5
-rw-r--r--arch/parisc/boot/compressed/Makefile2
-rw-r--r--arch/parisc/boot/compressed/misc.c3
-rw-r--r--arch/parisc/include/asm/pdc.h1
-rw-r--r--arch/parisc/include/asm/smp.h1
-rw-r--r--arch/parisc/kernel/firmware.c20
-rw-r--r--arch/parisc/kernel/pdt.c9
-rw-r--r--arch/parisc/kernel/processor.c2
-rw-r--r--arch/parisc/kernel/setup.c6
-rw-r--r--arch/parisc/kernel/signal32.c31
-rw-r--r--arch/parisc/kernel/smp.c3
-rw-r--r--arch/parisc/kernel/traps.c10
-rw-r--r--arch/parisc/kernel/unwind.c12
-rw-r--r--arch/parisc/mm/fault.c33
-rw-r--r--arch/powerpc/configs/g5_defconfig5
-rw-r--r--arch/powerpc/configs/gamecube_defconfig5
-rw-r--r--arch/powerpc/configs/pasemi_defconfig3
-rw-r--r--arch/powerpc/configs/pmac32_defconfig7
-rw-r--r--arch/powerpc/configs/ppc64_defconfig7
-rw-r--r--arch/powerpc/configs/ppc64e_defconfig7
-rw-r--r--arch/powerpc/configs/ppc6xx_defconfig7
-rw-r--r--arch/powerpc/configs/wii_defconfig5
-rw-r--r--arch/powerpc/kernel/align.c2
-rw-r--r--arch/powerpc/kernel/eeh.c4
-rw-r--r--arch/powerpc/kernel/eeh_dev.c18
-rw-r--r--arch/powerpc/kernel/optprobes.c4
-rw-r--r--arch/powerpc/kernel/ptrace.c2
-rw-r--r--arch/powerpc/kernel/rtas.c4
-rw-r--r--arch/powerpc/kernel/signal_32.c20
-rw-r--r--arch/powerpc/kernel/traps.c12
-rw-r--r--arch/powerpc/kvm/book3s_hv.c4
-rw-r--r--arch/powerpc/kvm/book3s_hv_rm_xive.c1
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S31
-rw-r--r--arch/powerpc/kvm/book3s_xive.c1
-rw-r--r--arch/powerpc/kvm/book3s_xive_template.c7
-rw-r--r--arch/powerpc/lib/sstep.c23
-rw-r--r--arch/powerpc/perf/core-book3s.c5
-rw-r--r--arch/powerpc/platforms/powernv/idle.c8
-rw-r--r--arch/powerpc/platforms/pseries/dlpar.c1
-rw-r--r--arch/powerpc/platforms/pseries/hotplug-cpu.c6
-rw-r--r--arch/powerpc/platforms/pseries/mobility.c4
-rw-r--r--arch/powerpc/platforms/pseries/suspend.c2
-rw-r--r--arch/powerpc/sysdev/fsl_rio.c17
-rw-r--r--arch/powerpc/sysdev/fsl_rmu.c8
-rw-r--r--arch/s390/include/asm/ap.h126
-rw-r--r--arch/s390/include/asm/mmu.h7
-rw-r--r--arch/s390/include/asm/mmu_context.h10
-rw-r--r--arch/s390/include/asm/pci.h7
-rw-r--r--arch/s390/include/asm/pgtable.h4
-rw-r--r--arch/s390/include/asm/tlbflush.h30
-rw-r--r--arch/s390/kernel/compat_signal.c32
-rw-r--r--arch/s390/kernel/early.c12
-rw-r--r--arch/s390/kernel/perf_cpum_sf.c9
-rw-r--r--arch/s390/kernel/topology.c148
-rw-r--r--arch/s390/mm/gmap.c8
-rw-r--r--arch/s390/mm/gup.c7
-rw-r--r--arch/s390/mm/pgalloc.c20
-rw-r--r--arch/s390/pci/pci.c9
-rw-r--r--arch/sh/boards/mach-migor/setup.c2
-rw-r--r--arch/sh/drivers/pci/fixups-dreamcast.c3
-rw-r--r--arch/sh/include/asm/processor_32.h4
-rw-r--r--arch/sh/include/asm/processor_64.h4
-rw-r--r--arch/sh/include/cpu-sh2a/cpu/sh7264.h4
-rw-r--r--arch/sh/include/cpu-sh2a/cpu/sh7269.h4
-rw-r--r--arch/sh/include/cpu-sh4/cpu/sh7722.h2
-rw-r--r--arch/sh/include/cpu-sh4/cpu/sh7757.h8
-rw-r--r--arch/sparc/configs/sparc64_defconfig1
-rw-r--r--arch/sparc/include/asm/hugetlb.h7
-rw-r--r--arch/sparc/include/asm/hypervisor.h18
-rw-r--r--arch/sparc/include/asm/page_64.h3
-rw-r--r--arch/sparc/include/asm/pgtable_64.h20
-rw-r--r--arch/sparc/include/asm/smp_64.h5
-rw-r--r--arch/sparc/include/asm/trap_block.h2
-rw-r--r--arch/sparc/include/asm/tsb.h36
-rw-r--r--arch/sparc/include/asm/vio.h9
-rw-r--r--arch/sparc/include/uapi/asm/siginfo.h9
-rw-r--r--arch/sparc/kernel/etrap_64.S26
-rw-r--r--arch/sparc/kernel/head_64.S18
-rw-r--r--arch/sparc/kernel/hvapi.c2
-rw-r--r--arch/sparc/kernel/hvcalls.S11
-rw-r--r--arch/sparc/kernel/ldc.c2
-rw-r--r--arch/sparc/kernel/leon_pci_grpci1.c2
-rw-r--r--arch/sparc/kernel/leon_pci_grpci2.c2
-rw-r--r--arch/sparc/kernel/process_64.c7
-rw-r--r--arch/sparc/kernel/rtrap_64.S13
-rw-r--r--arch/sparc/kernel/setup_64.c6
-rw-r--r--arch/sparc/kernel/signal32.c16
-rw-r--r--arch/sparc/kernel/smp_64.c80
-rw-r--r--arch/sparc/kernel/traps_32.c2
-rw-r--r--arch/sparc/kernel/traps_64.c53
-rw-r--r--arch/sparc/kernel/tsb.S2
-rw-r--r--arch/sparc/kernel/vio.c1
-rw-r--r--arch/sparc/kernel/viohs.c12
-rw-r--r--arch/sparc/kernel/vmlinux.lds.S10
-rw-r--r--arch/sparc/lib/M7copy_from_user.S40
-rw-r--r--arch/sparc/lib/M7copy_to_user.S51
-rw-r--r--arch/sparc/lib/M7memcpy.S923
-rw-r--r--arch/sparc/lib/M7memset.S352
-rw-r--r--arch/sparc/lib/M7patch.S51
-rw-r--r--arch/sparc/lib/Makefile5
-rw-r--r--arch/sparc/lib/Memcpy_utils.S345
-rw-r--r--arch/sparc/lib/NG4memcpy.S277
-rw-r--r--arch/sparc/lib/U3memcpy.S32
-rw-r--r--arch/sparc/mm/gup.c45
-rw-r--r--arch/sparc/mm/hugetlbpage.c102
-rw-r--r--arch/sparc/mm/init_64.c54
-rw-r--r--arch/tile/configs/tilegx_defconfig1
-rw-r--r--arch/tile/configs/tilepro_defconfig2
-rw-r--r--arch/tile/include/asm/dma-mapping.h4
-rw-r--r--arch/tile/include/uapi/asm/siginfo.h4
-rw-r--r--arch/tile/kernel/compat_signal.c18
-rw-r--r--arch/tile/kernel/setup.c2
-rw-r--r--arch/tile/kernel/traps.c2
-rw-r--r--arch/um/Kconfig.um1
-rw-r--r--arch/um/Makefile2
-rw-r--r--arch/um/configs/i386_defconfig1
-rw-r--r--arch/um/configs/x86_64_defconfig1
-rw-r--r--arch/um/drivers/mconsole_kern.c7
-rw-r--r--arch/um/include/asm/processor-generic.h5
-rw-r--r--arch/um/include/asm/thread_info.h3
-rw-r--r--arch/um/include/shared/os.h2
-rw-r--r--arch/um/kernel/gmon_syms.c7
-rw-r--r--arch/um/kernel/process.c4
-rw-r--r--arch/um/kernel/time.c4
-rw-r--r--arch/um/os-Linux/drivers/tuntap_user.c2
-rw-r--r--arch/um/os-Linux/skas/process.c17
-rw-r--r--arch/um/os-Linux/start_up.c6
-rw-r--r--arch/x86/Kconfig1
-rw-r--r--arch/x86/crypto/blowfish-x86_64-asm_64.S48
-rw-r--r--arch/x86/crypto/camellia-x86_64-asm_64.S26
-rw-r--r--arch/x86/crypto/cast5-avx-x86_64-asm_64.S47
-rw-r--r--arch/x86/crypto/cast6-avx-x86_64-asm_64.S50
-rw-r--r--arch/x86/crypto/des3_ede-asm_64.S15
-rw-r--r--arch/x86/crypto/sha1_avx2_x86_64_asm.S4
-rw-r--r--arch/x86/crypto/sha1_ssse3_asm.S11
-rw-r--r--arch/x86/crypto/sha256-avx-asm.S15
-rw-r--r--arch/x86/crypto/sha256-avx2-asm.S22
-rw-r--r--arch/x86/crypto/sha256-ssse3-asm.S15
-rw-r--r--arch/x86/crypto/sha512-avx2-asm.S75
-rw-r--r--arch/x86/crypto/twofish-avx-x86_64-asm_64.S12
-rw-r--r--arch/x86/events/intel/cstate.c4
-rw-r--r--arch/x86/events/intel/rapl.c3
-rw-r--r--arch/x86/events/intel/uncore_snbep.c4
-rw-r--r--arch/x86/events/msr.c8
-rw-r--r--arch/x86/ia32/ia32_aout.c4
-rw-r--r--arch/x86/ia32/ia32_signal.c2
-rw-r--r--arch/x86/include/asm/alternative.h3
-rw-r--r--arch/x86/include/asm/asm.h15
-rw-r--r--arch/x86/include/asm/cacheflush.h2
-rw-r--r--arch/x86/include/asm/desc.h3
-rw-r--r--arch/x86/include/asm/fpu/internal.h90
-rw-r--r--arch/x86/include/asm/fpu/types.h32
-rw-r--r--arch/x86/include/asm/fpu/xstate.h12
-rw-r--r--arch/x86/include/asm/kvm_host.h3
-rw-r--r--arch/x86/include/asm/mem_encrypt.h4
-rw-r--r--arch/x86/include/asm/mmu_context.h32
-rw-r--r--arch/x86/include/asm/mpspec.h1
-rw-r--r--arch/x86/include/asm/mshyperv.h10
-rw-r--r--arch/x86/include/asm/paravirt.h37
-rw-r--r--arch/x86/include/asm/paravirt_types.h23
-rw-r--r--arch/x86/include/asm/pgtable.h27
-rw-r--r--arch/x86/include/asm/preempt.h15
-rw-r--r--arch/x86/include/asm/processor.h6
-rw-r--r--arch/x86/include/asm/rwsem.h4
-rw-r--r--arch/x86/include/asm/special_insns.h10
-rw-r--r--arch/x86/include/asm/thread_info.h11
-rw-r--r--arch/x86/include/asm/trace/fpu.h11
-rw-r--r--arch/x86/include/asm/uaccess.h6
-rw-r--r--arch/x86/include/asm/xen/hypercall.h9
-rw-r--r--arch/x86/include/uapi/asm/hyperv.h6
-rw-r--r--arch/x86/kernel/acpi/boot.c4
-rw-r--r--arch/x86/kernel/apic/apic.c2
-rw-r--r--arch/x86/kernel/apm_32.c2
-rw-r--r--arch/x86/kernel/cpu/amd.c11
-rw-r--r--arch/x86/kernel/cpu/bugs.c8
-rw-r--r--arch/x86/kernel/cpu/common.c57
-rw-r--r--arch/x86/kernel/cpu/mshyperv.c4
-rw-r--r--arch/x86/kernel/fpu/core.c155
-rw-r--r--arch/x86/kernel/fpu/init.c2
-rw-r--r--arch/x86/kernel/fpu/regset.c48
-rw-r--r--arch/x86/kernel/fpu/signal.c37
-rw-r--r--arch/x86/kernel/fpu/xstate.c264
-rw-r--r--arch/x86/kernel/io_delay.c2
-rw-r--r--arch/x86/kernel/irq_32.c6
-rw-r--r--arch/x86/kernel/ksysfs.c2
-rw-r--r--arch/x86/kernel/kvm.c5
-rw-r--r--arch/x86/kernel/paravirt.c5
-rw-r--r--arch/x86/kernel/reboot.c2
-rw-r--r--arch/x86/kernel/setup.c5
-rw-r--r--arch/x86/kernel/signal.c6
-rw-r--r--arch/x86/kernel/signal_compat.c21
-rw-r--r--arch/x86/kernel/smpboot.c21
-rw-r--r--arch/x86/kernel/traps.c2
-rw-r--r--arch/x86/kvm/cpuid.h1
-rw-r--r--arch/x86/kvm/emulate.c11
-rw-r--r--arch/x86/kvm/lapic.c4
-rw-r--r--arch/x86/kvm/svm.c38
-rw-r--r--arch/x86/kvm/vmx.c412
-rw-r--r--arch/x86/kvm/x86.c53
-rw-r--r--arch/x86/math-emu/fpu_entry.c2
-rw-r--r--arch/x86/mm/extable.c24
-rw-r--r--arch/x86/mm/fault.c50
-rw-r--r--arch/x86/mm/init.c34
-rw-r--r--arch/x86/mm/mem_encrypt.c4
-rw-r--r--arch/x86/mm/pgtable.c7
-rw-r--r--arch/x86/mm/pkeys.c3
-rw-r--r--arch/x86/mm/tlb.c33
-rw-r--r--arch/x86/net/bpf_jit_comp.c4
-rw-r--r--arch/x86/pci/irq.c2
-rw-r--r--arch/x86/platform/intel-mid/device_libs/platform_tc35876x.c2
-rw-r--r--arch/x86/power/cpu.c2
-rw-r--r--arch/x86/power/hibernate_64.c21
-rw-r--r--arch/x86/um/os-Linux/registers.c18
-rw-r--r--arch/x86/um/os-Linux/tls.c2
-rw-r--r--arch/x86/um/user-offsets.c2
-rw-r--r--arch/x86/xen/enlighten_pv.c2
-rw-r--r--arch/x86/xen/mmu_pv.c17
-rw-r--r--arch/xtensa/include/asm/processor.h5
-rw-r--r--block/blk-core.c10
-rw-r--r--block/blk-lib.c4
-rw-r--r--block/blk-mq.c16
-rw-r--r--block/blk-mq.h1
-rw-r--r--block/bsg-lib.c1
-rw-r--r--block/opal_proto.h1
-rw-r--r--block/partition-generic.c2
-rw-r--r--block/sed-opal.c32
-rw-r--r--crypto/af_alg.c4
-rw-r--r--crypto/drbg.c8
-rw-r--r--drivers/acpi/acpi_video.c2
-rw-r--r--drivers/acpi/acpi_watchdog.c2
-rw-r--r--drivers/acpi/apei/ghes.c16
-rw-r--r--drivers/acpi/blacklist.c4
-rw-r--r--drivers/acpi/bus.c4
-rw-r--r--drivers/acpi/ec.c2
-rw-r--r--drivers/acpi/nfit/Kconfig2
-rw-r--r--drivers/acpi/nfit/core.c50
-rw-r--r--drivers/acpi/osi.c2
-rw-r--r--drivers/acpi/pci_slot.c2
-rw-r--r--drivers/acpi/processor_pdc.c2
-rw-r--r--drivers/acpi/property.c24
-rw-r--r--drivers/acpi/sleep.c2
-rw-r--r--drivers/acpi/thermal.c2
-rw-r--r--drivers/android/binder.c8
-rw-r--r--drivers/android/binder_alloc.c18
-rw-r--r--drivers/ata/ahci.c5
-rw-r--r--drivers/ata/ata_piix.c1
-rw-r--r--drivers/ata/libata-core.c20
-rw-r--r--drivers/auxdisplay/charlcd.c11
-rw-r--r--drivers/auxdisplay/panel.c11
-rw-r--r--drivers/base/Kconfig5
-rw-r--r--drivers/base/arch_topology.c12
-rw-r--r--drivers/base/dma-coherent.c88
-rw-r--r--drivers/base/dma-mapping.c7
-rw-r--r--drivers/base/firmware_class.c99
-rw-r--r--drivers/base/platform.c3
-rw-r--r--drivers/base/power/main.c9
-rw-r--r--drivers/base/power/opp/core.c7
-rw-r--r--drivers/base/power/qos.c10
-rw-r--r--drivers/block/brd.c2
-rw-r--r--drivers/block/loop.h6
-rw-r--r--drivers/block/nbd.c6
-rw-r--r--drivers/block/rbd.c2
-rw-r--r--drivers/block/zram/zram_drv.c36
-rw-r--r--drivers/bus/Kconfig2
-rw-r--r--drivers/bus/arm-cci.c12
-rw-r--r--drivers/bus/imx-weim.c8
-rw-r--r--drivers/bus/omap-ocp2scp.c9
-rw-r--r--drivers/bus/sunxi-rsb.c22
-rw-r--r--drivers/char/sonypi.c2
-rw-r--r--drivers/char/tpm/tpm-interface.c10
-rw-r--r--drivers/char/tpm/tpm.h9
-rw-r--r--drivers/char/tpm/tpm2-cmd.c2
-rw-r--r--drivers/char/tpm/tpm_crb.c2
-rw-r--r--drivers/char/tpm/tpm_ibmvtpm.c98
-rw-r--r--drivers/char/tpm/tpm_infineon.c6
-rw-r--r--drivers/char/tpm/tpm_tis_core.c8
-rw-r--r--drivers/char/virtio_console.c3
-rw-r--r--drivers/clk/Kconfig17
-rw-r--r--drivers/clk/Makefile3
-rw-r--r--drivers/clk/at91/Makefile1
-rw-r--r--drivers/clk/at91/clk-audio-pll.c536
-rw-r--r--drivers/clk/at91/clk-generated.c101
-rw-r--r--drivers/clk/axs10x/Makefile1
-rw-r--r--drivers/clk/axs10x/pll_clock.c346
-rw-r--r--drivers/clk/berlin/bg2.c3
-rw-r--r--drivers/clk/berlin/bg2q.c7
-rw-r--r--drivers/clk/clk-asm9260.c4
-rw-r--r--drivers/clk/clk-conf.c16
-rw-r--r--drivers/clk/clk-cs2000-cp.c14
-rw-r--r--drivers/clk/clk-divider.c6
-rw-r--r--drivers/clk/clk-fractional-divider.c28
-rw-r--r--drivers/clk/clk-gate.c3
-rw-r--r--drivers/clk/clk-gemini.c7
-rw-r--r--drivers/clk/clk-hsdk-pll.c431
-rw-r--r--drivers/clk/clk-mb86s7x.c390
-rw-r--r--drivers/clk/clk-moxart.c16
-rw-r--r--drivers/clk/clk-qoriq.c26
-rw-r--r--drivers/clk/clk-si5351.c12
-rw-r--r--drivers/clk/clk-stm32f4.c4
-rw-r--r--drivers/clk/clk-stm32h7.c1410
-rw-r--r--drivers/clk/clk-versaclock5.c172
-rw-r--r--drivers/clk/clk-xgene.c15
-rw-r--r--drivers/clk/clk.c4
-rw-r--r--drivers/clk/clkdev.c4
-rw-r--r--drivers/clk/hisilicon/clk-hi6220.c6
-rw-r--r--drivers/clk/imx/clk-imx51-imx53.c8
-rw-r--r--drivers/clk/imx/clk-imx6sl.c6
-rw-r--r--drivers/clk/imx/clk-imx6sx.c6
-rw-r--r--drivers/clk/imx/clk-imx6ul.c6
-rw-r--r--drivers/clk/imx/clk-imx7d.c4
-rw-r--r--drivers/clk/imx/clk-vf610.c2
-rw-r--r--drivers/clk/mediatek/clk-cpumux.c6
-rw-r--r--drivers/clk/mediatek/clk-mtk.c2
-rw-r--r--drivers/clk/mediatek/reset.c2
-rw-r--r--drivers/clk/meson/Kconfig1
-rw-r--r--drivers/clk/meson/Makefile2
-rw-r--r--drivers/clk/meson/gxbb-aoclk-32k.c194
-rw-r--r--drivers/clk/meson/gxbb-aoclk-regmap.c46
-rw-r--r--drivers/clk/meson/gxbb-aoclk.c65
-rw-r--r--drivers/clk/meson/gxbb-aoclk.h42
-rw-r--r--drivers/clk/meson/gxbb.c189
-rw-r--r--drivers/clk/meson/gxbb.h125
-rw-r--r--drivers/clk/meson/meson8b.c160
-rw-r--r--drivers/clk/meson/meson8b.h112
-rw-r--r--drivers/clk/mmp/clk.c2
-rw-r--r--drivers/clk/nxp/clk-lpc32xx.c12
-rw-r--r--drivers/clk/qcom/clk-smd-rpm.c2
-rw-r--r--drivers/clk/qcom/gcc-msm8916.c2
-rw-r--r--drivers/clk/qcom/gcc-msm8996.c28
-rw-r--r--drivers/clk/renesas/Kconfig48
-rw-r--r--drivers/clk/renesas/Makefile2
-rw-r--r--drivers/clk/renesas/clk-div6.c3
-rw-r--r--drivers/clk/renesas/clk-mstp.c2
-rw-r--r--drivers/clk/renesas/clk-rcar-gen2.c3
-rw-r--r--drivers/clk/renesas/r8a7792-cpg-mssr.c7
-rw-r--r--drivers/clk/renesas/r8a7795-cpg-mssr.c34
-rw-r--r--drivers/clk/renesas/r8a7796-cpg-mssr.c35
-rw-r--r--drivers/clk/renesas/r8a77995-cpg-mssr.c236
-rw-r--r--drivers/clk/renesas/rcar-gen3-cpg.c69
-rw-r--r--drivers/clk/renesas/rcar-gen3-cpg.h15
-rw-r--r--drivers/clk/renesas/rcar-usb2-clock-sel.c188
-rw-r--r--drivers/clk/renesas/renesas-cpg-mssr.c6
-rw-r--r--drivers/clk/renesas/renesas-cpg-mssr.h1
-rw-r--r--drivers/clk/rockchip/clk-rk3128.c69
-rw-r--r--drivers/clk/rockchip/clk-rk3228.c2
-rw-r--r--drivers/clk/rockchip/clk-rv1108.c462
-rw-r--r--drivers/clk/rockchip/clk.c36
-rw-r--r--drivers/clk/samsung/clk-exynos-audss.c8
-rw-r--r--drivers/clk/samsung/clk-exynos5420.c23
-rw-r--r--drivers/clk/sunxi-ng/Kconfig18
-rw-r--r--drivers/clk/sunxi-ng/Makefile2
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun4i-a10.c1456
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun4i-a10.h61
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun5i.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun6i-a31.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-a23.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-a33.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-h3.c16
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-r.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-r.h2
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-r40.c1290
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-r40.h69
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-v3s.c3
-rw-r--r--drivers/clk/sunxi-ng/ccu_div.c22
-rw-r--r--drivers/clk/sunxi-ng/ccu_div.h3
-rw-r--r--drivers/clk/sunxi-ng/ccu_frac.c14
-rw-r--r--drivers/clk/sunxi-ng/ccu_frac.h2
-rw-r--r--drivers/clk/sunxi-ng/ccu_mult.c10
-rw-r--r--drivers/clk/sunxi-ng/ccu_nkm.c22
-rw-r--r--drivers/clk/sunxi-ng/ccu_nkm.h2
-rw-r--r--drivers/clk/sunxi-ng/ccu_nm.c19
-rw-r--r--drivers/clk/sunxi/clk-sun8i-bus-gates.c4
-rw-r--r--drivers/clk/sunxi/clk-sunxi.c17
-rw-r--r--drivers/clk/tegra/clk-emc.c12
-rw-r--r--drivers/clk/tegra/clk-pll.c159
-rw-r--r--drivers/clk/tegra/clk-tegra-periph.c3
-rw-r--r--drivers/clk/tegra/clk-tegra-super-gen4.c11
-rw-r--r--drivers/clk/tegra/clk-tegra210.c32
-rw-r--r--drivers/clk/tegra/clk.h6
-rw-r--r--drivers/clk/ti/adpll.c4
-rw-r--r--drivers/clk/ti/apll.c2
-rw-r--r--drivers/clk/ti/clockdomain.c4
-rw-r--r--drivers/clk/ti/fapll.c4
-rw-r--r--drivers/clk/uniphier/clk-uniphier-core.c26
-rw-r--r--drivers/clk/uniphier/clk-uniphier-mio.c4
-rw-r--r--drivers/clk/uniphier/clk-uniphier-sys.c98
-rw-r--r--drivers/clk/uniphier/clk-uniphier.h4
-rw-r--r--drivers/clk/ux500/clk-prcc.c6
-rw-r--r--drivers/clk/ux500/clk-prcmu.c14
-rw-r--r--drivers/clk/ux500/clk-sysctrl.c8
-rw-r--r--drivers/clk/versatile/clk-vexpress-osc.c2
-rw-r--r--drivers/clk/zte/clk-zx296718.c6
-rw-r--r--drivers/clocksource/mips-gic-timer.c37
-rw-r--r--drivers/clocksource/numachip.c2
-rw-r--r--drivers/clocksource/timer-integrator-ap.c4
-rw-r--r--drivers/cpufreq/cpufreq-dt-platdev.c16
-rw-r--r--drivers/cpufreq/powernow-k7.c2
-rw-r--r--drivers/cpufreq/ti-cpufreq.c2
-rw-r--r--drivers/cpuidle/cpuidle-arm.c6
-rw-r--r--drivers/cpuidle/cpuidle-cps.c2
-rw-r--r--drivers/crypto/caam/Kconfig5
-rw-r--r--drivers/crypto/caam/ctrl.c19
-rw-r--r--drivers/crypto/caam/regs.h59
-rw-r--r--drivers/crypto/inside-secure/safexcel_cipher.c2
-rw-r--r--drivers/crypto/inside-secure/safexcel_hash.c2
-rw-r--r--drivers/crypto/talitos.c9
-rw-r--r--drivers/dax/super.c33
-rw-r--r--drivers/firmware/arm_scpi.c4
-rw-r--r--drivers/firmware/efi/cper.c10
-rw-r--r--drivers/firmware/google/gsmi.c2
-rw-r--r--drivers/firmware/google/memconsole-x86-legacy.c2
-rw-r--r--drivers/firmware/psci.c4
-rw-r--r--drivers/firmware/tegra/bpmp.c4
-rw-r--r--drivers/fpga/altera-cvp.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c46
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c76
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c46
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c189
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_chardev.c2
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_events.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c22
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c1
-rw-r--r--drivers/gpu/drm/amd/include/vi_structs.h4
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c11
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h6
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c3
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c23
-rw-r--r--drivers/gpu/drm/drm_blend.c2
-rw-r--r--drivers/gpu/drm/drm_dp_dual_mode_helper.c2
-rw-r--r--drivers/gpu/drm/drm_scdc_helper.c2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c3
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c8
-rw-r--r--drivers/gpu/drm/exynos/exynos5433_drm_decon.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.c36
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.h1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fbdev.c20
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fbdev.h10
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c14
-rw-r--r--drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c2
-rw-r--r--drivers/gpu/drm/i915/gvt/cfg_space.c113
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_userptr.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c6
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c3
-rw-r--r--drivers/gpu/drm/i915/intel_display.c2
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.c11
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c4
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_random.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c10
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_uncore.c2
-rw-r--r--drivers/gpu/drm/lib/drm_random.c2
-rw-r--r--drivers/gpu/drm/msm/msm_gem_submit.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c2
-rw-r--r--drivers/gpu/drm/qxl/qxl_display.c41
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c2
-rw-r--r--drivers/gpu/drm/selftests/test-drm_mm.c4
-rw-r--r--drivers/gpu/drm/sun4i/Kconfig2
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_hdmi.h2
-rw-r--r--drivers/gpu/drm/tegra/trace.h2
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c4
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_util.c1
-rw-r--r--drivers/hid/hid-ids.h2
-rw-r--r--drivers/hid/hid-multitouch.c7
-rw-r--r--drivers/hid/hid-rmi.c13
-rw-r--r--drivers/hid/hidraw.c2
-rw-r--r--drivers/hid/i2c-hid/i2c-hid.c3
-rw-r--r--drivers/hid/usbhid/hid-quirks.c1
-rw-r--r--drivers/hid/wacom_sys.c7
-rw-r--r--drivers/hid/wacom_wac.c110
-rw-r--r--drivers/hv/channel_mgmt.c4
-rw-r--r--drivers/hv/hv_fcopy.c4
-rw-r--r--drivers/hwmon/acpi_power_meter.c2
-rw-r--r--drivers/hwmon/applesmc.c2
-rw-r--r--drivers/hwmon/dell-smm-hwmon.c4
-rw-r--r--drivers/hwtracing/intel_th/pci.c10
-rw-r--r--drivers/hwtracing/stm/core.c2
-rw-r--r--drivers/i2c/busses/Kconfig35
-rw-r--r--drivers/i2c/busses/Makefile4
-rw-r--r--drivers/i2c/busses/i2c-altera.c511
-rw-r--r--drivers/i2c/busses/i2c-aspeed.c81
-rw-r--r--drivers/i2c/busses/i2c-at91.c2
-rw-r--r--drivers/i2c/busses/i2c-bcm-iproc.c6
-rw-r--r--drivers/i2c/busses/i2c-bfin-twi.c1
-rw-r--r--drivers/i2c/busses/i2c-cadence.c6
-rw-r--r--drivers/i2c/busses/i2c-cht-wc.c363
-rw-r--r--drivers/i2c/busses/i2c-cpm.c2
-rw-r--r--drivers/i2c/busses/i2c-davinci.c10
-rw-r--r--drivers/i2c/busses/i2c-designware-platdrv.c6
-rw-r--r--drivers/i2c/busses/i2c-designware-slave.c2
-rw-r--r--drivers/i2c/busses/i2c-exynos5.c6
-rw-r--r--drivers/i2c/busses/i2c-gpio.c4
-rw-r--r--drivers/i2c/busses/i2c-hix5hd2.c6
-rw-r--r--drivers/i2c/busses/i2c-i801.c12
-rw-r--r--drivers/i2c/busses/i2c-img-scb.c2
-rw-r--r--drivers/i2c/busses/i2c-kempld.c2
-rw-r--r--drivers/i2c/busses/i2c-lpc2k.c6
-rw-r--r--drivers/i2c/busses/i2c-mlxcpld.c2
-rw-r--r--drivers/i2c/busses/i2c-mt65xx.c79
-rw-r--r--drivers/i2c/busses/i2c-mv64xxx.c5
-rw-r--r--drivers/i2c/busses/i2c-nomadik.c2
-rw-r--r--drivers/i2c/busses/i2c-ocores.c2
-rw-r--r--drivers/i2c/busses/i2c-octeon-platdrv.c2
-rw-r--r--drivers/i2c/busses/i2c-opal.c2
-rw-r--r--drivers/i2c/busses/i2c-pmcmsp.c4
-rw-r--r--drivers/i2c/busses/i2c-pnx.c2
-rw-r--r--drivers/i2c/busses/i2c-powermac.c12
-rw-r--r--drivers/i2c/busses/i2c-puv3.c2
-rw-r--r--drivers/i2c/busses/i2c-pxa.c6
-rw-r--r--drivers/i2c/busses/i2c-qup.c2
-rw-r--r--drivers/i2c/busses/i2c-rcar.c5
-rw-r--r--drivers/i2c/busses/i2c-rk3x.c9
-rw-r--r--drivers/i2c/busses/i2c-s3c2410.c6
-rw-r--r--drivers/i2c/busses/i2c-sh_mobile.c4
-rw-r--r--drivers/i2c/busses/i2c-sirf.c6
-rw-r--r--drivers/i2c/busses/i2c-sprd.c646
-rw-r--r--drivers/i2c/busses/i2c-st.c3
-rw-r--r--drivers/i2c/busses/i2c-stm32.h20
-rw-r--r--drivers/i2c/busses/i2c-stm32f4.c22
-rw-r--r--drivers/i2c/busses/i2c-stm32f7.c972
-rw-r--r--drivers/i2c/busses/i2c-sun6i-p2wi.c6
-rw-r--r--drivers/i2c/busses/i2c-taos-evm.c2
-rw-r--r--drivers/i2c/busses/i2c-tegra.c4
-rw-r--r--drivers/i2c/busses/i2c-thunderx-pcidrv.c2
-rw-r--r--drivers/i2c/busses/i2c-uniphier-f.c46
-rw-r--r--drivers/i2c/busses/i2c-uniphier.c40
-rw-r--r--drivers/i2c/busses/i2c-versatile.c2
-rw-r--r--drivers/i2c/busses/i2c-xiic.c8
-rw-r--r--drivers/i2c/i2c-core-of.c24
-rw-r--r--drivers/i2c/muxes/Kconfig3
-rw-r--r--drivers/i2c/muxes/i2c-demux-pinctrl.c4
-rw-r--r--drivers/i2c/muxes/i2c-mux-mlxcpld.c2
-rw-r--r--drivers/i2c/muxes/i2c-mux-pca9541.c9
-rw-r--r--drivers/i2c/muxes/i2c-mux-pca954x.c2
-rw-r--r--drivers/i2c/muxes/i2c-mux-pinctrl.c225
-rw-r--r--drivers/iio/adc/ad7793.c4
-rw-r--r--drivers/iio/adc/ad_sigma_delta.c28
-rw-r--r--drivers/iio/adc/mcp320x.c25
-rw-r--r--drivers/iio/adc/stm32-adc.c2
-rw-r--r--drivers/iio/adc/ti-ads1015.c8
-rw-r--r--drivers/iio/adc/twl4030-madc.c14
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c11
-rw-r--r--drivers/iio/industrialio-core.c4
-rw-r--r--drivers/iio/magnetometer/st_magn_core.c4
-rw-r--r--drivers/iio/pressure/bmp280-core.c2
-rw-r--r--drivers/iio/trigger/stm32-timer-trigger.c4
-rw-r--r--drivers/infiniband/core/security.c4
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c14
-rw-r--r--drivers/infiniband/core/verbs.c4
-rw-r--r--drivers/infiniband/hw/bnxt_re/bnxt_re.h14
-rw-r--r--drivers/infiniband/hw/bnxt_re/ib_verbs.c107
-rw-r--r--drivers/infiniband/hw/bnxt_re/main.c28
-rw-r--r--drivers/infiniband/hw/bnxt_re/qplib_rcfw.c4
-rw-r--r--drivers/infiniband/hw/bnxt_re/qplib_rcfw.h3
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c9
-rw-r--r--drivers/infiniband/hw/hfi1/chip.c101
-rw-r--r--drivers/infiniband/hw/hfi1/chip.h3
-rw-r--r--drivers/infiniband/hw/hfi1/eprom.c20
-rw-r--r--drivers/infiniband/hw/hfi1/file_ops.c41
-rw-r--r--drivers/infiniband/hw/hfi1/pcie.c50
-rw-r--r--drivers/infiniband/hw/hfi1/platform.c4
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw.h1
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.c154
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.h5
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_main.c39
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_utils.c6
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c12
-rw-r--r--drivers/infiniband/hw/mlx4/sysfs.c2
-rw-r--r--drivers/infiniband/hw/mlx5/main.c16
-rw-r--r--drivers/infiniband/hw/mlx5/mem.c47
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c27
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c4
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c3
-rw-r--r--drivers/infiniband/hw/vmw_pvrdma/pvrdma.h31
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_cm.c16
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_ib.c13
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c15
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_vlan.c30
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c2
-rw-r--r--drivers/input/ff-core.c13
-rw-r--r--drivers/input/joystick/adi.c2
-rw-r--r--drivers/input/joystick/xpad.c10
-rw-r--r--drivers/input/misc/Kconfig12
-rw-r--r--drivers/input/misc/Makefile1
-rw-r--r--drivers/input/misc/pwm-vibra.c267
-rw-r--r--drivers/input/misc/uinput.c57
-rw-r--r--drivers/input/mouse/elan_i2c_i2c.c2
-rw-r--r--drivers/input/mouse/elantech.c8
-rw-r--r--drivers/input/serio/i8042-x86ia64io.h7
-rw-r--r--drivers/input/touchscreen/edt-ft5x06.c3
-rw-r--r--drivers/input/touchscreen/goodix.c9
-rw-r--r--drivers/input/touchscreen/htcpen.c2
-rw-r--r--drivers/input/touchscreen/surface3_spi.c2
-rw-r--r--drivers/input/touchscreen/ucb1400_ts.c4
-rw-r--r--drivers/iommu/Kconfig16
-rw-r--r--drivers/iommu/Makefile1
-rw-r--r--drivers/iommu/amd_iommu.c313
-rw-r--r--drivers/iommu/amd_iommu_init.c223
-rw-r--r--drivers/iommu/amd_iommu_proto.h2
-rw-r--r--drivers/iommu/amd_iommu_types.h55
-rw-r--r--drivers/iommu/amd_iommu_v2.c18
-rw-r--r--drivers/iommu/arm-smmu-regs.h220
-rw-r--r--drivers/iommu/arm-smmu-v3.c7
-rw-r--r--drivers/iommu/arm-smmu.c384
-rw-r--r--drivers/iommu/dmar.c4
-rw-r--r--drivers/iommu/exynos-iommu.c44
-rw-r--r--drivers/iommu/fsl_pamu.c27
-rw-r--r--drivers/iommu/fsl_pamu_domain.c28
-rw-r--r--drivers/iommu/intel-iommu.c280
-rw-r--r--drivers/iommu/intel-svm.c14
-rw-r--r--drivers/iommu/io-pgtable-arm-v7s.c2
-rw-r--r--drivers/iommu/iommu.c59
-rw-r--r--drivers/iommu/iova.c183
-rw-r--r--drivers/iommu/ipmmu-vmsa.c242
-rw-r--r--drivers/iommu/msm_iommu.c15
-rw-r--r--drivers/iommu/mtk_iommu.c217
-rw-r--r--drivers/iommu/mtk_iommu.h9
-rw-r--r--drivers/iommu/of_iommu.c143
-rw-r--r--drivers/iommu/omap-iommu.c125
-rw-r--r--drivers/iommu/omap-iommu.h1
-rw-r--r--drivers/iommu/qcom_iommu.c930
-rw-r--r--drivers/iommu/rockchip-iommu.c52
-rw-r--r--drivers/iommu/s390-iommu.c37
-rw-r--r--drivers/iommu/tegra-gart.c45
-rw-r--r--drivers/iommu/tegra-smmu.c39
-rw-r--r--drivers/irqchip/irq-gic-v3.c8
-rw-r--r--drivers/irqchip/irq-gic-v4.c12
-rw-r--r--drivers/irqchip/irq-mips-cpu.c2
-rw-r--r--drivers/irqchip/irq-mips-gic.c619
-rw-r--r--drivers/isdn/i4l/isdn_ppp.c37
-rw-r--r--drivers/leds/leds-as3645a.c29
-rw-r--r--drivers/leds/leds-clevo-mail.c2
-rw-r--r--drivers/leds/leds-ss4200.c2
-rw-r--r--drivers/md/dm-bufio.c95
-rw-r--r--drivers/md/dm-bufio.h9
-rw-r--r--drivers/md/dm-cache-target.c4
-rw-r--r--drivers/md/dm-core.h1
-rw-r--r--drivers/md/dm-crypt.c7
-rw-r--r--drivers/md/dm-flakey.c4
-rw-r--r--drivers/md/dm-integrity.c42
-rw-r--r--drivers/md/dm-ioctl.c39
-rw-r--r--drivers/md/dm-linear.c15
-rw-r--r--drivers/md/dm-log-writes.c44
-rw-r--r--drivers/md/dm-mpath.c15
-rw-r--r--drivers/md/dm-raid.c13
-rw-r--r--drivers/md/dm-rq.c27
-rw-r--r--drivers/md/dm-rq.h1
-rw-r--r--drivers/md/dm-stripe.c20
-rw-r--r--drivers/md/dm-switch.c2
-rw-r--r--drivers/md/dm-table.c7
-rw-r--r--drivers/md/dm-thin.c2
-rw-r--r--drivers/md/dm-verity-target.c2
-rw-r--r--drivers/md/dm.c29
-rw-r--r--drivers/md/md.c72
-rw-r--r--drivers/md/md.h1
-rw-r--r--drivers/md/raid5.c20
-rw-r--r--drivers/media/cec/cec-adap.c5
-rw-r--r--drivers/media/pci/cx25821/cx25821-audio-upstream.c13
-rw-r--r--drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c5
-rw-r--r--drivers/media/rc/ir-sharp-decoder.c2
-rw-r--r--drivers/memory/atmel-ebi.c17
-rw-r--r--drivers/memory/jz4780-nemc.c12
-rw-r--r--drivers/memory/mtk-smi.c96
-rw-r--r--drivers/memory/mvebu-devbus.c12
-rw-r--r--drivers/memory/omap-gpmc.c16
-rw-r--r--drivers/mfd/kempld-core.c2
-rw-r--r--drivers/misc/cxl/pci.c2
-rw-r--r--drivers/mmc/core/queue.c7
-rw-r--r--drivers/mmc/host/Kconfig2
-rw-r--r--drivers/mmc/host/cavium-thunderx.c6
-rw-r--r--drivers/mmc/host/sdhci-pci-core.c15
-rw-r--r--drivers/mmc/host/tmio_mmc_core.c47
-rw-r--r--drivers/mtd/devices/docg3.c49
-rw-r--r--drivers/mtd/devices/docg3.h2
-rw-r--r--drivers/mtd/devices/spear_smi.c2
-rw-r--r--drivers/mtd/devices/st_spi_fsm.c20
-rw-r--r--drivers/mtd/inftlcore.c2
-rw-r--r--drivers/mtd/maps/amd76xrom.c4
-rw-r--r--drivers/mtd/maps/ck804xrom.c4
-rw-r--r--drivers/mtd/maps/esb2rom.c4
-rw-r--r--drivers/mtd/maps/ichxrom.c4
-rw-r--r--drivers/mtd/maps/intel_vr_nor.c2
-rw-r--r--drivers/mtd/maps/lantiq-flash.c6
-rw-r--r--drivers/mtd/maps/pci.c2
-rw-r--r--drivers/mtd/maps/physmap_of_core.c8
-rw-r--r--drivers/mtd/maps/physmap_of_gemini.c16
-rw-r--r--drivers/mtd/maps/physmap_of_versatile.c2
-rw-r--r--drivers/mtd/maps/sun_uflash.c4
-rw-r--r--drivers/mtd/mtdcore.c18
-rw-r--r--drivers/mtd/mtdpart.c8
-rw-r--r--drivers/mtd/mtdswap.c21
-rw-r--r--drivers/mtd/nand/Kconfig2
-rw-r--r--drivers/mtd/nand/ams-delta.c2
-rw-r--r--drivers/mtd/nand/atmel/nand-controller.c15
-rw-r--r--drivers/mtd/nand/atmel/pmecc.c4
-rw-r--r--drivers/mtd/nand/au1550nd.c2
-rw-r--r--drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h2
-rw-r--r--drivers/mtd/nand/bf5xx_nand.c2
-rw-r--r--drivers/mtd/nand/brcmnand/brcmnand.c2
-rw-r--r--drivers/mtd/nand/cafe_nand.c2
-rw-r--r--drivers/mtd/nand/cmx270_nand.c2
-rw-r--r--drivers/mtd/nand/cs553x_nand.c2
-rw-r--r--drivers/mtd/nand/davinci_nand.c2
-rw-r--r--drivers/mtd/nand/denali.h2
-rw-r--r--drivers/mtd/nand/denali_dt.c4
-rw-r--r--drivers/mtd/nand/diskonchip.c2
-rw-r--r--drivers/mtd/nand/docg4.c2
-rw-r--r--drivers/mtd/nand/fsl_elbc_nand.c2
-rw-r--r--drivers/mtd/nand/fsl_ifc_nand.c2
-rw-r--r--drivers/mtd/nand/fsl_upm.c2
-rw-r--r--drivers/mtd/nand/fsmc_nand.c2
-rw-r--r--drivers/mtd/nand/gpio.c2
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.h2
-rw-r--r--drivers/mtd/nand/hisi504_nand.c2
-rw-r--r--drivers/mtd/nand/jz4740_nand.c2
-rw-r--r--drivers/mtd/nand/jz4780_nand.c2
-rw-r--r--drivers/mtd/nand/lpc32xx_mlc.c12
-rw-r--r--drivers/mtd/nand/lpc32xx_slc.c11
-rw-r--r--drivers/mtd/nand/mpc5121_nfc.c2
-rw-r--r--drivers/mtd/nand/mtk_ecc.c4
-rw-r--r--drivers/mtd/nand/mtk_nand.c2
-rw-r--r--drivers/mtd/nand/mxc_nand.c9
-rw-r--r--drivers/mtd/nand/nand_amd.c2
-rw-r--r--drivers/mtd/nand/nand_base.c307
-rw-r--r--drivers/mtd/nand/nand_bbt.c2
-rw-r--r--drivers/mtd/nand/nand_bch.c2
-rw-r--r--drivers/mtd/nand/nand_ecc.c2
-rw-r--r--drivers/mtd/nand/nand_hynix.c6
-rw-r--r--drivers/mtd/nand/nand_ids.c2
-rw-r--r--drivers/mtd/nand/nand_macronix.c2
-rw-r--r--drivers/mtd/nand/nand_micron.c2
-rw-r--r--drivers/mtd/nand/nand_samsung.c2
-rw-r--r--drivers/mtd/nand/nand_timings.c2
-rw-r--r--drivers/mtd/nand/nand_toshiba.c2
-rw-r--r--drivers/mtd/nand/nandsim.c55
-rw-r--r--drivers/mtd/nand/ndfc.c2
-rw-r--r--drivers/mtd/nand/nuc900_nand.c2
-rw-r--r--drivers/mtd/nand/omap2.c2
-rw-r--r--drivers/mtd/nand/orion_nand.c9
-rw-r--r--drivers/mtd/nand/oxnas_nand.c27
-rw-r--r--drivers/mtd/nand/pasemi_nand.c2
-rw-r--r--drivers/mtd/nand/plat_nand.c2
-rw-r--r--drivers/mtd/nand/pxa3xx_nand.c2
-rw-r--r--drivers/mtd/nand/qcom_nandc.c919
-rw-r--r--drivers/mtd/nand/r852.h2
-rw-r--r--drivers/mtd/nand/s3c2410.c2
-rw-r--r--drivers/mtd/nand/sh_flctl.c8
-rw-r--r--drivers/mtd/nand/sharpsl.c4
-rw-r--r--drivers/mtd/nand/sm_common.c2
-rw-r--r--drivers/mtd/nand/socrates_nand.c2
-rw-r--r--drivers/mtd/nand/sunxi_nand.c4
-rw-r--r--drivers/mtd/nand/tango_nand.c2
-rw-r--r--drivers/mtd/nand/tmio_nand.c6
-rw-r--r--drivers/mtd/nand/txx9ndfmc.c2
-rw-r--r--drivers/mtd/nand/vf610_nfc.c11
-rw-r--r--drivers/mtd/nand/xway_nand.c2
-rw-r--r--drivers/mtd/nftlcore.c2
-rw-r--r--drivers/mtd/nftlmount.c2
-rw-r--r--drivers/mtd/ofpart.c23
-rw-r--r--drivers/mtd/spi-nor/Kconfig16
-rw-r--r--drivers/mtd/spi-nor/Makefile3
-rw-r--r--drivers/mtd/spi-nor/aspeed-smc.c13
-rw-r--r--drivers/mtd/spi-nor/atmel-quadspi.c1
-rw-r--r--drivers/mtd/spi-nor/hisi-sfc.c8
-rw-r--r--drivers/mtd/spi-nor/intel-spi-pci.c82
-rw-r--r--drivers/mtd/spi-nor/mtk-quadspi.c1
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c844
-rw-r--r--drivers/mtd/ssfdc.c2
-rw-r--r--drivers/mtd/tests/nandbiterrs.c2
-rw-r--r--drivers/mtd/ubi/block.c6
-rw-r--r--drivers/mtd/ubi/build.c20
-rw-r--r--drivers/mtd/ubi/fastmap.c2
-rw-r--r--drivers/mtd/ubi/ubi-media.h4
-rw-r--r--drivers/net/bonding/bond_main.c17
-rw-r--r--drivers/net/bonding/bond_options.c3
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c6
-rw-r--r--drivers/net/ethernet/amd/au1000_eth.c18
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_cfg.h4
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_nic.c145
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_nic.h2
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_ring.c53
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_ring.h10
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_vec.c8
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h2
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c3
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c55
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c4
-rw-r--r--drivers/net/ethernet/broadcom/cnic.c2
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c4
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h8
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c14
-rw-r--r--drivers/net/ethernet/freescale/fec.h4
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c8
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hnae3.c43
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hnae3.h15
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h12
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c184
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h3
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c41
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h4
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c23
-rw-r--r--drivers/net/ethernet/i825xx/lasi_82596.c6
-rw-r--r--drivers/net/ethernet/i825xx/lib82596.c9
-rw-r--r--drivers/net/ethernet/i825xx/sni_82596.c6
-rw-r--r--drivers/net/ethernet/ibm/emac/mal.c3
-rw-r--r--drivers/net/ethernet/marvell/mvpp2.c46
-rw-r--r--drivers/net/ethernet/marvell/skge.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_fs.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_main.c13
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rx.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_stats.h6
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tc.c91
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tx.c1
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c8
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.h11
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/sriov.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c38
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c35
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/offload.c13
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_main.c47
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_main.c23
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h2
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c45
-rw-r--r--drivers/net/ethernet/nuvoton/w90p910_ether.c1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_dcbx.c1
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac-ethtool.c30
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac-mac.c25
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac.c3
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac.h3
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c5
-rw-r--r--drivers/net/ethernet/realtek/8139too.c5
-rw-r--r--drivers/net/ethernet/rocker/rocker_tlv.h48
-rw-r--r--drivers/net/ethernet/seeq/sgiseeq.c8
-rw-r--r--drivers/net/ethernet/smsc/smsc911x.c15
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c1
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c112
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c7
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c1
-rw-r--r--drivers/net/ethernet/via/via-rhine.c2
-rw-r--r--drivers/net/hyperv/hyperv_net.h5
-rw-r--r--drivers/net/hyperv/netvsc.c10
-rw-r--r--drivers/net/hyperv/netvsc_drv.c21
-rw-r--r--drivers/net/hyperv/rndis_filter.c126
-rw-r--r--drivers/net/phy/Kconfig18
-rw-r--r--drivers/net/phy/phy.c3
-rw-r--r--drivers/net/phy/phy_device.c2
-rw-r--r--drivers/net/phy/xilinx_gmii2rgmii.c2
-rw-r--r--drivers/net/ppp/ppp_generic.c22
-rw-r--r--drivers/net/tun.c8
-rw-r--r--drivers/net/usb/cdc_ether.c21
-rw-r--r--drivers/net/usb/lan78xx.c34
-rw-r--r--drivers/net/usb/r8152.c2
-rw-r--r--drivers/net/usb/rndis_host.c4
-rw-r--r--drivers/net/usb/smsc95xx.c11
-rw-r--r--drivers/net/vrf.c6
-rw-r--r--drivers/net/wireless/ath/ath10k/pci.c7
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c37
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h5
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/d3.c2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c62
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/rs.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c7
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/scan.c2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/sta.c8
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/sta.h2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/tt.c1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/tx.c10
-rw-r--r--drivers/net/wireless/quantenna/qtnfmac/cfg80211.c9
-rw-r--r--drivers/net/wireless/quantenna/qtnfmac/cfg80211.h3
-rw-r--r--drivers/net/wireless/quantenna/qtnfmac/event.c2
-rw-r--r--drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c9
-rw-r--r--drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h2
-rw-r--r--drivers/nvdimm/btt.c197
-rw-r--r--drivers/nvdimm/btt.h11
-rw-r--r--drivers/nvdimm/btt_devs.c4
-rw-r--r--drivers/nvdimm/bus.c27
-rw-r--r--drivers/nvdimm/claim.c9
-rw-r--r--drivers/nvdimm/core.c10
-rw-r--r--drivers/nvdimm/label.c30
-rw-r--r--drivers/nvdimm/namespace_devs.c15
-rw-r--r--drivers/nvdimm/nd.h16
-rw-r--r--drivers/nvdimm/pfn_devs.c53
-rw-r--r--drivers/nvdimm/pmem.c7
-rw-r--r--drivers/nvdimm/pmem.h14
-rw-r--r--drivers/nvdimm/region_devs.c6
-rw-r--r--drivers/nvme/host/core.c20
-rw-r--r--drivers/nvme/host/fabrics.c18
-rw-r--r--drivers/nvme/host/fc.c21
-rw-r--r--drivers/nvme/host/lightnvm.c26
-rw-r--r--drivers/nvme/host/nvme.h13
-rw-r--r--drivers/nvme/host/pci.c108
-rw-r--r--drivers/nvme/host/rdma.c9
-rw-r--r--drivers/nvme/target/core.c9
-rw-r--r--drivers/nvme/target/fabrics-cmd.c9
-rw-r--r--drivers/nvme/target/fc.c24
-rw-r--r--drivers/nvme/target/fcloop.c104
-rw-r--r--drivers/nvme/target/nvmet.h1
-rw-r--r--drivers/nvmem/core.c3
-rw-r--r--drivers/of/device.c48
-rw-r--r--drivers/pci/endpoint/functions/pci-epf-test.c13
-rw-r--r--drivers/pci/pci-sysfs.c11
-rw-r--r--drivers/pci/pci.c13
-rw-r--r--drivers/pci/pcie/portdrv_pci.c2
-rw-r--r--drivers/pci/quirks.c2
-rw-r--r--drivers/pcmcia/db1xxx_ss.c33
-rw-r--r--drivers/perf/arm_pmu_acpi.c1
-rw-r--r--drivers/phy/Kconfig1
-rw-r--r--drivers/phy/Makefile2
-rw-r--r--drivers/phy/lantiq/Kconfig9
-rw-r--r--drivers/phy/lantiq/Makefile1
-rw-r--r--drivers/phy/lantiq/phy-lantiq-rcu-usb2.c254
-rw-r--r--drivers/pinctrl/mvebu/pinctrl-armada-37xx.c41
-rw-r--r--drivers/pinctrl/pinctrl-amd.c75
-rw-r--r--drivers/pinctrl/pinctrl-amd.h1
-rw-r--r--drivers/pinctrl/sprd/Kconfig3
-rw-r--r--drivers/pinctrl/sprd/pinctrl-sprd.c32
-rw-r--r--drivers/pinctrl/uniphier/pinctrl-uniphier.h2
-rw-r--r--drivers/platform/chrome/chromeos_laptop.c2
-rw-r--r--drivers/platform/chrome/chromeos_pstore.c2
-rw-r--r--drivers/platform/chrome/cros_ec_lpc.c2
-rw-r--r--drivers/platform/x86/compal-laptop.c2
-rw-r--r--drivers/platform/x86/fujitsu-laptop.c10
-rw-r--r--drivers/platform/x86/hdaps.c2
-rw-r--r--drivers/platform/x86/ibm_rtl.c2
-rw-r--r--drivers/platform/x86/intel_oaktrail.c2
-rw-r--r--drivers/platform/x86/mlx-platform.c2
-rw-r--r--drivers/platform/x86/msi-laptop.c2
-rw-r--r--drivers/platform/x86/samsung-laptop.c2
-rw-r--r--drivers/platform/x86/samsung-q10.c2
-rw-r--r--drivers/platform/x86/sony-laptop.c2
-rw-r--r--drivers/platform/x86/toshiba-wmi.c2
-rw-r--r--drivers/pnp/pnpbios/core.c2
-rw-r--r--drivers/power/reset/at91-sama5d2_shdwc.c4
-rw-r--r--drivers/power/supply/Kconfig23
-rw-r--r--drivers/power/supply/Makefile2
-rw-r--r--drivers/power/supply/act8945a_charger.c4
-rw-r--r--drivers/power/supply/bq24190_charger.c346
-rw-r--r--drivers/power/supply/bq27xxx_battery.c575
-rw-r--r--drivers/power/supply/bq27xxx_battery_hdq.c135
-rw-r--r--drivers/power/supply/bq27xxx_battery_i2c.c16
-rw-r--r--drivers/power/supply/charger-manager.c9
-rw-r--r--drivers/power/supply/ds2780_battery.c4
-rw-r--r--drivers/power/supply/ds2781_battery.c4
-rw-r--r--drivers/power/supply/lp8788-charger.c18
-rw-r--r--drivers/power/supply/ltc2941-battery-gauge.c156
-rw-r--r--drivers/power/supply/max17042_battery.c42
-rw-r--r--drivers/power/supply/max1721x_battery.c448
-rw-r--r--drivers/power/supply/olpc_battery.c4
-rw-r--r--drivers/power/supply/pcf50633-charger.c2
-rw-r--r--drivers/power/supply/power_supply_core.c54
-rw-r--r--drivers/power/supply/sbs-battery.c26
-rw-r--r--drivers/pwm/Kconfig13
-rw-r--r--drivers/pwm/Makefile1
-rw-r--r--drivers/pwm/pwm-bcm2835.c2
-rw-r--r--drivers/pwm/pwm-hibvt.c2
-rw-r--r--drivers/pwm/pwm-mediatek.c78
-rw-r--r--drivers/pwm/pwm-meson.c2
-rw-r--r--drivers/pwm/pwm-pca9685.c14
-rw-r--r--drivers/pwm/pwm-renesas-tpu.c1
-rw-r--r--drivers/pwm/pwm-rockchip.c281
-rw-r--r--drivers/pwm/pwm-samsung.c70
-rw-r--r--drivers/pwm/pwm-tegra.c2
-rw-r--r--drivers/pwm/pwm-tiecap.c90
-rw-r--r--drivers/pwm/pwm-tiehrpwm.c122
-rw-r--r--drivers/pwm/pwm-vt8500.c1
-rw-r--r--drivers/pwm/pwm-zx.c282
-rw-r--r--drivers/rapidio/devices/tsi721.c7
-rw-r--r--drivers/rapidio/rio-access.c40
-rw-r--r--drivers/remoteproc/Kconfig10
-rw-r--r--drivers/remoteproc/Makefile1
-rw-r--r--drivers/remoteproc/da8xx_remoteproc.c98
-rw-r--r--drivers/remoteproc/imx_rproc.c426
-rw-r--r--drivers/remoteproc/keystone_remoteproc.c3
-rw-r--r--drivers/remoteproc/qcom_adsp_pil.c14
-rw-r--r--drivers/remoteproc/qcom_common.c122
-rw-r--r--drivers/remoteproc/qcom_common.h21
-rw-r--r--drivers/remoteproc/qcom_q6v5_pil.c6
-rw-r--r--drivers/remoteproc/remoteproc_core.c35
-rw-r--r--drivers/remoteproc/remoteproc_internal.h1
-rw-r--r--drivers/remoteproc/st_remoteproc.c6
-rw-r--r--drivers/reset/Kconfig16
-rw-r--r--drivers/reset/Makefile3
-rw-r--r--drivers/reset/core.c238
-rw-r--r--drivers/reset/reset-gemini.c110
-rw-r--r--drivers/reset/reset-hsdk.c137
-rw-r--r--drivers/reset/reset-lantiq.c212
-rw-r--r--drivers/reset/reset-sunxi.c4
-rw-r--r--drivers/reset/reset-uniphier.c117
-rw-r--r--drivers/reset/reset-zx2967.c2
-rw-r--r--drivers/rpmsg/Kconfig16
-rw-r--r--drivers/rpmsg/Makefile2
-rw-r--r--drivers/rpmsg/qcom_glink_native.c1612
-rw-r--r--drivers/rpmsg/qcom_glink_native.h45
-rw-r--r--drivers/rpmsg/qcom_glink_rpm.c1026
-rw-r--r--drivers/rpmsg/qcom_glink_smem.c316
-rw-r--r--drivers/rpmsg/qcom_smd.c1
-rw-r--r--drivers/rpmsg/virtio_rpmsg_bus.c47
-rw-r--r--drivers/rtc/Kconfig30
-rw-r--r--drivers/rtc/Makefile2
-rw-r--r--drivers/rtc/rtc-dev.c20
-rw-r--r--drivers/rtc/rtc-ds1307.c457
-rw-r--r--drivers/rtc/rtc-ds1672.c2
-rw-r--r--drivers/rtc/rtc-em3027.c2
-rw-r--r--drivers/rtc/rtc-goldfish.c237
-rw-r--r--drivers/rtc/rtc-m41t80.c67
-rw-r--r--drivers/rtc/rtc-max6900.c2
-rw-r--r--drivers/rtc/rtc-max8925.c2
-rw-r--r--drivers/rtc/rtc-mxc.c21
-rw-r--r--drivers/rtc/rtc-puv3.c72
-rw-r--r--drivers/rtc/rtc-pxa.c4
-rw-r--r--drivers/rtc/rtc-rtd119x.c242
-rw-r--r--drivers/rtc/rtc-rv3029c2.c2
-rw-r--r--drivers/rtc/rtc-s35390a.c104
-rw-r--r--drivers/rtc/rtc-sa1100.c65
-rw-r--r--drivers/rtc/rtc-sun6i.c34
-rw-r--r--drivers/rtc/rtc-vr41xx.c18
-rw-r--r--drivers/s390/block/dasd.c337
-rw-r--r--drivers/s390/block/dasd_devmap.c8
-rw-r--r--drivers/s390/block/dasd_int.h19
-rw-r--r--drivers/s390/block/scm_blk.c6
-rw-r--r--drivers/s390/cio/device.c12
-rw-r--r--drivers/s390/cio/device.h1
-rw-r--r--drivers/s390/cio/device_fsm.c12
-rw-r--r--drivers/s390/cio/io_sch.h2
-rw-r--r--drivers/s390/crypto/ap_asm.h9
-rw-r--r--drivers/s390/crypto/ap_bus.c49
-rw-r--r--drivers/s390/crypto/ap_bus.h47
-rw-r--r--drivers/s390/crypto/ap_queue.c26
-rw-r--r--drivers/scsi/Kconfig2
-rw-r--r--drivers/scsi/NCR_Q720.c3
-rw-r--r--drivers/scsi/aacraid/aachba.c12
-rw-r--r--drivers/scsi/aacraid/aacraid.h5
-rw-r--r--drivers/scsi/aacraid/linit.c20
-rw-r--r--drivers/scsi/aacraid/src.c2
-rw-r--r--drivers/scsi/arm/acornscsi.c6
-rw-r--r--drivers/scsi/hosts.c8
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c1
-rw-r--r--drivers/scsi/lpfc/lpfc_nvme.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_nvme.c2
-rw-r--r--drivers/scsi/scsi_error.c3
-rw-r--r--drivers/scsi/scsi_transport_fc.c16
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c2
-rw-r--r--drivers/scsi/sd.c2
-rw-r--r--drivers/scsi/sg.c64
-rw-r--r--drivers/soc/Kconfig1
-rw-r--r--drivers/soc/Makefile2
-rw-r--r--drivers/soc/amlogic/Kconfig12
-rw-r--r--drivers/soc/amlogic/Makefile1
-rw-r--r--drivers/soc/amlogic/meson-gx-socinfo.c177
-rw-r--r--drivers/soc/fsl/qbman/bman_ccsr.c10
-rw-r--r--drivers/soc/fsl/qbman/bman_portal.c8
-rw-r--r--drivers/soc/fsl/qbman/qman_ccsr.c12
-rw-r--r--drivers/soc/fsl/qbman/qman_portal.c11
-rw-r--r--drivers/soc/fsl/qe/gpio.c4
-rw-r--r--drivers/soc/lantiq/Makefile2
-rw-r--r--drivers/soc/lantiq/fpi-bus.c87
-rw-r--r--drivers/soc/lantiq/gphy.c260
-rw-r--r--drivers/soc/mediatek/mtk-pmic-wrap.c10
-rw-r--r--drivers/soc/mediatek/mtk-scpsys.c247
-rw-r--r--drivers/soc/qcom/Kconfig13
-rw-r--r--drivers/soc/qcom/Makefile1
-rw-r--r--drivers/soc/qcom/glink_ssr.c164
-rw-r--r--drivers/soc/qcom/mdt_loader.c5
-rw-r--r--drivers/soc/qcom/smsm.c3
-rw-r--r--drivers/soc/qcom/wcnss_ctrl.c1
-rw-r--r--drivers/soc/renesas/Kconfig7
-rw-r--r--drivers/soc/renesas/Makefile1
-rw-r--r--drivers/soc/renesas/r8a77995-sysc.c31
-rw-r--r--drivers/soc/renesas/rcar-rst.c5
-rw-r--r--drivers/soc/renesas/rcar-sysc.c9
-rw-r--r--drivers/soc/renesas/rcar-sysc.h1
-rw-r--r--drivers/soc/renesas/renesas-soc.c8
-rw-r--r--drivers/soc/rockchip/grf.c14
-rw-r--r--drivers/soc/rockchip/pm_domains.c32
-rw-r--r--drivers/soc/samsung/pm_domains.c10
-rw-r--r--drivers/soc/sunxi/sunxi_sram.c57
-rw-r--r--drivers/soc/tegra/Kconfig5
-rw-r--r--drivers/soc/tegra/fuse/fuse-tegra.c56
-rw-r--r--drivers/soc/tegra/pmc.c4
-rw-r--r--drivers/soc/versatile/soc-realview.c2
-rw-r--r--drivers/staging/android/ashmem.c29
-rw-r--r--drivers/staging/comedi/drivers/serial2002.c24
-rw-r--r--drivers/staging/iio/adc/ad7192.c4
-rw-r--r--drivers/staging/lustre/lnet/libcfs/tracefile.c10
-rw-r--r--drivers/staging/lustre/lustre/llite/llite_lib.c4
-rw-r--r--drivers/staging/lustre/lustre/llite/namei.c3
-rw-r--r--drivers/staging/lustre/lustre/obdclass/kernelcomm.c7
-rw-r--r--drivers/staging/mt29f_spinand/mt29f_spinand.c10
-rw-r--r--drivers/staging/pi433/rf69.c9
-rw-r--r--drivers/staging/rtl8723bs/core/rtw_mlme.c3
-rw-r--r--drivers/staging/rtl8723bs/os_dep/rtw_proc.c2
-rw-r--r--drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c4
-rw-r--r--drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c13
-rw-r--r--drivers/staging/speakup/main.c15
-rw-r--r--drivers/staging/unisys/visorbus/visorchipset.c4
-rw-r--r--drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c6
-rw-r--r--drivers/target/target_core_alua.c3
-rw-r--r--drivers/target/target_core_file.c2
-rw-r--r--drivers/target/target_core_pr.c3
-rw-r--r--drivers/tee/optee/core.c19
-rw-r--r--drivers/tee/optee/optee_smc.h12
-rw-r--r--drivers/tee/optee/rpc.c15
-rw-r--r--drivers/tee/tee_core.c5
-rw-r--r--drivers/tee/tee_shm.c2
-rw-r--r--drivers/thermal/Kconfig12
-rw-r--r--drivers/thermal/Makefile1
-rw-r--r--drivers/thermal/broadcom/bcm2835_thermal.c2
-rw-r--r--drivers/thermal/hisi_thermal.c2
-rw-r--r--drivers/thermal/int340x_thermal/acpi_thermal_rel.c2
-rw-r--r--drivers/thermal/int340x_thermal/acpi_thermal_rel.h8
-rw-r--r--drivers/thermal/int340x_thermal/int3400_thermal.c43
-rw-r--r--drivers/thermal/int340x_thermal/int3406_thermal.c96
-rw-r--r--drivers/thermal/int340x_thermal/processor_thermal_device.c2
-rw-r--r--drivers/thermal/intel_pch_thermal.c12
-rw-r--r--drivers/thermal/mtk_thermal.c88
-rw-r--r--drivers/thermal/qoriq_thermal.c2
-rw-r--r--drivers/thermal/rcar_gen3_thermal.c2
-rw-r--r--drivers/thermal/rockchip_thermal.c65
-rw-r--r--drivers/thermal/samsung/exynos_tmu.c2
-rw-r--r--drivers/thermal/thermal_core.c31
-rw-r--r--drivers/thermal/thermal_core.h1
-rw-r--r--drivers/thermal/thermal_sysfs.c29
-rw-r--r--drivers/thermal/uniphier_thermal.c384
-rw-r--r--drivers/thermal/zx2967_thermal.c2
-rw-r--r--drivers/tty/Kconfig5
-rw-r--r--drivers/tty/Makefile1
-rw-r--r--drivers/tty/mxser.c16
-rw-r--r--drivers/tty/serial/bcm63xx_uart.c5
-rw-r--r--drivers/tty/serial/fsl_lpuart.c40
-rw-r--r--drivers/tty/serial/pch_uart.c2
-rw-r--r--drivers/tty/serial/sccnxp.c13
-rw-r--r--drivers/tty/vcc.c1155
-rw-r--r--drivers/usb/class/cdc-wdm.c4
-rw-r--r--drivers/usb/core/config.c16
-rw-r--r--drivers/usb/core/devio.c11
-rw-r--r--drivers/usb/core/hub.c2
-rw-r--r--drivers/usb/core/message.c4
-rw-r--r--drivers/usb/dwc3/dwc3-of-simple.c1
-rw-r--r--drivers/usb/dwc3/ep0.c7
-rw-r--r--drivers/usb/gadget/function/f_fs.c17
-rw-r--r--drivers/usb/gadget/function/f_mass_storage.c48
-rw-r--r--drivers/usb/gadget/function/f_mass_storage.h14
-rw-r--r--drivers/usb/gadget/function/f_printer.c7
-rw-r--r--drivers/usb/gadget/function/u_fs.h1
-rw-r--r--drivers/usb/gadget/legacy/inode.c46
-rw-r--r--drivers/usb/gadget/legacy/mass_storage.c26
-rw-r--r--drivers/usb/gadget/udc/Kconfig1
-rw-r--r--drivers/usb/gadget/udc/atmel_usba_udc.c4
-rw-r--r--drivers/usb/gadget/udc/core.c3
-rw-r--r--drivers/usb/gadget/udc/dummy_hcd.c65
-rw-r--r--drivers/usb/gadget/udc/renesas_usb3.c19
-rw-r--r--drivers/usb/host/ohci-sm501.c7
-rw-r--r--drivers/usb/host/ohci-tmio.c9
-rw-r--r--drivers/usb/host/pci-quirks.c10
-rw-r--r--drivers/usb/host/xhci-hub.c14
-rw-r--r--drivers/usb/host/xhci-pci.c12
-rw-r--r--drivers/usb/host/xhci-plat.c16
-rw-r--r--drivers/usb/host/xhci.c3
-rw-r--r--drivers/usb/host/xhci.h10
-rw-r--r--drivers/usb/renesas_usbhs/fifo.c21
-rw-r--r--drivers/usb/storage/transport.c14
-rw-r--r--drivers/usb/storage/uas-detect.h15
-rw-r--r--drivers/usb/storage/uas.c10
-rw-r--r--drivers/usb/storage/unusual_devs.h7
-rw-r--r--drivers/uwb/hwa-rc.c2
-rw-r--r--drivers/uwb/uwbd.c12
-rw-r--r--drivers/vfio/platform/vfio_amba.c2
-rw-r--r--drivers/vfio/vfio.c25
-rw-r--r--drivers/vfio/vfio_iommu_type1.c16
-rw-r--r--drivers/video/backlight/kb3886_bl.c2
-rw-r--r--drivers/video/console/Kconfig2
-rw-r--r--drivers/video/console/Makefile8
-rw-r--r--drivers/video/console/vgacon.c5
-rw-r--r--drivers/video/fbdev/68328fb.c2
-rw-r--r--drivers/video/fbdev/Kconfig2
-rw-r--r--drivers/video/fbdev/amba-clcd.c2
-rw-r--r--drivers/video/fbdev/arkfb.c2
-rw-r--r--drivers/video/fbdev/asiliantfb.c2
-rw-r--r--drivers/video/fbdev/atmel_lcdfb.c2
-rw-r--r--drivers/video/fbdev/aty/aty128fb.c4
-rw-r--r--drivers/video/fbdev/aty/atyfb_base.c6
-rw-r--r--drivers/video/fbdev/aty/radeon_base.c6
-rw-r--r--drivers/video/fbdev/bfin-lq035q1-fb.c2
-rw-r--r--drivers/video/fbdev/bw2.c4
-rw-r--r--drivers/video/fbdev/cg14.c4
-rw-r--r--drivers/video/fbdev/cg3.c4
-rw-r--r--drivers/video/fbdev/cg6.c4
-rw-r--r--drivers/video/fbdev/chipsfb.c4
-rw-r--r--drivers/video/fbdev/cobalt_lcdfb.c2
-rw-r--r--drivers/video/fbdev/core/Makefile14
-rw-r--r--drivers/video/fbdev/core/bitblit.c (renamed from drivers/video/console/bitblit.c)8
-rw-r--r--drivers/video/fbdev/core/fbcon.c (renamed from drivers/video/console/fbcon.c)37
-rw-r--r--drivers/video/fbdev/core/fbcon.h (renamed from drivers/video/console/fbcon.h)9
-rw-r--r--drivers/video/fbdev/core/fbcon_ccw.c (renamed from drivers/video/console/fbcon_ccw.c)8
-rw-r--r--drivers/video/fbdev/core/fbcon_cw.c (renamed from drivers/video/console/fbcon_cw.c)8
-rw-r--r--drivers/video/fbdev/core/fbcon_dmi_quirks.c145
-rw-r--r--drivers/video/fbdev/core/fbcon_rotate.c (renamed from drivers/video/console/fbcon_rotate.c)4
-rw-r--r--drivers/video/fbdev/core/fbcon_rotate.h (renamed from drivers/video/console/fbcon_rotate.h)0
-rw-r--r--drivers/video/fbdev/core/fbcon_ud.c (renamed from drivers/video/console/fbcon_ud.c)8
-rw-r--r--drivers/video/fbdev/core/fbmem.c12
-rw-r--r--drivers/video/fbdev/core/fbmon.c4
-rw-r--r--drivers/video/fbdev/core/softcursor.c (renamed from drivers/video/console/softcursor.c)4
-rw-r--r--drivers/video/fbdev/core/tileblit.c (renamed from drivers/video/console/tileblit.c)7
-rw-r--r--drivers/video/fbdev/cyber2000fb.c2
-rw-r--r--drivers/video/fbdev/da8xx-fb.c2
-rw-r--r--drivers/video/fbdev/dnfb.c2
-rw-r--r--drivers/video/fbdev/fb-puv3.c2
-rw-r--r--drivers/video/fbdev/ffb.c4
-rw-r--r--drivers/video/fbdev/fm2fb.c2
-rw-r--r--drivers/video/fbdev/geode/gxfb_core.c2
-rw-r--r--drivers/video/fbdev/grvga.c2
-rw-r--r--drivers/video/fbdev/i810/i810_main.c4
-rw-r--r--drivers/video/fbdev/imsttfb.c2
-rw-r--r--drivers/video/fbdev/intelfb/intelfbdrv.c2
-rw-r--r--drivers/video/fbdev/kyro/fbdev.c2
-rw-r--r--drivers/video/fbdev/leo.c4
-rw-r--r--drivers/video/fbdev/matrox/matroxfb_base.c14
-rw-r--r--drivers/video/fbdev/maxinefb.c2
-rw-r--r--drivers/video/fbdev/mb862xx/mb862xxfbdrv.c2
-rw-r--r--drivers/video/fbdev/mbx/mbxfb.c4
-rw-r--r--drivers/video/fbdev/neofb.c2
-rw-r--r--drivers/video/fbdev/nvidia/nvidia.c2
-rw-r--r--drivers/video/fbdev/offb.c10
-rw-r--r--drivers/video/fbdev/omap/lcd_mipid.c2
-rw-r--r--drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c2
-rw-r--r--drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c2
-rw-r--r--drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c2
-rw-r--r--drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c2
-rw-r--r--drivers/video/fbdev/omap2/omapfb/dss/dss-of.c3
-rw-r--r--drivers/video/fbdev/p9100.c4
-rw-r--r--drivers/video/fbdev/pm2fb.c2
-rw-r--r--drivers/video/fbdev/pm3fb.c2
-rw-r--r--drivers/video/fbdev/pmag-aa-fb.c4
-rw-r--r--drivers/video/fbdev/pmag-ba-fb.c4
-rw-r--r--drivers/video/fbdev/pmagb-b-fb.c4
-rw-r--r--drivers/video/fbdev/ps3fb.c2
-rw-r--r--drivers/video/fbdev/pvr2fb.c4
-rw-r--r--drivers/video/fbdev/pxa3xx-gcu.c4
-rw-r--r--drivers/video/fbdev/q40fb.c2
-rw-r--r--drivers/video/fbdev/riva/fbdev.c2
-rw-r--r--drivers/video/fbdev/s3fb.c2
-rw-r--r--drivers/video/fbdev/savage/savagefb_driver.c2
-rw-r--r--drivers/video/fbdev/sis/init301.c15
-rw-r--r--drivers/video/fbdev/skeletonfb.c4
-rw-r--r--drivers/video/fbdev/sm501fb.c2
-rw-r--r--drivers/video/fbdev/sm712fb.c17
-rw-r--r--drivers/video/fbdev/smscufx.c2
-rw-r--r--drivers/video/fbdev/sunxvr1000.c10
-rw-r--r--drivers/video/fbdev/sunxvr2500.c2
-rw-r--r--drivers/video/fbdev/sunxvr500.c2
-rw-r--r--drivers/video/fbdev/tcx.c4
-rw-r--r--drivers/video/fbdev/tdfxfb.c2
-rw-r--r--drivers/video/fbdev/tridentfb.c2
-rw-r--r--drivers/video/fbdev/udlfb.c5
-rw-r--r--drivers/video/fbdev/uvesafb.c2
-rw-r--r--drivers/video/fbdev/vermilion/vermilion.c4
-rw-r--r--drivers/video/fbdev/via/via-core.c2
-rw-r--r--drivers/video/fbdev/vt8623fb.c4
-rw-r--r--drivers/video/fbdev/xilinxfb.c62
-rw-r--r--drivers/video/of_display_timing.c41
-rw-r--r--drivers/video/of_videomode.c2
-rw-r--r--drivers/w1/slaves/Kconfig6
-rw-r--r--drivers/w1/slaves/Makefile1
-rw-r--r--drivers/w1/slaves/w1_bq27000.c117
-rw-r--r--drivers/watchdog/asm9260_wdt.c4
-rw-r--r--drivers/watchdog/aspeed_wdt.c132
-rw-r--r--drivers/watchdog/bcm7038_wdt.c4
-rw-r--r--drivers/watchdog/cadence_wdt.c6
-rw-r--r--drivers/watchdog/coh901327_wdt.c2
-rw-r--r--drivers/watchdog/da9063_wdt.c67
-rw-r--r--drivers/watchdog/diag288_wdt.c2
-rw-r--r--drivers/watchdog/iTCO_wdt.c22
-rw-r--r--drivers/watchdog/it87_wdt.c2
-rw-r--r--drivers/watchdog/lantiq_wdt.c74
-rw-r--r--drivers/watchdog/max77620_wdt.c2
-rw-r--r--drivers/watchdog/mei_wdt.c2
-rw-r--r--drivers/watchdog/meson_wdt.c2
-rw-r--r--drivers/watchdog/mt7621_wdt.c4
-rw-r--r--drivers/watchdog/octeon-wdt-main.c354
-rw-r--r--drivers/watchdog/octeon-wdt-nmi.S42
-rw-r--r--drivers/watchdog/of_xilinx_wdt.c83
-rw-r--r--drivers/watchdog/pcwd_usb.c2
-rw-r--r--drivers/watchdog/qcom-wdt.c2
-rw-r--r--drivers/watchdog/renesas_wdt.c80
-rw-r--r--drivers/watchdog/rt2880_wdt.c4
-rw-r--r--drivers/watchdog/sc1200wdt.c2
-rw-r--r--drivers/watchdog/sp805_wdt.c2
-rw-r--r--drivers/watchdog/stm32_iwdg.c2
-rw-r--r--drivers/watchdog/ts72xx_wdt.c2
-rw-r--r--drivers/watchdog/w83627hf_wdt.c2
-rw-r--r--drivers/watchdog/ziirave_wdt.c2
-rw-r--r--drivers/watchdog/zx2967_wdt.c2
-rw-r--r--drivers/xen/gntalloc.c2
-rw-r--r--drivers/xen/xen-pciback/conf_space_header.c11
-rw-r--r--drivers/xen/xenbus/xenbus_client.c130
-rw-r--r--firmware/3com/typhoon.bin.ihex2819
-rw-r--r--firmware/Makefile179
-rw-r--r--firmware/README.AddingFirmware45
-rw-r--r--firmware/WHENCE854
-rw-r--r--firmware/acenic/tg1.bin.ihex4573
-rw-r--r--firmware/acenic/tg2.bin.ihex4844
-rw-r--r--firmware/adaptec/starfire_rx.bin.ihex53
-rw-r--r--firmware/adaptec/starfire_tx.bin.ihex53
-rw-r--r--firmware/advansys/3550.bin.ihex317
-rw-r--r--firmware/advansys/38C0800.bin.ihex336
-rw-r--r--firmware/advansys/38C1600.bin.ihex398
-rw-r--r--firmware/advansys/mcode.bin.ihex147
-rw-r--r--firmware/atmsar11.HEX204
-rw-r--r--firmware/av7110/Boot.S109
-rw-r--r--firmware/av7110/bootcode.bin.ihex15
-rw-r--r--firmware/bnx2/bnx2-mips-06-6.2.1.fw.ihex5818
-rw-r--r--firmware/bnx2/bnx2-mips-09-6.2.1a.fw.ihex6512
-rw-r--r--firmware/bnx2/bnx2-rv2p-06-6.0.15.fw.ihex366
-rw-r--r--firmware/bnx2/bnx2-rv2p-09-6.0.17.fw.ihex392
-rw-r--r--firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw.ihex425
-rw-r--r--firmware/bnx2x/bnx2x-e1-6.2.9.0.fw.ihex9484
-rw-r--r--firmware/bnx2x/bnx2x-e1h-6.2.9.0.fw.ihex13192
-rw-r--r--firmware/bnx2x/bnx2x-e2-6.2.9.0.fw.ihex15473
-rw-r--r--firmware/cis/.gitignore1
-rw-r--r--firmware/cis/3CCFEM556.cis.ihex13
-rw-r--r--firmware/cis/3CXEM556.cis.ihex13
-rw-r--r--firmware/cis/COMpad2.cis.ihex11
-rw-r--r--firmware/cis/COMpad4.cis.ihex9
-rw-r--r--firmware/cis/DP83903.cis.ihex14
-rw-r--r--firmware/cis/LA-PCM.cis.ihex20
-rw-r--r--firmware/cis/MT5634ZLX.cis.ihex11
-rw-r--r--firmware/cis/NE2K.cis.ihex8
-rw-r--r--firmware/cis/PCMLM28.cis.ihex18
-rw-r--r--firmware/cis/PE-200.cis.ihex9
-rw-r--r--firmware/cis/PE520.cis.ihex9
-rw-r--r--firmware/cis/RS-COM-2P.cis.ihex10
-rw-r--r--firmware/cis/SW_555_SER.cis.ihex12
-rw-r--r--firmware/cis/SW_7xx_SER.cis.ihex13
-rw-r--r--firmware/cis/SW_8xx_SER.cis.ihex13
-rw-r--r--firmware/cis/tamarack.cis.ihex10
-rw-r--r--firmware/cpia2/stv0672_vp4.bin.ihex73
-rw-r--r--firmware/cxgb3/ael2005_opt_edc.bin.ihex69
-rw-r--r--firmware/cxgb3/ael2005_twx_edc.bin.ihex93
-rw-r--r--firmware/cxgb3/ael2020_twx_edc.bin.ihex100
-rw-r--r--firmware/cxgb3/t3b_psram-1.1.0.bin.ihex162
-rw-r--r--firmware/cxgb3/t3c_psram-1.1.0.bin.ihex162
-rw-r--r--firmware/dsp56k/bootstrap.asm98
-rw-r--r--firmware/dsp56k/bootstrap.bin.ihex26
-rw-r--r--firmware/e100/d101m_ucode.bin.ihex38
-rw-r--r--firmware/e100/d101s_ucode.bin.ihex38
-rw-r--r--firmware/e100/d102e_ucode.bin.ihex38
-rw-r--r--firmware/edgeport/boot.H1629
-rw-r--r--firmware/edgeport/boot2.H1628
-rw-r--r--firmware/edgeport/down.H1629
-rw-r--r--firmware/edgeport/down2.H1629
-rw-r--r--firmware/edgeport/down3.bin.ihex815
-rw-r--r--firmware/emi26/bitstream.HEX4391
-rw-r--r--firmware/emi26/firmware.HEX1261
-rw-r--r--firmware/emi26/loader.HEX116
-rw-r--r--firmware/emi62/bitstream.HEX6107
-rw-r--r--firmware/emi62/loader.HEX107
-rw-r--r--firmware/emi62/midi.HEX1266
-rw-r--r--firmware/emi62/spdif.HEX1257
-rw-r--r--firmware/ess/maestro3_assp_kernel.fw.ihex120
-rw-r--r--firmware/ess/maestro3_assp_minisrc.fw.ihex51
-rw-r--r--firmware/ihex2fw.c281
-rw-r--r--firmware/kaweth/new_code.bin.ihex206
-rw-r--r--firmware/kaweth/new_code_fix.bin.ihex40
-rw-r--r--firmware/kaweth/trigger_code.bin.ihex13
-rw-r--r--firmware/kaweth/trigger_code_fix.bin.ihex3
-rw-r--r--firmware/keyspan/mpr.HEX104
-rw-r--r--firmware/keyspan/usa18x.HEX141
-rw-r--r--firmware/keyspan/usa19.HEX101
-rw-r--r--firmware/keyspan/usa19qi.HEX101
-rw-r--r--firmware/keyspan/usa19qw.HEX142
-rw-r--r--firmware/keyspan/usa19w.HEX141
-rw-r--r--firmware/keyspan/usa28.HEX148
-rw-r--r--firmware/keyspan/usa28x.HEX141
-rw-r--r--firmware/keyspan/usa28xa.HEX141
-rw-r--r--firmware/keyspan/usa28xb.HEX142
-rw-r--r--firmware/keyspan/usa49w.HEX145
-rw-r--r--firmware/keyspan/usa49wlc.HEX153
-rw-r--r--firmware/keyspan_pda/keyspan_pda.HEX83
-rw-r--r--firmware/keyspan_pda/keyspan_pda.S1124
-rw-r--r--firmware/keyspan_pda/xircom_pgs.HEX87
-rw-r--r--firmware/keyspan_pda/xircom_pgs.S1192
-rw-r--r--firmware/korg/k1212.dsp.ihex987
-rw-r--r--firmware/matrox/g200_warp.H1628
-rw-r--r--firmware/matrox/g400_warp.H1644
-rw-r--r--firmware/mts_cdma.fw.ihex867
-rw-r--r--firmware/mts_edge.fw.ihex881
-rw-r--r--firmware/mts_gsm.fw.ihex867
-rw-r--r--firmware/myricom/lanai.bin.ihex4771
-rw-r--r--firmware/ositech/Xilinx7OD.bin.ihex177
-rw-r--r--firmware/qlogic/1040.bin.ihex2111
-rw-r--r--firmware/qlogic/12160.bin.ihex1771
-rw-r--r--firmware/qlogic/1280.bin.ihex2008
-rw-r--r--firmware/qlogic/isp1000.bin.ihex1158
-rw-r--r--firmware/qlogic/sd7220.fw.ihex513
-rw-r--r--firmware/r128/r128_cce.bin.ihex129
-rw-r--r--firmware/radeon/R100_cp.bin.ihex130
-rw-r--r--firmware/radeon/R200_cp.bin.ihex130
-rw-r--r--firmware/radeon/R300_cp.bin.ihex130
-rw-r--r--firmware/radeon/R420_cp.bin.ihex130
-rw-r--r--firmware/radeon/R520_cp.bin.ihex130
-rw-r--r--firmware/radeon/R600_me.bin.ihex1345
-rw-r--r--firmware/radeon/R600_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RS600_cp.bin.ihex130
-rw-r--r--firmware/radeon/RS690_cp.bin.ihex130
-rw-r--r--firmware/radeon/RS780_me.bin.ihex1345
-rw-r--r--firmware/radeon/RS780_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV610_me.bin.ihex1345
-rw-r--r--firmware/radeon/RV610_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV620_me.bin.ihex1345
-rw-r--r--firmware/radeon/RV620_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV630_me.bin.ihex1345
-rw-r--r--firmware/radeon/RV630_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV635_me.bin.ihex1345
-rw-r--r--firmware/radeon/RV635_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV670_me.bin.ihex1345
-rw-r--r--firmware/radeon/RV670_pfp.bin.ihex145
-rw-r--r--firmware/radeon/RV710_me.bin.ihex341
-rw-r--r--firmware/radeon/RV710_pfp.bin.ihex213
-rw-r--r--firmware/radeon/RV730_me.bin.ihex341
-rw-r--r--firmware/radeon/RV730_pfp.bin.ihex213
-rw-r--r--firmware/radeon/RV770_me.bin.ihex341
-rw-r--r--firmware/radeon/RV770_pfp.bin.ihex213
-rw-r--r--firmware/sb16/alaw_main.csp.ihex87
-rw-r--r--firmware/sb16/ima_adpcm_capture.csp.ihex121
-rw-r--r--firmware/sb16/ima_adpcm_init.csp.ihex70
-rw-r--r--firmware/sb16/ima_adpcm_playback.csp.ihex122
-rw-r--r--firmware/sb16/mulaw_main.csp.ihex84
-rw-r--r--firmware/sun/cassini.bin.ihex143
-rw-r--r--firmware/tehuti/bdx.bin.ihex2678
-rw-r--r--firmware/ti_3410.fw.ihex862
-rw-r--r--firmware/ti_5052.fw.ihex862
-rw-r--r--firmware/tigon/tg3.bin.ihex175
-rw-r--r--firmware/tigon/tg3_tso.bin.ihex446
-rw-r--r--firmware/tigon/tg3_tso5.bin.ihex252
-rw-r--r--firmware/ttusb-budget/dspbootcode.bin.ihex820
-rw-r--r--firmware/vicam/firmware.H167
-rw-r--r--firmware/whiteheat.HEX1097
-rw-r--r--firmware/whiteheat_loader.HEX314
-rw-r--r--firmware/whiteheat_loader_debug.HEX403
-rw-r--r--firmware/yam/1200.bin.ihex342
-rw-r--r--firmware/yam/9600.bin.ihex342
-rw-r--r--firmware/yamaha/ds1_ctrl.fw.ihex769
-rw-r--r--firmware/yamaha/ds1_dsp.fw.ihex9
-rw-r--r--firmware/yamaha/ds1e_ctrl.fw.ihex769
-rw-r--r--firmware/yamaha/yss225_registers.bin.ihex998
-rw-r--r--fs/affs/amigaffs.c2
-rw-r--r--fs/affs/bitmap.c2
-rw-r--r--fs/affs/super.c6
-rw-r--r--fs/aio.c6
-rw-r--r--fs/autofs4/waitq.c9
-rw-r--r--fs/befs/linuxvfs.c2
-rw-r--r--fs/binfmt_aout.c3
-rw-r--r--fs/binfmt_elf.c23
-rw-r--r--fs/binfmt_elf_fdpic.c17
-rw-r--r--fs/binfmt_flat.c18
-rw-r--r--fs/binfmt_misc.c61
-rw-r--r--fs/binfmt_script.c17
-rw-r--r--fs/block_dev.c5
-rw-r--r--fs/btrfs/Kconfig2
-rw-r--r--fs/btrfs/Makefile2
-rw-r--r--fs/btrfs/compression.c19
-rw-r--r--fs/btrfs/compression.h4
-rw-r--r--fs/btrfs/ctree.h2
-rw-r--r--fs/btrfs/dev-replace.c2
-rw-r--r--fs/btrfs/disk-io.c23
-rw-r--r--fs/btrfs/extent_io.c12
-rw-r--r--fs/btrfs/file.c6
-rw-r--r--fs/btrfs/inode.c29
-rw-r--r--fs/btrfs/ioctl.c20
-rw-r--r--fs/btrfs/props.c6
-rw-r--r--fs/btrfs/qgroup.c6
-rw-r--r--fs/btrfs/relocation.c2
-rw-r--r--fs/btrfs/root-tree.c2
-rw-r--r--fs/btrfs/send.c20
-rw-r--r--fs/btrfs/super.c23
-rw-r--r--fs/btrfs/sysfs.c6
-rw-r--r--fs/btrfs/tree-log.c12
-rw-r--r--fs/btrfs/volumes.c6
-rw-r--r--fs/btrfs/zstd.c432
-rw-r--r--fs/cachefiles/bind.c2
-rw-r--r--fs/ceph/addr.c403
-rw-r--r--fs/ceph/cache.c2
-rw-r--r--fs/ceph/caps.c40
-rw-r--r--fs/ceph/debugfs.c2
-rw-r--r--fs/ceph/dir.c6
-rw-r--r--fs/ceph/file.c50
-rw-r--r--fs/ceph/inode.c53
-rw-r--r--fs/ceph/mds_client.c44
-rw-r--r--fs/ceph/mds_client.h3
-rw-r--r--fs/ceph/mdsmap.c6
-rw-r--r--fs/ceph/snap.c37
-rw-r--r--fs/ceph/super.c78
-rw-r--r--fs/ceph/super.h16
-rw-r--r--fs/ceph/xattr.c8
-rw-r--r--fs/cifs/cifs_debug.c9
-rw-r--r--fs/cifs/cifsfs.c4
-rw-r--r--fs/cifs/cifsfs.h2
-rw-r--r--fs/cifs/cifsglob.h6
-rw-r--r--fs/cifs/connect.c32
-rw-r--r--fs/cifs/file.c19
-rw-r--r--fs/cifs/inode.c15
-rw-r--r--fs/cifs/smb2ops.c42
-rw-r--r--fs/cifs/smb2pdu.c111
-rw-r--r--fs/cifs/smb2pdu.h2
-rw-r--r--fs/coda/dir.c5
-rw-r--r--fs/coredump.c2
-rw-r--r--fs/dax.c4
-rw-r--r--fs/direct-io.c49
-rw-r--r--fs/ecryptfs/main.c3
-rw-r--r--fs/ecryptfs/read_write.c4
-rw-r--r--fs/efs/super.c2
-rw-r--r--fs/exec.c32
-rw-r--r--fs/ext2/ext2.h1
-rw-r--r--fs/ext2/inode.c11
-rw-r--r--fs/ext2/super.c17
-rw-r--r--fs/ext4/ext4.h1
-rw-r--r--fs/ext4/ext4_jbd2.c2
-rw-r--r--fs/ext4/file.c8
-rw-r--r--fs/ext4/fsync.c2
-rw-r--r--fs/ext4/ialloc.c2
-rw-r--r--fs/ext4/inode.c11
-rw-r--r--fs/ext4/mmp.c2
-rw-r--r--fs/ext4/super.c57
-rw-r--r--fs/f2fs/acl.c5
-rw-r--r--fs/f2fs/checkpoint.c60
-rw-r--r--fs/f2fs/data.c177
-rw-r--r--fs/f2fs/dir.c7
-rw-r--r--fs/f2fs/f2fs.h285
-rw-r--r--fs/f2fs/file.c360
-rw-r--r--fs/f2fs/gc.c115
-rw-r--r--fs/f2fs/gc.h27
-rw-r--r--fs/f2fs/inline.c142
-rw-r--r--fs/f2fs/inode.c132
-rw-r--r--fs/f2fs/namei.c43
-rw-r--r--fs/f2fs/node.c79
-rw-r--r--fs/f2fs/recovery.c83
-rw-r--r--fs/f2fs/segment.c292
-rw-r--r--fs/f2fs/segment.h47
-rw-r--r--fs/f2fs/super.c433
-rw-r--r--fs/f2fs/sysfs.c251
-rw-r--r--fs/f2fs/xattr.c8
-rw-r--r--fs/fat/fatent.c2
-rw-r--r--fs/fat/inode.c4
-rw-r--r--fs/fat/misc.c2
-rw-r--r--fs/fcntl.c13
-rw-r--r--fs/file_table.c12
-rw-r--r--fs/fscache/object-list.c3
-rw-r--r--fs/fuse/cuse.c4
-rw-r--r--fs/fuse/dev.c13
-rw-r--r--fs/fuse/dir.c30
-rw-r--r--fs/fuse/file.c52
-rw-r--r--fs/fuse/fuse_i.h8
-rw-r--r--fs/gfs2/glock.c14
-rw-r--r--fs/gfs2/glops.c2
-rw-r--r--fs/gfs2/ops_fstype.c4
-rw-r--r--fs/gfs2/quota.c2
-rw-r--r--fs/gfs2/recovery.c2
-rw-r--r--fs/gfs2/super.c4
-rw-r--r--fs/gfs2/sys.c2
-rw-r--r--fs/hfs/mdb.c6
-rw-r--r--fs/hfs/super.c4
-rw-r--r--fs/hfsplus/super.c10
-rw-r--r--fs/hpfs/alloc.c4
-rw-r--r--fs/hpfs/dir.c2
-rw-r--r--fs/hpfs/super.c13
-rw-r--r--fs/inode.c21
-rw-r--r--fs/internal.h2
-rw-r--r--fs/iomap.c43
-rw-r--r--fs/isofs/inode.c4
-rw-r--r--fs/jffs2/fs.c6
-rw-r--r--fs/jffs2/super.c2
-rw-r--r--fs/jffs2/wbuf.c6
-rw-r--r--fs/jfs/jfs_mount.c2
-rw-r--r--fs/jfs/super.c16
-rw-r--r--fs/lockd/clntlock.c6
-rw-r--r--fs/minix/inode.c6
-rw-r--r--fs/namei.c3
-rw-r--r--fs/namespace.c134
-rw-r--r--fs/nfs/callback_proc.c2
-rw-r--r--fs/nfs/delegation.c2
-rw-r--r--fs/nfs/dir.c4
-rw-r--r--fs/nfs/direct.c4
-rw-r--r--fs/nfs/file.c33
-rw-r--r--fs/nfs/inode.c10
-rw-r--r--fs/nfs/internal.h8
-rw-r--r--fs/nfs/nfs4_fs.h11
-rw-r--r--fs/nfs/nfs4proc.c274
-rw-r--r--fs/nfs/nfstrace.h248
-rw-r--r--fs/nfs/pagelist.c174
-rw-r--r--fs/nfs/pnfs.c57
-rw-r--r--fs/nfs/pnfs.h2
-rw-r--r--fs/nfs/pnfs_nfs.c44
-rw-r--r--fs/nfs/read.c6
-rw-r--r--fs/nfs/super.c14
-rw-r--r--fs/nfs/write.c465
-rw-r--r--fs/nilfs2/inode.c4
-rw-r--r--fs/nilfs2/mdt.c2
-rw-r--r--fs/nilfs2/super.c19
-rw-r--r--fs/ntfs/super.c31
-rw-r--r--fs/ocfs2/super.c15
-rw-r--r--fs/open.c8
-rw-r--r--fs/orangefs/acl.c63
-rw-r--r--fs/orangefs/devorangefs-req.c9
-rw-r--r--fs/orangefs/file.c5
-rw-r--r--fs/orangefs/orangefs-bufmap.c10
-rw-r--r--fs/orangefs/orangefs-debugfs.c5
-rw-r--r--fs/orangefs/orangefs-mod.c1
-rw-r--r--fs/orangefs/super.c4
-rw-r--r--fs/orangefs/xattr.c12
-rw-r--r--fs/overlayfs/copy_up.c2
-rw-r--r--fs/overlayfs/dir.c13
-rw-r--r--fs/overlayfs/inode.c14
-rw-r--r--fs/overlayfs/namei.c12
-rw-r--r--fs/overlayfs/overlayfs.h8
-rw-r--r--fs/overlayfs/readdir.c383
-rw-r--r--fs/overlayfs/super.c13
-rw-r--r--fs/overlayfs/util.c24
-rw-r--r--fs/proc/array.c44
-rw-r--r--fs/proc/base.c8
-rw-r--r--fs/proc/task_mmu.c2
-rw-r--r--fs/proc/task_nommu.c1
-rw-r--r--fs/proc_namespace.c2
-rw-r--r--fs/quota/dquot.c2
-rw-r--r--fs/quota/quota.c2
-rw-r--r--fs/quota/quota_v2.c4
-rw-r--r--fs/read_write.c47
-rw-r--r--fs/reiserfs/inode.c2
-rw-r--r--fs/reiserfs/journal.c2
-rw-r--r--fs/reiserfs/prints.c2
-rw-r--r--fs/reiserfs/super.c18
-rw-r--r--fs/signalfd.c22
-rw-r--r--fs/splice.c16
-rw-r--r--fs/squashfs/Kconfig14
-rw-r--r--fs/squashfs/Makefile1
-rw-r--r--fs/squashfs/decompressor.c7
-rw-r--r--fs/squashfs/decompressor.h4
-rw-r--r--fs/squashfs/squashfs_fs.h1
-rw-r--r--fs/squashfs/zstd_wrapper.c151
-rw-r--r--fs/super.c74
-rw-r--r--fs/sync.c6
-rw-r--r--fs/sysv/balloc.c2
-rw-r--r--fs/sysv/ialloc.c2
-rw-r--r--fs/sysv/inode.c2
-rw-r--r--fs/sysv/super.c2
-rw-r--r--fs/ubifs/super.c2
-rw-r--r--fs/udf/super.c14
-rw-r--r--fs/ufs/super.c24
-rw-r--r--fs/userfaultfd.c66
-rw-r--r--fs/utimes.c23
-rw-r--r--fs/xattr.c17
-rw-r--r--fs/xfs/libxfs/xfs_ag_resv.c12
-rw-r--r--fs/xfs/libxfs/xfs_bmap.c17
-rw-r--r--fs/xfs/xfs_aops.c16
-rw-r--r--fs/xfs/xfs_aops.h1
-rw-r--r--fs/xfs/xfs_bmap_util.c14
-rw-r--r--fs/xfs/xfs_buf.c6
-rw-r--r--fs/xfs/xfs_buf.h3
-rw-r--r--fs/xfs/xfs_error.c2
-rw-r--r--fs/xfs/xfs_file.c50
-rw-r--r--fs/xfs/xfs_inode.c8
-rw-r--r--fs/xfs/xfs_inode_item.c2
-rw-r--r--fs/xfs/xfs_ioctl.c3
-rw-r--r--fs/xfs/xfs_iomap.c17
-rw-r--r--fs/xfs/xfs_iomap.h2
-rw-r--r--fs/xfs/xfs_linux.h9
-rw-r--r--fs/xfs/xfs_pnfs.c2
-rw-r--r--fs/xfs/xfs_quotaops.c10
-rw-r--r--fs/xfs/xfs_super.c37
-rw-r--r--include/acpi/acpi_bus.h18
-rw-r--r--include/asm-generic/percpu.h24
-rw-r--r--include/asm-generic/uaccess.h8
-rw-r--r--include/asm-generic/vmlinux.lds.h1
-rw-r--r--include/dt-bindings/clock/gxbb-aoclkc.h1
-rw-r--r--include/dt-bindings/clock/gxbb-clkc.h63
-rw-r--r--include/dt-bindings/clock/meson8b-clkc.h70
-rw-r--r--include/dt-bindings/clock/qcom,gcc-msm8996.h2
-rw-r--r--include/dt-bindings/clock/r8a77995-cpg-mssr.h57
-rw-r--r--include/dt-bindings/clock/rk3228-cru.h1
-rw-r--r--include/dt-bindings/clock/rv1108-cru.h125
-rw-r--r--include/dt-bindings/clock/stm32h7-clks.h165
-rw-r--r--include/dt-bindings/clock/sun4i-a10-ccu.h200
-rw-r--r--include/dt-bindings/clock/sun7i-a20-ccu.h53
-rw-r--r--include/dt-bindings/clock/sun8i-r40-ccu.h187
-rw-r--r--include/dt-bindings/genpd/k2g.h90
-rw-r--r--include/dt-bindings/memory/mt8173-larb-port.h4
-rw-r--r--include/dt-bindings/mfd/stm32h7-rcc.h136
-rw-r--r--include/dt-bindings/mips/lantiq_rcu_gphy.h15
-rw-r--r--include/dt-bindings/pinctrl/dra.h3
-rw-r--r--include/dt-bindings/power/mt7622-power.h22
-rw-r--r--include/dt-bindings/power/r8a77995-sysc.h23
-rw-r--r--include/dt-bindings/power/rk3366-power.h24
-rw-r--r--include/dt-bindings/reset/amlogic,meson8b-clkc-reset.h27
-rw-r--r--include/dt-bindings/reset/snps,hsdk-reset.h17
-rw-r--r--include/dt-bindings/reset/sun4i-a10-ccu.h69
-rw-r--r--include/dt-bindings/reset/sun8i-r40-ccu.h130
-rw-r--r--include/linux/audit.h12
-rw-r--r--include/linux/binfmts.h2
-rw-r--r--include/linux/bitfield.h2
-rw-r--r--include/linux/blkdev.h1
-rw-r--r--include/linux/capability.h2
-rw-r--r--include/linux/ceph/ceph_fs.h6
-rw-r--r--include/linux/ceph/libceph.h11
-rw-r--r--include/linux/ceph/mon_client.h4
-rw-r--r--include/linux/ceph/rados.h1
-rw-r--r--include/linux/clk-provider.h4
-rw-r--r--include/linux/clk/at91_pmc.h25
-rw-r--r--include/linux/compat.h9
-rw-r--r--include/linux/cper.h94
-rw-r--r--include/linux/cpuhotplug.h21
-rw-r--r--include/linux/cpuset.h6
-rw-r--r--include/linux/dax.h11
-rw-r--r--include/linux/dcache.h14
-rw-r--r--include/linux/device-mapper.h7
-rw-r--r--include/linux/device.h4
-rw-r--r--include/linux/dma-mapping.h28
-rw-r--r--include/linux/efi.h4
-rw-r--r--include/linux/f2fs_fs.h40
-rw-r--r--include/linux/fb.h10
-rw-r--r--include/linux/fbcon.h12
-rw-r--r--include/linux/fs.h69
-rw-r--r--include/linux/gfp.h2
-rw-r--r--include/linux/i2c-mux-pinctrl.h41
-rw-r--r--include/linux/i2c/bfin_twi.h145
-rw-r--r--include/linux/iio/adc/ad_sigma_delta.h3
-rw-r--r--include/linux/input.h1
-rw-r--r--include/linux/iommu.h57
-rw-r--r--include/linux/iova.h67
-rw-r--r--include/linux/irq.h5
-rw-r--r--include/linux/irqchip/mips-gic.h297
-rw-r--r--include/linux/key.h2
-rw-r--r--include/linux/libnvdimm.h16
-rw-r--r--include/linux/lsm_audit.h2
-rw-r--r--include/linux/lsm_hooks.h7
-rw-r--r--include/linux/mem_encrypt.h13
-rw-r--r--include/linux/mfd/tmio.h1
-rw-r--r--include/linux/mlx5/device.h5
-rw-r--r--include/linux/mlx5/driver.h1
-rw-r--r--include/linux/mlx5/mlx5_ifc.h3
-rw-r--r--include/linux/mm.h2
-rw-r--r--include/linux/mmu_notifier.h5
-rw-r--r--include/linux/mmzone.h10
-rw-r--r--include/linux/module.h2
-rw-r--r--include/linux/msg.h15
-rw-r--r--include/linux/mtd/mtd.h10
-rw-r--r--include/linux/mtd/nand-gpio.h2
-rw-r--r--include/linux/mtd/rawnand.h (renamed from include/linux/mtd/nand.h)30
-rw-r--r--include/linux/mtd/sh_flctl.h2
-rw-r--r--include/linux/mtd/sharpsl.h3
-rw-r--r--include/linux/mtd/spi-nor.h11
-rw-r--r--include/linux/mtd/xip.h10
-rw-r--r--include/linux/nfs_fs.h6
-rw-r--r--include/linux/nfs_page.h6
-rw-r--r--include/linux/nfs_xdr.h2
-rw-r--r--include/linux/nvme-fc-driver.h13
-rw-r--r--include/linux/nvme.h23
-rw-r--r--include/linux/of_platform.h7
-rw-r--r--include/linux/pci.h2
-rw-r--r--include/linux/platform_data/hsmmc-omap.h3
-rw-r--r--include/linux/platform_data/mtd-davinci.h2
-rw-r--r--include/linux/platform_data/mtd-nand-s3c2410.h2
-rw-r--r--include/linux/platform_data/pca954x.h (renamed from include/linux/i2c/pca954x.h)0
-rw-r--r--include/linux/platform_data/tc35876x.h (renamed from include/linux/i2c/tc35876x.h)0
-rw-r--r--include/linux/platform_data/x86/mlxcpld.h (renamed from include/linux/i2c/mlxcpld.h)0
-rw-r--r--include/linux/power/bq24190_charger.h18
-rw-r--r--include/linux/power/bq27xxx_battery.h27
-rw-r--r--include/linux/power_supply.h2
-rw-r--r--include/linux/remoteproc.h2
-rw-r--r--include/linux/remoteproc/qcom_rproc.h22
-rw-r--r--include/linux/reset.h68
-rw-r--r--include/linux/rpmsg/qcom_glink.h27
-rw-r--r--include/linux/rtc.h2
-rw-r--r--include/linux/sched.h64
-rw-r--r--include/linux/sched/mm.h6
-rw-r--r--include/linux/seccomp.h3
-rw-r--r--include/linux/security.h8
-rw-r--r--include/linux/sem.h3
-rw-r--r--include/linux/shm.h6
-rw-r--r--include/linux/signal.h22
-rw-r--r--include/linux/soc/mediatek/infracfg.h7
-rw-r--r--include/linux/string.h15
-rw-r--r--include/linux/sunrpc/sched.h2
-rw-r--r--include/linux/sunrpc/xdr.h13
-rw-r--r--include/linux/sunrpc/xprt.h5
-rw-r--r--include/linux/swait.h58
-rw-r--r--include/linux/syscalls.h14
-rw-r--r--include/linux/tee_drv.h1
-rw-r--r--include/linux/thermal.h1
-rw-r--r--include/linux/time.h2
-rw-r--r--include/linux/timer.h14
-rw-r--r--include/linux/trace_events.h1
-rw-r--r--include/linux/user_namespace.h9
-rw-r--r--include/linux/wait.h3
-rw-r--r--include/linux/xxhash.h236
-rw-r--r--include/linux/zstd.h1157
-rw-r--r--include/net/act_api.h2
-rw-r--r--include/net/dst.h22
-rw-r--r--include/net/netlink.h73
-rw-r--r--include/net/protocol.h4
-rw-r--r--include/net/route.h6
-rw-r--r--include/net/sctp/sctp.h3
-rw-r--r--include/net/sctp/ulpevent.h6
-rw-r--r--include/net/sock.h2
-rw-r--r--include/net/tcp.h3
-rw-r--r--include/net/udp.h2
-rw-r--r--include/rdma/ib_verbs.h6
-rw-r--r--include/scsi/scsi_host.h6
-rw-r--r--include/soc/mediatek/smi.h2
-rw-r--r--include/soc/tegra/fuse.h2
-rw-r--r--include/sound/hda_verbs.h1
-rw-r--r--include/trace/events/block.h5
-rw-r--r--include/trace/events/f2fs.h113
-rw-r--r--include/trace/events/kvm.h4
-rw-r--r--include/trace/events/mmflags.h1
-rw-r--r--include/trace/events/sched.h19
-rw-r--r--include/trace/events/xdp.h4
-rw-r--r--include/uapi/asm-generic/siginfo.h115
-rw-r--r--include/uapi/linux/bpf.h2
-rw-r--r--include/uapi/linux/btrfs.h8
-rw-r--r--include/uapi/linux/capability.h22
-rw-r--r--include/uapi/linux/dm-ioctl.h4
-rw-r--r--include/uapi/linux/ethtool.h6
-rw-r--r--include/uapi/linux/kfd_ioctl.h172
-rw-r--r--include/uapi/linux/seccomp.h23
-rw-r--r--include/uapi/linux/tee.h1
-rw-r--r--include/uapi/linux/usb/ch9.h1
-rw-r--r--include/uapi/rdma/ib_user_verbs.h2
-rw-r--r--include/xen/arm/page.h10
-rw-r--r--init/do_mounts.c6
-rw-r--r--init/initramfs.c2
-rw-r--r--ipc/compat.c740
-rw-r--r--ipc/mqueue.c28
-rw-r--r--ipc/msg.c366
-rw-r--r--ipc/sem.c344
-rw-r--r--ipc/shm.c533
-rw-r--r--ipc/syscall.c90
-rw-r--r--ipc/util.h30
-rw-r--r--kernel/acct.c2
-rw-r--r--kernel/audit.h2
-rw-r--r--kernel/auditsc.c12
-rw-r--r--kernel/bpf/core.c2
-rw-r--r--kernel/bpf/devmap.c6
-rw-r--r--kernel/bpf/syscall.c6
-rw-r--r--kernel/bpf/verifier.c15
-rw-r--r--kernel/cgroup/cgroup.c8
-rw-r--r--kernel/cgroup/cpuset.c16
-rw-r--r--kernel/compat.c23
-rw-r--r--kernel/cpu.c506
-rw-r--r--kernel/events/core.c3
-rw-r--r--kernel/events/ring_buffer.c20
-rw-r--r--kernel/exit.c27
-rw-r--r--kernel/extable.c45
-rw-r--r--kernel/fork.c22
-rw-r--r--kernel/futex.c33
-rw-r--r--kernel/irq/chip.c2
-rw-r--r--kernel/irq/generic-chip.c1
-rw-r--r--kernel/irq/irqdesc.c24
-rw-r--r--kernel/irq/irqdomain.c4
-rw-r--r--kernel/irq/manage.c4
-rw-r--r--kernel/irq/msi.c5
-rw-r--r--kernel/kcmp.c2
-rw-r--r--kernel/locking/rwsem-xadd.c27
-rw-r--r--kernel/locking/test-ww_mutex.c2
-rw-r--r--kernel/memremap.c4
-rw-r--r--kernel/module.c12
-rw-r--r--kernel/params.c35
-rw-r--r--kernel/pid_namespace.c4
-rw-r--r--kernel/power/process.c5
-rw-r--r--kernel/power/suspend.c18
-rw-r--r--kernel/ptrace.c6
-rw-r--r--kernel/rcu/tree.c10
-rw-r--r--kernel/sched/core.c35
-rw-r--r--kernel/sched/debug.c7
-rw-r--r--kernel/sched/fair.c17
-rw-r--r--kernel/sched/sched.h2
-rw-r--r--kernel/sched/topology.c4
-rw-r--r--kernel/sched/wait.c85
-rw-r--r--kernel/seccomp.c344
-rw-r--r--kernel/signal.c72
-rw-r--r--kernel/sys.c8
-rw-r--r--kernel/sysctl.c5
-rw-r--r--kernel/sysctl_binary.c21
-rw-r--r--kernel/trace/blktrace.c18
-rw-r--r--kernel/trace/ftrace.c14
-rw-r--r--kernel/trace/trace.c19
-rw-r--r--kernel/trace/trace.h2
-rw-r--r--kernel/trace/trace_events_filter.c2
-rw-r--r--kernel/trace/trace_mmiotrace.c1
-rw-r--r--kernel/trace/trace_output.c21
-rw-r--r--kernel/trace/trace_sched_wakeup.c8
-rw-r--r--kernel/trace/trace_stack.c15
-rw-r--r--kernel/trace/trace_syscalls.c2
-rw-r--r--kernel/user_namespace.c20
-rw-r--r--lib/Kconfig14
-rw-r--r--lib/Kconfig.debug3
-rw-r--r--lib/Makefile3
-rw-r--r--lib/idr.c6
-rw-r--r--lib/iov_iter.c6
-rw-r--r--lib/kobject_uevent.c49
-rw-r--r--lib/lz4/lz4_decompress.c4
-rw-r--r--lib/ratelimit.c4
-rw-r--r--lib/rhashtable.c9
-rw-r--r--lib/string_helpers.c4
-rw-r--r--lib/test_bitmap.c8
-rw-r--r--lib/xxhash.c500
-rw-r--r--lib/zstd/Makefile18
-rw-r--r--lib/zstd/bitstream.h374
-rw-r--r--lib/zstd/compress.c3484
-rw-r--r--lib/zstd/decompress.c2528
-rw-r--r--lib/zstd/entropy_common.c243
-rw-r--r--lib/zstd/error_private.h53
-rw-r--r--lib/zstd/fse.h575
-rw-r--r--lib/zstd/fse_compress.c795
-rw-r--r--lib/zstd/fse_decompress.c332
-rw-r--r--lib/zstd/huf.h212
-rw-r--r--lib/zstd/huf_compress.c770
-rw-r--r--lib/zstd/huf_decompress.c960
-rw-r--r--lib/zstd/mem.h151
-rw-r--r--lib/zstd/zstd_common.c75
-rw-r--r--lib/zstd/zstd_internal.h263
-rw-r--r--lib/zstd/zstd_opt.h1014
-rw-r--r--mm/backing-dev.c6
-rw-r--r--mm/compaction.c13
-rw-r--r--mm/filemap.c64
-rw-r--r--mm/ksm.c5
-rw-r--r--mm/list_lru.c12
-rw-r--r--mm/madvise.c12
-rw-r--r--mm/memcontrol.c23
-rw-r--r--mm/memory.c2
-rw-r--r--mm/memory_hotplug.c7
-rw-r--r--mm/nommu.c7
-rw-r--r--mm/oom_kill.c16
-rw-r--r--mm/page_alloc.c3
-rw-r--r--mm/page_owner.c2
-rw-r--r--mm/percpu-stats.c2
-rw-r--r--mm/percpu.c4
-rw-r--r--mm/rodata_test.c2
-rw-r--r--mm/shmem.c2
-rw-r--r--mm/slab_common.c22
-rw-r--r--mm/slub.c2
-rw-r--r--mm/swap.c4
-rw-r--r--mm/swap_state.c11
-rw-r--r--mm/z3fold.c10
-rw-r--r--net/8021q/vlan_core.c6
-rw-r--r--net/9p/trans_fd.c14
-rw-r--r--net/bluetooth/Kconfig10
-rw-r--r--net/bluetooth/hci_sock.c6
-rw-r--r--net/bluetooth/l2cap_core.c80
-rw-r--r--net/ceph/mon_client.c6
-rw-r--r--net/ceph/osd_client.c5
-rw-r--r--net/ceph/osdmap.c35
-rw-r--r--net/compat.c7
-rw-r--r--net/core/dev.c9
-rw-r--r--net/core/ethtool.c2
-rw-r--r--net/core/filter.c66
-rw-r--r--net/core/gen_estimator.c4
-rw-r--r--net/core/rtnetlink.c3
-rw-r--r--net/core/sock.c7
-rw-r--r--net/dsa/slave.c31
-rw-r--r--net/ipv4/gre_offload.c2
-rw-r--r--net/ipv4/inet_connection_sock.c8
-rw-r--r--net/ipv4/inetpeer.c4
-rw-r--r--net/ipv4/ip_gre.c12
-rw-r--r--net/ipv4/ip_input.c25
-rw-r--r--net/ipv4/ip_sockglue.c8
-rw-r--r--net/ipv4/ip_tunnel.c2
-rw-r--r--net/ipv4/ip_vti.c3
-rw-r--r--net/ipv4/route.c48
-rw-r--r--net/ipv4/tcp_ipv4.c9
-rw-r--r--net/ipv4/tcp_output.c67
-rw-r--r--net/ipv4/udp.c24
-rw-r--r--net/ipv4/udp_offload.c2
-rw-r--r--net/ipv6/addrconf.c34
-rw-r--r--net/ipv6/ip6_gre.c22
-rw-r--r--net/ipv6/ip6_offload.c2
-rw-r--r--net/ipv6/ip6_tunnel.c10
-rw-r--r--net/ipv6/ip6_vti.c3
-rw-r--r--net/ipv6/route.c2
-rw-r--r--net/ipv6/seg6_local.c4
-rw-r--r--net/ipv6/udp.c1
-rw-r--r--net/l2tp/l2tp_core.c16
-rw-r--r--net/l2tp/l2tp_core.h6
-rw-r--r--net/l2tp/l2tp_eth.c51
-rw-r--r--net/l2tp/l2tp_ppp.c8
-rw-r--r--net/netfilter/ipset/ip_set_hash_gen.h14
-rw-r--r--net/netfilter/nf_nat_core.c12
-rw-r--r--net/netlink/af_netlink.c7
-rw-r--r--net/openvswitch/datapath.c3
-rw-r--r--net/packet/af_packet.c28
-rw-r--r--net/sched/act_api.c23
-rw-r--r--net/sched/cls_api.c63
-rw-r--r--net/sched/cls_flower.c15
-rw-r--r--net/sched/cls_matchall.c1
-rw-r--r--net/sched/cls_rsvp.h2
-rw-r--r--net/sched/sch_generic.c1
-rw-r--r--net/sched/sch_hfsc.c23
-rw-r--r--net/sctp/sctp_diag.c35
-rw-r--r--net/sctp/socket.c40
-rw-r--r--net/smc/af_smc.c16
-rw-r--r--net/smc/smc.h2
-rw-r--r--net/smc/smc_clc.c10
-rw-r--r--net/smc/smc_clc.h3
-rw-r--r--net/smc/smc_close.c27
-rw-r--r--net/smc/smc_core.c16
-rw-r--r--net/smc/smc_ib.c1
-rw-r--r--net/smc/smc_pnet.c4
-rw-r--r--net/smc/smc_rx.c2
-rw-r--r--net/smc/smc_tx.c12
-rw-r--r--net/smc/smc_wr.c2
-rw-r--r--net/sunrpc/backchannel_rqst.c4
-rw-r--r--net/sunrpc/clnt.c12
-rw-r--r--net/sunrpc/svcsock.c6
-rw-r--r--net/sunrpc/xprt.c57
-rw-r--r--net/sunrpc/xprtrdma/backchannel.c71
-rw-r--r--net/sunrpc/xprtrdma/fmr_ops.c10
-rw-r--r--net/sunrpc/xprtrdma/frwr_ops.c14
-rw-r--r--net/sunrpc/xprtrdma/rpc_rdma.c902
-rw-r--r--net/sunrpc/xprtrdma/svc_rdma_backchannel.c9
-rw-r--r--net/sunrpc/xprtrdma/transport.c8
-rw-r--r--net/sunrpc/xprtrdma/verbs.c22
-rw-r--r--net/sunrpc/xprtrdma/xprt_rdma.h63
-rw-r--r--net/sunrpc/xprtsock.c90
-rw-r--r--net/tipc/bcast.c4
-rw-r--r--net/tipc/msg.c10
-rw-r--r--net/tls/tls_sw.c2
-rw-r--r--net/wireless/nl80211.c6
-rw-r--r--scripts/Makefile.build2
-rw-r--r--scripts/Makefile.extrawarn1
-rw-r--r--scripts/Makefile.fwinst70
-rwxr-xr-xscripts/checkpatch.pl2
-rwxr-xr-xscripts/dtc/dtx_diff22
-rw-r--r--scripts/gdb/linux/Makefile2
-rw-r--r--scripts/mkversion6
-rw-r--r--scripts/mod/modpost.c29
-rw-r--r--scripts/package/Makefile5
-rwxr-xr-xscripts/package/builddeb22
-rwxr-xr-xscripts/package/buildtar36
-rwxr-xr-xscripts/package/mkspec14
-rw-r--r--scripts/selinux/genheaders/genheaders.c7
-rw-r--r--scripts/spelling.txt33
-rwxr-xr-xscripts/sphinx-pre-install1
-rw-r--r--security/apparmor/.gitignore1
-rw-r--r--security/apparmor/Makefile43
-rw-r--r--security/apparmor/apparmorfs.c45
-rw-r--r--security/apparmor/domain.c4
-rw-r--r--security/apparmor/file.c30
-rw-r--r--security/apparmor/include/apparmor.h2
-rw-r--r--security/apparmor/include/audit.h39
-rw-r--r--security/apparmor/include/domain.h5
-rw-r--r--security/apparmor/include/ipc.h6
-rw-r--r--security/apparmor/include/label.h1
-rw-r--r--security/apparmor/include/mount.h54
-rw-r--r--security/apparmor/include/net.h114
-rw-r--r--security/apparmor/include/perms.h5
-rw-r--r--security/apparmor/include/policy.h13
-rw-r--r--security/apparmor/include/sig_names.h98
-rw-r--r--security/apparmor/ipc.c99
-rw-r--r--security/apparmor/label.c36
-rw-r--r--security/apparmor/lib.c5
-rw-r--r--security/apparmor/lsm.c472
-rw-r--r--security/apparmor/mount.c696
-rw-r--r--security/apparmor/net.c184
-rw-r--r--security/apparmor/policy.c166
-rw-r--r--security/apparmor/policy_ns.c2
-rw-r--r--security/apparmor/policy_unpack.c105
-rw-r--r--security/commoncap.c283
-rw-r--r--security/keys/Kconfig4
-rw-r--r--security/keys/big_key.c145
-rw-r--r--security/keys/internal.h2
-rw-r--r--security/keys/key.c6
-rw-r--r--security/keys/keyctl.c13
-rw-r--r--security/keys/keyring.c37
-rw-r--r--security/keys/proc.c8
-rw-r--r--security/keys/process_keys.c6
-rw-r--r--security/keys/request_key_auth.c74
-rw-r--r--security/lsm_audit.c2
-rw-r--r--security/security.c5
-rw-r--r--security/selinux/avc.c16
-rw-r--r--security/selinux/hooks.c54
-rw-r--r--security/selinux/include/avc.h2
-rw-r--r--security/selinux/include/avc_ss.h2
-rw-r--r--security/selinux/include/classmap.h2
-rw-r--r--security/selinux/include/objsec.h2
-rw-r--r--security/selinux/include/security.h4
-rw-r--r--security/selinux/ss/avtab.c2
-rw-r--r--security/selinux/ss/avtab.h2
-rw-r--r--security/selinux/ss/constraint.h2
-rw-r--r--security/selinux/ss/context.h2
-rw-r--r--security/selinux/ss/ebitmap.c2
-rw-r--r--security/selinux/ss/ebitmap.h2
-rw-r--r--security/selinux/ss/hashtab.c2
-rw-r--r--security/selinux/ss/hashtab.h2
-rw-r--r--security/selinux/ss/mls.c2
-rw-r--r--security/selinux/ss/mls.h2
-rw-r--r--security/selinux/ss/mls_types.h2
-rw-r--r--security/selinux/ss/policydb.c2
-rw-r--r--security/selinux/ss/policydb.h2
-rw-r--r--security/selinux/ss/services.c9
-rw-r--r--security/selinux/ss/services.h2
-rw-r--r--security/selinux/ss/sidtab.c2
-rw-r--r--security/selinux/ss/sidtab.h2
-rw-r--r--security/selinux/ss/symtab.c2
-rw-r--r--security/selinux/ss/symtab.h2
-rw-r--r--security/smack/smack_lsm.c55
-rw-r--r--sound/core/compress_offload.c3
-rw-r--r--sound/core/device.c4
-rw-r--r--sound/core/pcm_compat.c1
-rw-r--r--sound/core/seq_device.c3
-rw-r--r--sound/firewire/motu/motu-stream.c16
-rw-r--r--sound/oss/sound_firmware.h2
-rw-r--r--sound/pci/asihpi/asihpi.c6
-rw-r--r--sound/pci/asihpi/hpioctl.c12
-rw-r--r--sound/pci/echoaudio/echoaudio.c6
-rw-r--r--sound/pci/hda/patch_hdmi.c21
-rw-r--r--sound/pci/maestro3.c57
-rw-r--r--sound/pci/rme9652/hdsp.c26
-rw-r--r--sound/pci/rme9652/hdspm.c16
-rw-r--r--sound/pci/ymfpci/ymfpci.c62
-rw-r--r--sound/pci/ymfpci/ymfpci_main.c41
-rw-r--r--sound/soc/atmel/atmel-classd.c47
-rw-r--r--sound/soc/codecs/rt5645.c2
-rw-r--r--sound/usb/6fire/chip.c31
-rw-r--r--sound/usb/card.c20
-rw-r--r--sound/usb/quirks.c2
-rw-r--r--sound/usb/usx2y/us122l.c10
-rw-r--r--sound/usb/usx2y/usb_stream.c24
-rw-r--r--tools/arch/s390/include/uapi/asm/kvm.h6
-rw-r--r--tools/arch/x86/include/asm/cpufeatures.h2
-rw-r--r--tools/arch/x86/include/asm/disabled-features.h4
-rw-r--r--tools/include/asm-generic/hugetlb_encode.h34
-rw-r--r--tools/include/linux/compiler-gcc.h9
-rw-r--r--tools/include/uapi/asm-generic/mman-common.h14
-rw-r--r--tools/include/uapi/drm/drm.h22
-rw-r--r--tools/include/uapi/drm/i915_drm.h51
-rw-r--r--tools/include/uapi/linux/bpf.h32
-rw-r--r--tools/include/uapi/linux/kvm.h3
-rw-r--r--tools/include/uapi/linux/mman.h24
-rw-r--r--tools/include/uapi/linux/perf_event.h4
-rw-r--r--tools/lib/api/Makefile8
-rw-r--r--tools/objtool/Documentation/stack-validation.txt6
-rw-r--r--tools/objtool/arch/x86/decode.c17
-rw-r--r--tools/objtool/check.c43
-rw-r--r--tools/objtool/elf.c33
-rw-r--r--tools/perf/Documentation/intel-pt.txt2
-rw-r--r--tools/perf/Documentation/perf-mem.txt4
-rw-r--r--tools/perf/Documentation/perf-record.txt5
-rw-r--r--tools/perf/Documentation/perf-report.txt1
-rw-r--r--tools/perf/Documentation/perf-script.txt2
-rw-r--r--tools/perf/Documentation/perf-trace.txt2
-rw-r--r--tools/perf/MANIFEST87
-rw-r--r--tools/perf/arch/s390/util/Build1
-rw-r--r--tools/perf/arch/s390/util/sym-handling.c29
-rw-r--r--tools/perf/builtin-config.c2
-rw-r--r--tools/perf/builtin-kmem.c1
-rw-r--r--tools/perf/builtin-mem.c97
-rw-r--r--tools/perf/builtin-record.c2
-rw-r--r--tools/perf/builtin-script.c15
-rw-r--r--tools/perf/builtin-stat.c4
-rw-r--r--tools/perf/builtin-trace.c39
-rw-r--r--tools/perf/perf.c14
-rw-r--r--tools/perf/perf.h1
-rw-r--r--tools/perf/pmu-events/arch/powerpc/power9/frontend.json7
-rw-r--r--tools/perf/pmu-events/arch/powerpc/power9/other.json120
-rw-r--r--tools/perf/pmu-events/arch/powerpc/power9/pipeline.json7
-rw-r--r--tools/perf/pmu-events/arch/powerpc/power9/pmc.json7
-rw-r--r--tools/perf/tests/code-reading.c5
-rw-r--r--tools/perf/tests/dwarf-unwind.c2
-rw-r--r--tools/perf/tests/sample-parsing.c6
-rw-r--r--tools/perf/ui/browsers/annotate.c3
-rw-r--r--tools/perf/ui/browsers/hists.c8
-rw-r--r--tools/perf/ui/progress.c9
-rw-r--r--tools/perf/ui/stdio/hist.c10
-rw-r--r--tools/perf/util/callchain.c84
-rw-r--r--tools/perf/util/callchain.h9
-rw-r--r--tools/perf/util/data.c13
-rw-r--r--tools/perf/util/event.h1
-rw-r--r--tools/perf/util/evsel.c26
-rw-r--r--tools/perf/util/evsel.h1
-rw-r--r--tools/perf/util/hist.c4
-rw-r--r--tools/perf/util/hist.h1
-rw-r--r--tools/perf/util/machine.c96
-rw-r--r--tools/perf/util/parse-events.c24
-rw-r--r--tools/perf/util/session.c3
-rw-r--r--tools/perf/util/sort.c42
-rw-r--r--tools/perf/util/sort.h1
-rw-r--r--tools/perf/util/symbol-elf.c8
-rw-r--r--tools/perf/util/symbol.h4
-rw-r--r--tools/perf/util/syscalltbl.c35
-rw-r--r--tools/perf/util/syscalltbl.h3
-rw-r--r--tools/power/cpupower/Makefile2
-rw-r--r--tools/scripts/Makefile.include6
-rw-r--r--tools/testing/nvdimm/test/nfit.c7
-rw-r--r--tools/testing/selftests/Makefile18
-rw-r--r--tools/testing/selftests/bpf/bpf_util.h17
-rw-r--r--tools/testing/selftests/bpf/test_verifier.c16
-rw-r--r--tools/testing/selftests/breakpoints/Makefile8
-rw-r--r--tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc2
-rw-r--r--tools/testing/selftests/futex/Makefile9
-rw-r--r--tools/testing/selftests/intel_pstate/Makefile2
-rwxr-xr-xtools/testing/selftests/intel_pstate/run.sh11
-rw-r--r--tools/testing/selftests/lib.mk48
-rwxr-xr-x[-rw-r--r--]tools/testing/selftests/memfd/run_tests.sh0
-rw-r--r--tools/testing/selftests/mqueue/Makefile4
-rw-r--r--tools/testing/selftests/net/.gitignore1
-rw-r--r--tools/testing/selftests/net/Makefile6
-rw-r--r--tools/testing/selftests/net/msg_zerocopy.c2
-rwxr-xr-xtools/testing/selftests/net/netdevice.sh2
-rw-r--r--tools/testing/selftests/net/reuseaddr_conflict.c114
-rw-r--r--tools/testing/selftests/networking/timestamping/rxtimestamp.c2
-rw-r--r--tools/testing/selftests/seccomp/Makefile18
-rw-r--r--tools/testing/selftests/seccomp/seccomp_benchmark.c99
-rw-r--r--tools/testing/selftests/seccomp/seccomp_bpf.c628
-rw-r--r--tools/testing/selftests/sigaltstack/sas.c4
-rw-r--r--tools/testing/selftests/sync/Makefile24
-rw-r--r--tools/testing/selftests/timers/set-timer-lat.c13
-rw-r--r--tools/testing/selftests/watchdog/Makefile7
-rw-r--r--tools/testing/selftests/x86/mpx-mini-test.c3
-rw-r--r--tools/testing/selftests/x86/protection_keys.c13
-rw-r--r--virt/kvm/async_pf.c6
-rw-r--r--virt/kvm/kvm_main.c3
3231 files changed, 96774 insertions, 154976 deletions
diff --git a/.mailmap b/.mailmap
index 5273cfd70ad6..c7b10caecc4e 100644
--- a/.mailmap
+++ b/.mailmap
@@ -68,6 +68,8 @@ Jacob Shin <[email protected]>
James Bottomley <jejb@mulgrave.(none)>
James Bottomley <[email protected]>
James E Wilson <[email protected]>
James Ketrenos <jketreno@io.(none)>
diff --git a/CREDITS b/CREDITS
index 0d2d60de5a25..9fbd2c77b546 100644
--- a/CREDITS
+++ b/CREDITS
@@ -2606,11 +2606,9 @@ E: [email protected]
D: bug fixes, documentation, minor hackery
N: Paul Moore
-D: NetLabel author
-S: Hewlett-Packard
-S: 110 Spit Brook Road
-S: Nashua, NH 03062
+W: http://www.paul-moore.com
+D: NetLabel, SELinux, audit
N: James Morris
diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
index 84c606fb3ca4..11b7f4ebea7c 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -57,6 +57,15 @@ Contact: "Jaegeuk Kim" <[email protected]>
Description:
Controls the issue rate of small discard commands.
+What: /sys/fs/f2fs/<disk>/discard_granularity
+Date: July 2017
+Contact: "Chao Yu" <[email protected]>
+Description:
+ Controls discard granularity of inner discard thread, inner thread
+ will not issue discards with size that is smaller than granularity.
+ The unit size is one block, now only support configuring in range
+ of [1, 512].
+
What: /sys/fs/f2fs/<disk>/max_victim_search
Date: January 2014
Contact: "Jaegeuk Kim" <[email protected]>
@@ -130,3 +139,15 @@ Date: June 2017
Contact: "Chao Yu" <[email protected]>
Description:
Controls current reserved blocks in system.
+
+What: /sys/fs/f2fs/<disk>/gc_urgent
+Date: August 2017
+Contact: "Jaegeuk Kim" <[email protected]>
+Description:
+ Do background GC agressively
+
+What: /sys/fs/f2fs/<disk>/gc_urgent_sleep_time
+Date: August 2017
+Contact: "Jaegeuk Kim" <[email protected]>
+Description:
+ Controls sleep time of GC urgent mode
diff --git a/Documentation/ABI/testing/sysfs-power b/Documentation/ABI/testing/sysfs-power
index 713cab1d5f12..a1d1612f3651 100644
--- a/Documentation/ABI/testing/sysfs-power
+++ b/Documentation/ABI/testing/sysfs-power
@@ -127,7 +127,7 @@ Description:
What; /sys/power/pm_trace_dev_match
Date: October 2010
-Contact: James Hogan <[email protected]>
+Contact: James Hogan <[email protected]>
Description:
The /sys/power/pm_trace_dev_match file contains the name of the
device associated with the last PM event point saved in the RTC
diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt
index 45b29326d719..ac66ae2509a9 100644
--- a/Documentation/DMA-API.txt
+++ b/Documentation/DMA-API.txt
@@ -515,14 +515,15 @@ API at all.
::
void *
- dma_alloc_noncoherent(struct device *dev, size_t size,
- dma_addr_t *dma_handle, gfp_t flag)
+ dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
+ gfp_t flag, unsigned long attrs)
-Identical to dma_alloc_coherent() except that the platform will
-choose to return either consistent or non-consistent memory as it sees
-fit. By using this API, you are guaranteeing to the platform that you
-have all the correct and necessary sync points for this memory in the
-driver should it choose to return non-consistent memory.
+Identical to dma_alloc_coherent() except that when the
+DMA_ATTR_NON_CONSISTENT flags is passed in the attrs argument, the
+platform will choose to return either consistent or non-consistent memory
+as it sees fit. By using this API, you are guaranteeing to the platform
+that you have all the correct and necessary sync points for this memory
+in the driver should it choose to return non-consistent memory.
Note: where the platform can return consistent memory, it will
guarantee that the sync points become nops.
@@ -535,12 +536,13 @@ that simply cannot make consistent memory.
::
void
- dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr,
- dma_addr_t dma_handle)
+ dma_free_attrs(struct device *dev, size_t size, void *cpu_addr,
+ dma_addr_t dma_handle, unsigned long attrs)
-Free memory allocated by the nonconsistent API. All parameters must
-be identical to those passed in (and returned by
-dma_alloc_noncoherent()).
+Free memory allocated by the dma_alloc_attrs(). All parameters common
+parameters must identical to those otherwise passed to dma_fre_coherent,
+and the attrs argument must be identical to the attrs passed to
+dma_alloc_attrs().
::
@@ -564,8 +566,8 @@ memory or doing partial flushes.
dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction direction)
-Do a partial sync of memory that was allocated by
-dma_alloc_noncoherent(), starting at virtual address vaddr and
+Do a partial sync of memory that was allocated by dma_alloc_attrs() with
+the DMA_ATTR_NON_CONSISTENT flag starting at virtual address vaddr and
continuing on for size. Again, you *must* observe the cache line
boundaries when doing this.
@@ -590,34 +592,11 @@ size is the size of the area (must be multiples of PAGE_SIZE).
flags can be ORed together and are:
-- DMA_MEMORY_MAP - request that the memory returned from
- dma_alloc_coherent() be directly writable.
-
-- DMA_MEMORY_IO - request that the memory returned from
- dma_alloc_coherent() be addressable using read()/write()/memcpy_toio() etc.
-
-One or both of these flags must be present.
-
-- DMA_MEMORY_INCLUDES_CHILDREN - make the declared memory be allocated by
- dma_alloc_coherent of any child devices of this one (for memory residing
- on a bridge).
-
- DMA_MEMORY_EXCLUSIVE - only allocate memory from the declared regions.
Do not allow dma_alloc_coherent() to fall back to system memory when
it's out of memory in the declared region.
-The return value will be either DMA_MEMORY_MAP or DMA_MEMORY_IO and
-must correspond to a passed in flag (i.e. no returning DMA_MEMORY_IO
-if only DMA_MEMORY_MAP were passed in) for success or zero for
-failure.
-
-Note, for DMA_MEMORY_IO returns, all subsequent memory returned by
-dma_alloc_coherent() may no longer be accessed directly, but instead
-must be accessed using the correct bus functions. If your driver
-isn't prepared to handle this contingency, it should not specify
-DMA_MEMORY_IO in the input flags.
-
-As a simplification for the platforms, only **one** such region of
+As a simplification for the platforms, only *one* such region of
memory may be declared per device.
For reasons of efficiency, most platforms choose to track the declared
diff --git a/Documentation/admin-guide/LSM/tomoyo.rst b/Documentation/admin-guide/LSM/tomoyo.rst
index a5947218fa64..e2d6b6e15082 100644
--- a/Documentation/admin-guide/LSM/tomoyo.rst
+++ b/Documentation/admin-guide/LSM/tomoyo.rst
@@ -9,8 +9,8 @@ TOMOYO is a name-based MAC extension (LSM module) for the Linux kernel.
LiveCD-based tutorials are available at
-http://tomoyo.sourceforge.jp/1.7/1st-step/ubuntu10.04-live/
-http://tomoyo.sourceforge.jp/1.7/1st-step/centos5-live/
+http://tomoyo.sourceforge.jp/1.8/ubuntu12.04-live.html
+http://tomoyo.sourceforge.jp/1.8/centos6-live.html
Though these tutorials use non-LSM version of TOMOYO, they are useful for you
to know what TOMOYO is.
@@ -21,35 +21,35 @@ How to enable TOMOYO?
Build the kernel with ``CONFIG_SECURITY_TOMOYO=y`` and pass ``security=tomoyo`` on
kernel's command line.
-Please see http://tomoyo.sourceforge.jp/2.3/ for details.
+Please see http://tomoyo.osdn.jp/2.5/ for details.
Where is documentation?
=======================
User <-> Kernel interface documentation is available at
-http://tomoyo.sourceforge.jp/2.3/policy-reference.html .
+http://tomoyo.osdn.jp/2.5/policy-specification/index.html .
Materials we prepared for seminars and symposiums are available at
-http://sourceforge.jp/projects/tomoyo/docs/?category_id=532&language_id=1 .
+http://osdn.jp/projects/tomoyo/docs/?category_id=532&language_id=1 .
Below lists are chosen from three aspects.
What is TOMOYO?
TOMOYO Linux Overview
- http://sourceforge.jp/projects/tomoyo/docs/lca2009-takeda.pdf
+ http://osdn.jp/projects/tomoyo/docs/lca2009-takeda.pdf
TOMOYO Linux: pragmatic and manageable security for Linux
- http://sourceforge.jp/projects/tomoyo/docs/freedomhectaipei-tomoyo.pdf
+ http://osdn.jp/projects/tomoyo/docs/freedomhectaipei-tomoyo.pdf
TOMOYO Linux: A Practical Method to Understand and Protect Your Own Linux Box
- http://sourceforge.jp/projects/tomoyo/docs/PacSec2007-en-no-demo.pdf
+ http://osdn.jp/projects/tomoyo/docs/PacSec2007-en-no-demo.pdf
What can TOMOYO do?
Deep inside TOMOYO Linux
- http://sourceforge.jp/projects/tomoyo/docs/lca2009-kumaneko.pdf
+ http://osdn.jp/projects/tomoyo/docs/lca2009-kumaneko.pdf
The role of "pathname based access control" in security.
- http://sourceforge.jp/projects/tomoyo/docs/lfj2008-bof.pdf
+ http://osdn.jp/projects/tomoyo/docs/lfj2008-bof.pdf
History of TOMOYO?
Realities of Mainlining
- http://sourceforge.jp/projects/tomoyo/docs/lfj2008.pdf
+ http://osdn.jp/projects/tomoyo/docs/lfj2008.pdf
What is future plan?
====================
@@ -60,6 +60,6 @@ multiple LSM modules at the same time. We feel sorry that you have to give up
SELinux/SMACK/AppArmor etc. when you want to use TOMOYO.
We hope that LSM becomes stackable in future. Meanwhile, you can use non-LSM
-version of TOMOYO, available at http://tomoyo.sourceforge.jp/1.7/ .
+version of TOMOYO, available at http://tomoyo.osdn.jp/1.8/ .
LSM version of TOMOYO is a subset of non-LSM version of TOMOYO. We are planning
to port non-LSM version's functionalities to LSM versions.
diff --git a/Documentation/conf.py b/Documentation/conf.py
index f9054ab60cb1..63857d33778c 100644
--- a/Documentation/conf.py
+++ b/Documentation/conf.py
@@ -271,10 +271,29 @@ latex_elements = {
# Additional stuff for the LaTeX preamble.
'preamble': '''
- \\usepackage{ifthen}
+ % Use some font with UTF-8 support with XeLaTeX
+ \\usepackage{fontspec}
+ \\setsansfont{DejaVu Serif}
+ \\setromanfont{DejaVu Sans}
+ \\setmonofont{DejaVu Sans Mono}
+
+ '''
+}
+
+# Fix reference escape troubles with Sphinx 1.4.x
+if major == 1 and minor > 3:
+ latex_elements['preamble'] += '\\renewcommand*{\\DUrole}[2]{ #2 }\n'
+
+if major == 1 and minor <= 4:
+ latex_elements['preamble'] += '\\usepackage[margin=0.5in, top=1in, bottom=1in]{geometry}'
+elif major == 1 and (minor > 5 or (minor == 5 and patch >= 3)):
+ latex_elements['sphinxsetup'] = 'hmargin=0.5in, vmargin=1in'
+ latex_elements['preamble'] += '\\fvset{fontsize=auto}\n'
- % Allow generate some pages in landscape
- \\usepackage{lscape}
+# Customize notice background colors on Sphinx < 1.6:
+if major == 1 and minor < 6:
+ latex_elements['preamble'] += '''
+ \\usepackage{ifthen}
% Put notes in color and let them be inside a table
\\definecolor{NoteColor}{RGB}{204,255,255}
@@ -325,27 +344,26 @@ latex_elements = {
}
\\makeatother
- % Use some font with UTF-8 support with XeLaTeX
- \\usepackage{fontspec}
- \\setsansfont{DejaVu Serif}
- \\setromanfont{DejaVu Sans}
- \\setmonofont{DejaVu Sans Mono}
-
- % To allow adjusting table sizes
- \\usepackage{adjustbox}
-
'''
-}
-
-# Fix reference escape troubles with Sphinx 1.4.x
-if major == 1 and minor > 3:
- latex_elements['preamble'] += '\\renewcommand*{\\DUrole}[2]{ #2 }\n'
-if major == 1 and minor <= 4:
- latex_elements['preamble'] += '\\usepackage[margin=0.5in, top=1in, bottom=1in]{geometry}'
-elif major == 1 and (minor > 5 or (minor == 5 and patch >= 3)):
- latex_elements['sphinxsetup'] = 'hmargin=0.5in, vmargin=1in'
- latex_elements['preamble'] += '\\fvset{fontsize=auto}\n'
+# With Sphinx 1.6, it is possible to change the Bg color directly
+# by using:
+# \definecolor{sphinxnoteBgColor}{RGB}{204,255,255}
+# \definecolor{sphinxwarningBgColor}{RGB}{255,204,204}
+# \definecolor{sphinxattentionBgColor}{RGB}{255,255,204}
+# \definecolor{sphinximportantBgColor}{RGB}{192,255,204}
+#
+# However, it require to use sphinx heavy box with:
+#
+# \renewenvironment{sphinxlightbox} {%
+# \\begin{sphinxheavybox}
+# }
+# \\end{sphinxheavybox}
+# }
+#
+# Unfortunately, the implementation is buggy: if a note is inside a
+# table, it isn't displayed well. So, for now, let's use boring
+# black and white notes.
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
diff --git a/Documentation/core-api/workqueue.rst b/Documentation/core-api/workqueue.rst
index 3943b5bfa8cf..00a5ba51e63f 100644
--- a/Documentation/core-api/workqueue.rst
+++ b/Documentation/core-api/workqueue.rst
@@ -39,8 +39,8 @@ up.
Although MT wq wasted a lot of resource, the level of concurrency
provided was unsatisfactory. The limitation was common to both ST and
MT wq albeit less severe on MT. Each wq maintained its own separate
-worker pool. A MT wq could provide only one execution context per CPU
-while a ST wq one for the whole system. Work items had to compete for
+worker pool. An MT wq could provide only one execution context per CPU
+while an ST wq one for the whole system. Work items had to compete for
those very limited execution contexts leading to various problems
including proneness to deadlocks around the single execution context.
@@ -151,7 +151,7 @@ Application Programming Interface (API)
``alloc_workqueue()`` allocates a wq. The original
``create_*workqueue()`` functions are deprecated and scheduled for
-removal. ``alloc_workqueue()`` takes three arguments - @``name``,
+removal. ``alloc_workqueue()`` takes three arguments - ``@name``,
``@flags`` and ``@max_active``. ``@name`` is the name of the wq and
also used as the name of the rescuer thread if there is one.
@@ -197,7 +197,7 @@ resources, scheduled and executed.
served by worker threads with elevated nice level.
Note that normal and highpri worker-pools don't interact with
- each other. Each maintain its separate pool of workers and
+ each other. Each maintains its separate pool of workers and
implements concurrency management among its workers.
``WQ_CPU_INTENSIVE``
@@ -249,8 +249,8 @@ unbound worker-pools and only one work item could be active at any given
time thus achieving the same ordering property as ST wq.
In the current implementation the above configuration only guarantees
-ST behavior within a given NUMA node. Instead alloc_ordered_queue should
-be used to achieve system wide ST behavior.
+ST behavior within a given NUMA node. Instead ``alloc_ordered_queue()`` should
+be used to achieve system-wide ST behavior.
Example Execution Scenarios
diff --git a/Documentation/cpu-freq/index.txt b/Documentation/cpu-freq/index.txt
index 03a7cee6ac73..c15e75386a05 100644
--- a/Documentation/cpu-freq/index.txt
+++ b/Documentation/cpu-freq/index.txt
@@ -32,8 +32,6 @@ cpufreq-stats.txt - General description of sysfs cpufreq stats.
index.txt - File index, Mailing list and Links (this document)
-intel-pstate.txt - Intel pstate cpufreq driver specific file.
-
pcc-cpufreq.txt - PCC cpufreq driver specific file.
diff --git a/Documentation/device-mapper/dm-raid.txt b/Documentation/device-mapper/dm-raid.txt
index 4a0a7469fdd7..32df07e29f68 100644
--- a/Documentation/device-mapper/dm-raid.txt
+++ b/Documentation/device-mapper/dm-raid.txt
@@ -344,3 +344,4 @@ Version History
(wrong raid10_copies/raid10_format sequence)
1.11.1 Add raid4/5/6 journal write-back support via journal_mode option
1.12.1 fix for MD deadlock between mddev_suspend() and md_write_start() available
+1.13.0 Fix dev_health status at end of "recover" (was 'a', now 'A')
diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
index 0fff40a6330d..4e4bc0bae597 100644
--- a/Documentation/devicetree/bindings/arm/amlogic.txt
+++ b/Documentation/devicetree/bindings/arm/amlogic.txt
@@ -1,6 +1,18 @@
Amlogic MesonX device tree bindings
-------------------------------------------
+Work in progress statement:
+
+Device tree files and bindings applying to Amlogic SoCs and boards are
+considered "unstable". Any Amlogic device tree binding may change at
+any time. Be sure to use a device tree binary and a kernel image
+generated from the same source tree.
+
+Please refer to Documentation/devicetree/bindings/ABI.txt for a definition of a
+stable binding/ABI.
+
+---------------------------------------------------------------
+
Boards with the Amlogic Meson6 SoC shall have the following properties:
Required root node property:
compatible: "amlogic,meson6"
@@ -61,3 +73,32 @@ Board compatible values (alphabetically, grouped by SoC):
- "amlogic,q201" (Meson gxm s912)
- "kingnovel,r-box-pro" (Meson gxm S912)
- "nexbox,a1" (Meson gxm s912)
+
+Amlogic Meson Firmware registers Interface
+------------------------------------------
+
+The Meson SoCs have a register bank with status and data shared with the
+secure firmware.
+
+Required properties:
+ - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon"
+
+Properties should indentify components of this register interface :
+
+Meson GX SoC Information
+------------------------
+A firmware register encodes the SoC type, package and revision information on
+the Meson GX SoCs.
+If present, the following property should be added :
+
+Optional properties:
+ - amlogic,has-chip-id: If present, the interface gives the current SoC version.
+
+Example
+-------
+
+ao-secure@140 {
+ compatible = "amlogic,meson-gx-ao-secure", "syscon";
+ reg = <0x0 0x140 0x0 0x140>;
+ amlogic,has-chip-id;
+};
diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
index 9c97de23919a..3e3efa046ac5 100644
--- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
+++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
@@ -42,6 +42,10 @@ Raspberry Pi Zero
Required root node properties:
compatible = "raspberrypi,model-zero", "brcm,bcm2835";
+Raspberry Pi Zero W
+Required root node properties:
+compatible = "raspberrypi,model-zero-w", "brcm,bcm2835";
+
Generic BCM2835 board
Required root node properties:
compatible = "brcm,bcm2835";
diff --git a/Documentation/devicetree/bindings/arm/bhf.txt b/Documentation/devicetree/bindings/arm/bhf.txt
new file mode 100644
index 000000000000..886b503caf9c
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/bhf.txt
@@ -0,0 +1,6 @@
+Beckhoff Automation Platforms Device Tree Bindings
+--------------------------------------------------
+
+CX9020 Embedded PC
+Required root node properties:
+ - compatible = "bhf,cx9020", "fsl,imx53";
diff --git a/Documentation/devicetree/bindings/arm/cpus.txt b/Documentation/devicetree/bindings/arm/cpus.txt
index a44253cad269..b92f12bd5244 100644
--- a/Documentation/devicetree/bindings/arm/cpus.txt
+++ b/Documentation/devicetree/bindings/arm/cpus.txt
@@ -200,6 +200,7 @@ described below.
"arm,realview-smp"
"brcm,bcm11351-cpu-method"
"brcm,bcm23550"
+ "brcm,bcm2836-smp"
"brcm,bcm-nsp-smp"
"brcm,brahma-b15"
"marvell,armada-375-smp"
diff --git a/Documentation/devicetree/bindings/arm/marvell/armada-8kp.txt b/Documentation/devicetree/bindings/arm/marvell/armada-8kp.txt
new file mode 100644
index 000000000000..f3e9624534c6
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/marvell/armada-8kp.txt
@@ -0,0 +1,15 @@
+Marvell Armada 8KPlus Platforms Device Tree Bindings
+----------------------------------------------------
+
+Boards using a SoC of the Marvell Armada 8KP families must carry
+the following root node property:
+
+ - compatible, with one of the following values:
+
+ - "marvell,armada-8080", "marvell,armada-ap810-octa", "marvell,armada-ap810"
+ when the SoC being used is the Armada 8080
+
+Example:
+
+compatible = "marvell,armada-8080-db", "marvell,armada-8080",
+ "marvell,armada-ap810-octa", "marvell,armada-ap810"
diff --git a/Documentation/devicetree/bindings/arm/mediatek.txt b/Documentation/devicetree/bindings/arm/mediatek.txt
index da7bd138e6f2..91d517849483 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.txt
+++ b/Documentation/devicetree/bindings/arm/mediatek.txt
@@ -1,12 +1,12 @@
-MediaTek mt65xx, mt67xx & mt81xx Platforms Device Tree Bindings
+MediaTek SoC based Platforms Device Tree Bindings
-Boards with a MediaTek mt65xx/mt67xx/mt81xx SoC shall have the
-following property:
+Boards with a MediaTek SoC shall have the following property:
Required root node property:
compatible: Must contain one of
"mediatek,mt2701"
+ "mediatek,mt2712"
"mediatek,mt6580"
"mediatek,mt6589"
"mediatek,mt6592"
@@ -14,7 +14,8 @@ compatible: Must contain one of
"mediatek,mt6795"
"mediatek,mt6797"
"mediatek,mt7622"
- "mediatek,mt7623"
+ "mediatek,mt7623" which is referred to MT7623N SoC
+ "mediatek,mt7623a"
"mediatek,mt8127"
"mediatek,mt8135"
"mediatek,mt8173"
@@ -25,6 +26,9 @@ Supported boards:
- Evaluation board for MT2701:
Required root node properties:
- compatible = "mediatek,mt2701-evb", "mediatek,mt2701";
+- Evaluation board for MT2712:
+ Required root node properties:
+ - compatible = "mediatek,mt2712-evb", "mediatek,mt2712";
- Evaluation board for MT6580:
Required root node properties:
- compatible = "mediatek,mt6580-evbp1", "mediatek,mt6580";
@@ -46,9 +50,11 @@ Supported boards:
- Reference board variant 1 for MT7622:
Required root node properties:
- compatible = "mediatek,mt7622-rfb1", "mediatek,mt7622";
-- Evaluation board for MT7623:
+- Reference board for MT7623n with NAND:
Required root node properties:
- - compatible = "mediatek,mt7623-evb", "mediatek,mt7623";
+ - compatible = "mediatek,mt7623n-rfb-nand", "mediatek,mt7623";
+- Bananapi BPI-R2 board:
+ - compatible = "bananapi,bpi-r2", "mediatek,mt7623";
- MTK mt8127 tablet moose EVB:
Required root node properties:
- compatible = "mediatek,mt8127-moose", "mediatek,mt8127";
diff --git a/Documentation/devicetree/bindings/arm/omap/omap.txt b/Documentation/devicetree/bindings/arm/omap/omap.txt
index 8219b2c6bb29..2ecc712bf707 100644
--- a/Documentation/devicetree/bindings/arm/omap/omap.txt
+++ b/Documentation/devicetree/bindings/arm/omap/omap.txt
@@ -80,6 +80,9 @@ SoCs:
- OMAP5432
compatible = "ti,omap5432", "ti,omap5"
+- DRA762
+ compatible = "ti,dra762", "ti,dra7"
+
- DRA742
compatible = "ti,dra742", "ti,dra74", "ti,dra7"
@@ -154,6 +157,9 @@ Boards:
- AM335X phyCORE-AM335x: Development kit
compatible = "phytec,am335x-pcm-953", "phytec,am335x-phycore-som", "ti,am33xx"
+- AM335X UC-8100-ME-T: Communication-centric industrial computing platform
+ compatible = "moxa,uc-8100-me-t", "ti,am33xx";
+
- OMAP5 EVM : Evaluation Module
compatible = "ti,omap5-evm", "ti,omap5"
@@ -184,6 +190,9 @@ Boards:
- AM5718 IDK
compatible = "ti,am5718-idk", "ti,am5718", "ti,dra7"
+- DRA762 EVM: Software Development Board for DRA762
+ compatible = "ti,dra76-evm", "ti,dra762", "ti,dra7"
+
- DRA742 EVM: Software Development Board for DRA742
compatible = "ti,dra7-evm", "ti,dra742", "ti,dra74", "ti,dra7"
diff --git a/Documentation/devicetree/bindings/arm/qcom.txt b/Documentation/devicetree/bindings/arm/qcom.txt
index 028d16e72186..0ed4d39d7fe1 100644
--- a/Documentation/devicetree/bindings/arm/qcom.txt
+++ b/Documentation/devicetree/bindings/arm/qcom.txt
@@ -25,6 +25,7 @@ The 'SoC' element must be one of the following strings:
msm8994
msm8996
mdm9615
+ ipq8074
The 'board' element must be one of the following strings:
@@ -33,6 +34,7 @@ The 'board' element must be one of the following strings:
dragonboard
mtp
sbc
+ hk01
The 'soc_version' and 'board_version' elements take the form of v<Major>.<Minor>
where the minor number may be omitted when it's zero, i.e. v1.0 is the same
diff --git a/Documentation/devicetree/bindings/arm/rockchip.txt b/Documentation/devicetree/bindings/arm/rockchip.txt
index 11c0ac4a2d56..b003148e2945 100644
--- a/Documentation/devicetree/bindings/arm/rockchip.txt
+++ b/Documentation/devicetree/bindings/arm/rockchip.txt
@@ -134,6 +134,10 @@ Rockchip platforms device tree bindings
Required root node properties:
- compatible = "phytec,rk3288-pcm-947", "phytec,rk3288-phycore-som", "rockchip,rk3288";
+- Pine64 Rock64 board:
+ Required root node properties:
+ - compatible = "pine64,rock64", "rockchip,rk3328";
+
- Rockchip PX3 Evaluation board:
Required root node properties:
- compatible = "rockchip,px3-evb", "rockchip,px3", "rockchip,rk3188";
@@ -173,6 +177,14 @@ Rockchip platforms device tree bindings
Required root node properties:
- compatible = "rockchip,rk3399-evb", "rockchip,rk3399";
+- Rockchip RK3399 Sapphire Excavator board:
+ Required root node properties:
+ - compatible = "rockchip,rk3399-sapphire-excavator", "rockchip,rk3399";
+
+- Theobroma Systems RK3399-Q7 Haikou Baseboard:
+ Required root node properties:
+ - compatible = "tsd,rk3399-q7-haikou", "rockchip,rk3399";
+
- Tronsmart Orion R68 Meta
Required root node properties:
- compatible = "tronsmart,orion-r68-meta", "rockchip,rk3368";
diff --git a/Documentation/devicetree/bindings/arm/shmobile.txt b/Documentation/devicetree/bindings/arm/shmobile.txt
index 1a671e329864..ae75cb3b1331 100644
--- a/Documentation/devicetree/bindings/arm/shmobile.txt
+++ b/Documentation/devicetree/bindings/arm/shmobile.txt
@@ -39,6 +39,8 @@ SoCs:
compatible = "renesas,r8a7795"
- R-Car M3-W (R8A77960)
compatible = "renesas,r8a7796"
+ - R-Car D3 (R8A77995)
+ compatible = "renesas,r8a77995"
Boards:
@@ -53,6 +55,8 @@ Boards:
compatible = "renesas,blanche", "renesas,r8a7792"
- BOCK-W
compatible = "renesas,bockw", "renesas,r8a7778"
+ - Draak (RTP0RC77995SEB0010S)
+ compatible = "renesas,draak", "renesas,r8a77995"
- Genmai (RTK772100BC00000BR)
compatible = "renesas,genmai", "renesas,r7s72100"
- GR-Peach (X28A-M01-E/F)
@@ -64,6 +68,10 @@ Boards:
compatible = "renesas,h3ulcb", "renesas,r8a7795";
- Henninger
compatible = "renesas,henninger", "renesas,r8a7791"
+ - iWave Systems RZ/G1E SODIMM SOM Development Platform (iW-RainboW-G22D)
+ compatible = "iwave,g22d", "iwave,g22m", "renesas,r8a7745"
+ - iWave Systems RZ/G1E SODIMM System On Module (iW-RainboW-G22M-SM)
+ compatible = "iwave,g22m", "renesas,r8a7745"
- iWave Systems RZ/G1M Qseven Development Platform (iW-RainboW-G20D-Qseven)
compatible = "iwave,g20d", "iwave,g20m", "renesas,r8a7743"
- iWave Systems RZ/G1M Qseven System On Module (iW-RainboW-G20M-Qseven)
diff --git a/Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt b/Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt
index faa6d8ac5834..786dc39ca904 100644
--- a/Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt
+++ b/Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.txt
@@ -5,9 +5,11 @@ controllers within the Always-On part of the SoC.
Required Properties:
-- compatible: should be "amlogic,gxbb-aoclkc"
-- reg: physical base address of the clock controller and length of memory
- mapped region.
+- compatible: value should be different for each SoC family as :
+ - GXBB (S905) : "amlogic,meson-gxbb-aoclkc"
+ - GXL (S905X, S905D) : "amlogic,meson-gxl-aoclkc"
+ - GXM (S912) : "amlogic,meson-gxm-aoclkc"
+ followed by the common "amlogic,meson-gx-aoclkc"
- #clock-cells: should be 1.
@@ -23,14 +25,22 @@ to specify the reset which they consume. All available resets are defined as
preprocessor macros in the dt-bindings/reset/gxbb-aoclkc.h header and can be
used in device tree sources.
+Parent node should have the following properties :
+- compatible: "amlogic,meson-gx-ao-sysctrl", "syscon", "simple-mfd"
+- reg: base address and size of the AO system control register space.
+
Example: AO Clock controller node:
- clkc_AO: clock-controller@040 {
- compatible = "amlogic,gxbb-aoclkc";
- reg = <0x0 0x040 0x0 0x4>;
+ao_sysctrl: sys-ctrl@0 {
+ compatible = "amlogic,meson-gx-ao-sysctrl", "syscon", "simple-mfd";
+ reg = <0x0 0x0 0x0 0x100>;
+
+ clkc_AO: clock-controller {
+ compatible = "amlogic,meson-gxbb-aoclkc", "amlogic,meson-gx-aoclkc";
#clock-cells = <1>;
#reset-cells = <1>;
};
+};
Example: UART controller node that consumes the clock and reset generated
by the clock controller:
diff --git a/Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt b/Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt
index 207682647d33..b455c5aa9139 100644
--- a/Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt
+++ b/Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt
@@ -16,18 +16,25 @@ Required Properties:
mapped region.
- #clock-cells: should be 1.
+- #reset-cells: should be 1.
Each clock is assigned an identifier and client nodes can use this identifier
to specify the clock which they consume. All available clocks are defined as
preprocessor macros in the dt-bindings/clock/meson8b-clkc.h header and can be
used in device tree sources.
+Similarly a preprocessor macro for each reset line is defined in
+dt-bindings/reset/amlogic,meson8b-clkc-reset.h (which can be used from the
+device tree sources).
+
+
Example: Clock controller node:
clkc: clock-controller@c1104000 {
- #clock-cells = <1>;
compatible = "amlogic,meson8b-clkc";
reg = <0xc1108000 0x4>, <0xc1104000 0x460>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
};
diff --git a/Documentation/devicetree/bindings/clock/at91-clock.txt b/Documentation/devicetree/bindings/clock/at91-clock.txt
index 5f3ad65daf69..51c259a92d02 100644
--- a/Documentation/devicetree/bindings/clock/at91-clock.txt
+++ b/Documentation/devicetree/bindings/clock/at91-clock.txt
@@ -81,6 +81,16 @@ Required properties:
"atmel,sama5d2-clk-generated":
at91 generated clock
+ "atmel,sama5d2-clk-audio-pll-frac":
+ at91 audio fractional pll
+
+ "atmel,sama5d2-clk-audio-pll-pad":
+ at91 audio pll CLK_AUDIO output pin
+
+ "atmel,sama5d2-clk-audio-pll-pmc"
+ at91 audio pll output on AUDIOPLLCLK that feeds the PMC
+ and can be used by peripheral clock or generic clock
+
Required properties for SCKC node:
- reg : defines the IO memory reserved for the SCKC.
- #size-cells : shall be 0 (reg is used to encode clk id).
diff --git a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
index 53d7e50ed875..05a245c9df08 100644
--- a/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
+++ b/Documentation/devicetree/bindings/clock/idt,versaclock5.txt
@@ -1,24 +1,32 @@
-Binding for IDT VersaClock5 programmable i2c clock generator.
+Binding for IDT VersaClock 5,6 programmable i2c clock generators.
-The IDT VersaClock5 are programmable i2c clock generators providing
-from 3 to 12 output clocks.
+The IDT VersaClock 5 and VersaClock 6 are programmable i2c clock
+generators providing from 3 to 12 output clocks.
==I2C device node==
Required properties:
-- compatible: shall be one of "idt,5p49v5923" , "idt,5p49v5933" ,
- "idt,5p49v5935".
+- compatible: shall be one of
+ "idt,5p49v5923"
+ "idt,5p49v5925"
+ "idt,5p49v5933"
+ "idt,5p49v5935"
+ "idt,5p49v6901"
- reg: i2c device address, shall be 0x68 or 0x6a.
- #clock-cells: from common clock binding; shall be set to 1.
- clocks: from common clock binding; list of parent clock handles,
- - 5p49v5923: (required) either or both of XTAL or CLKIN
+ - 5p49v5923 and
+ 5p49v5925 and
+ 5p49v6901: (required) either or both of XTAL or CLKIN
reference clock.
- 5p49v5933 and
- 5p49v5935: (optional) property not present (internal
Xtal used) or CLKIN reference
clock.
- clock-names: from common clock binding; clock input names, can be
- - 5p49v5923: (required) either or both of "xin", "clkin".
+ - 5p49v5923 and
+ 5p49v5925 and
+ 5p49v6901: (required) either or both of "xin", "clkin".
- 5p49v5933 and
- 5p49v5935: (optional) property not present or "clkin".
@@ -37,6 +45,7 @@ clock specifier, the following mapping applies:
1 -- OUT1
2 -- OUT4
+5P49V5925 and
5P49V5935:
0 -- OUT0_SEL_I2CB
1 -- OUT1
@@ -44,6 +53,13 @@ clock specifier, the following mapping applies:
3 -- OUT3
4 -- OUT4
+5P49V6901:
+ 0 -- OUT0_SEL_I2CB
+ 1 -- OUT1
+ 2 -- OUT2
+ 3 -- OUT3
+ 4 -- OUT4
+
==Example==
/* 25MHz reference crystal */
diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
index 707a686d8d3e..316e13686568 100644
--- a/Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
+++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
@@ -22,6 +22,7 @@ Required Properties:
- "renesas,r8a7794-cpg-mssr" for the r8a7794 SoC (R-Car E2)
- "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3)
- "renesas,r8a7796-cpg-mssr" for the r8a7796 SoC (R-Car M3-W)
+ - "renesas,r8a77995-cpg-mssr" for the r8a77995 SoC (R-Car D3)
- reg: Base address and length of the memory resource used by the CPG/MSSR
block
@@ -30,7 +31,7 @@ Required Properties:
clock-names
- clock-names: List of external parent clock names. Valid names are:
- "extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794,
- r8a7795, r8a7796)
+ r8a7795, r8a7796, r8a77995)
- "extalr" (r8a7795, r8a7796)
- "usb_extal" (r8a7743, r8a7745, r8a7790, r8a7791, r8a7793, r8a7794)
diff --git a/Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt b/Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt
new file mode 100644
index 000000000000..e96e085271c1
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt
@@ -0,0 +1,55 @@
+* Renesas R-Car USB 2.0 clock selector
+
+This file provides information on what the device node for the R-Car USB 2.0
+clock selector.
+
+If you connect an external clock to the USB_EXTAL pin only, you should set
+the clock rate to "usb_extal" node only.
+If you connect an oscillator to both the USB_XTAL and USB_EXTAL, this module
+is not needed because this is default setting. (Of course, you can set the
+clock rates to both "usb_extal" and "usb_xtal" nodes.
+
+Case 1: An external clock connects to R-Car SoC
+ +----------+ +--- R-Car ---------------------+
+ |External |---|USB_EXTAL ---> all usb channels|
+ |clock | |USB_XTAL |
+ +----------+ +-------------------------------+
+In this case, we need this driver with "usb_extal" clock.
+
+Case 2: An oscillator connects to R-Car SoC
+ +----------+ +--- R-Car ---------------------+
+ |Oscillator|---|USB_EXTAL -+-> all usb channels|
+ | |---|USB_XTAL --+ |
+ +----------+ +-------------------------------+
+In this case, we don't need this selector.
+
+Required properties:
+- compatible: "renesas,r8a7795-rcar-usb2-clock-sel" if the device is a part of
+ an R8A7795 SoC.
+ "renesas,r8a7796-rcar-usb2-clock-sel" if the device if a part of
+ an R8A7796 SoC.
+ "renesas,rcar-gen3-usb2-clock-sel" for a generic R-Car Gen3
+ compatible device.
+
+ When compatible with the generic version, nodes must list the
+ SoC-specific version corresponding to the platform first
+ followed by the generic version.
+
+- reg: offset and length of the USB 2.0 clock selector register block.
+- clocks: A list of phandles and specifier pairs.
+- clock-names: Name of the clocks.
+ - The functional clock must be "ehci_ohci"
+ - The USB_EXTAL clock pin must be "usb_extal"
+ - The USB_XTAL clock pin must be "usb_xtal"
+- #clock-cells: Must be 0
+
+Example (R-Car H3):
+
+ usb2_clksel: clock-controller@e6590630 {
+ compatible = "renesas,r8a77950-rcar-usb2-clock-sel",
+ "renesas,rcar-gen3-usb2-clock-sel";
+ reg = <0 0xe6590630 0 0x02>;
+ clocks = <&cpg CPG_MOD 703>, <&usb_extal>, <&usb_xtal>;
+ clock-names = "ehci_ohci", "usb_extal", "usb_xtal";
+ #clock-cells = <0>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.txt
index 455a9a00a623..6f8744fd301b 100644
--- a/Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.txt
+++ b/Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.txt
@@ -1,12 +1,14 @@
-* Rockchip RK3128 Clock and Reset Unit
+* Rockchip RK3126/RK3128 Clock and Reset Unit
-The RK3128 clock controller generates and supplies clock to various
+The RK3126/RK3128 clock controller generates and supplies clock to various
controllers within the SoC and also implements a reset controller for SoC
peripherals.
Required Properties:
-- compatible: should be "rockchip,rk3128-cru"
+- compatible: should be "rockchip,rk3126-cru" or "rockchip,rk3128-cru"
+ "rockchip,rk3126-cru" - controller compatible with RK3126 SoC.
+ "rockchip,rk3128-cru" - controller compatible with RK3128 SoC.
- reg: physical base address of the controller and length of memory mapped
region.
- #clock-cells: should be 1.
diff --git a/Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt b/Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt
new file mode 100644
index 000000000000..c56c7553c730
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt
@@ -0,0 +1,28 @@
+Binding for the HSDK Generic PLL clock
+
+This binding uses the common clock binding[1].
+
+[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible: should be "snps,hsdk-<name>-pll-clock"
+ "snps,hsdk-core-pll-clock"
+ "snps,hsdk-gp-pll-clock"
+ "snps,hsdk-hdmi-pll-clock"
+- reg : should contain base register location and length.
+- clocks: shall be the input parent clock phandle for the PLL.
+- #clock-cells: from common clock binding; Should always be set to 0.
+
+Example:
+ input_clk: input-clk {
+ clock-frequency = <33333333>;
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ };
+
+ cpu_clk: cpu-clk@0 {
+ compatible = "snps,hsdk-core-pll-clock";
+ reg = <0x00 0x10>;
+ #clock-cells = <0>;
+ clocks = <&input_clk>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/snps,pll-clock.txt b/Documentation/devicetree/bindings/clock/snps,pll-clock.txt
new file mode 100644
index 000000000000..11fe4876612c
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/snps,pll-clock.txt
@@ -0,0 +1,28 @@
+Binding for the AXS10X Generic PLL clock
+
+This binding uses the common clock binding[1].
+
+[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+Required properties:
+- compatible: should be "snps,axs10x-<name>-pll-clock"
+ "snps,axs10x-arc-pll-clock"
+ "snps,axs10x-pgu-pll-clock"
+- reg: should always contain 2 pairs address - length: first for PLL config
+registers and second for corresponding LOCK CGU register.
+- clocks: shall be the input parent clock phandle for the PLL.
+- #clock-cells: from common clock binding; Should always be set to 0.
+
+Example:
+ input-clk: input-clk {
+ clock-frequency = <33333333>;
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ };
+
+ core-clk: core-clk@80 {
+ compatible = "snps,axs10x-arc-pll-clock";
+ reg = <0x80 0x10>, <0x100 0x10>;
+ #clock-cells = <0>;
+ clocks = <&input-clk>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/st,stm32h7-rcc.txt b/Documentation/devicetree/bindings/clock/st,stm32h7-rcc.txt
new file mode 100644
index 000000000000..cac24ee10b72
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/st,stm32h7-rcc.txt
@@ -0,0 +1,71 @@
+STMicroelectronics STM32H7 Reset and Clock Controller
+=====================================================
+
+The RCC IP is both a reset and a clock controller.
+
+Please refer to clock-bindings.txt for common clock controller binding usage.
+Please also refer to reset.txt for common reset controller binding usage.
+
+Required properties:
+- compatible: Should be:
+ "st,stm32h743-rcc"
+
+- reg: should be register base and length as documented in the
+ datasheet
+
+- #reset-cells: 1, see below
+
+- #clock-cells : from common clock binding; shall be set to 1
+
+- clocks: External oscillator clock phandle
+ - high speed external clock signal (HSE)
+ - low speed external clock signal (LSE)
+ - external I2S clock (I2S_CKIN)
+
+Optional properties:
+- st,syscfg: phandle for pwrcfg, mandatory to disable/enable backup domain
+ write protection (RTC clock).
+
+Example:
+
+ rcc: reset-clock-controller@58024400 {
+ compatible = "st,stm32h743-rcc", "st,stm32-rcc";
+ reg = <0x58024400 0x400>;
+ #reset-cells = <1>;
+ #clock-cells = <1>;
+ clocks = <&clk_hse>, <&clk_lse>, <&clk_i2s_ckin>;
+
+ st,syscfg = <&pwrcfg>;
+};
+
+The peripheral clock consumer should specify the desired clock by
+having the clock ID in its "clocks" phandle cell.
+
+Example:
+
+ timer5: timer@40000c00 {
+ compatible = "st,stm32-timer";
+ reg = <0x40000c00 0x400>;
+ interrupts = <50>;
+ clocks = <&rcc TIM5_CK>;
+ };
+
+Specifying softreset control of devices
+=======================================
+
+Device nodes should specify the reset channel required in their "resets"
+property, containing a phandle to the reset device node and an index specifying
+which channel to use.
+The index is the bit number within the RCC registers bank, starting from RCC
+base address.
+It is calculated as: index = register_offset / 4 * 32 + bit_offset.
+Where bit_offset is the bit offset within the register.
+
+For example, for CRC reset:
+ crc = AHB4RSTR_offset / 4 * 32 + CRCRST_bit_offset = 0x88 / 4 * 32 + 19 = 1107
+
+Example:
+
+ timer2 {
+ resets = <&rcc STM32H7_APB1L_RESET(TIM2)>;
+ };
diff --git a/Documentation/devicetree/bindings/clock/sunxi-ccu.txt b/Documentation/devicetree/bindings/clock/sunxi-ccu.txt
index df9fad58facd..7eda08eb8a1e 100644
--- a/Documentation/devicetree/bindings/clock/sunxi-ccu.txt
+++ b/Documentation/devicetree/bindings/clock/sunxi-ccu.txt
@@ -3,18 +3,24 @@ Allwinner Clock Control Unit Binding
Required properties :
- compatible: must contain one of the following compatibles:
+ - "allwinner,sun4i-a10-ccu"
+ - "allwinner,sun5i-a10s-ccu"
+ - "allwinner,sun5i-a13-ccu"
- "allwinner,sun6i-a31-ccu"
+ - "allwinner,sun7i-a20-ccu"
- "allwinner,sun8i-a23-ccu"
- "allwinner,sun8i-a33-ccu"
- "allwinner,sun8i-a83t-ccu"
- "allwinner,sun8i-a83t-r-ccu"
- "allwinner,sun8i-h3-ccu"
- "allwinner,sun8i-h3-r-ccu"
++ - "allwinner,sun8i-r40-ccu"
- "allwinner,sun8i-v3s-ccu"
- "allwinner,sun9i-a80-ccu"
- "allwinner,sun50i-a64-ccu"
- "allwinner,sun50i-a64-r-ccu"
- "allwinner,sun50i-h5-ccu"
+ - "nextthing,gr8-ccu"
- reg: Must contain the registers base address and length
- clocks: phandle to the oscillators feeding the CCU. Two are needed:
diff --git a/Documentation/devicetree/bindings/clock/uniphier-clock.txt b/Documentation/devicetree/bindings/clock/uniphier-clock.txt
index 812163060fa3..7b5f602765fe 100644
--- a/Documentation/devicetree/bindings/clock/uniphier-clock.txt
+++ b/Documentation/devicetree/bindings/clock/uniphier-clock.txt
@@ -6,7 +6,6 @@ System clock
Required properties:
- compatible: should be one of the following:
- "socionext,uniphier-sld3-clock" - for sLD3 SoC.
"socionext,uniphier-ld4-clock" - for LD4 SoC.
"socionext,uniphier-pro4-clock" - for Pro4 SoC.
"socionext,uniphier-sld8-clock" - for sLD8 SoC.
@@ -14,6 +13,7 @@ Required properties:
"socionext,uniphier-pxs2-clock" - for PXs2/LD6b SoC.
"socionext,uniphier-ld11-clock" - for LD11 SoC.
"socionext,uniphier-ld20-clock" - for LD20 SoC.
+ "socionext,uniphier-pxs3-clock" - for PXs3 SoC
- #clock-cells: should be 1.
Example:
@@ -48,7 +48,6 @@ Media I/O (MIO) clock, SD clock
Required properties:
- compatible: should be one of the following:
- "socionext,uniphier-sld3-mio-clock" - for sLD3 SoC.
"socionext,uniphier-ld4-mio-clock" - for LD4 SoC.
"socionext,uniphier-pro4-mio-clock" - for Pro4 SoC.
"socionext,uniphier-sld8-mio-clock" - for sLD8 SoC.
@@ -56,6 +55,7 @@ Required properties:
"socionext,uniphier-pxs2-sd-clock" - for PXs2/LD6b SoC.
"socionext,uniphier-ld11-mio-clock" - for LD11 SoC.
"socionext,uniphier-ld20-sd-clock" - for LD20 SoC.
+ "socionext,uniphier-pxs3-sd-clock" - for PXs3 SoC
- #clock-cells: should be 1.
Example:
@@ -82,11 +82,9 @@ Provided clocks:
8: USB2 ch0 host
9: USB2 ch1 host
10: USB2 ch2 host
-11: USB2 ch3 host
12: USB2 ch0 PHY
13: USB2 ch1 PHY
14: USB2 ch2 PHY
-15: USB2 ch3 PHY
Peripheral clock
@@ -94,7 +92,6 @@ Peripheral clock
Required properties:
- compatible: should be one of the following:
- "socionext,uniphier-sld3-peri-clock" - for sLD3 SoC.
"socionext,uniphier-ld4-peri-clock" - for LD4 SoC.
"socionext,uniphier-pro4-peri-clock" - for Pro4 SoC.
"socionext,uniphier-sld8-peri-clock" - for sLD8 SoC.
@@ -102,6 +99,7 @@ Required properties:
"socionext,uniphier-pxs2-peri-clock" - for PXs2/LD6b SoC.
"socionext,uniphier-ld11-peri-clock" - for LD11 SoC.
"socionext,uniphier-ld20-peri-clock" - for LD20 SoC.
+ "socionext,uniphier-pxs3-peri-clock" - for PXs3 SoC
- #clock-cells: should be 1.
Example:
diff --git a/Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt b/Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
index cb7ffc58c564..b1a8929c2536 100644
--- a/Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
+++ b/Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
@@ -13,6 +13,7 @@ Required properties:
- compatible : Shall contain one or more of
- "renesas,r8a7795-hdmi" for R8A7795 (R-Car H3) compatible HDMI TX
+ - "renesas,r8a7796-hdmi" for R8A7796 (R-Car M3-W) compatible HDMI TX
- "renesas,rcar-gen3-hdmi" for the generic R-Car Gen3 compatible HDMI TX
When compatible with generic versions, nodes must list the SoC-specific
diff --git a/Documentation/devicetree/bindings/display/renesas,du.txt b/Documentation/devicetree/bindings/display/renesas,du.txt
index c6cb96a4fa93..4bbd1e9bf3be 100644
--- a/Documentation/devicetree/bindings/display/renesas,du.txt
+++ b/Documentation/devicetree/bindings/display/renesas,du.txt
@@ -36,8 +36,10 @@ Required Properties:
When supplied they must be named "dclkin.x" with "x" being the input
clock numerical index.
- - vsps: A list of phandles to the VSP nodes that handle the memory
- interfaces for the DU channels.
+ - vsps: A list of phandle and channel index tuples to the VSPs that handle
+ the memory interfaces for the DU channels. The phandle identifies the VSP
+ instance that serves the DU channel, and the channel index identifies the
+ LIF instance in that VSP.
Required nodes:
@@ -59,24 +61,24 @@ corresponding to each DU output.
R8A7796 (M3-W) DPAD HDMI LVDS -
-Example: R8A7790 (R-Car H2) DU
+Example: R8A7795 (R-Car H3) ES2.0 DU
- du: du@feb00000 {
- compatible = "renesas,du-r8a7790";
- reg = <0 0xfeb00000 0 0x70000>,
- <0 0xfeb90000 0 0x1c>,
- <0 0xfeb94000 0 0x1c>;
- reg-names = "du", "lvds.0", "lvds.1";
- interrupt-parent = <&gic>;
- interrupts = <0 256 IRQ_TYPE_LEVEL_HIGH>,
- <0 268 IRQ_TYPE_LEVEL_HIGH>,
- <0 269 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&mstp7_clks R8A7790_CLK_DU0>,
- <&mstp7_clks R8A7790_CLK_DU1>,
- <&mstp7_clks R8A7790_CLK_DU2>,
- <&mstp7_clks R8A7790_CLK_LVDS0>,
- <&mstp7_clks R8A7790_CLK_LVDS1>;
- clock-names = "du.0", "du.1", "du.2", "lvds.0", "lvds.1";
+ du: display@feb00000 {
+ compatible = "renesas,du-r8a7795";
+ reg = <0 0xfeb00000 0 0x80000>,
+ <0 0xfeb90000 0 0x14>;
+ reg-names = "du", "lvds.0";
+ interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 270 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 724>,
+ <&cpg CPG_MOD 723>,
+ <&cpg CPG_MOD 722>,
+ <&cpg CPG_MOD 721>,
+ <&cpg CPG_MOD 727>;
+ clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0";
+ vsps = <&vspd0 0>, <&vspd1 0>, <&vspd2 0>, <&vspd0 1>;
ports {
#address-cells = <1>;
@@ -89,12 +91,19 @@ Example: R8A7790 (R-Car H2) DU
};
port@1 {
reg = <1>;
- du_out_lvds0: endpoint {
+ du_out_hdmi0: endpoint {
+ remote-endpoint = <&dw_hdmi0_in>;
};
};
port@2 {
reg = <2>;
- du_out_lvds1: endpoint {
+ du_out_hdmi1: endpoint {
+ remote-endpoint = <&dw_hdmi1_in>;
+ };
+ };
+ port@3 {
+ reg = <3>;
+ du_out_lvds0: endpoint {
};
};
};
diff --git a/Documentation/devicetree/bindings/dma/ti-edma.txt b/Documentation/devicetree/bindings/dma/ti-edma.txt
index 33d9e386dc45..41f0c1a07c56 100644
--- a/Documentation/devicetree/bindings/dma/ti-edma.txt
+++ b/Documentation/devicetree/bindings/dma/ti-edma.txt
@@ -9,7 +9,12 @@ execute the actual DMA tansfer.
eDMA3 Channel Controller
Required properties:
-- compatible: "ti,edma3-tpcc" for the channel controller(s)
+--------------------
+- compatible: Should be:
+ - "ti,edma3-tpcc" for the channel controller(s) on OMAP,
+ AM33xx and AM43xx SoCs.
+ - "ti,k2g-edma3-tpcc", "ti,edma3-tpcc" for the
+ channel controller(s) on 66AK2G.
- #dma-cells: Should be set to <2>. The first number is the DMA request
number and the second is the TC the channel is serviced on.
- reg: Memory map of eDMA CC
@@ -19,8 +24,19 @@ Required properties:
- ti,tptcs: List of TPTCs associated with the eDMA in the following form:
<&tptc_phandle TC_priority_number>. The highest priority is 0.
+SoC-specific Required properties:
+--------------------------------
+The following are mandatory properties for OMAP, AM33xx and AM43xx SoCs only:
+- ti,hwmods: Name of the hwmods associated to the eDMA CC.
+
+The following are mandatory properties for 66AK2G SoCs only:
+- power-domains:Should contain a phandle to a PM domain provider node
+ and an args specifier containing the device id
+ value. This property is as per the binding,
+ Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+
Optional properties:
-- ti,hwmods: Name of the hwmods associated to the eDMA CC
+-------------------
- ti,edma-memcpy-channels: List of channels allocated to be used for memcpy, iow
these channels will be SW triggered channels. See example.
- ti,edma-reserved-slot-ranges: PaRAM slot ranges which should not be used by
@@ -31,17 +47,34 @@ Optional properties:
eDMA3 Transfer Controller
Required properties:
-- compatible: "ti,edma3-tptc" for the transfer controller(s)
+--------------------
+- compatible: Should be:
+ - "ti,edma3-tptc" for the transfer controller(s) on OMAP,
+ AM33xx and AM43xx SoCs.
+ - "ti,k2g-edma3-tptc", "ti,edma3-tptc" for the
+ transfer controller(s) on 66AK2G.
- reg: Memory map of eDMA TC
- interrupts: Interrupt number for TCerrint.
+SoC-specific Required properties:
+--------------------------------
+The following are mandatory properties for OMAP, AM33xx and AM43xx SoCs only:
+- ti,hwmods: Name of the hwmods associated to the eDMA TC.
+
+The following are mandatory properties for 66AK2G SoCs only:
+- power-domains:Should contain a phandle to a PM domain provider node
+ and an args specifier containing the device id
+ value. This property is as per the binding,
+ Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+
Optional properties:
-- ti,hwmods: Name of the hwmods associated to the given eDMA TC
+-------------------
- interrupt-names: "edma3_tcerrint"
------------------------------------------------------------------------------
-Example:
+Examples:
+1.
edma: edma@49000000 {
compatible = "ti,edma3-tpcc";
ti,hwmods = "tpcc";
@@ -108,6 +141,58 @@ mcasp0: mcasp@48038000 {
dma-names = "tx", "rx";
};
+2.
+edma1: edma@02728000 {
+ compatible = "ti,k2g-edma3-tpcc", "ti,edma3-tpcc";
+ reg = <0x02728000 0x8000>;
+ reg-names = "edma3_cc";
+ interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 219 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 220 IRQ_TYPE_EDGE_RISING>;
+ interrupt-names = "edma3_ccint", "emda3_mperr",
+ "edma3_ccerrint";
+ dma-requests = <64>;
+ #dma-cells = <2>;
+
+ ti,tptcs = <&edma1_tptc0 7>, <&edma1_tptc1 0>;
+
+ /*
+ * memcpy is disabled, can be enabled with:
+ * ti,edma-memcpy-channels = <12 13 14 15>;
+ * for example.
+ */
+
+ power-domains = <&k2g_pds 0x4f>;
+};
+
+edma1_tptc0: tptc@027b0000 {
+ compatible = "ti,k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x027b0000 0x400>;
+ power-domains = <&k2g_pds 0x4f>;
+};
+
+edma1_tptc1: tptc@027b8000 {
+ compatible = "ti, k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x027b8000 0x400>;
+ power-domains = <&k2g_pds 0x4f>;
+};
+
+mmc0: mmc@23000000 {
+ compatible = "ti,k2g-hsmmc", "ti,omap4-hsmmc";
+ reg = <0x23000000 0x400>;
+ interrupts = <GIC_SPI 96 IRQ_TYPE_EDGE_RISING>;
+ dmas = <&edma1 24 0>, <&edma1 25 0>;
+ dma-names = "tx", "rx";
+ bus-width = <4>;
+ ti,needs-special-reset;
+ no-1-8-v;
+ max-frequency = <96000000>;
+ power-domains = <&k2g_pds 0xb>;
+ clocks = <&k2g_clks 0xb 1>, <&k2g_clks 0xb 2>;
+ clock-names = "fck", "mmchsdb_fck";
+ status = "disabled";
+};
+
------------------------------------------------------------------------------
DEPRECATED binding, new DTS files must use the ti,edma3-tpcc/ti,edma3-tptc
binding.
diff --git a/Documentation/devicetree/bindings/eeprom/eeprom.txt b/Documentation/devicetree/bindings/eeprom/eeprom.txt
index 5696eb508e95..afc04589eadf 100644
--- a/Documentation/devicetree/bindings/eeprom/eeprom.txt
+++ b/Documentation/devicetree/bindings/eeprom/eeprom.txt
@@ -16,8 +16,12 @@ Required properties:
"renesas,r1ex24002"
+ The following manufacturers values have been deprecated:
+ "at", "at24"
+
If there is no specific driver for <manufacturer>, a generic
- driver based on <type> is selected. Possible types are:
+ device with <type> and manufacturer "atmel" should be used.
+ Possible types are:
"24c00", "24c01", "24c02", "24c04", "24c08", "24c16", "24c32", "24c64",
"24c128", "24c256", "24c512", "24c1024", "spd"
diff --git a/Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt b/Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt
index 5aa5926029ee..039219df05c5 100644
--- a/Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt
+++ b/Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt
@@ -17,6 +17,7 @@ Required properties:
* which must be preceded by one of the following vendor specifics:
+ "amlogic,meson-gxm-mali"
+ "rockchip,rk3288-mali"
+ + "rockchip,rk3399-mali"
- reg : Physical base address of the device and length of the register area.
diff --git a/Documentation/devicetree/bindings/i2c/i2c-altera.txt b/Documentation/devicetree/bindings/i2c/i2c-altera.txt
new file mode 100644
index 000000000000..767664f448ec
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/i2c-altera.txt
@@ -0,0 +1,39 @@
+* Altera I2C Controller
+* This is Altera's synthesizable logic block I2C Controller for use
+* in Altera's FPGAs.
+
+Required properties :
+ - compatible : should be "altr,softip-i2c-v1.0"
+ - reg : Offset and length of the register set for the device
+ - interrupts : <IRQ> where IRQ is the interrupt number.
+ - clocks : phandle to input clock.
+ - #address-cells = <1>;
+ - #size-cells = <0>;
+
+Recommended properties :
+ - clock-frequency : desired I2C bus clock frequency in Hz.
+
+Optional properties :
+ - fifo-size : Size of the RX and TX FIFOs in bytes.
+ - Child nodes conforming to i2c bus binding
+
+Example :
+
+ i2c@100080000 {
+ compatible = "altr,softip-i2c-v1.0";
+ reg = <0x00000001 0x00080000 0x00000040>;
+ interrupt-parent = <&intc>;
+ interrupts = <0 43 4>;
+ clocks = <&clk_0>;
+ clock-frequency = <100000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ fifo-size = <4>;
+
+ eeprom@51 {
+ compatible = "atmel,24c32";
+ reg = <0x51>;
+ pagesize = <32>;
+ };
+ };
+
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mtk.txt b/Documentation/devicetree/bindings/i2c/i2c-mtk.txt
index bd5a7befd951..ff7bf37deb43 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mtk.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-mtk.txt
@@ -1,14 +1,15 @@
-* Mediatek's I2C controller
+* MediaTek's I2C controller
-The Mediatek's I2C controller is used to interface with I2C devices.
+The MediaTek's I2C controller is used to interface with I2C devices.
Required properties:
- compatible: value should be either of the following.
- "mediatek,mt2701-i2c", "mediatek,mt6577-i2c": for Mediatek mt2701
- "mediatek,mt6577-i2c": for i2c compatible with mt6577.
- "mediatek,mt6589-i2c": for i2c compatible with mt6589.
- "mediatek,mt7623-i2c", "mediatek,mt6577-i2c": for i2c compatible with mt7623.
- "mediatek,mt8173-i2c": for i2c compatible with mt8173.
+ "mediatek,mt2701-i2c", "mediatek,mt6577-i2c": for MediaTek MT2701
+ "mediatek,mt6577-i2c": for MediaTek MT6577
+ "mediatek,mt6589-i2c": for MediaTek MT6589
+ "mediatek,mt7622-i2c": for MediaTek MT7622
+ "mediatek,mt7623-i2c", "mediatek,mt6577-i2c": for MediaTek MT7623
+ "mediatek,mt8173-i2c": for MediaTek MT8173
- reg: physical base address of the controller and dma base, length of memory
mapped region.
- interrupts: interrupt number to the cpu.
diff --git a/Documentation/devicetree/bindings/i2c/i2c-rcar.txt b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt
index 2b8bd33dbf8d..cad39aee9f73 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-rcar.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt
@@ -2,6 +2,8 @@ I2C for R-Car platforms
Required properties:
- compatible:
+ "renesas,i2c-r8a7743" if the device is a part of a R8A7743 SoC.
+ "renesas,i2c-r8a7745" if the device is a part of a R8A7745 SoC.
"renesas,i2c-r8a7778" if the device is a part of a R8A7778 SoC.
"renesas,i2c-r8a7779" if the device is a part of a R8A7779 SoC.
"renesas,i2c-r8a7790" if the device is a part of a R8A7790 SoC.
@@ -12,7 +14,8 @@ Required properties:
"renesas,i2c-r8a7795" if the device is a part of a R8A7795 SoC.
"renesas,i2c-r8a7796" if the device is a part of a R8A7796 SoC.
"renesas,rcar-gen1-i2c" for a generic R-Car Gen1 compatible device.
- "renesas,rcar-gen2-i2c" for a generic R-Car Gen2 compatible device.
+ "renesas,rcar-gen2-i2c" for a generic R-Car Gen2 or RZ/G1 compatible
+ device.
"renesas,rcar-gen3-i2c" for a generic R-Car Gen3 compatible device.
"renesas,i2c-rcar" (deprecated)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt b/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
index e18445d0980c..22f2eeb2c4c9 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
@@ -7,6 +7,7 @@ Required properties :
- reg : Offset and length of the register set for the device
- compatible: should be one of the following:
+ - "rockchip,rv1108-i2c": for rv1108
- "rockchip,rk3066-i2c": for rk3066
- "rockchip,rk3188-i2c": for rk3188
- "rockchip,rk3228-i2c": for rk3228
diff --git a/Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt b/Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt
index ae9c2a735f39..224390999e81 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt
@@ -4,6 +4,8 @@ Required properties:
- compatible :
- "renesas,iic-r8a73a4" (R-Mobile APE6)
- "renesas,iic-r8a7740" (R-Mobile A1)
+ - "renesas,iic-r8a7743" (RZ/G1M)
+ - "renesas,iic-r8a7745" (RZ/G1E)
- "renesas,iic-r8a7790" (R-Car H2)
- "renesas,iic-r8a7791" (R-Car M2-W)
- "renesas,iic-r8a7792" (R-Car V2H)
@@ -12,7 +14,8 @@ Required properties:
- "renesas,iic-r8a7795" (R-Car H3)
- "renesas,iic-r8a7796" (R-Car M3-W)
- "renesas,iic-sh73a0" (SH-Mobile AG5)
- - "renesas,rcar-gen2-iic" (generic R-Car Gen2 compatible device)
+ - "renesas,rcar-gen2-iic" (generic R-Car Gen2 or RZ/G1
+ compatible device)
- "renesas,rcar-gen3-iic" (generic R-Car Gen3 compatible device)
- "renesas,rmobile-iic" (generic device)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-sprd.txt b/Documentation/devicetree/bindings/i2c/i2c-sprd.txt
new file mode 100644
index 000000000000..60b7cda15dd2
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/i2c-sprd.txt
@@ -0,0 +1,31 @@
+I2C for Spreadtrum platforms
+
+Required properties:
+- compatible: Should be "sprd,sc9860-i2c".
+- reg: Specify the physical base address of the controller and length
+ of memory mapped region.
+- interrupts: Should contain I2C interrupt.
+- clock-names: Should contain following entries:
+ "i2c" for I2C clock,
+ "source" for I2C source (parent) clock,
+ "enable" for I2C module enable clock.
+- clocks: Should contain a clock specifier for each entry in clock-names.
+- clock-frequency: Constains desired I2C bus clock frequency in Hz.
+- #address-cells: Should be 1 to describe address cells for I2C device address.
+- #size-cells: Should be 0 means no size cell for I2C device address.
+
+Optional properties:
+- Child nodes conforming to I2C bus binding
+
+Examples:
+i2c0: i2c@70500000 {
+ compatible = "sprd,sc9860-i2c";
+ reg = <0 0x70500000 0 0x1000>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ clock-names = "i2c", "source", "enable";
+ clocks = <&clk_i2c3>, <&ext_26m>, <&clk_ap_apb_gates 11>;
+ clock-frequency = <400000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+};
+
diff --git a/Documentation/devicetree/bindings/i2c/i2c-stm32.txt b/Documentation/devicetree/bindings/i2c/i2c-stm32.txt
index 78eaf7b718ed..3b5489966634 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-stm32.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-stm32.txt
@@ -1,7 +1,9 @@
* I2C controller embedded in STMicroelectronics STM32 I2C platform
Required properties :
-- compatible : Must be "st,stm32f4-i2c"
+- compatible : Must be one of the following
+ - "st,stm32f4-i2c"
+ - "st,stm32f7-i2c"
- reg : Offset and length of the register set for the device
- interrupts : Must contain the interrupt id for I2C event and then the
interrupt id for I2C error.
@@ -14,8 +16,16 @@ Required properties :
Optional properties :
- clock-frequency : Desired I2C bus clock frequency in Hz. If not specified,
- the default 100 kHz frequency will be used. As only Normal and Fast modes
- are supported, possible values are 100000 and 400000.
+ the default 100 kHz frequency will be used.
+ For STM32F4 SoC Standard-mode and Fast-mode are supported, possible values are
+ 100000 and 400000.
+ For STM32F7 SoC, Standard-mode, Fast-mode and Fast-mode Plus are supported,
+ possible values are 100000, 400000 and 1000000.
+- i2c-scl-rising-time-ns : Only for STM32F7, I2C SCL Rising time for the board
+ (default: 25)
+- i2c-scl-falling-time-ns : Only for STM32F7, I2C SCL Falling time for the board
+ (default: 10)
+ I2C Timings are derived from these 2 values
Example :
@@ -31,3 +41,16 @@ Example :
pinctrl-0 = <&i2c1_sda_pin>, <&i2c1_scl_pin>;
pinctrl-names = "default";
};
+
+ i2c@40005400 {
+ compatible = "st,stm32f7-i2c";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0x40005400 0x400>;
+ interrupts = <31>,
+ <32>;
+ resets = <&rcc STM32F7_APB1_RESET(I2C1)>;
+ clocks = <&rcc 1 CLK_I2C1>;
+ pinctrl-0 = <&i2c1_sda_pin>, <&i2c1_scl_pin>;
+ pinctrl-names = "default";
+ };
diff --git a/Documentation/devicetree/bindings/input/pwm-vibrator.txt b/Documentation/devicetree/bindings/input/pwm-vibrator.txt
new file mode 100644
index 000000000000..09145d18491d
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/pwm-vibrator.txt
@@ -0,0 +1,66 @@
+* PWM vibrator device tree bindings
+
+Registers a PWM device as vibrator. It is expected, that the vibrator's
+strength increases based on the duty cycle of the enable PWM channel
+(100% duty cycle meaning strongest vibration, 0% meaning no vibration).
+
+The binding supports an optional direction PWM channel, that can be
+driven at fixed duty cycle. If available this is can be used to increase
+the vibration effect of some devices.
+
+Required properties:
+- compatible: should contain "pwm-vibrator"
+- pwm-names: Should contain "enable" and optionally "direction"
+- pwms: Should contain a PWM handle for each entry in pwm-names
+
+Optional properties:
+- vcc-supply: Phandle for the regulator supplying power
+- direction-duty-cycle-ns: Duty cycle of the direction PWM channel in
+ nanoseconds, defaults to 50% of the channel's
+ period.
+
+Example from Motorola Droid 4:
+
+&omap4_pmx_core {
+ vibrator_direction_pin: pinmux_vibrator_direction_pin {
+ pinctrl-single,pins = <
+ OMAP4_IOPAD(0x1ce, PIN_OUTPUT | MUX_MODE1) /* dmtimer8_pwm_evt (gpio_27) */
+ >;
+ };
+
+ vibrator_enable_pin: pinmux_vibrator_enable_pin {
+ pinctrl-single,pins = <
+ OMAP4_IOPAD(0X1d0, PIN_OUTPUT | MUX_MODE1) /* dmtimer9_pwm_evt (gpio_28) */
+ >;
+ };
+};
+
+/ {
+ pwm8: dmtimer-pwm {
+ pinctrl-names = "default";
+ pinctrl-0 = <&vibrator_direction_pin>;
+
+ compatible = "ti,omap-dmtimer-pwm";
+ #pwm-cells = <3>;
+ ti,timers = <&timer8>;
+ ti,clock-source = <0x01>;
+ };
+
+ pwm9: dmtimer-pwm {
+ pinctrl-names = "default";
+ pinctrl-0 = <&vibrator_enable_pin>;
+
+ compatible = "ti,omap-dmtimer-pwm";
+ #pwm-cells = <3>;
+ ti,timers = <&timer9>;
+ ti,clock-source = <0x01>;
+ };
+
+ vibrator {
+ compatible = "pwm-vibrator";
+ pwms = <&pwm8 0 1000000000 0>,
+ <&pwm9 0 1000000000 0>;
+ pwm-names = "enable", "direction";
+ direction-duty-cycle-ns = <1000000000>;
+ };
+};
diff --git a/Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt b/Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt
index 11cc87aeb276..07bf0b9a5139 100644
--- a/Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt
+++ b/Documentation/devicetree/bindings/interrupt-controller/mediatek,sysirq.txt
@@ -17,6 +17,7 @@ Required properties:
"mediatek,mt6582-sysirq", "mediatek,mt6577-sysirq": for MT6582
"mediatek,mt6580-sysirq", "mediatek,mt6577-sysirq": for MT6580
"mediatek,mt6577-sysirq": for MT6577
+ "mediatek,mt2712-sysirq", "mediatek,mt6577-sysirq": for MT2712
"mediatek,mt2701-sysirq", "mediatek,mt6577-sysirq": for MT2701
- interrupt-controller : Identifies the node as an interrupt controller
- #interrupt-cells : Use the same format as specified by GIC in arm,gic.txt.
diff --git a/Documentation/devicetree/bindings/iommu/qcom,iommu.txt b/Documentation/devicetree/bindings/iommu/qcom,iommu.txt
new file mode 100644
index 000000000000..b2641ceb2b40
--- /dev/null
+++ b/Documentation/devicetree/bindings/iommu/qcom,iommu.txt
@@ -0,0 +1,121 @@
+* QCOM IOMMU v1 Implementation
+
+Qualcomm "B" family devices which are not compatible with arm-smmu have
+a similar looking IOMMU but without access to the global register space,
+and optionally requiring additional configuration to route context irqs
+to non-secure vs secure interrupt line.
+
+** Required properties:
+
+- compatible : Should be one of:
+
+ "qcom,msm8916-iommu"
+
+ Followed by "qcom,msm-iommu-v1".
+
+- clock-names : Should be a pair of "iface" (required for IOMMUs
+ register group access) and "bus" (required for
+ the IOMMUs underlying bus access).
+
+- clocks : Phandles for respective clocks described by
+ clock-names.
+
+- #address-cells : must be 1.
+
+- #size-cells : must be 1.
+
+- #iommu-cells : Must be 1. Index identifies the context-bank #.
+
+- ranges : Base address and size of the iommu context banks.
+
+- qcom,iommu-secure-id : secure-id.
+
+- List of sub-nodes, one per translation context bank. Each sub-node
+ has the following required properties:
+
+ - compatible : Should be one of:
+ - "qcom,msm-iommu-v1-ns" : non-secure context bank
+ - "qcom,msm-iommu-v1-sec" : secure context bank
+ - reg : Base address and size of context bank within the iommu
+ - interrupts : The context fault irq.
+
+** Optional properties:
+
+- reg : Base address and size of the SMMU local base, should
+ be only specified if the iommu requires configuration
+ for routing of context bank irq's to secure vs non-
+ secure lines. (Ie. if the iommu contains secure
+ context banks)
+
+
+** Examples:
+
+ apps_iommu: iommu@1e20000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ #iommu-cells = <1>;
+ compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1";
+ ranges = <0 0x1e20000 0x40000>;
+ reg = <0x1ef0000 0x3000>;
+ clocks = <&gcc GCC_SMMU_CFG_CLK>,
+ <&gcc GCC_APSS_TCU_CLK>;
+ clock-names = "iface", "bus";
+ qcom,iommu-secure-id = <17>;
+
+ // mdp_0:
+ iommu-ctx@4000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x4000 0x1000>;
+ interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ // venus_ns:
+ iommu-ctx@5000 {
+ compatible = "qcom,msm-iommu-v1-sec";
+ reg = <0x5000 0x1000>;
+ interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
+ gpu_iommu: iommu@1f08000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ #iommu-cells = <1>;
+ compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1";
+ ranges = <0 0x1f08000 0x10000>;
+ clocks = <&gcc GCC_SMMU_CFG_CLK>,
+ <&gcc GCC_GFX_TCU_CLK>;
+ clock-names = "iface", "bus";
+ qcom,iommu-secure-id = <18>;
+
+ // gfx3d_user:
+ iommu-ctx@1000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x1000 0x1000>;
+ interrupts = <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ // gfx3d_priv:
+ iommu-ctx@2000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x2000 0x1000>;
+ interrupts = <GIC_SPI 242 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
+ ...
+
+ venus: video-codec@1d00000 {
+ ...
+ iommus = <&apps_iommu 5>;
+ };
+
+ mdp: mdp@1a01000 {
+ ...
+ iommus = <&apps_iommu 4>;
+ };
+
+ gpu@01c00000 {
+ ...
+ iommus = <&gpu_iommu 1>, <&gpu_iommu 2>;
+ };
diff --git a/Documentation/devicetree/bindings/iommu/rockchip,iommu.txt b/Documentation/devicetree/bindings/iommu/rockchip,iommu.txt
index 9a55ac3735e5..2098f7732264 100644
--- a/Documentation/devicetree/bindings/iommu/rockchip,iommu.txt
+++ b/Documentation/devicetree/bindings/iommu/rockchip,iommu.txt
@@ -15,6 +15,11 @@ Required properties:
to associate with its master device. See:
Documentation/devicetree/bindings/iommu/iommu.txt
+Optional properties:
+- rockchip,disable-mmu-reset : Don't use the mmu reset operation.
+ Some mmu instances may produce unexpected results
+ when the reset operation is used.
+
Example:
vopl_mmu: iommu@ff940300 {
diff --git a/Documentation/devicetree/bindings/leds/ams,as3645a.txt b/Documentation/devicetree/bindings/leds/ams,as3645a.txt
index 12c5ef26ec73..fdc40e354a64 100644
--- a/Documentation/devicetree/bindings/leds/ams,as3645a.txt
+++ b/Documentation/devicetree/bindings/leds/ams,as3645a.txt
@@ -15,11 +15,14 @@ Required properties
compatible : Must be "ams,as3645a".
reg : The I2C address of the device. Typically 0x30.
+#address-cells : 1
+#size-cells : 0
-Required properties of the "flash" child node
-=============================================
+Required properties of the flash child node (0)
+===============================================
+reg: 0
flash-timeout-us: Flash timeout in microseconds. The value must be in
the range [100000, 850000] and divisible by 50000.
flash-max-microamp: Maximum flash current in microamperes. Has to be
@@ -33,20 +36,21 @@ ams,input-max-microamp: Maximum flash controller input current. The
and divisible by 50000.
-Optional properties of the "flash" child node
-=============================================
+Optional properties of the flash child node
+===========================================
label : The label of the flash LED.
-Required properties of the "indicator" child node
-=================================================
+Required properties of the indicator child node (1)
+===================================================
+reg: 1
led-max-microamp: Maximum indicator current. The allowed values are
2500, 5000, 7500 and 10000.
-Optional properties of the "indicator" child node
-=================================================
+Optional properties of the indicator child node
+===============================================
label : The label of the indicator LED.
@@ -55,16 +59,20 @@ Example
=======
as3645a@30 {
+ #address-cells: 1
+ #size-cells: 0
reg = <0x30>;
compatible = "ams,as3645a";
- flash {
+ flash@0 {
+ reg = <0x0>;
flash-timeout-us = <150000>;
flash-max-microamp = <320000>;
led-max-microamp = <60000>;
ams,input-max-microamp = <1750000>;
label = "as3645a:flash";
};
- indicator {
+ indicator@1 {
+ reg = <0x1>;
led-max-microamp = <10000>;
label = "as3645a:indicator";
};
diff --git a/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt b/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
index 21277a56e94c..ddf46b8856a5 100644
--- a/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
+++ b/Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
@@ -15,6 +15,9 @@ Required properties:
the register.
- "smi" : It's the clock for transfer data and command.
+Required property for mt2701:
+- mediatek,larb-id :the hardware id of this larb.
+
Example:
larb1: larb@16010000 {
compatible = "mediatek,mt8173-smi-larb";
@@ -25,3 +28,15 @@ Example:
<&vdecsys CLK_VDEC_LARB_CKEN>;
clock-names = "apb", "smi";
};
+
+Example for mt2701:
+ larb0: larb@14010000 {
+ compatible = "mediatek,mt2701-smi-larb";
+ reg = <0 0x14010000 0 0x1000>;
+ mediatek,smi = <&smi_common>;
+ mediatek,larb-id = <0>;
+ clocks = <&mmsys CLK_MM_SMI_LARB0>,
+ <&mmsys CLK_MM_SMI_LARB0>;
+ clock-names = "apb", "smi";
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_DISP>;
+ };
diff --git a/Documentation/devicetree/bindings/mips/lantiq/fpi-bus.txt b/Documentation/devicetree/bindings/mips/lantiq/fpi-bus.txt
new file mode 100644
index 000000000000..0a2df4338332
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/lantiq/fpi-bus.txt
@@ -0,0 +1,31 @@
+Lantiq XWAY SoC FPI BUS binding
+============================
+
+
+-------------------------------------------------------------------------------
+Required properties:
+- compatible : Should be one of
+ "lantiq,xrx200-fpi"
+- reg : The address and length of the XBAR
+ configuration register.
+ Address and length of the FPI bus itself.
+- lantiq,rcu : A phandle to the RCU syscon
+- lantiq,offset-endianness : Offset of the endianness configuration
+ register
+
+-------------------------------------------------------------------------------
+Example for the FPI on the xrx200 SoCs:
+ fpi@10000000 {
+ compatible = "lantiq,xrx200-fpi";
+ ranges = <0x0 0x10000000 0xf000000>;
+ reg = <0x1f400000 0x1000>,
+ <0x10000000 0xf000000>;
+ lantiq,rcu = <&rcu0>;
+ lantiq,offset-endianness = <0x4c>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ gptu@e100a00 {
+ ......
+ };
+ };
diff --git a/Documentation/devicetree/bindings/mips/lantiq/rcu-gphy.txt b/Documentation/devicetree/bindings/mips/lantiq/rcu-gphy.txt
new file mode 100644
index 000000000000..a0c19bd1ce66
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/lantiq/rcu-gphy.txt
@@ -0,0 +1,36 @@
+Lantiq XWAY SoC GPHY binding
+============================
+
+This binding describes a software-defined ethernet PHY, provided by the RCU
+module on newer Lantiq XWAY SoCs (xRX200 and newer).
+
+-------------------------------------------------------------------------------
+Required properties:
+- compatible : Should be one of
+ "lantiq,xrx200a1x-gphy"
+ "lantiq,xrx200a2x-gphy"
+ "lantiq,xrx300-gphy"
+ "lantiq,xrx330-gphy"
+- reg : Addrress of the GPHY FW load address register
+- resets : Must reference the RCU GPHY reset bit
+- reset-names : One entry, value must be "gphy" or optional "gphy2"
+- clocks : A reference to the (PMU) GPHY clock gate
+
+Optional properties:
+- lantiq,gphy-mode : GPHY_MODE_GE (default) or GPHY_MODE_FE as defined in
+ <dt-bindings/mips/lantiq_xway_gphy.h>
+
+
+-------------------------------------------------------------------------------
+Example for the GPHys on the xRX200 SoCs:
+
+#include <dt-bindings/mips/lantiq_rcu_gphy.h>
+ gphy0: gphy@20 {
+ compatible = "lantiq,xrx200a2x-gphy";
+ reg = <0x20 0x4>;
+
+ resets = <&reset0 31 30>, <&reset1 7 7>;
+ reset-names = "gphy", "gphy2";
+ clocks = <&pmu0 XRX200_PMU_GATE_GPHY>;
+ lantiq,gphy-mode = <GPHY_MODE_GE>;
+ };
diff --git a/Documentation/devicetree/bindings/mips/lantiq/rcu.txt b/Documentation/devicetree/bindings/mips/lantiq/rcu.txt
new file mode 100644
index 000000000000..a086f1e1cdd7
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/lantiq/rcu.txt
@@ -0,0 +1,89 @@
+Lantiq XWAY SoC RCU binding
+===========================
+
+This binding describes the RCU (reset controller unit) multifunction device,
+where each sub-device has it's own set of registers.
+
+The RCU register range is used for multiple purposes. Mostly one device
+uses one or multiple register exclusively, but for some registers some
+bits are for one driver and some other bits are for a different driver.
+With this patch all accesses to the RCU registers will go through
+syscon.
+
+
+-------------------------------------------------------------------------------
+Required properties:
+- compatible : The first and second values must be:
+ "lantiq,xrx200-rcu", "simple-mfd", "syscon"
+- reg : The address and length of the system control registers
+
+
+-------------------------------------------------------------------------------
+Example of the RCU bindings on a xRX200 SoC:
+ rcu0: rcu@203000 {
+ compatible = "lantiq,xrx200-rcu", "simple-mfd", "syscon";
+ reg = <0x203000 0x100>;
+ ranges = <0x0 0x203000 0x100>;
+ big-endian;
+
+ gphy0: gphy@20 {
+ compatible = "lantiq,xrx200a2x-gphy";
+ reg = <0x20 0x4>;
+
+ resets = <&reset0 31 30>, <&reset1 7 7>;
+ reset-names = "gphy", "gphy2";
+ lantiq,gphy-mode = <GPHY_MODE_GE>;
+ };
+
+ gphy1: gphy@68 {
+ compatible = "lantiq,xrx200a2x-gphy";
+ reg = <0x68 0x4>;
+
+ resets = <&reset0 29 28>, <&reset1 6 6>;
+ reset-names = "gphy", "gphy2";
+ lantiq,gphy-mode = <GPHY_MODE_GE>;
+ };
+
+ reset0: reset-controller@10 {
+ compatible = "lantiq,xrx200-reset";
+ reg = <0x10 4>, <0x14 4>;
+
+ #reset-cells = <2>;
+ };
+
+ reset1: reset-controller@48 {
+ compatible = "lantiq,xrx200-reset";
+ reg = <0x48 4>, <0x24 4>;
+
+ #reset-cells = <2>;
+ };
+
+ usb_phy0: usb2-phy@18 {
+ compatible = "lantiq,xrx200-usb2-phy";
+ reg = <0x18 4>, <0x38 4>;
+ status = "disabled";
+
+ resets = <&reset1 4 4>, <&reset0 4 4>;
+ reset-names = "phy", "ctrl";
+ #phy-cells = <0>;
+ };
+
+ usb_phy1: usb2-phy@34 {
+ compatible = "lantiq,xrx200-usb2-phy";
+ reg = <0x34 4>, <0x3C 4>;
+ status = "disabled";
+
+ resets = <&reset1 5 4>, <&reset0 4 4>;
+ reset-names = "phy", "ctrl";
+ #phy-cells = <0>;
+ };
+
+ reboot@10 {
+ compatible = "syscon-reboot";
+ reg = <0x10 4>;
+
+ regmap = <&rcu0>;
+ offset = <0x10>;
+ mask = <0x40000000>;
+ };
+ };
diff --git a/Documentation/devicetree/bindings/mips/ni.txt b/Documentation/devicetree/bindings/mips/ni.txt
new file mode 100644
index 000000000000..722bf2d62da9
--- /dev/null
+++ b/Documentation/devicetree/bindings/mips/ni.txt
@@ -0,0 +1,7 @@
+National Instruments MIPS platforms
+
+required root node properties:
+ - compatible: must be "ni,169445"
+
+CPU Nodes
+ - compatible: must be "mti,mips14KEc"
diff --git a/Documentation/devicetree/bindings/mips/ralink.txt b/Documentation/devicetree/bindings/mips/ralink.txt
index b35a8d04f8b6..a16e8d7fe56c 100644
--- a/Documentation/devicetree/bindings/mips/ralink.txt
+++ b/Documentation/devicetree/bindings/mips/ralink.txt
@@ -15,3 +15,4 @@ value must be one of the following values:
ralink,rt5350-soc
ralink,mt7620a-soc
ralink,mt7620n-soc
+ ralink,mt7628a-soc
diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 0e026c151c1c..3a4ac401e6f9 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -1,33 +1,55 @@
-* TI Highspeed MMC host controller for OMAP
+* TI Highspeed MMC host controller for OMAP and 66AK2G family.
-The Highspeed MMC Host Controller on TI OMAP family
+The Highspeed MMC Host Controller on TI OMAP and 66AK2G family
provides an interface for MMC, SD, and SDIO types of memory cards.
This file documents differences between the core properties described
by mmc.txt and the properties used by the omap_hsmmc driver.
Required properties:
+--------------------
- compatible:
Should be "ti,omap2-hsmmc", for OMAP2 controllers
Should be "ti,omap3-hsmmc", for OMAP3 controllers
Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0
Should be "ti,omap4-hsmmc", for OMAP4 controllers
Should be "ti,am33xx-hsmmc", for AM335x controllers
-- ti,hwmods: Must be "mmc<n>", n is controller instance starting 1
+ Should be "ti,k2g-hsmmc", "ti,omap4-hsmmc" for 66AK2G controllers.
+
+SoC specific required properties:
+---------------------------------
+The following are mandatory properties for OMAPs, AM33xx and AM43xx SoCs only:
+- ti,hwmods: Must be "mmc<n>", n is controller instance starting 1.
+
+The following are mandatory properties for 66AK2G SoCs only:
+- power-domains:Should contain a phandle to a PM domain provider node
+ and an args specifier containing the MMC device id
+ value. This property is as per the binding,
+ Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+- clocks: Must contain an entry for each entry in clock-names. Should
+ be defined as per the he appropriate clock bindings consumer
+ usage in Documentation/devicetree/bindings/clock/ti,sci-clk.txt
+- clock-names: Shall be "fck" for the functional clock,
+ and "mmchsdb_fck" for the debounce clock.
+
Optional properties:
-ti,dual-volt: boolean, supports dual voltage cards
-<supply-name>-supply: phandle to the regulator device tree node
-"supply-name" examples are "vmmc", "vmmc_aux"(deprecated)/"vqmmc" etc
-ti,non-removable: non-removable slot (like eMMC)
-ti,needs-special-reset: Requires a special softreset sequence
-ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
-dmas: List of DMA specifiers with the controller specific format
-as described in the generic DMA client binding. A tx and rx
-specifier is required.
-dma-names: List of DMA request names. These strings correspond
-1:1 with the DMA specifiers listed in dmas. The string naming is
-to be "rx" and "tx" for RX and TX DMA requests, respectively.
+--------------------
+- ti,dual-volt: boolean, supports dual voltage cards
+- <supply-name>-supply: phandle to the regulator device tree node
+ "supply-name" examples are "vmmc",
+ "vmmc_aux"(deprecated)/"vqmmc" etc
+- ti,non-removable: non-removable slot (like eMMC)
+- ti,needs-special-reset: Requires a special softreset sequence
+- ti,needs-special-hs-handling: HSMMC IP needs special setting
+ for handling High Speed
+- dmas: List of DMA specifiers with the controller specific
+ format as described in the generic DMA client
+ binding. A tx and rx specifier is required.
+- dma-names: List of DMA request names. These strings correspond
+ 1:1 with the DMA specifiers listed in dmas.
+ The string naming is to be "rx" and "tx" for
+ RX and TX DMA requests, respectively.
Examples:
diff --git a/Documentation/devicetree/bindings/mtd/qcom_nandc.txt b/Documentation/devicetree/bindings/mtd/qcom_nandc.txt
index 70dd5118a324..73d336befa08 100644
--- a/Documentation/devicetree/bindings/mtd/qcom_nandc.txt
+++ b/Documentation/devicetree/bindings/mtd/qcom_nandc.txt
@@ -1,11 +1,20 @@
* Qualcomm NAND controller
Required properties:
-- compatible: should be "qcom,ipq806x-nand"
+- compatible: must be one of the following:
+ * "qcom,ipq806x-nand" - for EBI2 NAND controller being used in IPQ806x
+ SoC and it uses ADM DMA
+ * "qcom,ipq4019-nand" - for QPIC NAND controller v1.4.0 being used in
+ IPQ4019 SoC and it uses BAM DMA
+ * "qcom,ipq8074-nand" - for QPIC NAND controller v1.5.0 being used in
+ IPQ8074 SoC and it uses BAM DMA
+
- reg: MMIO address range
- clocks: must contain core clock and always on clock
- clock-names: must contain "core" for the core clock and "aon" for the
always on clock
+
+EBI2 specific properties:
- dmas: DMA specifier, consisting of a phandle to the ADM DMA
controller node and the channel number to be used for
NAND. Refer to dma.txt and qcom_adm.txt for more details
@@ -16,6 +25,12 @@ Required properties:
- qcom,data-crci: must contain the ADM data type CRCI block instance
number specified for the NAND controller on the given
platform
+
+QPIC specific properties:
+- dmas: DMA specifier, consisting of a phandle to the BAM DMA
+ and the channel number to be used for NAND. Refer to
+ dma.txt, qcom_bam_dma.txt for more details
+- dma-names: must contain all 3 channel names : "tx", "rx", "cmd"
- #address-cells: <1> - subnodes give the chip-select number
- #size-cells: <0>
@@ -26,7 +41,6 @@ chip-selects which (may) contain NAND flash chips. Their properties are as
follows.
Required properties:
-- compatible: should contain "qcom,nandcs"
- reg: a single integer representing the chip-select
number (e.g., 0, 1, 2, etc.)
- #address-cells: see partition.txt
@@ -43,8 +57,8 @@ partition.txt for more detail.
Example:
-nand@1ac00000 {
- compatible = "qcom,ebi2-nandc";
+nand-controller@1ac00000 {
+ compatible = "qcom,ipq806x-nand";
reg = <0x1ac00000 0x800>;
clocks = <&gcc EBI2_CLK>,
@@ -59,8 +73,7 @@ nand@1ac00000 {
#address-cells = <1>;
#size-cells = <0>;
- nandcs@0 {
- compatible = "qcom,nandcs";
+ nand@0 {
reg = <0>;
nand-ecc-strength = <4>;
@@ -84,3 +97,43 @@ nand@1ac00000 {
};
};
};
+
+nand-controller@79b0000 {
+ compatible = "qcom,ipq4019-nand";
+ reg = <0x79b0000 0x1000>;
+
+ clocks = <&gcc GCC_QPIC_CLK>,
+ <&gcc GCC_QPIC_AHB_CLK>;
+ clock-names = "core", "aon";
+
+ dmas = <&qpicbam 0>,
+ <&qpicbam 1>,
+ <&qpicbam 2>;
+ dma-names = "tx", "rx", "cmd";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ nand@0 {
+ reg = <0>;
+ nand-ecc-strength = <4>;
+ nand-ecc-step-size = <512>;
+ nand-bus-width = <8>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "boot-nand";
+ reg = <0 0x58a0000>;
+ };
+
+ partition@58a0000 {
+ label = "fs-nand";
+ reg = <0x58a0000 0x4000000>;
+ };
+ };
+ };
+};
diff --git a/Documentation/devicetree/bindings/net/can/c_can.txt b/Documentation/devicetree/bindings/net/can/c_can.txt
index 5a1d8b0c39e9..2d504256b0d8 100644
--- a/Documentation/devicetree/bindings/net/can/c_can.txt
+++ b/Documentation/devicetree/bindings/net/can/c_can.txt
@@ -11,9 +11,20 @@ Required properties:
- interrupts : property with a value describing the interrupt
number
-Optional properties:
+The following are mandatory properties for DRA7x, AM33xx and AM43xx SoCs only:
- ti,hwmods : Must be "d_can<n>" or "c_can<n>", n being the
instance number
+
+The following are mandatory properties for Keystone 2 66AK2G SoCs only:
+- power-domains : Should contain a phandle to a PM domain provider node
+ and an args specifier containing the DCAN device id
+ value. This property is as per the binding,
+ Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+- clocks : CAN functional clock phandle. This property is as per the
+ binding,
+ Documentation/devicetree/bindings/clock/ti,sci-clk.txt
+
+Optional properties:
- syscon-raminit : Handle to system control region that contains the
RAMINIT register, register offset to the RAMINIT
register and the CAN instance number (0 offset).
diff --git a/Documentation/devicetree/bindings/net/marvell-pp2.txt b/Documentation/devicetree/bindings/net/marvell-pp2.txt
index 7e2dad08a12e..1814fa13f6ab 100644
--- a/Documentation/devicetree/bindings/net/marvell-pp2.txt
+++ b/Documentation/devicetree/bindings/net/marvell-pp2.txt
@@ -21,8 +21,9 @@ Required properties:
- main controller clock (for both armada-375-pp2 and armada-7k-pp2)
- GOP clock (for both armada-375-pp2 and armada-7k-pp2)
- MG clock (only for armada-7k-pp2)
-- clock-names: names of used clocks, must be "pp_clk", "gop_clk" and
- "mg_clk" (the latter only for armada-7k-pp2).
+ - AXI clock (only for armada-7k-pp2)
+- clock-names: names of used clocks, must be "pp_clk", "gop_clk", "mg_clk"
+ and "axi_clk" (the 2 latter only for armada-7k-pp2).
The ethernet ports are represented by subnodes. At least one port is
required.
@@ -78,8 +79,9 @@ Example for marvell,armada-7k-pp2:
cpm_ethernet: ethernet@0 {
compatible = "marvell,armada-7k-pp22";
reg = <0x0 0x100000>, <0x129000 0xb000>;
- clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>, <&cpm_syscon0 1 5>;
- clock-names = "pp_clk", "gop_clk", "gp_clk";
+ clocks = <&cpm_syscon0 1 3>, <&cpm_syscon0 1 9>,
+ <&cpm_syscon0 1 5>, <&cpm_syscon0 1 18>;
+ clock-names = "pp_clk", "gop_clk", "gp_clk", "axi_clk";
eth0: eth0 {
interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
diff --git a/Documentation/devicetree/bindings/net/mediatek-net.txt b/Documentation/devicetree/bindings/net/mediatek-net.txt
index 1d1168b805cc..214eaa9a6683 100644
--- a/Documentation/devicetree/bindings/net/mediatek-net.txt
+++ b/Documentation/devicetree/bindings/net/mediatek-net.txt
@@ -20,8 +20,10 @@ Required properties:
"ethif", "esw", "gp0", "gp1", "gp2", "sgmii_tx250m", "sgmii_rx250m",
"sgmii_cdr_ref", "sgmii_cdr_fb", "sgmii_ck", "eth2pll" : For MT7622 SoC
- power-domains: phandle to the power domain that the ethernet is part of
-- resets: Should contain a phandle to the ethsys reset signal
-- reset-names: Should contain the reset signal name "eth"
+- resets: Should contain phandles to the ethsys reset signals
+- reset-names: Should contain the names of reset signal listed in the resets
+ property
+ These are "fe", "gmac" and "ppe"
- mediatek,ethsys: phandle to the syscon node that handles the port setup
- mediatek,sgmiisys: phandle to the syscon node that handles the SGMII setup
which is required for those SoCs equipped with SGMII such as MT7622 SoC.
diff --git a/Documentation/devicetree/bindings/net/rockchip-dwmac.txt b/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
index 6af8eed1adeb..9c16ee2965a2 100644
--- a/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
+++ b/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
@@ -4,6 +4,7 @@ The device node has following properties.
Required properties:
- compatible: should be "rockchip,<name>-gamc"
+ "rockchip,rk3128-gmac": found on RK312x SoCs
"rockchip,rk3228-gmac": found on RK322x SoCs
"rockchip,rk3288-gmac": found on RK3288 SoCs
"rockchip,rk3328-gmac": found on RK3328 SoCs
diff --git a/Documentation/devicetree/bindings/pci/mvebu-pci.txt b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
index 127ae1f53e5a..6173af6885f8 100644
--- a/Documentation/devicetree/bindings/pci/mvebu-pci.txt
+++ b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
@@ -276,7 +276,7 @@ pcie-controller {
clocks = <&gateclk 26>;
};
- pcie@10,0 {
+ pcie@a,0 {
device_type = "pci";
assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
reg = <0x5000 0 0 0 0>;
diff --git a/Documentation/devicetree/bindings/phy/phy-lantiq-rcu-usb2.txt b/Documentation/devicetree/bindings/phy/phy-lantiq-rcu-usb2.txt
new file mode 100644
index 000000000000..643948b6b576
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/phy-lantiq-rcu-usb2.txt
@@ -0,0 +1,40 @@
+Lantiq XWAY SoC RCU USB 1.1/2.0 PHY binding
+===========================================
+
+This binding describes the USB PHY hardware provided by the RCU module on the
+Lantiq XWAY SoCs.
+
+This node has to be a sub node of the Lantiq RCU block.
+
+-------------------------------------------------------------------------------
+Required properties (controller (parent) node):
+- compatible : Should be one of
+ "lantiq,ase-usb2-phy"
+ "lantiq,danube-usb2-phy"
+ "lantiq,xrx100-usb2-phy"
+ "lantiq,xrx200-usb2-phy"
+ "lantiq,xrx300-usb2-phy"
+- reg : Defines the following sets of registers in the parent
+ syscon device
+ - Offset of the USB PHY configuration register
+ - Offset of the USB Analog configuration
+ register (only for xrx200 and xrx200)
+- clocks : References to the (PMU) "phy" clk gate.
+- clock-names : Must be "phy"
+- resets : References to the RCU USB configuration reset bits.
+- reset-names : Must be one of the following:
+ "phy" (optional)
+ "ctrl" (shared)
+
+-------------------------------------------------------------------------------
+Example for the USB PHYs on an xRX200 SoC:
+ usb_phy0: usb2-phy@18 {
+ compatible = "lantiq,xrx200-usb2-phy";
+ reg = <0x18 4>, <0x38 4>;
+
+ clocks = <&pmu PMU_GATE_USB0_PHY>;
+ clock-names = "phy";
+ resets = <&reset1 4 4>, <&reset0 4 4>;
+ reset-names = "phy", "ctrl";
+ #phy-cells = <0>;
+ };
diff --git a/Documentation/devicetree/bindings/power/renesas,apmu.txt b/Documentation/devicetree/bindings/power/renesas,apmu.txt
index 84404c9edff7..af21502e939c 100644
--- a/Documentation/devicetree/bindings/power/renesas,apmu.txt
+++ b/Documentation/devicetree/bindings/power/renesas,apmu.txt
@@ -1,12 +1,13 @@
DT bindings for the Renesas Advanced Power Management Unit
-Renesas R-Car line of SoCs utilize one or more APMU hardware units
+Renesas R-Car and RZ/G1 SoCs utilize one or more APMU hardware units
for CPU core power domain control including SMP boot and CPU Hotplug.
Required properties:
- compatible: Should be "renesas,<soctype>-apmu", "renesas,apmu" as fallback.
Examples with soctypes are:
+ - "renesas,r8a7743-apmu" (RZ/G1M)
- "renesas,r8a7790-apmu" (R-Car H2)
- "renesas,r8a7791-apmu" (R-Car M2-W)
- "renesas,r8a7792-apmu" (R-Car V2H)
diff --git a/Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt b/Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt
index d91715bc8d52..98cc8c09d02d 100644
--- a/Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt
+++ b/Documentation/devicetree/bindings/power/renesas,rcar-sysc.txt
@@ -17,6 +17,7 @@ Required properties:
- "renesas,r8a7794-sysc" (R-Car E2)
- "renesas,r8a7795-sysc" (R-Car H3)
- "renesas,r8a7796-sysc" (R-Car M3-W)
+ - "renesas,r8a77995-sysc" (R-Car D3)
- reg: Address start and address range for the device.
- #power-domain-cells: Must be 1.
diff --git a/Documentation/devicetree/bindings/power/supply/bq24190.txt b/Documentation/devicetree/bindings/power/supply/bq24190.txt
new file mode 100644
index 000000000000..9e517d307070
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/supply/bq24190.txt
@@ -0,0 +1,51 @@
+TI BQ24190 Li-Ion Battery Charger
+
+Required properties:
+- compatible: contains one of the following:
+ * "ti,bq24190"
+ * "ti,bq24192i"
+- reg: integer, I2C address of the charger.
+- interrupts[-extended]: configuration for charger INT pin.
+
+Optional properties:
+- monitored-battery: phandle of battery characteristics devicetree node
+ The charger uses the following battery properties:
+ + precharge-current-microamp: maximum charge current during precharge
+ phase (typically 20% of battery capacity).
+ + charge-term-current-microamp: a charge cycle terminates when the
+ battery voltage is above recharge threshold, and the current is below
+ this setting (typically 10% of battery capacity).
+ See also Documentation/devicetree/bindings/power/supply/battery.txt
+- ti,system-minimum-microvolt: when power is connected and the battery is below
+ minimum system voltage, the system will be regulated above this setting.
+
+Notes:
+- Some circuit boards wire the chip's "OTG" pin high (enabling 500mA default
+ charge current on USB SDP ports, among other features). To simulate this on
+ boards that wire the pin to a GPIO, set a gpio-hog.
+
+Example:
+
+ bat: battery {
+ compatible = "simple-battery";
+ precharge-current-microamp = <256000>;
+ charge-term-current-microamp = <128000>;
+ // etc.
+ };
+
+ bq24190: charger@6a {
+ compatible = "ti,bq24190";
+ reg = <0x6a>;
+ interrupts-extended = <&gpiochip 10 IRQ_TYPE_EDGE_FALLING>;
+ monitored-battery = <&bat>;
+ ti,system-minimum-microvolt = <3200000>;
+ };
+
+ &twl_gpio {
+ otg {
+ gpio-hog;
+ gpios = <6 0>;
+ output-high;
+ line-name = "otg-gpio";
+ };
+ };
diff --git a/Documentation/devicetree/bindings/power/supply/ltc2941.txt b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
index a9d7aa60558b..3b9ba147b041 100644
--- a/Documentation/devicetree/bindings/power/supply/ltc2941.txt
+++ b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
@@ -1,13 +1,14 @@
-binding for LTC2941 and LTC2943 battery gauges
+binding for LTC2941, LTC2942, LTC2943 and LTC2944 battery gauges
-Both the LTC2941 and LTC2943 measure battery capacity.
-The LTC2943 is compatible with the LTC2941, it adds voltage and
-temperature monitoring, and uses a slightly different conversion
-formula for the charge counter.
+All chips measure battery capacity.
+The LTC2942 is pin compatible with the LTC2941, it adds voltage and
+temperature monitoring, and is runtime detected. LTC2943 and LTC2944
+is software compatible, uses a slightly different conversion formula
+for the charge counter and adds voltage, current and temperature monitoring.
Required properties:
-- compatible: Should contain "lltc,ltc2941" or "lltc,ltc2943" which also
- indicates the type of I2C chip attached.
+- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942", "lltc,ltc2943"
+ or "lltc,ltc2944" which also indicates the type of I2C chip attached.
- reg: The 7-bit I2C address.
- lltc,resistor-sense: The sense resistor value in milli-ohms. Can be a 32-bit
negative value when the battery has been connected to the wrong end of the
diff --git a/Documentation/devicetree/bindings/power/wakeup-source.txt b/Documentation/devicetree/bindings/power/wakeup-source.txt
index 963c6dfd484d..3c81f78b5c27 100644
--- a/Documentation/devicetree/bindings/power/wakeup-source.txt
+++ b/Documentation/devicetree/bindings/power/wakeup-source.txt
@@ -20,13 +20,12 @@ List of legacy properties and respective binding document
1. "enable-sdio-wakeup" Documentation/devicetree/bindings/mmc/mmc.txt
2. "gpio-key,wakeup" Documentation/devicetree/bindings/input/gpio-keys{,-polled}.txt
3. "has-tpo" Documentation/devicetree/bindings/rtc/rtc-opal.txt
-4. "isil,irq2-can-wakeup-machine" Documentation/devicetree/bindings/rtc/isil,isl12057.txt
-5. "linux,wakeup" Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt
+4. "linux,wakeup" Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt
Documentation/devicetree/bindings/mfd/tc3589x.txt
Documentation/devicetree/bindings/input/ads7846.txt
-6. "linux,keypad-wakeup" Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt
-7. "linux,input-wakeup" Documentation/devicetree/bindings/input/samsung-keypad.txt
-8. "nvidia,wakeup-source" Documentation/devicetree/bindings/input/nvidia,tegra20-kbc.txt
+5. "linux,keypad-wakeup" Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt
+6. "linux,input-wakeup" Documentation/devicetree/bindings/input/samsung-keypad.txt
+7. "nvidia,wakeup-source" Documentation/devicetree/bindings/input/nvidia,tegra20-kbc.txt
Examples
--------
diff --git a/Documentation/devicetree/bindings/pwm/pwm-bcm2835.txt b/Documentation/devicetree/bindings/pwm/pwm-bcm2835.txt
index cf573e85b11d..8cf87d1bfca5 100644
--- a/Documentation/devicetree/bindings/pwm/pwm-bcm2835.txt
+++ b/Documentation/devicetree/bindings/pwm/pwm-bcm2835.txt
@@ -6,7 +6,7 @@ Required properties:
- clocks: This clock defines the base clock frequency of the PWM hardware
system, the period and the duty_cycle of the PWM signal is a multiple of
the base period.
-- #pwm-cells: Should be 2. See pwm.txt in this directory for a description of
+- #pwm-cells: Should be 3. See pwm.txt in this directory for a description of
the cells format.
Examples:
@@ -15,7 +15,7 @@ pwm@2020c000 {
compatible = "brcm,bcm2835-pwm";
reg = <0x2020c000 0x28>;
clocks = <&clk_pwm>;
- #pwm-cells = <2>;
+ #pwm-cells = <3>;
};
clocks {
diff --git a/Documentation/devicetree/bindings/pwm/pwm-mediatek.txt b/Documentation/devicetree/bindings/pwm/pwm-mediatek.txt
index 54c59b0560ad..ef8bd3cb67ab 100644
--- a/Documentation/devicetree/bindings/pwm/pwm-mediatek.txt
+++ b/Documentation/devicetree/bindings/pwm/pwm-mediatek.txt
@@ -2,6 +2,8 @@ MediaTek PWM controller
Required properties:
- compatible: should be "mediatek,<name>-pwm":
+ - "mediatek,mt2712-pwm": found on mt2712 SoC.
+ - "mediatek,mt7622-pwm": found on mt7622 SoC.
- "mediatek,mt7623-pwm": found on mt7623 SoC.
- reg: physical base address and length of the controller's registers.
- #pwm-cells: must be 2. See pwm.txt in this directory for a description of
@@ -10,7 +12,9 @@ Required properties:
- clock-names: must contain the following:
- "top": the top clock generator
- "main": clock used by the PWM core
- - "pwm1-5": the five per PWM clocks
+ - "pwm1-8": the eight per PWM clocks for mt2712
+ - "pwm1-6": the six per PWM clocks for mt7622
+ - "pwm1-5": the five per PWM clocks for mt7623
- pinctrl-names: Must contain a "default" entry.
- pinctrl-0: One property must exist for each entry in pinctrl-names.
See pinctrl/pinctrl-bindings.txt for details of the property values.
diff --git a/Documentation/devicetree/bindings/pwm/pwm-rockchip.txt b/Documentation/devicetree/bindings/pwm/pwm-rockchip.txt
index b8be3d09ee26..2c5e52a5bede 100644
--- a/Documentation/devicetree/bindings/pwm/pwm-rockchip.txt
+++ b/Documentation/devicetree/bindings/pwm/pwm-rockchip.txt
@@ -3,10 +3,17 @@ Rockchip PWM controller
Required properties:
- compatible: should be "rockchip,<name>-pwm"
"rockchip,rk2928-pwm": found on RK29XX,RK3066 and RK3188 SoCs
- "rockchip,rk3288-pwm": found on RK3288 SoC
+ "rockchip,rk3288-pwm": found on RK3288 SOC
+ "rockchip,rv1108-pwm", "rockchip,rk3288-pwm": found on RV1108 SoC
"rockchip,vop-pwm": found integrated in VOP on RK3288 SoC
- reg: physical base address and length of the controller's registers
- - clocks: phandle and clock specifier of the PWM reference clock
+ - clocks: See ../clock/clock-bindings.txt
+ - For older hardware (rk2928, rk3066, rk3188, rk3228, rk3288, rk3399):
+ - There is one clock that's used both to derive the functional clock
+ for the device and as the bus clock.
+ - For newer hardware (rk3328 and future socs): specified by name
+ - "pwm": This is used to derive the functional clock.
+ - "pclk": This is the APB bus clock.
- #pwm-cells: must be 2 (rk2928) or 3 (rk3288). See pwm.txt in this directory
for a description of the cell format.
diff --git a/Documentation/devicetree/bindings/pwm/pwm-tiecap.txt b/Documentation/devicetree/bindings/pwm/pwm-tiecap.txt
index 8007e839a716..06a363d9ccef 100644
--- a/Documentation/devicetree/bindings/pwm/pwm-tiecap.txt
+++ b/Documentation/devicetree/bindings/pwm/pwm-tiecap.txt
@@ -6,6 +6,7 @@ Required properties:
for am4372 - compatible = "ti,am4372-ecap", "ti,am3352-ecap", "ti,am33xx-ecap";
for da850 - compatible = "ti,da850-ecap", "ti,am3352-ecap", "ti,am33xx-ecap";
for dra746 - compatible = "ti,dra746-ecap", "ti,am3352-ecap";
+ for 66ak2g - compatible = "ti,k2g-ecap", "ti,am3352-ecap";
- #pwm-cells: should be 3. See pwm.txt in this directory for a description of
the cells format. The PWM channel index ranges from 0 to 4. The only third
cell flag supported by this binding is PWM_POLARITY_INVERTED.
diff --git a/Documentation/devicetree/bindings/pwm/pwm-zx.txt b/Documentation/devicetree/bindings/pwm/pwm-zx.txt
new file mode 100644
index 000000000000..a6bcc75c9164
--- /dev/null
+++ b/Documentation/devicetree/bindings/pwm/pwm-zx.txt
@@ -0,0 +1,22 @@
+ZTE ZX PWM controller
+
+Required properties:
+ - compatible: Should be "zte,zx296718-pwm".
+ - reg: Physical base address and length of the controller's registers.
+ - clocks : The phandle and specifier referencing the controller's clocks.
+ - clock-names: "pclk" for PCLK, "wclk" for WCLK to the PWM controller. The
+ PCLK is for register access, while WCLK is the reference clock for
+ calculating period and duty cycles.
+ - #pwm-cells: Should be 3. See pwm.txt in this directory for a description of
+ the cells format.
+
+Example:
+
+ pwm: pwm@1439000 {
+ compatible = "zte,zx296718-pwm";
+ reg = <0x1439000 0x1000>;
+ clocks = <&lsp1crm LSP1_PWM_PCLK>,
+ <&lsp1crm LSP1_PWM_WCLK>;
+ clock-names = "pclk", "wclk";
+ #pwm-cells = <3>;
+ };
diff --git a/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt b/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt
index b067e84a94b5..1aadc804dae4 100644
--- a/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt
+++ b/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt
@@ -6,7 +6,6 @@ Required Properties:
- "renesas,tpu-r8a73a4": for R8A77A4 (R-Mobile APE6) compatible PWM controller.
- "renesas,tpu-r8a7740": for R8A7740 (R-Mobile A1) compatible PWM controller.
- "renesas,tpu-r8a7790": for R8A7790 (R-Car H2) compatible PWM controller.
- - "renesas,tpu-sh7372": for SH7372 (SH-Mobile AP4) compatible PWM controller.
- "renesas,tpu": for generic R-Car TPU PWM controller.
- reg: Base address and length of each memory resource used by the PWM
diff --git a/Documentation/devicetree/bindings/remoteproc/imx-rproc.txt b/Documentation/devicetree/bindings/remoteproc/imx-rproc.txt
new file mode 100644
index 000000000000..fbcefd965dc4
--- /dev/null
+++ b/Documentation/devicetree/bindings/remoteproc/imx-rproc.txt
@@ -0,0 +1,33 @@
+NXP iMX6SX/iMX7D Co-Processor Bindings
+----------------------------------------
+
+This binding provides support for ARM Cortex M4 Co-processor found on some
+NXP iMX SoCs.
+
+Required properties:
+- compatible Should be one of:
+ "fsl,imx7d-cm4"
+ "fsl,imx6sx-cm4"
+- clocks Clock for co-processor (See: ../clock/clock-bindings.txt)
+- syscon Phandle to syscon block which provide access to
+ System Reset Controller
+
+Optional properties:
+- memory-region list of phandels to the reserved memory regions.
+ (See: ../reserved-memory/reserved-memory.txt)
+
+Example:
+ m4_reserved_sysmem1: cm4@80000000 {
+ reg = <0x80000000 0x80000>;
+ };
+
+ m4_reserved_sysmem2: cm4@81000000 {
+ reg = <0x81000000 0x80000>;
+ };
+
+ imx7d-cm4 {
+ compatible = "fsl,imx7d-cm4";
+ memory-region = <&m4_reserved_sysmem1>, <&m4_reserved_sysmem2>;
+ syscon = <&src>;
+ clocks = <&clks IMX7D_ARM_M4_ROOT_CLK>;
+ };
diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt b/Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt
index 75ad7b8df0b1..728e4193f7a6 100644
--- a/Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt
+++ b/Documentation/devicetree/bindings/remoteproc/qcom,adsp.txt
@@ -63,9 +63,10 @@ on the Qualcomm ADSP Hexagon core.
= SUBNODES
-The adsp node may have an subnode named "smd-edge" that describes the SMD edge,
-channels and devices related to the ADSP. See ../soc/qcom/qcom,smd.txt for
-details on how to describe the SMD edge.
+The adsp node may have an subnode named either "smd-edge" or "glink-edge" that
+describes the communication edge, channels and devices related to the ADSP.
+See ../soc/qcom/qcom,smd.txt and ../soc/qcom/qcom,glink.txt for details on how
+to describe these.
= EXAMPLE
diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt b/Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt
index 92347fe6890e..7ff3f7903f26 100644
--- a/Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt
+++ b/Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt
@@ -90,6 +90,11 @@ the memory regions used by the Hexagon firmware. Each sub-node must contain:
Value type: <phandle>
Definition: reference to the reserved-memory for the region
+The Hexagon node may also have an subnode named either "smd-edge" or
+"glink-edge" that describes the communication edge, channels and devices
+related to the Hexagon. See ../soc/qcom/qcom,smd.txt and
+../soc/qcom/qcom,glink.txt for details on how to describe these.
+
= EXAMPLE
The following example describes the resources needed to boot control the
Hexagon, as it is found on MSM8974 boards.
diff --git a/Documentation/devicetree/bindings/remoteproc/ti,davinci-rproc.txt b/Documentation/devicetree/bindings/remoteproc/ti,davinci-rproc.txt
new file mode 100644
index 000000000000..e44a97e21164
--- /dev/null
+++ b/Documentation/devicetree/bindings/remoteproc/ti,davinci-rproc.txt
@@ -0,0 +1,86 @@
+TI Davinci DSP devices
+=======================
+
+Binding status: Unstable - Subject to changes for DT representation of clocks
+ and resets
+
+The TI Davinci family of SoCs usually contains a TI DSP Core sub-system that
+is used to offload some of the processor-intensive tasks or algorithms, for
+achieving various system level goals.
+
+The processor cores in the sub-system usually contain additional sub-modules
+like L1 and/or L2 caches/SRAMs, an Interrupt Controller, an external memory
+controller, a dedicated local power/sleep controller etc. The DSP processor
+core used in Davinci SoCs is usually a C674x DSP CPU.
+
+DSP Device Node:
+================
+Each DSP Core sub-system is represented as a single DT node.
+
+Required properties:
+--------------------
+The following are the mandatory properties:
+
+- compatible: Should be one of the following,
+ "ti,da850-dsp" for DSPs on OMAP-L138 SoCs
+
+- reg: Should contain an entry for each value in 'reg-names'.
+ Each entry should have the memory region's start address
+ and the size of the region, the representation matching
+ the parent node's '#address-cells' and '#size-cells' values.
+
+- reg-names: Should contain strings with the following names, each
+ representing a specific internal memory region or a
+ specific register space,
+ "l2sram", "l1pram", "l1dram", "host1cfg", "chipsig_base"
+
+- interrupts: Should contain the interrupt number used to receive the
+ interrupts from the DSP. The value should follow the
+ interrupt-specifier format as dictated by the
+ 'interrupt-parent' node.
+
+- memory-region: phandle to the reserved memory node to be associated
+ with the remoteproc device. The reserved memory node
+ can be a CMA memory node, and should be defined as
+ per the bindings in
+ Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
+
+Optional properties:
+--------------------
+- interrupt-parent: phandle to the interrupt controller node. This property
+ is needed if the device node hierarchy doesn't have an
+ interrupt controller.
+
+
+Example:
+--------
+
+ /* DSP Reserved Memory node */
+ reserved-memory {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ dsp_memory_region: dsp-memory@c3000000 {
+ compatible = "shared-dma-pool";
+ reg = <0xc3000000 0x1000000>;
+ reusable;
+ };
+ };
+
+ /* DSP node */
+ {
+ dsp: dsp@11800000 {
+ compatible = "ti,da850-dsp";
+ reg = <0x11800000 0x40000>,
+ <0x11e00000 0x8000>,
+ <0x11f00000 0x8000>,
+ <0x01c14044 0x4>,
+ <0x01c14174 0x8>;
+ reg-names = "l2sram", "l1pram", "l1dram", "host1cfg",
+ "chipsig";
+ interrupt-parent = <&intc>;
+ interrupts = <28>;
+ memory-region = <&dsp_memory_region>;
+ };
+ };
diff --git a/Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt b/Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt
index 2aac1aa4123d..1eb72874130b 100644
--- a/Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt
+++ b/Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt
@@ -26,6 +26,7 @@ The following are the mandatory properties:
"ti,k2hk-dsp" for DSPs on Keystone 2 66AK2H/K SoCs
"ti,k2l-dsp" for DSPs on Keystone 2 66AK2L SoCs
"ti,k2e-dsp" for DSPs on Keystone 2 66AK2E SoCs
+ "ti,k2g-dsp" for DSPs on Keystone 2 66AK2G SoCs
- reg: Should contain an entry for each value in 'reg-names'.
Each entry should have the memory region's start address
@@ -37,20 +38,18 @@ The following are the mandatory properties:
should be defined in this order,
"l2sram", "l1pram", "l1dram"
-- clocks: Should contain the device's input clock, and should be
- defined as per the bindings in,
- Documentation/devicetree/bindings/clock/keystone-gate.txt
-
- ti,syscon-dev: Should be a pair of the phandle to the Keystone Device
State Control node, and the register offset of the DSP
boot address register within that node's address space.
- resets: Should contain the phandle to the reset controller node
managing the resets for this device, and a reset
- specifier. Please refer to the following reset bindings
- for the reset argument specifier as per SoC,
+ specifier. Please refer to either of the following reset
+ bindings for the reset argument specifier as per SoC,
Documentation/devicetree/bindings/reset/ti-syscon-reset.txt
- for 66AK2HK/66AK2L/66AK2E SoCs
+ for 66AK2HK/66AK2L/66AK2E SoCs or,
+ Documentation/devicetree/bindings/reset/ti,sci-reset.txt
+ for 66AK2G SoCs
- interrupt-parent: Should contain a phandle to the Keystone 2 IRQ controller
IP node that is used by the ARM CorePac processor to
@@ -75,6 +74,22 @@ The following are the mandatory properties:
The gpio device to be used is as per the bindings in,
Documentation/devicetree/bindings/gpio/gpio-dsp-keystone.txt
+SoC-specific Required properties:
+---------------------------------
+The following are mandatory properties for Keystone 2 66AK2HK, 66AK2L and 66AK2E
+SoCs only:
+
+- clocks: Should contain the device's input clock, and should be
+ defined as per the bindings in,
+ Documentation/devicetree/bindings/clock/keystone-gate.txt
+
+The following are mandatory properties for Keystone 2 66AK2G SoCs only:
+
+- power-domains: Should contain a phandle to a PM domain provider node
+ and an args specifier containing the DSP device id
+ value. This property is as per the binding,
+ Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+
Optional properties:
--------------------
@@ -85,8 +100,10 @@ Optional properties:
Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
-Example:
---------
+Examples:
+---------
+
+1.
/* 66AK2H/K DSP aliases */
aliases {
rproc0 = &dsp0;
@@ -131,3 +148,41 @@ Example:
};
};
+
+2.
+ /* 66AK2G DSP alias */
+ aliases {
+ rproc0 = &dsp0;
+ };
+
+ /* 66AK2G DSP memory node */
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ };
+ };
+
+ /* 66AK2G DSP node */
+ soc {
+ dsp0: dsp@10800000 {
+ compatible = "ti,k2g-dsp";
+ reg = <0x10800000 0x00100000>,
+ <0x10e00000 0x00008000>,
+ <0x10f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ power-domains = <&k2g_pds 0x0046>;
+ ti,syscon-dev = <&devctrl 0x40>;
+ resets = <&k2g_reset 0x0046 0x1>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <0 8>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio0 27 0>;
+ memory-region = <&dsp_common_memory>;
+ };
+ };
diff --git a/Documentation/devicetree/bindings/reset/lantiq,reset.txt b/Documentation/devicetree/bindings/reset/lantiq,reset.txt
new file mode 100644
index 000000000000..c6aef36b7d15
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/lantiq,reset.txt
@@ -0,0 +1,30 @@
+Lantiq XWAY SoC RCU reset controller binding
+============================================
+
+This binding describes a reset-controller found on the RCU module on Lantiq
+XWAY SoCs.
+
+This node has to be a sub node of the Lantiq RCU block.
+
+-------------------------------------------------------------------------------
+Required properties:
+- compatible : Should be one of
+ "lantiq,danube-reset"
+ "lantiq,xrx200-reset"
+- reg : Defines the following sets of registers in the parent
+ syscon device
+ - Offset of the reset set register
+ - Offset of the reset status register
+- #reset-cells : Specifies the number of cells needed to encode the
+ reset line, should be 2.
+ The first cell takes the reset set bit and the
+ second cell takes the status bit.
+
+-------------------------------------------------------------------------------
+Example for the reset-controllers on the xRX200 SoCs:
+ reset0: reset-controller@10 {
+ compatible = "lantiq,xrx200-reset";
+ reg <0x10 0x04>, <0x14 0x04>;
+
+ #reset-cells = <2>;
+ };
diff --git a/Documentation/devicetree/bindings/reset/renesas,rst.txt b/Documentation/devicetree/bindings/reset/renesas,rst.txt
index fe5e0f37b3c9..e5a03ffe04fb 100644
--- a/Documentation/devicetree/bindings/reset/renesas,rst.txt
+++ b/Documentation/devicetree/bindings/reset/renesas,rst.txt
@@ -26,6 +26,7 @@ Required properties:
- "renesas,r8a7794-rst" (R-Car E2)
- "renesas,r8a7795-rst" (R-Car H3)
- "renesas,r8a7796-rst" (R-Car M3-W)
+ - "renesas,r8a77995-rst" (R-Car D3)
- reg: Address start and address range for the device.
diff --git a/Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt b/Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
new file mode 100644
index 000000000000..830069b1c37c
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
@@ -0,0 +1,28 @@
+Binding for the Synopsys HSDK reset controller
+
+This binding uses the common reset binding[1].
+
+[1] Documentation/devicetree/bindings/reset/reset.txt
+
+Required properties:
+- compatible: should be "snps,hsdk-reset".
+- reg: should always contain 2 pairs address - length: first for reset
+ configuration register and second for corresponding SW reset and status bits
+ register.
+- #reset-cells: from common reset binding; Should always be set to 1.
+
+Example:
+ reset: reset@880 {
+ compatible = "snps,hsdk-reset";
+ #reset-cells = <1>;
+ reg = <0x8A0 0x4>, <0xFF0 0x4>;
+ };
+
+Specifying reset lines connected to IP modules:
+ ethernet@.... {
+ ....
+ resets = <&reset HSDK_V1_ETH_RESET>;
+ ....
+ };
+
+The index could be found in <dt-bindings/reset/snps,hsdk-reset.h>
diff --git a/Documentation/devicetree/bindings/reset/uniphier-reset.txt b/Documentation/devicetree/bindings/reset/uniphier-reset.txt
index 83ab0f599c40..68a6f487c409 100644
--- a/Documentation/devicetree/bindings/reset/uniphier-reset.txt
+++ b/Documentation/devicetree/bindings/reset/uniphier-reset.txt
@@ -6,7 +6,6 @@ System reset
Required properties:
- compatible: should be one of the following:
- "socionext,uniphier-sld3-reset" - for sLD3 SoC
"socionext,uniphier-ld4-reset" - for LD4 SoC
"socionext,uniphier-pro4-reset" - for Pro4 SoC
"socionext,uniphier-sld8-reset" - for sLD8 SoC
@@ -37,7 +36,6 @@ Media I/O (MIO) reset, SD reset
Required properties:
- compatible: should be one of the following:
- "socionext,uniphier-sld3-mio-reset" - for sLD3 SoC
"socionext,uniphier-ld4-mio-reset" - for LD4 SoC
"socionext,uniphier-pro4-mio-reset" - for Pro4 SoC
"socionext,uniphier-sld8-mio-reset" - for sLD8 SoC
@@ -92,3 +90,28 @@ Example:
other nodes ...
};
+
+
+Analog signal amplifier reset
+-----------------------------
+
+Required properties:
+- compatible: should be one of the following:
+ "socionext,uniphier-ld11-adamv-reset" - for LD11 SoC
+ "socionext,uniphier-ld20-adamv-reset" - for LD20 SoC
+- #reset-cells: should be 1.
+
+Example:
+
+ adamv@57920000 {
+ compatible = "socionext,uniphier-ld11-adamv",
+ "simple-mfd", "syscon";
+ reg = <0x57920000 0x1000>;
+
+ adamv_rst: reset {
+ compatible = "socionext,uniphier-ld11-adamv-reset";
+ #reset-cells = <1>;
+ };
+
+ other nodes ...
+ };
diff --git a/Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt b/Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt
new file mode 100644
index 000000000000..634312dd95ca
--- /dev/null
+++ b/Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt
@@ -0,0 +1,17 @@
+Android Goldfish RTC
+
+Android Goldfish RTC device used by Android emulator.
+
+Required properties:
+
+- compatible : should contain "google,goldfish-rtc"
+- reg : <registers mapping>
+- interrupts : <interrupt mapping>
+
+Example:
+
+ goldfish_timer@9020000 {
+ compatible = "google,goldfish-rtc";
+ reg = <0x9020000 0x1000>;
+ interrupts = <0x3>;
+ };
diff --git a/Documentation/devicetree/bindings/rtc/isil,isl12057.txt b/Documentation/devicetree/bindings/rtc/isil,isl12057.txt
index cf83e0940302..fbbdd92e5af9 100644
--- a/Documentation/devicetree/bindings/rtc/isil,isl12057.txt
+++ b/Documentation/devicetree/bindings/rtc/isil,isl12057.txt
@@ -24,7 +24,6 @@ Optional properties:
- "wakeup-source": mark the chip as a wakeup source, independently of
the availability of an IRQ line connected to the SoC.
- (Legacy property supported: "isil,irq2-can-wakeup-machine")
- "interrupt-parent", "interrupts": for passing the interrupt line
of the SoC connected to IRQ#2 of the RTC chip.
diff --git a/Documentation/devicetree/bindings/rtc/realtek,rtd119x.txt b/Documentation/devicetree/bindings/rtc/realtek,rtd119x.txt
new file mode 100644
index 000000000000..bbf1ccb5df31
--- /dev/null
+++ b/Documentation/devicetree/bindings/rtc/realtek,rtd119x.txt
@@ -0,0 +1,16 @@
+Realtek RTD129x Real-Time Clock
+===============================
+
+Required properties:
+- compatible : Should be "realtek,rtd1295-rtc"
+- reg : Specifies the physical base address and size
+- clocks : Specifies the clock gate
+
+
+Example:
+
+ rtc@9801b600 {
+ compatible = "realtek,rtd1295-clk";
+ reg = <0x9801b600 0x100>;
+ clocks = <&clkc RTD1295_CLK_EN_MISC_RTC>;
+ };
diff --git a/Documentation/devicetree/bindings/rtc/sun6i-rtc.txt b/Documentation/devicetree/bindings/rtc/sun6i-rtc.txt
index 945934918b71..d5e26d313f62 100644
--- a/Documentation/devicetree/bindings/rtc/sun6i-rtc.txt
+++ b/Documentation/devicetree/bindings/rtc/sun6i-rtc.txt
@@ -10,7 +10,7 @@ Required properties:
Required properties for new device trees
- clocks : phandle to the 32kHz external oscillator
-- clock-output-names : name of the LOSC clock created
+- clock-output-names : names of the LOSC and its external output clocks created
- #clock-cells : must be equals to 1. The RTC provides two clocks: the
LOSC and its external output, with index 0 and 1
respectively.
@@ -21,7 +21,7 @@ rtc: rtc@01f00000 {
compatible = "allwinner,sun6i-a31-rtc";
reg = <0x01f00000 0x54>;
interrupts = <0 40 4>, <0 41 4>;
- clock-output-names = "osc32k";
+ clock-output-names = "osc32k", "osc32k-out";
clocks = <&ext_osc32k>;
#clock-cells = <1>;
};
diff --git a/Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt b/Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt
index 3eca6de6369d..a65d7b71e81a 100644
--- a/Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt
+++ b/Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt
@@ -8,6 +8,12 @@ Required properties:
the firmware event log
- linux,sml-size : size of the memory allocated for the firmware event log
+Optional properties:
+
+- powered-while-suspended: present when the TPM is left powered on between
+ suspend and resume (makes the suspend/resume
+ callbacks do nothing).
+
Example (for OpenPower Systems with Nuvoton TPM 2.0 on I2C)
----------------------------------------------------------
diff --git a/Documentation/devicetree/bindings/serial/mtk-uart.txt b/Documentation/devicetree/bindings/serial/mtk-uart.txt
index b6cf384597e1..f73abff3de43 100644
--- a/Documentation/devicetree/bindings/serial/mtk-uart.txt
+++ b/Documentation/devicetree/bindings/serial/mtk-uart.txt
@@ -3,6 +3,7 @@
Required properties:
- compatible should contain:
* "mediatek,mt2701-uart" for MT2701 compatible UARTS
+ * "mediatek,mt2712-uart" for MT2712 compatible UARTS
* "mediatek,mt6580-uart" for MT6580 compatible UARTS
* "mediatek,mt6582-uart" for MT6582 compatible UARTS
* "mediatek,mt6589-uart" for MT6589 compatible UARTS
diff --git a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
index 4fc96946f81d..cf504d0380ae 100644
--- a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
+++ b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
@@ -41,6 +41,8 @@ Required properties:
- "renesas,hscif-r8a7795" for R8A7795 (R-Car H3) HSCIF compatible UART.
- "renesas,scif-r8a7796" for R8A7796 (R-Car M3-W) SCIF compatible UART.
- "renesas,hscif-r8a7796" for R8A7796 (R-Car M3-W) HSCIF compatible UART.
+ - "renesas,scif-r8a77970" for R8A77970 (R-Car V3M) SCIF compatible UART.
+ - "renesas,hscif-r8a77970" for R8A77970 (R-Car V3M) HSCIF compatible UART.
- "renesas,scif-r8a77995" for R8A77995 (R-Car D3) SCIF compatible UART.
- "renesas,hscif-r8a77995" for R8A77995 (R-Car D3) HSCIF compatible UART.
- "renesas,scifa-sh73a0" for SH73A0 (SH-Mobile AG5) SCIFA compatible UART.
diff --git a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt
index b1d165b4d4b3..40056f7990f8 100644
--- a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt
+++ b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt
@@ -12,11 +12,13 @@ power/power_domain.txt. It provides the power domains defined in
- include/dt-bindings/power/mt8173-power.h
- include/dt-bindings/power/mt6797-power.h
- include/dt-bindings/power/mt2701-power.h
+- include/dt-bindings/power/mt7622-power.h
Required properties:
- compatible: Should be one of:
- "mediatek,mt2701-scpsys"
- "mediatek,mt6797-scpsys"
+ - "mediatek,mt7622-scpsys"
- "mediatek,mt8173-scpsys"
- #power-domain-cells: Must be 1
- reg: Address range of the SCPSYS unit
@@ -26,6 +28,7 @@ Required properties:
enabled before enabling certain power domains.
Required clocks for MT2701: "mm", "mfg", "ethif"
Required clocks for MT6797: "mm", "mfg", "vdec"
+ Required clocks for MT7622: "hif_sel"
Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt"
Optional properties:
diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt b/Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt
index 50fc20c6ce91..b277eca861f7 100644
--- a/Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt
+++ b/Documentation/devicetree/bindings/soc/qcom/qcom,glink.txt
@@ -1,11 +1,12 @@
-Qualcomm RPM GLINK binding
+Qualcomm GLINK edge binding
-This binding describes the Qualcomm RPM GLINK, a fifo based mechanism for
-communication with the Resource Power Management system on various Qualcomm
-platforms.
+This binding describes a Qualcomm GLINK edge, a fifo based mechanism for
+communication between subsystem-pairs on various Qualcomm platforms. Two types
+of edges can be described by the binding; the GLINK RPM edge and a SMEM based
+edge.
- compatible:
- Usage: required
+ Usage: required for glink-rpm
Value type: <stringlist>
Definition: must be "qcom,glink-rpm"
@@ -16,7 +17,7 @@ platforms.
signal this processor about communication related events
- qcom,rpm-msg-ram:
- Usage: required
+ Usage: required for glink-rpm
Value type: <prop-encoded-array>
Definition: handle to RPM message memory resource
diff --git a/Documentation/devicetree/bindings/soc/rockchip/grf.txt b/Documentation/devicetree/bindings/soc/rockchip/grf.txt
index cc9f05d3cbc1..7dc5ce858a0e 100644
--- a/Documentation/devicetree/bindings/soc/rockchip/grf.txt
+++ b/Documentation/devicetree/bindings/soc/rockchip/grf.txt
@@ -21,6 +21,7 @@ Required Properties:
- "rockchip,rk3328-grf", "syscon": for rk3328
- "rockchip,rk3368-grf", "syscon": for rk3368
- "rockchip,rk3399-grf", "syscon": for rk3399
+ - "rockchip,rv1108-grf", "syscon": for rv1108
- compatible: PMUGRF should be one of the following:
- "rockchip,rk3368-pmugrf", "syscon": for rk3368
- "rockchip,rk3399-pmugrf", "syscon": for rk3399
@@ -28,6 +29,8 @@ Required Properties:
- "rockchip,rk3288-sgrf", "syscon": for rk3288
- compatible: USB2PHYGRF should be one of the followings
- "rockchip,rk3328-usb2phy-grf", "syscon": for rk3328
+- compatible: USBGRF should be one of the following
+ - "rockchip,rv1108-usbgrf", "syscon": for rv1108
- reg: physical base address of the controller and length of memory mapped
region.
diff --git a/Documentation/devicetree/bindings/soc/rockchip/power_domain.txt b/Documentation/devicetree/bindings/soc/rockchip/power_domain.txt
index 01bfb6745fbd..301d2a9bc1b8 100644
--- a/Documentation/devicetree/bindings/soc/rockchip/power_domain.txt
+++ b/Documentation/devicetree/bindings/soc/rockchip/power_domain.txt
@@ -7,6 +7,7 @@ Required properties for power domain controller:
- compatible: Should be one of the following.
"rockchip,rk3288-power-controller" - for RK3288 SoCs.
"rockchip,rk3328-power-controller" - for RK3328 SoCs.
+ "rockchip,rk3366-power-controller" - for RK3366 SoCs.
"rockchip,rk3368-power-controller" - for RK3368 SoCs.
"rockchip,rk3399-power-controller" - for RK3399 SoCs.
- #power-domain-cells: Number of cells in a power-domain specifier.
@@ -18,6 +19,7 @@ Required properties for power domain sub nodes:
- reg: index of the power domain, should use macros in:
"include/dt-bindings/power/rk3288-power.h" - for RK3288 type power domain.
"include/dt-bindings/power/rk3328-power.h" - for RK3328 type power domain.
+ "include/dt-bindings/power/rk3366-power.h" - for RK3366 type power domain.
"include/dt-bindings/power/rk3368-power.h" - for RK3368 type power domain.
"include/dt-bindings/power/rk3399-power.h" - for RK3399 type power domain.
- clocks (optional): phandles to clocks which need to be enabled while power domain
@@ -93,6 +95,7 @@ power domain to use.
The index should use macros in:
"include/dt-bindings/power/rk3288-power.h" - for rk3288 type power domain.
"include/dt-bindings/power/rk3328-power.h" - for rk3328 type power domain.
+ "include/dt-bindings/power/rk3366-power.h" - for rk3366 type power domain.
"include/dt-bindings/power/rk3368-power.h" - for rk3368 type power domain.
"include/dt-bindings/power/rk3399-power.h" - for rk3399 type power domain.
diff --git a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
index c705db07d820..66e6265fb0aa 100644
--- a/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
+++ b/Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
@@ -46,12 +46,13 @@ Required Properties:
- power-domains: phandle pointing to the corresponding PM domain node
and an ID representing the device.
-See dt-bindings/genpd/k2g.h for the list of valid identifiers for k2g.
+See http://processors.wiki.ti.com/index.php/TISCI#66AK2G02_Data for the list
+of valid identifiers for k2g.
Example (K2G):
--------------------
uart0: serial@02530c00 {
compatible = "ns16550a";
...
- power-domains = <&k2g_pds K2G_DEV_UART0>;
+ power-domains = <&k2g_pds 0x002c>;
};
diff --git a/Documentation/devicetree/bindings/sound/atmel-classd.txt b/Documentation/devicetree/bindings/sound/atmel-classd.txt
index 549e701cb7a1..898551076382 100644
--- a/Documentation/devicetree/bindings/sound/atmel-classd.txt
+++ b/Documentation/devicetree/bindings/sound/atmel-classd.txt
@@ -13,13 +13,11 @@ Required properties:
Must be "tx".
- clock-names
Tuple listing input clock names.
- Required elements: "pclk", "gclk" and "aclk".
+ Required elements: "pclk" and "gclk".
- clocks
Please refer to clock-bindings.txt.
- assigned-clocks
Should be <&classd_gclk>.
-- assigned-clock-parents
- Should be <&audio_pll_pmc>.
Optional properties:
- pinctrl-names, pinctrl-0
@@ -45,10 +43,9 @@ classd: classd@fc048000 {
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
| AT91_XDMAC_DT_PERID(47))>;
dma-names = "tx";
- clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>;
- clock-names = "pclk", "gclk", "aclk";
+ clocks = <&classd_clk>, <&classd_gclk>;
+ clock-names = "pclk", "gclk";
assigned-clocks = <&classd_gclk>;
- assigned-clock-parents = <&audio_pll_pmc>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_classd_default>;
diff --git a/Documentation/devicetree/bindings/sram/renesas,smp-sram.txt b/Documentation/devicetree/bindings/sram/renesas,smp-sram.txt
new file mode 100644
index 000000000000..712d05e3e15e
--- /dev/null
+++ b/Documentation/devicetree/bindings/sram/renesas,smp-sram.txt
@@ -0,0 +1,27 @@
+* Renesas SMP SRAM
+
+Renesas R-Car Gen2 and RZ/G1 SoCs need a small piece of SRAM for the jump stub
+for secondary CPU bringup and CPU hotplug.
+This memory is reserved by adding a child node to a "mmio-sram" node, cfr.
+Documentation/devicetree/bindings/sram/sram.txt.
+
+Required child node properties:
+ - compatible: Must be "renesas,smp-sram",
+ - reg: Address and length of the reserved SRAM.
+ The full physical (bus) address must be aligned to a 256 KiB boundary.
+
+
+Example:
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
diff --git a/Documentation/devicetree/bindings/sram/sunxi-sram.txt b/Documentation/devicetree/bindings/sram/sunxi-sram.txt
index 170034e6c8b0..6bb92a1df753 100644
--- a/Documentation/devicetree/bindings/sram/sunxi-sram.txt
+++ b/Documentation/devicetree/bindings/sram/sunxi-sram.txt
@@ -9,7 +9,9 @@ Controller Node
---------------
Required properties:
-- compatible : "allwinner,sun4i-a10-sram-controller"
+- compatible : should be:
+ - "allwinner,sun4i-a10-sram-controller"
+ - "allwinner,sun50i-a64-sram-controller"
- reg : sram controller register offset + length
SRAM nodes
@@ -22,10 +24,13 @@ Each SRAM will have SRAM sections that are going to be handled by the
SRAM controller as subnodes. These sections are represented following
once again the representation described in the mmio-sram binding.
-The valid sections compatible are:
+The valid sections compatible for A10 are:
- allwinner,sun4i-a10-sram-a3-a4
- allwinner,sun4i-a10-sram-d
+The valid sections compatible for A64 are:
+ - allwinner,sun50i-a64-sram-c
+
Devices using SRAM sections
---------------------------
diff --git a/Documentation/devicetree/bindings/thermal/mediatek-thermal.txt b/Documentation/devicetree/bindings/thermal/mediatek-thermal.txt
index e2f494d74d8a..0d73ea5e9c0c 100644
--- a/Documentation/devicetree/bindings/thermal/mediatek-thermal.txt
+++ b/Documentation/devicetree/bindings/thermal/mediatek-thermal.txt
@@ -11,6 +11,7 @@ Required properties:
- compatible:
- "mediatek,mt8173-thermal" : For MT8173 family of SoCs
- "mediatek,mt2701-thermal" : For MT2701 family of SoCs
+ - "mediatek,mt2712-thermal" : For MT2712 family of SoCs
- reg: Address range of the thermal controller
- interrupts: IRQ for the thermal controller
- clocks, clock-names: Clocks needed for the thermal controller. required
diff --git a/Documentation/devicetree/bindings/thermal/rockchip-thermal.txt b/Documentation/devicetree/bindings/thermal/rockchip-thermal.txt
index 43003aec94bd..e3a6234fb1ac 100644
--- a/Documentation/devicetree/bindings/thermal/rockchip-thermal.txt
+++ b/Documentation/devicetree/bindings/thermal/rockchip-thermal.txt
@@ -4,6 +4,7 @@ Required properties:
- compatible : should be "rockchip,<name>-tsadc"
"rockchip,rk3228-tsadc": found on RK3228 SoCs
"rockchip,rk3288-tsadc": found on RK3288 SoCs
+ "rockchip,rk3328-tsadc": found on RK3328 SoCs
"rockchip,rk3368-tsadc": found on RK3368 SoCs
"rockchip,rk3399-tsadc": found on RK3399 SoCs
- reg : physical base address of the controller and length of memory mapped
diff --git a/Documentation/devicetree/bindings/thermal/uniphier-thermal.txt b/Documentation/devicetree/bindings/thermal/uniphier-thermal.txt
new file mode 100644
index 000000000000..686c0b42ed3f
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/uniphier-thermal.txt
@@ -0,0 +1,64 @@
+* UniPhier Thermal bindings
+
+This describes the devicetree bindings for thermal monitor supported by
+PVT(Process, Voltage and Temperature) monitoring unit implemented on Socionext
+UniPhier SoCs.
+
+Required properties:
+- compatible :
+ - "socionext,uniphier-pxs2-thermal" : For UniPhier PXs2 SoC
+ - "socionext,uniphier-ld20-thermal" : For UniPhier LD20 SoC
+- interrupts : IRQ for the temperature alarm
+- #thermal-sensor-cells : Should be 0. See ./thermal.txt for details.
+
+Optional properties:
+- socionext,tmod-calibration: A pair of calibrated values referred from PVT,
+ in case that the values aren't set on SoC,
+ like a reference board.
+
+Example:
+
+ sysctrl@61840000 {
+ compatible = "socionext,uniphier-ld20-sysctrl",
+ "simple-mfd", "syscon";
+ reg = <0x61840000 0x10000>;
+ ...
+ pvtctl: pvtctl {
+ compatible = "socionext,uniphier-ld20-thermal";
+ interrupts = <0 3 1>;
+ #thermal-sensor-cells = <0>;
+ };
+ ...
+ };
+
+ thermal-zones {
+ cpu_thermal {
+ polling-delay-passive = <250>; /* 250ms */
+ polling-delay = <1000>; /* 1000ms */
+ thermal-sensors = <&pvtctl>;
+
+ trips {
+ cpu_crit: cpu_crit {
+ temperature = <110000>; /* 110C */
+ hysteresis = <2000>;
+ type = "critical";
+ };
+ cpu_alert: cpu_alert {
+ temperature = <100000>; /* 100C */
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&cpu_alert>;
+ cooling-device = <&cpu0 (-1) (-1)>;
+ };
+ map1 {
+ trip = <&cpu_alert>;
+ cooling-device = <&cpu2 (-1) (-1)>;
+ };
+ };
+ };
+ };
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index 5a79aeb620b3..1afd298eddd7 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -3,8 +3,8 @@ Device tree binding vendor prefix registry. Keep list in alphabetical order.
This isn't an exhaustive list, but you should add new prefixes to it before
using them to avoid name-space collisions.
-abcn Abracon Corporation
abilis Abilis Systems
+abracon Abracon Corporation
actions Actions Semiconductor Co., Ltd.
active-semi Active-Semi International Inc
ad Avionic Design GmbH
@@ -48,6 +48,7 @@ avic Shanghai AVIC Optoelectronics Co., Ltd.
axentia Axentia Technologies AB
axis Axis Communications AB
bananapi BIPAI KEJI LIMITED
+bhf Beckhoff Automation GmbH & Co. KG
boe BOE Technology Group Co., Ltd.
bosch Bosch Sensortec GmbH
boundary Boundary Devices Inc.
@@ -360,6 +361,7 @@ variscite Variscite Ltd.
via VIA Technologies, Inc.
virtio Virtual I/O Device Specification, developed by the OASIS consortium
vivante Vivante Corporation
+vocore VoCore Studio
voipac Voipac Technologies s.r.o.
wd Western Digital Corp.
wetek WeTek Electronics, limited.
diff --git a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
index c5e74d7b4406..c5077a1f5cb3 100644
--- a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
@@ -8,9 +8,49 @@ Required properties:
- reg: physical base address of the controller and length of memory mapped
region
+Optional properties:
+
+ - aspeed,reset-type = "cpu|soc|system|none"
+
+ Reset behavior - Whenever a timeout occurs the watchdog can be programmed
+ to generate one of three different, mutually exclusive, types of resets.
+
+ Type "none" can be specified to indicate that no resets are to be done.
+ This is useful in situations where another watchdog engine on chip is
+ to perform the reset.
+
+ If 'aspeed,reset-type=' is not specfied the default is to enable system
+ reset.
+
+ Reset types:
+
+ - cpu: Reset CPU on watchdog timeout
+
+ - soc: Reset 'System on Chip' on watchdog timeout
+
+ - system: Reset system on watchdog timeout
+
+ - none: No reset is performed on timeout. Assumes another watchdog
+ engine is responsible for this.
+
+ - aspeed,alt-boot: If property is present then boot from alternate block.
+ - aspeed,external-signal: If property is present then signal is sent to
+ external reset counter (only WDT1 and WDT2). If not
+ specified no external signal is sent.
+ - aspeed,ext-pulse-duration: External signal pulse duration in microseconds
+
+Optional properties for AST2500-compatible watchdogs:
+ - aspeed,ext-push-pull: If aspeed,external-signal is present, set the pin's
+ drive type to push-pull. The default is open-drain.
+ - aspeed,ext-active-high: If aspeed,external-signal is present and and the pin
+ is configured as push-pull, then set the pulse
+ polarity to active-high. The default is active-low.
+
Example:
wdt1: watchdog@1e785000 {
compatible = "aspeed,ast2400-wdt";
reg = <0x1e785000 0x1c>;
+ aspeed,reset-type = "system";
+ aspeed,external-signal;
};
diff --git a/Documentation/devicetree/bindings/watchdog/lantiq-wdt.txt b/Documentation/devicetree/bindings/watchdog/lantiq-wdt.txt
new file mode 100644
index 000000000000..18d4d8302702
--- /dev/null
+++ b/Documentation/devicetree/bindings/watchdog/lantiq-wdt.txt
@@ -0,0 +1,24 @@
+Lantiq WTD watchdog binding
+============================
+
+This describes the binding of the Lantiq watchdog driver.
+
+-------------------------------------------------------------------------------
+Required properties:
+- compatible : Should be one of
+ "lantiq,wdt"
+ "lantiq,xrx100-wdt"
+ "lantiq,xrx200-wdt", "lantiq,xrx100-wdt"
+ "lantiq,falcon-wdt"
+- reg : Address of the watchdog block
+- lantiq,rcu : A phandle to the RCU syscon (required for
+ "lantiq,falcon-wdt" and "lantiq,xrx100-wdt")
+
+-------------------------------------------------------------------------------
+Example for the watchdog on the xRX200 SoCs:
+ watchdog@803f0 {
+ compatible = "lantiq,xrx200-wdt", "lantiq,xrx100-wdt";
+ reg = <0x803f0 0x10>;
+
+ lantiq,rcu = <&rcu0>;
+ };
diff --git a/Documentation/devicetree/bindings/watchdog/meson-wdt.txt b/Documentation/devicetree/bindings/watchdog/meson-wdt.txt
index ae70185d96e6..8a6d84cb36c9 100644
--- a/Documentation/devicetree/bindings/watchdog/meson-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/meson-wdt.txt
@@ -2,7 +2,11 @@ Meson SoCs Watchdog timer
Required properties:
-- compatible : should be "amlogic,meson6-wdt" or "amlogic,meson8b-wdt"
+- compatible : depending on the SoC this should be one of:
+ "amlogic,meson6-wdt" on Meson6 SoCs
+ "amlogic,meson8-wdt" and "amlogic,meson6-wdt" on Meson8 SoCs
+ "amlogic,meson8b-wdt" on Meson8b SoCs
+ "amlogic,meson8m2-wdt" and "amlogic,meson8b-wdt" on Meson8m2 SoCs
- reg : Specifies base physical address and size of the registers.
Example:
diff --git a/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt b/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
index 6a00939a059a..235de0683bb6 100644
--- a/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/mtk-wdt.txt
@@ -3,9 +3,11 @@ Mediatek SoCs Watchdog timer
Required properties:
- compatible should contain:
- * "mediatek,mt2701-wdt" for MT2701 compatible watchdog timers
- * "mediatek,mt6589-wdt" for all compatible watchdog timers (MT2701,
- MT6589)
+ "mediatek,mt2701-wdt", "mediatek,mt6589-wdt": for MT2701
+ "mediatek,mt6589-wdt": for MT6589
+ "mediatek,mt6797-wdt", "mediatek,mt6589-wdt": for MT6797
+ "mediatek,mt7622-wdt", "mediatek,mt6589-wdt": for MT7622
+ "mediatek,mt7623-wdt", "mediatek,mt6589-wdt": for MT7623
- reg : Specifies base physical address and size of the registers.
diff --git a/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt b/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
index 9e306afbbd49..bf6d1ca58af7 100644
--- a/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/renesas-wdt.txt
@@ -6,6 +6,7 @@ Required properties:
Examples with soctypes are:
- "renesas,r8a7795-wdt" (R-Car H3)
- "renesas,r8a7796-wdt" (R-Car M3-W)
+ - "renesas,r8a77995-wdt" (R-Car D3)
- "renesas,r7s72100-wdt" (RZ/A1)
When compatible with the generic version, nodes must list the SoC-specific
diff --git a/Documentation/driver-api/firmware/request_firmware.rst b/Documentation/driver-api/firmware/request_firmware.rst
index 1c2c4967cd43..cc0aea880824 100644
--- a/Documentation/driver-api/firmware/request_firmware.rst
+++ b/Documentation/driver-api/firmware/request_firmware.rst
@@ -44,17 +44,6 @@ request_firmware_nowait
.. kernel-doc:: drivers/base/firmware_class.c
:functions: request_firmware_nowait
-Considerations for suspend and resume
-=====================================
-
-During suspend and resume only the built-in firmware and the firmware cache
-elements of the firmware API can be used. This is managed by fw_pm_notify().
-
-fw_pm_notify
-------------
-.. kernel-doc:: drivers/base/firmware_class.c
- :functions: fw_pm_notify
-
request firmware API expected driver use
========================================
diff --git a/Documentation/driver-api/mtdnand.rst b/Documentation/driver-api/mtdnand.rst
index e9afa586d15e..2a5191b6d445 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -516,7 +516,7 @@ mirrored table is performed.
The most important field in the nand_bbt_descr structure is the
options field. The options define most of the table properties. Use the
-predefined constants from nand.h to define the options.
+predefined constants from rawnand.h to define the options.
- Number of bits per block
@@ -843,7 +843,7 @@ Chip option constants
Constants for chip id table
~~~~~~~~~~~~~~~~~~~~~~~~~~~
-These constants are defined in nand.h. They are OR-ed together to
+These constants are defined in rawnand.h. They are OR-ed together to
describe the chip functionality::
/* Buswitdh is 16 bit */
@@ -865,7 +865,7 @@ describe the chip functionality::
Constants for runtime options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-These constants are defined in nand.h. They are OR-ed together to
+These constants are defined in rawnand.h. They are OR-ed together to
describe the functionality::
/* The hw ecc generator provides a syndrome instead a ecc value on read
@@ -956,7 +956,7 @@ developer. Each struct member has a short description which is marked
with an [XXX] identifier. See the chapter "Documentation hints" for an
explanation.
-.. kernel-doc:: include/linux/mtd/nand.h
+.. kernel-doc:: include/linux/mtd/rawnand.h
:internal:
Public Functions Provided
diff --git a/Documentation/driver-api/pm/devices.rst b/Documentation/driver-api/pm/devices.rst
index bedd32388dac..a0dc2879a152 100644
--- a/Documentation/driver-api/pm/devices.rst
+++ b/Documentation/driver-api/pm/devices.rst
@@ -675,7 +675,7 @@ sub-domain of the parent domain.
Support for power domains is provided through the :c:member:`pm_domain` field of
|struct device|. This field is a pointer to an object of type
-|struct dev_pm_domain|, defined in :file:`include/linux/pm.h``, providing a set
+|struct dev_pm_domain|, defined in :file:`include/linux/pm.h`, providing a set
of power management callbacks analogous to the subsystem-level and device driver
callbacks that are executed for the given device during all power transitions,
instead of the respective subsystem-level callbacks. Specifically, if a
diff --git a/Documentation/driver-model/driver.txt b/Documentation/driver-model/driver.txt
index 4421135826a2..d661e6f7e6a0 100644
--- a/Documentation/driver-model/driver.txt
+++ b/Documentation/driver-model/driver.txt
@@ -196,12 +196,13 @@ struct driver_attribute {
};
Device drivers can export attributes via their sysfs directories.
-Drivers can declare attributes using a DRIVER_ATTR macro that works
-identically to the DEVICE_ATTR macro.
+Drivers can declare attributes using a DRIVER_ATTR_RW and DRIVER_ATTR_RO
+macro that works identically to the DEVICE_ATTR_RW and DEVICE_ATTR_RO
+macros.
Example:
-DRIVER_ATTR(debug,0644,show_debug,store_debug);
+DRIVER_ATTR_RW(debug);
This is equivalent to declaring:
diff --git a/Documentation/fb/fbcon.txt b/Documentation/fb/fbcon.txt
index 4a9739abc860..a38d3aa4d189 100644
--- a/Documentation/fb/fbcon.txt
+++ b/Documentation/fb/fbcon.txt
@@ -148,6 +148,13 @@ C. Boot options
Actually, the underlying fb driver is totally ignorant of console
rotation.
+5. fbcon=margin:<color>
+
+ This option specifies the color of the margins. The margins are the
+ leftover area at the right and the bottom of the screen that are not
+ used by text. By default, this area will be black. The 'color' value
+ is an integer number that depends on the framebuffer driver being used.
+
C. Attaching, Detaching and Unloading
Before going on how to attach, detach and unload the framebuffer console, an
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index fe25787ff6d4..75d2d57e2c44 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -22,7 +22,7 @@ prototypes:
struct vfsmount *(*d_automount)(struct path *path);
int (*d_manage)(const struct path *, bool);
struct dentry *(*d_real)(struct dentry *, const struct inode *,
- unsigned int);
+ unsigned int, unsigned int);
locking rules:
rename_lock ->d_lock may block rcu-walk
diff --git a/Documentation/filesystems/cifs/AUTHORS b/Documentation/filesystems/cifs/AUTHORS
index c98800df677f..9f4f87e16240 100644
--- a/Documentation/filesystems/cifs/AUTHORS
+++ b/Documentation/filesystems/cifs/AUTHORS
@@ -41,6 +41,11 @@ Igor Mammedov (DFS support)
Jeff Layton (many, many fixes, as well as great work on the cifs Kerberos code)
Scott Lovenberg
Pavel Shilovsky (for great work adding SMB2 support, and various SMB3 features)
+Aurelien Aptel (for DFS SMB3 work and some key bug fixes)
+Ronnie Sahlberg (for SMB3 xattr work and bug fixes)
+Shirish Pargaonkar (for many ACL patches over the years)
+Sachin Prabhu (many bug fixes, including for reconnect, copy offload and security)
+
Test case and Bug Report contributors
-------------------------------------
diff --git a/Documentation/filesystems/cifs/README b/Documentation/filesystems/cifs/README
index a54788405429..a9da51553ba3 100644
--- a/Documentation/filesystems/cifs/README
+++ b/Documentation/filesystems/cifs/README
@@ -1,10 +1,14 @@
-The CIFS VFS support for Linux supports many advanced network filesystem
-features such as hierarchical dfs like namespace, hardlinks, locking and more.
+This module supports the SMB3 family of advanced network protocols (as well
+as older dialects, originally called "CIFS" or SMB1).
+
+The CIFS VFS module for Linux supports many advanced network filesystem
+features such as hierarchical DFS like namespace, hardlinks, locking and more.
It was designed to comply with the SNIA CIFS Technical Reference (which
supersedes the 1992 X/Open SMB Standard) as well as to perform best practice
practical interoperability with Windows 2000, Windows XP, Samba and equivalent
servers. This code was developed in participation with the Protocol Freedom
-Information Foundation.
+Information Foundation. CIFS and now SMB3 has now become a defacto
+standard for interoperating between Macs and Windows and major NAS appliances.
Please see
http://protocolfreedom.org/ and
@@ -15,30 +19,11 @@ for more details.
For questions or bug reports please contact:
+See the project page at: https://wiki.samba.org/index.php/LinuxCIFS_utils
+
Build instructions:
==================
-For Linux 2.4:
-1) Get the kernel source (e.g.from http://www.kernel.org)
-and download the cifs vfs source (see the project page
-at http://us1.samba.org/samba/Linux_CIFS_client.html)
-and change directory into the top of the kernel directory
-then patch the kernel (e.g. "patch -p1 < cifs_24.patch")
-to add the cifs vfs to your kernel configure options if
-it has not already been added (e.g. current SuSE and UL
-users do not need to apply the cifs_24.patch since the cifs vfs is
-already in the kernel configure menu) and then
-mkdir linux/fs/cifs and then copy the current cifs vfs files from
-the cifs download to your kernel build directory e.g.
-
- cp <cifs_download_dir>/fs/cifs/* to <kernel_download_dir>/fs/cifs
-
-2) make menuconfig (or make xconfig)
-3) select cifs from within the network filesystem choices
-4) save and exit
-5) make dep
-6) make modules (or "make" if CIFS VFS not to be built as a module)
-
-For Linux 2.6:
+For Linux:
1) Download the kernel (e.g. from http://www.kernel.org)
and change directory into the top of the kernel directory tree
(e.g. /usr/src/linux-2.5.73)
@@ -61,16 +46,13 @@ would simply type "make install").
If you do not have the utility mount.cifs (in the Samba 3.0 source tree and on
the CIFS VFS web site) copy it to the same directory in which mount.smbfs and
similar files reside (usually /sbin). Although the helper software is not
-required, mount.cifs is recommended. Eventually the Samba 3.0 utility program
-"net" may also be helpful since it may someday provide easier mount syntax for
-users who are used to Windows e.g.
- net use <mount point> <UNC name or cifs URL>
+required, mount.cifs is recommended. Most distros include a "cifs-utils"
+package that includes this utility so it is recommended to install this.
+
Note that running the Winbind pam/nss module (logon service) on all of your
Linux clients is useful in mapping Uids and Gids consistently across the
domain to the proper network user. The mount.cifs mount helper can be
-trivially built from Samba 3.0 or later source e.g. by executing:
-
- gcc samba/source/client/mount.cifs.c -o mount.cifs
+found at cifs-utils.git on git.samba.org
If cifs is built as a module, then the size and number of network buffers
and maximum number of simultaneous requests to one server can be configured.
@@ -79,6 +61,18 @@ Changing these from their defaults is not recommended. By executing modinfo
on kernel/fs/cifs/cifs.ko the list of configuration changes that can be made
at module initialization time (by running insmod cifs.ko) can be seen.
+Recommendations
+===============
+To improve security the SMB2.1 dialect or later (usually will get SMB3) is now
+the new default. To use old dialects (e.g. to mount Windows XP) use "vers=1.0"
+on mount (or vers=2.0 for Windows Vista). Note that the CIFS (vers=1.0) is
+much older and less secure than the default dialect SMB3 which includes
+many advanced security features such as downgrade attack detection
+and encrypted shares and stronger signing and authentication algorithms.
+There are additional mount options that may be helpful for SMB3 to get
+improved POSIX behavior (NB: can use vers=3.0 to force only SMB3, never 2.1):
+ "mfsymlinks" and "cifsacl" and "idsfromsid"
+
Allowing User Mounts
====================
To permit users to mount and unmount over directories they own is possible
@@ -98,9 +92,7 @@ and execution of suid programs on the remote target would be enabled
by default. This can be changed, as with nfs and other filesystems,
by simply specifying "nosuid" among the mount options. For user mounts
though to be able to pass the suid flag to mount requires rebuilding
-mount.cifs with the following flag:
-
- gcc samba/source/client/mount.cifs.c -DCIFS_ALLOW_USR_SUID -o mount.cifs
+mount.cifs with the following flag: CIFS_ALLOW_USR_SUID
There is a corresponding manual page for cifs mounting in the Samba 3.0 and
later source tree in docs/manpages/mount.cifs.8
@@ -189,18 +181,18 @@ applications running on the same server as Samba.
Use instructions:
================
Once the CIFS VFS support is built into the kernel or installed as a module
-(cifs.o), you can use mount syntax like the following to access Samba or Windows
-servers:
+(cifs.ko), you can use mount syntax like the following to access Samba or
+Mac or Windows servers:
- mount -t cifs //9.53.216.11/e$ /mnt -o user=myname,pass=mypassword
+ mount -t cifs //9.53.216.11/e$ /mnt -o username=myname,password=mypassword
Before -o the option -v may be specified to make the mount.cifs
mount helper display the mount steps more verbosely.
After -o the following commonly used cifs vfs specific options
are supported:
- user=<username>
- pass=<password>
+ username=<username>
+ password=<password>
domain=<domain name>
Other cifs mount options are described below. Use of TCP names (in addition to
@@ -246,13 +238,16 @@ the Server's registry. Samba starting with version 3.10 will allow such
filenames (ie those which contain valid Linux characters, which normally
would be forbidden for Windows/CIFS semantics) as long as the server is
configured for Unix Extensions (and the client has not disabled
-/proc/fs/cifs/LinuxExtensionsEnabled).
-
+/proc/fs/cifs/LinuxExtensionsEnabled). In addition the mount option
+"mapposix" can be used on CIFS (vers=1.0) to force the mapping of
+illegal Windows/NTFS/SMB characters to a remap range (this mount parm
+is the default for SMB3). This remap ("mapposix") range is also
+compatible with Mac (and "Services for Mac" on some older Windows).
CIFS VFS Mount Options
======================
A partial list of the supported mount options follows:
- user The user name to use when trying to establish
+ username The user name to use when trying to establish
the CIFS session.
password The user password. If the mount helper is
installed, the user will be prompted for password
diff --git a/Documentation/filesystems/cifs/TODO b/Documentation/filesystems/cifs/TODO
index 066ffddc3964..396ecfd6ff4a 100644
--- a/Documentation/filesystems/cifs/TODO
+++ b/Documentation/filesystems/cifs/TODO
@@ -1,4 +1,4 @@
-Version 2.03 August 1, 2014
+Version 2.04 September 13, 2017
A Partial List of Missing Features
==================================
@@ -8,73 +8,69 @@ for visible, important contributions to this module. Here
is a partial list of the known problems and missing features:
a) SMB3 (and SMB3.02) missing optional features:
- - RDMA
+ - RDMA (started)
- multichannel (started)
- directory leases (improved metadata caching)
- T10 copy offload (copy chunk is only mechanism supported)
- - encrypted shares
b) improved sparse file support
c) Directory entry caching relies on a 1 second timer, rather than
-using FindNotify or equivalent. - (started)
+using Directory Leases
d) quota support (needs minor kernel change since quota calls
to make it to network filesystems or deviceless filesystems)
-e) improve support for very old servers (OS/2 and Win9x for example)
-Including support for changing the time remotely (utimes command).
+e) Better optimize open to reduce redundant opens (using reference
+counts more) and to improve use of compounding in SMB3 to reduce
+number of roundtrips.
-f) hook lower into the sockets api (as NFS/SunRPC does) to avoid the
-extra copy in/out of the socket buffers in some cases.
-
-g) Better optimize open (and pathbased setfilesize) to reduce the
-oplock breaks coming from windows srv. Piggyback identical file
-opens on top of each other by incrementing reference count rather
-than resending (helps reduce server resource utilization and avoid
-spurious oplock breaks).
-
-h) Add support for storing symlink info to Windows servers
-in the Extended Attribute format their SFU clients would recognize.
-
-i) Finish inotify support so kde and gnome file list windows
+f) Finish inotify support so kde and gnome file list windows
will autorefresh (partially complete by Asser). Needs minor kernel
vfs change to support removing D_NOTIFY on a file.
-j) Add GUI tool to configure /proc/fs/cifs settings and for display of
+g) Add GUI tool to configure /proc/fs/cifs settings and for display of
the CIFS statistics (started)
-k) implement support for security and trusted categories of xattrs
+h) implement support for security and trusted categories of xattrs
(requires minor protocol extension) to enable better support for SELINUX
-l) Implement O_DIRECT flag on open (already supported on mount)
+i) Implement O_DIRECT flag on open (already supported on mount)
-m) Create UID mapping facility so server UIDs can be mapped on a per
+j) Create UID mapping facility so server UIDs can be mapped on a per
mount or a per server basis to client UIDs or nobody if no mapping
-exists. This is helpful when Unix extensions are negotiated to
-allow better permission checking when UIDs differ on the server
-and client. Add new protocol request to the CIFS protocol
-standard for asking the server for the corresponding name of a
-particular uid.
+exists. Also better integration with winbind for resolving SID owners
+
+k) Add tools to take advantage of more smb3 specific ioctls and features
+
+l) encrypted file support
+
+m) improved stats gathering, tools (perhaps integration with nfsometer?)
-n) DOS attrs - returned as pseudo-xattr in Samba format (check VFAT and NTFS for this too)
+n) allow setting more NTFS/SMB3 file attributes remotely (currently limited to compressed
+file attribute via chflags) and improve user space tools for managing and
+viewing them.
-o) mount check for unmatched uids
+o) mount helper GUI (to simplify the various configuration options on mount)
-p) Add support for new vfs entry point for fallocate
+p) autonegotiation of dialects (offering more than one dialect ie SMB3.02,
+SMB3, SMB2.1 not just SMB3).
-q) Add tools to take advantage of cifs/smb3 specific ioctls and features
-such as "CopyChunk" (fast server side file copy)
+q) Allow mount.cifs to be more verbose in reporting errors with dialect
+or unsupported feature errors.
-r) encrypted file support
+r) updating cifs documentation, and user guid.
-s) improved stats gathering, tools (perhaps integration with nfsometer?)
+s) Addressing bugs found by running a broader set of xfstests in standard
+file system xfstest suite.
-t) allow setting more NTFS/SMB3 file attributes remotely (currently limited to compressed
-file attribute via chflags)
+t) split cifs and smb3 support into separate modules so legacy (and less
+secure) CIFS dialect can be disabled in environments that don't need it
+and simplify the code.
-u) mount helper GUI (to simplify the various configuration options on mount)
+u) Finish up SMB3.1.1 dialect support
+v) POSIX Extensions for SMB3.1.1
KNOWN BUGS
====================================
diff --git a/Documentation/filesystems/cifs/cifs.txt b/Documentation/filesystems/cifs/cifs.txt
index 2fac91ac96cf..67756607246e 100644
--- a/Documentation/filesystems/cifs/cifs.txt
+++ b/Documentation/filesystems/cifs/cifs.txt
@@ -1,24 +1,28 @@
- This is the client VFS module for the Common Internet File System
- (CIFS) protocol which is the successor to the Server Message Block
+ This is the client VFS module for the SMB3 NAS protocol as well
+ older dialects such as the Common Internet File System (CIFS)
+ protocol which was the successor to the Server Message Block
(SMB) protocol, the native file sharing mechanism for most early
PC operating systems. New and improved versions of CIFS are now
called SMB2 and SMB3. These dialects are also supported by the
CIFS VFS module. CIFS is fully supported by network
- file servers such as Windows 2000, 2003, 2008 and 2012
+ file servers such as Windows 2000, 2003, 2008, 2012 and 2016
as well by Samba (which provides excellent CIFS
- server support for Linux and many other operating systems), so
+ server support for Linux and many other operating systems), Apple
+ systems, as well as most Network Attached Storage vendors, so
this network filesystem client can mount to a wide variety of
servers.
The intent of this module is to provide the most advanced network
- file system function for CIFS compliant servers, including better
- POSIX compliance, secure per-user session establishment, high
- performance safe distributed caching (oplock), optional packet
+ file system function for SMB3 compliant servers, including advanced
+ security features, excellent parallelized high performance i/o, better
+ POSIX compliance, secure per-user session establishment, encryption,
+ high performance safe distributed caching (leases/oplocks), optional packet
signing, large files, Unicode support and other internationalization
improvements. Since both Samba server and this filesystem client support
- the CIFS Unix extensions, the combination can provide a reasonable
- alternative to NFSv4 for fileserving in some Linux to Linux environments,
- not just in Linux to Windows environments.
+ the CIFS Unix extensions (and in the future SMB3 POSIX extensions),
+ the combination can provide a reasonable alternative to other network and
+ cluster file systems for fileserving in some Linux to Linux environments,
+ not just in Linux to Windows (or Linux to Mac) environments.
This filesystem has an mount utility (mount.cifs) that can be obtained from
diff --git a/Documentation/filesystems/f2fs.txt b/Documentation/filesystems/f2fs.txt
index 273ccb26885e..13c2ff034348 100644
--- a/Documentation/filesystems/f2fs.txt
+++ b/Documentation/filesystems/f2fs.txt
@@ -164,6 +164,16 @@ io_bits=%u Set the bit size of write IO requests. It should be set
with "mode=lfs".
usrquota Enable plain user disk quota accounting.
grpquota Enable plain group disk quota accounting.
+prjquota Enable plain project quota accounting.
+usrjquota=<file> Appoint specified file and type during mount, so that quota
+grpjquota=<file> information can be properly updated during recovery flow,
+prjjquota=<file> <quota file>: must be in root directory;
+jqfmt=<quota type> <quota type>: [vfsold,vfsv0,vfsv1].
+offusrjquota Turn off user journelled quota.
+offgrpjquota Turn off group journelled quota.
+offprjjquota Turn off project journelled quota.
+quota Enable plain user disk quota accounting.
+noquota Disable all plain disk quota option.
================================================================================
DEBUGFS ENTRIES
@@ -209,6 +219,15 @@ Files in /sys/fs/f2fs/<devname>
gc_idle = 1 will select the Cost Benefit approach
& setting gc_idle = 2 will select the greedy approach.
+ gc_urgent This parameter controls triggering background GCs
+ urgently or not. Setting gc_urgent = 0 [default]
+ makes back to default behavior, while if it is set
+ to 1, background thread starts to do GC by given
+ gc_urgent_sleep_time interval.
+
+ gc_urgent_sleep_time This parameter controls sleep time for gc_urgent.
+ 500 ms is set by default. See above gc_urgent.
+
reclaim_segments This parameter controls the number of prefree
segments to be reclaimed. If the number of prefree
segments is larger than the number of segments
diff --git a/Documentation/filesystems/orangefs.txt b/Documentation/filesystems/orangefs.txt
index 1dfdec790946..e2818b60a5c2 100644
--- a/Documentation/filesystems/orangefs.txt
+++ b/Documentation/filesystems/orangefs.txt
@@ -45,14 +45,11 @@ upstream version of the kernel client.
BUILDING THE USERSPACE FILESYSTEM ON A SINGLE SERVER
====================================================
-When Orangefs is upstream, "--with-kernel" shouldn't be needed, but
-until then the path to where the kernel with the Orangefs kernel client
-patch was built is needed to ensure that pvfs2-client-core (the bridge
-between kernel space and user space) will build properly. You can omit
---prefix if you don't care that things are sprinkled around in
-/usr/local.
+You can omit --prefix if you don't care that things are sprinkled around in
+/usr/local. As of version 2.9.6, Orangefs uses Berkeley DB by default, we
+will probably be changing the default to lmdb soon.
-./configure --prefix=/opt/ofs --with-kernel=/path/to/orangefs/kernel
+./configure --prefix=/opt/ofs --with-db-backend=lmdb
make
@@ -82,9 +79,6 @@ prove things are working with:
/opt/osf/bin/pvfs2-ls /mymountpoint
-You might not want to enforce selinux, it doesn't seem to matter by
-linux 3.11...
-
If stuff seems to be working, turn on the client core:
/opt/osf/sbin/pvfs2-client -p /opt/osf/sbin/pvfs2-client-core
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
index 5fb17f49f7a2..93e0a2404532 100644
--- a/Documentation/filesystems/porting
+++ b/Documentation/filesystems/porting
@@ -228,7 +228,7 @@ anything from oops to silent memory corruption.
---
[mandatory]
- FS_NOMOUNT is gone. If you use it - just set MS_NOUSER in flags
+ FS_NOMOUNT is gone. If you use it - just set SB_NOUSER in flags
(see rootfs for one kind of solution and bdev/socket/pipe for another).
---
diff --git a/Documentation/filesystems/sysfs.txt b/Documentation/filesystems/sysfs.txt
index 24da7b32c489..9a3658cc399e 100644
--- a/Documentation/filesystems/sysfs.txt
+++ b/Documentation/filesystems/sysfs.txt
@@ -366,7 +366,8 @@ struct driver_attribute {
Declaring:
-DRIVER_ATTR(_name, _mode, _show, _store)
+DRIVER_ATTR_RO(_name)
+DRIVER_ATTR_RW(_name)
Creation/Removal:
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
index 405a3df759b3..5fd325df59e2 100644
--- a/Documentation/filesystems/vfs.txt
+++ b/Documentation/filesystems/vfs.txt
@@ -988,7 +988,7 @@ struct dentry_operations {
struct vfsmount *(*d_automount)(struct path *);
int (*d_manage)(const struct path *, bool);
struct dentry *(*d_real)(struct dentry *, const struct inode *,
- unsigned int);
+ unsigned int, unsigned int);
};
d_revalidate: called when the VFS needs to revalidate a dentry. This
diff --git a/Documentation/i2c/i2c-topology b/Documentation/i2c/i2c-topology
index 1a014fede0b7..f74d78b53d4d 100644
--- a/Documentation/i2c/i2c-topology
+++ b/Documentation/i2c/i2c-topology
@@ -42,6 +42,10 @@ i2c-arb-gpio-challenge Parent-locked
i2c-mux-gpio Normally parent-locked, mux-locked iff
all involved gpio pins are controlled by the
same i2c root adapter that they mux.
+i2c-mux-gpmux Normally parent-locked, mux-locked iff
+ specified in device-tree.
+i2c-mux-ltc4306 Mux-locked
+i2c-mux-mlxcpld Parent-locked
i2c-mux-pca9541 Parent-locked
i2c-mux-pca954x Parent-locked
i2c-mux-pinctrl Normally parent-locked, mux-locked iff
@@ -50,9 +54,11 @@ i2c-mux-pinctrl Normally parent-locked, mux-locked iff
i2c-mux-reg Parent-locked
In drivers/iio/
+gyro/mpu3050 Mux-locked
imu/inv_mpu6050/ Mux-locked
In drivers/media/
+dvb-frontends/lgdt3306a Mux-locked
dvb-frontends/m88ds3103 Parent-locked
dvb-frontends/rtl2830 Parent-locked
dvb-frontends/rtl2832 Mux-locked
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index 57f52cdce32e..9ba04c0bab8d 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -2387,7 +2387,7 @@ broadcast: Like active-backup, there is not much advantage to this
and packet type ID), so in a "gatewayed" configuration, all
outgoing traffic will generally use the same device. Incoming
traffic may also end up on a single device, but that is
- dependent upon the balancing policy of the peer's 8023.ad
+ dependent upon the balancing policy of the peer's 802.3ad
implementation. In a "local" configuration, traffic will be
distributed across the devices in the bond.
diff --git a/Documentation/networking/filter.txt b/Documentation/networking/filter.txt
index e5e33bac2068..87814859cfc2 100644
--- a/Documentation/networking/filter.txt
+++ b/Documentation/networking/filter.txt
@@ -45,7 +45,7 @@ in many more places. There's xt_bpf for netfilter, cls_bpf in the kernel
qdisc layer, SECCOMP-BPF (SECure COMPuting [1]), and lots of other places
such as team driver, PTP code, etc where BPF is being used.
- [1] Documentation/prctl/seccomp_filter.txt
+ [1] Documentation/userspace-api/seccomp_filter.rst
Original BPF paper:
@@ -337,7 +337,7 @@ Examples for low-level BPF:
jeq #14, good /* __NR_rt_sigprocmask */
jeq #13, good /* __NR_rt_sigaction */
jeq #35, good /* __NR_nanosleep */
- bad: ret #0 /* SECCOMP_RET_KILL */
+ bad: ret #0 /* SECCOMP_RET_KILL_THREAD */
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
The above example code can be placed into a file (here called "foo"), and
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index b3345d0fe0a6..77f4de59dc9c 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -1680,6 +1680,9 @@ accept_dad - INTEGER
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
link-local address has been found.
+ DAD operation and mode on a given interface will be selected according
+ to the maximum value of conf/{all,interface}/accept_dad.
+
force_tllao - BOOLEAN
Enable sending the target link-layer address option even when
responding to a unicast neighbor solicitation.
@@ -1727,16 +1730,23 @@ suppress_frag_ndisc - INTEGER
optimistic_dad - BOOLEAN
Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
- 0: disabled (default)
- 1: enabled
+ 0: disabled (default)
+ 1: enabled
+
+ Optimistic Duplicate Address Detection for the interface will be enabled
+ if at least one of conf/{all,interface}/optimistic_dad is set to 1,
+ it will be disabled otherwise.
use_optimistic - BOOLEAN
If enabled, do not classify optimistic addresses as deprecated during
source address selection. Preferred addresses will still be chosen
before optimistic addresses, subject to other ranking in the source
address selection algorithm.
- 0: disabled (default)
- 1: enabled
+ 0: disabled (default)
+ 1: enabled
+
+ This will be enabled if at least one of
+ conf/{all,interface}/use_optimistic is set to 1, disabled otherwise.
stable_secret - IPv6 address
This IPv6 address will be used as a secret to generate IPv6
diff --git a/Documentation/networking/switchdev.txt b/Documentation/networking/switchdev.txt
index 5e40e1f68873..82236a17b5e6 100644
--- a/Documentation/networking/switchdev.txt
+++ b/Documentation/networking/switchdev.txt
@@ -13,42 +13,42 @@ an example setup using a data-center-class switch ASIC chip. Other setups
with SR-IOV or soft switches, such as OVS, are possible.
-                             User-space tools
-
-       user space                   |
-      +-------------------------------------------------------------------+
-       kernel                       | Netlink
-                                    |
-                     +--------------+-------------------------------+
-                     |         Network stack                        |
-                     |           (Linux)                            |
-                     |                                              |
-                     +----------------------------------------------+
+ User-space tools
+
+ user space |
+ +-------------------------------------------------------------------+
+ kernel | Netlink
+ |
+ +--------------+-------------------------------+
+ | Network stack |
+ | (Linux) |
+ | |
+ +----------------------------------------------+
sw1p2 sw1p4 sw1p6
-                      sw1p1  + sw1p3 +  sw1p5 +         eth1
-                        +    |    +    |    +    |            +
-                        |    |    |    |    |    |            |
-                     +--+----+----+----+-+--+----+---+  +-----+-----+
-                     |         Switch driver         |  |    mgmt   |
-                     |        (this document)        |  |   driver  |
-                     |                               |  |           |
-                     +--------------+----------------+  +-----------+
-                                    |
-       kernel                       | HW bus (eg PCI)
-      +-------------------------------------------------------------------+
-       hardware                     |
-                     +--------------+---+------------+
-                     |         Switch device (sw1)   |
-                     |  +----+                       +--------+
-                     |  |    v offloaded data path   | mgmt port
-                     |  |    |                       |
-                     +--|----|----+----+----+----+---+
-                        |    |    |    |    |    |
-                        +    +    +    +    +    +
-                       p1   p2   p3   p4   p5   p6
-
-                             front-panel ports
+ sw1p1 + sw1p3 + sw1p5 + eth1
+ + | + | + | +
+ | | | | | | |
+ +--+----+----+----+----+----+---+ +-----+-----+
+ | Switch driver | | mgmt |
+ | (this document) | | driver |
+ | | | |
+ +--------------+----------------+ +-----------+
+ |
+ kernel | HW bus (eg PCI)
+ +-------------------------------------------------------------------+
+ hardware |
+ +--------------+----------------+
+ | Switch device (sw1) |
+ | +----+ +--------+
+ | | v offloaded data path | mgmt port
+ | | | |
+ +--|----|----+----+----+----+---+
+ | | | | | |
+ + + + + + +
+ p1 p2 p3 p4 p5 p6
+
+ front-panel ports
Fig 1.
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index ce61d1fe08ca..694968c7523c 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -75,6 +75,7 @@ show up in /proc/sys/kernel:
- reboot-cmd [ SPARC only ]
- rtsig-max
- rtsig-nr
+- seccomp/ ==> Documentation/userspace-api/seccomp_filter.rst
- sem
- sem_next_id [ sysv ipc ]
- sg-big-buff [ generic SCSI device (sg) ]
diff --git a/Documentation/translations/ko_KR/memory-barriers.txt b/Documentation/translations/ko_KR/memory-barriers.txt
index bc80fc0e210f..a7a813258013 100644
--- a/Documentation/translations/ko_KR/memory-barriers.txt
+++ b/Documentation/translations/ko_KR/memory-barriers.txt
@@ -523,11 +523,11 @@ CPU 에게 기대할 수 있는 최소한의 보장사항 몇가지가 있습니
즉, ACQUIRE 는 최소한의 "취득" 동작처럼, 그리고 RELEASE 는 최소한의 "공개"
처럼 동작한다는 의미입니다.
-core-api/atomic_ops.rst 에서 설명되는 어토믹 오퍼레이션들 중에는 완전히
-순서잡힌 것들과 (배리어를 사용하지 않는) 완화된 순서의 것들 외에 ACQUIRE 와
-RELEASE 부류의 것들도 존재합니다. 로드와 스토어를 모두 수행하는 조합된 어토믹
-오퍼레이션에서, ACQUIRE 는 해당 오퍼레이션의 로드 부분에만 적용되고 RELEASE 는
-해당 오퍼레이션의 스토어 부분에만 적용됩니다.
+atomic_t.txt 에 설명된 어토믹 오퍼레이션들 중 일부는 완전히 순서잡힌 것들과
+(배리어를 사용하지 않는) 완화된 순서의 것들 외에 ACQUIRE 와 RELEASE 부류의
+것들도 존재합니다. 로드와 스토어를 모두 수행하는 조합된 어토믹 오퍼레이션에서,
+ACQUIRE 는 해당 오퍼레이션의 로드 부분에만 적용되고 RELEASE 는 해당
+오퍼레이션의 스토어 부분에만 적용됩니다.
메모리 배리어들은 두 CPU 간, 또는 CPU 와 디바이스 간에 상호작용의 가능성이 있을
때에만 필요합니다. 만약 어떤 코드에 그런 상호작용이 없을 것이 보장된다면, 해당
@@ -617,7 +617,22 @@ RELEASE 부류의 것들도 존재합니다. 로드와 스토어를 모두 수�
이 변경은 앞의 처음 두가지 결과 중 하나만이 발생할 수 있고, 세번째의 결과는
발생할 수 없도록 합니다.
-데이터 의존성 배리어는 의존적 쓰기에 대해서도 순서를 잡아줍니다:
+
+[!] 이 상당히 반직관적인 상황은 분리된 캐시를 가지는 기계들에서 가장 잘
+발생하는데, 예를 들면 한 캐시 뱅크는 짝수 번호의 캐시 라인들을 처리하고, 다른
+뱅크는 홀수 번호의 캐시 라인들을 처리하는 경우임을 알아두시기 바랍니다. 포인터
+P 는 짝수 번호 캐시 라인에 저장되어 있고, 변수 B 는 홀수 번호 캐시 라인에
+저장되어 있을 수 있습니다. 여기서 값을 읽어오는 CPU 의 캐시의 홀수 번호 처리
+뱅크는 열심히 일감을 처리중인 반면 홀수 번호 처리 뱅크는 할 일 없이 한가한
+중이라면 포인터 P (&B) 의 새로운 값과 변수 B 의 기존 값 (2) 를 볼 수 있습니다.
+
+
+의존적 쓰기들의 순서를 맞추는데에는 데이터 의존성 배리어가 필요치 않은데, 이는
+리눅스 커널이 지원하는 CPU 들은 (1) 쓰기가 정말로 일어날지, (2) 쓰기가 어디에
+이루어질지, 그리고 (3) 쓰여질 값을 확실히 알기 전까지는 쓰기를 수행하지 않기
+때문입니다. 하지만 "컨트롤 의존성" 섹션과
+Documentation/RCU/rcu_dereference.txt 파일을 주의 깊게 읽어 주시기 바랍니다:
+컴파일러는 매우 창의적인 많은 방법으로 종속성을 깰 수 있습니다.
CPU 1 CPU 2
=============== ===============
@@ -626,28 +641,19 @@ RELEASE 부류의 것들도 존재합니다. 로드와 스토어를 모두 수�
<쓰기 배리어>
WRITE_ONCE(P, &B);
Q = READ_ONCE(P);
- <데이터 의존성 배리어>
- *Q = 5;
+ WRITE_ONCE(*Q, 5);
-이 데이터 의존성 배리어는 Q 로의 읽기가 *Q 로의 스토어와 순서를 맞추게
-해줍니다. 이는 다음과 같은 결과를 막습니다:
+따라서, Q 로의 읽기와 *Q 로의 쓰기 사이에는 데이터 종속성 배리어가 필요치
+않습니다. 달리 말하면, 데이터 종속성 배리어가 없더라도 다음 결과는 생기지
+않습니다:
(Q == &B) && (B == 4)
이런 패턴은 드물게 사용되어야 함을 알아 두시기 바랍니다. 무엇보다도, 의존성
순서 규칙의 의도는 쓰기 작업을 -예방- 해서 그로 인해 발생하는 비싼 캐시 미스도
없애려는 것입니다. 이 패턴은 드물게 발생하는 에러 조건 같은것들을 기록하는데
-사용될 수 있고, 이렇게 배리어를 사용해 순서를 지키게 함으로써 그런 기록이
-사라지는 것을 막습니다.
-
-
-[!] 상당히 비직관적인 이 상황은 분리된 캐시를 가진 기계, 예를 들어 한 캐시
-뱅크가 짝수번 캐시 라인을 처리하고 다른 뱅크는 홀수번 캐시 라인을 처리하는 기계
-등에서 가장 잘 발생합니다. 포인터 P 는 홀수 번호의 캐시 라인에 있고, 변수 B 는
-짝수 번호 캐시 라인에 있다고 생각해 봅시다. 그런 상태에서 읽기 작업을 하는 CPU
-의 짝수번 뱅크는 할 일이 쌓여 매우 바쁘지만 홀수번 뱅크는 할 일이 없어 아무
-일도 하지 않고 있었다면, 포인터 P 는 새 값 (&B) 을, 그리고 변수 B 는 옛날 값
-(2) 을 가지고 있는 상태가 보여질 수도 있습니다.
+사용될 수 있으며, CPU의 자연적인 순서 보장이 그런 기록들을 사라지지 않게
+해줍니다.
데이터 의존성 배리어는 매우 중요한데, 예를 들어 RCU 시스템에서 그렇습니다.
@@ -1848,8 +1854,7 @@ Mandatory 배리어들은 SMP 시스템에서도 UP 시스템에서도 SMP 효�
이 코드는 객체의 업데이트된 death 마크가 레퍼런스 카운터 감소 동작
*전에* 보일 것을 보장합니다.
- 더 많은 정보를 위해선 Documentation/core-api/atomic_ops.rst 문서를 참고하세요.
- 어디서 이것들을 사용해야 할지 궁금하다면 "어토믹 오퍼레이션" 서브섹션을
+ 더 많은 정보를 위해선 Documentation/atomic_{t,bitops}.txt 문서를
참고하세요.
@@ -2468,86 +2473,7 @@ _않습니다_.
전체 메모리 배리어를 내포하고 또 일부는 내포하지 않지만, 커널에서 상당히
의존적으로 사용하는 기능 중 하나입니다.
-메모리의 어떤 상태를 수정하고 해당 상태에 대한 (예전의 또는 최신의) 정보를
-리턴하는 어토믹 오퍼레이션은 모두 SMP-조건적 범용 메모리 배리어(smp_mb())를
-실제 오퍼레이션의 앞과 뒤에 내포합니다. 이런 오퍼레이션은 다음의 것들을
-포함합니다:
-
- xchg();
- atomic_xchg(); atomic_long_xchg();
- atomic_inc_return(); atomic_long_inc_return();
- atomic_dec_return(); atomic_long_dec_return();
- atomic_add_return(); atomic_long_add_return();
- atomic_sub_return(); atomic_long_sub_return();
- atomic_inc_and_test(); atomic_long_inc_and_test();
- atomic_dec_and_test(); atomic_long_dec_and_test();
- atomic_sub_and_test(); atomic_long_sub_and_test();
- atomic_add_negative(); atomic_long_add_negative();
- test_and_set_bit();
- test_and_clear_bit();
- test_and_change_bit();
-
- /* exchange 조건이 성공할 때 */
- cmpxchg();
- atomic_cmpxchg(); atomic_long_cmpxchg();
- atomic_add_unless(); atomic_long_add_unless();
-
-이것들은 메모리 배리어 효과가 필요한 ACQUIRE 부류와 RELEASE 부류 오퍼레이션들을
-구현할 때, 그리고 객체 해제를 위해 레퍼런스 카운터를 조정할 때, 암묵적 메모리
-배리어 효과가 필요한 곳 등에 사용됩니다.
-
-
-다음의 오퍼레이션들은 메모리 배리어를 내포하지 _않기_ 때문에 문제가 될 수
-있지만, RELEASE 부류의 오퍼레이션들과 같은 것들을 구현할 때 사용될 수도
-있습니다:
-
- atomic_set();
- set_bit();
- clear_bit();
- change_bit();
-
-이것들을 사용할 때에는 필요하다면 적절한 (예를 들면 smp_mb__before_atomic()
-같은) 메모리 배리어가 명시적으로 함께 사용되어야 합니다.
-
-
-아래의 것들도 메모리 배리어를 내포하지 _않기_ 때문에, 일부 환경에서는 (예를
-들면 smp_mb__before_atomic() 과 같은) 명시적인 메모리 배리어 사용이 필요합니다.
-
- atomic_add();
- atomic_sub();
- atomic_inc();
- atomic_dec();
-
-이것들이 통계 생성을 위해 사용된다면, 그리고 통계 데이터 사이에 관계가 존재하지
-않는다면 메모리 배리어는 필요치 않을 겁니다.
-
-객체의 수명을 관리하기 위해 레퍼런스 카운팅 목적으로 사용된다면, 레퍼런스
-카운터는 락으로 보호되는 섹션에서만 조정되거나 호출하는 쪽이 이미 충분한
-레퍼런스를 잡고 있을 것이기 때문에 메모리 배리어는 아마 필요 없을 겁니다.
-
-만약 어떤 락을 구성하기 위해 사용된다면, 락 관련 동작은 일반적으로 작업을 특정
-순서대로 진행해야 하므로 메모리 배리어가 필요할 수 있습니다.
-
-기본적으로, 각 사용처에서는 메모리 배리어가 필요한지 아닌지 충분히 고려해야
-합니다.
-
-아래의 오퍼레이션들은 특별한 락 관련 동작들입니다:
-
- test_and_set_bit_lock();
- clear_bit_unlock();
- __clear_bit_unlock();
-
-이것들은 ACQUIRE 류와 RELEASE 류의 오퍼레이션들을 구현합니다. 락 관련 도구를
-구현할 때에는 이것들을 좀 더 선호하는 편이 나은데, 이것들의 구현은 많은
-아키텍쳐에서 최적화 될 수 있기 때문입니다.
-
-[!] 이런 상황에 사용할 수 있는 특수한 메모리 배리어 도구들이 있습니다만, 일부
-CPU 에서는 사용되는 어토믹 인스트럭션 자체에 메모리 배리어가 내포되어 있어서
-어토믹 오퍼레이션과 메모리 배리어를 함께 사용하는 게 불필요한 일이 될 수
-있는데, 그런 경우에 이 특수 메모리 배리어 도구들은 no-op 이 되어 실질적으로
-아무일도 하지 않습니다.
-
-더 많은 내용을 위해선 Documentation/core-api/atomic_ops.rst 를 참고하세요.
+더 많은 내용을 위해선 Documentation/atomic_t.txt 를 참고하세요.
디바이스 액세스
diff --git a/Documentation/userspace-api/seccomp_filter.rst b/Documentation/userspace-api/seccomp_filter.rst
index f71eb5ef1f2d..099c412951d6 100644
--- a/Documentation/userspace-api/seccomp_filter.rst
+++ b/Documentation/userspace-api/seccomp_filter.rst
@@ -87,11 +87,16 @@ Return values
A seccomp filter may return any of the following values. If multiple
filters exist, the return value for the evaluation of a given system
call will always use the highest precedent value. (For example,
-``SECCOMP_RET_KILL`` will always take precedence.)
+``SECCOMP_RET_KILL_PROCESS`` will always take precedence.)
In precedence order, they are:
-``SECCOMP_RET_KILL``:
+``SECCOMP_RET_KILL_PROCESS``:
+ Results in the entire process exiting immediately without executing
+ the system call. The exit status of the task (``status & 0x7f``)
+ will be ``SIGSYS``, not ``SIGKILL``.
+
+``SECCOMP_RET_KILL_THREAD``:
Results in the task exiting immediately without executing the
system call. The exit status of the task (``status & 0x7f``) will
be ``SIGSYS``, not ``SIGKILL``.
@@ -141,6 +146,15 @@ In precedence order, they are:
allow use of ptrace, even of other sandboxed processes, without
extreme care; ptracers can use this mechanism to escape.)
+``SECCOMP_RET_LOG``:
+ Results in the system call being executed after it is logged. This
+ should be used by application developers to learn which syscalls their
+ application needs without having to iterate through multiple test and
+ development cycles to build the list.
+
+ This action will only be logged if "log" is present in the
+ actions_logged sysctl string.
+
``SECCOMP_RET_ALLOW``:
Results in the system call being executed.
@@ -169,7 +183,41 @@ The ``samples/seccomp/`` directory contains both an x86-specific example
and a more generic example of a higher level macro interface for BPF
program generation.
+Sysctls
+=======
+Seccomp's sysctl files can be found in the ``/proc/sys/kernel/seccomp/``
+directory. Here's a description of each file in that directory:
+
+``actions_avail``:
+ A read-only ordered list of seccomp return values (refer to the
+ ``SECCOMP_RET_*`` macros above) in string form. The ordering, from
+ left-to-right, is the least permissive return value to the most
+ permissive return value.
+
+ The list represents the set of seccomp return values supported
+ by the kernel. A userspace program may use this list to
+ determine if the actions found in the ``seccomp.h``, when the
+ program was built, differs from the set of actions actually
+ supported in the current running kernel.
+
+``actions_logged``:
+ A read-write ordered list of seccomp return values (refer to the
+ ``SECCOMP_RET_*`` macros above) that are allowed to be logged. Writes
+ to the file do not need to be in ordered form but reads from the file
+ will be ordered in the same way as the actions_avail sysctl.
+
+ It is important to note that the value of ``actions_logged`` does not
+ prevent certain actions from being logged when the audit subsystem is
+ configured to audit a task. If the action is not found in
+ ``actions_logged`` list, the final decision on whether to audit the
+ action for that task is ultimately left up to the audit subsystem to
+ decide for all seccomp return values other than ``SECCOMP_RET_ALLOW``.
+
+ The ``allow`` string is not accepted in the ``actions_logged`` sysctl
+ as it is not possible to log ``SECCOMP_RET_ALLOW`` actions. Attempting
+ to write ``allow`` to the sysctl will result in an EINVAL being
+ returned.
Adding architecture support
===========================
diff --git a/Documentation/watchdog/watchdog-parameters.txt b/Documentation/watchdog/watchdog-parameters.txt
index b3526365ea8e..6f9d7b418917 100644
--- a/Documentation/watchdog/watchdog-parameters.txt
+++ b/Documentation/watchdog/watchdog-parameters.txt
@@ -117,7 +117,7 @@ nowayout: Watchdog cannot be stopped once started
-------------------------------------------------
iTCO_wdt:
heartbeat: Watchdog heartbeat in seconds.
- (5<=heartbeat<=74 (TCO v1) or 1226 (TCO v2), default=30)
+ (2<heartbeat<39 (TCO v1) or 613 (TCO v2), default=30)
nowayout: Watchdog cannot be stopped once started
(default=kernel config parameter)
-------------------------------------------------
diff --git a/MAINTAINERS b/MAINTAINERS
index 7f32b510fdea..cc42c838ab4f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -352,6 +352,18 @@ L: [email protected]
S: Maintained
F: drivers/acpi/arm64
+ACPI PMIC DRIVERS
+M: "Rafael J. Wysocki" <[email protected]>
+M: Len Brown <[email protected]>
+R: Andy Shevchenko <[email protected]>
+R: Mika Westerberg <[email protected]>
+Q: https://patchwork.kernel.org/project/linux-acpi/list/
+T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
+B: https://bugzilla.kernel.org
+S: Supported
+F: drivers/acpi/pmic/
+
ACPI THERMAL DRIVER
M: Zhang Rui <[email protected]>
@@ -644,6 +656,11 @@ ALPS PS/2 TOUCHPAD DRIVER
R: Pali Rohár <[email protected]>
F: drivers/input/mouse/alps.*
+ALTERA I2C CONTROLLER DRIVER
+M: Thor Thayer <[email protected]>
+S: Maintained
+F: drivers/i2c/busses/i2c-altera.c
+
ALTERA MAILBOX DRIVER
M: Ley Foon Tan <[email protected]>
L: [email protected] (moderated for non-subscribers)
@@ -855,6 +872,12 @@ S: Supported
F: drivers/android/
F: drivers/staging/android/
+ANDROID GOLDFISH RTC DRIVER
+M: Miodrag Dinic <[email protected]>
+S: Supported
+F: Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt
+F: drivers/rtc/rtc-goldfish.c
+
ANDROID ION DRIVER
M: Laura Abbott <[email protected]>
M: Sumit Semwal <[email protected]>
@@ -2101,17 +2124,38 @@ F: arch/arm/mach-pxa/include/mach/z2.h
ARM/ZTE ARCHITECTURE
M: Jun Nie <[email protected]>
M: Baoyou Xie <[email protected]>
+M: Shawn Guo <[email protected]>
L: [email protected] (moderated for non-subscribers)
S: Maintained
+F: arch/arm/boot/dts/zx2967*
F: arch/arm/mach-zx/
+F: arch/arm64/boot/dts/zte/
F: drivers/clk/zte/
+F: drivers/dma/zx_dma.c
+F: drivers/gpio/gpio-zx.c
+F: drivers/i2c/busses/i2c-zx2967.c
+F: drivers/mmc/host/dw_mmc-zx.*
+F: drivers/pinctrl/zte/
F: drivers/reset/reset-zx2967.c
F: drivers/soc/zte/
+F: drivers/thermal/zx2967_thermal.c
+F: drivers/watchdog/zx2967_wdt.c
F: Documentation/devicetree/bindings/arm/zte.txt
-F: Documentation/devicetree/bindings/clock/zx296702-clk.txt
+F: Documentation/devicetree/bindings/clock/zx2967*.txt
+F: Documentation/devicetree/bindings/dma/zxdma.txt
+F: Documentation/devicetree/bindings/gpio/zx296702-gpio.txt
+F: Documentation/devicetree/bindings/i2c/i2c-zx2967.txt
+F: Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt
+F: Documentation/devicetree/bindings/pinctrl/pinctrl-zx.txt
F: Documentation/devicetree/bindings/reset/zte,zx2967-reset.txt
F: Documentation/devicetree/bindings/soc/zte/
-F: include/dt-bindings/soc/zx*.h
+F: Documentation/devicetree/bindings/sound/zte,*.txt
+F: Documentation/devicetree/bindings/thermal/zx2967-thermal.txt
+F: Documentation/devicetree/bindings/watchdog/zte,zx2967-wdt.txt
+F: include/dt-bindings/clock/zx2967*.h
+F: include/dt-bindings/soc/zte,*.h
+F: sound/soc/codecs/zx_aud96p22.c
+F: sound/soc/zte/
ARM/ZYNQ ARCHITECTURE
M: Michal Simek <[email protected]>
@@ -2575,13 +2619,6 @@ W: http://blackfin.uclinux.org
S: Supported
F: drivers/net/ethernet/adi/
-BLACKFIN I2C TWI DRIVER
-M: Sonic Zhang <[email protected]>
-L: [email protected] (moderated for non-subscribers)
-W: http://blackfin.uclinux.org/
-S: Supported
-F: drivers/i2c/busses/i2c-bfin-twi.c
-
BLACKFIN MEDIA DRIVER
M: Scott Jiang <[email protected]>
L: [email protected] (moderated for non-subscribers)
@@ -2598,14 +2635,12 @@ S: Supported
F: drivers/rtc/rtc-bfin.c
BLACKFIN SDH DRIVER
-M: Sonic Zhang <[email protected]>
L: [email protected] (moderated for non-subscribers)
W: http://blackfin.uclinux.org
S: Supported
F: drivers/mmc/host/bfin_sdh.c
BLACKFIN SERIAL DRIVER
-M: Sonic Zhang <[email protected]>
L: [email protected] (moderated for non-subscribers)
W: http://blackfin.uclinux.org
S: Supported
@@ -2830,7 +2865,6 @@ S: Supported
F: drivers/scsi/bnx2i/
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
-M: Yuval Mintz <[email protected]>
M: Ariel Elior <[email protected]>
@@ -3184,6 +3218,7 @@ S: Supported
F: drivers/crypto/cavium/cpt/
CAVIUM THUNDERX2 ARM64 SOC
+M: Robert Richter <[email protected]>
M: Jayachandran C <[email protected]>
L: [email protected] (moderated for non-subscribers)
S: Maintained
@@ -4206,7 +4241,7 @@ DMA MAPPING HELPERS
M: Christoph Hellwig <[email protected]>
M: Marek Szyprowski <[email protected]>
R: Robin Murphy <[email protected]>
T: git git://git.infradead.org/users/hch/dma-mapping.git
W: http://git.infradead.org/users/hch/dma-mapping.git
S: Supported
@@ -4372,6 +4407,12 @@ S: Supported
F: drivers/gpu/drm/nouveau/
F: include/uapi/drm/nouveau_drm.h
+DRM DRIVER FOR PERVASIVE DISPLAYS REPAPER PANELS
+M: Noralf Trønnes <[email protected]>
+S: Maintained
+F: drivers/gpu/drm/tinydrm/repaper.c
+F: Documentation/devicetree/bindings/display/repaper.txt
+
DRM DRIVER FOR QEMU'S CIRRUS DEVICE
M: Dave Airlie <[email protected]>
M: Gerd Hoffmann <[email protected]>
@@ -4390,12 +4431,6 @@ S: Maintained
F: drivers/gpu/drm/qxl/
F: include/uapi/drm/qxl_drm.h
-DRM DRIVER FOR PERVASIVE DISPLAYS REPAPER PANELS
-M: Noralf Trønnes <[email protected]>
-S: Maintained
-F: drivers/gpu/drm/tinydrm/repaper.c
-F: Documentation/devicetree/bindings/display/repaper.txt
-
DRM DRIVER FOR RAGE 128 VIDEO CARDS
S: Orphan / Obsolete
F: drivers/gpu/drm/r128/
@@ -6189,22 +6224,22 @@ F: include/uapi/linux/if_hippi.h
F: net/802/hippi.c
F: drivers/net/hippi/
-HISILICON NETWORK SUBSYSTEM DRIVER
+HISILICON NETWORK SUBSYSTEM 3 DRIVER (HNS3)
M: Yisen Zhuang <[email protected]>
M: Salil Mehta <[email protected]>
W: http://www.hisilicon.com
S: Maintained
-F: drivers/net/ethernet/hisilicon/
-F: Documentation/devicetree/bindings/net/hisilicon*.txt
+F: drivers/net/ethernet/hisilicon/hns3/
-HISILICON NETWORK SUBSYSTEM 3 DRIVER (HNS3)
+HISILICON NETWORK SUBSYSTEM DRIVER
M: Yisen Zhuang <[email protected]>
M: Salil Mehta <[email protected]>
W: http://www.hisilicon.com
S: Maintained
-F: drivers/net/ethernet/hisilicon/hns3/
+F: drivers/net/ethernet/hisilicon/
+F: Documentation/devicetree/bindings/net/hisilicon*.txt
HISILICON ROCE DRIVER
M: Lijun Ou <[email protected]>
@@ -6221,6 +6256,13 @@ S: Supported
F: drivers/scsi/hisi_sas/
F: Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
+HMM - Heterogeneous Memory Management
+M: Jérôme Glisse <[email protected]>
+S: Maintained
+F: mm/hmm*
+F: include/linux/hmm*
+
HOST AP DRIVER
M: Jouni Malinen <[email protected]>
@@ -6441,6 +6483,12 @@ F: drivers/i2c/busses/i2c-sis96x.c
F: drivers/i2c/busses/i2c-via.c
F: drivers/i2c/busses/i2c-viapro.c
+I2C/SMBUS INTEL CHT WHISKEY COVE PMIC DRIVER
+M: Hans de Goede <[email protected]>
+S: Maintained
+F: drivers/i2c/busses/i2c-cht-wc.c
+
I2C/SMBUS ISMT DRIVER
M: Seth Heasley <[email protected]>
M: Neil Horman <[email protected]>
@@ -6606,8 +6654,8 @@ M: Alexander Aring <[email protected]>
M: Stefan Schmidt <[email protected]>
W: http://wpan.cakelab.org/
-T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
-T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
+T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git
+T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan-next.git
S: Maintained
F: net/ieee802154/
F: net/mac802154/
@@ -6690,7 +6738,7 @@ F: Documentation/devicetree/bindings/auxdisplay/img-ascii-lcd.txt
F: drivers/auxdisplay/img-ascii-lcd.c
IMGTEC IR DECODER DRIVER
-M: James Hogan <[email protected]>
+M: James Hogan <[email protected]>
S: Maintained
F: drivers/media/rc/img-ir/
@@ -7481,19 +7529,6 @@ F: include/kvm/iodev.h
F: virt/kvm/*
F: tools/kvm/
-KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
-M: Paolo Bonzini <[email protected]>
-M: Radim KrÄmář <[email protected]>
-W: http://www.linux-kvm.org
-T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
-S: Supported
-F: arch/x86/kvm/
-F: arch/x86/include/uapi/asm/kvm*
-F: arch/x86/include/asm/kvm*
-F: arch/x86/kernel/kvm.c
-F: arch/x86/kernel/kvmclock.c
-
KERNEL VIRTUAL MACHINE FOR AMD-V (KVM/amd)
M: Joerg Roedel <[email protected]>
@@ -7516,17 +7551,6 @@ F: arch/arm/kvm/
F: virt/kvm/arm/
F: include/kvm/arm_*
-KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
-M: Alexander Graf <[email protected]>
-W: http://www.linux-kvm.org/
-T: git git://github.com/agraf/linux-2.6.git
-S: Supported
-F: arch/powerpc/include/uapi/asm/kvm*
-F: arch/powerpc/include/asm/kvm*
-F: arch/powerpc/kvm/
-F: arch/powerpc/kernel/kvm*
-
KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64)
M: Christoffer Dall <[email protected]>
M: Marc Zyngier <[email protected]>
@@ -7538,13 +7562,24 @@ F: arch/arm64/include/asm/kvm*
F: arch/arm64/kvm/
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
-M: James Hogan <[email protected]>
+M: James Hogan <[email protected]>
S: Supported
F: arch/mips/include/uapi/asm/kvm*
F: arch/mips/include/asm/kvm*
F: arch/mips/kvm/
+KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
+M: Alexander Graf <[email protected]>
+W: http://www.linux-kvm.org/
+T: git git://github.com/agraf/linux-2.6.git
+S: Supported
+F: arch/powerpc/include/uapi/asm/kvm*
+F: arch/powerpc/include/asm/kvm*
+F: arch/powerpc/kvm/
+F: arch/powerpc/kernel/kvm*
+
KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
M: Christian Borntraeger <[email protected]>
M: Cornelia Huck <[email protected]>
@@ -7558,6 +7593,19 @@ F: arch/s390/include/asm/kvm*
F: arch/s390/kvm/
F: arch/s390/mm/gmap.c
+KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
+M: Paolo Bonzini <[email protected]>
+M: Radim Krčmář <[email protected]>
+W: http://www.linux-kvm.org
+T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
+S: Supported
+F: arch/x86/kvm/
+F: arch/x86/include/uapi/asm/kvm*
+F: arch/x86/include/asm/kvm*
+F: arch/x86/kernel/kvm.c
+F: arch/x86/kernel/kvmclock.c
+
KERNFS
M: Greg Kroah-Hartman <[email protected]>
M: Tejun Heo <[email protected]>
@@ -7680,6 +7728,7 @@ M: John Crispin <[email protected]>
S: Maintained
F: arch/mips/lantiq
+F: drivers/soc/lantiq
LAPB module
@@ -7797,13 +7846,6 @@ M: Sasha Levin <[email protected]>
S: Maintained
F: tools/lib/lockdep/
-HMM - Heterogeneous Memory Management
-M: Jérôme Glisse <[email protected]>
-S: Maintained
-F: mm/hmm*
-F: include/linux/hmm*
-
LIBNVDIMM BLK: MMIO-APERTURE DRIVER
M: Ross Zwisler <[email protected]>
@@ -8222,6 +8264,12 @@ L: [email protected]
S: Orphan
F: drivers/net/wireless/marvell/libertas/
+MARVELL MACCHIATOBIN SUPPORT
+M: Russell King <[email protected]>
+S: Maintained
+F: arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts
+
MARVELL MV643XX ETHERNET DRIVER
M: Sebastian Hesselbarth <[email protected]>
@@ -8398,6 +8446,14 @@ T: git git://linuxtv.org/media_tree.git
S: Supported
F: drivers/media/dvb-frontends/cxd2841er*
+MEDIA DRIVERS FOR DIGITAL DEVICES PCIE DEVICES
+M: Daniel Scheller <[email protected]>
+W: https://linuxtv.org
+T: git git://linuxtv.org/media_tree.git
+S: Maintained
+F: drivers/media/pci/ddbridge/*
+
MEDIA DRIVERS FOR FREESCALE IMX
M: Steve Longerbeam <[email protected]>
M: Philipp Zabel <[email protected]>
@@ -8519,14 +8575,6 @@ T: git git://linuxtv.org/media_tree.git
S: Maintained
F: drivers/media/dvb-frontends/stv6111*
-MEDIA DRIVERS FOR DIGITAL DEVICES PCIE DEVICES
-M: Daniel Scheller <[email protected]>
-W: https://linuxtv.org
-T: git git://linuxtv.org/media_tree.git
-S: Maintained
-F: drivers/media/pci/ddbridge/*
-
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
M: Mauro Carvalho Chehab <[email protected]>
M: Mauro Carvalho Chehab <[email protected]>
@@ -8550,6 +8598,17 @@ F: include/uapi/linux/meye.h
F: include/uapi/linux/ivtv*
F: include/uapi/linux/uvcvideo.h
+MEDIATEK CIR DRIVER
+M: Sean Wang <[email protected]>
+S: Maintained
+F: drivers/media/rc/mtk-cir.c
+
+MEDIATEK PMIC LED DRIVER
+M: Sean Wang <[email protected]>
+S: Maintained
+F: drivers/leds/leds-mt6323.c
+F: Documentation/devicetree/bindings/leds/leds-mt6323.txt
+
MEDIATEK ETHERNET DRIVER
M: Felix Fietkau <[email protected]>
M: John Crispin <[email protected]>
@@ -8590,11 +8649,6 @@ L: [email protected]
S: Maintained
F: drivers/net/wireless/mediatek/mt7601u/
-MEDIATEK CIR DRIVER
-M: Sean Wang <[email protected]>
-S: Maintained
-F: drivers/media/rc/mtk-cir.c
-
MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
M: Sean Wang <[email protected]>
S: Maintained
@@ -8837,7 +8891,7 @@ F: Documentation/devicetree/bindings/media/meson-ao-cec.txt
T: git git://linuxtv.org/media_tree.git
METAG ARCHITECTURE
-M: James Hogan <[email protected]>
+M: James Hogan <[email protected]>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag.git
S: Odd Fixes
@@ -8952,6 +9006,7 @@ M: Paul Burton <[email protected]>
S: Supported
F: arch/mips/generic/
+F: arch/mips/tools/generic-board-config.sh
MIPS/LOONGSON1 ARCHITECTURE
M: Keguang Zhang <[email protected]>
@@ -8962,6 +9017,13 @@ F: arch/mips/include/asm/mach-loongson32/
F: drivers/*/*loongson1*
F: drivers/*/*/*loongson1*
+MIPS RINT INSTRUCTION EMULATION
+M: Aleksandar Markovic <[email protected]>
+S: Supported
+F: arch/mips/math-emu/sp_rint.c
+F: arch/mips/math-emu/dp_rint.c
+
MIROSOUND PCM20 FM RADIO RECEIVER DRIVER
M: Hans Verkuil <[email protected]>
@@ -9187,7 +9249,7 @@ T: git git://git.infradead.org/linux-mtd.git nand/fixes
T: git git://git.infradead.org/l2-mtd.git nand/next
S: Maintained
F: drivers/mtd/nand/
-F: include/linux/mtd/nand*.h
+F: include/linux/mtd/*nand*.h
NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
M: Daniel Mack <[email protected]>
@@ -9279,15 +9341,6 @@ F: net/*/netfilter/
F: net/netfilter/
F: net/bridge/br_netfilter*.c
-NETLABEL
-M: Paul Moore <[email protected]>
-W: http://netlabel.sf.net
-S: Maintained
-F: Documentation/netlabel/
-F: include/net/netlabel.h
-F: net/netlabel/
-
NETROM NETWORK LAYER
M: Ralf Baechle <[email protected]>
@@ -9415,10 +9468,23 @@ F: net/ipv6/
F: include/net/ip*
F: arch/x86/net/*
-NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK)
+NETWORKING [LABELED] (NetLabel, Labeled IPsec, SECMARK)
M: Paul Moore <[email protected]>
+W: https://github.com/netlabel
S: Maintained
+F: Documentation/netlabel/
+F: include/net/calipso.h
+F: include/net/cipso_ipv4.h
+F: include/net/netlabel.h
+F: include/uapi/linux/netfilter/xt_SECMARK.h
+F: include/uapi/linux/netfilter/xt_CONNSECMARK.h
+F: net/netlabel/
+F: net/ipv4/cipso_ipv4.c
+F: net/ipv6/calipso.c
+F: net/netfilter/xt_CONNSECMARK.c
+F: net/netfilter/xt_SECMARK.c
NETWORKING [TLS]
M: Ilya Lesokhin <[email protected]>
@@ -9835,6 +9901,12 @@ F: drivers/regulator/twl-regulator.c
F: drivers/regulator/twl6030-regulator.c
F: include/linux/i2c-omap.h
+ONION OMEGA2+ BOARD
+M: Harvey Hunt <[email protected]>
+S: Maintained
+F: arch/mips/boot/dts/ralink/omega2p.dts
+
OMFS FILESYSTEM
M: Bob Copeland <[email protected]>
@@ -10106,7 +10178,7 @@ F: include/uapi/linux/ppdev.h
F: Documentation/parport*.txt
PARAVIRT_OPS INTERFACE
-M: Jeremy Fitzhardinge <[email protected]>
+M: Juergen Gross <[email protected]>
M: Chris Wright <[email protected]>
M: Alok Kataria <[email protected]>
M: Rusty Russell <[email protected]>
@@ -10114,7 +10186,7 @@ L: [email protected]
S: Supported
F: Documentation/virtual/paravirt_ops.txt
F: arch/*/kernel/paravirt*
-F: arch/*/include/asm/paravirt.h
+F: arch/*/include/asm/paravirt*.h
F: include/linux/hypervisor.h
PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
@@ -10998,7 +11070,6 @@ S: Supported
F: drivers/scsi/qedi/
QLOGIC QL4xxx ETHERNET DRIVER
-M: Yuval Mintz <[email protected]>
M: Ariel Elior <[email protected]>
@@ -11120,6 +11191,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rkuo/linux-hexagon-kernel.g
S: Supported
F: arch/hexagon/
+QUALCOMM IOMMU
+M: Rob Clark <[email protected]>
+S: Maintained
+F: drivers/iommu/qcom_iommu.c
+
QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
M: Stanimir Varbanov <[email protected]>
@@ -11379,6 +11457,8 @@ RENESAS ETHERNET DRIVERS
R: Sergei Shtylyov <[email protected]>
+F: Documentation/devicetree/bindings/net/renesas,*.txt
+F: Documentation/devicetree/bindings/net/sh_eth.txt
F: drivers/net/ethernet/renesas/
F: include/linux/sh_eth.h
@@ -11997,8 +12077,9 @@ M: Paul Moore <[email protected]>
M: Stephen Smalley <[email protected]>
M: Eric Paris <[email protected]>
L: [email protected] (moderated for non-subscribers)
-W: http://selinuxproject.org
-T: git git://git.infradead.org/users/pcmoore/selinux
+W: https://selinuxproject.org
+W: https://github.com/SELinuxProject
+T: git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git
S: Supported
F: include/linux/selinux*
F: security/selinux/
@@ -12485,6 +12566,7 @@ F: drivers/tty/serial/sunsab.h
F: drivers/tty/serial/sunsu.c
F: drivers/tty/serial/sunzilog.c
F: drivers/tty/serial/sunzilog.h
+F: drivers/tty/vcc.c
SPARSE CHECKER
M: "Christopher Li" <[email protected]>
@@ -12804,6 +12886,18 @@ F: drivers/clocksource/arc_timer.c
F: drivers/tty/serial/arc_uart.c
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc.git
+SYNOPSYS ARC HSDK SDP pll clock driver
+M: Eugeniy Paltsev <[email protected]>
+S: Supported
+F: drivers/clk/clk-hsdk-pll.c
+F: Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt
+
+SYNOPSYS ARC SDP clock driver
+M: Eugeniy Paltsev <[email protected]>
+S: Supported
+F: drivers/clk/axs10x/*
+F: Documentation/devicetree/bindings/clock/snps,pll-clock.txt
+
SYNOPSYS ARC SDP platform support
M: Alexey Brodkin <[email protected]>
S: Supported
@@ -12840,6 +12934,13 @@ L: [email protected]
S: Maintained
F: drivers/mmc/host/dw_mmc*
+SYNOPSYS HSDK RESET CONTROLLER DRIVER
+M: Eugeniy Paltsev <[email protected]>
+S: Supported
+F: drivers/reset/reset-hsdk.c
+F: include/dt-bindings/reset/snps,hsdk-reset.h
+F: Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt
+
SYSTEM CONFIGURATION (SYSCON)
M: Lee Jones <[email protected]>
M: Arnd Bergmann <[email protected]>
@@ -14328,6 +14429,12 @@ L: [email protected]
S: Maintained
F: drivers/net/vmxnet3/
+VOCORE VOCORE2 BOARD
+M: Harvey Hunt <[email protected]>
+S: Maintained
+F: arch/mips/boot/dts/ralink/vocore2.dts
+
VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <[email protected]>
M: Mark Brown <[email protected]>
diff --git a/Makefile b/Makefile
index ab067d51ddf1..cf007a31d575 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
VERSION = 4
-PATCHLEVEL = 13
+PATCHLEVEL = 14
SUBLEVEL = 0
-EXTRAVERSION =
+EXTRAVERSION = -rc3
NAME = Fearless Coyote
# *DOCUMENTATION*
@@ -130,8 +130,8 @@ endif
ifneq ($(KBUILD_OUTPUT),)
# check that the output directory actually exists
saved-output := $(KBUILD_OUTPUT)
-KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) \
- && /bin/pwd)
+$(shell [ -d $(KBUILD_OUTPUT) ] || mkdir -p $(KBUILD_OUTPUT))
+KBUILD_OUTPUT := $(realpath $(KBUILD_OUTPUT))
$(if $(KBUILD_OUTPUT),, \
$(error failed to create output directory "$(saved-output)"))
@@ -978,7 +978,7 @@ ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_GDB_SCRIPTS
- $(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinux-gdb.py
+ $(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py)
endif
ifdef CONFIG_TRIM_UNUSED_KSYMS
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
@@ -1129,16 +1129,6 @@ headerdep:
$(srctree)/scripts/headerdep.pl -I$(srctree)/include
# ---------------------------------------------------------------------------
-# Firmware install
-INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware
-export INSTALL_FW_PATH
-
-PHONY += firmware_install
-firmware_install:
- @mkdir -p $(objtree)/firmware
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install
-
-# ---------------------------------------------------------------------------
# Kernel headers
#Default location for installed headers
@@ -1182,11 +1172,11 @@ headers_check: headers_install
PHONY += kselftest
kselftest:
- $(Q)$(MAKE) -C tools/testing/selftests run_tests
+ $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests
PHONY += kselftest-clean
kselftest-clean:
- $(Q)$(MAKE) -C tools/testing/selftests clean
+ $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests clean
PHONY += kselftest-merge
kselftest-merge:
@@ -1216,7 +1206,6 @@ modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
$(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin
@@ -1238,7 +1227,7 @@ _modinst_:
@rm -rf $(MODLIB)/kernel
@rm -f $(MODLIB)/source
@mkdir -p $(MODLIB)/kernel
- @ln -s `cd $(srctree) && /bin/pwd` $(MODLIB)/source
+ @ln -s $(abspath $(srctree)) $(MODLIB)/source
@if [ ! $(objtree) -ef $(MODLIB)/build ]; then \
rm -f $(MODLIB)/build ; \
ln -s $(CURDIR) $(MODLIB)/build ; \
@@ -1252,7 +1241,6 @@ _modinst_:
# boot script depmod is the master version.
PHONY += _modinst_post
_modinst_post: _modinst_
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modinst
$(call cmd,depmod)
ifeq ($(CONFIG_MODULE_SIG), y)
@@ -1375,8 +1363,6 @@ help:
@echo '* vmlinux - Build the bare kernel'
@echo '* modules - Build all modules'
@echo ' modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
- @echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
- @echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
@echo ' dir/ - Build all files in dir and below'
@echo ' dir/file.[ois] - Build specified target only'
@echo ' dir/file.ll - Build the LLVM assembly file'
@@ -1630,11 +1616,11 @@ image_name:
# Clear a bunch of variables before executing the submake
tools/: FORCE
$(Q)mkdir -p $(objtree)/tools
- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(src)/tools/
tools/%: FORCE
$(Q)mkdir -p $(objtree)/tools
- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/ $*
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(src)/tools/ $*
# Single targets
# ---------------------------------------------------------------------------
diff --git a/arch/alpha/include/asm/mmu_context.h b/arch/alpha/include/asm/mmu_context.h
index 384bd47b5187..45c020a0fe76 100644
--- a/arch/alpha/include/asm/mmu_context.h
+++ b/arch/alpha/include/asm/mmu_context.h
@@ -8,6 +8,7 @@
*/
#include <linux/mm_types.h>
+#include <linux/sched.h>
#include <asm/machvec.h>
#include <asm/compiler.h>
diff --git a/arch/alpha/include/uapi/asm/siginfo.h b/arch/alpha/include/uapi/asm/siginfo.h
index 9822362a8424..70494d1d8f29 100644
--- a/arch/alpha/include/uapi/asm/siginfo.h
+++ b/arch/alpha/include/uapi/asm/siginfo.h
@@ -6,4 +6,18 @@
#include <asm-generic/siginfo.h>
+/*
+ * SIGFPE si_codes
+ */
+#ifdef __KERNEL__
+#define FPE_FIXME 0 /* Broken dup of SI_USER */
+#endif /* __KERNEL__ */
+
+/*
+ * SIGTRAP si_codes
+ */
+#ifdef __KERNEL__
+#define TRAP_FIXME 0 /* Broken dup of SI_USER */
+#endif /* __KERNEL__ */
+
#endif
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c
index ddb89a18cf26..49d3b1e63ce5 100644
--- a/arch/alpha/kernel/traps.c
+++ b/arch/alpha/kernel/traps.c
@@ -280,7 +280,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
case 1: /* bugcheck */
info.si_signo = SIGTRAP;
info.si_errno = 0;
- info.si_code = __SI_FAULT;
+ info.si_code = TRAP_FIXME;
info.si_addr = (void __user *) regs->pc;
info.si_trapno = 0;
send_sig_info(SIGTRAP, &info, current);
@@ -320,7 +320,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
break;
case GEN_ROPRAND:
signo = SIGFPE;
- code = __SI_FAULT;
+ code = FPE_FIXME;
break;
case GEN_DECOVF:
@@ -342,7 +342,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
case GEN_SUBRNG7:
default:
signo = SIGTRAP;
- code = __SI_FAULT;
+ code = TRAP_FIXME;
break;
}
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h
index d400a2161935..8ee41e988169 100644
--- a/arch/arc/include/asm/processor.h
+++ b/arch/arc/include/asm/processor.h
@@ -78,9 +78,6 @@ struct task_struct;
#endif
-#define copy_segments(tsk, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
index c4ffb441716c..877cec8f5ea2 100644
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -510,7 +510,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
goto done;
}
- str = (char *)__get_free_page(GFP_TEMPORARY);
+ str = (char *)__get_free_page(GFP_KERNEL);
if (!str)
goto done;
diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c
index 7e94476f3994..7d8c1d6c2f60 100644
--- a/arch/arc/kernel/troubleshoot.c
+++ b/arch/arc/kernel/troubleshoot.c
@@ -178,7 +178,7 @@ void show_regs(struct pt_regs *regs)
struct callee_regs *cregs;
char *buf;
- buf = (char *)__get_free_page(GFP_TEMPORARY);
+ buf = (char *)__get_free_page(GFP_KERNEL);
if (!buf)
return;
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index f1b3f1d575d4..7888c9803eb0 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1531,7 +1531,6 @@ config THUMB2_KERNEL
bool "Compile the kernel in Thumb-2 mode" if !CPU_THUMBONLY
depends on (CPU_V7 || CPU_V7M) && !CPU_V6 && !CPU_V6K
default y if CPU_THUMBONLY
- select AEABI
select ARM_ASM_UNIFIED
select ARM_UNWIND
help
@@ -1594,7 +1593,8 @@ config ARM_PATCH_IDIV
code to do integer division.
config AEABI
- bool "Use the ARM EABI to compile the kernel"
+ bool "Use the ARM EABI to compile the kernel" if !CPU_V7 && !CPU_V7M && !CPU_V6 && !CPU_V6K
+ default CPU_V7 || CPU_V7M || CPU_V6 || CPU_V6K
help
This option allows for the kernel to be compiled using the latest
ARM ABI (aka EABI). This is only useful if you are using a user
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index 447629d89884..6dcea8e8e941 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -646,7 +646,7 @@ choice
config DEBUG_OMAP2UART1
bool "OMAP2/3/4 UART1 (omap2/3 sdp boards and some omap3 boards)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
help
This covers at least h4, 2430sdp, 3430sdp, 3630sdp,
omap3 torpedo and 3530 lv som.
@@ -654,17 +654,17 @@ choice
config DEBUG_OMAP2UART2
bool "Kernel low-level debugging messages via OMAP2/3/4 UART2"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_OMAP2UART3
bool "Kernel low-level debugging messages via OMAP2 UART3 (n8x0)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_OMAP3UART3
bool "Kernel low-level debugging messages via OMAP3 UART3 (most omap3 boards)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
help
This covers at least cm_t3x, beagle, crane, devkit8000,
igep00x0, ldp, n900, n9(50), pandora, overo, touchbook,
@@ -673,17 +673,17 @@ choice
config DEBUG_OMAP4UART3
bool "Kernel low-level debugging messages via OMAP4/5 UART3 (omap4 blaze, panda, omap5 sevm)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_OMAP3UART4
bool "Kernel low-level debugging messages via OMAP36XX UART4"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_OMAP4UART4
bool "Kernel low-level debugging messages via OMAP4/5 UART4"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_OMAP7XXUART1
bool "Kernel low-level debugging via OMAP730 UART1"
@@ -712,22 +712,22 @@ choice
config DEBUG_TI81XXUART1
bool "Kernel low-level debugging messages via TI81XX UART1 (ti8148evm)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_TI81XXUART2
bool "Kernel low-level debugging messages via TI81XX UART2"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_TI81XXUART3
bool "Kernel low-level debugging messages via TI81XX UART3 (ti8168evm)"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_AM33XXUART1
bool "Kernel low-level debugging messages via AM33XX UART1"
depends on ARCH_OMAP2PLUS
- select DEBUG_OMAP2PLUS_UART
+ select DEBUG_UART_8250
config DEBUG_ZOOM_UART
bool "Kernel low-level debugging messages via Zoom2/3 UART"
@@ -896,12 +896,13 @@ choice
via SCIF2 on Renesas R-Car H1 (R8A7779).
config DEBUG_RCAR_GEN2_SCIF0
- bool "Kernel low-level debugging messages via SCIF0 on R8A7790/R8A7791/R8A7792/R8A7793"
- depends on ARCH_R8A7790 || ARCH_R8A7791 || ARCH_R8A7792 || ARCH_R8A7793
+ bool "Kernel low-level debugging messages via SCIF0 on R-Car Gen2 and RZ/G1"
+ depends on ARCH_R8A7743 || ARCH_R8A7790 || ARCH_R8A7791 || \
+ ARCH_R8A7792 || ARCH_R8A7793
help
Say Y here if you want kernel low-level debugging support
- via SCIF0 on Renesas R-Car H2 (R8A7790), M2-W (R8A7791), V2H
- (R8A7792), or M2-N (R8A7793).
+ via SCIF0 on Renesas RZ/G1M (R8A7743), R-Car H2 (R8A7790),
+ M2-W (R8A7791), V2H (R8A7792), or M2-N (R8A7793).
config DEBUG_RCAR_GEN2_SCIF2
bool "Kernel low-level debugging messages via SCIF2 on R8A7794"
@@ -1523,6 +1524,17 @@ config DEBUG_UART_PHYS
default 0x40090000 if DEBUG_LPC32XX
default 0x40100000 if DEBUG_PXA_UART1
default 0x42000000 if DEBUG_GEMINI
+ default 0x44e09000 if DEBUG_AM33XXUART1
+ default 0x48020000 if DEBUG_OMAP4UART3 || DEBUG_TI81XXUART1
+ default 0x48022000 if DEBUG_TI81XXUART2
+ default 0x48024000 if DEBUG_TI81XXUART3
+ default 0x4806a000 if DEBUG_OMAP2UART1 || DEBUG_OMAP3UART1 || \
+ DEBUG_OMAP4UART1 || DEBUG_OMAP5UART1
+ default 0x4806c000 if DEBUG_OMAP2UART2 || DEBUG_OMAP3UART2 || \
+ DEBUG_OMAP4UART2 || DEBUG_OMAP5UART2
+ default 0x4806e000 if DEBUG_OMAP2UART3 || DEBUG_OMAP4UART4
+ default 0x49020000 if DEBUG_OMAP3UART3
+ default 0x49042000 if DEBUG_OMAP3UART4
default 0x50000000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART0 || \
DEBUG_S3C2410_UART0)
default 0x50004000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART1 || \
@@ -1641,10 +1653,21 @@ config DEBUG_UART_VIRT
default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
default 0xf8ffee00 if DEBUG_AT91_SAM9263_DBGU
default 0xf8fff200 if DEBUG_AT91_RM9200_DBGU
+ default 0xf9e09000 if DEBUG_AM33XXUART1
+ default 0xfa020000 if DEBUG_OMAP4UART3 || DEBUG_TI81XXUART1
+ default 0xfa022000 if DEBUG_TI81XXUART2
+ default 0xfa024000 if DEBUG_TI81XXUART3
+ default 0xfa06a000 if DEBUG_OMAP2UART1 || DEBUG_OMAP3UART1 || \
+ DEBUG_OMAP4UART1 || DEBUG_OMAP5UART1
+ default 0xfa06c000 if DEBUG_OMAP2UART2 || DEBUG_OMAP3UART2 || \
+ DEBUG_OMAP4UART2 || DEBUG_OMAP5UART2
+ default 0xfa06e000 if DEBUG_OMAP2UART3 || DEBUG_OMAP4UART4
default 0xfa71e000 if DEBUG_QCOM_UARTDM
default 0xfb002000 if DEBUG_CNS3XXX
default 0xfb009000 if DEBUG_REALVIEW_STD_PORT
default 0xfb00c000 if DEBUG_AT91_SAMA5D4_USART3
+ default 0xfb020000 if DEBUG_OMAP3UART3
+ default 0xfb042000 if DEBUG_OMAP3UART4
default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
default 0xfc705000 if DEBUG_ZTE_ZX
default 0xfcfe8600 if DEBUG_BCM63XX_UART
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 4b17f35dc9a7..faf46abaa4a2 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -46,6 +46,7 @@ dtb-$(CONFIG_SOC_AT91SAM9) += \
at91sam9x35ek.dtb
dtb-$(CONFIG_SOC_SAM_V7) += \
at91-kizbox2.dtb \
+ at91-sama5d27_som1_ek.dtb \
at91-sama5d2_xplained.dtb \
at91-sama5d3_xplained.dtb \
at91-tse850-3.dtb \
@@ -73,7 +74,8 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
bcm2835-rpi-a-plus.dtb \
bcm2836-rpi-2-b.dtb \
bcm2837-rpi-3-b.dtb \
- bcm2835-rpi-zero.dtb
+ bcm2835-rpi-zero.dtb \
+ bcm2835-rpi-zero-w.dtb
dtb-$(CONFIG_ARCH_BCM_5301X) += \
bcm4708-asus-rt-ac56u.dtb \
bcm4708-asus-rt-ac68u.dtb \
@@ -106,7 +108,8 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
bcm953012hr.dtb \
bcm953012k.dtb
dtb-$(CONFIG_ARCH_BCM_53573) += \
- bcm47189-tenda-ac9.dtb
+ bcm47189-tenda-ac9.dtb \
+ bcm947189acdbmr.dtb
dtb-$(CONFIG_ARCH_BCM_63XX) += \
bcm963138dvt.dtb
dtb-$(CONFIG_ARCH_BCM_CYGNUS) += \
@@ -180,6 +183,7 @@ dtb-$(CONFIG_ARCH_EXYNOS5) += \
exynos5440-ssdk5440.dtb \
exynos5800-peach-pi.dtb
dtb-$(CONFIG_ARCH_GEMINI) += \
+ gemini-dlink-dir-685.dtb \
gemini-nas4220b.dtb \
gemini-rut1xx.dtb \
gemini-sq201.dtb \
@@ -340,6 +344,7 @@ dtb-$(CONFIG_SOC_IMX51) += \
imx51-ts4800.dtb
dtb-$(CONFIG_SOC_IMX53) += \
imx53-ard.dtb \
+ imx53-cx9020.dtb \
imx53-m53evk.dtb \
imx53-mba53.dtb \
imx53-qsb.dtb \
@@ -391,7 +396,9 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
imx6dl-udoo.dtb \
imx6dl-wandboard.dtb \
imx6dl-wandboard-revb1.dtb \
+ imx6q-apalis-eval.dtb \
imx6q-apalis-ixora.dtb \
+ imx6q-apalis-ixora-v1.1.dtb \
imx6q-apf6dev.dtb \
imx6q-arm2.dtb \
imx6q-b450v3.dtb \
@@ -466,7 +473,7 @@ dtb-$(CONFIG_SOC_IMX6SX) += \
imx6sx-udoo-neo-full.dtb
dtb-$(CONFIG_SOC_IMX6UL) += \
imx6ul-14x14-evk.dtb \
- imx6ul-geam-kit.dtb \
+ imx6ul-geam.dtb \
imx6ul-isiot-emmc.dtb \
imx6ul-isiot-nand.dtb \
imx6ul-liteboard.dtb \
@@ -617,6 +624,7 @@ dtb-$(CONFIG_SOC_AM33XX) += \
am335x-evmsk.dtb \
am335x-icev2.dtb \
am335x-lxm.dtb \
+ am335x-moxa-uc-8100-me-t.dtb \
am335x-nano.dtb \
am335x-pepper.dtb \
am335x-phycore-rdk.dtb \
@@ -650,6 +658,7 @@ dtb-$(CONFIG_SOC_OMAP5) += \
dtb-$(CONFIG_SOC_DRA7XX) += \
am57xx-beagle-x15.dtb \
am57xx-beagle-x15-revb1.dtb \
+ am57xx-beagle-x15-revc.dtb \
am57xx-cl-som-am57x.dtb \
am57xx-sbc-am57x.dtb \
am572x-idk.dtb \
@@ -657,7 +666,8 @@ dtb-$(CONFIG_SOC_DRA7XX) += \
dra7-evm.dtb \
dra72-evm.dtb \
dra72-evm-revc.dtb \
- dra71-evm.dtb
+ dra71-evm.dtb \
+ dra76-evm.dtb
dtb-$(CONFIG_ARCH_ORION5X) += \
orion5x-kuroboxpro.dtb \
orion5x-lacie-d2-network.dtb \
@@ -903,6 +913,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
sun8i-a33-q8-tablet.dtb \
sun8i-a33-sinlinx-sina33.dtb \
sun8i-a83t-allwinner-h8homlet-v2.dtb \
+ sun8i-a83t-bananapi-m3.dtb \
sun8i-a83t-cubietruck-plus.dtb \
sun8i-h2-plus-orangepi-zero.dtb \
sun8i-h3-bananapi-m2-plus.dtb \
@@ -918,6 +929,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
sun8i-h3-orangepi-pc-plus.dtb \
sun8i-h3-orangepi-plus.dtb \
sun8i-h3-orangepi-plus2e.dtb \
+ sun8i-r16-bananapi-m2m.dtb \
sun8i-r16-parrot.dtb \
sun8i-v3s-licheepi-zero.dtb \
sun8i-v3s-licheepi-zero-dock.dtb
@@ -970,7 +982,6 @@ dtb-$(CONFIG_ARCH_UNIPHIER) += \
uniphier-pro4-sanji.dtb \
uniphier-pxs2-gentil.dtb \
uniphier-pxs2-vodka.dtb \
- uniphier-sld3-ref.dtb \
uniphier-sld8-ref.dtb
dtb-$(CONFIG_ARCH_VERSATILE) += \
versatile-ab.dtb \
@@ -1049,7 +1060,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
mt6580-evbp1.dtb \
mt6589-aquaris5.dtb \
mt6592-evb.dtb \
- mt7623-evb.dtb \
+ mt7623n-rfb-nand.dtb \
+ mt7623n-bananapi-bpi-r2.dtb \
mt8127-moose.dtb \
mt8135-evbp1.dtb
dtb-$(CONFIG_ARCH_ZX) += zx296702-ad1.dtb
diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi
index 1d154444dfef..48a15fc641f2 100644
--- a/arch/arm/boot/dts/am335x-bone-common.dtsi
+++ b/arch/arm/boot/dts/am335x-bone-common.dtsi
@@ -319,13 +319,10 @@
ti,pmic-shutdown-controller;
charger {
- interrupts = <0>, <1>;
- interrupt-names = "USB", "AC";
status = "okay";
};
pwrbutton {
- interrupts = <2>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/am335x-chiliboard.dts b/arch/arm/boot/dts/am335x-chiliboard.dts
index d8769799772e..59431b235944 100644
--- a/arch/arm/boot/dts/am335x-chiliboard.dts
+++ b/arch/arm/boot/dts/am335x-chiliboard.dts
@@ -191,13 +191,10 @@
interrupts = <7>; /* NNMI */
charger {
- interrupts = <0>, <1>;
- interrupt-names = "USB", "AC";
status = "okay";
};
pwrbutton {
- interrupts = <2>;
status = "okay";
};
};
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 1c37a7c1ea17..ddd897556e03 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -531,6 +531,7 @@
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
<1 IRQ_TYPE_NONE>; /* termcount */
rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
+ ti,nand-xfer-type = "prefetch-dma";
ti,nand-ecc-opt = "bch8";
ti,elm-id = <&elm>;
nand-bus-width = <8>;
diff --git a/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts b/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts
new file mode 100644
index 000000000000..f82233cd18e0
--- /dev/null
+++ b/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts
@@ -0,0 +1,525 @@
+/*
+ * Copyright (C) 2017 MOXA Inc. - https://www.moxa.com/
+ *
+ * Author: SZ Lin (林上智) <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+
+#include "am33xx.dtsi"
+
+/ {
+ model = "Moxa UC-8100-ME-T";
+ compatible = "moxa,uc-8100-me-t", "ti,am33xx";
+
+ cpus {
+ cpu@0 {
+ cpu0-supply = <&vdd1_reg>;
+ };
+ };
+
+ memory {
+ device_type = "memory";
+ reg = <0x80000000 0x20000000>; /* 512 MB */
+ };
+
+ vbat: vbat-regulator {
+ compatible = "regulator-fixed";
+ };
+
+ /* Power supply provides a fixed 3.3V @3A */
+ vmmcsd_fixed: vmmcsd-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vmmcsd_fixed";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ led1 {
+ label = "uc8100me:CEL1";
+ gpios = <&gpio_xten 8 0>;
+ default-state = "off";
+ };
+
+ led2 {
+ label = "uc8100me:CEL2";
+ gpios = <&gpio_xten 9 0>;
+ default-state = "off";
+ };
+
+ led3 {
+ label = "uc8100me:CEL3";
+ gpios = <&gpio_xten 10 0>;
+ default-state = "off";
+ };
+
+ led4 {
+ label = "uc8100me:DIA1";
+ gpios = <&gpio_xten 11 0>;
+ default-state = "off";
+ };
+ led5 {
+ label = "uc8100me:DIA2";
+ gpios = <&gpio_xten 12 0>;
+ default-state = "off";
+ };
+ led6 {
+ label = "uc8100me:DIA3";
+ gpios = <&gpio_xten 13 0>;
+ default-state = "off";
+ };
+ led7 {
+ label = "uc8100me:SD";
+ gpios = <&gpio_xten 14 0>;
+ default-state = "off";
+ };
+ led8 {
+ label = "uc8100me:USB";
+ gpios = <&gpio_xten 15 0>;
+ default-state = "off";
+ };
+ led9 {
+ label = "uc8100me:USER";
+ gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+ };
+
+ buttons: push_button {
+ compatible = "gpio-keys";
+ };
+
+};
+
+&am33xx_pinmux {
+ pinctrl-names = "default";
+ pinctrl-0 = <&minipcie_pins>;
+
+ minipcie_pins: pinmux_minipcie {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x8e8, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_pclk.gpio2_24 */
+ AM33XX_IOPAD(0x8ec, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_ac_bias_en.gpio2_25 */
+ AM33XX_IOPAD(0x8e0, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_vsync.gpio2_22 Power off PIN*/
+ >;
+ };
+
+ push_button_pins: pinmux_push_button {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x9ac, PIN_INPUT_PULLDOWN | MUX_MODE7) /* mcasp0_ahcklx.gpio3_21 */
+ >;
+ };
+
+ i2c0_pins: pinmux_i2c0_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x988, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
+ AM33XX_IOPAD(0x98c, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
+ >;
+ };
+
+
+ i2c1_pins: pinmux_i2c1_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x968, PIN_INPUT_PULLUP | MUX_MODE3) /* uart0_ctsn.i2c1_sda */
+ AM33XX_IOPAD(0x96c, PIN_INPUT_PULLUP | MUX_MODE3) /* uart0_rtsn.i2c1_scl */
+ >;
+ };
+
+ uart0_pins: pinmux_uart0_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x970, PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
+ AM33XX_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
+ >;
+ };
+
+ uart1_pins: pinmux_uart1_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x978, PIN_INPUT | MUX_MODE0) /* uart1_ctsn.uart1_ctsn */
+ AM33XX_IOPAD(0x97C, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart1_rtsn.uart1_rtsn */
+ AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE0) /* uart1_rxd.uart1_rxd */
+ AM33XX_IOPAD(0x984, PIN_OUTPUT | MUX_MODE0) /* uart1_txd.uart1_txd */
+ >;
+ };
+
+ uart2_pins: pinmux_uart2_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x8d8, PIN_INPUT | MUX_MODE6) /* lcd_data14.uart5_ctsn */
+ AM33XX_IOPAD(0x8dc, PIN_OUTPUT_PULLDOWN | MUX_MODE6) /* lcd_data15.uart5_rtsn */
+ AM33XX_IOPAD(0x8c4, PIN_INPUT_PULLUP | MUX_MODE4) /* lcd_data9.uart5_rxd */
+ AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE4) /* lcd_data8.uart5_txd */
+ >;
+ };
+
+ cpsw_default: cpsw_default {
+ pinctrl-single,pins = <
+ /* Slave 1 */
+ AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE1) /* mii1_crs.rmii1_crs_dv */
+ AM33XX_IOPAD(0x910, PIN_INPUT_PULLUP | MUX_MODE1) /* mii1_rxerr.rmii1_rxerr */
+ AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txen.rmii1_txen */
+ AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd1.rmii1_txd1 */
+ AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd0.rmii1_txd0 */
+ AM33XX_IOPAD(0x93c, PIN_INPUT_PULLUP | MUX_MODE1) /* mii1_rxd1.rmii1_rxd1 */
+ AM33XX_IOPAD(0x940, PIN_INPUT_PULLUP | MUX_MODE1) /* mii1_rxd0.rmii1_rxd0 */
+ AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mii1_refclk.rmii1_refclk */
+
+ /* Slave 2 */
+ AM33XX_IOPAD(0x870, PIN_INPUT_PULLDOWN | MUX_MODE3) /* rmii2_crs_dv */
+ AM33XX_IOPAD(0x874, PIN_INPUT_PULLDOWN | MUX_MODE3) /* rmii2_rxer */
+ AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* rmii2_txen */
+ AM33XX_IOPAD(0x850, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* rmii2_td1 */
+ AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* rmii2_td0 */
+ AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE3) /* rmii2_rd1 */
+ AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE3) /* rmii2_rd0 */
+ AM33XX_IOPAD(0x908, PIN_INPUT_PULLDOWN | MUX_MODE1) /* rmii2_refclk */
+
+ >;
+ };
+
+ davinci_mdio_default: davinci_mdio_default {
+ pinctrl-single,pins = <
+ /* MDIO */
+ AM33XX_IOPAD(0x948, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
+ AM33XX_IOPAD(0x94c, PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
+ >;
+ };
+
+ mmc0_pins_default: pinmux_mmc0_pins {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x8f0, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat3 */
+ AM33XX_IOPAD(0x8f4, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat2 */
+ AM33XX_IOPAD(0x8f8, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat1 */
+ AM33XX_IOPAD(0x8fc, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat0 */
+ AM33XX_IOPAD(0x900, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_clk */
+ AM33XX_IOPAD(0x904, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_cmd */
+ AM33XX_IOPAD(0x990, PIN_INPUT_PULLUP | MUX_MODE7) /* mcasp0_aclkx.gpio3_14 */
+ AM33XX_IOPAD(0x9a0, PIN_INPUT_PULLUP | MUX_MODE7) /* mcasp0_aclkx.gpio3_18 */
+ >;
+ };
+
+ mmc2_pins_default: pinmux_mmc2_pins {
+ pinctrl-single,pins = <
+ /* eMMC */
+ AM33XX_IOPAD(0x830, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad12.mmc2_dat0 */
+ AM33XX_IOPAD(0x834, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad13.mmc2_dat1 */
+ AM33XX_IOPAD(0x838, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad14.mmc2_dat2 */
+ AM33XX_IOPAD(0x83c, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad15.mmc2_dat3 */
+ AM33XX_IOPAD(0x820, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad8.mmc2_dat4 */
+ AM33XX_IOPAD(0x824, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad9.mmc2_dat5 */
+ AM33XX_IOPAD(0x828, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad10.mmc2_dat6 */
+ AM33XX_IOPAD(0x82c, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ad11.mmc2_dat7 */
+ AM33XX_IOPAD(0x888, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_csn3.mmc2_cmd */
+ AM33XX_IOPAD(0x88c, PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_clk.mmc2_clk */
+ >;
+ };
+
+ spi0_pins: pinmux_spi0 {
+ pinctrl-single,pins = <
+ AM33XX_IOPAD(0x950, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_sclk.spi0_sclk */
+ AM33XX_IOPAD(0x95C, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_cs0.spi0_cs0 */
+ AM33XX_IOPAD(0x954, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d0.spi0_d0 */
+ AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d1.spi0_d1 */
+ >;
+ };
+
+};
+
+&uart0 {
+ /* Console */
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins>;
+};
+
+&uart1 {
+ /* UART 1 setting */
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart1_pins>;
+};
+
+&uart5 {
+ /* UART 2 setting */
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart2_pins>;
+};
+
+&i2c0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c0_pins>;
+
+ status = "okay";
+ clock-frequency = <400000>;
+
+ tpm: tpm@20 {
+ compatible = "infineon,slb9645tt";
+ reg = <0x20>;
+ };
+
+ tps: tps@2d {
+ compatible = "ti,tps65910";
+ reg = <0x2d>;
+ };
+
+ eeprom: eeprom@50 {
+ compatible = "atmel,24c16";
+ pagesize = <16>;
+ reg = <0x50>;
+ };
+
+ rtc_wdt: rtc_wdt@68 {
+ compatible = "dallas,ds1374";
+ reg = <0x68>;
+ };
+};
+
+&i2c1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins>;
+
+ status = "okay";
+ clock-frequency = <400000>;
+ gpio_xten: gpio_xten@27 {
+ compatible = "nxp,pca9535";
+ gpio-controller;
+ #gpio-cells = <2>;
+ reg = <0x27>;
+ };
+};
+
+&usb {
+ status = "okay";
+};
+
+&usb_ctrl_mod {
+ status = "okay";
+};
+
+&usb0_phy {
+ status = "okay";
+};
+
+&usb1_phy {
+ status = "okay";
+};
+
+&usb0 {
+ status = "okay";
+ dr_mode = "host";
+};
+
+&usb1 {
+ status = "okay";
+ dr_mode = "host";
+};
+
+&cppi41dma {
+ status = "okay";
+};
+
+#include "tps65910.dtsi"
+
+&tps {
+ vcc1-supply = <&vbat>;
+ vcc2-supply = <&vbat>;
+ vcc3-supply = <&vbat>;
+ vcc4-supply = <&vbat>;
+ vcc5-supply = <&vbat>;
+ vcc6-supply = <&vbat>;
+ vcc7-supply = <&vbat>;
+ vccio-supply = <&vbat>;
+
+ regulators {
+ vrtc_reg: regulator@0 {
+ regulator-always-on;
+ };
+
+ vio_reg: regulator@1 {
+ regulator-always-on;
+ };
+
+ vdd1_reg: regulator@2 {
+ /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
+ regulator-name = "vdd_mpu";
+ regulator-min-microvolt = <912500>;
+ regulator-max-microvolt = <1378000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ vdd2_reg: regulator@3 {
+ /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
+ regulator-name = "vdd_core";
+ regulator-min-microvolt = <912500>;
+ regulator-max-microvolt = <1150000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ vdd3_reg: regulator@4 {
+ regulator-always-on;
+ };
+
+ vdig1_reg: regulator@5 {
+ regulator-always-on;
+ };
+
+ vdig2_reg: regulator@6 {
+ regulator-always-on;
+ };
+
+ vpll_reg: regulator@7 {
+ regulator-always-on;
+ };
+
+ vdac_reg: regulator@8 {
+ regulator-always-on;
+ };
+
+ vaux1_reg: regulator@9 {
+ regulator-always-on;
+ };
+
+ vaux2_reg: regulator@10 {
+ regulator-always-on;
+ };
+
+ vaux33_reg: regulator@11 {
+ regulator-always-on;
+ };
+
+ vmmc_reg: regulator@12 {
+ compatible = "regulator-fixed";
+ regulator-name = "vmmc_reg";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ };
+ };
+};
+
+/* Power */
+&vbat {
+ regulator-name = "vbat";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+};
+
+&mac {
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpsw_default>;
+ dual_emac = <1>;
+ status = "okay";
+};
+
+&davinci_mdio {
+ pinctrl-names = "default";
+ pinctrl-0 = <&davinci_mdio_default>;
+ status = "okay";
+};
+
+&cpsw_emac0 {
+ status = "okay";
+ phy_id = <&davinci_mdio>, <4>;
+ phy-mode = "rmii";
+ dual_emac_res_vlan = <1>;
+};
+
+&cpsw_emac1 {
+ status = "okay";
+ phy_id = <&davinci_mdio>, <5>;
+ phy-mode = "rmii";
+ dual_emac_res_vlan = <2>;
+};
+
+&phy_sel {
+ reg= <0x44e10650 0xf5>;
+ rmii-clock-ext;
+};
+
+&sham {
+ status = "okay";
+};
+
+&aes {
+ status = "okay";
+};
+
+&gpio0 {
+ ti,no-reset-on-init;
+};
+
+&mmc1 {
+ pinctrl-names = "default";
+ vmmc-supply = <&vmmcsd_fixed>;
+ bus-width = <4>;
+ pinctrl-0 = <&mmc0_pins_default>;
+ cd-gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>;
+ wp-gpios = <&gpio3 18 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&mmc3 {
+ dmas = <&edma_xbar 12 0 1
+ &edma_xbar 13 0 2>;
+ dma-names = "tx", "rx";
+ pinctrl-names = "default";
+ vmmc-supply = <&vmmcsd_fixed>;
+ bus-width = <8>;
+ pinctrl-0 = <&mmc2_pins_default>;
+ ti,non-removable;
+ status = "okay";
+};
+
+&buttons {
+ pinctrl-names = "default";
+ pinctrl-0 = <&push_button_pins>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ button@0 {
+ label = "push_button";
+ linux,code = <0x100>;
+ gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;
+ };
+};
+
+/* SPI Busses */
+&spi0 {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi0_pins>;
+
+ m25p80@0 {
+ compatible = "mx25l6405d";
+ spi-max-frequency = <40000000>;
+
+ reg = <0>;
+ spi-cpol;
+ spi-cpha;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* reg : The partition's offset and size within the mtd bank. */
+ partitions@0 {
+ label = "MLO";
+ reg = <0x0 0x80000>;
+ };
+
+ partitions@1 {
+ label = "U-Boot";
+ reg = <0x80000 0x100000>;
+ };
+
+ partitions@2 {
+ label = "U-Boot Env";
+ reg = <0x180000 0x20000>;
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 7d7ca054c557..e58fab8aec5d 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -36,6 +36,8 @@
phy1 = &usb1_phy;
ethernet0 = &cpsw_emac0;
ethernet1 = &cpsw_emac1;
+ spi0 = &spi0;
+ spi1 = &spi1;
};
cpus {
diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts
index 29a538ecd405..afb8eb0a0a16 100644
--- a/arch/arm/boot/dts/am437x-gp-evm.dts
+++ b/arch/arm/boot/dts/am437x-gp-evm.dts
@@ -149,6 +149,13 @@
system-clock-frequency = <12000000>;
};
};
+
+ beeper: beeper {
+ compatible = "gpio-beeper";
+ pinctrl-names = "default";
+ pinctrl-0 = <&beeper_pins>;
+ gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>;
+ };
};
&am43xx_pinmux {
@@ -510,6 +517,13 @@
AM4372_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
>;
};
+
+ beeper_pins: beeper_pins {
+ pinctrl-single,pins = <
+ AM4372_IOPAD(0x9e0, PIN_OUTPUT_PULLUP | MUX_MODE7) /* cam1_field.gpio4_12 */
+ >;
+ };
+
};
&uart0 {
@@ -842,6 +856,7 @@
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
<1 IRQ_TYPE_NONE>; /* termcount */
rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
+ ti,nand-xfer-type = "prefetch-dma";
ti,nand-ecc-opt = "bch16";
ti,elm-id = <&elm>;
nand-bus-width = <8>;
diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts
index 54f40f370011..081fa68b6f98 100644
--- a/arch/arm/boot/dts/am43x-epos-evm.dts
+++ b/arch/arm/boot/dts/am43x-epos-evm.dts
@@ -388,6 +388,7 @@
pinctrl-0 = <&cpsw_default>;
pinctrl-1 = <&cpsw_sleep>;
status = "okay";
+ slaves = <1>;
};
&davinci_mdio {
@@ -402,11 +403,6 @@
phy-mode = "rmii";
};
-&cpsw_emac1 {
- phy_id = <&davinci_mdio>, <1>;
- phy-mode = "rmii";
-};
-
&phy_sel {
rmii-clock-ext;
};
@@ -564,6 +560,7 @@
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
<1 IRQ_TYPE_NONE>; /* termcount */
rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
+ ti,nand-xfer-type = "prefetch-dma";
ti,nand-ecc-opt = "bch16";
ti,elm-id = <&elm>;
nand-bus-width = <8>;
diff --git a/arch/arm/boot/dts/am571x-idk.dts b/arch/arm/boot/dts/am571x-idk.dts
index 7b207835b2d1..debf9464403e 100644
--- a/arch/arm/boot/dts/am571x-idk.dts
+++ b/arch/arm/boot/dts/am571x-idk.dts
@@ -11,6 +11,7 @@
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include "am57xx-idk-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
/ {
model = "TI AM5718 IDK";
@@ -64,13 +65,6 @@
};
};
-&mmc1 {
- status = "okay";
- vmmc-supply = <&ldo1_reg>;
- bus-width = <4>;
- cd-gpios = <&gpio6 27 0>; /* gpio 219 */
-};
-
&omap_dwc3_2 {
extcon = <&extcon_usb2>;
};
@@ -96,3 +90,30 @@
status = "okay";
};
};
+
+&pcie1_rc {
+ status = "okay";
+ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&pcie1_ep {
+ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
+};
diff --git a/arch/arm/boot/dts/am572x-idk.dts b/arch/arm/boot/dts/am572x-idk.dts
index 9da6d83ca185..a578fe97ba3b 100644
--- a/arch/arm/boot/dts/am572x-idk.dts
+++ b/arch/arm/boot/dts/am572x-idk.dts
@@ -12,6 +12,7 @@
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include "am57xx-idk-common.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
/ {
model = "TI AM5728 IDK";
@@ -67,6 +68,24 @@
};
};
+&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev20>;
+};
+
&omap_dwc3_2 {
extcon = <&extcon_usb2>;
};
@@ -76,19 +95,16 @@
vbus-gpio = <&gpio3 26 GPIO_ACTIVE_HIGH>;
};
-&mmc1 {
- status = "okay";
- vmmc-supply = <&v3_3d>;
- vmmc_aux-supply = <&ldo1_reg>;
- bus-width = <4>;
- cd-gpios = <&gpio6 27 0>; /* gpio 219 */
-};
-
&sn65hvs882 {
load-gpios = <&gpio3 19 GPIO_ACTIVE_LOW>;
};
-&pcie1 {
+&pcie1_rc {
+ status = "okay";
+ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&pcie1_ep {
gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
};
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
index fdfe5b16b806..49aeecd312b4 100644
--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
+++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
@@ -9,6 +9,7 @@
#include "dra74x.dtsi"
#include "am57xx-commercial-grade.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
@@ -166,34 +167,6 @@
};
};
-&dra7_pmx_core {
- mmc1_pins_default: mmc1_pins_default {
- pinctrl-single,pins = <
- DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14) /* mmc1sdcd.gpio219 */
- DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
- DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
- DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
- DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
- DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
- DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
- >;
- };
-
- mmc2_pins_default: mmc2_pins_default {
- pinctrl-single,pins = <
- DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
- DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
- DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
- DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
- DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
- DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
- DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
- DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
- DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
- DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
- >;
- };
-};
&i2c1 {
status = "okay";
clock-frequency = <400000>;
@@ -570,7 +543,12 @@
};
};
-&pcie1 {
+&pcie1_rc {
+ status = "ok";
+ gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
+};
+
+&pcie1_ep {
gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
};
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts b/arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts
index 39a92aff0a0d..5a77b334923d 100644
--- a/arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts
+++ b/arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts
@@ -19,8 +19,23 @@
};
&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev11_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev11_conf>;
vmmc-supply = <&vdd_3v3>;
- vmmc-aux-supply = <&ldo1_reg>;
+ vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_3_3v_rev11 &mmc2_iodelay_ddr_3_3v_rev11_conf>;
};
/* errata i880 "Ethernet RGMII2 Limited to 10/100 Mbps" */
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-revc.dts b/arch/arm/boot/dts/am57xx-beagle-x15-revc.dts
new file mode 100644
index 000000000000..17c41da3b55f
--- /dev/null
+++ b/arch/arm/boot/dts/am57xx-beagle-x15-revc.dts
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2014-2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "am57xx-beagle-x15-common.dtsi"
+
+/ {
+ model = "TI AM5728 BeagleBoard-X15 rev C";
+};
+
+&tpd12s015 {
+ gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>, /* gpio7_10, CT CP HPD */
+ <&gpio2 30 GPIO_ACTIVE_HIGH>, /* gpio2_30, LS OE */
+ <&gpio7 12 GPIO_ACTIVE_HIGH>; /* gpio7_12/sp1_cs2, HPD */
+};
+
+&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+ vmmc-supply = <&vdd_3v3>;
+ vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev20>;
+};
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts b/arch/arm/boot/dts/am57xx-beagle-x15.dts
index 19a60a11c198..d6689106d2a8 100644
--- a/arch/arm/boot/dts/am57xx-beagle-x15.dts
+++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts
@@ -20,9 +20,20 @@
};
&mmc1 {
+ pinctrl-names = "default", "hs";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+
vmmc-supply = <&ldo1_reg>;
};
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_3_3v_rev11 &mmc2_iodelay_ddr_3_3v_rev11_conf>;
+};
+
/* errata i880 "Ethernet RGMII2 Limited to 10/100 Mbps" */
&phy1 {
max-speed = <100>;
diff --git a/arch/arm/boot/dts/am57xx-idk-common.dtsi b/arch/arm/boot/dts/am57xx-idk-common.dtsi
index c536b2f5389f..97aa8e6a56da 100644
--- a/arch/arm/boot/dts/am57xx-idk-common.dtsi
+++ b/arch/arm/boot/dts/am57xx-idk-common.dtsi
@@ -399,6 +399,14 @@
dr_mode = "peripheral";
};
+&mmc1 {
+ status = "okay";
+ vmmc-supply = <&v3_3d>;
+ vqmmc-supply = <&ldo1_reg>;
+ bus-width = <4>;
+ cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>; /* gpio 219 */
+};
+
&mmc2 {
status = "okay";
vmmc-supply = <&v3_3d>;
diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi
index f9cf1273f35e..b1cf5a26f3c2 100644
--- a/arch/arm/boot/dts/armada-370.dtsi
+++ b/arch/arm/boot/dts/armada-370.dtsi
@@ -72,7 +72,7 @@
reg = <MBUS_ID(0x01, 0xe0) 0 0x100000>;
};
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-370-pcie";
status = "disabled";
device_type = "pci";
@@ -100,6 +100,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 58>;
marvell,pcie-port = <0>;
@@ -117,6 +118,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 62>;
marvell,pcie-port = <1>;
diff --git a/arch/arm/boot/dts/armada-375.dtsi b/arch/arm/boot/dts/armada-375.dtsi
index 50c5e8417802..7225c7ce9a8d 100644
--- a/arch/arm/boot/dts/armada-375.dtsi
+++ b/arch/arm/boot/dts/armada-375.dtsi
@@ -582,7 +582,7 @@
};
};
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-370-pcie";
status = "disabled";
device_type = "pci";
@@ -610,6 +610,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <0>;
@@ -627,6 +628,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <0>;
diff --git a/arch/arm/boot/dts/armada-380.dtsi b/arch/arm/boot/dts/armada-380.dtsi
index e392f6036f39..132596fd0860 100644
--- a/arch/arm/boot/dts/armada-380.dtsi
+++ b/arch/arm/boot/dts/armada-380.dtsi
@@ -71,7 +71,7 @@
};
};
- pcie-controller {
+ pcie {
compatible = "marvell,armada-370-pcie";
status = "disabled";
device_type = "pci";
@@ -104,6 +104,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <0>;
@@ -122,6 +123,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <1>;
@@ -140,6 +142,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <2>;
diff --git a/arch/arm/boot/dts/armada-385-db-ap.dts b/arch/arm/boot/dts/armada-385-db-ap.dts
index db5b9f6b615d..25d2d720dc0e 100644
--- a/arch/arm/boot/dts/armada-385-db-ap.dts
+++ b/arch/arm/boot/dts/armada-385-db-ap.dts
@@ -209,7 +209,7 @@
status = "okay";
};
- pcie-controller {
+ pcie {
status = "okay";
/*
diff --git a/arch/arm/boot/dts/armada-385-turris-omnia.dts b/arch/arm/boot/dts/armada-385-turris-omnia.dts
index be16ce39fb3d..06831e1e3f80 100644
--- a/arch/arm/boot/dts/armada-385-turris-omnia.dts
+++ b/arch/arm/boot/dts/armada-385-turris-omnia.dts
@@ -96,7 +96,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
pcie@1,0 {
diff --git a/arch/arm/boot/dts/armada-385.dtsi b/arch/arm/boot/dts/armada-385.dtsi
index 7fcc4c4885cf..74863aff01c6 100644
--- a/arch/arm/boot/dts/armada-385.dtsi
+++ b/arch/arm/boot/dts/armada-385.dtsi
@@ -70,7 +70,7 @@
};
soc {
- pciec: pcie-controller {
+ pciec: pcie {
compatible = "marvell,armada-370-pcie";
status = "disabled";
device_type = "pci";
@@ -109,6 +109,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <0>;
@@ -127,6 +128,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <1>;
@@ -145,6 +147,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <2>;
@@ -166,6 +169,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
0x81000000 0 0 0x81000000 0x4 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <3>;
diff --git a/arch/arm/boot/dts/armada-388-clearfog.dts b/arch/arm/boot/dts/armada-388-clearfog.dts
index 0d5f1f062275..ee7b0089eff0 100644
--- a/arch/arm/boot/dts/armada-388-clearfog.dts
+++ b/arch/arm/boot/dts/armada-388-clearfog.dts
@@ -62,7 +62,7 @@
};
};
- pcie-controller {
+ pcie {
pcie@3,0 {
/* Port 2, Lane 0. CON2, nearest CPU. */
reset-gpios = <&expander0 2 GPIO_ACTIVE_LOW>;
diff --git a/arch/arm/boot/dts/armada-388-clearfog.dtsi b/arch/arm/boot/dts/armada-388-clearfog.dtsi
index 0f5938bede53..68acfc968706 100644
--- a/arch/arm/boot/dts/armada-388-clearfog.dtsi
+++ b/arch/arm/boot/dts/armada-388-clearfog.dtsi
@@ -104,7 +104,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
/*
* The two PCIe units are accessible through
diff --git a/arch/arm/boot/dts/armada-388-db.dts b/arch/arm/boot/dts/armada-388-db.dts
index 1ac923826445..a4ec1fa37529 100644
--- a/arch/arm/boot/dts/armada-388-db.dts
+++ b/arch/arm/boot/dts/armada-388-db.dts
@@ -172,7 +172,7 @@
status = "okay";
};
- pcie-controller {
+ pcie {
status = "okay";
/*
* The two PCIe units are accessible through
diff --git a/arch/arm/boot/dts/armada-388-gp.dts b/arch/arm/boot/dts/armada-388-gp.dts
index 563901e0ec07..f503955dbd3b 100644
--- a/arch/arm/boot/dts/armada-388-gp.dts
+++ b/arch/arm/boot/dts/armada-388-gp.dts
@@ -240,7 +240,7 @@
status = "okay";
};
- pcie-controller {
+ pcie {
status = "okay";
/*
* One PCIe units is accessible through
diff --git a/arch/arm/boot/dts/armada-388-rd.dts b/arch/arm/boot/dts/armada-388-rd.dts
index af82f275eac2..9cc3ca0376b9 100644
--- a/arch/arm/boot/dts/armada-388-rd.dts
+++ b/arch/arm/boot/dts/armada-388-rd.dts
@@ -117,7 +117,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
/*
* One PCIe units is accessible through
diff --git a/arch/arm/boot/dts/armada-38x.dtsi b/arch/arm/boot/dts/armada-38x.dtsi
index af31f5d6c0e5..7ff0811e61db 100644
--- a/arch/arm/boot/dts/armada-38x.dtsi
+++ b/arch/arm/boot/dts/armada-38x.dtsi
@@ -154,6 +154,13 @@
reg = <0xc000 0x58>;
};
+ timer@c200 {
+ compatible = "arm,cortex-a9-global-timer";
+ reg = <0xc200 0x20>;
+ interrupts = <GIC_PPI 11 (IRQ_TYPE_EDGE_RISING | GIC_CPU_MASK_SIMPLE(2))>;
+ clocks = <&coreclk 2>;
+ };
+
timer@c600 {
compatible = "arm,cortex-a9-twd-timer";
reg = <0xc600 0x20>;
diff --git a/arch/arm/boot/dts/armada-390-db.dts b/arch/arm/boot/dts/armada-390-db.dts
index 2afed2ce4741..c718a5242595 100644
--- a/arch/arm/boot/dts/armada-390-db.dts
+++ b/arch/arm/boot/dts/armada-390-db.dts
@@ -123,7 +123,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
/* CON30 */
diff --git a/arch/arm/boot/dts/armada-395-gp.dts b/arch/arm/boot/dts/armada-395-gp.dts
index 2cdbba804c1e..ef491b524fd6 100644
--- a/arch/arm/boot/dts/armada-395-gp.dts
+++ b/arch/arm/boot/dts/armada-395-gp.dts
@@ -139,7 +139,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
/*
diff --git a/arch/arm/boot/dts/armada-398-db.dts b/arch/arm/boot/dts/armada-398-db.dts
index e8604281c3c9..f0e0379f7619 100644
--- a/arch/arm/boot/dts/armada-398-db.dts
+++ b/arch/arm/boot/dts/armada-398-db.dts
@@ -118,7 +118,7 @@
};
};
- pcie-controller {
+ pcie {
status = "okay";
pcie@1,0 {
diff --git a/arch/arm/boot/dts/armada-39x.dtsi b/arch/arm/boot/dts/armada-39x.dtsi
index 60fbfd5907c7..ea657071e278 100644
--- a/arch/arm/boot/dts/armada-39x.dtsi
+++ b/arch/arm/boot/dts/armada-39x.dtsi
@@ -442,7 +442,7 @@
};
};
- pcie-controller {
+ pcie {
compatible = "marvell,armada-370-pcie";
status = "disabled";
device_type = "pci";
@@ -481,6 +481,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <0>;
@@ -499,6 +500,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <1>;
@@ -517,6 +519,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <2>;
@@ -538,6 +541,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
0x81000000 0 0 0x81000000 0x4 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &gic GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
marvell,pcie-port = <3>;
diff --git a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi
index be22ec5236ac..bdd4c7a45fbf 100644
--- a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi
+++ b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi
@@ -91,7 +91,7 @@
/*
* 98DX3236 has 1 x1 PCIe unit Gen2.0
*/
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-xp-pcie";
status = "disabled";
device_type = "pci";
@@ -116,6 +116,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 58>;
marvell,pcie-port = <0>;
diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts
index a33974254d8c..065282c21789 100644
--- a/arch/arm/boot/dts/armada-xp-db.dts
+++ b/arch/arm/boot/dts/armada-xp-db.dts
@@ -242,7 +242,7 @@
/* Port 2, Lane 0 */
status = "okay";
};
- pcie@10,0 {
+ pcie@a,0 {
/* Port 3, Lane 0 */
status = "okay";
};
diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts
index d62bf7bea1df..ac9eab8ac186 100644
--- a/arch/arm/boot/dts/armada-xp-gp.dts
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
@@ -227,7 +227,7 @@
/* Port 2, Lane 0 */
status = "okay";
};
- pcie@10,0 {
+ pcie@a,0 {
/* Port 3, Lane 0 */
status = "okay";
};
diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
index 9f25814077f2..129738f7973d 100644
--- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
@@ -86,7 +86,7 @@
* configured as x4 or quad x1 lanes. One unit is
* x1 only.
*/
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-xp-pcie";
status = "disabled";
device_type = "pci";
@@ -123,6 +123,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 58>;
marvell,pcie-port = <0>;
@@ -140,6 +141,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 59>;
marvell,pcie-port = <0>;
@@ -157,6 +159,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 60>;
marvell,pcie-port = <0>;
@@ -174,6 +177,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
0x81000000 0 0 0x81000000 0x4 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 61>;
marvell,pcie-port = <0>;
@@ -191,6 +195,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
0x81000000 0 0 0x81000000 0x5 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 62>;
marvell,pcie-port = <1>;
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
index 2bfe07aebf1a..e58d597e37b9 100644
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
@@ -87,7 +87,7 @@
* configured as x4 or quad x1 lanes. One unit is
* x4 only.
*/
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-xp-pcie";
status = "disabled";
device_type = "pci";
@@ -138,6 +138,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 58>;
marvell,pcie-port = <0>;
@@ -155,6 +156,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 59>;
marvell,pcie-port = <0>;
@@ -172,6 +174,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 60>;
marvell,pcie-port = <0>;
@@ -189,6 +192,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
0x81000000 0 0 0x81000000 0x4 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 61>;
marvell,pcie-port = <0>;
@@ -206,6 +210,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
0x81000000 0 0 0x81000000 0x5 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 62>;
marvell,pcie-port = <1>;
@@ -223,6 +228,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
0x81000000 0 0 0x81000000 0x6 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 63>;
marvell,pcie-port = <1>;
@@ -240,6 +246,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
0x81000000 0 0 0x81000000 0x7 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 64>;
marvell,pcie-port = <1>;
@@ -257,6 +264,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
0x81000000 0 0 0x81000000 0x8 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 65>;
marvell,pcie-port = <1>;
@@ -274,6 +282,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
0x81000000 0 0 0x81000000 0x9 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 99>;
marvell,pcie-port = <2>;
diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
index 6c33935f7074..a5c961cee7de 100644
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
@@ -104,7 +104,7 @@
* configured as x4 or quad x1 lanes. Two units are
* x4/x1.
*/
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,armada-xp-pcie";
status = "disabled";
device_type = "pci";
@@ -159,6 +159,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 58>;
marvell,pcie-port = <0>;
@@ -176,6 +177,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 59>;
marvell,pcie-port = <0>;
@@ -193,6 +195,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
0x81000000 0 0 0x81000000 0x3 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 60>;
marvell,pcie-port = <0>;
@@ -210,6 +213,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
0x81000000 0 0 0x81000000 0x4 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 61>;
marvell,pcie-port = <0>;
@@ -227,6 +231,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
0x81000000 0 0 0x81000000 0x5 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 62>;
marvell,pcie-port = <1>;
@@ -244,6 +249,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
0x81000000 0 0 0x81000000 0x6 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 63>;
marvell,pcie-port = <1>;
@@ -261,6 +267,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
0x81000000 0 0 0x81000000 0x7 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 64>;
marvell,pcie-port = <1>;
@@ -278,6 +285,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
0x81000000 0 0 0x81000000 0x8 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 65>;
marvell,pcie-port = <1>;
@@ -295,6 +303,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
0x81000000 0 0 0x81000000 0x9 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 99>;
marvell,pcie-port = <2>;
@@ -303,7 +312,7 @@
status = "disabled";
};
- pcie10: pcie@10,0 {
+ pcie10: pcie@a,0 {
device_type = "pci";
assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
reg = <0x5000 0 0 0 0>;
@@ -312,6 +321,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
0x81000000 0 0 0x81000000 0xa 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &mpic 103>;
marvell,pcie-port = <3>;
diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi
index 8a04c7e2d818..22b958537d31 100644
--- a/arch/arm/boot/dts/aspeed-g4.dtsi
+++ b/arch/arm/boot/dts/aspeed-g4.dtsi
@@ -26,7 +26,7 @@
fmc: flash-controller@1e620000 {
reg = < 0x1e620000 0x94
- 0x20000000 0x02000000 >;
+ 0x20000000 0x10000000 >;
#address-cells = <1>;
#size-cells = <0>;
compatible = "aspeed,ast2400-fmc";
@@ -41,7 +41,7 @@
spi: flash-controller@1e630000 {
reg = < 0x1e630000 0x18
- 0x30000000 0x02000000 >;
+ 0x30000000 0x10000000 >;
#address-cells = <1>;
#size-cells = <0>;
compatible = "aspeed,ast2400-spi";
diff --git a/arch/arm/boot/dts/at91-sama5d27_som1.dtsi b/arch/arm/boot/dts/at91-sama5d27_som1.dtsi
new file mode 100644
index 000000000000..63a5af898165
--- /dev/null
+++ b/arch/arm/boot/dts/at91-sama5d27_som1.dtsi
@@ -0,0 +1,102 @@
+/*
+ * at91-sama5d27_som1.dtsi - Device Tree file for SAMA5D27 SoM1 board
+ *
+ * Copyright (c) 2017, Microchip Technology Inc.
+ * 2017 Cristian Birsan <[email protected]>
+ * 2017 Claudiu Beznea <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include "sama5d2.dtsi"
+#include "sama5d2-pinfunc.h"
+
+/ {
+ model = "Atmel SAMA5D27 SoM1";
+ compatible = "atmel,sama5d27-som1", "atmel,sama5d27", "atmel,sama5d2", "atmel,sama5";
+
+ clocks {
+ slow_xtal {
+ clock-frequency = <32768>;
+ };
+
+ main_xtal {
+ clock-frequency = <24000000>;
+ };
+ };
+
+ ahb {
+ apb {
+ macb0: ethernet@f8008000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_macb0_default>;
+ phy-mode = "rmii";
+
+ ethernet-phy@1 {
+ reg = <0x1>;
+ interrupt-parent = <&pioA>;
+ interrupts = <PIN_PD31 IRQ_TYPE_LEVEL_LOW>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_macb0_phy_irq>;
+ };
+ };
+
+ pinctrl@fc038000 {
+
+ pinctrl_macb0_default: macb0_default {
+ pinmux = <PIN_PD9__GTXCK>,
+ <PIN_PD10__GTXEN>,
+ <PIN_PD11__GRXDV>,
+ <PIN_PD12__GRXER>,
+ <PIN_PD13__GRX0>,
+ <PIN_PD14__GRX1>,
+ <PIN_PD15__GTX0>,
+ <PIN_PD16__GTX1>,
+ <PIN_PD17__GMDC>,
+ <PIN_PD18__GMDIO>;
+ bias-disable;
+ };
+
+ pinctrl_macb0_phy_irq: macb0_phy_irq {
+ pinmux = <PIN_PD31__GPIO>;
+ bias-disable;
+ };
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts
new file mode 100644
index 000000000000..60cb084a8d92
--- /dev/null
+++ b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts
@@ -0,0 +1,540 @@
+/*
+ * at91-sama5d27_som1_ek.dts - Device Tree file for SAMA5D27-SOM1-EK board
+ *
+ * Copyright (c) 2017, Microchip Technology Inc.
+ * 2016 Nicolas Ferre <[email protected]>
+ * 2017 Cristian Birsan <[email protected]>
+ * 2017 Claudiu Beznea <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+/dts-v1/;
+#include "at91-sama5d27_som1.dtsi"
+#include <dt-bindings/mfd/atmel-flexcom.h>
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "Atmel SAMA5D27 SOM1 EK";
+ compatible = "atmel,sama5d27-som1-ek", "atmel,sama5d27-som1", "atmel,sama5d27", "atmel,sama5d2", "atmel,sama5";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ ahb {
+ usb0: gadget@00300000 {
+ atmel,vbus-gpio = <&pioA PIN_PD20 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usba_vbus>;
+ status = "okay";
+ };
+
+ usb1: ohci@00400000 {
+ num-ports = <3>;
+ atmel,vbus-gpio = <0 /* &pioA PIN_PD20 GPIO_ACTIVE_HIGH */
+ &pioA PIN_PA27 GPIO_ACTIVE_HIGH
+ 0
+ >;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usb_default>;
+ status = "okay";
+ };
+
+ usb2: ehci@00500000 {
+ status = "okay";
+ };
+
+ sdmmc0: sdio-host@a0000000 {
+ bus-width = <8>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_sdmmc0_default>;
+ status = "okay";
+ };
+
+ sdmmc1: sdio-host@b0000000 {
+ bus-width = <4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_sdmmc1_default>;
+ status = "okay";
+ };
+
+ apb {
+ isc: isc@f0008000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_isc_base &pinctrl_isc_data_8bit &pinctrl_isc_data_9_10 &pinctrl_isc_data_11_12>;
+ status = "okay";
+ };
+
+ spi0: spi@f8000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_spi0_default>;
+ status = "okay";
+ };
+
+ macb0: ethernet@f8008000 {
+ status = "okay";
+ };
+
+ uart1: serial@f8020000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart1_default>;
+ atmel,use-dma-rx;
+ atmel,use-dma-tx;
+ status = "okay";
+ };
+
+ uart2: serial@f8024000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_mikrobus2_uart>;
+ atmel,use-dma-rx;
+ atmel,use-dma-tx;
+ status = "okay";
+ };
+
+ pwm0: pwm@f802c000 {
+ status = "okay";
+ };
+
+ flx1: flexcom@f8038000 {
+ atmel,flexcom-mode = <ATMEL_FLEXCOM_MODE_TWI>;
+ status = "disabled";
+
+ i2c2: i2c@600 {
+ compatible = "atmel,sama5d2-i2c";
+ reg = <0x600 0x200>;
+ interrupts = <20 IRQ_TYPE_LEVEL_HIGH 7>;
+ dmas = <0>, <0>;
+ dma-names = "tx", "rx";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&flx1_clk>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_mikrobus_i2c>;
+ atmel,fifo-size = <16>;
+ status = "disabled";
+ };
+ };
+
+ shdwc@f8048010 {
+ atmel,shdwc-debouncer = <976>;
+ atmel,wakeup-rtc-timer;
+
+ input@0 {
+ reg = <0>;
+ atmel,wakeup-type = "low";
+ };
+ };
+
+ watchdog@f8048040 {
+ status = "okay";
+ };
+
+ can0: can@f8054000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_can0_default>;
+ };
+
+ uart3: serial@fc008000 {
+ atmel,use-dma-rx;
+ atmel,use-dma-tx;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart3_default>;
+ status = "disabled";
+ };
+
+ uart4: serial@fc00c000 {
+ atmel,use-dma-rx;
+ atmel,use-dma-tx;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_mikrobus1_uart>;
+ status = "okay";
+ };
+
+ flx3: flexcom@fc014000 {
+ atmel,flexcom-mode = <ATMEL_FLEXCOM_MODE_SPI>;
+ status = "disabled";
+
+ uart7: serial@200 {
+ compatible = "atmel,at91sam9260-usart";
+ reg = <0x200 0x200>;
+ interrupts = <22 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&flx3_clk>;
+ clock-names = "usart";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flx3_default>;
+ atmel,fifo-size = <32>;
+ status = "disabled";
+ };
+
+ spi2: spi@400 {
+ compatible = "atmel,at91rm9200-spi";
+ reg = <0x400 0x200>;
+ interrupts = <22 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&flx3_clk>;
+ clock-names = "spi_clk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flx3_default>;
+ atmel,fifo-size = <16>;
+ status = "disabled";
+ };
+ };
+
+ flx4: flexcom@fc018000 {
+ atmel,flexcom-mode = <ATMEL_FLEXCOM_MODE_SPI>;
+ status = "okay";
+
+ uart6: serial@200 {
+ compatible = "atmel,at91sam9260-usart";
+ reg = <0x200 0x200>;
+ interrupts = <23 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&flx4_clk>;
+ clock-names = "usart";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flx4_default>;
+ atmel,fifo-size = <32>;
+ status = "disabled";
+ };
+
+ spi3: spi@400 {
+ compatible = "atmel,at91rm9200-spi";
+ reg = <0x400 0x200>;
+ interrupts = <23 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&flx4_clk>;
+ clock-names = "spi_clk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_mikrobus_spi &pinctrl_mikrobus1_spi_cs &pinctrl_mikrobus2_spi_cs>;
+ atmel,fifo-size = <16>;
+ status = "okay";
+ };
+
+ i2c3: i2c@600 {
+ compatible = "atmel,sama5d2-i2c";
+ reg = <0x600 0x200>;
+ interrupts = <23 IRQ_TYPE_LEVEL_HIGH 7>;
+ dmas = <0>, <0>;
+ dma-names = "tx", "rx";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&flx4_clk>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flx4_default>;
+ atmel,fifo-size = <16>;
+ status = "disabled";
+ };
+ };
+
+ i2c1: i2c@fc028000 {
+ dmas = <0>, <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c1_default>;
+ status = "okay";
+ };
+
+ pinctrl@fc038000 {
+
+ pinctrl_can0_default: can0_default {
+ pinmux = <PIN_PC10__CANTX0>,
+ <PIN_PC11__CANRX0>;
+ bias-disable;
+ };
+
+ pinctrl_can1_default: can1_default {
+ pinmux = <PIN_PC26__CANTX1>,
+ <PIN_PC27__CANRX1>;
+ bias-disable;
+ };
+
+ pinctrl_flx3_default: flx3_default {
+ pinmux = <PIN_PC20__FLEXCOM3_IO0>,
+ <PIN_PC19__FLEXCOM3_IO1>,
+ <PIN_PC18__FLEXCOM3_IO2>,
+ <PIN_PC21__FLEXCOM3_IO3>,
+ <PIN_PC22__FLEXCOM3_IO4>;
+ bias-disable;
+ };
+
+ pinctrl_i2c1_default: i2c1_default {
+ pinmux = <PIN_PD4__TWD1>,
+ <PIN_PD5__TWCK1>;
+ bias-disable;
+ };
+
+ pinctrl_isc_base: isc_base {
+ pinmux = <PIN_PC21__ISC_PCK>,
+ <PIN_PC22__ISC_VSYNC>,
+ <PIN_PC23__ISC_HSYNC>,
+ <PIN_PC24__ISC_MCK>;
+ bias-disable;
+ };
+
+ pinctrl_isc_data_8bit: isc_data_8bit {
+ pinmux = <PIN_PC20__ISC_D11>,
+ <PIN_PC19__ISC_D10>,
+ <PIN_PC18__ISC_D9>,
+ <PIN_PC17__ISC_D8>,
+ <PIN_PC16__ISC_D7>,
+ <PIN_PC15__ISC_D6>,
+ <PIN_PC14__ISC_D5>,
+ <PIN_PC13__ISC_D4>;
+ bias-disable;
+ };
+
+ pinctrl_isc_data_9_10: isc_data_9_10 {
+ pinmux = <PIN_PC12__ISC_D3>,
+ <PIN_PC11__ISC_D2>;
+ bias-disable;
+ };
+
+ pinctrl_isc_data_11_12: isc_data_11_12 {
+ pinmux = <PIN_PC10__ISC_D1>,
+ <PIN_PC9__ISC_D0>;
+ bias-disable;
+ };
+
+ pinctrl_key_gpio_default: key_gpio_default {
+ pinmux = <PIN_PA29__GPIO>;
+ bias-pull-up;
+ };
+
+ pinctrl_led_gpio_default: led_gpio_default {
+ pinmux = <PIN_PA10__GPIO>,
+ <PIN_PB1__GPIO>,
+ <PIN_PA31__GPIO>;
+ bias-pull-up;
+ };
+
+ pinctrl_sdmmc0_default: sdmmc0_default {
+ cmd_data {
+ pinmux = <PIN_PA1__SDMMC0_CMD>,
+ <PIN_PA2__SDMMC0_DAT0>,
+ <PIN_PA3__SDMMC0_DAT1>,
+ <PIN_PA4__SDMMC0_DAT2>,
+ <PIN_PA5__SDMMC0_DAT3>,
+ <PIN_PA6__SDMMC0_DAT4>,
+ <PIN_PA7__SDMMC0_DAT5>,
+ <PIN_PA8__SDMMC0_DAT6>,
+ <PIN_PA9__SDMMC0_DAT7>;
+ bias-pull-up;
+ };
+
+ ck_cd_vddsel {
+ pinmux = <PIN_PA0__SDMMC0_CK>,
+ <PIN_PA11__SDMMC0_VDDSEL>,
+ <PIN_PA13__SDMMC0_CD>;
+ bias-disable;
+ };
+ };
+
+ pinctrl_sdmmc1_default: sdmmc1_default {
+ cmd_data {
+ pinmux = <PIN_PA28__SDMMC1_CMD>,
+ <PIN_PA18__SDMMC1_DAT0>,
+ <PIN_PA19__SDMMC1_DAT1>,
+ <PIN_PA20__SDMMC1_DAT2>,
+ <PIN_PA21__SDMMC1_DAT3>;
+ bias-pull-up;
+ };
+
+ conf-ck_cd {
+ pinmux = <PIN_PA22__SDMMC1_CK>,
+ <PIN_PA30__SDMMC1_CD>;
+ bias-disable;
+ };
+ };
+
+ pinctrl_spi0_default: spi0_default {
+ pinmux = <PIN_PA14__SPI0_SPCK>,
+ <PIN_PA15__SPI0_MOSI>,
+ <PIN_PA16__SPI0_MISO>,
+ <PIN_PA17__SPI0_NPCS0>;
+ bias-disable;
+ };
+
+ pinctrl_uart1_default: uart1_default {
+ pinmux = <PIN_PD2__URXD1>,
+ <PIN_PD3__UTXD1>;
+ bias-disable;
+ };
+
+ pinctrl_uart3_default: uart3_default {
+ pinmux = <PIN_PC12__URXD3>,
+ <PIN_PC13__UTXD3>;
+ bias-disable;
+ };
+
+ pinctrl_usb_default: usb_default {
+ pinmux = <PIN_PA27__GPIO>,
+ <PIN_PD19__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_usba_vbus: usba_vbus {
+ pinmux = <PIN_PD20__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_an: mikrobus1_an {
+ pinmux = <PIN_PD25__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_an: mikrobus2_an {
+ pinmux = <PIN_PD26__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_rst: mikrobus1_rst {
+ pinmux = <PIN_PB2__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_rst: mikrobus2_rst {
+ pinmux = <PIN_PA26__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_spi_cs: mikrobus1_spi_cs {
+ pinmux = <PIN_PD0__FLEXCOM4_IO4>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_spi_cs: mikrobus2_spi_cs {
+ pinmux = <PIN_PC31__FLEXCOM4_IO3>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus_spi: mikrobus_spi {
+ pinmux = <PIN_PC28__FLEXCOM4_IO0>,
+ <PIN_PC29__FLEXCOM4_IO1>,
+ <PIN_PC30__FLEXCOM4_IO2>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_pwm: mikrobus1_pwm {
+ pinmux = <PIN_PB1__PWML1>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_pwm: mikrobus2_pwm {
+ pinmux = <PIN_PA31__PWML0>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_int: mikrobus1_int {
+ pinmux = <PIN_PB0__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_int: mikrobus2_int {
+ pinmux = <PIN_PA25__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus1_uart: mikrobus1_uart {
+ pinmux = <PIN_PB3__URXD4>,
+ <PIN_PB4__UTXD4>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus2_uart: mikrobus2_uart {
+ pinmux = <PIN_PD23__URXD2>,
+ <PIN_PD24__UTXD2>;
+ bias-disable;
+ };
+
+ pinctrl_mikrobus_i2c: mikrobus1_i2c {
+ pinmux = <PIN_PA24__FLEXCOM1_IO0>,
+ <PIN_PA23__FLEXCOM1_IO1>;
+ bias-disable;
+ };
+
+ pinctrl_flx4_default: flx4_uart_default {
+ pinmux = <PIN_PC28__FLEXCOM4_IO0>,
+ <PIN_PC29__FLEXCOM4_IO1>,
+ <PIN_PC30__FLEXCOM4_IO2>,
+ <PIN_PC31__FLEXCOM4_IO3>,
+ <PIN_PD0__FLEXCOM4_IO4>;
+ bias-disable;
+ };
+ };
+
+ can1: can@fc050000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_can1_default>;
+ status = "okay";
+ };
+ };
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_key_gpio_default>;
+
+ pb4 {
+ label = "USER";
+ gpios = <&pioA PIN_PA29 GPIO_ACTIVE_LOW>;
+ linux,code = <0x104>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_led_gpio_default>;
+ status = "okay";
+
+ red {
+ label = "red";
+ gpios = <&pioA PIN_PA10 GPIO_ACTIVE_HIGH>;
+ };
+
+ green {
+ label = "green";
+ gpios = <&pioA PIN_PB1 GPIO_ACTIVE_HIGH>;
+ };
+
+ blue {
+ label = "blue";
+ gpios = <&pioA PIN_PA31 GPIO_ACTIVE_HIGH>;
+ linux,default-trigger = "heartbeat";
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/at91-sama5d2_xplained.dts b/arch/arm/boot/dts/at91-sama5d2_xplained.dts
index 2e2c3d1a1fa2..c7e9ccf2bc87 100644
--- a/arch/arm/boot/dts/at91-sama5d2_xplained.dts
+++ b/arch/arm/boot/dts/at91-sama5d2_xplained.dts
@@ -68,7 +68,7 @@
ahb {
usb0: gadget@00300000 {
- atmel,vbus-gpio = <&pioA 31 GPIO_ACTIVE_HIGH>;
+ atmel,vbus-gpio = <&pioA PIN_PA31 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usba_vbus>;
status = "okay";
@@ -76,8 +76,8 @@
usb1: ohci@00400000 {
num-ports = <3>;
- atmel,vbus-gpio = <0 /* &pioA 41 GPIO_ACTIVE_HIGH */
- &pioA 42 GPIO_ACTIVE_HIGH
+ atmel,vbus-gpio = <0 /* &pioA PIN_PB9 GPIO_ACTIVE_HIGH */
+ &pioA PIN_PB10 GPIO_ACTIVE_HIGH
0
>;
pinctrl-names = "default";
@@ -127,7 +127,7 @@
ethernet-phy@1 {
reg = <0x1>;
interrupt-parent = <&pioA>;
- interrupts = <73 IRQ_TYPE_LEVEL_LOW>;
+ interrupts = <PIN_PC9 IRQ_TYPE_LEVEL_LOW>;
};
};
@@ -160,9 +160,9 @@
compatible = "active-semi,act8945a";
reg = <0x5b>;
active-semi,vsel-high;
- active-semi,chglev-gpios = <&pioA 12 GPIO_ACTIVE_HIGH>;
- active-semi,lbo-gpios = <&pioA 72 GPIO_ACTIVE_LOW>;
- active-semi,irq_gpios = <&pioA 45 GPIO_ACTIVE_LOW>;
+ active-semi,chglev-gpios = <&pioA PIN_PA12 GPIO_ACTIVE_HIGH>;
+ active-semi,lbo-gpios = <&pioA PIN_PC8 GPIO_ACTIVE_LOW>;
+ active-semi,irq_gpios = <&pioA PIN_PB13 GPIO_ACTIVE_LOW>;
active-semi,input-voltage-threshold-microvolt = <6600>;
active-semi,precondition-timeout = <40>;
active-semi,total-timeout = <3>;
@@ -355,6 +355,14 @@
bias-pull-up;
};
+ pinctrl_classd_default: classd_default {
+ pinmux = <PIN_PB1__CLASSD_R0>,
+ <PIN_PB2__CLASSD_R1>,
+ <PIN_PB3__CLASSD_R2>,
+ <PIN_PB4__CLASSD_R3>;
+ bias-pull-up;
+ };
+
pinctrl_flx0_default: flx0_default {
pinmux = <PIN_PB28__FLEXCOM0_IO0>,
<PIN_PB29__FLEXCOM0_IO1>;
@@ -488,6 +496,14 @@
};
+ classd: classd@fc048000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_classd_default>;
+ atmel,pwm-type = "diff";
+ atmel,non-overlap-time = <10>;
+ status = "okay";
+ };
+
can1: can@fc050000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_can1_default>;
@@ -504,7 +520,7 @@
bp1 {
label = "PB_USER";
- gpios = <&pioA 41 GPIO_ACTIVE_LOW>;
+ gpios = <&pioA PIN_PB9 GPIO_ACTIVE_LOW>;
linux,code = <0x104>;
};
};
@@ -517,17 +533,18 @@
red {
label = "red";
- gpios = <&pioA 38 GPIO_ACTIVE_LOW>;
+ gpios = <&pioA PIN_PB6 GPIO_ACTIVE_LOW>;
};
+
green {
label = "green";
- gpios = <&pioA 37 GPIO_ACTIVE_LOW>;
+ gpios = <&pioA PIN_PB5 GPIO_ACTIVE_LOW>;
};
blue {
label = "blue";
- gpios = <&pioA 32 GPIO_ACTIVE_LOW>;
+ gpios = <&pioA PIN_PB0 GPIO_ACTIVE_LOW>;
linux,default-trigger = "heartbeat";
};
};
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
index a4808c4fbc05..64fa3f9a39d3 100644
--- a/arch/arm/boot/dts/at91sam9g45.dtsi
+++ b/arch/arm/boot/dts/at91sam9g45.dtsi
@@ -455,6 +455,16 @@
>;
/* shared pinctrl settings */
+ ac97 {
+ pinctrl_ac97: ac97-0 {
+ atmel,pins =
+ <AT91_PIOD 6 AT91_PERIPH_A AT91_PINCTRL_NONE /* AC97RX */
+ AT91_PIOD 7 AT91_PERIPH_A AT91_PINCTRL_NONE /* AC97TX */
+ AT91_PIOD 8 AT91_PERIPH_A AT91_PINCTRL_NONE /* AC97FS */
+ AT91_PIOD 9 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* AC97CK */
+ };
+ };
+
adc0 {
pinctrl_adc0_adtrg: adc0_adtrg {
atmel,pins = <AT91_PIOD 28 AT91_PERIPH_A AT91_PINCTRL_NONE>;
@@ -1043,6 +1053,17 @@
status = "disabled";
};
+ ac97: sound@fffac000 {
+ compatible = "atmel,at91sam9263-ac97c";
+ reg = <0xfffac000 0x4000>;
+ interrupts = <24 IRQ_TYPE_LEVEL_HIGH 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ac97>;
+ clocks = <&ac97_clk>;
+ clock-names = "ac97_clk";
+ status = "disabled";
+ };
+
adc0: adc@fffb0000 {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts
index 2522c3308305..94c52c555f83 100644
--- a/arch/arm/boot/dts/at91sam9m10g45ek.dts
+++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts
@@ -166,6 +166,10 @@
status = "okay";
};
+ ac97: sound@fffac000 {
+ status = "okay";
+ };
+
adc0: adc@fffb0000 {
pinctrl-names = "default";
pinctrl-0 = <
diff --git a/arch/arm/boot/dts/bcm-cygnus.dtsi b/arch/arm/boot/dts/bcm-cygnus.dtsi
index bf8c83815753..7c957ea06c66 100644
--- a/arch/arm/boot/dts/bcm-cygnus.dtsi
+++ b/arch/arm/boot/dts/bcm-cygnus.dtsi
@@ -55,6 +55,11 @@
/include/ "bcm-cygnus-clock.dtsi"
+ pmu {
+ compatible = "arm,cortex-a9-pmu";
+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
core {
compatible = "simple-bus";
ranges = <0x00000000 0x19000000 0x1000000>;
@@ -119,6 +124,21 @@
compatible = "brcm,cygnus-pinmux";
reg = <0x0301d0c8 0x30>,
<0x0301d24c 0x2c>;
+
+ spi_0: spi_0 {
+ function = "spi0";
+ groups = "spi0_grp";
+ };
+
+ spi_1: spi_1 {
+ function = "spi1";
+ groups = "spi1_grp";
+ };
+
+ spi_2: spi_2 {
+ function = "spi2";
+ groups = "spi2_grp";
+ };
};
mailbox: mailbox@03024024 {
@@ -300,6 +320,23 @@
};
};
+ dma0: dma@18018000 {
+ compatible = "arm,pl330", "arm,primecell";
+ reg = <0x18018000 0x1000>;
+ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&apb_clk>;
+ clock-names = "apb_pclk";
+ #dma-cells = <1>;
+ };
+
uart0: serial@18020000 {
compatible = "snps,dw-apb-uart";
reg = <0x18020000 0x100>;
@@ -324,7 +361,7 @@
uart2: serial@18022000 {
compatible = "snps,dw-apb-uart";
- reg = <0x18020000 0x100>;
+ reg = <0x18022000 0x100>;
reg-shift = <2>;
reg-io-width = <4>;
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
@@ -344,6 +381,52 @@
status = "disabled";
};
+ spi0: spi@18028000 {
+ compatible = "arm,pl022", "arm,primecell";
+ reg = <0x18028000 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-0 = <&spi_0>;
+ clocks = <&axi81_clk>;
+ clock-names = "apb_pclk";
+ status = "disabled";
+ };
+
+ spi1: spi@18029000 {
+ compatible = "arm,pl022", "arm,primecell";
+ reg = <0x18029000 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-0 = <&spi_1>;
+ clocks = <&axi81_clk>;
+ clock-names = "apb_pclk";
+ status = "disabled";
+ };
+
+ spi2: spi@1802a000 {
+ compatible = "arm,pl022", "arm,primecell";
+ reg = <0x1802a000 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-0 = <&spi_2>;
+ clocks = <&axi81_clk>;
+ clock-names = "apb_pclk";
+ status = "disabled";
+ };
+
+ sdhci0: sdhci@18041000 {
+ compatible = "brcm,sdhci-iproc-cygnus";
+ reg = <0x18041000 0x100>;
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&lcpll0 BCM_CYGNUS_LCPLL0_SDIO_CLK>;
+ bus-width = <4>;
+ sdhci,auto-cmd12;
+ status = "disabled";
+ };
+
eth0: ethernet@18042000 {
compatible = "brcm,amac";
reg = <0x18042000 0x1000>,
@@ -353,6 +436,16 @@
status = "disabled";
};
+ sdhci1: sdhci@18043000 {
+ compatible = "brcm,sdhci-iproc-cygnus";
+ reg = <0x18043000 0x100>;
+ interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&lcpll0 BCM_CYGNUS_LCPLL0_SDIO_CLK>;
+ bus-width = <4>;
+ sdhci,auto-cmd12;
+ status = "disabled";
+ };
+
nand: nand@18046000 {
compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
reg = <0x18046000 0x600>, <0xf8105408 0x600>,
@@ -366,6 +459,33 @@
brcm,nand-has-wp;
};
+ ehci0: usb@18048000 {
+ compatible = "generic-ehci";
+ reg = <0x18048000 0x100>;
+ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
+ ohci0: usb@18048800 {
+ compatible = "generic-ohci";
+ reg = <0x18048800 0x100>;
+ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
+ v3d: v3d@180a2000 {
+ compatible = "brcm,cygnus-v3d";
+ reg = <0x180a2000 0x1000>;
+ clocks = <&mipipll BCM_CYGNUS_MIPIPLL_CH2_V3D>;
+ clock-names = "v3d_clk";
+ interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
+ vc4: gpu {
+ compatible = "brcm,cygnus-vc4";
+ };
+
gpio_asiu: gpio@180a5000 {
compatible = "brcm,cygnus-asiu-gpio";
reg = <0x180a5000 0x668>;
@@ -444,19 +564,6 @@
status = "disabled";
};
- v3d: v3d@180a2000 {
- compatible = "brcm,cygnus-v3d";
- reg = <0x180a2000 0x1000>;
- clocks = <&mipipll BCM_CYGNUS_MIPIPLL_CH2_V3D>;
- clock-names = "v3d_clk";
- interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>;
- status = "disabled";
- };
-
- vc4: gpu {
- compatible = "brcm,cygnus-vc4";
- };
-
adc: adc@180a6000 {
compatible = "brcm,iproc-static-adc";
#io-channel-cells = <1>;
@@ -467,5 +574,19 @@
interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
+
+ keypad: keypad@180ac000 {
+ compatible = "brcm,bcm-keypad";
+ reg = <0x180ac000 0x14c>;
+ interrupts = <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&asiu_clks BCM_CYGNUS_ASIU_KEYPAD_CLK>;
+ clock-names = "peri_clk";
+ clock-frequency = <31250>;
+ pull-up-enabled;
+ col-debounce-filter-period = <0>;
+ status-debounce-filter-period = <0>;
+ row-output-enabled;
+ status = "disabled";
+ };
};
};
diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi
index 7204d1def23d..dff66974feed 100644
--- a/arch/arm/boot/dts/bcm-nsp.dtsi
+++ b/arch/arm/boot/dts/bcm-nsp.dtsi
@@ -215,6 +215,7 @@
interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
sdhci,auto-cmd12;
clocks = <&lcpll0 BCM_NSP_LCPLL0_SDIO_CLK>;
+ dma-coherent;
status = "disabled";
};
@@ -224,6 +225,7 @@
<0x110000 0x1000>;
reg-names = "amac_base", "idm_base";
interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
status = "disabled";
};
@@ -233,6 +235,7 @@
<0x111000 0x1000>;
reg-names = "amac_base", "idm_base";
interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
status = "disabled";
};
@@ -242,6 +245,7 @@
<0x112000 0x1000>;
reg-names = "amac_base", "idm_base";
interrupts = <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
status = "disabled";
};
@@ -252,6 +256,7 @@
#mbox-cells = <1>;
brcm,rx-status-len = <32>;
brcm,use-bcm-hdr;
+ dma-coherent;
};
nand: nand@26000 {
@@ -297,6 +302,32 @@
#size-cells = <0>;
};
+ xhci: usb@29000 {
+ compatible = "generic-xhci";
+ reg = <0x29000 0x1000>;
+ interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+ phys = <&usb3_phy>;
+ phy-names = "usb3-phy";
+ dma-coherent;
+ status = "disabled";
+ };
+
+ ehci0: usb@2a000 {
+ compatible = "generic-ehci";
+ reg = <0x2a000 0x100>;
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
+ status = "disabled";
+ };
+
+ ohci0: usb@2b000 {
+ compatible = "generic-ohci";
+ reg = <0x2b000 0x100>;
+ interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
+ status = "disabled";
+ };
+
crypto@2f000 {
compatible = "brcm,spum-nsp-crypto";
reg = <0x2f000 0x900>;
@@ -321,20 +352,6 @@
status = "disabled";
};
- ehci0: usb@2a000 {
- compatible = "generic-ehci";
- reg = <0x2a000 0x100>;
- interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
- status = "disabled";
- };
-
- ohci0: usb@2b000 {
- compatible = "generic-ohci";
- reg = <0x2b000 0x100>;
- interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
- status = "disabled";
- };
-
rng: rng@33000 {
compatible = "brcm,bcm-nsp-rng";
reg = <0x33000 0x14>;
@@ -376,6 +393,7 @@
#size-cells = <0>;
interrupts = <GIC_SPI 89 IRQ_TYPE_NONE>;
clock-frequency = <100000>;
+ dma-coherent;
status = "disabled";
};
@@ -446,6 +464,7 @@
interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
+ dma-coherent;
status = "disabled";
sata0: sata-port@0 {
@@ -460,6 +479,15 @@
phy-names = "sata-phy";
};
};
+
+ usb3_phy: usb3-phy@104000 {
+ compatible = "brcm,ns-bx-usb3-phy";
+ reg = <0x104000 0x1000>,
+ <0x032000 0x1000>;
+ reg-names = "dmp", "ccb-mii";
+ #phy-cells = <0>;
+ status = "disabled";
+ };
};
pcie0: pcie@18012000 {
@@ -483,6 +511,7 @@
*/
ranges = <0x82000000 0 0x08000000 0x08000000 0 0x8000000>;
+ dma-coherent;
status = "disabled";
msi-parent = <&msi0>;
@@ -519,6 +548,7 @@
*/
ranges = <0x82000000 0 0x40000000 0x40000000 0 0x8000000>;
+ dma-coherent;
status = "disabled";
msi-parent = <&msi1>;
@@ -555,6 +585,7 @@
*/
ranges = <0x82000000 0 0x48000000 0x48000000 0 0x8000000>;
+ dma-coherent;
status = "disabled";
msi-parent = <&msi2>;
diff --git a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
index d0704540db6b..9f866491efdf 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
@@ -99,3 +99,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-a.dts b/arch/arm/boot/dts/bcm2835-rpi-a.dts
index 46d078e29017..4b1af06c8dc0 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-a.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
@@ -94,3 +94,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
index 432088ebb0a1..a846f1e781d8 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
@@ -101,3 +101,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
index 4133bc2cd9be..e860964e39fa 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
@@ -94,3 +94,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
index 4d56fe3006b0..5d77f3f8c4c5 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
@@ -89,3 +89,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
new file mode 100644
index 000000000000..82651c3eb682
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2017 Stefan Wahren <[email protected]>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "bcm2835.dtsi"
+#include "bcm2835-rpi.dtsi"
+#include "bcm283x-rpi-usb-host.dtsi"
+
+/ {
+ compatible = "raspberrypi,model-zero-w", "brcm,bcm2835";
+ model = "Raspberry Pi Zero W";
+
+ /* Needed by firmware to properly init UARTs */
+ aliases {
+ uart0 = "/soc/serial@7e201000";
+ uart1 = "/soc/serial@7e215040";
+ serial0 = "/soc/serial@7e201000";
+ serial1 = "/soc/serial@7e215040";
+ };
+
+ leds {
+ act {
+ gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+ wifi_pwrseq: wifi-pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ pinctrl-names = "default";
+ pinctrl-0 = <&wl_on>;
+ reset-gpios = <&gpio 41 GPIO_ACTIVE_LOW>;
+ };
+};
+
+&gpio {
+ /*
+ * This is based on the official GPU firmware DT blob.
+ *
+ * Legend:
+ * "NC" = not connected (no rail from the SoC)
+ * "FOO" = GPIO line named "FOO" on the schematic
+ * "FOO_N" = GPIO line named "FOO" on schematic, active low
+ */
+ gpio-line-names = "GPIO0",
+ "GPIO1",
+ "SDA1",
+ "SCL1",
+ "GPIO_GCLK",
+ "GPIO5",
+ "GPIO6",
+ "SPI_CE1_N",
+ "SPI_CE0_N",
+ "SPI_MISO",
+ "SPI_MOSI",
+ "SPI_SCLK",
+ "GPIO12",
+ "GPIO13",
+ /* Serial port */
+ "TXD0",
+ "RXD0",
+ "GPIO16",
+ "GPIO17",
+ "GPIO18",
+ "GPIO19",
+ "GPIO20",
+ "GPIO21",
+ "GPIO22",
+ "GPIO23",
+ "GPIO24",
+ "GPIO25",
+ "GPIO26",
+ "GPIO27",
+ "SDA0",
+ "SCL0",
+ "NC", /* GPIO30 */
+ "NC", /* GPIO31 */
+ "NC", /* GPIO32 */
+ "NC", /* GPIO33 */
+ "NC", /* GPIO34 */
+ "NC", /* GPIO35 */
+ "NC", /* GPIO36 */
+ "NC", /* GPIO37 */
+ "NC", /* GPIO38 */
+ "NC", /* GPIO39 */
+ "CAM_GPIO1", /* GPIO40 */
+ "WL_ON", /* GPIO41 */
+ "NC", /* GPIO42 */
+ "WIFI_CLK", /* GPIO43 */
+ "CAM_GPIO0", /* GPIO44 */
+ "BT_ON", /* GPIO45 */
+ "HDMI_HPD_N",
+ "STATUS_LED_N",
+ /* Used by SD Card */
+ "SD_CLK_R",
+ "SD_CMD_R",
+ "SD_DATA0_R",
+ "SD_DATA1_R",
+ "SD_DATA2_R",
+ "SD_DATA3_R";
+
+ pinctrl-0 = <&gpioout &alt0>;
+
+ wl_on: wl-on {
+ brcm,pins = <41>;
+ brcm,function = <BCM2835_FSEL_GPIO_OUT>;
+ };
+};
+
+&hdmi {
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+};
+
+&sdhci {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>;
+ mmc-pwrseq = <&wifi_pwrseq>;
+ non-removable;
+ status = "okay";
+
+ brcmf: wifi@1 {
+ reg = <1>;
+ compatible = "brcm,bcm4329-fmac";
+ };
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero.dts b/arch/arm/boot/dts/bcm2835-rpi-zero.dts
index 79a20d520931..70362405c595 100644
--- a/arch/arm/boot/dts/bcm2835-rpi-zero.dts
+++ b/arch/arm/boot/dts/bcm2835-rpi-zero.dts
@@ -103,3 +103,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
index e55b362b9d6e..e36c392a2b8f 100644
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
@@ -39,7 +39,7 @@
};
alt0: alt0 {
- brcm,pins = <4 5 7 8 9 10 11 14 15>;
+ brcm,pins = <4 5 7 8 9 10 11>;
brcm,function = <BCM2835_FSEL_ALT0>;
};
};
diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
index bf19e8cfb9e6..e8de41444b68 100644
--- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
+++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
@@ -39,3 +39,9 @@
&hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm2836.dtsi b/arch/arm/boot/dts/bcm2836.dtsi
index da3deeb42592..2c26d0be8b03 100644
--- a/arch/arm/boot/dts/bcm2836.dtsi
+++ b/arch/arm/boot/dts/bcm2836.dtsi
@@ -36,6 +36,7 @@
cpus: cpus {
#address-cells = <1>;
#size-cells = <0>;
+ enable-method = "brcm,bcm2836-smp";
v7_cpu0: cpu@0 {
device_type = "cpu";
diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
index c72a27d908b6..20725ca487f3 100644
--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
@@ -1 +1,51 @@
-#include "arm64/broadcom/bcm2837-rpi-3-b.dts"
+/dts-v1/;
+#include "bcm2837.dtsi"
+#include "bcm2835-rpi.dtsi"
+#include "bcm283x-rpi-smsc9514.dtsi"
+#include "bcm283x-rpi-usb-host.dtsi"
+
+/ {
+ compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
+ model = "Raspberry Pi 3 Model B";
+
+ memory {
+ reg = <0 0x40000000>;
+ };
+
+ leds {
+ act {
+ gpios = <&gpio 47 0>;
+ };
+ };
+};
+
+/* uart0 communicates with the BT module */
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio32 &gpclk2_gpio43>;
+ status = "okay";
+};
+
+/* uart1 is mapped to the pin header */
+&uart1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart1_gpio14>;
+ status = "okay";
+};
+
+/* SDHCI is used to control the SDIO for wireless */
+&sdhci {
+ pinctrl-names = "default";
+ pinctrl-0 = <&emmc_gpio34>;
+ status = "okay";
+ bus-width = <4>;
+ non-removable;
+};
+
+/* SDHOST is used to drive the SD card */
+&sdhost {
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdhost_gpio48>;
+ status = "okay";
+ bus-width = <4>;
+};
diff --git a/arch/arm64/boot/dts/broadcom/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
index 2d5de6f0f78d..bc1cca5cf43c 100644
--- a/arch/arm64/boot/dts/broadcom/bcm2837.dtsi
+++ b/arch/arm/boot/dts/bcm2837.dtsi
@@ -30,6 +30,7 @@
cpus: cpus {
#address-cells = <1>;
#size-cells = <0>;
+ enable-method = "brcm,bcm2836-smp"; // for ARM 32-bit
cpu0: cpu@0 {
device_type = "cpu";
diff --git a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
index 62e1427b3f10..8b64caabaad8 100644
--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
@@ -52,6 +52,10 @@
usb {
label = "bcm53xx:blue:usb";
gpios = <&hc595 0 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
+ <&xhci_port1>, <&ohci_port2>,
+ <&ehci_port2>;
+ linux,default-trigger = "usbport";
};
power0 {
diff --git a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
index a5647efe4118..d7c34fa72b4b 100644
--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
@@ -48,6 +48,9 @@
usb {
label = "bcm53xx:blue:usb";
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
+ <&xhci_port1>;
+ linux,default-trigger = "usbport";
};
wireless {
diff --git a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
index 19ee924d7d53..83a4c60bb431 100644
--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
@@ -42,16 +42,22 @@
usb2 {
label = "bcm53xx:white:usb2";
gpios = <&chipcommon 3 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
+ linux,default-trigger = "usbport";
};
usb3-white {
label = "bcm53xx:white:usb3";
gpios = <&chipcommon 4 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&xhci_port1>;
+ linux,default-trigger = "usbport";
};
usb3-green {
label = "bcm53xx:green:usb3";
gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
+ linux,default-trigger = "usbport";
};
wps {
diff --git a/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts b/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
index a854a5174b7f..3ed8de42cb48 100644
--- a/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
+++ b/arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
@@ -36,6 +36,8 @@
usb2-port1 {
label = "bcm53xx:green:usb2-port1";
gpios = <&chipcommon 2 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
+ linux,default-trigger = "usbport";
};
power {
@@ -67,6 +69,8 @@
usb2-port2 {
label = "bcm53xx:green:usb2-port2";
gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
+ linux,default-trigger = "usbport";
};
};
diff --git a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
index 97aa5d59a1d8..ec4a50e440f6 100644
--- a/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
+++ b/arch/arm/boot/dts/bcm4709-tplink-archer-c9-v1.dts
@@ -46,11 +46,16 @@
usb3 {
label = "bcm53xx:blue:usb3";
gpios = <&chipcommon 6 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
+ <&xhci_port1>;
+ linux,default-trigger = "usbport";
};
usb2 {
label = "bcm53xx:blue:usb2";
gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port2>, <&ehci_port2>;
+ linux,default-trigger = "usbport";
};
wan-blue {
diff --git a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
index 51b0641b5f79..7cc7d344fe5b 100644
--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
@@ -71,6 +71,9 @@
usb3-white {
label = "bcm53xx:white:usb3";
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
+ <&xhci_port1>;
+ linux,default-trigger = "usbport";
};
2ghz {
diff --git a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
index 5f8621d00c50..bc1d1e10d4ac 100644
--- a/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
+++ b/arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
@@ -59,6 +59,9 @@
usb3 {
label = "bcm53xx:green:usb3";
gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>,
+ <&xhci_port1>;
+ linux,default-trigger = "usbport";
};
status {
diff --git a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
index 34417dac1cd0..19e61b5b066c 100644
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
@@ -26,6 +26,8 @@
usb {
label = "bcm53xx:blue:usb";
gpios = <&chipcommon 1 GPIO_ACTIVE_HIGH>;
+ trigger-sources = <&ohci_port1>, <&ehci_port1>;
+ linux,default-trigger = "usbport";
};
wps {
diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
index 98647d22b291..045b9bb857f9 100644
--- a/arch/arm/boot/dts/bcm5301x.dtsi
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
@@ -272,6 +272,19 @@
reg = <0x00021000 0x1000>;
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb2_phy>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ehci_port1: port@1 {
+ reg = <1>;
+ #trigger-source-cells = <0>;
+ };
+
+ ehci_port2: port@2 {
+ reg = <2>;
+ #trigger-source-cells = <0>;
+ };
};
ohci: ohci@22000 {
@@ -280,6 +293,19 @@
compatible = "generic-ohci";
reg = <0x00022000 0x1000>;
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ohci_port1: port@1 {
+ reg = <1>;
+ #trigger-source-cells = <0>;
+ };
+
+ ohci_port2: port@2 {
+ reg = <2>;
+ #trigger-source-cells = <0>;
+ };
};
};
@@ -300,6 +326,14 @@
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb3_phy>;
phy-names = "usb";
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ xhci_port1: port@1 {
+ reg = <1>;
+ #trigger-source-cells = <0>;
+ };
};
};
diff --git a/arch/arm/boot/dts/bcm53573.dtsi b/arch/arm/boot/dts/bcm53573.dtsi
index eae623f76401..c698a565b8ae 100644
--- a/arch/arm/boot/dts/bcm53573.dtsi
+++ b/arch/arm/boot/dts/bcm53573.dtsi
@@ -138,10 +138,12 @@
ehci_port1: port@1 {
reg = <1>;
+ #trigger-source-cells = <0>;
};
ehci_port2: port@2 {
reg = <2>;
+ #trigger-source-cells = <0>;
};
};
@@ -158,10 +160,12 @@
ohci_port1: port@1 {
reg = <1>;
+ #trigger-source-cells = <0>;
};
ohci_port2: port@2 {
reg = <2>;
+ #trigger-source-cells = <0>;
};
};
};
diff --git a/arch/arm/boot/dts/bcm911360_entphn.dts b/arch/arm/boot/dts/bcm911360_entphn.dts
index 000f5f19215e..53f990defd6a 100644
--- a/arch/arm/boot/dts/bcm911360_entphn.dts
+++ b/arch/arm/boot/dts/bcm911360_entphn.dts
@@ -39,9 +39,12 @@
model = "Cygnus Enterprise Phone (BCM911360_ENTPHN)";
compatible = "brcm,bcm11360", "brcm,cygnus";
+ aliases {
+ serial0 = &uart3;
+ };
+
chosen {
- stdout-path = &uart3;
- bootargs = "console=ttyS0,115200";
+ stdout-path = "serial0:115200n8";
};
gpio_keys {
diff --git a/arch/arm/boot/dts/bcm947189acdbmr.dts b/arch/arm/boot/dts/bcm947189acdbmr.dts
new file mode 100644
index 000000000000..ef263412fea5
--- /dev/null
+++ b/arch/arm/boot/dts/bcm947189acdbmr.dts
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2017 Broadcom
+ * Author: Florian Fainelli <[email protected]>
+ *
+ * Licensed under the ISC license.
+ */
+
+/dts-v1/;
+
+#include "bcm53573.dtsi"
+
+/ {
+ compatible = "brcm,bcm947189acdbmr", "brcm,bcm47189", "brcm,bcm53573";
+ model = "Broadcom BCM947189ACDBMR";
+
+ chosen {
+ bootargs = "console=ttyS0,115200 earlycon";
+ };
+
+ memory {
+ reg = <0x00000000 0x08000000>;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ wps {
+ label = "bcm53xx:blue:wps";
+ gpios = <&chipcommon 10 GPIO_ACTIVE_HIGH>;
+ };
+
+ 5ghz {
+ label = "bcm53xx:blue:5ghz";
+ gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
+ };
+
+ 2ghz {
+ label = "bcm53xx:blue:2ghz";
+ gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+ gpio-keys {
+ compatible = "gpio-keys";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ restart {
+ label = "Reset";
+ linux,code = <KEY_RESTART>;
+ gpios = <&chipcommon 7 GPIO_ACTIVE_HIGH>;
+ };
+
+ wps {
+ label = "WPS";
+ linux,code = <KEY_WPS_BUTTON>;
+ gpios = <&chipcommon 9 GPIO_ACTIVE_LOW>;
+ };
+ };
+
+ spi {
+ compatible = "spi-gpio";
+ num-chipselects = <1>;
+ gpio-sck = <&chipcommon 21 0>;
+ gpio-miso = <&chipcommon 22 0>;
+ gpio-mosi = <&chipcommon 23 0>;
+ cs-gpios = <&chipcommon 24 0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /* External BCM6802 MoCA chip is connected */
+ };
+};
+
+&pcie0 {
+ ranges = <0x00000000 0 0 0 0 0x00100000>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+
+ bridge@0,0,0 {
+ reg = <0x0000 0 0 0 0>;
+ ranges = <0x00000000 0 0 0 0 0 0 0x00100000>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+
+ wifi@0,1,0 {
+ reg = <0x0000 0 0 0 0>;
+ ranges = <0x00000000 0 0 0 0x00100000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ };
+ };
+};
+
+&usb2 {
+ vcc-gpio = <&chipcommon 8 GPIO_ACTIVE_HIGH>;
+};
diff --git a/arch/arm/boot/dts/bcm958522er.dts b/arch/arm/boot/dts/bcm958522er.dts
index f5c42962c201..f9dd342cc2ae 100644
--- a/arch/arm/boot/dts/bcm958522er.dts
+++ b/arch/arm/boot/dts/bcm958522er.dts
@@ -170,3 +170,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958525er.dts b/arch/arm/boot/dts/bcm958525er.dts
index efcb1f67bdad..374508a9cfbf 100644
--- a/arch/arm/boot/dts/bcm958525er.dts
+++ b/arch/arm/boot/dts/bcm958525er.dts
@@ -182,3 +182,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958525xmc.dts b/arch/arm/boot/dts/bcm958525xmc.dts
index b335ce02e32f..403250c5ad8e 100644
--- a/arch/arm/boot/dts/bcm958525xmc.dts
+++ b/arch/arm/boot/dts/bcm958525xmc.dts
@@ -202,3 +202,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958622hr.dts b/arch/arm/boot/dts/bcm958622hr.dts
index 16ab2d82a14b..fd8b8c689ffe 100644
--- a/arch/arm/boot/dts/bcm958622hr.dts
+++ b/arch/arm/boot/dts/bcm958622hr.dts
@@ -219,3 +219,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958623hr.dts b/arch/arm/boot/dts/bcm958623hr.dts
index 9b921c6aa8f8..3bc50849d013 100644
--- a/arch/arm/boot/dts/bcm958623hr.dts
+++ b/arch/arm/boot/dts/bcm958623hr.dts
@@ -227,3 +227,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958625hr.dts b/arch/arm/boot/dts/bcm958625hr.dts
index 006b08e41a3b..d94d14b3c745 100644
--- a/arch/arm/boot/dts/bcm958625hr.dts
+++ b/arch/arm/boot/dts/bcm958625hr.dts
@@ -229,3 +229,11 @@
&uart0 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/bcm958625k.dts b/arch/arm/boot/dts/bcm958625k.dts
index 64740f85cf4c..2cf2392483b2 100644
--- a/arch/arm/boot/dts/bcm958625k.dts
+++ b/arch/arm/boot/dts/bcm958625k.dts
@@ -264,3 +264,11 @@
&uart1 {
status = "okay";
};
+
+&usb3_phy {
+ status = "okay";
+};
+
+&xhci {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/da850-evm.dts b/arch/arm/boot/dts/da850-evm.dts
index 67e72bc72e80..c75507922f7d 100644
--- a/arch/arm/boot/dts/da850-evm.dts
+++ b/arch/arm/boot/dts/da850-evm.dts
@@ -15,6 +15,13 @@
compatible = "ti,da850-evm", "ti,da850";
model = "DA850/AM1808/OMAP-L138 EVM";
+ aliases {
+ serial0 = &serial0;
+ serial1 = &serial1;
+ serial2 = &serial2;
+ ethernet0 = &eth0;
+ };
+
soc@1c00000 {
pmx_core: pinmux@14120 {
status = "okay";
diff --git a/arch/arm/boot/dts/da850-lego-ev3.dts b/arch/arm/boot/dts/da850-lego-ev3.dts
index 45983c04a8a7..413dbd5d9f64 100644
--- a/arch/arm/boot/dts/da850-lego-ev3.dts
+++ b/arch/arm/boot/dts/da850-lego-ev3.dts
@@ -249,6 +249,15 @@
0x4c 0x00000080 0x000000f0
>;
};
+
+ ev3_lcd_pins: pinmux_lcd {
+ pinctrl-single,bits = <
+ /* SIMO, GP2[11], GP2[12], CLK */
+ 0x14 0x00188100 0x00ffff00
+ /* GP5[0] */
+ 0x30 0x80000000 0xf0000000
+ >;
+ };
};
&pinconf {
@@ -357,6 +366,21 @@
};
};
+&spi1 {
+ status = "okay";
+ pinctrl-0 = <&ev3_lcd_pins>;
+ pinctrl-names = "default";
+ cs-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
+
+ display@0{
+ compatible = "lego,ev3-lcd";
+ reg = <0>;
+ spi-max-frequency = <10000000>;
+ a0-gpios = <&gpio 43 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&gpio 80 GPIO_ACTIVE_HIGH>;
+ };
+};
+
&ehrpwm0 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/dove-d3plug.dts b/arch/arm/boot/dts/dove-d3plug.dts
index f5f59bb5a534..e88ff83f1dec 100644
--- a/arch/arm/boot/dts/dove-d3plug.dts
+++ b/arch/arm/boot/dts/dove-d3plug.dts
@@ -88,7 +88,7 @@
&pcie {
status = "okay";
/* Fresco Logic USB3.0 xHCI controller */
- pcie-port@0 {
+ pcie@1 {
status = "okay";
reset-gpios = <&gpio0 26 1>;
reset-delay-us = <20000>;
@@ -96,7 +96,7 @@
pinctrl-names = "default";
};
/* Mini-PCIe slot */
- pcie-port@1 {
+ pcie@2 {
status = "okay";
reset-gpios = <&gpio0 25 1>;
};
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi
index 698d58cea20d..1475d3672e56 100644
--- a/arch/arm/boot/dts/dove.dtsi
+++ b/arch/arm/boot/dts/dove.dtsi
@@ -89,7 +89,7 @@
MBUS_ID(0x03, 0x01) 0 0xc8000000 0x0100000 /* CESA SRAM 1M */
MBUS_ID(0x0d, 0x00) 0 0xf0000000 0x0100000>; /* PMU SRAM 1M */
- pcie: pcie-controller {
+ pcie: pcie {
compatible = "marvell,dove-pcie";
status = "disabled";
device_type = "pci";
@@ -106,7 +106,7 @@
0x82000000 0x2 0x0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 Mem */
0x81000000 0x2 0x0 MBUS_ID(0x08, 0xe0) 0 1 0>; /* Port 1.0 I/O */
- pcie0: pcie-port@0 {
+ pcie0: pcie@1 {
device_type = "pci";
status = "disabled";
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
@@ -118,13 +118,14 @@
#size-cells = <2>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 16>;
};
- pcie1: pcie-port@1 {
+ pcie1: pcie@2 {
device_type = "pci";
status = "disabled";
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
@@ -136,6 +137,7 @@
#size-cells = <2>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0>;
diff --git a/arch/arm/boot/dts/dra7-evm-common.dtsi b/arch/arm/boot/dts/dra7-evm-common.dtsi
new file mode 100644
index 000000000000..343e95f9a001
--- /dev/null
+++ b/arch/arm/boot/dts/dra7-evm-common.dtsi
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clk/ti-dra7-atl.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ chosen {
+ stdout-path = &uart1;
+ };
+
+ extcon_usb1: extcon_usb1 {
+ compatible = "linux,extcon-usb-gpio";
+ id-gpio = <&pcf_gpio_21 1 GPIO_ACTIVE_HIGH>;
+ };
+
+ sound0: sound0 {
+ compatible = "simple-audio-card";
+ simple-audio-card,name = "DRA7xx-EVM";
+ simple-audio-card,widgets =
+ "Headphone", "Headphone Jack",
+ "Line", "Line Out",
+ "Microphone", "Mic Jack",
+ "Line", "Line In";
+ simple-audio-card,routing =
+ "Headphone Jack", "HPLOUT",
+ "Headphone Jack", "HPROUT",
+ "Line Out", "LLOUT",
+ "Line Out", "RLOUT",
+ "MIC3L", "Mic Jack",
+ "MIC3R", "Mic Jack",
+ "Mic Jack", "Mic Bias",
+ "LINE1L", "Line In",
+ "LINE1R", "Line In";
+ simple-audio-card,format = "dsp_b";
+ simple-audio-card,bitclock-master = <&sound0_master>;
+ simple-audio-card,frame-master = <&sound0_master>;
+ simple-audio-card,bitclock-inversion;
+
+ sound0_master: simple-audio-card,cpu {
+ sound-dai = <&mcasp3>;
+ system-clock-frequency = <5644800>;
+ };
+
+ simple-audio-card,codec {
+ sound-dai = <&tlv320aic3106>;
+ clocks = <&atl_clkin2_ck>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ led0 {
+ label = "dra7:usr1";
+ gpios = <&pcf_lcd 4 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+
+ led1 {
+ label = "dra7:usr2";
+ gpios = <&pcf_lcd 5 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+
+ led2 {
+ label = "dra7:usr3";
+ gpios = <&pcf_lcd 6 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+
+ led3 {
+ label = "dra7:usr4";
+ gpios = <&pcf_lcd 7 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ autorepeat;
+
+ USER1 {
+ label = "btnUser1";
+ linux,code = <BTN_0>;
+ gpios = <&pcf_lcd 2 GPIO_ACTIVE_LOW>;
+ };
+
+ USER2 {
+ label = "btnUser2";
+ linux,code = <BTN_1>;
+ gpios = <&pcf_lcd 3 GPIO_ACTIVE_LOW>;
+ };
+ };
+};
+
+&i2c3 {
+ status = "okay";
+ clock-frequency = <400000>;
+};
+
+&mcspi1 {
+ status = "okay";
+};
+
+&mcspi2 {
+ status = "okay";
+};
+
+&uart1 {
+ status = "okay";
+ interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+ <&dra7_pmx_core 0x3e0>;
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&uart3 {
+ status = "okay";
+};
+
+&qspi {
+ status = "okay";
+
+ spi-max-frequency = <76800000>;
+ m25p80@0 {
+ compatible = "s25fl256s1";
+ spi-max-frequency = <76800000>;
+ reg = <0>;
+ spi-tx-bus-width = <1>;
+ spi-rx-bus-width = <4>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* MTD partition table.
+ * The ROM checks the first four physical blocks
+ * for a valid file to boot and the flash here is
+ * 64KiB block size.
+ */
+ partition@0 {
+ label = "QSPI.SPL";
+ reg = <0x00000000 0x000010000>;
+ };
+ partition@1 {
+ label = "QSPI.SPL.backup1";
+ reg = <0x00010000 0x00010000>;
+ };
+ partition@2 {
+ label = "QSPI.SPL.backup2";
+ reg = <0x00020000 0x00010000>;
+ };
+ partition@3 {
+ label = "QSPI.SPL.backup3";
+ reg = <0x00030000 0x00010000>;
+ };
+ partition@4 {
+ label = "QSPI.u-boot";
+ reg = <0x00040000 0x00100000>;
+ };
+ partition@5 {
+ label = "QSPI.u-boot-spl-os";
+ reg = <0x00140000 0x00080000>;
+ };
+ partition@6 {
+ label = "QSPI.u-boot-env";
+ reg = <0x001c0000 0x00010000>;
+ };
+ partition@7 {
+ label = "QSPI.u-boot-env.backup1";
+ reg = <0x001d0000 0x0010000>;
+ };
+ partition@8 {
+ label = "QSPI.kernel";
+ reg = <0x001e0000 0x0800000>;
+ };
+ partition@9 {
+ label = "QSPI.file-system";
+ reg = <0x009e0000 0x01620000>;
+ };
+ };
+};
+
+&omap_dwc3_1 {
+ extcon = <&extcon_usb1>;
+};
+
+&usb1 {
+ dr_mode = "otg";
+ extcon = <&extcon_usb1>;
+};
+
+&usb2 {
+ dr_mode = "host";
+};
+
+&atl {
+ assigned-clocks = <&abe_dpll_sys_clk_mux>,
+ <&atl_gfclk_mux>,
+ <&dpll_abe_ck>,
+ <&dpll_abe_m2x2_ck>,
+ <&atl_clkin2_ck>;
+ assigned-clock-parents = <&sys_clkin2>, <&dpll_abe_m2_ck>;
+ assigned-clock-rates = <0>, <0>, <180633600>, <361267200>, <5644800>;
+
+ status = "okay";
+
+ atl2 {
+ bws = <DRA7_ATL_WS_MCASP2_FSX>;
+ aws = <DRA7_ATL_WS_MCASP3_FSX>;
+ };
+};
+
+&mcasp3 {
+ #sound-dai-cells = <0>;
+
+ assigned-clocks = <&mcasp3_ahclkx_mux>;
+ assigned-clock-parents = <&atl_clkin2_ck>;
+
+ status = "okay";
+
+ op-mode = <0>; /* MCASP_IIS_MODE */
+ tdm-slots = <2>;
+ /* 4 serializer */
+ serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
+ 1 2 0 0
+ >;
+ tx-num-evt = <32>;
+ rx-num-evt = <32>;
+};
+
+&mailbox5 {
+ status = "okay";
+ mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+ status = "okay";
+ };
+ mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+ status = "okay";
+ };
+};
+
+&mailbox6 {
+ status = "okay";
+ mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+ status = "okay";
+ };
+ mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+ status = "okay";
+ };
+};
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
index f47fc4daf062..aa426dabb6c3 100644
--- a/arch/arm/boot/dts/dra7-evm.dts
+++ b/arch/arm/boot/dts/dra7-evm.dts
@@ -8,9 +8,8 @@
/dts-v1/;
#include "dra74x.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/clk/ti-dra7-atl.h>
-#include <dt-bindings/input/input.h>
+#include "dra7-evm-common.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
/ {
model = "TI DRA742";
@@ -21,8 +20,12 @@
reg = <0x0 0x80000000 0x0 0x60000000>; /* 1536 MB */
};
- chosen {
- stdout-path = &uart1;
+ evm_1v8_sw: fixedregulator-evm_1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "evm_1v8";
+ vin-supply = <&smps9_reg>;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
};
evm_3v3_sd: fixedregulator-sd {
@@ -51,11 +54,6 @@
regulator-max-microvolt = <1800000>;
};
- extcon_usb1: extcon_usb1 {
- compatible = "linux,extcon-usb-gpio";
- id-gpio = <&pcf_gpio_21 1 GPIO_ACTIVE_HIGH>;
- };
-
extcon_usb2: extcon_usb2 {
compatible = "linux,extcon-usb-gpio";
id-gpio = <&pcf_gpio_21 2 GPIO_ACTIVE_HIGH>;
@@ -73,85 +71,6 @@
gpio = <&gpio7 11 GPIO_ACTIVE_HIGH>;
};
- sound0: sound0 {
- compatible = "simple-audio-card";
- simple-audio-card,name = "DRA7xx-EVM";
- simple-audio-card,widgets =
- "Headphone", "Headphone Jack",
- "Line", "Line Out",
- "Microphone", "Mic Jack",
- "Line", "Line In";
- simple-audio-card,routing =
- "Headphone Jack", "HPLOUT",
- "Headphone Jack", "HPROUT",
- "Line Out", "LLOUT",
- "Line Out", "RLOUT",
- "MIC3L", "Mic Jack",
- "MIC3R", "Mic Jack",
- "Mic Jack", "Mic Bias",
- "LINE1L", "Line In",
- "LINE1R", "Line In";
- simple-audio-card,format = "dsp_b";
- simple-audio-card,bitclock-master = <&sound0_master>;
- simple-audio-card,frame-master = <&sound0_master>;
- simple-audio-card,bitclock-inversion;
-
- sound0_master: simple-audio-card,cpu {
- sound-dai = <&mcasp3>;
- system-clock-frequency = <5644800>;
- };
-
- simple-audio-card,codec {
- sound-dai = <&tlv320aic3106>;
- clocks = <&atl_clkin2_ck>;
- };
- };
-
- leds {
- compatible = "gpio-leds";
- led0 {
- label = "dra7:usr1";
- gpios = <&pcf_lcd 4 GPIO_ACTIVE_LOW>;
- default-state = "off";
- };
-
- led1 {
- label = "dra7:usr2";
- gpios = <&pcf_lcd 5 GPIO_ACTIVE_LOW>;
- default-state = "off";
- };
-
- led2 {
- label = "dra7:usr3";
- gpios = <&pcf_lcd 6 GPIO_ACTIVE_LOW>;
- default-state = "off";
- };
-
- led3 {
- label = "dra7:usr4";
- gpios = <&pcf_lcd 7 GPIO_ACTIVE_LOW>;
- default-state = "off";
- };
- };
-
- gpio_keys {
- compatible = "gpio-keys";
- #address-cells = <1>;
- #size-cells = <0>;
- autorepeat;
-
- USER1 {
- label = "btnUser1";
- linux,code = <BTN_0>;
- gpios = <&pcf_lcd 2 GPIO_ACTIVE_LOW>;
- };
-
- USER2 {
- label = "btnUser2";
- linux,code = <BTN_1>;
- gpios = <&pcf_lcd 3 GPIO_ACTIVE_LOW>;
- };
- };
};
&dra7_pmx_core {
@@ -406,137 +325,49 @@
};
};
-&i2c3 {
- status = "okay";
- clock-frequency = <400000>;
-};
-
-&mcspi1 {
- status = "okay";
-};
-
-&mcspi2 {
- status = "okay";
-};
-
-&uart1 {
- status = "okay";
- interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
- <&dra7_pmx_core 0x3e0>;
-};
-
-&uart2 {
- status = "okay";
-};
-
-&uart3 {
- status = "okay";
-};
-
&mmc1 {
status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&mmc1_pins_default>;
vmmc-supply = <&evm_3v3_sd>;
- vmmc_aux-supply = <&ldo1_reg>;
+ vqmmc-supply = <&ldo1_reg>;
bus-width = <4>;
/*
* SDCD signal is not being used here - using the fact that GPIO mode
* is always hardwired.
*/
cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50-rev11", "sdr104-rev11", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev11_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev11_conf>;
+ pinctrl-7 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+ pinctrl-8 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
};
&mmc2 {
status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&mmc2_pins_default>;
- vmmc-supply = <&evm_3v3_sw>;
+ vmmc-supply = <&evm_1v8_sw>;
bus-width = <8>;
+ pinctrl-names = "default", "hs", "ddr_1_8v-rev11", "ddr_1_8v", "hs200_1_8v-rev11", "hs200_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_1_8v_rev11 &mmc2_iodelay_ddr_1_8v_rev11_conf>;
+ pinctrl-3 = <&mmc2_pins_ddr_rev20>;
+ pinctrl-4 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev11_conf>;
+ pinctrl-5 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
};
&cpu0 {
cpu0-supply = <&smps123_reg>;
};
-&qspi {
- status = "okay";
-
- spi-max-frequency = <76800000>;
- m25p80@0 {
- compatible = "s25fl256s1";
- spi-max-frequency = <76800000>;
- reg = <0>;
- spi-tx-bus-width = <1>;
- spi-rx-bus-width = <4>;
- #address-cells = <1>;
- #size-cells = <1>;
-
- /* MTD partition table.
- * The ROM checks the first four physical blocks
- * for a valid file to boot and the flash here is
- * 64KiB block size.
- */
- partition@0 {
- label = "QSPI.SPL";
- reg = <0x00000000 0x000010000>;
- };
- partition@1 {
- label = "QSPI.SPL.backup1";
- reg = <0x00010000 0x00010000>;
- };
- partition@2 {
- label = "QSPI.SPL.backup2";
- reg = <0x00020000 0x00010000>;
- };
- partition@3 {
- label = "QSPI.SPL.backup3";
- reg = <0x00030000 0x00010000>;
- };
- partition@4 {
- label = "QSPI.u-boot";
- reg = <0x00040000 0x00100000>;
- };
- partition@5 {
- label = "QSPI.u-boot-spl-os";
- reg = <0x00140000 0x00080000>;
- };
- partition@6 {
- label = "QSPI.u-boot-env";
- reg = <0x001c0000 0x00010000>;
- };
- partition@7 {
- label = "QSPI.u-boot-env.backup1";
- reg = <0x001d0000 0x0010000>;
- };
- partition@8 {
- label = "QSPI.kernel";
- reg = <0x001e0000 0x0800000>;
- };
- partition@9 {
- label = "QSPI.file-system";
- reg = <0x009e0000 0x01620000>;
- };
- };
-};
-
-&omap_dwc3_1 {
- extcon = <&extcon_usb1>;
-};
-
&omap_dwc3_2 {
extcon = <&extcon_usb2>;
};
-&usb1 {
- dr_mode = "otg";
- extcon = <&extcon_usb1>;
-};
-
-&usb2 {
- dr_mode = "host";
-};
-
&elm {
status = "okay";
};
@@ -556,6 +387,7 @@
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
<1 IRQ_TYPE_NONE>; /* termcount */
rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 pin */
+ ti,nand-xfer-type = "prefetch-dma";
ti,nand-ecc-opt = "bch8";
ti,elm-id = <&elm>;
nand-bus-width = <16>;
@@ -666,57 +498,6 @@
pinctrl-2 = <&dcan1_pins_default>;
};
-&atl {
- assigned-clocks = <&abe_dpll_sys_clk_mux>,
- <&atl_gfclk_mux>,
- <&dpll_abe_ck>,
- <&dpll_abe_m2x2_ck>,
- <&atl_clkin2_ck>;
- assigned-clock-parents = <&sys_clkin2>, <&dpll_abe_m2_ck>;
- assigned-clock-rates = <0>, <0>, <180633600>, <361267200>, <5644800>;
-
- status = "okay";
-
- atl2 {
- bws = <DRA7_ATL_WS_MCASP2_FSX>;
- aws = <DRA7_ATL_WS_MCASP3_FSX>;
- };
-};
-
-&mcasp3 {
- #sound-dai-cells = <0>;
-
- assigned-clocks = <&mcasp3_ahclkx_mux>;
- assigned-clock-parents = <&atl_clkin2_ck>;
-
- status = "okay";
-
- op-mode = <0>; /* MCASP_IIS_MODE */
- tdm-slots = <2>;
- /* 4 serializer */
- serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
- 1 2 0 0
- >;
- tx-num-evt = <32>;
- rx-num-evt = <32>;
-};
-
-&mailbox5 {
+&pcie1_rc {
status = "okay";
- mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
- status = "okay";
- };
- mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
- status = "okay";
- };
-};
-
-&mailbox6 {
- status = "okay";
- mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
- status = "okay";
- };
- mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
- status = "okay";
- };
};
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index 0f0f6f58bd18..02a136a4661a 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -196,6 +196,7 @@
scm_conf1: scm_conf@1c04 {
compatible = "syscon";
reg = <0x1c04 0x0020>;
+ #syscon-cells = <2>;
};
scm_conf_pcie: scm_conf@1c24 {
@@ -287,7 +288,11 @@
#address-cells = <1>;
ranges = <0x51000000 0x51000000 0x3000
0x0 0x20000000 0x10000000>;
- pcie1: pcie@51000000 {
+ /**
+ * To enable PCI endpoint mode, disable the pcie1_rc
+ * node and enable pcie1_ep mode.
+ */
+ pcie1_rc: pcie@51000000 {
compatible = "ti,dra7-pcie";
reg = <0x51000000 0x2000>, <0x51002000 0x14c>, <0x1000 0x2000>;
reg-names = "rc_dbics", "ti_conf", "config";
@@ -309,12 +314,28 @@
<0 0 0 2 &pcie1_intc 2>,
<0 0 0 3 &pcie1_intc 3>,
<0 0 0 4 &pcie1_intc 4>;
+ status = "disabled";
pcie1_intc: interrupt-controller {
interrupt-controller;
#address-cells = <0>;
#interrupt-cells = <1>;
};
};
+
+ pcie1_ep: pcie_ep@51000000 {
+ compatible = "ti,dra7-pcie-ep";
+ reg = <0x51000000 0x28>, <0x51002000 0x14c>, <0x51001000 0x28>, <0x1000 0x10000000>;
+ reg-names = "ep_dbics", "ti_conf", "ep_dbics2", "addr_space";
+ interrupts = <0 232 0x4>;
+ num-lanes = <1>;
+ num-ib-windows = <4>;
+ num-ob-windows = <16>;
+ ti,hwmods = "pcie1";
+ phys = <&pcie1_phy>;
+ phy-names = "pcie-phy0";
+ ti,syscon-unaligned-access = <&scm_conf1 0x14 2>;
+ status = "disabled";
+ };
};
axi@1 {
@@ -418,6 +439,14 @@
reg = <0x40d00000 0x100>;
};
+ dra7_iodelay_core: padconf@4844a000 {
+ compatible = "ti,dra7-iodelay";
+ reg = <0x4844a000 0x0d1c>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ #pinctrl-cells = <2>;
+ };
+
sdma: dma-controller@4a056000 {
compatible = "ti,omap4430-sdma";
reg = <0x4a056000 0x1000>;
@@ -1037,6 +1066,7 @@
dma-names = "tx", "rx";
status = "disabled";
pbias-supply = <&pbias_mmc_reg>;
+ max-frequency = <192000000>;
};
mmc2: mmc@480b4000 {
@@ -1048,6 +1078,7 @@
dmas = <&sdma_xbar 47>, <&sdma_xbar 48>;
dma-names = "tx", "rx";
status = "disabled";
+ max-frequency = <192000000>;
};
mmc3: mmc@480ad000 {
@@ -1059,6 +1090,8 @@
dmas = <&sdma_xbar 77>, <&sdma_xbar 78>;
dma-names = "tx", "rx";
status = "disabled";
+ /* Errata i887 limits max-frequency of MMC3 to 64 MHz */
+ max-frequency = <64000000>;
};
mmc4: mmc@480d1000 {
@@ -1070,6 +1103,7 @@
dmas = <&sdma_xbar 57>, <&sdma_xbar 58>;
dma-names = "tx", "rx";
status = "disabled";
+ max-frequency = <192000000>;
};
mmu0_dsp1: mmu@40d01000 {
diff --git a/arch/arm/boot/dts/dra71-evm.dts b/arch/arm/boot/dts/dra71-evm.dts
index a6298eb56978..41c9132eb550 100644
--- a/arch/arm/boot/dts/dra71-evm.dts
+++ b/arch/arm/boot/dts/dra71-evm.dts
@@ -7,6 +7,7 @@
*/
#include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
#include <dt-bindings/net/ti-dp83867.h>
/ {
@@ -32,6 +33,16 @@
3000000 0x1>;
};
+ evm_1v8_sw: fixedregulator-evm_1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "evm_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ vin-supply = <&lp8732_buck0_reg>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
poweroff: gpio-poweroff {
compatible = "gpio-poweroff";
gpios = <&gpio7 30 GPIO_ACTIVE_HIGH>;
@@ -162,7 +173,24 @@
};
&mmc1 {
- vmmc_aux-supply = <&vpo_sd_1v8_3v3>;
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+ vqmmc-supply = <&vpo_sd_1v8_3v3>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
+ pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
+ vmmc-supply = <&evm_1v8_sw>;
};
&mac {
@@ -191,6 +219,7 @@
ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
ti,min-output-impedance;
+ ti,dp83867-rxctrl-strap-quirk;
};
dp83867_1: ethernet-phy@3 {
@@ -199,6 +228,7 @@
ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
ti,min-output-impedance;
+ ti,dp83867-rxctrl-strap-quirk;
};
};
diff --git a/arch/arm/boot/dts/dra72-evm-common.dtsi b/arch/arm/boot/dts/dra72-evm-common.dtsi
index 85780549bc26..2e485a13dfd7 100644
--- a/arch/arm/boot/dts/dra72-evm-common.dtsi
+++ b/arch/arm/boot/dts/dra72-evm-common.dtsi
@@ -311,6 +311,7 @@
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
<1 IRQ_TYPE_NONE>; /* termcount */
rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 pin */
+ ti,nand-xfer-type = "prefetch-dma";
ti,nand-ecc-opt = "bch8";
ti,elm-id = <&elm>;
nand-bus-width = <16>;
@@ -419,8 +420,6 @@
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins_default>;
-
- vmmc-supply = <&evm_3v3_sw>;
bus-width = <8>;
ti,non-removable;
max-frequency = <192000000>;
@@ -564,3 +563,7 @@
status = "okay";
};
};
+
+&pcie1_rc {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/dra72-evm-revc.dts b/arch/arm/boot/dts/dra72-evm-revc.dts
index 3ecac56bf504..bf588d00728d 100644
--- a/arch/arm/boot/dts/dra72-evm-revc.dts
+++ b/arch/arm/boot/dts/dra72-evm-revc.dts
@@ -6,6 +6,7 @@
* published by the Free Software Foundation.
*/
#include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
#include <dt-bindings/net/ti-dp83867.h>
/ {
@@ -15,6 +16,16 @@
device_type = "memory";
reg = <0x0 0x80000000 0x0 0x80000000>; /* 2GB */
};
+
+ evm_1v8_sw: fixedregulator-evm_1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "evm_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ vin-supply = <&smps4_reg>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
&i2c1 {
@@ -70,6 +81,7 @@
ti,min-output-impedance;
interrupt-parent = <&gpio6>;
interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+ ti,dp83867-rxctrl-strap-quirk;
};
dp83867_1: ethernet-phy@3 {
@@ -80,5 +92,27 @@
ti,min-output-impedance;
interrupt-parent = <&gpio6>;
interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+ ti,dp83867-rxctrl-strap-quirk;
};
};
+
+&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+ vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
+ pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
+ vmmc-supply = <&evm_1v8_sw>;
+};
diff --git a/arch/arm/boot/dts/dra72-evm-tps65917.dtsi b/arch/arm/boot/dts/dra72-evm-tps65917.dtsi
index e6df676886c0..57bfe5caf5e4 100644
--- a/arch/arm/boot/dts/dra72-evm-tps65917.dtsi
+++ b/arch/arm/boot/dts/dra72-evm-tps65917.dtsi
@@ -146,5 +146,5 @@
};
&mmc1 {
- vmmc_aux-supply = <&ldo1_reg>;
+ vqmmc-supply = <&ldo1_reg>;
};
diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts
index cd9c4ff12654..c572693b1665 100644
--- a/arch/arm/boot/dts/dra72-evm.dts
+++ b/arch/arm/boot/dts/dra72-evm.dts
@@ -6,6 +6,7 @@
* published by the Free Software Foundation.
*/
#include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
/ {
model = "TI DRA722";
@@ -13,6 +14,16 @@
device_type = "memory";
reg = <0x0 0x80000000 0x0 0x40000000>; /* 1024 MB */
};
+
+ evm_1v8_sw: fixedregulator-evm_1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "evm_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ vin-supply = <&smps4_reg>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
&i2c1 {
@@ -43,3 +54,24 @@
phy_id = <&davinci_mdio>, <3>;
phy-mode = "rgmii";
};
+
+&mmc1 {
+ pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_hs>;
+ pinctrl-2 = <&mmc1_pins_sdr12>;
+ pinctrl-3 = <&mmc1_pins_sdr25>;
+ pinctrl-4 = <&mmc1_pins_sdr50>;
+ pinctrl-5 = <&mmc1_pins_ddr50_rev10>;
+ pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev10_conf>;
+ vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+ pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+ pinctrl-0 = <&mmc2_pins_default>;
+ pinctrl-1 = <&mmc2_pins_hs>;
+ pinctrl-2 = <&mmc2_pins_ddr_rev10>;
+ pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev10_conf>;
+ vmmc-supply = <&evm_1v8_sw>;
+};
diff --git a/arch/arm/boot/dts/dra72x-mmc-iodelay.dtsi b/arch/arm/boot/dts/dra72x-mmc-iodelay.dtsi
new file mode 100644
index 000000000000..088013c6dc6e
--- /dev/null
+++ b/arch/arm/boot/dts/dra72x-mmc-iodelay.dtsi
@@ -0,0 +1,350 @@
+/*
+ * MMC IOdelay values for TI's DRA72x, DRA71x and AM571x SoCs.
+ *
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * Rules for modifying this file:
+ * a) Update of this file should typically correspond to a datamanual revision.
+ * Datamanual revision that was used should be updated in comment below.
+ * If there is no update to datamanual, do not update the values. If you
+ * need to use values different from that recommended by the datamanual
+ * for your design, then you should consider adding values to the device-
+ * -tree file for your board directly.
+ * b) We keep the mode names as close to the datamanual as possible. So
+ * if the manual calls a mode, DDR50, or DDR or DDR 1.8v or DDR 3.3v,
+ * we follow that in code too.
+ * c) If the values change between multiple revisions of silicon, we add
+ * a revision tag to both the new and old entry. Use 'rev10' for PG 1.0,
+ * 'rev20' for PG 2.0 and so on.
+ * d) The node name and node label should be the exact same string. This is
+ * to curb naming creativity and achieve consistency.
+ * e) If in future, DRA71x and DRA72x values differ, then add 'dra71_' and
+ * 'dra72_' tag to entries. Both the new and old entries should gain a tag.
+ *
+ * Datamanual Revisions:
+ *
+ * AM571x Silicon Revision 2.0: SPRS957D, Revised January 2017
+ * AM571x Silicon Revision 1.0: SPRS919M, Revised November 2017
+ * DRA71x : SPRS960B, Revised February 2017
+ */
+
+&dra7_pmx_core {
+ mmc1_pins_default: mmc1_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr12: mmc1_pins_sdr12 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_hs: mmc1_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr25: mmc1_pins_sdr25 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr50: mmc1_pins_sdr50 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_ddr50_rev10: mmc1_pins_ddr50_rev10 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_clk.mmc1_clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_cmd.mmc1_cmd */
+ DRA7XX_CORE_IOPAD(0x375C, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_dat0.mmc1_dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_dat1.mmc1_dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_dat2.mmc1_dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0) /* mmc1_dat3.mmc1_dat3 */
+ >;
+ };
+
+ mmc1_pins_ddr50_rev20: mmc1_pins_ddr50_rev20 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr104: mmc1_pins_sdr104 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc2_pins_default: mmc2_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_hs: mmc2_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_ddr_rev10: mmc2_pins_ddr_rev10 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ >;
+ };
+
+ mmc2_pins_ddr_rev20: mmc2_pins_ddr_rev20 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_hs200: mmc2_pins_hs200 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+};
+
+&dra7_iodelay_core {
+
+ /* Corresponds to MMC1_MANUAL1 in datamanual */
+ mmc1_iodelay_ddr50_conf: mmc1_iodelay_ddr50_conf {
+ pinctrl-pin-array = <
+ 0x618 A_DELAY_PS(588) G_DELAY_PS(0) /* CFG_MMC1_CLK_IN */
+ 0x624 A_DELAY_PS(1000) G_DELAY_PS(0) /* CFG_MMC1_CMD_IN */
+ 0x630 A_DELAY_PS(1375) G_DELAY_PS(0) /* CFG_MMC1_DAT0_IN */
+ 0x63C A_DELAY_PS(1000) G_DELAY_PS(0) /* CFG_MMC1_DAT1_IN */
+ 0x648 A_DELAY_PS(1000) G_DELAY_PS(0) /* CFG_MMC1_DAT2_IN */
+ 0x654 A_DELAY_PS(1000) G_DELAY_PS(0) /* CFG_MMC1_DAT3_IN */
+ 0x620 A_DELAY_PS(1230) G_DELAY_PS(0) /* CFG_MMC1_CLK_OUT */
+ 0x62C A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x638 A_DELAY_PS(56) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x644 A_DELAY_PS(76) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x650 A_DELAY_PS(91) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x65C A_DELAY_PS(99) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ 0x628 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x640 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x64C A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x658 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ >;
+ };
+
+ /* Corresponds to MMC1_MANUAL2 in datamanual */
+ mmc1_iodelay_sdr104_rev10_conf: mmc1_iodelay_sdr104_rev10_conf {
+ pinctrl-pin-array = <
+ 0x620 A_DELAY_PS(560) G_DELAY_PS(365) /* CFG_MMC1_CLK_OUT */
+ 0x62c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x638 A_DELAY_PS(29) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x644 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x650 A_DELAY_PS(47) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x65c A_DELAY_PS(30) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ 0x628 A_DELAY_PS(125) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x634 A_DELAY_PS(43) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x640 A_DELAY_PS(433) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x64c A_DELAY_PS(287) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x658 A_DELAY_PS(351) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ >;
+ };
+
+ /* Corresponds to MMC1_MANUAL2 in datamanual */
+ mmc1_iodelay_sdr104_rev20_conf: mmc1_iodelay_sdr104_rev20_conf {
+ pinctrl-pin-array = <
+ 0x620 A_DELAY_PS(520) G_DELAY_PS(320) /* CFG_MMC1_CLK_OUT */
+ 0x62c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x638 A_DELAY_PS(40) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x644 A_DELAY_PS(83) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x650 A_DELAY_PS(98) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x65c A_DELAY_PS(106) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ 0x628 A_DELAY_PS(51) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x640 A_DELAY_PS(363) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x64c A_DELAY_PS(199) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x658 A_DELAY_PS(273) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ >;
+ };
+
+ /* Corresponds to MMC2_MANUAL1 in datamanual */
+ mmc2_iodelay_ddr_conf: mmc2_iodelay_ddr_conf {
+ pinctrl-pin-array = <
+ 0x18c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_IN */
+ 0x1a4 A_DELAY_PS(119) G_DELAY_PS(0) /* CFG_GPMC_A20_IN */
+ 0x1b0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A21_IN */
+ 0x1bc A_DELAY_PS(18) G_DELAY_PS(0) /* CFG_GPMC_A22_IN */
+ 0x1c8 A_DELAY_PS(894) G_DELAY_PS(0) /* CFG_GPMC_A23_IN */
+ 0x1d4 A_DELAY_PS(30) G_DELAY_PS(0) /* CFG_GPMC_A24_IN */
+ 0x1e0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_IN */
+ 0x1ec A_DELAY_PS(23) G_DELAY_PS(0) /* CFG_GPMC_A26_IN */
+ 0x1f8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_IN */
+ 0x360 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_IN */
+ 0x194 A_DELAY_PS(152) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1ac A_DELAY_PS(206) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b8 A_DELAY_PS(78) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1c4 A_DELAY_PS(2) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1d0 A_DELAY_PS(266) G_DELAY_PS(0) /* CFG_GPMC_A23_OUT */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1f4 A_DELAY_PS(43) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x200 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x368 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ 0x190 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x1a8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1b4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1c0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1d8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1e4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1f0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1fc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x364 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ >;
+ };
+
+ /* Corresponds to MMC2_MANUAL3 in datamanual */
+ mmc2_iodelay_hs200_rev10_conf: mmc2_iodelay_hs200_rev10_conf {
+ pinctrl-pin-array = <
+ 0x194 A_DELAY_PS(150) G_DELAY_PS(95) /* CFG_GPMC_A19_OUT */
+ 0x1ac A_DELAY_PS(250) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b8 A_DELAY_PS(125) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1c4 A_DELAY_PS(100) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1d0 A_DELAY_PS(870) G_DELAY_PS(415) /* CFG_GPMC_A23_OUT */
+ 0x1dc A_DELAY_PS(30) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e8 A_DELAY_PS(200) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1f4 A_DELAY_PS(200) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x200 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x368 A_DELAY_PS(240) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ 0x190 A_DELAY_PS(695) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x1a8 A_DELAY_PS(924) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1b4 A_DELAY_PS(719) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1c0 A_DELAY_PS(824) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1d8 A_DELAY_PS(877) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1e4 A_DELAY_PS(446) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1f0 A_DELAY_PS(847) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1fc A_DELAY_PS(586) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x364 A_DELAY_PS(1039) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ >;
+ };
+
+ /* Corresponds to MMC2_MANUAL3 in datamanual */
+ mmc2_iodelay_hs200_rev20_conf: mmc2_iodelay_hs200_rev20_conf {
+ pinctrl-pin-array = <
+ 0x194 A_DELAY_PS(285) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1ac A_DELAY_PS(189) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b8 A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A21_OUT */
+ 0x1c4 A_DELAY_PS(0) G_DELAY_PS(70) /* CFG_GPMC_A22_OUT */
+ 0x1d0 A_DELAY_PS(730) G_DELAY_PS(360) /* CFG_GPMC_A23_OUT */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1f4 A_DELAY_PS(70) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x200 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x368 A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_CS1_OUT */
+ 0x190 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x1a8 A_DELAY_PS(231) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1b4 A_DELAY_PS(39) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1c0 A_DELAY_PS(91) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1d8 A_DELAY_PS(176) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1e4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1f0 A_DELAY_PS(101) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1fc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x364 A_DELAY_PS(360) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi b/arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi
new file mode 100644
index 000000000000..28ebb4eb884a
--- /dev/null
+++ b/arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi
@@ -0,0 +1,647 @@
+/*
+ * MMC IOdelay values for TI's DRA74x, DRA75x and AM572x SoCs.
+ *
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * Rules for modifying this file:
+ * a) Update of this file should typically correspond to a datamanual revision.
+ * Datamanual revision that was used should be updated in comment below.
+ * If there is no update to datamanual, do not update the values. If you
+ * need to use values different from that recommended by the datamanual
+ * for your design, then you should consider adding values to the device-
+ * -tree file for your board directly.
+ * b) We keep the mode names as close to the datamanual as possible. So
+ * if the manual calls a mode, DDR50, or DDR or DDR 1.8v or DDR 3.3v,
+ * we follow that in code too.
+ * c) If the values change between multiple revisions of silicon, we add
+ * a revision tag to both the new and old entry. Use 'rev11' for PG 1.1,
+ * 'rev20' for PG 2.0 and so on.
+ * d) The node name and node label should be the exact same string. This is
+ * to curb naming creativity and achieve consistency.
+ *
+ * Datamanual Revisions:
+ *
+ * AM572x Silicon Revision 2.0: SPRS953B, Revised November 2016
+ * AM572x Silicon Revision 1.1: SPRS915R, Revised November 2016
+ *
+ */
+
+&dra7_pmx_core {
+ mmc1_pins_default: mmc1_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr12: mmc1_pins_sdr12 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_hs: mmc1_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr25: mmc1_pins_sdr25 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr50: mmc1_pins_sdr50 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_ddr50: mmc1_pins_ddr50 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr104: mmc1_pins_sdr104 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc2_pins_default: mmc2_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_hs: mmc2_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_ddr_3_3v_rev11: mmc2_pins_ddr_3_3v_rev11 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_ddr_1_8v_rev11: mmc2_pins_ddr_1_8v_rev11 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_ddr_rev20: mmc2_pins_ddr_rev20 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc2_pins_hs200: mmc2_pins_hs200 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+
+ mmc4_pins_default: mmc4_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+ DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+ DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+ DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+ DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+ DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+ >;
+ };
+
+ mmc4_pins_hs: mmc4_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+ DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+ DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+ DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+ DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+ DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+ >;
+ };
+
+ mmc3_pins_default: mmc3_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+ DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+ DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+ DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+ DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+ DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+ >;
+ };
+
+ mmc3_pins_hs: mmc3_pins_hs {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+ DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+ DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+ DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+ DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+ DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+ >;
+ };
+
+ mmc3_pins_sdr12: mmc3_pins_sdr12 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+ DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+ DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+ DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+ DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+ DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+ >;
+ };
+
+ mmc3_pins_sdr25: mmc3_pins_sdr25 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+ DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+ DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+ DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+ DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+ DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+ >;
+ };
+
+ mmc3_pins_sdr50: mmc3_pins_sdr50 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+ DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+ DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+ DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+ DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+ DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+ >;
+ };
+
+ mmc4_pins_sdr12: mmc4_pins_sdr12 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+ DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+ DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+ DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+ DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+ DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+ >;
+ };
+
+ mmc4_pins_sdr25: mmc4_pins_sdr25 {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+ DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+ DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+ DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+ DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+ DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+ >;
+ };
+};
+
+&dra7_iodelay_core {
+
+ /* Corresponds to MMC1_DDR_MANUAL1 in datamanual */
+ mmc1_iodelay_ddr_rev11_conf: mmc1_iodelay_ddr_rev11_conf {
+ pinctrl-pin-array = <
+ 0x618 A_DELAY_PS(572) G_DELAY_PS(540) /* CFG_MMC1_CLK_IN */
+ 0x620 A_DELAY_PS(1525) G_DELAY_PS(0) /* CFG_MMC1_CLK_OUT */
+ 0x624 A_DELAY_PS(0) G_DELAY_PS(600) /* CFG_MMC1_CMD_IN */
+ 0x628 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x62c A_DELAY_PS(55) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x630 A_DELAY_PS(403) G_DELAY_PS(120) /* CFG_MMC1_DAT0_IN */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x638 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x63c A_DELAY_PS(23) G_DELAY_PS(60) /* CFG_MMC1_DAT1_IN */
+ 0x640 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x644 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x648 A_DELAY_PS(25) G_DELAY_PS(60) /* CFG_MMC1_DAT2_IN */
+ 0x64c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x650 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x654 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_IN */
+ 0x658 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ 0x65c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC1_DDR_MANUAL1 in datamanual */
+ mmc1_iodelay_ddr_rev20_conf: mmc1_iodelay_ddr50_rev20_conf {
+ pinctrl-pin-array = <
+ 0x618 A_DELAY_PS(1076) G_DELAY_PS(330) /* CFG_MMC1_CLK_IN */
+ 0x620 A_DELAY_PS(1271) G_DELAY_PS(0) /* CFG_MMC1_CLK_OUT */
+ 0x624 A_DELAY_PS(722) G_DELAY_PS(0) /* CFG_MMC1_CMD_IN */
+ 0x628 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x62C A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x630 A_DELAY_PS(751) G_DELAY_PS(0) /* CFG_MMC1_DAT0_IN */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x638 A_DELAY_PS(20) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x63C A_DELAY_PS(256) G_DELAY_PS(0) /* CFG_MMC1_DAT1_IN */
+ 0x640 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x644 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x648 A_DELAY_PS(263) G_DELAY_PS(0) /* CFG_MMC1_DAT2_IN */
+ 0x64C A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x650 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x654 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_IN */
+ 0x658 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ 0x65C A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC1_SDR104_MANUAL1 in datamanual */
+ mmc1_iodelay_sdr104_rev11_conf: mmc1_iodelay_sdr104_rev11_conf {
+ pinctrl-pin-array = <
+ 0x620 A_DELAY_PS(1063) G_DELAY_PS(17) /* CFG_MMC1_CLK_OUT */
+ 0x628 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x62c A_DELAY_PS(23) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x638 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x640 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x644 A_DELAY_PS(2) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x64c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x650 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x658 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ 0x65c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC1_SDR104_MANUAL1 in datamanual */
+ mmc1_iodelay_sdr104_rev20_conf: mmc1_iodelay_sdr104_rev20_conf {
+ pinctrl-pin-array = <
+ 0x620 A_DELAY_PS(600) G_DELAY_PS(400) /* CFG_MMC1_CLK_OUT */
+ 0x628 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OEN */
+ 0x62c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_CMD_OUT */
+ 0x634 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OEN */
+ 0x638 A_DELAY_PS(30) G_DELAY_PS(0) /* CFG_MMC1_DAT0_OUT */
+ 0x640 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OEN */
+ 0x644 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT1_OUT */
+ 0x64c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OEN */
+ 0x650 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT2_OUT */
+ 0x658 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OEN */
+ 0x65c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC1_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC2_HS200_MANUAL1 in datamanual */
+ mmc2_iodelay_hs200_rev11_conf: mmc2_iodelay_hs200_rev11_conf {
+ pinctrl-pin-array = <
+ 0x190 A_DELAY_PS(621) G_DELAY_PS(600) /* CFG_GPMC_A19_OEN */
+ 0x194 A_DELAY_PS(300) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1a8 A_DELAY_PS(739) G_DELAY_PS(600) /* CFG_GPMC_A20_OEN */
+ 0x1ac A_DELAY_PS(240) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b4 A_DELAY_PS(812) G_DELAY_PS(600) /* CFG_GPMC_A21_OEN */
+ 0x1b8 A_DELAY_PS(240) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1c0 A_DELAY_PS(954) G_DELAY_PS(600) /* CFG_GPMC_A22_OEN */
+ 0x1c4 A_DELAY_PS(60) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1d0 A_DELAY_PS(1340) G_DELAY_PS(420) /* CFG_GPMC_A23_OUT */
+ 0x1d8 A_DELAY_PS(935) G_DELAY_PS(600) /* CFG_GPMC_A24_OEN */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e4 A_DELAY_PS(525) G_DELAY_PS(600) /* CFG_GPMC_A25_OEN */
+ 0x1e8 A_DELAY_PS(120) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1f0 A_DELAY_PS(767) G_DELAY_PS(600) /* CFG_GPMC_A26_OEN */
+ 0x1f4 A_DELAY_PS(225) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x1fc A_DELAY_PS(565) G_DELAY_PS(600) /* CFG_GPMC_A27_OEN */
+ 0x200 A_DELAY_PS(60) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x364 A_DELAY_PS(969) G_DELAY_PS(600) /* CFG_GPMC_CS1_OEN */
+ 0x368 A_DELAY_PS(180) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC2_HS200_MANUAL1 in datamanual */
+ mmc2_iodelay_hs200_rev20_conf: mmc2_iodelay_hs200_rev20_conf {
+ pinctrl-pin-array = <
+ 0x190 A_DELAY_PS(274) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x194 A_DELAY_PS(162) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1a8 A_DELAY_PS(401) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1ac A_DELAY_PS(73) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b4 A_DELAY_PS(465) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1b8 A_DELAY_PS(115) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1c0 A_DELAY_PS(633) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1c4 A_DELAY_PS(47) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1d0 A_DELAY_PS(935) G_DELAY_PS(280) /* CFG_GPMC_A23_OUT */
+ 0x1d8 A_DELAY_PS(621) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e4 A_DELAY_PS(183) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1e8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1f0 A_DELAY_PS(467) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1f4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x1fc A_DELAY_PS(262) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x200 A_DELAY_PS(46) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x364 A_DELAY_PS(684) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ 0x368 A_DELAY_PS(76) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ >;
+ };
+
+ /* Correspnds to MMC2_DDR_3V3_MANUAL1 in datamanual */
+ mmc2_iodelay_ddr_3_3v_rev11_conf: mmc2_iodelay_ddr_3_3v_rev11_conf {
+ pinctrl-pin-array = <
+ 0x18c A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A19_IN */
+ 0x190 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x194 A_DELAY_PS(174) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1a4 A_DELAY_PS(265) G_DELAY_PS(360) /* CFG_GPMC_A20_IN */
+ 0x1a8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1ac A_DELAY_PS(168) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b0 A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A21_IN */
+ 0x1b4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1b8 A_DELAY_PS(136) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1bc A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A22_IN */
+ 0x1c0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1c4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1c8 A_DELAY_PS(287) G_DELAY_PS(420) /* CFG_GPMC_A23_IN */
+ 0x1d0 A_DELAY_PS(879) G_DELAY_PS(0) /* CFG_GPMC_A23_OUT */
+ 0x1d4 A_DELAY_PS(144) G_DELAY_PS(240) /* CFG_GPMC_A24_IN */
+ 0x1d8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_IN */
+ 0x1e4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1e8 A_DELAY_PS(34) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1ec A_DELAY_PS(0) G_DELAY_PS(120) /* CFG_GPMC_A26_IN */
+ 0x1f0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1f4 A_DELAY_PS(120) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x1f8 A_DELAY_PS(120) G_DELAY_PS(180) /* CFG_GPMC_A27_IN */
+ 0x1fc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x200 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x360 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_IN */
+ 0x364 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ 0x368 A_DELAY_PS(11) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC2_DDR_1V8_MANUAL1 in datamanual */
+ mmc2_iodelay_ddr_1_8v_rev11_conf: mmc2_iodelay_ddr_1_8v_rev11_conf {
+ pinctrl-pin-array = <
+ 0x18c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_IN */
+ 0x190 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A19_OEN */
+ 0x194 A_DELAY_PS(174) G_DELAY_PS(0) /* CFG_GPMC_A19_OUT */
+ 0x1a4 A_DELAY_PS(274) G_DELAY_PS(240) /* CFG_GPMC_A20_IN */
+ 0x1a8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A20_OEN */
+ 0x1ac A_DELAY_PS(168) G_DELAY_PS(0) /* CFG_GPMC_A20_OUT */
+ 0x1b0 A_DELAY_PS(0) G_DELAY_PS(60) /* CFG_GPMC_A21_IN */
+ 0x1b4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A21_OEN */
+ 0x1b8 A_DELAY_PS(136) G_DELAY_PS(0) /* CFG_GPMC_A21_OUT */
+ 0x1bc A_DELAY_PS(0) G_DELAY_PS(60) /* CFG_GPMC_A22_IN */
+ 0x1c0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A22_OEN */
+ 0x1c4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A22_OUT */
+ 0x1c8 A_DELAY_PS(514) G_DELAY_PS(360) /* CFG_GPMC_A23_IN */
+ 0x1d0 A_DELAY_PS(879) G_DELAY_PS(0) /* CFG_GPMC_A23_OUT */
+ 0x1d4 A_DELAY_PS(187) G_DELAY_PS(120) /* CFG_GPMC_A24_IN */
+ 0x1d8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OEN */
+ 0x1dc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A24_OUT */
+ 0x1e0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_IN */
+ 0x1e4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A25_OEN */
+ 0x1e8 A_DELAY_PS(34) G_DELAY_PS(0) /* CFG_GPMC_A25_OUT */
+ 0x1ec A_DELAY_PS(0) G_DELAY_PS(60) /* CFG_GPMC_A26_IN */
+ 0x1f0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A26_OEN */
+ 0x1f4 A_DELAY_PS(120) G_DELAY_PS(0) /* CFG_GPMC_A26_OUT */
+ 0x1f8 A_DELAY_PS(121) G_DELAY_PS(60) /* CFG_GPMC_A27_IN */
+ 0x1fc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OEN */
+ 0x200 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_A27_OUT */
+ 0x360 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_IN */
+ 0x364 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_GPMC_CS1_OEN */
+ 0x368 A_DELAY_PS(11) G_DELAY_PS(0) /* CFG_GPMC_CS1_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC3_MANUAL1 in datamanual */
+ mmc3_iodelay_manual1_rev20_conf: mmc3_iodelay_manual1_conf {
+ pinctrl-pin-array = <
+ 0x678 A_DELAY_PS(0) G_DELAY_PS(386) /* CFG_MMC3_CLK_IN */
+ 0x680 A_DELAY_PS(605) G_DELAY_PS(0) /* CFG_MMC3_CLK_OUT */
+ 0x684 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_IN */
+ 0x688 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_OEN */
+ 0x68c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_OUT */
+ 0x690 A_DELAY_PS(171) G_DELAY_PS(0) /* CFG_MMC3_DAT0_IN */
+ 0x694 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT0_OEN */
+ 0x698 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT0_OUT */
+ 0x69c A_DELAY_PS(221) G_DELAY_PS(0) /* CFG_MMC3_DAT1_IN */
+ 0x6a0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT1_OEN */
+ 0x6a4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT1_OUT */
+ 0x6a8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_IN */
+ 0x6ac A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_OEN */
+ 0x6b0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_OUT */
+ 0x6b4 A_DELAY_PS(474) G_DELAY_PS(0) /* CFG_MMC3_DAT3_IN */
+ 0x6b8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT3_OEN */
+ 0x6bc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC3_MANUAL1 in datamanual */
+ mmc3_iodelay_manual1_rev11_conf: mmc3_iodelay_manual1_conf {
+ pinctrl-pin-array = <
+ 0x678 A_DELAY_PS(406) G_DELAY_PS(0) /* CFG_MMC3_CLK_IN */
+ 0x680 A_DELAY_PS(659) G_DELAY_PS(0) /* CFG_MMC3_CLK_OUT */
+ 0x684 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_IN */
+ 0x688 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_OEN */
+ 0x68c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_CMD_OUT */
+ 0x690 A_DELAY_PS(130) G_DELAY_PS(0) /* CFG_MMC3_DAT0_IN */
+ 0x694 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT0_OEN */
+ 0x698 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT0_OUT */
+ 0x69c A_DELAY_PS(169) G_DELAY_PS(0) /* CFG_MMC3_DAT1_IN */
+ 0x6a0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT1_OEN */
+ 0x6a4 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT1_OUT */
+ 0x6a8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_IN */
+ 0x6ac A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_OEN */
+ 0x6b0 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT2_OUT */
+ 0x6b4 A_DELAY_PS(457) G_DELAY_PS(0) /* CFG_MMC3_DAT3_IN */
+ 0x6b8 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT3_OEN */
+ 0x6bc A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_MMC3_DAT3_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC4_DS_MANUAL1 in datamanual */
+ mmc4_iodelay_ds_rev11_conf: mmc4_iodelay_ds_rev11_conf {
+ pinctrl-pin-array = <
+ 0x840 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_IN */
+ 0x848 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_OUT */
+ 0x84c A_DELAY_PS(96) G_DELAY_PS(0) /* CFG_UART1_RTSN_IN */
+ 0x850 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OEN */
+ 0x854 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OUT */
+ 0x870 A_DELAY_PS(582) G_DELAY_PS(0) /* CFG_UART2_CTSN_IN */
+ 0x874 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OEN */
+ 0x878 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OUT */
+ 0x87c A_DELAY_PS(391) G_DELAY_PS(0) /* CFG_UART2_RTSN_IN */
+ 0x880 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OEN */
+ 0x884 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OUT */
+ 0x888 A_DELAY_PS(561) G_DELAY_PS(0) /* CFG_UART2_RXD_IN */
+ 0x88c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OEN */
+ 0x890 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OUT */
+ 0x894 A_DELAY_PS(588) G_DELAY_PS(0) /* CFG_UART2_TXD_IN */
+ 0x898 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OEN */
+ 0x89c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC4_DS_MANUAL1 in datamanual */
+ mmc4_iodelay_ds_rev20_conf: mmc4_iodelay_ds_rev20_conf {
+ pinctrl-pin-array = <
+ 0x840 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_IN */
+ 0x848 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_OUT */
+ 0x84c A_DELAY_PS(307) G_DELAY_PS(0) /* CFG_UART1_RTSN_IN */
+ 0x850 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OEN */
+ 0x854 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OUT */
+ 0x870 A_DELAY_PS(785) G_DELAY_PS(0) /* CFG_UART2_CTSN_IN */
+ 0x874 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OEN */
+ 0x878 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OUT */
+ 0x87c A_DELAY_PS(613) G_DELAY_PS(0) /* CFG_UART2_RTSN_IN */
+ 0x880 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OEN */
+ 0x884 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OUT */
+ 0x888 A_DELAY_PS(683) G_DELAY_PS(0) /* CFG_UART2_RXD_IN */
+ 0x88c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OEN */
+ 0x890 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OUT */
+ 0x894 A_DELAY_PS(835) G_DELAY_PS(0) /* CFG_UART2_TXD_IN */
+ 0x898 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OEN */
+ 0x89c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC4_MANUAL1 in datamanual */
+ mmc4_iodelay_sdr12_hs_sdr25_rev11_conf: mmc4_iodelay_sdr12_hs_sdr25_rev11_conf {
+ pinctrl-pin-array = <
+ 0x840 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_IN */
+ 0x848 A_DELAY_PS(2651) G_DELAY_PS(0) /* CFG_UART1_CTSN_OUT */
+ 0x84c A_DELAY_PS(1572) G_DELAY_PS(0) /* CFG_UART1_RTSN_IN */
+ 0x850 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OEN */
+ 0x854 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OUT */
+ 0x870 A_DELAY_PS(1913) G_DELAY_PS(0) /* CFG_UART2_CTSN_IN */
+ 0x874 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OEN */
+ 0x878 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OUT */
+ 0x87c A_DELAY_PS(1721) G_DELAY_PS(0) /* CFG_UART2_RTSN_IN */
+ 0x880 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OEN */
+ 0x884 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OUT */
+ 0x888 A_DELAY_PS(1891) G_DELAY_PS(0) /* CFG_UART2_RXD_IN */
+ 0x88c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OEN */
+ 0x890 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OUT */
+ 0x894 A_DELAY_PS(1919) G_DELAY_PS(0) /* CFG_UART2_TXD_IN */
+ 0x898 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OEN */
+ 0x89c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OUT */
+ >;
+ };
+
+ /* Corresponds to MMC4_MANUAL1 in datamanual */
+ mmc4_iodelay_sdr12_hs_sdr25_rev20_conf: mmc4_iodelay_sdr12_hs_sdr25_rev20_conf {
+ pinctrl-pin-array = <
+ 0x840 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_CTSN_IN */
+ 0x848 A_DELAY_PS(1147) G_DELAY_PS(0) /* CFG_UART1_CTSN_OUT */
+ 0x84c A_DELAY_PS(1834) G_DELAY_PS(0) /* CFG_UART1_RTSN_IN */
+ 0x850 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OEN */
+ 0x854 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART1_RTSN_OUT */
+ 0x870 A_DELAY_PS(2165) G_DELAY_PS(0) /* CFG_UART2_CTSN_IN */
+ 0x874 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OEN */
+ 0x878 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_CTSN_OUT */
+ 0x87c A_DELAY_PS(1929) G_DELAY_PS(64) /* CFG_UART2_RTSN_IN */
+ 0x880 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OEN */
+ 0x884 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RTSN_OUT */
+ 0x888 A_DELAY_PS(1935) G_DELAY_PS(128) /* CFG_UART2_RXD_IN */
+ 0x88c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OEN */
+ 0x890 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_RXD_OUT */
+ 0x894 A_DELAY_PS(2172) G_DELAY_PS(44) /* CFG_UART2_TXD_IN */
+ 0x898 A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OEN */
+ 0x89c A_DELAY_PS(0) G_DELAY_PS(0) /* CFG_UART2_TXD_OUT */
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/dra76-evm.dts b/arch/arm/boot/dts/dra76-evm.dts
new file mode 100644
index 000000000000..b024a65c6e27
--- /dev/null
+++ b/arch/arm/boot/dts/dra76-evm.dts
@@ -0,0 +1,423 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+/dts-v1/;
+
+#include "dra76x.dtsi"
+#include "dra7-evm-common.dtsi"
+#include <dt-bindings/net/ti-dp83867.h>
+
+/ {
+ model = "TI DRA762 EVM";
+ compatible = "ti,dra76-evm", "ti,dra762", "ti,dra7";
+
+ memory@0 {
+ device_type = "memory";
+ reg = <0x0 0x80000000 0x0 0x80000000>;
+ };
+
+ vsys_12v0: fixedregulator-vsys12v0 {
+ /* main supply */
+ compatible = "regulator-fixed";
+ regulator-name = "vsys_12v0";
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ vsys_5v0: fixedregulator-vsys5v0 {
+ /* Output of Cntlr B of TPS43351-Q1 on dra76-evm */
+ compatible = "regulator-fixed";
+ regulator-name = "vsys_5v0";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ vin-supply = <&vsys_12v0>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ vsys_3v3: fixedregulator-vsys3v3 {
+ /* Output of Cntlr A of TPS43351-Q1 on dra76-evm */
+ compatible = "regulator-fixed";
+ regulator-name = "vsys_3v3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vsys_12v0>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ vio_3v3: fixedregulator-vio_3v3 {
+ compatible = "regulator-fixed";
+ regulator-name = "vio_3v3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vsys_3v3>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ vio_3v3_sd: fixedregulator-sd {
+ compatible = "regulator-fixed";
+ regulator-name = "vio_3v3_sd";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vio_3v3>;
+ enable-active-high;
+ gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+ };
+
+ vio_1v8: fixedregulator-vio_1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "vio_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ vin-supply = <&smps5_reg>;
+ };
+
+ vtt_fixed: fixedregulator-vtt {
+ compatible = "regulator-fixed";
+ regulator-name = "vtt_fixed";
+ regulator-min-microvolt = <1350000>;
+ regulator-max-microvolt = <1350000>;
+ vin-supply = <&vsys_3v3>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ aic_dvdd: fixedregulator-aic_dvdd {
+ /* TPS77018DBVT */
+ compatible = "regulator-fixed";
+ regulator-name = "aic_dvdd";
+ vin-supply = <&vio_3v3>;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+};
+
+&dra7_pmx_core {
+ mmc1_pins_default: mmc1_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14) /* mmc1sdcd.gpio219 */
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc1_pins_sdr12: pinmux_mmc1_sdr12_pins {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+ >;
+ };
+
+ mmc2_pins_default: mmc2_pins_default {
+ pinctrl-single,pins = <
+ DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+ DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+ DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+ DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+ DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+ DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+ DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+ DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+ DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+ DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+ >;
+ };
+};
+
+&i2c1 {
+ status = "okay";
+ clock-frequency = <400000>;
+
+ tps65917: tps65917@58 {
+ compatible = "ti,tps65917";
+ reg = <0x58>;
+ ti,system-power-controller;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+
+ tps65917_pmic {
+ compatible = "ti,tps65917-pmic";
+
+ smps12-in-supply = <&vsys_3v3>;
+ smps3-in-supply = <&vsys_3v3>;
+ smps4-in-supply = <&vsys_3v3>;
+ smps5-in-supply = <&vsys_3v3>;
+ ldo1-in-supply = <&vsys_3v3>;
+ ldo2-in-supply = <&vsys_3v3>;
+ ldo3-in-supply = <&vsys_5v0>;
+ ldo4-in-supply = <&vsys_5v0>;
+ ldo5-in-supply = <&vsys_3v3>;
+
+ tps65917_regulators: regulators {
+ smps12_reg: smps12 {
+ /* VDD_DSPEVE */
+ regulator-name = "smps12";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1250000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ smps3_reg: smps3 {
+ /* VDD_CORE */
+ regulator-name = "smps3";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1250000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ smps4_reg: smps4 {
+ /* VDD_IVA */
+ regulator-name = "smps4";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1250000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ smps5_reg: smps5 {
+ /* VDDS1V8 */
+ regulator-name = "smps5";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo1_reg: ldo1 {
+ /* LDO1_OUT --> VDA_PHY1_1V8 */
+ regulator-name = "ldo1";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-allow-bypass;
+ };
+
+ ldo2_reg: ldo2 {
+ /* LDO2_OUT --> VDA_PHY2_1V8 */
+ regulator-name = "ldo2";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-allow-bypass;
+ regulator-always-on;
+ };
+
+ ldo3_reg: ldo3 {
+ /* VDA_USB_3V3 */
+ regulator-name = "ldo3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo5_reg: ldo5 {
+ /* VDDA_1V8_PLL */
+ regulator-name = "ldo5";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ ldo4_reg: ldo4 {
+ /* VDD_SDIO_DV */
+ regulator-name = "ldo4";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+ };
+
+ tps65917_power_button {
+ compatible = "ti,palmas-pwrbutton";
+ interrupt-parent = <&tps65917>;
+ interrupts = <1 IRQ_TYPE_NONE>;
+ wakeup-source;
+ ti,palmas-long-press-seconds = <6>;
+ };
+ };
+
+ lp87565: lp87565@60 {
+ compatible = "ti,lp87565-q1";
+ reg = <0x60>;
+
+ buck10-in-supply =<&vsys_3v3>;
+ buck23-in-supply =<&vsys_3v3>;
+
+ regulators: regulators {
+ buck10_reg: buck10 {
+ /*VDD_MPU*/
+ regulator-name = "buck10";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1250000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ buck23_reg: buck23 {
+ /* VDD_GPU*/
+ regulator-name = "buck23";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1250000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+ };
+
+ pcf_lcd: pcf8757@20 {
+ compatible = "ti,pcf8575", "nxp,pcf8575";
+ reg = <0x20>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+ };
+
+ pcf_gpio_21: pcf8757@21 {
+ compatible = "ti,pcf8575", "nxp,pcf8575";
+ reg = <0x21>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ pcf_hdmi: pcf8575@26 {
+ compatible = "ti,pcf8575", "nxp,pcf8575";
+ reg = <0x26>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ p1 {
+ /* vin6_sel_s0: high: VIN6, low: audio */
+ gpio-hog;
+ gpios = <1 GPIO_ACTIVE_HIGH>;
+ output-low;
+ line-name = "vin6_sel_s0";
+ };
+ };
+
+ tlv320aic3106: tlv320aic3106@19 {
+ #sound-dai-cells = <0>;
+ compatible = "ti,tlv320aic3106";
+ reg = <0x19>;
+ adc-settle-ms = <40>;
+ ai3x-micbias-vg = <1>; /* 2.0V */
+ status = "okay";
+
+ /* Regulators */
+ AVDD-supply = <&vio_3v3>;
+ IOVDD-supply = <&vio_3v3>;
+ DRVDD-supply = <&vio_3v3>;
+ DVDD-supply = <&aic_dvdd>;
+ };
+};
+
+&cpu0 {
+ vdd-supply = <&buck10_reg>;
+};
+
+&mmc1 {
+ status = "okay";
+ vmmc-supply = <&vio_3v3_sd>;
+ vmmc_aux-supply = <&ldo4_reg>;
+ bus-width = <4>;
+ /*
+ * SDCD signal is not being used here - using the fact that GPIO mode
+ * is always hardwired.
+ */
+ cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc1_pins_default>;
+};
+
+&mmc2 {
+ status = "okay";
+ vmmc-supply = <&vio_1v8>;
+ bus-width = <8>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_pins_default>;
+};
+
+/* No RTC on this device */
+&rtc {
+ status = "disabled";
+};
+
+&mac {
+ status = "okay";
+
+ dual_emac;
+};
+
+&cpsw_emac0 {
+ phy_id = <&davinci_mdio>, <2>;
+ phy-mode = "rgmii-id";
+ dual_emac_res_vlan = <1>;
+};
+
+&cpsw_emac1 {
+ phy_id = <&davinci_mdio>, <3>;
+ phy-mode = "rgmii-id";
+ dual_emac_res_vlan = <2>;
+};
+
+&davinci_mdio {
+ dp83867_0: ethernet-phy@2 {
+ reg = <2>;
+ ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+ ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
+ ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
+ ti,min-output-impedance;
+ ti,dp83867-rxctrl-strap-quirk;
+ };
+
+ dp83867_1: ethernet-phy@3 {
+ reg = <3>;
+ ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+ ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
+ ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
+ ti,min-output-impedance;
+ ti,dp83867-rxctrl-strap-quirk;
+ };
+};
+
+&usb2_phy1 {
+ phy-supply = <&ldo3_reg>;
+};
+
+&usb2_phy2 {
+ phy-supply = <&ldo3_reg>;
+};
+
+&qspi {
+ spi-max-frequency = <96000000>;
+ m25p80@0 {
+ spi-max-frequency = <96000000>;
+ };
+};
diff --git a/arch/arm/boot/dts/dra76x.dtsi b/arch/arm/boot/dts/dra76x.dtsi
new file mode 100644
index 000000000000..1c88c581ff18
--- /dev/null
+++ b/arch/arm/boot/dts/dra76x.dtsi
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "dra74x.dtsi"
+
+/ {
+ compatible = "ti,dra762", "ti,dra7";
+
+};
+
+/* MCAN interrupts are hard-wired to irqs 67, 68 */
+&crossbar_mpu {
+ ti,irqs-skip = <10 67 68 133 139 140>;
+};
diff --git a/arch/arm/boot/dts/dra7xx-clocks.dtsi b/arch/arm/boot/dts/dra7xx-clocks.dtsi
index cf229dfabf61..e62b62875cba 100644
--- a/arch/arm/boot/dts/dra7xx-clocks.dtsi
+++ b/arch/arm/boot/dts/dra7xx-clocks.dtsi
@@ -1817,6 +1817,8 @@
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
ti,bit-shift = <24>;
reg = <0x1868>;
+ assigned-clocks = <&mcasp3_ahclkx_mux>;
+ assigned-clock-parents = <&abe_24m_fclk>;
};
mcasp3_aux_gfclk_mux: mcasp3_aux_gfclk_mux@1868 {
diff --git a/arch/arm/boot/dts/exynos3250-artik5-eval.dts b/arch/arm/boot/dts/exynos3250-artik5-eval.dts
index 4bd2ee87124e..4cbfa09c6c4e 100644
--- a/arch/arm/boot/dts/exynos3250-artik5-eval.dts
+++ b/arch/arm/boot/dts/exynos3250-artik5-eval.dts
@@ -22,7 +22,6 @@
};
&mshc_2 {
- num-slots = <1>;
cap-sd-highspeed;
disable-wp;
vqmmc-supply = <&ldo3_reg>;
diff --git a/arch/arm/boot/dts/exynos3250-artik5.dtsi b/arch/arm/boot/dts/exynos3250-artik5.dtsi
index 59c89d7662a8..639c2e605f3c 100644
--- a/arch/arm/boot/dts/exynos3250-artik5.dtsi
+++ b/arch/arm/boot/dts/exynos3250-artik5.dtsi
@@ -304,7 +304,6 @@
};
&mshc_0 {
- num-slots = <1>;
non-removable;
cap-mmc-highspeed;
card-detect-delay = <200>;
diff --git a/arch/arm/boot/dts/exynos3250-monk.dts b/arch/arm/boot/dts/exynos3250-monk.dts
index accee81da266..bbdfcbc6e7d2 100644
--- a/arch/arm/boot/dts/exynos3250-monk.dts
+++ b/arch/arm/boot/dts/exynos3250-monk.dts
@@ -426,7 +426,6 @@
&mshc_0 {
#address-cells = <1>;
#size-cells = <0>;
- num-slots = <1>;
broken-cd;
non-removable;
cap-mmc-highspeed;
diff --git a/arch/arm/boot/dts/exynos3250-rinato.dts b/arch/arm/boot/dts/exynos3250-rinato.dts
index 443e0c98dc73..0b45467d77a8 100644
--- a/arch/arm/boot/dts/exynos3250-rinato.dts
+++ b/arch/arm/boot/dts/exynos3250-rinato.dts
@@ -220,21 +220,6 @@
samsung,pll-clock-frequency = <24000000>;
status = "okay";
- ports {
- #address-cells = <1>;
- #size-cells = <0>;
-
- port@1 {
- reg = <1>;
-
- dsi_out: endpoint {
- remote-endpoint = <&dsi_in>;
- samsung,burst-clock-frequency = <250000000>;
- samsung,esc-clock-frequency = <20000000>;
- };
- };
- };
-
panel@0 {
compatible = "samsung,s6e63j0x03";
reg = <0>;
@@ -264,12 +249,6 @@
vsync-len = <2>;
};
};
-
- port {
- dsi_in: endpoint {
- remote-endpoint = <&dsi_out>;
- };
- };
};
};
@@ -642,7 +621,6 @@
&mshc_0 {
#address-cells = <1>;
#size-cells = <0>;
- num-slots = <1>;
broken-cd;
non-removable;
cap-mmc-highspeed;
diff --git a/arch/arm/boot/dts/exynos4210-trats.dts b/arch/arm/boot/dts/exynos4210-trats.dts
index 645feffb9239..7b6ab7265110 100644
--- a/arch/arm/boot/dts/exynos4210-trats.dts
+++ b/arch/arm/boot/dts/exynos4210-trats.dts
@@ -202,21 +202,6 @@
samsung,pll-clock-frequency = <24000000>;
status = "okay";
- ports {
- #address-cells = <1>;
- #size-cells = <0>;
-
- port@1 {
- reg = <1>;
-
- dsi_out: endpoint {
- remote-endpoint = <&dsi_in>;
- samsung,burst-clock-frequency = <500000000>;
- samsung,esc-clock-frequency = <20000000>;
- };
- };
- };
-
panel@0 {
reg = <0>;
compatible = "samsung,s6e8aa0";
@@ -244,12 +229,6 @@
vsync-len = <2>;
};
};
-
- port {
- dsi_in: endpoint {
- remote-endpoint = <&dsi_out>;
- };
- };
};
};
diff --git a/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi b/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
index 4cd62487bb16..14ce2c69bc0b 100644
--- a/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
+++ b/arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
@@ -466,7 +466,6 @@
pinctrl-names = "default";
status = "okay";
vmmc-supply = <&buck9_reg>;
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
index 219d587c5a85..102acd78be15 100644
--- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
+++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
@@ -516,7 +516,6 @@
mmc-pwrseq = <&emmc_pwrseq>;
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos4412-origen.dts b/arch/arm/boot/dts/exynos4412-origen.dts
index 7a83e2df18a6..8a89eb893d64 100644
--- a/arch/arm/boot/dts/exynos4412-origen.dts
+++ b/arch/arm/boot/dts/exynos4412-origen.dts
@@ -488,7 +488,6 @@
pinctrl-names = "default";
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos4412-trats2.dts b/arch/arm/boot/dts/exynos4412-trats2.dts
index 35e9b94b86b8..bceb919ac637 100644
--- a/arch/arm/boot/dts/exynos4412-trats2.dts
+++ b/arch/arm/boot/dts/exynos4412-trats2.dts
@@ -390,21 +390,6 @@
samsung,pll-clock-frequency = <24000000>;
status = "okay";
- ports {
- #address-cells = <1>;
- #size-cells = <0>;
-
- port@1 {
- reg = <1>;
-
- dsi_out: endpoint {
- remote-endpoint = <&dsi_in>;
- samsung,burst-clock-frequency = <500000000>;
- samsung,esc-clock-frequency = <20000000>;
- };
- };
- };
-
panel@0 {
compatible = "samsung,s6e8aa0";
reg = <0>;
@@ -432,12 +417,6 @@
vsync-len = <2>;
};
};
-
- port {
- dsi_in: endpoint {
- remote-endpoint = <&dsi_out>;
- };
- };
};
};
@@ -901,7 +880,6 @@
};
&mshc_0 {
- num-slots = <1>;
broken-cd;
non-removable;
card-detect-delay = <200>;
diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts
index 6a432460eb77..18a7f396ac5f 100644
--- a/arch/arm/boot/dts/exynos5250-arndale.dts
+++ b/arch/arm/boot/dts/exynos5250-arndale.dts
@@ -518,7 +518,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
@@ -533,7 +532,6 @@
&mmc_2 {
status = "okay";
- num-slots = <1>;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts
index 6632f657394e..062cba4c2c31 100644
--- a/arch/arm/boot/dts/exynos5250-smdk5250.dts
+++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts
@@ -346,7 +346,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
@@ -360,7 +359,6 @@
&mmc_2 {
status = "okay";
- num-slots = <1>;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
diff --git a/arch/arm/boot/dts/exynos5250-snow-common.dtsi b/arch/arm/boot/dts/exynos5250-snow-common.dtsi
index e1d293dbbe5d..8788880e459d 100644
--- a/arch/arm/boot/dts/exynos5250-snow-common.dtsi
+++ b/arch/arm/boot/dts/exynos5250-snow-common.dtsi
@@ -530,7 +530,6 @@
/* eMMC flash */
&mmc_0 {
status = "okay";
- num-slots = <1>;
non-removable;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
@@ -544,7 +543,6 @@
/* uSD card */
&mmc_2 {
status = "okay";
- num-slots = <1>;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
samsung,dw-mshc-sdr-timing = <2 3>;
@@ -564,7 +562,6 @@
*/
&mmc_3 {
status = "okay";
- num-slots = <1>;
non-removable;
cap-sdio-irq;
keep-power-in-suspend;
diff --git a/arch/arm/boot/dts/exynos5250-spring.dts b/arch/arm/boot/dts/exynos5250-spring.dts
index 95c3bcace9dc..d53bfcbeb39c 100644
--- a/arch/arm/boot/dts/exynos5250-spring.dts
+++ b/arch/arm/boot/dts/exynos5250-spring.dts
@@ -427,7 +427,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
@@ -445,7 +444,6 @@
*/
&mmc_1 {
status = "okay";
- num-slots = <1>;
broken-cd;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos5260-xyref5260.dts b/arch/arm/boot/dts/exynos5260-xyref5260.dts
index d0cc300cfb4b..73b7cdd5f522 100644
--- a/arch/arm/boot/dts/exynos5260-xyref5260.dts
+++ b/arch/arm/boot/dts/exynos5260-xyref5260.dts
@@ -67,7 +67,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
broken-cd;
bypass-smu;
cap-mmc-highspeed;
@@ -83,7 +82,6 @@
&mmc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos5410-smdk5410.dts b/arch/arm/boot/dts/exynos5410-smdk5410.dts
index 6cc74d97daae..9cb7726ef8d0 100644
--- a/arch/arm/boot/dts/exynos5410-smdk5410.dts
+++ b/arch/arm/boot/dts/exynos5410-smdk5410.dts
@@ -41,7 +41,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
cap-mmc-highspeed;
broken-cd;
card-detect-delay = <200>;
@@ -53,7 +52,6 @@
&mmc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
card-detect-delay = <200>;
samsung,dw-mshc-ciu-div = <3>;
diff --git a/arch/arm/boot/dts/exynos5420-peach-pit.dts b/arch/arm/boot/dts/exynos5420-peach-pit.dts
index f9a75bfd3f2b..683a4cfb4a23 100644
--- a/arch/arm/boot/dts/exynos5420-peach-pit.dts
+++ b/arch/arm/boot/dts/exynos5420-peach-pit.dts
@@ -699,7 +699,6 @@
/* eMMC flash */
&mmc_0 {
status = "okay";
- num-slots = <1>;
mmc-hs200-1_8v;
cap-mmc-highspeed;
non-removable;
@@ -717,7 +716,6 @@
/* WiFi SDIO module */
&mmc_1 {
status = "okay";
- num-slots = <1>;
non-removable;
cap-sdio-irq;
keep-power-in-suspend;
@@ -737,7 +735,6 @@
/* uSD card */
&mmc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
card-detect-delay = <200>;
clock-frequency = <400000000>;
diff --git a/arch/arm/boot/dts/exynos5440.dtsi b/arch/arm/boot/dts/exynos5440.dtsi
index bc4954e69f7b..7a00be7ea6d7 100644
--- a/arch/arm/boot/dts/exynos5440.dtsi
+++ b/arch/arm/boot/dts/exynos5440.dtsi
@@ -317,6 +317,7 @@
phys = <&pcie_phy0>;
ranges = <0x81000000 0 0 0x40001000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x40011000 0x40011000 0 0x1ffef000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0x0 0 &gic 53>;
@@ -339,6 +340,7 @@
phys = <&pcie_phy1>;
ranges = <0x81000000 0 0 0x60001000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x60011000 0x60011000 0 0x1ffef000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0x0 0 &gic 56>;
diff --git a/arch/arm/boot/dts/exynos5800-peach-pi.dts b/arch/arm/boot/dts/exynos5800-peach-pi.dts
index 953dc8677dc8..b2b95ff205e8 100644
--- a/arch/arm/boot/dts/exynos5800-peach-pi.dts
+++ b/arch/arm/boot/dts/exynos5800-peach-pi.dts
@@ -667,7 +667,6 @@
/* eMMC flash */
&mmc_0 {
status = "okay";
- num-slots = <1>;
mmc-hs200-1_8v;
mmc-hs400-1_8v;
cap-mmc-highspeed;
@@ -686,7 +685,6 @@
/* WiFi SDIO module */
&mmc_1 {
status = "okay";
- num-slots = <1>;
non-removable;
cap-sdio-irq;
keep-power-in-suspend;
@@ -706,7 +704,6 @@
/* uSD card */
&mmc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
card-detect-delay = <200>;
clock-frequency = <400000000>;
diff --git a/arch/arm/boot/dts/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini-dlink-dir-685.dts
new file mode 100644
index 000000000000..e75e2d44371c
--- /dev/null
+++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts
@@ -0,0 +1,246 @@
+/*
+ * Device Tree file for D-Link DIR-685 Xtreme N Storage Router
+ */
+
+/dts-v1/;
+
+#include "gemini.dtsi"
+#include <dt-bindings/input/input.h>
+
+/ {
+ model = "D-Link DIR-685 Xtreme N Storage Router";
+ compatible = "dlink,dir-685", "cortina,gemini";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ memory {
+ /* 128 MB SDRAM in 2 x Hynix HY5DU121622DTP-D43 */
+ device_type = "memory";
+ reg = <0x00000000 0x8000000>;
+ };
+
+ chosen {
+ stdout-path = "uart0:115200n8";
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ button-esc {
+ debounce_interval = <50>;
+ wakeup-source;
+ linux,code = <KEY_ESC>;
+ label = "reset";
+ /* Collides with LPC_LAD[0], UART DCD, SSP 97RST */
+ gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
+ };
+ button-eject {
+ debounce_interval = <50>;
+ wakeup-source;
+ linux,code = <KEY_EJECTCD>;
+ label = "unmount";
+ /* Collides with LPC LFRAME, UART RTS, SSP TXD */
+ gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ led-wps {
+ label = "dir685:blue:WPS";
+ /* Collides with ICE */
+ gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
+ default-state = "on";
+ linux,default-trigger = "heartbeat";
+ };
+ /*
+ * These two LEDs are on the side of the device.
+ * For electrical reasons, both LEDs cannot be active
+ * at the same time so only blue or orange can on at
+ * one time. Enabling both makes the LED go dark.
+ * The LEDs both sit inside the unmount button and the
+ * label on the case says "unmount".
+ */
+ led-blue-hd {
+ label = "dir685:blue:HD";
+ /* Collides with LPC_SERIRQ, UART DTR, SSP FSC pins */
+ gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+ led-orange-hd {
+ label = "dir685:orange:HD";
+ /* Collides with LPC_LAD[2], UART DSR, SSP ECLK pins */
+ gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+ };
+
+ /*
+ * This is a Sunon Maglev GM0502PFV2-8 cooling fan @10000 RPM.
+ * Since the platform has no temperature sensor, this is controlled
+ * from userspace by using the hard disks S.M.A.R.T. temperature
+ * sensor. It is turned on when the temperature exceeds 46 degrees
+ * and turned off when the temperatures goes below 41 degrees
+ * (celsius).
+ */
+ gpio-fan {
+ compatible = "gpio-fan";
+ /* Collides with IDE */
+ gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
+ gpio-fan,speed-map = <0 0>, <10000 1>;
+ #cooling-cells = <2>;
+ };
+
+ /*
+ * The touchpad input is connected to a GPIO bit-banged
+ * I2C bus.
+ */
+ gpio-i2c {
+ compatible = "i2c-gpio";
+ /* Collides with ICE */
+ gpios = <&gpio0 5 0>, /* SDA */
+ <&gpio0 6 0>; /* SCL */
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ touchkeys@26 {
+ compatible = "dlink,dir685-touchkeys";
+ reg = <0x26>;
+ interrupt-parent = <&gpio0>;
+ /* Collides with NAND flash */
+ interrupts = <17 IRQ_TYPE_EDGE_FALLING>;
+ };
+ };
+
+ soc {
+ flash@30000000 {
+ status = "okay";
+ /* 32MB of flash */
+ reg = <0x30000000 0x02000000>;
+
+ /*
+ * This "RedBoot" is the Storlink derivative.
+ */
+ partition@0 {
+ label = "RedBoot";
+ reg = <0x00000000 0x00040000>;
+ read-only;
+ };
+ /*
+ * Between the boot loader and the rootfs is the kernel
+ * in a custom Storlink format flashed from the boot
+ * menu. The rootfs is in squashfs format.
+ */
+ partition@1800c0 {
+ label = "rootfs";
+ reg = <0x001800c0 0x01dbff40>;
+ read-only;
+ };
+ partition@1f40000 {
+ label = "upgrade";
+ reg = <0x01f40000 0x00040000>;
+ read-only;
+ };
+ partition@1f80000 {
+ label = "rgdb";
+ reg = <0x01f80000 0x00040000>;
+ read-only;
+ };
+ /*
+ * This partition contains MAC addresses for WAN,
+ * WLAN and LAN, and the country code (for wireless
+ * I guess).
+ */
+ partition@1fc0000 {
+ label = "nvram";
+ reg = <0x01fc0000 0x00020000>;
+ read-only;
+ };
+ partition@1fe0000 {
+ label = "LangPack";
+ reg = <0x01fe0000 0x00020000>;
+ read-only;
+ };
+ };
+
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio0bgrp cover line 5, 6 used by TK I2C
+ * gpio0bgrp cover line 7 used by WPS LED
+ * gpio0cgrp cover line 8, 13 used by keys
+ * and 11, 12 used by the HD LEDs
+ * gpio0egrp cover line 16 used by VDISP
+ * gpio0fgrp cover line 17 used by TK IRQ
+ * gpio0ggrp cover line 20 used by panel CS
+ * gpio0hgrp cover line 21,22 used by RTL8366RB
+ */
+ gpio0_default_pins: pinctrl-gpio0 {
+ mux {
+ function = "gpio0";
+ groups = "gpio0bgrp",
+ "gpio0cgrp",
+ "gpio0egrp",
+ "gpio0fgrp",
+ "gpio0ggrp",
+ "gpio0hgrp";
+ };
+ };
+ /*
+ * gpio1bgrp cover line 5,8,7 used by panel SPI
+ * also line 6 used by the fan
+ *
+ */
+ gpio1_default_pins: pinctrl-gpio1 {
+ mux {
+ function = "gpio1";
+ groups = "gpio1bgrp";
+ };
+ };
+ };
+ };
+
+ sata: sata@46000000 {
+ cortina,gemini-ata-muxmode = <0>;
+ cortina,gemini-enable-sata-bridge;
+ status = "okay";
+ };
+
+ gpio0: gpio@4d000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_default_pins>;
+ };
+
+ gpio1: gpio@4e000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio1_default_pins>;
+ };
+
+ pci@50000000 {
+ status = "okay";
+ interrupt-map-mask = <0xf800 0 0 7>;
+ interrupt-map =
+ <0x4800 0 0 1 &pci_intc 0>, /* Slot 9 */
+ <0x4800 0 0 2 &pci_intc 1>,
+ <0x4800 0 0 3 &pci_intc 2>,
+ <0x4800 0 0 4 &pci_intc 3>,
+ <0x5000 0 0 1 &pci_intc 1>, /* Slot 10 */
+ <0x5000 0 0 2 &pci_intc 2>,
+ <0x5000 0 0 3 &pci_intc 3>,
+ <0x5000 0 0 4 &pci_intc 0>,
+ <0x5800 0 0 1 &pci_intc 2>, /* Slot 11 */
+ <0x5800 0 0 2 &pci_intc 3>,
+ <0x5800 0 0 3 &pci_intc 0>,
+ <0x5800 0 0 4 &pci_intc 1>,
+ <0x6000 0 0 1 &pci_intc 3>, /* Slot 12 */
+ <0x6000 0 0 2 &pci_intc 0>,
+ <0x6000 0 0 3 &pci_intc 1>,
+ <0x6000 0 0 4 &pci_intc 2>;
+ };
+
+ ata@63000000 {
+ status = "okay";
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/gemini-nas4220b.dts b/arch/arm/boot/dts/gemini-nas4220b.dts
index 55f6a4f1f801..b4fc58c8cf8d 100644
--- a/arch/arm/boot/dts/gemini-nas4220b.dts
+++ b/arch/arm/boot/dts/gemini-nas4220b.dts
@@ -33,6 +33,7 @@
wakeup-source;
linux,code = <KEY_SETUP>;
label = "Backup button";
+ /* Conflict with TVC */
gpios = <&gpio1 29 GPIO_ACTIVE_LOW>;
};
button@31 {
@@ -40,6 +41,7 @@
wakeup-source;
linux,code = <KEY_RESTART>;
label = "Softreset button";
+ /* Conflict with TVC */
gpios = <&gpio1 31 GPIO_ACTIVE_LOW>;
};
};
@@ -48,11 +50,13 @@
compatible = "gpio-leds";
led@28 {
label = "nas4220b:orange:hdd";
+ /* Conflict with TVC */
gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led@30 {
label = "nas4220b:green:os";
+ /* Conflict with TVC */
gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
default-state = "on";
linux,default-trigger = "heartbeat";
@@ -99,12 +103,32 @@
};
};
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio1dgrp cover line 28-31 otherwise used
+ * by TVC.
+ */
+ gpio1_default_pins: pinctrl-gpio1 {
+ mux {
+ function = "gpio1";
+ groups = "gpio1dgrp";
+ };
+ };
+ };
+ };
+
sata: sata@46000000 {
cortina,gemini-ata-muxmode = <0>;
cortina,gemini-enable-sata-bridge;
status = "okay";
};
+ gpio1: gpio@4e000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio1_default_pins>;
+ };
+
ata@63000000 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/gemini-rut1xx.dts b/arch/arm/boot/dts/gemini-rut1xx.dts
index 7b920bfbda32..3613b264f45f 100644
--- a/arch/arm/boot/dts/gemini-rut1xx.dts
+++ b/arch/arm/boot/dts/gemini-rut1xx.dts
@@ -33,6 +33,7 @@
wakeup-source;
linux,code = <KEY_SETUP>;
label = "Reset to defaults";
+ /* Conflict with TVC */
gpios = <&gpio1 28 GPIO_ACTIVE_LOW>;
};
};
@@ -42,12 +43,14 @@
led@7 {
/* FIXME: add the LED color */
label = "rut1xx::gsm";
+ /* Conflict with ICE */
gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led@31 {
/* FIXME: add the LED color */
label = "rut1xx::power";
+ /* Conflict with NAND CE0 */
gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
default-state = "off";
linux,default-trigger = "heartbeat";
@@ -61,5 +64,41 @@
reg = <0x30000000 0x00800000>;
/* TODO: add flash partitions here */
};
+
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio0bgrp cover line 7 used by GSM LED
+ * gpio0fgrp cover line 17 used by power LED
+ */
+ gpio0_default_pins: pinctrl-gpio0 {
+ mux {
+ function = "gpio0";
+ groups = "gpio0bgrp",
+ "gpio0fgrp";
+ };
+ };
+ /*
+ * gpio1dgrp cover line 28-31 otherwise used
+ * by TVC.
+ */
+ gpio1_default_pins: pinctrl-gpio1 {
+ mux {
+ function = "gpio1";
+ groups = "gpio1dgrp";
+ };
+ };
+ };
+ };
+
+ gpio0: gpio@4d000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_default_pins>;
+ };
+
+ gpio1: gpio@4e000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio1_default_pins>;
+ };
};
};
diff --git a/arch/arm/boot/dts/gemini-sq201.dts b/arch/arm/boot/dts/gemini-sq201.dts
index 4d200f0bcd45..7cfa9caf47d4 100644
--- a/arch/arm/boot/dts/gemini-sq201.dts
+++ b/arch/arm/boot/dts/gemini-sq201.dts
@@ -33,6 +33,7 @@
wakeup-source;
linux,code = <KEY_SETUP>;
label = "factory reset";
+ /* Conflict with NAND flash */
gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
};
};
@@ -41,12 +42,14 @@
compatible = "gpio-leds";
led@20 {
label = "sq201:green:info";
+ /* Conflict with parallel flash */
gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
default-state = "on";
linux,default-trigger = "heartbeat";
};
led@31 {
label = "sq201:green:usb";
+ /* Conflict with parallel and NAND flash */
gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
default-state = "off";
linux,default-trigger = "usb-host";
@@ -55,7 +58,15 @@
soc {
flash@30000000 {
- status = "okay";
+ /*
+ * Flash access can be enabled, with the side effect
+ * of disabling access to GPIO LED on GPIO0[20] which
+ * reuse one of the parallel flash chip select lines.
+ * Also the default firmware on the machine has the
+ * problem that since it uses the flash, the two LEDS
+ * on the right become numb.
+ */
+ /* status = "okay"; */
/* 16MB of flash */
reg = <0x30000000 0x01000000>;
@@ -93,12 +104,35 @@
};
};
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio0fgrp cover line 18 used by reset button
+ * gpio0ggrp cover line 20 used by info LED
+ * gpio0kgrp cover line 31 used by USB LED
+ */
+ gpio0_default_pins: pinctrl-gpio0 {
+ mux {
+ function = "gpio0";
+ groups = "gpio0fgrp",
+ "gpio0ggrp",
+ "gpio0kgrp";
+ };
+ };
+ };
+ };
+
sata: sata@46000000 {
cortina,gemini-ata-muxmode = <0>;
cortina,gemini-enable-sata-bridge;
status = "okay";
};
+ gpio0: gpio@4d000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_default_pins>;
+ };
+
pci@50000000 {
status = "okay";
interrupt-map-mask = <0xf800 0 0 7>;
diff --git a/arch/arm/boot/dts/gemini-wbd111.dts b/arch/arm/boot/dts/gemini-wbd111.dts
index 63b756e3bf5a..38a49e750478 100644
--- a/arch/arm/boot/dts/gemini-wbd111.dts
+++ b/arch/arm/boot/dts/gemini-wbd111.dts
@@ -33,6 +33,7 @@
wakeup-source;
linux,code = <KEY_SETUP>;
label = "reset";
+ /* Conflict with ICE */
gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
};
};
@@ -42,21 +43,25 @@
led@1 {
label = "wbd111:red:L3";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@2 {
label = "wbd111:green:L4";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@3 {
label = "wbd111:red:L4";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@5 {
label = "wbd111:green:L3";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>;
default-state = "on";
linux,default-trigger = "heartbeat";
@@ -98,5 +103,26 @@
read-only;
};
};
+
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio0agrp cover line 0-4
+ * gpio0bgrp cover line 5
+ */
+ gpio0_default_pins: pinctrl-gpio0 {
+ mux {
+ function = "gpio0";
+ groups = "gpio0agrp",
+ "gpio0bgrp";
+ };
+ };
+ };
+ };
+
+ gpio0: gpio@4d000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_default_pins>;
+ };
};
};
diff --git a/arch/arm/boot/dts/gemini-wbd222.dts b/arch/arm/boot/dts/gemini-wbd222.dts
index 9747f5a47807..f77e34e0df0b 100644
--- a/arch/arm/boot/dts/gemini-wbd222.dts
+++ b/arch/arm/boot/dts/gemini-wbd222.dts
@@ -33,6 +33,7 @@
wakeup-source;
linux,code = <KEY_SETUP>;
label = "reset";
+ /* Conflict with ICE */
gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
};
};
@@ -42,21 +43,25 @@
led@1 {
label = "wbd111:red:L3";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@2 {
label = "wbd111:green:L4";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@3 {
label = "wbd111:red:L4";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led@5 {
label = "wbd111:green:L3";
+ /* Conflict with TVC and extended parallel flash */
gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>;
default-state = "on";
linux,default-trigger = "heartbeat";
@@ -98,5 +103,26 @@
read-only;
};
};
+
+ syscon: syscon@40000000 {
+ pinctrl {
+ /*
+ * gpio0agrp cover line 0-4
+ * gpio0bgrp cover line 5
+ */
+ gpio0_default_pins: pinctrl-gpio0 {
+ mux {
+ function = "gpio0";
+ groups = "gpio0agrp",
+ "gpio0bgrp";
+ };
+ };
+ };
+ };
+
+ gpio0: gpio@4d000000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&gpio0_default_pins>;
+ };
};
};
diff --git a/arch/arm/boot/dts/gemini.dtsi b/arch/arm/boot/dts/gemini.dtsi
index 141d8d3a1d07..c68e8d430234 100644
--- a/arch/arm/boot/dts/gemini.dtsi
+++ b/arch/arm/boot/dts/gemini.dtsi
@@ -5,6 +5,8 @@
/include/ "skeleton.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/clock/cortina,gemini-clock.h>
+#include <dt-bindings/reset/cortina,gemini-reset.h>
#include <dt-bindings/gpio/gpio.h>
/ {
@@ -18,6 +20,8 @@
flash@30000000 {
compatible = "cortina,gemini-flash", "cfi-flash";
syscon = <&syscon>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pflash_default_pins>;
bank-width = <2>;
#address-cells = <1>;
#size-cells = <1>;
@@ -39,22 +43,123 @@
/* RESET_GLOBAL | RESET_CPU1 */
mask = <0xC0000000>;
};
+
+ pinctrl {
+ compatible = "cortina,gemini-pinctrl";
+ regmap = <&syscon>;
+ /* Hog the DRAM pins */
+ pinctrl-names = "default";
+ pinctrl-0 = <&dram_default_pins>, <&system_default_pins>,
+ <&vcontrol_default_pins>;
+
+ dram_default_pins: pinctrl-dram {
+ mux {
+ function = "dram";
+ groups = "dramgrp";
+ };
+ };
+ rtc_default_pins: pinctrl-rtc {
+ mux {
+ function = "rtc";
+ groups = "rtcgrp";
+ };
+ };
+ power_default_pins: pinctrl-power {
+ mux {
+ function = "power";
+ groups = "powergrp";
+ };
+ };
+ cir_default_pins: pinctrl-cir {
+ mux {
+ function = "cir";
+ groups = "cirgrp";
+ };
+ };
+ system_default_pins: pinctrl-system {
+ mux {
+ function = "system";
+ groups = "systemgrp";
+ };
+ };
+ vcontrol_default_pins: pinctrl-vcontrol {
+ mux {
+ function = "vcontrol";
+ groups = "vcontrolgrp";
+ };
+ };
+ ice_default_pins: pinctrl-ice {
+ mux {
+ function = "ice";
+ groups = "icegrp";
+ };
+ };
+ uart_default_pins: pinctrl-uart {
+ mux {
+ function = "uart";
+ groups = "uartrxtxgrp";
+ };
+ };
+ pflash_default_pins: pinctrl-pflash {
+ mux {
+ function = "pflash";
+ groups = "pflashgrp";
+ };
+ };
+ usb_default_pins: pinctrl-usb {
+ mux {
+ function = "usb";
+ groups = "usbgrp";
+ };
+ };
+ gmii_default_pins: pinctrl-gmii {
+ mux {
+ function = "gmii";
+ groups = "gmiigrp";
+ };
+ };
+ pci_default_pins: pinctrl-pci {
+ mux {
+ function = "pci";
+ groups = "pcigrp";
+ };
+ };
+ sata_default_pins: pinctrl-sata {
+ mux {
+ function = "sata";
+ groups = "satagrp";
+ };
+ };
+ /* Activate both groups of pins for this state */
+ sata_and_ide_pins: pinctrl-sata-ide {
+ mux0 {
+ function = "sata";
+ groups = "satagrp";
+ };
+ mux1 {
+ function = "ide";
+ groups = "idegrp";
+ };
+ };
+ };
};
watchdog@41000000 {
compatible = "cortina,gemini-watchdog";
reg = <0x41000000 0x1000>;
interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
- resets = <&syscon 23>;
- clocks = <&syscon 2>;
+ resets = <&syscon GEMINI_RESET_WDOG>;
+ clocks = <&syscon GEMINI_CLK_APB>;
};
uart0: serial@42000000 {
compatible = "ns16550a";
reg = <0x42000000 0x100>;
- resets = <&syscon 18>;
- clocks = <&syscon 6>;
+ resets = <&syscon GEMINI_RESET_UART>;
+ clocks = <&syscon GEMINI_CLK_UART>;
interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart_default_pins>;
reg-shift = <2>;
};
@@ -65,9 +170,9 @@
interrupts = <14 IRQ_TYPE_EDGE_FALLING>, /* Timer 1 */
<15 IRQ_TYPE_EDGE_FALLING>, /* Timer 2 */
<16 IRQ_TYPE_EDGE_FALLING>; /* Timer 3 */
- resets = <&syscon 17>;
+ resets = <&syscon GEMINI_RESET_TIMER>;
/* APB clock or RTC clock */
- clocks = <&syscon 2>, <&syscon 0>;
+ clocks = <&syscon GEMINI_CLK_APB>, <&syscon GEMINI_CLK_RTC>;
clock-names = "PCLK", "EXTCLK";
syscon = <&syscon>;
};
@@ -76,20 +181,30 @@
compatible = "cortina,gemini-rtc";
reg = <0x45000000 0x100>;
interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
- resets = <&syscon 16>;
- clocks = <&syscon 2>, <&syscon 0>;
+ resets = <&syscon GEMINI_RESET_RTC>;
+ clocks = <&syscon GEMINI_CLK_APB>, <&syscon GEMINI_CLK_RTC>;
clock-names = "PCLK", "EXTCLK";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rtc_default_pins>;
};
sata: sata@46000000 {
compatible = "cortina,gemini-sata-bridge";
reg = <0x46000000 0x100>;
- resets = <&syscon 26>,
- <&syscon 27>;
+ resets = <&syscon GEMINI_RESET_SATA0>,
+ <&syscon GEMINI_RESET_SATA1>;
reset-names = "sata0", "sata1";
- clocks = <&syscon 10>,
- <&syscon 11>;
+ clocks = <&syscon GEMINI_CLK_GATE_SATA0>,
+ <&syscon GEMINI_CLK_GATE_SATA1>;
clock-names = "SATA0_PCLK", "SATA1_PCLK";
+ /*
+ * This defines the special "ide" state that needs
+ * to be explicitly enabled to enable the IDE pins,
+ * as these pins are normally used for other things.
+ */
+ pinctrl-names = "default", "ide";
+ pinctrl-0 = <&sata_default_pins>;
+ pinctrl-1 = <&sata_and_ide_pins>;
syscon = <&syscon>;
status = "disabled";
};
@@ -97,7 +212,7 @@
intcon: interrupt-controller@48000000 {
compatible = "faraday,ftintc010";
reg = <0x48000000 0x1000>;
- resets = <&syscon 14>;
+ resets = <&syscon GEMINI_RESET_INTCON0>;
interrupt-controller;
#interrupt-cells = <2>;
};
@@ -106,14 +221,16 @@
compatible = "cortina,gemini-power-controller";
reg = <0x4b000000 0x100>;
interrupts = <26 IRQ_TYPE_EDGE_RISING>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&power_default_pins>;
};
gpio0: gpio@4d000000 {
compatible = "cortina,gemini-gpio", "faraday,ftgpio010";
reg = <0x4d000000 0x100>;
interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
- resets = <&syscon 20>;
- clocks = <&syscon 2>;
+ resets = <&syscon GEMINI_RESET_GPIO0>;
+ clocks = <&syscon GEMINI_CLK_APB>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
@@ -124,8 +241,8 @@
compatible = "cortina,gemini-gpio", "faraday,ftgpio010";
reg = <0x4e000000 0x100>;
interrupts = <23 IRQ_TYPE_LEVEL_HIGH>;
- resets = <&syscon 21>;
- clocks = <&syscon 2>;
+ resets = <&syscon GEMINI_RESET_GPIO1>;
+ clocks = <&syscon GEMINI_CLK_APB>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
@@ -136,8 +253,8 @@
compatible = "cortina,gemini-gpio", "faraday,ftgpio010";
reg = <0x4f000000 0x100>;
interrupts = <24 IRQ_TYPE_LEVEL_HIGH>;
- resets = <&syscon 22>;
- clocks = <&syscon 2>;
+ resets = <&syscon GEMINI_RESET_GPIO2>;
+ clocks = <&syscon GEMINI_CLK_APB>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
@@ -151,9 +268,11 @@
* to configure the host bridge.
*/
reg = <0x50000000 0x100>;
- resets = <&syscon 7>;
- clocks = <&syscon 15>, <&syscon 4>;
+ resets = <&syscon GEMINI_RESET_PCI>;
+ clocks = <&syscon GEMINI_CLK_GATE_PCI>, <&syscon GEMINI_CLK_PCI>;
clock-names = "PCLK", "PCICLK";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pci_default_pins>;
#address-cells = <3>;
#size-cells = <2>;
#interrupt-cells = <1>;
@@ -193,8 +312,8 @@
compatible = "cortina,gemini-pata", "faraday,ftide010";
reg = <0x63000000 0x1000>;
interrupts = <4 IRQ_TYPE_EDGE_RISING>;
- resets = <&syscon 2>;
- clocks = <&syscon 14>;
+ resets = <&syscon GEMINI_RESET_IDE>;
+ clocks = <&syscon GEMINI_CLK_GATE_IDE>;
clock-names = "PCLK";
sata = <&sata>;
status = "disabled";
@@ -204,8 +323,8 @@
compatible = "cortina,gemini-pata", "faraday,ftide010";
reg = <0x63400000 0x1000>;
interrupts = <5 IRQ_TYPE_EDGE_RISING>;
- resets = <&syscon 2>;
- clocks = <&syscon 14>;
+ resets = <&syscon GEMINI_RESET_IDE>;
+ clocks = <&syscon GEMINI_CLK_GATE_IDE>;
clock-names = "PCLK";
sata = <&sata>;
status = "disabled";
@@ -217,8 +336,8 @@
arm,primecell-periphid = <0x0003b080>;
reg = <0x67000000 0x1000>;
interrupts = <9 IRQ_TYPE_EDGE_RISING>;
- resets = <&syscon 10>;
- clocks = <&syscon 1>;
+ resets = <&syscon GEMINI_RESET_DMAC>;
+ clocks = <&syscon GEMINI_CLK_AHB>;
clock-names = "apb_pclk";
/* Bus interface AHB1 (AHB0) is totally tilted */
lli-bus-interface-ahb2;
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi
index 0ade3619f3c3..09ce8b81fafa 100644
--- a/arch/arm/boot/dts/imx25.dtsi
+++ b/arch/arm/boot/dts/imx25.dtsi
@@ -452,6 +452,13 @@
interrupt-names = "scm", "smn";
};
+ rngb: rngb@53fb0000 {
+ compatible = "fsl,imx25-rngb";
+ reg = <0x53fb0000 0x4000>;
+ clocks = <&clks 109>;
+ interrupts = <22>;
+ };
+
esdhc1: esdhc@53fb4000 {
compatible = "fsl,imx25-esdhc";
reg = <0x53fb4000 0x4000>;
diff --git a/arch/arm/boot/dts/imx53-cx9020.dts b/arch/arm/boot/dts/imx53-cx9020.dts
new file mode 100644
index 000000000000..4f54fd4418a3
--- /dev/null
+++ b/arch/arm/boot/dts/imx53-cx9020.dts
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2017 Beckhoff Automation GmbH & Co. KG
+ * based on imx53-qsb.dts
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx53.dtsi"
+
+/ {
+ model = "Beckhoff CX9020 Embedded PC";
+ compatible = "bhf,cx9020", "fsl,imx53";
+
+ chosen {
+ stdout-path = &uart2;
+ };
+
+ memory {
+ reg = <0x70000000 0x20000000>,
+ <0xb0000000 0x20000000>;
+ };
+
+ display-0 {
+ #address-cells =<1>;
+ #size-cells = <0>;
+ compatible = "fsl,imx-parallel-display";
+ interface-pix-fmt = "rgb24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu_disp0>;
+
+ port@0 {
+ reg = <0>;
+
+ display0_in: endpoint {
+ remote-endpoint = <&ipu_di0_disp0>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ display0_out: endpoint {
+ remote-endpoint = <&tfp410_in>;
+ };
+ };
+ };
+
+ dvi-connector {
+ compatible = "dvi-connector";
+ ddc-i2c-bus = <&i2c2>;
+ digital;
+
+ port {
+ dvi_connector_in: endpoint {
+ remote-endpoint = <&tfp410_out>;
+ };
+ };
+ };
+
+ dvi-converter {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "ti,tfp410";
+
+ port@0 {
+ reg = <0>;
+
+ tfp410_in: endpoint {
+ remote-endpoint = <&display0_out>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ tfp410_out: endpoint {
+ remote-endpoint = <&dvi_connector_in>;
+ };
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ pwr-r {
+ gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+
+ pwr-g {
+ gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>;
+ default-state = "on";
+ };
+
+ pwr-b {
+ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+
+ sd1-b {
+ linux,default-trigger = "mmc0";
+ gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
+ };
+
+ sd2-b {
+ linux,default-trigger = "mmc1";
+ gpios = <&gpio3 17 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+ regulator-3p2v {
+ compatible = "regulator-fixed";
+ regulator-name = "3P2V";
+ regulator-min-microvolt = <3200000>;
+ regulator-max-microvolt = <3200000>;
+ regulator-always-on;
+ };
+
+ reg_usb_vbus: regulator-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "usb_vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+};
+
+&esdhc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_esdhc1>;
+ cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&esdhc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_esdhc2>;
+ cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&fec {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_fec>;
+ phy-mode = "rmii";
+ phy-reset-gpios = <&gpio7 6 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&i2c2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c2>;
+ status = "okay";
+};
+
+&ipu_di0_disp0 {
+ remote-endpoint = <&display0_in>;
+};
+
+&uart2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart2>;
+ fsl,dte-mode;
+ status = "okay";
+};
+
+&usbh1 {
+ vbus-supply = <&reg_usb_vbus>;
+ phy_type = "utmi";
+ status = "okay";
+};
+
+&usbotg {
+ dr_mode = "peripheral";
+ status = "okay";
+};
+
+&vpu {
+ status = "okay";
+};
+
+&iomuxc {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_hog>;
+
+ pinctrl_hog: hoggrp {
+ fsl,pins = <
+ MX53_PAD_GPIO_0__CCM_CLKO 0x1c4
+ MX53_PAD_GPIO_16__I2C3_SDA 0x1c4
+ MX53_PAD_EIM_D22__GPIO3_22 0x1c4
+ MX53_PAD_EIM_D23__GPIO3_23 0x1e4
+ MX53_PAD_EIM_D24__GPIO3_24 0x1e4
+ >;
+ };
+
+ pinctrl_esdhc1: esdhc1grp {
+ fsl,pins = <
+ MX53_PAD_SD1_DATA0__ESDHC1_DAT0 0x1d5
+ MX53_PAD_SD1_DATA1__ESDHC1_DAT1 0x1d5
+ MX53_PAD_SD1_DATA2__ESDHC1_DAT2 0x1d5
+ MX53_PAD_SD1_DATA3__ESDHC1_DAT3 0x1d5
+ MX53_PAD_SD1_CMD__ESDHC1_CMD 0x1d5
+ MX53_PAD_SD1_CLK__ESDHC1_CLK 0x1d5
+ MX53_PAD_GPIO_1__ESDHC1_CD 0x1c4
+ MX53_PAD_EIM_D17__GPIO3_17 0x1e4
+ MX53_PAD_GPIO_3__GPIO1_3 0x1c4
+ >;
+ };
+
+ pinctrl_esdhc2: esdhc2grp {
+ fsl,pins = <
+ MX53_PAD_SD2_DATA0__ESDHC2_DAT0 0x1d5
+ MX53_PAD_SD2_DATA1__ESDHC2_DAT1 0x1d5
+ MX53_PAD_SD2_DATA2__ESDHC2_DAT2 0x1d5
+ MX53_PAD_SD2_DATA3__ESDHC2_DAT3 0x1d5
+ MX53_PAD_SD2_CMD__ESDHC2_CMD 0x1d5
+ MX53_PAD_SD2_CLK__ESDHC2_CLK 0x1d5
+ MX53_PAD_GPIO_4__ESDHC2_CD 0x1e4
+ MX53_PAD_EIM_D20__GPIO3_20 0x1e4
+ MX53_PAD_GPIO_8__GPIO1_8 0x1c4
+ >;
+ };
+
+ pinctrl_fec: fecgrp {
+ fsl,pins = <
+ MX53_PAD_FEC_MDC__FEC_MDC 0x4
+ MX53_PAD_FEC_MDIO__FEC_MDIO 0x1fc
+ MX53_PAD_FEC_REF_CLK__FEC_TX_CLK 0x180
+ MX53_PAD_FEC_RX_ER__FEC_RX_ER 0x180
+ MX53_PAD_FEC_CRS_DV__FEC_RX_DV 0x180
+ MX53_PAD_FEC_RXD1__FEC_RDATA_1 0x180
+ MX53_PAD_FEC_RXD0__FEC_RDATA_0 0x180
+ MX53_PAD_FEC_TX_EN__FEC_TX_EN 0x4
+ MX53_PAD_FEC_TXD1__FEC_TDATA_1 0x4
+ MX53_PAD_FEC_TXD0__FEC_TDATA_0 0x4
+ >;
+ };
+
+ pinctrl_i2c2: i2c2grp {
+ fsl,pins = <
+ MX53_PAD_KEY_ROW3__I2C2_SDA 0xc0000000
+ MX53_PAD_KEY_COL3__I2C2_SCL 0xc0000000
+ >;
+ };
+
+ pinctrl_ipu_disp0: ipudisp0grp {
+ fsl,pins = <
+ MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK 0x5
+ MX53_PAD_DI0_PIN15__IPU_DI0_PIN15 0x5
+ MX53_PAD_DI0_PIN2__IPU_DI0_PIN2 0x5
+ MX53_PAD_DI0_PIN3__IPU_DI0_PIN3 0x5
+ MX53_PAD_DI0_PIN4__IPU_DI0_PIN4 0x5
+ MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0 0x5
+ MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1 0x5
+ MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2 0x5
+ MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3 0x5
+ MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4 0x5
+ MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5 0x5
+ MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6 0x5
+ MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7 0x5
+ MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8 0x5
+ MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9 0x5
+ MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10 0x5
+ MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11 0x5
+ MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12 0x5
+ MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13 0x5
+ MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14 0x5
+ MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15 0x5
+ MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16 0x5
+ MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17 0x5
+ MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18 0x5
+ MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19 0x5
+ MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20 0x5
+ MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21 0x5
+ MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22 0x5
+ MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23 0x5
+ >;
+ };
+
+ pinctrl_uart2: uart2grp {
+ fsl,pins = <
+ MX53_PAD_EIM_D26__UART2_RXD_MUX 0x1e4
+ MX53_PAD_EIM_D27__UART2_TXD_MUX 0x1e4
+ MX53_PAD_EIM_D28__UART2_RTS 0x1e4
+ MX53_PAD_EIM_D29__UART2_CTS 0x1e4
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx53-pinfunc.h b/arch/arm/boot/dts/imx53-pinfunc.h
index aec406bc65eb..59f9c29e3fe2 100644
--- a/arch/arm/boot/dts/imx53-pinfunc.h
+++ b/arch/arm/boot/dts/imx53-pinfunc.h
@@ -524,6 +524,7 @@
#define MX53_PAD_EIM_D25__UART1_DSR 0x140 0x488 0x000 0x7 0x0
#define MX53_PAD_EIM_D26__EMI_WEIM_D_26 0x144 0x48c 0x000 0x0 0x0
#define MX53_PAD_EIM_D26__GPIO3_26 0x144 0x48c 0x000 0x1 0x0
+#define MX53_PAD_EIM_D26__UART2_RXD_MUX 0x144 0x48c 0x880 0x2 0x0
#define MX53_PAD_EIM_D26__UART2_TXD_MUX 0x144 0x48c 0x000 0x2 0x0
#define MX53_PAD_EIM_D26__FIRI_RXD 0x144 0x48c 0x80c 0x3 0x0
#define MX53_PAD_EIM_D26__IPU_CSI0_D_1 0x144 0x48c 0x000 0x4 0x0
@@ -533,6 +534,7 @@
#define MX53_PAD_EIM_D27__EMI_WEIM_D_27 0x148 0x490 0x000 0x0 0x0
#define MX53_PAD_EIM_D27__GPIO3_27 0x148 0x490 0x000 0x1 0x0
#define MX53_PAD_EIM_D27__UART2_RXD_MUX 0x148 0x490 0x880 0x2 0x1
+#define MX53_PAD_EIM_D27__UART2_TXD_MUX 0x148 0x490 0x000 0x2 0x0
#define MX53_PAD_EIM_D27__FIRI_TXD 0x148 0x490 0x000 0x3 0x0
#define MX53_PAD_EIM_D27__IPU_CSI0_D_0 0x148 0x490 0x000 0x4 0x0
#define MX53_PAD_EIM_D27__IPU_DI1_PIN13 0x148 0x490 0x000 0x5 0x0
@@ -541,6 +543,7 @@
#define MX53_PAD_EIM_D28__EMI_WEIM_D_28 0x14c 0x494 0x000 0x0 0x0
#define MX53_PAD_EIM_D28__GPIO3_28 0x14c 0x494 0x000 0x1 0x0
#define MX53_PAD_EIM_D28__UART2_CTS 0x14c 0x494 0x000 0x2 0x0
+#define MX53_PAD_EIM_D28__UART2_RTS 0x14c 0x494 0x87c 0x2 0x0
#define MX53_PAD_EIM_D28__IPU_DISPB0_SER_DIO 0x14c 0x494 0x82c 0x3 0x1
#define MX53_PAD_EIM_D28__CSPI_MOSI 0x14c 0x494 0x788 0x4 0x1
#define MX53_PAD_EIM_D28__I2C1_SDA 0x14c 0x494 0x818 0x5 0x1
@@ -548,6 +551,7 @@
#define MX53_PAD_EIM_D28__IPU_DI0_PIN13 0x14c 0x494 0x000 0x7 0x0
#define MX53_PAD_EIM_D29__EMI_WEIM_D_29 0x150 0x498 0x000 0x0 0x0
#define MX53_PAD_EIM_D29__GPIO3_29 0x150 0x498 0x000 0x1 0x0
+#define MX53_PAD_EIM_D29__UART2_CTS 0x150 0x498 0x000 0x2 0x0
#define MX53_PAD_EIM_D29__UART2_RTS 0x150 0x498 0x87c 0x2 0x1
#define MX53_PAD_EIM_D29__IPU_DISPB0_SER_RS 0x150 0x498 0x000 0x3 0x0
#define MX53_PAD_EIM_D29__CSPI_SS0 0x150 0x498 0x78c 0x4 0x2
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
index 2e516f4985e4..8bf0d89cdd35 100644
--- a/arch/arm/boot/dts/imx53.dtsi
+++ b/arch/arm/boot/dts/imx53.dtsi
@@ -433,6 +433,15 @@
clock-names = "ipg", "per";
};
+ srtc: srtc@53fa4000 {
+ compatible = "fsl,imx53-rtc", "fsl,imx25-rtc";
+ reg = <0x53fa4000 0x4000>;
+ interrupts = <24>;
+ interrupt-parent = <&tzic>;
+ clocks = <&clks IMX5_CLK_SRTC_GATE>;
+ clock-names = "ipg";
+ };
+
iomuxc: iomuxc@53fa8000 {
compatible = "fsl,imx53-iomuxc";
reg = <0x53fa8000 0x4000>;
diff --git a/arch/arm/boot/dts/imx6dl-gw52xx.dts b/arch/arm/boot/dts/imx6dl-gw52xx.dts
index a2e0b73fdd4a..5f9f8948100d 100644
--- a/arch/arm/boot/dts/imx6dl-gw52xx.dts
+++ b/arch/arm/boot/dts/imx6dl-gw52xx.dts
@@ -17,3 +17,61 @@
model = "Gateworks Ventana i.MX6 DualLite/Solo GW52XX";
compatible = "gw,imx6dl-gw52xx", "gw,ventana", "fsl,imx6dl";
};
+
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu1_csi1_mux: endpoint {
+ remote-endpoint = <&ipu1_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu1_csi1_from_ipu1_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu1_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu1_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu1_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_csi1>;
+};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu1_csi1: ipu1_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU1_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU1_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU1_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU1_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU1_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU1_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU1_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU1_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU1_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU1_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU1_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6dl-gw53xx.dts b/arch/arm/boot/dts/imx6dl-gw53xx.dts
index 6844b708d2f8..9bfc620d37bd 100644
--- a/arch/arm/boot/dts/imx6dl-gw53xx.dts
+++ b/arch/arm/boot/dts/imx6dl-gw53xx.dts
@@ -17,3 +17,61 @@
model = "Gateworks Ventana i.MX6 DualLite/Solo GW53XX";
compatible = "gw,imx6dl-gw53xx", "gw,ventana", "fsl,imx6dl";
};
+
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu1_csi1_mux: endpoint {
+ remote-endpoint = <&ipu1_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu1_csi1_from_ipu1_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu1_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu1_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu1_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_csi1>;
+};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu1_csi1: ipu1_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU1_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU1_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU1_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU1_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU1_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU1_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU1_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU1_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU1_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU1_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU1_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6dl-gw54xx.dts b/arch/arm/boot/dts/imx6dl-gw54xx.dts
index be915412f852..b909bdf9a2ef 100644
--- a/arch/arm/boot/dts/imx6dl-gw54xx.dts
+++ b/arch/arm/boot/dts/imx6dl-gw54xx.dts
@@ -17,3 +17,61 @@
model = "Gateworks Ventana i.MX6 DualLite/Solo GW54XX";
compatible = "gw,imx6dl-gw54xx", "gw,ventana", "fsl,imx6dl";
};
+
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu1_csi1_mux: endpoint {
+ remote-endpoint = <&ipu1_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu1_csi1_from_ipu1_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu1_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu1_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu1_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_csi1>;
+};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu1_csi1: ipu1_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU1_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU1_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU1_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU1_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU1_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU1_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU1_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU1_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU1_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU1_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU1_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6dl-riotboard.dts b/arch/arm/boot/dts/imx6dl-riotboard.dts
index 29b45f2e64e0..275c6c05219d 100644
--- a/arch/arm/boot/dts/imx6dl-riotboard.dts
+++ b/arch/arm/boot/dts/imx6dl-riotboard.dts
@@ -101,6 +101,51 @@
status = "okay";
};
+&gpio1 {
+ gpio-line-names =
+ "", "", "SD2_WP", "", "SD2_CD", "I2C3_SCL",
+ "I2C3_SDA", "I2C4_SCL",
+ "I2C4_SDA", "", "", "", "", "", "", "",
+ "", "PWM3", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "";
+};
+
+&gpio3 {
+ gpio-line-names =
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "USB_OTG_VBUS", "",
+ "UART3_TXD", "UART3_RXD", "", "", "EIM_D28", "", "", "";
+};
+
+&gpio4 {
+ gpio-line-names =
+ "", "", "", "", "", "", "UART4_TXD", "UART4_RXD",
+ "UART5_TXD", "UART5_RXD", "", "", "", "", "", "",
+ "GPIO4_16", "GPIO4_17", "GPIO4_18", "GPIO4_19", "",
+ "CSPI3_CLK", "CSPI3_MOSI", "CSPI3_MISO",
+ "CSPI3_CS0", "CSPI3_CS1", "GPIO4_26", "GPIO4_27",
+ "CSPI3_RDY", "PWM1", "PWM2", "GPIO4_31";
+};
+
+&gpio5 {
+ gpio-line-names =
+ "", "", "EIM_A25", "", "", "GPIO5_05", "GPIO5_06",
+ "GPIO5_07",
+ "GPIO5_08", "CSPI2_CS1", "CSPI2_MOSI", "CSPI2_MISO",
+ "CSPI2_CS0", "CSPI2_CLK", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "";
+};
+
+&gpio7 {
+ gpio-line-names =
+ "SD3_CD", "SD3_WP", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "";
+};
+
&hdmi {
ddc-i2c-bus = <&i2c2>;
status = "okay";
diff --git a/arch/arm/boot/dts/imx6q-apalis-eval.dts b/arch/arm/boot/dts/imx6q-apalis-eval.dts
new file mode 100644
index 000000000000..4bbfe3d61027
--- /dev/null
+++ b/arch/arm/boot/dts/imx6q-apalis-eval.dts
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2014-2017 Toradex AG
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ * Copyright 2011 Linaro Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "imx6q.dtsi"
+#include "imx6qdl-apalis.dtsi"
+
+/ {
+ model = "Toradex Apalis iMX6Q/D Module on Apalis Evaluation Board";
+ compatible = "toradex,apalis_imx6q-eval", "toradex,apalis_imx6q",
+ "fsl,imx6q";
+
+ aliases {
+ i2c0 = &i2c1;
+ i2c1 = &i2c3;
+ i2c2 = &i2c2;
+ rtc0 = &rtc_i2c;
+ rtc1 = &snvs_rtc;
+ };
+
+ gpio-keys {
+ compatible = "gpio-keys";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpio_keys>;
+
+ wakeup {
+ label = "Wake-Up";
+ gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_WAKEUP>;
+ debounce-interval = <10>;
+ wakeup-source;
+ };
+ };
+
+ lcd_display: display@di0 {
+ compatible = "fsl,imx-parallel-display";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interface-pix-fmt = "rgb24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_lcdif>;
+ status = "okay";
+
+ port@0 {
+ reg = <0>;
+
+ lcd_display_in: endpoint {
+ remote-endpoint = <&ipu1_di1_disp1>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ lcd_display_out: endpoint {
+ remote-endpoint = <&lcd_panel_in>;
+ };
+ };
+ };
+
+ panel: panel {
+ /*
+ * edt,et057090dhu: EDT 5.7" LCD TFT
+ * edt,et070080dh6: EDT 7.0" LCD TFT
+ */
+ compatible = "edt,et057090dhu";
+ backlight = <&backlight>;
+
+ port {
+ lcd_panel_in: endpoint {
+ remote-endpoint = <&lcd_display_out>;
+ };
+ };
+ };
+
+ reg_pcie_switch: regulator-pcie-switch {
+ compatible = "regulator-fixed";
+ regulator-name = "pcie_switch";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+ startup-delay-us = <100000>;
+ enable-active-high;
+ status = "okay";
+ };
+};
+
+&backlight {
+ brightness-levels = <0 127 191 223 239 247 251 255>;
+ default-brightness-level = <1>;
+ status = "okay";
+};
+
+&can1 {
+ status = "okay";
+};
+
+&can2 {
+ status = "okay";
+};
+
+&hdmi {
+ status = "okay";
+};
+
+/* I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
+&i2c1 {
+ status = "okay";
+
+ pcie-switch@58 {
+ compatible = "plx,pex8605";
+ reg = <0x58>;
+ };
+
+ /* M41T0M6 real time clock on carrier board */
+ rtc_i2c: rtc@68 {
+ compatible = "st,m41t00";
+ reg = <0x68>;
+ };
+};
+
+/*
+ * I2C3_SDA/SCL (CAM) on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ * board)
+ */
+&i2c3 {
+ status = "okay";
+};
+
+&ipu1_di1_disp1 {
+ remote-endpoint = <&lcd_display_in>;
+};
+
+&ldb {
+ status = "okay";
+};
+
+&pcie {
+ /* active-high meaning opposite of regular PERST# active-low polarity */
+ reset-gpio = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+ reset-gpio-active-high;
+ vpcie-supply = <&reg_pcie_switch>;
+ status = "okay";
+};
+
+&pwm1 {
+ status = "okay";
+};
+
+&pwm2 {
+ status = "okay";
+};
+
+&pwm3 {
+ status = "okay";
+};
+
+&pwm4 {
+ status = "okay";
+};
+
+&reg_usb_otg_vbus {
+ status = "okay";
+};
+
+&reg_usb_host_vbus {
+ status = "okay";
+};
+
+&sata {
+ status = "okay";
+};
+
+&sound_spdif {
+ status = "okay";
+};
+
+&spdif {
+ status = "okay";
+};
+
+&uart1 {
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&uart4 {
+ status = "okay";
+};
+
+&uart5 {
+ status = "okay";
+};
+
+&usbh1 {
+ vbus-supply = <&reg_usb_host_vbus>;
+ status = "okay";
+};
+
+&usbotg {
+ vbus-supply = <&reg_usb_otg_vbus>;
+ status = "okay";
+};
+
+/* MMC1 */
+&usdhc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit &pinctrl_mmc_cd>;
+ cd-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;
+ status = "okay";
+};
+
+/* SD1 */
+&usdhc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc2 &pinctrl_sd_cd>;
+ cd-gpios = <&gpio6 14 GPIO_ACTIVE_LOW>;
+ status = "okay";
+};
+
+&iomuxc {
+ /*
+ * Mux the Apalis GPIOs
+ */
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_apalis_gpio1 &pinctrl_apalis_gpio2
+ &pinctrl_apalis_gpio3 &pinctrl_apalis_gpio4
+ &pinctrl_apalis_gpio5 &pinctrl_apalis_gpio6
+ &pinctrl_apalis_gpio7 &pinctrl_apalis_gpio8
+ >;
+};
diff --git a/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts b/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts
new file mode 100644
index 000000000000..a35c7a54ad3b
--- /dev/null
+++ b/arch/arm/boot/dts/imx6q-apalis-ixora-v1.1.dts
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2014-2017 Toradex AG
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ * Copyright 2011 Linaro Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "imx6q.dtsi"
+#include "imx6qdl-apalis.dtsi"
+
+/ {
+ model = "Toradex Apalis iMX6Q/D Module on Ixora Carrier Board V1.1";
+ compatible = "toradex,apalis_imx6q-ixora-v1.1",
+ "toradex,apalis_imx6q-ixora", "toradex,apalis_imx6q",
+ "fsl,imx6q";
+
+ aliases {
+ i2c0 = &i2c1;
+ i2c1 = &i2c3;
+ i2c2 = &i2c2;
+ rtc0 = &rtc_i2c;
+ rtc1 = &snvs_rtc;
+ };
+
+ gpio-keys {
+ compatible = "gpio-keys";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpio_keys>;
+
+ wakeup {
+ label = "Wake-Up";
+ gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_WAKEUP>;
+ debounce-interval = <10>;
+ wakeup-source;
+ };
+ };
+
+ lcd_display: display@di0 {
+ compatible = "fsl,imx-parallel-display";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interface-pix-fmt = "rgb24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_lcdif>;
+ status = "okay";
+
+ port@0 {
+ reg = <0>;
+
+ lcd_display_in: endpoint {
+ remote-endpoint = <&ipu1_di1_disp1>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ lcd_display_out: endpoint {
+ remote-endpoint = <&lcd_panel_in>;
+ };
+ };
+ };
+
+ panel: panel {
+ /*
+ * edt,et057090dhu: EDT 5.7" LCD TFT
+ * edt,et070080dh6: EDT 7.0" LCD TFT
+ */
+ compatible = "edt,et057090dhu";
+ backlight = <&backlight>;
+
+ port {
+ lcd_panel_in: endpoint {
+ remote-endpoint = <&lcd_display_out>;
+ };
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_leds_ixora>;
+
+ led4-green {
+ label = "LED_4_GREEN";
+ gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+ };
+
+ led4-red {
+ label = "LED_4_RED";
+ gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+ };
+
+ led5-green {
+ label = "LED_5_GREEN";
+ gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+ };
+
+ led5-red {
+ label = "LED_5_RED";
+ gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
+ };
+ };
+};
+
+&backlight {
+ brightness-levels = <0 127 191 223 239 247 251 255>;
+ default-brightness-level = <1>;
+ status = "okay";
+};
+
+&can1 {
+ status = "okay";
+};
+
+&can2 {
+ status = "okay";
+};
+
+&hdmi {
+ status = "okay";
+};
+
+/* I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
+&i2c1 {
+ status = "okay";
+
+ /* M41T0M6 real time clock on carrier board */
+ rtc_i2c: rtc@68 {
+ compatible = "st,m41t00";
+ reg = <0x68>;
+ };
+};
+
+/*
+ * I2C3_SDA/SCL (CAM) on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ * board)
+ */
+&i2c3 {
+ status = "okay";
+};
+
+&ipu1_di1_disp1 {
+ remote-endpoint = <&lcd_display_in>;
+};
+
+&ldb {
+ status = "okay";
+};
+
+&pcie {
+ /* active-high meaning opposite of regular PERST# active-low polarity */
+ reset-gpio = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+ reset-gpio-active-high;
+ status = "okay";
+};
+
+&pwm1 {
+ status = "okay";
+};
+
+&pwm2 {
+ status = "okay";
+};
+
+&pwm3 {
+ status = "okay";
+};
+
+&pwm4 {
+ status = "okay";
+};
+
+&reg_usb_otg_vbus {
+ status = "okay";
+};
+
+&reg_usb_host_vbus {
+ status = "okay";
+};
+
+&sata {
+ status = "okay";
+};
+
+&sound_spdif {
+ status = "okay";
+};
+
+&spdif {
+ status = "okay";
+};
+
+&uart1 {
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&uart4 {
+ status = "okay";
+};
+
+&uart5 {
+ status = "okay";
+};
+
+&usbh1 {
+ vbus-supply = <&reg_usb_host_vbus>;
+ status = "okay";
+};
+
+&usbotg {
+ vbus-supply = <&reg_usb_otg_vbus>;
+ status = "okay";
+};
+
+/* MMC1 */
+&usdhc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_mmc_cd>;
+ cd-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&iomuxc {
+ /*
+ * Mux the Apalis GPIOs
+ */
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_apalis_gpio1 &pinctrl_apalis_gpio2
+ &pinctrl_apalis_gpio3 &pinctrl_apalis_gpio4
+ &pinctrl_apalis_gpio5 &pinctrl_apalis_gpio6
+ &pinctrl_apalis_gpio7 &pinctrl_apalis_gpio8
+ >;
+
+ pinctrl_leds_ixora: ledsixoragrp {
+ fsl,pins = <
+ MX6QDL_PAD_SD2_DAT1__GPIO1_IO14 0x1b0b0
+ MX6QDL_PAD_SD2_DAT3__GPIO1_IO12 0x1b0b0
+ MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x1b0b0
+ MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6q-apalis-ixora.dts b/arch/arm/boot/dts/imx6q-apalis-ixora.dts
index 88cc7f51a4e9..60d33e99de76 100644
--- a/arch/arm/boot/dts/imx6q-apalis-ixora.dts
+++ b/arch/arm/boot/dts/imx6q-apalis-ixora.dts
@@ -1,5 +1,5 @@
/*
- * Copyright 2014-2016 Toradex AG
+ * Copyright 2014-2017 Toradex AG
* Copyright 2012 Freescale Semiconductor, Inc.
* Copyright 2011 Linaro Ltd.
*
@@ -55,13 +55,9 @@
"fsl,imx6q";
aliases {
- i2c0 = &i2cddc;
- i2c1 = &i2c1;
+ i2c0 = &i2c1;
+ i2c1 = &i2c3;
i2c2 = &i2c2;
- i2c3 = &i2c3;
- };
-
- aliases {
rtc0 = &rtc_i2c;
rtc1 = &snvs_rtc;
};
@@ -164,15 +160,10 @@
};
&hdmi {
- ddc-i2c-bus = <&i2cddc>;
- status = "okay";
-};
-
-&i2cddc {
status = "okay";
};
-/* GEN1_I2C: I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
+/* I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
&i2c1 {
status = "okay";
@@ -188,6 +179,14 @@
};
};
+/*
+ * I2C3_SDA/SCL (CAM) on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ * board)
+ */
+&i2c3 {
+ status = "okay";
+};
+
&ipu1_di1_disp1 {
remote-endpoint = <&lcd_display_in>;
};
@@ -268,16 +267,13 @@
/* SD1 */
&usdhc2 {
pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_sd_cd>;
+ pinctrl-0 = <&pinctrl_usdhc2 &pinctrl_sd_cd>;
cd-gpios = <&gpio6 14 GPIO_ACTIVE_LOW>;
status = "okay";
};
&iomuxc {
- /*
- * Mux the Apalis GPIOs
- * GPIO5, 6 used by optional fusion_F0710A kernel module
- */
+ /* Mux the Apalis GPIOs */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_apalis_gpio1 &pinctrl_apalis_gpio2
&pinctrl_apalis_gpio3 &pinctrl_apalis_gpio4
diff --git a/arch/arm/boot/dts/imx6q-b850v3.dts b/arch/arm/boot/dts/imx6q-b850v3.dts
index 2c1e98e0cf7b..46bdc6722715 100644
--- a/arch/arm/boot/dts/imx6q-b850v3.dts
+++ b/arch/arm/boot/dts/imx6q-b850v3.dts
@@ -57,7 +57,7 @@
assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
<&clks IMX6QDL_CLK_LDB_DI1_SEL>,
<&clks IMX6QDL_CLK_IPU1_DI0_PRE_SEL>,
- <&clks IMX6QDL_CLK_IPU1_DI1_PRE_SEL>;
+ <&clks IMX6QDL_CLK_IPU2_DI0_PRE_SEL>;
assigned-clock-parents = <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
<&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
<&clks IMX6QDL_CLK_PLL2_PFD2_396M>,
diff --git a/arch/arm/boot/dts/imx6q-bx50v3.dtsi b/arch/arm/boot/dts/imx6q-bx50v3.dtsi
index c90b26f00e24..1015e55ca8f7 100644
--- a/arch/arm/boot/dts/imx6q-bx50v3.dtsi
+++ b/arch/arm/boot/dts/imx6q-bx50v3.dtsi
@@ -111,6 +111,11 @@
};
&i2c1 {
+ pinctrl-names = "default", "gpio";
+ pinctrl-1 = <&pinctrl_i2c1_gpio>;
+ sda-gpios = <&gpio5 26 GPIO_ACTIVE_HIGH>;
+ scl-gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>;
+
pca9547: mux@70 {
compatible = "nxp,pca9547";
reg = <0x70>;
@@ -261,6 +266,43 @@
};
};
+&i2c2 {
+ pinctrl-names = "default", "gpio";
+ pinctrl-1 = <&pinctrl_i2c2_gpio>;
+ sda-gpios = <&gpio4 13 GPIO_ACTIVE_HIGH>;
+ scl-gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>;
+};
+
+&i2c3 {
+ pinctrl-names = "default", "gpio";
+ pinctrl-1 = <&pinctrl_i2c3_gpio>;
+ sda-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
+ scl-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
+};
+
+&iomuxc {
+ pinctrl_i2c1_gpio: i2c1gpiogrp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT8__GPIO5_IO26 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT9__GPIO5_IO27 0x1b0b0
+ >;
+ };
+
+ pinctrl_i2c2_gpio: i2c2gpiogrp {
+ fsl,pins = <
+ MX6QDL_PAD_KEY_COL3__GPIO4_IO12 0x1b0b0
+ MX6QDL_PAD_KEY_ROW3__GPIO4_IO13 0x1b0b0
+ >;
+ };
+
+ pinctrl_i2c3_gpio: i2c3gpiogrp {
+ fsl,pins = <
+ MX6QDL_PAD_GPIO_3__GPIO1_IO03 0x1b0b0
+ MX6QDL_PAD_GPIO_6__GPIO1_IO06 0x1b0b0
+ >;
+ };
+};
+
&usdhc4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>;
diff --git a/arch/arm/boot/dts/imx6q-gw52xx.dts b/arch/arm/boot/dts/imx6q-gw52xx.dts
index a12c47e5ee05..0b8ae007ad73 100644
--- a/arch/arm/boot/dts/imx6q-gw52xx.dts
+++ b/arch/arm/boot/dts/imx6q-gw52xx.dts
@@ -18,6 +18,64 @@
compatible = "gw,imx6q-gw52xx", "gw,ventana", "fsl,imx6q";
};
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu2_csi1_mux: endpoint {
+ remote-endpoint = <&ipu2_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu2_csi1_from_ipu2_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu2_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu2_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu2_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu2_csi1>;
+};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu2_csi1: ipu2_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU2_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU2_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU2_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU2_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU2_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU2_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU2_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU2_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU2_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
+
&sata {
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6q-gw53xx.dts b/arch/arm/boot/dts/imx6q-gw53xx.dts
index d76aaa83dad0..a56ef77eff3f 100644
--- a/arch/arm/boot/dts/imx6q-gw53xx.dts
+++ b/arch/arm/boot/dts/imx6q-gw53xx.dts
@@ -18,6 +18,64 @@
compatible = "gw,imx6q-gw53xx", "gw,ventana", "fsl,imx6q";
};
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu2_csi1_mux: endpoint {
+ remote-endpoint = <&ipu2_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu2_csi1_from_ipu2_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu2_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu2_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu2_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu2_csi1>;
+};
+
&sata {
status = "okay";
};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu2_csi1: ipu2_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU2_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU2_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU2_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU2_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU2_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU2_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU2_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU2_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU2_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6q-gw54xx.dts b/arch/arm/boot/dts/imx6q-gw54xx.dts
index 6e8f53e92a2d..56e5b5050fcf 100644
--- a/arch/arm/boot/dts/imx6q-gw54xx.dts
+++ b/arch/arm/boot/dts/imx6q-gw54xx.dts
@@ -18,6 +18,64 @@
compatible = "gw,imx6q-gw54xx", "gw,ventana", "fsl,imx6q";
};
+&i2c3 {
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu2_csi1_mux: endpoint {
+ remote-endpoint = <&ipu2_csi1_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu2_csi1_from_ipu2_csi1_mux {
+ bus-width = <8>;
+};
+
+&ipu2_csi1_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu2_csi1_mux>;
+ bus-width = <8>;
+};
+
+&ipu2_csi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu2_csi1>;
+};
+
&sata {
status = "okay";
};
+
+&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0001b0b0
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x4001b0b0
+ >;
+ };
+
+ pinctrl_ipu2_csi1: ipu2_csi1grp {
+ fsl,pins = <
+ MX6QDL_PAD_EIM_EB2__IPU2_CSI1_DATA19 0x1b0b0
+ MX6QDL_PAD_EIM_D16__IPU2_CSI1_DATA18 0x1b0b0
+ MX6QDL_PAD_EIM_D18__IPU2_CSI1_DATA17 0x1b0b0
+ MX6QDL_PAD_EIM_D19__IPU2_CSI1_DATA16 0x1b0b0
+ MX6QDL_PAD_EIM_D20__IPU2_CSI1_DATA15 0x1b0b0
+ MX6QDL_PAD_EIM_D26__IPU2_CSI1_DATA14 0x1b0b0
+ MX6QDL_PAD_EIM_D27__IPU2_CSI1_DATA13 0x1b0b0
+ MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x1b0b0
+ MX6QDL_PAD_EIM_D29__IPU2_CSI1_VSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_EB3__IPU2_CSI1_HSYNC 0x1b0b0
+ MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x1b0b0
+ >;
+ };
+};
diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
index ba01dd76d887..ea339fa58f4a 100644
--- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
@@ -1,5 +1,5 @@
/*
- * Copyright 2014-2016 Toradex AG
+ * Copyright 2014-2017 Toradex AG
* Copyright 2012 Freescale Semiconductor, Inc.
* Copyright 2011 Linaro Ltd.
*
@@ -56,18 +56,6 @@
status = "disabled";
};
- /* DDC_I2C: I2C2_SDA/SCL on MXM3 205/207 */
- i2cddc: i2c@0 {
- compatible = "i2c-gpio";
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_i2c_ddc>;
- gpios = <&gpio3 16 GPIO_ACTIVE_HIGH /* sda */
- &gpio2 30 GPIO_ACTIVE_HIGH /* scl */
- >;
- i2c-gpio,delay-us = <2>; /* ~100 kHz */
- status = "disabled";
- };
-
reg_1p8v: regulator-1p8v {
compatible = "regulator-fixed";
regulator-name = "1P8V";
@@ -210,10 +198,13 @@
};
};
-/*
- * GEN1_I2C: I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier
- * board)
- */
+&hdmi {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_hdmi_ddc>;
+ status = "disabled";
+};
+
+/* I2C1_SDA/SCL on MXM3 209/211 (e.g. RTC on carrier board) */
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
@@ -374,7 +365,8 @@
};
/*
- * GEN2_I2C, CAM: I2C3_SDA/SCL on MXM3 201/203 (unused)
+ * I2C3_SDA/SCL (CAM) on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ * board)
*/
&i2c3 {
clock-frequency = <100000>;
@@ -460,7 +452,7 @@
/* MMC1 */
&usdhc1 {
pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usdhc1>;
+ pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit>;
vqmmc-supply = <&reg_3p3v>;
bus-width = <8>;
voltage-ranges = <3300 3300>;
@@ -640,11 +632,10 @@
>;
};
- pinctrl_i2c_ddc: gpioi2cddcgrp {
+ pinctrl_hdmi_ddc: hdmiddcgrp {
fsl,pins = <
- /* DDC bitbang */
- MX6QDL_PAD_EIM_EB2__GPIO2_IO30 0x1b0b0
- MX6QDL_PAD_EIM_D16__GPIO3_IO16 0x1b0b0
+ MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x4001b8b1
+ MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x4001b8b1
>;
};
@@ -912,7 +903,7 @@
>;
};
- pinctrl_usdhc1: usdhc1grp {
+ pinctrl_usdhc1_4bit: usdhc1grp_4bit {
fsl,pins = <
MX6QDL_PAD_SD1_CMD__SD1_CMD 0x17071
MX6QDL_PAD_SD1_CLK__SD1_CLK 0x10071
@@ -920,6 +911,11 @@
MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17071
MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17071
MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17071
+ >;
+ };
+
+ pinctrl_usdhc1_8bit: usdhc1grp_8bit {
+ fsl,pins = <
MX6QDL_PAD_NANDF_D0__SD1_DATA4 0x17071
MX6QDL_PAD_NANDF_D1__SD1_DATA5 0x17071
MX6QDL_PAD_NANDF_D2__SD1_DATA6 0x17071
diff --git a/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi b/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
index e8c1edc82e6e..885556260bd0 100644
--- a/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
@@ -231,6 +231,37 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c3>;
status = "okay";
+
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio5 20 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio5>;
+ interrupts = <23 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu1_csi0_mux: endpoint {
+ remote-endpoint = <&ipu1_csi0_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu1_csi0_from_ipu1_csi0_mux {
+ bus-width = <8>;
+};
+
+&ipu1_csi0_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu1_csi0_mux>;
+ bus-width = <8>;
+};
+
+&ipu1_csi0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_csi0>;
};
&pcie {
@@ -302,6 +333,13 @@
&iomuxc {
imx6qdl-gw51xx {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT5__GPIO5_IO23 0x0001b0b0
+ MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x4001b0b0
+ >;
+ };
+
pinctrl_enet: enetgrp {
fsl,pins = <
MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b030
@@ -372,6 +410,22 @@
>;
};
+ pinctrl_ipu1_csi0: ipu1csi0grp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x1b0b0
+ MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x1b0b0
+ MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x1b0b0
+ MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x1b0b0
+ >;
+ };
+
pinctrl_pcie: pciegrp {
fsl,pins = <
MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x1b0b0
diff --git a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
index 91991d63a69c..115d706228ef 100644
--- a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
@@ -377,7 +377,6 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
- uart-has-rtscts;
rts-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
index 5bc6ed1a5b35..24be7965056c 100644
--- a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
@@ -368,7 +368,6 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
- uart-has-rtscts;
rts-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
index 66fcf838e964..4594b2279169 100644
--- a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
@@ -416,7 +416,6 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
- uart-has-rtscts;
rts-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-gw553x.dtsi b/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
index 57374dddf98d..1a0faa1a14c8 100644
--- a/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw553x.dtsi
@@ -261,6 +261,37 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c3>;
status = "okay";
+
+ adv7180: camera@20 {
+ compatible = "adi,adv7180";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adv7180>;
+ reg = <0x20>;
+ powerdown-gpios = <&gpio5 20 GPIO_ACTIVE_LOW>;
+ interrupt-parent = <&gpio5>;
+ interrupts = <23 IRQ_TYPE_LEVEL_LOW>;
+
+ port {
+ adv7180_to_ipu1_csi0_mux: endpoint {
+ remote-endpoint = <&ipu1_csi0_mux_from_parallel_sensor>;
+ bus-width = <8>;
+ };
+ };
+ };
+};
+
+&ipu1_csi0_from_ipu1_csi0_mux {
+ bus-width = <8>;
+};
+
+&ipu1_csi0_mux_from_parallel_sensor {
+ remote-endpoint = <&adv7180_to_ipu1_csi0_mux>;
+ bus-width = <8>;
+};
+
+&ipu1_csi0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_csi0>;
};
&pcie {
@@ -340,6 +371,13 @@
};
&iomuxc {
+ pinctrl_adv7180: adv7180grp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT5__GPIO5_IO23 0x0001b0b0
+ MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x4001b0b0
+ >;
+ };
+
pinctrl_gpmi_nand: gpminandgrp {
fsl,pins = <
MX6QDL_PAD_NANDF_CLE__NAND_CLE 0xb0b1
@@ -387,6 +425,22 @@
>;
};
+ pinctrl_ipu1_csi0: ipu1csi0grp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x1b0b0
+ MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x1b0b0
+ MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x1b0b0
+ MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x1b0b0
+ MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x1b0b0
+ >;
+ };
+
pinctrl_gpio_leds: gpioledsgrp {
fsl,pins = <
MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x1b0b0
diff --git a/arch/arm/boot/dts/imx6qdl-icore-rqs.dtsi b/arch/arm/boot/dts/imx6qdl-icore-rqs.dtsi
index 5fab5be414fe..7ca291e9dbdb 100644
--- a/arch/arm/boot/dts/imx6qdl-icore-rqs.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-icore-rqs.dtsi
@@ -184,7 +184,6 @@
};
&ssi1 {
- fsl,mode = "i2s-slave";
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi b/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
index f22e5879340b..d309a4d0eb08 100644
--- a/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
@@ -108,6 +108,18 @@
startup-delay-us = <70000>;
enable-active-high;
};
+
+ reg_usb_h1_vbus: regulator@5 {
+ compatible = "regulator-fixed";
+ reg = <5>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usbh1>;
+ regulator-name = "usb_h1_vbus";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
};
gpio-keys {
@@ -515,6 +527,12 @@
>;
};
+ pinctrl_usbh1: usbh1grp {
+ fsl,pins = <
+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x030b0
+ >;
+ };
+
pinctrl_usbotg: usbotggrp {
fsl,pins = <
MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
@@ -629,6 +647,7 @@
};
&usbh1 {
+ vbus-supply = <&reg_usb_h1_vbus>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi b/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
index afe7449c47da..756c5054f047 100644
--- a/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
@@ -123,6 +123,18 @@
regulator-max-microvolt = <2800000>;
regulator-always-on;
};
+
+ reg_usb_h1_vbus: regulator@7 {
+ compatible = "regulator-fixed";
+ reg = <7>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usbh1>;
+ regulator-name = "usb_h1_vbus";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
};
mipi_xclk: mipi_xclk {
@@ -610,6 +622,12 @@
>;
};
+ pinctrl_usbh1: usbh1grp {
+ fsl,pins = <
+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x030b0
+ >;
+ };
+
pinctrl_usbotg: usbotggrp {
fsl,pins = <
MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
@@ -705,6 +723,7 @@
};
&usbh1 {
+ vbus-supply = <&reg_usb_h1_vbus>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi b/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi
index 5d94b5ee6aa0..eeb7679fd348 100644
--- a/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi
@@ -59,6 +59,14 @@
pinctrl-0 = <&pinctrl_mdio1>;
gpios = <&gpio6 5 GPIO_ACTIVE_HIGH
&gpio6 4 GPIO_ACTIVE_HIGH>;
+
+ phy: ethernet-phy@0 {
+ pinctrl-0 = <&pinctrl_rmii_phy_irq>;
+ pinctrl-names = "default";
+ reg = <0>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <30 IRQ_TYPE_LEVEL_LOW>;
+ };
};
reg_28p0v: regulator-28p0v {
@@ -615,14 +623,106 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet>;
phy-mode = "rmii";
+ phy-handle = <&phy>;
phy-reset-gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;
phy-reset-duration = <100>;
phy-supply = <&reg_3p3v>;
status = "okay";
- fixed-link {
- speed = <100>;
- full-duplex;
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "okay";
+
+ switch: switch@0 {
+ compatible = "marvell,mv88e6085";
+ pinctrl-0 = <&pinctrl_switch_irq>;
+ pinctrl-names = "default";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+ dsa,member = <0 0>;
+ eeprom-length = <512>;
+ interrupt-parent = <&gpio6>;
+ interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ label = "gigabit_proc";
+ phy-handle = <&switchphy0>;
+ };
+
+ port@1 {
+ reg = <1>;
+ label = "netaux";
+ phy-handle = <&switchphy1>;
+ };
+
+ port@2 {
+ reg = <2>;
+ label = "cpu";
+ ethernet = <&fec>;
+
+ fixed-link {
+ speed = <100>;
+ full-duplex;
+ };
+ };
+
+ port@3 {
+ reg = <3>;
+ label = "netright";
+ phy-handle = <&switchphy3>;
+ };
+
+ port@4 {
+ reg = <4>;
+ label = "netleft";
+ phy-handle = <&switchphy4>;
+ };
+ };
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ switchphy0: switchphy@0 {
+ reg = <0>;
+ interrupt-parent = <&switch>;
+ interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ switchphy1: switchphy@1 {
+ reg = <1>;
+ interrupt-parent = <&switch>;
+ interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ switchphy2: switchphy@2 {
+ reg = <2>;
+ interrupt-parent = <&switch>;
+ interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ switchphy3: switchphy@3 {
+ reg = <3>;
+ interrupt-parent = <&switch>;
+ interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ switchphy4: switchphy@4 {
+ reg = <4>;
+ interrupt-parent = <&switch>;
+ interrupts = <4 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+ };
};
};
@@ -840,6 +940,12 @@
>;
};
+ pinctrl_switch_irq: switchgrp {
+ fsl,pins = <
+ MX6QDL_PAD_CSI0_DAT17__GPIO6_IO03 0x4001b000
+ >;
+ };
+
pinctrl_tc358767: tc358767grp {
fsl,pins = <
MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x10
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
index a9723b94bafa..8884b4a3cafb 100644
--- a/arch/arm/boot/dts/imx6qdl.dtsi
+++ b/arch/arm/boot/dts/imx6qdl.dtsi
@@ -769,6 +769,7 @@
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
+ value = <0x60>;
mask = <0x60>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi
index 3243af4a9984..3f76f980947e 100644
--- a/arch/arm/boot/dts/imx6sl.dtsi
+++ b/arch/arm/boot/dts/imx6sl.dtsi
@@ -655,6 +655,7 @@
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
+ value = <0x60>;
mask = <0x60>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi
index f16b9df9d0c6..6c7eb54be9e2 100644
--- a/arch/arm/boot/dts/imx6sx.dtsi
+++ b/arch/arm/boot/dts/imx6sx.dtsi
@@ -710,6 +710,7 @@
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
+ value = <0x60>;
mask = <0x60>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dts b/arch/arm/boot/dts/imx6ul-14x14-evk.dts
index d2be8aa3370b..9c23e017d86a 100644
--- a/arch/arm/boot/dts/imx6ul-14x14-evk.dts
+++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dts
@@ -22,7 +22,7 @@
reg = <0x80000000 0x20000000>;
};
- backlight {
+ backlight_display: backlight-display {
compatible = "pwm-backlight";
pwms = <&pwm1 0 5000000>;
brightness-levels = <0 4 8 16 32 64 128 255>;
@@ -78,6 +78,17 @@
clocks = <&clks IMX6UL_CLK_SAI2>;
};
};
+
+ panel {
+ compatible = "innolux,at043tn24";
+ backlight = <&backlight_display>;
+
+ port {
+ panel_in: endpoint {
+ remote-endpoint = <&display_out>;
+ };
+ };
+ };
};
&clks {
@@ -139,31 +150,11 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
- display = <&display0>;
status = "okay";
- display0: display {
- bits-per-pixel = <16>;
- bus-width = <24>;
-
- display-timings {
- native-mode = <&timing0>;
-
- timing0: timing0 {
- clock-frequency = <9200000>;
- hactive = <480>;
- vactive = <272>;
- hfront-porch = <8>;
- hback-porch = <4>;
- hsync-len = <41>;
- vback-porch = <2>;
- vfront-porch = <4>;
- vsync-len = <10>;
- hsync-active = <0>;
- vsync-active = <0>;
- de-active = <1>;
- pixelclk-active = <0>;
- };
+ port {
+ display_out: endpoint {
+ remote-endpoint = <&panel_in>;
};
};
};
@@ -316,7 +307,6 @@
MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b031
- MX6UL_PAD_SNVS_TAMPER0__GPIO5_IO00 0x17059
>;
};
diff --git a/arch/arm/boot/dts/imx6ul-geam.dtsi b/arch/arm/boot/dts/imx6ul-geam.dts
index eb94d956808b..571eea7f1c6b 100644
--- a/arch/arm/boot/dts/imx6ul-geam.dtsi
+++ b/arch/arm/boot/dts/imx6ul-geam.dts
@@ -40,11 +40,16 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
+/dts-v1/;
+
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include "imx6ul.dtsi"
/ {
+ model = "Engicam GEAM6UL Starter Kit";
+ compatible = "engicam,imx6ul-geam", "fsl,imx6ul";
+
memory {
reg = <0x80000000 0x08000000>;
};
@@ -87,18 +92,46 @@
regulator-always-on;
regulator-boot-on;
};
+
+ sound {
+ compatible = "simple-audio-card";
+ simple-audio-card,name = "imx6ul-geam-sgtl5000";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,bitclock-master = <&dailink_master>;
+ simple-audio-card,frame-master = <&dailink_master>;
+ simple-audio-card,widgets =
+ "Microphone", "Mic Jack",
+ "Line", "Line In",
+ "Line", "Line Out",
+ "Headphone", "Headphone Jack";
+ simple-audio-card,routing =
+ "MIC_IN", "Mic Jack",
+ "Mic Jack", "Mic Bias",
+ "Headphone Jack", "HP_OUT";
+
+ simple-audio-card,cpu {
+ sound-dai = <&sai2>;
+ };
+
+ dailink_master: simple-audio-card,codec {
+ sound-dai = <&sgtl5000>;
+ clocks = <&clks IMX6UL_CLK_SAI2>;
+ };
+ };
};
&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
xceiver-supply = <&reg_3p3v>;
+ status = "okay";
};
&can2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan2>;
xceiver-supply = <&reg_3p3v>;
+ status = "okay";
};
&fec1 {
@@ -144,6 +177,16 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
+
+ sgtl5000: codec@a {
+ compatible = "fsl,sgtl5000";
+ reg = <0x0a>;
+ clocks = <&clks IMX6UL_CLK_OSC>;
+ clock-names = "mclk";
+ VDDA-supply = <&reg_3p3v>;
+ VDDIO-supply = <&reg_3p3v>;
+ VDDD-supply = <&reg_1p8v>;
+ };
};
&i2c2 {
@@ -158,6 +201,31 @@
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
display = <&display0>;
+ status = "okay";
+
+ display0: display {
+ bits-per-pixel = <16>;
+ bus-width = <18>;
+
+ display-timings {
+ native-mode = <&timing0>;
+ timing0: timing0 {
+ clock-frequency = <28000000>;
+ hactive = <800>;
+ vactive = <480>;
+ hfront-porch = <30>;
+ hback-porch = <30>;
+ hsync-len = <64>;
+ vback-porch = <5>;
+ vfront-porch = <5>;
+ vsync-len = <20>;
+ hsync-active = <0>;
+ vsync-active = <0>;
+ de-active = <1>;
+ pixelclk-active = <0>;
+ };
+ };
+ };
};
&pwm8 {
@@ -178,6 +246,12 @@
status = "okay";
};
+&tsc {
+ measure-delay-time = <0x1ffff>;
+ pre-charge-time = <0x1fff>;
+ status = "okay";
+};
+
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
diff --git a/arch/arm/boot/dts/imx6ul-isiot-common.dtsi b/arch/arm/boot/dts/imx6ul-isiot-common.dtsi
deleted file mode 100644
index 2beaab6e272e..000000000000
--- a/arch/arm/boot/dts/imx6ul-isiot-common.dtsi
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2016 Amarula Solutions B.V.
- * Copyright (C) 2016 Engicam S.r.l.
- *
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- * a) This file is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- * b) Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-&i2c1 {
- stmpe811: gpio-expander@44 {
- compatible = "st,stmpe811";
- reg = <0x44>;
- #address-cells = <1>;
- #size-cells = <0>;
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_stmpe>;
- interrupt-parent = <&gpio1>;
- interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
- interrupt-controller;
- #interrupt-cells = <2>;
-
- stmpe: touchscreen {
- compatible = "st,stmpe-ts";
- st,sample-time = <4>;
- st,mod-12b = <1>;
- st,ref-sel = <0>;
- st,adc-freq = <1>;
- st,ave-ctrl = <1>;
- st,touch-det-delay = <2>;
- st,settling = <2>;
- st,fraction-z = <7>;
- st,i-drive = <1>;
- };
- };
-};
-
-&lcdif {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_lcdif_dat
- &pinctrl_lcdif_ctrl>;
- display = <&display0>;
- status = "okay";
-
- display0: display {
- bits-per-pixel = <16>;
- bus-width = <18>;
-
- display-timings {
- native-mode = <&timing0>;
- timing0: timing0 {
- clock-frequency = <28000000>;
- hactive = <800>;
- vactive = <480>;
- hfront-porch = <30>;
- hback-porch = <30>;
- hsync-len = <64>;
- vback-porch = <5>;
- vfront-porch = <5>;
- vsync-len = <20>;
- hsync-active = <0>;
- vsync-active = <0>;
- de-active = <1>;
- pixelclk-active = <0>;
- };
- };
- };
-};
-
-&iomuxc {
- pinctrl_lcdif_ctrl: lcdifctrlgrp {
- fsl,pins = <
- MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79
- MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79
- MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79
- MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79
- >;
- };
-
- pinctrl_lcdif_dat: lcdifdatgrp {
- fsl,pins = <
- MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79
- MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79
- MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79
- MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79
- MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79
- MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79
- MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79
- MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79
- MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79
- MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79
- MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79
- MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79
- MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79
- MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79
- MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79
- MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79
- MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79
- MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79
- >;
- };
-
- pinctrl_stmpe: stmpegrp {
- fsl,pins = <
- MX6UL_PAD_UART1_CTS_B__GPIO1_IO18 0x1b0b0
- >;
- };
-};
diff --git a/arch/arm/boot/dts/imx6ul-isiot-emmc.dts b/arch/arm/boot/dts/imx6ul-isiot-emmc.dts
index 73a1d0f0b9d5..f5b422898e61 100644
--- a/arch/arm/boot/dts/imx6ul-isiot-emmc.dts
+++ b/arch/arm/boot/dts/imx6ul-isiot-emmc.dts
@@ -43,7 +43,6 @@
/dts-v1/;
#include "imx6ul-isiot.dtsi"
-#include "imx6ul-isiot-common.dtsi"
/ {
model = "Engicam Is.IoT MX6UL eMMC Starter kit";
diff --git a/arch/arm/boot/dts/imx6ul-isiot-nand.dts b/arch/arm/boot/dts/imx6ul-isiot-nand.dts
index da29a86eb6a8..de15e1c75dd1 100644
--- a/arch/arm/boot/dts/imx6ul-isiot-nand.dts
+++ b/arch/arm/boot/dts/imx6ul-isiot-nand.dts
@@ -43,7 +43,6 @@
/dts-v1/;
#include "imx6ul-isiot.dtsi"
-#include "imx6ul-isiot-common.dtsi"
/ {
model = "Engicam Is.IoT MX6UL NAND Starter kit";
diff --git a/arch/arm/boot/dts/imx6ul-isiot.dtsi b/arch/arm/boot/dts/imx6ul-isiot.dtsi
index ea30380ad7a4..950fb28b630a 100644
--- a/arch/arm/boot/dts/imx6ul-isiot.dtsi
+++ b/arch/arm/boot/dts/imx6ul-isiot.dtsi
@@ -69,6 +69,68 @@
100>;
default-brightness-level = <100>;
};
+
+ reg_1p8v: regulator-1p8v {
+ compatible = "regulator-fixed";
+ regulator-name = "1P8V";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ reg_3p3v: regulator-3p3v {
+ compatible = "regulator-fixed";
+ regulator-name = "3P3V";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ sound {
+ compatible = "simple-audio-card";
+ simple-audio-card,name = "imx6ul-isiot-sgtl5000";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,bitclock-master = <&dailink_master>;
+ simple-audio-card,frame-master = <&dailink_master>;
+ simple-audio-card,widgets =
+ "Microphone", "Mic Jack",
+ "Line", "Line In",
+ "Line", "Line Out",
+ "Headphone", "Headphone Jack";
+ simple-audio-card,routing =
+ "MIC_IN", "Mic Jack",
+ "Mic Jack", "Mic Bias",
+ "Headphone Jack", "HP_OUT";
+
+ simple-audio-card,cpu {
+ sound-dai = <&sai2>;
+ };
+
+ dailink_master: simple-audio-card,codec {
+ sound-dai = <&sgtl5000>;
+ clocks = <&clks IMX6UL_CLK_SAI2>;
+ };
+ };
+};
+
+&fec1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_enet1>;
+ phy-mode = "rmii";
+ phy-handle = <&ethphy0>;
+ status = "okay";
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ethphy0: ethernet-phy@0 {
+ compatible = "ethernet-phy-ieee802.3-c22";
+ reg = <0>;
+ };
+ };
};
&i2c1 {
@@ -76,6 +138,42 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
+
+ sgtl5000: codec@a {
+ compatible = "fsl,sgtl5000";
+ reg = <0x0a>;
+ clocks = <&clks IMX6UL_CLK_OSC>;
+ clock-names = "mclk";
+ VDDA-supply = <&reg_3p3v>;
+ VDDIO-supply = <&reg_3p3v>;
+ VDDD-supply = <&reg_1p8v>;
+ };
+
+ stmpe811: gpio-expander@44 {
+ compatible = "st,stmpe811";
+ reg = <0x44>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_stmpe>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+
+ stmpe: touchscreen {
+ compatible = "st,stmpe-ts";
+ st,sample-time = <4>;
+ st,mod-12b = <1>;
+ st,ref-sel = <0>;
+ st,adc-freq = <1>;
+ st,ave-ctrl = <1>;
+ st,touch-det-delay = <2>;
+ st,settling = <2>;
+ st,fraction-z = <7>;
+ st,i-drive = <1>;
+ };
+ };
};
&i2c2 {
@@ -85,6 +183,38 @@
status = "okay";
};
+&lcdif {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_lcdif_dat
+ &pinctrl_lcdif_ctrl>;
+ display = <&display0>;
+ status = "okay";
+
+ display0: display {
+ bits-per-pixel = <16>;
+ bus-width = <18>;
+
+ display-timings {
+ native-mode = <&timing0>;
+ timing0: timing0 {
+ clock-frequency = <28000000>;
+ hactive = <800>;
+ vactive = <480>;
+ hfront-porch = <30>;
+ hback-porch = <30>;
+ hsync-len = <64>;
+ vback-porch = <5>;
+ vfront-porch = <5>;
+ vsync-len = <20>;
+ hsync-active = <0>;
+ vsync-active = <0>;
+ de-active = <1>;
+ pixelclk-active = <0>;
+ };
+ };
+ };
+};
+
&pwm8 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm8>;
@@ -115,6 +245,21 @@
};
&iomuxc {
+ pinctrl_enet1: enet1grp {
+ fsl,pins = <
+ MX6UL_PAD_ENET2_RX_DATA0__ENET1_MDIO 0x1b0b0
+ MX6UL_PAD_ENET2_RX_DATA1__ENET1_MDC 0x1b0b0
+ MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
+ MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
+ MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
+ MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
+ MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
+ MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
+ MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b031
+ MX6UL_PAD_ENET2_RX_EN__GPIO2_IO10 0x1b0b0
+ >;
+ };
+
pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
@@ -129,6 +274,38 @@
>;
};
+ pinctrl_lcdif_ctrl: lcdifctrlgrp {
+ fsl,pins = <
+ MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79
+ MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79
+ MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79
+ MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79
+ >;
+ };
+
+ pinctrl_lcdif_dat: lcdifdatgrp {
+ fsl,pins = <
+ MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79
+ MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79
+ MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79
+ MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79
+ MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79
+ MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79
+ MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79
+ MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79
+ MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79
+ MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79
+ MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79
+ MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79
+ MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79
+ MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79
+ MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79
+ MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79
+ MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79
+ MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79
+ >;
+ };
+
pinctrl_pwm8: pwm8grp {
fsl,pins = <
MX6UL_PAD_ENET1_RX_ER__PWM8_OUT 0x110b0
@@ -145,6 +322,12 @@
>;
};
+ pinctrl_stmpe: stmpegrp {
+ fsl,pins = <
+ MX6UL_PAD_UART1_CTS_B__GPIO1_IO18 0x1b0b0
+ >;
+ };
+
pinctrl_uart1: uart1grp {
fsl,pins = <
MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1
diff --git a/arch/arm/boot/dts/imx6ul-liteboard.dts b/arch/arm/boot/dts/imx6ul-liteboard.dts
index ed1d891d6a89..1d863a16bcf0 100644
--- a/arch/arm/boot/dts/imx6ul-liteboard.dts
+++ b/arch/arm/boot/dts/imx6ul-liteboard.dts
@@ -124,6 +124,10 @@
};
};
+&snvs_poweroff {
+ status = "okay";
+};
+
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi
index 6da2b77edd46..f11a241a340d 100644
--- a/arch/arm/boot/dts/imx6ul.dtsi
+++ b/arch/arm/boot/dts/imx6ul.dtsi
@@ -614,6 +614,7 @@
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
+ value = <0x60>;
mask = <0x60>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/imx7-colibri.dtsi b/arch/arm/boot/dts/imx7-colibri.dtsi
index d7753f79937a..0a3915868aa3 100644
--- a/arch/arm/boot/dts/imx7-colibri.dtsi
+++ b/arch/arm/boot/dts/imx7-colibri.dtsi
@@ -106,6 +106,15 @@
fsl,magic-packet;
};
+&gpmi {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpmi_nand>;
+ fsl,use-minimum-ecc;
+ nand-on-flash-bbt;
+ nand-ecc-mode = "hw";
+ status = "okay";
+};
+
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/imx7d-sdb.dts b/arch/arm/boot/dts/imx7d-sdb.dts
index 0a24d1bf3c39..44637cabcc56 100644
--- a/arch/arm/boot/dts/imx7d-sdb.dts
+++ b/arch/arm/boot/dts/imx7d-sdb.dts
@@ -117,6 +117,37 @@
regulator-max-microvolt = <3300000>;
startup-delay-us = <200000>;
};
+
+ reg_lcd_3v3: regulator-lcd-3v3 {
+ compatible = "regulator-fixed";
+ regulator-name = "lcd-3v3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&extended_io 7 GPIO_ACTIVE_LOW>;
+ };
+
+ reg_can2_3v3: regulator-can2-3v3 {
+ compatible = "regulator-fixed";
+ regulator-name = "can2-3v3";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flexcan2_reg>;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio2 14 GPIO_ACTIVE_LOW>;
+ };
+
+ panel {
+ compatible = "innolux,at043tn24";
+ pinctrl-0 = <&pinctrl_backlight>;
+ enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
+ power-supply = <&reg_lcd_3v3>;
+
+ port {
+ panel_in: endpoint {
+ remote-endpoint = <&display_out>;
+ };
+ };
+ };
};
&adc1 {
@@ -168,6 +199,7 @@
phy-mode = "rgmii";
phy-handle = <&ethphy0>;
fsl,magic-packet;
+ phy-reset-gpios = <&extended_io 5 GPIO_ACTIVE_LOW>;
status = "okay";
mdio {
@@ -197,6 +229,13 @@
status = "okay";
};
+&flexcan2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_flexcan2>;
+ xceiver-supply = <&reg_can2_3v3>;
+ status = "okay";
+};
+
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
@@ -285,8 +324,8 @@
};
vgen6_reg: vldo4 {
- regulator-min-microvolt = <1800000>;
- regulator-max-microvolt = <3300000>;
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
regulator-always-on;
};
};
@@ -322,31 +361,11 @@
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif>;
- display = <&display0>;
status = "okay";
- display0: display {
- bits-per-pixel = <16>;
- bus-width = <24>;
-
- display-timings {
- native-mode = <&timing0>;
-
- timing0: timing0 {
- clock-frequency = <9200000>;
- hactive = <480>;
- vactive = <272>;
- hfront-porch = <8>;
- hback-porch = <4>;
- hsync-len = <41>;
- vback-porch = <2>;
- vfront-porch = <4>;
- vsync-len = <10>;
- hsync-active = <0>;
- vsync-active = <0>;
- de-active = <1>;
- pixelclk-active = <0>;
- };
+ port {
+ display_out: endpoint {
+ remote-endpoint = <&panel_in>;
};
};
};
@@ -356,12 +375,6 @@
status = "okay";
};
-&pwm1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_pwm1>;
- status = "okay";
-};
-
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1>;
@@ -488,6 +501,20 @@
>;
};
+ pinctrl_flexcan2: flexcan2grp {
+ fsl,pins = <
+ MX7D_PAD_GPIO1_IO14__FLEXCAN2_RX 0x59
+ MX7D_PAD_GPIO1_IO15__FLEXCAN2_TX 0x59
+ >;
+ };
+
+ pinctrl_flexcan2_reg: flexcan2reggrp {
+ fsl,pins = <
+ MX7D_PAD_EPDC_DATA14__GPIO2_IO14 0x59 /* CAN_STBY */
+ >;
+ };
+
+
pinctrl_hog: hoggrp {
fsl,pins = <
MX7D_PAD_UART3_CTS_B__GPIO4_IO7 0x14
@@ -701,9 +728,9 @@
>;
};
- pinctrl_pwm1: pwm1grp {
+ pinctrl_backlight: backlightgrp {
fsl,pins = <
- MX7D_PAD_LPSR_GPIO1_IO01__PWM1_OUT 0x110b0
+ MX7D_PAD_LPSR_GPIO1_IO01__GPIO1_IO1 0x110b0
>;
};
};
diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 4cf6c458b583..82ad26e766eb 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -540,6 +540,7 @@
compatible = "syscon-poweroff";
regmap = <&snvs>;
offset = <0x38>;
+ value = <0x60>;
mask = <0x60>;
};
@@ -1021,5 +1022,36 @@
status = "disabled";
};
};
+
+ dma_apbh: dma-apbh@33000000 {
+ compatible = "fsl,imx7d-dma-apbh", "fsl,imx28-dma-apbh";
+ reg = <0x33000000 0x2000>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "gpmi0", "gpmi1", "gpmi2", "gpmi3";
+ #dma-cells = <1>;
+ dma-channels = <4>;
+ clocks = <&clks IMX7D_NAND_USDHC_BUS_RAWNAND_CLK>;
+ };
+
+ gpmi: gpmi-nand@33002000{
+ compatible = "fsl,imx7d-gpmi-nand";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
+ reg-names = "gpmi-nand", "bch";
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "bch";
+ clocks = <&clks IMX7D_NAND_RAWNAND_CLK>,
+ <&clks IMX7D_NAND_USDHC_BUS_RAWNAND_CLK>;
+ clock-names = "gpmi_io", "gpmi_bch_apb";
+ dmas = <&dma_apbh 0>;
+ dma-names = "rx-tx";
+ status = "disabled";
+ assigned-clocks = <&clks IMX7D_NAND_ROOT_SRC>;
+ assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_500M_CLK>;
+ };
};
};
diff --git a/arch/arm/boot/dts/keystone-k2e-evm.dts b/arch/arm/boot/dts/keystone-k2e-evm.dts
index ae1ebe7ee021..f1f32c54e72f 100644
--- a/arch/arm/boot/dts/keystone-k2e-evm.dts
+++ b/arch/arm/boot/dts/keystone-k2e-evm.dts
@@ -16,6 +16,19 @@
compatible = "ti,k2e-evm", "ti,k2e", "ti,keystone";
model = "Texas Instruments Keystone 2 Edison EVM";
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ status = "okay";
+ };
+ };
+
soc {
clocks {
@@ -160,3 +173,8 @@
reg = <1>;
};
};
+
+&dsp0 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/keystone-k2e.dtsi b/arch/arm/boot/dts/keystone-k2e.dtsi
index 0dd4cdd6d40c..819ab8345916 100644
--- a/arch/arm/boot/dts/keystone-k2e.dtsi
+++ b/arch/arm/boot/dts/keystone-k2e.dtsi
@@ -45,6 +45,10 @@
};
};
+ aliases {
+ rproc0 = &dsp0;
+ };
+
soc {
/include/ "keystone-k2e-clocks.dtsi"
@@ -114,6 +118,22 @@
gpio,syscon-dev = <&devctrl 0x240>;
};
+ dsp0: dsp@10800000 {
+ compatible = "ti,k2e-dsp";
+ reg = <0x10800000 0x00080000>,
+ <0x10e00000 0x00008000>,
+ <0x10f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem0>;
+ ti,syscon-dev = <&devctrl 0x844>;
+ resets = <&pscrst 0>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <0 8>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio0 27 0>;
+ status = "disabled";
+ };
+
pcie1: pcie@21020000 {
compatible = "ti,keystone-pcie","snps,dw-pcie";
clocks = <&clkpcie1>;
diff --git a/arch/arm/boot/dts/keystone-k2g-evm.dts b/arch/arm/boot/dts/keystone-k2g-evm.dts
index 61883cb969d2..f462f1043531 100644
--- a/arch/arm/boot/dts/keystone-k2g-evm.dts
+++ b/arch/arm/boot/dts/keystone-k2g-evm.dts
@@ -25,6 +25,26 @@
reg = <0x00000008 0x00000000 0x00000000 0x80000000>;
};
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ status = "okay";
+ };
+ };
+
+ vcc3v3_dcin_reg: fixedregulator-vcc3v3-dcin {
+ compatible = "regulator-fixed";
+ regulator-name = "mmc0_fixed";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ };
};
&k2g_pinctrl {
@@ -34,6 +54,33 @@
K2G_CORE_IOPAD(0x11d0) (BUFFER_CLASS_B | PIN_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
>;
};
+
+ mmc0_pins: pinmux_mmc0_pins {
+ pinctrl-single,pins = <
+ K2G_CORE_IOPAD(0x1300) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_dat3.mmc0_dat3 */
+ K2G_CORE_IOPAD(0x1304) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_dat2.mmc0_dat2 */
+ K2G_CORE_IOPAD(0x1308) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_dat1.mmc0_dat1 */
+ K2G_CORE_IOPAD(0x130c) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_dat0.mmc0_dat0 */
+ K2G_CORE_IOPAD(0x1310) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_clk.mmc0_clk */
+ K2G_CORE_IOPAD(0x1314) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE2) /* mmc0_cmd.mmc0_cmd */
+ K2G_CORE_IOPAD(0x12ec) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE3) /* mmc0_sdcd.gpio1_12 */
+ >;
+ };
+
+ mmc1_pins: pinmux_mmc1_pins {
+ pinctrl-single,pins = <
+ K2G_CORE_IOPAD(0x10ec) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat7.mmc1_dat7 */
+ K2G_CORE_IOPAD(0x10f0) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat6.mmc1_dat6 */
+ K2G_CORE_IOPAD(0x10f4) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat5.mmc1_dat5 */
+ K2G_CORE_IOPAD(0x10f8) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat4.mmc1_dat4 */
+ K2G_CORE_IOPAD(0x10fc) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat3.mmc1_dat3 */
+ K2G_CORE_IOPAD(0x1100) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat2.mmc1_dat2 */
+ K2G_CORE_IOPAD(0x1104) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat1.mmc1_dat1 */
+ K2G_CORE_IOPAD(0x1108) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_dat0.mmc1_dat0 */
+ K2G_CORE_IOPAD(0x110c) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_clk.mmc1_clk */
+ K2G_CORE_IOPAD(0x1110) (BUFFER_CLASS_B | PIN_PULLUP | MUX_MODE0) /* mmc1_cmd.mmc1_cmd */
+ >;
+ };
};
&uart0 {
@@ -41,3 +88,27 @@
pinctrl-0 = <&uart0_pins>;
status = "okay";
};
+
+&gpio1 {
+ status = "okay";
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&vcc3v3_dcin_reg>;
+ cd-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
+ status = "okay";
+};
+
+&mmc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc1_pins>;
+ vmmc-supply = <&vcc3v3_dcin_reg>; /* VCC3V3_EMMC is connected to VCC3V3_DCIN */
+ status = "okay";
+};
+
+&dsp0 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/keystone-k2g-ice.dts b/arch/arm/boot/dts/keystone-k2g-ice.dts
index d820d37b5148..78692745e0af 100644
--- a/arch/arm/boot/dts/keystone-k2g-ice.dts
+++ b/arch/arm/boot/dts/keystone-k2g-ice.dts
@@ -17,6 +17,19 @@
device_type = "memory";
reg = <0x00000008 0x00000000 0x00000000 0x20000000>;
};
+
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ status = "okay";
+ };
+ };
};
&k2g_pinctrl {
@@ -33,3 +46,8 @@
pinctrl-0 = <&uart0_pins>;
status = "okay";
};
+
+&dsp0 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/keystone-k2g.dtsi b/arch/arm/boot/dts/keystone-k2g.dtsi
index a789f75a1ed5..826b286665e6 100644
--- a/arch/arm/boot/dts/keystone-k2g.dtsi
+++ b/arch/arm/boot/dts/keystone-k2g.dtsi
@@ -15,6 +15,7 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/pinctrl/keystone.h>
+#include <dt-bindings/gpio/gpio.h>
/ {
compatible = "ti,k2g","ti,keystone";
@@ -27,6 +28,7 @@
aliases {
serial0 = &uart0;
+ rproc0 = &dsp0;
};
cpus {
@@ -113,6 +115,24 @@
status = "disabled";
};
+ dcan0: can@0260B200 {
+ compatible = "ti,am4372-d_can", "ti,am3352-d_can";
+ reg = <0x0260B200 0x200>;
+ interrupts = <GIC_SPI 190 IRQ_TYPE_EDGE_RISING>;
+ status = "disabled";
+ power-domains = <&k2g_pds 0x0008>;
+ clocks = <&k2g_clks 0x0008 1>;
+ };
+
+ dcan1: can@0260B400 {
+ compatible = "ti,am4372-d_can", "ti,am3352-d_can";
+ reg = <0x0260B400 0x200>;
+ interrupts = <GIC_SPI 193 IRQ_TYPE_EDGE_RISING>;
+ status = "disabled";
+ power-domains = <&k2g_pds 0x0009>;
+ clocks = <&k2g_clks 0x0009 1>;
+ };
+
kirq0: keystone_irq@026202a0 {
compatible = "ti,keystone-irq";
interrupts = <GIC_SPI 1 IRQ_TYPE_EDGE_RISING>;
@@ -128,6 +148,22 @@
gpio,syscon-dev = <&devctrl 0x240>;
};
+ dsp0: dsp@10800000 {
+ compatible = "ti,k2g-dsp";
+ reg = <0x10800000 0x00100000>,
+ <0x10e00000 0x00008000>,
+ <0x10f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ power-domains = <&k2g_pds 0x0046>;
+ ti,syscon-dev = <&devctrl 0x844>;
+ resets = <&k2g_reset 0x0046 0x1>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <0 8>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio0 27 0>;
+ status = "disabled";
+ };
+
msgmgr: msgmgr@02a00000 {
compatible = "ti,k2g-message-manager";
#mbox-cells = <2>;
@@ -139,5 +175,173 @@
interrupts = <GIC_SPI 324 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 327 IRQ_TYPE_LEVEL_HIGH>;
};
+
+ pmmc: pmmc@02921c00 {
+ compatible = "ti,k2g-sci";
+ /*
+ * In case of rare platforms that does not use k2g as
+ * system master, use /delete-property/
+ */
+ ti,system-reboot-controller;
+ mbox-names = "rx", "tx";
+ mboxes= <&msgmgr 5 2>,
+ <&msgmgr 0 0>;
+ reg-names = "debug_messages";
+ reg = <0x02921c00 0x400>;
+
+ k2g_pds: power-controller {
+ compatible = "ti,sci-pm-domain";
+ #power-domain-cells = <1>;
+ };
+
+ k2g_clks: clocks {
+ compatible = "ti,k2g-sci-clk";
+ #clock-cells = <2>;
+ };
+
+ k2g_reset: reset-controller {
+ compatible = "ti,sci-reset";
+ #reset-cells = <2>;
+ };
+ };
+
+ gpio0: gpio@2603000 {
+ compatible = "ti,k2g-gpio", "ti,keystone-gpio";
+ reg = <0x02603000 0x100>;
+ gpio-controller;
+ #gpio-cells = <2>;
+
+ interrupts = <GIC_SPI 432 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 433 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 434 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 435 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 436 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 437 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 438 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 439 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 440 IRQ_TYPE_EDGE_RISING>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ ti,ngpio = <144>;
+ ti,davinci-gpio-unbanked = <0>;
+ clocks = <&k2g_clks 0x001b 0x0>;
+ clock-names = "gpio";
+ };
+
+ gpio1: gpio@260a000 {
+ compatible = "ti,k2g-gpio", "ti,keystone-gpio";
+ reg = <0x0260a000 0x100>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupts = <GIC_SPI 442 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 443 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 444 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 445 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 446 IRQ_TYPE_EDGE_RISING>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ ti,ngpio = <68>;
+ ti,davinci-gpio-unbanked = <0>;
+ clocks = <&k2g_clks 0x001c 0x0>;
+ clock-names = "gpio";
+ };
+
+ edma0: edma@02700000 {
+ compatible = "ti,k2g-edma3-tpcc", "ti,edma3-tpcc";
+ reg = <0x02700000 0x8000>;
+ reg-names = "edma3_cc";
+ interrupts = <GIC_SPI 200 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 216 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 217 IRQ_TYPE_EDGE_RISING>;
+ interrupt-names = "edma3_ccint", "emda3_mperr",
+ "edma3_ccerrint";
+ dma-requests = <64>;
+ #dma-cells = <2>;
+
+ ti,tptcs = <&edma0_tptc0 7>, <&edma0_tptc1 0>;
+
+ ti,edma-memcpy-channels = <32 33 34 35>;
+
+ power-domains = <&k2g_pds 0x3f>;
+ };
+
+ edma0_tptc0: tptc@02760000 {
+ compatible = "ti,k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x02760000 0x400>;
+ power-domains = <&k2g_pds 0x3f>;
+ };
+
+ edma0_tptc1: tptc@02768000 {
+ compatible = "ti,k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x02768000 0x400>;
+ power-domains = <&k2g_pds 0x3f>;
+ };
+
+ edma1: edma@02728000 {
+ compatible = "ti,k2g-edma3-tpcc", "ti,edma3-tpcc";
+ reg = <0x02728000 0x8000>;
+ reg-names = "edma3_cc";
+ interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 219 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 220 IRQ_TYPE_EDGE_RISING>;
+ interrupt-names = "edma3_ccint", "emda3_mperr",
+ "edma3_ccerrint";
+ dma-requests = <64>;
+ #dma-cells = <2>;
+
+ ti,tptcs = <&edma1_tptc0 7>, <&edma1_tptc1 0>;
+
+ /*
+ * memcpy is disabled, can be enabled with:
+ * ti,edma-memcpy-channels = <12 13 14 15>;
+ * for example.
+ */
+
+ power-domains = <&k2g_pds 0x4f>;
+ };
+
+ edma1_tptc0: tptc@027b0000 {
+ compatible = "ti,k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x027b0000 0x400>;
+ power-domains = <&k2g_pds 0x4f>;
+ };
+
+ edma1_tptc1: tptc@027b8000 {
+ compatible = "ti,k2g-edma3-tptc", "ti,edma3-tptc";
+ reg = <0x027b8000 0x400>;
+ power-domains = <&k2g_pds 0x4f>;
+ };
+
+ mmc0: mmc@23000000 {
+ compatible = "ti,k2g-hsmmc", "ti,omap4-hsmmc";
+ reg = <0x23000000 0x400>;
+ interrupts = <GIC_SPI 96 IRQ_TYPE_EDGE_RISING>;
+ dmas = <&edma1 24 0>, <&edma1 25 0>;
+ dma-names = "tx", "rx";
+ bus-width = <4>;
+ ti,needs-special-reset;
+ no-1-8-v;
+ max-frequency = <96000000>;
+ power-domains = <&k2g_pds 0xb>;
+ clocks = <&k2g_clks 0xb 1>, <&k2g_clks 0xb 2>;
+ clock-names = "fck", "mmchsdb_fck";
+ status = "disabled";
+ };
+
+ mmc1: mmc@23100000 {
+ compatible = "ti,k2g-hsmmc", "ti,omap4-hsmmc";
+ reg = <0x23100000 0x400>;
+ interrupts = <GIC_SPI 97 IRQ_TYPE_EDGE_RISING>;
+ dmas = <&edma1 26 0>, <&edma1 27 0>;
+ dma-names = "tx", "rx";
+ bus-width = <8>;
+ ti,needs-special-reset;
+ ti,non-removable;
+ max-frequency = <96000000>;
+ power-domains = <&k2g_pds 0xc>;
+ clocks = <&k2g_clks 0xc 1>, <&k2g_clks 0xc 2>;
+ clock-names = "fck", "mmchsdb_fck";
+ status = "disabled";
+ };
};
};
diff --git a/arch/arm/boot/dts/keystone-k2hk-evm.dts b/arch/arm/boot/dts/keystone-k2hk-evm.dts
index 2156ff92d08f..6dd13b98aaba 100644
--- a/arch/arm/boot/dts/keystone-k2hk-evm.dts
+++ b/arch/arm/boot/dts/keystone-k2hk-evm.dts
@@ -16,6 +16,19 @@
compatible = "ti,k2hk-evm", "ti,k2hk", "ti,keystone";
model = "Texas Instruments Keystone 2 Kepler/Hawking EVM";
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ status = "okay";
+ };
+ };
+
soc {
clocks {
refclksys: refclksys {
@@ -184,3 +197,43 @@
reg = <1>;
};
};
+
+&dsp0 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp1 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp2 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp3 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp4 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp5 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp6 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp7 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/keystone-k2hk.dtsi b/arch/arm/boot/dts/keystone-k2hk.dtsi
index 69d449430511..31dc00e4e5fd 100644
--- a/arch/arm/boot/dts/keystone-k2hk.dtsi
+++ b/arch/arm/boot/dts/keystone-k2hk.dtsi
@@ -45,6 +45,17 @@
};
};
+ aliases {
+ rproc0 = &dsp0;
+ rproc1 = &dsp1;
+ rproc2 = &dsp2;
+ rproc3 = &dsp3;
+ rproc4 = &dsp4;
+ rproc5 = &dsp5;
+ rproc6 = &dsp6;
+ rproc7 = &dsp7;
+ };
+
soc {
/include/ "keystone-k2hk-clocks.dtsi"
@@ -134,6 +145,134 @@
gpio,syscon-dev = <&devctrl 0x25c>;
};
+ dsp0: dsp@10800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x10800000 0x00100000>,
+ <0x10e00000 0x00008000>,
+ <0x10f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem0>;
+ ti,syscon-dev = <&devctrl 0x40>;
+ resets = <&pscrst 0>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <0 8>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio0 27 0>;
+ status = "disabled";
+ };
+
+ dsp1: dsp@11800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x11800000 0x00100000>,
+ <0x11e00000 0x00008000>,
+ <0x11f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem1>;
+ ti,syscon-dev = <&devctrl 0x44>;
+ resets = <&pscrst 1>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <1 9>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio1 27 0>;
+ status = "disabled";
+ };
+
+ dsp2: dsp@12800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x12800000 0x00100000>,
+ <0x12e00000 0x00008000>,
+ <0x12f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem2>;
+ ti,syscon-dev = <&devctrl 0x48>;
+ resets = <&pscrst 2>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <2 10>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio2 27 0>;
+ status = "disabled";
+ };
+
+ dsp3: dsp@13800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x13800000 0x00100000>,
+ <0x13e00000 0x00008000>,
+ <0x13f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem3>;
+ ti,syscon-dev = <&devctrl 0x4c>;
+ resets = <&pscrst 3>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <3 11>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio3 27 0>;
+ status = "disabled";
+ };
+
+ dsp4: dsp@14800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x14800000 0x00100000>,
+ <0x14e00000 0x00008000>,
+ <0x14f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem4>;
+ ti,syscon-dev = <&devctrl 0x50>;
+ resets = <&pscrst 4>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <4 12>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio4 27 0>;
+ status = "disabled";
+ };
+
+ dsp5: dsp@15800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x15800000 0x00100000>,
+ <0x15e00000 0x00008000>,
+ <0x15f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem5>;
+ ti,syscon-dev = <&devctrl 0x54>;
+ resets = <&pscrst 5>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <5 13>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio5 27 0>;
+ status = "disabled";
+ };
+
+ dsp6: dsp@16800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x16800000 0x00100000>,
+ <0x16e00000 0x00008000>,
+ <0x16f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem6>;
+ ti,syscon-dev = <&devctrl 0x58>;
+ resets = <&pscrst 6>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <6 14>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio6 27 0>;
+ status = "disabled";
+ };
+
+ dsp7: dsp@17800000 {
+ compatible = "ti,k2hk-dsp";
+ reg = <0x17800000 0x00100000>,
+ <0x17e00000 0x00008000>,
+ <0x17f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem7>;
+ ti,syscon-dev = <&devctrl 0x5c>;
+ resets = <&pscrst 7>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <7 15>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio7 27 0>;
+ status = "disabled";
+ };
+
mdio: mdio@02090300 {
compatible = "ti,keystone_mdio", "ti,davinci_mdio";
#address-cells = <1>;
diff --git a/arch/arm/boot/dts/keystone-k2l-evm.dts b/arch/arm/boot/dts/keystone-k2l-evm.dts
index 056b42f99d7a..528667618db4 100644
--- a/arch/arm/boot/dts/keystone-k2l-evm.dts
+++ b/arch/arm/boot/dts/keystone-k2l-evm.dts
@@ -16,6 +16,19 @@
compatible = "ti,k2l-evm", "ti,k2l", "ti,keystone";
model = "Texas Instruments Keystone 2 Lamarr EVM";
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ dsp_common_memory: dsp-common-memory@81f800000 {
+ compatible = "shared-dma-pool";
+ reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
+ reusable;
+ status = "okay";
+ };
+ };
+
soc {
clocks {
refclksys: refclksys {
@@ -133,3 +146,23 @@
reg = <1>;
};
};
+
+&dsp0 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp1 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp2 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
+
+&dsp3 {
+ memory-region = <&dsp_common_memory>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/keystone-k2l.dtsi b/arch/arm/boot/dts/keystone-k2l.dtsi
index 148650406cf7..4431310bc922 100644
--- a/arch/arm/boot/dts/keystone-k2l.dtsi
+++ b/arch/arm/boot/dts/keystone-k2l.dtsi
@@ -33,6 +33,13 @@
};
};
+ aliases {
+ rproc0 = &dsp0;
+ rproc1 = &dsp1;
+ rproc2 = &dsp2;
+ rproc3 = &dsp3;
+ };
+
soc {
/include/ "keystone-k2l-clocks.dtsi"
@@ -268,6 +275,70 @@
gpio,syscon-dev = <&devctrl 0x24c>;
};
+ dsp0: dsp@10800000 {
+ compatible = "ti,k2l-dsp";
+ reg = <0x10800000 0x00100000>,
+ <0x10e00000 0x00008000>,
+ <0x10f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem0>;
+ ti,syscon-dev = <&devctrl 0x844>;
+ resets = <&pscrst 0>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <0 8>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio0 27 0>;
+ status = "disabled";
+ };
+
+ dsp1: dsp@11800000 {
+ compatible = "ti,k2l-dsp";
+ reg = <0x11800000 0x00100000>,
+ <0x11e00000 0x00008000>,
+ <0x11f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem1>;
+ ti,syscon-dev = <&devctrl 0x848>;
+ resets = <&pscrst 1>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <1 9>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio1 27 0>;
+ status = "disabled";
+ };
+
+ dsp2: dsp@12800000 {
+ compatible = "ti,k2l-dsp";
+ reg = <0x12800000 0x00100000>,
+ <0x12e00000 0x00008000>,
+ <0x12f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem2>;
+ ti,syscon-dev = <&devctrl 0x84c>;
+ resets = <&pscrst 2>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <2 10>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio2 27 0>;
+ status = "disabled";
+ };
+
+ dsp3: dsp@13800000 {
+ compatible = "ti,k2l-dsp";
+ reg = <0x13800000 0x00100000>,
+ <0x13e00000 0x00008000>,
+ <0x13f00000 0x00008000>;
+ reg-names = "l2sram", "l1pram", "l1dram";
+ clocks = <&clkgem3>;
+ ti,syscon-dev = <&devctrl 0x850>;
+ resets = <&pscrst 3>;
+ interrupt-parent = <&kirq0>;
+ interrupts = <3 11>;
+ interrupt-names = "vring", "exception";
+ kick-gpios = <&dspgpio3 27 0>;
+ status = "disabled";
+ };
+
mdio: mdio@26200f00 {
compatible = "ti,keystone_mdio", "ti,davinci_mdio";
#address-cells = <1>;
diff --git a/arch/arm/boot/dts/kirkwood-6192.dtsi b/arch/arm/boot/dts/kirkwood-6192.dtsi
index d573e03f3134..f003f3f1bd65 100644
--- a/arch/arm/boot/dts/kirkwood-6192.dtsi
+++ b/arch/arm/boot/dts/kirkwood-6192.dtsi
@@ -1,6 +1,6 @@
/ {
mbus@f1000000 {
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,kirkwood-pcie";
status = "disabled";
device_type = "pci";
@@ -24,6 +24,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 9>;
marvell,pcie-port = <0>;
diff --git a/arch/arm/boot/dts/kirkwood-6281.dtsi b/arch/arm/boot/dts/kirkwood-6281.dtsi
index 748d0b62f233..47d4b3d3d9e9 100644
--- a/arch/arm/boot/dts/kirkwood-6281.dtsi
+++ b/arch/arm/boot/dts/kirkwood-6281.dtsi
@@ -1,6 +1,6 @@
/ {
mbus@f1000000 {
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,kirkwood-pcie";
status = "disabled";
device_type = "pci";
@@ -24,6 +24,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 9>;
marvell,pcie-port = <0>;
diff --git a/arch/arm/boot/dts/kirkwood-6282.dtsi b/arch/arm/boot/dts/kirkwood-6282.dtsi
index bb63d2d50fc5..a13dad0a7c08 100644
--- a/arch/arm/boot/dts/kirkwood-6282.dtsi
+++ b/arch/arm/boot/dts/kirkwood-6282.dtsi
@@ -1,6 +1,6 @@
/ {
mbus@f1000000 {
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,kirkwood-pcie";
status = "disabled";
device_type = "pci";
@@ -28,6 +28,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 9>;
marvell,pcie-port = <0>;
@@ -45,6 +46,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
0x81000000 0 0 0x81000000 0x2 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 10>;
marvell,pcie-port = <1>;
diff --git a/arch/arm/boot/dts/kirkwood-98dx4122.dtsi b/arch/arm/boot/dts/kirkwood-98dx4122.dtsi
index 720c210d491d..90d4d71b6683 100644
--- a/arch/arm/boot/dts/kirkwood-98dx4122.dtsi
+++ b/arch/arm/boot/dts/kirkwood-98dx4122.dtsi
@@ -1,6 +1,6 @@
/ {
mbus@f1000000 {
- pciec: pcie-controller@82000000 {
+ pciec: pcie@82000000 {
compatible = "marvell,kirkwood-pcie";
status = "disabled";
device_type = "pci";
@@ -24,6 +24,7 @@
#interrupt-cells = <1>;
ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
0x81000000 0 0 0x81000000 0x1 0 1 0>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &intc 9>;
marvell,pcie-port = <0>;
diff --git a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts
index 43e9364083de..b4575bbaf085 100644
--- a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts
+++ b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts
@@ -192,7 +192,7 @@
interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins &mmc1_cd>;
- cd-gpios = <&gpio4 31 IRQ_TYPE_LEVEL_LOW>; /* gpio127 */
+ cd-gpios = <&gpio4 31 GPIO_ACTIVE_LOW>; /* gpio127 */
vmmc-supply = <&vmmc1>;
bus-width = <4>;
cap-power-off-card;
diff --git a/arch/arm/boot/dts/meson.dtsi b/arch/arm/boot/dts/meson.dtsi
index 15204e44161d..cd6ad072e72c 100644
--- a/arch/arm/boot/dts/meson.dtsi
+++ b/arch/arm/boot/dts/meson.dtsi
@@ -86,14 +86,14 @@
};
uart_A: serial@84c0 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
reg = <0x84c0 0x18>;
interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
};
uart_B: serial@84dc {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
reg = <0x84dc 0x18>;
interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
@@ -108,6 +108,20 @@
status = "disabled";
};
+ pwm_ab: pwm@8550 {
+ compatible = "amlogic,meson-pwm";
+ reg = <0x8550 0x10>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm_cd: pwm@8650 {
+ compatible = "amlogic,meson-pwm";
+ reg = <0x8650 0x10>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
saradc: adc@8680 {
compatible = "amlogic,meson-saradc";
reg = <0x8680 0x34>;
@@ -117,7 +131,7 @@
};
uart_C: serial@8700 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
reg = <0x8700 0x18>;
interrupts = <GIC_SPI 93 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
@@ -182,7 +196,7 @@
};
uart_AO: serial@4c0 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson6-uart", "amlogic,meson-ao-uart", "amlogic,meson-uart";
reg = <0x4c0 0x18>;
interrupts = <GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
@@ -230,5 +244,13 @@
interrupt-names = "macirq";
status = "disabled";
};
+
+ ahb_sram: sram@d9000000 {
+ compatible = "mmio-sram";
+ reg = <0xd9000000 0x20000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0xd9000000 0x20000>;
+ };
};
}; /* end of / */
diff --git a/arch/arm/boot/dts/meson6.dtsi b/arch/arm/boot/dts/meson6.dtsi
index 8557b6117a4b..ef281d290052 100644
--- a/arch/arm/boot/dts/meson6.dtsi
+++ b/arch/arm/boot/dts/meson6.dtsi
@@ -70,9 +70,37 @@
};
};
+ xtal: xtal-clk {
+ compatible = "fixed-clock";
+ clock-frequency = <24000000>;
+ clock-output-names = "xtal";
+ #clock-cells = <0>;
+ };
+
clk81: clk@0 {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <200000000>;
};
}; /* end of / */
+
+
+&uart_AO {
+ clocks = <&xtal>, <&clk81>, <&clk81>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_A {
+ clocks = <&xtal>, <&clk81>, <&clk81>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_B {
+ clocks = <&xtal>, <&clk81>, <&clk81>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_C {
+ clocks = <&xtal>, <&clk81>, <&clk81>;
+ clock-names = "xtal", "pclk", "baud";
+};
diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi
index cada35828931..b98d44fde6b6 100644
--- a/arch/arm/boot/dts/meson8.dtsi
+++ b/arch/arm/boot/dts/meson8.dtsi
@@ -168,10 +168,18 @@
&cbus {
clkc: clock-controller@4000 {
#clock-cells = <1>;
+ #reset-cells = <1>;
compatible = "amlogic,meson8-clkc";
reg = <0x8000 0x4>, <0x4000 0x460>;
};
+ pwm_ef: pwm@86c0 {
+ compatible = "amlogic,meson8-pwm", "amlogic,meson8b-pwm";
+ reg = <0x86c0 0x10>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
pinctrl_cbus: pinctrl@9880 {
compatible = "amlogic,meson8-cbus-pinctrl";
reg = <0x9880 0x10>;
@@ -270,6 +278,14 @@
arm,filter-ranges = <0x100000 0xc0000000>;
};
+&pwm_ab {
+ compatible = "amlogic,meson8-pwm", "amlogic,meson8b-pwm";
+};
+
+&pwm_cd {
+ compatible = "amlogic,meson8-pwm", "amlogic,meson8b-pwm";
+};
+
&saradc {
compatible = "amlogic,meson8-saradc", "amlogic,meson-saradc";
clocks = <&clkc CLKID_XTAL>,
diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi
index 72e4f425f190..bc278da7df0d 100644
--- a/arch/arm/boot/dts/meson8b.dtsi
+++ b/arch/arm/boot/dts/meson8b.dtsi
@@ -119,6 +119,7 @@
&cbus {
clkc: clock-controller@4000 {
#clock-cells = <1>;
+ #reset-cells = <1>;
compatible = "amlogic,meson8b-clkc";
reg = <0x8000 0x4>, <0x4000 0x460>;
};
@@ -129,20 +130,6 @@
#reset-cells = <1>;
};
- pwm_ab: pwm@8550 {
- compatible = "amlogic,meson8b-pwm";
- reg = <0x8550 0x10>;
- #pwm-cells = <3>;
- status = "disabled";
- };
-
- pwm_cd: pwm@8650 {
- compatible = "amlogic,meson8b-pwm";
- reg = <0x8650 0x10>;
- #pwm-cells = <3>;
- status = "disabled";
- };
-
pwm_ef: pwm@86c0 {
compatible = "amlogic,meson8b-pwm";
reg = <0x86c0 0x10>;
@@ -150,12 +137,6 @@
status = "disabled";
};
- wdt: watchdog@9900 {
- compatible = "amlogic,meson8b-wdt";
- reg = <0x9900 0x8>;
- interrupts = <0 0 1>;
- };
-
pinctrl_cbus: pinctrl@9880 {
compatible = "amlogic,meson8b-cbus-pinctrl";
reg = <0x9880 0x10>;
@@ -193,6 +174,14 @@
arm,filter-ranges = <0x100000 0xc0000000>;
};
+&pwm_ab {
+ compatible = "amlogic,meson8b-pwm";
+};
+
+&pwm_cd {
+ compatible = "amlogic,meson8b-pwm";
+};
+
&saradc {
compatible = "amlogic,meson8b-saradc", "amlogic,meson-saradc";
clocks = <&clkc CLKID_XTAL>,
@@ -242,3 +231,7 @@
clock-names = "usb_general", "usb";
resets = <&reset RESET_USB_OTG>;
};
+
+&wdt {
+ compatible = "amlogic,meson8b-wdt";
+};
diff --git a/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi b/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi
index 1eb5da1dc8f0..4d61e5b1334a 100644
--- a/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi
+++ b/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi
@@ -255,5 +255,6 @@
regulator-min-microvolt = <2775000>;
regulator-max-microvolt = <2775000>;
regulator-enable-ramp-delay = <1000>;
+ regulator-initial-mode = <0x00>; /* NORMAL */
};
};
diff --git a/arch/arm/boot/dts/mt2701.dtsi b/arch/arm/boot/dts/mt2701.dtsi
index f1efdc63656a..afe12e5b51f9 100644
--- a/arch/arm/boot/dts/mt2701.dtsi
+++ b/arch/arm/boot/dts/mt2701.dtsi
@@ -13,6 +13,7 @@
*/
#include <dt-bindings/clock/mt2701-clk.h>
+#include <dt-bindings/phy/phy.h>
#include <dt-bindings/power/mt2701-power.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
@@ -533,6 +534,7 @@
compatible = "mediatek,mt2701-smi-larb";
reg = <0 0x14010000 0 0x1000>;
mediatek,smi = <&smi_common>;
+ mediatek,larb-id = <0>;
clocks = <&mmsys CLK_MM_SMI_LARB0>,
<&mmsys CLK_MM_SMI_LARB0>;
clock-names = "apb", "smi";
@@ -549,6 +551,7 @@
compatible = "mediatek,mt2701-smi-larb";
reg = <0 0x15001000 0 0x1000>;
mediatek,smi = <&smi_common>;
+ mediatek,larb-id = <2>;
clocks = <&imgsys CLK_IMG_SMI_COMM>,
<&imgsys CLK_IMG_SMI_COMM>;
clock-names = "apb", "smi";
@@ -579,6 +582,7 @@
compatible = "mediatek,mt2701-smi-larb";
reg = <0 0x16010000 0 0x1000>;
mediatek,smi = <&smi_common>;
+ mediatek,larb-id = <1>;
clocks = <&vdecsys CLK_VDEC_CKGEN>,
<&vdecsys CLK_VDEC_LARB>;
clock-names = "apb", "smi";
@@ -591,12 +595,114 @@
#clock-cells = <1>;
};
+ usb0: usb@1a1c0000 {
+ compatible = "mediatek,mt8173-xhci";
+ reg = <0 0x1a1c0000 0 0x1000>,
+ <0 0x1a1c4700 0 0x0100>;
+ reg-names = "mac", "ippc";
+ interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&hifsys CLK_HIFSYS_USB0PHY>,
+ <&topckgen CLK_TOP_ETHIF_SEL>;
+ clock-names = "sys_ck", "ref_ck";
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
+ phys = <&u2port0 PHY_TYPE_USB2>, <&u3port0 PHY_TYPE_USB3>;
+ status = "disabled";
+ };
+
+ u3phy0: usb-phy@1a1c4000 {
+ compatible = "mediatek,mt2701-u3phy";
+ reg = <0 0x1a1c4000 0 0x0700>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+ status = "disabled";
+
+ u2port0: usb-phy@1a1c4800 {
+ reg = <0 0x1a1c4800 0 0x0100>;
+ clocks = <&topckgen CLK_TOP_USB_PHY48M>;
+ clock-names = "ref";
+ #phy-cells = <1>;
+ status = "okay";
+ };
+
+ u3port0: usb-phy@1a1c4900 {
+ reg = <0 0x1a1c4900 0 0x0700>;
+ clocks = <&clk26m>;
+ clock-names = "ref";
+ #phy-cells = <1>;
+ status = "okay";
+ };
+ };
+
+ usb1: usb@1a240000 {
+ compatible = "mediatek,mt8173-xhci";
+ reg = <0 0x1a240000 0 0x1000>,
+ <0 0x1a244700 0 0x0100>;
+ reg-names = "mac", "ippc";
+ interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&hifsys CLK_HIFSYS_USB1PHY>,
+ <&topckgen CLK_TOP_ETHIF_SEL>;
+ clock-names = "sys_ck", "ref_ck";
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
+ phys = <&u2port1 PHY_TYPE_USB2>, <&u3port1 PHY_TYPE_USB3>;
+ status = "disabled";
+ };
+
+ u3phy1: usb-phy@1a244000 {
+ compatible = "mediatek,mt2701-u3phy";
+ reg = <0 0x1a244000 0 0x0700>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+ status = "disabled";
+
+ u2port1: usb-phy@1a244800 {
+ reg = <0 0x1a244800 0 0x0100>;
+ clocks = <&topckgen CLK_TOP_USB_PHY48M>;
+ clock-names = "ref";
+ #phy-cells = <1>;
+ status = "okay";
+ };
+
+ u3port1: usb-phy@1a244900 {
+ reg = <0 0x1a244900 0 0x0700>;
+ clocks = <&clk26m>;
+ clock-names = "ref";
+ #phy-cells = <1>;
+ status = "okay";
+ };
+ };
+
ethsys: syscon@1b000000 {
compatible = "mediatek,mt2701-ethsys", "syscon";
reg = <0 0x1b000000 0 0x1000>;
#clock-cells = <1>;
};
+ eth: ethernet@1b100000 {
+ compatible = "mediatek,mt2701-eth", "syscon";
+ reg = <0 0x1b100000 0 0x20000>;
+ interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>,
+ <GIC_SPI 199 IRQ_TYPE_LEVEL_LOW>,
+ <GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
+ <&ethsys CLK_ETHSYS_ESW>,
+ <&ethsys CLK_ETHSYS_GP1>,
+ <&ethsys CLK_ETHSYS_GP2>,
+ <&apmixedsys CLK_APMIXED_TRGPLL>;
+ clock-names = "ethif", "esw", "gp1", "gp2", "trgpll";
+ resets = <&ethsys MT2701_ETHSYS_FE_RST>,
+ <&ethsys MT2701_ETHSYS_GMAC_RST>,
+ <&ethsys MT2701_ETHSYS_PPE_RST>;
+ reset-names = "fe", "gmac", "ppe";
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
+ mediatek,ethsys = <&ethsys>;
+ mediatek,pctl = <&syscfg_pctl_a>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
bdpsys: syscon@1c000000 {
compatible = "mediatek,mt2701-bdpsys", "syscon";
reg = <0 0x1c000000 0 0x1000>;
diff --git a/arch/arm/boot/dts/mt6323.dtsi b/arch/arm/boot/dts/mt6323.dtsi
new file mode 100644
index 000000000000..7c783d6c750e
--- /dev/null
+++ b/arch/arm/boot/dts/mt6323.dtsi
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: John Crispin <[email protected]>
+ * Sean Wang <[email protected]>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+&pwrap {
+ pmic: mt6323 {
+ compatible = "mediatek,mt6323";
+ interrupt-parent = <&pio>;
+ interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+
+ mt6323regulator: mt6323regulator{
+ compatible = "mediatek,mt6323-regulator";
+
+ mt6323_vproc_reg: buck_vproc{
+ regulator-name = "vproc";
+ regulator-min-microvolt = < 700000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <12500>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vsys_reg: buck_vsys{
+ regulator-name = "vsys";
+ regulator-min-microvolt = <1400000>;
+ regulator-max-microvolt = <2987500>;
+ regulator-ramp-delay = <25000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vpa_reg: buck_vpa{
+ regulator-name = "vpa";
+ regulator-min-microvolt = < 500000>;
+ regulator-max-microvolt = <3650000>;
+ };
+
+ mt6323_vtcxo_reg: ldo_vtcxo{
+ regulator-name = "vtcxo";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-enable-ramp-delay = <90>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vcn28_reg: ldo_vcn28{
+ regulator-name = "vcn28";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-enable-ramp-delay = <185>;
+ };
+
+ mt6323_vcn33_bt_reg: ldo_vcn33_bt{
+ regulator-name = "vcn33_bt";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3600000>;
+ regulator-enable-ramp-delay = <185>;
+ };
+
+ mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
+ regulator-name = "vcn33_wifi";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3600000>;
+ regulator-enable-ramp-delay = <185>;
+ };
+
+ mt6323_va_reg: ldo_va{
+ regulator-name = "va";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-enable-ramp-delay = <216>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vcama_reg: ldo_vcama{
+ regulator-name = "vcama";
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vio28_reg: ldo_vio28{
+ regulator-name = "vio28";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-enable-ramp-delay = <216>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vusb_reg: ldo_vusb{
+ regulator-name = "vusb";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <216>;
+ regulator-boot-on;
+ };
+
+ mt6323_vmc_reg: ldo_vmc{
+ regulator-name = "vmc";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <36>;
+ regulator-boot-on;
+ };
+
+ mt6323_vmch_reg: ldo_vmch{
+ regulator-name = "vmch";
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <36>;
+ regulator-boot-on;
+ };
+
+ mt6323_vemc3v3_reg: ldo_vemc3v3{
+ regulator-name = "vemc3v3";
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <36>;
+ regulator-boot-on;
+ };
+
+ mt6323_vgp1_reg: ldo_vgp1{
+ regulator-name = "vgp1";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vgp2_reg: ldo_vgp2{
+ regulator-name = "vgp2";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vgp3_reg: ldo_vgp3{
+ regulator-name = "vgp3";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vcn18_reg: ldo_vcn18{
+ regulator-name = "vcn18";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vsim1_reg: ldo_vsim1{
+ regulator-name = "vsim1";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vsim2_reg: ldo_vsim2{
+ regulator-name = "vsim2";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vrtc_reg: ldo_vrtc{
+ regulator-name = "vrtc";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vcamaf_reg: ldo_vcamaf{
+ regulator-name = "vcamaf";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vibr_reg: ldo_vibr{
+ regulator-name = "vibr";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <36>;
+ };
+
+ mt6323_vrf18_reg: ldo_vrf18{
+ regulator-name = "vrf18";
+ regulator-min-microvolt = <1825000>;
+ regulator-max-microvolt = <1825000>;
+ regulator-enable-ramp-delay = <187>;
+ };
+
+ mt6323_vm_reg: ldo_vm{
+ regulator-name = "vm";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vio18_reg: ldo_vio18{
+ regulator-name = "vio18";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ mt6323_vcamd_reg: ldo_vcamd{
+ regulator-name = "vcamd";
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+
+ mt6323_vcamio_reg: ldo_vcamio{
+ regulator-name = "vcamio";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-enable-ramp-delay = <216>;
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/mt7623-evb.dts b/arch/arm/boot/dts/mt7623-evb.dts
deleted file mode 100644
index b60b41cad592..000000000000
--- a/arch/arm/boot/dts/mt7623-evb.dts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2016 MediaTek Inc.
- * Author: John Crispin <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-/dts-v1/;
-#include "mt7623.dtsi"
-
-/ {
- model = "MediaTek MT7623 evaluation board";
- compatible = "mediatek,mt7623-evb", "mediatek,mt7623";
-
- chosen {
- stdout-path = &uart2;
- };
-
- memory {
- reg = <0 0x80000000 0 0x40000000>;
- };
-};
-
-&uart2 {
- status = "okay";
-};
diff --git a/arch/arm/boot/dts/mt7623.dtsi b/arch/arm/boot/dts/mt7623.dtsi
index d81158b2b02f..ec8a07415cb3 100644
--- a/arch/arm/boot/dts/mt7623.dtsi
+++ b/arch/arm/boot/dts/mt7623.dtsi
@@ -21,36 +21,99 @@
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/phy/phy.h>
#include <dt-bindings/reset/mt2701-resets.h>
+#include <dt-bindings/thermal/thermal.h>
#include "skeleton64.dtsi"
/ {
compatible = "mediatek,mt7623";
interrupt-parent = <&sysirq>;
+ cpu_opp_table: opp_table {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-98000000 {
+ opp-hz = /bits/ 64 <98000000>;
+ opp-microvolt = <1050000>;
+ };
+
+ opp-198000000 {
+ opp-hz = /bits/ 64 <198000000>;
+ opp-microvolt = <1050000>;
+ };
+
+ opp-398000000 {
+ opp-hz = /bits/ 64 <398000000>;
+ opp-microvolt = <1050000>;
+ };
+
+ opp-598000000 {
+ opp-hz = /bits/ 64 <598000000>;
+ opp-microvolt = <1050000>;
+ };
+
+ opp-747500000 {
+ opp-hz = /bits/ 64 <747500000>;
+ opp-microvolt = <1050000>;
+ };
+
+ opp-1040000000 {
+ opp-hz = /bits/ 64 <1040000000>;
+ opp-microvolt = <1150000>;
+ };
+
+ opp-1196000000 {
+ opp-hz = /bits/ 64 <1196000000>;
+ opp-microvolt = <1200000>;
+ };
+
+ opp-1300000000 {
+ opp-hz = /bits/ 64 <1300000000>;
+ opp-microvolt = <1300000>;
+ };
+ };
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
enable-method = "mediatek,mt6589-smp";
- cpu@0 {
+ cpu0: cpu@0 {
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x0>;
+ clocks = <&infracfg CLK_INFRA_CPUSEL>,
+ <&apmixedsys CLK_APMIXED_MAINPLL>;
+ clock-names = "cpu", "intermediate";
+ operating-points-v2 = <&cpu_opp_table>;
+ #cooling-cells = <2>;
+ cooling-min-level = <0>;
+ cooling-max-level = <7>;
+ clock-frequency = <1300000000>;
};
- cpu@1 {
+
+ cpu1: cpu@1 {
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x1>;
+ operating-points-v2 = <&cpu_opp_table>;
+ clock-frequency = <1300000000>;
};
- cpu@2 {
+
+ cpu2: cpu@2 {
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x2>;
+ operating-points-v2 = <&cpu_opp_table>;
+ clock-frequency = <1300000000>;
};
- cpu@3 {
+
+ cpu3: cpu@3 {
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0x3>;
+ operating-points-v2 = <&cpu_opp_table>;
+ clock-frequency = <1300000000>;
};
};
@@ -74,6 +137,58 @@
clock-output-names = "clk26m";
};
+ thermal-zones {
+ cpu_thermal: cpu_thermal {
+ polling-delay-passive = <1000>;
+ polling-delay = <1000>;
+
+ thermal-sensors = <&thermal 0>;
+
+ trips {
+ cpu_passive: cpu_passive {
+ temperature = <47000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+
+ cpu_active: cpu_active {
+ temperature = <67000>;
+ hysteresis = <2000>;
+ type = "active";
+ };
+
+ cpu_hot: cpu_hot {
+ temperature = <87000>;
+ hysteresis = <2000>;
+ type = "hot";
+ };
+
+ cpu_crit {
+ temperature = <107000>;
+ hysteresis = <2000>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&cpu_passive>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+
+ map1 {
+ trip = <&cpu_active>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+
+ map2 {
+ trip = <&cpu_hot>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+ };
+ };
+ };
+
timer {
compatible = "arm,armv7-timer";
interrupt-parent = <&gic>;
@@ -172,7 +287,7 @@
clock-names = "spi", "wrap";
};
- cir: cir@0x10013000 {
+ cir: cir@10013000 {
compatible = "mediatek,mt7623-cir";
reg = <0 0x10013000 0 0x1000>;
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_LOW>;
@@ -193,7 +308,7 @@
efuse: efuse@10206000 {
compatible = "mediatek,mt7623-efuse",
"mediatek,mt8173-efuse";
- reg = <0 0x10206000 0 0x1000>;
+ reg = <0 0x10206000 0 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
thermal_calibration_data: calib@424 {
@@ -371,6 +486,31 @@
nvmem-cell-names = "calibration-data";
};
+ nandc: nfi@1100d000 {
+ compatible = "mediatek,mt7623-nfc",
+ "mediatek,mt2701-nfc";
+ reg = <0 0x1100d000 0 0x1000>;
+ interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
+ power-domains = <&scpsys MT2701_POWER_DOMAIN_IFR_MSC>;
+ clocks = <&pericfg CLK_PERI_NFI>,
+ <&pericfg CLK_PERI_NFI_PAD>;
+ clock-names = "nfi_clk", "pad_clk";
+ status = "disabled";
+ ecc-engine = <&bch>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ bch: ecc@1100e000 {
+ compatible = "mediatek,mt7623-ecc",
+ "mediatek,mt2701-ecc";
+ reg = <0 0x1100e000 0 0x1000>;
+ interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&pericfg CLK_PERI_NFI_ECC>;
+ clock-names = "nfiecc_clk";
+ status = "disabled";
+ };
+
spi1: spi@11016000 {
compatible = "mediatek,mt7623-spi",
"mediatek,mt2701-spi";
@@ -399,31 +539,6 @@
status = "disabled";
};
- nandc: nfi@1100d000 {
- compatible = "mediatek,mt7623-nfc",
- "mediatek,mt2701-nfc";
- reg = <0 0x1100d000 0 0x1000>;
- interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_LOW>;
- power-domains = <&scpsys MT2701_POWER_DOMAIN_IFR_MSC>;
- clocks = <&pericfg CLK_PERI_NFI>,
- <&pericfg CLK_PERI_NFI_PAD>;
- clock-names = "nfi_clk", "pad_clk";
- status = "disabled";
- ecc-engine = <&bch>;
- #address-cells = <1>;
- #size-cells = <0>;
- };
-
- bch: ecc@1100e000 {
- compatible = "mediatek,mt7623-ecc",
- "mediatek,mt2701-ecc";
- reg = <0 0x1100e000 0 0x1000>;
- interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_LOW>;
- clocks = <&pericfg CLK_PERI_NFI_ECC>;
- clock-names = "nfiecc_clk";
- status = "disabled";
- };
-
afe: audio-controller@11220000 {
compatible = "mediatek,mt7623-audio",
"mediatek,mt2701-audio";
@@ -538,13 +653,22 @@
compatible = "mediatek,mt7623-mmc",
"mediatek,mt8135-mmc";
reg = <0 0x11240000 0 0x1000>;
- interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_LOW>;
+ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_LOW>;
clocks = <&pericfg CLK_PERI_MSDC30_1>,
<&topckgen CLK_TOP_MSDC30_1_SEL>;
clock-names = "source", "hclk";
status = "disabled";
};
+ hifsys: syscon@1a000000 {
+ compatible = "mediatek,mt7623-hifsys",
+ "mediatek,mt2701-hifsys",
+ "syscon";
+ reg = <0 0x1a000000 0 0x1000>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
+
usb1: usb@1a1c0000 {
compatible = "mediatek,mt7623-xhci",
"mediatek,mt8173-xhci";
@@ -561,7 +685,8 @@
};
u3phy1: usb-phy@1a1c4000 {
- compatible = "mediatek,mt7623-u3phy", "mediatek,mt2701-u3phy";
+ compatible = "mediatek,mt7623-u3phy",
+ "mediatek,mt2701-u3phy";
reg = <0 0x1a1c4000 0 0x0700>;
clocks = <&clk26m>;
clock-names = "u3phya_ref";
@@ -599,7 +724,8 @@
};
u3phy2: usb-phy@1a244000 {
- compatible = "mediatek,mt7623-u3phy", "mediatek,mt2701-u3phy";
+ compatible = "mediatek,mt7623-u3phy",
+ "mediatek,mt2701-u3phy";
reg = <0 0x1a244000 0 0x0700>;
clocks = <&clk26m>;
clock-names = "u3phya_ref";
@@ -621,15 +747,6 @@
};
};
- hifsys: syscon@1a000000 {
- compatible = "mediatek,mt7623-hifsys",
- "mediatek,mt2701-hifsys",
- "syscon";
- reg = <0 0x1a000000 0 0x1000>;
- #clock-cells = <1>;
- #reset-cells = <1>;
- };
-
ethsys: syscon@1b000000 {
compatible = "mediatek,mt7623-ethsys",
"mediatek,mt2701-ethsys",
@@ -639,7 +756,9 @@
};
eth: ethernet@1b100000 {
- compatible = "mediatek,mt2701-eth", "syscon";
+ compatible = "mediatek,mt7623-eth",
+ "mediatek,mt2701-eth",
+ "syscon";
reg = <0 0x1b100000 0 0x20000>;
interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>,
<GIC_SPI 199 IRQ_TYPE_LEVEL_LOW>,
@@ -650,6 +769,10 @@
<&ethsys CLK_ETHSYS_GP2>,
<&apmixedsys CLK_APMIXED_TRGPLL>;
clock-names = "ethif", "esw", "gp1", "gp2", "trgpll";
+ resets = <&ethsys MT2701_ETHSYS_FE_RST>,
+ <&ethsys MT2701_ETHSYS_GMAC_RST>,
+ <&ethsys MT2701_ETHSYS_PPE_RST>;
+ reset-names = "fe", "gmac", "ppe";
power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
mediatek,ethsys = <&ethsys>;
mediatek,pctl = <&syscfg_pctl_a>;
diff --git a/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts
new file mode 100644
index 000000000000..688a86378cee
--- /dev/null
+++ b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts
@@ -0,0 +1,487 @@
+/*
+ * Copyright 2017 Sean Wang <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "mt7623.dtsi"
+#include "mt6323.dtsi"
+
+/ {
+ model = "Bananapi BPI-R2";
+ compatible = "bananapi,bpi-r2", "mediatek,mt7623";
+
+ aliases {
+ serial2 = &uart2;
+ };
+
+ chosen {
+ stdout-path = "serial2:115200n8";
+ };
+
+ cpus {
+ cpu@0 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu@1 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu@2 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu@3 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ pinctrl-names = "default";
+ pinctrl-0 = <&key_pins_a>;
+
+ factory {
+ label = "factory";
+ linux,code = <BTN_0>;
+ gpios = <&pio 256 GPIO_ACTIVE_LOW>;
+ };
+
+ wps {
+ label = "wps";
+ linux,code = <KEY_WPS_BUTTON>;
+ gpios = <&pio 257 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ pinctrl-names = "default";
+ pinctrl-0 = <&led_pins_a>;
+
+ blue {
+ label = "bpi-r2:pio:blue";
+ gpios = <&pio 241 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+
+ green {
+ label = "bpi-r2:pio:green";
+ gpios = <&pio 240 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+
+ red {
+ label = "bpi-r2:pio:red";
+ gpios = <&pio 239 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+ };
+
+ memory@80000000 {
+ reg = <0 0x80000000 0 0x40000000>;
+ };
+};
+
+&cir {
+ pinctrl-names = "default";
+ pinctrl-0 = <&cir_pins_a>;
+ status = "okay";
+};
+
+&crypto {
+ status = "okay";
+};
+
+&eth {
+ status = "okay";
+
+ gmac0: mac@0 {
+ compatible = "mediatek,eth-mac";
+ reg = <0>;
+ phy-mode = "trgmii";
+
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ pause;
+ };
+ };
+
+ mdio: mdio-bus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ switch@0 {
+ compatible = "mediatek,mt7530";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+ pinctrl-names = "default";
+ reset-gpios = <&pio 33 0>;
+ core-supply = <&mt6323_vpa_reg>;
+ io-supply = <&mt6323_vemc3v3_reg>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+
+ port@0 {
+ reg = <0>;
+ label = "wan";
+ };
+
+ port@1 {
+ reg = <1>;
+ label = "lan0";
+ };
+
+ port@2 {
+ reg = <2>;
+ label = "lan1";
+ };
+
+ port@3 {
+ reg = <3>;
+ label = "lan2";
+ };
+
+ port@4 {
+ reg = <4>;
+ label = "lan3";
+ };
+
+ port@6 {
+ reg = <6>;
+ label = "cpu";
+ ethernet = <&gmac0>;
+ phy-mode = "trgmii";
+
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ };
+ };
+ };
+ };
+ };
+};
+
+&i2c0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c0_pins_a>;
+ status = "okay";
+};
+
+&i2c1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins_a>;
+ status = "okay";
+};
+
+&mmc0 {
+ pinctrl-names = "default", "state_uhs";
+ pinctrl-0 = <&mmc0_pins_default>;
+ pinctrl-1 = <&mmc0_pins_uhs>;
+ status = "okay";
+ bus-width = <8>;
+ max-frequency = <50000000>;
+ cap-mmc-highspeed;
+ vmmc-supply = <&mt6323_vemc3v3_reg>;
+ vqmmc-supply = <&mt6323_vio18_reg>;
+ non-removable;
+};
+
+&mmc1 {
+ pinctrl-names = "default", "state_uhs";
+ pinctrl-0 = <&mmc1_pins_default>;
+ pinctrl-1 = <&mmc1_pins_uhs>;
+ status = "okay";
+ bus-width = <4>;
+ max-frequency = <50000000>;
+ cap-sd-highspeed;
+ cd-gpios = <&pio 261 0>;
+ vmmc-supply = <&mt6323_vmch_reg>;
+ vqmmc-supply = <&mt6323_vio18_reg>;
+};
+
+&pio {
+ cir_pins_a:cir@0 {
+ pins_cir {
+ pinmux = <MT7623_PIN_46_IR_FUNC_IR>;
+ bias-disable;
+ };
+ };
+
+ i2c0_pins_a: i2c@0 {
+ pins_i2c0 {
+ pinmux = <MT7623_PIN_75_SDA0_FUNC_SDA0>,
+ <MT7623_PIN_76_SCL0_FUNC_SCL0>;
+ bias-disable;
+ };
+ };
+
+ i2c1_pins_a: i2c@1 {
+ pin_i2c1 {
+ pinmux = <MT7623_PIN_57_SDA1_FUNC_SDA1>,
+ <MT7623_PIN_58_SCL1_FUNC_SCL1>;
+ bias-disable;
+ };
+ };
+
+ i2s0_pins_a: i2s@0 {
+ pin_i2s0 {
+ pinmux = <MT7623_PIN_49_I2S0_DATA_FUNC_I2S0_DATA>,
+ <MT7623_PIN_72_I2S0_DATA_IN_FUNC_I2S0_DATA_IN>,
+ <MT7623_PIN_73_I2S0_LRCK_FUNC_I2S0_LRCK>,
+ <MT7623_PIN_74_I2S0_BCK_FUNC_I2S0_BCK>,
+ <MT7623_PIN_126_I2S0_MCLK_FUNC_I2S0_MCLK>;
+ drive-strength = <MTK_DRIVE_12mA>;
+ bias-pull-down;
+ };
+ };
+
+ i2s1_pins_a: i2s@1 {
+ pin_i2s1 {
+ pinmux = <MT7623_PIN_33_I2S1_DATA_FUNC_I2S1_DATA>,
+ <MT7623_PIN_34_I2S1_DATA_IN_FUNC_I2S1_DATA_IN>,
+ <MT7623_PIN_35_I2S1_BCK_FUNC_I2S1_BCK>,
+ <MT7623_PIN_36_I2S1_LRCK_FUNC_I2S1_LRCK>,
+ <MT7623_PIN_37_I2S1_MCLK_FUNC_I2S1_MCLK>;
+ drive-strength = <MTK_DRIVE_12mA>;
+ bias-pull-down;
+ };
+ };
+
+ key_pins_a: keys@0 {
+ pins_keys {
+ pinmux = <MT7623_PIN_256_GPIO256_FUNC_GPIO256>,
+ <MT7623_PIN_257_GPIO257_FUNC_GPIO257> ;
+ input-enable;
+ };
+ };
+
+ led_pins_a: leds@0 {
+ pins_leds {
+ pinmux = <MT7623_PIN_239_EXT_SDIO0_FUNC_GPIO239>,
+ <MT7623_PIN_240_EXT_XCS_FUNC_GPIO240>,
+ <MT7623_PIN_241_EXT_SCK_FUNC_GPIO241>;
+ };
+ };
+
+ mmc0_pins_default: mmc0default {
+ pins_cmd_dat {
+ pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7>,
+ <MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6>,
+ <MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5>,
+ <MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4>,
+ <MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3>,
+ <MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2>,
+ <MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1>,
+ <MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0>,
+ <MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD>;
+ input-enable;
+ bias-pull-up;
+ };
+
+ pins_clk {
+ pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK>;
+ bias-pull-down;
+ };
+
+ pins_rst {
+ pinmux = <MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB>;
+ bias-pull-up;
+ };
+ };
+
+ mmc0_pins_uhs: mmc0 {
+ pins_cmd_dat {
+ pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_MSDC0_DAT7>,
+ <MT7623_PIN_112_MSDC0_DAT6_FUNC_MSDC0_DAT6>,
+ <MT7623_PIN_113_MSDC0_DAT5_FUNC_MSDC0_DAT5>,
+ <MT7623_PIN_114_MSDC0_DAT4_FUNC_MSDC0_DAT4>,
+ <MT7623_PIN_118_MSDC0_DAT3_FUNC_MSDC0_DAT3>,
+ <MT7623_PIN_119_MSDC0_DAT2_FUNC_MSDC0_DAT2>,
+ <MT7623_PIN_120_MSDC0_DAT1_FUNC_MSDC0_DAT1>,
+ <MT7623_PIN_121_MSDC0_DAT0_FUNC_MSDC0_DAT0>,
+ <MT7623_PIN_116_MSDC0_CMD_FUNC_MSDC0_CMD>;
+ input-enable;
+ drive-strength = <MTK_DRIVE_2mA>;
+ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
+ };
+
+ pins_clk {
+ pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_MSDC0_CLK>;
+ drive-strength = <MTK_DRIVE_2mA>;
+ bias-pull-down = <MTK_PUPD_SET_R1R0_01>;
+ };
+
+ pins_rst {
+ pinmux = <MT7623_PIN_115_MSDC0_RSTB_FUNC_MSDC0_RSTB>;
+ bias-pull-up;
+ };
+ };
+
+ mmc1_pins_default: mmc1default {
+ pins_cmd_dat {
+ pinmux = <MT7623_PIN_107_MSDC1_DAT0_FUNC_MSDC1_DAT0>,
+ <MT7623_PIN_108_MSDC1_DAT1_FUNC_MSDC1_DAT1>,
+ <MT7623_PIN_109_MSDC1_DAT2_FUNC_MSDC1_DAT2>,
+ <MT7623_PIN_110_MSDC1_DAT3_FUNC_MSDC1_DAT3>,
+ <MT7623_PIN_105_MSDC1_CMD_FUNC_MSDC1_CMD>;
+ input-enable;
+ drive-strength = <MTK_DRIVE_4mA>;
+ bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
+ };
+
+ pins_clk {
+ pinmux = <MT7623_PIN_106_MSDC1_CLK_FUNC_MSDC1_CLK>;
+ bias-pull-down;
+ drive-strength = <MTK_DRIVE_4mA>;
+ };
+
+ pins_wp {
+ pinmux = <MT7623_PIN_29_EINT7_FUNC_MSDC1_WP>;
+ input-enable;
+ bias-pull-up;
+ };
+
+ pins_insert {
+ pinmux = <MT7623_PIN_261_MSDC1_INS_FUNC_GPIO261>;
+ bias-pull-up;
+ };
+ };
+
+ mmc1_pins_uhs: mmc1 {
+ pins_cmd_dat {
+ pinmux = <MT7623_PIN_107_MSDC1_DAT0_FUNC_MSDC1_DAT0>,
+ <MT7623_PIN_108_MSDC1_DAT1_FUNC_MSDC1_DAT1>,
+ <MT7623_PIN_109_MSDC1_DAT2_FUNC_MSDC1_DAT2>,
+ <MT7623_PIN_110_MSDC1_DAT3_FUNC_MSDC1_DAT3>,
+ <MT7623_PIN_105_MSDC1_CMD_FUNC_MSDC1_CMD>;
+ input-enable;
+ drive-strength = <MTK_DRIVE_4mA>;
+ bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
+ };
+
+ pins_clk {
+ pinmux = <MT7623_PIN_106_MSDC1_CLK_FUNC_MSDC1_CLK>;
+ drive-strength = <MTK_DRIVE_4mA>;
+ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
+ };
+ };
+
+ pwm_pins_a: pwm@0 {
+ pins_pwm {
+ pinmux = <MT7623_PIN_203_PWM0_FUNC_PWM0>,
+ <MT7623_PIN_204_PWM1_FUNC_PWM1>,
+ <MT7623_PIN_205_PWM2_FUNC_PWM2>,
+ <MT7623_PIN_206_PWM3_FUNC_PWM3>,
+ <MT7623_PIN_207_PWM4_FUNC_PWM4>;
+ };
+ };
+
+ spi0_pins_a: spi@0 {
+ pins_spi {
+ pinmux = <MT7623_PIN_53_SPI0_CSN_FUNC_SPI0_CS>,
+ <MT7623_PIN_54_SPI0_CK_FUNC_SPI0_CK>,
+ <MT7623_PIN_55_SPI0_MI_FUNC_SPI0_MI>,
+ <MT7623_PIN_56_SPI0_MO_FUNC_SPI0_MO>;
+ bias-disable;
+ };
+ };
+
+ uart0_pins_a: uart@0 {
+ pins_dat {
+ pinmux = <MT7623_PIN_79_URXD0_FUNC_URXD0>,
+ <MT7623_PIN_80_UTXD0_FUNC_UTXD0>;
+ };
+ };
+
+ uart1_pins_a: uart@1 {
+ pins_dat {
+ pinmux = <MT7623_PIN_81_URXD1_FUNC_URXD1>,
+ <MT7623_PIN_82_UTXD1_FUNC_UTXD1>;
+ };
+ };
+};
+
+&pwm {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm_pins_a>;
+ status = "okay";
+};
+
+&pwrap {
+ mt6323 {
+ mt6323led: led {
+ compatible = "mediatek,mt6323-led";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ led@0 {
+ reg = <0>;
+ label = "bpi-r2:isink:green";
+ default-state = "off";
+ };
+
+ led@1 {
+ reg = <1>;
+ label = "bpi-r2:isink:red";
+ default-state = "off";
+ };
+
+ led@2 {
+ reg = <2>;
+ label = "bpi-r2:isink:blue";
+ default-state = "off";
+ };
+ };
+ };
+};
+
+&spi0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi0_pins_a>;
+ status = "okay";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins_a>;
+ status = "disabled";
+};
+
+&uart1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart1_pins_a>;
+ status = "disabled";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&usb1 {
+ vusb33-supply = <&mt6323_vusb_reg>;
+ status = "okay";
+};
+
+&usb2 {
+ vusb33-supply = <&mt6323_vusb_reg>;
+ status = "okay";
+};
+
+&u3phy1 {
+ status = "okay";
+};
+
+&u3phy2 {
+ status = "okay";
+};
+
diff --git a/arch/arm/boot/dts/mt7623n-rfb-nand.dts b/arch/arm/boot/dts/mt7623n-rfb-nand.dts
new file mode 100644
index 000000000000..17c578f0d261
--- /dev/null
+++ b/arch/arm/boot/dts/mt7623n-rfb-nand.dts
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: John Crispin <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "mt7623n-rfb.dtsi"
+
+/ {
+ model = "MediaTek MT7623N NAND reference board";
+ compatible = "mediatek,mt7623n-rfb-nand", "mediatek,mt7623";
+};
+
+&bch {
+ status = "okay";
+};
+
+&nandc {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&nand_pins_default>;
+
+ nand@0 {
+ reg = <0>;
+ spare_per_sector = <64>;
+ nand-ecc-mode = "hw";
+ nand-ecc-strength = <12>;
+ nand-ecc-step-size = <1024>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "preloader";
+ reg = <0x0 0x40000>;
+ };
+
+ partition@40000 {
+ label = "uboot";
+ reg = <0x40000 0x80000>;
+ };
+
+ partition@C0000 {
+ label = "uboot-env";
+ reg = <0xC0000 0x40000>;
+ };
+
+ partition@140000 {
+ label = "bootimg";
+ reg = <0x140000 0x2000000>;
+ };
+
+ partition@2140000 {
+ label = "recovery";
+ reg = <0x2140000 0x2000000>;
+ };
+
+ partition@4140000 {
+ label = "rootfs";
+ reg = <0x4140000 0x1000000>;
+ };
+
+ partition@5140000 {
+ label = "usrdata";
+ reg = <0x5140000 0x1000000>;
+ };
+ };
+ };
+};
+
+&pio {
+ nand_pins_default: nanddefault {
+ pins_ale {
+ pinmux = <MT7623_PIN_116_MSDC0_CMD_FUNC_NALE>;
+ drive-strength = <MTK_DRIVE_8mA>;
+ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
+ };
+
+ pins_dat {
+ pinmux = <MT7623_PIN_111_MSDC0_DAT7_FUNC_NLD7>,
+ <MT7623_PIN_112_MSDC0_DAT6_FUNC_NLD6>,
+ <MT7623_PIN_114_MSDC0_DAT4_FUNC_NLD4>,
+ <MT7623_PIN_118_MSDC0_DAT3_FUNC_NLD3>,
+ <MT7623_PIN_121_MSDC0_DAT0_FUNC_NLD0>,
+ <MT7623_PIN_120_MSDC0_DAT1_FUNC_NLD1>,
+ <MT7623_PIN_113_MSDC0_DAT5_FUNC_NLD5>,
+ <MT7623_PIN_115_MSDC0_RSTB_FUNC_NLD8>,
+ <MT7623_PIN_119_MSDC0_DAT2_FUNC_NLD2>;
+ input-enable;
+ drive-strength = <MTK_DRIVE_8mA>;
+ bias-pull-up;
+ };
+
+ pins_we {
+ pinmux = <MT7623_PIN_117_MSDC0_CLK_FUNC_NWEB>;
+ drive-strength = <MTK_DRIVE_8mA>;
+ bias-pull-up = <MTK_PUPD_SET_R1R0_10>;
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/mt7623n-rfb.dtsi b/arch/arm/boot/dts/mt7623n-rfb.dtsi
new file mode 100644
index 000000000000..256c5fd947bf
--- /dev/null
+++ b/arch/arm/boot/dts/mt7623n-rfb.dtsi
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: John Crispin <[email protected]>
+ * Sean Wang <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "mt7623.dtsi"
+#include "mt6323.dtsi"
+
+/ {
+ aliases {
+ serial0 = &uart0;
+ serial1 = &uart1;
+ serial2 = &uart2;
+ };
+
+ chosen {
+ stdout-path = "serial2:115200n8";
+ };
+
+ cpus {
+ cpu0 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu1 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu2 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+
+ cpu3 {
+ proc-supply = <&mt6323_vproc_reg>;
+ };
+ };
+
+ memory@80000000 {
+ reg = <0 0x80000000 0 0x40000000>;
+ };
+
+ usb_p1_vbus: regulator@0 {
+ compatible = "regulator-fixed";
+ regulator-name = "usb_vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&pio 135 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+};
+
+&mmc0 {
+ vmmc-supply = <&mt6323_vemc3v3_reg>;
+ vqmmc-supply = <&mt6323_vio18_reg>;
+};
+
+&mmc1 {
+ vmmc-supply = <&mt6323_vmch_reg>;
+ vqmmc-supply = <&mt6323_vmc_reg>;
+};
+
+&uart0 {
+ status = "okay";
+};
+
+&uart1 {
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&usb1 {
+ vbus-supply = <&usb_p1_vbus>;
+ status = "okay";
+};
+
+&u3phy1 {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/omap3-beagle-xm.dts b/arch/arm/boot/dts/omap3-beagle-xm.dts
index 673cee2234b2..683b96a8f73e 100644
--- a/arch/arm/boot/dts/omap3-beagle-xm.dts
+++ b/arch/arm/boot/dts/omap3-beagle-xm.dts
@@ -299,7 +299,7 @@
&mmc1 {
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <8>;
};
diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts
index 4be85ce59dd1..4d2eaf843fa9 100644
--- a/arch/arm/boot/dts/omap3-beagle.dts
+++ b/arch/arm/boot/dts/omap3-beagle.dts
@@ -283,7 +283,7 @@
&mmc1 {
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <8>;
};
diff --git a/arch/arm/boot/dts/omap3-cm-t3517.dts b/arch/arm/boot/dts/omap3-cm-t3517.dts
index 53ae04f9104d..3d293b345e99 100644
--- a/arch/arm/boot/dts/omap3-cm-t3517.dts
+++ b/arch/arm/boot/dts/omap3-cm-t3517.dts
@@ -129,7 +129,7 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <&wl12xx_vmmc2>;
- vmmc_aux-supply = <&wl12xx_vaux2>;
+ vqmmc-supply = <&wl12xx_vaux2>;
non-removable;
bus-width = <4>;
cap-power-off-card;
diff --git a/arch/arm/boot/dts/omap3-cm-t3730.dts b/arch/arm/boot/dts/omap3-cm-t3730.dts
index 2294f5b0aa10..bdf4b7fdda39 100644
--- a/arch/arm/boot/dts/omap3-cm-t3730.dts
+++ b/arch/arm/boot/dts/omap3-cm-t3730.dts
@@ -69,7 +69,7 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <&wl12xx_vmmc2>;
- vmmc_aux-supply = <&wl12xx_vaux2>;
+ vqmmc-supply = <&wl12xx_vaux2>;
non-removable;
bus-width = <4>;
cap-power-off-card;
diff --git a/arch/arm/boot/dts/omap3-devkit8000-common.dtsi b/arch/arm/boot/dts/omap3-devkit8000-common.dtsi
index 82aa9c4a0f1c..0c0bb1b01b0b 100644
--- a/arch/arm/boot/dts/omap3-devkit8000-common.dtsi
+++ b/arch/arm/boot/dts/omap3-devkit8000-common.dtsi
@@ -149,7 +149,7 @@
&mmc1 {
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <8>;
};
diff --git a/arch/arm/boot/dts/omap3-evm-common.dtsi b/arch/arm/boot/dts/omap3-evm-common.dtsi
index 2b1d6977a535..ff35803088e3 100644
--- a/arch/arm/boot/dts/omap3-evm-common.dtsi
+++ b/arch/arm/boot/dts/omap3-evm-common.dtsi
@@ -115,7 +115,7 @@
&mmc1 {
interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <8>;
};
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts
index 49f37084e435..4acd32a1c4ef 100644
--- a/arch/arm/boot/dts/omap3-n900.dts
+++ b/arch/arm/boot/dts/omap3-n900.dts
@@ -164,6 +164,29 @@
};
};
+&isp {
+ vdds_csib-supply = <&vaux2>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&camera_pins>;
+
+ ports {
+ port@1 {
+ reg = <1>;
+
+ csi_isp: endpoint {
+ remote-endpoint = <&csi_cam1>;
+ bus-type = <3>; /* CCP2 */
+ clock-lanes = <1>;
+ data-lanes = <0>;
+ lane-polarity = <0 0>;
+ /* Select strobe = <1> for back camera, <0> for front camera */
+ strobe = <1>;
+ };
+ };
+ };
+};
+
&omap3_pmx_core {
pinctrl-names = "default";
@@ -328,6 +351,22 @@
OMAP3_CORE1_IOPAD(0x218e, PIN_OUTPUT | MUX_MODE4) /* gpio 157 => cmt_bsi */
>;
};
+
+ camera_pins: pinmux_camera {
+ pinctrl-single,pins = <
+ OMAP3_CORE1_IOPAD(0x210c, PIN_OUTPUT | MUX_MODE7) /* cam_hs */
+ OMAP3_CORE1_IOPAD(0x210e, PIN_OUTPUT | MUX_MODE7) /* cam_vs */
+ OMAP3_CORE1_IOPAD(0x2110, PIN_OUTPUT | MUX_MODE0) /* cam_xclka */
+ OMAP3_CORE1_IOPAD(0x211e, PIN_OUTPUT | MUX_MODE7) /* cam_d4 */
+ OMAP3_CORE1_IOPAD(0x2122, PIN_INPUT | MUX_MODE0) /* cam_d6 */
+ OMAP3_CORE1_IOPAD(0x2124, PIN_INPUT | MUX_MODE0) /* cam_d7 */
+ OMAP3_CORE1_IOPAD(0x2126, PIN_INPUT | MUX_MODE0) /* cam_d8 */
+ OMAP3_CORE1_IOPAD(0x2128, PIN_INPUT | MUX_MODE0) /* cam_d9 */
+ OMAP3_CORE1_IOPAD(0x212a, PIN_OUTPUT | MUX_MODE7) /* cam_d10 */
+ OMAP3_CORE1_IOPAD(0x212e, PIN_OUTPUT | MUX_MODE7) /* cam_xclkb */
+ OMAP3_CORE1_IOPAD(0x2132, PIN_OUTPUT | MUX_MODE0) /* cam_strobe */
+ >;
+ };
};
&i2c1 {
@@ -726,6 +765,40 @@
st,max-limit-y = <32>;
st,max-limit-z = <32>;
};
+
+ cam1: camera@3e {
+ compatible = "toshiba,et8ek8";
+ reg = <0x3e>;
+
+ vana-supply = <&vaux4>;
+
+ clocks = <&isp 0>;
+ clock-names = "extclk";
+ clock-frequency = <9600000>;
+
+ reset-gpio = <&gpio4 6 GPIO_ACTIVE_HIGH>; /* 102 */
+
+ port {
+ csi_cam1: endpoint {
+ bus-type = <3>; /* CCP2 */
+ strobe = <1>;
+ clock-inv = <0>;
+ crc = <1>;
+
+ remote-endpoint = <&csi_isp>;
+ };
+ };
+ };
+
+ /* D/A converter for auto-focus */
+ ad5820: dac@0c {
+ compatible = "adi,ad5820";
+ reg = <0x0c>;
+
+ VANA-supply = <&vaux4>;
+
+ #io-channel-cells = <0>;
+ };
};
&mmc1 {
@@ -733,6 +806,9 @@
pinctrl-0 = <&mmc1_pins>;
vmmc-supply = <&vmmc1>;
bus-width = <4>;
+ /* For debugging, it is often good idea to remove this GPIO.
+ It means you can remove back cover (to reboot by removing
+ battery) and still use the MMC card. */
cd-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* 160 */
};
@@ -741,7 +817,7 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <&vaux3>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <8>;
non-removable;
no-sdio;
diff --git a/arch/arm/boot/dts/omap3-n950-n9.dtsi b/arch/arm/boot/dts/omap3-n950-n9.dtsi
index cb47ae79a5f9..1b0bd72945f2 100644
--- a/arch/arm/boot/dts/omap3-n950-n9.dtsi
+++ b/arch/arm/boot/dts/omap3-n950-n9.dtsi
@@ -267,15 +267,19 @@
clock-frequency = <400000>;
as3645a@30 {
+ #address-cells = <1>;
+ #size-cells = <0>;
reg = <0x30>;
compatible = "ams,as3645a";
- flash {
+ flash@0 {
+ reg = <0x0>;
flash-timeout-us = <150000>;
flash-max-microamp = <320000>;
led-max-microamp = <60000>;
- peak-current-limit = <1750000>;
+ ams,input-max-microamp = <1750000>;
};
- indicator {
+ indicator@1 {
+ reg = <0x1>;
led-max-microamp = <10000>;
};
};
diff --git a/arch/arm/boot/dts/omap3-overo-base.dtsi b/arch/arm/boot/dts/omap3-overo-base.dtsi
index cd220342a805..f25e158e7163 100644
--- a/arch/arm/boot/dts/omap3-overo-base.dtsi
+++ b/arch/arm/boot/dts/omap3-overo-base.dtsi
@@ -181,7 +181,7 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <&w3cbw003c_npoweron>;
- vmmc_aux-supply = <&w3cbw003c_wifi_nreset>;
+ vqmmc-supply = <&w3cbw003c_wifi_nreset>;
bus-width = <4>;
cap-sdio-irq;
non-removable;
diff --git a/arch/arm/boot/dts/omap3-tao3530.dtsi b/arch/arm/boot/dts/omap3-tao3530.dtsi
index 06ac0f80bcf0..9a601d15247b 100644
--- a/arch/arm/boot/dts/omap3-tao3530.dtsi
+++ b/arch/arm/boot/dts/omap3-tao3530.dtsi
@@ -223,7 +223,7 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
cd-gpios = <&twl_gpio 0 GPIO_ACTIVE_HIGH>;
bus-width = <8>;
};
diff --git a/arch/arm/boot/dts/omap3-zoom3.dts b/arch/arm/boot/dts/omap3-zoom3.dts
index 45e2ce0803de..96d0301a336a 100644
--- a/arch/arm/boot/dts/omap3-zoom3.dts
+++ b/arch/arm/boot/dts/omap3-zoom3.dts
@@ -174,7 +174,7 @@
&mmc1 {
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
bus-width = <4>;
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi
index a3ff4933dbc1..bdaf30c8c405 100644
--- a/arch/arm/boot/dts/omap3.dtsi
+++ b/arch/arm/boot/dts/omap3.dtsi
@@ -713,14 +713,12 @@
usbhsohci: ohci@48064400 {
compatible = "ti,ohci-omap3";
reg = <0x48064400 0x400>;
- interrupt-parent = <&intc>;
interrupts = <76>;
};
usbhsehci: ehci@48064800 {
compatible = "ti,ehci-omap";
reg = <0x48064800 0x400>;
- interrupt-parent = <&intc>;
interrupts = <77>;
};
};
@@ -831,7 +829,6 @@
reg-names = "tx",
"rx";
- interrupt-parent = <&intc>;
interrupts = <67>,
<68>;
};
@@ -844,7 +841,6 @@
reg-names = "tx",
"rx";
- interrupt-parent = <&intc>;
interrupts = <69>,
<70>;
};
diff --git a/arch/arm/boot/dts/omap3430-sdp.dts b/arch/arm/boot/dts/omap3430-sdp.dts
index abd6921143be..908951eb5943 100644
--- a/arch/arm/boot/dts/omap3430-sdp.dts
+++ b/arch/arm/boot/dts/omap3430-sdp.dts
@@ -33,7 +33,7 @@
&mmc1 {
vmmc-supply = <&vmmc1>;
- vmmc_aux-supply = <&vsim>;
+ vqmmc-supply = <&vsim>;
/*
* S6-3 must be in ON position for 8 bit mode to function
* Else, use 4 bit mode
diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts
index 10ca1c174995..8b93d37310f2 100644
--- a/arch/arm/boot/dts/omap4-droid4-xt894.dts
+++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts
@@ -129,6 +129,34 @@
output-high;
line-name = "touchscreen-reset";
};
+
+ pwm8: dmtimer-pwm-8 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&vibrator_direction_pin>;
+
+ compatible = "ti,omap-dmtimer-pwm";
+ #pwm-cells = <3>;
+ ti,timers = <&timer8>;
+ ti,clock-source = <0x01>;
+ };
+
+ pwm9: dmtimer-pwm-9 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&vibrator_enable_pin>;
+
+ compatible = "ti,omap-dmtimer-pwm";
+ #pwm-cells = <3>;
+ ti,timers = <&timer9>;
+ ti,clock-source = <0x01>;
+ };
+
+ vibrator {
+ compatible = "pwm-vibrator";
+ pwms = <&pwm9 0 10000000 0>, <&pwm8 0 10000000 0>;
+ pwm-names = "enable", "direction";
+ direction-duty-cycle-ns = <10000000>;
+ };
+
};
&dsi1 {
@@ -373,7 +401,7 @@
/* hdmi_cec.hdmi_cec, hdmi_scl.hdmi_scl, hdmi_sda.hdmi_sda */
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0)
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0)
OMAP4_IOPAD(0x09c, PIN_INPUT | MUX_MODE0)
OMAP4_IOPAD(0x09e, PIN_INPUT | MUX_MODE0)
>;
@@ -488,6 +516,18 @@
OMAP4_IOPAD(0x040, PIN_OUTPUT_PULLDOWN | MUX_MODE3)
>;
};
+
+ vibrator_direction_pin: pinmux_vibrator_direction_pin {
+ pinctrl-single,pins = <
+ OMAP4_IOPAD(0x1ce, PIN_OUTPUT | MUX_MODE1) /* dmtimer8_pwm_evt (gpio_27) */
+ >;
+ };
+
+ vibrator_enable_pin: pinmux_vibrator_enable_pin {
+ pinctrl-single,pins = <
+ OMAP4_IOPAD(0X1d0, PIN_OUTPUT | MUX_MODE1) /* dmtimer9_pwm_evt (gpio_28) */
+ >;
+ };
};
&uart3 {
diff --git a/arch/arm/boot/dts/omap4-duovero-parlor.dts b/arch/arm/boot/dts/omap4-duovero-parlor.dts
index 1b825128a7b9..a9a584b5b955 100644
--- a/arch/arm/boot/dts/omap4-duovero-parlor.dts
+++ b/arch/arm/boot/dts/omap4-duovero-parlor.dts
@@ -100,7 +100,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
OMAP4_IOPAD(0x098, PIN_INPUT | MUX_MODE3) /* hdmi_hpd.gpio_63 */
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP4_IOPAD(0x09c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_ddc_scl.hdmi_ddc_scl */
OMAP4_IOPAD(0x09e, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_ddc_sda.hdmi_ddc_sda */
>;
diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi
index edbc4090297d..2b48e51c372a 100644
--- a/arch/arm/boot/dts/omap4-panda-common.dtsi
+++ b/arch/arm/boot/dts/omap4-panda-common.dtsi
@@ -267,7 +267,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP4_IOPAD(0x09c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_scl.hdmi_scl */
OMAP4_IOPAD(0x09e, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_sda.hdmi_sda */
>;
diff --git a/arch/arm/boot/dts/omap4-sdp-es23plus.dts b/arch/arm/boot/dts/omap4-sdp-es23plus.dts
index b4d19a7ae393..3d3140fd9659 100644
--- a/arch/arm/boot/dts/omap4-sdp-es23plus.dts
+++ b/arch/arm/boot/dts/omap4-sdp-es23plus.dts
@@ -10,7 +10,7 @@
/* SDP boards with 4430 ES2.3+ or 4460 have external pullups on SCL & SDA */
&dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP4_IOPAD(0x09c, PIN_INPUT | MUX_MODE0) /* hdmi_scl.hdmi_scl */
OMAP4_IOPAD(0x09e, PIN_INPUT | MUX_MODE0) /* hdmi_sda.hdmi_sda */
>;
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts
index d728ec963111..280d92d42bf1 100644
--- a/arch/arm/boot/dts/omap4-sdp.dts
+++ b/arch/arm/boot/dts/omap4-sdp.dts
@@ -290,7 +290,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP4_IOPAD(0x09c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_scl.hdmi_scl */
OMAP4_IOPAD(0x09e, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_sda.hdmi_sda */
>;
diff --git a/arch/arm/boot/dts/omap4-var-om44customboard.dtsi b/arch/arm/boot/dts/omap4-var-om44customboard.dtsi
index 74940b6d7719..676d8dd0624a 100644
--- a/arch/arm/boot/dts/omap4-var-om44customboard.dtsi
+++ b/arch/arm/boot/dts/omap4-var-om44customboard.dtsi
@@ -122,7 +122,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP4_IOPAD(0x09a, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP4_IOPAD(0x09a, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP4_IOPAD(0x09c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_scl.hdmi_scl */
OMAP4_IOPAD(0x09e, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_sda.hdmi_sda */
>;
diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi
index 4caadb253249..7824b2631cb6 100644
--- a/arch/arm/boot/dts/omap5-board-common.dtsi
+++ b/arch/arm/boot/dts/omap5-board-common.dtsi
@@ -290,7 +290,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP5_IOPAD(0x13c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec.hdmi_cec */
+ OMAP5_IOPAD(0x13c, PIN_INPUT | MUX_MODE0) /* hdmi_cec.hdmi_cec */
OMAP5_IOPAD(0x140, PIN_INPUT | MUX_MODE0) /* hdmi_ddc_scl.hdmi_ddc_scl */
OMAP5_IOPAD(0x142, PIN_INPUT | MUX_MODE0) /* hdmi_ddc_sda.hdmi_ddc_sda */
>;
diff --git a/arch/arm/boot/dts/omap5-cm-t54.dts b/arch/arm/boot/dts/omap5-cm-t54.dts
index 78397f66d0b2..552a5c4c5942 100644
--- a/arch/arm/boot/dts/omap5-cm-t54.dts
+++ b/arch/arm/boot/dts/omap5-cm-t54.dts
@@ -266,7 +266,7 @@
dss_hdmi_pins: pinmux_dss_hdmi_pins {
pinctrl-single,pins = <
- OMAP5_IOPAD(0x013c, PIN_INPUT_PULLUP | MUX_MODE0) /* hdmi_cec */
+ OMAP5_IOPAD(0x013c, PIN_INPUT | MUX_MODE0) /* hdmi_cec */
OMAP5_IOPAD(0x0140, PIN_INPUT | MUX_MODE0) /* hdmi_ddc_scl */
OMAP5_IOPAD(0x0142, PIN_INPUT | MUX_MODE0) /* hdmi_ddc_sda */
>;
diff --git a/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi b/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
index b9457dd21a69..e413b21ee331 100644
--- a/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
+++ b/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
@@ -20,27 +20,12 @@
model = "Qualcomm Technologies, Inc. IPQ4019/AP-DK01.1";
compatible = "qcom,ipq4019";
- clocks {
- xo: xo {
- compatible = "fixed-clock";
- clock-frequency = <48000000>;
- #clock-cells = <0>;
- };
- };
-
soc {
-
-
- timer {
- compatible = "arm,armv7-timer";
- interrupts = <1 2 0xf08>,
- <1 3 0xf08>,
- <1 4 0xf08>,
- <1 1 0xf08>;
- clock-frequency = <48000000>;
+ rng@22000 {
+ status = "ok";
};
- pinctrl@0x01000000 {
+ pinctrl@1000000 {
serial_pins: serial_pinmux {
mux {
pins = "gpio60", "gpio61";
@@ -108,5 +93,13 @@
watchdog@b017000 {
status = "ok";
};
+
+ wifi@a000000 {
+ status = "ok";
+ };
+
+ wifi@a800000 {
+ status = "ok";
+ };
};
};
diff --git a/arch/arm/boot/dts/qcom-ipq4019.dtsi b/arch/arm/boot/dts/qcom-ipq4019.dtsi
index 4b7d97275c62..10d112a4078e 100644
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
@@ -96,6 +96,21 @@
clock-frequency = <32768>;
#clock-cells = <0>;
};
+
+ xo: xo {
+ compatible = "fixed-clock";
+ clock-frequency = <48000000>;
+ #clock-cells = <0>;
+ };
+ };
+
+ timer {
+ compatible = "arm,armv7-timer";
+ interrupts = <1 2 0xf08>,
+ <1 3 0xf08>,
+ <1 4 0xf08>,
+ <1 1 0xf08>;
+ clock-frequency = <48000000>;
};
soc {
@@ -119,7 +134,15 @@
reg = <0x1800000 0x60000>;
};
- tlmm: pinctrl@0x01000000 {
+ rng@22000 {
+ compatible = "qcom,prng";
+ reg = <0x22000 0x140>;
+ clocks = <&gcc GCC_PRNG_AHB_CLK>;
+ clock-names = "core";
+ status = "disabled";
+ };
+
+ tlmm: pinctrl@1000000 {
compatible = "qcom,ipq4019-pinctrl";
reg = <0x01000000 0x300000>;
gpio-controller;
@@ -269,5 +292,89 @@
compatible = "qcom,pshold";
reg = <0x4ab000 0x4>;
};
+
+ wifi0: wifi@a000000 {
+ compatible = "qcom,ipq4019-wifi";
+ reg = <0xa000000 0x200000>;
+ resets = <&gcc WIFI0_CPU_INIT_RESET>,
+ <&gcc WIFI0_RADIO_SRIF_RESET>,
+ <&gcc WIFI0_RADIO_WARM_RESET>,
+ <&gcc WIFI0_RADIO_COLD_RESET>,
+ <&gcc WIFI0_CORE_WARM_RESET>,
+ <&gcc WIFI0_CORE_COLD_RESET>;
+ reset-names = "wifi_cpu_init", "wifi_radio_srif",
+ "wifi_radio_warm", "wifi_radio_cold",
+ "wifi_core_warm", "wifi_core_cold";
+ clocks = <&gcc GCC_WCSS2G_CLK>,
+ <&gcc GCC_WCSS2G_REF_CLK>,
+ <&gcc GCC_WCSS2G_RTC_CLK>;
+ clock-names = "wifi_wcss_cmd", "wifi_wcss_ref",
+ "wifi_wcss_rtc";
+ interrupts = <GIC_SPI 32 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 33 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 34 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 35 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 36 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 37 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 38 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 39 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 40 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 41 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 42 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 43 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 44 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 45 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 46 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 47 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 168 IRQ_TYPE_NONE>;
+ interrupt-names = "msi0", "msi1", "msi2", "msi3",
+ "msi4", "msi5", "msi6", "msi7",
+ "msi8", "msi9", "msi10", "msi11",
+ "msi12", "msi13", "msi14", "msi15",
+ "legacy";
+ status = "disabled";
+ };
+
+ wifi1: wifi@a800000 {
+ compatible = "qcom,ipq4019-wifi";
+ reg = <0xa800000 0x200000>;
+ resets = <&gcc WIFI1_CPU_INIT_RESET>,
+ <&gcc WIFI1_RADIO_SRIF_RESET>,
+ <&gcc WIFI1_RADIO_WARM_RESET>,
+ <&gcc WIFI1_RADIO_COLD_RESET>,
+ <&gcc WIFI1_CORE_WARM_RESET>,
+ <&gcc WIFI1_CORE_COLD_RESET>;
+ reset-names = "wifi_cpu_init", "wifi_radio_srif",
+ "wifi_radio_warm", "wifi_radio_cold",
+ "wifi_core_warm", "wifi_core_cold";
+ clocks = <&gcc GCC_WCSS5G_CLK>,
+ <&gcc GCC_WCSS5G_REF_CLK>,
+ <&gcc GCC_WCSS5G_RTC_CLK>;
+ clock-names = "wifi_wcss_cmd", "wifi_wcss_ref",
+ "wifi_wcss_rtc";
+ interrupts = <GIC_SPI 48 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 49 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 50 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 51 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 52 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 53 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 54 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 55 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 56 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 57 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 58 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 59 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 60 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 61 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 62 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 63 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 169 IRQ_TYPE_NONE>;
+ interrupt-names = "msi0", "msi1", "msi2", "msi3",
+ "msi4", "msi5", "msi6", "msi7",
+ "msi8", "msi9", "msi10", "msi11",
+ "msi12", "msi13", "msi14", "msi15",
+ "legacy";
+ status = "disabled";
+ };
};
};
diff --git a/arch/arm/boot/dts/qcom-msm8974.dtsi b/arch/arm/boot/dts/qcom-msm8974.dtsi
index c5ee68a3f7f5..a39207625354 100644
--- a/arch/arm/boot/dts/qcom-msm8974.dtsi
+++ b/arch/arm/boot/dts/qcom-msm8974.dtsi
@@ -779,7 +779,7 @@
};
replicator@fc31c000 {
- compatible = "qcom,coresight-replicator1x", "arm,primecell";
+ compatible = "arm,coresight-dynamic-replicator", "arm,primecell";
reg = <0xfc31c000 0x1000>;
clocks = <&rpmcc RPM_SMD_QDSS_CLK>, <&rpmcc RPM_SMD_QDSS_A_CLK>;
diff --git a/arch/arm/boot/dts/r7s72100-genmai.dts b/arch/arm/boot/dts/r7s72100-genmai.dts
index 52a7b586bac7..cd4d5ff7749e 100644
--- a/arch/arm/boot/dts/r7s72100-genmai.dts
+++ b/arch/arm/boot/dts/r7s72100-genmai.dts
@@ -11,6 +11,8 @@
/dts-v1/;
#include "r7s72100.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/pinctrl/r7s72100-pinctrl.h>
/ {
model = "Genmai";
@@ -34,6 +36,54 @@
#address-cells = <1>;
#size-cells = <1>;
};
+
+ leds {
+ status = "okay";
+ compatible = "gpio-leds";
+
+ led1 {
+ gpios = <&port4 10 GPIO_ACTIVE_LOW>;
+ };
+
+ led2 {
+ gpios = <&port4 11 GPIO_ACTIVE_LOW>;
+ };
+ };
+};
+
+&pinctrl {
+
+ scif2_pins: serial2 {
+ /* P3_0 as TxD2; P3_2 as RxD2 */
+ pinmux = <RZA1_PINMUX(3, 0, 6)>, <RZA1_PINMUX(3, 2, 4)>;
+ };
+
+ i2c2_pins: i2c2 {
+ /* RIIC2: P1_4 as SCL, P1_5 as SDA */
+ pinmux = <RZA1_PINMUX(1, 4, 1)>, <RZA1_PINMUX(1, 5, 1)>;
+ };
+
+ ether_pins: ether {
+ /* Ethernet on Ports 1,2,3,5 */
+ pinmux = <RZA1_PINMUX(1, 14, 4)>,/* P1_14 = ET_COL */
+ <RZA1_PINMUX(5, 9, 2)>, /* P5_9 = ET_MDC */
+ <RZA1_PINMUX(3, 3, 2)>, /* P3_3 = ET_MDIO */
+ <RZA1_PINMUX(3, 4, 2)>, /* P3_4 = ET_RXCLK */
+ <RZA1_PINMUX(3, 5, 2)>, /* P3_5 = ET_RXER */
+ <RZA1_PINMUX(3, 6, 2)>, /* P3_6 = ET_RXDV */
+ <RZA1_PINMUX(2, 0, 2)>, /* P2_0 = ET_TXCLK */
+ <RZA1_PINMUX(2, 1, 2)>, /* P2_1 = ET_TXER */
+ <RZA1_PINMUX(2, 2, 2)>, /* P2_2 = ET_TXEN */
+ <RZA1_PINMUX(2, 3, 2)>, /* P2_3 = ET_CRS */
+ <RZA1_PINMUX(2, 4, 2)>, /* P2_4 = ET_TXD0 */
+ <RZA1_PINMUX(2, 5, 2)>, /* P2_5 = ET_TXD1 */
+ <RZA1_PINMUX(2, 6, 2)>, /* P2_6 = ET_TXD2 */
+ <RZA1_PINMUX(2, 7, 2)>, /* P2_7 = ET_TXD3 */
+ <RZA1_PINMUX(2, 8, 2)>, /* P2_8 = ET_RXD0 */
+ <RZA1_PINMUX(2, 9, 2)>, /* P2_9 = ET_RXD1 */
+ <RZA1_PINMUX(2, 10, 2)>,/* P2_10 = ET_RXD2 */
+ <RZA1_PINMUX(2, 11, 2)>;/* P2_11 = ET_RXD3 */
+ };
};
&extal_clk {
@@ -52,12 +102,28 @@
status = "okay";
};
+&ether {
+ pinctrl-names = "default";
+ pinctrl-0 = <&ether_pins>;
+
+ status = "okay";
+
+ renesas,no-ether-link;
+ phy-handle = <&phy0>;
+ phy0: ethernet-phy@0 {
+ reg = <0>;
+ };
+};
+
&i2c2 {
status = "okay";
clock-frequency = <400000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c2_pins>;
+
eeprom@50 {
- compatible = "renesas,24c128";
+ compatible = "renesas,24c128", "atmel,24c128";
reg = <0x50>;
pagesize = <64>;
};
@@ -68,6 +134,9 @@
};
&scif2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&scif2_pins>;
+
status = "okay";
};
diff --git a/arch/arm/boot/dts/r7s72100-rskrza1.dts b/arch/arm/boot/dts/r7s72100-rskrza1.dts
index 72df20a04320..5dcaaf131d27 100644
--- a/arch/arm/boot/dts/r7s72100-rskrza1.dts
+++ b/arch/arm/boot/dts/r7s72100-rskrza1.dts
@@ -10,6 +10,8 @@
/dts-v1/;
#include "r7s72100.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/pinctrl/r7s72100-pinctrl.h>
/ {
model = "RSKRZA1";
@@ -33,6 +35,15 @@
#address-cells = <1>;
#size-cells = <1>;
};
+
+ leds {
+ status = "okay";
+ compatible = "gpio-leds";
+
+ led0 {
+ gpios = <&port7 1 GPIO_ACTIVE_LOW>;
+ };
+ };
};
&extal_clk {
@@ -47,11 +58,57 @@
clock-frequency = <32768>;
};
+&pinctrl {
+
+ /* Serial Console */
+ scif2_pins: serial2 {
+ pinmux = <RZA1_PINMUX(3, 0, 6)>, /* TxD2 */
+ <RZA1_PINMUX(3, 2, 4)>; /* RxD2 */
+ };
+
+ /* Ethernet */
+ ether_pins: ether {
+ /* Ethernet on Ports 1,2,3,5 */
+ pinmux = <RZA1_PINMUX(1, 14, 4)>, /* ET_COL */
+ <RZA1_PINMUX(5, 9, 2)>, /* ET_MDC */
+ <RZA1_PINMUX(3, 3, 2)>, /* ET_MDIO */
+ <RZA1_PINMUX(3, 4, 2)>, /* ET_RXCLK */
+ <RZA1_PINMUX(3, 5, 2)>, /* ET_RXER */
+ <RZA1_PINMUX(3, 6, 2)>, /* ET_RXDV */
+ <RZA1_PINMUX(2, 0, 2)>, /* ET_TXCLK */
+ <RZA1_PINMUX(2, 1, 2)>, /* ET_TXER */
+ <RZA1_PINMUX(2, 2, 2)>, /* ET_TXEN */
+ <RZA1_PINMUX(2, 3, 2)>, /* ET_CRS */
+ <RZA1_PINMUX(2, 4, 2)>, /* ET_TXD0 */
+ <RZA1_PINMUX(2, 5, 2)>, /* ET_TXD1 */
+ <RZA1_PINMUX(2, 6, 2)>, /* ET_TXD2 */
+ <RZA1_PINMUX(2, 7, 2)>, /* ET_TXD3 */
+ <RZA1_PINMUX(2, 8, 2)>, /* ET_RXD0 */
+ <RZA1_PINMUX(2, 9, 2)>, /* ET_RXD1 */
+ <RZA1_PINMUX(2, 10, 2)>, /* ET_RXD2 */
+ <RZA1_PINMUX(2, 11, 2)>; /* ET_RXD3 */
+ };
+
+ /* SDHI ch1 on CN1 */
+ sdhi1_pins: sdhi1 {
+ pinmux = <RZA1_PINMUX(3, 8, 7)>, /* SD_CD_1 */
+ <RZA1_PINMUX(3, 9, 7)>, /* SD_WP_1 */
+ <RZA1_PINMUX(3, 10, 7)>, /* SD_D1_1 */
+ <RZA1_PINMUX(3, 11, 7)>, /* SD_D0_1 */
+ <RZA1_PINMUX(3, 12, 7)>, /* SD_CLK_1 */
+ <RZA1_PINMUX(3, 13, 7)>, /* SD_CMD_1 */
+ <RZA1_PINMUX(3, 14, 7)>, /* SD_D3_1 */
+ <RZA1_PINMUX(3, 15, 7)>; /* SD_D2_1 */
+ };
+};
+
&mtu2 {
status = "okay";
};
&ether {
+ pinctrl-names = "default";
+ pinctrl-0 = <&ether_pins>;
status = "okay";
renesas,no-ether-link;
phy-handle = <&phy0>;
@@ -61,6 +118,8 @@
};
&sdhi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdhi1_pins>;
bus-width = <4>;
status = "okay";
};
@@ -78,5 +137,7 @@
};
&scif2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&scif2_pins>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/r7s72100.dtsi b/arch/arm/boot/dts/r7s72100.dtsi
index 5cf53e9943af..4ed12a4d9d51 100644
--- a/arch/arm/boot/dts/r7s72100.dtsi
+++ b/arch/arm/boot/dts/r7s72100.dtsi
@@ -207,6 +207,84 @@
};
};
+ pinctrl: pin-controller@fcfe3000 {
+ compatible = "renesas,r7s72100-ports";
+
+ reg = <0xfcfe3000 0x4230>;
+
+ port0: gpio-0 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 0 6>;
+ };
+
+ port1: gpio-1 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 16 16>;
+ };
+
+ port2: gpio-2 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 32 16>;
+ };
+
+ port3: gpio-3 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 48 16>;
+ };
+
+ port4: gpio-4 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 64 16>;
+ };
+
+ port5: gpio-5 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 80 11>;
+ };
+
+ port6: gpio-6 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 96 16>;
+ };
+
+ port7: gpio-7 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 112 16>;
+ };
+
+ port8: gpio-8 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 128 16>;
+ };
+
+ port9: gpio-9 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 144 8>;
+ };
+
+ port10: gpio-10 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 160 16>;
+ };
+
+ port11: gpio-11 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pinctrl 0 176 16>;
+ };
+ };
+
scif0: serial@e8007000 {
compatible = "renesas,scif-r7s72100", "renesas,scif";
reg = <0xe8007000 64>;
diff --git a/arch/arm/boot/dts/r8a7743-iwg20d-q7.dts b/arch/arm/boot/dts/r8a7743-iwg20d-q7.dts
index 9b54783cc2a5..081af0192851 100644
--- a/arch/arm/boot/dts/r8a7743-iwg20d-q7.dts
+++ b/arch/arm/boot/dts/r8a7743-iwg20d-q7.dts
@@ -17,9 +17,40 @@
aliases {
serial0 = &scif0;
+ ethernet0 = &avb;
+ };
+};
+
+&pfc {
+ scif0_pins: scif0 {
+ groups = "scif0_data_d";
+ function = "scif0";
+ };
+
+ avb_pins: avb {
+ groups = "avb_mdio", "avb_gmii";
+ function = "avb";
};
};
&scif0 {
+ pinctrl-0 = <&scif0_pins>;
+ pinctrl-names = "default";
+
status = "okay";
};
+
+&avb {
+ pinctrl-0 = <&avb_pins>;
+ pinctrl-names = "default";
+
+ phy-handle = <&phy3>;
+ phy-mode = "gmii";
+ renesas,no-ether-link;
+ status = "okay";
+
+ phy3: ethernet-phy@3 {
+ reg = <3>;
+ micrel,led-mode = <1>;
+ };
+};
diff --git a/arch/arm/boot/dts/r8a7743-iwg20m.dtsi b/arch/arm/boot/dts/r8a7743-iwg20m.dtsi
index 001ca9144f4b..ff7993818637 100644
--- a/arch/arm/boot/dts/r8a7743-iwg20m.dtsi
+++ b/arch/arm/boot/dts/r8a7743-iwg20m.dtsi
@@ -22,8 +22,34 @@
device_type = "memory";
reg = <2 0x00000000 0 0x20000000>;
};
+
+ reg_3p3v: 3p3v {
+ compatible = "regulator-fixed";
+ regulator-name = "3P3V";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
&extal_clk {
clock-frequency = <20000000>;
};
+
+&pfc {
+ mmcif0_pins: mmc {
+ groups = "mmc_data8_b", "mmc_ctrl";
+ function = "mmc";
+ };
+};
+
+&mmcif0 {
+ pinctrl-0 = <&mmcif0_pins>;
+ pinctrl-names = "default";
+
+ vmmc-supply = <&reg_3p3v>;
+ bus-width = <8>;
+ non-removable;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/r8a7743-sk-rzg1m.dts b/arch/arm/boot/dts/r8a7743-sk-rzg1m.dts
index 3a22538208f2..3d918d106593 100644
--- a/arch/arm/boot/dts/r8a7743-sk-rzg1m.dts
+++ b/arch/arm/boot/dts/r8a7743-sk-rzg1m.dts
@@ -1,7 +1,7 @@
/*
* Device Tree Source for the SK-RZG1M board
*
- * Copyright (C) 2016 Cogent Embedded, Inc.
+ * Copyright (C) 2016-2017 Cogent Embedded, Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -39,11 +39,34 @@
clock-frequency = <20000000>;
};
+&pfc {
+ scif0_pins: scif0 {
+ groups = "scif0_data_d";
+ function = "scif0";
+ };
+
+ ether_pins: ether {
+ groups = "eth_link", "eth_mdio", "eth_rmii";
+ function = "eth";
+ };
+
+ phy1_pins: phy1 {
+ groups = "intc_irq0";
+ function = "intc";
+ };
+};
+
&scif0 {
+ pinctrl-0 = <&scif0_pins>;
+ pinctrl-names = "default";
+
status = "okay";
};
&ether {
+ pinctrl-0 = <&ether_pins &phy1_pins>;
+ pinctrl-names = "default";
+
phy-handle = <&phy1>;
renesas,ether-link-active-low;
status = "okay";
diff --git a/arch/arm/boot/dts/r8a7743.dtsi b/arch/arm/boot/dts/r8a7743.dtsi
index 0ddac81742e4..14222c72f0e0 100644
--- a/arch/arm/boot/dts/r8a7743.dtsi
+++ b/arch/arm/boot/dts/r8a7743.dtsi
@@ -1,7 +1,7 @@
/*
* Device Tree Source for the r8a7743 SoC
*
- * Copyright (C) 2016 Cogent Embedded Inc.
+ * Copyright (C) 2016-2017 Cogent Embedded Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -18,9 +18,19 @@
#address-cells = <2>;
#size-cells = <2>;
+ aliases {
+ i2c0 = &i2c0;
+ i2c1 = &i2c1;
+ i2c2 = &i2c2;
+ i2c3 = &i2c3;
+ i2c4 = &i2c4;
+ i2c5 = &i2c5;
+ };
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
+ enable-method = "renesas,apmu";
cpu0: cpu@0 {
device_type = "cpu";
@@ -28,8 +38,26 @@
reg = <0>;
clock-frequency = <1500000000>;
clocks = <&cpg CPG_CORE R8A7743_CLK_Z>;
+ clock-latency = <300000>; /* 300 us */
power-domains = <&sysc R8A7743_PD_CA15_CPU0>;
next-level-cache = <&L2_CA15>;
+
+ /* kHz - uV - OPPs unknown yet */
+ operating-points = <1500000 1000000>,
+ <1312500 1000000>,
+ <1125000 1000000>,
+ < 937500 1000000>,
+ < 750000 1000000>,
+ < 375000 1000000>;
+ };
+
+ cpu1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a15";
+ reg = <1>;
+ clock-frequency = <1500000000>;
+ power-domains = <&sysc R8A7743_PD_CA15_CPU1>;
+ next-level-cache = <&L2_CA15>;
};
L2_CA15: cache-controller-0 {
@@ -48,6 +76,12 @@
#size-cells = <2>;
ranges;
+ apmu@e6152000 {
+ compatible = "renesas,r8a7743-apmu", "renesas,apmu";
+ reg = <0 0xe6152000 0 0x188>;
+ cpus = <&cpu0 &cpu1>;
+ };
+
gic: interrupt-controller@f1001000 {
compatible = "arm,gic-400";
#interrupt-cells = <3>;
@@ -65,6 +99,126 @@
resets = <&cpg 408>;
};
+ gpio0: gpio@e6050000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6050000 0 0x50>;
+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 0 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 912>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 912>;
+ };
+
+ gpio1: gpio@e6051000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6051000 0 0x50>;
+ interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 32 26>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 911>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 911>;
+ };
+
+ gpio2: gpio@e6052000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6052000 0 0x50>;
+ interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 64 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 910>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 910>;
+ };
+
+ gpio3: gpio@e6053000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6053000 0 0x50>;
+ interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 96 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 909>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 909>;
+ };
+
+ gpio4: gpio@e6054000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6054000 0 0x50>;
+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 128 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 908>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 908>;
+ };
+
+ gpio5: gpio@e6055000 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6055000 0 0x50>;
+ interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 160 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 907>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 907>;
+ };
+
+ gpio6: gpio@e6055400 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6055400 0 0x50>;
+ interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 192 32>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 905>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 905>;
+ };
+
+ gpio7: gpio@e6055800 {
+ compatible = "renesas,gpio-r8a7743",
+ "renesas,gpio-rcar";
+ reg = <0 0xe6055800 0 0x50>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ #gpio-cells = <2>;
+ gpio-controller;
+ gpio-ranges = <&pfc 0 224 26>;
+ #interrupt-cells = <2>;
+ interrupt-controller;
+ clocks = <&cpg CPG_MOD 904>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 904>;
+ };
+
irqc: interrupt-controller@e61c0000 {
compatible = "renesas,irqc-r8a7743", "renesas,irqc";
#interrupt-cells = <2>;
@@ -123,6 +277,11 @@
#power-domain-cells = <1>;
};
+ pfc: pin-controller@e6060000 {
+ compatible = "renesas,pfc-r8a7743";
+ reg = <0 0xe6060000 0 0x250>;
+ };
+
dmac0: dma-controller@e6700000 {
compatible = "renesas,dmac-r8a7743",
"renesas,rcar-dmac";
@@ -189,6 +348,94 @@
dma-channels = <15>;
};
+ /* The memory map in the User's Manual maps the cores to bus
+ * numbers
+ */
+ i2c0: i2c@e6508000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6508000 0 0x40>;
+ interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 931>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 931>;
+ i2c-scl-internal-delay-ns = <6>;
+ status = "disabled";
+ };
+
+ i2c1: i2c@e6518000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6518000 0 0x40>;
+ interrupts = <GIC_SPI 288 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 930>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 930>;
+ i2c-scl-internal-delay-ns = <6>;
+ status = "disabled";
+ };
+
+ i2c2: i2c@e6530000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6530000 0 0x40>;
+ interrupts = <GIC_SPI 286 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 929>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 929>;
+ i2c-scl-internal-delay-ns = <6>;
+ status = "disabled";
+ };
+
+ i2c3: i2c@e6540000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6540000 0 0x40>;
+ interrupts = <GIC_SPI 290 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 928>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 928>;
+ i2c-scl-internal-delay-ns = <6>;
+ status = "disabled";
+ };
+
+ i2c4: i2c@e6520000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6520000 0 0x40>;
+ interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 927>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 927>;
+ i2c-scl-internal-delay-ns = <6>;
+ status = "disabled";
+ };
+
+ i2c5: i2c@e6528000 {
+ /* doesn't need pinmux */
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "renesas,i2c-r8a7743",
+ "renesas,rcar-gen2-i2c";
+ reg = <0 0xe6528000 0 0x40>;
+ interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 925>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 925>;
+ i2c-scl-internal-delay-ns = <110>;
+ status = "disabled";
+ };
+
scifa0: serial@e6c40000 {
compatible = "renesas,scifa-r8a7743",
"renesas,rcar-gen2-scifa", "renesas,scifa";
@@ -468,6 +715,29 @@
status = "disabled";
};
+ icram2: sram@e6300000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe6300000 0 0x40000>;
+ };
+
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7743";
reg = <0 0xee700000 0 0x400>;
@@ -480,6 +750,35 @@
#size-cells = <0>;
status = "disabled";
};
+
+ avb: ethernet@e6800000 {
+ compatible = "renesas,etheravb-r8a7743",
+ "renesas,etheravb-rcar-gen2";
+ reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
+ interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 812>;
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 812>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ mmcif0: mmc@ee200000 {
+ compatible = "renesas,mmcif-r8a7743",
+ "renesas,sh-mmcif";
+ reg = <0 0xee200000 0 0x80>;
+ interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 315>;
+ dmas = <&dmac0 0xd1>, <&dmac0 0xd2>,
+ <&dmac1 0xd1>, <&dmac1 0xd2>;
+ dma-names = "tx", "rx", "tx", "rx";
+ power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
+ resets = <&cpg 315>;
+ reg-io-width = <4>;
+ max-frequency = <97500000>;
+ status = "disabled";
+ };
};
/* External root clock */
diff --git a/arch/arm/boot/dts/r8a7745-sk-rzg1e.dts b/arch/arm/boot/dts/r8a7745-sk-rzg1e.dts
index 97840b340197..b4d679b04ad6 100644
--- a/arch/arm/boot/dts/r8a7745-sk-rzg1e.dts
+++ b/arch/arm/boot/dts/r8a7745-sk-rzg1e.dts
@@ -1,7 +1,7 @@
/*
* Device Tree Source for the SK-RZG1E board
*
- * Copyright (C) 2016 Cogent Embedded, Inc.
+ * Copyright (C) 2016-2017 Cogent Embedded, Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -34,11 +34,34 @@
clock-frequency = <20000000>;
};
+&pfc {
+ scif2_pins: scif2 {
+ groups = "scif2_data";
+ function = "scif2";
+ };
+
+ ether_pins: ether {
+ groups = "eth_link", "eth_mdio", "eth_rmii";
+ function = "eth";
+ };
+
+ phy1_pins: phy1 {
+ groups = "intc_irq8";
+ function = "intc";
+ };
+};
+
&scif2 {
+ pinctrl-0 = <&scif2_pins>;
+ pinctrl-names = "default";
+
status = "okay";
};
&ether {
+ pinctrl-0 = <&ether_pins &phy1_pins>;
+ pinctrl-names = "default";
+
phy-handle = <&phy1>;
renesas,ether-link-active-low;
status = "okay";
diff --git a/arch/arm/boot/dts/r8a7745.dtsi b/arch/arm/boot/dts/r8a7745.dtsi
index 2feb0084bb3b..aff90dfb8b32 100644
--- a/arch/arm/boot/dts/r8a7745.dtsi
+++ b/arch/arm/boot/dts/r8a7745.dtsi
@@ -1,7 +1,7 @@
/*
* Device Tree Source for the r8a7745 SoC
*
- * Copyright (C) 2016 Cogent Embedded Inc.
+ * Copyright (C) 2016-2017 Cogent Embedded Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
@@ -123,6 +123,11 @@
#power-domain-cells = <1>;
};
+ pfc: pin-controller@e6060000 {
+ compatible = "renesas,pfc-r8a7745";
+ reg = <0 0xe6060000 0 0x11c>;
+ };
+
dmac0: dma-controller@e6700000 {
compatible = "renesas,dmac-r8a7745",
"renesas,rcar-dmac";
@@ -468,6 +473,29 @@
status = "disabled";
};
+ icram2: sram@e6300000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe6300000 0 0x40000>;
+ };
+
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7745";
reg = <0 0xee700000 0 0x400>;
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
index 2805a8608d4b..16358bf8d1db 100644
--- a/arch/arm/boot/dts/r8a7790.dtsi
+++ b/arch/arm/boot/dts/r8a7790.dtsi
@@ -830,6 +830,24 @@
status = "disabled";
};
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7790";
reg = <0 0xee700000 0 0x400>;
@@ -855,7 +873,7 @@
};
sata0: sata@ee300000 {
- compatible = "renesas,sata-r8a7790";
+ compatible = "renesas,sata-r8a7790", "renesas,rcar-gen2-sata";
reg = <0 0xee300000 0 0x2000>;
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_SATA0>;
@@ -864,7 +882,7 @@
};
sata1: sata@ee500000 {
- compatible = "renesas,sata-r8a7790";
+ compatible = "renesas,sata-r8a7790", "renesas,rcar-gen2-sata";
reg = <0 0xee500000 0 0x2000>;
interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_SATA1>;
@@ -909,7 +927,7 @@
};
vin0: video@e6ef0000 {
- compatible = "renesas,vin-r8a7790";
+ compatible = "renesas,vin-r8a7790", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef0000 0 0x1000>;
interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_VIN0>;
@@ -918,7 +936,7 @@
};
vin1: video@e6ef1000 {
- compatible = "renesas,vin-r8a7790";
+ compatible = "renesas,vin-r8a7790", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef1000 0 0x1000>;
interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_VIN1>;
@@ -927,7 +945,7 @@
};
vin2: video@e6ef2000 {
- compatible = "renesas,vin-r8a7790";
+ compatible = "renesas,vin-r8a7790", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef2000 0 0x1000>;
interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_VIN2>;
@@ -936,7 +954,7 @@
};
vin3: video@e6ef3000 {
- compatible = "renesas,vin-r8a7790";
+ compatible = "renesas,vin-r8a7790", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef3000 0 0x1000>;
interrupts = <GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7790_CLK_VIN3>;
diff --git a/arch/arm/boot/dts/r8a7791-koelsch.dts b/arch/arm/boot/dts/r8a7791-koelsch.dts
index 001e6116c47c..0ce0b278e1cb 100644
--- a/arch/arm/boot/dts/r8a7791-koelsch.dts
+++ b/arch/arm/boot/dts/r8a7791-koelsch.dts
@@ -642,11 +642,19 @@
};
};
+ cec_clock: cec-clock {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <12000000>;
+ };
+
hdmi@39 {
compatible = "adi,adv7511w";
reg = <0x39>;
interrupt-parent = <&gpio3>;
interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&cec_clock>;
+ clock-names = "cec";
adi,input-depth = <8>;
adi,input-colorspace = "rgb";
@@ -702,7 +710,7 @@
};
eeprom@50 {
- compatible = "renesas,24c02";
+ compatible = "renesas,24c02", "atmel,24c02";
reg = <0x50>;
pagesize = <16>;
};
diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
index bd93f699ad84..f1d1a9772153 100644
--- a/arch/arm/boot/dts/r8a7791.dtsi
+++ b/arch/arm/boot/dts/r8a7791.dtsi
@@ -890,6 +890,24 @@
status = "disabled";
};
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7791";
reg = <0 0xee700000 0 0x400>;
@@ -915,7 +933,7 @@
};
sata0: sata@ee300000 {
- compatible = "renesas,sata-r8a7791";
+ compatible = "renesas,sata-r8a7791", "renesas,rcar-gen2-sata";
reg = <0 0xee300000 0 0x2000>;
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7791_CLK_SATA0>;
@@ -924,7 +942,7 @@
};
sata1: sata@ee500000 {
- compatible = "renesas,sata-r8a7791";
+ compatible = "renesas,sata-r8a7791", "renesas,rcar-gen2-sata";
reg = <0 0xee500000 0 0x2000>;
interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7791_CLK_SATA1>;
@@ -969,7 +987,7 @@
};
vin0: video@e6ef0000 {
- compatible = "renesas,vin-r8a7791";
+ compatible = "renesas,vin-r8a7791", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef0000 0 0x1000>;
interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7791_CLK_VIN0>;
@@ -978,7 +996,7 @@
};
vin1: video@e6ef1000 {
- compatible = "renesas,vin-r8a7791";
+ compatible = "renesas,vin-r8a7791", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef1000 0 0x1000>;
interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7791_CLK_VIN1>;
@@ -987,7 +1005,7 @@
};
vin2: video@e6ef2000 {
- compatible = "renesas,vin-r8a7791";
+ compatible = "renesas,vin-r8a7791", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef2000 0 0x1000>;
interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7791_CLK_VIN2>;
diff --git a/arch/arm/boot/dts/r8a7792.dtsi b/arch/arm/boot/dts/r8a7792.dtsi
index 0efecb232ee5..2623f39bed2b 100644
--- a/arch/arm/boot/dts/r8a7792.dtsi
+++ b/arch/arm/boot/dts/r8a7792.dtsi
@@ -465,6 +465,24 @@
status = "disabled";
};
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
sdhi0: sd@ee100000 {
compatible = "renesas,sdhi-r8a7792";
reg = <0 0xee100000 0 0x328>;
diff --git a/arch/arm/boot/dts/r8a7793.dtsi b/arch/arm/boot/dts/r8a7793.dtsi
index 13b980f27bbc..497716b6fbe2 100644
--- a/arch/arm/boot/dts/r8a7793.dtsi
+++ b/arch/arm/boot/dts/r8a7793.dtsi
@@ -848,6 +848,24 @@
status = "disabled";
};
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7793";
reg = <0 0xee700000 0 0x400>;
diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi
index 7d9a81d970d8..26535414203a 100644
--- a/arch/arm/boot/dts/r8a7794.dtsi
+++ b/arch/arm/boot/dts/r8a7794.dtsi
@@ -588,6 +588,24 @@
status = "disabled";
};
+ icram0: sram@e63a0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63a0000 0 0x12000>;
+ };
+
+ icram1: sram@e63c0000 {
+ compatible = "mmio-sram";
+ reg = <0 0xe63c0000 0 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0xe63c0000 0x1000>;
+
+ smp-sram@0 {
+ compatible = "renesas,smp-sram";
+ reg = <0 0x10>;
+ };
+ };
+
ether: ethernet@ee700000 {
compatible = "renesas,ether-r8a7794";
reg = <0 0xee700000 0 0x400>;
@@ -783,7 +801,7 @@
};
vin0: video@e6ef0000 {
- compatible = "renesas,vin-r8a7794";
+ compatible = "renesas,vin-r8a7794", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef0000 0 0x1000>;
interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7794_CLK_VIN0>;
@@ -792,7 +810,7 @@
};
vin1: video@e6ef1000 {
- compatible = "renesas,vin-r8a7794";
+ compatible = "renesas,vin-r8a7794", "renesas,rcar-gen2-vin";
reg = <0 0xe6ef1000 0 0x1000>;
interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp8_clks R8A7794_CLK_VIN1>;
diff --git a/arch/arm/boot/dts/rk3036-kylin.dts b/arch/arm/boot/dts/rk3036-kylin.dts
index 5726135b7f8a..fdb1570bc7d3 100644
--- a/arch/arm/boot/dts/rk3036-kylin.dts
+++ b/arch/arm/boot/dts/rk3036-kylin.dts
@@ -357,7 +357,6 @@
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio_clk &sdio_cmd &sdio_bus4>;
sd-uhs-sdr12;
@@ -372,7 +371,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
};
diff --git a/arch/arm/boot/dts/rk3036.dtsi b/arch/arm/boot/dts/rk3036.dtsi
index ec91325d3b6e..4916c65e0ace 100644
--- a/arch/arm/boot/dts/rk3036.dtsi
+++ b/arch/arm/boot/dts/rk3036.dtsi
@@ -287,7 +287,6 @@
fifo-depth = <0x100>;
mmc-ddr-1_8v;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
resets = <&cru SRST_EMMC>;
@@ -599,7 +598,7 @@
rockchip,pins = <1 15 RK_FUNC_1 &pcfg_pull_default>;
};
- sdmmc_cd: sdmcc-cd {
+ sdmmc_cd: sdmmc-cd {
rockchip,pins = <1 17 RK_FUNC_1 &pcfg_pull_default>;
};
diff --git a/arch/arm/boot/dts/rk3066a-bqcurie2.dts b/arch/arm/boot/dts/rk3066a-bqcurie2.dts
index e1f5198723b2..ef1eabf2512c 100644
--- a/arch/arm/boot/dts/rk3066a-bqcurie2.dts
+++ b/arch/arm/boot/dts/rk3066a-bqcurie2.dts
@@ -190,7 +190,6 @@
#include "tps65910.dtsi"
&mmc0 { /* sdmmc */
- num-slots = <1>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>;
@@ -202,7 +201,6 @@
};
&mmc1 { /* wifi */
- num-slots = <1>;
status = "okay";
non-removable;
diff --git a/arch/arm/boot/dts/rk3066a-mk808.dts b/arch/arm/boot/dts/rk3066a-mk808.dts
index 7ca1cf5241e0..13e285c53def 100644
--- a/arch/arm/boot/dts/rk3066a-mk808.dts
+++ b/arch/arm/boot/dts/rk3066a-mk808.dts
@@ -132,7 +132,6 @@
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
- num-slots = <1>;
vmmc-supply = <&vcc_sd>;
status = "okay";
};
@@ -141,7 +140,6 @@
bus-width = <4>;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_bus4>;
pinctrl-names = "default";
vmmc-supply = <&vcc_wifi>;
diff --git a/arch/arm/boot/dts/rk3066a-rayeager.dts b/arch/arm/boot/dts/rk3066a-rayeager.dts
index 8907deaab18e..400cbf9609e3 100644
--- a/arch/arm/boot/dts/rk3066a-rayeager.dts
+++ b/arch/arm/boot/dts/rk3066a-rayeager.dts
@@ -185,7 +185,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_rst>;
vmmc-supply = <&vcc_emmc>;
@@ -336,7 +335,6 @@
&mmc0 {
bus-width = <4>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>;
vmmc-supply = <&vcc_sd>;
@@ -349,7 +347,6 @@
bus-width = <4>;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sd1_clk>, <&sd1_cmd>, <&sd1_bus4>;
vmmc-supply = <&vccio_wl>;
diff --git a/arch/arm/boot/dts/rk3188-px3-evb.dts b/arch/arm/boot/dts/rk3188-px3-evb.dts
index 5b2a0b6885cd..8ba9e06062f3 100644
--- a/arch/arm/boot/dts/rk3188-px3-evb.dts
+++ b/arch/arm/boot/dts/rk3188-px3-evb.dts
@@ -89,7 +89,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_rst>;
status = "okay";
@@ -256,7 +255,6 @@
};
&mmc0 {
- num-slots = <1>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>;
diff --git a/arch/arm/boot/dts/rk3188-radxarock.dts b/arch/arm/boot/dts/rk3188-radxarock.dts
index ca0a1c4bc15c..53d6fc2fdbce 100644
--- a/arch/arm/boot/dts/rk3188-radxarock.dts
+++ b/arch/arm/boot/dts/rk3188-radxarock.dts
@@ -296,7 +296,6 @@
};
&mmc0 {
- num-slots = <1>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>;
diff --git a/arch/arm/boot/dts/rk3229-evb.dts b/arch/arm/boot/dts/rk3229-evb.dts
index 1b55192b7d04..73e384585755 100644
--- a/arch/arm/boot/dts/rk3229-evb.dts
+++ b/arch/arm/boot/dts/rk3229-evb.dts
@@ -40,7 +40,8 @@
/dts-v1/;
-#include "rk322x.dtsi"
+#include <dt-bindings/input/input.h>
+#include "rk3229.dtsi"
/ {
model = "Rockchip RK3229 Evaluation board";
@@ -51,6 +52,15 @@
reg = <0x60000000 0x40000000>;
};
+ dc_12v: dc-12v-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "dc_12v";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ };
+
ext_gmac: ext_gmac {
compatible = "fixed-clock";
clock-frequency = <125000000>;
@@ -67,6 +77,7 @@
regulator-name = "vcc_host";
regulator-always-on;
regulator-boot-on;
+ vin-supply = <&vcc_sys>;
};
vcc_phy: vcc-phy-regulator {
@@ -77,9 +88,98 @@
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-boot-on;
+ vin-supply = <&vccio_1v8>;
+ };
+
+ vcc_sys: vcc-sys-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ vin-supply = <&dc_12v>;
+ };
+
+ vccio_1v8: vccio-1v8-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vccio_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ vin-supply = <&vcc_sys>;
+ };
+
+ vccio_3v3: vccio-3v3-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vccio_3v3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ vin-supply = <&vcc_sys>;
+ };
+
+ vdd_arm: vdd-arm-regulator {
+ compatible = "pwm-regulator";
+ pwms = <&pwm1 0 25000 1>;
+ pwm-supply = <&vcc_sys>;
+ regulator-name = "vdd_arm";
+ regulator-min-microvolt = <950000>;
+ regulator-max-microvolt = <1400000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ vdd_log: vdd-log-regulator {
+ compatible = "pwm-regulator";
+ pwms = <&pwm2 0 25000 1>;
+ pwm-supply = <&vcc_sys>;
+ regulator-name = "vdd_log";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ autorepeat;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwr_key>;
+
+ power_key: power-key {
+ label = "GPIO Key Power";
+ gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_POWER>;
+ debounce-interval = <100>;
+ wakeup-source;
+ };
};
};
+&cpu0 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu1 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu2 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu3 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&emmc {
+ cap-mmc-highspeed;
+ disable-wp;
+ non-removable;
+ status = "okay";
+};
+
&gmac {
assigned-clocks = <&cru SCLK_MAC_EXTCLK>, <&cru SCLK_MAC>;
assigned-clock-parents = <&ext_gmac>, <&cru SCLK_MAC_EXTCLK>;
@@ -96,7 +196,21 @@
status = "okay";
};
+&io_domains {
+ status = "okay";
+
+ vccio1-supply = <&vccio_3v3>;
+ vccio2-supply = <&vccio_1v8>;
+ vccio4-supply = <&vccio_3v3>;
+};
+
&pinctrl {
+ keys {
+ pwr_key: pwr-key {
+ rockchip,pins = <3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+
usb {
host_vbus_drv: host-vbus-drv {
rockchip,pins = <3 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
@@ -104,6 +218,19 @@
};
};
+&pwm1 {
+ status = "okay";
+};
+
+&pwm2 {
+ status = "okay";
+};
+
+&tsadc {
+ rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */
+ status = "okay";
+};
+
&uart2 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/rk3229.dtsi b/arch/arm/boot/dts/rk3229.dtsi
new file mode 100644
index 000000000000..6fe6c15fc13a
--- /dev/null
+++ b/arch/arm/boot/dts/rk3229.dtsi
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "rk322x.dtsi"
+
+/ {
+ compatible = "rockchip,rk3229";
+
+ /delete-node/ opp-table0;
+
+ cpu0_opp_table: opp_table0 {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-408000000 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <950000>;
+ clock-latency-ns = <40000>;
+ opp-suspend;
+ };
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <975000>;
+ };
+ opp-816000000 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1000000>;
+ };
+ opp-1008000000 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <1175000>;
+ };
+ opp-1200000000 {
+ opp-hz = /bits/ 64 <1200000000>;
+ opp-microvolt = <1275000>;
+ };
+ opp-1296000000 {
+ opp-hz = /bits/ 64 <1296000000>;
+ opp-microvolt = <1325000>;
+ };
+ opp-1392000000 {
+ opp-hz = /bits/ 64 <1392000000>;
+ opp-microvolt = <1375000>;
+ };
+ opp-1464000000 {
+ opp-hz = /bits/ 64 <1464000000>;
+ opp-microvolt = <1400000>;
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/rk322x.dtsi b/arch/arm/boot/dts/rk322x.dtsi
index f3e4ffd9f818..06814421eed2 100644
--- a/arch/arm/boot/dts/rk322x.dtsi
+++ b/arch/arm/boot/dts/rk322x.dtsi
@@ -55,6 +55,7 @@
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
+ spi0 = &spi0;
};
cpus {
@@ -70,6 +71,7 @@
#cooling-cells = <2>; /* min followed by max */
clock-latency = <40000>;
clocks = <&cru ARMCLK>;
+ enable-method = "psci";
};
cpu1: cpu@f01 {
@@ -78,6 +80,7 @@
reg = <0xf01>;
resets = <&cru SRST_CORE1>;
operating-points-v2 = <&cpu0_opp_table>;
+ enable-method = "psci";
};
cpu2: cpu@f02 {
@@ -86,6 +89,7 @@
reg = <0xf02>;
resets = <&cru SRST_CORE2>;
operating-points-v2 = <&cpu0_opp_table>;
+ enable-method = "psci";
};
cpu3: cpu@f03 {
@@ -94,6 +98,7 @@
reg = <0xf03>;
resets = <&cru SRST_CORE3>;
operating-points-v2 = <&cpu0_opp_table>;
+ enable-method = "psci";
};
};
@@ -151,6 +156,11 @@
interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
};
+ psci {
+ compatible = "arm,psci-1.0", "arm,psci-0.2";
+ method = "smc";
+ };
+
timer {
compatible = "arm,armv7-timer";
arm,cpu-registers-not-fw-configured;
@@ -196,6 +206,19 @@
status = "disabled";
};
+ spdif: spdif@100d0000 {
+ compatible = "rockchip,rk3228-spdif";
+ reg = <0x100d0000 0x1000>;
+ interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_SPDIF>, <&cru HCLK_SPDIF_8CH>;
+ clock-names = "mclk", "hclk";
+ dmas = <&pdma 10>;
+ dma-names = "tx";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spdif_tx>;
+ status = "disabled";
+ };
+
i2s2: i2s2@100e0000 {
compatible = "rockchip,rk3228-i2s", "rockchip,rk3066-i2s";
reg = <0x100e0000 0x4000>;
@@ -215,6 +238,11 @@
#address-cells = <1>;
#size-cells = <1>;
+ io_domains: io-domains {
+ compatible = "rockchip,rk3228-io-voltage-domain";
+ status = "disabled";
+ };
+
u2phy0: usb2-phy@760 {
compatible = "rockchip,rk3228-usb2phy";
reg = <0x0760 0x0c>;
@@ -309,6 +337,23 @@
status = "disabled";
};
+ efuse: efuse@11040000 {
+ compatible = "rockchip,rk3228-efuse";
+ reg = <0x11040000 0x20>;
+ clocks = <&cru PCLK_EFUSE_256>;
+ clock-names = "pclk_efuse";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* Data cells */
+ efuse_id: id@7 {
+ reg = <0x7 0x10>;
+ };
+ cpu_leakage: cpu_leakage@17 {
+ reg = <0x17 0x1>;
+ };
+ };
+
i2c0: i2c@11050000 {
compatible = "rockchip,rk3228-i2c";
reg = <0x11050000 0x1000>;
@@ -361,6 +406,19 @@
status = "disabled";
};
+ spi0: spi@11090000 {
+ compatible = "rockchip,rk3228-spi";
+ reg = <0x11090000 0x1000>;
+ interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;
+ clock-names = "spiclk", "apb_pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi0_clk &spi0_tx &spi0_rx &spi0_cs0 &spi0_cs1>;
+ status = "disabled";
+ };
+
wdt: watchdog@110a0000 {
compatible = "snps,dw-wdt";
reg = <0x110a0000 0x100>;
@@ -500,8 +558,70 @@
status = "disabled";
};
+ vpu_mmu: iommu@20020800 {
+ compatible = "rockchip,iommu";
+ reg = <0x20020800 0x100>;
+ interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vpu_mmu";
+ iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vdec_mmu: iommu@20030480 {
+ compatible = "rockchip,iommu";
+ reg = <0x20030480 0x40>, <0x200304c0 0x40>;
+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vdec_mmu";
+ iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vop_mmu: iommu@20053f00 {
+ compatible = "rockchip,iommu";
+ reg = <0x20053f00 0x100>;
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vop_mmu";
+ iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ iep_mmu: iommu@20070800 {
+ compatible = "rockchip,iommu";
+ reg = <0x20070800 0x100>;
+ interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "iep_mmu";
+ iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ sdmmc: dwmmc@30000000 {
+ compatible = "rockchip,rk3228-dw-mshc", "rockchip,rk3288-dw-mshc";
+ reg = <0x30000000 0x4000>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
+ <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
+ clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+ fifo-depth = <0x100>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>;
+ status = "disabled";
+ };
+
+ sdio: dwmmc@30010000 {
+ compatible = "rockchip,rk3228-dw-mshc", "rockchip,rk3288-dw-mshc";
+ reg = <0x30010000 0x4000>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
+ <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
+ clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+ fifo-depth = <0x100>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdio_clk &sdio_cmd &sdio_bus4>;
+ status = "disabled";
+ };
+
emmc: dwmmc@30020000 {
- compatible = "rockchip,rk3288-dw-mshc";
+ compatible = "rockchip,rk3228-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x30020000 0x4000>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <37500000>;
@@ -511,7 +631,6 @@
clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
bus-width = <8>;
default-sample-phase = <158>;
- num-slots = <1>;
fifo-depth = <0x100>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
@@ -710,6 +829,40 @@
drive-strength = <12>;
};
+ sdmmc {
+ sdmmc_clk: sdmmc-clk {
+ rockchip,pins = <1 RK_PC0 1 &pcfg_pull_none_drv_12ma>;
+ };
+
+ sdmmc_cmd: sdmmc-cmd {
+ rockchip,pins = <1 RK_PB7 1 &pcfg_pull_none_drv_12ma>;
+ };
+
+ sdmmc_bus4: sdmmc-bus4 {
+ rockchip,pins = <1 RK_PC2 1 &pcfg_pull_none_drv_12ma>,
+ <1 RK_PC3 1 &pcfg_pull_none_drv_12ma>,
+ <1 RK_PC4 1 &pcfg_pull_none_drv_12ma>,
+ <1 RK_PC5 1 &pcfg_pull_none_drv_12ma>;
+ };
+ };
+
+ sdio {
+ sdio_clk: sdio-clk {
+ rockchip,pins = <3 RK_PA0 1 &pcfg_pull_none_drv_12ma>;
+ };
+
+ sdio_cmd: sdio-cmd {
+ rockchip,pins = <3 RK_PA1 1 &pcfg_pull_none_drv_12ma>;
+ };
+
+ sdio_bus4: sdio-bus4 {
+ rockchip,pins = <3 RK_PA2 1 &pcfg_pull_none_drv_12ma>,
+ <3 RK_PA3 1 &pcfg_pull_none_drv_12ma>,
+ <3 RK_PA4 1 &pcfg_pull_none_drv_12ma>,
+ <3 RK_PA5 1 &pcfg_pull_none_drv_12ma>;
+ };
+ };
+
emmc {
emmc_clk: emmc-clk {
rockchip,pins = <2 7 RK_FUNC_2 &pcfg_pull_none>;
@@ -797,6 +950,42 @@
};
};
+ spi-0 {
+ spi0_clk: spi0-clk {
+ rockchip,pins = <0 9 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi0_cs0: spi0-cs0 {
+ rockchip,pins = <0 14 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi0_tx: spi0-tx {
+ rockchip,pins = <0 11 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi0_rx: spi0-rx {
+ rockchip,pins = <0 13 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi0_cs1: spi0-cs1 {
+ rockchip,pins = <1 12 RK_FUNC_1 &pcfg_pull_up>;
+ };
+ };
+
+ spi-1 {
+ spi1_clk: spi1-clk {
+ rockchip,pins = <0 23 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi1_cs0: spi1-cs0 {
+ rockchip,pins = <2 2 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi1_rx: spi1-rx {
+ rockchip,pins = <2 0 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi1_tx: spi1-tx {
+ rockchip,pins = <2 1 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ spi1_cs1: spi1-cs1 {
+ rockchip,pins = <2 3 RK_FUNC_2 &pcfg_pull_up>;
+ };
+ };
+
i2s1 {
i2s1_bus: i2s1-bus {
rockchip,pins = <0 8 RK_FUNC_1 &pcfg_pull_none>,
@@ -835,6 +1024,12 @@
};
};
+ spdif {
+ spdif_tx: spdif-tx {
+ rockchip,pins = <3 31 RK_FUNC_2 &pcfg_pull_none>;
+ };
+ };
+
tsadc {
otp_gpio: otp-gpio {
rockchip,pins = <0 24 RK_FUNC_GPIO &pcfg_pull_none>;
diff --git a/arch/arm/boot/dts/rk3288-evb.dtsi b/arch/arm/boot/dts/rk3288-evb.dtsi
index 0dec94c3583b..39b61dce97ad 100644
--- a/arch/arm/boot/dts/rk3288-evb.dtsi
+++ b/arch/arm/boot/dts/rk3288-evb.dtsi
@@ -45,7 +45,44 @@
/ {
memory@0 {
device_type = "memory";
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
+ };
+
+ adc-keys {
+ compatible = "adc-keys";
+ io-channels = <&saradc 1>;
+ io-channel-names = "buttons";
+ keyup-threshold-microvolt = <1800000>;
+
+ button-up {
+ label = "Volume Up";
+ linux,code = <KEY_VOLUMEUP>;
+ press-threshold-microvolt = <100000>;
+ };
+
+ button-down {
+ label = "Volume Down";
+ linux,code = <KEY_VOLUMEDOWN>;
+ press-threshold-microvolt = <300000>;
+ };
+
+ menu {
+ label = "Menu";
+ linux,code = <KEY_MENU>;
+ press-threshold-microvolt = <640000>;
+ };
+
+ esc {
+ label = "Esc";
+ linux,code = <KEY_ESC>;
+ press-threshold-microvolt = <1000000>;
+ };
+
+ home {
+ label = "Home";
+ linux,code = <KEY_HOME>;
+ press-threshold-microvolt = <1300000>;
+ };
};
backlight: backlight {
@@ -212,19 +249,22 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_pwr &emmc_bus8>;
status = "okay";
};
+&saradc {
+ vref-supply = <&vcc_18>;
+ status = "okay";
+};
+
&sdmmc {
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp; /* wp not hooked up */
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
status = "okay";
@@ -248,6 +288,11 @@
status = "ok";
};
+&gpu {
+ mali-supply = <&vdd_gpu>;
+ status = "okay";
+};
+
&hdmi {
ddc-i2c-bus = <&i2c5>;
status = "okay";
diff --git a/arch/arm/boot/dts/rk3288-fennec.dts b/arch/arm/boot/dts/rk3288-fennec.dts
index 61d1c1028317..41405974253a 100644
--- a/arch/arm/boot/dts/rk3288-fennec.dts
+++ b/arch/arm/boot/dts/rk3288-fennec.dts
@@ -47,7 +47,7 @@
compatible = "rockchip,rk3288-fennec", "rockchip,rk3288";
memory@0 {
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
device_type = "memory";
};
@@ -77,7 +77,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_pwr &emmc_bus8>;
status = "okay";
@@ -99,6 +98,11 @@
status = "okay";
};
+&gpu {
+ mali-supply = <&vdd_gpu>;
+ status = "okay";
+};
+
&hdmi {
status = "okay";
};
diff --git a/arch/arm/boot/dts/rk3288-firefly-reload-core.dtsi b/arch/arm/boot/dts/rk3288-firefly-reload-core.dtsi
index 813496618d08..5f05815f47e0 100644
--- a/arch/arm/boot/dts/rk3288-firefly-reload-core.dtsi
+++ b/arch/arm/boot/dts/rk3288-firefly-reload-core.dtsi
@@ -47,7 +47,7 @@
/ {
memory@0 {
device_type = "memory";
- reg = <0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
ext_gmac: external-gmac-clock {
@@ -78,7 +78,6 @@
mmc-ddr-1_8v;
mmc-hs200-1_8v;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_pwr>, <&emmc_bus8>;
vmmc-supply = <&vcc_io>;
diff --git a/arch/arm/boot/dts/rk3288-firefly-reload.dts b/arch/arm/boot/dts/rk3288-firefly-reload.dts
index b11a282c334c..7da0947ababb 100644
--- a/arch/arm/boot/dts/rk3288-firefly-reload.dts
+++ b/arch/arm/boot/dts/rk3288-firefly-reload.dts
@@ -269,7 +269,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
vmmc-supply = <&vcc_sd>;
@@ -284,7 +283,6 @@
disable-wp;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>, <&sdio0_int>;
sd-uhs-sdr12;
diff --git a/arch/arm/boot/dts/rk3288-firefly.dtsi b/arch/arm/boot/dts/rk3288-firefly.dtsi
index 32dabae12e67..b9e6f3a97240 100644
--- a/arch/arm/boot/dts/rk3288-firefly.dtsi
+++ b/arch/arm/boot/dts/rk3288-firefly.dtsi
@@ -46,7 +46,7 @@
/ {
memory@0 {
device_type = "memory";
- reg = <0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
adc-keys {
@@ -208,7 +208,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_pwr>, <&emmc_bus8>;
vmmc-supply = <&vcc_io>;
@@ -527,7 +526,6 @@
bus-width = <4>;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>;
vmmc-supply = <&vbat_wl>;
@@ -541,7 +539,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
vmmc-supply = <&vcc_sd>;
diff --git a/arch/arm/boot/dts/rk3288-miqi.dts b/arch/arm/boot/dts/rk3288-miqi.dts
index 30e93f694ae8..4d923aa6ed11 100644
--- a/arch/arm/boot/dts/rk3288-miqi.dts
+++ b/arch/arm/boot/dts/rk3288-miqi.dts
@@ -54,7 +54,7 @@
memory@0 {
device_type = "memory";
- reg = <0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
ext_gmac: external-gmac-clock {
@@ -126,7 +126,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_pwr>, <&emmc_bus8>;
vmmc-supply = <&vcc_io>;
@@ -404,7 +403,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
vmmc-supply = <&vcc_sd>;
diff --git a/arch/arm/boot/dts/rk3288-phycore-rdk.dts b/arch/arm/boot/dts/rk3288-phycore-rdk.dts
index 3dda79579b51..1241cbcfc16f 100644
--- a/arch/arm/boot/dts/rk3288-phycore-rdk.dts
+++ b/arch/arm/boot/dts/rk3288-phycore-rdk.dts
@@ -263,7 +263,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
vmmc-supply = <&vdd_io_sd>;
diff --git a/arch/arm/boot/dts/rk3288-phycore-som.dtsi b/arch/arm/boot/dts/rk3288-phycore-som.dtsi
index 26cd3ad45160..99cfae875e12 100644
--- a/arch/arm/boot/dts/rk3288-phycore-som.dtsi
+++ b/arch/arm/boot/dts/rk3288-phycore-som.dtsi
@@ -55,7 +55,7 @@
*/
memory {
device_type = "memory";
- reg = <0 0x8000000>;
+ reg = <0x0 0x0 0x0 0x8000000>;
};
aliases {
@@ -136,7 +136,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_pwr &emmc_bus8>;
vmmc-supply = <&vdd_3v3_io>;
diff --git a/arch/arm/boot/dts/rk3288-popmetal.dts b/arch/arm/boot/dts/rk3288-popmetal.dts
index aa1f9ecff231..f084e0c8dcb3 100644
--- a/arch/arm/boot/dts/rk3288-popmetal.dts
+++ b/arch/arm/boot/dts/rk3288-popmetal.dts
@@ -50,7 +50,7 @@
memory@0 {
device_type = "memory";
- reg = <0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
ext_gmac: external-gmac-clock {
@@ -150,7 +150,6 @@
mmc-ddr-1_8v;
mmc-hs200-1_8v;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_pwr &emmc_bus8>;
vmmc-supply = <&vcc_io>;
@@ -164,7 +163,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp; /* wp not hooked up */
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
sd-uhs-sdr12;
diff --git a/arch/arm/boot/dts/rk3288-r89.dts b/arch/arm/boot/dts/rk3288-r89.dts
index 1145b62edde7..e95215c9788b 100644
--- a/arch/arm/boot/dts/rk3288-r89.dts
+++ b/arch/arm/boot/dts/rk3288-r89.dts
@@ -50,7 +50,7 @@
memory@0 {
device_type = "memory";
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
ext_gmac: external-gmac-clock {
@@ -354,7 +354,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
vmmc-supply = <&vcc_sdmmc>;
diff --git a/arch/arm/boot/dts/rk3288-rock2-som.dtsi b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
index 749a9b86e6e2..b9c471fcbd42 100644
--- a/arch/arm/boot/dts/rk3288-rock2-som.dtsi
+++ b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
@@ -43,7 +43,7 @@
/ {
memory@0 {
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
device_type = "memory";
};
@@ -89,7 +89,6 @@
cap-mmc-highspeed;
disable-wp;
non-removable;
- num-slots = <1>;
mmc-pwrseq = <&emmc_pwrseq>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
diff --git a/arch/arm/boot/dts/rk3288-rock2-square.dts b/arch/arm/boot/dts/rk3288-rock2-square.dts
index 8ed25e9f60bc..0e084b8a86ac 100644
--- a/arch/arm/boot/dts/rk3288-rock2-square.dts
+++ b/arch/arm/boot/dts/rk3288-rock2-square.dts
@@ -147,7 +147,6 @@
disable-wp;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk &sdio0_int>;
vmmc-supply = <&vcc_io>;
@@ -161,7 +160,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp; /* wp not hooked up */
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
vmmc-supply = <&vcc_sd>;
diff --git a/arch/arm/boot/dts/rk3288-tinker.dts b/arch/arm/boot/dts/rk3288-tinker.dts
index f601c78386a9..346b0d8b474d 100644
--- a/arch/arm/boot/dts/rk3288-tinker.dts
+++ b/arch/arm/boot/dts/rk3288-tinker.dts
@@ -50,7 +50,7 @@
compatible = "asus,rk3288-tinker", "rockchip,rk3288";
memory {
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
device_type = "memory";
};
@@ -156,6 +156,11 @@
status = "ok";
};
+&gpu {
+ mali-supply = <&vdd_gpu>;
+ status = "okay";
+};
+
&hdmi {
ddc-i2c-bus = <&i2c5>;
status = "okay";
@@ -465,7 +470,6 @@
cap-sd-highspeed;
card-detect-delay = <200>;
disable-wp; /* wp not hooked up */
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
status = "okay";
diff --git a/arch/arm/boot/dts/rk3288-veyron-sdmmc.dtsi b/arch/arm/boot/dts/rk3288-veyron-sdmmc.dtsi
index aef07101e9ab..95e9bee8bca2 100644
--- a/arch/arm/boot/dts/rk3288-veyron-sdmmc.dtsi
+++ b/arch/arm/boot/dts/rk3288-veyron-sdmmc.dtsi
@@ -117,7 +117,6 @@
card-detect-delay = <200>;
cd-gpios = <&gpio7 RK_PA5 GPIO_ACTIVE_LOW>;
rockchip,default-sample-phase = <90>;
- num-slots = <1>;
sd-uhs-sdr12;
sd-uhs-sdr25;
sd-uhs-sdr50;
diff --git a/arch/arm/boot/dts/rk3288-veyron.dtsi b/arch/arm/boot/dts/rk3288-veyron.dtsi
index d709fa1847f9..6e5bd8974f22 100644
--- a/arch/arm/boot/dts/rk3288-veyron.dtsi
+++ b/arch/arm/boot/dts/rk3288-veyron.dtsi
@@ -49,7 +49,7 @@
/ {
memory@0 {
device_type = "memory";
- reg = <0x0 0x80000000>;
+ reg = <0x0 0x0 0x0 0x80000000>;
};
gpio_keys: gpio-keys {
@@ -156,7 +156,6 @@
mmc-hs200-1_8v;
mmc-pwrseq = <&emmc_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
};
@@ -372,7 +371,6 @@
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_clk &sdio0_cmd &sdio0_bus4>;
sd-uhs-sdr12;
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index 858e1fed762a..356ed1e62452 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -49,8 +49,8 @@
#include <dt-bindings/soc/rockchip,boot-mode.h>
/ {
- #address-cells = <1>;
- #size-cells = <1>;
+ #address-cells = <2>;
+ #size-cells = <2>;
compatible = "rockchip,rk3288";
@@ -139,13 +139,13 @@
amba {
compatible = "simple-bus";
- #address-cells = <1>;
- #size-cells = <1>;
+ #address-cells = <2>;
+ #size-cells = <2>;
ranges;
dmac_peri: dma-controller@ff250000 {
compatible = "arm,pl330", "arm,primecell";
- reg = <0xff250000 0x4000>;
+ reg = <0x0 0xff250000 0x0 0x4000>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
#dma-cells = <1>;
@@ -156,7 +156,7 @@
dmac_bus_ns: dma-controller@ff600000 {
compatible = "arm,pl330", "arm,primecell";
- reg = <0xff600000 0x4000>;
+ reg = <0x0 0xff600000 0x0 0x4000>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
#dma-cells = <1>;
@@ -168,7 +168,7 @@
dmac_bus_s: dma-controller@ffb20000 {
compatible = "arm,pl330", "arm,primecell";
- reg = <0xffb20000 0x4000>;
+ reg = <0x0 0xffb20000 0x0 0x4000>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
#dma-cells = <1>;
@@ -179,8 +179,8 @@
};
reserved-memory {
- #address-cells = <1>;
- #size-cells = <1>;
+ #address-cells = <2>;
+ #size-cells = <2>;
ranges;
/*
@@ -194,7 +194,7 @@
* is found.
*/
dma-unusable@fe000000 {
- reg = <0xfe000000 0x1000000>;
+ reg = <0x0 0xfe000000 0x0 0x1000000>;
};
};
@@ -217,7 +217,7 @@
timer: timer@ff810000 {
compatible = "rockchip,rk3288-timer";
- reg = <0xff810000 0x20>;
+ reg = <0x0 0xff810000 0x0 0x20>;
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&xin24m>, <&cru PCLK_TIMER>;
clock-names = "timer", "pclk";
@@ -236,7 +236,7 @@
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0xff0c0000 0x4000>;
+ reg = <0x0 0xff0c0000 0x0 0x4000>;
resets = <&cru SRST_MMC0>;
reset-names = "reset";
status = "disabled";
@@ -250,7 +250,7 @@
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0xff0d0000 0x4000>;
+ reg = <0x0 0xff0d0000 0x0 0x4000>;
resets = <&cru SRST_SDIO0>;
reset-names = "reset";
status = "disabled";
@@ -264,7 +264,7 @@
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0xff0e0000 0x4000>;
+ reg = <0x0 0xff0e0000 0x0 0x4000>;
resets = <&cru SRST_SDIO1>;
reset-names = "reset";
status = "disabled";
@@ -278,7 +278,7 @@
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0xff0f0000 0x4000>;
+ reg = <0x0 0xff0f0000 0x0 0x4000>;
resets = <&cru SRST_EMMC>;
reset-names = "reset";
status = "disabled";
@@ -286,7 +286,7 @@
saradc: saradc@ff100000 {
compatible = "rockchip,saradc";
- reg = <0xff100000 0x100>;
+ reg = <0x0 0xff100000 0x0 0x100>;
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
@@ -305,7 +305,7 @@
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&spi0_clk &spi0_tx &spi0_rx &spi0_cs0>;
- reg = <0xff110000 0x1000>;
+ reg = <0x0 0xff110000 0x0 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
@@ -320,7 +320,7 @@
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&spi1_clk &spi1_tx &spi1_rx &spi1_cs0>;
- reg = <0xff120000 0x1000>;
+ reg = <0x0 0xff120000 0x0 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
@@ -335,7 +335,7 @@
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&spi2_clk &spi2_tx &spi2_rx &spi2_cs0>;
- reg = <0xff130000 0x1000>;
+ reg = <0x0 0xff130000 0x0 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
@@ -343,7 +343,7 @@
i2c1: i2c@ff140000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff140000 0x1000>;
+ reg = <0x0 0xff140000 0x0 0x1000>;
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -356,7 +356,7 @@
i2c3: i2c@ff150000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff150000 0x1000>;
+ reg = <0x0 0xff150000 0x0 0x1000>;
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -369,7 +369,7 @@
i2c4: i2c@ff160000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff160000 0x1000>;
+ reg = <0x0 0xff160000 0x0 0x1000>;
interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -382,7 +382,7 @@
i2c5: i2c@ff170000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff170000 0x1000>;
+ reg = <0x0 0xff170000 0x0 0x1000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -395,7 +395,7 @@
uart0: serial@ff180000 {
compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
- reg = <0xff180000 0x100>;
+ reg = <0x0 0xff180000 0x0 0x100>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
@@ -408,7 +408,7 @@
uart1: serial@ff190000 {
compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
- reg = <0xff190000 0x100>;
+ reg = <0x0 0xff190000 0x0 0x100>;
interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
@@ -421,7 +421,7 @@
uart2: serial@ff690000 {
compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
- reg = <0xff690000 0x100>;
+ reg = <0x0 0xff690000 0x0 0x100>;
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
@@ -434,7 +434,7 @@
uart3: serial@ff1b0000 {
compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
- reg = <0xff1b0000 0x100>;
+ reg = <0x0 0xff1b0000 0x0 0x100>;
interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
@@ -447,7 +447,7 @@
uart4: serial@ff1c0000 {
compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
- reg = <0xff1c0000 0x100>;
+ reg = <0x0 0xff1c0000 0x0 0x100>;
interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
@@ -535,7 +535,7 @@
tsadc: tsadc@ff280000 {
compatible = "rockchip,rk3288-tsadc";
- reg = <0xff280000 0x100>;
+ reg = <0x0 0xff280000 0x0 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_TSADC>, <&cru PCLK_TSADC>;
clock-names = "tsadc", "apb_pclk";
@@ -552,7 +552,7 @@
gmac: ethernet@ff290000 {
compatible = "rockchip,rk3288-gmac";
- reg = <0xff290000 0x10000>;
+ reg = <0x0 0xff290000 0x0 0x10000>;
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
@@ -572,7 +572,7 @@
usb_host0_ehci: usb@ff500000 {
compatible = "generic-ehci";
- reg = <0xff500000 0x100>;
+ reg = <0x0 0xff500000 0x0 0x100>;
interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USBHOST0>;
clock-names = "usbhost";
@@ -586,7 +586,7 @@
usb_host1: usb@ff540000 {
compatible = "rockchip,rk3288-usb", "rockchip,rk3066-usb",
"snps,dwc2";
- reg = <0xff540000 0x40000>;
+ reg = <0x0 0xff540000 0x0 0x40000>;
interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USBHOST1>;
clock-names = "otg";
@@ -599,7 +599,7 @@
usb_otg: usb@ff580000 {
compatible = "rockchip,rk3288-usb", "rockchip,rk3066-usb",
"snps,dwc2";
- reg = <0xff580000 0x40000>;
+ reg = <0x0 0xff580000 0x0 0x40000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_OTG0>;
clock-names = "otg";
@@ -614,7 +614,7 @@
usb_hsic: usb@ff5c0000 {
compatible = "generic-ehci";
- reg = <0xff5c0000 0x100>;
+ reg = <0x0 0xff5c0000 0x0 0x100>;
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_HSIC>;
clock-names = "usbhost";
@@ -623,7 +623,7 @@
i2c0: i2c@ff650000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff650000 0x1000>;
+ reg = <0x0 0xff650000 0x0 0x1000>;
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -636,7 +636,7 @@
i2c2: i2c@ff660000 {
compatible = "rockchip,rk3288-i2c";
- reg = <0xff660000 0x1000>;
+ reg = <0x0 0xff660000 0x0 0x1000>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -649,7 +649,7 @@
pwm0: pwm@ff680000 {
compatible = "rockchip,rk3288-pwm";
- reg = <0xff680000 0x10>;
+ reg = <0x0 0xff680000 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pin>;
@@ -660,7 +660,7 @@
pwm1: pwm@ff680010 {
compatible = "rockchip,rk3288-pwm";
- reg = <0xff680010 0x10>;
+ reg = <0x0 0xff680010 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "default";
pinctrl-0 = <&pwm1_pin>;
@@ -671,7 +671,7 @@
pwm2: pwm@ff680020 {
compatible = "rockchip,rk3288-pwm";
- reg = <0xff680020 0x10>;
+ reg = <0x0 0xff680020 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "default";
pinctrl-0 = <&pwm2_pin>;
@@ -682,7 +682,7 @@
pwm3: pwm@ff680030 {
compatible = "rockchip,rk3288-pwm";
- reg = <0xff680030 0x10>;
+ reg = <0x0 0xff680030 0x0 0x10>;
#pwm-cells = <2>;
pinctrl-names = "default";
pinctrl-0 = <&pwm3_pin>;
@@ -693,10 +693,10 @@
bus_intmem@ff700000 {
compatible = "mmio-sram";
- reg = <0xff700000 0x18000>;
+ reg = <0x0 0xff700000 0x0 0x18000>;
#address-cells = <1>;
#size-cells = <1>;
- ranges = <0 0xff700000 0x18000>;
+ ranges = <0 0x0 0xff700000 0x18000>;
smp-sram@0 {
compatible = "rockchip,rk3066-smp-sram";
reg = <0x00 0x10>;
@@ -705,12 +705,12 @@
sram@ff720000 {
compatible = "rockchip,rk3288-pmu-sram", "mmio-sram";
- reg = <0xff720000 0x1000>;
+ reg = <0x0 0xff720000 0x0 0x1000>;
};
pmu: power-management@ff730000 {
compatible = "rockchip,rk3288-pmu", "syscon", "simple-mfd";
- reg = <0xff730000 0x100>;
+ reg = <0x0 0xff730000 0x0 0x100>;
power: power-controller {
compatible = "rockchip,rk3288-power-controller";
@@ -831,12 +831,12 @@
sgrf: syscon@ff740000 {
compatible = "rockchip,rk3288-sgrf", "syscon";
- reg = <0xff740000 0x1000>;
+ reg = <0x0 0xff740000 0x0 0x1000>;
};
cru: clock-controller@ff760000 {
compatible = "rockchip,rk3288-cru";
- reg = <0xff760000 0x1000>;
+ reg = <0x0 0xff760000 0x0 0x1000>;
rockchip,grf = <&grf>;
#clock-cells = <1>;
#reset-cells = <1>;
@@ -854,7 +854,7 @@
grf: syscon@ff770000 {
compatible = "rockchip,rk3288-grf", "syscon", "simple-mfd";
- reg = <0xff770000 0x1000>;
+ reg = <0x0 0xff770000 0x0 0x1000>;
edp_phy: edp-phy {
compatible = "rockchip,rk3288-dp-phy";
@@ -903,7 +903,7 @@
wdt: watchdog@ff800000 {
compatible = "rockchip,rk3288-wdt", "snps,dw-wdt";
- reg = <0xff800000 0x100>;
+ reg = <0x0 0xff800000 0x0 0x100>;
clocks = <&cru PCLK_WDT>;
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
@@ -911,7 +911,7 @@
spdif: sound@ff88b0000 {
compatible = "rockchip,rk3288-spdif", "rockchip,rk3066-spdif";
- reg = <0xff8b0000 0x10000>;
+ reg = <0x0 0xff8b0000 0x0 0x10000>;
#sound-dai-cells = <0>;
clock-names = "hclk", "mclk";
clocks = <&cru HCLK_SPDIF8CH>, <&cru SCLK_SPDIF8CH>;
@@ -926,7 +926,7 @@
i2s: i2s@ff890000 {
compatible = "rockchip,rk3288-i2s", "rockchip,rk3066-i2s";
- reg = <0xff890000 0x10000>;
+ reg = <0x0 0xff890000 0x0 0x10000>;
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
@@ -943,7 +943,7 @@
crypto: cypto-controller@ff8a0000 {
compatible = "rockchip,rk3288-crypto";
- reg = <0xff8a0000 0x4000>;
+ reg = <0x0 0xff8a0000 0x0 0x4000>;
interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_CRYPTO>, <&cru HCLK_CRYPTO>,
<&cru SCLK_CRYPTO>, <&cru ACLK_DMAC1>;
@@ -953,9 +953,28 @@
status = "okay";
};
+ iep_mmu: iommu@ff900800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff900800 0x0 0x40>;
+ interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "iep_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ isp_mmu: iommu@ff914000 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>;
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "isp_mmu";
+ #iommu-cells = <0>;
+ rockchip,disable-mmu-reset;
+ status = "disabled";
+ };
+
vopb: vop@ff930000 {
compatible = "rockchip,rk3288-vop";
- reg = <0xff930000 0x19c>;
+ reg = <0x0 0xff930000 0x0 0x19c>;
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>;
clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
@@ -988,7 +1007,7 @@
vopb_mmu: iommu@ff930300 {
compatible = "rockchip,iommu";
- reg = <0xff930300 0x100>;
+ reg = <0x0 0xff930300 0x0 0x100>;
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "vopb_mmu";
power-domains = <&power RK3288_PD_VIO>;
@@ -998,7 +1017,7 @@
vopl: vop@ff940000 {
compatible = "rockchip,rk3288-vop";
- reg = <0xff940000 0x19c>;
+ reg = <0x0 0xff940000 0x0 0x19c>;
interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP1>, <&cru DCLK_VOP1>, <&cru HCLK_VOP1>;
clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
@@ -1031,7 +1050,7 @@
vopl_mmu: iommu@ff940300 {
compatible = "rockchip,iommu";
- reg = <0xff940300 0x100>;
+ reg = <0x0 0xff940300 0x0 0x100>;
interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "vopl_mmu";
power-domains = <&power RK3288_PD_VIO>;
@@ -1041,7 +1060,7 @@
mipi_dsi: mipi@ff960000 {
compatible = "rockchip,rk3288-mipi-dsi", "snps,dw-mipi-dsi";
- reg = <0xff960000 0x4000>;
+ reg = <0x0 0xff960000 0x0 0x4000>;
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_MIPIDSI_24M>, <&cru PCLK_MIPI_DSI0>;
clock-names = "ref", "pclk";
@@ -1069,7 +1088,7 @@
edp: dp@ff970000 {
compatible = "rockchip,rk3288-dp";
- reg = <0xff970000 0x4000>;
+ reg = <0x0 0xff970000 0x0 0x4000>;
interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_EDP>, <&cru PCLK_EDP_CTRL>;
clock-names = "dp", "pclk";
@@ -1101,7 +1120,7 @@
hdmi: hdmi@ff980000 {
compatible = "rockchip,rk3288-dw-hdmi";
- reg = <0xff980000 0x20000>;
+ reg = <0x0 0xff980000 0x0 0x20000>;
reg-io-width = <4>;
rockchip,grf = <&grf>;
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
@@ -1126,9 +1145,27 @@
};
};
+ vpu_mmu: iommu@ff9a0800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff9a0800 0x0 0x100>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vpu_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ hevc_mmu: iommu@ff9c0440 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff9c0440 0x0 0x40>, <0x0 0xff9c0480 0x0 0x40>;
+ interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "hevc_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
gpu: gpu@ffa30000 {
compatible = "rockchip,rk3288-mali", "arm,mali-t760";
- reg = <0xffa30000 0x10000>;
+ reg = <0x0 0xffa30000 0x0 0x10000>;
interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
@@ -1170,72 +1207,72 @@
qos_gpu_r: qos@ffaa0000 {
compatible = "syscon";
- reg = <0xffaa0000 0x20>;
+ reg = <0x0 0xffaa0000 0x0 0x20>;
};
qos_gpu_w: qos@ffaa0080 {
compatible = "syscon";
- reg = <0xffaa0080 0x20>;
+ reg = <0x0 0xffaa0080 0x0 0x20>;
};
qos_vio1_vop: qos@ffad0000 {
compatible = "syscon";
- reg = <0xffad0000 0x20>;
+ reg = <0x0 0xffad0000 0x0 0x20>;
};
qos_vio1_isp_w0: qos@ffad0100 {
compatible = "syscon";
- reg = <0xffad0100 0x20>;
+ reg = <0x0 0xffad0100 0x0 0x20>;
};
qos_vio1_isp_w1: qos@ffad0180 {
compatible = "syscon";
- reg = <0xffad0180 0x20>;
+ reg = <0x0 0xffad0180 0x0 0x20>;
};
qos_vio0_vop: qos@ffad0400 {
compatible = "syscon";
- reg = <0xffad0400 0x20>;
+ reg = <0x0 0xffad0400 0x0 0x20>;
};
qos_vio0_vip: qos@ffad0480 {
compatible = "syscon";
- reg = <0xffad0480 0x20>;
+ reg = <0x0 0xffad0480 0x0 0x20>;
};
qos_vio0_iep: qos@ffad0500 {
compatible = "syscon";
- reg = <0xffad0500 0x20>;
+ reg = <0x0 0xffad0500 0x0 0x20>;
};
qos_vio2_rga_r: qos@ffad0800 {
compatible = "syscon";
- reg = <0xffad0800 0x20>;
+ reg = <0x0 0xffad0800 0x0 0x20>;
};
qos_vio2_rga_w: qos@ffad0880 {
compatible = "syscon";
- reg = <0xffad0880 0x20>;
+ reg = <0x0 0xffad0880 0x0 0x20>;
};
qos_vio1_isp_r: qos@ffad0900 {
compatible = "syscon";
- reg = <0xffad0900 0x20>;
+ reg = <0x0 0xffad0900 0x0 0x20>;
};
qos_video: qos@ffae0000 {
compatible = "syscon";
- reg = <0xffae0000 0x20>;
+ reg = <0x0 0xffae0000 0x0 0x20>;
};
qos_hevc_r: qos@ffaf0000 {
compatible = "syscon";
- reg = <0xffaf0000 0x20>;
+ reg = <0x0 0xffaf0000 0x0 0x20>;
};
qos_hevc_w: qos@ffaf0080 {
compatible = "syscon";
- reg = <0xffaf0080 0x20>;
+ reg = <0x0 0xffaf0080 0x0 0x20>;
};
gic: interrupt-controller@ffc01000 {
@@ -1244,16 +1281,16 @@
#interrupt-cells = <3>;
#address-cells = <0>;
- reg = <0xffc01000 0x1000>,
- <0xffc02000 0x2000>,
- <0xffc04000 0x2000>,
- <0xffc06000 0x2000>;
+ reg = <0x0 0xffc01000 0x0 0x1000>,
+ <0x0 0xffc02000 0x0 0x2000>,
+ <0x0 0xffc04000 0x0 0x2000>,
+ <0x0 0xffc06000 0x0 0x2000>;
interrupts = <GIC_PPI 9 0xf04>;
};
efuse: efuse@ffb40000 {
compatible = "rockchip,rk3288-efuse";
- reg = <0xffb40000 0x20>;
+ reg = <0x0 0xffb40000 0x0 0x20>;
#address-cells = <1>;
#size-cells = <1>;
clocks = <&cru PCLK_EFUSE256>;
@@ -1268,13 +1305,13 @@
compatible = "rockchip,rk3288-pinctrl";
rockchip,grf = <&grf>;
rockchip,pmu = <&pmu>;
- #address-cells = <1>;
- #size-cells = <1>;
+ #address-cells = <2>;
+ #size-cells = <2>;
ranges;
gpio0: gpio0@ff750000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff750000 0x100>;
+ reg = <0x0 0xff750000 0x0 0x100>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO0>;
@@ -1287,7 +1324,7 @@
gpio1: gpio1@ff780000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff780000 0x100>;
+ reg = <0x0 0xff780000 0x0 0x100>;
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO1>;
@@ -1300,7 +1337,7 @@
gpio2: gpio2@ff790000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff790000 0x100>;
+ reg = <0x0 0xff790000 0x0 0x100>;
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO2>;
@@ -1313,7 +1350,7 @@
gpio3: gpio3@ff7a0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7a0000 0x100>;
+ reg = <0x0 0xff7a0000 0x0 0x100>;
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO3>;
@@ -1326,7 +1363,7 @@
gpio4: gpio4@ff7b0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7b0000 0x100>;
+ reg = <0x0 0xff7b0000 0x0 0x100>;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO4>;
@@ -1339,7 +1376,7 @@
gpio5: gpio5@ff7c0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7c0000 0x100>;
+ reg = <0x0 0xff7c0000 0x0 0x100>;
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO5>;
@@ -1352,7 +1389,7 @@
gpio6: gpio6@ff7d0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7d0000 0x100>;
+ reg = <0x0 0xff7d0000 0x0 0x100>;
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO6>;
@@ -1365,7 +1402,7 @@
gpio7: gpio7@ff7e0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7e0000 0x100>;
+ reg = <0x0 0xff7e0000 0x0 0x100>;
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO7>;
@@ -1378,7 +1415,7 @@
gpio8: gpio8@ff7f0000 {
compatible = "rockchip,gpio-bank";
- reg = <0xff7f0000 0x100>;
+ reg = <0x0 0xff7f0000 0x0 0x100>;
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO8>;
diff --git a/arch/arm/boot/dts/rv1108-evb.dts b/arch/arm/boot/dts/rv1108-evb.dts
index 58cf4ac079c3..86a57f823616 100644
--- a/arch/arm/boot/dts/rv1108-evb.dts
+++ b/arch/arm/boot/dts/rv1108-evb.dts
@@ -54,6 +54,184 @@
chosen {
stdout-path = "serial2:1500000n8";
};
+
+ backlight: backlight {
+ compatible = "pwm-backlight";
+ brightness-levels = <
+ 0 1 2 3 4 5 6 7
+ 8 9 10 11 12 13 14 15
+ 16 17 18 19 20 21 22 23
+ 24 25 26 27 28 29 30 31
+ 32 33 34 35 36 37 38 39
+ 40 41 42 43 44 45 46 47
+ 48 49 50 51 52 53 54 55
+ 56 57 58 59 60 61 62 63
+ 64 65 66 67 68 69 70 71
+ 72 73 74 75 76 77 78 79
+ 80 81 82 83 84 85 86 87
+ 88 89 90 91 92 93 94 95
+ 96 97 98 99 100 101 102 103
+ 104 105 106 107 108 109 110 111
+ 112 113 114 115 116 117 118 119
+ 120 121 122 123 124 125 126 127
+ 128 129 130 131 132 133 134 135
+ 136 137 138 139 140 141 142 143
+ 144 145 146 147 148 149 150 151
+ 152 153 154 155 156 157 158 159
+ 160 161 162 163 164 165 166 167
+ 168 169 170 171 172 173 174 175
+ 176 177 178 179 180 181 182 183
+ 184 185 186 187 188 189 190 191
+ 192 193 194 195 196 197 198 199
+ 200 201 202 203 204 205 206 207
+ 208 209 210 211 212 213 214 215
+ 216 217 218 219 220 221 222 223
+ 224 225 226 227 228 229 230 231
+ 232 233 234 235 236 237 238 239
+ 240 241 242 243 244 245 246 247
+ 248 249 250 251 252 253 254 255>;
+ default-brightness-level = <200>;
+ pwms = <&pwm0 0 25000 0>;
+ };
+
+ vcc_sys: vsys-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vsys";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ regulator-boot-on;
+ };
+};
+
+&cpu0 {
+ cpu-supply = <&vdd_core>;
+};
+
+&i2c0 {
+ status = "okay";
+ i2c-scl-rising-time-ns = <275>;
+ i2c-scl-falling-time-ns = <16>;
+ clock-frequency = <400000>;
+
+ rk805: pmic@18 {
+ compatible = "rockchip,rk805";
+ reg = <0x18>;
+ interrupt-parent = <&gpio0>;
+ interrupts = <RK_PB4 IRQ_TYPE_LEVEL_LOW>;
+ rockchip,system-power-controller;
+
+ vcc1-supply = <&vcc_sys>;
+ vcc2-supply = <&vcc_sys>;
+ vcc3-supply = <&vcc_sys>;
+ vcc4-supply = <&vcc_sys>;
+ vcc5-supply = <&vcc_sys>;
+ vcc6-supply = <&vcc_sys>;
+
+ regulators {
+ vdd_core: DCDC_REG1 {
+ regulator-name= "vdd_core";
+ regulator-min-microvolt = <700000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-enabled;
+ regulator-state-uv = <900000>;
+ };
+ };
+
+ vdd_cam: DCDC_REG2 {
+ regulator-name= "vdd_cam";
+ regulator-min-microvolt = <700000>;
+ regulator-max-microvolt = <2000000>;
+ regulator-state-mem {
+ regulator-state-disabled;
+ };
+ };
+
+ vcc_ddr: DCDC_REG3 {
+ regulator-name= "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-enabled;
+ };
+ };
+
+ vcc_io: DCDC_REG4 {
+ regulator-name= "vcc_io";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-enabled;
+ regulator-state-uv = <3300000>;
+ };
+ };
+
+ vdd_10: LDO_REG1 {
+ regulator-name= "vdd_10";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-disabled;
+ };
+ };
+
+ vcc_18: LDO_REG2 {
+ regulator-name= "vcc_18";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-disabled;
+ };
+ };
+
+ vdd10_pmu: LDO_REG3 {
+ regulator-name= "vdd10_pmu";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-state-enabled;
+ regulator-state-uv = <1000000>;
+ };
+ };
+ };
+ };
+
+ bma250: accelerometer@19 {
+ compatible = "bosch,bma250e";
+ reg = <0x19>;
+ interrupt-parent = <&gpio0>;
+ interrupts = <RK_PB3 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+&pwm0 {
+ status = "okay";
+};
+
+&sdmmc {
+ status = "okay";
+};
+
+&u2phy {
+ status = "okay";
+
+ u2phy_host: host-port {
+ status = "okay";
+ };
+
+ u2phy_otg: otg-port {
+ status = "okay";
+ };
};
&uart0 {
@@ -67,3 +245,15 @@
&uart2 {
status = "okay";
};
+
+&usb_host_ehci {
+ status = "okay";
+};
+
+&usb_host_ohci {
+ status = "okay";
+};
+
+&usb_otg {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/rv1108.dtsi b/arch/arm/boot/dts/rv1108.dtsi
index 437098b556eb..e7cd1315db1b 100644
--- a/arch/arm/boot/dts/rv1108.dtsi
+++ b/arch/arm/boot/dts/rv1108.dtsi
@@ -52,6 +52,10 @@
interrupt-parent = <&gic>;
aliases {
+ i2c0 = &i2c0;
+ i2c1 = &i2c1;
+ i2c2 = &i2c2;
+ i2c3 = &i2c3;
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
@@ -65,6 +69,33 @@
device_type = "cpu";
compatible = "arm,cortex-a7";
reg = <0xf00>;
+ clocks = <&cru ARMCLK>;
+ operating-points-v2 = <&cpu_opp_table>;
+ };
+ };
+
+ cpu_opp_table: opp_table {
+ compatible = "operating-points-v2";
+
+ opp-408000000 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <975000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <975000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-816000000 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1025000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-1008000000 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <1150000>;
+ clock-latency-ns = <40000>;
};
};
@@ -154,9 +185,221 @@
status = "disabled";
};
+ i2c1: i2c@10240000 {
+ compatible = "rockchip,rv1108-i2c";
+ reg = <0x10240000 0x1000>;
+ interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;
+ clock-names = "i2c", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_xfer>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+ };
+
+ i2c2: i2c@10250000 {
+ compatible = "rockchip,rv1108-i2c";
+ reg = <0x10250000 0x1000>;
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&cru SCLK_I2C2>, <&cru PCLK_I2C2>;
+ clock-names = "i2c", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c2m1_xfer>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+ };
+
+ i2c3: i2c@10260000 {
+ compatible = "rockchip,rv1108-i2c";
+ reg = <0x10260000 0x1000>;
+ interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&cru SCLK_I2C3>, <&cru PCLK_I2C3>;
+ clock-names = "i2c", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c3_xfer>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+ };
+
+ spi: spi@10270000 {
+ compatible = "rockchip,rv1108-spi";
+ reg = <0x10270000 0x1000>;
+ interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_SPI>, <&cru PCLK_SPI>;
+ clock-names = "spiclk", "apb_pclk";
+ dmas = <&pdma 8>, <&pdma 9>;
+ #dma-cells = <2>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ pwm4: pwm@10280000 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x10280000 0x10>;
+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm4_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm5: pwm@10280010 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x10280010 0x10>;
+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm5_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm6: pwm@10280020 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x10280020 0x10>;
+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm6_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm7: pwm@10280030 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x10280030 0x10>;
+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm7_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
grf: syscon@10300000 {
- compatible = "rockchip,rv1108-grf", "syscon";
+ compatible = "rockchip,rv1108-grf", "syscon", "simple-mfd";
reg = <0x10300000 0x1000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ u2phy: usb2-phy@100 {
+ compatible = "rockchip,rv1108-usb2phy";
+ reg = <0x100 0x0c>;
+ clocks = <&cru SCLK_USBPHY>;
+ clock-names = "phyclk";
+ #clock-cells = <0>;
+ clock-output-names = "usbphy";
+ rockchip,usbgrf = <&usbgrf>;
+ status = "disabled";
+
+ u2phy_otg: otg-port {
+ interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "otg-mux";
+ #phy-cells = <0>;
+ status = "disabled";
+ };
+
+ u2phy_host: host-port {
+ interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "linestate";
+ #phy-cells = <0>;
+ status = "disabled";
+ };
+ };
+ };
+
+ watchdog: wdt@10360000 {
+ compatible = "snps,dw-wdt";
+ reg = <0x10360000 0x100>;
+ interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru PCLK_WDT>;
+ clock-names = "pclk_wdt";
+ status = "disabled";
+ };
+
+ adc: adc@1038c000 {
+ compatible = "rockchip,rv1108-saradc", "rockchip,rk3399-saradc";
+ reg = <0x1038c000 0x100>;
+ interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+ #io-channel-cells = <1>;
+ clock-frequency = <1000000>;
+ clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
+ clock-names = "saradc", "apb_pclk";
+ status = "disabled";
+ };
+
+ i2c0: i2c@20000000 {
+ compatible = "rockchip,rv1108-i2c";
+ reg = <0x20000000 0x1000>;
+ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&cru SCLK_I2C0_PMU>, <&cru PCLK_I2C0_PMU>;
+ clock-names = "i2c", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c0_xfer>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+ };
+
+ pwm0: pwm@20040000 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x20040000 0x10>;
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM0_PMU>, <&cru PCLK_PWM0_PMU>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm0_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm1: pwm@20040010 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x20040010 0x10>;
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM0_PMU>, <&cru PCLK_PWM0_PMU>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm1_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm2: pwm@20040020 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x20040020 0x10>;
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM0_PMU>, <&cru PCLK_PWM0_PMU>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm2_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm3: pwm@20040030 {
+ compatible = "rockchip,rv1108-pwm", "rockchip,rk3288-pwm";
+ reg = <0x20040030 0x10>;
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM0_PMU>, <&cru PCLK_PWM0_PMU>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm3_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
};
pmugrf: syscon@20060000 {
@@ -164,6 +407,11 @@
reg = <0x20060000 0x1000>;
};
+ usbgrf: syscon@202a0000 {
+ compatible = "rockchip,rv1108-usbgrf", "syscon";
+ reg = <0x202a0000 0x1000>;
+ };
+
cru: clock-controller@20200000 {
compatible = "rockchip,rv1108-cru";
reg = <0x20200000 0x1000>;
@@ -174,37 +422,78 @@
emmc: dwmmc@30110000 {
compatible = "rockchip,rv1108-dw-mshc", "rockchip,rk3288-dw-mshc";
- clock-freq-min-max = <400000 150000000>;
+ reg = <0x30110000 0x4000>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
<&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
- interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0x30110000 0x4000>;
+ max-frequency = <150000000>;
status = "disabled";
};
sdio: dwmmc@30120000 {
compatible = "rockchip,rv1108-dw-mshc", "rockchip,rk3288-dw-mshc";
- clock-freq-min-max = <400000 150000000>;
+ reg = <0x30120000 0x4000>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
- interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0x30120000 0x4000>;
+ max-frequency = <150000000>;
status = "disabled";
};
sdmmc: dwmmc@30130000 {
compatible = "rockchip,rv1108-dw-mshc", "rockchip,rk3288-dw-mshc";
- clock-freq-min-max = <400000 100000000>;
+ reg = <0x30130000 0x4000>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
- interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
- reg = <0x30130000 0x4000>;
+ max-frequency = <100000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
+ status = "disabled";
+ };
+
+ usb_host_ehci: usb@30140000 {
+ compatible = "generic-ehci";
+ reg = <0x30140000 0x20000>;
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_HOST0>, <&u2phy>;
+ clock-names = "usbhost", "utmi";
+ phys = <&u2phy_host>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ usb_host_ohci: usb@30160000 {
+ compatible = "generic-ohci";
+ reg = <0x30160000 0x20000>;
+ interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_HOST0>, <&u2phy>;
+ clock-names = "usbhost", "utmi";
+ phys = <&u2phy_host>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ usb_otg: usb@30180000 {
+ compatible = "rockchip,rv1108-usb", "rockchip,rk3066-usb",
+ "snps,dwc2";
+ reg = <0x30180000 0x40000>;
+ interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_OTG>;
+ clock-names = "otg";
+ dr_mode = "otg";
+ g-np-tx-fifo-size = <16>;
+ g-rx-fifo-size = <280>;
+ g-tx-fifo-size = <256 128 128 64 32 16>;
+ g-use-dma;
+ phys = <&u2phy_otg>;
+ phy-names = "usb2-phy";
status = "disabled";
};
@@ -301,6 +590,11 @@
drive-strength = <12>;
};
+ pcfg_pull_none_smt: pcfg-pull-none-smt {
+ bias-disable;
+ input-schmitt-enable;
+ };
+
pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma {
bias-pull-up;
drive-strength = <8>;
@@ -328,6 +622,13 @@
input-enable;
};
+ i2c0 {
+ i2c0_xfer: i2c0-xfer {
+ rockchip,pins = <0 RK_PB1 RK_FUNC_1 &pcfg_pull_none_smt>,
+ <0 RK_PB2 RK_FUNC_1 &pcfg_pull_none_smt>;
+ };
+ };
+
i2c1 {
i2c1_xfer: i2c1-xfer {
rockchip,pins = <2 RK_PD3 RK_FUNC_1 &pcfg_pull_up>,
@@ -366,6 +667,54 @@
};
};
+ pwm0 {
+ pwm0_pin: pwm0-pin {
+ rockchip,pins = <0 RK_PC5 RK_FUNC_1 &pcfg_pull_none>;
+ };
+ };
+
+ pwm1 {
+ pwm1_pin: pwm1-pin {
+ rockchip,pins = <0 RK_PC4 RK_FUNC_1 &pcfg_pull_none>;
+ };
+ };
+
+ pwm2 {
+ pwm2_pin: pwm2-pin {
+ rockchip,pins = <0 RK_PC6 RK_FUNC_1 &pcfg_pull_none>;
+ };
+ };
+
+ pwm3 {
+ pwm3_pin: pwm3-pin {
+ rockchip,pins = <0 RK_PC0 RK_FUNC_1 &pcfg_pull_none>;
+ };
+ };
+
+ pwm4 {
+ pwm4_pin: pwm4-pin {
+ rockchip,pins = <1 RK_PC1 RK_FUNC_3 &pcfg_pull_none>;
+ };
+ };
+
+ pwm5 {
+ pwm5_pin: pwm5-pin {
+ rockchip,pins = <1 RK_PA7 RK_FUNC_2 &pcfg_pull_none>;
+ };
+ };
+
+ pwm6 {
+ pwm6_pin: pwm6-pin {
+ rockchip,pins = <1 RK_PB0 RK_FUNC_2 &pcfg_pull_none>;
+ };
+ };
+
+ pwm7 {
+ pwm7_pin: pwm7-pin {
+ rockchip,pins = <1 RK_PB1 RK_FUNC_2 &pcfg_pull_none>;
+ };
+ };
+
sdmmc {
sdmmc_clk: sdmmc-clk {
rockchip,pins = <3 RK_PC4 RK_FUNC_1 &pcfg_pull_none_drv_4ma>;
diff --git a/arch/arm/boot/dts/sama5d2.dtsi b/arch/arm/boot/dts/sama5d2.dtsi
index 60e69aeacbdb..38d2216c7ead 100644
--- a/arch/arm/boot/dts/sama5d2.dtsi
+++ b/arch/arm/boot/dts/sama5d2.dtsi
@@ -416,6 +416,17 @@
};
};
+ isc: isc@f0008000 {
+ compatible = "atmel,sama5d2-isc";
+ reg = <0xf0008000 0x4000>;
+ interrupts = <46 IRQ_TYPE_LEVEL_HIGH 5>;
+ clocks = <&isc_clk>, <&iscck>, <&isc_gclk>;
+ clock-names = "hclock", "iscck", "gck";
+ #clock-cells = <0>;
+ clock-output-names = "isc-mck";
+ status = "disabled";
+ };
+
ramc0: ramc@f000c000 {
compatible = "atmel,sama5d3-ddramc";
reg = <0xf000c000 0x200>;
@@ -494,6 +505,24 @@
clocks = <&plla>;
};
+ audio_pll_frac: audiopll_fracck {
+ compatible = "atmel,sama5d2-clk-audio-pll-frac";
+ #clock-cells = <0>;
+ clocks = <&main>;
+ };
+
+ audio_pll_pad: audiopll_padck {
+ compatible = "atmel,sama5d2-clk-audio-pll-pad";
+ #clock-cells = <0>;
+ clocks = <&audio_pll_frac>;
+ };
+
+ audio_pll_pmc: audiopll_pmcck {
+ compatible = "atmel,sama5d2-clk-audio-pll-pmc";
+ #clock-cells = <0>;
+ clocks = <&audio_pll_frac>;
+ };
+
utmi: utmick {
compatible = "atmel,at91sam9x5-clk-utmi";
#clock-cells = <0>;
@@ -895,7 +924,7 @@
#address-cells = <1>;
#size-cells = <0>;
interrupt-parent = <&pmc>;
- clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>;
+ clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>, <&audio_pll_pmc>;
sdmmc0_gclk: sdmmc0_gclk {
#clock-cells = <0>;
@@ -925,6 +954,11 @@
atmel,clk-output-range = <0 83000000>;
};
+ isc_gclk: isc_gclk {
+ #clock-cells = <0>;
+ reg = <46>;
+ };
+
pdmic_gclk: pdmic_gclk {
#clock-cells = <0>;
reg = <48>;
@@ -951,9 +985,37 @@
reg = <57>;
atmel,clk-output-range = <0 80000000>;
};
+
+ classd_gclk: classd_gclk {
+ #clock-cells = <0>;
+ reg = <59>;
+ atmel,clk-output-range = <0 100000000>;
+ };
};
};
+ qspi0: spi@f0020000 {
+ compatible = "atmel,sama5d2-qspi";
+ reg = <0xf0020000 0x100>, <0xd0000000 0x08000000>;
+ reg-names = "qspi_base", "qspi_mmap";
+ interrupts = <52 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&qspi0_clk>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ qspi1: spi@f0024000 {
+ compatible = "atmel,sama5d2-qspi";
+ reg = <0xf0024000 0x100>, <0xd8000000 0x08000000>;
+ reg-names = "qspi_base", "qspi_mmap";
+ interrupts = <53 IRQ_TYPE_LEVEL_HIGH 7>;
+ clocks = <&qspi1_clk>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
sha@f0028000 {
compatible = "atmel,at91sam9g46-sha";
reg = <0xf0028000 0x100>;
@@ -1406,6 +1468,19 @@
status = "okay";
};
+ classd: classd@fc048000 {
+ compatible = "atmel,sama5d2-classd";
+ reg = <0xfc048000 0x100>;
+ interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>;
+ dmas = <&dma0
+ (AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
+ AT91_XDMAC_DT_PERID(47))>;
+ dma-names = "tx";
+ clocks = <&classd_clk>, <&classd_gclk>;
+ clock-names = "pclk", "gclk";
+ status = "disabled";
+ };
+
can1: can@fc050000 {
compatible = "bosch,m_can";
reg = <0xfc050000 0x4000>, <0x210000 0x4000>;
diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi
index 54bc6d3cf290..40f4ad3c34c6 100644
--- a/arch/arm/boot/dts/spear1310.dtsi
+++ b/arch/arm/boot/dts/spear1310.dtsi
@@ -98,6 +98,7 @@
device_type = "pci";
ranges = <0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
status = "disabled";
};
@@ -116,6 +117,7 @@
device_type = "pci";
ranges = <0x81000000 0 0 0x90020000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x90030000 0x90030000 0 0x0ffd0000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
status = "disabled";
};
@@ -134,6 +136,7 @@
device_type = "pci";
ranges = <0x81000000 0 0 0xc0020000 0 0x00010000 /* downstream I/O */
0x82000000 0 0xc0030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi
index df2232d767ed..5f347054527d 100644
--- a/arch/arm/boot/dts/spear1340.dtsi
+++ b/arch/arm/boot/dts/spear1340.dtsi
@@ -63,6 +63,7 @@
device_type = "pci";
ranges = <0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+ bus-range = <0x00 0xff>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/ste-dbx5x0.dtsi b/arch/arm/boot/dts/ste-dbx5x0.dtsi
index 6c5affe2d0f5..2310a4e97768 100644
--- a/arch/arm/boot/dts/ste-dbx5x0.dtsi
+++ b/arch/arm/boot/dts/ste-dbx5x0.dtsi
@@ -37,6 +37,14 @@
device_type = "cpu";
compatible = "arm,cortex-a9";
reg = <0x300>;
+ /* cpufreq controls */
+ operating-points = <998400 0
+ 800000 0
+ 400000 0
+ 200000 0>;
+ clocks = <&prcmu_clk PRCMU_ARMSS>;
+ clock-names = "cpu";
+ clock-latency = <20000>;
};
CPU1: cpu@301 {
device_type = "cpu";
@@ -494,13 +502,6 @@
reg = <0x80157450 0xC>;
};
- cpufreq {
- compatible = "stericsson,cpufreq-ux500";
- clocks = <&prcmu_clk PRCMU_ARMSS>;
- clock-names = "armss";
- status = "disabled";
- };
-
thermal@801573c0 {
compatible = "stericsson,db8500-thermal";
reg = <0x801573c0 0x40>;
diff --git a/arch/arm/boot/dts/stm32429i-eval.dts b/arch/arm/boot/dts/stm32429i-eval.dts
index dcda0bbefe5b..293ecb957227 100644
--- a/arch/arm/boot/dts/stm32429i-eval.dts
+++ b/arch/arm/boot/dts/stm32429i-eval.dts
@@ -47,6 +47,7 @@
/dts-v1/;
#include "stm32f429.dtsi"
+#include "stm32f429-pinctrl.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/gpio/gpio.h>
@@ -55,7 +56,7 @@
compatible = "st,stm32429i-eval", "st,stm32f429";
chosen {
- bootargs = "root=/dev/ram rdinit=/linuxrc";
+ bootargs = "root=/dev/ram";
stdout-path = "serial0:115200n8";
};
@@ -202,10 +203,8 @@
stmpe1600: stmpe1600@42 {
compatible = "st,stmpe1600";
reg = <0x42>;
- irq-gpio = <&gpioi 8 0>;
- irq-trigger = <3>;
interrupts = <8 3>;
- interrupt-parent = <&exti>;
+ interrupt-parent = <&gpioi>;
interrupt-controller;
wakeup-source;
diff --git a/arch/arm/boot/dts/stm32f4-pinctrl.dtsi b/arch/arm/boot/dts/stm32f4-pinctrl.dtsi
new file mode 100644
index 000000000000..7f3560c0211d
--- /dev/null
+++ b/arch/arm/boot/dts/stm32f4-pinctrl.dtsi
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2017 - Alexandre Torgue <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
+#include <dt-bindings/mfd/stm32f4-rcc.h>
+
+/ {
+ soc {
+ pinctrl: pin-controller {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0x40020000 0x3000>;
+ interrupt-parent = <&exti>;
+ st,syscfg = <&syscfg 0x8>;
+ pins-are-numbered;
+
+ gpioa: gpio@40020000 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x0 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>;
+ st,bank-name = "GPIOA";
+ };
+
+ gpiob: gpio@40020400 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x400 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOB)>;
+ st,bank-name = "GPIOB";
+ };
+
+ gpioc: gpio@40020800 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x800 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOC)>;
+ st,bank-name = "GPIOC";
+ };
+
+ gpiod: gpio@40020c00 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0xc00 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOD)>;
+ st,bank-name = "GPIOD";
+ };
+
+ gpioe: gpio@40021000 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x1000 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOE)>;
+ st,bank-name = "GPIOE";
+ };
+
+ gpiof: gpio@40021400 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x1400 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOF)>;
+ st,bank-name = "GPIOF";
+ };
+
+ gpiog: gpio@40021800 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x1800 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOG)>;
+ st,bank-name = "GPIOG";
+ };
+
+ gpioh: gpio@40021c00 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x1c00 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOH)>;
+ st,bank-name = "GPIOH";
+ };
+
+ gpioi: gpio@40022000 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x2000 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOI)>;
+ st,bank-name = "GPIOI";
+ };
+
+ gpioj: gpio@40022400 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x2400 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOJ)>;
+ st,bank-name = "GPIOJ";
+ };
+
+ gpiok: gpio@40022800 {
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x2800 0x400>;
+ clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOK)>;
+ st,bank-name = "GPIOK";
+ };
+
+ usart1_pins_a: usart1@0 {
+ pins1 {
+ pinmux = <STM32F429_PA9_FUNC_USART1_TX>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <0>;
+ };
+ pins2 {
+ pinmux = <STM32F429_PA10_FUNC_USART1_RX>;
+ bias-disable;
+ };
+ };
+
+ usart3_pins_a: usart3@0 {
+ pins1 {
+ pinmux = <STM32F429_PB10_FUNC_USART3_TX>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <0>;
+ };
+ pins2 {
+ pinmux = <STM32F429_PB11_FUNC_USART3_RX>;
+ bias-disable;
+ };
+ };
+
+ usbotg_fs_pins_a: usbotg_fs@0 {
+ pins {
+ pinmux = <STM32F429_PA10_FUNC_OTG_FS_ID>,
+ <STM32F429_PA11_FUNC_OTG_FS_DM>,
+ <STM32F429_PA12_FUNC_OTG_FS_DP>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <2>;
+ };
+ };
+
+ usbotg_fs_pins_b: usbotg_fs@1 {
+ pins {
+ pinmux = <STM32F429_PB12_FUNC_OTG_HS_ID>,
+ <STM32F429_PB14_FUNC_OTG_HS_DM>,
+ <STM32F429_PB15_FUNC_OTG_HS_DP>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <2>;
+ };
+ };
+
+ usbotg_hs_pins_a: usbotg_hs@0 {
+ pins {
+ pinmux = <STM32F429_PH4_FUNC_OTG_HS_ULPI_NXT>,
+ <STM32F429_PI11_FUNC_OTG_HS_ULPI_DIR>,
+ <STM32F429_PC0_FUNC_OTG_HS_ULPI_STP>,
+ <STM32F429_PA5_FUNC_OTG_HS_ULPI_CK>,
+ <STM32F429_PA3_FUNC_OTG_HS_ULPI_D0>,
+ <STM32F429_PB0_FUNC_OTG_HS_ULPI_D1>,
+ <STM32F429_PB1_FUNC_OTG_HS_ULPI_D2>,
+ <STM32F429_PB10_FUNC_OTG_HS_ULPI_D3>,
+ <STM32F429_PB11_FUNC_OTG_HS_ULPI_D4>,
+ <STM32F429_PB12_FUNC_OTG_HS_ULPI_D5>,
+ <STM32F429_PB13_FUNC_OTG_HS_ULPI_D6>,
+ <STM32F429_PB5_FUNC_OTG_HS_ULPI_D7>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <2>;
+ };
+ };
+
+ ethernet_mii: mii@0 {
+ pins {
+ pinmux = <STM32F429_PG13_FUNC_ETH_MII_TXD0_ETH_RMII_TXD0>,
+ <STM32F429_PG14_FUNC_ETH_MII_TXD1_ETH_RMII_TXD1>,
+ <STM32F429_PC2_FUNC_ETH_MII_TXD2>,
+ <STM32F429_PB8_FUNC_ETH_MII_TXD3>,
+ <STM32F429_PC3_FUNC_ETH_MII_TX_CLK>,
+ <STM32F429_PG11_FUNC_ETH_MII_TX_EN_ETH_RMII_TX_EN>,
+ <STM32F429_PA2_FUNC_ETH_MDIO>,
+ <STM32F429_PC1_FUNC_ETH_MDC>,
+ <STM32F429_PA1_FUNC_ETH_MII_RX_CLK_ETH_RMII_REF_CLK>,
+ <STM32F429_PA7_FUNC_ETH_MII_RX_DV_ETH_RMII_CRS_DV>,
+ <STM32F429_PC4_FUNC_ETH_MII_RXD0_ETH_RMII_RXD0>,
+ <STM32F429_PC5_FUNC_ETH_MII_RXD1_ETH_RMII_RXD1>,
+ <STM32F429_PH6_FUNC_ETH_MII_RXD2>,
+ <STM32F429_PH7_FUNC_ETH_MII_RXD3>;
+ slew-rate = <2>;
+ };
+ };
+
+ adc3_in8_pin: adc@200 {
+ pins {
+ pinmux = <STM32F429_PF10_FUNC_ANALOG>;
+ };
+ };
+
+ pwm1_pins: pwm@1 {
+ pins {
+ pinmux = <STM32F429_PA8_FUNC_TIM1_CH1>,
+ <STM32F429_PB13_FUNC_TIM1_CH1N>,
+ <STM32F429_PB12_FUNC_TIM1_BKIN>;
+ };
+ };
+
+ pwm3_pins: pwm@3 {
+ pins {
+ pinmux = <STM32F429_PB4_FUNC_TIM3_CH1>,
+ <STM32F429_PB5_FUNC_TIM3_CH2>;
+ };
+ };
+
+ i2c1_pins: i2c1@0 {
+ pins {
+ pinmux = <STM32F429_PB9_FUNC_I2C1_SDA>,
+ <STM32F429_PB6_FUNC_I2C1_SCL>;
+ bias-disable;
+ drive-open-drain;
+ slew-rate = <3>;
+ };
+ };
+
+ ltdc_pins: ltdc@0 {
+ pins {
+ pinmux = <STM32F429_PI12_FUNC_LCD_HSYNC>,
+ <STM32F429_PI13_FUNC_LCD_VSYNC>,
+ <STM32F429_PI14_FUNC_LCD_CLK>,
+ <STM32F429_PI15_FUNC_LCD_R0>,
+ <STM32F429_PJ0_FUNC_LCD_R1>,
+ <STM32F429_PJ1_FUNC_LCD_R2>,
+ <STM32F429_PJ2_FUNC_LCD_R3>,
+ <STM32F429_PJ3_FUNC_LCD_R4>,
+ <STM32F429_PJ4_FUNC_LCD_R5>,
+ <STM32F429_PJ5_FUNC_LCD_R6>,
+ <STM32F429_PJ6_FUNC_LCD_R7>,
+ <STM32F429_PJ7_FUNC_LCD_G0>,
+ <STM32F429_PJ8_FUNC_LCD_G1>,
+ <STM32F429_PJ9_FUNC_LCD_G2>,
+ <STM32F429_PJ10_FUNC_LCD_G3>,
+ <STM32F429_PJ11_FUNC_LCD_G4>,
+ <STM32F429_PJ12_FUNC_LCD_B0>,
+ <STM32F429_PJ13_FUNC_LCD_B1>,
+ <STM32F429_PJ14_FUNC_LCD_B2>,
+ <STM32F429_PJ15_FUNC_LCD_B3>,
+ <STM32F429_PK0_FUNC_LCD_G5>,
+ <STM32F429_PK1_FUNC_LCD_G6>,
+ <STM32F429_PK2_FUNC_LCD_G7>,
+ <STM32F429_PK3_FUNC_LCD_B4>,
+ <STM32F429_PK4_FUNC_LCD_B5>,
+ <STM32F429_PK5_FUNC_LCD_B6>,
+ <STM32F429_PK6_FUNC_LCD_B7>,
+ <STM32F429_PK7_FUNC_LCD_DE>;
+ slew-rate = <2>;
+ };
+ };
+
+ dcmi_pins: dcmi@0 {
+ pins {
+ pinmux = <STM32F429_PA4_FUNC_DCMI_HSYNC>,
+ <STM32F429_PB7_FUNC_DCMI_VSYNC>,
+ <STM32F429_PA6_FUNC_DCMI_PIXCLK>,
+ <STM32F429_PC6_FUNC_DCMI_D0>,
+ <STM32F429_PC7_FUNC_DCMI_D1>,
+ <STM32F429_PC8_FUNC_DCMI_D2>,
+ <STM32F429_PC9_FUNC_DCMI_D3>,
+ <STM32F429_PC11_FUNC_DCMI_D4>,
+ <STM32F429_PD3_FUNC_DCMI_D5>,
+ <STM32F429_PB8_FUNC_DCMI_D6>,
+ <STM32F429_PE6_FUNC_DCMI_D7>,
+ <STM32F429_PC10_FUNC_DCMI_D8>,
+ <STM32F429_PC12_FUNC_DCMI_D9>,
+ <STM32F429_PD6_FUNC_DCMI_D10>,
+ <STM32F429_PD2_FUNC_DCMI_D11>;
+ bias-disable;
+ drive-push-pull;
+ slew-rate = <3>;
+ };
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/stm32f429-disco.dts b/arch/arm/boot/dts/stm32f429-disco.dts
index ae47cde7952f..5ceb2cf3777f 100644
--- a/arch/arm/boot/dts/stm32f429-disco.dts
+++ b/arch/arm/boot/dts/stm32f429-disco.dts
@@ -47,6 +47,7 @@
/dts-v1/;
#include "stm32f429.dtsi"
+#include "stm32f429-pinctrl.dtsi"
#include <dt-bindings/input/input.h>
/ {
@@ -54,7 +55,7 @@
compatible = "st,stm32f429i-disco", "st,stm32f429";
chosen {
- bootargs = "root=/dev/ram rdinit=/linuxrc";
+ bootargs = "root=/dev/ram";
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm/boot/dts/imx6ul-geam-kit.dts b/arch/arm/boot/dts/stm32f429-pinctrl.dtsi
index 142e60cab65f..3e7a17d9112e 100644
--- a/arch/arm/boot/dts/imx6ul-geam-kit.dts
+++ b/arch/arm/boot/dts/stm32f429-pinctrl.dtsi
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2016 Amarula Solutions B.V.
- * Copyright (C) 2016 Engicam S.r.l.
+ * Copyright 2017 - Alexandre Torgue <[email protected]>
*
* This file is dual-licensed: you can use it either under the terms
* of the GPL or the X11 license, at your option. Note that this dual
@@ -8,8 +7,9 @@
* whole.
*
* a) This file is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -40,62 +40,56 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
-/dts-v1/;
-
-#include <dt-bindings/gpio/gpio.h>
-#include "imx6ul-geam.dtsi"
+#include "stm32f4-pinctrl.dtsi"
/ {
- model = "Engicam GEAM6UL";
- compatible = "engicam,imx6ul-geam", "fsl,imx6ul";
-};
+ soc {
+ pinctrl: pin-controller {
+ compatible = "st,stm32f429-pinctrl";
-&can1 {
- status = "okay";
-};
+ gpioa: gpio@40020000 {
+ gpio-ranges = <&pinctrl 0 0 16>;
+ };
-&can2 {
- status = "okay";
-};
+ gpiob: gpio@40020400 {
+ gpio-ranges = <&pinctrl 0 16 16>;
+ };
-&lcdif {
- display = <&display0>;
- status = "okay";
+ gpioc: gpio@40020800 {
+ gpio-ranges = <&pinctrl 0 32 16>;
+ };
- display0: display {
- bits-per-pixel = <16>;
- bus-width = <18>;
- status = "okay";
+ gpiod: gpio@40020c00 {
+ gpio-ranges = <&pinctrl 0 48 16>;
+ };
- display-timings {
- native-mode = <&timing0>;
- timing0: timing0 {
- clock-frequency = <28000000>;
- hactive = <800>;
- vactive = <480>;
- hfront-porch = <30>;
- hback-porch = <30>;
- hsync-len = <64>;
- vback-porch = <5>;
- vfront-porch = <5>;
- vsync-len = <20>;
- hsync-active = <0>;
- vsync-active = <0>;
- de-active = <1>;
- pixelclk-active = <0>;
+ gpioe: gpio@40021000 {
+ gpio-ranges = <&pinctrl 0 64 16>;
};
- };
- };
-};
-&usdhc1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usdhc1>;
- status = "okay";
-};
+ gpiof: gpio@40021400 {
+ gpio-ranges = <&pinctrl 0 80 16>;
+ };
+
+ gpiog: gpio@40021800 {
+ gpio-ranges = <&pinctrl 0 96 16>;
+ };
+
+ gpioh: gpio@40021c00 {
+ gpio-ranges = <&pinctrl 0 112 16>;
+ };
+
+ gpioi: gpio@40022000 {
+ gpio-ranges = <&pinctrl 0 128 16>;
+ };
+
+ gpioj: gpio@40022400 {
+ gpio-ranges = <&pinctrl 0 144 16>;
+ };
-&tsc {
- measure-delay-time = <0x1ffff>;
- pre-charge-time = <0x1fff>;
- status = "okay";
+ gpiok: gpio@40022800 {
+ gpio-ranges = <&pinctrl 0 160 8>;
+ };
+ };
+ };
};
diff --git a/arch/arm/boot/dts/stm32f429.dtsi b/arch/arm/boot/dts/stm32f429.dtsi
index a8113dc879cf..5b36eb114ddc 100644
--- a/arch/arm/boot/dts/stm32f429.dtsi
+++ b/arch/arm/boot/dts/stm32f429.dtsi
@@ -47,7 +47,6 @@
#include "skeleton.dtsi"
#include "armv7-m.dtsi"
-#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
#include <dt-bindings/clock/stm32fx-clock.h>
#include <dt-bindings/mfd/stm32f4-rcc.h>
@@ -361,6 +360,31 @@
status = "disabled";
};
+ dac: dac@40007400 {
+ compatible = "st,stm32f4-dac-core";
+ reg = <0x40007400 0x400>;
+ resets = <&rcc STM32F4_APB1_RESET(DAC)>;
+ clocks = <&rcc 0 STM32F4_APB1_CLOCK(DAC)>;
+ clock-names = "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ dac1: dac@1 {
+ compatible = "st,stm32-dac";
+ #io-channels-cells = <1>;
+ reg = <1>;
+ status = "disabled";
+ };
+
+ dac2: dac@2 {
+ compatible = "st,stm32-dac";
+ #io-channels-cells = <1>;
+ reg = <2>;
+ status = "disabled";
+ };
+ };
+
usart7: serial@40007800 {
compatible = "st,stm32-usart", "st,stm32-uart";
reg = <0x40007800 0x400>;
@@ -566,302 +590,6 @@
status = "disabled";
};
- pinctrl: pin-controller {
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "st,stm32f429-pinctrl";
- ranges = <0 0x40020000 0x3000>;
- interrupt-parent = <&exti>;
- st,syscfg = <&syscfg 0x8>;
- pins-are-numbered;
-
- gpioa: gpio@40020000 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x0 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>;
- st,bank-name = "GPIOA";
- };
-
- gpiob: gpio@40020400 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x400 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOB)>;
- st,bank-name = "GPIOB";
- };
-
- gpioc: gpio@40020800 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x800 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOC)>;
- st,bank-name = "GPIOC";
- };
-
- gpiod: gpio@40020c00 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0xc00 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOD)>;
- st,bank-name = "GPIOD";
- };
-
- gpioe: gpio@40021000 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x1000 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOE)>;
- st,bank-name = "GPIOE";
- };
-
- gpiof: gpio@40021400 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x1400 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOF)>;
- st,bank-name = "GPIOF";
- };
-
- gpiog: gpio@40021800 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x1800 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOG)>;
- st,bank-name = "GPIOG";
- };
-
- gpioh: gpio@40021c00 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x1c00 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOH)>;
- st,bank-name = "GPIOH";
- };
-
- gpioi: gpio@40022000 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x2000 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOI)>;
- st,bank-name = "GPIOI";
- };
-
- gpioj: gpio@40022400 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x2400 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOJ)>;
- st,bank-name = "GPIOJ";
- };
-
- gpiok: gpio@40022800 {
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- reg = <0x2800 0x400>;
- clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOK)>;
- st,bank-name = "GPIOK";
- };
-
- usart1_pins_a: usart1@0 {
- pins1 {
- pinmux = <STM32F429_PA9_FUNC_USART1_TX>;
- bias-disable;
- drive-push-pull;
- slew-rate = <0>;
- };
- pins2 {
- pinmux = <STM32F429_PA10_FUNC_USART1_RX>;
- bias-disable;
- };
- };
-
- usart3_pins_a: usart3@0 {
- pins1 {
- pinmux = <STM32F429_PB10_FUNC_USART3_TX>;
- bias-disable;
- drive-push-pull;
- slew-rate = <0>;
- };
- pins2 {
- pinmux = <STM32F429_PB11_FUNC_USART3_RX>;
- bias-disable;
- };
- };
-
- usbotg_fs_pins_a: usbotg_fs@0 {
- pins {
- pinmux = <STM32F429_PA10_FUNC_OTG_FS_ID>,
- <STM32F429_PA11_FUNC_OTG_FS_DM>,
- <STM32F429_PA12_FUNC_OTG_FS_DP>;
- bias-disable;
- drive-push-pull;
- slew-rate = <2>;
- };
- };
-
- usbotg_fs_pins_b: usbotg_fs@1 {
- pins {
- pinmux = <STM32F429_PB12_FUNC_OTG_HS_ID>,
- <STM32F429_PB14_FUNC_OTG_HS_DM>,
- <STM32F429_PB15_FUNC_OTG_HS_DP>;
- bias-disable;
- drive-push-pull;
- slew-rate = <2>;
- };
- };
-
- usbotg_hs_pins_a: usbotg_hs@0 {
- pins {
- pinmux = <STM32F429_PH4_FUNC_OTG_HS_ULPI_NXT>,
- <STM32F429_PI11_FUNC_OTG_HS_ULPI_DIR>,
- <STM32F429_PC0_FUNC_OTG_HS_ULPI_STP>,
- <STM32F429_PA5_FUNC_OTG_HS_ULPI_CK>,
- <STM32F429_PA3_FUNC_OTG_HS_ULPI_D0>,
- <STM32F429_PB0_FUNC_OTG_HS_ULPI_D1>,
- <STM32F429_PB1_FUNC_OTG_HS_ULPI_D2>,
- <STM32F429_PB10_FUNC_OTG_HS_ULPI_D3>,
- <STM32F429_PB11_FUNC_OTG_HS_ULPI_D4>,
- <STM32F429_PB12_FUNC_OTG_HS_ULPI_D5>,
- <STM32F429_PB13_FUNC_OTG_HS_ULPI_D6>,
- <STM32F429_PB5_FUNC_OTG_HS_ULPI_D7>;
- bias-disable;
- drive-push-pull;
- slew-rate = <2>;
- };
- };
-
- ethernet_mii: mii@0 {
- pins {
- pinmux = <STM32F429_PG13_FUNC_ETH_MII_TXD0_ETH_RMII_TXD0>,
- <STM32F429_PG14_FUNC_ETH_MII_TXD1_ETH_RMII_TXD1>,
- <STM32F429_PC2_FUNC_ETH_MII_TXD2>,
- <STM32F429_PB8_FUNC_ETH_MII_TXD3>,
- <STM32F429_PC3_FUNC_ETH_MII_TX_CLK>,
- <STM32F429_PG11_FUNC_ETH_MII_TX_EN_ETH_RMII_TX_EN>,
- <STM32F429_PA2_FUNC_ETH_MDIO>,
- <STM32F429_PC1_FUNC_ETH_MDC>,
- <STM32F429_PA1_FUNC_ETH_MII_RX_CLK_ETH_RMII_REF_CLK>,
- <STM32F429_PA7_FUNC_ETH_MII_RX_DV_ETH_RMII_CRS_DV>,
- <STM32F429_PC4_FUNC_ETH_MII_RXD0_ETH_RMII_RXD0>,
- <STM32F429_PC5_FUNC_ETH_MII_RXD1_ETH_RMII_RXD1>,
- <STM32F429_PH6_FUNC_ETH_MII_RXD2>,
- <STM32F429_PH7_FUNC_ETH_MII_RXD3>;
- slew-rate = <2>;
- };
- };
-
- adc3_in8_pin: adc@200 {
- pins {
- pinmux = <STM32F429_PF10_FUNC_ANALOG>;
- };
- };
-
- pwm1_pins: pwm@1 {
- pins {
- pinmux = <STM32F429_PA8_FUNC_TIM1_CH1>,
- <STM32F429_PB13_FUNC_TIM1_CH1N>,
- <STM32F429_PB12_FUNC_TIM1_BKIN>;
- };
- };
-
- pwm3_pins: pwm@3 {
- pins {
- pinmux = <STM32F429_PB4_FUNC_TIM3_CH1>,
- <STM32F429_PB5_FUNC_TIM3_CH2>;
- };
- };
-
- i2c1_pins: i2c1@0 {
- pins {
- pinmux = <STM32F429_PB9_FUNC_I2C1_SDA>,
- <STM32F429_PB6_FUNC_I2C1_SCL>;
- bias-disable;
- drive-open-drain;
- slew-rate = <3>;
- };
- };
-
- ltdc_pins: ltdc@0 {
- pins {
- pinmux = <STM32F429_PI12_FUNC_LCD_HSYNC>,
- <STM32F429_PI13_FUNC_LCD_VSYNC>,
- <STM32F429_PI14_FUNC_LCD_CLK>,
- <STM32F429_PI15_FUNC_LCD_R0>,
- <STM32F429_PJ0_FUNC_LCD_R1>,
- <STM32F429_PJ1_FUNC_LCD_R2>,
- <STM32F429_PJ2_FUNC_LCD_R3>,
- <STM32F429_PJ3_FUNC_LCD_R4>,
- <STM32F429_PJ4_FUNC_LCD_R5>,
- <STM32F429_PJ5_FUNC_LCD_R6>,
- <STM32F429_PJ6_FUNC_LCD_R7>,
- <STM32F429_PJ7_FUNC_LCD_G0>,
- <STM32F429_PJ8_FUNC_LCD_G1>,
- <STM32F429_PJ9_FUNC_LCD_G2>,
- <STM32F429_PJ10_FUNC_LCD_G3>,
- <STM32F429_PJ11_FUNC_LCD_G4>,
- <STM32F429_PJ12_FUNC_LCD_B0>,
- <STM32F429_PJ13_FUNC_LCD_B1>,
- <STM32F429_PJ14_FUNC_LCD_B2>,
- <STM32F429_PJ15_FUNC_LCD_B3>,
- <STM32F429_PK0_FUNC_LCD_G5>,
- <STM32F429_PK1_FUNC_LCD_G6>,
- <STM32F429_PK2_FUNC_LCD_G7>,
- <STM32F429_PK3_FUNC_LCD_B4>,
- <STM32F429_PK4_FUNC_LCD_B5>,
- <STM32F429_PK5_FUNC_LCD_B6>,
- <STM32F429_PK6_FUNC_LCD_B7>,
- <STM32F429_PK7_FUNC_LCD_DE>;
- slew-rate = <2>;
- };
- };
-
- dcmi_pins: dcmi@0 {
- pins {
- pinmux = <STM32F429_PA4_FUNC_DCMI_HSYNC>,
- <STM32F429_PB7_FUNC_DCMI_VSYNC>,
- <STM32F429_PA6_FUNC_DCMI_PIXCLK>,
- <STM32F429_PC6_FUNC_DCMI_D0>,
- <STM32F429_PC7_FUNC_DCMI_D1>,
- <STM32F429_PC8_FUNC_DCMI_D2>,
- <STM32F429_PC9_FUNC_DCMI_D3>,
- <STM32F429_PC11_FUNC_DCMI_D4>,
- <STM32F429_PD3_FUNC_DCMI_D5>,
- <STM32F429_PB8_FUNC_DCMI_D6>,
- <STM32F429_PE6_FUNC_DCMI_D7>,
- <STM32F429_PC10_FUNC_DCMI_D8>,
- <STM32F429_PC12_FUNC_DCMI_D9>,
- <STM32F429_PD6_FUNC_DCMI_D10>,
- <STM32F429_PD2_FUNC_DCMI_D11>;
- bias-disable;
- drive-push-pull;
- slew-rate = <3>;
- };
- };
- };
-
crc: crc@40023000 {
compatible = "st,stm32f4-crc";
reg = <0x40023000 0x400>;
diff --git a/arch/arm/boot/dts/stm32f469-disco.dts b/arch/arm/boot/dts/stm32f469-disco.dts
index 75470c34b92c..c18acbe4cf4e 100644
--- a/arch/arm/boot/dts/stm32f469-disco.dts
+++ b/arch/arm/boot/dts/stm32f469-disco.dts
@@ -47,13 +47,14 @@
/dts-v1/;
#include "stm32f429.dtsi"
+#include "stm32f469-pinctrl.dtsi"
/ {
model = "STMicroelectronics STM32F469i-DISCO board";
compatible = "st,stm32f469i-disco", "st,stm32f469";
chosen {
- bootargs = "root=/dev/ram rdinit=/linuxrc";
+ bootargs = "root=/dev/ram";
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm/boot/dts/stm32f469-pinctrl.dtsi b/arch/arm/boot/dts/stm32f469-pinctrl.dtsi
new file mode 100644
index 000000000000..fff542662eea
--- /dev/null
+++ b/arch/arm/boot/dts/stm32f469-pinctrl.dtsi
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2017 - Alexandre Torgue <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "stm32f4-pinctrl.dtsi"
+
+/ {
+ soc {
+ pinctrl: pin-controller {
+ compatible = "st,stm32f469-pinctrl";
+
+ gpioa: gpio@40020000 {
+ gpio-ranges = <&pinctrl 0 0 16>;
+ };
+
+ gpiob: gpio@40020400 {
+ gpio-ranges = <&pinctrl 0 16 16>;
+ };
+
+ gpioc: gpio@40020800 {
+ gpio-ranges = <&pinctrl 0 32 16>;
+ };
+
+ gpiod: gpio@40020c00 {
+ gpio-ranges = <&pinctrl 0 48 16>;
+ };
+
+ gpioe: gpio@40021000 {
+ gpio-ranges = <&pinctrl 0 64 16>;
+ };
+
+ gpiof: gpio@40021400 {
+ gpio-ranges = <&pinctrl 0 80 16>;
+ };
+
+ gpiog: gpio@40021800 {
+ gpio-ranges = <&pinctrl 0 96 16>;
+ };
+
+ gpioh: gpio@40021c00 {
+ gpio-ranges = <&pinctrl 0 112 16>;
+ };
+
+ gpioi: gpio@40022000 {
+ gpio-ranges = <&pinctrl 0 128 16>;
+ };
+
+ gpioj: gpio@40022400 {
+ gpio-ranges = <&pinctrl 0 144 6>,
+ <&pinctrl 12 156 4>;
+ };
+
+ gpiok: gpio@40022800 {
+ gpio-ranges = <&pinctrl 3 163 5>;
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/stm32f746.dtsi b/arch/arm/boot/dts/stm32f746.dtsi
index 4506eb97a4ab..5633860037d2 100644
--- a/arch/arm/boot/dts/stm32f746.dtsi
+++ b/arch/arm/boot/dts/stm32f746.dtsi
@@ -167,6 +167,15 @@
status = "disabled";
};
+ cec: cec@40006c00 {
+ compatible = "st,stm32-cec";
+ reg = <0x40006C00 0x400>;
+ interrupts = <94>;
+ clocks = <&rcc 0 STM32F7_APB1_CLOCK(CEC)>, <&rcc 1 CLK_HDMI_CEC>;
+ clock-names = "cec", "hdmi-cec";
+ status = "disabled";
+ };
+
usart7: serial@40007800 {
compatible = "st,stm32f7-usart", "st,stm32f7-uart";
reg = <0x40007800 0x400>;
@@ -336,6 +345,15 @@
st,bank-name = "GPIOK";
};
+ cec_pins_a: cec@0 {
+ pins {
+ pinmux = <STM32F746_PA15_FUNC_HDMI_CEC>;
+ slew-rate = <0>;
+ drive-open-drain;
+ bias-disable;
+ };
+ };
+
usart1_pins_a: usart1@0 {
pins1 {
pinmux = <STM32F746_PA9_FUNC_USART1_TX>;
@@ -380,6 +398,39 @@
assigned-clocks = <&rcc 1 CLK_HSE_RTC>;
assigned-clock-rates = <1000000>;
};
+
+ dma1: dma@40026000 {
+ compatible = "st,stm32-dma";
+ reg = <0x40026000 0x400>;
+ interrupts = <11>,
+ <12>,
+ <13>,
+ <14>,
+ <15>,
+ <16>,
+ <17>,
+ <47>;
+ clocks = <&rcc 0 STM32F7_AHB1_CLOCK(DMA1)>;
+ #dma-cells = <4>;
+ status = "disabled";
+ };
+
+ dma2: dma@40026400 {
+ compatible = "st,stm32-dma";
+ reg = <0x40026400 0x400>;
+ interrupts = <56>,
+ <57>,
+ <58>,
+ <59>,
+ <60>,
+ <68>,
+ <69>,
+ <70>;
+ clocks = <&rcc 0 STM32F7_AHB1_CLOCK(DMA2)>;
+ #dma-cells = <4>;
+ st,mem2mem;
+ status = "disabled";
+ };
};
};
diff --git a/arch/arm/boot/dts/stm32f769-disco.dts b/arch/arm/boot/dts/stm32f769-disco.dts
index 166728aeb166..4463ca13a740 100644
--- a/arch/arm/boot/dts/stm32f769-disco.dts
+++ b/arch/arm/boot/dts/stm32f769-disco.dts
@@ -63,6 +63,12 @@
};
+&cec {
+ pinctrl-0 = <&cec_pins_a>;
+ pinctrl-names = "default";
+ status = "okay";
+};
+
&clk_hse {
clock-frequency = <25000000>;
};
diff --git a/arch/arm/boot/dts/stm32h743.dtsi b/arch/arm/boot/dts/stm32h743.dtsi
index 36a99db0a3b4..58ec2275181e 100644
--- a/arch/arm/boot/dts/stm32h743.dtsi
+++ b/arch/arm/boot/dts/stm32h743.dtsi
@@ -59,6 +59,45 @@
};
soc {
+ timer5: timer@40000c00 {
+ compatible = "st,stm32-timer";
+ reg = <0x40000c00 0x400>;
+ interrupts = <50>;
+ clocks = <&timer_clk>;
+ };
+
+ usart2: serial@40004400 {
+ compatible = "st,stm32f7-usart", "st,stm32f7-uart";
+ reg = <0x40004400 0x400>;
+ interrupts = <38>;
+ status = "disabled";
+ clocks = <&timer_clk>;
+ };
+
+ dac: dac@40007400 {
+ compatible = "st,stm32h7-dac-core";
+ reg = <0x40007400 0x400>;
+ clocks = <&timer_clk>;
+ clock-names = "pclk";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ dac1: dac@1 {
+ compatible = "st,stm32-dac";
+ #io-channels-cells = <1>;
+ reg = <1>;
+ status = "disabled";
+ };
+
+ dac2: dac@2 {
+ compatible = "st,stm32-dac";
+ #io-channels-cells = <1>;
+ reg = <2>;
+ status = "disabled";
+ };
+ };
+
usart1: serial@40011000 {
compatible = "st,stm32f7-usart", "st,stm32f7-uart";
reg = <0x40011000 0x400>;
@@ -68,19 +107,91 @@
};
- usart2: serial@40004400 {
- compatible = "st,stm32f7-usart", "st,stm32f7-uart";
- reg = <0x40004400 0x400>;
- interrupts = <38>;
+ dma1: dma@40020000 {
+ compatible = "st,stm32-dma";
+ reg = <0x40020000 0x400>;
+ interrupts = <11>,
+ <12>,
+ <13>,
+ <14>,
+ <15>,
+ <16>,
+ <17>,
+ <47>;
+ clocks = <&timer_clk>;
+ #dma-cells = <4>;
+ st,mem2mem;
status = "disabled";
+ };
+
+ dma2: dma@40020400 {
+ compatible = "st,stm32-dma";
+ reg = <0x40020400 0x400>;
+ interrupts = <56>,
+ <57>,
+ <58>,
+ <59>,
+ <60>,
+ <68>,
+ <69>,
+ <70>;
clocks = <&timer_clk>;
+ #dma-cells = <4>;
+ st,mem2mem;
+ status = "disabled";
};
- timer5: timer@40000c00 {
- compatible = "st,stm32-timer";
- reg = <0x40000c00 0x400>;
- interrupts = <50>;
+ adc_12: adc@40022000 {
+ compatible = "st,stm32h7-adc-core";
+ reg = <0x40022000 0x400>;
+ interrupts = <18>;
+ clocks = <&timer_clk>;
+ clock-names = "bus";
+ interrupt-controller;
+ #interrupt-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ adc1: adc@0 {
+ compatible = "st,stm32h7-adc";
+ #io-channel-cells = <1>;
+ reg = <0x0>;
+ interrupt-parent = <&adc_12>;
+ interrupts = <0>;
+ status = "disabled";
+ };
+
+ adc2: adc@100 {
+ compatible = "st,stm32h7-adc";
+ #io-channel-cells = <1>;
+ reg = <0x100>;
+ interrupt-parent = <&adc_12>;
+ interrupts = <1>;
+ status = "disabled";
+ };
+ };
+
+ adc_3: adc@58026000 {
+ compatible = "st,stm32h7-adc-core";
+ reg = <0x58026000 0x400>;
+ interrupts = <127>;
clocks = <&timer_clk>;
+ clock-names = "bus";
+ interrupt-controller;
+ #interrupt-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ adc3: adc@0 {
+ compatible = "st,stm32h7-adc";
+ #io-channel-cells = <1>;
+ reg = <0x0>;
+ interrupt-parent = <&adc_3>;
+ interrupts = <0>;
+ status = "disabled";
+ };
};
};
};
diff --git a/arch/arm/boot/dts/stm32h743i-eval.dts b/arch/arm/boot/dts/stm32h743i-eval.dts
index c6effbb36e4a..6c07786e7ddb 100644
--- a/arch/arm/boot/dts/stm32h743i-eval.dts
+++ b/arch/arm/boot/dts/stm32h743i-eval.dts
@@ -60,6 +60,24 @@
aliases {
serial0 = &usart1;
};
+
+ vdda: regulator-vdda {
+ compatible = "regulator-fixed";
+ regulator-name = "vdda";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ };
+};
+
+&adc_12 {
+ vref-supply = <&vdda>;
+ status = "okay";
+ adc1: adc@0 {
+ /* potentiometer */
+ st,adc-channels = <0>;
+ status = "okay";
+ };
};
&clk_hse {
diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi
index aebc3f9dc7b6..b147cb0dc14b 100644
--- a/arch/arm/boot/dts/sun6i-a31.dtsi
+++ b/arch/arm/boot/dts/sun6i-a31.dtsi
@@ -1155,11 +1155,11 @@
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
};
- nmi_intc: interrupt-controller@01f00c0c {
- compatible = "allwinner,sun6i-a31-sc-nmi";
+ nmi_intc: interrupt-controller@1f00c00 {
+ compatible = "allwinner,sun6i-a31-r-intc";
interrupt-controller;
#interrupt-cells = <2>;
- reg = <0x01f00c0c 0x38>;
+ reg = <0x01f00c00 0x400>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
};
diff --git a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
index bb510187602c..852a0aa24dce 100644
--- a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
+++ b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts
@@ -271,6 +271,10 @@
status = "okay";
};
+&battery_power_supply {
+ status = "okay";
+};
+
&reg_dcdc2 {
regulator-always-on;
regulator-min-microvolt = <1000000>;
diff --git a/arch/arm/boot/dts/sun8i-a23-a33.dtsi b/arch/arm/boot/dts/sun8i-a23-a33.dtsi
index a8b978d0f35b..ea50dda75adc 100644
--- a/arch/arm/boot/dts/sun8i-a23-a33.dtsi
+++ b/arch/arm/boot/dts/sun8i-a23-a33.dtsi
@@ -519,11 +519,11 @@
#clock-cells = <1>;
};
- nmi_intc: interrupt-controller@01f00c0c {
- compatible = "allwinner,sun6i-a31-sc-nmi";
+ nmi_intc: interrupt-controller@1f00c00 {
+ compatible = "allwinner,sun6i-a31-r-intc";
interrupt-controller;
#interrupt-cells = <2>;
- reg = <0x01f00c0c 0x38>;
+ reg = <0x01f00c00 0x400>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
};
diff --git a/arch/arm/boot/dts/sun8i-a83t-allwinner-h8homlet-v2.dts b/arch/arm/boot/dts/sun8i-a83t-allwinner-h8homlet-v2.dts
index aecdeeb368ed..1f0d60afb25b 100644
--- a/arch/arm/boot/dts/sun8i-a83t-allwinner-h8homlet-v2.dts
+++ b/arch/arm/boot/dts/sun8i-a83t-allwinner-h8homlet-v2.dts
@@ -43,6 +43,7 @@
/dts-v1/;
#include "sun8i-a83t.dtsi"
+#include "sunxi-common-regulators.dtsi"
/ {
model = "Allwinner A83T H8Homlet Proto Dev Board v2.0";
@@ -57,8 +58,92 @@
};
};
+&ehci0 {
+ status = "okay";
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&reg_vcc3v0>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */
+ bus-width = <4>;
+ cd-inverted;
+ status = "okay";
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_8bit_emmc_pins>;
+ vmmc-supply = <&reg_vcc3v0>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
+};
+
+&reg_usb0_vbus {
+ gpio = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+ status = "okay";
+};
+
+&reg_usb1_vbus {
+ gpio = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp81x: pmic@3a3 {
+ compatible = "x-powers,axp818", "x-powers,axp813";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+
+ ac100: codec@e89 {
+ compatible = "x-powers,ac100";
+ reg = <0xe89>;
+
+ ac100_codec: codec {
+ compatible = "x-powers,ac100-codec";
+ interrupt-parent = <&r_pio>;
+ interrupts = <0 11 IRQ_TYPE_LEVEL_LOW>; /* PL11 */
+ #clock-cells = <0>;
+ clock-output-names = "4M_adda";
+ };
+
+ ac100_rtc: rtc {
+ compatible = "x-powers,ac100-rtc";
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&ac100_codec>;
+ #clock-cells = <1>;
+ clock-output-names = "cko1_rtc",
+ "cko2_rtc",
+ "cko3_rtc";
+ };
+ };
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
status = "okay";
};
+
+&usbphy {
+ usb0_vbus-supply = <&reg_usb0_vbus>;
+ usb1_vbus-supply = <&reg_usb1_vbus>;
+ status = "okay";
+};
+
+&usb_otg {
+ dr_mode = "host";
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts
new file mode 100644
index 000000000000..2bafd7e99ef7
--- /dev/null
+++ b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2017 Chen-Yu Tsai
+ *
+ * Chen-Yu Tsai <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "sun8i-a83t.dtsi"
+#include "sunxi-common-regulators.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "Banana Pi BPI-M3";
+ compatible = "sinovoip,bpi-m3", "allwinner,sun8i-a83t";
+
+ aliases {
+ serial0 = &uart0;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+};
+
+&ehci0 {
+ /* Terminus Tech FE 1.1s 4-port USB 2.0 hub here */
+ status = "okay";
+
+ /* TODO GL830 USB-to-SATA bridge downstream w/ GPIO power controls */
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&reg_vcc3v3>;
+ bus-width = <4>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */
+ cd-inverted;
+ status = "okay";
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_8bit_emmc_pins>;
+ vmmc-supply = <&reg_vcc3v3>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp81x: pmic@3a3 {
+ compatible = "x-powers,axp813";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+
+ ac100: codec@e89 {
+ compatible = "x-powers,ac100";
+ reg = <0xe89>;
+
+ ac100_codec: codec {
+ compatible = "x-powers,ac100-codec";
+ interrupt-parent = <&r_pio>;
+ interrupts = <0 11 IRQ_TYPE_LEVEL_LOW>; /* PL11 */
+ #clock-cells = <0>;
+ clock-output-names = "4M_adda";
+ };
+
+ ac100_rtc: rtc {
+ compatible = "x-powers,ac100-rtc";
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&ac100_codec>;
+ #clock-cells = <1>;
+ clock-output-names = "cko1_rtc",
+ "cko2_rtc",
+ "cko3_rtc";
+ };
+ };
+};
+
+&reg_usb1_vbus {
+ gpio = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
+ status = "okay";
+};
+
+&reg_vcc3v0 {
+ status = "disabled";
+};
+
+&reg_vcc5v0 {
+ status = "disabled";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pb_pins>;
+ status = "okay";
+};
+
+&usbphy {
+ usb1_vbus-supply = <&reg_usb1_vbus>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
index cff33454fc24..716a205c6dbb 100644
--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
@@ -44,6 +44,7 @@
/dts-v1/;
#include "sun8i-a83t.dtsi"
+#include "sunxi-common-regulators.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -83,6 +84,17 @@
};
};
+ usb-hub {
+ /* I2C is not connected */
+ compatible = "smsc,usb3503";
+ initial-mode = <1>; /* initialize in HUB mode */
+ disabled-ports = <1>;
+ intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
+ reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */
+ connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */
+ refclk-frequency = <19200000>;
+ };
+
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "On-board SPDIF";
@@ -102,6 +114,89 @@
};
};
+&ehci0 {
+ /* GL830 USB-to-SATA bridge here */
+ status = "okay";
+};
+
+&ehci1 {
+ /* USB3503 HSIC USB 2.0 hub here */
+ status = "okay";
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&reg_vcc3v3>;
+ bus-width = <4>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */
+ cd-inverted;
+ status = "okay";
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_8bit_emmc_pins>;
+ vmmc-supply = <&reg_vcc3v3>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp81x: pmic@3a3 {
+ compatible = "x-powers,axp818", "x-powers,axp813";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+
+ ac100: codec@e89 {
+ compatible = "x-powers,ac100";
+ reg = <0xe89>;
+
+ ac100_codec: codec {
+ compatible = "x-powers,ac100-codec";
+ interrupt-parent = <&r_pio>;
+ interrupts = <0 11 IRQ_TYPE_LEVEL_LOW>; /* PL11 */
+ #clock-cells = <0>;
+ clock-output-names = "4M_adda";
+ };
+
+ ac100_rtc: rtc {
+ compatible = "x-powers,ac100-rtc";
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&ac100_codec>;
+ #clock-cells = <1>;
+ clock-output-names = "cko1_rtc",
+ "cko2_rtc",
+ "cko3_rtc";
+ };
+ };
+};
+
+&reg_usb1_vbus {
+ gpio = <&pio 3 29 GPIO_ACTIVE_HIGH>; /* PD29 */
+ status = "okay";
+};
+
+&reg_usb2_vbus {
+ gpio = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+ status = "okay";
+};
+
+&reg_vcc3v0 {
+ status = "disabled";
+};
+
+&reg_vcc5v0 {
+ status = "disabled";
+};
+
&spdif {
status = "okay";
};
@@ -111,3 +206,9 @@
pinctrl-0 = <&uart0_pb_pins>;
status = "okay";
};
+
+&usbphy {
+ usb1_vbus-supply = <&reg_usb1_vbus>;
+ usb2_vbus-supply = <&reg_usb2_vbus>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/sun8i-a83t.dtsi b/arch/arm/boot/dts/sun8i-a83t.dtsi
index 19a8f4fcfab5..f996bd343e50 100644
--- a/arch/arm/boot/dts/sun8i-a83t.dtsi
+++ b/arch/arm/boot/dts/sun8i-a83t.dtsi
@@ -47,6 +47,7 @@
#include <dt-bindings/clock/sun8i-a83t-ccu.h>
#include <dt-bindings/clock/sun8i-r-ccu.h>
#include <dt-bindings/reset/sun8i-a83t-ccu.h>
+#include <dt-bindings/reset/sun8i-r-ccu.h>
/ {
interrupt-parent = <&gic>;
@@ -182,6 +183,141 @@
#dma-cells = <1>;
};
+ mmc0: mmc@1c0f000 {
+ compatible = "allwinner,sun8i-a83t-mmc",
+ "allwinner,sun7i-a20-mmc";
+ reg = <0x01c0f000 0x1000>;
+ clocks = <&ccu CLK_BUS_MMC0>,
+ <&ccu CLK_MMC0>,
+ <&ccu CLK_MMC0_OUTPUT>,
+ <&ccu CLK_MMC0_SAMPLE>;
+ clock-names = "ahb",
+ "mmc",
+ "output",
+ "sample";
+ resets = <&ccu RST_BUS_MMC0>;
+ reset-names = "ahb";
+ interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ mmc1: mmc@1c10000 {
+ compatible = "allwinner,sun8i-a83t-mmc",
+ "allwinner,sun7i-a20-mmc";
+ reg = <0x01c10000 0x1000>;
+ clocks = <&ccu CLK_BUS_MMC1>,
+ <&ccu CLK_MMC1>,
+ <&ccu CLK_MMC1_OUTPUT>,
+ <&ccu CLK_MMC1_SAMPLE>;
+ clock-names = "ahb",
+ "mmc",
+ "output",
+ "sample";
+ resets = <&ccu RST_BUS_MMC1>;
+ reset-names = "ahb";
+ interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ mmc2: mmc@1c11000 {
+ compatible = "allwinner,sun8i-a83t-emmc";
+ reg = <0x01c11000 0x1000>;
+ clocks = <&ccu CLK_BUS_MMC2>,
+ <&ccu CLK_MMC2>,
+ <&ccu CLK_MMC2_OUTPUT>,
+ <&ccu CLK_MMC2_SAMPLE>;
+ clock-names = "ahb",
+ "mmc",
+ "output",
+ "sample";
+ resets = <&ccu RST_BUS_MMC2>;
+ reset-names = "ahb";
+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ usb_otg: usb@01c19000 {
+ compatible = "allwinner,sun8i-a83t-musb",
+ "allwinner,sun8i-a33-musb";
+ reg = <0x01c19000 0x0400>;
+ clocks = <&ccu CLK_BUS_OTG>;
+ resets = <&ccu RST_BUS_OTG>;
+ interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "mc";
+ phys = <&usbphy 0>;
+ phy-names = "usb";
+ extcon = <&usbphy 0>;
+ status = "disabled";
+ };
+
+ usbphy: phy@1c19400 {
+ compatible = "allwinner,sun8i-a83t-usb-phy";
+ reg = <0x01c19400 0x10>,
+ <0x01c1a800 0x14>,
+ <0x01c1b800 0x14>;
+ reg-names = "phy_ctrl",
+ "pmu1",
+ "pmu2";
+ clocks = <&ccu CLK_USB_PHY0>,
+ <&ccu CLK_USB_PHY1>,
+ <&ccu CLK_USB_HSIC>,
+ <&ccu CLK_USB_HSIC_12M>;
+ clock-names = "usb0_phy",
+ "usb1_phy",
+ "usb2_phy",
+ "usb2_hsic_12M";
+ resets = <&ccu RST_USB_PHY0>,
+ <&ccu RST_USB_PHY1>,
+ <&ccu RST_USB_HSIC>;
+ reset-names = "usb0_reset",
+ "usb1_reset",
+ "usb2_reset";
+ status = "disabled";
+ #phy-cells = <1>;
+ };
+
+ ehci0: usb@1c1a000 {
+ compatible = "allwinner,sun8i-a83t-ehci",
+ "generic-ehci";
+ reg = <0x01c1a000 0x100>;
+ interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_EHCI0>;
+ resets = <&ccu RST_BUS_EHCI0>;
+ phys = <&usbphy 1>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ ohci0: usb@1c1a400 {
+ compatible = "allwinner,sun8i-a83t-ohci",
+ "generic-ohci";
+ reg = <0x01c1a400 0x100>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_OHCI0>, <&ccu CLK_USB_OHCI0>;
+ resets = <&ccu RST_BUS_OHCI0>;
+ phys = <&usbphy 1>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ ehci1: usb@1c1b000 {
+ compatible = "allwinner,sun8i-a83t-ehci",
+ "generic-ehci";
+ reg = <0x01c1b000 0x100>;
+ interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_EHCI1>;
+ resets = <&ccu RST_BUS_EHCI1>;
+ phys = <&usbphy 2>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
ccu: clock@1c20000 {
compatible = "allwinner,sun8i-a83t-ccu";
reg = <0x01c20000 0x400>;
@@ -212,6 +348,15 @@
bias-pull-up;
};
+ mmc2_8bit_emmc_pins: mmc2-8bit-emmc-pins {
+ pins = "PC5", "PC6", "PC8", "PC9",
+ "PC10", "PC11", "PC12", "PC13",
+ "PC14", "PC15", "PC16";
+ function = "mmc2";
+ drive-strength = <30>;
+ bias-pull-up;
+ };
+
spdif_tx_pin: spdif-tx-pin {
pins = "PE18";
function = "spdif";
@@ -281,6 +426,15 @@
interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_HIGH)>;
};
+ r_intc: interrupt-controller@1f00c00 {
+ compatible = "allwinner,sun8i-a83t-r-intc",
+ "allwinner,sun6i-a31-r-intc";
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x01f00c00 0x400>;
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
r_ccu: clock@1f01400 {
compatible = "allwinner,sun8i-a83t-r-ccu";
reg = <0x01f01400 0x400>;
@@ -302,6 +456,28 @@
#gpio-cells = <3>;
interrupt-controller;
#interrupt-cells = <3>;
+
+ r_rsb_pins: r-rsb-pins {
+ pins = "PL0", "PL1";
+ function = "s_rsb";
+ drive-strength = <20>;
+ bias-pull-up;
+ };
+ };
+
+ r_rsb: rsb@1f03400 {
+ compatible = "allwinner,sun8i-a83t-rsb",
+ "allwinner,sun8i-a23-rsb";
+ reg = <0x01f03400 0x400>;
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&r_ccu CLK_APB0_RSB>;
+ clock-frequency = <3000000>;
+ resets = <&r_ccu RST_APB0_RSB>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&r_rsb_pins>;
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
};
};
};
diff --git a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
index e7fae65eb5d3..10da56e86ab8 100644
--- a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
+++ b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
@@ -100,6 +100,10 @@
};
};
+&ehci0 {
+ status = "okay";
+};
+
&ehci1 {
status = "okay";
};
@@ -147,10 +151,19 @@
status = "okay";
};
+&ohci0 {
+ status = "okay";
+};
+
&ohci1 {
status = "okay";
};
+&reg_usb0_vbus {
+ gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+ status = "okay";
+};
+
&spdif {
pinctrl-names = "default";
pinctrl-0 = <&spdif_tx_pins_a>;
@@ -163,7 +176,14 @@
status = "okay";
};
+&usb_otg {
+ dr_mode = "otg";
+ status = "okay";
+};
+
&usbphy {
- /* USB VBUS is on as long as VCC-IO is on */
+ /* USB VBUS is always on except for the OTG port */
status = "okay";
+ usb0_id_det-gpios = <&pio 0 7 GPIO_ACTIVE_HIGH>; /* PA07 */
+ usb0_vbus-supply = <&reg_usb0_vbus>;
};
diff --git a/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts b/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts
new file mode 100644
index 000000000000..eaf09666720d
--- /dev/null
+++ b/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts
@@ -0,0 +1,321 @@
+/*
+ * Copyright (c) 2017 Free Electrons <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "sun8i-a33.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "BananaPi M2 Magic";
+ compatible = "sinovoip,bananapi-m2m", "allwinner,sun8i-a33";
+
+ aliases {
+ i2c0 = &i2c0;
+ i2c1 = &i2c1;
+ i2c2 = &i2c2;
+ serial0 = &uart0;
+ serial1 = &uart1;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ blue {
+ label = "bpi-m2m:blue:usr";
+ gpios = <&pio 2 7 GPIO_ACTIVE_LOW>;
+ };
+
+ green {
+ label = "bpi-m2m:green:usr";
+ gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>;
+ };
+
+ red {
+ label = "bpi-m2m:red:power";
+ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
+ default-state = "on";
+ };
+ };
+
+ reg_vcc5v0: vcc5v0 {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc5v0";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ };
+
+ wifi_pwrseq: wifi_pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ reset-gpios = <&r_pio 0 6 GPIO_ACTIVE_LOW>; /* PL06 */
+ };
+};
+
+&codec {
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <&reg_dcdc3>;
+};
+
+&cpu0_opp_table {
+ opp@1104000000 {
+ opp-hz = /bits/ 64 <1104000000>;
+ opp-microvolt = <1320000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp@1200000000 {
+ opp-hz = /bits/ 64 <1200000000>;
+ opp-microvolt = <1320000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+};
+
+&dai {
+ status = "okay";
+};
+
+&ehci0 {
+ status = "okay";
+};
+
+/* This is the i2c bus exposed on the DSI connector for the touch panel */
+&i2c0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c0_pins_a>;
+ status = "disabled";
+};
+
+/* This is the i2c bus exposed on the GPIO header */
+&i2c1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins_a>;
+ status = "disabled";
+};
+
+/* This is the i2c bus exposed on the CSI connector to control the sensor */
+&i2c2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c2_pins_a>;
+ status = "disabled";
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins_a>;
+ vmmc-supply = <&reg_dcdc1>;
+ bus-width = <4>;
+ cd-gpios = <&pio 1 4 GPIO_ACTIVE_HIGH>; /* PB4 */
+ cd-inverted;
+ status = "okay";
+};
+
+&mmc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc1_pins_a>;
+ vmmc-supply = <&reg_aldo1>;
+ mmc-pwrseq = <&wifi_pwrseq>;
+ bus-width = <4>;
+ non-removable;
+ status = "okay";
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_8bit_pins>;
+ vmmc-supply = <&reg_dcdc1>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp22x: pmic@3a3 {
+ compatible = "x-powers,axp223";
+ reg = <0x3a3>;
+ interrupt-parent = <&nmi_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ eldoin-supply = <&reg_dcdc1>;
+ x-powers,drive-vbus-en;
+ };
+};
+
+#include "axp223.dtsi"
+
+&ac_power_supply {
+ status = "okay";
+};
+
+&reg_aldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-io";
+};
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <2500000>;
+ regulator-max-microvolt = <2500000>;
+ regulator-name = "vdd-dll";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "avcc";
+};
+
+&reg_dc1sw {
+ regulator-name = "vcc-lcd";
+};
+
+&reg_dc5ldo {
+ regulator-always-on;
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1400000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-3v0";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1400000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_dcdc3 {
+ regulator-always-on;
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <1400000>;
+ regulator-name = "vdd-cpu";
+};
+
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-name = "vcc-dram";
+};
+
+/*
+ * Our WiFi chip needs both DLDO1 and DLDO2 to be powered at the same
+ * time, with the two being in sync. Since this is not really
+ * supported right now, just use the two as always on, and we will fix
+ * it later.
+ */
+&reg_dldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi0";
+};
+
+&reg_dldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi1";
+};
+
+&reg_drivevbus {
+ regulator-name = "usb0-vbus";
+ status = "okay";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
+&sound {
+ status = "okay";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins_b>;
+ status = "okay";
+};
+
+&uart1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart1_pins_a>, <&uart1_pins_cts_rts_a>;
+ status = "okay";
+};
+
+&usb_otg {
+ dr_mode = "otg";
+ status = "okay";
+};
+
+&usb_power_supply {
+ status = "okay";
+};
+
+&usbphy {
+ usb0_id_det-gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
+ usb0_vbus_power-supply = <&usb_power_supply>;
+ usb0_vbus-supply = <&reg_drivevbus>;
+ usb1_vbus-supply = <&reg_vcc5v0>;
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/tegra114-dalmore.dts b/arch/arm/boot/dts/tegra114-dalmore.dts
index 1444fbd543e7..5af4dd321952 100644
--- a/arch/arm/boot/dts/tegra114-dalmore.dts
+++ b/arch/arm/boot/dts/tegra114-dalmore.dts
@@ -1122,6 +1122,16 @@
non-removable;
};
+ usb@7d000000 {
+ compatible = "nvidia,tegra114-udc";
+ status = "okay";
+ dr_mode = "peripheral";
+ };
+
+ usb-phy@7d000000 {
+ status = "okay";
+ };
+
usb@7d008000 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts
index 7bacb2954f58..61873d642a45 100644
--- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts
+++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts
@@ -1722,7 +1722,7 @@
lanes {
usb2-0 {
- nvidia,function = "xusb";
+ nvidia,function = "snps";
status = "okay";
};
@@ -1829,6 +1829,16 @@
};
};
+ usb@7d000000 {
+ compatible = "nvidia,tegra124-udc";
+ status = "okay";
+ dr_mode = "peripheral";
+ };
+
+ usb-phy@7d000000 {
+ status = "okay";
+ };
+
/* mini-PCIe USB */
usb@7d004000 {
status = "okay";
diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi
index 1b10b14a6abd..8baf00b89efb 100644
--- a/arch/arm/boot/dts/tegra124.dtsi
+++ b/arch/arm/boot/dts/tegra124.dtsi
@@ -87,6 +87,7 @@
clocks = <&tegra_car TEGRA124_CLK_HOST1X>;
resets = <&tegra_car 28>;
reset-names = "host1x";
+ iommus = <&mc TEGRA_SWGROUP_HC>;
#address-cells = <2>;
#size-cells = <2>;
diff --git a/arch/arm/boot/dts/tegra20-paz00.dts b/arch/arm/boot/dts/tegra20-paz00.dts
index b4bfa5586c23..bfa9421fcf94 100644
--- a/arch/arm/boot/dts/tegra20-paz00.dts
+++ b/arch/arm/boot/dts/tegra20-paz00.dts
@@ -452,7 +452,9 @@
};
usb@c5000000 {
+ compatible = "nvidia,tegra20-udc";
status = "okay";
+ dr_mode = "peripheral";
};
usb-phy@c5000000 {
diff --git a/arch/arm/boot/dts/tegra30-beaver.dts b/arch/arm/boot/dts/tegra30-beaver.dts
index 4f41b18d9547..3e104ddeb220 100644
--- a/arch/arm/boot/dts/tegra30-beaver.dts
+++ b/arch/arm/boot/dts/tegra30-beaver.dts
@@ -1927,6 +1927,16 @@
non-removable;
};
+ usb@7d000000 {
+ compatible = "nvidia,tegra30-udc";
+ status = "okay";
+ dr_mode = "peripheral";
+ };
+
+ usb-phy@7d000000 {
+ status = "okay";
+ };
+
usb@7d004000 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/tps65217.dtsi b/arch/arm/boot/dts/tps65217.dtsi
index 02de56b55823..399baaa0a2ab 100644
--- a/arch/arm/boot/dts/tps65217.dtsi
+++ b/arch/arm/boot/dts/tps65217.dtsi
@@ -18,11 +18,14 @@
charger {
compatible = "ti,tps65217-charger";
+ interrupts = <0>, <1>;
+ interrupt-names = "USB", "AC";
status = "disabled";
};
pwrbutton {
compatible = "ti,tps65217-pwrbutton";
+ interrupts = <2>;
status = "disabled";
};
diff --git a/arch/arm/boot/dts/uniphier-ld4-ref.dts b/arch/arm/boot/dts/uniphier-ld4-ref.dts
index 4817ebb28eb2..b3aaab354f3e 100644
--- a/arch/arm/boot/dts/uniphier-ld4-ref.dts
+++ b/arch/arm/boot/dts/uniphier-ld4-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-ld4.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-ld4.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier LD4 Reference Board";
@@ -64,3 +64,7 @@
&usb1 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/uniphier-ld4.dtsi b/arch/arm/boot/dts/uniphier-ld4.dtsi
index fb2fd9605b9d..79183db5b386 100644
--- a/arch/arm/boot/dts/uniphier-ld4.dtsi
+++ b/arch/arm/boot/dts/uniphier-ld4.dtsi
@@ -270,6 +270,13 @@
interrupt-controller;
};
+ aidet: aidet@61830000 {
+ compatible = "socionext,uniphier-ld4-aidet";
+ reg = <0x61830000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
sysctrl@61840000 {
compatible = "socionext,uniphier-ld4-sysctrl",
"simple-mfd", "syscon";
@@ -285,7 +292,18 @@
#reset-cells = <1>;
};
};
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5a";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand2cs>;
+ clocks = <&sys_clk 2>;
+ };
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm/boot/dts/uniphier-ld6b-ref.dts b/arch/arm/boot/dts/uniphier-ld6b-ref.dts
index 96db4abc02c3..2188d114d79b 100644
--- a/arch/arm/boot/dts/uniphier-ld6b-ref.dts
+++ b/arch/arm/boot/dts/uniphier-ld6b-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-ld6b.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-ld6b.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier LD6b Reference Board";
@@ -58,3 +58,7 @@
&i2c0 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/uniphier-ld6b.dtsi b/arch/arm/boot/dts/uniphier-ld6b.dtsi
index 8b9a79731bd3..9a7b25cc8233 100644
--- a/arch/arm/boot/dts/uniphier-ld6b.dtsi
+++ b/arch/arm/boot/dts/uniphier-ld6b.dtsi
@@ -12,7 +12,7 @@
* The D-chip (digital chip) is the same as the PXs2 die.
* Reuse the PXs2 device tree with some properties overridden.
*/
-/include/ "uniphier-pxs2.dtsi"
+#include "uniphier-pxs2.dtsi"
/ {
compatible = "socionext,uniphier-ld6b";
diff --git a/arch/arm/boot/dts/uniphier-pinctrl.dtsi b/arch/arm/boot/dts/uniphier-pinctrl.dtsi
index 246f35ffb638..be82cddc4072 100644
--- a/arch/arm/boot/dts/uniphier-pinctrl.dtsi
+++ b/arch/arm/boot/dts/uniphier-pinctrl.dtsi
@@ -4,51 +4,35 @@
* Copyright (C) 2015-2017 Socionext Inc.
* Author: Masahiro Yamada <[email protected]>
*
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- * a) This file is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This file is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- * b) Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
*/
&pinctrl {
+ pinctrl_aout: aout_grp {
+ groups = "aout";
+ function = "aout";
+ };
+
pinctrl_emmc: emmc_grp {
groups = "emmc", "emmc_dat8";
function = "emmc";
};
+ pinctrl_ether_mii: ether_mii_grp {
+ groups = "ether_mii";
+ function = "ether_mii";
+ };
+
+ pinctrl_ether_rgmii: ether_rgmii_grp {
+ groups = "ether_rgmii";
+ function = "ether_rgmii";
+ };
+
+ pinctrl_ether_rmii: ether_rmii_grp {
+ groups = "ether_rmii";
+ function = "ether_rmii";
+ };
+
pinctrl_i2c0: i2c0_grp {
groups = "i2c0";
function = "i2c0";
diff --git a/arch/arm/boot/dts/uniphier-pro4-ace.dts b/arch/arm/boot/dts/uniphier-pro4-ace.dts
index 11690b57931c..089419cee273 100644
--- a/arch/arm/boot/dts/uniphier-pro4-ace.dts
+++ b/arch/arm/boot/dts/uniphier-pro4-ace.dts
@@ -8,7 +8,7 @@
*/
/dts-v1/;
-/include/ "uniphier-pro4.dtsi"
+#include "uniphier-pro4.dtsi"
/ {
model = "UniPhier Pro4 Ace Board";
diff --git a/arch/arm/boot/dts/uniphier-pro4-ref.dts b/arch/arm/boot/dts/uniphier-pro4-ref.dts
index 4cf539245f2e..903df6348e77 100644
--- a/arch/arm/boot/dts/uniphier-pro4-ref.dts
+++ b/arch/arm/boot/dts/uniphier-pro4-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-pro4.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-pro4.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier Pro4 Reference Board";
@@ -66,3 +66,7 @@
&usb3 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/uniphier-pro4-sanji.dts b/arch/arm/boot/dts/uniphier-pro4-sanji.dts
index 2763cebcd76a..adef212b45b2 100644
--- a/arch/arm/boot/dts/uniphier-pro4-sanji.dts
+++ b/arch/arm/boot/dts/uniphier-pro4-sanji.dts
@@ -8,7 +8,7 @@
*/
/dts-v1/;
-/include/ "uniphier-pro4.dtsi"
+#include "uniphier-pro4.dtsi"
/ {
model = "UniPhier Pro4 Sanji Board";
diff --git a/arch/arm/boot/dts/uniphier-pro4.dtsi b/arch/arm/boot/dts/uniphier-pro4.dtsi
index 37400becf4ba..b3dbbd9b6e39 100644
--- a/arch/arm/boot/dts/uniphier-pro4.dtsi
+++ b/arch/arm/boot/dts/uniphier-pro4.dtsi
@@ -268,6 +268,13 @@
};
};
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-pro4-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
timer@60000200 {
compatible = "arm,cortex-a9-global-timer";
reg = <0x60000200 0x20>;
@@ -305,7 +312,18 @@
#reset-cells = <1>;
};
};
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5a";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand>;
+ clocks = <&sys_clk 2>;
+ };
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm/boot/dts/uniphier-pro5.dtsi b/arch/arm/boot/dts/uniphier-pro5.dtsi
index 9577769a0add..b026bcd42a06 100644
--- a/arch/arm/boot/dts/uniphier-pro5.dtsi
+++ b/arch/arm/boot/dts/uniphier-pro5.dtsi
@@ -4,43 +4,7 @@
* Copyright (C) 2015-2016 Socionext Inc.
* Author: Masahiro Yamada <[email protected]>
*
- * This file is dual-licensed: you can use it either under the terms
- * of the GPL or the X11 license, at your option. Note that this dual
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- * a) This file is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This file is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- * b) Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
*/
/ {
@@ -328,7 +292,7 @@
sdctrl@59810000 {
compatible = "socionext,uniphier-pro5-sdctrl",
"simple-mfd", "syscon";
- reg = <0x59810000 0x800>;
+ reg = <0x59810000 0x400>;
sd_clk: clock {
compatible = "socionext,uniphier-pro5-sd-clock";
@@ -367,6 +331,13 @@
};
};
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-pro5-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
timer@60000200 {
compatible = "arm,cortex-a9-global-timer";
reg = <0x60000200 0x20>;
@@ -404,7 +375,18 @@
#reset-cells = <1>;
};
};
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5b";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand2cs>;
+ clocks = <&sys_clk 2>;
+ };
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm/boot/dts/uniphier-pxs2-gentil.dts b/arch/arm/boot/dts/uniphier-pxs2-gentil.dts
index 81560f75bfa7..7dfae2667f50 100644
--- a/arch/arm/boot/dts/uniphier-pxs2-gentil.dts
+++ b/arch/arm/boot/dts/uniphier-pxs2-gentil.dts
@@ -8,7 +8,7 @@
*/
/dts-v1/;
-/include/ "uniphier-pxs2.dtsi"
+#include "uniphier-pxs2.dtsi"
/ {
model = "UniPhier PXs2 Gentil Board";
diff --git a/arch/arm/boot/dts/uniphier-pxs2-vodka.dts b/arch/arm/boot/dts/uniphier-pxs2-vodka.dts
index dc2d0579c666..0cf615463a82 100644
--- a/arch/arm/boot/dts/uniphier-pxs2-vodka.dts
+++ b/arch/arm/boot/dts/uniphier-pxs2-vodka.dts
@@ -8,7 +8,7 @@
*/
/dts-v1/;
-/include/ "uniphier-pxs2.dtsi"
+#include "uniphier-pxs2.dtsi"
/ {
model = "UniPhier PXs2 Vodka Board";
diff --git a/arch/arm/boot/dts/uniphier-pxs2.dtsi b/arch/arm/boot/dts/uniphier-pxs2.dtsi
index bace751d4023..90b020c95083 100644
--- a/arch/arm/boot/dts/uniphier-pxs2.dtsi
+++ b/arch/arm/boot/dts/uniphier-pxs2.dtsi
@@ -276,7 +276,7 @@
sdctrl@59810000 {
compatible = "socionext,uniphier-pxs2-sdctrl",
"simple-mfd", "syscon";
- reg = <0x59810000 0x800>;
+ reg = <0x59810000 0x400>;
sd_clk: clock {
compatible = "socionext,uniphier-pxs2-sd-clock";
@@ -315,6 +315,13 @@
};
};
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-pxs2-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
timer@60000200 {
compatible = "arm,cortex-a9-global-timer";
reg = <0x60000200 0x20>;
@@ -352,7 +359,18 @@
#reset-cells = <1>;
};
};
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5b";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand2cs>;
+ clocks = <&sys_clk 2>;
+ };
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm/boot/dts/uniphier-sld3-ref.dts b/arch/arm/boot/dts/uniphier-sld3-ref.dts
deleted file mode 100644
index 70cda39a3dd2..000000000000
--- a/arch/arm/boot/dts/uniphier-sld3-ref.dts
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Device Tree Source for UniPhier sLD3 Reference Board
- *
- * Copyright (C) 2015-2016 Socionext Inc.
- * Author: Masahiro Yamada <[email protected]>
- *
- * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
- */
-
-/dts-v1/;
-/include/ "uniphier-sld3.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
-
-/ {
- model = "UniPhier sLD3 Reference Board";
- compatible = "socionext,uniphier-sld3-ref", "socionext,uniphier-sld3";
-
- chosen {
- stdout-path = "serial0:115200n8";
- };
-
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- serial2 = &serial2;
- i2c0 = &i2c0;
- i2c1 = &i2c1;
- i2c2 = &i2c2;
- i2c3 = &i2c3;
- i2c4 = &i2c4;
- };
-
- memory@8000000 {
- device_type = "memory";
- reg = <0x80000000 0x20000000
- 0xc0000000 0x20000000>;
- };
-};
-
-&ethsc {
- interrupts = <0 49 4>;
-};
-
-&serial0 {
- status = "okay";
-};
-
-&serial1 {
- status = "okay";
-};
-
-&serial2 {
- status = "okay";
-};
-
-&i2c0 {
- status = "okay";
-};
-
-&usb0 {
- status = "okay";
-};
-
-&usb1 {
- status = "okay";
-};
-
-&usb2 {
- status = "okay";
-};
-
-&usb3 {
- status = "okay";
-};
diff --git a/arch/arm/boot/dts/uniphier-sld3.dtsi b/arch/arm/boot/dts/uniphier-sld3.dtsi
deleted file mode 100644
index 408287936613..000000000000
--- a/arch/arm/boot/dts/uniphier-sld3.dtsi
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Device Tree Source for UniPhier sLD3 SoC
- *
- * Copyright (C) 2015-2016 Socionext Inc.
- * Author: Masahiro Yamada <[email protected]>
- *
- * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
- */
-
-/ {
- compatible = "socionext,uniphier-sld3";
- #address-cells = <1>;
- #size-cells = <1>;
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
- cpu@0 {
- device_type = "cpu";
- compatible = "arm,cortex-a9";
- reg = <0>;
- enable-method = "psci";
- next-level-cache = <&l2>;
- };
-
- cpu@1 {
- device_type = "cpu";
- compatible = "arm,cortex-a9";
- reg = <1>;
- enable-method = "psci";
- next-level-cache = <&l2>;
- };
- };
-
- psci {
- compatible = "arm,psci-0.2";
- method = "smc";
- };
-
- clocks {
- refclk: ref {
- #clock-cells = <0>;
- compatible = "fixed-clock";
- clock-frequency = <24576000>;
- };
-
- arm_timer_clk: arm_timer_clk {
- #clock-cells = <0>;
- compatible = "fixed-clock";
- clock-frequency = <50000000>;
- };
- };
-
- soc {
- compatible = "simple-bus";
- #address-cells = <1>;
- #size-cells = <1>;
- ranges;
- interrupt-parent = <&intc>;
-
- timer@20000200 {
- compatible = "arm,cortex-a9-global-timer";
- reg = <0x20000200 0x20>;
- interrupts = <1 11 0x304>;
- clocks = <&arm_timer_clk>;
- };
-
- timer@20000600 {
- compatible = "arm,cortex-a9-twd-timer";
- reg = <0x20000600 0x20>;
- interrupts = <1 13 0x304>;
- clocks = <&arm_timer_clk>;
- };
-
- intc: interrupt-controller@20001000 {
- compatible = "arm,cortex-a9-gic";
- #interrupt-cells = <3>;
- interrupt-controller;
- reg = <0x20001000 0x1000>,
- <0x20000100 0x100>;
- };
-
- l2: l2-cache@500c0000 {
- compatible = "socionext,uniphier-system-cache";
- reg = <0x500c0000 0x2000>, <0x503c0100 0x4>,
- <0x506c0000 0x400>;
- interrupts = <0 174 4>, <0 175 4>;
- cache-unified;
- cache-size = <(512 * 1024)>;
- cache-sets = <256>;
- cache-line-size = <128>;
- cache-level = <2>;
- };
-
- serial0: serial@54006800 {
- compatible = "socionext,uniphier-uart";
- status = "disabled";
- reg = <0x54006800 0x40>;
- interrupts = <0 33 4>;
- clocks = <&sys_clk 0>;
- };
-
- serial1: serial@54006900 {
- compatible = "socionext,uniphier-uart";
- status = "disabled";
- reg = <0x54006900 0x40>;
- interrupts = <0 35 4>;
- clocks = <&sys_clk 0>;
- };
-
- serial2: serial@54006a00 {
- compatible = "socionext,uniphier-uart";
- status = "disabled";
- reg = <0x54006a00 0x40>;
- interrupts = <0 37 4>;
- clocks = <&sys_clk 0>;
- };
-
- i2c0: i2c@58400000 {
- compatible = "socionext,uniphier-i2c";
- status = "disabled";
- reg = <0x58400000 0x40>;
- #address-cells = <1>;
- #size-cells = <0>;
- interrupts = <0 41 1>;
- clocks = <&sys_clk 1>;
- clock-frequency = <100000>;
- };
-
- i2c1: i2c@58480000 {
- compatible = "socionext,uniphier-i2c";
- status = "disabled";
- reg = <0x58480000 0x40>;
- #address-cells = <1>;
- #size-cells = <0>;
- interrupts = <0 42 1>;
- clocks = <&sys_clk 1>;
- clock-frequency = <100000>;
- };
-
- i2c2: i2c@58500000 {
- compatible = "socionext,uniphier-i2c";
- status = "disabled";
- reg = <0x58500000 0x40>;
- #address-cells = <1>;
- #size-cells = <0>;
- interrupts = <0 43 1>;
- clocks = <&sys_clk 1>;
- clock-frequency = <100000>;
- };
-
- i2c3: i2c@58580000 {
- compatible = "socionext,uniphier-i2c";
- status = "disabled";
- reg = <0x58580000 0x40>;
- #address-cells = <1>;
- #size-cells = <0>;
- interrupts = <0 44 1>;
- clocks = <&sys_clk 1>;
- clock-frequency = <100000>;
- };
-
- /* chip-internal connection for DMD */
- i2c4: i2c@58600000 {
- compatible = "socionext,uniphier-i2c";
- reg = <0x58600000 0x40>;
- #address-cells = <1>;
- #size-cells = <0>;
- interrupts = <0 45 1>;
- clocks = <&sys_clk 1>;
- clock-frequency = <400000>;
- };
-
- system_bus: system-bus@58c00000 {
- compatible = "socionext,uniphier-system-bus";
- status = "disabled";
- reg = <0x58c00000 0x400>;
- #address-cells = <2>;
- #size-cells = <1>;
- };
-
- smpctrl@59801000 {
- compatible = "socionext,uniphier-smpctrl";
- reg = <0x59801000 0x400>;
- };
-
- mioctrl@59810000 {
- compatible = "socionext,uniphier-sld3-mioctrl",
- "simple-mfd", "syscon";
- reg = <0x59810000 0x800>;
-
- mio_clk: clock {
- compatible = "socionext,uniphier-sld3-mio-clock";
- #clock-cells = <1>;
- };
-
- mio_rst: reset {
- compatible = "socionext,uniphier-sld3-mio-reset";
- #reset-cells = <1>;
- };
- };
-
- usb0: usb@5a800100 {
- compatible = "socionext,uniphier-ehci", "generic-ehci";
- status = "disabled";
- reg = <0x5a800100 0x100>;
- interrupts = <0 80 4>;
- clocks = <&mio_clk 7>, <&mio_clk 8>, <&mio_clk 12>;
- resets = <&sys_rst 8>, <&mio_rst 7>, <&mio_rst 8>,
- <&mio_rst 12>;
- };
-
- usb1: usb@5a810100 {
- compatible = "socionext,uniphier-ehci", "generic-ehci";
- status = "disabled";
- reg = <0x5a810100 0x100>;
- interrupts = <0 81 4>;
- clocks = <&mio_clk 7>, <&mio_clk 9>, <&mio_clk 13>;
- resets = <&sys_rst 8>, <&mio_rst 7>, <&mio_rst 9>,
- <&mio_rst 13>;
- };
-
- usb2: usb@5a820100 {
- compatible = "socionext,uniphier-ehci", "generic-ehci";
- status = "disabled";
- reg = <0x5a820100 0x100>;
- interrupts = <0 82 4>;
- clocks = <&mio_clk 7>, <&mio_clk 10>, <&mio_clk 14>;
- resets = <&sys_rst 8>, <&mio_rst 7>, <&mio_rst 10>,
- <&mio_rst 14>;
- };
-
- usb3: usb@5a830100 {
- compatible = "socionext,uniphier-ehci", "generic-ehci";
- status = "disabled";
- reg = <0x5a830100 0x100>;
- interrupts = <0 83 4>;
- clocks = <&mio_clk 7>, <&mio_clk 11>, <&mio_clk 15>;
- resets = <&sys_rst 8>, <&mio_rst 7>, <&mio_rst 11>,
- <&mio_rst 15>;
- };
-
- sysctrl@f1840000 {
- compatible = "socionext,uniphier-sld3-sysctrl",
- "simple-mfd", "syscon";
- reg = <0xf1840000 0x10000>;
-
- sys_clk: clock {
- compatible = "socionext,uniphier-sld3-clock";
- #clock-cells = <1>;
- };
-
- sys_rst: reset {
- compatible = "socionext,uniphier-sld3-reset";
- #reset-cells = <1>;
- };
- };
- };
-};
diff --git a/arch/arm/boot/dts/uniphier-sld8-ref.dts b/arch/arm/boot/dts/uniphier-sld8-ref.dts
index 4536d5b71297..5accd3cc76e4 100644
--- a/arch/arm/boot/dts/uniphier-sld8-ref.dts
+++ b/arch/arm/boot/dts/uniphier-sld8-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-sld8.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-sld8.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier sLD8 Reference Board";
@@ -68,3 +68,7 @@
&usb2 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm/boot/dts/uniphier-sld8.dtsi b/arch/arm/boot/dts/uniphier-sld8.dtsi
index 9fb9167f2db4..b08390332971 100644
--- a/arch/arm/boot/dts/uniphier-sld8.dtsi
+++ b/arch/arm/boot/dts/uniphier-sld8.dtsi
@@ -270,6 +270,13 @@
interrupt-controller;
};
+ aidet: aidet@61830000 {
+ compatible = "socionext,uniphier-sld8-aidet";
+ reg = <0x61830000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
sysctrl@61840000 {
compatible = "socionext,uniphier-sld8-sysctrl",
"simple-mfd", "syscon";
@@ -285,7 +292,18 @@
#reset-cells = <1>;
};
};
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5a";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand2cs>;
+ clocks = <&sys_clk 2>;
+ };
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
index 06e2331f666d..9abe26028c8b 100644
--- a/arch/arm/boot/dts/versatile-pb.dts
+++ b/arch/arm/boot/dts/versatile-pb.dts
@@ -39,7 +39,7 @@
clock-names = "apb_pclk";
};
- pci-controller@10001000 {
+ pci@10001000 {
compatible = "arm,versatile-pci";
device_type = "pci";
reg = <0x10001000 0x1000
diff --git a/arch/arm/boot/dts/zx296702-ad1.dts b/arch/arm/boot/dts/zx296702-ad1.dts
index 081f980cfbe6..b0183c3a1d7c 100644
--- a/arch/arm/boot/dts/zx296702-ad1.dts
+++ b/arch/arm/boot/dts/zx296702-ad1.dts
@@ -18,7 +18,6 @@
};
&mmc0 {
- num-slots = <1>;
supports-highspeed;
non-removable;
disable-wp;
@@ -31,7 +30,6 @@
};
&mmc1 {
- num-slots = <1>;
supports-highspeed;
non-removable;
disable-wp;
diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
index f3ac9bfe580e..0f79fe1ccd9d 100644
--- a/arch/arm/boot/dts/zynq-7000.dtsi
+++ b/arch/arm/boot/dts/zynq-7000.dtsi
@@ -42,6 +42,14 @@
};
};
+ fpga_full: fpga-full {
+ compatible = "fpga-region";
+ fpga-mgr = <&devcfg>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ };
+
pmu@f8891000 {
compatible = "arm,cortex-a9-pmu";
interrupts = <0 5 4>, <0 6 4>;
diff --git a/arch/arm/boot/dts/zynq-parallella.dts b/arch/arm/boot/dts/zynq-parallella.dts
index 64a6390fc501..0144acfa9793 100644
--- a/arch/arm/boot/dts/zynq-parallella.dts
+++ b/arch/arm/boot/dts/zynq-parallella.dts
@@ -34,7 +34,7 @@
};
chosen {
- bootargs = "earlycon root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait";
+ bootargs = "root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait";
stdout-path = "serial0:115200n8";
};
};
@@ -54,6 +54,7 @@
compatible = "ethernet-phy-id0141.0e90",
"ethernet-phy-ieee802.3-c22";
reg = <0>;
+ device_type = "ethernet-phy";
marvell,reg-init = <0x3 0x10 0xff00 0x1e>,
<0x3 0x11 0xfff0 0xa>;
};
diff --git a/arch/arm/boot/dts/zynq-zc702.dts b/arch/arm/boot/dts/zynq-zc702.dts
index 0cdad2cc8b78..34e8277fce0d 100644
--- a/arch/arm/boot/dts/zynq-zc702.dts
+++ b/arch/arm/boot/dts/zynq-zc702.dts
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*/
/dts-v1/;
-/include/ "zynq-7000.dtsi"
+#include "zynq-7000.dtsi"
/ {
model = "Zynq ZC702 Development Board";
@@ -30,7 +30,7 @@
};
chosen {
- bootargs = "earlycon";
+ bootargs = "";
stdout-path = "serial0:115200n8";
};
@@ -97,6 +97,7 @@
ethernet_phy: ethernet-phy@7 {
reg = <7>;
+ device_type = "ethernet-phy";
};
};
@@ -131,6 +132,21 @@
};
};
+ i2c@1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <1>;
+ adv7511: hdmi-tx@39 {
+ compatible = "adi,adv7511";
+ reg = <0x39>;
+ adi,input-depth = <8>;
+ adi,input-colorspace = "yuv422";
+ adi,input-clock = "1x";
+ adi,input-style = <3>;
+ adi,input-justification = "right";
+ };
+ };
+
i2c@2 {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/arch/arm/boot/dts/zynq-zc706.dts b/arch/arm/boot/dts/zynq-zc706.dts
index ad4bb06dba25..7ebc8c5ae39d 100644
--- a/arch/arm/boot/dts/zynq-zc706.dts
+++ b/arch/arm/boot/dts/zynq-zc706.dts
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*/
/dts-v1/;
-/include/ "zynq-7000.dtsi"
+#include "zynq-7000.dtsi"
/ {
model = "Zynq ZC706 Development Board";
@@ -30,7 +30,7 @@
};
chosen {
- bootargs = "earlycon";
+ bootargs = "";
stdout-path = "serial0:115200n8";
};
@@ -53,6 +53,7 @@
ethernet_phy: ethernet-phy@7 {
reg = <7>;
+ device_type = "ethernet-phy";
};
};
@@ -87,6 +88,21 @@
};
};
+ i2c@1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <1>;
+ adv7511: hdmi-tx@39 {
+ compatible = "adi,adv7511";
+ reg = <0x39>;
+ adi,input-depth = <8>;
+ adi,input-colorspace = "yuv422";
+ adi,input-clock = "1x";
+ adi,input-style = <3>;
+ adi,input-justification = "evenly";
+ };
+ };
+
i2c@2 {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/arch/arm/boot/dts/zynq-zed.dts b/arch/arm/boot/dts/zynq-zed.dts
index 325379f7983c..5e44dc12fd60 100644
--- a/arch/arm/boot/dts/zynq-zed.dts
+++ b/arch/arm/boot/dts/zynq-zed.dts
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*/
/dts-v1/;
-/include/ "zynq-7000.dtsi"
+#include "zynq-7000.dtsi"
/ {
model = "Zynq Zed Development Board";
@@ -29,7 +29,7 @@
};
chosen {
- bootargs = "earlycon";
+ bootargs = "";
stdout-path = "serial0:115200n8";
};
@@ -50,6 +50,7 @@
ethernet_phy: ethernet-phy@0 {
reg = <0>;
+ device_type = "ethernet-phy";
};
};
diff --git a/arch/arm/boot/dts/zynq-zybo.dts b/arch/arm/boot/dts/zynq-zybo.dts
index 590ec24b8749..e40cafc5ee5b 100644
--- a/arch/arm/boot/dts/zynq-zybo.dts
+++ b/arch/arm/boot/dts/zynq-zybo.dts
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*/
/dts-v1/;
-/include/ "zynq-7000.dtsi"
+#include "zynq-7000.dtsi"
/ {
model = "Zynq ZYBO Development Board";
@@ -29,7 +29,7 @@
};
chosen {
- bootargs = "earlycon";
+ bootargs = "";
stdout-path = "serial0:115200n8";
};
@@ -51,6 +51,7 @@
ethernet_phy: ethernet-phy@0 {
reg = <0>;
+ device_type = "ethernet-phy";
};
};
diff --git a/arch/arm/configs/aspeed_g4_defconfig b/arch/arm/configs/aspeed_g4_defconfig
index cfc2465e8b77..d23b9d56a88b 100644
--- a/arch/arm/configs/aspeed_g4_defconfig
+++ b/arch/arm/configs/aspeed_g4_defconfig
@@ -24,6 +24,7 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_ARCH_MULTI_V7 is not set
CONFIG_ARCH_ASPEED=y
CONFIG_MACH_ASPEED_G4=y
+CONFIG_VMSPLIT_2G=y
CONFIG_AEABI=y
# CONFIG_CPU_SW_DOMAIN_PAN is not set
# CONFIG_COMPACTION is not set
@@ -64,6 +65,7 @@ CONFIG_MTD_UBI_FASTMAP=y
CONFIG_MTD_UBI_BLOCK=y
CONFIG_BLK_DEV_RAM=y
CONFIG_ASPEED_LPC_CTRL=y
+CONFIG_ASPEED_LPC_SNOOP=y
CONFIG_EEPROM_AT24=y
CONFIG_NETDEVICES=y
CONFIG_NETCONSOLE=y
@@ -104,6 +106,7 @@ CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=6
CONFIG_SERIAL_8250_RUNTIME_UARTS=6
CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_ASPEED_VUART=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_ASPEED_BT_IPMI_BMC=y
@@ -114,6 +117,7 @@ CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
CONFIG_I2C_MUX_PCA9541=y
CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_ASPEED=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_ASPEED=y
@@ -166,7 +170,6 @@ CONFIG_PRINTK_TIME=y
CONFIG_DYNAMIC_DEBUG=y
CONFIG_STRIP_ASM_SYMS=y
CONFIG_DEBUG_FS=y
-CONFIG_LOCKUP_DETECTOR=y
CONFIG_WQ_WATCHDOG=y
CONFIG_PANIC_TIMEOUT=-1
# CONFIG_SCHED_DEBUG is not set
diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig
index 3c20d93de389..c0ad7b82086b 100644
--- a/arch/arm/configs/aspeed_g5_defconfig
+++ b/arch/arm/configs/aspeed_g5_defconfig
@@ -67,6 +67,7 @@ CONFIG_MTD_UBI_FASTMAP=y
CONFIG_MTD_UBI_BLOCK=y
CONFIG_BLK_DEV_RAM=y
CONFIG_ASPEED_LPC_CTRL=y
+CONFIG_ASPEED_LPC_SNOOP=y
CONFIG_EEPROM_AT24=y
CONFIG_NETDEVICES=y
CONFIG_NETCONSOLE=y
@@ -107,6 +108,7 @@ CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=6
CONFIG_SERIAL_8250_RUNTIME_UARTS=6
CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_ASPEED_VUART=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_ASPEED_BT_IPMI_BMC=y
@@ -117,6 +119,7 @@ CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
CONFIG_I2C_MUX_PCA9541=y
CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_ASPEED=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_ASPEED=y
@@ -169,7 +172,6 @@ CONFIG_PRINTK_TIME=y
CONFIG_DYNAMIC_DEBUG=y
CONFIG_STRIP_ASM_SYMS=y
CONFIG_DEBUG_FS=y
-CONFIG_LOCKUP_DETECTOR=y
CONFIG_WQ_WATCHDOG=y
CONFIG_PANIC_TIMEOUT=-1
# CONFIG_SCHED_DEBUG is not set
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig
index 3ee9d78c412a..43dab4890ad3 100644
--- a/arch/arm/configs/bcm2835_defconfig
+++ b/arch/arm/configs/bcm2835_defconfig
@@ -55,6 +55,7 @@ CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_STANDALONE is not set
CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=32
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_CONSTANTS=y
@@ -62,9 +63,15 @@ CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_NETDEVICES=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_SMSC95XX=y
+CONFIG_BRCMFMAC=m
CONFIG_ZD1211RW=y
CONFIG_INPUT_EVDEV=y
# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_BCM2835AUX=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_TTY_PRINTK=y
diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig
index 06e2e2a1a9be..27d9720f7207 100644
--- a/arch/arm/configs/davinci_all_defconfig
+++ b/arch/arm/configs/davinci_all_defconfig
@@ -143,6 +143,8 @@ CONFIG_VIDEO_ADV7343=m
CONFIG_DRM=m
CONFIG_DRM_TILCDC=m
CONFIG_DRM_DUMB_VGA_DAC=m
+CONFIG_DRM_TINYDRM=m
+CONFIG_TINYDRM_ST7586=m
CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_DA8XX=y
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig
index 25325ed9319e..8c2a2619971b 100644
--- a/arch/arm/configs/exynos_defconfig
+++ b/arch/arm/configs/exynos_defconfig
@@ -3,7 +3,6 @@ CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_CGROUPS=y
CONFIG_BLK_DEV_INITRD=y
-CONFIG_KALLSYMS_ALL=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_PARTITION_ADVANCED=y
@@ -48,7 +47,43 @@ CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
+CONFIG_BT=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_LEDS=y
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_3WIRE=y
+CONFIG_BT_HCIUART_INTEL=y
+CONFIG_BT_HCIUART_BCM=y
+CONFIG_BT_HCIUART_QCA=y
+CONFIG_BT_HCIUART_AG6XX=y
+CONFIG_BT_HCIUART_MRVL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
CONFIG_CFG80211=y
+CONFIG_MAC80211=y
+CONFIG_MAC80211_LEDS=y
+CONFIG_NFC=y
+CONFIG_NFC_DIGITAL=m
+CONFIG_NFC_NCI=y
+CONFIG_NFC_NCI_SPI=m
+CONFIG_NFC_NCI_UART=m
+CONFIG_NFC_HCI=m
+CONFIG_NFC_SHDLC=y
+CONFIG_NFC_S3FWRN5_I2C=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_DMA_CMA=y
@@ -65,7 +100,9 @@ CONFIG_BLK_DEV_DM=y
CONFIG_DM_CRYPT=m
CONFIG_NETDEVICES=y
CONFIG_SMSC911X=y
+CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=y
+CONFIG_USB_LAN78XX=m
CONFIG_USB_USBNET=y
CONFIG_USB_NET_SMSC75XX=y
CONFIG_USB_NET_SMSC95XX=y
@@ -189,7 +226,25 @@ CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_EXYNOS=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_EXYNOS=y
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_WDM=m
+CONFIG_USB_TMC=m
CONFIG_USB_STORAGE=y
+CONFIG_USB_STORAGE_REALTEK=m
+CONFIG_USB_STORAGE_DATAFAB=m
+CONFIG_USB_STORAGE_FREECOM=m
+CONFIG_USB_STORAGE_ISD200=m
+CONFIG_USB_STORAGE_USBAT=m
+CONFIG_USB_STORAGE_SDDR09=m
+CONFIG_USB_STORAGE_SDDR55=m
+CONFIG_USB_STORAGE_JUMPSHOT=m
+CONFIG_USB_STORAGE_ALAUDA=m
+CONFIG_USB_STORAGE_ONETOUCH=m
+CONFIG_USB_STORAGE_KARMA=m
+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
+CONFIG_USB_STORAGE_ENE_UB6250=m
+CONFIG_USB_UAS=m
CONFIG_USB_DWC3=y
CONFIG_USB_DWC2=y
CONFIG_USB_HSIC_USB3503=y
@@ -209,7 +264,6 @@ CONFIG_LEDS_GPIO=y
CONFIG_LEDS_PWM=y
CONFIG_LEDS_MAX77693=y
CONFIG_LEDS_MAX8997=y
-CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_MAX8997=y
@@ -253,18 +307,30 @@ CONFIG_ROOT_NFS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=y
CONFIG_PRINTK_TIME=y
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_FS=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_DEBUG_RT_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_MUTEXES=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_DETECT_HUNG_TASK is not set
+CONFIG_PROVE_LOCKING=y
+CONFIG_DEBUG_ATOMIC_SLEEP=y
CONFIG_DEBUG_USER=y
+CONFIG_CRYPTO_RSA=m
+CONFIG_CRYPTO_DH=m
CONFIG_CRYPTO_USER=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_XTS=m
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_SHA3=m
+CONFIG_CRYPTO_SALSA20=m
+CONFIG_CRYPTO_LZO=m
+CONFIG_CRYPTO_LZ4=m
CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m
CONFIG_CRYPTO_USER_API_RNG=m
@@ -276,6 +342,7 @@ CONFIG_CRYPTO_SHA1_ARM_NEON=m
CONFIG_CRYPTO_SHA256_ARM=m
CONFIG_CRYPTO_SHA512_ARM=m
CONFIG_CRYPTO_AES_ARM_BS=m
+CONFIG_CRYPTO_CHACHA20_NEON=m
CONFIG_CRC_CCITT=y
CONFIG_FONTS=y
CONFIG_FONT_7x14=y
diff --git a/arch/arm/configs/ezx_defconfig b/arch/arm/configs/ezx_defconfig
index 23660f3d0f7f..484e51fbd4a6 100644
--- a/arch/arm/configs/ezx_defconfig
+++ b/arch/arm/configs/ezx_defconfig
@@ -27,7 +27,6 @@ CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=tty1 root=/dev/mmcblk0p2 rootfstype=ext2 rootdelay=3 ip=192.168.0.202:192.168.0.200:192.168.0.200:255.255.255.0 debug"
CONFIG_KEXEC=y
CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_DEBUG=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=m
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
diff --git a/arch/arm/configs/gemini_defconfig b/arch/arm/configs/gemini_defconfig
index d2d75fa664a6..2a63fa10c813 100644
--- a/arch/arm/configs/gemini_defconfig
+++ b/arch/arm/configs/gemini_defconfig
@@ -32,6 +32,7 @@ CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_SD=y
# CONFIG_SCSI_LOWLEVEL is not set
CONFIG_ATA=y
+CONFIG_PATA_FTIDE010=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_GPIO=y
# CONFIG_INPUT_MOUSE is not set
@@ -55,8 +56,8 @@ CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_GEMINI=y
CONFIG_DMADEVICES=y
+CONFIG_AMBA_PL08X=y
# CONFIG_DNOTIFY is not set
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig
index 1736813bdea7..32acac9ab81a 100644
--- a/arch/arm/configs/imx_v6_v7_defconfig
+++ b/arch/arm/configs/imx_v6_v7_defconfig
@@ -51,6 +51,7 @@ CONFIG_PREEMPT_VOLUNTARY=y
CONFIG_AEABI=y
CONFIG_HIGHMEM=y
CONFIG_CMA=y
+CONFIG_FORCE_MAX_ZONEORDER=14
CONFIG_CMDLINE="noinitrd console=ttymxc0,115200"
CONFIG_KEXEC=y
CONFIG_CPU_FREQ=y
@@ -186,6 +187,7 @@ CONFIG_SERIAL_FSL_LPUART=y
CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
# CONFIG_I2C_COMPAT is not set
CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
CONFIG_I2C_MUX_GPIO=y
# CONFIG_I2C_HELPER_AUTO is not set
CONFIG_I2C_ALGOPCF=m
@@ -193,12 +195,14 @@ CONFIG_I2C_ALGOPCA=m
CONFIG_I2C_GPIO=y
CONFIG_I2C_IMX=y
CONFIG_SPI=y
+CONFIG_SPI_GPIO=y
CONFIG_SPI_IMX=y
CONFIG_SPI_FSL_DSPI=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_MC9S08DZ60=y
CONFIG_GPIO_PCA953X=y
CONFIG_GPIO_STMPE=y
+CONFIG_GPIO_74X164=y
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_IMX=y
CONFIG_POWER_RESET_SYSCON=y
@@ -227,14 +231,20 @@ CONFIG_REGULATOR_PFUZE100=y
CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_RC_CORE=y
+CONFIG_MEDIA_CONTROLLER=y
+CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_RC_DEVICES=y
CONFIG_IR_GPIO_CIR=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=m
CONFIG_V4L_PLATFORM_DRIVERS=y
+CONFIG_VIDEO_MUX=y
CONFIG_SOC_CAMERA=y
CONFIG_V4L_MEM2MEM_DRIVERS=y
-CONFIG_VIDEO_CODA=y
+CONFIG_VIDEO_CODA=m
+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
+CONFIG_VIDEO_ADV7180=m
+CONFIG_VIDEO_OV5640=m
CONFIG_SOC_CAMERA_OV2640=y
CONFIG_IMX_IPUV3_CORE=y
CONFIG_DRM=y
@@ -344,6 +354,9 @@ CONFIG_FSL_EDMA=y
CONFIG_IMX_SDMA=y
CONFIG_MXS_DMA=y
CONFIG_STAGING=y
+CONFIG_STAGING_MEDIA=y
+CONFIG_VIDEO_IMX_MEDIA=y
+CONFIG_COMMON_CLK_PWM=y
CONFIG_IIO=y
CONFIG_IMX7D_ADC=y
CONFIG_VF610_ADC=y
diff --git a/arch/arm/configs/ixp4xx_defconfig b/arch/arm/configs/ixp4xx_defconfig
index c8378da71913..8c3c99cd6de9 100644
--- a/arch/arm/configs/ixp4xx_defconfig
+++ b/arch/arm/configs/ixp4xx_defconfig
@@ -81,12 +81,8 @@ CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
CONFIG_WAN_ROUTER=m
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig
index 1331f6dc456a..f907869e0ddc 100644
--- a/arch/arm/configs/keystone_defconfig
+++ b/arch/arm/configs/keystone_defconfig
@@ -112,6 +112,9 @@ CONFIG_IP_NF_ARP_MANGLE=y
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP_SCTP=y
CONFIG_VLAN_8021Q=y
+CONFIG_CAN=m
+CONFIG_CAN_C_CAN=m
+CONFIG_CAN_C_CAN_PLATFORM=m
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
@@ -156,6 +159,8 @@ CONFIG_POWER_RESET_KEYSTONE=y
# CONFIG_HWMON is not set
CONFIG_WATCHDOG=y
CONFIG_DAVINCI_WATCHDOG=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_MON=y
@@ -164,6 +169,8 @@ CONFIG_USB_STORAGE=y
CONFIG_USB_DWC3=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_KEYSTONE_USB_PHY=y
+CONFIG_MMC=y
+CONFIG_MMC_OMAP_HS=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
@@ -174,12 +181,18 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_DMADEVICES=y
CONFIG_TI_EDMA=y
+CONFIG_MAILBOX=y
+CONFIG_TI_MESSAGE_MANAGER=y
CONFIG_SOC_TI=y
CONFIG_KEYSTONE_NAVIGATOR_QMSS=y
CONFIG_KEYSTONE_NAVIGATOR_DMA=y
+CONFIG_TI_SCI_PM_DOMAINS=y
CONFIG_MEMORY=y
CONFIG_TI_AEMIF=y
CONFIG_KEYSTONE_IRQ=y
+CONFIG_RESET_TI_SCI=m
+CONFIG_RESET_TI_SYSCON=m
+CONFIG_TI_SCI_PROTOCOL=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_FANOTIFY=y
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 94d7e71c69c4..0cacdbf84a71 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -104,13 +104,11 @@ CONFIG_ARCH_TEGRA_2x_SOC=y
CONFIG_ARCH_TEGRA_3x_SOC=y
CONFIG_ARCH_TEGRA_114_SOC=y
CONFIG_ARCH_TEGRA_124_SOC=y
-CONFIG_TEGRA_EMC_SCALING_ENABLE=y
CONFIG_ARCH_UNIPHIER=y
CONFIG_ARCH_U8500=y
CONFIG_MACH_HREFV60=y
CONFIG_MACH_SNOWBALL=y
CONFIG_ARCH_VEXPRESS=y
-CONFIG_ARCH_VEXPRESS_CA9X4=y
CONFIG_ARCH_VEXPRESS_TC2_PM=y
CONFIG_ARCH_WM8850=y
CONFIG_ARCH_ZYNQ=y
@@ -331,6 +329,7 @@ CONFIG_SERIAL_IMX_CONSOLE=y
CONFIG_SERIAL_SH_SCI=y
CONFIG_SERIAL_SH_SCI_NR_UARTS=20
CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_SH_SCI_DMA=y
CONFIG_SERIAL_MSM=y
CONFIG_SERIAL_MSM_CONSOLE=y
CONFIG_SERIAL_VT8500=y
@@ -456,6 +455,7 @@ CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_INA2XX=m
CONFIG_CPU_THERMAL=y
+CONFIG_BRCMSTB_THERMAL=m
CONFIG_ROCKCHIP_THERMAL=y
CONFIG_RCAR_THERMAL=y
CONFIG_ARMADA_THERMAL=y
@@ -585,6 +585,7 @@ CONFIG_VIDEO_ADV7180=m
CONFIG_VIDEO_ML86V7667=m
CONFIG_DRM=y
CONFIG_DRM_I2C_ADV7511=m
+CONFIG_DRM_I2C_ADV7511_AUDIO=y
# CONFIG_DRM_I2C_CH7006 is not set
# CONFIG_DRM_I2C_SIL164 is not set
CONFIG_DRM_DUMB_VGA_DAC=m
@@ -604,7 +605,6 @@ CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_DRM_ATMEL_HLCDC=m
CONFIG_DRM_RCAR_DU=m
-CONFIG_DRM_RCAR_HDMI=y
CONFIG_DRM_RCAR_LVDS=y
CONFIG_DRM_SUN4I=m
CONFIG_DRM_TEGRA=y
@@ -651,9 +651,11 @@ CONFIG_SND_SOC_SMDK_WM8994_PCM=m
CONFIG_SND_SOC_SNOW=m
CONFIG_SND_SOC_SH4_FSI=m
CONFIG_SND_SOC_RCAR=m
-CONFIG_SND_SOC_RSRC_CARD=m
+CONFIG_SND_SIMPLE_SCU_CARD=m
CONFIG_SND_SUN4I_CODEC=m
CONFIG_SND_SOC_TEGRA=m
+CONFIG_SND_SOC_TEGRA20_I2S=m
+CONFIG_SND_SOC_TEGRA30_I2S=m
CONFIG_SND_SOC_TEGRA_RT5640=m
CONFIG_SND_SOC_TEGRA_WM8753=m
CONFIG_SND_SOC_TEGRA_WM8903=m
@@ -696,7 +698,6 @@ CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_AB8500_USB=y
CONFIG_KEYSTONE_USB_PHY=y
-CONFIG_OMAP_USB3=y
CONFIG_USB_GPIO_VBUS=y
CONFIG_USB_ISP1301=y
CONFIG_USB_MSM_OTG=m
@@ -712,7 +713,7 @@ CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_ARASAN=y
CONFIG_MMC_SDHCI_OF_AT91=y
-CONFIG_MMC_SDHCI_OF_ESDHC=m
+CONFIG_MMC_SDHCI_OF_ESDHC=y
CONFIG_MMC_SDHCI_ESDHC_IMX=y
CONFIG_MMC_SDHCI_DOVE=y
CONFIG_MMC_SDHCI_TEGRA=y
@@ -729,7 +730,6 @@ CONFIG_MMC_SDHCI_MSM=y
CONFIG_MMC_MVSDIO=y
CONFIG_MMC_SDHI=y
CONFIG_MMC_DW=y
-CONFIG_MMC_DW_IDMAC=y
CONFIG_MMC_DW_PLTFM=y
CONFIG_MMC_DW_EXYNOS=y
CONFIG_MMC_DW_ROCKCHIP=y
@@ -826,7 +826,6 @@ CONFIG_BCMA_DRIVER_GPIO=y
CONFIG_QCOM_GSBI=y
CONFIG_QCOM_PM=y
CONFIG_QCOM_SMEM=y
-CONFIG_QCOM_SMD=y
CONFIG_QCOM_SMD_RPM=y
CONFIG_QCOM_SMP2P=y
CONFIG_QCOM_SMSM=y
@@ -838,7 +837,6 @@ CONFIG_CHROME_PLATFORMS=y
CONFIG_STAGING_BOARD=y
CONFIG_CROS_EC_CHARDEV=m
CONFIG_COMMON_CLK_MAX77686=y
-CONFIG_COMMON_CLK_MAX77802=m
CONFIG_COMMON_CLK_RK808=m
CONFIG_COMMON_CLK_S2MPS11=m
CONFIG_APQ_MMCC_8084=y
@@ -934,7 +932,6 @@ CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_FS=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_LOCKUP_DETECTOR=y
-CONFIG_CRYPTO_DEV_TEGRA_AES=y
CONFIG_CPUFREQ_DT=y
CONFIG_KEYSTONE_IRQ=y
CONFIG_HW_RANDOM=y
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
index 0414acf731ce..7b97200c1d64 100644
--- a/arch/arm/configs/omap2plus_defconfig
+++ b/arch/arm/configs/omap2plus_defconfig
@@ -170,6 +170,7 @@ CONFIG_TI_CPTS=y
# CONFIG_NET_VENDOR_WIZNET is not set
CONFIG_AT803X_PHY=y
CONFIG_DP83848_PHY=y
+CONFIG_DP83867_PHY=y
CONFIG_MICREL_PHY=y
CONFIG_SMSC_PHY=y
CONFIG_PPP=m
@@ -250,6 +251,7 @@ CONFIG_DEBUG_GPIO=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_PCA953X=m
CONFIG_GPIO_PCF857X=y
+CONFIG_GPIO_LP87565=y
CONFIG_GPIO_PALMAS=y
CONFIG_GPIO_TWL4030=y
CONFIG_W1=m
@@ -284,6 +286,7 @@ CONFIG_MFD_TI_AM335X_TSCADC=m
CONFIG_MFD_PALMAS=y
CONFIG_MFD_TPS65217=y
CONFIG_MFD_TI_LP873X=y
+CONFIG_MFD_TI_LP87565=y
CONFIG_MFD_TPS65218=y
CONFIG_MFD_TPS65910=y
CONFIG_TWL6040_CORE=y
@@ -292,6 +295,7 @@ CONFIG_REGULATOR_GPIO=y
CONFIG_REGULATOR_LM363X=m
CONFIG_REGULATOR_LP872X=y
CONFIG_REGULATOR_LP873X=y
+CONFIG_REGULATOR_LP87565=y
CONFIG_REGULATOR_PALMAS=y
CONFIG_REGULATOR_PBIAS=y
CONFIG_REGULATOR_TI_ABB=y
diff --git a/arch/arm/configs/pxa_defconfig b/arch/arm/configs/pxa_defconfig
index 64e3a2a8cede..d5e1370ec303 100644
--- a/arch/arm/configs/pxa_defconfig
+++ b/arch/arm/configs/pxa_defconfig
@@ -471,7 +471,7 @@ CONFIG_LCD_PLATFORM=m
CONFIG_LCD_TOSA=m
CONFIG_BACKLIGHT_PWM=m
CONFIG_BACKLIGHT_TOSA=m
-CONFIG_FRAMEBUFFER_CONSOLE=m
+CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_LOGO=y
CONFIG_SOUND=m
diff --git a/arch/arm/configs/qcom_defconfig b/arch/arm/configs/qcom_defconfig
index b02039c712c3..879159e4ab58 100644
--- a/arch/arm/configs/qcom_defconfig
+++ b/arch/arm/configs/qcom_defconfig
@@ -199,7 +199,6 @@ CONFIG_QCOM_WCNSS_PIL=y
CONFIG_QCOM_GSBI=y
CONFIG_QCOM_PM=y
CONFIG_QCOM_SMEM=y
-CONFIG_QCOM_SMD=y
CONFIG_QCOM_SMD_RPM=y
CONFIG_QCOM_SMP2P=y
CONFIG_QCOM_SMSM=y
diff --git a/arch/arm/configs/shmobile_defconfig b/arch/arm/configs/shmobile_defconfig
index 3c66a422fb4d..7b4fc0143148 100644
--- a/arch/arm/configs/shmobile_defconfig
+++ b/arch/arm/configs/shmobile_defconfig
@@ -27,6 +27,7 @@ CONFIG_ARCH_SH73A0=y
CONFIG_PL310_ERRATA_588369=y
CONFIG_ARM_ERRATA_754322=y
CONFIG_PCI=y
+CONFIG_PCI_MSI=y
CONFIG_PCI_RCAR_GEN2=y
CONFIG_PCIE_RCAR=y
CONFIG_SMP=y
@@ -83,14 +84,14 @@ CONFIG_NETDEVICES=y
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
CONFIG_SH_ETH=y
+CONFIG_RAVB=y
# CONFIG_NET_VENDOR_SEEQ is not set
CONFIG_SMSC911X=y
# CONFIG_NET_VENDOR_STMICRO is not set
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
-CONFIG_SMSC_PHY=y
CONFIG_MICREL_PHY=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_SMSC_PHY=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_GPIO=y
# CONFIG_INPUT_MOUSE is not set
@@ -105,6 +106,7 @@ CONFIG_SERIAL_8250_EM=y
CONFIG_SERIAL_SH_SCI=y
CONFIG_SERIAL_SH_SCI_NR_UARTS=20
CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_SH_SCI_DMA=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
CONFIG_I2C_DEMUX_PINCTRL=y
@@ -121,9 +123,9 @@ CONFIG_SPI_SH_HSPI=y
CONFIG_GPIO_EM=y
CONFIG_GPIO_RCAR=y
CONFIG_GPIO_PCF857X=y
-CONFIG_POWER_SUPPLY=y
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_RMOBILE=y
+CONFIG_POWER_SUPPLY=y
# CONFIG_HWMON is not set
CONFIG_THERMAL=y
CONFIG_CPU_THERMAL=y
@@ -153,10 +155,11 @@ CONFIG_VIDEO_ADV7180=y
CONFIG_VIDEO_ADV7604=y
CONFIG_VIDEO_ML86V7667=y
CONFIG_DRM=y
-CONFIG_DRM_I2C_ADV7511=y
CONFIG_DRM_RCAR_DU=y
-CONFIG_DRM_RCAR_HDMI=y
CONFIG_DRM_RCAR_LVDS=y
+CONFIG_DRM_DUMB_VGA_DAC=y
+CONFIG_DRM_I2C_ADV7511=y
+CONFIG_DRM_I2C_ADV7511_AUDIO=y
CONFIG_FB_SH_MOBILE_LCDC=y
CONFIG_FB_SH_MOBILE_MERAM=y
# CONFIG_LCD_CLASS_DEVICE is not set
@@ -169,12 +172,12 @@ CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_SH4_FSI=y
CONFIG_SND_SOC_RCAR=y
-CONFIG_SND_SOC_RSRC_CARD=y
CONFIG_SND_SOC_AK4642=y
CONFIG_SND_SOC_WM8978=y
+CONFIG_SND_SIMPLE_SCU_CARD=y
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_XHCI_RCAR=y
+CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_R8A66597_HCD=y
@@ -190,6 +193,7 @@ CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_RS5C372=y
+CONFIG_RTC_DRV_BQ32K=y
CONFIG_RTC_DRV_S35390A=y
CONFIG_RTC_DRV_RX8581=y
CONFIG_RTC_DRV_DA9063=y
diff --git a/arch/arm/configs/sunxi_defconfig b/arch/arm/configs/sunxi_defconfig
index 22cd559531a9..5caaf971fb50 100644
--- a/arch/arm/configs/sunxi_defconfig
+++ b/arch/arm/configs/sunxi_defconfig
@@ -1,4 +1,3 @@
-CONFIG_FHANDLE=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_CGROUPS=y
@@ -56,7 +55,6 @@ CONFIG_STMMAC_ETH=y
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_SUN4I_LRADC=y
# CONFIG_INPUT_MOUSE is not set
@@ -71,7 +69,6 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=8
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MV64XXX=y
CONFIG_I2C_SUN6I_P2WI=y
@@ -80,14 +77,14 @@ CONFIG_SPI_SUN4I=y
CONFIG_SPI_SUN6I=y
CONFIG_GPIO_SYSFS=y
CONFIG_POWER_SUPPLY=y
+CONFIG_CHARGER_AXP20X=y
+CONFIG_BATTERY_AXP20X=y
CONFIG_AXP20X_POWER=y
CONFIG_THERMAL=y
-CONFIG_THERMAL_OF=y
CONFIG_CPU_THERMAL=y
CONFIG_WATCHDOG=y
CONFIG_SUNXI_WATCHDOG=y
CONFIG_MFD_AC100=y
-CONFIG_MFD_AXP20X=y
CONFIG_MFD_AXP20X_I2C=y
CONFIG_MFD_AXP20X_RSB=y
CONFIG_REGULATOR=y
@@ -99,12 +96,9 @@ CONFIG_RC_CORE=y
CONFIG_RC_DEVICES=y
CONFIG_IR_SUNXI=y
CONFIG_DRM=y
-CONFIG_DRM_DUMB_VGA_DAC=y
CONFIG_DRM_SUN4I=y
-CONFIG_FB=y
+CONFIG_DRM_DUMB_VGA_DAC=y
CONFIG_FB_SIMPLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
@@ -130,12 +124,13 @@ CONFIG_RTC_CLASS=y
# CONFIG_RTC_INTF_SYSFS is not set
# CONFIG_RTC_INTF_PROC is not set
CONFIG_RTC_DRV_AC100=y
-CONFIG_RTC_DRV_SUN6I=y
CONFIG_RTC_DRV_SUNXI=y
CONFIG_DMADEVICES=y
CONFIG_DMA_SUN6I=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXTCON=y
+CONFIG_IIO=y
+CONFIG_AXP20X_ADC=y
CONFIG_PWM=y
CONFIG_PWM_SUN4I=y
CONFIG_PHY_SUN4I_USB=y
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig
index f0efc854b5a2..6678f2929356 100644
--- a/arch/arm/configs/tegra_defconfig
+++ b/arch/arm/configs/tegra_defconfig
@@ -121,7 +121,6 @@ CONFIG_TOUCHSCREEN_WM97XX=y
CONFIG_TOUCHSCREEN_STMPE=y
CONFIG_INPUT_MISC=y
# CONFIG_LEGACY_PTYS is not set
-# CONFIG_DEVKMEM is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
@@ -202,6 +201,8 @@ CONFIG_SND_HDA_CODEC_HDMI=y
# CONFIG_SND_USB is not set
CONFIG_SND_SOC=y
CONFIG_SND_SOC_TEGRA=y
+CONFIG_SND_SOC_TEGRA20_I2S=y
+CONFIG_SND_SOC_TEGRA30_I2S=y
CONFIG_SND_SOC_TEGRA_RT5640=y
CONFIG_SND_SOC_TEGRA_WM8753=y
CONFIG_SND_SOC_TEGRA_WM8903=y
@@ -218,6 +219,9 @@ CONFIG_USB_EHCI_TEGRA=y
CONFIG_USB_ACM=y
CONFIG_USB_WDM=y
CONFIG_USB_STORAGE=y
+CONFIG_USB_CHIPIDEA=y
+CONFIG_USB_CHIPIDEA_UDC=y
+CONFIG_USB_GADGET=y
CONFIG_MMC=y
CONFIG_MMC_BLOCK_MINORS=16
CONFIG_MMC_SDHCI=y
@@ -247,8 +251,6 @@ CONFIG_RTC_DRV_TEGRA=y
CONFIG_DMADEVICES=y
CONFIG_TEGRA20_APB_DMA=y
CONFIG_STAGING=y
-CONFIG_SENSORS_ISL29018=y
-CONFIG_SENSORS_ISL29028=y
CONFIG_MFD_NVEC=y
CONFIG_KEYBOARD_NVEC=y
CONFIG_SERIO_NVEC_PS2=y
@@ -263,6 +265,8 @@ CONFIG_ARCH_TEGRA_124_SOC=y
CONFIG_MEMORY=y
CONFIG_IIO=y
CONFIG_MPU3050_I2C=y
+CONFIG_SENSORS_ISL29018=y
+CONFIG_SENSORS_ISL29028=y
CONFIG_AK8975=y
CONFIG_PWM=y
CONFIG_PWM_TEGRA=y
@@ -288,13 +292,11 @@ CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_INFO=y
-CONFIG_DEBUG_FS=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SLAB=y
CONFIG_DEBUG_VM=y
CONFIG_DETECT_HUNG_TASK=y
CONFIG_SCHEDSTATS=y
-CONFIG_TIMER_STATS=y
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_SG=y
diff --git a/arch/arm/configs/vexpress_defconfig b/arch/arm/configs/vexpress_defconfig
index 0fa0ed577b15..edae1c58fe80 100644
--- a/arch/arm/configs/vexpress_defconfig
+++ b/arch/arm/configs/vexpress_defconfig
@@ -19,7 +19,6 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_IOSCHED_DEADLINE is not set
# CONFIG_IOSCHED_CFQ is not set
CONFIG_ARCH_VEXPRESS=y
-CONFIG_ARCH_VEXPRESS_CA9X4=y
CONFIG_ARCH_VEXPRESS_DCSCB=y
CONFIG_ARCH_VEXPRESS_TC2_PM=y
# CONFIG_SWP_EMULATE is not set
diff --git a/arch/arm/configs/viper_defconfig b/arch/arm/configs/viper_defconfig
index 44d4fa57ba0a..070e5074f1ee 100644
--- a/arch/arm/configs/viper_defconfig
+++ b/arch/arm/configs/viper_defconfig
@@ -113,7 +113,7 @@ CONFIG_FB_PXA_PARAMETERS=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_BACKLIGHT_PWM=m
# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=m
+CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
diff --git a/arch/arm/configs/zeus_defconfig b/arch/arm/configs/zeus_defconfig
index 8d4c0c926c34..09e7050d5653 100644
--- a/arch/arm/configs/zeus_defconfig
+++ b/arch/arm/configs/zeus_defconfig
@@ -112,7 +112,7 @@ CONFIG_FB_PXA=m
CONFIG_FB_PXA_PARAMETERS=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=m
+CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h
index bfe163c40024..5983f6bc62d5 100644
--- a/arch/arm/include/asm/smp_scu.h
+++ b/arch/arm/include/asm/smp_scu.h
@@ -7,6 +7,7 @@
#ifndef __ASSEMBLER__
+#include <linux/errno.h>
#include <asm/cputype.h>
static inline bool scu_a9_has_base(void)
diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h
index 6c7182f32cef..a61905c86732 100644
--- a/arch/arm/include/asm/suspend.h
+++ b/arch/arm/include/asm/suspend.h
@@ -1,6 +1,8 @@
#ifndef __ASM_ARM_SUSPEND_H
#define __ASM_ARM_SUSPEND_H
+#include <linux/types.h>
+
struct sleep_save_sp {
u32 *save_ptr_stash;
u32 save_ptr_stash_phys;
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index 1d468b527b7b..776757d1604a 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -139,11 +139,10 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
-#define TIF_FSCHECK 4 /* Check FS is USER_DS on return */
-#define TIF_SYSCALL_TRACE 5 /* syscall trace active */
-#define TIF_SYSCALL_AUDIT 6 /* syscall auditing active */
-#define TIF_SYSCALL_TRACEPOINT 7 /* syscall tracepoint instrumentation */
-#define TIF_SECCOMP 8 /* seccomp syscall filtering active */
+#define TIF_SYSCALL_TRACE 4 /* syscall trace active */
+#define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */
+#define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */
+#define TIF_SECCOMP 7 /* seccomp syscall filtering active */
#define TIF_NOHZ 12 /* in adaptive nohz mode */
#define TIF_USING_IWMMXT 17
@@ -154,7 +153,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
#define _TIF_UPROBE (1 << TIF_UPROBE)
-#define _TIF_FSCHECK (1 << TIF_FSCHECK)
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
@@ -168,9 +166,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
/*
* Change these and you break ASM code in entry-common.S
*/
-#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
- _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
- _TIF_FSCHECK)
+#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
+ _TIF_NOTIFY_RESUME | _TIF_UPROBE)
#endif /* __KERNEL__ */
#endif /* __ASM_ARM_THREAD_INFO_H */
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
index 87936dd5d151..0bf2347495f1 100644
--- a/arch/arm/include/asm/uaccess.h
+++ b/arch/arm/include/asm/uaccess.h
@@ -70,8 +70,6 @@ static inline void set_fs(mm_segment_t fs)
{
current_thread_info()->addr_limit = fs;
modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER);
- /* On user-mode return, check fs is correct */
- set_thread_flag(TIF_FSCHECK);
}
#define segment_eq(a, b) ((a) == (b))
diff --git a/arch/arm/include/debug/omap2plus.S b/arch/arm/include/debug/omap2plus.S
index 6d867aef18eb..192a7583999c 100644
--- a/arch/arm/include/debug/omap2plus.S
+++ b/arch/arm/include/debug/omap2plus.S
@@ -12,43 +12,6 @@
#include <linux/serial_reg.h>
-/* OMAP2 serial ports */
-#define OMAP2_UART1_BASE 0x4806a000
-#define OMAP2_UART2_BASE 0x4806c000
-#define OMAP2_UART3_BASE 0x4806e000
-
-/* OMAP3 serial ports */
-#define OMAP3_UART1_BASE OMAP2_UART1_BASE
-#define OMAP3_UART2_BASE OMAP2_UART2_BASE
-#define OMAP3_UART3_BASE 0x49020000
-#define OMAP3_UART4_BASE 0x49042000 /* Only on 36xx */
-#define OMAP3_UART4_AM35XX_BASE 0x4809E000 /* Only on AM35xx */
-
-/* OMAP4 serial ports */
-#define OMAP4_UART1_BASE OMAP2_UART1_BASE
-#define OMAP4_UART2_BASE OMAP2_UART2_BASE
-#define OMAP4_UART3_BASE 0x48020000
-#define OMAP4_UART4_BASE 0x4806e000
-
-/* TI81XX serial ports */
-#define TI81XX_UART1_BASE 0x48020000
-#define TI81XX_UART2_BASE 0x48022000
-#define TI81XX_UART3_BASE 0x48024000
-
-/* AM3505/3517 UART4 */
-#define AM35XX_UART4_BASE 0x4809E000 /* Only on AM3505/3517 */
-
-/* AM33XX serial port */
-#define AM33XX_UART1_BASE 0x44E09000
-
-/* OMAP5 serial ports */
-#define OMAP5_UART1_BASE OMAP2_UART1_BASE
-#define OMAP5_UART2_BASE OMAP2_UART2_BASE
-#define OMAP5_UART3_BASE OMAP4_UART3_BASE
-#define OMAP5_UART4_BASE OMAP4_UART4_BASE
-#define OMAP5_UART5_BASE 0x48066000
-#define OMAP5_UART6_BASE 0x48068000
-
/* External port on Zoom2/3 */
#define ZOOM_UART_BASE 0x10000000
#define ZOOM_UART_VIRT 0xfa400000
@@ -59,6 +22,7 @@
#define UART_OFFSET(addr) ((addr) & 0x00ffffff)
.pushsection .data
+ .align 2
omap_uart_phys: .word 0
omap_uart_virt: .word 0
omap_uart_lsr: .word 0
@@ -79,55 +43,6 @@ omap_uart_lsr: .word 0
bne 100f @ already configured
/* Configure the UART offset from the phys/virt base */
-#ifdef CONFIG_DEBUG_OMAP2UART1
- mov \rp, #UART_OFFSET(OMAP2_UART1_BASE) @ omap2/3/4
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP2UART2
- mov \rp, #UART_OFFSET(OMAP2_UART2_BASE) @ omap2/3/4
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP2UART3
- mov \rp, #UART_OFFSET(OMAP2_UART3_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP3UART3
- mov \rp, #UART_OFFSET(OMAP3_UART1_BASE)
- add \rp, \rp, #0x00fb0000
- add \rp, \rp, #0x00006000 @ OMAP3_UART3_BASE
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP4UART3
- mov \rp, #UART_OFFSET(OMAP4_UART3_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP3UART4
- mov \rp, #UART_OFFSET(OMAP3_UART1_BASE)
- add \rp, \rp, #0x00fb0000
- add \rp, \rp, #0x00028000 @ OMAP3_UART4_BASE
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_OMAP4UART4
- mov \rp, #UART_OFFSET(OMAP4_UART4_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_TI81XXUART1
- mov \rp, #UART_OFFSET(TI81XX_UART1_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_TI81XXUART2
- mov \rp, #UART_OFFSET(TI81XX_UART2_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_TI81XXUART3
- mov \rp, #UART_OFFSET(TI81XX_UART3_BASE)
- b 98f
-#endif
-#ifdef CONFIG_DEBUG_AM33XXUART1
- ldr \rp, =AM33XX_UART1_BASE
- and \rp, \rp, #0x00ffffff
- b 97f
-#endif
#ifdef CONFIG_DEBUG_ZOOM_UART
ldr \rp, =ZOOM_UART_BASE
str \rp, [\tmp, #0] @ omap_uart_phys
@@ -138,28 +53,6 @@ omap_uart_lsr: .word 0
#endif
b 10b
- /* AM33XX: Store both phys and virt address for the uart */
-97: add \rp, \rp, #0x44000000 @ phys base
- str \rp, [\tmp, #0] @ omap_uart_phys
- sub \rp, \rp, #0x44000000 @ phys base
- add \rp, \rp, #0xf9000000 @ virt base
- str \rp, [\tmp, #4] @ omap_uart_virt
- mov \rp, #(UART_LSR << OMAP_PORT_SHIFT)
- str \rp, [\tmp, #8] @ omap_uart_lsr
-
- b 10b
-
- /* Store both phys and virt address for the uart */
-98: add \rp, \rp, #0x48000000 @ phys base
- str \rp, [\tmp, #0] @ omap_uart_phys
- sub \rp, \rp, #0x48000000 @ phys base
- add \rp, \rp, #0xfa000000 @ virt base
- str \rp, [\tmp, #4] @ omap_uart_virt
- mov \rp, #(UART_LSR << OMAP_PORT_SHIFT)
- str \rp, [\tmp, #8] @ omap_uart_lsr
-
- b 10b
-
.align
99: .word .
.word omap_uart_phys
diff --git a/arch/arm/kernel/cpuidle.c b/arch/arm/kernel/cpuidle.c
index a3308ad1a024..fda5579123a8 100644
--- a/arch/arm/kernel/cpuidle.c
+++ b/arch/arm/kernel/cpuidle.c
@@ -101,8 +101,8 @@ static int __init arm_cpuidle_read_ops(struct device_node *dn, int cpu)
ops = arm_cpuidle_get_ops(enable_method);
if (!ops) {
- pr_warn("%s: unsupported enable-method property: %s\n",
- dn->full_name, enable_method);
+ pr_warn("%pOF: unsupported enable-method property: %s\n",
+ dn, enable_method);
return -EOPNOTSUPP;
}
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index f676febbb270..ecaa68dd1af5 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -95,7 +95,7 @@ void __init arm_dt_init_cpu_maps(void)
if (of_node_cmp(cpu->type, "cpu"))
continue;
- pr_debug(" * %s...\n", cpu->full_name);
+ pr_debug(" * %pOF...\n", cpu);
/*
* A device tree containing CPU nodes with missing "reg"
* properties is considered invalid to build the
@@ -103,8 +103,7 @@ void __init arm_dt_init_cpu_maps(void)
*/
cell = of_get_property(cpu, "reg", &prop_bytes);
if (!cell || prop_bytes < sizeof(*cell)) {
- pr_debug(" * %s missing reg property\n",
- cpu->full_name);
+ pr_debug(" * %pOF missing reg property\n", cpu);
of_node_put(cpu);
return;
}
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c731f0d2b2af..fbc707626b3e 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -721,6 +721,7 @@ do_fpe:
*/
.pushsection .data
+ .align 2
ENTRY(fp_enter)
.word no_fp
.popsection
@@ -1224,6 +1225,7 @@ vector_addrexcptn:
W(b) vector_fiq
.data
+ .align 2
.globl cr_alignment
cr_alignment:
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index e33c32d56193..99c908226065 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -12,6 +12,7 @@
#include <asm/unistd.h>
#include <asm/ftrace.h>
#include <asm/unwind.h>
+#include <asm/memory.h>
#ifdef CONFIG_AEABI
#include <asm/unistd-oabi.h>
#endif
@@ -27,6 +28,14 @@
#include "entry-header.S"
+saved_psr .req r8
+#if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING)
+saved_pc .req r9
+#define TRACE(x...) x
+#else
+saved_pc .req lr
+#define TRACE(x...)
+#endif
.align 5
#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING))
@@ -40,12 +49,14 @@ ret_fast_syscall:
UNWIND(.fnstart )
UNWIND(.cantunwind )
disable_irq_notrace @ disable interrupts
+ ldr r2, [tsk, #TI_ADDR_LIMIT]
+ cmp r2, #TASK_SIZE
+ blne addr_limit_check_failed
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
- tst r1, #_TIF_SYSCALL_WORK
- bne fast_work_pending
- tst r1, #_TIF_WORK_MASK
+ tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
bne fast_work_pending
+
/* perform architecture specific actions before user return */
arch_ret_to_user r1, lr
@@ -68,16 +79,16 @@ ret_fast_syscall:
UNWIND(.cantunwind )
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
disable_irq_notrace @ disable interrupts
+ ldr r2, [tsk, #TI_ADDR_LIMIT]
+ cmp r2, #TASK_SIZE
+ blne addr_limit_check_failed
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
- tst r1, #_TIF_SYSCALL_WORK
- bne fast_work_pending
- tst r1, #_TIF_WORK_MASK
+ tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
beq no_work_pending
UNWIND(.fnend )
ENDPROC(ret_fast_syscall)
/* Slower path - fall through to work_pending */
-fast_work_pending:
#endif
tst r1, #_TIF_SYSCALL_WORK
@@ -103,6 +114,9 @@ ENTRY(ret_to_user)
ret_slow_syscall:
disable_irq_notrace @ disable interrupts
ENTRY(ret_to_user_from_irq)
+ ldr r2, [tsk, #TI_ADDR_LIMIT]
+ cmp r2, #TASK_SIZE
+ blne addr_limit_check_failed
ldr r1, [tsk, #TI_FLAGS]
tst r1, #_TIF_WORK_MASK
bne slow_work_pending
@@ -146,16 +160,17 @@ ENTRY(vector_swi)
ARM( stmdb r8, {sp, lr}^ ) @ Calling sp, lr
THUMB( mov r8, sp )
THUMB( store_user_sp_lr r8, r10, S_SP ) @ calling sp, lr
- mrs r8, spsr @ called from non-FIQ mode, so ok.
- str lr, [sp, #S_PC] @ Save calling PC
- str r8, [sp, #S_PSR] @ Save CPSR
+ mrs saved_psr, spsr @ called from non-FIQ mode, so ok.
+ TRACE( mov saved_pc, lr )
+ str saved_pc, [sp, #S_PC] @ Save calling PC
+ str saved_psr, [sp, #S_PSR] @ Save CPSR
str r0, [sp, #S_OLD_R0] @ Save OLD_R0
#endif
zero_fp
alignment_trap r10, ip, __cr_alignment
- enable_irq
- ct_user_exit
- get_thread_info tsk
+ asm_trace_hardirqs_on save=0
+ enable_irq_notrace
+ ct_user_exit save=0
/*
* Get the system call number.
@@ -168,11 +183,11 @@ ENTRY(vector_swi)
* value to determine if it is an EABI or an old ABI call.
*/
#ifdef CONFIG_ARM_THUMB
- tst r8, #PSR_T_BIT
+ tst saved_psr, #PSR_T_BIT
movne r10, #0 @ no thumb OABI emulation
- USER( ldreq r10, [lr, #-4] ) @ get SWI instruction
+ USER( ldreq r10, [saved_pc, #-4] ) @ get SWI instruction
#else
- USER( ldr r10, [lr, #-4] ) @ get SWI instruction
+ USER( ldr r10, [saved_pc, #-4] ) @ get SWI instruction
#endif
ARM_BE8(rev r10, r10) @ little endian instruction
@@ -183,15 +198,17 @@ ENTRY(vector_swi)
*/
#elif defined(CONFIG_ARM_THUMB)
/* Legacy ABI only, possibly thumb mode. */
- tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs
+ tst saved_psr, #PSR_T_BIT @ this is SPSR from save_user_regs
addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in
- USER( ldreq scno, [lr, #-4] )
+ USER( ldreq scno, [saved_pc, #-4] )
#else
/* Legacy ABI only. */
- USER( ldr scno, [lr, #-4] ) @ get SWI instruction
+ USER( ldr scno, [saved_pc, #-4] ) @ get SWI instruction
#endif
+ /* saved_psr and saved_pc are now dead */
+
uaccess_disable tbl
adr tbl, sys_call_table @ load syscall table pointer
@@ -210,6 +227,12 @@ ENTRY(vector_swi)
bic scno, scno, #0xff000000 @ mask off SWI op-code
eor scno, scno, #__NR_SYSCALL_BASE @ check OS number
#endif
+ get_thread_info tsk
+ /*
+ * Reload the registers that may have been corrupted on entry to
+ * the syscall assembly (by tracing or context tracking.)
+ */
+ TRACE( ldmia sp, {r0 - r3} )
local_restart:
ldr r10, [tsk, #TI_FLAGS] @ check for syscall tracing
@@ -239,8 +262,9 @@ local_restart:
* current task.
*/
9001:
- sub lr, lr, #4
+ sub lr, saved_pc, #4
str lr, [sp, #S_PC]
+ get_thread_info tsk
b ret_fast_syscall
#endif
ENDPROC(vector_swi)
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 04286fd9e09c..6b1148cafffd 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -556,6 +556,7 @@ ENDPROC(__fixup_smp)
.word __smpalt_end
.pushsection .data
+ .align 2
.globl smp_on_up
smp_on_up:
ALT_SMP(.long 1)
@@ -716,6 +717,7 @@ ENTRY(fixup_pv_table)
ENDPROC(fixup_pv_table)
.data
+ .align 2
.globl __pv_phys_pfn_offset
.type __pv_phys_pfn_offset, %object
__pv_phys_pfn_offset:
diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
index ec7e7377d423..60146e32619a 100644
--- a/arch/arm/kernel/hyp-stub.S
+++ b/arch/arm/kernel/hyp-stub.S
@@ -31,6 +31,7 @@
* zeroing of .bss would clobber it.
*/
.data
+ .align 2
ENTRY(__boot_cpu_mode)
.long 0
.text
diff --git a/arch/arm/kernel/iwmmxt.S b/arch/arm/kernel/iwmmxt.S
index 49fadbda8c63..81cd4d43b3ec 100644
--- a/arch/arm/kernel/iwmmxt.S
+++ b/arch/arm/kernel/iwmmxt.S
@@ -367,6 +367,7 @@ ENTRY(iwmmxt_task_release)
ENDPROC(iwmmxt_task_release)
.data
+ .align 2
concan_owner:
.word 0
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index e2de50bf8742..b67ae12503f3 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -614,10 +614,6 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
* Update the trace code with the current status.
*/
trace_hardirqs_off();
-
- /* Check valid user FS if needed */
- addr_limit_user_check();
-
do {
if (likely(thread_flags & _TIF_NEED_RESCHED)) {
schedule();
@@ -678,3 +674,9 @@ struct page *get_signal_page(void)
return page;
}
+
+/* Defer to generic check */
+asmlinkage void addr_limit_check_failed(void)
+{
+ addr_limit_user_check();
+}
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 0f6c1000582c..9f08d214d05a 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -171,6 +171,7 @@ mpidr_hash_ptr:
.long mpidr_hash - . @ mpidr_hash struct offset
.data
+ .align 2
.type sleep_save_sp, #object
ENTRY(sleep_save_sp)
.space SLEEP_SAVE_SP_SZ @ struct sleep_save_sp
diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c
index 3a2fa203637a..65228bf4c6df 100644
--- a/arch/arm/kernel/stacktrace.c
+++ b/arch/arm/kernel/stacktrace.c
@@ -171,6 +171,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{
__save_stack_trace(tsk, trace, 1);
}
+EXPORT_SYMBOL(save_stack_trace_tsk);
void save_stack_trace(struct stack_trace *trace)
{
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
index bf949a763dbe..24ac3cab411d 100644
--- a/arch/arm/kernel/topology.c
+++ b/arch/arm/kernel/topology.c
@@ -127,8 +127,7 @@ static void __init parse_dt_topology(void)
rate = of_get_property(cn, "clock-frequency", &len);
if (!rate || len != 4) {
- pr_err("%s missing clock-frequency property\n",
- cn->full_name);
+ pr_err("%pOF missing clock-frequency property\n", cn);
continue;
}
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 195da38cb9a2..6d870421a7a6 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -26,6 +26,7 @@ config SOC_SAMA5D2
select HAVE_AT91_USB_CLK
select HAVE_AT91_H32MX
select HAVE_AT91_GENERATED_CLK
+ select HAVE_AT91_AUDIO_PLL
select PINCTRL_AT91PIO4
help
Select this if ou are using one of Atmel's SAMA5D2 family SoC.
@@ -125,6 +126,9 @@ config HAVE_AT91_H32MX
config HAVE_AT91_GENERATED_CLK
bool
+config HAVE_AT91_AUDIO_PLL
+ bool
+
config SOC_SAM_V4_V5
bool
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 5036f996e694..849014c01cf4 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -533,8 +533,8 @@ static void __init at91_pm_backup_init(void)
}
pm_bu->suspended = 0;
- pm_bu->canary = virt_to_phys(&canary);
- pm_bu->resume = virt_to_phys(cpu_resume);
+ pm_bu->canary = __pa_symbol(&canary);
+ pm_bu->resume = __pa_symbol(cpu_resume);
return;
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index e568c8c6f69c..cbde0030c092 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -26,7 +26,7 @@
#include <linux/input/tps6507x-ts.h>
#include <linux/mfd/tps6507x.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/platform_device.h>
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c
index 18296a99c4d2..62e7bc3018f0 100644
--- a/arch/arm/mach-davinci/board-dm355-evm.c
+++ b/arch/arm/mach-davinci/board-dm355-evm.c
@@ -14,7 +14,7 @@
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/clk.h>
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c
index 284ff27c1b32..be997243447b 100644
--- a/arch/arm/mach-davinci/board-dm355-leopard.c
+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
@@ -13,7 +13,7 @@
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/clk.h>
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c
index 0464999b7137..e75741fb2c1d 100644
--- a/arch/arm/mach-davinci/board-dm365-evm.c
+++ b/arch/arm/mach-davinci/board-dm365-evm.c
@@ -23,7 +23,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/slab.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/input.h>
#include <linux/spi/spi.h>
#include <linux/spi/eeprom.h>
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
index 70e00dbeec96..b07c9b18d427 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -17,7 +17,7 @@
#include <linux/platform_data/pcf857x.h>
#include <linux/platform_data/at24.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/phy.h>
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index 1d76e7480a42..cb0a41e83582 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -29,7 +29,7 @@
#include <media/i2c/adv7343.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/clk.h>
#include <linux/export.h>
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c
index 41c7c9615791..d85accf7f760 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -28,7 +28,7 @@
#include <linux/i2c.h>
#include <linux/platform_data/at24.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <asm/mach-types.h>
diff --git a/arch/arm/mach-dove/dove-db-setup.c b/arch/arm/mach-dove/dove-db-setup.c
index bcb678fd2415..8971c3c0f0fe 100644
--- a/arch/arm/mach-dove/dove-db-setup.c
+++ b/arch/arm/mach-dove/dove-db-setup.c
@@ -13,7 +13,7 @@
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/timer.h>
#include <linux/ata_platform.h>
#include <linux/mv643xx_eth.h>
diff --git a/arch/arm/mach-ep93xx/clock.c b/arch/arm/mach-ep93xx/clock.c
index beec5f16443a..d2eee707d27f 100644
--- a/arch/arm/mach-ep93xx/clock.c
+++ b/arch/arm/mach-ep93xx/clock.c
@@ -98,6 +98,13 @@ static struct clk clk_keypad = {
.enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
.set_rate = set_keytchclk_rate,
};
+static struct clk clk_adc = {
+ .parent = &clk_xtali,
+ .sw_locked = 1,
+ .enable_reg = EP93XX_SYSCON_KEYTCHCLKDIV,
+ .enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_TSEN,
+ .set_rate = set_keytchclk_rate,
+};
static struct clk clk_spi = {
.parent = &clk_xtali,
.rate = EP93XX_EXT_CLK_RATE,
@@ -214,6 +221,7 @@ static struct clk_lookup clocks[] = {
INIT_CK(NULL, "pll2", &clk_pll2),
INIT_CK("ohci-platform", NULL, &clk_usb_host),
INIT_CK("ep93xx-keypad", NULL, &clk_keypad),
+ INIT_CK("ep93xx-adc", NULL, &clk_adc),
INIT_CK("ep93xx-fb", NULL, &clk_video),
INIT_CK("ep93xx-spi.0", NULL, &clk_spi),
INIT_CK("ep93xx-i2s", "mclk", &clk_i2s_mclk),
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index c393b1b0310d..f53c61813998 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -821,6 +821,30 @@ void ep93xx_ide_release_gpio(struct platform_device *pdev)
EXPORT_SYMBOL(ep93xx_ide_release_gpio);
/*************************************************************************
+ * EP93xx ADC
+ *************************************************************************/
+static struct resource ep93xx_adc_resources[] = {
+ DEFINE_RES_MEM(EP93XX_ADC_PHYS_BASE, 0x28),
+ DEFINE_RES_IRQ(IRQ_EP93XX_TOUCH),
+};
+
+static struct platform_device ep93xx_adc_device = {
+ .name = "ep93xx-adc",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(ep93xx_adc_resources),
+ .resource = ep93xx_adc_resources,
+};
+
+void __init ep93xx_register_adc(void)
+{
+ /* Power up ADC, deactivate Touch Screen Controller */
+ ep93xx_devcfg_set_clear(EP93XX_SYSCON_DEVCFG_TIN,
+ EP93XX_SYSCON_DEVCFG_ADCPD);
+
+ platform_device_register(&ep93xx_adc_device);
+}
+
+/*************************************************************************
* EP93xx Security peripheral
*************************************************************************/
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c
index 0ac176386789..7a7f280b07d7 100644
--- a/arch/arm/mach-ep93xx/edb93xx.c
+++ b/arch/arm/mach-ep93xx/edb93xx.c
@@ -245,6 +245,7 @@ static void __init edb93xx_init_machine(void)
edb93xx_register_pwm();
edb93xx_register_fb();
edb93xx_register_ide();
+ ep93xx_register_adc();
}
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h
index 4c0bbd97f741..db0839691ef5 100644
--- a/arch/arm/mach-ep93xx/include/mach/platform.h
+++ b/arch/arm/mach-ep93xx/include/mach/platform.h
@@ -52,6 +52,7 @@ int ep93xx_i2s_acquire(void);
void ep93xx_i2s_release(void);
void ep93xx_register_ac97(void);
void ep93xx_register_ide(void);
+void ep93xx_register_adc(void);
int ep93xx_ide_acquire_gpio(struct platform_device *pdev);
void ep93xx_ide_release_gpio(struct platform_device *pdev);
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c
index b2db791b3b38..8b29398f4dc7 100644
--- a/arch/arm/mach-ep93xx/snappercl15.c
+++ b/arch/arm/mach-ep93xx/snappercl15.c
@@ -25,7 +25,7 @@
#include <linux/fb.h>
#include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <mach/hardware.h>
#include <linux/platform_data/video-ep93xx.h>
diff --git a/arch/arm/mach-ep93xx/soc.h b/arch/arm/mach-ep93xx/soc.h
index 7bf7ff8beae7..d20e631164cf 100644
--- a/arch/arm/mach-ep93xx/soc.h
+++ b/arch/arm/mach-ep93xx/soc.h
@@ -95,6 +95,7 @@
#define EP93XX_KEY_MATRIX_PHYS_BASE EP93XX_APB_PHYS(0x000f0000)
#define EP93XX_KEY_MATRIX_BASE EP93XX_APB_IOMEM(0x000f0000)
+#define EP93XX_ADC_PHYS_BASE EP93XX_APB_PHYS(0x00100000)
#define EP93XX_ADC_BASE EP93XX_APB_IOMEM(0x00100000)
#define EP93XX_TOUCHSCREEN_BASE EP93XX_APB_IOMEM(0x00100000)
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 55b186ef863a..8745162ec05d 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -16,7 +16,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/io.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <mach/hardware.h>
diff --git a/arch/arm/mach-exynos/sleep.S b/arch/arm/mach-exynos/sleep.S
index cf950790fbdc..4292cae43f3c 100644
--- a/arch/arm/mach-exynos/sleep.S
+++ b/arch/arm/mach-exynos/sleep.S
@@ -124,6 +124,7 @@ _cp15_save_diag:
#endif /* CONFIG_CACHE_L2X0 */
.data
+ .align 2
.globl cp15_save_diag
cp15_save_diag:
.long 0 @ cp15 diagnostic
diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c
index 748cfb8d5212..b529ba04ed16 100644
--- a/arch/arm/mach-exynos/suspend.c
+++ b/arch/arm/mach-exynos/suspend.c
@@ -187,21 +187,20 @@ static int __init exynos_pmu_irq_init(struct device_node *node,
struct irq_domain *parent_domain, *domain;
if (!parent) {
- pr_err("%s: no parent, giving up\n", node->full_name);
+ pr_err("%pOF: no parent, giving up\n", node);
return -ENODEV;
}
parent_domain = irq_find_host(parent);
if (!parent_domain) {
- pr_err("%s: unable to obtain parent domain\n", node->full_name);
+ pr_err("%pOF: unable to obtain parent domain\n", node);
return -ENXIO;
}
pmu_base_addr = of_iomap(node, 0);
if (!pmu_base_addr) {
- pr_err("%s: failed to find exynos pmu register\n",
- node->full_name);
+ pr_err("%pOF: failed to find exynos pmu register\n", node);
return -ENOMEM;
}
diff --git a/arch/arm/mach-gemini/Kconfig b/arch/arm/mach-gemini/Kconfig
index 06c8b095154c..70106b67631c 100644
--- a/arch/arm/mach-gemini/Kconfig
+++ b/arch/arm/mach-gemini/Kconfig
@@ -1,11 +1,16 @@
menuconfig ARCH_GEMINI
bool "Cortina Systems Gemini"
depends on ARCH_MULTI_V4
+ select ARCH_HAS_RESET_CONTROLLER
+ select ARM_AMBA
select ARM_APPENDED_DTB # Old Redboot bootloaders deployed
+ select COMMON_CLK_GEMINI
select FARADAY_FTINTC010
select FTTMR010_TIMER
select GPIO_FTGPIO010
select GPIOLIB
+ select PINCTRL
+ select PINCTRL_GEMINI
select POWER_RESET
select POWER_RESET_GEMINI_POWEROFF
select POWER_RESET_SYSCON
diff --git a/arch/arm/mach-hisi/platsmp.c b/arch/arm/mach-hisi/platsmp.c
index 91bb02dec20f..da5689ababf7 100644
--- a/arch/arm/mach-hisi/platsmp.c
+++ b/arch/arm/mach-hisi/platsmp.c
@@ -109,7 +109,7 @@ static void hix5hd2_set_scu_boot_addr(phys_addr_t start_addr, phys_addr_t jump_a
virt = ioremap(start_addr, PAGE_SIZE);
- writel_relaxed(0xe51ff004, virt); /* ldr pc, [rc, #-4] */
+ writel_relaxed(0xe51ff004, virt); /* ldr pc, [pc, #-4] */
writel_relaxed(jump_addr, virt + 4); /* pc jump phy address */
iounmap(virt);
}
diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c
index 93f584ba0130..de535cb679b3 100644
--- a/arch/arm/mach-imx/gpc.c
+++ b/arch/arm/mach-imx/gpc.c
@@ -224,13 +224,13 @@ static int __init imx_gpc_init(struct device_node *node,
int i;
if (!parent) {
- pr_err("%s: no parent, giving up\n", node->full_name);
+ pr_err("%pOF: no parent, giving up\n", node);
return -ENODEV;
}
parent_domain = irq_find_host(parent);
if (!parent_domain) {
- pr_err("%s: unable to obtain parent domain\n", node->full_name);
+ pr_err("%pOF: unable to obtain parent domain\n", node);
return -ENXIO;
}
diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
index dd75a4756761..5169dfba9718 100644
--- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
+++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
@@ -245,7 +245,6 @@ static phys_addr_t mx2_camera_base __initdata;
static void __init visstrim_analog_camera_init(void)
{
struct platform_device *pdev;
- int dma;
gpio_set_value(TVP5150_PWDN, 1);
ndelay(1);
@@ -258,12 +257,9 @@ static void __init visstrim_analog_camera_init(void)
if (IS_ERR(pdev))
return;
- dma = dma_declare_coherent_memory(&pdev->dev,
- mx2_camera_base, mx2_camera_base,
- MX2_CAMERA_BUF_SIZE,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
- if (!(dma & DMA_MEMORY_MAP))
- return;
+ dma_declare_coherent_memory(&pdev->dev, mx2_camera_base,
+ mx2_camera_base, MX2_CAMERA_BUF_SIZE,
+ DMA_MEMORY_EXCLUSIVE);
}
static void __init visstrim_reserve(void)
@@ -444,16 +440,13 @@ static const struct imx_ssi_platform_data visstrim_m10_ssi_pdata __initconst = {
static void __init visstrim_coda_init(void)
{
struct platform_device *pdev;
- int dma;
pdev = imx27_add_coda();
- dma = dma_declare_coherent_memory(&pdev->dev,
- mx2_camera_base + MX2_CAMERA_BUF_SIZE,
- mx2_camera_base + MX2_CAMERA_BUF_SIZE,
- MX2_CAMERA_BUF_SIZE,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
- if (!(dma & DMA_MEMORY_MAP))
- return;
+ dma_declare_coherent_memory(&pdev->dev,
+ mx2_camera_base + MX2_CAMERA_BUF_SIZE,
+ mx2_camera_base + MX2_CAMERA_BUF_SIZE,
+ MX2_CAMERA_BUF_SIZE,
+ DMA_MEMORY_EXCLUSIVE);
}
/* DMA deinterlace */
@@ -466,24 +459,21 @@ static void __init visstrim_deinterlace_init(void)
{
int ret = -ENOMEM;
struct platform_device *pdev = &visstrim_deinterlace;
- int dma;
ret = platform_device_register(pdev);
- dma = dma_declare_coherent_memory(&pdev->dev,
- mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
- mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
- MX2_CAMERA_BUF_SIZE,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
- if (!(dma & DMA_MEMORY_MAP))
- return;
+ dma_declare_coherent_memory(&pdev->dev,
+ mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
+ mx2_camera_base + 2 * MX2_CAMERA_BUF_SIZE,
+ MX2_CAMERA_BUF_SIZE,
+ DMA_MEMORY_EXCLUSIVE);
}
/* Emma-PrP for format conversion */
static void __init visstrim_emmaprp_init(void)
{
struct platform_device *pdev;
- int dma;
+ int ret;
pdev = imx27_add_mx2_emmaprp();
if (IS_ERR(pdev))
@@ -493,11 +483,11 @@ static void __init visstrim_emmaprp_init(void)
* Use the same memory area as the analog camera since both
* devices are, by nature, exclusive.
*/
- dma = dma_declare_coherent_memory(&pdev->dev,
+ ret = dma_declare_coherent_memory(&pdev->dev,
mx2_camera_base, mx2_camera_base,
MX2_CAMERA_BUF_SIZE,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
- if (!(dma & DMA_MEMORY_MAP))
+ DMA_MEMORY_EXCLUSIVE);
+ if (ret)
pr_err("Failed to declare memory for emmaprp\n");
}
diff --git a/arch/arm/mach-imx/mach-mx31moboard.c b/arch/arm/mach-imx/mach-mx31moboard.c
index bde9a9af6714..7716f83aecdd 100644
--- a/arch/arm/mach-imx/mach-mx31moboard.c
+++ b/arch/arm/mach-imx/mach-mx31moboard.c
@@ -475,7 +475,7 @@ static phys_addr_t mx3_camera_base __initdata;
static int __init mx31moboard_init_cam(void)
{
- int dma, ret = -ENOMEM;
+ int ret;
struct platform_device *pdev;
imx31_add_ipu_core();
@@ -484,11 +484,11 @@ static int __init mx31moboard_init_cam(void)
if (IS_ERR(pdev))
return PTR_ERR(pdev);
- dma = dma_declare_coherent_memory(&pdev->dev,
- mx3_camera_base, mx3_camera_base,
- MX3_CAMERA_BUF_SIZE,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
- if (!(dma & DMA_MEMORY_MAP))
+ ret = dma_declare_coherent_memory(&pdev->dev,
+ mx3_camera_base, mx3_camera_base,
+ MX3_CAMERA_BUF_SIZE,
+ DMA_MEMORY_EXCLUSIVE);
+ if (ret)
goto err;
ret = platform_device_add(pdev);
diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c
index 8c2cbd693d21..42a700053103 100644
--- a/arch/arm/mach-imx/mach-qong.c
+++ b/arch/arm/mach-imx/mach-qong.c
@@ -18,7 +18,7 @@
#include <linux/memory.h>
#include <linux/platform_device.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c
index 508c2d7786e2..93b89291c06b 100644
--- a/arch/arm/mach-ixp4xx/ixdp425-setup.c
+++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c
@@ -17,7 +17,7 @@
#include <linux/i2c-gpio.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>
#include <linux/gpio.h>
diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c
index c3cf215773b2..6910b4e0d913 100644
--- a/arch/arm/mach-mediatek/mediatek.c
+++ b/arch/arm/mach-mediatek/mediatek.c
@@ -30,6 +30,7 @@ static void __init mediatek_timer_init(void)
if (of_machine_is_compatible("mediatek,mt6589") ||
of_machine_is_compatible("mediatek,mt7623") ||
+ of_machine_is_compatible("mediatek,mt7623a") ||
of_machine_is_compatible("mediatek,mt8135") ||
of_machine_is_compatible("mediatek,mt8127")) {
/* turn on GPT6 which ungates arch timer clocks */
@@ -49,6 +50,7 @@ static const char * const mediatek_board_dt_compat[] = {
"mediatek,mt6589",
"mediatek,mt6592",
"mediatek,mt7623",
+ "mediatek,mt7623a",
"mediatek,mt8127",
"mediatek,mt8135",
NULL,
diff --git a/arch/arm/mach-mediatek/platsmp.c b/arch/arm/mach-mediatek/platsmp.c
index 726eb69bb655..27d78c945caf 100644
--- a/arch/arm/mach-mediatek/platsmp.c
+++ b/arch/arm/mach-mediatek/platsmp.c
@@ -59,6 +59,7 @@ static const struct of_device_id mtk_tz_smp_boot_infos[] __initconst = {
static const struct of_device_id mtk_smp_boot_infos[] __initconst = {
{ .compatible = "mediatek,mt6589", .data = &mtk_mt6589_boot },
{ .compatible = "mediatek,mt7623", .data = &mtk_mt7623_boot },
+ { .compatible = "mediatek,mt7623a", .data = &mtk_mt7623_boot },
};
static void __iomem *mtk_smp_base;
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c
index 5db0edf716dd..d2283009a5ff 100644
--- a/arch/arm/mach-mmp/aspenite.c
+++ b/arch/arm/mach-mmp/aspenite.c
@@ -16,7 +16,7 @@
#include <linux/smc91x.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/interrupt.h>
#include <linux/platform_data/mv_usb.h>
diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
index 541647f57192..9b49867154bf 100644
--- a/arch/arm/mach-mvebu/Kconfig
+++ b/arch/arm/mach-mvebu/Kconfig
@@ -60,6 +60,8 @@ config MACH_ARMADA_38X
select ARM_ERRATA_720789
select ARM_ERRATA_753970
select ARM_GIC
+ select ARM_GLOBAL_TIMER
+ select CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
select ARMADA_370_XP_IRQ
select ARMADA_38X_CLK
select HAVE_ARM_SCU
diff --git a/arch/arm/mach-mvebu/kirkwood.c b/arch/arm/mach-mvebu/kirkwood.c
index 7d9f2fd9e450..0aa88105d46e 100644
--- a/arch/arm/mach-mvebu/kirkwood.c
+++ b/arch/arm/mach-mvebu/kirkwood.c
@@ -107,8 +107,7 @@ static void __init kirkwood_dt_eth_fixup(void)
clk_prepare_enable(clk);
/* store MAC address register contents in local-mac-address */
- pr_err(FW_INFO "%s: local-mac-address is not set\n",
- np->full_name);
+ pr_err(FW_INFO "%pOF: local-mac-address is not set\n", np);
pmac = kzalloc(sizeof(*pmac) + 6, GFP_KERNEL);
if (!pmac)
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c
index fad95b74bb65..b93ad58b0a63 100644
--- a/arch/arm/mach-omap1/board-fsample.c
+++ b/arch/arm/mach-omap1/board-fsample.c
@@ -16,7 +16,7 @@
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c
index dece47d76282..6a38c7603064 100644
--- a/arch/arm/mach-omap1/board-h2.c
+++ b/arch/arm/mach-omap1/board-h2.c
@@ -24,7 +24,7 @@
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index 6d32beeb2d88..302260583e8e 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -23,7 +23,7 @@
#include <linux/workqueue.h>
#include <linux/i2c.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-omap1/board-nand.c b/arch/arm/mach-omap1/board-nand.c
index 7684f9203474..1bffbb4e050f 100644
--- a/arch/arm/mach-omap1/board-nand.c
+++ b/arch/arm/mach-omap1/board-nand.c
@@ -16,7 +16,7 @@
#include <linux/kernel.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include "common.h"
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c
index 150b57ba42bf..e994a78bdd09 100644
--- a/arch/arm/mach-omap1/board-perseus2.c
+++ b/arch/arm/mach-omap1/board-perseus2.c
@@ -16,7 +16,7 @@
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 0465338183c7..e31a5a22e171 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -87,6 +87,7 @@ config SOC_DRA7XX
select OMAP_INTERCONNECT_BARRIER
select PM_OPP if PM
select ZONE_DMA if ARM_LPAE
+ select PINCTRL_TI_IODELAY if OF && PINCTRL
config ARCH_OMAP2PLUS
bool
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 583fc39d84cd..6c61ecc62905 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -313,6 +313,7 @@ MACHINE_END
#ifdef CONFIG_SOC_DRA7XX
static const char *const dra74x_boards_compat[] __initconst = {
+ "ti,dra762",
"ti,am5728",
"ti,am5726",
"ti,dra742",
diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c
index 0b77a0176018..694ce0939d50 100644
--- a/arch/arm/mach-omap2/dma.c
+++ b/arch/arm/mach-omap2/dma.c
@@ -204,61 +204,6 @@ static unsigned configure_dma_errata(void)
return errata;
}
-static const struct dma_slave_map omap24xx_sdma_map[] = {
- { "omap-gpmc", "rxtx", SDMA_FILTER_PARAM(4) },
- { "omap-aes", "tx", SDMA_FILTER_PARAM(9) },
- { "omap-aes", "rx", SDMA_FILTER_PARAM(10) },
- { "omap-sham", "rx", SDMA_FILTER_PARAM(13) },
- { "omap2_mcspi.2", "tx0", SDMA_FILTER_PARAM(15) },
- { "omap2_mcspi.2", "rx0", SDMA_FILTER_PARAM(16) },
- { "omap-mcbsp.3", "tx", SDMA_FILTER_PARAM(17) },
- { "omap-mcbsp.3", "rx", SDMA_FILTER_PARAM(18) },
- { "omap-mcbsp.4", "tx", SDMA_FILTER_PARAM(19) },
- { "omap-mcbsp.4", "rx", SDMA_FILTER_PARAM(20) },
- { "omap-mcbsp.5", "tx", SDMA_FILTER_PARAM(21) },
- { "omap-mcbsp.5", "rx", SDMA_FILTER_PARAM(22) },
- { "omap2_mcspi.2", "tx1", SDMA_FILTER_PARAM(23) },
- { "omap2_mcspi.2", "rx1", SDMA_FILTER_PARAM(24) },
- { "omap_i2c.1", "tx", SDMA_FILTER_PARAM(27) },
- { "omap_i2c.1", "rx", SDMA_FILTER_PARAM(28) },
- { "omap_i2c.2", "tx", SDMA_FILTER_PARAM(29) },
- { "omap_i2c.2", "rx", SDMA_FILTER_PARAM(30) },
- { "omap-mcbsp.1", "tx", SDMA_FILTER_PARAM(31) },
- { "omap-mcbsp.1", "rx", SDMA_FILTER_PARAM(32) },
- { "omap-mcbsp.2", "tx", SDMA_FILTER_PARAM(33) },
- { "omap-mcbsp.2", "rx", SDMA_FILTER_PARAM(34) },
- { "omap2_mcspi.0", "tx0", SDMA_FILTER_PARAM(35) },
- { "omap2_mcspi.0", "rx0", SDMA_FILTER_PARAM(36) },
- { "omap2_mcspi.0", "tx1", SDMA_FILTER_PARAM(37) },
- { "omap2_mcspi.0", "rx1", SDMA_FILTER_PARAM(38) },
- { "omap2_mcspi.0", "tx2", SDMA_FILTER_PARAM(39) },
- { "omap2_mcspi.0", "rx2", SDMA_FILTER_PARAM(40) },
- { "omap2_mcspi.0", "tx3", SDMA_FILTER_PARAM(41) },
- { "omap2_mcspi.0", "rx3", SDMA_FILTER_PARAM(42) },
- { "omap2_mcspi.1", "tx0", SDMA_FILTER_PARAM(43) },
- { "omap2_mcspi.1", "rx0", SDMA_FILTER_PARAM(44) },
- { "omap2_mcspi.1", "tx1", SDMA_FILTER_PARAM(45) },
- { "omap2_mcspi.1", "rx1", SDMA_FILTER_PARAM(46) },
- { "omap_hsmmc.1", "tx", SDMA_FILTER_PARAM(47) },
- { "omap_hsmmc.1", "rx", SDMA_FILTER_PARAM(48) },
- { "omap_uart.0", "tx", SDMA_FILTER_PARAM(49) },
- { "omap_uart.0", "rx", SDMA_FILTER_PARAM(50) },
- { "omap_uart.1", "tx", SDMA_FILTER_PARAM(51) },
- { "omap_uart.1", "rx", SDMA_FILTER_PARAM(52) },
- { "omap_uart.2", "tx", SDMA_FILTER_PARAM(53) },
- { "omap_uart.2", "rx", SDMA_FILTER_PARAM(54) },
- { "omap_hsmmc.0", "tx", SDMA_FILTER_PARAM(61) },
- { "omap_hsmmc.0", "rx", SDMA_FILTER_PARAM(62) },
-
- /* external DMA requests when tusb6010 is used */
- { "musb-tusb", "dmareq0", SDMA_FILTER_PARAM(2) },
- { "musb-tusb", "dmareq1", SDMA_FILTER_PARAM(3) },
- { "musb-tusb", "dmareq2", SDMA_FILTER_PARAM(14) }, /* OMAP2420 only */
- { "musb-tusb", "dmareq3", SDMA_FILTER_PARAM(15) }, /* OMAP2420 only */
- { "musb-tusb", "dmareq4", SDMA_FILTER_PARAM(16) }, /* OMAP2420 only */
- { "musb-tusb", "dmareq5", SDMA_FILTER_PARAM(64) }, /* OMAP2420 only */
-};
-
static const struct dma_slave_map omap24xx_sdma_dt_map[] = {
/* external DMA requests when tusb6010 is used */
{ "musb-hdrc.1.auto", "dmareq0", SDMA_FILTER_PARAM(2) },
@@ -269,61 +214,6 @@ static const struct dma_slave_map omap24xx_sdma_dt_map[] = {
{ "musb-hdrc.1.auto", "dmareq5", SDMA_FILTER_PARAM(64) }, /* OMAP2420 only */
};
-static const struct dma_slave_map omap3xxx_sdma_map[] = {
- { "omap-gpmc", "rxtx", SDMA_FILTER_PARAM(4) },
- { "omap2_mcspi.2", "tx0", SDMA_FILTER_PARAM(15) },
- { "omap2_mcspi.2", "rx0", SDMA_FILTER_PARAM(16) },
- { "omap-mcbsp.3", "tx", SDMA_FILTER_PARAM(17) },
- { "omap-mcbsp.3", "rx", SDMA_FILTER_PARAM(18) },
- { "omap-mcbsp.4", "tx", SDMA_FILTER_PARAM(19) },
- { "omap-mcbsp.4", "rx", SDMA_FILTER_PARAM(20) },
- { "omap-mcbsp.5", "tx", SDMA_FILTER_PARAM(21) },
- { "omap-mcbsp.5", "rx", SDMA_FILTER_PARAM(22) },
- { "omap2_mcspi.2", "tx1", SDMA_FILTER_PARAM(23) },
- { "omap2_mcspi.2", "rx1", SDMA_FILTER_PARAM(24) },
- { "omap_i2c.3", "tx", SDMA_FILTER_PARAM(25) },
- { "omap_i2c.3", "rx", SDMA_FILTER_PARAM(26) },
- { "omap_i2c.1", "tx", SDMA_FILTER_PARAM(27) },
- { "omap_i2c.1", "rx", SDMA_FILTER_PARAM(28) },
- { "omap_i2c.2", "tx", SDMA_FILTER_PARAM(29) },
- { "omap_i2c.2", "rx", SDMA_FILTER_PARAM(30) },
- { "omap-mcbsp.1", "tx", SDMA_FILTER_PARAM(31) },
- { "omap-mcbsp.1", "rx", SDMA_FILTER_PARAM(32) },
- { "omap-mcbsp.2", "tx", SDMA_FILTER_PARAM(33) },
- { "omap-mcbsp.2", "rx", SDMA_FILTER_PARAM(34) },
- { "omap2_mcspi.0", "tx0", SDMA_FILTER_PARAM(35) },
- { "omap2_mcspi.0", "rx0", SDMA_FILTER_PARAM(36) },
- { "omap2_mcspi.0", "tx1", SDMA_FILTER_PARAM(37) },
- { "omap2_mcspi.0", "rx1", SDMA_FILTER_PARAM(38) },
- { "omap2_mcspi.0", "tx2", SDMA_FILTER_PARAM(39) },
- { "omap2_mcspi.0", "rx2", SDMA_FILTER_PARAM(40) },
- { "omap2_mcspi.0", "tx3", SDMA_FILTER_PARAM(41) },
- { "omap2_mcspi.0", "rx3", SDMA_FILTER_PARAM(42) },
- { "omap2_mcspi.1", "tx0", SDMA_FILTER_PARAM(43) },
- { "omap2_mcspi.1", "rx0", SDMA_FILTER_PARAM(44) },
- { "omap2_mcspi.1", "tx1", SDMA_FILTER_PARAM(45) },
- { "omap2_mcspi.1", "rx1", SDMA_FILTER_PARAM(46) },
- { "omap_hsmmc.1", "tx", SDMA_FILTER_PARAM(47) },
- { "omap_hsmmc.1", "rx", SDMA_FILTER_PARAM(48) },
- { "omap_uart.0", "tx", SDMA_FILTER_PARAM(49) },
- { "omap_uart.0", "rx", SDMA_FILTER_PARAM(50) },
- { "omap_uart.1", "tx", SDMA_FILTER_PARAM(51) },
- { "omap_uart.1", "rx", SDMA_FILTER_PARAM(52) },
- { "omap_uart.2", "tx", SDMA_FILTER_PARAM(53) },
- { "omap_uart.2", "rx", SDMA_FILTER_PARAM(54) },
- { "omap_hsmmc.0", "tx", SDMA_FILTER_PARAM(61) },
- { "omap_hsmmc.0", "rx", SDMA_FILTER_PARAM(62) },
- { "omap-aes", "tx", SDMA_FILTER_PARAM(65) },
- { "omap-aes", "rx", SDMA_FILTER_PARAM(66) },
- { "omap-sham", "rx", SDMA_FILTER_PARAM(69) },
- { "omap2_mcspi.3", "tx0", SDMA_FILTER_PARAM(70) },
- { "omap2_mcspi.3", "rx0", SDMA_FILTER_PARAM(71) },
- { "omap_hsmmc.2", "tx", SDMA_FILTER_PARAM(77) },
- { "omap_hsmmc.2", "rx", SDMA_FILTER_PARAM(78) },
- { "omap_uart.3", "tx", SDMA_FILTER_PARAM(81) },
- { "omap_uart.3", "rx", SDMA_FILTER_PARAM(82) },
-};
-
static struct omap_system_dma_plat_info dma_plat_info __initdata = {
.reg_map = reg_map,
.channel_stride = 0x60,
@@ -352,24 +242,10 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
p.dma_attr = (struct omap_dma_dev_attr *)oh->dev_attr;
p.errata = configure_dma_errata();
- if (!of_have_populated_dt()) {
- if (soc_is_omap24xx()) {
- p.slave_map = omap24xx_sdma_map;
- p.slavecnt = ARRAY_SIZE(omap24xx_sdma_map);
- } else if (soc_is_omap34xx() || soc_is_omap3630()) {
- p.slave_map = omap3xxx_sdma_map;
- p.slavecnt = ARRAY_SIZE(omap3xxx_sdma_map);
- } else {
- pr_err("%s: The legacy DMA map is not provided!\n",
- __func__);
- return -ENODEV;
- }
- } else {
- if (soc_is_omap24xx()) {
- /* DMA slave map for drivers not yet converted to DT */
- p.slave_map = omap24xx_sdma_dt_map;
- p.slavecnt = ARRAY_SIZE(omap24xx_sdma_dt_map);
- }
+ if (soc_is_omap24xx()) {
+ /* DMA slave map for drivers not yet converted to DT */
+ p.slave_map = omap24xx_sdma_dt_map;
+ p.slavecnt = ARRAY_SIZE(omap24xx_sdma_dt_map);
}
pdev = omap_device_build(name, 0, oh, &p, sizeof(p));
@@ -413,21 +289,7 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
static int __init omap2_system_dma_init(void)
{
- struct platform_device *pdev;
- int res;
-
- res = omap_hwmod_for_each_by_class("dma",
+ return omap_hwmod_for_each_by_class("dma",
omap2_system_dma_init_dev, NULL);
- if (res)
- return res;
-
- if (of_have_populated_dt())
- return res;
-
- pdev = platform_device_register_full(&omap_dma_dev_info);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
-
- return res;
}
omap_arch_initcall(omap2_system_dma_init);
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 5b614388d72f..6d28aa20a7d3 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -58,10 +58,10 @@ void omap_hsmmc_late_init(struct omap2_hsmmc_info *c)
struct platform_device *pdev;
int res;
- if (omap_hsmmc_done != 1)
+ if (omap_hsmmc_done)
return;
- omap_hsmmc_done++;
+ omap_hsmmc_done = 1;
for (; c->mmc; c++) {
pdev = c->pdev;
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index e2274a162b74..16cb1c195fd8 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -663,6 +663,15 @@ void __init dra7xxx_check_revision(void)
hawkeye = (idcode >> 12) & 0xffff;
rev = (idcode >> 28) & 0xff;
switch (hawkeye) {
+ case 0xbb50:
+ switch (rev) {
+ case 0:
+ default:
+ omap_revision = DRA762_REV_ES1_0;
+ break;
+ }
+ break;
+
case 0xb990:
switch (rev) {
case 0:
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
index 33e4953c61a8..69df3620eca5 100644
--- a/arch/arm/mach-omap2/omap-smp.c
+++ b/arch/arm/mach-omap2/omap-smp.c
@@ -342,7 +342,7 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
c = &omap443x_cfg;
else if (soc_is_omap446x())
c = &omap446x_cfg;
- else if (soc_is_dra74x() || soc_is_omap54xx())
+ else if (soc_is_dra74x() || soc_is_omap54xx() || soc_is_dra76x())
c = &omap5_cfg;
if (!c) {
@@ -355,7 +355,7 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
cfg.startup_addr = c->startup_addr;
cfg.wakeupgen_base = omap_get_wakeupgen_base();
- if (soc_is_dra74x() || soc_is_omap54xx()) {
+ if (soc_is_dra74x() || soc_is_omap54xx() || soc_is_dra76x()) {
if ((__boot_cpu_mode & MODE_MASK) == HYP_MODE)
cfg.startup_addr = omap5_secondary_hyp_startup;
omap5_erratum_workaround_801819();
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c
index 33ed5d53fa45..4bb6751864a5 100644
--- a/arch/arm/mach-omap2/omap-wakeupgen.c
+++ b/arch/arm/mach-omap2/omap-wakeupgen.c
@@ -522,13 +522,13 @@ static int __init wakeupgen_init(struct device_node *node,
u32 val;
if (!parent) {
- pr_err("%s: no parent, giving up\n", node->full_name);
+ pr_err("%pOF: no parent, giving up\n", node);
return -ENODEV;
}
parent_domain = irq_find_host(parent);
if (!parent_domain) {
- pr_err("%s: unable to obtain parent domain\n", node->full_name);
+ pr_err("%pOF: unable to obtain parent domain\n", node);
return -ENXIO;
}
/* Not supported on OMAP4 ES1.0 silicon */
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c
index ef9ffb8ac912..acbede082b5b 100644
--- a/arch/arm/mach-omap2/omap_device.c
+++ b/arch/arm/mach-omap2/omap_device.c
@@ -672,7 +672,6 @@ static int _od_suspend_noirq(struct device *dev)
if (!ret && !pm_runtime_status_suspended(dev)) {
if (pm_generic_runtime_suspend(dev) == 0) {
- pm_runtime_set_suspended(dev);
omap_device_idle(pdev);
od->flags |= OMAP_DEVICE_SUSPENDED;
}
@@ -689,15 +688,6 @@ static int _od_resume_noirq(struct device *dev)
if (od->flags & OMAP_DEVICE_SUSPENDED) {
od->flags &= ~OMAP_DEVICE_SUSPENDED;
omap_device_enable(pdev);
- /*
- * XXX: we run before core runtime pm has resumed itself. At
- * this point in time, we just restore the runtime pm state and
- * considering symmetric operations in resume, we donot expect
- * to fail. If we failed, something changed in core runtime_pm
- * framework OR some device driver messed things up, hence, WARN
- */
- WARN(pm_runtime_set_active(dev),
- "Could not set %s runtime state active\n", dev_name(dev));
pm_generic_runtime_resume(dev);
}
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 3b47ded5fa0c..2dbd63239c54 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -2417,8 +2417,8 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
if (mem)
pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
else
- pr_err("omap_hwmod: %s: Missing dt reg%i for %s\n",
- oh->name, index, np->full_name);
+ pr_err("omap_hwmod: %s: Missing dt reg%i for %pOF\n",
+ oh->name, index, np);
return -ENXIO;
}
diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
index b3abb8d8b2f6..2f4f7002f38d 100644
--- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
@@ -839,6 +839,7 @@ static struct omap_hwmod dra7xx_gpio1_hwmod = {
.name = "gpio1",
.class = &dra7xx_gpio_hwmod_class,
.clkdm_name = "wkupaon_clkdm",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.main_clk = "wkupaon_iclk_mux",
.prcm = {
.omap4 = {
@@ -4070,6 +4071,11 @@ static struct omap_hwmod_ocp_if *dra7xx_gp_hwmod_ocp_ifs[] __initdata = {
};
/* SoC variant specific hwmod links */
+static struct omap_hwmod_ocp_if *dra76x_hwmod_ocp_ifs[] __initdata = {
+ &dra7xx_l4_per3__usb_otg_ss4,
+ NULL,
+};
+
static struct omap_hwmod_ocp_if *dra74x_hwmod_ocp_ifs[] __initdata = {
&dra7xx_l4_per3__usb_otg_ss4,
NULL,
@@ -4095,12 +4101,14 @@ int __init dra7xx_hwmod_init(void)
ret = omap_hwmod_register_links(dra74x_hwmod_ocp_ifs);
else if (!ret && soc_is_dra72x())
ret = omap_hwmod_register_links(dra72x_hwmod_ocp_ifs);
+ else if (!ret && soc_is_dra76x())
+ ret = omap_hwmod_register_links(dra76x_hwmod_ocp_ifs);
if (!ret && omap_type() == OMAP2_DEVICE_TYPE_GP)
ret = omap_hwmod_register_links(dra7xx_gp_hwmod_ocp_ifs);
- /* now for the IPs *NOT* in dra71 */
- if (!ret && !of_machine_is_compatible("ti,dra718"))
+ /* now for the IPs available only in dra74 and dra72 */
+ if (!ret && !of_machine_is_compatible("ti,dra718") && !soc_is_dra76x())
ret = omap_hwmod_register_links(dra74x_dra72x_hwmod_ocp_ifs);
return ret;
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
index 9700a8ef0f16..6b433fce65a5 100644
--- a/arch/arm/mach-omap2/pdata-quirks.c
+++ b/arch/arm/mach-omap2/pdata-quirks.c
@@ -434,6 +434,26 @@ static void __init omap5_uevm_legacy_init(void)
}
#endif
+#ifdef CONFIG_SOC_DRA7XX
+static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc1;
+static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc2;
+static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc3;
+
+static void __init dra7x_evm_mmc_quirk(void)
+{
+ if (omap_rev() == DRA752_REV_ES1_1 || omap_rev() == DRA752_REV_ES1_0) {
+ dra7_hsmmc_data_mmc1.version = "rev11";
+ dra7_hsmmc_data_mmc1.max_freq = 96000000;
+
+ dra7_hsmmc_data_mmc2.version = "rev11";
+ dra7_hsmmc_data_mmc2.max_freq = 48000000;
+
+ dra7_hsmmc_data_mmc3.version = "rev11";
+ dra7_hsmmc_data_mmc3.max_freq = 48000000;
+ }
+}
+#endif
+
static struct pcs_pdata pcs_pdata;
void omap_pcs_legacy_init(int irq, void (*rearm)(void))
@@ -561,6 +581,14 @@ static struct of_dev_auxdata omap_auxdata_lookup[] __initdata = {
OF_DEV_AUXDATA("ti,omap4-iommu", 0x55082000, "55082000.mmu",
&omap4_iommu_pdata),
#endif
+#ifdef CONFIG_SOC_DRA7XX
+ OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x4809c000, "4809c000.mmc",
+ &dra7_hsmmc_data_mmc1),
+ OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x480b4000, "480b4000.mmc",
+ &dra7_hsmmc_data_mmc2),
+ OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x480ad000, "480ad000.mmc",
+ &dra7_hsmmc_data_mmc3),
+#endif
/* Common auxdata */
OF_DEV_AUXDATA("pinctrl-single", 0, NULL, &pcs_pdata),
{ /* sentinel */ },
@@ -590,6 +618,9 @@ static struct pdata_init pdata_quirks[] __initdata = {
#ifdef CONFIG_SOC_OMAP5
{ "ti,omap5-uevm", omap5_uevm_legacy_init, },
#endif
+#ifdef CONFIG_SOC_DRA7XX
+ { "ti,dra7-evm", dra7x_evm_mmc_quirk, },
+#endif
{ /* sentinel */ },
};
diff --git a/arch/arm/mach-omap2/powerdomains7xx_data.c b/arch/arm/mach-omap2/powerdomains7xx_data.c
index eb350a673133..f50963916a21 100644
--- a/arch/arm/mach-omap2/powerdomains7xx_data.c
+++ b/arch/arm/mach-omap2/powerdomains7xx_data.c
@@ -29,6 +29,7 @@
#include "prcm44xx.h"
#include "prm7xx.h"
#include "prcm_mpu7xx.h"
+#include "soc.h"
/* iva_7xx_pwrdm: IVA-HD power domain */
static struct powerdomain iva_7xx_pwrdm = {
@@ -63,6 +64,14 @@ static struct powerdomain custefuse_7xx_pwrdm = {
.flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
};
+/* custefuse_aon_7xx_pwrdm: Customer efuse controller power domain */
+static struct powerdomain custefuse_aon_7xx_pwrdm = {
+ .name = "custefuse_pwrdm",
+ .prcm_offs = DRA7XX_PRM_CUSTEFUSE_INST,
+ .prcm_partition = DRA7XX_PRM_PARTITION,
+ .pwrsts = PWRSTS_ON,
+};
+
/* ipu_7xx_pwrdm: Audio back end power domain */
static struct powerdomain ipu_7xx_pwrdm = {
.name = "ipu_pwrdm",
@@ -350,7 +359,6 @@ static struct powerdomain eve1_7xx_pwrdm = {
static struct powerdomain *powerdomains_dra7xx[] __initdata = {
&iva_7xx_pwrdm,
&rtc_7xx_pwrdm,
- &custefuse_7xx_pwrdm,
&ipu_7xx_pwrdm,
&dss_7xx_pwrdm,
&l4per_7xx_pwrdm,
@@ -374,9 +382,32 @@ static struct powerdomain *powerdomains_dra7xx[] __initdata = {
NULL
};
+static struct powerdomain *powerdomains_dra76x[] __initdata = {
+ &custefuse_aon_7xx_pwrdm,
+ NULL
+};
+
+static struct powerdomain *powerdomains_dra74x[] __initdata = {
+ &custefuse_7xx_pwrdm,
+ NULL
+};
+
+static struct powerdomain *powerdomains_dra72x[] __initdata = {
+ &custefuse_aon_7xx_pwrdm,
+ NULL
+};
+
void __init dra7xx_powerdomains_init(void)
{
pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
pwrdm_register_pwrdms(powerdomains_dra7xx);
+
+ if (soc_is_dra76x())
+ pwrdm_register_pwrdms(powerdomains_dra76x);
+ else if (soc_is_dra74x())
+ pwrdm_register_pwrdms(powerdomains_dra74x);
+ else if (soc_is_dra72x())
+ pwrdm_register_pwrdms(powerdomains_dra72x);
+
pwrdm_complete_init();
}
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c
index 64f6451499a7..a2dd13217c89 100644
--- a/arch/arm/mach-omap2/prm3xxx.c
+++ b/arch/arm/mach-omap2/prm3xxx.c
@@ -706,7 +706,7 @@ static int omap3xxx_prm_late_init(void)
np = of_find_matching_node(NULL, omap3_prm_dt_match_table);
if (np) {
irq_num = of_irq_get(np, 0);
- if (irq_num >= 0)
+ if (irq_num > 0)
omap3_prcm_irq_setup.irq = irq_num;
}
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c
index 3ab5df1ce900..1c0c1663f078 100644
--- a/arch/arm/mach-omap2/prm44xx.c
+++ b/arch/arm/mach-omap2/prm44xx.c
@@ -747,7 +747,7 @@ static int omap44xx_prm_late_init(void)
* Already have OMAP4 IRQ num. For all other platforms, we need
* IRQ numbers from DT
*/
- if (irq_num < 0 && !(prm_init_data->flags & PRM_IRQ_DEFAULT)) {
+ if (irq_num <= 0 && !(prm_init_data->flags & PRM_IRQ_DEFAULT)) {
if (irq_num == -EPROBE_DEFER)
return irq_num;
@@ -756,7 +756,7 @@ static int omap44xx_prm_late_init(void)
}
/* Once OMAP4 DT is filled as well */
- if (irq_num >= 0) {
+ if (irq_num > 0) {
omap4_prcm_irq_setup.irq = irq_num;
omap4_prcm_irq_setup.xlate_irq = NULL;
}
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index 1b9f0520dea9..fa5fd24f524c 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -530,10 +530,12 @@ l2dis_3630_offset:
.long l2dis_3630 - .
.data
+ .align 2
l2dis_3630:
.word 0
.data
+ .align 2
l2_inv_api_params:
.word 0x1, 0x00
diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep44xx.S
index c7a3b4aab4b5..56dfa2d5d0a8 100644
--- a/arch/arm/mach-omap2/sleep44xx.S
+++ b/arch/arm/mach-omap2/sleep44xx.S
@@ -385,6 +385,7 @@ ppa_zero_params_offset:
ENDPROC(omap_do_wfi)
.data
+ .align 2
ppa_zero_params:
.word 0
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h
index 2aa01c270898..754cd0fc0e7b 100644
--- a/arch/arm/mach-omap2/soc.h
+++ b/arch/arm/mach-omap2/soc.h
@@ -167,6 +167,7 @@ IS_TI_SUBCLASS(816x, 0x816)
IS_TI_SUBCLASS(814x, 0x814)
IS_AM_SUBCLASS(335x, 0x335)
IS_AM_SUBCLASS(437x, 0x437)
+IS_DRA_SUBCLASS(76x, 0x76)
IS_DRA_SUBCLASS(75x, 0x75)
IS_DRA_SUBCLASS(72x, 0x72)
@@ -185,6 +186,7 @@ IS_DRA_SUBCLASS(72x, 0x72)
#define soc_is_omap54xx() 0
#define soc_is_omap543x() 0
#define soc_is_dra7xx() 0
+#define soc_is_dra76x() 0
#define soc_is_dra74x() 0
#define soc_is_dra72x() 0
@@ -314,9 +316,11 @@ IS_OMAP_TYPE(3430, 0x3430)
#if defined(CONFIG_SOC_DRA7XX)
#undef soc_is_dra7xx
+#undef soc_is_dra76x
#undef soc_is_dra74x
#undef soc_is_dra72x
#define soc_is_dra7xx() is_dra7xx()
+#define soc_is_dra76x() is_dra76x()
#define soc_is_dra74x() is_dra75x()
#define soc_is_dra72x() is_dra72x()
#endif
@@ -386,6 +390,7 @@ IS_OMAP_TYPE(3430, 0x3430)
#define OMAP5432_REV_ES2_0 (OMAP54XX_CLASS | (0x32 << 16) | (0x20 << 8))
#define DRA7XX_CLASS 0x07000000
+#define DRA762_REV_ES1_0 (DRA7XX_CLASS | (0x62 << 16) | (0x10 << 8))
#define DRA752_REV_ES1_0 (DRA7XX_CLASS | (0x52 << 16) | (0x10 << 8))
#define DRA752_REV_ES1_1 (DRA7XX_CLASS | (0x52 << 16) | (0x11 << 8))
#define DRA752_REV_ES2_0 (DRA7XX_CLASS | (0x52 << 16) | (0x20 << 8))
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c
index 12f74b46e2ff..3f5863de766a 100644
--- a/arch/arm/mach-orion5x/db88f5281-setup.c
+++ b/arch/arm/mach-orion5x/db88f5281-setup.c
@@ -16,7 +16,7 @@
#include <linux/pci.h>
#include <linux/irq.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/timer.h>
#include <linux/mv643xx_eth.h>
#include <linux/i2c.h>
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c
index 9dc3f59bed9c..83d43cff4bd7 100644
--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
+++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
@@ -15,7 +15,7 @@
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mv643xx_eth.h>
#include <linux/i2c.h>
#include <linux/serial_reg.h>
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c
index 7bd671b2854c..0c315515dd2d 100644
--- a/arch/arm/mach-orion5x/ts209-setup.c
+++ b/arch/arm/mach-orion5x/ts209-setup.c
@@ -15,7 +15,7 @@
#include <linux/pci.h>
#include <linux/irq.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mv643xx_eth.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c
index 7ef80a8304c0..94778739e38f 100644
--- a/arch/arm/mach-orion5x/ts78xx-setup.c
+++ b/arch/arm/mach-orion5x/ts78xx-setup.c
@@ -16,7 +16,7 @@
#include <linux/platform_device.h>
#include <linux/mv643xx_eth.h>
#include <linux/ata_platform.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/timeriomem-rng.h>
#include <asm/mach-types.h>
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c
index 1467c1d1e541..d6d92f388f14 100644
--- a/arch/arm/mach-pxa/balloon3.c
+++ b/arch/arm/mach-pxa/balloon3.c
@@ -29,7 +29,7 @@
#include <linux/types.h>
#include <linux/platform_data/pcf857x.h>
#include <linux/i2c/pxa-i2c.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/physmap.h>
#include <linux/regulator/max1586.h>
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 811a7317f3ea..6d28035ebba5 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -15,7 +15,7 @@
#include <linux/dm9000.h>
#include <linux/platform_data/rtc-v3020.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/input.h>
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c
index fa9d71d194f0..91f7c3e40065 100644
--- a/arch/arm/mach-pxa/eseries.c
+++ b/arch/arm/mach-pxa/eseries.c
@@ -20,7 +20,7 @@
#include <linux/mfd/tc6387xb.h>
#include <linux/mfd/tc6393xb.h>
#include <linux/mfd/t7l66xb.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/usb/gpio_vbus.h>
#include <linux/memblock.h>
diff --git a/arch/arm/mach-pxa/mioa701_bootresume.S b/arch/arm/mach-pxa/mioa701_bootresume.S
index 81591491ab94..42d93f40a59f 100644
--- a/arch/arm/mach-pxa/mioa701_bootresume.S
+++ b/arch/arm/mach-pxa/mioa701_bootresume.S
@@ -16,6 +16,7 @@
* insist on it to be truly read-only.
*/
.data
+ .align 2
ENTRY(mioa701_bootstrap)
0:
b 1f
@@ -34,4 +35,5 @@ ENTRY(mioa701_jumpaddr)
ENTRY(mioa701_bootstrap_lg)
.data
+ .align 2
.word 2b-0b
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index 36646975b5d2..47e3e38e9bec 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -28,7 +28,7 @@
#include <linux/wm97xx.h>
#include <linux/power_supply.h>
#include <linux/usb/gpio_vbus.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/physmap.h>
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
index 13de6602966f..6a386fd6363e 100644
--- a/arch/arm/mach-pxa/tosa.c
+++ b/arch/arm/mach-pxa/tosa.c
@@ -24,7 +24,7 @@
#include <linux/mmc/host.h>
#include <linux/mfd/tc6393xb.h>
#include <linux/mfd/tmio.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/pm.h>
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index 9ad84cd01ba0..a4065966881a 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -3,6 +3,7 @@ config ARCH_ROCKCHIP
depends on ARCH_MULTI_V7
select PINCTRL
select PINCTRL_ROCKCHIP
+ select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
select ARCH_HAS_RESET_CONTROLLER
select ARM_AMBA
select ARM_GIC
@@ -16,6 +17,7 @@ config ARCH_ROCKCHIP
select ROCKCHIP_TIMER
select ARM_GLOBAL_TIMER
select CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
+ select ZONE_DMA if ARM_LPAE
help
Support for Rockchip's Cortex-A9 Single-to-Quad-Core-SoCs
containing the RK2928, RK30xx and RK31xx series.
diff --git a/arch/arm/mach-rockchip/platsmp.c b/arch/arm/mach-rockchip/platsmp.c
index 3abafdbdd7f4..ecec340ca345 100644
--- a/arch/arm/mach-rockchip/platsmp.c
+++ b/arch/arm/mach-rockchip/platsmp.c
@@ -67,7 +67,7 @@ static struct reset_control *rockchip_get_core_reset(int cpu)
else
np = of_get_cpu_node(cpu, NULL);
- return of_reset_control_get(np, NULL);
+ return of_reset_control_get_exclusive(np, NULL);
}
static int pmu_set_power_domain(int pd, bool on)
@@ -182,8 +182,8 @@ static int __init rockchip_smp_prepare_sram(struct device_node *node)
ret = of_address_to_resource(node, 0, &res);
if (ret < 0) {
- pr_err("%s: could not get address for node %s\n",
- __func__, node->full_name);
+ pr_err("%s: could not get address for node %pOF\n",
+ __func__, node);
return ret;
}
diff --git a/arch/arm/mach-rockchip/sleep.S b/arch/arm/mach-rockchip/sleep.S
index 2eec9a341f05..9927f06f52fe 100644
--- a/arch/arm/mach-rockchip/sleep.S
+++ b/arch/arm/mach-rockchip/sleep.S
@@ -23,7 +23,7 @@
* ddr to sram for system resumeing.
* so it is ".data section".
*/
-.align
+ .align 2
ENTRY(rockchip_slp_cpu_resume)
setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1 @ set svc, irqs off
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
index f07da82ebfea..b198be7d32b6 100644
--- a/arch/arm/mach-s3c24xx/Kconfig
+++ b/arch/arm/mach-s3c24xx/Kconfig
@@ -229,7 +229,7 @@ config ARCH_H1940
config H1940BT
tristate "Control the state of H1940 bluetooth chip"
depends on ARCH_H1940
- select RFKILL
+ depends on RFKILL
help
This is a simple driver that is able to control
the state of built in bluetooth chip on h1940.
diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c
index 9e0bc46e90ec..0e116c92bf01 100644
--- a/arch/arm/mach-s3c24xx/common-smdk.c
+++ b/arch/arm/mach-s3c24xx/common-smdk.c
@@ -23,7 +23,7 @@
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/io.h>
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index b59f4f4f256f..5b6b94ef41e2 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -173,7 +173,7 @@ static unsigned long s3c24xx_read_idcode_v5(void)
return gs;
#endif
-#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
+#if defined(CONFIG_CPU_S3C2412)
return __raw_readl(S3C2412_GSTATUS1);
#else
return 1UL; /* don't look like an 2400 */
diff --git a/arch/arm/mach-s3c24xx/include/mach/regs-clock.h b/arch/arm/mach-s3c24xx/include/mach/regs-clock.h
index 3db6c10de023..ae4a3e0f3ba2 100644
--- a/arch/arm/mach-s3c24xx/include/mach/regs-clock.h
+++ b/arch/arm/mach-s3c24xx/include/mach/regs-clock.h
@@ -77,7 +77,7 @@
#endif /* CONFIG_CPU_S3C2440 or CONFIG_CPU_S3C2442 */
-#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
+#if defined(CONFIG_CPU_S3C2412)
#define S3C2412_OSCSET S3C2410_CLKREG(0x18)
#define S3C2412_CLKSRC S3C2410_CLKREG(0x1C)
@@ -141,7 +141,7 @@
#define S3C2412_CLKSRC_UREFCLK_EXTCLK (1<<12)
#define S3C2412_CLKSRC_EREFCLK_EXTCLK (1<<14)
-#endif /* CONFIG_CPU_S3C2412 | CONFIG_CPU_S3C2413 */
+#endif /* CONFIG_CPU_S3C2412 */
#define S3C2416_CLKDIV2 S3C2410_CLKREG(0x28)
diff --git a/arch/arm/mach-s3c24xx/mach-anubis.c b/arch/arm/mach-s3c24xx/mach-anubis.c
index 029ef1b58925..c14cab361922 100644
--- a/arch/arm/mach-s3c24xx/mach-anubis.c
+++ b/arch/arm/mach-s3c24xx/mach-anubis.c
@@ -40,7 +40,7 @@
#include <linux/platform_data/i2c-s3c2410.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c
index 7b28eb623fc1..ebdbafb9382a 100644
--- a/arch/arm/mach-s3c24xx/mach-at2440evb.c
+++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c
@@ -41,7 +41,7 @@
#include <linux/platform_data/i2c-s3c2410.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-bast.c b/arch/arm/mach-s3c24xx/mach-bast.c
index 5185036765db..704dc84b3480 100644
--- a/arch/arm/mach-s3c24xx/mach-bast.c
+++ b/arch/arm/mach-s3c24xx/mach-bast.c
@@ -28,7 +28,7 @@
#include <linux/serial_8250.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c
index b0ed401da3a3..afe18baf0c84 100644
--- a/arch/arm/mach-s3c24xx/mach-gta02.c
+++ b/arch/arm/mach-s3c24xx/mach-gta02.c
@@ -50,7 +50,7 @@
#include <linux/mfd/pcf50633/pmic.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
diff --git a/arch/arm/mach-s3c24xx/mach-jive.c b/arch/arm/mach-s3c24xx/mach-jive.c
index f5b5c49b56ac..17821976f769 100644
--- a/arch/arm/mach-s3c24xx/mach-jive.c
+++ b/arch/arm/mach-s3c24xx/mach-jive.c
@@ -43,7 +43,7 @@
#include <asm/mach-types.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c
index 71af8d2fd320..04c9f488c498 100644
--- a/arch/arm/mach-s3c24xx/mach-mini2440.c
+++ b/arch/arm/mach-s3c24xx/mach-mini2440.c
@@ -49,7 +49,7 @@
#include <linux/platform_data/usb-s3c2410_udc.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
@@ -287,7 +287,7 @@ static struct s3c2410_platform_nand mini2440_nand_info __initdata = {
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
- .ecc_mode = NAND_ECC_SOFT,
+ .ecc_mode = NAND_ECC_HW,
};
/* DM9000AEP 10/100 ethernet controller */
diff --git a/arch/arm/mach-s3c24xx/mach-osiris.c b/arch/arm/mach-s3c24xx/mach-osiris.c
index 64b1a0b7b803..ed3b22ceef06 100644
--- a/arch/arm/mach-s3c24xx/mach-osiris.c
+++ b/arch/arm/mach-s3c24xx/mach-osiris.c
@@ -36,7 +36,7 @@
#include <linux/platform_data/i2c-s3c2410.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c
index 868c82087403..84e3a9c53184 100644
--- a/arch/arm/mach-s3c24xx/mach-qt2410.c
+++ b/arch/arm/mach-s3c24xx/mach-qt2410.c
@@ -36,7 +36,7 @@
#include <linux/spi/spi_gpio.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-rx3715.c b/arch/arm/mach-s3c24xx/mach-rx3715.c
index a39fb9780dd3..b5ba615cf9dd 100644
--- a/arch/arm/mach-s3c24xx/mach-rx3715.c
+++ b/arch/arm/mach-s3c24xx/mach-rx3715.c
@@ -27,7 +27,7 @@
#include <linux/serial.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2443.c b/arch/arm/mach-s3c24xx/mach-smdk2443.c
index 87fe5c5b8073..474cd81aa8ad 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2443.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2443.c
@@ -111,9 +111,6 @@ static struct platform_device *smdk2443_devices[] __initdata = {
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_hsmmc1,
-#ifdef CONFIG_SND_SOC_SMDK2443_WM9710
- &s3c_device_ac97,
-#endif
&s3c2443_device_dma,
};
@@ -133,11 +130,6 @@ static void __init smdk2443_init_time(void)
static void __init smdk2443_machine_init(void)
{
s3c_i2c0_set_platdata(NULL);
-
-#ifdef CONFIG_SND_SOC_SMDK2443_WM9710
- s3c24xx_ac97_setup_gpio(S3C24XX_AC97_GPE0);
-#endif
-
platform_add_devices(smdk2443_devices, ARRAY_SIZE(smdk2443_devices));
smdk_machine_init();
}
diff --git a/arch/arm/mach-s3c24xx/mach-vstms.c b/arch/arm/mach-s3c24xx/mach-vstms.c
index f5e6322145fa..1adc957edf0f 100644
--- a/arch/arm/mach-s3c24xx/mach-vstms.c
+++ b/arch/arm/mach-s3c24xx/mach-vstms.c
@@ -20,7 +20,7 @@
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/memblock.h>
diff --git a/arch/arm/mach-s3c24xx/sleep.S b/arch/arm/mach-s3c24xx/sleep.S
index d833d616bd2e..b859268fa8da 100644
--- a/arch/arm/mach-s3c24xx/sleep.S
+++ b/arch/arm/mach-s3c24xx/sleep.S
@@ -33,10 +33,11 @@
#include <mach/regs-gpio.h>
#include <mach/regs-clock.h>
-/* CONFIG_DEBUG_RESUME is dangerous if your bootloader does not
+/*
+ * S3C24XX_DEBUG_RESUME is dangerous if your bootloader does not
* reset the UART configuration, only enable if you really need this!
-*/
-//#define CONFIG_DEBUG_RESUME
+ */
+//#define S3C24XX_DEBUG_RESUME
.text
@@ -71,13 +72,13 @@ ENTRY(s3c_cpu_resume)
str r12, [ r14, #0x54 ]
#endif
-#ifdef CONFIG_DEBUG_RESUME
+#ifdef S3C24XX_DEBUG_RESUME
mov r3, #'L'
strb r3, [ r2, #S3C2410_UTXH ]
1001:
ldrb r14, [ r3, #S3C2410_UTRSTAT ]
tst r14, #S3C2410_UTRSTAT_TXE
beq 1001b
-#endif /* CONFIG_DEBUG_RESUME */
+#endif /* S3C24XX_DEBUG_RESUME */
b cpu_resume
diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig
index ad7d604ff001..280e7312a9e1 100644
--- a/arch/arm/mach-shmobile/Kconfig
+++ b/arch/arm/mach-shmobile/Kconfig
@@ -1,9 +1,6 @@
config ARCH_SHMOBILE
bool
-config ARCH_SHMOBILE_MULTI
- bool
-
config PM_RMOBILE
bool
select PM
@@ -34,7 +31,6 @@ menuconfig ARCH_RENESAS
depends on ARCH_MULTI_V7 && MMU
select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
select ARCH_SHMOBILE
- select ARCH_SHMOBILE_MULTI
select ARM_GIC
select GPIOLIB
select HAVE_ARM_SCU if SMP
diff --git a/arch/arm/mach-shmobile/pm-rcar-gen2.c b/arch/arm/mach-shmobile/pm-rcar-gen2.c
index 0178da7ace82..e5f215c8b218 100644
--- a/arch/arm/mach-shmobile/pm-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/pm-rcar-gen2.c
@@ -11,7 +11,9 @@
*/
#include <linux/kernel.h>
+#include <linux/ioport.h>
#include <linux/of.h>
+#include <linux/of_address.h>
#include <linux/smp.h>
#include <linux/soc/renesas/rcar-sysc.h>
#include <asm/io.h>
@@ -69,8 +71,9 @@ void __init rcar_gen2_pm_init(void)
struct device_node *np, *cpus;
bool has_a7 = false;
bool has_a15 = false;
- phys_addr_t boot_vector_addr = ICRAM1;
+ struct resource res;
u32 syscier = 0;
+ int error;
if (once++)
return;
@@ -91,14 +94,38 @@ void __init rcar_gen2_pm_init(void)
else if (of_machine_is_compatible("renesas,r8a7791"))
syscier = 0x00111003;
+ np = of_find_compatible_node(NULL, NULL, "renesas,smp-sram");
+ if (!np) {
+ /* No smp-sram in DT, fall back to hardcoded address */
+ res = (struct resource)DEFINE_RES_MEM(ICRAM1,
+ shmobile_boot_size);
+ goto map;
+ }
+
+ error = of_address_to_resource(np, 0, &res);
+ if (error) {
+ pr_err("Failed to get smp-sram address: %d\n", error);
+ return;
+ }
+
+map:
/* RAM for jump stub, because BAR requires 256KB aligned address */
- p = ioremap_nocache(boot_vector_addr, shmobile_boot_size);
+ if (res.start & (256 * 1024 - 1) ||
+ resource_size(&res) < shmobile_boot_size) {
+ pr_err("Invalid smp-sram region\n");
+ return;
+ }
+
+ p = ioremap(res.start, resource_size(&res));
+ if (!p)
+ return;
+
memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
iounmap(p);
/* setup reset vectors */
p = ioremap_nocache(RST, 0x63);
- bar = phys_to_sbar(boot_vector_addr);
+ bar = phys_to_sbar(res.start);
if (has_a15) {
writel_relaxed(bar, p + CA15BAR);
writel_relaxed(bar | SBAR_BAREN, p + CA15BAR);
diff --git a/arch/arm/mach-shmobile/pm-rmobile.c b/arch/arm/mach-shmobile/pm-rmobile.c
index 699429f28b73..3a4ed4c33a68 100644
--- a/arch/arm/mach-shmobile/pm-rmobile.c
+++ b/arch/arm/mach-shmobile/pm-rmobile.c
@@ -195,8 +195,7 @@ static void __init add_special_pd(struct device_node *np, enum pd_types type)
return;
}
- pr_debug("Special PM domain %s type %d for %s\n", pd->name, type,
- np->full_name);
+ pr_debug("Special PM domain %s type %d for %pOF\n", pd->name, type, np);
special_pds[num_special_pds].pd = pd;
special_pds[num_special_pds].type = type;
@@ -331,13 +330,13 @@ static int __init rmobile_init_pm_domains(void)
for_each_compatible_node(np, NULL, "renesas,sysc-rmobile") {
base = of_iomap(np, 0);
if (!base) {
- pr_warn("%s cannot map reg 0\n", np->full_name);
+ pr_warn("%pOF cannot map reg 0\n", np);
continue;
}
pmd = of_get_child_by_name(np, "pm-domains");
if (!pmd) {
- pr_warn("%s lacks pm-domains node\n", np->full_name);
+ pr_warn("%pOF lacks pm-domains node\n", np);
continue;
}
diff --git a/arch/arm/mach-shmobile/setup-rcar-gen2.c b/arch/arm/mach-shmobile/setup-rcar-gen2.c
index a6e74f481dea..7ab1690fab82 100644
--- a/arch/arm/mach-shmobile/setup-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/setup-rcar-gen2.c
@@ -29,17 +29,29 @@
#include "common.h"
#include "rcar-gen2.h"
+static const struct of_device_id cpg_matches[] __initconst = {
+ { .compatible = "renesas,rcar-gen2-cpg-clocks", },
+ { .compatible = "renesas,r8a7743-cpg-mssr", .data = "extal" },
+ { .compatible = "renesas,r8a7790-cpg-mssr", .data = "extal" },
+ { .compatible = "renesas,r8a7791-cpg-mssr", .data = "extal" },
+ { .compatible = "renesas,r8a7793-cpg-mssr", .data = "extal" },
+ { /* sentinel */ }
+};
+
static unsigned int __init get_extal_freq(void)
{
+ const struct of_device_id *match;
struct device_node *cpg, *extal;
u32 freq = 20000000;
+ int idx = 0;
- cpg = of_find_compatible_node(NULL, NULL,
- "renesas,rcar-gen2-cpg-clocks");
+ cpg = of_find_matching_node_and_match(NULL, cpg_matches, &match);
if (!cpg)
return freq;
- extal = of_parse_phandle(cpg, "clocks", 0);
+ if (match->data)
+ idx = of_property_match_string(cpg, "clock-names", match->data);
+ extal = of_parse_phandle(cpg, "clocks", idx);
of_node_put(cpg);
if (!extal)
return freq;
@@ -58,7 +70,8 @@ void __init rcar_gen2_timer_init(void)
void __iomem *base;
u32 freq;
- if (of_machine_is_compatible("renesas,r8a7792") ||
+ if (of_machine_is_compatible("renesas,r8a7745") ||
+ of_machine_is_compatible("renesas,r8a7792") ||
of_machine_is_compatible("renesas,r8a7794")) {
freq = 260000000 / 8; /* ZS / 8 */
/* CNTVOFF has to be initialized either from non-secure
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 329f01c5b6f8..c8368d647741 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -13,5 +13,7 @@ menuconfig ARCH_TEGRA
select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER
select SOC_BUS
+ select ZONE_DMA if ARM_LPAE
+ select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
help
This enables support for NVIDIA Tegra based systems.
diff --git a/arch/arm/mach-tegra/tegra.c b/arch/arm/mach-tegra/tegra.c
index 649e9e8c7bcc..02e712d2ea30 100644
--- a/arch/arm/mach-tegra/tegra.c
+++ b/arch/arm/mach-tegra/tegra.c
@@ -84,35 +84,8 @@ static void __init tegra_dt_init_irq(void)
static void __init tegra_dt_init(void)
{
- struct soc_device_attribute *soc_dev_attr;
- struct soc_device *soc_dev;
- struct device *parent = NULL;
+ struct device *parent = tegra_soc_device_register();
- soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
- if (!soc_dev_attr)
- goto out;
-
- soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra");
- soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d",
- tegra_sku_info.revision);
- soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id());
-
- soc_dev = soc_device_register(soc_dev_attr);
- if (IS_ERR(soc_dev)) {
- kfree(soc_dev_attr->family);
- kfree(soc_dev_attr->revision);
- kfree(soc_dev_attr->soc_id);
- kfree(soc_dev_attr);
- goto out;
- }
-
- parent = soc_device_to_device(soc_dev);
-
- /*
- * Finished with the static registrations now; fill in the missing
- * devices
- */
-out:
of_platform_default_populate(NULL, NULL, parent);
}
diff --git a/arch/arm/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S
index 2522f8c8fbb1..a5084ec70c6e 100644
--- a/arch/arm/mm/cache-v4wb.S
+++ b/arch/arm/mm/cache-v4wb.S
@@ -47,6 +47,7 @@
#define CACHE_DLIMIT (CACHE_DSIZE * 4)
.data
+ .align 2
flush_base:
.long FLUSH_BASE
.text
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index ff8b0aa2dfde..42f585379e19 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -315,8 +315,11 @@ retry:
* signal first. We do not need to release the mmap_sem because
* it would already be released in __lock_page_or_retry in
* mm/filemap.c. */
- if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
+ if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) {
+ if (!user_mode(regs))
+ goto no_context;
return 0;
+ }
/*
* Major/minor page fault accounting is only done on the
diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S
index 5e5720e8bc5f..7d16bbc4102b 100644
--- a/arch/arm/mm/proc-v7-3level.S
+++ b/arch/arm/mm/proc-v7-3level.S
@@ -129,8 +129,7 @@ ENDPROC(cpu_v7_set_pte_ext)
.macro v7_ttb_setup, zero, ttbr0l, ttbr0h, ttbr1, tmp
ldr \tmp, =swapper_pg_dir @ swapper_pg_dir virtual address
cmp \ttbr1, \tmp, lsr #12 @ PHYS_OFFSET > PAGE_OFFSET?
- mrc p15, 0, \tmp, c2, c0, 2 @ TTB control egister
- orr \tmp, \tmp, #TTB_EAE
+ mov \tmp, #TTB_EAE @ for TTB control egister
ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP)
ALT_UP(orr \tmp, \tmp, #TTB_FLAGS_UP)
ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP << 16)
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S
index b6bbfdb6dfdc..3d75b7972fd1 100644
--- a/arch/arm/mm/proc-xscale.S
+++ b/arch/arm/mm/proc-xscale.S
@@ -104,6 +104,7 @@
.endm
.data
+ .align 2
clean_addr: .word CLEAN_ADDR
.text
diff --git a/arch/arm/plat-samsung/include/plat/map-s3c.h b/arch/arm/plat-samsung/include/plat/map-s3c.h
index 6feedd47d875..33104911862e 100644
--- a/arch/arm/plat-samsung/include/plat/map-s3c.h
+++ b/arch/arm/plat-samsung/include/plat/map-s3c.h
@@ -61,7 +61,7 @@
/* deal with the registers that move under the 2412/2413 */
-#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
+#if defined(CONFIG_CPU_S3C2412)
#ifndef __ASSEMBLY__
extern void __iomem *s3c24xx_va_gpio2;
#endif
diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
index f5f0c813dfec..6b54ee8c1262 100644
--- a/arch/arm64/Kconfig.platforms
+++ b/arch/arm64/Kconfig.platforms
@@ -184,6 +184,12 @@ config ARCH_R8A7796
help
This enables support for the Renesas R-Car M3-W SoC.
+config ARCH_R8A77995
+ bool "Renesas R-Car D3 SoC Platform"
+ depends on ARCH_RENESAS
+ help
+ This enables support for the Renesas R-Car D3 SoC.
+
config ARCH_STRATIX10
bool "Altera's Stratix 10 SoCFPGA Family"
help
@@ -250,6 +256,7 @@ config ARCH_XGENE
config ARCH_ZX
bool "ZTE ZX SoC Family"
+ select PINCTRL
help
This enables support for ZTE ZX SoC Family
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 9b41f1e3b1a0..939b310913cf 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -50,17 +50,22 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
+KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
+KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
+
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
KBUILD_CPPFLAGS += -mbig-endian
CHECKFLAGS += -D__AARCH64EB__
AS += -EB
LD += -EB
+LDFLAGS += -maarch64linuxb
UTS_MACHINE := aarch64_be
else
KBUILD_CPPFLAGS += -mlittle-endian
CHECKFLAGS += -D__AARCH64EL__
AS += -EL
LD += -EL
+LDFLAGS += -maarch64linux
UTS_MACHINE := aarch64
endif
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
index 108f12ce6d1d..19c3fbd75eda 100644
--- a/arch/arm64/boot/dts/allwinner/Makefile
+++ b/arch/arm64/boot/dts/allwinner/Makefile
@@ -1,4 +1,6 @@
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-bananapi-m64.dtb
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-nanopi-a64.dtb
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-olinuxino.dtb
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-orangepi-win.dtb
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-pine64-plus.dtb sun50i-a64-pine64.dtb
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-sopine-baseboard.dtb
diff --git a/arch/arm64/boot/dts/allwinner/axp803.dtsi b/arch/arm64/boot/dts/allwinner/axp803.dtsi
new file mode 100644
index 000000000000..ff8af52743ff
--- /dev/null
+++ b/arch/arm64/boot/dts/allwinner/axp803.dtsi
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2017 Icenowy Zheng <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * AXP803 Integrated Power Management Chip
+ * http://files.pine64.org/doc/datasheet/pine64/AXP803_Datasheet_V1.0.pdf
+ */
+
+&axp803 {
+ interrupt-controller;
+ #interrupt-cells = <1>;
+
+ regulators {
+ /* Default work frequency for buck regulators */
+ x-powers,dcdc-freq = <3000>;
+
+ reg_aldo1: aldo1 {
+ regulator-name = "aldo1";
+ };
+
+ reg_aldo2: aldo2 {
+ regulator-name = "aldo2";
+ };
+
+ reg_aldo3: aldo3 {
+ regulator-name = "aldo3";
+ };
+
+ reg_dc1sw: dc1sw {
+ regulator-name = "dc1sw";
+ };
+
+ reg_dcdc1: dcdc1 {
+ regulator-name = "dcdc1";
+ };
+
+ reg_dcdc2: dcdc2 {
+ regulator-name = "dcdc2";
+ };
+
+ reg_dcdc3: dcdc3 {
+ regulator-name = "dcdc3";
+ };
+
+ reg_dcdc4: dcdc4 {
+ regulator-name = "dcdc4";
+ };
+
+ reg_dcdc5: dcdc5 {
+ regulator-name = "dcdc5";
+ };
+
+ reg_dcdc6: dcdc6 {
+ regulator-name = "dcdc6";
+ };
+
+ reg_dldo1: dldo1 {
+ regulator-name = "dldo1";
+ };
+
+ reg_dldo2: dldo2 {
+ regulator-name = "dldo2";
+ };
+
+ reg_dldo3: dldo3 {
+ regulator-name = "dldo3";
+ };
+
+ reg_dldo4: dldo4 {
+ regulator-name = "dldo4";
+ };
+
+ reg_eldo1: eldo1 {
+ regulator-name = "eldo1";
+ };
+
+ reg_eldo2: eldo2 {
+ regulator-name = "eldo2";
+ };
+
+ reg_eldo3: eldo3 {
+ regulator-name = "eldo3";
+ };
+
+ reg_fldo1: fldo1 {
+ regulator-name = "fldo1";
+ };
+
+ reg_fldo2: fldo2 {
+ regulator-name = "fldo2";
+ };
+
+ reg_ldo_io0: ldo-io0 {
+ regulator-name = "ldo-io0";
+ status = "disabled";
+ };
+
+ reg_ldo_io1: ldo-io1 {
+ regulator-name = "ldo-io1";
+ status = "disabled";
+ };
+
+ reg_rtc_ldo: rtc-ldo {
+ /* RTC_LDO is a fixed, always-on regulator */
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "rtc-ldo";
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
index 6872135d7f84..d347f52e27f6 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
@@ -59,14 +59,16 @@
stdout-path = "serial0:115200n8";
};
- reg_vcc3v3: vcc3v3 {
- compatible = "regulator-fixed";
- regulator-name = "vcc3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
+ wifi_pwrseq: wifi_pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
};
};
+&ehci1 {
+ status = "okay";
+};
+
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>;
@@ -80,7 +82,7 @@
&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>;
- vmmc-supply = <&reg_vcc3v3>;
+ vmmc-supply = <&reg_dcdc1>;
cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
cd-inverted;
disable-wp;
@@ -91,22 +93,143 @@
&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
- vmmc-supply = <&reg_vcc3v3>;
+ vmmc-supply = <&reg_dldo2>;
+ vqmmc-supply = <&reg_dldo4>;
+ mmc-pwrseq = <&wifi_pwrseq>;
bus-width = <4>;
non-removable;
status = "okay";
+
+ brcmf: wifi@1 {
+ reg = <1>;
+ compatible = "brcm,bcm4329-fmac";
+ interrupt-parent = <&r_pio>;
+ interrupts = <0 3 IRQ_TYPE_LEVEL_LOW>; /* PL3 */
+ interrupt-names = "host-wake";
+ };
};
&mmc2 {
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
- vmmc-supply = <&reg_vcc3v3>;
+ vmmc-supply = <&reg_dcdc1>;
bus-width = <8>;
non-removable;
cap-mmc-hw-reset;
status = "okay";
};
+&ohci1 {
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic@3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+&reg_dc1sw {
+ regulator-name = "vcc-phy";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1040000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-name = "vcc-dram";
+};
+
+&reg_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_dldo1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi-dsi";
+};
+
+&reg_dldo2 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi";
+};
+
+&reg_dldo4 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi-io";
+};
+
+&reg_eldo1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "cpvdd";
+};
+
+&reg_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+/*
+ * The A64 chip cannot work without this regulator off, although
+ * it seems to be only driving the AR100 core.
+ * Maybe we don't still know well about CPUs domain.
+ */
+&reg_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins_a>;
@@ -118,3 +241,7 @@
pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
status = "okay";
};
+
+&usbphy {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
new file mode 100644
index 000000000000..2beef9e6cb88
--- /dev/null
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2017 Jagan Teki <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+
+#include "sun50i-a64.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "FriendlyARM NanoPi A64";
+ compatible = "friendlyarm,nanopi-a64", "allwinner,sun50i-a64";
+
+ aliases {
+ serial0 = &uart0;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+};
+
+&ehci0 {
+ status = "okay";
+};
+
+&ehci1 {
+ status = "okay";
+};
+
+/* i2c1 connected with gpio headers like pine64, bananapi */
+&i2c1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins>;
+ status = "disabled";
+};
+
+&i2c1_pins {
+ bias-pull-up;
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&reg_dcdc1>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
+ cd-inverted;
+ disable-wp;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
+};
+
+&ohci1 {
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic@3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-3v";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1040000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-name = "vcc-dram";
+};
+
+&reg_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_dldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi-dsi";
+};
+
+&reg_dldo4 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pg-wifi-io";
+};
+
+&reg_eldo1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "cpvdd";
+};
+
+&reg_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+/*
+ * The A64 chip cannot work without this regulator off, although
+ * it seems to be only driving the AR100 core.
+ * Maybe we don't still know well about CPUs domain.
+ */
+&reg_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins_a>;
+ status = "okay";
+};
+
+&usbphy {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts
new file mode 100644
index 000000000000..338e786155b1
--- /dev/null
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2017 Jagan Teki <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+
+#include "sun50i-a64.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "Olimex A64-Olinuxino";
+ compatible = "olimex,a64-olinuxino", "allwinner,sun50i-a64";
+
+ aliases {
+ serial0 = &uart0;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <&reg_dcdc1>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
+ cd-inverted;
+ disable-wp;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic@3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&reg_aldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "vcc-pe";
+};
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1040000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-name = "vcc-ddr3";
+};
+
+&reg_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_dldo1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi";
+};
+
+&reg_dldo2 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-mipi";
+};
+
+&reg_dldo3 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "vcc-avdd-csi";
+};
+
+&reg_dldo4 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi-io";
+};
+
+&reg_eldo1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "cpvdd";
+};
+
+&reg_eldo2 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-dvdd-csi";
+};
+
+&reg_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+/*
+ * The A64 chip cannot work without this regulator off, although
+ * it seems to be only driving the AR100 core.
+ * Maybe we don't still know well about CPUs domain.
+ */
+&reg_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins_a>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
index 7c533b6d4ba9..caf8b6fbe5e3 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
@@ -107,6 +107,118 @@
status = "okay";
};
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic@3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+&reg_dc1sw {
+ regulator-name = "vcc-phy";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1040000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+/*
+ * The DRAM chips used by Pine64 boards are DDR3L-compatible, so they can
+ * work at 1.35V with less power consumption.
+ * As AXP803 DCDC5 cannot reach 1.35V accurately, use 1.36V instead.
+ */
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1360000>;
+ regulator-max-microvolt = <1360000>;
+ regulator-name = "vcc-dram";
+};
+
+&reg_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_dldo1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi";
+};
+
+&reg_dldo2 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-mipi";
+};
+
+&reg_dldo4 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi";
+};
+
+&reg_eldo1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "cpvdd";
+};
+
+&reg_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+/*
+ * The A64 chip cannot work without this regulator off, although
+ * it seems to be only driving the AR100 core.
+ * Maybe we don't still know well about CPUs domain.
+ */
+&reg_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
/* On Exp and Euler connectors */
&uart0 {
pinctrl-names = "default";
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
index d891a1a27f6c..17ccc12b58df 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
@@ -95,6 +95,28 @@
status = "okay";
};
+&reg_dc1sw {
+ regulator-name = "vcc-phy";
+};
+
+&reg_dldo1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi";
+};
+
+&reg_dldo2 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-mipi";
+};
+
+&reg_dldo4 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins_a>;
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi
index 475518b031dd..a5da18a6f286 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi
@@ -63,3 +63,89 @@
bus-width = <4>;
status = "okay";
};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic@3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&reg_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+&reg_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+&reg_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+&reg_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1040000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+&reg_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-dram";
+};
+
+&reg_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+&reg_eldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vdd-1v8-lpddr";
+};
+
+&reg_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+/*
+ * The A64 chip cannot work without this regulator off, although
+ * it seems to be only driving the AR100 core.
+ * Maybe we don't still know well about CPUs domain.
+ */
+&reg_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+&reg_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
index 68aadc9b96dc..8c8db1b057df 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
@@ -467,6 +467,15 @@
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
};
+ r_intc: interrupt-controller@1f00c00 {
+ compatible = "allwinner,sun50i-a64-r-intc",
+ "allwinner,sun6i-a31-r-intc";
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0x01f00c00 0x400>;
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
r_ccu: clock@1f01400 {
compatible = "allwinner,sun50i-a64-r-ccu";
reg = <0x01f01400 0x100>;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
index dc478d094c11..4157987f4a3d 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
@@ -121,6 +121,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
@@ -161,7 +168,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -187,7 +195,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -205,10 +214,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
index 738ed689ff69..f175db846286 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
@@ -225,7 +225,7 @@
};
uart_A: serial@84c0 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson-gx-uart", "amlogic,meson-uart";
reg = <0x0 0x84c0 0x0 0x14>;
interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
clocks = <&xtal>;
@@ -233,7 +233,7 @@
};
uart_B: serial@84dc {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson-gx-uart", "amlogic,meson-uart";
reg = <0x0 0x84dc 0x0 0x14>;
interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>;
clocks = <&xtal>;
@@ -279,7 +279,7 @@
};
uart_C: serial@8700 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson-gx-uart", "amlogic,meson-uart";
reg = <0x0 0x8700 0x0 0x14>;
interrupts = <GIC_SPI 93 IRQ_TYPE_EDGE_RISING>;
clocks = <&xtal>;
@@ -367,26 +367,40 @@
#size-cells = <2>;
ranges = <0x0 0x0 0x0 0xc8100000 0x0 0x100000>;
- clkc_AO: clock-controller@040 {
- compatible = "amlogic,gx-aoclkc", "amlogic,gxbb-aoclkc";
- reg = <0x0 0x00040 0x0 0x4>;
- #clock-cells = <1>;
- #reset-cells = <1>;
+ sysctrl_AO: sys-ctrl@0 {
+ compatible = "amlogic,meson-gx-ao-sysctrl", "syscon", "simple-mfd";
+ reg = <0x0 0x0 0x0 0x100>;
+
+ clkc_AO: clock-controller {
+ compatible = "amlogic,meson-gx-aoclkc";
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ };
+ };
+
+ cec_AO: cec@100 {
+ compatible = "amlogic,meson-gx-ao-cec";
+ reg = <0x0 0x00100 0x0 0x14>;
+ interrupts = <GIC_SPI 199 IRQ_TYPE_EDGE_RISING>;
+ };
+
+ sec_AO: ao-secure@140 {
+ compatible = "amlogic,meson-gx-ao-secure", "syscon";
+ reg = <0x0 0x140 0x0 0x140>;
+ amlogic,has-chip-id;
};
uart_AO: serial@4c0 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson-gx-uart", "amlogic,meson-ao-uart", "amlogic,meson-uart";
reg = <0x0 0x004c0 0x0 0x14>;
interrupts = <GIC_SPI 193 IRQ_TYPE_EDGE_RISING>;
- clocks = <&xtal>;
status = "disabled";
};
uart_AO_B: serial@4e0 {
- compatible = "amlogic,meson-uart";
+ compatible = "amlogic,meson-gx-uart", "amlogic,meson-ao-uart", "amlogic,meson-uart";
reg = <0x0 0x004e0 0x0 0x14>;
interrupts = <GIC_SPI 197 IRQ_TYPE_EDGE_RISING>;
- clocks = <&xtal>;
status = "disabled";
};
@@ -437,9 +451,9 @@
mailbox: mailbox@404 {
compatible = "amlogic,meson-gx-mhu", "amlogic,meson-gxbb-mhu";
reg = <0 0x404 0 0x4c>;
- interrupts = <0 208 IRQ_TYPE_EDGE_RISING>,
- <0 209 IRQ_TYPE_EDGE_RISING>,
- <0 210 IRQ_TYPE_EDGE_RISING>;
+ interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 209 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 210 IRQ_TYPE_EDGE_RISING>;
#mbox-cells = <1>;
};
};
@@ -448,7 +462,7 @@
compatible = "amlogic,meson-gx-dwmac", "amlogic,meson-gxbb-dwmac", "snps,dwmac";
reg = <0x0 0xc9410000 0x0 0x10000
0x0 0xc8834540 0x0 0x4>;
- interrupts = <0 8 1>;
+ interrupts = <GIC_SPI 8 IRQ_TYPE_EDGE_RISING>;
interrupt-names = "macirq";
status = "disabled";
};
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
index fa462831ccaf..4b17a76959b2 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
@@ -107,6 +107,9 @@
states = <3300000 0>,
<1800000 1>;
+
+ regulator-settling-time-up-us = <100>;
+ regulator-settling-time-down-us = <5000>;
};
wifi_32k: wifi-32k {
@@ -175,6 +178,64 @@
pinctrl-names = "default";
};
+&pinctrl_aobus {
+ gpio-line-names = "UART TX", "UART RX", "Power Control", "Power Key In",
+ "VCCK En", "CON1 Header Pin31",
+ "I2S Header Pin6", "IR In", "I2S Header Pin7",
+ "I2S Header Pin3", "I2S Header Pin4",
+ "I2S Header Pin5", "HDMI CEC", "SYS LED";
+};
+
+&pinctrl_periphs {
+ gpio-line-names = /* Bank GPIOZ */
+ "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
+ "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
+ "Eth RX D3", "Eth RGMII TX Clk", "Eth TX En",
+ "Eth TX D0", "Eth TX D1", "Eth TX D2", "Eth TX D3",
+ "Eth PHY nRESET", "Eth PHY Intc",
+ /* Bank GPIOH */
+ "HDMI HPD", "HDMI DDC SDA", "HDMI DDC SCL",
+ "CON1 Header Pin33",
+ /* Bank BOOT */
+ "eMMC D0", "eMMC D1", "eMMC D2", "eMMC D3", "eMMC D4",
+ "eMMC D5", "eMMC D6", "eMMC D7", "eMMC Clk",
+ "eMMC Reset", "eMMC CMD",
+ "", "", "", "", "eMMC DS",
+ "", "",
+ /* Bank CARD */
+ "SDCard D1", "SDCard D0", "SDCard CLK", "SDCard CMD",
+ "SDCard D3", "SDCard D2", "SDCard Det",
+ /* Bank GPIODV */
+ "", "", "", "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "", "",
+ "I2C A SDA", "I2C A SCK", "I2C B SDA", "I2C B SCK",
+ "VDDEE Regulator", "VCCK Regulator",
+ /* Bank GPIOY */
+ "CON1 Header Pin7", "CON1 Header Pin11",
+ "CON1 Header Pin13", "CON1 Header Pin15",
+ "CON1 Header Pin18", "CON1 Header Pin19",
+ "CON1 Header Pin22", "CON1 Header Pin21",
+ "CON1 Header Pin24", "CON1 Header Pin23",
+ "CON1 Header Pin26", "CON1 Header Pin29",
+ "CON1 Header Pin32", "CON1 Header Pin8",
+ "CON1 Header Pin10", "CON1 Header Pin16",
+ "CON1 Header Pin12",
+ /* Bank GPIOX */
+ "WIFI SDIO D0", "WIFI SDIO D1", "WIFI SDIO D2",
+ "WIFI SDIO D3", "WIFI SDIO CLK", "WIFI SDIO CMD",
+ "WIFI Power Enable", "WIFI WAKE HOST",
+ "Bluetooth PCM DOUT", "Bluetooth PCM DIN",
+ "Bluetooth PCM SYNC", "Bluetooth PCM CLK",
+ "Bluetooth UART TX", "Bluetooth UART RX",
+ "Bluetooth UART CTS", "Bluetooth UART RTS",
+ "", "", "", "WIFI 32K", "Bluetooth Enable",
+ "Bluetooth WAKE HOST",
+ /* Bank GPIOCLK */
+ "", "CON1 Header Pin35", "", "",
+ /* GPIO_TEST_N */
+ "";
+};
+
&pwm_ef {
status = "okay";
pinctrl-0 = <&pwm_e_pins>;
@@ -192,7 +253,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>, <&sdio_irq_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -218,11 +280,16 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
- max-frequency = <100000000>;
+ sd-uhs-sdr12;
+ sd-uhs-sdr25;
+ sd-uhs-sdr50;
+ sd-uhs-sdr104;
+ max-frequency = <200000000>;
disable-wp;
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
@@ -236,10 +303,10 @@
&sd_emmc_c {
status = "disabled";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
max-frequency = <200000000>;
non-removable;
disable-wp;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
index a1078b3e1c76..38dfdde5c147 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
@@ -51,7 +51,7 @@
/ {
compatible = "nexbox,a95x", "amlogic,meson-gxbb";
model = "NEXBOX A95X";
-
+
aliases {
serial0 = &uart_AO;
};
@@ -171,6 +171,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&ethmac {
status = "okay";
pinctrl-0 = <&eth_rmii_pins>;
@@ -225,7 +232,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -246,7 +254,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -264,10 +273,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
index d147c853ab05..1ffa1c238a72 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
@@ -50,7 +50,7 @@
/ {
compatible = "hardkernel,odroid-c2", "amlogic,meson-gxbb";
model = "Hardkernel ODROID-C2";
-
+
aliases {
serial0 = &uart_AO;
};
@@ -253,7 +253,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -271,10 +272,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
max-frequency = <200000000>;
non-removable;
disable-wp;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi
index d904deb1018c..23c08c3afd0a 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi
@@ -84,6 +84,9 @@
/* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */
states = <1800000 0
3300000 1>;
+
+ regulator-settling-time-up-us = <10000>;
+ regulator-settling-time-down-us = <150000>;
};
vddio_boot: regulator-vddio_boot {
@@ -148,6 +151,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
@@ -184,7 +194,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -210,10 +221,14 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
+ sd-uhs-sdr12;
+ sd-uhs-sdr25;
+ sd-uhs-sdr50;
max-frequency = <100000000>;
disable-wp;
@@ -228,10 +243,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
index 346753fb6324..f2bc6dea1fc6 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
@@ -155,7 +155,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins &sdio_irq_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -181,7 +182,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -198,10 +200,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
index e76ac313fef9..f7144fd5e03f 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts
@@ -108,6 +108,12 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
index 17d3efdf1469..af834cdbba79 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
@@ -307,6 +307,15 @@
};
};
+&cec_AO {
+ clocks = <&clkc_AO CLKID_AO_CEC_32K>;
+ clock-names = "core";
+};
+
+&clkc_AO {
+ compatible = "amlogic,meson-gxbb-aoclkc", "amlogic,meson-gx-aoclkc";
+};
+
&ethmac {
clocks = <&clkc CLKID_ETH>,
<&clkc CLKID_FCLK_DIV2>,
@@ -383,6 +392,17 @@
};
};
+ emmc_clk_gate_pins: emmc_clk_gate {
+ mux {
+ groups = "BOOT_8";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "BOOT_8";
+ bias-pull-down;
+ };
+ };
+
nor_pins: nor {
mux {
groups = "nor_d",
@@ -421,6 +441,17 @@
};
};
+ sdcard_clk_gate_pins: sdcard_clk_gate {
+ mux {
+ groups = "CARD_2";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "CARD_2";
+ bias-pull-down;
+ };
+ };
+
sdio_pins: sdio {
mux {
groups = "sdio_d0",
@@ -433,6 +464,17 @@
};
};
+ sdio_clk_gate_pins: sdio_clk_gate {
+ mux {
+ groups = "GPIOX_4";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "GPIOX_4";
+ bias-pull-down;
+ };
+ };
+
sdio_irq_pins: sdio_irq {
mux {
groups = "sdio_irq";
@@ -652,21 +694,21 @@
&sd_emmc_a {
clocks = <&clkc CLKID_SD_EMMC_A>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_A_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
&sd_emmc_b {
clocks = <&clkc CLKID_SD_EMMC_B>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_B_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
&sd_emmc_c {
clocks = <&clkc CLKID_SD_EMMC_C>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_C_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
@@ -682,6 +724,31 @@
clocks = <&clkc CLKID_SPI>;
};
+&uart_A {
+ clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_AO {
+ clocks = <&xtal>, <&clkc CLKID_CLK81>, <&xtal>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_AO_B {
+ clocks = <&xtal>, <&clkc CLKID_CLK81>, <&xtal>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_B {
+ clocks = <&xtal>, <&clkc CLKID_UART1>, <&xtal>;
+ clock-names = "xtal", "core", "baud";
+};
+
+&uart_C {
+ clocks = <&xtal>, <&clkc CLKID_UART2>, <&xtal>;
+ clock-names = "xtal", "core", "baud";
+};
+
&vpu {
compatible = "amlogic,meson-gxbb-vpu", "amlogic,meson-gx-vpu";
};
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
index 3e0c023d6abd..6827f235d7cf 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
@@ -97,6 +97,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
/* P230 has exclusive choice between internal or external PHY */
&ethmac {
pinctrl-0 = <&eth_pins>;
@@ -124,7 +131,6 @@
};
};
-
&hdmi_tx {
status = "okay";
pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts
index 2a5804ce7f4b..977b4240f3c1 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts
@@ -123,7 +123,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -141,10 +142,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <100000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
index 94567eb17875..edc512ad0bac 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
@@ -67,6 +67,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&hdmi_tx {
status = "okay";
pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
@@ -105,6 +112,62 @@
linux,rc-map-name = "rc-geekbox";
};
+&pinctrl_aobus {
+ gpio-line-names = "UART TX",
+ "UART RX",
+ "Power Key In",
+ "J9 Header Pin35",
+ "J9 Header Pin16",
+ "J9 Header Pin15",
+ "J9 Header Pin33",
+ "IR In",
+ "HDMI CEC",
+ "SYS LED";
+};
+
+&pinctrl_periphs {
+ gpio-line-names = /* Bank GPIOZ */
+ "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "",
+ "Power OFF",
+ "VCCK Enable",
+ /* Bank GPIOH */
+ "HDMI HPD", "HDMI SDA", "HDMI SCL",
+ "HDMI_5V_EN", "SPDIF",
+ "J9 Header Pin37",
+ "J9 Header Pin30",
+ "J9 Header Pin29",
+ "J9 Header Pin32",
+ "J9 Header Pin31",
+ /* Bank BOOT */
+ "eMMC D0", "eMMC D1", "eMMC D2", "eMMC D3",
+ "eMMC D4", "eMMC D5", "eMMC D6", "eMMC D7",
+ "eMMC Clk", "eMMC Reset", "eMMC CMD",
+ "", "BOOT_MODE", "", "", "eMMC Data Strobe",
+ /* Bank CARD */
+ "SDCard D1", "SDCard D0", "SDCard CLK", "SDCard CMD",
+ "SDCard D3", "SDCard D2", "SDCard Det",
+ /* Bank GPIODV */
+ "", "", "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "", "", "",
+ "I2C A SDA", "I2C A SCK", "I2C B SDA", "I2C B SCK",
+ "VCCK Regulator", "VDDEE Regulator",
+ /* Bank GPIOX */
+ "WIFI SDIO D0", "WIFI SDIO D1", "WIFI SDIO D2",
+ "WIFI SDIO D3", "WIFI SDIO CLK", "WIFI SDIO CMD",
+ "WIFI Power Enable", "WIFI WAKE HOST",
+ "Bluetooth PCM DOUT", "Bluetooth PCM DIN",
+ "Bluetooth PCM SYNC", "Bluetooth PCM CLK",
+ "Bluetooth UART TX", "Bluetooth UART RX",
+ "Bluetooth UART CTS", "Bluetooth UART RTS",
+ "WIFI 32K", "Bluetooth Enable",
+ "Bluetooth WAKE HOST",
+ /* Bank GPIOCLK */
+ "", "J9 Header Pin39",
+ /* GPIO_TEST_N */
+ "";
+};
+
&pwm_AO_ab {
status = "okay";
pinctrl-0 = <&pwm_ao_a_3_pins>, <&pwm_ao_b_pins>;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
index 266fbcf3e47f..64c54c92e214 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
@@ -91,6 +91,9 @@
states = <3300000 0>,
<1800000 1>;
+
+ regulator-settling-time-up-us = <200>;
+ regulator-settling-time-down-us = <50000>;
};
vddio_boot: regulator-vddio_boot {
@@ -101,6 +104,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
@@ -129,14 +139,75 @@
};
};
+&pinctrl_aobus {
+ gpio-line-names = "UART TX",
+ "UART RX",
+ "Blue LED",
+ "SDCard Voltage Switch",
+ "7J1 Header Pin5",
+ "7J1 Header Pin3",
+ "7J1 Header Pin12",
+ "IR In",
+ "9J3 Switch HDMI CEC/7J1 Header Pin11",
+ "7J1 Header Pin13";
+};
+
+&pinctrl_periphs {
+ gpio-line-names = /* Bank GPIOZ */
+ "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "",
+ "Eth Link LED", "Eth Activity LED",
+ /* Bank GPIOH */
+ "HDMI HPD", "HDMI SDA", "HDMI SCL",
+ "HDMI_5V_EN", "9J1 Header Pin2",
+ "Analog Audio Mute",
+ "2J3 Header Pin6",
+ "2J3 Header Pin5",
+ "2J3 Header Pin4",
+ "2J3 Header Pin3",
+ /* Bank BOOT */
+ "eMMC D0", "eMMC D1", "eMMC D2", "eMMC D3",
+ "eMMC D4", "eMMC D5", "eMMC D6", "eMMC D7",
+ "eMMC Clk", "eMMC Reset", "eMMC CMD",
+ "ALT BOOT MODE", "", "", "", "eMMC Data Strobe",
+ /* Bank CARD */
+ "SDCard D1", "SDCard D0", "SDCard CLK", "SDCard CMD",
+ "SDCard D3", "SDCard D2", "SDCard Det",
+ /* Bank GPIODV */
+ "", "", "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "", "", "",
+ "Green LED", "VCCK Enable",
+ "7J1 Header Pin27", "7J1 Header Pin28",
+ "VCCK Regulator", "VDDEE Regulator",
+ /* Bank GPIOX */
+ "7J1 Header Pin22", "7J1 Header Pin26",
+ "7J1 Header Pin36", "7J1 Header Pin38",
+ "7J1 Header Pin40", "7J1 Header Pin37",
+ "7J1 Header Pin33", "7J1 Header Pin35",
+ "7J1 Header Pin19", "7J1 Header Pin21",
+ "7J1 Header Pin24", "7J1 Header Pin23",
+ "7J1 Header Pin8", "7J1 Header Pin10",
+ "7J1 Header Pin16", "7J1 Header Pin18",
+ "7J1 Header Pin32", "7J1 Header Pin29",
+ "7J1 Header Pin31",
+ /* Bank GPIOCLK */
+ "7J1 Header Pin7", "",
+ /* GPIO_TEST_N */
+ "7J1 Header Pin15";
+};
+
/* SD card */
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
+ sd-uhs-sdr12;
+ sd-uhs-sdr25;
+ sd-uhs-sdr50;
max-frequency = <100000000>;
disable-wp;
@@ -151,10 +222,12 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
cap-mmc-highspeed;
+ mmc-ddr-3_3v;
max-frequency = <50000000>;
non-removable;
disable-wp;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts
index 6633a5d8fdd3..1b8f32867aa1 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts
@@ -140,6 +140,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
@@ -182,7 +189,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -203,7 +211,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -221,10 +230,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts
index 6ab17c1eeefd..6e2bf858291c 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts
@@ -71,6 +71,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
index f3eea8e89d12..129af9068814 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
@@ -95,7 +95,8 @@
&sd_emmc_a {
status = "okay";
pinctrl-0 = <&sdio_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdio_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
#address-cells = <1>;
#size-cells = <0>;
@@ -116,7 +117,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -134,10 +136,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
index 8d4f3160a0ee..d8dd3298b15c 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
@@ -43,6 +43,7 @@
#include "meson-gx.dtsi"
#include <dt-bindings/clock/gxbb-clkc.h>
+#include <dt-bindings/clock/gxbb-aoclkc.h>
#include <dt-bindings/gpio/meson-gxl-gpio.h>
#include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
@@ -207,6 +208,15 @@
};
};
+&cec_AO {
+ clocks = <&clkc_AO CLKID_AO_CEC_32K>;
+ clock-names = "core";
+};
+
+&clkc_AO {
+ compatible = "amlogic,meson-gxl-aoclkc", "amlogic,meson-gx-aoclkc";
+};
+
&hdmi_tx {
compatible = "amlogic,meson-gxl-dw-hdmi", "amlogic,meson-gx-dw-hdmi";
resets = <&reset RESET_HDMITX_CAPB3>,
@@ -271,6 +281,17 @@
};
};
+ emmc_clk_gate_pins: emmc_clk_gate {
+ mux {
+ groups = "BOOT_8";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "BOOT_8";
+ bias-pull-down;
+ };
+ };
+
nor_pins: nor {
mux {
groups = "nor_d",
@@ -309,6 +330,17 @@
};
};
+ sdcard_clk_gate_pins: sdcard_clk_gate {
+ mux {
+ groups = "CARD_2";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "CARD_2";
+ bias-pull-down;
+ };
+ };
+
sdio_pins: sdio {
mux {
groups = "sdio_d0",
@@ -321,6 +353,17 @@
};
};
+ sdio_clk_gate_pins: sdio_clk_gate {
+ mux {
+ groups = "GPIOX_4";
+ function = "gpio_periphs";
+ };
+ cfg-pull-down {
+ pins = "GPIOX_4";
+ bias-pull-down;
+ };
+ };
+
sdio_irq_pins: sdio_irq {
mux {
groups = "sdio_irq";
@@ -593,21 +636,21 @@
&sd_emmc_a {
clocks = <&clkc CLKID_SD_EMMC_A>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_A_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
&sd_emmc_b {
clocks = <&clkc CLKID_SD_EMMC_B>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_B_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
&sd_emmc_c {
clocks = <&clkc CLKID_SD_EMMC_C>,
- <&xtal>,
+ <&clkc CLKID_SD_EMMC_C_CLK0>,
<&clkc CLKID_FCLK_DIV2>;
clock-names = "core", "clkin0", "clkin1";
};
@@ -623,6 +666,31 @@
clocks = <&clkc CLKID_SPI>;
};
+&uart_A {
+ clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>;
+ clock-names = "xtal", "core", "baud";
+};
+
+&uart_AO {
+ clocks = <&xtal>, <&clkc CLKID_CLK81>, <&xtal>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_AO_B {
+ clocks = <&xtal>, <&clkc CLKID_CLK81>, <&xtal>;
+ clock-names = "xtal", "pclk", "baud";
+};
+
+&uart_B {
+ clocks = <&xtal>, <&clkc CLKID_UART1>, <&xtal>;
+ clock-names = "xtal", "core", "baud";
+};
+
+&uart_C {
+ clocks = <&xtal>, <&clkc CLKID_UART2>, <&xtal>;
+ clock-names = "xtal", "core", "baud";
+};
+
&vpu {
compatible = "amlogic,meson-gxl-vpu", "amlogic,meson-gx-vpu";
};
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts
index 5f626d683088..22c697732f66 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts
@@ -113,6 +113,13 @@
};
};
+&cec_AO {
+ status = "okay";
+ pinctrl-0 = <&ao_cec_pins>;
+ pinctrl-names = "default";
+ hdmi-phandle = <&hdmi_tx>;
+};
+
&cvbs_vdac_port {
cvbs_vdac_out: endpoint {
remote-endpoint = <&cvbs_connector_in>;
@@ -168,7 +175,8 @@
&sd_emmc_b {
status = "okay";
pinctrl-0 = <&sdcard_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&sdcard_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <4>;
cap-sd-highspeed;
@@ -186,10 +194,10 @@
&sd_emmc_c {
status = "okay";
pinctrl-0 = <&emmc_pins>;
- pinctrl-names = "default";
+ pinctrl-1 = <&emmc_clk_gate_pins>;
+ pinctrl-names = "default", "clk-gate";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
index 08f1dd69b679..470f72bb863c 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
@@ -220,7 +220,6 @@
pinctrl-names = "default";
bus-width = <8>;
- cap-sd-highspeed;
cap-mmc-highspeed;
max-frequency = <200000000>;
non-removable;
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxm.dtsi
index fe451cce93e7..19a798d2ae2f 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxm.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm.dtsi
@@ -117,6 +117,10 @@
};
};
+&clkc_AO {
+ compatible = "amlogic,meson-gxm-aoclkc", "amlogic,meson-gx-aoclkc";
+};
+
&saradc {
compatible = "amlogic,meson-gxm-saradc", "amlogic,meson-saradc";
};
diff --git a/arch/arm64/boot/dts/apm/apm-shadowcat.dtsi b/arch/arm64/boot/dts/apm/apm-shadowcat.dtsi
index 72720e9132a1..c9ffffb96e43 100644
--- a/arch/arm64/boot/dts/apm/apm-shadowcat.dtsi
+++ b/arch/arm64/boot/dts/apm/apm-shadowcat.dtsi
@@ -626,6 +626,7 @@
0x43000000 0xe0 0x00000000 0xe0 0x00000000 0x20 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0x0 0x0 0x10 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0x0 0x0 0x11 0x4
@@ -651,6 +652,7 @@
0x43000000 0xb0 0x00000000 0xb0 0x00000000 0x10 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0x0 0x0 0x16 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0x0 0x0 0x17 0x4
diff --git a/arch/arm64/boot/dts/apm/apm-storm.dtsi b/arch/arm64/boot/dts/apm/apm-storm.dtsi
index 63be8e51eaa8..c09a36fed917 100644
--- a/arch/arm64/boot/dts/apm/apm-storm.dtsi
+++ b/arch/arm64/boot/dts/apm/apm-storm.dtsi
@@ -626,6 +626,7 @@
0x43000000 0xf0 0x00000000 0xf0 0x00000000 0x10 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0xc2 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0xc3 0x4
@@ -651,6 +652,7 @@
0x43000000 0xd8 0x00000000 0xd8 0x00000000 0x08 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0xc8 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0xc9 0x4
@@ -676,6 +678,7 @@
0x43000000 0x94 0x00000000 0x94 0x00000000 0x04 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0xce 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0xcf 0x4
@@ -701,6 +704,7 @@
0x43000000 0xb0 0x00000000 0xb0 0x00000000 0x10 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0xd4 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0xd5 0x4
@@ -726,6 +730,7 @@
0x43000000 0xc8 0x00000000 0xc8 0x00000000 0x08 0x00000000>; /* mem */
dma-ranges = <0x42000000 0x80 0x00000000 0x80 0x00000000 0x00 0x80000000
0x42000000 0x00 0x00000000 0x00 0x00000000 0x80 0x00000000>;
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &gic 0x0 0xda 0x4
0x0 0x0 0x0 0x2 &gic 0x0 0xdb 0x4
diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
index 7cfa8e414e7f..8ecdd4331980 100644
--- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
@@ -226,7 +226,7 @@
clock-names = "uartclk", "apb_pclk";
};
- virtio_block@0130000 {
+ virtio-block@0130000 {
compatible = "virtio,mmio";
reg = <0x130000 0x200>;
interrupts = <42>;
diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi
index e8b7413ec890..fbafe62d6b22 100644
--- a/arch/arm64/boot/dts/arm/juno-base.dtsi
+++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
@@ -201,7 +201,7 @@
};
};
- cpu_debug0: cpu_debug@22010000 {
+ cpu_debug0: cpu-debug@22010000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x22010000 0x0 0x1000>;
@@ -260,7 +260,7 @@
};
};
- cpu_debug1: cpu_debug@22110000 {
+ cpu_debug1: cpu-debug@22110000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x22110000 0x0 0x1000>;
@@ -283,7 +283,7 @@
};
};
- cpu_debug2: cpu_debug@23010000 {
+ cpu_debug2: cpu-debug@23010000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x23010000 0x0 0x1000>;
@@ -356,7 +356,7 @@
};
};
- cpu_debug3: cpu_debug@23110000 {
+ cpu_debug3: cpu-debug@23110000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x23110000 0x0 0x1000>;
@@ -379,7 +379,7 @@
};
};
- cpu_debug4: cpu_debug@23210000 {
+ cpu_debug4: cpu-debug@23210000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x23210000 0x0 0x1000>;
@@ -402,7 +402,7 @@
};
};
- cpu_debug5: cpu_debug@23310000 {
+ cpu_debug5: cpu-debug@23310000 {
compatible = "arm,coresight-cpu-debug", "arm,primecell";
reg = <0x0 0x23310000 0x0 0x1000>;
@@ -426,7 +426,7 @@
};
replicator@20120000 {
- compatible = "qcom,coresight-replicator1x", "arm,primecell";
+ compatible = "arm,coresight-dynamic-replicator", "arm,primecell";
reg = <0 0x20120000 0 0x1000>;
clocks = <&soc_smc50mhz>;
diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
index 161ac98418a3..528875c75598 100644
--- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
+++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
@@ -219,7 +219,7 @@
};
};
- virtio_block@0130000 {
+ virtio-block@0130000 {
compatible = "virtio,mmio";
reg = <0x130000 0x200>;
interrupts = <42>;
diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile
index f11bdd6689ea..3eaef3895d66 100644
--- a/arch/arm64/boot/dts/broadcom/Makefile
+++ b/arch/arm64/boot/dts/broadcom/Makefile
@@ -1,7 +1,7 @@
dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb
-dtb-$(CONFIG_ARCH_BCM_IPROC) += ns2-svk.dtb ns2-xmc.dtb
-dts-dirs := stingray
+dts-dirs += northstar2
+dts-dirs += stingray
always := $(dtb-y)
subdir-y := $(dts-dirs)
clean-files := *.dtb
diff --git a/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi b/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi
deleted file mode 120000
index 3937b77cb310..000000000000
--- a/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi
+++ /dev/null
@@ -1 +0,0 @@
-../../../../arm/boot/dts/bcm2835-rpi.dtsi \ No newline at end of file
diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
index 972f14db28ac..699d340a3437 100644
--- a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
+++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
@@ -1,41 +1 @@
-/dts-v1/;
-#include "bcm2837.dtsi"
-#include "bcm2835-rpi.dtsi"
-#include "bcm283x-rpi-smsc9514.dtsi"
-#include "bcm283x-rpi-usb-host.dtsi"
-
-/ {
- compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
- model = "Raspberry Pi 3 Model B";
-
- memory {
- reg = <0 0x40000000>;
- };
-
- leds {
- act {
- gpios = <&gpio 47 0>;
- };
- };
-};
-
-&uart1 {
- status = "okay";
-};
-
-/* SDHCI is used to control the SDIO for wireless */
-&sdhci {
- pinctrl-names = "default";
- pinctrl-0 = <&emmc_gpio34>;
- status = "okay";
- bus-width = <4>;
- non-removable;
-};
-
-/* SDHOST is used to drive the SD card */
-&sdhost {
- pinctrl-names = "default";
- pinctrl-0 = <&sdhost_gpio48>;
- status = "okay";
- bus-width = <4>;
-};
+#include "arm/bcm2837-rpi-3-b.dts"
diff --git a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi
deleted file mode 120000
index dca7c057d5a5..000000000000
--- a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi
+++ /dev/null
@@ -1 +0,0 @@
-../../../../arm/boot/dts/bcm283x-rpi-smsc9514.dtsi \ No newline at end of file
diff --git a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-host.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-host.dtsi
deleted file mode 120000
index cbeebe312ff8..000000000000
--- a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-host.dtsi
+++ /dev/null
@@ -1 +0,0 @@
-../../../../arm/boot/dts/bcm283x-rpi-usb-host.dtsi \ No newline at end of file
diff --git a/arch/arm64/boot/dts/broadcom/bcm283x.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x.dtsi
deleted file mode 120000
index 5f54e4cab99b..000000000000
--- a/arch/arm64/boot/dts/broadcom/bcm283x.dtsi
+++ /dev/null
@@ -1 +0,0 @@
-../../../../arm/boot/dts/bcm283x.dtsi \ No newline at end of file
diff --git a/arch/arm64/boot/dts/broadcom/northstar2/Makefile b/arch/arm64/boot/dts/broadcom/northstar2/Makefile
new file mode 100644
index 000000000000..e01a1485b813
--- /dev/null
+++ b/arch/arm64/boot/dts/broadcom/northstar2/Makefile
@@ -0,0 +1,6 @@
+dtb-$(CONFIG_ARCH_BCM_IPROC) += ns2-svk.dtb
+dtb-$(CONFIG_ARCH_BCM_IPROC) += ns2-xmc.dtb
+
+always := $(dtb-y)
+subdir-y := $(dts-dirs)
+clean-files := *.dtb
diff --git a/arch/arm64/boot/dts/broadcom/ns2-clock.dtsi b/arch/arm64/boot/dts/broadcom/northstar2/ns2-clock.dtsi
index 99009fdf10a4..99009fdf10a4 100644
--- a/arch/arm64/boot/dts/broadcom/ns2-clock.dtsi
+++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2-clock.dtsi
diff --git a/arch/arm64/boot/dts/broadcom/ns2-svk.dts b/arch/arm64/boot/dts/broadcom/northstar2/ns2-svk.dts
index ec19fbf928a1..ec19fbf928a1 100644
--- a/arch/arm64/boot/dts/broadcom/ns2-svk.dts
+++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2-svk.dts
diff --git a/arch/arm64/boot/dts/broadcom/ns2-xmc.dts b/arch/arm64/boot/dts/broadcom/northstar2/ns2-xmc.dts
index ab4ae1a32fab..ab4ae1a32fab 100644
--- a/arch/arm64/boot/dts/broadcom/ns2-xmc.dts
+++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2-xmc.dts
diff --git a/arch/arm64/boot/dts/broadcom/ns2.dtsi b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi
index 35c8457e3d1f..35c8457e3d1f 100644
--- a/arch/arm64/boot/dts/broadcom/ns2.dtsi
+++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi
diff --git a/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi b/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi
index 5dca7d10253b..8862ec907fd8 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi
+++ b/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi
@@ -72,6 +72,78 @@
<0x00000008 0x80000000 0x1 0x80000000>; /* 6G @ 34G */
};
+&sata0 {
+ status = "okay";
+};
+
+&sata_phy0{
+ status = "okay";
+};
+
+&sata1 {
+ status = "okay";
+};
+
+&sata_phy1{
+ status = "okay";
+};
+
+&sata2 {
+ status = "okay";
+};
+
+&sata_phy2{
+ status = "okay";
+};
+
+&sata3 {
+ status = "okay";
+};
+
+&sata_phy3{
+ status = "okay";
+};
+
+&sata4 {
+ status = "okay";
+};
+
+&sata_phy4{
+ status = "okay";
+};
+
+&sata5 {
+ status = "okay";
+};
+
+&sata_phy5{
+ status = "okay";
+};
+
+&sata6 {
+ status = "okay";
+};
+
+&sata_phy6{
+ status = "okay";
+};
+
+&sata7 {
+ status = "okay";
+};
+
+&sata_phy7{
+ status = "okay";
+};
+
+&mdio_mux_iproc {
+ mdio@10 {
+ gphy0: eth-phy@10 {
+ reg = <0x10>;
+ };
+ };
+};
+
&uart1 {
status = "okay";
};
@@ -102,6 +174,12 @@
};
};
+&enet {
+ phy-mode = "rgmii-id";
+ phy-handle = <&gphy0>;
+ status = "okay";
+};
+
&nand {
status = "ok";
nandcs@0 {
diff --git a/arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts b/arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts
index 5671669ba348..eb6f08cdbd79 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts
+++ b/arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts
@@ -39,6 +39,10 @@
model = "Stingray Combo SVK (BCM958742K)";
};
+&gphy0 {
+ enet-phy-lane-swap;
+};
+
&uart2 {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts b/arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts
index 6ebe399fda6a..5084b037320f 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts
+++ b/arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts
@@ -38,3 +38,7 @@
compatible = "brcm,bcm958742t", "brcm,stingray";
model = "Stingray SST100 (BCM958742T)";
};
+
+&gphy0 {
+ enet-phy-lane-swap;
+};
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray-fs4.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray-fs4.dtsi
new file mode 100644
index 000000000000..8bf1dc6b46ca
--- /dev/null
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray-fs4.dtsi
@@ -0,0 +1,118 @@
+/*
+ * BSD LICENSE
+ *
+ * Copyright(c) 2016-2017 Broadcom. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Broadcom nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ fs4: fs4 {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x0 0x67000000 0x00800000>;
+
+ crypto_mbox: crypto_mbox@00000000 {
+ compatible = "brcm,iproc-flexrm-mbox";
+ reg = <0x00000000 0x200000>;
+ msi-parent = <&gic_its 0x4100>;
+ #mbox-cells = <3>;
+ dma-coherent;
+ };
+
+ raid_mbox: raid_mbox@00400000 {
+ compatible = "brcm,iproc-flexrm-mbox";
+ reg = <0x00400000 0x200000>;
+ dma-coherent;
+ msi-parent = <&gic_its 0x4300>;
+ #mbox-cells = <3>;
+ };
+
+ raid0: raid@0 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 0 0x1 0xff00>,
+ <&raid_mbox 1 0x1 0xff00>,
+ <&raid_mbox 2 0x1 0xff00>,
+ <&raid_mbox 3 0x1 0xff00>;
+ };
+
+ raid1: raid@1 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 4 0x1 0xff00>,
+ <&raid_mbox 5 0x1 0xff00>,
+ <&raid_mbox 6 0x1 0xff00>,
+ <&raid_mbox 7 0x1 0xff00>;
+ };
+
+ raid2: raid@2 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 8 0x1 0xff00>,
+ <&raid_mbox 9 0x1 0xff00>,
+ <&raid_mbox 10 0x1 0xff00>,
+ <&raid_mbox 11 0x1 0xff00>;
+ };
+
+ raid3: raid@3 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 12 0x1 0xff00>,
+ <&raid_mbox 13 0x1 0xff00>,
+ <&raid_mbox 14 0x1 0xff00>,
+ <&raid_mbox 15 0x1 0xff00>;
+ };
+
+ raid4: raid@4 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 16 0x1 0xff00>,
+ <&raid_mbox 17 0x1 0xff00>,
+ <&raid_mbox 18 0x1 0xff00>,
+ <&raid_mbox 19 0x1 0xff00>;
+ };
+
+ raid5: raid@5 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 20 0x1 0xff00>,
+ <&raid_mbox 21 0x1 0xff00>,
+ <&raid_mbox 22 0x1 0xff00>,
+ <&raid_mbox 23 0x1 0xff00>;
+ };
+
+ raid6: raid@6 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 24 0x1 0xff00>,
+ <&raid_mbox 25 0x1 0xff00>,
+ <&raid_mbox 26 0x1 0xff00>,
+ <&raid_mbox 27 0x1 0xff00>;
+ };
+
+ raid7: raid@7 {
+ compatible = "brcm,iproc-sba-v2";
+ mboxes = <&raid_mbox 28 0x1 0xff00>,
+ <&raid_mbox 29 0x1 0xff00>,
+ <&raid_mbox 30 0x1 0xff00>,
+ <&raid_mbox 31 0x1 0xff00>;
+ };
+ };
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray-sata.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray-sata.dtsi
new file mode 100644
index 000000000000..a774709388df
--- /dev/null
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray-sata.dtsi
@@ -0,0 +1,278 @@
+/*
+ * BSD LICENSE
+ *
+ * Copyright(c) 2016-2017 Broadcom. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Broadcom nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ sata {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x0 0x67d00000 0x00800000>;
+
+ sata0: ahci@00210000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00210000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 339 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata0_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata0_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy0: sata_phy@00212100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00212100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata0_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata1: ahci@00310000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00310000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata1_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata1_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy1: sata_phy@00312100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00312100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata1_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata2: ahci@00120000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00120000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 333 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata2_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata2_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy2: sata_phy@00122100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00122100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata2_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata3: ahci@00130000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00130000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata3_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata3_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy3: sata_phy@00132100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00132100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata3_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata4: ahci@00330000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00330000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 351 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata4_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata4_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy4: sata_phy@00332100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00332100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata4_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata5: ahci@00400000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00400000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 353 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata5_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata5_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy5: sata_phy@00402100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00402100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata5_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata6: ahci@00410000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00410000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata6_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata6_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy6: sata_phy@00412100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00412100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata6_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+
+ sata7: ahci@00420000 {
+ compatible = "brcm,iproc-ahci", "generic-ahci";
+ reg = <0x00420000 0x1000>;
+ reg-names = "ahci";
+ interrupts = <GIC_SPI 357 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata7_port0: sata-port@0 {
+ reg = <0>;
+ phys = <&sata7_phy0>;
+ phy-names = "sata-phy";
+ };
+ };
+
+ sata_phy7: sata_phy@00422100 {
+ compatible = "brcm,iproc-sr-sata-phy";
+ reg = <0x00422100 0x1000>;
+ reg-names = "phy";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+
+ sata7_phy0: sata-phy@0 {
+ reg = <0>;
+ #phy-cells = <0>;
+ };
+ };
+ };
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
index 49933cf16c92..e6f75c633623 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
@@ -152,6 +152,12 @@
#size-cells = <1>;
ranges = <0x0 0x0 0x61000000 0x05000000>;
+ ccn: ccn@00000000 {
+ compatible = "arm,ccn-502";
+ reg = <0x00000000 0x900000>;
+ interrupts = <GIC_SPI 799 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
gic: interrupt-controller@02c00000 {
compatible = "arm,gic-v3";
#interrupt-cells = <3>;
@@ -261,6 +267,9 @@
};
};
+ #include "stingray-fs4.dtsi"
+ #include "stingray-sata.dtsi"
+
hsls {
compatible = "simple-bus";
#address-cells = <1>;
@@ -269,6 +278,37 @@
#include "stingray-pinctrl.dtsi"
+ mdio_mux_iproc: mdio-mux@0002023c {
+ compatible = "brcm,mdio-mux-iproc";
+ reg = <0x0002023c 0x14>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mdio@0 { /* PCIe serdes */
+ reg = <0x0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ mdio@2 { /* SATA */
+ reg = <0x2>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ mdio@3 { /* USB */
+ reg = <0x3>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ mdio@10 { /* RGMII */
+ reg = <0x10>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+ };
+
pwm: pwm@00010000 {
compatible = "brcm,iproc-pwm";
reg = <0x00010000 0x1000>;
@@ -277,6 +317,93 @@
status = "disabled";
};
+ timer0: timer@00030000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00030000 0x1000>;
+ interrupts = <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer1: timer@00040000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00040000 0x1000>;
+ interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ };
+
+ timer2: timer@00050000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00050000 0x1000>;
+ interrupts = <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer3: timer@00060000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00060000 0x1000>;
+ interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer4: timer@00070000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00070000 0x1000>;
+ interrupts = <GIC_SPI 207 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer5: timer@00080000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00080000 0x1000>;
+ interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer6: timer@00090000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x00090000 0x1000>;
+ interrupts = <GIC_SPI 209 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
+ timer7: timer@000a0000 {
+ compatible = "arm,sp804", "arm,primecell";
+ reg = <0x000a0000 0x1000>;
+ interrupts = <GIC_SPI 210 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&hsls_25m_div2_clk>,
+ <&hsls_25m_div2_clk>,
+ <&hsls_div4_clk>;
+ clock-names = "timer1", "timer2", "apb_pclk";
+ status = "disabled";
+ };
+
i2c0: i2c@000b0000 {
compatible = "brcm,iproc-i2c";
reg = <0x000b0000 0x100>;
@@ -424,6 +551,15 @@
iommus = <&smmu 0x6000 0x0000>;
};
+ enet: ethernet@00340000{
+ compatible = "brcm,amac";
+ reg = <0x00340000 0x1000>;
+ reg-names = "amac_base";
+ dma-coherent;
+ interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>;
+ status= "disabled";
+ };
+
nand: nand@00360000 {
compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
reg = <0x00360000 0x600>,
diff --git a/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi b/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
index 105b2938082f..297597442c44 100644
--- a/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
+++ b/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
@@ -307,20 +307,6 @@
samsung,pll-clock-frequency = <24000000>;
pinctrl-names = "default";
pinctrl-0 = <&te_irq>;
-
- ports {
- #address-cells = <1>;
- #size-cells = <0>;
-
- port@1 {
- reg = <1>;
-
- dsi_out: endpoint {
- samsung,burst-clock-frequency = <512000000>;
- samsung,esc-clock-frequency = <16000000>;
- };
- };
- };
};
&hdmi {
@@ -843,7 +829,6 @@
&mshc_0 {
status = "okay";
- num-slots = <1>;
mmc-hs200-1_8v;
mmc-hs400-1_8v;
cap-mmc-highspeed;
@@ -865,7 +850,6 @@
&mshc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
disable-wp;
cd-gpios = <&gpa2 4 GPIO_ACTIVE_HIGH>;
@@ -1210,8 +1194,9 @@
status = "okay";
};
-&usbdrd_dwc3_0 {
+&usbdrd_dwc3 {
dr_mode = "otg";
+ extcon = <&muic>;
};
&usbdrd30_phy {
diff --git a/arch/arm64/boot/dts/exynos/exynos5433.dtsi b/arch/arm64/boot/dts/exynos/exynos5433.dtsi
index 727f36abf3d4..7fe994b750da 100644
--- a/arch/arm64/boot/dts/exynos/exynos5433.dtsi
+++ b/arch/arm64/boot/dts/exynos/exynos5433.dtsi
@@ -1367,7 +1367,7 @@
ranges;
status = "disabled";
- dwc3@15400000 {
+ usbdrd_dwc3: dwc3@15400000 {
compatible = "snps,dwc3";
reg = <0x15400000 0x10000>;
interrupts = <GIC_SPI 231 IRQ_TYPE_LEVEL_HIGH>;
@@ -1414,7 +1414,7 @@
ranges;
status = "disabled";
- usbdrd_dwc3_0: dwc3@15a00000 {
+ usbhost_dwc3: dwc3@15a00000 {
compatible = "snps,dwc3";
reg = <0x15a00000 0x10000>;
interrupts = <GIC_SPI 244 IRQ_TYPE_LEVEL_HIGH>;
diff --git a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
index e5892bb0ae6e..4a8b1fb51243 100644
--- a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
+++ b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
@@ -359,7 +359,6 @@
&mmc_0 {
status = "okay";
- num-slots = <1>;
cap-mmc-highspeed;
mmc-hs200-1_8v;
non-removable;
@@ -375,7 +374,6 @@
&mmc_2 {
status = "okay";
- num-slots = <1>;
cap-sd-highspeed;
card-detect-delay = <200>;
clock-frequency = <400000000>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
index b1554cbd2c54..df83915d6ea6 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
@@ -444,6 +444,15 @@
<&clockgen 4 3>;
};
+ usb0: usb3@2f00000 {
+ compatible = "snps,dwc3";
+ reg = <0x0 0x2f00000 0x0 0x10000>;
+ interrupts = <0 60 0x4>;
+ dr_mode = "host";
+ snps,quirk-frame-length-adjustment = <0x20>;
+ snps,dis_rxdet_inp3_quirk;
+ };
+
sata: sata@3200000 {
compatible = "fsl,ls1012a-ahci", "fsl,ls1043a-ahci";
reg = <0x0 0x3200000 0x0 0x10000>,
@@ -454,5 +463,13 @@
dma-coherent;
status = "disabled";
};
+
+ usb1: usb2@8600000 {
+ compatible = "fsl-usb2-dr-v2.5", "fsl-usb2-dr";
+ reg = <0x0 0x8600000 0x0 0x1000>;
+ interrupts = <0 139 0x4>;
+ dr_mode = "host";
+ phy_type = "ulpi";
+ };
};
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
index 213abb72de93..0f6fcda36b9e 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
@@ -49,7 +49,7 @@
#include "fsl-ls1088a.dtsi"
/ {
- model = "L1088A RDB Board";
+ model = "LS1088A RDB Board";
compatible = "fsl,ls1088a-rdb", "fsl,ls1088a";
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
index c144d06a6e33..33797b373674 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
@@ -52,6 +52,10 @@
#address-cells = <2>;
#size-cells = <2>;
+ aliases {
+ crypto = &crypto;
+ };
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
@@ -62,6 +66,7 @@
compatible = "arm,cortex-a53";
reg = <0x0>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PH20>;
#cooling-cells = <2>;
};
@@ -70,6 +75,7 @@
compatible = "arm,cortex-a53";
reg = <0x1>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PH20>;
};
cpu2: cpu@2 {
@@ -77,6 +83,7 @@
compatible = "arm,cortex-a53";
reg = <0x2>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PH20>;
};
cpu3: cpu@3 {
@@ -84,6 +91,7 @@
compatible = "arm,cortex-a53";
reg = <0x3>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PH20>;
};
cpu4: cpu@100 {
@@ -91,6 +99,7 @@
compatible = "arm,cortex-a53";
reg = <0x100>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PH20>;
#cooling-cells = <2>;
};
@@ -99,6 +108,7 @@
compatible = "arm,cortex-a53";
reg = <0x101>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PH20>;
};
cpu6: cpu@102 {
@@ -106,6 +116,7 @@
compatible = "arm,cortex-a53";
reg = <0x102>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PH20>;
};
cpu7: cpu@103 {
@@ -113,6 +124,16 @@
compatible = "arm,cortex-a53";
reg = <0x103>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PH20>;
+ };
+
+ CPU_PH20: cpu-ph20 {
+ compatible = "arm,idle-state";
+ idle-state-name = "PH20";
+ arm,psci-suspend-param = <0x00010000>;
+ entry-latency-us = <1000>;
+ exit-latency-us = <1000>;
+ min-residency-us = <3000>;
};
};
@@ -136,6 +157,11 @@
<1 10 IRQ_TYPE_LEVEL_LOW>;/* Hypervisor PPI */
};
+ psci {
+ compatible = "arm,psci-0.2";
+ method = "smc";
+ };
+
sysclk: sysclk {
compatible = "fixed-clock";
#clock-cells = <0>;
@@ -369,6 +395,45 @@
dma-coherent;
status = "disabled";
};
+
+ crypto: crypto@8000000 {
+ compatible = "fsl,sec-v5.0", "fsl,sec-v4.0";
+ fsl,sec-era = <8>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x00 0x8000000 0x100000>;
+ reg = <0x00 0x8000000 0x0 0x100000>;
+ interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
+
+ sec_jr0: jr@10000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x10000 0x10000>;
+ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr1: jr@20000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x20000 0x10000>;
+ interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr2: jr@30000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x30000 0x10000>;
+ interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr3: jr@40000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x40000 0x10000>;
+ interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
};
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts b/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts
index ed209cd57283..3c99608b9b45 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts
@@ -55,11 +55,6 @@
model = "Freescale Layerscape 2080a QDS Board";
compatible = "fsl,ls2080a-qds", "fsl,ls2080a";
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- };
-
chosen {
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts
index 67ec3f9c81a1..a4e7de9f70d8 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts
@@ -55,11 +55,6 @@
model = "Freescale Layerscape 2080a RDB Board";
compatible = "fsl,ls2080a-rdb", "fsl,ls2080a";
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- };
-
chosen {
stdout-path = "serial1:115200n8";
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts b/arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts
index 3ee718f0aaf8..fbbb73e571c0 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts
@@ -52,11 +52,6 @@
model = "Freescale Layerscape 2080a software Simulator model";
compatible = "fsl,ls2080a-simu", "fsl,ls2080a";
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- };
-
ethernet@2210000 {
compatible = "smsc,lan91c111";
reg = <0x0 0x2210000 0x0 0x100>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
index d789c6814e6a..8d739301e7b8 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
@@ -53,6 +53,7 @@
compatible = "arm,cortex-a57";
reg = <0x0>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster0_l2>;
#cooling-cells = <2>;
};
@@ -62,6 +63,7 @@
compatible = "arm,cortex-a57";
reg = <0x1>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster0_l2>;
};
@@ -70,6 +72,7 @@
compatible = "arm,cortex-a57";
reg = <0x100>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster1_l2>;
#cooling-cells = <2>;
};
@@ -79,6 +82,7 @@
compatible = "arm,cortex-a57";
reg = <0x101>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster1_l2>;
};
@@ -87,6 +91,7 @@
compatible = "arm,cortex-a57";
reg = <0x200>;
clocks = <&clockgen 1 2>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster2_l2>;
#cooling-cells = <2>;
};
@@ -96,6 +101,7 @@
compatible = "arm,cortex-a57";
reg = <0x201>;
clocks = <&clockgen 1 2>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster2_l2>;
};
@@ -105,6 +111,7 @@
reg = <0x300>;
clocks = <&clockgen 1 3>;
next-level-cache = <&cluster3_l2>;
+ cpu-idle-states = <&CPU_PW20>;
#cooling-cells = <2>;
};
@@ -113,6 +120,7 @@
compatible = "arm,cortex-a57";
reg = <0x301>;
clocks = <&clockgen 1 3>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster3_l2>;
};
@@ -131,6 +139,15 @@
cluster3_l2: l2-cache3 {
compatible = "cache";
};
+
+ CPU_PW20: cpu-pw20 {
+ compatible = "arm,idle-state";
+ idle-state-name = "PW20";
+ arm,psci-suspend-param = <0x00010000>;
+ entry-latency-us = <2000>;
+ exit-latency-us = <2000>;
+ min-residency-us = <6000>;
+ };
};
&pcie1 {
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts b/arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts
index 4a1df5ce3229..eaee5b1c3a44 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts
@@ -54,11 +54,6 @@
model = "Freescale Layerscape 2088A QDS Board";
compatible = "fsl,ls2088a-qds", "fsl,ls2088a";
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- };
-
chosen {
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts
index a76d4b4debd1..c411442cac62 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts
@@ -54,11 +54,6 @@
model = "Freescale Layerscape 2088A RDB Board";
compatible = "fsl,ls2088a-rdb", "fsl,ls2088a";
- aliases {
- serial0 = &serial0;
- serial1 = &serial1;
- };
-
chosen {
stdout-path = "serial1:115200n8";
};
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi
index 5c695c658056..6aa319dae396 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi
@@ -53,6 +53,7 @@
compatible = "arm,cortex-a72";
reg = <0x0>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster0_l2>;
#cooling-cells = <2>;
};
@@ -62,6 +63,7 @@
compatible = "arm,cortex-a72";
reg = <0x1>;
clocks = <&clockgen 1 0>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster0_l2>;
};
@@ -70,6 +72,7 @@
compatible = "arm,cortex-a72";
reg = <0x100>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster1_l2>;
#cooling-cells = <2>;
};
@@ -79,6 +82,7 @@
compatible = "arm,cortex-a72";
reg = <0x101>;
clocks = <&clockgen 1 1>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster1_l2>;
};
@@ -88,6 +92,7 @@
reg = <0x200>;
clocks = <&clockgen 1 2>;
next-level-cache = <&cluster2_l2>;
+ cpu-idle-states = <&CPU_PW20>;
#cooling-cells = <2>;
};
@@ -96,6 +101,7 @@
compatible = "arm,cortex-a72";
reg = <0x201>;
clocks = <&clockgen 1 2>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster2_l2>;
};
@@ -104,6 +110,7 @@
compatible = "arm,cortex-a72";
reg = <0x300>;
clocks = <&clockgen 1 3>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster3_l2>;
#cooling-cells = <2>;
};
@@ -113,6 +120,7 @@
compatible = "arm,cortex-a72";
reg = <0x301>;
clocks = <&clockgen 1 3>;
+ cpu-idle-states = <&CPU_PW20>;
next-level-cache = <&cluster3_l2>;
};
@@ -131,6 +139,15 @@
cluster3_l2: l2-cache3 {
compatible = "cache";
};
+
+ CPU_PW20: cpu-pw20 {
+ compatible = "arm,idle-state";
+ idle-state-name = "PW20";
+ arm,psci-suspend-param = <0x00010000>;
+ entry-latency-us = <2000>;
+ exit-latency-us = <2000>;
+ min-residency-us = <6000>;
+ };
};
&pcie1 {
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
index 94cdd3045037..4fb9a0966a84 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
@@ -46,6 +46,7 @@
*/
#include <dt-bindings/thermal/thermal.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
/ {
compatible = "fsl,ls2080a";
@@ -53,6 +54,12 @@
#address-cells = <2>;
#size-cells = <2>;
+ aliases {
+ crypto = &crypto;
+ serial0 = &serial0;
+ serial1 = &serial1;
+ };
+
cpu: cpus {
#address-cells = <1>;
#size-cells = <0>;
@@ -118,6 +125,11 @@
interrupts = <1 7 0x8>; /* PMU PPI, Level low type */
};
+ psci {
+ compatible = "arm,psci-0.2";
+ method = "smc";
+ };
+
soc {
compatible = "simple-bus";
#address-cells = <2>;
@@ -301,6 +313,45 @@
clock-names = "apb_pclk", "wdog_clk";
};
+ crypto: crypto@8000000 {
+ compatible = "fsl,sec-v5.0", "fsl,sec-v4.0";
+ fsl,sec-era = <8>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x00 0x8000000 0x100000>;
+ reg = <0x00 0x8000000 0x0 0x100000>;
+ interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+ dma-coherent;
+
+ sec_jr0: jr@10000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x10000 0x10000>;
+ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr1: jr@20000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x20000 0x10000>;
+ interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr2: jr@30000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x30000 0x10000>;
+ interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ sec_jr3: jr@40000 {
+ compatible = "fsl,sec-v5.0-job-ring",
+ "fsl,sec-v4.0-job-ring";
+ reg = <0x40000 0x10000>;
+ interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
fsl_mc: fsl-mc@80c000000 {
compatible = "fsl,qoriq-mc";
reg = <0x00000008 0x0c000000 0 0x40>, /* MC portal base */
diff --git a/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts b/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
index 6609b0fe7a8b..fd4705c451e2 100644
--- a/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
+++ b/arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
@@ -39,6 +39,34 @@
reg = <0x0 0x0 0x0 0x0>;
};
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ ramoops@32000000 {
+ compatible = "ramoops";
+ reg = <0x0 0x32000000 0x0 0x00100000>;
+ record-size = <0x00020000>;
+ console-size = <0x00020000>;
+ ftrace-size = <0x00020000>;
+ };
+ };
+
+ reboot-mode-syscon@32100000 {
+ compatible = "syscon", "simple-mfd";
+ reg = <0x0 0x32100000 0x0 0x00001000>;
+
+ reboot-mode {
+ compatible = "syscon-reboot-mode";
+ offset = <0x0>;
+
+ mode-normal = <0x77665501>;
+ mode-bootloader = <0x77665500>;
+ mode-recovery = <0x77665502>;
+ };
+ };
+
keys {
compatible = "gpio-keys";
pinctrl-names = "default";
@@ -159,6 +187,13 @@
startup-delay-us = <70000>;
enable-active-high;
};
+
+ firmware {
+ optee {
+ compatible = "linaro,optee-tz";
+ method = "smc";
+ };
+ };
};
&i2c0 {
@@ -195,7 +230,7 @@
bluetooth {
compatible = "ti,wl1837-st";
enable-gpios = <&gpio15 6 GPIO_ACTIVE_HIGH>;
- max-speed = <921600>;
+ max-speed = <3000000>;
};
};
diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
index c6a1961e8d55..b7a90d632959 100644
--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
@@ -58,6 +58,8 @@
device_type = "cpu";
reg = <0x0 0x0>;
enable-method = "psci";
+ next-level-cache = <&A53_L2>;
+ cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP_0>;
};
cpu1: cpu@1 {
@@ -65,6 +67,8 @@
device_type = "cpu";
reg = <0x0 0x1>;
enable-method = "psci";
+ next-level-cache = <&A53_L2>;
+ cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP_0>;
};
cpu2: cpu@2 {
@@ -72,6 +76,8 @@
device_type = "cpu";
reg = <0x0 0x2>;
enable-method = "psci";
+ next-level-cache = <&A53_L2>;
+ cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP_0>;
};
cpu3: cpu@3 {
@@ -79,6 +85,8 @@
device_type = "cpu";
reg = <0x0 0x3>;
enable-method = "psci";
+ next-level-cache = <&A53_L2>;
+ cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP_0>;
};
cpu4: cpu@100 {
@@ -86,6 +94,12 @@
device_type = "cpu";
reg = <0x0 0x100>;
enable-method = "psci";
+ next-level-cache = <&A73_L2>;
+ cpu-idle-states = <
+ &CPU_NAP
+ &CPU_SLEEP
+ &CLUSTER_SLEEP_1
+ >;
};
cpu5: cpu@101 {
@@ -93,6 +107,12 @@
device_type = "cpu";
reg = <0x0 0x101>;
enable-method = "psci";
+ next-level-cache = <&A73_L2>;
+ cpu-idle-states = <
+ &CPU_NAP
+ &CPU_SLEEP
+ &CLUSTER_SLEEP_1
+ >;
};
cpu6: cpu@102 {
@@ -100,6 +120,12 @@
device_type = "cpu";
reg = <0x0 0x102>;
enable-method = "psci";
+ next-level-cache = <&A73_L2>;
+ cpu-idle-states = <
+ &CPU_NAP
+ &CPU_SLEEP
+ &CLUSTER_SLEEP_1
+ >;
};
cpu7: cpu@103 {
@@ -107,6 +133,59 @@
device_type = "cpu";
reg = <0x0 0x103>;
enable-method = "psci";
+ next-level-cache = <&A73_L2>;
+ cpu-idle-states = <
+ &CPU_NAP
+ &CPU_SLEEP
+ &CLUSTER_SLEEP_1
+ >;
+ };
+
+ idle-states {
+ entry-method = "psci";
+
+ CPU_NAP: cpu-nap {
+ compatible = "arm,idle-state";
+ arm,psci-suspend-param = <0x0000001>;
+ entry-latency-us = <7>;
+ exit-latency-us = <2>;
+ min-residency-us = <15>;
+ };
+
+ CPU_SLEEP: cpu-sleep {
+ compatible = "arm,idle-state";
+ local-timer-stop;
+ arm,psci-suspend-param = <0x0010000>;
+ entry-latency-us = <40>;
+ exit-latency-us = <70>;
+ min-residency-us = <3000>;
+ };
+
+ CLUSTER_SLEEP_0: cluster-sleep-0 {
+ compatible = "arm,idle-state";
+ local-timer-stop;
+ arm,psci-suspend-param = <0x1010000>;
+ entry-latency-us = <500>;
+ exit-latency-us = <5000>;
+ min-residency-us = <20000>;
+ };
+
+ CLUSTER_SLEEP_1: cluster-sleep-1 {
+ compatible = "arm,idle-state";
+ local-timer-stop;
+ arm,psci-suspend-param = <0x1010000>;
+ entry-latency-us = <1000>;
+ exit-latency-us = <5000>;
+ min-residency-us = <20000>;
+ };
+ };
+
+ A53_L2: l2-cache0 {
+ compatible = "cache";
+ };
+
+ A73_L2: l2-cache1 {
+ compatible = "cache";
};
};
@@ -123,6 +202,26 @@
IRQ_TYPE_LEVEL_HIGH)>;
};
+ pmu {
+ compatible = "arm,armv8-pmuv3";
+ interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-affinity = <&cpu0>,
+ <&cpu1>,
+ <&cpu2>,
+ <&cpu3>,
+ <&cpu4>,
+ <&cpu5>,
+ <&cpu6>,
+ <&cpu7>;
+ };
+
timer {
compatible = "arm,armv8-timer";
interrupt-parent = <&gic>;
@@ -337,6 +436,19 @@
status = "disabled";
};
+ dma0: dma@fdf30000 {
+ compatible = "hisilicon,k3-dma-1.0";
+ reg = <0x0 0xfdf30000 0x0 0x1000>;
+ #dma-cells = <1>;
+ dma-channels = <16>;
+ dma-requests = <32>;
+ dma-min-chan = <1>;
+ interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&crg_ctrl HI3660_CLK_GATE_DMAC>;
+ dma-no-cci;
+ dma-type = "hi3660_dma";
+ };
+
rtc0: rtc@fff04000 {
compatible = "arm,pl031", "arm,primecell";
reg = <0x0 0Xfff04000 0x0 0x1000>;
@@ -810,6 +922,7 @@
clock-names = "ciu", "biu";
clock-frequency = <3200000>;
resets = <&crg_rst 0x94 18>;
+ reset-names = "reset";
cd-gpios = <&gpio25 3 0>;
hisilicon,peripheral-syscon = <&sctrl>;
pinctrl-names = "default";
@@ -839,6 +952,7 @@
<&crg_ctrl HI3660_HCLK_GATE_SDIO0>;
clock-names = "ciu", "biu";
resets = <&crg_rst 0x94 20>;
+ reset-names = "reset";
card-detect-delay = <200>;
supports-highspeed;
keep-power-in-suspend;
@@ -848,5 +962,21 @@
&sdio_cfg_func>;
status = "disabled";
};
+
+ watchdog0: watchdog@e8a06000 {
+ compatible = "arm,sp805-wdt", "arm,primecell";
+ reg = <0x0 0xe8a06000 0x0 0x1000>;
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&crg_ctrl HI3660_OSC32K>;
+ clock-names = "apb_pclk";
+ };
+
+ watchdog1: watchdog@e8a07000 {
+ compatible = "arm,sp805-wdt", "arm,primecell";
+ reg = <0x0 0xe8a07000 0x0 0x1000>;
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&crg_ctrl HI3660_OSC32K>;
+ clock-names = "apb_pclk";
+ };
};
};
diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
index eacbe0db5bc2..02a3aa4b2165 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
@@ -262,6 +262,12 @@
#clock-cells = <1>;
};
+ acpu_sctrl: acpu_sctrl@f6504000 {
+ compatible = "hisilicon,hi6220-acpu-sctrl", "syscon";
+ reg = <0x0 0xf6504000 0x0 0x1000>;
+ #clock-cells = <1>;
+ };
+
medianoc_ade: medianoc_ade@f4520000 {
compatible = "syscon";
reg = <0x0 0xf4520000 0x0 0x4000>;
@@ -755,7 +761,8 @@
dr_mode = "otg";
g-rx-fifo-size = <512>;
g-np-tx-fifo-size = <128>;
- g-tx-fifo-size = <128 128 128 128 128 128>;
+ g-tx-fifo-size = <128 128 128 128 128 128 128 128
+ 16 16 16 16 16 16 16>;
interrupts = <0 77 0x4>;
};
diff --git a/arch/arm64/boot/dts/hisilicon/hip07-d05.dts b/arch/arm64/boot/dts/hisilicon/hip07-d05.dts
index f5d7f0889b41..fe7c16c36025 100644
--- a/arch/arm64/boot/dts/hisilicon/hip07-d05.dts
+++ b/arch/arm64/boot/dts/hisilicon/hip07-d05.dts
@@ -84,3 +84,7 @@
&sas1 {
status = "ok";
};
+
+&p0_pcie2_a {
+ status = "ok";
+};
diff --git a/arch/arm64/boot/dts/hisilicon/hip07.dtsi b/arch/arm64/boot/dts/hisilicon/hip07.dtsi
index 283d7b532e16..2c01a21c3665 100644
--- a/arch/arm64/boot/dts/hisilicon/hip07.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hip07.dtsi
@@ -1534,5 +1534,27 @@
<637 1>,<638 1>,<639 1>;
status = "disabled";
};
+
+ p0_pcie2_a: pcie@a00a0000 {
+ compatible = "hisilicon,hip07-pcie-ecam";
+ reg = <0 0xaf800000 0 0x800000>,
+ <0 0xa00a0000 0 0x10000>;
+ bus-range = <0xf8 0xff>;
+ msi-map = <0xf800 &p0_its_dsa_a 0xf800 0x800>;
+ msi-map-mask = <0xffff>;
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ dma-coherent;
+ ranges = <0x02000000 0 0xa8000000 0 0xa8000000 0 0x77f0000
+ 0x01000000 0 0 0 0xaf7f0000 0 0x10000>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0xf800 0 0 7>;
+ interrupt-map = <0x0 0 0 1 &mbigen_pcie2_a 671 4
+ 0x0 0 0 2 &mbigen_pcie2_a 671 4
+ 0x0 0 0 3 &mbigen_pcie2_a 671 4
+ 0x0 0 0 4 &mbigen_pcie2_a 671 4>;
+ status = "disabled";
+ };
};
};
diff --git a/arch/arm64/boot/dts/marvell/Makefile b/arch/arm64/boot/dts/marvell/Makefile
index 3e6ce6c15a74..6cff81eeaae2 100644
--- a/arch/arm64/boot/dts/marvell/Makefile
+++ b/arch/arm64/boot/dts/marvell/Makefile
@@ -8,6 +8,7 @@ dtb-$(CONFIG_ARCH_MVEBU) += armada-3720-espressobin.dtb
dtb-$(CONFIG_ARCH_MVEBU) += armada-7040-db.dtb
dtb-$(CONFIG_ARCH_MVEBU) += armada-8040-db.dtb
dtb-$(CONFIG_ARCH_MVEBU) += armada-8040-mcbin.dtb
+dtb-$(CONFIG_ARCH_MVEBU) += armada-8080-db.dtb
always := $(dtb-y)
subdir-y := $(dts-dirs)
diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
index e3a136ed77b0..2ce52ba74f73 100644
--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
@@ -45,6 +45,7 @@
/dts-v1/;
+#include <dt-bindings/gpio/gpio.h>
#include "armada-372x.dtsi"
/ {
@@ -59,6 +60,20 @@
device_type = "memory";
reg = <0x00000000 0x00000000 0x00000000 0x20000000>;
};
+
+ vcc_sd_reg1: regulator {
+ compatible = "regulator-gpio";
+ regulator-name = "vcc_sd1";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+
+ gpios = <&gpionb 4 GPIO_ACTIVE_HIGH>;
+ gpios-states = <0>;
+ states = <1800000 0x1
+ 3300000 0x0>;
+ enable-active-high;
+ };
};
/* J9 */
@@ -71,6 +86,16 @@
status = "okay";
};
+/* J1 */
+&sdhci1 {
+ wp-inverted;
+ bus-width = <4>;
+ cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>;
+ marvell,pad-type = "sd";
+ vqmmc-supply = <&vcc_sd_reg1>;
+ status = "okay";
+};
+
/* Exported on the micro USB connector J5 through an FTDI */
&uart0 {
status = "okay";
@@ -81,6 +106,11 @@
status = "okay";
};
+/* J8 */
+&usb2 {
+ status = "okay";
+};
+
&mdio {
switch0: switch0@1 {
compatible = "marvell,mv88e6085";
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index 51763d674050..8c0cf7efac65 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -81,6 +81,11 @@
<GIC_PPI 10 IRQ_TYPE_LEVEL_HIGH>;
};
+ pmu {
+ compatible = "arm,armv8-pmuv3";
+ interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
soc {
compatible = "simple-bus";
#address-cells = <2>;
@@ -322,7 +327,11 @@
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x1d00000 0x10000>, /* GICD */
- <0x1d40000 0x40000>; /* GICR */
+ <0x1d40000 0x40000>, /* GICR */
+ <0x1d80000 0x2000>, /* GICC */
+ <0x1d90000 0x2000>, /* GICH */
+ <0x1da0000 0x20000>; /* GICV */
+ interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
};
};
diff --git a/arch/arm64/boot/dts/marvell/armada-7040-db.dts b/arch/arm64/boot/dts/marvell/armada-7040-db.dts
index 92c761c380d3..9c3bdf87e543 100644
--- a/arch/arm64/boot/dts/marvell/armada-7040-db.dts
+++ b/arch/arm64/boot/dts/marvell/armada-7040-db.dts
@@ -44,6 +44,7 @@
* Device Tree file for Marvell Armada 7040 Development board platform
*/
+#include <dt-bindings/gpio/gpio.h>
#include "armada-7040.dtsi"
/ {
@@ -59,6 +60,34 @@
device_type = "memory";
reg = <0x0 0x0 0x0 0x80000000>;
};
+
+ cpm_reg_usb3_0_vbus: cpm-usb3-0-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "usb3h0-vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ enable-active-high;
+ gpio = <&expander0 0 GPIO_ACTIVE_HIGH>;
+ };
+
+ cpm_reg_usb3_1_vbus: cpm-usb3-1-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "usb3h1-vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ enable-active-high;
+ gpio = <&expander0 1 GPIO_ACTIVE_HIGH>;
+ };
+
+ cpm_usb3_0_phy: cpm-usb3-0-phy {
+ compatible = "usb-nop-xceiv";
+ vcc-supply = <&cpm_reg_usb3_0_vbus>;
+ };
+
+ cpm_usb3_1_phy: cpm-usb3-1-phy {
+ compatible = "usb-nop-xceiv";
+ vcc-supply = <&cpm_reg_usb3_1_vbus>;
+ };
};
&i2c0 {
@@ -105,6 +134,14 @@
&cpm_i2c0 {
status = "okay";
clock-frequency = <100000>;
+
+ expander0: pca9555@21 {
+ compatible = "nxp,pca9555";
+ pinctrl-names = "default";
+ gpio-controller;
+ #gpio-cells = <2>;
+ reg = <0x21>;
+ };
};
&cpm_spi1 {
@@ -140,10 +177,12 @@
};
&cpm_usb3_0 {
+ usb-phy = <&cpm_usb3_0_phy>;
status = "okay";
};
&cpm_usb3_1 {
+ usb-phy = <&cpm_usb3_1_phy>;
status = "okay";
};
diff --git a/arch/arm64/boot/dts/marvell/armada-8040-db.dts b/arch/arm64/boot/dts/marvell/armada-8040-db.dts
index 1e8f7242ed6f..0d7b2ae46610 100644
--- a/arch/arm64/boot/dts/marvell/armada-8040-db.dts
+++ b/arch/arm64/boot/dts/marvell/armada-8040-db.dts
@@ -44,6 +44,7 @@
* Device Tree file for Marvell Armada 8040 Development board platform
*/
+#include <dt-bindings/gpio/gpio.h>
#include "armada-8040.dtsi"
/ {
@@ -59,6 +60,48 @@
device_type = "memory";
reg = <0x0 0x0 0x0 0x80000000>;
};
+
+ cpm_reg_usb3_0_vbus: cpm-usb3-0-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "cpm-usb3h0-vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ enable-active-high;
+ gpio = <&expander0 0 GPIO_ACTIVE_HIGH>;
+ };
+
+ cpm_reg_usb3_1_vbus: cpm-usb3-1-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "cpm-usb3h1-vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ enable-active-high;
+ gpio = <&expander0 1 GPIO_ACTIVE_HIGH>;
+ };
+
+ cpm_usb3_0_phy: cpm-usb3-0-phy {
+ compatible = "usb-nop-xceiv";
+ vcc-supply = <&cpm_reg_usb3_0_vbus>;
+ };
+
+ cpm_usb3_1_phy: cpm-usb3-1-phy {
+ compatible = "usb-nop-xceiv";
+ vcc-supply = <&cpm_reg_usb3_1_vbus>;
+ };
+
+ cps_reg_usb3_0_vbus: cps-usb3-0-vbus {
+ compatible = "regulator-fixed";
+ regulator-name = "cps-usb3h0-vbus";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ enable-active-high;
+ gpio = <&expander1 0 GPIO_ACTIVE_HIGH>;
+ };
+
+ cps_usb3_0_phy: cps-usb3-0-phy {
+ compatible = "usb-nop-xceiv";
+ vcc-supply = <&cps_reg_usb3_0_vbus>;
+ };
};
&i2c0 {
@@ -107,6 +150,25 @@
&cpm_i2c0 {
status = "okay";
clock-frequency = <100000>;
+
+ /* U31 */
+ expander0: pca9555@21 {
+ compatible = "nxp,pca9555";
+ pinctrl-names = "default";
+ gpio-controller;
+ #gpio-cells = <2>;
+ reg = <0x21>;
+ };
+
+ /* U25 */
+ expander1: pca9555@25 {
+ compatible = "nxp,pca9555";
+ pinctrl-names = "default";
+ gpio-controller;
+ #gpio-cells = <2>;
+ reg = <0x25>;
+ };
+
};
/* CON4 on CP0 expansion */
@@ -116,11 +178,13 @@
/* CON9 on CP0 expansion */
&cpm_usb3_0 {
+ usb-phy = <&cpm_usb3_0_phy>;
status = "okay";
};
/* CON10 on CP0 expansion */
&cpm_usb3_1 {
+ usb-phy = <&cpm_usb3_1_phy>;
status = "okay";
};
@@ -159,6 +223,7 @@
/* CON9 on CP1 expansion */
&cps_usb3_0 {
+ usb-phy = <&cps_usb3_0_phy>;
status = "okay";
};
diff --git a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts
index 4968e731de61..acf5c7d16d79 100644
--- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts
+++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts
@@ -46,11 +46,17 @@
#include "armada-8040.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+
/ {
model = "Marvell 8040 MACHIATOBin";
compatible = "marvell,armada8040-mcbin", "marvell,armada8040",
"marvell,armada-ap806-quad", "marvell,armada-ap806";
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
memory@00000000 {
device_type = "memory";
reg = <0x0 0x0 0x0 0x80000000>;
@@ -77,11 +83,13 @@
v_5v0_usb3_hst_vbus: regulator-usb3-vbus0 {
compatible = "regulator-fixed";
+ enable-active-high;
+ gpio = <&cpm_gpio2 15 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_xhci_vbus_pins>;
regulator-name = "v_5v0_usb3_hst_vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
- /* actually GPIO controlled, but 8k has no GPIO support yet */
- regulator-always-on;
status = "okay";
};
@@ -112,10 +120,44 @@
&cpm_i2c0 {
clock-frequency = <100000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_i2c0_pins>;
status = "okay";
};
+&cpm_i2c1 {
+ clock-frequency = <100000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_i2c1_pins>;
+ status = "okay";
+
+ i2c-switch@70 {
+ compatible = "nxp,pca9548";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0x70>;
+
+ sfpp0_i2c: i2c@0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+ };
+ sfpp1_i2c: i2c@1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <1>;
+ };
+ sfp_1g_i2c: i2c@2 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <2>;
+ };
+ };
+};
+
&cpm_mdio {
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_ge_mdio_pins>;
status = "okay";
ge_phy: ethernet-phy@0 {
@@ -123,6 +165,67 @@
};
};
+&cpm_pcie0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_pcie_pins>;
+ num-lanes = <4>;
+ num-viewport = <8>;
+ reset-gpio = <&cpm_gpio1 20 GPIO_ACTIVE_LOW>;
+ status = "okay";
+};
+
+&cpm_pinctrl {
+ cpm_ge_mdio_pins: ge-mdio-pins {
+ marvell,pins = "mpp32", "mpp34";
+ marvell,function = "ge";
+ };
+ cpm_i2c1_pins: i2c1-pins {
+ marvell,pins = "mpp35", "mpp36";
+ marvell,function = "i2c1";
+ };
+ cpm_i2c0_pins: i2c0-pins {
+ marvell,pins = "mpp37", "mpp38";
+ marvell,function = "i2c0";
+ };
+ cpm_xhci_vbus_pins: xhci0-vbus-pins {
+ marvell,pins = "mpp47";
+ marvell,function = "gpio";
+ };
+ cpm_pcie_pins: pcie-pins {
+ marvell,pins = "mpp52";
+ marvell,function = "gpio";
+ };
+ cpm_sdhci_pins: sdhci-pins {
+ marvell,pins = "mpp55", "mpp56", "mpp57", "mpp58", "mpp59",
+ "mpp60", "mpp61";
+ marvell,function = "sdio";
+ };
+};
+
+&cpm_xmdio {
+ status = "okay";
+
+ phy0: ethernet-phy@0 {
+ compatible = "ethernet-phy-ieee802.3-c45";
+ reg = <0>;
+ };
+
+ phy8: ethernet-phy@8 {
+ compatible = "ethernet-phy-ieee802.3-c45";
+ reg = <8>;
+ };
+};
+
+&cpm_ethernet {
+ status = "okay";
+};
+
+&cpm_eth0 {
+ status = "okay";
+ phy = <&phy0>;
+ phy-mode = "10gbase-kr";
+};
+
&cpm_sata0 {
/* CPM Lane 0 - U29 */
status = "okay";
@@ -132,6 +235,8 @@
/* U6 */
broken-cd;
bus-width = <4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&cpm_sdhci_pins>;
status = "okay";
vqmmc-supply = <&v_3_3>;
};
@@ -150,6 +255,12 @@
status = "okay";
};
+&cps_eth0 {
+ status = "okay";
+ phy = <&phy8>;
+ phy-mode = "10gbase-kr";
+};
+
&cps_eth1 {
/* CPS Lane 0 - J5 (Gigabit RJ45) */
status = "okay";
@@ -157,6 +268,13 @@
phy-mode = "sgmii";
};
+&cps_pinctrl {
+ cps_spi1_pins: spi1-pins {
+ marvell,pins = "mpp12", "mpp13", "mpp14", "mpp15", "mpp16";
+ marvell,function = "spi1";
+ };
+};
+
&cps_sata0 {
/* CPS Lane 1 - U32 */
/* CPS Lane 3 - U31 */
@@ -164,6 +282,8 @@
};
&cps_spi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&cps_spi1_pins>;
status = "okay";
spi-flash@0 {
diff --git a/arch/arm64/boot/dts/marvell/armada-8080-db.dts b/arch/arm64/boot/dts/marvell/armada-8080-db.dts
new file mode 100644
index 000000000000..707af833832b
--- /dev/null
+++ b/arch/arm64/boot/dts/marvell/armada-8080-db.dts
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada-8080 Development board platform
+ */
+
+#include "armada-8080.dtsi"
+
+/ {
+ model = "Marvell 8080 board";
+ compatible = "marvell,armada-8080-db", "marvell,armada-8080",
+ "marvell,armada-ap810-octa", "marvell,armada-ap810";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory@00000000 {
+ device_type = "memory";
+ reg = <0x0 0x0 0x0 0x80000000>;
+ };
+};
+
+&uart0_ap0 {
+ clock-frequency = <384000>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-8080.dtsi b/arch/arm64/boot/dts/marvell/armada-8080.dtsi
new file mode 100644
index 000000000000..d5535b716735
--- /dev/null
+++ b/arch/arm64/boot/dts/marvell/armada-8080.dtsi
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada-8080 SoC, made of an AP810 OCTA.
+ */
+
+#include "armada-ap810-ap0-octa-core.dtsi"
+
+/ {
+ model = "Marvell 8080 board";
+ compatible = "marvell,armada-8080", "marvell,armada-ap810-octa",
+ "marvell,armada-ap810";
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-ap806.dtsi b/arch/arm64/boot/dts/marvell/armada-ap806.dtsi
index 4d360713ed12..30d48ecf46e0 100644
--- a/arch/arm64/boot/dts/marvell/armada-ap806.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-ap806.dtsi
@@ -254,7 +254,7 @@
ap_syscon: system-controller@6f4000 {
compatible = "syscon", "simple-mfd";
- reg = <0x6f4000 0x1000>;
+ reg = <0x6f4000 0x2000>;
ap_clk: clock {
compatible = "marvell,ap806-clock";
@@ -265,7 +265,7 @@
compatible = "marvell,ap806-pinctrl";
};
- ap_gpio: gpio {
+ ap_gpio: gpio@1040 {
compatible = "marvell,armada-8k-gpio";
offset = <0x1040>;
ngpios = <20>;
diff --git a/arch/arm64/boot/dts/marvell/armada-ap810-ap0-octa-core.dtsi b/arch/arm64/boot/dts/marvell/armada-ap810-ap0-octa-core.dtsi
new file mode 100644
index 000000000000..bf1b22b70384
--- /dev/null
+++ b/arch/arm64/boot/dts/marvell/armada-ap810-ap0-octa-core.dtsi
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2017 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada AP810 OCTA cores.
+ */
+
+#include "armada-ap810-ap0.dtsi"
+
+/ {
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "marvell,armada-ap810-octa";
+
+ cpu@000 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x000>;
+ enable-method = "psci";
+ };
+ cpu@001 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x001>;
+ enable-method = "psci";
+ };
+ cpu@100 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x100>;
+ enable-method = "psci";
+ };
+ cpu@101 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x101>;
+ enable-method = "psci";
+ };
+ cpu@200 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x200>;
+ enable-method = "psci";
+ };
+ cpu@201 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x201>;
+ enable-method = "psci";
+ };
+ cpu@300 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x300>;
+ enable-method = "psci";
+ };
+ cpu@301 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72", "arm,armv8";
+ reg = <0x301>;
+ enable-method = "psci";
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-ap810-ap0.dtsi b/arch/arm64/boot/dts/marvell/armada-ap810-ap0.dtsi
new file mode 100644
index 000000000000..7e6f039f0f80
--- /dev/null
+++ b/arch/arm64/boot/dts/marvell/armada-ap810-ap0.dtsi
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2017 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada AP810.
+ */
+
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/dts-v1/;
+
+/ {
+ model = "Marvell Armada AP810";
+ compatible = "marvell,armada-ap810";
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ aliases {
+ serial0 = &uart0_ap0;
+ serial1 = &uart1_ap0;
+ };
+
+ psci {
+ compatible = "arm,psci-0.2";
+ method = "smc";
+ };
+
+ ap810-ap0 {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ compatible = "simple-bus";
+ interrupt-parent = <&gic>;
+ ranges;
+
+ config-space@e8000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "simple-bus";
+ ranges = <0x0 0x0 0xe8000000 0x4000000>;
+ interrupt-parent = <&gic>;
+
+ gic: interrupt-controller@3000000 {
+ compatible = "arm,gic-v3";
+ #interrupt-cells = <3>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ interrupt-controller;
+ interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
+ ranges;
+
+ reg = <0x3000000 0x10000>, /* GICD */
+ <0x3060000 0x100000>, /* GICR */
+ <0x00c0000 0x2000>, /* GICC */
+ <0x00d0000 0x1000>, /* GICH */
+ <0x00e0000 0x2000>; /* GICV */
+
+ gic_its_ap0: interrupt-controller@3040000 {
+ compatible = "arm,gic-v3-its";
+ msi-controller;
+ #msi-cells = <1>;
+ reg = <0x3040000 0x20000>;
+ };
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>,
+ <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>,
+ <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>,
+ <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
+ };
+
+ xor@400000 {
+ compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+ reg = <0x400000 0x1000>,
+ <0x410000 0x1000>;
+ msi-parent = <&gic_its_ap0 0xa0>;
+ dma-coherent;
+ };
+
+ xor@420000 {
+ compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+ reg = <0x420000 0x1000>,
+ <0x430000 0x1000>;
+ msi-parent = <&gic_its_ap0 0xa1>;
+ dma-coherent;
+ };
+
+ xor@440000 {
+ compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+ reg = <0x440000 0x1000>,
+ <0x450000 0x1000>;
+ msi-parent = <&gic_its_ap0 0xa2>;
+ dma-coherent;
+ };
+
+ xor@460000 {
+ compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+ reg = <0x460000 0x1000>,
+ <0x470000 0x1000>;
+ msi-parent = <&gic_its_ap0 0xa3>;
+ dma-coherent;
+ };
+
+ uart0_ap0: serial@512000 {
+ compatible = "snps,dw-apb-uart";
+ reg = <0x512000 0x100>;
+ reg-shift = <2>;
+ interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <1>;
+ status = "disabled";
+ };
+
+ uart1_ap0: serial@512100 {
+ compatible = "snps,dw-apb-uart";
+ reg = <0x512100 0x100>;
+ reg-shift = <2>;
+ interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <1>;
+ status = "disabled";
+ };
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi b/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
index 4c68605675a8..8263a8a504a8 100644
--- a/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-cp110-master.dtsi
@@ -65,25 +65,44 @@
reg = <0x0 0x100000>, <0x129000 0xb000>;
clocks = <&cpm_clk 1 3>, <&cpm_clk 1 9>, <&cpm_clk 1 5>;
clock-names = "pp_clk", "gop_clk", "mg_clk";
+ marvell,system-controller = <&cpm_syscon0>;
status = "disabled";
dma-coherent;
cpm_eth0: eth0 {
- interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 43 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 47 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 51 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 55 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <0>;
gop-port-id = <0>;
status = "disabled";
};
cpm_eth1: eth1 {
- interrupts = <ICU_GRP_NSR 40 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 40 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 44 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 48 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 52 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 56 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <1>;
gop-port-id = <2>;
status = "disabled";
};
cpm_eth2: eth2 {
- interrupts = <ICU_GRP_NSR 41 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 41 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 45 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 49 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 53 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 57 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <2>;
gop-port-id = <3>;
status = "disabled";
@@ -115,6 +134,13 @@
msi-parent = <&gicp>;
};
+ cpm_rtc: rtc@284000 {
+ compatible = "marvell,armada-8k-rtc";
+ reg = <0x284000 0x20>, <0x284080 0x24>;
+ reg-names = "rtc", "rtc-soc";
+ interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
cpm_syscon0: system-controller@440000 {
compatible = "syscon", "simple-mfd";
reg = <0x440000 0x1000>;
@@ -131,8 +157,12 @@
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&cpm_pinctrl 0 0 32>;
+ interrupt-controller;
+ interrupts = <ICU_GRP_NSR 86 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 85 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 84 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 83 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
-
};
cpm_gpio2: gpio@140 {
@@ -142,26 +172,15 @@
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&cpm_pinctrl 0 32 31>;
+ interrupt-controller;
+ interrupts = <ICU_GRP_NSR 82 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 81 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 80 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 79 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
};
- cpm_rtc: rtc@284000 {
- compatible = "marvell,armada-8k-rtc";
- reg = <0x284000 0x20>, <0x284080 0x24>;
- reg-names = "rtc", "rtc-soc";
- interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>;
- };
-
- cpm_sata0: sata@540000 {
- compatible = "marvell,armada-8k-ahci",
- "generic-ahci";
- reg = <0x540000 0x30000>;
- interrupts = <ICU_GRP_NSR 107 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&cpm_clk 1 15>;
- status = "disabled";
- };
-
cpm_usb3_0: usb3@500000 {
compatible = "marvell,armada-8k-xhci",
"generic-xhci";
@@ -182,6 +201,15 @@
status = "disabled";
};
+ cpm_sata0: sata@540000 {
+ compatible = "marvell,armada-8k-ahci",
+ "generic-ahci";
+ reg = <0x540000 0x30000>;
+ interrupts = <ICU_GRP_NSR 107 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpm_clk 1 15>;
+ status = "disabled";
+ };
+
cpm_xor0: xor@6a0000 {
compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
reg = <0x6a0000 0x1000>,
@@ -240,6 +268,21 @@
status = "disabled";
};
+ cpm_nand: nand@720000 {
+ /*
+ * Due to the limiation of the pin available
+ * this controller is only usable on the CPM
+ * for A7K and on the CPS for A8K.
+ */
+ compatible = "marvell,armada370-nand";
+ reg = <0x720000 0x54>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ interrupts = <ICU_GRP_NSR 115 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpm_clk 1 2>;
+ status = "disabled";
+ };
+
cpm_trng: trng@760000 {
compatible = "marvell,armada-8k-rng", "inside-secure,safexcel-eip76";
reg = <0x760000 0x7d>;
diff --git a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
index 923f354b02f0..b71ee6c83668 100644
--- a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
@@ -60,37 +60,49 @@
compatible = "simple-bus";
ranges = <0x0 0x0 0xf4000000 0x2000000>;
- cps_rtc: rtc@284000 {
- compatible = "marvell,armada-8k-rtc";
- reg = <0x284000 0x20>, <0x284080 0x24>;
- reg-names = "rtc", "rtc-soc";
- interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>;
- };
-
cps_ethernet: ethernet@0 {
compatible = "marvell,armada-7k-pp22";
reg = <0x0 0x100000>, <0x129000 0xb000>;
clocks = <&cps_clk 1 3>, <&cps_clk 1 9>, <&cps_clk 1 5>;
clock-names = "pp_clk", "gop_clk", "mg_clk";
+ marvell,system-controller = <&cps_syscon0>;
status = "disabled";
dma-coherent;
cps_eth0: eth0 {
- interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 39 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 43 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 47 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 51 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 55 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <0>;
gop-port-id = <0>;
status = "disabled";
};
cps_eth1: eth1 {
- interrupts = <ICU_GRP_NSR 40 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 40 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 44 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 48 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 52 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 56 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <1>;
gop-port-id = <2>;
status = "disabled";
};
cps_eth2: eth2 {
- interrupts = <ICU_GRP_NSR 41 IRQ_TYPE_LEVEL_HIGH>;
+ interrupts = <ICU_GRP_NSR 41 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 45 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 49 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 53 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 57 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "tx-cpu0", "tx-cpu1", "tx-cpu2",
+ "tx-cpu3", "rx-shared";
port-id = <2>;
gop-port-id = <3>;
status = "disabled";
@@ -122,6 +134,13 @@
msi-parent = <&gicp>;
};
+ cps_rtc: rtc@284000 {
+ compatible = "marvell,armada-8k-rtc";
+ reg = <0x284000 0x20>, <0x284080 0x24>;
+ reg-names = "rtc", "rtc-soc";
+ interrupts = <ICU_GRP_NSR 77 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
cps_syscon0: system-controller@440000 {
compatible = "syscon", "simple-mfd";
reg = <0x440000 0x1000>;
@@ -138,8 +157,12 @@
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&cps_pinctrl 0 0 32>;
+ interrupt-controller;
+ interrupts = <ICU_GRP_NSR 86 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 85 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 84 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 83 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
-
};
cps_gpio2: gpio@140 {
@@ -149,20 +172,16 @@
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&cps_pinctrl 0 32 31>;
+ interrupt-controller;
+ interrupts = <ICU_GRP_NSR 82 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 81 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 80 IRQ_TYPE_LEVEL_HIGH>,
+ <ICU_GRP_NSR 79 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
};
- cps_sata0: sata@540000 {
- compatible = "marvell,armada-8k-ahci",
- "generic-ahci";
- reg = <0x540000 0x30000>;
- interrupts = <ICU_GRP_NSR 107 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&cps_clk 1 15>;
- status = "disabled";
- };
-
cps_usb3_0: usb3@500000 {
compatible = "marvell,armada-8k-xhci",
"generic-xhci";
@@ -183,6 +202,15 @@
status = "disabled";
};
+ cps_sata0: sata@540000 {
+ compatible = "marvell,armada-8k-ahci",
+ "generic-ahci";
+ reg = <0x540000 0x30000>;
+ interrupts = <ICU_GRP_NSR 107 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cps_clk 1 15>;
+ status = "disabled";
+ };
+
cps_xor0: xor@6a0000 {
compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
reg = <0x6a0000 0x1000>,
@@ -241,6 +269,21 @@
status = "disabled";
};
+ cps_nand: nand@720000 {
+ /*
+ * Due to the limiation of the pin available
+ * this controller is only usable on the CPM
+ * for A7K and on the CPS for A8K.
+ */
+ compatible = "marvell,armada370-nand";
+ reg = <0x720000 0x54>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ interrupts = <ICU_GRP_NSR 115 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cps_clk 1 2>;
+ status = "disabled";
+ };
+
cps_trng: trng@760000 {
compatible = "marvell,armada-8k-rng", "inside-secure,safexcel-eip76";
reg = <0x760000 0x7d>;
diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 015eb072ddef..151723b5c733 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -1,6 +1,8 @@
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt2712-evb.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt6755-evb.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt6795-evb.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt6797-evb.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt7622-rfb1.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-evb.dtb
always := $(dtb-y)
diff --git a/arch/arm64/boot/dts/mediatek/mt2712-evb.dts b/arch/arm64/boot/dts/mediatek/mt2712-evb.dts
new file mode 100644
index 000000000000..8c804df3da4e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt2712-evb.dts
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: YT Shen <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0 OR MIT)
+ */
+
+/dts-v1/;
+#include "mt2712e.dtsi"
+
+/ {
+ model = "MediaTek MT2712 evaluation board";
+ compatible = "mediatek,mt2712-evb", "mediatek,mt2712";
+
+ aliases {
+ serial0 = &uart0;
+ };
+
+ memory@40000000 {
+ device_type = "memory";
+ reg = <0 0x40000000 0 0x80000000>;
+ };
+
+ chosen {
+ stdout-path = "serial0:921600n8";
+ };
+};
+
+&uart0 {
+ status = "okay";
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt2712e.dtsi b/arch/arm64/boot/dts/mediatek/mt2712e.dtsi
new file mode 100644
index 000000000000..57d0396b7faa
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt2712e.dtsi
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: YT Shen <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0 OR MIT)
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+ compatible = "mediatek,mt2712";
+ interrupt-parent = <&sysirq>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu-map {
+ cluster0 {
+ core0 {
+ cpu = <&cpu0>;
+ };
+ core1 {
+ cpu = <&cpu1>;
+ };
+ };
+
+ cluster1 {
+ core0 {
+ cpu = <&cpu2>;
+ };
+ };
+ };
+
+ cpu0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a35";
+ reg = <0x000>;
+ };
+
+ cpu1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a35";
+ reg = <0x001>;
+ enable-method = "psci";
+ };
+
+ cpu2: cpu@200 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a72";
+ reg = <0x200>;
+ enable-method = "psci";
+ };
+ };
+
+ psci {
+ compatible = "arm,psci-0.2";
+ method = "smc";
+ };
+
+ baud_clk: dummy26m {
+ compatible = "fixed-clock";
+ clock-frequency = <26000000>;
+ #clock-cells = <0>;
+ };
+
+ sys_clk: dummyclk {
+ compatible = "fixed-clock";
+ clock-frequency = <26000000>;
+ #clock-cells = <0>;
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupt-parent = <&gic>;
+ interrupts = <GIC_PPI 13
+ (GIC_CPU_MASK_RAW(0x13) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 14
+ (GIC_CPU_MASK_RAW(0x13) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 11
+ (GIC_CPU_MASK_RAW(0x13) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 10
+ (GIC_CPU_MASK_RAW(0x13) | IRQ_TYPE_LEVEL_LOW)>;
+ };
+
+ uart5: serial@1000f000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x1000f000 0 0x400>;
+ interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+
+ sysirq: interrupt-controller@10220a80 {
+ compatible = "mediatek,mt2712-sysirq",
+ "mediatek,mt6577-sysirq";
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ interrupt-parent = <&gic>;
+ reg = <0 0x10220a80 0 0x40>;
+ };
+
+ gic: interrupt-controller@10510000 {
+ compatible = "arm,gic-400";
+ #interrupt-cells = <3>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ reg = <0 0x10510000 0 0x10000>,
+ <0 0x10520000 0 0x20000>,
+ <0 0x10540000 0 0x20000>,
+ <0 0x10560000 0 0x20000>;
+ interrupts = <GIC_PPI 9
+ (GIC_CPU_MASK_RAW(0x13) | IRQ_TYPE_LEVEL_HIGH)>;
+ };
+
+ uart0: serial@11002000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11002000 0 0x400>;
+ interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+
+ uart1: serial@11003000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11003000 0 0x400>;
+ interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+
+ uart2: serial@11004000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11004000 0 0x400>;
+ interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+
+ uart3: serial@11005000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11005000 0 0x400>;
+ interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+
+ uart4: serial@11019000 {
+ compatible = "mediatek,mt2712-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11019000 0 0x400>;
+ interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&baud_clk>, <&sys_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt6797.dtsi b/arch/arm64/boot/dts/mediatek/mt6797.dtsi
index 31088a9f71de..4beaa71107d7 100644
--- a/arch/arm64/boot/dts/mediatek/mt6797.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt6797.dtsi
@@ -108,13 +108,6 @@
clock-output-names = "clk26m";
};
- clk32k: oscillator@1 {
- compatible = "fixed-clock";
- #clock-cells = <0>;
- clock-frequency = <32000>;
- clock-output-names = "clk32k";
- };
-
timer {
compatible = "arm,armv8-timer";
interrupt-parent = <&gic>;
@@ -147,6 +140,11 @@
infracfg = <&infrasys>;
};
+ watchdog: watchdog@10007000 {
+ compatible = "mediatek,mt6797-wdt", "mediatek,mt6589-wdt";
+ reg = <0 0x10007000 0 0x100>;
+ };
+
apmixedsys: apmixed@1000c000 {
compatible = "mediatek,mt6797-apmixedsys";
reg = <0 0x1000c000 0 0x1000>;
diff --git a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts
new file mode 100644
index 000000000000..c08309df2cc7
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: Ming Huang <[email protected]>
+ * Sean Wang <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0 OR MIT)
+ */
+
+/dts-v1/;
+#include "mt7622.dtsi"
+
+/ {
+ model = "MediaTek MT7622 RFB1 board";
+ compatible = "mediatek,mt7622-rfb1", "mediatek,mt7622";
+
+ chosen {
+ bootargs = "console=ttyS0,115200n1";
+ };
+
+ memory {
+ reg = <0 0x40000000 0 0x3F000000>;
+ };
+};
+
+&uart0 {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt7622.dtsi b/arch/arm64/boot/dts/mediatek/mt7622.dtsi
new file mode 100644
index 000000000000..b111fec2ed9d
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2017 MediaTek Inc.
+ * Author: Ming Huang <[email protected]>
+ * Sean Wang <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0 OR MIT)
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+ compatible = "mediatek,mt7622";
+ interrupt-parent = <&sysirq>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ cpus {
+ #address-cells = <2>;
+ #size-cells = <0>;
+
+ cpu0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0x0 0x0>;
+ enable-method = "psci";
+ clock-frequency = <1300000000>;
+ };
+
+ cpu1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0x0 0x1>;
+ enable-method = "psci";
+ clock-frequency = <1300000000>;
+ };
+ };
+
+ uart_clk: dummy25m {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <25000000>;
+ };
+
+ bus_clk: dummy280m {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <280000000>;
+ };
+
+ psci {
+ compatible = "arm,psci-0.2";
+ method = "smc";
+ };
+
+ reserved-memory {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ /* 192 KiB reserved for ARM Trusted Firmware (BL31) */
+ secmon_reserved: secmon@43000000 {
+ reg = <0 0x43000000 0 0x30000>;
+ no-map;
+ };
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupt-parent = <&gic>;
+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) |
+ IRQ_TYPE_LEVEL_HIGH)>,
+ <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) |
+ IRQ_TYPE_LEVEL_HIGH)>,
+ <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) |
+ IRQ_TYPE_LEVEL_HIGH)>,
+ <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) |
+ IRQ_TYPE_LEVEL_HIGH)>;
+ };
+
+ sysirq: interrupt-controller@10200620 {
+ compatible = "mediatek,mt7622-sysirq",
+ "mediatek,mt6577-sysirq";
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ interrupt-parent = <&gic>;
+ reg = <0 0x10200620 0 0x20>;
+ };
+
+ gic: interrupt-controller@10300000 {
+ compatible = "arm,gic-400";
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ interrupt-parent = <&gic>;
+ reg = <0 0x10310000 0 0x1000>,
+ <0 0x10320000 0 0x1000>,
+ <0 0x10340000 0 0x2000>,
+ <0 0x10360000 0 0x2000>;
+ };
+
+ uart0: serial@11002000 {
+ compatible = "mediatek,mt7622-uart",
+ "mediatek,mt6577-uart";
+ reg = <0 0x11002000 0 0x400>;
+ interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&uart_clk>, <&bus_clk>;
+ clock-names = "baud", "bus";
+ status = "disabled";
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index cc0f02d9dd02..ff81d7e5805e 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -1,5 +1,6 @@
dtb-$(CONFIG_ARCH_QCOM) += apq8016-sbc.dtb
dtb-$(CONFIG_ARCH_QCOM) += apq8096-db820c.dtb
+dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb
dtb-$(CONFIG_ARCH_QCOM) += msm8916-mtp.dtb
dtb-$(CONFIG_ARCH_QCOM) += msm8992-bullhead-rev-101.dtb
dtb-$(CONFIG_ARCH_QCOM) += msm8994-angler-rev-101.dtb
diff --git a/arch/arm64/boot/dts/qcom/apq8016-sbc-pmic-pins.dtsi b/arch/arm64/boot/dts/qcom/apq8016-sbc-pmic-pins.dtsi
index d94640812194..790b7775b901 100644
--- a/arch/arm64/boot/dts/qcom/apq8016-sbc-pmic-pins.dtsi
+++ b/arch/arm64/boot/dts/qcom/apq8016-sbc-pmic-pins.dtsi
@@ -17,6 +17,7 @@
function = PMIC_GPIO_FUNC_NORMAL;
power-source = <PM8916_GPIO_VPH>;
input-disable;
+ output-high;
};
};
diff --git a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
index bd310ac1967a..1d63e6b879de 100644
--- a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
+++ b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
@@ -88,6 +88,8 @@
interrupts = <31 2>;
adi,dsi-lanes = <4>;
+ clocks = <&rpmcc RPM_SMD_BB_CLK2>;
+ clock-names = "cec";
pd-gpios = <&msmgpio 32 0>;
@@ -213,11 +215,14 @@
};
usb@78d9000 {
- extcon = <&usb_id>, <&usb_id>;
+ extcon = <&usb_id>;
status = "okay";
adp-disable;
hnp-disable;
srp-disable;
+ dr_mode = "host";
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb_sw_sel_pm>;
ulpi {
phy {
v1p8-supply = <&pm8916_l7>;
@@ -337,19 +342,11 @@
usb_id: usb-id {
compatible = "linux,extcon-usb-gpio";
- id-gpio = <&msmgpio 121 GPIO_ACTIVE_HIGH>;
+ vbus-gpio = <&msmgpio 121 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&usb_id_default>;
};
- usb-switch {
- compatible = "toshiba,tc7usb40mu";
- switch-gpios = <&pm8916_gpios 4 GPIO_ACTIVE_HIGH>;
- extcon = <&usb_id>;
- pinctrl-names = "default";
- pinctrl-0 = <&usb_sw_sel_pm>;
- };
-
hdmi-out {
compatible = "hdmi-connector";
type = "a";
diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c-pmic-pins.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c-pmic-pins.dtsi
index b1142c45fdc9..8e379782597a 100644
--- a/arch/arm64/boot/dts/qcom/apq8096-db820c-pmic-pins.dtsi
+++ b/arch/arm64/boot/dts/qcom/apq8096-db820c-pmic-pins.dtsi
@@ -24,4 +24,28 @@
power-source = <PM8994_GPIO_S4>; // 1.8V
};
};
+
+ usb3_vbus_det_gpio: pm8996_gpio22 {
+ pinconf {
+ pins = "gpio22";
+ function = PMIC_GPIO_FUNC_NORMAL;
+ input-enable;
+ bias-pull-down;
+ qcom,drive-strength = <PMIC_GPIO_STRENGTH_NO>;
+ power-source = <PM8994_GPIO_S4>; // 1.8V
+ };
+ };
+};
+
+&pmi8994_gpios {
+ usb2_vbus_det_gpio: pmi8996_gpio6 {
+ pinconf {
+ pins = "gpio6";
+ function = PMIC_GPIO_FUNC_NORMAL;
+ input-enable;
+ bias-pull-down;
+ qcom,drive-strength = <PMIC_GPIO_STRENGTH_NO>;
+ power-source = <PM8994_GPIO_S4>; // 1.8V
+ };
+ };
};
diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
index d2196fc6d739..789f3e87321e 100644
--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
+++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
@@ -13,6 +13,7 @@
#include "msm8996.dtsi"
#include "pm8994.dtsi"
+#include "pmi8994.dtsi"
#include "apq8096-db820c-pins.dtsi"
#include "apq8096-db820c-pmic-pins.dtsi"
#include <dt-bindings/input/input.h>
@@ -88,6 +89,55 @@
cd-gpios = <&msmgpio 38 0x1>;
status = "okay";
};
+
+ phy@34000 {
+ status = "okay";
+ };
+
+ phy@7410000 {
+ status = "okay";
+ };
+
+ phy@7411000 {
+ status = "okay";
+ };
+
+ phy@7412000 {
+ status = "okay";
+ };
+
+ usb@6a00000 {
+ status = "okay";
+
+ dwc3@6a00000 {
+ extcon = <&usb3_id>;
+ dr_mode = "otg";
+ };
+ };
+
+ usb3_id: usb3-id {
+ compatible = "linux,extcon-usb-gpio";
+ id-gpio = <&pm8994_gpios 22 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb3_vbus_det_gpio>;
+ };
+
+ usb@7600000 {
+ status = "okay";
+
+ dwc3@7600000 {
+ extcon = <&usb2_id>;
+ dr_mode = "otg";
+ maximum-speed = "high-speed";
+ };
+ };
+
+ usb2_id: usb2-id {
+ compatible = "linux,extcon-usb-gpio";
+ id-gpio = <&pmi8994_gpios 6 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb2_vbus_det_gpio>;
+ };
};
@@ -106,4 +156,152 @@
gpios = <&pm8994_gpios 2 GPIO_ACTIVE_LOW>;
};
};
+
+ rpm-glink {
+ rpm_requests {
+ pm8994-regulators {
+ vdd_l1-supply = <&pm8994_s3>;
+ vdd_l2_l26_l28-supply = <&pm8994_s3>;
+ vdd_l3_l11-supply = <&pm8994_s3>;
+ vdd_l4_l27_l31-supply = <&pm8994_s3>;
+ vdd_l5_l7-supply = <&pm8994_s5>;
+ vdd_l14_l15-supply = <&pm8994_s5>;
+ vdd_l20_l21-supply = <&pm8994_s5>;
+ vdd_l25-supply = <&pm8994_s3>;
+
+ s3 {
+ regulator-min-microvolt = <1300000>;
+ regulator-max-microvolt = <1300000>;
+ };
+ s4 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ s5 {
+ regulator-min-microvolt = <2150000>;
+ regulator-max-microvolt = <2150000>;
+ };
+ s7 {
+ regulator-min-microvolt = <800000>;
+ regulator-max-microvolt = <800000>;
+ };
+
+ l1 {
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ };
+ l2 {
+ regulator-min-microvolt = <1250000>;
+ regulator-max-microvolt = <1250000>;
+ };
+ l3 {
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <850000>;
+ };
+ l4 {
+ regulator-min-microvolt = <1225000>;
+ regulator-max-microvolt = <1225000>;
+ };
+ l6 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ };
+ l8 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l9 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l10 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l11 {
+ regulator-min-microvolt = <1150000>;
+ regulator-max-microvolt = <1150000>;
+ };
+ l12 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l13 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <2950000>;
+ };
+ l14 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l15 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l16 {
+ regulator-min-microvolt = <2700000>;
+ regulator-max-microvolt = <2700000>;
+ };
+ l17 {
+ regulator-min-microvolt = <2500000>;
+ regulator-max-microvolt = <2500000>;
+ };
+ l18 {
+ regulator-min-microvolt = <2700000>;
+ regulator-max-microvolt = <2900000>;
+ };
+ l19 {
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ };
+ l20 {
+ regulator-min-microvolt = <2950000>;
+ regulator-max-microvolt = <2950000>;
+ regulator-allow-set-load;
+ };
+ l21 {
+ regulator-min-microvolt = <2950000>;
+ regulator-max-microvolt = <2950000>;
+ };
+ l22 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ };
+ l23 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ };
+ l24 {
+ regulator-min-microvolt = <3075000>;
+ regulator-max-microvolt = <3075000>;
+ };
+ l25 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-allow-set-load;
+ };
+ l27 {
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ };
+ l28 {
+ regulator-min-microvolt = <925000>;
+ regulator-max-microvolt = <925000>;
+ regulator-allow-set-load;
+ };
+ l29 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ };
+ l30 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ l32 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ };
+ };
+ };
};
diff --git a/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts b/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts
new file mode 100644
index 000000000000..6a838b5d321e
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts
@@ -0,0 +1,52 @@
+/dts-v1/;
+/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#include "ipq8074.dtsi"
+
+/ {
+ #address-cells = <0x2>;
+ #size-cells = <0x2>;
+ model = "Qualcomm Technologies, Inc. IPQ8074-HK01";
+ compatible = "qcom,ipq8074-hk01", "qcom,ipq8074";
+ interrupt-parent = <&intc>;
+
+ aliases {
+ serial0 = &blsp1_uart5;
+ };
+
+ chosen {
+ stdout-path = "serial0";
+ };
+
+ memory {
+ device_type = "memory";
+ reg = <0x0 0x40000000 0x0 0x20000000>;
+ };
+
+ soc {
+ pinctrl@1000000 {
+ serial_4_pins: serial4_pinmux {
+ mux {
+ pins = "gpio23", "gpio24";
+ function = "blsp4_uart1";
+ bias-disable;
+ };
+ };
+ };
+
+ serial@78b3000 {
+ pinctrl-0 = <&serial_4_pins>;
+ pinctrl-names = "default";
+ status = "ok";
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
new file mode 100644
index 000000000000..2bc5dec5614d
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/qcom,gcc-ipq8074.h>
+
+/ {
+ model = "Qualcomm Technologies, Inc. IPQ8074";
+ compatible = "qcom,ipq8074";
+
+ soc: soc {
+ #address-cells = <0x1>;
+ #size-cells = <0x1>;
+ ranges = <0 0 0 0xffffffff>;
+ compatible = "simple-bus";
+
+ pinctrl@1000000 {
+ compatible = "qcom,ipq8074-pinctrl";
+ reg = <0x1000000 0x300000>;
+ interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
+ gpio-controller;
+ #gpio-cells = <0x2>;
+ interrupt-controller;
+ #interrupt-cells = <0x2>;
+ };
+
+ intc: interrupt-controller@b000000 {
+ compatible = "qcom,msm-qgic2";
+ interrupt-controller;
+ #interrupt-cells = <0x3>;
+ reg = <0xb000000 0x1000>, <0xb002000 0x1000>;
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+ };
+
+ timer@b120000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ compatible = "arm,armv7-timer-mem";
+ reg = <0xb120000 0x1000>;
+ clock-frequency = <19200000>;
+
+ frame@b120000 {
+ frame-number = <0>;
+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb121000 0x1000>,
+ <0xb122000 0x1000>;
+ };
+
+ frame@b123000 {
+ frame-number = <1>;
+ interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb123000 0x1000>;
+ status = "disabled";
+ };
+
+ frame@b124000 {
+ frame-number = <2>;
+ interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb124000 0x1000>;
+ status = "disabled";
+ };
+
+ frame@b125000 {
+ frame-number = <3>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb125000 0x1000>;
+ status = "disabled";
+ };
+
+ frame@b126000 {
+ frame-number = <4>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb126000 0x1000>;
+ status = "disabled";
+ };
+
+ frame@b127000 {
+ frame-number = <5>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb127000 0x1000>;
+ status = "disabled";
+ };
+
+ frame@b128000 {
+ frame-number = <6>;
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <0xb128000 0x1000>;
+ status = "disabled";
+ };
+ };
+
+ gcc: gcc@1800000 {
+ compatible = "qcom,gcc-ipq8074";
+ reg = <0x1800000 0x80000>;
+ #clock-cells = <0x1>;
+ #reset-cells = <0x1>;
+ };
+
+ blsp1_uart5: serial@78b3000 {
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
+ reg = <0x78b3000 0x200>;
+ interrupts = <GIC_SPI 308 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&gcc GCC_BLSP1_UART5_APPS_CLK>,
+ <&gcc GCC_BLSP1_AHB_CLK>;
+ clock-names = "core", "iface";
+ status = "disabled";
+ };
+ };
+
+ cpus {
+ #address-cells = <0x1>;
+ #size-cells = <0x0>;
+
+ CPU0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0x0>;
+ next-level-cache = <&L2_0>;
+ enable-method = "psci";
+ };
+
+ CPU1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ enable-method = "psci";
+ reg = <0x1>;
+ next-level-cache = <&L2_0>;
+ };
+
+ CPU2: cpu@2 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ enable-method = "psci";
+ reg = <0x2>;
+ next-level-cache = <&L2_0>;
+ };
+
+ CPU3: cpu@3 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ enable-method = "psci";
+ reg = <0x3>;
+ next-level-cache = <&L2_0>;
+ };
+
+ L2_0: l2-cache {
+ compatible = "cache";
+ cache-level = <0x2>;
+ };
+ };
+
+ psci {
+ compatible = "arm,psci-1.0";
+ method = "smc";
+ };
+
+ pmu {
+ compatible = "arm,armv8-pmuv3";
+ interrupts = <GIC_PPI 7 GIC_CPU_MASK_SIMPLE(4)>;
+ };
+
+ clocks {
+ sleep_clk: sleep_clk {
+ compatible = "fixed-clock";
+ clock-frequency = <32000>;
+ #clock-cells = <0>;
+ };
+
+ xo: xo {
+ compatible = "fixed-clock";
+ clock-frequency = <19200000>;
+ #clock-cells = <0>;
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi
index 039991f80831..dc3817593e14 100644
--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi
@@ -88,6 +88,11 @@
no-map;
};
+ venus_mem: venus@89900000 {
+ reg = <0x0 0x89900000 0x0 0x600000>;
+ no-map;
+ };
+
mba_mem: mba@8ea00000 {
no-map;
reg = <0 0x8ea00000 0 0x100000>;
@@ -204,6 +209,17 @@
};
+ gpu_opp_table: opp_table {
+ compatible = "operating-points-v2";
+
+ opp-400000000 {
+ opp-hz = /bits/ 64 <400000000>;
+ };
+ opp-19200000 {
+ opp-hz = /bits/ 64 <19200000>;
+ };
+ };
+
timer {
compatible = "arm,armv8-timer";
interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
@@ -694,6 +710,84 @@
#thermal-sensor-cells = <1>;
};
+ apps_iommu: iommu@1ef0000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ #iommu-cells = <1>;
+ compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1";
+ ranges = <0 0x1e20000 0x40000>;
+ reg = <0x1ef0000 0x3000>;
+ clocks = <&gcc GCC_SMMU_CFG_CLK>,
+ <&gcc GCC_APSS_TCU_CLK>;
+ clock-names = "iface", "bus";
+ qcom,iommu-secure-id = <17>;
+
+ // mdp_0:
+ iommu-ctx@4000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x4000 0x1000>;
+ interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ // venus_ns:
+ iommu-ctx@5000 {
+ compatible = "qcom,msm-iommu-v1-sec";
+ reg = <0x5000 0x1000>;
+ interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
+ gpu_iommu: iommu@1f08000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ #iommu-cells = <1>;
+ compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1";
+ ranges = <0 0x1f08000 0x10000>;
+ clocks = <&gcc GCC_SMMU_CFG_CLK>,
+ <&gcc GCC_GFX_TCU_CLK>;
+ clock-names = "iface", "bus";
+ qcom,iommu-secure-id = <18>;
+
+ // gfx3d_user:
+ iommu-ctx@1000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x1000 0x1000>;
+ interrupts = <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ // gfx3d_priv:
+ iommu-ctx@2000 {
+ compatible = "qcom,msm-iommu-v1-ns";
+ reg = <0x2000 0x1000>;
+ interrupts = <GIC_SPI 242 0>;
+ };
+ };
+
+ gpu@1c00000 {
+ compatible = "qcom,adreno-306.0", "qcom,adreno";
+ reg = <0x01c00000 0x20000>;
+ reg-names = "kgsl_3d0_reg_memory";
+ interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "kgsl_3d0_irq";
+ clock-names =
+ "core",
+ "iface",
+ "mem",
+ "mem_iface",
+ "alt_mem_iface",
+ "gfx3d";
+ clocks =
+ <&gcc GCC_OXILI_GFX3D_CLK>,
+ <&gcc GCC_OXILI_AHB_CLK>,
+ <&gcc GCC_OXILI_GMEM_CLK>,
+ <&gcc GCC_BIMC_GFX_CLK>,
+ <&gcc GCC_BIMC_GPU_CLK>,
+ <&gcc GFX3D_CLK_SRC>;
+ power-domains = <&gcc OXILI_GDSC>;
+ operating-points-v2 = <&gpu_opp_table>;
+ iommus = <&gpu_iommu 1>, <&gpu_iommu 2>;
+ };
+
mdss: mdss@1a00000 {
compatible = "qcom,mdss";
reg = <0x1a00000 0x1000>,
@@ -735,6 +829,8 @@
"core_clk",
"vsync_clk";
+ iommus = <&apps_iommu 4>;
+
ports {
#address-cells = <1>;
#size-cells = <0>;
@@ -990,7 +1086,7 @@
};
replicator@824000 {
- compatible = "qcom,coresight-replicator1x", "arm,primecell";
+ compatible = "arm,coresight-dynamic-replicator", "arm,primecell";
reg = <0x824000 0x1000>;
clocks = <&rpmcc RPM_QDSS_CLK>, <&rpmcc RPM_QDSS_A_CLK>;
@@ -1207,6 +1303,28 @@
};
};
};
+
+ venus: video-codec@1d00000 {
+ compatible = "qcom,msm8916-venus";
+ reg = <0x01d00000 0xff000>;
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+ power-domains = <&gcc VENUS_GDSC>;
+ clocks = <&gcc GCC_VENUS0_VCODEC0_CLK>,
+ <&gcc GCC_VENUS0_AHB_CLK>,
+ <&gcc GCC_VENUS0_AXI_CLK>;
+ clock-names = "core", "iface", "bus";
+ iommus = <&apps_iommu 5>;
+ memory-region = <&venus_mem>;
+ status = "okay";
+
+ video-decoder {
+ compatible = "venus-decoder";
+ };
+
+ video-encoder {
+ compatible = "venus-encoder";
+ };
+ };
};
smd {
diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi
index 8f085716e258..887b61c872dd 100644
--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
@@ -276,12 +276,83 @@
hwlocks = <&tcsr_mutex 3>;
};
+ rpm-glink {
+ compatible = "qcom,glink-rpm";
+
+ interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>;
+
+ qcom,rpm-msg-ram = <&rpm_msg_ram>;
+
+ mboxes = <&apcs_glb 0>;
+
+ rpm_requests {
+ compatible = "qcom,rpm-msm8996";
+ qcom,glink-channels = "rpm_requests";
+
+ pm8994-regulators {
+ compatible = "qcom,rpm-pm8994-regulators";
+
+ pm8994_s1: s1 {};
+ pm8994_s2: s2 {};
+ pm8994_s3: s3 {};
+ pm8994_s4: s4 {};
+ pm8994_s5: s5 {};
+ pm8994_s6: s6 {};
+ pm8994_s7: s7 {};
+ pm8994_s8: s8 {};
+ pm8994_s9: s9 {};
+ pm8994_s10: s10 {};
+ pm8994_s11: s11 {};
+ pm8994_s12: s12 {};
+
+ pm8994_l1: l1 {};
+ pm8994_l2: l2 {};
+ pm8994_l3: l3 {};
+ pm8994_l4: l4 {};
+ pm8994_l5: l5 {};
+ pm8994_l6: l6 {};
+ pm8994_l7: l7 {};
+ pm8994_l8: l8 {};
+ pm8994_l9: l9 {};
+ pm8994_l10: l10 {};
+ pm8994_l11: l11 {};
+ pm8994_l12: l12 {};
+ pm8994_l13: l13 {};
+ pm8994_l14: l14 {};
+ pm8994_l15: l15 {};
+ pm8994_l16: l16 {};
+ pm8994_l17: l17 {};
+ pm8994_l18: l18 {};
+ pm8994_l19: l19 {};
+ pm8994_l20: l20 {};
+ pm8994_l21: l21 {};
+ pm8994_l22: l22 {};
+ pm8994_l23: l23 {};
+ pm8994_l24: l24 {};
+ pm8994_l25: l25 {};
+ pm8994_l26: l26 {};
+ pm8994_l27: l27 {};
+ pm8994_l28: l28 {};
+ pm8994_l29: l29 {};
+ pm8994_l30: l30 {};
+ pm8994_l31: l31 {};
+ pm8994_l32: l32 {};
+ };
+
+ };
+ };
+
soc: soc {
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0 0 0xffffffff>;
compatible = "simple-bus";
+ rpm_msg_ram: memory@68000 {
+ compatible = "qcom,rpm-msg-ram";
+ reg = <0x68000 0x6000>;
+ };
+
tcsr_mutex_regs: syscon@740000 {
compatible = "syscon";
reg = <0x740000 0x20000>;
@@ -303,6 +374,13 @@
reg = <0x9820000 0x1000>;
};
+ apcs_glb: mailbox@9820000 {
+ compatible = "qcom,msm8996-apcs-hmss-global";
+ reg = <0x9820000 0x1000>;
+
+ #mbox-cells = <1>;
+ };
+
gcc: clock-controller@300000 {
compatible = "qcom,gcc-msm8996";
#clock-cells = <1>;
@@ -538,6 +616,209 @@
<960000000>,
<825000000>;
};
+
+ qfprom@74000 {
+ compatible = "qcom,qfprom";
+ reg = <0x74000 0x8ff>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ qusb2p_hstx_trim: hstx_trim@24e {
+ reg = <0x24e 0x2>;
+ bits = <5 4>;
+ };
+
+ qusb2s_hstx_trim: hstx_trim@24f {
+ reg = <0x24f 0x1>;
+ bits = <1 4>;
+ };
+ };
+
+ phy@34000 {
+ compatible = "qcom,msm8996-qmp-pcie-phy";
+ reg = <0x34000 0x488>;
+ #clock-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>,
+ <&gcc GCC_PCIE_PHY_CFG_AHB_CLK>,
+ <&gcc GCC_PCIE_CLKREF_CLK>;
+ clock-names = "aux", "cfg_ahb", "ref";
+
+ vdda-phy-supply = <&pm8994_l28>;
+ vdda-pll-supply = <&pm8994_l12>;
+
+ resets = <&gcc GCC_PCIE_PHY_BCR>,
+ <&gcc GCC_PCIE_PHY_COM_BCR>,
+ <&gcc GCC_PCIE_PHY_COM_NOCSR_BCR>;
+ reset-names = "phy", "common", "cfg";
+ status = "disabled";
+
+ pciephy_0: lane@35000 {
+ reg = <0x035000 0x130>,
+ <0x035200 0x200>,
+ <0x035400 0x1dc>;
+ #phy-cells = <0>;
+
+ clock-output-names = "pcie_0_pipe_clk_src";
+ clocks = <&gcc GCC_PCIE_0_PIPE_CLK>;
+ clock-names = "pipe0";
+ resets = <&gcc GCC_PCIE_0_PHY_BCR>;
+ reset-names = "lane0";
+ };
+
+ pciephy_1: lane@36000 {
+ reg = <0x036000 0x130>,
+ <0x036200 0x200>,
+ <0x036400 0x1dc>;
+ #phy-cells = <0>;
+
+ clock-output-names = "pcie_1_pipe_clk_src";
+ clocks = <&gcc GCC_PCIE_1_PIPE_CLK>;
+ clock-names = "pipe1";
+ resets = <&gcc GCC_PCIE_1_PHY_BCR>;
+ reset-names = "lane1";
+ };
+
+ pciephy_2: lane@37000 {
+ reg = <0x037000 0x130>,
+ <0x037200 0x200>,
+ <0x037400 0x1dc>;
+ #phy-cells = <0>;
+
+ clock-output-names = "pcie_2_pipe_clk_src";
+ clocks = <&gcc GCC_PCIE_2_PIPE_CLK>;
+ clock-names = "pipe2";
+ resets = <&gcc GCC_PCIE_2_PHY_BCR>;
+ reset-names = "lane2";
+ };
+ };
+
+ phy@7410000 {
+ compatible = "qcom,msm8996-qmp-usb3-phy";
+ reg = <0x7410000 0x1c4>;
+ #clock-cells = <1>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ clocks = <&gcc GCC_USB3_PHY_AUX_CLK>,
+ <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
+ <&gcc GCC_USB3_CLKREF_CLK>;
+ clock-names = "aux", "cfg_ahb", "ref";
+
+ vdda-phy-supply = <&pm8994_l28>;
+ vdda-pll-supply = <&pm8994_l12>;
+
+ resets = <&gcc GCC_USB3_PHY_BCR>,
+ <&gcc GCC_USB3PHY_PHY_BCR>;
+ reset-names = "phy", "common";
+ status = "disabled";
+
+ ssusb_phy_0: lane@7410200 {
+ reg = <0x7410200 0x200>,
+ <0x7410400 0x130>,
+ <0x7410600 0x1a8>;
+ #phy-cells = <0>;
+
+ clock-output-names = "usb3_phy_pipe_clk_src";
+ clocks = <&gcc GCC_USB3_PHY_PIPE_CLK>;
+ clock-names = "pipe0";
+ };
+ };
+
+ hsusb_phy1: phy@7411000 {
+ compatible = "qcom,msm8996-qusb2-phy";
+ reg = <0x7411000 0x180>;
+ #phy-cells = <0>;
+
+ clocks = <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
+ <&gcc GCC_RX1_USB2_CLKREF_CLK>;
+ clock-names = "cfg_ahb", "ref";
+
+ vdda-pll-supply = <&pm8994_l12>;
+ vdda-phy-dpdm-supply = <&pm8994_l24>;
+
+ resets = <&gcc GCC_QUSB2PHY_PRIM_BCR>;
+ nvmem-cells = <&qusb2p_hstx_trim>;
+ status = "disabled";
+ };
+
+ hsusb_phy2: phy@7412000 {
+ compatible = "qcom,msm8996-qusb2-phy";
+ reg = <0x7412000 0x180>;
+ #phy-cells = <0>;
+
+ clocks = <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
+ <&gcc GCC_RX2_USB2_CLKREF_CLK>;
+ clock-names = "cfg_ahb", "ref";
+
+ vdda-pll-supply = <&pm8994_l12>;
+ vdda-phy-dpdm-supply = <&pm8994_l24>;
+
+ resets = <&gcc GCC_QUSB2PHY_SEC_BCR>;
+ nvmem-cells = <&qusb2s_hstx_trim>;
+ status = "disabled";
+ };
+
+ usb2: usb@7600000 {
+ compatible = "qcom,dwc3";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ clocks = <&gcc GCC_PERIPH_NOC_USB20_AHB_CLK>,
+ <&gcc GCC_USB20_MASTER_CLK>,
+ <&gcc GCC_USB20_MOCK_UTMI_CLK>,
+ <&gcc GCC_USB20_SLEEP_CLK>,
+ <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>;
+
+ assigned-clocks = <&gcc GCC_USB20_MOCK_UTMI_CLK>,
+ <&gcc GCC_USB20_MASTER_CLK>;
+ assigned-clock-rates = <19200000>, <60000000>;
+
+ power-domains = <&gcc USB30_GDSC>;
+ status = "disabled";
+
+ dwc3@7600000 {
+ compatible = "snps,dwc3";
+ reg = <0x7600000 0xcc00>;
+ interrupts = <0 138 0>;
+ phys = <&hsusb_phy2>;
+ phy-names = "usb2-phy";
+ };
+ };
+
+ usb3: usb@6a00000 {
+ compatible = "qcom,dwc3";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ clocks = <&gcc GCC_SYS_NOC_USB3_AXI_CLK>,
+ <&gcc GCC_USB30_MASTER_CLK>,
+ <&gcc GCC_AGGRE2_USB3_AXI_CLK>,
+ <&gcc GCC_USB30_MOCK_UTMI_CLK>,
+ <&gcc GCC_USB30_SLEEP_CLK>,
+ <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>;
+
+ assigned-clocks = <&gcc GCC_USB30_MOCK_UTMI_CLK>,
+ <&gcc GCC_USB30_MASTER_CLK>;
+ assigned-clock-rates = <19200000>, <120000000>;
+
+ power-domains = <&gcc USB30_GDSC>;
+ status = "disabled";
+
+ dwc3@6a00000 {
+ compatible = "snps,dwc3";
+ reg = <0x6a00000 0xcc00>;
+ interrupts = <0 131 0>;
+ phys = <&hsusb_phy1>, <&ssusb_phy_0>;
+ phy-names = "usb2-phy", "usb3-phy";
+ };
+ };
};
adsp-pil {
@@ -558,6 +839,15 @@
qcom,smem-states = <&adsp_smp2p_out 0>;
qcom,smem-state-names = "stop";
+
+ smd-edge {
+ interrupts = <GIC_SPI 156 IRQ_TYPE_EDGE_RISING>;
+
+ label = "lpass";
+ qcom,ipc = <&apcs 16 8>;
+ qcom,smd-edge = <1>;
+ qcom,remote-pid = <2>;
+ };
};
adsp-smp2p {
@@ -584,6 +874,30 @@
};
};
+ modem-smp2p {
+ compatible = "qcom,smp2p";
+ qcom,smem = <435>, <428>;
+
+ interrupts = <GIC_SPI 451 IRQ_TYPE_EDGE_RISING>;
+
+ qcom,ipc = <&apcs 16 14>;
+
+ qcom,local-pid = <0>;
+ qcom,remote-pid = <1>;
+
+ modem_smp2p_out: master-kernel {
+ qcom,entry-name = "master-kernel";
+ #qcom,smem-state-cells = <1>;
+ };
+
+ modem_smp2p_in: slave-kernel {
+ qcom,entry-name = "slave-kernel";
+
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+ };
+
smp2p-slpi {
compatible = "qcom,smp2p";
qcom,smem = <481>, <430>;
diff --git a/arch/arm64/boot/dts/qcom/pmi8994.dtsi b/arch/arm64/boot/dts/qcom/pmi8994.dtsi
index d3879a4e8076..57673f92805d 100644
--- a/arch/arm64/boot/dts/qcom/pmi8994.dtsi
+++ b/arch/arm64/boot/dts/qcom/pmi8994.dtsi
@@ -8,6 +8,23 @@
reg = <0x2 SPMI_USID>;
#address-cells = <1>;
#size-cells = <0>;
+
+ pmi8994_gpios: gpios@c000 {
+ compatible = "qcom,pmi8994-gpio", "qcom,spmi-gpio";
+ reg = <0xc000>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupts = <2 0xc0 0 IRQ_TYPE_NONE>,
+ <2 0xc1 0 IRQ_TYPE_NONE>,
+ <2 0xc2 0 IRQ_TYPE_NONE>,
+ <2 0xc3 0 IRQ_TYPE_NONE>,
+ <2 0xc4 0 IRQ_TYPE_NONE>,
+ <2 0xc5 0 IRQ_TYPE_NONE>,
+ <2 0xc6 0 IRQ_TYPE_NONE>,
+ <2 0xc7 0 IRQ_TYPE_NONE>,
+ <2 0xc8 0 IRQ_TYPE_NONE>,
+ <2 0xc9 0 IRQ_TYPE_NONE>;
+ };
};
pmic@3 {
diff --git a/arch/arm64/boot/dts/renesas/Makefile b/arch/arm64/boot/dts/renesas/Makefile
index acc4bb30d485..381928bc1358 100644
--- a/arch/arm64/boot/dts/renesas/Makefile
+++ b/arch/arm64/boot/dts/renesas/Makefile
@@ -2,6 +2,7 @@ dtb-$(CONFIG_ARCH_R8A7795) += r8a7795-salvator-x.dtb r8a7795-h3ulcb.dtb
dtb-$(CONFIG_ARCH_R8A7795) += r8a7795-salvator-xs.dtb
dtb-$(CONFIG_ARCH_R8A7795) += r8a7795-es1-salvator-x.dtb r8a7795-es1-h3ulcb.dtb
dtb-$(CONFIG_ARCH_R8A7796) += r8a7796-salvator-x.dtb r8a7796-m3ulcb.dtb
+dtb-$(CONFIG_ARCH_R8A77995) += r8a77995-draak.dtb
always := $(dtb-y)
clean-files := *.dtb
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-es1-h3ulcb.dts b/arch/arm64/boot/dts/renesas/r8a7795-es1-h3ulcb.dts
index 95fe207cb6a3..dd4f9b6a4254 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-es1-h3ulcb.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7795-es1-h3ulcb.dts
@@ -9,8 +9,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
-
/dts-v1/;
#include "r8a7795-es1.dtsi"
#include "ulcb.dtsi"
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts b/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts
index b84c156ed696..3f7d5f51e428 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7795-es1-salvator-x.dts
@@ -8,8 +8,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
-
/dts-v1/;
#include "r8a7795-es1.dtsi"
#include "salvator-x.dtsi"
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi b/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi
index a0ba7bd21ea3..aaa5e67a963e 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi
+++ b/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi
@@ -21,6 +21,14 @@
status = "disabled";
};
+ /delete-node/ usb-phy@ee0e0200;
+ /delete-node/ usb@ee0e0100;
+ /delete-node/ usb@ee0e0000;
+ /delete-node/ usb@e659c000;
+
+ /delete-node/ dma-controller@e6460000;
+ /delete-node/ dma-controller@e6470000;
+
fcpf2: fcp@fe952000 {
compatible = "renesas,fcpf";
reg = <0 0xfe952000 0 0x200>;
@@ -79,6 +87,5 @@
};
&du {
- compatible = "renesas,du-r8a7795";
vsps = <&vspd0 &vspd1 &vspd2 &vspd3>;
};
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-h3ulcb.dts b/arch/arm64/boot/dts/renesas/r8a7795-h3ulcb.dts
index 0426f41765f0..0afe777973de 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-h3ulcb.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7795-h3ulcb.dts
@@ -9,8 +9,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
-
/dts-v1/;
#include "r8a7795.dtsi"
#include "ulcb.dtsi"
@@ -40,3 +38,17 @@
reg = <0x7 0x00000000 0x0 0x40000000>;
};
};
+
+&du {
+ clocks = <&cpg CPG_MOD 724>,
+ <&cpg CPG_MOD 723>,
+ <&cpg CPG_MOD 722>,
+ <&cpg CPG_MOD 721>,
+ <&cpg CPG_MOD 727>,
+ <&versaclock5 1>,
+ <&versaclock5 3>,
+ <&versaclock5 4>,
+ <&versaclock5 2>;
+ clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0",
+ "dclkin.0", "dclkin.1", "dclkin.2", "dclkin.3";
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-salvator-x.dts b/arch/arm64/boot/dts/renesas/r8a7795-salvator-x.dts
index 684fb3b9d154..17953070f38d 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-salvator-x.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7795-salvator-x.dts
@@ -8,8 +8,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
-
/dts-v1/;
#include "r8a7795.dtsi"
#include "salvator-x.dtsi"
diff --git a/arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dts b/arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dts
index de354957144b..7675de5d4f2c 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dts
@@ -8,8 +8,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
-
/dts-v1/;
#include "r8a7795.dtsi"
#include "salvator-xs.dtsi"
@@ -46,10 +44,12 @@
<&cpg CPG_MOD 722>,
<&cpg CPG_MOD 721>,
<&cpg CPG_MOD 727>,
+ <&versaclock6 1>,
<&x21_clk>,
- <&x22_clk>;
+ <&x22_clk>,
+ <&versaclock6 2>;
clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0",
- "dclkin.1", "dclkin.2";
+ "dclkin.0", "dclkin.1", "dclkin.2", "dclkin.3";
};
&ehci2 {
diff --git a/arch/arm64/boot/dts/renesas/r8a7795.dtsi b/arch/arm64/boot/dts/renesas/r8a7795.dtsi
index e31c1b660b3f..2938195b9571 100644
--- a/arch/arm64/boot/dts/renesas/r8a7795.dtsi
+++ b/arch/arm64/boot/dts/renesas/r8a7795.dtsi
@@ -12,6 +12,8 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/power/r8a7795-sysc.h>
+#define CPG_AUDIO_CLK_I R8A7795_CLK_S0D4
+
/ {
compatible = "renesas,r8a7795";
#address-cells = <2>;
@@ -691,6 +693,126 @@
};
};
+ drif00: rif@e6f40000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f40000 0 0x64>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 515>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x20>, <&dmac2 0x20>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 515>;
+ renesas,bonding = <&drif01>;
+ status = "disabled";
+ };
+
+ drif01: rif@e6f50000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f50000 0 0x64>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 514>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x22>, <&dmac2 0x22>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 514>;
+ renesas,bonding = <&drif00>;
+ status = "disabled";
+ };
+
+ drif10: rif@e6f60000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f60000 0 0x64>;
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 513>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x24>, <&dmac2 0x24>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 513>;
+ renesas,bonding = <&drif11>;
+ status = "disabled";
+ };
+
+ drif11: rif@e6f70000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f70000 0 0x64>;
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 512>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x26>, <&dmac2 0x26>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 512>;
+ renesas,bonding = <&drif10>;
+ status = "disabled";
+ };
+
+ drif20: rif@e6f80000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f80000 0 0x64>;
+ interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 511>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x28>, <&dmac2 0x28>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 511>;
+ renesas,bonding = <&drif21>;
+ status = "disabled";
+ };
+
+ drif21: rif@e6f90000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f90000 0 0x64>;
+ interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 510>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2a>, <&dmac2 0x2a>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 510>;
+ renesas,bonding = <&drif20>;
+ status = "disabled";
+ };
+
+ drif30: rif@e6fa0000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6fa0000 0 0x64>;
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 509>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2c>, <&dmac2 0x2c>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 509>;
+ renesas,bonding = <&drif31>;
+ status = "disabled";
+ };
+
+ drif31: rif@e6fb0000 {
+ compatible = "renesas,r8a7795-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6fb0000 0 0x64>;
+ interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 508>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2e>, <&dmac2 0x2e>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 508>;
+ renesas,bonding = <&drif30>;
+ status = "disabled";
+ };
+
hscif0: serial@e6540000 {
compatible = "renesas,hscif-r8a7795",
"renesas,rcar-gen3-hscif",
@@ -776,6 +898,68 @@
status = "disabled";
};
+ msiof0: spi@e6e90000 {
+ compatible = "renesas,msiof-r8a7795",
+ "renesas,rcar-gen3-msiof";
+ reg = <0 0xe6e90000 0 0x0064>;
+ interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 211>;
+ dmas = <&dmac1 0x41>, <&dmac1 0x40>,
+ <&dmac2 0x41>, <&dmac2 0x40>;
+ dma-names = "tx", "rx", "tx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 211>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ msiof1: spi@e6ea0000 {
+ compatible = "renesas,msiof-r8a7795",
+ "renesas,rcar-gen3-msiof";
+ reg = <0 0xe6ea0000 0 0x0064>;
+ interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 210>;
+ dmas = <&dmac1 0x43>, <&dmac1 0x42>,
+ <&dmac2 0x43>, <&dmac2 0x42>;
+ dma-names = "tx", "rx", "tx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 210>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ msiof2: spi@e6c00000 {
+ compatible = "renesas,msiof-r8a7795",
+ "renesas,rcar-gen3-msiof";
+ reg = <0 0xe6c00000 0 0x0064>;
+ interrupts = <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 209>;
+ dmas = <&dmac0 0x45>, <&dmac0 0x44>;
+ dma-names = "tx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 209>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
+ msiof3: spi@e6c10000 {
+ compatible = "renesas,msiof-r8a7795",
+ "renesas,rcar-gen3-msiof";
+ reg = <0 0xe6c10000 0 0x0064>;
+ interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 208>;
+ dmas = <&dmac0 0x47>, <&dmac0 0x46>;
+ dma-names = "tx", "rx";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 208>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
+
scif0: serial@e6e60000 {
compatible = "renesas,scif-r8a7795",
"renesas,rcar-gen3-scif", "renesas,scif";
@@ -1267,7 +1451,8 @@
};
sata: sata@ee300000 {
- compatible = "renesas,sata-r8a7795";
+ compatible = "renesas,sata-r8a7795",
+ "renesas,rcar-gen3-sata";
reg = <0 0xee300000 0 0x200000>;
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cpg CPG_MOD 815>;
@@ -1314,6 +1499,34 @@
dma-channels = <2>;
};
+ usb_dmac2: dma-controller@e6460000 {
+ compatible = "renesas,r8a7795-usb-dmac",
+ "renesas,usb-dmac";
+ reg = <0 0xe6460000 0 0x100>;
+ interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH
+ GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "ch0", "ch1";
+ clocks = <&cpg CPG_MOD 326>;
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 326>;
+ #dma-cells = <1>;
+ dma-channels = <2>;
+ };
+
+ usb_dmac3: dma-controller@e6470000 {
+ compatible = "renesas,r8a7795-usb-dmac",
+ "renesas,usb-dmac";
+ reg = <0 0xe6470000 0 0x100>;
+ interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH
+ GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "ch0", "ch1";
+ clocks = <&cpg CPG_MOD 329>;
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 329>;
+ #dma-cells = <1>;
+ dma-channels = <2>;
+ };
+
sdhi0: sd@ee100000 {
compatible = "renesas,sdhi-r8a7795";
reg = <0 0xee100000 0 0x2000>;
@@ -1392,6 +1605,18 @@
status = "disabled";
};
+ usb2_phy3: usb-phy@ee0e0200 {
+ compatible = "renesas,usb2-phy-r8a7795",
+ "renesas,rcar-gen3-usb2-phy";
+ reg = <0 0xee0e0200 0 0x700>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 700>;
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 700>;
+ #phy-cells = <0>;
+ status = "disabled";
+ };
+
ehci0: usb@ee080100 {
compatible = "generic-ehci";
reg = <0 0xee080100 0 0x100>;
@@ -1399,6 +1624,7 @@
clocks = <&cpg CPG_MOD 703>;
phys = <&usb2_phy0>;
phy-names = "usb";
+ companion = <&ohci0>;
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
resets = <&cpg 703>;
status = "disabled";
@@ -1411,6 +1637,7 @@
clocks = <&cpg CPG_MOD 702>;
phys = <&usb2_phy1>;
phy-names = "usb";
+ companion = <&ohci1>;
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
resets = <&cpg 702>;
status = "disabled";
@@ -1423,11 +1650,25 @@
clocks = <&cpg CPG_MOD 701>;
phys = <&usb2_phy2>;
phy-names = "usb";
+ companion = <&ohci2>;
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
resets = <&cpg 701>;
status = "disabled";
};
+ ehci3: usb@ee0e0100 {
+ compatible = "generic-ehci";
+ reg = <0 0xee0e0100 0 0x100>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 700>;
+ phys = <&usb2_phy3>;
+ phy-names = "usb";
+ companion = <&ohci3>;
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 700>;
+ status = "disabled";
+ };
+
ohci0: usb@ee080000 {
compatible = "generic-ohci";
reg = <0 0xee080000 0 0x100>;
@@ -1464,6 +1705,18 @@
status = "disabled";
};
+ ohci3: usb@ee0e0000 {
+ compatible = "generic-ohci";
+ reg = <0 0xee0e0000 0 0x100>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 700>;
+ phys = <&usb2_phy3>;
+ phy-names = "usb";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 700>;
+ status = "disabled";
+ };
+
hsusb: usb@e6590000 {
compatible = "renesas,usbhs-r8a7795",
"renesas,rcar-gen3-usbhs";
@@ -1481,6 +1734,23 @@
status = "disabled";
};
+ hsusb3: usb@e659c000 {
+ compatible = "renesas,usbhs-r8a7795",
+ "renesas,rcar-gen3-usbhs";
+ reg = <0 0xe659c000 0 0x100>;
+ interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 705>;
+ dmas = <&usb_dmac2 0>, <&usb_dmac2 1>,
+ <&usb_dmac3 0>, <&usb_dmac3 1>;
+ dma-names = "ch0", "ch1", "ch2", "ch3";
+ renesas,buswait = <11>;
+ phys = <&usb2_phy3>;
+ phy-names = "usb";
+ power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+ resets = <&cpg 705>;
+ status = "disabled";
+ };
+
pciec0: pcie@fe000000 {
compatible = "renesas,pcie-r8a7795",
"renesas,pcie-rcar-gen3";
@@ -1535,6 +1805,46 @@
status = "disabled";
};
+ imr-lx4@fe860000 {
+ compatible = "renesas,r8a7795-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe860000 0 0x2000>;
+ interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 823>;
+ power-domains = <&sysc R8A7795_PD_A3VC>;
+ resets = <&cpg 823>;
+ };
+
+ imr-lx4@fe870000 {
+ compatible = "renesas,r8a7795-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe870000 0 0x2000>;
+ interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 822>;
+ power-domains = <&sysc R8A7795_PD_A3VC>;
+ resets = <&cpg 822>;
+ };
+
+ imr-lx4@fe880000 {
+ compatible = "renesas,r8a7795-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe880000 0 0x2000>;
+ interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 821>;
+ power-domains = <&sysc R8A7795_PD_A3VC>;
+ resets = <&cpg 821>;
+ };
+
+ imr-lx4@fe890000 {
+ compatible = "renesas,r8a7795-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe890000 0 0x2000>;
+ interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 820>;
+ power-domains = <&sysc R8A7795_PD_A3VC>;
+ resets = <&cpg 820>;
+ };
+
vspbc: vsp@fe920000 {
compatible = "renesas,vsp2";
reg = <0 0xfe920000 0 0x8000>;
@@ -1755,6 +2065,7 @@
};
du: display@feb00000 {
+ compatible = "renesas,du-r8a7795";
reg = <0 0xfeb00000 0 0x80000>,
<0 0xfeb90000 0 0x14>;
reg-names = "du", "lvds.0";
@@ -1768,6 +2079,7 @@
<&cpg CPG_MOD 721>,
<&cpg CPG_MOD 727>;
clock-names = "du.0", "du.1", "du.2", "du.3", "lvds.0";
+ vsps = <&vspd0 0 &vspd1 0 &vspd2 0 &vspd0 1>;
status = "disabled";
ports {
diff --git a/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb.dts b/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb.dts
index 38b58b7fca4b..daee1f1a3f68 100644
--- a/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb.dts
@@ -9,8 +9,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7796_CLK_S0D4
-
/dts-v1/;
#include "r8a7796.dtsi"
#include "ulcb.dtsi"
@@ -30,3 +28,15 @@
reg = <0x6 0x00000000 0x0 0x40000000>;
};
};
+
+&du {
+ clocks = <&cpg CPG_MOD 724>,
+ <&cpg CPG_MOD 723>,
+ <&cpg CPG_MOD 722>,
+ <&cpg CPG_MOD 727>,
+ <&versaclock5 1>,
+ <&versaclock5 3>,
+ <&versaclock5 2>;
+ clock-names = "du.0", "du.1", "du.2", "lvds.0",
+ "dclkin.0", "dclkin.1", "dclkin.2";
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7796-salvator-x.dts b/arch/arm64/boot/dts/renesas/r8a7796-salvator-x.dts
index db4f162d6bdd..b317be03306e 100644
--- a/arch/arm64/boot/dts/renesas/r8a7796-salvator-x.dts
+++ b/arch/arm64/boot/dts/renesas/r8a7796-salvator-x.dts
@@ -8,8 +8,6 @@
* kind, whether express or implied.
*/
-#define CPG_AUDIO_CLK_I R8A7796_CLK_S0D4
-
/dts-v1/;
#include "r8a7796.dtsi"
#include "salvator-x.dtsi"
@@ -29,3 +27,32 @@
reg = <0x6 0x00000000 0x0 0x80000000>;
};
};
+
+&du {
+ clocks = <&cpg CPG_MOD 724>,
+ <&cpg CPG_MOD 723>,
+ <&cpg CPG_MOD 722>,
+ <&cpg CPG_MOD 727>,
+ <&versaclock5 1>,
+ <&x21_clk>,
+ <&versaclock5 2>;
+ clock-names = "du.0", "du.1", "du.2", "lvds.0",
+ "dclkin.0", "dclkin.1", "dclkin.2";
+};
+
+&hdmi0 {
+ status = "okay";
+
+ ports {
+ port@1 {
+ reg = <1>;
+ rcar_dw_hdmi0_out: endpoint {
+ remote-endpoint = <&hdmi0_con>;
+ };
+ };
+ };
+};
+
+&hdmi0_con {
+ remote-endpoint = <&rcar_dw_hdmi0_out>;
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7796.dtsi b/arch/arm64/boot/dts/renesas/r8a7796.dtsi
index 1f6710912045..369092e17e34 100644
--- a/arch/arm64/boot/dts/renesas/r8a7796.dtsi
+++ b/arch/arm64/boot/dts/renesas/r8a7796.dtsi
@@ -12,6 +12,8 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/power/r8a7796-sysc.h>
+#define CPG_AUDIO_CLK_I R8A7796_CLK_S0D4
+
/ {
compatible = "renesas,r8a7796";
#address-cells = <2>;
@@ -639,6 +641,126 @@
};
};
+ drif00: rif@e6f40000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f40000 0 0x64>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 515>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x20>, <&dmac2 0x20>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 515>;
+ renesas,bonding = <&drif01>;
+ status = "disabled";
+ };
+
+ drif01: rif@e6f50000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f50000 0 0x64>;
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 514>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x22>, <&dmac2 0x22>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 514>;
+ renesas,bonding = <&drif00>;
+ status = "disabled";
+ };
+
+ drif10: rif@e6f60000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f60000 0 0x64>;
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 513>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x24>, <&dmac2 0x24>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 513>;
+ renesas,bonding = <&drif11>;
+ status = "disabled";
+ };
+
+ drif11: rif@e6f70000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f70000 0 0x64>;
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 512>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x26>, <&dmac2 0x26>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 512>;
+ renesas,bonding = <&drif10>;
+ status = "disabled";
+ };
+
+ drif20: rif@e6f80000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f80000 0 0x64>;
+ interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 511>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x28>, <&dmac2 0x28>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 511>;
+ renesas,bonding = <&drif21>;
+ status = "disabled";
+ };
+
+ drif21: rif@e6f90000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6f90000 0 0x64>;
+ interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 510>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2a>, <&dmac2 0x2a>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 510>;
+ renesas,bonding = <&drif20>;
+ status = "disabled";
+ };
+
+ drif30: rif@e6fa0000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6fa0000 0 0x64>;
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 509>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2c>, <&dmac2 0x2c>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 509>;
+ renesas,bonding = <&drif31>;
+ status = "disabled";
+ };
+
+ drif31: rif@e6fb0000 {
+ compatible = "renesas,r8a7796-drif",
+ "renesas,rcar-gen3-drif";
+ reg = <0 0xe6fb0000 0 0x64>;
+ interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 508>;
+ clock-names = "fck";
+ dmas = <&dmac1 0x2e>, <&dmac2 0x2e>;
+ dma-names = "rx", "rx";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 508>;
+ renesas,bonding = <&drif30>;
+ status = "disabled";
+ };
+
avb: ethernet@e6800000 {
compatible = "renesas,etheravb-r8a7796",
"renesas,etheravb-rcar-gen3";
@@ -877,7 +999,7 @@
clocks = <&cpg CPG_MOD 211>;
dmas = <&dmac1 0x41>, <&dmac1 0x40>,
<&dmac2 0x41>, <&dmac2 0x40>;
- dma-names = "tx", "rx";
+ dma-names = "tx", "rx", "tx", "rx";
power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
resets = <&cpg 211>;
#address-cells = <1>;
@@ -893,7 +1015,7 @@
clocks = <&cpg CPG_MOD 210>;
dmas = <&dmac1 0x43>, <&dmac1 0x42>,
<&dmac2 0x43>, <&dmac2 0x42>;
- dma-names = "tx", "rx";
+ dma-names = "tx", "rx", "tx", "rx";
power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
resets = <&cpg 210>;
#address-cells = <1>;
@@ -1101,36 +1223,133 @@
dma-channels = <16>;
};
+ usb_dmac0: dma-controller@e65a0000 {
+ compatible = "renesas,r8a7796-usb-dmac",
+ "renesas,usb-dmac";
+ reg = <0 0xe65a0000 0 0x100>;
+ interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH
+ GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "ch0", "ch1";
+ clocks = <&cpg CPG_MOD 330>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 330>;
+ #dma-cells = <1>;
+ dma-channels = <2>;
+ };
+
+ usb_dmac1: dma-controller@e65b0000 {
+ compatible = "renesas,r8a7796-usb-dmac",
+ "renesas,usb-dmac";
+ reg = <0 0xe65b0000 0 0x100>;
+ interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH
+ GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "ch0", "ch1";
+ clocks = <&cpg CPG_MOD 331>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 331>;
+ #dma-cells = <1>;
+ dma-channels = <2>;
+ };
+
hsusb: usb@e6590000 {
- /* placeholder */
+ compatible = "renesas,usbhs-r8a7796",
+ "renesas,rcar-gen3-usbhs";
+ reg = <0 0xe6590000 0 0x100>;
+ interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 704>;
+ dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
+ <&usb_dmac1 0>, <&usb_dmac1 1>;
+ dma-names = "ch0", "ch1", "ch2", "ch3";
+ renesas,buswait = <11>;
+ phys = <&usb2_phy0>;
+ phy-names = "usb";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 704>;
+ status = "disabled";
};
xhci0: usb@ee000000 {
- /* placeholder */
+ compatible = "renesas,xhci-r8a7796",
+ "renesas,rcar-gen3-xhci";
+ reg = <0 0xee000000 0 0xc00>;
+ interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 328>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 328>;
+ status = "disabled";
};
ohci0: usb@ee080000 {
- /* placeholder */
+ compatible = "generic-ohci";
+ reg = <0 0xee080000 0 0x100>;
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 703>;
+ phys = <&usb2_phy0>;
+ phy-names = "usb";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 703>;
+ status = "disabled";
};
ehci0: usb@ee080100 {
- /* placeholder */
+ compatible = "generic-ehci";
+ reg = <0 0xee080100 0 0x100>;
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 703>;
+ phys = <&usb2_phy0>;
+ phy-names = "usb";
+ companion= <&ohci0>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 703>;
+ status = "disabled";
};
usb2_phy0: usb-phy@ee080200 {
- /* placeholder */
+ compatible = "renesas,usb2-phy-r8a7796",
+ "renesas,rcar-gen3-usb2-phy";
+ reg = <0 0xee080200 0 0x700>;
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 703>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 703>;
+ #phy-cells = <0>;
+ status = "disabled";
};
ohci1: usb@ee0a0000 {
- /* placeholder */
+ compatible = "generic-ohci";
+ reg = <0 0xee0a0000 0 0x100>;
+ interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 702>;
+ phys = <&usb2_phy1>;
+ phy-names = "usb";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 702>;
+ status = "disabled";
};
ehci1: usb@ee0a0100 {
- /* placeholder */
+ compatible = "generic-ehci";
+ reg = <0 0xee0a0100 0 0x100>;
+ interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 702>;
+ phys = <&usb2_phy1>;
+ phy-names = "usb";
+ companion= <&ohci1>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 702>;
+ status = "disabled";
};
usb2_phy1: usb-phy@ee0a0200 {
- /* placeholder */
+ compatible = "renesas,usb2-phy-r8a7796",
+ "renesas,rcar-gen3-usb2-phy";
+ reg = <0 0xee0a0200 0 0x700>;
+ clocks = <&cpg CPG_MOD 702>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 702>;
+ #phy-cells = <0>;
+ status = "disabled";
};
sdhi0: sd@ee100000 {
@@ -1440,8 +1659,150 @@
/* placeholder */
};
+ fcpf0: fcp@fe950000 {
+ compatible = "renesas,fcpf";
+ reg = <0 0xfe950000 0 0x200>;
+ clocks = <&cpg CPG_MOD 615>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 615>;
+ };
+
+ vspb: vsp@fe960000 {
+ compatible = "renesas,vsp2";
+ reg = <0 0xfe960000 0 0x8000>;
+ interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 626>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 626>;
+
+ renesas,fcp = <&fcpvb0>;
+ };
+
+ fcpvb0: fcp@fe96f000 {
+ compatible = "renesas,fcpv";
+ reg = <0 0xfe96f000 0 0x200>;
+ clocks = <&cpg CPG_MOD 607>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 607>;
+ };
+
+ vspi0: vsp@fe9a0000 {
+ compatible = "renesas,vsp2";
+ reg = <0 0xfe9a0000 0 0x8000>;
+ interrupts = <GIC_SPI 444 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 631>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 631>;
+
+ renesas,fcp = <&fcpvi0>;
+ };
+
+ fcpvi0: fcp@fe9af000 {
+ compatible = "renesas,fcpv";
+ reg = <0 0xfe9af000 0 0x200>;
+ clocks = <&cpg CPG_MOD 611>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 611>;
+ };
+
+ vspd0: vsp@fea20000 {
+ compatible = "renesas,vsp2";
+ reg = <0 0xfea20000 0 0x4000>;
+ interrupts = <GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 623>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 623>;
+
+ renesas,fcp = <&fcpvd0>;
+ };
+
+ fcpvd0: fcp@fea27000 {
+ compatible = "renesas,fcpv";
+ reg = <0 0xfea27000 0 0x200>;
+ clocks = <&cpg CPG_MOD 603>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 603>;
+ };
+
+ vspd1: vsp@fea28000 {
+ compatible = "renesas,vsp2";
+ reg = <0 0xfea28000 0 0x4000>;
+ interrupts = <GIC_SPI 467 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 622>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 622>;
+
+ renesas,fcp = <&fcpvd1>;
+ };
+
+ fcpvd1: fcp@fea2f000 {
+ compatible = "renesas,fcpv";
+ reg = <0 0xfea2f000 0 0x200>;
+ clocks = <&cpg CPG_MOD 602>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 602>;
+ };
+
+ vspd2: vsp@fea30000 {
+ compatible = "renesas,vsp2";
+ reg = <0 0xfea30000 0 0x4000>;
+ interrupts = <GIC_SPI 468 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 621>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 621>;
+
+ renesas,fcp = <&fcpvd2>;
+ };
+
+ fcpvd2: fcp@fea37000 {
+ compatible = "renesas,fcpv";
+ reg = <0 0xfea37000 0 0x200>;
+ clocks = <&cpg CPG_MOD 601>;
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 601>;
+ };
+
+ hdmi0: hdmi@fead0000 {
+ compatible = "renesas,r8a7796-hdmi", "renesas,rcar-gen3-hdmi";
+ reg = <0 0xfead0000 0 0x10000>;
+ interrupts = <GIC_SPI 389 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 729>, <&cpg CPG_CORE R8A7796_CLK_HDMI>;
+ clock-names = "iahb", "isfr";
+ power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+ resets = <&cpg 729>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ port@0 {
+ reg = <0>;
+ dw_hdmi0_in: endpoint {
+ remote-endpoint = <&du_out_hdmi0>;
+ };
+ };
+ port@1 {
+ reg = <1>;
+ };
+ };
+ };
+
du: display@feb00000 {
- /* placeholder */
+ compatible = "renesas,du-r8a7796";
+ reg = <0 0xfeb00000 0 0x70000>,
+ <0 0xfeb90000 0 0x14>;
+ reg-names = "du", "lvds.0";
+ interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 724>,
+ <&cpg CPG_MOD 723>,
+ <&cpg CPG_MOD 722>,
+ <&cpg CPG_MOD 727>;
+ clock-names = "du.0", "du.1", "du.2", "lvds.0";
+ status = "disabled";
+
+ vsps = <&vspd0 &vspd1 &vspd2>;
ports {
#address-cells = <1>;
@@ -1452,7 +1813,38 @@
du_out_rgb: endpoint {
};
};
+ port@1 {
+ reg = <1>;
+ du_out_hdmi0: endpoint {
+ remote-endpoint = <&dw_hdmi0_in>;
+ };
+ };
+ port@2 {
+ reg = <2>;
+ du_out_lvds0: endpoint {
+ };
+ };
};
};
+
+ imr-lx4@fe860000 {
+ compatible = "renesas,r8a7796-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe860000 0 0x2000>;
+ interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 823>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 823>;
+ };
+
+ imr-lx4@fe870000 {
+ compatible = "renesas,r8a7796-imr-lx4",
+ "renesas,imr-lx4";
+ reg = <0 0xfe870000 0 0x2000>;
+ interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 822>;
+ power-domains = <&sysc R8A7796_PD_A3VC>;
+ resets = <&cpg 822>;
+ };
};
};
diff --git a/arch/arm64/boot/dts/renesas/r8a77995-draak.dts b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
new file mode 100644
index 000000000000..d144370051d5
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
@@ -0,0 +1,46 @@
+/*
+ * Device Tree Source for the Draak board
+ *
+ * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2017 Glider bvba
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+/dts-v1/;
+#include "r8a77995.dtsi"
+
+/ {
+ model = "Renesas Draak board based on r8a77995";
+ compatible = "renesas,draak", "renesas,r8a77995";
+
+ aliases {
+ serial0 = &scif2;
+ };
+
+ chosen {
+ bootargs = "ignore_loglevel";
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory@48000000 {
+ device_type = "memory";
+ /* first 128MB is reserved for secure area. */
+ reg = <0x0 0x48000000 0x0 0x18000000>;
+ };
+};
+
+&extal_clk {
+ clock-frequency = <48000000>;
+};
+
+&scif2 {
+ status = "okay";
+};
+
+&rwdt {
+ timeout-sec = <60>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a77995.dtsi b/arch/arm64/boot/dts/renesas/r8a77995.dtsi
new file mode 100644
index 000000000000..d0f95b78c022
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r8a77995.dtsi
@@ -0,0 +1,155 @@
+/*
+ * Device Tree Source for the r8a77995 SoC
+ *
+ * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2017 Glider bvba
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+/ {
+ compatible = "renesas,r8a77995";
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ psci {
+ compatible = "arm,psci-1.0", "arm,psci-0.2";
+ method = "smc";
+ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ a53_0: cpu@0 {
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0x0>;
+ device_type = "cpu";
+ power-domains = <&sysc 5>;
+ next-level-cache = <&L2_CA53>;
+ enable-method = "psci";
+ };
+
+ L2_CA53: cache-controller-1 {
+ compatible = "cache";
+ power-domains = <&sysc 21>;
+ cache-unified;
+ cache-level = <2>;
+ };
+ };
+
+ extal_clk: extal {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ /* This value must be overridden by the board */
+ clock-frequency = <0>;
+ };
+
+ scif_clk: scif {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <0>;
+ };
+
+ soc {
+ compatible = "simple-bus";
+ interrupt-parent = <&gic>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ gic: interrupt-controller@f1010000 {
+ compatible = "arm,gic-400";
+ #interrupt-cells = <3>;
+ #address-cells = <0>;
+ interrupt-controller;
+ reg = <0x0 0xf1010000 0 0x1000>,
+ <0x0 0xf1020000 0 0x20000>,
+ <0x0 0xf1040000 0 0x20000>,
+ <0x0 0xf1060000 0 0x20000>;
+ interrupts = <GIC_PPI 9
+ (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
+ clocks = <&cpg CPG_MOD 408>;
+ clock-names = "clk";
+ power-domains = <&sysc 32>;
+ resets = <&cpg 408>;
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupts = <GIC_PPI 13
+ (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 14
+ (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 11
+ (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+ <GIC_PPI 10
+ (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>;
+ };
+
+ rwdt: watchdog@e6020000 {
+ compatible = "renesas,r8a77995-wdt",
+ "renesas,rcar-gen3-wdt";
+ reg = <0 0xe6020000 0 0x0c>;
+ clocks = <&cpg CPG_MOD 402>;
+ power-domains = <&sysc 32>;
+ resets = <&cpg 402>;
+ status = "disabled";
+ };
+
+ pmu_a53 {
+ compatible = "arm,cortex-a53-pmu";
+ interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ cpg: clock-controller@e6150000 {
+ compatible = "renesas,r8a77995-cpg-mssr";
+ reg = <0 0xe6150000 0 0x1000>;
+ clocks = <&extal_clk>;
+ clock-names = "extal";
+ #clock-cells = <2>;
+ #power-domain-cells = <0>;
+ #reset-cells = <1>;
+ };
+
+ rst: reset-controller@e6160000 {
+ compatible = "renesas,r8a77995-rst";
+ reg = <0 0xe6160000 0 0x0200>;
+ };
+
+ pfc: pfc@e6060000 {
+ compatible = "renesas,pfc-r8a77995";
+ reg = <0 0xe6060000 0 0x508>;
+ };
+
+ prr: chipid@fff00044 {
+ compatible = "renesas,prr";
+ reg = <0 0xfff00044 0 4>;
+ };
+
+ sysc: system-controller@e6180000 {
+ compatible = "renesas,r8a77995-sysc";
+ reg = <0 0xe6180000 0 0x0400>;
+ #power-domain-cells = <1>;
+ };
+
+ scif2: serial@e6e88000 {
+ compatible = "renesas,scif-r8a77995",
+ "renesas,rcar-gen3-scif", "renesas,scif";
+ reg = <0 0xe6e88000 0 64>;
+ interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD 310>,
+ <&cpg CPG_CORE 16>,
+ <&scif_clk>;
+ clock-names = "fck", "brg_int", "scif_clk";
+ power-domains = <&sysc 32>;
+ resets = <&cpg 310>;
+ status = "disabled";
+ };
+ };
+};
diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi
index f903957da504..4786c67b5e65 100644
--- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi
+++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi
@@ -268,10 +268,6 @@
remote-endpoint = <&adv7123_in>;
};
};
- port@3 {
- lvds_connector: endpoint {
- };
- };
};
};
diff --git a/arch/arm64/boot/dts/renesas/salvator-xs.dtsi b/arch/arm64/boot/dts/renesas/salvator-xs.dtsi
index 81227e3c2c6f..bf4d200fb546 100644
--- a/arch/arm64/boot/dts/renesas/salvator-xs.dtsi
+++ b/arch/arm64/boot/dts/renesas/salvator-xs.dtsi
@@ -18,3 +18,13 @@
&extal_clk {
clock-frequency = <16640000>;
};
+
+&i2c4 {
+ versaclock6: clock-generator@6a {
+ compatible = "idt,5p49v6901";
+ reg = <0x6a>;
+ #clock-cells = <1>;
+ clocks = <&x23_clk>;
+ clock-names = "xin";
+ };
+};
diff --git a/arch/arm64/boot/dts/renesas/ulcb.dtsi b/arch/arm64/boot/dts/renesas/ulcb.dtsi
index d1a3f3b7a0ab..1b868df2393f 100644
--- a/arch/arm64/boot/dts/renesas/ulcb.dtsi
+++ b/arch/arm64/boot/dts/renesas/ulcb.dtsi
@@ -34,6 +34,16 @@
clock-frequency = <11289600>;
};
+ hdmi0-out {
+ compatible = "hdmi-connector";
+ type = "a";
+
+ port {
+ hdmi0_con: endpoint {
+ };
+ };
+ };
+
keyboard {
compatible = "gpio-keys";
@@ -120,6 +130,12 @@
#clock-cells = <0>;
clock-frequency = <24576000>;
};
+
+ x23_clk: x23-clock {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <25000000>;
+ };
};
&audio_clk_a {
@@ -153,6 +169,23 @@
clock-frequency = <32768>;
};
+&hdmi0 {
+ status = "okay";
+
+ ports {
+ port@1 {
+ reg = <1>;
+ rcar_dw_hdmi0_out: endpoint {
+ remote-endpoint = <&hdmi0_con>;
+ };
+ };
+ };
+};
+
+&hdmi0_con {
+ remote-endpoint = <&rcar_dw_hdmi0_out>;
+};
+
&i2c2 {
pinctrl-0 = <&i2c2_pins>;
pinctrl-names = "default";
@@ -189,6 +222,24 @@
};
};
+&i2c4 {
+ status = "okay";
+
+ clock-frequency = <400000>;
+
+ versaclock5: clock-generator@6a {
+ compatible = "idt,5p49v5925";
+ reg = <0x6a>;
+ #clock-cells = <1>;
+ clocks = <&x23_clk>;
+ clock-names = "xin";
+ };
+};
+
+&i2c_dvfs {
+ status = "okay";
+};
+
&ohci1 {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
index bcfa53b1e6b7..f1c9b13cea5c 100644
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -1,4 +1,5 @@
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-geekbox.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-orion-r68-meta.dtb
@@ -7,6 +8,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-r88.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-evb.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-firefly.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-kevin.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-sapphire-excavator.dtb
always := $(dtb-y)
subdir-y := $(dts-dirs)
diff --git a/arch/arm64/boot/dts/rockchip/rk3328-evb.dts b/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
index b9f36dad17e6..8e6a65431756 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
@@ -51,6 +51,25 @@
stdout-path = "serial2:1500000n8";
};
+ dc_12v: dc-12v {
+ compatible = "regulator-fixed";
+ regulator-name = "dc_12v";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ };
+
+ vcc_sys: vcc-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ vin-supply = <&dc_12v>;
+ };
+
vcc_phy: vcc-phy-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc_phy";
@@ -69,6 +88,151 @@
status = "okay";
};
+&i2c1 {
+ status = "okay";
+
+ rk805: rk805@18 {
+ compatible = "rockchip,rk805";
+ reg = <0x18>;
+ interrupt-parent = <&gpio2>;
+ interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
+ #clock-cells = <1>;
+ clock-output-names = "xin32k", "rk805-clkout2";
+ gpio-controller;
+ #gpio-cells = <2>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pmic_int_l>;
+ rockchip,system-power-controller;
+ wakeup-source;
+
+ vcc1-supply = <&vcc_sys>;
+ vcc2-supply = <&vcc_sys>;
+ vcc3-supply = <&vcc_sys>;
+ vcc4-supply = <&vcc_sys>;
+ vcc5-supply = <&vcc_io>;
+ vcc6-supply = <&vcc_io>;
+
+ regulators {
+ vdd_logic: DCDC_REG1 {
+ regulator-name = "vdd_logic";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1450000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1000000>;
+ };
+ };
+
+ vdd_arm: DCDC_REG2 {
+ regulator-name = "vdd_arm";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1450000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <950000>;
+ };
+ };
+
+ vcc_ddr: DCDC_REG3 {
+ regulator-name = "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ };
+ };
+
+ vcc_io: DCDC_REG4 {
+ regulator-name = "vcc_io";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
+ vcc_18: LDO_REG1 {
+ regulator-name = "vcc_18";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc18_emmc: LDO_REG2 {
+ regulator-name = "vcc18_emmc";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vdd_10: LDO_REG3 {
+ regulator-name = "vdd_10";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1000000>;
+ };
+ };
+ };
+ };
+};
+
+&pinctrl {
+ pmic {
+ pmic_int_l: pmic-int-l {
+ rockchip,pins = <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+};
+
+&tsadc {
+ status = "okay";
+};
+
&uart2 {
status = "okay";
};
+
+&u2phy {
+ status = "okay";
+};
+
+&u2phy_host {
+ status = "okay";
+};
+
+&u2phy_otg {
+ status = "okay";
+};
+
+&usb20_otg {
+ status = "okay";
+};
+
+&usb_host0_ehci {
+ status = "okay";
+};
+
+&usb_host0_ohci {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
new file mode 100644
index 000000000000..d4f80786e7c2
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 2017 PINE64
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "rk3328.dtsi"
+
+/ {
+ model = "Pine64 Rock64";
+ compatible = "pine64,rock64", "rockchip,rk3328";
+
+ chosen {
+ stdout-path = "serial2:1500000n8";
+ };
+
+ gmac_clkin: external-gmac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <125000000>;
+ clock-output-names = "gmac_clkin";
+ #clock-cells = <0>;
+ };
+
+ vcc_sd: sdmmc-regulator {
+ compatible = "regulator-fixed";
+ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc0m1_gpio>;
+ regulator-name = "vcc_sd";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vcc_io>;
+ };
+
+ vcc_host_5v: vcc-host-5v-regulator {
+ compatible = "regulator-fixed";
+ enable-active-high;
+ gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb30_host_drv>;
+ regulator-name = "vcc_host_5v";
+ regulator-always-on;
+ vin-supply = <&vcc_sys>;
+ };
+
+ vcc_host1_5v: vcc_otg_5v: vcc-host1-5v-regulator {
+ compatible = "regulator-fixed";
+ enable-active-high;
+ gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb20_host_drv>;
+ regulator-name = "vcc_host1_5v";
+ regulator-always-on;
+ vin-supply = <&vcc_sys>;
+ };
+
+ vcc_sys: vcc-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ };
+};
+
+&cpu0 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu1 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu2 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&cpu3 {
+ cpu-supply = <&vdd_arm>;
+};
+
+&emmc {
+ bus-width = <8>;
+ cap-mmc-highspeed;
+ non-removable;
+ pinctrl-names = "default";
+ pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
+ vmmc-supply = <&vcc_io>;
+ vqmmc-supply = <&vcc18_emmc>;
+ status = "okay";
+};
+
+&gmac2io {
+ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;
+ assigned-clock-parents = <&gmac_clkin>, <&gmac_clkin>;
+ clock_in_out = "input";
+ phy-supply = <&vcc_io>;
+ phy-mode = "rgmii";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rgmiim1_pins>;
+ snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
+ snps,reset-active-low;
+ snps,reset-delays-us = <0 10000 50000>;
+ tx_delay = <0x26>;
+ rx_delay = <0x11>;
+ status = "okay";
+};
+
+&i2c1 {
+ status = "okay";
+
+ rk805: rk805@18 {
+ compatible = "rockchip,rk805";
+ reg = <0x18>;
+ interrupt-parent = <&gpio2>;
+ interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
+ #clock-cells = <1>;
+ clock-output-names = "xin32k", "rk805-clkout2";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pmic_int_l>;
+ rockchip,system-power-controller;
+ wakeup-source;
+
+ vcc1-supply = <&vcc_sys>;
+ vcc2-supply = <&vcc_sys>;
+ vcc3-supply = <&vcc_sys>;
+ vcc4-supply = <&vcc_sys>;
+ vcc5-supply = <&vcc_io>;
+ vcc6-supply = <&vcc_sys>;
+
+ regulators {
+ vdd_logic: DCDC_REG1 {
+ regulator-name = "vdd_logic";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1450000>;
+ regulator-ramp-delay = <12500>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1000000>;
+ };
+ };
+
+ vdd_arm: DCDC_REG2 {
+ regulator-name = "vdd_arm";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1450000>;
+ regulator-ramp-delay = <12500>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <950000>;
+ };
+ };
+
+ vcc_ddr: DCDC_REG3 {
+ regulator-name = "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ };
+ };
+
+ vcc_io: DCDC_REG4 {
+ regulator-name = "vcc_io";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
+ vcc_18: LDO_REG1 {
+ regulator-name = "vdd_18";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc18_emmc: LDO_REG2 {
+ regulator-name = "vcc_18emmc";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vdd_10: LDO_REG3 {
+ regulator-name = "vdd_10";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1000000>;
+ };
+ };
+ };
+ };
+};
+
+&io_domains {
+ status = "okay";
+
+ vccio1-supply = <&vcc_io>;
+ vccio2-supply = <&vcc18_emmc>;
+ vccio3-supply = <&vcc_io>;
+ vccio4-supply = <&vcc_18>;
+ vccio5-supply = <&vcc_io>;
+ vccio6-supply = <&vcc_io>;
+ pmuio-supply = <&vcc_io>;
+};
+
+&pinctrl {
+ pmic {
+ pmic_int_l: pmic-int-l {
+ rockchip,pins = <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+
+ usb2 {
+ usb20_host_drv: usb20-host-drv {
+ rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+
+ usb3 {
+ usb30_host_drv: usb30-host-drv {
+ rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+};
+
+&sdmmc {
+ bus-width = <4>;
+ cap-mmc-highspeed;
+ cap-sd-highspeed;
+ disable-wp;
+ max-frequency = <150000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_dectn &sdmmc0_bus4>;
+ vmmc-supply = <&vcc_sd>;
+ status = "okay";
+};
+
+&tsadc {
+ rockchip,hw-tshut-mode = <0>;
+ rockchip,hw-tshut-polarity = <0>;
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&u2phy {
+ status = "okay";
+
+ u2phy_host: host-port {
+ status = "okay";
+ };
+
+ u2phy_otg: otg-port {
+ status = "okay";
+ };
+};
+
+&usb20_otg {
+ dr_mode = "host";
+ status = "okay";
+};
+
+&usb_host0_ehci {
+ status = "okay";
+};
+
+&usb_host0_ohci {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index d48bf5d9f8bd..6d615cb6e64d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -47,6 +47,7 @@
#include <dt-bindings/pinctrl/rockchip.h>
#include <dt-bindings/power/rk3328-power.h>
#include <dt-bindings/soc/rockchip,boot-mode.h>
+#include <dt-bindings/thermal/thermal.h>
/ {
compatible = "rockchip,rk3328";
@@ -76,8 +77,11 @@
compatible = "arm,cortex-a53", "arm,armv8";
reg = <0x0 0x0>;
clocks = <&cru ARMCLK>;
+ #cooling-cells = <2>;
+ dynamic-power-coefficient = <120>;
enable-method = "psci";
next-level-cache = <&l2>;
+ operating-points-v2 = <&cpu0_opp_table>;
};
cpu1: cpu@1 {
@@ -85,8 +89,10 @@
compatible = "arm,cortex-a53", "arm,armv8";
reg = <0x0 0x1>;
clocks = <&cru ARMCLK>;
+ dynamic-power-coefficient = <120>;
enable-method = "psci";
next-level-cache = <&l2>;
+ operating-points-v2 = <&cpu0_opp_table>;
};
cpu2: cpu@2 {
@@ -94,8 +100,10 @@
compatible = "arm,cortex-a53", "arm,armv8";
reg = <0x0 0x2>;
clocks = <&cru ARMCLK>;
+ dynamic-power-coefficient = <120>;
enable-method = "psci";
next-level-cache = <&l2>;
+ operating-points-v2 = <&cpu0_opp_table>;
};
cpu3: cpu@3 {
@@ -103,8 +111,10 @@
compatible = "arm,cortex-a53", "arm,armv8";
reg = <0x0 0x3>;
clocks = <&cru ARMCLK>;
+ dynamic-power-coefficient = <120>;
enable-method = "psci";
next-level-cache = <&l2>;
+ operating-points-v2 = <&cpu0_opp_table>;
};
l2: l2-cache0 {
@@ -112,6 +122,43 @@
};
};
+ cpu0_opp_table: opp_table0 {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-408000000 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <950000>;
+ clock-latency-ns = <40000>;
+ opp-suspend;
+ };
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <950000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-816000000 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1000000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-1008000000 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <1100000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-1200000000 {
+ opp-hz = /bits/ 64 <1200000000>;
+ opp-microvolt = <1225000>;
+ clock-latency-ns = <40000>;
+ };
+ opp-1296000000 {
+ opp-hz = /bits/ 64 <1296000000>;
+ opp-microvolt = <1300000>;
+ clock-latency-ns = <40000>;
+ };
+ };
+
amba {
compatible = "simple-bus";
#address-cells = <2>;
@@ -158,12 +205,84 @@
clock-output-names = "xin24m";
};
+ i2s0: i2s@ff000000 {
+ compatible = "rockchip,rk3328-i2s", "rockchip,rk3066-i2s";
+ reg = <0x0 0xff000000 0x0 0x1000>;
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_I2S0>, <&cru HCLK_I2S0_8CH>;
+ clock-names = "i2s_clk", "i2s_hclk";
+ dmas = <&dmac 11>, <&dmac 12>;
+ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+ i2s1: i2s@ff010000 {
+ compatible = "rockchip,rk3328-i2s", "rockchip,rk3066-i2s";
+ reg = <0x0 0xff010000 0x0 0x1000>;
+ interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_I2S1>, <&cru HCLK_I2S1_8CH>;
+ clock-names = "i2s_clk", "i2s_hclk";
+ dmas = <&dmac 14>, <&dmac 15>;
+ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+ i2s2: i2s@ff020000 {
+ compatible = "rockchip,rk3328-i2s", "rockchip,rk3066-i2s";
+ reg = <0x0 0xff020000 0x0 0x1000>;
+ interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_I2S2>, <&cru HCLK_I2S2_2CH>;
+ clock-names = "i2s_clk", "i2s_hclk";
+ dmas = <&dmac 0>, <&dmac 1>;
+ dma-names = "tx", "rx";
+ status = "disabled";
+ };
+
+ spdif: spdif@ff030000 {
+ compatible = "rockchip,rk3328-spdif";
+ reg = <0x0 0xff030000 0x0 0x1000>;
+ interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_SPDIF>, <&cru HCLK_SPDIF_8CH>;
+ clock-names = "mclk", "hclk";
+ dmas = <&dmac 10>;
+ dma-names = "tx";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spdifm2_tx>;
+ status = "disabled";
+ };
+
+ pdm: pdm@ff040000 {
+ compatible = "rockchip,pdm";
+ reg = <0x0 0xff040000 0x0 0x1000>;
+ clocks = <&cru SCLK_PDM>, <&cru HCLK_PDM>;
+ clock-names = "pdm_clk", "pdm_hclk";
+ dmas = <&dmac 16>;
+ dma-names = "rx";
+ pinctrl-names = "default", "sleep";
+ pinctrl-0 = <&pdmm0_clk
+ &pdmm0_sdi0
+ &pdmm0_sdi1
+ &pdmm0_sdi2
+ &pdmm0_sdi3>;
+ pinctrl-1 = <&pdmm0_clk_sleep
+ &pdmm0_sdi0_sleep
+ &pdmm0_sdi1_sleep
+ &pdmm0_sdi2_sleep
+ &pdmm0_sdi3_sleep>;
+ status = "disabled";
+ };
+
grf: syscon@ff100000 {
compatible = "rockchip,rk3328-grf", "syscon", "simple-mfd";
reg = <0x0 0xff100000 0x0 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
+ io_domains: io-domains {
+ compatible = "rockchip,rk3328-io-voltage-domain";
+ status = "disabled";
+ };
+
power: power-controller {
compatible = "rockchip,rk3328-power-controller";
#power-domain-cells = <1>;
@@ -310,6 +429,108 @@
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
};
+ pwm0: pwm@ff1b0000 {
+ compatible = "rockchip,rk3328-pwm";
+ reg = <0x0 0xff1b0000 0x0 0x10>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm0_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm1: pwm@ff1b0010 {
+ compatible = "rockchip,rk3328-pwm";
+ reg = <0x0 0xff1b0010 0x0 0x10>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm1_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm2: pwm@ff1b0020 {
+ compatible = "rockchip,rk3328-pwm";
+ reg = <0x0 0xff1b0020 0x0 0x10>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm2_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ pwm3: pwm@ff1b0030 {
+ compatible = "rockchip,rk3328-pwm";
+ reg = <0x0 0xff1b0030 0x0 0x10>;
+ interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_PWM>, <&cru PCLK_PWM>;
+ clock-names = "pwm", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwmir_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
+ thermal-zones {
+ soc_thermal: soc-thermal {
+ polling-delay-passive = <20>;
+ polling-delay = <1000>;
+ sustainable-power = <1000>;
+
+ thermal-sensors = <&tsadc 0>;
+
+ trips {
+ threshold: trip-point0 {
+ temperature = <70000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ target: trip-point1 {
+ temperature = <85000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+ soc_crit: soc-crit {
+ temperature = <95000>;
+ hysteresis = <2000>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&target>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ contribution = <4096>;
+ };
+ };
+ };
+
+ };
+
+ tsadc: tsadc@ff250000 {
+ compatible = "rockchip,rk3328-tsadc";
+ reg = <0x0 0xff250000 0x0 0x100>;
+ interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH 0>;
+ assigned-clocks = <&cru SCLK_TSADC>;
+ assigned-clock-rates = <50000>;
+ clocks = <&cru SCLK_TSADC>, <&cru PCLK_TSADC>;
+ clock-names = "tsadc", "apb_pclk";
+ pinctrl-names = "init", "default", "sleep";
+ pinctrl-0 = <&otp_gpio>;
+ pinctrl-1 = <&otp_out>;
+ pinctrl-2 = <&otp_gpio>;
+ resets = <&cru SRST_TSADC>;
+ reset-names = "tsadc-apb";
+ rockchip,grf = <&grf>;
+ rockchip,hw-tshut-temp = <100000>;
+ #thermal-sensor-cells = <1>;
+ status = "disabled";
+ };
+
saradc: adc@ff280000 {
compatible = "rockchip,rk3328-saradc", "rockchip,rk3399-saradc";
reg = <0x0 0xff280000 0x0 0x100>;
@@ -322,6 +543,51 @@
status = "disabled";
};
+ h265e_mmu: iommu@ff330200 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff330200 0 0x100>;
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "h265e_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vepu_mmu: iommu@ff340800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff340800 0x0 0x40>;
+ interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vepu_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vpu_mmu: iommu@ff350800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff350800 0x0 0x40>;
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vpu_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ rkvdec_mmu: iommu@ff360480 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff360480 0x0 0x40>, <0x0 0xff3604c0 0x0 0x40>;
+ interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "rkvdec_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vop_mmu: iommu@ff373f00 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff373f00 0x0 0x100>;
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "vop_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
cru: clock-controller@ff440000 {
compatible = "rockchip,rk3328-cru", "rockchip,cru", "syscon";
reg = <0x0 0xff440000 0x0 0x1000>;
@@ -374,6 +640,43 @@
<32768>;
};
+ usb2phy_grf: syscon@ff450000 {
+ compatible = "rockchip,rk3328-usb2phy-grf", "syscon",
+ "simple-mfd";
+ reg = <0x0 0xff450000 0x0 0x10000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ u2phy: usb2-phy@100 {
+ compatible = "rockchip,rk3328-usb2phy";
+ reg = <0x100 0x10>;
+ clocks = <&xin24m>;
+ clock-names = "phyclk";
+ clock-output-names = "usb480m_phy";
+ #clock-cells = <0>;
+ assigned-clocks = <&cru USB480M>;
+ assigned-clock-parents = <&u2phy>;
+ status = "disabled";
+
+ u2phy_otg: otg-port {
+ #phy-cells = <0>;
+ interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "otg-bvalid", "otg-id",
+ "linestate";
+ status = "disabled";
+ };
+
+ u2phy_host: host-port {
+ #phy-cells = <0>;
+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "linestate";
+ status = "disabled";
+ };
+ };
+ };
+
sdmmc: dwmmc@ff500000 {
compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x0 0xff500000 0x0 0x4000>;
@@ -463,6 +766,45 @@
};
};
+ usb20_otg: usb@ff580000 {
+ compatible = "rockchip,rk3328-usb", "rockchip,rk3066-usb",
+ "snps,dwc2";
+ reg = <0x0 0xff580000 0x0 0x40000>;
+ interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_OTG>;
+ clock-names = "otg";
+ dr_mode = "otg";
+ g-np-tx-fifo-size = <16>;
+ g-rx-fifo-size = <280>;
+ g-tx-fifo-size = <256 128 128 64 32 16>;
+ g-use-dma;
+ phys = <&u2phy_otg>;
+ phy-names = "usb2-phy";
+ status = "disabled";
+ };
+
+ usb_host0_ehci: usb@ff5c0000 {
+ compatible = "generic-ehci";
+ reg = <0x0 0xff5c0000 0x0 0x10000>;
+ interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_HOST0>, <&u2phy>;
+ clock-names = "usbhost", "utmi";
+ phys = <&u2phy_host>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
+ usb_host0_ohci: usb@ff5d0000 {
+ compatible = "generic-ohci";
+ reg = <0x0 0xff5d0000 0x0 0x10000>;
+ interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru HCLK_HOST0>, <&u2phy>;
+ clock-names = "usbhost", "utmi";
+ phys = <&u2phy_host>;
+ phy-names = "usb";
+ status = "disabled";
+ };
+
gic: interrupt-controller@ff811000 {
compatible = "arm,gic-400";
#interrupt-cells = <3>;
@@ -649,6 +991,62 @@
};
};
+ pdm-0 {
+ pdmm0_clk: pdmm0-clk {
+ rockchip,pins = <2 RK_PC2 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_fsync: pdmm0-fsync {
+ rockchip,pins = <2 RK_PC7 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_sdi0: pdmm0-sdi0 {
+ rockchip,pins = <2 RK_PC3 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_sdi1: pdmm0-sdi1 {
+ rockchip,pins = <2 RK_PC4 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_sdi2: pdmm0-sdi2 {
+ rockchip,pins = <2 RK_PC5 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_sdi3: pdmm0-sdi3 {
+ rockchip,pins = <2 RK_PC6 2 &pcfg_pull_none>;
+ };
+
+ pdmm0_clk_sleep: pdmm0-clk-sleep {
+ rockchip,pins =
+ <2 RK_PC2 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+
+ pdmm0_sdi0_sleep: pdmm0-sdi0-sleep {
+ rockchip,pins =
+ <2 RK_PC3 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+
+ pdmm0_sdi1_sleep: pdmm0-sdi1-sleep {
+ rockchip,pins =
+ <2 RK_PC4 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+
+ pdmm0_sdi2_sleep: pdmm0-sdi2-sleep {
+ rockchip,pins =
+ <2 RK_PC5 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+
+ pdmm0_sdi3_sleep: pdmm0-sdi3-sleep {
+ rockchip,pins =
+ <2 RK_PC6 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+
+ pdmm0_fsync_sleep: pdmm0-fsync-sleep {
+ rockchip,pins =
+ <2 RK_PC7 RK_FUNC_GPIO &pcfg_input_high>;
+ };
+ };
+
tsadc {
otp_gpio: otp-gpio {
rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi
index 4772917c5f7e..a37220a9387c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi
@@ -156,7 +156,6 @@
disable-wp;
mmc-pwrseq = <&emmc_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
status = "okay";
diff --git a/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts b/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts
index e631d424f08e..5e4d3a7015f5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts
@@ -117,7 +117,6 @@
clock-frequency = <150000000>;
disable-wp;
non-removable;
- num-slots = <1>;
vmmc-supply = <&vcc_io>;
vqmmc-supply = <&vcc18_flash>;
pinctrl-names = "default";
diff --git a/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts b/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts
index fac116acc12f..d3f6c8e0d206 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts
@@ -203,7 +203,6 @@
mmc-hs200-1_2v;
mmc-hs200-1_8v;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
status = "okay";
@@ -347,7 +346,6 @@
max-frequency = <50000000>;
cap-sd-highspeed;
card-detect-delay = <200>;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
vmmc-supply = <&vcc_sd>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts b/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts
index ff48edd8e348..13a9e22f5d2d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts
@@ -86,12 +86,10 @@
cap-mmc-highspeed;
clock-frequency = <150000000>;
disable-wp;
- keep-power-in-suspend;
mmc-hs200-1_8v;
no-sdio;
no-sd;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_bus8>;
vmmc-supply = <&vcc_io>;
@@ -281,7 +279,6 @@
card-detect-delay = <200>;
no-emmc;
no-sdio;
- num-slots = <1>;
sd-uhs-sdr12;
sd-uhs-sdr25;
pinctrl-names = "default";
diff --git a/arch/arm64/boot/dts/rockchip/rk3368-r88.dts b/arch/arm64/boot/dts/rockchip/rk3368-r88.dts
index 7134181f1dc2..b3510d56517a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368-r88.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3368-r88.dts
@@ -189,7 +189,6 @@
disable-wp;
mmc-pwrseq = <&emmc_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
status = "okay";
@@ -254,7 +253,6 @@
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
- num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_clk &sdio0_cmd &sdio0_bus4>;
vmmc-supply = <&vcc_io>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/arch/arm64/boot/dts/rockchip/rk3368.dtsi
index 6d5dc0587e59..19fbaa5e7bdd 100644
--- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi
@@ -700,6 +700,19 @@
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
};
+ spdif: spdif@ff880000 {
+ compatible = "rockchip,rk3368-spdif";
+ reg = <0x0 0xff880000 0x0 0x1000>;
+ interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cru SCLK_SPDIF_8CH>, <&cru HCLK_SPDIF>;
+ clock-names = "mclk", "hclk";
+ dmas = <&dmac_bus 3>;
+ dma-names = "tx";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spdif_tx>;
+ status = "disabled";
+ };
+
i2s_2ch: i2s-2ch@ff890000 {
compatible = "rockchip,rk3368-i2s", "rockchip,rk3066-i2s";
reg = <0x0 0xff890000 0x0 0x1000>;
@@ -724,6 +737,55 @@
status = "disabled";
};
+ iep_mmu: iommu@ff900800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff900800 0x0 0x100>;
+ interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "iep_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ isp_mmu: iommu@ff914000 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff914000 0x0 0x100>,
+ <0x0 0xff915000 0x0 0x100>;
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "isp_mmu";
+ #iommu-cells = <0>;
+ rockchip,disable-mmu-reset;
+ status = "disabled";
+ };
+
+ vop_mmu: iommu@ff930300 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff930300 0x0 0x100>;
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vop_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ hevc_mmu: iommu@ff9a0440 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff9a0440 0x0 0x40>,
+ <0x0 0xff9a0480 0x0 0x40>;
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "hevc_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vpu_mmu: iommu@ff9a0800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff9a0800 0x0 0x100>;
+ interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "vepu_mmu", "vdpu_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
gic: interrupt-controller@ffb71000 {
compatible = "arm,gic-400";
interrupt-controller;
@@ -1024,6 +1086,12 @@
};
};
+ spdif {
+ spdif_tx: spdif-tx {
+ rockchip,pins = <2 RK_PC7 RK_FUNC_1 &pcfg_pull_none>;
+ };
+ };
+
spi0 {
spi0_clk: spi0-clk {
rockchip,pins = <1 29 RK_FUNC_2 &pcfg_pull_up>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb.dts
index 42033bcc614c..56533c344ef2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb.dts
@@ -199,7 +199,7 @@
ep-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>;
num-lanes = <4>;
pinctrl-names = "default";
- pinctrl-0 = <&pcie_clkreqn>;
+ pinctrl-0 = <&pcie_clkreqn_cpm>;
status = "disabled";
};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts b/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts
index ba1d9810ad1e..7fd4bfcaa38e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts
@@ -43,6 +43,7 @@
/dts-v1/;
#include <dt-bindings/pwm/pwm.h>
#include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
/ {
model = "Firefly-RK3399 Board";
@@ -550,7 +551,7 @@
ep-gpios = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>;
num-lanes = <4>;
pinctrl-names = "default";
- pinctrl-0 = <&pcie_clkreqn>;
+ pinctrl-0 = <&pcie_clkreqn_cpm>;
status = "okay";
};
@@ -630,9 +631,20 @@
status = "okay";
};
+&sdmmc {
+ bus-width = <4>;
+ cap-mmc-highspeed;
+ cap-sd-highspeed;
+ cd-gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
+ disable-wp;
+ max-frequency = <150000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>;
+ status = "okay";
+};
+
&sdhci {
bus-width = <8>;
- keep-power-in-suspend;
mmc-hs400-1_8v;
mmc-hs400-enhanced-strobe;
non-removable;
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts b/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts
index 7bd31066399b..a3d3cea7dc4f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts
@@ -264,6 +264,50 @@ ap_i2c_dig: &i2c2 {
};
};
+&ppvar_bigcpu_pwm {
+ regulator-min-microvolt = <798674>;
+ regulator-max-microvolt = <1302172>;
+};
+
+&ppvar_bigcpu {
+ regulator-min-microvolt = <798674>;
+ regulator-max-microvolt = <1302172>;
+ ctrl-voltage-range = <798674 1302172>;
+};
+
+&ppvar_litcpu_pwm {
+ regulator-min-microvolt = <799065>;
+ regulator-max-microvolt = <1303738>;
+};
+
+&ppvar_litcpu {
+ regulator-min-microvolt = <799065>;
+ regulator-max-microvolt = <1303738>;
+ ctrl-voltage-range = <799065 1303738>;
+};
+
+&ppvar_gpu_pwm {
+ regulator-min-microvolt = <785782>;
+ regulator-max-microvolt = <1217729>;
+};
+
+&ppvar_gpu {
+ regulator-min-microvolt = <785782>;
+ regulator-max-microvolt = <1217729>;
+ ctrl-voltage-range = <785782 1217729>;
+};
+
+&ppvar_centerlogic_pwm {
+ regulator-min-microvolt = <800069>;
+ regulator-max-microvolt = <1049692>;
+};
+
+&ppvar_centerlogic {
+ regulator-min-microvolt = <800069>;
+ regulator-max-microvolt = <1049692>;
+ ctrl-voltage-range = <800069 1049692>;
+};
+
&saradc {
status = "okay";
vref-supply = <&pp1800_ap_io>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi
index eb5059344023..199a5118b20d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi
@@ -164,14 +164,9 @@
vin-supply = <&ppvar_sys>;
};
- ppvar_bigcpu: ppvar-bigcpu {
+ ppvar_bigcpu_pwm: ppvar-bigcpu-pwm {
compatible = "pwm-regulator";
- regulator-name = "ppvar_bigcpu";
- /*
- * OVP circuit requires special handling which is not yet
- * represented. Keep disabled for now.
- */
- status = "disabled";
+ regulator-name = "ppvar_bigcpu_pwm";
pwms = <&pwm1 0 3337 0>;
pwm-supply = <&ppvar_sys>;
@@ -181,18 +176,28 @@
/* EC turns on w/ ap_core_en; always on for AP */
regulator-always-on;
regulator-boot-on;
- regulator-min-microvolt = <798674>;
- regulator-max-microvolt = <1302172>;
+ regulator-min-microvolt = <800107>;
+ regulator-max-microvolt = <1302232>;
};
- ppvar_litcpu: ppvar-litcpu {
+ ppvar_bigcpu: ppvar-bigcpu {
+ compatible = "vctrl-regulator";
+ regulator-name = "ppvar_bigcpu";
+
+ regulator-min-microvolt = <800107>;
+ regulator-max-microvolt = <1302232>;
+
+ ctrl-supply = <&ppvar_bigcpu_pwm>;
+ ctrl-voltage-range = <800107 1302232>;
+
+ regulator-settling-time-up-us = <322>;
+ min-slew-down-rate = <225>;
+ ovp-threshold-percent = <16>;
+ };
+
+ ppvar_litcpu_pwm: ppvar-litcpu-pwm {
compatible = "pwm-regulator";
- regulator-name = "ppvar_litcpu";
- /*
- * OVP circuit requires special handling which is not yet
- * represented. Keep disabled for now.
- */
- status = "disabled";
+ regulator-name = "ppvar_litcpu_pwm";
pwms = <&pwm2 0 3337 0>;
pwm-supply = <&ppvar_sys>;
@@ -202,18 +207,28 @@
/* EC turns on w/ ap_core_en; always on for AP */
regulator-always-on;
regulator-boot-on;
- regulator-min-microvolt = <799065>;
- regulator-max-microvolt = <1303738>;
+ regulator-min-microvolt = <797743>;
+ regulator-max-microvolt = <1307837>;
};
- ppvar_gpu: ppvar-gpu {
+ ppvar_litcpu: ppvar-litcpu {
+ compatible = "vctrl-regulator";
+ regulator-name = "ppvar_litcpu";
+
+ regulator-min-microvolt = <797743>;
+ regulator-max-microvolt = <1307837>;
+
+ ctrl-supply = <&ppvar_litcpu_pwm>;
+ ctrl-voltage-range = <797743 1307837>;
+
+ regulator-settling-time-up-us = <384>;
+ min-slew-down-rate = <225>;
+ ovp-threshold-percent = <16>;
+ };
+
+ ppvar_gpu_pwm: ppvar-gpu-pwm {
compatible = "pwm-regulator";
- regulator-name = "ppvar_gpu";
- /*
- * OVP circuit requires special handling which is not yet
- * represented. Keep disabled for now.
- */
- status = "disabled";
+ regulator-name = "ppvar_gpu_pwm";
pwms = <&pwm0 0 3337 0>;
pwm-supply = <&ppvar_sys>;
@@ -223,18 +238,28 @@
/* EC turns on w/ ap_core_en; always on for AP */
regulator-always-on;
regulator-boot-on;
- regulator-min-microvolt = <785782>;
- regulator-max-microvolt = <1217729>;
+ regulator-min-microvolt = <786384>;
+ regulator-max-microvolt = <1217747>;
};
- ppvar_centerlogic: ppvar-centerlogic {
+ ppvar_gpu: ppvar-gpu {
+ compatible = "vctrl-regulator";
+ regulator-name = "ppvar_gpu";
+
+ regulator-min-microvolt = <786384>;
+ regulator-max-microvolt = <1217747>;
+
+ ctrl-supply = <&ppvar_gpu_pwm>;
+ ctrl-voltage-range = <786384 1217747>;
+
+ regulator-settling-time-up-us = <390>;
+ min-slew-down-rate = <225>;
+ ovp-threshold-percent = <16>;
+ };
+
+ ppvar_centerlogic_pwm: ppvar-centerlogic-pwm {
compatible = "pwm-regulator";
- regulator-name = "ppvar_centerlogic";
- /*
- * OVP circuit requires special handling which is not yet
- * represented. Keep disabled for now.
- */
- status = "disabled";
+ regulator-name = "ppvar_centerlogic_pwm";
pwms = <&pwm3 0 3337 0>;
pwm-supply = <&ppvar_sys>;
@@ -244,8 +269,23 @@
/* EC turns on w/ ppvar_centerlogic_en; always on for AP */
regulator-always-on;
regulator-boot-on;
- regulator-min-microvolt = <800069>;
- regulator-max-microvolt = <1049692>;
+ regulator-min-microvolt = <799434>;
+ regulator-max-microvolt = <1049925>;
+ };
+
+ ppvar_centerlogic: ppvar-centerlogic {
+ compatible = "vctrl-regulator";
+ regulator-name = "ppvar_centerlogic";
+
+ regulator-min-microvolt = <799434>;
+ regulator-max-microvolt = <1049925>;
+
+ ctrl-supply = <&ppvar_centerlogic_pwm>;
+ ctrl-voltage-range = <799434 1049925>;
+
+ regulator-settling-time-up-us = <378>;
+ min-slew-down-rate = <225>;
+ ovp-threshold-percent = <16>;
};
/* Schematics call this PPVAR even though it's fixed */
@@ -555,6 +595,11 @@
status = "okay";
};
+&gpu {
+ mali-supply = <&ppvar_gpu>;
+ status = "okay";
+};
+
ap_i2c_mic: &i2c1 {
status = "okay";
@@ -567,12 +612,7 @@ ap_i2c_mic: &i2c1 {
headsetcodec: rt5514@57 {
compatible = "realtek,rt5514";
reg = <0x57>;
- interrupt-parent = <&gpio1>;
- interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
- pinctrl-names = "default";
- pinctrl-0 = <&mic_int>;
- realtek,dmic-init-delay = <20>;
- wakeup-source;
+ realtek,dmic-init-delay-ms = <20>;
};
};
@@ -781,9 +821,13 @@ ap_i2c_audio: &i2c8 {
wacky_spi_audio: spi2@0 {
compatible = "realtek,rt5514";
reg = <0>;
-
+ interrupt-parent = <&gpio1>;
+ interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&mic_int>;
/* May run faster once verified. */
spi-max-frequency = <10000000>;
+ wakeup-source;
};
};
@@ -1031,7 +1075,7 @@ ap_i2c_audio: &i2c8 {
* hurt and dw_mmc will ignore it. We make sure to disable
* the pull though so we don't burn needless power.
*/
- sdmmc_cd: sdmcc-cd {
+ sdmmc_cd: sdmmc-cd {
rockchip,pins =
<0 7 RK_FUNC_1 &pcfg_pull_none>;
};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-op1-opp.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-op1-opp.dtsi
index be7fe635f7c1..d8a120f945c8 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-op1-opp.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-op1-opp.dtsi
@@ -118,6 +118,35 @@
opp-microvolt = <1250000>;
};
};
+
+ gpu_opp_table: opp-table2 {
+ compatible = "operating-points-v2";
+
+ opp00 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <800000>;
+ };
+ opp01 {
+ opp-hz = /bits/ 64 <297000000>;
+ opp-microvolt = <800000>;
+ };
+ opp02 {
+ opp-hz = /bits/ 64 <400000000>;
+ opp-microvolt = <825000>;
+ };
+ opp03 {
+ opp-hz = /bits/ 64 <500000000>;
+ opp-microvolt = <850000>;
+ };
+ opp04 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <925000>;
+ };
+ opp05 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <1075000>;
+ };
+ };
};
&cpu_l0 {
@@ -143,3 +172,7 @@
&cpu_b1 {
operating-points-v2 = <&cluster1_opp>;
};
+
+&gpu {
+ operating-points-v2 = <&gpu_opp_table>;
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
index c83460db130a..81617bcf2522 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
@@ -110,6 +110,35 @@
opp-microvolt = <1200000>;
};
};
+
+ gpu_opp_table: opp-table2 {
+ compatible = "operating-points-v2";
+
+ opp00 {
+ opp-hz = /bits/ 64 <200000000>;
+ opp-microvolt = <800000>;
+ };
+ opp01 {
+ opp-hz = /bits/ 64 <297000000>;
+ opp-microvolt = <800000>;
+ };
+ opp02 {
+ opp-hz = /bits/ 64 <400000000>;
+ opp-microvolt = <825000>;
+ };
+ opp03 {
+ opp-hz = /bits/ 64 <500000000>;
+ opp-microvolt = <875000>;
+ };
+ opp04 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <925000>;
+ };
+ opp05 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <1100000>;
+ };
+ };
};
&cpu_l0 {
@@ -135,3 +164,7 @@
&cpu_b1 {
operating-points-v2 = <&cluster1_opp>;
};
+
+&gpu {
+ operating-points-v2 = <&gpu_opp_table>;
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts
new file mode 100644
index 000000000000..9a7486058455
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2017 Theobroma Systems Design und Consulting GmbH
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "rk3399-puma.dtsi"
+
+/ {
+ model = "Theobroma Systems RK3399-Q7 SoM";
+ compatible = "tsd,rk3399-puma-haikou", "rockchip,rk3399";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ leds {
+ pinctrl-0 = <&led_pin_module>, <&led_sd_haikou>;
+
+ sd-card-led {
+ label = "sd_card_led";
+ gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;
+ linux,default-trigger = "mmc0";
+ };
+ };
+
+ dc_12v: dc-12v {
+ compatible = "regulator-fixed";
+ regulator-name = "dc_12v";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ };
+
+ vcc3v3_baseboard: vcc3v3-baseboard {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc3v3_baseboard";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&dc_12v>;
+ };
+
+ vcc5v0_otg: vcc5v0-otg-regulator {
+ compatible = "regulator-fixed";
+ enable-active-high;
+ gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&otg_vbus_drv>;
+ regulator-name = "vcc5v0_otg";
+ regulator-always-on;
+ };
+};
+
+&i2c1 {
+ status = "okay";
+ clock-frequency = <400000>;
+};
+
+&i2c2 {
+ status = "okay";
+ clock-frequency = <400000>;
+};
+
+&i2c3 {
+ i2c-scl-rising-time-ns = <450>;
+ i2c-scl-falling-time-ns = <15>;
+ status = "okay";
+};
+
+&i2c4 {
+ status = "okay";
+ clock-frequency = <400000>;
+};
+
+&i2c6 {
+ status = "okay";
+ clock-frequency = <400000>;
+};
+
+&i2s0 {
+ status = "okay";
+ rockchip,playback-channels = <8>;
+ rockchip,capture-channels = <8>;
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+&pcie_phy {
+ status = "okay";
+};
+
+&pcie0 {
+ ep-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
+ num-lanes = <4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pcie_clkreqn_cpm>;
+ status = "okay";
+};
+
+&pinctrl {
+ pinctrl-names = "default";
+ pinctrl-0 = <&haikou_pin_hog>;
+
+ hog {
+ haikou_pin_hog: haikou-pin-hog {
+ rockchip,pins =
+ /* LID_BTN */
+ <RK_GPIO0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>,
+ /* BATLOW# */
+ <RK_GPIO0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>,
+ /* SLP_BTN# */
+ <RK_GPIO0 RK_PB3 RK_FUNC_GPIO &pcfg_pull_up>,
+ /* BIOS_DISABLE# */
+ <RK_GPIO0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+
+ leds {
+ led_sd_haikou: led-sd-gpio {
+ rockchip,pins =
+ <RK_GPIO1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+
+ usb2 {
+ otg_vbus_drv: otg-vbus-drv {
+ rockchip,pins =
+ <RK_GPIO0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+};
+
+&pwm0 {
+ status = "okay";
+};
+
+&sdmmc {
+ bus-width = <4>;
+ cap-mmc-highspeed;
+ cap-sd-highspeed;
+ cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
+ disable-wp;
+ max-frequency = <150000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
+ vmmc-supply = <&vcc3v3_baseboard>;
+ status = "okay";
+};
+
+&spi5 {
+ status = "okay";
+};
+
+&u2phy0 {
+ status = "okay";
+};
+
+&usbdrd3_0 {
+ status = "okay";
+};
+
+&usbdrd_dwc3_0 {
+ dr_mode = "otg";
+ status = "okay";
+};
+
+&u2phy0_host {
+ phy-supply = <&vcc5v0_otg>;
+ status = "okay";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&usb_host0_ehci {
+ status = "okay";
+};
+
+&usb_host0_ohci {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
new file mode 100644
index 000000000000..53ff3d191a1d
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
@@ -0,0 +1,547 @@
+/*
+ * Copyright (c) 2017 Theobroma Systems Design und Consulting GmbH
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <dt-bindings/pwm/pwm.h>
+#include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
+
+/ {
+ leds {
+ compatible = "gpio-leds";
+ pinctrl-names = "default";
+ pinctrl-0 = <&led_pin_module>;
+
+ module-led {
+ label = "module_led";
+ gpios = <&gpio2 RK_PD1 GPIO_ACTIVE_HIGH>;
+ linux,default-trigger = "heartbeat";
+ panic-indicator;
+ };
+ };
+
+ /*
+ * Overwrite the opp-table for CPUB as this board uses a different
+ * regulator (FAN53555) that only allows 10mV steps and therefore
+ * can't reach the operation point target voltages from rk3399-opp.dtsi
+ */
+ /delete-node/ opp-table1;
+ cluster1_opp: opp-table1 {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp00 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <800000>;
+ clock-latency-ns = <40000>;
+ };
+ opp01 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <800000>;
+ };
+ opp02 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <830000>;
+ opp-suspend;
+ };
+ opp03 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <880000>;
+ };
+ opp04 {
+ opp-hz = /bits/ 64 <1200000000>;
+ opp-microvolt = <950000>;
+ };
+ opp05 {
+ opp-hz = /bits/ 64 <1416000000>;
+ opp-microvolt = <1030000>;
+ };
+ opp06 {
+ opp-hz = /bits/ 64 <1608000000>;
+ opp-microvolt = <1100000>;
+ };
+ opp07 {
+ opp-hz = /bits/ 64 <1800000000>;
+ opp-microvolt = <1200000>;
+ };
+ opp08 {
+ opp-hz = /bits/ 64 <1992000000>;
+ opp-microvolt = <1230000>;
+ turbo-mode;
+ };
+ };
+
+ clkin_gmac: external-gmac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <125000000>;
+ clock-output-names = "clkin_gmac";
+ #clock-cells = <0>;
+ };
+
+ vcc1v2_phy: vcc1v2-phy {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc1v2_phy";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ vin-supply = <&vcc5v0_sys>;
+ };
+
+ vcc3v3_sys: vcc3v3-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc3v3_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vcc5v0_sys>;
+ };
+
+ vcc5v0_host: vcc5v0-host-regulator {
+ compatible = "regulator-fixed";
+ gpio = <&gpio4 RK_PA3 GPIO_ACTIVE_HIGH>;
+ enable-active-low;
+ pinctrl-names = "default";
+ pinctrl-0 = <&vcc5v0_host_en>;
+ regulator-name = "vcc5v0_host";
+ regulator-always-on;
+ vin-supply = <&vcc5v0_sys>;
+ };
+
+ vcc5v0_sys: vcc5v0-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc5v0_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ };
+
+ vdd_log: vdd-log {
+ compatible = "pwm-regulator";
+ pwms = <&pwm2 0 25000 0>;
+ regulator-name = "vdd_log";
+ regulator-min-microvolt = <800000>;
+ regulator-max-microvolt = <1400000>;
+ regulator-always-on;
+ regulator-boot-on;
+ status = "okay";
+ };
+};
+
+&cpu_b0 {
+ cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_b1 {
+ cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_l0 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l1 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l2 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l3 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&emmc_phy {
+ status = "okay";
+};
+
+&gmac {
+ assigned-clocks = <&cru SCLK_RMII_SRC>;
+ assigned-clock-parents = <&clkin_gmac>;
+ clock_in_out = "input";
+ phy-supply = <&vcc1v2_phy>;
+ phy-mode = "rgmii";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rgmii_pins>;
+ snps,reset-gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
+ snps,reset-active-low;
+ snps,reset-delays-us = <0 10000 50000>;
+ tx_delay = <0x10>;
+ rx_delay = <0x10>;
+ status = "okay";
+};
+
+&i2c0 {
+ status = "okay";
+ i2c-scl-rising-time-ns = <168>;
+ i2c-scl-falling-time-ns = <4>;
+ clock-frequency = <400000>;
+
+ rk808: pmic@1b {
+ compatible = "rockchip,rk808";
+ reg = <0x1b>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <22 IRQ_TYPE_LEVEL_LOW>;
+ #clock-cells = <1>;
+ clock-output-names = "xin32k", "rk808-clkout2";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pmic_int_l>;
+ rockchip,system-power-controller;
+ wakeup-source;
+
+ vcc1-supply = <&vcc5v0_sys>;
+ vcc2-supply = <&vcc5v0_sys>;
+ vcc3-supply = <&vcc5v0_sys>;
+ vcc4-supply = <&vcc5v0_sys>;
+ vcc6-supply = <&vcc5v0_sys>;
+ vcc7-supply = <&vcc5v0_sys>;
+ vcc8-supply = <&vcc3v3_sys>;
+ vcc9-supply = <&vcc5v0_sys>;
+ vcc10-supply = <&vcc5v0_sys>;
+ vcc11-supply = <&vcc5v0_sys>;
+ vcc12-supply = <&vcc3v3_sys>;
+ vddio-supply = <&vcc1v8_pmu>;
+
+ regulators {
+ vdd_center: DCDC_REG1 {
+ regulator-name = "vdd_center";
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <6001>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vdd_cpu_l: DCDC_REG2 {
+ regulator-name = "vdd_cpu_l";
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <6001>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_ddr: DCDC_REG3 {
+ regulator-name = "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ };
+ };
+
+ vcc_1v8: DCDC_REG4 {
+ regulator-name = "vcc_1v8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc_ldo1: LDO_REG1 {
+ regulator-name = "vcc_ldo1";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc1v8_hdmi: LDO_REG2 {
+ regulator-name = "vcc1v8_hdmi";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc1v8_pmu: LDO_REG3 {
+ regulator-name = "vcc1v8_pmu";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc_sd: LDO_REG4 {
+ regulator-name = "vcc_sd";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
+ vcc_ldo5: LDO_REG5 {
+ regulator-name = "vcc_ldo5";
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_ldo6: LDO_REG6 {
+ regulator-name = "vcc_ldo6";
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc0v9_hdmi: LDO_REG7 {
+ regulator-name = "vcc0v9_hdmi";
+ regulator-min-microvolt = <900000>;
+ regulator-max-microvolt = <900000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_efuse: LDO_REG8 {
+ regulator-name = "vcc_efuse";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc3v3_s3: SWITCH_REG1 {
+ regulator-name = "vcc3v3_s3";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc3v3_s0: SWITCH_REG2 {
+ regulator-name = "vcc3v3_s0";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+ };
+ };
+
+ vdd_gpu: regulator@60 {
+ compatible = "fcs,fan53555";
+ reg = <0x60>;
+ fcs,suspend-voltage-selector = <1>;
+ regulator-name = "vdd_gpu";
+ regulator-min-microvolt = <600000>;
+ regulator-max-microvolt = <1230000>;
+ regulator-ramp-delay = <1000>;
+ regulator-always-on;
+ regulator-boot-on;
+ vin-supply = <&vcc5v0_sys>;
+ };
+};
+
+&i2c7 {
+ status = "okay";
+ clock-frequency = <400000>;
+
+ fan: fan@18 {
+ compatible = "ti,amc6821";
+ reg = <0x18>;
+ cooling-min-state = <0>;
+ cooling-max-state = <9>;
+ #cooling-cells = <2>;
+ };
+
+ rtc_twi: rtc@6f {
+ compatible = "isil,isl1208";
+ reg = <0x6f>;
+ };
+};
+
+&i2c8 {
+ status = "okay";
+ clock-frequency = <400000>;
+
+ vdd_cpu_b: regulator@60 {
+ compatible = "fcs,fan53555";
+ reg = <0x60>;
+ vin-supply = <&vcc5v0_sys>;
+ regulator-name = "vdd_cpu_b";
+ regulator-min-microvolt = <600000>;
+ regulator-max-microvolt = <1230000>;
+ regulator-ramp-delay = <1000>;
+ fcs,suspend-voltage-selector = <1>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+};
+
+&io_domains {
+ status = "okay";
+ bt656-supply = <&vcc_1v8>;
+ audio-supply = <&vcc_1v8>;
+ sdmmc-supply = <&vcc_sd>;
+ gpio1830-supply = <&vcc_1v8>;
+};
+
+&pmu_io_domains {
+ status = "okay";
+ pmu1830-supply = <&vcc_1v8>;
+};
+
+&pwm2 {
+ status = "okay";
+};
+
+&pinctrl {
+ i2c8 {
+ i2c8_xfer_a: i2c8-xfer {
+ rockchip,pins =
+ <RK_GPIO1 RK_PC4 RK_FUNC_1 &pcfg_pull_up>,
+ <RK_GPIO1 RK_PC5 RK_FUNC_1 &pcfg_pull_up>;
+ };
+ };
+
+ leds {
+ led_pin_module: led-module-gpio {
+ rockchip,pins =
+ <RK_GPIO2 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+
+ pmic {
+ pmic_int_l: pmic-int-l {
+ rockchip,pins =
+ <RK_GPIO1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+
+ usb2 {
+ vcc5v0_host_en: vcc5v0-host-en {
+ rockchip,pins =
+ <RK_GPIO4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+};
+
+&sdhci {
+ bus-width = <8>;
+ mmc-hs400-1_8v;
+ mmc-hs400-enhanced-strobe;
+ non-removable;
+ status = "okay";
+};
+
+&sdmmc {
+ vqmmc = <&vcc_sd>;
+};
+
+&spi1 {
+ status = "okay";
+
+ norflash: flash@0 {
+ compatible = "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <50000000>;
+ };
+};
+
+&u2phy1 {
+ status = "okay";
+
+ u2phy1_otg: otg-port {
+ status = "okay";
+ };
+
+ u2phy1_host: host-port {
+ phy-supply = <&vcc5v0_host>;
+ status = "okay";
+ };
+};
+
+&usbdrd3_1 {
+ status = "okay";
+};
+
+&usbdrd_dwc3_1 {
+ status = "okay";
+ dr_mode = "host";
+};
+
+&usb_host1_ehci {
+ status = "okay";
+};
+
+&usb_host1_ohci {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts
new file mode 100644
index 000000000000..b7bd88fb3ae3
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "rk3399-sapphire.dtsi"
+
+/ {
+ model = "Excavator-RK3399 Board";
+ compatible = "rockchip,rk3399-sapphire-excavator", "rockchip,rk3399";
+
+ adc-keys {
+ compatible = "adc-keys";
+ io-channels = <&saradc 1>;
+ io-channel-names = "buttons";
+ keyup-threshold-microvolt = <1800000>;
+ poll-interval = <100>;
+
+ button-up {
+ label = "Volume Up";
+ linux,code = <KEY_VOLUMEUP>;
+ press-threshold-microvolt = <100000>;
+ };
+
+ button-down {
+ label = "Volume Down";
+ linux,code = <KEY_VOLUMEDOWN>;
+ press-threshold-microvolt = <300000>;
+ };
+
+ back {
+ label = "Back";
+ linux,code = <KEY_BACK>;
+ press-threshold-microvolt = <985000>;
+ };
+
+ menu {
+ label = "Menu";
+ linux,code = <KEY_MENU>;
+ press-threshold-microvolt = <1314000>;
+ };
+ };
+
+ edp_panel: edp-panel {
+ compatible ="lg,lp079qx1-sp0v", "simple-panel";
+ backlight = <&backlight>;
+ enable-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&lcd_panel_reset>;
+ power-supply = <&vcc3v3_s0>;
+
+ ports {
+ panel_in_edp: endpoint {
+ remote-endpoint = <&edp_out_panel>;
+ };
+ };
+ };
+
+ keys: gpio-keys {
+ compatible = "gpio-keys";
+ autorepeat;
+
+ power {
+ debounce-interval = <100>;
+ gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>;
+ label = "GPIO Power";
+ linux,code = <KEY_POWER>;
+ linux,input-type = <1>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwr_btn>;
+ wakeup-source;
+ };
+ };
+
+ rt5651-sound {
+ compatible = "simple-audio-card";
+ simple-audio-card,name = "realtek,rt5651-codec";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,mclk-fs = <256>;
+ simple-audio-card,widgets =
+ "Microphone", "Mic Jack",
+ "Headphone", "Headphone Jack";
+ simple-audio-card,routing =
+ "Mic Jack", "MICBIAS1",
+ "IN1P", "Mic Jack",
+ "Headphone Jack", "HPOL",
+ "Headphone Jack", "HPOR";
+ simple-audio-card,cpu {
+ sound-dai = <&i2s0>;
+ };
+ simple-audio-card,codec {
+ sound-dai = <&rt5651>;
+ };
+ };
+
+ sdio_pwrseq: sdio-pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ clocks = <&rk808 1>;
+ clock-names = "ext_clock";
+ pinctrl-names = "default";
+ pinctrl-0 = <&wifi_enable_h>;
+
+ /*
+ * On the module itself this is one of these (depending
+ * on the actual card populated):
+ * - SDIO_RESET_L_WL_REG_ON
+ * - PDN (power down when low)
+ */
+ reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
+ };
+};
+
+&backlight {
+ enable-gpios = <&gpio1 RK_PB5 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
+&edp {
+ status = "okay";
+
+ ports {
+ edp_out: port@1 {
+ reg = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ edp_out_panel: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&panel_in_edp>;
+ };
+ };
+ };
+};
+
+&i2c1 {
+ i2c-scl-rising-time-ns = <300>;
+ i2c-scl-falling-time-ns = <15>;
+ status = "okay";
+
+ rt5651: rt5651@1a {
+ compatible = "rockchip,rt5651";
+ reg = <0x1a>;
+ clocks = <&cru SCLK_I2S_8CH_OUT>;
+ clock-names = "mclk";
+ hp-det-gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>;
+ spk-con-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+ #sound-dai-cells = <0>;
+ };
+};
+
+&i2c4 {
+ i2c-scl-rising-time-ns = <600>;
+ i2c-scl-falling-time-ns = <20>;
+ status = "okay";
+
+ accelerometer@68 {
+ compatible = "invensense,mpu6500";
+ reg = <0x68>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <RK_PC6 IRQ_TYPE_EDGE_RISING>;
+ };
+};
+
+&i2s0 {
+ rockchip,playback-channels = <8>;
+ rockchip,capture-channels = <8>;
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+&i2s2 {
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+&pinctrl {
+ buttons {
+ pwr_btn: pwr-btn {
+ rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+
+ sdio-pwrseq {
+ wifi_enable_h: wifi-enable-h {
+ rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+
+ lcd-panel {
+ lcd_panel_reset: lcd-panel-reset {
+ rockchip,pins = <4 RK_PD6 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+ };
+};
+
+&spdif {
+ i2c-scl-rising-time-ns = <450>;
+ i2c-scl-falling-time-ns = <15>;
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
new file mode 100644
index 000000000000..6c30bb02210d
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
@@ -0,0 +1,644 @@
+/*
+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "dt-bindings/pwm/pwm.h"
+#include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
+
+/ {
+ compatible = "rockchip,rk3399-sapphire", "rockchip,rk3399";
+
+ backlight: backlight {
+ compatible = "pwm-backlight";
+ brightness-levels = <
+ 0 1 2 3 4 5 6 7
+ 8 9 10 11 12 13 14 15
+ 16 17 18 19 20 21 22 23
+ 24 25 26 27 28 29 30 31
+ 32 33 34 35 36 37 38 39
+ 40 41 42 43 44 45 46 47
+ 48 49 50 51 52 53 54 55
+ 56 57 58 59 60 61 62 63
+ 64 65 66 67 68 69 70 71
+ 72 73 74 75 76 77 78 79
+ 80 81 82 83 84 85 86 87
+ 88 89 90 91 92 93 94 95
+ 96 97 98 99 100 101 102 103
+ 104 105 106 107 108 109 110 111
+ 112 113 114 115 116 117 118 119
+ 120 121 122 123 124 125 126 127
+ 128 129 130 131 132 133 134 135
+ 136 137 138 139 140 141 142 143
+ 144 145 146 147 148 149 150 151
+ 152 153 154 155 156 157 158 159
+ 160 161 162 163 164 165 166 167
+ 168 169 170 171 172 173 174 175
+ 176 177 178 179 180 181 182 183
+ 184 185 186 187 188 189 190 191
+ 192 193 194 195 196 197 198 199
+ 200 201 202 203 204 205 206 207
+ 208 209 210 211 212 213 214 215
+ 216 217 218 219 220 221 222 223
+ 224 225 226 227 228 229 230 231
+ 232 233 234 235 236 237 238 239
+ 240 241 242 243 244 245 246 247
+ 248 249 250 251 252 253 254 255>;
+ default-brightness-level = <200>;
+ pwms = <&pwm0 0 25000 0>;
+ };
+
+ clkin_gmac: external-gmac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <125000000>;
+ clock-output-names = "clkin_gmac";
+ #clock-cells = <0>;
+ };
+
+ dc_12v: dc-12v {
+ compatible = "regulator-fixed";
+ regulator-name = "dc_12v";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ };
+
+ /* switched by pmic_sleep */
+ vcc1v8_s3: vcca1v8_s3: vcc1v8-s3 {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc1v8_s3";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ vin-supply = <&vcc_1v8>;
+ };
+
+ vcc3v3_sys: vcc3v3-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc3v3_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ vin-supply = <&vcc_sys>;
+ };
+
+ vcc_sys: vcc-sys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_sys";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ vin-supply = <&dc_12v>;
+ };
+
+ vcc5v0_host: vcc5v0-host-regulator {
+ compatible = "regulator-fixed";
+ enable-active-high;
+ gpio = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&vcc5v0_host_en>;
+ regulator-name = "vcc5v0_host";
+ regulator-always-on;
+ vin-supply = <&vcc_sys>;
+ };
+};
+
+&cpu_l0 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l1 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l2 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l3 {
+ cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_b0 {
+ cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_b1 {
+ cpu-supply = <&vdd_cpu_b>;
+};
+
+&emmc_phy {
+ status = "okay";
+};
+
+&gmac {
+ assigned-clocks = <&cru SCLK_RMII_SRC>;
+ assigned-clock-parents = <&clkin_gmac>;
+ clock_in_out = "input";
+ phy-supply = <&vcc_lan>;
+ phy-mode = "rgmii";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rgmii_pins>;
+ snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
+ snps,reset-active-low;
+ snps,reset-delays-us = <0 10000 50000>;
+ tx_delay = <0x28>;
+ rx_delay = <0x11>;
+ status = "okay";
+};
+
+&gpu {
+ mali-supply = <&vdd_gpu>;
+ status = "okay";
+};
+
+&hdmi {
+ ddc-i2c-bus = <&i2c3>;
+ status = "okay";
+};
+
+&i2c0 {
+ clock-frequency = <400000>;
+ i2c-scl-rising-time-ns = <168>;
+ i2c-scl-falling-time-ns = <4>;
+ status = "okay";
+
+ rk808: pmic@1b {
+ compatible = "rockchip,rk808";
+ reg = <0x1b>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <21 IRQ_TYPE_LEVEL_LOW>;
+ #clock-cells = <1>;
+ clock-output-names = "xin32k", "rk808-clkout2";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pmic_int_l &pmic_dvs2>;
+ rockchip,system-power-controller;
+ wakeup-source;
+
+ vcc1-supply = <&vcc_sys>;
+ vcc2-supply = <&vcc_sys>;
+ vcc3-supply = <&vcc_sys>;
+ vcc4-supply = <&vcc_sys>;
+ vcc6-supply = <&vcc_sys>;
+ vcc7-supply = <&vcc_sys>;
+ vcc8-supply = <&vcc3v3_sys>;
+ vcc9-supply = <&vcc_sys>;
+ vcc10-supply = <&vcc_sys>;
+ vcc11-supply = <&vcc_sys>;
+ vcc12-supply = <&vcc3v3_sys>;
+ vddio-supply = <&vcc1v8_pmu>;
+
+ regulators {
+ vdd_center: DCDC_REG1 {
+ regulator-name = "vdd_center";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <6001>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vdd_cpu_l: DCDC_REG2 {
+ regulator-name = "vdd_cpu_l";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <6001>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_ddr: DCDC_REG3 {
+ regulator-name = "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ };
+ };
+
+ vcc_1v8: DCDC_REG4 {
+ regulator-name = "vcc_1v8";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc1v8_dvp: LDO_REG1 {
+ regulator-name = "vcc1v8_dvp";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc3v0_tp: LDO_REG2 {
+ regulator-name = "vcc3v0_tp";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc1v8_pmu: LDO_REG3 {
+ regulator-name = "vcc1v8_pmu";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1800000>;
+ };
+ };
+
+ vcc_sdio: LDO_REG4 {
+ regulator-name = "vcc_sdio";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
+ vcca3v0_codec: LDO_REG5 {
+ regulator-name = "vcca3v0_codec";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_1v5: LDO_REG6 {
+ regulator-name = "vcc_1v5";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <1500000>;
+ };
+ };
+
+ vcca1v8_codec: LDO_REG7 {
+ regulator-name = "vcca1v8_codec";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc_3v0: LDO_REG8 {
+ regulator-name = "vcc_3v0";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3000000>;
+ };
+ };
+
+ vcc3v3_s3: vcc_lan: SWITCH_REG1 {
+ regulator-name = "vcc3v3_s3";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vcc3v3_s0: SWITCH_REG2 {
+ regulator-name = "vcc3v3_s0";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+ };
+ };
+
+ vdd_cpu_b: regulator@40 {
+ compatible = "silergy,syr827";
+ reg = <0x40>;
+ fcs,suspend-voltage-selector = <1>;
+ regulator-name = "vdd_cpu_b";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1500000>;
+ regulator-ramp-delay = <1000>;
+ regulator-always-on;
+ regulator-boot-on;
+ vin-supply = <&vcc_sys>;
+
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vdd_gpu: regulator@41 {
+ compatible = "silergy,syr828";
+ reg = <0x41>;
+ fcs,suspend-voltage-selector = <1>;
+ regulator-name = "vdd_gpu";
+ regulator-min-microvolt = <712500>;
+ regulator-max-microvolt = <1500000>;
+ regulator-ramp-delay = <1000>;
+ regulator-always-on;
+ regulator-boot-on;
+ vin-supply = <&vcc_sys>;
+
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
+
+ vdd_log: vdd-log {
+ compatible = "pwm-regulator";
+ pwms = <&pwm2 0 25000 1>;
+ regulator-name = "vdd_log";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <800000>;
+ regulator-max-microvolt = <1400000>;
+ vin-supply = <&vcc_sys>;
+ };
+};
+
+&i2c3 {
+ i2c-scl-rising-time-ns = <450>;
+ i2c-scl-falling-time-ns = <15>;
+ status = "okay";
+};
+
+&io_domains {
+ status = "okay";
+
+ bt656-supply = <&vcc_3v0>;
+ audio-supply = <&vcca1v8_codec>;
+ sdmmc-supply = <&vcc_sdio>;
+ gpio1830-supply = <&vcc_3v0>;
+};
+
+&pcie_phy {
+ status = "okay";
+};
+
+&pcie0 {
+ assigned-clocks = <&cru SCLK_PCIEPHY_REF>;
+ assigned-clock-parents = <&cru SCLK_PCIEPHY_REF100M>;
+ assigned-clock-rates = <100000000>;
+ ep-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>;
+ num-lanes = <4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pcie_clkreqn_cpm>;
+ status = "okay";
+};
+
+&pmu_io_domains {
+ pmu1830-supply = <&vcc_3v0>;
+ status = "okay";
+};
+
+&pinctrl {
+ pmic {
+ pmic_int_l: pmic-int-l {
+ rockchip,pins =
+ <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
+ };
+
+ pmic_dvs2: pmic-dvs2 {
+ rockchip,pins =
+ <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;
+ };
+
+ vsel1_gpio: vsel1-gpio {
+ rockchip,pins = <1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>;
+ };
+
+ vsel2_gpio: vsel2-gpio {
+ rockchip,pins = <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_down>;
+ };
+ };
+
+ usb2 {
+ vcc5v0_host_en: vcc5v0-host-en {
+ rockchip,pins =
+ <4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+};
+
+&pwm0 {
+ status = "okay";
+};
+
+&pwm2 {
+ status = "okay";
+};
+
+&saradc {
+ vref-supply = <&vcca1v8_s3>;
+ status = "okay";
+};
+
+&sdhci {
+ bus-width = <8>;
+ keep-power-in-suspend;
+ mmc-hs400-1_8v;
+ mmc-hs400-enhanced-strobe;
+ non-removable;
+ status = "okay";
+};
+
+&sdio0 {
+ bus-width = <4>;
+ cap-sd-highspeed;
+ cap-sdio-irq;
+ clock-frequency = <50000000>;
+ disable-wp;
+ keep-power-in-suspend;
+ max-frequency = <50000000>;
+ mmc-pwrseq = <&sdio_pwrseq>;
+ non-removable;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+ sd-uhs-sdr104;
+ status = "okay";
+};
+
+&sdmmc {
+ bus-width = <4>;
+ cap-mmc-highspeed;
+ cap-sd-highspeed;
+ clock-frequency = <150000000>;
+ disable-wp;
+ max-frequency = <150000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
+ vqmmc-supply = <&vcc_sdio>;
+ status = "okay";
+};
+
+&tsadc {
+ /* tshut mode 0:CRU 1:GPIO */
+ rockchip,hw-tshut-mode = <1>;
+ /* tshut polarity 0:LOW 1:HIGH */
+ rockchip,hw-tshut-polarity = <1>;
+ status = "okay";
+};
+
+&u2phy0 {
+ status = "okay";
+
+ u2phy0_otg: otg-port {
+ status = "okay";
+ };
+
+ u2phy0_host: host-port {
+ phy-supply = <&vcc5v0_host>;
+ status = "okay";
+ };
+};
+
+&u2phy1 {
+ status = "okay";
+
+ u2phy1_otg: otg-port {
+ status = "okay";
+ };
+
+ u2phy1_host: host-port {
+ phy-supply = <&vcc5v0_host>;
+ status = "okay";
+ };
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_xfer &uart0_cts>;
+ status = "okay";
+};
+
+&uart2 {
+ status = "okay";
+};
+
+&usb_host0_ehci {
+ status = "okay";
+};
+
+&usb_host0_ohci {
+ status = "okay";
+};
+
+&usb_host1_ehci {
+ status = "okay";
+};
+
+&usb_host1_ohci {
+ status = "okay";
+};
+
+&usbdrd3_0 {
+ status = "okay";
+};
+
+&usbdrd_dwc3_0 {
+ status = "okay";
+ dr_mode = "otg";
+};
+
+&usbdrd3_1 {
+ status = "okay";
+};
+
+&usbdrd_dwc3_1 {
+ status = "okay";
+ dr_mode = "host";
+};
+
+&vopb {
+ status = "okay";
+};
+
+&vopb_mmu {
+ status = "okay";
+};
+
+&vopl {
+ status = "okay";
+};
+
+&vopl_mmu {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index 5b78ce16a87e..ab7629c5b856 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -110,6 +110,7 @@
enable-method = "psci";
#cooling-cells = <2>; /* min followed by max */
clocks = <&cru ARMCLKL>;
+ dynamic-power-coefficient = <100>;
};
cpu_l1: cpu@1 {
@@ -118,6 +119,7 @@
reg = <0x0 0x1>;
enable-method = "psci";
clocks = <&cru ARMCLKL>;
+ dynamic-power-coefficient = <100>;
};
cpu_l2: cpu@2 {
@@ -126,6 +128,7 @@
reg = <0x0 0x2>;
enable-method = "psci";
clocks = <&cru ARMCLKL>;
+ dynamic-power-coefficient = <100>;
};
cpu_l3: cpu@3 {
@@ -134,6 +137,7 @@
reg = <0x0 0x3>;
enable-method = "psci";
clocks = <&cru ARMCLKL>;
+ dynamic-power-coefficient = <100>;
};
cpu_b0: cpu@100 {
@@ -143,6 +147,7 @@
enable-method = "psci";
#cooling-cells = <2>; /* min followed by max */
clocks = <&cru ARMCLKB>;
+ dynamic-power-coefficient = <436>;
};
cpu_b1: cpu@101 {
@@ -151,9 +156,15 @@
reg = <0x0 0x101>;
enable-method = "psci";
clocks = <&cru ARMCLKB>;
+ dynamic-power-coefficient = <436>;
};
};
+ display-subsystem {
+ compatible = "rockchip,display-subsystem";
+ ports = <&vopl_out>, <&vopb_out>;
+ };
+
pmu_a53 {
compatible = "arm,cortex-a53-pmu";
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW &ppi_cluster0>;
@@ -289,6 +300,7 @@
<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
resets = <&cru SRST_SDIO0>;
reset-names = "reset";
status = "disabled";
@@ -402,6 +414,7 @@
snps,dis-u2-freeclk-exists-quirk;
snps,dis_u2_susphy_quirk;
snps,dis-del-phy-power-chg-quirk;
+ snps,dis-tx-ipgap-linecheck-quirk;
status = "disabled";
};
};
@@ -429,6 +442,7 @@
snps,dis-u2-freeclk-exists-quirk;
snps,dis_u2_susphy_quirk;
snps,dis-del-phy-power-chg-quirk;
+ snps,dis-tx-ipgap-linecheck-quirk;
status = "disabled";
};
};
@@ -678,6 +692,7 @@
interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH 0>;
pinctrl-names = "default";
pinctrl-0 = <&spi5_clk &spi5_tx &spi5_rx &spi5_cs0>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
@@ -950,6 +965,10 @@
};
/* These power domains are grouped by VD_LOGIC */
+ pd_edp@RK3399_PD_EDP {
+ reg = <RK3399_PD_EDP>;
+ clocks = <&cru PCLK_EDP_CTRL>;
+ };
pd_emmc@RK3399_PD_EMMC {
reg = <RK3399_PD_EMMC>;
clocks = <&cru ACLK_EMMC>;
@@ -967,6 +986,11 @@
<&cru SCLK_SDMMC>;
pm_qos = <&qos_sd>;
};
+ pd_sdioaudio@RK3399_PD_SDIOAUDIO {
+ reg = <RK3399_PD_SDIOAUDIO>;
+ clocks = <&cru HCLK_SDIO>;
+ pm_qos = <&qos_sdioaudio>;
+ };
pd_vio@RK3399_PD_VIO {
reg = <RK3399_PD_VIO>;
#address-cells = <1>;
@@ -1153,6 +1177,33 @@
status = "disabled";
};
+ vpu_mmu: iommu@ff650800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff650800 0x0 0x40>;
+ interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "vpu_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vdec_mmu: iommu@ff660480 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff660480 0x0 0x40>, <0x0 0xff6604c0 0x0 0x40>;
+ interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "vdec_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ iep_mmu: iommu@ff670800 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff670800 0x0 0x40>;
+ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "iep_mmu";
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
efuse0: efuse@ff690000 {
compatible = "rockchip,rk3399-efuse";
reg = <0x0 0xff690000 0x0 0x80>;
@@ -1387,6 +1438,7 @@
clocks = <&cru SCLK_SPDIF_8CH>, <&cru HCLK_SPDIF>;
pinctrl-names = "default";
pinctrl-0 = <&spdif_bus>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
status = "disabled";
};
@@ -1401,6 +1453,7 @@
clocks = <&cru SCLK_I2S0_8CH>, <&cru HCLK_I2S0_8CH>;
pinctrl-names = "default";
pinctrl-0 = <&i2s0_8ch_bus>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
status = "disabled";
};
@@ -1414,6 +1467,7 @@
clocks = <&cru SCLK_I2S1_8CH>, <&cru HCLK_I2S1_8CH>;
pinctrl-names = "default";
pinctrl-0 = <&i2s1_2ch_bus>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
status = "disabled";
};
@@ -1425,6 +1479,224 @@
dma-names = "tx", "rx";
clock-names = "i2s_clk", "i2s_hclk";
clocks = <&cru SCLK_I2S2_8CH>, <&cru HCLK_I2S2_8CH>;
+ power-domains = <&power RK3399_PD_SDIOAUDIO>;
+ status = "disabled";
+ };
+
+ vopl: vop@ff8f0000 {
+ compatible = "rockchip,rk3399-vop-lit";
+ reg = <0x0 0xff8f0000 0x0 0x3efc>;
+ interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>;
+ assigned-clocks = <&cru ACLK_VOP1>, <&cru HCLK_VOP1>;
+ assigned-clock-rates = <400000000>, <100000000>;
+ clocks = <&cru ACLK_VOP1>, <&cru DCLK_VOP1>, <&cru HCLK_VOP1>;
+ clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
+ iommus = <&vopl_mmu>;
+ power-domains = <&power RK3399_PD_VOPL>;
+ resets = <&cru SRST_A_VOP1>, <&cru SRST_H_VOP1>, <&cru SRST_D_VOP1>;
+ reset-names = "axi", "ahb", "dclk";
+ status = "disabled";
+
+ vopl_out: port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ vopl_out_mipi: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&mipi_in_vopl>;
+ };
+
+ vopl_out_edp: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&edp_in_vopl>;
+ };
+
+ vopl_out_hdmi: endpoint@2 {
+ reg = <2>;
+ remote-endpoint = <&hdmi_in_vopl>;
+ };
+ };
+ };
+
+ vopl_mmu: iommu@ff8f3f00 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff8f3f00 0x0 0x100>;
+ interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "vopl_mmu";
+ clocks = <&cru ACLK_VOP1>, <&cru HCLK_VOP1>;
+ clock-names = "aclk", "hclk";
+ power-domains = <&power RK3399_PD_VOPL>;
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ vopb: vop@ff900000 {
+ compatible = "rockchip,rk3399-vop-big";
+ reg = <0x0 0xff900000 0x0 0x3efc>;
+ interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>;
+ assigned-clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>;
+ assigned-clock-rates = <400000000>, <100000000>;
+ clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>;
+ clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
+ iommus = <&vopb_mmu>;
+ power-domains = <&power RK3399_PD_VOPB>;
+ resets = <&cru SRST_A_VOP0>, <&cru SRST_H_VOP0>, <&cru SRST_D_VOP0>;
+ reset-names = "axi", "ahb", "dclk";
+ status = "disabled";
+
+ vopb_out: port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ vopb_out_edp: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&edp_in_vopb>;
+ };
+
+ vopb_out_mipi: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&mipi_in_vopb>;
+ };
+
+ vopb_out_hdmi: endpoint@2 {
+ reg = <2>;
+ remote-endpoint = <&hdmi_in_vopb>;
+ };
+ };
+ };
+
+ vopb_mmu: iommu@ff903f00 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff903f00 0x0 0x100>;
+ interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "vopb_mmu";
+ clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>;
+ clock-names = "aclk", "hclk";
+ power-domains = <&power RK3399_PD_VOPB>;
+ #iommu-cells = <0>;
+ status = "disabled";
+ };
+
+ isp0_mmu: iommu@ff914000 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>;
+ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "isp0_mmu";
+ #iommu-cells = <0>;
+ rockchip,disable-mmu-reset;
+ status = "disabled";
+ };
+
+ isp1_mmu: iommu@ff924000 {
+ compatible = "rockchip,iommu";
+ reg = <0x0 0xff924000 0x0 0x100>, <0x0 0xff925000 0x0 0x100>;
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "isp1_mmu";
+ #iommu-cells = <0>;
+ rockchip,disable-mmu-reset;
+ status = "disabled";
+ };
+
+ hdmi: hdmi@ff940000 {
+ compatible = "rockchip,rk3399-dw-hdmi";
+ reg = <0x0 0xff940000 0x0 0x20000>;
+ interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_SFR>, <&cru PLL_VPLL>, <&cru PCLK_VIO_GRF>;
+ clock-names = "iahb", "isfr", "vpll", "grf";
+ power-domains = <&power RK3399_PD_HDCP>;
+ reg-io-width = <4>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+
+ ports {
+ hdmi_in: port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ hdmi_in_vopb: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&vopb_out_hdmi>;
+ };
+ hdmi_in_vopl: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&vopl_out_hdmi>;
+ };
+ };
+ };
+ };
+
+ mipi_dsi: mipi@ff960000 {
+ compatible = "rockchip,rk3399-mipi-dsi", "snps,dw-mipi-dsi";
+ reg = <0x0 0xff960000 0x0 0x8000>;
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&cru SCLK_DPHY_PLL>, <&cru PCLK_MIPI_DSI0>,
+ <&cru SCLK_DPHY_TX0_CFG>, <&cru PCLK_VIO_GRF>;
+ clock-names = "ref", "pclk", "phy_cfg", "grf";
+ power-domains = <&power RK3399_PD_VIO>;
+ rockchip,grf = <&grf>;
+ status = "disabled";
+
+ ports {
+ mipi_in: port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mipi_in_vopb: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&vopb_out_mipi>;
+ };
+ mipi_in_vopl: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&vopl_out_mipi>;
+ };
+ };
+ };
+ };
+
+ edp: edp@ff970000 {
+ compatible = "rockchip,rk3399-edp";
+ reg = <0x0 0xff970000 0x0 0x8000>;
+ interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&cru PCLK_EDP>, <&cru PCLK_EDP_CTRL>;
+ clock-names = "dp", "pclk";
+ pinctrl-names = "default";
+ pinctrl-0 = <&edp_hpd>;
+ power-domains = <&power RK3399_PD_EDP>;
+ resets = <&cru SRST_P_EDP_CTRL>;
+ reset-names = "dp";
+ rockchip,grf = <&grf>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ edp_in: port@0 {
+ reg = <0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ edp_in_vopb: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&vopb_out_edp>;
+ };
+
+ edp_in_vopl: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&vopl_out_edp>;
+ };
+ };
+ };
+ };
+
+ gpu: gpu@ff9a0000 {
+ compatible = "rockchip,rk3399-mali", "arm,mali-t860";
+ reg = <0x0 0xff9a0000 0x0 0x10000>;
+ interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "gpu", "job", "mmu";
+ clocks = <&cru ACLK_GPU>;
+ power-domains = <&power RK3399_PD_GPU>;
status = "disabled";
};
@@ -1788,7 +2060,7 @@
<4 RK_PB5 RK_FUNC_1 &pcfg_pull_up>;
};
- sdmmc_cd: sdmcc-cd {
+ sdmmc_cd: sdmmc-cd {
rockchip,pins =
<0 RK_PA7 RK_FUNC_1 &pcfg_pull_up>;
};
@@ -2092,16 +2364,6 @@
};
pcie {
- pcie_clkreqn: pci-clkreqn {
- rockchip,pins =
- <2 26 RK_FUNC_2 &pcfg_pull_none>;
- };
-
- pcie_clkreqnb: pci-clkreqnb {
- rockchip,pins =
- <4 24 RK_FUNC_1 &pcfg_pull_none>;
- };
-
pcie_clkreqn_cpm: pci-clkreqn-cpm {
rockchip,pins =
<2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
diff --git a/arch/arm64/boot/dts/socionext/Makefile b/arch/arm64/boot/dts/socionext/Makefile
index 4a13a3a97101..4bc091b365fd 100644
--- a/arch/arm64/boot/dts/socionext/Makefile
+++ b/arch/arm64/boot/dts/socionext/Makefile
@@ -2,7 +2,8 @@ dtb-$(CONFIG_ARCH_UNIPHIER) += \
uniphier-ld11-global.dtb \
uniphier-ld11-ref.dtb \
uniphier-ld20-global.dtb \
- uniphier-ld20-ref.dtb
+ uniphier-ld20-ref.dtb \
+ uniphier-pxs3-ref.dtb
always := $(dtb-y)
clean-files := *.dtb
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts b/arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts
index 115357018ef7..2452b2243f42 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts
@@ -9,7 +9,7 @@
*/
/dts-v1/;
-/include/ "uniphier-ld11.dtsi"
+#include "uniphier-ld11.dtsi"
/ {
model = "UniPhier LD11 Global Board (REF_LD11_GP)";
@@ -68,3 +68,7 @@
&usb2 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts b/arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts
index cc8ebe34c27c..ffb473ad2e0f 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-ld11.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-ld11.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier LD11 Reference Board";
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi
index bdce5b89baec..ee4aff53a5f5 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi
@@ -150,6 +150,17 @@
clocks = <&peri_clk 3>;
};
+ adamv@57920000 {
+ compatible = "socionext,uniphier-ld11-adamv",
+ "simple-mfd", "syscon";
+ reg = <0x57920000 0x1000>;
+
+ adamv_rst: reset {
+ compatible = "socionext,uniphier-ld11-adamv-reset";
+ #reset-cells = <1>;
+ };
+ };
+
i2c0: i2c@58780000 {
compatible = "socionext,uniphier-fi2c";
status = "disabled";
@@ -344,6 +355,13 @@
};
};
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-ld11-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
gic: interrupt-controller@5fe00000 {
compatible = "arm,gic-v3";
reg = <0x5fe00000 0x10000>, /* GICD */
@@ -367,8 +385,23 @@
compatible = "socionext,uniphier-ld11-reset";
#reset-cells = <1>;
};
+
+ watchdog {
+ compatible = "socionext,uniphier-wdt";
+ };
+ };
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5b";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand>;
+ clocks = <&sys_clk 2>;
};
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts b/arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts
index 9f620d4101b5..fc2bc9d75d35 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts
@@ -9,7 +9,7 @@
*/
/dts-v1/;
-/include/ "uniphier-ld20.dtsi"
+#include "uniphier-ld20.dtsi"
/ {
model = "UniPhier LD20 Global Board (REF_LD20_GP)";
@@ -50,3 +50,7 @@
&i2c0 {
status = "okay";
};
+
+&nand {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts b/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts
index 494166aee24c..1ca0c8620dc5 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts
@@ -8,9 +8,9 @@
*/
/dts-v1/;
-/include/ "uniphier-ld20.dtsi"
-/include/ "uniphier-ref-daughter.dtsi"
-/include/ "uniphier-support-card.dtsi"
+#include "uniphier-ld20.dtsi"
+#include "uniphier-ref-daughter.dtsi"
+#include "uniphier-support-card.dtsi"
/ {
model = "UniPhier LD20 Reference Board";
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
index de1e75362817..a29c279b6e8e 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
@@ -219,6 +219,17 @@
clocks = <&peri_clk 3>;
};
+ adamv@57920000 {
+ compatible = "socionext,uniphier-ld20-adamv",
+ "simple-mfd", "syscon";
+ reg = <0x57920000 0x1000>;
+
+ adamv_rst: reset {
+ compatible = "socionext,uniphier-ld20-adamv-reset";
+ #reset-cells = <1>;
+ };
+ };
+
i2c0: i2c@58780000 {
compatible = "socionext,uniphier-fi2c";
status = "disabled";
@@ -309,7 +320,7 @@
sdctrl@59810000 {
compatible = "socionext,uniphier-ld20-sdctrl",
"simple-mfd", "syscon";
- reg = <0x59810000 0x800>;
+ reg = <0x59810000 0x400>;
sd_clk: clock {
compatible = "socionext,uniphier-ld20-sd-clock";
@@ -365,6 +376,13 @@
};
};
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-ld20-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
gic: interrupt-controller@5fe00000 {
compatible = "arm,gic-v3";
reg = <0x5fe00000 0x10000>, /* GICD */
@@ -388,8 +406,23 @@
compatible = "socionext,uniphier-ld20-reset";
#reset-cells = <1>;
};
+
+ watchdog {
+ compatible = "socionext,uniphier-wdt";
+ };
+ };
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5b";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand>;
+ clocks = <&sys_clk 2>;
};
};
};
-/include/ "uniphier-pinctrl.dtsi"
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi b/arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi
index f42fb6f38bd3..9caabbb8bae3 120000..100644
--- a/arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi
@@ -1 +1 @@
-../../../../arm/boot/dts/uniphier-pinctrl.dtsi \ No newline at end of file
+#include <arm/uniphier-pinctrl.dtsi>
diff --git a/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts
new file mode 100644
index 000000000000..d65f746a3f9d
--- /dev/null
+++ b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts
@@ -0,0 +1,62 @@
+/*
+ * Device Tree Source for UniPhier PXs3 Reference Board
+ *
+ * Copyright (C) 2017 Socionext Inc.
+ * Author: Masahiro Yamada <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/dts-v1/;
+#include "uniphier-pxs3.dtsi"
+#include "uniphier-support-card.dtsi"
+
+/ {
+ model = "UniPhier PXs3 Reference Board";
+ compatible = "socionext,uniphier-pxs3-ref", "socionext,uniphier-pxs3";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ aliases {
+ serial0 = &serial0;
+ serial1 = &serial1;
+ serial2 = &serial2;
+ serial3 = &serial3;
+ i2c0 = &i2c0;
+ i2c1 = &i2c1;
+ i2c2 = &i2c2;
+ i2c3 = &i2c3;
+ i2c6 = &i2c6;
+ };
+
+ memory@80000000 {
+ device_type = "memory";
+ reg = <0 0x80000000 0 0xa0000000>;
+ };
+};
+
+&ethsc {
+ interrupts = <0 52 4>;
+};
+
+&serial0 {
+ status = "okay";
+};
+
+&i2c0 {
+ status = "okay";
+};
+
+&i2c1 {
+ status = "okay";
+};
+
+&i2c2 {
+ status = "okay";
+};
+
+&i2c3 {
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi b/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
new file mode 100644
index 000000000000..384729fa740f
--- /dev/null
+++ b/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
@@ -0,0 +1,367 @@
+/*
+ * Device Tree Source for UniPhier PXs3 SoC
+ *
+ * Copyright (C) 2017 Socionext Inc.
+ * Author: Masahiro Yamada <[email protected]>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/memreserve/ 0x80000000 0x02000000;
+
+/ {
+ compatible = "socionext,uniphier-pxs3";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ interrupt-parent = <&gic>;
+
+ cpus {
+ #address-cells = <2>;
+ #size-cells = <0>;
+
+ cpu-map {
+ cluster0 {
+ core0 {
+ cpu = <&cpu0>;
+ };
+ core1 {
+ cpu = <&cpu1>;
+ };
+ core2 {
+ cpu = <&cpu2>;
+ };
+ core3 {
+ cpu = <&cpu3>;
+ };
+ };
+ };
+
+ cpu0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0 0x000>;
+ clocks = <&sys_clk 33>;
+ enable-method = "psci";
+ operating-points-v2 = <&cluster0_opp>;
+ };
+
+ cpu1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0 0x001>;
+ clocks = <&sys_clk 33>;
+ enable-method = "psci";
+ operating-points-v2 = <&cluster0_opp>;
+ };
+
+ cpu2: cpu@2 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0 0x002>;
+ clocks = <&sys_clk 33>;
+ enable-method = "psci";
+ operating-points-v2 = <&cluster0_opp>;
+ };
+
+ cpu3: cpu@3 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53", "arm,armv8";
+ reg = <0 0x003>;
+ clocks = <&sys_clk 33>;
+ enable-method = "psci";
+ operating-points-v2 = <&cluster0_opp>;
+ };
+ };
+
+ cluster0_opp: opp_table {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-250000000 {
+ opp-hz = /bits/ 64 <250000000>;
+ clock-latency-ns = <300>;
+ };
+ opp-325000000 {
+ opp-hz = /bits/ 64 <325000000>;
+ clock-latency-ns = <300>;
+ };
+ opp-500000000 {
+ opp-hz = /bits/ 64 <500000000>;
+ clock-latency-ns = <300>;
+ };
+ opp-650000000 {
+ opp-hz = /bits/ 64 <650000000>;
+ clock-latency-ns = <300>;
+ };
+ opp-666667000 {
+ opp-hz = /bits/ 64 <666667000>;
+ clock-latency-ns = <300>;
+ };
+ opp-866667000 {
+ opp-hz = /bits/ 64 <866667000>;
+ clock-latency-ns = <300>;
+ };
+ opp-1000000000 {
+ opp-hz = /bits/ 64 <1000000000>;
+ clock-latency-ns = <300>;
+ };
+ opp-1300000000 {
+ opp-hz = /bits/ 64 <1300000000>;
+ clock-latency-ns = <300>;
+ };
+ };
+
+ psci {
+ compatible = "arm,psci-1.0";
+ method = "smc";
+ };
+
+ clocks {
+ refclk: ref {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <25000000>;
+ };
+ };
+
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupts = <1 13 4>,
+ <1 14 4>,
+ <1 11 4>,
+ <1 10 4>;
+ };
+
+ soc@0 {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0 0 0xffffffff>;
+
+ serial0: serial@54006800 {
+ compatible = "socionext,uniphier-uart";
+ status = "disabled";
+ reg = <0x54006800 0x40>;
+ interrupts = <0 33 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart0>;
+ clocks = <&peri_clk 0>;
+ };
+
+ serial1: serial@54006900 {
+ compatible = "socionext,uniphier-uart";
+ status = "disabled";
+ reg = <0x54006900 0x40>;
+ interrupts = <0 35 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart1>;
+ clocks = <&peri_clk 1>;
+ };
+
+ serial2: serial@54006a00 {
+ compatible = "socionext,uniphier-uart";
+ status = "disabled";
+ reg = <0x54006a00 0x40>;
+ interrupts = <0 37 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart2>;
+ clocks = <&peri_clk 2>;
+ };
+
+ serial3: serial@54006b00 {
+ compatible = "socionext,uniphier-uart";
+ status = "disabled";
+ reg = <0x54006b00 0x40>;
+ interrupts = <0 177 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart3>;
+ clocks = <&peri_clk 3>;
+ };
+
+ i2c0: i2c@58780000 {
+ compatible = "socionext,uniphier-fi2c";
+ status = "disabled";
+ reg = <0x58780000 0x80>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0 41 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c0>;
+ clocks = <&peri_clk 4>;
+ clock-frequency = <100000>;
+ };
+
+ i2c1: i2c@58781000 {
+ compatible = "socionext,uniphier-fi2c";
+ status = "disabled";
+ reg = <0x58781000 0x80>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0 42 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c1>;
+ clocks = <&peri_clk 5>;
+ clock-frequency = <100000>;
+ };
+
+ i2c2: i2c@58782000 {
+ compatible = "socionext,uniphier-fi2c";
+ status = "disabled";
+ reg = <0x58782000 0x80>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0 43 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c2>;
+ clocks = <&peri_clk 6>;
+ clock-frequency = <100000>;
+ };
+
+ i2c3: i2c@58783000 {
+ compatible = "socionext,uniphier-fi2c";
+ status = "disabled";
+ reg = <0x58783000 0x80>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0 44 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c3>;
+ clocks = <&peri_clk 7>;
+ clock-frequency = <100000>;
+ };
+
+ /* chip-internal connection for HDMI */
+ i2c6: i2c@58786000 {
+ compatible = "socionext,uniphier-fi2c";
+ reg = <0x58786000 0x80>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ interrupts = <0 26 4>;
+ clocks = <&peri_clk 10>;
+ clock-frequency = <400000>;
+ };
+
+ system_bus: system-bus@58c00000 {
+ compatible = "socionext,uniphier-system-bus";
+ status = "disabled";
+ reg = <0x58c00000 0x400>;
+ #address-cells = <2>;
+ #size-cells = <1>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_system_bus>;
+ };
+
+ smpctrl@59801000 {
+ compatible = "socionext,uniphier-smpctrl";
+ reg = <0x59801000 0x400>;
+ };
+
+ sdctrl@59810000 {
+ compatible = "socionext,uniphier-pxs3-sdctrl",
+ "simple-mfd", "syscon";
+ reg = <0x59810000 0x400>;
+
+ sd_clk: clock {
+ compatible = "socionext,uniphier-pxs3-sd-clock";
+ #clock-cells = <1>;
+ };
+
+ sd_rst: reset {
+ compatible = "socionext,uniphier-pxs3-sd-reset";
+ #reset-cells = <1>;
+ };
+ };
+
+ perictrl@59820000 {
+ compatible = "socionext,uniphier-pxs3-perictrl",
+ "simple-mfd", "syscon";
+ reg = <0x59820000 0x200>;
+
+ peri_clk: clock {
+ compatible = "socionext,uniphier-pxs3-peri-clock";
+ #clock-cells = <1>;
+ };
+
+ peri_rst: reset {
+ compatible = "socionext,uniphier-pxs3-peri-reset";
+ #reset-cells = <1>;
+ };
+ };
+
+ emmc: sdhc@5a000000 {
+ compatible = "socionext,uniphier-sd4hc", "cdns,sd4hc";
+ reg = <0x5a000000 0x400>;
+ interrupts = <0 78 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_emmc>;
+ clocks = <&sys_clk 4>;
+ bus-width = <8>;
+ mmc-ddr-1_8v;
+ mmc-hs200-1_8v;
+ cdns,phy-input-delay-legacy = <4>;
+ cdns,phy-input-delay-mmc-highspeed = <2>;
+ cdns,phy-input-delay-mmc-ddr = <3>;
+ cdns,phy-dll-delay-sdclk = <21>;
+ cdns,phy-dll-delay-sdclk-hsmmc = <21>;
+ };
+
+ soc-glue@5f800000 {
+ compatible = "socionext,uniphier-pxs3-soc-glue",
+ "simple-mfd", "syscon";
+ reg = <0x5f800000 0x2000>;
+
+ pinctrl: pinctrl {
+ compatible = "socionext,uniphier-pxs3-pinctrl";
+ };
+ };
+
+ aidet: aidet@5fc20000 {
+ compatible = "socionext,uniphier-pxs3-aidet";
+ reg = <0x5fc20000 0x200>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ gic: interrupt-controller@5fe00000 {
+ compatible = "arm,gic-v3";
+ reg = <0x5fe00000 0x10000>, /* GICD */
+ <0x5fe80000 0x80000>; /* GICR */
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ interrupts = <1 9 4>;
+ };
+
+ sysctrl@61840000 {
+ compatible = "socionext,uniphier-pxs3-sysctrl",
+ "simple-mfd", "syscon";
+ reg = <0x61840000 0x10000>;
+
+ sys_clk: clock {
+ compatible = "socionext,uniphier-pxs3-clock";
+ #clock-cells = <1>;
+ };
+
+ sys_rst: reset {
+ compatible = "socionext,uniphier-pxs3-reset";
+ #reset-cells = <1>;
+ };
+
+ watchdog {
+ compatible = "socionext,uniphier-wdt";
+ };
+ };
+
+ nand: nand@68000000 {
+ compatible = "socionext,uniphier-denali-nand-v5b";
+ status = "disabled";
+ reg-names = "nand_data", "denali_reg";
+ reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+ interrupts = <0 65 4>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_nand>;
+ clocks = <&sys_clk 2>;
+ };
+ };
+};
+
+#include "uniphier-pinctrl.dtsi"
diff --git a/arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi
index 4685a8d89cba..e66d999d9f5d 120000..100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi
@@ -1 +1 @@
-../../../../arm/boot/dts/uniphier-ref-daughter.dtsi \ No newline at end of file
+#include <arm/uniphier-ref-daughter.dtsi>
diff --git a/arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi b/arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi
index 1246db9be2a1..28c5b4ed1d95 120000..100644
--- a/arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi
@@ -1 +1 @@
-../../../../arm/boot/dts/uniphier-support-card.dtsi \ No newline at end of file
+#include <arm/uniphier-support-card.dtsi>
diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-ep108-clk.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp-ep108-clk.dtsi
index cdc6a437dcc7..b87b8316f4ac 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp-ep108-clk.dtsi
+++ b/arch/arm64/boot/dts/xilinx/zynqmp-ep108-clk.dtsi
@@ -11,7 +11,7 @@
* the License, or (at your option) any later version.
*/
-&amba {
+/ {
misc_clk: misc_clk {
compatible = "fixed-clock";
#clock-cells = <0>;
@@ -29,12 +29,60 @@
#clock-cells = <0>;
clock-frequency = <75000000>;
};
+
+ clk100: clk100 {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <100000000>;
+ };
+
+ clk600: clk600 {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <600000000>;
+ };
};
&can0 {
clocks = <&misc_clk &misc_clk>;
};
+&can1 {
+ clocks = <&misc_clk &misc_clk>;
+};
+
+&fpd_dma_chan1 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan2 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan3 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan4 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan5 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan6 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan7 {
+ clocks = <&clk600>, <&clk100>;
+};
+
+&fpd_dma_chan8 {
+ clocks = <&clk600>, <&clk100>;
+};
+
&gem0 {
clocks = <&misc_clk>, <&misc_clk>, <&misc_clk>;
};
diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-ep108.dts b/arch/arm64/boot/dts/xilinx/zynqmp-ep108.dts
index ef1b9e573af0..bf552674a834 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp-ep108.dts
+++ b/arch/arm64/boot/dts/xilinx/zynqmp-ep108.dts
@@ -13,13 +13,15 @@
/dts-v1/;
-/include/ "zynqmp.dtsi"
-/include/ "zynqmp-ep108-clk.dtsi"
+#include "zynqmp.dtsi"
+#include "zynqmp-ep108-clk.dtsi"
/ {
model = "ZynqMP EP108";
aliases {
+ mmc0 = &sdhci0;
+ mmc1 = &sdhci1;
serial0 = &uart0;
};
@@ -37,6 +39,10 @@
status = "okay";
};
+&can1 {
+ status = "okay";
+};
+
&gem0 {
status = "okay";
phy-handle = <&phy0>;
@@ -55,7 +61,7 @@
status = "okay";
clock-frequency = <400000>;
eeprom@54 {
- compatible = "at,24c64";
+ compatible = "atmel,24c64";
reg = <0x54>;
};
};
@@ -64,7 +70,7 @@
status = "okay";
clock-frequency = <400000>;
eeprom@55 {
- compatible = "at,24c64";
+ compatible = "atmel,24c64";
reg = <0x55>;
};
};
@@ -92,7 +98,7 @@
spi-max-frequency = <50000000>;
reg = <0>;
- spi0_flash0@00000000 {
+ spi0_flash0@0 {
label = "spi0_flash0";
reg = <0x0 0x100000>;
};
@@ -109,7 +115,7 @@
spi-max-frequency = <50000000>;
reg = <0>;
- spi1_flash0@00000000 {
+ spi1_flash0@0 {
label = "spi1_flash0";
reg = <0x0 0x100000>;
};
diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
index 54dc28351c8c..7665fbddff28 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
+++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
@@ -20,33 +20,84 @@
#address-cells = <1>;
#size-cells = <0>;
- cpu@0 {
+ cpu0: cpu@0 {
compatible = "arm,cortex-a53", "arm,armv8";
device_type = "cpu";
enable-method = "psci";
+ operating-points-v2 = <&cpu_opp_table>;
reg = <0x0>;
+ cpu-idle-states = <&CPU_SLEEP_0>;
};
- cpu@1 {
+ cpu1: cpu@1 {
compatible = "arm,cortex-a53", "arm,armv8";
device_type = "cpu";
enable-method = "psci";
reg = <0x1>;
+ operating-points-v2 = <&cpu_opp_table>;
+ cpu-idle-states = <&CPU_SLEEP_0>;
};
- cpu@2 {
+ cpu2: cpu@2 {
compatible = "arm,cortex-a53", "arm,armv8";
device_type = "cpu";
enable-method = "psci";
reg = <0x2>;
+ operating-points-v2 = <&cpu_opp_table>;
+ cpu-idle-states = <&CPU_SLEEP_0>;
};
- cpu@3 {
+ cpu3: cpu@3 {
compatible = "arm,cortex-a53", "arm,armv8";
device_type = "cpu";
enable-method = "psci";
reg = <0x3>;
+ operating-points-v2 = <&cpu_opp_table>;
+ cpu-idle-states = <&CPU_SLEEP_0>;
};
+
+ idle-states {
+ entry-method = "arm,psci";
+
+ CPU_SLEEP_0: cpu-sleep-0 {
+ compatible = "arm,idle-state";
+ arm,psci-suspend-param = <0x40000000>;
+ local-timer-stop;
+ entry-latency-us = <300>;
+ exit-latency-us = <600>;
+ min-residency-us = <10000>;
+ };
+ };
+ };
+
+ cpu_opp_table: cpu_opp_table {
+ compatible = "operating-points-v2";
+ opp-shared;
+ opp00 {
+ opp-hz = /bits/ 64 <1199999988>;
+ opp-microvolt = <1000000>;
+ clock-latency-ns = <500000>;
+ };
+ opp01 {
+ opp-hz = /bits/ 64 <599999994>;
+ opp-microvolt = <1000000>;
+ clock-latency-ns = <500000>;
+ };
+ opp02 {
+ opp-hz = /bits/ 64 <399999996>;
+ opp-microvolt = <1000000>;
+ clock-latency-ns = <500000>;
+ };
+ opp03 {
+ opp-hz = /bits/ 64 <299999997>;
+ opp-microvolt = <1000000>;
+ clock-latency-ns = <500000>;
+ };
+ };
+
+ dcc: dcc {
+ compatible = "arm,dcc";
+ status = "disabled";
};
pmu {
@@ -119,6 +170,190 @@
rx-fifo-depth = <0x40>;
};
+ cci: cci@fd6e0000 {
+ compatible = "arm,cci-400";
+ reg = <0x0 0xfd6e0000 0x0 0x9000>;
+ ranges = <0x0 0x0 0xfd6e0000 0x10000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ pmu@9000 {
+ compatible = "arm,cci-400-pmu,r1";
+ reg = <0x9000 0x5000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 123 4>,
+ <0 123 4>,
+ <0 123 4>,
+ <0 123 4>,
+ <0 123 4>;
+ };
+ };
+
+ /* GDMA */
+ fpd_dma_chan1: dma@fd500000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd500000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 124 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan2: dma@fd510000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd510000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 125 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan3: dma@fd520000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd520000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 126 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan4: dma@fd530000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd530000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 127 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan5: dma@fd540000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd540000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 128 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan6: dma@fd550000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd550000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 129 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan7: dma@fd560000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd560000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 130 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ fpd_dma_chan8: dma@fd570000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xfd570000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 131 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <128>;
+ };
+
+ /* LPDDMA default allows only secured access. inorder to enable
+ * These dma channels, Users should ensure that these dma
+ * Channels are allowed for non secure access.
+ */
+ lpd_dma_chan1: dma@ffa80000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffa80000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 77 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan2: dma@ffa90000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffa90000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 78 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan3: dma@ffaa0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffaa0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 79 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan4: dma@ffab0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffab0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 80 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan5: dma@ffac0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffac0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 81 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan6: dma@ffad0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffad0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 82 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan7: dma@ffae0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffae0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 83 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
+ lpd_dma_chan8: dma@ffaf0000 {
+ status = "disabled";
+ compatible = "xlnx,zynqmp-dma-1.0";
+ reg = <0x0 0xffaf0000 0x0 0x1000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 84 4>;
+ clock-names = "clk_main", "clk_apb";
+ xlnx,bus-width = <64>;
+ };
+
gem0: ethernet@ff0b0000 {
compatible = "cdns,gem";
status = "disabled";
@@ -215,12 +450,9 @@
<0x0 0xfd480000 0x0 0x1000>,
<0x80 0x00000000 0x0 0x1000000>;
reg-names = "breg", "pcireg", "cfg";
- ranges = <0x02000000 0x00000000 0xe0000000 0x00000000
- 0xe0000000 0x00000000 0x10000000
- /* non-prefetchable memory */
- 0x43000000 0x00000006 0x00000000 0x00000006
- 0x00000000 0x00000002 0x00000000>;
- /* prefetchable memory */
+ ranges = <0x02000000 0x00000000 0xe0000000 0x00000000 0xe0000000 0x00000000 0x10000000 /* non-prefetchable memory */
+ 0x43000000 0x00000006 0x00000000 0x00000006 0x00000000 0x00000002 0x00000000>;/* prefetchable memory */
+ bus-range = <0x00 0xff>;
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <0x0 0x0 0x0 0x1 &pcie_intc 0x1>,
<0x0 0x0 0x0 0x2 &pcie_intc 0x2>,
@@ -233,6 +465,16 @@
};
};
+ rtc: rtc@ffa60000 {
+ compatible = "xlnx,zynqmp-rtc";
+ status = "disabled";
+ reg = <0x0 0xffa60000 0x0 0x100>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 26 4>, <0 27 4>;
+ interrupt-names = "alarm", "sec";
+ calibration = <0x8000>;
+ };
+
sata: ahci@fd0c0000 {
compatible = "ceva,ahci-1v84";
status = "disabled";
@@ -262,13 +504,14 @@
smmu: smmu@fd800000 {
compatible = "arm,mmu-500";
reg = <0x0 0xfd800000 0x0 0x20000>;
+ status = "disabled";
#global-interrupts = <1>;
interrupt-parent = <&gic>;
- interrupts = <0 157 4>,
- <0 157 4>, <0 157 4>, <0 157 4>, <0 157 4>,
- <0 157 4>, <0 157 4>, <0 157 4>, <0 157 4>,
- <0 157 4>, <0 157 4>, <0 157 4>, <0 157 4>,
- <0 157 4>, <0 157 4>, <0 157 4>, <0 157 4>;
+ interrupts = <0 155 4>,
+ <0 155 4>, <0 155 4>, <0 155 4>, <0 155 4>,
+ <0 155 4>, <0 155 4>, <0 155 4>, <0 155 4>,
+ <0 155 4>, <0 155 4>, <0 155 4>, <0 155 4>,
+ <0 155 4>, <0 155 4>, <0 155 4>, <0 155 4>;
};
spi0: spi@ff040000 {
@@ -330,7 +573,7 @@
};
uart0: serial@ff000000 {
- compatible = "cdns,uart-r1p8";
+ compatible = "cdns,uart-r1p12", "xlnx,xuartps";
status = "disabled";
interrupt-parent = <&gic>;
interrupts = <0 21 4>;
@@ -339,7 +582,7 @@
};
uart1: serial@ff010000 {
- compatible = "cdns,uart-r1p8";
+ compatible = "cdns,uart-r1p12", "xlnx,xuartps";
status = "disabled";
interrupt-parent = <&gic>;
interrupts = <0 22 4>;
diff --git a/arch/arm64/boot/dts/zte/Makefile b/arch/arm64/boot/dts/zte/Makefile
index 667806620f59..d86c4def6bc9 100644
--- a/arch/arm64/boot/dts/zte/Makefile
+++ b/arch/arm64/boot/dts/zte/Makefile
@@ -1,4 +1,5 @@
dtb-$(CONFIG_ARCH_ZX) += zx296718-evb.dtb
+dtb-$(CONFIG_ARCH_ZX) += zx296718-pcbox.dtb
always := $(dtb-y)
subdir-y := $(dts-dirs)
diff --git a/arch/arm64/boot/dts/zte/zx296718-evb.dts b/arch/arm64/boot/dts/zte/zx296718-evb.dts
index bb900d2bbcfb..cb2519ecd724 100644
--- a/arch/arm64/boot/dts/zte/zx296718-evb.dts
+++ b/arch/arm64/boot/dts/zte/zx296718-evb.dts
@@ -57,16 +57,28 @@
reg = <0x40000000 0x40000000>;
};
- sound0 {
- compatible = "simple-audio-card";
- simple-audio-card,name = "zx_snd_spdif0";
+ sound-spdif0 {
+ compatible = "audio-graph-card";
+ dais = <&spdif0_port>;
+ };
- simple-audio-card,cpu {
- sound-dai = <&spdif0>;
- };
+ sound-i2s0 {
+ compatible = "audio-graph-card";
+ dais = <&i2s0_port>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&amplifier_pins>;
+ pa-gpios = <&bgpio4 0 GPIO_ACTIVE_HIGH>;
+ widgets = "Line", "Line Out Jack";
+ routing = "Amplifier", "LINEOUTL",
+ "Amplifier", "LINEOUTR",
+ "Line Out Jack", "Amplifier";
+ };
+};
- simple-audio-card,codec {
- sound-dai = <&hdmi>;
+&aud96p22 {
+ port {
+ aud96p22_endpoint: endpoint {
+ remote-endpoint = <&i2s0_endpoint>;
};
};
};
@@ -77,6 +89,36 @@
&hdmi {
status = "okay";
+
+ port {
+ hdmi_endpoint: endpoint {
+ remote-endpoint = <&spdif0_endpoint>;
+ };
+ };
+};
+
+&i2c0 {
+ status = "okay";
+};
+
+&i2s0 {
+ status = "okay";
+
+ i2s0_port: port {
+ i2s0_endpoint: endpoint {
+ remote-endpoint = <&aud96p22_endpoint>;
+ dai-format = "i2s";
+ frame-master;
+ bitclock-master;
+ };
+ };
+};
+
+&pmm {
+ amplifier_pins: amplifier {
+ pins = "TSI3_DATA";
+ function = "BGPIO";
+ };
};
&sd1 {
@@ -85,6 +127,16 @@
&spdif0 {
status = "okay";
+
+ spdif0_port: port {
+ spdif0_endpoint: endpoint {
+ remote-endpoint = <&hdmi_endpoint>;
+ };
+ };
+};
+
+&tvenc {
+ status = "okay";
};
&uart0 {
diff --git a/arch/arm64/boot/dts/zte/zx296718-pcbox.dts b/arch/arm64/boot/dts/zte/zx296718-pcbox.dts
new file mode 100644
index 000000000000..e02509f7082b
--- /dev/null
+++ b/arch/arm64/boot/dts/zte/zx296718-pcbox.dts
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * Copyright 2017 Linaro Ltd.
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/dts-v1/;
+#include "zx296718.dtsi"
+#include <dt-bindings/pwm/pwm.h>
+
+/ {
+ model = "ZTE ZX296718 PCBOX Board";
+ compatible = "zte,zx296718-pcbox", "zte,zx296718";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory@80000000 {
+ device_type = "memory";
+ reg = <0x80000000 0x80000000>;
+ };
+
+ a53_vdd0v9: regulator-a53 {
+ compatible = "pwm-regulator";
+ pwms = <&pwm 3 1250 PWM_POLARITY_INVERTED>;
+ regulator-name = "A53_VDD0V9";
+ regulator-min-microvolt = <855000>;
+ regulator-max-microvolt = <1183000>;
+ pwm-dutycycle-unit = <100>;
+ pwm-dutycycle-range = <0 100>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ sound-spdif0 {
+ compatible = "audio-graph-card";
+ dais = <&spdif0_port>;
+ };
+
+ sound-i2s0 {
+ compatible = "audio-graph-card";
+ dais = <&i2s0_port>;
+ };
+};
+
+&aud96p22 {
+ port {
+ aud96p22_endpoint: endpoint {
+ remote-endpoint = <&i2s0_endpoint>;
+ };
+ };
+};
+
+&cpu0 {
+ cpu-supply = <&a53_vdd0v9>;
+};
+
+&emmc {
+ status = "okay";
+};
+
+&hdmi {
+ status = "disabled";
+
+ port {
+ hdmi_endpoint: endpoint {
+ remote-endpoint = <&spdif0_endpoint>;
+ };
+ };
+};
+
+&i2c0 {
+ status = "okay";
+};
+
+&i2s0 {
+ status = "okay";
+
+ i2s0_port: port {
+ i2s0_endpoint: endpoint {
+ remote-endpoint = <&aud96p22_endpoint>;
+ dai-format = "i2s";
+ frame-master;
+ bitclock-master;
+ };
+ };
+};
+
+&irdec {
+ status = "okay";
+};
+
+&pmm {
+ pwm3_pins: pwm3 {
+ pins = "KEY_ROW2";
+ function = "PWM";
+ };
+
+ vga_pins: vga {
+ pins = "KEY_COL1", "KEY_COL2", "VGA_HS", "VGA_VS";
+ function = "VGA";
+ };
+};
+
+&pwm {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm3_pins>;
+ status = "okay";
+};
+
+&sd0 {
+ status = "okay";
+};
+
+&sd1 {
+ status = "okay";
+};
+
+&spdif0 {
+ status = "okay";
+
+ spdif0_port: port {
+ spdif0_endpoint: endpoint {
+ remote-endpoint = <&hdmi_endpoint>;
+ };
+ };
+};
+
+&tvenc {
+ status = "disabled";
+};
+
+&uart0 {
+ status = "okay";
+};
+
+&vga {
+ pinctrl-names = "default";
+ pinctrl-0 = <&vga_pins>;
+ status = "okay";
+};
diff --git a/arch/arm64/boot/dts/zte/zx296718.dtsi b/arch/arm64/boot/dts/zte/zx296718.dtsi
index d83bf789c864..6eef64761009 100644
--- a/arch/arm64/boot/dts/zte/zx296718.dtsi
+++ b/arch/arm64/boot/dts/zte/zx296718.dtsi
@@ -53,6 +53,13 @@
interrupt-parent = <&gic>;
aliases {
+ gpio0 = &bgpio0;
+ gpio1 = &bgpio1;
+ gpio2 = &bgpio2;
+ gpio3 = &bgpio3;
+ gpio4 = &bgpio4;
+ gpio5 = &bgpio5;
+ gpio6 = &bgpio6;
serial0 = &uart0;
};
@@ -120,26 +127,31 @@
opp-500000000 {
opp-hz = /bits/ 64 <500000000>;
+ opp-microvolt = <866000>;
clock-latency-ns = <500000>;
};
opp-648000000 {
opp-hz = /bits/ 64 <648000000>;
+ opp-microvolt = <866000>;
clock-latency-ns = <500000>;
};
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <888000>;
clock-latency-ns = <500000>;
};
opp-1000000000 {
opp-hz = /bits/ 64 <1000000000>;
+ opp-microvolt = <898000>;
clock-latency-ns = <500000>;
};
opp-1188000000 {
opp-hz = /bits/ 64 <1188000000>;
+ opp-microvolt = <1015000>;
clock-latency-ns = <500000>;
};
};
@@ -283,11 +295,23 @@
compatible = "simple-bus";
ranges;
+ irdec: ir-decoder@111000 {
+ compatible = "zte,zx296718-irdec";
+ reg = <0x111000 0x1000>;
+ interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
aon_sysctrl: aon-sysctrl@116000 {
compatible = "zte,zx296718-aon-sysctrl", "syscon";
reg = <0x116000 0x1000>;
};
+ iocfg: pin-controller@119000 {
+ compatible = "zte,zx296718-iocfg";
+ reg = <0x119000 0x1000>;
+ };
+
uart0: uart@11f000 {
compatible = "arm,pl011", "arm,primecell";
arm,primecell-periphid = <0x001feffe>;
@@ -311,7 +335,6 @@
clock-frequency = <50000000>;
clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>;
clock-names = "biu", "ciu";
- num-slots = <1>;
max-frequency = <50000000>;
cap-sdio-irq;
cap-sd-highspeed;
@@ -336,7 +359,6 @@
clock-frequency = <167000000>;
clocks = <&topcrm SD1_AHB>, <&topcrm SD1_WCLK>;
clock-names = "biu", "ciu";
- num-slots = <1>;
max-frequency = <167000000>;
cap-sdio-irq;
cap-sd-highspeed;
@@ -360,12 +382,109 @@
#clock-cells = <1>;
};
+ bgpio0: gpio@142d000 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d000 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 48 16>;
+ interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio1: gpio@142d040 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d040 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 80 16>;
+ interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio2: gpio@142d080 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d080 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 80 3
+ &pmm 3 32 4
+ &pmm 7 83 9>;
+ interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio3: gpio@142d0c0 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d0c0 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 92 16>;
+ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio4: gpio@142d100 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d100 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 108 12
+ &pmm 12 121 4>;
+ interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio5: gpio@142d140 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d140 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 125 16>;
+ interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
+ bgpio6: gpio@142d180 {
+ compatible = "zte,zx296718-gpio", "zte,zx296702-gpio";
+ reg = <0x142d180 0x40>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ gpio-ranges = <&pmm 0 141 2>;
+ interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-parent = <&gic>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+
lsp1crm: clock-controller@1430000 {
compatible = "zte,zx296718-lsp1crm";
reg = <0x01430000 0x1000>;
#clock-cells = <1>;
};
+ pwm: pwm@1439000 {
+ compatible = "zte,zx296718-pwm";
+ reg = <0x1439000 0x1000>;
+ clocks = <&lsp1crm LSP1_PWM_PCLK>,
+ <&lsp1crm LSP1_PWM_WCLK>;
+ clock-names = "pclk", "wclk";
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+
vou: vou@1440000 {
compatible = "zte,zx296718-vou";
#address-cells = <1>;
@@ -387,6 +506,16 @@
"main_wclk", "aux_wclk";
};
+ vga: vga@8000 {
+ compatible = "zte,zx296718-vga";
+ reg = <0x8000 0x1000>;
+ interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&topcrm VGA_I2C_WCLK>;
+ clock-names = "i2c_wclk";
+ zte,vga-power-control = <&sysctrl 0x170 0xe0>;
+ status = "disabled";
+ };
+
hdmi: hdmi@c000 {
compatible = "zte,zx296718-hdmi";
reg = <0xc000 0x4000>;
@@ -413,6 +542,12 @@
#clock-cells = <1>;
};
+ pmm: pin-controller@1462000 {
+ compatible = "zte,zx296718-pmm";
+ reg = <0x1462000 0x1000>;
+ zte,auxiliary-controller = <&iocfg>;
+ };
+
sysctrl: sysctrl@1463000 {
compatible = "zte,zx296718-sysctrl", "syscon";
reg = <0x1463000 0x1000>;
@@ -445,6 +580,38 @@
#clock-cells = <1>;
};
+ i2s0: i2s@1482000 {
+ compatible = "zte,zx296718-i2s", "zte,zx296702-i2s";
+ reg = <0x01482000 0x1000>;
+ clocks = <&audiocrm AUDIO_I2S0_WCLK>,
+ <&audiocrm AUDIO_I2S0_PCLK>;
+ clock-names = "wclk", "pclk";
+ assigned-clocks = <&audiocrm I2S0_WCLK_MUX>;
+ assigned-clock-parents = <&topcrm AUDIO_99M>;
+ interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dma 22>, <&dma 23>;
+ dma-names = "tx", "rx";
+ #sound-dai-cells = <0>;
+ status = "disabled";
+ };
+
+ i2c0: i2c@1486000 {
+ compatible = "zte,zx296718-i2c";
+ reg = <0x01486000 0x1000>;
+ interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&audiocrm AUDIO_I2C0_WCLK>;
+ clock-frequency = <1600000>;
+ status = "disabled";
+
+ aud96p22: codec@22 {
+ compatible = "zte,zx-aud96p22";
+ #sound-dai-cells = <0>;
+ reg = <0x22>;
+ };
+ };
+
spdif0: spdif@1488000 {
compatible = "zte,zx296702-spdif";
reg = <0x1488000 0x1000>;
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index cdde4f56a281..34480e9af2e7 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -3,6 +3,7 @@ CONFIG_POSIX_MQUEUE=y
CONFIG_AUDIT=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
@@ -68,6 +69,7 @@ CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_PCI_LAYERSCAPE=y
CONFIG_PCI_HISI=y
CONFIG_PCIE_QCOM=y
+CONFIG_PCIE_KIRIN=y
CONFIG_PCIE_ARMADA_8K=y
CONFIG_PCI_AARDVARK=y
CONFIG_PCIE_RCAR=y
@@ -88,6 +90,7 @@ CONFIG_XEN=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_COMPAT=y
CONFIG_HIBERNATION=y
+CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
CONFIG_ARM_CPUIDLE=y
CONFIG_CPU_FREQ=y
CONFIG_CPUFREQ_DT=y
@@ -164,6 +167,7 @@ CONFIG_EEPROM_AT25=m
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_HISI_SAS=y
+CONFIG_SCSI_HISI_SAS_PCI=y
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
@@ -251,6 +255,8 @@ CONFIG_SERIAL_MSM_CONSOLE=y
CONFIG_SERIAL_XILINX_PS_UART=y
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
CONFIG_SERIAL_MVEBU_UART=y
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MUX=y
@@ -280,6 +286,7 @@ CONFIG_SPI_ROCKCHIP=y
CONFIG_SPI_S3C64XX=y
CONFIG_SPI_SPIDEV=m
CONFIG_SPMI=y
+CONFIG_PINCTRL_IPQ8074=y
CONFIG_PINCTRL_SINGLE=y
CONFIG_PINCTRL_MAX77620=y
CONFIG_PINCTRL_MSM8916=y
@@ -298,6 +305,7 @@ CONFIG_GPIO_MAX77620=y
CONFIG_POWER_RESET_MSM=y
CONFIG_POWER_RESET_XGENE=y
CONFIG_POWER_RESET_SYSCON=y
+CONFIG_SYSCON_REBOOT_MODE=y
CONFIG_BATTERY_BQ27XXX=y
CONFIG_SENSORS_ARM_SCPI=y
CONFIG_SENSORS_LM90=m
@@ -305,6 +313,7 @@ CONFIG_SENSORS_INA2XX=m
CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
CONFIG_CPU_THERMAL=y
CONFIG_THERMAL_EMULATION=y
+CONFIG_BRCMSTB_THERMAL=m
CONFIG_EXYNOS_THERMAL=y
CONFIG_ROCKCHIP_THERMAL=m
CONFIG_WATCHDOG=y
@@ -312,19 +321,24 @@ CONFIG_S3C2410_WATCHDOG=y
CONFIG_MESON_GXBB_WATCHDOG=m
CONFIG_MESON_WATCHDOG=m
CONFIG_RENESAS_WDT=y
+CONFIG_UNIPHIER_WATCHDOG=y
CONFIG_BCM2835_WDT=y
+CONFIG_MFD_AXP20X_RSB=y
CONFIG_MFD_CROS_EC=y
CONFIG_MFD_CROS_EC_I2C=y
CONFIG_MFD_CROS_EC_SPI=y
CONFIG_MFD_EXYNOS_LPASS=m
+CONFIG_MFD_HI6421_PMIC=y
CONFIG_MFD_HI655X_PMIC=y
CONFIG_MFD_MAX77620=y
CONFIG_MFD_SPMI_PMIC=y
CONFIG_MFD_RK808=y
CONFIG_MFD_SEC_CORE=y
+CONFIG_REGULATOR_AXP20X=y
CONFIG_REGULATOR_FAN53555=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_HI6421V530=y
CONFIG_REGULATOR_HI655X=y
CONFIG_REGULATOR_MAX77620=y
CONFIG_REGULATOR_PWM=y
@@ -359,6 +373,12 @@ CONFIG_DRM_EXYNOS_DSI=y
# CONFIG_DRM_EXYNOS_DP is not set
CONFIG_DRM_EXYNOS_HDMI=y
CONFIG_DRM_EXYNOS_MIC=y
+CONFIG_DRM_ROCKCHIP=m
+CONFIG_ROCKCHIP_ANALOGIX_DP=y
+CONFIG_ROCKCHIP_CDN_DP=y
+CONFIG_ROCKCHIP_DW_HDMI=y
+CONFIG_ROCKCHIP_DW_MIPI_DSI=y
+CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_DRM_RCAR_DU=m
CONFIG_DRM_RCAR_LVDS=y
CONFIG_DRM_RCAR_VSP=y
@@ -371,6 +391,7 @@ CONFIG_DRM_MESON=m
CONFIG_FB=y
CONFIG_FB_ARMCLCD=y
CONFIG_BACKLIGHT_GENERIC=m
+CONFIG_BACKLIGHT_PWM=m
CONFIG_BACKLIGHT_LP855X=m
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
@@ -381,8 +402,8 @@ CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_BCM2835_SOC_I2S=m
CONFIG_SND_SOC_SAMSUNG=y
-CONFIG_SND_SOC_RCAR=y
-CONFIG_SND_SOC_AK4613=y
+CONFIG_SND_SOC_RCAR=m
+CONFIG_SND_SOC_AK4613=m
CONFIG_SND_SIMPLE_CARD=y
CONFIG_USB=y
CONFIG_USB_OTG=y
@@ -404,6 +425,7 @@ CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_ISP1760=y
CONFIG_USB_HSIC_USB3503=y
+CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_MSM_OTG=y
CONFIG_USB_QCOM_8X16_PHY=y
CONFIG_USB_ULPI=y
@@ -452,6 +474,7 @@ CONFIG_RTC_DRV_TEGRA=y
CONFIG_RTC_DRV_XGENE=y
CONFIG_DMADEVICES=y
CONFIG_DMA_BCM2835=m
+CONFIG_K3_DMA=y
CONFIG_MV_XOR_V2=y
CONFIG_PL330_DMA=y
CONFIG_TEGRA20_APB_DMA=y
@@ -474,6 +497,7 @@ CONFIG_CLK_QORIQ=y
CONFIG_COMMON_CLK_PWM=y
CONFIG_COMMON_CLK_QCOM=y
CONFIG_QCOM_CLK_SMD_RPM=y
+CONFIG_IPQ_GCC_8074=y
CONFIG_MSM_GCC_8916=y
CONFIG_MSM_GCC_8994=y
CONFIG_MSM_MMCC_8996=y
@@ -483,6 +507,7 @@ CONFIG_ARM_MHU=y
CONFIG_PLATFORM_MHU=y
CONFIG_BCM2835_MBOX=y
CONFIG_HI6220_MBOX=y
+CONFIG_ROCKCHIP_IOMMU=y
CONFIG_ARM_SMMU=y
CONFIG_ARM_SMMU_V3=y
CONFIG_RPMSG_QCOM_SMD=y
@@ -516,6 +541,8 @@ CONFIG_PHY_XGENE=y
CONFIG_PHY_TEGRA_XUSB=y
CONFIG_QCOM_L2_PMU=y
CONFIG_QCOM_L3_PMU=y
+CONFIG_TEE=y
+CONFIG_OPTEE=y
CONFIG_ARM_SCPI_PROTOCOL=y
CONFIG_RASPBERRYPI_FIRMWARE=y
CONFIG_EFI_CAPSULE_LOADER=y
@@ -564,8 +591,17 @@ CONFIG_SECURITY=y
CONFIG_CRYPTO_ECHAINIV=y
CONFIG_CRYPTO_ANSI_CPRNG=y
CONFIG_ARM64_CRYPTO=y
+CONFIG_CRYPTO_SHA256_ARM64=m
+CONFIG_CRYPTO_SHA512_ARM64=m
CONFIG_CRYPTO_SHA1_ARM64_CE=y
CONFIG_CRYPTO_SHA2_ARM64_CE=y
CONFIG_CRYPTO_GHASH_ARM64_CE=y
+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=m
+CONFIG_CRYPTO_CRC32_ARM64_CE=m
+CONFIG_CRYPTO_AES_ARM64=m
+CONFIG_CRYPTO_AES_ARM64_CE=m
CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=m
+CONFIG_CRYPTO_CHACHA20_NEON=m
+CONFIG_CRYPTO_AES_ARM64_BS=m
diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h
index 636c1bced7d4..1b266292f0be 100644
--- a/arch/arm64/include/asm/linkage.h
+++ b/arch/arm64/include/asm/linkage.h
@@ -1,7 +1,7 @@
#ifndef __ASM_LINKAGE_H
#define __ASM_LINKAGE_H
-#define __ALIGN .align 4
-#define __ALIGN_STR ".align 4"
+#define __ALIGN .align 2
+#define __ALIGN_STR ".align 2"
#endif
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index bc4e92337d16..b46e54c2399b 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -401,7 +401,7 @@ static inline phys_addr_t pmd_page_paddr(pmd_t pmd)
/* Find an entry in the third-level page table. */
#define pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-#define pte_offset_phys(dir,addr) (pmd_page_paddr(*(dir)) + pte_index(addr) * sizeof(pte_t))
+#define pte_offset_phys(dir,addr) (pmd_page_paddr(READ_ONCE(*(dir))) + pte_index(addr) * sizeof(pte_t))
#define pte_offset_kernel(dir,addr) ((pte_t *)__va(pte_offset_phys((dir), (addr))))
#define pte_offset_map(dir,addr) pte_offset_kernel((dir), (addr))
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 3a68cf38a6b3..f444f374bd7b 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -321,6 +321,8 @@ void kernel_neon_end(void)
}
EXPORT_SYMBOL(kernel_neon_end);
+#ifdef CONFIG_EFI
+
static DEFINE_PER_CPU(struct fpsimd_state, efi_fpsimd_state);
static DEFINE_PER_CPU(bool, efi_fpsimd_state_used);
@@ -370,6 +372,8 @@ void __efi_fpsimd_end(void)
kernel_neon_end();
}
+#endif /* CONFIG_EFI */
+
#endif /* CONFIG_KERNEL_MODE_NEON */
#ifdef CONFIG_CPU_PM
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 7434ec0c7a27..0b243ecaf7ac 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -384,6 +384,7 @@ ENTRY(kimage_vaddr)
* booted in EL1 or EL2 respectively.
*/
ENTRY(el2_setup)
+ msr SPsel, #1 // We want to use SP_EL{1,2}
mrs x0, CurrentEL
cmp x0, #CurrentEL_EL2
b.eq 1f
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index c45214f8fb54..0bdc96c61bc0 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -751,10 +751,10 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
*/
trace_hardirqs_off();
- /* Check valid user FS if needed */
- addr_limit_user_check();
-
do {
+ /* Check valid user FS if needed */
+ addr_limit_user_check();
+
if (thread_flags & _TIF_NEED_RESCHED) {
schedule();
} else {
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index 4e5a664be04b..e09bf5d15606 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -142,25 +142,25 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
*/
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad,
SI_PAD_SIZE);
- else switch (from->si_code & __SI_MASK) {
- case __SI_KILL:
+ else switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_TIMER:
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_int, &to->si_int);
break;
- case __SI_POLL:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_FAULT:
+ case SIL_FAULT:
err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr,
&to->si_addr);
#ifdef BUS_MCEERR_AO
@@ -173,29 +173,24 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
#endif
break;
- case __SI_CHLD:
+ case SIL_CHLD:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_status, &to->si_status);
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
break;
- case __SI_RT: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ: /* But this is */
+ case SIL_RT:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_int, &to->si_int);
break;
- case __SI_SYS:
+ case SIL_SYS:
err |= __put_user((compat_uptr_t)(unsigned long)
from->si_call_addr, &to->si_call_addr);
err |= __put_user(from->si_syscall, &to->si_syscall);
err |= __put_user(from->si_arch, &to->si_arch);
break;
- default: /* this is just in case for now ... */
- err |= __put_user(from->si_pid, &to->si_pid);
- err |= __put_user(from->si_uid, &to->si_uid);
- break;
}
return err;
}
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index 3144584617e7..76809ccd309c 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c
@@ -140,7 +140,8 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}
-void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+static noinline void __save_stack_trace(struct task_struct *tsk,
+ struct stack_trace *trace, unsigned int nosched)
{
struct stack_trace_data data;
struct stackframe frame;
@@ -150,15 +151,16 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
data.trace = trace;
data.skip = trace->skip;
+ data.no_sched_functions = nosched;
if (tsk != current) {
- data.no_sched_functions = 1;
frame.fp = thread_saved_fp(tsk);
frame.pc = thread_saved_pc(tsk);
} else {
- data.no_sched_functions = 0;
+ /* We don't want this function nor the caller */
+ data.skip += 2;
frame.fp = (unsigned long)__builtin_frame_address(0);
- frame.pc = (unsigned long)save_stack_trace_tsk;
+ frame.pc = (unsigned long)__save_stack_trace;
}
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
frame.graph = tsk->curr_ret_stack;
@@ -172,9 +174,15 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
}
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
+void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+{
+ __save_stack_trace(tsk, trace, 1);
+}
+
void save_stack_trace(struct stack_trace *trace)
{
- save_stack_trace_tsk(current, trace);
+ __save_stack_trace(current, trace, 0);
}
+
EXPORT_SYMBOL_GPL(save_stack_trace);
#endif
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 89993c4be1be..2069e9bc0fca 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -651,7 +651,7 @@ static const struct fault_info fault_info[] = {
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 0 translation fault" },
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 1 translation fault" },
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 2 translation fault" },
- { do_page_fault, SIGSEGV, SEGV_MAPERR, "level 3 translation fault" },
+ { do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 3 translation fault" },
{ do_bad, SIGBUS, 0, "unknown 8" },
{ do_page_fault, SIGSEGV, SEGV_ACCERR, "level 1 access flag fault" },
{ do_page_fault, SIGSEGV, SEGV_ACCERR, "level 2 access flag fault" },
diff --git a/arch/blackfin/include/asm/bfin_twi.h b/arch/blackfin/include/asm/bfin_twi.h
index aaa0834d34aa..211e9c78f6fb 100644
--- a/arch/blackfin/include/asm/bfin_twi.h
+++ b/arch/blackfin/include/asm/bfin_twi.h
@@ -1,7 +1,7 @@
/*
* bfin_twi.h - interface to Blackfin TWIs
*
- * Copyright 2005-2010 Analog Devices Inc.
+ * Copyright 2005-2014 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
@@ -10,6 +10,138 @@
#define __ASM_BFIN_TWI_H__
#include <asm/blackfin.h>
+#include <linux/types.h>
+#include <linux/i2c.h>
+
+/*
+ * ADI twi registers layout
+ */
+struct bfin_twi_regs {
+ u16 clkdiv;
+ u16 dummy1;
+ u16 control;
+ u16 dummy2;
+ u16 slave_ctl;
+ u16 dummy3;
+ u16 slave_stat;
+ u16 dummy4;
+ u16 slave_addr;
+ u16 dummy5;
+ u16 master_ctl;
+ u16 dummy6;
+ u16 master_stat;
+ u16 dummy7;
+ u16 master_addr;
+ u16 dummy8;
+ u16 int_stat;
+ u16 dummy9;
+ u16 int_mask;
+ u16 dummy10;
+ u16 fifo_ctl;
+ u16 dummy11;
+ u16 fifo_stat;
+ u16 dummy12;
+ u32 __pad[20];
+ u16 xmt_data8;
+ u16 dummy13;
+ u16 xmt_data16;
+ u16 dummy14;
+ u16 rcv_data8;
+ u16 dummy15;
+ u16 rcv_data16;
+ u16 dummy16;
+};
+
+struct bfin_twi_iface {
+ int irq;
+ spinlock_t lock;
+ char read_write;
+ u8 command;
+ u8 *transPtr;
+ int readNum;
+ int writeNum;
+ int cur_mode;
+ int manual_stop;
+ int result;
+ struct i2c_adapter adap;
+ struct completion complete;
+ struct i2c_msg *pmsg;
+ int msg_num;
+ int cur_msg;
+ u16 saved_clkdiv;
+ u16 saved_control;
+ struct bfin_twi_regs __iomem *regs_base;
+};
+
+/* ******************** TWO-WIRE INTERFACE (TWI) MASKS ********************/
+/* TWI_CLKDIV Macros (Use: *pTWI_CLKDIV = CLKLOW(x)|CLKHI(y); ) */
+#define CLKLOW(x) ((x) & 0xFF) /* Periods Clock Is Held Low */
+#define CLKHI(y) (((y)&0xFF)<<0x8) /* Periods Before New Clock Low */
+
+/* TWI_PRESCALE Masks */
+#define PRESCALE 0x007F /* SCLKs Per Internal Time Reference (10MHz) */
+#define TWI_ENA 0x0080 /* TWI Enable */
+#define SCCB 0x0200 /* SCCB Compatibility Enable */
+
+/* TWI_SLAVE_CTL Masks */
+#define SEN 0x0001 /* Slave Enable */
+#define SADD_LEN 0x0002 /* Slave Address Length */
+#define STDVAL 0x0004 /* Slave Transmit Data Valid */
+#define NAK 0x0008 /* NAK Generated At Conclusion Of Transfer */
+#define GEN 0x0010 /* General Call Address Matching Enabled */
+
+/* TWI_SLAVE_STAT Masks */
+#define SDIR 0x0001 /* Slave Transfer Direction (RX/TX*) */
+#define GCALL 0x0002 /* General Call Indicator */
+
+/* TWI_MASTER_CTL Masks */
+#define MEN 0x0001 /* Master Mode Enable */
+#define MADD_LEN 0x0002 /* Master Address Length */
+#define MDIR 0x0004 /* Master Transmit Direction (RX/TX*) */
+#define FAST 0x0008 /* Use Fast Mode Timing Specs */
+#define STOP 0x0010 /* Issue Stop Condition */
+#define RSTART 0x0020 /* Repeat Start or Stop* At End Of Transfer */
+#define DCNT 0x3FC0 /* Data Bytes To Transfer */
+#define SDAOVR 0x4000 /* Serial Data Override */
+#define SCLOVR 0x8000 /* Serial Clock Override */
+
+/* TWI_MASTER_STAT Masks */
+#define MPROG 0x0001 /* Master Transfer In Progress */
+#define LOSTARB 0x0002 /* Lost Arbitration Indicator (Xfer Aborted) */
+#define ANAK 0x0004 /* Address Not Acknowledged */
+#define DNAK 0x0008 /* Data Not Acknowledged */
+#define BUFRDERR 0x0010 /* Buffer Read Error */
+#define BUFWRERR 0x0020 /* Buffer Write Error */
+#define SDASEN 0x0040 /* Serial Data Sense */
+#define SCLSEN 0x0080 /* Serial Clock Sense */
+#define BUSBUSY 0x0100 /* Bus Busy Indicator */
+
+/* TWI_INT_SRC and TWI_INT_ENABLE Masks */
+#define SINIT 0x0001 /* Slave Transfer Initiated */
+#define SCOMP 0x0002 /* Slave Transfer Complete */
+#define SERR 0x0004 /* Slave Transfer Error */
+#define SOVF 0x0008 /* Slave Overflow */
+#define MCOMP 0x0010 /* Master Transfer Complete */
+#define MERR 0x0020 /* Master Transfer Error */
+#define XMTSERV 0x0040 /* Transmit FIFO Service */
+#define RCVSERV 0x0080 /* Receive FIFO Service */
+
+/* TWI_FIFO_CTRL Masks */
+#define XMTFLUSH 0x0001 /* Transmit Buffer Flush */
+#define RCVFLUSH 0x0002 /* Receive Buffer Flush */
+#define XMTINTLEN 0x0004 /* Transmit Buffer Interrupt Length */
+#define RCVINTLEN 0x0008 /* Receive Buffer Interrupt Length */
+
+/* TWI_FIFO_STAT Masks */
+#define XMTSTAT 0x0003 /* Transmit FIFO Status */
+#define XMT_EMPTY 0x0000 /* Transmit FIFO Empty */
+#define XMT_HALF 0x0001 /* Transmit FIFO Has 1 Byte To Write */
+#define XMT_FULL 0x0003 /* Transmit FIFO Full (2 Bytes To Write) */
+
+#define RCVSTAT 0x000C /* Receive FIFO Status */
+#define RCV_EMPTY 0x0000 /* Receive FIFO Empty */
+#define RCV_HALF 0x0004 /* Receive FIFO Has 1 Byte To Read */
+#define RCV_FULL 0x000C /* Receive FIFO Full (2 Bytes To Read) */
#define DEFINE_TWI_REG(reg_name, reg) \
static inline u16 read_##reg_name(struct bfin_twi_iface *iface) \
diff --git a/arch/blackfin/include/uapi/asm/siginfo.h b/arch/blackfin/include/uapi/asm/siginfo.h
index c72f4e6e386f..79dfe3979123 100644
--- a/arch/blackfin/include/uapi/asm/siginfo.h
+++ b/arch/blackfin/include/uapi/asm/siginfo.h
@@ -14,28 +14,36 @@
#define si_uid16 _sifields._kill._uid
-#define ILL_ILLPARAOP (__SI_FAULT|2) /* illegal opcode combine ********** */
-#define ILL_ILLEXCPT (__SI_FAULT|4) /* unrecoverable exception ********** */
-#define ILL_CPLB_VI (__SI_FAULT|9) /* D/I CPLB protect violation ******** */
-#define ILL_CPLB_MISS (__SI_FAULT|10) /* D/I CPLB miss ******** */
-#define ILL_CPLB_MULHIT (__SI_FAULT|11) /* D/I CPLB multiple hit ******** */
+#define ILL_ILLPARAOP 2 /* illegal opcode combine ********** */
+#define ILL_ILLEXCPT 4 /* unrecoverable exception ********** */
+#define ILL_CPLB_VI 9 /* D/I CPLB protect violation ******** */
+#define ILL_CPLB_MISS 10 /* D/I CPLB miss ******** */
+#define ILL_CPLB_MULHIT 11 /* D/I CPLB multiple hit ******** */
+#undef NSIGILL
+#define NSIGILL 11
/*
* SIGBUS si_codes
*/
-#define BUS_OPFETCH (__SI_FAULT|4) /* error from instruction fetch ******** */
+#define BUS_OPFETCH 4 /* error from instruction fetch ******** */
+#undef NSIGBUS
+#define NSIGBUS 4
/*
* SIGTRAP si_codes
*/
-#define TRAP_STEP (__SI_FAULT|1) /* single-step breakpoint************* */
-#define TRAP_TRACEFLOW (__SI_FAULT|2) /* trace buffer overflow ************* */
-#define TRAP_WATCHPT (__SI_FAULT|3) /* watchpoint match ************* */
-#define TRAP_ILLTRAP (__SI_FAULT|4) /* illegal trap ************* */
+#define TRAP_STEP 1 /* single-step breakpoint************* */
+#define TRAP_TRACEFLOW 2 /* trace buffer overflow ************* */
+#define TRAP_WATCHPT 3 /* watchpoint match ************* */
+#define TRAP_ILLTRAP 4 /* illegal trap ************* */
+#undef NSIGTRAP
+#define NSIGTRAP 4
/*
* SIGSEGV si_codes
*/
-#define SEGV_STACKFLOW (__SI_FAULT|3) /* stack overflow */
+#define SEGV_STACKFLOW 3 /* stack overflow */
+#undef NSIGSEGV
+#define NSIGSEGV 3
#endif /* _UAPI_BFIN_SIGINFO_H */
diff --git a/arch/blackfin/kernel/debug-mmrs.c b/arch/blackfin/kernel/debug-mmrs.c
index e272bca93c64..f31ace221392 100644
--- a/arch/blackfin/kernel/debug-mmrs.c
+++ b/arch/blackfin/kernel/debug-mmrs.c
@@ -10,7 +10,6 @@
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/module.h>
-#include <linux/i2c/bfin_twi.h>
#include <linux/gpio.h>
#include <asm/blackfin.h>
diff --git a/arch/blackfin/mach-bf537/boards/dnp5370.c b/arch/blackfin/mach-bf537/boards/dnp5370.c
index e79b3b810c39..c4a8ffb15417 100644
--- a/arch/blackfin/mach-bf537/boards/dnp5370.c
+++ b/arch/blackfin/mach-bf537/boards/dnp5370.c
@@ -17,7 +17,7 @@
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/plat-ram.h>
#include <linux/mtd/physmap.h>
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c
index 7528148dc492..400e6693643e 100644
--- a/arch/blackfin/mach-bf537/boards/stamp.c
+++ b/arch/blackfin/mach-bf537/boards/stamp.c
@@ -12,7 +12,7 @@
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/plat-ram.h>
#include <linux/mtd/physmap.h>
diff --git a/arch/blackfin/mach-bf561/boards/acvilon.c b/arch/blackfin/mach-bf561/boards/acvilon.c
index 37f8f25a1347..696cc9d7820a 100644
--- a/arch/blackfin/mach-bf561/boards/acvilon.c
+++ b/arch/blackfin/mach-bf561/boards/acvilon.c
@@ -38,7 +38,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/plat-ram.h>
#include <linux/spi/spi.h>
#include <linux/spi/flash.h>
diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h
index 7c87b5be53b5..8f7cce829f8e 100644
--- a/arch/c6x/include/asm/processor.h
+++ b/arch/c6x/include/asm/processor.h
@@ -92,9 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
{
}
-#define copy_segments(tsk, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-
/*
* saved kernel SP and DP of a blocked thread.
*/
diff --git a/arch/cris/arch-v32/drivers/mach-a3/nandflash.c b/arch/cris/arch-v32/drivers/mach-a3/nandflash.c
index 3f646c787e58..925a98eb6d68 100644
--- a/arch/cris/arch-v32/drivers/mach-a3/nandflash.c
+++ b/arch/cris/arch-v32/drivers/mach-a3/nandflash.c
@@ -16,7 +16,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <arch/memmap.h>
#include <hwregs/reg_map.h>
diff --git a/arch/cris/arch-v32/drivers/mach-fs/nandflash.c b/arch/cris/arch-v32/drivers/mach-fs/nandflash.c
index a74540514bdb..53b56a429dde 100644
--- a/arch/cris/arch-v32/drivers/mach-fs/nandflash.c
+++ b/arch/cris/arch-v32/drivers/mach-fs/nandflash.c
@@ -16,7 +16,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <arch/memmap.h>
#include <hwregs/reg_map.h>
diff --git a/arch/frv/include/asm/processor.h b/arch/frv/include/asm/processor.h
index e4d08d74ed9f..021cce78b401 100644
--- a/arch/frv/include/asm/processor.h
+++ b/arch/frv/include/asm/processor.h
@@ -92,10 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
extern asmlinkage void save_user_regs(struct user_context *target);
extern asmlinkage void *restore_user_regs(const struct user_context *target, ...);
-#define copy_segments(tsk, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-#define forget_segments() do { } while (0)
-
unsigned long get_wchan(struct task_struct *p);
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
diff --git a/arch/frv/include/uapi/asm/siginfo.h b/arch/frv/include/uapi/asm/siginfo.h
index d3fd1ca45653..f55d9e0e9068 100644
--- a/arch/frv/include/uapi/asm/siginfo.h
+++ b/arch/frv/include/uapi/asm/siginfo.h
@@ -4,7 +4,7 @@
#include <linux/types.h>
#include <asm-generic/siginfo.h>
-#define FPE_MDAOVF (__SI_FAULT|9) /* media overflow */
+#define FPE_MDAOVF 9 /* media overflow */
#undef NSIGFPE
#define NSIGFPE 9
diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug
index de9d507ba0fd..4763887ba368 100644
--- a/arch/ia64/Kconfig.debug
+++ b/arch/ia64/Kconfig.debug
@@ -56,9 +56,4 @@ config IA64_DEBUG_IRQ
and restore instructions. It's useful for tracking down spinlock
problems, but slow! If you're unsure, select N.
-config SYSVIPC_COMPAT
- bool
- depends on COMPAT && SYSVIPC
- default y
-
endmenu
diff --git a/arch/ia64/include/uapi/asm/siginfo.h b/arch/ia64/include/uapi/asm/siginfo.h
index 4694c64252d6..33389fc36f23 100644
--- a/arch/ia64/include/uapi/asm/siginfo.h
+++ b/arch/ia64/include/uapi/asm/siginfo.h
@@ -98,27 +98,30 @@ typedef struct siginfo {
/*
* SIGILL si_codes
*/
-#define ILL_BADIADDR (__SI_FAULT|9) /* unimplemented instruction address */
-#define __ILL_BREAK (__SI_FAULT|10) /* illegal break */
-#define __ILL_BNDMOD (__SI_FAULT|11) /* bundle-update (modification) in progress */
+#define ILL_BADIADDR 9 /* unimplemented instruction address */
+#define __ILL_BREAK 10 /* illegal break */
+#define __ILL_BNDMOD 11 /* bundle-update (modification) in progress */
#undef NSIGILL
#define NSIGILL 11
/*
* SIGFPE si_codes
*/
-#define __FPE_DECOVF (__SI_FAULT|9) /* decimal overflow */
-#define __FPE_DECDIV (__SI_FAULT|10) /* decimal division by zero */
-#define __FPE_DECERR (__SI_FAULT|11) /* packed decimal error */
-#define __FPE_INVASC (__SI_FAULT|12) /* invalid ASCII digit */
-#define __FPE_INVDEC (__SI_FAULT|13) /* invalid decimal digit */
+#ifdef __KERNEL__
+#define FPE_FIXME 0 /* Broken dup of SI_USER */
+#endif /* __KERNEL__ */
+#define __FPE_DECOVF 9 /* decimal overflow */
+#define __FPE_DECDIV 10 /* decimal division by zero */
+#define __FPE_DECERR 11 /* packed decimal error */
+#define __FPE_INVASC 12 /* invalid ASCII digit */
+#define __FPE_INVDEC 13 /* invalid decimal digit */
#undef NSIGFPE
#define NSIGFPE 13
/*
* SIGSEGV si_codes
*/
-#define __SEGV_PSTKOVF (__SI_FAULT|4) /* paragraph stack overflow */
+#define __SEGV_PSTKOVF 4 /* paragraph stack overflow */
#undef NSIGSEGV
#define NSIGSEGV 4
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 5db52c6813c4..6146d53b6ad7 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -124,31 +124,30 @@ copy_siginfo_to_user (siginfo_t __user *to, const siginfo_t *from)
*/
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
- switch (from->si_code >> 16) {
- case __SI_FAULT >> 16:
+ err |= __put_user(from->si_code, &to->si_code);
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_FAULT:
err |= __put_user(from->si_flags, &to->si_flags);
err |= __put_user(from->si_isr, &to->si_isr);
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_addr, &to->si_addr);
err |= __put_user(from->si_imm, &to->si_imm);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_ptr, &to->si_ptr);
break;
- case __SI_RT >> 16: /* Not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_ptr, &to->si_ptr);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
- default:
+ case SIL_KILL:
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_pid, &to->si_pid);
break;
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c
index 7b1fe9462158..3cb17cf9b362 100644
--- a/arch/ia64/kernel/traps.c
+++ b/arch/ia64/kernel/traps.c
@@ -349,7 +349,7 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
}
siginfo.si_signo = SIGFPE;
siginfo.si_errno = 0;
- siginfo.si_code = __SI_FAULT; /* default code */
+ siginfo.si_code = FPE_FIXME; /* default code */
siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
if (isr & 0x11) {
siginfo.si_code = FPE_FLTINV;
@@ -373,7 +373,7 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
/* raise exception */
siginfo.si_signo = SIGFPE;
siginfo.si_errno = 0;
- siginfo.si_code = __SI_FAULT; /* default code */
+ siginfo.si_code = FPE_FIXME; /* default code */
siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
if (isr & 0x880) {
siginfo.si_code = FPE_FLTOVF;
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig
index 87cde1e4b38c..0777f3a8a1f3 100644
--- a/arch/m32r/Kconfig
+++ b/arch/m32r/Kconfig
@@ -194,6 +194,10 @@ config TIMER_DIVIDE
int "Timer divider (integer)"
default "128"
+config CPU_BIG_ENDIAN
+ bool "Generate big endian code"
+ default n
+
config CPU_LITTLE_ENDIAN
bool "Generate little endian code"
default n
diff --git a/arch/m32r/include/asm/processor.h b/arch/m32r/include/asm/processor.h
index 657874eeeccc..c70fa9ac7169 100644
--- a/arch/m32r/include/asm/processor.h
+++ b/arch/m32r/include/asm/processor.h
@@ -118,14 +118,6 @@ struct mm_struct;
/* Free all resources held by a thread. */
extern void release_thread(struct task_struct *);
-/* Copy and release all segment info associated with a VM */
-extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
-extern void release_segments(struct mm_struct * mm);
-
-/* Copy and release all segment info associated with a VM */
-#define copy_segments(p, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-
unsigned long get_wchan(struct task_struct *p);
#define KSTK_EIP(tsk) ((tsk)->thread.lr)
#define KSTK_ESP(tsk) ((tsk)->thread.sp)
diff --git a/arch/m32r/kernel/traps.c b/arch/m32r/kernel/traps.c
index 647dd94a0c39..72b96f282689 100644
--- a/arch/m32r/kernel/traps.c
+++ b/arch/m32r/kernel/traps.c
@@ -114,6 +114,15 @@ static void set_eit_vector_entries(void)
_flush_cache_copyback_all();
}
+void abort(void)
+{
+ BUG();
+
+ /* if that doesn't kill us, halt */
+ panic("Oops failed to kill thread");
+}
+EXPORT_SYMBOL(abort);
+
void __init trap_init(void)
{
set_eit_vector_entries();
diff --git a/arch/m68k/coldfire/clk.c b/arch/m68k/coldfire/clk.c
index 1e3c7e9193d1..856069a3196d 100644
--- a/arch/m68k/coldfire/clk.c
+++ b/arch/m68k/coldfire/clk.c
@@ -121,6 +121,9 @@ EXPORT_SYMBOL(clk_put);
unsigned long clk_get_rate(struct clk *clk)
{
+ if (!clk)
+ return 0;
+
return clk->rate;
}
EXPORT_SYMBOL(clk_get_rate);
diff --git a/arch/m68k/coldfire/m5441x.c b/arch/m68k/coldfire/m5441x.c
index dc589b039b62..04fd7fde9fb3 100644
--- a/arch/m68k/coldfire/m5441x.c
+++ b/arch/m68k/coldfire/m5441x.c
@@ -222,40 +222,3 @@ void __init config_BSP(char *commandp, int size)
m5441x_uarts_init();
m5441x_fec_init();
}
-
-
-#if IS_ENABLED(CONFIG_RTC_DRV_M5441x)
-static struct resource m5441x_rtc_resources[] = {
- {
- .start = MCFRTC_BASE,
- .end = MCFRTC_BASE + MCFRTC_SIZE - 1,
- .flags = IORESOURCE_MEM,
- },
- {
- .start = MCF_IRQ_RTC,
- .end = MCF_IRQ_RTC,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static struct platform_device m5441x_rtc = {
- .name = "mcfrtc",
- .id = 0,
- .resource = m5441x_rtc_resources,
- .num_resources = ARRAY_SIZE(m5441x_rtc_resources),
-};
-#endif
-
-static struct platform_device *m5441x_devices[] __initdata = {
-#if IS_ENABLED(CONFIG_RTC_DRV_M5441x)
- &m5441x_rtc,
-#endif
-};
-
-static int __init init_BSP(void)
-{
- platform_add_devices(m5441x_devices, ARRAY_SIZE(m5441x_devices));
- return 0;
-}
-
-arch_initcall(init_BSP);
diff --git a/arch/m68k/include/asm/page.h b/arch/m68k/include/asm/page.h
index 430d4d54c883..d8a02c7e72d3 100644
--- a/arch/m68k/include/asm/page.h
+++ b/arch/m68k/include/asm/page.h
@@ -32,7 +32,7 @@ typedef struct page *pgtable_t;
#define pgprot_val(x) ((x).pgprot)
#define __pte(x) ((pte_t) { (x) } )
-#define __pmd(x) ((pmd_t) { (x) } )
+#define __pmd(x) ((pmd_t) { { (x) }, })
#define __pgd(x) ((pgd_t) { (x) } )
#define __pgprot(x) ((pgprot_t) { (x) } )
diff --git a/arch/metag/include/asm/dma-mapping.h b/arch/metag/include/asm/dma-mapping.h
index fad3dc3cb210..ea573be2b6d0 100644
--- a/arch/metag/include/asm/dma-mapping.h
+++ b/arch/metag/include/asm/dma-mapping.h
@@ -9,7 +9,7 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
}
/*
- * dma_alloc_noncoherent() returns non-cacheable memory, so there's no need to
+ * dma_alloc_attrs() always returns non-cacheable memory, so there's no need to
* do any flushing here.
*/
static inline void
diff --git a/arch/metag/include/asm/processor.h b/arch/metag/include/asm/processor.h
index ec6a49076980..8ae92d6abfd2 100644
--- a/arch/metag/include/asm/processor.h
+++ b/arch/metag/include/asm/processor.h
@@ -131,9 +131,6 @@ static inline void release_thread(struct task_struct *dead_task)
{
}
-#define copy_segments(tsk, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-
/*
* Return saved PC of a blocked thread.
*/
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 9d26abdf0dc1..4f798aa671dd 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -39,7 +39,7 @@ config MICROBLAZE
# Endianness selection
choice
prompt "Endianness selection"
- default CPU_BIG_ENDIAN
+ default CPU_LITTLE_ENDIAN
help
microblaze architectures can be configured for either little or
big endian formats. Be sure to select the appropriate mode.
diff --git a/arch/microblaze/include/uapi/asm/Kbuild b/arch/microblaze/include/uapi/asm/Kbuild
index e77a596f3f1e..06609ca36115 100644
--- a/arch/microblaze/include/uapi/asm/Kbuild
+++ b/arch/microblaze/include/uapi/asm/Kbuild
@@ -7,6 +7,7 @@ generic-y += fcntl.h
generic-y += ioctl.h
generic-y += ioctls.h
generic-y += ipcbuf.h
+generic-y += kvm_para.h
generic-y += mman.h
generic-y += msgbuf.h
generic-y += param.h
diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c
index e45ada8fb006..94700c5270a9 100644
--- a/arch/microblaze/kernel/dma.c
+++ b/arch/microblaze/kernel/dma.c
@@ -165,7 +165,7 @@ int dma_direct_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
unsigned long attrs)
{
#ifdef CONFIG_MMU
- unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+ unsigned long user_count = vma_pages(vma);
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
unsigned long off = vma->vm_pgoff;
unsigned long pfn;
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 48d91d5be4e9..cb7fcc4216fd 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1627,14 +1627,6 @@ config CPU_R5500
NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV
instruction set.
-config CPU_R6000
- bool "R6000"
- depends on SYS_HAS_CPU_R6000
- select CPU_SUPPORTS_32BIT_KERNEL
- help
- MIPS Technologies R6000 and R6000A series processors. Note these
- processors are extremely rare and the support for them is incomplete.
-
config CPU_NEVADA
bool "RM52xx"
depends on SYS_HAS_CPU_NEVADA
@@ -1950,9 +1942,6 @@ config SYS_HAS_CPU_R5432
config SYS_HAS_CPU_R5500
bool
-config SYS_HAS_CPU_R6000
- bool
-
config SYS_HAS_CPU_NEVADA
bool
@@ -2180,7 +2169,7 @@ config PAGE_SIZE_32KB
config PAGE_SIZE_64KB
bool "64kB"
- depends on !CPU_R3000 && !CPU_TX39XX && !CPU_R6000
+ depends on !CPU_R3000 && !CPU_TX39XX
help
Using 64kB page size will result in higher performance kernel at
the price of higher memory consumption. This option is available on
@@ -2248,11 +2237,11 @@ config CPU_HAS_PREFETCH
config CPU_GENERIC_DUMP_TLB
bool
- default y if !(CPU_R3000 || CPU_R6000 || CPU_R8000 || CPU_TX39XX)
+ default y if !(CPU_R3000 || CPU_R8000 || CPU_TX39XX)
config CPU_R4K_FPU
bool
- default y if !(CPU_R3000 || CPU_R6000 || CPU_TX39XX || CPU_CAVIUM_OCTEON)
+ default y if !(CPU_R3000 || CPU_TX39XX)
config CPU_R4K_CACHE_TLB
bool
@@ -2260,6 +2249,7 @@ config CPU_R4K_CACHE_TLB
config MIPS_MT_SMP
bool "MIPS MT SMP support (1 TC on each available VPE)"
+ default y
depends on SYS_SUPPORTS_MULTITHREADING && !CPU_MIPSR6 && !CPU_MICROMIPS
select CPU_MIPSR2_IRQ_VI
select CPU_MIPSR2_IRQ_EI
@@ -2376,7 +2366,6 @@ config MIPS_CPS
bool "MIPS Coherent Processing System support"
depends on SYS_SUPPORTS_MIPS_CPS
select MIPS_CM
- select MIPS_CPC
select MIPS_CPS_PM if HOTPLUG_CPU
select SMP
select SYNC_R4K if (CEVT_R4K || CSRC_R4K)
@@ -2393,11 +2382,11 @@ config MIPS_CPS
config MIPS_CPS_PM
depends on MIPS_CPS
- select MIPS_CPC
bool
config MIPS_CM
bool
+ select MIPS_CPC
config MIPS_CPC
bool
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index bc2708c9ada4..a96d97a806c9 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -151,7 +151,6 @@ cflags-y += -fno-stack-check
#
cflags-$(CONFIG_CPU_R3000) += -march=r3000
cflags-$(CONFIG_CPU_TX39XX) += -march=r3900
-cflags-$(CONFIG_CPU_R6000) += -march=r6000 -Wa,--trap
cflags-$(CONFIG_CPU_R4300) += -march=r4300 -Wa,--trap
cflags-$(CONFIG_CPU_VR41XX) += -march=r4100 -Wa,--trap
cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap
@@ -291,7 +290,8 @@ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
VMLINUX_ENTRY_ADDRESS=$(entry-y) \
- PLATFORM="$(platform-y)"
+ PLATFORM="$(platform-y)" \
+ ITS_INPUTS="$(its-y)"
ifdef CONFIG_32BIT
bootvars-y += ADDR_BITS=32
endif
@@ -299,6 +299,10 @@ ifdef CONFIG_64BIT
bootvars-y += ADDR_BITS=64
endif
+# This is required to get dwarf unwinding tables into .debug_frame
+# instead of .eh_frame so we don't discard them.
+KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
+
LDFLAGS += -m $(ld-emul)
ifdef CONFIG_MIPS
@@ -500,8 +504,14 @@ $(eval $(call gen_generic_defconfigs,micro32,r2,eb el))
.PHONY: $(generic_defconfigs)
$(generic_defconfigs):
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh \
- -m -O $(objtree) $(srctree)/arch/$(ARCH)/configs/generic_defconfig $^ \
- $(foreach board,$(BOARDS),$(generic_config_dir)/board-$(board).config)
+ -m -O $(objtree) $(srctree)/arch/$(ARCH)/configs/generic_defconfig $^ | \
+ grep -Ev '^#'
+ $(Q)cp $(KCONFIG_CONFIG) $(objtree)/.config.$@
+ $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig \
+ KCONFIG_CONFIG=$(objtree)/.config.$@ >/dev/null
+ $(Q)$(CONFIG_SHELL) $(srctree)/arch/$(ARCH)/tools/generic-board-config.sh \
+ $(srctree) $(objtree) $(objtree)/.config.$@ $(KCONFIG_CONFIG) \
+ "$(origin BOARDS)" $(BOARDS)
$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
#
@@ -510,6 +520,19 @@ $(generic_defconfigs):
$(generic_config_dir)/%.config: ;
#
+# Prevent direct use of generic_defconfig, which is intended to be used as the
+# basis of the various ISA-specific targets generated above.
+#
+.PHONY: generic_defconfig
+generic_defconfig:
+ $(Q)echo "generic_defconfig is not intended for direct use, but should instead be"
+ $(Q)echo "used via an ISA-specific target from the following list:"
+ $(Q)echo
+ $(Q)for cfg in $(generic_defconfigs); do echo " $${cfg}"; done
+ $(Q)echo
+ $(Q)false
+
+#
# Legacy defconfig compatibility - these targets used to be real defconfigs but
# now that the boards have been converted to use the generic kernel they are
# wrappers around the generic rules above.
diff --git a/arch/mips/alchemy/devboards/db1200.c b/arch/mips/alchemy/devboards/db1200.c
index 992442a03d8b..da7663770425 100644
--- a/arch/mips/alchemy/devboards/db1200.c
+++ b/arch/mips/alchemy/devboards/db1200.c
@@ -29,7 +29,7 @@
#include <linux/leds.h>
#include <linux/mmc/host.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
#include <linux/serial_8250.h>
@@ -344,28 +344,32 @@ static struct platform_device db1200_ide_dev = {
/* SD carddetects: they're supposed to be edge-triggered, but ack
* doesn't seem to work (CPLD Rev 2). Instead, the screaming one
- * is disabled and its counterpart enabled. The 500ms timeout is
- * because the carddetect isn't debounced in hardware.
+ * is disabled and its counterpart enabled. The 200ms timeout is
+ * because the carddetect usually triggers twice, after debounce.
*/
static irqreturn_t db1200_mmc_cd(int irq, void *ptr)
{
- void(*mmc_cd)(struct mmc_host *, unsigned long);
+ disable_irq_nosync(irq);
+ return IRQ_WAKE_THREAD;
+}
- if (irq == DB1200_SD0_INSERT_INT) {
- disable_irq_nosync(DB1200_SD0_INSERT_INT);
- enable_irq(DB1200_SD0_EJECT_INT);
- } else {
- disable_irq_nosync(DB1200_SD0_EJECT_INT);
- enable_irq(DB1200_SD0_INSERT_INT);
- }
+static irqreturn_t db1200_mmc_cdfn(int irq, void *ptr)
+{
+ void (*mmc_cd)(struct mmc_host *, unsigned long);
/* link against CONFIG_MMC=m */
mmc_cd = symbol_get(mmc_detect_change);
if (mmc_cd) {
- mmc_cd(ptr, msecs_to_jiffies(500));
+ mmc_cd(ptr, msecs_to_jiffies(200));
symbol_put(mmc_detect_change);
}
+ msleep(100); /* debounce */
+ if (irq == DB1200_SD0_INSERT_INT)
+ enable_irq(DB1200_SD0_EJECT_INT);
+ else
+ enable_irq(DB1200_SD0_INSERT_INT);
+
return IRQ_HANDLED;
}
@@ -374,13 +378,13 @@ static int db1200_mmc_cd_setup(void *mmc_host, int en)
int ret;
if (en) {
- ret = request_irq(DB1200_SD0_INSERT_INT, db1200_mmc_cd,
- 0, "sd_insert", mmc_host);
+ ret = request_threaded_irq(DB1200_SD0_INSERT_INT, db1200_mmc_cd,
+ db1200_mmc_cdfn, 0, "sd_insert", mmc_host);
if (ret)
goto out;
- ret = request_irq(DB1200_SD0_EJECT_INT, db1200_mmc_cd,
- 0, "sd_eject", mmc_host);
+ ret = request_threaded_irq(DB1200_SD0_EJECT_INT, db1200_mmc_cd,
+ db1200_mmc_cdfn, 0, "sd_eject", mmc_host);
if (ret) {
free_irq(DB1200_SD0_INSERT_INT, mmc_host);
goto out;
@@ -436,23 +440,27 @@ static struct led_classdev db1200_mmc_led = {
static irqreturn_t pb1200_mmc1_cd(int irq, void *ptr)
{
- void(*mmc_cd)(struct mmc_host *, unsigned long);
+ disable_irq_nosync(irq);
+ return IRQ_WAKE_THREAD;
+}
- if (irq == PB1200_SD1_INSERT_INT) {
- disable_irq_nosync(PB1200_SD1_INSERT_INT);
- enable_irq(PB1200_SD1_EJECT_INT);
- } else {
- disable_irq_nosync(PB1200_SD1_EJECT_INT);
- enable_irq(PB1200_SD1_INSERT_INT);
- }
+static irqreturn_t pb1200_mmc1_cdfn(int irq, void *ptr)
+{
+ void (*mmc_cd)(struct mmc_host *, unsigned long);
/* link against CONFIG_MMC=m */
mmc_cd = symbol_get(mmc_detect_change);
if (mmc_cd) {
- mmc_cd(ptr, msecs_to_jiffies(500));
+ mmc_cd(ptr, msecs_to_jiffies(200));
symbol_put(mmc_detect_change);
}
+ msleep(100); /* debounce */
+ if (irq == PB1200_SD1_INSERT_INT)
+ enable_irq(PB1200_SD1_EJECT_INT);
+ else
+ enable_irq(PB1200_SD1_INSERT_INT);
+
return IRQ_HANDLED;
}
@@ -461,13 +469,13 @@ static int pb1200_mmc1_cd_setup(void *mmc_host, int en)
int ret;
if (en) {
- ret = request_irq(PB1200_SD1_INSERT_INT, pb1200_mmc1_cd, 0,
- "sd1_insert", mmc_host);
+ ret = request_threaded_irq(PB1200_SD1_INSERT_INT, pb1200_mmc1_cd,
+ pb1200_mmc1_cdfn, 0, "sd1_insert", mmc_host);
if (ret)
goto out;
- ret = request_irq(PB1200_SD1_EJECT_INT, pb1200_mmc1_cd, 0,
- "sd1_eject", mmc_host);
+ ret = request_threaded_irq(PB1200_SD1_EJECT_INT, pb1200_mmc1_cd,
+ pb1200_mmc1_cdfn, 0, "sd1_eject", mmc_host);
if (ret) {
free_irq(PB1200_SD1_INSERT_INT, mmc_host);
goto out;
diff --git a/arch/mips/alchemy/devboards/db1300.c b/arch/mips/alchemy/devboards/db1300.c
index a5504f57cb00..cd1ae29f95a3 100644
--- a/arch/mips/alchemy/devboards/db1300.c
+++ b/arch/mips/alchemy/devboards/db1300.c
@@ -18,7 +18,7 @@
#include <linux/mmc/host.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
#include <linux/smsc911x.h>
@@ -450,24 +450,27 @@ static struct platform_device db1300_ide_dev = {
static irqreturn_t db1300_mmc_cd(int irq, void *ptr)
{
- void(*mmc_cd)(struct mmc_host *, unsigned long);
+ disable_irq_nosync(irq);
+ return IRQ_WAKE_THREAD;
+}
- /* disable the one currently screaming. No other way to shut it up */
- if (irq == DB1300_SD1_INSERT_INT) {
- disable_irq_nosync(DB1300_SD1_INSERT_INT);
- enable_irq(DB1300_SD1_EJECT_INT);
- } else {
- disable_irq_nosync(DB1300_SD1_EJECT_INT);
- enable_irq(DB1300_SD1_INSERT_INT);
- }
+static irqreturn_t db1300_mmc_cdfn(int irq, void *ptr)
+{
+ void (*mmc_cd)(struct mmc_host *, unsigned long);
/* link against CONFIG_MMC=m. We can only be called once MMC core has
* initialized the controller, so symbol_get() should always succeed.
*/
mmc_cd = symbol_get(mmc_detect_change);
- mmc_cd(ptr, msecs_to_jiffies(500));
+ mmc_cd(ptr, msecs_to_jiffies(200));
symbol_put(mmc_detect_change);
+ msleep(100); /* debounce */
+ if (irq == DB1300_SD1_INSERT_INT)
+ enable_irq(DB1300_SD1_EJECT_INT);
+ else
+ enable_irq(DB1300_SD1_INSERT_INT);
+
return IRQ_HANDLED;
}
@@ -487,13 +490,13 @@ static int db1300_mmc_cd_setup(void *mmc_host, int en)
int ret;
if (en) {
- ret = request_irq(DB1300_SD1_INSERT_INT, db1300_mmc_cd, 0,
- "sd_insert", mmc_host);
+ ret = request_threaded_irq(DB1300_SD1_INSERT_INT, db1300_mmc_cd,
+ db1300_mmc_cdfn, 0, "sd_insert", mmc_host);
if (ret)
goto out;
- ret = request_irq(DB1300_SD1_EJECT_INT, db1300_mmc_cd, 0,
- "sd_eject", mmc_host);
+ ret = request_threaded_irq(DB1300_SD1_EJECT_INT, db1300_mmc_cd,
+ db1300_mmc_cdfn, 0, "sd_eject", mmc_host);
if (ret) {
free_irq(DB1300_SD1_INSERT_INT, mmc_host);
goto out;
diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c
index 1c01d6eadb08..421bd5793f7e 100644
--- a/arch/mips/alchemy/devboards/db1550.c
+++ b/arch/mips/alchemy/devboards/db1550.c
@@ -12,7 +12,7 @@
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
#include <linux/pm.h>
diff --git a/arch/mips/alchemy/devboards/db1xxx.c b/arch/mips/alchemy/devboards/db1xxx.c
index 2d47f951121a..c9ad28995cd2 100644
--- a/arch/mips/alchemy/devboards/db1xxx.c
+++ b/arch/mips/alchemy/devboards/db1xxx.c
@@ -2,6 +2,7 @@
* Alchemy DB/PB1xxx board support.
*/
+#include <asm/prom.h>
#include <asm/mach-au1x00/au1000.h>
#include <asm/mach-db1x00/bcsr.h>
@@ -97,6 +98,7 @@ arch_initcall(db1xxx_arch_init);
static int __init db1xxx_dev_init(void)
{
+ mips_set_machine_name(board_type_str());
switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
case BCSR_WHOAMI_DB1000:
case BCSR_WHOAMI_DB1500:
diff --git a/arch/mips/ar7/clock.c b/arch/mips/ar7/clock.c
index dda422a0f36c..0137656107a9 100644
--- a/arch/mips/ar7/clock.c
+++ b/arch/mips/ar7/clock.c
@@ -430,6 +430,9 @@ EXPORT_SYMBOL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
+ if (!clk)
+ return 0;
+
return clk->rate;
}
EXPORT_SYMBOL(clk_get_rate);
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c
index fa845953f736..6b1000b6a6a6 100644
--- a/arch/mips/ath79/clock.c
+++ b/arch/mips/ath79/clock.c
@@ -487,17 +487,16 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np)
{
struct clk *ref_clk;
void __iomem *pll_base;
- const char *dnfn = of_node_full_name(np);
ref_clk = of_clk_get(np, 0);
if (IS_ERR(ref_clk)) {
- pr_err("%s: of_clk_get failed\n", dnfn);
+ pr_err("%pOF: of_clk_get failed\n", np);
goto err;
}
pll_base = of_iomap(np, 0);
if (!pll_base) {
- pr_err("%s: can't map pll registers\n", dnfn);
+ pr_err("%pOF: can't map pll registers\n", np);
goto err_clk;
}
@@ -506,12 +505,12 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np)
else if (of_device_is_compatible(np, "qca,ar9330-pll"))
ar9330_clk_init(ref_clk, pll_base);
else {
- pr_err("%s: could not find any appropriate clk_init()\n", dnfn);
+ pr_err("%pOF: could not find any appropriate clk_init()\n", np);
goto err_iounmap;
}
if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) {
- pr_err("%s: could not register clk provider\n", dnfn);
+ pr_err("%pOF: could not register clk provider\n", np);
goto err_iounmap;
}
diff --git a/arch/mips/ath79/pci.c b/arch/mips/ath79/pci.c
index 730c0b03060d..b816cb4a25ff 100644
--- a/arch/mips/ath79/pci.c
+++ b/arch/mips/ath79/pci.c
@@ -22,10 +22,10 @@
#include "pci.h"
static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
-static const struct ath79_pci_irq *ath79_pci_irq_map __initdata;
-static unsigned ath79_pci_nr_irqs __initdata;
+static const struct ath79_pci_irq *ath79_pci_irq_map;
+static unsigned ath79_pci_nr_irqs;
-static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
+static const struct ath79_pci_irq ar71xx_pci_irq_map[] = {
{
.slot = 17,
.pin = 1,
@@ -41,7 +41,7 @@ static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
}
};
-static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
+static const struct ath79_pci_irq ar724x_pci_irq_map[] = {
{
.slot = 0,
.pin = 1,
@@ -49,7 +49,7 @@ static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
}
};
-static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
+static const struct ath79_pci_irq qca955x_pci_irq_map[] = {
{
.bus = 0,
.slot = 0,
@@ -64,7 +64,7 @@ static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
},
};
-int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
+int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
{
int irq = -1;
int i;
diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c
index 73626040e4d6..19577f771c1f 100644
--- a/arch/mips/bcm63xx/clk.c
+++ b/arch/mips/bcm63xx/clk.c
@@ -339,6 +339,9 @@ EXPORT_SYMBOL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
+ if (!clk)
+ return 0;
+
return clk->rate;
}
diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile
index 145b5ce8eb7e..1bd5c4f00d19 100644
--- a/arch/mips/boot/Makefile
+++ b/arch/mips/boot/Makefile
@@ -118,6 +118,12 @@ ifeq ($(ADDR_BITS),64)
itb_addr_cells = 2
endif
+quiet_cmd_its_cat = CAT $@
+ cmd_its_cat = cat $^ >$@
+
+$(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS))
+ $(call if_changed,its_cat)
+
quiet_cmd_cpp_its_S = ITS $@
cmd_cpp_its_S = $(CPP) $(cpp_flags) -P -C -o $@ $< \
-DKERNEL_NAME="\"Linux $(KERNELRELEASE)\"" \
@@ -128,19 +134,19 @@ quiet_cmd_cpp_its_S = ITS $@
-DADDR_BITS=$(ADDR_BITS) \
-DADDR_CELLS=$(itb_addr_cells)
-$(obj)/vmlinux.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE
+$(obj)/vmlinux.its: $(obj)/vmlinux.its.S $(VMLINUX) FORCE
$(call if_changed_dep,cpp_its_S,none,vmlinux.bin)
-$(obj)/vmlinux.gz.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE
+$(obj)/vmlinux.gz.its: $(obj)/vmlinux.its.S $(VMLINUX) FORCE
$(call if_changed_dep,cpp_its_S,gzip,vmlinux.bin.gz)
-$(obj)/vmlinux.bz2.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE
+$(obj)/vmlinux.bz2.its: $(obj)/vmlinux.its.S $(VMLINUX) FORCE
$(call if_changed_dep,cpp_its_S,bzip2,vmlinux.bin.bz2)
-$(obj)/vmlinux.lzma.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE
+$(obj)/vmlinux.lzma.its: $(obj)/vmlinux.its.S $(VMLINUX) FORCE
$(call if_changed_dep,cpp_its_S,lzma,vmlinux.bin.lzma)
-$(obj)/vmlinux.lzo.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE
+$(obj)/vmlinux.lzo.its: $(obj)/vmlinux.its.S $(VMLINUX) FORCE
$(call if_changed_dep,cpp_its_S,lzo,vmlinux.bin.lzo)
quiet_cmd_itb-image = ITB $@
diff --git a/arch/mips/boot/dts/Makefile b/arch/mips/boot/dts/Makefile
index b9db49203e0c..cbac26ce063e 100644
--- a/arch/mips/boot/dts/Makefile
+++ b/arch/mips/boot/dts/Makefile
@@ -5,6 +5,7 @@ dts-dirs += ingenic
dts-dirs += lantiq
dts-dirs += mti
dts-dirs += netlogic
+dts-dirs += ni
dts-dirs += pic32
dts-dirs += qca
dts-dirs += ralink
diff --git a/arch/mips/boot/dts/ingenic/ci20.dts b/arch/mips/boot/dts/ingenic/ci20.dts
index fd138d9978c1..6c381844929c 100644
--- a/arch/mips/boot/dts/ingenic/ci20.dts
+++ b/arch/mips/boot/dts/ingenic/ci20.dts
@@ -1,6 +1,7 @@
/dts-v1/;
#include "jz4780.dtsi"
+#include <dt-bindings/gpio/gpio.h>
/ {
compatible = "img,ci20", "ingenic,jz4780";
@@ -21,6 +22,13 @@
reg = <0x0 0x10000000
0x30000000 0x30000000>;
};
+
+ eth0_power: fixedregulator@0 {
+ compatible = "regulator-fixed";
+ regulator-name = "eth0_power";
+ gpio = <&gpb 25 GPIO_ACTIVE_LOW>;
+ enable-active-high;
+ };
};
&ext {
@@ -123,6 +131,29 @@
};
};
};
+
+ dm9000@6 {
+ compatible = "davicom,dm9000";
+ davicom,no-eeprom;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&pins_nemc_cs6>;
+
+ reg = <6 0 1 /* addr */
+ 6 2 1>; /* data */
+
+ ingenic,nemc-tAS = <15>;
+ ingenic,nemc-tAH = <10>;
+ ingenic,nemc-tBP = <20>;
+ ingenic,nemc-tAW = <50>;
+ ingenic,nemc-tSTRV = <100>;
+
+ reset-gpios = <&gpf 12 GPIO_ACTIVE_HIGH>;
+ vcc-supply = <&eth0_power>;
+
+ interrupt-parent = <&gpe>;
+ interrupts = <19 4>;
+ };
};
&bch {
@@ -165,4 +196,10 @@
groups = "nemc-cs1";
bias-disable;
};
+
+ pins_nemc_cs6: nemc-cs6 {
+ function = "nemc-cs6";
+ groups = "nemc-cs6";
+ bias-disable;
+ };
};
diff --git a/arch/mips/boot/dts/ingenic/jz4780.dtsi b/arch/mips/boot/dts/ingenic/jz4780.dtsi
index 4853ef67b3ab..e906134ecaef 100644
--- a/arch/mips/boot/dts/ingenic/jz4780.dtsi
+++ b/arch/mips/boot/dts/ingenic/jz4780.dtsi
@@ -44,6 +44,17 @@
#clock-cells = <1>;
};
+ rtc_dev: rtc@10003000 {
+ compatible = "ingenic,jz4780-rtc";
+ reg = <0x10003000 0x4c>;
+
+ interrupt-parent = <&intc>;
+ interrupts = <32>;
+
+ clocks = <&cgu JZ4780_CLK_RTCLK>;
+ clock-names = "rtc";
+ };
+
pinctrl: pin-controller@10010000 {
compatible = "ingenic,jz4780-pinctrl";
reg = <0x10010000 0x600>;
diff --git a/arch/mips/boot/dts/ni/169445.dts b/arch/mips/boot/dts/ni/169445.dts
new file mode 100644
index 000000000000..5389ef46c480
--- /dev/null
+++ b/arch/mips/boot/dts/ni/169445.dts
@@ -0,0 +1,100 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "ni,169445";
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ cpu@0 {
+ device_type = "cpu";
+ compatible = "mti,mips14KEc";
+ clocks = <&baseclk>;
+ reg = <0>;
+ };
+ };
+
+ memory@0 {
+ device_type = "memory";
+ reg = <0x0 0x10000000>;
+ };
+
+ baseclk: baseclock {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <50000000>;
+ };
+
+ cpu_intc: interrupt-controller {
+ #address-cells = <0>;
+ compatible = "mti,cpu-interrupt-controller";
+ interrupt-controller;
+ #interrupt-cells = <1>;
+ };
+
+ ahb@1f300000 {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x1f300000 0x80FFF>;
+
+ gpio1: gpio@10 {
+ compatible = "ni,169445-nand-gpio";
+ reg = <0x10 0x4>;
+ reg-names = "dat";
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gpio2: gpio@14 {
+ compatible = "ni,169445-nand-gpio";
+ reg = <0x14 0x4>;
+ reg-names = "dat";
+ gpio-controller;
+ #gpio-cells = <2>;
+ no-output;
+ };
+
+ nand@0 {
+ compatible = "gpio-control-nand";
+ nand-on-flash-bbt;
+ nand-ecc-mode = "soft_bch";
+ nand-ecc-step-size = <512>;
+ nand-ecc-strength = <4>;
+ reg = <0x0 4>;
+ gpios = <&gpio2 0 0>, /* rdy */
+ <&gpio1 1 0>, /* nce */
+ <&gpio1 2 0>, /* ale */
+ <&gpio1 3 0>, /* cle */
+ <&gpio1 4 0>; /* nwp */
+ };
+
+ serial@80000 {
+ compatible = "ns16550a";
+ reg = <0x80000 0x1000>;
+ interrupt-parent = <&cpu_intc>;
+ interrupts = <6>;
+ clocks = <&baseclk>;
+ reg-shift = <0>;
+ };
+
+ ethernet@40000 {
+ compatible = "snps,dwmac-4.10a";
+ interrupt-parent = <&cpu_intc>;
+ interrupts = <5>;
+ interrupt-names = "macirq";
+ reg = <0x40000 0x2000>;
+ clock-names = "stmmaceth", "pclk";
+ clocks = <&baseclk>, <&baseclk>;
+
+ phy-mode = "rgmii";
+
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ };
+ };
+ };
+};
diff --git a/arch/mips/boot/dts/ni/Makefile b/arch/mips/boot/dts/ni/Makefile
new file mode 100644
index 000000000000..66cfdffc51c2
--- /dev/null
+++ b/arch/mips/boot/dts/ni/Makefile
@@ -0,0 +1,7 @@
+dtb-$(CONFIG_FIT_IMAGE_FDT_NI169445) += 169445.dtb
+
+# Force kbuild to make empty built-in.o if necessary
+obj- += dummy.o
+
+always := $(dtb-y)
+clean-files := *.dtb *.dtb.S
diff --git a/arch/mips/boot/dts/ralink/Makefile b/arch/mips/boot/dts/ralink/Makefile
index 2a7225954bf6..55e2937b61f3 100644
--- a/arch/mips/boot/dts/ralink/Makefile
+++ b/arch/mips/boot/dts/ralink/Makefile
@@ -2,6 +2,8 @@ dtb-$(CONFIG_DTB_RT2880_EVAL) += rt2880_eval.dtb
dtb-$(CONFIG_DTB_RT305X_EVAL) += rt3052_eval.dtb
dtb-$(CONFIG_DTB_RT3883_EVAL) += rt3883_eval.dtb
dtb-$(CONFIG_DTB_MT7620A_EVAL) += mt7620a_eval.dtb
+dtb-$(CONFIG_DTB_OMEGA2P) += omega2p.dtb
+dtb-$(CONFIG_DTB_VOCORE2) += vocore2.dtb
obj-y += $(patsubst %.dtb, %.dtb.o, $(dtb-y))
diff --git a/arch/mips/boot/dts/ralink/mt7628a.dtsi b/arch/mips/boot/dts/ralink/mt7628a.dtsi
new file mode 100644
index 000000000000..9ff7e8faaecc
--- /dev/null
+++ b/arch/mips/boot/dts/ralink/mt7628a.dtsi
@@ -0,0 +1,126 @@
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "ralink,mt7628a-soc";
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu@0 {
+ compatible = "mti,mips24KEc";
+ device_type = "cpu";
+ reg = <0>;
+ };
+ };
+
+ resetc: reset-controller {
+ compatible = "ralink,rt2880-reset";
+ #reset-cells = <1>;
+ };
+
+ cpuintc: interrupt-controller {
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ compatible = "mti,cpu-interrupt-controller";
+ };
+
+ palmbus@10000000 {
+ compatible = "palmbus";
+ reg = <0x10000000 0x200000>;
+ ranges = <0x0 0x10000000 0x1FFFFF>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ sysc: system-controller@0 {
+ compatible = "ralink,mt7620a-sysc", "syscon";
+ reg = <0x0 0x100>;
+ };
+
+ intc: interrupt-controller@200 {
+ compatible = "ralink,rt2880-intc";
+ reg = <0x200 0x100>;
+
+ interrupt-controller;
+ #interrupt-cells = <1>;
+
+ resets = <&resetc 9>;
+ reset-names = "intc";
+
+ interrupt-parent = <&cpuintc>;
+ interrupts = <2>;
+
+ ralink,intc-registers = <0x9c 0xa0
+ 0x6c 0xa4
+ 0x80 0x78>;
+ };
+
+ memory-controller@300 {
+ compatible = "ralink,mt7620a-memc";
+ reg = <0x300 0x100>;
+ };
+
+ uart0: uartlite@c00 {
+ compatible = "ns16550a";
+ reg = <0xc00 0x100>;
+
+ resets = <&resetc 12>;
+ reset-names = "uart0";
+
+ interrupt-parent = <&intc>;
+ interrupts = <20>;
+
+ reg-shift = <2>;
+ };
+
+ uart1: uart1@d00 {
+ compatible = "ns16550a";
+ reg = <0xd00 0x100>;
+
+ resets = <&resetc 19>;
+ reset-names = "uart1";
+
+ interrupt-parent = <&intc>;
+ interrupts = <21>;
+
+ reg-shift = <2>;
+ };
+
+ uart2: uart2@e00 {
+ compatible = "ns16550a";
+ reg = <0xe00 0x100>;
+
+ resets = <&resetc 20>;
+ reset-names = "uart2";
+
+ interrupt-parent = <&intc>;
+ interrupts = <22>;
+
+ reg-shift = <2>;
+ };
+ };
+
+ usb_phy: usb-phy@10120000 {
+ compatible = "mediatek,mt7628-usbphy";
+ reg = <0x10120000 0x1000>;
+
+ #phy-cells = <0>;
+
+ ralink,sysctl = <&sysc>;
+ resets = <&resetc 22 &resetc 25>;
+ reset-names = "host", "device";
+ };
+
+ ehci@101c0000 {
+ compatible = "generic-ehci";
+ reg = <0x101c0000 0x1000>;
+
+ phys = <&usb_phy>;
+ phy-names = "usb";
+
+ interrupt-parent = <&intc>;
+ interrupts = <18>;
+ };
+};
diff --git a/arch/mips/boot/dts/ralink/omega2p.dts b/arch/mips/boot/dts/ralink/omega2p.dts
new file mode 100644
index 000000000000..5884fd48f59a
--- /dev/null
+++ b/arch/mips/boot/dts/ralink/omega2p.dts
@@ -0,0 +1,18 @@
+/dts-v1/;
+
+/include/ "mt7628a.dtsi"
+
+/ {
+ compatible = "onion,omega2+", "ralink,mt7688a-soc", "ralink,mt7628a-soc";
+ model = "Onion Omega2+";
+
+ memory@0 {
+ device_type = "memory";
+ reg = <0x0 0x8000000>;
+ };
+
+ chosen {
+ bootargs = "console=ttyS0,115200";
+ stdout-path = &uart0;
+ };
+};
diff --git a/arch/mips/boot/dts/ralink/vocore2.dts b/arch/mips/boot/dts/ralink/vocore2.dts
new file mode 100644
index 000000000000..fa8a5f8f236a
--- /dev/null
+++ b/arch/mips/boot/dts/ralink/vocore2.dts
@@ -0,0 +1,18 @@
+/dts-v1/;
+
+#include "mt7628a.dtsi"
+
+/ {
+ compatible = "vocore,vocore2", "ralink,mt7628a-soc";
+ model = "VoCore2";
+
+ memory@0 {
+ device_type = "memory";
+ reg = <0x0 0x8000000>;
+ };
+
+ chosen {
+ bootargs = "console=ttyS2,115200";
+ stdout-path = &uart2;
+ };
+};
diff --git a/arch/mips/cavium-octeon/executive/Makefile b/arch/mips/cavium-octeon/executive/Makefile
index b6d6e841a984..50b427879465 100644
--- a/arch/mips/cavium-octeon/executive/Makefile
+++ b/arch/mips/cavium-octeon/executive/Makefile
@@ -16,4 +16,4 @@ obj-y += cvmx-pko.o cvmx-spi.o cvmx-cmd-queue.o \
cvmx-helper-loop.o cvmx-helper-spi.o cvmx-helper-util.o \
cvmx-interrupt-decodes.o cvmx-interrupt-rsl.o
-obj-y += cvmx-helper-errata.o cvmx-helper-jtag.o
+obj-y += cvmx-helper-errata.o cvmx-helper-jtag.o cvmx-boot-vector.o
diff --git a/arch/mips/cavium-octeon/executive/cvmx-boot-vector.c b/arch/mips/cavium-octeon/executive/cvmx-boot-vector.c
new file mode 100644
index 000000000000..b7019d21808e
--- /dev/null
+++ b/arch/mips/cavium-octeon/executive/cvmx-boot-vector.c
@@ -0,0 +1,167 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2004-2017 Cavium, Inc.
+ */
+
+
+/*
+ We install this program at the bootvector:
+------------------------------------
+ .set noreorder
+ .set nomacro
+ .set noat
+reset_vector:
+ dmtc0 $k0, $31, 0 # Save $k0 to DESAVE
+ dmtc0 $k1, $31, 3 # Save $k1 to KScratch2
+
+ mfc0 $k0, $12, 0 # Status
+ mfc0 $k1, $15, 1 # Ebase
+
+ ori $k0, 0x84 # Enable 64-bit addressing, set
+ # ERL (should already be set)
+ andi $k1, 0x3ff # mask out core ID
+
+ mtc0 $k0, $12, 0 # Status
+ sll $k1, 5
+
+ lui $k0, 0xbfc0
+ cache 17, 0($0) # Core-14345, clear L1 Dcache virtual
+ # tags if the core hit an NMI
+
+ ld $k0, 0x78($k0) # k0 <- (bfc00078) pointer to the reset vector
+ synci 0($0) # Invalidate ICache to get coherent
+ # view of target code.
+
+ daddu $k0, $k0, $k1
+ nop
+
+ ld $k0, 0($k0) # k0 <- core specific target address
+ dmfc0 $k1, $31, 3 # Restore $k1 from KScratch2
+
+ beqz $k0, wait_loop # Spin in wait loop
+ nop
+
+ jr $k0
+ nop
+
+ nop # NOPs needed here to fill delay slots
+ nop # on endian reversal of previous instructions
+
+wait_loop:
+ wait
+ nop
+
+ b wait_loop
+ nop
+
+ nop
+ nop
+------------------------------------
+
+0000000000000000 <reset_vector>:
+ 0: 40baf800 dmtc0 k0,c0_desave
+ 4: 40bbf803 dmtc0 k1,c0_kscratch2
+
+ 8: 401a6000 mfc0 k0,c0_status
+ c: 401b7801 mfc0 k1,c0_ebase
+
+ 10: 375a0084 ori k0,k0,0x84
+ 14: 337b03ff andi k1,k1,0x3ff
+
+ 18: 409a6000 mtc0 k0,c0_status
+ 1c: 001bd940 sll k1,k1,0x5
+
+ 20: 3c1abfc0 lui k0,0xbfc0
+ 24: bc110000 cache 0x11,0(zero)
+
+ 28: df5a0078 ld k0,120(k0)
+ 2c: 041f0000 synci 0(zero)
+
+ 30: 035bd02d daddu k0,k0,k1
+ 34: 00000000 nop
+
+ 38: df5a0000 ld k0,0(k0)
+ 3c: 403bf803 dmfc0 k1,c0_kscratch2
+
+ 40: 13400005 beqz k0,58 <wait_loop>
+ 44: 00000000 nop
+
+ 48: 03400008 jr k0
+ 4c: 00000000 nop
+
+ 50: 00000000 nop
+ 54: 00000000 nop
+
+0000000000000058 <wait_loop>:
+ 58: 42000020 wait
+ 5c: 00000000 nop
+
+ 60: 1000fffd b 58 <wait_loop>
+ 64: 00000000 nop
+
+ 68: 00000000 nop
+ 6c: 00000000 nop
+
+ */
+
+#include <asm/octeon/cvmx-boot-vector.h>
+
+static unsigned long long _cvmx_bootvector_data[16] = {
+ 0x40baf80040bbf803ull, /* patch low order 8-bits if no KScratch*/
+ 0x401a6000401b7801ull,
+ 0x375a0084337b03ffull,
+ 0x409a6000001bd940ull,
+ 0x3c1abfc0bc110000ull,
+ 0xdf5a0078041f0000ull,
+ 0x035bd02d00000000ull,
+ 0xdf5a0000403bf803ull, /* patch low order 8-bits if no KScratch*/
+ 0x1340000500000000ull,
+ 0x0340000800000000ull,
+ 0x0000000000000000ull,
+ 0x4200002000000000ull,
+ 0x1000fffd00000000ull,
+ 0x0000000000000000ull,
+ OCTEON_BOOT_MOVEABLE_MAGIC1,
+ 0 /* To be filled in with address of vector block*/
+};
+
+/* 2^10 CPUs */
+#define VECTOR_TABLE_SIZE (1024 * sizeof(struct cvmx_boot_vector_element))
+
+static void cvmx_boot_vector_init(void *mem)
+{
+ uint64_t kseg0_mem;
+ int i;
+
+ memset(mem, 0, VECTOR_TABLE_SIZE);
+ kseg0_mem = cvmx_ptr_to_phys(mem) | 0x8000000000000000ull;
+
+ for (i = 0; i < 15; i++) {
+ uint64_t v = _cvmx_bootvector_data[i];
+
+ if (OCTEON_IS_OCTEON1PLUS() && (i == 0 || i == 7))
+ v &= 0xffffffff00000000ull; /* KScratch not availble. */
+ cvmx_write_csr(CVMX_MIO_BOOT_LOC_ADR, i * 8);
+ cvmx_write_csr(CVMX_MIO_BOOT_LOC_DAT, v);
+ }
+ cvmx_write_csr(CVMX_MIO_BOOT_LOC_ADR, 15 * 8);
+ cvmx_write_csr(CVMX_MIO_BOOT_LOC_DAT, kseg0_mem);
+ cvmx_write_csr(CVMX_MIO_BOOT_LOC_CFGX(0), 0x81fc0000);
+}
+
+/**
+ * Get a pointer to the per-core table of reset vector pointers
+ *
+ */
+struct cvmx_boot_vector_element *cvmx_boot_vector_get(void)
+{
+ struct cvmx_boot_vector_element *ret;
+
+ ret = cvmx_bootmem_alloc_named_range_once(VECTOR_TABLE_SIZE, 0,
+ (1ull << 32) - 1, 8, "__boot_vector1__", cvmx_boot_vector_init);
+ return ret;
+}
+EXPORT_SYMBOL(cvmx_boot_vector_get);
diff --git a/arch/mips/cavium-octeon/executive/cvmx-bootmem.c b/arch/mips/cavium-octeon/executive/cvmx-bootmem.c
index 8d54d774933c..94d97ebfa036 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-bootmem.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-bootmem.c
@@ -44,6 +44,55 @@ static struct cvmx_bootmem_desc *cvmx_bootmem_desc;
/* See header file for descriptions of functions */
+/**
+ * This macro returns the size of a member of a structure.
+ * Logically it is the same as "sizeof(s::field)" in C++, but
+ * C lacks the "::" operator.
+ */
+#define SIZEOF_FIELD(s, field) sizeof(((s *)NULL)->field)
+
+/**
+ * This macro returns a member of the
+ * cvmx_bootmem_named_block_desc_t structure. These members can't
+ * be directly addressed as they might be in memory not directly
+ * reachable. In the case where bootmem is compiled with
+ * LINUX_HOST, the structure itself might be located on a remote
+ * Octeon. The argument "field" is the member name of the
+ * cvmx_bootmem_named_block_desc_t to read. Regardless of the type
+ * of the field, the return type is always a uint64_t. The "addr"
+ * parameter is the physical address of the structure.
+ */
+#define CVMX_BOOTMEM_NAMED_GET_FIELD(addr, field) \
+ __cvmx_bootmem_desc_get(addr, \
+ offsetof(struct cvmx_bootmem_named_block_desc, field), \
+ SIZEOF_FIELD(struct cvmx_bootmem_named_block_desc, field))
+
+/**
+ * This function is the implementation of the get macros defined
+ * for individual structure members. The argument are generated
+ * by the macros inorder to read only the needed memory.
+ *
+ * @param base 64bit physical address of the complete structure
+ * @param offset Offset from the beginning of the structure to the member being
+ * accessed.
+ * @param size Size of the structure member.
+ *
+ * @return Value of the structure member promoted into a uint64_t.
+ */
+static inline uint64_t __cvmx_bootmem_desc_get(uint64_t base, int offset,
+ int size)
+{
+ base = (1ull << 63) | (base + offset);
+ switch (size) {
+ case 4:
+ return cvmx_read64_uint32(base);
+ case 8:
+ return cvmx_read64_uint64(base);
+ default:
+ return 0;
+ }
+}
+
/*
* Wrapper functions are provided for reading/writing the size and
* next block values as these may not be directly addressible (in 32
@@ -98,6 +147,42 @@ void *cvmx_bootmem_alloc(uint64_t size, uint64_t alignment)
return cvmx_bootmem_alloc_range(size, alignment, 0, 0);
}
+void *cvmx_bootmem_alloc_named_range_once(uint64_t size, uint64_t min_addr,
+ uint64_t max_addr, uint64_t align,
+ char *name,
+ void (*init) (void *))
+{
+ int64_t addr;
+ void *ptr;
+ uint64_t named_block_desc_addr;
+
+ named_block_desc_addr = (uint64_t)
+ cvmx_bootmem_phy_named_block_find(name,
+ (uint32_t)CVMX_BOOTMEM_FLAG_NO_LOCKING);
+
+ if (named_block_desc_addr) {
+ addr = CVMX_BOOTMEM_NAMED_GET_FIELD(named_block_desc_addr,
+ base_addr);
+ return cvmx_phys_to_ptr(addr);
+ }
+
+ addr = cvmx_bootmem_phy_named_block_alloc(size, min_addr, max_addr,
+ align, name,
+ (uint32_t)CVMX_BOOTMEM_FLAG_NO_LOCKING);
+
+ if (addr < 0)
+ return NULL;
+ ptr = cvmx_phys_to_ptr(addr);
+
+ if (init)
+ init(ptr);
+ else
+ memset(ptr, 0, size);
+
+ return ptr;
+}
+EXPORT_SYMBOL(cvmx_bootmem_alloc_named_range_once);
+
void *cvmx_bootmem_alloc_named_range(uint64_t size, uint64_t min_addr,
uint64_t max_addr, uint64_t align,
char *name)
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c
index c1eb1ff7c800..5b3a3f6a9ad3 100644
--- a/arch/mips/cavium-octeon/octeon-irq.c
+++ b/arch/mips/cavium-octeon/octeon-irq.c
@@ -2963,3 +2963,12 @@ void octeon_fixup_irqs(void)
}
#endif /* CONFIG_HOTPLUG_CPU */
+
+struct irq_domain *octeon_irq_get_block_domain(int node, uint8_t block)
+{
+ struct octeon_ciu3_info *ciu3_info;
+
+ ciu3_info = octeon_ciu3_info_per_node[node & CVMX_NODE_MASK];
+ return ciu3_info->domain[block];
+}
+EXPORT_SYMBOL(octeon_irq_get_block_domain);
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index 3de786545ded..75e7c8625659 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -205,7 +205,7 @@ int plat_post_relocation(long offset)
* Firmware CPU startup hook
*
*/
-static void octeon_boot_secondary(int cpu, struct task_struct *idle)
+static int octeon_boot_secondary(int cpu, struct task_struct *idle)
{
int count;
@@ -223,8 +223,12 @@ static void octeon_boot_secondary(int cpu, struct task_struct *idle)
udelay(1);
count--;
}
- if (count == 0)
+ if (count == 0) {
pr_err("Secondary boot timeout\n");
+ return -ETIMEDOUT;
+ }
+
+ return 0;
}
/**
@@ -408,7 +412,7 @@ late_initcall(register_cavium_notifier);
#endif /* CONFIG_HOTPLUG_CPU */
-struct plat_smp_ops octeon_smp_ops = {
+const struct plat_smp_ops octeon_smp_ops = {
.send_ipi_single = octeon_send_ipi_single,
.send_ipi_mask = octeon_send_ipi_mask,
.init_secondary = octeon_init_secondary,
@@ -485,7 +489,7 @@ static void octeon_78xx_send_ipi_mask(const struct cpumask *mask,
octeon_78xx_send_ipi_single(cpu, action);
}
-static struct plat_smp_ops octeon_78xx_smp_ops = {
+static const struct plat_smp_ops octeon_78xx_smp_ops = {
.send_ipi_single = octeon_78xx_send_ipi_single,
.send_ipi_mask = octeon_78xx_send_ipi_mask,
.init_secondary = octeon_init_secondary,
@@ -501,7 +505,7 @@ static struct plat_smp_ops octeon_78xx_smp_ops = {
void __init octeon_setup_smp(void)
{
- struct plat_smp_ops *ops;
+ const struct plat_smp_ops *ops;
if (octeon_has_feature(OCTEON_FEATURE_CIU3))
ops = &octeon_78xx_smp_ops;
diff --git a/arch/mips/configs/cavium_octeon_defconfig b/arch/mips/configs/cavium_octeon_defconfig
index e5b18f1a31a0..490b12af103c 100644
--- a/arch/mips/configs/cavium_octeon_defconfig
+++ b/arch/mips/configs/cavium_octeon_defconfig
@@ -60,11 +60,8 @@ CONFIG_BLK_DEV_SD=y
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
-CONFIG_AHCI_OCTEON=y
CONFIG_PATA_OCTEON_CF=y
-CONFIG_SATA_SIL=y
CONFIG_NETDEVICES=y
-CONFIG_MII=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set
# CONFIG_NET_VENDOR_ALTEON is not set
@@ -121,22 +118,30 @@ CONFIG_SPI=y
CONFIG_SPI_OCTEON=y
# CONFIG_HWMON is not set
CONFIG_WATCHDOG=y
-CONFIG_USB=m
-CONFIG_USB_EHCI_HCD=m
-CONFIG_USB_EHCI_HCD_PLATFORM=m
-CONFIG_USB_OHCI_HCD=m
-CONFIG_USB_OHCI_HCD_PLATFORM=m
+CONFIG_USB=y
+# CONFIG_USB_PCI is not set
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_DWC3=y
CONFIG_MMC=y
# CONFIG_PWRSEQ_EMMC is not set
# CONFIG_PWRSEQ_SIMPLE is not set
-# CONFIG_MMC_BLOCK_BOUNCE is not set
CONFIG_MMC_CAVIUM_OCTEON=y
+CONFIG_EDAC=y
+CONFIG_EDAC_OCTEON_PC=y
+CONFIG_EDAC_OCTEON_L2C=y
+CONFIG_EDAC_OCTEON_LMC=y
+CONFIG_EDAC_OCTEON_PCI=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_DS1307=y
CONFIG_STAGING=y
CONFIG_OCTEON_ETHERNET=y
-CONFIG_OCTEON_USB=m
# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_RAS=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
diff --git a/arch/mips/configs/ci20_defconfig b/arch/mips/configs/ci20_defconfig
index b42cfa7865f9..5ea3104a3aca 100644
--- a/arch/mips/configs/ci20_defconfig
+++ b/arch/mips/configs/ci20_defconfig
@@ -91,6 +91,7 @@ CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_I2C=y
CONFIG_I2C_JZ4780=y
CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_INGENIC=y
# CONFIG_HWMON is not set
CONFIG_REGULATOR=y
CONFIG_REGULATOR_DEBUG=y
@@ -99,6 +100,8 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
# CONFIG_HID is not set
# CONFIG_USB_SUPPORT is not set
CONFIG_MMC=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_JZ4740=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_MEMORY=y
# CONFIG_DNOTIFY is not set
diff --git a/arch/mips/configs/generic/board-ni169445.config b/arch/mips/configs/generic/board-ni169445.config
new file mode 100644
index 000000000000..f72223b366ca
--- /dev/null
+++ b/arch/mips/configs/generic/board-ni169445.config
@@ -0,0 +1,30 @@
+# require CONFIG_CPU_MIPS32_R2=y
+# require CONFIG_CPU_LITTLE_ENDIAN=y
+
+CONFIG_FIT_IMAGE_FDT_NI169445=y
+
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
+
+CONFIG_MTD=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CMDLINE_PARTS=y
+
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_NAND_ECC_BCH=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_GPIO=y
+CONFIG_MTD_NAND_IDS=y
+
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_BLOCK=y
+
+CONFIG_NETDEVICES=y
+CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_PLATFORM=y
+CONFIG_DWMAC_GENERIC=y
diff --git a/arch/mips/configs/generic/board-sead-3.config b/arch/mips/configs/generic/board-sead-3.config
index 3b5e1ac579eb..df49a592dbb5 100644
--- a/arch/mips/configs/generic/board-sead-3.config
+++ b/arch/mips/configs/generic/board-sead-3.config
@@ -1,3 +1,5 @@
+# require CONFIG_32BIT=y
+
CONFIG_LEGACY_BOARD_SEAD3=y
CONFIG_AUXDISPLAY=y
diff --git a/arch/mips/configs/generic_defconfig b/arch/mips/configs/generic_defconfig
index 91aacf2ef26d..26b1cd5ffbf5 100644
--- a/arch/mips/configs/generic_defconfig
+++ b/arch/mips/configs/generic_defconfig
@@ -3,7 +3,7 @@ CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_MIPS_CPS=y
CONFIG_CPU_HAS_MSA=y
CONFIG_HIGHMEM=y
-CONFIG_NR_CPUS=2
+CONFIG_NR_CPUS=16
CONFIG_MIPS_O32_FP64_SUPPORT=y
CONFIG_SYSVIPC=y
CONFIG_NO_HZ_IDLE=y
@@ -61,7 +61,6 @@ CONFIG_HID_KENSINGTON=y
CONFIG_HID_LOGITECH=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MONTEREY=y
-# CONFIG_USB_SUPPORT is not set
# CONFIG_MIPS_PLATFORM_DEVICES is not set
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXT4_FS=y
diff --git a/arch/mips/configs/gpr_defconfig b/arch/mips/configs/gpr_defconfig
index b1911816337c..55438fc9991e 100644
--- a/arch/mips/configs/gpr_defconfig
+++ b/arch/mips/configs/gpr_defconfig
@@ -111,12 +111,8 @@ CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
CONFIG_WAN_ROUTER=m
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
diff --git a/arch/mips/configs/lemote2f_defconfig b/arch/mips/configs/lemote2f_defconfig
index 1ec8ed8d05d1..02be95c1b712 100644
--- a/arch/mips/configs/lemote2f_defconfig
+++ b/arch/mips/configs/lemote2f_defconfig
@@ -37,7 +37,6 @@ CONFIG_PM=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION="/dev/hda3"
CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_DEBUG=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig
index 078ecac071ab..396408404487 100644
--- a/arch/mips/configs/malta_defconfig
+++ b/arch/mips/configs/malta_defconfig
@@ -2,7 +2,6 @@ CONFIG_MIPS_MALTA=y
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CPU_MIPS32_R2=y
CONFIG_PAGE_SIZE_16KB=y
-CONFIG_MIPS_MT_SMP=y
CONFIG_NR_CPUS=8
CONFIG_HZ_100=y
CONFIG_SYSVIPC=y
diff --git a/arch/mips/configs/malta_kvm_defconfig b/arch/mips/configs/malta_kvm_defconfig
index 80ecd94ed126..5691673a3327 100644
--- a/arch/mips/configs/malta_kvm_defconfig
+++ b/arch/mips/configs/malta_kvm_defconfig
@@ -2,7 +2,6 @@ CONFIG_MIPS_MALTA=y
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CPU_MIPS32_R2=y
CONFIG_PAGE_SIZE_16KB=y
-CONFIG_MIPS_MT_SMP=y
CONFIG_NR_CPUS=8
CONFIG_HZ_100=y
CONFIG_SYSVIPC=y
diff --git a/arch/mips/configs/malta_kvm_guest_defconfig b/arch/mips/configs/malta_kvm_guest_defconfig
index 35ad1f8d1a79..e9cadb37d684 100644
--- a/arch/mips/configs/malta_kvm_guest_defconfig
+++ b/arch/mips/configs/malta_kvm_guest_defconfig
@@ -3,6 +3,7 @@ CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CPU_MIPS32_R2=y
CONFIG_KVM_GUEST=y
CONFIG_PAGE_SIZE_16KB=y
+# CONFIG_MIPS_MT_SMP is not set
CONFIG_HZ_100=y
CONFIG_SYSVIPC=y
CONFIG_NO_HZ=y
diff --git a/arch/mips/configs/maltasmvp_defconfig b/arch/mips/configs/maltasmvp_defconfig
index 55b68b981b05..d8c8f5fb8918 100644
--- a/arch/mips/configs/maltasmvp_defconfig
+++ b/arch/mips/configs/maltasmvp_defconfig
@@ -2,7 +2,6 @@ CONFIG_MIPS_MALTA=y
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CPU_MIPS32_R2=y
CONFIG_PAGE_SIZE_16KB=y
-CONFIG_MIPS_MT_SMP=y
CONFIG_SCHED_SMT=y
CONFIG_MIPS_CPS=y
CONFIG_NR_CPUS=8
diff --git a/arch/mips/configs/maltasmvp_eva_defconfig b/arch/mips/configs/maltasmvp_eva_defconfig
index 5ca590cf1635..04827bc9f87f 100644
--- a/arch/mips/configs/maltasmvp_eva_defconfig
+++ b/arch/mips/configs/maltasmvp_eva_defconfig
@@ -3,7 +3,6 @@ CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CPU_MIPS32_R2=y
CONFIG_CPU_MIPS32_3_5_FEATURES=y
CONFIG_PAGE_SIZE_16KB=y
-CONFIG_MIPS_MT_SMP=y
CONFIG_SCHED_SMT=y
CONFIG_MIPS_CPS=y
CONFIG_NR_CPUS=8
diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig
index 4011f1869e72..c3d0d0a6e044 100644
--- a/arch/mips/configs/mtx1_defconfig
+++ b/arch/mips/configs/mtx1_defconfig
@@ -146,12 +146,8 @@ CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
CONFIG_WAN_ROUTER=m
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig
index 5720ce23e9aa..7357248b3d7a 100644
--- a/arch/mips/configs/nlm_xlp_defconfig
+++ b/arch/mips/configs/nlm_xlp_defconfig
@@ -259,7 +259,6 @@ CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
CONFIG_WAN_ROUTER=m
diff --git a/arch/mips/configs/nlm_xlr_defconfig b/arch/mips/configs/nlm_xlr_defconfig
index fea56c535d92..1e18fd7de209 100644
--- a/arch/mips/configs/nlm_xlr_defconfig
+++ b/arch/mips/configs/nlm_xlr_defconfig
@@ -240,12 +240,8 @@ CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
CONFIG_WAN_ROUTER=m
CONFIG_PHONET=m
CONFIG_IEEE802154=m
diff --git a/arch/mips/configs/omega2p_defconfig b/arch/mips/configs/omega2p_defconfig
new file mode 100644
index 000000000000..e2731c3cc7e7
--- /dev/null
+++ b/arch/mips/configs/omega2p_defconfig
@@ -0,0 +1,129 @@
+CONFIG_RALINK=y
+CONFIG_SOC_MT7620=y
+CONFIG_DTB_OMEGA2P=y
+CONFIG_CPU_MIPS32_R2=y
+# CONFIG_COMPACTION is not set
+CONFIG_HZ_100=y
+CONFIG_PREEMPT=y
+# CONFIG_SECCOMP is not set
+CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_CGROUPS=y
+CONFIG_MEMCG=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_NAMESPACES=y
+CONFIG_USER_NS=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_EMBEDDED=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_SUSPEND is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_WIRELESS is not set
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_ALLOW_DEV_COREDUMP is not set
+CONFIG_NETDEVICES=y
+# CONFIG_ETHERNET is not set
+# CONFIG_WLAN is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO is not set
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_LEGACY_PTY_COUNT=2
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=3
+CONFIG_SERIAL_8250_RUNTIME_UARTS=3
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_HWMON is not set
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_MMC=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_MEMORY=y
+CONFIG_PHY_RALINK_USB=y
+# CONFIG_DNOTIFY is not set
+CONFIG_PROC_KCORE=y
+# CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_TMPFS=y
+CONFIG_CONFIGFS_FS=y
+# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+CONFIG_NLS_CODEPAGE_936=y
+CONFIG_NLS_CODEPAGE_950=y
+CONFIG_NLS_CODEPAGE_932=y
+CONFIG_NLS_CODEPAGE_949=y
+CONFIG_NLS_CODEPAGE_874=y
+CONFIG_NLS_ISO8859_8=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_UTF8=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO=y
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_FS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_PANIC_TIMEOUT=10
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_DEBUG_PREEMPT is not set
+CONFIG_STACKTRACE=y
+# CONFIG_FTRACE is not set
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_LZO=y
+CONFIG_CRC16=y
+CONFIG_XZ_DEC=y
diff --git a/arch/mips/configs/pistachio_defconfig b/arch/mips/configs/pistachio_defconfig
index 3598d58aac30..b22a3cf149b6 100644
--- a/arch/mips/configs/pistachio_defconfig
+++ b/arch/mips/configs/pistachio_defconfig
@@ -47,6 +47,8 @@ CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
@@ -292,7 +294,8 @@ CONFIG_SQUASHFS_LZO=y
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_RAM=y
-# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_ASCII=m
diff --git a/arch/mips/configs/vocore2_defconfig b/arch/mips/configs/vocore2_defconfig
new file mode 100644
index 000000000000..9121e4194a63
--- /dev/null
+++ b/arch/mips/configs/vocore2_defconfig
@@ -0,0 +1,129 @@
+CONFIG_RALINK=y
+CONFIG_SOC_MT7620=y
+CONFIG_DTB_VOCORE2=y
+CONFIG_CPU_MIPS32_R2=y
+# CONFIG_COMPACTION is not set
+CONFIG_HZ_100=y
+CONFIG_PREEMPT=y
+# CONFIG_SECCOMP is not set
+CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_CGROUPS=y
+CONFIG_MEMCG=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_NAMESPACES=y
+CONFIG_USER_NS=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_EMBEDDED=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_SUSPEND is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_WIRELESS is not set
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_ALLOW_DEV_COREDUMP is not set
+CONFIG_NETDEVICES=y
+# CONFIG_ETHERNET is not set
+# CONFIG_WLAN is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO is not set
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_LEGACY_PTY_COUNT=2
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=3
+CONFIG_SERIAL_8250_RUNTIME_UARTS=3
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_HWMON is not set
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_MMC=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_MEMORY=y
+CONFIG_PHY_RALINK_USB=y
+# CONFIG_DNOTIFY is not set
+CONFIG_PROC_KCORE=y
+# CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_TMPFS=y
+CONFIG_CONFIGFS_FS=y
+# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+CONFIG_NLS_CODEPAGE_936=y
+CONFIG_NLS_CODEPAGE_950=y
+CONFIG_NLS_CODEPAGE_932=y
+CONFIG_NLS_CODEPAGE_949=y
+CONFIG_NLS_CODEPAGE_874=y
+CONFIG_NLS_ISO8859_8=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_UTF8=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO=y
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_FS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_PANIC_TIMEOUT=10
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_DEBUG_PREEMPT is not set
+CONFIG_STACKTRACE=y
+# CONFIG_FTRACE is not set
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_LZO=y
+CONFIG_CRC16=y
+CONFIG_XZ_DEC=y
diff --git a/arch/mips/fw/arc/init.c b/arch/mips/fw/arc/init.c
index 629b24db0d3a..008555969534 100644
--- a/arch/mips/fw/arc/init.c
+++ b/arch/mips/fw/arc/init.c
@@ -51,7 +51,7 @@ void __init prom_init(void)
#endif
#ifdef CONFIG_SGI_IP27
{
- extern struct plat_smp_ops ip27_smp_ops;
+ extern const struct plat_smp_ops ip27_smp_ops;
register_smp_ops(&ip27_smp_ops);
}
diff --git a/arch/mips/generic/Kconfig b/arch/mips/generic/Kconfig
index 51ffbbaddee2..e0436aaf7f38 100644
--- a/arch/mips/generic/Kconfig
+++ b/arch/mips/generic/Kconfig
@@ -36,4 +36,10 @@ config FIT_IMAGE_FDT_BOSTON
enable this if you wish to boot on a MIPS Boston board, as it is
expected by the bootloader.
+config FIT_IMAGE_FDT_NI169445
+ bool "Include FDT for NI 169445"
+ help
+ Enable this to include the FDT for the 169445 platform from
+ National Instruments in the FIT kernel image.
+
endif
diff --git a/arch/mips/generic/Platform b/arch/mips/generic/Platform
index 9a30d69e2281..f5312dfa8184 100644
--- a/arch/mips/generic/Platform
+++ b/arch/mips/generic/Platform
@@ -12,3 +12,7 @@ platform-$(CONFIG_MIPS_GENERIC) += generic/
cflags-$(CONFIG_MIPS_GENERIC) += -I$(srctree)/arch/mips/include/asm/mach-generic
load-$(CONFIG_MIPS_GENERIC) += 0xffffffff80100000
all-$(CONFIG_MIPS_GENERIC) := vmlinux.gz.itb
+
+its-y := vmlinux.its.S
+its-$(CONFIG_FIT_IMAGE_FDT_BOSTON) += board-boston.its.S
+its-$(CONFIG_FIT_IMAGE_FDT_NI169445) += board-ni169445.its.S
diff --git a/arch/mips/generic/board-boston.its.S b/arch/mips/generic/board-boston.its.S
new file mode 100644
index 000000000000..a7f51f97b910
--- /dev/null
+++ b/arch/mips/generic/board-boston.its.S
@@ -0,0 +1,22 @@
+/ {
+ images {
+ fdt@boston {
+ description = "img,boston Device Tree";
+ data = /incbin/("boot/dts/img/boston.dtb");
+ type = "flat_dt";
+ arch = "mips";
+ compression = "none";
+ hash@0 {
+ algo = "sha1";
+ };
+ };
+ };
+
+ configurations {
+ conf@boston {
+ description = "Boston Linux kernel";
+ kernel = "kernel@0";
+ fdt = "fdt@boston";
+ };
+ };
+};
diff --git a/arch/mips/generic/board-ni169445.its.S b/arch/mips/generic/board-ni169445.its.S
new file mode 100644
index 000000000000..d12e12fe90be
--- /dev/null
+++ b/arch/mips/generic/board-ni169445.its.S
@@ -0,0 +1,22 @@
+{
+ images {
+ fdt@ni169445 {
+ description = "NI 169445 device tree";
+ data = /incbin/("boot/dts/ni/169445.dtb");
+ type = "flat_dt";
+ arch = "mips";
+ compression = "none";
+ hash@0 {
+ algo = "sha1";
+ };
+ };
+ };
+
+ configurations {
+ conf@ni169445 {
+ description = "NI 169445 Linux Kernel";
+ kernel = "kernel@0";
+ fdt = "fdt@ni169445";
+ };
+ };
+};
diff --git a/arch/mips/generic/init.c b/arch/mips/generic/init.c
index 3f32b376d30e..15a7fb8e2a2e 100644
--- a/arch/mips/generic/init.c
+++ b/arch/mips/generic/init.c
@@ -16,6 +16,7 @@
#include <linux/of_fdt.h>
#include <linux/of_platform.h>
+#include <asm/bootinfo.h>
#include <asm/fw/fw.h>
#include <asm/irq_cpu.h>
#include <asm/machine.h>
@@ -88,6 +89,8 @@ void __init *plat_get_fdt(void)
return (void *)fdt;
}
+#ifdef CONFIG_RELOCATABLE
+
void __init plat_fdt_relocated(void *new_location)
{
/*
@@ -101,6 +104,8 @@ void __init plat_fdt_relocated(void *new_location)
fw_arg1 = (unsigned long)new_location;
}
+#endif /* CONFIG_RELOCATABLE */
+
void __init plat_mem_setup(void)
{
if (mach && mach->fixup_fdt)
diff --git a/arch/mips/generic/irq.c b/arch/mips/generic/irq.c
index 14064bdd91dd..5322d09dd51b 100644
--- a/arch/mips/generic/irq.c
+++ b/arch/mips/generic/irq.c
@@ -12,10 +12,11 @@
#include <linux/clk-provider.h>
#include <linux/clocksource.h>
#include <linux/init.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/types.h>
#include <asm/irq.h>
+#include <asm/mips-cps.h>
+#include <asm/time.h>
int get_c0_fdc_int(void)
{
@@ -23,7 +24,7 @@ int get_c0_fdc_int(void)
if (cpu_has_veic)
panic("Unimplemented!");
- else if (gic_present)
+ else if (mips_gic_present())
mips_cpu_fdc_irq = gic_get_c0_fdc_int();
else if (cp0_fdc_irq >= 0)
mips_cpu_fdc_irq = MIPS_CPU_IRQ_BASE + cp0_fdc_irq;
@@ -39,7 +40,7 @@ int get_c0_perfcount_int(void)
if (cpu_has_veic)
panic("Unimplemented!");
- else if (gic_present)
+ else if (mips_gic_present())
mips_cpu_perf_irq = gic_get_c0_perfcount_int();
else if (cp0_perfcount_irq >= 0)
mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
@@ -55,7 +56,7 @@ unsigned int get_c0_compare_int(void)
if (cpu_has_veic)
panic("Unimplemented!");
- else if (gic_present)
+ else if (mips_gic_present())
mips_cpu_timer_irq = gic_get_c0_compare_int();
else
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
diff --git a/arch/mips/generic/vmlinux.its.S b/arch/mips/generic/vmlinux.its.S
index 3390e2f80b80..f67fbf1c8541 100644
--- a/arch/mips/generic/vmlinux.its.S
+++ b/arch/mips/generic/vmlinux.its.S
@@ -29,28 +29,3 @@
};
};
};
-
-#ifdef CONFIG_FIT_IMAGE_FDT_BOSTON
-/ {
- images {
- fdt@boston {
- description = "img,boston Device Tree";
- data = /incbin/("boot/dts/img/boston.dtb");
- type = "flat_dt";
- arch = "mips";
- compression = "none";
- hash@0 {
- algo = "sha1";
- };
- };
- };
-
- configurations {
- conf@boston {
- description = "Boston Linux kernel";
- kernel = "kernel@0";
- fdt = "fdt@boston";
- };
- };
-};
-#endif /* CONFIG_FIT_IMAGE_FDT_BOSTON */
diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h
index 859cf7048347..81fae23ce7cd 100644
--- a/arch/mips/include/asm/asm.h
+++ b/arch/mips/include/asm/asm.h
@@ -55,6 +55,7 @@
.type symbol, @function; \
.ent symbol, 0; \
symbol: .frame sp, 0, ra; \
+ .cfi_startproc; \
.insn
/*
@@ -66,12 +67,14 @@ symbol: .frame sp, 0, ra; \
.type symbol, @function; \
.ent symbol, 0; \
symbol: .frame sp, framesize, rpc; \
+ .cfi_startproc; \
.insn
/*
* END - mark end of function
*/
#define END(function) \
+ .cfi_endproc; \
.end function; \
.size function, .-function
diff --git a/arch/mips/include/asm/bmips.h b/arch/mips/include/asm/bmips.h
index a92aee7b977a..b3e2975f83d3 100644
--- a/arch/mips/include/asm/bmips.h
+++ b/arch/mips/include/asm/bmips.h
@@ -48,8 +48,8 @@
#include <asm/r4kcache.h>
#include <asm/smp-ops.h>
-extern struct plat_smp_ops bmips43xx_smp_ops;
-extern struct plat_smp_ops bmips5000_smp_ops;
+extern const struct plat_smp_ops bmips43xx_smp_ops;
+extern const struct plat_smp_ops bmips5000_smp_ops;
static inline int register_bmips_smp_ops(void)
{
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h
index cd6efb07c980..a41059d47d31 100644
--- a/arch/mips/include/asm/cpu-info.h
+++ b/arch/mips/include/asm/cpu-info.h
@@ -15,6 +15,8 @@
#include <linux/cache.h>
#include <linux/types.h>
+#include <asm/mipsregs.h>
+
/*
* Descriptor for a cache
*/
@@ -77,17 +79,10 @@ struct cpuinfo_mips {
struct cache_desc tcache; /* Tertiary/split secondary cache */
int srsets; /* Shadow register sets */
int package;/* physical package number */
- int core; /* physical core number */
+ unsigned int globalnumber;
#ifdef CONFIG_64BIT
int vmbits; /* Virtual memory size in bits */
#endif
-#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
- /*
- * There is not necessarily a 1:1 mapping of VPE num to CPU number
- * in particular on multi-core systems.
- */
- int vpe_id; /* Virtual Processor number */
-#endif
void *data; /* Additional data */
unsigned int watch_reg_count; /* Number that exist */
unsigned int watch_reg_use_cnt; /* Usable by ptrace */
@@ -144,11 +139,52 @@ struct proc_cpuinfo_notifier_args {
unsigned long n;
};
-#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
-# define cpu_vpe_id(cpuinfo) ((cpuinfo)->vpe_id)
-#else
-# define cpu_vpe_id(cpuinfo) ({ (void)cpuinfo; 0; })
-#endif
+static inline unsigned int cpu_cluster(struct cpuinfo_mips *cpuinfo)
+{
+ /* Optimisation for systems where multiple clusters aren't used */
+ if (!IS_ENABLED(CONFIG_CPU_MIPSR6))
+ return 0;
+
+ return (cpuinfo->globalnumber & MIPS_GLOBALNUMBER_CLUSTER) >>
+ MIPS_GLOBALNUMBER_CLUSTER_SHF;
+}
+
+static inline unsigned int cpu_core(struct cpuinfo_mips *cpuinfo)
+{
+ return (cpuinfo->globalnumber & MIPS_GLOBALNUMBER_CORE) >>
+ MIPS_GLOBALNUMBER_CORE_SHF;
+}
+
+static inline unsigned int cpu_vpe_id(struct cpuinfo_mips *cpuinfo)
+{
+ /* Optimisation for systems where VP(E)s aren't used */
+ if (!IS_ENABLED(CONFIG_MIPS_MT_SMP) && !IS_ENABLED(CONFIG_CPU_MIPSR6))
+ return 0;
+
+ return (cpuinfo->globalnumber & MIPS_GLOBALNUMBER_VP) >>
+ MIPS_GLOBALNUMBER_VP_SHF;
+}
+
+extern void cpu_set_cluster(struct cpuinfo_mips *cpuinfo, unsigned int cluster);
+extern void cpu_set_core(struct cpuinfo_mips *cpuinfo, unsigned int core);
+extern void cpu_set_vpe_id(struct cpuinfo_mips *cpuinfo, unsigned int vpe);
+
+static inline bool cpus_are_siblings(int cpua, int cpub)
+{
+ struct cpuinfo_mips *infoa = &cpu_data[cpua];
+ struct cpuinfo_mips *infob = &cpu_data[cpub];
+ unsigned int gnuma, gnumb;
+
+ if (infoa->package != infob->package)
+ return false;
+
+ gnuma = infoa->globalnumber & ~MIPS_GLOBALNUMBER_VP;
+ gnumb = infob->globalnumber & ~MIPS_GLOBALNUMBER_VP;
+ if (gnuma != gnumb)
+ return false;
+
+ return true;
+}
static inline unsigned long cpu_asid_inc(void)
{
diff --git a/arch/mips/include/asm/cpu-type.h b/arch/mips/include/asm/cpu-type.h
index 175fe565f4e1..a45af3de075d 100644
--- a/arch/mips/include/asm/cpu-type.h
+++ b/arch/mips/include/asm/cpu-type.h
@@ -151,11 +151,6 @@ static inline int __pure __get_cpu_type(const int cpu_type)
case CPU_R5500:
#endif
-#ifdef CONFIG_SYS_HAS_CPU_R6000
- case CPU_R6000:
- case CPU_R6000A:
-#endif
-
#ifdef CONFIG_SYS_HAS_CPU_NEVADA
case CPU_NEVADA:
#endif
diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h
index d0c152b989f8..ece9b84f3bcb 100644
--- a/arch/mips/include/asm/cpu.h
+++ b/arch/mips/include/asm/cpu.h
@@ -286,11 +286,6 @@ enum cpu_type_enum {
CPU_R3081, CPU_R3081E,
/*
- * R6000 class processors
- */
- CPU_R6000, CPU_R6000A,
-
- /*
* R4000 class processors
*/
CPU_R4000PC, CPU_R4000SC, CPU_R4000MC, CPU_R4200, CPU_R4300, CPU_R4310,
diff --git a/arch/mips/include/asm/floppy.h b/arch/mips/include/asm/floppy.h
index d75aed36480a..021d09ae5670 100644
--- a/arch/mips/include/asm/floppy.h
+++ b/arch/mips/include/asm/floppy.h
@@ -10,11 +10,11 @@
#ifndef _ASM_FLOPPY_H
#define _ASM_FLOPPY_H
-#include <linux/dma-mapping.h>
+#include <asm/io.h>
static inline void fd_cacheflush(char * addr, long size)
{
- dma_cache_sync(NULL, addr, size, DMA_BIDIRECTIONAL);
+ dma_cache_wback_inv((unsigned long)addr, size);
}
#define MAX_BUFFER_SECTORS 24
diff --git a/arch/mips/include/asm/fpu_emulator.h b/arch/mips/include/asm/fpu_emulator.h
index c05369e0b8d6..b36097d3cbf4 100644
--- a/arch/mips/include/asm/fpu_emulator.h
+++ b/arch/mips/include/asm/fpu_emulator.h
@@ -36,6 +36,7 @@ struct mips_fpu_emulator_stats {
unsigned long emulated;
unsigned long loads;
unsigned long stores;
+ unsigned long branches;
unsigned long cp1ops;
unsigned long cp1xops;
unsigned long errors;
@@ -45,6 +46,121 @@ struct mips_fpu_emulator_stats {
unsigned long ieee754_zerodiv;
unsigned long ieee754_invalidop;
unsigned long ds_emul;
+
+ unsigned long abs_s;
+ unsigned long abs_d;
+ unsigned long add_s;
+ unsigned long add_d;
+ unsigned long bc1eqz;
+ unsigned long bc1nez;
+ unsigned long ceil_w_s;
+ unsigned long ceil_w_d;
+ unsigned long ceil_l_s;
+ unsigned long ceil_l_d;
+ unsigned long class_s;
+ unsigned long class_d;
+ unsigned long cmp_af_s;
+ unsigned long cmp_af_d;
+ unsigned long cmp_eq_s;
+ unsigned long cmp_eq_d;
+ unsigned long cmp_le_s;
+ unsigned long cmp_le_d;
+ unsigned long cmp_lt_s;
+ unsigned long cmp_lt_d;
+ unsigned long cmp_ne_s;
+ unsigned long cmp_ne_d;
+ unsigned long cmp_or_s;
+ unsigned long cmp_or_d;
+ unsigned long cmp_ueq_s;
+ unsigned long cmp_ueq_d;
+ unsigned long cmp_ule_s;
+ unsigned long cmp_ule_d;
+ unsigned long cmp_ult_s;
+ unsigned long cmp_ult_d;
+ unsigned long cmp_un_s;
+ unsigned long cmp_un_d;
+ unsigned long cmp_une_s;
+ unsigned long cmp_une_d;
+ unsigned long cmp_saf_s;
+ unsigned long cmp_saf_d;
+ unsigned long cmp_seq_s;
+ unsigned long cmp_seq_d;
+ unsigned long cmp_sle_s;
+ unsigned long cmp_sle_d;
+ unsigned long cmp_slt_s;
+ unsigned long cmp_slt_d;
+ unsigned long cmp_sne_s;
+ unsigned long cmp_sne_d;
+ unsigned long cmp_sor_s;
+ unsigned long cmp_sor_d;
+ unsigned long cmp_sueq_s;
+ unsigned long cmp_sueq_d;
+ unsigned long cmp_sule_s;
+ unsigned long cmp_sule_d;
+ unsigned long cmp_sult_s;
+ unsigned long cmp_sult_d;
+ unsigned long cmp_sun_s;
+ unsigned long cmp_sun_d;
+ unsigned long cmp_sune_s;
+ unsigned long cmp_sune_d;
+ unsigned long cvt_d_l;
+ unsigned long cvt_d_s;
+ unsigned long cvt_d_w;
+ unsigned long cvt_l_s;
+ unsigned long cvt_l_d;
+ unsigned long cvt_s_d;
+ unsigned long cvt_s_l;
+ unsigned long cvt_s_w;
+ unsigned long cvt_w_s;
+ unsigned long cvt_w_d;
+ unsigned long div_s;
+ unsigned long div_d;
+ unsigned long floor_w_s;
+ unsigned long floor_w_d;
+ unsigned long floor_l_s;
+ unsigned long floor_l_d;
+ unsigned long maddf_s;
+ unsigned long maddf_d;
+ unsigned long max_s;
+ unsigned long max_d;
+ unsigned long maxa_s;
+ unsigned long maxa_d;
+ unsigned long min_s;
+ unsigned long min_d;
+ unsigned long mina_s;
+ unsigned long mina_d;
+ unsigned long mov_s;
+ unsigned long mov_d;
+ unsigned long msubf_s;
+ unsigned long msubf_d;
+ unsigned long mul_s;
+ unsigned long mul_d;
+ unsigned long neg_s;
+ unsigned long neg_d;
+ unsigned long recip_s;
+ unsigned long recip_d;
+ unsigned long rint_s;
+ unsigned long rint_d;
+ unsigned long round_w_s;
+ unsigned long round_w_d;
+ unsigned long round_l_s;
+ unsigned long round_l_d;
+ unsigned long rsqrt_s;
+ unsigned long rsqrt_d;
+ unsigned long sel_s;
+ unsigned long sel_d;
+ unsigned long seleqz_s;
+ unsigned long seleqz_d;
+ unsigned long selnez_s;
+ unsigned long selnez_d;
+ unsigned long sqrt_s;
+ unsigned long sqrt_d;
+ unsigned long sub_s;
+ unsigned long sub_d;
+ unsigned long trunc_w_s;
+ unsigned long trunc_w_d;
+ unsigned long trunc_l_s;
+ unsigned long trunc_l_d;
};
DECLARE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
@@ -62,7 +178,7 @@ do { \
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
struct mips_fpu_struct *ctx, int has_fpu,
- void *__user *fault_addr);
+ void __user **fault_addr);
void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
struct task_struct *tsk);
int process_fpemu_return(int sig, void __user *fault_addr,
diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h
index ecabc00c1e66..0cbf3af37eca 100644
--- a/arch/mips/include/asm/io.h
+++ b/arch/mips/include/asm/io.h
@@ -632,4 +632,6 @@ extern void (*_dma_cache_inv)(unsigned long start, unsigned long size);
*/
#define xlate_dev_kmem_ptr(p) p
+void __ioread64_copy(void *to, const void __iomem *from, size_t count);
+
#endif /* _ASM_IO_H */
diff --git a/arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h b/arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h
index bace5b9ae4df..f439cf9cf9d1 100644
--- a/arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h
@@ -8,12 +8,16 @@
#define __ASM_MACH_AU1X00_CPU_FEATURE_OVERRIDES_H
#define cpu_has_tlb 1
+#define cpu_has_ftlb 0
#define cpu_has_tlbinv 0
#define cpu_has_segments 0
#define cpu_has_eva 0
#define cpu_has_htw 0
+#define cpu_has_ldpte 0
#define cpu_has_rixiex 0
#define cpu_has_maar 0
+#define cpu_has_rw_llb 0
+#define cpu_has_3kex 0
#define cpu_has_4kex 1
#define cpu_has_3k_cache 0
#define cpu_has_4k_cache 1
@@ -30,6 +34,12 @@
#define cpu_has_mcheck 1
#define cpu_has_ejtag 1
#define cpu_has_llsc 1
+#define cpu_has_guestctl0ext 0
+#define cpu_has_guestctl1 0
+#define cpu_has_guestctl2 0
+#define cpu_has_guestid 0
+#define cpu_has_drg 0
+#define cpu_has_bp_ghist 0
#define cpu_has_mips16 0
#define cpu_has_mips16e2 0
#define cpu_has_mdmx 0
@@ -37,17 +47,23 @@
#define cpu_has_smartmips 0
#define cpu_has_rixi 0
#define cpu_has_mmips 0
+#define cpu_has_lpa 0
+#define cpu_has_mhv 0
#define cpu_has_vtag_icache 0
#define cpu_has_dc_aliases 0
#define cpu_has_ic_fills_f_dc 1
#define cpu_has_pindexed_dcache 0
#define cpu_has_mips32r1 1
#define cpu_has_mips32r2 0
+#define cpu_has_mips32r6 0
#define cpu_has_mips64r1 0
#define cpu_has_mips64r2 0
+#define cpu_has_mips64r6 0
#define cpu_has_dsp 0
#define cpu_has_dsp2 0
+#define cpu_has_dsp3 0
#define cpu_has_mipsmt 0
+#define cpu_has_vp 0
#define cpu_has_userlocal 0
#define cpu_has_nofpuex 0
#define cpu_has_64bits 0
@@ -58,9 +74,19 @@
#define cpu_dcache_line_size() 32
#define cpu_icache_line_size() 32
+#define cpu_scache_line_size() 0
#define cpu_has_perf_cntr_intr_bit 0
#define cpu_has_vz 0
#define cpu_has_msa 0
+#define cpu_has_fre 0
+#define cpu_has_cdmm 0
+#define cpu_has_small_pages 0
+#define cpu_has_nan_legacy 1
+#define cpu_has_nan_2008 1
+#define cpu_has_ebase_wg 0
+#define cpu_has_badinstr 0
+#define cpu_has_badinstrp 0
+#define cpu_has_contextconfig 0
#endif /* __ASM_MACH_AU1X00_CPU_FEATURE_OVERRIDES_H */
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
index 5035f09c5427..24080af570f9 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
@@ -710,7 +710,7 @@
/* Broadcom 6345 ENET DMA definitions */
#define ENETDMA_6345_CHANCFG_REG (0x00)
-#define ENETDMA_6345_MAXBURST_REG (0x40)
+#define ENETDMA_6345_MAXBURST_REG (0x04)
#define ENETDMA_6345_RSTART_REG (0x08)
diff --git a/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h b/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h
index bd8b9bbe1771..a4f798629c3d 100644
--- a/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h
@@ -46,9 +46,9 @@
#define cpu_has_64bits 1
#define cpu_has_octeon_cache 1
#define cpu_has_saa octeon_has_saa()
-#define cpu_has_mips32r1 0
-#define cpu_has_mips32r2 0
-#define cpu_has_mips64r1 0
+#define cpu_has_mips32r1 1
+#define cpu_has_mips32r2 1
+#define cpu_has_mips64r1 1
#define cpu_has_mips64r2 1
#define cpu_has_dsp 0
#define cpu_has_dsp2 0
diff --git a/arch/mips/include/asm/mach-ip27/topology.h b/arch/mips/include/asm/mach-ip27/topology.h
index defd135e7ac8..3fb7a0e09494 100644
--- a/arch/mips/include/asm/mach-ip27/topology.h
+++ b/arch/mips/include/asm/mach-ip27/topology.h
@@ -23,7 +23,6 @@ struct cpuinfo_ip27 {
extern struct cpuinfo_ip27 sn_cpu_info[NR_CPUS];
#define cpu_to_node(cpu) (sn_cpu_info[(cpu)].p_nodeid)
-#define parent_node(node) (node)
#define cpumask_of_node(node) ((node) == -1 ? \
cpu_all_mask : \
&hub_data(node)->h_cpus)
diff --git a/arch/mips/include/asm/mach-jz4740/jz4740_nand.h b/arch/mips/include/asm/mach-jz4740/jz4740_nand.h
index 7f7b0fc554da..f381d465e768 100644
--- a/arch/mips/include/asm/mach-jz4740/jz4740_nand.h
+++ b/arch/mips/include/asm/mach-jz4740/jz4740_nand.h
@@ -16,7 +16,7 @@
#ifndef __ASM_MACH_JZ4740_JZ4740_NAND_H__
#define __ASM_MACH_JZ4740_JZ4740_NAND_H__
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#define JZ_NAND_NUM_BANKS 4
diff --git a/arch/mips/include/asm/mach-lantiq/lantiq.h b/arch/mips/include/asm/mach-lantiq/lantiq.h
index 8064d7a4b33d..d750f93232e4 100644
--- a/arch/mips/include/asm/mach-lantiq/lantiq.h
+++ b/arch/mips/include/asm/mach-lantiq/lantiq.h
@@ -46,8 +46,6 @@ extern struct clk *clk_get_ppe(void);
/* find out what bootsource we have */
extern unsigned char ltq_boot_select(void);
-/* find out what caused the last cpu reset */
-extern int ltq_reset_cause(void);
/* find out the soc type */
extern int ltq_soc_type(void);
diff --git a/arch/mips/include/asm/mach-loongson64/loongson.h b/arch/mips/include/asm/mach-loongson64/loongson.h
index c68c0cc879c6..d0ae5d55413b 100644
--- a/arch/mips/include/asm/mach-loongson64/loongson.h
+++ b/arch/mips/include/asm/mach-loongson64/loongson.h
@@ -26,7 +26,7 @@ extern void mach_prepare_shutdown(void);
/* environment arguments from bootloader */
extern u32 cpu_clock_freq;
extern u32 memsize, highmemsize;
-extern struct plat_smp_ops loongson3_smp_ops;
+extern const struct plat_smp_ops loongson3_smp_ops;
/* loongson-specific command line, env and memory initialization */
extern void __init prom_init_memory(void);
diff --git a/arch/mips/include/asm/mach-loongson64/topology.h b/arch/mips/include/asm/mach-loongson64/topology.h
index 0d8f3b55bdbc..bcb885615fca 100644
--- a/arch/mips/include/asm/mach-loongson64/topology.h
+++ b/arch/mips/include/asm/mach-loongson64/topology.h
@@ -4,7 +4,6 @@
#ifdef CONFIG_NUMA
#define cpu_to_node(cpu) (cpu_logical_map(cpu) >> 2)
-#define parent_node(node) (node)
#define cpumask_of_node(node) (&__node_data[(node)]->cpumask)
struct pci_bus;
diff --git a/arch/mips/include/asm/mips-boards/maltaint.h b/arch/mips/include/asm/mips-boards/maltaint.h
index 987ff580466b..817698abf2eb 100644
--- a/arch/mips/include/asm/mips-boards/maltaint.h
+++ b/arch/mips/include/asm/mips-boards/maltaint.h
@@ -10,8 +10,6 @@
#ifndef _MIPS_MALTAINT_H
#define _MIPS_MALTAINT_H
-#include <linux/irqchip/mips-gic.h>
-
/*
* Interrupts 0..15 are used for Malta ISA compatible interrupts
*/
@@ -62,7 +60,4 @@
#define MSC01E_INT_PERFCTR 10
#define MSC01E_INT_CPUCTR 11
-/* GIC external interrupts */
-#define GIC_INT_I8259A GIC_SHARED_TO_HWIRQ(3)
-
#endif /* !(_MIPS_MALTAINT_H) */
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h
index cfdbab015769..f6231b91b724 100644
--- a/arch/mips/include/asm/mips-cm.h
+++ b/arch/mips/include/asm/mips-cm.h
@@ -8,16 +8,18 @@
* option) any later version.
*/
+#ifndef __MIPS_ASM_MIPS_CPS_H__
+# error Please include asm/mips-cps.h rather than asm/mips-cm.h
+#endif
+
#ifndef __MIPS_ASM_MIPS_CM_H__
#define __MIPS_ASM_MIPS_CM_H__
#include <linux/bitops.h>
#include <linux/errno.h>
-#include <linux/io.h>
-#include <linux/types.h>
/* The base address of the CM GCR block */
-extern void __iomem *mips_cm_base;
+extern void __iomem *mips_gcr_base;
/* The base address of the CM L2-only sync region */
extern void __iomem *mips_cm_l2sync_base;
@@ -80,7 +82,7 @@ static inline int mips_cm_probe(void)
static inline bool mips_cm_present(void)
{
#ifdef CONFIG_MIPS_CM
- return mips_cm_base != NULL;
+ return mips_gcr_base != NULL;
#else
return false;
#endif
@@ -112,321 +114,219 @@ static inline bool mips_cm_has_l2sync(void)
/* Size of the L2-only sync region */
#define MIPS_CM_L2SYNC_SIZE 0x1000
-/* Macros to ease the creation of register access functions */
-#define BUILD_CM_R_(name, off) \
-static inline unsigned long __iomem *addr_gcr_##name(void) \
-{ \
- return (unsigned long __iomem *)(mips_cm_base + (off)); \
-} \
- \
-static inline u32 read32_gcr_##name(void) \
-{ \
- return __raw_readl(addr_gcr_##name()); \
-} \
- \
-static inline u64 read64_gcr_##name(void) \
-{ \
- void __iomem *addr = addr_gcr_##name(); \
- u64 ret; \
- \
- if (mips_cm_is64) { \
- ret = __raw_readq(addr); \
- } else { \
- ret = __raw_readl(addr); \
- ret |= (u64)__raw_readl(addr + 0x4) << 32; \
- } \
- \
- return ret; \
-} \
- \
-static inline unsigned long read_gcr_##name(void) \
-{ \
- if (mips_cm_is64) \
- return read64_gcr_##name(); \
- else \
- return read32_gcr_##name(); \
-}
-
-#define BUILD_CM__W(name, off) \
-static inline void write32_gcr_##name(u32 value) \
-{ \
- __raw_writel(value, addr_gcr_##name()); \
-} \
- \
-static inline void write64_gcr_##name(u64 value) \
-{ \
- __raw_writeq(value, addr_gcr_##name()); \
-} \
- \
-static inline void write_gcr_##name(unsigned long value) \
-{ \
- if (mips_cm_is64) \
- write64_gcr_##name(value); \
- else \
- write32_gcr_##name(value); \
-}
-
-#define BUILD_CM_RW(name, off) \
- BUILD_CM_R_(name, off) \
- BUILD_CM__W(name, off)
-
-#define BUILD_CM_Cx_R_(name, off) \
- BUILD_CM_R_(cl_##name, MIPS_CM_CLCB_OFS + (off)) \
- BUILD_CM_R_(co_##name, MIPS_CM_COCB_OFS + (off))
-
-#define BUILD_CM_Cx__W(name, off) \
- BUILD_CM__W(cl_##name, MIPS_CM_CLCB_OFS + (off)) \
- BUILD_CM__W(co_##name, MIPS_CM_COCB_OFS + (off))
-
-#define BUILD_CM_Cx_RW(name, off) \
- BUILD_CM_Cx_R_(name, off) \
- BUILD_CM_Cx__W(name, off)
-
-/* GCB register accessor functions */
-BUILD_CM_R_(config, MIPS_CM_GCB_OFS + 0x00)
-BUILD_CM_RW(base, MIPS_CM_GCB_OFS + 0x08)
-BUILD_CM_RW(access, MIPS_CM_GCB_OFS + 0x20)
-BUILD_CM_R_(rev, MIPS_CM_GCB_OFS + 0x30)
-BUILD_CM_RW(err_control, MIPS_CM_GCB_OFS + 0x38)
-BUILD_CM_RW(error_mask, MIPS_CM_GCB_OFS + 0x40)
-BUILD_CM_RW(error_cause, MIPS_CM_GCB_OFS + 0x48)
-BUILD_CM_RW(error_addr, MIPS_CM_GCB_OFS + 0x50)
-BUILD_CM_RW(error_mult, MIPS_CM_GCB_OFS + 0x58)
-BUILD_CM_RW(l2_only_sync_base, MIPS_CM_GCB_OFS + 0x70)
-BUILD_CM_RW(gic_base, MIPS_CM_GCB_OFS + 0x80)
-BUILD_CM_RW(cpc_base, MIPS_CM_GCB_OFS + 0x88)
-BUILD_CM_RW(reg0_base, MIPS_CM_GCB_OFS + 0x90)
-BUILD_CM_RW(reg0_mask, MIPS_CM_GCB_OFS + 0x98)
-BUILD_CM_RW(reg1_base, MIPS_CM_GCB_OFS + 0xa0)
-BUILD_CM_RW(reg1_mask, MIPS_CM_GCB_OFS + 0xa8)
-BUILD_CM_RW(reg2_base, MIPS_CM_GCB_OFS + 0xb0)
-BUILD_CM_RW(reg2_mask, MIPS_CM_GCB_OFS + 0xb8)
-BUILD_CM_RW(reg3_base, MIPS_CM_GCB_OFS + 0xc0)
-BUILD_CM_RW(reg3_mask, MIPS_CM_GCB_OFS + 0xc8)
-BUILD_CM_R_(gic_status, MIPS_CM_GCB_OFS + 0xd0)
-BUILD_CM_R_(cpc_status, MIPS_CM_GCB_OFS + 0xf0)
-BUILD_CM_RW(l2_config, MIPS_CM_GCB_OFS + 0x130)
-BUILD_CM_RW(sys_config2, MIPS_CM_GCB_OFS + 0x150)
-BUILD_CM_RW(l2_pft_control, MIPS_CM_GCB_OFS + 0x300)
-BUILD_CM_RW(l2_pft_control_b, MIPS_CM_GCB_OFS + 0x308)
-BUILD_CM_RW(bev_base, MIPS_CM_GCB_OFS + 0x680)
-
-/* Core Local & Core Other register accessor functions */
-BUILD_CM_Cx_RW(reset_release, 0x00)
-BUILD_CM_Cx_RW(coherence, 0x08)
-BUILD_CM_Cx_R_(config, 0x10)
-BUILD_CM_Cx_RW(other, 0x18)
-BUILD_CM_Cx_RW(reset_base, 0x20)
-BUILD_CM_Cx_R_(id, 0x28)
-BUILD_CM_Cx_RW(reset_ext_base, 0x30)
-BUILD_CM_Cx_R_(tcid_0_priority, 0x40)
-BUILD_CM_Cx_R_(tcid_1_priority, 0x48)
-BUILD_CM_Cx_R_(tcid_2_priority, 0x50)
-BUILD_CM_Cx_R_(tcid_3_priority, 0x58)
-BUILD_CM_Cx_R_(tcid_4_priority, 0x60)
-BUILD_CM_Cx_R_(tcid_5_priority, 0x68)
-BUILD_CM_Cx_R_(tcid_6_priority, 0x70)
-BUILD_CM_Cx_R_(tcid_7_priority, 0x78)
-BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
-
-/* GCR_CONFIG register fields */
-#define CM_GCR_CONFIG_NUMIOCU_SHF 8
-#define CM_GCR_CONFIG_NUMIOCU_MSK (_ULCAST_(0xf) << 8)
-#define CM_GCR_CONFIG_PCORES_SHF 0
-#define CM_GCR_CONFIG_PCORES_MSK (_ULCAST_(0xff) << 0)
-
-/* GCR_BASE register fields */
-#define CM_GCR_BASE_GCRBASE_SHF 15
-#define CM_GCR_BASE_GCRBASE_MSK (_ULCAST_(0x1ffff) << 15)
-#define CM_GCR_BASE_CMDEFTGT_SHF 0
-#define CM_GCR_BASE_CMDEFTGT_MSK (_ULCAST_(0x3) << 0)
+#define GCR_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_GCB_OFS + off, name) \
+ CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_COCB_OFS + off, redir_##name)
+
+#define GCR_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_GCB_OFS + off, name) \
+ CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_COCB_OFS + off, redir_##name)
+
+#define GCR_CX_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_CLCB_OFS + off, cl_##name) \
+ CPS_ACCESSOR_RO(gcr, sz, MIPS_CM_COCB_OFS + off, co_##name)
+
+#define GCR_CX_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_CLCB_OFS + off, cl_##name) \
+ CPS_ACCESSOR_RW(gcr, sz, MIPS_CM_COCB_OFS + off, co_##name)
+
+/* GCR_CONFIG - Information about the system */
+GCR_ACCESSOR_RO(64, 0x000, config)
+#define CM_GCR_CONFIG_CLUSTER_COH_CAPABLE BIT_ULL(43)
+#define CM_GCR_CONFIG_CLUSTER_ID GENMASK_ULL(39, 32)
+#define CM_GCR_CONFIG_NUM_CLUSTERS GENMASK(29, 23)
+#define CM_GCR_CONFIG_NUMIOCU GENMASK(15, 8)
+#define CM_GCR_CONFIG_PCORES GENMASK(7, 0)
+
+/* GCR_BASE - Base address of the Global Configuration Registers (GCRs) */
+GCR_ACCESSOR_RW(64, 0x008, base)
+#define CM_GCR_BASE_GCRBASE GENMASK_ULL(47, 15)
+#define CM_GCR_BASE_CMDEFTGT GENMASK(1, 0)
#define CM_GCR_BASE_CMDEFTGT_DISABLED 0
#define CM_GCR_BASE_CMDEFTGT_MEM 1
#define CM_GCR_BASE_CMDEFTGT_IOCU0 2
#define CM_GCR_BASE_CMDEFTGT_IOCU1 3
-/* GCR_RESET_EXT_BASE register fields */
-#define CM_GCR_RESET_EXT_BASE_EVARESET BIT(31)
-#define CM_GCR_RESET_EXT_BASE_UEB BIT(30)
-
-/* GCR_ACCESS register fields */
-#define CM_GCR_ACCESS_ACCESSEN_SHF 0
-#define CM_GCR_ACCESS_ACCESSEN_MSK (_ULCAST_(0xff) << 0)
+/* GCR_ACCESS - Controls core/IOCU access to GCRs */
+GCR_ACCESSOR_RW(32, 0x020, access)
+#define CM_GCR_ACCESS_ACCESSEN GENMASK(7, 0)
-/* GCR_REV register fields */
-#define CM_GCR_REV_MAJOR_SHF 8
-#define CM_GCR_REV_MAJOR_MSK (_ULCAST_(0xff) << 8)
-#define CM_GCR_REV_MINOR_SHF 0
-#define CM_GCR_REV_MINOR_MSK (_ULCAST_(0xff) << 0)
+/* GCR_REV - Indicates the Coherence Manager revision */
+GCR_ACCESSOR_RO(32, 0x030, rev)
+#define CM_GCR_REV_MAJOR GENMASK(15, 8)
+#define CM_GCR_REV_MINOR GENMASK(7, 0)
#define CM_ENCODE_REV(major, minor) \
- (((major) << CM_GCR_REV_MAJOR_SHF) | \
- ((minor) << CM_GCR_REV_MINOR_SHF))
+ (((major) << __ffs(CM_GCR_REV_MAJOR)) | \
+ ((minor) << __ffs(CM_GCR_REV_MINOR)))
#define CM_REV_CM2 CM_ENCODE_REV(6, 0)
#define CM_REV_CM2_5 CM_ENCODE_REV(7, 0)
#define CM_REV_CM3 CM_ENCODE_REV(8, 0)
-
-/* GCR_ERR_CONTROL register fields */
-#define CM_GCR_ERR_CONTROL_L2_ECC_EN_SHF 1
-#define CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK (_ULCAST_(0x1) << 1)
-#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_SHF 0
-#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_ERROR_CAUSE register fields */
-#define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27
-#define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27)
-#define CM3_GCR_ERROR_CAUSE_ERRTYPE_SHF 58
-#define CM3_GCR_ERROR_CAUSE_ERRTYPE_MSK GENMASK_ULL(63, 58)
-#define CM_GCR_ERROR_CAUSE_ERRINFO_SHF 0
-#define CM_GCR_ERROR_CAUSE_ERRINGO_MSK (_ULCAST_(0x7ffffff) << 0)
-
-/* GCR_ERROR_MULT register fields */
-#define CM_GCR_ERROR_MULT_ERR2ND_SHF 0
-#define CM_GCR_ERROR_MULT_ERR2ND_MSK (_ULCAST_(0x1f) << 0)
-
-/* GCR_L2_ONLY_SYNC_BASE register fields */
-#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_SHF 12
-#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_MSK (_ULCAST_(0xfffff) << 12)
-#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_SHF 0
-#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_GIC_BASE register fields */
-#define CM_GCR_GIC_BASE_GICBASE_SHF 17
-#define CM_GCR_GIC_BASE_GICBASE_MSK (_ULCAST_(0x7fff) << 17)
-#define CM_GCR_GIC_BASE_GICEN_SHF 0
-#define CM_GCR_GIC_BASE_GICEN_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_CPC_BASE register fields */
-#define CM_GCR_CPC_BASE_CPCBASE_SHF 15
-#define CM_GCR_CPC_BASE_CPCBASE_MSK (_ULCAST_(0x1ffff) << 15)
-#define CM_GCR_CPC_BASE_CPCEN_SHF 0
-#define CM_GCR_CPC_BASE_CPCEN_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_GIC_STATUS register fields */
-#define CM_GCR_GIC_STATUS_GICEX_SHF 0
-#define CM_GCR_GIC_STATUS_GICEX_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_REGn_BASE register fields */
-#define CM_GCR_REGn_BASE_BASEADDR_SHF 16
-#define CM_GCR_REGn_BASE_BASEADDR_MSK (_ULCAST_(0xffff) << 16)
-
-/* GCR_REGn_MASK register fields */
-#define CM_GCR_REGn_MASK_ADDRMASK_SHF 16
-#define CM_GCR_REGn_MASK_ADDRMASK_MSK (_ULCAST_(0xffff) << 16)
-#define CM_GCR_REGn_MASK_CCAOVR_SHF 5
-#define CM_GCR_REGn_MASK_CCAOVR_MSK (_ULCAST_(0x3) << 5)
-#define CM_GCR_REGn_MASK_CCAOVREN_SHF 4
-#define CM_GCR_REGn_MASK_CCAOVREN_MSK (_ULCAST_(0x1) << 4)
-#define CM_GCR_REGn_MASK_DROPL2_SHF 2
-#define CM_GCR_REGn_MASK_DROPL2_MSK (_ULCAST_(0x1) << 2)
-#define CM_GCR_REGn_MASK_CMTGT_SHF 0
-#define CM_GCR_REGn_MASK_CMTGT_MSK (_ULCAST_(0x3) << 0)
-#define CM_GCR_REGn_MASK_CMTGT_DISABLED (_ULCAST_(0x0) << 0)
-#define CM_GCR_REGn_MASK_CMTGT_MEM (_ULCAST_(0x1) << 0)
-#define CM_GCR_REGn_MASK_CMTGT_IOCU0 (_ULCAST_(0x2) << 0)
-#define CM_GCR_REGn_MASK_CMTGT_IOCU1 (_ULCAST_(0x3) << 0)
-
-/* GCR_GIC_STATUS register fields */
-#define CM_GCR_GIC_STATUS_EX_SHF 0
-#define CM_GCR_GIC_STATUS_EX_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_CPC_STATUS register fields */
-#define CM_GCR_CPC_STATUS_EX_SHF 0
-#define CM_GCR_CPC_STATUS_EX_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_L2_CONFIG register fields */
-#define CM_GCR_L2_CONFIG_BYPASS_SHF 20
-#define CM_GCR_L2_CONFIG_BYPASS_MSK (_ULCAST_(0x1) << 20)
-#define CM_GCR_L2_CONFIG_SET_SIZE_SHF 12
-#define CM_GCR_L2_CONFIG_SET_SIZE_MSK (_ULCAST_(0xf) << 12)
-#define CM_GCR_L2_CONFIG_LINE_SIZE_SHF 8
-#define CM_GCR_L2_CONFIG_LINE_SIZE_MSK (_ULCAST_(0xf) << 8)
-#define CM_GCR_L2_CONFIG_ASSOC_SHF 0
-#define CM_GCR_L2_CONFIG_ASSOC_MSK (_ULCAST_(0xff) << 0)
-
-/* GCR_SYS_CONFIG2 register fields */
-#define CM_GCR_SYS_CONFIG2_MAXVPW_SHF 0
-#define CM_GCR_SYS_CONFIG2_MAXVPW_MSK (_ULCAST_(0xf) << 0)
-
-/* GCR_L2_PFT_CONTROL register fields */
-#define CM_GCR_L2_PFT_CONTROL_PAGEMASK_SHF 12
-#define CM_GCR_L2_PFT_CONTROL_PAGEMASK_MSK (_ULCAST_(0xfffff) << 12)
-#define CM_GCR_L2_PFT_CONTROL_PFTEN_SHF 8
-#define CM_GCR_L2_PFT_CONTROL_PFTEN_MSK (_ULCAST_(0x1) << 8)
-#define CM_GCR_L2_PFT_CONTROL_NPFT_SHF 0
-#define CM_GCR_L2_PFT_CONTROL_NPFT_MSK (_ULCAST_(0xff) << 0)
-
-/* GCR_L2_PFT_CONTROL_B register fields */
-#define CM_GCR_L2_PFT_CONTROL_B_CEN_SHF 8
-#define CM_GCR_L2_PFT_CONTROL_B_CEN_MSK (_ULCAST_(0x1) << 8)
-#define CM_GCR_L2_PFT_CONTROL_B_PORTID_SHF 0
-#define CM_GCR_L2_PFT_CONTROL_B_PORTID_MSK (_ULCAST_(0xff) << 0)
-
-/* GCR_Cx_COHERENCE register fields */
-#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_SHF 0
-#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_MSK (_ULCAST_(0xff) << 0)
-#define CM3_GCR_Cx_COHERENCE_COHEN_MSK (_ULCAST_(0x1) << 0)
-
-/* GCR_Cx_CONFIG register fields */
-#define CM_GCR_Cx_CONFIG_IOCUTYPE_SHF 10
-#define CM_GCR_Cx_CONFIG_IOCUTYPE_MSK (_ULCAST_(0x3) << 10)
-#define CM_GCR_Cx_CONFIG_PVPE_SHF 0
-#define CM_GCR_Cx_CONFIG_PVPE_MSK (_ULCAST_(0x3ff) << 0)
-
-/* GCR_Cx_OTHER register fields */
-#define CM_GCR_Cx_OTHER_CORENUM_SHF 16
-#define CM_GCR_Cx_OTHER_CORENUM_MSK (_ULCAST_(0xffff) << 16)
-#define CM3_GCR_Cx_OTHER_CORE_SHF 8
-#define CM3_GCR_Cx_OTHER_CORE_MSK (_ULCAST_(0x3f) << 8)
-#define CM3_GCR_Cx_OTHER_VP_SHF 0
-#define CM3_GCR_Cx_OTHER_VP_MSK (_ULCAST_(0x7) << 0)
-
-/* GCR_Cx_RESET_BASE register fields */
-#define CM_GCR_Cx_RESET_BASE_BEVEXCBASE_SHF 12
-#define CM_GCR_Cx_RESET_BASE_BEVEXCBASE_MSK (_ULCAST_(0xfffff) << 12)
-
-/* GCR_Cx_RESET_EXT_BASE register fields */
-#define CM_GCR_Cx_RESET_EXT_BASE_EVARESET_SHF 31
-#define CM_GCR_Cx_RESET_EXT_BASE_EVARESET_MSK (_ULCAST_(0x1) << 31)
-#define CM_GCR_Cx_RESET_EXT_BASE_UEB_SHF 30
-#define CM_GCR_Cx_RESET_EXT_BASE_UEB_MSK (_ULCAST_(0x1) << 30)
-#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK_SHF 20
-#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK_MSK (_ULCAST_(0xff) << 20)
-#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA_SHF 1
-#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA_MSK (_ULCAST_(0x7f) << 1)
-#define CM_GCR_Cx_RESET_EXT_BASE_PRESENT_SHF 0
-#define CM_GCR_Cx_RESET_EXT_BASE_PRESENT_MSK (_ULCAST_(0x1) << 0)
-
-/**
- * mips_cm_numcores - return the number of cores present in the system
- *
- * Returns the value of the PCORES field of the GCR_CONFIG register plus 1, or
- * zero if no Coherence Manager is present.
- */
-static inline unsigned mips_cm_numcores(void)
-{
- if (!mips_cm_present())
- return 0;
-
- return ((read_gcr_config() & CM_GCR_CONFIG_PCORES_MSK)
- >> CM_GCR_CONFIG_PCORES_SHF) + 1;
-}
-
-/**
- * mips_cm_numiocu - return the number of IOCUs present in the system
- *
- * Returns the value of the NUMIOCU field of the GCR_CONFIG register, or zero
- * if no Coherence Manager is present.
- */
-static inline unsigned mips_cm_numiocu(void)
-{
- if (!mips_cm_present())
- return 0;
-
- return (read_gcr_config() & CM_GCR_CONFIG_NUMIOCU_MSK)
- >> CM_GCR_CONFIG_NUMIOCU_SHF;
-}
+#define CM_REV_CM3_5 CM_ENCODE_REV(9, 0)
+
+/* GCR_ERR_CONTROL - Control error checking logic */
+GCR_ACCESSOR_RW(32, 0x038, err_control)
+#define CM_GCR_ERR_CONTROL_L2_ECC_EN BIT(1)
+#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT BIT(0)
+
+/* GCR_ERR_MASK - Control which errors are reported as interrupts */
+GCR_ACCESSOR_RW(64, 0x040, error_mask)
+
+/* GCR_ERR_CAUSE - Indicates the type of error that occurred */
+GCR_ACCESSOR_RW(64, 0x048, error_cause)
+#define CM_GCR_ERROR_CAUSE_ERRTYPE GENMASK(31, 27)
+#define CM3_GCR_ERROR_CAUSE_ERRTYPE GENMASK_ULL(63, 58)
+#define CM_GCR_ERROR_CAUSE_ERRINFO GENMASK(26, 0)
+
+/* GCR_ERR_ADDR - Indicates the address associated with an error */
+GCR_ACCESSOR_RW(64, 0x050, error_addr)
+
+/* GCR_ERR_MULT - Indicates when multiple errors have occurred */
+GCR_ACCESSOR_RW(64, 0x058, error_mult)
+#define CM_GCR_ERROR_MULT_ERR2ND GENMASK(4, 0)
+
+/* GCR_L2_ONLY_SYNC_BASE - Base address of the L2 cache-only sync region */
+GCR_ACCESSOR_RW(64, 0x070, l2_only_sync_base)
+#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE GENMASK(31, 12)
+#define CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN BIT(0)
+
+/* GCR_GIC_BASE - Base address of the Global Interrupt Controller (GIC) */
+GCR_ACCESSOR_RW(64, 0x080, gic_base)
+#define CM_GCR_GIC_BASE_GICBASE GENMASK(31, 17)
+#define CM_GCR_GIC_BASE_GICEN BIT(0)
+
+/* GCR_CPC_BASE - Base address of the Cluster Power Controller (CPC) */
+GCR_ACCESSOR_RW(64, 0x088, cpc_base)
+#define CM_GCR_CPC_BASE_CPCBASE GENMASK(31, 15)
+#define CM_GCR_CPC_BASE_CPCEN BIT(0)
+
+/* GCR_REGn_BASE - Base addresses of CM address regions */
+GCR_ACCESSOR_RW(64, 0x090, reg0_base)
+GCR_ACCESSOR_RW(64, 0x0a0, reg1_base)
+GCR_ACCESSOR_RW(64, 0x0b0, reg2_base)
+GCR_ACCESSOR_RW(64, 0x0c0, reg3_base)
+#define CM_GCR_REGn_BASE_BASEADDR GENMASK(31, 16)
+
+/* GCR_REGn_MASK - Size & destination of CM address regions */
+GCR_ACCESSOR_RW(64, 0x098, reg0_mask)
+GCR_ACCESSOR_RW(64, 0x0a8, reg1_mask)
+GCR_ACCESSOR_RW(64, 0x0b8, reg2_mask)
+GCR_ACCESSOR_RW(64, 0x0c8, reg3_mask)
+#define CM_GCR_REGn_MASK_ADDRMASK GENMASK(31, 16)
+#define CM_GCR_REGn_MASK_CCAOVR GENMASK(7, 5)
+#define CM_GCR_REGn_MASK_CCAOVREN BIT(4)
+#define CM_GCR_REGn_MASK_DROPL2 BIT(2)
+#define CM_GCR_REGn_MASK_CMTGT GENMASK(1, 0)
+#define CM_GCR_REGn_MASK_CMTGT_DISABLED 0x0
+#define CM_GCR_REGn_MASK_CMTGT_MEM 0x1
+#define CM_GCR_REGn_MASK_CMTGT_IOCU0 0x2
+#define CM_GCR_REGn_MASK_CMTGT_IOCU1 0x3
+
+/* GCR_GIC_STATUS - Indicates presence of a Global Interrupt Controller (GIC) */
+GCR_ACCESSOR_RO(32, 0x0d0, gic_status)
+#define CM_GCR_GIC_STATUS_EX BIT(0)
+
+/* GCR_CPC_STATUS - Indicates presence of a Cluster Power Controller (CPC) */
+GCR_ACCESSOR_RO(32, 0x0f0, cpc_status)
+#define CM_GCR_CPC_STATUS_EX BIT(0)
+
+/* GCR_L2_CONFIG - Indicates L2 cache configuration when Config5.L2C=1 */
+GCR_ACCESSOR_RW(32, 0x130, l2_config)
+#define CM_GCR_L2_CONFIG_BYPASS BIT(20)
+#define CM_GCR_L2_CONFIG_SET_SIZE GENMASK(15, 12)
+#define CM_GCR_L2_CONFIG_LINE_SIZE GENMASK(11, 8)
+#define CM_GCR_L2_CONFIG_ASSOC GENMASK(7, 0)
+
+/* GCR_SYS_CONFIG2 - Further information about the system */
+GCR_ACCESSOR_RO(32, 0x150, sys_config2)
+#define CM_GCR_SYS_CONFIG2_MAXVPW GENMASK(3, 0)
+
+/* GCR_L2_PFT_CONTROL - Controls hardware L2 prefetching */
+GCR_ACCESSOR_RW(32, 0x300, l2_pft_control)
+#define CM_GCR_L2_PFT_CONTROL_PAGEMASK GENMASK(31, 12)
+#define CM_GCR_L2_PFT_CONTROL_PFTEN BIT(8)
+#define CM_GCR_L2_PFT_CONTROL_NPFT GENMASK(7, 0)
+
+/* GCR_L2_PFT_CONTROL_B - Controls hardware L2 prefetching */
+GCR_ACCESSOR_RW(32, 0x308, l2_pft_control_b)
+#define CM_GCR_L2_PFT_CONTROL_B_CEN BIT(8)
+#define CM_GCR_L2_PFT_CONTROL_B_PORTID GENMASK(7, 0)
+
+/* GCR_L2SM_COP - L2 cache op state machine control */
+GCR_ACCESSOR_RW(32, 0x620, l2sm_cop)
+#define CM_GCR_L2SM_COP_PRESENT BIT(31)
+#define CM_GCR_L2SM_COP_RESULT GENMASK(8, 6)
+#define CM_GCR_L2SM_COP_RESULT_DONTCARE 0
+#define CM_GCR_L2SM_COP_RESULT_DONE_OK 1
+#define CM_GCR_L2SM_COP_RESULT_DONE_ERROR 2
+#define CM_GCR_L2SM_COP_RESULT_ABORT_OK 3
+#define CM_GCR_L2SM_COP_RESULT_ABORT_ERROR 4
+#define CM_GCR_L2SM_COP_RUNNING BIT(5)
+#define CM_GCR_L2SM_COP_TYPE GENMASK(4, 2)
+#define CM_GCR_L2SM_COP_TYPE_IDX_WBINV 0
+#define CM_GCR_L2SM_COP_TYPE_IDX_STORETAG 1
+#define CM_GCR_L2SM_COP_TYPE_IDX_STORETAGDATA 2
+#define CM_GCR_L2SM_COP_TYPE_HIT_INV 4
+#define CM_GCR_L2SM_COP_TYPE_HIT_WBINV 5
+#define CM_GCR_L2SM_COP_TYPE_HIT_WB 6
+#define CM_GCR_L2SM_COP_TYPE_FETCHLOCK 7
+#define CM_GCR_L2SM_COP_CMD GENMASK(1, 0)
+#define CM_GCR_L2SM_COP_CMD_START 1 /* only when idle */
+#define CM_GCR_L2SM_COP_CMD_ABORT 3 /* only when running */
+
+/* GCR_L2SM_TAG_ADDR_COP - L2 cache op state machine address control */
+GCR_ACCESSOR_RW(64, 0x628, l2sm_tag_addr_cop)
+#define CM_GCR_L2SM_TAG_ADDR_COP_NUM_LINES GENMASK_ULL(63, 48)
+#define CM_GCR_L2SM_TAG_ADDR_COP_START_TAG GENMASK_ULL(47, 6)
+
+/* GCR_BEV_BASE - Controls the location of the BEV for powered up cores */
+GCR_ACCESSOR_RW(64, 0x680, bev_base)
+
+/* GCR_Cx_RESET_RELEASE - Controls core reset for CM 1.x */
+GCR_CX_ACCESSOR_RW(32, 0x000, reset_release)
+
+/* GCR_Cx_COHERENCE - Controls core coherence */
+GCR_CX_ACCESSOR_RW(32, 0x008, coherence)
+#define CM_GCR_Cx_COHERENCE_COHDOMAINEN GENMASK(7, 0)
+#define CM3_GCR_Cx_COHERENCE_COHEN BIT(0)
+
+/* GCR_Cx_CONFIG - Information about a core's configuration */
+GCR_CX_ACCESSOR_RO(32, 0x010, config)
+#define CM_GCR_Cx_CONFIG_IOCUTYPE GENMASK(11, 10)
+#define CM_GCR_Cx_CONFIG_PVPE GENMASK(9, 0)
+
+/* GCR_Cx_OTHER - Configure the core-other/redirect GCR block */
+GCR_CX_ACCESSOR_RW(32, 0x018, other)
+#define CM_GCR_Cx_OTHER_CORENUM GENMASK(31, 16) /* CM < 3 */
+#define CM_GCR_Cx_OTHER_CLUSTER_EN BIT(31) /* CM >= 3.5 */
+#define CM_GCR_Cx_OTHER_GIC_EN BIT(30) /* CM >= 3.5 */
+#define CM_GCR_Cx_OTHER_BLOCK GENMASK(25, 24) /* CM >= 3.5 */
+#define CM_GCR_Cx_OTHER_BLOCK_LOCAL 0
+#define CM_GCR_Cx_OTHER_BLOCK_GLOBAL 1
+#define CM_GCR_Cx_OTHER_BLOCK_USER 2
+#define CM_GCR_Cx_OTHER_BLOCK_GLOBAL_HIGH 3
+#define CM_GCR_Cx_OTHER_CLUSTER GENMASK(21, 16) /* CM >= 3.5 */
+#define CM3_GCR_Cx_OTHER_CORE GENMASK(13, 8) /* CM >= 3 */
+#define CM_GCR_Cx_OTHER_CORE_CM 32
+#define CM3_GCR_Cx_OTHER_VP GENMASK(2, 0) /* CM >= 3 */
+
+/* GCR_Cx_RESET_BASE - Configure where powered up cores will fetch from */
+GCR_CX_ACCESSOR_RW(32, 0x020, reset_base)
+#define CM_GCR_Cx_RESET_BASE_BEVEXCBASE GENMASK(31, 12)
+
+/* GCR_Cx_ID - Identify the current core */
+GCR_CX_ACCESSOR_RO(32, 0x028, id)
+#define CM_GCR_Cx_ID_CLUSTER GENMASK(15, 8)
+#define CM_GCR_Cx_ID_CORE GENMASK(7, 0)
+
+/* GCR_Cx_RESET_EXT_BASE - Configure behaviour when cores reset or power up */
+GCR_CX_ACCESSOR_RW(32, 0x030, reset_ext_base)
+#define CM_GCR_Cx_RESET_EXT_BASE_EVARESET BIT(31)
+#define CM_GCR_Cx_RESET_EXT_BASE_UEB BIT(30)
+#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCMASK GENMASK(27, 20)
+#define CM_GCR_Cx_RESET_EXT_BASE_BEVEXCPA GENMASK(7, 1)
+#define CM_GCR_Cx_RESET_EXT_BASE_PRESENT BIT(0)
/**
* mips_cm_l2sync - perform an L2-only sync operation
@@ -469,7 +369,7 @@ static inline unsigned int mips_cm_max_vp_width(void)
uint32_t cfg;
if (mips_cm_revision() >= CM_REV_CM3)
- return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW_MSK;
+ return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW;
if (mips_cm_present()) {
/*
@@ -477,8 +377,8 @@ static inline unsigned int mips_cm_max_vp_width(void)
* number of VP(E)s, and if that ever changes then this will
* need revisiting.
*/
- cfg = read_gcr_cl_config() & CM_GCR_Cx_CONFIG_PVPE_MSK;
- return (cfg >> CM_GCR_Cx_CONFIG_PVPE_SHF) + 1;
+ cfg = read_gcr_cl_config() & CM_GCR_Cx_CONFIG_PVPE;
+ return (cfg >> __ffs(CM_GCR_Cx_CONFIG_PVPE)) + 1;
}
if (IS_ENABLED(CONFIG_SMP))
@@ -499,7 +399,7 @@ static inline unsigned int mips_cm_max_vp_width(void)
*/
static inline unsigned int mips_cm_vp_id(unsigned int cpu)
{
- unsigned int core = cpu_data[cpu].core;
+ unsigned int core = cpu_core(&cpu_data[cpu]);
unsigned int vp = cpu_vpe_id(&cpu_data[cpu]);
return (core * mips_cm_max_vp_width()) + vp;
@@ -508,29 +408,56 @@ static inline unsigned int mips_cm_vp_id(unsigned int cpu)
#ifdef CONFIG_MIPS_CM
/**
- * mips_cm_lock_other - lock access to another core
+ * mips_cm_lock_other - lock access to redirect/other region
+ * @cluster: the other cluster to be accessed
* @core: the other core to be accessed
* @vp: the VP within the other core to be accessed
+ * @block: the register block to be accessed
*
- * Call before operating upon a core via the 'other' register region in
- * order to prevent the region being moved during access. Must be followed
- * by a call to mips_cm_unlock_other.
+ * Configure the redirect/other region for the local core/VP (depending upon
+ * the CM revision) to target the specified @cluster, @core, @vp & register
+ * @block. Must be called before using the redirect/other region, and followed
+ * by a call to mips_cm_unlock_other() when access to the redirect/other region
+ * is complete.
+ *
+ * This function acquires a spinlock such that code between it &
+ * mips_cm_unlock_other() calls cannot be pre-empted by anything which may
+ * reconfigure the redirect/other region, and cannot be interfered with by
+ * another VP in the core. As such calls to this function should not be nested.
*/
-extern void mips_cm_lock_other(unsigned int core, unsigned int vp);
+extern void mips_cm_lock_other(unsigned int cluster, unsigned int core,
+ unsigned int vp, unsigned int block);
/**
- * mips_cm_unlock_other - unlock access to another core
+ * mips_cm_unlock_other - unlock access to redirect/other region
*
- * Call after operating upon another core via the 'other' register region.
- * Must be called after mips_cm_lock_other.
+ * Must be called after mips_cm_lock_other() once all required access to the
+ * redirect/other region has been completed.
*/
extern void mips_cm_unlock_other(void);
#else /* !CONFIG_MIPS_CM */
-static inline void mips_cm_lock_other(unsigned int core, unsigned int vp) { }
+static inline void mips_cm_lock_other(unsigned int cluster, unsigned int core,
+ unsigned int vp, unsigned int block) { }
static inline void mips_cm_unlock_other(void) { }
#endif /* !CONFIG_MIPS_CM */
+/**
+ * mips_cm_lock_other_cpu - lock access to redirect/other region
+ * @cpu: the other CPU whose register we want to access
+ *
+ * Configure the redirect/other region for the local core/VP (depending upon
+ * the CM revision) to target the specified @cpu & register @block. This is
+ * equivalent to calling mips_cm_lock_other() but accepts a Linux CPU number
+ * for convenience.
+ */
+static inline void mips_cm_lock_other_cpu(unsigned int cpu, unsigned int block)
+{
+ struct cpuinfo_mips *d = &cpu_data[cpu];
+
+ mips_cm_lock_other(cpu_cluster(d), cpu_core(d), cpu_vpe_id(d), block);
+}
+
#endif /* __MIPS_ASM_MIPS_CM_H__ */
diff --git a/arch/mips/include/asm/mips-cpc.h b/arch/mips/include/asm/mips-cpc.h
index 8c519f9827a3..f885051a8378 100644
--- a/arch/mips/include/asm/mips-cpc.h
+++ b/arch/mips/include/asm/mips-cpc.h
@@ -8,11 +8,15 @@
* option) any later version.
*/
+#ifndef __MIPS_ASM_MIPS_CPS_H__
+# error Please include asm/mips-cps.h rather than asm/mips-cpc.h
+#endif
+
#ifndef __MIPS_ASM_MIPS_CPC_H__
#define __MIPS_ASM_MIPS_CPC_H__
-#include <linux/io.h>
-#include <linux/types.h>
+#include <linux/bitops.h>
+#include <linux/errno.h>
/* The base address of the CPC registers */
extern void __iomem *mips_cpc_base;
@@ -61,89 +65,92 @@ static inline bool mips_cpc_present(void)
#define MIPS_CPC_CLCB_OFS 0x2000
#define MIPS_CPC_COCB_OFS 0x4000
-/* Macros to ease the creation of register access functions */
-#define BUILD_CPC_R_(name, off) \
-static inline u32 *addr_cpc_##name(void) \
-{ \
- return (u32 *)(mips_cpc_base + (off)); \
-} \
- \
-static inline u32 read_cpc_##name(void) \
-{ \
- return __raw_readl(mips_cpc_base + (off)); \
-}
-
-#define BUILD_CPC__W(name, off) \
-static inline void write_cpc_##name(u32 value) \
-{ \
- __raw_writel(value, mips_cpc_base + (off)); \
-}
-
-#define BUILD_CPC_RW(name, off) \
- BUILD_CPC_R_(name, off) \
- BUILD_CPC__W(name, off)
-
-#define BUILD_CPC_Cx_R_(name, off) \
- BUILD_CPC_R_(cl_##name, MIPS_CPC_CLCB_OFS + (off)) \
- BUILD_CPC_R_(co_##name, MIPS_CPC_COCB_OFS + (off))
-
-#define BUILD_CPC_Cx__W(name, off) \
- BUILD_CPC__W(cl_##name, MIPS_CPC_CLCB_OFS + (off)) \
- BUILD_CPC__W(co_##name, MIPS_CPC_COCB_OFS + (off))
-
-#define BUILD_CPC_Cx_RW(name, off) \
- BUILD_CPC_Cx_R_(name, off) \
- BUILD_CPC_Cx__W(name, off)
-
-/* GCB register accessor functions */
-BUILD_CPC_RW(access, MIPS_CPC_GCB_OFS + 0x00)
-BUILD_CPC_RW(seqdel, MIPS_CPC_GCB_OFS + 0x08)
-BUILD_CPC_RW(rail, MIPS_CPC_GCB_OFS + 0x10)
-BUILD_CPC_RW(resetlen, MIPS_CPC_GCB_OFS + 0x18)
-BUILD_CPC_R_(revision, MIPS_CPC_GCB_OFS + 0x20)
-
-/* Core Local & Core Other accessor functions */
-BUILD_CPC_Cx_RW(cmd, 0x00)
-BUILD_CPC_Cx_RW(stat_conf, 0x08)
-BUILD_CPC_Cx_RW(other, 0x10)
-BUILD_CPC_Cx_RW(vp_stop, 0x20)
-BUILD_CPC_Cx_RW(vp_run, 0x28)
-BUILD_CPC_Cx_RW(vp_running, 0x30)
-
-/* CPC_Cx_CMD register fields */
-#define CPC_Cx_CMD_SHF 0
-#define CPC_Cx_CMD_MSK (_ULCAST_(0xf) << 0)
-#define CPC_Cx_CMD_CLOCKOFF (_ULCAST_(0x1) << 0)
-#define CPC_Cx_CMD_PWRDOWN (_ULCAST_(0x2) << 0)
-#define CPC_Cx_CMD_PWRUP (_ULCAST_(0x3) << 0)
-#define CPC_Cx_CMD_RESET (_ULCAST_(0x4) << 0)
-
-/* CPC_Cx_STAT_CONF register fields */
-#define CPC_Cx_STAT_CONF_PWRUPE_SHF 23
-#define CPC_Cx_STAT_CONF_PWRUPE_MSK (_ULCAST_(0x1) << 23)
-#define CPC_Cx_STAT_CONF_SEQSTATE_SHF 19
-#define CPC_Cx_STAT_CONF_SEQSTATE_MSK (_ULCAST_(0xf) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_D0 (_ULCAST_(0x0) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U0 (_ULCAST_(0x1) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U1 (_ULCAST_(0x2) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U2 (_ULCAST_(0x3) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U3 (_ULCAST_(0x4) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U4 (_ULCAST_(0x5) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U5 (_ULCAST_(0x6) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_U6 (_ULCAST_(0x7) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_D1 (_ULCAST_(0x8) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_D3 (_ULCAST_(0x9) << 19)
-#define CPC_Cx_STAT_CONF_SEQSTATE_D2 (_ULCAST_(0xa) << 19)
-#define CPC_Cx_STAT_CONF_CLKGAT_IMPL_SHF 17
-#define CPC_Cx_STAT_CONF_CLKGAT_IMPL_MSK (_ULCAST_(0x1) << 17)
-#define CPC_Cx_STAT_CONF_PWRDN_IMPL_SHF 16
-#define CPC_Cx_STAT_CONF_PWRDN_IMPL_MSK (_ULCAST_(0x1) << 16)
-#define CPC_Cx_STAT_CONF_EJTAG_PROBE_SHF 15
-#define CPC_Cx_STAT_CONF_EJTAG_PROBE_MSK (_ULCAST_(0x1) << 15)
-
-/* CPC_Cx_OTHER register fields */
-#define CPC_Cx_OTHER_CORENUM_SHF 16
-#define CPC_Cx_OTHER_CORENUM_MSK (_ULCAST_(0xff) << 16)
+#define CPC_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
+ CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
+
+#define CPC_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_GCB_OFS + off, name) \
+ CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, redir_##name)
+
+#define CPC_CX_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
+ CPS_ACCESSOR_RO(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
+
+#define CPC_CX_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_CLCB_OFS + off, cl_##name) \
+ CPS_ACCESSOR_RW(cpc, sz, MIPS_CPC_COCB_OFS + off, co_##name)
+
+/* CPC_ACCESS - Control core/IOCU access to CPC registers prior to CM 3 */
+CPC_ACCESSOR_RW(32, 0x000, access)
+
+/* CPC_SEQDEL - Configure delays between command sequencer steps */
+CPC_ACCESSOR_RW(32, 0x008, seqdel)
+
+/* CPC_RAIL - Configure the delay from rail power-up to stability */
+CPC_ACCESSOR_RW(32, 0x010, rail)
+
+/* CPC_RESETLEN - Configure the length of reset sequences */
+CPC_ACCESSOR_RW(32, 0x018, resetlen)
+
+/* CPC_REVISION - Indicates the revisison of the CPC */
+CPC_ACCESSOR_RO(32, 0x020, revision)
+
+/* CPC_PWRUP_CTL - Control power to the Coherence Manager (CM) */
+CPC_ACCESSOR_RW(32, 0x030, pwrup_ctl)
+#define CPC_PWRUP_CTL_CM_PWRUP BIT(0)
+
+/* CPC_CONFIG - Mirrors GCR_CONFIG */
+CPC_ACCESSOR_RW(64, 0x138, config)
+
+/* CPC_SYS_CONFIG - Control cluster endianness */
+CPC_ACCESSOR_RW(32, 0x140, sys_config)
+#define CPC_SYS_CONFIG_BE_IMMEDIATE BIT(2)
+#define CPC_SYS_CONFIG_BE_STATUS BIT(1)
+#define CPC_SYS_CONFIG_BE BIT(0)
+
+/* CPC_Cx_CMD - Instruct the CPC to take action on a core */
+CPC_CX_ACCESSOR_RW(32, 0x000, cmd)
+#define CPC_Cx_CMD GENMASK(3, 0)
+#define CPC_Cx_CMD_CLOCKOFF 0x1
+#define CPC_Cx_CMD_PWRDOWN 0x2
+#define CPC_Cx_CMD_PWRUP 0x3
+#define CPC_Cx_CMD_RESET 0x4
+
+/* CPC_Cx_STAT_CONF - Indicates core configuration & state */
+CPC_CX_ACCESSOR_RW(32, 0x008, stat_conf)
+#define CPC_Cx_STAT_CONF_PWRUPE BIT(23)
+#define CPC_Cx_STAT_CONF_SEQSTATE GENMASK(22, 19)
+#define CPC_Cx_STAT_CONF_SEQSTATE_D0 0x0
+#define CPC_Cx_STAT_CONF_SEQSTATE_U0 0x1
+#define CPC_Cx_STAT_CONF_SEQSTATE_U1 0x2
+#define CPC_Cx_STAT_CONF_SEQSTATE_U2 0x3
+#define CPC_Cx_STAT_CONF_SEQSTATE_U3 0x4
+#define CPC_Cx_STAT_CONF_SEQSTATE_U4 0x5
+#define CPC_Cx_STAT_CONF_SEQSTATE_U5 0x6
+#define CPC_Cx_STAT_CONF_SEQSTATE_U6 0x7
+#define CPC_Cx_STAT_CONF_SEQSTATE_D1 0x8
+#define CPC_Cx_STAT_CONF_SEQSTATE_D3 0x9
+#define CPC_Cx_STAT_CONF_SEQSTATE_D2 0xa
+#define CPC_Cx_STAT_CONF_CLKGAT_IMPL BIT(17)
+#define CPC_Cx_STAT_CONF_PWRDN_IMPL BIT(16)
+#define CPC_Cx_STAT_CONF_EJTAG_PROBE BIT(15)
+
+/* CPC_Cx_OTHER - Configure the core-other register block prior to CM 3 */
+CPC_CX_ACCESSOR_RW(32, 0x010, other)
+#define CPC_Cx_OTHER_CORENUM GENMASK(23, 16)
+
+/* CPC_Cx_VP_STOP - Stop Virtual Processors (VPs) within a core from running */
+CPC_CX_ACCESSOR_RW(32, 0x020, vp_stop)
+
+/* CPC_Cx_VP_START - Start Virtual Processors (VPs) within a core running */
+CPC_CX_ACCESSOR_RW(32, 0x028, vp_run)
+
+/* CPC_Cx_VP_RUNNING - Indicate which Virtual Processors (VPs) are running */
+CPC_CX_ACCESSOR_RW(32, 0x030, vp_running)
+
+/* CPC_Cx_CONFIG - Mirrors GCR_Cx_CONFIG */
+CPC_CX_ACCESSOR_RW(32, 0x090, config)
#ifdef CONFIG_MIPS_CPC
diff --git a/arch/mips/include/asm/mips-cps.h b/arch/mips/include/asm/mips-cps.h
new file mode 100644
index 000000000000..bf02b5070a98
--- /dev/null
+++ b/arch/mips/include/asm/mips-cps.h
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2017 Imagination Technologies
+ * Author: Paul Burton <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#ifndef __MIPS_ASM_MIPS_CPS_H__
+#define __MIPS_ASM_MIPS_CPS_H__
+
+#include <linux/io.h>
+#include <linux/types.h>
+
+extern unsigned long __cps_access_bad_size(void)
+ __compiletime_error("Bad size for CPS accessor");
+
+#define CPS_ACCESSOR_A(unit, off, name) \
+static inline void *addr_##unit##_##name(void) \
+{ \
+ return mips_##unit##_base + (off); \
+}
+
+#define CPS_ACCESSOR_R(unit, sz, name) \
+static inline uint##sz##_t read_##unit##_##name(void) \
+{ \
+ uint64_t val64; \
+ \
+ switch (sz) { \
+ case 32: \
+ return __raw_readl(addr_##unit##_##name()); \
+ \
+ case 64: \
+ if (mips_cm_is64) \
+ return __raw_readq(addr_##unit##_##name()); \
+ \
+ val64 = __raw_readl(addr_##unit##_##name() + 4); \
+ val64 <<= 32; \
+ val64 |= __raw_readl(addr_##unit##_##name()); \
+ return val64; \
+ \
+ default: \
+ return __cps_access_bad_size(); \
+ } \
+}
+
+#define CPS_ACCESSOR_W(unit, sz, name) \
+static inline void write_##unit##_##name(uint##sz##_t val) \
+{ \
+ switch (sz) { \
+ case 32: \
+ __raw_writel(val, addr_##unit##_##name()); \
+ break; \
+ \
+ case 64: \
+ if (mips_cm_is64) { \
+ __raw_writeq(val, addr_##unit##_##name()); \
+ break; \
+ } \
+ \
+ __raw_writel((uint64_t)val >> 32, \
+ addr_##unit##_##name() + 4); \
+ __raw_writel(val, addr_##unit##_##name()); \
+ break; \
+ \
+ default: \
+ __cps_access_bad_size(); \
+ break; \
+ } \
+}
+
+#define CPS_ACCESSOR_M(unit, sz, name) \
+static inline void change_##unit##_##name(uint##sz##_t mask, \
+ uint##sz##_t val) \
+{ \
+ uint##sz##_t reg_val = read_##unit##_##name(); \
+ reg_val &= ~mask; \
+ reg_val |= val; \
+ write_##unit##_##name(reg_val); \
+} \
+ \
+static inline void set_##unit##_##name(uint##sz##_t val) \
+{ \
+ change_##unit##_##name(val, val); \
+} \
+ \
+static inline void clear_##unit##_##name(uint##sz##_t val) \
+{ \
+ change_##unit##_##name(val, 0); \
+}
+
+#define CPS_ACCESSOR_RO(unit, sz, off, name) \
+ CPS_ACCESSOR_A(unit, off, name) \
+ CPS_ACCESSOR_R(unit, sz, name)
+
+#define CPS_ACCESSOR_WO(unit, sz, off, name) \
+ CPS_ACCESSOR_A(unit, off, name) \
+ CPS_ACCESSOR_W(unit, sz, name)
+
+#define CPS_ACCESSOR_RW(unit, sz, off, name) \
+ CPS_ACCESSOR_A(unit, off, name) \
+ CPS_ACCESSOR_R(unit, sz, name) \
+ CPS_ACCESSOR_W(unit, sz, name) \
+ CPS_ACCESSOR_M(unit, sz, name)
+
+#include <asm/mips-cm.h>
+#include <asm/mips-cpc.h>
+#include <asm/mips-gic.h>
+
+/**
+ * mips_cps_numclusters - return the number of clusters present in the system
+ *
+ * Returns the number of clusters in the system.
+ */
+static inline unsigned int mips_cps_numclusters(void)
+{
+ unsigned int num_clusters;
+
+ if (mips_cm_revision() < CM_REV_CM3_5)
+ return 1;
+
+ num_clusters = read_gcr_config() & CM_GCR_CONFIG_NUM_CLUSTERS;
+ num_clusters >>= __ffs(CM_GCR_CONFIG_NUM_CLUSTERS);
+ return num_clusters;
+}
+
+/**
+ * mips_cps_cluster_config - return (GCR|CPC)_CONFIG from a cluster
+ * @cluster: the ID of the cluster whose config we want
+ *
+ * Read the value of GCR_CONFIG (or its CPC_CONFIG mirror) from a @cluster.
+ *
+ * Returns the value of GCR_CONFIG.
+ */
+static inline uint64_t mips_cps_cluster_config(unsigned int cluster)
+{
+ uint64_t config;
+
+ if (mips_cm_revision() < CM_REV_CM3_5) {
+ /*
+ * Prior to CM 3.5 we don't have the notion of multiple
+ * clusters so we can trivially read the GCR_CONFIG register
+ * within this cluster.
+ */
+ WARN_ON(cluster != 0);
+ config = read_gcr_config();
+ } else {
+ /*
+ * From CM 3.5 onwards we read the CPC_CONFIG mirror of
+ * GCR_CONFIG via the redirect region, since the CPC is always
+ * powered up allowing us not to need to power up the CM.
+ */
+ mips_cm_lock_other(cluster, 0, 0, CM_GCR_Cx_OTHER_BLOCK_GLOBAL);
+ config = read_cpc_redir_config();
+ mips_cm_unlock_other();
+ }
+
+ return config;
+}
+
+/**
+ * mips_cps_numcores - return the number of cores present in a cluster
+ * @cluster: the ID of the cluster whose core count we want
+ *
+ * Returns the value of the PCORES field of the GCR_CONFIG register plus 1, or
+ * zero if no Coherence Manager is present.
+ */
+static inline unsigned int mips_cps_numcores(unsigned int cluster)
+{
+ if (!mips_cm_present())
+ return 0;
+
+ /* Add one before masking to handle 0xff indicating no cores */
+ return (mips_cps_cluster_config(cluster) + 1) & CM_GCR_CONFIG_PCORES;
+}
+
+/**
+ * mips_cps_numiocu - return the number of IOCUs present in a cluster
+ * @cluster: the ID of the cluster whose IOCU count we want
+ *
+ * Returns the value of the NUMIOCU field of the GCR_CONFIG register, or zero
+ * if no Coherence Manager is present.
+ */
+static inline unsigned int mips_cps_numiocu(unsigned int cluster)
+{
+ unsigned int num_iocu;
+
+ if (!mips_cm_present())
+ return 0;
+
+ num_iocu = mips_cps_cluster_config(cluster) & CM_GCR_CONFIG_NUMIOCU;
+ num_iocu >>= __ffs(CM_GCR_CONFIG_NUMIOCU);
+ return num_iocu;
+}
+
+/**
+ * mips_cps_numvps - return the number of VPs (threads) supported by a core
+ * @cluster: the ID of the cluster containing the core we want to examine
+ * @core: the ID of the core whose VP count we want
+ *
+ * Returns the number of Virtual Processors (VPs, ie. hardware threads) that
+ * are supported by the given @core in the given @cluster. If the core or the
+ * kernel do not support hardware mutlti-threading this returns 1.
+ */
+static inline unsigned int mips_cps_numvps(unsigned int cluster, unsigned int core)
+{
+ unsigned int cfg;
+
+ if (!mips_cm_present())
+ return 1;
+
+ if ((!IS_ENABLED(CONFIG_MIPS_MT_SMP) || !cpu_has_mipsmt)
+ && (!IS_ENABLED(CONFIG_CPU_MIPSR6) || !cpu_has_vp))
+ return 1;
+
+ mips_cm_lock_other(cluster, core, 0, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
+
+ if (mips_cm_revision() < CM_REV_CM3_5) {
+ /*
+ * Prior to CM 3.5 we can only have one cluster & don't have
+ * CPC_Cx_CONFIG, so we read GCR_Cx_CONFIG.
+ */
+ cfg = read_gcr_co_config();
+ } else {
+ /*
+ * From CM 3.5 onwards we read CPC_Cx_CONFIG because the CPC is
+ * always powered, which allows us to not worry about powering
+ * up the cluster's CM here.
+ */
+ cfg = read_cpc_co_config();
+ }
+
+ mips_cm_unlock_other();
+
+ return (cfg + 1) & CM_GCR_Cx_CONFIG_PVPE;
+}
+
+#endif /* __MIPS_ASM_MIPS_CPS_H__ */
diff --git a/arch/mips/include/asm/mips-gic.h b/arch/mips/include/asm/mips-gic.h
new file mode 100644
index 000000000000..a2badf572632
--- /dev/null
+++ b/arch/mips/include/asm/mips-gic.h
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2017 Imagination Technologies
+ * Author: Paul Burton <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#ifndef __MIPS_ASM_MIPS_CPS_H__
+# error Please include asm/mips-cps.h rather than asm/mips-gic.h
+#endif
+
+#ifndef __MIPS_ASM_MIPS_GIC_H__
+#define __MIPS_ASM_MIPS_GIC_H__
+
+#include <linux/bitops.h>
+
+/* The base address of the GIC registers */
+extern void __iomem *mips_gic_base;
+
+/* Offsets from the GIC base address to various control blocks */
+#define MIPS_GIC_SHARED_OFS 0x00000
+#define MIPS_GIC_SHARED_SZ 0x08000
+#define MIPS_GIC_LOCAL_OFS 0x08000
+#define MIPS_GIC_LOCAL_SZ 0x04000
+#define MIPS_GIC_REDIR_OFS 0x0c000
+#define MIPS_GIC_REDIR_SZ 0x04000
+#define MIPS_GIC_USER_OFS 0x10000
+#define MIPS_GIC_USER_SZ 0x10000
+
+/* For read-only shared registers */
+#define GIC_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_SHARED_OFS + off, name)
+
+/* For read-write shared registers */
+#define GIC_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_SHARED_OFS + off, name)
+
+/* For read-only local registers */
+#define GIC_VX_ACCESSOR_RO(sz, off, name) \
+ CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_LOCAL_OFS + off, vl_##name) \
+ CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name)
+
+/* For read-write local registers */
+#define GIC_VX_ACCESSOR_RW(sz, off, name) \
+ CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_LOCAL_OFS + off, vl_##name) \
+ CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name)
+
+/* For read-only shared per-interrupt registers */
+#define GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
+static inline void __iomem *addr_gic_##name(unsigned int intr) \
+{ \
+ return mips_gic_base + (off) + (intr * (stride)); \
+} \
+ \
+static inline unsigned int read_gic_##name(unsigned int intr) \
+{ \
+ BUILD_BUG_ON(sz != 32); \
+ return __raw_readl(addr_gic_##name(intr)); \
+}
+
+/* For read-write shared per-interrupt registers */
+#define GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
+ GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
+ \
+static inline void write_gic_##name(unsigned int intr, \
+ unsigned int val) \
+{ \
+ BUILD_BUG_ON(sz != 32); \
+ __raw_writel(val, addr_gic_##name(intr)); \
+}
+
+/* For read-only local per-interrupt registers */
+#define GIC_VX_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
+ GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
+ stride, vl_##name) \
+ GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
+ stride, vo_##name)
+
+/* For read-write local per-interrupt registers */
+#define GIC_VX_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
+ GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
+ stride, vl_##name) \
+ GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
+ stride, vo_##name)
+
+/* For read-only shared bit-per-interrupt registers */
+#define GIC_ACCESSOR_RO_INTR_BIT(off, name) \
+static inline void __iomem *addr_gic_##name(void) \
+{ \
+ return mips_gic_base + (off); \
+} \
+ \
+static inline unsigned int read_gic_##name(unsigned int intr) \
+{ \
+ void __iomem *addr = addr_gic_##name(); \
+ unsigned int val; \
+ \
+ if (mips_cm_is64) { \
+ addr += (intr / 64) * sizeof(uint64_t); \
+ val = __raw_readq(addr) >> intr % 64; \
+ } else { \
+ addr += (intr / 32) * sizeof(uint32_t); \
+ val = __raw_readl(addr) >> intr % 32; \
+ } \
+ \
+ return val & 0x1; \
+}
+
+/* For read-write shared bit-per-interrupt registers */
+#define GIC_ACCESSOR_RW_INTR_BIT(off, name) \
+ GIC_ACCESSOR_RO_INTR_BIT(off, name) \
+ \
+static inline void write_gic_##name(unsigned int intr) \
+{ \
+ void __iomem *addr = addr_gic_##name(); \
+ \
+ if (mips_cm_is64) { \
+ addr += (intr / 64) * sizeof(uint64_t); \
+ __raw_writeq(BIT(intr % 64), addr); \
+ } else { \
+ addr += (intr / 32) * sizeof(uint32_t); \
+ __raw_writel(BIT(intr % 32), addr); \
+ } \
+} \
+ \
+static inline void change_gic_##name(unsigned int intr, \
+ unsigned int val) \
+{ \
+ void __iomem *addr = addr_gic_##name(); \
+ \
+ if (mips_cm_is64) { \
+ uint64_t _val; \
+ \
+ addr += (intr / 64) * sizeof(uint64_t); \
+ _val = __raw_readq(addr); \
+ _val &= ~BIT_ULL(intr % 64); \
+ _val |= (uint64_t)val << (intr % 64); \
+ __raw_writeq(_val, addr); \
+ } else { \
+ uint32_t _val; \
+ \
+ addr += (intr / 32) * sizeof(uint32_t); \
+ _val = __raw_readl(addr); \
+ _val &= ~BIT(intr % 32); \
+ _val |= val << (intr % 32); \
+ __raw_writel(_val, addr); \
+ } \
+}
+
+/* For read-only local bit-per-interrupt registers */
+#define GIC_VX_ACCESSOR_RO_INTR_BIT(sz, off, name) \
+ GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
+ vl_##name) \
+ GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \
+ vo_##name)
+
+/* For read-write local bit-per-interrupt registers */
+#define GIC_VX_ACCESSOR_RW_INTR_BIT(sz, off, name) \
+ GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
+ vl_##name) \
+ GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \
+ vo_##name)
+
+/* GIC_SH_CONFIG - Information about the GIC configuration */
+GIC_ACCESSOR_RW(32, 0x000, config)
+#define GIC_CONFIG_COUNTSTOP BIT(28)
+#define GIC_CONFIG_COUNTBITS GENMASK(27, 24)
+#define GIC_CONFIG_NUMINTERRUPTS GENMASK(23, 16)
+#define GIC_CONFIG_PVPS GENMASK(6, 0)
+
+/* GIC_SH_COUNTER - Shared global counter value */
+GIC_ACCESSOR_RW(64, 0x010, counter)
+GIC_ACCESSOR_RW(32, 0x010, counter_32l)
+GIC_ACCESSOR_RW(32, 0x014, counter_32h)
+
+/* GIC_SH_POL_* - Configures interrupt polarity */
+GIC_ACCESSOR_RW_INTR_BIT(0x100, pol)
+#define GIC_POL_ACTIVE_LOW 0 /* when level triggered */
+#define GIC_POL_ACTIVE_HIGH 1 /* when level triggered */
+#define GIC_POL_FALLING_EDGE 0 /* when single-edge triggered */
+#define GIC_POL_RISING_EDGE 1 /* when single-edge triggered */
+
+/* GIC_SH_TRIG_* - Configures interrupts to be edge or level triggered */
+GIC_ACCESSOR_RW_INTR_BIT(0x180, trig)
+#define GIC_TRIG_LEVEL 0
+#define GIC_TRIG_EDGE 1
+
+/* GIC_SH_DUAL_* - Configures whether interrupts trigger on both edges */
+GIC_ACCESSOR_RW_INTR_BIT(0x200, dual)
+#define GIC_DUAL_SINGLE 0 /* when edge-triggered */
+#define GIC_DUAL_DUAL 1 /* when edge-triggered */
+
+/* GIC_SH_WEDGE - Write an 'edge', ie. trigger an interrupt */
+GIC_ACCESSOR_RW(32, 0x280, wedge)
+#define GIC_WEDGE_RW BIT(31)
+#define GIC_WEDGE_INTR GENMASK(7, 0)
+
+/* GIC_SH_RMASK_* - Reset/clear shared interrupt mask bits */
+GIC_ACCESSOR_RW_INTR_BIT(0x300, rmask)
+
+/* GIC_SH_SMASK_* - Set shared interrupt mask bits */
+GIC_ACCESSOR_RW_INTR_BIT(0x380, smask)
+
+/* GIC_SH_MASK_* - Read the current shared interrupt mask */
+GIC_ACCESSOR_RO_INTR_BIT(0x400, mask)
+
+/* GIC_SH_PEND_* - Read currently pending shared interrupts */
+GIC_ACCESSOR_RO_INTR_BIT(0x480, pend)
+
+/* GIC_SH_MAPx_PIN - Map shared interrupts to a particular CPU pin */
+GIC_ACCESSOR_RW_INTR_REG(32, 0x500, 0x4, map_pin)
+#define GIC_MAP_PIN_MAP_TO_PIN BIT(31)
+#define GIC_MAP_PIN_MAP_TO_NMI BIT(30)
+#define GIC_MAP_PIN_MAP GENMASK(5, 0)
+
+/* GIC_SH_MAPx_VP - Map shared interrupts to a particular Virtual Processor */
+GIC_ACCESSOR_RW_INTR_REG(32, 0x2000, 0x20, map_vp)
+
+/* GIC_Vx_CTL - VP-level interrupt control */
+GIC_VX_ACCESSOR_RW(32, 0x000, ctl)
+#define GIC_VX_CTL_FDC_ROUTABLE BIT(4)
+#define GIC_VX_CTL_SWINT_ROUTABLE BIT(3)
+#define GIC_VX_CTL_PERFCNT_ROUTABLE BIT(2)
+#define GIC_VX_CTL_TIMER_ROUTABLE BIT(1)
+#define GIC_VX_CTL_EIC BIT(0)
+
+/* GIC_Vx_PEND - Read currently pending local interrupts */
+GIC_VX_ACCESSOR_RO(32, 0x004, pend)
+
+/* GIC_Vx_MASK - Read the current local interrupt mask */
+GIC_VX_ACCESSOR_RO(32, 0x008, mask)
+
+/* GIC_Vx_RMASK - Reset/clear local interrupt mask bits */
+GIC_VX_ACCESSOR_RW(32, 0x00c, rmask)
+
+/* GIC_Vx_SMASK - Set local interrupt mask bits */
+GIC_VX_ACCESSOR_RW(32, 0x010, smask)
+
+/* GIC_Vx_*_MAP - Route local interrupts to the desired pins */
+GIC_VX_ACCESSOR_RW_INTR_REG(32, 0x040, 0x4, map)
+
+/* GIC_Vx_WD_MAP - Route the local watchdog timer interrupt */
+GIC_VX_ACCESSOR_RW(32, 0x040, wd_map)
+
+/* GIC_Vx_COMPARE_MAP - Route the local count/compare interrupt */
+GIC_VX_ACCESSOR_RW(32, 0x044, compare_map)
+
+/* GIC_Vx_TIMER_MAP - Route the local CPU timer (cp0 count/compare) interrupt */
+GIC_VX_ACCESSOR_RW(32, 0x048, timer_map)
+
+/* GIC_Vx_FDC_MAP - Route the local fast debug channel interrupt */
+GIC_VX_ACCESSOR_RW(32, 0x04c, fdc_map)
+
+/* GIC_Vx_PERFCTR_MAP - Route the local performance counter interrupt */
+GIC_VX_ACCESSOR_RW(32, 0x050, perfctr_map)
+
+/* GIC_Vx_SWINT0_MAP - Route the local software interrupt 0 */
+GIC_VX_ACCESSOR_RW(32, 0x054, swint0_map)
+
+/* GIC_Vx_SWINT1_MAP - Route the local software interrupt 1 */
+GIC_VX_ACCESSOR_RW(32, 0x058, swint1_map)
+
+/* GIC_Vx_OTHER - Configure access to other Virtual Processor registers */
+GIC_VX_ACCESSOR_RW(32, 0x080, other)
+#define GIC_VX_OTHER_VPNUM GENMASK(5, 0)
+
+/* GIC_Vx_IDENT - Retrieve the local Virtual Processor's ID */
+GIC_VX_ACCESSOR_RO(32, 0x088, ident)
+#define GIC_VX_IDENT_VPNUM GENMASK(5, 0)
+
+/* GIC_Vx_COMPARE - Value to compare with GIC_SH_COUNTER */
+GIC_VX_ACCESSOR_RW(64, 0x0a0, compare)
+
+/* GIC_Vx_EIC_SHADOW_SET_BASE - Set shadow register set for each interrupt */
+GIC_VX_ACCESSOR_RW_INTR_REG(32, 0x100, 0x4, eic_shadow_set)
+
+/**
+ * enum mips_gic_local_interrupt - GIC local interrupts
+ * @GIC_LOCAL_INT_WD: GIC watchdog timer interrupt
+ * @GIC_LOCAL_INT_COMPARE: GIC count/compare interrupt
+ * @GIC_LOCAL_INT_TIMER: CP0 count/compare interrupt
+ * @GIC_LOCAL_INT_PERFCTR: Performance counter interrupt
+ * @GIC_LOCAL_INT_SWINT0: Software interrupt 0
+ * @GIC_LOCAL_INT_SWINT1: Software interrupt 1
+ * @GIC_LOCAL_INT_FDC: Fast debug channel interrupt
+ * @GIC_NUM_LOCAL_INTRS: The number of local interrupts
+ *
+ * Enumerates interrupts provided by the GIC that are local to a VP.
+ */
+enum mips_gic_local_interrupt {
+ GIC_LOCAL_INT_WD,
+ GIC_LOCAL_INT_COMPARE,
+ GIC_LOCAL_INT_TIMER,
+ GIC_LOCAL_INT_PERFCTR,
+ GIC_LOCAL_INT_SWINT0,
+ GIC_LOCAL_INT_SWINT1,
+ GIC_LOCAL_INT_FDC,
+ GIC_NUM_LOCAL_INTRS
+};
+
+/**
+ * mips_gic_present() - Determine whether a GIC is present
+ *
+ * Determines whether a MIPS Global Interrupt Controller (GIC) is present in
+ * the system that the kernel is running on.
+ *
+ * Return true if a GIC is present, else false.
+ */
+static inline bool mips_gic_present(void)
+{
+ return IS_ENABLED(CONFIG_MIPS_GIC) && mips_gic_base;
+}
+
+/**
+ * gic_get_c0_compare_int() - Return cp0 count/compare interrupt virq
+ *
+ * Determine the virq number to use for the coprocessor 0 count/compare
+ * interrupt, which may be routed via the GIC.
+ *
+ * Returns the virq number or a negative error number.
+ */
+extern int gic_get_c0_compare_int(void);
+
+/**
+ * gic_get_c0_perfcount_int() - Return performance counter interrupt virq
+ *
+ * Determine the virq number to use for CPU performance counter interrupts,
+ * which may be routed via the GIC.
+ *
+ * Returns the virq number or a negative error number.
+ */
+extern int gic_get_c0_perfcount_int(void);
+
+/**
+ * gic_get_c0_fdc_int() - Return fast debug channel interrupt virq
+ *
+ * Determine the virq number to use for fast debug channel (FDC) interrupts,
+ * which may be routed via the GIC.
+ *
+ * Returns the virq number or a negative error number.
+ */
+extern int gic_get_c0_fdc_int(void);
+
+#endif /* __MIPS_ASM_MIPS_CPS_H__ */
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index dbb0eceda2c6..a6810923b3f0 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -48,6 +48,7 @@
#define CP0_ENTRYLO0 $2
#define CP0_ENTRYLO1 $3
#define CP0_CONF $3
+#define CP0_GLOBALNUMBER $3, 1
#define CP0_CONTEXT $4
#define CP0_PAGEMASK $5
#define CP0_SEGCTL0 $5, 2
@@ -148,6 +149,16 @@
#define MIPS_ENTRYLO_RI (_ULCAST_(1) << (BITS_PER_LONG - 1))
/*
+ * MIPSr6+ GlobalNumber register definitions
+ */
+#define MIPS_GLOBALNUMBER_VP_SHF 0
+#define MIPS_GLOBALNUMBER_VP (_ULCAST_(0xff) << MIPS_GLOBALNUMBER_VP_SHF)
+#define MIPS_GLOBALNUMBER_CORE_SHF 8
+#define MIPS_GLOBALNUMBER_CORE (_ULCAST_(0xff) << MIPS_GLOBALNUMBER_CORE_SHF)
+#define MIPS_GLOBALNUMBER_CLUSTER_SHF 16
+#define MIPS_GLOBALNUMBER_CLUSTER (_ULCAST_(0xf) << MIPS_GLOBALNUMBER_CLUSTER_SHF)
+
+/*
* Values for PageMask register
*/
#ifdef CONFIG_CPU_VR41XX
@@ -1366,29 +1377,32 @@ do { \
#define __write_64bit_c0_split(source, sel, val) \
do { \
+ unsigned long long __tmp; \
unsigned long __flags; \
\
local_irq_save(__flags); \
if (sel == 0) \
__asm__ __volatile__( \
".set\tmips64\n\t" \
- "dsll\t%L0, %L0, 32\n\t" \
+ "dsll\t%L0, %L1, 32\n\t" \
"dsrl\t%L0, %L0, 32\n\t" \
- "dsll\t%M0, %M0, 32\n\t" \
+ "dsll\t%M0, %M1, 32\n\t" \
"or\t%L0, %L0, %M0\n\t" \
"dmtc0\t%L0, " #source "\n\t" \
".set\tmips0" \
- : : "r" (val)); \
+ : "=&r,r" (__tmp) \
+ : "r,0" (val)); \
else \
__asm__ __volatile__( \
".set\tmips64\n\t" \
- "dsll\t%L0, %L0, 32\n\t" \
+ "dsll\t%L0, %L1, 32\n\t" \
"dsrl\t%L0, %L0, 32\n\t" \
- "dsll\t%M0, %M0, 32\n\t" \
+ "dsll\t%M0, %M1, 32\n\t" \
"or\t%L0, %L0, %M0\n\t" \
"dmtc0\t%L0, " #source ", " #sel "\n\t" \
".set\tmips0" \
- : : "r" (val)); \
+ : "=&r,r" (__tmp) \
+ : "r,0" (val)); \
local_irq_restore(__flags); \
} while (0)
@@ -1446,6 +1460,8 @@ do { \
#define read_c0_conf() __read_32bit_c0_register($3, 0)
#define write_c0_conf(val) __write_32bit_c0_register($3, 0, val)
+#define read_c0_globalnumber() __read_32bit_c0_register($3, 1)
+
#define read_c0_context() __read_ulong_c0_register($4, 0)
#define write_c0_context(val) __write_ulong_c0_register($4, 0, val)
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h
index e51add184717..06552a965cf4 100644
--- a/arch/mips/include/asm/module.h
+++ b/arch/mips/include/asm/module.h
@@ -114,8 +114,6 @@ search_module_dbetables(unsigned long addr)
#define MODULE_PROC_FAMILY "R5432 "
#elif defined CONFIG_CPU_R5500
#define MODULE_PROC_FAMILY "R5500 "
-#elif defined CONFIG_CPU_R6000
-#define MODULE_PROC_FAMILY "R6000 "
#elif defined CONFIG_CPU_NEVADA
#define MODULE_PROC_FAMILY "NEVADA "
#elif defined CONFIG_CPU_R8000
diff --git a/arch/mips/include/asm/netlogic/common.h b/arch/mips/include/asm/netlogic/common.h
index e0717d10e650..a6e6cbebe046 100644
--- a/arch/mips/include/asm/netlogic/common.h
+++ b/arch/mips/include/asm/netlogic/common.h
@@ -84,7 +84,7 @@ nlm_set_nmi_handler(void *handler)
*/
void nlm_init_boot_cpu(void);
unsigned int nlm_get_cpu_frequency(void);
-extern struct plat_smp_ops nlm_smp_ops;
+extern const struct plat_smp_ops nlm_smp_ops;
extern char nlm_reset_entry[], nlm_reset_entry_end[];
/* SWIOTLB */
diff --git a/arch/mips/include/asm/octeon/cvmx-boot-vector.h b/arch/mips/include/asm/octeon/cvmx-boot-vector.h
new file mode 100644
index 000000000000..8db08241d53c
--- /dev/null
+++ b/arch/mips/include/asm/octeon/cvmx-boot-vector.h
@@ -0,0 +1,53 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003-2017 Cavium, Inc.
+ */
+
+#ifndef __CVMX_BOOT_VECTOR_H__
+#define __CVMX_BOOT_VECTOR_H__
+
+#include <asm/octeon/octeon.h>
+
+/*
+ * The boot vector table is made up of an array of 1024 elements of
+ * struct cvmx_boot_vector_element. There is one entry for each
+ * possible MIPS CPUNum, indexed by the CPUNum.
+ *
+ * Once cvmx_boot_vector_get() returns a non-NULL value (indicating
+ * success), NMI to a core will cause execution to transfer to the
+ * target_ptr location for that core's entry in the vector table.
+ *
+ * The struct cvmx_boot_vector_element fields app0, app1, and app2 can
+ * be used by the application that has set the target_ptr in any
+ * application specific manner, they are not touched by the vectoring
+ * code.
+ *
+ * The boot vector code clobbers the CP0_DESAVE register, and on
+ * OCTEON II and later CPUs also clobbers CP0_KScratch2. All GP
+ * registers are preserved, except on pre-OCTEON II CPUs, where k1 is
+ * clobbered.
+ *
+ */
+
+
+/*
+ * Applications install the boot bus code in cvmx-boot-vector.c, which
+ * uses this magic:
+ */
+#define OCTEON_BOOT_MOVEABLE_MAGIC1 0xdb00110ad358eacdull
+
+struct cvmx_boot_vector_element {
+ /* kseg0 or xkphys address of target code. */
+ uint64_t target_ptr;
+ /* Three application specific arguments. */
+ uint64_t app0;
+ uint64_t app1;
+ uint64_t app2;
+};
+
+struct cvmx_boot_vector_element *cvmx_boot_vector_get(void);
+
+#endif /* __CVMX_BOOT_VECTOR_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-bootmem.h b/arch/mips/include/asm/octeon/cvmx-bootmem.h
index 374562507d0b..72d2e403a6e4 100644
--- a/arch/mips/include/asm/octeon/cvmx-bootmem.h
+++ b/arch/mips/include/asm/octeon/cvmx-bootmem.h
@@ -255,6 +255,34 @@ extern void *cvmx_bootmem_alloc_named_range(uint64_t size, uint64_t min_addr,
uint64_t max_addr, uint64_t align,
char *name);
+/**
+ * Allocate if needed a block of memory from a specific range of the
+ * free list that was passed to the application by the bootloader, and
+ * assign it a name in the global named block table. (part of the
+ * cvmx_bootmem_descriptor_t structure) Named blocks can later be
+ * freed. If the requested name block is already allocated, return
+ * the pointer to block of memory. If request cannot be satisfied
+ * within the address range specified, NULL is returned
+ *
+ * @param size Size in bytes of block to allocate
+ * @param min_addr minimum address of range
+ * @param max_addr maximum address of range
+ * @param align Alignment of memory to be allocated. (must be a power of 2)
+ * @param name name of block - must be less than CVMX_BOOTMEM_NAME_LEN bytes
+ * @param init Initialization function
+ *
+ * The initialization function is optional, if omitted the named block
+ * is initialized to all zeros when it is created, i.e. once.
+ *
+ * @return pointer to block of memory, NULL on error
+ */
+void *cvmx_bootmem_alloc_named_range_once(uint64_t size,
+ uint64_t min_addr,
+ uint64_t max_addr,
+ uint64_t align,
+ char *name,
+ void (*init) (void *));
+
extern int cvmx_bootmem_free_named(char *name);
/**
diff --git a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
index 0dd0e40c96d4..6e61792d9248 100644
--- a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
+++ b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
@@ -128,6 +128,7 @@ static inline uint64_t CVMX_CIU_PP_POKEX(unsigned long offset)
case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
@@ -143,6 +144,10 @@ static inline uint64_t CVMX_CIU_PP_POKEX(unsigned long offset)
return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
return CVMX_ADD_IO_SEG(0x0001070100100200ull) + (offset) * 8;
+ case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+ return CVMX_ADD_IO_SEG(0x0001010000030000ull) + (offset) * 8;
}
return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
}
@@ -180,6 +185,7 @@ static inline uint64_t CVMX_CIU_WDOGX(unsigned long offset)
case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
@@ -195,6 +201,10 @@ static inline uint64_t CVMX_CIU_WDOGX(unsigned long offset)
return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
return CVMX_ADD_IO_SEG(0x0001070100100000ull) + (offset) * 8;
+ case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+ return CVMX_ADD_IO_SEG(0x0001010000020000ull) + (offset) * 8;
}
return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
}
diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h
index e638735cc3ac..205ab2ce10f8 100644
--- a/arch/mips/include/asm/octeon/cvmx.h
+++ b/arch/mips/include/asm/octeon/cvmx.h
@@ -357,6 +357,34 @@ static inline unsigned int cvmx_get_local_core_num(void)
return cvmx_get_core_num() & ((1 << CVMX_NODE_NO_SHIFT) - 1);
}
+#define CVMX_NODE_BITS (2) /* Number of bits to define a node */
+#define CVMX_MAX_NODES (1 << CVMX_NODE_BITS)
+#define CVMX_NODE_IO_SHIFT (36)
+#define CVMX_NODE_MEM_SHIFT (40)
+#define CVMX_NODE_IO_MASK ((uint64_t)CVMX_NODE_MASK << CVMX_NODE_IO_SHIFT)
+
+static inline void cvmx_write_csr_node(uint64_t node, uint64_t csr_addr,
+ uint64_t val)
+{
+ uint64_t composite_csr_addr, node_addr;
+
+ node_addr = (node & CVMX_NODE_MASK) << CVMX_NODE_IO_SHIFT;
+ composite_csr_addr = (csr_addr & ~CVMX_NODE_IO_MASK) | node_addr;
+
+ cvmx_write64_uint64(composite_csr_addr, val);
+ if (((csr_addr >> 40) & 0x7ffff) == (0x118))
+ cvmx_read64_uint64(CVMX_MIO_BOOT_BIST_STAT | node_addr);
+}
+
+static inline uint64_t cvmx_read_csr_node(uint64_t node, uint64_t csr_addr)
+{
+ uint64_t node_addr;
+
+ node_addr = (csr_addr & ~CVMX_NODE_IO_MASK) |
+ (node & CVMX_NODE_MASK) << CVMX_NODE_IO_SHIFT;
+ return cvmx_read_csr(node_addr);
+}
+
/**
* Returns the number of bits set in the provided value.
* Simple wrapper for POP instruction.
diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index 07c0516ef4d5..c99c4b6a79f4 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -362,4 +362,6 @@ extern void octeon_fixup_irqs(void);
extern struct semaphore octeon_bootbus_sem;
+struct irq_domain *octeon_irq_get_block_domain(int node, uint8_t block);
+
#endif /* __ASM_OCTEON_OCTEON_H */
diff --git a/arch/mips/include/asm/smp-ops.h b/arch/mips/include/asm/smp-ops.h
index db7c322f057f..53b2cb8e5966 100644
--- a/arch/mips/include/asm/smp-ops.h
+++ b/arch/mips/include/asm/smp-ops.h
@@ -13,7 +13,7 @@
#include <linux/errno.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#ifdef CONFIG_SMP
@@ -26,7 +26,7 @@ struct plat_smp_ops {
void (*send_ipi_mask)(const struct cpumask *mask, unsigned int action);
void (*init_secondary)(void);
void (*smp_finish)(void);
- void (*boot_secondary)(int cpu, struct task_struct *idle);
+ int (*boot_secondary)(int cpu, struct task_struct *idle);
void (*smp_setup)(void);
void (*prepare_cpus)(unsigned int max_cpus);
#ifdef CONFIG_HOTPLUG_CPU
@@ -35,11 +35,11 @@ struct plat_smp_ops {
#endif
};
-extern void register_smp_ops(struct plat_smp_ops *ops);
+extern void register_smp_ops(const struct plat_smp_ops *ops);
static inline void plat_smp_setup(void)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
mp_ops->smp_setup();
}
@@ -57,7 +57,7 @@ static inline void plat_smp_setup(void)
/* UP, nothing to do ... */
}
-static inline void register_smp_ops(struct plat_smp_ops *ops)
+static inline void register_smp_ops(const struct plat_smp_ops *ops)
{
}
@@ -66,7 +66,7 @@ static inline void register_smp_ops(struct plat_smp_ops *ops)
static inline int register_up_smp_ops(void)
{
#ifdef CONFIG_SMP_UP
- extern struct plat_smp_ops up_smp_ops;
+ extern const struct plat_smp_ops up_smp_ops;
register_smp_ops(&up_smp_ops);
@@ -79,7 +79,7 @@ static inline int register_up_smp_ops(void)
static inline int register_cmp_smp_ops(void)
{
#ifdef CONFIG_MIPS_CMP
- extern struct plat_smp_ops cmp_smp_ops;
+ extern const struct plat_smp_ops cmp_smp_ops;
if (!mips_cm_present())
return -ENODEV;
@@ -95,7 +95,7 @@ static inline int register_cmp_smp_ops(void)
static inline int register_vsmp_smp_ops(void)
{
#ifdef CONFIG_MIPS_MT_SMP
- extern struct plat_smp_ops vsmp_smp_ops;
+ extern const struct plat_smp_ops vsmp_smp_ops;
register_smp_ops(&vsmp_smp_ops);
diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h
index bab3d41e5987..9e494f8d9c03 100644
--- a/arch/mips/include/asm/smp.h
+++ b/arch/mips/include/asm/smp.h
@@ -58,7 +58,7 @@ extern void calculate_cpu_foreign_map(void);
*/
static inline void smp_send_reschedule(int cpu)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
mp_ops->send_ipi_single(cpu, SMP_RESCHEDULE_YOURSELF);
}
@@ -66,14 +66,14 @@ static inline void smp_send_reschedule(int cpu)
#ifdef CONFIG_HOTPLUG_CPU
static inline int __cpu_disable(void)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
return mp_ops->cpu_disable();
}
static inline void __cpu_die(unsigned int cpu)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
mp_ops->cpu_die(cpu);
}
@@ -97,14 +97,14 @@ int mips_smp_ipi_free(const struct cpumask *mask);
static inline void arch_send_call_function_single_ipi(int cpu)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
mp_ops->send_ipi_mask(cpumask_of(cpu), SMP_CALL_FUNCTION);
}
static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask)
{
- extern struct plat_smp_ops *mp_ops; /* private */
+ extern const struct plat_smp_ops *mp_ops; /* private */
mp_ops->send_ipi_mask(mask, SMP_CALL_FUNCTION);
}
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h
index eaa5a4d7d5e5..5d3563c55e0c 100644
--- a/arch/mips/include/asm/stackframe.h
+++ b/arch/mips/include/asm/stackframe.h
@@ -19,20 +19,43 @@
#include <asm/asm-offsets.h>
#include <asm/thread_info.h>
+/* Make the addition of cfi info a little easier. */
+ .macro cfi_rel_offset reg offset=0 docfi=0
+ .if \docfi
+ .cfi_rel_offset \reg, \offset
+ .endif
+ .endm
+
+ .macro cfi_st reg offset=0 docfi=0
+ LONG_S \reg, \offset(sp)
+ cfi_rel_offset \reg, \offset, \docfi
+ .endm
+
+ .macro cfi_restore reg offset=0 docfi=0
+ .if \docfi
+ .cfi_restore \reg
+ .endif
+ .endm
+
+ .macro cfi_ld reg offset=0 docfi=0
+ LONG_L \reg, \offset(sp)
+ cfi_restore \reg \offset \docfi
+ .endm
+
#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
#define STATMASK 0x3f
#else
#define STATMASK 0x1f
#endif
- .macro SAVE_AT
+ .macro SAVE_AT docfi=0
.set push
.set noat
- LONG_S $1, PT_R1(sp)
+ cfi_st $1, PT_R1, \docfi
.set pop
.endm
- .macro SAVE_TEMP
+ .macro SAVE_TEMP docfi=0
#ifdef CONFIG_CPU_HAS_SMARTMIPS
mflhxu v1
LONG_S v1, PT_LO(sp)
@@ -44,20 +67,20 @@
mfhi v1
#endif
#ifdef CONFIG_32BIT
- LONG_S $8, PT_R8(sp)
- LONG_S $9, PT_R9(sp)
+ cfi_st $8, PT_R8, \docfi
+ cfi_st $9, PT_R9, \docfi
#endif
- LONG_S $10, PT_R10(sp)
- LONG_S $11, PT_R11(sp)
- LONG_S $12, PT_R12(sp)
+ cfi_st $10, PT_R10, \docfi
+ cfi_st $11, PT_R11, \docfi
+ cfi_st $12, PT_R12, \docfi
#if !defined(CONFIG_CPU_HAS_SMARTMIPS) && !defined(CONFIG_CPU_MIPSR6)
LONG_S v1, PT_HI(sp)
mflo v1
#endif
- LONG_S $13, PT_R13(sp)
- LONG_S $14, PT_R14(sp)
- LONG_S $15, PT_R15(sp)
- LONG_S $24, PT_R24(sp)
+ cfi_st $13, PT_R13, \docfi
+ cfi_st $14, PT_R14, \docfi
+ cfi_st $15, PT_R15, \docfi
+ cfi_st $24, PT_R24, \docfi
#if !defined(CONFIG_CPU_HAS_SMARTMIPS) && !defined(CONFIG_CPU_MIPSR6)
LONG_S v1, PT_LO(sp)
#endif
@@ -71,20 +94,28 @@
#endif
.endm
- .macro SAVE_STATIC
- LONG_S $16, PT_R16(sp)
- LONG_S $17, PT_R17(sp)
- LONG_S $18, PT_R18(sp)
- LONG_S $19, PT_R19(sp)
- LONG_S $20, PT_R20(sp)
- LONG_S $21, PT_R21(sp)
- LONG_S $22, PT_R22(sp)
- LONG_S $23, PT_R23(sp)
- LONG_S $30, PT_R30(sp)
+ .macro SAVE_STATIC docfi=0
+ cfi_st $16, PT_R16, \docfi
+ cfi_st $17, PT_R17, \docfi
+ cfi_st $18, PT_R18, \docfi
+ cfi_st $19, PT_R19, \docfi
+ cfi_st $20, PT_R20, \docfi
+ cfi_st $21, PT_R21, \docfi
+ cfi_st $22, PT_R22, \docfi
+ cfi_st $23, PT_R23, \docfi
+ cfi_st $30, PT_R30, \docfi
.endm
+/*
+ * get_saved_sp returns the SP for the current CPU by looking in the
+ * kernelsp array for it. If tosp is set, it stores the current sp in
+ * k0 and loads the new value in sp. If not, it clobbers k0 and
+ * stores the new value in k1, leaving sp unaffected.
+ */
#ifdef CONFIG_SMP
- .macro get_saved_sp /* SMP variation */
+
+ /* SMP variation */
+ .macro get_saved_sp docfi=0 tosp=0
ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG
#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32)
lui k1, %hi(kernelsp)
@@ -97,7 +128,15 @@
#endif
LONG_SRL k0, SMP_CPUID_PTRSHIFT
LONG_ADDU k1, k0
+ .if \tosp
+ move k0, sp
+ .if \docfi
+ .cfi_register sp, k0
+ .endif
+ LONG_L sp, %lo(kernelsp)(k1)
+ .else
LONG_L k1, %lo(kernelsp)(k1)
+ .endif
.endm
.macro set_saved_sp stackp temp temp2
@@ -106,7 +145,8 @@
LONG_S \stackp, kernelsp(\temp)
.endm
#else /* !CONFIG_SMP */
- .macro get_saved_sp /* Uniprocessor variation */
+ /* Uniprocessor variation */
+ .macro get_saved_sp docfi=0 tosp=0
#ifdef CONFIG_CPU_JUMP_WORKAROUNDS
/*
* Clear BTB (branch target buffer), forbid RAS (return address
@@ -135,7 +175,15 @@
daddiu k1, %hi(kernelsp)
dsll k1, k1, 16
#endif
+ .if \tosp
+ move k0, sp
+ .if \docfi
+ .cfi_register sp, k0
+ .endif
+ LONG_L sp, %lo(kernelsp)(k1)
+ .else
LONG_L k1, %lo(kernelsp)(k1)
+ .endif
.endm
.macro set_saved_sp stackp temp temp2
@@ -143,7 +191,7 @@
.endm
#endif
- .macro SAVE_SOME
+ .macro SAVE_SOME docfi=0
.set push
.set noat
.set reorder
@@ -151,7 +199,6 @@
sll k0, 3 /* extract cu0 bit */
.set noreorder
bltz k0, 8f
- move k1, sp
#ifdef CONFIG_EVA
/*
* Flush interAptiv's Return Prediction Stack (RPS) by writing
@@ -178,20 +225,26 @@
MTC0 k0, CP0_ENTRYHI
#endif
.set reorder
+ move k0, sp
+ .if \docfi
+ .cfi_register sp, k0
+ .endif
/* Called from user mode, new stack. */
- get_saved_sp
-#ifndef CONFIG_CPU_DADDI_WORKAROUNDS
-8: move k0, sp
- PTR_SUBU sp, k1, PT_SIZE
-#else
- .set at=k0
-8: PTR_SUBU k1, PT_SIZE
+ get_saved_sp docfi=\docfi tosp=1
+8:
+#ifdef CONFIG_CPU_DADDI_WORKAROUNDS
+ .set at=k1
+#endif
+ PTR_SUBU sp, PT_SIZE
+#ifdef CONFIG_CPU_DADDI_WORKAROUNDS
.set noat
- move k0, sp
- move sp, k1
#endif
- LONG_S k0, PT_R29(sp)
- LONG_S $3, PT_R3(sp)
+ .if \docfi
+ .cfi_def_cfa sp,0
+ .endif
+ cfi_st k0, PT_R29, \docfi
+ cfi_rel_offset sp, PT_R29, \docfi
+ cfi_st v1, PT_R3, \docfi
/*
* You might think that you don't need to save $0,
* but the FPU emulator and gdb remote debug stub
@@ -199,23 +252,26 @@
*/
LONG_S $0, PT_R0(sp)
mfc0 v1, CP0_STATUS
- LONG_S $2, PT_R2(sp)
+ cfi_st v0, PT_R2, \docfi
LONG_S v1, PT_STATUS(sp)
- LONG_S $4, PT_R4(sp)
+ cfi_st $4, PT_R4, \docfi
mfc0 v1, CP0_CAUSE
- LONG_S $5, PT_R5(sp)
+ cfi_st $5, PT_R5, \docfi
LONG_S v1, PT_CAUSE(sp)
- LONG_S $6, PT_R6(sp)
- MFC0 v1, CP0_EPC
- LONG_S $7, PT_R7(sp)
+ cfi_st $6, PT_R6, \docfi
+ cfi_st ra, PT_R31, \docfi
+ MFC0 ra, CP0_EPC
+ cfi_st $7, PT_R7, \docfi
#ifdef CONFIG_64BIT
- LONG_S $8, PT_R8(sp)
- LONG_S $9, PT_R9(sp)
+ cfi_st $8, PT_R8, \docfi
+ cfi_st $9, PT_R9, \docfi
#endif
- LONG_S v1, PT_EPC(sp)
- LONG_S $25, PT_R25(sp)
- LONG_S $28, PT_R28(sp)
- LONG_S $31, PT_R31(sp)
+ LONG_S ra, PT_EPC(sp)
+ .if \docfi
+ .cfi_rel_offset ra, PT_EPC
+ .endif
+ cfi_st $25, PT_R25, \docfi
+ cfi_st $28, PT_R28, \docfi
/* Set thread_info if we're coming from user mode */
mfc0 k0, CP0_STATUS
@@ -232,21 +288,21 @@
.set pop
.endm
- .macro SAVE_ALL
- SAVE_SOME
- SAVE_AT
- SAVE_TEMP
- SAVE_STATIC
+ .macro SAVE_ALL docfi=0
+ SAVE_SOME \docfi
+ SAVE_AT \docfi
+ SAVE_TEMP \docfi
+ SAVE_STATIC \docfi
.endm
- .macro RESTORE_AT
+ .macro RESTORE_AT docfi=0
.set push
.set noat
- LONG_L $1, PT_R1(sp)
+ cfi_ld $1, PT_R1, \docfi
.set pop
.endm
- .macro RESTORE_TEMP
+ .macro RESTORE_TEMP docfi=0
#ifdef CONFIG_CPU_CAVIUM_OCTEON
/* Restore the Octeon multiplier state */
jal octeon_mult_restore
@@ -265,33 +321,37 @@
mthi $24
#endif
#ifdef CONFIG_32BIT
- LONG_L $8, PT_R8(sp)
- LONG_L $9, PT_R9(sp)
+ cfi_ld $8, PT_R8, \docfi
+ cfi_ld $9, PT_R9, \docfi
#endif
- LONG_L $10, PT_R10(sp)
- LONG_L $11, PT_R11(sp)
- LONG_L $12, PT_R12(sp)
- LONG_L $13, PT_R13(sp)
- LONG_L $14, PT_R14(sp)
- LONG_L $15, PT_R15(sp)
- LONG_L $24, PT_R24(sp)
+ cfi_ld $10, PT_R10, \docfi
+ cfi_ld $11, PT_R11, \docfi
+ cfi_ld $12, PT_R12, \docfi
+ cfi_ld $13, PT_R13, \docfi
+ cfi_ld $14, PT_R14, \docfi
+ cfi_ld $15, PT_R15, \docfi
+ cfi_ld $24, PT_R24, \docfi
.endm
- .macro RESTORE_STATIC
- LONG_L $16, PT_R16(sp)
- LONG_L $17, PT_R17(sp)
- LONG_L $18, PT_R18(sp)
- LONG_L $19, PT_R19(sp)
- LONG_L $20, PT_R20(sp)
- LONG_L $21, PT_R21(sp)
- LONG_L $22, PT_R22(sp)
- LONG_L $23, PT_R23(sp)
- LONG_L $30, PT_R30(sp)
+ .macro RESTORE_STATIC docfi=0
+ cfi_ld $16, PT_R16, \docfi
+ cfi_ld $17, PT_R17, \docfi
+ cfi_ld $18, PT_R18, \docfi
+ cfi_ld $19, PT_R19, \docfi
+ cfi_ld $20, PT_R20, \docfi
+ cfi_ld $21, PT_R21, \docfi
+ cfi_ld $22, PT_R22, \docfi
+ cfi_ld $23, PT_R23, \docfi
+ cfi_ld $30, PT_R30, \docfi
+ .endm
+
+ .macro RESTORE_SP docfi=0
+ cfi_ld sp, PT_R29, \docfi
.endm
#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
- .macro RESTORE_SOME
+ .macro RESTORE_SOME docfi=0
.set push
.set reorder
.set noat
@@ -306,30 +366,30 @@
and v0, v1
or v0, a0
mtc0 v0, CP0_STATUS
- LONG_L $31, PT_R31(sp)
- LONG_L $28, PT_R28(sp)
- LONG_L $25, PT_R25(sp)
- LONG_L $7, PT_R7(sp)
- LONG_L $6, PT_R6(sp)
- LONG_L $5, PT_R5(sp)
- LONG_L $4, PT_R4(sp)
- LONG_L $3, PT_R3(sp)
- LONG_L $2, PT_R2(sp)
+ cfi_ld $31, PT_R31, \docfi
+ cfi_ld $28, PT_R28, \docfi
+ cfi_ld $25, PT_R25, \docfi
+ cfi_ld $7, PT_R7, \docfi
+ cfi_ld $6, PT_R6, \docfi
+ cfi_ld $5, PT_R5, \docfi
+ cfi_ld $4, PT_R4, \docfi
+ cfi_ld $3, PT_R3, \docfi
+ cfi_ld $2, PT_R2, \docfi
.set pop
.endm
- .macro RESTORE_SP_AND_RET
+ .macro RESTORE_SP_AND_RET docfi=0
.set push
.set noreorder
LONG_L k0, PT_EPC(sp)
- LONG_L sp, PT_R29(sp)
+ RESTORE_SP \docfi
jr k0
rfe
.set pop
.endm
#else
- .macro RESTORE_SOME
+ .macro RESTORE_SOME docfi=0
.set push
.set reorder
.set noat
@@ -346,24 +406,24 @@
mtc0 v0, CP0_STATUS
LONG_L v1, PT_EPC(sp)
MTC0 v1, CP0_EPC
- LONG_L $31, PT_R31(sp)
- LONG_L $28, PT_R28(sp)
- LONG_L $25, PT_R25(sp)
+ cfi_ld $31, PT_R31, \docfi
+ cfi_ld $28, PT_R28, \docfi
+ cfi_ld $25, PT_R25, \docfi
#ifdef CONFIG_64BIT
- LONG_L $8, PT_R8(sp)
- LONG_L $9, PT_R9(sp)
+ cfi_ld $8, PT_R8, \docfi
+ cfi_ld $9, PT_R9, \docfi
#endif
- LONG_L $7, PT_R7(sp)
- LONG_L $6, PT_R6(sp)
- LONG_L $5, PT_R5(sp)
- LONG_L $4, PT_R4(sp)
- LONG_L $3, PT_R3(sp)
- LONG_L $2, PT_R2(sp)
+ cfi_ld $7, PT_R7, \docfi
+ cfi_ld $6, PT_R6, \docfi
+ cfi_ld $5, PT_R5, \docfi
+ cfi_ld $4, PT_R4, \docfi
+ cfi_ld $3, PT_R3, \docfi
+ cfi_ld $2, PT_R2, \docfi
.set pop
.endm
- .macro RESTORE_SP_AND_RET
- LONG_L sp, PT_R29(sp)
+ .macro RESTORE_SP_AND_RET docfi=0
+ RESTORE_SP \docfi
#ifdef CONFIG_CPU_MIPSR6
eretnc
#else
@@ -375,16 +435,12 @@
#endif
- .macro RESTORE_SP
- LONG_L sp, PT_R29(sp)
- .endm
-
- .macro RESTORE_ALL
- RESTORE_TEMP
- RESTORE_STATIC
- RESTORE_AT
- RESTORE_SOME
- RESTORE_SP
+ .macro RESTORE_ALL docfi=0
+ RESTORE_TEMP \docfi
+ RESTORE_STATIC \docfi
+ RESTORE_AT \docfi
+ RESTORE_SOME \docfi
+ RESTORE_SP \docfi
.endm
/*
diff --git a/arch/mips/include/asm/stacktrace.h b/arch/mips/include/asm/stacktrace.h
index 780ee2c2a2ac..10c4e9c84448 100644
--- a/arch/mips/include/asm/stacktrace.h
+++ b/arch/mips/include/asm/stacktrace.h
@@ -2,6 +2,8 @@
#define _ASM_STACKTRACE_H
#include <asm/ptrace.h>
+#include <asm/asm.h>
+#include <linux/stringify.h>
#ifdef CONFIG_KALLSYMS
extern int raw_show_trace;
@@ -20,6 +22,14 @@ static inline unsigned long unwind_stack(struct task_struct *task,
}
#endif
+#define STR_PTR_LA __stringify(PTR_LA)
+#define STR_LONG_S __stringify(LONG_S)
+#define STR_LONG_L __stringify(LONG_L)
+#define STR_LONGSIZE __stringify(LONGSIZE)
+
+#define STORE_ONE_REG(r) \
+ STR_LONG_S " $" __stringify(r)",("STR_LONGSIZE"*"__stringify(r)")(%1)\n\t"
+
static __always_inline void prepare_frametrace(struct pt_regs *regs)
{
#ifndef CONFIG_KALLSYMS
@@ -32,21 +42,47 @@ static __always_inline void prepare_frametrace(struct pt_regs *regs)
__asm__ __volatile__(
".set push\n\t"
".set noat\n\t"
-#ifdef CONFIG_64BIT
- "1: dla $1, 1b\n\t"
- "sd $1, %0\n\t"
- "sd $29, %1\n\t"
- "sd $31, %2\n\t"
-#else
- "1: la $1, 1b\n\t"
- "sw $1, %0\n\t"
- "sw $29, %1\n\t"
- "sw $31, %2\n\t"
-#endif
+ /* Store $1 so we can use it */
+ STR_LONG_S " $1,"STR_LONGSIZE"(%1)\n\t"
+ /* Store the PC */
+ "1: " STR_PTR_LA " $1, 1b\n\t"
+ STR_LONG_S " $1,%0\n\t"
+ STORE_ONE_REG(2)
+ STORE_ONE_REG(3)
+ STORE_ONE_REG(4)
+ STORE_ONE_REG(5)
+ STORE_ONE_REG(6)
+ STORE_ONE_REG(7)
+ STORE_ONE_REG(8)
+ STORE_ONE_REG(9)
+ STORE_ONE_REG(10)
+ STORE_ONE_REG(11)
+ STORE_ONE_REG(12)
+ STORE_ONE_REG(13)
+ STORE_ONE_REG(14)
+ STORE_ONE_REG(15)
+ STORE_ONE_REG(16)
+ STORE_ONE_REG(17)
+ STORE_ONE_REG(18)
+ STORE_ONE_REG(19)
+ STORE_ONE_REG(20)
+ STORE_ONE_REG(21)
+ STORE_ONE_REG(22)
+ STORE_ONE_REG(23)
+ STORE_ONE_REG(24)
+ STORE_ONE_REG(25)
+ STORE_ONE_REG(26)
+ STORE_ONE_REG(27)
+ STORE_ONE_REG(28)
+ STORE_ONE_REG(29)
+ STORE_ONE_REG(30)
+ STORE_ONE_REG(31)
+ /* Restore $1 */
+ STR_LONG_L " $1,"STR_LONGSIZE"(%1)\n\t"
".set pop\n\t"
- : "=m" (regs->cp0_epc),
- "=m" (regs->regs[29]), "=m" (regs->regs[31])
- : : "memory");
+ : "=m" (regs->cp0_epc)
+ : "r" (regs->regs)
+ : "memory");
}
#endif /* _ASM_STACKTRACE_H */
diff --git a/arch/mips/include/asm/topology.h b/arch/mips/include/asm/topology.h
index 7afda4150a59..0673d2d0f2e6 100644
--- a/arch/mips/include/asm/topology.h
+++ b/arch/mips/include/asm/topology.h
@@ -13,7 +13,7 @@
#ifdef CONFIG_SMP
#define topology_physical_package_id(cpu) (cpu_data[cpu].package)
-#define topology_core_id(cpu) (cpu_data[cpu].core)
+#define topology_core_id(cpu) (cpu_core(&cpu_data[cpu]))
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
#define topology_sibling_cpumask(cpu) (&cpu_sibling_map[cpu])
#endif
diff --git a/arch/mips/include/uapi/asm/inst.h b/arch/mips/include/uapi/asm/inst.h
index d61897535926..6abea5183d7c 100644
--- a/arch/mips/include/uapi/asm/inst.h
+++ b/arch/mips/include/uapi/asm/inst.h
@@ -981,7 +981,7 @@ struct mm16_r3_format { /* Load from global pointer format */
struct mm16_r5_format { /* Load/store from stack pointer format */
__BITFIELD_FIELD(unsigned int opcode : 6,
__BITFIELD_FIELD(unsigned int rt : 5,
- __BITFIELD_FIELD(signed int simmediate : 5,
+ __BITFIELD_FIELD(unsigned int imm : 5,
__BITFIELD_FIELD(unsigned int : 16, /* Ignored */
;))))
};
diff --git a/arch/mips/include/uapi/asm/siginfo.h b/arch/mips/include/uapi/asm/siginfo.h
index 8069cf766603..cf6113bbcb98 100644
--- a/arch/mips/include/uapi/asm/siginfo.h
+++ b/arch/mips/include/uapi/asm/siginfo.h
@@ -120,7 +120,7 @@ typedef struct siginfo {
#undef SI_TIMER
#undef SI_MESGQ
#define SI_ASYNCIO -2 /* sent by AIO completion */
-#define SI_TIMER __SI_CODE(__SI_TIMER, -3) /* sent by timer expiration */
-#define SI_MESGQ __SI_CODE(__SI_MESGQ, -4) /* sent by real time mesq state change */
+#define SI_TIMER -3 /* sent by timer expiration */
+#define SI_MESGQ -4 /* sent by real time mesq state change */
#endif /* _UAPI_ASM_SIGINFO_H */
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
index 46c0581256f1..07f0f4a4b562 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -35,11 +35,15 @@ obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
-obj-$(CONFIG_CPU_R4K_FPU) += r4k_fpu.o r4k_switch.o
-obj-$(CONFIG_CPU_R3000) += r2300_fpu.o r2300_switch.o
-obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
-obj-$(CONFIG_CPU_TX39XX) += r2300_fpu.o r2300_switch.o
-obj-$(CONFIG_CPU_CAVIUM_OCTEON) += r4k_fpu.o octeon_switch.o
+sw-y := r4k_switch.o
+sw-$(CONFIG_CPU_R3000) := r2300_switch.o
+sw-$(CONFIG_CPU_TX39XX) := r2300_switch.o
+sw-$(CONFIG_CPU_CAVIUM_OCTEON) := octeon_switch.o
+obj-y += $(sw-y)
+
+obj-$(CONFIG_CPU_R4K_FPU) += r4k_fpu.o
+obj-$(CONFIG_CPU_R3000) += r2300_fpu.o
+obj-$(CONFIG_CPU_TX39XX) += r2300_fpu.o
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_SMP_UP) += smp-up.o
diff --git a/arch/mips/kernel/cps-vec.S b/arch/mips/kernel/cps-vec.S
index b849fe6aad94..d173b49f212d 100644
--- a/arch/mips/kernel/cps-vec.S
+++ b/arch/mips/kernel/cps-vec.S
@@ -327,8 +327,8 @@ LEAF(mips_cps_get_bootcfg)
* to handle contiguous VP numbering, but no such systems yet
* exist.
*/
- mfc0 t9, $3, 1
- andi t9, t9, 0xff
+ mfc0 t9, CP0_GLOBALNUMBER
+ andi t9, t9, MIPS_GLOBALNUMBER_VP
#elif defined(CONFIG_MIPS_MT_SMP)
has_mt ta2, 1f
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index d08afc7dc507..cf3fd549e16d 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -326,7 +326,7 @@ static int __init fpu_disable(char *s)
__setup("nofpu", fpu_disable);
-int mips_dsp_disabled;
+static int mips_dsp_disabled;
static int __init dsp_disable(char *s)
{
@@ -919,9 +919,12 @@ static void decode_configs(struct cpuinfo_mips *c)
#ifndef CONFIG_MIPS_CPS
if (cpu_has_mips_r2_r6) {
- c->core = get_ebase_cpunum();
+ unsigned int core;
+
+ core = get_ebase_cpunum();
if (cpu_has_mipsmt)
- c->core >>= fls(core_nvpes()) - 1;
+ core >>= fls(core_nvpes()) - 1;
+ cpu_set_core(c, core);
}
#endif
}
@@ -1394,24 +1397,6 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
MIPS_CPU_DIVEC | MIPS_CPU_LLSC;
c->tlbsize = 48;
break;
- case PRID_IMP_R6000:
- c->cputype = CPU_R6000;
- __cpu_name[cpu] = "R6000";
- set_isa(c, MIPS_CPU_ISA_II);
- c->fpu_msk31 |= FPU_CSR_CONDX | FPU_CSR_FS;
- c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |
- MIPS_CPU_LLSC;
- c->tlbsize = 32;
- break;
- case PRID_IMP_R6000A:
- c->cputype = CPU_R6000A;
- __cpu_name[cpu] = "R6000A";
- set_isa(c, MIPS_CPU_ISA_II);
- c->fpu_msk31 |= FPU_CSR_CONDX | FPU_CSR_FS;
- c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |
- MIPS_CPU_LLSC;
- c->tlbsize = 32;
- break;
case PRID_IMP_RM7000:
c->cputype = CPU_RM7000;
__cpu_name[cpu] = "RM7000";
@@ -2113,3 +2098,35 @@ void cpu_report(void)
if (cpu_has_msa)
pr_info("MSA revision is: %08x\n", c->msa_id);
}
+
+void cpu_set_cluster(struct cpuinfo_mips *cpuinfo, unsigned int cluster)
+{
+ /* Ensure the core number fits in the field */
+ WARN_ON(cluster > (MIPS_GLOBALNUMBER_CLUSTER >>
+ MIPS_GLOBALNUMBER_CLUSTER_SHF));
+
+ cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_CLUSTER;
+ cpuinfo->globalnumber |= cluster << MIPS_GLOBALNUMBER_CLUSTER_SHF;
+}
+
+void cpu_set_core(struct cpuinfo_mips *cpuinfo, unsigned int core)
+{
+ /* Ensure the core number fits in the field */
+ WARN_ON(core > (MIPS_GLOBALNUMBER_CORE >> MIPS_GLOBALNUMBER_CORE_SHF));
+
+ cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_CORE;
+ cpuinfo->globalnumber |= core << MIPS_GLOBALNUMBER_CORE_SHF;
+}
+
+void cpu_set_vpe_id(struct cpuinfo_mips *cpuinfo, unsigned int vpe)
+{
+ /* Ensure the VP(E) ID fits in the field */
+ WARN_ON(vpe > (MIPS_GLOBALNUMBER_VP >> MIPS_GLOBALNUMBER_VP_SHF));
+
+ /* Ensure we're not using VP(E)s without support */
+ WARN_ON(vpe && !IS_ENABLED(CONFIG_MIPS_MT_SMP) &&
+ !IS_ENABLED(CONFIG_CPU_MIPSR6));
+
+ cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_VP;
+ cpuinfo->globalnumber |= vpe << MIPS_GLOBALNUMBER_VP_SHF;
+}
diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c
index 5c429d70e17f..0828d6d963b7 100644
--- a/arch/mips/kernel/elf.c
+++ b/arch/mips/kernel/elf.c
@@ -87,6 +87,7 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf,
bool elf32;
u32 flags;
int ret;
+ loff_t pos;
elf32 = ehdr->e32.e_ident[EI_CLASS] == ELFCLASS32;
flags = elf32 ? ehdr->e32.e_flags : ehdr->e64.e_flags;
@@ -108,21 +109,16 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf,
if (phdr32->p_filesz < sizeof(abiflags))
return -EINVAL;
-
- ret = kernel_read(elf, phdr32->p_offset,
- (char *)&abiflags,
- sizeof(abiflags));
+ pos = phdr32->p_offset;
} else {
if (phdr64->p_type != PT_MIPS_ABIFLAGS)
return 0;
if (phdr64->p_filesz < sizeof(abiflags))
return -EINVAL;
-
- ret = kernel_read(elf, phdr64->p_offset,
- (char *)&abiflags,
- sizeof(abiflags));
+ pos = phdr64->p_offset;
}
+ ret = kernel_read(elf, &abiflags, sizeof(abiflags), &pos);
if (ret < 0)
return ret;
if (ret != sizeof(abiflags))
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
index ae810da4d499..37b9383eacd3 100644
--- a/arch/mips/kernel/genex.S
+++ b/arch/mips/kernel/genex.S
@@ -150,6 +150,7 @@ LEAF(__r4k_wait)
.align 5
BUILD_ROLLBACK_PROLOGUE handle_int
NESTED(handle_int, PT_SIZE, sp)
+ .cfi_signal_frame
#ifdef CONFIG_TRACE_IRQFLAGS
/*
* Check to see if the interrupted code has just disabled
@@ -181,7 +182,7 @@ NESTED(handle_int, PT_SIZE, sp)
1:
.set pop
#endif
- SAVE_ALL
+ SAVE_ALL docfi=1
CLI
TRACE_IRQS_OFF
@@ -269,8 +270,8 @@ NESTED(except_vec_ejtag_debug, 0, sp)
*/
BUILD_ROLLBACK_PROLOGUE except_vec_vi
NESTED(except_vec_vi, 0, sp)
- SAVE_SOME
- SAVE_AT
+ SAVE_SOME docfi=1
+ SAVE_AT docfi=1
.set push
.set noreorder
PTR_LA v1, except_vec_vi_handler
@@ -396,6 +397,7 @@ NESTED(except_vec_nmi, 0, sp)
__FINIT
NESTED(nmi_handler, PT_SIZE, sp)
+ .cfi_signal_frame
.set push
.set noat
/*
@@ -478,6 +480,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
.macro __BUILD_HANDLER exception handler clear verbose ext
.align 5
NESTED(handle_\exception, PT_SIZE, sp)
+ .cfi_signal_frame
.set noat
SAVE_ALL
FEXPORT(handle_\exception\ext)
@@ -485,8 +488,8 @@ NESTED(nmi_handler, PT_SIZE, sp)
.set at
__BUILD_\verbose \exception
move a0, sp
- PTR_LA ra, ret_from_exception
- j do_\handler
+ jal do_\handler
+ j ret_from_exception
END(handle_\exception)
.endm
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c
index 60ab4c44d305..7c246b69c545 100644
--- a/arch/mips/kernel/idle.c
+++ b/arch/mips/kernel/idle.c
@@ -11,6 +11,7 @@
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
+#include <linux/cpu.h>
#include <linux/export.h>
#include <linux/init.h>
#include <linux/irqflags.h>
diff --git a/arch/mips/kernel/mips-cm.c b/arch/mips/kernel/mips-cm.c
index cb0c57f860d4..e91c8c4e2eb5 100644
--- a/arch/mips/kernel/mips-cm.c
+++ b/arch/mips/kernel/mips-cm.c
@@ -12,10 +12,10 @@
#include <linux/percpu.h>
#include <linux/spinlock.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/mipsregs.h>
-void __iomem *mips_cm_base;
+void __iomem *mips_gcr_base;
void __iomem *mips_cm_l2sync_base;
int mips_cm_is64;
@@ -167,8 +167,8 @@ phys_addr_t __mips_cm_l2sync_phys_base(void)
* current location.
*/
base_reg = read_gcr_l2_only_sync_base();
- if (base_reg & CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_MSK)
- return base_reg & CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_MSK;
+ if (base_reg & CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN)
+ return base_reg & CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE;
/* Default to following the CM */
return mips_cm_phys_base() + MIPS_CM_GCR_SIZE;
@@ -183,19 +183,19 @@ static void mips_cm_probe_l2sync(void)
phys_addr_t addr;
/* L2-only sync was introduced with CM major revision 6 */
- major_rev = (read_gcr_rev() & CM_GCR_REV_MAJOR_MSK) >>
- CM_GCR_REV_MAJOR_SHF;
+ major_rev = (read_gcr_rev() & CM_GCR_REV_MAJOR) >>
+ __ffs(CM_GCR_REV_MAJOR);
if (major_rev < 6)
return;
/* Find a location for the L2 sync region */
addr = mips_cm_l2sync_phys_base();
- BUG_ON((addr & CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE_MSK) != addr);
+ BUG_ON((addr & CM_GCR_L2_ONLY_SYNC_BASE_SYNCBASE) != addr);
if (!addr)
return;
/* Set the region base address & enable it */
- write_gcr_l2_only_sync_base(addr | CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN_MSK);
+ write_gcr_l2_only_sync_base(addr | CM_GCR_L2_ONLY_SYNC_BASE_SYNCEN);
/* Map the region */
mips_cm_l2sync_base = ioremap_nocache(addr, MIPS_CM_L2SYNC_SIZE);
@@ -211,41 +211,39 @@ int mips_cm_probe(void)
* No need to probe again if we have already been
* here before.
*/
- if (mips_cm_base)
+ if (mips_gcr_base)
return 0;
addr = mips_cm_phys_base();
- BUG_ON((addr & CM_GCR_BASE_GCRBASE_MSK) != addr);
+ BUG_ON((addr & CM_GCR_BASE_GCRBASE) != addr);
if (!addr)
return -ENODEV;
- mips_cm_base = ioremap_nocache(addr, MIPS_CM_GCR_SIZE);
- if (!mips_cm_base)
+ mips_gcr_base = ioremap_nocache(addr, MIPS_CM_GCR_SIZE);
+ if (!mips_gcr_base)
return -ENXIO;
/* sanity check that we're looking at a CM */
base_reg = read_gcr_base();
- if ((base_reg & CM_GCR_BASE_GCRBASE_MSK) != addr) {
+ if ((base_reg & CM_GCR_BASE_GCRBASE) != addr) {
pr_err("GCRs appear to have been moved (expected them at 0x%08lx)!\n",
(unsigned long)addr);
- mips_cm_base = NULL;
+ mips_gcr_base = NULL;
return -ENODEV;
}
/* set default target to memory */
- base_reg &= ~CM_GCR_BASE_CMDEFTGT_MSK;
- base_reg |= CM_GCR_BASE_CMDEFTGT_MEM;
- write_gcr_base(base_reg);
+ change_gcr_base(CM_GCR_BASE_CMDEFTGT, CM_GCR_BASE_CMDEFTGT_MEM);
/* disable CM regions */
- write_gcr_reg0_base(CM_GCR_REGn_BASE_BASEADDR_MSK);
- write_gcr_reg0_mask(CM_GCR_REGn_MASK_ADDRMASK_MSK);
- write_gcr_reg1_base(CM_GCR_REGn_BASE_BASEADDR_MSK);
- write_gcr_reg1_mask(CM_GCR_REGn_MASK_ADDRMASK_MSK);
- write_gcr_reg2_base(CM_GCR_REGn_BASE_BASEADDR_MSK);
- write_gcr_reg2_mask(CM_GCR_REGn_MASK_ADDRMASK_MSK);
- write_gcr_reg3_base(CM_GCR_REGn_BASE_BASEADDR_MSK);
- write_gcr_reg3_mask(CM_GCR_REGn_MASK_ADDRMASK_MSK);
+ write_gcr_reg0_base(CM_GCR_REGn_BASE_BASEADDR);
+ write_gcr_reg0_mask(CM_GCR_REGn_MASK_ADDRMASK);
+ write_gcr_reg1_base(CM_GCR_REGn_BASE_BASEADDR);
+ write_gcr_reg1_mask(CM_GCR_REGn_MASK_ADDRMASK);
+ write_gcr_reg2_base(CM_GCR_REGn_BASE_BASEADDR);
+ write_gcr_reg2_mask(CM_GCR_REGn_MASK_ADDRMASK);
+ write_gcr_reg3_base(CM_GCR_REGn_BASE_BASEADDR);
+ write_gcr_reg3_mask(CM_GCR_REGn_MASK_ADDRMASK);
/* probe for an L2-only sync region */
mips_cm_probe_l2sync();
@@ -259,16 +257,27 @@ int mips_cm_probe(void)
return 0;
}
-void mips_cm_lock_other(unsigned int core, unsigned int vp)
+void mips_cm_lock_other(unsigned int cluster, unsigned int core,
+ unsigned int vp, unsigned int block)
{
- unsigned curr_core;
+ unsigned int curr_core, cm_rev;
u32 val;
+ cm_rev = mips_cm_revision();
preempt_disable();
- if (mips_cm_revision() >= CM_REV_CM3) {
- val = core << CM3_GCR_Cx_OTHER_CORE_SHF;
- val |= vp << CM3_GCR_Cx_OTHER_VP_SHF;
+ if (cm_rev >= CM_REV_CM3) {
+ val = core << __ffs(CM3_GCR_Cx_OTHER_CORE);
+ val |= vp << __ffs(CM3_GCR_Cx_OTHER_VP);
+
+ if (cm_rev >= CM_REV_CM3_5) {
+ val |= CM_GCR_Cx_OTHER_CLUSTER_EN;
+ val |= cluster << __ffs(CM_GCR_Cx_OTHER_CLUSTER);
+ val |= block << __ffs(CM_GCR_Cx_OTHER_BLOCK);
+ } else {
+ WARN_ON(cluster != 0);
+ WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL);
+ }
/*
* We need to disable interrupts in SMP systems in order to
@@ -282,18 +291,20 @@ void mips_cm_lock_other(unsigned int core, unsigned int vp)
spin_lock_irqsave(this_cpu_ptr(&cm_core_lock),
*this_cpu_ptr(&cm_core_lock_flags));
} else {
+ WARN_ON(cluster != 0);
WARN_ON(vp != 0);
+ WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL);
/*
* We only have a GCR_CL_OTHER per core in systems with
* CM 2.5 & older, so have to ensure other VP(E)s don't
* race with us.
*/
- curr_core = current_cpu_data.core;
+ curr_core = cpu_core(&current_cpu_data);
spin_lock_irqsave(&per_cpu(cm_core_lock, curr_core),
per_cpu(cm_core_lock_flags, curr_core));
- val = core << CM_GCR_Cx_OTHER_CORENUM_SHF;
+ val = core << __ffs(CM_GCR_Cx_OTHER_CORENUM);
}
write_gcr_cl_other(val);
@@ -310,7 +321,7 @@ void mips_cm_unlock_other(void)
unsigned int curr_core;
if (mips_cm_revision() < CM_REV_CM3) {
- curr_core = current_cpu_data.core;
+ curr_core = cpu_core(&current_cpu_data);
spin_unlock_irqrestore(&per_cpu(cm_core_lock, curr_core),
per_cpu(cm_core_lock_flags, curr_core));
} else {
@@ -332,13 +343,13 @@ void mips_cm_error_report(void)
return;
revision = mips_cm_revision();
+ cm_error = read_gcr_error_cause();
+ cm_addr = read_gcr_error_addr();
+ cm_other = read_gcr_error_mult();
if (revision < CM_REV_CM3) { /* CM2 */
- cm_error = read_gcr_error_cause();
- cm_addr = read_gcr_error_addr();
- cm_other = read_gcr_error_mult();
- cause = cm_error >> CM_GCR_ERROR_CAUSE_ERRTYPE_SHF;
- ocause = cm_other >> CM_GCR_ERROR_MULT_ERR2ND_SHF;
+ cause = cm_error >> __ffs(CM_GCR_ERROR_CAUSE_ERRTYPE);
+ ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND);
if (!cause)
return;
@@ -380,11 +391,8 @@ void mips_cm_error_report(void)
ulong core_id_bits, vp_id_bits, cmd_bits, cmd_group_bits;
ulong cm3_cca_bits, mcp_bits, cm3_tr_bits, sched_bit;
- cm_error = read64_gcr_error_cause();
- cm_addr = read64_gcr_error_addr();
- cm_other = read64_gcr_error_mult();
- cause = cm_error >> CM3_GCR_ERROR_CAUSE_ERRTYPE_SHF;
- ocause = cm_other >> CM_GCR_ERROR_MULT_ERR2ND_SHF;
+ cause = cm_error >> __ffs64(CM3_GCR_ERROR_CAUSE_ERRTYPE);
+ ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND);
if (!cause)
return;
diff --git a/arch/mips/kernel/mips-cpc.c b/arch/mips/kernel/mips-cpc.c
index a4964c334cab..f66b05ebf637 100644
--- a/arch/mips/kernel/mips-cpc.c
+++ b/arch/mips/kernel/mips-cpc.c
@@ -12,8 +12,7 @@
#include <linux/percpu.h>
#include <linux/spinlock.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
void __iomem *mips_cpc_base;
@@ -40,13 +39,13 @@ static phys_addr_t mips_cpc_phys_base(void)
if (!mips_cm_present())
return 0;
- if (!(read_gcr_cpc_status() & CM_GCR_CPC_STATUS_EX_MSK))
+ if (!(read_gcr_cpc_status() & CM_GCR_CPC_STATUS_EX))
return 0;
/* If the CPC is already enabled, leave it so */
cpc_base = read_gcr_cpc_base();
- if (cpc_base & CM_GCR_CPC_BASE_CPCEN_MSK)
- return cpc_base & CM_GCR_CPC_BASE_CPCBASE_MSK;
+ if (cpc_base & CM_GCR_CPC_BASE_CPCEN)
+ return cpc_base & CM_GCR_CPC_BASE_CPCBASE;
/* Otherwise, use the default address */
cpc_base = mips_cpc_default_phys_base();
@@ -54,7 +53,7 @@ static phys_addr_t mips_cpc_phys_base(void)
return cpc_base;
/* Enable the CPC, mapped at the default address */
- write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN_MSK);
+ write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN);
return cpc_base;
}
@@ -86,10 +85,10 @@ void mips_cpc_lock_other(unsigned int core)
return;
preempt_disable();
- curr_core = current_cpu_data.core;
+ curr_core = cpu_core(&current_cpu_data);
spin_lock_irqsave(&per_cpu(cpc_core_lock, curr_core),
per_cpu(cpc_core_lock_flags, curr_core));
- write_cpc_cl_other(core << CPC_Cx_OTHER_CORENUM_SHF);
+ write_cpc_cl_other(core << __ffs(CPC_Cx_OTHER_CORENUM));
/*
* Ensure the core-other region reflects the appropriate core &
@@ -106,7 +105,7 @@ void mips_cpc_unlock_other(void)
/* Systems with CM >= 3 lock the CPC via mips_cm_lock_other */
return;
- curr_core = current_cpu_data.core;
+ curr_core = cpu_core(&current_cpu_data);
spin_unlock_irqrestore(&per_cpu(cpc_core_lock, curr_core),
per_cpu(cpc_core_lock_flags, curr_core));
preempt_enable();
diff --git a/arch/mips/kernel/mips-r2-to-r6-emul.c b/arch/mips/kernel/mips-r2-to-r6-emul.c
index ae64c8f56a8c..eb18b186e858 100644
--- a/arch/mips/kernel/mips-r2-to-r6-emul.c
+++ b/arch/mips/kernel/mips-r2-to-r6-emul.c
@@ -46,9 +46,11 @@
#define LL "ll "
#define SC "sc "
-DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2emustats);
-DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2bdemustats);
-DEFINE_PER_CPU(struct mips_r2br_emulator_stats, mipsr2bremustats);
+#ifdef CONFIG_DEBUG_FS
+static DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2emustats);
+static DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2bdemustats);
+static DEFINE_PER_CPU(struct mips_r2br_emulator_stats, mipsr2bremustats);
+#endif
extern const unsigned int fpucondbit[8];
@@ -600,7 +602,7 @@ static int ddivu_func(struct pt_regs *regs, u32 ir)
}
/* R6 removed instructions for the SPECIAL opcode */
-static struct r2_decoder_table spec_op_table[] = {
+static const struct r2_decoder_table spec_op_table[] = {
{ 0xfc1ff83f, 0x00000008, jr_func },
{ 0xfc00ffff, 0x00000018, mult_func },
{ 0xfc00ffff, 0x00000019, multu_func },
@@ -867,7 +869,7 @@ static int dclo_func(struct pt_regs *regs, u32 ir)
}
/* R6 removed instructions for the SPECIAL2 opcode */
-static struct r2_decoder_table spec2_op_table[] = {
+static const struct r2_decoder_table spec2_op_table[] = {
{ 0xfc00ffff, 0x70000000, madd_func },
{ 0xfc00ffff, 0x70000001, maddu_func },
{ 0xfc0007ff, 0x70000002, mul_func },
@@ -881,9 +883,9 @@ static struct r2_decoder_table spec2_op_table[] = {
};
static inline int mipsr2_find_op_func(struct pt_regs *regs, u32 inst,
- struct r2_decoder_table *table)
+ const struct r2_decoder_table *table)
{
- struct r2_decoder_table *p;
+ const struct r2_decoder_table *p;
int err;
for (p = table; p->func; p++) {
diff --git a/arch/mips/kernel/octeon_switch.S b/arch/mips/kernel/octeon_switch.S
index 3375745b9198..e42113fe2762 100644
--- a/arch/mips/kernel/octeon_switch.S
+++ b/arch/mips/kernel/octeon_switch.S
@@ -10,12 +10,13 @@
* Copyright (C) 2000 MIPS Technologies, Inc.
* written by Carsten Langgaard, [email protected]
*/
+#include <asm/asm.h>
+#include <asm/export.h>
+#include <asm/asm-offsets.h>
+#include <asm/mipsregs.h>
+#include <asm/regdef.h>
+#include <asm/stackframe.h>
-#define USE_ALTERNATE_RESUME_IMPL 1
- .set push
- .set arch=mips64r2
-#include "r4k_switch.S"
- .set pop
/*
* task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti)
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c
index 9e6c74bf66c4..6668f67a61c3 100644
--- a/arch/mips/kernel/perf_event_mipsxx.c
+++ b/arch/mips/kernel/perf_event_mipsxx.c
@@ -618,8 +618,7 @@ static int mipspmu_event_init(struct perf_event *event)
return -ENOENT;
}
- if ((unsigned int)event->cpu >= nr_cpumask_bits ||
- (event->cpu >= 0 && !cpu_online(event->cpu)))
+ if (event->cpu >= 0 && !cpu_online(event->cpu))
return -ENODEV;
if (!atomic_inc_not_zero(&active_events)) {
diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c
index d99416094ba9..4655017f2377 100644
--- a/arch/mips/kernel/pm-cps.c
+++ b/arch/mips/kernel/pm-cps.c
@@ -17,8 +17,7 @@
#include <asm/cacheflush.h>
#include <asm/cacheops.h>
#include <asm/idle.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
#include <asm/mipsmtregs.h>
#include <asm/pm.h>
#include <asm/pm-cps.h>
@@ -49,7 +48,7 @@ static DEFINE_PER_CPU_READ_MOSTLY(cps_nc_entry_fn[CPS_PM_STATE_COUNT],
nc_asm_enter);
/* Bitmap indicating which states are supported by the system */
-DECLARE_BITMAP(state_support, CPS_PM_STATE_COUNT);
+static DECLARE_BITMAP(state_support, CPS_PM_STATE_COUNT);
/*
* Indicates the number of coupled VPEs ready to operate in a non-coherent
@@ -114,7 +113,7 @@ static void coupled_barrier(atomic_t *a, unsigned online)
int cps_pm_enter_state(enum cps_pm_state state)
{
unsigned cpu = smp_processor_id();
- unsigned core = current_cpu_data.core;
+ unsigned core = cpu_core(&current_cpu_data);
unsigned online, left;
cpumask_t *coupled_mask = this_cpu_ptr(&online_coupled);
u32 *core_ready_count, *nc_core_ready_count;
@@ -486,7 +485,7 @@ static void *cps_gen_entry_code(unsigned cpu, enum cps_pm_state state)
* defined by the interAptiv & proAptiv SUMs as ensuring that the
* operation resulting from the preceding store is complete.
*/
- uasm_i_addiu(&p, t0, zero, 1 << cpu_data[cpu].core);
+ uasm_i_addiu(&p, t0, zero, 1 << cpu_core(&cpu_data[cpu]));
uasm_i_sw(&p, t0, 0, r_pcohctl);
uasm_i_lw(&p, t0, 0, r_pcohctl);
@@ -569,8 +568,8 @@ static void *cps_gen_entry_code(unsigned cpu, enum cps_pm_state state)
* rest will just be performing a rather unusual nop.
*/
uasm_i_addiu(&p, t0, zero, mips_cm_revision() < CM_REV_CM3
- ? CM_GCR_Cx_COHERENCE_COHDOMAINEN_MSK
- : CM3_GCR_Cx_COHERENCE_COHEN_MSK);
+ ? CM_GCR_Cx_COHERENCE_COHDOMAINEN
+ : CM3_GCR_Cx_COHERENCE_COHEN);
uasm_i_sw(&p, t0, 0, r_pcohctl);
uasm_i_lw(&p, t0, 0, r_pcohctl);
@@ -640,7 +639,7 @@ out_err:
static int cps_pm_online_cpu(unsigned int cpu)
{
enum cps_pm_state state;
- unsigned core = cpu_data[cpu].core;
+ unsigned core = cpu_core(&cpu_data[cpu]);
void *entry_fn, *core_rc;
for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) {
@@ -692,7 +691,7 @@ static int __init cps_pm_init(void)
/* Detect whether a CPC is present */
if (mips_cpc_present()) {
/* Detect whether clock gating is implemented */
- if (read_cpc_cl_stat_conf() & CPC_Cx_STAT_CONF_CLKGAT_IMPL_MSK)
+ if (read_cpc_cl_stat_conf() & CPC_Cx_STAT_CONF_CLKGAT_IMPL)
set_bit(CPS_PM_CLOCK_GATED, state_support);
else
pr_warn("pm-cps: CPC does not support clock gating\n");
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c
index 70604c753aa4..bd9bf528f19b 100644
--- a/arch/mips/kernel/proc.c
+++ b/arch/mips/kernel/proc.c
@@ -134,13 +134,13 @@ static int show_cpuinfo(struct seq_file *m, void *v)
seq_printf(m, "kscratch registers\t: %d\n",
hweight8(cpu_data[n].kscratch_mask));
seq_printf(m, "package\t\t\t: %d\n", cpu_data[n].package);
- seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core);
+ seq_printf(m, "core\t\t\t: %d\n", cpu_core(&cpu_data[n]));
#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
if (cpu_has_mipsmt)
- seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id);
+ seq_printf(m, "VPE\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
else if (cpu_has_vp)
- seq_printf(m, "VP\t\t\t: %d\n", cpu_data[n].vpe_id);
+ seq_printf(m, "VP\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
#endif
sprintf(fmt, "VCE%%c exceptions\t\t: %s\n",
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index 5351e1f3950d..c5ff6bfe2825 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -208,13 +208,13 @@ static inline int is_ra_save_ins(union mips_instruction *ip, int *poff)
*
* microMIPS is way more fun...
*/
- if (mm_insn_16bit(ip->halfword[1])) {
+ if (mm_insn_16bit(ip->word >> 16)) {
switch (ip->mm16_r5_format.opcode) {
case mm_swsp16_op:
if (ip->mm16_r5_format.rt != 31)
return 0;
- *poff = ip->mm16_r5_format.simmediate;
+ *poff = ip->mm16_r5_format.imm;
*poff = (*poff << 2) / sizeof(ulong);
return 1;
@@ -287,7 +287,7 @@ static inline int is_jump_ins(union mips_instruction *ip)
*
* microMIPS is kind of more fun...
*/
- if (mm_insn_16bit(ip->halfword[1])) {
+ if (mm_insn_16bit(ip->word >> 16)) {
if ((ip->mm16_r5_format.opcode == mm_pool16c_op &&
(ip->mm16_r5_format.rt & mm_jr16_op) == mm_jr16_op))
return 1;
@@ -313,9 +313,11 @@ static inline int is_jump_ins(union mips_instruction *ip)
#endif
}
-static inline int is_sp_move_ins(union mips_instruction *ip)
+static inline int is_sp_move_ins(union mips_instruction *ip, int *frame_size)
{
#ifdef CONFIG_CPU_MICROMIPS
+ unsigned short tmp;
+
/*
* addiusp -imm
* addius5 sp,-imm
@@ -324,21 +326,40 @@ static inline int is_sp_move_ins(union mips_instruction *ip)
*
* microMIPS is not more fun...
*/
- if (mm_insn_16bit(ip->halfword[1])) {
- return (ip->mm16_r3_format.opcode == mm_pool16d_op &&
- ip->mm16_r3_format.simmediate && mm_addiusp_func) ||
- (ip->mm16_r5_format.opcode == mm_pool16d_op &&
- ip->mm16_r5_format.rt == 29);
+ if (mm_insn_16bit(ip->word >> 16)) {
+ if (ip->mm16_r3_format.opcode == mm_pool16d_op &&
+ ip->mm16_r3_format.simmediate & mm_addiusp_func) {
+ tmp = ip->mm_b0_format.simmediate >> 1;
+ tmp = ((tmp & 0x1ff) ^ 0x100) - 0x100;
+ if ((tmp + 2) < 4) /* 0x0,0x1,0x1fe,0x1ff are special */
+ tmp ^= 0x100;
+ *frame_size = -(signed short)(tmp << 2);
+ return 1;
+ }
+ if (ip->mm16_r5_format.opcode == mm_pool16d_op &&
+ ip->mm16_r5_format.rt == 29) {
+ tmp = ip->mm16_r5_format.imm >> 1;
+ *frame_size = -(signed short)(tmp & 0xf);
+ return 1;
+ }
+ return 0;
}
- return ip->mm_i_format.opcode == mm_addiu32_op &&
- ip->mm_i_format.rt == 29 && ip->mm_i_format.rs == 29;
+ if (ip->mm_i_format.opcode == mm_addiu32_op &&
+ ip->mm_i_format.rt == 29 && ip->mm_i_format.rs == 29) {
+ *frame_size = -ip->i_format.simmediate;
+ return 1;
+ }
#else
/* addiu/daddiu sp,sp,-imm */
if (ip->i_format.rs != 29 || ip->i_format.rt != 29)
return 0;
- if (ip->i_format.opcode == addiu_op || ip->i_format.opcode == daddiu_op)
+
+ if (ip->i_format.opcode == addiu_op ||
+ ip->i_format.opcode == daddiu_op) {
+ *frame_size = -ip->i_format.simmediate;
return 1;
+ }
#endif
return 0;
}
@@ -348,7 +369,9 @@ static int get_frame_info(struct mips_frame_info *info)
bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS);
union mips_instruction insn, *ip, *ip_end;
const unsigned int max_insns = 128;
+ unsigned int last_insn_size = 0;
unsigned int i;
+ bool saw_jump = false;
info->pc_offset = -1;
info->frame_size = 0;
@@ -359,47 +382,44 @@ static int get_frame_info(struct mips_frame_info *info)
ip_end = (void *)ip + info->func_size;
- for (i = 0; i < max_insns && ip < ip_end; i++, ip++) {
+ for (i = 0; i < max_insns && ip < ip_end; i++) {
+ ip = (void *)ip + last_insn_size;
if (is_mmips && mm_insn_16bit(ip->halfword[0])) {
- insn.halfword[0] = 0;
- insn.halfword[1] = ip->halfword[0];
+ insn.word = ip->halfword[0] << 16;
+ last_insn_size = 2;
} else if (is_mmips) {
- insn.halfword[0] = ip->halfword[1];
- insn.halfword[1] = ip->halfword[0];
+ insn.word = ip->halfword[0] << 16 | ip->halfword[1];
+ last_insn_size = 4;
} else {
insn.word = ip->word;
+ last_insn_size = 4;
}
- if (is_jump_ins(&insn))
- break;
-
if (!info->frame_size) {
- if (is_sp_move_ins(&insn))
- {
-#ifdef CONFIG_CPU_MICROMIPS
- if (mm_insn_16bit(ip->halfword[0]))
- {
- unsigned short tmp;
-
- if (ip->halfword[0] & mm_addiusp_func)
- {
- tmp = (((ip->halfword[0] >> 1) & 0x1ff) << 2);
- info->frame_size = -(signed short)(tmp | ((tmp & 0x100) ? 0xfe00 : 0));
- } else {
- tmp = (ip->halfword[0] >> 1);
- info->frame_size = -(signed short)(tmp & 0xf);
- }
- ip = (void *) &ip->halfword[1];
- ip--;
- } else
-#endif
- info->frame_size = - ip->i_format.simmediate;
- }
+ is_sp_move_ins(&insn, &info->frame_size);
+ continue;
+ } else if (!saw_jump && is_jump_ins(ip)) {
+ /*
+ * If we see a jump instruction, we are finished
+ * with the frame save.
+ *
+ * Some functions can have a shortcut return at
+ * the beginning of the function, so don't start
+ * looking for jump instruction until we see the
+ * frame setup.
+ *
+ * The RA save instruction can get put into the
+ * delay slot of the jump instruction, so look
+ * at the next instruction, too.
+ */
+ saw_jump = true;
continue;
}
if (info->pc_offset == -1 &&
is_ra_save_ins(&insn, &info->pc_offset))
break;
+ if (saw_jump)
+ break;
}
if (info->frame_size && info->pc_offset >= 0) /* nested */
return 0;
diff --git a/arch/mips/kernel/r2300_fpu.S b/arch/mips/kernel/r2300_fpu.S
index 918f2f6d3861..3062ba66c563 100644
--- a/arch/mips/kernel/r2300_fpu.S
+++ b/arch/mips/kernel/r2300_fpu.S
@@ -12,7 +12,9 @@
* Copyright (c) 1998 Harald Koerfgen
*/
#include <asm/asm.h>
+#include <asm/asmmacro.h>
#include <asm/errno.h>
+#include <asm/export.h>
#include <asm/fpregdef.h>
#include <asm/mipsregs.h>
#include <asm/asm-offsets.h>
@@ -31,9 +33,85 @@
PTR 9b+4,bad_stack; \
.previous
- .set noreorder
.set mips1
+/*
+ * Save a thread's fp context.
+ */
+LEAF(_save_fp)
+EXPORT_SYMBOL(_save_fp)
+ fpu_save_single a0, t1 # clobbers t1
+ jr ra
+ END(_save_fp)
+
+/*
+ * Restore a thread's fp context.
+ */
+LEAF(_restore_fp)
+ fpu_restore_single a0, t1 # clobbers t1
+ jr ra
+ END(_restore_fp)
+
+/*
+ * Load the FPU with signalling NANS. This bit pattern we're using has
+ * the property that no matter whether considered as single or as double
+ * precision represents signaling NANS.
+ *
+ * The value to initialize fcr31 to comes in $a0.
+ */
+
+ .set push
+ SET_HARDFLOAT
+
+LEAF(_init_fpu)
+ mfc0 t0, CP0_STATUS
+ li t1, ST0_CU1
+ or t0, t1
+ mtc0 t0, CP0_STATUS
+
+ ctc1 a0, fcr31
+
+ li t0, -1
+
+ mtc1 t0, $f0
+ mtc1 t0, $f1
+ mtc1 t0, $f2
+ mtc1 t0, $f3
+ mtc1 t0, $f4
+ mtc1 t0, $f5
+ mtc1 t0, $f6
+ mtc1 t0, $f7
+ mtc1 t0, $f8
+ mtc1 t0, $f9
+ mtc1 t0, $f10
+ mtc1 t0, $f11
+ mtc1 t0, $f12
+ mtc1 t0, $f13
+ mtc1 t0, $f14
+ mtc1 t0, $f15
+ mtc1 t0, $f16
+ mtc1 t0, $f17
+ mtc1 t0, $f18
+ mtc1 t0, $f19
+ mtc1 t0, $f20
+ mtc1 t0, $f21
+ mtc1 t0, $f22
+ mtc1 t0, $f23
+ mtc1 t0, $f24
+ mtc1 t0, $f25
+ mtc1 t0, $f26
+ mtc1 t0, $f27
+ mtc1 t0, $f28
+ mtc1 t0, $f29
+ mtc1 t0, $f30
+ mtc1 t0, $f31
+ jr ra
+ END(_init_fpu)
+
+ .set pop
+
+ .set noreorder
+
/**
* _save_fp_context() - save FP context from the FPU
* @a0 - pointer to fpregs field of sigcontext
diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S
index 1049eeafd97d..e57703b1de50 100644
--- a/arch/mips/kernel/r2300_switch.S
+++ b/arch/mips/kernel/r2300_switch.S
@@ -26,12 +26,6 @@
.align 5
/*
- * Offset to the current process status flags, the first 32 bytes of the
- * stack are not used.
- */
-#define ST_OFF (_THREAD_SIZE - 32 - PT_SIZE + PT_STATUS)
-
-/*
* task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti)
*/
@@ -68,78 +62,3 @@ LEAF(resume)
move v0, a0
jr ra
END(resume)
-
-/*
- * Save a thread's fp context.
- */
-LEAF(_save_fp)
-EXPORT_SYMBOL(_save_fp)
- fpu_save_single a0, t1 # clobbers t1
- jr ra
- END(_save_fp)
-
-/*
- * Restore a thread's fp context.
- */
-LEAF(_restore_fp)
- fpu_restore_single a0, t1 # clobbers t1
- jr ra
- END(_restore_fp)
-
-/*
- * Load the FPU with signalling NANS. This bit pattern we're using has
- * the property that no matter whether considered as single or as double
- * precision represents signaling NANS.
- *
- * The value to initialize fcr31 to comes in $a0.
- */
-
- .set push
- SET_HARDFLOAT
-
-LEAF(_init_fpu)
- mfc0 t0, CP0_STATUS
- li t1, ST0_CU1
- or t0, t1
- mtc0 t0, CP0_STATUS
-
- ctc1 a0, fcr31
-
- li t0, -1
-
- mtc1 t0, $f0
- mtc1 t0, $f1
- mtc1 t0, $f2
- mtc1 t0, $f3
- mtc1 t0, $f4
- mtc1 t0, $f5
- mtc1 t0, $f6
- mtc1 t0, $f7
- mtc1 t0, $f8
- mtc1 t0, $f9
- mtc1 t0, $f10
- mtc1 t0, $f11
- mtc1 t0, $f12
- mtc1 t0, $f13
- mtc1 t0, $f14
- mtc1 t0, $f15
- mtc1 t0, $f16
- mtc1 t0, $f17
- mtc1 t0, $f18
- mtc1 t0, $f19
- mtc1 t0, $f20
- mtc1 t0, $f21
- mtc1 t0, $f22
- mtc1 t0, $f23
- mtc1 t0, $f24
- mtc1 t0, $f25
- mtc1 t0, $f26
- mtc1 t0, $f27
- mtc1 t0, $f28
- mtc1 t0, $f29
- mtc1 t0, $f30
- mtc1 t0, $f31
- jr ra
- END(_init_fpu)
-
- .set pop
diff --git a/arch/mips/kernel/r4k_fpu.S b/arch/mips/kernel/r4k_fpu.S
index 56d86b09c917..0a83b1708b3c 100644
--- a/arch/mips/kernel/r4k_fpu.S
+++ b/arch/mips/kernel/r4k_fpu.S
@@ -15,6 +15,7 @@
#include <asm/asm.h>
#include <asm/asmmacro.h>
#include <asm/errno.h>
+#include <asm/export.h>
#include <asm/fpregdef.h>
#include <asm/mipsregs.h>
#include <asm/asm-offsets.h>
@@ -34,6 +35,201 @@
.previous
.endm
+/*
+ * Save a thread's fp context.
+ */
+LEAF(_save_fp)
+EXPORT_SYMBOL(_save_fp)
+#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) || \
+ defined(CONFIG_CPU_MIPS32_R6)
+ mfc0 t0, CP0_STATUS
+#endif
+ fpu_save_double a0 t0 t1 # clobbers t1
+ jr ra
+ END(_save_fp)
+
+/*
+ * Restore a thread's fp context.
+ */
+LEAF(_restore_fp)
+#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) || \
+ defined(CONFIG_CPU_MIPS32_R6)
+ mfc0 t0, CP0_STATUS
+#endif
+ fpu_restore_double a0 t0 t1 # clobbers t1
+ jr ra
+ END(_restore_fp)
+
+#ifdef CONFIG_CPU_HAS_MSA
+
+/*
+ * Save a thread's MSA vector context.
+ */
+LEAF(_save_msa)
+EXPORT_SYMBOL(_save_msa)
+ msa_save_all a0
+ jr ra
+ END(_save_msa)
+
+/*
+ * Restore a thread's MSA vector context.
+ */
+LEAF(_restore_msa)
+ msa_restore_all a0
+ jr ra
+ END(_restore_msa)
+
+LEAF(_init_msa_upper)
+ msa_init_all_upper
+ jr ra
+ END(_init_msa_upper)
+
+#endif
+
+/*
+ * Load the FPU with signalling NANS. This bit pattern we're using has
+ * the property that no matter whether considered as single or as double
+ * precision represents signaling NANS.
+ *
+ * The value to initialize fcr31 to comes in $a0.
+ */
+
+ .set push
+ SET_HARDFLOAT
+
+LEAF(_init_fpu)
+ mfc0 t0, CP0_STATUS
+ li t1, ST0_CU1
+ or t0, t1
+ mtc0 t0, CP0_STATUS
+ enable_fpu_hazard
+
+ ctc1 a0, fcr31
+
+ li t1, -1 # SNaN
+
+#ifdef CONFIG_64BIT
+ sll t0, t0, 5
+ bgez t0, 1f # 16 / 32 register mode?
+
+ dmtc1 t1, $f1
+ dmtc1 t1, $f3
+ dmtc1 t1, $f5
+ dmtc1 t1, $f7
+ dmtc1 t1, $f9
+ dmtc1 t1, $f11
+ dmtc1 t1, $f13
+ dmtc1 t1, $f15
+ dmtc1 t1, $f17
+ dmtc1 t1, $f19
+ dmtc1 t1, $f21
+ dmtc1 t1, $f23
+ dmtc1 t1, $f25
+ dmtc1 t1, $f27
+ dmtc1 t1, $f29
+ dmtc1 t1, $f31
+1:
+#endif
+
+#ifdef CONFIG_CPU_MIPS32
+ mtc1 t1, $f0
+ mtc1 t1, $f1
+ mtc1 t1, $f2
+ mtc1 t1, $f3
+ mtc1 t1, $f4
+ mtc1 t1, $f5
+ mtc1 t1, $f6
+ mtc1 t1, $f7
+ mtc1 t1, $f8
+ mtc1 t1, $f9
+ mtc1 t1, $f10
+ mtc1 t1, $f11
+ mtc1 t1, $f12
+ mtc1 t1, $f13
+ mtc1 t1, $f14
+ mtc1 t1, $f15
+ mtc1 t1, $f16
+ mtc1 t1, $f17
+ mtc1 t1, $f18
+ mtc1 t1, $f19
+ mtc1 t1, $f20
+ mtc1 t1, $f21
+ mtc1 t1, $f22
+ mtc1 t1, $f23
+ mtc1 t1, $f24
+ mtc1 t1, $f25
+ mtc1 t1, $f26
+ mtc1 t1, $f27
+ mtc1 t1, $f28
+ mtc1 t1, $f29
+ mtc1 t1, $f30
+ mtc1 t1, $f31
+
+#if defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_CPU_MIPS32_R6)
+ .set push
+ .set MIPS_ISA_LEVEL_RAW
+ .set fp=64
+ sll t0, t0, 5 # is Status.FR set?
+ bgez t0, 1f # no: skip setting upper 32b
+
+ mthc1 t1, $f0
+ mthc1 t1, $f1
+ mthc1 t1, $f2
+ mthc1 t1, $f3
+ mthc1 t1, $f4
+ mthc1 t1, $f5
+ mthc1 t1, $f6
+ mthc1 t1, $f7
+ mthc1 t1, $f8
+ mthc1 t1, $f9
+ mthc1 t1, $f10
+ mthc1 t1, $f11
+ mthc1 t1, $f12
+ mthc1 t1, $f13
+ mthc1 t1, $f14
+ mthc1 t1, $f15
+ mthc1 t1, $f16
+ mthc1 t1, $f17
+ mthc1 t1, $f18
+ mthc1 t1, $f19
+ mthc1 t1, $f20
+ mthc1 t1, $f21
+ mthc1 t1, $f22
+ mthc1 t1, $f23
+ mthc1 t1, $f24
+ mthc1 t1, $f25
+ mthc1 t1, $f26
+ mthc1 t1, $f27
+ mthc1 t1, $f28
+ mthc1 t1, $f29
+ mthc1 t1, $f30
+ mthc1 t1, $f31
+1: .set pop
+#endif /* CONFIG_CPU_MIPS32_R2 || CONFIG_CPU_MIPS32_R6 */
+#else
+ .set MIPS_ISA_ARCH_LEVEL_RAW
+ dmtc1 t1, $f0
+ dmtc1 t1, $f2
+ dmtc1 t1, $f4
+ dmtc1 t1, $f6
+ dmtc1 t1, $f8
+ dmtc1 t1, $f10
+ dmtc1 t1, $f12
+ dmtc1 t1, $f14
+ dmtc1 t1, $f16
+ dmtc1 t1, $f18
+ dmtc1 t1, $f20
+ dmtc1 t1, $f22
+ dmtc1 t1, $f24
+ dmtc1 t1, $f26
+ dmtc1 t1, $f28
+ dmtc1 t1, $f30
+#endif
+ jr ra
+ END(_init_fpu)
+
+ .set pop /* SET_HARDFLOAT */
+
.set noreorder
/**
diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S
index 7b386d54fd65..17cf9341c1cf 100644
--- a/arch/mips/kernel/r4k_switch.S
+++ b/arch/mips/kernel/r4k_switch.S
@@ -12,8 +12,6 @@
*/
#include <asm/asm.h>
#include <asm/cachectl.h>
-#include <asm/export.h>
-#include <asm/fpregdef.h>
#include <asm/mipsregs.h>
#include <asm/asm-offsets.h>
#include <asm/regdef.h>
@@ -22,10 +20,6 @@
#include <asm/asmmacro.h>
-/* preprocessor replaces the fp in ".set fp=64" with $30 otherwise */
-#undef fp
-
-#ifndef USE_ALTERNATE_RESUME_IMPL
/*
* task_struct *resume(task_struct *prev, task_struct *next,
* struct thread_info *next_ti)
@@ -63,200 +57,3 @@
move v0, a0
jr ra
END(resume)
-
-#endif /* USE_ALTERNATE_RESUME_IMPL */
-
-/*
- * Save a thread's fp context.
- */
-LEAF(_save_fp)
-EXPORT_SYMBOL(_save_fp)
-#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) || \
- defined(CONFIG_CPU_MIPS32_R6)
- mfc0 t0, CP0_STATUS
-#endif
- fpu_save_double a0 t0 t1 # clobbers t1
- jr ra
- END(_save_fp)
-
-/*
- * Restore a thread's fp context.
- */
-LEAF(_restore_fp)
-#if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) || \
- defined(CONFIG_CPU_MIPS32_R6)
- mfc0 t0, CP0_STATUS
-#endif
- fpu_restore_double a0 t0 t1 # clobbers t1
- jr ra
- END(_restore_fp)
-
-#ifdef CONFIG_CPU_HAS_MSA
-
-/*
- * Save a thread's MSA vector context.
- */
-LEAF(_save_msa)
-EXPORT_SYMBOL(_save_msa)
- msa_save_all a0
- jr ra
- END(_save_msa)
-
-/*
- * Restore a thread's MSA vector context.
- */
-LEAF(_restore_msa)
- msa_restore_all a0
- jr ra
- END(_restore_msa)
-
-LEAF(_init_msa_upper)
- msa_init_all_upper
- jr ra
- END(_init_msa_upper)
-
-#endif
-
-/*
- * Load the FPU with signalling NANS. This bit pattern we're using has
- * the property that no matter whether considered as single or as double
- * precision represents signaling NANS.
- *
- * The value to initialize fcr31 to comes in $a0.
- */
-
- .set push
- SET_HARDFLOAT
-
-LEAF(_init_fpu)
- mfc0 t0, CP0_STATUS
- li t1, ST0_CU1
- or t0, t1
- mtc0 t0, CP0_STATUS
- enable_fpu_hazard
-
- ctc1 a0, fcr31
-
- li t1, -1 # SNaN
-
-#ifdef CONFIG_64BIT
- sll t0, t0, 5
- bgez t0, 1f # 16 / 32 register mode?
-
- dmtc1 t1, $f1
- dmtc1 t1, $f3
- dmtc1 t1, $f5
- dmtc1 t1, $f7
- dmtc1 t1, $f9
- dmtc1 t1, $f11
- dmtc1 t1, $f13
- dmtc1 t1, $f15
- dmtc1 t1, $f17
- dmtc1 t1, $f19
- dmtc1 t1, $f21
- dmtc1 t1, $f23
- dmtc1 t1, $f25
- dmtc1 t1, $f27
- dmtc1 t1, $f29
- dmtc1 t1, $f31
-1:
-#endif
-
-#ifdef CONFIG_CPU_MIPS32
- mtc1 t1, $f0
- mtc1 t1, $f1
- mtc1 t1, $f2
- mtc1 t1, $f3
- mtc1 t1, $f4
- mtc1 t1, $f5
- mtc1 t1, $f6
- mtc1 t1, $f7
- mtc1 t1, $f8
- mtc1 t1, $f9
- mtc1 t1, $f10
- mtc1 t1, $f11
- mtc1 t1, $f12
- mtc1 t1, $f13
- mtc1 t1, $f14
- mtc1 t1, $f15
- mtc1 t1, $f16
- mtc1 t1, $f17
- mtc1 t1, $f18
- mtc1 t1, $f19
- mtc1 t1, $f20
- mtc1 t1, $f21
- mtc1 t1, $f22
- mtc1 t1, $f23
- mtc1 t1, $f24
- mtc1 t1, $f25
- mtc1 t1, $f26
- mtc1 t1, $f27
- mtc1 t1, $f28
- mtc1 t1, $f29
- mtc1 t1, $f30
- mtc1 t1, $f31
-
-#if defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_CPU_MIPS32_R6)
- .set push
- .set MIPS_ISA_LEVEL_RAW
- .set fp=64
- sll t0, t0, 5 # is Status.FR set?
- bgez t0, 1f # no: skip setting upper 32b
-
- mthc1 t1, $f0
- mthc1 t1, $f1
- mthc1 t1, $f2
- mthc1 t1, $f3
- mthc1 t1, $f4
- mthc1 t1, $f5
- mthc1 t1, $f6
- mthc1 t1, $f7
- mthc1 t1, $f8
- mthc1 t1, $f9
- mthc1 t1, $f10
- mthc1 t1, $f11
- mthc1 t1, $f12
- mthc1 t1, $f13
- mthc1 t1, $f14
- mthc1 t1, $f15
- mthc1 t1, $f16
- mthc1 t1, $f17
- mthc1 t1, $f18
- mthc1 t1, $f19
- mthc1 t1, $f20
- mthc1 t1, $f21
- mthc1 t1, $f22
- mthc1 t1, $f23
- mthc1 t1, $f24
- mthc1 t1, $f25
- mthc1 t1, $f26
- mthc1 t1, $f27
- mthc1 t1, $f28
- mthc1 t1, $f29
- mthc1 t1, $f30
- mthc1 t1, $f31
-1: .set pop
-#endif /* CONFIG_CPU_MIPS32_R2 || CONFIG_CPU_MIPS32_R6 */
-#else
- .set MIPS_ISA_ARCH_LEVEL_RAW
- dmtc1 t1, $f0
- dmtc1 t1, $f2
- dmtc1 t1, $f4
- dmtc1 t1, $f6
- dmtc1 t1, $f8
- dmtc1 t1, $f10
- dmtc1 t1, $f12
- dmtc1 t1, $f14
- dmtc1 t1, $f16
- dmtc1 t1, $f18
- dmtc1 t1, $f20
- dmtc1 t1, $f22
- dmtc1 t1, $f24
- dmtc1 t1, $f26
- dmtc1 t1, $f28
- dmtc1 t1, $f30
-#endif
- jr ra
- END(_init_fpu)
-
- .set pop /* SET_HARDFLOAT */
diff --git a/arch/mips/kernel/r6000_fpu.S b/arch/mips/kernel/r6000_fpu.S
deleted file mode 100644
index 9cc7bfab3419..000000000000
--- a/arch/mips/kernel/r6000_fpu.S
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * r6000_fpu.S: Save/restore floating point context for signal handlers.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1996 by Ralf Baechle
- *
- * Multi-arch abstraction and asm macros for easier reading:
- * Copyright (C) 1996 David S. Miller ([email protected])
- */
-#include <asm/asm.h>
-#include <asm/fpregdef.h>
-#include <asm/mipsregs.h>
-#include <asm/asm-offsets.h>
-#include <asm/regdef.h>
-
- .set noreorder
- .set mips2
- .set push
- SET_HARDFLOAT
-
-/**
- * _save_fp_context() - save FP context from the FPU
- * @a0 - pointer to fpregs field of sigcontext
- * @a1 - pointer to fpc_csr field of sigcontext
- *
- * Save FP context, including the 32 FP data registers and the FP
- * control & status register, from the FPU to signal context.
- */
- LEAF(_save_fp_context)
- mfc0 t0,CP0_STATUS
- sll t0,t0,2
- bgez t0,1f
- nop
-
- cfc1 t1,fcr31
- /* Store the 16 double precision registers */
- sdc1 $f0,0(a0)
- sdc1 $f2,16(a0)
- sdc1 $f4,32(a0)
- sdc1 $f6,48(a0)
- sdc1 $f8,64(a0)
- sdc1 $f10,80(a0)
- sdc1 $f12,96(a0)
- sdc1 $f14,112(a0)
- sdc1 $f16,128(a0)
- sdc1 $f18,144(a0)
- sdc1 $f20,160(a0)
- sdc1 $f22,176(a0)
- sdc1 $f24,192(a0)
- sdc1 $f26,208(a0)
- sdc1 $f28,224(a0)
- sdc1 $f30,240(a0)
- jr ra
- sw t0,(a1)
-1: jr ra
- nop
- END(_save_fp_context)
-
-/**
- * _restore_fp_context() - restore FP context to the FPU
- * @a0 - pointer to fpregs field of sigcontext
- * @a1 - pointer to fpc_csr field of sigcontext
- *
- * Restore FP context, including the 32 FP data registers and the FP
- * control & status register, from signal context to the FPU.
- */
- LEAF(_restore_fp_context)
- mfc0 t0,CP0_STATUS
- sll t0,t0,2
-
- bgez t0,1f
- lw t0,(a1)
- /* Restore the 16 double precision registers */
- ldc1 $f0,0(a0)
- ldc1 $f2,16(a0)
- ldc1 $f4,32(a0)
- ldc1 $f6,48(a0)
- ldc1 $f8,64(a0)
- ldc1 $f10,80(a0)
- ldc1 $f12,96(a0)
- ldc1 $f14,112(a0)
- ldc1 $f16,128(a0)
- ldc1 $f18,144(a0)
- ldc1 $f20,160(a0)
- ldc1 $f22,176(a0)
- ldc1 $f24,192(a0)
- ldc1 $f26,208(a0)
- ldc1 $f28,224(a0)
- ldc1 $f30,240(a0)
- jr ra
- ctc1 t0,fcr31
-1: jr ra
- nop
- END(_restore_fp_context)
-
- .set pop /* SET_HARDFLOAT */
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index 84165f2b31ff..cf5c7c05e5a3 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -93,38 +93,37 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
at the same time. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (from->si_code >> 16) {
- case __SI_TIMER >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_int, &to->si_int);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
- default:
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_int, &to->si_int);
break;
- case __SI_SYS >> 16:
+ case SIL_SYS:
err |= __copy_to_user(&to->si_call_addr, &from->si_call_addr,
sizeof(compat_uptr_t));
err |= __put_user(from->si_syscall, &to->si_syscall);
diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c
index 1b070a76fcdd..406072e26752 100644
--- a/arch/mips/kernel/smp-bmips.c
+++ b/arch/mips/kernel/smp-bmips.c
@@ -179,7 +179,7 @@ static void bmips_prepare_cpus(unsigned int max_cpus)
/*
* Tell the hardware to boot CPUx - runs on CPU0
*/
-static void bmips_boot_secondary(int cpu, struct task_struct *idle)
+static int bmips_boot_secondary(int cpu, struct task_struct *idle)
{
bmips_smp_boot_sp = __KSTK_TOS(idle);
bmips_smp_boot_gp = (unsigned long)task_thread_info(idle);
@@ -231,6 +231,8 @@ static void bmips_boot_secondary(int cpu, struct task_struct *idle)
}
cpumask_set_cpu(cpu, &bmips_booted_mask);
}
+
+ return 0;
}
/*
@@ -245,7 +247,7 @@ static void bmips_init_secondary(void)
break;
case CPU_BMIPS5000:
write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0));
- current_cpu_data.core = (read_c0_brcm_config() >> 25) & 3;
+ cpu_set_core(&current_cpu_data, (read_c0_brcm_config() >> 25) & 3);
break;
}
}
@@ -409,7 +411,7 @@ void __ref play_dead(void)
#endif /* CONFIG_HOTPLUG_CPU */
-struct plat_smp_ops bmips43xx_smp_ops = {
+const struct plat_smp_ops bmips43xx_smp_ops = {
.smp_setup = bmips_smp_setup,
.prepare_cpus = bmips_prepare_cpus,
.boot_secondary = bmips_boot_secondary,
@@ -423,7 +425,7 @@ struct plat_smp_ops bmips43xx_smp_ops = {
#endif
};
-struct plat_smp_ops bmips5000_smp_ops = {
+const struct plat_smp_ops bmips5000_smp_ops = {
.smp_setup = bmips_smp_setup,
.prepare_cpus = bmips_prepare_cpus,
.boot_secondary = bmips_boot_secondary,
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c
index 76923349b4fe..05295a4909f1 100644
--- a/arch/mips/kernel/smp-cmp.c
+++ b/arch/mips/kernel/smp-cmp.c
@@ -24,7 +24,6 @@
#include <linux/cpumask.h>
#include <linux/interrupt.h>
#include <linux/compiler.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/atomic.h>
#include <asm/cacheflush.h>
@@ -78,7 +77,7 @@ static void cmp_smp_finish(void)
* __KSTK_TOS(idle) is apparently the stack pointer
* (unsigned long)idle->thread_info the gp
*/
-static void cmp_boot_secondary(int cpu, struct task_struct *idle)
+static int cmp_boot_secondary(int cpu, struct task_struct *idle)
{
struct thread_info *gp = task_thread_info(idle);
unsigned long sp = __KSTK_TOS(idle);
@@ -95,6 +94,7 @@ static void cmp_boot_secondary(int cpu, struct task_struct *idle)
#endif
amon_cpu_start(cpu, pc, sp, (unsigned long)gp, a0);
+ return 0;
}
/*
@@ -148,7 +148,7 @@ void __init cmp_prepare_cpus(unsigned int max_cpus)
}
-struct plat_smp_ops cmp_smp_ops = {
+const struct plat_smp_ops cmp_smp_ops = {
.send_ipi_single = mips_smp_send_ipi_single,
.send_ipi_mask = mips_smp_send_ipi_mask,
.init_secondary = cmp_init_secondary,
diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c
index f832e99ad4c3..0063122c85da 100644
--- a/arch/mips/kernel/smp-cps.c
+++ b/arch/mips/kernel/smp-cps.c
@@ -11,7 +11,6 @@
#include <linux/cpu.h>
#include <linux/delay.h>
#include <linux/io.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/sched/task_stack.h>
#include <linux/sched/hotplug.h>
#include <linux/slab.h>
@@ -19,8 +18,7 @@
#include <linux/types.h>
#include <asm/bcache.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
#include <asm/mips_mt.h>
#include <asm/mipsregs.h>
#include <asm/pm-cps.h>
@@ -41,55 +39,58 @@ static int __init setup_nothreads(char *s)
}
early_param("nothreads", setup_nothreads);
-static unsigned core_vpe_count(unsigned core)
+static unsigned core_vpe_count(unsigned int cluster, unsigned core)
{
- unsigned cfg;
-
if (threads_disabled)
return 1;
- if ((!IS_ENABLED(CONFIG_MIPS_MT_SMP) || !cpu_has_mipsmt)
- && (!IS_ENABLED(CONFIG_CPU_MIPSR6) || !cpu_has_vp))
- return 1;
-
- mips_cm_lock_other(core, 0);
- cfg = read_gcr_co_config() & CM_GCR_Cx_CONFIG_PVPE_MSK;
- mips_cm_unlock_other();
- return (cfg >> CM_GCR_Cx_CONFIG_PVPE_SHF) + 1;
+ return mips_cps_numvps(cluster, core);
}
static void __init cps_smp_setup(void)
{
- unsigned int ncores, nvpes, core_vpes;
+ unsigned int nclusters, ncores, nvpes, core_vpes;
unsigned long core_entry;
- int c, v;
+ int cl, c, v;
/* Detect & record VPE topology */
- ncores = mips_cm_numcores();
+ nvpes = 0;
+ nclusters = mips_cps_numclusters();
pr_info("%s topology ", cpu_has_mips_r6 ? "VP" : "VPE");
- for (c = nvpes = 0; c < ncores; c++) {
- core_vpes = core_vpe_count(c);
- pr_cont("%c%u", c ? ',' : '{', core_vpes);
-
- /* Use the number of VPEs in core 0 for smp_num_siblings */
- if (!c)
- smp_num_siblings = core_vpes;
-
- for (v = 0; v < min_t(int, core_vpes, NR_CPUS - nvpes); v++) {
- cpu_data[nvpes + v].core = c;
-#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
- cpu_data[nvpes + v].vpe_id = v;
-#endif
+ for (cl = 0; cl < nclusters; cl++) {
+ if (cl > 0)
+ pr_cont(",");
+ pr_cont("{");
+
+ ncores = mips_cps_numcores(cl);
+ for (c = 0; c < ncores; c++) {
+ core_vpes = core_vpe_count(cl, c);
+
+ if (c > 0)
+ pr_cont(",");
+ pr_cont("%u", core_vpes);
+
+ /* Use the number of VPEs in cluster 0 core 0 for smp_num_siblings */
+ if (!cl && !c)
+ smp_num_siblings = core_vpes;
+
+ for (v = 0; v < min_t(int, core_vpes, NR_CPUS - nvpes); v++) {
+ cpu_set_cluster(&cpu_data[nvpes + v], cl);
+ cpu_set_core(&cpu_data[nvpes + v], c);
+ cpu_set_vpe_id(&cpu_data[nvpes + v], v);
+ }
+
+ nvpes += core_vpes;
}
- nvpes += core_vpes;
+ pr_cont("}");
}
- pr_cont("} total %u\n", nvpes);
+ pr_cont(" total %u\n", nvpes);
/* Indicate present CPUs (CPU being synonymous with VPE) */
for (v = 0; v < min_t(unsigned, nvpes, NR_CPUS); v++) {
- set_cpu_possible(v, true);
- set_cpu_present(v, true);
+ set_cpu_possible(v, cpu_cluster(&cpu_data[v]) == 0);
+ set_cpu_present(v, cpu_cluster(&cpu_data[v]) == 0);
__cpu_number_map[v] = v;
__cpu_logical_map[v] = v;
}
@@ -121,7 +122,7 @@ static void __init cps_smp_setup(void)
static void __init cps_prepare_cpus(unsigned int max_cpus)
{
unsigned ncores, core_vpes, c, cca;
- bool cca_unsuitable;
+ bool cca_unsuitable, cores_limited;
u32 *entry_code;
mips_mt_set_cpuoptions();
@@ -141,19 +142,22 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
}
/* Warn the user if the CCA prevents multi-core */
- ncores = mips_cm_numcores();
- if ((cca_unsuitable || cpu_has_dc_aliases) && ncores > 1) {
+ cores_limited = false;
+ if (cca_unsuitable || cpu_has_dc_aliases) {
+ for_each_present_cpu(c) {
+ if (cpus_are_siblings(smp_processor_id(), c))
+ continue;
+
+ set_cpu_present(c, false);
+ cores_limited = true;
+ }
+ }
+ if (cores_limited)
pr_warn("Using only one core due to %s%s%s\n",
cca_unsuitable ? "unsuitable CCA" : "",
(cca_unsuitable && cpu_has_dc_aliases) ? " & " : "",
cpu_has_dc_aliases ? "dcache aliasing" : "");
- for_each_present_cpu(c) {
- if (cpu_data[c].core)
- set_cpu_present(c, false);
- }
- }
-
/*
* Patch the start of mips_cps_core_entry to provide:
*
@@ -168,6 +172,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
__sync();
/* Allocate core boot configuration structs */
+ ncores = mips_cps_numcores(0);
mips_cps_core_bootcfg = kcalloc(ncores, sizeof(*mips_cps_core_bootcfg),
GFP_KERNEL);
if (!mips_cps_core_bootcfg) {
@@ -177,7 +182,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
/* Allocate VPE boot configuration structs */
for (c = 0; c < ncores; c++) {
- core_vpes = core_vpe_count(c);
+ core_vpes = core_vpe_count(0, c);
mips_cps_core_bootcfg[c].vpe_config = kcalloc(core_vpes,
sizeof(*mips_cps_core_bootcfg[c].vpe_config),
GFP_KERNEL);
@@ -189,7 +194,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus)
}
/* Mark this CPU as booted */
- atomic_set(&mips_cps_core_bootcfg[current_cpu_data.core].vpe_mask,
+ atomic_set(&mips_cps_core_bootcfg[cpu_core(&current_cpu_data)].vpe_mask,
1 << cpu_vpe_id(&current_cpu_data));
return;
@@ -212,11 +217,11 @@ err_out:
static void boot_core(unsigned int core, unsigned int vpe_id)
{
- u32 access, stat, seq_state;
+ u32 stat, seq_state;
unsigned timeout;
/* Select the appropriate core */
- mips_cm_lock_other(core, 0);
+ mips_cm_lock_other(0, core, 0, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
/* Set its reset vector */
write_gcr_co_reset_base(CKSEG1ADDR((unsigned long)mips_cps_core_entry));
@@ -225,12 +230,10 @@ static void boot_core(unsigned int core, unsigned int vpe_id)
write_gcr_co_coherence(0);
/* Start it with the legacy memory map and exception base */
- write_gcr_co_reset_ext_base(CM_GCR_RESET_EXT_BASE_UEB);
+ write_gcr_co_reset_ext_base(CM_GCR_Cx_RESET_EXT_BASE_UEB);
/* Ensure the core can access the GCRs */
- access = read_gcr_access();
- access |= 1 << (CM_GCR_ACCESS_ACCESSEN_SHF + core);
- write_gcr_access(access);
+ set_gcr_access(1 << core);
if (mips_cpc_present()) {
/* Reset the core */
@@ -253,7 +256,8 @@ static void boot_core(unsigned int core, unsigned int vpe_id)
timeout = 100;
while (true) {
stat = read_cpc_co_stat_conf();
- seq_state = stat & CPC_Cx_STAT_CONF_SEQSTATE_MSK;
+ seq_state = stat & CPC_Cx_STAT_CONF_SEQSTATE;
+ seq_state >>= __ffs(CPC_Cx_STAT_CONF_SEQSTATE);
/* U6 == coherent execution, ie. the core is up */
if (seq_state == CPC_Cx_STAT_CONF_SEQSTATE_U6)
@@ -285,15 +289,15 @@ static void boot_core(unsigned int core, unsigned int vpe_id)
static void remote_vpe_boot(void *dummy)
{
- unsigned core = current_cpu_data.core;
+ unsigned core = cpu_core(&current_cpu_data);
struct core_boot_config *core_cfg = &mips_cps_core_bootcfg[core];
mips_cps_boot_vpes(core_cfg, cpu_vpe_id(&current_cpu_data));
}
-static void cps_boot_secondary(int cpu, struct task_struct *idle)
+static int cps_boot_secondary(int cpu, struct task_struct *idle)
{
- unsigned core = cpu_data[cpu].core;
+ unsigned core = cpu_core(&cpu_data[cpu]);
unsigned vpe_id = cpu_vpe_id(&cpu_data[cpu]);
struct core_boot_config *core_cfg = &mips_cps_core_bootcfg[core];
struct vpe_boot_config *vpe_cfg = &core_cfg->vpe_config[vpe_id];
@@ -301,6 +305,10 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle)
unsigned int remote;
int err;
+ /* We don't yet support booting CPUs in other clusters */
+ if (cpu_cluster(&cpu_data[cpu]) != cpu_cluster(&current_cpu_data))
+ return -ENOSYS;
+
vpe_cfg->pc = (unsigned long)&smp_bootstrap;
vpe_cfg->sp = __KSTK_TOS(idle);
vpe_cfg->gp = (unsigned long)task_thread_info(idle);
@@ -316,16 +324,16 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle)
}
if (cpu_has_vp) {
- mips_cm_lock_other(core, vpe_id);
+ mips_cm_lock_other(0, core, vpe_id, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
core_entry = CKSEG1ADDR((unsigned long)mips_cps_core_entry);
write_gcr_co_reset_base(core_entry);
mips_cm_unlock_other();
}
- if (core != current_cpu_data.core) {
+ if (!cpus_are_siblings(cpu, smp_processor_id())) {
/* Boot a VPE on another powered up core */
for (remote = 0; remote < NR_CPUS; remote++) {
- if (cpu_data[remote].core != core)
+ if (!cpus_are_siblings(cpu, remote))
continue;
if (cpu_online(remote))
break;
@@ -349,6 +357,7 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle)
mips_cps_boot_vpes(core_cfg, vpe_id);
out:
preempt_enable();
+ return 0;
}
static void cps_init_secondary(void)
@@ -358,7 +367,7 @@ static void cps_init_secondary(void)
dmt();
if (mips_cm_revision() >= CM_REV_CM3) {
- unsigned ident = gic_read_local_vp_id();
+ unsigned int ident = read_gic_vl_ident();
/*
* Ensure that our calculation of the VP ID matches up with
@@ -402,7 +411,7 @@ static int cps_cpu_disable(void)
if (!cps_pm_support_state(CPS_PM_POWER_GATED))
return -EINVAL;
- core_cfg = &mips_cps_core_bootcfg[current_cpu_data.core];
+ core_cfg = &mips_cps_core_bootcfg[cpu_core(&current_cpu_data)];
atomic_sub(1 << cpu_vpe_id(&current_cpu_data), &core_cfg->vpe_mask);
smp_mb__after_atomic();
set_cpu_online(cpu, false);
@@ -424,15 +433,17 @@ void play_dead(void)
local_irq_disable();
idle_task_exit();
cpu = smp_processor_id();
- core = cpu_data[cpu].core;
+ core = cpu_core(&cpu_data[cpu]);
cpu_death = CPU_DEATH_POWER;
pr_debug("CPU%d going offline\n", cpu);
if (cpu_has_mipsmt || cpu_has_vp) {
+ core = cpu_core(&cpu_data[cpu]);
+
/* Look for another online VPE within the core */
for_each_online_cpu(cpu_death_sibling) {
- if (cpu_data[cpu_death_sibling].core != core)
+ if (!cpus_are_siblings(cpu, cpu_death_sibling))
continue;
/*
@@ -488,7 +499,7 @@ static void wait_for_sibling_halt(void *ptr_cpu)
static void cps_cpu_die(unsigned int cpu)
{
- unsigned core = cpu_data[cpu].core;
+ unsigned core = cpu_core(&cpu_data[cpu]);
unsigned int vpe_id = cpu_vpe_id(&cpu_data[cpu]);
ktime_t fail_time;
unsigned stat;
@@ -519,10 +530,11 @@ static void cps_cpu_die(unsigned int cpu)
*/
fail_time = ktime_add_ms(ktime_get(), 2000);
do {
- mips_cm_lock_other(core, 0);
+ mips_cm_lock_other(0, core, 0, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
mips_cpc_lock_other(core);
stat = read_cpc_co_stat_conf();
- stat &= CPC_Cx_STAT_CONF_SEQSTATE_MSK;
+ stat &= CPC_Cx_STAT_CONF_SEQSTATE;
+ stat >>= __ffs(CPC_Cx_STAT_CONF_SEQSTATE);
mips_cpc_unlock_other();
mips_cm_unlock_other();
@@ -544,7 +556,7 @@ static void cps_cpu_die(unsigned int cpu)
*/
if (WARN(ktime_after(ktime_get(), fail_time),
"CPU%u hasn't powered down, seq. state %u\n",
- cpu, stat >> CPC_Cx_STAT_CONF_SEQSTATE_SHF))
+ cpu, stat))
break;
} while (1);
@@ -562,7 +574,7 @@ static void cps_cpu_die(unsigned int cpu)
panic("Failed to call remote sibling CPU\n");
} else if (cpu_has_vp) {
do {
- mips_cm_lock_other(core, vpe_id);
+ mips_cm_lock_other(0, core, vpe_id, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
stat = read_cpc_co_vp_running();
mips_cm_unlock_other();
} while (stat & (1 << vpe_id));
@@ -571,7 +583,7 @@ static void cps_cpu_die(unsigned int cpu)
#endif /* CONFIG_HOTPLUG_CPU */
-static struct plat_smp_ops cps_smp_ops = {
+static const struct plat_smp_ops cps_smp_ops = {
.smp_setup = cps_smp_setup,
.prepare_cpus = cps_prepare_cpus,
.boot_secondary = cps_boot_secondary,
@@ -587,7 +599,7 @@ static struct plat_smp_ops cps_smp_ops = {
bool mips_cps_smp_in_use(void)
{
- extern struct plat_smp_ops *mp_ops;
+ extern const struct plat_smp_ops *mp_ops;
return mp_ops == &cps_smp_ops;
}
@@ -599,7 +611,7 @@ int register_cps_smp_ops(void)
}
/* check we have a GIC - we need one for IPIs */
- if (!(read_gcr_gic_status() & CM_GCR_GIC_STATUS_EX_MSK)) {
+ if (!(read_gcr_gic_status() & CM_GCR_GIC_STATUS_EX)) {
pr_warn("MIPS CPS SMP unable to proceed without a GIC\n");
return -ENODEV;
}
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c
index ed6b4df583ea..94ab3276b48c 100644
--- a/arch/mips/kernel/smp-mt.c
+++ b/arch/mips/kernel/smp-mt.c
@@ -21,7 +21,6 @@
#include <linux/sched.h>
#include <linux/cpumask.h>
#include <linux/interrupt.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/compiler.h>
#include <linux/sched/task_stack.h>
#include <linux/smp.h>
@@ -36,6 +35,7 @@
#include <asm/mipsregs.h>
#include <asm/mipsmtregs.h>
#include <asm/mips_mt.h>
+#include <asm/mips-cps.h>
static void __init smvp_copy_vpe_config(void)
{
@@ -83,7 +83,7 @@ static unsigned int __init smvp_vpe_init(unsigned int tc, unsigned int mvpconf0,
if (tc != 0)
smvp_copy_vpe_config();
- cpu_data[ncpu].vpe_id = tc;
+ cpu_set_vpe_id(&cpu_data[ncpu], tc);
return ncpu;
}
@@ -118,14 +118,12 @@ static void __init smvp_tc_init(unsigned int tc, unsigned int mvpconf0)
static void vsmp_init_secondary(void)
{
-#ifdef CONFIG_MIPS_GIC
/* This is Malta specific: IPI,performance and timer interrupts */
- if (gic_present)
+ if (mips_gic_present())
change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 |
STATUSF_IP4 | STATUSF_IP5 |
STATUSF_IP6 | STATUSF_IP7);
else
-#endif
change_c0_status(ST0_IM, STATUSF_IP0 | STATUSF_IP1 |
STATUSF_IP6 | STATUSF_IP7);
}
@@ -152,7 +150,7 @@ static void vsmp_smp_finish(void)
* (unsigned long)idle->thread_info the gp
* assumes a 1:1 mapping of TC => VPE
*/
-static void vsmp_boot_secondary(int cpu, struct task_struct *idle)
+static int vsmp_boot_secondary(int cpu, struct task_struct *idle)
{
struct thread_info *gp = task_thread_info(idle);
dvpe();
@@ -184,6 +182,8 @@ static void vsmp_boot_secondary(int cpu, struct task_struct *idle)
clear_c0_mvpcontrol(MVPCONTROL_VPC);
evpe(EVPE_ENABLE);
+
+ return 0;
}
/*
@@ -239,7 +239,7 @@ static void __init vsmp_prepare_cpus(unsigned int max_cpus)
mips_mt_set_cpuoptions();
}
-struct plat_smp_ops vsmp_smp_ops = {
+const struct plat_smp_ops vsmp_smp_ops = {
.send_ipi_single = mips_smp_send_ipi_single,
.send_ipi_mask = mips_smp_send_ipi_mask,
.init_secondary = vsmp_init_secondary,
diff --git a/arch/mips/kernel/smp-up.c b/arch/mips/kernel/smp-up.c
index 17878d71ef2b..525d3196f793 100644
--- a/arch/mips/kernel/smp-up.c
+++ b/arch/mips/kernel/smp-up.c
@@ -39,8 +39,9 @@ static void up_smp_finish(void)
/*
* Firmware CPU startup hook
*/
-static void up_boot_secondary(int cpu, struct task_struct *idle)
+static int up_boot_secondary(int cpu, struct task_struct *idle)
{
+ return 0;
}
static void __init up_smp_setup(void)
@@ -63,7 +64,7 @@ static void up_cpu_die(unsigned int cpu)
}
#endif
-struct plat_smp_ops up_smp_ops = {
+const struct plat_smp_ops up_smp_ops = {
.send_ipi_single = up_send_ipi_single,
.send_ipi_mask = up_send_ipi_mask,
.init_secondary = up_init_secondary,
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
index c7cbddfcdc3b..bbe19b64def5 100644
--- a/arch/mips/kernel/smp.c
+++ b/arch/mips/kernel/smp.c
@@ -96,8 +96,7 @@ static inline void set_cpu_sibling_map(int cpu)
if (smp_num_siblings > 1) {
for_each_cpu(i, &cpu_sibling_setup_map) {
- if (cpu_data[cpu].package == cpu_data[i].package &&
- cpu_data[cpu].core == cpu_data[i].core) {
+ if (cpus_are_siblings(cpu, i)) {
cpumask_set_cpu(i, &cpu_sibling_map[cpu]);
cpumask_set_cpu(cpu, &cpu_sibling_map[i]);
}
@@ -134,8 +133,7 @@ void calculate_cpu_foreign_map(void)
for_each_online_cpu(i) {
core_present = 0;
for_each_cpu(k, &temp_foreign_map)
- if (cpu_data[i].package == cpu_data[k].package &&
- cpu_data[i].core == cpu_data[k].core)
+ if (cpus_are_siblings(i, k))
core_present = 1;
if (!core_present)
cpumask_set_cpu(i, &temp_foreign_map);
@@ -146,10 +144,10 @@ void calculate_cpu_foreign_map(void)
&temp_foreign_map, &cpu_sibling_map[i]);
}
-struct plat_smp_ops *mp_ops;
+const struct plat_smp_ops *mp_ops;
EXPORT_SYMBOL(mp_ops);
-void register_smp_ops(struct plat_smp_ops *ops)
+void register_smp_ops(const struct plat_smp_ops *ops)
{
if (mp_ops)
printk(KERN_WARNING "Overriding previously set SMP ops\n");
@@ -186,13 +184,13 @@ void mips_smp_send_ipi_mask(const struct cpumask *mask, unsigned int action)
if (mips_cpc_present()) {
for_each_cpu(cpu, mask) {
- core = cpu_data[cpu].core;
-
- if (core == current_cpu_data.core)
+ if (cpus_are_siblings(cpu, smp_processor_id()))
continue;
+ core = cpu_core(&cpu_data[cpu]);
+
while (!cpumask_test_cpu(cpu, &cpu_coherent_mask)) {
- mips_cm_lock_other(core, 0);
+ mips_cm_lock_other_cpu(cpu, CM_GCR_Cx_OTHER_BLOCK_LOCAL);
mips_cpc_lock_other(core);
write_cpc_co_cmd(CPC_Cx_CMD_PWRUP);
mips_cpc_unlock_other();
@@ -441,7 +439,11 @@ void smp_prepare_boot_cpu(void)
int __cpu_up(unsigned int cpu, struct task_struct *tidle)
{
- mp_ops->boot_secondary(cpu, tidle);
+ int err;
+
+ err = mp_ops->boot_secondary(cpu, tidle);
+ if (err)
+ return err;
/*
* We must check for timeout here, as the CPU will not be marked
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index c036157fb891..a6ebc8135112 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -72,20 +72,6 @@ EXPORT_SYMBOL(perf_irq);
unsigned int mips_hpt_frequency;
EXPORT_SYMBOL_GPL(mips_hpt_frequency);
-/*
- * This function exists in order to cause an error due to a duplicate
- * definition if platform code should have its own implementation. The hook
- * to use instead is plat_time_init. plat_time_init does not receive the
- * irqaction pointer argument anymore. This is because any function which
- * initializes an interrupt timer now takes care of its own request_irq rsp.
- * setup_irq calls and each clock_event_device should use its own
- * struct irqrequest.
- */
-void __init plat_timer_setup(void)
-{
- BUG();
-}
-
static __init int cpu_has_mfc0_count_bug(void)
{
switch (current_cpu_type()) {
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index b68b4d0726d3..5669d3b8bd38 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -50,9 +50,8 @@
#include <asm/fpu.h>
#include <asm/fpu_emulator.h>
#include <asm/idle.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/mips-r2-to-r6-emul.h>
-#include <asm/mips-cm.h>
#include <asm/mipsregs.h>
#include <asm/mipsmtregs.h>
#include <asm/module.h>
@@ -734,8 +733,7 @@ void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
si.si_code = FPE_FLTUND;
else if (fcr31 & FPU_CSR_INE_X)
si.si_code = FPE_FLTRES;
- else
- si.si_code = __SI_FAULT;
+
force_sig_info(SIGFPE, &si, tsk);
}
@@ -1673,7 +1671,7 @@ static inline void parity_protection_init(void)
/* Probe L2 ECC support */
gcr_ectl = read_gcr_err_control();
- if (!(gcr_ectl & CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK) ||
+ if (!(gcr_ectl & CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT) ||
!(cp0_ectl & ERRCTL_PE)) {
/*
* One of L1 or L2 ECC checking isn't supported,
@@ -1693,12 +1691,12 @@ static inline void parity_protection_init(void)
/* Configure L2 ECC checking */
if (l2parity)
- gcr_ectl |= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
+ gcr_ectl |= CM_GCR_ERR_CONTROL_L2_ECC_EN;
else
- gcr_ectl &= ~CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
+ gcr_ectl &= ~CM_GCR_ERR_CONTROL_L2_ECC_EN;
write_gcr_err_control(gcr_ectl);
gcr_ectl = read_gcr_err_control();
- gcr_ectl &= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
+ gcr_ectl &= CM_GCR_ERR_CONTROL_L2_ECC_EN;
WARN_ON(!!gcr_ectl != l2parity);
pr_info("Cache parity protection %sabled\n",
@@ -2428,21 +2426,6 @@ void __init trap_init(void)
set_except_vector(EXCCODE_TR, handle_tr);
set_except_vector(EXCCODE_MSAFPE, handle_msa_fpe);
- if (current_cpu_type() == CPU_R6000 ||
- current_cpu_type() == CPU_R6000A) {
- /*
- * The R6000 is the only R-series CPU that features a machine
- * check exception (similar to the R4000 cache error) and
- * unaligned ldc1/sdc1 exception. The handlers have not been
- * written yet. Well, anyway there is no R6000 machine on the
- * current list of targets for Linux/MIPS.
- * (Duh, crap, there is someone with a triple R6k machine)
- */
- //set_except_vector(14, handle_mc);
- //set_except_vector(15, handle_ndc);
- }
-
-
if (board_nmi_handler_setup)
board_nmi_handler_setup();
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c
index 5eaf2578ac04..2d0b912f9e3e 100644
--- a/arch/mips/kernel/unaligned.c
+++ b/arch/mips/kernel/unaligned.c
@@ -1378,7 +1378,7 @@ sigill:
const int reg16to32[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
/* Recode table from 16-bit STORE register notation to 32-bit GPR. */
-const int reg16to32st[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
+static const int reg16to32st[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
static void emulate_load_store_microMIPS(struct pt_regs *regs,
void __user *addr)
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 093517e85a6c..019035d7225c 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -13,13 +13,13 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/ioport.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/timekeeper_internal.h>
#include <asm/abi.h>
+#include <asm/mips-cps.h>
#include <asm/vdso.h>
/* Kernel-provided data used by the VDSO. */
@@ -99,9 +99,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
struct mips_vdso_image *image = current->thread.abi->vdso;
struct mm_struct *mm = current->mm;
- unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr;
+ unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr, gic_pfn;
struct vm_area_struct *vma;
- struct resource gic_res;
int ret;
if (down_write_killable(&mm->mmap_sem))
@@ -125,7 +124,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
* only map a page even though the total area is 64K, as we only need
* the counter registers at the start.
*/
- gic_size = gic_present ? PAGE_SIZE : 0;
+ gic_size = mips_gic_present() ? PAGE_SIZE : 0;
vvar_size = gic_size + PAGE_SIZE;
size = vvar_size + image->size;
@@ -148,13 +147,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
/* Map GIC user page. */
if (gic_size) {
- ret = gic_get_usm_range(&gic_res);
- if (ret)
- goto out;
+ gic_pfn = virt_to_phys(mips_gic_base + MIPS_GIC_USER_OFS) >> PAGE_SHIFT;
- ret = io_remap_pfn_range(vma, base,
- gic_res.start >> PAGE_SHIFT,
- gic_size,
+ ret = io_remap_pfn_range(vma, base, gic_pfn, gic_size,
pgprot_noncached(PAGE_READONLY));
if (ret)
goto out;
diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
index bce2a6431430..d535edc01434 100644
--- a/arch/mips/kvm/mips.c
+++ b/arch/mips/kvm/mips.c
@@ -514,7 +514,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,
dvcpu->arch.wait = 0;
- if (swait_active(&dvcpu->wq))
+ if (swq_has_sleeper(&dvcpu->wq))
swake_up(&dvcpu->wq);
return 0;
@@ -1179,7 +1179,7 @@ static void kvm_mips_comparecount_func(unsigned long data)
kvm_mips_callbacks->queue_timer_int(vcpu);
vcpu->arch.wait = 0;
- if (swait_active(&vcpu->wq))
+ if (swq_has_sleeper(&vcpu->wq))
swake_up(&vcpu->wq);
}
diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig
index 177769dbb0e8..35bc69b78268 100644
--- a/arch/mips/lantiq/Kconfig
+++ b/arch/mips/lantiq/Kconfig
@@ -17,6 +17,8 @@ config SOC_XWAY
bool "XWAY"
select SOC_TYPE_XWAY
select HW_HAS_PCI
+ select MFD_SYSCON
+ select MFD_CORE
config SOC_FALCON
bool "FALCON"
diff --git a/arch/mips/lantiq/falcon/reset.c b/arch/mips/lantiq/falcon/reset.c
index 7a535d72f541..058b85578cf7 100644
--- a/arch/mips/lantiq/falcon/reset.c
+++ b/arch/mips/lantiq/falcon/reset.c
@@ -15,27 +15,14 @@
#include <lantiq_soc.h>
-/* CPU0 Reset Source Register */
-#define SYS1_CPU0RS 0x0040
-/* reset cause mask */
-#define CPU0RS_MASK 0x0003
-/* CPU0 Boot Mode Register */
-#define SYS1_BM 0x00a0
-/* boot mode mask */
-#define BM_MASK 0x0005
-
-/* allow platform code to find out what surce we booted from */
+/*
+ * Dummy implementation. Used to allow platform code to find out what
+ * source was booted from
+ */
unsigned char ltq_boot_select(void)
{
- return ltq_sys1_r32(SYS1_BM) & BM_MASK;
-}
-
-/* allow the watchdog driver to find out what the boot reason was */
-int ltq_reset_cause(void)
-{
- return ltq_sys1_r32(SYS1_CPU0RS) & CPU0RS_MASK;
+ return BS_SPI;
}
-EXPORT_SYMBOL_GPL(ltq_reset_cause);
#define BOOT_REG_BASE (KSEG1 | 0x1F200000)
#define BOOT_PW1_REG (BOOT_REG_BASE | 0x20)
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
index 33728b7af426..f0bc3312ed11 100644
--- a/arch/mips/lantiq/irq.c
+++ b/arch/mips/lantiq/irq.c
@@ -61,10 +61,6 @@
/* we have a cascade of 8 irqs */
#define MIPS_CPU_IRQ_CASCADE 8
-#ifdef CONFIG_MIPS_MT_SMP
-int gic_present;
-#endif
-
static int exin_avail;
static u32 ltq_eiu_irq[MAX_EIU];
static void __iomem *ltq_icu_membase[MAX_IM];
diff --git a/arch/mips/lantiq/prom.c b/arch/mips/lantiq/prom.c
index 96773bed8a8a..9ff7ccde9de0 100644
--- a/arch/mips/lantiq/prom.c
+++ b/arch/mips/lantiq/prom.c
@@ -117,7 +117,7 @@ void __init prom_init(void)
int __init plat_of_setup(void)
{
- return __dt_register_buses(soc_info.compatible, "simple-bus");
+ return of_platform_default_populate(NULL, NULL, NULL);
}
arch_initcall(plat_of_setup);
diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
index a2edc538f477..fbb0747c70b7 100644
--- a/arch/mips/lantiq/xway/Makefile
+++ b/arch/mips/lantiq/xway/Makefile
@@ -1,5 +1,3 @@
-obj-y := prom.o sysctrl.o clk.o reset.o dma.o gptu.o dcdc.o
+obj-y := prom.o sysctrl.o clk.o dma.o gptu.o dcdc.o
obj-y += vmmc.o
-
-obj-$(CONFIG_XRX200_PHY_FW) += xrx200_phy_fw.o
diff --git a/arch/mips/lantiq/xway/reset.c b/arch/mips/lantiq/xway/reset.c
deleted file mode 100644
index 83fd65d76e81..000000000000
--- a/arch/mips/lantiq/xway/reset.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- *
- * Copyright (C) 2010 John Crispin <[email protected]>
- * Copyright (C) 2013-2015 Lantiq Beteiligungs-GmbH & Co.KG
- */
-
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/ioport.h>
-#include <linux/pm.h>
-#include <linux/export.h>
-#include <linux/delay.h>
-#include <linux/of_address.h>
-#include <linux/of_platform.h>
-#include <linux/reset-controller.h>
-
-#include <asm/reboot.h>
-
-#include <lantiq_soc.h>
-
-#include "../prom.h"
-
-/* reset request register */
-#define RCU_RST_REQ 0x0010
-/* reset status register */
-#define RCU_RST_STAT 0x0014
-/* vr9 gphy registers */
-#define RCU_GFS_ADD0_XRX200 0x0020
-#define RCU_GFS_ADD1_XRX200 0x0068
-/* xRX300 gphy registers */
-#define RCU_GFS_ADD0_XRX300 0x0020
-#define RCU_GFS_ADD1_XRX300 0x0058
-#define RCU_GFS_ADD2_XRX300 0x00AC
-/* xRX330 gphy registers */
-#define RCU_GFS_ADD0_XRX330 0x0020
-#define RCU_GFS_ADD1_XRX330 0x0058
-#define RCU_GFS_ADD2_XRX330 0x00AC
-#define RCU_GFS_ADD3_XRX330 0x0264
-
-/* xbar BE flag */
-#define RCU_AHB_ENDIAN 0x004C
-#define RCU_VR9_BE_AHB1S 0x00000008
-
-/* reboot bit */
-#define RCU_RD_GPHY0_XRX200 BIT(31)
-#define RCU_RD_SRST BIT(30)
-#define RCU_RD_GPHY1_XRX200 BIT(29)
-/* xRX300 bits */
-#define RCU_RD_GPHY0_XRX300 BIT(31)
-#define RCU_RD_GPHY1_XRX300 BIT(29)
-#define RCU_RD_GPHY2_XRX300 BIT(28)
-/* xRX330 bits */
-#define RCU_RD_GPHY0_XRX330 BIT(31)
-#define RCU_RD_GPHY1_XRX330 BIT(29)
-#define RCU_RD_GPHY2_XRX330 BIT(28)
-#define RCU_RD_GPHY3_XRX330 BIT(10)
-
-/* reset cause */
-#define RCU_STAT_SHIFT 26
-/* boot selection */
-#define RCU_BOOT_SEL(x) ((x >> 18) & 0x7)
-#define RCU_BOOT_SEL_XRX200(x) (((x >> 17) & 0xf) | ((x >> 8) & 0x10))
-
-/* dwc2 USB configuration registers */
-#define RCU_USB1CFG 0x0018
-#define RCU_USB2CFG 0x0034
-
-/* USB DMA endianness bits */
-#define RCU_USBCFG_HDSEL_BIT BIT(11)
-#define RCU_USBCFG_HOST_END_BIT BIT(10)
-#define RCU_USBCFG_SLV_END_BIT BIT(9)
-
-/* USB reset bits */
-#define RCU_USBRESET 0x0010
-
-#define USBRESET_BIT BIT(4)
-
-#define RCU_USBRESET2 0x0048
-
-#define USB1RESET_BIT BIT(4)
-#define USB2RESET_BIT BIT(5)
-
-#define RCU_CFG1A 0x0038
-#define RCU_CFG1B 0x003C
-
-/* USB PMU devices */
-#define PMU_AHBM BIT(15)
-#define PMU_USB0 BIT(6)
-#define PMU_USB1 BIT(27)
-
-/* USB PHY PMU devices */
-#define PMU_USB0_P BIT(0)
-#define PMU_USB1_P BIT(26)
-
-/* remapped base addr of the reset control unit */
-static void __iomem *ltq_rcu_membase;
-static struct device_node *ltq_rcu_np;
-static DEFINE_SPINLOCK(ltq_rcu_lock);
-
-static void ltq_rcu_w32(uint32_t val, uint32_t reg_off)
-{
- ltq_w32(val, ltq_rcu_membase + reg_off);
-}
-
-static uint32_t ltq_rcu_r32(uint32_t reg_off)
-{
- return ltq_r32(ltq_rcu_membase + reg_off);
-}
-
-static void ltq_rcu_w32_mask(uint32_t clr, uint32_t set, uint32_t reg_off)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&ltq_rcu_lock, flags);
- ltq_rcu_w32((ltq_rcu_r32(reg_off) & ~(clr)) | (set), reg_off);
- spin_unlock_irqrestore(&ltq_rcu_lock, flags);
-}
-
-/* This function is used by the watchdog driver */
-int ltq_reset_cause(void)
-{
- u32 val = ltq_rcu_r32(RCU_RST_STAT);
- return val >> RCU_STAT_SHIFT;
-}
-EXPORT_SYMBOL_GPL(ltq_reset_cause);
-
-/* allow platform code to find out what source we booted from */
-unsigned char ltq_boot_select(void)
-{
- u32 val = ltq_rcu_r32(RCU_RST_STAT);
-
- if (of_device_is_compatible(ltq_rcu_np, "lantiq,rcu-xrx200"))
- return RCU_BOOT_SEL_XRX200(val);
-
- return RCU_BOOT_SEL(val);
-}
-
-struct ltq_gphy_reset {
- u32 rd;
- u32 addr;
-};
-
-/* reset / boot a gphy */
-static struct ltq_gphy_reset xrx200_gphy[] = {
- {RCU_RD_GPHY0_XRX200, RCU_GFS_ADD0_XRX200},
- {RCU_RD_GPHY1_XRX200, RCU_GFS_ADD1_XRX200},
-};
-
-/* reset / boot a gphy */
-static struct ltq_gphy_reset xrx300_gphy[] = {
- {RCU_RD_GPHY0_XRX300, RCU_GFS_ADD0_XRX300},
- {RCU_RD_GPHY1_XRX300, RCU_GFS_ADD1_XRX300},
- {RCU_RD_GPHY2_XRX300, RCU_GFS_ADD2_XRX300},
-};
-
-/* reset / boot a gphy */
-static struct ltq_gphy_reset xrx330_gphy[] = {
- {RCU_RD_GPHY0_XRX330, RCU_GFS_ADD0_XRX330},
- {RCU_RD_GPHY1_XRX330, RCU_GFS_ADD1_XRX330},
- {RCU_RD_GPHY2_XRX330, RCU_GFS_ADD2_XRX330},
- {RCU_RD_GPHY3_XRX330, RCU_GFS_ADD3_XRX330},
-};
-
-static void xrx200_gphy_boot_addr(struct ltq_gphy_reset *phy_regs,
- dma_addr_t dev_addr)
-{
- ltq_rcu_w32_mask(0, phy_regs->rd, RCU_RST_REQ);
- ltq_rcu_w32(dev_addr, phy_regs->addr);
- ltq_rcu_w32_mask(phy_regs->rd, 0, RCU_RST_REQ);
-}
-
-/* reset and boot a gphy. these phys only exist on xrx200 SoC */
-int xrx200_gphy_boot(struct device *dev, unsigned int id, dma_addr_t dev_addr)
-{
- struct clk *clk;
-
- if (!of_device_is_compatible(ltq_rcu_np, "lantiq,rcu-xrx200")) {
- dev_err(dev, "this SoC has no GPHY\n");
- return -EINVAL;
- }
-
- if (of_machine_is_compatible("lantiq,vr9")) {
- clk = clk_get_sys("1f203000.rcu", "gphy");
- if (IS_ERR(clk))
- return PTR_ERR(clk);
- clk_enable(clk);
- }
-
- dev_info(dev, "booting GPHY%u firmware at %X\n", id, dev_addr);
-
- if (of_machine_is_compatible("lantiq,vr9")) {
- if (id >= ARRAY_SIZE(xrx200_gphy)) {
- dev_err(dev, "%u is an invalid gphy id\n", id);
- return -EINVAL;
- }
- xrx200_gphy_boot_addr(&xrx200_gphy[id], dev_addr);
- } else if (of_machine_is_compatible("lantiq,ar10")) {
- if (id >= ARRAY_SIZE(xrx300_gphy)) {
- dev_err(dev, "%u is an invalid gphy id\n", id);
- return -EINVAL;
- }
- xrx200_gphy_boot_addr(&xrx300_gphy[id], dev_addr);
- } else if (of_machine_is_compatible("lantiq,grx390")) {
- if (id >= ARRAY_SIZE(xrx330_gphy)) {
- dev_err(dev, "%u is an invalid gphy id\n", id);
- return -EINVAL;
- }
- xrx200_gphy_boot_addr(&xrx330_gphy[id], dev_addr);
- }
- return 0;
-}
-
-/* reset a io domain for u micro seconds */
-void ltq_reset_once(unsigned int module, ulong u)
-{
- ltq_rcu_w32(ltq_rcu_r32(RCU_RST_REQ) | module, RCU_RST_REQ);
- udelay(u);
- ltq_rcu_w32(ltq_rcu_r32(RCU_RST_REQ) & ~module, RCU_RST_REQ);
-}
-
-static int ltq_assert_device(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- u32 val;
-
- if (id < 8)
- return -1;
-
- val = ltq_rcu_r32(RCU_RST_REQ);
- val |= BIT(id);
- ltq_rcu_w32(val, RCU_RST_REQ);
-
- return 0;
-}
-
-static int ltq_deassert_device(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- u32 val;
-
- if (id < 8)
- return -1;
-
- val = ltq_rcu_r32(RCU_RST_REQ);
- val &= ~BIT(id);
- ltq_rcu_w32(val, RCU_RST_REQ);
-
- return 0;
-}
-
-static int ltq_reset_device(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- ltq_assert_device(rcdev, id);
- return ltq_deassert_device(rcdev, id);
-}
-
-static const struct reset_control_ops reset_ops = {
- .reset = ltq_reset_device,
- .assert = ltq_assert_device,
- .deassert = ltq_deassert_device,
-};
-
-static struct reset_controller_dev reset_dev = {
- .ops = &reset_ops,
- .owner = THIS_MODULE,
- .nr_resets = 32,
- .of_reset_n_cells = 1,
-};
-
-void ltq_rst_init(void)
-{
- reset_dev.of_node = of_find_compatible_node(NULL, NULL,
- "lantiq,xway-reset");
- if (!reset_dev.of_node)
- pr_err("Failed to find reset controller node");
- else
- reset_controller_register(&reset_dev);
-}
-
-static void ltq_machine_restart(char *command)
-{
- u32 val = ltq_rcu_r32(RCU_RST_REQ);
-
- if (of_device_is_compatible(ltq_rcu_np, "lantiq,rcu-xrx200"))
- val |= RCU_RD_GPHY1_XRX200 | RCU_RD_GPHY0_XRX200;
-
- val |= RCU_RD_SRST;
-
- local_irq_disable();
- ltq_rcu_w32(val, RCU_RST_REQ);
- unreachable();
-}
-
-static void ltq_machine_halt(void)
-{
- local_irq_disable();
- unreachable();
-}
-
-static void ltq_machine_power_off(void)
-{
- local_irq_disable();
- unreachable();
-}
-
-static void ltq_usb_init(void)
-{
- /* Power for USB cores 1 & 2 */
- ltq_pmu_enable(PMU_AHBM);
- ltq_pmu_enable(PMU_USB0);
- ltq_pmu_enable(PMU_USB1);
-
- ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1A) | BIT(0), RCU_CFG1A);
- ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1B) | BIT(0), RCU_CFG1B);
-
- /* Enable USB PHY power for cores 1 & 2 */
- ltq_pmu_enable(PMU_USB0_P);
- ltq_pmu_enable(PMU_USB1_P);
-
- /* Configure cores to host mode */
- ltq_rcu_w32(ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_HDSEL_BIT,
- RCU_USB1CFG);
- ltq_rcu_w32(ltq_rcu_r32(RCU_USB2CFG) & ~RCU_USBCFG_HDSEL_BIT,
- RCU_USB2CFG);
-
- /* Select DMA endianness (Host-endian: big-endian) */
- ltq_rcu_w32((ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_SLV_END_BIT)
- | RCU_USBCFG_HOST_END_BIT, RCU_USB1CFG);
- ltq_rcu_w32(ltq_rcu_r32((RCU_USB2CFG) & ~RCU_USBCFG_SLV_END_BIT)
- | RCU_USBCFG_HOST_END_BIT, RCU_USB2CFG);
-
- /* Hard reset USB state machines */
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) | USBRESET_BIT, RCU_USBRESET);
- udelay(50 * 1000);
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) & ~USBRESET_BIT, RCU_USBRESET);
-
- /* Soft reset USB state machines */
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
- | USB1RESET_BIT | USB2RESET_BIT, RCU_USBRESET2);
- udelay(50 * 1000);
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
- & ~(USB1RESET_BIT | USB2RESET_BIT), RCU_USBRESET2);
-}
-
-static int __init mips_reboot_setup(void)
-{
- struct resource res;
-
- ltq_rcu_np = of_find_compatible_node(NULL, NULL, "lantiq,rcu-xway");
- if (!ltq_rcu_np)
- ltq_rcu_np = of_find_compatible_node(NULL, NULL,
- "lantiq,rcu-xrx200");
-
- /* check if all the reset register range is available */
- if (!ltq_rcu_np)
- panic("Failed to load reset resources from devicetree");
-
- if (of_address_to_resource(ltq_rcu_np, 0, &res))
- panic("Failed to get rcu memory range");
-
- if (!request_mem_region(res.start, resource_size(&res), res.name))
- pr_err("Failed to request rcu memory");
-
- ltq_rcu_membase = ioremap_nocache(res.start, resource_size(&res));
- if (!ltq_rcu_membase)
- panic("Failed to remap core memory");
-
- if (of_machine_is_compatible("lantiq,ar9") ||
- of_machine_is_compatible("lantiq,vr9"))
- ltq_usb_init();
-
- if (of_machine_is_compatible("lantiq,vr9"))
- ltq_rcu_w32(ltq_rcu_r32(RCU_AHB_ENDIAN) | RCU_VR9_BE_AHB1S,
- RCU_AHB_ENDIAN);
-
- _machine_restart = ltq_machine_restart;
- _machine_halt = ltq_machine_halt;
- pm_power_off = ltq_machine_power_off;
-
- return 0;
-}
-
-arch_initcall(mips_reboot_setup);
diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
index 95bec460b651..7611c3013793 100644
--- a/arch/mips/lantiq/xway/sysctrl.c
+++ b/arch/mips/lantiq/xway/sysctrl.c
@@ -145,15 +145,7 @@ static u32 pmu_clk_cr_b[] = {
#define pmu_w32(x, y) ltq_w32((x), pmu_membase + (y))
#define pmu_r32(x) ltq_r32(pmu_membase + (x))
-#define XBAR_ALWAYS_LAST 0x430
-#define XBAR_FPI_BURST_EN BIT(1)
-#define XBAR_AHB_BURST_EN BIT(2)
-
-#define xbar_w32(x, y) ltq_w32((x), ltq_xbar_membase + (y))
-#define xbar_r32(x) ltq_r32(ltq_xbar_membase + (x))
-
static void __iomem *pmu_membase;
-static void __iomem *ltq_xbar_membase;
void __iomem *ltq_cgu_membase;
void __iomem *ltq_ebu_membase;
@@ -293,16 +285,6 @@ static void pci_ext_disable(struct clk *clk)
ltq_cgu_w32((1 << 31) | (1 << 30), pcicr);
}
-static void xbar_fpi_burst_disable(void)
-{
- u32 reg;
-
- /* bit 1 as 1 --burst; bit 1 as 0 -- single */
- reg = xbar_r32(XBAR_ALWAYS_LAST);
- reg &= ~XBAR_FPI_BURST_EN;
- xbar_w32(reg, XBAR_ALWAYS_LAST);
-}
-
/* enable a clockout source */
static int clkout_enable(struct clk *clk)
{
@@ -459,26 +441,6 @@ void __init ltq_soc_init(void)
if (!pmu_membase || !ltq_cgu_membase || !ltq_ebu_membase)
panic("Failed to remap core resources");
- if (of_machine_is_compatible("lantiq,vr9")) {
- struct resource res_xbar;
- struct device_node *np_xbar =
- of_find_compatible_node(NULL, NULL,
- "lantiq,xbar-xway");
-
- if (!np_xbar)
- panic("Failed to load xbar nodes from devicetree");
- if (of_address_to_resource(np_xbar, 0, &res_xbar))
- panic("Failed to get xbar resources");
- if (!request_mem_region(res_xbar.start, resource_size(&res_xbar),
- res_xbar.name))
- panic("Failed to get xbar resources");
-
- ltq_xbar_membase = ioremap_nocache(res_xbar.start,
- resource_size(&res_xbar));
- if (!ltq_xbar_membase)
- panic("Failed to remap xbar resources");
- }
-
/* make sure to unprotect the memory region where flash is located */
ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
@@ -507,8 +469,8 @@ void __init ltq_soc_init(void)
if (of_machine_is_compatible("lantiq,grx390") ||
of_machine_is_compatible("lantiq,ar10")) {
- clkdev_add_pmu("1e101000.usb", "phy", 1, 2, PMU_ANALOG_USB0_P);
- clkdev_add_pmu("1e106000.usb", "phy", 1, 2, PMU_ANALOG_USB1_P);
+ clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 2, PMU_ANALOG_USB0_P);
+ clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 2, PMU_ANALOG_USB1_P);
/* rc 0 */
clkdev_add_pmu("1d900000.pcie", "phy", 1, 2, PMU_ANALOG_PCIE0_P);
clkdev_add_pmu("1d900000.pcie", "msi", 1, 1, PMU1_PCIE_MSI);
@@ -528,8 +490,8 @@ void __init ltq_soc_init(void)
else
clkdev_add_static(CLOCK_133M, CLOCK_133M,
CLOCK_133M, CLOCK_133M);
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
- clkdev_add_pmu("1e101000.usb", "phy", 1, 0, PMU_USB0_P);
+ clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0);
+ clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P);
clkdev_add_pmu("1e180000.etop", "ppe", 1, 0, PMU_PPE);
clkdev_add_cgu("1e180000.etop", "ephycgu", CGU_EPHY);
clkdev_add_pmu("1e180000.etop", "ephy", 1, 0, PMU_EPHY);
@@ -538,8 +500,8 @@ void __init ltq_soc_init(void)
} else if (of_machine_is_compatible("lantiq,grx390")) {
clkdev_add_static(ltq_grx390_cpu_hz(), ltq_grx390_fpi_hz(),
ltq_grx390_fpi_hz(), ltq_grx390_pp32_hz());
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
- clkdev_add_pmu("1e106000.usb", "ctl", 1, 0, PMU_USB1);
+ clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0);
+ clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1);
/* rc 2 */
clkdev_add_pmu("1a800000.pcie", "phy", 1, 2, PMU_ANALOG_PCIE2_P);
clkdev_add_pmu("1a800000.pcie", "msi", 1, 1, PMU1_PCIE2_MSI);
@@ -551,22 +513,23 @@ void __init ltq_soc_init(void)
} else if (of_machine_is_compatible("lantiq,ar10")) {
clkdev_add_static(ltq_ar10_cpu_hz(), ltq_ar10_fpi_hz(),
ltq_ar10_fpi_hz(), ltq_ar10_pp32_hz());
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
- clkdev_add_pmu("1e106000.usb", "ctl", 1, 0, PMU_USB1);
+ clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0);
+ clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1);
clkdev_add_pmu("1e108000.eth", NULL, 0, 0, PMU_SWITCH |
PMU_PPE_DP | PMU_PPE_TC);
clkdev_add_pmu("1da00000.usif", "NULL", 1, 0, PMU_USIF);
- clkdev_add_pmu("1f203000.rcu", "gphy", 1, 0, PMU_GPHY);
+ clkdev_add_pmu("1f203020.gphy", NULL, 1, 0, PMU_GPHY);
+ clkdev_add_pmu("1f203068.gphy", NULL, 1, 0, PMU_GPHY);
clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
clkdev_add_pmu("1e116000.mei", "afe", 1, 2, PMU_ANALOG_DSL_AFE);
clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
} else if (of_machine_is_compatible("lantiq,vr9")) {
clkdev_add_static(ltq_vr9_cpu_hz(), ltq_vr9_fpi_hz(),
ltq_vr9_fpi_hz(), ltq_vr9_pp32_hz());
- clkdev_add_pmu("1e101000.usb", "phy", 1, 0, PMU_USB0_P);
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0 | PMU_AHBM);
- clkdev_add_pmu("1e106000.usb", "phy", 1, 0, PMU_USB1_P);
- clkdev_add_pmu("1e106000.usb", "ctl", 1, 0, PMU_USB1 | PMU_AHBM);
+ clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P);
+ clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | PMU_AHBM);
+ clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P);
+ clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1 | PMU_AHBM);
clkdev_add_pmu("1d900000.pcie", "phy", 1, 1, PMU1_PCIE_PHY);
clkdev_add_pmu("1d900000.pcie", "bus", 1, 0, PMU_PCIE_CLK);
clkdev_add_pmu("1d900000.pcie", "msi", 1, 1, PMU1_PCIE_MSI);
@@ -579,17 +542,18 @@ void __init ltq_soc_init(void)
PMU_SWITCH | PMU_PPE_DPLUS | PMU_PPE_DPLUM |
PMU_PPE_EMA | PMU_PPE_TC | PMU_PPE_SLL01 |
PMU_PPE_QSB | PMU_PPE_TOP);
- clkdev_add_pmu("1f203000.rcu", "gphy", 0, 0, PMU_GPHY);
+ clkdev_add_pmu("1f203020.gphy", NULL, 0, 0, PMU_GPHY);
+ clkdev_add_pmu("1f203068.gphy", NULL, 0, 0, PMU_GPHY);
clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO);
clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
} else if (of_machine_is_compatible("lantiq,ar9")) {
clkdev_add_static(ltq_ar9_cpu_hz(), ltq_ar9_fpi_hz(),
ltq_ar9_fpi_hz(), CLOCK_250M);
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
- clkdev_add_pmu("1e101000.usb", "phy", 1, 0, PMU_USB0_P);
- clkdev_add_pmu("1e106000.usb", "ctl", 1, 0, PMU_USB1);
- clkdev_add_pmu("1e106000.usb", "phy", 1, 0, PMU_USB1_P);
+ clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P);
+ clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0);
+ clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P);
+ clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1);
clkdev_add_pmu("1e180000.etop", "switch", 1, 0, PMU_SWITCH);
clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO);
clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
@@ -598,14 +562,11 @@ void __init ltq_soc_init(void)
} else {
clkdev_add_static(ltq_danube_cpu_hz(), ltq_danube_fpi_hz(),
ltq_danube_fpi_hz(), ltq_danube_pp32_hz());
- clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
- clkdev_add_pmu("1e101000.usb", "phy", 1, 0, PMU_USB0_P);
+ clkdev_add_pmu("1f203018.usb2-phy", "ctrl", 1, 0, PMU_USB0);
+ clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P);
clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO);
clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
clkdev_add_pmu("1e100400.serial", NULL, 1, 0, PMU_ASC0);
}
-
- if (of_machine_is_compatible("lantiq,vr9"))
- xbar_fpi_burst_disable();
}
diff --git a/arch/mips/lantiq/xway/xrx200_phy_fw.c b/arch/mips/lantiq/xway/xrx200_phy_fw.c
deleted file mode 100644
index f0a0f2d431b2..000000000000
--- a/arch/mips/lantiq/xway/xrx200_phy_fw.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Lantiq XRX200 PHY Firmware Loader
- * Author: John Crispin
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- *
- * Copyright (C) 2012 John Crispin <[email protected]>
- */
-
-#include <linux/delay.h>
-#include <linux/dma-mapping.h>
-#include <linux/firmware.h>
-#include <linux/of_platform.h>
-
-#include <lantiq_soc.h>
-
-#define XRX200_GPHY_FW_ALIGN (16 * 1024)
-
-static dma_addr_t xway_gphy_load(struct platform_device *pdev)
-{
- const struct firmware *fw;
- dma_addr_t dev_addr = 0;
- const char *fw_name;
- void *fw_addr;
- size_t size;
-
- if (of_get_property(pdev->dev.of_node, "firmware1", NULL) ||
- of_get_property(pdev->dev.of_node, "firmware2", NULL)) {
- switch (ltq_soc_type()) {
- case SOC_TYPE_VR9:
- if (of_property_read_string(pdev->dev.of_node,
- "firmware1", &fw_name)) {
- dev_err(&pdev->dev,
- "failed to load firmware filename\n");
- return 0;
- }
- break;
- case SOC_TYPE_VR9_2:
- if (of_property_read_string(pdev->dev.of_node,
- "firmware2", &fw_name)) {
- dev_err(&pdev->dev,
- "failed to load firmware filename\n");
- return 0;
- }
- break;
- }
- } else if (of_property_read_string(pdev->dev.of_node,
- "firmware", &fw_name)) {
- dev_err(&pdev->dev, "failed to load firmware filename\n");
- return 0;
- }
-
- dev_info(&pdev->dev, "requesting %s\n", fw_name);
- if (request_firmware(&fw, fw_name, &pdev->dev)) {
- dev_err(&pdev->dev, "failed to load firmware: %s\n", fw_name);
- return 0;
- }
-
- /*
- * GPHY cores need the firmware code in a persistent and contiguous
- * memory area with a 16 kB boundary aligned start address
- */
- size = fw->size + XRX200_GPHY_FW_ALIGN;
-
- fw_addr = dma_alloc_coherent(&pdev->dev, size, &dev_addr, GFP_KERNEL);
- if (fw_addr) {
- fw_addr = PTR_ALIGN(fw_addr, XRX200_GPHY_FW_ALIGN);
- dev_addr = ALIGN(dev_addr, XRX200_GPHY_FW_ALIGN);
- memcpy(fw_addr, fw->data, fw->size);
- } else {
- dev_err(&pdev->dev, "failed to alloc firmware memory\n");
- }
-
- release_firmware(fw);
- return dev_addr;
-}
-
-static int xway_phy_fw_probe(struct platform_device *pdev)
-{
- dma_addr_t fw_addr;
- struct property *pp;
- unsigned char *phyids;
- int i, ret = 0;
-
- fw_addr = xway_gphy_load(pdev);
- if (!fw_addr)
- return -EINVAL;
- pp = of_find_property(pdev->dev.of_node, "phys", NULL);
- if (!pp)
- return -ENOENT;
- phyids = pp->value;
- for (i = 0; i < pp->length && !ret; i++)
- ret = xrx200_gphy_boot(&pdev->dev, phyids[i], fw_addr);
- if (!ret)
- mdelay(100);
- return ret;
-}
-
-static const struct of_device_id xway_phy_match[] = {
- { .compatible = "lantiq,phy-xrx200" },
- {},
-};
-
-static struct platform_driver xway_phy_driver = {
- .probe = xway_phy_fw_probe,
- .driver = {
- .name = "phy-xrx200",
- .of_match_table = xway_phy_match,
- },
-};
-builtin_platform_driver(xway_phy_driver);
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile
index a37fe3d1ee2f..6ab430d24575 100644
--- a/arch/mips/lib/Makefile
+++ b/arch/mips/lib/Makefile
@@ -6,7 +6,7 @@ lib-y += bitops.o csum_partial.o delay.o memcpy.o memset.o \
mips-atomic.o strncpy_user.o \
strnlen_user.o uncached.o
-obj-y += iomap.o
+obj-y += iomap.o iomap_copy.o
obj-$(CONFIG_PCI) += iomap-pci.o
lib-$(CONFIG_GENERIC_CSUM) := $(filter-out csum_partial.o, $(lib-y))
diff --git a/arch/mips/lib/delay.c b/arch/mips/lib/delay.c
index 2307a3cb2714..68c495ed71e3 100644
--- a/arch/mips/lib/delay.c
+++ b/arch/mips/lib/delay.c
@@ -8,6 +8,7 @@
* Copyright (C) 1999, 2000 Silicon Graphics, Inc.
* Copyright (C) 2007, 2014 Maciej W. Rozycki
*/
+#include <linux/delay.h>
#include <linux/export.h>
#include <linux/param.h>
#include <linux/smp.h>
diff --git a/arch/mips/lib/iomap_copy.c b/arch/mips/lib/iomap_copy.c
new file mode 100644
index 000000000000..368bb38267c5
--- /dev/null
+++ b/arch/mips/lib/iomap_copy.c
@@ -0,0 +1,42 @@
+/*
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/export.h>
+#include <linux/io.h>
+
+/**
+ * __ioread64_copy - copy data from MMIO space, in 64-bit units
+ * @to: destination (must be 64-bit aligned)
+ * @from: source, in MMIO space (must be 64-bit aligned)
+ * @count: number of 64-bit quantities to copy
+ *
+ * Copy data from MMIO space to kernel space, in units of 32 or 64 bits at a
+ * time. Order of access is not guaranteed, nor is a memory barrier
+ * performed afterwards.
+ */
+void __ioread64_copy(void *to, const void __iomem *from, size_t count)
+{
+#ifdef CONFIG_64BIT
+ u64 *dst = to;
+ const u64 __iomem *src = from;
+ const u64 __iomem *end = src + count;
+
+ while (src < end)
+ *dst++ = __raw_readq(src++);
+#else
+ __ioread32_copy(to, from, count * 2);
+#endif
+}
+EXPORT_SYMBOL_GPL(__ioread64_copy);
diff --git a/arch/mips/loongson64/lemote-2f/clock.c b/arch/mips/loongson64/lemote-2f/clock.c
index a78fb657068c..8281334df9c8 100644
--- a/arch/mips/loongson64/lemote-2f/clock.c
+++ b/arch/mips/loongson64/lemote-2f/clock.c
@@ -80,6 +80,9 @@ EXPORT_SYMBOL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
+ if (!clk)
+ return 0;
+
return (unsigned long)clk->rate;
}
EXPORT_SYMBOL(clk_get_rate);
diff --git a/arch/mips/loongson64/loongson-3/smp.c b/arch/mips/loongson64/loongson-3/smp.c
index b7a355c3c408..8501109bb0f0 100644
--- a/arch/mips/loongson64/loongson-3/smp.c
+++ b/arch/mips/loongson64/loongson-3/smp.c
@@ -319,8 +319,8 @@ static void loongson3_init_secondary(void)
loongson3_ipi_write32(0xffffffff, ipi_en0_regs[cpu_logical_map(i)]);
per_cpu(cpu_state, cpu) = CPU_ONLINE;
- cpu_data[cpu].core =
- cpu_logical_map(cpu) % loongson_sysconf.cores_per_package;
+ cpu_set_core(&cpu_data[cpu],
+ cpu_logical_map(cpu) % loongson_sysconf.cores_per_package);
cpu_data[cpu].package =
cpu_logical_map(cpu) / loongson_sysconf.cores_per_package;
@@ -386,7 +386,8 @@ static void __init loongson3_smp_setup(void)
ipi_status0_regs_init();
ipi_en0_regs_init();
ipi_mailbox_buf_init();
- cpu_data[0].core = cpu_logical_map(0) % loongson_sysconf.cores_per_package;
+ cpu_set_core(&cpu_data[0],
+ cpu_logical_map(0) % loongson_sysconf.cores_per_package);
cpu_data[0].package = cpu_logical_map(0) / loongson_sysconf.cores_per_package;
}
@@ -399,7 +400,7 @@ static void __init loongson3_prepare_cpus(unsigned int max_cpus)
/*
* Setup the PC, SP, and GP of a secondary processor and start it runing!
*/
-static void loongson3_boot_secondary(int cpu, struct task_struct *idle)
+static int loongson3_boot_secondary(int cpu, struct task_struct *idle)
{
unsigned long startargs[4];
@@ -422,6 +423,7 @@ static void loongson3_boot_secondary(int cpu, struct task_struct *idle)
(void *)(ipi_mailbox_buf[cpu_logical_map(cpu)]+0x8));
loongson3_ipi_write64(startargs[0],
(void *)(ipi_mailbox_buf[cpu_logical_map(cpu)]+0x0));
+ return 0;
}
#ifdef CONFIG_HOTPLUG_CPU
@@ -697,7 +699,7 @@ void play_dead(void)
static int loongson3_disable_clock(unsigned int cpu)
{
- uint64_t core_id = cpu_data[cpu].core;
+ uint64_t core_id = cpu_core(&cpu_data[cpu]);
uint64_t package_id = cpu_data[cpu].package;
if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) {
@@ -711,7 +713,7 @@ static int loongson3_disable_clock(unsigned int cpu)
static int loongson3_enable_clock(unsigned int cpu)
{
- uint64_t core_id = cpu_data[cpu].core;
+ uint64_t core_id = cpu_core(&cpu_data[cpu]);
uint64_t package_id = cpu_data[cpu].package;
if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) {
@@ -734,7 +736,7 @@ early_initcall(register_loongson3_notifier);
#endif
-struct plat_smp_ops loongson3_smp_ops = {
+const struct plat_smp_ops loongson3_smp_ops = {
.send_ipi_single = loongson3_send_ipi_single,
.send_ipi_mask = loongson3_send_ipi_mask,
.init_secondary = loongson3_init_secondary,
diff --git a/arch/mips/math-emu/Makefile b/arch/mips/math-emu/Makefile
index e9bbc2a6526f..e9f10b88b695 100644
--- a/arch/mips/math-emu/Makefile
+++ b/arch/mips/math-emu/Makefile
@@ -4,9 +4,11 @@
obj-y += cp1emu.o ieee754dp.o ieee754sp.o ieee754.o \
dp_div.o dp_mul.o dp_sub.o dp_add.o dp_fsp.o dp_cmp.o dp_simple.o \
- dp_tint.o dp_fint.o dp_maddf.o dp_2008class.o dp_fmin.o dp_fmax.o \
+ dp_tint.o dp_fint.o dp_rint.o dp_maddf.o dp_2008class.o dp_fmin.o \
+ dp_fmax.o \
sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_simple.o \
- sp_tint.o sp_fint.o sp_maddf.o sp_2008class.o sp_fmin.o sp_fmax.o \
+ sp_tint.o sp_fint.o sp_rint.o sp_maddf.o sp_2008class.o sp_fmin.o \
+ sp_fmax.o \
dsemul.o
lib-y += ieee754d.o \
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
index f08a7b4facb9..192542dbd972 100644
--- a/arch/mips/math-emu/cp1emu.c
+++ b/arch/mips/math-emu/cp1emu.c
@@ -58,7 +58,7 @@ static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
mips_instruction);
static int fpux_emu(struct pt_regs *,
- struct mips_fpu_struct *, mips_instruction, void *__user *);
+ struct mips_fpu_struct *, mips_instruction, void __user **);
/* Control registers */
@@ -830,12 +830,12 @@ do { \
} while (0)
#define DIFROMREG(di, x) \
- ((di) = get_fpr64(&ctx->fpr[(x) & ~(cop1_64bit(xcp) == 0)], 0))
+ ((di) = get_fpr64(&ctx->fpr[(x) & ~(cop1_64bit(xcp) ^ 1)], 0))
#define DITOREG(di, x) \
do { \
unsigned fpr, i; \
- fpr = (x) & ~(cop1_64bit(xcp) == 0); \
+ fpr = (x) & ~(cop1_64bit(xcp) ^ 1); \
set_fpr64(&ctx->fpr[fpr], 0, di); \
for (i = 1; i < ARRAY_SIZE(ctx->fpr[x].val64); i++) \
set_fpr64(&ctx->fpr[fpr], i, 0); \
@@ -973,7 +973,7 @@ static inline void cop1_ctc(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
*/
static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
- struct mm_decoded_insn dec_insn, void *__user *fault_addr)
+ struct mm_decoded_insn dec_insn, void __user **fault_addr)
{
unsigned long contpc = xcp->cp0_epc + dec_insn.pc_inc;
unsigned int cond, cbit, bit0;
@@ -1195,9 +1195,11 @@ emul:
bit0 = get_fpr32(fpr, 0) & 0x1;
switch (MIPSInst_RS(ir)) {
case bc1eqz_op:
+ MIPS_FPU_EMU_INC_STATS(bc1eqz);
cond = bit0 == 0;
break;
case bc1nez_op:
+ MIPS_FPU_EMU_INC_STATS(bc1nez);
cond = bit0 != 0;
break;
}
@@ -1230,6 +1232,7 @@ emul:
break;
}
branch_common:
+ MIPS_FPU_EMU_INC_STATS(branches);
set_delay_slot(xcp);
if (cond) {
/*
@@ -1460,7 +1463,7 @@ DEF3OP(nmadd, dp, ieee754dp_mul, ieee754dp_add, ieee754dp_neg);
DEF3OP(nmsub, dp, ieee754dp_mul, ieee754dp_sub, ieee754dp_neg);
static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
- mips_instruction ir, void *__user *fault_addr)
+ mips_instruction ir, void __user **fault_addr)
{
unsigned rcsr = 0; /* resulting csr */
@@ -1682,15 +1685,19 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
switch (MIPSInst_FUNC(ir)) {
/* binary ops */
case fadd_op:
+ MIPS_FPU_EMU_INC_STATS(add_s);
handler.b = ieee754sp_add;
goto scopbop;
case fsub_op:
+ MIPS_FPU_EMU_INC_STATS(sub_s);
handler.b = ieee754sp_sub;
goto scopbop;
case fmul_op:
+ MIPS_FPU_EMU_INC_STATS(mul_s);
handler.b = ieee754sp_mul;
goto scopbop;
case fdiv_op:
+ MIPS_FPU_EMU_INC_STATS(div_s);
handler.b = ieee754sp_div;
goto scopbop;
@@ -1699,6 +1706,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_2_3_4_5_r)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(sqrt_s);
handler.u = ieee754sp_sqrt;
goto scopuop;
@@ -1711,6 +1719,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(rsqrt_s);
handler.u = fpemu_sp_rsqrt;
goto scopuop;
@@ -1718,6 +1727,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(recip_s);
handler.u = fpemu_sp_recip;
goto scopuop;
@@ -1754,6 +1764,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(seleqz_s);
SPFROMREG(rv.s, MIPSInst_FT(ir));
if (rv.w & 0x1)
rv.w = 0;
@@ -1765,6 +1776,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(selnez_s);
SPFROMREG(rv.s, MIPSInst_FT(ir));
if (rv.w & 0x1)
SPFROMREG(rv.s, MIPSInst_FS(ir));
@@ -1778,6 +1790,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(maddf_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
SPFROMREG(fd, MIPSInst_FD(ir));
@@ -1791,6 +1804,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(msubf_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
SPFROMREG(fd, MIPSInst_FD(ir));
@@ -1804,9 +1818,9 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(rint_s);
SPFROMREG(fs, MIPSInst_FS(ir));
- rv.l = ieee754sp_tlong(fs);
- rv.s = ieee754sp_flong(rv.l);
+ rv.s = ieee754sp_rint(fs);
goto copcsr;
}
@@ -1816,6 +1830,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(class_s);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.w = ieee754sp_2008class(fs);
rfmt = w_fmt;
@@ -1828,6 +1843,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(min_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fmin(fs, ft);
@@ -1840,6 +1856,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(mina_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fmina(fs, ft);
@@ -1852,6 +1869,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(max_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fmax(fs, ft);
@@ -1864,6 +1882,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(maxa_s);
SPFROMREG(ft, MIPSInst_FT(ir));
SPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fmaxa(fs, ft);
@@ -1871,15 +1890,18 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
}
case fabs_op:
+ MIPS_FPU_EMU_INC_STATS(abs_s);
handler.u = ieee754sp_abs;
goto scopuop;
case fneg_op:
+ MIPS_FPU_EMU_INC_STATS(neg_s);
handler.u = ieee754sp_neg;
goto scopuop;
case fmov_op:
/* an easy one */
+ MIPS_FPU_EMU_INC_STATS(mov_s);
SPFROMREG(rv.s, MIPSInst_FS(ir));
goto copcsr;
@@ -1922,12 +1944,14 @@ copcsr:
return SIGILL; /* not defined */
case fcvtd_op:
+ MIPS_FPU_EMU_INC_STATS(cvt_d_s);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fsp(fs);
rfmt = d_fmt;
goto copcsr;
case fcvtw_op:
+ MIPS_FPU_EMU_INC_STATS(cvt_w_s);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.w = ieee754sp_tint(fs);
rfmt = w_fmt;
@@ -1940,6 +1964,15 @@ copcsr:
if (!cpu_has_mips_2_3_4_5_r)
return SIGILL;
+ if (MIPSInst_FUNC(ir) == fceil_op)
+ MIPS_FPU_EMU_INC_STATS(ceil_w_s);
+ if (MIPSInst_FUNC(ir) == ffloor_op)
+ MIPS_FPU_EMU_INC_STATS(floor_w_s);
+ if (MIPSInst_FUNC(ir) == fround_op)
+ MIPS_FPU_EMU_INC_STATS(round_w_s);
+ if (MIPSInst_FUNC(ir) == ftrunc_op)
+ MIPS_FPU_EMU_INC_STATS(trunc_w_s);
+
oldrm = ieee754_csr.rm;
SPFROMREG(fs, MIPSInst_FS(ir));
ieee754_csr.rm = MIPSInst_FUNC(ir);
@@ -1952,6 +1985,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(sel_s);
SPFROMREG(fd, MIPSInst_FD(ir));
if (fd.bits & 0x1)
SPFROMREG(rv.s, MIPSInst_FT(ir));
@@ -1963,6 +1997,7 @@ copcsr:
if (!cpu_has_mips_3_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(cvt_l_s);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.l = ieee754sp_tlong(fs);
rfmt = l_fmt;
@@ -1975,6 +2010,15 @@ copcsr:
if (!cpu_has_mips_3_4_5_64_r2_r6)
return SIGILL;
+ if (MIPSInst_FUNC(ir) == fceill_op)
+ MIPS_FPU_EMU_INC_STATS(ceil_l_s);
+ if (MIPSInst_FUNC(ir) == ffloorl_op)
+ MIPS_FPU_EMU_INC_STATS(floor_l_s);
+ if (MIPSInst_FUNC(ir) == froundl_op)
+ MIPS_FPU_EMU_INC_STATS(round_l_s);
+ if (MIPSInst_FUNC(ir) == ftruncl_op)
+ MIPS_FPU_EMU_INC_STATS(trunc_l_s);
+
oldrm = ieee754_csr.rm;
SPFROMREG(fs, MIPSInst_FS(ir));
ieee754_csr.rm = MIPSInst_FUNC(ir);
@@ -2016,15 +2060,19 @@ copcsr:
switch (MIPSInst_FUNC(ir)) {
/* binary ops */
case fadd_op:
+ MIPS_FPU_EMU_INC_STATS(add_d);
handler.b = ieee754dp_add;
goto dcopbop;
case fsub_op:
+ MIPS_FPU_EMU_INC_STATS(sub_d);
handler.b = ieee754dp_sub;
goto dcopbop;
case fmul_op:
+ MIPS_FPU_EMU_INC_STATS(mul_d);
handler.b = ieee754dp_mul;
goto dcopbop;
case fdiv_op:
+ MIPS_FPU_EMU_INC_STATS(div_d);
handler.b = ieee754dp_div;
goto dcopbop;
@@ -2033,6 +2081,7 @@ copcsr:
if (!cpu_has_mips_2_3_4_5_r)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(sqrt_d);
handler.u = ieee754dp_sqrt;
goto dcopuop;
/*
@@ -2044,12 +2093,14 @@ copcsr:
if (!cpu_has_mips_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(rsqrt_d);
handler.u = fpemu_dp_rsqrt;
goto dcopuop;
case frecip_op:
if (!cpu_has_mips_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(recip_d);
handler.u = fpemu_dp_recip;
goto dcopuop;
case fmovc_op:
@@ -2083,6 +2134,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(seleqz_d);
DPFROMREG(rv.d, MIPSInst_FT(ir));
if (rv.l & 0x1)
rv.l = 0;
@@ -2094,6 +2146,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(selnez_d);
DPFROMREG(rv.d, MIPSInst_FT(ir));
if (rv.l & 0x1)
DPFROMREG(rv.d, MIPSInst_FS(ir));
@@ -2107,6 +2160,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(maddf_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
DPFROMREG(fd, MIPSInst_FD(ir));
@@ -2120,6 +2174,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(msubf_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
DPFROMREG(fd, MIPSInst_FD(ir));
@@ -2133,9 +2188,9 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(rint_d);
DPFROMREG(fs, MIPSInst_FS(ir));
- rv.l = ieee754dp_tlong(fs);
- rv.d = ieee754dp_flong(rv.l);
+ rv.d = ieee754dp_rint(fs);
goto copcsr;
}
@@ -2145,9 +2200,10 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(class_d);
DPFROMREG(fs, MIPSInst_FS(ir));
- rv.w = ieee754dp_2008class(fs);
- rfmt = w_fmt;
+ rv.l = ieee754dp_2008class(fs);
+ rfmt = l_fmt;
break;
}
@@ -2157,6 +2213,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(min_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fmin(fs, ft);
@@ -2169,6 +2226,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(mina_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fmina(fs, ft);
@@ -2181,6 +2239,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(max_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fmax(fs, ft);
@@ -2193,6 +2252,7 @@ copcsr:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(maxa_d);
DPFROMREG(ft, MIPSInst_FT(ir));
DPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fmaxa(fs, ft);
@@ -2200,15 +2260,18 @@ copcsr:
}
case fabs_op:
+ MIPS_FPU_EMU_INC_STATS(abs_d);
handler.u = ieee754dp_abs;
goto dcopuop;
case fneg_op:
+ MIPS_FPU_EMU_INC_STATS(neg_d);
handler.u = ieee754dp_neg;
goto dcopuop;
case fmov_op:
/* an easy one */
+ MIPS_FPU_EMU_INC_STATS(mov_d);
DPFROMREG(rv.d, MIPSInst_FS(ir));
goto copcsr;
@@ -2228,6 +2291,7 @@ dcopuop:
* unary conv ops
*/
case fcvts_op:
+ MIPS_FPU_EMU_INC_STATS(cvt_s_d);
DPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fdp(fs);
rfmt = s_fmt;
@@ -2237,6 +2301,7 @@ dcopuop:
return SIGILL; /* not defined */
case fcvtw_op:
+ MIPS_FPU_EMU_INC_STATS(cvt_w_d);
DPFROMREG(fs, MIPSInst_FS(ir));
rv.w = ieee754dp_tint(fs); /* wrong */
rfmt = w_fmt;
@@ -2249,6 +2314,15 @@ dcopuop:
if (!cpu_has_mips_2_3_4_5_r)
return SIGILL;
+ if (MIPSInst_FUNC(ir) == fceil_op)
+ MIPS_FPU_EMU_INC_STATS(ceil_w_d);
+ if (MIPSInst_FUNC(ir) == ffloor_op)
+ MIPS_FPU_EMU_INC_STATS(floor_w_d);
+ if (MIPSInst_FUNC(ir) == fround_op)
+ MIPS_FPU_EMU_INC_STATS(round_w_d);
+ if (MIPSInst_FUNC(ir) == ftrunc_op)
+ MIPS_FPU_EMU_INC_STATS(trunc_w_d);
+
oldrm = ieee754_csr.rm;
DPFROMREG(fs, MIPSInst_FS(ir));
ieee754_csr.rm = MIPSInst_FUNC(ir);
@@ -2261,6 +2335,7 @@ dcopuop:
if (!cpu_has_mips_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(sel_d);
DPFROMREG(fd, MIPSInst_FD(ir));
if (fd.bits & 0x1)
DPFROMREG(rv.d, MIPSInst_FT(ir));
@@ -2272,6 +2347,7 @@ dcopuop:
if (!cpu_has_mips_3_4_5_64_r2_r6)
return SIGILL;
+ MIPS_FPU_EMU_INC_STATS(cvt_l_d);
DPFROMREG(fs, MIPSInst_FS(ir));
rv.l = ieee754dp_tlong(fs);
rfmt = l_fmt;
@@ -2284,6 +2360,15 @@ dcopuop:
if (!cpu_has_mips_3_4_5_64_r2_r6)
return SIGILL;
+ if (MIPSInst_FUNC(ir) == fceill_op)
+ MIPS_FPU_EMU_INC_STATS(ceil_l_d);
+ if (MIPSInst_FUNC(ir) == ffloorl_op)
+ MIPS_FPU_EMU_INC_STATS(floor_l_d);
+ if (MIPSInst_FUNC(ir) == froundl_op)
+ MIPS_FPU_EMU_INC_STATS(round_l_d);
+ if (MIPSInst_FUNC(ir) == ftruncl_op)
+ MIPS_FPU_EMU_INC_STATS(trunc_l_d);
+
oldrm = ieee754_csr.rm;
DPFROMREG(fs, MIPSInst_FS(ir));
ieee754_csr.rm = MIPSInst_FUNC(ir);
@@ -2325,12 +2410,14 @@ dcopuop:
switch (MIPSInst_FUNC(ir)) {
case fcvts_op:
/* convert word to single precision real */
+ MIPS_FPU_EMU_INC_STATS(cvt_s_w);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.s = ieee754sp_fint(fs.bits);
rfmt = s_fmt;
goto copcsr;
case fcvtd_op:
/* convert word to double precision real */
+ MIPS_FPU_EMU_INC_STATS(cvt_d_w);
SPFROMREG(fs, MIPSInst_FS(ir));
rv.d = ieee754dp_fint(fs.bits);
rfmt = d_fmt;
@@ -2350,6 +2437,90 @@ dcopuop:
(MIPSInst_FUNC(ir) & 0x20))
return SIGILL;
+ if (!sig) {
+ if (!(MIPSInst_FUNC(ir) & PREDICATE_BIT)) {
+ switch (cmpop) {
+ case 0:
+ MIPS_FPU_EMU_INC_STATS(cmp_af_s);
+ break;
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_un_s);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_eq_s);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_ueq_s);
+ break;
+ case 4:
+ MIPS_FPU_EMU_INC_STATS(cmp_lt_s);
+ break;
+ case 5:
+ MIPS_FPU_EMU_INC_STATS(cmp_ult_s);
+ break;
+ case 6:
+ MIPS_FPU_EMU_INC_STATS(cmp_le_s);
+ break;
+ case 7:
+ MIPS_FPU_EMU_INC_STATS(cmp_ule_s);
+ break;
+ }
+ } else {
+ switch (cmpop) {
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_or_s);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_une_s);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_ne_s);
+ break;
+ }
+ }
+ } else {
+ if (!(MIPSInst_FUNC(ir) & PREDICATE_BIT)) {
+ switch (cmpop) {
+ case 0:
+ MIPS_FPU_EMU_INC_STATS(cmp_saf_s);
+ break;
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_sun_s);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_seq_s);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_sueq_s);
+ break;
+ case 4:
+ MIPS_FPU_EMU_INC_STATS(cmp_slt_s);
+ break;
+ case 5:
+ MIPS_FPU_EMU_INC_STATS(cmp_sult_s);
+ break;
+ case 6:
+ MIPS_FPU_EMU_INC_STATS(cmp_sle_s);
+ break;
+ case 7:
+ MIPS_FPU_EMU_INC_STATS(cmp_sule_s);
+ break;
+ }
+ } else {
+ switch (cmpop) {
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_sor_s);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_sune_s);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_sne_s);
+ break;
+ }
+ }
+ }
+
/* fmt is w_fmt for single precision so fix it */
rfmt = s_fmt;
/* default to false */
@@ -2394,6 +2565,7 @@ dcopuop:
break;
}
}
+ break;
}
case l_fmt:
@@ -2406,11 +2578,13 @@ dcopuop:
switch (MIPSInst_FUNC(ir)) {
case fcvts_op:
/* convert long to single precision real */
+ MIPS_FPU_EMU_INC_STATS(cvt_s_l);
rv.s = ieee754sp_flong(bits);
rfmt = s_fmt;
goto copcsr;
case fcvtd_op:
/* convert long to double precision real */
+ MIPS_FPU_EMU_INC_STATS(cvt_d_l);
rv.d = ieee754dp_flong(bits);
rfmt = d_fmt;
goto copcsr;
@@ -2424,6 +2598,90 @@ dcopuop:
(MIPSInst_FUNC(ir) & 0x20))
return SIGILL;
+ if (!sig) {
+ if (!(MIPSInst_FUNC(ir) & PREDICATE_BIT)) {
+ switch (cmpop) {
+ case 0:
+ MIPS_FPU_EMU_INC_STATS(cmp_af_d);
+ break;
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_un_d);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_eq_d);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_ueq_d);
+ break;
+ case 4:
+ MIPS_FPU_EMU_INC_STATS(cmp_lt_d);
+ break;
+ case 5:
+ MIPS_FPU_EMU_INC_STATS(cmp_ult_d);
+ break;
+ case 6:
+ MIPS_FPU_EMU_INC_STATS(cmp_le_d);
+ break;
+ case 7:
+ MIPS_FPU_EMU_INC_STATS(cmp_ule_d);
+ break;
+ }
+ } else {
+ switch (cmpop) {
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_or_d);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_une_d);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_ne_d);
+ break;
+ }
+ }
+ } else {
+ if (!(MIPSInst_FUNC(ir) & PREDICATE_BIT)) {
+ switch (cmpop) {
+ case 0:
+ MIPS_FPU_EMU_INC_STATS(cmp_saf_d);
+ break;
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_sun_d);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_seq_d);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_sueq_d);
+ break;
+ case 4:
+ MIPS_FPU_EMU_INC_STATS(cmp_slt_d);
+ break;
+ case 5:
+ MIPS_FPU_EMU_INC_STATS(cmp_sult_d);
+ break;
+ case 6:
+ MIPS_FPU_EMU_INC_STATS(cmp_sle_d);
+ break;
+ case 7:
+ MIPS_FPU_EMU_INC_STATS(cmp_sule_d);
+ break;
+ }
+ } else {
+ switch (cmpop) {
+ case 1:
+ MIPS_FPU_EMU_INC_STATS(cmp_sor_d);
+ break;
+ case 2:
+ MIPS_FPU_EMU_INC_STATS(cmp_sune_d);
+ break;
+ case 3:
+ MIPS_FPU_EMU_INC_STATS(cmp_sne_d);
+ break;
+ }
+ }
+ }
+
/* fmt is l_fmt for double precision so fix it */
rfmt = d_fmt;
/* default to false */
@@ -2468,6 +2726,8 @@ dcopuop:
break;
}
}
+ break;
+
default:
return SIGILL;
}
@@ -2553,7 +2813,7 @@ dcopuop:
* For simplicity we always terminate upon an ISA mode switch.
*/
int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
- int has_fpu, void *__user *fault_addr)
+ int has_fpu, void __user **fault_addr)
{
unsigned long oldepc, prevepc;
struct mm_decoded_insn dec_insn;
diff --git a/arch/mips/math-emu/dp_fmax.c b/arch/mips/math-emu/dp_fmax.c
index fd71b8daaaf2..5bec64f2884e 100644
--- a/arch/mips/math-emu/dp_fmax.c
+++ b/arch/mips/math-emu/dp_fmax.c
@@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -80,9 +92,7 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
return ys ? x : y;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754dp_zero(1);
+ return ieee754dp_zero(xs & ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
DPDNORMX;
@@ -106,16 +116,32 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
else if (xs < ys)
return x;
- /* Compare exponent */
- if (xe > ye)
- return x;
- else if (xe < ye)
- return y;
+ /* Signs of inputs are equal, let's compare exponents */
+ if (xs == 0) {
+ /* Inputs are both positive */
+ if (xe > ye)
+ return x;
+ else if (xe < ye)
+ return y;
+ } else {
+ /* Inputs are both negative */
+ if (xe > ye)
+ return y;
+ else if (xe < ye)
+ return x;
+ }
- /* Compare mantissa */
+ /* Signs and exponents of inputs are equal, let's compare mantissas */
+ if (xs == 0) {
+ /* Inputs are both positive, with equal signs and exponents */
+ if (xm <= ym)
+ return y;
+ return x;
+ }
+ /* Inputs are both negative, with equal signs and exponents */
if (xm <= ym)
- return y;
- return x;
+ return x;
+ return y;
}
union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
@@ -147,14 +173,26 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -164,6 +202,9 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
/*
* Infinity and zero handling
*/
+ case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
+ return ieee754dp_inf(xs & ys);
+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
@@ -171,7 +212,6 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
return x;
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
@@ -180,9 +220,7 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
return y;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754dp_zero(1);
+ return ieee754dp_zero(xs & ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
DPDNORMX;
@@ -207,7 +245,11 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
return y;
/* Compare mantissa */
- if (xm <= ym)
+ if (xm < ym)
return y;
- return x;
+ else if (xm > ym)
+ return x;
+ else if (xs == 0)
+ return x;
+ return y;
}
diff --git a/arch/mips/math-emu/dp_fmin.c b/arch/mips/math-emu/dp_fmin.c
index c1072b0dfb95..a287b23818d8 100644
--- a/arch/mips/math-emu/dp_fmin.c
+++ b/arch/mips/math-emu/dp_fmin.c
@@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -80,9 +92,7 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
return ys ? y : x;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754dp_zero(1);
+ return ieee754dp_zero(xs | ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
DPDNORMX;
@@ -106,16 +116,32 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
else if (xs < ys)
return y;
- /* Compare exponent */
- if (xe > ye)
- return y;
- else if (xe < ye)
- return x;
+ /* Signs of inputs are the same, let's compare exponents */
+ if (xs == 0) {
+ /* Inputs are both positive */
+ if (xe > ye)
+ return y;
+ else if (xe < ye)
+ return x;
+ } else {
+ /* Inputs are both negative */
+ if (xe > ye)
+ return x;
+ else if (xe < ye)
+ return y;
+ }
- /* Compare mantissa */
+ /* Signs and exponents of inputs are equal, let's compare mantissas */
+ if (xs == 0) {
+ /* Inputs are both positive, with equal signs and exponents */
+ if (xm <= ym)
+ return x;
+ return y;
+ }
+ /* Inputs are both negative, with equal signs and exponents */
if (xm <= ym)
- return x;
- return y;
+ return y;
+ return x;
}
union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
@@ -147,14 +173,26 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754dp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -164,25 +202,25 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
/*
* Infinity and zero handling
*/
+ case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
+ return ieee754dp_inf(xs | ys);
+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
- return x;
+ return y;
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
- return y;
+ return x;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754dp_zero(1);
+ return ieee754dp_zero(xs | ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
DPDNORMX;
@@ -207,7 +245,11 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
return x;
/* Compare mantissa */
- if (xm <= ym)
+ if (xm < ym)
+ return x;
+ else if (xm > ym)
+ return y;
+ else if (xs == 1)
return x;
return y;
}
diff --git a/arch/mips/math-emu/dp_maddf.c b/arch/mips/math-emu/dp_maddf.c
index caa62f20a888..e0d9be5fbf4c 100644
--- a/arch/mips/math-emu/dp_maddf.c
+++ b/arch/mips/math-emu/dp_maddf.c
@@ -14,22 +14,45 @@
#include "ieee754dp.h"
-enum maddf_flags {
- maddf_negate_product = 1 << 0,
-};
+
+/* 128 bits shift right logical with rounding. */
+void srl128(u64 *hptr, u64 *lptr, int count)
+{
+ u64 low;
+
+ if (count >= 128) {
+ *lptr = *hptr != 0 || *lptr != 0;
+ *hptr = 0;
+ } else if (count >= 64) {
+ if (count == 64) {
+ *lptr = *hptr | (*lptr != 0);
+ } else {
+ low = *lptr;
+ *lptr = *hptr >> (count - 64);
+ *lptr |= (*hptr << (128 - count)) != 0 || low != 0;
+ }
+ *hptr = 0;
+ } else {
+ low = *lptr;
+ *lptr = low >> count | *hptr << (64 - count);
+ *lptr |= (low << (64 - count)) != 0;
+ *hptr = *hptr >> count;
+ }
+}
static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
union ieee754dp y, enum maddf_flags flags)
{
int re;
int rs;
- u64 rm;
unsigned lxm;
unsigned hxm;
unsigned lym;
unsigned hym;
u64 lrm;
u64 hrm;
+ u64 lzm;
+ u64 hzm;
u64 t;
u64 at;
int s;
@@ -48,52 +71,34 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
ieee754_clearcx();
- switch (zc) {
- case IEEE754_CLASS_SNAN:
- ieee754_setcx(IEEE754_INVALID_OPERATION);
+ /*
+ * Handle the cases when at least one of x, y or z is a NaN.
+ * Order of precedence is sNaN, qNaN and z, x, y.
+ */
+ if (zc == IEEE754_CLASS_SNAN)
return ieee754dp_nanxcpt(z);
- case IEEE754_CLASS_DNORM:
- DPDNORMZ;
- /* QNAN and ZERO cases are handled separately below */
- }
-
- switch (CLPAIR(xc, yc)) {
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN):
- return ieee754dp_nanxcpt(y);
-
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
+ if (xc == IEEE754_CLASS_SNAN)
return ieee754dp_nanxcpt(x);
-
- case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
+ if (yc == IEEE754_CLASS_SNAN)
+ return ieee754dp_nanxcpt(y);
+ if (zc == IEEE754_CLASS_QNAN)
+ return z;
+ if (xc == IEEE754_CLASS_QNAN)
+ return x;
+ if (yc == IEEE754_CLASS_QNAN)
return y;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF):
- return x;
+ if (zc == IEEE754_CLASS_DNORM)
+ DPDNORMZ;
+ /* ZERO z cases are handled separately below */
+ switch (CLPAIR(xc, yc)) {
/*
* Infinity handling
*/
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754dp_indef();
@@ -102,9 +107,27 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- return ieee754dp_inf(xs ^ ys);
+ if ((zc == IEEE754_CLASS_INF) &&
+ ((!(flags & MADDF_NEGATE_PRODUCT) && (zs != (xs ^ ys))) ||
+ ((flags & MADDF_NEGATE_PRODUCT) && (zs == (xs ^ ys))))) {
+ /*
+ * Cases of addition of infinities with opposite signs
+ * or subtraction of infinities with same signs.
+ */
+ ieee754_setcx(IEEE754_INVALID_OPERATION);
+ return ieee754dp_indef();
+ }
+ /*
+ * z is here either not an infinity, or an infinity having the
+ * same sign as product (x*y) (in case of MADDF.D instruction)
+ * or product -(x*y) (in MSUBF.D case). The result must be an
+ * infinity, and its sign is determined only by the value of
+ * (flags & MADDF_NEGATE_PRODUCT) and the signs of x and y.
+ */
+ if (flags & MADDF_NEGATE_PRODUCT)
+ return ieee754dp_inf(1 ^ (xs ^ ys));
+ else
+ return ieee754dp_inf(xs ^ ys);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
@@ -113,32 +136,42 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
if (zc == IEEE754_CLASS_INF)
return ieee754dp_inf(zs);
- /* Multiplication is 0 so just return z */
+ if (zc == IEEE754_CLASS_ZERO) {
+ /* Handle cases +0 + (-0) and similar ones. */
+ if ((!(flags & MADDF_NEGATE_PRODUCT)
+ && (zs == (xs ^ ys))) ||
+ ((flags & MADDF_NEGATE_PRODUCT)
+ && (zs != (xs ^ ys))))
+ /*
+ * Cases of addition of zeros of equal signs
+ * or subtraction of zeroes of opposite signs.
+ * The sign of the resulting zero is in any
+ * such case determined only by the sign of z.
+ */
+ return z;
+
+ return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
+ }
+ /* x*y is here 0, and z is not 0, so just return z */
return z;
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
DPDNORMX;
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754dp_inf(zs);
DPDNORMY;
break;
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754dp_inf(zs);
DPDNORMX;
break;
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754dp_inf(zs);
/* fall through to real computations */
}
@@ -157,7 +190,7 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
re = xe + ye;
rs = xs ^ ys;
- if (flags & maddf_negate_product)
+ if (flags & MADDF_NEGATE_PRODUCT)
rs ^= 1;
/* shunt to top of word */
@@ -165,7 +198,7 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
ym <<= 64 - (DP_FBITS + 1);
/*
- * Multiply 64 bits xm, ym to give high 64 bits rm with stickness.
+ * Multiply 64 bits xm and ym to give 128 bits result in hrm:lrm.
*/
/* 32 * 32 => 64 */
@@ -195,81 +228,110 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
hrm = hrm + (t >> 32);
- rm = hrm | (lrm != 0);
-
- /*
- * Sticky shift down to normal rounding precision.
- */
- if ((s64) rm < 0) {
- rm = (rm >> (64 - (DP_FBITS + 1 + 3))) |
- ((rm << (DP_FBITS + 1 + 3)) != 0);
+ /* Put explicit bit at bit 126 if necessary */
+ if ((int64_t)hrm < 0) {
+ lrm = (hrm << 63) | (lrm >> 1);
+ hrm = hrm >> 1;
re++;
- } else {
- rm = (rm >> (64 - (DP_FBITS + 1 + 3 + 1))) |
- ((rm << (DP_FBITS + 1 + 3 + 1)) != 0);
}
- assert(rm & (DP_HIDDEN_BIT << 3));
- if (zc == IEEE754_CLASS_ZERO)
- return ieee754dp_format(rs, re, rm);
+ assert(hrm & (1 << 62));
- /* And now the addition */
- assert(zm & DP_HIDDEN_BIT);
+ if (zc == IEEE754_CLASS_ZERO) {
+ /*
+ * Move explicit bit from bit 126 to bit 55 since the
+ * ieee754dp_format code expects the mantissa to be
+ * 56 bits wide (53 + 3 rounding bits).
+ */
+ srl128(&hrm, &lrm, (126 - 55));
+ return ieee754dp_format(rs, re, lrm);
+ }
- /*
- * Provide guard,round and stick bit space.
- */
- zm <<= 3;
+ /* Move explicit bit from bit 52 to bit 126 */
+ lzm = 0;
+ hzm = zm << 10;
+ assert(hzm & (1 << 62));
+ /* Make the exponents the same */
if (ze > re) {
/*
* Have to shift y fraction right to align.
*/
s = ze - re;
- rm = XDPSRS(rm, s);
+ srl128(&hrm, &lrm, s);
re += s;
} else if (re > ze) {
/*
* Have to shift x fraction right to align.
*/
s = re - ze;
- zm = XDPSRS(zm, s);
+ srl128(&hzm, &lzm, s);
ze += s;
}
assert(ze == re);
assert(ze <= DP_EMAX);
+ /* Do the addition */
if (zs == rs) {
/*
- * Generate 28 bit result of adding two 27 bit numbers
- * leaving result in xm, xs and xe.
+ * Generate 128 bit result by adding two 127 bit numbers
+ * leaving result in hzm:lzm, zs and ze.
*/
- zm = zm + rm;
-
- if (zm >> (DP_FBITS + 1 + 3)) { /* carry out */
- zm = XDPSRS1(zm);
+ hzm = hzm + hrm + (lzm > (lzm + lrm));
+ lzm = lzm + lrm;
+ if ((int64_t)hzm < 0) { /* carry out */
+ srl128(&hzm, &lzm, 1);
ze++;
}
} else {
- if (zm >= rm) {
- zm = zm - rm;
+ if (hzm > hrm || (hzm == hrm && lzm >= lrm)) {
+ hzm = hzm - hrm - (lzm < lrm);
+ lzm = lzm - lrm;
} else {
- zm = rm - zm;
+ hzm = hrm - hzm - (lrm < lzm);
+ lzm = lrm - lzm;
zs = rs;
}
- if (zm == 0)
+ if (lzm == 0 && hzm == 0)
return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
/*
- * Normalize to rounding precision.
+ * Put explicit bit at bit 126 if necessary.
*/
- while ((zm >> (DP_FBITS + 3)) == 0) {
- zm <<= 1;
- ze--;
+ if (hzm == 0) {
+ /* left shift by 63 or 64 bits */
+ if ((int64_t)lzm < 0) {
+ /* MSB of lzm is the explicit bit */
+ hzm = lzm >> 1;
+ lzm = lzm << 63;
+ ze -= 63;
+ } else {
+ hzm = lzm;
+ lzm = 0;
+ ze -= 64;
+ }
+ }
+
+ t = 0;
+ while ((hzm >> (62 - t)) == 0)
+ t++;
+
+ assert(t <= 62);
+ if (t) {
+ hzm = hzm << t | lzm >> (64 - t);
+ lzm = lzm << t;
+ ze -= t;
}
}
- return ieee754dp_format(zs, ze, zm);
+ /*
+ * Move explicit bit from bit 126 to bit 55 since the
+ * ieee754dp_format code expects the mantissa to be
+ * 56 bits wide (53 + 3 rounding bits).
+ */
+ srl128(&hzm, &lzm, (126 - 55));
+
+ return ieee754dp_format(zs, ze, lzm);
}
union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
@@ -281,5 +343,5 @@ union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
union ieee754dp ieee754dp_msubf(union ieee754dp z, union ieee754dp x,
union ieee754dp y)
{
- return _dp_maddf(z, x, y, maddf_negate_product);
+ return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
}
diff --git a/arch/mips/math-emu/dp_rint.c b/arch/mips/math-emu/dp_rint.c
new file mode 100644
index 000000000000..c3b9077ff357
--- /dev/null
+++ b/arch/mips/math-emu/dp_rint.c
@@ -0,0 +1,89 @@
+/* IEEE754 floating point arithmetic
+ * double precision: common utilities
+ */
+/*
+ * MIPS floating point support
+ * Copyright (C) 1994-2000 Algorithmics Ltd.
+ * Copyright (C) 2017 Imagination Technologies, Ltd.
+ * Author: Aleksandar Markovic <[email protected]>
+ *
+ * This program is free software; you can distribute it and/or modify it
+ * under the terms of the GNU General Public License (Version 2) as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.
+ */
+
+#include "ieee754dp.h"
+
+union ieee754dp ieee754dp_rint(union ieee754dp x)
+{
+ union ieee754dp ret;
+ u64 residue;
+ int sticky;
+ int round;
+ int odd;
+
+ COMPXDP;
+
+ ieee754_clearcx();
+
+ EXPLODEXDP;
+ FLUSHXDP;
+
+ if (xc == IEEE754_CLASS_SNAN)
+ return ieee754dp_nanxcpt(x);
+
+ if ((xc == IEEE754_CLASS_QNAN) ||
+ (xc == IEEE754_CLASS_INF) ||
+ (xc == IEEE754_CLASS_ZERO))
+ return x;
+
+ if (xe >= DP_FBITS)
+ return x;
+
+ if (xe < -1) {
+ residue = xm;
+ round = 0;
+ sticky = residue != 0;
+ xm = 0;
+ } else {
+ residue = xm << (64 - DP_FBITS + xe);
+ round = (residue >> 63) != 0;
+ sticky = (residue << 1) != 0;
+ xm >>= DP_FBITS - xe;
+ }
+
+ odd = (xm & 0x1) != 0x0;
+
+ switch (ieee754_csr.rm) {
+ case FPU_CSR_RN: /* toward nearest */
+ if (round && (sticky || odd))
+ xm++;
+ break;
+ case FPU_CSR_RZ: /* toward zero */
+ break;
+ case FPU_CSR_RU: /* toward +infinity */
+ if ((round || sticky) && !xs)
+ xm++;
+ break;
+ case FPU_CSR_RD: /* toward -infinity */
+ if ((round || sticky) && xs)
+ xm++;
+ break;
+ }
+
+ if (round || sticky)
+ ieee754_setcx(IEEE754_INEXACT);
+
+ ret = ieee754dp_flong(xm);
+ DPSIGN(ret) = xs;
+
+ return ret;
+}
diff --git a/arch/mips/math-emu/ieee754.h b/arch/mips/math-emu/ieee754.h
index d3be351aed15..92dc8fa565cb 100644
--- a/arch/mips/math-emu/ieee754.h
+++ b/arch/mips/math-emu/ieee754.h
@@ -67,6 +67,7 @@ union ieee754sp ieee754sp_div(union ieee754sp x, union ieee754sp y);
union ieee754sp ieee754sp_fint(int x);
union ieee754sp ieee754sp_flong(s64 x);
union ieee754sp ieee754sp_fdp(union ieee754dp x);
+union ieee754sp ieee754sp_rint(union ieee754sp x);
int ieee754sp_tint(union ieee754sp x);
s64 ieee754sp_tlong(union ieee754sp x);
@@ -101,6 +102,7 @@ union ieee754dp ieee754dp_neg(union ieee754dp x);
union ieee754dp ieee754dp_fint(int x);
union ieee754dp ieee754dp_flong(s64 x);
union ieee754dp ieee754dp_fsp(union ieee754sp x);
+union ieee754dp ieee754dp_rint(union ieee754dp x);
int ieee754dp_tint(union ieee754dp x);
s64 ieee754dp_tlong(union ieee754dp x);
diff --git a/arch/mips/math-emu/ieee754int.h b/arch/mips/math-emu/ieee754int.h
index 8bc2f6963324..dd2071f430e0 100644
--- a/arch/mips/math-emu/ieee754int.h
+++ b/arch/mips/math-emu/ieee754int.h
@@ -26,6 +26,10 @@
#define CLPAIR(x, y) ((x)*6+(y))
+enum maddf_flags {
+ MADDF_NEGATE_PRODUCT = 1 << 0,
+};
+
static inline void ieee754_clearcx(void)
{
ieee754_csr.cx = 0;
diff --git a/arch/mips/math-emu/ieee754sp.h b/arch/mips/math-emu/ieee754sp.h
index 8476067075fe..0f63e4202cff 100644
--- a/arch/mips/math-emu/ieee754sp.h
+++ b/arch/mips/math-emu/ieee754sp.h
@@ -45,6 +45,10 @@ static inline int ieee754sp_finite(union ieee754sp x)
return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
}
+/* 64 bit right shift with rounding */
+#define XSPSRS64(v, rs) \
+ (((rs) >= 64) ? ((v) != 0) : ((v) >> (rs)) | ((v) << (64-(rs)) != 0))
+
/* 3bit extended single precision sticky right shift */
#define XSPSRS(v, rs) \
((rs > (SP_FBITS+3))?1:((v) >> (rs)) | ((v) << (32-(rs)) != 0))
diff --git a/arch/mips/math-emu/me-debugfs.c b/arch/mips/math-emu/me-debugfs.c
index be650ed7db59..8c0ec154aecc 100644
--- a/arch/mips/math-emu/me-debugfs.c
+++ b/arch/mips/math-emu/me-debugfs.c
@@ -28,14 +28,190 @@ static int fpuemu_stat_get(void *data, u64 *val)
}
DEFINE_SIMPLE_ATTRIBUTE(fops_fpuemu_stat, fpuemu_stat_get, NULL, "%llu\n");
+/*
+ * Used to obtain names for a debugfs instruction counter, given field name
+ * in fpuemustats structure. For example, for input "cmp_sueq_d", the output
+ * would be "cmp.sueq.d". This is needed since dots are not allowed to be
+ * used in structure field names, and are, on the other hand, desired to be
+ * used in debugfs item names to be clearly associated to corresponding
+ * MIPS FPU instructions.
+ */
+static void adjust_instruction_counter_name(char *out_name, char *in_name)
+{
+ int i = 0;
+
+ strcpy(out_name, in_name);
+ while (in_name[i] != '\0') {
+ if (out_name[i] == '_')
+ out_name[i] = '.';
+ i++;
+ }
+}
+
+static int fpuemustats_clear_show(struct seq_file *s, void *unused)
+{
+ __this_cpu_write((fpuemustats).emulated, 0);
+ __this_cpu_write((fpuemustats).loads, 0);
+ __this_cpu_write((fpuemustats).stores, 0);
+ __this_cpu_write((fpuemustats).branches, 0);
+ __this_cpu_write((fpuemustats).cp1ops, 0);
+ __this_cpu_write((fpuemustats).cp1xops, 0);
+ __this_cpu_write((fpuemustats).errors, 0);
+ __this_cpu_write((fpuemustats).ieee754_inexact, 0);
+ __this_cpu_write((fpuemustats).ieee754_underflow, 0);
+ __this_cpu_write((fpuemustats).ieee754_overflow, 0);
+ __this_cpu_write((fpuemustats).ieee754_zerodiv, 0);
+ __this_cpu_write((fpuemustats).ieee754_invalidop, 0);
+ __this_cpu_write((fpuemustats).ds_emul, 0);
+
+ __this_cpu_write((fpuemustats).abs_s, 0);
+ __this_cpu_write((fpuemustats).abs_d, 0);
+ __this_cpu_write((fpuemustats).add_s, 0);
+ __this_cpu_write((fpuemustats).add_d, 0);
+ __this_cpu_write((fpuemustats).bc1eqz, 0);
+ __this_cpu_write((fpuemustats).bc1nez, 0);
+ __this_cpu_write((fpuemustats).ceil_w_s, 0);
+ __this_cpu_write((fpuemustats).ceil_w_d, 0);
+ __this_cpu_write((fpuemustats).ceil_l_s, 0);
+ __this_cpu_write((fpuemustats).ceil_l_d, 0);
+ __this_cpu_write((fpuemustats).class_s, 0);
+ __this_cpu_write((fpuemustats).class_d, 0);
+ __this_cpu_write((fpuemustats).cmp_af_s, 0);
+ __this_cpu_write((fpuemustats).cmp_af_d, 0);
+ __this_cpu_write((fpuemustats).cmp_eq_s, 0);
+ __this_cpu_write((fpuemustats).cmp_eq_d, 0);
+ __this_cpu_write((fpuemustats).cmp_le_s, 0);
+ __this_cpu_write((fpuemustats).cmp_le_d, 0);
+ __this_cpu_write((fpuemustats).cmp_lt_s, 0);
+ __this_cpu_write((fpuemustats).cmp_lt_d, 0);
+ __this_cpu_write((fpuemustats).cmp_ne_s, 0);
+ __this_cpu_write((fpuemustats).cmp_ne_d, 0);
+ __this_cpu_write((fpuemustats).cmp_or_s, 0);
+ __this_cpu_write((fpuemustats).cmp_or_d, 0);
+ __this_cpu_write((fpuemustats).cmp_ueq_s, 0);
+ __this_cpu_write((fpuemustats).cmp_ueq_d, 0);
+ __this_cpu_write((fpuemustats).cmp_ule_s, 0);
+ __this_cpu_write((fpuemustats).cmp_ule_d, 0);
+ __this_cpu_write((fpuemustats).cmp_ult_s, 0);
+ __this_cpu_write((fpuemustats).cmp_ult_d, 0);
+ __this_cpu_write((fpuemustats).cmp_un_s, 0);
+ __this_cpu_write((fpuemustats).cmp_un_d, 0);
+ __this_cpu_write((fpuemustats).cmp_une_s, 0);
+ __this_cpu_write((fpuemustats).cmp_une_d, 0);
+ __this_cpu_write((fpuemustats).cmp_saf_s, 0);
+ __this_cpu_write((fpuemustats).cmp_saf_d, 0);
+ __this_cpu_write((fpuemustats).cmp_seq_s, 0);
+ __this_cpu_write((fpuemustats).cmp_seq_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sle_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sle_d, 0);
+ __this_cpu_write((fpuemustats).cmp_slt_s, 0);
+ __this_cpu_write((fpuemustats).cmp_slt_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sne_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sne_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sor_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sor_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sueq_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sueq_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sule_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sule_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sult_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sult_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sun_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sun_d, 0);
+ __this_cpu_write((fpuemustats).cmp_sune_s, 0);
+ __this_cpu_write((fpuemustats).cmp_sune_d, 0);
+ __this_cpu_write((fpuemustats).cvt_d_l, 0);
+ __this_cpu_write((fpuemustats).cvt_d_s, 0);
+ __this_cpu_write((fpuemustats).cvt_d_w, 0);
+ __this_cpu_write((fpuemustats).cvt_l_s, 0);
+ __this_cpu_write((fpuemustats).cvt_l_d, 0);
+ __this_cpu_write((fpuemustats).cvt_s_d, 0);
+ __this_cpu_write((fpuemustats).cvt_s_l, 0);
+ __this_cpu_write((fpuemustats).cvt_s_w, 0);
+ __this_cpu_write((fpuemustats).cvt_w_s, 0);
+ __this_cpu_write((fpuemustats).cvt_w_d, 0);
+ __this_cpu_write((fpuemustats).div_s, 0);
+ __this_cpu_write((fpuemustats).div_d, 0);
+ __this_cpu_write((fpuemustats).floor_w_s, 0);
+ __this_cpu_write((fpuemustats).floor_w_d, 0);
+ __this_cpu_write((fpuemustats).floor_l_s, 0);
+ __this_cpu_write((fpuemustats).floor_l_d, 0);
+ __this_cpu_write((fpuemustats).maddf_s, 0);
+ __this_cpu_write((fpuemustats).maddf_d, 0);
+ __this_cpu_write((fpuemustats).max_s, 0);
+ __this_cpu_write((fpuemustats).max_d, 0);
+ __this_cpu_write((fpuemustats).maxa_s, 0);
+ __this_cpu_write((fpuemustats).maxa_d, 0);
+ __this_cpu_write((fpuemustats).min_s, 0);
+ __this_cpu_write((fpuemustats).min_d, 0);
+ __this_cpu_write((fpuemustats).mina_s, 0);
+ __this_cpu_write((fpuemustats).mina_d, 0);
+ __this_cpu_write((fpuemustats).mov_s, 0);
+ __this_cpu_write((fpuemustats).mov_d, 0);
+ __this_cpu_write((fpuemustats).msubf_s, 0);
+ __this_cpu_write((fpuemustats).msubf_d, 0);
+ __this_cpu_write((fpuemustats).mul_s, 0);
+ __this_cpu_write((fpuemustats).mul_d, 0);
+ __this_cpu_write((fpuemustats).neg_s, 0);
+ __this_cpu_write((fpuemustats).neg_d, 0);
+ __this_cpu_write((fpuemustats).recip_s, 0);
+ __this_cpu_write((fpuemustats).recip_d, 0);
+ __this_cpu_write((fpuemustats).rint_s, 0);
+ __this_cpu_write((fpuemustats).rint_d, 0);
+ __this_cpu_write((fpuemustats).round_w_s, 0);
+ __this_cpu_write((fpuemustats).round_w_d, 0);
+ __this_cpu_write((fpuemustats).round_l_s, 0);
+ __this_cpu_write((fpuemustats).round_l_d, 0);
+ __this_cpu_write((fpuemustats).rsqrt_s, 0);
+ __this_cpu_write((fpuemustats).rsqrt_d, 0);
+ __this_cpu_write((fpuemustats).sel_s, 0);
+ __this_cpu_write((fpuemustats).sel_d, 0);
+ __this_cpu_write((fpuemustats).seleqz_s, 0);
+ __this_cpu_write((fpuemustats).seleqz_d, 0);
+ __this_cpu_write((fpuemustats).selnez_s, 0);
+ __this_cpu_write((fpuemustats).selnez_d, 0);
+ __this_cpu_write((fpuemustats).sqrt_s, 0);
+ __this_cpu_write((fpuemustats).sqrt_d, 0);
+ __this_cpu_write((fpuemustats).sub_s, 0);
+ __this_cpu_write((fpuemustats).sub_d, 0);
+ __this_cpu_write((fpuemustats).trunc_w_s, 0);
+ __this_cpu_write((fpuemustats).trunc_w_d, 0);
+ __this_cpu_write((fpuemustats).trunc_l_s, 0);
+ __this_cpu_write((fpuemustats).trunc_l_d, 0);
+
+ return 0;
+}
+
+static int fpuemustats_clear_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, fpuemustats_clear_show, inode->i_private);
+}
+
+static const struct file_operations fpuemustats_clear_fops = {
+ .open = fpuemustats_clear_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
static int __init debugfs_fpuemu(void)
{
- struct dentry *d, *dir;
+ struct dentry *fpuemu_debugfs_base_dir;
+ struct dentry *fpuemu_debugfs_inst_dir;
+ struct dentry *d, *reset_file;
if (!mips_debugfs_dir)
return -ENODEV;
- dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir);
- if (!dir)
+
+ fpuemu_debugfs_base_dir = debugfs_create_dir("fpuemustats",
+ mips_debugfs_dir);
+ if (!fpuemu_debugfs_base_dir)
+ return -ENOMEM;
+
+ reset_file = debugfs_create_file("fpuemustats_clear", 0444,
+ mips_debugfs_dir, NULL,
+ &fpuemustats_clear_fops);
+ if (!reset_file)
return -ENOMEM;
#define FPU_EMU_STAT_OFFSET(m) \
@@ -43,7 +219,7 @@ static int __init debugfs_fpuemu(void)
#define FPU_STAT_CREATE(m) \
do { \
- d = debugfs_create_file(#m , S_IRUGO, dir, \
+ d = debugfs_create_file(#m, 0444, fpuemu_debugfs_base_dir, \
(void *)FPU_EMU_STAT_OFFSET(m), \
&fops_fpuemu_stat); \
if (!d) \
@@ -53,6 +229,7 @@ do { \
FPU_STAT_CREATE(emulated);
FPU_STAT_CREATE(loads);
FPU_STAT_CREATE(stores);
+ FPU_STAT_CREATE(branches);
FPU_STAT_CREATE(cp1ops);
FPU_STAT_CREATE(cp1xops);
FPU_STAT_CREATE(errors);
@@ -63,6 +240,139 @@ do { \
FPU_STAT_CREATE(ieee754_invalidop);
FPU_STAT_CREATE(ds_emul);
+ fpuemu_debugfs_inst_dir = debugfs_create_dir("instructions",
+ fpuemu_debugfs_base_dir);
+ if (!fpuemu_debugfs_inst_dir)
+ return -ENOMEM;
+
+#define FPU_STAT_CREATE_EX(m) \
+do { \
+ char name[32]; \
+ \
+ adjust_instruction_counter_name(name, #m); \
+ \
+ d = debugfs_create_file(name, 0444, fpuemu_debugfs_inst_dir, \
+ (void *)FPU_EMU_STAT_OFFSET(m), \
+ &fops_fpuemu_stat); \
+ if (!d) \
+ return -ENOMEM; \
+} while (0)
+
+ FPU_STAT_CREATE_EX(abs_s);
+ FPU_STAT_CREATE_EX(abs_d);
+ FPU_STAT_CREATE_EX(add_s);
+ FPU_STAT_CREATE_EX(add_d);
+ FPU_STAT_CREATE_EX(bc1eqz);
+ FPU_STAT_CREATE_EX(bc1nez);
+ FPU_STAT_CREATE_EX(ceil_w_s);
+ FPU_STAT_CREATE_EX(ceil_w_d);
+ FPU_STAT_CREATE_EX(ceil_l_s);
+ FPU_STAT_CREATE_EX(ceil_l_d);
+ FPU_STAT_CREATE_EX(class_s);
+ FPU_STAT_CREATE_EX(class_d);
+ FPU_STAT_CREATE_EX(cmp_af_s);
+ FPU_STAT_CREATE_EX(cmp_af_d);
+ FPU_STAT_CREATE_EX(cmp_eq_s);
+ FPU_STAT_CREATE_EX(cmp_eq_d);
+ FPU_STAT_CREATE_EX(cmp_le_s);
+ FPU_STAT_CREATE_EX(cmp_le_d);
+ FPU_STAT_CREATE_EX(cmp_lt_s);
+ FPU_STAT_CREATE_EX(cmp_lt_d);
+ FPU_STAT_CREATE_EX(cmp_ne_s);
+ FPU_STAT_CREATE_EX(cmp_ne_d);
+ FPU_STAT_CREATE_EX(cmp_or_s);
+ FPU_STAT_CREATE_EX(cmp_or_d);
+ FPU_STAT_CREATE_EX(cmp_ueq_s);
+ FPU_STAT_CREATE_EX(cmp_ueq_d);
+ FPU_STAT_CREATE_EX(cmp_ule_s);
+ FPU_STAT_CREATE_EX(cmp_ule_d);
+ FPU_STAT_CREATE_EX(cmp_ult_s);
+ FPU_STAT_CREATE_EX(cmp_ult_d);
+ FPU_STAT_CREATE_EX(cmp_un_s);
+ FPU_STAT_CREATE_EX(cmp_un_d);
+ FPU_STAT_CREATE_EX(cmp_une_s);
+ FPU_STAT_CREATE_EX(cmp_une_d);
+ FPU_STAT_CREATE_EX(cmp_saf_s);
+ FPU_STAT_CREATE_EX(cmp_saf_d);
+ FPU_STAT_CREATE_EX(cmp_seq_s);
+ FPU_STAT_CREATE_EX(cmp_seq_d);
+ FPU_STAT_CREATE_EX(cmp_sle_s);
+ FPU_STAT_CREATE_EX(cmp_sle_d);
+ FPU_STAT_CREATE_EX(cmp_slt_s);
+ FPU_STAT_CREATE_EX(cmp_slt_d);
+ FPU_STAT_CREATE_EX(cmp_sne_s);
+ FPU_STAT_CREATE_EX(cmp_sne_d);
+ FPU_STAT_CREATE_EX(cmp_sor_s);
+ FPU_STAT_CREATE_EX(cmp_sor_d);
+ FPU_STAT_CREATE_EX(cmp_sueq_s);
+ FPU_STAT_CREATE_EX(cmp_sueq_d);
+ FPU_STAT_CREATE_EX(cmp_sule_s);
+ FPU_STAT_CREATE_EX(cmp_sule_d);
+ FPU_STAT_CREATE_EX(cmp_sult_s);
+ FPU_STAT_CREATE_EX(cmp_sult_d);
+ FPU_STAT_CREATE_EX(cmp_sun_s);
+ FPU_STAT_CREATE_EX(cmp_sun_d);
+ FPU_STAT_CREATE_EX(cmp_sune_s);
+ FPU_STAT_CREATE_EX(cmp_sune_d);
+ FPU_STAT_CREATE_EX(cvt_d_l);
+ FPU_STAT_CREATE_EX(cvt_d_s);
+ FPU_STAT_CREATE_EX(cvt_d_w);
+ FPU_STAT_CREATE_EX(cvt_l_s);
+ FPU_STAT_CREATE_EX(cvt_l_d);
+ FPU_STAT_CREATE_EX(cvt_s_d);
+ FPU_STAT_CREATE_EX(cvt_s_l);
+ FPU_STAT_CREATE_EX(cvt_s_w);
+ FPU_STAT_CREATE_EX(cvt_w_s);
+ FPU_STAT_CREATE_EX(cvt_w_d);
+ FPU_STAT_CREATE_EX(div_s);
+ FPU_STAT_CREATE_EX(div_d);
+ FPU_STAT_CREATE_EX(floor_w_s);
+ FPU_STAT_CREATE_EX(floor_w_d);
+ FPU_STAT_CREATE_EX(floor_l_s);
+ FPU_STAT_CREATE_EX(floor_l_d);
+ FPU_STAT_CREATE_EX(maddf_s);
+ FPU_STAT_CREATE_EX(maddf_d);
+ FPU_STAT_CREATE_EX(max_s);
+ FPU_STAT_CREATE_EX(max_d);
+ FPU_STAT_CREATE_EX(maxa_s);
+ FPU_STAT_CREATE_EX(maxa_d);
+ FPU_STAT_CREATE_EX(min_s);
+ FPU_STAT_CREATE_EX(min_d);
+ FPU_STAT_CREATE_EX(mina_s);
+ FPU_STAT_CREATE_EX(mina_d);
+ FPU_STAT_CREATE_EX(mov_s);
+ FPU_STAT_CREATE_EX(mov_d);
+ FPU_STAT_CREATE_EX(msubf_s);
+ FPU_STAT_CREATE_EX(msubf_d);
+ FPU_STAT_CREATE_EX(mul_s);
+ FPU_STAT_CREATE_EX(mul_d);
+ FPU_STAT_CREATE_EX(neg_s);
+ FPU_STAT_CREATE_EX(neg_d);
+ FPU_STAT_CREATE_EX(recip_s);
+ FPU_STAT_CREATE_EX(recip_d);
+ FPU_STAT_CREATE_EX(rint_s);
+ FPU_STAT_CREATE_EX(rint_d);
+ FPU_STAT_CREATE_EX(round_w_s);
+ FPU_STAT_CREATE_EX(round_w_d);
+ FPU_STAT_CREATE_EX(round_l_s);
+ FPU_STAT_CREATE_EX(round_l_d);
+ FPU_STAT_CREATE_EX(rsqrt_s);
+ FPU_STAT_CREATE_EX(rsqrt_d);
+ FPU_STAT_CREATE_EX(sel_s);
+ FPU_STAT_CREATE_EX(sel_d);
+ FPU_STAT_CREATE_EX(seleqz_s);
+ FPU_STAT_CREATE_EX(seleqz_d);
+ FPU_STAT_CREATE_EX(selnez_s);
+ FPU_STAT_CREATE_EX(selnez_d);
+ FPU_STAT_CREATE_EX(sqrt_s);
+ FPU_STAT_CREATE_EX(sqrt_d);
+ FPU_STAT_CREATE_EX(sub_s);
+ FPU_STAT_CREATE_EX(sub_d);
+ FPU_STAT_CREATE_EX(trunc_w_s);
+ FPU_STAT_CREATE_EX(trunc_w_d);
+ FPU_STAT_CREATE_EX(trunc_l_s);
+ FPU_STAT_CREATE_EX(trunc_l_d);
+
return 0;
}
arch_initcall(debugfs_fpuemu);
diff --git a/arch/mips/math-emu/sp_fmax.c b/arch/mips/math-emu/sp_fmax.c
index 4d000844e48e..74a5a00d2f22 100644
--- a/arch/mips/math-emu/sp_fmax.c
+++ b/arch/mips/math-emu/sp_fmax.c
@@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754sp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -80,9 +92,7 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
return ys ? x : y;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754sp_zero(1);
+ return ieee754sp_zero(xs & ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
SPDNORMX;
@@ -106,16 +116,32 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
else if (xs < ys)
return x;
- /* Compare exponent */
- if (xe > ye)
- return x;
- else if (xe < ye)
- return y;
+ /* Signs of inputs are equal, let's compare exponents */
+ if (xs == 0) {
+ /* Inputs are both positive */
+ if (xe > ye)
+ return x;
+ else if (xe < ye)
+ return y;
+ } else {
+ /* Inputs are both negative */
+ if (xe > ye)
+ return y;
+ else if (xe < ye)
+ return x;
+ }
- /* Compare mantissa */
+ /* Signs and exponents of inputs are equal, let's compare mantissas */
+ if (xs == 0) {
+ /* Inputs are both positive, with equal signs and exponents */
+ if (xm <= ym)
+ return y;
+ return x;
+ }
+ /* Inputs are both negative, with equal signs and exponents */
if (xm <= ym)
- return y;
- return x;
+ return x;
+ return y;
}
union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
@@ -147,14 +173,26 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754sp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -164,6 +202,9 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
/*
* Infinity and zero handling
*/
+ case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
+ return ieee754sp_inf(xs & ys);
+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
@@ -171,7 +212,6 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
return x;
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
@@ -180,9 +220,7 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
return y;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754sp_zero(1);
+ return ieee754sp_zero(xs & ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
SPDNORMX;
@@ -207,7 +245,11 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
return y;
/* Compare mantissa */
- if (xm <= ym)
+ if (xm < ym)
return y;
- return x;
+ else if (xm > ym)
+ return x;
+ else if (xs == 0)
+ return x;
+ return y;
}
diff --git a/arch/mips/math-emu/sp_fmin.c b/arch/mips/math-emu/sp_fmin.c
index 4eb1bb9e9dec..c51385f46b09 100644
--- a/arch/mips/math-emu/sp_fmin.c
+++ b/arch/mips/math-emu/sp_fmin.c
@@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754sp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -80,9 +92,7 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
return ys ? y : x;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754sp_zero(1);
+ return ieee754sp_zero(xs | ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
SPDNORMX;
@@ -106,16 +116,32 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
else if (xs < ys)
return y;
- /* Compare exponent */
- if (xe > ye)
- return y;
- else if (xe < ye)
- return x;
+ /* Signs of inputs are the same, let's compare exponents */
+ if (xs == 0) {
+ /* Inputs are both positive */
+ if (xe > ye)
+ return y;
+ else if (xe < ye)
+ return x;
+ } else {
+ /* Inputs are both negative */
+ if (xe > ye)
+ return x;
+ else if (xe < ye)
+ return y;
+ }
- /* Compare mantissa */
+ /* Signs and exponents of inputs are equal, let's compare mantissas */
+ if (xs == 0) {
+ /* Inputs are both positive, with equal signs and exponents */
+ if (xm <= ym)
+ return x;
+ return y;
+ }
+ /* Inputs are both negative, with equal signs and exponents */
if (xm <= ym)
- return x;
- return y;
+ return y;
+ return x;
}
union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
@@ -147,14 +173,26 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
return ieee754sp_nanxcpt(x);
- /* numbers are preferred to NaNs */
+ /*
+ * Quiet NaN handling
+ */
+
+ /*
+ * The case of both inputs quiet NaNs
+ */
+ case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
+ return x;
+
+ /*
+ * The cases of exactly one input quiet NaN (numbers
+ * are here preferred as returned values to NaNs)
+ */
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
return x;
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
@@ -164,25 +202,25 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
/*
* Infinity and zero handling
*/
+ case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
+ return ieee754sp_inf(xs | ys);
+
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
- return x;
+ return y;
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
- return y;
+ return x;
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
- if (xs == ys)
- return x;
- return ieee754sp_zero(1);
+ return ieee754sp_zero(xs | ys);
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
SPDNORMX;
@@ -207,7 +245,11 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
return x;
/* Compare mantissa */
- if (xm <= ym)
+ if (xm < ym)
+ return x;
+ else if (xm > ym)
+ return y;
+ else if (xs == 1)
return x;
return y;
}
diff --git a/arch/mips/math-emu/sp_maddf.c b/arch/mips/math-emu/sp_maddf.c
index c91d5e5d9b5f..7195fe785d81 100644
--- a/arch/mips/math-emu/sp_maddf.c
+++ b/arch/mips/math-emu/sp_maddf.c
@@ -14,9 +14,6 @@
#include "ieee754sp.h"
-enum maddf_flags {
- maddf_negate_product = 1 << 0,
-};
static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
union ieee754sp y, enum maddf_flags flags)
@@ -24,14 +21,8 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
int re;
int rs;
unsigned rm;
- unsigned short lxm;
- unsigned short hxm;
- unsigned short lym;
- unsigned short hym;
- unsigned lrm;
- unsigned hrm;
- unsigned t;
- unsigned at;
+ uint64_t rm64;
+ uint64_t zm64;
int s;
COMPXSP;
@@ -48,51 +39,35 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
ieee754_clearcx();
- switch (zc) {
- case IEEE754_CLASS_SNAN:
- ieee754_setcx(IEEE754_INVALID_OPERATION);
+ /*
+ * Handle the cases when at least one of x, y or z is a NaN.
+ * Order of precedence is sNaN, qNaN and z, x, y.
+ */
+ if (zc == IEEE754_CLASS_SNAN)
return ieee754sp_nanxcpt(z);
- case IEEE754_CLASS_DNORM:
- SPDNORMZ;
- /* QNAN and ZERO cases are handled separately below */
- }
-
- switch (CLPAIR(xc, yc)) {
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN):
+ if (xc == IEEE754_CLASS_SNAN)
+ return ieee754sp_nanxcpt(x);
+ if (yc == IEEE754_CLASS_SNAN)
return ieee754sp_nanxcpt(y);
+ if (zc == IEEE754_CLASS_QNAN)
+ return z;
+ if (xc == IEEE754_CLASS_QNAN)
+ return x;
+ if (yc == IEEE754_CLASS_QNAN)
+ return y;
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
- case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
- return ieee754sp_nanxcpt(x);
+ if (zc == IEEE754_CLASS_DNORM)
+ SPDNORMZ;
+ /* ZERO z cases are handled separately below */
- case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
- return y;
+ switch (CLPAIR(xc, yc)) {
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
- case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF):
- return x;
/*
* Infinity handling
*/
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
ieee754_setcx(IEEE754_INVALID_OPERATION);
return ieee754sp_indef();
@@ -101,9 +76,27 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- return ieee754sp_inf(xs ^ ys);
+ if ((zc == IEEE754_CLASS_INF) &&
+ ((!(flags & MADDF_NEGATE_PRODUCT) && (zs != (xs ^ ys))) ||
+ ((flags & MADDF_NEGATE_PRODUCT) && (zs == (xs ^ ys))))) {
+ /*
+ * Cases of addition of infinities with opposite signs
+ * or subtraction of infinities with same signs.
+ */
+ ieee754_setcx(IEEE754_INVALID_OPERATION);
+ return ieee754sp_indef();
+ }
+ /*
+ * z is here either not an infinity, or an infinity having the
+ * same sign as product (x*y) (in case of MADDF.D instruction)
+ * or product -(x*y) (in MSUBF.D case). The result must be an
+ * infinity, and its sign is determined only by the value of
+ * (flags & MADDF_NEGATE_PRODUCT) and the signs of x and y.
+ */
+ if (flags & MADDF_NEGATE_PRODUCT)
+ return ieee754sp_inf(1 ^ (xs ^ ys));
+ else
+ return ieee754sp_inf(xs ^ ys);
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
@@ -112,32 +105,42 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
if (zc == IEEE754_CLASS_INF)
return ieee754sp_inf(zs);
- /* Multiplication is 0 so just return z */
+ if (zc == IEEE754_CLASS_ZERO) {
+ /* Handle cases +0 + (-0) and similar ones. */
+ if ((!(flags & MADDF_NEGATE_PRODUCT)
+ && (zs == (xs ^ ys))) ||
+ ((flags & MADDF_NEGATE_PRODUCT)
+ && (zs != (xs ^ ys))))
+ /*
+ * Cases of addition of zeros of equal signs
+ * or subtraction of zeroes of opposite signs.
+ * The sign of the resulting zero is in any
+ * such case determined only by the sign of z.
+ */
+ return z;
+
+ return ieee754sp_zero(ieee754_csr.rm == FPU_CSR_RD);
+ }
+ /* x*y is here 0, and z is not 0, so just return z */
return z;
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
SPDNORMX;
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754sp_inf(zs);
SPDNORMY;
break;
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754sp_inf(zs);
SPDNORMX;
break;
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
- if (zc == IEEE754_CLASS_QNAN)
- return z;
- else if (zc == IEEE754_CLASS_INF)
+ if (zc == IEEE754_CLASS_INF)
return ieee754sp_inf(zs);
/* fall through to real computations */
}
@@ -158,111 +161,93 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
re = xe + ye;
rs = xs ^ ys;
- if (flags & maddf_negate_product)
+ if (flags & MADDF_NEGATE_PRODUCT)
rs ^= 1;
- /* shunt to top of word */
- xm <<= 32 - (SP_FBITS + 1);
- ym <<= 32 - (SP_FBITS + 1);
-
- /*
- * Multiply 32 bits xm, ym to give high 32 bits rm with stickness.
- */
- lxm = xm & 0xffff;
- hxm = xm >> 16;
- lym = ym & 0xffff;
- hym = ym >> 16;
-
- lrm = lxm * lym; /* 16 * 16 => 32 */
- hrm = hxm * hym; /* 16 * 16 => 32 */
-
- t = lxm * hym; /* 16 * 16 => 32 */
- at = lrm + (t << 16);
- hrm += at < lrm;
- lrm = at;
- hrm = hrm + (t >> 16);
+ /* Multiple 24 bit xm and ym to give 48 bit results */
+ rm64 = (uint64_t)xm * ym;
- t = hxm * lym; /* 16 * 16 => 32 */
- at = lrm + (t << 16);
- hrm += at < lrm;
- lrm = at;
- hrm = hrm + (t >> 16);
+ /* Shunt to top of word */
+ rm64 = rm64 << 16;
- rm = hrm | (lrm != 0);
-
- /*
- * Sticky shift down to normal rounding precision.
- */
- if ((int) rm < 0) {
- rm = (rm >> (32 - (SP_FBITS + 1 + 3))) |
- ((rm << (SP_FBITS + 1 + 3)) != 0);
+ /* Put explicit bit at bit 62 if necessary */
+ if ((int64_t) rm64 < 0) {
+ rm64 = rm64 >> 1;
re++;
- } else {
- rm = (rm >> (32 - (SP_FBITS + 1 + 3 + 1))) |
- ((rm << (SP_FBITS + 1 + 3 + 1)) != 0);
}
- assert(rm & (SP_HIDDEN_BIT << 3));
-
- if (zc == IEEE754_CLASS_ZERO)
- return ieee754sp_format(rs, re, rm);
- /* And now the addition */
+ assert(rm64 & (1 << 62));
- assert(zm & SP_HIDDEN_BIT);
+ if (zc == IEEE754_CLASS_ZERO) {
+ /*
+ * Move explicit bit from bit 62 to bit 26 since the
+ * ieee754sp_format code expects the mantissa to be
+ * 27 bits wide (24 + 3 rounding bits).
+ */
+ rm = XSPSRS64(rm64, (62 - 26));
+ return ieee754sp_format(rs, re, rm);
+ }
- /*
- * Provide guard,round and stick bit space.
- */
- zm <<= 3;
+ /* Move explicit bit from bit 23 to bit 62 */
+ zm64 = (uint64_t)zm << (62 - 23);
+ assert(zm64 & (1 << 62));
+ /* Make the exponents the same */
if (ze > re) {
/*
* Have to shift r fraction right to align.
*/
s = ze - re;
- rm = XSPSRS(rm, s);
+ rm64 = XSPSRS64(rm64, s);
re += s;
} else if (re > ze) {
/*
* Have to shift z fraction right to align.
*/
s = re - ze;
- zm = XSPSRS(zm, s);
+ zm64 = XSPSRS64(zm64, s);
ze += s;
}
assert(ze == re);
assert(ze <= SP_EMAX);
+ /* Do the addition */
if (zs == rs) {
/*
- * Generate 28 bit result of adding two 27 bit numbers
- * leaving result in zm, zs and ze.
+ * Generate 64 bit result by adding two 63 bit numbers
+ * leaving result in zm64, zs and ze.
*/
- zm = zm + rm;
-
- if (zm >> (SP_FBITS + 1 + 3)) { /* carry out */
- zm = XSPSRS1(zm);
+ zm64 = zm64 + rm64;
+ if ((int64_t)zm64 < 0) { /* carry out */
+ zm64 = XSPSRS1(zm64);
ze++;
}
} else {
- if (zm >= rm) {
- zm = zm - rm;
+ if (zm64 >= rm64) {
+ zm64 = zm64 - rm64;
} else {
- zm = rm - zm;
+ zm64 = rm64 - zm64;
zs = rs;
}
- if (zm == 0)
+ if (zm64 == 0)
return ieee754sp_zero(ieee754_csr.rm == FPU_CSR_RD);
/*
- * Normalize in extended single precision
+ * Put explicit bit at bit 62 if necessary.
*/
- while ((zm >> (SP_MBITS + 3)) == 0) {
- zm <<= 1;
+ while ((zm64 >> 62) == 0) {
+ zm64 <<= 1;
ze--;
}
-
}
+
+ /*
+ * Move explicit bit from bit 62 to bit 26 since the
+ * ieee754sp_format code expects the mantissa to be
+ * 27 bits wide (24 + 3 rounding bits).
+ */
+ zm = XSPSRS64(zm64, (62 - 26));
+
return ieee754sp_format(zs, ze, zm);
}
@@ -275,5 +260,5 @@ union ieee754sp ieee754sp_maddf(union ieee754sp z, union ieee754sp x,
union ieee754sp ieee754sp_msubf(union ieee754sp z, union ieee754sp x,
union ieee754sp y)
{
- return _sp_maddf(z, x, y, maddf_negate_product);
+ return _sp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
}
diff --git a/arch/mips/math-emu/sp_rint.c b/arch/mips/math-emu/sp_rint.c
new file mode 100644
index 000000000000..70765b17e196
--- /dev/null
+++ b/arch/mips/math-emu/sp_rint.c
@@ -0,0 +1,90 @@
+/* IEEE754 floating point arithmetic
+ * single precision
+ */
+/*
+ * MIPS floating point support
+ * Copyright (C) 1994-2000 Algorithmics Ltd.
+ * Copyright (C) 2017 Imagination Technologies, Ltd.
+ * Author: Aleksandar Markovic <[email protected]>
+ *
+ * This program is free software; you can distribute it and/or modify it
+ * under the terms of the GNU General Public License (Version 2) as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.
+ */
+
+#include "ieee754sp.h"
+
+union ieee754sp ieee754sp_rint(union ieee754sp x)
+{
+ union ieee754sp ret;
+ u32 residue;
+ int sticky;
+ int round;
+ int odd;
+
+ COMPXDP; /* <-- DP needed for 64-bit mantissa tmp */
+
+ ieee754_clearcx();
+
+ EXPLODEXSP;
+ FLUSHXSP;
+
+ if (xc == IEEE754_CLASS_SNAN)
+ return ieee754sp_nanxcpt(x);
+
+ if ((xc == IEEE754_CLASS_QNAN) ||
+ (xc == IEEE754_CLASS_INF) ||
+ (xc == IEEE754_CLASS_ZERO))
+ return x;
+
+ if (xe >= SP_FBITS)
+ return x;
+
+ if (xe < -1) {
+ residue = xm;
+ round = 0;
+ sticky = residue != 0;
+ xm = 0;
+ } else {
+ residue = xm << (xe + 1);
+ residue <<= 31 - SP_FBITS;
+ round = (residue >> 31) != 0;
+ sticky = (residue << 1) != 0;
+ xm >>= SP_FBITS - xe;
+ }
+
+ odd = (xm & 0x1) != 0x0;
+
+ switch (ieee754_csr.rm) {
+ case FPU_CSR_RN: /* toward nearest */
+ if (round && (sticky || odd))
+ xm++;
+ break;
+ case FPU_CSR_RZ: /* toward zero */
+ break;
+ case FPU_CSR_RU: /* toward +infinity */
+ if ((round || sticky) && !xs)
+ xm++;
+ break;
+ case FPU_CSR_RD: /* toward -infinity */
+ if ((round || sticky) && xs)
+ xm++;
+ break;
+ }
+
+ if (round || sticky)
+ ieee754_setcx(IEEE754_INEXACT);
+
+ ret = ieee754sp_flong(xm);
+ SPSIGN(ret) = xs;
+
+ return ret;
+}
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 81d6a15c93d0..6f534b209971 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -37,7 +37,7 @@
#include <asm/cacheflush.h> /* for run_uncached() */
#include <asm/traps.h>
#include <asm/dma-coherence.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
/*
* Bits describing what cache ops an SMP callback function may perform.
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c
index 899e46279902..44ac64d51827 100644
--- a/arch/mips/mm/cache.c
+++ b/arch/mips/mm/cache.c
@@ -20,6 +20,7 @@
#include <asm/processor.h>
#include <asm/cpu.h>
#include <asm/cpu-features.h>
+#include <asm/setup.h>
/* Cache operations. */
void (*flush_cache_all)(void);
@@ -44,7 +45,6 @@ void (*__flush_cache_vunmap)(void);
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
-void (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size);
/* MIPS specific cache operations */
void (*flush_cache_sigtramp)(unsigned long addr);
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
index 8e78251eccc2..c01bd20d0208 100644
--- a/arch/mips/mm/dma-default.c
+++ b/arch/mips/mm/dma-default.c
@@ -127,23 +127,6 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
return gfp | dma_flag;
}
-static void *mips_dma_alloc_noncoherent(struct device *dev, size_t size,
- dma_addr_t * dma_handle, gfp_t gfp)
-{
- void *ret;
-
- gfp = massage_gfp_flags(dev, gfp);
-
- ret = (void *) __get_free_pages(gfp, get_order(size));
-
- if (ret != NULL) {
- memset(ret, 0, size);
- *dma_handle = plat_map_dma_mem(dev, ret, size);
- }
-
- return ret;
-}
-
static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs)
{
@@ -151,13 +134,6 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
struct page *page = NULL;
unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
- /*
- * XXX: seems like the coherent and non-coherent implementations could
- * be consolidated.
- */
- if (attrs & DMA_ATTR_NON_CONSISTENT)
- return mips_dma_alloc_noncoherent(dev, size, dma_handle, gfp);
-
gfp = massage_gfp_flags(dev, gfp);
if (IS_ENABLED(CONFIG_DMA_CMA) && gfpflags_allow_blocking(gfp))
@@ -172,7 +148,8 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
ret = page_address(page);
memset(ret, 0, size);
*dma_handle = plat_map_dma_mem(dev, ret, size);
- if (!plat_device_is_coherent(dev)) {
+ if (!(attrs & DMA_ATTR_NON_CONSISTENT) &&
+ !plat_device_is_coherent(dev)) {
dma_cache_wback_inv((unsigned long) ret, size);
ret = UNCAC_ADDR(ret);
}
@@ -180,14 +157,6 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
return ret;
}
-
-static void mips_dma_free_noncoherent(struct device *dev, size_t size,
- void *vaddr, dma_addr_t dma_handle)
-{
- plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
- free_pages((unsigned long) vaddr, get_order(size));
-}
-
static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
dma_addr_t dma_handle, unsigned long attrs)
{
@@ -195,14 +164,9 @@ static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
struct page *page = NULL;
- if (attrs & DMA_ATTR_NON_CONSISTENT) {
- mips_dma_free_noncoherent(dev, size, vaddr, dma_handle);
- return;
- }
-
plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
- if (!plat_device_is_coherent(dev))
+ if (!(attrs & DMA_ATTR_NON_CONSISTENT) && !plat_device_is_coherent(dev))
addr = CAC_ADDR(addr);
page = virt_to_page((void *) addr);
@@ -409,12 +373,12 @@ static void mips_dma_sync_sg_for_device(struct device *dev,
}
}
-int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
+static int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
{
return 0;
}
-int mips_dma_supported(struct device *dev, u64 mask)
+static int mips_dma_supported(struct device *dev, u64 mask)
{
return plat_dma_supported(dev, mask);
}
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 8ce2983a7015..5f6ea7d746de 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -31,6 +31,7 @@
#include <linux/gfp.h>
#include <linux/kcore.h>
#include <linux/export.h>
+#include <linux/initrd.h>
#include <asm/asm-offsets.h>
#include <asm/bootinfo.h>
diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c
index 28adeabe851f..33d3251ecd37 100644
--- a/arch/mips/mm/mmap.c
+++ b/arch/mips/mm/mmap.c
@@ -7,6 +7,7 @@
* written by Ralf Baechle <[email protected]>
*/
#include <linux/compiler.h>
+#include <linux/elf-randomize.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/mman.h>
diff --git a/arch/mips/mm/sc-mips.c b/arch/mips/mm/sc-mips.c
index c909c3342729..acfb89273dad 100644
--- a/arch/mips/mm/sc-mips.c
+++ b/arch/mips/mm/sc-mips.c
@@ -14,7 +14,7 @@
#include <asm/pgtable.h>
#include <asm/mmu_context.h>
#include <asm/r4kcache.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
/*
* MIPS32/MIPS64 L2 cache handling
@@ -63,34 +63,25 @@ static void mips_sc_prefetch_enable(void)
* prefetching for both code & data, for all ports.
*/
pftctl = read_gcr_l2_pft_control();
- if (pftctl & CM_GCR_L2_PFT_CONTROL_NPFT_MSK) {
- pftctl &= ~CM_GCR_L2_PFT_CONTROL_PAGEMASK_MSK;
- pftctl |= PAGE_MASK & CM_GCR_L2_PFT_CONTROL_PAGEMASK_MSK;
- pftctl |= CM_GCR_L2_PFT_CONTROL_PFTEN_MSK;
+ if (pftctl & CM_GCR_L2_PFT_CONTROL_NPFT) {
+ pftctl &= ~CM_GCR_L2_PFT_CONTROL_PAGEMASK;
+ pftctl |= PAGE_MASK & CM_GCR_L2_PFT_CONTROL_PAGEMASK;
+ pftctl |= CM_GCR_L2_PFT_CONTROL_PFTEN;
write_gcr_l2_pft_control(pftctl);
- pftctl = read_gcr_l2_pft_control_b();
- pftctl |= CM_GCR_L2_PFT_CONTROL_B_PORTID_MSK;
- pftctl |= CM_GCR_L2_PFT_CONTROL_B_CEN_MSK;
- write_gcr_l2_pft_control_b(pftctl);
+ set_gcr_l2_pft_control_b(CM_GCR_L2_PFT_CONTROL_B_PORTID |
+ CM_GCR_L2_PFT_CONTROL_B_CEN);
}
}
static void mips_sc_prefetch_disable(void)
{
- unsigned long pftctl;
-
if (mips_cm_revision() < CM_REV_CM2_5)
return;
- pftctl = read_gcr_l2_pft_control();
- pftctl &= ~CM_GCR_L2_PFT_CONTROL_PFTEN_MSK;
- write_gcr_l2_pft_control(pftctl);
-
- pftctl = read_gcr_l2_pft_control_b();
- pftctl &= ~CM_GCR_L2_PFT_CONTROL_B_PORTID_MSK;
- pftctl &= ~CM_GCR_L2_PFT_CONTROL_B_CEN_MSK;
- write_gcr_l2_pft_control_b(pftctl);
+ clear_gcr_l2_pft_control(CM_GCR_L2_PFT_CONTROL_PFTEN);
+ clear_gcr_l2_pft_control_b(CM_GCR_L2_PFT_CONTROL_B_PORTID |
+ CM_GCR_L2_PFT_CONTROL_B_CEN);
}
static bool mips_sc_prefetch_is_enabled(void)
@@ -101,9 +92,9 @@ static bool mips_sc_prefetch_is_enabled(void)
return false;
pftctl = read_gcr_l2_pft_control();
- if (!(pftctl & CM_GCR_L2_PFT_CONTROL_NPFT_MSK))
+ if (!(pftctl & CM_GCR_L2_PFT_CONTROL_NPFT))
return false;
- return !!(pftctl & CM_GCR_L2_PFT_CONTROL_PFTEN_MSK);
+ return !!(pftctl & CM_GCR_L2_PFT_CONTROL_PFTEN);
}
static struct bcache_ops mips_sc_ops = {
@@ -160,21 +151,21 @@ static int __init mips_sc_probe_cm3(void)
unsigned long cfg = read_gcr_l2_config();
unsigned long sets, line_sz, assoc;
- if (cfg & CM_GCR_L2_CONFIG_BYPASS_MSK)
+ if (cfg & CM_GCR_L2_CONFIG_BYPASS)
return 0;
- sets = cfg & CM_GCR_L2_CONFIG_SET_SIZE_MSK;
- sets >>= CM_GCR_L2_CONFIG_SET_SIZE_SHF;
+ sets = cfg & CM_GCR_L2_CONFIG_SET_SIZE;
+ sets >>= __ffs(CM_GCR_L2_CONFIG_SET_SIZE);
if (sets)
c->scache.sets = 64 << sets;
- line_sz = cfg & CM_GCR_L2_CONFIG_LINE_SIZE_MSK;
- line_sz >>= CM_GCR_L2_CONFIG_LINE_SIZE_SHF;
+ line_sz = cfg & CM_GCR_L2_CONFIG_LINE_SIZE;
+ line_sz >>= __ffs(CM_GCR_L2_CONFIG_LINE_SIZE);
if (line_sz)
c->scache.linesz = 2 << line_sz;
- assoc = cfg & CM_GCR_L2_CONFIG_ASSOC_MSK;
- assoc >>= CM_GCR_L2_CONFIG_ASSOC_SHF;
+ assoc = cfg & CM_GCR_L2_CONFIG_ASSOC;
+ assoc >>= __ffs(CM_GCR_L2_CONFIG_ASSOC);
c->scache.ways = assoc + 1;
c->scache.waysize = c->scache.sets * c->scache.linesz;
c->scache.waybit = __ffs(c->scache.waysize);
diff --git a/arch/mips/mm/tlbex-fault.S b/arch/mips/mm/tlbex-fault.S
index 318855eb5f80..77db401fc620 100644
--- a/arch/mips/mm/tlbex-fault.S
+++ b/arch/mips/mm/tlbex-fault.S
@@ -12,14 +12,15 @@
.macro tlb_do_page_fault, write
NESTED(tlb_do_page_fault_\write, PT_SIZE, sp)
- SAVE_ALL
+ .cfi_signal_frame
+ SAVE_ALL docfi=1
MFC0 a2, CP0_BADVADDR
KMODE
move a0, sp
REG_S a2, PT_BVADDR(sp)
li a1, \write
- PTR_LA ra, ret_from_exception
- j do_page_fault
+ jal do_page_fault
+ j ret_from_exception
END(tlb_do_page_fault_\write)
.endm
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index 5aadc69c8ce3..79b9f2ad3ff5 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -2634,11 +2634,6 @@ void build_tlb_refill_handler(void)
#endif
break;
- case CPU_R6000:
- case CPU_R6000A:
- panic("No R6000 TLB refill handler yet");
- break;
-
case CPU_R8000:
panic("No R8000 TLB refill handler yet");
break;
diff --git a/arch/mips/mti-malta/malta-dtshim.c b/arch/mips/mti-malta/malta-dtshim.c
index c398582c316f..a6699c15277d 100644
--- a/arch/mips/mti-malta/malta-dtshim.c
+++ b/arch/mips/mti-malta/malta-dtshim.c
@@ -18,7 +18,7 @@
#include <asm/fw/fw.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/malta.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/page.h>
#define ROCIT_REG_BASE 0x1f403000
@@ -236,7 +236,7 @@ static void __init remove_gic(void *fdt)
/* if we have a CM which reports a GIC is present, leave the DT alone */
err = mips_cm_probe();
- if (!err && (read_gcr_gic_status() & CM_GCR_GIC_STATUS_GICEX_MSK))
+ if (!err && (read_gcr_gic_status() & CM_GCR_GIC_STATUS_EX))
return;
if (malta_scon() == MIPS_REVISION_SCON_ROCIT) {
diff --git a/arch/mips/mti-malta/malta-init.c b/arch/mips/mti-malta/malta-init.c
index 0f3b881a3190..009f2918b320 100644
--- a/arch/mips/mti-malta/malta-init.c
+++ b/arch/mips/mti-malta/malta-init.c
@@ -21,8 +21,7 @@
#include <asm/smp-ops.h>
#include <asm/traps.h>
#include <asm/fw/fw.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/malta.h>
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
index b0f9b188e833..a840e0c1642c 100644
--- a/arch/mips/mti-malta/malta-int.c
+++ b/arch/mips/mti-malta/malta-int.c
@@ -19,7 +19,6 @@
#include <linux/smp.h>
#include <linux/interrupt.h>
#include <linux/io.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/of_irq.h>
#include <linux/kernel_stat.h>
#include <linux/kernel.h>
@@ -29,9 +28,9 @@
#include <asm/i8259.h>
#include <asm/irq_cpu.h>
#include <asm/irq_regs.h>
-#include <asm/mips-cm.h>
#include <asm/mips-boards/malta.h>
#include <asm/mips-boards/maltaint.h>
+#include <asm/mips-cps.h>
#include <asm/gt64120.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/msc01_pci.h>
@@ -215,7 +214,7 @@ void __init arch_init_irq(void)
msc_nr_irqs);
}
- if (gic_present) {
+ if (mips_gic_present()) {
corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
} else if (cpu_has_veic) {
set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch);
diff --git a/arch/mips/mti-malta/malta-setup.c b/arch/mips/mti-malta/malta-setup.c
index a01d5debfcaf..de34adb76157 100644
--- a/arch/mips/mti-malta/malta-setup.c
+++ b/arch/mips/mti-malta/malta-setup.c
@@ -28,7 +28,7 @@
#include <asm/fw/fw.h>
#include <asm/mach-malta/malta-dtshim.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/malta.h>
#include <asm/mips-boards/maltaint.h>
@@ -128,7 +128,7 @@ static int __init plat_enable_iocoherency(void)
BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
pr_info("Enabled Bonito IOBC coherency\n");
}
- } else if (mips_cm_numiocu() != 0) {
+ } else if (mips_cps_numiocu(0) != 0) {
/* Nothing special needs to be done to enable coherency */
pr_info("CMP IOCU detected\n");
cfg = __raw_readl((u32 *)CKSEG1ADDR(ROCIT_CONFIG_GEN0));
diff --git a/arch/mips/mti-malta/malta-time.c b/arch/mips/mti-malta/malta-time.c
index cea4ec909806..66c866740ff2 100644
--- a/arch/mips/mti-malta/malta-time.c
+++ b/arch/mips/mti-malta/malta-time.c
@@ -26,7 +26,6 @@
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/timex.h>
#include <linux/mc146818rtc.h>
@@ -40,6 +39,7 @@
#include <asm/time.h>
#include <asm/mc146818-time.h>
#include <asm/msc01_ic.h>
+#include <asm/mips-cps.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/maltaint.h>
@@ -85,8 +85,8 @@ static void __init estimate_frequencies(void)
local_irq_save(flags);
- if (gic_present)
- gic_start_count();
+ if (mips_gic_present())
+ clear_gic_config(GIC_CONFIG_COUNTSTOP);
/*
* Read counters exactly on rising edge of update flag.
@@ -95,8 +95,8 @@ static void __init estimate_frequencies(void)
while (CMOS_READ(RTC_REG_A) & RTC_UIP);
while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
start = read_c0_count();
- if (gic_present)
- gicstart = gic_read_count();
+ if (mips_gic_present())
+ gicstart = read_gic_counter();
/* Wait for falling edge before reading RTC. */
while (CMOS_READ(RTC_REG_A) & RTC_UIP);
@@ -105,8 +105,8 @@ static void __init estimate_frequencies(void)
/* Read counters again exactly on rising edge of update flag. */
while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
count = read_c0_count();
- if (gic_present)
- giccount = gic_read_count();
+ if (mips_gic_present())
+ giccount = read_gic_counter();
/* Wait for falling edge before reading RTC again. */
while (CMOS_READ(RTC_REG_A) & RTC_UIP);
@@ -128,7 +128,7 @@ static void __init estimate_frequencies(void)
count /= secs;
mips_hpt_frequency = count;
- if (gic_present) {
+ if (mips_gic_present()) {
giccount = div_u64(giccount - gicstart, secs);
gic_frequency = giccount;
}
@@ -154,7 +154,7 @@ int get_c0_fdc_int(void)
if (cpu_has_veic)
return -1;
- else if (gic_present)
+ else if (mips_gic_present())
return gic_get_c0_fdc_int();
else if (cp0_fdc_irq >= 0)
return MIPS_CPU_IRQ_BASE + cp0_fdc_irq;
@@ -167,7 +167,7 @@ int get_c0_perfcount_int(void)
if (cpu_has_veic) {
set_vi_handler(MSC01E_INT_PERFCTR, mips_perf_dispatch);
mips_cpu_perf_irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR;
- } else if (gic_present) {
+ } else if (mips_gic_present()) {
mips_cpu_perf_irq = gic_get_c0_perfcount_int();
} else if (cp0_perfcount_irq >= 0) {
mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
@@ -184,7 +184,7 @@ unsigned int get_c0_compare_int(void)
if (cpu_has_veic) {
set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
- } else if (gic_present) {
+ } else if (mips_gic_present()) {
mips_cpu_timer_irq = gic_get_c0_compare_int();
} else {
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
@@ -258,8 +258,7 @@ void __init plat_time_init(void)
setup_pit_timer();
#endif
-#ifdef CONFIG_MIPS_GIC
- if (gic_present) {
+ if (mips_gic_present()) {
freq = freqround(gic_frequency, 5000);
printk("GIC frequency %d.%02d MHz\n", freq/1000000,
(freq%1000000)*100/1000000);
@@ -268,5 +267,4 @@ void __init plat_time_init(void)
timer_probe();
#endif
}
-#endif
}
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
index bddf1ef553a4..39a300bd6cc2 100644
--- a/arch/mips/netlogic/common/smp.c
+++ b/arch/mips/netlogic/common/smp.c
@@ -122,7 +122,7 @@ static void nlm_init_secondary(void)
int hwtid;
hwtid = hard_smp_processor_id();
- current_cpu_data.core = hwtid / NLM_THREADS_PER_CORE;
+ cpu_set_core(&current_cpu_data, hwtid / NLM_THREADS_PER_CORE);
current_cpu_data.package = nlm_nodeid();
nlm_percpu_init(hwtid);
nlm_smp_irq_init(hwtid);
@@ -147,7 +147,7 @@ unsigned long nlm_next_gp;
unsigned long nlm_next_sp;
static cpumask_t phys_cpu_present_mask;
-void nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
+int nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
{
uint64_t picbase;
int hwtid;
@@ -161,6 +161,8 @@ void nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
/* barrier for sp/gp store above */
__sync();
nlm_pic_send_ipi(picbase, hwtid, 1, 1); /* NMI */
+
+ return 0;
}
void __init nlm_smp_setup(void)
@@ -272,7 +274,7 @@ int nlm_wakeup_secondary_cpus(void)
return 0;
}
-struct plat_smp_ops nlm_smp_ops = {
+const struct plat_smp_ops nlm_smp_ops = {
.send_ipi_single = nlm_send_ipi_single,
.send_ipi_mask = nlm_send_ipi_mask,
.init_secondary = nlm_init_secondary,
diff --git a/arch/mips/netlogic/xlr/platform-flash.c b/arch/mips/netlogic/xlr/platform-flash.c
index f03131fec41d..4d1b4c003376 100644
--- a/arch/mips/netlogic/xlr/platform-flash.c
+++ b/arch/mips/netlogic/xlr/platform-flash.c
@@ -19,7 +19,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/physmap.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <asm/netlogic/haldefs.h>
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c
index c57da6f13929..c3e4c18ef8d4 100644
--- a/arch/mips/oprofile/op_model_mipsxx.c
+++ b/arch/mips/oprofile/op_model_mipsxx.c
@@ -38,9 +38,9 @@ static int perfcount_irq;
#ifdef CONFIG_MIPS_MT_SMP
static int cpu_has_mipsmt_pertccounters;
#define WHAT (MIPS_PERFCTRL_MT_EN_VPE | \
- M_PERFCTL_VPEID(cpu_data[smp_processor_id()].vpe_id))
+ M_PERFCTL_VPEID(cpu_vpe_id(&current_cpu_data)))
#define vpe_id() (cpu_has_mipsmt_pertccounters ? \
- 0 : cpu_data[smp_processor_id()].vpe_id)
+ 0 : cpu_vpe_id(&current_cpu_data))
/*
* The number of bits to shift to convert between counters per core and
diff --git a/arch/mips/paravirt/paravirt-smp.c b/arch/mips/paravirt/paravirt-smp.c
index 72eb1a56c645..107d9f90d668 100644
--- a/arch/mips/paravirt/paravirt-smp.c
+++ b/arch/mips/paravirt/paravirt-smp.c
@@ -100,11 +100,12 @@ static void paravirt_smp_finish(void)
local_irq_enable();
}
-static void paravirt_boot_secondary(int cpu, struct task_struct *idle)
+static int paravirt_boot_secondary(int cpu, struct task_struct *idle)
{
paravirt_smp_gp[cpu] = (unsigned long)task_thread_info(idle);
smp_wmb();
paravirt_smp_sp[cpu] = __KSTK_TOS(idle);
+ return 0;
}
static irqreturn_t paravirt_reched_interrupt(int irq, void *dev_id)
@@ -133,7 +134,7 @@ static void paravirt_prepare_cpus(unsigned int max_cpus)
}
}
-struct plat_smp_ops paravirt_smp_ops = {
+const struct plat_smp_ops paravirt_smp_ops = {
.send_ipi_single = paravirt_send_ipi_single,
.send_ipi_mask = paravirt_send_ipi_mask,
.init_secondary = paravirt_init_secondary,
diff --git a/arch/mips/paravirt/setup.c b/arch/mips/paravirt/setup.c
index cb8448b373a7..d2ffec1409a7 100644
--- a/arch/mips/paravirt/setup.c
+++ b/arch/mips/paravirt/setup.c
@@ -14,7 +14,7 @@
#include <asm/smp-ops.h>
#include <asm/time.h>
-extern struct plat_smp_ops paravirt_smp_ops;
+extern const struct plat_smp_ops paravirt_smp_ops;
const char *get_system_type(void)
{
diff --git a/arch/mips/pci/fixup-capcella.c b/arch/mips/pci/fixup-capcella.c
index 1c02f5737367..b4c263f16b15 100644
--- a/arch/mips/pci/fixup-capcella.c
+++ b/arch/mips/pci/fixup-capcella.c
@@ -32,13 +32,13 @@
#define INTC PC104PLUS_INTC_IRQ
#define INTD PC104PLUS_INTD_IRQ
-static char irq_tab_capcella[][5] __initdata = {
+static char irq_tab_capcella[][5] = {
[11] = { -1, INT1, INT1, INT1, INT1 },
[12] = { -1, INT2, INT2, INT2, INT2 },
[14] = { -1, INTA, INTB, INTC, INTD }
};
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return irq_tab_capcella[slot][pin];
}
diff --git a/arch/mips/pci/fixup-cobalt.c b/arch/mips/pci/fixup-cobalt.c
index b3ab59318d91..44be65c3e6bb 100644
--- a/arch/mips/pci/fixup-cobalt.c
+++ b/arch/mips/pci/fixup-cobalt.c
@@ -147,7 +147,7 @@ static void qube_raq_via_board_id_fixup(struct pci_dev *dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0,
qube_raq_via_board_id_fixup);
-static char irq_tab_qube1[] __initdata = {
+static char irq_tab_qube1[] = {
[COBALT_PCICONF_CPU] = 0,
[COBALT_PCICONF_ETH0] = QUBE1_ETH0_IRQ,
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
@@ -156,7 +156,7 @@ static char irq_tab_qube1[] __initdata = {
[COBALT_PCICONF_ETH1] = 0
};
-static char irq_tab_cobalt[] __initdata = {
+static char irq_tab_cobalt[] = {
[COBALT_PCICONF_CPU] = 0,
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
@@ -165,7 +165,7 @@ static char irq_tab_cobalt[] __initdata = {
[COBALT_PCICONF_ETH1] = ETH1_IRQ
};
-static char irq_tab_raq2[] __initdata = {
+static char irq_tab_raq2[] = {
[COBALT_PCICONF_CPU] = 0,
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
[COBALT_PCICONF_RAQSCSI] = RAQ2_SCSI_IRQ,
@@ -174,7 +174,7 @@ static char irq_tab_raq2[] __initdata = {
[COBALT_PCICONF_ETH1] = ETH1_IRQ
};
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
return irq_tab_qube1[slot];
diff --git a/arch/mips/pci/fixup-emma2rh.c b/arch/mips/pci/fixup-emma2rh.c
index 19caf775c206..c31cb6af1cd0 100644
--- a/arch/mips/pci/fixup-emma2rh.c
+++ b/arch/mips/pci/fixup-emma2rh.c
@@ -43,7 +43,7 @@
*/
#define MAX_SLOT_NUM 10
-static unsigned char irq_map[][5] __initdata = {
+static unsigned char irq_map[][5] = {
[3] = {0, MARKEINS_PCI_IRQ_INTB, MARKEINS_PCI_IRQ_INTC,
MARKEINS_PCI_IRQ_INTD, 0,},
[4] = {0, MARKEINS_PCI_IRQ_INTA, 0, 0, 0,},
@@ -85,7 +85,7 @@ static void emma2rh_pci_host_fixup(struct pci_dev *dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_EMMA2RH,
emma2rh_pci_host_fixup);
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return irq_map[slot][pin];
}
diff --git a/arch/mips/pci/fixup-fuloong2e.c b/arch/mips/pci/fixup-fuloong2e.c
index 50da773faede..b47c2771dc99 100644
--- a/arch/mips/pci/fixup-fuloong2e.c
+++ b/arch/mips/pci/fixup-fuloong2e.c
@@ -19,7 +19,7 @@
/* South bridge slot number is set by the pci probe process */
static u8 sb_slot = 5;
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int irq = 0;
diff --git a/arch/mips/pci/fixup-ip32.c b/arch/mips/pci/fixup-ip32.c
index 133685e215ee..c6ec18a07e63 100644
--- a/arch/mips/pci/fixup-ip32.c
+++ b/arch/mips/pci/fixup-ip32.c
@@ -21,7 +21,7 @@
#define INTB MACEPCI_SHARED0_IRQ
#define INTC MACEPCI_SHARED1_IRQ
#define INTD MACEPCI_SHARED2_IRQ
-static char irq_tab_mace[][5] __initdata = {
+static char irq_tab_mace[][5] = {
/* Dummy INT#A INT#B INT#C INT#D */
{0, 0, 0, 0, 0}, /* This is placeholder row - never used */
{0, SCSI0, SCSI0, SCSI0, SCSI0},
@@ -39,7 +39,7 @@ static char irq_tab_mace[][5] __initdata = {
* irqs. I suppose a device without a pin A will thank us for doing it
* right if there exists such a broken piece of crap.
*/
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return irq_tab_mace[slot][pin];
}
diff --git a/arch/mips/pci/fixup-jmr3927.c b/arch/mips/pci/fixup-jmr3927.c
index 0f1069527cba..d3102eeea898 100644
--- a/arch/mips/pci/fixup-jmr3927.c
+++ b/arch/mips/pci/fixup-jmr3927.c
@@ -31,7 +31,7 @@
#include <asm/txx9/pci.h>
#include <asm/txx9/jmr3927.h>
-int __init jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
unsigned char irq = pin;
diff --git a/arch/mips/pci/fixup-lantiq.c b/arch/mips/pci/fixup-lantiq.c
index 2b5427d3f35c..81530a13b349 100644
--- a/arch/mips/pci/fixup-lantiq.c
+++ b/arch/mips/pci/fixup-lantiq.c
@@ -23,7 +23,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
return 0;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return of_irq_parse_and_map_pci(dev, slot, pin);
}
diff --git a/arch/mips/pci/fixup-lemote2f.c b/arch/mips/pci/fixup-lemote2f.c
index 95ab9a1bd010..20cdfdc08938 100644
--- a/arch/mips/pci/fixup-lemote2f.c
+++ b/arch/mips/pci/fixup-lemote2f.c
@@ -30,7 +30,7 @@
#define PCID 7
/* all the pci device has the PCIA pin, check the datasheet. */
-static char irq_tab[][5] __initdata = {
+static char irq_tab[][5] = {
/* INTA INTB INTC INTD */
{0, 0, 0, 0, 0}, /* 11: Unused */
{0, 0, 0, 0, 0}, /* 12: Unused */
@@ -51,7 +51,7 @@ static char irq_tab[][5] __initdata = {
{0, 0, 0, 0, 0}, /* 27: Unused */
};
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int virq;
diff --git a/arch/mips/pci/fixup-loongson3.c b/arch/mips/pci/fixup-loongson3.c
index 2b6d5e196f99..8a741c2c6685 100644
--- a/arch/mips/pci/fixup-loongson3.c
+++ b/arch/mips/pci/fixup-loongson3.c
@@ -32,7 +32,7 @@ static void print_fixup_info(const struct pci_dev *pdev)
pdev->vendor, pdev->device, pdev->irq);
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
print_fixup_info(dev);
return dev->irq;
diff --git a/arch/mips/pci/fixup-malta.c b/arch/mips/pci/fixup-malta.c
index 40e920c653cc..3ec85331795e 100644
--- a/arch/mips/pci/fixup-malta.c
+++ b/arch/mips/pci/fixup-malta.c
@@ -12,7 +12,7 @@
static char pci_irq[5] = {
};
-static char irq_tab[][5] __initdata = {
+static char irq_tab[][5] = {
/* INTA INTB INTC INTD */
{0, 0, 0, 0, 0 }, /* 0: GT64120 PCI bridge */
{0, 0, 0, 0, 0 }, /* 1: Unused */
@@ -38,7 +38,7 @@ static char irq_tab[][5] __initdata = {
{0, PCID, PCIA, PCIB, PCIC } /* 21: PCI Slot 4 */
};
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int virq;
virq = irq_tab[slot][pin];
diff --git a/arch/mips/pci/fixup-mpc30x.c b/arch/mips/pci/fixup-mpc30x.c
index 8e4f8288eca2..66eaf456bc89 100644
--- a/arch/mips/pci/fixup-mpc30x.c
+++ b/arch/mips/pci/fixup-mpc30x.c
@@ -22,19 +22,19 @@
#include <asm/vr41xx/mpc30x.h>
-static const int internal_func_irqs[] __initconst = {
+static const int internal_func_irqs[] = {
VRC4173_CASCADE_IRQ,
VRC4173_AC97_IRQ,
VRC4173_USB_IRQ,
};
-static const int irq_tab_mpc30x[] __initconst = {
+static const int irq_tab_mpc30x[] = {
[12] = VRC4173_PCMCIA1_IRQ,
[13] = VRC4173_PCMCIA2_IRQ,
[29] = MQ200_IRQ,
};
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
if (slot == 30)
return internal_func_irqs[PCI_FUNC(dev->devfn)];
diff --git a/arch/mips/pci/fixup-pmcmsp.c b/arch/mips/pci/fixup-pmcmsp.c
index fab405c21c2f..4ad2ef02087b 100644
--- a/arch/mips/pci/fixup-pmcmsp.c
+++ b/arch/mips/pci/fixup-pmcmsp.c
@@ -47,7 +47,7 @@
#if defined(CONFIG_PMC_MSP7120_GW)
/* Garibaldi Board IRQ wiring to PCI slots */
-static char irq_tab[][5] __initdata = {
+static char irq_tab[][5] = {
/* INTA INTB INTC INTD */
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
@@ -86,7 +86,7 @@ static char irq_tab[][5] __initdata = {
#elif defined(CONFIG_PMC_MSP7120_EVAL)
/* MSP7120 Eval Board IRQ wiring to PCI slots */
-static char irq_tab[][5] __initdata = {
+static char irq_tab[][5] = {
/* INTA INTB INTC INTD */
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
@@ -125,7 +125,7 @@ static char irq_tab[][5] __initdata = {
#else
/* Unknown board -- don't assign any IRQs */
-static char irq_tab[][5] __initdata = {
+static char irq_tab[][5] = {
/* INTA INTB INTC INTD */
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
@@ -202,7 +202,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
* RETURNS: IRQ number
*
****************************************************************************/
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
#if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)
printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n");
diff --git a/arch/mips/pci/fixup-rbtx4927.c b/arch/mips/pci/fixup-rbtx4927.c
index 321db265829c..d6aaed1d6be9 100644
--- a/arch/mips/pci/fixup-rbtx4927.c
+++ b/arch/mips/pci/fixup-rbtx4927.c
@@ -36,7 +36,7 @@
#include <asm/txx9/pci.h>
#include <asm/txx9/rbtx4927.h>
-int __init rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
unsigned char irq = pin;
diff --git a/arch/mips/pci/fixup-rbtx4938.c b/arch/mips/pci/fixup-rbtx4938.c
index a80579af609b..ff22a22db73e 100644
--- a/arch/mips/pci/fixup-rbtx4938.c
+++ b/arch/mips/pci/fixup-rbtx4938.c
@@ -13,7 +13,7 @@
#include <asm/txx9/pci.h>
#include <asm/txx9/rbtx4938.h>
-int __init rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int irq = tx4938_pcic1_map_irq(dev, slot);
diff --git a/arch/mips/pci/fixup-sni.c b/arch/mips/pci/fixup-sni.c
index f67ebeeb4200..adb9a58641e8 100644
--- a/arch/mips/pci/fixup-sni.c
+++ b/arch/mips/pci/fixup-sni.c
@@ -40,7 +40,7 @@
* seem to be a documentation error. At least on my RM200C the Cirrus
* Logic CL-GD5434 VGA is device 3.
*/
-static char irq_tab_rm200[8][5] __initdata = {
+static char irq_tab_rm200[8][5] = {
/* INTA INTB INTC INTD */
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
@@ -57,7 +57,7 @@ static char irq_tab_rm200[8][5] __initdata = {
*
* The VGA card is optional for RM300 systems.
*/
-static char irq_tab_rm300d[8][5] __initdata = {
+static char irq_tab_rm300d[8][5] = {
/* INTA INTB INTC INTD */
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
@@ -69,7 +69,7 @@ static char irq_tab_rm300d[8][5] __initdata = {
{ 0, INTD, INTA, INTB, INTC }, /* Slot 4 */
};
-static char irq_tab_rm300e[5][5] __initdata = {
+static char irq_tab_rm300e[5][5] = {
/* INTA INTB INTC INTD */
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
@@ -96,7 +96,7 @@ static char irq_tab_rm300e[5][5] __initdata = {
#define INTC PCIT_IRQ_INTC
#define INTD PCIT_IRQ_INTD
-static char irq_tab_pcit[13][5] __initdata = {
+static char irq_tab_pcit[13][5] = {
/* INTA INTB INTC INTD */
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
{ SCSI0, SCSI0, SCSI0, SCSI0, SCSI0 }, /* SCSI */
@@ -113,7 +113,7 @@ static char irq_tab_pcit[13][5] __initdata = {
{ 0, INTA, INTB, INTC, INTD }, /* Slot 5 */
};
-static char irq_tab_pcit_cplus[13][5] __initdata = {
+static char irq_tab_pcit_cplus[13][5] = {
/* INTA INTB INTC INTD */
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
{ 0, INTB, INTC, INTD, INTA }, /* PCI Slot 9 */
@@ -130,7 +130,7 @@ static inline int is_rm300_revd(void)
return (csmsr & 0xa0) == 0x20;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
switch (sni_brd_type) {
case SNI_BRD_PCI_TOWER_CPLUS:
diff --git a/arch/mips/pci/fixup-tb0219.c b/arch/mips/pci/fixup-tb0219.c
index d0b0083fbd27..cc581535f257 100644
--- a/arch/mips/pci/fixup-tb0219.c
+++ b/arch/mips/pci/fixup-tb0219.c
@@ -23,7 +23,7 @@
#include <asm/vr41xx/tb0219.h>
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int irq = -1;
diff --git a/arch/mips/pci/fixup-tb0226.c b/arch/mips/pci/fixup-tb0226.c
index 4196ccf3ea3d..b827b5cad5fd 100644
--- a/arch/mips/pci/fixup-tb0226.c
+++ b/arch/mips/pci/fixup-tb0226.c
@@ -23,7 +23,7 @@
#include <asm/vr41xx/giu.h>
#include <asm/vr41xx/tb0226.h>
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int irq = -1;
diff --git a/arch/mips/pci/fixup-tb0287.c b/arch/mips/pci/fixup-tb0287.c
index 8c5039ed75d7..98f26285f2e3 100644
--- a/arch/mips/pci/fixup-tb0287.c
+++ b/arch/mips/pci/fixup-tb0287.c
@@ -22,7 +22,7 @@
#include <asm/vr41xx/tb0287.h>
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
unsigned char bus;
int irq = -1;
diff --git a/arch/mips/pci/pci-alchemy.c b/arch/mips/pci/pci-alchemy.c
index e99ca7702d8a..f15ec98de2de 100644
--- a/arch/mips/pci/pci-alchemy.c
+++ b/arch/mips/pci/pci-alchemy.c
@@ -522,7 +522,7 @@ static int __init alchemy_pci_init(void)
arch_initcall(alchemy_pci_init);
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
struct alchemy_pci_context *ctx = dev->sysdata;
if (ctx && ctx->board_map_irq)
diff --git a/arch/mips/pci/pci-bcm47xx.c b/arch/mips/pci/pci-bcm47xx.c
index 76f16eaed0ad..230d7dd273e2 100644
--- a/arch/mips/pci/pci-bcm47xx.c
+++ b/arch/mips/pci/pci-bcm47xx.c
@@ -28,7 +28,7 @@
#include <linux/bcma/bcma.h>
#include <bcm47xx.h>
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return 0;
}
diff --git a/arch/mips/pci/pci-lasat.c b/arch/mips/pci/pci-lasat.c
index 40d2797d2bc4..47f4ee6bbb3b 100644
--- a/arch/mips/pci/pci-lasat.c
+++ b/arch/mips/pci/pci-lasat.c
@@ -61,7 +61,7 @@ arch_initcall(lasat_pci_setup);
#define LASAT_IRQ_PCIC (LASAT_IRQ_BASE + 7)
#define LASAT_IRQ_PCID (LASAT_IRQ_BASE + 8)
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
switch (slot) {
case 1:
diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
index fc7726088103..0c65c38e05d6 100644
--- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c
@@ -139,7 +139,7 @@ void pci_load_of_ranges(struct pci_controller *hose, struct device_node *node)
struct of_pci_range range;
struct of_pci_range_parser parser;
- pr_info("PCI host bridge %s ranges:\n", node->full_name);
+ pr_info("PCI host bridge %pOF ranges:\n", node);
hose->of_node = node;
if (of_pci_range_parser_init(&parser, node))
diff --git a/arch/mips/pci/pci-malta.c b/arch/mips/pci/pci-malta.c
index cfbbc3e3e914..88e625fb3a47 100644
--- a/arch/mips/pci/pci-malta.c
+++ b/arch/mips/pci/pci-malta.c
@@ -27,7 +27,7 @@
#include <linux/init.h>
#include <asm/gt64120.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/mips-boards/generic.h>
#include <asm/mips-boards/bonito64.h>
#include <asm/mips-boards/msc01_pci.h>
@@ -201,7 +201,7 @@ void __init mips_pcibios_init(void)
msc_mem_resource.start = start & mask;
msc_mem_resource.end = (start & mask) | ~mask;
msc_controller.mem_offset = (start & mask) - (map & mask);
- if (mips_cm_numiocu()) {
+ if (mips_cps_numiocu(0)) {
write_gcr_reg0_base(start);
write_gcr_reg0_mask(mask |
CM_GCR_REGn_MASK_CMTGT_IOCU0);
@@ -213,7 +213,7 @@ void __init mips_pcibios_init(void)
msc_io_resource.end = (map & mask) | ~mask;
msc_controller.io_offset = 0;
ioport_resource.end = ~mask;
- if (mips_cm_numiocu()) {
+ if (mips_cps_numiocu(0)) {
write_gcr_reg1_base(start);
write_gcr_reg1_mask(mask |
CM_GCR_REGn_MASK_CMTGT_IOCU0);
diff --git a/arch/mips/pci/pci-mt7620.c b/arch/mips/pci/pci-mt7620.c
index 628c5132b3d8..90fba9bf98da 100644
--- a/arch/mips/pci/pci-mt7620.c
+++ b/arch/mips/pci/pci-mt7620.c
@@ -291,7 +291,7 @@ static int mt7620_pci_probe(struct platform_device *pdev)
IORESOURCE_MEM, 1);
u32 val = 0;
- rstpcie0 = devm_reset_control_get(&pdev->dev, "pcie0");
+ rstpcie0 = devm_reset_control_get_exclusive(&pdev->dev, "pcie0");
if (IS_ERR(rstpcie0))
return PTR_ERR(rstpcie0);
@@ -361,7 +361,7 @@ static int mt7620_pci_probe(struct platform_device *pdev)
return 0;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
u16 cmd;
u32 val;
diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c
index 9ee01936862e..3e92a06fa772 100644
--- a/arch/mips/pci/pci-octeon.c
+++ b/arch/mips/pci/pci-octeon.c
@@ -59,8 +59,7 @@ union octeon_pci_address {
} s;
};
-int __initconst (*octeon_pcibios_map_irq)(const struct pci_dev *dev,
- u8 slot, u8 pin);
+int (*octeon_pcibios_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
/**
@@ -74,7 +73,7 @@ enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
* as it goes through each bridge.
* Returns Interrupt number for the device
*/
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
if (octeon_pcibios_map_irq)
return octeon_pcibios_map_irq(dev, slot, pin);
diff --git a/arch/mips/pci/pci-rt2880.c b/arch/mips/pci/pci-rt2880.c
index d6360fe73d05..711cdccdf65b 100644
--- a/arch/mips/pci/pci-rt2880.c
+++ b/arch/mips/pci/pci-rt2880.c
@@ -181,7 +181,7 @@ static inline void rt2880_pci_write_u32(unsigned long reg, u32 val)
spin_unlock_irqrestore(&rt2880_pci_lock, flags);
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
u16 cmd;
int irq = -1;
diff --git a/arch/mips/pci/pci-rt3883.c b/arch/mips/pci/pci-rt3883.c
index 3520e9b414e7..958899ffe99c 100644
--- a/arch/mips/pci/pci-rt3883.c
+++ b/arch/mips/pci/pci-rt3883.c
@@ -207,8 +207,7 @@ static int rt3883_pci_irq_init(struct device *dev,
irq = irq_of_parse_and_map(rpc->intc_of_node, 0);
if (irq == 0) {
- dev_err(dev, "%s has no IRQ",
- of_node_full_name(rpc->intc_of_node));
+ dev_err(dev, "%pOF has no IRQ", rpc->intc_of_node);
return -EINVAL;
}
@@ -438,8 +437,8 @@ static int rt3883_pci_probe(struct platform_device *pdev)
}
if (!rpc->intc_of_node) {
- dev_err(dev, "%s has no %s child node",
- of_node_full_name(rpc->intc_of_node),
+ dev_err(dev, "%pOF has no %s child node",
+ rpc->intc_of_node,
"interrupt controller");
return -EINVAL;
}
@@ -454,8 +453,8 @@ static int rt3883_pci_probe(struct platform_device *pdev)
}
if (!rpc->pci_controller.of_node) {
- dev_err(dev, "%s has no %s child node",
- of_node_full_name(rpc->intc_of_node),
+ dev_err(dev, "%pOF has no %s child node",
+ rpc->intc_of_node,
"PCI host bridge");
err = -EINVAL;
goto err_put_intc_node;
@@ -565,7 +564,7 @@ err_put_intc_node:
return err;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return of_irq_parse_and_map_pci(dev, slot, pin);
}
diff --git a/arch/mips/pci/pci-tx4938.c b/arch/mips/pci/pci-tx4938.c
index 000c0e1f9ef8..a6418460e3c4 100644
--- a/arch/mips/pci/pci-tx4938.c
+++ b/arch/mips/pci/pci-tx4938.c
@@ -112,7 +112,7 @@ int __init tx4938_pciclk66_setup(void)
return pciclk;
}
-int __init tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
+int tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
{
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4938_pcic1ptr) {
switch (slot) {
diff --git a/arch/mips/pci/pci-tx4939.c b/arch/mips/pci/pci-tx4939.c
index 9d6acc00f348..09a65f7dbe7c 100644
--- a/arch/mips/pci/pci-tx4939.c
+++ b/arch/mips/pci/pci-tx4939.c
@@ -48,7 +48,7 @@ void __init tx4939_report_pci1clk(void)
((pciclk + 50000) / 100000) % 10);
}
-int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
+int tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
{
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4939_pcic1ptr) {
switch (slot) {
@@ -68,7 +68,7 @@ int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
return -1;
}
-int __init tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
int irq = tx4939_pcic1_map_irq(dev, slot);
diff --git a/arch/mips/pci/pci-xlp.c b/arch/mips/pci/pci-xlp.c
index 7babf01600cb..9eff9137f78e 100644
--- a/arch/mips/pci/pci-xlp.c
+++ b/arch/mips/pci/pci-xlp.c
@@ -205,7 +205,7 @@ int xlp_socdev_to_node(const struct pci_dev *lnkdev)
return PCI_SLOT(lnkdev->devfn) / 8;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
struct pci_dev *lnkdev;
int lnkfunc, node;
diff --git a/arch/mips/pci/pci-xlr.c b/arch/mips/pci/pci-xlr.c
index 26d2dabef281..2a1c81a129ba 100644
--- a/arch/mips/pci/pci-xlr.c
+++ b/arch/mips/pci/pci-xlr.c
@@ -315,7 +315,7 @@ static void xls_pcie_ack_b(struct irq_data *d)
}
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
return get_irq_vector(dev);
}
diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c
index ad3584dbc9d7..fd2887415bc8 100644
--- a/arch/mips/pci/pcie-octeon.c
+++ b/arch/mips/pci/pcie-octeon.c
@@ -1464,8 +1464,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
* as it goes through each bridge.
* Returns Interrupt number for the device
*/
-int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev,
- u8 slot, u8 pin)
+int octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
/*
* The EBH5600 board with the PCI to PCIe bridge mistakenly
diff --git a/arch/mips/pistachio/init.c b/arch/mips/pistachio/init.c
index 1c91cad7988f..0b06c953d293 100644
--- a/arch/mips/pistachio/init.c
+++ b/arch/mips/pistachio/init.c
@@ -19,8 +19,7 @@
#include <asm/dma-coherence.h>
#include <asm/fw/fw.h>
#include <asm/mips-boards/generic.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
#include <asm/prom.h>
#include <asm/smp-ops.h>
#include <asm/traps.h>
diff --git a/arch/mips/pistachio/irq.c b/arch/mips/pistachio/irq.c
index 0a6b24c24652..709a8219073a 100644
--- a/arch/mips/pistachio/irq.c
+++ b/arch/mips/pistachio/irq.c
@@ -10,7 +10,6 @@
#include <linux/init.h>
#include <linux/irqchip.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/kernel.h>
#include <asm/cpu-features.h>
diff --git a/arch/mips/pistachio/time.c b/arch/mips/pistachio/time.c
index 17a0f1dec05b..8a6af9b76202 100644
--- a/arch/mips/pistachio/time.c
+++ b/arch/mips/pistachio/time.c
@@ -12,9 +12,9 @@
#include <linux/clk-provider.h>
#include <linux/clocksource.h>
#include <linux/init.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/of.h>
+#include <asm/mips-cps.h>
#include <asm/time.h>
unsigned int get_c0_compare_int(void)
diff --git a/arch/mips/pmcs-msp71xx/msp_smp.c b/arch/mips/pmcs-msp71xx/msp_smp.c
index ffa0f7101a97..2b08242ade62 100644
--- a/arch/mips/pmcs-msp71xx/msp_smp.c
+++ b/arch/mips/pmcs-msp71xx/msp_smp.c
@@ -22,6 +22,8 @@
#include <linux/smp.h>
#include <linux/interrupt.h>
+#include <asm/setup.h>
+
#ifdef CONFIG_MIPS_MT_SMP
#define MIPS_CPU_IPI_RESCHED_IRQ 0 /* SW int 0 for resched */
#define MIPS_CPU_IPI_CALL_IRQ 1 /* SW int 1 for call */
diff --git a/arch/mips/pnx833x/common/platform.c b/arch/mips/pnx833x/common/platform.c
index 7cf4eb50fc72..a7a4e9f5146d 100644
--- a/arch/mips/pnx833x/common/platform.c
+++ b/arch/mips/pnx833x/common/platform.c
@@ -30,7 +30,7 @@
#include <linux/resource.h>
#include <linux/serial.h>
#include <linux/serial_pnx8xxx.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <irq.h>
diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig
index 710b04cf4851..b4627080b828 100644
--- a/arch/mips/ralink/Kconfig
+++ b/arch/mips/ralink/Kconfig
@@ -82,6 +82,16 @@ choice
depends on SOC_MT7620
select BUILTIN_DTB
+ config DTB_OMEGA2P
+ bool "Onion Omega2+"
+ depends on SOC_MT7620
+ select BUILTIN_DTB
+
+ config DTB_VOCORE2
+ bool "VoCore2"
+ depends on SOC_MT7620
+ select BUILTIN_DTB
+
endchoice
endif
diff --git a/arch/mips/ralink/clk.c b/arch/mips/ralink/clk.c
index eb1c61917eb7..1b7df115eb60 100644
--- a/arch/mips/ralink/clk.c
+++ b/arch/mips/ralink/clk.c
@@ -53,6 +53,9 @@ EXPORT_SYMBOL_GPL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
+ if (!clk)
+ return 0;
+
return clk->rate;
}
EXPORT_SYMBOL_GPL(clk_get_rate);
diff --git a/arch/mips/ralink/irq-gic.c b/arch/mips/ralink/irq-gic.c
index 2058280450b5..bda576f2cad8 100644
--- a/arch/mips/ralink/irq-gic.c
+++ b/arch/mips/ralink/irq-gic.c
@@ -11,7 +11,7 @@
#include <linux/of.h>
#include <linux/irqchip.h>
-#include <linux/irqchip/mips-gic.h>
+#include <asm/mips-cps.h>
int get_c0_perfcount_int(void)
{
diff --git a/arch/mips/ralink/mt7621.c b/arch/mips/ralink/mt7621.c
index 0695c2d64e49..1b274742077d 100644
--- a/arch/mips/ralink/mt7621.c
+++ b/arch/mips/ralink/mt7621.c
@@ -12,8 +12,7 @@
#include <asm/mipsregs.h>
#include <asm/smp-ops.h>
-#include <asm/mips-cm.h>
-#include <asm/mips-cpc.h>
+#include <asm/mips-cps.h>
#include <asm/mach-ralink/ralink_regs.h>
#include <asm/mach-ralink/mt7621.h>
@@ -199,7 +198,7 @@ void prom_soc_init(struct ralink_soc_info *soc_info)
mips_cm_probe();
mips_cpc_probe();
- if (mips_cm_numiocu()) {
+ if (mips_cps_numiocu(0)) {
/*
* mips_cm_probe() wipes out bootloader
* config for CM regions and we have to configure them
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c
index 0966adccf520..32ea3e6731d6 100644
--- a/arch/mips/rb532/devices.c
+++ b/arch/mips/rb532/devices.c
@@ -20,7 +20,7 @@
#include <linux/ctype.h>
#include <linux/string.h>
#include <linux/platform_device.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/gpio.h>
diff --git a/arch/mips/sgi-ip27/ip27-smp.c b/arch/mips/sgi-ip27/ip27-smp.c
index 4cd47d23d81a..545446dfe7fa 100644
--- a/arch/mips/sgi-ip27/ip27-smp.c
+++ b/arch/mips/sgi-ip27/ip27-smp.c
@@ -195,7 +195,7 @@ static void ip27_smp_finish(void)
* set sp to the kernel stack of the newly created idle process, gp to the proc
* struct so that current_thread_info() will work.
*/
-static void ip27_boot_secondary(int cpu, struct task_struct *idle)
+static int ip27_boot_secondary(int cpu, struct task_struct *idle)
{
unsigned long gp = (unsigned long)task_thread_info(idle);
unsigned long sp = __KSTK_TOS(idle);
@@ -203,6 +203,7 @@ static void ip27_boot_secondary(int cpu, struct task_struct *idle)
LAUNCH_SLAVE(cputonasid(cpu), cputoslice(cpu),
(launch_proc_t)MAPPED_KERN_RW_TO_K0(smp_bootstrap),
0, (void *) sp, (void *) gp);
+ return 0;
}
static void __init ip27_smp_setup(void)
@@ -231,7 +232,7 @@ static void __init ip27_prepare_cpus(unsigned int max_cpus)
/* We already did everything necessary earlier */
}
-struct plat_smp_ops ip27_smp_ops = {
+const struct plat_smp_ops ip27_smp_ops = {
.send_ipi_single = ip27_send_ipi_single,
.send_ipi_mask = ip27_send_ipi_mask,
.init_secondary = ip27_init_secondary,
diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c
index d0e94ffcc1b8..90c9d1255ad7 100644
--- a/arch/mips/sibyte/bcm1480/smp.c
+++ b/arch/mips/sibyte/bcm1480/smp.c
@@ -117,7 +117,7 @@ static void bcm1480_smp_finish(void)
* Setup the PC, SP, and GP of a secondary processor and start it
* running!
*/
-static void bcm1480_boot_secondary(int cpu, struct task_struct *idle)
+static int bcm1480_boot_secondary(int cpu, struct task_struct *idle)
{
int retval;
@@ -126,6 +126,7 @@ static void bcm1480_boot_secondary(int cpu, struct task_struct *idle)
(unsigned long)task_thread_info(idle), 0);
if (retval != 0)
printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval);
+ return retval;
}
/*
@@ -157,7 +158,7 @@ static void __init bcm1480_prepare_cpus(unsigned int max_cpus)
{
}
-struct plat_smp_ops bcm1480_smp_ops = {
+const struct plat_smp_ops bcm1480_smp_ops = {
.send_ipi_single = bcm1480_send_ipi_single,
.send_ipi_mask = bcm1480_send_ipi_mask,
.init_secondary = bcm1480_init_secondary,
diff --git a/arch/mips/sibyte/common/cfe.c b/arch/mips/sibyte/common/cfe.c
index c1a11a11db7f..115399202eab 100644
--- a/arch/mips/sibyte/common/cfe.c
+++ b/arch/mips/sibyte/common/cfe.c
@@ -229,8 +229,8 @@ static int __init initrd_setup(char *str)
#endif
-extern struct plat_smp_ops sb_smp_ops;
-extern struct plat_smp_ops bcm1480_smp_ops;
+extern const struct plat_smp_ops sb_smp_ops;
+extern const struct plat_smp_ops bcm1480_smp_ops;
/*
* prom_init is called just after the cpu type is determined, from setup_arch()
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c
index 0a4a2c3982d8..5baabca52f25 100644
--- a/arch/mips/sibyte/sb1250/smp.c
+++ b/arch/mips/sibyte/sb1250/smp.c
@@ -106,7 +106,7 @@ static void sb1250_smp_finish(void)
* Setup the PC, SP, and GP of a secondary processor and start it
* running!
*/
-static void sb1250_boot_secondary(int cpu, struct task_struct *idle)
+static int sb1250_boot_secondary(int cpu, struct task_struct *idle)
{
int retval;
@@ -115,6 +115,7 @@ static void sb1250_boot_secondary(int cpu, struct task_struct *idle)
(unsigned long)task_thread_info(idle), 0);
if (retval != 0)
printk("cfe_start_cpu(%i) returned %i\n" , cpu, retval);
+ return retval;
}
/*
@@ -146,7 +147,7 @@ static void __init sb1250_prepare_cpus(unsigned int max_cpus)
{
}
-struct plat_smp_ops sb_smp_ops = {
+const struct plat_smp_ops sb_smp_ops = {
.send_ipi_single = sb1250_send_ipi_single,
.send_ipi_mask = sb1250_send_ipi_mask,
.init_secondary = sb1250_init_secondary,
diff --git a/arch/mips/tools/generic-board-config.sh b/arch/mips/tools/generic-board-config.sh
new file mode 100755
index 000000000000..5c4f93687039
--- /dev/null
+++ b/arch/mips/tools/generic-board-config.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+#
+# Copyright (C) 2017 Imagination Technologies
+# Author: Paul Burton <[email protected]>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This script merges configuration fragments for boards supported by the
+# generic MIPS kernel. It checks each for requirements specified using
+# formatted comments, and then calls merge_config.sh to merge those
+# fragments which have no unmet requirements.
+#
+# An example of requirements in your board config fragment might be:
+#
+# # require CONFIG_CPU_MIPS32_R2=y
+# # require CONFIG_CPU_LITTLE_ENDIAN=y
+#
+# This would mean that your board is only included in kernels which are
+# configured for little endian MIPS32r2 CPUs, and not for example in kernels
+# configured for 64 bit or big endian systems.
+#
+
+srctree="$1"
+objtree="$2"
+ref_cfg="$3"
+cfg="$4"
+boards_origin="$5"
+shift 5
+
+cd "${srctree}"
+
+# Only print Skipping... lines if the user explicitly specified BOARDS=. In the
+# general case it only serves to obscure the useful output about what actually
+# was included.
+case ${boards_origin} in
+"command line")
+ print_skipped=1
+ ;;
+environment*)
+ print_skipped=1
+ ;;
+*)
+ print_skipped=0
+ ;;
+esac
+
+for board in $@; do
+ board_cfg="arch/mips/configs/generic/board-${board}.config"
+ if [ ! -f "${board_cfg}" ]; then
+ echo "WARNING: Board config '${board_cfg}' not found"
+ continue
+ fi
+
+ # For each line beginning with # require, cut out the field following
+ # it & search for that in the reference config file. If the requirement
+ # is not found then the subshell will exit with code 1, and we'll
+ # continue on to the next board.
+ grep -E '^# require ' "${board_cfg}" | \
+ cut -d' ' -f 3- | \
+ while read req; do
+ case ${req} in
+ *=y)
+ # If we require something =y then we check that a line
+ # containing it is present in the reference config.
+ grep -Eq "^${req}\$" "${ref_cfg}" && continue
+ ;;
+ *=n)
+ # If we require something =n then we just invert that
+ # check, considering the requirement met if there isn't
+ # a line containing the value =y in the reference
+ # config.
+ grep -Eq "^${req/%=n/=y}\$" "${ref_cfg}" || continue
+ ;;
+ *)
+ echo "WARNING: Unhandled requirement '${req}'"
+ ;;
+ esac
+
+ [ ${print_skipped} -eq 1 ] && echo "Skipping ${board_cfg}"
+ exit 1
+ done || continue
+
+ # Merge this board config fragment into our final config file
+ ./scripts/kconfig/merge_config.sh \
+ -m -O ${objtree} ${cfg} ${board_cfg} \
+ | grep -Ev '^(#|Using)'
+done
diff --git a/arch/mips/txx9/generic/pci.c b/arch/mips/txx9/generic/pci.c
index 0bd2a1e1ff9a..fb998726bd5d 100644
--- a/arch/mips/txx9/generic/pci.c
+++ b/arch/mips/txx9/generic/pci.c
@@ -386,9 +386,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
return 0;
}
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+static int (*txx9_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
- return txx9_board_vec->pci_map_irq(dev, slot, pin);
+ return txx9_pci_map_irq(dev, slot, pin);
}
char * (*txx9_board_pcibios_setup)(char *str) __initdata;
@@ -424,5 +425,8 @@ char *__init txx9_pcibios_setup(char *str)
txx9_pci_err_action = TXX9_PCI_ERR_IGNORE;
return NULL;
}
+
+ txx9_pci_map_irq = txx9_board_vec->pci_map_irq;
+
return str;
}
diff --git a/arch/mips/vdso/gettimeofday.c b/arch/mips/vdso/gettimeofday.c
index e2690d7ca4dd..e22b422f282c 100644
--- a/arch/mips/vdso/gettimeofday.c
+++ b/arch/mips/vdso/gettimeofday.c
@@ -11,12 +11,10 @@
#include "vdso.h"
#include <linux/compiler.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/time.h>
#include <asm/clocksource.h>
#include <asm/io.h>
-#include <asm/mips-cm.h>
#include <asm/unistd.h>
#include <asm/vdso.h>
@@ -126,9 +124,9 @@ static __always_inline u64 read_gic_count(const union mips_vdso_data *data)
u32 hi, hi2, lo;
do {
- hi = __raw_readl(gic + GIC_UMV_SH_COUNTER_63_32_OFS);
- lo = __raw_readl(gic + GIC_UMV_SH_COUNTER_31_00_OFS);
- hi2 = __raw_readl(gic + GIC_UMV_SH_COUNTER_63_32_OFS);
+ hi = __raw_readl(gic + sizeof(lo));
+ lo = __raw_readl(gic);
+ hi2 = __raw_readl(gic + sizeof(lo));
} while (hi2 != hi);
return (((u64)hi) << 32) + lo;
diff --git a/arch/mips/vdso/sigreturn.S b/arch/mips/vdso/sigreturn.S
index 715bf5993529..30c6219912ac 100644
--- a/arch/mips/vdso/sigreturn.S
+++ b/arch/mips/vdso/sigreturn.S
@@ -19,31 +19,21 @@
.cfi_sections .debug_frame
LEAF(__vdso_rt_sigreturn)
- .cfi_startproc
- .frame sp, 0, ra
- .mask 0x00000000, 0
- .fmask 0x00000000, 0
.cfi_signal_frame
li v0, __NR_rt_sigreturn
syscall
- .cfi_endproc
END(__vdso_rt_sigreturn)
#if _MIPS_SIM == _MIPS_SIM_ABI32
LEAF(__vdso_sigreturn)
- .cfi_startproc
- .frame sp, 0, ra
- .mask 0x00000000, 0
- .fmask 0x00000000, 0
.cfi_signal_frame
li v0, __NR_sigreturn
syscall
- .cfi_endproc
END(__vdso_sigreturn)
#endif
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
index 89e8027e07fb..7c475fd99c46 100644
--- a/arch/mn10300/kernel/process.c
+++ b/arch/mn10300/kernel/process.c
@@ -59,10 +59,6 @@ void arch_cpu_idle(void)
}
#endif
-void release_segments(struct mm_struct *mm)
-{
-}
-
void machine_restart(char *cmd)
{
#ifdef CONFIG_KERNEL_DEBUGGER
@@ -113,14 +109,6 @@ void release_thread(struct task_struct *dead_task)
}
/*
- * we do not have to muck with descriptors here, that is
- * done in switch_mm() as needed.
- */
-void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
-{
-}
-
-/*
* this gets called so that we can store lazy state into memory and copy the
* current task into the new thread.
*/
diff --git a/arch/nios2/boot/dts/3c120_devboard.dts b/arch/nios2/boot/dts/3c120_devboard.dts
index 31c51f9a2f09..36ccdf05837d 100644
--- a/arch/nios2/boot/dts/3c120_devboard.dts
+++ b/arch/nios2/boot/dts/3c120_devboard.dts
@@ -159,6 +159,7 @@
};
chosen {
- bootargs = "debug console=ttyJ0,115200";
+ bootargs = "debug earlycon console=ttyJ0,115200";
+ stdout-path = &jtag_uart;
};
};
diff --git a/arch/nios2/include/asm/dma-mapping.h b/arch/nios2/include/asm/dma-mapping.h
index 7b3c6f280293..f8dc62222741 100644
--- a/arch/nios2/include/asm/dma-mapping.h
+++ b/arch/nios2/include/asm/dma-mapping.h
@@ -18,7 +18,7 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
}
/*
- * dma_alloc_noncoherent() returns non-cacheable memory, so there's no need to
+ * dma_alloc_attrs() always returns non-cacheable memory, so there's no need to
* do any flushing here.
*/
static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
diff --git a/arch/nios2/kernel/time.c b/arch/nios2/kernel/time.c
index 645129aaa9a0..20e86209ef2e 100644
--- a/arch/nios2/kernel/time.c
+++ b/arch/nios2/kernel/time.c
@@ -107,7 +107,10 @@ static struct nios2_clocksource nios2_cs = {
cycles_t get_cycles(void)
{
- return nios2_timer_read(&nios2_cs.cs);
+ /* Only read timer if it has been initialized */
+ if (nios2_cs.timer.base)
+ return nios2_timer_read(&nios2_cs.cs);
+ return 0;
}
EXPORT_SYMBOL(get_cycles);
diff --git a/arch/openrisc/include/asm/pgtable.h b/arch/openrisc/include/asm/pgtable.h
index ff97374ca069..71a6f08de8f2 100644
--- a/arch/openrisc/include/asm/pgtable.h
+++ b/arch/openrisc/include/asm/pgtable.h
@@ -414,6 +414,8 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; /* defined in head.S */
+struct vm_area_struct;
+
/*
* or32 doesn't have any external MMU info: the kernel page
* tables contain all the necessary information.
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index ba7b7ddc3844..a57dedbfc7b7 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -257,6 +257,18 @@ config PARISC_PAGE_SIZE_64KB
endchoice
+config PARISC_SELF_EXTRACT
+ bool "Build kernel as self-extracting executable"
+ default y
+ help
+ Say Y if you want to build the parisc kernel as a kind of
+ self-extracting executable.
+
+ If you say N here, the kernel will be compressed with gzip
+ which can be loaded by the palo bootloader directly too.
+
+ If you don't know what to do here, say Y.
+
config SMP
bool "Symmetric multi-processing support"
---help---
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile
index 58fae5d2449d..01946ebaff72 100644
--- a/arch/parisc/Makefile
+++ b/arch/parisc/Makefile
@@ -129,8 +129,13 @@ Image: vmlinux
bzImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
+ifdef CONFIG_PARISC_SELF_EXTRACT
vmlinuz: bzImage
$(OBJCOPY) $(boot)/bzImage $@
+else
+vmlinuz: vmlinux
+ @gzip -cf -9 $< > $@
+endif
install:
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \
diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile
index 5450a11c9d10..7d7e594bda36 100644
--- a/arch/parisc/boot/compressed/Makefile
+++ b/arch/parisc/boot/compressed/Makefile
@@ -15,7 +15,7 @@ targets += misc.o piggy.o sizes.h head.o real2.o firmware.o
KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
-KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs
+KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs -Os
ifndef CONFIG_64BIT
KBUILD_CFLAGS += -mfast-indirect-calls
endif
diff --git a/arch/parisc/boot/compressed/misc.c b/arch/parisc/boot/compressed/misc.c
index 13a4bf9ac4da..9345b44b86f0 100644
--- a/arch/parisc/boot/compressed/misc.c
+++ b/arch/parisc/boot/compressed/misc.c
@@ -24,7 +24,8 @@
/* Symbols defined by linker scripts */
extern char input_data[];
extern int input_len;
-extern __le32 output_len; /* at unaligned address, little-endian */
+/* output_len is inserted by the linker possibly at an unaligned address */
+extern __le32 output_len __aligned(1);
extern char _text, _end;
extern char _bss, _ebss;
extern char _startcode_end;
diff --git a/arch/parisc/include/asm/pdc.h b/arch/parisc/include/asm/pdc.h
index 26b4455baa83..510341f62d97 100644
--- a/arch/parisc/include/asm/pdc.h
+++ b/arch/parisc/include/asm/pdc.h
@@ -280,6 +280,7 @@ void setup_pdc(void); /* in inventory.c */
/* wrapper-functions from pdc.c */
int pdc_add_valid(unsigned long address);
+int pdc_instr(unsigned int *instr);
int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len);
int pdc_chassis_disp(unsigned long disp);
int pdc_chassis_warn(unsigned long *warn);
diff --git a/arch/parisc/include/asm/smp.h b/arch/parisc/include/asm/smp.h
index a5dc9066c6d8..ad9c9c3b4136 100644
--- a/arch/parisc/include/asm/smp.h
+++ b/arch/parisc/include/asm/smp.h
@@ -1,6 +1,7 @@
#ifndef __ASM_SMP_H
#define __ASM_SMP_H
+extern int init_per_cpu(int cpuid);
#if defined(CONFIG_SMP)
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c
index ab80e5c6f651..6d471c00c71a 100644
--- a/arch/parisc/kernel/firmware.c
+++ b/arch/parisc/kernel/firmware.c
@@ -233,6 +233,26 @@ int pdc_add_valid(unsigned long address)
EXPORT_SYMBOL(pdc_add_valid);
/**
+ * pdc_instr - Get instruction that invokes PDCE_CHECK in HPMC handler.
+ * @instr: Pointer to variable which will get instruction opcode.
+ *
+ * The return value is PDC_OK (0) in case call succeeded.
+ */
+int __init pdc_instr(unsigned int *instr)
+{
+ int retval;
+ unsigned long flags;
+
+ spin_lock_irqsave(&pdc_lock, flags);
+ retval = mem_pdc_call(PDC_INSTR, 0UL, __pa(pdc_result));
+ convert_to_wide(pdc_result);
+ *instr = pdc_result[0];
+ spin_unlock_irqrestore(&pdc_lock, flags);
+
+ return retval;
+}
+
+/**
* pdc_chassis_info - Return chassis information.
* @result: The return buffer.
* @chassis_info: The memory buffer address.
diff --git a/arch/parisc/kernel/pdt.c b/arch/parisc/kernel/pdt.c
index 05730a83895c..00aed082969b 100644
--- a/arch/parisc/kernel/pdt.c
+++ b/arch/parisc/kernel/pdt.c
@@ -15,6 +15,7 @@
#include <linux/memblock.h>
#include <linux/seq_file.h>
#include <linux/kthread.h>
+#include <linux/initrd.h>
#include <asm/pdc.h>
#include <asm/pdcpat.h>
@@ -216,8 +217,16 @@ void __init pdc_pdt_init(void)
}
for (i = 0; i < pdt_status.pdt_entries; i++) {
+ unsigned long addr;
+
report_mem_err(pdt_entry[i]);
+ addr = pdt_entry[i] & PDT_ADDR_PHYS_MASK;
+ if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) &&
+ addr >= initrd_start && addr < initrd_end)
+ pr_crit("CRITICAL: initrd possibly broken "
+ "due to bad memory!\n");
+
/* mark memory page bad */
memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);
}
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c
index a778bd3c107c..e120d63c1b28 100644
--- a/arch/parisc/kernel/processor.c
+++ b/arch/parisc/kernel/processor.c
@@ -317,7 +317,7 @@ void __init collect_boot_cpu_data(void)
*
* o Enable CPU profiling hooks.
*/
-int init_per_cpu(int cpunum)
+int __init init_per_cpu(int cpunum)
{
int ret;
struct pdc_coproc_cfg coproc_cfg;
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c
index dee6f9d6a153..f7d0c3b33d70 100644
--- a/arch/parisc/kernel/setup.c
+++ b/arch/parisc/kernel/setup.c
@@ -38,6 +38,7 @@
#include <linux/export.h>
#include <linux/sched.h>
#include <linux/sched/clock.h>
+#include <linux/start_kernel.h>
#include <asm/processor.h>
#include <asm/sections.h>
@@ -48,6 +49,7 @@
#include <asm/io.h>
#include <asm/setup.h>
#include <asm/unwind.h>
+#include <asm/smp.h>
static char __initdata command_line[COMMAND_LINE_SIZE];
@@ -115,7 +117,6 @@ void __init dma_ops_init(void)
}
#endif
-extern int init_per_cpu(int cpuid);
extern void collect_boot_cpu_data(void);
void __init setup_arch(char **cmdline_p)
@@ -398,9 +399,8 @@ static int __init parisc_init(void)
}
arch_initcall(parisc_init);
-void start_parisc(void)
+void __init start_parisc(void)
{
- extern void start_kernel(void);
extern void early_trap_init(void);
int ret, cpunum;
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c
index 70aaabb8b3cb..9e0cb6a577d6 100644
--- a/arch/parisc/kernel/signal32.c
+++ b/arch/parisc/kernel/signal32.c
@@ -290,25 +290,25 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
if (to->si_code < 0)
err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (to->si_code >> 16) {
- case __SI_CHLD >> 16:
+ switch (siginfo_layout(to->si_signo, to->si_code)) {
+ case SIL_CHLD:
err |= __get_user(to->si_utime, &from->si_utime);
err |= __get_user(to->si_stime, &from->si_stime);
err |= __get_user(to->si_status, &from->si_status);
default:
+ case SIL_KILL:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __get_user(addr, &from->si_addr);
to->si_addr = compat_ptr(addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __get_user(to->si_band, &from->si_band);
err |= __get_user(to->si_fd, &from->si_fd);
break;
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
err |= __get_user(to->si_int, &from->si_int);
@@ -337,41 +337,40 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)
at the same time. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (from->si_code >> 16) {
- case __SI_CHLD >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_CHLD:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
- default:
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
addr = ptr_to_compat(from->si_addr);
err |= __put_user(addr, &to->si_addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
val = (compat_int_t)from->si_int;
err |= __put_user(val, &to->si_int);
break;
- case __SI_RT >> 16: /* Not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_pid, &to->si_pid);
val = (compat_int_t)from->si_int;
err |= __put_user(val, &to->si_int);
break;
- case __SI_SYS >> 16:
+ case SIL_SYS:
err |= __put_user(ptr_to_compat(from->si_call_addr), &to->si_call_addr);
err |= __put_user(from->si_syscall, &to->si_syscall);
err |= __put_user(from->si_arch, &to->si_arch);
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c
index 63365106ea19..30c28ab14540 100644
--- a/arch/parisc/kernel/smp.c
+++ b/arch/parisc/kernel/smp.c
@@ -255,12 +255,11 @@ void arch_send_call_function_single_ipi(int cpu)
static void __init
smp_cpu_init(int cpunum)
{
- extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */
extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */
/* Set modes and Enable floating point coprocessor */
- (void) init_per_cpu(cpunum);
+ init_per_cpu(cpunum);
disable_sr_hashing();
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index 991654c88eec..230333157fe3 100644
--- a/arch/parisc/kernel/traps.c
+++ b/arch/parisc/kernel/traps.c
@@ -817,7 +817,7 @@ void __init initialize_ivt(const void *iva)
u32 check = 0;
u32 *ivap;
u32 *hpmcp;
- u32 length;
+ u32 length, instr;
if (strcmp((const char *)iva, "cows can fly"))
panic("IVT invalid");
@@ -827,6 +827,14 @@ void __init initialize_ivt(const void *iva)
for (i = 0; i < 8; i++)
*ivap++ = 0;
+ /*
+ * Use PDC_INSTR firmware function to get instruction that invokes
+ * PDCE_CHECK in HPMC handler. See programming note at page 1-31 of
+ * the PA 1.1 Firmware Architecture document.
+ */
+ if (pdc_instr(&instr) == PDC_OK)
+ ivap[0] = instr;
+
/* Compute Checksum for HPMC handler */
length = os_hpmc_size;
ivap[7] = length;
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c
index 48dc7d4d20bb..caab39dfa95d 100644
--- a/arch/parisc/kernel/unwind.c
+++ b/arch/parisc/kernel/unwind.c
@@ -14,6 +14,7 @@
#include <linux/slab.h>
#include <linux/kallsyms.h>
#include <linux/sort.h>
+#include <linux/sched.h>
#include <linux/uaccess.h>
#include <asm/assembly.h>
@@ -279,6 +280,17 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
info->prev_sp = sp - 64;
info->prev_ip = 0;
+
+ /* The stack is at the end inside the thread_union
+ * struct. If we reach data, we have reached the
+ * beginning of the stack and should stop unwinding. */
+ if (info->prev_sp >= (unsigned long) task_thread_info(info->t) &&
+ info->prev_sp < ((unsigned long) task_thread_info(info->t)
+ + THREAD_SZ_ALGN)) {
+ info->prev_sp = 0;
+ break;
+ }
+
if (get_user(tmp, (unsigned long *)(info->prev_sp - RP_OFFSET)))
break;
info->prev_ip = tmp;
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
index 5b101f6a5607..e247edbca68e 100644
--- a/arch/parisc/mm/fault.c
+++ b/arch/parisc/mm/fault.c
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/extable.h>
#include <linux/uaccess.h>
+#include <linux/hugetlb.h>
#include <asm/traps.h>
@@ -261,7 +262,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
struct task_struct *tsk;
struct mm_struct *mm;
unsigned long acc_type;
- int fault;
+ int fault = 0;
unsigned int flags;
if (faulthandler_disabled())
@@ -315,7 +316,8 @@ good_area:
goto out_of_memory;
else if (fault & VM_FAULT_SIGSEGV)
goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
+ else if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
+ VM_FAULT_HWPOISON_LARGE))
goto bad_area;
BUG();
}
@@ -352,8 +354,7 @@ bad_area:
if (user_mode(regs)) {
struct siginfo si;
-
- show_signal_msg(regs, code, address, tsk, vma);
+ unsigned int lsb = 0;
switch (code) {
case 15: /* Data TLB miss fault/Data page fault */
@@ -386,6 +387,30 @@ bad_area:
si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR;
break;
}
+
+#ifdef CONFIG_MEMORY_FAILURE
+ if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) {
+ printk(KERN_ERR
+ "MCE: Killing %s:%d due to hardware memory corruption fault at %08lx\n",
+ tsk->comm, tsk->pid, address);
+ si.si_signo = SIGBUS;
+ si.si_code = BUS_MCEERR_AR;
+ }
+#endif
+
+ /*
+ * Either small page or large page may be poisoned.
+ * In other words, VM_FAULT_HWPOISON_LARGE and
+ * VM_FAULT_HWPOISON are mutually exclusive.
+ */
+ if (fault & VM_FAULT_HWPOISON_LARGE)
+ lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
+ else if (fault & VM_FAULT_HWPOISON)
+ lsb = PAGE_SHIFT;
+ else
+ show_signal_msg(regs, code, address, tsk, vma);
+ si.si_addr_lsb = lsb;
+
si.si_errno = 0;
si.si_addr = (void __user *) address;
force_sig_info(si.si_signo, &si, current);
diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig
index e084fa548d73..063817fee61c 100644
--- a/arch/powerpc/configs/g5_defconfig
+++ b/arch/powerpc/configs/g5_defconfig
@@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m
CONFIG_SND_AOA_FABRIC_LAYOUT=m
diff --git a/arch/powerpc/configs/gamecube_defconfig b/arch/powerpc/configs/gamecube_defconfig
index 79bbc8238b32..805b0f87653c 100644
--- a/arch/powerpc/configs/gamecube_defconfig
+++ b/arch/powerpc/configs/gamecube_defconfig
@@ -64,11 +64,12 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_CLUT224 is not set
CONFIG_SOUND=y
CONFIG_SND=y
-CONFIG_SND_SEQUENCER=y
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
-CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PROCFS is not set
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_USB_SUPPORT is not set
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_GENERIC=y
diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig
index 8cf4a46bef86..6daa56f8895c 100644
--- a/arch/powerpc/configs/pasemi_defconfig
+++ b/arch/powerpc/configs/pasemi_defconfig
@@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_LOGO=y
CONFIG_SOUND=y
CONFIG_SND=y
-CONFIG_SND_SEQUENCER=y
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
+CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_USB_AUDIO=y
CONFIG_SND_USB_USX2Y=y
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
index 8e798b1fbc99..1aab9a62a681 100644
--- a/arch/powerpc/configs/pmac32_defconfig
+++ b/arch/powerpc/configs/pmac32_defconfig
@@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_DUMMY=m
CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
index 791db775a09c..6ddca80c52c3 100644
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m
CONFIG_SND_AOA_FABRIC_LAYOUT=m
diff --git a/arch/powerpc/configs/ppc64e_defconfig b/arch/powerpc/configs/ppc64e_defconfig
index d0fe0f8f77c2..41d85cb3c9a2 100644
--- a/arch/powerpc/configs/ppc64e_defconfig
+++ b/arch/powerpc/configs/ppc64e_defconfig
@@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER_OSS=m
CONFIG_HID_DRAGONRISE=y
CONFIG_HID_GYRATION=y
CONFIG_HID_TWINHAN=y
diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig
index ae6eba482d75..da0e8d535eb8 100644
--- a/arch/powerpc/configs/ppc6xx_defconfig
+++ b/arch/powerpc/configs/ppc6xx_defconfig
@@ -789,17 +789,18 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_SOUND=m
CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_DYNAMIC_MINORS=y
# CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y
CONFIG_SND_DEBUG_VERBOSE=y
CONFIG_SND_PCM_XRUN_DEBUG=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_DUMMY=m
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
diff --git a/arch/powerpc/configs/wii_defconfig b/arch/powerpc/configs/wii_defconfig
index aef41b17a8bc..9c7400a19e9d 100644
--- a/arch/powerpc/configs/wii_defconfig
+++ b/arch/powerpc/configs/wii_defconfig
@@ -79,11 +79,12 @@ CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_SOUND=y
CONFIG_SND=y
-CONFIG_SND_SEQUENCER=y
+CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
-CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PROCFS is not set
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_SEQUENCER_OSS=y
CONFIG_HID_APPLE=m
CONFIG_HID_WACOM=m
CONFIG_MMC=y
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
index 26b9994d27ee..43ef25156480 100644
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -341,7 +341,7 @@ int fix_alignment(struct pt_regs *regs)
type = op.type & INSTR_TYPE_MASK;
if (!OP_IS_LOAD_STORE(type)) {
- if (type != CACHEOP + DCBZ)
+ if (op.type != CACHEOP + DCBZ)
return -EINVAL;
PPC_WARN_ALIGNMENT(dcbz, regs);
r = emulate_dcbz(op.ea, regs);
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
index 9e816787c0d4..116000b45531 100644
--- a/arch/powerpc/kernel/eeh.c
+++ b/arch/powerpc/kernel/eeh.c
@@ -1019,6 +1019,10 @@ int eeh_init(void)
} else if ((ret = eeh_ops->init()))
return ret;
+ /* Initialize PHB PEs */
+ list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
+ eeh_dev_phb_init_dynamic(hose);
+
/* Initialize EEH event */
ret = eeh_event_init();
if (ret)
diff --git a/arch/powerpc/kernel/eeh_dev.c b/arch/powerpc/kernel/eeh_dev.c
index ad04ecd63c20..a34e6912c15e 100644
--- a/arch/powerpc/kernel/eeh_dev.c
+++ b/arch/powerpc/kernel/eeh_dev.c
@@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
/* EEH PE for PHB */
eeh_phb_pe_create(phb);
}
-
-/**
- * eeh_dev_phb_init - Create EEH devices for devices included in existing PHBs
- *
- * Scan all the existing PHBs and create EEH devices for their OF
- * nodes and their children OF nodes
- */
-static int __init eeh_dev_phb_init(void)
-{
- struct pci_controller *phb, *tmp;
-
- list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
- eeh_dev_phb_init_dynamic(phb);
-
- return 0;
-}
-
-core_initcall(eeh_dev_phb_init);
diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c
index 6f8273f5e988..91e037ab20a1 100644
--- a/arch/powerpc/kernel/optprobes.c
+++ b/arch/powerpc/kernel/optprobes.c
@@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p)
* and that can be emulated.
*/
if (!is_conditional_branch(*p->ainsn.insn) &&
- analyse_instr(&op, &regs, *p->ainsn.insn))
+ analyse_instr(&op, &regs, *p->ainsn.insn) == 1) {
+ emulate_update_regs(&regs, &op);
nip = regs.nip;
+ }
return nip;
}
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 07cd22e35405..f52ad5bb7109 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
* in the appropriate thread structures from live.
*/
- if (tsk != current)
+ if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
return;
if (MSR_TM_SUSPENDED(mfmsr())) {
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index b8a4987f58cf..1643e9e53655 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -914,7 +914,7 @@ int rtas_online_cpus_mask(cpumask_var_t cpus)
if (ret) {
cpumask_var_t tmp_mask;
- if (!alloc_cpumask_var(&tmp_mask, GFP_TEMPORARY))
+ if (!alloc_cpumask_var(&tmp_mask, GFP_KERNEL))
return ret;
/* Use tmp_mask to preserve cpus mask from first failure */
@@ -962,7 +962,7 @@ int rtas_ibm_suspend_me(u64 handle)
return -EIO;
}
- if (!alloc_cpumask_var(&offline_mask, GFP_TEMPORARY))
+ if (!alloc_cpumask_var(&offline_mask, GFP_KERNEL))
return -ENOMEM;
atomic_set(&data.working, 0);
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 97bb1385e771..92fb1c8dbbd8 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -913,42 +913,40 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *d, const siginfo_t *s)
*/
err = __put_user(s->si_signo, &d->si_signo);
err |= __put_user(s->si_errno, &d->si_errno);
- err |= __put_user((short)s->si_code, &d->si_code);
+ err |= __put_user(s->si_code, &d->si_code);
if (s->si_code < 0)
err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
SI_PAD_SIZE32);
- else switch(s->si_code >> 16) {
- case __SI_CHLD >> 16:
+ else switch(siginfo_layout(s->si_signo, s->si_code)) {
+ case SIL_CHLD:
err |= __put_user(s->si_pid, &d->si_pid);
err |= __put_user(s->si_uid, &d->si_uid);
err |= __put_user(s->si_utime, &d->si_utime);
err |= __put_user(s->si_stime, &d->si_stime);
err |= __put_user(s->si_status, &d->si_status);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __put_user((unsigned int)(unsigned long)s->si_addr,
&d->si_addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(s->si_band, &d->si_band);
err |= __put_user(s->si_fd, &d->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __put_user(s->si_tid, &d->si_tid);
err |= __put_user(s->si_overrun, &d->si_overrun);
err |= __put_user(s->si_int, &d->si_int);
break;
- case __SI_SYS >> 16:
+ case SIL_SYS:
err |= __put_user(ptr_to_compat(s->si_call_addr), &d->si_call_addr);
err |= __put_user(s->si_syscall, &d->si_syscall);
err |= __put_user(s->si_arch, &d->si_arch);
break;
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(s->si_int, &d->si_int);
/* fallthrough */
- case __SI_KILL >> 16:
- default:
+ case SIL_KILL:
err |= __put_user(s->si_pid, &d->si_pid);
err |= __put_user(s->si_uid, &d->si_uid);
break;
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index ec74e203ee04..13c9dcdcba69 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
int machine_check_e500mc(struct pt_regs *regs)
{
unsigned long mcsr = mfspr(SPRN_MCSR);
+ unsigned long pvr = mfspr(SPRN_PVR);
unsigned long reason = mcsr;
int recoverable = 1;
@@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
* may still get logged and cause a machine check. We should
* only treat the non-write shadow case as non-recoverable.
*/
- if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
- recoverable = 0;
+ /* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
+ * is not implemented but L1 data cache always runs in write
+ * shadow mode. Hence on data cache parity errors HW will
+ * automatically invalidate the L1 Data Cache.
+ */
+ if (PVR_VER(pvr) != PVR_VER_E6500) {
+ if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
+ recoverable = 0;
+ }
}
if (reason & MCSR_L2MMU_MHIT) {
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 18e974a34fce..73bf1ebfa78f 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -181,7 +181,7 @@ static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu)
struct swait_queue_head *wqp;
wqp = kvm_arch_vcpu_wq(vcpu);
- if (swait_active(wqp)) {
+ if (swq_has_sleeper(wqp)) {
swake_up(wqp);
++vcpu->stat.halt_wakeup;
}
@@ -4212,11 +4212,13 @@ static int kvmhv_configure_mmu(struct kvm *kvm, struct kvm_ppc_mmuv3_cfg *cfg)
if ((cfg->process_table & PRTS_MASK) > 24)
return -EINVAL;
+ mutex_lock(&kvm->lock);
kvm->arch.process_table = cfg->process_table;
kvmppc_setup_partition_table(kvm);
lpcr = (cfg->flags & KVM_PPC_MMUV3_GTSE) ? LPCR_GTSE : 0;
kvmppc_update_lpcr(kvm, lpcr, LPCR_GTSE);
+ mutex_unlock(&kvm->lock);
return 0;
}
diff --git a/arch/powerpc/kvm/book3s_hv_rm_xive.c b/arch/powerpc/kvm/book3s_hv_rm_xive.c
index abf5f01b6eb1..5b81a807d742 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_xive.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_xive.c
@@ -38,7 +38,6 @@ static inline void __iomem *get_tima_phys(void)
#define __x_tima get_tima_phys()
#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_page))
#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_page))
-#define __x_readb __raw_rm_readb
#define __x_writeb __raw_rm_writeb
#define __x_readw __raw_rm_readw
#define __x_readq __raw_rm_readq
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index 663a4a861e7f..ec69fa45d5a2 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -771,6 +771,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
BEGIN_FTR_SECTION
+ /*
+ * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+ */
bl kvmppc_restore_tm
END_FTR_SECTION_IFSET(CPU_FTR_TM)
#endif
@@ -1118,6 +1121,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
BEGIN_FTR_SECTION
mtspr SPRN_PPR, r0
END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
+
+/* Move canary into DSISR to check for later */
+BEGIN_FTR_SECTION
+ li r0, 0x7fff
+ mtspr SPRN_HDSISR, r0
+END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
+
ld r0, VCPU_GPR(R0)(r4)
ld r4, VCPU_GPR(R4)(r4)
@@ -1630,6 +1640,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
BEGIN_FTR_SECTION
+ /*
+ * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+ */
bl kvmppc_save_tm
END_FTR_SECTION_IFSET(CPU_FTR_TM)
#endif
@@ -1749,7 +1762,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
/*
* Are we running hash or radix ?
*/
- beq cr2,3f
+ ld r5, VCPU_KVM(r9)
+ lbz r0, KVM_RADIX(r5)
+ cmpwi cr2, r0, 0
+ beq cr2, 3f
/* Radix: Handle the case where the guest used an illegal PID */
LOAD_REG_ADDR(r4, mmu_base_pid)
@@ -1947,9 +1963,14 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
kvmppc_hdsi:
ld r3, VCPU_KVM(r9)
lbz r0, KVM_RADIX(r3)
- cmpwi r0, 0
mfspr r4, SPRN_HDAR
mfspr r6, SPRN_HDSISR
+BEGIN_FTR_SECTION
+ /* Look for DSISR canary. If we find it, retry instruction */
+ cmpdi r6, 0x7fff
+ beq 6f
+END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
+ cmpwi r0, 0
bne .Lradix_hdsi /* on radix, just save DAR/DSISR/ASDR */
/* HPTE not found fault or protection fault? */
andis. r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h
@@ -2466,6 +2487,9 @@ _GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
BEGIN_FTR_SECTION
+ /*
+ * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+ */
ld r9, HSTATE_KVM_VCPU(r13)
bl kvmppc_save_tm
END_FTR_SECTION_IFSET(CPU_FTR_TM)
@@ -2578,6 +2602,9 @@ kvm_end_cede:
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
BEGIN_FTR_SECTION
+ /*
+ * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+ */
bl kvmppc_restore_tm
END_FTR_SECTION_IFSET(CPU_FTR_TM)
#endif
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 08b200a0bbce..13304622ab1c 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -48,7 +48,6 @@
#define __x_tima xive_tima
#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_mmio))
#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_mmio))
-#define __x_readb __raw_readb
#define __x_writeb __raw_writeb
#define __x_readw __raw_readw
#define __x_readq __raw_readq
diff --git a/arch/powerpc/kvm/book3s_xive_template.c b/arch/powerpc/kvm/book3s_xive_template.c
index d1ed2c41b5d2..c7a5deadd1cc 100644
--- a/arch/powerpc/kvm/book3s_xive_template.c
+++ b/arch/powerpc/kvm/book3s_xive_template.c
@@ -28,7 +28,8 @@ static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
* bit.
*/
if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
- u8 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
+ __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
+ u8 pipr = be64_to_cpu(qw1) & 0xff;
if (pipr >= xc->hw_cppr)
return;
}
@@ -336,7 +337,6 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
u8 pending = xc->pending;
u32 hirq;
- u8 pipr;
pr_devel("H_IPOLL(server=%ld)\n", server);
@@ -353,7 +353,8 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
pending = 0xff;
} else {
/* Grab pending interrupt if any */
- pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
+ __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
+ u8 pipr = be64_to_cpu(qw1) & 0xff;
if (pipr < 8)
pending |= 1 << pipr;
}
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index fb9f58b868e7..5e8418c28bd8 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);
: "r" (addr), "i" (-EFAULT), "0" (err))
static nokprobe_inline void set_cr0(const struct pt_regs *regs,
- struct instruction_op *op, int rd)
+ struct instruction_op *op)
{
- long val = regs->gpr[rd];
+ long val = op->val;
op->type |= SETCC;
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
@@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
case 13: /* addic. */
imm = (short) instr;
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
- set_cr0(regs, op, rd);
+ set_cr0(regs, op);
return 1;
case 14: /* addi */
@@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
case 28: /* andi. */
op->val = regs->gpr[rd] & (unsigned short) instr;
- set_cr0(regs, op, ra);
+ set_cr0(regs, op);
goto logical_done_nocc;
case 29: /* andis. */
imm = (unsigned short) instr;
op->val = regs->gpr[rd] & (imm << 16);
- set_cr0(regs, op, ra);
+ set_cr0(regs, op);
goto logical_done_nocc;
#ifdef __powerpc64__
@@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->type = COMPUTE + SETCC;
imm = 0xf0000000UL;
val = regs->gpr[rd];
- op->val = regs->ccr;
+ op->ccval = regs->ccr;
for (sh = 0; sh < 8; ++sh) {
if (instr & (0x80000 >> sh))
- op->val = (op->val & ~imm) |
+ op->ccval = (op->ccval & ~imm) |
(val & imm);
imm >>= 4;
}
@@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
goto arith_done;
case 235: /* mullw */
- op->val = (unsigned int) regs->gpr[ra] *
- (unsigned int) regs->gpr[rb];
+ op->val = (long)(int) regs->gpr[ra] *
+ (int) regs->gpr[rb];
+
goto arith_done;
case 266: /* add */
@@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
logical_done:
if (instr & 1)
- set_cr0(regs, op, ra);
+ set_cr0(regs, op);
logical_done_nocc:
op->reg = ra;
op->type |= SETREG;
@@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
arith_done:
if (instr & 1)
- set_cr0(regs, op, rd);
+ set_cr0(regs, op);
compute_done:
op->reg = rd;
op->type |= SETREG;
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index 2e3eb7431571..9e3da168d54c 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -793,6 +793,11 @@ void perf_event_print_debug(void)
u32 pmcs[MAX_HWEVENTS];
int i;
+ if (!ppmu) {
+ pr_info("Performance monitor hardware not registered.\n");
+ return;
+ }
+
if (!ppmu->n_counter)
return;
diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c
index 9f59041a172b..443d5ca71995 100644
--- a/arch/powerpc/platforms/powernv/idle.c
+++ b/arch/powerpc/platforms/powernv/idle.c
@@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
u64 pir = get_hard_smp_processor_id(cpu);
mtspr(SPRN_LPCR, lpcr_val);
- opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
+
+ /*
+ * Program the LPCR via stop-api only if the deepest stop state
+ * can lose hypervisor context.
+ */
+ if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
+ opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
}
/*
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index 783f36364690..e45b5f10645a 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent)
return rc;
}
- of_node_put(dn->parent);
return 0;
}
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index fc0d8f97c03a..fadb95efbb9e 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
}
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
- of_node_put(parent);
if (!dn) {
pr_warn("Failed call to configure-connector, drc index: %x\n",
drc_index);
dlpar_release_drc(drc_index);
+ of_node_put(parent);
return -EINVAL;
}
rc = dlpar_attach_node(dn, parent);
+
+ /* Regardless we are done with parent now */
+ of_node_put(parent);
+
if (rc) {
saved_rc = rc;
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
index 210ce632d63e..f7042ad492ba 100644
--- a/arch/powerpc/platforms/pseries/mobility.c
+++ b/arch/powerpc/platforms/pseries/mobility.c
@@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
return -ENOENT;
dn = dlpar_configure_connector(drc_index, parent_dn);
- if (!dn)
+ if (!dn) {
+ of_node_put(parent_dn);
return -ENOENT;
+ }
rc = dlpar_attach_node(dn, parent_dn);
if (rc)
diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c
index e76aefae2aa2..89726f07d249 100644
--- a/arch/powerpc/platforms/pseries/suspend.c
+++ b/arch/powerpc/platforms/pseries/suspend.c
@@ -151,7 +151,7 @@ static ssize_t store_hibernate(struct device *dev,
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
- if (!alloc_cpumask_var(&offline_mask, GFP_TEMPORARY))
+ if (!alloc_cpumask_var(&offline_mask, GFP_KERNEL))
return -ENOMEM;
stream_id = simple_strtoul(buf, NULL, 16);
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c
index 9234be1e66f5..5011ffea4e4b 100644
--- a/arch/powerpc/sysdev/fsl_rio.c
+++ b/arch/powerpc/sysdev/fsl_rio.c
@@ -71,6 +71,8 @@
#define RIWAR_WRTYP_ALLOC 0x00006000
#define RIWAR_SIZE_MASK 0x0000003F
+static DEFINE_SPINLOCK(fsl_rio_config_lock);
+
#define __fsl_read_rio_config(x, addr, err, op) \
__asm__ __volatile__( \
"1: "op" %1,0(%2)\n" \
@@ -184,6 +186,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
u8 hopcount, u32 offset, int len, u32 *val)
{
struct rio_priv *priv = mport->priv;
+ unsigned long flags;
u8 *data;
u32 rval, err = 0;
@@ -197,6 +200,8 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
return -EINVAL;
+ spin_lock_irqsave(&fsl_rio_config_lock, flags);
+
out_be32(&priv->maint_atmu_regs->rowtar,
(destid << 22) | (hopcount << 12) | (offset >> 12));
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
@@ -213,6 +218,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
__fsl_read_rio_config(rval, data, err, "lwz");
break;
default:
+ spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
return -EINVAL;
}
@@ -221,6 +227,7 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid,
err, destid, hopcount, offset);
}
+ spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
*val = rval;
return err;
@@ -244,7 +251,10 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
u8 hopcount, u32 offset, int len, u32 val)
{
struct rio_priv *priv = mport->priv;
+ unsigned long flags;
u8 *data;
+ int ret = 0;
+
pr_debug
("fsl_rio_config_write:"
" index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
@@ -255,6 +265,8 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len))
return -EINVAL;
+ spin_lock_irqsave(&fsl_rio_config_lock, flags);
+
out_be32(&priv->maint_atmu_regs->rowtar,
(destid << 22) | (hopcount << 12) | (offset >> 12));
out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10));
@@ -271,10 +283,11 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid,
out_be32((u32 *) data, val);
break;
default:
- return -EINVAL;
+ ret = -EINVAL;
}
+ spin_unlock_irqrestore(&fsl_rio_config_lock, flags);
- return 0;
+ return ret;
}
static void fsl_rio_inbound_mem_init(struct rio_priv *priv)
diff --git a/arch/powerpc/sysdev/fsl_rmu.c b/arch/powerpc/sysdev/fsl_rmu.c
index ab7a74c75be8..88b35a3dcdc5 100644
--- a/arch/powerpc/sysdev/fsl_rmu.c
+++ b/arch/powerpc/sysdev/fsl_rmu.c
@@ -104,6 +104,8 @@
#define DOORBELL_MESSAGE_SIZE 0x08
+static DEFINE_SPINLOCK(fsl_rio_doorbell_lock);
+
struct rio_msg_regs {
u32 omr;
u32 osr;
@@ -626,9 +628,13 @@ err_out:
int fsl_rio_doorbell_send(struct rio_mport *mport,
int index, u16 destid, u16 data)
{
+ unsigned long flags;
+
pr_debug("fsl_doorbell_send: index %d destid %4.4x data %4.4x\n",
index, destid, data);
+ spin_lock_irqsave(&fsl_rio_doorbell_lock, flags);
+
/* In the serial version silicons, such as MPC8548, MPC8641,
* below operations is must be.
*/
@@ -638,6 +644,8 @@ int fsl_rio_doorbell_send(struct rio_mport *mport,
out_be32(&dbell->dbell_regs->oddatr, (index << 20) | data);
out_be32(&dbell->dbell_regs->odmr, 0x00000001);
+ spin_unlock_irqrestore(&fsl_rio_doorbell_lock, flags);
+
return 0;
}
diff --git a/arch/s390/include/asm/ap.h b/arch/s390/include/asm/ap.h
new file mode 100644
index 000000000000..c02f4aba88a6
--- /dev/null
+++ b/arch/s390/include/asm/ap.h
@@ -0,0 +1,126 @@
+/*
+ * Adjunct processor (AP) interfaces
+ *
+ * Copyright IBM Corp. 2017
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (version 2 only)
+ * as published by the Free Software Foundation.
+ *
+ * Author(s): Tony Krowiak <[email protected]>
+ * Martin Schwidefsky <[email protected]>
+ * Harald Freudenberger <[email protected]>
+ */
+
+#ifndef _ASM_S390_AP_H_
+#define _ASM_S390_AP_H_
+
+/**
+ * The ap_qid_t identifier of an ap queue.
+ * If the AP facilities test (APFT) facility is available,
+ * card and queue index are 8 bit values, otherwise
+ * card index is 6 bit and queue index a 4 bit value.
+ */
+typedef unsigned int ap_qid_t;
+
+#define AP_MKQID(_card, _queue) (((_card) & 63) << 8 | ((_queue) & 255))
+#define AP_QID_CARD(_qid) (((_qid) >> 8) & 63)
+#define AP_QID_QUEUE(_qid) ((_qid) & 255)
+
+/**
+ * struct ap_queue_status - Holds the AP queue status.
+ * @queue_empty: Shows if queue is empty
+ * @replies_waiting: Waiting replies
+ * @queue_full: Is 1 if the queue is full
+ * @irq_enabled: Shows if interrupts are enabled for the AP
+ * @response_code: Holds the 8 bit response code
+ *
+ * The ap queue status word is returned by all three AP functions
+ * (PQAP, NQAP and DQAP). There's a set of flags in the first
+ * byte, followed by a 1 byte response code.
+ */
+struct ap_queue_status {
+ unsigned int queue_empty : 1;
+ unsigned int replies_waiting : 1;
+ unsigned int queue_full : 1;
+ unsigned int _pad1 : 4;
+ unsigned int irq_enabled : 1;
+ unsigned int response_code : 8;
+ unsigned int _pad2 : 16;
+};
+
+/**
+ * ap_test_queue(): Test adjunct processor queue.
+ * @qid: The AP queue number
+ * @tbit: Test facilities bit
+ * @info: Pointer to queue descriptor
+ *
+ * Returns AP queue status structure.
+ */
+struct ap_queue_status ap_test_queue(ap_qid_t qid,
+ int tbit,
+ unsigned long *info);
+
+struct ap_config_info {
+ unsigned int apsc : 1; /* S bit */
+ unsigned int apxa : 1; /* N bit */
+ unsigned int qact : 1; /* C bit */
+ unsigned int rc8a : 1; /* R bit */
+ unsigned char _reserved1 : 4;
+ unsigned char _reserved2[3];
+ unsigned char Na; /* max # of APs - 1 */
+ unsigned char Nd; /* max # of Domains - 1 */
+ unsigned char _reserved3[10];
+ unsigned int apm[8]; /* AP ID mask */
+ unsigned int aqm[8]; /* AP queue mask */
+ unsigned int adm[8]; /* AP domain mask */
+ unsigned char _reserved4[16];
+} __aligned(8);
+
+/*
+ * ap_query_configuration(): Fetch cryptographic config info
+ *
+ * Returns the ap configuration info fetched via PQAP(QCI).
+ * On success 0 is returned, on failure a negative errno
+ * is returned, e.g. if the PQAP(QCI) instruction is not
+ * available, the return value will be -EOPNOTSUPP.
+ */
+int ap_query_configuration(struct ap_config_info *info);
+
+/*
+ * struct ap_qirq_ctrl - convenient struct for easy invocation
+ * of the ap_queue_irq_ctrl() function. This struct is passed
+ * as GR1 parameter to the PQAP(AQIC) instruction. For details
+ * please see the AR documentation.
+ */
+struct ap_qirq_ctrl {
+ unsigned int _res1 : 8;
+ unsigned int zone : 8; /* zone info */
+ unsigned int ir : 1; /* ir flag: enable (1) or disable (0) irq */
+ unsigned int _res2 : 4;
+ unsigned int gisc : 3; /* guest isc field */
+ unsigned int _res3 : 6;
+ unsigned int gf : 2; /* gisa format */
+ unsigned int _res4 : 1;
+ unsigned int gisa : 27; /* gisa origin */
+ unsigned int _res5 : 1;
+ unsigned int isc : 3; /* irq sub class */
+};
+
+/**
+ * ap_queue_irq_ctrl(): Control interruption on a AP queue.
+ * @qid: The AP queue number
+ * @qirqctrl: struct ap_qirq_ctrl, see above
+ * @ind: The notification indicator byte
+ *
+ * Returns AP queue status.
+ *
+ * Control interruption on the given AP queue.
+ * Just a simple wrapper function for the low level PQAP(AQIC)
+ * instruction available for other kernel modules.
+ */
+struct ap_queue_status ap_queue_irq_ctrl(ap_qid_t qid,
+ struct ap_qirq_ctrl qirqctrl,
+ void *ind);
+
+#endif /* _ASM_S390_AP_H_ */
diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h
index bd6f30304518..3f46a6577b8d 100644
--- a/arch/s390/include/asm/mmu.h
+++ b/arch/s390/include/asm/mmu.h
@@ -5,12 +5,11 @@
#include <linux/errno.h>
typedef struct {
+ spinlock_t lock;
cpumask_t cpu_attach_mask;
atomic_t flush_count;
unsigned int flush_mm;
- spinlock_t pgtable_lock;
struct list_head pgtable_list;
- spinlock_t gmap_lock;
struct list_head gmap_list;
unsigned long gmap_asce;
unsigned long asce;
@@ -27,10 +26,8 @@ typedef struct {
} mm_context_t;
#define INIT_MM_CONTEXT(name) \
- .context.pgtable_lock = \
- __SPIN_LOCK_UNLOCKED(name.context.pgtable_lock), \
+ .context.lock = __SPIN_LOCK_UNLOCKED(name.context.lock), \
.context.pgtable_list = LIST_HEAD_INIT(name.context.pgtable_list), \
- .context.gmap_lock = __SPIN_LOCK_UNLOCKED(name.context.gmap_lock), \
.context.gmap_list = LIST_HEAD_INIT(name.context.gmap_list),
static inline int tprot(unsigned long addr)
diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h
index 72e9ca83a668..3c9abedc323c 100644
--- a/arch/s390/include/asm/mmu_context.h
+++ b/arch/s390/include/asm/mmu_context.h
@@ -17,9 +17,8 @@
static inline int init_new_context(struct task_struct *tsk,
struct mm_struct *mm)
{
- spin_lock_init(&mm->context.pgtable_lock);
+ spin_lock_init(&mm->context.lock);
INIT_LIST_HEAD(&mm->context.pgtable_list);
- spin_lock_init(&mm->context.gmap_lock);
INIT_LIST_HEAD(&mm->context.gmap_list);
cpumask_clear(&mm->context.cpu_attach_mask);
atomic_set(&mm->context.flush_count, 0);
@@ -103,7 +102,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
if (prev == next)
return;
cpumask_set_cpu(cpu, &next->context.cpu_attach_mask);
- cpumask_set_cpu(cpu, mm_cpumask(next));
/* Clear old ASCE by loading the kernel ASCE. */
__ctl_load(S390_lowcore.kernel_asce, 1, 1);
__ctl_load(S390_lowcore.kernel_asce, 7, 7);
@@ -121,9 +119,8 @@ static inline void finish_arch_post_lock_switch(void)
preempt_disable();
while (atomic_read(&mm->context.flush_count))
cpu_relax();
-
- if (mm->context.flush_mm)
- __tlb_flush_mm(mm);
+ cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
+ __tlb_flush_mm_lazy(mm);
preempt_enable();
}
set_fs(current->thread.mm_segment);
@@ -136,6 +133,7 @@ static inline void activate_mm(struct mm_struct *prev,
struct mm_struct *next)
{
switch_mm(prev, next, current);
+ cpumask_set_cpu(smp_processor_id(), mm_cpumask(next));
set_user_asce(next);
}
diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h
index f36b4b726057..386df9adef0a 100644
--- a/arch/s390/include/asm/pci.h
+++ b/arch/s390/include/asm/pci.h
@@ -8,6 +8,7 @@
#include <linux/pci.h>
#include <linux/mutex.h>
+#include <linux/iommu.h>
#include <asm-generic/pci.h>
#include <asm/pci_clp.h>
#include <asm/pci_debug.h>
@@ -122,6 +123,8 @@ struct zpci_dev {
unsigned long iommu_pages;
unsigned int next_bit;
+ struct iommu_device iommu_dev; /* IOMMU core handle */
+
char res_name[16];
struct zpci_bar_struct bars[PCI_BAR_COUNT];
@@ -174,6 +177,10 @@ int clp_enable_fh(struct zpci_dev *, u8);
int clp_disable_fh(struct zpci_dev *);
int clp_get_state(u32 fid, enum zpci_state *state);
+/* IOMMU Interface */
+int zpci_init_iommu(struct zpci_dev *zdev);
+void zpci_destroy_iommu(struct zpci_dev *zdev);
+
#ifdef CONFIG_PCI
/* Error handling and recovery */
void zpci_event_error(void *);
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index dce708e061ea..20e75a2ca93a 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -1507,7 +1507,9 @@ static inline pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma,
static inline void pmdp_invalidate(struct vm_area_struct *vma,
unsigned long addr, pmd_t *pmdp)
{
- pmdp_xchg_direct(vma->vm_mm, addr, pmdp, __pmd(_SEGMENT_ENTRY_EMPTY));
+ pmd_t pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
+
+ pmdp_xchg_direct(vma->vm_mm, addr, pmdp, pmd);
}
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h
index 4d759f8f4bc7..b08d5bc2666e 100644
--- a/arch/s390/include/asm/tlbflush.h
+++ b/arch/s390/include/asm/tlbflush.h
@@ -48,23 +48,6 @@ static inline void __tlb_flush_global(void)
* Flush TLB entries for a specific mm on all CPUs (in case gmap is used
* this implicates multiple ASCEs!).
*/
-static inline void __tlb_flush_full(struct mm_struct *mm)
-{
- preempt_disable();
- atomic_inc(&mm->context.flush_count);
- if (cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) {
- /* Local TLB flush */
- __tlb_flush_local();
- } else {
- /* Global TLB flush */
- __tlb_flush_global();
- /* Reset TLB flush mask */
- cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
- }
- atomic_dec(&mm->context.flush_count);
- preempt_enable();
-}
-
static inline void __tlb_flush_mm(struct mm_struct *mm)
{
unsigned long gmap_asce;
@@ -76,16 +59,18 @@ static inline void __tlb_flush_mm(struct mm_struct *mm)
*/
preempt_disable();
atomic_inc(&mm->context.flush_count);
+ /* Reset TLB flush mask */
+ cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
+ barrier();
gmap_asce = READ_ONCE(mm->context.gmap_asce);
if (MACHINE_HAS_IDTE && gmap_asce != -1UL) {
if (gmap_asce)
__tlb_flush_idte(gmap_asce);
__tlb_flush_idte(mm->context.asce);
} else {
- __tlb_flush_full(mm);
+ /* Global TLB flush */
+ __tlb_flush_global();
}
- /* Reset TLB flush mask */
- cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
atomic_dec(&mm->context.flush_count);
preempt_enable();
}
@@ -99,7 +84,6 @@ static inline void __tlb_flush_kernel(void)
}
#else
#define __tlb_flush_global() __tlb_flush_local()
-#define __tlb_flush_full(mm) __tlb_flush_local()
/*
* Flush TLB entries for a specific ASCE on all CPUs.
@@ -117,10 +101,12 @@ static inline void __tlb_flush_kernel(void)
static inline void __tlb_flush_mm_lazy(struct mm_struct * mm)
{
+ spin_lock(&mm->context.lock);
if (mm->context.flush_mm) {
- __tlb_flush_mm(mm);
mm->context.flush_mm = 0;
+ __tlb_flush_mm(mm);
}
+ spin_unlock(&mm->context.lock);
}
/*
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
index c620049c61f2..f549c4657376 100644
--- a/arch/s390/kernel/compat_signal.c
+++ b/arch/s390/kernel/compat_signal.c
@@ -75,35 +75,34 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
at the same time. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (from->si_code >> 16) {
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_RT:
err |= __put_user(from->si_int, &to->si_int);
/* fallthrough */
- case __SI_KILL >> 16:
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __put_user((unsigned long) from->si_addr,
&to->si_addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_int, &to->si_int);
@@ -127,32 +126,31 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
if (to->si_code < 0)
err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (to->si_code >> 16) {
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ switch (siginfo_layout(to->si_signo, to->si_code)) {
+ case SIL_RT:
err |= __get_user(to->si_int, &from->si_int);
/* fallthrough */
- case __SI_KILL >> 16:
+ case SIL_KILL:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
err |= __get_user(to->si_utime, &from->si_utime);
err |= __get_user(to->si_stime, &from->si_stime);
err |= __get_user(to->si_status, &from->si_status);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __get_user(tmp, &from->si_addr);
to->si_addr = (void __force __user *)
(u64) (tmp & PSW32_ADDR_INSN);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __get_user(to->si_band, &from->si_band);
err |= __get_user(to->si_fd, &from->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __get_user(to->si_tid, &from->si_tid);
err |= __get_user(to->si_overrun, &from->si_overrun);
err |= __get_user(to->si_int, &from->si_int);
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c
index ca8cd80e8feb..60181caf8e8a 100644
--- a/arch/s390/kernel/early.c
+++ b/arch/s390/kernel/early.c
@@ -404,18 +404,6 @@ static inline void save_vector_registers(void)
#endif
}
-static int __init topology_setup(char *str)
-{
- bool enabled;
- int rc;
-
- rc = kstrtobool(str, &enabled);
- if (!rc && !enabled)
- S390_lowcore.machine_flags &= ~MACHINE_FLAG_TOPOLOGY;
- return rc;
-}
-early_param("topology", topology_setup);
-
static int __init disable_vector_extension(char *str)
{
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
index c1bf75ffb875..7e1e40323b78 100644
--- a/arch/s390/kernel/perf_cpum_sf.c
+++ b/arch/s390/kernel/perf_cpum_sf.c
@@ -823,9 +823,12 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
}
/* Check online status of the CPU to which the event is pinned */
- if ((unsigned int)event->cpu >= nr_cpumask_bits ||
- (event->cpu >= 0 && !cpu_online(event->cpu)))
- return -ENODEV;
+ if (event->cpu >= 0) {
+ if ((unsigned int)event->cpu >= nr_cpumask_bits)
+ return -ENODEV;
+ if (!cpu_online(event->cpu))
+ return -ENODEV;
+ }
/* Force reset of idle/hv excludes regardless of what the
* user requested.
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c
index bb47c92476f0..ed0bdd220e1a 100644
--- a/arch/s390/kernel/topology.c
+++ b/arch/s390/kernel/topology.c
@@ -8,6 +8,8 @@
#include <linux/workqueue.h>
#include <linux/bootmem.h>
+#include <linux/uaccess.h>
+#include <linux/sysctl.h>
#include <linux/cpuset.h>
#include <linux/device.h>
#include <linux/export.h>
@@ -29,12 +31,20 @@
#define PTF_VERTICAL (1UL)
#define PTF_CHECK (2UL)
+enum {
+ TOPOLOGY_MODE_HW,
+ TOPOLOGY_MODE_SINGLE,
+ TOPOLOGY_MODE_PACKAGE,
+ TOPOLOGY_MODE_UNINITIALIZED
+};
+
struct mask_info {
struct mask_info *next;
unsigned char id;
cpumask_t mask;
};
+static int topology_mode = TOPOLOGY_MODE_UNINITIALIZED;
static void set_topology_timer(void);
static void topology_work_fn(struct work_struct *work);
static struct sysinfo_15_1_x *tl_info;
@@ -59,11 +69,26 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
cpumask_t mask;
cpumask_copy(&mask, cpumask_of(cpu));
- if (!MACHINE_HAS_TOPOLOGY)
- return mask;
- for (; info; info = info->next) {
- if (cpumask_test_cpu(cpu, &info->mask))
- return info->mask;
+ switch (topology_mode) {
+ case TOPOLOGY_MODE_HW:
+ while (info) {
+ if (cpumask_test_cpu(cpu, &info->mask)) {
+ mask = info->mask;
+ break;
+ }
+ info = info->next;
+ }
+ if (cpumask_empty(&mask))
+ cpumask_copy(&mask, cpumask_of(cpu));
+ break;
+ case TOPOLOGY_MODE_PACKAGE:
+ cpumask_copy(&mask, cpu_present_mask);
+ break;
+ default:
+ /* fallthrough */
+ case TOPOLOGY_MODE_SINGLE:
+ cpumask_copy(&mask, cpumask_of(cpu));
+ break;
}
return mask;
}
@@ -74,7 +99,7 @@ static cpumask_t cpu_thread_map(unsigned int cpu)
int i;
cpumask_copy(&mask, cpumask_of(cpu));
- if (!MACHINE_HAS_TOPOLOGY)
+ if (topology_mode != TOPOLOGY_MODE_HW)
return mask;
cpu -= cpu % (smp_cpu_mtid + 1);
for (i = 0; i <= smp_cpu_mtid; i++)
@@ -184,10 +209,8 @@ static void topology_update_polarization_simple(void)
{
int cpu;
- mutex_lock(&smp_cpu_state_mutex);
for_each_possible_cpu(cpu)
smp_cpu_set_polarization(cpu, POLARIZATION_HRZ);
- mutex_unlock(&smp_cpu_state_mutex);
}
static int ptf(unsigned long fc)
@@ -223,7 +246,7 @@ int topology_set_cpu_management(int fc)
static void update_cpu_masks(void)
{
struct cpu_topology_s390 *topo;
- int cpu;
+ int cpu, id;
for_each_possible_cpu(cpu) {
topo = &cpu_topology[cpu];
@@ -231,12 +254,13 @@ static void update_cpu_masks(void)
topo->core_mask = cpu_group_map(&socket_info, cpu);
topo->book_mask = cpu_group_map(&book_info, cpu);
topo->drawer_mask = cpu_group_map(&drawer_info, cpu);
- if (!MACHINE_HAS_TOPOLOGY) {
+ if (topology_mode != TOPOLOGY_MODE_HW) {
+ id = topology_mode == TOPOLOGY_MODE_PACKAGE ? 0 : cpu;
topo->thread_id = cpu;
topo->core_id = cpu;
- topo->socket_id = cpu;
- topo->book_id = cpu;
- topo->drawer_id = cpu;
+ topo->socket_id = id;
+ topo->book_id = id;
+ topo->drawer_id = id;
if (cpu_present(cpu))
cpumask_set_cpu(cpu, &cpus_with_topology);
}
@@ -254,6 +278,7 @@ static int __arch_update_cpu_topology(void)
struct sysinfo_15_1_x *info = tl_info;
int rc = 0;
+ mutex_lock(&smp_cpu_state_mutex);
cpumask_clear(&cpus_with_topology);
if (MACHINE_HAS_TOPOLOGY) {
rc = 1;
@@ -263,6 +288,7 @@ static int __arch_update_cpu_topology(void)
update_cpu_masks();
if (!MACHINE_HAS_TOPOLOGY)
topology_update_polarization_simple();
+ mutex_unlock(&smp_cpu_state_mutex);
return rc;
}
@@ -289,6 +315,11 @@ void topology_schedule_update(void)
schedule_work(&topology_work);
}
+static void topology_flush_work(void)
+{
+ flush_work(&topology_work);
+}
+
static void topology_timer_fn(unsigned long ignored)
{
if (ptf(PTF_CHECK))
@@ -459,6 +490,12 @@ void __init topology_init_early(void)
struct sysinfo_15_1_x *info;
set_sched_topology(s390_topology);
+ if (topology_mode == TOPOLOGY_MODE_UNINITIALIZED) {
+ if (MACHINE_HAS_TOPOLOGY)
+ topology_mode = TOPOLOGY_MODE_HW;
+ else
+ topology_mode = TOPOLOGY_MODE_SINGLE;
+ }
if (!MACHINE_HAS_TOPOLOGY)
goto out;
tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE);
@@ -474,12 +511,97 @@ out:
__arch_update_cpu_topology();
}
+static inline int topology_get_mode(int enabled)
+{
+ if (!enabled)
+ return TOPOLOGY_MODE_SINGLE;
+ return MACHINE_HAS_TOPOLOGY ? TOPOLOGY_MODE_HW : TOPOLOGY_MODE_PACKAGE;
+}
+
+static inline int topology_is_enabled(void)
+{
+ return topology_mode != TOPOLOGY_MODE_SINGLE;
+}
+
+static int __init topology_setup(char *str)
+{
+ bool enabled;
+ int rc;
+
+ rc = kstrtobool(str, &enabled);
+ if (rc)
+ return rc;
+ topology_mode = topology_get_mode(enabled);
+ return 0;
+}
+early_param("topology", topology_setup);
+
+static int topology_ctl_handler(struct ctl_table *ctl, int write,
+ void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+ unsigned int len;
+ int new_mode;
+ char buf[2];
+
+ if (!*lenp || *ppos) {
+ *lenp = 0;
+ return 0;
+ }
+ if (!write) {
+ strncpy(buf, topology_is_enabled() ? "1\n" : "0\n",
+ ARRAY_SIZE(buf));
+ len = strnlen(buf, ARRAY_SIZE(buf));
+ if (len > *lenp)
+ len = *lenp;
+ if (copy_to_user(buffer, buf, len))
+ return -EFAULT;
+ goto out;
+ }
+ len = *lenp;
+ if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len))
+ return -EFAULT;
+ if (buf[0] != '0' && buf[0] != '1')
+ return -EINVAL;
+ mutex_lock(&smp_cpu_state_mutex);
+ new_mode = topology_get_mode(buf[0] == '1');
+ if (topology_mode != new_mode) {
+ topology_mode = new_mode;
+ topology_schedule_update();
+ }
+ mutex_unlock(&smp_cpu_state_mutex);
+ topology_flush_work();
+out:
+ *lenp = len;
+ *ppos += len;
+ return 0;
+}
+
+static struct ctl_table topology_ctl_table[] = {
+ {
+ .procname = "topology",
+ .mode = 0644,
+ .proc_handler = topology_ctl_handler,
+ },
+ { },
+};
+
+static struct ctl_table topology_dir_table[] = {
+ {
+ .procname = "s390",
+ .maxlen = 0,
+ .mode = 0555,
+ .child = topology_ctl_table,
+ },
+ { },
+};
+
static int __init topology_init(void)
{
if (MACHINE_HAS_TOPOLOGY)
set_topology_timer();
else
topology_update_polarization_simple();
+ register_sysctl_table(topology_dir_table);
return device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching);
}
device_initcall(topology_init);
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index 9e1494e3d849..2f66290c9b92 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -100,14 +100,14 @@ struct gmap *gmap_create(struct mm_struct *mm, unsigned long limit)
if (!gmap)
return NULL;
gmap->mm = mm;
- spin_lock(&mm->context.gmap_lock);
+ spin_lock(&mm->context.lock);
list_add_rcu(&gmap->list, &mm->context.gmap_list);
if (list_is_singular(&mm->context.gmap_list))
gmap_asce = gmap->asce;
else
gmap_asce = -1UL;
WRITE_ONCE(mm->context.gmap_asce, gmap_asce);
- spin_unlock(&mm->context.gmap_lock);
+ spin_unlock(&mm->context.lock);
return gmap;
}
EXPORT_SYMBOL_GPL(gmap_create);
@@ -248,7 +248,7 @@ void gmap_remove(struct gmap *gmap)
spin_unlock(&gmap->shadow_lock);
}
/* Remove gmap from the pre-mm list */
- spin_lock(&gmap->mm->context.gmap_lock);
+ spin_lock(&gmap->mm->context.lock);
list_del_rcu(&gmap->list);
if (list_empty(&gmap->mm->context.gmap_list))
gmap_asce = 0;
@@ -258,7 +258,7 @@ void gmap_remove(struct gmap *gmap)
else
gmap_asce = -1UL;
WRITE_ONCE(gmap->mm->context.gmap_asce, gmap_asce);
- spin_unlock(&gmap->mm->context.gmap_lock);
+ spin_unlock(&gmap->mm->context.lock);
synchronize_rcu();
/* Put reference */
gmap_put(gmap);
diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c
index 8ecc25e760fa..98ffe3ee9411 100644
--- a/arch/s390/mm/gup.c
+++ b/arch/s390/mm/gup.c
@@ -56,13 +56,12 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
unsigned long end, int write, struct page **pages, int *nr)
{
- unsigned long mask, result;
struct page *head, *page;
+ unsigned long mask;
int refs;
- result = write ? 0 : _SEGMENT_ENTRY_PROTECT;
- mask = result | _SEGMENT_ENTRY_INVALID;
- if ((pmd_val(pmd) & mask) != result)
+ mask = (write ? _SEGMENT_ENTRY_PROTECT : 0) | _SEGMENT_ENTRY_INVALID;
+ if ((pmd_val(pmd) & mask) != 0)
return 0;
VM_BUG_ON(!pfn_valid(pmd_val(pmd) >> PAGE_SHIFT));
diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c
index c5b74dd61197..05f1f27e6708 100644
--- a/arch/s390/mm/pgalloc.c
+++ b/arch/s390/mm/pgalloc.c
@@ -83,7 +83,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
int rc, notify;
/* upgrade should only happen from 3 to 4, 3 to 5, or 4 to 5 levels */
- BUG_ON(mm->context.asce_limit < _REGION2_SIZE);
+ VM_BUG_ON(mm->context.asce_limit < _REGION2_SIZE);
if (end >= TASK_SIZE_MAX)
return -ENOMEM;
rc = 0;
@@ -124,7 +124,7 @@ void crst_table_downgrade(struct mm_struct *mm)
pgd_t *pgd;
/* downgrade should only happen from 3 to 2 levels (compat only) */
- BUG_ON(mm->context.asce_limit != _REGION2_SIZE);
+ VM_BUG_ON(mm->context.asce_limit != _REGION2_SIZE);
if (current->active_mm == mm) {
clear_user_asce();
@@ -188,7 +188,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
/* Try to get a fragment of a 4K page as a 2K page table */
if (!mm_alloc_pgste(mm)) {
table = NULL;
- spin_lock_bh(&mm->context.pgtable_lock);
+ spin_lock_bh(&mm->context.lock);
if (!list_empty(&mm->context.pgtable_list)) {
page = list_first_entry(&mm->context.pgtable_list,
struct page, lru);
@@ -203,7 +203,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
list_del(&page->lru);
}
}
- spin_unlock_bh(&mm->context.pgtable_lock);
+ spin_unlock_bh(&mm->context.lock);
if (table)
return table;
}
@@ -227,9 +227,9 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
/* Return the first 2K fragment of the page */
atomic_set(&page->_mapcount, 1);
clear_table(table, _PAGE_INVALID, PAGE_SIZE);
- spin_lock_bh(&mm->context.pgtable_lock);
+ spin_lock_bh(&mm->context.lock);
list_add(&page->lru, &mm->context.pgtable_list);
- spin_unlock_bh(&mm->context.pgtable_lock);
+ spin_unlock_bh(&mm->context.lock);
}
return table;
}
@@ -243,13 +243,13 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
if (!mm_alloc_pgste(mm)) {
/* Free 2K page table fragment of a 4K page */
bit = (__pa(table) & ~PAGE_MASK)/(PTRS_PER_PTE*sizeof(pte_t));
- spin_lock_bh(&mm->context.pgtable_lock);
+ spin_lock_bh(&mm->context.lock);
mask = atomic_xor_bits(&page->_mapcount, 1U << bit);
if (mask & 3)
list_add(&page->lru, &mm->context.pgtable_list);
else
list_del(&page->lru);
- spin_unlock_bh(&mm->context.pgtable_lock);
+ spin_unlock_bh(&mm->context.lock);
if (mask != 0)
return;
}
@@ -275,13 +275,13 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table,
return;
}
bit = (__pa(table) & ~PAGE_MASK) / (PTRS_PER_PTE*sizeof(pte_t));
- spin_lock_bh(&mm->context.pgtable_lock);
+ spin_lock_bh(&mm->context.lock);
mask = atomic_xor_bits(&page->_mapcount, 0x11U << bit);
if (mask & 3)
list_add_tail(&page->lru, &mm->context.pgtable_list);
else
list_del(&page->lru);
- spin_unlock_bh(&mm->context.pgtable_lock);
+ spin_unlock_bh(&mm->context.lock);
table = (unsigned long *) (__pa(table) | (1U << bit));
tlb_remove_table(tlb, table);
}
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index ddb9923fb45d..a25d95a6612d 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -772,6 +772,7 @@ void pcibios_remove_bus(struct pci_bus *bus)
zpci_exit_slot(zdev);
zpci_cleanup_bus_resources(zdev);
+ zpci_destroy_iommu(zdev);
zpci_free_domain(zdev);
spin_lock(&zpci_list_lock);
@@ -844,11 +845,15 @@ int zpci_create_device(struct zpci_dev *zdev)
if (rc)
goto out;
+ rc = zpci_init_iommu(zdev);
+ if (rc)
+ goto out_free;
+
mutex_init(&zdev->lock);
if (zdev->state == ZPCI_FN_STATE_CONFIGURED) {
rc = zpci_enable_device(zdev);
if (rc)
- goto out_free;
+ goto out_destroy_iommu;
}
rc = zpci_scan_bus(zdev);
if (rc)
@@ -865,6 +870,8 @@ int zpci_create_device(struct zpci_dev *zdev)
out_disable:
if (zdev->state == ZPCI_FN_STATE_ONLINE)
zpci_disable_device(zdev);
+out_destroy_iommu:
+ zpci_destroy_iommu(zdev);
out_free:
zpci_free_domain(zdev);
out:
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c
index 5de60a77eaa1..0bcbe58b11e9 100644
--- a/arch/sh/boards/mach-migor/setup.c
+++ b/arch/sh/boards/mach-migor/setup.c
@@ -15,7 +15,7 @@
#include <linux/mmc/host.h>
#include <linux/mtd/physmap.h>
#include <linux/mfd/tmio.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/i2c.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
diff --git a/arch/sh/drivers/pci/fixups-dreamcast.c b/arch/sh/drivers/pci/fixups-dreamcast.c
index 9d597f7ab8dd..48aaefd8f5d6 100644
--- a/arch/sh/drivers/pci/fixups-dreamcast.c
+++ b/arch/sh/drivers/pci/fixups-dreamcast.c
@@ -63,11 +63,10 @@ static void gapspci_fixup_resources(struct pci_dev *dev)
res.end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1;
res.flags = IORESOURCE_MEM;
pcibios_resource_to_bus(dev->bus, &region, &res);
- BUG_ON(!dma_declare_coherent_memory(&dev->dev,
+ BUG_ON(dma_declare_coherent_memory(&dev->dev,
res.start,
region.start,
resource_size(&res),
- DMA_MEMORY_MAP |
DMA_MEMORY_EXCLUSIVE));
break;
default:
diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h
index 18e0377f72bb..88ce1e22237b 100644
--- a/arch/sh/include/asm/processor_32.h
+++ b/arch/sh/include/asm/processor_32.h
@@ -136,10 +136,6 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_pc, unsigned lo
/* Free all resources held by a thread. */
extern void release_thread(struct task_struct *);
-/* Copy and release all segment info associated with a VM */
-#define copy_segments(p, mm) do { } while(0)
-#define release_segments(mm) do { } while(0)
-
/*
* FPU lazy state save handling.
*/
diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h
index eedd4f625d07..777a16318aff 100644
--- a/arch/sh/include/asm/processor_64.h
+++ b/arch/sh/include/asm/processor_64.h
@@ -170,10 +170,6 @@ struct mm_struct;
/* Free all resources held by a thread. */
extern void release_thread(struct task_struct *);
-/* Copy and release all segment info associated with a VM */
-#define copy_segments(p, mm) do { } while (0)
-#define release_segments(mm) do { } while (0)
-#define forget_segments() do { } while (0)
/*
* FPU lazy state save handling.
*/
diff --git a/arch/sh/include/cpu-sh2a/cpu/sh7264.h b/arch/sh/include/cpu-sh2a/cpu/sh7264.h
index 4d1ef6d74bd6..2ae0e938b657 100644
--- a/arch/sh/include/cpu-sh2a/cpu/sh7264.h
+++ b/arch/sh/include/cpu-sh2a/cpu/sh7264.h
@@ -43,9 +43,7 @@ enum {
GPIO_PG7, GPIO_PG6, GPIO_PG5, GPIO_PG4,
GPIO_PG3, GPIO_PG2, GPIO_PG1, GPIO_PG0,
- /* Port H */
- GPIO_PH7, GPIO_PH6, GPIO_PH5, GPIO_PH4,
- GPIO_PH3, GPIO_PH2, GPIO_PH1, GPIO_PH0,
+ /* Port H - Port H does not have a Data Register */
/* Port I - not on device */
diff --git a/arch/sh/include/cpu-sh2a/cpu/sh7269.h b/arch/sh/include/cpu-sh2a/cpu/sh7269.h
index 2a0ca8780f0d..13c495a9fc00 100644
--- a/arch/sh/include/cpu-sh2a/cpu/sh7269.h
+++ b/arch/sh/include/cpu-sh2a/cpu/sh7269.h
@@ -45,9 +45,7 @@ enum {
GPIO_PG7, GPIO_PG6, GPIO_PG5, GPIO_PG4,
GPIO_PG3, GPIO_PG2, GPIO_PG1, GPIO_PG0,
- /* Port H */
- GPIO_PH7, GPIO_PH6, GPIO_PH5, GPIO_PH4,
- GPIO_PH3, GPIO_PH2, GPIO_PH1, GPIO_PH0,
+ /* Port H - Port H does not have a Data Register */
/* Port I - not on device */
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7722.h b/arch/sh/include/cpu-sh4/cpu/sh7722.h
index 3bb74e534d0f..78961ab78a5a 100644
--- a/arch/sh/include/cpu-sh4/cpu/sh7722.h
+++ b/arch/sh/include/cpu-sh4/cpu/sh7722.h
@@ -67,7 +67,7 @@ enum {
GPIO_PTN3, GPIO_PTN2, GPIO_PTN1, GPIO_PTN0,
/* PTQ */
- GPIO_PTQ7, GPIO_PTQ6, GPIO_PTQ5, GPIO_PTQ4,
+ GPIO_PTQ6, GPIO_PTQ5, GPIO_PTQ4,
GPIO_PTQ3, GPIO_PTQ2, GPIO_PTQ1, GPIO_PTQ0,
/* PTR */
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7757.h b/arch/sh/include/cpu-sh4/cpu/sh7757.h
index 5340f3bc1863..b40fb541e72a 100644
--- a/arch/sh/include/cpu-sh4/cpu/sh7757.h
+++ b/arch/sh/include/cpu-sh4/cpu/sh7757.h
@@ -40,7 +40,7 @@ enum {
/* PTJ */
GPIO_PTJ0, GPIO_PTJ1, GPIO_PTJ2, GPIO_PTJ3,
- GPIO_PTJ4, GPIO_PTJ5, GPIO_PTJ6, GPIO_PTJ7_RESV,
+ GPIO_PTJ4, GPIO_PTJ5, GPIO_PTJ6,
/* PTK */
GPIO_PTK0, GPIO_PTK1, GPIO_PTK2, GPIO_PTK3,
@@ -48,7 +48,7 @@ enum {
/* PTL */
GPIO_PTL0, GPIO_PTL1, GPIO_PTL2, GPIO_PTL3,
- GPIO_PTL4, GPIO_PTL5, GPIO_PTL6, GPIO_PTL7_RESV,
+ GPIO_PTL4, GPIO_PTL5, GPIO_PTL6,
/* PTM */
GPIO_PTM0, GPIO_PTM1, GPIO_PTM2, GPIO_PTM3,
@@ -56,7 +56,7 @@ enum {
/* PTN */
GPIO_PTN0, GPIO_PTN1, GPIO_PTN2, GPIO_PTN3,
- GPIO_PTN4, GPIO_PTN5, GPIO_PTN6, GPIO_PTN7_RESV,
+ GPIO_PTN4, GPIO_PTN5, GPIO_PTN6,
/* PTO */
GPIO_PTO0, GPIO_PTO1, GPIO_PTO2, GPIO_PTO3,
@@ -68,7 +68,7 @@ enum {
/* PTQ */
GPIO_PTQ0, GPIO_PTQ1, GPIO_PTQ2, GPIO_PTQ3,
- GPIO_PTQ4, GPIO_PTQ5, GPIO_PTQ6, GPIO_PTQ7_RESV,
+ GPIO_PTQ4, GPIO_PTQ5, GPIO_PTQ6,
/* PTR */
GPIO_PTR0, GPIO_PTR1, GPIO_PTR2, GPIO_PTR3,
diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig
index ca8609d7292f..4d4e1cc6402f 100644
--- a/arch/sparc/configs/sparc64_defconfig
+++ b/arch/sparc/configs/sparc64_defconfig
@@ -238,3 +238,4 @@ CONFIG_CRYPTO_TWOFISH=m
# CONFIG_CRYPTO_ANSI_CPRNG is not set
CONFIG_CRC16=m
CONFIG_LIBCRC32C=m
+CONFIG_VCC=m
diff --git a/arch/sparc/include/asm/hugetlb.h b/arch/sparc/include/asm/hugetlb.h
index d1f837dc77a4..0ca7caab1b06 100644
--- a/arch/sparc/include/asm/hugetlb.h
+++ b/arch/sparc/include/asm/hugetlb.h
@@ -4,6 +4,13 @@
#include <asm/page.h>
#include <asm-generic/hugetlb.h>
+#ifdef CONFIG_HUGETLB_PAGE
+struct pud_huge_patch_entry {
+ unsigned int addr;
+ unsigned int insn;
+};
+extern struct pud_huge_patch_entry __pud_huge_patch, __pud_huge_patch_end;
+#endif
void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte);
diff --git a/arch/sparc/include/asm/hypervisor.h b/arch/sparc/include/asm/hypervisor.h
index 73cb8978df58..3dc9215d0357 100644
--- a/arch/sparc/include/asm/hypervisor.h
+++ b/arch/sparc/include/asm/hypervisor.h
@@ -298,6 +298,24 @@ unsigned long sun4v_cpu_stop(unsigned long cpuid);
unsigned long sun4v_cpu_yield(void);
#endif
+/* cpu_poke()
+ * TRAP: HV_FAST_TRAP
+ * FUNCTION: HV_FAST_CPU_POKE
+ * RET0: status
+ * ERRORS: ENOCPU cpuid refers to a CPU that does not exist
+ * EINVAL cpuid is current CPU
+ *
+ * Poke CPU cpuid. If the target CPU is currently suspended having
+ * invoked the cpu-yield service, that vCPU will be resumed.
+ * Poke interrupts may only be sent to valid, non-local CPUs.
+ * It is not legal to poke the current vCPU.
+ */
+#define HV_FAST_CPU_POKE 0x13
+
+#ifndef __ASSEMBLY__
+unsigned long sun4v_cpu_poke(unsigned long cpuid);
+#endif
+
/* cpu_qconf()
* TRAP: HV_FAST_TRAP
* FUNCTION: HV_FAST_CPU_QCONF
diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h
index 5961b2d8398a..8ee1f97589a1 100644
--- a/arch/sparc/include/asm/page_64.h
+++ b/arch/sparc/include/asm/page_64.h
@@ -17,6 +17,7 @@
#define HPAGE_SHIFT 23
#define REAL_HPAGE_SHIFT 22
+#define HPAGE_16GB_SHIFT 34
#define HPAGE_2GB_SHIFT 31
#define HPAGE_256MB_SHIFT 28
#define HPAGE_64K_SHIFT 16
@@ -28,7 +29,7 @@
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
#define REAL_HPAGE_PER_HPAGE (_AC(1,UL) << (HPAGE_SHIFT - REAL_HPAGE_SHIFT))
-#define HUGE_MAX_HSTATE 4
+#define HUGE_MAX_HSTATE 5
#endif
#ifndef __ASSEMBLY__
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
index 6fbd931f0570..4fefe3762083 100644
--- a/arch/sparc/include/asm/pgtable_64.h
+++ b/arch/sparc/include/asm/pgtable_64.h
@@ -414,6 +414,11 @@ static inline bool is_hugetlb_pmd(pmd_t pmd)
return !!(pmd_val(pmd) & _PAGE_PMD_HUGE);
}
+static inline bool is_hugetlb_pud(pud_t pud)
+{
+ return !!(pud_val(pud) & _PAGE_PUD_HUGE);
+}
+
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline pmd_t pmd_mkhuge(pmd_t pmd)
{
@@ -687,6 +692,8 @@ static inline unsigned long pmd_write(pmd_t pmd)
return pte_write(pte);
}
+#define pud_write(pud) pte_write(__pte(pud_val(pud)))
+
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline unsigned long pmd_dirty(pmd_t pmd)
{
@@ -823,9 +830,18 @@ static inline unsigned long __pmd_page(pmd_t pmd)
return ((unsigned long) __va(pfn << PAGE_SHIFT));
}
+
+static inline unsigned long pud_page_vaddr(pud_t pud)
+{
+ pte_t pte = __pte(pud_val(pud));
+ unsigned long pfn;
+
+ pfn = pte_pfn(pte);
+
+ return ((unsigned long) __va(pfn << PAGE_SHIFT));
+}
+
#define pmd_page(pmd) virt_to_page((void *)__pmd_page(pmd))
-#define pud_page_vaddr(pud) \
- ((unsigned long) __va(pud_val(pud)))
#define pud_page(pud) virt_to_page((void *)pud_page_vaddr(pud))
#define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0UL)
#define pud_present(pud) (pud_val(pud) != 0U)
diff --git a/arch/sparc/include/asm/smp_64.h b/arch/sparc/include/asm/smp_64.h
index ce2233f7e662..a75089285db8 100644
--- a/arch/sparc/include/asm/smp_64.h
+++ b/arch/sparc/include/asm/smp_64.h
@@ -33,6 +33,9 @@
DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
extern cpumask_t cpu_core_map[NR_CPUS];
+void smp_init_cpu_poke(void);
+void scheduler_poke(void);
+
void arch_send_call_function_single_ipi(int cpu);
void arch_send_call_function_ipi_mask(const struct cpumask *mask);
@@ -74,6 +77,8 @@ void __cpu_die(unsigned int cpu);
#define smp_fetch_global_regs() do { } while (0)
#define smp_fetch_global_pmu() do { } while (0)
#define smp_fill_in_cpu_possible_map() do { } while (0)
+#define smp_init_cpu_poke() do { } while (0)
+#define scheduler_poke() do { } while (0)
#endif /* !(CONFIG_SMP) */
diff --git a/arch/sparc/include/asm/trap_block.h b/arch/sparc/include/asm/trap_block.h
index ff05992dae7a..dfc538609eb2 100644
--- a/arch/sparc/include/asm/trap_block.h
+++ b/arch/sparc/include/asm/trap_block.h
@@ -73,6 +73,8 @@ struct sun4v_1insn_patch_entry {
};
extern struct sun4v_1insn_patch_entry __sun4v_1insn_patch,
__sun4v_1insn_patch_end;
+extern struct sun4v_1insn_patch_entry __fast_win_ctrl_1insn_patch,
+ __fast_win_ctrl_1insn_patch_end;
struct sun4v_2insn_patch_entry {
unsigned int addr;
diff --git a/arch/sparc/include/asm/tsb.h b/arch/sparc/include/asm/tsb.h
index 32258e08da03..acf55063aa3d 100644
--- a/arch/sparc/include/asm/tsb.h
+++ b/arch/sparc/include/asm/tsb.h
@@ -195,6 +195,41 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
nop; \
699:
+ /* PUD has been loaded into REG1, interpret the value, seeing
+ * if it is a HUGE PUD or a normal one. If it is not valid
+ * then jump to FAIL_LABEL. If it is a HUGE PUD, and it
+ * translates to a valid PTE, branch to PTE_LABEL.
+ *
+ * We have to propagate bits [32:22] from the virtual address
+ * to resolve at 4M granularity.
+ */
+#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
+#define USER_PGTABLE_CHECK_PUD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, PTE_LABEL) \
+700: ba 700f; \
+ nop; \
+ .section .pud_huge_patch, "ax"; \
+ .word 700b; \
+ nop; \
+ .previous; \
+ brz,pn REG1, FAIL_LABEL; \
+ sethi %uhi(_PAGE_PUD_HUGE), REG2; \
+ sllx REG2, 32, REG2; \
+ andcc REG1, REG2, %g0; \
+ be,pt %xcc, 700f; \
+ sethi %hi(0x1ffc0000), REG2; \
+ sllx REG2, 1, REG2; \
+ brgez,pn REG1, FAIL_LABEL; \
+ andn REG1, REG2, REG1; \
+ and VADDR, REG2, REG2; \
+ brlz,pt REG1, PTE_LABEL; \
+ or REG1, REG2, REG1; \
+700:
+#else
+#define USER_PGTABLE_CHECK_PUD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, PTE_LABEL) \
+ brz,pn REG1, FAIL_LABEL; \
+ nop;
+#endif
+
/* PMD has been loaded into REG1, interpret the value, seeing
* if it is a HUGE PMD or a normal one. If it is not valid
* then jump to FAIL_LABEL. If it is a HUGE PMD, and it
@@ -242,6 +277,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
srlx REG2, 64 - PAGE_SHIFT, REG2; \
andn REG2, 0x7, REG2; \
ldxa [REG1 + REG2] ASI_PHYS_USE_EC, REG1; \
+ USER_PGTABLE_CHECK_PUD_HUGE(VADDR, REG1, REG2, FAIL_LABEL, 800f) \
brz,pn REG1, FAIL_LABEL; \
sllx VADDR, 64 - (PMD_SHIFT + PMD_BITS), REG2; \
srlx REG2, 64 - PAGE_SHIFT, REG2; \
diff --git a/arch/sparc/include/asm/vio.h b/arch/sparc/include/asm/vio.h
index d1c47e9f0090..f3d4ac232690 100644
--- a/arch/sparc/include/asm/vio.h
+++ b/arch/sparc/include/asm/vio.h
@@ -52,6 +52,7 @@ struct vio_ver_info {
#define VDEV_NETWORK_SWITCH 0x02
#define VDEV_DISK 0x03
#define VDEV_DISK_SERVER 0x04
+#define VDEV_CONSOLE_CON 0x05
u8 resv1[3];
u64 resv2[5];
@@ -282,6 +283,14 @@ struct vio_dring_state {
struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES];
};
+#define VIO_TAG_SIZE ((int)sizeof(struct vio_msg_tag))
+#define VIO_VCC_MTU_SIZE (LDC_PACKET_SIZE - VIO_TAG_SIZE)
+
+struct vio_vcc {
+ struct vio_msg_tag tag;
+ char data[VIO_VCC_MTU_SIZE];
+};
+
static inline void *vio_dring_cur(struct vio_dring_state *dr)
{
return dr->base + (dr->entry_size * dr->prod);
diff --git a/arch/sparc/include/uapi/asm/siginfo.h b/arch/sparc/include/uapi/asm/siginfo.h
index 2d9b79ccaa50..157f46fe374f 100644
--- a/arch/sparc/include/uapi/asm/siginfo.h
+++ b/arch/sparc/include/uapi/asm/siginfo.h
@@ -17,9 +17,16 @@
#define SI_NOINFO 32767 /* no information in siginfo_t */
/*
+ * SIGFPE si_codes
+ */
+#ifdef __KERNEL__
+#define FPE_FIXME 0 /* Broken dup of SI_USER */
+#endif /* __KERNEL__ */
+
+/*
* SIGEMT si_codes
*/
-#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */
+#define EMT_TAGOVF 1 /* tag overflow */
#define NSIGEMT 1
#endif /* _UAPI__SPARC_SIGINFO_H */
diff --git a/arch/sparc/kernel/etrap_64.S b/arch/sparc/kernel/etrap_64.S
index 1276ca2567ba..5c237467d156 100644
--- a/arch/sparc/kernel/etrap_64.S
+++ b/arch/sparc/kernel/etrap_64.S
@@ -38,7 +38,11 @@ etrap_syscall: TRAP_LOAD_THREAD_REG(%g6, %g1)
or %g1, %g3, %g1
bne,pn %xcc, 1f
sub %sp, STACKFRAME_SZ+TRACEREG_SZ-STACK_BIAS, %g2
- wrpr %g0, 7, %cleanwin
+661: wrpr %g0, 7, %cleanwin
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ .word 0x85880000 ! allclean
+ .previous
sethi %hi(TASK_REGOFF), %g2
sethi %hi(TSTATE_PEF), %g3
@@ -88,16 +92,30 @@ etrap_save: save %g2, -STACK_BIAS, %sp
bne,pn %xcc, 3f
mov PRIMARY_CONTEXT, %l4
- rdpr %canrestore, %g3
+661: rdpr %canrestore, %g3
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ nop
+ .previous
+
rdpr %wstate, %g2
- wrpr %g0, 0, %canrestore
+661: wrpr %g0, 0, %canrestore
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ nop
+ .previous
sll %g2, 3, %g2
/* Set TI_SYS_FPDEPTH to 1 and clear TI_SYS_NOERROR. */
mov 1, %l5
sth %l5, [%l6 + TI_SYS_NOERROR]
- wrpr %g3, 0, %otherwin
+661: wrpr %g3, 0, %otherwin
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ .word 0x87880000 ! otherw
+ .previous
+
wrpr %g2, 0, %wstate
sethi %hi(sparc64_kern_pri_context), %g2
ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3
diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S
index 78e0211753d2..4de9fbd1a177 100644
--- a/arch/sparc/kernel/head_64.S
+++ b/arch/sparc/kernel/head_64.S
@@ -603,10 +603,10 @@ niagara_tlb_fixup:
be,pt %xcc, niagara4_patch
nop
cmp %g1, SUN4V_CHIP_SPARC_M7
- be,pt %xcc, niagara4_patch
+ be,pt %xcc, sparc_m7_patch
nop
cmp %g1, SUN4V_CHIP_SPARC_M8
- be,pt %xcc, niagara4_patch
+ be,pt %xcc, sparc_m7_patch
nop
cmp %g1, SUN4V_CHIP_SPARC_SN
be,pt %xcc, niagara4_patch
@@ -621,6 +621,18 @@ niagara_tlb_fixup:
ba,a,pt %xcc, 80f
nop
+
+sparc_m7_patch:
+ call m7_patch_copyops
+ nop
+ call m7_patch_bzero
+ nop
+ call m7_patch_pageops
+ nop
+
+ ba,a,pt %xcc, 80f
+ nop
+
niagara4_patch:
call niagara4_patch_copyops
nop
@@ -881,7 +893,6 @@ sparc64_boot_end:
#include "misctrap.S"
#include "syscalls.S"
#include "helpers.S"
-#include "hvcalls.S"
#include "sun4v_tlb_miss.S"
#include "sun4v_ivec.S"
#include "ktlb.S"
@@ -926,6 +937,7 @@ swapper_4m_tsb:
! 0x0000000000428000
+#include "hvcalls.S"
#include "systbls_64.S"
.data
diff --git a/arch/sparc/kernel/hvapi.c b/arch/sparc/kernel/hvapi.c
index 267731234ce8..d41ce33d87d6 100644
--- a/arch/sparc/kernel/hvapi.c
+++ b/arch/sparc/kernel/hvapi.c
@@ -189,7 +189,7 @@ void __init sun4v_hvapi_init(void)
group = HV_GRP_CORE;
major = 1;
- minor = 1;
+ minor = 6;
if (sun4v_hvapi_register(group, major, &minor))
goto bad;
diff --git a/arch/sparc/kernel/hvcalls.S b/arch/sparc/kernel/hvcalls.S
index 4116ee5c7791..e57007ff7f8f 100644
--- a/arch/sparc/kernel/hvcalls.S
+++ b/arch/sparc/kernel/hvcalls.S
@@ -106,6 +106,17 @@ ENTRY(sun4v_cpu_yield)
nop
ENDPROC(sun4v_cpu_yield)
+ /* %o0: cpuid
+ *
+ * returns %o0: status
+ */
+ENTRY(sun4v_cpu_poke)
+ mov HV_FAST_CPU_POKE, %o5
+ ta HV_FAST_TRAP
+ retl
+ nop
+ENDPROC(sun4v_cpu_poke)
+
/* %o0: type
* %o1: queue paddr
* %o2: num queue entries
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
index 840e0b21bfe3..acffbc894ab0 100644
--- a/arch/sparc/kernel/ldc.c
+++ b/arch/sparc/kernel/ldc.c
@@ -1480,6 +1480,7 @@ int ldc_rx_reset(struct ldc_channel *lp)
{
return __set_rx_head(lp, lp->rx_tail);
}
+EXPORT_SYMBOL(ldc_rx_reset);
void __ldc_print(struct ldc_channel *lp, const char *caller)
{
@@ -1493,6 +1494,7 @@ void __ldc_print(struct ldc_channel *lp, const char *caller)
lp->tx_head, lp->tx_tail, lp->tx_num_entries,
lp->rcv_nxt, lp->snd_nxt);
}
+EXPORT_SYMBOL(__ldc_print);
static int write_raw(struct ldc_channel *lp, const void *buf, unsigned int size)
{
diff --git a/arch/sparc/kernel/leon_pci_grpci1.c b/arch/sparc/kernel/leon_pci_grpci1.c
index 1e77128a8f88..83ba5005d44c 100644
--- a/arch/sparc/kernel/leon_pci_grpci1.c
+++ b/arch/sparc/kernel/leon_pci_grpci1.c
@@ -695,7 +695,7 @@ err1:
return err;
}
-static struct of_device_id grpci1_of_match[] = {
+static const struct of_device_id grpci1_of_match[] __initconst = {
{
.name = "GAISLER_PCIFBRG",
},
diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c
index f727c4de1316..ff0e5c90310f 100644
--- a/arch/sparc/kernel/leon_pci_grpci2.c
+++ b/arch/sparc/kernel/leon_pci_grpci2.c
@@ -886,7 +886,7 @@ err1:
return err;
}
-static struct of_device_id grpci2_of_match[] = {
+static const struct of_device_id grpci2_of_match[] __initconst = {
{
.name = "GAISLER_GRPCI2",
},
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
index b96104da5bd6..44e5da405f96 100644
--- a/arch/sparc/kernel/process_64.c
+++ b/arch/sparc/kernel/process_64.c
@@ -77,8 +77,13 @@ void arch_cpu_idle(void)
: "=&r" (pstate)
: "i" (PSTATE_IE));
- if (!need_resched() && !cpu_is_offline(smp_processor_id()))
+ if (!need_resched() && !cpu_is_offline(smp_processor_id())) {
sun4v_cpu_yield();
+ /* If resumed by cpu_poke then we need to explicitly
+ * call scheduler_ipi().
+ */
+ scheduler_poke();
+ }
/* Re-enable interrupts. */
__asm__ __volatile__(
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S
index 709a82ebd294..dff86fad0a1f 100644
--- a/arch/sparc/kernel/rtrap_64.S
+++ b/arch/sparc/kernel/rtrap_64.S
@@ -224,10 +224,19 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
rdpr %otherwin, %l2
srl %l1, 3, %l1
- wrpr %l2, %g0, %canrestore
+661: wrpr %l2, %g0, %canrestore
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ .word 0x89880000 ! normalw
+ .previous
+
wrpr %l1, %g0, %wstate
brnz,pt %l2, user_rtt_restore
- wrpr %g0, %g0, %otherwin
+661: wrpr %g0, %g0, %otherwin
+ .section .fast_win_ctrl_1insn_patch, "ax"
+ .word 661b
+ nop
+ .previous
ldx [%g6 + TI_FLAGS], %g3
wr %g0, ASI_AIUP, %asi
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
index 150ee7d4b059..db4c4d7e28a0 100644
--- a/arch/sparc/kernel/setup_64.c
+++ b/arch/sparc/kernel/setup_64.c
@@ -300,6 +300,11 @@ static void __init sun4v_patch(void)
break;
}
+ if (sun4v_chip_type != SUN4V_CHIP_NIAGARA1) {
+ sun4v_patch_1insn_range(&__fast_win_ctrl_1insn_patch,
+ &__fast_win_ctrl_1insn_patch_end);
+ }
+
sun4v_hvapi_init();
}
@@ -363,6 +368,7 @@ void __init start_early_boot(void)
check_if_starfire();
per_cpu_patch();
sun4v_patch();
+ smp_init_cpu_poke();
cpu = hard_smp_processor_id();
if (cpu >= NR_CPUS) {
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
index b4096bb665b2..0e4c08c45a37 100644
--- a/arch/sparc/kernel/signal32.c
+++ b/arch/sparc/kernel/signal32.c
@@ -85,34 +85,34 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
at the same time. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
- switch (from->si_code >> 16) {
- case __SI_TIMER >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_TIMER:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_int, &to->si_int);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
default:
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_FAULT >> 16:
+ case SIL_FAULT:
err |= __put_user(from->si_trapno, &to->si_trapno);
err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_int, &to->si_int);
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index 3218bc43302e..4898329970c5 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -74,6 +74,9 @@ EXPORT_SYMBOL(cpu_core_sib_cache_map);
static cpumask_t smp_commenced_mask;
+static DEFINE_PER_CPU(bool, poke);
+static bool cpu_poke;
+
void smp_info(struct seq_file *m)
{
int i;
@@ -1439,15 +1442,86 @@ void __init smp_cpus_done(unsigned int max_cpus)
{
}
+static void send_cpu_ipi(int cpu)
+{
+ xcall_deliver((u64) &xcall_receive_signal,
+ 0, 0, cpumask_of(cpu));
+}
+
+void scheduler_poke(void)
+{
+ if (!cpu_poke)
+ return;
+
+ if (!__this_cpu_read(poke))
+ return;
+
+ __this_cpu_write(poke, false);
+ set_softint(1 << PIL_SMP_RECEIVE_SIGNAL);
+}
+
+static unsigned long send_cpu_poke(int cpu)
+{
+ unsigned long hv_err;
+
+ per_cpu(poke, cpu) = true;
+ hv_err = sun4v_cpu_poke(cpu);
+ if (hv_err != HV_EOK) {
+ per_cpu(poke, cpu) = false;
+ pr_err_ratelimited("%s: sun4v_cpu_poke() fails err=%lu\n",
+ __func__, hv_err);
+ }
+
+ return hv_err;
+}
+
void smp_send_reschedule(int cpu)
{
if (cpu == smp_processor_id()) {
WARN_ON_ONCE(preemptible());
set_softint(1 << PIL_SMP_RECEIVE_SIGNAL);
- } else {
- xcall_deliver((u64) &xcall_receive_signal,
- 0, 0, cpumask_of(cpu));
+ return;
+ }
+
+ /* Use cpu poke to resume idle cpu if supported. */
+ if (cpu_poke && idle_cpu(cpu)) {
+ unsigned long ret;
+
+ ret = send_cpu_poke(cpu);
+ if (ret == HV_EOK)
+ return;
}
+
+ /* Use IPI in following cases:
+ * - cpu poke not supported
+ * - cpu not idle
+ * - send_cpu_poke() returns with error
+ */
+ send_cpu_ipi(cpu);
+}
+
+void smp_init_cpu_poke(void)
+{
+ unsigned long major;
+ unsigned long minor;
+ int ret;
+
+ if (tlb_type != hypervisor)
+ return;
+
+ ret = sun4v_hvapi_get(HV_GRP_CORE, &major, &minor);
+ if (ret) {
+ pr_debug("HV_GRP_CORE is not registered\n");
+ return;
+ }
+
+ if (major == 1 && minor >= 6) {
+ /* CPU POKE is registered. */
+ cpu_poke = true;
+ return;
+ }
+
+ pr_debug("CPU_POKE not supported\n");
}
void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c
index 466d4aed06c7..581cf35ee7e3 100644
--- a/arch/sparc/kernel/traps_32.c
+++ b/arch/sparc/kernel/traps_32.c
@@ -306,7 +306,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
info.si_errno = 0;
info.si_addr = (void __user *)pc;
info.si_trapno = 0;
- info.si_code = __SI_FAULT;
+ info.si_code = FPE_FIXME;
if ((fsr & 0x1c000) == (1 << 14)) {
if (fsr & 0x10)
info.si_code = FPE_FLTINV;
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c
index ad31af1dd726..0a56dc257cb9 100644
--- a/arch/sparc/kernel/traps_64.c
+++ b/arch/sparc/kernel/traps_64.c
@@ -265,6 +265,45 @@ void sun4v_insn_access_exception_tl1(struct pt_regs *regs, unsigned long addr, u
sun4v_insn_access_exception(regs, addr, type_ctx);
}
+bool is_no_fault_exception(struct pt_regs *regs)
+{
+ unsigned char asi;
+ u32 insn;
+
+ if (get_user(insn, (u32 __user *)regs->tpc) == -EFAULT)
+ return false;
+
+ /*
+ * Must do a little instruction decoding here in order to
+ * decide on a course of action. The bits of interest are:
+ * insn[31:30] = op, where 3 indicates the load/store group
+ * insn[24:19] = op3, which identifies individual opcodes
+ * insn[13] indicates an immediate offset
+ * op3[4]=1 identifies alternate space instructions
+ * op3[5:4]=3 identifies floating point instructions
+ * op3[2]=1 identifies stores
+ * See "Opcode Maps" in the appendix of any Sparc V9
+ * architecture spec for full details.
+ */
+ if ((insn & 0xc0800000) == 0xc0800000) { /* op=3, op3[4]=1 */
+ if (insn & 0x2000) /* immediate offset */
+ asi = (regs->tstate >> 24); /* saved %asi */
+ else
+ asi = (insn >> 5); /* immediate asi */
+ if ((asi & 0xf2) == ASI_PNF) {
+ if (insn & 0x1000000) { /* op3[5:4]=3 */
+ handle_ldf_stq(insn, regs);
+ return true;
+ } else if (insn & 0x200000) { /* op3[2], stores */
+ return false;
+ }
+ handle_ld_nf(insn, regs);
+ return true;
+ }
+ }
+ return false;
+}
+
void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
{
enum ctx_state prev_state = exception_enter();
@@ -296,6 +335,9 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un
die_if_kernel("Dax", regs);
}
+ if (is_no_fault_exception(regs))
+ return;
+
info.si_signo = SIGSEGV;
info.si_errno = 0;
info.si_code = SEGV_MAPERR;
@@ -352,6 +394,9 @@ void sun4v_data_access_exception(struct pt_regs *regs, unsigned long addr, unsig
regs->tpc &= 0xffffffff;
regs->tnpc &= 0xffffffff;
}
+ if (is_no_fault_exception(regs))
+ return;
+
info.si_signo = SIGSEGV;
info.si_errno = 0;
info.si_code = SEGV_MAPERR;
@@ -2258,7 +2303,7 @@ static void do_fpe_common(struct pt_regs *regs)
info.si_errno = 0;
info.si_addr = (void __user *)regs->tpc;
info.si_trapno = 0;
- info.si_code = __SI_FAULT;
+ info.si_code = FPE_FIXME;
if ((fsr & 0x1c000) == (1 << 14)) {
if (fsr & 0x10)
info.si_code = FPE_FLTINV;
@@ -2575,6 +2620,9 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo
kernel_unaligned_trap(regs, *((unsigned int *)regs->tpc));
goto out;
}
+ if (is_no_fault_exception(regs))
+ return;
+
info.si_signo = SIGBUS;
info.si_errno = 0;
info.si_code = BUS_ADRALN;
@@ -2597,6 +2645,9 @@ void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_c
kernel_unaligned_trap(regs, *((unsigned int *)regs->tpc));
return;
}
+ if (is_no_fault_exception(regs))
+ return;
+
info.si_signo = SIGBUS;
info.si_errno = 0;
info.si_code = BUS_ADRALN;
diff --git a/arch/sparc/kernel/tsb.S b/arch/sparc/kernel/tsb.S
index db872dbfafe9..f74115364b1e 100644
--- a/arch/sparc/kernel/tsb.S
+++ b/arch/sparc/kernel/tsb.S
@@ -117,7 +117,7 @@ tsb_miss_page_table_walk_sun4v_fastpath:
/* Valid PTE is now in %g5. */
#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
- sethi %uhi(_PAGE_PMD_HUGE), %g7
+ sethi %uhi(_PAGE_PMD_HUGE | _PAGE_PUD_HUGE), %g7
sllx %g7, 32, %g7
andcc %g5, %g7, %g0
diff --git a/arch/sparc/kernel/vio.c b/arch/sparc/kernel/vio.c
index 1c8763c9c52b..da1ac3f22b24 100644
--- a/arch/sparc/kernel/vio.c
+++ b/arch/sparc/kernel/vio.c
@@ -246,6 +246,7 @@ u64 vio_vdev_node(struct mdesc_handle *hp, struct vio_dev *vdev)
return node;
}
+EXPORT_SYMBOL(vio_vdev_node);
static void vio_fill_channel_info(struct mdesc_handle *hp, u64 mp,
struct vio_dev *vdev)
diff --git a/arch/sparc/kernel/viohs.c b/arch/sparc/kernel/viohs.c
index d4f13c037a40..dcd278f29573 100644
--- a/arch/sparc/kernel/viohs.c
+++ b/arch/sparc/kernel/viohs.c
@@ -814,15 +814,21 @@ int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
case VDEV_NETWORK_SWITCH:
case VDEV_DISK:
case VDEV_DISK_SERVER:
+ case VDEV_CONSOLE_CON:
break;
default:
return -EINVAL;
}
- if (!ops || !ops->send_attr || !ops->handle_attr ||
- !ops->handshake_complete)
- return -EINVAL;
+ if (dev_class == VDEV_NETWORK ||
+ dev_class == VDEV_NETWORK_SWITCH ||
+ dev_class == VDEV_DISK ||
+ dev_class == VDEV_DISK_SERVER) {
+ if (!ops || !ops->send_attr || !ops->handle_attr ||
+ !ops->handshake_complete)
+ return -EINVAL;
+ }
if (!ver_table || ver_table_size < 0)
return -EINVAL;
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S
index 03b3d65d1266..d78847d56a4b 100644
--- a/arch/sparc/kernel/vmlinux.lds.S
+++ b/arch/sparc/kernel/vmlinux.lds.S
@@ -154,6 +154,16 @@ SECTIONS
*(.get_tick_patch)
__get_tick_patch_end = .;
}
+ .pud_huge_patch : {
+ __pud_huge_patch = .;
+ *(.pud_huge_patch)
+ __pud_huge_patch_end = .;
+ }
+ .fast_win_ctrl_1insn_patch : {
+ __fast_win_ctrl_1insn_patch = .;
+ *(.fast_win_ctrl_1insn_patch)
+ __fast_win_ctrl_1insn_patch_end = .;
+ }
PERCPU_SECTION(SMP_CACHE_BYTES)
#ifdef CONFIG_JUMP_LABEL
diff --git a/arch/sparc/lib/M7copy_from_user.S b/arch/sparc/lib/M7copy_from_user.S
new file mode 100644
index 000000000000..66464b3e3649
--- /dev/null
+++ b/arch/sparc/lib/M7copy_from_user.S
@@ -0,0 +1,40 @@
+/*
+ * M7copy_from_user.S: SPARC M7 optimized copy from userspace.
+ *
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ */
+
+
+#define EX_LD(x, y) \
+98: x; \
+ .section __ex_table,"a"; \
+ .align 4; \
+ .word 98b, y; \
+ .text; \
+ .align 4;
+
+#define EX_LD_FP(x, y) \
+98: x; \
+ .section __ex_table,"a"; \
+ .align 4; \
+ .word 98b, y##_fp; \
+ .text; \
+ .align 4;
+
+#ifndef ASI_AIUS
+#define ASI_AIUS 0x11
+#endif
+
+#define FUNC_NAME M7copy_from_user
+#define LOAD(type,addr,dest) type##a [addr] %asi, dest
+#define EX_RETVAL(x) 0
+
+#ifdef __KERNEL__
+#define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+ bne,pn %icc, raw_copy_in_user; \
+ nop
+#endif
+
+#include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7copy_to_user.S b/arch/sparc/lib/M7copy_to_user.S
new file mode 100644
index 000000000000..a60ac467f808
--- /dev/null
+++ b/arch/sparc/lib/M7copy_to_user.S
@@ -0,0 +1,51 @@
+/*
+ * M7copy_to_user.S: SPARC M7 optimized copy to userspace.
+ *
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ */
+
+
+#define EX_ST(x, y) \
+98: x; \
+ .section __ex_table,"a"; \
+ .align 4; \
+ .word 98b, y; \
+ .text; \
+ .align 4;
+
+#define EX_ST_FP(x, y) \
+98: x; \
+ .section __ex_table,"a"; \
+ .align 4; \
+ .word 98b, y##_fp; \
+ .text; \
+ .align 4;
+
+
+#ifndef ASI_AIUS
+#define ASI_AIUS 0x11
+#endif
+
+#ifndef ASI_BLK_INIT_QUAD_LDD_AIUS
+#define ASI_BLK_INIT_QUAD_LDD_AIUS 0x23
+#endif
+
+#define FUNC_NAME M7copy_to_user
+#define STORE(type,src,addr) type##a src, [addr] %asi
+#define STORE_ASI ASI_BLK_INIT_QUAD_LDD_AIUS
+#define STORE_MRU_ASI ASI_ST_BLKINIT_MRU_S
+#define EX_RETVAL(x) 0
+
+#ifdef __KERNEL__
+ /* Writing to %asi is _expensive_ so we hardcode it.
+ * Reading %asi to check for KERNEL_DS is comparatively
+ * cheap.
+ */
+#define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+ bne,pn %icc, raw_copy_in_user; \
+ nop
+#endif
+
+#include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7memcpy.S b/arch/sparc/lib/M7memcpy.S
new file mode 100644
index 000000000000..cbd42ea7c3f7
--- /dev/null
+++ b/arch/sparc/lib/M7memcpy.S
@@ -0,0 +1,923 @@
+/*
+ * M7memcpy: Optimized SPARC M7 memcpy
+ *
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ */
+
+ .file "M7memcpy.S"
+
+/*
+ * memcpy(s1, s2, len)
+ *
+ * Copy s2 to s1, always copy n bytes.
+ * Note: this C code does not work for overlapped copies.
+ *
+ * Fast assembler language version of the following C-program for memcpy
+ * which represents the `standard' for the C-library.
+ *
+ * void *
+ * memcpy(void *s, const void *s0, size_t n)
+ * {
+ * if (n != 0) {
+ * char *s1 = s;
+ * const char *s2 = s0;
+ * do {
+ * *s1++ = *s2++;
+ * } while (--n != 0);
+ * }
+ * return (s);
+ * }
+ *
+ *
+ * SPARC T7/M7 Flow :
+ *
+ * if (count < SMALL_MAX) {
+ * if count < SHORTCOPY (SHORTCOPY=3)
+ * copy bytes; exit with dst addr
+ * if src & dst aligned on word boundary but not long word boundary,
+ * copy with ldw/stw; branch to finish_up
+ * if src & dst aligned on long word boundary
+ * copy with ldx/stx; branch to finish_up
+ * if src & dst not aligned and length <= SHORTCHECK (SHORTCHECK=14)
+ * copy bytes; exit with dst addr
+ * move enough bytes to get src to word boundary
+ * if dst now on word boundary
+ * move_words:
+ * copy words; branch to finish_up
+ * if dst now on half word boundary
+ * load words, shift half words, store words; branch to finish_up
+ * if dst on byte 1
+ * load words, shift 3 bytes, store words; branch to finish_up
+ * if dst on byte 3
+ * load words, shift 1 byte, store words; branch to finish_up
+ * finish_up:
+ * copy bytes; exit with dst addr
+ * } else { More than SMALL_MAX bytes
+ * move bytes until dst is on long word boundary
+ * if( src is on long word boundary ) {
+ * if (count < MED_MAX) {
+ * finish_long: src/dst aligned on 8 bytes
+ * copy with ldx/stx in 8-way unrolled loop;
+ * copy final 0-63 bytes; exit with dst addr
+ * } else { src/dst aligned; count > MED_MAX
+ * align dst on 64 byte boundary; for main data movement:
+ * prefetch src data to L2 cache; let HW prefetch move data to L1 cache
+ * Use BIS (block initializing store) to avoid copying store cache
+ * lines from memory. But pre-store first element of each cache line
+ * ST_CHUNK lines in advance of the rest of that cache line. That
+ * gives time for replacement cache lines to be written back without
+ * excess STQ and Miss Buffer filling. Repeat until near the end,
+ * then finish up storing before going to finish_long.
+ * }
+ * } else { src/dst not aligned on 8 bytes
+ * if src is word aligned and count < MED_WMAX
+ * move words in 8-way unrolled loop
+ * move final 0-31 bytes; exit with dst addr
+ * if count < MED_UMAX
+ * use alignaddr/faligndata combined with ldd/std in 8-way
+ * unrolled loop to move data.
+ * go to unalign_done
+ * else
+ * setup alignaddr for faligndata instructions
+ * align dst on 64 byte boundary; prefetch src data to L1 cache
+ * loadx8, falign, block-store, prefetch loop
+ * (only use block-init-store when src/dst on 8 byte boundaries.)
+ * unalign_done:
+ * move remaining bytes for unaligned cases. exit with dst addr.
+ * }
+ *
+ */
+
+#include <asm/visasm.h>
+#include <asm/asi.h>
+
+#if !defined(EX_LD) && !defined(EX_ST)
+#define NON_USER_COPY
+#endif
+
+#ifndef EX_LD
+#define EX_LD(x,y) x
+#endif
+#ifndef EX_LD_FP
+#define EX_LD_FP(x,y) x
+#endif
+
+#ifndef EX_ST
+#define EX_ST(x,y) x
+#endif
+#ifndef EX_ST_FP
+#define EX_ST_FP(x,y) x
+#endif
+
+#ifndef EX_RETVAL
+#define EX_RETVAL(x) x
+#endif
+
+#ifndef LOAD
+#define LOAD(type,addr,dest) type [addr], dest
+#endif
+
+#ifndef STORE
+#define STORE(type,src,addr) type src, [addr]
+#endif
+
+/*
+ * ASI_BLK_INIT_QUAD_LDD_P/ASI_BLK_INIT_QUAD_LDD_S marks the cache
+ * line as "least recently used" which means if many threads are
+ * active, it has a high probability of being pushed out of the cache
+ * between the first initializing store and the final stores.
+ * Thus, we use ASI_ST_BLKINIT_MRU_P/ASI_ST_BLKINIT_MRU_S which
+ * marks the cache line as "most recently used" for all
+ * but the last cache line
+ */
+#ifndef STORE_ASI
+#ifndef SIMULATE_NIAGARA_ON_NON_NIAGARA
+#define STORE_ASI ASI_BLK_INIT_QUAD_LDD_P
+#else
+#define STORE_ASI 0x80 /* ASI_P */
+#endif
+#endif
+
+#ifndef STORE_MRU_ASI
+#ifndef SIMULATE_NIAGARA_ON_NON_NIAGARA
+#define STORE_MRU_ASI ASI_ST_BLKINIT_MRU_P
+#else
+#define STORE_MRU_ASI 0x80 /* ASI_P */
+#endif
+#endif
+
+#ifndef STORE_INIT
+#define STORE_INIT(src,addr) stxa src, [addr] STORE_ASI
+#endif
+
+#ifndef STORE_INIT_MRU
+#define STORE_INIT_MRU(src,addr) stxa src, [addr] STORE_MRU_ASI
+#endif
+
+#ifndef FUNC_NAME
+#define FUNC_NAME M7memcpy
+#endif
+
+#ifndef PREAMBLE
+#define PREAMBLE
+#endif
+
+#define BLOCK_SIZE 64
+#define SHORTCOPY 3
+#define SHORTCHECK 14
+#define SHORT_LONG 64 /* max copy for short longword-aligned case */
+ /* must be at least 64 */
+#define SMALL_MAX 128
+#define MED_UMAX 1024 /* max copy for medium un-aligned case */
+#define MED_WMAX 1024 /* max copy for medium word-aligned case */
+#define MED_MAX 1024 /* max copy for medium longword-aligned case */
+#define ST_CHUNK 24 /* ST_CHUNK - block of values for BIS Store */
+#define ALIGN_PRE 24 /* distance for aligned prefetch loop */
+
+ .register %g2,#scratch
+
+ .section ".text"
+ .global FUNC_NAME
+ .type FUNC_NAME, #function
+ .align 16
+FUNC_NAME:
+ srlx %o2, 31, %g2
+ cmp %g2, 0
+ tne %xcc, 5
+ PREAMBLE
+ mov %o0, %g1 ! save %o0
+ brz,pn %o2, .Lsmallx
+ cmp %o2, 3
+ ble,pn %icc, .Ltiny_cp
+ cmp %o2, 19
+ ble,pn %icc, .Lsmall_cp
+ or %o0, %o1, %g2
+ cmp %o2, SMALL_MAX
+ bl,pn %icc, .Lmedium_cp
+ nop
+
+.Lmedium:
+ neg %o0, %o5
+ andcc %o5, 7, %o5 ! bytes till DST 8 byte aligned
+ brz,pt %o5, .Ldst_aligned_on_8
+
+ ! %o5 has the bytes to be written in partial store.
+ sub %o2, %o5, %o2
+ sub %o1, %o0, %o1 ! %o1 gets the difference
+7: ! dst aligning loop
+ add %o1, %o0, %o4
+ EX_LD(LOAD(ldub, %o4, %o4), memcpy_retl_o2_plus_o5) ! load one byte
+ subcc %o5, 1, %o5
+ EX_ST(STORE(stb, %o4, %o0), memcpy_retl_o2_plus_o5_plus_1)
+ bgu,pt %xcc, 7b
+ add %o0, 1, %o0 ! advance dst
+ add %o1, %o0, %o1 ! restore %o1
+.Ldst_aligned_on_8:
+ andcc %o1, 7, %o5
+ brnz,pt %o5, .Lsrc_dst_unaligned_on_8
+ nop
+
+.Lsrc_dst_aligned_on_8:
+ ! check if we are copying MED_MAX or more bytes
+ set MED_MAX, %o3
+ cmp %o2, %o3 ! limit to store buffer size
+ bgu,pn %xcc, .Llarge_align8_copy
+ nop
+
+/*
+ * Special case for handling when src and dest are both long word aligned
+ * and total data to move is less than MED_MAX bytes
+ */
+.Lmedlong:
+ subcc %o2, 63, %o2 ! adjust length to allow cc test
+ ble,pn %xcc, .Lmedl63 ! skip big loop if less than 64 bytes
+ nop
+.Lmedl64:
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_63) ! load
+ subcc %o2, 64, %o2 ! decrement length count
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_63_64) ! and store
+ EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_63_56) ! a block of 64
+ EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_63_56)
+ EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_63_48)
+ EX_ST(STORE(stx, %o4, %o0+16), memcpy_retl_o2_plus_63_48)
+ EX_LD(LOAD(ldx, %o1+24, %o3), memcpy_retl_o2_plus_63_40)
+ EX_ST(STORE(stx, %o3, %o0+24), memcpy_retl_o2_plus_63_40)
+ EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_63_32)! load and store
+ EX_ST(STORE(stx, %o4, %o0+32), memcpy_retl_o2_plus_63_32)
+ EX_LD(LOAD(ldx, %o1+40, %o3), memcpy_retl_o2_plus_63_24)! a block of 64
+ add %o1, 64, %o1 ! increase src ptr by 64
+ EX_ST(STORE(stx, %o3, %o0+40), memcpy_retl_o2_plus_63_24)
+ EX_LD(LOAD(ldx, %o1-16, %o4), memcpy_retl_o2_plus_63_16)
+ add %o0, 64, %o0 ! increase dst ptr by 64
+ EX_ST(STORE(stx, %o4, %o0-16), memcpy_retl_o2_plus_63_16)
+ EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_63_8)
+ bgu,pt %xcc, .Lmedl64 ! repeat if at least 64 bytes left
+ EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_63_8)
+.Lmedl63:
+ addcc %o2, 32, %o2 ! adjust remaining count
+ ble,pt %xcc, .Lmedl31 ! to skip if 31 or fewer bytes left
+ nop
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_31) ! load
+ sub %o2, 32, %o2 ! decrement length count
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_31_32) ! and store
+ EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_31_24) ! a block of 32
+ add %o1, 32, %o1 ! increase src ptr by 32
+ EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_31_24)
+ EX_LD(LOAD(ldx, %o1-16, %o4), memcpy_retl_o2_plus_31_16)
+ add %o0, 32, %o0 ! increase dst ptr by 32
+ EX_ST(STORE(stx, %o4, %o0-16), memcpy_retl_o2_plus_31_16)
+ EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_31_8)
+ EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_31_8)
+.Lmedl31:
+ addcc %o2, 16, %o2 ! adjust remaining count
+ ble,pt %xcc, .Lmedl15 ! skip if 15 or fewer bytes left
+ nop !
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_15)
+ add %o1, 16, %o1 ! increase src ptr by 16
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_15)
+ sub %o2, 16, %o2 ! decrease count by 16
+ EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_15_8)
+ add %o0, 16, %o0 ! increase dst ptr by 16
+ EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_15_8)
+.Lmedl15:
+ addcc %o2, 15, %o2 ! restore count
+ bz,pt %xcc, .Lsmallx ! exit if finished
+ cmp %o2, 8
+ blt,pt %xcc, .Lmedw7 ! skip if 7 or fewer bytes left
+ tst %o2
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2) ! load 8 bytes
+ add %o1, 8, %o1 ! increase src ptr by 8
+ add %o0, 8, %o0 ! increase dst ptr by 8
+ subcc %o2, 8, %o2 ! decrease count by 8
+ bnz,pn %xcc, .Lmedw7
+ EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8) ! and store 8
+ retl
+ mov EX_RETVAL(%g1), %o0 ! restore %o0
+
+ .align 16
+.Lsrc_dst_unaligned_on_8:
+ ! DST is 8-byte aligned, src is not
+2:
+ andcc %o1, 0x3, %o5 ! test word alignment
+ bnz,pt %xcc, .Lunalignsetup ! branch to skip if not word aligned
+ nop
+
+/*
+ * Handle all cases where src and dest are aligned on word
+ * boundaries. Use unrolled loops for better performance.
+ * This option wins over standard large data move when
+ * source and destination is in cache for.Lmedium
+ * to short data moves.
+ */
+ set MED_WMAX, %o3
+ cmp %o2, %o3 ! limit to store buffer size
+ bge,pt %xcc, .Lunalignrejoin ! otherwise rejoin main loop
+ nop
+
+ subcc %o2, 31, %o2 ! adjust length to allow cc test
+ ! for end of loop
+ ble,pt %xcc, .Lmedw31 ! skip big loop if less than 16
+.Lmedw32:
+ EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2_plus_31)! move a block of 32
+ sllx %o4, 32, %o5
+ EX_LD(LOAD(ld, %o1+4, %o4), memcpy_retl_o2_plus_31)
+ or %o4, %o5, %o5
+ EX_ST(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_31)
+ subcc %o2, 32, %o2 ! decrement length count
+ EX_LD(LOAD(ld, %o1+8, %o4), memcpy_retl_o2_plus_31_24)
+ sllx %o4, 32, %o5
+ EX_LD(LOAD(ld, %o1+12, %o4), memcpy_retl_o2_plus_31_24)
+ or %o4, %o5, %o5
+ EX_ST(STORE(stx, %o5, %o0+8), memcpy_retl_o2_plus_31_24)
+ add %o1, 32, %o1 ! increase src ptr by 32
+ EX_LD(LOAD(ld, %o1-16, %o4), memcpy_retl_o2_plus_31_16)
+ sllx %o4, 32, %o5
+ EX_LD(LOAD(ld, %o1-12, %o4), memcpy_retl_o2_plus_31_16)
+ or %o4, %o5, %o5
+ EX_ST(STORE(stx, %o5, %o0+16), memcpy_retl_o2_plus_31_16)
+ add %o0, 32, %o0 ! increase dst ptr by 32
+ EX_LD(LOAD(ld, %o1-8, %o4), memcpy_retl_o2_plus_31_8)
+ sllx %o4, 32, %o5
+ EX_LD(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_31_8)
+ or %o4, %o5, %o5
+ bgu,pt %xcc, .Lmedw32 ! repeat if at least 32 bytes left
+ EX_ST(STORE(stx, %o5, %o0-8), memcpy_retl_o2_plus_31_8)
+.Lmedw31:
+ addcc %o2, 31, %o2 ! restore count
+
+ bz,pt %xcc, .Lsmallx ! exit if finished
+ nop
+ cmp %o2, 16
+ blt,pt %xcc, .Lmedw15
+ nop
+ EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2)! move a block of 16 bytes
+ sllx %o4, 32, %o5
+ subcc %o2, 16, %o2 ! decrement length count
+ EX_LD(LOAD(ld, %o1+4, %o4), memcpy_retl_o2_plus_16)
+ or %o4, %o5, %o5
+ EX_ST(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_16)
+ add %o1, 16, %o1 ! increase src ptr by 16
+ EX_LD(LOAD(ld, %o1-8, %o4), memcpy_retl_o2_plus_8)
+ add %o0, 16, %o0 ! increase dst ptr by 16
+ sllx %o4, 32, %o5
+ EX_LD(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_8)
+ or %o4, %o5, %o5
+ EX_ST(STORE(stx, %o5, %o0-8), memcpy_retl_o2_plus_8)
+.Lmedw15:
+ bz,pt %xcc, .Lsmallx ! exit if finished
+ cmp %o2, 8
+ blt,pn %xcc, .Lmedw7 ! skip if 7 or fewer bytes left
+ tst %o2
+ EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2) ! load 4 bytes
+ subcc %o2, 8, %o2 ! decrease count by 8
+ EX_ST(STORE(stw, %o4, %o0), memcpy_retl_o2_plus_8)! and store 4 bytes
+ add %o1, 8, %o1 ! increase src ptr by 8
+ EX_LD(LOAD(ld, %o1-4, %o3), memcpy_retl_o2_plus_4) ! load 4 bytes
+ add %o0, 8, %o0 ! increase dst ptr by 8
+ EX_ST(STORE(stw, %o3, %o0-4), memcpy_retl_o2_plus_4)! and store 4 bytes
+ bz,pt %xcc, .Lsmallx ! exit if finished
+.Lmedw7: ! count is ge 1, less than 8
+ cmp %o2, 4 ! check for 4 bytes left
+ blt,pn %xcc, .Lsmallleft3 ! skip if 3 or fewer bytes left
+ nop !
+ EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2) ! load 4 bytes
+ add %o1, 4, %o1 ! increase src ptr by 4
+ add %o0, 4, %o0 ! increase dst ptr by 4
+ subcc %o2, 4, %o2 ! decrease count by 4
+ bnz .Lsmallleft3
+ EX_ST(STORE(stw, %o4, %o0-4), memcpy_retl_o2_plus_4)! and store 4 bytes
+ retl
+ mov EX_RETVAL(%g1), %o0
+
+ .align 16
+.Llarge_align8_copy: ! Src and dst share 8 byte alignment
+ ! align dst to 64 byte boundary
+ andcc %o0, 0x3f, %o3 ! %o3 == 0 means dst is 64 byte aligned
+ brz,pn %o3, .Laligned_to_64
+ andcc %o0, 8, %o3 ! odd long words to move?
+ brz,pt %o3, .Laligned_to_16
+ nop
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2)
+ sub %o2, 8, %o2
+ add %o1, 8, %o1 ! increment src ptr
+ add %o0, 8, %o0 ! increment dst ptr
+ EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8)
+.Laligned_to_16:
+ andcc %o0, 16, %o3 ! pair of long words to move?
+ brz,pt %o3, .Laligned_to_32
+ nop
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2)
+ sub %o2, 16, %o2
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_16)
+ add %o1, 16, %o1 ! increment src ptr
+ EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_8)
+ add %o0, 16, %o0 ! increment dst ptr
+ EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8)
+.Laligned_to_32:
+ andcc %o0, 32, %o3 ! four long words to move?
+ brz,pt %o3, .Laligned_to_64
+ nop
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2)
+ sub %o2, 32, %o2
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_32)
+ EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_24)
+ EX_ST(STORE(stx, %o4, %o0+8), memcpy_retl_o2_plus_24)
+ EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_16)
+ EX_ST(STORE(stx, %o4, %o0+16), memcpy_retl_o2_plus_16)
+ add %o1, 32, %o1 ! increment src ptr
+ EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_8)
+ add %o0, 32, %o0 ! increment dst ptr
+ EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8)
+.Laligned_to_64:
+!
+! Using block init store (BIS) instructions to avoid fetching cache
+! lines from memory. Use ST_CHUNK stores to first element of each cache
+! line (similar to prefetching) to avoid overfilling STQ or miss buffers.
+! Gives existing cache lines time to be moved out of L1/L2/L3 cache.
+! Initial stores using MRU version of BIS to keep cache line in
+! cache until we are ready to store final element of cache line.
+! Then store last element using the LRU version of BIS.
+!
+ andn %o2, 0x3f, %o5 ! %o5 is multiple of block size
+ and %o2, 0x3f, %o2 ! residue bytes in %o2
+!
+! We use STORE_MRU_ASI for the first seven stores to each cache line
+! followed by STORE_ASI (mark as LRU) for the last store. That
+! mixed approach reduces the probability that the cache line is removed
+! before we finish setting it, while minimizing the effects on
+! other cached values during a large memcpy
+!
+! ST_CHUNK batches up initial BIS operations for several cache lines
+! to allow multiple requests to not be blocked by overflowing the
+! the store miss buffer. Then the matching stores for all those
+! BIS operations are executed.
+!
+
+ sub %o0, 8, %o0 ! adjust %o0 for ASI alignment
+.Lalign_loop:
+ cmp %o5, ST_CHUNK*64
+ blu,pt %xcc, .Lalign_loop_fin
+ mov ST_CHUNK,%o3
+.Lalign_loop_start:
+ prefetch [%o1 + (ALIGN_PRE * BLOCK_SIZE)], 21
+ subcc %o3, 1, %o3
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_o5)
+ add %o1, 64, %o1
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ bgu %xcc,.Lalign_loop_start
+ add %o0, 56, %o0
+
+ mov ST_CHUNK,%o3
+ sllx %o3, 6, %o4 ! ST_CHUNK*64
+ sub %o1, %o4, %o1 ! reset %o1
+ sub %o0, %o4, %o0 ! reset %o0
+
+.Lalign_loop_rest:
+ EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_o5)
+ add %o0, 16, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_o5)
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ subcc %o3, 1, %o3
+ EX_LD(LOAD(ldx, %o1+24, %o4), memcpy_retl_o2_plus_o5)
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_o5)
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+40, %o4), memcpy_retl_o2_plus_o5)
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+48, %o4), memcpy_retl_o2_plus_o5)
+ add %o1, 64, %o1
+ add %o0, 8, %o0
+ EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5)
+ add %o0, 8, %o0
+ EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_o5)
+ sub %o5, 64, %o5
+ bgu %xcc,.Lalign_loop_rest
+ ! mark cache line as LRU
+ EX_ST(STORE_INIT(%o4, %o0), memcpy_retl_o2_plus_o5_plus_64)
+
+ cmp %o5, ST_CHUNK*64
+ bgu,pt %xcc, .Lalign_loop_start
+ mov ST_CHUNK,%o3
+
+ cmp %o5, 0
+ beq .Lalign_done
+ nop
+.Lalign_loop_fin:
+ EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_o5)
+ EX_ST(STORE(stx, %o4, %o0+8), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_o5)
+ EX_ST(STORE(stx, %o4, %o0+8+8), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_o5)
+ EX_ST(STORE(stx, %o4, %o0+8+16), memcpy_retl_o2_plus_o5)
+ subcc %o5, 64, %o5
+ EX_LD(LOAD(ldx, %o1+24, %o4), memcpy_retl_o2_plus_o5_64)
+ EX_ST(STORE(stx, %o4, %o0+8+24), memcpy_retl_o2_plus_o5_64)
+ EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_o5_64)
+ EX_ST(STORE(stx, %o4, %o0+8+32), memcpy_retl_o2_plus_o5_64)
+ EX_LD(LOAD(ldx, %o1+40, %o4), memcpy_retl_o2_plus_o5_64)
+ EX_ST(STORE(stx, %o4, %o0+8+40), memcpy_retl_o2_plus_o5_64)
+ EX_LD(LOAD(ldx, %o1+48, %o4), memcpy_retl_o2_plus_o5_64)
+ add %o1, 64, %o1
+ EX_ST(STORE(stx, %o4, %o0+8+48), memcpy_retl_o2_plus_o5_64)
+ add %o0, 64, %o0
+ EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_o5_64)
+ bgu %xcc,.Lalign_loop_fin
+ EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_o5_64)
+
+.Lalign_done:
+ add %o0, 8, %o0 ! restore %o0 from ASI alignment
+ membar #StoreStore
+ sub %o2, 63, %o2 ! adjust length to allow cc test
+ ba .Lmedl63 ! in .Lmedl63
+ nop
+
+ .align 16
+ ! Dst is on 8 byte boundary; src is not; remaining count > SMALL_MAX
+.Lunalignsetup:
+.Lunalignrejoin:
+ mov %g1, %o3 ! save %g1 as VISEntryHalf clobbers it
+#ifdef NON_USER_COPY
+ VISEntryHalfFast(.Lmedium_vis_entry_fail_cp)
+#else
+ VISEntryHalf
+#endif
+ mov %o3, %g1 ! restore %g1
+
+ set MED_UMAX, %o3
+ cmp %o2, %o3 ! check for.Lmedium unaligned limit
+ bge,pt %xcc,.Lunalign_large
+ prefetch [%o1 + (4 * BLOCK_SIZE)], 20
+ andn %o2, 0x3f, %o5 ! %o5 is multiple of block size
+ and %o2, 0x3f, %o2 ! residue bytes in %o2
+ cmp %o2, 8 ! Insure we do not load beyond
+ bgt .Lunalign_adjust ! end of source buffer
+ andn %o1, 0x7, %o4 ! %o4 has long word aligned src address
+ add %o2, 64, %o2 ! adjust to leave loop
+ sub %o5, 64, %o5 ! early if necessary
+.Lunalign_adjust:
+ alignaddr %o1, %g0, %g0 ! generate %gsr
+ add %o1, %o5, %o1 ! advance %o1 to after blocks
+ EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5)
+.Lunalign_loop:
+ EX_LD_FP(LOAD(ldd, %o4+8, %f2), memcpy_retl_o2_plus_o5)
+ faligndata %f0, %f2, %f16
+ EX_LD_FP(LOAD(ldd, %o4+16, %f4), memcpy_retl_o2_plus_o5)
+ subcc %o5, BLOCK_SIZE, %o5
+ EX_ST_FP(STORE(std, %f16, %o0), memcpy_retl_o2_plus_o5_plus_64)
+ faligndata %f2, %f4, %f18
+ EX_LD_FP(LOAD(ldd, %o4+24, %f6), memcpy_retl_o2_plus_o5_plus_56)
+ EX_ST_FP(STORE(std, %f18, %o0+8), memcpy_retl_o2_plus_o5_plus_56)
+ faligndata %f4, %f6, %f20
+ EX_LD_FP(LOAD(ldd, %o4+32, %f8), memcpy_retl_o2_plus_o5_plus_48)
+ EX_ST_FP(STORE(std, %f20, %o0+16), memcpy_retl_o2_plus_o5_plus_48)
+ faligndata %f6, %f8, %f22
+ EX_LD_FP(LOAD(ldd, %o4+40, %f10), memcpy_retl_o2_plus_o5_plus_40)
+ EX_ST_FP(STORE(std, %f22, %o0+24), memcpy_retl_o2_plus_o5_plus_40)
+ faligndata %f8, %f10, %f24
+ EX_LD_FP(LOAD(ldd, %o4+48, %f12), memcpy_retl_o2_plus_o5_plus_32)
+ EX_ST_FP(STORE(std, %f24, %o0+32), memcpy_retl_o2_plus_o5_plus_32)
+ faligndata %f10, %f12, %f26
+ EX_LD_FP(LOAD(ldd, %o4+56, %f14), memcpy_retl_o2_plus_o5_plus_24)
+ add %o4, BLOCK_SIZE, %o4
+ EX_ST_FP(STORE(std, %f26, %o0+40), memcpy_retl_o2_plus_o5_plus_24)
+ faligndata %f12, %f14, %f28
+ EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5_plus_16)
+ EX_ST_FP(STORE(std, %f28, %o0+48), memcpy_retl_o2_plus_o5_plus_16)
+ faligndata %f14, %f0, %f30
+ EX_ST_FP(STORE(std, %f30, %o0+56), memcpy_retl_o2_plus_o5_plus_8)
+ add %o0, BLOCK_SIZE, %o0
+ bgu,pt %xcc, .Lunalign_loop
+ prefetch [%o4 + (5 * BLOCK_SIZE)], 20
+ ba .Lunalign_done
+ nop
+
+.Lunalign_large:
+ andcc %o0, 0x3f, %o3 ! is dst 64-byte block aligned?
+ bz %xcc, .Lunalignsrc
+ sub %o3, 64, %o3 ! %o3 will be multiple of 8
+ neg %o3 ! bytes until dest is 64 byte aligned
+ sub %o2, %o3, %o2 ! update cnt with bytes to be moved
+ ! Move bytes according to source alignment
+ andcc %o1, 0x1, %o5
+ bnz %xcc, .Lunalignbyte ! check for byte alignment
+ nop
+ andcc %o1, 2, %o5 ! check for half word alignment
+ bnz %xcc, .Lunalignhalf
+ nop
+ ! Src is word aligned
+.Lunalignword:
+ EX_LD_FP(LOAD(ld, %o1, %o4), memcpy_retl_o2_plus_o3) ! load 4 bytes
+ add %o1, 8, %o1 ! increase src ptr by 8
+ EX_ST_FP(STORE(stw, %o4, %o0), memcpy_retl_o2_plus_o3) ! and store 4
+ subcc %o3, 8, %o3 ! decrease count by 8
+ EX_LD_FP(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_o3_plus_4)! load 4
+ add %o0, 8, %o0 ! increase dst ptr by 8
+ bnz %xcc, .Lunalignword
+ EX_ST_FP(STORE(stw, %o4, %o0-4), memcpy_retl_o2_plus_o3_plus_4)
+ ba .Lunalignsrc
+ nop
+
+ ! Src is half-word aligned
+.Lunalignhalf:
+ EX_LD_FP(LOAD(lduh, %o1, %o4), memcpy_retl_o2_plus_o3) ! load 2 bytes
+ sllx %o4, 32, %o5 ! shift left
+ EX_LD_FP(LOAD(lduw, %o1+2, %o4), memcpy_retl_o2_plus_o3)
+ or %o4, %o5, %o5
+ sllx %o5, 16, %o5
+ EX_LD_FP(LOAD(lduh, %o1+6, %o4), memcpy_retl_o2_plus_o3)
+ or %o4, %o5, %o5
+ EX_ST_FP(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_o3)
+ add %o1, 8, %o1
+ subcc %o3, 8, %o3
+ bnz %xcc, .Lunalignhalf
+ add %o0, 8, %o0
+ ba .Lunalignsrc
+ nop
+
+ ! Src is Byte aligned
+.Lunalignbyte:
+ sub %o0, %o1, %o0 ! share pointer advance
+.Lunalignbyte_loop:
+ EX_LD_FP(LOAD(ldub, %o1, %o4), memcpy_retl_o2_plus_o3)
+ sllx %o4, 56, %o5
+ EX_LD_FP(LOAD(lduh, %o1+1, %o4), memcpy_retl_o2_plus_o3)
+ sllx %o4, 40, %o4
+ or %o4, %o5, %o5
+ EX_LD_FP(LOAD(lduh, %o1+3, %o4), memcpy_retl_o2_plus_o3)
+ sllx %o4, 24, %o4
+ or %o4, %o5, %o5
+ EX_LD_FP(LOAD(lduh, %o1+5, %o4), memcpy_retl_o2_plus_o3)
+ sllx %o4, 8, %o4
+ or %o4, %o5, %o5
+ EX_LD_FP(LOAD(ldub, %o1+7, %o4), memcpy_retl_o2_plus_o3)
+ or %o4, %o5, %o5
+ add %o0, %o1, %o0
+ EX_ST_FP(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_o3)
+ sub %o0, %o1, %o0
+ subcc %o3, 8, %o3
+ bnz %xcc, .Lunalignbyte_loop
+ add %o1, 8, %o1
+ add %o0,%o1, %o0 ! restore pointer
+
+ ! Destination is now block (64 byte aligned)
+.Lunalignsrc:
+ andn %o2, 0x3f, %o5 ! %o5 is multiple of block size
+ and %o2, 0x3f, %o2 ! residue bytes in %o2
+ add %o2, 64, %o2 ! Insure we do not load beyond
+ sub %o5, 64, %o5 ! end of source buffer
+
+ andn %o1, 0x7, %o4 ! %o4 has long word aligned src address
+ alignaddr %o1, %g0, %g0 ! generate %gsr
+ add %o1, %o5, %o1 ! advance %o1 to after blocks
+
+ EX_LD_FP(LOAD(ldd, %o4, %f14), memcpy_retl_o2_plus_o5)
+ add %o4, 8, %o4
+.Lunalign_sloop:
+ EX_LD_FP(LOAD(ldd, %o4, %f16), memcpy_retl_o2_plus_o5)
+ faligndata %f14, %f16, %f0
+ EX_LD_FP(LOAD(ldd, %o4+8, %f18), memcpy_retl_o2_plus_o5)
+ faligndata %f16, %f18, %f2
+ EX_LD_FP(LOAD(ldd, %o4+16, %f20), memcpy_retl_o2_plus_o5)
+ faligndata %f18, %f20, %f4
+ EX_ST_FP(STORE(std, %f0, %o0), memcpy_retl_o2_plus_o5)
+ subcc %o5, 64, %o5
+ EX_LD_FP(LOAD(ldd, %o4+24, %f22), memcpy_retl_o2_plus_o5_plus_56)
+ faligndata %f20, %f22, %f6
+ EX_ST_FP(STORE(std, %f2, %o0+8), memcpy_retl_o2_plus_o5_plus_56)
+ EX_LD_FP(LOAD(ldd, %o4+32, %f24), memcpy_retl_o2_plus_o5_plus_48)
+ faligndata %f22, %f24, %f8
+ EX_ST_FP(STORE(std, %f4, %o0+16), memcpy_retl_o2_plus_o5_plus_48)
+ EX_LD_FP(LOAD(ldd, %o4+40, %f26), memcpy_retl_o2_plus_o5_plus_40)
+ faligndata %f24, %f26, %f10
+ EX_ST_FP(STORE(std, %f6, %o0+24), memcpy_retl_o2_plus_o5_plus_40)
+ EX_LD_FP(LOAD(ldd, %o4+48, %f28), memcpy_retl_o2_plus_o5_plus_40)
+ faligndata %f26, %f28, %f12
+ EX_ST_FP(STORE(std, %f8, %o0+32), memcpy_retl_o2_plus_o5_plus_40)
+ add %o4, 64, %o4
+ EX_LD_FP(LOAD(ldd, %o4-8, %f30), memcpy_retl_o2_plus_o5_plus_40)
+ faligndata %f28, %f30, %f14
+ EX_ST_FP(STORE(std, %f10, %o0+40), memcpy_retl_o2_plus_o5_plus_40)
+ EX_ST_FP(STORE(std, %f12, %o0+48), memcpy_retl_o2_plus_o5_plus_40)
+ add %o0, 64, %o0
+ EX_ST_FP(STORE(std, %f14, %o0-8), memcpy_retl_o2_plus_o5_plus_40)
+ fsrc2 %f30, %f14
+ bgu,pt %xcc, .Lunalign_sloop
+ prefetch [%o4 + (8 * BLOCK_SIZE)], 20
+
+.Lunalign_done:
+ ! Handle trailing bytes, 64 to 127
+ ! Dest long word aligned, Src not long word aligned
+ cmp %o2, 15
+ bleu %xcc, .Lunalign_short
+
+ andn %o2, 0x7, %o5 ! %o5 is multiple of 8
+ and %o2, 0x7, %o2 ! residue bytes in %o2
+ add %o2, 8, %o2
+ sub %o5, 8, %o5 ! insure we do not load past end of src
+ andn %o1, 0x7, %o4 ! %o4 has long word aligned src address
+ add %o1, %o5, %o1 ! advance %o1 to after multiple of 8
+ EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5)! fetch partialword
+.Lunalign_by8:
+ EX_LD_FP(LOAD(ldd, %o4+8, %f2), memcpy_retl_o2_plus_o5)
+ add %o4, 8, %o4
+ faligndata %f0, %f2, %f16
+ subcc %o5, 8, %o5
+ EX_ST_FP(STORE(std, %f16, %o0), memcpy_retl_o2_plus_o5)
+ fsrc2 %f2, %f0
+ bgu,pt %xcc, .Lunalign_by8
+ add %o0, 8, %o0
+
+.Lunalign_short:
+#ifdef NON_USER_COPY
+ VISExitHalfFast
+#else
+ VISExitHalf
+#endif
+ ba .Lsmallrest
+ nop
+
+/*
+ * This is a special case of nested memcpy. This can happen when kernel
+ * calls unaligned memcpy back to back without saving FP registers. We need
+ * traps(context switch) to save/restore FP registers. If the kernel calls
+ * memcpy without this trap sequence we will hit FP corruption. Let's use
+ * the normal integer load/store method in this case.
+ */
+
+#ifdef NON_USER_COPY
+.Lmedium_vis_entry_fail_cp:
+ or %o0, %o1, %g2
+#endif
+.Lmedium_cp:
+ LOAD(prefetch, %o1 + 0x40, #n_reads_strong)
+ andcc %g2, 0x7, %g0
+ bne,pn %xcc, .Lmedium_unaligned_cp
+ nop
+
+.Lmedium_noprefetch_cp:
+ andncc %o2, 0x20 - 1, %o5
+ be,pn %xcc, 2f
+ sub %o2, %o5, %o2
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x08, %g2), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x10, %g7), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x18, %o4), memcpy_retl_o2_plus_o5)
+ add %o1, 0x20, %o1
+ subcc %o5, 0x20, %o5
+ EX_ST(STORE(stx, %o3, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_32)
+ EX_ST(STORE(stx, %g2, %o0 + 0x08), memcpy_retl_o2_plus_o5_plus_24)
+ EX_ST(STORE(stx, %g7, %o0 + 0x10), memcpy_retl_o2_plus_o5_plus_24)
+ EX_ST(STORE(stx, %o4, %o0 + 0x18), memcpy_retl_o2_plus_o5_plus_8)
+ bne,pt %xcc, 1b
+ add %o0, 0x20, %o0
+2: andcc %o2, 0x18, %o5
+ be,pt %xcc, 3f
+ sub %o2, %o5, %o2
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5)
+ add %o1, 0x08, %o1
+ add %o0, 0x08, %o0
+ subcc %o5, 0x08, %o5
+ bne,pt %xcc, 1b
+ EX_ST(STORE(stx, %o3, %o0 - 0x08), memcpy_retl_o2_plus_o5_plus_8)
+3: brz,pt %o2, .Lexit_cp
+ cmp %o2, 0x04
+ bl,pn %xcc, .Ltiny_cp
+ nop
+ EX_LD(LOAD(lduw, %o1 + 0x00, %o3), memcpy_retl_o2)
+ add %o1, 0x04, %o1
+ add %o0, 0x04, %o0
+ subcc %o2, 0x04, %o2
+ bne,pn %xcc, .Ltiny_cp
+ EX_ST(STORE(stw, %o3, %o0 - 0x04), memcpy_retl_o2_plus_4)
+ ba,a,pt %xcc, .Lexit_cp
+
+.Lmedium_unaligned_cp:
+ /* First get dest 8 byte aligned. */
+ sub %g0, %o0, %o3
+ and %o3, 0x7, %o3
+ brz,pt %o3, 2f
+ sub %o2, %o3, %o2
+
+1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), memcpy_retl_o2_plus_g1)
+ add %o1, 1, %o1
+ subcc %o3, 1, %o3
+ add %o0, 1, %o0
+ bne,pt %xcc, 1b
+ EX_ST(STORE(stb, %g2, %o0 - 0x01), memcpy_retl_o2_plus_g1_plus_1)
+2:
+ and %o1, 0x7, %o3
+ brz,pn %o3, .Lmedium_noprefetch_cp
+ sll %o3, 3, %o3
+ mov 64, %g2
+ sub %g2, %o3, %g2
+ andn %o1, 0x7, %o1
+ EX_LD(LOAD(ldx, %o1 + 0x00, %o4), memcpy_retl_o2)
+ sllx %o4, %o3, %o4
+ andn %o2, 0x08 - 1, %o5
+ sub %o2, %o5, %o2
+
+1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3), memcpy_retl_o2_plus_o5)
+ add %o1, 0x08, %o1
+ subcc %o5, 0x08, %o5
+ srlx %g3, %g2, %g7
+ or %g7, %o4, %g7
+ EX_ST(STORE(stx, %g7, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_8)
+ add %o0, 0x08, %o0
+ bne,pt %xcc, 1b
+ sllx %g3, %o3, %o4
+ srl %o3, 3, %o3
+ add %o1, %o3, %o1
+ brz,pn %o2, .Lexit_cp
+ nop
+ ba,pt %xcc, .Lsmall_unaligned_cp
+
+.Ltiny_cp:
+ EX_LD(LOAD(ldub, %o1 + 0x00, %o3), memcpy_retl_o2)
+ subcc %o2, 1, %o2
+ be,pn %xcc, .Lexit_cp
+ EX_ST(STORE(stb, %o3, %o0 + 0x00), memcpy_retl_o2_plus_1)
+ EX_LD(LOAD(ldub, %o1 + 0x01, %o3), memcpy_retl_o2)
+ subcc %o2, 1, %o2
+ be,pn %xcc, .Lexit_cp
+ EX_ST(STORE(stb, %o3, %o0 + 0x01), memcpy_retl_o2_plus_1)
+ EX_LD(LOAD(ldub, %o1 + 0x02, %o3), memcpy_retl_o2)
+ ba,pt %xcc, .Lexit_cp
+ EX_ST(STORE(stb, %o3, %o0 + 0x02), memcpy_retl_o2)
+
+.Lsmall_cp:
+ andcc %g2, 0x3, %g0
+ bne,pn %xcc, .Lsmall_unaligned_cp
+ andn %o2, 0x4 - 1, %o5
+ sub %o2, %o5, %o2
+1:
+ EX_LD(LOAD(lduw, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5)
+ add %o1, 0x04, %o1
+ subcc %o5, 0x04, %o5
+ add %o0, 0x04, %o0
+ bne,pt %xcc, 1b
+ EX_ST(STORE(stw, %o3, %o0 - 0x04), memcpy_retl_o2_plus_o5_plus_4)
+ brz,pt %o2, .Lexit_cp
+ nop
+ ba,a,pt %xcc, .Ltiny_cp
+
+.Lsmall_unaligned_cp:
+1: EX_LD(LOAD(ldub, %o1 + 0x00, %o3), memcpy_retl_o2)
+ add %o1, 1, %o1
+ add %o0, 1, %o0
+ subcc %o2, 1, %o2
+ bne,pt %xcc, 1b
+ EX_ST(STORE(stb, %o3, %o0 - 0x01), memcpy_retl_o2_plus_1)
+ ba,a,pt %xcc, .Lexit_cp
+
+.Lsmallrest:
+ tst %o2
+ bz,pt %xcc, .Lsmallx
+ cmp %o2, 4
+ blt,pn %xcc, .Lsmallleft3
+ nop
+ sub %o2, 3, %o2
+.Lsmallnotalign4:
+ EX_LD(LOAD(ldub, %o1, %o3), memcpy_retl_o2_plus_3)! read byte
+ subcc %o2, 4, %o2 ! reduce count by 4
+ EX_ST(STORE(stb, %o3, %o0), memcpy_retl_o2_plus_7)! write byte & repeat
+ EX_LD(LOAD(ldub, %o1+1, %o3), memcpy_retl_o2_plus_6)! for total of 4
+ add %o1, 4, %o1 ! advance SRC by 4
+ EX_ST(STORE(stb, %o3, %o0+1), memcpy_retl_o2_plus_6)
+ EX_LD(LOAD(ldub, %o1-2, %o3), memcpy_retl_o2_plus_5)
+ add %o0, 4, %o0 ! advance DST by 4
+ EX_ST(STORE(stb, %o3, %o0-2), memcpy_retl_o2_plus_5)
+ EX_LD(LOAD(ldub, %o1-1, %o3), memcpy_retl_o2_plus_4)
+ bgu,pt %xcc, .Lsmallnotalign4 ! loop til 3 or fewer bytes remain
+ EX_ST(STORE(stb, %o3, %o0-1), memcpy_retl_o2_plus_4)
+ addcc %o2, 3, %o2 ! restore count
+ bz,pt %xcc, .Lsmallx
+.Lsmallleft3: ! 1, 2, or 3 bytes remain
+ subcc %o2, 1, %o2
+ EX_LD(LOAD(ldub, %o1, %o3), memcpy_retl_o2_plus_1) ! load one byte
+ bz,pt %xcc, .Lsmallx
+ EX_ST(STORE(stb, %o3, %o0), memcpy_retl_o2_plus_1) ! store one byte
+ EX_LD(LOAD(ldub, %o1+1, %o3), memcpy_retl_o2) ! load second byte
+ subcc %o2, 1, %o2
+ bz,pt %xcc, .Lsmallx
+ EX_ST(STORE(stb, %o3, %o0+1), memcpy_retl_o2_plus_1)! store second byte
+ EX_LD(LOAD(ldub, %o1+2, %o3), memcpy_retl_o2) ! load third byte
+ EX_ST(STORE(stb, %o3, %o0+2), memcpy_retl_o2) ! store third byte
+.Lsmallx:
+ retl
+ mov EX_RETVAL(%g1), %o0
+.Lsmallfin:
+ tst %o2
+ bnz,pn %xcc, .Lsmallleft3
+ nop
+ retl
+ mov EX_RETVAL(%g1), %o0 ! restore %o0
+.Lexit_cp:
+ retl
+ mov EX_RETVAL(%g1), %o0
+ .size FUNC_NAME, .-FUNC_NAME
diff --git a/arch/sparc/lib/M7memset.S b/arch/sparc/lib/M7memset.S
new file mode 100644
index 000000000000..62ea91b3a6b8
--- /dev/null
+++ b/arch/sparc/lib/M7memset.S
@@ -0,0 +1,352 @@
+/*
+ * M7memset.S: SPARC M7 optimized memset.
+ *
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ */
+
+/*
+ * M7memset.S: M7 optimized memset.
+ *
+ * char *memset(sp, c, n)
+ *
+ * Set an array of n chars starting at sp to the character c.
+ * Return sp.
+ *
+ * Fast assembler language version of the following C-program for memset
+ * which represents the `standard' for the C-library.
+ *
+ * void *
+ * memset(void *sp1, int c, size_t n)
+ * {
+ * if (n != 0) {
+ * char *sp = sp1;
+ * do {
+ * *sp++ = (char)c;
+ * } while (--n != 0);
+ * }
+ * return (sp1);
+ * }
+ *
+ * The algorithm is as follows :
+ *
+ * For small 6 or fewer bytes stores, bytes will be stored.
+ *
+ * For less than 32 bytes stores, align the address on 4 byte boundary.
+ * Then store as many 4-byte chunks, followed by trailing bytes.
+ *
+ * For sizes greater than 32 bytes, align the address on 8 byte boundary.
+ * if (count >= 64) {
+ * store 8-bytes chunks to align the address on 64 byte boundary
+ * if (value to be set is zero && count >= MIN_ZERO) {
+ * Using BIS stores, set the first long word of each
+ * 64-byte cache line to zero which will also clear the
+ * other seven long words of the cache line.
+ * }
+ * else if (count >= MIN_LOOP) {
+ * Using BIS stores, set the first long word of each of
+ * ST_CHUNK cache lines (64 bytes each) before the main
+ * loop is entered.
+ * In the main loop, continue pre-setting the first long
+ * word of each cache line ST_CHUNK lines in advance while
+ * setting the other seven long words (56 bytes) of each
+ * cache line until fewer than ST_CHUNK*64 bytes remain.
+ * Then set the remaining seven long words of each cache
+ * line that has already had its first long word set.
+ * }
+ * store remaining data in 64-byte chunks until less than
+ * 64 bytes remain.
+ * }
+ * Store as many 8-byte chunks, followed by trailing bytes.
+ *
+ * BIS = Block Init Store
+ * Doing the advance store of the first element of the cache line
+ * initiates the displacement of a cache line while only using a single
+ * instruction in the pipeline. That avoids various pipeline delays,
+ * such as filling the miss buffer. The performance effect is
+ * similar to prefetching for normal stores.
+ * The special case for zero fills runs faster and uses fewer instruction
+ * cycles than the normal memset loop.
+ *
+ * We only use BIS for memset of greater than MIN_LOOP bytes because a sequence
+ * BIS stores must be followed by a membar #StoreStore. The benefit of
+ * the BIS store must be balanced against the cost of the membar operation.
+ */
+
+/*
+ * ASI_STBI_P marks the cache line as "least recently used"
+ * which means if many threads are active, it has a high chance
+ * of being pushed out of the cache between the first initializing
+ * store and the final stores.
+ * Thus, we use ASI_STBIMRU_P which marks the cache line as
+ * "most recently used" for all but the last store to the cache line.
+ */
+
+#include <asm/asi.h>
+#include <asm/page.h>
+
+#define ASI_STBI_P ASI_BLK_INIT_QUAD_LDD_P
+#define ASI_STBIMRU_P ASI_ST_BLKINIT_MRU_P
+
+
+#define ST_CHUNK 24 /* multiple of 4 due to loop unrolling */
+#define MIN_LOOP 16320
+#define MIN_ZERO 512
+
+ .section ".text"
+ .align 32
+
+/*
+ * Define clear_page(dest) as memset(dest, 0, PAGE_SIZE)
+ * (can create a more optimized version later.)
+ */
+ .globl M7clear_page
+ .globl M7clear_user_page
+M7clear_page: /* clear_page(dest) */
+M7clear_user_page:
+ set PAGE_SIZE, %o1
+ /* fall through into bzero code */
+
+ .size M7clear_page,.-M7clear_page
+ .size M7clear_user_page,.-M7clear_user_page
+
+/*
+ * Define bzero(dest, n) as memset(dest, 0, n)
+ * (can create a more optimized version later.)
+ */
+ .globl M7bzero
+M7bzero: /* bzero(dest, size) */
+ mov %o1, %o2
+ mov 0, %o1
+ /* fall through into memset code */
+
+ .size M7bzero,.-M7bzero
+
+ .global M7memset
+ .type M7memset, #function
+ .register %g3, #scratch
+M7memset:
+ mov %o0, %o5 ! copy sp1 before using it
+ cmp %o2, 7 ! if small counts, just write bytes
+ bleu,pn %xcc, .wrchar
+ and %o1, 0xff, %o1 ! o1 is (char)c
+
+ sll %o1, 8, %o3
+ or %o1, %o3, %o1 ! now o1 has 2 bytes of c
+ sll %o1, 16, %o3
+ cmp %o2, 32
+ blu,pn %xcc, .wdalign
+ or %o1, %o3, %o1 ! now o1 has 4 bytes of c
+
+ sllx %o1, 32, %o3
+ or %o1, %o3, %o1 ! now o1 has 8 bytes of c
+
+.dbalign:
+ andcc %o5, 7, %o3 ! is sp1 aligned on a 8 byte bound?
+ bz,pt %xcc, .blkalign ! already long word aligned
+ sub %o3, 8, %o3 ! -(bytes till long word aligned)
+
+ add %o2, %o3, %o2 ! update o2 with new count
+ ! Set -(%o3) bytes till sp1 long word aligned
+1: stb %o1, [%o5] ! there is at least 1 byte to set
+ inccc %o3 ! byte clearing loop
+ bl,pt %xcc, 1b
+ inc %o5
+
+ ! Now sp1 is long word aligned (sp1 is found in %o5)
+.blkalign:
+ cmp %o2, 64 ! check if there are 64 bytes to set
+ blu,pn %xcc, .wrshort
+ mov %o2, %o3
+
+ andcc %o5, 63, %o3 ! is sp1 block aligned?
+ bz,pt %xcc, .blkwr ! now block aligned
+ sub %o3, 64, %o3 ! o3 is -(bytes till block aligned)
+ add %o2, %o3, %o2 ! o2 is the remainder
+
+ ! Store -(%o3) bytes till dst is block (64 byte) aligned.
+ ! Use long word stores.
+ ! Recall that dst is already long word aligned
+1:
+ addcc %o3, 8, %o3
+ stx %o1, [%o5]
+ bl,pt %xcc, 1b
+ add %o5, 8, %o5
+
+ ! Now sp1 is block aligned
+.blkwr:
+ andn %o2, 63, %o4 ! calculate size of blocks in bytes
+ brz,pn %o1, .wrzero ! special case if c == 0
+ and %o2, 63, %o3 ! %o3 = bytes left after blk stores.
+
+ set MIN_LOOP, %g1
+ cmp %o4, %g1 ! check there are enough bytes to set
+ blu,pn %xcc, .short_set ! to justify cost of membar
+ ! must be > pre-cleared lines
+ nop
+
+ ! initial cache-clearing stores
+ ! get store pipeline moving
+ rd %asi, %g3 ! save %asi to be restored later
+ wr %g0, ASI_STBIMRU_P, %asi
+
+ ! Primary memset loop for large memsets
+.wr_loop:
+ sub %o5, 8, %o5 ! adjust %o5 for ASI store alignment
+ mov ST_CHUNK, %g1
+.wr_loop_start:
+ stxa %o1, [%o5+8]%asi
+ subcc %g1, 4, %g1
+ stxa %o1, [%o5+8+64]%asi
+ add %o5, 256, %o5
+ stxa %o1, [%o5+8-128]%asi
+ bgu %xcc, .wr_loop_start
+ stxa %o1, [%o5+8-64]%asi
+
+ sub %o5, ST_CHUNK*64, %o5 ! reset %o5
+ mov ST_CHUNK, %g1
+
+.wr_loop_rest:
+ stxa %o1, [%o5+8+8]%asi
+ sub %o4, 64, %o4
+ stxa %o1, [%o5+16+8]%asi
+ subcc %g1, 1, %g1
+ stxa %o1, [%o5+24+8]%asi
+ stxa %o1, [%o5+32+8]%asi
+ stxa %o1, [%o5+40+8]%asi
+ add %o5, 64, %o5
+ stxa %o1, [%o5-8]%asi
+ bgu %xcc, .wr_loop_rest
+ stxa %o1, [%o5]ASI_STBI_P
+
+ ! If more than ST_CHUNK*64 bytes remain to set, continue
+ ! setting the first long word of each cache line in advance
+ ! to keep the store pipeline moving.
+
+ cmp %o4, ST_CHUNK*64
+ bge,pt %xcc, .wr_loop_start
+ mov ST_CHUNK, %g1
+
+ brz,a,pn %o4, .asi_done
+ add %o5, 8, %o5 ! restore %o5 offset
+
+.wr_loop_small:
+ stxa %o1, [%o5+8]%asi
+ stxa %o1, [%o5+8+8]%asi
+ stxa %o1, [%o5+16+8]%asi
+ stxa %o1, [%o5+24+8]%asi
+ stxa %o1, [%o5+32+8]%asi
+ subcc %o4, 64, %o4
+ stxa %o1, [%o5+40+8]%asi
+ add %o5, 64, %o5
+ stxa %o1, [%o5-8]%asi
+ bgu,pt %xcc, .wr_loop_small
+ stxa %o1, [%o5]ASI_STBI_P
+
+ ba .asi_done
+ add %o5, 8, %o5 ! restore %o5 offset
+
+ ! Special case loop for zero fill memsets
+ ! For each 64 byte cache line, single STBI to first element
+ ! clears line
+.wrzero:
+ cmp %o4, MIN_ZERO ! check if enough bytes to set
+ ! to pay %asi + membar cost
+ blu %xcc, .short_set
+ nop
+ sub %o4, 256, %o4
+
+.wrzero_loop:
+ mov 64, %g3
+ stxa %o1, [%o5]ASI_STBI_P
+ subcc %o4, 256, %o4
+ stxa %o1, [%o5+%g3]ASI_STBI_P
+ add %o5, 256, %o5
+ sub %g3, 192, %g3
+ stxa %o1, [%o5+%g3]ASI_STBI_P
+ add %g3, 64, %g3
+ bge,pt %xcc, .wrzero_loop
+ stxa %o1, [%o5+%g3]ASI_STBI_P
+ add %o4, 256, %o4
+
+ brz,pn %o4, .bsi_done
+ nop
+
+.wrzero_small:
+ stxa %o1, [%o5]ASI_STBI_P
+ subcc %o4, 64, %o4
+ bgu,pt %xcc, .wrzero_small
+ add %o5, 64, %o5
+ ba,a .bsi_done
+
+.asi_done:
+ wr %g3, 0x0, %asi ! restored saved %asi
+.bsi_done:
+ membar #StoreStore ! required by use of Block Store Init
+
+.short_set:
+ cmp %o4, 64 ! check if 64 bytes to set
+ blu %xcc, 5f
+ nop
+4: ! set final blocks of 64 bytes
+ stx %o1, [%o5]
+ stx %o1, [%o5+8]
+ stx %o1, [%o5+16]
+ stx %o1, [%o5+24]
+ subcc %o4, 64, %o4
+ stx %o1, [%o5+32]
+ stx %o1, [%o5+40]
+ add %o5, 64, %o5
+ stx %o1, [%o5-16]
+ bgu,pt %xcc, 4b
+ stx %o1, [%o5-8]
+
+5:
+ ! Set the remaining long words
+.wrshort:
+ subcc %o3, 8, %o3 ! Can we store any long words?
+ blu,pn %xcc, .wrchars
+ and %o2, 7, %o2 ! calc bytes left after long words
+6:
+ subcc %o3, 8, %o3
+ stx %o1, [%o5] ! store the long words
+ bgeu,pt %xcc, 6b
+ add %o5, 8, %o5
+
+.wrchars: ! check for extra chars
+ brnz %o2, .wrfin
+ nop
+ retl
+ nop
+
+.wdalign:
+ andcc %o5, 3, %o3 ! is sp1 aligned on a word boundary
+ bz,pn %xcc, .wrword
+ andn %o2, 3, %o3 ! create word sized count in %o3
+
+ dec %o2 ! decrement count
+ stb %o1, [%o5] ! clear a byte
+ b .wdalign
+ inc %o5 ! next byte
+
+.wrword:
+ subcc %o3, 4, %o3
+ st %o1, [%o5] ! 4-byte writing loop
+ bnz,pt %xcc, .wrword
+ add %o5, 4, %o5
+
+ and %o2, 3, %o2 ! leftover count, if any
+
+.wrchar:
+ ! Set the remaining bytes, if any
+ brz %o2, .exit
+ nop
+.wrfin:
+ deccc %o2
+ stb %o1, [%o5]
+ bgu,pt %xcc, .wrfin
+ inc %o5
+.exit:
+ retl ! %o0 was preserved
+ nop
+
+ .size M7memset,.-M7memset
diff --git a/arch/sparc/lib/M7patch.S b/arch/sparc/lib/M7patch.S
new file mode 100644
index 000000000000..9000b7bc5f2b
--- /dev/null
+++ b/arch/sparc/lib/M7patch.S
@@ -0,0 +1,51 @@
+/*
+ * M7patch.S: Patch generic routines with M7 variant.
+ *
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ */
+
+#include <linux/linkage.h>
+
+#define BRANCH_ALWAYS 0x10680000
+#define NOP 0x01000000
+#define NG_DO_PATCH(OLD, NEW) \
+ sethi %hi(NEW), %g1; \
+ or %g1, %lo(NEW), %g1; \
+ sethi %hi(OLD), %g2; \
+ or %g2, %lo(OLD), %g2; \
+ sub %g1, %g2, %g1; \
+ sethi %hi(BRANCH_ALWAYS), %g3; \
+ sll %g1, 11, %g1; \
+ srl %g1, 11 + 2, %g1; \
+ or %g3, %lo(BRANCH_ALWAYS), %g3; \
+ or %g3, %g1, %g3; \
+ stw %g3, [%g2]; \
+ sethi %hi(NOP), %g3; \
+ or %g3, %lo(NOP), %g3; \
+ stw %g3, [%g2 + 0x4]; \
+ flush %g2;
+
+ENTRY(m7_patch_copyops)
+ NG_DO_PATCH(memcpy, M7memcpy)
+ NG_DO_PATCH(raw_copy_from_user, M7copy_from_user)
+ NG_DO_PATCH(raw_copy_to_user, M7copy_to_user)
+ retl
+ nop
+ENDPROC(m7_patch_copyops)
+
+ENTRY(m7_patch_bzero)
+ NG_DO_PATCH(memset, M7memset)
+ NG_DO_PATCH(__bzero, M7bzero)
+ NG_DO_PATCH(__clear_user, NGclear_user)
+ NG_DO_PATCH(tsb_init, NGtsb_init)
+ retl
+ nop
+ENDPROC(m7_patch_bzero)
+
+ENTRY(m7_patch_pageops)
+ NG_DO_PATCH(copy_user_page, NG4copy_user_page)
+ NG_DO_PATCH(_clear_page, M7clear_page)
+ NG_DO_PATCH(clear_user_page, M7clear_user_page)
+ retl
+ nop
+ENDPROC(m7_patch_pageops)
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index 07c03e72d812..a1a2d39ec96e 100644
--- a/arch/sparc/lib/Makefile
+++ b/arch/sparc/lib/Makefile
@@ -36,6 +36,11 @@ lib-$(CONFIG_SPARC64) += NG2patch.o
lib-$(CONFIG_SPARC64) += NG4memcpy.o NG4copy_from_user.o NG4copy_to_user.o
lib-$(CONFIG_SPARC64) += NG4patch.o NG4copy_page.o NG4clear_page.o NG4memset.o
+lib-$(CONFIG_SPARC64) += Memcpy_utils.o
+
+lib-$(CONFIG_SPARC64) += M7memcpy.o M7copy_from_user.o M7copy_to_user.o
+lib-$(CONFIG_SPARC64) += M7patch.o M7memset.o
+
lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o
lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o
diff --git a/arch/sparc/lib/Memcpy_utils.S b/arch/sparc/lib/Memcpy_utils.S
new file mode 100644
index 000000000000..64fbac28b3db
--- /dev/null
+++ b/arch/sparc/lib/Memcpy_utils.S
@@ -0,0 +1,345 @@
+#ifndef __ASM_MEMCPY_UTILS
+#define __ASM_MEMCPY_UTILS
+
+#include <linux/linkage.h>
+#include <asm/asi.h>
+#include <asm/visasm.h>
+
+ENTRY(__restore_asi_fp)
+ VISExitHalf
+ retl
+ wr %g0, ASI_AIUS, %asi
+ENDPROC(__restore_asi_fp)
+
+ENTRY(__restore_asi)
+ retl
+ wr %g0, ASI_AIUS, %asi
+ENDPROC(__restore_asi)
+
+ENTRY(memcpy_retl_o2)
+ ba,pt %xcc, __restore_asi
+ mov %o2, %o0
+ENDPROC(memcpy_retl_o2)
+ENTRY(memcpy_retl_o2_plus_1)
+ ba,pt %xcc, __restore_asi
+ add %o2, 1, %o0
+ENDPROC(memcpy_retl_o2_plus_1)
+ENTRY(memcpy_retl_o2_plus_3)
+ ba,pt %xcc, __restore_asi
+ add %o2, 3, %o0
+ENDPROC(memcpy_retl_o2_plus_3)
+ENTRY(memcpy_retl_o2_plus_4)
+ ba,pt %xcc, __restore_asi
+ add %o2, 4, %o0
+ENDPROC(memcpy_retl_o2_plus_4)
+ENTRY(memcpy_retl_o2_plus_5)
+ ba,pt %xcc, __restore_asi
+ add %o2, 5, %o0
+ENDPROC(memcpy_retl_o2_plus_5)
+ENTRY(memcpy_retl_o2_plus_6)
+ ba,pt %xcc, __restore_asi
+ add %o2, 6, %o0
+ENDPROC(memcpy_retl_o2_plus_6)
+ENTRY(memcpy_retl_o2_plus_7)
+ ba,pt %xcc, __restore_asi
+ add %o2, 7, %o0
+ENDPROC(memcpy_retl_o2_plus_7)
+ENTRY(memcpy_retl_o2_plus_8)
+ ba,pt %xcc, __restore_asi
+ add %o2, 8, %o0
+ENDPROC(memcpy_retl_o2_plus_8)
+ENTRY(memcpy_retl_o2_plus_15)
+ ba,pt %xcc, __restore_asi
+ add %o2, 15, %o0
+ENDPROC(memcpy_retl_o2_plus_15)
+ENTRY(memcpy_retl_o2_plus_15_8)
+ add %o2, 15, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 8, %o0
+ENDPROC(memcpy_retl_o2_plus_15_8)
+ENTRY(memcpy_retl_o2_plus_16)
+ ba,pt %xcc, __restore_asi
+ add %o2, 16, %o0
+ENDPROC(memcpy_retl_o2_plus_16)
+ENTRY(memcpy_retl_o2_plus_24)
+ ba,pt %xcc, __restore_asi
+ add %o2, 24, %o0
+ENDPROC(memcpy_retl_o2_plus_24)
+ENTRY(memcpy_retl_o2_plus_31)
+ ba,pt %xcc, __restore_asi
+ add %o2, 31, %o0
+ENDPROC(memcpy_retl_o2_plus_31)
+ENTRY(memcpy_retl_o2_plus_32)
+ ba,pt %xcc, __restore_asi
+ add %o2, 32, %o0
+ENDPROC(memcpy_retl_o2_plus_32)
+ENTRY(memcpy_retl_o2_plus_31_32)
+ add %o2, 31, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 32, %o0
+ENDPROC(memcpy_retl_o2_plus_31_32)
+ENTRY(memcpy_retl_o2_plus_31_24)
+ add %o2, 31, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 24, %o0
+ENDPROC(memcpy_retl_o2_plus_31_24)
+ENTRY(memcpy_retl_o2_plus_31_16)
+ add %o2, 31, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 16, %o0
+ENDPROC(memcpy_retl_o2_plus_31_16)
+ENTRY(memcpy_retl_o2_plus_31_8)
+ add %o2, 31, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 8, %o0
+ENDPROC(memcpy_retl_o2_plus_31_8)
+ENTRY(memcpy_retl_o2_plus_63)
+ ba,pt %xcc, __restore_asi
+ add %o2, 63, %o0
+ENDPROC(memcpy_retl_o2_plus_63)
+ENTRY(memcpy_retl_o2_plus_63_64)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 64, %o0
+ENDPROC(memcpy_retl_o2_plus_63_64)
+ENTRY(memcpy_retl_o2_plus_63_56)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 56, %o0
+ENDPROC(memcpy_retl_o2_plus_63_56)
+ENTRY(memcpy_retl_o2_plus_63_48)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 48, %o0
+ENDPROC(memcpy_retl_o2_plus_63_48)
+ENTRY(memcpy_retl_o2_plus_63_40)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 40, %o0
+ENDPROC(memcpy_retl_o2_plus_63_40)
+ENTRY(memcpy_retl_o2_plus_63_32)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 32, %o0
+ENDPROC(memcpy_retl_o2_plus_63_32)
+ENTRY(memcpy_retl_o2_plus_63_24)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 24, %o0
+ENDPROC(memcpy_retl_o2_plus_63_24)
+ENTRY(memcpy_retl_o2_plus_63_16)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 16, %o0
+ENDPROC(memcpy_retl_o2_plus_63_16)
+ENTRY(memcpy_retl_o2_plus_63_8)
+ add %o2, 63, %o2
+ ba,pt %xcc, __restore_asi
+ add %o2, 8, %o0
+ENDPROC(memcpy_retl_o2_plus_63_8)
+ENTRY(memcpy_retl_o2_plus_o5)
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5)
+ENTRY(memcpy_retl_o2_plus_o5_plus_1)
+ add %o5, 1, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_1)
+ENTRY(memcpy_retl_o2_plus_o5_plus_4)
+ add %o5, 4, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_4)
+ENTRY(memcpy_retl_o2_plus_o5_plus_8)
+ add %o5, 8, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_8)
+ENTRY(memcpy_retl_o2_plus_o5_plus_16)
+ add %o5, 16, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_16)
+ENTRY(memcpy_retl_o2_plus_o5_plus_24)
+ add %o5, 24, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_24)
+ENTRY(memcpy_retl_o2_plus_o5_plus_32)
+ add %o5, 32, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_32)
+ENTRY(memcpy_retl_o2_plus_o5_64)
+ add %o5, 32, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_64)
+ENTRY(memcpy_retl_o2_plus_g1)
+ ba,pt %xcc, __restore_asi
+ add %o2, %g1, %o0
+ENDPROC(memcpy_retl_o2_plus_g1)
+ENTRY(memcpy_retl_o2_plus_g1_plus_1)
+ add %g1, 1, %g1
+ ba,pt %xcc, __restore_asi
+ add %o2, %g1, %o0
+ENDPROC(memcpy_retl_o2_plus_g1_plus_1)
+ENTRY(memcpy_retl_o2_plus_g1_plus_8)
+ add %g1, 8, %g1
+ ba,pt %xcc, __restore_asi
+ add %o2, %g1, %o0
+ENDPROC(memcpy_retl_o2_plus_g1_plus_8)
+ENTRY(memcpy_retl_o2_plus_o4)
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4)
+ENTRY(memcpy_retl_o2_plus_o4_plus_8)
+ add %o4, 8, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_8)
+ENTRY(memcpy_retl_o2_plus_o4_plus_16)
+ add %o4, 16, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_16)
+ENTRY(memcpy_retl_o2_plus_o4_plus_24)
+ add %o4, 24, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_24)
+ENTRY(memcpy_retl_o2_plus_o4_plus_32)
+ add %o4, 32, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_32)
+ENTRY(memcpy_retl_o2_plus_o4_plus_40)
+ add %o4, 40, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_40)
+ENTRY(memcpy_retl_o2_plus_o4_plus_48)
+ add %o4, 48, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_48)
+ENTRY(memcpy_retl_o2_plus_o4_plus_56)
+ add %o4, 56, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_56)
+ENTRY(memcpy_retl_o2_plus_o4_plus_64)
+ add %o4, 64, %o4
+ ba,pt %xcc, __restore_asi
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_64)
+ENTRY(memcpy_retl_o2_plus_o5_plus_64)
+ add %o5, 64, %o5
+ ba,pt %xcc, __restore_asi
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_64)
+ENTRY(memcpy_retl_o2_plus_o3_fp)
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o3, %o0
+ENDPROC(memcpy_retl_o2_plus_o3_fp)
+ENTRY(memcpy_retl_o2_plus_o3_plus_1_fp)
+ add %o3, 1, %o3
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o3, %o0
+ENDPROC(memcpy_retl_o2_plus_o3_plus_1_fp)
+ENTRY(memcpy_retl_o2_plus_o3_plus_4_fp)
+ add %o3, 4, %o3
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o3, %o0
+ENDPROC(memcpy_retl_o2_plus_o3_plus_4_fp)
+ENTRY(memcpy_retl_o2_plus_o4_fp)
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_8_fp)
+ add %o4, 8, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_8_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_16_fp)
+ add %o4, 16, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_16_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_24_fp)
+ add %o4, 24, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_24_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_32_fp)
+ add %o4, 32, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_32_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_40_fp)
+ add %o4, 40, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_40_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_48_fp)
+ add %o4, 48, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_48_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_56_fp)
+ add %o4, 56, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_56_fp)
+ENTRY(memcpy_retl_o2_plus_o4_plus_64_fp)
+ add %o4, 64, %o4
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o4, %o0
+ENDPROC(memcpy_retl_o2_plus_o4_plus_64_fp)
+ENTRY(memcpy_retl_o2_plus_o5_fp)
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_64_fp)
+ add %o5, 64, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_64_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_56_fp)
+ add %o5, 56, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_56_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_48_fp)
+ add %o5, 48, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_48_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_40_fp)
+ add %o5, 40, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_40_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_32_fp)
+ add %o5, 32, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_32_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_24_fp)
+ add %o5, 24, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_24_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_16_fp)
+ add %o5, 16, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_16_fp)
+ENTRY(memcpy_retl_o2_plus_o5_plus_8_fp)
+ add %o5, 8, %o5
+ ba,pt %xcc, __restore_asi_fp
+ add %o2, %o5, %o0
+ENDPROC(memcpy_retl_o2_plus_o5_plus_8_fp)
+
+#endif
diff --git a/arch/sparc/lib/NG4memcpy.S b/arch/sparc/lib/NG4memcpy.S
index 78ea962edcbe..b5dacd1d2078 100644
--- a/arch/sparc/lib/NG4memcpy.S
+++ b/arch/sparc/lib/NG4memcpy.S
@@ -94,155 +94,6 @@
.text
#ifndef EX_RETVAL
#define EX_RETVAL(x) x
-__restore_asi_fp:
- VISExitHalf
-__restore_asi:
- retl
- wr %g0, ASI_AIUS, %asi
-
-ENTRY(NG4_retl_o2)
- ba,pt %xcc, __restore_asi
- mov %o2, %o0
-ENDPROC(NG4_retl_o2)
-ENTRY(NG4_retl_o2_plus_1)
- ba,pt %xcc, __restore_asi
- add %o2, 1, %o0
-ENDPROC(NG4_retl_o2_plus_1)
-ENTRY(NG4_retl_o2_plus_4)
- ba,pt %xcc, __restore_asi
- add %o2, 4, %o0
-ENDPROC(NG4_retl_o2_plus_4)
-ENTRY(NG4_retl_o2_plus_o5)
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5)
-ENTRY(NG4_retl_o2_plus_o5_plus_4)
- add %o5, 4, %o5
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5_plus_4)
-ENTRY(NG4_retl_o2_plus_o5_plus_8)
- add %o5, 8, %o5
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5_plus_8)
-ENTRY(NG4_retl_o2_plus_o5_plus_16)
- add %o5, 16, %o5
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5_plus_16)
-ENTRY(NG4_retl_o2_plus_o5_plus_24)
- add %o5, 24, %o5
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5_plus_24)
-ENTRY(NG4_retl_o2_plus_o5_plus_32)
- add %o5, 32, %o5
- ba,pt %xcc, __restore_asi
- add %o2, %o5, %o0
-ENDPROC(NG4_retl_o2_plus_o5_plus_32)
-ENTRY(NG4_retl_o2_plus_g1)
- ba,pt %xcc, __restore_asi
- add %o2, %g1, %o0
-ENDPROC(NG4_retl_o2_plus_g1)
-ENTRY(NG4_retl_o2_plus_g1_plus_1)
- add %g1, 1, %g1
- ba,pt %xcc, __restore_asi
- add %o2, %g1, %o0
-ENDPROC(NG4_retl_o2_plus_g1_plus_1)
-ENTRY(NG4_retl_o2_plus_g1_plus_8)
- add %g1, 8, %g1
- ba,pt %xcc, __restore_asi
- add %o2, %g1, %o0
-ENDPROC(NG4_retl_o2_plus_g1_plus_8)
-ENTRY(NG4_retl_o2_plus_o4)
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4)
-ENTRY(NG4_retl_o2_plus_o4_plus_8)
- add %o4, 8, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_8)
-ENTRY(NG4_retl_o2_plus_o4_plus_16)
- add %o4, 16, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_16)
-ENTRY(NG4_retl_o2_plus_o4_plus_24)
- add %o4, 24, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_24)
-ENTRY(NG4_retl_o2_plus_o4_plus_32)
- add %o4, 32, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_32)
-ENTRY(NG4_retl_o2_plus_o4_plus_40)
- add %o4, 40, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_40)
-ENTRY(NG4_retl_o2_plus_o4_plus_48)
- add %o4, 48, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_48)
-ENTRY(NG4_retl_o2_plus_o4_plus_56)
- add %o4, 56, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_56)
-ENTRY(NG4_retl_o2_plus_o4_plus_64)
- add %o4, 64, %o4
- ba,pt %xcc, __restore_asi
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_64)
-ENTRY(NG4_retl_o2_plus_o4_fp)
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_8_fp)
- add %o4, 8, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_8_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_16_fp)
- add %o4, 16, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_16_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_24_fp)
- add %o4, 24, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_24_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_32_fp)
- add %o4, 32, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_32_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_40_fp)
- add %o4, 40, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_40_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_48_fp)
- add %o4, 48, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_48_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_56_fp)
- add %o4, 56, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_56_fp)
-ENTRY(NG4_retl_o2_plus_o4_plus_64_fp)
- add %o4, 64, %o4
- ba,pt %xcc, __restore_asi_fp
- add %o2, %o4, %o0
-ENDPROC(NG4_retl_o2_plus_o4_plus_64_fp)
#endif
.align 64
@@ -275,12 +126,12 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
sub %o2, %g1, %o2
-1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
+1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), memcpy_retl_o2_plus_g1)
add %o1, 1, %o1
subcc %g1, 1, %g1
add %o0, 1, %o0
bne,pt %icc, 1b
- EX_ST(STORE(stb, %g2, %o0 - 0x01), NG4_retl_o2_plus_g1_plus_1)
+ EX_ST(STORE(stb, %g2, %o0 - 0x01), memcpy_retl_o2_plus_g1_plus_1)
51: LOAD(prefetch, %o1 + 0x040, #n_reads_strong)
LOAD(prefetch, %o1 + 0x080, #n_reads_strong)
@@ -305,43 +156,43 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
brz,pt %g1, .Llarge_aligned
sub %o2, %g1, %o2
-1: EX_LD(LOAD(ldx, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %g2), memcpy_retl_o2_plus_g1)
add %o1, 8, %o1
subcc %g1, 8, %g1
add %o0, 8, %o0
bne,pt %icc, 1b
- EX_ST(STORE(stx, %g2, %o0 - 0x08), NG4_retl_o2_plus_g1_plus_8)
+ EX_ST(STORE(stx, %g2, %o0 - 0x08), memcpy_retl_o2_plus_g1_plus_8)
.Llarge_aligned:
/* len >= 0x80 && src 8-byte aligned && dest 8-byte aligned */
andn %o2, 0x3f, %o4
sub %o2, %o4, %o2
-1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o4)
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), memcpy_retl_o2_plus_o4)
add %o1, 0x40, %o1
- EX_LD(LOAD(ldx, %o1 - 0x38, %g2), NG4_retl_o2_plus_o4)
+ EX_LD(LOAD(ldx, %o1 - 0x38, %g2), memcpy_retl_o2_plus_o4)
subcc %o4, 0x40, %o4
- EX_LD(LOAD(ldx, %o1 - 0x30, %g3), NG4_retl_o2_plus_o4_plus_64)
- EX_LD(LOAD(ldx, %o1 - 0x28, GLOBAL_SPARE), NG4_retl_o2_plus_o4_plus_64)
- EX_LD(LOAD(ldx, %o1 - 0x20, %o5), NG4_retl_o2_plus_o4_plus_64)
- EX_ST(STORE_INIT(%g1, %o0), NG4_retl_o2_plus_o4_plus_64)
+ EX_LD(LOAD(ldx, %o1 - 0x30, %g3), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD(LOAD(ldx, %o1 - 0x28, GLOBAL_SPARE), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD(LOAD(ldx, %o1 - 0x20, %o5), memcpy_retl_o2_plus_o4_plus_64)
+ EX_ST(STORE_INIT(%g1, %o0), memcpy_retl_o2_plus_o4_plus_64)
add %o0, 0x08, %o0
- EX_ST(STORE_INIT(%g2, %o0), NG4_retl_o2_plus_o4_plus_56)
+ EX_ST(STORE_INIT(%g2, %o0), memcpy_retl_o2_plus_o4_plus_56)
add %o0, 0x08, %o0
- EX_LD(LOAD(ldx, %o1 - 0x18, %g2), NG4_retl_o2_plus_o4_plus_48)
- EX_ST(STORE_INIT(%g3, %o0), NG4_retl_o2_plus_o4_plus_48)
+ EX_LD(LOAD(ldx, %o1 - 0x18, %g2), memcpy_retl_o2_plus_o4_plus_48)
+ EX_ST(STORE_INIT(%g3, %o0), memcpy_retl_o2_plus_o4_plus_48)
add %o0, 0x08, %o0
- EX_LD(LOAD(ldx, %o1 - 0x10, %g3), NG4_retl_o2_plus_o4_plus_40)
- EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), NG4_retl_o2_plus_o4_plus_40)
+ EX_LD(LOAD(ldx, %o1 - 0x10, %g3), memcpy_retl_o2_plus_o4_plus_40)
+ EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), memcpy_retl_o2_plus_o4_plus_40)
add %o0, 0x08, %o0
- EX_LD(LOAD(ldx, %o1 - 0x08, GLOBAL_SPARE), NG4_retl_o2_plus_o4_plus_32)
- EX_ST(STORE_INIT(%o5, %o0), NG4_retl_o2_plus_o4_plus_32)
+ EX_LD(LOAD(ldx, %o1 - 0x08, GLOBAL_SPARE), memcpy_retl_o2_plus_o4_plus_32)
+ EX_ST(STORE_INIT(%o5, %o0), memcpy_retl_o2_plus_o4_plus_32)
add %o0, 0x08, %o0
- EX_ST(STORE_INIT(%g2, %o0), NG4_retl_o2_plus_o4_plus_24)
+ EX_ST(STORE_INIT(%g2, %o0), memcpy_retl_o2_plus_o4_plus_24)
add %o0, 0x08, %o0
- EX_ST(STORE_INIT(%g3, %o0), NG4_retl_o2_plus_o4_plus_16)
+ EX_ST(STORE_INIT(%g3, %o0), memcpy_retl_o2_plus_o4_plus_16)
add %o0, 0x08, %o0
- EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), NG4_retl_o2_plus_o4_plus_8)
+ EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), memcpy_retl_o2_plus_o4_plus_8)
add %o0, 0x08, %o0
bne,pt %icc, 1b
LOAD(prefetch, %o1 + 0x200, #n_reads_strong)
@@ -367,17 +218,17 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
sub %o2, %o4, %o2
alignaddr %o1, %g0, %g1
add %o1, %o4, %o1
- EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0), NG4_retl_o2_plus_o4)
-1: EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2), NG4_retl_o2_plus_o4)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0), memcpy_retl_o2_plus_o4)
+1: EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2), memcpy_retl_o2_plus_o4)
subcc %o4, 0x40, %o4
- EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4), NG4_retl_o2_plus_o4_plus_64)
- EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6), NG4_retl_o2_plus_o4_plus_64)
- EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8), NG4_retl_o2_plus_o4_plus_64)
- EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10), NG4_retl_o2_plus_o4_plus_64)
- EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12), NG4_retl_o2_plus_o4_plus_64)
- EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14), NG4_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12), memcpy_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14), memcpy_retl_o2_plus_o4_plus_64)
faligndata %f0, %f2, %f16
- EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0), NG4_retl_o2_plus_o4_plus_64)
+ EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0), memcpy_retl_o2_plus_o4_plus_64)
faligndata %f2, %f4, %f18
add %g1, 0x40, %g1
faligndata %f4, %f6, %f20
@@ -386,14 +237,14 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
faligndata %f10, %f12, %f26
faligndata %f12, %f14, %f28
faligndata %f14, %f0, %f30
- EX_ST_FP(STORE(std, %f16, %o0 + 0x00), NG4_retl_o2_plus_o4_plus_64)
- EX_ST_FP(STORE(std, %f18, %o0 + 0x08), NG4_retl_o2_plus_o4_plus_56)
- EX_ST_FP(STORE(std, %f20, %o0 + 0x10), NG4_retl_o2_plus_o4_plus_48)
- EX_ST_FP(STORE(std, %f22, %o0 + 0x18), NG4_retl_o2_plus_o4_plus_40)
- EX_ST_FP(STORE(std, %f24, %o0 + 0x20), NG4_retl_o2_plus_o4_plus_32)
- EX_ST_FP(STORE(std, %f26, %o0 + 0x28), NG4_retl_o2_plus_o4_plus_24)
- EX_ST_FP(STORE(std, %f28, %o0 + 0x30), NG4_retl_o2_plus_o4_plus_16)
- EX_ST_FP(STORE(std, %f30, %o0 + 0x38), NG4_retl_o2_plus_o4_plus_8)
+ EX_ST_FP(STORE(std, %f16, %o0 + 0x00), memcpy_retl_o2_plus_o4_plus_64)
+ EX_ST_FP(STORE(std, %f18, %o0 + 0x08), memcpy_retl_o2_plus_o4_plus_56)
+ EX_ST_FP(STORE(std, %f20, %o0 + 0x10), memcpy_retl_o2_plus_o4_plus_48)
+ EX_ST_FP(STORE(std, %f22, %o0 + 0x18), memcpy_retl_o2_plus_o4_plus_40)
+ EX_ST_FP(STORE(std, %f24, %o0 + 0x20), memcpy_retl_o2_plus_o4_plus_32)
+ EX_ST_FP(STORE(std, %f26, %o0 + 0x28), memcpy_retl_o2_plus_o4_plus_24)
+ EX_ST_FP(STORE(std, %f28, %o0 + 0x30), memcpy_retl_o2_plus_o4_plus_16)
+ EX_ST_FP(STORE(std, %f30, %o0 + 0x38), memcpy_retl_o2_plus_o4_plus_8)
add %o0, 0x40, %o0
bne,pt %icc, 1b
LOAD(prefetch, %g1 + 0x200, #n_reads_strong)
@@ -421,38 +272,38 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
andncc %o2, 0x20 - 1, %o5
be,pn %icc, 2f
sub %o2, %o5, %o2
-1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
- EX_LD(LOAD(ldx, %o1 + 0x08, %g2), NG4_retl_o2_plus_o5)
- EX_LD(LOAD(ldx, %o1 + 0x10, GLOBAL_SPARE), NG4_retl_o2_plus_o5)
- EX_LD(LOAD(ldx, %o1 + 0x18, %o4), NG4_retl_o2_plus_o5)
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x08, %g2), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x10, GLOBAL_SPARE), memcpy_retl_o2_plus_o5)
+ EX_LD(LOAD(ldx, %o1 + 0x18, %o4), memcpy_retl_o2_plus_o5)
add %o1, 0x20, %o1
subcc %o5, 0x20, %o5
- EX_ST(STORE(stx, %g1, %o0 + 0x00), NG4_retl_o2_plus_o5_plus_32)
- EX_ST(STORE(stx, %g2, %o0 + 0x08), NG4_retl_o2_plus_o5_plus_24)
- EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x10), NG4_retl_o2_plus_o5_plus_24)
- EX_ST(STORE(stx, %o4, %o0 + 0x18), NG4_retl_o2_plus_o5_plus_8)
+ EX_ST(STORE(stx, %g1, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_32)
+ EX_ST(STORE(stx, %g2, %o0 + 0x08), memcpy_retl_o2_plus_o5_plus_24)
+ EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x10), memcpy_retl_o2_plus_o5_plus_24)
+ EX_ST(STORE(stx, %o4, %o0 + 0x18), memcpy_retl_o2_plus_o5_plus_8)
bne,pt %icc, 1b
add %o0, 0x20, %o0
2: andcc %o2, 0x18, %o5
be,pt %icc, 3f
sub %o2, %o5, %o2
-1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
+1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), memcpy_retl_o2_plus_o5)
add %o1, 0x08, %o1
add %o0, 0x08, %o0
subcc %o5, 0x08, %o5
bne,pt %icc, 1b
- EX_ST(STORE(stx, %g1, %o0 - 0x08), NG4_retl_o2_plus_o5_plus_8)
+ EX_ST(STORE(stx, %g1, %o0 - 0x08), memcpy_retl_o2_plus_o5_plus_8)
3: brz,pt %o2, .Lexit
cmp %o2, 0x04
bl,pn %icc, .Ltiny
nop
- EX_LD(LOAD(lduw, %o1 + 0x00, %g1), NG4_retl_o2)
+ EX_LD(LOAD(lduw, %o1 + 0x00, %g1), memcpy_retl_o2)
add %o1, 0x04, %o1
add %o0, 0x04, %o0
subcc %o2, 0x04, %o2
bne,pn %icc, .Ltiny
- EX_ST(STORE(stw, %g1, %o0 - 0x04), NG4_retl_o2_plus_4)
+ EX_ST(STORE(stw, %g1, %o0 - 0x04), memcpy_retl_o2_plus_4)
ba,a,pt %icc, .Lexit
.Lmedium_unaligned:
/* First get dest 8 byte aligned. */
@@ -461,12 +312,12 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
brz,pt %g1, 2f
sub %o2, %g1, %o2
-1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
+1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), memcpy_retl_o2_plus_g1)
add %o1, 1, %o1
subcc %g1, 1, %g1
add %o0, 1, %o0
bne,pt %icc, 1b
- EX_ST(STORE(stb, %g2, %o0 - 0x01), NG4_retl_o2_plus_g1_plus_1)
+ EX_ST(STORE(stb, %g2, %o0 - 0x01), memcpy_retl_o2_plus_g1_plus_1)
2:
and %o1, 0x7, %g1
brz,pn %g1, .Lmedium_noprefetch
@@ -474,16 +325,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
mov 64, %g2
sub %g2, %g1, %g2
andn %o1, 0x7, %o1
- EX_LD(LOAD(ldx, %o1 + 0x00, %o4), NG4_retl_o2)
+ EX_LD(LOAD(ldx, %o1 + 0x00, %o4), memcpy_retl_o2)
sllx %o4, %g1, %o4
andn %o2, 0x08 - 1, %o5
sub %o2, %o5, %o2
-1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3), NG4_retl_o2_plus_o5)
+1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3), memcpy_retl_o2_plus_o5)
add %o1, 0x08, %o1
subcc %o5, 0x08, %o5
srlx %g3, %g2, GLOBAL_SPARE
or GLOBAL_SPARE, %o4, GLOBAL_SPARE
- EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x00), NG4_retl_o2_plus_o5_plus_8)
+ EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_8)
add %o0, 0x08, %o0
bne,pt %icc, 1b
sllx %g3, %g1, %o4
@@ -494,17 +345,17 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
ba,pt %icc, .Lsmall_unaligned
.Ltiny:
- EX_LD(LOAD(ldub, %o1 + 0x00, %g1), NG4_retl_o2)
+ EX_LD(LOAD(ldub, %o1 + 0x00, %g1), memcpy_retl_o2)
subcc %o2, 1, %o2
be,pn %icc, .Lexit
- EX_ST(STORE(stb, %g1, %o0 + 0x00), NG4_retl_o2_plus_1)
- EX_LD(LOAD(ldub, %o1 + 0x01, %g1), NG4_retl_o2)
+ EX_ST(STORE(stb, %g1, %o0 + 0x00), memcpy_retl_o2_plus_1)
+ EX_LD(LOAD(ldub, %o1 + 0x01, %g1), memcpy_retl_o2)
subcc %o2, 1, %o2
be,pn %icc, .Lexit
- EX_ST(STORE(stb, %g1, %o0 + 0x01), NG4_retl_o2_plus_1)
- EX_LD(LOAD(ldub, %o1 + 0x02, %g1), NG4_retl_o2)
+ EX_ST(STORE(stb, %g1, %o0 + 0x01), memcpy_retl_o2_plus_1)
+ EX_LD(LOAD(ldub, %o1 + 0x02, %g1), memcpy_retl_o2)
ba,pt %icc, .Lexit
- EX_ST(STORE(stb, %g1, %o0 + 0x02), NG4_retl_o2)
+ EX_ST(STORE(stb, %g1, %o0 + 0x02), memcpy_retl_o2)
.Lsmall:
andcc %g2, 0x3, %g0
@@ -512,23 +363,23 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
andn %o2, 0x4 - 1, %o5
sub %o2, %o5, %o2
1:
- EX_LD(LOAD(lduw, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
+ EX_LD(LOAD(lduw, %o1 + 0x00, %g1), memcpy_retl_o2_plus_o5)
add %o1, 0x04, %o1
subcc %o5, 0x04, %o5
add %o0, 0x04, %o0
bne,pt %icc, 1b
- EX_ST(STORE(stw, %g1, %o0 - 0x04), NG4_retl_o2_plus_o5_plus_4)
+ EX_ST(STORE(stw, %g1, %o0 - 0x04), memcpy_retl_o2_plus_o5_plus_4)
brz,pt %o2, .Lexit
nop
ba,a,pt %icc, .Ltiny
.Lsmall_unaligned:
-1: EX_LD(LOAD(ldub, %o1 + 0x00, %g1), NG4_retl_o2)
+1: EX_LD(LOAD(ldub, %o1 + 0x00, %g1), memcpy_retl_o2)
add %o1, 1, %o1
add %o0, 1, %o0
subcc %o2, 1, %o2
bne,pt %icc, 1b
- EX_ST(STORE(stb, %g1, %o0 - 0x01), NG4_retl_o2_plus_1)
+ EX_ST(STORE(stb, %g1, %o0 - 0x01), memcpy_retl_o2_plus_1)
ba,a,pt %icc, .Lexit
nop
.size FUNC_NAME, .-FUNC_NAME
diff --git a/arch/sparc/lib/U3memcpy.S b/arch/sparc/lib/U3memcpy.S
index 5a8cb37f0a3b..f9b42b3c63b0 100644
--- a/arch/sparc/lib/U3memcpy.S
+++ b/arch/sparc/lib/U3memcpy.S
@@ -168,18 +168,25 @@ ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8)
FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
srlx %o2, 31, %g2
cmp %g2, 0
+
+ /* software trap 5 "Range Check" if dst >= 0x80000000 */
tne %xcc, 5
PREAMBLE
mov %o0, %o4
+
+ /* if len == 0 */
cmp %o2, 0
- be,pn %XCC, 85f
+ be,pn %XCC, end_return
or %o0, %o1, %o3
+
+ /* if len < 16 */
cmp %o2, 16
- blu,a,pn %XCC, 80f
+ blu,a,pn %XCC, less_than_16
or %o3, %o2, %o3
+ /* if len < 192 */
cmp %o2, (3 * 64)
- blu,pt %XCC, 70f
+ blu,pt %XCC, less_than_192
andcc %o3, 0x7, %g0
/* Clobbers o5/g1/g2/g3/g7/icc/xcc. We must preserve
@@ -362,7 +369,7 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
cmp %o2, 0
add %o1, %g1, %o1
VISExitHalf
- be,pn %XCC, 85f
+ be,pn %XCC, end_return
sub %o0, %o1, %o3
andcc %g1, 0x7, %g0
@@ -392,14 +399,15 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
sub %o2, 2, %o2
1: andcc %o2, 0x1, %g0
- be,pt %icc, 85f
+ be,pt %icc, end_return
nop
EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2)
- ba,pt %xcc, 85f
+ ba,pt %xcc, end_return
EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2)
.align 64
-70: /* 16 < len <= 64 */
+ /* 16 <= len < 192 */
+less_than_192:
bne,pn %XCC, 75f
sub %o0, %o1, %o3
@@ -429,7 +437,7 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2_plus_4)
add %o1, 0x4, %o1
1: cmp %o2, 0
- be,pt %XCC, 85f
+ be,pt %XCC, end_return
nop
ba,pt %xcc, 90f
nop
@@ -475,13 +483,14 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
srl %g1, 3, %g1
andcc %o2, 0x7, %o2
- be,pn %icc, 85f
+ be,pn %icc, end_return
add %o1, %g1, %o1
ba,pt %xcc, 90f
sub %o0, %o1, %o3
.align 64
-80: /* 0 < len <= 16 */
+ /* 0 < len < 16 */
+less_than_16:
andcc %o3, 0x3, %g0
bne,pn %XCC, 90f
sub %o0, %o1, %o3
@@ -493,7 +502,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
bgu,pt %XCC, 1b
add %o1, 4, %o1
-85: retl
+end_return:
+ retl
mov EX_RETVAL(%o4), %o0
.align 32
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c
index f80cfc64c55b..d809099ffd47 100644
--- a/arch/sparc/mm/gup.c
+++ b/arch/sparc/mm/gup.c
@@ -103,6 +103,45 @@ static int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
return 1;
}
+static int gup_huge_pud(pud_t *pudp, pud_t pud, unsigned long addr,
+ unsigned long end, int write, struct page **pages,
+ int *nr)
+{
+ struct page *head, *page;
+ int refs;
+
+ if (!(pud_val(pud) & _PAGE_VALID))
+ return 0;
+
+ if (write && !pud_write(pud))
+ return 0;
+
+ refs = 0;
+ page = pud_page(pud) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);
+ head = compound_head(page);
+ do {
+ VM_BUG_ON(compound_head(page) != head);
+ pages[*nr] = page;
+ (*nr)++;
+ page++;
+ refs++;
+ } while (addr += PAGE_SIZE, addr != end);
+
+ if (!page_cache_add_speculative(head, refs)) {
+ *nr -= refs;
+ return 0;
+ }
+
+ if (unlikely(pud_val(pud) != pud_val(*pudp))) {
+ *nr -= refs;
+ while (refs--)
+ put_page(head);
+ return 0;
+ }
+
+ return 1;
+}
+
static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
int write, struct page **pages, int *nr)
{
@@ -141,7 +180,11 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end,
next = pud_addr_end(addr, end);
if (pud_none(pud))
return 0;
- if (!gup_pmd_range(pud, addr, next, write, pages, nr))
+ if (unlikely(pud_large(pud))) {
+ if (!gup_huge_pud(pudp, pud, addr, next,
+ write, pages, nr))
+ return 0;
+ } else if (!gup_pmd_range(pud, addr, next, write, pages, nr))
return 0;
} while (pudp++, addr = next, addr != end);
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
index 28ee8d8ffa07..bcd8cdbc377f 100644
--- a/arch/sparc/mm/hugetlbpage.c
+++ b/arch/sparc/mm/hugetlbpage.c
@@ -143,6 +143,10 @@ static pte_t sun4v_hugepage_shift_to_tte(pte_t entry, unsigned int shift)
pte_val(entry) = pte_val(entry) & ~_PAGE_SZALL_4V;
switch (shift) {
+ case HPAGE_16GB_SHIFT:
+ hugepage_size = _PAGE_SZ16GB_4V;
+ pte_val(entry) |= _PAGE_PUD_HUGE;
+ break;
case HPAGE_2GB_SHIFT:
hugepage_size = _PAGE_SZ2GB_4V;
pte_val(entry) |= _PAGE_PMD_HUGE;
@@ -187,6 +191,9 @@ static unsigned int sun4v_huge_tte_to_shift(pte_t entry)
unsigned int shift;
switch (tte_szbits) {
+ case _PAGE_SZ16GB_4V:
+ shift = HPAGE_16GB_SHIFT;
+ break;
case _PAGE_SZ2GB_4V:
shift = HPAGE_2GB_SHIFT;
break;
@@ -259,22 +266,19 @@ pte_t *huge_pte_alloc(struct mm_struct *mm,
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
- pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
pud = pud_alloc(mm, pgd, addr);
- if (pud) {
- pmd = pmd_alloc(mm, pud, addr);
- if (!pmd)
- return NULL;
-
- if (sz >= PMD_SIZE)
- pte = (pte_t *)pmd;
- else
- pte = pte_alloc_map(mm, pmd, addr);
- }
-
- return pte;
+ if (!pud)
+ return NULL;
+ if (sz >= PUD_SIZE)
+ return (pte_t *)pud;
+ pmd = pmd_alloc(mm, pud, addr);
+ if (!pmd)
+ return NULL;
+ if (sz >= PMD_SIZE)
+ return (pte_t *)pmd;
+ return pte_alloc_map(mm, pmd, addr);
}
pte_t *huge_pte_offset(struct mm_struct *mm,
@@ -283,34 +287,40 @@ pte_t *huge_pte_offset(struct mm_struct *mm,
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
- pte_t *pte = NULL;
pgd = pgd_offset(mm, addr);
- if (!pgd_none(*pgd)) {
- pud = pud_offset(pgd, addr);
- if (!pud_none(*pud)) {
- pmd = pmd_offset(pud, addr);
- if (!pmd_none(*pmd)) {
- if (is_hugetlb_pmd(*pmd))
- pte = (pte_t *)pmd;
- else
- pte = pte_offset_map(pmd, addr);
- }
- }
- }
-
- return pte;
+ if (pgd_none(*pgd))
+ return NULL;
+ pud = pud_offset(pgd, addr);
+ if (pud_none(*pud))
+ return NULL;
+ if (is_hugetlb_pud(*pud))
+ return (pte_t *)pud;
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ return NULL;
+ if (is_hugetlb_pmd(*pmd))
+ return (pte_t *)pmd;
+ return pte_offset_map(pmd, addr);
}
void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t entry)
{
- unsigned int i, nptes, orig_shift, shift;
- unsigned long size;
+ unsigned int nptes, orig_shift, shift;
+ unsigned long i, size;
pte_t orig;
size = huge_tte_to_size(entry);
- shift = size >= HPAGE_SIZE ? PMD_SHIFT : PAGE_SHIFT;
+
+ shift = PAGE_SHIFT;
+ if (size >= PUD_SIZE)
+ shift = PUD_SHIFT;
+ else if (size >= PMD_SIZE)
+ shift = PMD_SHIFT;
+ else
+ shift = PAGE_SHIFT;
+
nptes = size >> shift;
if (!pte_present(*ptep) && pte_present(entry))
@@ -333,19 +343,23 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
pte_t *ptep)
{
- unsigned int i, nptes, hugepage_shift;
+ unsigned int i, nptes, orig_shift, shift;
unsigned long size;
pte_t entry;
entry = *ptep;
size = huge_tte_to_size(entry);
- if (size >= HPAGE_SIZE)
- nptes = size >> PMD_SHIFT;
+
+ shift = PAGE_SHIFT;
+ if (size >= PUD_SIZE)
+ shift = PUD_SHIFT;
+ else if (size >= PMD_SIZE)
+ shift = PMD_SHIFT;
else
- nptes = size >> PAGE_SHIFT;
+ shift = PAGE_SHIFT;
- hugepage_shift = pte_none(entry) ? PAGE_SHIFT :
- huge_tte_to_shift(entry);
+ nptes = size >> shift;
+ orig_shift = pte_none(entry) ? PAGE_SHIFT : huge_tte_to_shift(entry);
if (pte_present(entry))
mm->context.hugetlb_pte_count -= nptes;
@@ -354,11 +368,11 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
for (i = 0; i < nptes; i++)
ptep[i] = __pte(0UL);
- maybe_tlb_batch_add(mm, addr, ptep, entry, 0, hugepage_shift);
+ maybe_tlb_batch_add(mm, addr, ptep, entry, 0, orig_shift);
/* An HPAGE_SIZE'ed page is composed of two REAL_HPAGE_SIZE'ed pages */
if (size == HPAGE_SIZE)
maybe_tlb_batch_add(mm, addr + REAL_HPAGE_SIZE, ptep, entry, 0,
- hugepage_shift);
+ orig_shift);
return entry;
}
@@ -371,7 +385,8 @@ int pmd_huge(pmd_t pmd)
int pud_huge(pud_t pud)
{
- return 0;
+ return !pud_none(pud) &&
+ (pud_val(pud) & (_PAGE_VALID|_PAGE_PUD_HUGE)) != _PAGE_VALID;
}
static void hugetlb_free_pte_range(struct mmu_gather *tlb, pmd_t *pmd,
@@ -435,8 +450,11 @@ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
next = pud_addr_end(addr, end);
if (pud_none_or_clear_bad(pud))
continue;
- hugetlb_free_pmd_range(tlb, pud, addr, next, floor,
- ceiling);
+ if (is_hugetlb_pud(*pud))
+ pud_clear(pud);
+ else
+ hugetlb_free_pmd_range(tlb, pud, addr, next, floor,
+ ceiling);
} while (pud++, addr = next, addr != end);
start &= PGDIR_MASK;
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index afa0099f3748..b2ba410b26f4 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -348,6 +348,18 @@ static int __init hugetlbpage_init(void)
arch_initcall(hugetlbpage_init);
+static void __init pud_huge_patch(void)
+{
+ struct pud_huge_patch_entry *p;
+ unsigned long addr;
+
+ p = &__pud_huge_patch;
+ addr = p->addr;
+ *(unsigned int *)addr = p->insn;
+
+ __asm__ __volatile__("flush %0" : : "r" (addr));
+}
+
static int __init setup_hugepagesz(char *string)
{
unsigned long long hugepage_size;
@@ -360,6 +372,11 @@ static int __init setup_hugepagesz(char *string)
hugepage_shift = ilog2(hugepage_size);
switch (hugepage_shift) {
+ case HPAGE_16GB_SHIFT:
+ hv_pgsz_mask = HV_PGSZ_MASK_16GB;
+ hv_pgsz_idx = HV_PGSZ_IDX_16GB;
+ pud_huge_patch();
+ break;
case HPAGE_2GB_SHIFT:
hv_pgsz_mask = HV_PGSZ_MASK_2GB;
hv_pgsz_idx = HV_PGSZ_IDX_2GB;
@@ -400,6 +417,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *
{
struct mm_struct *mm;
unsigned long flags;
+ bool is_huge_tsb;
pte_t pte = *ptep;
if (tlb_type != hypervisor) {
@@ -417,15 +435,37 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *
spin_lock_irqsave(&mm->context.lock, flags);
+ is_huge_tsb = false;
#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
- if ((mm->context.hugetlb_pte_count || mm->context.thp_pte_count) &&
- is_hugetlb_pmd(__pmd(pte_val(pte)))) {
- /* We are fabricating 8MB pages using 4MB real hw pages. */
- pte_val(pte) |= (address & (1UL << REAL_HPAGE_SHIFT));
- __update_mmu_tsb_insert(mm, MM_TSB_HUGE, REAL_HPAGE_SHIFT,
- address, pte_val(pte));
- } else
+ if (mm->context.hugetlb_pte_count || mm->context.thp_pte_count) {
+ unsigned long hugepage_size = PAGE_SIZE;
+
+ if (is_vm_hugetlb_page(vma))
+ hugepage_size = huge_page_size(hstate_vma(vma));
+
+ if (hugepage_size >= PUD_SIZE) {
+ unsigned long mask = 0x1ffc00000UL;
+
+ /* Transfer bits [32:22] from address to resolve
+ * at 4M granularity.
+ */
+ pte_val(pte) &= ~mask;
+ pte_val(pte) |= (address & mask);
+ } else if (hugepage_size >= PMD_SIZE) {
+ /* We are fabricating 8MB pages using 4MB
+ * real hw pages.
+ */
+ pte_val(pte) |= (address & (1UL << REAL_HPAGE_SHIFT));
+ }
+
+ if (hugepage_size >= PMD_SIZE) {
+ __update_mmu_tsb_insert(mm, MM_TSB_HUGE,
+ REAL_HPAGE_SHIFT, address, pte_val(pte));
+ is_huge_tsb = true;
+ }
+ }
#endif
+ if (!is_huge_tsb)
__update_mmu_tsb_insert(mm, MM_TSB_BASE, PAGE_SHIFT,
address, pte_val(pte));
diff --git a/arch/tile/configs/tilegx_defconfig b/arch/tile/configs/tilegx_defconfig
index 0d925fa0f0c1..9f94435cc44f 100644
--- a/arch/tile/configs/tilegx_defconfig
+++ b/arch/tile/configs/tilegx_defconfig
@@ -409,5 +409,4 @@ CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_ZLIB=m
CONFIG_CRYPTO_LZO=m
diff --git a/arch/tile/configs/tilepro_defconfig b/arch/tile/configs/tilepro_defconfig
index 149d8e8eacb8..1c5bd4f8ffca 100644
--- a/arch/tile/configs/tilepro_defconfig
+++ b/arch/tile/configs/tilepro_defconfig
@@ -189,7 +189,6 @@ CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
-CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
@@ -521,7 +520,6 @@ CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_ZLIB=m
CONFIG_CRYPTO_LZO=m
CONFIG_CRC_CCITT=m
CONFIG_CRC7=m
diff --git a/arch/tile/include/asm/dma-mapping.h b/arch/tile/include/asm/dma-mapping.h
index bbc71a29b2c6..7061dc8af43a 100644
--- a/arch/tile/include/asm/dma-mapping.h
+++ b/arch/tile/include/asm/dma-mapping.h
@@ -68,8 +68,8 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
int dma_set_mask(struct device *dev, u64 mask);
/*
- * dma_alloc_noncoherent() is #defined to return coherent memory,
- * so there's no need to do any flushing here.
+ * dma_alloc_attrs() always returns non-cacheable memory, so there's no need to
+ * do any flushing here.
*/
static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction direction)
diff --git a/arch/tile/include/uapi/asm/siginfo.h b/arch/tile/include/uapi/asm/siginfo.h
index 56d661bb010b..e83f931aa1f0 100644
--- a/arch/tile/include/uapi/asm/siginfo.h
+++ b/arch/tile/include/uapi/asm/siginfo.h
@@ -26,8 +26,8 @@
/*
* Additional Tile-specific SIGILL si_codes
*/
-#define ILL_DBLFLT (__SI_FAULT|9) /* double fault */
-#define ILL_HARDWALL (__SI_FAULT|10) /* user networks hardwall violation */
+#define ILL_DBLFLT 9 /* double fault */
+#define ILL_HARDWALL 10 /* user networks hardwall violation */
#undef NSIGILL
#define NSIGILL 10
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c
index 0e863f1ee08c..971d87a1d8cf 100644
--- a/arch/tile/kernel/compat_signal.c
+++ b/arch/tile/kernel/compat_signal.c
@@ -64,7 +64,7 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *fr
3 ints plus the relevant union member. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
+ err |= __put_user(from->si_code, &to->si_code);
if (from->si_code < 0) {
err |= __put_user(from->si_pid, &to->si_pid);
@@ -77,28 +77,26 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *fr
*/
err |= __put_user(from->_sifields._pad[0],
&to->_sifields._pad[0]);
- switch (from->si_code >> 16) {
- case __SI_FAULT >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_FAULT:
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
/* FALL THROUGH */
default:
- case __SI_KILL >> 16:
+ case SIL_KILL:
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
err |= __put_user(from->si_overrun, &to->si_overrun);
err |= __put_user(from->si_int, &to->si_int);
break;
- /* This is not generated by the kernel as of now. */
- case __SI_RT >> 16:
- case __SI_MESGQ >> 16:
+ case SIL_RT:
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_int, &to->si_int);
break;
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
index 6becb96c60a0..ad83c1e66dbd 100644
--- a/arch/tile/kernel/setup.c
+++ b/arch/tile/kernel/setup.c
@@ -140,7 +140,7 @@ static int __init setup_maxnodemem(char *str)
{
char *endp;
unsigned long long maxnodemem;
- long node;
+ unsigned long node;
node = str ? simple_strtoul(str, &endp, 0) : INT_MAX;
if (node >= MAX_NUMNODES || *endp != ':')
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c
index 54804866f238..9b08c6055f15 100644
--- a/arch/tile/kernel/traps.c
+++ b/arch/tile/kernel/traps.c
@@ -188,7 +188,7 @@ static int special_ill(tile_bundle_bits bundle, int *sigp, int *codep)
/* Make it the requested signal. */
*sigp = sig;
- *codep = code | __SI_FAULT;
+ *codep = code;
return 1;
}
diff --git a/arch/um/Kconfig.um b/arch/um/Kconfig.um
index 4b2ed5858b2e..e26376ab5452 100644
--- a/arch/um/Kconfig.um
+++ b/arch/um/Kconfig.um
@@ -20,6 +20,7 @@ config LD_SCRIPT_DYN
bool
default y
depends on !LD_SCRIPT_STATIC
+ select MODULE_REL_CRCS if MODVERSIONS
source "fs/Kconfig.binfmt"
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 6ca4f66085c1..b76fcce397a1 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -121,7 +121,7 @@ archheaders:
archprepare: include/generated/user_constants.h
LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static
-LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib
+LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib $(call cc-option, -no-pie)
CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) \
$(call cc-option, -fno-stack-protector,) \
diff --git a/arch/um/configs/i386_defconfig b/arch/um/configs/i386_defconfig
index 5636221b8785..8f114e3b0a7a 100644
--- a/arch/um/configs/i386_defconfig
+++ b/arch/um/configs/i386_defconfig
@@ -53,7 +53,6 @@ CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
-# CONFIG_INET_LRO is not set
# CONFIG_IPV6 is not set
CONFIG_UML_NET=y
CONFIG_UML_NET_ETHERTAP=y
diff --git a/arch/um/configs/x86_64_defconfig b/arch/um/configs/x86_64_defconfig
index 7a67b7ac1a7e..5d0875fc0db2 100644
--- a/arch/um/configs/x86_64_defconfig
+++ b/arch/um/configs/x86_64_defconfig
@@ -51,7 +51,6 @@ CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
-# CONFIG_INET_LRO is not set
# CONFIG_IPV6 is not set
CONFIG_UML_NET=y
CONFIG_UML_NET_ETHERTAP=y
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index af326fb6510d..c4d162a94be9 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -148,12 +148,7 @@ void mconsole_proc(struct mc_request *req)
}
do {
- loff_t pos = file->f_pos;
- mm_segment_t old_fs = get_fs();
- set_fs(KERNEL_DS);
- len = vfs_read(file, buf, PAGE_SIZE - 1, &pos);
- set_fs(old_fs);
- file->f_pos = pos;
+ len = kernel_read(file, buf, PAGE_SIZE - 1, &file->f_pos);
if (len < 0) {
mconsole_reply(req, "Read of file failed", 1, 0);
goto out_free;
diff --git a/arch/um/include/asm/processor-generic.h b/arch/um/include/asm/processor-generic.h
index f6d1a3f747a9..86942a492454 100644
--- a/arch/um/include/asm/processor-generic.h
+++ b/arch/um/include/asm/processor-generic.h
@@ -58,11 +58,6 @@ static inline void release_thread(struct task_struct *task)
{
}
-static inline void mm_copy_segments(struct mm_struct *from_mm,
- struct mm_struct *new_mm)
-{
-}
-
#define init_stack (init_thread_union.stack)
/*
diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h
index 053baff03674..9300f7630d2a 100644
--- a/arch/um/include/asm/thread_info.h
+++ b/arch/um/include/asm/thread_info.h
@@ -11,6 +11,7 @@
#include <asm/types.h>
#include <asm/page.h>
#include <asm/segment.h>
+#include <sysdep/ptrace_user.h>
struct thread_info {
struct task_struct *task; /* main task structure */
@@ -22,6 +23,8 @@ struct thread_info {
0-0xBFFFFFFF for user
0-0xFFFFFFFF for kernel */
struct thread_info *real_thread; /* Points to non-IRQ stack */
+ unsigned long aux_fp_regs[FP_SIZE]; /* auxiliary fp_regs to save/restore
+ them out-of-band */
};
#define INIT_THREAD_INFO(tsk) \
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h
index 574e03fc7ba2..d8ddaf9790d2 100644
--- a/arch/um/include/shared/os.h
+++ b/arch/um/include/shared/os.h
@@ -278,7 +278,7 @@ extern int protect(struct mm_id * mm_idp, unsigned long addr,
extern int is_skas_winch(int pid, int fd, void *data);
extern int start_userspace(unsigned long stub_stack);
extern int copy_context_skas0(unsigned long stack, int pid);
-extern void userspace(struct uml_pt_regs *regs);
+extern void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs);
extern int map_stub_pages(int fd, unsigned long code, unsigned long data,
unsigned long stack);
extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
diff --git a/arch/um/kernel/gmon_syms.c b/arch/um/kernel/gmon_syms.c
index 1bf61266da8e..f138a4a0db99 100644
--- a/arch/um/kernel/gmon_syms.c
+++ b/arch/um/kernel/gmon_syms.c
@@ -7,3 +7,10 @@
extern void __bb_init_func(void *) __attribute__((weak));
EXPORT_SYMBOL(__bb_init_func);
+
+extern void __gcov_init(void *) __attribute__((weak));
+EXPORT_SYMBOL(__gcov_init);
+extern void __gcov_merge_add(void *, unsigned int) __attribute__((weak));
+EXPORT_SYMBOL(__gcov_merge_add);
+extern void __gcov_exit(void) __attribute__((weak));
+EXPORT_SYMBOL(__gcov_exit);
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index 2c7f721eccbc..691b83b10649 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -131,7 +131,7 @@ void new_thread_handler(void)
* callback returns only if the kernel thread execs a process
*/
n = fn(arg);
- userspace(&current->thread.regs.regs);
+ userspace(&current->thread.regs.regs, current_thread_info()->aux_fp_regs);
}
/* Called magically, see new_thread_handler above */
@@ -150,7 +150,7 @@ void fork_handler(void)
current->thread.prev_sched = NULL;
- userspace(&current->thread.regs.regs);
+ userspace(&current->thread.regs.regs, current_thread_info()->aux_fp_regs);
}
int copy_thread(unsigned long clone_flags, unsigned long sp,
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 0b034ebbda2a..7f69d17de354 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -98,7 +98,7 @@ static struct clocksource timer_clocksource = {
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
};
-static void __init timer_setup(void)
+static void __init um_timer_setup(void)
{
int err;
@@ -132,5 +132,5 @@ void read_persistent_clock(struct timespec *ts)
void __init time_init(void)
{
timer_set_signal_handler();
- late_time_init = timer_setup;
+ late_time_init = um_timer_setup;
}
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c
index c2e6e1dad876..db24ce0d09a6 100644
--- a/arch/um/os-Linux/drivers/tuntap_user.c
+++ b/arch/um/os-Linux/drivers/tuntap_user.c
@@ -80,7 +80,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
pid = run_helper(tuntap_pre_exec, &data, argv);
if (pid < 0)
- return -pid;
+ return pid;
close(remote);
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 819d68656673..c94c3bd70ccd 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -88,12 +88,11 @@ bad_wait:
extern unsigned long current_stub_stack(void);
-static void get_skas_faultinfo(int pid, struct faultinfo *fi)
+static void get_skas_faultinfo(int pid, struct faultinfo *fi, unsigned long *aux_fp_regs)
{
int err;
- unsigned long fpregs[FP_SIZE];
- err = get_fp_registers(pid, fpregs);
+ err = get_fp_registers(pid, aux_fp_regs);
if (err < 0) {
printk(UM_KERN_ERR "save_fp_registers returned %d\n",
err);
@@ -113,7 +112,7 @@ static void get_skas_faultinfo(int pid, struct faultinfo *fi)
*/
memcpy(fi, (void *)current_stub_stack(), sizeof(*fi));
- err = put_fp_registers(pid, fpregs);
+ err = put_fp_registers(pid, aux_fp_regs);
if (err < 0) {
printk(UM_KERN_ERR "put_fp_registers returned %d\n",
err);
@@ -121,9 +120,9 @@ static void get_skas_faultinfo(int pid, struct faultinfo *fi)
}
}
-static void handle_segv(int pid, struct uml_pt_regs * regs)
+static void handle_segv(int pid, struct uml_pt_regs *regs, unsigned long *aux_fp_regs)
{
- get_skas_faultinfo(pid, &regs->faultinfo);
+ get_skas_faultinfo(pid, &regs->faultinfo, aux_fp_regs);
segv(regs->faultinfo, 0, 1, NULL);
}
@@ -332,7 +331,7 @@ int start_userspace(unsigned long stub_stack)
return err;
}
-void userspace(struct uml_pt_regs *regs)
+void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs)
{
int err, status, op, pid = userspace_pid[0];
/* To prevent races if using_sysemu changes under us.*/
@@ -407,11 +406,11 @@ void userspace(struct uml_pt_regs *regs)
case SIGSEGV:
if (PTRACE_FULL_FAULTINFO) {
get_skas_faultinfo(pid,
- &regs->faultinfo);
+ &regs->faultinfo, aux_fp_regs);
(*sig_info[SIGSEGV])(SIGSEGV, (struct siginfo *)&si,
regs);
}
- else handle_segv(pid, regs);
+ else handle_segv(pid, regs, aux_fp_regs);
break;
case SIGTRAP + 0x80:
handle_trap(pid, regs, local_using_sysemu);
diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c
index b1b6b75c5b17..82bf5f8442ba 100644
--- a/arch/um/os-Linux/start_up.c
+++ b/arch/um/os-Linux/start_up.c
@@ -154,10 +154,10 @@ static int __init nosysemu_cmd_param(char *str, int* add)
__uml_setup("nosysemu", nosysemu_cmd_param,
"nosysemu\n"
-" Turns off syscall emulation patch for ptrace (SYSEMU) on.\n"
+" Turns off syscall emulation patch for ptrace (SYSEMU).\n"
" SYSEMU is a performance-patch introduced by Laurent Vivier. It changes\n"
-" behaviour of ptrace() and helps reducing host context switch rate.\n"
-" To make it working, you need a kernel patch for your host, too.\n"
+" behaviour of ptrace() and helps reduce host context switch rates.\n"
+" To make it work, you need a kernel patch for your host, too.\n"
" See http://perso.wanadoo.fr/laurent.vivier/UML/ for further \n"
" information.\n\n");
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index a3e6e6136a47..971feac13506 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -53,7 +53,6 @@ config X86
select ARCH_HAS_FORTIFY_SOURCE
select ARCH_HAS_GCOV_PROFILE_ALL
select ARCH_HAS_KCOV if X86_64
- select ARCH_HAS_MMIO_FLUSH
select ARCH_HAS_PMEM_API if X86_64
# Causing hangs/crashes, see the commit that added this change for details.
select ARCH_HAS_REFCOUNT if BROKEN
diff --git a/arch/x86/crypto/blowfish-x86_64-asm_64.S b/arch/x86/crypto/blowfish-x86_64-asm_64.S
index 246c67006ed0..8c1fcb6bad21 100644
--- a/arch/x86/crypto/blowfish-x86_64-asm_64.S
+++ b/arch/x86/crypto/blowfish-x86_64-asm_64.S
@@ -33,7 +33,7 @@
#define s3 ((16 + 2 + (3 * 256)) * 4)
/* register macros */
-#define CTX %rdi
+#define CTX %r12
#define RIO %rsi
#define RX0 %rax
@@ -56,12 +56,12 @@
#define RX2bh %ch
#define RX3bh %dh
-#define RT0 %rbp
+#define RT0 %rdi
#define RT1 %rsi
#define RT2 %r8
#define RT3 %r9
-#define RT0d %ebp
+#define RT0d %edi
#define RT1d %esi
#define RT2d %r8d
#define RT3d %r9d
@@ -120,13 +120,14 @@
ENTRY(__blowfish_enc_blk)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
* %rcx: bool, if true: xor output
*/
- movq %rbp, %r11;
+ movq %r12, %r11;
+ movq %rdi, CTX;
movq %rsi, %r10;
movq %rdx, RIO;
@@ -142,7 +143,7 @@ ENTRY(__blowfish_enc_blk)
round_enc(14);
add_roundkey_enc(16);
- movq %r11, %rbp;
+ movq %r11, %r12;
movq %r10, RIO;
test %cl, %cl;
@@ -157,12 +158,13 @@ ENDPROC(__blowfish_enc_blk)
ENTRY(blowfish_dec_blk)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
- movq %rbp, %r11;
+ movq %r12, %r11;
+ movq %rdi, CTX;
movq %rsi, %r10;
movq %rdx, RIO;
@@ -181,7 +183,7 @@ ENTRY(blowfish_dec_blk)
movq %r10, RIO;
write_block();
- movq %r11, %rbp;
+ movq %r11, %r12;
ret;
ENDPROC(blowfish_dec_blk)
@@ -298,20 +300,21 @@ ENDPROC(blowfish_dec_blk)
ENTRY(__blowfish_enc_blk_4way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
* %rcx: bool, if true: xor output
*/
- pushq %rbp;
+ pushq %r12;
pushq %rbx;
pushq %rcx;
- preload_roundkey_enc(0);
-
+ movq %rdi, CTX
movq %rsi, %r11;
movq %rdx, RIO;
+ preload_roundkey_enc(0);
+
read_block4();
round_enc4(0);
@@ -324,39 +327,40 @@ ENTRY(__blowfish_enc_blk_4way)
round_enc4(14);
add_preloaded_roundkey4();
- popq %rbp;
+ popq %r12;
movq %r11, RIO;
- test %bpl, %bpl;
+ test %r12b, %r12b;
jnz .L__enc_xor4;
write_block4();
popq %rbx;
- popq %rbp;
+ popq %r12;
ret;
.L__enc_xor4:
xor_block4();
popq %rbx;
- popq %rbp;
+ popq %r12;
ret;
ENDPROC(__blowfish_enc_blk_4way)
ENTRY(blowfish_dec_blk_4way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
- pushq %rbp;
+ pushq %r12;
pushq %rbx;
- preload_roundkey_dec(17);
- movq %rsi, %r11;
+ movq %rdi, CTX;
+ movq %rsi, %r11
movq %rdx, RIO;
+ preload_roundkey_dec(17);
read_block4();
round_dec4(17);
@@ -373,7 +377,7 @@ ENTRY(blowfish_dec_blk_4way)
write_block4();
popq %rbx;
- popq %rbp;
+ popq %r12;
ret;
ENDPROC(blowfish_dec_blk_4way)
diff --git a/arch/x86/crypto/camellia-x86_64-asm_64.S b/arch/x86/crypto/camellia-x86_64-asm_64.S
index 310319c601ed..95ba6956a7f6 100644
--- a/arch/x86/crypto/camellia-x86_64-asm_64.S
+++ b/arch/x86/crypto/camellia-x86_64-asm_64.S
@@ -75,17 +75,17 @@
#define RCD1bh %dh
#define RT0 %rsi
-#define RT1 %rbp
+#define RT1 %r12
#define RT2 %r8
#define RT0d %esi
-#define RT1d %ebp
+#define RT1d %r12d
#define RT2d %r8d
#define RT2bl %r8b
#define RXOR %r9
-#define RRBP %r10
+#define RR12 %r10
#define RDST %r11
#define RXORd %r9d
@@ -197,7 +197,7 @@ ENTRY(__camellia_enc_blk)
* %rdx: src
* %rcx: bool xor
*/
- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rcx, RXOR;
movq %rsi, RDST;
@@ -227,13 +227,13 @@ ENTRY(__camellia_enc_blk)
enc_outunpack(mov, RT1);
- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;
.L__enc_xor:
enc_outunpack(xor, RT1);
- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;
ENDPROC(__camellia_enc_blk)
@@ -248,7 +248,7 @@ ENTRY(camellia_dec_blk)
movl $24, RXORd;
cmovel RXORd, RT2d; /* max */
- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rsi, RDST;
movq %rdx, RIO;
@@ -271,7 +271,7 @@ ENTRY(camellia_dec_blk)
dec_outunpack();
- movq RRBP, %rbp;
+ movq RR12, %r12;
ret;
ENDPROC(camellia_dec_blk)
@@ -433,7 +433,7 @@ ENTRY(__camellia_enc_blk_2way)
*/
pushq %rbx;
- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rcx, RXOR;
movq %rsi, RDST;
movq %rdx, RIO;
@@ -461,14 +461,14 @@ ENTRY(__camellia_enc_blk_2way)
enc_outunpack2(mov, RT2);
- movq RRBP, %rbp;
+ movq RR12, %r12;
popq %rbx;
ret;
.L__enc2_xor:
enc_outunpack2(xor, RT2);
- movq RRBP, %rbp;
+ movq RR12, %r12;
popq %rbx;
ret;
ENDPROC(__camellia_enc_blk_2way)
@@ -485,7 +485,7 @@ ENTRY(camellia_dec_blk_2way)
cmovel RXORd, RT2d; /* max */
movq %rbx, RXOR;
- movq %rbp, RRBP;
+ movq %r12, RR12;
movq %rsi, RDST;
movq %rdx, RIO;
@@ -508,7 +508,7 @@ ENTRY(camellia_dec_blk_2way)
dec_outunpack2();
- movq RRBP, %rbp;
+ movq RR12, %r12;
movq RXOR, %rbx;
ret;
ENDPROC(camellia_dec_blk_2way)
diff --git a/arch/x86/crypto/cast5-avx-x86_64-asm_64.S b/arch/x86/crypto/cast5-avx-x86_64-asm_64.S
index b4a8806234ea..86107c961bb4 100644
--- a/arch/x86/crypto/cast5-avx-x86_64-asm_64.S
+++ b/arch/x86/crypto/cast5-avx-x86_64-asm_64.S
@@ -47,7 +47,7 @@
/**********************************************************************
16-way AVX cast5
**********************************************************************/
-#define CTX %rdi
+#define CTX %r15
#define RL1 %xmm0
#define RR1 %xmm1
@@ -70,8 +70,8 @@
#define RTMP %xmm15
-#define RID1 %rbp
-#define RID1d %ebp
+#define RID1 %rdi
+#define RID1d %edi
#define RID2 %rsi
#define RID2d %esi
@@ -226,7 +226,7 @@
.align 16
__cast5_enc_blk16:
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* RL1: blocks 1 and 2
* RR1: blocks 3 and 4
* RL2: blocks 5 and 6
@@ -246,9 +246,11 @@ __cast5_enc_blk16:
* RR4: encrypted blocks 15 and 16
*/
- pushq %rbp;
+ pushq %r15;
pushq %rbx;
+ movq %rdi, CTX;
+
vmovdqa .Lbswap_mask, RKM;
vmovd .Lfirst_mask, R1ST;
vmovd .L32_mask, R32;
@@ -283,7 +285,7 @@ __cast5_enc_blk16:
.L__skip_enc:
popq %rbx;
- popq %rbp;
+ popq %r15;
vmovdqa .Lbswap_mask, RKM;
@@ -298,7 +300,7 @@ ENDPROC(__cast5_enc_blk16)
.align 16
__cast5_dec_blk16:
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* RL1: encrypted blocks 1 and 2
* RR1: encrypted blocks 3 and 4
* RL2: encrypted blocks 5 and 6
@@ -318,9 +320,11 @@ __cast5_dec_blk16:
* RR4: decrypted blocks 15 and 16
*/
- pushq %rbp;
+ pushq %r15;
pushq %rbx;
+ movq %rdi, CTX;
+
vmovdqa .Lbswap_mask, RKM;
vmovd .Lfirst_mask, R1ST;
vmovd .L32_mask, R32;
@@ -356,7 +360,7 @@ __cast5_dec_blk16:
vmovdqa .Lbswap_mask, RKM;
popq %rbx;
- popq %rbp;
+ popq %r15;
outunpack_blocks(RR1, RL1, RTMP, RX, RKM);
outunpack_blocks(RR2, RL2, RTMP, RX, RKM);
@@ -372,12 +376,14 @@ ENDPROC(__cast5_dec_blk16)
ENTRY(cast5_ecb_enc_16way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
vmovdqu (0*4*4)(%rdx), RL1;
@@ -400,18 +406,22 @@ ENTRY(cast5_ecb_enc_16way)
vmovdqu RR4, (6*4*4)(%r11);
vmovdqu RL4, (7*4*4)(%r11);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast5_ecb_enc_16way)
ENTRY(cast5_ecb_dec_16way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
+ pushq %r15;
+
+ movq %rdi, CTX;
movq %rsi, %r11;
vmovdqu (0*4*4)(%rdx), RL1;
@@ -434,20 +444,22 @@ ENTRY(cast5_ecb_dec_16way)
vmovdqu RR4, (6*4*4)(%r11);
vmovdqu RL4, (7*4*4)(%r11);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast5_ecb_dec_16way)
ENTRY(cast5_cbc_dec_16way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
-
pushq %r12;
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
movq %rdx, %r12;
@@ -483,23 +495,24 @@ ENTRY(cast5_cbc_dec_16way)
vmovdqu RR4, (6*16)(%r11);
vmovdqu RL4, (7*16)(%r11);
+ popq %r15;
popq %r12;
-
FRAME_END
ret;
ENDPROC(cast5_cbc_dec_16way)
ENTRY(cast5_ctr_16way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
* %rcx: iv (big endian, 64bit)
*/
FRAME_BEGIN
-
pushq %r12;
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
movq %rdx, %r12;
@@ -558,8 +571,8 @@ ENTRY(cast5_ctr_16way)
vmovdqu RR4, (6*16)(%r11);
vmovdqu RL4, (7*16)(%r11);
+ popq %r15;
popq %r12;
-
FRAME_END
ret;
ENDPROC(cast5_ctr_16way)
diff --git a/arch/x86/crypto/cast6-avx-x86_64-asm_64.S b/arch/x86/crypto/cast6-avx-x86_64-asm_64.S
index 952d3156a933..7f30b6f0d72c 100644
--- a/arch/x86/crypto/cast6-avx-x86_64-asm_64.S
+++ b/arch/x86/crypto/cast6-avx-x86_64-asm_64.S
@@ -47,7 +47,7 @@
/**********************************************************************
8-way AVX cast6
**********************************************************************/
-#define CTX %rdi
+#define CTX %r15
#define RA1 %xmm0
#define RB1 %xmm1
@@ -70,8 +70,8 @@
#define RTMP %xmm15
-#define RID1 %rbp
-#define RID1d %ebp
+#define RID1 %rdi
+#define RID1d %edi
#define RID2 %rsi
#define RID2d %esi
@@ -264,15 +264,17 @@
.align 8
__cast6_enc_blk8:
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: blocks
* output:
* RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
*/
- pushq %rbp;
+ pushq %r15;
pushq %rbx;
+ movq %rdi, CTX;
+
vmovdqa .Lbswap_mask, RKM;
vmovd .Lfirst_mask, R1ST;
vmovd .L32_mask, R32;
@@ -297,7 +299,7 @@ __cast6_enc_blk8:
QBAR(11);
popq %rbx;
- popq %rbp;
+ popq %r15;
vmovdqa .Lbswap_mask, RKM;
@@ -310,15 +312,17 @@ ENDPROC(__cast6_enc_blk8)
.align 8
__cast6_dec_blk8:
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
* output:
* RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: decrypted blocks
*/
- pushq %rbp;
+ pushq %r15;
pushq %rbx;
+ movq %rdi, CTX;
+
vmovdqa .Lbswap_mask, RKM;
vmovd .Lfirst_mask, R1ST;
vmovd .L32_mask, R32;
@@ -343,7 +347,7 @@ __cast6_dec_blk8:
QBAR(0);
popq %rbx;
- popq %rbp;
+ popq %r15;
vmovdqa .Lbswap_mask, RKM;
outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
@@ -354,12 +358,14 @@ ENDPROC(__cast6_dec_blk8)
ENTRY(cast6_ecb_enc_8way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
@@ -368,18 +374,21 @@ ENTRY(cast6_ecb_enc_8way)
store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast6_ecb_enc_8way)
ENTRY(cast6_ecb_dec_8way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
@@ -388,20 +397,22 @@ ENTRY(cast6_ecb_dec_8way)
store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast6_ecb_dec_8way)
ENTRY(cast6_cbc_dec_8way)
/* input:
- * %rdi: ctx, CTX
+ * %rdi: ctx
* %rsi: dst
* %rdx: src
*/
FRAME_BEGIN
-
pushq %r12;
+ pushq %r15;
+ movq %rdi, CTX;
movq %rsi, %r11;
movq %rdx, %r12;
@@ -411,8 +422,8 @@ ENTRY(cast6_cbc_dec_8way)
store_cbc_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
popq %r12;
-
FRAME_END
ret;
ENDPROC(cast6_cbc_dec_8way)
@@ -425,9 +436,10 @@ ENTRY(cast6_ctr_8way)
* %rcx: iv (little endian, 128bit)
*/
FRAME_BEGIN
-
pushq %r12;
+ pushq %r15
+ movq %rdi, CTX;
movq %rsi, %r11;
movq %rdx, %r12;
@@ -438,8 +450,8 @@ ENTRY(cast6_ctr_8way)
store_ctr_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
popq %r12;
-
FRAME_END
ret;
ENDPROC(cast6_ctr_8way)
@@ -452,7 +464,9 @@ ENTRY(cast6_xts_enc_8way)
* %rcx: iv (t ⊕ αⁿ ∈ GF(2¹²⁸))
*/
FRAME_BEGIN
+ pushq %r15;
+ movq %rdi, CTX
movq %rsi, %r11;
/* regs <= src, dst <= IVs, regs <= regs xor IVs */
@@ -464,6 +478,7 @@ ENTRY(cast6_xts_enc_8way)
/* dst <= regs xor IVs(in dst) */
store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast6_xts_enc_8way)
@@ -476,7 +491,9 @@ ENTRY(cast6_xts_dec_8way)
* %rcx: iv (t ⊕ αⁿ ∈ GF(2¹²⁸))
*/
FRAME_BEGIN
+ pushq %r15;
+ movq %rdi, CTX
movq %rsi, %r11;
/* regs <= src, dst <= IVs, regs <= regs xor IVs */
@@ -488,6 +505,7 @@ ENTRY(cast6_xts_dec_8way)
/* dst <= regs xor IVs(in dst) */
store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
+ popq %r15;
FRAME_END
ret;
ENDPROC(cast6_xts_dec_8way)
diff --git a/arch/x86/crypto/des3_ede-asm_64.S b/arch/x86/crypto/des3_ede-asm_64.S
index f3e91647ca27..8e49ce117494 100644
--- a/arch/x86/crypto/des3_ede-asm_64.S
+++ b/arch/x86/crypto/des3_ede-asm_64.S
@@ -64,12 +64,12 @@
#define RW2bh %ch
#define RT0 %r15
-#define RT1 %rbp
+#define RT1 %rsi
#define RT2 %r14
#define RT3 %rdx
#define RT0d %r15d
-#define RT1d %ebp
+#define RT1d %esi
#define RT2d %r14d
#define RT3d %edx
@@ -177,13 +177,14 @@ ENTRY(des3_ede_x86_64_crypt_blk)
* %rsi: dst
* %rdx: src
*/
- pushq %rbp;
pushq %rbx;
pushq %r12;
pushq %r13;
pushq %r14;
pushq %r15;
+ pushq %rsi; /* dst */
+
read_block(%rdx, RL0, RR0);
initial_permutation(RL0, RR0);
@@ -241,6 +242,8 @@ ENTRY(des3_ede_x86_64_crypt_blk)
round1(32+15, RL0, RR0, dummy2);
final_permutation(RR0, RL0);
+
+ popq %rsi /* dst */
write_block(%rsi, RR0, RL0);
popq %r15;
@@ -248,7 +251,6 @@ ENTRY(des3_ede_x86_64_crypt_blk)
popq %r13;
popq %r12;
popq %rbx;
- popq %rbp;
ret;
ENDPROC(des3_ede_x86_64_crypt_blk)
@@ -432,13 +434,14 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
* %rdx: src (3 blocks)
*/
- pushq %rbp;
pushq %rbx;
pushq %r12;
pushq %r13;
pushq %r14;
pushq %r15;
+ pushq %rsi /* dst */
+
/* load input */
movl 0 * 4(%rdx), RL0d;
movl 1 * 4(%rdx), RR0d;
@@ -520,6 +523,7 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
bswapl RR2d;
bswapl RL2d;
+ popq %rsi /* dst */
movl RR0d, 0 * 4(%rsi);
movl RL0d, 1 * 4(%rsi);
movl RR1d, 2 * 4(%rsi);
@@ -532,7 +536,6 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
popq %r13;
popq %r12;
popq %rbx;
- popq %rbp;
ret;
ENDPROC(des3_ede_x86_64_crypt_blk_3way)
diff --git a/arch/x86/crypto/sha1_avx2_x86_64_asm.S b/arch/x86/crypto/sha1_avx2_x86_64_asm.S
index 1eab79c9ac48..9f712a7dfd79 100644
--- a/arch/x86/crypto/sha1_avx2_x86_64_asm.S
+++ b/arch/x86/crypto/sha1_avx2_x86_64_asm.S
@@ -89,7 +89,7 @@
#define REG_RE %rdx
#define REG_RTA %r12
#define REG_RTB %rbx
-#define REG_T1 %ebp
+#define REG_T1 %r11d
#define xmm_mov vmovups
#define avx2_zeroupper vzeroupper
#define RND_F1 1
@@ -637,7 +637,6 @@ _loop3:
ENTRY(\name)
push %rbx
- push %rbp
push %r12
push %r13
push %r14
@@ -673,7 +672,6 @@ _loop3:
pop %r14
pop %r13
pop %r12
- pop %rbp
pop %rbx
ret
diff --git a/arch/x86/crypto/sha1_ssse3_asm.S b/arch/x86/crypto/sha1_ssse3_asm.S
index a4109506a5e8..6204bd53528c 100644
--- a/arch/x86/crypto/sha1_ssse3_asm.S
+++ b/arch/x86/crypto/sha1_ssse3_asm.S
@@ -37,7 +37,7 @@
#define REG_A %ecx
#define REG_B %esi
#define REG_C %edi
-#define REG_D %ebp
+#define REG_D %r12d
#define REG_E %edx
#define REG_T1 %eax
@@ -74,10 +74,10 @@
ENTRY(\name)
push %rbx
- push %rbp
push %r12
+ push %rbp
+ mov %rsp, %rbp
- mov %rsp, %r12
sub $64, %rsp # allocate workspace
and $~15, %rsp # align stack
@@ -99,10 +99,9 @@
xor %rax, %rax
rep stosq
- mov %r12, %rsp # deallocate workspace
-
- pop %r12
+ mov %rbp, %rsp # deallocate workspace
pop %rbp
+ pop %r12
pop %rbx
ret
diff --git a/arch/x86/crypto/sha256-avx-asm.S b/arch/x86/crypto/sha256-avx-asm.S
index e08888a1a5f2..001bbcf93c79 100644
--- a/arch/x86/crypto/sha256-avx-asm.S
+++ b/arch/x86/crypto/sha256-avx-asm.S
@@ -103,7 +103,7 @@ SRND = %rsi # clobbers INP
c = %ecx
d = %r8d
e = %edx
-TBL = %rbp
+TBL = %r12
a = %eax
b = %ebx
@@ -350,13 +350,13 @@ a = TMP_
ENTRY(sha256_transform_avx)
.align 32
pushq %rbx
- pushq %rbp
+ pushq %r12
pushq %r13
pushq %r14
pushq %r15
- pushq %r12
+ pushq %rbp
+ movq %rsp, %rbp
- mov %rsp, %r12
subq $STACK_SIZE, %rsp # allocate stack space
and $~15, %rsp # align stack pointer
@@ -452,13 +452,12 @@ loop2:
done_hash:
- mov %r12, %rsp
-
- popq %r12
+ mov %rbp, %rsp
+ popq %rbp
popq %r15
popq %r14
popq %r13
- popq %rbp
+ popq %r12
popq %rbx
ret
ENDPROC(sha256_transform_avx)
diff --git a/arch/x86/crypto/sha256-avx2-asm.S b/arch/x86/crypto/sha256-avx2-asm.S
index 89c8f09787d2..1420db15dcdd 100644
--- a/arch/x86/crypto/sha256-avx2-asm.S
+++ b/arch/x86/crypto/sha256-avx2-asm.S
@@ -98,8 +98,6 @@ d = %r8d
e = %edx # clobbers NUM_BLKS
y3 = %esi # clobbers INP
-
-TBL = %rbp
SRND = CTX # SRND is same register as CTX
a = %eax
@@ -531,7 +529,6 @@ STACK_SIZE = _RSP + _RSP_SIZE
ENTRY(sha256_transform_rorx)
.align 32
pushq %rbx
- pushq %rbp
pushq %r12
pushq %r13
pushq %r14
@@ -568,8 +565,6 @@ ENTRY(sha256_transform_rorx)
mov CTX, _CTX(%rsp)
loop0:
- lea K256(%rip), TBL
-
## Load first 16 dwords from two blocks
VMOVDQ 0*32(INP),XTMP0
VMOVDQ 1*32(INP),XTMP1
@@ -597,19 +592,19 @@ last_block_enter:
.align 16
loop1:
- vpaddd 0*32(TBL, SRND), X0, XFER
+ vpaddd K256+0*32(SRND), X0, XFER
vmovdqa XFER, 0*32+_XFER(%rsp, SRND)
FOUR_ROUNDS_AND_SCHED _XFER + 0*32
- vpaddd 1*32(TBL, SRND), X0, XFER
+ vpaddd K256+1*32(SRND), X0, XFER
vmovdqa XFER, 1*32+_XFER(%rsp, SRND)
FOUR_ROUNDS_AND_SCHED _XFER + 1*32
- vpaddd 2*32(TBL, SRND), X0, XFER
+ vpaddd K256+2*32(SRND), X0, XFER
vmovdqa XFER, 2*32+_XFER(%rsp, SRND)
FOUR_ROUNDS_AND_SCHED _XFER + 2*32
- vpaddd 3*32(TBL, SRND), X0, XFER
+ vpaddd K256+3*32(SRND), X0, XFER
vmovdqa XFER, 3*32+_XFER(%rsp, SRND)
FOUR_ROUNDS_AND_SCHED _XFER + 3*32
@@ -619,10 +614,11 @@ loop1:
loop2:
## Do last 16 rounds with no scheduling
- vpaddd 0*32(TBL, SRND), X0, XFER
+ vpaddd K256+0*32(SRND), X0, XFER
vmovdqa XFER, 0*32+_XFER(%rsp, SRND)
DO_4ROUNDS _XFER + 0*32
- vpaddd 1*32(TBL, SRND), X1, XFER
+
+ vpaddd K256+1*32(SRND), X1, XFER
vmovdqa XFER, 1*32+_XFER(%rsp, SRND)
DO_4ROUNDS _XFER + 1*32
add $2*32, SRND
@@ -676,9 +672,6 @@ loop3:
ja done_hash
do_last_block:
- #### do last block
- lea K256(%rip), TBL
-
VMOVDQ 0*16(INP),XWORD0
VMOVDQ 1*16(INP),XWORD1
VMOVDQ 2*16(INP),XWORD2
@@ -718,7 +711,6 @@ done_hash:
popq %r14
popq %r13
popq %r12
- popq %rbp
popq %rbx
ret
ENDPROC(sha256_transform_rorx)
diff --git a/arch/x86/crypto/sha256-ssse3-asm.S b/arch/x86/crypto/sha256-ssse3-asm.S
index 39b83c93e7fd..c6c05ed2c16a 100644
--- a/arch/x86/crypto/sha256-ssse3-asm.S
+++ b/arch/x86/crypto/sha256-ssse3-asm.S
@@ -95,7 +95,7 @@ SRND = %rsi # clobbers INP
c = %ecx
d = %r8d
e = %edx
-TBL = %rbp
+TBL = %r12
a = %eax
b = %ebx
@@ -356,13 +356,13 @@ a = TMP_
ENTRY(sha256_transform_ssse3)
.align 32
pushq %rbx
- pushq %rbp
+ pushq %r12
pushq %r13
pushq %r14
pushq %r15
- pushq %r12
+ pushq %rbp
+ mov %rsp, %rbp
- mov %rsp, %r12
subq $STACK_SIZE, %rsp
and $~15, %rsp
@@ -462,13 +462,12 @@ loop2:
done_hash:
- mov %r12, %rsp
-
- popq %r12
+ mov %rbp, %rsp
+ popq %rbp
popq %r15
popq %r14
popq %r13
- popq %rbp
+ popq %r12
popq %rbx
ret
diff --git a/arch/x86/crypto/sha512-avx2-asm.S b/arch/x86/crypto/sha512-avx2-asm.S
index 7f5f6c6ec72e..b16d56005162 100644
--- a/arch/x86/crypto/sha512-avx2-asm.S
+++ b/arch/x86/crypto/sha512-avx2-asm.S
@@ -69,8 +69,9 @@ XFER = YTMP0
BYTE_FLIP_MASK = %ymm9
-# 1st arg
-CTX = %rdi
+# 1st arg is %rdi, which is saved to the stack and accessed later via %r12
+CTX1 = %rdi
+CTX2 = %r12
# 2nd arg
INP = %rsi
# 3rd arg
@@ -81,7 +82,7 @@ d = %r8
e = %rdx
y3 = %rsi
-TBL = %rbp
+TBL = %rdi # clobbers CTX1
a = %rax
b = %rbx
@@ -91,26 +92,26 @@ g = %r10
h = %r11
old_h = %r11
-T1 = %r12
+T1 = %r12 # clobbers CTX2
y0 = %r13
y1 = %r14
y2 = %r15
-y4 = %r12
-
# Local variables (stack frame)
XFER_SIZE = 4*8
SRND_SIZE = 1*8
INP_SIZE = 1*8
INPEND_SIZE = 1*8
+CTX_SIZE = 1*8
RSPSAVE_SIZE = 1*8
-GPRSAVE_SIZE = 6*8
+GPRSAVE_SIZE = 5*8
frame_XFER = 0
frame_SRND = frame_XFER + XFER_SIZE
frame_INP = frame_SRND + SRND_SIZE
frame_INPEND = frame_INP + INP_SIZE
-frame_RSPSAVE = frame_INPEND + INPEND_SIZE
+frame_CTX = frame_INPEND + INPEND_SIZE
+frame_RSPSAVE = frame_CTX + CTX_SIZE
frame_GPRSAVE = frame_RSPSAVE + RSPSAVE_SIZE
frame_size = frame_GPRSAVE + GPRSAVE_SIZE
@@ -576,12 +577,11 @@ ENTRY(sha512_transform_rorx)
mov %rax, frame_RSPSAVE(%rsp)
# Save GPRs
- mov %rbp, frame_GPRSAVE(%rsp)
- mov %rbx, 8*1+frame_GPRSAVE(%rsp)
- mov %r12, 8*2+frame_GPRSAVE(%rsp)
- mov %r13, 8*3+frame_GPRSAVE(%rsp)
- mov %r14, 8*4+frame_GPRSAVE(%rsp)
- mov %r15, 8*5+frame_GPRSAVE(%rsp)
+ mov %rbx, 8*0+frame_GPRSAVE(%rsp)
+ mov %r12, 8*1+frame_GPRSAVE(%rsp)
+ mov %r13, 8*2+frame_GPRSAVE(%rsp)
+ mov %r14, 8*3+frame_GPRSAVE(%rsp)
+ mov %r15, 8*4+frame_GPRSAVE(%rsp)
shl $7, NUM_BLKS # convert to bytes
jz done_hash
@@ -589,14 +589,17 @@ ENTRY(sha512_transform_rorx)
mov NUM_BLKS, frame_INPEND(%rsp)
## load initial digest
- mov 8*0(CTX),a
- mov 8*1(CTX),b
- mov 8*2(CTX),c
- mov 8*3(CTX),d
- mov 8*4(CTX),e
- mov 8*5(CTX),f
- mov 8*6(CTX),g
- mov 8*7(CTX),h
+ mov 8*0(CTX1), a
+ mov 8*1(CTX1), b
+ mov 8*2(CTX1), c
+ mov 8*3(CTX1), d
+ mov 8*4(CTX1), e
+ mov 8*5(CTX1), f
+ mov 8*6(CTX1), g
+ mov 8*7(CTX1), h
+
+ # save %rdi (CTX) before it gets clobbered
+ mov %rdi, frame_CTX(%rsp)
vmovdqa PSHUFFLE_BYTE_FLIP_MASK(%rip), BYTE_FLIP_MASK
@@ -652,14 +655,15 @@ loop2:
subq $1, frame_SRND(%rsp)
jne loop2
- addm 8*0(CTX),a
- addm 8*1(CTX),b
- addm 8*2(CTX),c
- addm 8*3(CTX),d
- addm 8*4(CTX),e
- addm 8*5(CTX),f
- addm 8*6(CTX),g
- addm 8*7(CTX),h
+ mov frame_CTX(%rsp), CTX2
+ addm 8*0(CTX2), a
+ addm 8*1(CTX2), b
+ addm 8*2(CTX2), c
+ addm 8*3(CTX2), d
+ addm 8*4(CTX2), e
+ addm 8*5(CTX2), f
+ addm 8*6(CTX2), g
+ addm 8*7(CTX2), h
mov frame_INP(%rsp), INP
add $128, INP
@@ -669,12 +673,11 @@ loop2:
done_hash:
# Restore GPRs
- mov frame_GPRSAVE(%rsp) ,%rbp
- mov 8*1+frame_GPRSAVE(%rsp) ,%rbx
- mov 8*2+frame_GPRSAVE(%rsp) ,%r12
- mov 8*3+frame_GPRSAVE(%rsp) ,%r13
- mov 8*4+frame_GPRSAVE(%rsp) ,%r14
- mov 8*5+frame_GPRSAVE(%rsp) ,%r15
+ mov 8*0+frame_GPRSAVE(%rsp), %rbx
+ mov 8*1+frame_GPRSAVE(%rsp), %r12
+ mov 8*2+frame_GPRSAVE(%rsp), %r13
+ mov 8*3+frame_GPRSAVE(%rsp), %r14
+ mov 8*4+frame_GPRSAVE(%rsp), %r15
# Restore Stack Pointer
mov frame_RSPSAVE(%rsp), %rsp
diff --git a/arch/x86/crypto/twofish-avx-x86_64-asm_64.S b/arch/x86/crypto/twofish-avx-x86_64-asm_64.S
index b3f49d286348..73b471da3622 100644
--- a/arch/x86/crypto/twofish-avx-x86_64-asm_64.S
+++ b/arch/x86/crypto/twofish-avx-x86_64-asm_64.S
@@ -76,8 +76,8 @@
#define RT %xmm14
#define RR %xmm15
-#define RID1 %rbp
-#define RID1d %ebp
+#define RID1 %r13
+#define RID1d %r13d
#define RID2 %rsi
#define RID2d %esi
@@ -259,7 +259,7 @@ __twofish_enc_blk8:
vmovdqu w(CTX), RK1;
- pushq %rbp;
+ pushq %r13;
pushq %rbx;
pushq %rcx;
@@ -282,7 +282,7 @@ __twofish_enc_blk8:
popq %rcx;
popq %rbx;
- popq %rbp;
+ popq %r13;
outunpack_blocks(RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
outunpack_blocks(RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2);
@@ -301,7 +301,7 @@ __twofish_dec_blk8:
vmovdqu (w+4*4)(CTX), RK1;
- pushq %rbp;
+ pushq %r13;
pushq %rbx;
inpack_blocks(RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
@@ -322,7 +322,7 @@ __twofish_dec_blk8:
vmovdqu (w)(CTX), RK1;
popq %rbx;
- popq %rbp;
+ popq %r13;
outunpack_blocks(RA1, RB1, RC1, RD1, RK1, RX0, RY0, RK2);
outunpack_blocks(RA2, RB2, RC2, RD2, RK1, RX0, RY0, RK2);
diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c
index 4cf100ff2a37..72db0664a53d 100644
--- a/arch/x86/events/intel/cstate.c
+++ b/arch/x86/events/intel/cstate.c
@@ -552,6 +552,7 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = {
X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_MOBILE, snb_cstates),
X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_DESKTOP, snb_cstates),
+ X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_X, snb_cstates),
X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE_MOBILE, snb_cstates),
X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE_DESKTOP, snb_cstates),
@@ -560,6 +561,9 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = {
X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNM, knl_cstates),
X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT, glm_cstates),
+ X86_CSTATES_MODEL(INTEL_FAM6_ATOM_DENVERTON, glm_cstates),
+
+ X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GEMINI_LAKE, glm_cstates),
{ },
};
MODULE_DEVICE_TABLE(x86cpu, intel_cstates_match);
diff --git a/arch/x86/events/intel/rapl.c b/arch/x86/events/intel/rapl.c
index 8e2457cb6b4a..005908ee9333 100644
--- a/arch/x86/events/intel/rapl.c
+++ b/arch/x86/events/intel/rapl.c
@@ -775,6 +775,9 @@ static const struct x86_cpu_id rapl_cpu_match[] __initconst = {
X86_RAPL_MODEL_MATCH(INTEL_FAM6_KABYLAKE_DESKTOP, skl_rapl_init),
X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GOLDMONT, hsw_rapl_init),
+ X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_DENVERTON, hsw_rapl_init),
+
+ X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GEMINI_LAKE, hsw_rapl_init),
{},
};
diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
index db1fe377e6dd..a7196818416a 100644
--- a/arch/x86/events/intel/uncore_snbep.c
+++ b/arch/x86/events/intel/uncore_snbep.c
@@ -3462,7 +3462,7 @@ static struct intel_uncore_ops skx_uncore_iio_ops = {
static struct intel_uncore_type skx_uncore_iio = {
.name = "iio",
.num_counters = 4,
- .num_boxes = 5,
+ .num_boxes = 6,
.perf_ctr_bits = 48,
.event_ctl = SKX_IIO0_MSR_PMON_CTL0,
.perf_ctr = SKX_IIO0_MSR_PMON_CTR0,
@@ -3492,7 +3492,7 @@ static const struct attribute_group skx_uncore_format_group = {
static struct intel_uncore_type skx_uncore_irp = {
.name = "irp",
.num_counters = 2,
- .num_boxes = 5,
+ .num_boxes = 6,
.perf_ctr_bits = 48,
.event_ctl = SKX_IRP0_MSR_PMON_CTL0,
.perf_ctr = SKX_IRP0_MSR_PMON_CTR0,
diff --git a/arch/x86/events/msr.c b/arch/x86/events/msr.c
index 4bb3ec69e8ea..06723671ae4e 100644
--- a/arch/x86/events/msr.c
+++ b/arch/x86/events/msr.c
@@ -63,6 +63,14 @@ static bool test_intel(int idx)
case INTEL_FAM6_ATOM_SILVERMONT1:
case INTEL_FAM6_ATOM_SILVERMONT2:
case INTEL_FAM6_ATOM_AIRMONT:
+
+ case INTEL_FAM6_ATOM_GOLDMONT:
+ case INTEL_FAM6_ATOM_DENVERTON:
+
+ case INTEL_FAM6_ATOM_GEMINI_LAKE:
+
+ case INTEL_FAM6_XEON_PHI_KNL:
+ case INTEL_FAM6_XEON_PHI_KNM:
if (idx == PERF_MSR_SMI)
return true;
break;
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
index 8d0879f1d42c..8e02b30cf08e 100644
--- a/arch/x86/ia32/ia32_aout.c
+++ b/arch/x86/ia32/ia32_aout.c
@@ -407,10 +407,10 @@ static int load_aout_library(struct file *file)
unsigned long bss, start_addr, len, error;
int retval;
struct exec ex;
-
+ loff_t pos = 0;
retval = -ENOEXEC;
- error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
+ error = kernel_read(file, &ex, sizeof(ex), &pos);
if (error != sizeof(ex))
goto out;
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index e0bb46c02857..0e2a5edbce00 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -231,7 +231,7 @@ static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
ksig->ka.sa.sa_restorer)
sp = (unsigned long) ksig->ka.sa.sa_restorer;
- if (fpu->fpstate_active) {
+ if (fpu->initialized) {
unsigned long fx_aligned, math_size;
sp = fpu__alloc_mathframe(sp, 1, &fx_aligned, &math_size);
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index 1b020381ab38..c096624137ae 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -218,10 +218,9 @@ static inline int alternatives_text_reserved(void *start, void *end)
#define alternative_call_2(oldfunc, newfunc1, feature1, newfunc2, feature2, \
output, input...) \
{ \
- register void *__sp asm(_ASM_SP); \
asm volatile (ALTERNATIVE_2("call %P[old]", "call %P[new1]", feature1,\
"call %P[new2]", feature2) \
- : output, "+r" (__sp) \
+ : output, ASM_CALL_CONSTRAINT \
: [old] "i" (oldfunc), [new1] "i" (newfunc1), \
[new2] "i" (newfunc2), ## input); \
}
diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 676ee5807d86..b0dc91f4bedc 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -11,10 +11,12 @@
# define __ASM_FORM_COMMA(x) " " #x ","
#endif
-#ifdef CONFIG_X86_32
+#ifndef __x86_64__
+/* 32 bit */
# define __ASM_SEL(a,b) __ASM_FORM(a)
# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
#else
+/* 64 bit */
# define __ASM_SEL(a,b) __ASM_FORM(b)
# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
#endif
@@ -132,4 +134,15 @@
/* For C file, we already have NOKPROBE_SYMBOL macro */
#endif
+#ifndef __ASSEMBLY__
+/*
+ * This output constraint should be used for any inline asm which has a "call"
+ * instruction. Otherwise the asm may be inserted before the frame pointer
+ * gets set up by the containing function. If you forget to do this, objtool
+ * may print a "call without frame pointer save/setup" warning.
+ */
+register unsigned long current_stack_pointer asm(_ASM_SP);
+#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
+#endif
+
#endif /* _ASM_X86_ASM_H */
diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h
index 8b4140f6724f..cb9a1af109b4 100644
--- a/arch/x86/include/asm/cacheflush.h
+++ b/arch/x86/include/asm/cacheflush.h
@@ -7,6 +7,4 @@
void clflush_cache_range(void *addr, unsigned int size);
-#define mmio_flush_range(addr, size) clflush_cache_range(addr, size)
-
#endif /* _ASM_X86_CACHEFLUSH_H */
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
index 1a2ba368da39..9d0e13738ed3 100644
--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -121,7 +121,6 @@ static inline int desc_empty(const void *ptr)
#define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt))
#define store_gdt(dtr) native_store_gdt(dtr)
-#define store_idt(dtr) native_store_idt(dtr)
#define store_tr(tr) (tr = native_store_tr())
#define load_TLS(t, cpu) native_load_tls(t, cpu)
@@ -228,7 +227,7 @@ static inline void native_store_gdt(struct desc_ptr *dtr)
asm volatile("sgdt %0":"=m" (*dtr));
}
-static inline void native_store_idt(struct desc_ptr *dtr)
+static inline void store_idt(struct desc_ptr *dtr)
{
asm volatile("sidt %0":"=m" (*dtr));
}
diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
index 554cdb205d17..e3221ffa304e 100644
--- a/arch/x86/include/asm/fpu/internal.h
+++ b/arch/x86/include/asm/fpu/internal.h
@@ -23,11 +23,9 @@
/*
* High level FPU state handling functions:
*/
-extern void fpu__activate_curr(struct fpu *fpu);
-extern void fpu__activate_fpstate_read(struct fpu *fpu);
-extern void fpu__activate_fpstate_write(struct fpu *fpu);
-extern void fpu__current_fpstate_write_begin(void);
-extern void fpu__current_fpstate_write_end(void);
+extern void fpu__initialize(struct fpu *fpu);
+extern void fpu__prepare_read(struct fpu *fpu);
+extern void fpu__prepare_write(struct fpu *fpu);
extern void fpu__save(struct fpu *fpu);
extern void fpu__restore(struct fpu *fpu);
extern int fpu__restore_sig(void __user *buf, int ia32_frame);
@@ -120,20 +118,11 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
err; \
})
-#define check_insn(insn, output, input...) \
-({ \
- int err; \
+#define kernel_insn(insn, output, input...) \
asm volatile("1:" #insn "\n\t" \
"2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: movl $-1,%[err]\n" \
- " jmp 2b\n" \
- ".previous\n" \
- _ASM_EXTABLE(1b, 3b) \
- : [err] "=r" (err), output \
- : "0"(0), input); \
- err; \
-})
+ _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_fprestore) \
+ : output : input)
static inline int copy_fregs_to_user(struct fregs_state __user *fx)
{
@@ -153,20 +142,16 @@ static inline int copy_fxregs_to_user(struct fxregs_state __user *fx)
static inline void copy_kernel_to_fxregs(struct fxregs_state *fx)
{
- int err;
-
if (IS_ENABLED(CONFIG_X86_32)) {
- err = check_insn(fxrstor %[fx], "=m" (*fx), [fx] "m" (*fx));
+ kernel_insn(fxrstor %[fx], "=m" (*fx), [fx] "m" (*fx));
} else {
if (IS_ENABLED(CONFIG_AS_FXSAVEQ)) {
- err = check_insn(fxrstorq %[fx], "=m" (*fx), [fx] "m" (*fx));
+ kernel_insn(fxrstorq %[fx], "=m" (*fx), [fx] "m" (*fx));
} else {
/* See comment in copy_fxregs_to_kernel() below. */
- err = check_insn(rex64/fxrstor (%[fx]), "=m" (*fx), [fx] "R" (fx), "m" (*fx));
+ kernel_insn(rex64/fxrstor (%[fx]), "=m" (*fx), [fx] "R" (fx), "m" (*fx));
}
}
- /* Copying from a kernel buffer to FPU registers should never fail: */
- WARN_ON_FPU(err);
}
static inline int copy_user_to_fxregs(struct fxregs_state __user *fx)
@@ -183,9 +168,7 @@ static inline int copy_user_to_fxregs(struct fxregs_state __user *fx)
static inline void copy_kernel_to_fregs(struct fregs_state *fx)
{
- int err = check_insn(frstor %[fx], "=m" (*fx), [fx] "m" (*fx));
-
- WARN_ON_FPU(err);
+ kernel_insn(frstor %[fx], "=m" (*fx), [fx] "m" (*fx));
}
static inline int copy_user_to_fregs(struct fregs_state __user *fx)
@@ -281,18 +264,13 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
* Use XRSTORS to restore context if it is enabled. XRSTORS supports compact
* XSAVE area format.
*/
-#define XSTATE_XRESTORE(st, lmask, hmask, err) \
+#define XSTATE_XRESTORE(st, lmask, hmask) \
asm volatile(ALTERNATIVE(XRSTOR, \
XRSTORS, X86_FEATURE_XSAVES) \
"\n" \
- "xor %[err], %[err]\n" \
"3:\n" \
- ".pushsection .fixup,\"ax\"\n" \
- "4: movl $-2, %[err]\n" \
- "jmp 3b\n" \
- ".popsection\n" \
- _ASM_EXTABLE(661b, 4b) \
- : [err] "=r" (err) \
+ _ASM_EXTABLE_HANDLE(661b, 3b, ex_handler_fprestore)\
+ : \
: "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
: "memory")
@@ -336,7 +314,10 @@ static inline void copy_kernel_to_xregs_booting(struct xregs_state *xstate)
else
XSTATE_OP(XRSTOR, xstate, lmask, hmask, err);
- /* We should never fault when copying from a kernel buffer: */
+ /*
+ * We should never fault when copying from a kernel buffer, and the FPU
+ * state we set at boot time should be valid.
+ */
WARN_ON_FPU(err);
}
@@ -350,7 +331,7 @@ static inline void copy_xregs_to_kernel(struct xregs_state *xstate)
u32 hmask = mask >> 32;
int err;
- WARN_ON(!alternatives_patched);
+ WARN_ON_FPU(!alternatives_patched);
XSTATE_XSAVE(xstate, lmask, hmask, err);
@@ -365,12 +346,8 @@ static inline void copy_kernel_to_xregs(struct xregs_state *xstate, u64 mask)
{
u32 lmask = mask;
u32 hmask = mask >> 32;
- int err;
-
- XSTATE_XRESTORE(xstate, lmask, hmask, err);
- /* We should never fault when copying from a kernel buffer: */
- WARN_ON_FPU(err);
+ XSTATE_XRESTORE(xstate, lmask, hmask);
}
/*
@@ -526,38 +503,17 @@ static inline int fpregs_state_valid(struct fpu *fpu, unsigned int cpu)
*/
static inline void fpregs_deactivate(struct fpu *fpu)
{
- WARN_ON_FPU(!fpu->fpregs_active);
-
- fpu->fpregs_active = 0;
this_cpu_write(fpu_fpregs_owner_ctx, NULL);
trace_x86_fpu_regs_deactivated(fpu);
}
static inline void fpregs_activate(struct fpu *fpu)
{
- WARN_ON_FPU(fpu->fpregs_active);
-
- fpu->fpregs_active = 1;
this_cpu_write(fpu_fpregs_owner_ctx, fpu);
trace_x86_fpu_regs_activated(fpu);
}
/*
- * The question "does this thread have fpu access?"
- * is slightly racy, since preemption could come in
- * and revoke it immediately after the test.
- *
- * However, even in that very unlikely scenario,
- * we can just assume we have FPU access - typically
- * to save the FP state - we'll just take a #NM
- * fault and get the FPU access back.
- */
-static inline int fpregs_active(void)
-{
- return current->thread.fpu.fpregs_active;
-}
-
-/*
* FPU state switching for scheduling.
*
* This is a two-stage process:
@@ -571,14 +527,13 @@ static inline int fpregs_active(void)
static inline void
switch_fpu_prepare(struct fpu *old_fpu, int cpu)
{
- if (old_fpu->fpregs_active) {
+ if (old_fpu->initialized) {
if (!copy_fpregs_to_fpstate(old_fpu))
old_fpu->last_cpu = -1;
else
old_fpu->last_cpu = cpu;
/* But leave fpu_fpregs_owner_ctx! */
- old_fpu->fpregs_active = 0;
trace_x86_fpu_regs_deactivated(old_fpu);
} else
old_fpu->last_cpu = -1;
@@ -595,7 +550,7 @@ switch_fpu_prepare(struct fpu *old_fpu, int cpu)
static inline void switch_fpu_finish(struct fpu *new_fpu, int cpu)
{
bool preload = static_cpu_has(X86_FEATURE_FPU) &&
- new_fpu->fpstate_active;
+ new_fpu->initialized;
if (preload) {
if (!fpregs_state_valid(new_fpu, cpu))
@@ -617,8 +572,7 @@ static inline void user_fpu_begin(void)
struct fpu *fpu = &current->thread.fpu;
preempt_disable();
- if (!fpregs_active())
- fpregs_activate(fpu);
+ fpregs_activate(fpu);
preempt_enable();
}
diff --git a/arch/x86/include/asm/fpu/types.h b/arch/x86/include/asm/fpu/types.h
index 3c80f5b9c09d..a1520575d86b 100644
--- a/arch/x86/include/asm/fpu/types.h
+++ b/arch/x86/include/asm/fpu/types.h
@@ -68,6 +68,9 @@ struct fxregs_state {
/* Default value for fxregs_state.mxcsr: */
#define MXCSR_DEFAULT 0x1f80
+/* Copy both mxcsr & mxcsr_flags with a single u64 memcpy: */
+#define MXCSR_AND_FLAGS_SIZE sizeof(u64)
+
/*
* Software based FPU emulation state. This is arbitrary really,
* it matches the x87 format to make it easier to understand:
@@ -290,36 +293,13 @@ struct fpu {
unsigned int last_cpu;
/*
- * @fpstate_active:
+ * @initialized:
*
- * This flag indicates whether this context is active: if the task
+ * This flag indicates whether this context is initialized: if the task
* is not running then we can restore from this context, if the task
* is running then we should save into this context.
*/
- unsigned char fpstate_active;
-
- /*
- * @fpregs_active:
- *
- * This flag determines whether a given context is actively
- * loaded into the FPU's registers and that those registers
- * represent the task's current FPU state.
- *
- * Note the interaction with fpstate_active:
- *
- * # task does not use the FPU:
- * fpstate_active == 0
- *
- * # task uses the FPU and regs are active:
- * fpstate_active == 1 && fpregs_active == 1
- *
- * # the regs are inactive but still match fpstate:
- * fpstate_active == 1 && fpregs_active == 0 && fpregs_owner == fpu
- *
- * The third state is what we use for the lazy restore optimization
- * on lazy-switching CPUs.
- */
- unsigned char fpregs_active;
+ unsigned char initialized;
/*
* @state:
diff --git a/arch/x86/include/asm/fpu/xstate.h b/arch/x86/include/asm/fpu/xstate.h
index 1b2799e0699a..83fee2469eb7 100644
--- a/arch/x86/include/asm/fpu/xstate.h
+++ b/arch/x86/include/asm/fpu/xstate.h
@@ -48,8 +48,12 @@ void fpu__xstate_clear_all_cpu_caps(void);
void *get_xsave_addr(struct xregs_state *xsave, int xstate);
const void *get_xsave_field_ptr(int xstate_field);
int using_compacted_format(void);
-int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
- void __user *ubuf, struct xregs_state *xsave);
-int copyin_to_xsaves(const void *kbuf, const void __user *ubuf,
- struct xregs_state *xsave);
+int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int offset, unsigned int size);
+int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned int offset, unsigned int size);
+int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf);
+int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf);
+
+/* Validate an xstate header supplied by userspace (ptrace or sigreturn) */
+extern int validate_xstate_header(const struct xstate_header *hdr);
+
#endif
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 8844eee290b2..c73e493adf07 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -951,7 +951,6 @@ struct kvm_x86_ops {
void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg);
unsigned long (*get_rflags)(struct kvm_vcpu *vcpu);
void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags);
- u32 (*get_pkru)(struct kvm_vcpu *vcpu);
void (*tlb_flush)(struct kvm_vcpu *vcpu);
@@ -973,7 +972,7 @@ struct kvm_x86_ops {
void (*enable_nmi_window)(struct kvm_vcpu *vcpu);
void (*enable_irq_window)(struct kvm_vcpu *vcpu);
void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr);
- bool (*get_enable_apicv)(void);
+ bool (*get_enable_apicv)(struct kvm_vcpu *vcpu);
void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu);
void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr);
void (*hwapic_isr_update)(struct kvm_vcpu *vcpu, int isr);
diff --git a/arch/x86/include/asm/mem_encrypt.h b/arch/x86/include/asm/mem_encrypt.h
index 8e618fcf1f7c..6a77c63540f7 100644
--- a/arch/x86/include/asm/mem_encrypt.h
+++ b/arch/x86/include/asm/mem_encrypt.h
@@ -21,7 +21,7 @@
#ifdef CONFIG_AMD_MEM_ENCRYPT
-extern unsigned long sme_me_mask;
+extern u64 sme_me_mask;
void sme_encrypt_execute(unsigned long encrypted_kernel_vaddr,
unsigned long decrypted_kernel_vaddr,
@@ -49,7 +49,7 @@ void swiotlb_set_mem_attributes(void *vaddr, unsigned long size);
#else /* !CONFIG_AMD_MEM_ENCRYPT */
-#define sme_me_mask 0UL
+#define sme_me_mask 0ULL
static inline void __init sme_early_encrypt(resource_size_t paddr,
unsigned long size) { }
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h
index 7ae318c340d9..c120b5db178a 100644
--- a/arch/x86/include/asm/mmu_context.h
+++ b/arch/x86/include/asm/mmu_context.h
@@ -286,6 +286,32 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
return __pkru_allows_pkey(vma_pkey(vma), write);
}
+/*
+ * If PCID is on, ASID-aware code paths put the ASID+1 into the PCID
+ * bits. This serves two purposes. It prevents a nasty situation in
+ * which PCID-unaware code saves CR3, loads some other value (with PCID
+ * == 0), and then restores CR3, thus corrupting the TLB for ASID 0 if
+ * the saved ASID was nonzero. It also means that any bugs involving
+ * loading a PCID-enabled CR3 with CR4.PCIDE off will trigger
+ * deterministically.
+ */
+
+static inline unsigned long build_cr3(struct mm_struct *mm, u16 asid)
+{
+ if (static_cpu_has(X86_FEATURE_PCID)) {
+ VM_WARN_ON_ONCE(asid > 4094);
+ return __sme_pa(mm->pgd) | (asid + 1);
+ } else {
+ VM_WARN_ON_ONCE(asid != 0);
+ return __sme_pa(mm->pgd);
+ }
+}
+
+static inline unsigned long build_cr3_noflush(struct mm_struct *mm, u16 asid)
+{
+ VM_WARN_ON_ONCE(asid > 4094);
+ return __sme_pa(mm->pgd) | (asid + 1) | CR3_NOFLUSH;
+}
/*
* This can be used from process context to figure out what the value of
@@ -296,10 +322,8 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
*/
static inline unsigned long __get_current_cr3_fast(void)
{
- unsigned long cr3 = __pa(this_cpu_read(cpu_tlbstate.loaded_mm)->pgd);
-
- if (static_cpu_has(X86_FEATURE_PCID))
- cr3 |= this_cpu_read(cpu_tlbstate.loaded_mm_asid);
+ unsigned long cr3 = build_cr3(this_cpu_read(cpu_tlbstate.loaded_mm),
+ this_cpu_read(cpu_tlbstate.loaded_mm_asid));
/* For now, be very restrictive about when this can be called. */
VM_WARN_ON(in_nmi() || preemptible());
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
index 831eb7895535..c471ca1f9412 100644
--- a/arch/x86/include/asm/mpspec.h
+++ b/arch/x86/include/asm/mpspec.h
@@ -86,7 +86,6 @@ static inline void e820__memblock_alloc_reserved_mpc_new(void) { }
#endif
int generic_processor_info(int apicid, int version);
-int __generic_processor_info(int apicid, int version, bool enabled);
#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_LOCAL_APIC)
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 63cc96f064dc..738503e1f80c 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -179,7 +179,6 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
u64 input_address = input ? virt_to_phys(input) : 0;
u64 output_address = output ? virt_to_phys(output) : 0;
u64 hv_status;
- register void *__sp asm(_ASM_SP);
#ifdef CONFIG_X86_64
if (!hv_hypercall_pg)
@@ -187,7 +186,7 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
__asm__ __volatile__("mov %4, %%r8\n"
"call *%5"
- : "=a" (hv_status), "+r" (__sp),
+ : "=a" (hv_status), ASM_CALL_CONSTRAINT,
"+c" (control), "+d" (input_address)
: "r" (output_address), "m" (hv_hypercall_pg)
: "cc", "memory", "r8", "r9", "r10", "r11");
@@ -202,7 +201,7 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
__asm__ __volatile__("call *%7"
: "=A" (hv_status),
- "+c" (input_address_lo), "+r" (__sp)
+ "+c" (input_address_lo), ASM_CALL_CONSTRAINT
: "A" (control),
"b" (input_address_hi),
"D"(output_address_hi), "S"(output_address_lo),
@@ -224,12 +223,11 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1)
{
u64 hv_status, control = (u64)code | HV_HYPERCALL_FAST_BIT;
- register void *__sp asm(_ASM_SP);
#ifdef CONFIG_X86_64
{
__asm__ __volatile__("call *%4"
- : "=a" (hv_status), "+r" (__sp),
+ : "=a" (hv_status), ASM_CALL_CONSTRAINT,
"+c" (control), "+d" (input1)
: "m" (hv_hypercall_pg)
: "cc", "r8", "r9", "r10", "r11");
@@ -242,7 +240,7 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1)
__asm__ __volatile__ ("call *%5"
: "=A"(hv_status),
"+c"(input1_lo),
- "+r"(__sp)
+ ASM_CALL_CONSTRAINT
: "A" (control),
"b" (input1_hi),
"m" (hv_hypercall_pg)
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index c25dd22f7c70..12deec722cf0 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -71,11 +71,6 @@ static inline void write_cr3(unsigned long x)
PVOP_VCALL1(pv_mmu_ops.write_cr3, x);
}
-static inline unsigned long __read_cr4(void)
-{
- return PVOP_CALL0(unsigned long, pv_cpu_ops.read_cr4);
-}
-
static inline void __write_cr4(unsigned long x)
{
PVOP_VCALL1(pv_cpu_ops.write_cr4, x);
@@ -228,10 +223,6 @@ static inline void set_ldt(const void *addr, unsigned entries)
{
PVOP_VCALL2(pv_cpu_ops.set_ldt, addr, entries);
}
-static inline void store_idt(struct desc_ptr *dtr)
-{
- PVOP_VCALL1(pv_cpu_ops.store_idt, dtr);
-}
static inline unsigned long paravirt_store_tr(void)
{
return PVOP_CALL0(unsigned long, pv_cpu_ops.store_tr);
@@ -365,12 +356,6 @@ static inline void paravirt_release_p4d(unsigned long pfn)
PVOP_VCALL1(pv_mmu_ops.release_p4d, pfn);
}
-static inline void pte_update(struct mm_struct *mm, unsigned long addr,
- pte_t *ptep)
-{
- PVOP_VCALL3(pv_mmu_ops.pte_update, mm, addr, ptep);
-}
-
static inline pte_t __pte(pteval_t val)
{
pteval_t ret;
@@ -472,28 +457,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
PVOP_VCALL4(pv_mmu_ops.set_pte_at, mm, addr, ptep, pte.pte);
}
-static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
- pmd_t *pmdp, pmd_t pmd)
-{
- if (sizeof(pmdval_t) > sizeof(long))
- /* 5 arg words */
- pv_mmu_ops.set_pmd_at(mm, addr, pmdp, pmd);
- else
- PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp,
- native_pmd_val(pmd));
-}
-
-static inline void set_pud_at(struct mm_struct *mm, unsigned long addr,
- pud_t *pudp, pud_t pud)
-{
- if (sizeof(pudval_t) > sizeof(long))
- /* 5 arg words */
- pv_mmu_ops.set_pud_at(mm, addr, pudp, pud);
- else
- PVOP_VCALL4(pv_mmu_ops.set_pud_at, mm, addr, pudp,
- native_pud_val(pud));
-}
-
static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
{
pmdval_t val = native_pmd_val(pmd);
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 6b64fc6367f2..280d94c36dad 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -107,7 +107,6 @@ struct pv_cpu_ops {
unsigned long (*read_cr0)(void);
void (*write_cr0)(unsigned long);
- unsigned long (*read_cr4)(void);
void (*write_cr4)(unsigned long);
#ifdef CONFIG_X86_64
@@ -119,8 +118,6 @@ struct pv_cpu_ops {
void (*load_tr_desc)(void);
void (*load_gdt)(const struct desc_ptr *);
void (*load_idt)(const struct desc_ptr *);
- /* store_gdt has been removed. */
- void (*store_idt)(struct desc_ptr *);
void (*set_ldt)(const void *desc, unsigned entries);
unsigned long (*store_tr)(void);
void (*load_tls)(struct thread_struct *t, unsigned int cpu);
@@ -245,12 +242,6 @@ struct pv_mmu_ops {
void (*set_pte_at)(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pteval);
void (*set_pmd)(pmd_t *pmdp, pmd_t pmdval);
- void (*set_pmd_at)(struct mm_struct *mm, unsigned long addr,
- pmd_t *pmdp, pmd_t pmdval);
- void (*set_pud_at)(struct mm_struct *mm, unsigned long addr,
- pud_t *pudp, pud_t pudval);
- void (*pte_update)(struct mm_struct *mm, unsigned long addr,
- pte_t *ptep);
pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr,
pte_t *ptep);
@@ -468,8 +459,8 @@ int paravirt_disable_iospace(void);
*/
#ifdef CONFIG_X86_32
#define PVOP_VCALL_ARGS \
- unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx; \
- register void *__sp asm("esp")
+ unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx;
+
#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
#define PVOP_CALL_ARG1(x) "a" ((unsigned long)(x))
@@ -489,8 +480,8 @@ int paravirt_disable_iospace(void);
/* [re]ax isn't an arg, but the return val */
#define PVOP_VCALL_ARGS \
unsigned long __edi = __edi, __esi = __esi, \
- __edx = __edx, __ecx = __ecx, __eax = __eax; \
- register void *__sp asm("rsp")
+ __edx = __edx, __ecx = __ecx, __eax = __eax;
+
#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
#define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x))
@@ -541,7 +532,7 @@ int paravirt_disable_iospace(void);
asm volatile(pre \
paravirt_alt(PARAVIRT_CALL) \
post \
- : call_clbr, "+r" (__sp) \
+ : call_clbr, ASM_CALL_CONSTRAINT \
: paravirt_type(op), \
paravirt_clobber(clbr), \
##__VA_ARGS__ \
@@ -551,7 +542,7 @@ int paravirt_disable_iospace(void);
asm volatile(pre \
paravirt_alt(PARAVIRT_CALL) \
post \
- : call_clbr, "+r" (__sp) \
+ : call_clbr, ASM_CALL_CONSTRAINT \
: paravirt_type(op), \
paravirt_clobber(clbr), \
##__VA_ARGS__ \
@@ -578,7 +569,7 @@ int paravirt_disable_iospace(void);
asm volatile(pre \
paravirt_alt(PARAVIRT_CALL) \
post \
- : call_clbr, "+r" (__sp) \
+ : call_clbr, ASM_CALL_CONSTRAINT \
: paravirt_type(op), \
paravirt_clobber(clbr), \
##__VA_ARGS__ \
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index 5b4c44d419c5..b714934512b3 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -55,8 +55,6 @@ extern pmdval_t early_pmd_flags;
#else /* !CONFIG_PARAVIRT */
#define set_pte(ptep, pte) native_set_pte(ptep, pte)
#define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte)
-#define set_pmd_at(mm, addr, pmdp, pmd) native_set_pmd_at(mm, addr, pmdp, pmd)
-#define set_pud_at(mm, addr, pudp, pud) native_set_pud_at(mm, addr, pudp, pud)
#define set_pte_atomic(ptep, pte) \
native_set_pte_atomic(ptep, pte)
@@ -87,8 +85,6 @@ extern pmdval_t early_pmd_flags;
#define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep)
#define pmd_clear(pmd) native_pmd_clear(pmd)
-#define pte_update(mm, addr, ptep) do { } while (0)
-
#define pgd_val(x) native_pgd_val(x)
#define __pgd(x) native_make_pgd(x)
@@ -979,31 +975,18 @@ static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr,
native_set_pte(ptep, pte);
}
-static inline void native_set_pmd_at(struct mm_struct *mm, unsigned long addr,
- pmd_t *pmdp , pmd_t pmd)
+static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
+ pmd_t *pmdp, pmd_t pmd)
{
native_set_pmd(pmdp, pmd);
}
-static inline void native_set_pud_at(struct mm_struct *mm, unsigned long addr,
- pud_t *pudp, pud_t pud)
+static inline void set_pud_at(struct mm_struct *mm, unsigned long addr,
+ pud_t *pudp, pud_t pud)
{
native_set_pud(pudp, pud);
}
-#ifndef CONFIG_PARAVIRT
-/*
- * Rules for using pte_update - it must be called after any PTE update which
- * has not been done using the set_pte / clear_pte interfaces. It is used by
- * shadow mode hypervisors to resynchronize the shadow page tables. Kernel PTE
- * updates should either be sets, clears, or set_pte_atomic for P->P
- * transitions, which means this hook should only be called for user PTEs.
- * This hook implies a P->P protection or access change has taken place, which
- * requires a subsequent TLB flush.
- */
-#define pte_update(mm, addr, ptep) do { } while (0)
-#endif
-
/*
* We only update the dirty/accessed state if we set
* the dirty bit by hand in the kernel, since the hardware
@@ -1031,7 +1014,6 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
pte_t *ptep)
{
pte_t pte = native_ptep_get_and_clear(ptep);
- pte_update(mm, addr, ptep);
return pte;
}
@@ -1058,7 +1040,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm,
unsigned long addr, pte_t *ptep)
{
clear_bit(_PAGE_BIT_RW, (unsigned long *)&ptep->pte);
- pte_update(mm, addr, ptep);
}
#define flush_tlb_fix_spurious_fault(vma, address) do { } while (0)
diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h
index ec1f3c651150..4f44505dbf87 100644
--- a/arch/x86/include/asm/preempt.h
+++ b/arch/x86/include/asm/preempt.h
@@ -100,19 +100,14 @@ static __always_inline bool should_resched(int preempt_offset)
#ifdef CONFIG_PREEMPT
extern asmlinkage void ___preempt_schedule(void);
-# define __preempt_schedule() \
-({ \
- register void *__sp asm(_ASM_SP); \
- asm volatile ("call ___preempt_schedule" : "+r"(__sp)); \
-})
+# define __preempt_schedule() \
+ asm volatile ("call ___preempt_schedule" : ASM_CALL_CONSTRAINT)
extern asmlinkage void preempt_schedule(void);
extern asmlinkage void ___preempt_schedule_notrace(void);
-# define __preempt_schedule_notrace() \
-({ \
- register void *__sp asm(_ASM_SP); \
- asm volatile ("call ___preempt_schedule_notrace" : "+r"(__sp)); \
-})
+# define __preempt_schedule_notrace() \
+ asm volatile ("call ___preempt_schedule_notrace" : ASM_CALL_CONSTRAINT)
+
extern asmlinkage void preempt_schedule_notrace(void);
#endif
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 3fa26a61eabc..b390ff76e58f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -677,8 +677,6 @@ static inline void sync_core(void)
* Like all of Linux's memory ordering operations, this is a
* compiler barrier as well.
*/
- register void *__sp asm(_ASM_SP);
-
#ifdef CONFIG_X86_32
asm volatile (
"pushfl\n\t"
@@ -686,7 +684,7 @@ static inline void sync_core(void)
"pushl $1f\n\t"
"iret\n\t"
"1:"
- : "+r" (__sp) : : "memory");
+ : ASM_CALL_CONSTRAINT : : "memory");
#else
unsigned int tmp;
@@ -703,7 +701,7 @@ static inline void sync_core(void)
"iretq\n\t"
UNWIND_HINT_RESTORE
"1:"
- : "=&r" (tmp), "+r" (__sp) : : "cc", "memory");
+ : "=&r" (tmp), ASM_CALL_CONSTRAINT : : "cc", "memory");
#endif
}
diff --git a/arch/x86/include/asm/rwsem.h b/arch/x86/include/asm/rwsem.h
index a34e0d4b957d..7116b7931c7b 100644
--- a/arch/x86/include/asm/rwsem.h
+++ b/arch/x86/include/asm/rwsem.h
@@ -103,7 +103,6 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
({ \
long tmp; \
struct rw_semaphore* ret; \
- register void *__sp asm(_ASM_SP); \
\
asm volatile("# beginning down_write\n\t" \
LOCK_PREFIX " xadd %1,(%4)\n\t" \
@@ -114,7 +113,8 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
" call " slow_path "\n" \
"1:\n" \
"# ending down_write" \
- : "+m" (sem->count), "=d" (tmp), "=a" (ret), "+r" (__sp) \
+ : "+m" (sem->count), "=d" (tmp), \
+ "=a" (ret), ASM_CALL_CONSTRAINT \
: "a" (sem), "1" (RWSEM_ACTIVE_WRITE_BIAS) \
: "memory", "cc"); \
ret; \
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
index 9efaabf5b54b..a24dfcf79f4a 100644
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -135,6 +135,11 @@ static inline void native_wbinvd(void)
extern asmlinkage void native_load_gs_index(unsigned);
+static inline unsigned long __read_cr4(void)
+{
+ return native_read_cr4();
+}
+
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
#else
@@ -173,11 +178,6 @@ static inline void write_cr3(unsigned long x)
native_write_cr3(x);
}
-static inline unsigned long __read_cr4(void)
-{
- return native_read_cr4();
-}
-
static inline void __write_cr4(unsigned long x)
{
native_write_cr4(x);
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
index 5161da1a0fa0..89e7eeb5cec1 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -158,17 +158,6 @@ struct thread_info {
*/
#ifndef __ASSEMBLY__
-static inline unsigned long current_stack_pointer(void)
-{
- unsigned long sp;
-#ifdef CONFIG_X86_64
- asm("mov %%rsp,%0" : "=g" (sp));
-#else
- asm("mov %%esp,%0" : "=g" (sp));
-#endif
- return sp;
-}
-
/*
* Walks up the stack frames to make sure that the specified object is
* entirely contained by a single stack frame.
diff --git a/arch/x86/include/asm/trace/fpu.h b/arch/x86/include/asm/trace/fpu.h
index 342e59789fcd..39f7a27bef13 100644
--- a/arch/x86/include/asm/trace/fpu.h
+++ b/arch/x86/include/asm/trace/fpu.h
@@ -12,25 +12,22 @@ DECLARE_EVENT_CLASS(x86_fpu,
TP_STRUCT__entry(
__field(struct fpu *, fpu)
- __field(bool, fpregs_active)
- __field(bool, fpstate_active)
+ __field(bool, initialized)
__field(u64, xfeatures)
__field(u64, xcomp_bv)
),
TP_fast_assign(
__entry->fpu = fpu;
- __entry->fpregs_active = fpu->fpregs_active;
- __entry->fpstate_active = fpu->fpstate_active;
+ __entry->initialized = fpu->initialized;
if (boot_cpu_has(X86_FEATURE_OSXSAVE)) {
__entry->xfeatures = fpu->state.xsave.header.xfeatures;
__entry->xcomp_bv = fpu->state.xsave.header.xcomp_bv;
}
),
- TP_printk("x86/fpu: %p fpregs_active: %d fpstate_active: %d xfeatures: %llx xcomp_bv: %llx",
+ TP_printk("x86/fpu: %p initialized: %d xfeatures: %llx xcomp_bv: %llx",
__entry->fpu,
- __entry->fpregs_active,
- __entry->fpstate_active,
+ __entry->initialized,
__entry->xfeatures,
__entry->xcomp_bv
)
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 184eb9894dae..4b892917edeb 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -166,11 +166,11 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
({ \
int __ret_gu; \
register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \
- register void *__sp asm(_ASM_SP); \
__chk_user_ptr(ptr); \
might_fault(); \
asm volatile("call __get_user_%P4" \
- : "=a" (__ret_gu), "=r" (__val_gu), "+r" (__sp) \
+ : "=a" (__ret_gu), "=r" (__val_gu), \
+ ASM_CALL_CONSTRAINT \
: "0" (ptr), "i" (sizeof(*(ptr)))); \
(x) = (__force __typeof__(*(ptr))) __val_gu; \
__builtin_expect(__ret_gu, 0); \
@@ -337,7 +337,7 @@ do { \
_ASM_EXTABLE(1b, 4b) \
_ASM_EXTABLE(2b, 4b) \
: "=r" (retval), "=&A"(x) \
- : "m" (__m(__ptr)), "m" __m(((u32 *)(__ptr)) + 1), \
+ : "m" (__m(__ptr)), "m" __m(((u32 __user *)(__ptr)) + 1), \
"i" (errret), "0" (retval)); \
})
diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
index 9606688caa4b..7cb282e9e587 100644
--- a/arch/x86/include/asm/xen/hypercall.h
+++ b/arch/x86/include/asm/xen/hypercall.h
@@ -113,10 +113,9 @@ extern struct { char _entry[32]; } hypercall_page[];
register unsigned long __arg2 asm(__HYPERCALL_ARG2REG) = __arg2; \
register unsigned long __arg3 asm(__HYPERCALL_ARG3REG) = __arg3; \
register unsigned long __arg4 asm(__HYPERCALL_ARG4REG) = __arg4; \
- register unsigned long __arg5 asm(__HYPERCALL_ARG5REG) = __arg5; \
- register void *__sp asm(_ASM_SP);
+ register unsigned long __arg5 asm(__HYPERCALL_ARG5REG) = __arg5;
-#define __HYPERCALL_0PARAM "=r" (__res), "+r" (__sp)
+#define __HYPERCALL_0PARAM "=r" (__res), ASM_CALL_CONSTRAINT
#define __HYPERCALL_1PARAM __HYPERCALL_0PARAM, "+r" (__arg1)
#define __HYPERCALL_2PARAM __HYPERCALL_1PARAM, "+r" (__arg2)
#define __HYPERCALL_3PARAM __HYPERCALL_2PARAM, "+r" (__arg3)
@@ -552,13 +551,13 @@ static inline void
MULTI_update_descriptor(struct multicall_entry *mcl, u64 maddr,
struct desc_struct desc)
{
- u32 *p = (u32 *) &desc;
-
mcl->op = __HYPERVISOR_update_descriptor;
if (sizeof(maddr) == sizeof(long)) {
mcl->args[0] = maddr;
mcl->args[1] = *(unsigned long *)&desc;
} else {
+ u32 *p = (u32 *)&desc;
+
mcl->args[0] = maddr;
mcl->args[1] = maddr >> 32;
mcl->args[2] = *p++;
diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h
index 7032f4d8dff3..f65d12504e80 100644
--- a/arch/x86/include/uapi/asm/hyperv.h
+++ b/arch/x86/include/uapi/asm/hyperv.h
@@ -153,12 +153,6 @@
#define HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED (1 << 11)
/*
- * HV_VP_SET available
- */
-#define HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED (1 << 11)
-
-
-/*
* Crash notification flag.
*/
#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63)
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index f8ae286c1502..079535e53e2a 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1373,7 +1373,7 @@ static void __init acpi_reduced_hw_init(void)
* If your system is blacklisted here, but you find that acpi=force
* works for you, please contact [email protected]
*/
-static struct dmi_system_id __initdata acpi_dmi_table[] = {
+static const struct dmi_system_id acpi_dmi_table[] __initconst = {
/*
* Boxes that need ACPI disabled
*/
@@ -1448,7 +1448,7 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
};
/* second table for DMI checks that should run after early-quirks */
-static struct dmi_system_id __initdata acpi_dmi_table_late[] = {
+static const struct dmi_system_id acpi_dmi_table_late[] __initconst = {
/*
* HP laptops which use a DSDT reporting as HP/SB400/10000,
* which includes some code which overrides all temperature
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 8315e2f517a7..d705c769f77d 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2130,7 +2130,7 @@ int generic_processor_info(int apicid, int version)
* Since fixing handling of boot_cpu_physical_apicid requires
* another discussion and tests on each platform, we leave it
* for now and here we use read_apic_id() directly in this
- * function, __generic_processor_info().
+ * function, generic_processor_info().
*/
if (disabled_cpu_apicid != BAD_APICID &&
disabled_cpu_apicid != read_apic_id() &&
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index 446b0d3d4932..e4b0d92b3ae0 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -2043,7 +2043,7 @@ static int __init swab_apm_power_in_minutes(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id __initdata apm_dmi_table[] = {
+static const struct dmi_system_id apm_dmi_table[] __initconst = {
{
print_if_true,
KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.",
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 9862e2cd6d93..d58184b7cd44 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -763,6 +763,16 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
}
}
+static void init_amd_zn(struct cpuinfo_x86 *c)
+{
+ /*
+ * Fix erratum 1076: CPB feature bit not being set in CPUID. It affects
+ * all up to and including B1.
+ */
+ if (c->x86_model <= 1 && c->x86_mask <= 1)
+ set_cpu_cap(c, X86_FEATURE_CPB);
+}
+
static void init_amd(struct cpuinfo_x86 *c)
{
early_init_amd(c);
@@ -791,6 +801,7 @@ static void init_amd(struct cpuinfo_x86 *c)
case 0x10: init_amd_gh(c); break;
case 0x12: init_amd_ln(c); break;
case 0x15: init_amd_bd(c); break;
+ case 0x17: init_amd_zn(c); break;
}
/* Enable workaround for FXSAVE leak */
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index db684880d74a..0af86d9242da 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -21,14 +21,6 @@
void __init check_bugs(void)
{
-#ifdef CONFIG_X86_32
- /*
- * Regardless of whether PCID is enumerated, the SDM says
- * that it can't be enabled in 32-bit mode.
- */
- setup_clear_cpu_cap(X86_FEATURE_PCID);
-#endif
-
identify_boot_cpu();
if (!IS_ENABLED(CONFIG_SMP)) {
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index fb1d3358a4af..c9176bae7fd8 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -169,21 +169,21 @@ static int __init x86_mpx_setup(char *s)
__setup("nompx", x86_mpx_setup);
#ifdef CONFIG_X86_64
-static int __init x86_pcid_setup(char *s)
+static int __init x86_nopcid_setup(char *s)
{
- /* require an exact match without trailing characters */
- if (strlen(s))
- return 0;
+ /* nopcid doesn't accept parameters */
+ if (s)
+ return -EINVAL;
/* do not emit a message if the feature is not present */
if (!boot_cpu_has(X86_FEATURE_PCID))
- return 1;
+ return 0;
setup_clear_cpu_cap(X86_FEATURE_PCID);
pr_info("nopcid: PCID feature disabled\n");
- return 1;
+ return 0;
}
-__setup("nopcid", x86_pcid_setup);
+early_param("nopcid", x86_nopcid_setup);
#endif
static int __init x86_noinvpcid_setup(char *s)
@@ -329,38 +329,6 @@ static __always_inline void setup_smap(struct cpuinfo_x86 *c)
}
}
-static void setup_pcid(struct cpuinfo_x86 *c)
-{
- if (cpu_has(c, X86_FEATURE_PCID)) {
- if (cpu_has(c, X86_FEATURE_PGE)) {
- /*
- * We'd like to use cr4_set_bits_and_update_boot(),
- * but we can't. CR4.PCIDE is special and can only
- * be set in long mode, and the early CPU init code
- * doesn't know this and would try to restore CR4.PCIDE
- * prior to entering long mode.
- *
- * Instead, we rely on the fact that hotplug, resume,
- * etc all fully restore CR4 before they write anything
- * that could have nonzero PCID bits to CR3. CR4.PCIDE
- * has no effect on the page tables themselves, so we
- * don't need it to be restored early.
- */
- cr4_set_bits(X86_CR4_PCIDE);
- } else {
- /*
- * flush_tlb_all(), as currently implemented, won't
- * work if PCID is on but PGE is not. Since that
- * combination doesn't exist on real hardware, there's
- * no reason to try to fully support it, but it's
- * polite to avoid corrupting data if we're on
- * an improperly configured VM.
- */
- clear_cpu_cap(c, X86_FEATURE_PCID);
- }
- }
-}
-
/*
* Protection Keys are not available in 32-bit mode.
*/
@@ -936,6 +904,14 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
setup_force_cpu_cap(X86_FEATURE_ALWAYS);
fpu__init_system(c);
+
+#ifdef CONFIG_X86_32
+ /*
+ * Regardless of whether PCID is enumerated, the SDM says
+ * that it can't be enabled in 32-bit mode.
+ */
+ setup_clear_cpu_cap(X86_FEATURE_PCID);
+#endif
}
void __init early_cpu_init(void)
@@ -1175,9 +1151,6 @@ static void identify_cpu(struct cpuinfo_x86 *c)
setup_smep(c);
setup_smap(c);
- /* Set up PCID */
- setup_pcid(c);
-
/*
* The vendor-specific functions might have changed features.
* Now we do "generic changes."
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 3b3f713e15e5..236324e83a3a 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -59,8 +59,6 @@ void hyperv_vector_handler(struct pt_regs *regs)
void hv_setup_vmbus_irq(void (*handler)(void))
{
vmbus_handler = handler;
- /* Setup the IDT for hypervisor callback */
- alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, hyperv_callback_vector);
}
void hv_remove_vmbus_irq(void)
@@ -251,6 +249,8 @@ static void __init ms_hyperv_init_platform(void)
*/
x86_platform.apic_post_init = hyperv_init;
hyperv_setup_mmu_ops();
+ /* Setup the IDT for hypervisor callback */
+ alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, hyperv_callback_vector);
#endif
}
diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
index e1114f070c2d..f92a6593de1e 100644
--- a/arch/x86/kernel/fpu/core.c
+++ b/arch/x86/kernel/fpu/core.c
@@ -100,7 +100,7 @@ void __kernel_fpu_begin(void)
kernel_fpu_disable();
- if (fpu->fpregs_active) {
+ if (fpu->initialized) {
/*
* Ignore return value -- we don't care if reg state
* is clobbered.
@@ -116,7 +116,7 @@ void __kernel_fpu_end(void)
{
struct fpu *fpu = &current->thread.fpu;
- if (fpu->fpregs_active)
+ if (fpu->initialized)
copy_kernel_to_fpregs(&fpu->state);
kernel_fpu_enable();
@@ -148,7 +148,7 @@ void fpu__save(struct fpu *fpu)
preempt_disable();
trace_x86_fpu_before_save(fpu);
- if (fpu->fpregs_active) {
+ if (fpu->initialized) {
if (!copy_fpregs_to_fpstate(fpu)) {
copy_kernel_to_fpregs(&fpu->state);
}
@@ -189,10 +189,9 @@ EXPORT_SYMBOL_GPL(fpstate_init);
int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
{
- dst_fpu->fpregs_active = 0;
dst_fpu->last_cpu = -1;
- if (!src_fpu->fpstate_active || !static_cpu_has(X86_FEATURE_FPU))
+ if (!src_fpu->initialized || !static_cpu_has(X86_FEATURE_FPU))
return 0;
WARN_ON_FPU(src_fpu != &current->thread.fpu);
@@ -206,26 +205,14 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
/*
* Save current FPU registers directly into the child
* FPU context, without any memory-to-memory copying.
- * In lazy mode, if the FPU context isn't loaded into
- * fpregs, CR0.TS will be set and do_device_not_available
- * will load the FPU context.
*
- * We have to do all this with preemption disabled,
- * mostly because of the FNSAVE case, because in that
- * case we must not allow preemption in the window
- * between the FNSAVE and us marking the context lazy.
- *
- * It shouldn't be an issue as even FNSAVE is plenty
- * fast in terms of critical section length.
+ * ( The function 'fails' in the FNSAVE case, which destroys
+ * register contents so we have to copy them back. )
*/
- preempt_disable();
if (!copy_fpregs_to_fpstate(dst_fpu)) {
- memcpy(&src_fpu->state, &dst_fpu->state,
- fpu_kernel_xstate_size);
-
+ memcpy(&src_fpu->state, &dst_fpu->state, fpu_kernel_xstate_size);
copy_kernel_to_fpregs(&src_fpu->state);
}
- preempt_enable();
trace_x86_fpu_copy_src(src_fpu);
trace_x86_fpu_copy_dst(dst_fpu);
@@ -237,45 +224,48 @@ int fpu__copy(struct fpu *dst_fpu, struct fpu *src_fpu)
* Activate the current task's in-memory FPU context,
* if it has not been used before:
*/
-void fpu__activate_curr(struct fpu *fpu)
+void fpu__initialize(struct fpu *fpu)
{
WARN_ON_FPU(fpu != &current->thread.fpu);
- if (!fpu->fpstate_active) {
+ if (!fpu->initialized) {
fpstate_init(&fpu->state);
trace_x86_fpu_init_state(fpu);
trace_x86_fpu_activate_state(fpu);
/* Safe to do for the current task: */
- fpu->fpstate_active = 1;
+ fpu->initialized = 1;
}
}
-EXPORT_SYMBOL_GPL(fpu__activate_curr);
+EXPORT_SYMBOL_GPL(fpu__initialize);
/*
* This function must be called before we read a task's fpstate.
*
- * If the task has not used the FPU before then initialize its
- * fpstate.
+ * There's two cases where this gets called:
+ *
+ * - for the current task (when coredumping), in which case we have
+ * to save the latest FPU registers into the fpstate,
+ *
+ * - or it's called for stopped tasks (ptrace), in which case the
+ * registers were already saved by the context-switch code when
+ * the task scheduled out - we only have to initialize the registers
+ * if they've never been initialized.
*
* If the task has used the FPU before then save it.
*/
-void fpu__activate_fpstate_read(struct fpu *fpu)
+void fpu__prepare_read(struct fpu *fpu)
{
- /*
- * If fpregs are active (in the current CPU), then
- * copy them to the fpstate:
- */
- if (fpu->fpregs_active) {
+ if (fpu == &current->thread.fpu) {
fpu__save(fpu);
} else {
- if (!fpu->fpstate_active) {
+ if (!fpu->initialized) {
fpstate_init(&fpu->state);
trace_x86_fpu_init_state(fpu);
trace_x86_fpu_activate_state(fpu);
/* Safe to do for current and for stopped child tasks: */
- fpu->fpstate_active = 1;
+ fpu->initialized = 1;
}
}
}
@@ -283,17 +273,17 @@ void fpu__activate_fpstate_read(struct fpu *fpu)
/*
* This function must be called before we write a task's fpstate.
*
- * If the task has used the FPU before then unlazy it.
+ * If the task has used the FPU before then invalidate any cached FPU registers.
* If the task has not used the FPU before then initialize its fpstate.
*
* After this function call, after registers in the fpstate are
* modified and the child task has woken up, the child task will
* restore the modified FPU state from the modified context. If we
- * didn't clear its lazy status here then the lazy in-registers
+ * didn't clear its cached status here then the cached in-registers
* state pending on its former CPU could be restored, corrupting
* the modifications.
*/
-void fpu__activate_fpstate_write(struct fpu *fpu)
+void fpu__prepare_write(struct fpu *fpu)
{
/*
* Only stopped child tasks can be used to modify the FPU
@@ -301,8 +291,8 @@ void fpu__activate_fpstate_write(struct fpu *fpu)
*/
WARN_ON_FPU(fpu == &current->thread.fpu);
- if (fpu->fpstate_active) {
- /* Invalidate any lazy state: */
+ if (fpu->initialized) {
+ /* Invalidate any cached state: */
__fpu_invalidate_fpregs_state(fpu);
} else {
fpstate_init(&fpu->state);
@@ -310,74 +300,11 @@ void fpu__activate_fpstate_write(struct fpu *fpu)
trace_x86_fpu_activate_state(fpu);
/* Safe to do for stopped child tasks: */
- fpu->fpstate_active = 1;
+ fpu->initialized = 1;
}
}
/*
- * This function must be called before we write the current
- * task's fpstate.
- *
- * This call gets the current FPU register state and moves
- * it in to the 'fpstate'. Preemption is disabled so that
- * no writes to the 'fpstate' can occur from context
- * swiches.
- *
- * Must be followed by a fpu__current_fpstate_write_end().
- */
-void fpu__current_fpstate_write_begin(void)
-{
- struct fpu *fpu = &current->thread.fpu;
-
- /*
- * Ensure that the context-switching code does not write
- * over the fpstate while we are doing our update.
- */
- preempt_disable();
-
- /*
- * Move the fpregs in to the fpu's 'fpstate'.
- */
- fpu__activate_fpstate_read(fpu);
-
- /*
- * The caller is about to write to 'fpu'. Ensure that no
- * CPU thinks that its fpregs match the fpstate. This
- * ensures we will not be lazy and skip a XRSTOR in the
- * future.
- */
- __fpu_invalidate_fpregs_state(fpu);
-}
-
-/*
- * This function must be paired with fpu__current_fpstate_write_begin()
- *
- * This will ensure that the modified fpstate gets placed back in
- * the fpregs if necessary.
- *
- * Note: This function may be called whether or not an _actual_
- * write to the fpstate occurred.
- */
-void fpu__current_fpstate_write_end(void)
-{
- struct fpu *fpu = &current->thread.fpu;
-
- /*
- * 'fpu' now has an updated copy of the state, but the
- * registers may still be out of date. Update them with
- * an XRSTOR if they are active.
- */
- if (fpregs_active())
- copy_kernel_to_fpregs(&fpu->state);
-
- /*
- * Our update is done and the fpregs/fpstate are in sync
- * if necessary. Context switches can happen again.
- */
- preempt_enable();
-}
-
-/*
* 'fpu__restore()' is called to copy FPU registers from
* the FPU fpstate to the live hw registers and to activate
* access to the hardware registers, so that FPU instructions
@@ -389,7 +316,7 @@ void fpu__current_fpstate_write_end(void)
*/
void fpu__restore(struct fpu *fpu)
{
- fpu__activate_curr(fpu);
+ fpu__initialize(fpu);
/* Avoid __kernel_fpu_begin() right after fpregs_activate() */
kernel_fpu_disable();
@@ -414,15 +341,17 @@ void fpu__drop(struct fpu *fpu)
{
preempt_disable();
- if (fpu->fpregs_active) {
- /* Ignore delayed exceptions from user space */
- asm volatile("1: fwait\n"
- "2:\n"
- _ASM_EXTABLE(1b, 2b));
- fpregs_deactivate(fpu);
+ if (fpu == &current->thread.fpu) {
+ if (fpu->initialized) {
+ /* Ignore delayed exceptions from user space */
+ asm volatile("1: fwait\n"
+ "2:\n"
+ _ASM_EXTABLE(1b, 2b));
+ fpregs_deactivate(fpu);
+ }
}
- fpu->fpstate_active = 0;
+ fpu->initialized = 0;
trace_x86_fpu_dropped(fpu);
@@ -462,9 +391,11 @@ void fpu__clear(struct fpu *fpu)
* Make sure fpstate is cleared and initialized.
*/
if (static_cpu_has(X86_FEATURE_FPU)) {
- fpu__activate_curr(fpu);
+ preempt_disable();
+ fpu__initialize(fpu);
user_fpu_begin();
copy_init_fpstate_to_fpregs();
+ preempt_enable();
}
}
diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
index d5d44c452624..7affb7e3d9a5 100644
--- a/arch/x86/kernel/fpu/init.c
+++ b/arch/x86/kernel/fpu/init.c
@@ -240,7 +240,7 @@ static void __init fpu__init_system_ctx_switch(void)
WARN_ON_FPU(!on_boot_cpu);
on_boot_cpu = 0;
- WARN_ON_FPU(current->thread.fpu.fpstate_active);
+ WARN_ON_FPU(current->thread.fpu.initialized);
}
/*
diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c
index b188b16841e3..3ea151372389 100644
--- a/arch/x86/kernel/fpu/regset.c
+++ b/arch/x86/kernel/fpu/regset.c
@@ -16,14 +16,14 @@ int regset_fpregs_active(struct task_struct *target, const struct user_regset *r
{
struct fpu *target_fpu = &target->thread.fpu;
- return target_fpu->fpstate_active ? regset->n : 0;
+ return target_fpu->initialized ? regset->n : 0;
}
int regset_xregset_fpregs_active(struct task_struct *target, const struct user_regset *regset)
{
struct fpu *target_fpu = &target->thread.fpu;
- if (boot_cpu_has(X86_FEATURE_FXSR) && target_fpu->fpstate_active)
+ if (boot_cpu_has(X86_FEATURE_FXSR) && target_fpu->initialized)
return regset->n;
else
return 0;
@@ -38,7 +38,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
if (!boot_cpu_has(X86_FEATURE_FXSR))
return -ENODEV;
- fpu__activate_fpstate_read(fpu);
+ fpu__prepare_read(fpu);
fpstate_sanitize_xstate(fpu);
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
@@ -55,7 +55,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
if (!boot_cpu_has(X86_FEATURE_FXSR))
return -ENODEV;
- fpu__activate_fpstate_write(fpu);
+ fpu__prepare_write(fpu);
fpstate_sanitize_xstate(fpu);
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
@@ -89,10 +89,13 @@ int xstateregs_get(struct task_struct *target, const struct user_regset *regset,
xsave = &fpu->state.xsave;
- fpu__activate_fpstate_read(fpu);
+ fpu__prepare_read(fpu);
if (using_compacted_format()) {
- ret = copyout_from_xsaves(pos, count, kbuf, ubuf, xsave);
+ if (kbuf)
+ ret = copy_xstate_to_kernel(kbuf, xsave, pos, count);
+ else
+ ret = copy_xstate_to_user(ubuf, xsave, pos, count);
} else {
fpstate_sanitize_xstate(fpu);
/*
@@ -129,28 +132,29 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,
xsave = &fpu->state.xsave;
- fpu__activate_fpstate_write(fpu);
+ fpu__prepare_write(fpu);
- if (boot_cpu_has(X86_FEATURE_XSAVES))
- ret = copyin_to_xsaves(kbuf, ubuf, xsave);
- else
+ if (using_compacted_format()) {
+ if (kbuf)
+ ret = copy_kernel_to_xstate(xsave, kbuf);
+ else
+ ret = copy_user_to_xstate(xsave, ubuf);
+ } else {
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, xsave, 0, -1);
-
- /*
- * In case of failure, mark all states as init:
- */
- if (ret)
- fpstate_init(&fpu->state);
+ if (!ret)
+ ret = validate_xstate_header(&xsave->header);
+ }
/*
* mxcsr reserved bits must be masked to zero for security reasons.
*/
xsave->i387.mxcsr &= mxcsr_feature_mask;
- xsave->header.xfeatures &= xfeatures_mask;
+
/*
- * These bits must be zero.
+ * In case of failure, mark all states as init:
*/
- memset(&xsave->header.reserved, 0, 48);
+ if (ret)
+ fpstate_init(&fpu->state);
return ret;
}
@@ -299,7 +303,7 @@ int fpregs_get(struct task_struct *target, const struct user_regset *regset,
struct fpu *fpu = &target->thread.fpu;
struct user_i387_ia32_struct env;
- fpu__activate_fpstate_read(fpu);
+ fpu__prepare_read(fpu);
if (!boot_cpu_has(X86_FEATURE_FPU))
return fpregs_soft_get(target, regset, pos, count, kbuf, ubuf);
@@ -329,7 +333,7 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset,
struct user_i387_ia32_struct env;
int ret;
- fpu__activate_fpstate_write(fpu);
+ fpu__prepare_write(fpu);
fpstate_sanitize_xstate(fpu);
if (!boot_cpu_has(X86_FEATURE_FPU))
@@ -369,7 +373,7 @@ int dump_fpu(struct pt_regs *regs, struct user_i387_struct *ufpu)
struct fpu *fpu = &tsk->thread.fpu;
int fpvalid;
- fpvalid = fpu->fpstate_active;
+ fpvalid = fpu->initialized;
if (fpvalid)
fpvalid = !fpregs_get(tsk, NULL,
0, sizeof(struct user_i387_ia32_struct),
diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
index 83c23c230b4c..fb639e70048f 100644
--- a/arch/x86/kernel/fpu/signal.c
+++ b/arch/x86/kernel/fpu/signal.c
@@ -155,7 +155,8 @@ static inline int copy_fpregs_to_sigframe(struct xregs_state __user *buf)
*/
int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size)
{
- struct xregs_state *xsave = &current->thread.fpu.state.xsave;
+ struct fpu *fpu = &current->thread.fpu;
+ struct xregs_state *xsave = &fpu->state.xsave;
struct task_struct *tsk = current;
int ia32_fxstate = (buf != buf_fx);
@@ -170,13 +171,13 @@ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size)
sizeof(struct user_i387_ia32_struct), NULL,
(struct _fpstate_32 __user *) buf) ? -1 : 1;
- if (fpregs_active() || using_compacted_format()) {
+ if (fpu->initialized || using_compacted_format()) {
/* Save the live register state to the user directly. */
if (copy_fpregs_to_sigframe(buf_fx))
return -1;
/* Update the thread's fxstate to save the fsave header. */
if (ia32_fxstate)
- copy_fxregs_to_kernel(&tsk->thread.fpu);
+ copy_fxregs_to_kernel(fpu);
} else {
/*
* It is a *bug* if kernel uses compacted-format for xsave
@@ -189,7 +190,7 @@ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size)
return -1;
}
- fpstate_sanitize_xstate(&tsk->thread.fpu);
+ fpstate_sanitize_xstate(fpu);
if (__copy_to_user(buf_fx, xsave, fpu_user_xstate_size))
return -1;
}
@@ -213,8 +214,11 @@ sanitize_restored_xstate(struct task_struct *tsk,
struct xstate_header *header = &xsave->header;
if (use_xsave()) {
- /* These bits must be zero. */
- memset(header->reserved, 0, 48);
+ /*
+ * Note: we don't need to zero the reserved bits in the
+ * xstate_header here because we either didn't copy them at all,
+ * or we checked earlier that they aren't set.
+ */
/*
* Init the state that is not present in the memory
@@ -223,7 +227,7 @@ sanitize_restored_xstate(struct task_struct *tsk,
if (fx_only)
header->xfeatures = XFEATURE_MASK_FPSSE;
else
- header->xfeatures &= (xfeatures_mask & xfeatures);
+ header->xfeatures &= xfeatures;
}
if (use_fxsr()) {
@@ -279,7 +283,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
if (!access_ok(VERIFY_READ, buf, size))
return -EACCES;
- fpu__activate_curr(fpu);
+ fpu__initialize(fpu);
if (!static_cpu_has(X86_FEATURE_FPU))
return fpregs_soft_set(current, NULL,
@@ -307,28 +311,29 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
/*
* For 32-bit frames with fxstate, copy the user state to the
* thread's fpu state, reconstruct fxstate from the fsave
- * header. Sanitize the copied state etc.
+ * header. Validate and sanitize the copied state.
*/
struct fpu *fpu = &tsk->thread.fpu;
struct user_i387_ia32_struct env;
int err = 0;
/*
- * Drop the current fpu which clears fpu->fpstate_active. This ensures
+ * Drop the current fpu which clears fpu->initialized. This ensures
* that any context-switch during the copy of the new state,
* avoids the intermediate state from getting restored/saved.
* Thus avoiding the new restored state from getting corrupted.
* We will be ready to restore/save the state only after
- * fpu->fpstate_active is again set.
+ * fpu->initialized is again set.
*/
fpu__drop(fpu);
if (using_compacted_format()) {
- err = copyin_to_xsaves(NULL, buf_fx,
- &fpu->state.xsave);
+ err = copy_user_to_xstate(&fpu->state.xsave, buf_fx);
} else {
- err = __copy_from_user(&fpu->state.xsave,
- buf_fx, state_size);
+ err = __copy_from_user(&fpu->state.xsave, buf_fx, state_size);
+
+ if (!err && state_size > offsetof(struct xregs_state, header))
+ err = validate_xstate_header(&fpu->state.xsave.header);
}
if (err || __copy_from_user(&env, buf, sizeof(env))) {
@@ -339,7 +344,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
sanitize_restored_xstate(tsk, &env, xfeatures, fx_only);
}
- fpu->fpstate_active = 1;
+ fpu->initialized = 1;
preempt_disable();
fpu__restore(fpu);
preempt_enable();
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index c24ac1efb12d..f1d5476c9022 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -483,6 +483,30 @@ int using_compacted_format(void)
return boot_cpu_has(X86_FEATURE_XSAVES);
}
+/* Validate an xstate header supplied by userspace (ptrace or sigreturn) */
+int validate_xstate_header(const struct xstate_header *hdr)
+{
+ /* No unknown or supervisor features may be set */
+ if (hdr->xfeatures & (~xfeatures_mask | XFEATURE_MASK_SUPERVISOR))
+ return -EINVAL;
+
+ /* Userspace must use the uncompacted format */
+ if (hdr->xcomp_bv)
+ return -EINVAL;
+
+ /*
+ * If 'reserved' is shrunken to add a new field, make sure to validate
+ * that new field here!
+ */
+ BUILD_BUG_ON(sizeof(hdr->reserved) != 48);
+
+ /* No reserved bits may be set */
+ if (memchr_inv(hdr->reserved, 0, sizeof(hdr->reserved)))
+ return -EINVAL;
+
+ return 0;
+}
+
static void __xstate_dump_leaves(void)
{
int i;
@@ -867,7 +891,7 @@ const void *get_xsave_field_ptr(int xsave_state)
{
struct fpu *fpu = &current->thread.fpu;
- if (!fpu->fpstate_active)
+ if (!fpu->initialized)
return NULL;
/*
* fpu__save() takes the CPU's xstate registers
@@ -921,38 +945,129 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
#endif /* ! CONFIG_ARCH_HAS_PKEYS */
/*
+ * Weird legacy quirk: SSE and YMM states store information in the
+ * MXCSR and MXCSR_FLAGS fields of the FP area. That means if the FP
+ * area is marked as unused in the xfeatures header, we need to copy
+ * MXCSR and MXCSR_FLAGS if either SSE or YMM are in use.
+ */
+static inline bool xfeatures_mxcsr_quirk(u64 xfeatures)
+{
+ if (!(xfeatures & (XFEATURE_MASK_SSE|XFEATURE_MASK_YMM)))
+ return false;
+
+ if (xfeatures & XFEATURE_MASK_FP)
+ return false;
+
+ return true;
+}
+
+/*
* This is similar to user_regset_copyout(), but will not add offset to
* the source data pointer or increment pos, count, kbuf, and ubuf.
*/
-static inline int xstate_copyout(unsigned int pos, unsigned int count,
- void *kbuf, void __user *ubuf,
- const void *data, const int start_pos,
- const int end_pos)
+static inline void
+__copy_xstate_to_kernel(void *kbuf, const void *data,
+ unsigned int offset, unsigned int size, unsigned int size_total)
{
- if ((count == 0) || (pos < start_pos))
- return 0;
+ if (offset < size_total) {
+ unsigned int copy = min(size, size_total - offset);
- if (end_pos < 0 || pos < end_pos) {
- unsigned int copy = (end_pos < 0 ? count : min(count, end_pos - pos));
+ memcpy(kbuf + offset, data, copy);
+ }
+}
- if (kbuf) {
- memcpy(kbuf + pos, data, copy);
- } else {
- if (__copy_to_user(ubuf + pos, data, copy))
- return -EFAULT;
+/*
+ * Convert from kernel XSAVES compacted format to standard format and copy
+ * to a kernel-space ptrace buffer.
+ *
+ * It supports partial copy but pos always starts from zero. This is called
+ * from xstateregs_get() and there we check the CPU has XSAVES.
+ */
+int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int offset_start, unsigned int size_total)
+{
+ unsigned int offset, size;
+ struct xstate_header header;
+ int i;
+
+ /*
+ * Currently copy_regset_to_user() starts from pos 0:
+ */
+ if (unlikely(offset_start != 0))
+ return -EFAULT;
+
+ /*
+ * The destination is a ptrace buffer; we put in only user xstates:
+ */
+ memset(&header, 0, sizeof(header));
+ header.xfeatures = xsave->header.xfeatures;
+ header.xfeatures &= ~XFEATURE_MASK_SUPERVISOR;
+
+ /*
+ * Copy xregs_state->header:
+ */
+ offset = offsetof(struct xregs_state, header);
+ size = sizeof(header);
+
+ __copy_xstate_to_kernel(kbuf, &header, offset, size, size_total);
+
+ for (i = 0; i < XFEATURE_MAX; i++) {
+ /*
+ * Copy only in-use xstates:
+ */
+ if ((header.xfeatures >> i) & 1) {
+ void *src = __raw_xsave_addr(xsave, 1 << i);
+
+ offset = xstate_offsets[i];
+ size = xstate_sizes[i];
+
+ /* The next component has to fit fully into the output buffer: */
+ if (offset + size > size_total)
+ break;
+
+ __copy_xstate_to_kernel(kbuf, src, offset, size, size_total);
}
+
+ }
+
+ if (xfeatures_mxcsr_quirk(header.xfeatures)) {
+ offset = offsetof(struct fxregs_state, mxcsr);
+ size = MXCSR_AND_FLAGS_SIZE;
+ __copy_xstate_to_kernel(kbuf, &xsave->i387.mxcsr, offset, size, size_total);
+ }
+
+ /*
+ * Fill xsave->i387.sw_reserved value for ptrace frame:
+ */
+ offset = offsetof(struct fxregs_state, sw_reserved);
+ size = sizeof(xstate_fx_sw_bytes);
+
+ __copy_xstate_to_kernel(kbuf, xstate_fx_sw_bytes, offset, size, size_total);
+
+ return 0;
+}
+
+static inline int
+__copy_xstate_to_user(void __user *ubuf, const void *data, unsigned int offset, unsigned int size, unsigned int size_total)
+{
+ if (!size)
+ return 0;
+
+ if (offset < size_total) {
+ unsigned int copy = min(size, size_total - offset);
+
+ if (__copy_to_user(ubuf + offset, data, copy))
+ return -EFAULT;
}
return 0;
}
/*
* Convert from kernel XSAVES compacted format to standard format and copy
- * to a ptrace buffer. It supports partial copy but pos always starts from
+ * to a user-space buffer. It supports partial copy but pos always starts from
* zero. This is called from xstateregs_get() and there we check the CPU
* has XSAVES.
*/
-int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
- void __user *ubuf, struct xregs_state *xsave)
+int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned int offset_start, unsigned int size_total)
{
unsigned int offset, size;
int ret, i;
@@ -961,7 +1076,7 @@ int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
/*
* Currently copy_regset_to_user() starts from pos 0:
*/
- if (unlikely(pos != 0))
+ if (unlikely(offset_start != 0))
return -EFAULT;
/*
@@ -977,8 +1092,7 @@ int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
offset = offsetof(struct xregs_state, header);
size = sizeof(header);
- ret = xstate_copyout(offset, size, kbuf, ubuf, &header, 0, count);
-
+ ret = __copy_xstate_to_user(ubuf, &header, offset, size, size_total);
if (ret)
return ret;
@@ -992,25 +1106,30 @@ int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
offset = xstate_offsets[i];
size = xstate_sizes[i];
- ret = xstate_copyout(offset, size, kbuf, ubuf, src, 0, count);
+ /* The next component has to fit fully into the output buffer: */
+ if (offset + size > size_total)
+ break;
+ ret = __copy_xstate_to_user(ubuf, src, offset, size, size_total);
if (ret)
return ret;
-
- if (offset + size >= count)
- break;
}
}
+ if (xfeatures_mxcsr_quirk(header.xfeatures)) {
+ offset = offsetof(struct fxregs_state, mxcsr);
+ size = MXCSR_AND_FLAGS_SIZE;
+ __copy_xstate_to_user(ubuf, &xsave->i387.mxcsr, offset, size, size_total);
+ }
+
/*
* Fill xsave->i387.sw_reserved value for ptrace frame:
*/
offset = offsetof(struct fxregs_state, sw_reserved);
size = sizeof(xstate_fx_sw_bytes);
- ret = xstate_copyout(offset, size, kbuf, ubuf, xstate_fx_sw_bytes, 0, count);
-
+ ret = __copy_xstate_to_user(ubuf, xstate_fx_sw_bytes, offset, size, size_total);
if (ret)
return ret;
@@ -1018,55 +1137,98 @@ int copyout_from_xsaves(unsigned int pos, unsigned int count, void *kbuf,
}
/*
- * Convert from a ptrace standard-format buffer to kernel XSAVES format
- * and copy to the target thread. This is called from xstateregs_set() and
- * there we check the CPU has XSAVES and a whole standard-sized buffer
- * exists.
+ * Convert from a ptrace standard-format kernel buffer to kernel XSAVES format
+ * and copy to the target thread. This is called from xstateregs_set().
*/
-int copyin_to_xsaves(const void *kbuf, const void __user *ubuf,
- struct xregs_state *xsave)
+int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf)
{
unsigned int offset, size;
int i;
- u64 xfeatures;
- u64 allowed_features;
+ struct xstate_header hdr;
offset = offsetof(struct xregs_state, header);
- size = sizeof(xfeatures);
+ size = sizeof(hdr);
- if (kbuf) {
- memcpy(&xfeatures, kbuf + offset, size);
- } else {
- if (__copy_from_user(&xfeatures, ubuf + offset, size))
- return -EFAULT;
+ memcpy(&hdr, kbuf + offset, size);
+
+ if (validate_xstate_header(&hdr))
+ return -EINVAL;
+
+ for (i = 0; i < XFEATURE_MAX; i++) {
+ u64 mask = ((u64)1 << i);
+
+ if (hdr.xfeatures & mask) {
+ void *dst = __raw_xsave_addr(xsave, 1 << i);
+
+ offset = xstate_offsets[i];
+ size = xstate_sizes[i];
+
+ memcpy(dst, kbuf + offset, size);
+ }
+ }
+
+ if (xfeatures_mxcsr_quirk(hdr.xfeatures)) {
+ offset = offsetof(struct fxregs_state, mxcsr);
+ size = MXCSR_AND_FLAGS_SIZE;
+ memcpy(&xsave->i387.mxcsr, kbuf + offset, size);
}
/*
- * Reject if the user sets any disabled or supervisor features:
+ * The state that came in from userspace was user-state only.
+ * Mask all the user states out of 'xfeatures':
+ */
+ xsave->header.xfeatures &= XFEATURE_MASK_SUPERVISOR;
+
+ /*
+ * Add back in the features that came in from userspace:
*/
- allowed_features = xfeatures_mask & ~XFEATURE_MASK_SUPERVISOR;
+ xsave->header.xfeatures |= hdr.xfeatures;
- if (xfeatures & ~allowed_features)
+ return 0;
+}
+
+/*
+ * Convert from a ptrace or sigreturn standard-format user-space buffer to
+ * kernel XSAVES format and copy to the target thread. This is called from
+ * xstateregs_set(), as well as potentially from the sigreturn() and
+ * rt_sigreturn() system calls.
+ */
+int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf)
+{
+ unsigned int offset, size;
+ int i;
+ struct xstate_header hdr;
+
+ offset = offsetof(struct xregs_state, header);
+ size = sizeof(hdr);
+
+ if (__copy_from_user(&hdr, ubuf + offset, size))
+ return -EFAULT;
+
+ if (validate_xstate_header(&hdr))
return -EINVAL;
for (i = 0; i < XFEATURE_MAX; i++) {
u64 mask = ((u64)1 << i);
- if (xfeatures & mask) {
+ if (hdr.xfeatures & mask) {
void *dst = __raw_xsave_addr(xsave, 1 << i);
offset = xstate_offsets[i];
size = xstate_sizes[i];
- if (kbuf) {
- memcpy(dst, kbuf + offset, size);
- } else {
- if (__copy_from_user(dst, ubuf + offset, size))
- return -EFAULT;
- }
+ if (__copy_from_user(dst, ubuf + offset, size))
+ return -EFAULT;
}
}
+ if (xfeatures_mxcsr_quirk(hdr.xfeatures)) {
+ offset = offsetof(struct fxregs_state, mxcsr);
+ size = MXCSR_AND_FLAGS_SIZE;
+ if (__copy_from_user(&xsave->i387.mxcsr, ubuf + offset, size))
+ return -EFAULT;
+ }
+
/*
* The state that came in from userspace was user-state only.
* Mask all the user states out of 'xfeatures':
@@ -1076,7 +1238,7 @@ int copyin_to_xsaves(const void *kbuf, const void __user *ubuf,
/*
* Add back in the features that came in from userspace:
*/
- xsave->header.xfeatures |= xfeatures;
+ xsave->header.xfeatures |= hdr.xfeatures;
return 0;
}
diff --git a/arch/x86/kernel/io_delay.c b/arch/x86/kernel/io_delay.c
index 50c89e8a95f2..7ebcc4a74438 100644
--- a/arch/x86/kernel/io_delay.c
+++ b/arch/x86/kernel/io_delay.c
@@ -58,7 +58,7 @@ static int __init dmi_io_delay_0xed_port(const struct dmi_system_id *id)
* Quirk table for systems that misbehave (lock up, etc.) if port
* 0x80 is used:
*/
-static struct dmi_system_id __initdata io_delay_0xed_port_dmi_table[] = {
+static const struct dmi_system_id io_delay_0xed_port_dmi_table[] __initconst = {
{
.callback = dmi_io_delay_0xed_port,
.ident = "Compaq Presario V6000",
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
index 1f38d9a4d9de..d4eb450144fd 100644
--- a/arch/x86/kernel/irq_32.c
+++ b/arch/x86/kernel/irq_32.c
@@ -64,7 +64,7 @@ static void call_on_stack(void *func, void *stack)
static inline void *current_stack(void)
{
- return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
+ return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1));
}
static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc)
@@ -88,7 +88,7 @@ static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc)
/* Save the next esp at the bottom of the stack */
prev_esp = (u32 *)irqstk;
- *prev_esp = current_stack_pointer();
+ *prev_esp = current_stack_pointer;
if (unlikely(overflow))
call_on_stack(print_stack_overflow, isp);
@@ -139,7 +139,7 @@ void do_softirq_own_stack(void)
/* Push the previous esp onto the stack */
prev_esp = (u32 *)irqstk;
- *prev_esp = current_stack_pointer();
+ *prev_esp = current_stack_pointer;
call_on_stack(__do_softirq, isp);
}
diff --git a/arch/x86/kernel/ksysfs.c b/arch/x86/kernel/ksysfs.c
index 4b0592ca9e47..8c1cc08f514f 100644
--- a/arch/x86/kernel/ksysfs.c
+++ b/arch/x86/kernel/ksysfs.c
@@ -299,7 +299,7 @@ static int __init create_setup_data_nodes(struct kobject *parent)
return 0;
out_clean_nodes:
- for (j = i - 1; j > 0; j--)
+ for (j = i - 1; j >= 0; j--)
cleanup_setup_data_node(*(kobjp + j));
kfree(kobjp);
out_setup_data_kobj:
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 874827b0d7ca..e675704fa6f7 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -140,7 +140,8 @@ void kvm_async_pf_task_wait(u32 token)
n.token = token;
n.cpu = smp_processor_id();
- n.halted = is_idle_task(current) || preempt_count() > 1;
+ n.halted = is_idle_task(current) || preempt_count() > 1 ||
+ rcu_preempt_depth();
init_swait_queue_head(&n.wq);
hlist_add_head(&n.link, &b->list);
raw_spin_unlock(&b->lock);
@@ -180,7 +181,7 @@ static void apf_task_wake_one(struct kvm_task_sleep_node *n)
hlist_del_init(&n->link);
if (n->halted)
smp_send_reschedule(n->cpu);
- else if (swait_active(&n->wq))
+ else if (swq_has_sleeper(&n->wq))
swake_up(&n->wq);
}
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index a14df9eecfed..19a3e8f961c7 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -327,7 +327,6 @@ __visible struct pv_cpu_ops pv_cpu_ops = {
.set_debugreg = native_set_debugreg,
.read_cr0 = native_read_cr0,
.write_cr0 = native_write_cr0,
- .read_cr4 = native_read_cr4,
.write_cr4 = native_write_cr4,
#ifdef CONFIG_X86_64
.read_cr8 = native_read_cr8,
@@ -343,7 +342,6 @@ __visible struct pv_cpu_ops pv_cpu_ops = {
.set_ldt = native_set_ldt,
.load_gdt = native_load_gdt,
.load_idt = native_load_idt,
- .store_idt = native_store_idt,
.store_tr = native_store_tr,
.load_tls = native_load_tls,
#ifdef CONFIG_X86_64
@@ -411,8 +409,6 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_init = {
.set_pte = native_set_pte,
.set_pte_at = native_set_pte_at,
.set_pmd = native_set_pmd,
- .set_pmd_at = native_set_pmd_at,
- .pte_update = paravirt_nop,
.ptep_modify_prot_start = __ptep_modify_prot_start,
.ptep_modify_prot_commit = __ptep_modify_prot_commit,
@@ -424,7 +420,6 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_init = {
.pmd_clear = native_pmd_clear,
#endif
.set_pud = native_set_pud,
- .set_pud_at = native_set_pud_at,
.pmd_val = PTE_IDENT,
.make_pmd = PTE_IDENT,
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 54984b142641..54180fa6f66f 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -150,7 +150,7 @@ static int __init set_kbd_reboot(const struct dmi_system_id *d)
/*
* This is a single dmi_table handling all reboot quirks.
*/
-static struct dmi_system_id __initdata reboot_dmi_table[] = {
+static const struct dmi_system_id reboot_dmi_table[] __initconst = {
/* Acer */
{ /* Handle reboot issue on Acer Aspire one */
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index d84afb0a322d..0957dd73d127 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1178,8 +1178,11 @@ void __init setup_arch(char **cmdline_p)
* with the current CR4 value. This may not be necessary, but
* auditing all the early-boot CR4 manipulation would be needed to
* rule it out.
+ *
+ * Mask off features that don't work outside long mode (just
+ * PCIDE for now).
*/
- mmu_cr4_features = __read_cr4();
+ mmu_cr4_features = __read_cr4() & ~X86_CR4_PCIDE;
memblock_set_current_limit(get_max_mapped());
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index e04442345fc0..4e188fda5961 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -263,7 +263,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
sp = (unsigned long) ka->sa.sa_restorer;
}
- if (fpu->fpstate_active) {
+ if (fpu->initialized) {
sp = fpu__alloc_mathframe(sp, IS_ENABLED(CONFIG_X86_32),
&buf_fx, &math_size);
*fpstate = (void __user *)sp;
@@ -279,7 +279,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
return (void __user *)-1L;
/* save i387 and extended state */
- if (fpu->fpstate_active &&
+ if (fpu->initialized &&
copy_fpstate_to_sigframe(*fpstate, (void __user *)buf_fx, math_size) < 0)
return (void __user *)-1L;
@@ -755,7 +755,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
/*
* Ensure the signal handler starts with the new fpu state.
*/
- if (fpu->fpstate_active)
+ if (fpu->initialized)
fpu__clear(fpu);
}
signal_setup_done(failed, ksig, stepping);
diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c
index 71beb28600d4..ab9feb5887b1 100644
--- a/arch/x86/kernel/signal_compat.c
+++ b/arch/x86/kernel/signal_compat.c
@@ -129,7 +129,7 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
3 ints plus the relevant union member. */
put_user_ex(from->si_signo, &to->si_signo);
put_user_ex(from->si_errno, &to->si_errno);
- put_user_ex((short)from->si_code, &to->si_code);
+ put_user_ex(from->si_code, &to->si_code);
if (from->si_code < 0) {
put_user_ex(from->si_pid, &to->si_pid);
@@ -142,8 +142,8 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
*/
put_user_ex(from->_sifields._pad[0],
&to->_sifields._pad[0]);
- switch (from->si_code >> 16) {
- case __SI_FAULT >> 16:
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_FAULT:
if (from->si_signo == SIGBUS &&
(from->si_code == BUS_MCEERR_AR ||
from->si_code == BUS_MCEERR_AO))
@@ -160,11 +160,11 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
put_user_ex(from->si_pkey, &to->si_pkey);
}
break;
- case __SI_SYS >> 16:
+ case SIL_SYS:
put_user_ex(from->si_syscall, &to->si_syscall);
put_user_ex(from->si_arch, &to->si_arch);
break;
- case __SI_CHLD >> 16:
+ case SIL_CHLD:
if (!x32_ABI) {
put_user_ex(from->si_utime, &to->si_utime);
put_user_ex(from->si_stime, &to->si_stime);
@@ -174,21 +174,18 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
}
put_user_ex(from->si_status, &to->si_status);
/* FALL THROUGH */
- default:
- case __SI_KILL >> 16:
+ case SIL_KILL:
put_user_ex(from->si_uid, &to->si_uid);
break;
- case __SI_POLL >> 16:
+ case SIL_POLL:
put_user_ex(from->si_fd, &to->si_fd);
break;
- case __SI_TIMER >> 16:
+ case SIL_TIMER:
put_user_ex(from->si_overrun, &to->si_overrun);
put_user_ex(ptr_to_compat(from->si_ptr),
&to->si_ptr);
break;
- /* This is not generated by the kernel as of now. */
- case __SI_RT >> 16:
- case __SI_MESGQ >> 16:
+ case SIL_RT:
put_user_ex(from->si_uid, &to->si_uid);
put_user_ex(from->si_int, &to->si_int);
break;
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index cd6622c3204e..ad59edd84de7 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -226,16 +226,12 @@ static int enable_start_cpu0;
static void notrace start_secondary(void *unused)
{
/*
- * Don't put *anything* before cpu_init(), SMP booting is too
- * fragile that we want to limit the things done here to the
- * most necessary things.
+ * Don't put *anything* except direct CPU state initialization
+ * before cpu_init(), SMP booting is too fragile that we want to
+ * limit the things done here to the most necessary things.
*/
- cpu_init();
- x86_cpuinit.early_percpu_clock_init();
- preempt_disable();
- smp_callin();
-
- enable_start_cpu0 = 0;
+ if (boot_cpu_has(X86_FEATURE_PCID))
+ __write_cr4(__read_cr4() | X86_CR4_PCIDE);
#ifdef CONFIG_X86_32
/* switch away from the initial page table */
@@ -243,6 +239,13 @@ static void notrace start_secondary(void *unused)
__flush_tlb_all();
#endif
+ cpu_init();
+ x86_cpuinit.early_percpu_clock_init();
+ preempt_disable();
+ smp_callin();
+
+ enable_start_cpu0 = 0;
+
/* otherwise gcc will move up smp_processor_id before the cpu_init */
barrier();
/*
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 34ea3651362e..67db4f43309e 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -142,7 +142,7 @@ void ist_begin_non_atomic(struct pt_regs *regs)
* from double_fault.
*/
BUG_ON((unsigned long)(current_top_of_stack() -
- current_stack_pointer()) >= THREAD_SIZE);
+ current_stack_pointer) >= THREAD_SIZE);
preempt_enable_no_resched();
}
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 1ea3c0e1e3a9..0bc5c1315708 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -59,7 +59,6 @@ static __always_inline struct cpuid_reg x86_feature_cpuid(unsigned x86_feature)
{
unsigned x86_leaf = x86_feature / 32;
- BUILD_BUG_ON(!__builtin_constant_p(x86_leaf));
BUILD_BUG_ON(x86_leaf >= ARRAY_SIZE(reverse_cpuid));
BUILD_BUG_ON(reverse_cpuid[x86_leaf].function == 0);
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 16bf6655aa85..a36254cbf776 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -4102,10 +4102,12 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
if (efer & EFER_LMA) {
u64 maxphyaddr;
- u32 eax = 0x80000008;
+ u32 eax, ebx, ecx, edx;
- if (ctxt->ops->get_cpuid(ctxt, &eax, NULL, NULL,
- NULL, false))
+ eax = 0x80000008;
+ ecx = 0;
+ if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx,
+ &edx, false))
maxphyaddr = eax & 0xff;
else
maxphyaddr = 36;
@@ -5296,7 +5298,6 @@ static void fetch_possible_mmx_operand(struct x86_emulate_ctxt *ctxt,
static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
{
- register void *__sp asm(_ASM_SP);
ulong flags = (ctxt->eflags & EFLAGS_MASK) | X86_EFLAGS_IF;
if (!(ctxt->d & ByteOp))
@@ -5304,7 +5305,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
asm("push %[flags]; popf; call *%[fastop]; pushf; pop %[flags]\n"
: "+a"(ctxt->dst.val), "+d"(ctxt->src.val), [flags]"+D"(flags),
- [fastop]"+S"(fop), "+r"(__sp)
+ [fastop]"+S"(fop), ASM_CALL_CONSTRAINT
: "c"(ctxt->src2.val));
ctxt->eflags = (ctxt->eflags & ~EFLAGS_MASK) | (flags & EFLAGS_MASK);
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index aaf10b6f5380..69c5612be786 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -1324,6 +1324,10 @@ static void apic_timer_expired(struct kvm_lapic *apic)
atomic_inc(&apic->lapic_timer.pending);
kvm_set_pending_timer(vcpu);
+ /*
+ * For x86, the atomic_inc() is serialized, thus
+ * using swait_active() is safe.
+ */
if (swait_active(q))
swake_up(q);
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 2c1cfe68a9af..0e68f0b3cbf7 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1200,7 +1200,6 @@ static void avic_init_vmcb(struct vcpu_svm *svm)
vmcb->control.avic_physical_id = ppa & AVIC_HPA_MASK;
vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID_COUNT;
vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
- svm->vcpu.arch.apicv_active = true;
}
static void init_vmcb(struct vcpu_svm *svm)
@@ -1316,7 +1315,7 @@ static void init_vmcb(struct vcpu_svm *svm)
set_intercept(svm, INTERCEPT_PAUSE);
}
- if (avic)
+ if (kvm_vcpu_apicv_active(&svm->vcpu))
avic_init_vmcb(svm);
/*
@@ -1600,6 +1599,23 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
avic_update_vapic_bar(svm, APIC_DEFAULT_PHYS_BASE);
}
+static int avic_init_vcpu(struct vcpu_svm *svm)
+{
+ int ret;
+
+ if (!kvm_vcpu_apicv_active(&svm->vcpu))
+ return 0;
+
+ ret = avic_init_backing_page(&svm->vcpu);
+ if (ret)
+ return ret;
+
+ INIT_LIST_HEAD(&svm->ir_list);
+ spin_lock_init(&svm->ir_list_lock);
+
+ return ret;
+}
+
static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
{
struct vcpu_svm *svm;
@@ -1636,14 +1652,9 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
if (!hsave_page)
goto free_page3;
- if (avic) {
- err = avic_init_backing_page(&svm->vcpu);
- if (err)
- goto free_page4;
-
- INIT_LIST_HEAD(&svm->ir_list);
- spin_lock_init(&svm->ir_list_lock);
- }
+ err = avic_init_vcpu(svm);
+ if (err)
+ goto free_page4;
/* We initialize this flag to true to make sure that the is_running
* bit would be set the first time the vcpu is loaded.
@@ -4395,9 +4406,9 @@ static void svm_set_virtual_x2apic_mode(struct kvm_vcpu *vcpu, bool set)
return;
}
-static bool svm_get_enable_apicv(void)
+static bool svm_get_enable_apicv(struct kvm_vcpu *vcpu)
{
- return avic;
+ return avic && irqchip_split(vcpu->kvm);
}
static void svm_hwapic_irr_update(struct kvm_vcpu *vcpu, int max_irr)
@@ -4414,7 +4425,7 @@ static void svm_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
struct vcpu_svm *svm = to_svm(vcpu);
struct vmcb *vmcb = svm->vmcb;
- if (!avic)
+ if (!kvm_vcpu_apicv_active(&svm->vcpu))
return;
vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK;
@@ -5302,6 +5313,7 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
*/
if (info->rep_prefix != REPE_PREFIX)
goto out;
+ break;
case SVM_EXIT_IOIO: {
u64 exit_info;
u32 bytes;
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 4253adef9044..a2b804e10c95 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -200,6 +200,8 @@ struct loaded_vmcs {
int cpu;
bool launched;
bool nmi_known_unmasked;
+ unsigned long vmcs_host_cr3; /* May not match real cr3 */
+ unsigned long vmcs_host_cr4; /* May not match real cr4 */
struct list_head loaded_vmcss_on_cpu_link;
};
@@ -600,8 +602,6 @@ struct vcpu_vmx {
int gs_ldt_reload_needed;
int fs_reload_needed;
u64 msr_host_bndcfgs;
- unsigned long vmcs_host_cr3; /* May not match real cr3 */
- unsigned long vmcs_host_cr4; /* May not match real cr4 */
} host_state;
struct {
int vm86_active;
@@ -2202,46 +2202,44 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)
struct pi_desc old, new;
unsigned int dest;
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
- !irq_remapping_cap(IRQ_POSTING_CAP) ||
- !kvm_vcpu_apicv_active(vcpu))
+ /*
+ * In case of hot-plug or hot-unplug, we may have to undo
+ * vmx_vcpu_pi_put even if there is no assigned device. And we
+ * always keep PI.NDST up to date for simplicity: it makes the
+ * code easier, and CPU migration is not a fast path.
+ */
+ if (!pi_test_sn(pi_desc) && vcpu->cpu == cpu)
return;
+ /*
+ * First handle the simple case where no cmpxchg is necessary; just
+ * allow posting non-urgent interrupts.
+ *
+ * If the 'nv' field is POSTED_INTR_WAKEUP_VECTOR, do not change
+ * PI.NDST: pi_post_block will do it for us and the wakeup_handler
+ * expects the VCPU to be on the blocked_vcpu_list that matches
+ * PI.NDST.
+ */
+ if (pi_desc->nv == POSTED_INTR_WAKEUP_VECTOR ||
+ vcpu->cpu == cpu) {
+ pi_clear_sn(pi_desc);
+ return;
+ }
+
+ /* The full case. */
do {
old.control = new.control = pi_desc->control;
- /*
- * If 'nv' field is POSTED_INTR_WAKEUP_VECTOR, there
- * are two possible cases:
- * 1. After running 'pre_block', context switch
- * happened. For this case, 'sn' was set in
- * vmx_vcpu_put(), so we need to clear it here.
- * 2. After running 'pre_block', we were blocked,
- * and woken up by some other guy. For this case,
- * we don't need to do anything, 'pi_post_block'
- * will do everything for us. However, we cannot
- * check whether it is case #1 or case #2 here
- * (maybe, not needed), so we also clear sn here,
- * I think it is not a big deal.
- */
- if (pi_desc->nv != POSTED_INTR_WAKEUP_VECTOR) {
- if (vcpu->cpu != cpu) {
- dest = cpu_physical_id(cpu);
-
- if (x2apic_enabled())
- new.ndst = dest;
- else
- new.ndst = (dest << 8) & 0xFF00;
- }
+ dest = cpu_physical_id(cpu);
- /* set 'NV' to 'notification vector' */
- new.nv = POSTED_INTR_VECTOR;
- }
+ if (x2apic_enabled())
+ new.ndst = dest;
+ else
+ new.ndst = (dest << 8) & 0xFF00;
- /* Allow posting non-urgent interrupts */
new.sn = 0;
- } while (cmpxchg(&pi_desc->control, old.control,
- new.control) != old.control);
+ } while (cmpxchg64(&pi_desc->control, old.control,
+ new.control) != old.control);
}
static void decache_tsc_multiplier(struct vcpu_vmx *vmx)
@@ -5012,7 +5010,7 @@ static void vmx_disable_intercept_msr_x2apic(u32 msr, int type, bool apicv_activ
}
}
-static bool vmx_get_enable_apicv(void)
+static bool vmx_get_enable_apicv(struct kvm_vcpu *vcpu)
{
return enable_apicv;
}
@@ -5077,21 +5075,30 @@ static inline bool kvm_vcpu_trigger_posted_interrupt(struct kvm_vcpu *vcpu,
int pi_vec = nested ? POSTED_INTR_NESTED_VECTOR : POSTED_INTR_VECTOR;
if (vcpu->mode == IN_GUEST_MODE) {
- struct vcpu_vmx *vmx = to_vmx(vcpu);
-
/*
- * Currently, we don't support urgent interrupt,
- * all interrupts are recognized as non-urgent
- * interrupt, so we cannot post interrupts when
- * 'SN' is set.
+ * The vector of interrupt to be delivered to vcpu had
+ * been set in PIR before this function.
*
- * If the vcpu is in guest mode, it means it is
- * running instead of being scheduled out and
- * waiting in the run queue, and that's the only
- * case when 'SN' is set currently, warning if
- * 'SN' is set.
+ * Following cases will be reached in this block, and
+ * we always send a notification event in all cases as
+ * explained below.
+ *
+ * Case 1: vcpu keeps in non-root mode. Sending a
+ * notification event posts the interrupt to vcpu.
+ *
+ * Case 2: vcpu exits to root mode and is still
+ * runnable. PIR will be synced to vIRR before the
+ * next vcpu entry. Sending a notification event in
+ * this case has no effect, as vcpu is not in root
+ * mode.
+ *
+ * Case 3: vcpu exits to root mode and is blocked.
+ * vcpu_block() has already synced PIR to vIRR and
+ * never blocks vcpu if vIRR is not cleared. Therefore,
+ * a blocked vcpu here does not wait for any requested
+ * interrupts in PIR, and sending a notification event
+ * which has no effect is safe here.
*/
- WARN_ON_ONCE(pi_test_sn(&vmx->pi_desc));
apic->send_IPI_mask(get_cpu_mask(vcpu->cpu), pi_vec);
return true;
@@ -5169,12 +5176,12 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
*/
cr3 = __read_cr3();
vmcs_writel(HOST_CR3, cr3); /* 22.2.3 FIXME: shadow tables */
- vmx->host_state.vmcs_host_cr3 = cr3;
+ vmx->loaded_vmcs->vmcs_host_cr3 = cr3;
/* Save the most likely value for this task's CR4 in the VMCS. */
cr4 = cr4_read_shadow();
vmcs_writel(HOST_CR4, cr4); /* 22.2.3, 22.2.5 */
- vmx->host_state.vmcs_host_cr4 = cr4;
+ vmx->loaded_vmcs->vmcs_host_cr4 = cr4;
vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */
#ifdef CONFIG_X86_64
@@ -5192,7 +5199,7 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
vmcs_write16(HOST_SS_SELECTOR, __KERNEL_DS); /* 22.2.4 */
vmcs_write16(HOST_TR_SELECTOR, GDT_ENTRY_TSS*8); /* 22.2.4 */
- native_store_idt(&dt);
+ store_idt(&dt);
vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */
vmx->host_idt_base = dt.address;
@@ -8344,12 +8351,14 @@ static bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
struct vcpu_vmx *vmx = to_vmx(vcpu);
struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
- trace_kvm_nested_vmexit(kvm_rip_read(vcpu), exit_reason,
- vmcs_readl(EXIT_QUALIFICATION),
- vmx->idt_vectoring_info,
- intr_info,
- vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
- KVM_ISA_VMX);
+ if (vmx->nested.nested_run_pending)
+ return false;
+
+ if (unlikely(vmx->fail)) {
+ pr_info_ratelimited("%s failed vm entry %x\n", __func__,
+ vmcs_read32(VM_INSTRUCTION_ERROR));
+ return true;
+ }
/*
* The host physical addresses of some pages of guest memory
@@ -8363,14 +8372,12 @@ static bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
*/
nested_mark_vmcs12_pages_dirty(vcpu);
- if (vmx->nested.nested_run_pending)
- return false;
-
- if (unlikely(vmx->fail)) {
- pr_info_ratelimited("%s failed vm entry %x\n", __func__,
- vmcs_read32(VM_INSTRUCTION_ERROR));
- return true;
- }
+ trace_kvm_nested_vmexit(kvm_rip_read(vcpu), exit_reason,
+ vmcs_readl(EXIT_QUALIFICATION),
+ vmx->idt_vectoring_info,
+ intr_info,
+ vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
+ KVM_ISA_VMX);
switch (exit_reason) {
case EXIT_REASON_EXCEPTION_NMI:
@@ -9036,7 +9043,6 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx)
static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
{
u32 exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
- register void *__sp asm(_ASM_SP);
if ((exit_intr_info & (INTR_INFO_VALID_MASK | INTR_INFO_INTR_TYPE_MASK))
== (INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR)) {
@@ -9065,7 +9071,7 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
#ifdef CONFIG_X86_64
[sp]"=&r"(tmp),
#endif
- "+r"(__sp)
+ ASM_CALL_CONSTRAINT
:
[entry]"r"(entry),
[ss]"i"(__KERNEL_DS),
@@ -9265,15 +9271,15 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
vmcs_writel(GUEST_RIP, vcpu->arch.regs[VCPU_REGS_RIP]);
cr3 = __get_current_cr3_fast();
- if (unlikely(cr3 != vmx->host_state.vmcs_host_cr3)) {
+ if (unlikely(cr3 != vmx->loaded_vmcs->vmcs_host_cr3)) {
vmcs_writel(HOST_CR3, cr3);
- vmx->host_state.vmcs_host_cr3 = cr3;
+ vmx->loaded_vmcs->vmcs_host_cr3 = cr3;
}
cr4 = cr4_read_shadow();
- if (unlikely(cr4 != vmx->host_state.vmcs_host_cr4)) {
+ if (unlikely(cr4 != vmx->loaded_vmcs->vmcs_host_cr4)) {
vmcs_writel(HOST_CR4, cr4);
- vmx->host_state.vmcs_host_cr4 = cr4;
+ vmx->loaded_vmcs->vmcs_host_cr4 = cr4;
}
/* When single-stepping over STI and MOV SS, we must clear the
@@ -9424,12 +9430,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
| (1 << VCPU_EXREG_CR3));
vcpu->arch.regs_dirty = 0;
- vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD);
-
- vmx->loaded_vmcs->launched = 1;
-
- vmx->exit_reason = vmcs_read32(VM_EXIT_REASON);
-
/*
* eager fpu is enabled if PKEY is supported and CR4 is switched
* back on host, so it is safe to read guest PKRU from current
@@ -9451,6 +9451,14 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
kvm_make_request(KVM_REQ_EVENT, vcpu);
vmx->nested.nested_run_pending = 0;
+ vmx->idt_vectoring_info = 0;
+
+ vmx->exit_reason = vmx->fail ? 0xdead : vmcs_read32(VM_EXIT_REASON);
+ if (vmx->fail || (vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY))
+ return;
+
+ vmx->loaded_vmcs->launched = 1;
+ vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD);
vmx_complete_atomic_exit(vmx);
vmx_recover_nmi_blocking(vmx);
@@ -9581,6 +9589,13 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
vmx->msr_ia32_feature_control_valid_bits = FEATURE_CONTROL_LOCKED;
+ /*
+ * Enforce invariant: pi_desc.nv is always either POSTED_INTR_VECTOR
+ * or POSTED_INTR_WAKEUP_VECTOR.
+ */
+ vmx->pi_desc.nv = POSTED_INTR_VECTOR;
+ vmx->pi_desc.sn = 1;
+
return &vmx->vcpu;
free_vmcs:
@@ -9829,7 +9844,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
WARN_ON(!is_guest_mode(vcpu));
- if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
+ if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
+ !to_vmx(vcpu)->nested.nested_run_pending) {
vmcs12->vm_exit_intr_error_code = fault->error_code;
nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
@@ -10525,6 +10541,11 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
if (exec_control & CPU_BASED_TPR_SHADOW) {
vmcs_write64(VIRTUAL_APIC_PAGE_ADDR, -1ull);
vmcs_write32(TPR_THRESHOLD, vmcs12->tpr_threshold);
+ } else {
+#ifdef CONFIG_X86_64
+ exec_control |= CPU_BASED_CR8_LOAD_EXITING |
+ CPU_BASED_CR8_STORE_EXITING;
+#endif
}
/*
@@ -11388,46 +11409,30 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
{
struct vcpu_vmx *vmx = to_vmx(vcpu);
struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
- u32 vm_inst_error = 0;
/* trying to cancel vmlaunch/vmresume is a bug */
WARN_ON_ONCE(vmx->nested.nested_run_pending);
+ /*
+ * The only expected VM-instruction error is "VM entry with
+ * invalid control field(s)." Anything else indicates a
+ * problem with L0.
+ */
+ WARN_ON_ONCE(vmx->fail && (vmcs_read32(VM_INSTRUCTION_ERROR) !=
+ VMXERR_ENTRY_INVALID_CONTROL_FIELD));
+
leave_guest_mode(vcpu);
- prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info,
- exit_qualification);
- if (nested_vmx_store_msr(vcpu, vmcs12->vm_exit_msr_store_addr,
- vmcs12->vm_exit_msr_store_count))
- nested_vmx_abort(vcpu, VMX_ABORT_SAVE_GUEST_MSR_FAIL);
+ if (likely(!vmx->fail)) {
+ prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info,
+ exit_qualification);
- if (unlikely(vmx->fail))
- vm_inst_error = vmcs_read32(VM_INSTRUCTION_ERROR);
+ if (nested_vmx_store_msr(vcpu, vmcs12->vm_exit_msr_store_addr,
+ vmcs12->vm_exit_msr_store_count))
+ nested_vmx_abort(vcpu, VMX_ABORT_SAVE_GUEST_MSR_FAIL);
+ }
vmx_switch_vmcs(vcpu, &vmx->vmcs01);
-
- /*
- * TODO: SDM says that with acknowledge interrupt on exit, bit 31 of
- * the VM-exit interrupt information (valid interrupt) is always set to
- * 1 on EXIT_REASON_EXTERNAL_INTERRUPT, so we shouldn't need
- * kvm_cpu_has_interrupt(). See the commit message for details.
- */
- if (nested_exit_intr_ack_set(vcpu) &&
- exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT &&
- kvm_cpu_has_interrupt(vcpu)) {
- int irq = kvm_cpu_get_interrupt(vcpu);
- WARN_ON(irq < 0);
- vmcs12->vm_exit_intr_info = irq |
- INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR;
- }
-
- trace_kvm_nested_vmexit_inject(vmcs12->vm_exit_reason,
- vmcs12->exit_qualification,
- vmcs12->idt_vectoring_info_field,
- vmcs12->vm_exit_intr_info,
- vmcs12->vm_exit_intr_error_code,
- KVM_ISA_VMX);
-
vm_entry_controls_reset_shadow(vmx);
vm_exit_controls_reset_shadow(vmx);
vmx_segment_cache_clear(vmx);
@@ -11436,8 +11441,6 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
if (VMCS02_POOL_SIZE == 0)
nested_free_vmcs02(vmx, vmx->nested.current_vmptr);
- load_vmcs12_host_state(vcpu, vmcs12);
-
/* Update any VMCS fields that might have changed while L2 ran */
vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, vmx->msr_autoload.nr);
vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, vmx->msr_autoload.nr);
@@ -11486,21 +11489,57 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
*/
kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu);
- /*
- * Exiting from L2 to L1, we're now back to L1 which thinks it just
- * finished a VMLAUNCH or VMRESUME instruction, so we need to set the
- * success or failure flag accordingly.
- */
- if (unlikely(vmx->fail)) {
- vmx->fail = 0;
- nested_vmx_failValid(vcpu, vm_inst_error);
- } else
- nested_vmx_succeed(vcpu);
if (enable_shadow_vmcs)
vmx->nested.sync_shadow_vmcs = true;
/* in case we halted in L2 */
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
+
+ if (likely(!vmx->fail)) {
+ /*
+ * TODO: SDM says that with acknowledge interrupt on
+ * exit, bit 31 of the VM-exit interrupt information
+ * (valid interrupt) is always set to 1 on
+ * EXIT_REASON_EXTERNAL_INTERRUPT, so we shouldn't
+ * need kvm_cpu_has_interrupt(). See the commit
+ * message for details.
+ */
+ if (nested_exit_intr_ack_set(vcpu) &&
+ exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT &&
+ kvm_cpu_has_interrupt(vcpu)) {
+ int irq = kvm_cpu_get_interrupt(vcpu);
+ WARN_ON(irq < 0);
+ vmcs12->vm_exit_intr_info = irq |
+ INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR;
+ }
+
+ trace_kvm_nested_vmexit_inject(vmcs12->vm_exit_reason,
+ vmcs12->exit_qualification,
+ vmcs12->idt_vectoring_info_field,
+ vmcs12->vm_exit_intr_info,
+ vmcs12->vm_exit_intr_error_code,
+ KVM_ISA_VMX);
+
+ load_vmcs12_host_state(vcpu, vmcs12);
+
+ return;
+ }
+
+ /*
+ * After an early L2 VM-entry failure, we're now back
+ * in L1 which thinks it just finished a VMLAUNCH or
+ * VMRESUME instruction, so we need to set the failure
+ * flag and the VM-instruction error field of the VMCS
+ * accordingly.
+ */
+ nested_vmx_failValid(vcpu, VMXERR_ENTRY_INVALID_CONTROL_FIELD);
+ /*
+ * The emulated instruction was already skipped in
+ * nested_vmx_run, but the updated RIP was never
+ * written back to the vmcs01.
+ */
+ skip_emulated_instruction(vcpu);
+ vmx->fail = 0;
}
/*
@@ -11671,6 +11710,37 @@ static void vmx_enable_log_dirty_pt_masked(struct kvm *kvm,
kvm_mmu_clear_dirty_pt_masked(kvm, memslot, offset, mask);
}
+static void __pi_post_block(struct kvm_vcpu *vcpu)
+{
+ struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
+ struct pi_desc old, new;
+ unsigned int dest;
+
+ do {
+ old.control = new.control = pi_desc->control;
+ WARN(old.nv != POSTED_INTR_WAKEUP_VECTOR,
+ "Wakeup handler not enabled while the VCPU is blocked\n");
+
+ dest = cpu_physical_id(vcpu->cpu);
+
+ if (x2apic_enabled())
+ new.ndst = dest;
+ else
+ new.ndst = (dest << 8) & 0xFF00;
+
+ /* set 'NV' to 'notification vector' */
+ new.nv = POSTED_INTR_VECTOR;
+ } while (cmpxchg64(&pi_desc->control, old.control,
+ new.control) != old.control);
+
+ if (!WARN_ON_ONCE(vcpu->pre_pcpu == -1)) {
+ spin_lock(&per_cpu(blocked_vcpu_on_cpu_lock, vcpu->pre_pcpu));
+ list_del(&vcpu->blocked_vcpu_list);
+ spin_unlock(&per_cpu(blocked_vcpu_on_cpu_lock, vcpu->pre_pcpu));
+ vcpu->pre_pcpu = -1;
+ }
+}
+
/*
* This routine does the following things for vCPU which is going
* to be blocked if VT-d PI is enabled.
@@ -11686,7 +11756,6 @@ static void vmx_enable_log_dirty_pt_masked(struct kvm *kvm,
*/
static int pi_pre_block(struct kvm_vcpu *vcpu)
{
- unsigned long flags;
unsigned int dest;
struct pi_desc old, new;
struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
@@ -11696,34 +11765,20 @@ static int pi_pre_block(struct kvm_vcpu *vcpu)
!kvm_vcpu_apicv_active(vcpu))
return 0;
- vcpu->pre_pcpu = vcpu->cpu;
- spin_lock_irqsave(&per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
- list_add_tail(&vcpu->blocked_vcpu_list,
- &per_cpu(blocked_vcpu_on_cpu,
- vcpu->pre_pcpu));
- spin_unlock_irqrestore(&per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
+ WARN_ON(irqs_disabled());
+ local_irq_disable();
+ if (!WARN_ON_ONCE(vcpu->pre_pcpu != -1)) {
+ vcpu->pre_pcpu = vcpu->cpu;
+ spin_lock(&per_cpu(blocked_vcpu_on_cpu_lock, vcpu->pre_pcpu));
+ list_add_tail(&vcpu->blocked_vcpu_list,
+ &per_cpu(blocked_vcpu_on_cpu,
+ vcpu->pre_pcpu));
+ spin_unlock(&per_cpu(blocked_vcpu_on_cpu_lock, vcpu->pre_pcpu));
+ }
do {
old.control = new.control = pi_desc->control;
- /*
- * We should not block the vCPU if
- * an interrupt is posted for it.
- */
- if (pi_test_on(pi_desc) == 1) {
- spin_lock_irqsave(&per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
- list_del(&vcpu->blocked_vcpu_list);
- spin_unlock_irqrestore(
- &per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
- vcpu->pre_pcpu = -1;
-
- return 1;
- }
-
WARN((pi_desc->sn == 1),
"Warning: SN field of posted-interrupts "
"is set before blocking\n");
@@ -11745,10 +11800,15 @@ static int pi_pre_block(struct kvm_vcpu *vcpu)
/* set 'NV' to 'wakeup vector' */
new.nv = POSTED_INTR_WAKEUP_VECTOR;
- } while (cmpxchg(&pi_desc->control, old.control,
- new.control) != old.control);
+ } while (cmpxchg64(&pi_desc->control, old.control,
+ new.control) != old.control);
- return 0;
+ /* We should not block the vCPU if an interrupt is posted for it. */
+ if (pi_test_on(pi_desc) == 1)
+ __pi_post_block(vcpu);
+
+ local_irq_enable();
+ return (vcpu->pre_pcpu == -1);
}
static int vmx_pre_block(struct kvm_vcpu *vcpu)
@@ -11764,44 +11824,13 @@ static int vmx_pre_block(struct kvm_vcpu *vcpu)
static void pi_post_block(struct kvm_vcpu *vcpu)
{
- struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
- struct pi_desc old, new;
- unsigned int dest;
- unsigned long flags;
-
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
- !irq_remapping_cap(IRQ_POSTING_CAP) ||
- !kvm_vcpu_apicv_active(vcpu))
+ if (vcpu->pre_pcpu == -1)
return;
- do {
- old.control = new.control = pi_desc->control;
-
- dest = cpu_physical_id(vcpu->cpu);
-
- if (x2apic_enabled())
- new.ndst = dest;
- else
- new.ndst = (dest << 8) & 0xFF00;
-
- /* Allow posting non-urgent interrupts */
- new.sn = 0;
-
- /* set 'NV' to 'notification vector' */
- new.nv = POSTED_INTR_VECTOR;
- } while (cmpxchg(&pi_desc->control, old.control,
- new.control) != old.control);
-
- if(vcpu->pre_pcpu != -1) {
- spin_lock_irqsave(
- &per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
- list_del(&vcpu->blocked_vcpu_list);
- spin_unlock_irqrestore(
- &per_cpu(blocked_vcpu_on_cpu_lock,
- vcpu->pre_pcpu), flags);
- vcpu->pre_pcpu = -1;
- }
+ WARN_ON(irqs_disabled());
+ local_irq_disable();
+ __pi_post_block(vcpu);
+ local_irq_enable();
}
static void vmx_post_block(struct kvm_vcpu *vcpu)
@@ -11829,7 +11858,7 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
struct kvm_lapic_irq irq;
struct kvm_vcpu *vcpu;
struct vcpu_data vcpu_info;
- int idx, ret = -EINVAL;
+ int idx, ret = 0;
if (!kvm_arch_has_assigned_device(kvm) ||
!irq_remapping_cap(IRQ_POSTING_CAP) ||
@@ -11838,7 +11867,12 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
idx = srcu_read_lock(&kvm->irq_srcu);
irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
- BUG_ON(guest_irq >= irq_rt->nr_rt_entries);
+ if (guest_irq >= irq_rt->nr_rt_entries ||
+ hlist_empty(&irq_rt->map[guest_irq])) {
+ pr_warn_once("no route for guest_irq %u/%u (broken user space?)\n",
+ guest_irq, irq_rt->nr_rt_entries);
+ goto out;
+ }
hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) {
if (e->type != KVM_IRQ_ROUTING_MSI)
@@ -11881,12 +11915,8 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
if (set)
ret = irq_set_vcpu_affinity(host_irq, &vcpu_info);
- else {
- /* suppress notification event before unposting */
- pi_set_sn(vcpu_to_pi_desc(vcpu));
+ else
ret = irq_set_vcpu_affinity(host_irq, NULL);
- pi_clear_sn(vcpu_to_pi_desc(vcpu));
- }
if (ret < 0) {
printk(KERN_INFO "%s: failed to update PI IRTE\n",
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 6069af86da3b..03869eb7fcd6 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7225,16 +7225,25 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
int r;
sigset_t sigsaved;
- fpu__activate_curr(fpu);
+ fpu__initialize(fpu);
if (vcpu->sigset_active)
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
+ if (kvm_run->immediate_exit) {
+ r = -EINTR;
+ goto out;
+ }
kvm_vcpu_block(vcpu);
kvm_apic_accept_events(vcpu);
kvm_clear_request(KVM_REQ_UNHALT, vcpu);
r = -EAGAIN;
+ if (signal_pending(current)) {
+ r = -EINTR;
+ vcpu->run->exit_reason = KVM_EXIT_INTR;
+ ++vcpu->stat.signal_exits;
+ }
goto out;
}
@@ -7971,7 +7980,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
BUG_ON(vcpu->kvm == NULL);
kvm = vcpu->kvm;
- vcpu->arch.apicv_active = kvm_x86_ops->get_enable_apicv();
+ vcpu->arch.apicv_active = kvm_x86_ops->get_enable_apicv(vcpu);
vcpu->arch.pv.pv_unhalted = false;
vcpu->arch.emulate_ctxt.ops = &emulate_ops;
if (!irqchip_in_kernel(kvm) || kvm_vcpu_is_reset_bsp(vcpu))
@@ -8452,6 +8461,9 @@ static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu)
if (vcpu->arch.pv.pv_unhalted)
return true;
+ if (vcpu->arch.exception.pending)
+ return true;
+
if (kvm_test_request(KVM_REQ_NMI, vcpu) ||
(vcpu->arch.nmi_pending &&
kvm_x86_ops->nmi_allowed(vcpu)))
@@ -8619,6 +8631,13 @@ static int apf_put_user(struct kvm_vcpu *vcpu, u32 val)
sizeof(val));
}
+static int apf_get_user(struct kvm_vcpu *vcpu, u32 *val)
+{
+
+ return kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apf.data, val,
+ sizeof(u32));
+}
+
void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
struct kvm_async_pf *work)
{
@@ -8646,6 +8665,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
struct kvm_async_pf *work)
{
struct x86_exception fault;
+ u32 val;
if (work->wakeup_all)
work->arch.token = ~0; /* broadcast wakeup */
@@ -8653,15 +8673,26 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
kvm_del_async_pf_gfn(vcpu, work->arch.gfn);
trace_kvm_async_pf_ready(work->arch.token, work->gva);
- if ((vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) &&
- !apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
- fault.vector = PF_VECTOR;
- fault.error_code_valid = true;
- fault.error_code = 0;
- fault.nested_page_fault = false;
- fault.address = work->arch.token;
- fault.async_page_fault = true;
- kvm_inject_page_fault(vcpu, &fault);
+ if (vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED &&
+ !apf_get_user(vcpu, &val)) {
+ if (val == KVM_PV_REASON_PAGE_NOT_PRESENT &&
+ vcpu->arch.exception.pending &&
+ vcpu->arch.exception.nr == PF_VECTOR &&
+ !apf_put_user(vcpu, 0)) {
+ vcpu->arch.exception.injected = false;
+ vcpu->arch.exception.pending = false;
+ vcpu->arch.exception.nr = 0;
+ vcpu->arch.exception.has_error_code = false;
+ vcpu->arch.exception.error_code = 0;
+ } else if (!apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
+ fault.vector = PF_VECTOR;
+ fault.error_code_valid = true;
+ fault.error_code = 0;
+ fault.nested_page_fault = false;
+ fault.address = work->arch.token;
+ fault.async_page_fault = true;
+ kvm_inject_page_fault(vcpu, &fault);
+ }
}
vcpu->arch.apf.halted = false;
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
diff --git a/arch/x86/math-emu/fpu_entry.c b/arch/x86/math-emu/fpu_entry.c
index d4a7df2205b8..220638a4cb94 100644
--- a/arch/x86/math-emu/fpu_entry.c
+++ b/arch/x86/math-emu/fpu_entry.c
@@ -114,7 +114,7 @@ void math_emulate(struct math_emu_info *info)
struct desc_struct code_descriptor;
struct fpu *fpu = &current->thread.fpu;
- fpu__activate_curr(fpu);
+ fpu__initialize(fpu);
#ifdef RE_ENTRANT_CHECKING
if (emulating) {
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index c076f710de4c..c3521e2be396 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -2,6 +2,7 @@
#include <linux/uaccess.h>
#include <linux/sched/debug.h>
+#include <asm/fpu/internal.h>
#include <asm/traps.h>
#include <asm/kdebug.h>
@@ -78,6 +79,29 @@ bool ex_handler_refcount(const struct exception_table_entry *fixup,
}
EXPORT_SYMBOL_GPL(ex_handler_refcount);
+/*
+ * Handler for when we fail to restore a task's FPU state. We should never get
+ * here because the FPU state of a task using the FPU (task->thread.fpu.state)
+ * should always be valid. However, past bugs have allowed userspace to set
+ * reserved bits in the XSAVE area using PTRACE_SETREGSET or sys_rt_sigreturn().
+ * These caused XRSTOR to fail when switching to the task, leaking the FPU
+ * registers of the task previously executing on the CPU. Mitigate this class
+ * of vulnerability by restoring from the initial state (essentially, zeroing
+ * out all the FPU registers) if we can't restore from the task's FPU state.
+ */
+bool ex_handler_fprestore(const struct exception_table_entry *fixup,
+ struct pt_regs *regs, int trapnr)
+{
+ regs->ip = ex_fixup_addr(fixup);
+
+ WARN_ONCE(1, "Bad FPU state detected at %pB, reinitializing FPU registers.",
+ (void *)instruction_pointer(regs));
+
+ __copy_kernel_to_fpregs(&init_fpstate, -1);
+ return true;
+}
+EXPORT_SYMBOL_GPL(ex_handler_fprestore);
+
bool ex_handler_ext(const struct exception_table_entry *fixup,
struct pt_regs *regs, int trapnr)
{
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index b836a7274e12..e2baeaa053a5 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -192,8 +192,7 @@ is_prefetch(struct pt_regs *regs, unsigned long error_code, unsigned long addr)
* 6. T1 : reaches here, sees vma_pkey(vma)=5, when we really
* faulted on a pte with its pkey=4.
*/
-static void fill_sig_info_pkey(int si_code, siginfo_t *info,
- struct vm_area_struct *vma)
+static void fill_sig_info_pkey(int si_code, siginfo_t *info, u32 *pkey)
{
/* This is effectively an #ifdef */
if (!boot_cpu_has(X86_FEATURE_OSPKE))
@@ -209,7 +208,7 @@ static void fill_sig_info_pkey(int si_code, siginfo_t *info,
* valid VMA, so we should never reach this without a
* valid VMA.
*/
- if (!vma) {
+ if (!pkey) {
WARN_ONCE(1, "PKU fault with no VMA passed in");
info->si_pkey = 0;
return;
@@ -219,13 +218,12 @@ static void fill_sig_info_pkey(int si_code, siginfo_t *info,
* absolutely guranteed to be 100% accurate because of
* the race explained above.
*/
- info->si_pkey = vma_pkey(vma);
+ info->si_pkey = *pkey;
}
static void
force_sig_info_fault(int si_signo, int si_code, unsigned long address,
- struct task_struct *tsk, struct vm_area_struct *vma,
- int fault)
+ struct task_struct *tsk, u32 *pkey, int fault)
{
unsigned lsb = 0;
siginfo_t info;
@@ -240,7 +238,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,
lsb = PAGE_SHIFT;
info.si_addr_lsb = lsb;
- fill_sig_info_pkey(si_code, &info, vma);
+ fill_sig_info_pkey(si_code, &info, pkey);
force_sig_info(si_signo, &info, tsk);
}
@@ -762,8 +760,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
struct task_struct *tsk = current;
unsigned long flags;
int sig;
- /* No context means no VMA to pass down */
- struct vm_area_struct *vma = NULL;
/* Are we prepared to handle this kernel fault? */
if (fixup_exception(regs, X86_TRAP_PF)) {
@@ -788,7 +784,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
/* XXX: hwpoison faults will set the wrong code. */
force_sig_info_fault(signal, si_code, address,
- tsk, vma, 0);
+ tsk, NULL, 0);
}
/*
@@ -806,7 +802,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
if (is_vmalloc_addr((void *)address) &&
(((unsigned long)tsk->stack - 1 - address < PAGE_SIZE) ||
address - ((unsigned long)tsk->stack + THREAD_SIZE) < PAGE_SIZE)) {
- register void *__sp asm("rsp");
unsigned long stack = this_cpu_read(orig_ist.ist[DOUBLEFAULT_STACK]) - sizeof(void *);
/*
* We're likely to be running with very little stack space
@@ -821,7 +816,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
asm volatile ("movq %[stack], %%rsp\n\t"
"call handle_stack_overflow\n\t"
"1: jmp 1b"
- : "+r" (__sp)
+ : ASM_CALL_CONSTRAINT
: "D" ("kernel stack overflow (page fault)"),
"S" (regs), "d" (address),
[stack] "rm" (stack));
@@ -897,8 +892,7 @@ show_signal_msg(struct pt_regs *regs, unsigned long error_code,
static void
__bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
- unsigned long address, struct vm_area_struct *vma,
- int si_code)
+ unsigned long address, u32 *pkey, int si_code)
{
struct task_struct *tsk = current;
@@ -946,7 +940,7 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
tsk->thread.error_code = error_code;
tsk->thread.trap_nr = X86_TRAP_PF;
- force_sig_info_fault(SIGSEGV, si_code, address, tsk, vma, 0);
+ force_sig_info_fault(SIGSEGV, si_code, address, tsk, pkey, 0);
return;
}
@@ -959,9 +953,9 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
static noinline void
bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
- unsigned long address, struct vm_area_struct *vma)
+ unsigned long address, u32 *pkey)
{
- __bad_area_nosemaphore(regs, error_code, address, vma, SEGV_MAPERR);
+ __bad_area_nosemaphore(regs, error_code, address, pkey, SEGV_MAPERR);
}
static void
@@ -969,6 +963,10 @@ __bad_area(struct pt_regs *regs, unsigned long error_code,
unsigned long address, struct vm_area_struct *vma, int si_code)
{
struct mm_struct *mm = current->mm;
+ u32 pkey;
+
+ if (vma)
+ pkey = vma_pkey(vma);
/*
* Something tried to access memory that isn't in our memory map..
@@ -976,7 +974,8 @@ __bad_area(struct pt_regs *regs, unsigned long error_code,
*/
up_read(&mm->mmap_sem);
- __bad_area_nosemaphore(regs, error_code, address, vma, si_code);
+ __bad_area_nosemaphore(regs, error_code, address,
+ (vma) ? &pkey : NULL, si_code);
}
static noinline void
@@ -1019,7 +1018,7 @@ bad_area_access_error(struct pt_regs *regs, unsigned long error_code,
static void
do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
- struct vm_area_struct *vma, unsigned int fault)
+ u32 *pkey, unsigned int fault)
{
struct task_struct *tsk = current;
int code = BUS_ADRERR;
@@ -1046,13 +1045,12 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
code = BUS_MCEERR_AR;
}
#endif
- force_sig_info_fault(SIGBUS, code, address, tsk, vma, fault);
+ force_sig_info_fault(SIGBUS, code, address, tsk, pkey, fault);
}
static noinline void
mm_fault_error(struct pt_regs *regs, unsigned long error_code,
- unsigned long address, struct vm_area_struct *vma,
- unsigned int fault)
+ unsigned long address, u32 *pkey, unsigned int fault)
{
if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
no_context(regs, error_code, address, 0, 0);
@@ -1076,9 +1074,9 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
} else {
if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
VM_FAULT_HWPOISON_LARGE))
- do_sigbus(regs, error_code, address, vma, fault);
+ do_sigbus(regs, error_code, address, pkey, fault);
else if (fault & VM_FAULT_SIGSEGV)
- bad_area_nosemaphore(regs, error_code, address, vma);
+ bad_area_nosemaphore(regs, error_code, address, pkey);
else
BUG();
}
@@ -1268,6 +1266,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code,
struct mm_struct *mm;
int fault, major = 0;
unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+ u32 pkey;
tsk = current;
mm = tsk->mm;
@@ -1468,9 +1467,10 @@ good_area:
return;
}
+ pkey = vma_pkey(vma);
up_read(&mm->mmap_sem);
if (unlikely(fault & VM_FAULT_ERROR)) {
- mm_fault_error(regs, error_code, address, vma, fault);
+ mm_fault_error(regs, error_code, address, &pkey, fault);
return;
}
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index 7777ccc0e9f9..af5c1ed21d43 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -19,6 +19,7 @@
#include <asm/microcode.h>
#include <asm/kaslr.h>
#include <asm/hypervisor.h>
+#include <asm/cpufeature.h>
/*
* We need to define the tracepoints somewhere, and tlb.c
@@ -193,6 +194,38 @@ static void __init probe_page_size_mask(void)
}
}
+static void setup_pcid(void)
+{
+#ifdef CONFIG_X86_64
+ if (boot_cpu_has(X86_FEATURE_PCID)) {
+ if (boot_cpu_has(X86_FEATURE_PGE)) {
+ /*
+ * This can't be cr4_set_bits_and_update_boot() --
+ * the trampoline code can't handle CR4.PCIDE and
+ * it wouldn't do any good anyway. Despite the name,
+ * cr4_set_bits_and_update_boot() doesn't actually
+ * cause the bits in question to remain set all the
+ * way through the secondary boot asm.
+ *
+ * Instead, we brute-force it and set CR4.PCIDE
+ * manually in start_secondary().
+ */
+ cr4_set_bits(X86_CR4_PCIDE);
+ } else {
+ /*
+ * flush_tlb_all(), as currently implemented, won't
+ * work if PCID is on but PGE is not. Since that
+ * combination doesn't exist on real hardware, there's
+ * no reason to try to fully support it, but it's
+ * polite to avoid corrupting data if we're on
+ * an improperly configured VM.
+ */
+ setup_clear_cpu_cap(X86_FEATURE_PCID);
+ }
+ }
+#endif
+}
+
#ifdef CONFIG_X86_32
#define NR_RANGE_MR 3
#else /* CONFIG_X86_64 */
@@ -592,6 +625,7 @@ void __init init_mem_mapping(void)
unsigned long end;
probe_page_size_mask();
+ setup_pcid();
#ifdef CONFIG_X86_64
end = max_pfn << PAGE_SHIFT;
diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c
index 0fbd09269757..16c5f37933a2 100644
--- a/arch/x86/mm/mem_encrypt.c
+++ b/arch/x86/mm/mem_encrypt.c
@@ -10,6 +10,8 @@
* published by the Free Software Foundation.
*/
+#define DISABLE_BRANCH_PROFILING
+
#include <linux/linkage.h>
#include <linux/init.h>
#include <linux/mm.h>
@@ -37,7 +39,7 @@ static char sme_cmdline_off[] __initdata = "off";
* reside in the .data section so as not to be zeroed out when the .bss
* section is later cleared.
*/
-unsigned long sme_me_mask __section(.data) = 0;
+u64 sme_me_mask __section(.data) = 0;
EXPORT_SYMBOL_GPL(sme_me_mask);
/* Buffer used for early in-place encryption by BSP, no locking needed */
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index 218834a3e9ad..b372f3442bbf 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -426,10 +426,8 @@ int ptep_set_access_flags(struct vm_area_struct *vma,
{
int changed = !pte_same(*ptep, entry);
- if (changed && dirty) {
+ if (changed && dirty)
*ptep = entry;
- pte_update(vma->vm_mm, address, ptep);
- }
return changed;
}
@@ -486,9 +484,6 @@ int ptep_test_and_clear_young(struct vm_area_struct *vma,
ret = test_and_clear_bit(_PAGE_BIT_ACCESSED,
(unsigned long *) &ptep->pte);
- if (ret)
- pte_update(vma->vm_mm, addr, ptep);
-
return ret;
}
diff --git a/arch/x86/mm/pkeys.c b/arch/x86/mm/pkeys.c
index 2dab69a706ec..d7bc0eea20a5 100644
--- a/arch/x86/mm/pkeys.c
+++ b/arch/x86/mm/pkeys.c
@@ -18,7 +18,6 @@
#include <asm/cpufeature.h> /* boot_cpu_has, ... */
#include <asm/mmu_context.h> /* vma_pkey() */
-#include <asm/fpu/internal.h> /* fpregs_active() */
int __execute_only_pkey(struct mm_struct *mm)
{
@@ -45,7 +44,7 @@ int __execute_only_pkey(struct mm_struct *mm)
*/
preempt_disable();
if (!need_to_set_mm_pkey &&
- fpregs_active() &&
+ current->thread.fpu.initialized &&
!__pkru_allows_read(read_pkru(), execute_only_pkey)) {
preempt_enable();
return execute_only_pkey;
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index dbbcfd59726a..49d9778376d7 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -121,8 +121,27 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
* hypothetical buggy code that directly switches to swapper_pg_dir
* without going through leave_mm() / switch_mm_irqs_off() or that
* does something like write_cr3(read_cr3_pa()).
+ *
+ * Only do this check if CONFIG_DEBUG_VM=y because __read_cr3()
+ * isn't free.
*/
- VM_BUG_ON(__read_cr3() != (__sme_pa(real_prev->pgd) | prev_asid));
+#ifdef CONFIG_DEBUG_VM
+ if (WARN_ON_ONCE(__read_cr3() != build_cr3(real_prev, prev_asid))) {
+ /*
+ * If we were to BUG here, we'd be very likely to kill
+ * the system so hard that we don't see the call trace.
+ * Try to recover instead by ignoring the error and doing
+ * a global flush to minimize the chance of corruption.
+ *
+ * (This is far from being a fully correct recovery.
+ * Architecturally, the CPU could prefetch something
+ * back into an incorrect ASID slot and leave it there
+ * to cause trouble down the road. It's better than
+ * nothing, though.)
+ */
+ __flush_tlb_all();
+ }
+#endif
if (real_prev == next) {
VM_BUG_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) !=
@@ -152,7 +171,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
*/
this_cpu_write(cpu_tlbstate.ctxs[prev_asid].tlb_gen,
next_tlb_gen);
- write_cr3(__sme_pa(next->pgd) | prev_asid);
+ write_cr3(build_cr3(next, prev_asid));
trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH,
TLB_FLUSH_ALL);
}
@@ -172,7 +191,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
* mapped in the new pgd, we'll double-fault. Forcibly
* map it.
*/
- unsigned int index = pgd_index(current_stack_pointer());
+ unsigned int index = pgd_index(current_stack_pointer);
pgd_t *pgd = next->pgd + index;
if (unlikely(pgd_none(*pgd)))
@@ -196,12 +215,12 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
if (need_flush) {
this_cpu_write(cpu_tlbstate.ctxs[new_asid].ctx_id, next->context.ctx_id);
this_cpu_write(cpu_tlbstate.ctxs[new_asid].tlb_gen, next_tlb_gen);
- write_cr3(__sme_pa(next->pgd) | new_asid);
+ write_cr3(build_cr3(next, new_asid));
trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH,
TLB_FLUSH_ALL);
} else {
/* The new ASID is already up to date. */
- write_cr3(__sme_pa(next->pgd) | new_asid | CR3_NOFLUSH);
+ write_cr3(build_cr3_noflush(next, new_asid));
trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, 0);
}
@@ -241,11 +260,11 @@ void initialize_tlbstate_and_flush(void)
* doesn't work like other CR4 bits because it can only be set from
* long mode.)
*/
- WARN_ON(boot_cpu_has(X86_CR4_PCIDE) &&
+ WARN_ON(boot_cpu_has(X86_FEATURE_PCID) &&
!(cr4_read_shadow() & X86_CR4_PCIDE));
/* Force ASID 0 and force a TLB flush. */
- write_cr3(cr3 & ~CR3_PCID_MASK);
+ write_cr3(build_cr3(mm, 0));
/* Reinitialize tlbstate. */
this_cpu_write(cpu_tlbstate.loaded_mm_asid, 0);
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 8c9573660d51..0554e8aef4d5 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -284,9 +284,9 @@ static void emit_bpf_tail_call(u8 **pprog)
/* if (index >= array->map.max_entries)
* goto out;
*/
- EMIT4(0x48, 0x8B, 0x46, /* mov rax, qword ptr [rsi + 16] */
+ EMIT2(0x89, 0xD2); /* mov edx, edx */
+ EMIT3(0x39, 0x56, /* cmp dword ptr [rsi + 16], edx */
offsetof(struct bpf_array, map.max_entries));
- EMIT3(0x48, 0x39, 0xD0); /* cmp rax, rdx */
#define OFFSET1 43 /* number of bytes to jump */
EMIT2(X86_JBE, OFFSET1); /* jbe out */
label1 = cnt;
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 9bd115484745..0f5f60b14f48 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -1092,7 +1092,7 @@ static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id __initdata pciirq_dmi_table[] = {
+static const struct dmi_system_id pciirq_dmi_table[] __initconst = {
{
.callback = fix_broken_hp_bios_irq9,
.ident = "HP Pavilion N5400 Series Laptop",
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_tc35876x.c b/arch/x86/platform/intel-mid/device_libs/platform_tc35876x.c
index b1526b95fd43..2905376559f1 100644
--- a/arch/x86/platform/intel-mid/device_libs/platform_tc35876x.c
+++ b/arch/x86/platform/intel-mid/device_libs/platform_tc35876x.c
@@ -11,7 +11,7 @@
*/
#include <linux/gpio.h>
-#include <linux/i2c/tc35876x.h>
+#include <linux/platform_data/tc35876x.h>
#include <asm/intel-mid.h>
/*tc35876x DSI_LVDS bridge chip and panel platform data*/
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
index 4d68d59f457d..84fcfde53f8f 100644
--- a/arch/x86/power/cpu.c
+++ b/arch/x86/power/cpu.c
@@ -428,7 +428,7 @@ static int msr_initialize_bdw(const struct dmi_system_id *d)
return msr_init_context(bdw_msr_id, ARRAY_SIZE(bdw_msr_id));
}
-static struct dmi_system_id msr_save_dmi_table[] = {
+static const struct dmi_system_id msr_save_dmi_table[] = {
{
.callback = msr_initialize_bdw,
.ident = "BROADWELL BDX_EP",
diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c
index f2598d81cd55..f910c514438f 100644
--- a/arch/x86/power/hibernate_64.c
+++ b/arch/x86/power/hibernate_64.c
@@ -295,7 +295,26 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size)
return -EOVERFLOW;
rdr->jump_address = (unsigned long)restore_registers;
rdr->jump_address_phys = __pa_symbol(restore_registers);
- rdr->cr3 = restore_cr3;
+
+ /*
+ * The restore code fixes up CR3 and CR4 in the following sequence:
+ *
+ * [in hibernation asm]
+ * 1. CR3 <= temporary page tables
+ * 2. CR4 <= mmu_cr4_features (from the kernel that restores us)
+ * 3. CR3 <= rdr->cr3
+ * 4. CR4 <= mmu_cr4_features (from us, i.e. the image kernel)
+ * [in restore_processor_state()]
+ * 5. CR4 <= saved CR4
+ * 6. CR3 <= saved CR3
+ *
+ * Our mmu_cr4_features has CR4.PCIDE=0, and toggling
+ * CR4.PCIDE while CR3's PCID bits are nonzero is illegal, so
+ * rdr->cr3 needs to point to valid page tables but must not
+ * have any of the PCID bits set.
+ */
+ rdr->cr3 = restore_cr3 & ~CR3_PCID_MASK;
+
rdr->magic = RESTORE_MAGIC;
hibernation_e820_save(rdr->e820_digest);
diff --git a/arch/x86/um/os-Linux/registers.c b/arch/x86/um/os-Linux/registers.c
index 28775f55bde2..3c423dfcd78b 100644
--- a/arch/x86/um/os-Linux/registers.c
+++ b/arch/x86/um/os-Linux/registers.c
@@ -5,6 +5,7 @@
*/
#include <errno.h>
+#include <stdlib.h>
#include <sys/ptrace.h>
#ifdef __i386__
#include <sys/user.h>
@@ -31,7 +32,7 @@ int save_fp_registers(int pid, unsigned long *fp_regs)
if (have_xstate_support) {
iov.iov_base = fp_regs;
- iov.iov_len = sizeof(struct _xstate);
+ iov.iov_len = FP_SIZE * sizeof(unsigned long);
if (ptrace(PTRACE_GETREGSET, pid, NT_X86_XSTATE, &iov) < 0)
return -errno;
return 0;
@@ -51,10 +52,9 @@ int restore_fp_registers(int pid, unsigned long *fp_regs)
{
#ifdef PTRACE_SETREGSET
struct iovec iov;
-
if (have_xstate_support) {
iov.iov_base = fp_regs;
- iov.iov_len = sizeof(struct _xstate);
+ iov.iov_len = FP_SIZE * sizeof(unsigned long);
if (ptrace(PTRACE_SETREGSET, pid, NT_X86_XSTATE, &iov) < 0)
return -errno;
return 0;
@@ -125,13 +125,19 @@ int put_fp_registers(int pid, unsigned long *regs)
void arch_init_registers(int pid)
{
#ifdef PTRACE_GETREGSET
- struct _xstate fp_regs;
+ void * fp_regs;
struct iovec iov;
- iov.iov_base = &fp_regs;
- iov.iov_len = sizeof(struct _xstate);
+ fp_regs = malloc(FP_SIZE * sizeof(unsigned long));
+ if(fp_regs == NULL)
+ return;
+
+ iov.iov_base = fp_regs;
+ iov.iov_len = FP_SIZE * sizeof(unsigned long);
if (ptrace(PTRACE_GETREGSET, pid, NT_X86_XSTATE, &iov) == 0)
have_xstate_support = 1;
+
+ free(fp_regs);
#endif
}
#endif
diff --git a/arch/x86/um/os-Linux/tls.c b/arch/x86/um/os-Linux/tls.c
index 9d94b3b76c74..ed8ea90967dc 100644
--- a/arch/x86/um/os-Linux/tls.c
+++ b/arch/x86/um/os-Linux/tls.c
@@ -37,7 +37,7 @@ void check_host_supports_tls(int *supports_tls, int *tls_min)
continue;
else if (errno == ENOSYS)
*supports_tls = 0;
- return;
+ return;
}
}
diff --git a/arch/x86/um/user-offsets.c b/arch/x86/um/user-offsets.c
index 02250b2633b8..3099c209546f 100644
--- a/arch/x86/um/user-offsets.c
+++ b/arch/x86/um/user-offsets.c
@@ -51,7 +51,7 @@ void foo(void)
DEFINE(HOST_ORIG_AX, ORIG_EAX);
#else
#ifdef FP_XSTATE_MAGIC1
- DEFINE(HOST_FP_SIZE, sizeof(struct _xstate) / sizeof(unsigned long));
+ DEFINE_LONGS(HOST_FP_SIZE, 2696);
#else
DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
#endif
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index ae2a2e2d6362..69b9deff7e5c 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1038,7 +1038,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
.read_cr0 = xen_read_cr0,
.write_cr0 = xen_write_cr0,
- .read_cr4 = native_read_cr4,
.write_cr4 = xen_write_cr4,
#ifdef CONFIG_X86_64
@@ -1073,7 +1072,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
.alloc_ldt = xen_alloc_ldt,
.free_ldt = xen_free_ldt,
- .store_idt = native_store_idt,
.store_tr = xen_store_tr,
.write_ldt_entry = xen_write_ldt_entry,
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index 6b983b300666..71495f1a86d7 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -1238,21 +1238,16 @@ static void __init xen_pagetable_cleanhighmap(void)
* from _brk_limit way up to the max_pfn_mapped (which is the end of
* the ramdisk). We continue on, erasing PMD entries that point to page
* tables - do note that they are accessible at this stage via __va.
- * For good measure we also round up to the PMD - which means that if
+ * As Xen is aligning the memory end to a 4MB boundary, for good
+ * measure we also round up to PMD_SIZE * 2 - which means that if
* anybody is using __ka address to the initial boot-stack - and try
* to use it - they are going to crash. The xen_start_info has been
* taken care of already in xen_setup_kernel_pagetable. */
addr = xen_start_info->pt_base;
- size = roundup(xen_start_info->nr_pt_frames * PAGE_SIZE, PMD_SIZE);
+ size = xen_start_info->nr_pt_frames * PAGE_SIZE;
- xen_cleanhighmap(addr, addr + size);
+ xen_cleanhighmap(addr, roundup(addr + size, PMD_SIZE * 2));
xen_start_info->pt_base = (unsigned long)__va(__pa(xen_start_info->pt_base));
-#ifdef DEBUG
- /* This is superfluous and is not necessary, but you know what
- * lets do it. The MODULES_VADDR -> MODULES_END should be clear of
- * anything at this stage. */
- xen_cleanhighmap(MODULES_VADDR, roundup(MODULES_VADDR, PUD_SIZE) - 1);
-#endif
}
#endif
@@ -2220,7 +2215,7 @@ static void __init xen_write_cr3_init(unsigned long cr3)
* not the first page table in the page table pool.
* Iterate through the initial page tables to find the real page table base.
*/
-static phys_addr_t xen_find_pt_base(pmd_t *pmd)
+static phys_addr_t __init xen_find_pt_base(pmd_t *pmd)
{
phys_addr_t pt_base, paddr;
unsigned pmdidx;
@@ -2409,8 +2404,6 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = {
.flush_tlb_single = xen_flush_tlb_single,
.flush_tlb_others = xen_flush_tlb_others,
- .pte_update = paravirt_nop,
-
.pgd_alloc = xen_pgd_alloc,
.pgd_free = xen_pgd_free,
diff --git a/arch/xtensa/include/asm/processor.h b/arch/xtensa/include/asm/processor.h
index 30ee8c608853..5b0027d4ecc0 100644
--- a/arch/xtensa/include/asm/processor.h
+++ b/arch/xtensa/include/asm/processor.h
@@ -208,11 +208,6 @@ struct mm_struct;
/* Free all resources held by a thread. */
#define release_thread(thread) do { } while(0)
-/* Copy and release all segment info associated with a VM */
-#define copy_segments(p, mm) do { } while(0)
-#define release_segments(mm) do { } while(0)
-#define forget_segments() do { } while (0)
-
extern unsigned long get_wchan(struct task_struct *p);
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
diff --git a/block/blk-core.c b/block/blk-core.c
index d709c0e3a2ac..048be4aa6024 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -854,6 +854,9 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
kobject_init(&q->kobj, &blk_queue_ktype);
+#ifdef CONFIG_BLK_DEV_IO_TRACE
+ mutex_init(&q->blk_trace_mutex);
+#endif
mutex_init(&q->sysfs_lock);
spin_lock_init(&q->__queue_lock);
@@ -2342,7 +2345,12 @@ blk_status_t blk_insert_cloned_request(struct request_queue *q, struct request *
if (q->mq_ops) {
if (blk_queue_io_stat(q))
blk_account_io_start(rq, true);
- blk_mq_sched_insert_request(rq, false, true, false, false);
+ /*
+ * Since we have a scheduler attached on the top device,
+ * bypass a potential scheduler on the bottom device for
+ * insert.
+ */
+ blk_mq_request_bypass_insert(rq);
return BLK_STS_OK;
}
diff --git a/block/blk-lib.c b/block/blk-lib.c
index e01adb5145b3..62240f8832ca 100644
--- a/block/blk-lib.c
+++ b/block/blk-lib.c
@@ -269,9 +269,9 @@ static int __blkdev_issue_write_zeroes(struct block_device *bdev,
*/
static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects)
{
- sector_t bytes = (nr_sects << 9) + PAGE_SIZE - 1;
+ sector_t pages = DIV_ROUND_UP_SECTOR_T(nr_sects, PAGE_SIZE / 512);
- return min(bytes >> PAGE_SHIFT, (sector_t)BIO_MAX_PAGES);
+ return min(pages, (sector_t)BIO_MAX_PAGES);
}
/**
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 3f18cff80050..98a18609755e 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1401,6 +1401,22 @@ void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
blk_mq_hctx_mark_pending(hctx, ctx);
}
+/*
+ * Should only be used carefully, when the caller knows we want to
+ * bypass a potential IO scheduler on the target device.
+ */
+void blk_mq_request_bypass_insert(struct request *rq)
+{
+ struct blk_mq_ctx *ctx = rq->mq_ctx;
+ struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(rq->q, ctx->cpu);
+
+ spin_lock(&hctx->lock);
+ list_add_tail(&rq->queuelist, &hctx->dispatch);
+ spin_unlock(&hctx->lock);
+
+ blk_mq_run_hw_queue(hctx, false);
+}
+
void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
struct list_head *list)
diff --git a/block/blk-mq.h b/block/blk-mq.h
index 98252b79b80b..ef15b3414da5 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -54,6 +54,7 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
*/
void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
bool at_head);
+void blk_mq_request_bypass_insert(struct request *rq);
void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
struct list_head *list);
diff --git a/block/bsg-lib.c b/block/bsg-lib.c
index c82408c7cc3c..dbddff8174e5 100644
--- a/block/bsg-lib.c
+++ b/block/bsg-lib.c
@@ -154,7 +154,6 @@ static int bsg_prepare_job(struct device *dev, struct request *req)
failjob_rls_rqst_payload:
kfree(job->request_payload.sg_list);
failjob_rls_job:
- kfree(job);
return -ENOMEM;
}
diff --git a/block/opal_proto.h b/block/opal_proto.h
index f40c9acf8895..e20be8258854 100644
--- a/block/opal_proto.h
+++ b/block/opal_proto.h
@@ -46,6 +46,7 @@ enum opal_response_token {
#define GENERIC_HOST_SESSION_NUM 0x41
#define TPER_SYNC_SUPPORTED 0x01
+#define MBR_ENABLED_MASK 0x10
#define TINY_ATOM_DATA_MASK 0x3F
#define TINY_ATOM_SIGNED 0x40
diff --git a/block/partition-generic.c b/block/partition-generic.c
index 86e8fe1adcdb..88c555db4e5d 100644
--- a/block/partition-generic.c
+++ b/block/partition-generic.c
@@ -112,7 +112,7 @@ ssize_t part_stat_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct hd_struct *p = dev_to_part(dev);
- struct request_queue *q = dev_to_disk(dev)->queue;
+ struct request_queue *q = part_to_disk(p)->queue;
unsigned int inflight[2];
int cpu;
diff --git a/block/sed-opal.c b/block/sed-opal.c
index 9b30ae5ab843..9ed51d0c6b1d 100644
--- a/block/sed-opal.c
+++ b/block/sed-opal.c
@@ -80,6 +80,7 @@ struct parsed_resp {
struct opal_dev {
bool supported;
+ bool mbr_enabled;
void *data;
sec_send_recv *send_recv;
@@ -283,6 +284,14 @@ static bool check_tper(const void *data)
return true;
}
+static bool check_mbrenabled(const void *data)
+{
+ const struct d0_locking_features *lfeat = data;
+ u8 sup_feat = lfeat->supported_features;
+
+ return !!(sup_feat & MBR_ENABLED_MASK);
+}
+
static bool check_sum(const void *data)
{
const struct d0_single_user_mode *sum = data;
@@ -417,6 +426,7 @@ static int opal_discovery0_end(struct opal_dev *dev)
u32 hlen = be32_to_cpu(hdr->length);
print_buffer(dev->resp, hlen);
+ dev->mbr_enabled = false;
if (hlen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
pr_debug("Discovery length overflows buffer (%zu+%u)/%u\n",
@@ -442,6 +452,8 @@ static int opal_discovery0_end(struct opal_dev *dev)
check_geometry(dev, body);
break;
case FC_LOCKING:
+ dev->mbr_enabled = check_mbrenabled(body->features);
+ break;
case FC_ENTERPRISE:
case FC_DATASTORE:
/* some ignored properties */
@@ -2190,6 +2202,21 @@ static int __opal_lock_unlock(struct opal_dev *dev,
return next(dev);
}
+static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
+{
+ u8 mbr_done_tf = 1;
+ const struct opal_step mbrdone_step [] = {
+ { opal_discovery0, },
+ { start_admin1LSP_opal_session, key },
+ { set_mbr_done, &mbr_done_tf },
+ { end_opal_session, },
+ { NULL, }
+ };
+
+ dev->steps = mbrdone_step;
+ return next(dev);
+}
+
static int opal_lock_unlock(struct opal_dev *dev,
struct opal_lock_unlock *lk_unlk)
{
@@ -2345,6 +2372,11 @@ bool opal_unlock_from_suspend(struct opal_dev *dev)
suspend->unlk.session.sum);
was_failure = true;
}
+ if (dev->mbr_enabled) {
+ ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key);
+ if (ret)
+ pr_debug("Failed to set MBR Done in S3 resume\n");
+ }
}
mutex_unlock(&dev->dev_lock);
return was_failure;
diff --git a/crypto/af_alg.c b/crypto/af_alg.c
index ffa9f4ccd9b4..337cf382718e 100644
--- a/crypto/af_alg.c
+++ b/crypto/af_alg.c
@@ -619,14 +619,14 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
struct af_alg_ctx *ctx = ask->private;
struct af_alg_tsgl *sgl;
struct scatterlist *sg;
- unsigned int i, j;
+ unsigned int i, j = 0;
while (!list_empty(&ctx->tsgl_list)) {
sgl = list_first_entry(&ctx->tsgl_list, struct af_alg_tsgl,
list);
sg = sgl->sg;
- for (i = 0, j = 0; i < sgl->cur; i++) {
+ for (i = 0; i < sgl->cur; i++) {
size_t plen = min_t(size_t, used, sg[i].length);
struct page *page = sg_page(sg + i);
diff --git a/crypto/drbg.c b/crypto/drbg.c
index 633a88e93ab0..70018397e59a 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -1133,10 +1133,10 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg)
{
if (!drbg)
return;
- kzfree(drbg->V);
- drbg->Vbuf = NULL;
- kzfree(drbg->C);
- drbg->Cbuf = NULL;
+ kzfree(drbg->Vbuf);
+ drbg->V = NULL;
+ kzfree(drbg->Cbuf);
+ drbg->C = NULL;
kzfree(drbg->scratchpadbuf);
drbg->scratchpadbuf = NULL;
drbg->reseed_ctr = 0;
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index e88fe3632dd6..0972ec0e2eb8 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -418,7 +418,7 @@ static int video_set_report_key_events(const struct dmi_system_id *id)
return 0;
}
-static struct dmi_system_id video_dmi_table[] = {
+static const struct dmi_system_id video_dmi_table[] = {
/*
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
*/
diff --git a/drivers/acpi/acpi_watchdog.c b/drivers/acpi/acpi_watchdog.c
index bf22c29d2517..11b113f8e367 100644
--- a/drivers/acpi/acpi_watchdog.c
+++ b/drivers/acpi/acpi_watchdog.c
@@ -66,7 +66,7 @@ void __init acpi_watchdog_init(void)
for (i = 0; i < wdat->entries; i++) {
const struct acpi_generic_address *gas;
struct resource_entry *rentry;
- struct resource res;
+ struct resource res = {};
bool found;
gas = &entries[i].register_region;
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 077f9bad6f44..3c3a37b8503b 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -743,17 +743,19 @@ static int ghes_proc(struct ghes *ghes)
}
ghes_do_proc(ghes, ghes->estatus);
+out:
+ ghes_clear_estatus(ghes);
+
+ if (rc == -ENOENT)
+ return rc;
+
/*
* GHESv2 type HEST entries introduce support for error acknowledgment,
* so only acknowledge the error if this support is present.
*/
- if (is_hest_type_generic_v2(ghes)) {
- rc = ghes_ack_error(ghes->generic_v2);
- if (rc)
- return rc;
- }
-out:
- ghes_clear_estatus(ghes);
+ if (is_hest_type_generic_v2(ghes))
+ return ghes_ack_error(ghes->generic_v2);
+
return rc;
}
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c
index 037fd537bbf6..995c4d8922b1 100644
--- a/drivers/acpi/blacklist.c
+++ b/drivers/acpi/blacklist.c
@@ -30,7 +30,7 @@
#include "internal.h"
-static struct dmi_system_id acpi_rev_dmi_table[] __initdata;
+static const struct dmi_system_id acpi_rev_dmi_table[] __initconst;
/*
* POLICY: If *anything* doesn't work, put it on the blacklist.
@@ -89,7 +89,7 @@ static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
}
#endif
-static struct dmi_system_id acpi_rev_dmi_table[] __initdata = {
+static const struct dmi_system_id acpi_rev_dmi_table[] __initconst = {
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
/*
* DELL XPS 13 (2015) switches sound between HDA and I2S
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 59f2f96fdb7e..4d0979e02a28 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -67,7 +67,7 @@ static int set_copy_dsdt(const struct dmi_system_id *id)
}
#endif
-static struct dmi_system_id dsdt_dmi_table[] __initdata = {
+static const struct dmi_system_id dsdt_dmi_table[] __initconst = {
/*
* Invoke DSDT corruption work-around on all Toshiba Satellite.
* https://bugzilla.kernel.org/show_bug.cgi?id=14679
@@ -83,7 +83,7 @@ static struct dmi_system_id dsdt_dmi_table[] __initdata = {
{}
};
#else
-static struct dmi_system_id dsdt_dmi_table[] __initdata = {
+static const struct dmi_system_id dsdt_dmi_table[] __initconst = {
{}
};
#endif
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index fdfae6f3c0b1..236b14324780 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1809,7 +1809,7 @@ static int ec_honor_ecdt_gpe(const struct dmi_system_id *id)
return 0;
}
-static struct dmi_system_id ec_dmi_table[] __initdata = {
+static const struct dmi_system_id ec_dmi_table[] __initconst = {
{
ec_correct_ecdt, "MSI MS-171F", {
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star"),
diff --git a/drivers/acpi/nfit/Kconfig b/drivers/acpi/nfit/Kconfig
index 6d3351452ea2..929ba4da0b30 100644
--- a/drivers/acpi/nfit/Kconfig
+++ b/drivers/acpi/nfit/Kconfig
@@ -2,7 +2,7 @@ config ACPI_NFIT
tristate "ACPI NVDIMM Firmware Interface Table (NFIT)"
depends on PHYS_ADDR_T_64BIT
depends on BLK_DEV
- depends on ARCH_HAS_MMIO_FLUSH
+ depends on ARCH_HAS_PMEM_API
select LIBNVDIMM
help
Infrastructure to probe ACPI 6 compliant platforms for
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 1893e416e7c0..9c2c49b6a240 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -228,6 +228,10 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
if (cmd == ND_CMD_CALL) {
call_pkg = buf;
func = call_pkg->nd_command;
+
+ for (i = 0; i < ARRAY_SIZE(call_pkg->nd_reserved2); i++)
+ if (call_pkg->nd_reserved2[i])
+ return -EINVAL;
}
if (nvdimm) {
@@ -1674,8 +1678,19 @@ static ssize_t range_index_show(struct device *dev,
}
static DEVICE_ATTR_RO(range_index);
+static ssize_t ecc_unit_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct nd_region *nd_region = to_nd_region(dev);
+ struct nfit_spa *nfit_spa = nd_region_provider_data(nd_region);
+
+ return sprintf(buf, "%d\n", nfit_spa->clear_err_unit);
+}
+static DEVICE_ATTR_RO(ecc_unit_size);
+
static struct attribute *acpi_nfit_region_attributes[] = {
&dev_attr_range_index.attr,
+ &dev_attr_ecc_unit_size.attr,
NULL,
};
@@ -1804,6 +1819,7 @@ static int acpi_nfit_init_interleave_set(struct acpi_nfit_desc *acpi_desc,
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
struct acpi_nfit_memory_map *memdev = memdev_from_spa(acpi_desc,
spa->range_index, i);
+ struct acpi_nfit_control_region *dcr = nfit_mem->dcr;
if (!memdev || !nfit_mem->dcr) {
dev_err(dev, "%s: failed to find DCR\n", __func__);
@@ -1811,13 +1827,13 @@ static int acpi_nfit_init_interleave_set(struct acpi_nfit_desc *acpi_desc,
}
map->region_offset = memdev->region_offset;
- map->serial_number = nfit_mem->dcr->serial_number;
+ map->serial_number = dcr->serial_number;
map2->region_offset = memdev->region_offset;
- map2->serial_number = nfit_mem->dcr->serial_number;
- map2->vendor_id = nfit_mem->dcr->vendor_id;
- map2->manufacturing_date = nfit_mem->dcr->manufacturing_date;
- map2->manufacturing_location = nfit_mem->dcr->manufacturing_location;
+ map2->serial_number = dcr->serial_number;
+ map2->vendor_id = dcr->vendor_id;
+ map2->manufacturing_date = dcr->manufacturing_date;
+ map2->manufacturing_location = dcr->manufacturing_location;
}
/* v1.1 namespaces */
@@ -1835,6 +1851,28 @@ static int acpi_nfit_init_interleave_set(struct acpi_nfit_desc *acpi_desc,
cmp_map_compat, NULL);
nd_set->altcookie = nd_fletcher64(info, sizeof_nfit_set_info(nr), 0);
+ /* record the result of the sort for the mapping position */
+ for (i = 0; i < nr; i++) {
+ struct nfit_set_info_map2 *map2 = &info2->mapping[i];
+ int j;
+
+ for (j = 0; j < nr; j++) {
+ struct nd_mapping_desc *mapping = &ndr_desc->mapping[j];
+ struct nvdimm *nvdimm = mapping->nvdimm;
+ struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
+ struct acpi_nfit_control_region *dcr = nfit_mem->dcr;
+
+ if (map2->serial_number == dcr->serial_number &&
+ map2->vendor_id == dcr->vendor_id &&
+ map2->manufacturing_date == dcr->manufacturing_date &&
+ map2->manufacturing_location
+ == dcr->manufacturing_location) {
+ mapping->position = i;
+ break;
+ }
+ }
+ }
+
ndr_desc->nd_set = nd_set;
devm_kfree(dev, info);
devm_kfree(dev, info2);
@@ -1930,7 +1968,7 @@ static int acpi_nfit_blk_single_io(struct nfit_blk *nfit_blk,
memcpy_flushcache(mmio->addr.aperture + offset, iobuf + copied, c);
else {
if (nfit_blk->dimm_flags & NFIT_BLK_READ_FLUSH)
- mmio_flush_range((void __force *)
+ arch_invalidate_pmem((void __force *)
mmio->addr.aperture + offset, c);
memcpy(iobuf + copied, mmio->addr.aperture + offset, c);
diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
index 19cdd8a783a9..76998a51bf99 100644
--- a/drivers/acpi/osi.c
+++ b/drivers/acpi/osi.c
@@ -312,7 +312,7 @@ static int __init dmi_disable_osi_win8(const struct dmi_system_id *d)
* Note that _OSI("Linux")/_OSI("Darwin") determined here can be overridden
* by acpi_osi=!Linux/acpi_osi=!Darwin command line options.
*/
-static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
+static const struct dmi_system_id acpi_osi_dmi_table[] __initconst = {
{
.callback = dmi_disable_osi_vista,
.ident = "Fujitsu Siemens",
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index f62c68e24317..e90b61f7d2db 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -174,7 +174,7 @@ static int do_sta_before_sun(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id acpi_pci_slot_dmi_table[] __initdata = {
+static const struct dmi_system_id acpi_pci_slot_dmi_table[] __initconst = {
/*
* Fujitsu Primequest machines will return 1023 to indicate an
* error if the _SUN method is evaluated on SxFy objects that
diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c
index 7cfbda4d7c51..74f738cb6073 100644
--- a/drivers/acpi/processor_pdc.c
+++ b/drivers/acpi/processor_pdc.c
@@ -173,7 +173,7 @@ static int __init set_no_mwait(const struct dmi_system_id *id)
return 0;
}
-static struct dmi_system_id processor_idle_dmi_table[] __initdata = {
+static const struct dmi_system_id processor_idle_dmi_table[] __initconst = {
{
set_no_mwait, "Extensa 5220", {
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
index c1c216163de3..3fb8ff513461 100644
--- a/drivers/acpi/property.c
+++ b/drivers/acpi/property.c
@@ -908,11 +908,12 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
struct fwnode_handle *child)
{
const struct acpi_device *adev = to_acpi_device_node(fwnode);
- struct acpi_device *child_adev = NULL;
const struct list_head *head;
struct list_head *next;
if (!child || is_acpi_device_node(child)) {
+ struct acpi_device *child_adev;
+
if (adev)
head = &adev->children;
else
@@ -922,8 +923,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
goto nondev;
if (child) {
- child_adev = to_acpi_device_node(child);
- next = child_adev->node.next;
+ adev = to_acpi_device_node(child);
+ next = adev->node.next;
if (next == head) {
child = NULL;
goto nondev;
@@ -941,8 +942,8 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
const struct acpi_data_node *data = to_acpi_data_node(fwnode);
struct acpi_data_node *dn;
- if (child_adev)
- head = &child_adev->data.subnodes;
+ if (adev)
+ head = &adev->data.subnodes;
else if (data)
head = &data->data.subnodes;
else
@@ -1293,3 +1294,16 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops);
DECLARE_ACPI_FWNODE_OPS(acpi_data_fwnode_ops);
const struct fwnode_operations acpi_static_fwnode_ops;
+
+bool is_acpi_device_node(const struct fwnode_handle *fwnode)
+{
+ return !IS_ERR_OR_NULL(fwnode) &&
+ fwnode->ops == &acpi_device_fwnode_ops;
+}
+EXPORT_SYMBOL(is_acpi_device_node);
+
+bool is_acpi_data_node(const struct fwnode_handle *fwnode)
+{
+ return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
+}
+EXPORT_SYMBOL(is_acpi_data_node);
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 9fdd014759f8..6804ddab3052 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -160,7 +160,7 @@ static int __init init_nvs_nosave(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id acpisleep_dmi_table[] __initdata = {
+static const struct dmi_system_id acpisleep_dmi_table[] __initconst = {
{
.callback = init_old_suspend_ordering,
.ident = "Abit KN9 (nForce4 variant)",
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 1d0417b87cb7..551b71a24b85 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -1209,7 +1209,7 @@ static int thermal_psv(const struct dmi_system_id *d) {
return 0;
}
-static struct dmi_system_id thermal_dmi_table[] __initdata = {
+static const struct dmi_system_id thermal_dmi_table[] __initconst = {
/*
* Award BIOS on this AOpen makes thermal control almost worthless.
* http://bugzilla.kernel.org/show_bug.cgi?id=8842
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index d055b3f2a207..ab34239a76ee 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -2217,7 +2217,7 @@ static void binder_transaction_buffer_release(struct binder_proc *proc,
debug_id, (u64)fda->num_fds);
continue;
}
- fd_array = (u32 *)(parent_buffer + fda->parent_offset);
+ fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
for (fd_index = 0; fd_index < fda->num_fds; fd_index++)
task_close_fd(proc, fd_array[fd_index]);
} break;
@@ -2326,7 +2326,6 @@ static int binder_translate_handle(struct flat_binder_object *fp,
(u64)node->ptr);
binder_node_unlock(node);
} else {
- int ret;
struct binder_ref_data dest_rdata;
binder_node_unlock(node);
@@ -2442,7 +2441,7 @@ static int binder_translate_fd_array(struct binder_fd_array_object *fda,
*/
parent_buffer = parent->buffer -
binder_alloc_get_user_buffer_offset(&target_proc->alloc);
- fd_array = (u32 *)(parent_buffer + fda->parent_offset);
+ fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
if (!IS_ALIGNED((unsigned long)fd_array, sizeof(u32))) {
binder_user_error("%d:%d parent offset not aligned correctly.\n",
proc->pid, thread->pid);
@@ -2508,7 +2507,7 @@ static int binder_fixup_parent(struct binder_transaction *t,
proc->pid, thread->pid);
return -EINVAL;
}
- parent_buffer = (u8 *)(parent->buffer -
+ parent_buffer = (u8 *)((uintptr_t)parent->buffer -
binder_alloc_get_user_buffer_offset(
&target_proc->alloc));
*(binder_uintptr_t *)(parent_buffer + bp->parent_offset) = bp->buffer;
@@ -3083,6 +3082,7 @@ static void binder_transaction(struct binder_proc *proc,
err_dead_proc_or_thread:
return_error = BR_DEAD_REPLY;
return_error_line = __LINE__;
+ binder_dequeue_work(proc, tcomplete);
err_translate_failed:
err_bad_object_type:
err_bad_offset:
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index 8fe165844e47..064f5e31ec55 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -913,6 +913,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
struct binder_alloc *alloc;
uintptr_t page_addr;
size_t index;
+ struct vm_area_struct *vma;
alloc = page->alloc;
if (!mutex_trylock(&alloc->mutex))
@@ -923,16 +924,22 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
index = page - alloc->pages;
page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE;
- if (alloc->vma) {
+ vma = alloc->vma;
+ if (vma) {
mm = get_task_mm(alloc->tsk);
if (!mm)
goto err_get_task_mm_failed;
if (!down_write_trylock(&mm->mmap_sem))
goto err_down_write_mmap_sem_failed;
+ }
+
+ list_lru_isolate(lru, item);
+ spin_unlock(lock);
+ if (vma) {
trace_binder_unmap_user_start(alloc, index);
- zap_page_range(alloc->vma,
+ zap_page_range(vma,
page_addr + alloc->user_buffer_offset,
PAGE_SIZE);
@@ -950,13 +957,12 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
trace_binder_unmap_kernel_end(alloc, index);
- list_lru_isolate(lru, item);
-
+ spin_lock(lock);
mutex_unlock(&alloc->mutex);
- return LRU_REMOVED;
+ return LRU_REMOVED_RETRY;
err_down_write_mmap_sem_failed:
- mmput(mm);
+ mmput_async(mm);
err_get_task_mm_failed:
err_page_already_freed:
mutex_unlock(&alloc->mutex);
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index cb9b0e9090e3..9f78bb03bb76 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -621,8 +621,11 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev,
static int ahci_pci_reset_controller(struct ata_host *host)
{
struct pci_dev *pdev = to_pci_dev(host->dev);
+ int rc;
- ahci_reset_controller(host);
+ rc = ahci_reset_controller(host);
+ if (rc)
+ return rc;
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
struct ahci_host_priv *hpriv = host->private_data;
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 8401c3b5be92..b702c20fbc2b 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -492,6 +492,7 @@ static const struct ich_laptop ich_laptop[] = {
{ 0x27DF, 0x152D, 0x0778 }, /* ICH7 on unknown Intel */
{ 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */
{ 0x24CA, 0x1025, 0x003d }, /* ICH4 on ACER TM290 */
+ { 0x24CA, 0x10CF, 0x11AB }, /* ICH4M on Fujitsu-Siemens Lifebook S6120 */
{ 0x266F, 0x1025, 0x0066 }, /* ICH6 on ACER Aspire 1694WLMi */
{ 0x2653, 0x1043, 0x82D8 }, /* ICH6M on Asus Eee 701 */
{ 0x27df, 0x104d, 0x900e }, /* ICH7 on Sony TZ-90 */
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 1945a8ea2099..ee4c1ec9dca0 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3234,19 +3234,19 @@ static const struct ata_timing ata_timing[] = {
};
#define ENOUGH(v, unit) (((v)-1)/(unit)+1)
-#define EZ(v, unit) ((v)?ENOUGH(v, unit):0)
+#define EZ(v, unit) ((v)?ENOUGH(((v) * 1000), unit):0)
static void ata_timing_quantize(const struct ata_timing *t, struct ata_timing *q, int T, int UT)
{
- q->setup = EZ(t->setup * 1000, T);
- q->act8b = EZ(t->act8b * 1000, T);
- q->rec8b = EZ(t->rec8b * 1000, T);
- q->cyc8b = EZ(t->cyc8b * 1000, T);
- q->active = EZ(t->active * 1000, T);
- q->recover = EZ(t->recover * 1000, T);
- q->dmack_hold = EZ(t->dmack_hold * 1000, T);
- q->cycle = EZ(t->cycle * 1000, T);
- q->udma = EZ(t->udma * 1000, UT);
+ q->setup = EZ(t->setup, T);
+ q->act8b = EZ(t->act8b, T);
+ q->rec8b = EZ(t->rec8b, T);
+ q->cyc8b = EZ(t->cyc8b, T);
+ q->active = EZ(t->active, T);
+ q->recover = EZ(t->recover, T);
+ q->dmack_hold = EZ(t->dmack_hold, T);
+ q->cycle = EZ(t->cycle, T);
+ q->udma = EZ(t->udma, UT);
}
void ata_timing_merge(const struct ata_timing *a, const struct ata_timing *b,
diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c
index cfeb049a01ef..642afd88870b 100644
--- a/drivers/auxdisplay/charlcd.c
+++ b/drivers/auxdisplay/charlcd.c
@@ -647,18 +647,25 @@ static ssize_t charlcd_write(struct file *file, const char __user *buf,
static int charlcd_open(struct inode *inode, struct file *file)
{
struct charlcd_priv *priv = to_priv(the_charlcd);
+ int ret;
+ ret = -EBUSY;
if (!atomic_dec_and_test(&charlcd_available))
- return -EBUSY; /* open only once at a time */
+ goto fail; /* open only once at a time */
+ ret = -EPERM;
if (file->f_mode & FMODE_READ) /* device is write-only */
- return -EPERM;
+ goto fail;
if (priv->must_clear) {
charlcd_clear_display(&priv->lcd);
priv->must_clear = false;
}
return nonseekable_open(inode, file);
+
+ fail:
+ atomic_inc(&charlcd_available);
+ return ret;
}
static int charlcd_release(struct inode *inode, struct file *file)
diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c
index df126dcdaf18..6911acd896d9 100644
--- a/drivers/auxdisplay/panel.c
+++ b/drivers/auxdisplay/panel.c
@@ -1105,14 +1105,21 @@ static ssize_t keypad_read(struct file *file,
static int keypad_open(struct inode *inode, struct file *file)
{
+ int ret;
+
+ ret = -EBUSY;
if (!atomic_dec_and_test(&keypad_available))
- return -EBUSY; /* open only once at a time */
+ goto fail; /* open only once at a time */
+ ret = -EPERM;
if (file->f_mode & FMODE_WRITE) /* device is read-only */
- return -EPERM;
+ goto fail;
keypad_buflen = 0; /* flush the buffer on opening */
return 0;
+ fail:
+ atomic_inc(&keypad_available);
+ return ret;
}
static int keypad_release(struct inode *inode, struct file *file)
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index f046d21de57d..1a5f6a157a57 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -140,13 +140,10 @@ config EXTRA_FIRMWARE
config EXTRA_FIRMWARE_DIR
string "Firmware blobs root directory"
depends on EXTRA_FIRMWARE != ""
- default "firmware"
+ default "/lib/firmware"
help
This option controls the directory in which the kernel build system
looks for the firmware files listed in the EXTRA_FIRMWARE option.
- The default is firmware/ in the kernel source tree, but by changing
- this option you can point it elsewhere, such as /lib/firmware/ or
- some other directory containing the firmware files.
config FW_LOADER_USER_HELPER
bool
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index 41be9ff7d70a..6df7d6676a48 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -166,11 +166,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
}
#ifdef CONFIG_CPU_FREQ
-static cpumask_var_t cpus_to_visit;
-static void parsing_done_workfn(struct work_struct *work);
-static DECLARE_WORK(parsing_done_work, parsing_done_workfn);
+static cpumask_var_t cpus_to_visit __initdata;
+static void __init parsing_done_workfn(struct work_struct *work);
+static __initdata DECLARE_WORK(parsing_done_work, parsing_done_workfn);
-static int
+static int __init
init_cpu_capacity_callback(struct notifier_block *nb,
unsigned long val,
void *data)
@@ -206,7 +206,7 @@ init_cpu_capacity_callback(struct notifier_block *nb,
return 0;
}
-static struct notifier_block init_cpu_capacity_notifier = {
+static struct notifier_block init_cpu_capacity_notifier __initdata = {
.notifier_call = init_cpu_capacity_callback,
};
@@ -232,7 +232,7 @@ static int __init register_cpufreq_notifier(void)
}
core_initcall(register_cpufreq_notifier);
-static void parsing_done_workfn(struct work_struct *work)
+static void __init parsing_done_workfn(struct work_struct *work)
{
cpufreq_unregister_notifier(&init_cpu_capacity_notifier,
CPUFREQ_POLICY_NOTIFIER);
diff --git a/drivers/base/dma-coherent.c b/drivers/base/dma-coherent.c
index 1c152aed6b82..744f64f43454 100644
--- a/drivers/base/dma-coherent.c
+++ b/drivers/base/dma-coherent.c
@@ -37,7 +37,7 @@ static inline dma_addr_t dma_get_device_base(struct device *dev,
return mem->device_base;
}
-static bool dma_init_coherent_memory(
+static int dma_init_coherent_memory(
phys_addr_t phys_addr, dma_addr_t device_addr, size_t size, int flags,
struct dma_coherent_mem **mem)
{
@@ -45,25 +45,28 @@ static bool dma_init_coherent_memory(
void __iomem *mem_base = NULL;
int pages = size >> PAGE_SHIFT;
int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long);
+ int ret;
- if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
- goto out;
- if (!size)
+ if (!size) {
+ ret = -EINVAL;
goto out;
+ }
- if (flags & DMA_MEMORY_MAP)
- mem_base = memremap(phys_addr, size, MEMREMAP_WC);
- else
- mem_base = ioremap(phys_addr, size);
- if (!mem_base)
+ mem_base = memremap(phys_addr, size, MEMREMAP_WC);
+ if (!mem_base) {
+ ret = -EINVAL;
goto out;
-
+ }
dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
- if (!dma_mem)
+ if (!dma_mem) {
+ ret = -ENOMEM;
goto out;
+ }
dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
- if (!dma_mem->bitmap)
+ if (!dma_mem->bitmap) {
+ ret = -ENOMEM;
goto out;
+ }
dma_mem->virt_base = mem_base;
dma_mem->device_base = device_addr;
@@ -73,17 +76,13 @@ static bool dma_init_coherent_memory(
spin_lock_init(&dma_mem->spinlock);
*mem = dma_mem;
- return true;
+ return 0;
out:
kfree(dma_mem);
- if (mem_base) {
- if (flags & DMA_MEMORY_MAP)
- memunmap(mem_base);
- else
- iounmap(mem_base);
- }
- return false;
+ if (mem_base)
+ memunmap(mem_base);
+ return ret;
}
static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
@@ -91,10 +90,7 @@ static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
if (!mem)
return;
- if (mem->flags & DMA_MEMORY_MAP)
- memunmap(mem->virt_base);
- else
- iounmap(mem->virt_base);
+ memunmap(mem->virt_base);
kfree(mem->bitmap);
kfree(mem);
}
@@ -109,8 +105,6 @@ static int dma_assign_coherent_memory(struct device *dev,
return -EBUSY;
dev->dma_mem = mem;
- /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
-
return 0;
}
@@ -118,16 +112,16 @@ int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
dma_addr_t device_addr, size_t size, int flags)
{
struct dma_coherent_mem *mem;
+ int ret;
- if (!dma_init_coherent_memory(phys_addr, device_addr, size, flags,
- &mem))
- return 0;
-
- if (dma_assign_coherent_memory(dev, mem) == 0)
- return flags & DMA_MEMORY_MAP ? DMA_MEMORY_MAP : DMA_MEMORY_IO;
+ ret = dma_init_coherent_memory(phys_addr, device_addr, size, flags, &mem);
+ if (ret)
+ return ret;
- dma_release_coherent_memory(mem);
- return 0;
+ ret = dma_assign_coherent_memory(dev, mem);
+ if (ret)
+ dma_release_coherent_memory(mem);
+ return ret;
}
EXPORT_SYMBOL(dma_declare_coherent_memory);
@@ -171,7 +165,6 @@ static void *__dma_alloc_from_coherent(struct dma_coherent_mem *mem,
int order = get_order(size);
unsigned long flags;
int pageno;
- int dma_memory_map;
void *ret;
spin_lock_irqsave(&mem->spinlock, flags);
@@ -188,15 +181,9 @@ static void *__dma_alloc_from_coherent(struct dma_coherent_mem *mem,
*/
*dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
ret = mem->virt_base + (pageno << PAGE_SHIFT);
- dma_memory_map = (mem->flags & DMA_MEMORY_MAP);
spin_unlock_irqrestore(&mem->spinlock, flags);
- if (dma_memory_map)
- memset(ret, 0, size);
- else
- memset_io(ret, 0, size);
-
+ memset(ret, 0, size);
return ret;
-
err:
spin_unlock_irqrestore(&mem->spinlock, flags);
return NULL;
@@ -359,14 +346,17 @@ static struct reserved_mem *dma_reserved_default_memory __initdata;
static int rmem_dma_device_init(struct reserved_mem *rmem, struct device *dev)
{
struct dma_coherent_mem *mem = rmem->priv;
+ int ret;
- if (!mem &&
- !dma_init_coherent_memory(rmem->base, rmem->base, rmem->size,
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE,
- &mem)) {
- pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %ld MiB\n",
- &rmem->base, (unsigned long)rmem->size / SZ_1M);
- return -ENODEV;
+ if (!mem) {
+ ret = dma_init_coherent_memory(rmem->base, rmem->base,
+ rmem->size,
+ DMA_MEMORY_EXCLUSIVE, &mem);
+ if (ret) {
+ pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %ld MiB\n",
+ &rmem->base, (unsigned long)rmem->size / SZ_1M);
+ return ret;
+ }
}
mem->use_dev_dma_pfn_offset = true;
rmem->priv = mem;
diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c
index b555ff9dd8fc..e584eddef0a7 100644
--- a/drivers/base/dma-mapping.c
+++ b/drivers/base/dma-mapping.c
@@ -176,13 +176,10 @@ int dmam_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
rc = dma_declare_coherent_memory(dev, phys_addr, device_addr, size,
flags);
- if (rc) {
+ if (!rc)
devres_add(dev, res);
- rc = 0;
- } else {
+ else
devres_free(res);
- rc = -ENOMEM;
- }
return rc;
}
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index a5fb884a136d..4b57cf5bc81d 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -258,38 +258,6 @@ static int fw_cache_piggyback_on_request(const char *name);
* guarding for corner cases a global lock should be OK */
static DEFINE_MUTEX(fw_lock);
-static bool __enable_firmware = false;
-
-static void enable_firmware(void)
-{
- mutex_lock(&fw_lock);
- __enable_firmware = true;
- mutex_unlock(&fw_lock);
-}
-
-static void disable_firmware(void)
-{
- mutex_lock(&fw_lock);
- __enable_firmware = false;
- mutex_unlock(&fw_lock);
-}
-
-/*
- * When disabled only the built-in firmware and the firmware cache will be
- * used to look for firmware.
- */
-static bool firmware_enabled(void)
-{
- bool enabled = false;
-
- mutex_lock(&fw_lock);
- if (__enable_firmware)
- enabled = true;
- mutex_unlock(&fw_lock);
-
- return enabled;
-}
-
static struct firmware_cache fw_cache;
static struct firmware_buf *__allocate_fw_buf(const char *fw_name,
@@ -1246,12 +1214,6 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
if (ret <= 0) /* error or already assigned */
goto out;
- if (!firmware_enabled()) {
- WARN(1, "firmware request while host is not available\n");
- ret = -EHOSTDOWN;
- goto out;
- }
-
ret = fw_get_filesystem_firmware(device, fw->priv);
if (ret) {
if (!(opt_flags & FW_OPT_NO_WARN))
@@ -1762,62 +1724,6 @@ static void device_uncache_fw_images_delay(unsigned long delay)
msecs_to_jiffies(delay));
}
-/**
- * fw_pm_notify - notifier for suspend/resume
- * @notify_block: unused
- * @mode: mode we are switching to
- * @unused: unused
- *
- * Used to modify the firmware_class state as we move in between states.
- * The firmware_class implements a firmware cache to enable device driver
- * to fetch firmware upon resume before the root filesystem is ready. We
- * disable API calls which do not use the built-in firmware or the firmware
- * cache when we know these calls will not work.
- *
- * The inner logic behind all this is a bit complex so it is worth summarizing
- * the kernel's own suspend/resume process with context and focus on how this
- * can impact the firmware API.
- *
- * First a review on how we go to suspend::
- *
- * pm_suspend() --> enter_state() -->
- * sys_sync()
- * suspend_prepare() -->
- * __pm_notifier_call_chain(PM_SUSPEND_PREPARE, ...);
- * suspend_freeze_processes() -->
- * freeze_processes() -->
- * __usermodehelper_set_disable_depth(UMH_DISABLED);
- * freeze all tasks ...
- * freeze_kernel_threads()
- * suspend_devices_and_enter() -->
- * dpm_suspend_start() -->
- * dpm_prepare()
- * dpm_suspend()
- * suspend_enter() -->
- * platform_suspend_prepare()
- * dpm_suspend_late()
- * freeze_enter()
- * syscore_suspend()
- *
- * When we resume we bail out of a loop from suspend_devices_and_enter() and
- * unwind back out to the caller enter_state() where we were before as follows::
- *
- * enter_state() -->
- * suspend_devices_and_enter() --> (bail from loop)
- * dpm_resume_end() -->
- * dpm_resume()
- * dpm_complete()
- * suspend_finish() -->
- * suspend_thaw_processes() -->
- * thaw_processes() -->
- * __usermodehelper_set_disable_depth(UMH_FREEZING);
- * thaw_workqueues();
- * thaw all processes ...
- * usermodehelper_enable();
- * pm_notifier_call_chain(PM_POST_SUSPEND);
- *
- * fw_pm_notify() works through pm_notifier_call_chain().
- */
static int fw_pm_notify(struct notifier_block *notify_block,
unsigned long mode, void *unused)
{
@@ -1831,7 +1737,6 @@ static int fw_pm_notify(struct notifier_block *notify_block,
*/
kill_pending_fw_fallback_reqs(true);
device_cache_fw_images();
- disable_firmware();
break;
case PM_POST_SUSPEND:
@@ -1844,7 +1749,6 @@ static int fw_pm_notify(struct notifier_block *notify_block,
mutex_lock(&fw_lock);
fw_cache.state = FW_LOADER_NO_CACHE;
mutex_unlock(&fw_lock);
- enable_firmware();
device_uncache_fw_images_delay(10 * MSEC_PER_SEC);
break;
@@ -1893,7 +1797,6 @@ static void __init fw_cache_init(void)
static int fw_shutdown_notify(struct notifier_block *unused1,
unsigned long unused2, void *unused3)
{
- disable_firmware();
/*
* Kill all pending fallback requests to avoid both stalling shutdown,
* and avoid a deadlock with the usermode_lock.
@@ -1909,7 +1812,6 @@ static struct notifier_block fw_shutdown_nb = {
static int __init firmware_class_init(void)
{
- enable_firmware();
fw_cache_init();
register_reboot_notifier(&fw_shutdown_nb);
#ifdef CONFIG_FW_LOADER_USER_HELPER
@@ -1921,7 +1823,6 @@ static int __init firmware_class_init(void)
static void __exit firmware_class_exit(void)
{
- disable_firmware();
#ifdef CONFIG_PM_SLEEP
unregister_syscore_ops(&fw_syscore_ops);
unregister_pm_notifier(&fw_cache.pm_notify);
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index d1bd99271066..9045c5f3734e 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -868,7 +868,8 @@ static ssize_t driver_override_store(struct device *dev,
struct platform_device *pdev = to_platform_device(dev);
char *driver_override, *old, *cp;
- if (count > PATH_MAX)
+ /* We need to keep extra room for a newline */
+ if (count >= (PAGE_SIZE - 1))
return -EINVAL;
driver_override = kstrndup(buf, count, GFP_KERNEL);
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index ea1732ed7a9d..770b1539a083 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1860,10 +1860,13 @@ void device_pm_check_callbacks(struct device *dev)
{
spin_lock_irq(&dev->power.lock);
dev->power.no_pm_callbacks =
- (!dev->bus || pm_ops_is_empty(dev->bus->pm)) &&
- (!dev->class || pm_ops_is_empty(dev->class->pm)) &&
+ (!dev->bus || (pm_ops_is_empty(dev->bus->pm) &&
+ !dev->bus->suspend && !dev->bus->resume)) &&
+ (!dev->class || (pm_ops_is_empty(dev->class->pm) &&
+ !dev->class->suspend && !dev->class->resume)) &&
(!dev->type || pm_ops_is_empty(dev->type->pm)) &&
(!dev->pm_domain || pm_ops_is_empty(&dev->pm_domain->ops)) &&
- (!dev->driver || pm_ops_is_empty(dev->driver->pm));
+ (!dev->driver || (pm_ops_is_empty(dev->driver->pm) &&
+ !dev->driver->suspend && !dev->driver->resume));
spin_unlock_irq(&dev->power.lock);
}
diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c
index a8cc14fd8ae4..a6de32530693 100644
--- a/drivers/base/power/opp/core.c
+++ b/drivers/base/power/opp/core.c
@@ -1581,6 +1581,9 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
opp->available = availability_req;
+ dev_pm_opp_get(opp);
+ mutex_unlock(&opp_table->lock);
+
/* Notify the change of the OPP availability */
if (availability_req)
blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ENABLE,
@@ -1589,8 +1592,12 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
blocking_notifier_call_chain(&opp_table->head,
OPP_EVENT_DISABLE, opp);
+ dev_pm_opp_put(opp);
+ goto put_table;
+
unlock:
mutex_unlock(&opp_table->lock);
+put_table:
dev_pm_opp_put_opp_table(opp_table);
return r;
}
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c
index f850daeffba4..277d43a83f53 100644
--- a/drivers/base/power/qos.c
+++ b/drivers/base/power/qos.c
@@ -277,11 +277,11 @@ void dev_pm_qos_constraints_destroy(struct device *dev)
mutex_unlock(&dev_pm_qos_sysfs_mtx);
}
-static bool dev_pm_qos_invalid_request(struct device *dev,
- struct dev_pm_qos_request *req)
+static bool dev_pm_qos_invalid_req_type(struct device *dev,
+ enum dev_pm_qos_req_type type)
{
- return !req || (req->type == DEV_PM_QOS_LATENCY_TOLERANCE
- && !dev->power.set_latency_tolerance);
+ return type == DEV_PM_QOS_LATENCY_TOLERANCE &&
+ !dev->power.set_latency_tolerance;
}
static int __dev_pm_qos_add_request(struct device *dev,
@@ -290,7 +290,7 @@ static int __dev_pm_qos_add_request(struct device *dev,
{
int ret = 0;
- if (!dev || dev_pm_qos_invalid_request(dev, req))
+ if (!dev || !req || dev_pm_qos_invalid_req_type(dev, type))
return -EINVAL;
if (WARN(dev_pm_qos_request_active(req),
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index bbd0d186cfc0..2d7178f7754e 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -342,7 +342,7 @@ static long __brd_direct_access(struct brd_device *brd, pgoff_t pgoff,
if (!brd)
return -ENODEV;
- page = brd_insert_page(brd, PFN_PHYS(pgoff) / 512);
+ page = brd_insert_page(brd, (sector_t)pgoff << PAGE_SECTORS_SHIFT);
if (!page)
return -ENOSPC;
*kaddr = page_address(page);
diff --git a/drivers/block/loop.h b/drivers/block/loop.h
index f68c1d50802f..1f3956702993 100644
--- a/drivers/block/loop.h
+++ b/drivers/block/loop.h
@@ -67,10 +67,8 @@ struct loop_device {
struct loop_cmd {
struct kthread_work work;
struct request *rq;
- union {
- bool use_aio; /* use AIO interface to handle I/O */
- atomic_t ref; /* only for aio */
- };
+ bool use_aio; /* use AIO interface to handle I/O */
+ atomic_t ref; /* only for aio */
long ret;
struct kiocb iocb;
struct bio_vec *bvec;
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 2aa87cbdede0..3684e21d543f 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1194,6 +1194,12 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode,
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
+ /* The block layer will pass back some non-nbd ioctls in case we have
+ * special handling for them, but we don't so just return an error.
+ */
+ if (_IOC_TYPE(cmd) != 0xab)
+ return -EINVAL;
+
mutex_lock(&nbd->config_lock);
/* Don't allow ioctl operations on a nbd device that was created with
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index b008b6a98098..b640ad8a6d20 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3435,7 +3435,7 @@ static void rbd_acquire_lock(struct work_struct *work)
struct rbd_device *rbd_dev = container_of(to_delayed_work(work),
struct rbd_device, lock_dwork);
enum rbd_lock_state lock_state;
- int ret;
+ int ret = 0;
dout("%s rbd_dev %p\n", __func__, rbd_dev);
again:
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 2981c27d3aae..f149d3e61234 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -766,27 +766,6 @@ static void zram_slot_unlock(struct zram *zram, u32 index)
bit_spin_unlock(ZRAM_ACCESS, &zram->table[index].value);
}
-static bool zram_same_page_read(struct zram *zram, u32 index,
- struct page *page,
- unsigned int offset, unsigned int len)
-{
- zram_slot_lock(zram, index);
- if (unlikely(!zram_get_handle(zram, index) ||
- zram_test_flag(zram, index, ZRAM_SAME))) {
- void *mem;
-
- zram_slot_unlock(zram, index);
- mem = kmap_atomic(page);
- zram_fill_page(mem + offset, len,
- zram_get_element(zram, index));
- kunmap_atomic(mem);
- return true;
- }
- zram_slot_unlock(zram, index);
-
- return false;
-}
-
static void zram_meta_free(struct zram *zram, u64 disksize)
{
size_t num_pages = disksize >> PAGE_SHIFT;
@@ -884,11 +863,20 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
zram_slot_unlock(zram, index);
}
- if (zram_same_page_read(zram, index, page, 0, PAGE_SIZE))
- return 0;
-
zram_slot_lock(zram, index);
handle = zram_get_handle(zram, index);
+ if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) {
+ unsigned long value;
+ void *mem;
+
+ value = handle ? zram_get_element(zram, index) : 0;
+ mem = kmap_atomic(page);
+ zram_fill_page(mem, PAGE_SIZE, value);
+ kunmap_atomic(mem);
+ zram_slot_unlock(zram, index);
+ return 0;
+ }
+
size = zram_get_obj_size(zram, index);
src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig
index 2408ea38a39c..ae3d8f3444b9 100644
--- a/drivers/bus/Kconfig
+++ b/drivers/bus/Kconfig
@@ -132,7 +132,7 @@ config SIMPLE_PM_BUS
config SUNXI_RSB
tristate "Allwinner sunXi Reduced Serial Bus Driver"
- default MACH_SUN8I || MACH_SUN9I
+ default MACH_SUN8I || MACH_SUN9I || ARM64
depends on ARCH_SUNXI
select REGMAP
help
diff --git a/drivers/bus/arm-cci.c b/drivers/bus/arm-cci.c
index c49da15d9790..3c29d36702a8 100644
--- a/drivers/bus/arm-cci.c
+++ b/drivers/bus/arm-cci.c
@@ -2124,8 +2124,8 @@ int notrace __cci_control_port_by_device(struct device_node *dn, bool enable)
return -ENODEV;
port = __cci_ace_get_port(dn, ACE_LITE_PORT);
- if (WARN_ONCE(port < 0, "node %s ACE lite port look-up failure\n",
- dn->full_name))
+ if (WARN_ONCE(port < 0, "node %pOF ACE lite port look-up failure\n",
+ dn))
return -ENODEV;
cci_port_control(port, enable);
return 0;
@@ -2200,14 +2200,14 @@ static int cci_probe_ports(struct device_node *np)
if (of_property_read_string(cp, "interface-type",
&match_str)) {
- WARN(1, "node %s missing interface-type property\n",
- cp->full_name);
+ WARN(1, "node %pOF missing interface-type property\n",
+ cp);
continue;
}
is_ace = strcmp(match_str, "ace") == 0;
if (!is_ace && strcmp(match_str, "ace-lite")) {
- WARN(1, "node %s containing invalid interface-type property, skipping it\n",
- cp->full_name);
+ WARN(1, "node %pOF containing invalid interface-type property, skipping it\n",
+ cp);
continue;
}
diff --git a/drivers/bus/imx-weim.c b/drivers/bus/imx-weim.c
index 4bd361d64270..3d56ebcda720 100644
--- a/drivers/bus/imx-weim.c
+++ b/drivers/bus/imx-weim.c
@@ -156,8 +156,8 @@ static int __init weim_parse_dt(struct platform_device *pdev,
ret = weim_timing_setup(child, base, devtype);
if (ret)
- dev_warn(&pdev->dev, "%s set timing failed.\n",
- child->full_name);
+ dev_warn(&pdev->dev, "%pOF set timing failed.\n",
+ child);
else
have_child = 1;
}
@@ -166,8 +166,8 @@ static int __init weim_parse_dt(struct platform_device *pdev,
ret = of_platform_default_populate(pdev->dev.of_node,
NULL, &pdev->dev);
if (ret)
- dev_err(&pdev->dev, "%s fail to create devices.\n",
- pdev->dev.of_node->full_name);
+ dev_err(&pdev->dev, "%pOF fail to create devices.\n",
+ pdev->dev.of_node);
return ret;
}
diff --git a/drivers/bus/omap-ocp2scp.c b/drivers/bus/omap-ocp2scp.c
index bf500e0e7362..77791f3dcfc6 100644
--- a/drivers/bus/omap-ocp2scp.c
+++ b/drivers/bus/omap-ocp2scp.c
@@ -70,8 +70,10 @@ static int omap_ocp2scp_probe(struct platform_device *pdev)
if (!of_device_is_compatible(np, "ti,am437x-ocp2scp")) {
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
regs = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(regs))
- goto err0;
+ if (IS_ERR(regs)) {
+ ret = PTR_ERR(regs);
+ goto err1;
+ }
pm_runtime_get_sync(&pdev->dev);
reg = readl_relaxed(regs + OCP2SCP_TIMING);
@@ -83,6 +85,9 @@ static int omap_ocp2scp_probe(struct platform_device *pdev)
return 0;
+err1:
+ pm_runtime_disable(&pdev->dev);
+
err0:
device_for_each_child(&pdev->dev, NULL, ocp2scp_remove_devices);
diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c
index 795c9d9c96a6..328ca93781cf 100644
--- a/drivers/bus/sunxi-rsb.c
+++ b/drivers/bus/sunxi-rsb.c
@@ -556,20 +556,20 @@ static int of_rsb_register_devices(struct sunxi_rsb *rsb)
/* Runtime addresses for all slaves should be set first */
for_each_available_child_of_node(np, child) {
- dev_dbg(dev, "setting child %s runtime address\n",
- child->full_name);
+ dev_dbg(dev, "setting child %pOF runtime address\n",
+ child);
ret = of_property_read_u32(child, "reg", &hwaddr);
if (ret) {
- dev_err(dev, "%s: invalid 'reg' property: %d\n",
- child->full_name, ret);
+ dev_err(dev, "%pOF: invalid 'reg' property: %d\n",
+ child, ret);
continue;
}
rtaddr = sunxi_rsb_get_rtaddr(hwaddr);
if (!rtaddr) {
- dev_err(dev, "%s: unknown hardware device address\n",
- child->full_name);
+ dev_err(dev, "%pOF: unknown hardware device address\n",
+ child);
continue;
}
@@ -586,15 +586,15 @@ static int of_rsb_register_devices(struct sunxi_rsb *rsb)
/* send command */
ret = _sunxi_rsb_run_xfer(rsb);
if (ret)
- dev_warn(dev, "%s: set runtime address failed: %d\n",
- child->full_name, ret);
+ dev_warn(dev, "%pOF: set runtime address failed: %d\n",
+ child, ret);
}
/* Then we start adding devices and probing them */
for_each_available_child_of_node(np, child) {
struct sunxi_rsb_device *rdev;
- dev_dbg(dev, "adding child %s\n", child->full_name);
+ dev_dbg(dev, "adding child %pOF\n", child);
ret = of_property_read_u32(child, "reg", &hwaddr);
if (ret)
@@ -606,8 +606,8 @@ static int of_rsb_register_devices(struct sunxi_rsb *rsb)
rdev = sunxi_rsb_device_create(rsb, child, hwaddr, rtaddr);
if (IS_ERR(rdev))
- dev_err(dev, "failed to add child device %s: %ld\n",
- child->full_name, PTR_ERR(rdev));
+ dev_err(dev, "failed to add child device %pOF: %ld\n",
+ child, PTR_ERR(rdev));
}
return 0;
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index f4f866ee54bc..d3a979e25724 100644
--- a/drivers/char/sonypi.c
+++ b/drivers/char/sonypi.c
@@ -1491,7 +1491,7 @@ static struct platform_driver sonypi_driver = {
static struct platform_device *sonypi_platform_device;
-static struct dmi_system_id __initdata sonypi_dmi_table[] = {
+static const struct dmi_system_id sonypi_dmi_table[] __initconst = {
{
.ident = "Sony Vaio",
.matches = {
diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
index fe597e6c55c4..1d6729be4cd6 100644
--- a/drivers/char/tpm/tpm-interface.c
+++ b/drivers/char/tpm/tpm-interface.c
@@ -455,7 +455,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
goto out;
}
- msleep(TPM_TIMEOUT); /* CHECK */
+ tpm_msleep(TPM_TIMEOUT);
rmb();
} while (time_before(jiffies, stop));
@@ -970,7 +970,7 @@ int tpm_do_selftest(struct tpm_chip *chip)
dev_info(
&chip->dev, HW_ERR
"TPM command timed out during continue self test");
- msleep(delay_msec);
+ tpm_msleep(delay_msec);
continue;
}
@@ -985,7 +985,7 @@ int tpm_do_selftest(struct tpm_chip *chip)
}
if (rc != TPM_WARN_DOING_SELFTEST)
return rc;
- msleep(delay_msec);
+ tpm_msleep(delay_msec);
} while (--loops > 0);
return rc;
@@ -1085,7 +1085,7 @@ again:
}
} else {
do {
- msleep(TPM_TIMEOUT);
+ tpm_msleep(TPM_TIMEOUT);
status = chip->ops->status(chip);
if ((status & mask) == mask)
return 0;
@@ -1150,7 +1150,7 @@ int tpm_pm_suspend(struct device *dev)
*/
if (rc != TPM_WARN_RETRY)
break;
- msleep(TPM_TIMEOUT_RETRY);
+ tpm_msleep(TPM_TIMEOUT_RETRY);
}
if (rc)
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 04fbff2edbf3..2d5466a72e40 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -50,7 +50,8 @@ enum tpm_const {
enum tpm_timeout {
TPM_TIMEOUT = 5, /* msecs */
- TPM_TIMEOUT_RETRY = 100 /* msecs */
+ TPM_TIMEOUT_RETRY = 100, /* msecs */
+ TPM_TIMEOUT_RANGE_US = 300 /* usecs */
};
/* TPM addresses */
@@ -527,6 +528,12 @@ int tpm_pm_resume(struct device *dev);
int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
wait_queue_head_t *queue, bool check_cancel);
+static inline void tpm_msleep(unsigned int delay_msec)
+{
+ usleep_range(delay_msec * 1000,
+ (delay_msec * 1000) + TPM_TIMEOUT_RANGE_US);
+};
+
struct tpm_chip *tpm_chip_find_get(int chip_num);
__must_check int tpm_try_get_ops(struct tpm_chip *chip);
void tpm_put_ops(struct tpm_chip *chip);
diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index f7f34b2aa981..e1a41b788f08 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -899,7 +899,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
if (rc != TPM2_RC_TESTING)
break;
- msleep(delay_msec);
+ tpm_msleep(delay_msec);
}
return rc;
diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
index a4ac63a21d8a..8f0a98dea327 100644
--- a/drivers/char/tpm/tpm_crb.c
+++ b/drivers/char/tpm/tpm_crb.c
@@ -665,7 +665,7 @@ static const struct dev_pm_ops crb_pm = {
SET_RUNTIME_PM_OPS(crb_pm_runtime_suspend, crb_pm_runtime_resume, NULL)
};
-static struct acpi_device_id crb_device_ids[] = {
+static const struct acpi_device_id crb_device_ids[] = {
{"MSFT0101", 0},
{"", 0},
};
diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c
index f01d083eced2..25f6e2665385 100644
--- a/drivers/char/tpm/tpm_ibmvtpm.c
+++ b/drivers/char/tpm/tpm_ibmvtpm.c
@@ -32,26 +32,70 @@
static const char tpm_ibmvtpm_driver_name[] = "tpm_ibmvtpm";
-static struct vio_device_id tpm_ibmvtpm_device_table[] = {
+static const struct vio_device_id tpm_ibmvtpm_device_table[] = {
{ "IBM,vtpm", "IBM,vtpm"},
{ "", "" }
};
MODULE_DEVICE_TABLE(vio, tpm_ibmvtpm_device_table);
/**
+ *
+ * ibmvtpm_send_crq_word - Send a CRQ request
+ * @vdev: vio device struct
+ * @w1: pre-constructed first word of tpm crq (second word is reserved)
+ *
+ * Return:
+ * 0 - Success
+ * Non-zero - Failure
+ */
+static int ibmvtpm_send_crq_word(struct vio_dev *vdev, u64 w1)
+{
+ return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, w1, 0);
+}
+
+/**
+ *
* ibmvtpm_send_crq - Send a CRQ request
*
* @vdev: vio device struct
- * @w1: first word
- * @w2: second word
+ * @valid: Valid field
+ * @msg: Type field
+ * @len: Length field
+ * @data: Data field
+ *
+ * The ibmvtpm crq is defined as follows:
+ *
+ * Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
+ * -----------------------------------------------------------------------
+ * Word0 | Valid | Type | Length | Data
+ * -----------------------------------------------------------------------
+ * Word1 | Reserved
+ * -----------------------------------------------------------------------
+ *
+ * Which matches the following structure (on bigendian host):
+ *
+ * struct ibmvtpm_crq {
+ * u8 valid;
+ * u8 msg;
+ * __be16 len;
+ * __be32 data;
+ * __be64 reserved;
+ * } __attribute__((packed, aligned(8)));
+ *
+ * However, the value is passed in a register so just compute the numeric value
+ * to load into the register avoiding byteswap altogether. Endian only affects
+ * memory loads and stores - registers are internally represented the same.
*
* Return:
- * 0 -Sucess
+ * 0 (H_SUCCESS) - Success
* Non-zero - Failure
*/
-static int ibmvtpm_send_crq(struct vio_dev *vdev, u64 w1, u64 w2)
+static int ibmvtpm_send_crq(struct vio_dev *vdev,
+ u8 valid, u8 msg, u16 len, u32 data)
{
- return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, w1, w2);
+ u64 w1 = ((u64)valid << 56) | ((u64)msg << 48) | ((u64)len << 32) |
+ (u64)data;
+ return ibmvtpm_send_crq_word(vdev, w1);
}
/**
@@ -109,8 +153,6 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
{
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
- struct ibmvtpm_crq crq;
- __be64 *word = (__be64 *)&crq;
int rc, sig;
if (!ibmvtpm->rtce_buf) {
@@ -137,10 +179,6 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
spin_lock(&ibmvtpm->rtce_lock);
ibmvtpm->res_len = 0;
memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count);
- crq.valid = (u8)IBMVTPM_VALID_CMD;
- crq.msg = (u8)VTPM_TPM_COMMAND;
- crq.len = cpu_to_be16(count);
- crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle);
/*
* set the processing flag before the Hcall, since we may get the
@@ -148,8 +186,9 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
*/
ibmvtpm->tpm_processing_cmd = true;
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]),
- be64_to_cpu(word[1]));
+ rc = ibmvtpm_send_crq(ibmvtpm->vdev,
+ IBMVTPM_VALID_CMD, VTPM_TPM_COMMAND,
+ count, ibmvtpm->rtce_dma_handle);
if (rc != H_SUCCESS) {
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
rc = 0;
@@ -182,15 +221,10 @@ static u8 tpm_ibmvtpm_status(struct tpm_chip *chip)
*/
static int ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm)
{
- struct ibmvtpm_crq crq;
- u64 *buf = (u64 *) &crq;
int rc;
- crq.valid = (u8)IBMVTPM_VALID_CMD;
- crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;
-
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
- cpu_to_be64(buf[1]));
+ rc = ibmvtpm_send_crq(ibmvtpm->vdev,
+ IBMVTPM_VALID_CMD, VTPM_GET_RTCE_BUFFER_SIZE, 0, 0);
if (rc != H_SUCCESS)
dev_err(ibmvtpm->dev,
"ibmvtpm_crq_get_rtce_size failed rc=%d\n", rc);
@@ -210,15 +244,10 @@ static int ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm)
*/
static int ibmvtpm_crq_get_version(struct ibmvtpm_dev *ibmvtpm)
{
- struct ibmvtpm_crq crq;
- u64 *buf = (u64 *) &crq;
int rc;
- crq.valid = (u8)IBMVTPM_VALID_CMD;
- crq.msg = (u8)VTPM_GET_VERSION;
-
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
- cpu_to_be64(buf[1]));
+ rc = ibmvtpm_send_crq(ibmvtpm->vdev,
+ IBMVTPM_VALID_CMD, VTPM_GET_VERSION, 0, 0);
if (rc != H_SUCCESS)
dev_err(ibmvtpm->dev,
"ibmvtpm_crq_get_version failed rc=%d\n", rc);
@@ -238,7 +267,7 @@ static int ibmvtpm_crq_send_init_complete(struct ibmvtpm_dev *ibmvtpm)
{
int rc;
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_COMP_CMD, 0);
+ rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_COMP_CMD);
if (rc != H_SUCCESS)
dev_err(ibmvtpm->dev,
"ibmvtpm_crq_send_init_complete failed rc=%d\n", rc);
@@ -258,7 +287,7 @@ static int ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm)
{
int rc;
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_CMD, 0);
+ rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_CMD);
if (rc != H_SUCCESS)
dev_err(ibmvtpm->dev,
"ibmvtpm_crq_send_init failed rc=%d\n", rc);
@@ -340,15 +369,10 @@ static int tpm_ibmvtpm_suspend(struct device *dev)
{
struct tpm_chip *chip = dev_get_drvdata(dev);
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
- struct ibmvtpm_crq crq;
- u64 *buf = (u64 *) &crq;
int rc = 0;
- crq.valid = (u8)IBMVTPM_VALID_CMD;
- crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;
-
- rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
- cpu_to_be64(buf[1]));
+ rc = ibmvtpm_send_crq(ibmvtpm->vdev,
+ IBMVTPM_VALID_CMD, VTPM_PREPARE_TO_SUSPEND, 0, 0);
if (rc != H_SUCCESS)
dev_err(ibmvtpm->dev,
"tpm_ibmvtpm_suspend failed rc=%d\n", rc);
diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
index 3b1b9f9322d5..d8f10047fbba 100644
--- a/drivers/char/tpm/tpm_infineon.c
+++ b/drivers/char/tpm/tpm_infineon.c
@@ -191,7 +191,7 @@ static int wait(struct tpm_chip *chip, int wait_for_bit)
/* check the status-register if wait_for_bit is set */
if (status & 1 << wait_for_bit)
break;
- msleep(TPM_MSLEEP_TIME);
+ tpm_msleep(TPM_MSLEEP_TIME);
}
if (i == TPM_MAX_TRIES) { /* timeout occurs */
if (wait_for_bit == STAT_XFE)
@@ -226,7 +226,7 @@ static void tpm_wtx(struct tpm_chip *chip)
wait_and_send(chip, TPM_CTRL_WTX);
wait_and_send(chip, 0x00);
wait_and_send(chip, 0x00);
- msleep(TPM_WTX_MSLEEP_TIME);
+ tpm_msleep(TPM_WTX_MSLEEP_TIME);
}
static void tpm_wtx_abort(struct tpm_chip *chip)
@@ -237,7 +237,7 @@ static void tpm_wtx_abort(struct tpm_chip *chip)
wait_and_send(chip, 0x00);
wait_and_send(chip, 0x00);
number_of_wtx = 0;
- msleep(TPM_WTX_MSLEEP_TIME);
+ tpm_msleep(TPM_WTX_MSLEEP_TIME);
}
static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index b617b2eeb080..63bc6c3b949e 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -51,7 +51,7 @@ static int wait_startup(struct tpm_chip *chip, int l)
if (access & TPM_ACCESS_VALID)
return 0;
- msleep(TPM_TIMEOUT);
+ tpm_msleep(TPM_TIMEOUT);
} while (time_before(jiffies, stop));
return -1;
}
@@ -117,7 +117,7 @@ again:
do {
if (check_locality(chip, l))
return l;
- msleep(TPM_TIMEOUT);
+ tpm_msleep(TPM_TIMEOUT);
} while (time_before(jiffies, stop));
}
return -1;
@@ -164,7 +164,7 @@ static int get_burstcount(struct tpm_chip *chip)
burstcnt = (value >> 8) & 0xFFFF;
if (burstcnt)
return burstcnt;
- msleep(TPM_TIMEOUT);
+ tpm_msleep(TPM_TIMEOUT);
} while (time_before(jiffies, stop));
return -EBUSY;
}
@@ -396,7 +396,7 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
priv->irq = irq;
chip->flags |= TPM_CHIP_FLAG_IRQ;
if (!priv->irq_tested)
- msleep(1);
+ tpm_msleep(1);
if (!priv->irq_tested)
disable_interrupts(chip);
priv->irq_tested = true;
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 23f33f95d4a6..d1aed2513bd9 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -451,9 +451,6 @@ static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size,
* device is created by remoteproc, the DMA memory is
* associated with the grandparent device:
* vdev => rproc => platform-dev.
- * The code here would have been less quirky if
- * DMA_MEMORY_INCLUDES_CHILDREN had been supported
- * in dma-coherent.c
*/
if (!vq->vdev->dev.parent || !vq->vdev->dev.parent->parent)
goto free_buf;
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 68ca2d9fcd73..1c4e1aa6767e 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -31,6 +31,13 @@ config COMMON_CLK_WM831X
source "drivers/clk/versatile/Kconfig"
+config CLK_HSDK
+ bool "PLL Driver for HSDK platform"
+ depends on OF || COMPILE_TEST
+ ---help---
+ This driver supports the HSDK core, system, ddr, tunnel and hdmi PLLs
+ control.
+
config COMMON_CLK_MAX77686
tristate "Clock driver for Maxim 77620/77686/77802 MFD"
depends on MFD_MAX77686 || MFD_MAX77620 || COMPILE_TEST
@@ -39,10 +46,10 @@ config COMMON_CLK_MAX77686
clock.
config COMMON_CLK_RK808
- tristate "Clock driver for RK808/RK818"
+ tristate "Clock driver for RK805/RK808/RK818"
depends on MFD_RK808
---help---
- This driver supports RK808 and RK818 crystal oscillator clock. These
+ This driver supports RK805, RK808 and RK818 crystal oscillator clock. These
multi-function devices have two fixed-rate oscillators,
clocked at 32KHz each. Clkout1 is always on, Clkout2 can off
by control register.
@@ -210,14 +217,14 @@ config COMMON_CLK_OXNAS
Support for the OXNAS SoC Family clocks.
config COMMON_CLK_VC5
- tristate "Clock driver for IDT VersaClock5 devices"
+ tristate "Clock driver for IDT VersaClock 5,6 devices"
depends on I2C
depends on OF
select REGMAP_I2C
help
---help---
- This driver supports the IDT VersaClock5 programmable clock
- generator.
+ This driver supports the IDT VersaClock 5 and VersaClock 6
+ programmable clock generators.
source "drivers/clk/bcm/Kconfig"
source "drivers/clk/hisilicon/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index cd376b3fb47a..c99f363826f0 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -27,8 +27,8 @@ obj-$(CONFIG_COMMON_CLK_CS2000_CP) += clk-cs2000-cp.o
obj-$(CONFIG_ARCH_EFM32) += clk-efm32gg.o
obj-$(CONFIG_COMMON_CLK_GEMINI) += clk-gemini.o
obj-$(CONFIG_ARCH_HIGHBANK) += clk-highbank.o
+obj-$(CONFIG_CLK_HSDK) += clk-hsdk-pll.o
obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
-obj-$(CONFIG_ARCH_MB86S7X) += clk-mb86s7x.o
obj-$(CONFIG_ARCH_MOXART) += clk-moxart.o
obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o
obj-$(CONFIG_ARCH_NSPIRE) += clk-nspire.o
@@ -44,6 +44,7 @@ obj-$(CONFIG_COMMON_CLK_SI5351) += clk-si5351.o
obj-$(CONFIG_COMMON_CLK_SI514) += clk-si514.o
obj-$(CONFIG_COMMON_CLK_SI570) += clk-si570.o
obj-$(CONFIG_ARCH_STM32) += clk-stm32f4.o
+obj-$(CONFIG_ARCH_STM32) += clk-stm32h7.o
obj-$(CONFIG_ARCH_TANGO) += clk-tango4.o
obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o
obj-$(CONFIG_ARCH_U300) += clk-u300.o
diff --git a/drivers/clk/at91/Makefile b/drivers/clk/at91/Makefile
index 13e67bd35cff..c68947b65a4c 100644
--- a/drivers/clk/at91/Makefile
+++ b/drivers/clk/at91/Makefile
@@ -6,6 +6,7 @@ obj-y += pmc.o sckc.o
obj-y += clk-slow.o clk-main.o clk-pll.o clk-plldiv.o clk-master.o
obj-y += clk-system.o clk-peripheral.o clk-programmable.o
+obj-$(CONFIG_HAVE_AT91_AUDIO_PLL) += clk-audio-pll.o
obj-$(CONFIG_HAVE_AT91_UTMI) += clk-utmi.o
obj-$(CONFIG_HAVE_AT91_USB_CLK) += clk-usb.o
obj-$(CONFIG_HAVE_AT91_SMD) += clk-smd.o
diff --git a/drivers/clk/at91/clk-audio-pll.c b/drivers/clk/at91/clk-audio-pll.c
new file mode 100644
index 000000000000..da7bafcfbe70
--- /dev/null
+++ b/drivers/clk/at91/clk-audio-pll.c
@@ -0,0 +1,536 @@
+/*
+ * Copyright (C) 2016 Atmel Corporation,
+ * Songjun Wu <[email protected]>,
+ * Nicolas Ferre <[email protected]>
+ * Copyright (C) 2017 Free Electrons,
+ * Quentin Schulz <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * The Sama5d2 SoC has two audio PLLs (PMC and PAD) that shares the same parent
+ * (FRAC). FRAC can output between 620 and 700MHz and only multiply the rate of
+ * its own parent. PMC and PAD can then divide the FRAC rate to best match the
+ * asked rate.
+ *
+ * Traits of FRAC clock:
+ * enable - clk_enable writes nd, fracr parameters and enables PLL
+ * rate - rate is adjustable.
+ * clk->rate = parent->rate * ((nd + 1) + (fracr / 2^22))
+ * parent - fixed parent. No clk_set_parent support
+ *
+ * Traits of PMC clock:
+ * enable - clk_enable writes qdpmc, and enables PMC output
+ * rate - rate is adjustable.
+ * clk->rate = parent->rate / (qdpmc + 1)
+ * parent - fixed parent. No clk_set_parent support
+ *
+ * Traits of PAD clock:
+ * enable - clk_enable writes divisors and enables PAD output
+ * rate - rate is adjustable.
+ * clk->rate = parent->rate / (qdaudio * div))
+ * parent - fixed parent. No clk_set_parent support
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clk/at91_pmc.h>
+#include <linux/of.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#define AUDIO_PLL_DIV_FRAC BIT(22)
+#define AUDIO_PLL_ND_MAX (AT91_PMC_AUDIO_PLL_ND_MASK >> \
+ AT91_PMC_AUDIO_PLL_ND_OFFSET)
+
+#define AUDIO_PLL_QDPAD(qd, div) ((AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV(qd) & \
+ AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MASK) | \
+ (AT91_PMC_AUDIO_PLL_QDPAD_DIV(div) & \
+ AT91_PMC_AUDIO_PLL_QDPAD_DIV_MASK))
+
+#define AUDIO_PLL_QDPMC_MAX (AT91_PMC_AUDIO_PLL_QDPMC_MASK >> \
+ AT91_PMC_AUDIO_PLL_QDPMC_OFFSET)
+
+#define AUDIO_PLL_FOUT_MIN 620000000UL
+#define AUDIO_PLL_FOUT_MAX 700000000UL
+
+struct clk_audio_frac {
+ struct clk_hw hw;
+ struct regmap *regmap;
+ u32 fracr;
+ u8 nd;
+};
+
+struct clk_audio_pad {
+ struct clk_hw hw;
+ struct regmap *regmap;
+ u8 qdaudio;
+ u8 div;
+};
+
+struct clk_audio_pmc {
+ struct clk_hw hw;
+ struct regmap *regmap;
+ u8 qdpmc;
+};
+
+#define to_clk_audio_frac(hw) container_of(hw, struct clk_audio_frac, hw)
+#define to_clk_audio_pad(hw) container_of(hw, struct clk_audio_pad, hw)
+#define to_clk_audio_pmc(hw) container_of(hw, struct clk_audio_pmc, hw)
+
+static int clk_audio_pll_frac_enable(struct clk_hw *hw)
+{
+ struct clk_audio_frac *frac = to_clk_audio_frac(hw);
+
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_RESETN, 0);
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_RESETN,
+ AT91_PMC_AUDIO_PLL_RESETN);
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL1,
+ AT91_PMC_AUDIO_PLL_FRACR_MASK, frac->fracr);
+
+ /*
+ * reset and enable have to be done in 2 separated writes
+ * for AT91_PMC_AUDIO_PLL0
+ */
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PLLEN |
+ AT91_PMC_AUDIO_PLL_ND_MASK,
+ AT91_PMC_AUDIO_PLL_PLLEN |
+ AT91_PMC_AUDIO_PLL_ND(frac->nd));
+
+ return 0;
+}
+
+static int clk_audio_pll_pad_enable(struct clk_hw *hw)
+{
+ struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
+
+ regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL1,
+ AT91_PMC_AUDIO_PLL_QDPAD_MASK,
+ AUDIO_PLL_QDPAD(apad_ck->qdaudio, apad_ck->div));
+ regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PADEN, AT91_PMC_AUDIO_PLL_PADEN);
+
+ return 0;
+}
+
+static int clk_audio_pll_pmc_enable(struct clk_hw *hw)
+{
+ struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
+
+ regmap_update_bits(apmc_ck->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PMCEN |
+ AT91_PMC_AUDIO_PLL_QDPMC_MASK,
+ AT91_PMC_AUDIO_PLL_PMCEN |
+ AT91_PMC_AUDIO_PLL_QDPMC(apmc_ck->qdpmc));
+ return 0;
+}
+
+static void clk_audio_pll_frac_disable(struct clk_hw *hw)
+{
+ struct clk_audio_frac *frac = to_clk_audio_frac(hw);
+
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PLLEN, 0);
+ /* do it in 2 separated writes */
+ regmap_update_bits(frac->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_RESETN, 0);
+}
+
+static void clk_audio_pll_pad_disable(struct clk_hw *hw)
+{
+ struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
+
+ regmap_update_bits(apad_ck->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PADEN, 0);
+}
+
+static void clk_audio_pll_pmc_disable(struct clk_hw *hw)
+{
+ struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
+
+ regmap_update_bits(apmc_ck->regmap, AT91_PMC_AUDIO_PLL0,
+ AT91_PMC_AUDIO_PLL_PMCEN, 0);
+}
+
+static unsigned long clk_audio_pll_fout(unsigned long parent_rate,
+ unsigned long nd, unsigned long fracr)
+{
+ unsigned long long fr = (unsigned long long)parent_rate * fracr;
+
+ pr_debug("A PLL: %s, fr = %llu\n", __func__, fr);
+
+ fr = DIV_ROUND_CLOSEST_ULL(fr, AUDIO_PLL_DIV_FRAC);
+
+ pr_debug("A PLL: %s, fr = %llu\n", __func__, fr);
+
+ return parent_rate * (nd + 1) + fr;
+}
+
+static unsigned long clk_audio_pll_frac_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct clk_audio_frac *frac = to_clk_audio_frac(hw);
+ unsigned long fout;
+
+ fout = clk_audio_pll_fout(parent_rate, frac->nd, frac->fracr);
+
+ pr_debug("A PLL: %s, fout = %lu (nd = %u, fracr = %lu)\n", __func__,
+ fout, frac->nd, (unsigned long)frac->fracr);
+
+ return fout;
+}
+
+static unsigned long clk_audio_pll_pad_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
+ unsigned long apad_rate = 0;
+
+ if (apad_ck->qdaudio && apad_ck->div)
+ apad_rate = parent_rate / (apad_ck->qdaudio * apad_ck->div);
+
+ pr_debug("A PLL/PAD: %s, apad_rate = %lu (div = %u, qdaudio = %u)\n",
+ __func__, apad_rate, apad_ck->div, apad_ck->qdaudio);
+
+ return apad_rate;
+}
+
+static unsigned long clk_audio_pll_pmc_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
+ unsigned long apmc_rate = 0;
+
+ apmc_rate = parent_rate / (apmc_ck->qdpmc + 1);
+
+ pr_debug("A PLL/PMC: %s, apmc_rate = %lu (qdpmc = %u)\n", __func__,
+ apmc_rate, apmc_ck->qdpmc);
+
+ return apmc_rate;
+}
+
+static int clk_audio_pll_frac_compute_frac(unsigned long rate,
+ unsigned long parent_rate,
+ unsigned long *nd,
+ unsigned long *fracr)
+{
+ unsigned long long tmp, rem;
+
+ if (!rate)
+ return -EINVAL;
+
+ tmp = rate;
+ rem = do_div(tmp, parent_rate);
+ if (!tmp || tmp >= AUDIO_PLL_ND_MAX)
+ return -EINVAL;
+
+ *nd = tmp - 1;
+
+ tmp = rem * AUDIO_PLL_DIV_FRAC;
+ tmp = DIV_ROUND_CLOSEST_ULL(tmp, parent_rate);
+ if (tmp > AT91_PMC_AUDIO_PLL_FRACR_MASK)
+ return -EINVAL;
+
+ /* we can cast here as we verified the bounds just above */
+ *fracr = (unsigned long)tmp;
+
+ return 0;
+}
+
+static int clk_audio_pll_frac_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ unsigned long fracr, nd;
+ int ret;
+
+ pr_debug("A PLL: %s, rate = %lu (parent_rate = %lu)\n", __func__,
+ req->rate, req->best_parent_rate);
+
+ req->rate = clamp(req->rate, AUDIO_PLL_FOUT_MIN, AUDIO_PLL_FOUT_MAX);
+
+ req->min_rate = max(req->min_rate, AUDIO_PLL_FOUT_MIN);
+ req->max_rate = min(req->max_rate, AUDIO_PLL_FOUT_MAX);
+
+ ret = clk_audio_pll_frac_compute_frac(req->rate, req->best_parent_rate,
+ &nd, &fracr);
+ if (ret)
+ return ret;
+
+ req->rate = clk_audio_pll_fout(req->best_parent_rate, nd, fracr);
+
+ req->best_parent_hw = clk_hw_get_parent(hw);
+
+ pr_debug("A PLL: %s, best_rate = %lu (nd = %lu, fracr = %lu)\n",
+ __func__, req->rate, nd, fracr);
+
+ return 0;
+}
+
+static long clk_audio_pll_pad_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_rate)
+{
+ struct clk_hw *pclk = clk_hw_get_parent(hw);
+ long best_rate = -EINVAL;
+ unsigned long best_parent_rate;
+ unsigned long tmp_qd;
+ u32 div;
+ long tmp_rate;
+ int tmp_diff;
+ int best_diff = -1;
+
+ pr_debug("A PLL/PAD: %s, rate = %lu (parent_rate = %lu)\n", __func__,
+ rate, *parent_rate);
+
+ /*
+ * Rate divisor is actually made of two different divisors, multiplied
+ * between themselves before dividing the rate.
+ * tmp_qd goes from 1 to 31 and div is either 2 or 3.
+ * In order to avoid testing twice the rate divisor (e.g. divisor 12 can
+ * be found with (tmp_qd, div) = (2, 6) or (3, 4)), we remove any loop
+ * for a rate divisor when div is 2 and tmp_qd is a multiple of 3.
+ * We cannot inverse it (condition div is 3 and tmp_qd is even) or we
+ * would miss some rate divisor that aren't reachable with div being 2
+ * (e.g. rate divisor 90 is made with div = 3 and tmp_qd = 30, thus
+ * tmp_qd is even so we skip it because we think div 2 could make this
+ * rate divisor which isn't possible since tmp_qd has to be <= 31).
+ */
+ for (tmp_qd = 1; tmp_qd < AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MAX; tmp_qd++)
+ for (div = 2; div <= 3; div++) {
+ if (div == 2 && tmp_qd % 3 == 0)
+ continue;
+
+ best_parent_rate = clk_hw_round_rate(pclk,
+ rate * tmp_qd * div);
+ tmp_rate = best_parent_rate / (div * tmp_qd);
+ tmp_diff = abs(rate - tmp_rate);
+
+ if (best_diff < 0 || best_diff > tmp_diff) {
+ *parent_rate = best_parent_rate;
+ best_rate = tmp_rate;
+ best_diff = tmp_diff;
+ }
+ }
+
+ pr_debug("A PLL/PAD: %s, best_rate = %ld, best_parent_rate = %lu\n",
+ __func__, best_rate, best_parent_rate);
+
+ return best_rate;
+}
+
+static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_rate)
+{
+ struct clk_hw *pclk = clk_hw_get_parent(hw);
+ long best_rate = -EINVAL;
+ unsigned long best_parent_rate = 0;
+ u32 tmp_qd = 0, div;
+ long tmp_rate;
+ int tmp_diff;
+ int best_diff = -1;
+
+ pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
+ rate, *parent_rate);
+
+ for (div = 1; div <= AUDIO_PLL_QDPMC_MAX; div++) {
+ best_parent_rate = clk_round_rate(pclk->clk, rate * div);
+ tmp_rate = best_parent_rate / div;
+ tmp_diff = abs(rate - tmp_rate);
+
+ if (best_diff < 0 || best_diff > tmp_diff) {
+ *parent_rate = best_parent_rate;
+ best_rate = tmp_rate;
+ best_diff = tmp_diff;
+ tmp_qd = div;
+ }
+ }
+
+ pr_debug("A PLL/PMC: %s, best_rate = %ld, best_parent_rate = %lu (qd = %d)\n",
+ __func__, best_rate, *parent_rate, tmp_qd - 1);
+
+ return best_rate;
+}
+
+static int clk_audio_pll_frac_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct clk_audio_frac *frac = to_clk_audio_frac(hw);
+ unsigned long fracr, nd;
+ int ret;
+
+ pr_debug("A PLL: %s, rate = %lu (parent_rate = %lu)\n", __func__, rate,
+ parent_rate);
+
+ if (rate < AUDIO_PLL_FOUT_MIN || rate > AUDIO_PLL_FOUT_MAX)
+ return -EINVAL;
+
+ ret = clk_audio_pll_frac_compute_frac(rate, parent_rate, &nd, &fracr);
+ if (ret)
+ return ret;
+
+ frac->nd = nd;
+ frac->fracr = fracr;
+
+ return 0;
+}
+
+static int clk_audio_pll_pad_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct clk_audio_pad *apad_ck = to_clk_audio_pad(hw);
+ u8 tmp_div;
+
+ pr_debug("A PLL/PAD: %s, rate = %lu (parent_rate = %lu)\n", __func__,
+ rate, parent_rate);
+
+ if (!rate)
+ return -EINVAL;
+
+ tmp_div = parent_rate / rate;
+ if (tmp_div % 3 == 0) {
+ apad_ck->qdaudio = tmp_div / 3;
+ apad_ck->div = 3;
+ } else {
+ apad_ck->qdaudio = tmp_div / 2;
+ apad_ck->div = 2;
+ }
+
+ return 0;
+}
+
+static int clk_audio_pll_pmc_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct clk_audio_pmc *apmc_ck = to_clk_audio_pmc(hw);
+
+ if (!rate)
+ return -EINVAL;
+
+ pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
+ rate, parent_rate);
+
+ apmc_ck->qdpmc = parent_rate / rate - 1;
+
+ return 0;
+}
+
+static const struct clk_ops audio_pll_frac_ops = {
+ .enable = clk_audio_pll_frac_enable,
+ .disable = clk_audio_pll_frac_disable,
+ .recalc_rate = clk_audio_pll_frac_recalc_rate,
+ .determine_rate = clk_audio_pll_frac_determine_rate,
+ .set_rate = clk_audio_pll_frac_set_rate,
+};
+
+static const struct clk_ops audio_pll_pad_ops = {
+ .enable = clk_audio_pll_pad_enable,
+ .disable = clk_audio_pll_pad_disable,
+ .recalc_rate = clk_audio_pll_pad_recalc_rate,
+ .round_rate = clk_audio_pll_pad_round_rate,
+ .set_rate = clk_audio_pll_pad_set_rate,
+};
+
+static const struct clk_ops audio_pll_pmc_ops = {
+ .enable = clk_audio_pll_pmc_enable,
+ .disable = clk_audio_pll_pmc_disable,
+ .recalc_rate = clk_audio_pll_pmc_recalc_rate,
+ .round_rate = clk_audio_pll_pmc_round_rate,
+ .set_rate = clk_audio_pll_pmc_set_rate,
+};
+
+static int of_sama5d2_clk_audio_pll_setup(struct device_node *np,
+ struct clk_init_data *init,
+ struct clk_hw *hw,
+ struct regmap **clk_audio_regmap)
+{
+ struct regmap *regmap;
+ const char *parent_names[1];
+ int ret;
+
+ regmap = syscon_node_to_regmap(of_get_parent(np));
+ if (IS_ERR(regmap))
+ return PTR_ERR(regmap);
+
+ init->name = np->name;
+ of_clk_parent_fill(np, parent_names, 1);
+ init->parent_names = parent_names;
+ init->num_parents = 1;
+
+ hw->init = init;
+ *clk_audio_regmap = regmap;
+
+ ret = clk_hw_register(NULL, hw);
+ if (ret)
+ return ret;
+
+ return of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+
+static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np)
+{
+ struct clk_audio_frac *frac_ck;
+ struct clk_init_data init = {};
+
+ frac_ck = kzalloc(sizeof(*frac_ck), GFP_KERNEL);
+ if (!frac_ck)
+ return;
+
+ init.ops = &audio_pll_frac_ops;
+ init.flags = CLK_SET_RATE_GATE;
+
+ if (of_sama5d2_clk_audio_pll_setup(np, &init, &frac_ck->hw,
+ &frac_ck->regmap))
+ kfree(frac_ck);
+}
+
+static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np)
+{
+ struct clk_audio_pad *apad_ck;
+ struct clk_init_data init = {};
+
+ apad_ck = kzalloc(sizeof(*apad_ck), GFP_KERNEL);
+ if (!apad_ck)
+ return;
+
+ init.ops = &audio_pll_pad_ops;
+ init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
+ CLK_SET_RATE_PARENT;
+
+ if (of_sama5d2_clk_audio_pll_setup(np, &init, &apad_ck->hw,
+ &apad_ck->regmap))
+ kfree(apad_ck);
+}
+
+static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np)
+{
+ struct clk_audio_pad *apmc_ck;
+ struct clk_init_data init = {};
+
+ apmc_ck = kzalloc(sizeof(*apmc_ck), GFP_KERNEL);
+ if (!apmc_ck)
+ return;
+
+ init.ops = &audio_pll_pmc_ops;
+ init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
+ CLK_SET_RATE_PARENT;
+
+ if (of_sama5d2_clk_audio_pll_setup(np, &init, &apmc_ck->hw,
+ &apmc_ck->regmap))
+ kfree(apmc_ck);
+}
+
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_frac_setup,
+ "atmel,sama5d2-clk-audio-pll-frac",
+ of_sama5d2_clk_audio_pll_frac_setup);
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pad_setup,
+ "atmel,sama5d2-clk-audio-pll-pad",
+ of_sama5d2_clk_audio_pll_pad_setup);
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pmc_setup,
+ "atmel,sama5d2-clk-audio-pll-pmc",
+ of_sama5d2_clk_audio_pll_pmc_setup);
diff --git a/drivers/clk/at91/clk-generated.c b/drivers/clk/at91/clk-generated.c
index f0b7ae904ce2..33481368740e 100644
--- a/drivers/clk/at91/clk-generated.c
+++ b/drivers/clk/at91/clk-generated.c
@@ -26,6 +26,13 @@
#define GENERATED_SOURCE_MAX 6
#define GENERATED_MAX_DIV 255
+#define GCK_ID_SSC0 43
+#define GCK_ID_SSC1 44
+#define GCK_ID_I2S0 54
+#define GCK_ID_I2S1 55
+#define GCK_ID_CLASSD 59
+#define GCK_INDEX_DT_AUDIO_PLL 5
+
struct clk_generated {
struct clk_hw hw;
struct regmap *regmap;
@@ -34,6 +41,7 @@ struct clk_generated {
u32 id;
u32 gckdiv;
u8 parent_id;
+ bool audio_pll_allowed;
};
#define to_clk_generated(hw) \
@@ -99,21 +107,41 @@ clk_generated_recalc_rate(struct clk_hw *hw,
return DIV_ROUND_CLOSEST(parent_rate, gck->gckdiv + 1);
}
+static void clk_generated_best_diff(struct clk_rate_request *req,
+ struct clk_hw *parent,
+ unsigned long parent_rate, u32 div,
+ int *best_diff, long *best_rate)
+{
+ unsigned long tmp_rate;
+ int tmp_diff;
+
+ if (!div)
+ tmp_rate = parent_rate;
+ else
+ tmp_rate = parent_rate / div;
+ tmp_diff = abs(req->rate - tmp_rate);
+
+ if (*best_diff < 0 || *best_diff > tmp_diff) {
+ *best_rate = tmp_rate;
+ *best_diff = tmp_diff;
+ req->best_parent_rate = parent_rate;
+ req->best_parent_hw = parent;
+ }
+}
+
static int clk_generated_determine_rate(struct clk_hw *hw,
struct clk_rate_request *req)
{
struct clk_generated *gck = to_clk_generated(hw);
struct clk_hw *parent = NULL;
+ struct clk_rate_request req_parent = *req;
long best_rate = -EINVAL;
- unsigned long tmp_rate, min_rate;
+ unsigned long min_rate, parent_rate;
int best_diff = -1;
- int tmp_diff;
int i;
+ u32 div;
- for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
- u32 div;
- unsigned long parent_rate;
-
+ for (i = 0; i < clk_hw_get_num_parents(hw) - 1; i++) {
parent = clk_hw_get_parent_by_index(hw, i);
if (!parent)
continue;
@@ -124,25 +152,43 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
(gck->range.max && min_rate > gck->range.max))
continue;
- for (div = 1; div < GENERATED_MAX_DIV + 2; div++) {
- tmp_rate = DIV_ROUND_CLOSEST(parent_rate, div);
- tmp_diff = abs(req->rate - tmp_rate);
+ div = DIV_ROUND_CLOSEST(parent_rate, req->rate);
- if (best_diff < 0 || best_diff > tmp_diff) {
- best_rate = tmp_rate;
- best_diff = tmp_diff;
- req->best_parent_rate = parent_rate;
- req->best_parent_hw = parent;
- }
+ clk_generated_best_diff(req, parent, parent_rate, div,
+ &best_diff, &best_rate);
- if (!best_diff || tmp_rate < req->rate)
- break;
- }
+ if (!best_diff)
+ break;
+ }
+
+ /*
+ * The audio_pll rate can be modified, unlike the five others clocks
+ * that should never be altered.
+ * The audio_pll can technically be used by multiple consumers. However,
+ * with the rate locking, the first consumer to enable to clock will be
+ * the one definitely setting the rate of the clock.
+ * Since audio IPs are most likely to request the same rate, we enforce
+ * that the only clks able to modify gck rate are those of audio IPs.
+ */
+
+ if (!gck->audio_pll_allowed)
+ goto end;
+
+ parent = clk_hw_get_parent_by_index(hw, GCK_INDEX_DT_AUDIO_PLL);
+ if (!parent)
+ goto end;
+
+ for (div = 1; div < GENERATED_MAX_DIV + 2; div++) {
+ req_parent.rate = req->rate * div;
+ __clk_determine_rate(parent, &req_parent);
+ clk_generated_best_diff(req, parent, req_parent.rate, div,
+ &best_diff, &best_rate);
if (!best_diff)
break;
}
+end:
pr_debug("GCLK: %s, best_rate = %ld, parent clk: %s @ %ld\n",
__func__, best_rate,
__clk_get_name((req->best_parent_hw)->clk),
@@ -252,7 +298,8 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
init.ops = &generated_ops;
init.parent_names = parent_names;
init.num_parents = num_parents;
- init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
+ init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
+ CLK_SET_RATE_PARENT;
gck->id = id;
gck->hw.init = &init;
@@ -284,6 +331,7 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
struct device_node *gcknp;
struct clk_range range = CLK_RANGE(0, 0);
struct regmap *regmap;
+ struct clk_generated *gck;
num_parents = of_clk_get_parent_count(np);
if (num_parents == 0 || num_parents > GENERATED_SOURCE_MAX)
@@ -315,6 +363,21 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, name,
parent_names, num_parents,
id, &range);
+
+ gck = to_clk_generated(hw);
+
+ if (of_device_is_compatible(np,
+ "atmel,sama5d2-clk-generated")) {
+ if (gck->id == GCK_ID_SSC0 || gck->id == GCK_ID_SSC1 ||
+ gck->id == GCK_ID_I2S0 || gck->id == GCK_ID_I2S1 ||
+ gck->id == GCK_ID_CLASSD)
+ gck->audio_pll_allowed = true;
+ else
+ gck->audio_pll_allowed = false;
+ } else {
+ gck->audio_pll_allowed = false;
+ }
+
if (IS_ERR(hw))
continue;
diff --git a/drivers/clk/axs10x/Makefile b/drivers/clk/axs10x/Makefile
index 01996b871b06..d747deafbf1e 100644
--- a/drivers/clk/axs10x/Makefile
+++ b/drivers/clk/axs10x/Makefile
@@ -1 +1,2 @@
obj-y += i2s_pll_clock.o
+obj-y += pll_clock.o
diff --git a/drivers/clk/axs10x/pll_clock.c b/drivers/clk/axs10x/pll_clock.c
new file mode 100644
index 000000000000..25d8c240ddfb
--- /dev/null
+++ b/drivers/clk/axs10x/pll_clock.c
@@ -0,0 +1,346 @@
+/*
+ * Synopsys AXS10X SDP Generic PLL clock driver
+ *
+ * Copyright (C) 2017 Synopsys
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/device.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+
+/* PLL registers addresses */
+#define PLL_REG_IDIV 0x0
+#define PLL_REG_FBDIV 0x4
+#define PLL_REG_ODIV 0x8
+
+/*
+ * Bit fields of the PLL IDIV/FBDIV/ODIV registers:
+ * ________________________________________________________________________
+ * |31 15| 14 | 13 | 12 |11 6|5 0|
+ * |-------RESRVED------|-NOUPDATE-|-BYPASS-|-EDGE-|--HIGHTIME--|--LOWTIME--|
+ * |____________________|__________|________|______|____________|___________|
+ *
+ * Following macros determine the way of access to these registers
+ * They should be set up only using the macros.
+ * reg should be an u32 variable.
+ */
+
+#define PLL_REG_GET_LOW(reg) \
+ (((reg) & (0x3F << 0)) >> 0)
+#define PLL_REG_GET_HIGH(reg) \
+ (((reg) & (0x3F << 6)) >> 6)
+#define PLL_REG_GET_EDGE(reg) \
+ (((reg) & (BIT(12))) ? 1 : 0)
+#define PLL_REG_GET_BYPASS(reg) \
+ (((reg) & (BIT(13))) ? 1 : 0)
+#define PLL_REG_GET_NOUPD(reg) \
+ (((reg) & (BIT(14))) ? 1 : 0)
+#define PLL_REG_GET_PAD(reg) \
+ (((reg) & (0x1FFFF << 15)) >> 15)
+
+#define PLL_REG_SET_LOW(reg, value) \
+ { reg |= (((value) & 0x3F) << 0); }
+#define PLL_REG_SET_HIGH(reg, value) \
+ { reg |= (((value) & 0x3F) << 6); }
+#define PLL_REG_SET_EDGE(reg, value) \
+ { reg |= (((value) & 0x01) << 12); }
+#define PLL_REG_SET_BYPASS(reg, value) \
+ { reg |= (((value) & 0x01) << 13); }
+#define PLL_REG_SET_NOUPD(reg, value) \
+ { reg |= (((value) & 0x01) << 14); }
+#define PLL_REG_SET_PAD(reg, value) \
+ { reg |= (((value) & 0x1FFFF) << 15); }
+
+#define PLL_LOCK BIT(0)
+#define PLL_ERROR BIT(1)
+#define PLL_MAX_LOCK_TIME 100 /* 100 us */
+
+struct axs10x_pll_cfg {
+ u32 rate;
+ u32 idiv;
+ u32 fbdiv;
+ u32 odiv;
+};
+
+static const struct axs10x_pll_cfg arc_pll_cfg[] = {
+ { 33333333, 1, 1, 1 },
+ { 50000000, 1, 30, 20 },
+ { 75000000, 2, 45, 10 },
+ { 90000000, 2, 54, 10 },
+ { 100000000, 1, 30, 10 },
+ { 125000000, 2, 45, 6 },
+ {}
+};
+
+static const struct axs10x_pll_cfg pgu_pll_cfg[] = {
+ { 25200000, 1, 84, 90 },
+ { 50000000, 1, 100, 54 },
+ { 74250000, 1, 44, 16 },
+ {}
+};
+
+struct axs10x_pll_clk {
+ struct clk_hw hw;
+ void __iomem *base;
+ void __iomem *lock;
+ const struct axs10x_pll_cfg *pll_cfg;
+ struct device *dev;
+};
+
+static inline void axs10x_pll_write(struct axs10x_pll_clk *clk, u32 reg,
+ u32 val)
+{
+ iowrite32(val, clk->base + reg);
+}
+
+static inline u32 axs10x_pll_read(struct axs10x_pll_clk *clk, u32 reg)
+{
+ return ioread32(clk->base + reg);
+}
+
+static inline struct axs10x_pll_clk *to_axs10x_pll_clk(struct clk_hw *hw)
+{
+ return container_of(hw, struct axs10x_pll_clk, hw);
+}
+
+static inline u32 axs10x_div_get_value(u32 reg)
+{
+ if (PLL_REG_GET_BYPASS(reg))
+ return 1;
+
+ return PLL_REG_GET_HIGH(reg) + PLL_REG_GET_LOW(reg);
+}
+
+static inline u32 axs10x_encode_div(unsigned int id, int upd)
+{
+ u32 div = 0;
+
+ PLL_REG_SET_LOW(div, (id % 2 == 0) ? id >> 1 : (id >> 1) + 1);
+ PLL_REG_SET_HIGH(div, id >> 1);
+ PLL_REG_SET_EDGE(div, id % 2);
+ PLL_REG_SET_BYPASS(div, id == 1 ? 1 : 0);
+ PLL_REG_SET_NOUPD(div, upd == 0 ? 1 : 0);
+
+ return div;
+}
+
+static unsigned long axs10x_pll_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ u64 rate;
+ u32 idiv, fbdiv, odiv;
+ struct axs10x_pll_clk *clk = to_axs10x_pll_clk(hw);
+
+ idiv = axs10x_div_get_value(axs10x_pll_read(clk, PLL_REG_IDIV));
+ fbdiv = axs10x_div_get_value(axs10x_pll_read(clk, PLL_REG_FBDIV));
+ odiv = axs10x_div_get_value(axs10x_pll_read(clk, PLL_REG_ODIV));
+
+ rate = (u64)parent_rate * fbdiv;
+ do_div(rate, idiv * odiv);
+
+ return rate;
+}
+
+static long axs10x_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *prate)
+{
+ int i;
+ long best_rate;
+ struct axs10x_pll_clk *clk = to_axs10x_pll_clk(hw);
+ const struct axs10x_pll_cfg *pll_cfg = clk->pll_cfg;
+
+ if (pll_cfg[0].rate == 0)
+ return -EINVAL;
+
+ best_rate = pll_cfg[0].rate;
+
+ for (i = 1; pll_cfg[i].rate != 0; i++) {
+ if (abs(rate - pll_cfg[i].rate) < abs(rate - best_rate))
+ best_rate = pll_cfg[i].rate;
+ }
+
+ return best_rate;
+}
+
+static int axs10x_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ int i;
+ struct axs10x_pll_clk *clk = to_axs10x_pll_clk(hw);
+ const struct axs10x_pll_cfg *pll_cfg = clk->pll_cfg;
+
+ for (i = 0; pll_cfg[i].rate != 0; i++) {
+ if (pll_cfg[i].rate == rate) {
+ axs10x_pll_write(clk, PLL_REG_IDIV,
+ axs10x_encode_div(pll_cfg[i].idiv, 0));
+ axs10x_pll_write(clk, PLL_REG_FBDIV,
+ axs10x_encode_div(pll_cfg[i].fbdiv, 0));
+ axs10x_pll_write(clk, PLL_REG_ODIV,
+ axs10x_encode_div(pll_cfg[i].odiv, 1));
+
+ /*
+ * Wait until CGU relocks and check error status.
+ * If after timeout CGU is unlocked yet return error
+ */
+ udelay(PLL_MAX_LOCK_TIME);
+ if (!(ioread32(clk->lock) & PLL_LOCK))
+ return -ETIMEDOUT;
+
+ if (ioread32(clk->lock) & PLL_ERROR)
+ return -EINVAL;
+
+ return 0;
+ }
+ }
+
+ dev_err(clk->dev, "invalid rate=%ld, parent_rate=%ld\n", rate,
+ parent_rate);
+ return -EINVAL;
+}
+
+static const struct clk_ops axs10x_pll_ops = {
+ .recalc_rate = axs10x_pll_recalc_rate,
+ .round_rate = axs10x_pll_round_rate,
+ .set_rate = axs10x_pll_set_rate,
+};
+
+static int axs10x_pll_clk_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ const char *parent_name;
+ struct axs10x_pll_clk *pll_clk;
+ struct resource *mem;
+ struct clk_init_data init = { };
+ int ret;
+
+ pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
+ if (!pll_clk)
+ return -ENOMEM;
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ pll_clk->base = devm_ioremap_resource(dev, mem);
+ if (IS_ERR(pll_clk->base))
+ return PTR_ERR(pll_clk->base);
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ pll_clk->lock = devm_ioremap_resource(dev, mem);
+ if (IS_ERR(pll_clk->lock))
+ return PTR_ERR(pll_clk->lock);
+
+ init.name = dev->of_node->name;
+ init.ops = &axs10x_pll_ops;
+ parent_name = of_clk_get_parent_name(dev->of_node, 0);
+ init.parent_names = &parent_name;
+ init.num_parents = 1;
+ pll_clk->hw.init = &init;
+ pll_clk->dev = dev;
+ pll_clk->pll_cfg = of_device_get_match_data(dev);
+
+ if (!pll_clk->pll_cfg) {
+ dev_err(dev, "No OF match data provided\n");
+ return -EINVAL;
+ }
+
+ ret = devm_clk_hw_register(dev, &pll_clk->hw);
+ if (ret) {
+ dev_err(dev, "failed to register %s clock\n", init.name);
+ return ret;
+ }
+
+ return of_clk_add_hw_provider(dev->of_node, of_clk_hw_simple_get,
+ &pll_clk->hw);
+}
+
+static int axs10x_pll_clk_remove(struct platform_device *pdev)
+{
+ of_clk_del_provider(pdev->dev.of_node);
+ return 0;
+}
+
+static void __init of_axs10x_pll_clk_setup(struct device_node *node)
+{
+ const char *parent_name;
+ struct axs10x_pll_clk *pll_clk;
+ struct clk_init_data init = { };
+ int ret;
+
+ pll_clk = kzalloc(sizeof(*pll_clk), GFP_KERNEL);
+ if (!pll_clk)
+ return;
+
+ pll_clk->base = of_iomap(node, 0);
+ if (!pll_clk->base) {
+ pr_err("failed to map pll div registers\n");
+ goto err_free_pll_clk;
+ }
+
+ pll_clk->lock = of_iomap(node, 1);
+ if (!pll_clk->lock) {
+ pr_err("failed to map pll lock register\n");
+ goto err_unmap_base;
+ }
+
+ init.name = node->name;
+ init.ops = &axs10x_pll_ops;
+ parent_name = of_clk_get_parent_name(node, 0);
+ init.parent_names = &parent_name;
+ init.num_parents = parent_name ? 1 : 0;
+ pll_clk->hw.init = &init;
+ pll_clk->pll_cfg = arc_pll_cfg;
+
+ ret = clk_hw_register(NULL, &pll_clk->hw);
+ if (ret) {
+ pr_err("failed to register %s clock\n", node->name);
+ goto err_unmap_lock;
+ }
+
+ ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &pll_clk->hw);
+ if (ret) {
+ pr_err("failed to add hw provider for %s clock\n", node->name);
+ goto err_unregister_clk;
+ }
+
+ return;
+
+err_unregister_clk:
+ clk_hw_unregister(&pll_clk->hw);
+err_unmap_lock:
+ iounmap(pll_clk->lock);
+err_unmap_base:
+ iounmap(pll_clk->base);
+err_free_pll_clk:
+ kfree(pll_clk);
+}
+CLK_OF_DECLARE(axs10x_pll_clock, "snps,axs10x-arc-pll-clock",
+ of_axs10x_pll_clk_setup);
+
+static const struct of_device_id axs10x_pll_clk_id[] = {
+ { .compatible = "snps,axs10x-pgu-pll-clock", .data = &pgu_pll_cfg},
+ { }
+};
+MODULE_DEVICE_TABLE(of, axs10x_pll_clk_id);
+
+static struct platform_driver axs10x_pll_clk_driver = {
+ .driver = {
+ .name = "axs10x-pll-clock",
+ .of_match_table = axs10x_pll_clk_id,
+ },
+ .probe = axs10x_pll_clk_probe,
+ .remove = axs10x_pll_clk_remove,
+};
+builtin_platform_driver(axs10x_pll_clk_driver);
+
+MODULE_AUTHOR("Vlad Zakharov <[email protected]>");
+MODULE_DESCRIPTION("Synopsys AXS10X SDP Generic PLL Clock Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/berlin/bg2.c b/drivers/clk/berlin/bg2.c
index 1d99292e2039..e7331ace0337 100644
--- a/drivers/clk/berlin/bg2.c
+++ b/drivers/clk/berlin/bg2.c
@@ -679,8 +679,7 @@ static void __init berlin2_clock_setup(struct device_node *np)
if (!IS_ERR(hws[n]))
continue;
- pr_err("%s: Unable to register leaf clock %d\n",
- np->full_name, n);
+ pr_err("%pOF: Unable to register leaf clock %d\n", np, n);
goto bg2_fail;
}
diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c
index 3b784b593afd..67c270b143f7 100644
--- a/drivers/clk/berlin/bg2q.c
+++ b/drivers/clk/berlin/bg2q.c
@@ -304,14 +304,14 @@ static void __init berlin2q_clock_setup(struct device_node *np)
gbase = of_iomap(parent_np, 0);
if (!gbase) {
- pr_err("%s: Unable to map global base\n", np->full_name);
+ pr_err("%pOF: Unable to map global base\n", np);
return;
}
/* BG2Q CPU PLL is not part of global registers */
cpupll_base = of_iomap(parent_np, 1);
if (!cpupll_base) {
- pr_err("%s: Unable to map cpupll base\n", np->full_name);
+ pr_err("%pOF: Unable to map cpupll base\n", np);
iounmap(gbase);
return;
}
@@ -376,8 +376,7 @@ static void __init berlin2q_clock_setup(struct device_node *np)
if (!IS_ERR(hws[n]))
continue;
- pr_err("%s: Unable to register leaf clock %d\n",
- np->full_name, n);
+ pr_err("%pOF: Unable to register leaf clock %d\n", np, n);
goto bg2q_fail;
}
diff --git a/drivers/clk/clk-asm9260.c b/drivers/clk/clk-asm9260.c
index ea8568536193..bf0582cbbf38 100644
--- a/drivers/clk/clk-asm9260.c
+++ b/drivers/clk/clk-asm9260.c
@@ -338,8 +338,8 @@ static void __init asm9260_acc_init(struct device_node *np)
if (!IS_ERR(hws[n]))
continue;
- pr_err("%s: Unable to register leaf clock %d\n",
- np->full_name, n);
+ pr_err("%pOF: Unable to register leaf clock %d\n",
+ np, n);
goto fail;
}
diff --git a/drivers/clk/clk-conf.c b/drivers/clk/clk-conf.c
index 7ec36722f8ab..49819b546134 100644
--- a/drivers/clk/clk-conf.c
+++ b/drivers/clk/clk-conf.c
@@ -23,8 +23,8 @@ static int __set_clk_parents(struct device_node *node, bool clk_supplier)
num_parents = of_count_phandle_with_args(node, "assigned-clock-parents",
"#clock-cells");
if (num_parents == -EINVAL)
- pr_err("clk: invalid value of clock-parents property at %s\n",
- node->full_name);
+ pr_err("clk: invalid value of clock-parents property at %pOF\n",
+ node);
for (index = 0; index < num_parents; index++) {
rc = of_parse_phandle_with_args(node, "assigned-clock-parents",
@@ -41,8 +41,8 @@ static int __set_clk_parents(struct device_node *node, bool clk_supplier)
pclk = of_clk_get_from_provider(&clkspec);
if (IS_ERR(pclk)) {
if (PTR_ERR(pclk) != -EPROBE_DEFER)
- pr_warn("clk: couldn't get parent clock %d for %s\n",
- index, node->full_name);
+ pr_warn("clk: couldn't get parent clock %d for %pOF\n",
+ index, node);
return PTR_ERR(pclk);
}
@@ -57,8 +57,8 @@ static int __set_clk_parents(struct device_node *node, bool clk_supplier)
clk = of_clk_get_from_provider(&clkspec);
if (IS_ERR(clk)) {
if (PTR_ERR(clk) != -EPROBE_DEFER)
- pr_warn("clk: couldn't get assigned clock %d for %s\n",
- index, node->full_name);
+ pr_warn("clk: couldn't get assigned clock %d for %pOF\n",
+ index, node);
rc = PTR_ERR(clk);
goto err;
}
@@ -102,8 +102,8 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
clk = of_clk_get_from_provider(&clkspec);
if (IS_ERR(clk)) {
if (PTR_ERR(clk) != -EPROBE_DEFER)
- pr_warn("clk: couldn't get clock %d for %s\n",
- index, node->full_name);
+ pr_warn("clk: couldn't get clock %d for %pOF\n",
+ index, node);
return PTR_ERR(clk);
}
diff --git a/drivers/clk/clk-cs2000-cp.c b/drivers/clk/clk-cs2000-cp.c
index c54baede4d68..e8ea81c30f0c 100644
--- a/drivers/clk/clk-cs2000-cp.c
+++ b/drivers/clk/clk-cs2000-cp.c
@@ -343,6 +343,15 @@ static int cs2000_set_rate(struct clk_hw *hw,
return __cs2000_set_rate(priv, ch, rate, parent_rate);
}
+static int cs2000_set_saved_rate(struct cs2000_priv *priv)
+{
+ int ch = 0; /* it uses ch0 only at this point */
+
+ return __cs2000_set_rate(priv, ch,
+ priv->saved_rate,
+ priv->saved_parent_rate);
+}
+
static int cs2000_enable(struct clk_hw *hw)
{
struct cs2000_priv *priv = hw_to_priv(hw);
@@ -535,11 +544,8 @@ probe_err:
static int cs2000_resume(struct device *dev)
{
struct cs2000_priv *priv = dev_get_drvdata(dev);
- int ch = 0; /* it uses ch0 only at this point */
- return __cs2000_set_rate(priv, ch,
- priv->saved_rate,
- priv->saved_parent_rate);
+ return cs2000_set_saved_rate(priv);
}
static const struct dev_pm_ops cs2000_pm_ops = {
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index 9bb472cccca6..4ed516cb7276 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -385,12 +385,14 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
struct clk_divider *divider = to_clk_divider(hw);
- unsigned int value;
+ int value;
unsigned long flags = 0;
u32 val;
value = divider_get_val(rate, parent_rate, divider->table,
divider->width, divider->flags);
+ if (value < 0)
+ return value;
if (divider->lock)
spin_lock_irqsave(divider->lock, flags);
@@ -403,7 +405,7 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
val = clk_readl(divider->reg);
val &= ~(div_mask(divider->width) << divider->shift);
}
- val |= value << divider->shift;
+ val |= (u32)value << divider->shift;
clk_writel(val, divider->reg);
if (divider->lock)
diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c
index aab904618eb6..fdf625fb10fa 100644
--- a/drivers/clk/clk-fractional-divider.c
+++ b/drivers/clk/clk-fractional-divider.c
@@ -49,16 +49,12 @@ static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
return ret;
}
-static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long *parent_rate)
+static void clk_fd_general_approximation(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_rate,
+ unsigned long *m, unsigned long *n)
{
struct clk_fractional_divider *fd = to_clk_fd(hw);
unsigned long scale;
- unsigned long m, n;
- u64 ret;
-
- if (!rate || rate >= *parent_rate)
- return *parent_rate;
/*
* Get rate closer to *parent_rate to guarantee there is no overflow
@@ -71,7 +67,23 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
rational_best_approximation(rate, *parent_rate,
GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
- &m, &n);
+ m, n);
+}
+
+static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_rate)
+{
+ struct clk_fractional_divider *fd = to_clk_fd(hw);
+ unsigned long m, n;
+ u64 ret;
+
+ if (!rate || rate >= *parent_rate)
+ return *parent_rate;
+
+ if (fd->approximation)
+ fd->approximation(hw, rate, parent_rate, &m, &n);
+ else
+ clk_fd_general_approximation(hw, rate, parent_rate, &m, &n);
ret = (u64)*parent_rate * m;
do_div(ret, n);
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c
index 4e0c054a787c..dd82485e09a1 100644
--- a/drivers/clk/clk-gate.c
+++ b/drivers/clk/clk-gate.c
@@ -86,7 +86,7 @@ static void clk_gate_disable(struct clk_hw *hw)
clk_gate_endisable(hw, 0);
}
-static int clk_gate_is_enabled(struct clk_hw *hw)
+int clk_gate_is_enabled(struct clk_hw *hw)
{
u32 reg;
struct clk_gate *gate = to_clk_gate(hw);
@@ -101,6 +101,7 @@ static int clk_gate_is_enabled(struct clk_hw *hw)
return reg ? 1 : 0;
}
+EXPORT_SYMBOL_GPL(clk_gate_is_enabled);
const struct clk_ops clk_gate_ops = {
.enable = clk_gate_enable,
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index b4cf2f699a21..f940e5af845b 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -37,7 +37,6 @@ static DEFINE_SPINLOCK(gemini_clk_lock);
#define GEMINI_GLOBAL_MISC_CONTROL 0x30
#define PCI_CLK_66MHZ BIT(18)
-#define PCI_CLK_OE BIT(17)
#define GEMINI_GLOBAL_CLOCK_CONTROL 0x34
#define PCI_CLKRUN_EN BIT(16)
@@ -159,9 +158,6 @@ static int gemini_pci_enable(struct clk_hw *hw)
regmap_update_bits(pciclk->map, GEMINI_GLOBAL_CLOCK_CONTROL,
0, PCI_CLKRUN_EN);
- regmap_update_bits(pciclk->map,
- GEMINI_GLOBAL_MISC_CONTROL,
- 0, PCI_CLK_OE);
return 0;
}
@@ -169,9 +165,6 @@ static void gemini_pci_disable(struct clk_hw *hw)
{
struct clk_gemini_pci *pciclk = to_pciclk(hw);
- regmap_update_bits(pciclk->map,
- GEMINI_GLOBAL_MISC_CONTROL,
- PCI_CLK_OE, 0);
regmap_update_bits(pciclk->map, GEMINI_GLOBAL_CLOCK_CONTROL,
PCI_CLKRUN_EN, 0);
}
diff --git a/drivers/clk/clk-hsdk-pll.c b/drivers/clk/clk-hsdk-pll.c
new file mode 100644
index 000000000000..bbf237173b37
--- /dev/null
+++ b/drivers/clk/clk-hsdk-pll.c
@@ -0,0 +1,431 @@
+/*
+ * Synopsys HSDK SDP Generic PLL clock driver
+ *
+ * Copyright (C) 2017 Synopsys
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#define CGU_PLL_CTRL 0x000 /* ARC PLL control register */
+#define CGU_PLL_STATUS 0x004 /* ARC PLL status register */
+#define CGU_PLL_FMEAS 0x008 /* ARC PLL frequency measurement register */
+#define CGU_PLL_MON 0x00C /* ARC PLL monitor register */
+
+#define CGU_PLL_CTRL_ODIV_SHIFT 2
+#define CGU_PLL_CTRL_IDIV_SHIFT 4
+#define CGU_PLL_CTRL_FBDIV_SHIFT 9
+#define CGU_PLL_CTRL_BAND_SHIFT 20
+
+#define CGU_PLL_CTRL_ODIV_MASK GENMASK(3, CGU_PLL_CTRL_ODIV_SHIFT)
+#define CGU_PLL_CTRL_IDIV_MASK GENMASK(8, CGU_PLL_CTRL_IDIV_SHIFT)
+#define CGU_PLL_CTRL_FBDIV_MASK GENMASK(15, CGU_PLL_CTRL_FBDIV_SHIFT)
+
+#define CGU_PLL_CTRL_PD BIT(0)
+#define CGU_PLL_CTRL_BYPASS BIT(1)
+
+#define CGU_PLL_STATUS_LOCK BIT(0)
+#define CGU_PLL_STATUS_ERR BIT(1)
+
+#define HSDK_PLL_MAX_LOCK_TIME 100 /* 100 us */
+
+#define CGU_PLL_SOURCE_MAX 1
+
+#define CORE_IF_CLK_THRESHOLD_HZ 500000000
+#define CREG_CORE_IF_CLK_DIV_1 0x0
+#define CREG_CORE_IF_CLK_DIV_2 0x1
+
+struct hsdk_pll_cfg {
+ u32 rate;
+ u32 idiv;
+ u32 fbdiv;
+ u32 odiv;
+ u32 band;
+};
+
+static const struct hsdk_pll_cfg asdt_pll_cfg[] = {
+ { 100000000, 0, 11, 3, 0 },
+ { 133000000, 0, 15, 3, 0 },
+ { 200000000, 1, 47, 3, 0 },
+ { 233000000, 1, 27, 2, 0 },
+ { 300000000, 1, 35, 2, 0 },
+ { 333000000, 1, 39, 2, 0 },
+ { 400000000, 1, 47, 2, 0 },
+ { 500000000, 0, 14, 1, 0 },
+ { 600000000, 0, 17, 1, 0 },
+ { 700000000, 0, 20, 1, 0 },
+ { 800000000, 0, 23, 1, 0 },
+ { 900000000, 1, 26, 0, 0 },
+ { 1000000000, 1, 29, 0, 0 },
+ { 1100000000, 1, 32, 0, 0 },
+ { 1200000000, 1, 35, 0, 0 },
+ { 1300000000, 1, 38, 0, 0 },
+ { 1400000000, 1, 41, 0, 0 },
+ { 1500000000, 1, 44, 0, 0 },
+ { 1600000000, 1, 47, 0, 0 },
+ {}
+};
+
+static const struct hsdk_pll_cfg hdmi_pll_cfg[] = {
+ { 297000000, 0, 21, 2, 0 },
+ { 540000000, 0, 19, 1, 0 },
+ { 594000000, 0, 21, 1, 0 },
+ {}
+};
+
+struct hsdk_pll_clk {
+ struct clk_hw hw;
+ void __iomem *regs;
+ void __iomem *spec_regs;
+ const struct hsdk_pll_devdata *pll_devdata;
+ struct device *dev;
+};
+
+struct hsdk_pll_devdata {
+ const struct hsdk_pll_cfg *pll_cfg;
+ int (*update_rate)(struct hsdk_pll_clk *clk, unsigned long rate,
+ const struct hsdk_pll_cfg *cfg);
+};
+
+static int hsdk_pll_core_update_rate(struct hsdk_pll_clk *, unsigned long,
+ const struct hsdk_pll_cfg *);
+static int hsdk_pll_comm_update_rate(struct hsdk_pll_clk *, unsigned long,
+ const struct hsdk_pll_cfg *);
+
+static const struct hsdk_pll_devdata core_pll_devdata = {
+ .pll_cfg = asdt_pll_cfg,
+ .update_rate = hsdk_pll_core_update_rate,
+};
+
+static const struct hsdk_pll_devdata sdt_pll_devdata = {
+ .pll_cfg = asdt_pll_cfg,
+ .update_rate = hsdk_pll_comm_update_rate,
+};
+
+static const struct hsdk_pll_devdata hdmi_pll_devdata = {
+ .pll_cfg = hdmi_pll_cfg,
+ .update_rate = hsdk_pll_comm_update_rate,
+};
+
+static inline void hsdk_pll_write(struct hsdk_pll_clk *clk, u32 reg, u32 val)
+{
+ iowrite32(val, clk->regs + reg);
+}
+
+static inline u32 hsdk_pll_read(struct hsdk_pll_clk *clk, u32 reg)
+{
+ return ioread32(clk->regs + reg);
+}
+
+static inline void hsdk_pll_set_cfg(struct hsdk_pll_clk *clk,
+ const struct hsdk_pll_cfg *cfg)
+{
+ u32 val = 0;
+
+ /* Powerdown and Bypass bits should be cleared */
+ val |= cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
+ val |= cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
+ val |= cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
+ val |= cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
+
+ dev_dbg(clk->dev, "write configurarion: %#x\n", val);
+
+ hsdk_pll_write(clk, CGU_PLL_CTRL, val);
+}
+
+static inline bool hsdk_pll_is_locked(struct hsdk_pll_clk *clk)
+{
+ return !!(hsdk_pll_read(clk, CGU_PLL_STATUS) & CGU_PLL_STATUS_LOCK);
+}
+
+static inline bool hsdk_pll_is_err(struct hsdk_pll_clk *clk)
+{
+ return !!(hsdk_pll_read(clk, CGU_PLL_STATUS) & CGU_PLL_STATUS_ERR);
+}
+
+static inline struct hsdk_pll_clk *to_hsdk_pll_clk(struct clk_hw *hw)
+{
+ return container_of(hw, struct hsdk_pll_clk, hw);
+}
+
+static unsigned long hsdk_pll_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ u32 val;
+ u64 rate;
+ u32 idiv, fbdiv, odiv;
+ struct hsdk_pll_clk *clk = to_hsdk_pll_clk(hw);
+
+ val = hsdk_pll_read(clk, CGU_PLL_CTRL);
+
+ dev_dbg(clk->dev, "current configurarion: %#x\n", val);
+
+ /* Check if PLL is disabled */
+ if (val & CGU_PLL_CTRL_PD)
+ return 0;
+
+ /* Check if PLL is bypassed */
+ if (val & CGU_PLL_CTRL_BYPASS)
+ return parent_rate;
+
+ /* input divider = reg.idiv + 1 */
+ idiv = 1 + ((val & CGU_PLL_CTRL_IDIV_MASK) >> CGU_PLL_CTRL_IDIV_SHIFT);
+ /* fb divider = 2*(reg.fbdiv + 1) */
+ fbdiv = 2 * (1 + ((val & CGU_PLL_CTRL_FBDIV_MASK) >> CGU_PLL_CTRL_FBDIV_SHIFT));
+ /* output divider = 2^(reg.odiv) */
+ odiv = 1 << ((val & CGU_PLL_CTRL_ODIV_MASK) >> CGU_PLL_CTRL_ODIV_SHIFT);
+
+ rate = (u64)parent_rate * fbdiv;
+ do_div(rate, idiv * odiv);
+
+ return rate;
+}
+
+static long hsdk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *prate)
+{
+ int i;
+ unsigned long best_rate;
+ struct hsdk_pll_clk *clk = to_hsdk_pll_clk(hw);
+ const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+
+ if (pll_cfg[0].rate == 0)
+ return -EINVAL;
+
+ best_rate = pll_cfg[0].rate;
+
+ for (i = 1; pll_cfg[i].rate != 0; i++) {
+ if (abs(rate - pll_cfg[i].rate) < abs(rate - best_rate))
+ best_rate = pll_cfg[i].rate;
+ }
+
+ dev_dbg(clk->dev, "chosen best rate: %lu\n", best_rate);
+
+ return best_rate;
+}
+
+static int hsdk_pll_comm_update_rate(struct hsdk_pll_clk *clk,
+ unsigned long rate,
+ const struct hsdk_pll_cfg *cfg)
+{
+ hsdk_pll_set_cfg(clk, cfg);
+
+ /*
+ * Wait until CGU relocks and check error status.
+ * If after timeout CGU is unlocked yet return error.
+ */
+ udelay(HSDK_PLL_MAX_LOCK_TIME);
+ if (!hsdk_pll_is_locked(clk))
+ return -ETIMEDOUT;
+
+ if (hsdk_pll_is_err(clk))
+ return -EINVAL;
+
+ return 0;
+}
+
+static int hsdk_pll_core_update_rate(struct hsdk_pll_clk *clk,
+ unsigned long rate,
+ const struct hsdk_pll_cfg *cfg)
+{
+ /*
+ * When core clock exceeds 500MHz, the divider for the interface
+ * clock must be programmed to div-by-2.
+ */
+ if (rate > CORE_IF_CLK_THRESHOLD_HZ)
+ iowrite32(CREG_CORE_IF_CLK_DIV_2, clk->spec_regs);
+
+ hsdk_pll_set_cfg(clk, cfg);
+
+ /*
+ * Wait until CGU relocks and check error status.
+ * If after timeout CGU is unlocked yet return error.
+ */
+ udelay(HSDK_PLL_MAX_LOCK_TIME);
+ if (!hsdk_pll_is_locked(clk))
+ return -ETIMEDOUT;
+
+ if (hsdk_pll_is_err(clk))
+ return -EINVAL;
+
+ /*
+ * Program divider to div-by-1 if we succesfuly set core clock below
+ * 500MHz threshold.
+ */
+ if (rate <= CORE_IF_CLK_THRESHOLD_HZ)
+ iowrite32(CREG_CORE_IF_CLK_DIV_1, clk->spec_regs);
+
+ return 0;
+}
+
+static int hsdk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ int i;
+ struct hsdk_pll_clk *clk = to_hsdk_pll_clk(hw);
+ const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+
+ for (i = 0; pll_cfg[i].rate != 0; i++) {
+ if (pll_cfg[i].rate == rate) {
+ return clk->pll_devdata->update_rate(clk, rate,
+ &pll_cfg[i]);
+ }
+ }
+
+ dev_err(clk->dev, "invalid rate=%ld, parent_rate=%ld\n", rate,
+ parent_rate);
+
+ return -EINVAL;
+}
+
+static const struct clk_ops hsdk_pll_ops = {
+ .recalc_rate = hsdk_pll_recalc_rate,
+ .round_rate = hsdk_pll_round_rate,
+ .set_rate = hsdk_pll_set_rate,
+};
+
+static int hsdk_pll_clk_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct resource *mem;
+ const char *parent_name;
+ unsigned int num_parents;
+ struct hsdk_pll_clk *pll_clk;
+ struct clk_init_data init = { };
+ struct device *dev = &pdev->dev;
+
+ pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
+ if (!pll_clk)
+ return -ENOMEM;
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ pll_clk->regs = devm_ioremap_resource(dev, mem);
+ if (IS_ERR(pll_clk->regs))
+ return PTR_ERR(pll_clk->regs);
+
+ init.name = dev->of_node->name;
+ init.ops = &hsdk_pll_ops;
+ parent_name = of_clk_get_parent_name(dev->of_node, 0);
+ init.parent_names = &parent_name;
+ num_parents = of_clk_get_parent_count(dev->of_node);
+ if (num_parents == 0 || num_parents > CGU_PLL_SOURCE_MAX) {
+ dev_err(dev, "wrong clock parents number: %u\n", num_parents);
+ return -EINVAL;
+ }
+ init.num_parents = num_parents;
+
+ pll_clk->hw.init = &init;
+ pll_clk->dev = dev;
+ pll_clk->pll_devdata = of_device_get_match_data(dev);
+
+ if (!pll_clk->pll_devdata) {
+ dev_err(dev, "No OF match data provided\n");
+ return -EINVAL;
+ }
+
+ ret = devm_clk_hw_register(dev, &pll_clk->hw);
+ if (ret) {
+ dev_err(dev, "failed to register %s clock\n", init.name);
+ return ret;
+ }
+
+ return of_clk_add_hw_provider(dev->of_node, of_clk_hw_simple_get,
+ &pll_clk->hw);
+}
+
+static int hsdk_pll_clk_remove(struct platform_device *pdev)
+{
+ of_clk_del_provider(pdev->dev.of_node);
+ return 0;
+}
+
+static void __init of_hsdk_pll_clk_setup(struct device_node *node)
+{
+ int ret;
+ const char *parent_name;
+ unsigned int num_parents;
+ struct hsdk_pll_clk *pll_clk;
+ struct clk_init_data init = { };
+
+ pll_clk = kzalloc(sizeof(*pll_clk), GFP_KERNEL);
+ if (!pll_clk)
+ return;
+
+ pll_clk->regs = of_iomap(node, 0);
+ if (!pll_clk->regs) {
+ pr_err("failed to map pll registers\n");
+ goto err_free_pll_clk;
+ }
+
+ pll_clk->spec_regs = of_iomap(node, 1);
+ if (!pll_clk->spec_regs) {
+ pr_err("failed to map pll registers\n");
+ goto err_unmap_comm_regs;
+ }
+
+ init.name = node->name;
+ init.ops = &hsdk_pll_ops;
+ parent_name = of_clk_get_parent_name(node, 0);
+ init.parent_names = &parent_name;
+ num_parents = of_clk_get_parent_count(node);
+ if (num_parents > CGU_PLL_SOURCE_MAX) {
+ pr_err("too much clock parents: %u\n", num_parents);
+ goto err_unmap_spec_regs;
+ }
+ init.num_parents = num_parents;
+
+ pll_clk->hw.init = &init;
+ pll_clk->pll_devdata = &core_pll_devdata;
+
+ ret = clk_hw_register(NULL, &pll_clk->hw);
+ if (ret) {
+ pr_err("failed to register %s clock\n", node->name);
+ goto err_unmap_spec_regs;
+ }
+
+ ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &pll_clk->hw);
+ if (ret) {
+ pr_err("failed to add hw provider for %s clock\n", node->name);
+ goto err_unmap_spec_regs;
+ }
+
+ return;
+
+err_unmap_spec_regs:
+ iounmap(pll_clk->spec_regs);
+err_unmap_comm_regs:
+ iounmap(pll_clk->regs);
+err_free_pll_clk:
+ kfree(pll_clk);
+}
+
+/* Core PLL needed early for ARC cpus timers */
+CLK_OF_DECLARE(hsdk_pll_clock, "snps,hsdk-core-pll-clock",
+of_hsdk_pll_clk_setup);
+
+static const struct of_device_id hsdk_pll_clk_id[] = {
+ { .compatible = "snps,hsdk-gp-pll-clock", .data = &sdt_pll_devdata},
+ { .compatible = "snps,hsdk-hdmi-pll-clock", .data = &hdmi_pll_devdata},
+ { }
+};
+
+static struct platform_driver hsdk_pll_clk_driver = {
+ .driver = {
+ .name = "hsdk-gp-pll-clock",
+ .of_match_table = hsdk_pll_clk_id,
+ },
+ .probe = hsdk_pll_clk_probe,
+ .remove = hsdk_pll_clk_remove,
+};
+builtin_platform_driver(hsdk_pll_clk_driver);
diff --git a/drivers/clk/clk-mb86s7x.c b/drivers/clk/clk-mb86s7x.c
deleted file mode 100644
index 2a83a3ff1d09..000000000000
--- a/drivers/clk/clk-mb86s7x.c
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Copyright (C) 2013-2015 FUJITSU SEMICONDUCTOR LIMITED
- * Copyright (C) 2015 Linaro Ltd.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include <linux/clkdev.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/cpu.h>
-#include <linux/clk-provider.h>
-#include <linux/spinlock.h>
-#include <linux/module.h>
-#include <linux/topology.h>
-#include <linux/mailbox_client.h>
-#include <linux/platform_device.h>
-
-#include <soc/mb86s7x/scb_mhu.h>
-
-#define to_crg_clk(p) container_of(p, struct crg_clk, hw)
-#define to_clc_clk(p) container_of(p, struct cl_clk, hw)
-
-struct mb86s7x_peri_clk {
- u32 payload_size;
- u32 cntrlr;
- u32 domain;
- u32 port;
- u32 en;
- u64 frequency;
-} __packed __aligned(4);
-
-struct hack_rate {
- unsigned clk_id;
- unsigned long rate;
- int gated;
-};
-
-struct crg_clk {
- struct clk_hw hw;
- u8 cntrlr, domain, port;
-};
-
-static int crg_gate_control(struct clk_hw *hw, int en)
-{
- struct crg_clk *crgclk = to_crg_clk(hw);
- struct mb86s7x_peri_clk cmd;
- int ret;
-
- cmd.payload_size = sizeof(cmd);
- cmd.cntrlr = crgclk->cntrlr;
- cmd.domain = crgclk->domain;
- cmd.port = crgclk->port;
- cmd.en = en;
-
- /* Port is UngatedCLK */
- if (cmd.port == 8)
- return en ? 0 : -EINVAL;
-
- pr_debug("%s:%d CMD Cntrlr-%u Dom-%u Port-%u En-%u}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port, cmd.en);
-
- ret = mb86s7x_send_packet(CMD_PERI_CLOCK_GATE_SET_REQ,
- &cmd, sizeof(cmd));
- if (ret < 0) {
- pr_err("%s:%d failed!\n", __func__, __LINE__);
- return ret;
- }
-
- pr_debug("%s:%d REP Cntrlr-%u Dom-%u Port-%u En-%u}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port, cmd.en);
-
- /* If the request was rejected */
- if (cmd.en != en)
- ret = -EINVAL;
- else
- ret = 0;
-
- return ret;
-}
-
-static int crg_port_prepare(struct clk_hw *hw)
-{
- return crg_gate_control(hw, 1);
-}
-
-static void crg_port_unprepare(struct clk_hw *hw)
-{
- crg_gate_control(hw, 0);
-}
-
-static int
-crg_rate_control(struct clk_hw *hw, int set, unsigned long *rate)
-{
- struct crg_clk *crgclk = to_crg_clk(hw);
- struct mb86s7x_peri_clk cmd;
- int code, ret;
-
- cmd.payload_size = sizeof(cmd);
- cmd.cntrlr = crgclk->cntrlr;
- cmd.domain = crgclk->domain;
- cmd.port = crgclk->port;
- cmd.frequency = *rate;
-
- if (set) {
- code = CMD_PERI_CLOCK_RATE_SET_REQ;
- pr_debug("%s:%d CMD Cntrlr-%u Dom-%u Port-%u Rate-SET %lluHz}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port, cmd.frequency);
- } else {
- code = CMD_PERI_CLOCK_RATE_GET_REQ;
- pr_debug("%s:%d CMD Cntrlr-%u Dom-%u Port-%u Rate-GET}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port);
- }
-
- ret = mb86s7x_send_packet(code, &cmd, sizeof(cmd));
- if (ret < 0) {
- pr_err("%s:%d failed!\n", __func__, __LINE__);
- return ret;
- }
-
- if (set)
- pr_debug("%s:%d REP Cntrlr-%u Dom-%u Port-%u Rate-SET %lluHz}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port, cmd.frequency);
- else
- pr_debug("%s:%d REP Cntrlr-%u Dom-%u Port-%u Rate-GOT %lluHz}\n",
- __func__, __LINE__, cmd.cntrlr,
- cmd.domain, cmd.port, cmd.frequency);
-
- *rate = cmd.frequency;
- return 0;
-}
-
-static unsigned long
-crg_port_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
-{
- unsigned long rate;
-
- crg_rate_control(hw, 0, &rate);
-
- return rate;
-}
-
-static long
-crg_port_round_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long *pr)
-{
- return rate;
-}
-
-static int
-crg_port_set_rate(struct clk_hw *hw,
- unsigned long rate, unsigned long parent_rate)
-{
- return crg_rate_control(hw, 1, &rate);
-}
-
-const struct clk_ops crg_port_ops = {
- .prepare = crg_port_prepare,
- .unprepare = crg_port_unprepare,
- .recalc_rate = crg_port_recalc_rate,
- .round_rate = crg_port_round_rate,
- .set_rate = crg_port_set_rate,
-};
-
-struct mb86s70_crg11 {
- struct mutex lock; /* protects CLK populating and searching */
-};
-
-static struct clk *crg11_get(struct of_phandle_args *clkspec, void *data)
-{
- struct mb86s70_crg11 *crg11 = data;
- struct clk_init_data init;
- u32 cntrlr, domain, port;
- struct crg_clk *crgclk;
- struct clk *clk;
- char clkp[20];
-
- if (clkspec->args_count != 3)
- return ERR_PTR(-EINVAL);
-
- cntrlr = clkspec->args[0];
- domain = clkspec->args[1];
- port = clkspec->args[2];
-
- if (port > 7)
- snprintf(clkp, 20, "UngatedCLK%d_%X", cntrlr, domain);
- else
- snprintf(clkp, 20, "CLK%d_%X_%d", cntrlr, domain, port);
-
- mutex_lock(&crg11->lock);
-
- clk = __clk_lookup(clkp);
- if (clk) {
- mutex_unlock(&crg11->lock);
- return clk;
- }
-
- crgclk = kzalloc(sizeof(*crgclk), GFP_KERNEL);
- if (!crgclk) {
- mutex_unlock(&crg11->lock);
- return ERR_PTR(-ENOMEM);
- }
-
- init.name = clkp;
- init.num_parents = 0;
- init.ops = &crg_port_ops;
- init.flags = 0;
- crgclk->hw.init = &init;
- crgclk->cntrlr = cntrlr;
- crgclk->domain = domain;
- crgclk->port = port;
- clk = clk_register(NULL, &crgclk->hw);
- if (IS_ERR(clk))
- pr_err("%s:%d Error!\n", __func__, __LINE__);
- else
- pr_debug("Registered %s\n", clkp);
-
- clk_register_clkdev(clk, clkp, NULL);
- mutex_unlock(&crg11->lock);
- return clk;
-}
-
-static void __init crg_port_init(struct device_node *node)
-{
- struct mb86s70_crg11 *crg11;
-
- crg11 = kzalloc(sizeof(*crg11), GFP_KERNEL);
- if (!crg11)
- return;
-
- mutex_init(&crg11->lock);
-
- of_clk_add_provider(node, crg11_get, crg11);
-}
-CLK_OF_DECLARE(crg11_gate, "fujitsu,mb86s70-crg11", crg_port_init);
-
-struct cl_clk {
- struct clk_hw hw;
- int cluster;
-};
-
-struct mb86s7x_cpu_freq {
- u32 payload_size;
- u32 cluster_class;
- u32 cluster_id;
- u32 cpu_id;
- u64 frequency;
-};
-
-static void mhu_cluster_rate(struct clk_hw *hw, unsigned long *rate, int get)
-{
- struct cl_clk *clc = to_clc_clk(hw);
- struct mb86s7x_cpu_freq cmd;
- int code, ret;
-
- cmd.payload_size = sizeof(cmd);
- cmd.cluster_class = 0;
- cmd.cluster_id = clc->cluster;
- cmd.cpu_id = 0;
- cmd.frequency = *rate;
-
- if (get)
- code = CMD_CPU_CLOCK_RATE_GET_REQ;
- else
- code = CMD_CPU_CLOCK_RATE_SET_REQ;
-
- pr_debug("%s:%d CMD Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
- __func__, __LINE__, cmd.cluster_class,
- cmd.cluster_id, cmd.cpu_id, cmd.frequency);
-
- ret = mb86s7x_send_packet(code, &cmd, sizeof(cmd));
- if (ret < 0) {
- pr_err("%s:%d failed!\n", __func__, __LINE__);
- return;
- }
-
- pr_debug("%s:%d REP Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
- __func__, __LINE__, cmd.cluster_class,
- cmd.cluster_id, cmd.cpu_id, cmd.frequency);
-
- *rate = cmd.frequency;
-}
-
-static unsigned long
-clc_recalc_rate(struct clk_hw *hw, unsigned long unused)
-{
- unsigned long rate;
-
- mhu_cluster_rate(hw, &rate, 1);
- return rate;
-}
-
-static long
-clc_round_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long *unused)
-{
- return rate;
-}
-
-static int
-clc_set_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long unused)
-{
- unsigned long res = rate;
-
- mhu_cluster_rate(hw, &res, 0);
-
- return (res == rate) ? 0 : -EINVAL;
-}
-
-static struct clk_ops clk_clc_ops = {
- .recalc_rate = clc_recalc_rate,
- .round_rate = clc_round_rate,
- .set_rate = clc_set_rate,
-};
-
-static struct clk_hw *mb86s7x_clclk_register(struct device *cpu_dev)
-{
- struct clk_init_data init;
- struct cl_clk *clc;
- int ret;
-
- clc = kzalloc(sizeof(*clc), GFP_KERNEL);
- if (!clc)
- return ERR_PTR(-ENOMEM);
-
- clc->hw.init = &init;
- clc->cluster = topology_physical_package_id(cpu_dev->id);
-
- init.name = dev_name(cpu_dev);
- init.ops = &clk_clc_ops;
- init.flags = CLK_GET_RATE_NOCACHE;
- init.num_parents = 0;
-
- ret = devm_clk_hw_register(cpu_dev, &clc->hw);
- if (ret)
- return ERR_PTR(ret);
- return &clc->hw;
-}
-
-static int mb86s7x_clclk_of_init(void)
-{
- int cpu, ret = -ENODEV;
- struct device_node *np;
- struct clk_hw *hw;
-
- np = of_find_compatible_node(NULL, NULL, "fujitsu,mb86s70-scb-1.0");
- if (!np || !of_device_is_available(np))
- goto exit;
-
- for_each_possible_cpu(cpu) {
- struct device *cpu_dev = get_cpu_device(cpu);
-
- if (!cpu_dev) {
- pr_err("failed to get cpu%d device\n", cpu);
- continue;
- }
-
- hw = mb86s7x_clclk_register(cpu_dev);
- if (IS_ERR(hw)) {
- pr_err("failed to register cpu%d clock\n", cpu);
- continue;
- }
- if (clk_hw_register_clkdev(hw, NULL, dev_name(cpu_dev))) {
- pr_err("failed to register cpu%d clock lookup\n", cpu);
- continue;
- }
- pr_debug("registered clk for %s\n", dev_name(cpu_dev));
- }
- ret = 0;
-
- platform_device_register_simple("arm-bL-cpufreq-dt", -1, NULL, 0);
-exit:
- of_node_put(np);
- return ret;
-}
-module_init(mb86s7x_clclk_of_init);
diff --git a/drivers/clk/clk-moxart.c b/drivers/clk/clk-moxart.c
index b86dac851116..58428d0043fd 100644
--- a/drivers/clk/clk-moxart.c
+++ b/drivers/clk/clk-moxart.c
@@ -18,7 +18,7 @@
static void __init moxart_of_pll_clk_init(struct device_node *node)
{
- static void __iomem *base;
+ void __iomem *base;
struct clk_hw *hw;
struct clk *ref_clk;
unsigned int mul;
@@ -30,7 +30,7 @@ static void __init moxart_of_pll_clk_init(struct device_node *node)
base = of_iomap(node, 0);
if (!base) {
- pr_err("%s: of_iomap failed\n", node->full_name);
+ pr_err("%pOF: of_iomap failed\n", node);
return;
}
@@ -39,13 +39,13 @@ static void __init moxart_of_pll_clk_init(struct device_node *node)
ref_clk = of_clk_get(node, 0);
if (IS_ERR(ref_clk)) {
- pr_err("%s: of_clk_get failed\n", node->full_name);
+ pr_err("%pOF: of_clk_get failed\n", node);
return;
}
hw = clk_hw_register_fixed_factor(NULL, name, parent_name, 0, mul, 1);
if (IS_ERR(hw)) {
- pr_err("%s: failed to register clock\n", node->full_name);
+ pr_err("%pOF: failed to register clock\n", node);
return;
}
@@ -57,7 +57,7 @@ CLK_OF_DECLARE(moxart_pll_clock, "moxa,moxart-pll-clock",
static void __init moxart_of_apb_clk_init(struct device_node *node)
{
- static void __iomem *base;
+ void __iomem *base;
struct clk_hw *hw;
struct clk *pll_clk;
unsigned int div, val;
@@ -70,7 +70,7 @@ static void __init moxart_of_apb_clk_init(struct device_node *node)
base = of_iomap(node, 0);
if (!base) {
- pr_err("%s: of_iomap failed\n", node->full_name);
+ pr_err("%pOF: of_iomap failed\n", node);
return;
}
@@ -83,13 +83,13 @@ static void __init moxart_of_apb_clk_init(struct device_node *node)
pll_clk = of_clk_get(node, 0);
if (IS_ERR(pll_clk)) {
- pr_err("%s: of_clk_get failed\n", node->full_name);
+ pr_err("%pOF: of_clk_get failed\n", node);
return;
}
hw = clk_hw_register_fixed_factor(NULL, name, parent_name, 0, 1, div);
if (IS_ERR(hw)) {
- pr_err("%s: failed to register clock\n", node->full_name);
+ pr_err("%pOF: failed to register clock\n", node);
return;
}
diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c
index f3931e38fac0..b0ea753b8709 100644
--- a/drivers/clk/clk-qoriq.c
+++ b/drivers/clk/clk-qoriq.c
@@ -12,6 +12,7 @@
#include <linux/clk.h>
#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
#include <linux/fsl/guts.h>
#include <linux/io.h>
#include <linux/kernel.h>
@@ -537,6 +538,17 @@ static const struct clockgen_chipinfo chipinfo[] = {
.flags = CG_PLL_8BIT,
},
{
+ .compat = "fsl,ls1088a-clockgen",
+ .cmux_groups = {
+ &clockgen2_cmux_cga12
+ },
+ .cmux_to_group = {
+ 0, 0, -1
+ },
+ .pll_mask = 0x07,
+ .flags = CG_VER3 | CG_LITTLE_ENDIAN,
+ },
+ {
.compat = "fsl,ls1012a-clockgen",
.cmux_groups = {
&ls1012a_cmux
@@ -1113,6 +1125,7 @@ static void __init create_one_pll(struct clockgen *cg, int idx)
for (i = 0; i < ARRAY_SIZE(pll->div); i++) {
struct clk *clk;
+ int ret;
snprintf(pll->div[i].name, sizeof(pll->div[i].name),
"cg-pll%d-div%d", idx, i + 1);
@@ -1126,6 +1139,11 @@ static void __init create_one_pll(struct clockgen *cg, int idx)
}
pll->div[i].clk = clk;
+ ret = clk_register_clkdev(clk, pll->div[i].name, NULL);
+ if (ret != 0)
+ pr_err("%s: %s: register to lookup table failed %ld\n",
+ __func__, pll->div[i].name, PTR_ERR(clk));
+
}
}
@@ -1348,8 +1366,7 @@ static void __init clockgen_init(struct device_node *np)
}
if (i == ARRAY_SIZE(chipinfo)) {
- pr_err("%s: unknown clockgen node %s\n", __func__,
- np->full_name);
+ pr_err("%s: unknown clockgen node %pOF\n", __func__, np);
goto err;
}
clockgen.info = chipinfo[i];
@@ -1362,8 +1379,8 @@ static void __init clockgen_init(struct device_node *np)
if (guts) {
clockgen.guts = of_iomap(guts, 0);
if (!clockgen.guts) {
- pr_err("%s: Couldn't map %s regs\n", __func__,
- guts->full_name);
+ pr_err("%s: Couldn't map %pOF regs\n", __func__,
+ guts);
}
}
@@ -1398,6 +1415,7 @@ CLK_OF_DECLARE(qoriq_clockgen_ls1012a, "fsl,ls1012a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls1043a, "fsl,ls1043a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls1046a, "fsl,ls1046a-clockgen", clockgen_init);
+CLK_OF_DECLARE(qoriq_clockgen_ls1088a, "fsl,ls1088a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen", clockgen_init);
/* Legacy nodes */
diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
index 2492442eea77..20d90769cced 100644
--- a/drivers/clk/clk-si5351.c
+++ b/drivers/clk/clk-si5351.c
@@ -519,6 +519,11 @@ static int si5351_pll_set_rate(struct clk_hw *hw, unsigned long rate,
SI5351_CLK_INTEGER_MODE,
(hwdata->params.p2 == 0) ? SI5351_CLK_INTEGER_MODE : 0);
+ /* Do a pll soft reset on the affected pll */
+ si5351_reg_write(hwdata->drvdata, SI5351_PLL_RESET,
+ hwdata->num == 0 ? SI5351_PLL_RESET_A :
+ SI5351_PLL_RESET_B);
+
dev_dbg(&hwdata->drvdata->client->dev,
"%s - %s: p1 = %lu, p2 = %lu, p3 = %lu, parent_rate = %lu, rate = %lu\n",
__func__, clk_hw_get_name(hw),
@@ -1091,13 +1096,6 @@ static int si5351_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
si5351_set_bits(hwdata->drvdata, SI5351_CLK0_CTRL + hwdata->num,
SI5351_CLK_POWERDOWN, 0);
- /*
- * Do a pll soft reset on both plls, needed in some cases to get
- * all outputs running.
- */
- si5351_reg_write(hwdata->drvdata, SI5351_PLL_RESET,
- SI5351_PLL_RESET_A | SI5351_PLL_RESET_B);
-
dev_dbg(&hwdata->drvdata->client->dev,
"%s - %s: rdiv = %u, parent_rate = %lu, rate = %lu\n",
__func__, clk_hw_get_name(hw), (1 << rdiv),
diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c
index 68e2a4e499f1..96c6b6bc8f0e 100644
--- a/drivers/clk/clk-stm32f4.c
+++ b/drivers/clk/clk-stm32f4.c
@@ -1541,8 +1541,8 @@ static void __init stm32f4_rcc_init(struct device_node *np)
base + gd->offset, gd->bit_idx, 0, &stm32f4_clk_lock);
if (IS_ERR(clks[idx])) {
- pr_err("%s: Unable to register leaf clock %s\n",
- np->full_name, gd->name);
+ pr_err("%pOF: Unable to register leaf clock %s\n",
+ np, gd->name);
goto fail;
}
}
diff --git a/drivers/clk/clk-stm32h7.c b/drivers/clk/clk-stm32h7.c
new file mode 100644
index 000000000000..a94c3f56c590
--- /dev/null
+++ b/drivers/clk/clk-stm32h7.c
@@ -0,0 +1,1410 @@
+/*
+ * Copyright (C) Gabriel Fernandez 2017
+ * Author: Gabriel Fernandez <[email protected]>
+ *
+ * License terms: GPL V2.0.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/stm32h7-clks.h>
+
+/* Reset Clock Control Registers */
+#define RCC_CR 0x00
+#define RCC_CFGR 0x10
+#define RCC_D1CFGR 0x18
+#define RCC_D2CFGR 0x1C
+#define RCC_D3CFGR 0x20
+#define RCC_PLLCKSELR 0x28
+#define RCC_PLLCFGR 0x2C
+#define RCC_PLL1DIVR 0x30
+#define RCC_PLL1FRACR 0x34
+#define RCC_PLL2DIVR 0x38
+#define RCC_PLL2FRACR 0x3C
+#define RCC_PLL3DIVR 0x40
+#define RCC_PLL3FRACR 0x44
+#define RCC_D1CCIPR 0x4C
+#define RCC_D2CCIP1R 0x50
+#define RCC_D2CCIP2R 0x54
+#define RCC_D3CCIPR 0x58
+#define RCC_BDCR 0x70
+#define RCC_CSR 0x74
+#define RCC_AHB3ENR 0xD4
+#define RCC_AHB1ENR 0xD8
+#define RCC_AHB2ENR 0xDC
+#define RCC_AHB4ENR 0xE0
+#define RCC_APB3ENR 0xE4
+#define RCC_APB1LENR 0xE8
+#define RCC_APB1HENR 0xEC
+#define RCC_APB2ENR 0xF0
+#define RCC_APB4ENR 0xF4
+
+static DEFINE_SPINLOCK(stm32rcc_lock);
+
+static void __iomem *base;
+static struct clk_hw **hws;
+
+/* System clock parent */
+static const char * const sys_src[] = {
+ "hsi_ck", "csi_ck", "hse_ck", "pll1_p" };
+
+static const char * const tracein_src[] = {
+ "hsi_ck", "csi_ck", "hse_ck", "pll1_r" };
+
+static const char * const per_src[] = {
+ "hsi_ker", "csi_ker", "hse_ck", "disabled" };
+
+static const char * const pll_src[] = {
+ "hsi_ck", "csi_ck", "hse_ck", "no clock" };
+
+static const char * const sdmmc_src[] = { "pll1_q", "pll2_r" };
+
+static const char * const dsi_src[] = { "ck_dsi_phy", "pll2_q" };
+
+static const char * const qspi_src[] = {
+ "hclk", "pll1_q", "pll2_r", "per_ck" };
+
+static const char * const fmc_src[] = {
+ "hclk", "pll1_q", "pll2_r", "per_ck" };
+
+/* Kernel clock parent */
+static const char * const swp_src[] = { "pclk1", "hsi_ker" };
+
+static const char * const fdcan_src[] = { "hse_ck", "pll1_q", "pll2_q" };
+
+static const char * const dfsdm1_src[] = { "pclk2", "sys_ck" };
+
+static const char * const spdifrx_src[] = {
+ "pll1_q", "pll2_r", "pll3_r", "hsi_ker" };
+
+static const char *spi_src1[5] = {
+ "pll1_q", "pll2_p", "pll3_p", NULL, "per_ck" };
+
+static const char * const spi_src2[] = {
+ "pclk2", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "hse_ck" };
+
+static const char * const spi_src3[] = {
+ "pclk4", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "hse_ck" };
+
+static const char * const lptim_src1[] = {
+ "pclk1", "pll2_p", "pll3_r", "lse_ck", "lsi_ck", "per_ck" };
+
+static const char * const lptim_src2[] = {
+ "pclk4", "pll2_p", "pll3_r", "lse_ck", "lsi_ck", "per_ck" };
+
+static const char * const cec_src[] = {"lse_ck", "lsi_ck", "csi_ker_div122" };
+
+static const char * const usbotg_src[] = {"pll1_q", "pll3_q", "rc48_ck" };
+
+/* i2c 1,2,3 src */
+static const char * const i2c_src1[] = {
+ "pclk1", "pll3_r", "hsi_ker", "csi_ker" };
+
+static const char * const i2c_src2[] = {
+ "pclk4", "pll3_r", "hsi_ker", "csi_ker" };
+
+static const char * const rng_src[] = {
+ "rc48_ck", "pll1_q", "lse_ck", "lsi_ck" };
+
+/* usart 1,6 src */
+static const char * const usart_src1[] = {
+ "pclk2", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "lse_ck" };
+
+/* usart 2,3,4,5,7,8 src */
+static const char * const usart_src2[] = {
+ "pclk1", "pll2_q", "pll3_q", "hsi_ker", "csi_ker", "lse_ck" };
+
+static const char *sai_src[5] = {
+ "pll1_q", "pll2_p", "pll3_p", NULL, "per_ck" };
+
+static const char * const adc_src[] = { "pll2_p", "pll3_r", "per_ck" };
+
+/* lptim 2,3,4,5 src */
+static const char * const lpuart1_src[] = {
+ "pclk3", "pll2_q", "pll3_q", "csi_ker", "lse_ck" };
+
+static const char * const hrtim_src[] = { "tim2_ker", "d1cpre" };
+
+/* RTC clock parent */
+static const char * const rtc_src[] = { "off", "lse_ck", "lsi_ck", "hse_1M" };
+
+/* Micro-controller output clock parent */
+static const char * const mco_src1[] = {
+ "hsi_ck", "lse_ck", "hse_ck", "pll1_q", "rc48_ck" };
+
+static const char * const mco_src2[] = {
+ "sys_ck", "pll2_p", "hse_ck", "pll1_p", "csi_ck", "lsi_ck" };
+
+/* LCD clock */
+static const char * const ltdc_src[] = {"pll3_r"};
+
+/* Gate clock with ready bit and backup domain management */
+struct stm32_ready_gate {
+ struct clk_gate gate;
+ u8 bit_rdy;
+};
+
+#define to_ready_gate_clk(_rgate) container_of(_rgate, struct stm32_ready_gate,\
+ gate)
+
+#define RGATE_TIMEOUT 10000
+
+static int ready_gate_clk_enable(struct clk_hw *hw)
+{
+ struct clk_gate *gate = to_clk_gate(hw);
+ struct stm32_ready_gate *rgate = to_ready_gate_clk(gate);
+ int bit_status;
+ unsigned int timeout = RGATE_TIMEOUT;
+
+ if (clk_gate_ops.is_enabled(hw))
+ return 0;
+
+ clk_gate_ops.enable(hw);
+
+ /* We can't use readl_poll_timeout() because we can blocked if
+ * someone enables this clock before clocksource changes.
+ * Only jiffies counter is available. Jiffies are incremented by
+ * interruptions and enable op does not allow to be interrupted.
+ */
+ do {
+ bit_status = !(readl(gate->reg) & BIT(rgate->bit_rdy));
+
+ if (bit_status)
+ udelay(100);
+
+ } while (bit_status && --timeout);
+
+ return bit_status;
+}
+
+static void ready_gate_clk_disable(struct clk_hw *hw)
+{
+ struct clk_gate *gate = to_clk_gate(hw);
+ struct stm32_ready_gate *rgate = to_ready_gate_clk(gate);
+ int bit_status;
+ unsigned int timeout = RGATE_TIMEOUT;
+
+ if (!clk_gate_ops.is_enabled(hw))
+ return;
+
+ clk_gate_ops.disable(hw);
+
+ do {
+ bit_status = !!(readl(gate->reg) & BIT(rgate->bit_rdy));
+
+ if (bit_status)
+ udelay(100);
+
+ } while (bit_status && --timeout);
+}
+
+static const struct clk_ops ready_gate_clk_ops = {
+ .enable = ready_gate_clk_enable,
+ .disable = ready_gate_clk_disable,
+ .is_enabled = clk_gate_is_enabled,
+};
+
+static struct clk_hw *clk_register_ready_gate(struct device *dev,
+ const char *name, const char *parent_name,
+ void __iomem *reg, u8 bit_idx, u8 bit_rdy,
+ unsigned long flags, spinlock_t *lock)
+{
+ struct stm32_ready_gate *rgate;
+ struct clk_init_data init = { NULL };
+ struct clk_hw *hw;
+ int ret;
+
+ rgate = kzalloc(sizeof(*rgate), GFP_KERNEL);
+ if (!rgate)
+ return ERR_PTR(-ENOMEM);
+
+ init.name = name;
+ init.ops = &ready_gate_clk_ops;
+ init.flags = flags;
+ init.parent_names = &parent_name;
+ init.num_parents = 1;
+
+ rgate->bit_rdy = bit_rdy;
+ rgate->gate.lock = lock;
+ rgate->gate.reg = reg;
+ rgate->gate.bit_idx = bit_idx;
+ rgate->gate.hw.init = &init;
+
+ hw = &rgate->gate.hw;
+ ret = clk_hw_register(dev, hw);
+ if (ret) {
+ kfree(rgate);
+ hw = ERR_PTR(ret);
+ }
+
+ return hw;
+}
+
+struct gate_cfg {
+ u32 offset;
+ u8 bit_idx;
+};
+
+struct muxdiv_cfg {
+ u32 offset;
+ u8 shift;
+ u8 width;
+};
+
+struct composite_clk_cfg {
+ struct gate_cfg *gate;
+ struct muxdiv_cfg *mux;
+ struct muxdiv_cfg *div;
+ const char *name;
+ const char * const *parent_name;
+ int num_parents;
+ u32 flags;
+};
+
+struct composite_clk_gcfg_t {
+ u8 flags;
+ const struct clk_ops *ops;
+};
+
+/*
+ * General config definition of a composite clock (only clock diviser for rate)
+ */
+struct composite_clk_gcfg {
+ struct composite_clk_gcfg_t *mux;
+ struct composite_clk_gcfg_t *div;
+ struct composite_clk_gcfg_t *gate;
+};
+
+#define M_CFG_MUX(_mux_ops, _mux_flags)\
+ .mux = &(struct composite_clk_gcfg_t) { _mux_flags, _mux_ops}
+
+#define M_CFG_DIV(_rate_ops, _rate_flags)\
+ .div = &(struct composite_clk_gcfg_t) {_rate_flags, _rate_ops}
+
+#define M_CFG_GATE(_gate_ops, _gate_flags)\
+ .gate = &(struct composite_clk_gcfg_t) { _gate_flags, _gate_ops}
+
+static struct clk_mux *_get_cmux(void __iomem *reg, u8 shift, u8 width,
+ u32 flags, spinlock_t *lock)
+{
+ struct clk_mux *mux;
+
+ mux = kzalloc(sizeof(*mux), GFP_KERNEL);
+ if (!mux)
+ return ERR_PTR(-ENOMEM);
+
+ mux->reg = reg;
+ mux->shift = shift;
+ mux->mask = (1 << width) - 1;
+ mux->flags = flags;
+ mux->lock = lock;
+
+ return mux;
+}
+
+static struct clk_divider *_get_cdiv(void __iomem *reg, u8 shift, u8 width,
+ u32 flags, spinlock_t *lock)
+{
+ struct clk_divider *div;
+
+ div = kzalloc(sizeof(*div), GFP_KERNEL);
+
+ if (!div)
+ return ERR_PTR(-ENOMEM);
+
+ div->reg = reg;
+ div->shift = shift;
+ div->width = width;
+ div->flags = flags;
+ div->lock = lock;
+
+ return div;
+}
+
+static struct clk_gate *_get_cgate(void __iomem *reg, u8 bit_idx, u32 flags,
+ spinlock_t *lock)
+{
+ struct clk_gate *gate;
+
+ gate = kzalloc(sizeof(*gate), GFP_KERNEL);
+ if (!gate)
+ return ERR_PTR(-ENOMEM);
+
+ gate->reg = reg;
+ gate->bit_idx = bit_idx;
+ gate->flags = flags;
+ gate->lock = lock;
+
+ return gate;
+}
+
+struct composite_cfg {
+ struct clk_hw *mux_hw;
+ struct clk_hw *div_hw;
+ struct clk_hw *gate_hw;
+
+ const struct clk_ops *mux_ops;
+ const struct clk_ops *div_ops;
+ const struct clk_ops *gate_ops;
+};
+
+static void get_cfg_composite_div(const struct composite_clk_gcfg *gcfg,
+ const struct composite_clk_cfg *cfg,
+ struct composite_cfg *composite, spinlock_t *lock)
+{
+ struct clk_mux *mux = NULL;
+ struct clk_divider *div = NULL;
+ struct clk_gate *gate = NULL;
+ const struct clk_ops *mux_ops, *div_ops, *gate_ops;
+ struct clk_hw *mux_hw;
+ struct clk_hw *div_hw;
+ struct clk_hw *gate_hw;
+
+ mux_ops = div_ops = gate_ops = NULL;
+ mux_hw = div_hw = gate_hw = NULL;
+
+ if (gcfg->mux && gcfg->mux) {
+ mux = _get_cmux(base + cfg->mux->offset,
+ cfg->mux->shift,
+ cfg->mux->width,
+ gcfg->mux->flags, lock);
+
+ if (!IS_ERR(mux)) {
+ mux_hw = &mux->hw;
+ mux_ops = gcfg->mux->ops ?
+ gcfg->mux->ops : &clk_mux_ops;
+ }
+ }
+
+ if (gcfg->div && cfg->div) {
+ div = _get_cdiv(base + cfg->div->offset,
+ cfg->div->shift,
+ cfg->div->width,
+ gcfg->div->flags, lock);
+
+ if (!IS_ERR(div)) {
+ div_hw = &div->hw;
+ div_ops = gcfg->div->ops ?
+ gcfg->div->ops : &clk_divider_ops;
+ }
+ }
+
+ if (gcfg->gate && gcfg->gate) {
+ gate = _get_cgate(base + cfg->gate->offset,
+ cfg->gate->bit_idx,
+ gcfg->gate->flags, lock);
+
+ if (!IS_ERR(gate)) {
+ gate_hw = &gate->hw;
+ gate_ops = gcfg->gate->ops ?
+ gcfg->gate->ops : &clk_gate_ops;
+ }
+ }
+
+ composite->mux_hw = mux_hw;
+ composite->mux_ops = mux_ops;
+
+ composite->div_hw = div_hw;
+ composite->div_ops = div_ops;
+
+ composite->gate_hw = gate_hw;
+ composite->gate_ops = gate_ops;
+}
+
+/* Kernel Timer */
+struct timer_ker {
+ u8 dppre_shift;
+ struct clk_hw hw;
+ spinlock_t *lock;
+};
+
+#define to_timer_ker(_hw) container_of(_hw, struct timer_ker, hw)
+
+static unsigned long timer_ker_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct timer_ker *clk_elem = to_timer_ker(hw);
+ u32 timpre;
+ u32 dppre_shift = clk_elem->dppre_shift;
+ u32 prescaler;
+ u32 mul;
+
+ timpre = (readl(base + RCC_CFGR) >> 15) & 0x01;
+
+ prescaler = (readl(base + RCC_D2CFGR) >> dppre_shift) & 0x03;
+
+ mul = 2;
+
+ if (prescaler < 4)
+ mul = 1;
+
+ else if (timpre && prescaler > 4)
+ mul = 4;
+
+ return parent_rate * mul;
+}
+
+static const struct clk_ops timer_ker_ops = {
+ .recalc_rate = timer_ker_recalc_rate,
+};
+
+static struct clk_hw *clk_register_stm32_timer_ker(struct device *dev,
+ const char *name, const char *parent_name,
+ unsigned long flags,
+ u8 dppre_shift,
+ spinlock_t *lock)
+{
+ struct timer_ker *element;
+ struct clk_init_data init;
+ struct clk_hw *hw;
+ int err;
+
+ element = kzalloc(sizeof(*element), GFP_KERNEL);
+ if (!element)
+ return ERR_PTR(-ENOMEM);
+
+ init.name = name;
+ init.ops = &timer_ker_ops;
+ init.flags = flags;
+ init.parent_names = &parent_name;
+ init.num_parents = 1;
+
+ element->hw.init = &init;
+ element->lock = lock;
+ element->dppre_shift = dppre_shift;
+
+ hw = &element->hw;
+ err = clk_hw_register(dev, hw);
+
+ if (err) {
+ kfree(element);
+ return ERR_PTR(err);
+ }
+
+ return hw;
+}
+
+static const struct clk_div_table d1cpre_div_table[] = {
+ { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1},
+ { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1},
+ { 8, 2 }, { 9, 4 }, { 10, 8 }, { 11, 16 },
+ { 12, 64 }, { 13, 128 }, { 14, 256 },
+ { 15, 512 },
+ { 0 },
+};
+
+static const struct clk_div_table ppre_div_table[] = {
+ { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1},
+ { 4, 2 }, { 5, 4 }, { 6, 8 }, { 7, 16 },
+ { 0 },
+};
+
+static void register_core_and_bus_clocks(void)
+{
+ /* CORE AND BUS */
+ hws[SYS_D1CPRE] = clk_hw_register_divider_table(NULL, "d1cpre",
+ "sys_ck", CLK_IGNORE_UNUSED, base + RCC_D1CFGR, 8, 4, 0,
+ d1cpre_div_table, &stm32rcc_lock);
+
+ hws[HCLK] = clk_hw_register_divider_table(NULL, "hclk", "d1cpre",
+ CLK_IGNORE_UNUSED, base + RCC_D1CFGR, 0, 4, 0,
+ d1cpre_div_table, &stm32rcc_lock);
+
+ /* D1 DOMAIN */
+ /* * CPU Systick */
+ hws[CPU_SYSTICK] = clk_hw_register_fixed_factor(NULL, "systick",
+ "d1cpre", 0, 1, 8);
+
+ /* * APB3 peripheral */
+ hws[PCLK3] = clk_hw_register_divider_table(NULL, "pclk3", "hclk", 0,
+ base + RCC_D1CFGR, 4, 3, 0,
+ ppre_div_table, &stm32rcc_lock);
+
+ /* D2 DOMAIN */
+ /* * APB1 peripheral */
+ hws[PCLK1] = clk_hw_register_divider_table(NULL, "pclk1", "hclk", 0,
+ base + RCC_D2CFGR, 4, 3, 0,
+ ppre_div_table, &stm32rcc_lock);
+
+ /* Timers prescaler clocks */
+ clk_register_stm32_timer_ker(NULL, "tim1_ker", "pclk1", 0,
+ 4, &stm32rcc_lock);
+
+ /* * APB2 peripheral */
+ hws[PCLK2] = clk_hw_register_divider_table(NULL, "pclk2", "hclk", 0,
+ base + RCC_D2CFGR, 8, 3, 0, ppre_div_table,
+ &stm32rcc_lock);
+
+ clk_register_stm32_timer_ker(NULL, "tim2_ker", "pclk2", 0, 8,
+ &stm32rcc_lock);
+
+ /* D3 DOMAIN */
+ /* * APB4 peripheral */
+ hws[PCLK4] = clk_hw_register_divider_table(NULL, "pclk4", "hclk", 0,
+ base + RCC_D3CFGR, 4, 3, 0,
+ ppre_div_table, &stm32rcc_lock);
+}
+
+/* MUX clock configuration */
+struct stm32_mux_clk {
+ const char *name;
+ const char * const *parents;
+ u8 num_parents;
+ u32 offset;
+ u8 shift;
+ u8 width;
+ u32 flags;
+};
+
+#define M_MCLOCF(_name, _parents, _mux_offset, _mux_shift, _mux_width, _flags)\
+{\
+ .name = _name,\
+ .parents = _parents,\
+ .num_parents = ARRAY_SIZE(_parents),\
+ .offset = _mux_offset,\
+ .shift = _mux_shift,\
+ .width = _mux_width,\
+ .flags = _flags,\
+}
+
+#define M_MCLOC(_name, _parents, _mux_offset, _mux_shift, _mux_width)\
+ M_MCLOCF(_name, _parents, _mux_offset, _mux_shift, _mux_width, 0)\
+
+static const struct stm32_mux_clk stm32_mclk[] __initconst = {
+ M_MCLOC("per_ck", per_src, RCC_D1CCIPR, 28, 3),
+ M_MCLOC("pllsrc", pll_src, RCC_PLLCKSELR, 0, 3),
+ M_MCLOC("sys_ck", sys_src, RCC_CFGR, 0, 3),
+ M_MCLOC("tracein_ck", tracein_src, RCC_CFGR, 0, 3),
+};
+
+/* Oscillary clock configuration */
+struct stm32_osc_clk {
+ const char *name;
+ const char *parent;
+ u32 gate_offset;
+ u8 bit_idx;
+ u8 bit_rdy;
+ u32 flags;
+};
+
+#define OSC_CLKF(_name, _parent, _gate_offset, _bit_idx, _bit_rdy, _flags)\
+{\
+ .name = _name,\
+ .parent = _parent,\
+ .gate_offset = _gate_offset,\
+ .bit_idx = _bit_idx,\
+ .bit_rdy = _bit_rdy,\
+ .flags = _flags,\
+}
+
+#define OSC_CLK(_name, _parent, _gate_offset, _bit_idx, _bit_rdy)\
+ OSC_CLKF(_name, _parent, _gate_offset, _bit_idx, _bit_rdy, 0)
+
+static const struct stm32_osc_clk stm32_oclk[] __initconst = {
+ OSC_CLKF("hsi_ck", "hsidiv", RCC_CR, 0, 2, CLK_IGNORE_UNUSED),
+ OSC_CLKF("hsi_ker", "hsidiv", RCC_CR, 1, 2, CLK_IGNORE_UNUSED),
+ OSC_CLKF("csi_ck", "clk-csi", RCC_CR, 7, 8, CLK_IGNORE_UNUSED),
+ OSC_CLKF("csi_ker", "clk-csi", RCC_CR, 9, 8, CLK_IGNORE_UNUSED),
+ OSC_CLKF("rc48_ck", "clk-rc48", RCC_CR, 12, 13, CLK_IGNORE_UNUSED),
+ OSC_CLKF("lsi_ck", "clk-lsi", RCC_CSR, 0, 1, CLK_IGNORE_UNUSED),
+};
+
+/* PLL configuration */
+struct st32h7_pll_cfg {
+ u8 bit_idx;
+ u32 offset_divr;
+ u8 bit_frac_en;
+ u32 offset_frac;
+ u8 divm;
+};
+
+struct stm32_pll_data {
+ const char *name;
+ const char *parent_name;
+ unsigned long flags;
+ const struct st32h7_pll_cfg *cfg;
+};
+
+static const struct st32h7_pll_cfg stm32h7_pll1 = {
+ .bit_idx = 24,
+ .offset_divr = RCC_PLL1DIVR,
+ .bit_frac_en = 0,
+ .offset_frac = RCC_PLL1FRACR,
+ .divm = 4,
+};
+
+static const struct st32h7_pll_cfg stm32h7_pll2 = {
+ .bit_idx = 26,
+ .offset_divr = RCC_PLL2DIVR,
+ .bit_frac_en = 4,
+ .offset_frac = RCC_PLL2FRACR,
+ .divm = 12,
+};
+
+static const struct st32h7_pll_cfg stm32h7_pll3 = {
+ .bit_idx = 28,
+ .offset_divr = RCC_PLL3DIVR,
+ .bit_frac_en = 8,
+ .offset_frac = RCC_PLL3FRACR,
+ .divm = 20,
+};
+
+static const struct stm32_pll_data stm32_pll[] = {
+ { "vco1", "pllsrc", CLK_IGNORE_UNUSED, &stm32h7_pll1 },
+ { "vco2", "pllsrc", 0, &stm32h7_pll2 },
+ { "vco3", "pllsrc", 0, &stm32h7_pll3 },
+};
+
+struct stm32_fractional_divider {
+ void __iomem *mreg;
+ u8 mshift;
+ u8 mwidth;
+ u32 mmask;
+
+ void __iomem *nreg;
+ u8 nshift;
+ u8 nwidth;
+
+ void __iomem *freg_status;
+ u8 freg_bit;
+ void __iomem *freg_value;
+ u8 fshift;
+ u8 fwidth;
+
+ u8 flags;
+ struct clk_hw hw;
+ spinlock_t *lock;
+};
+
+struct stm32_pll_obj {
+ spinlock_t *lock;
+ struct stm32_fractional_divider div;
+ struct stm32_ready_gate rgate;
+ struct clk_hw hw;
+};
+
+#define to_pll(_hw) container_of(_hw, struct stm32_pll_obj, hw)
+
+static int pll_is_enabled(struct clk_hw *hw)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
+
+ __clk_hw_set_clk(_hw, hw);
+
+ return ready_gate_clk_ops.is_enabled(_hw);
+}
+
+static int pll_enable(struct clk_hw *hw)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
+
+ __clk_hw_set_clk(_hw, hw);
+
+ return ready_gate_clk_ops.enable(_hw);
+}
+
+static void pll_disable(struct clk_hw *hw)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct clk_hw *_hw = &clk_elem->rgate.gate.hw;
+
+ __clk_hw_set_clk(_hw, hw);
+
+ ready_gate_clk_ops.disable(_hw);
+}
+
+static int pll_frac_is_enabled(struct clk_hw *hw)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct stm32_fractional_divider *fd = &clk_elem->div;
+
+ return (readl(fd->freg_status) >> fd->freg_bit) & 0x01;
+}
+
+static unsigned long pll_read_frac(struct clk_hw *hw)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct stm32_fractional_divider *fd = &clk_elem->div;
+
+ return (readl(fd->freg_value) >> fd->fshift) &
+ GENMASK(fd->fwidth - 1, 0);
+}
+
+static unsigned long pll_fd_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct stm32_pll_obj *clk_elem = to_pll(hw);
+ struct stm32_fractional_divider *fd = &clk_elem->div;
+ unsigned long m, n;
+ u32 val, mask;
+ u64 rate, rate1 = 0;
+
+ val = readl(fd->mreg);
+ mask = GENMASK(fd->mwidth - 1, 0) << fd->mshift;
+ m = (val & mask) >> fd->mshift;
+
+ val = readl(fd->nreg);
+ mask = GENMASK(fd->nwidth - 1, 0) << fd->nshift;
+ n = ((val & mask) >> fd->nshift) + 1;
+
+ if (!n || !m)
+ return parent_rate;
+
+ rate = (u64)parent_rate * n;
+ do_div(rate, m);
+
+ if (pll_frac_is_enabled(hw)) {
+ val = pll_read_frac(hw);
+ rate1 = (u64)parent_rate * (u64)val;
+ do_div(rate1, (m * 8191));
+ }
+
+ return rate + rate1;
+}
+
+static const struct clk_ops pll_ops = {
+ .enable = pll_enable,
+ .disable = pll_disable,
+ .is_enabled = pll_is_enabled,
+ .recalc_rate = pll_fd_recalc_rate,
+};
+
+static struct clk_hw *clk_register_stm32_pll(struct device *dev,
+ const char *name,
+ const char *parent,
+ unsigned long flags,
+ const struct st32h7_pll_cfg *cfg,
+ spinlock_t *lock)
+{
+ struct stm32_pll_obj *pll;
+ struct clk_init_data init = { NULL };
+ struct clk_hw *hw;
+ int ret;
+ struct stm32_fractional_divider *div = NULL;
+ struct stm32_ready_gate *rgate;
+
+ pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+ if (!pll)
+ return ERR_PTR(-ENOMEM);
+
+ init.name = name;
+ init.ops = &pll_ops;
+ init.flags = flags;
+ init.parent_names = &parent;
+ init.num_parents = 1;
+ pll->hw.init = &init;
+
+ hw = &pll->hw;
+ rgate = &pll->rgate;
+
+ rgate->bit_rdy = cfg->bit_idx + 1;
+ rgate->gate.lock = lock;
+ rgate->gate.reg = base + RCC_CR;
+ rgate->gate.bit_idx = cfg->bit_idx;
+
+ div = &pll->div;
+ div->flags = 0;
+ div->mreg = base + RCC_PLLCKSELR;
+ div->mshift = cfg->divm;
+ div->mwidth = 6;
+ div->nreg = base + cfg->offset_divr;
+ div->nshift = 0;
+ div->nwidth = 9;
+
+ div->freg_status = base + RCC_PLLCFGR;
+ div->freg_bit = cfg->bit_frac_en;
+ div->freg_value = base + cfg->offset_frac;
+ div->fshift = 3;
+ div->fwidth = 13;
+
+ div->lock = lock;
+
+ ret = clk_hw_register(dev, hw);
+ if (ret) {
+ kfree(pll);
+ hw = ERR_PTR(ret);
+ }
+
+ return hw;
+}
+
+/* ODF CLOCKS */
+static unsigned long odf_divider_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ return clk_divider_ops.recalc_rate(hw, parent_rate);
+}
+
+static long odf_divider_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *prate)
+{
+ return clk_divider_ops.round_rate(hw, rate, prate);
+}
+
+static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct clk_hw *hwp;
+ int pll_status;
+ int ret;
+
+ hwp = clk_hw_get_parent(hw);
+
+ pll_status = pll_is_enabled(hwp);
+
+ if (pll_status)
+ pll_disable(hwp);
+
+ ret = clk_divider_ops.set_rate(hw, rate, parent_rate);
+
+ if (pll_status)
+ pll_enable(hwp);
+
+ return ret;
+}
+
+static const struct clk_ops odf_divider_ops = {
+ .recalc_rate = odf_divider_recalc_rate,
+ .round_rate = odf_divider_round_rate,
+ .set_rate = odf_divider_set_rate,
+};
+
+static int odf_gate_enable(struct clk_hw *hw)
+{
+ struct clk_hw *hwp;
+ int pll_status;
+ int ret;
+
+ if (clk_gate_ops.is_enabled(hw))
+ return 0;
+
+ hwp = clk_hw_get_parent(hw);
+
+ pll_status = pll_is_enabled(hwp);
+
+ if (pll_status)
+ pll_disable(hwp);
+
+ ret = clk_gate_ops.enable(hw);
+
+ if (pll_status)
+ pll_enable(hwp);
+
+ return ret;
+}
+
+static void odf_gate_disable(struct clk_hw *hw)
+{
+ struct clk_hw *hwp;
+ int pll_status;
+
+ if (!clk_gate_ops.is_enabled(hw))
+ return;
+
+ hwp = clk_hw_get_parent(hw);
+
+ pll_status = pll_is_enabled(hwp);
+
+ if (pll_status)
+ pll_disable(hwp);
+
+ clk_gate_ops.disable(hw);
+
+ if (pll_status)
+ pll_enable(hwp);
+}
+
+static const struct clk_ops odf_gate_ops = {
+ .enable = odf_gate_enable,
+ .disable = odf_gate_disable,
+ .is_enabled = clk_gate_is_enabled,
+};
+
+static struct composite_clk_gcfg odf_clk_gcfg = {
+ M_CFG_DIV(&odf_divider_ops, 0),
+ M_CFG_GATE(&odf_gate_ops, 0),
+};
+
+#define M_ODF_F(_name, _parent, _gate_offset, _bit_idx, _rate_offset,\
+ _rate_shift, _rate_width, _flags)\
+{\
+ .mux = NULL,\
+ .div = &(struct muxdiv_cfg) {_rate_offset, _rate_shift, _rate_width},\
+ .gate = &(struct gate_cfg) {_gate_offset, _bit_idx },\
+ .name = _name,\
+ .parent_name = &(const char *) {_parent},\
+ .num_parents = 1,\
+ .flags = _flags,\
+}
+
+#define M_ODF(_name, _parent, _gate_offset, _bit_idx, _rate_offset,\
+ _rate_shift, _rate_width)\
+M_ODF_F(_name, _parent, _gate_offset, _bit_idx, _rate_offset,\
+ _rate_shift, _rate_width, 0)\
+
+static const struct composite_clk_cfg stm32_odf[3][3] = {
+ {
+ M_ODF_F("pll1_p", "vco1", RCC_PLLCFGR, 16, RCC_PLL1DIVR, 9, 7,
+ CLK_IGNORE_UNUSED),
+ M_ODF_F("pll1_q", "vco1", RCC_PLLCFGR, 17, RCC_PLL1DIVR, 16, 7,
+ CLK_IGNORE_UNUSED),
+ M_ODF_F("pll1_r", "vco1", RCC_PLLCFGR, 18, RCC_PLL1DIVR, 24, 7,
+ CLK_IGNORE_UNUSED),
+ },
+
+ {
+ M_ODF("pll2_p", "vco2", RCC_PLLCFGR, 19, RCC_PLL2DIVR, 9, 7),
+ M_ODF("pll2_q", "vco2", RCC_PLLCFGR, 20, RCC_PLL2DIVR, 16, 7),
+ M_ODF("pll2_r", "vco2", RCC_PLLCFGR, 21, RCC_PLL2DIVR, 24, 7),
+ },
+ {
+ M_ODF("pll3_p", "vco3", RCC_PLLCFGR, 22, RCC_PLL3DIVR, 9, 7),
+ M_ODF("pll3_q", "vco3", RCC_PLLCFGR, 23, RCC_PLL3DIVR, 16, 7),
+ M_ODF("pll3_r", "vco3", RCC_PLLCFGR, 24, RCC_PLL3DIVR, 24, 7),
+ }
+};
+
+/* PERIF CLOCKS */
+struct pclk_t {
+ u32 gate_offset;
+ u8 bit_idx;
+ const char *name;
+ const char *parent;
+ u32 flags;
+};
+
+#define PER_CLKF(_gate_offset, _bit_idx, _name, _parent, _flags)\
+{\
+ .gate_offset = _gate_offset,\
+ .bit_idx = _bit_idx,\
+ .name = _name,\
+ .parent = _parent,\
+ .flags = _flags,\
+}
+
+#define PER_CLK(_gate_offset, _bit_idx, _name, _parent)\
+ PER_CLKF(_gate_offset, _bit_idx, _name, _parent, 0)
+
+static const struct pclk_t pclk[] = {
+ PER_CLK(RCC_AHB3ENR, 31, "d1sram1", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 30, "itcm", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 29, "dtcm2", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 28, "dtcm1", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 8, "flitf", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 5, "jpgdec", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 4, "dma2d", "hclk"),
+ PER_CLK(RCC_AHB3ENR, 0, "mdma", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 28, "usb2ulpi", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 26, "usb1ulpi", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 17, "eth1rx", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 16, "eth1tx", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 15, "eth1mac", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 14, "art", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 1, "dma2", "hclk"),
+ PER_CLK(RCC_AHB1ENR, 0, "dma1", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 31, "d2sram3", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 30, "d2sram2", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 29, "d2sram1", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 5, "hash", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 4, "crypt", "hclk"),
+ PER_CLK(RCC_AHB2ENR, 0, "camitf", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 28, "bkpram", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 25, "hsem", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 21, "bdma", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 19, "crc", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 10, "gpiok", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 9, "gpioj", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 8, "gpioi", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 7, "gpioh", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 6, "gpiog", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 5, "gpiof", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 4, "gpioe", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 3, "gpiod", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 2, "gpioc", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 1, "gpiob", "hclk"),
+ PER_CLK(RCC_AHB4ENR, 0, "gpioa", "hclk"),
+ PER_CLK(RCC_APB3ENR, 6, "wwdg1", "pclk3"),
+ PER_CLK(RCC_APB1LENR, 29, "dac12", "pclk1"),
+ PER_CLK(RCC_APB1LENR, 11, "wwdg2", "pclk1"),
+ PER_CLK(RCC_APB1LENR, 8, "tim14", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 7, "tim13", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 6, "tim12", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 5, "tim7", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 4, "tim6", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 3, "tim5", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 2, "tim4", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 1, "tim3", "tim1_ker"),
+ PER_CLK(RCC_APB1LENR, 0, "tim2", "tim1_ker"),
+ PER_CLK(RCC_APB1HENR, 5, "mdios", "pclk1"),
+ PER_CLK(RCC_APB1HENR, 4, "opamp", "pclk1"),
+ PER_CLK(RCC_APB1HENR, 1, "crs", "pclk1"),
+ PER_CLK(RCC_APB2ENR, 18, "tim17", "tim2_ker"),
+ PER_CLK(RCC_APB2ENR, 17, "tim16", "tim2_ker"),
+ PER_CLK(RCC_APB2ENR, 16, "tim15", "tim2_ker"),
+ PER_CLK(RCC_APB2ENR, 1, "tim8", "tim2_ker"),
+ PER_CLK(RCC_APB2ENR, 0, "tim1", "tim2_ker"),
+ PER_CLK(RCC_APB4ENR, 26, "tmpsens", "pclk4"),
+ PER_CLK(RCC_APB4ENR, 16, "rtcapb", "pclk4"),
+ PER_CLK(RCC_APB4ENR, 15, "vref", "pclk4"),
+ PER_CLK(RCC_APB4ENR, 14, "comp12", "pclk4"),
+ PER_CLK(RCC_APB4ENR, 1, "syscfg", "pclk4"),
+};
+
+/* KERNEL CLOCKS */
+#define KER_CLKF(_gate_offset, _bit_idx,\
+ _mux_offset, _mux_shift, _mux_width,\
+ _name, _parent_name,\
+ _flags) \
+{ \
+ .gate = &(struct gate_cfg) {_gate_offset, _bit_idx},\
+ .mux = &(struct muxdiv_cfg) {_mux_offset, _mux_shift, _mux_width },\
+ .name = _name, \
+ .parent_name = _parent_name, \
+ .num_parents = ARRAY_SIZE(_parent_name),\
+ .flags = _flags,\
+}
+
+#define KER_CLK(_gate_offset, _bit_idx, _mux_offset, _mux_shift, _mux_width,\
+ _name, _parent_name) \
+KER_CLKF(_gate_offset, _bit_idx, _mux_offset, _mux_shift, _mux_width,\
+ _name, _parent_name, 0)\
+
+#define KER_CLKF_NOMUX(_gate_offset, _bit_idx,\
+ _name, _parent_name,\
+ _flags) \
+{ \
+ .gate = &(struct gate_cfg) {_gate_offset, _bit_idx},\
+ .mux = NULL,\
+ .name = _name, \
+ .parent_name = _parent_name, \
+ .num_parents = 1,\
+ .flags = _flags,\
+}
+
+static const struct composite_clk_cfg kclk[] = {
+ KER_CLK(RCC_AHB3ENR, 16, RCC_D1CCIPR, 16, 1, "sdmmc1", sdmmc_src),
+ KER_CLKF(RCC_AHB3ENR, 14, RCC_D1CCIPR, 4, 2, "quadspi", qspi_src,
+ CLK_IGNORE_UNUSED),
+ KER_CLKF(RCC_AHB3ENR, 12, RCC_D1CCIPR, 0, 2, "fmc", fmc_src,
+ CLK_IGNORE_UNUSED),
+ KER_CLK(RCC_AHB1ENR, 27, RCC_D2CCIP2R, 20, 2, "usb2otg", usbotg_src),
+ KER_CLK(RCC_AHB1ENR, 25, RCC_D2CCIP2R, 20, 2, "usb1otg", usbotg_src),
+ KER_CLK(RCC_AHB1ENR, 5, RCC_D3CCIPR, 16, 2, "adc12", adc_src),
+ KER_CLK(RCC_AHB2ENR, 9, RCC_D1CCIPR, 16, 1, "sdmmc2", sdmmc_src),
+ KER_CLK(RCC_AHB2ENR, 6, RCC_D2CCIP2R, 8, 2, "rng", rng_src),
+ KER_CLK(RCC_AHB4ENR, 24, RCC_D3CCIPR, 16, 2, "adc3", adc_src),
+ KER_CLKF(RCC_APB3ENR, 4, RCC_D1CCIPR, 8, 1, "dsi", dsi_src,
+ CLK_SET_RATE_PARENT),
+ KER_CLKF_NOMUX(RCC_APB3ENR, 3, "ltdc", ltdc_src, CLK_SET_RATE_PARENT),
+ KER_CLK(RCC_APB1LENR, 31, RCC_D2CCIP2R, 0, 3, "usart8", usart_src2),
+ KER_CLK(RCC_APB1LENR, 30, RCC_D2CCIP2R, 0, 3, "usart7", usart_src2),
+ KER_CLK(RCC_APB1LENR, 27, RCC_D2CCIP2R, 22, 2, "hdmicec", cec_src),
+ KER_CLK(RCC_APB1LENR, 23, RCC_D2CCIP2R, 12, 2, "i2c3", i2c_src1),
+ KER_CLK(RCC_APB1LENR, 22, RCC_D2CCIP2R, 12, 2, "i2c2", i2c_src1),
+ KER_CLK(RCC_APB1LENR, 21, RCC_D2CCIP2R, 12, 2, "i2c1", i2c_src1),
+ KER_CLK(RCC_APB1LENR, 20, RCC_D2CCIP2R, 0, 3, "uart5", usart_src2),
+ KER_CLK(RCC_APB1LENR, 19, RCC_D2CCIP2R, 0, 3, "uart4", usart_src2),
+ KER_CLK(RCC_APB1LENR, 18, RCC_D2CCIP2R, 0, 3, "usart3", usart_src2),
+ KER_CLK(RCC_APB1LENR, 17, RCC_D2CCIP2R, 0, 3, "usart2", usart_src2),
+ KER_CLK(RCC_APB1LENR, 16, RCC_D2CCIP1R, 20, 2, "spdifrx", spdifrx_src),
+ KER_CLK(RCC_APB1LENR, 15, RCC_D2CCIP1R, 16, 3, "spi3", spi_src1),
+ KER_CLK(RCC_APB1LENR, 14, RCC_D2CCIP1R, 16, 3, "spi2", spi_src1),
+ KER_CLK(RCC_APB1LENR, 9, RCC_D2CCIP2R, 28, 3, "lptim1", lptim_src1),
+ KER_CLK(RCC_APB1HENR, 8, RCC_D2CCIP1R, 28, 2, "fdcan", fdcan_src),
+ KER_CLK(RCC_APB1HENR, 2, RCC_D2CCIP1R, 31, 1, "swp", swp_src),
+ KER_CLK(RCC_APB2ENR, 29, RCC_CFGR, 14, 1, "hrtim", hrtim_src),
+ KER_CLK(RCC_APB2ENR, 28, RCC_D2CCIP1R, 24, 1, "dfsdm1", dfsdm1_src),
+ KER_CLKF(RCC_APB2ENR, 24, RCC_D2CCIP1R, 6, 3, "sai3", sai_src,
+ CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
+ KER_CLKF(RCC_APB2ENR, 23, RCC_D2CCIP1R, 6, 3, "sai2", sai_src,
+ CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
+ KER_CLKF(RCC_APB2ENR, 22, RCC_D2CCIP1R, 0, 3, "sai1", sai_src,
+ CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT),
+ KER_CLK(RCC_APB2ENR, 20, RCC_D2CCIP1R, 16, 3, "spi5", spi_src2),
+ KER_CLK(RCC_APB2ENR, 13, RCC_D2CCIP1R, 16, 3, "spi4", spi_src2),
+ KER_CLK(RCC_APB2ENR, 12, RCC_D2CCIP1R, 16, 3, "spi1", spi_src1),
+ KER_CLK(RCC_APB2ENR, 5, RCC_D2CCIP2R, 3, 3, "usart6", usart_src1),
+ KER_CLK(RCC_APB2ENR, 4, RCC_D2CCIP2R, 3, 3, "usart1", usart_src1),
+ KER_CLK(RCC_APB4ENR, 21, RCC_D3CCIPR, 24, 3, "sai4b", sai_src),
+ KER_CLK(RCC_APB4ENR, 21, RCC_D3CCIPR, 21, 3, "sai4a", sai_src),
+ KER_CLK(RCC_APB4ENR, 12, RCC_D3CCIPR, 13, 3, "lptim5", lptim_src2),
+ KER_CLK(RCC_APB4ENR, 11, RCC_D3CCIPR, 13, 3, "lptim4", lptim_src2),
+ KER_CLK(RCC_APB4ENR, 10, RCC_D3CCIPR, 13, 3, "lptim3", lptim_src2),
+ KER_CLK(RCC_APB4ENR, 9, RCC_D3CCIPR, 10, 3, "lptim2", lptim_src2),
+ KER_CLK(RCC_APB4ENR, 7, RCC_D3CCIPR, 8, 2, "i2c4", i2c_src2),
+ KER_CLK(RCC_APB4ENR, 5, RCC_D3CCIPR, 28, 3, "spi6", spi_src3),
+ KER_CLK(RCC_APB4ENR, 3, RCC_D3CCIPR, 0, 3, "lpuart1", lpuart1_src),
+};
+
+static struct composite_clk_gcfg kernel_clk_cfg = {
+ M_CFG_MUX(NULL, 0),
+ M_CFG_GATE(NULL, 0),
+};
+
+/* RTC clock */
+/*
+ * RTC & LSE registers are protected against parasitic write access.
+ * PWR_CR_DBP bit must be set to enable write access to RTC registers.
+ */
+/* STM32_PWR_CR */
+#define PWR_CR 0x00
+/* STM32_PWR_CR bit field */
+#define PWR_CR_DBP BIT(8)
+
+static struct composite_clk_gcfg rtc_clk_cfg = {
+ M_CFG_MUX(NULL, 0),
+ M_CFG_GATE(NULL, 0),
+};
+
+static const struct composite_clk_cfg rtc_clk =
+ KER_CLK(RCC_BDCR, 15, RCC_BDCR, 8, 2, "rtc_ck", rtc_src);
+
+/* Micro-controller output clock */
+static struct composite_clk_gcfg mco_clk_cfg = {
+ M_CFG_MUX(NULL, 0),
+ M_CFG_DIV(NULL, CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO),
+};
+
+#define M_MCO_F(_name, _parents, _mux_offset, _mux_shift, _mux_width,\
+ _rate_offset, _rate_shift, _rate_width,\
+ _flags)\
+{\
+ .mux = &(struct muxdiv_cfg) {_mux_offset, _mux_shift, _mux_width },\
+ .div = &(struct muxdiv_cfg) {_rate_offset, _rate_shift, _rate_width},\
+ .gate = NULL,\
+ .name = _name,\
+ .parent_name = _parents,\
+ .num_parents = ARRAY_SIZE(_parents),\
+ .flags = _flags,\
+}
+
+static const struct composite_clk_cfg mco_clk[] = {
+ M_MCO_F("mco1", mco_src1, RCC_CFGR, 22, 4, RCC_CFGR, 18, 4, 0),
+ M_MCO_F("mco2", mco_src2, RCC_CFGR, 29, 3, RCC_CFGR, 25, 4, 0),
+};
+
+static void __init stm32h7_rcc_init(struct device_node *np)
+{
+ struct clk_hw_onecell_data *clk_data;
+ struct composite_cfg c_cfg;
+ int n;
+ const char *hse_clk, *lse_clk, *i2s_clk;
+ struct regmap *pdrm;
+
+ clk_data = kzalloc(sizeof(*clk_data) +
+ sizeof(*clk_data->hws) * STM32H7_MAX_CLKS,
+ GFP_KERNEL);
+ if (!clk_data)
+ return;
+
+ clk_data->num = STM32H7_MAX_CLKS;
+
+ hws = clk_data->hws;
+
+ for (n = 0; n < STM32H7_MAX_CLKS; n++)
+ hws[n] = ERR_PTR(-ENOENT);
+
+ /* get RCC base @ from DT */
+ base = of_iomap(np, 0);
+ if (!base) {
+ pr_err("%s: unable to map resource", np->name);
+ goto err_free_clks;
+ }
+
+ pdrm = syscon_regmap_lookup_by_phandle(np, "st,syscfg");
+ if (IS_ERR(pdrm))
+ pr_warn("%s: Unable to get syscfg\n", __func__);
+ else
+ /* In any case disable backup domain write protection
+ * and will never be enabled.
+ * Needed by LSE & RTC clocks.
+ */
+ regmap_update_bits(pdrm, PWR_CR, PWR_CR_DBP, PWR_CR_DBP);
+
+ /* Put parent names from DT */
+ hse_clk = of_clk_get_parent_name(np, 0);
+ lse_clk = of_clk_get_parent_name(np, 1);
+ i2s_clk = of_clk_get_parent_name(np, 2);
+
+ sai_src[3] = i2s_clk;
+ spi_src1[3] = i2s_clk;
+
+ /* Register Internal oscillators */
+ clk_hw_register_fixed_rate(NULL, "clk-hsi", NULL, 0, 64000000);
+ clk_hw_register_fixed_rate(NULL, "clk-csi", NULL, 0, 4000000);
+ clk_hw_register_fixed_rate(NULL, "clk-lsi", NULL, 0, 32000);
+ clk_hw_register_fixed_rate(NULL, "clk-rc48", NULL, 0, 48000);
+
+ /* This clock is coming from outside. Frequencies unknown */
+ hws[CK_DSI_PHY] = clk_hw_register_fixed_rate(NULL, "ck_dsi_phy", NULL,
+ 0, 0);
+
+ hws[HSI_DIV] = clk_hw_register_divider(NULL, "hsidiv", "clk-hsi", 0,
+ base + RCC_CR, 3, 2, CLK_DIVIDER_POWER_OF_TWO,
+ &stm32rcc_lock);
+
+ hws[HSE_1M] = clk_hw_register_divider(NULL, "hse_1M", "hse_ck", 0,
+ base + RCC_CFGR, 8, 6, CLK_DIVIDER_ONE_BASED |
+ CLK_DIVIDER_ALLOW_ZERO,
+ &stm32rcc_lock);
+
+ /* Mux system clocks */
+ for (n = 0; n < ARRAY_SIZE(stm32_mclk); n++)
+ hws[MCLK_BANK + n] = clk_hw_register_mux(NULL,
+ stm32_mclk[n].name,
+ stm32_mclk[n].parents,
+ stm32_mclk[n].num_parents,
+ stm32_mclk[n].flags,
+ stm32_mclk[n].offset + base,
+ stm32_mclk[n].shift,
+ stm32_mclk[n].width,
+ 0,
+ &stm32rcc_lock);
+
+ register_core_and_bus_clocks();
+
+ /* Oscillary clocks */
+ for (n = 0; n < ARRAY_SIZE(stm32_oclk); n++)
+ hws[OSC_BANK + n] = clk_register_ready_gate(NULL,
+ stm32_oclk[n].name,
+ stm32_oclk[n].parent,
+ stm32_oclk[n].gate_offset + base,
+ stm32_oclk[n].bit_idx,
+ stm32_oclk[n].bit_rdy,
+ stm32_oclk[n].flags,
+ &stm32rcc_lock);
+
+ hws[HSE_CK] = clk_register_ready_gate(NULL,
+ "hse_ck",
+ hse_clk,
+ RCC_CR + base,
+ 16, 17,
+ 0,
+ &stm32rcc_lock);
+
+ hws[LSE_CK] = clk_register_ready_gate(NULL,
+ "lse_ck",
+ lse_clk,
+ RCC_BDCR + base,
+ 0, 1,
+ 0,
+ &stm32rcc_lock);
+
+ hws[CSI_KER_DIV122 + n] = clk_hw_register_fixed_factor(NULL,
+ "csi_ker_div122", "csi_ker", 0, 1, 122);
+
+ /* PLLs */
+ for (n = 0; n < ARRAY_SIZE(stm32_pll); n++) {
+ int odf;
+
+ /* Register the VCO */
+ clk_register_stm32_pll(NULL, stm32_pll[n].name,
+ stm32_pll[n].parent_name, stm32_pll[n].flags,
+ stm32_pll[n].cfg,
+ &stm32rcc_lock);
+
+ /* Register the 3 output dividers */
+ for (odf = 0; odf < 3; odf++) {
+ int idx = n * 3 + odf;
+
+ get_cfg_composite_div(&odf_clk_gcfg, &stm32_odf[n][odf],
+ &c_cfg, &stm32rcc_lock);
+
+ hws[ODF_BANK + idx] = clk_hw_register_composite(NULL,
+ stm32_odf[n][odf].name,
+ stm32_odf[n][odf].parent_name,
+ stm32_odf[n][odf].num_parents,
+ c_cfg.mux_hw, c_cfg.mux_ops,
+ c_cfg.div_hw, c_cfg.div_ops,
+ c_cfg.gate_hw, c_cfg.gate_ops,
+ stm32_odf[n][odf].flags);
+ }
+ }
+
+ /* Peripheral clocks */
+ for (n = 0; n < ARRAY_SIZE(pclk); n++)
+ hws[PERIF_BANK + n] = clk_hw_register_gate(NULL, pclk[n].name,
+ pclk[n].parent,
+ pclk[n].flags, base + pclk[n].gate_offset,
+ pclk[n].bit_idx, pclk[n].flags, &stm32rcc_lock);
+
+ /* Kernel clocks */
+ for (n = 0; n < ARRAY_SIZE(kclk); n++) {
+ get_cfg_composite_div(&kernel_clk_cfg, &kclk[n], &c_cfg,
+ &stm32rcc_lock);
+
+ hws[KERN_BANK + n] = clk_hw_register_composite(NULL,
+ kclk[n].name,
+ kclk[n].parent_name,
+ kclk[n].num_parents,
+ c_cfg.mux_hw, c_cfg.mux_ops,
+ c_cfg.div_hw, c_cfg.div_ops,
+ c_cfg.gate_hw, c_cfg.gate_ops,
+ kclk[n].flags);
+ }
+
+ /* RTC clock (default state is off) */
+ clk_hw_register_fixed_rate(NULL, "off", NULL, 0, 0);
+
+ get_cfg_composite_div(&rtc_clk_cfg, &rtc_clk, &c_cfg, &stm32rcc_lock);
+
+ hws[RTC_CK] = clk_hw_register_composite(NULL,
+ rtc_clk.name,
+ rtc_clk.parent_name,
+ rtc_clk.num_parents,
+ c_cfg.mux_hw, c_cfg.mux_ops,
+ c_cfg.div_hw, c_cfg.div_ops,
+ c_cfg.gate_hw, c_cfg.gate_ops,
+ rtc_clk.flags);
+
+ /* Micro-controller clocks */
+ for (n = 0; n < ARRAY_SIZE(mco_clk); n++) {
+ get_cfg_composite_div(&mco_clk_cfg, &mco_clk[n], &c_cfg,
+ &stm32rcc_lock);
+
+ hws[MCO_BANK + n] = clk_hw_register_composite(NULL,
+ mco_clk[n].name,
+ mco_clk[n].parent_name,
+ mco_clk[n].num_parents,
+ c_cfg.mux_hw, c_cfg.mux_ops,
+ c_cfg.div_hw, c_cfg.div_ops,
+ c_cfg.gate_hw, c_cfg.gate_ops,
+ mco_clk[n].flags);
+ }
+
+ of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
+
+ return;
+
+err_free_clks:
+ kfree(clk_data);
+}
+
+/* The RCC node is a clock and reset controller, and these
+ * functionalities are supported by different drivers that
+ * matches the same compatible strings.
+ */
+CLK_OF_DECLARE_DRIVER(stm32h7_rcc, "st,stm32h743-rcc", stm32h7_rcc_init);
diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c
index ea7d552a2f2b..decffb3826ec 100644
--- a/drivers/clk/clk-versaclock5.c
+++ b/drivers/clk/clk-versaclock5.c
@@ -57,6 +57,7 @@
#define VC5_PRIM_SRC_SHDN 0x10
#define VC5_PRIM_SRC_SHDN_EN_XTAL BIT(7)
#define VC5_PRIM_SRC_SHDN_EN_CLKIN BIT(6)
+#define VC5_PRIM_SRC_SHDN_EN_DOUBLE_XTAL_FREQ BIT(3)
#define VC5_PRIM_SRC_SHDN_SP BIT(1)
#define VC5_PRIM_SRC_SHDN_EN_GBL_SHDN BIT(0)
@@ -122,12 +123,16 @@
/* flags to describe chip features */
/* chip has built-in oscilator */
#define VC5_HAS_INTERNAL_XTAL BIT(0)
+/* chip has PFD requency doubler */
+#define VC5_HAS_PFD_FREQ_DBL BIT(1)
/* Supported IDT VC5 models. */
enum vc5_model {
IDT_VC5_5P49V5923,
+ IDT_VC5_5P49V5925,
IDT_VC5_5P49V5933,
IDT_VC5_5P49V5935,
+ IDT_VC6_5P49V6901,
};
/* Structure to describe features of a particular VC5 model */
@@ -157,6 +162,8 @@ struct vc5_driver_data {
struct clk *pin_clkin;
unsigned char clk_mux_ins;
struct clk_hw clk_mux;
+ struct clk_hw clk_mul;
+ struct clk_hw clk_pfd;
struct vc5_hw_data clk_pll;
struct vc5_hw_data clk_fod[VC5_MAX_FOD_NUM];
struct vc5_hw_data clk_out[VC5_MAX_CLK_OUT_NUM];
@@ -166,6 +173,14 @@ static const char * const vc5_mux_names[] = {
"mux"
};
+static const char * const vc5_dbl_names[] = {
+ "dbl"
+};
+
+static const char * const vc5_pfd_names[] = {
+ "pfd"
+};
+
static const char * const vc5_pll_names[] = {
"pll"
};
@@ -254,11 +269,64 @@ static int vc5_mux_set_parent(struct clk_hw *hw, u8 index)
return regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, mask, src);
}
-static unsigned long vc5_mux_recalc_rate(struct clk_hw *hw,
+static const struct clk_ops vc5_mux_ops = {
+ .set_parent = vc5_mux_set_parent,
+ .get_parent = vc5_mux_get_parent,
+};
+
+static unsigned long vc5_dbl_recalc_rate(struct clk_hw *hw,
unsigned long parent_rate)
{
struct vc5_driver_data *vc5 =
- container_of(hw, struct vc5_driver_data, clk_mux);
+ container_of(hw, struct vc5_driver_data, clk_mul);
+ unsigned int premul;
+
+ regmap_read(vc5->regmap, VC5_PRIM_SRC_SHDN, &premul);
+ if (premul & VC5_PRIM_SRC_SHDN_EN_DOUBLE_XTAL_FREQ)
+ parent_rate *= 2;
+
+ return parent_rate;
+}
+
+static long vc5_dbl_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_rate)
+{
+ if ((*parent_rate == rate) || ((*parent_rate * 2) == rate))
+ return rate;
+ else
+ return -EINVAL;
+}
+
+static int vc5_dbl_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct vc5_driver_data *vc5 =
+ container_of(hw, struct vc5_driver_data, clk_mul);
+ u32 mask;
+
+ if ((parent_rate * 2) == rate)
+ mask = VC5_PRIM_SRC_SHDN_EN_DOUBLE_XTAL_FREQ;
+ else
+ mask = 0;
+
+ regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN,
+ VC5_PRIM_SRC_SHDN_EN_DOUBLE_XTAL_FREQ,
+ mask);
+
+ return 0;
+}
+
+static const struct clk_ops vc5_dbl_ops = {
+ .recalc_rate = vc5_dbl_recalc_rate,
+ .round_rate = vc5_dbl_round_rate,
+ .set_rate = vc5_dbl_set_rate,
+};
+
+static unsigned long vc5_pfd_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct vc5_driver_data *vc5 =
+ container_of(hw, struct vc5_driver_data, clk_pfd);
unsigned int prediv, div;
regmap_read(vc5->regmap, VC5_VCO_CTRL_AND_PREDIV, &prediv);
@@ -276,7 +344,7 @@ static unsigned long vc5_mux_recalc_rate(struct clk_hw *hw,
return parent_rate / VC5_REF_DIVIDER_REF_DIV(div);
}
-static long vc5_mux_round_rate(struct clk_hw *hw, unsigned long rate,
+static long vc5_pfd_round_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *parent_rate)
{
unsigned long idiv;
@@ -296,11 +364,11 @@ static long vc5_mux_round_rate(struct clk_hw *hw, unsigned long rate,
return *parent_rate / idiv;
}
-static int vc5_mux_set_rate(struct clk_hw *hw, unsigned long rate,
+static int vc5_pfd_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
struct vc5_driver_data *vc5 =
- container_of(hw, struct vc5_driver_data, clk_mux);
+ container_of(hw, struct vc5_driver_data, clk_pfd);
unsigned long idiv;
u8 div;
@@ -328,12 +396,10 @@ static int vc5_mux_set_rate(struct clk_hw *hw, unsigned long rate,
return 0;
}
-static const struct clk_ops vc5_mux_ops = {
- .set_parent = vc5_mux_set_parent,
- .get_parent = vc5_mux_get_parent,
- .recalc_rate = vc5_mux_recalc_rate,
- .round_rate = vc5_mux_round_rate,
- .set_rate = vc5_mux_set_rate,
+static const struct clk_ops vc5_pfd_ops = {
+ .recalc_rate = vc5_pfd_recalc_rate,
+ .round_rate = vc5_pfd_round_rate,
+ .set_rate = vc5_pfd_set_rate,
};
/*
@@ -426,6 +492,10 @@ static unsigned long vc5_fod_recalc_rate(struct clk_hw *hw,
div_frc = (od_frc[0] << 22) | (od_frc[1] << 14) |
(od_frc[2] << 6) | (od_frc[3] >> 2);
+ /* Avoid division by zero if the output is not configured. */
+ if (div_int == 0 && div_frc == 0)
+ return 0;
+
/* The PLL divider has 12 integer bits and 30 fractional bits */
return div64_u64((u64)f_in << 24ULL, ((u64)div_int << 24ULL) + div_frc);
}
@@ -503,6 +573,25 @@ static int vc5_clk_out_prepare(struct clk_hw *hw)
{
struct vc5_hw_data *hwdata = container_of(hw, struct vc5_hw_data, hw);
struct vc5_driver_data *vc5 = hwdata->vc5;
+ const u8 mask = VC5_OUT_DIV_CONTROL_SELB_NORM |
+ VC5_OUT_DIV_CONTROL_SEL_EXT |
+ VC5_OUT_DIV_CONTROL_EN_FOD;
+ unsigned int src;
+ int ret;
+
+ /*
+ * If the input mux is disabled, enable it first and
+ * select source from matching FOD.
+ */
+ regmap_read(vc5->regmap, VC5_OUT_DIV_CONTROL(hwdata->num), &src);
+ if ((src & mask) == 0) {
+ src = VC5_OUT_DIV_CONTROL_RESET | VC5_OUT_DIV_CONTROL_EN_FOD;
+ ret = regmap_update_bits(vc5->regmap,
+ VC5_OUT_DIV_CONTROL(hwdata->num),
+ mask | VC5_OUT_DIV_CONTROL_RESET, src);
+ if (ret)
+ return ret;
+ }
/* Enable the clock buffer */
regmap_update_bits(vc5->regmap, VC5_CLK_OUTPUT_CFG(hwdata->num, 1),
@@ -516,7 +605,7 @@ static void vc5_clk_out_unprepare(struct clk_hw *hw)
struct vc5_hw_data *hwdata = container_of(hw, struct vc5_hw_data, hw);
struct vc5_driver_data *vc5 = hwdata->vc5;
- /* Enable the clock buffer */
+ /* Disable the clock buffer */
regmap_update_bits(vc5->regmap, VC5_CLK_OUTPUT_CFG(hwdata->num, 1),
VC5_CLK_OUTPUT_CFG1_EN_CLKBUF, 0);
}
@@ -537,6 +626,9 @@ static unsigned char vc5_clk_out_get_parent(struct clk_hw *hw)
regmap_read(vc5->regmap, VC5_OUT_DIV_CONTROL(hwdata->num), &src);
src &= mask;
+ if (src == 0) /* Input mux set to DISABLED */
+ return 0;
+
if ((src & fodclkmask) == VC5_OUT_DIV_CONTROL_EN_FOD)
return 0;
@@ -595,7 +687,9 @@ static int vc5_map_index_to_output(const enum vc5_model model,
case IDT_VC5_5P49V5933:
return (n == 0) ? 0 : 3;
case IDT_VC5_5P49V5923:
+ case IDT_VC5_5P49V5925:
case IDT_VC5_5P49V5935:
+ case IDT_VC6_5P49V6901:
default:
return n;
}
@@ -672,12 +766,46 @@ static int vc5_probe(struct i2c_client *client,
goto err_clk;
}
+ if (vc5->chip_info->flags & VC5_HAS_PFD_FREQ_DBL) {
+ /* Register frequency doubler */
+ memset(&init, 0, sizeof(init));
+ init.name = vc5_dbl_names[0];
+ init.ops = &vc5_dbl_ops;
+ init.flags = CLK_SET_RATE_PARENT;
+ init.parent_names = vc5_mux_names;
+ init.num_parents = 1;
+ vc5->clk_mul.init = &init;
+ ret = devm_clk_hw_register(&client->dev, &vc5->clk_mul);
+ if (ret) {
+ dev_err(&client->dev, "unable to register %s\n",
+ init.name);
+ goto err_clk;
+ }
+ }
+
+ /* Register PFD */
+ memset(&init, 0, sizeof(init));
+ init.name = vc5_pfd_names[0];
+ init.ops = &vc5_pfd_ops;
+ init.flags = CLK_SET_RATE_PARENT;
+ if (vc5->chip_info->flags & VC5_HAS_PFD_FREQ_DBL)
+ init.parent_names = vc5_dbl_names;
+ else
+ init.parent_names = vc5_mux_names;
+ init.num_parents = 1;
+ vc5->clk_pfd.init = &init;
+ ret = devm_clk_hw_register(&client->dev, &vc5->clk_pfd);
+ if (ret) {
+ dev_err(&client->dev, "unable to register %s\n", init.name);
+ goto err_clk;
+ }
+
/* Register PLL */
memset(&init, 0, sizeof(init));
init.name = vc5_pll_names[0];
init.ops = &vc5_pll_ops;
init.flags = CLK_SET_RATE_PARENT;
- init.parent_names = vc5_mux_names;
+ init.parent_names = vc5_pfd_names;
init.num_parents = 1;
vc5->clk_pll.num = 0;
vc5->clk_pll.vc5 = vc5;
@@ -785,6 +913,13 @@ static const struct vc5_chip_info idt_5p49v5923_info = {
.flags = 0,
};
+static const struct vc5_chip_info idt_5p49v5925_info = {
+ .model = IDT_VC5_5P49V5925,
+ .clk_fod_cnt = 4,
+ .clk_out_cnt = 5,
+ .flags = 0,
+};
+
static const struct vc5_chip_info idt_5p49v5933_info = {
.model = IDT_VC5_5P49V5933,
.clk_fod_cnt = 2,
@@ -799,18 +934,29 @@ static const struct vc5_chip_info idt_5p49v5935_info = {
.flags = VC5_HAS_INTERNAL_XTAL,
};
+static const struct vc5_chip_info idt_5p49v6901_info = {
+ .model = IDT_VC6_5P49V6901,
+ .clk_fod_cnt = 4,
+ .clk_out_cnt = 5,
+ .flags = VC5_HAS_PFD_FREQ_DBL,
+};
+
static const struct i2c_device_id vc5_id[] = {
{ "5p49v5923", .driver_data = IDT_VC5_5P49V5923 },
+ { "5p49v5925", .driver_data = IDT_VC5_5P49V5925 },
{ "5p49v5933", .driver_data = IDT_VC5_5P49V5933 },
{ "5p49v5935", .driver_data = IDT_VC5_5P49V5935 },
+ { "5p49v6901", .driver_data = IDT_VC6_5P49V6901 },
{ }
};
MODULE_DEVICE_TABLE(i2c, vc5_id);
static const struct of_device_id clk_vc5_of_match[] = {
{ .compatible = "idt,5p49v5923", .data = &idt_5p49v5923_info },
+ { .compatible = "idt,5p49v5925", .data = &idt_5p49v5925_info },
{ .compatible = "idt,5p49v5933", .data = &idt_5p49v5933_info },
{ .compatible = "idt,5p49v5935", .data = &idt_5p49v5935_info },
+ { .compatible = "idt,5p49v6901", .data = &idt_5p49v6901_info },
{ },
};
MODULE_DEVICE_TABLE(of, clk_vc5_of_match);
diff --git a/drivers/clk/clk-xgene.c b/drivers/clk/clk-xgene.c
index bc37030e38ba..4c75821a3933 100644
--- a/drivers/clk/clk-xgene.c
+++ b/drivers/clk/clk-xgene.c
@@ -192,7 +192,7 @@ static void xgene_pllclk_init(struct device_node *np, enum xgene_pll_type pll_ty
reg = of_iomap(np, 0);
if (reg == NULL) {
- pr_err("Unable to map CSR register for %s\n", np->full_name);
+ pr_err("Unable to map CSR register for %pOF\n", np);
return;
}
of_property_read_string(np, "clock-output-names", &clk_name);
@@ -409,12 +409,12 @@ static void xgene_pmdclk_init(struct device_node *np)
/* Parse the DTS register for resource */
rc = of_address_to_resource(np, 0, &res);
if (rc != 0) {
- pr_err("no DTS register for %s\n", np->full_name);
+ pr_err("no DTS register for %pOF\n", np);
return;
}
csr_reg = of_iomap(np, 0);
if (!csr_reg) {
- pr_err("Unable to map resource for %s\n", np->full_name);
+ pr_err("Unable to map resource for %pOF\n", np);
return;
}
of_property_read_string(np, "clock-output-names", &clk_name);
@@ -703,16 +703,14 @@ static void __init xgene_devclk_init(struct device_node *np)
rc = of_address_to_resource(np, i, &res);
if (rc != 0) {
if (i == 0) {
- pr_err("no DTS register for %s\n",
- np->full_name);
+ pr_err("no DTS register for %pOF\n", np);
return;
}
break;
}
map_res = of_iomap(np, i);
if (map_res == NULL) {
- pr_err("Unable to map resource %d for %s\n",
- i, np->full_name);
+ pr_err("Unable to map resource %d for %pOF\n", i, np);
goto err;
}
if (strcmp(res.name, "div-reg") == 0)
@@ -747,8 +745,7 @@ static void __init xgene_devclk_init(struct device_node *np)
pr_debug("Add %s clock\n", clk_name);
rc = of_clk_add_provider(np, of_clk_src_simple_get, clk);
if (rc != 0)
- pr_err("%s: could register provider clk %s\n", __func__,
- np->full_name);
+ pr_err("%s: could register provider clk %pOF\n", __func__, np);
return;
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index fc58c52a26b4..c8d83acda006 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3132,7 +3132,7 @@ int of_clk_add_provider(struct device_node *np,
mutex_lock(&of_clk_mutex);
list_add(&cp->link, &of_clk_providers);
mutex_unlock(&of_clk_mutex);
- pr_debug("Added clock from %s\n", np->full_name);
+ pr_debug("Added clock from %pOF\n", np);
ret = of_clk_set_defaults(np, true);
if (ret < 0)
@@ -3167,7 +3167,7 @@ int of_clk_add_hw_provider(struct device_node *np,
mutex_lock(&of_clk_mutex);
list_add(&cp->link, &of_clk_providers);
mutex_unlock(&of_clk_mutex);
- pr_debug("Added clk_hw provider from %s\n", np->full_name);
+ pr_debug("Added clk_hw provider from %pOF\n", np);
ret = of_clk_set_defaults(np, true);
if (ret < 0)
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index bb8a77a5985f..6b2f29df3f70 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c
@@ -77,8 +77,8 @@ static struct clk *__of_clk_get_by_name(struct device_node *np,
break;
} else if (name && index >= 0) {
if (PTR_ERR(clk) != -EPROBE_DEFER)
- pr_err("ERROR: could not get clock %s:%s(%i)\n",
- np->full_name, name ? name : "", index);
+ pr_err("ERROR: could not get clock %pOF:%s(%i)\n",
+ np, name ? name : "", index);
return clk;
}
diff --git a/drivers/clk/hisilicon/clk-hi6220.c b/drivers/clk/hisilicon/clk-hi6220.c
index 4181b6808545..e786d717f75d 100644
--- a/drivers/clk/hisilicon/clk-hi6220.c
+++ b/drivers/clk/hisilicon/clk-hi6220.c
@@ -55,9 +55,9 @@ static struct hisi_fixed_factor_clock hi6220_fixed_factor_clks[] __initdata = {
};
static struct hisi_gate_clock hi6220_separated_gate_clks_ao[] __initdata = {
- { HI6220_WDT0_PCLK, "wdt0_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 12, 0, },
- { HI6220_WDT1_PCLK, "wdt1_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 13, 0, },
- { HI6220_WDT2_PCLK, "wdt2_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 14, 0, },
+ { HI6220_WDT0_PCLK, "wdt0_pclk", "ref32k", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 12, 0, },
+ { HI6220_WDT1_PCLK, "wdt1_pclk", "ref32k", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 13, 0, },
+ { HI6220_WDT2_PCLK, "wdt2_pclk", "ref32k", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 14, 0, },
{ HI6220_TIMER0_PCLK, "timer0_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 15, 0, },
{ HI6220_TIMER1_PCLK, "timer1_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 16, 0, },
{ HI6220_TIMER2_PCLK, "timer2_pclk", "clk_tcxo", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x630, 17, 0, },
diff --git a/drivers/clk/imx/clk-imx51-imx53.c b/drivers/clk/imx/clk-imx51-imx53.c
index 1e3c9ea5f9dc..7bcaf270db11 100644
--- a/drivers/clk/imx/clk-imx51-imx53.c
+++ b/drivers/clk/imx/clk-imx51-imx53.c
@@ -416,10 +416,10 @@ static void __init mx51_clocks_init(struct device_node *np)
clk[IMX5_CLK_LP_APM] = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 9, 1,
lp_apm_sel, ARRAY_SIZE(lp_apm_sel));
- clk[IMX5_CLK_IPU_DI0_SEL] = imx_clk_mux("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3,
- mx51_ipu_di0_sel, ARRAY_SIZE(mx51_ipu_di0_sel));
- clk[IMX5_CLK_IPU_DI1_SEL] = imx_clk_mux("ipu_di1_sel", MXC_CCM_CSCMR2, 29, 3,
- mx51_ipu_di1_sel, ARRAY_SIZE(mx51_ipu_di1_sel));
+ clk[IMX5_CLK_IPU_DI0_SEL] = imx_clk_mux_flags("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3,
+ mx51_ipu_di0_sel, ARRAY_SIZE(mx51_ipu_di0_sel), CLK_SET_RATE_PARENT);
+ clk[IMX5_CLK_IPU_DI1_SEL] = imx_clk_mux_flags("ipu_di1_sel", MXC_CCM_CSCMR2, 29, 3,
+ mx51_ipu_di1_sel, ARRAY_SIZE(mx51_ipu_di1_sel), CLK_SET_RATE_PARENT);
clk[IMX5_CLK_TVE_EXT_SEL] = imx_clk_mux_flags("tve_ext_sel", MXC_CCM_CSCMR1, 6, 1,
mx51_tve_ext_sel, ARRAY_SIZE(mx51_tve_ext_sel), CLK_SET_RATE_PARENT);
clk[IMX5_CLK_TVE_SEL] = imx_clk_mux("tve_sel", MXC_CCM_CSCMR1, 7, 1,
diff --git a/drivers/clk/imx/clk-imx6sl.c b/drivers/clk/imx/clk-imx6sl.c
index 5fd4ddac1bf1..9642cdf0fb88 100644
--- a/drivers/clk/imx/clk-imx6sl.c
+++ b/drivers/clk/imx/clk-imx6sl.c
@@ -71,7 +71,7 @@ static const char *pll5_bypass_sels[] = { "pll5", "pll5_bypass_src", };
static const char *pll6_bypass_sels[] = { "pll6", "pll6_bypass_src", };
static const char *pll7_bypass_sels[] = { "pll7", "pll7_bypass_src", };
-static struct clk_div_table clk_enet_ref_table[] = {
+static const struct clk_div_table clk_enet_ref_table[] = {
{ .val = 0, .div = 20, },
{ .val = 1, .div = 10, },
{ .val = 2, .div = 5, },
@@ -79,14 +79,14 @@ static struct clk_div_table clk_enet_ref_table[] = {
{ }
};
-static struct clk_div_table post_div_table[] = {
+static const struct clk_div_table post_div_table[] = {
{ .val = 2, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 0, .div = 4, },
{ }
};
-static struct clk_div_table video_div_table[] = {
+static const struct clk_div_table video_div_table[] = {
{ .val = 0, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 2, .div = 1, },
diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c
index b5c96de41ccf..e6d389e333d7 100644
--- a/drivers/clk/imx/clk-imx6sx.c
+++ b/drivers/clk/imx/clk-imx6sx.c
@@ -105,7 +105,7 @@ static int const clks_init_on[] __initconst = {
IMX6SX_CLK_EPIT2,
};
-static struct clk_div_table clk_enet_ref_table[] = {
+static const struct clk_div_table clk_enet_ref_table[] = {
{ .val = 0, .div = 20, },
{ .val = 1, .div = 10, },
{ .val = 2, .div = 5, },
@@ -113,14 +113,14 @@ static struct clk_div_table clk_enet_ref_table[] = {
{ }
};
-static struct clk_div_table post_div_table[] = {
+static const struct clk_div_table post_div_table[] = {
{ .val = 2, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 0, .div = 4, },
{ }
};
-static struct clk_div_table video_div_table[] = {
+static const struct clk_div_table video_div_table[] = {
{ .val = 0, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 2, .div = 1, },
diff --git a/drivers/clk/imx/clk-imx6ul.c b/drivers/clk/imx/clk-imx6ul.c
index b4e0dff3c8c2..5e8c18afce9a 100644
--- a/drivers/clk/imx/clk-imx6ul.c
+++ b/drivers/clk/imx/clk-imx6ul.c
@@ -78,7 +78,7 @@ static int const clks_init_on[] __initconst = {
IMX6UL_CLK_MMDC_P0_FAST, IMX6UL_CLK_MMDC_P0_IPG,
};
-static struct clk_div_table clk_enet_ref_table[] = {
+static const struct clk_div_table clk_enet_ref_table[] = {
{ .val = 0, .div = 20, },
{ .val = 1, .div = 10, },
{ .val = 2, .div = 5, },
@@ -86,14 +86,14 @@ static struct clk_div_table clk_enet_ref_table[] = {
{ }
};
-static struct clk_div_table post_div_table[] = {
+static const struct clk_div_table post_div_table[] = {
{ .val = 2, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 0, .div = 4, },
{ }
};
-static struct clk_div_table video_div_table[] = {
+static const struct clk_div_table video_div_table[] = {
{ .val = 0, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 2, .div = 1, },
diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c
index 3da121826b1b..2305699db467 100644
--- a/drivers/clk/imx/clk-imx7d.c
+++ b/drivers/clk/imx/clk-imx7d.c
@@ -27,7 +27,7 @@ static u32 share_count_sai2;
static u32 share_count_sai3;
static u32 share_count_nand;
-static struct clk_div_table test_div_table[] = {
+static const struct clk_div_table test_div_table[] = {
{ .val = 3, .div = 1, },
{ .val = 2, .div = 1, },
{ .val = 1, .div = 2, },
@@ -35,7 +35,7 @@ static struct clk_div_table test_div_table[] = {
{ }
};
-static struct clk_div_table post_div_table[] = {
+static const struct clk_div_table post_div_table[] = {
{ .val = 3, .div = 4, },
{ .val = 2, .div = 1, },
{ .val = 1, .div = 2, },
diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c
index 59b1863deb88..6dae54325a91 100644
--- a/drivers/clk/imx/clk-vf610.c
+++ b/drivers/clk/imx/clk-vf610.c
@@ -102,7 +102,7 @@ static const char *ftm_ext_sels[] = {"sirc_128k", "sxosc", "fxosc_half", "audio_
static const char *ftm_fix_sels[] = { "sxosc", "ipg_bus", };
-static struct clk_div_table pll4_audio_div_table[] = {
+static const struct clk_div_table pll4_audio_div_table[] = {
{ .val = 0, .div = 1 },
{ .val = 1, .div = 2 },
{ .val = 2, .div = 6 },
diff --git a/drivers/clk/mediatek/clk-cpumux.c b/drivers/clk/mediatek/clk-cpumux.c
index edd8e6918050..16e56772d280 100644
--- a/drivers/clk/mediatek/clk-cpumux.c
+++ b/drivers/clk/mediatek/clk-cpumux.c
@@ -27,7 +27,6 @@ static inline struct mtk_clk_cpumux *to_mtk_clk_cpumux(struct clk_hw *_hw)
static u8 clk_cpumux_get_parent(struct clk_hw *hw)
{
struct mtk_clk_cpumux *mux = to_mtk_clk_cpumux(hw);
- int num_parents = clk_hw_get_num_parents(hw);
unsigned int val;
regmap_read(mux->regmap, mux->reg, &val);
@@ -35,9 +34,6 @@ static u8 clk_cpumux_get_parent(struct clk_hw *hw)
val >>= mux->shift;
val &= mux->mask;
- if (val >= num_parents)
- return -EINVAL;
-
return val;
}
@@ -98,7 +94,7 @@ int __init mtk_clk_register_cpumuxes(struct device_node *node,
regmap = syscon_node_to_regmap(node);
if (IS_ERR(regmap)) {
- pr_err("Cannot find regmap for %s: %ld\n", node->full_name,
+ pr_err("Cannot find regmap for %pOF: %ld\n", node,
PTR_ERR(regmap));
return PTR_ERR(regmap);
}
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 0541df78141c..9c0ae4278a94 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -114,7 +114,7 @@ int mtk_clk_register_gates(struct device_node *node,
regmap = syscon_node_to_regmap(node);
if (IS_ERR(regmap)) {
- pr_err("Cannot find regmap for %s: %ld\n", node->full_name,
+ pr_err("Cannot find regmap for %pOF: %ld\n", node,
PTR_ERR(regmap));
return PTR_ERR(regmap);
}
diff --git a/drivers/clk/mediatek/reset.c b/drivers/clk/mediatek/reset.c
index 309049d41f1b..d3551d5efef2 100644
--- a/drivers/clk/mediatek/reset.c
+++ b/drivers/clk/mediatek/reset.c
@@ -72,7 +72,7 @@ void mtk_register_reset_controller(struct device_node *np,
regmap = syscon_node_to_regmap(np);
if (IS_ERR(regmap)) {
- pr_err("Cannot find regmap for %s: %ld\n", np->full_name,
+ pr_err("Cannot find regmap for %pOF: %ld\n", np,
PTR_ERR(regmap));
return;
}
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
index 5588f75a8414..d2d0174a6eca 100644
--- a/drivers/clk/meson/Kconfig
+++ b/drivers/clk/meson/Kconfig
@@ -6,6 +6,7 @@ config COMMON_CLK_AMLOGIC
config COMMON_CLK_MESON8B
bool
depends on COMMON_CLK_AMLOGIC
+ select RESET_CONTROLLER
help
Support for the clock controller on AmLogic S802 (Meson8),
S805 (Meson8b) and S812 (Meson8m2) devices. Say Y if you
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
index 83b6d9d65aa1..b139d41b25da 100644
--- a/drivers/clk/meson/Makefile
+++ b/drivers/clk/meson/Makefile
@@ -4,4 +4,4 @@
obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-cpu.o clk-mpll.o clk-audio-divider.o
obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
-obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o
+obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o gxbb-aoclk-regmap.o gxbb-aoclk-32k.o
diff --git a/drivers/clk/meson/gxbb-aoclk-32k.c b/drivers/clk/meson/gxbb-aoclk-32k.c
new file mode 100644
index 000000000000..491634dbc985
--- /dev/null
+++ b/drivers/clk/meson/gxbb-aoclk-32k.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS.
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/bitfield.h>
+#include <linux/regmap.h>
+#include "gxbb-aoclk.h"
+
+/*
+ * The AO Domain embeds a dual/divider to generate a more precise
+ * 32,768KHz clock for low-power suspend mode and CEC.
+ * ______ ______
+ * | | | |
+ * ______ | Div1 |-| Cnt1 | ______
+ * | | /|______| |______|\ | |
+ * Xtal-->| Gate |---| ______ ______ X-X--| Gate |-->
+ * |______| | \| | | |/ | |______|
+ * | | Div2 |-| Cnt2 | |
+ * | |______| |______| |
+ * |_______________________|
+ *
+ * The dividing can be switched to single or dual, with a counter
+ * for each divider to set when the switching is done.
+ * The entire dividing mechanism can be also bypassed.
+ */
+
+#define CLK_CNTL0_N1_MASK GENMASK(11, 0)
+#define CLK_CNTL0_N2_MASK GENMASK(23, 12)
+#define CLK_CNTL0_DUALDIV_EN BIT(28)
+#define CLK_CNTL0_OUT_GATE_EN BIT(30)
+#define CLK_CNTL0_IN_GATE_EN BIT(31)
+
+#define CLK_CNTL1_M1_MASK GENMASK(11, 0)
+#define CLK_CNTL1_M2_MASK GENMASK(23, 12)
+#define CLK_CNTL1_BYPASS_EN BIT(24)
+#define CLK_CNTL1_SELECT_OSC BIT(27)
+
+#define PWR_CNTL_ALT_32K_SEL GENMASK(13, 10)
+
+struct cec_32k_freq_table {
+ unsigned long parent_rate;
+ unsigned long target_rate;
+ bool dualdiv;
+ unsigned int n1;
+ unsigned int n2;
+ unsigned int m1;
+ unsigned int m2;
+};
+
+static const struct cec_32k_freq_table aoclk_cec_32k_table[] = {
+ [0] = {
+ .parent_rate = 24000000,
+ .target_rate = 32768,
+ .dualdiv = true,
+ .n1 = 733,
+ .n2 = 732,
+ .m1 = 8,
+ .m2 = 11,
+ },
+};
+
+/*
+ * If CLK_CNTL0_DUALDIV_EN == 0
+ * - will use N1 divider only
+ * If CLK_CNTL0_DUALDIV_EN == 1
+ * - hold M1 cycles of N1 divider then changes to N2
+ * - hold M2 cycles of N2 divider then changes to N1
+ * Then we can get more accurate division.
+ */
+static unsigned long aoclk_cec_32k_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct aoclk_cec_32k *cec_32k = to_aoclk_cec_32k(hw);
+ unsigned long n1;
+ u32 reg0, reg1;
+
+ regmap_read(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL0, &reg0);
+ regmap_read(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL1, &reg1);
+
+ if (reg1 & CLK_CNTL1_BYPASS_EN)
+ return parent_rate;
+
+ if (reg0 & CLK_CNTL0_DUALDIV_EN) {
+ unsigned long n2, m1, m2, f1, f2, p1, p2;
+
+ n1 = FIELD_GET(CLK_CNTL0_N1_MASK, reg0) + 1;
+ n2 = FIELD_GET(CLK_CNTL0_N2_MASK, reg0) + 1;
+
+ m1 = FIELD_GET(CLK_CNTL1_M1_MASK, reg1) + 1;
+ m2 = FIELD_GET(CLK_CNTL1_M2_MASK, reg1) + 1;
+
+ f1 = DIV_ROUND_CLOSEST(parent_rate, n1);
+ f2 = DIV_ROUND_CLOSEST(parent_rate, n2);
+
+ p1 = DIV_ROUND_CLOSEST(100000000 * m1, f1 * (m1 + m2));
+ p2 = DIV_ROUND_CLOSEST(100000000 * m2, f2 * (m1 + m2));
+
+ return DIV_ROUND_UP(100000000, p1 + p2);
+ }
+
+ n1 = FIELD_GET(CLK_CNTL0_N1_MASK, reg0) + 1;
+
+ return DIV_ROUND_CLOSEST(parent_rate, n1);
+}
+
+static const struct cec_32k_freq_table *find_cec_32k_freq(unsigned long rate,
+ unsigned long prate)
+{
+ int i;
+
+ for (i = 0 ; i < ARRAY_SIZE(aoclk_cec_32k_table) ; ++i)
+ if (aoclk_cec_32k_table[i].parent_rate == prate &&
+ aoclk_cec_32k_table[i].target_rate == rate)
+ return &aoclk_cec_32k_table[i];
+
+ return NULL;
+}
+
+static long aoclk_cec_32k_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *prate)
+{
+ const struct cec_32k_freq_table *freq = find_cec_32k_freq(rate,
+ *prate);
+
+ /* If invalid return first one */
+ if (!freq)
+ return aoclk_cec_32k_table[0].target_rate;
+
+ return freq->target_rate;
+}
+
+/*
+ * From the Amlogic init procedure, the IN and OUT gates needs to be handled
+ * in the init procedure to avoid any glitches.
+ */
+
+static int aoclk_cec_32k_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ const struct cec_32k_freq_table *freq = find_cec_32k_freq(rate,
+ parent_rate);
+ struct aoclk_cec_32k *cec_32k = to_aoclk_cec_32k(hw);
+ u32 reg = 0;
+
+ if (!freq)
+ return -EINVAL;
+
+ /* Disable clock */
+ regmap_update_bits(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL0,
+ CLK_CNTL0_IN_GATE_EN | CLK_CNTL0_OUT_GATE_EN, 0);
+
+ reg = FIELD_PREP(CLK_CNTL0_N1_MASK, freq->n1 - 1);
+ if (freq->dualdiv)
+ reg |= CLK_CNTL0_DUALDIV_EN |
+ FIELD_PREP(CLK_CNTL0_N2_MASK, freq->n2 - 1);
+
+ regmap_write(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL0, reg);
+
+ reg = FIELD_PREP(CLK_CNTL1_M1_MASK, freq->m1 - 1);
+ if (freq->dualdiv)
+ reg |= FIELD_PREP(CLK_CNTL1_M2_MASK, freq->m2 - 1);
+
+ regmap_write(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL1, reg);
+
+ /* Enable clock */
+ regmap_update_bits(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL0,
+ CLK_CNTL0_IN_GATE_EN, CLK_CNTL0_IN_GATE_EN);
+
+ udelay(200);
+
+ regmap_update_bits(cec_32k->regmap, AO_RTC_ALT_CLK_CNTL0,
+ CLK_CNTL0_OUT_GATE_EN, CLK_CNTL0_OUT_GATE_EN);
+
+ regmap_update_bits(cec_32k->regmap, AO_CRT_CLK_CNTL1,
+ CLK_CNTL1_SELECT_OSC, CLK_CNTL1_SELECT_OSC);
+
+ /* Select 32k from XTAL */
+ regmap_update_bits(cec_32k->regmap,
+ AO_RTI_PWR_CNTL_REG0,
+ PWR_CNTL_ALT_32K_SEL,
+ FIELD_PREP(PWR_CNTL_ALT_32K_SEL, 4));
+
+ return 0;
+}
+
+const struct clk_ops meson_aoclk_cec_32k_ops = {
+ .recalc_rate = aoclk_cec_32k_recalc_rate,
+ .round_rate = aoclk_cec_32k_round_rate,
+ .set_rate = aoclk_cec_32k_set_rate,
+};
diff --git a/drivers/clk/meson/gxbb-aoclk-regmap.c b/drivers/clk/meson/gxbb-aoclk-regmap.c
new file mode 100644
index 000000000000..2515fbfa0467
--- /dev/null
+++ b/drivers/clk/meson/gxbb-aoclk-regmap.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS.
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/bitfield.h>
+#include <linux/regmap.h>
+#include "gxbb-aoclk.h"
+
+static int aoclk_gate_regmap_enable(struct clk_hw *hw)
+{
+ struct aoclk_gate_regmap *gate = to_aoclk_gate_regmap(hw);
+
+ return regmap_update_bits(gate->regmap, AO_RTI_GEN_CNTL_REG0,
+ BIT(gate->bit_idx), BIT(gate->bit_idx));
+}
+
+static void aoclk_gate_regmap_disable(struct clk_hw *hw)
+{
+ struct aoclk_gate_regmap *gate = to_aoclk_gate_regmap(hw);
+
+ regmap_update_bits(gate->regmap, AO_RTI_GEN_CNTL_REG0,
+ BIT(gate->bit_idx), 0);
+}
+
+static int aoclk_gate_regmap_is_enabled(struct clk_hw *hw)
+{
+ struct aoclk_gate_regmap *gate = to_aoclk_gate_regmap(hw);
+ unsigned int val;
+ int ret;
+
+ ret = regmap_read(gate->regmap, AO_RTI_GEN_CNTL_REG0, &val);
+ if (ret)
+ return ret;
+
+ return (val & BIT(gate->bit_idx)) != 0;
+}
+
+const struct clk_ops meson_aoclk_gate_regmap_ops = {
+ .enable = aoclk_gate_regmap_enable,
+ .disable = aoclk_gate_regmap_disable,
+ .is_enabled = aoclk_gate_regmap_is_enabled,
+};
diff --git a/drivers/clk/meson/gxbb-aoclk.c b/drivers/clk/meson/gxbb-aoclk.c
index b45c5fba7e35..6c161e0a8e59 100644
--- a/drivers/clk/meson/gxbb-aoclk.c
+++ b/drivers/clk/meson/gxbb-aoclk.c
@@ -56,16 +56,20 @@
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
#include <linux/init.h>
+#include <linux/delay.h>
#include <dt-bindings/clock/gxbb-aoclkc.h>
#include <dt-bindings/reset/gxbb-aoclkc.h>
+#include "gxbb-aoclk.h"
static DEFINE_SPINLOCK(gxbb_aoclk_lock);
struct gxbb_aoclk_reset_controller {
struct reset_controller_dev reset;
unsigned int *data;
- void __iomem *base;
+ struct regmap *regmap;
};
static int gxbb_aoclk_do_reset(struct reset_controller_dev *rcdev,
@@ -74,9 +78,8 @@ static int gxbb_aoclk_do_reset(struct reset_controller_dev *rcdev,
struct gxbb_aoclk_reset_controller *reset =
container_of(rcdev, struct gxbb_aoclk_reset_controller, reset);
- writel(BIT(reset->data[id]), reset->base);
-
- return 0;
+ return regmap_write(reset->regmap, AO_RTI_GEN_CNTL_REG0,
+ BIT(reset->data[id]));
}
static const struct reset_control_ops gxbb_aoclk_reset_ops = {
@@ -84,13 +87,12 @@ static const struct reset_control_ops gxbb_aoclk_reset_ops = {
};
#define GXBB_AO_GATE(_name, _bit) \
-static struct clk_gate _name##_ao = { \
- .reg = (void __iomem *)0, \
+static struct aoclk_gate_regmap _name##_ao = { \
.bit_idx = (_bit), \
.lock = &gxbb_aoclk_lock, \
.hw.init = &(struct clk_init_data) { \
.name = #_name "_ao", \
- .ops = &clk_gate_ops, \
+ .ops = &meson_aoclk_gate_regmap_ops, \
.parent_names = (const char *[]){ "clk81" }, \
.num_parents = 1, \
.flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), \
@@ -104,6 +106,17 @@ GXBB_AO_GATE(uart1, 3);
GXBB_AO_GATE(uart2, 5);
GXBB_AO_GATE(ir_blaster, 6);
+static struct aoclk_cec_32k cec_32k_ao = {
+ .lock = &gxbb_aoclk_lock,
+ .hw.init = &(struct clk_init_data) {
+ .name = "cec_32k_ao",
+ .ops = &meson_aoclk_cec_32k_ops,
+ .parent_names = (const char *[]){ "xtal" },
+ .num_parents = 1,
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
static unsigned int gxbb_aoclk_reset[] = {
[RESET_AO_REMOTE] = 16,
[RESET_AO_I2C_MASTER] = 18,
@@ -113,7 +126,7 @@ static unsigned int gxbb_aoclk_reset[] = {
[RESET_AO_IR_BLASTER] = 23,
};
-static struct clk_gate *gxbb_aoclk_gate[] = {
+static struct aoclk_gate_regmap *gxbb_aoclk_gate[] = {
[CLKID_AO_REMOTE] = &remote_ao,
[CLKID_AO_I2C_MASTER] = &i2c_master_ao,
[CLKID_AO_I2C_SLAVE] = &i2c_slave_ao,
@@ -130,30 +143,30 @@ static struct clk_hw_onecell_data gxbb_aoclk_onecell_data = {
[CLKID_AO_UART1] = &uart1_ao.hw,
[CLKID_AO_UART2] = &uart2_ao.hw,
[CLKID_AO_IR_BLASTER] = &ir_blaster_ao.hw,
+ [CLKID_AO_CEC_32K] = &cec_32k_ao.hw,
},
- .num = ARRAY_SIZE(gxbb_aoclk_gate),
+ .num = 7,
};
static int gxbb_aoclkc_probe(struct platform_device *pdev)
{
- struct resource *res;
- void __iomem *base;
- int ret, clkid;
- struct device *dev = &pdev->dev;
struct gxbb_aoclk_reset_controller *rstc;
+ struct device *dev = &pdev->dev;
+ struct regmap *regmap;
+ int ret, clkid;
rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL);
if (!rstc)
return -ENOMEM;
- /* Generic clocks */
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- base = devm_ioremap_resource(dev, res);
- if (IS_ERR(base))
- return PTR_ERR(base);
+ regmap = syscon_node_to_regmap(of_get_parent(dev->of_node));
+ if (IS_ERR(regmap)) {
+ dev_err(dev, "failed to get regmap\n");
+ return -ENODEV;
+ }
/* Reset Controller */
- rstc->base = base;
+ rstc->regmap = regmap;
rstc->data = gxbb_aoclk_reset;
rstc->reset.ops = &gxbb_aoclk_reset_ops;
rstc->reset.nr_resets = ARRAY_SIZE(gxbb_aoclk_reset);
@@ -161,10 +174,10 @@ static int gxbb_aoclkc_probe(struct platform_device *pdev)
ret = devm_reset_controller_register(dev, &rstc->reset);
/*
- * Populate base address and register all clks
+ * Populate regmap and register all clks
*/
- for (clkid = 0; clkid < gxbb_aoclk_onecell_data.num; clkid++) {
- gxbb_aoclk_gate[clkid]->reg = base;
+ for (clkid = 0; clkid < ARRAY_SIZE(gxbb_aoclk_gate); clkid++) {
+ gxbb_aoclk_gate[clkid]->regmap = regmap;
ret = devm_clk_hw_register(dev,
gxbb_aoclk_onecell_data.hws[clkid]);
@@ -172,12 +185,18 @@ static int gxbb_aoclkc_probe(struct platform_device *pdev)
return ret;
}
+ /* Specific clocks */
+ cec_32k_ao.regmap = regmap;
+ ret = devm_clk_hw_register(dev, &cec_32k_ao.hw);
+ if (ret)
+ return ret;
+
return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
&gxbb_aoclk_onecell_data);
}
static const struct of_device_id gxbb_aoclkc_match_table[] = {
- { .compatible = "amlogic,gxbb-aoclkc" },
+ { .compatible = "amlogic,meson-gx-aoclkc" },
{ }
};
diff --git a/drivers/clk/meson/gxbb-aoclk.h b/drivers/clk/meson/gxbb-aoclk.h
new file mode 100644
index 000000000000..e8604c8f7eee
--- /dev/null
+++ b/drivers/clk/meson/gxbb-aoclk.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __GXBB_AOCLKC_H
+#define __GXBB_AOCLKC_H
+
+/* AO Configuration Clock registers offsets */
+#define AO_RTI_PWR_CNTL_REG1 0x0c
+#define AO_RTI_PWR_CNTL_REG0 0x10
+#define AO_RTI_GEN_CNTL_REG0 0x40
+#define AO_OSCIN_CNTL 0x58
+#define AO_CRT_CLK_CNTL1 0x68
+#define AO_RTC_ALT_CLK_CNTL0 0x94
+#define AO_RTC_ALT_CLK_CNTL1 0x98
+
+struct aoclk_gate_regmap {
+ struct clk_hw hw;
+ unsigned bit_idx;
+ struct regmap *regmap;
+ spinlock_t *lock;
+};
+
+#define to_aoclk_gate_regmap(_hw) \
+ container_of(_hw, struct aoclk_gate_regmap, hw)
+
+extern const struct clk_ops meson_aoclk_gate_regmap_ops;
+
+struct aoclk_cec_32k {
+ struct clk_hw hw;
+ struct regmap *regmap;
+ spinlock_t *lock;
+};
+
+#define to_aoclk_cec_32k(_hw) container_of(_hw, struct aoclk_cec_32k, hw)
+
+extern const struct clk_ops meson_aoclk_cec_32k_ops;
+
+#endif /* __GXBB_AOCLKC_H */
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
index a7ea5f3da89d..b2d1e8ed7152 100644
--- a/drivers/clk/meson/gxbb.c
+++ b/drivers/clk/meson/gxbb.c
@@ -850,13 +850,14 @@ static struct meson_clk_audio_divider gxbb_cts_amclk_div = {
.shift = 0,
.width = 8,
},
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
.lock = &clk_lock,
.hw.init = &(struct clk_init_data){
.name = "cts_amclk_div",
.ops = &meson_clk_audio_divider_ops,
.parent_names = (const char *[]){ "cts_amclk_sel" },
.num_parents = 1,
- .flags = CLK_SET_RATE_PARENT | CLK_DIVIDER_ROUND_CLOSEST,
+ .flags = CLK_SET_RATE_PARENT,
},
};
@@ -880,7 +881,7 @@ static struct clk_mux gxbb_cts_mclk_i958_sel = {
/* Default parent unknown (register reset value: 0) */
.table = (u32[]){ 1, 2, 3 },
.lock = &clk_lock,
- .hw.init = &(struct clk_init_data){
+ .hw.init = &(struct clk_init_data) {
.name = "cts_mclk_i958_sel",
.ops = &clk_mux_ops,
.parent_names = (const char *[]){ "mpll0", "mpll1", "mpll2" },
@@ -894,12 +895,13 @@ static struct clk_divider gxbb_cts_mclk_i958_div = {
.shift = 16,
.width = 8,
.lock = &clk_lock,
- .hw.init = &(struct clk_init_data){
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
+ .hw.init = &(struct clk_init_data) {
.name = "cts_mclk_i958_div",
.ops = &clk_divider_ops,
.parent_names = (const char *[]){ "cts_mclk_i958_sel" },
.num_parents = 1,
- .flags = CLK_SET_RATE_PARENT | CLK_DIVIDER_ROUND_CLOSEST,
+ .flags = CLK_SET_RATE_PARENT,
},
};
@@ -979,6 +981,156 @@ static struct clk_mux gxbb_32k_clk_sel = {
},
};
+static const char * const gxbb_sd_emmc_clk0_parent_names[] = {
+ "xtal", "fclk_div2", "fclk_div3", "fclk_div5", "fclk_div7",
+
+ /*
+ * Following these parent clocks, we should also have had mpll2, mpll3
+ * and gp0_pll but these clocks are too precious to be used here. All
+ * the necessary rates for MMC and NAND operation can be acheived using
+ * xtal or fclk_div clocks
+ */
+};
+
+/* SDIO clock */
+static struct clk_mux gxbb_sd_emmc_a_clk0_sel = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .mask = 0x7,
+ .shift = 9,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_a_clk0_sel",
+ .ops = &clk_mux_ops,
+ .parent_names = gxbb_sd_emmc_clk0_parent_names,
+ .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_names),
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_divider gxbb_sd_emmc_a_clk0_div = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .shift = 0,
+ .width = 7,
+ .lock = &clk_lock,
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_a_clk0_div",
+ .ops = &clk_divider_ops,
+ .parent_names = (const char *[]){ "sd_emmc_a_clk0_sel" },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_gate gxbb_sd_emmc_a_clk0 = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .bit_idx = 7,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data){
+ .name = "sd_emmc_a_clk0",
+ .ops = &clk_gate_ops,
+ .parent_names = (const char *[]){ "sd_emmc_a_clk0_div" },
+ .num_parents = 1,
+
+ /*
+ * FIXME:
+ * We need CLK_IGNORE_UNUSED because mmc DT node point to xtal
+ * instead of this clock. CCF would gate this on boot, killing
+ * the mmc controller. Please remove this flag once DT properly
+ * point to this clock instead of xtal
+ *
+ * Same goes for emmc B and C clocks
+ */
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+/* SDcard clock */
+static struct clk_mux gxbb_sd_emmc_b_clk0_sel = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .mask = 0x7,
+ .shift = 25,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_b_clk0_sel",
+ .ops = &clk_mux_ops,
+ .parent_names = gxbb_sd_emmc_clk0_parent_names,
+ .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_names),
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_divider gxbb_sd_emmc_b_clk0_div = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .shift = 16,
+ .width = 7,
+ .lock = &clk_lock,
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_b_clk0_div",
+ .ops = &clk_divider_ops,
+ .parent_names = (const char *[]){ "sd_emmc_b_clk0_sel" },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_gate gxbb_sd_emmc_b_clk0 = {
+ .reg = (void *)HHI_SD_EMMC_CLK_CNTL,
+ .bit_idx = 23,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data){
+ .name = "sd_emmc_b_clk0",
+ .ops = &clk_gate_ops,
+ .parent_names = (const char *[]){ "sd_emmc_b_clk0_div" },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+/* EMMC/NAND clock */
+static struct clk_mux gxbb_sd_emmc_c_clk0_sel = {
+ .reg = (void *)HHI_NAND_CLK_CNTL,
+ .mask = 0x7,
+ .shift = 9,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_c_clk0_sel",
+ .ops = &clk_mux_ops,
+ .parent_names = gxbb_sd_emmc_clk0_parent_names,
+ .num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parent_names),
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_divider gxbb_sd_emmc_c_clk0_div = {
+ .reg = (void *)HHI_NAND_CLK_CNTL,
+ .shift = 0,
+ .width = 7,
+ .lock = &clk_lock,
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_c_clk0_div",
+ .ops = &clk_divider_ops,
+ .parent_names = (const char *[]){ "sd_emmc_c_clk0_sel" },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_gate gxbb_sd_emmc_c_clk0 = {
+ .reg = (void *)HHI_NAND_CLK_CNTL,
+ .bit_idx = 7,
+ .lock = &clk_lock,
+ .hw.init = &(struct clk_init_data){
+ .name = "sd_emmc_c_clk0",
+ .ops = &clk_gate_ops,
+ .parent_names = (const char *[]){ "sd_emmc_c_clk0_div" },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
/* Everything Else (EE) domain gates */
static MESON_GATE(gxbb_ddr, HHI_GCLK_MPEG0, 0);
static MESON_GATE(gxbb_dos, HHI_GCLK_MPEG0, 1);
@@ -1188,6 +1340,16 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
[CLKID_32K_CLK] = &gxbb_32k_clk.hw,
[CLKID_32K_CLK_SEL] = &gxbb_32k_clk_sel.hw,
[CLKID_32K_CLK_DIV] = &gxbb_32k_clk_div.hw,
+ [CLKID_SD_EMMC_A_CLK0_SEL] = &gxbb_sd_emmc_a_clk0_sel.hw,
+ [CLKID_SD_EMMC_A_CLK0_DIV] = &gxbb_sd_emmc_a_clk0_div.hw,
+ [CLKID_SD_EMMC_A_CLK0] = &gxbb_sd_emmc_a_clk0.hw,
+ [CLKID_SD_EMMC_B_CLK0_SEL] = &gxbb_sd_emmc_b_clk0_sel.hw,
+ [CLKID_SD_EMMC_B_CLK0_DIV] = &gxbb_sd_emmc_b_clk0_div.hw,
+ [CLKID_SD_EMMC_B_CLK0] = &gxbb_sd_emmc_b_clk0.hw,
+ [CLKID_SD_EMMC_C_CLK0_SEL] = &gxbb_sd_emmc_c_clk0_sel.hw,
+ [CLKID_SD_EMMC_C_CLK0_DIV] = &gxbb_sd_emmc_c_clk0_div.hw,
+ [CLKID_SD_EMMC_C_CLK0] = &gxbb_sd_emmc_c_clk0.hw,
+ [NR_CLKS] = NULL,
},
.num = NR_CLKS,
};
@@ -1310,6 +1472,16 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
[CLKID_32K_CLK] = &gxbb_32k_clk.hw,
[CLKID_32K_CLK_SEL] = &gxbb_32k_clk_sel.hw,
[CLKID_32K_CLK_DIV] = &gxbb_32k_clk_div.hw,
+ [CLKID_SD_EMMC_A_CLK0_SEL] = &gxbb_sd_emmc_a_clk0_sel.hw,
+ [CLKID_SD_EMMC_A_CLK0_DIV] = &gxbb_sd_emmc_a_clk0_div.hw,
+ [CLKID_SD_EMMC_A_CLK0] = &gxbb_sd_emmc_a_clk0.hw,
+ [CLKID_SD_EMMC_B_CLK0_SEL] = &gxbb_sd_emmc_b_clk0_sel.hw,
+ [CLKID_SD_EMMC_B_CLK0_DIV] = &gxbb_sd_emmc_b_clk0_div.hw,
+ [CLKID_SD_EMMC_B_CLK0] = &gxbb_sd_emmc_b_clk0.hw,
+ [CLKID_SD_EMMC_C_CLK0_SEL] = &gxbb_sd_emmc_c_clk0_sel.hw,
+ [CLKID_SD_EMMC_C_CLK0_DIV] = &gxbb_sd_emmc_c_clk0_div.hw,
+ [CLKID_SD_EMMC_C_CLK0] = &gxbb_sd_emmc_c_clk0.hw,
+ [NR_CLKS] = NULL,
},
.num = NR_CLKS,
};
@@ -1425,6 +1597,9 @@ static struct clk_gate *const gxbb_clk_gates[] = {
&gxbb_cts_amclk,
&gxbb_cts_mclk_i958,
&gxbb_32k_clk,
+ &gxbb_sd_emmc_a_clk0,
+ &gxbb_sd_emmc_b_clk0,
+ &gxbb_sd_emmc_c_clk0,
};
static struct clk_mux *const gxbb_clk_muxes[] = {
@@ -1437,6 +1612,9 @@ static struct clk_mux *const gxbb_clk_muxes[] = {
&gxbb_cts_mclk_i958_sel,
&gxbb_cts_i958,
&gxbb_32k_clk_sel,
+ &gxbb_sd_emmc_a_clk0_sel,
+ &gxbb_sd_emmc_b_clk0_sel,
+ &gxbb_sd_emmc_c_clk0_sel,
};
static struct clk_divider *const gxbb_clk_dividers[] = {
@@ -1446,6 +1624,9 @@ static struct clk_divider *const gxbb_clk_dividers[] = {
&gxbb_mali_1_div,
&gxbb_cts_mclk_i958_div,
&gxbb_32k_clk_div,
+ &gxbb_sd_emmc_a_clk0_div,
+ &gxbb_sd_emmc_b_clk0_div,
+ &gxbb_sd_emmc_c_clk0_div,
};
static struct meson_clk_audio_divider *const gxbb_audio_dividers[] = {
diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h
index d63e77e8433d..5b1d4b374d1c 100644
--- a/drivers/clk/meson/gxbb.h
+++ b/drivers/clk/meson/gxbb.h
@@ -167,130 +167,33 @@
* CLKID index values
*
* These indices are entirely contrived and do not map onto the hardware.
- * Migrate them out of this header and into the DT header file when they need
- * to be exposed to client nodes in DT: include/dt-bindings/clock/gxbb-clkc.h
+ * It has now been decided to expose everything by default in the DT header:
+ * include/dt-bindings/clock/gxbb-clkc.h. Only the clocks ids we don't want
+ * to expose, such as the internal muxes and dividers of composite clocks,
+ * will remain defined here.
*/
-#define CLKID_SYS_PLL 0
/* ID 1 is unused (it was used by the non-existing CLKID_CPUCLK before) */
-/* CLKID_HDMI_PLL */
-#define CLKID_FIXED_PLL 3
-/* CLKID_FCLK_DIV2 */
-/* CLKID_FCLK_DIV3 */
-/* CLKID_FCLK_DIV4 */
-#define CLKID_FCLK_DIV5 7
-#define CLKID_FCLK_DIV7 8
-/* CLKID_GP0_PLL */
#define CLKID_MPEG_SEL 10
#define CLKID_MPEG_DIV 11
-/* CLKID_CLK81 */
-#define CLKID_MPLL0 13
-#define CLKID_MPLL1 14
-/* CLKID_MPLL2 */
-#define CLKID_DDR 16
-#define CLKID_DOS 17
-#define CLKID_ISA 18
-#define CLKID_PL301 19
-#define CLKID_PERIPHS 20
-/* CLKID_SPICC */
-/* CLKID_I2C */
-/* #define CLKID_SAR_ADC */
-#define CLKID_SMART_CARD 24
-/* CLKID_RNG0 */
-/* CLKID_UART0 */
-#define CLKID_SDHC 27
-#define CLKID_STREAM 28
-#define CLKID_ASYNC_FIFO 29
-#define CLKID_SDIO 30
-#define CLKID_ABUF 31
-#define CLKID_HIU_IFACE 32
-#define CLKID_ASSIST_MISC 33
-/* CLKID_SPI */
-#define CLKID_I2S_SPDIF 35
-/* CLKID_ETH */
-#define CLKID_DEMUX 37
-/* CLKID_AIU_GLUE */
-/* CLKID_IEC958 */
-/* CLKID_I2S_OUT */
-#define CLKID_AMCLK 41
-#define CLKID_AIFIFO2 42
-#define CLKID_MIXER 43
-/* CLKID_MIXER_IFACE */
-#define CLKID_ADC 45
-#define CLKID_BLKMV 46
-/* CLKID_AIU */
-/* CLKID_UART1 */
-#define CLKID_G2D 49
-/* CLKID_USB0 */
-/* CLKID_USB1 */
-#define CLKID_RESET 52
-#define CLKID_NAND 53
-#define CLKID_DOS_PARSER 54
-/* CLKID_USB */
-#define CLKID_VDIN1 56
-#define CLKID_AHB_ARB0 57
-#define CLKID_EFUSE 58
-#define CLKID_BOOT_ROM 59
-#define CLKID_AHB_DATA_BUS 60
-#define CLKID_AHB_CTRL_BUS 61
-#define CLKID_HDMI_INTR_SYNC 62
-/* CLKID_HDMI_PCLK */
-/* CLKID_USB1_DDR_BRIDGE */
-/* CLKID_USB0_DDR_BRIDGE */
-#define CLKID_MMC_PCLK 66
-#define CLKID_DVIN 67
-/* CLKID_UART2 */
-/* #define CLKID_SANA */
-#define CLKID_VPU_INTR 70
-#define CLKID_SEC_AHB_AHB3_BRIDGE 71
-#define CLKID_CLK81_A53 72
-#define CLKID_VCLK2_VENCI0 73
-#define CLKID_VCLK2_VENCI1 74
-#define CLKID_VCLK2_VENCP0 75
-#define CLKID_VCLK2_VENCP1 76
-/* CLKID_GCLK_VENCI_INT0 */
-#define CLKID_GCLK_VENCI_INT 78
-#define CLKID_DAC_CLK 79
-/* CLKID_AOCLK_GATE */
-/* CLKID_IEC958_GATE */
-#define CLKID_ENC480P 82
-#define CLKID_RNG1 83
-#define CLKID_GCLK_VENCI_INT1 84
-#define CLKID_VCLK2_VENCLMCC 85
-#define CLKID_VCLK2_VENCL 86
-#define CLKID_VCLK_OTHER 87
-#define CLKID_EDP 88
-#define CLKID_AO_MEDIA_CPU 89
-#define CLKID_AO_AHB_SRAM 90
-#define CLKID_AO_AHB_BUS 91
-#define CLKID_AO_IFACE 92
-/* CLKID_AO_I2C */
-/* CLKID_SD_EMMC_A */
-/* CLKID_SD_EMMC_B */
-/* CLKID_SD_EMMC_C */
-/* CLKID_SAR_ADC_CLK */
-/* CLKID_SAR_ADC_SEL */
#define CLKID_SAR_ADC_DIV 99
-/* CLKID_MALI_0_SEL */
-#define CLKID_MALI_0_DIV 101
-/* CLKID_MALI_0 */
-/* CLKID_MALI_1_SEL */
-#define CLKID_MALI_1_DIV 104
-/* CLKID_MALI_1 */
-/* CLKID_MALI */
-/* CLKID_CTS_AMCLK */
+#define CLKID_MALI_0_DIV 101
+#define CLKID_MALI_1_DIV 104
#define CLKID_CTS_AMCLK_SEL 108
#define CLKID_CTS_AMCLK_DIV 109
-/* CLKID_CTS_MCLK_I958 */
#define CLKID_CTS_MCLK_I958_SEL 111
#define CLKID_CTS_MCLK_I958_DIV 112
-/* CLKID_CTS_I958 */
-#define CLKID_32K_CLK 114
#define CLKID_32K_CLK_SEL 115
#define CLKID_32K_CLK_DIV 116
+#define CLKID_SD_EMMC_A_CLK0_SEL 117
+#define CLKID_SD_EMMC_A_CLK0_DIV 118
+#define CLKID_SD_EMMC_B_CLK0_SEL 120
+#define CLKID_SD_EMMC_B_CLK0_DIV 121
+#define CLKID_SD_EMMC_C_CLK0_SEL 123
+#define CLKID_SD_EMMC_C_CLK0_DIV 124
-#define NR_CLKS 117
+#define NR_CLKS 126
-/* include the CLKIDs that have been made part of the stable DT binding */
+/* include the CLKIDs that have been made part of the DT binding */
#include <dt-bindings/clock/gxbb-clkc.h>
#endif /* __GXBB_H */
diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
index 6ec512ad2598..20ab7190d328 100644
--- a/drivers/clk/meson/meson8b.c
+++ b/drivers/clk/meson/meson8b.c
@@ -25,6 +25,8 @@
#include <linux/clk-provider.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
#include <linux/init.h>
#include "clkc.h"
@@ -32,6 +34,13 @@
static DEFINE_SPINLOCK(clk_lock);
+static void __iomem *clk_base;
+
+struct meson8b_clk_reset {
+ struct reset_controller_dev reset;
+ void __iomem *base;
+};
+
static const struct pll_rate_table sys_pll_rate_table[] = {
PLL_RATE(312000000, 52, 1, 2),
PLL_RATE(336000000, 56, 1, 2),
@@ -590,6 +599,7 @@ static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
[CLKID_MPLL0] = &meson8b_mpll0.hw,
[CLKID_MPLL1] = &meson8b_mpll1.hw,
[CLKID_MPLL2] = &meson8b_mpll2.hw,
+ [CLK_NR_CLKS] = NULL,
},
.num = CLK_NR_CLKS,
};
@@ -695,20 +705,114 @@ static struct clk_divider *const meson8b_clk_dividers[] = {
&meson8b_mpeg_clk_div,
};
+static const struct meson8b_clk_reset_line {
+ u32 reg;
+ u8 bit_idx;
+} meson8b_clk_reset_bits[] = {
+ [CLKC_RESET_L2_CACHE_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 30
+ },
+ [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 29
+ },
+ [CLKC_RESET_SCU_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 28
+ },
+ [CLKC_RESET_CPU3_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 27
+ },
+ [CLKC_RESET_CPU2_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 26
+ },
+ [CLKC_RESET_CPU1_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 25
+ },
+ [CLKC_RESET_CPU0_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 24
+ },
+ [CLKC_RESET_A5_GLOBAL_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 18
+ },
+ [CLKC_RESET_A5_AXI_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 17
+ },
+ [CLKC_RESET_A5_ABP_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 16
+ },
+ [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = {
+ .reg = HHI_SYS_CPU_CLK_CNTL1, .bit_idx = 30
+ },
+ [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = {
+ .reg = HHI_VID_CLK_CNTL, .bit_idx = 15
+ },
+ [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = {
+ .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 7
+ },
+ [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = {
+ .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 3
+ },
+ [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = {
+ .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 1
+ },
+ [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = {
+ .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 0
+ },
+};
+
+static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev,
+ unsigned long id, bool assert)
+{
+ struct meson8b_clk_reset *meson8b_clk_reset =
+ container_of(rcdev, struct meson8b_clk_reset, reset);
+ unsigned long flags;
+ const struct meson8b_clk_reset_line *reset;
+ u32 val;
+
+ if (id >= ARRAY_SIZE(meson8b_clk_reset_bits))
+ return -EINVAL;
+
+ reset = &meson8b_clk_reset_bits[id];
+
+ spin_lock_irqsave(&clk_lock, flags);
+
+ val = readl(meson8b_clk_reset->base + reset->reg);
+ if (assert)
+ val |= BIT(reset->bit_idx);
+ else
+ val &= ~BIT(reset->bit_idx);
+ writel(val, meson8b_clk_reset->base + reset->reg);
+
+ spin_unlock_irqrestore(&clk_lock, flags);
+
+ return 0;
+}
+
+static int meson8b_clk_reset_assert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ return meson8b_clk_reset_update(rcdev, id, true);
+}
+
+static int meson8b_clk_reset_deassert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ return meson8b_clk_reset_update(rcdev, id, false);
+}
+
+static const struct reset_control_ops meson8b_clk_reset_ops = {
+ .assert = meson8b_clk_reset_assert,
+ .deassert = meson8b_clk_reset_deassert,
+};
+
static int meson8b_clkc_probe(struct platform_device *pdev)
{
- void __iomem *clk_base;
int ret, clkid, i;
struct clk_hw *parent_hw;
struct clk *parent_clk;
struct device *dev = &pdev->dev;
- /* Generic clocks and PLLs */
- clk_base = of_iomap(dev->of_node, 1);
- if (!clk_base) {
- pr_err("%s: Unable to map clk base\n", __func__);
+ if (!clk_base)
return -ENXIO;
- }
/* Populate base address for PLLs */
for (i = 0; i < ARRAY_SIZE(meson8b_clk_plls); i++)
@@ -748,7 +852,7 @@ static int meson8b_clkc_probe(struct platform_device *pdev)
/* FIXME convert to devm_clk_register */
ret = devm_clk_hw_register(dev, meson8b_hw_onecell_data.hws[clkid]);
if (ret)
- goto iounmap;
+ return ret;
}
/*
@@ -771,15 +875,11 @@ static int meson8b_clkc_probe(struct platform_device *pdev)
if (ret) {
pr_err("%s: failed to register clock notifier for cpu_clk\n",
__func__);
- goto iounmap;
+ return ret;
}
return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
&meson8b_hw_onecell_data);
-
-iounmap:
- iounmap(clk_base);
- return ret;
}
static const struct of_device_id meson8b_clkc_match_table[] = {
@@ -798,3 +898,39 @@ static struct platform_driver meson8b_driver = {
};
builtin_platform_driver(meson8b_driver);
+
+static void __init meson8b_clkc_reset_init(struct device_node *np)
+{
+ struct meson8b_clk_reset *rstc;
+ int ret;
+
+ /* Generic clocks, PLLs and some of the reset-bits */
+ clk_base = of_iomap(np, 1);
+ if (!clk_base) {
+ pr_err("%s: Unable to map clk base\n", __func__);
+ return;
+ }
+
+ rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
+ if (!rstc)
+ return;
+
+ /* Reset Controller */
+ rstc->base = clk_base;
+ rstc->reset.ops = &meson8b_clk_reset_ops;
+ rstc->reset.nr_resets = ARRAY_SIZE(meson8b_clk_reset_bits);
+ rstc->reset.of_node = np;
+ ret = reset_controller_register(&rstc->reset);
+ if (ret) {
+ pr_err("%s: Failed to register clkc reset controller: %d\n",
+ __func__, ret);
+ return;
+ }
+}
+
+CLK_OF_DECLARE_DRIVER(meson8_clkc, "amlogic,meson8-clkc",
+ meson8b_clkc_reset_init);
+CLK_OF_DECLARE_DRIVER(meson8b_clkc, "amlogic,meson8b-clkc",
+ meson8b_clkc_reset_init);
+CLK_OF_DECLARE_DRIVER(meson8m2_clkc, "amlogic,meson8m2-clkc",
+ meson8b_clkc_reset_init);
diff --git a/drivers/clk/meson/meson8b.h b/drivers/clk/meson/meson8b.h
index a687e02547dc..2eaf8a52e7dd 100644
--- a/drivers/clk/meson/meson8b.h
+++ b/drivers/clk/meson/meson8b.h
@@ -37,6 +37,9 @@
#define HHI_GCLK_AO 0x154 /* 0x55 offset in data sheet */
#define HHI_SYS_CPU_CLK_CNTL1 0x15c /* 0x57 offset in data sheet */
#define HHI_MPEG_CLK_CNTL 0x174 /* 0x5d offset in data sheet */
+#define HHI_VID_CLK_CNTL 0x17c /* 0x5f offset in data sheet */
+#define HHI_VID_DIVIDER_CNTL 0x198 /* 0x66 offset in data sheet */
+#define HHI_SYS_CPU_CLK_CNTL0 0x19c /* 0x67 offset in data sheet */
#define HHI_MPLL_CNTL 0x280 /* 0xa0 offset in data sheet */
#define HHI_SYS_PLL_CNTL 0x300 /* 0xc0 offset in data sheet */
#define HHI_VID_PLL_CNTL 0x320 /* 0xc8 offset in data sheet */
@@ -60,110 +63,19 @@
* CLKID index values
*
* These indices are entirely contrived and do not map onto the hardware.
- * Migrate them out of this header and into the DT header file when they need
- * to be exposed to client nodes in DT: include/dt-bindings/clock/meson8b-clkc.h
+ * It has now been decided to expose everything by default in the DT header:
+ * include/dt-bindings/clock/gxbb-clkc.h. Only the clocks ids we don't want
+ * to expose, such as the internal muxes and dividers of composite clocks,
+ * will remain defined here.
*/
-/* CLKID_UNUSED */
-/* CLKID_XTAL */
-/* CLKID_PLL_FIXED */
-/* CLKID_PLL_VID */
-/* CLKID_PLL_SYS */
-/* CLKID_FCLK_DIV2 */
-/* CLKID_FCLK_DIV3 */
-/* CLKID_FCLK_DIV4 */
-/* CLKID_FCLK_DIV5 */
-/* CLKID_FCLK_DIV7 */
-/* CLKID_CLK81 */
-/* CLKID_MALI */
-/* CLKID_CPUCLK */
-/* CLKID_ZERO */
-/* CLKID_MPEG_SEL */
-/* CLKID_MPEG_DIV */
-#define CLKID_DDR 16
-#define CLKID_DOS 17
-#define CLKID_ISA 18
-#define CLKID_PL301 19
-#define CLKID_PERIPHS 20
-#define CLKID_SPICC 21
-#define CLKID_I2C 22
-/* #define CLKID_SAR_ADC */
-#define CLKID_SMART_CARD 24
-/* #define CLKID_RNG0 */
-#define CLKID_UART0 26
-#define CLKID_SDHC 27
-#define CLKID_STREAM 28
-#define CLKID_ASYNC_FIFO 29
-/* #define CLKID_SDIO */
-#define CLKID_ABUF 31
-#define CLKID_HIU_IFACE 32
-#define CLKID_ASSIST_MISC 33
-#define CLKID_SPI 34
-#define CLKID_I2S_SPDIF 35
-/* #define CLKID_ETH */
-#define CLKID_DEMUX 37
-#define CLKID_AIU_GLUE 38
-#define CLKID_IEC958 39
-#define CLKID_I2S_OUT 40
-#define CLKID_AMCLK 41
-#define CLKID_AIFIFO2 42
-#define CLKID_MIXER 43
-#define CLKID_MIXER_IFACE 44
-#define CLKID_ADC 45
-#define CLKID_BLKMV 46
-#define CLKID_AIU 47
-#define CLKID_UART1 48
-#define CLKID_G2D 49
-/* #define CLKID_USB0 */
-/* #define CLKID_USB1 */
-#define CLKID_RESET 52
-#define CLKID_NAND 53
-#define CLKID_DOS_PARSER 54
-/* #define CLKID_USB */
-#define CLKID_VDIN1 56
-#define CLKID_AHB_ARB0 57
-#define CLKID_EFUSE 58
-#define CLKID_BOOT_ROM 59
-#define CLKID_AHB_DATA_BUS 60
-#define CLKID_AHB_CTRL_BUS 61
-#define CLKID_HDMI_INTR_SYNC 62
-#define CLKID_HDMI_PCLK 63
-/* CLKID_USB1_DDR_BRIDGE */
-/* CLKID_USB0_DDR_BRIDGE */
-#define CLKID_MMC_PCLK 66
-#define CLKID_DVIN 67
-#define CLKID_UART2 68
-/* #define CLKID_SANA */
-#define CLKID_VPU_INTR 70
-#define CLKID_SEC_AHB_AHB3_BRIDGE 71
-#define CLKID_CLK81_A9 72
-#define CLKID_VCLK2_VENCI0 73
-#define CLKID_VCLK2_VENCI1 74
-#define CLKID_VCLK2_VENCP0 75
-#define CLKID_VCLK2_VENCP1 76
-#define CLKID_GCLK_VENCI_INT 77
-#define CLKID_GCLK_VENCP_INT 78
-#define CLKID_DAC_CLK 79
-#define CLKID_AOCLK_GATE 80
-#define CLKID_IEC958_GATE 81
-#define CLKID_ENC480P 82
-#define CLKID_RNG1 83
-#define CLKID_GCLK_VENCL_INT 84
-#define CLKID_VCLK2_VENCLMCC 85
-#define CLKID_VCLK2_VENCL 86
-#define CLKID_VCLK2_OTHER 87
-#define CLKID_EDP 88
-#define CLKID_AO_MEDIA_CPU 89
-#define CLKID_AO_AHB_SRAM 90
-#define CLKID_AO_AHB_BUS 91
-#define CLKID_AO_IFACE 92
-#define CLKID_MPLL0 93
-#define CLKID_MPLL1 94
-#define CLKID_MPLL2 95
-
#define CLK_NR_CLKS 96
-/* include the CLKIDs that have been made part of the stable DT binding */
+/*
+ * include the CLKID and RESETID that have
+ * been made part of the stable DT binding
+ */
#include <dt-bindings/clock/meson8b-clkc.h>
+#include <dt-bindings/reset/amlogic,meson8b-clkc-reset.h>
#endif /* __MESON8B_H */
diff --git a/drivers/clk/mmp/clk.c b/drivers/clk/mmp/clk.c
index 61893fe73251..089927e4cda2 100644
--- a/drivers/clk/mmp/clk.c
+++ b/drivers/clk/mmp/clk.c
@@ -9,7 +9,7 @@
void mmp_clk_init(struct device_node *np, struct mmp_clk_unit *unit,
int nr_clks)
{
- static struct clk **clk_table;
+ struct clk **clk_table;
clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL);
if (!clk_table)
diff --git a/drivers/clk/nxp/clk-lpc32xx.c b/drivers/clk/nxp/clk-lpc32xx.c
index 5b98ff9076f3..7b359afd620e 100644
--- a/drivers/clk/nxp/clk-lpc32xx.c
+++ b/drivers/clk/nxp/clk-lpc32xx.c
@@ -885,7 +885,7 @@ static const struct clk_ops clk_usb_i2c_ops = {
.recalc_rate = clk_usb_i2c_recalc_rate,
};
-static int clk_gate_enable(struct clk_hw *hw)
+static int lpc32xx_clk_gate_enable(struct clk_hw *hw)
{
struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
u32 mask = BIT(clk->bit_idx);
@@ -894,7 +894,7 @@ static int clk_gate_enable(struct clk_hw *hw)
return regmap_update_bits(clk_regmap, clk->reg, mask, val);
}
-static void clk_gate_disable(struct clk_hw *hw)
+static void lpc32xx_clk_gate_disable(struct clk_hw *hw)
{
struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
u32 mask = BIT(clk->bit_idx);
@@ -903,7 +903,7 @@ static void clk_gate_disable(struct clk_hw *hw)
regmap_update_bits(clk_regmap, clk->reg, mask, val);
}
-static int clk_gate_is_enabled(struct clk_hw *hw)
+static int lpc32xx_clk_gate_is_enabled(struct clk_hw *hw)
{
struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
u32 val;
@@ -916,9 +916,9 @@ static int clk_gate_is_enabled(struct clk_hw *hw)
}
static const struct clk_ops lpc32xx_clk_gate_ops = {
- .enable = clk_gate_enable,
- .disable = clk_gate_disable,
- .is_enabled = clk_gate_is_enabled,
+ .enable = lpc32xx_clk_gate_enable,
+ .disable = lpc32xx_clk_gate_disable,
+ .is_enabled = lpc32xx_clk_gate_is_enabled,
};
#define div_mask(width) ((1 << (width)) - 1)
diff --git a/drivers/clk/qcom/clk-smd-rpm.c b/drivers/clk/qcom/clk-smd-rpm.c
index d990fe44aef3..cc03d5508627 100644
--- a/drivers/clk/qcom/clk-smd-rpm.c
+++ b/drivers/clk/qcom/clk-smd-rpm.c
@@ -412,8 +412,6 @@ static const struct clk_ops clk_smd_rpm_ops = {
static const struct clk_ops clk_smd_rpm_branch_ops = {
.prepare = clk_smd_rpm_prepare,
.unprepare = clk_smd_rpm_unprepare,
- .round_rate = clk_smd_rpm_round_rate,
- .recalc_rate = clk_smd_rpm_recalc_rate,
};
/* msm8916 */
diff --git a/drivers/clk/qcom/gcc-msm8916.c b/drivers/clk/qcom/gcc-msm8916.c
index 2cfe7000fc60..3410ee68d4bc 100644
--- a/drivers/clk/qcom/gcc-msm8916.c
+++ b/drivers/clk/qcom/gcc-msm8916.c
@@ -1176,7 +1176,7 @@ static struct clk_rcg2 bimc_gpu_clk_src = {
.parent_names = gcc_xo_gpll0_bimc,
.num_parents = 3,
.flags = CLK_GET_RATE_NOCACHE,
- .ops = &clk_rcg2_shared_ops,
+ .ops = &clk_rcg2_ops,
},
};
diff --git a/drivers/clk/qcom/gcc-msm8996.c b/drivers/clk/qcom/gcc-msm8996.c
index 8abc200d4fd3..7ddec886fcd3 100644
--- a/drivers/clk/qcom/gcc-msm8996.c
+++ b/drivers/clk/qcom/gcc-msm8996.c
@@ -2730,6 +2730,32 @@ static struct clk_fixed_factor ufs_rx_cfg_clk_src = {
},
};
+static struct clk_branch gcc_hlos1_vote_lpass_core_smmu_clk = {
+ .halt_reg = 0x7d010,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x7d010,
+ .enable_mask = BIT(0),
+ .hw.init = &(struct clk_init_data){
+ .name = "hlos1_vote_lpass_core_smmu_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gcc_hlos1_vote_lpass_adsp_smmu_clk = {
+ .halt_reg = 0x7d014,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x7d014,
+ .enable_mask = BIT(0),
+ .hw.init = &(struct clk_init_data){
+ .name = "hlos1_vote_lpass_adsp_smmu_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
static struct clk_branch gcc_ufs_rx_cfg_clk = {
.halt_reg = 0x75014,
.clkr = {
@@ -3307,6 +3333,8 @@ static struct clk_regmap *gcc_msm8996_clocks[] = {
[GCC_UFS_AHB_CLK] = &gcc_ufs_ahb_clk.clkr,
[GCC_UFS_TX_CFG_CLK] = &gcc_ufs_tx_cfg_clk.clkr,
[GCC_UFS_RX_CFG_CLK] = &gcc_ufs_rx_cfg_clk.clkr,
+ [GCC_HLOS1_VOTE_LPASS_CORE_SMMU_CLK] = &gcc_hlos1_vote_lpass_core_smmu_clk.clkr,
+ [GCC_HLOS1_VOTE_LPASS_ADSP_SMMU_CLK] = &gcc_hlos1_vote_lpass_adsp_smmu_clk.clkr,
[GCC_UFS_TX_SYMBOL_0_CLK] = &gcc_ufs_tx_symbol_0_clk.clkr,
[GCC_UFS_RX_SYMBOL_0_CLK] = &gcc_ufs_rx_symbol_0_clk.clkr,
[GCC_UFS_RX_SYMBOL_1_CLK] = &gcc_ufs_rx_symbol_1_clk.clkr,
diff --git a/drivers/clk/renesas/Kconfig b/drivers/clk/renesas/Kconfig
index 78d1df9112ba..acbb38151ba1 100644
--- a/drivers/clk/renesas/Kconfig
+++ b/drivers/clk/renesas/Kconfig
@@ -15,6 +15,7 @@ config CLK_RENESAS
select CLK_R8A7794 if ARCH_R8A7794
select CLK_R8A7795 if ARCH_R8A7795
select CLK_R8A7796 if ARCH_R8A7796
+ select CLK_R8A77995 if ARCH_R8A77995
select CLK_SH73A0 if ARCH_SH73A0
if CLK_RENESAS
@@ -34,94 +35,103 @@ config CLK_EMEV2
bool "Emma Mobile EV2 clock support" if COMPILE_TEST
config CLK_RZA1
- bool
+ bool "RZ/A1H clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
config CLK_R8A73A4
- bool
+ bool "R-Mobile APE6 clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
select CLK_RENESAS_DIV6
config CLK_R8A7740
- bool
+ bool "R-Mobile A1 clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
select CLK_RENESAS_DIV6
config CLK_R8A7743
- bool
+ bool "RZ/G1M clock support" if COMPILE_TEST
select CLK_RCAR_GEN2_CPG
config CLK_R8A7745
- bool
+ bool "RZ/G1E clock support" if COMPILE_TEST
select CLK_RCAR_GEN2_CPG
config CLK_R8A7778
- bool
+ bool "R-Car M1A clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
config CLK_R8A7779
- bool
+ bool "R-Car H1 clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
config CLK_R8A7790
- bool
+ bool "R-Car H2 clock support" if COMPILE_TEST
select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY
select CLK_RCAR_GEN2_CPG
select CLK_RENESAS_DIV6
config CLK_R8A7791
- bool
+ bool "R-Car M2-W/N clock support" if COMPILE_TEST
select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY
select CLK_RCAR_GEN2_CPG
select CLK_RENESAS_DIV6
config CLK_R8A7792
- bool
+ bool "R-Car V2H clock support" if COMPILE_TEST
select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY
select CLK_RCAR_GEN2_CPG
config CLK_R8A7794
- bool
+ bool "R-Car E2 clock support" if COMPILE_TEST
select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY
select CLK_RCAR_GEN2_CPG
select CLK_RENESAS_DIV6
config CLK_R8A7795
- bool
+ bool "R-Car H3 clock support" if COMPILE_TEST
select CLK_RCAR_GEN3_CPG
config CLK_R8A7796
- bool
+ bool "R-Car M3-W clock support" if COMPILE_TEST
+ select CLK_RCAR_GEN3_CPG
+
+config CLK_R8A77995
+ bool "R-Car D3 clock support" if COMPILE_TEST
select CLK_RCAR_GEN3_CPG
config CLK_SH73A0
- bool
+ bool "SH-Mobile AG5 clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
select CLK_RENESAS_DIV6
# Family
config CLK_RCAR_GEN2
- bool
+ bool "R-Car Gen2 legacy clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSTP
select CLK_RENESAS_DIV6
config CLK_RCAR_GEN2_CPG
- bool
+ bool "R-Car Gen2 CPG clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSSR
config CLK_RCAR_GEN3_CPG
- bool
+ bool "R-Car Gen3 CPG clock support" if COMPILE_TEST
select CLK_RENESAS_CPG_MSSR
+config CLK_RCAR_USB2_CLOCK_SEL
+ bool "Renesas R-Car USB2 clock selector support"
+ depends on ARCH_RENESAS || COMPILE_TEST
+ help
+ This is a driver for R-Car USB2 clock selector
# Generic
config CLK_RENESAS_CPG_MSSR
- bool
+ bool "CPG/MSSR clock support" if COMPILE_TEST
select CLK_RENESAS_DIV6
config CLK_RENESAS_CPG_MSTP
- bool
+ bool "MSTP clock support" if COMPILE_TEST
config CLK_RENESAS_DIV6
bool "DIV6 clock support" if COMPILE_TEST
diff --git a/drivers/clk/renesas/Makefile b/drivers/clk/renesas/Makefile
index 02d04124371f..9bda3ec5b199 100644
--- a/drivers/clk/renesas/Makefile
+++ b/drivers/clk/renesas/Makefile
@@ -13,12 +13,14 @@ obj-$(CONFIG_CLK_R8A7792) += r8a7792-cpg-mssr.o
obj-$(CONFIG_CLK_R8A7794) += r8a7794-cpg-mssr.o
obj-$(CONFIG_CLK_R8A7795) += r8a7795-cpg-mssr.o
obj-$(CONFIG_CLK_R8A7796) += r8a7796-cpg-mssr.o
+obj-$(CONFIG_CLK_R8A77995) += r8a77995-cpg-mssr.o
obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o
# Family
obj-$(CONFIG_CLK_RCAR_GEN2) += clk-rcar-gen2.o
obj-$(CONFIG_CLK_RCAR_GEN2_CPG) += rcar-gen2-cpg.o
obj-$(CONFIG_CLK_RCAR_GEN3_CPG) += rcar-gen3-cpg.o
+obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL) += rcar-usb2-clock-sel.o
# Generic
obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o
diff --git a/drivers/clk/renesas/clk-div6.c b/drivers/clk/renesas/clk-div6.c
index 0627860233cb..3e0040c0ac87 100644
--- a/drivers/clk/renesas/clk-div6.c
+++ b/drivers/clk/renesas/clk-div6.c
@@ -29,6 +29,9 @@
* @hw: handle between common and hardware-specific interfaces
* @reg: IO-remapped register
* @div: divisor value (1-64)
+ * @src_shift: Shift to access the register bits to select the parent clock
+ * @src_width: Number of register bits to select the parent clock (may be 0)
+ * @parents: Array to map from valid parent clocks indices to hardware indices
*/
struct div6_clock {
struct clk_hw hw;
diff --git a/drivers/clk/renesas/clk-mstp.c b/drivers/clk/renesas/clk-mstp.c
index f1617dd044cb..500a9e4e03c4 100644
--- a/drivers/clk/renesas/clk-mstp.c
+++ b/drivers/clk/renesas/clk-mstp.c
@@ -335,7 +335,7 @@ void __init cpg_mstp_add_clk_domain(struct device_node *np)
u32 ncells;
if (of_property_read_u32(np, "#power-domain-cells", &ncells)) {
- pr_warn("%s lacks #power-domain-cells\n", np->full_name);
+ pr_warn("%pOF lacks #power-domain-cells\n", np);
return;
}
diff --git a/drivers/clk/renesas/clk-rcar-gen2.c b/drivers/clk/renesas/clk-rcar-gen2.c
index 51a2479ed5d7..0b2e56d0d94b 100644
--- a/drivers/clk/renesas/clk-rcar-gen2.c
+++ b/drivers/clk/renesas/clk-rcar-gen2.c
@@ -407,8 +407,7 @@ static void __init rcar_gen2_cpg_clocks_init(struct device_node *np)
if (rcar_rst_read_mode_pins(&cpg_mode)) {
/* Backward-compatibility with old DT */
- pr_warn("%s: failed to obtain mode pins from RST\n",
- np->full_name);
+ pr_warn("%pOF: failed to obtain mode pins from RST\n", np);
cpg_mode = rcar_gen2_read_mode_pins();
}
diff --git a/drivers/clk/renesas/r8a7792-cpg-mssr.c b/drivers/clk/renesas/r8a7792-cpg-mssr.c
index a832b9b6f7b0..7f85bbf20bf7 100644
--- a/drivers/clk/renesas/r8a7792-cpg-mssr.c
+++ b/drivers/clk/renesas/r8a7792-cpg-mssr.c
@@ -118,6 +118,13 @@ static const struct mssr_mod_clk r8a7792_mod_clks[] __initconst = {
DEF_MOD("vin1", 810, R8A7792_CLK_ZG),
DEF_MOD("vin0", 811, R8A7792_CLK_ZG),
DEF_MOD("etheravb", 812, R8A7792_CLK_HP),
+ DEF_MOD("imr-lx3", 821, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-1", 822, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-0", 823, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-5", 825, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-4", 826, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-3", 827, R8A7792_CLK_ZG),
+ DEF_MOD("imr-lsx3-2", 828, R8A7792_CLK_ZG),
DEF_MOD("gyro-adc", 901, R8A7792_CLK_P),
DEF_MOD("gpio7", 904, R8A7792_CLK_CP),
DEF_MOD("gpio6", 905, R8A7792_CLK_CP),
diff --git a/drivers/clk/renesas/r8a7795-cpg-mssr.c b/drivers/clk/renesas/r8a7795-cpg-mssr.c
index c091a8e024b8..762b2f8824f1 100644
--- a/drivers/clk/renesas/r8a7795-cpg-mssr.c
+++ b/drivers/clk/renesas/r8a7795-cpg-mssr.c
@@ -305,23 +305,23 @@ static const unsigned int r8a7795_crit_mod_clks[] __initconst = {
(((md) & BIT(17)) >> 17))
static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
- /* EXTAL div PLL1 mult PLL3 mult */
- { 1, 192, 192, },
- { 1, 192, 128, },
- { 0, /* Prohibited setting */ },
- { 1, 192, 192, },
- { 1, 160, 160, },
- { 1, 160, 106, },
- { 0, /* Prohibited setting */ },
- { 1, 160, 160, },
- { 1, 128, 128, },
- { 1, 128, 84, },
- { 0, /* Prohibited setting */ },
- { 1, 128, 128, },
- { 2, 192, 192, },
- { 2, 192, 128, },
- { 0, /* Prohibited setting */ },
- { 2, 192, 192, },
+ /* EXTAL div PLL1 mult/div PLL3 mult/div */
+ { 1, 192, 1, 192, 1, },
+ { 1, 192, 1, 128, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 192, 1, 192, 1, },
+ { 1, 160, 1, 160, 1, },
+ { 1, 160, 1, 106, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 160, 1, 160, 1, },
+ { 1, 128, 1, 128, 1, },
+ { 1, 128, 1, 84, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 128, 1, 128, 1, },
+ { 2, 192, 1, 192, 1, },
+ { 2, 192, 1, 128, 1, },
+ { 0, /* Prohibited setting */ },
+ { 2, 192, 1, 192, 1, },
};
static const struct soc_device_attribute r8a7795es1[] __initconst = {
diff --git a/drivers/clk/renesas/r8a7796-cpg-mssr.c b/drivers/clk/renesas/r8a7796-cpg-mssr.c
index acc6d0f153e1..e5e7fb212288 100644
--- a/drivers/clk/renesas/r8a7796-cpg-mssr.c
+++ b/drivers/clk/renesas/r8a7796-cpg-mssr.c
@@ -138,6 +138,7 @@ static const struct mssr_mod_clk r8a7796_mod_clks[] __initconst = {
DEF_MOD("sdif0", 314, R8A7796_CLK_SD0),
DEF_MOD("pcie1", 318, R8A7796_CLK_S3D1),
DEF_MOD("pcie0", 319, R8A7796_CLK_S3D1),
+ DEF_MOD("usb3-if0", 328, R8A7796_CLK_S3D1),
DEF_MOD("usb-dmac0", 330, R8A7796_CLK_S3D1),
DEF_MOD("usb-dmac1", 331, R8A7796_CLK_S3D1),
DEF_MOD("rwdt", 402, R8A7796_CLK_R),
@@ -277,23 +278,23 @@ static const unsigned int r8a7796_crit_mod_clks[] __initconst = {
(((md) & BIT(17)) >> 17))
static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
- /* EXTAL div PLL1 mult PLL3 mult */
- { 1, 192, 192, },
- { 1, 192, 128, },
- { 0, /* Prohibited setting */ },
- { 1, 192, 192, },
- { 1, 160, 160, },
- { 1, 160, 106, },
- { 0, /* Prohibited setting */ },
- { 1, 160, 160, },
- { 1, 128, 128, },
- { 1, 128, 84, },
- { 0, /* Prohibited setting */ },
- { 1, 128, 128, },
- { 2, 192, 192, },
- { 2, 192, 128, },
- { 0, /* Prohibited setting */ },
- { 2, 192, 192, },
+ /* EXTAL div PLL1 mult/div PLL3 mult/div */
+ { 1, 192, 1, 192, 1, },
+ { 1, 192, 1, 128, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 192, 1, 192, 1, },
+ { 1, 160, 1, 160, 1, },
+ { 1, 160, 1, 106, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 160, 1, 160, 1, },
+ { 1, 128, 1, 128, 1, },
+ { 1, 128, 1, 84, 1, },
+ { 0, /* Prohibited setting */ },
+ { 1, 128, 1, 128, 1, },
+ { 2, 192, 1, 192, 1, },
+ { 2, 192, 1, 128, 1, },
+ { 0, /* Prohibited setting */ },
+ { 2, 192, 1, 192, 1, },
};
static int __init r8a7796_cpg_mssr_init(struct device *dev)
diff --git a/drivers/clk/renesas/r8a77995-cpg-mssr.c b/drivers/clk/renesas/r8a77995-cpg-mssr.c
new file mode 100644
index 000000000000..e594cf8ee63b
--- /dev/null
+++ b/drivers/clk/renesas/r8a77995-cpg-mssr.c
@@ -0,0 +1,236 @@
+/*
+ * r8a77995 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2017 Glider bvba
+ *
+ * Based on r8a7795-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/soc/renesas/rcar-rst.h>
+
+#include <dt-bindings/clock/r8a77995-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+enum clk_ids {
+ /* Core Clock Outputs exported to DT */
+ LAST_DT_CORE_CLK = R8A77995_CLK_CP,
+
+ /* External Input Clocks */
+ CLK_EXTAL,
+
+ /* Internal Core Clocks */
+ CLK_MAIN,
+ CLK_PLL0,
+ CLK_PLL1,
+ CLK_PLL3,
+ CLK_PLL0D2,
+ CLK_PLL0D3,
+ CLK_PLL0D5,
+ CLK_PLL1D2,
+ CLK_PE,
+ CLK_S0,
+ CLK_S1,
+ CLK_S2,
+ CLK_S3,
+ CLK_SDSRC,
+ CLK_SSPSRC,
+
+ /* Module Clocks */
+ MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
+ /* External Clock Inputs */
+ DEF_INPUT("extal", CLK_EXTAL),
+
+ /* Internal Core Clocks */
+ DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
+ DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
+ DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
+
+ DEF_FIXED(".pll0", CLK_PLL0, CLK_MAIN, 4, 250),
+ DEF_FIXED(".pll0d2", CLK_PLL0D2, CLK_PLL0, 2, 1),
+ DEF_FIXED(".pll0d3", CLK_PLL0D3, CLK_PLL0, 3, 1),
+ DEF_FIXED(".pll0d5", CLK_PLL0D5, CLK_PLL0, 5, 1),
+ DEF_FIXED(".pll1d2", CLK_PLL1D2, CLK_PLL1, 2, 1),
+ DEF_FIXED(".pe", CLK_PE, CLK_PLL0D3, 4, 1),
+ DEF_FIXED(".s0", CLK_S0, CLK_PLL1, 2, 1),
+ DEF_FIXED(".s1", CLK_S1, CLK_PLL1, 3, 1),
+ DEF_FIXED(".s2", CLK_S2, CLK_PLL1, 4, 1),
+ DEF_FIXED(".s3", CLK_S3, CLK_PLL1, 6, 1),
+ DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1, 2, 1),
+
+ /* Core Clock Outputs */
+ DEF_FIXED("z2", R8A77995_CLK_Z2, CLK_PLL0D3, 1, 1),
+ DEF_FIXED("ztr", R8A77995_CLK_ZTR, CLK_PLL1, 6, 1),
+ DEF_FIXED("zt", R8A77995_CLK_ZT, CLK_PLL1, 4, 1),
+ DEF_FIXED("zx", R8A77995_CLK_ZX, CLK_PLL1, 3, 1),
+ DEF_FIXED("s0d1", R8A77995_CLK_S0D1, CLK_S0, 1, 1),
+ DEF_FIXED("s1d1", R8A77995_CLK_S1D1, CLK_S1, 1, 1),
+ DEF_FIXED("s1d2", R8A77995_CLK_S1D2, CLK_S1, 2, 1),
+ DEF_FIXED("s1d4", R8A77995_CLK_S1D4, CLK_S1, 4, 1),
+ DEF_FIXED("s2d1", R8A77995_CLK_S2D1, CLK_S2, 1, 1),
+ DEF_FIXED("s2d2", R8A77995_CLK_S2D2, CLK_S2, 2, 1),
+ DEF_FIXED("s2d4", R8A77995_CLK_S2D4, CLK_S2, 4, 1),
+ DEF_FIXED("s3d1", R8A77995_CLK_S3D1, CLK_S3, 1, 1),
+ DEF_FIXED("s3d2", R8A77995_CLK_S3D2, CLK_S3, 2, 1),
+ DEF_FIXED("s3d4", R8A77995_CLK_S3D4, CLK_S3, 4, 1),
+
+ DEF_FIXED("cl", R8A77995_CLK_CL, CLK_PLL1, 48, 1),
+ DEF_FIXED("cp", R8A77995_CLK_CP, CLK_EXTAL, 2, 1),
+ DEF_FIXED("osc", R8A77995_CLK_OSC, CLK_EXTAL, 384, 1),
+ DEF_FIXED("r", R8A77995_CLK_R, CLK_EXTAL, 1536, 1),
+
+ DEF_GEN3_PE("s1d4c", R8A77995_CLK_S1D4C, CLK_S1, 4, CLK_PE, 2),
+ DEF_GEN3_PE("s3d1c", R8A77995_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1),
+ DEF_GEN3_PE("s3d2c", R8A77995_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2),
+ DEF_GEN3_PE("s3d4c", R8A77995_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4),
+
+ DEF_GEN3_SD("sd0", R8A77995_CLK_SD0, CLK_SDSRC, 0x268),
+
+ DEF_DIV6P1("canfd", R8A77995_CLK_CANFD, CLK_PLL0D3, 0x244),
+ DEF_DIV6P1("mso", R8A77995_CLK_MSO, CLK_PLL1D2, 0x014),
+};
+
+static const struct mssr_mod_clk r8a77995_mod_clks[] __initconst = {
+ DEF_MOD("scif5", 202, R8A77995_CLK_S3D4C),
+ DEF_MOD("scif4", 203, R8A77995_CLK_S3D4C),
+ DEF_MOD("scif3", 204, R8A77995_CLK_S3D4C),
+ DEF_MOD("scif1", 206, R8A77995_CLK_S3D4C),
+ DEF_MOD("scif0", 207, R8A77995_CLK_S3D4C),
+ DEF_MOD("msiof3", 208, R8A77995_CLK_MSO),
+ DEF_MOD("msiof2", 209, R8A77995_CLK_MSO),
+ DEF_MOD("msiof1", 210, R8A77995_CLK_MSO),
+ DEF_MOD("msiof0", 211, R8A77995_CLK_MSO),
+ DEF_MOD("sys-dmac2", 217, R8A77995_CLK_S3D1),
+ DEF_MOD("sys-dmac1", 218, R8A77995_CLK_S3D1),
+ DEF_MOD("sys-dmac0", 219, R8A77995_CLK_S3D1),
+ DEF_MOD("cmt3", 300, R8A77995_CLK_R),
+ DEF_MOD("cmt2", 301, R8A77995_CLK_R),
+ DEF_MOD("cmt1", 302, R8A77995_CLK_R),
+ DEF_MOD("cmt0", 303, R8A77995_CLK_R),
+ DEF_MOD("scif2", 310, R8A77995_CLK_S3D4C),
+ DEF_MOD("emmc0", 312, R8A77995_CLK_SD0),
+ DEF_MOD("usb-dmac0", 330, R8A77995_CLK_S3D1),
+ DEF_MOD("usb-dmac1", 331, R8A77995_CLK_S3D1),
+ DEF_MOD("rwdt", 402, R8A77995_CLK_R),
+ DEF_MOD("intc-ex", 407, R8A77995_CLK_CP),
+ DEF_MOD("intc-ap", 408, R8A77995_CLK_S3D1),
+ DEF_MOD("audmac0", 502, R8A77995_CLK_S3D1),
+ DEF_MOD("hscif3", 517, R8A77995_CLK_S3D1C),
+ DEF_MOD("hscif0", 520, R8A77995_CLK_S3D1C),
+ DEF_MOD("thermal", 522, R8A77995_CLK_CP),
+ DEF_MOD("pwm", 523, R8A77995_CLK_S3D4C),
+ DEF_MOD("fcpvd1", 602, R8A77995_CLK_S1D2),
+ DEF_MOD("fcpvd0", 603, R8A77995_CLK_S1D2),
+ DEF_MOD("fcpvbs", 607, R8A77995_CLK_S0D1),
+ DEF_MOD("vspd1", 622, R8A77995_CLK_S1D2),
+ DEF_MOD("vspd0", 623, R8A77995_CLK_S1D2),
+ DEF_MOD("vspbs", 627, R8A77995_CLK_S0D1),
+ DEF_MOD("ehci0", 703, R8A77995_CLK_S3D2),
+ DEF_MOD("hsusb", 704, R8A77995_CLK_S3D2),
+ DEF_MOD("du1", 723, R8A77995_CLK_S2D1),
+ DEF_MOD("du0", 724, R8A77995_CLK_S2D1),
+ DEF_MOD("lvds", 727, R8A77995_CLK_S2D1),
+ DEF_MOD("vin7", 804, R8A77995_CLK_S1D2),
+ DEF_MOD("vin6", 805, R8A77995_CLK_S1D2),
+ DEF_MOD("vin5", 806, R8A77995_CLK_S1D2),
+ DEF_MOD("vin4", 807, R8A77995_CLK_S1D2),
+ DEF_MOD("etheravb", 812, R8A77995_CLK_S3D2),
+ DEF_MOD("imr0", 823, R8A77995_CLK_S1D2),
+ DEF_MOD("gpio6", 906, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio5", 907, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio4", 908, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio3", 909, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio2", 910, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio1", 911, R8A77995_CLK_S3D4),
+ DEF_MOD("gpio0", 912, R8A77995_CLK_S3D4),
+ DEF_MOD("can-fd", 914, R8A77995_CLK_S3D2),
+ DEF_MOD("can-if1", 915, R8A77995_CLK_S3D4),
+ DEF_MOD("can-if0", 916, R8A77995_CLK_S3D4),
+ DEF_MOD("i2c3", 928, R8A77995_CLK_S3D2),
+ DEF_MOD("i2c2", 929, R8A77995_CLK_S3D2),
+ DEF_MOD("i2c1", 930, R8A77995_CLK_S3D2),
+ DEF_MOD("i2c0", 931, R8A77995_CLK_S3D2),
+ DEF_MOD("ssi-all", 1005, R8A77995_CLK_S3D4),
+ DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)),
+ DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)),
+ DEF_MOD("scu-all", 1017, R8A77995_CLK_S3D4),
+ DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)),
+ DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)),
+ DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)),
+ DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)),
+ DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)),
+ DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)),
+};
+
+static const unsigned int r8a77995_crit_mod_clks[] __initconst = {
+ MOD_CLK_ID(408), /* INTC-AP (GIC) */
+};
+
+
+/*
+ * CPG Clock Data
+ */
+
+/*
+ * MD19 EXTAL (MHz) PLL0 PLL1 PLL3
+ *--------------------------------------------------------------------
+ * 0 48 x 1 x250/4 x100/3 x100/3
+ * 1 48 x 1 x250/4 x100/3 x116/6
+ */
+#define CPG_PLL_CONFIG_INDEX(md) (((md) & BIT(19)) >> 19)
+
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[2] __initconst = {
+ /* EXTAL div PLL1 mult/div PLL3 mult/div */
+ { 1, 100, 3, 100, 3, },
+ { 1, 100, 3, 116, 6, },
+};
+
+static int __init r8a77995_cpg_mssr_init(struct device *dev)
+{
+ const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
+ u32 cpg_mode;
+ int error;
+
+ error = rcar_rst_read_mode_pins(&cpg_mode);
+ if (error)
+ return error;
+
+ cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+
+ return rcar_gen3_cpg_init(cpg_pll_config, 0, cpg_mode);
+}
+
+const struct cpg_mssr_info r8a77995_cpg_mssr_info __initconst = {
+ /* Core Clocks */
+ .core_clks = r8a77995_core_clks,
+ .num_core_clks = ARRAY_SIZE(r8a77995_core_clks),
+ .last_dt_core_clk = LAST_DT_CORE_CLK,
+ .num_total_core_clks = MOD_CLK_BASE,
+
+ /* Module Clocks */
+ .mod_clks = r8a77995_mod_clks,
+ .num_mod_clks = ARRAY_SIZE(r8a77995_mod_clks),
+ .num_hw_mod_clks = 12 * 32,
+
+ /* Critical Module Clocks */
+ .crit_mod_clks = r8a77995_crit_mod_clks,
+ .num_crit_mod_clks = ARRAY_SIZE(r8a77995_crit_mod_clks),
+
+ /* Callbacks */
+ .init = r8a77995_cpg_mssr_init,
+ .cpg_clk_register = rcar_gen3_cpg_clk_register,
+};
diff --git a/drivers/clk/renesas/rcar-gen3-cpg.c b/drivers/clk/renesas/rcar-gen3-cpg.c
index 3dee900522b7..951105816547 100644
--- a/drivers/clk/renesas/rcar-gen3-cpg.c
+++ b/drivers/clk/renesas/rcar-gen3-cpg.c
@@ -60,6 +60,7 @@ struct sd_clock {
unsigned int div_num;
unsigned int div_min;
unsigned int div_max;
+ unsigned int cur_div_idx;
};
/* SDn divider
@@ -96,21 +97,10 @@ static const struct sd_div_table cpg_sd_div_table[] = {
static int cpg_sd_clock_enable(struct clk_hw *hw)
{
struct sd_clock *clock = to_sd_clock(hw);
- u32 val, sd_fc;
- unsigned int i;
-
- val = readl(clock->reg);
-
- sd_fc = val & CPG_SD_FC_MASK;
- for (i = 0; i < clock->div_num; i++)
- if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
- break;
-
- if (i >= clock->div_num)
- return -EINVAL;
+ u32 val = readl(clock->reg);
val &= ~(CPG_SD_STP_MASK);
- val |= clock->div_table[i].val & CPG_SD_STP_MASK;
+ val |= clock->div_table[clock->cur_div_idx].val & CPG_SD_STP_MASK;
writel(val, clock->reg);
@@ -135,21 +125,9 @@ static unsigned long cpg_sd_clock_recalc_rate(struct clk_hw *hw,
unsigned long parent_rate)
{
struct sd_clock *clock = to_sd_clock(hw);
- unsigned long rate = parent_rate;
- u32 val, sd_fc;
- unsigned int i;
- val = readl(clock->reg);
-
- sd_fc = val & CPG_SD_FC_MASK;
- for (i = 0; i < clock->div_num; i++)
- if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
- break;
-
- if (i >= clock->div_num)
- return -EINVAL;
-
- return DIV_ROUND_CLOSEST(rate, clock->div_table[i].div);
+ return DIV_ROUND_CLOSEST(parent_rate,
+ clock->div_table[clock->cur_div_idx].div);
}
static unsigned int cpg_sd_clock_calc_div(struct sd_clock *clock,
@@ -190,6 +168,8 @@ static int cpg_sd_clock_set_rate(struct clk_hw *hw, unsigned long rate,
if (i >= clock->div_num)
return -EINVAL;
+ clock->cur_div_idx = i;
+
val = readl(clock->reg);
val &= ~(CPG_SD_STP_MASK | CPG_SD_FC_MASK);
val |= clock->div_table[i].val & (CPG_SD_STP_MASK | CPG_SD_FC_MASK);
@@ -215,6 +195,7 @@ static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
struct sd_clock *clock;
struct clk *clk;
unsigned int i;
+ u32 sd_fc;
clock = kzalloc(sizeof(*clock), GFP_KERNEL);
if (!clock)
@@ -231,6 +212,18 @@ static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
clock->div_table = cpg_sd_div_table;
clock->div_num = ARRAY_SIZE(cpg_sd_div_table);
+ sd_fc = readl(clock->reg) & CPG_SD_FC_MASK;
+ for (i = 0; i < clock->div_num; i++)
+ if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
+ break;
+
+ if (WARN_ON(i >= clock->div_num)) {
+ kfree(clock);
+ return ERR_PTR(-EINVAL);
+ }
+
+ clock->cur_div_idx = i;
+
clock->div_max = clock->div_table[0].div;
clock->div_min = clock->div_max;
for (i = 1; i < clock->div_num; i++) {
@@ -279,7 +272,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
unsigned int div = 1;
u32 value;
- parent = clks[core->parent];
+ parent = clks[core->parent & 0xffff]; /* CLK_TYPE_PE uses high bits */
if (IS_ERR(parent))
return ERR_CAST(parent);
@@ -303,6 +296,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
case CLK_TYPE_GEN3_PLL1:
mult = cpg_pll_config->pll1_mult;
+ div = cpg_pll_config->pll1_div;
break;
case CLK_TYPE_GEN3_PLL2:
@@ -320,6 +314,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
case CLK_TYPE_GEN3_PLL3:
mult = cpg_pll_config->pll3_mult;
+ div = cpg_pll_config->pll3_div;
break;
case CLK_TYPE_GEN3_PLL4:
@@ -360,6 +355,24 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
parent = clks[cpg_clk_extalr];
break;
+ case CLK_TYPE_GEN3_PE:
+ /*
+ * Peripheral clock with a fixed divider, selectable between
+ * clean and spread spectrum parents using MD12
+ */
+ if (cpg_mode & BIT(12)) {
+ /* Clean */
+ div = core->div & 0xffff;
+ } else {
+ /* SCCG */
+ parent = clks[core->parent >> 16];
+ if (IS_ERR(parent))
+ return ERR_CAST(parent);
+ div = core->div >> 16;
+ }
+ mult = 1;
+ break;
+
default:
return ERR_PTR(-EINVAL);
}
diff --git a/drivers/clk/renesas/rcar-gen3-cpg.h b/drivers/clk/renesas/rcar-gen3-cpg.h
index 073be54b5d03..d756ef8b78eb 100644
--- a/drivers/clk/renesas/rcar-gen3-cpg.h
+++ b/drivers/clk/renesas/rcar-gen3-cpg.h
@@ -20,15 +20,24 @@ enum rcar_gen3_clk_types {
CLK_TYPE_GEN3_PLL4,
CLK_TYPE_GEN3_SD,
CLK_TYPE_GEN3_R,
+ CLK_TYPE_GEN3_PE,
};
#define DEF_GEN3_SD(_name, _id, _parent, _offset) \
DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
+#define DEF_GEN3_PE(_name, _id, _parent_sscg, _div_sscg, _parent_clean, \
+ _div_clean) \
+ DEF_BASE(_name, _id, CLK_TYPE_GEN3_PE, \
+ (_parent_sscg) << 16 | (_parent_clean), \
+ .div = (_div_sscg) << 16 | (_div_clean))
+
struct rcar_gen3_cpg_pll_config {
- unsigned int extal_div;
- unsigned int pll1_mult;
- unsigned int pll3_mult;
+ u8 extal_div;
+ u8 pll1_mult;
+ u8 pll1_div;
+ u8 pll3_mult;
+ u8 pll3_div;
};
#define CPG_RCKCR 0x240
diff --git a/drivers/clk/renesas/rcar-usb2-clock-sel.c b/drivers/clk/renesas/rcar-usb2-clock-sel.c
new file mode 100644
index 000000000000..6cd030a58964
--- /dev/null
+++ b/drivers/clk/renesas/rcar-usb2-clock-sel.c
@@ -0,0 +1,188 @@
+/*
+ * Renesas R-Car USB2.0 clock selector
+ *
+ * Copyright (C) 2017 Renesas Electronics Corp.
+ *
+ * Based on renesas-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/pm_runtime.h>
+#include <linux/slab.h>
+
+#define USB20_CLKSET0 0x00
+#define CLKSET0_INTCLK_EN BIT(11)
+#define CLKSET0_PRIVATE BIT(0)
+#define CLKSET0_EXTAL_ONLY (CLKSET0_INTCLK_EN | CLKSET0_PRIVATE)
+
+struct usb2_clock_sel_priv {
+ void __iomem *base;
+ struct clk_hw hw;
+ bool extal;
+ bool xtal;
+};
+#define to_priv(_hw) container_of(_hw, struct usb2_clock_sel_priv, hw)
+
+static void usb2_clock_sel_enable_extal_only(struct usb2_clock_sel_priv *priv)
+{
+ u16 val = readw(priv->base + USB20_CLKSET0);
+
+ pr_debug("%s: enter %d %d %x\n", __func__,
+ priv->extal, priv->xtal, val);
+
+ if (priv->extal && !priv->xtal && val != CLKSET0_EXTAL_ONLY)
+ writew(CLKSET0_EXTAL_ONLY, priv->base + USB20_CLKSET0);
+}
+
+static void usb2_clock_sel_disable_extal_only(struct usb2_clock_sel_priv *priv)
+{
+ if (priv->extal && !priv->xtal)
+ writew(CLKSET0_PRIVATE, priv->base + USB20_CLKSET0);
+}
+
+static int usb2_clock_sel_enable(struct clk_hw *hw)
+{
+ usb2_clock_sel_enable_extal_only(to_priv(hw));
+
+ return 0;
+}
+
+static void usb2_clock_sel_disable(struct clk_hw *hw)
+{
+ usb2_clock_sel_disable_extal_only(to_priv(hw));
+}
+
+/*
+ * This module seems a mux, but this driver assumes a gate because
+ * ehci/ohci platform drivers don't support clk_set_parent() for now.
+ * If this driver acts as a gate, ehci/ohci-platform drivers don't need
+ * any modification.
+ */
+static const struct clk_ops usb2_clock_sel_clock_ops = {
+ .enable = usb2_clock_sel_enable,
+ .disable = usb2_clock_sel_disable,
+};
+
+static const struct of_device_id rcar_usb2_clock_sel_match[] = {
+ { .compatible = "renesas,rcar-gen3-usb2-clock-sel" },
+ { }
+};
+
+static int rcar_usb2_clock_sel_suspend(struct device *dev)
+{
+ struct usb2_clock_sel_priv *priv = dev_get_drvdata(dev);
+
+ usb2_clock_sel_disable_extal_only(priv);
+ pm_runtime_put(dev);
+
+ return 0;
+}
+
+static int rcar_usb2_clock_sel_resume(struct device *dev)
+{
+ struct usb2_clock_sel_priv *priv = dev_get_drvdata(dev);
+
+ pm_runtime_get_sync(dev);
+ usb2_clock_sel_enable_extal_only(priv);
+
+ return 0;
+}
+
+static int rcar_usb2_clock_sel_remove(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct usb2_clock_sel_priv *priv = platform_get_drvdata(pdev);
+
+ of_clk_del_provider(dev->of_node);
+ clk_hw_unregister(&priv->hw);
+ pm_runtime_put(dev);
+ pm_runtime_disable(dev);
+
+ return 0;
+}
+
+static int rcar_usb2_clock_sel_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ struct usb2_clock_sel_priv *priv;
+ struct resource *res;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ priv->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(priv->base))
+ return PTR_ERR(priv->base);
+
+ pm_runtime_enable(dev);
+ pm_runtime_get_sync(dev);
+
+ clk = devm_clk_get(dev, "usb_extal");
+ if (!IS_ERR(clk) && !clk_prepare_enable(clk)) {
+ priv->extal = !!clk_get_rate(clk);
+ clk_disable_unprepare(clk);
+ }
+ clk = devm_clk_get(dev, "usb_xtal");
+ if (!IS_ERR(clk) && !clk_prepare_enable(clk)) {
+ priv->xtal = !!clk_get_rate(clk);
+ clk_disable_unprepare(clk);
+ }
+
+ if (!priv->extal && !priv->xtal) {
+ dev_err(dev, "This driver needs usb_extal or usb_xtal\n");
+ return -ENOENT;
+ }
+
+ platform_set_drvdata(pdev, priv);
+ dev_set_drvdata(dev, priv);
+
+ init.name = "rcar_usb2_clock_sel";
+ init.ops = &usb2_clock_sel_clock_ops;
+ init.flags = 0;
+ init.parent_names = NULL;
+ init.num_parents = 0;
+ priv->hw.init = &init;
+
+ clk = clk_register(NULL, &priv->hw);
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+ return of_clk_add_hw_provider(np, of_clk_hw_simple_get, &priv->hw);
+}
+
+static const struct dev_pm_ops rcar_usb2_clock_sel_pm_ops = {
+ .suspend = rcar_usb2_clock_sel_suspend,
+ .resume = rcar_usb2_clock_sel_resume,
+};
+
+static struct platform_driver rcar_usb2_clock_sel_driver = {
+ .driver = {
+ .name = "rcar-usb2-clock-sel",
+ .of_match_table = rcar_usb2_clock_sel_match,
+ .pm = &rcar_usb2_clock_sel_pm_ops,
+ },
+ .probe = rcar_usb2_clock_sel_probe,
+ .remove = rcar_usb2_clock_sel_remove,
+};
+builtin_platform_driver(rcar_usb2_clock_sel_driver);
+
+MODULE_DESCRIPTION("Renesas R-Car USB2 clock selector Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c
index 1f607c806f9b..e580a5e6346c 100644
--- a/drivers/clk/renesas/renesas-cpg-mssr.c
+++ b/drivers/clk/renesas/renesas-cpg-mssr.c
@@ -680,6 +680,12 @@ static const struct of_device_id cpg_mssr_match[] = {
.data = &r8a7796_cpg_mssr_info,
},
#endif
+#ifdef CONFIG_CLK_R8A77995
+ {
+ .compatible = "renesas,r8a77995-cpg-mssr",
+ .data = &r8a77995_cpg_mssr_info,
+ },
+#endif
{ /* sentinel */ }
};
diff --git a/drivers/clk/renesas/renesas-cpg-mssr.h b/drivers/clk/renesas/renesas-cpg-mssr.h
index 43d7c7f6832d..94b9071d1061 100644
--- a/drivers/clk/renesas/renesas-cpg-mssr.h
+++ b/drivers/clk/renesas/renesas-cpg-mssr.h
@@ -138,6 +138,7 @@ extern const struct cpg_mssr_info r8a7792_cpg_mssr_info;
extern const struct cpg_mssr_info r8a7794_cpg_mssr_info;
extern const struct cpg_mssr_info r8a7795_cpg_mssr_info;
extern const struct cpg_mssr_info r8a7796_cpg_mssr_info;
+extern const struct cpg_mssr_info r8a77995_cpg_mssr_info;
/*
diff --git a/drivers/clk/rockchip/clk-rk3128.c b/drivers/clk/rockchip/clk-rk3128.c
index e243f2eae68f..62d7854e4b87 100644
--- a/drivers/clk/rockchip/clk-rk3128.c
+++ b/drivers/clk/rockchip/clk-rk3128.c
@@ -201,7 +201,7 @@ static struct rockchip_clk_branch rk3128_uart2_fracmux __initdata =
MUX(SCLK_UART2, "sclk_uart2", mux_uart2_p, CLK_SET_RATE_PARENT,
RK2928_CLKSEL_CON(15), 8, 2, MFLAGS);
-static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
+static struct rockchip_clk_branch common_clk_branches[] __initdata = {
/*
* Clock-Architecture Diagram 1
*/
@@ -459,10 +459,6 @@ static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
RK2928_CLKSEL_CON(2), 14, 2, MFLAGS, 8, 5, DFLAGS,
RK2928_CLKGATE_CON(10), 15, GFLAGS),
- COMPOSITE(SCLK_SFC, "sclk_sfc", mux_sclk_sfc_src_p, 0,
- RK2928_CLKSEL_CON(11), 14, 2, MFLAGS, 8, 5, DFLAGS,
- RK2928_CLKGATE_CON(3), 15, GFLAGS),
-
COMPOSITE_NOMUX(PCLK_PMU_PRE, "pclk_pmu_pre", "cpll", 0,
RK2928_CLKSEL_CON(29), 8, 6, DFLAGS,
RK2928_CLKGATE_CON(1), 0, GFLAGS),
@@ -495,7 +491,6 @@ static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
GATE(ACLK_DMAC, "aclk_dmac", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 1, GFLAGS),
GATE(0, "aclk_peri_niu", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 15, GFLAGS),
GATE(0, "aclk_cpu_to_peri", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 2, GFLAGS),
- GATE(HCLK_GPS, "hclk_gps", "aclk_peri", 0, RK2928_CLKGATE_CON(3), 14, GFLAGS),
GATE(HCLK_I2S_8CH, "hclk_i2s_8ch", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS),
GATE(0, "hclk_peri_matrix", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 0, GFLAGS),
@@ -541,7 +536,6 @@ static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
GATE(0, "hclk_rom", "hclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 6, GFLAGS),
GATE(HCLK_CRYPTO, "hclk_crypto", "hclk_cpu", 0, RK2928_CLKGATE_CON(3), 5, GFLAGS),
- GATE(PCLK_HDMI, "pclk_hdmi", "pclk_cpu", 0, RK2928_CLKGATE_CON(3), 8, GFLAGS),
GATE(PCLK_ACODEC, "pclk_acodec", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 14, GFLAGS),
GATE(0, "pclk_ddrupctl", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 7, GFLAGS),
GATE(0, "pclk_grf", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 4, GFLAGS),
@@ -561,6 +555,21 @@ static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "sclk_emmc", RK3228_EMMC_CON1, 0),
};
+static struct rockchip_clk_branch rk3126_clk_branches[] __initdata = {
+ GATE(0, "pclk_stimer", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 15, GFLAGS),
+ GATE(0, "pclk_s_efuse", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 14, GFLAGS),
+ GATE(0, "pclk_sgrf", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 8, GFLAGS),
+};
+
+static struct rockchip_clk_branch rk3128_clk_branches[] __initdata = {
+ COMPOSITE(SCLK_SFC, "sclk_sfc", mux_sclk_sfc_src_p, 0,
+ RK2928_CLKSEL_CON(11), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RK2928_CLKGATE_CON(3), 15, GFLAGS),
+
+ GATE(HCLK_GPS, "hclk_gps", "aclk_peri", 0, RK2928_CLKGATE_CON(3), 14, GFLAGS),
+ GATE(PCLK_HDMI, "pclk_hdmi", "pclk_cpu", 0, RK2928_CLKGATE_CON(3), 8, GFLAGS),
+};
+
static const char *const rk3128_critical_clocks[] __initconst = {
"aclk_cpu",
"hclk_cpu",
@@ -570,7 +579,7 @@ static const char *const rk3128_critical_clocks[] __initconst = {
"pclk_peri",
};
-static void __init rk3128_clk_init(struct device_node *np)
+static struct rockchip_clk_provider *__init rk3128_common_clk_init(struct device_node *np)
{
struct rockchip_clk_provider *ctx;
void __iomem *reg_base;
@@ -578,23 +587,21 @@ static void __init rk3128_clk_init(struct device_node *np)
reg_base = of_iomap(np, 0);
if (!reg_base) {
pr_err("%s: could not map cru region\n", __func__);
- return;
+ return ERR_PTR(-ENOMEM);
}
ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
if (IS_ERR(ctx)) {
pr_err("%s: rockchip clk init failed\n", __func__);
iounmap(reg_base);
- return;
+ return ERR_PTR(-ENOMEM);
}
rockchip_clk_register_plls(ctx, rk3128_pll_clks,
ARRAY_SIZE(rk3128_pll_clks),
RK3128_GRF_SOC_STATUS0);
- rockchip_clk_register_branches(ctx, rk3128_clk_branches,
- ARRAY_SIZE(rk3128_clk_branches));
- rockchip_clk_protect_critical(rk3128_critical_clocks,
- ARRAY_SIZE(rk3128_critical_clocks));
+ rockchip_clk_register_branches(ctx, common_clk_branches,
+ ARRAY_SIZE(common_clk_branches));
rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
mux_armclk_p, ARRAY_SIZE(mux_armclk_p),
@@ -606,6 +613,40 @@ static void __init rk3128_clk_init(struct device_node *np)
rockchip_register_restart_notifier(ctx, RK2928_GLB_SRST_FST, NULL);
+ return ctx;
+}
+
+static void __init rk3126_clk_init(struct device_node *np)
+{
+ struct rockchip_clk_provider *ctx;
+
+ ctx = rk3128_common_clk_init(np);
+ if (IS_ERR(ctx))
+ return;
+
+ rockchip_clk_register_branches(ctx, rk3126_clk_branches,
+ ARRAY_SIZE(rk3126_clk_branches));
+ rockchip_clk_protect_critical(rk3128_critical_clocks,
+ ARRAY_SIZE(rk3128_critical_clocks));
+
+ rockchip_clk_of_add_provider(np, ctx);
+}
+
+CLK_OF_DECLARE(rk3126_cru, "rockchip,rk3126-cru", rk3126_clk_init);
+
+static void __init rk3128_clk_init(struct device_node *np)
+{
+ struct rockchip_clk_provider *ctx;
+
+ ctx = rk3128_common_clk_init(np);
+ if (IS_ERR(ctx))
+ return;
+
+ rockchip_clk_register_branches(ctx, rk3128_clk_branches,
+ ARRAY_SIZE(rk3128_clk_branches));
+ rockchip_clk_protect_critical(rk3128_critical_clocks,
+ ARRAY_SIZE(rk3128_critical_clocks));
+
rockchip_clk_of_add_provider(np, ctx);
}
diff --git a/drivers/clk/rockchip/clk-rk3228.c b/drivers/clk/rockchip/clk-rk3228.c
index bb405d9044a3..11e7f2d1c054 100644
--- a/drivers/clk/rockchip/clk-rk3228.c
+++ b/drivers/clk/rockchip/clk-rk3228.c
@@ -391,7 +391,7 @@ static struct rockchip_clk_branch rk3228_clk_branches[] __initdata = {
RK2928_CLKSEL_CON(11), 8, 2, MFLAGS, 0, 8, DFLAGS,
RK2928_CLKGATE_CON(2), 11, GFLAGS),
- COMPOSITE_NODIV(0, "sclk_sdio_src", mux_mmc_src_p, 0,
+ COMPOSITE_NODIV(SCLK_SDIO_SRC, "sclk_sdio_src", mux_mmc_src_p, 0,
RK2928_CLKSEL_CON(11), 10, 2, MFLAGS,
RK2928_CLKGATE_CON(2), 13, GFLAGS),
DIV(SCLK_SDIO, "sclk_sdio", "sclk_sdio_src", 0,
diff --git a/drivers/clk/rockchip/clk-rv1108.c b/drivers/clk/rockchip/clk-rv1108.c
index 7c05ab366348..089cb17925e5 100644
--- a/drivers/clk/rockchip/clk-rv1108.c
+++ b/drivers/clk/rockchip/clk-rv1108.c
@@ -93,9 +93,24 @@ static struct rockchip_pll_rate_table rv1108_pll_rates[] = {
}
static struct rockchip_cpuclk_rate_table rv1108_cpuclk_rates[] __initdata = {
- RV1108_CPUCLK_RATE(816000000, 4),
- RV1108_CPUCLK_RATE(600000000, 4),
- RV1108_CPUCLK_RATE(312000000, 4),
+ RV1108_CPUCLK_RATE(1608000000, 7),
+ RV1108_CPUCLK_RATE(1512000000, 7),
+ RV1108_CPUCLK_RATE(1488000000, 5),
+ RV1108_CPUCLK_RATE(1416000000, 5),
+ RV1108_CPUCLK_RATE(1392000000, 5),
+ RV1108_CPUCLK_RATE(1296000000, 5),
+ RV1108_CPUCLK_RATE(1200000000, 5),
+ RV1108_CPUCLK_RATE(1104000000, 5),
+ RV1108_CPUCLK_RATE(1008000000, 5),
+ RV1108_CPUCLK_RATE(912000000, 5),
+ RV1108_CPUCLK_RATE(816000000, 3),
+ RV1108_CPUCLK_RATE(696000000, 3),
+ RV1108_CPUCLK_RATE(600000000, 3),
+ RV1108_CPUCLK_RATE(500000000, 3),
+ RV1108_CPUCLK_RATE(408000000, 1),
+ RV1108_CPUCLK_RATE(312000000, 1),
+ RV1108_CPUCLK_RATE(216000000, 1),
+ RV1108_CPUCLK_RATE(96000000, 1),
};
static const struct rockchip_cpuclk_reg_data rv1108_cpuclk_data = {
@@ -105,7 +120,7 @@ static const struct rockchip_cpuclk_reg_data rv1108_cpuclk_data = {
.mux_core_alt = 1,
.mux_core_main = 0,
.mux_core_shift = 8,
- .mux_core_mask = 0x1,
+ .mux_core_mask = 0x3,
};
PNAME(mux_pll_p) = { "xin24m", "xin24m"};
@@ -114,30 +129,42 @@ PNAME(mux_armclk_p) = { "apll_core", "gpll_core", "dpll_core" };
PNAME(mux_usb480m_pre_p) = { "usbphy", "xin24m" };
PNAME(mux_hdmiphy_phy_p) = { "hdmiphy", "xin24m" };
PNAME(mux_dclk_hdmiphy_pre_p) = { "dclk_hdmiphy_src_gpll", "dclk_hdmiphy_src_dpll" };
-PNAME(mux_pll_src_4plls_p) = { "dpll", "hdmiphy", "gpll", "usb480m" };
+PNAME(mux_pll_src_4plls_p) = { "dpll", "gpll", "hdmiphy", "usb480m" };
PNAME(mux_pll_src_3plls_p) = { "apll", "gpll", "dpll" };
PNAME(mux_pll_src_2plls_p) = { "dpll", "gpll" };
PNAME(mux_pll_src_apll_gpll_p) = { "apll", "gpll" };
-PNAME(mux_aclk_peri_src_p) = { "aclk_peri_src_dpll", "aclk_peri_src_gpll" };
+PNAME(mux_aclk_peri_src_p) = { "aclk_peri_src_gpll", "aclk_peri_src_dpll" };
PNAME(mux_aclk_bus_src_p) = { "aclk_bus_src_gpll", "aclk_bus_src_apll", "aclk_bus_src_dpll" };
PNAME(mux_mmc_src_p) = { "dpll", "gpll", "xin24m", "usb480m" };
PNAME(mux_pll_src_dpll_gpll_usb480m_p) = { "dpll", "gpll", "usb480m" };
PNAME(mux_uart0_p) = { "uart0_src", "uart0_frac", "xin24m" };
PNAME(mux_uart1_p) = { "uart1_src", "uart1_frac", "xin24m" };
PNAME(mux_uart2_p) = { "uart2_src", "uart2_frac", "xin24m" };
-PNAME(mux_sclk_macphy_p) = { "sclk_macphy_pre", "ext_gmac" };
+PNAME(mux_sclk_mac_p) = { "sclk_mac_pre", "ext_gmac" };
PNAME(mux_i2s0_pre_p) = { "i2s0_src", "i2s0_frac", "ext_i2s", "xin12m" };
PNAME(mux_i2s_out_p) = { "i2s0_pre", "xin12m" };
-PNAME(mux_i2s1_p) = { "i2s1_src", "i2s1_frac", "xin12m" };
-PNAME(mux_i2s2_p) = { "i2s2_src", "i2s2_frac", "xin12m" };
+PNAME(mux_i2s1_p) = { "i2s1_src", "i2s1_frac", "dummy", "xin12m" };
+PNAME(mux_i2s2_p) = { "i2s2_src", "i2s2_frac", "dummy", "xin12m" };
+PNAME(mux_wifi_src_p) = { "gpll", "xin24m" };
+PNAME(mux_cifout_src_p) = { "hdmiphy", "gpll" };
+PNAME(mux_cifout_p) = { "sclk_cifout_src", "xin24m" };
+PNAME(mux_sclk_cif0_src_p) = { "pclk_vip", "clk_cif0_chn_out", "pclkin_cvbs2cif" };
+PNAME(mux_sclk_cif1_src_p) = { "pclk_vip", "clk_cif1_chn_out", "pclkin_cvbs2cif" };
+PNAME(mux_sclk_cif2_src_p) = { "pclk_vip", "clk_cif2_chn_out", "pclkin_cvbs2cif" };
+PNAME(mux_sclk_cif3_src_p) = { "pclk_vip", "clk_cif3_chn_out", "pclkin_cvbs2cif" };
+PNAME(mux_dsp_src_p) = { "dpll", "gpll", "apll", "usb480m" };
+PNAME(mux_dclk_hdmiphy_p) = { "hdmiphy", "xin24m" };
+PNAME(mux_dclk_vop_p) = { "dclk_hdmiphy", "dclk_vop_src" };
+PNAME(mux_hdmi_cec_src_p) = { "dpll", "gpll", "xin24m" };
+PNAME(mux_cvbs_src_p) = { "apll", "io_cvbs_clkin", "hdmiphy", "gpll" };
static struct rockchip_pll_clock rv1108_pll_clks[] __initdata = {
[apll] = PLL(pll_rk3399, PLL_APLL, "apll", mux_pll_p, 0, RV1108_PLL_CON(0),
- RV1108_PLL_CON(3), 8, 31, 0, rv1108_pll_rates),
+ RV1108_PLL_CON(3), 8, 0, 0, rv1108_pll_rates),
[dpll] = PLL(pll_rk3399, PLL_DPLL, "dpll", mux_pll_p, 0, RV1108_PLL_CON(8),
- RV1108_PLL_CON(11), 8, 31, 0, NULL),
+ RV1108_PLL_CON(11), 8, 1, 0, NULL),
[gpll] = PLL(pll_rk3399, PLL_GPLL, "gpll", mux_pll_p, 0, RV1108_PLL_CON(16),
- RV1108_PLL_CON(19), 8, 31, ROCKCHIP_PLL_SYNC_RATE, rv1108_pll_rates),
+ RV1108_PLL_CON(19), 8, 2, 0, rv1108_pll_rates),
};
#define MFLAGS CLK_MUX_HIWORD_MASK
@@ -170,10 +197,10 @@ static struct rockchip_clk_branch rv1108_i2s2_fracmux __initdata =
RV1108_CLKSEL_CON(7), 12, 2, MFLAGS);
static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
- MUX(0, "hdmi_phy", mux_hdmiphy_phy_p, CLK_SET_RATE_PARENT,
- RV1108_MISC_CON, 13, 2, MFLAGS),
+ MUX(0, "hdmiphy", mux_hdmiphy_phy_p, CLK_SET_RATE_PARENT,
+ RV1108_MISC_CON, 13, 1, MFLAGS),
MUX(0, "usb480m", mux_usb480m_pre_p, CLK_SET_RATE_PARENT,
- RV1108_MISC_CON, 15, 2, MFLAGS),
+ RV1108_MISC_CON, 15, 1, MFLAGS),
/*
* Clock-Architecture Diagram 2
*/
@@ -197,50 +224,212 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKGATE_CON(11), 1, GFLAGS),
/* PD_RKVENC */
+ COMPOSITE(0, "aclk_rkvenc_pre", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(37), 6, 2, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 8, GFLAGS),
+ FACTOR_GATE(0, "hclk_rkvenc_pre", "aclk_rkvenc_pre", 0, 1, 4,
+ RV1108_CLKGATE_CON(8), 10, GFLAGS),
+ COMPOSITE(SCLK_VENC_CORE, "clk_venc_core", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(37), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 9, GFLAGS),
+ GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_pre", 0,
+ RV1108_CLKGATE_CON(19), 8, GFLAGS),
+ GATE(HCLK_RKVENC, "hclk_rkvenc", "hclk_rkvenc_pre", 0,
+ RV1108_CLKGATE_CON(19), 9, GFLAGS),
+ GATE(0, "aclk_rkvenc_niu", "aclk_rkvenc_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(19), 11, GFLAGS),
+ GATE(0, "hclk_rkvenc_niu", "hclk_rkvenc_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(19), 10, GFLAGS),
/* PD_RKVDEC */
+ COMPOSITE(SCLK_HEVC_CORE, "sclk_hevc_core", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(36), 6, 2, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 2, GFLAGS),
+ FACTOR_GATE(0, "hclk_rkvdec_pre", "sclk_hevc_core", 0, 1, 4,
+ RV1108_CLKGATE_CON(8), 10, GFLAGS),
+ COMPOSITE(SCLK_HEVC_CABAC, "clk_hevc_cabac", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(35), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 1, GFLAGS),
+
+ COMPOSITE(0, "aclk_rkvdec_pre", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(35), 6, 2, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 0, GFLAGS),
+ COMPOSITE(0, "aclk_vpu_pre", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(36), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(8), 3, GFLAGS),
+ GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pre", 0,
+ RV1108_CLKGATE_CON(19), 0, GFLAGS),
+ GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_pre", 0,
+ RV1108_CLKGATE_CON(19), 1, GFLAGS),
+ GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_pre", 0,
+ RV1108_CLKGATE_CON(19), 2, GFLAGS),
+ GATE(HCLK_VPU, "hclk_vpu", "hclk_rkvdec_pre", 0,
+ RV1108_CLKGATE_CON(19), 3, GFLAGS),
+ GATE(0, "aclk_rkvdec_niu", "aclk_rkvdec_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(19), 4, GFLAGS),
+ GATE(0, "hclk_rkvdec_niu", "hclk_rkvdec_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(19), 5, GFLAGS),
+ GATE(0, "aclk_vpu_niu", "aclk_vpu_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(19), 6, GFLAGS),
/* PD_PMU_wrapper */
COMPOSITE_NOMUX(0, "pmu_24m_ena", "gpll", CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(38), 0, 5, DFLAGS,
RV1108_CLKGATE_CON(8), 12, GFLAGS),
- GATE(0, "pmu", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_pmu", "pmu_24m_ena", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(10), 0, GFLAGS),
- GATE(0, "intmem1", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_intmem1", "pmu_24m_ena", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(10), 1, GFLAGS),
- GATE(0, "gpio0_pmu", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(PCLK_GPIO0_PMU, "pclk_gpio0_pmu", "pmu_24m_ena", 0,
RV1108_CLKGATE_CON(10), 2, GFLAGS),
- GATE(0, "pmugrf", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_pmugrf", "pmu_24m_ena", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(10), 3, GFLAGS),
- GATE(0, "pmu_noc", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_pmu_niu", "pmu_24m_ena", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(10), 4, GFLAGS),
- GATE(0, "i2c0_pmu_pclk", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(PCLK_I2C0_PMU, "pclk_i2c0_pmu", "pmu_24m_ena", 0,
RV1108_CLKGATE_CON(10), 5, GFLAGS),
- GATE(0, "pwm0_pmu_pclk", "pmu_24m_ena", CLK_IGNORE_UNUSED,
+ GATE(PCLK_PWM0_PMU, "pclk_pwm0_pmu", "pmu_24m_ena", 0,
RV1108_CLKGATE_CON(10), 6, GFLAGS),
- COMPOSITE(0, "pwm0_pmu_clk", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(SCLK_PWM0_PMU, "sclk_pwm0_pmu", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(12), 7, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(8), 15, GFLAGS),
- COMPOSITE(0, "i2c0_pmu_clk", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(SCLK_I2C0_PMU, "sclk_i2c0_pmu", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(19), 7, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(8), 14, GFLAGS),
GATE(0, "pvtm_pmu", "xin24m", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(8), 13, GFLAGS),
/*
+ * Clock-Architecture Diagram 3
+ */
+ COMPOSITE(SCLK_WIFI, "sclk_wifi", mux_wifi_src_p, 0,
+ RV1108_CLKSEL_CON(28), 15, 1, MFLAGS, 8, 6, DFLAGS,
+ RV1108_CLKGATE_CON(9), 8, GFLAGS),
+ COMPOSITE_NODIV(0, "sclk_cifout_src", mux_cifout_src_p, 0,
+ RV1108_CLKSEL_CON(40), 8, 1, MFLAGS,
+ RV1108_CLKGATE_CON(9), 11, GFLAGS),
+ COMPOSITE_NOGATE(SCLK_CIFOUT, "sclk_cifout", mux_cifout_p, 0,
+ RV1108_CLKSEL_CON(40), 12, 1, MFLAGS, 0, 5, DFLAGS),
+ COMPOSITE_NOMUX(SCLK_MIPI_CSI_OUT, "sclk_mipi_csi_out", "xin24m", 0,
+ RV1108_CLKSEL_CON(41), 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 12, GFLAGS),
+
+ GATE(0, "pclk_acodecphy", "pclk_top_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 6, GFLAGS),
+ GATE(0, "pclk_usbgrf", "pclk_top_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 14, GFLAGS),
+
+ GATE(ACLK_CIF0, "aclk_cif0", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(18), 10, GFLAGS),
+ GATE(HCLK_CIF0, "hclk_cif0", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 10, GFLAGS),
+ COMPOSITE_NODIV(SCLK_CIF0, "sclk_cif0", mux_sclk_cif0_src_p, 0,
+ RV1108_CLKSEL_CON(31), 0, 2, MFLAGS,
+ RV1108_CLKGATE_CON(7), 9, GFLAGS),
+ GATE(ACLK_CIF1, "aclk_cif1", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(17), 6, GFLAGS),
+ GATE(HCLK_CIF1, "hclk_cif1", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(17), 7, GFLAGS),
+ COMPOSITE_NODIV(SCLK_CIF1, "sclk_cif1", mux_sclk_cif1_src_p, 0,
+ RV1108_CLKSEL_CON(31), 2, 2, MFLAGS,
+ RV1108_CLKGATE_CON(7), 10, GFLAGS),
+ GATE(ACLK_CIF2, "aclk_cif2", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(17), 8, GFLAGS),
+ GATE(HCLK_CIF2, "hclk_cif2", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(17), 9, GFLAGS),
+ COMPOSITE_NODIV(SCLK_CIF2, "sclk_cif2", mux_sclk_cif2_src_p, 0,
+ RV1108_CLKSEL_CON(31), 4, 2, MFLAGS,
+ RV1108_CLKGATE_CON(7), 11, GFLAGS),
+ GATE(ACLK_CIF3, "aclk_cif3", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(17), 10, GFLAGS),
+ GATE(HCLK_CIF3, "hclk_cif3", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(17), 11, GFLAGS),
+ COMPOSITE_NODIV(SCLK_CIF3, "sclk_cif3", mux_sclk_cif3_src_p, 0,
+ RV1108_CLKSEL_CON(31), 6, 2, MFLAGS,
+ RV1108_CLKGATE_CON(7), 12, GFLAGS),
+ GATE(0, "pclk_cif1to4", "pclk_vip", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(7), 8, GFLAGS),
+
+ /* PD_DSP_wrapper */
+ COMPOSITE(SCLK_DSP, "sclk_dsp", mux_dsp_src_p, 0,
+ RV1108_CLKSEL_CON(42), 8, 2, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 0, GFLAGS),
+ GATE(0, "clk_dsp_sys_wd", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 0, GFLAGS),
+ GATE(0, "clk_dsp_epp_wd", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 1, GFLAGS),
+ GATE(0, "clk_dsp_edp_wd", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 2, GFLAGS),
+ GATE(0, "clk_dsp_iop_wd", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 3, GFLAGS),
+ GATE(0, "clk_dsp_free", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 13, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_DSP_IOP, "sclk_dsp_iop", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(44), 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 1, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_DSP_EPP, "sclk_dsp_epp", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(44), 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 2, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_DSP_EDP, "sclk_dsp_edp", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(45), 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 3, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_DSP_EDAP, "sclk_dsp_edap", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(45), 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 4, GFLAGS),
+ GATE(0, "pclk_dsp_iop_niu", "sclk_dsp_iop", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 4, GFLAGS),
+ GATE(0, "aclk_dsp_epp_niu", "sclk_dsp_epp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 5, GFLAGS),
+ GATE(0, "aclk_dsp_edp_niu", "sclk_dsp_edp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 6, GFLAGS),
+ GATE(0, "pclk_dsp_dbg_niu", "sclk_dsp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 7, GFLAGS),
+ GATE(0, "aclk_dsp_edap_niu", "sclk_dsp_edap", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 14, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_DSP_PFM, "sclk_dsp_pfm", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(43), 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 5, GFLAGS),
+ COMPOSITE_NOMUX(PCLK_DSP_CFG, "pclk_dsp_cfg", "sclk_dsp", 0,
+ RV1108_CLKSEL_CON(43), 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(9), 6, GFLAGS),
+ GATE(0, "pclk_dsp_cfg_niu", "pclk_dsp_cfg", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 8, GFLAGS),
+ GATE(0, "pclk_dsp_pfm_mon", "pclk_dsp_cfg", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 9, GFLAGS),
+ GATE(0, "pclk_intc", "pclk_dsp_cfg", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 10, GFLAGS),
+ GATE(0, "pclk_dsp_grf", "pclk_dsp_cfg", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 11, GFLAGS),
+ GATE(0, "pclk_mailbox", "pclk_dsp_cfg", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 12, GFLAGS),
+ GATE(0, "aclk_dsp_epp_perf", "sclk_dsp_epp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(16), 15, GFLAGS),
+ GATE(0, "aclk_dsp_edp_perf", "sclk_dsp_edp", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(11), 8, GFLAGS),
+
+ /*
* Clock-Architecture Diagram 4
*/
- COMPOSITE(0, "aclk_vio0_2wrap_occ", mux_pll_src_4plls_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(0, "aclk_vio0_pre", mux_pll_src_4plls_p, CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(28), 6, 2, MFLAGS, 0, 5, DFLAGS,
RV1108_CLKGATE_CON(6), 0, GFLAGS),
- GATE(0, "aclk_vio0_pre", "aclk_vio0_2wrap_occ", CLK_IGNORE_UNUSED,
+ GATE(ACLK_VIO0, "aclk_vio0", "aclk_vio0_pre", 0,
RV1108_CLKGATE_CON(17), 0, GFLAGS),
COMPOSITE_NOMUX(0, "hclk_vio_pre", "aclk_vio0_pre", 0,
RV1108_CLKSEL_CON(29), 0, 5, DFLAGS,
RV1108_CLKGATE_CON(7), 2, GFLAGS),
+ GATE(HCLK_VIO, "hclk_vio", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(17), 2, GFLAGS),
COMPOSITE_NOMUX(0, "pclk_vio_pre", "aclk_vio0_pre", 0,
RV1108_CLKSEL_CON(29), 8, 5, DFLAGS,
RV1108_CLKGATE_CON(7), 3, GFLAGS),
+ GATE(PCLK_VIO, "pclk_vio", "pclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(17), 3, GFLAGS),
+ COMPOSITE(0, "aclk_vio1_pre", mux_pll_src_4plls_p, CLK_IGNORE_UNUSED,
+ RV1108_CLKSEL_CON(28), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(6), 1, GFLAGS),
+ GATE(ACLK_VIO1, "aclk_vio1", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(17), 1, GFLAGS),
INVERTER(0, "pclk_vip", "ext_vip",
RV1108_CLKSEL_CON(31), 8, IFLAGS),
@@ -252,8 +441,63 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKGATE_CON(6), 5, GFLAGS),
GATE(0, "dclk_hdmiphy_src_dpll", "dpll", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(6), 4, GFLAGS),
- COMPOSITE_NOGATE(0, "dclk_hdmiphy", mux_dclk_hdmiphy_pre_p, 0,
- RV1108_CLKSEL_CON(32), 6, 2, MFLAGS, 8, 6, DFLAGS),
+ COMPOSITE_NOGATE(0, "dclk_hdmiphy_pre", mux_dclk_hdmiphy_pre_p, 0,
+ RV1108_CLKSEL_CON(32), 6, 1, MFLAGS, 8, 6, DFLAGS),
+ COMPOSITE_NOGATE(DCLK_VOP_SRC, "dclk_vop_src", mux_dclk_hdmiphy_pre_p, 0,
+ RV1108_CLKSEL_CON(32), 6, 1, MFLAGS, 0, 6, DFLAGS),
+ MUX(DCLK_HDMIPHY, "dclk_hdmiphy", mux_dclk_hdmiphy_p, CLK_SET_RATE_PARENT,
+ RV1108_CLKSEL_CON(32), 15, 1, MFLAGS),
+ MUX(DCLK_VOP, "dclk_vop", mux_dclk_vop_p, CLK_SET_RATE_PARENT,
+ RV1108_CLKSEL_CON(32), 7, 1, MFLAGS),
+ GATE(ACLK_VOP, "aclk_vop", "aclk_vio0_pre", 0,
+ RV1108_CLKGATE_CON(18), 0, GFLAGS),
+ GATE(HCLK_VOP, "hclk_vop", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 1, GFLAGS),
+ GATE(ACLK_IEP, "aclk_iep", "aclk_vio0_pre", 0,
+ RV1108_CLKGATE_CON(18), 2, GFLAGS),
+ GATE(HCLK_IEP, "hclk_iep", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 3, GFLAGS),
+
+ GATE(ACLK_RGA, "aclk_rga", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(18), 4, GFLAGS),
+ GATE(HCLK_RGA, "hclk_rga", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 5, GFLAGS),
+ COMPOSITE(SCLK_RGA, "sclk_rga", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(33), 6, 2, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(6), 6, GFLAGS),
+
+ COMPOSITE(SCLK_CVBS_HOST, "sclk_cvbs_host", mux_cvbs_src_p, 0,
+ RV1108_CLKSEL_CON(33), 13, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(6), 7, GFLAGS),
+ FACTOR(0, "sclk_cvbs_27m", "sclk_cvbs_host", 0, 1, 2),
+
+ GATE(SCLK_HDMI_SFR, "sclk_hdmi_sfr", "xin24m", 0,
+ RV1108_CLKGATE_CON(6), 8, GFLAGS),
+
+ COMPOSITE(SCLK_HDMI_CEC, "sclk_hdmi_cec", mux_hdmi_cec_src_p, 0,
+ RV1108_CLKSEL_CON(34), 14, 2, MFLAGS, 0, 14, DFLAGS,
+ RV1108_CLKGATE_CON(6), 9, GFLAGS),
+ GATE(PCLK_MIPI_DSI, "pclk_mipi_dsi", "pclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 8, GFLAGS),
+ GATE(PCLK_HDMI_CTRL, "pclk_hdmi_ctrl", "pclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 9, GFLAGS),
+
+ GATE(ACLK_ISP, "aclk_isp", "aclk_vio1_pre", 0,
+ RV1108_CLKGATE_CON(18), 12, GFLAGS),
+ GATE(HCLK_ISP, "hclk_isp", "hclk_vio_pre", 0,
+ RV1108_CLKGATE_CON(18), 11, GFLAGS),
+ COMPOSITE(SCLK_ISP, "sclk_isp", mux_pll_src_4plls_p, 0,
+ RV1108_CLKSEL_CON(30), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(6), 3, GFLAGS),
+
+ GATE(0, "clk_dsiphy24m", "xin24m", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(9), 10, GFLAGS),
+ GATE(0, "pclk_vdacphy", "pclk_top_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 9, GFLAGS),
+ GATE(0, "pclk_mipi_dsiphy", "pclk_top_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 11, GFLAGS),
+ GATE(0, "pclk_mipi_csiphy", "pclk_top_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 12, GFLAGS),
/*
* Clock-Architecture Diagram 5
@@ -261,10 +505,11 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
- COMPOSITE(0, "i2s0_src", mux_pll_src_2plls_p, 0,
+
+ COMPOSITE(SCLK_I2S0_SRC, "i2s0_src", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(5), 8, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(2), 0, GFLAGS),
- COMPOSITE_FRACMUX(0, "i2s1_frac", "i2s1_src", CLK_SET_RATE_PARENT,
+ COMPOSITE_FRACMUX(0, "i2s0_frac", "i2s0_src", CLK_SET_RATE_PARENT,
RV1108_CLKSEL_CON(8), 0,
RV1108_CLKGATE_CON(2), 1, GFLAGS,
&rv1108_i2s0_fracmux),
@@ -274,7 +519,7 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKSEL_CON(5), 15, 1, MFLAGS,
RV1108_CLKGATE_CON(2), 3, GFLAGS),
- COMPOSITE(0, "i2s1_src", mux_pll_src_2plls_p, 0,
+ COMPOSITE(SCLK_I2S1_SRC, "i2s1_src", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(6), 8, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(2), 4, GFLAGS),
COMPOSITE_FRACMUX(0, "i2s1_frac", "i2s1_src", CLK_SET_RATE_PARENT,
@@ -284,7 +529,7 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
GATE(SCLK_I2S1, "sclk_i2s1", "i2s1_pre", CLK_SET_RATE_PARENT,
RV1108_CLKGATE_CON(2), 6, GFLAGS),
- COMPOSITE(0, "i2s2_src", mux_pll_src_2plls_p, 0,
+ COMPOSITE(SCLK_I2S2_SRC, "i2s2_src", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(7), 8, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 8, GFLAGS),
COMPOSITE_FRACMUX(0, "i2s2_frac", "i2s2_src", CLK_SET_RATE_PARENT,
@@ -303,32 +548,53 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKGATE_CON(1), 2, GFLAGS),
COMPOSITE_NOGATE(ACLK_PRE, "aclk_bus_pre", mux_aclk_bus_src_p, 0,
RV1108_CLKSEL_CON(2), 8, 2, MFLAGS, 0, 5, DFLAGS),
- COMPOSITE_NOMUX(0, "hclk_bus_pre", "aclk_bus_2wrap_occ", 0,
+ COMPOSITE_NOMUX(HCLK_BUS, "hclk_bus_pre", "aclk_bus_pre", 0,
RV1108_CLKSEL_CON(3), 0, 5, DFLAGS,
RV1108_CLKGATE_CON(1), 4, GFLAGS),
- COMPOSITE_NOMUX(0, "pclken_bus", "aclk_bus_2wrap_occ", 0,
+ COMPOSITE_NOMUX(0, "pclk_bus_pre", "aclk_bus_pre", 0,
RV1108_CLKSEL_CON(3), 8, 5, DFLAGS,
RV1108_CLKGATE_CON(1), 5, GFLAGS),
- GATE(0, "pclk_bus_pre", "pclken_bus", CLK_IGNORE_UNUSED,
+ GATE(PCLK_BUS, "pclk_bus", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(1), 6, GFLAGS),
- GATE(0, "pclk_top_pre", "pclken_bus", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_top_pre", "pclk_bus_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(1), 7, GFLAGS),
- GATE(0, "pclk_ddr_pre", "pclken_bus", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_ddr_pre", "pclk_bus_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(1), 8, GFLAGS),
- GATE(0, "clk_timer0", "mux_pll_p", CLK_IGNORE_UNUSED,
+ GATE(SCLK_TIMER0, "clk_timer0", "xin24m", 0,
RV1108_CLKGATE_CON(1), 9, GFLAGS),
- GATE(0, "clk_timer1", "mux_pll_p", CLK_IGNORE_UNUSED,
+ GATE(SCLK_TIMER1, "clk_timer1", "xin24m", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(1), 10, GFLAGS),
- GATE(0, "pclk_timer", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(13), 4, GFLAGS),
- COMPOSITE(0, "uart0_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
+ GATE(HCLK_I2S0_8CH, "hclk_i2s0_8ch", "hclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 7, GFLAGS),
+ GATE(HCLK_I2S1_2CH, "hclk_i2s1_2ch", "hclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 8, GFLAGS),
+ GATE(HCLK_I2S2_2CH, "hclk_i2s2_2ch", "hclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 9, GFLAGS),
+
+ GATE(HCLK_CRYPTO_MST, "hclk_crypto_mst", "hclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 10, GFLAGS),
+ GATE(HCLK_CRYPTO_SLV, "hclk_crypto_slv", "hclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 11, GFLAGS),
+ COMPOSITE(SCLK_CRYPTO, "sclk_crypto", mux_pll_src_2plls_p, 0,
+ RV1108_CLKSEL_CON(11), 7, 1, MFLAGS, 0, 5, DFLAGS,
+ RV1108_CLKGATE_CON(2), 12, GFLAGS),
+
+ COMPOSITE(SCLK_SPI, "sclk_spi", mux_pll_src_2plls_p, 0,
+ RV1108_CLKSEL_CON(11), 15, 1, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKGATE_CON(3), 0, GFLAGS),
+ GATE(PCLK_SPI, "pclk_spi", "pclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(13), 5, GFLAGS),
+
+ COMPOSITE(SCLK_UART0_SRC, "uart0_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(13), 12, 2, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 1, GFLAGS),
- COMPOSITE(0, "uart1_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(SCLK_UART1_SRC, "uart1_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(14), 12, 2, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 3, GFLAGS),
- COMPOSITE(0, "uart21_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(SCLK_UART2_SRC, "uart2_src", mux_pll_src_dpll_gpll_usb480m_p, CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(15), 12, 2, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 5, GFLAGS),
@@ -344,44 +610,58 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKSEL_CON(18), 0,
RV1108_CLKGATE_CON(3), 6, GFLAGS,
&rv1108_uart2_fracmux),
- GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 10, GFLAGS),
- GATE(PCLK_UART1, "pclk_uart1", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_UART1, "pclk_uart1", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 11, GFLAGS),
- GATE(PCLK_UART2, "pclk_uart2", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_UART2, "pclk_uart2", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 12, GFLAGS),
- COMPOSITE(0, "clk_i2c1", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
- RV1108_CLKSEL_CON(19), 15, 2, MFLAGS, 8, 7, DFLAGS,
+ COMPOSITE(SCLK_I2C1, "clk_i2c1", mux_pll_src_2plls_p, 0,
+ RV1108_CLKSEL_CON(19), 15, 1, MFLAGS, 8, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 7, GFLAGS),
- COMPOSITE(0, "clk_i2c2", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
- RV1108_CLKSEL_CON(20), 7, 2, MFLAGS, 0, 7, DFLAGS,
+ COMPOSITE(SCLK_I2C2, "clk_i2c2", mux_pll_src_2plls_p, 0,
+ RV1108_CLKSEL_CON(20), 7, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 8, GFLAGS),
- COMPOSITE(0, "clk_i2c3", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
- RV1108_CLKSEL_CON(20), 15, 2, MFLAGS, 8, 7, DFLAGS,
+ COMPOSITE(SCLK_I2C3, "clk_i2c3", mux_pll_src_2plls_p, 0,
+ RV1108_CLKSEL_CON(20), 15, 1, MFLAGS, 8, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 9, GFLAGS),
- GATE(0, "pclk_i2c1", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_I2C1, "pclk_i2c1", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 0, GFLAGS),
- GATE(0, "pclk_i2c2", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_I2C2, "pclk_i2c2", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 1, GFLAGS),
- GATE(0, "pclk_i2c3", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_I2C3, "pclk_i2c3", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 2, GFLAGS),
- COMPOSITE(0, "clk_pwm1", mux_pll_src_2plls_p, CLK_IGNORE_UNUSED,
+ COMPOSITE(SCLK_PWM, "clk_pwm", mux_pll_src_2plls_p, 0,
RV1108_CLKSEL_CON(12), 15, 2, MFLAGS, 8, 7, DFLAGS,
RV1108_CLKGATE_CON(3), 10, GFLAGS),
- GATE(0, "pclk_pwm1", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_PWM, "pclk_pwm", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 6, GFLAGS),
- GATE(0, "pclk_wdt", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_WDT, "pclk_wdt", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 3, GFLAGS),
- GATE(0, "pclk_gpio1", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 7, GFLAGS),
- GATE(0, "pclk_gpio2", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 8, GFLAGS),
- GATE(0, "pclk_gpio3", "pclk_bus_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_bus_pre", 0,
RV1108_CLKGATE_CON(13), 9, GFLAGS),
GATE(0, "pclk_grf", "pclk_bus_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(14), 0, GFLAGS),
+ GATE(PCLK_EFUSE0, "pclk_efuse0", "pclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 12, GFLAGS),
+ GATE(PCLK_EFUSE1, "pclk_efuse1", "pclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(12), 13, GFLAGS),
+ GATE(PCLK_TSADC, "pclk_tsadc", "pclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(13), 13, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_TSADC, "sclk_tsadc", "xin24m", 0,
+ RV1108_CLKSEL_CON(21), 0, 10, DFLAGS,
+ RV1108_CLKGATE_CON(3), 11, GFLAGS),
+ GATE(PCLK_SARADC, "pclk_saradc", "pclk_bus_pre", 0,
+ RV1108_CLKGATE_CON(13), 14, GFLAGS),
+ COMPOSITE_NOMUX(SCLK_SARADC, "sclk_saradc", "xin24m", 0,
+ RV1108_CLKSEL_CON(22), 0, 10, DFLAGS,
+ RV1108_CLKGATE_CON(3), 12, GFLAGS),
GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_pre", 0,
RV1108_CLKGATE_CON(12), 2, GFLAGS),
@@ -397,18 +677,24 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
RV1108_CLKGATE_CON(0), 9, GFLAGS),
GATE(0, "gpll_ddr", "gpll", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(0), 10, GFLAGS),
- COMPOSITE(0, "ddrphy4x", mux_ddrphy_p, CLK_IGNORE_UNUSED,
+ COMPOSITE_NOGATE(0, "clk_ddrphy_src", mux_ddrphy_p, CLK_IGNORE_UNUSED,
RV1108_CLKSEL_CON(4), 8, 2, MFLAGS, 0, 3,
- DFLAGS | CLK_DIVIDER_POWER_OF_TWO,
+ DFLAGS | CLK_DIVIDER_POWER_OF_TWO),
+ FACTOR(0, "clk_ddr", "clk_ddrphy_src", 0, 1, 2),
+ GATE(0, "clk_ddrphy4x", "clk_ddr", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(10), 9, GFLAGS),
- GATE(0, "ddrupctl", "ddrphy_pre", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_ddrupctl", "pclk_ddr_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(12), 4, GFLAGS),
- GATE(0, "ddrc", "ddrphy", CLK_IGNORE_UNUSED,
+ GATE(0, "nclk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(12), 5, GFLAGS),
- GATE(0, "ddrmon", "ddrphy_pre", CLK_IGNORE_UNUSED,
+ GATE(0, "pclk_ddrmon", "pclk_ddr_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(12), 6, GFLAGS),
GATE(0, "timer_clk", "xin24m", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(0), 11, GFLAGS),
+ GATE(0, "pclk_mschniu", "pclk_ddr_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 2, GFLAGS),
+ GATE(0, "pclk_ddrphy", "pclk_ddr_pre", CLK_IGNORE_UNUSED,
+ RV1108_CLKGATE_CON(14), 4, GFLAGS),
/*
* Clock-Architecture Diagram 6
@@ -418,23 +704,23 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
COMPOSITE_NOMUX(0, "pclk_periph_pre", "gpll", 0,
RV1108_CLKSEL_CON(23), 10, 5, DFLAGS,
RV1108_CLKGATE_CON(4), 5, GFLAGS),
- GATE(0, "pclk_periph", "pclk_periph_pre", CLK_IGNORE_UNUSED,
+ GATE(PCLK_PERI, "pclk_periph", "pclk_periph_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(15), 13, GFLAGS),
COMPOSITE_NOMUX(0, "hclk_periph_pre", "gpll", 0,
RV1108_CLKSEL_CON(23), 5, 5, DFLAGS,
RV1108_CLKGATE_CON(4), 4, GFLAGS),
- GATE(0, "hclk_periph", "hclk_periph_pre", CLK_IGNORE_UNUSED,
+ GATE(HCLK_PERI, "hclk_periph", "hclk_periph_pre", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(15), 12, GFLAGS),
GATE(0, "aclk_peri_src_dpll", "dpll", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(4), 1, GFLAGS),
GATE(0, "aclk_peri_src_gpll", "gpll", CLK_IGNORE_UNUSED,
RV1108_CLKGATE_CON(4), 2, GFLAGS),
- COMPOSITE(0, "aclk_periph", mux_aclk_peri_src_p, CLK_IGNORE_UNUSED,
- RV1108_CLKSEL_CON(23), 15, 2, MFLAGS, 0, 5, DFLAGS,
+ COMPOSITE(ACLK_PERI, "aclk_periph", mux_aclk_peri_src_p, 0,
+ RV1108_CLKSEL_CON(23), 15, 1, MFLAGS, 0, 5, DFLAGS,
RV1108_CLKGATE_CON(15), 11, GFLAGS),
- COMPOSITE(SCLK_SDMMC, "sclk_sdmmc0", mux_mmc_src_p, 0,
+ COMPOSITE(SCLK_SDMMC, "sclk_sdmmc", mux_mmc_src_p, 0,
RV1108_CLKSEL_CON(25), 8, 2, MFLAGS, 0, 8, DFLAGS,
RV1108_CLKGATE_CON(5), 0, GFLAGS),
@@ -454,23 +740,31 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
GATE(HCLK_EMMC, "hclk_emmc", "hclk_periph", 0, RV1108_CLKGATE_CON(15), 2, GFLAGS),
COMPOSITE(SCLK_NANDC, "sclk_nandc", mux_pll_src_2plls_p, 0,
- RV1108_CLKSEL_CON(27), 14, 2, MFLAGS, 8, 5, DFLAGS,
+ RV1108_CLKSEL_CON(27), 14, 1, MFLAGS, 8, 5, DFLAGS,
RV1108_CLKGATE_CON(5), 3, GFLAGS),
GATE(HCLK_NANDC, "hclk_nandc", "hclk_periph", 0, RV1108_CLKGATE_CON(15), 3, GFLAGS),
+ GATE(HCLK_HOST0, "hclk_host0", "hclk_periph", 0, RV1108_CLKGATE_CON(15), 6, GFLAGS),
+ GATE(0, "hclk_host0_arb", "hclk_periph", CLK_IGNORE_UNUSED, RV1108_CLKGATE_CON(15), 7, GFLAGS),
+ GATE(HCLK_OTG, "hclk_otg", "hclk_periph", 0, RV1108_CLKGATE_CON(15), 8, GFLAGS),
+ GATE(0, "hclk_otg_pmu", "hclk_periph", CLK_IGNORE_UNUSED, RV1108_CLKGATE_CON(15), 9, GFLAGS),
+ GATE(SCLK_USBPHY, "clk_usbphy", "xin24m", CLK_IGNORE_UNUSED, RV1108_CLKGATE_CON(5), 5, GFLAGS),
+
COMPOSITE(SCLK_SFC, "sclk_sfc", mux_pll_src_2plls_p, 0,
- RV1108_CLKSEL_CON(27), 7, 2, MFLAGS, 0, 7, DFLAGS,
+ RV1108_CLKSEL_CON(27), 7, 1, MFLAGS, 0, 7, DFLAGS,
RV1108_CLKGATE_CON(5), 4, GFLAGS),
GATE(HCLK_SFC, "hclk_sfc", "hclk_periph", 0, RV1108_CLKGATE_CON(15), 10, GFLAGS),
- COMPOSITE(0, "sclk_macphy_pre", mux_pll_src_apll_gpll_p, 0,
- RV1108_CLKSEL_CON(24), 12, 2, MFLAGS, 0, 5, DFLAGS,
+ COMPOSITE(SCLK_MAC_PRE, "sclk_mac_pre", mux_pll_src_apll_gpll_p, 0,
+ RV1108_CLKSEL_CON(24), 12, 1, MFLAGS, 0, 5, DFLAGS,
RV1108_CLKGATE_CON(4), 10, GFLAGS),
- MUX(0, "sclk_macphy", mux_sclk_macphy_p, CLK_SET_RATE_PARENT,
- RV1108_CLKSEL_CON(24), 8, 2, MFLAGS),
- GATE(0, "sclk_macphy_rx", "sclk_macphy", 0, RV1108_CLKGATE_CON(4), 8, GFLAGS),
- GATE(0, "sclk_mac_ref", "sclk_macphy", 0, RV1108_CLKGATE_CON(4), 6, GFLAGS),
- GATE(0, "sclk_mac_refout", "sclk_macphy", 0, RV1108_CLKGATE_CON(4), 7, GFLAGS),
+ MUX(SCLK_MAC, "sclk_mac", mux_sclk_mac_p, CLK_SET_RATE_PARENT,
+ RV1108_CLKSEL_CON(24), 8, 1, MFLAGS),
+ GATE(SCLK_MAC_RX, "sclk_mac_rx", "sclk_mac", 0, RV1108_CLKGATE_CON(4), 8, GFLAGS),
+ GATE(SCLK_MAC_REF, "sclk_mac_ref", "sclk_mac", 0, RV1108_CLKGATE_CON(4), 6, GFLAGS),
+ GATE(SCLK_MAC_REFOUT, "sclk_mac_refout", "sclk_mac", 0, RV1108_CLKGATE_CON(4), 7, GFLAGS),
+ GATE(ACLK_GMAC, "aclk_gmac", "aclk_periph", 0, RV1108_CLKGATE_CON(15), 4, GFLAGS),
+ GATE(PCLK_GMAC, "pclk_gmac", "pclk_periph", 0, RV1108_CLKGATE_CON(15), 5, GFLAGS),
MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "sclk_sdmmc", RV1108_SDMMC_CON0, 1),
MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "sclk_sdmmc", RV1108_SDMMC_CON1, 1),
@@ -484,10 +778,16 @@ static struct rockchip_clk_branch rv1108_clk_branches[] __initdata = {
static const char *const rv1108_critical_clocks[] __initconst = {
"aclk_core",
- "aclk_bus_src_gpll",
+ "aclk_bus",
+ "hclk_bus",
+ "pclk_bus",
"aclk_periph",
"hclk_periph",
"pclk_periph",
+ "nclk_ddrupctl",
+ "pclk_ddrmon",
+ "pclk_acodecphy",
+ "pclk_pmu",
};
static void __init rv1108_clk_init(struct device_node *np)
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index fe1d393cf678..35dbd63c2f49 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -29,6 +29,7 @@
#include <linux/mfd/syscon.h>
#include <linux/regmap.h>
#include <linux/reboot.h>
+#include <linux/rational.h>
#include "clk.h"
/**
@@ -164,6 +165,40 @@ static int rockchip_clk_frac_notifier_cb(struct notifier_block *nb,
return notifier_from_errno(ret);
}
+/**
+ * fractional divider must set that denominator is 20 times larger than
+ * numerator to generate precise clock frequency.
+ */
+static void rockchip_fractional_approximation(struct clk_hw *hw,
+ unsigned long rate, unsigned long *parent_rate,
+ unsigned long *m, unsigned long *n)
+{
+ struct clk_fractional_divider *fd = to_clk_fd(hw);
+ unsigned long p_rate, p_parent_rate;
+ struct clk_hw *p_parent;
+ unsigned long scale;
+
+ p_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
+ if ((rate * 20 > p_rate) && (p_rate % rate != 0)) {
+ p_parent = clk_hw_get_parent(clk_hw_get_parent(hw));
+ p_parent_rate = clk_hw_get_rate(p_parent);
+ *parent_rate = p_parent_rate;
+ }
+
+ /*
+ * Get rate closer to *parent_rate to guarantee there is no overflow
+ * for m and n. In the result it will be the nearest rate left shifted
+ * by (scale - fd->nwidth) bits.
+ */
+ scale = fls_long(*parent_rate / rate - 1);
+ if (scale > fd->nwidth)
+ rate <<= scale - fd->nwidth;
+
+ rational_best_approximation(rate, *parent_rate,
+ GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
+ m, n);
+}
+
static struct clk *rockchip_clk_register_frac_branch(
struct rockchip_clk_provider *ctx, const char *name,
const char *const *parent_names, u8 num_parents,
@@ -210,6 +245,7 @@ static struct clk *rockchip_clk_register_frac_branch(
div->nwidth = 16;
div->nmask = GENMASK(div->nwidth - 1, 0) << div->nshift;
div->lock = lock;
+ div->approximation = rockchip_fractional_approximation;
div_ops = &clk_fractional_divider_ops;
clk = clk_register_composite(NULL, name, parent_names, num_parents,
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c
index 1fab56f396d4..b117783ed404 100644
--- a/drivers/clk/samsung/clk-exynos-audss.c
+++ b/drivers/clk/samsung/clk-exynos-audss.c
@@ -180,7 +180,7 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
}
clk_table[EXYNOS_MOUT_AUDSS] = clk_hw_register_mux(NULL, "mout_audss",
mout_audss_p, ARRAY_SIZE(mout_audss_p),
- CLK_SET_RATE_NO_REPARENT,
+ CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
reg_base + ASS_CLK_SRC, 0, 1, 0, &lock);
cdclk = devm_clk_get(&pdev->dev, "cdclk");
@@ -195,11 +195,11 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
reg_base + ASS_CLK_SRC, 2, 2, 0, &lock);
clk_table[EXYNOS_DOUT_SRP] = clk_hw_register_divider(NULL, "dout_srp",
- "mout_audss", 0, reg_base + ASS_CLK_DIV, 0, 4,
- 0, &lock);
+ "mout_audss", CLK_SET_RATE_PARENT,
+ reg_base + ASS_CLK_DIV, 0, 4, 0, &lock);
clk_table[EXYNOS_DOUT_AUD_BUS] = clk_hw_register_divider(NULL,
- "dout_aud_bus", "dout_srp", 0,
+ "dout_aud_bus", "dout_srp", CLK_SET_RATE_PARENT,
reg_base + ASS_CLK_DIV, 4, 4, 0, &lock);
clk_table[EXYNOS_DOUT_I2S] = clk_hw_register_divider(NULL, "dout_i2s",
diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c
index 9a6476aa7d81..25601967d1cd 100644
--- a/drivers/clk/samsung/clk-exynos5420.c
+++ b/drivers/clk/samsung/clk-exynos5420.c
@@ -537,8 +537,8 @@ static const struct samsung_mux_clock exynos5800_mux_clks[] __initconst = {
MUX(CLK_MOUT_MX_MSPLL_CCORE, "mout_mx_mspll_ccore",
mout_mx_mspll_ccore_p, SRC_TOP7, 16, 2),
- MUX(CLK_MOUT_MAU_EPLL, "mout_mau_epll_clk", mout_mau_epll_clk_5800_p,
- SRC_TOP7, 20, 2),
+ MUX_F(CLK_MOUT_MAU_EPLL, "mout_mau_epll_clk", mout_mau_epll_clk_5800_p,
+ SRC_TOP7, 20, 2, CLK_SET_RATE_PARENT, 0),
MUX(0, "sclk_bpll", mout_bpll_p, SRC_TOP7, 24, 1),
MUX(0, "mout_epll2", mout_epll2_5800_p, SRC_TOP7, 28, 1),
@@ -547,8 +547,8 @@ static const struct samsung_mux_clock exynos5800_mux_clks[] __initconst = {
MUX(0, "mout_aclk432_cam", mout_group6_5800_p, SRC_TOP8, 24, 2),
MUX(0, "mout_aclk432_scaler", mout_group6_5800_p, SRC_TOP8, 28, 2),
- MUX(CLK_MOUT_USER_MAU_EPLL, "mout_user_mau_epll", mout_group16_5800_p,
- SRC_TOP9, 8, 1),
+ MUX_F(CLK_MOUT_USER_MAU_EPLL, "mout_user_mau_epll", mout_group16_5800_p,
+ SRC_TOP9, 8, 1, CLK_SET_RATE_PARENT, 0),
MUX(0, "mout_user_aclk550_cam", mout_group15_5800_p,
SRC_TOP9, 16, 1),
MUX(0, "mout_user_aclkfl1_550_cam", mout_group13_5800_p,
@@ -590,6 +590,8 @@ static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
GATE_BUS_TOP, 24, 0, 0),
GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
+ GATE(CLK_MAU_EPLL, "mau_epll", "mout_user_mau_epll",
+ SRC_MASK_TOP7, 20, CLK_SET_RATE_PARENT, 0),
};
static const struct samsung_mux_clock exynos5420_mux_clks[] __initconst = {
@@ -629,6 +631,11 @@ static const struct samsung_div_clock exynos5420_div_clks[] __initconst = {
"mout_aclk400_wcore_bpll", DIV_TOP0, 16, 3),
};
+static const struct samsung_gate_clock exynos5420_gate_clks[] __initconst = {
+ GATE(CLK_MAU_EPLL, "mau_epll", "mout_mau_epll_clk",
+ SRC_MASK_TOP7, 20, CLK_SET_RATE_PARENT, 0),
+};
+
static const struct samsung_mux_clock exynos5x_mux_clks[] __initconst = {
MUX(0, "mout_user_pclk66_gpio", mout_user_pclk66_gpio_p,
SRC_TOP7, 4, 1),
@@ -706,7 +713,8 @@ static const struct samsung_mux_clock exynos5x_mux_clks[] __initconst = {
MUX(0, "mout_sclk_spll", mout_spll_p, SRC_TOP6, 8, 1),
MUX(0, "mout_sclk_ipll", mout_ipll_p, SRC_TOP6, 12, 1),
MUX(0, "mout_sclk_rpll", mout_rpll_p, SRC_TOP6, 16, 1),
- MUX(CLK_MOUT_EPLL, "mout_sclk_epll", mout_epll_p, SRC_TOP6, 20, 1),
+ MUX_F(CLK_MOUT_EPLL, "mout_sclk_epll", mout_epll_p, SRC_TOP6, 20, 1,
+ CLK_SET_RATE_PARENT, 0),
MUX(0, "mout_sclk_dpll", mout_dpll_p, SRC_TOP6, 24, 1),
MUX(0, "mout_sclk_cpll", mout_cpll_p, SRC_TOP6, 28, 1),
@@ -1001,9 +1009,6 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
GATE(0, "aclk300_disp1", "mout_user_aclk300_disp1",
SRC_MASK_TOP2, 24, CLK_IS_CRITICAL, 0),
- GATE(CLK_MAU_EPLL, "mau_epll", "mout_mau_epll_clk",
- SRC_MASK_TOP7, 20, 0, 0),
-
/* sclk */
GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_uart0",
GATE_TOP_SCLK_PERIC, 0, CLK_SET_RATE_PARENT, 0),
@@ -1440,6 +1445,8 @@ static void __init exynos5x_clk_init(struct device_node *np,
ARRAY_SIZE(exynos5420_mux_clks));
samsung_clk_register_div(ctx, exynos5420_div_clks,
ARRAY_SIZE(exynos5420_div_clks));
+ samsung_clk_register_gate(ctx, exynos5420_gate_clks,
+ ARRAY_SIZE(exynos5420_gate_clks));
} else {
samsung_clk_register_fixed_factor(
ctx, exynos5800_fixed_factor_clks,
diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig
index 7342928c35cd..6427d0ebe2de 100644
--- a/drivers/clk/sunxi-ng/Kconfig
+++ b/drivers/clk/sunxi-ng/Kconfig
@@ -11,6 +11,19 @@ config SUN50I_A64_CCU
default ARM64 && ARCH_SUNXI
depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST
+config SUN4I_A10_CCU
+ bool "Support for the Allwinner A10/A20 CCU"
+ select SUNXI_CCU_DIV
+ select SUNXI_CCU_MULT
+ select SUNXI_CCU_NK
+ select SUNXI_CCU_NKM
+ select SUNXI_CCU_NM
+ select SUNXI_CCU_MP
+ select SUNXI_CCU_PHASE
+ default MACH_SUN4I
+ default MACH_SUN7I
+ depends on MACH_SUN4I || MACH_SUN7I || COMPILE_TEST
+
config SUN5I_CCU
bool "Support for the Allwinner sun5i family CCM"
default MACH_SUN5I
@@ -48,6 +61,11 @@ config SUN8I_V3S_CCU
config SUN8I_DE2_CCU
bool "Support for the Allwinner SoCs DE2 CCU"
+config SUN8I_R40_CCU
+ bool "Support for the Allwinner R40 CCU"
+ default MACH_SUN8I
+ depends on MACH_SUN8I || COMPILE_TEST
+
config SUN9I_A80_CCU
bool "Support for the Allwinner A80 CCU"
default MACH_SUN9I
diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Makefile
index 45a5910379a5..85a0633c1eac 100644
--- a/drivers/clk/sunxi-ng/Makefile
+++ b/drivers/clk/sunxi-ng/Makefile
@@ -20,6 +20,7 @@ lib-$(CONFIG_SUNXI_CCU) += ccu_mp.o
# SoC support
obj-$(CONFIG_SUN50I_A64_CCU) += ccu-sun50i-a64.o
+obj-$(CONFIG_SUN4I_A10_CCU) += ccu-sun4i-a10.o
obj-$(CONFIG_SUN5I_CCU) += ccu-sun5i.o
obj-$(CONFIG_SUN6I_A31_CCU) += ccu-sun6i-a31.o
obj-$(CONFIG_SUN8I_A23_CCU) += ccu-sun8i-a23.o
@@ -29,6 +30,7 @@ obj-$(CONFIG_SUN8I_H3_CCU) += ccu-sun8i-h3.o
obj-$(CONFIG_SUN8I_V3S_CCU) += ccu-sun8i-v3s.o
obj-$(CONFIG_SUN8I_DE2_CCU) += ccu-sun8i-de2.o
obj-$(CONFIG_SUN8I_R_CCU) += ccu-sun8i-r.o
+obj-$(CONFIG_SUN8I_R40_CCU) += ccu-sun8i-r40.o
obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80.o
obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80-de.o
obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80-usb.o
diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
new file mode 100644
index 000000000000..286b0049b7b6
--- /dev/null
+++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
@@ -0,0 +1,1456 @@
+/*
+ * Copyright (c) 2017 Priit Laes <[email protected]>.
+ * Copyright (c) 2017 Maxime Ripard.
+ * Copyright (c) 2017 Jonathan Liu.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
+
+#include "ccu_common.h"
+#include "ccu_reset.h"
+
+#include "ccu_div.h"
+#include "ccu_gate.h"
+#include "ccu_mp.h"
+#include "ccu_mult.h"
+#include "ccu_nk.h"
+#include "ccu_nkm.h"
+#include "ccu_nkmp.h"
+#include "ccu_nm.h"
+#include "ccu_phase.h"
+
+#include "ccu-sun4i-a10.h"
+
+static struct ccu_nkmp pll_core_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .m = _SUNXI_CCU_DIV(0, 2),
+ .p = _SUNXI_CCU_DIV(16, 2),
+ .common = {
+ .reg = 0x000,
+ .hw.init = CLK_HW_INIT("pll-core",
+ "hosc",
+ &ccu_nkmp_ops,
+ 0),
+ },
+};
+
+/*
+ * The Audio PLL is supposed to have 4 outputs: 3 fixed factors from
+ * the base (2x, 4x and 8x), and one variable divider (the one true
+ * pll audio).
+ *
+ * We don't have any need for the variable divider for now, so we just
+ * hardcode it to match with the clock names.
+ */
+#define SUN4I_PLL_AUDIO_REG 0x008
+static struct ccu_nm pll_audio_base_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 7, 0),
+ .m = _SUNXI_CCU_DIV_OFFSET(0, 5, 0),
+ .common = {
+ .reg = 0x008,
+ .hw.init = CLK_HW_INIT("pll-audio-base",
+ "hosc",
+ &ccu_nm_ops,
+ 0),
+ },
+
+};
+
+static struct ccu_mult pll_video0_clk = {
+ .enable = BIT(31),
+ .mult = _SUNXI_CCU_MULT_OFFSET_MIN_MAX(0, 7, 0, 9, 127),
+ .frac = _SUNXI_CCU_FRAC(BIT(15), BIT(14),
+ 270000000, 297000000),
+ .common = {
+ .reg = 0x010,
+ .features = (CCU_FEATURE_FRACTIONAL |
+ CCU_FEATURE_ALL_PREDIV),
+ .prediv = 8,
+ .hw.init = CLK_HW_INIT("pll-video0",
+ "hosc",
+ &ccu_mult_ops,
+ 0),
+ },
+};
+
+static struct ccu_nkmp pll_ve_sun4i_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .m = _SUNXI_CCU_DIV(0, 2),
+ .p = _SUNXI_CCU_DIV(16, 2),
+ .common = {
+ .reg = 0x018,
+ .hw.init = CLK_HW_INIT("pll-ve",
+ "hosc",
+ &ccu_nkmp_ops,
+ 0),
+ },
+};
+
+static struct ccu_nk pll_ve_sun7i_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .common = {
+ .reg = 0x018,
+ .hw.init = CLK_HW_INIT("pll-ve",
+ "hosc",
+ &ccu_nk_ops,
+ 0),
+ },
+};
+
+static struct ccu_nk pll_ddr_base_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .common = {
+ .reg = 0x020,
+ .hw.init = CLK_HW_INIT("pll-ddr-base",
+ "hosc",
+ &ccu_nk_ops,
+ 0),
+ },
+};
+
+static SUNXI_CCU_M(pll_ddr_clk, "pll-ddr", "pll-ddr-base", 0x020, 0, 2,
+ CLK_IS_CRITICAL);
+
+static struct ccu_div pll_ddr_other_clk = {
+ .div = _SUNXI_CCU_DIV_FLAGS(16, 2, CLK_DIVIDER_POWER_OF_TWO),
+ .common = {
+ .reg = 0x020,
+ .hw.init = CLK_HW_INIT("pll-ddr-other", "pll-ddr-base",
+ &ccu_div_ops,
+ 0),
+ },
+};
+
+static struct ccu_nk pll_periph_base_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .common = {
+ .reg = 0x028,
+ .hw.init = CLK_HW_INIT("pll-periph-base",
+ "hosc",
+ &ccu_nk_ops,
+ 0),
+ },
+};
+
+static CLK_FIXED_FACTOR(pll_periph_clk, "pll-periph", "pll-periph-base",
+ 2, 1, CLK_SET_RATE_PARENT);
+
+/* Not documented on A10 */
+static struct ccu_div pll_periph_sata_clk = {
+ .enable = BIT(14),
+ .div = _SUNXI_CCU_DIV(0, 2),
+ .fixed_post_div = 6,
+ .common = {
+ .reg = 0x028,
+ .features = CCU_FEATURE_FIXED_POSTDIV,
+ .hw.init = CLK_HW_INIT("pll-periph-sata",
+ "pll-periph-base",
+ &ccu_div_ops, 0),
+ },
+};
+
+static struct ccu_mult pll_video1_clk = {
+ .enable = BIT(31),
+ .mult = _SUNXI_CCU_MULT_OFFSET_MIN_MAX(0, 7, 0, 9, 127),
+ .frac = _SUNXI_CCU_FRAC(BIT(15), BIT(14),
+ 270000000, 297000000),
+ .common = {
+ .reg = 0x030,
+ .features = (CCU_FEATURE_FRACTIONAL |
+ CCU_FEATURE_ALL_PREDIV),
+ .prediv = 8,
+ .hw.init = CLK_HW_INIT("pll-video1",
+ "hosc",
+ &ccu_mult_ops,
+ 0),
+ },
+};
+
+/* Not present on A10 */
+static struct ccu_nk pll_gpu_clk = {
+ .enable = BIT(31),
+ .n = _SUNXI_CCU_MULT_OFFSET(8, 5, 0),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .common = {
+ .reg = 0x040,
+ .hw.init = CLK_HW_INIT("pll-gpu",
+ "hosc",
+ &ccu_nk_ops,
+ 0),
+ },
+};
+
+static SUNXI_CCU_GATE(hosc_clk, "hosc", "osc24M", 0x050, BIT(0), 0);
+
+static const char *const cpu_parents[] = { "osc32k", "hosc",
+ "pll-core", "pll-periph" };
+static const struct ccu_mux_fixed_prediv cpu_predivs[] = {
+ { .index = 3, .div = 3, },
+};
+
+#define SUN4I_AHB_REG 0x054
+static struct ccu_mux cpu_clk = {
+ .mux = {
+ .shift = 16,
+ .width = 2,
+ .fixed_predivs = cpu_predivs,
+ .n_predivs = ARRAY_SIZE(cpu_predivs),
+ },
+ .common = {
+ .reg = 0x054,
+ .features = CCU_FEATURE_FIXED_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("cpu",
+ cpu_parents,
+ &ccu_mux_ops,
+ CLK_IS_CRITICAL),
+ }
+};
+
+static SUNXI_CCU_M(axi_clk, "axi", "cpu", 0x054, 0, 2, 0);
+
+static struct ccu_div ahb_sun4i_clk = {
+ .div = _SUNXI_CCU_DIV_FLAGS(4, 2, CLK_DIVIDER_POWER_OF_TWO),
+ .common = {
+ .reg = 0x054,
+ .hw.init = CLK_HW_INIT("ahb", "axi", &ccu_div_ops, 0),
+ },
+};
+
+static const char *const ahb_sun7i_parents[] = { "axi", "pll-periph",
+ "pll-periph" };
+static const struct ccu_mux_fixed_prediv ahb_sun7i_predivs[] = {
+ { .index = 1, .div = 2, },
+ { /* Sentinel */ },
+};
+static struct ccu_div ahb_sun7i_clk = {
+ .div = _SUNXI_CCU_DIV_FLAGS(4, 2, CLK_DIVIDER_POWER_OF_TWO),
+ .mux = {
+ .shift = 6,
+ .width = 2,
+ .fixed_predivs = ahb_sun7i_predivs,
+ .n_predivs = ARRAY_SIZE(ahb_sun7i_predivs),
+ },
+
+ .common = {
+ .reg = 0x054,
+ .hw.init = CLK_HW_INIT_PARENTS("ahb",
+ ahb_sun7i_parents,
+ &ccu_div_ops,
+ 0),
+ },
+};
+
+static struct clk_div_table apb0_div_table[] = {
+ { .val = 0, .div = 2 },
+ { .val = 1, .div = 2 },
+ { .val = 2, .div = 4 },
+ { .val = 3, .div = 8 },
+ { /* Sentinel */ },
+};
+static SUNXI_CCU_DIV_TABLE(apb0_clk, "apb0", "ahb",
+ 0x054, 8, 2, apb0_div_table, 0);
+
+static const char *const apb1_parents[] = { "hosc", "pll-periph", "osc32k" };
+static SUNXI_CCU_MP_WITH_MUX(apb1_clk, "apb1", apb1_parents, 0x058,
+ 0, 5, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ 0);
+
+/* Not present on A20 */
+static SUNXI_CCU_GATE(axi_dram_clk, "axi-dram", "ahb",
+ 0x05c, BIT(31), 0);
+
+static SUNXI_CCU_GATE(ahb_otg_clk, "ahb-otg", "ahb",
+ 0x060, BIT(0), 0);
+static SUNXI_CCU_GATE(ahb_ehci0_clk, "ahb-ehci0", "ahb",
+ 0x060, BIT(1), 0);
+static SUNXI_CCU_GATE(ahb_ohci0_clk, "ahb-ohci0", "ahb",
+ 0x060, BIT(2), 0);
+static SUNXI_CCU_GATE(ahb_ehci1_clk, "ahb-ehci1", "ahb",
+ 0x060, BIT(3), 0);
+static SUNXI_CCU_GATE(ahb_ohci1_clk, "ahb-ohci1", "ahb",
+ 0x060, BIT(4), 0);
+static SUNXI_CCU_GATE(ahb_ss_clk, "ahb-ss", "ahb",
+ 0x060, BIT(5), 0);
+static SUNXI_CCU_GATE(ahb_dma_clk, "ahb-dma", "ahb",
+ 0x060, BIT(6), 0);
+static SUNXI_CCU_GATE(ahb_bist_clk, "ahb-bist", "ahb",
+ 0x060, BIT(7), 0);
+static SUNXI_CCU_GATE(ahb_mmc0_clk, "ahb-mmc0", "ahb",
+ 0x060, BIT(8), 0);
+static SUNXI_CCU_GATE(ahb_mmc1_clk, "ahb-mmc1", "ahb",
+ 0x060, BIT(9), 0);
+static SUNXI_CCU_GATE(ahb_mmc2_clk, "ahb-mmc2", "ahb",
+ 0x060, BIT(10), 0);
+static SUNXI_CCU_GATE(ahb_mmc3_clk, "ahb-mmc3", "ahb",
+ 0x060, BIT(11), 0);
+static SUNXI_CCU_GATE(ahb_ms_clk, "ahb-ms", "ahb",
+ 0x060, BIT(12), 0);
+static SUNXI_CCU_GATE(ahb_nand_clk, "ahb-nand", "ahb",
+ 0x060, BIT(13), 0);
+static SUNXI_CCU_GATE(ahb_sdram_clk, "ahb-sdram", "ahb",
+ 0x060, BIT(14), CLK_IS_CRITICAL);
+
+static SUNXI_CCU_GATE(ahb_ace_clk, "ahb-ace", "ahb",
+ 0x060, BIT(16), 0);
+static SUNXI_CCU_GATE(ahb_emac_clk, "ahb-emac", "ahb",
+ 0x060, BIT(17), 0);
+static SUNXI_CCU_GATE(ahb_ts_clk, "ahb-ts", "ahb",
+ 0x060, BIT(18), 0);
+static SUNXI_CCU_GATE(ahb_spi0_clk, "ahb-spi0", "ahb",
+ 0x060, BIT(20), 0);
+static SUNXI_CCU_GATE(ahb_spi1_clk, "ahb-spi1", "ahb",
+ 0x060, BIT(21), 0);
+static SUNXI_CCU_GATE(ahb_spi2_clk, "ahb-spi2", "ahb",
+ 0x060, BIT(22), 0);
+static SUNXI_CCU_GATE(ahb_spi3_clk, "ahb-spi3", "ahb",
+ 0x060, BIT(23), 0);
+static SUNXI_CCU_GATE(ahb_pata_clk, "ahb-pata", "ahb",
+ 0x060, BIT(24), 0);
+/* Not documented on A20 */
+static SUNXI_CCU_GATE(ahb_sata_clk, "ahb-sata", "ahb",
+ 0x060, BIT(25), 0);
+/* Not present on A20 */
+static SUNXI_CCU_GATE(ahb_gps_clk, "ahb-gps", "ahb",
+ 0x060, BIT(26), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(ahb_hstimer_clk, "ahb-hstimer", "ahb",
+ 0x060, BIT(28), 0);
+
+static SUNXI_CCU_GATE(ahb_ve_clk, "ahb-ve", "ahb",
+ 0x064, BIT(0), 0);
+static SUNXI_CCU_GATE(ahb_tvd_clk, "ahb-tvd", "ahb",
+ 0x064, BIT(1), 0);
+static SUNXI_CCU_GATE(ahb_tve0_clk, "ahb-tve0", "ahb",
+ 0x064, BIT(2), 0);
+static SUNXI_CCU_GATE(ahb_tve1_clk, "ahb-tve1", "ahb",
+ 0x064, BIT(3), 0);
+static SUNXI_CCU_GATE(ahb_lcd0_clk, "ahb-lcd0", "ahb",
+ 0x064, BIT(4), 0);
+static SUNXI_CCU_GATE(ahb_lcd1_clk, "ahb-lcd1", "ahb",
+ 0x064, BIT(5), 0);
+static SUNXI_CCU_GATE(ahb_csi0_clk, "ahb-csi0", "ahb",
+ 0x064, BIT(8), 0);
+static SUNXI_CCU_GATE(ahb_csi1_clk, "ahb-csi1", "ahb",
+ 0x064, BIT(9), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(ahb_hdmi1_clk, "ahb-hdmi1", "ahb",
+ 0x064, BIT(10), 0);
+static SUNXI_CCU_GATE(ahb_hdmi0_clk, "ahb-hdmi0", "ahb",
+ 0x064, BIT(11), 0);
+static SUNXI_CCU_GATE(ahb_de_be0_clk, "ahb-de-be0", "ahb",
+ 0x064, BIT(12), 0);
+static SUNXI_CCU_GATE(ahb_de_be1_clk, "ahb-de-be1", "ahb",
+ 0x064, BIT(13), 0);
+static SUNXI_CCU_GATE(ahb_de_fe0_clk, "ahb-de-fe0", "ahb",
+ 0x064, BIT(14), 0);
+static SUNXI_CCU_GATE(ahb_de_fe1_clk, "ahb-de-fe1", "ahb",
+ 0x064, BIT(15), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(ahb_gmac_clk, "ahb-gmac", "ahb",
+ 0x064, BIT(17), 0);
+static SUNXI_CCU_GATE(ahb_mp_clk, "ahb-mp", "ahb",
+ 0x064, BIT(18), 0);
+static SUNXI_CCU_GATE(ahb_gpu_clk, "ahb-gpu", "ahb",
+ 0x064, BIT(20), 0);
+
+static SUNXI_CCU_GATE(apb0_codec_clk, "apb0-codec", "apb0",
+ 0x068, BIT(0), 0);
+static SUNXI_CCU_GATE(apb0_spdif_clk, "apb0-spdif", "apb0",
+ 0x068, BIT(1), 0);
+static SUNXI_CCU_GATE(apb0_ac97_clk, "apb0-ac97", "apb0",
+ 0x068, BIT(2), 0);
+static SUNXI_CCU_GATE(apb0_i2s0_clk, "apb0-i2s0", "apb0",
+ 0x068, BIT(3), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(apb0_i2s1_clk, "apb0-i2s1", "apb0",
+ 0x068, BIT(4), 0);
+static SUNXI_CCU_GATE(apb0_pio_clk, "apb0-pio", "apb0",
+ 0x068, BIT(5), 0);
+static SUNXI_CCU_GATE(apb0_ir0_clk, "apb0-ir0", "apb0",
+ 0x068, BIT(6), 0);
+static SUNXI_CCU_GATE(apb0_ir1_clk, "apb0-ir1", "apb0",
+ 0x068, BIT(7), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(apb0_i2s2_clk, "apb0-i2s2", "apb0",
+ 0x068, BIT(8), 0);
+static SUNXI_CCU_GATE(apb0_keypad_clk, "apb0-keypad", "apb0",
+ 0x068, BIT(10), 0);
+
+static SUNXI_CCU_GATE(apb1_i2c0_clk, "apb1-i2c0", "apb1",
+ 0x06c, BIT(0), 0);
+static SUNXI_CCU_GATE(apb1_i2c1_clk, "apb1-i2c1", "apb1",
+ 0x06c, BIT(1), 0);
+static SUNXI_CCU_GATE(apb1_i2c2_clk, "apb1-i2c2", "apb1",
+ 0x06c, BIT(2), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(apb1_i2c3_clk, "apb1-i2c3", "apb1",
+ 0x06c, BIT(3), 0);
+static SUNXI_CCU_GATE(apb1_can_clk, "apb1-can", "apb1",
+ 0x06c, BIT(4), 0);
+static SUNXI_CCU_GATE(apb1_scr_clk, "apb1-scr", "apb1",
+ 0x06c, BIT(5), 0);
+static SUNXI_CCU_GATE(apb1_ps20_clk, "apb1-ps20", "apb1",
+ 0x06c, BIT(6), 0);
+static SUNXI_CCU_GATE(apb1_ps21_clk, "apb1-ps21", "apb1",
+ 0x06c, BIT(7), 0);
+/* Not present on A10 */
+static SUNXI_CCU_GATE(apb1_i2c4_clk, "apb1-i2c4", "apb1",
+ 0x06c, BIT(15), 0);
+static SUNXI_CCU_GATE(apb1_uart0_clk, "apb1-uart0", "apb1",
+ 0x06c, BIT(16), 0);
+static SUNXI_CCU_GATE(apb1_uart1_clk, "apb1-uart1", "apb1",
+ 0x06c, BIT(17), 0);
+static SUNXI_CCU_GATE(apb1_uart2_clk, "apb1-uart2", "apb1",
+ 0x06c, BIT(18), 0);
+static SUNXI_CCU_GATE(apb1_uart3_clk, "apb1-uart3", "apb1",
+ 0x06c, BIT(19), 0);
+static SUNXI_CCU_GATE(apb1_uart4_clk, "apb1-uart4", "apb1",
+ 0x06c, BIT(20), 0);
+static SUNXI_CCU_GATE(apb1_uart5_clk, "apb1-uart5", "apb1",
+ 0x06c, BIT(21), 0);
+static SUNXI_CCU_GATE(apb1_uart6_clk, "apb1-uart6", "apb1",
+ 0x06c, BIT(22), 0);
+static SUNXI_CCU_GATE(apb1_uart7_clk, "apb1-uart7", "apb1",
+ 0x06c, BIT(23), 0);
+
+static const char *const mod0_default_parents[] = { "hosc", "pll-periph",
+ "pll-ddr-other" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(nand_clk, "nand", mod0_default_parents, 0x080,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* Undocumented on A10 */
+static SUNXI_CCU_MP_WITH_MUX_GATE(ms_clk, "ms", mod0_default_parents, 0x084,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc0_clk, "mmc0", mod0_default_parents, 0x088,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* MMC output and sample clocks are not present on A10 */
+static SUNXI_CCU_PHASE(mmc0_output_clk, "mmc0_output", "mmc0",
+ 0x088, 8, 3, 0);
+static SUNXI_CCU_PHASE(mmc0_sample_clk, "mmc0_sample", "mmc0",
+ 0x088, 20, 3, 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc1_clk, "mmc1", mod0_default_parents, 0x08c,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* MMC output and sample clocks are not present on A10 */
+static SUNXI_CCU_PHASE(mmc1_output_clk, "mmc1_output", "mmc1",
+ 0x08c, 8, 3, 0);
+static SUNXI_CCU_PHASE(mmc1_sample_clk, "mmc1_sample", "mmc1",
+ 0x08c, 20, 3, 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc2_clk, "mmc2", mod0_default_parents, 0x090,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* MMC output and sample clocks are not present on A10 */
+static SUNXI_CCU_PHASE(mmc2_output_clk, "mmc2_output", "mmc2",
+ 0x090, 8, 3, 0);
+static SUNXI_CCU_PHASE(mmc2_sample_clk, "mmc2_sample", "mmc2",
+ 0x090, 20, 3, 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc3_clk, "mmc3", mod0_default_parents, 0x094,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* MMC output and sample clocks are not present on A10 */
+static SUNXI_CCU_PHASE(mmc3_output_clk, "mmc3_output", "mmc3",
+ 0x094, 8, 3, 0);
+static SUNXI_CCU_PHASE(mmc3_sample_clk, "mmc3_sample", "mmc3",
+ 0x094, 20, 3, 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(ts_clk, "ts", mod0_default_parents, 0x098,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(ss_clk, "ss", mod0_default_parents, 0x09c,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi0_clk, "spi0", mod0_default_parents, 0x0a0,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", mod0_default_parents, 0x0a4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi2_clk, "spi2", mod0_default_parents, 0x0a8,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* Undocumented on A10 */
+static SUNXI_CCU_MP_WITH_MUX_GATE(pata_clk, "pata", mod0_default_parents, 0x0ac,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* TODO: Check whether A10 actually supports osc32k as 4th parent? */
+static const char *const ir_parents_sun4i[] = { "hosc", "pll-periph",
+ "pll-ddr-other" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir0_sun4i_clk, "ir0", ir_parents_sun4i, 0x0b0,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir1_sun4i_clk, "ir1", ir_parents_sun4i, 0x0b4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+static const char *const ir_parents_sun7i[] = { "hosc", "pll-periph",
+ "pll-ddr-other", "osc32k" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir0_sun7i_clk, "ir0", ir_parents_sun7i, 0x0b0,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir1_sun7i_clk, "ir1", ir_parents_sun7i, 0x0b4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static const char *const audio_parents[] = { "pll-audio-8x", "pll-audio-4x",
+ "pll-audio-2x", "pll-audio" };
+static SUNXI_CCU_MUX_WITH_GATE(i2s0_clk, "i2s0", audio_parents,
+ 0x0b8, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_MUX_WITH_GATE(ac97_clk, "ac97", audio_parents,
+ 0x0bc, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+/* Undocumented on A10 */
+static SUNXI_CCU_MUX_WITH_GATE(spdif_clk, "spdif", audio_parents,
+ 0x0c0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static const char *const keypad_parents[] = { "hosc", "losc"};
+static const u8 keypad_table[] = { 0, 2 };
+static struct ccu_mp keypad_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(0, 5),
+ .p = _SUNXI_CCU_DIV(16, 2),
+ .mux = _SUNXI_CCU_MUX_TABLE(24, 2, keypad_table),
+ .common = {
+ .reg = 0x0c4,
+ .hw.init = CLK_HW_INIT_PARENTS("keypad",
+ keypad_parents,
+ &ccu_mp_ops,
+ 0),
+ },
+};
+
+/*
+ * SATA supports external clock as parent via BIT(24) and is probably an
+ * optional crystal or oscillator that can be connected to the
+ * SATA-CLKM / SATA-CLKP pins.
+ */
+static const char *const sata_parents[] = {"pll-periph-sata", "sata-ext"};
+static SUNXI_CCU_MUX_WITH_GATE(sata_clk, "sata", sata_parents,
+ 0x0c8, 24, 1, BIT(31), CLK_SET_RATE_PARENT);
+
+
+static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "pll-periph",
+ 0x0cc, BIT(6), 0);
+static SUNXI_CCU_GATE(usb_ohci1_clk, "usb-ohci1", "pll-periph",
+ 0x0cc, BIT(7), 0);
+static SUNXI_CCU_GATE(usb_phy_clk, "usb-phy", "pll-periph",
+ 0x0cc, BIT(8), 0);
+
+/* TODO: GPS CLK 0x0d0 */
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi3_clk, "spi3", mod0_default_parents, 0x0d4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+/* Not present on A10 */
+static SUNXI_CCU_MUX_WITH_GATE(i2s1_clk, "i2s1", audio_parents,
+ 0x0d8, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+/* Not present on A10 */
+static SUNXI_CCU_MUX_WITH_GATE(i2s2_clk, "i2s2", audio_parents,
+ 0x0dc, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_GATE(dram_ve_clk, "dram-ve", "pll-ddr",
+ 0x100, BIT(0), 0);
+static SUNXI_CCU_GATE(dram_csi0_clk, "dram-csi0", "pll-ddr",
+ 0x100, BIT(1), 0);
+static SUNXI_CCU_GATE(dram_csi1_clk, "dram-csi1", "pll-ddr",
+ 0x100, BIT(2), 0);
+static SUNXI_CCU_GATE(dram_ts_clk, "dram-ts", "pll-ddr",
+ 0x100, BIT(3), 0);
+static SUNXI_CCU_GATE(dram_tvd_clk, "dram-tvd", "pll-ddr",
+ 0x100, BIT(4), 0);
+static SUNXI_CCU_GATE(dram_tve0_clk, "dram-tve0", "pll-ddr",
+ 0x100, BIT(5), 0);
+static SUNXI_CCU_GATE(dram_tve1_clk, "dram-tve1", "pll-ddr",
+ 0x100, BIT(6), 0);
+
+/* Clock seems to be critical only on sun4i */
+static SUNXI_CCU_GATE(dram_out_clk, "dram-out", "pll-ddr",
+ 0x100, BIT(15), CLK_IS_CRITICAL);
+static SUNXI_CCU_GATE(dram_de_fe1_clk, "dram-de-fe1", "pll-ddr",
+ 0x100, BIT(24), 0);
+static SUNXI_CCU_GATE(dram_de_fe0_clk, "dram-de-fe0", "pll-ddr",
+ 0x100, BIT(25), 0);
+static SUNXI_CCU_GATE(dram_de_be0_clk, "dram-de-be0", "pll-ddr",
+ 0x100, BIT(26), 0);
+static SUNXI_CCU_GATE(dram_de_be1_clk, "dram-de-be1", "pll-ddr",
+ 0x100, BIT(27), 0);
+static SUNXI_CCU_GATE(dram_mp_clk, "dram-mp", "pll-ddr",
+ 0x100, BIT(28), 0);
+static SUNXI_CCU_GATE(dram_ace_clk, "dram-ace", "pll-ddr",
+ 0x100, BIT(29), 0);
+
+static const char *const de_parents[] = { "pll-video0", "pll-video1",
+ "pll-ddr-other" };
+static SUNXI_CCU_M_WITH_MUX_GATE(de_be0_clk, "de-be0", de_parents,
+ 0x104, 0, 4, 24, 2, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(de_be1_clk, "de-be1", de_parents,
+ 0x108, 0, 4, 24, 2, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(de_fe0_clk, "de-fe0", de_parents,
+ 0x10c, 0, 4, 24, 2, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(de_fe1_clk, "de-fe1", de_parents,
+ 0x110, 0, 4, 24, 2, BIT(31), 0);
+
+/* Undocumented on A10 */
+static SUNXI_CCU_M_WITH_MUX_GATE(de_mp_clk, "de-mp", de_parents,
+ 0x114, 0, 4, 24, 2, BIT(31), 0);
+
+static const char *const disp_parents[] = { "pll-video0", "pll-video1",
+ "pll-video0-2x", "pll-video1-2x" };
+static SUNXI_CCU_MUX_WITH_GATE(tcon0_ch0_clk, "tcon0-ch0-sclk", disp_parents,
+ 0x118, 24, 2, BIT(31), CLK_SET_RATE_PARENT);
+static SUNXI_CCU_MUX_WITH_GATE(tcon1_ch0_clk, "tcon1-ch0-sclk", disp_parents,
+ 0x11c, 24, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static const char *const csi_sclk_parents[] = { "pll-video0", "pll-ve",
+ "pll-ddr-other", "pll-periph" };
+
+static SUNXI_CCU_M_WITH_MUX_GATE(csi_sclk_clk, "csi-sclk",
+ csi_sclk_parents,
+ 0x120, 0, 4, 24, 2, BIT(31), 0);
+
+/* TVD clock setup for A10 */
+static const char *const tvd_parents[] = { "pll-video0", "pll-video1" };
+static SUNXI_CCU_MUX_WITH_GATE(tvd_sun4i_clk, "tvd", tvd_parents,
+ 0x128, 24, 1, BIT(31), 0);
+
+/* TVD clock setup for A20 */
+static SUNXI_CCU_MP_WITH_MUX_GATE(tvd_sclk2_sun7i_clk,
+ "tvd-sclk2", tvd_parents,
+ 0x128,
+ 0, 4, /* M */
+ 16, 4, /* P */
+ 8, 1, /* mux */
+ BIT(15), /* gate */
+ 0);
+
+static SUNXI_CCU_M_WITH_GATE(tvd_sclk1_sun7i_clk, "tvd-sclk1", "tvd-sclk2",
+ 0x128, 0, 4, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(tcon0_ch1_sclk2_clk, "tcon0-ch1-sclk2",
+ disp_parents,
+ 0x12c, 0, 4, 24, 2, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_M_WITH_GATE(tcon0_ch1_clk,
+ "tcon0-ch1-sclk1", "tcon0-ch1-sclk2",
+ 0x12c, 11, 1, BIT(15),
+ CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(tcon1_ch1_sclk2_clk, "tcon1-ch1-sclk2",
+ disp_parents,
+ 0x130, 0, 4, 24, 2, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_M_WITH_GATE(tcon1_ch1_clk,
+ "tcon1-ch1-sclk1", "tcon1-ch1-sclk2",
+ 0x130, 11, 1, BIT(15),
+ CLK_SET_RATE_PARENT);
+
+static const char *const csi_parents[] = { "hosc", "pll-video0", "pll-video1",
+ "pll-video0-2x", "pll-video1-2x"};
+static const u8 csi_table[] = { 0, 1, 2, 5, 6};
+static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(csi0_clk, "csi0",
+ csi_parents, csi_table,
+ 0x134, 0, 5, 24, 3, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(csi1_clk, "csi1",
+ csi_parents, csi_table,
+ 0x138, 0, 5, 24, 3, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_GATE(ve_clk, "ve", "pll-ve", 0x13c, 16, 8, BIT(31), 0);
+
+static SUNXI_CCU_GATE(codec_clk, "codec", "pll-audio",
+ 0x140, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_GATE(avs_clk, "avs", "hosc", 0x144, BIT(31), 0);
+
+static const char *const ace_parents[] = { "pll-ve", "pll-ddr-other" };
+static SUNXI_CCU_M_WITH_MUX_GATE(ace_clk, "ace", ace_parents,
+ 0x148, 0, 4, 24, 1, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", disp_parents,
+ 0x150, 0, 4, 24, 2, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static const char *const gpu_parents_sun4i[] = { "pll-video0", "pll-ve",
+ "pll-ddr-other",
+ "pll-video1" };
+static SUNXI_CCU_M_WITH_MUX_GATE(gpu_sun4i_clk, "gpu", gpu_parents_sun4i,
+ 0x154, 0, 4, 24, 2, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static const char *const gpu_parents_sun7i[] = { "pll-video0", "pll-ve",
+ "pll-ddr-other", "pll-video1",
+ "pll-gpu" };
+static const u8 gpu_table_sun7i[] = { 0, 1, 2, 3, 4 };
+static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(gpu_sun7i_clk, "gpu",
+ gpu_parents_sun7i, gpu_table_sun7i,
+ 0x154, 0, 4, 24, 3, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static const char *const mbus_sun4i_parents[] = { "hosc", "pll-periph",
+ "pll-ddr-other" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(mbus_sun4i_clk, "mbus", mbus_sun4i_parents,
+ 0x15c, 0, 4, 16, 2, 24, 2, BIT(31),
+ 0);
+static const char *const mbus_sun7i_parents[] = { "hosc", "pll-periph-base",
+ "pll-ddr-other" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(mbus_sun7i_clk, "mbus", mbus_sun7i_parents,
+ 0x15c, 0, 4, 16, 2, 24, 2, BIT(31),
+ CLK_IS_CRITICAL);
+
+static SUNXI_CCU_GATE(hdmi1_slow_clk, "hdmi1-slow", "hosc", 0x178, BIT(31), 0);
+
+static const char *const hdmi1_parents[] = { "pll-video0", "pll-video1" };
+static const u8 hdmi1_table[] = { 0, 1};
+static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(hdmi1_clk, "hdmi1",
+ hdmi1_parents, hdmi1_table,
+ 0x17c, 0, 4, 24, 2, BIT(31),
+ CLK_SET_RATE_PARENT);
+
+static const char *const out_parents[] = { "hosc", "osc32k", "hosc" };
+static const struct ccu_mux_fixed_prediv clk_out_predivs[] = {
+ { .index = 0, .div = 750, },
+};
+
+static struct ccu_mp out_a_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(8, 5),
+ .p = _SUNXI_CCU_DIV(20, 2),
+ .mux = {
+ .shift = 24,
+ .width = 2,
+ .fixed_predivs = clk_out_predivs,
+ .n_predivs = ARRAY_SIZE(clk_out_predivs),
+ },
+ .common = {
+ .reg = 0x1f0,
+ .features = CCU_FEATURE_FIXED_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("out-a",
+ out_parents,
+ &ccu_mp_ops,
+ 0),
+ },
+};
+static struct ccu_mp out_b_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(8, 5),
+ .p = _SUNXI_CCU_DIV(20, 2),
+ .mux = {
+ .shift = 24,
+ .width = 2,
+ .fixed_predivs = clk_out_predivs,
+ .n_predivs = ARRAY_SIZE(clk_out_predivs),
+ },
+ .common = {
+ .reg = 0x1f4,
+ .features = CCU_FEATURE_FIXED_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("out-b",
+ out_parents,
+ &ccu_mp_ops,
+ 0),
+ },
+};
+
+static struct ccu_common *sun4i_sun7i_ccu_clks[] = {
+ &hosc_clk.common,
+ &pll_core_clk.common,
+ &pll_audio_base_clk.common,
+ &pll_video0_clk.common,
+ &pll_ve_sun4i_clk.common,
+ &pll_ve_sun7i_clk.common,
+ &pll_ddr_base_clk.common,
+ &pll_ddr_clk.common,
+ &pll_ddr_other_clk.common,
+ &pll_periph_base_clk.common,
+ &pll_periph_sata_clk.common,
+ &pll_video1_clk.common,
+ &pll_gpu_clk.common,
+ &cpu_clk.common,
+ &axi_clk.common,
+ &axi_dram_clk.common,
+ &ahb_sun4i_clk.common,
+ &ahb_sun7i_clk.common,
+ &apb0_clk.common,
+ &apb1_clk.common,
+ &ahb_otg_clk.common,
+ &ahb_ehci0_clk.common,
+ &ahb_ohci0_clk.common,
+ &ahb_ehci1_clk.common,
+ &ahb_ohci1_clk.common,
+ &ahb_ss_clk.common,
+ &ahb_dma_clk.common,
+ &ahb_bist_clk.common,
+ &ahb_mmc0_clk.common,
+ &ahb_mmc1_clk.common,
+ &ahb_mmc2_clk.common,
+ &ahb_mmc3_clk.common,
+ &ahb_ms_clk.common,
+ &ahb_nand_clk.common,
+ &ahb_sdram_clk.common,
+ &ahb_ace_clk.common,
+ &ahb_emac_clk.common,
+ &ahb_ts_clk.common,
+ &ahb_spi0_clk.common,
+ &ahb_spi1_clk.common,
+ &ahb_spi2_clk.common,
+ &ahb_spi3_clk.common,
+ &ahb_pata_clk.common,
+ &ahb_sata_clk.common,
+ &ahb_gps_clk.common,
+ &ahb_hstimer_clk.common,
+ &ahb_ve_clk.common,
+ &ahb_tvd_clk.common,
+ &ahb_tve0_clk.common,
+ &ahb_tve1_clk.common,
+ &ahb_lcd0_clk.common,
+ &ahb_lcd1_clk.common,
+ &ahb_csi0_clk.common,
+ &ahb_csi1_clk.common,
+ &ahb_hdmi1_clk.common,
+ &ahb_hdmi0_clk.common,
+ &ahb_de_be0_clk.common,
+ &ahb_de_be1_clk.common,
+ &ahb_de_fe0_clk.common,
+ &ahb_de_fe1_clk.common,
+ &ahb_gmac_clk.common,
+ &ahb_mp_clk.common,
+ &ahb_gpu_clk.common,
+ &apb0_codec_clk.common,
+ &apb0_spdif_clk.common,
+ &apb0_ac97_clk.common,
+ &apb0_i2s0_clk.common,
+ &apb0_i2s1_clk.common,
+ &apb0_pio_clk.common,
+ &apb0_ir0_clk.common,
+ &apb0_ir1_clk.common,
+ &apb0_i2s2_clk.common,
+ &apb0_keypad_clk.common,
+ &apb1_i2c0_clk.common,
+ &apb1_i2c1_clk.common,
+ &apb1_i2c2_clk.common,
+ &apb1_i2c3_clk.common,
+ &apb1_can_clk.common,
+ &apb1_scr_clk.common,
+ &apb1_ps20_clk.common,
+ &apb1_ps21_clk.common,
+ &apb1_i2c4_clk.common,
+ &apb1_uart0_clk.common,
+ &apb1_uart1_clk.common,
+ &apb1_uart2_clk.common,
+ &apb1_uart3_clk.common,
+ &apb1_uart4_clk.common,
+ &apb1_uart5_clk.common,
+ &apb1_uart6_clk.common,
+ &apb1_uart7_clk.common,
+ &nand_clk.common,
+ &ms_clk.common,
+ &mmc0_clk.common,
+ &mmc0_output_clk.common,
+ &mmc0_sample_clk.common,
+ &mmc1_clk.common,
+ &mmc1_output_clk.common,
+ &mmc1_sample_clk.common,
+ &mmc2_clk.common,
+ &mmc2_output_clk.common,
+ &mmc2_sample_clk.common,
+ &mmc3_clk.common,
+ &mmc3_output_clk.common,
+ &mmc3_sample_clk.common,
+ &ts_clk.common,
+ &ss_clk.common,
+ &spi0_clk.common,
+ &spi1_clk.common,
+ &spi2_clk.common,
+ &pata_clk.common,
+ &ir0_sun4i_clk.common,
+ &ir1_sun4i_clk.common,
+ &ir0_sun7i_clk.common,
+ &ir1_sun7i_clk.common,
+ &i2s0_clk.common,
+ &ac97_clk.common,
+ &spdif_clk.common,
+ &keypad_clk.common,
+ &sata_clk.common,
+ &usb_ohci0_clk.common,
+ &usb_ohci1_clk.common,
+ &usb_phy_clk.common,
+ &spi3_clk.common,
+ &i2s1_clk.common,
+ &i2s2_clk.common,
+ &dram_ve_clk.common,
+ &dram_csi0_clk.common,
+ &dram_csi1_clk.common,
+ &dram_ts_clk.common,
+ &dram_tvd_clk.common,
+ &dram_tve0_clk.common,
+ &dram_tve1_clk.common,
+ &dram_out_clk.common,
+ &dram_de_fe1_clk.common,
+ &dram_de_fe0_clk.common,
+ &dram_de_be0_clk.common,
+ &dram_de_be1_clk.common,
+ &dram_mp_clk.common,
+ &dram_ace_clk.common,
+ &de_be0_clk.common,
+ &de_be1_clk.common,
+ &de_fe0_clk.common,
+ &de_fe1_clk.common,
+ &de_mp_clk.common,
+ &tcon0_ch0_clk.common,
+ &tcon1_ch0_clk.common,
+ &csi_sclk_clk.common,
+ &tvd_sun4i_clk.common,
+ &tvd_sclk1_sun7i_clk.common,
+ &tvd_sclk2_sun7i_clk.common,
+ &tcon0_ch1_sclk2_clk.common,
+ &tcon0_ch1_clk.common,
+ &tcon1_ch1_sclk2_clk.common,
+ &tcon1_ch1_clk.common,
+ &csi0_clk.common,
+ &csi1_clk.common,
+ &ve_clk.common,
+ &codec_clk.common,
+ &avs_clk.common,
+ &ace_clk.common,
+ &hdmi_clk.common,
+ &gpu_sun4i_clk.common,
+ &gpu_sun7i_clk.common,
+ &mbus_sun4i_clk.common,
+ &mbus_sun7i_clk.common,
+ &hdmi1_slow_clk.common,
+ &hdmi1_clk.common,
+ &out_a_clk.common,
+ &out_b_clk.common
+};
+
+/* Post-divider for pll-audio is hardcoded to 4 */
+static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio",
+ "pll-audio-base", 4, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_2x_clk, "pll-audio-2x",
+ "pll-audio-base", 2, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_4x_clk, "pll-audio-4x",
+ "pll-audio-base", 1, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_8x_clk, "pll-audio-8x",
+ "pll-audio-base", 1, 2, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_video0_2x_clk, "pll-video0-2x",
+ "pll-video0", 1, 2, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_video1_2x_clk, "pll-video1-2x",
+ "pll-video1", 1, 2, CLK_SET_RATE_PARENT);
+
+
+static struct clk_hw_onecell_data sun4i_a10_hw_clks = {
+ .hws = {
+ [CLK_HOSC] = &hosc_clk.common.hw,
+ [CLK_PLL_CORE] = &pll_core_clk.common.hw,
+ [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw,
+ [CLK_PLL_AUDIO] = &pll_audio_clk.hw,
+ [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw,
+ [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw,
+ [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw,
+ [CLK_PLL_VIDEO0] = &pll_video0_clk.common.hw,
+ [CLK_PLL_VIDEO0_2X] = &pll_video0_2x_clk.hw,
+ [CLK_PLL_VE] = &pll_ve_sun4i_clk.common.hw,
+ [CLK_PLL_DDR_BASE] = &pll_ddr_base_clk.common.hw,
+ [CLK_PLL_DDR] = &pll_ddr_clk.common.hw,
+ [CLK_PLL_DDR_OTHER] = &pll_ddr_other_clk.common.hw,
+ [CLK_PLL_PERIPH_BASE] = &pll_periph_base_clk.common.hw,
+ [CLK_PLL_PERIPH] = &pll_periph_clk.hw,
+ [CLK_PLL_PERIPH_SATA] = &pll_periph_sata_clk.common.hw,
+ [CLK_PLL_VIDEO1] = &pll_video1_clk.common.hw,
+ [CLK_PLL_VIDEO1_2X] = &pll_video1_2x_clk.hw,
+ [CLK_CPU] = &cpu_clk.common.hw,
+ [CLK_AXI] = &axi_clk.common.hw,
+ [CLK_AXI_DRAM] = &axi_dram_clk.common.hw,
+ [CLK_AHB] = &ahb_sun4i_clk.common.hw,
+ [CLK_APB0] = &apb0_clk.common.hw,
+ [CLK_APB1] = &apb1_clk.common.hw,
+ [CLK_AHB_OTG] = &ahb_otg_clk.common.hw,
+ [CLK_AHB_EHCI0] = &ahb_ehci0_clk.common.hw,
+ [CLK_AHB_OHCI0] = &ahb_ohci0_clk.common.hw,
+ [CLK_AHB_EHCI1] = &ahb_ehci1_clk.common.hw,
+ [CLK_AHB_OHCI1] = &ahb_ohci1_clk.common.hw,
+ [CLK_AHB_SS] = &ahb_ss_clk.common.hw,
+ [CLK_AHB_DMA] = &ahb_dma_clk.common.hw,
+ [CLK_AHB_BIST] = &ahb_bist_clk.common.hw,
+ [CLK_AHB_MMC0] = &ahb_mmc0_clk.common.hw,
+ [CLK_AHB_MMC1] = &ahb_mmc1_clk.common.hw,
+ [CLK_AHB_MMC2] = &ahb_mmc2_clk.common.hw,
+ [CLK_AHB_MMC3] = &ahb_mmc3_clk.common.hw,
+ [CLK_AHB_MS] = &ahb_ms_clk.common.hw,
+ [CLK_AHB_NAND] = &ahb_nand_clk.common.hw,
+ [CLK_AHB_SDRAM] = &ahb_sdram_clk.common.hw,
+ [CLK_AHB_ACE] = &ahb_ace_clk.common.hw,
+ [CLK_AHB_EMAC] = &ahb_emac_clk.common.hw,
+ [CLK_AHB_TS] = &ahb_ts_clk.common.hw,
+ [CLK_AHB_SPI0] = &ahb_spi0_clk.common.hw,
+ [CLK_AHB_SPI1] = &ahb_spi1_clk.common.hw,
+ [CLK_AHB_SPI2] = &ahb_spi2_clk.common.hw,
+ [CLK_AHB_SPI3] = &ahb_spi3_clk.common.hw,
+ [CLK_AHB_PATA] = &ahb_pata_clk.common.hw,
+ [CLK_AHB_SATA] = &ahb_sata_clk.common.hw,
+ [CLK_AHB_GPS] = &ahb_gps_clk.common.hw,
+ [CLK_AHB_VE] = &ahb_ve_clk.common.hw,
+ [CLK_AHB_TVD] = &ahb_tvd_clk.common.hw,
+ [CLK_AHB_TVE0] = &ahb_tve0_clk.common.hw,
+ [CLK_AHB_TVE1] = &ahb_tve1_clk.common.hw,
+ [CLK_AHB_LCD0] = &ahb_lcd0_clk.common.hw,
+ [CLK_AHB_LCD1] = &ahb_lcd1_clk.common.hw,
+ [CLK_AHB_CSI0] = &ahb_csi0_clk.common.hw,
+ [CLK_AHB_CSI1] = &ahb_csi1_clk.common.hw,
+ [CLK_AHB_HDMI0] = &ahb_hdmi0_clk.common.hw,
+ [CLK_AHB_DE_BE0] = &ahb_de_be0_clk.common.hw,
+ [CLK_AHB_DE_BE1] = &ahb_de_be1_clk.common.hw,
+ [CLK_AHB_DE_FE0] = &ahb_de_fe0_clk.common.hw,
+ [CLK_AHB_DE_FE1] = &ahb_de_fe1_clk.common.hw,
+ [CLK_AHB_MP] = &ahb_mp_clk.common.hw,
+ [CLK_AHB_GPU] = &ahb_gpu_clk.common.hw,
+ [CLK_APB0_CODEC] = &apb0_codec_clk.common.hw,
+ [CLK_APB0_SPDIF] = &apb0_spdif_clk.common.hw,
+ [CLK_APB0_AC97] = &apb0_ac97_clk.common.hw,
+ [CLK_APB0_I2S0] = &apb0_i2s0_clk.common.hw,
+ [CLK_APB0_PIO] = &apb0_pio_clk.common.hw,
+ [CLK_APB0_IR0] = &apb0_ir0_clk.common.hw,
+ [CLK_APB0_IR1] = &apb0_ir1_clk.common.hw,
+ [CLK_APB0_KEYPAD] = &apb0_keypad_clk.common.hw,
+ [CLK_APB1_I2C0] = &apb1_i2c0_clk.common.hw,
+ [CLK_APB1_I2C1] = &apb1_i2c1_clk.common.hw,
+ [CLK_APB1_I2C2] = &apb1_i2c2_clk.common.hw,
+ [CLK_APB1_CAN] = &apb1_can_clk.common.hw,
+ [CLK_APB1_SCR] = &apb1_scr_clk.common.hw,
+ [CLK_APB1_PS20] = &apb1_ps20_clk.common.hw,
+ [CLK_APB1_PS21] = &apb1_ps21_clk.common.hw,
+ [CLK_APB1_UART0] = &apb1_uart0_clk.common.hw,
+ [CLK_APB1_UART1] = &apb1_uart1_clk.common.hw,
+ [CLK_APB1_UART2] = &apb1_uart2_clk.common.hw,
+ [CLK_APB1_UART3] = &apb1_uart3_clk.common.hw,
+ [CLK_APB1_UART4] = &apb1_uart4_clk.common.hw,
+ [CLK_APB1_UART5] = &apb1_uart5_clk.common.hw,
+ [CLK_APB1_UART6] = &apb1_uart6_clk.common.hw,
+ [CLK_APB1_UART7] = &apb1_uart7_clk.common.hw,
+ [CLK_NAND] = &nand_clk.common.hw,
+ [CLK_MS] = &ms_clk.common.hw,
+ [CLK_MMC0] = &mmc0_clk.common.hw,
+ [CLK_MMC1] = &mmc1_clk.common.hw,
+ [CLK_MMC2] = &mmc2_clk.common.hw,
+ [CLK_MMC3] = &mmc3_clk.common.hw,
+ [CLK_TS] = &ts_clk.common.hw,
+ [CLK_SS] = &ss_clk.common.hw,
+ [CLK_SPI0] = &spi0_clk.common.hw,
+ [CLK_SPI1] = &spi1_clk.common.hw,
+ [CLK_SPI2] = &spi2_clk.common.hw,
+ [CLK_PATA] = &pata_clk.common.hw,
+ [CLK_IR0] = &ir0_sun4i_clk.common.hw,
+ [CLK_IR1] = &ir1_sun4i_clk.common.hw,
+ [CLK_I2S0] = &i2s0_clk.common.hw,
+ [CLK_AC97] = &ac97_clk.common.hw,
+ [CLK_SPDIF] = &spdif_clk.common.hw,
+ [CLK_KEYPAD] = &keypad_clk.common.hw,
+ [CLK_SATA] = &sata_clk.common.hw,
+ [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw,
+ [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw,
+ [CLK_USB_PHY] = &usb_phy_clk.common.hw,
+ /* CLK_GPS is unimplemented */
+ [CLK_SPI3] = &spi3_clk.common.hw,
+ [CLK_DRAM_VE] = &dram_ve_clk.common.hw,
+ [CLK_DRAM_CSI0] = &dram_csi0_clk.common.hw,
+ [CLK_DRAM_CSI1] = &dram_csi1_clk.common.hw,
+ [CLK_DRAM_TS] = &dram_ts_clk.common.hw,
+ [CLK_DRAM_TVD] = &dram_tvd_clk.common.hw,
+ [CLK_DRAM_TVE0] = &dram_tve0_clk.common.hw,
+ [CLK_DRAM_TVE1] = &dram_tve1_clk.common.hw,
+ [CLK_DRAM_OUT] = &dram_out_clk.common.hw,
+ [CLK_DRAM_DE_FE1] = &dram_de_fe1_clk.common.hw,
+ [CLK_DRAM_DE_FE0] = &dram_de_fe0_clk.common.hw,
+ [CLK_DRAM_DE_BE0] = &dram_de_be0_clk.common.hw,
+ [CLK_DRAM_DE_BE1] = &dram_de_be1_clk.common.hw,
+ [CLK_DRAM_MP] = &dram_mp_clk.common.hw,
+ [CLK_DRAM_ACE] = &dram_ace_clk.common.hw,
+ [CLK_DE_BE0] = &de_be0_clk.common.hw,
+ [CLK_DE_BE1] = &de_be1_clk.common.hw,
+ [CLK_DE_FE0] = &de_fe0_clk.common.hw,
+ [CLK_DE_FE1] = &de_fe1_clk.common.hw,
+ [CLK_DE_MP] = &de_mp_clk.common.hw,
+ [CLK_TCON0_CH0] = &tcon0_ch0_clk.common.hw,
+ [CLK_TCON1_CH0] = &tcon1_ch0_clk.common.hw,
+ [CLK_CSI_SCLK] = &csi_sclk_clk.common.hw,
+ [CLK_TVD] = &tvd_sun4i_clk.common.hw,
+ [CLK_TCON0_CH1_SCLK2] = &tcon0_ch1_sclk2_clk.common.hw,
+ [CLK_TCON0_CH1] = &tcon0_ch1_clk.common.hw,
+ [CLK_TCON1_CH1_SCLK2] = &tcon1_ch1_sclk2_clk.common.hw,
+ [CLK_TCON1_CH1] = &tcon1_ch1_clk.common.hw,
+ [CLK_CSI0] = &csi0_clk.common.hw,
+ [CLK_CSI1] = &csi1_clk.common.hw,
+ [CLK_VE] = &ve_clk.common.hw,
+ [CLK_CODEC] = &codec_clk.common.hw,
+ [CLK_AVS] = &avs_clk.common.hw,
+ [CLK_ACE] = &ace_clk.common.hw,
+ [CLK_HDMI] = &hdmi_clk.common.hw,
+ [CLK_GPU] = &gpu_sun7i_clk.common.hw,
+ [CLK_MBUS] = &mbus_sun4i_clk.common.hw,
+ },
+ .num = CLK_NUMBER_SUN4I,
+};
+static struct clk_hw_onecell_data sun7i_a20_hw_clks = {
+ .hws = {
+ [CLK_HOSC] = &hosc_clk.common.hw,
+ [CLK_PLL_CORE] = &pll_core_clk.common.hw,
+ [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw,
+ [CLK_PLL_AUDIO] = &pll_audio_clk.hw,
+ [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw,
+ [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw,
+ [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw,
+ [CLK_PLL_VIDEO0] = &pll_video0_clk.common.hw,
+ [CLK_PLL_VIDEO0_2X] = &pll_video0_2x_clk.hw,
+ [CLK_PLL_VE] = &pll_ve_sun7i_clk.common.hw,
+ [CLK_PLL_DDR_BASE] = &pll_ddr_base_clk.common.hw,
+ [CLK_PLL_DDR] = &pll_ddr_clk.common.hw,
+ [CLK_PLL_DDR_OTHER] = &pll_ddr_other_clk.common.hw,
+ [CLK_PLL_PERIPH_BASE] = &pll_periph_base_clk.common.hw,
+ [CLK_PLL_PERIPH] = &pll_periph_clk.hw,
+ [CLK_PLL_PERIPH_SATA] = &pll_periph_sata_clk.common.hw,
+ [CLK_PLL_VIDEO1] = &pll_video1_clk.common.hw,
+ [CLK_PLL_VIDEO1_2X] = &pll_video1_2x_clk.hw,
+ [CLK_PLL_GPU] = &pll_gpu_clk.common.hw,
+ [CLK_CPU] = &cpu_clk.common.hw,
+ [CLK_AXI] = &axi_clk.common.hw,
+ [CLK_AHB] = &ahb_sun7i_clk.common.hw,
+ [CLK_APB0] = &apb0_clk.common.hw,
+ [CLK_APB1] = &apb1_clk.common.hw,
+ [CLK_AHB_OTG] = &ahb_otg_clk.common.hw,
+ [CLK_AHB_EHCI0] = &ahb_ehci0_clk.common.hw,
+ [CLK_AHB_OHCI0] = &ahb_ohci0_clk.common.hw,
+ [CLK_AHB_EHCI1] = &ahb_ehci1_clk.common.hw,
+ [CLK_AHB_OHCI1] = &ahb_ohci1_clk.common.hw,
+ [CLK_AHB_SS] = &ahb_ss_clk.common.hw,
+ [CLK_AHB_DMA] = &ahb_dma_clk.common.hw,
+ [CLK_AHB_BIST] = &ahb_bist_clk.common.hw,
+ [CLK_AHB_MMC0] = &ahb_mmc0_clk.common.hw,
+ [CLK_AHB_MMC1] = &ahb_mmc1_clk.common.hw,
+ [CLK_AHB_MMC2] = &ahb_mmc2_clk.common.hw,
+ [CLK_AHB_MMC3] = &ahb_mmc3_clk.common.hw,
+ [CLK_AHB_MS] = &ahb_ms_clk.common.hw,
+ [CLK_AHB_NAND] = &ahb_nand_clk.common.hw,
+ [CLK_AHB_SDRAM] = &ahb_sdram_clk.common.hw,
+ [CLK_AHB_ACE] = &ahb_ace_clk.common.hw,
+ [CLK_AHB_EMAC] = &ahb_emac_clk.common.hw,
+ [CLK_AHB_TS] = &ahb_ts_clk.common.hw,
+ [CLK_AHB_SPI0] = &ahb_spi0_clk.common.hw,
+ [CLK_AHB_SPI1] = &ahb_spi1_clk.common.hw,
+ [CLK_AHB_SPI2] = &ahb_spi2_clk.common.hw,
+ [CLK_AHB_SPI3] = &ahb_spi3_clk.common.hw,
+ [CLK_AHB_PATA] = &ahb_pata_clk.common.hw,
+ [CLK_AHB_SATA] = &ahb_sata_clk.common.hw,
+ [CLK_AHB_HSTIMER] = &ahb_hstimer_clk.common.hw,
+ [CLK_AHB_VE] = &ahb_ve_clk.common.hw,
+ [CLK_AHB_TVD] = &ahb_tvd_clk.common.hw,
+ [CLK_AHB_TVE0] = &ahb_tve0_clk.common.hw,
+ [CLK_AHB_TVE1] = &ahb_tve1_clk.common.hw,
+ [CLK_AHB_LCD0] = &ahb_lcd0_clk.common.hw,
+ [CLK_AHB_LCD1] = &ahb_lcd1_clk.common.hw,
+ [CLK_AHB_CSI0] = &ahb_csi0_clk.common.hw,
+ [CLK_AHB_CSI1] = &ahb_csi1_clk.common.hw,
+ [CLK_AHB_HDMI1] = &ahb_hdmi1_clk.common.hw,
+ [CLK_AHB_HDMI0] = &ahb_hdmi0_clk.common.hw,
+ [CLK_AHB_DE_BE0] = &ahb_de_be0_clk.common.hw,
+ [CLK_AHB_DE_BE1] = &ahb_de_be1_clk.common.hw,
+ [CLK_AHB_DE_FE0] = &ahb_de_fe0_clk.common.hw,
+ [CLK_AHB_DE_FE1] = &ahb_de_fe1_clk.common.hw,
+ [CLK_AHB_GMAC] = &ahb_gmac_clk.common.hw,
+ [CLK_AHB_MP] = &ahb_mp_clk.common.hw,
+ [CLK_AHB_GPU] = &ahb_gpu_clk.common.hw,
+ [CLK_APB0_CODEC] = &apb0_codec_clk.common.hw,
+ [CLK_APB0_SPDIF] = &apb0_spdif_clk.common.hw,
+ [CLK_APB0_AC97] = &apb0_ac97_clk.common.hw,
+ [CLK_APB0_I2S0] = &apb0_i2s0_clk.common.hw,
+ [CLK_APB0_I2S1] = &apb0_i2s1_clk.common.hw,
+ [CLK_APB0_PIO] = &apb0_pio_clk.common.hw,
+ [CLK_APB0_IR0] = &apb0_ir0_clk.common.hw,
+ [CLK_APB0_IR1] = &apb0_ir1_clk.common.hw,
+ [CLK_APB0_I2S2] = &apb0_i2s2_clk.common.hw,
+ [CLK_APB0_KEYPAD] = &apb0_keypad_clk.common.hw,
+ [CLK_APB1_I2C0] = &apb1_i2c0_clk.common.hw,
+ [CLK_APB1_I2C1] = &apb1_i2c1_clk.common.hw,
+ [CLK_APB1_I2C2] = &apb1_i2c2_clk.common.hw,
+ [CLK_APB1_I2C3] = &apb1_i2c3_clk.common.hw,
+ [CLK_APB1_CAN] = &apb1_can_clk.common.hw,
+ [CLK_APB1_SCR] = &apb1_scr_clk.common.hw,
+ [CLK_APB1_PS20] = &apb1_ps20_clk.common.hw,
+ [CLK_APB1_PS21] = &apb1_ps21_clk.common.hw,
+ [CLK_APB1_I2C4] = &apb1_i2c4_clk.common.hw,
+ [CLK_APB1_UART0] = &apb1_uart0_clk.common.hw,
+ [CLK_APB1_UART1] = &apb1_uart1_clk.common.hw,
+ [CLK_APB1_UART2] = &apb1_uart2_clk.common.hw,
+ [CLK_APB1_UART3] = &apb1_uart3_clk.common.hw,
+ [CLK_APB1_UART4] = &apb1_uart4_clk.common.hw,
+ [CLK_APB1_UART5] = &apb1_uart5_clk.common.hw,
+ [CLK_APB1_UART6] = &apb1_uart6_clk.common.hw,
+ [CLK_APB1_UART7] = &apb1_uart7_clk.common.hw,
+ [CLK_NAND] = &nand_clk.common.hw,
+ [CLK_MS] = &ms_clk.common.hw,
+ [CLK_MMC0] = &mmc0_clk.common.hw,
+ [CLK_MMC0_OUTPUT] = &mmc0_output_clk.common.hw,
+ [CLK_MMC0_SAMPLE] = &mmc0_sample_clk.common.hw,
+ [CLK_MMC1] = &mmc1_clk.common.hw,
+ [CLK_MMC1_OUTPUT] = &mmc1_output_clk.common.hw,
+ [CLK_MMC1_SAMPLE] = &mmc1_sample_clk.common.hw,
+ [CLK_MMC2] = &mmc2_clk.common.hw,
+ [CLK_MMC2_OUTPUT] = &mmc2_output_clk.common.hw,
+ [CLK_MMC2_SAMPLE] = &mmc2_sample_clk.common.hw,
+ [CLK_MMC3] = &mmc3_clk.common.hw,
+ [CLK_MMC3_OUTPUT] = &mmc3_output_clk.common.hw,
+ [CLK_MMC3_SAMPLE] = &mmc3_sample_clk.common.hw,
+ [CLK_TS] = &ts_clk.common.hw,
+ [CLK_SS] = &ss_clk.common.hw,
+ [CLK_SPI0] = &spi0_clk.common.hw,
+ [CLK_SPI1] = &spi1_clk.common.hw,
+ [CLK_SPI2] = &spi2_clk.common.hw,
+ [CLK_PATA] = &pata_clk.common.hw,
+ [CLK_IR0] = &ir0_sun7i_clk.common.hw,
+ [CLK_IR1] = &ir1_sun7i_clk.common.hw,
+ [CLK_I2S0] = &i2s0_clk.common.hw,
+ [CLK_AC97] = &ac97_clk.common.hw,
+ [CLK_SPDIF] = &spdif_clk.common.hw,
+ [CLK_KEYPAD] = &keypad_clk.common.hw,
+ [CLK_SATA] = &sata_clk.common.hw,
+ [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw,
+ [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw,
+ [CLK_USB_PHY] = &usb_phy_clk.common.hw,
+ /* CLK_GPS is unimplemented */
+ [CLK_SPI3] = &spi3_clk.common.hw,
+ [CLK_I2S1] = &i2s1_clk.common.hw,
+ [CLK_I2S2] = &i2s2_clk.common.hw,
+ [CLK_DRAM_VE] = &dram_ve_clk.common.hw,
+ [CLK_DRAM_CSI0] = &dram_csi0_clk.common.hw,
+ [CLK_DRAM_CSI1] = &dram_csi1_clk.common.hw,
+ [CLK_DRAM_TS] = &dram_ts_clk.common.hw,
+ [CLK_DRAM_TVD] = &dram_tvd_clk.common.hw,
+ [CLK_DRAM_TVE0] = &dram_tve0_clk.common.hw,
+ [CLK_DRAM_TVE1] = &dram_tve1_clk.common.hw,
+ [CLK_DRAM_OUT] = &dram_out_clk.common.hw,
+ [CLK_DRAM_DE_FE1] = &dram_de_fe1_clk.common.hw,
+ [CLK_DRAM_DE_FE0] = &dram_de_fe0_clk.common.hw,
+ [CLK_DRAM_DE_BE0] = &dram_de_be0_clk.common.hw,
+ [CLK_DRAM_DE_BE1] = &dram_de_be1_clk.common.hw,
+ [CLK_DRAM_MP] = &dram_mp_clk.common.hw,
+ [CLK_DRAM_ACE] = &dram_ace_clk.common.hw,
+ [CLK_DE_BE0] = &de_be0_clk.common.hw,
+ [CLK_DE_BE1] = &de_be1_clk.common.hw,
+ [CLK_DE_FE0] = &de_fe0_clk.common.hw,
+ [CLK_DE_FE1] = &de_fe1_clk.common.hw,
+ [CLK_DE_MP] = &de_mp_clk.common.hw,
+ [CLK_TCON0_CH0] = &tcon0_ch0_clk.common.hw,
+ [CLK_TCON1_CH0] = &tcon1_ch0_clk.common.hw,
+ [CLK_CSI_SCLK] = &csi_sclk_clk.common.hw,
+ [CLK_TVD_SCLK2] = &tvd_sclk2_sun7i_clk.common.hw,
+ [CLK_TVD] = &tvd_sclk1_sun7i_clk.common.hw,
+ [CLK_TCON0_CH1_SCLK2] = &tcon0_ch1_sclk2_clk.common.hw,
+ [CLK_TCON0_CH1] = &tcon0_ch1_clk.common.hw,
+ [CLK_TCON1_CH1_SCLK2] = &tcon1_ch1_sclk2_clk.common.hw,
+ [CLK_TCON1_CH1] = &tcon1_ch1_clk.common.hw,
+ [CLK_CSI0] = &csi0_clk.common.hw,
+ [CLK_CSI1] = &csi1_clk.common.hw,
+ [CLK_VE] = &ve_clk.common.hw,
+ [CLK_CODEC] = &codec_clk.common.hw,
+ [CLK_AVS] = &avs_clk.common.hw,
+ [CLK_ACE] = &ace_clk.common.hw,
+ [CLK_HDMI] = &hdmi_clk.common.hw,
+ [CLK_GPU] = &gpu_sun7i_clk.common.hw,
+ [CLK_MBUS] = &mbus_sun7i_clk.common.hw,
+ [CLK_HDMI1_SLOW] = &hdmi1_slow_clk.common.hw,
+ [CLK_HDMI1] = &hdmi1_clk.common.hw,
+ [CLK_OUT_A] = &out_a_clk.common.hw,
+ [CLK_OUT_B] = &out_b_clk.common.hw,
+ },
+ .num = CLK_NUMBER_SUN7I,
+};
+
+static struct ccu_reset_map sunxi_a10_a20_ccu_resets[] = {
+ [RST_USB_PHY0] = { 0x0cc, BIT(0) },
+ [RST_USB_PHY1] = { 0x0cc, BIT(1) },
+ [RST_USB_PHY2] = { 0x0cc, BIT(2) },
+ [RST_GPS] = { 0x0d0, BIT(0) },
+ [RST_DE_BE0] = { 0x104, BIT(30) },
+ [RST_DE_BE1] = { 0x108, BIT(30) },
+ [RST_DE_FE0] = { 0x10c, BIT(30) },
+ [RST_DE_FE1] = { 0x110, BIT(30) },
+ [RST_DE_MP] = { 0x114, BIT(30) },
+ [RST_TVE0] = { 0x118, BIT(29) },
+ [RST_TCON0] = { 0x118, BIT(30) },
+ [RST_TVE1] = { 0x11c, BIT(29) },
+ [RST_TCON1] = { 0x11c, BIT(30) },
+ [RST_CSI0] = { 0x134, BIT(30) },
+ [RST_CSI1] = { 0x138, BIT(30) },
+ [RST_VE] = { 0x13c, BIT(0) },
+ [RST_ACE] = { 0x148, BIT(16) },
+ [RST_LVDS] = { 0x14c, BIT(0) },
+ [RST_GPU] = { 0x154, BIT(30) },
+ [RST_HDMI_H] = { 0x170, BIT(0) },
+ [RST_HDMI_SYS] = { 0x170, BIT(1) },
+ [RST_HDMI_AUDIO_DMA] = { 0x170, BIT(2) },
+};
+
+static const struct sunxi_ccu_desc sun4i_a10_ccu_desc = {
+ .ccu_clks = sun4i_sun7i_ccu_clks,
+ .num_ccu_clks = ARRAY_SIZE(sun4i_sun7i_ccu_clks),
+
+ .hw_clks = &sun4i_a10_hw_clks,
+
+ .resets = sunxi_a10_a20_ccu_resets,
+ .num_resets = ARRAY_SIZE(sunxi_a10_a20_ccu_resets),
+};
+
+static const struct sunxi_ccu_desc sun7i_a20_ccu_desc = {
+ .ccu_clks = sun4i_sun7i_ccu_clks,
+ .num_ccu_clks = ARRAY_SIZE(sun4i_sun7i_ccu_clks),
+
+ .hw_clks = &sun7i_a20_hw_clks,
+
+ .resets = sunxi_a10_a20_ccu_resets,
+ .num_resets = ARRAY_SIZE(sunxi_a10_a20_ccu_resets),
+};
+
+static void __init sun4i_ccu_init(struct device_node *node,
+ const struct sunxi_ccu_desc *desc)
+{
+ void __iomem *reg;
+ u32 val;
+
+ reg = of_io_request_and_map(node, 0, of_node_full_name(node));
+ if (IS_ERR(reg)) {
+ pr_err("%s: Could not map the clock registers\n",
+ of_node_full_name(node));
+ return;
+ }
+
+ /* Force the PLL-Audio-1x divider to 4 */
+ val = readl(reg + SUN4I_PLL_AUDIO_REG);
+ val &= ~GENMASK(29, 26);
+ writel(val | (4 << 26), reg + SUN4I_PLL_AUDIO_REG);
+
+ /*
+ * Use the peripheral PLL6 as the AHB parent, instead of CPU /
+ * AXI which have rate changes due to cpufreq.
+ *
+ * This is especially a big deal for the HS timer whose parent
+ * clock is AHB.
+ *
+ * NB! These bits are undocumented in A10 manual.
+ */
+ val = readl(reg + SUN4I_AHB_REG);
+ val &= ~GENMASK(7, 6);
+ writel(val | (2 << 6), reg + SUN4I_AHB_REG);
+
+ sunxi_ccu_probe(node, reg, desc);
+}
+
+static void __init sun4i_a10_ccu_setup(struct device_node *node)
+{
+ sun4i_ccu_init(node, &sun4i_a10_ccu_desc);
+}
+CLK_OF_DECLARE(sun4i_a10_ccu, "allwinner,sun4i-a10-ccu",
+ sun4i_a10_ccu_setup);
+
+static void __init sun7i_a20_ccu_setup(struct device_node *node)
+{
+ sun4i_ccu_init(node, &sun7i_a20_ccu_desc);
+}
+CLK_OF_DECLARE(sun7i_a20_ccu, "allwinner,sun7i-a20-ccu",
+ sun7i_a20_ccu_setup);
diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.h b/drivers/clk/sunxi-ng/ccu-sun4i-a10.h
new file mode 100644
index 000000000000..c5947c7c050e
--- /dev/null
+++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 Priit Laes
+ *
+ * Priit Laes <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _CCU_SUN4I_A10_H_
+#define _CCU_SUN4I_A10_H_
+
+#include <dt-bindings/clock/sun4i-a10-ccu.h>
+#include <dt-bindings/clock/sun7i-a20-ccu.h>
+#include <dt-bindings/reset/sun4i-a10-ccu.h>
+
+/* The HOSC is exported */
+#define CLK_PLL_CORE 2
+#define CLK_PLL_AUDIO_BASE 3
+#define CLK_PLL_AUDIO 4
+#define CLK_PLL_AUDIO_2X 5
+#define CLK_PLL_AUDIO_4X 6
+#define CLK_PLL_AUDIO_8X 7
+#define CLK_PLL_VIDEO0 8
+#define CLK_PLL_VIDEO0_2X 9
+#define CLK_PLL_VE 10
+#define CLK_PLL_DDR_BASE 11
+#define CLK_PLL_DDR 12
+#define CLK_PLL_DDR_OTHER 13
+#define CLK_PLL_PERIPH_BASE 14
+#define CLK_PLL_PERIPH 15
+#define CLK_PLL_PERIPH_SATA 16
+#define CLK_PLL_VIDEO1 17
+#define CLK_PLL_VIDEO1_2X 18
+#define CLK_PLL_GPU 19
+
+/* The CPU clock is exported */
+#define CLK_AXI 21
+#define CLK_AXI_DRAM 22
+#define CLK_AHB 23
+#define CLK_APB0 24
+#define CLK_APB1 25
+
+/* AHB gates are exported (23..68) */
+/* APB0 gates are exported (69..78) */
+/* APB1 gates are exported (79..95) */
+/* IP module clocks are exported (96..128) */
+/* DRAM gates are exported (129..142)*/
+/* Media (display engine clocks & etc) are exported (143..169) */
+
+#define CLK_NUMBER_SUN4I (CLK_MBUS + 1)
+#define CLK_NUMBER_SUN7I (CLK_OUT_B + 1)
+
+#endif /* _CCU_SUN4I_A10_H_ */
diff --git a/drivers/clk/sunxi-ng/ccu-sun5i.c b/drivers/clk/sunxi-ng/ccu-sun5i.c
index 31d7ffda9aab..ab9e850b3707 100644
--- a/drivers/clk/sunxi-ng/ccu-sun5i.c
+++ b/drivers/clk/sunxi-ng/ccu-sun5i.c
@@ -976,8 +976,7 @@ static void __init sun5i_ccu_init(struct device_node *node,
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
index 4d6078fca9ac..8af434815fba 100644
--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
@@ -1217,8 +1217,7 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
index 8a753ed0426d..d93b452f0df9 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
@@ -716,8 +716,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node)
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
index 10b38dc46f75..13eb5b23c5e7 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
@@ -777,8 +777,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node)
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
index 62e4f0d2b2fc..1729ff6a5aae 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
@@ -135,7 +135,7 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_de_clk, "pll-de",
static const char * const cpux_parents[] = { "osc32k", "osc24M",
"pll-cpux" , "pll-cpux" };
static SUNXI_CCU_MUX(cpux_clk, "cpux", cpux_parents,
- 0x050, 16, 2, CLK_IS_CRITICAL);
+ 0x050, 16, 2, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT);
static SUNXI_CCU_M(axi_clk, "axi", "cpux", 0x050, 0, 2, 0);
@@ -1103,6 +1103,13 @@ static const struct sunxi_ccu_desc sun50i_h5_ccu_desc = {
.num_resets = ARRAY_SIZE(sun50i_h5_ccu_resets),
};
+static struct ccu_pll_nb sun8i_h3_pll_cpu_nb = {
+ .common = &pll_cpux_clk.common,
+ /* copy from pll_cpux_clk */
+ .enable = BIT(31),
+ .lock = BIT(28),
+};
+
static struct ccu_mux_nb sun8i_h3_cpu_nb = {
.common = &cpux_clk.common,
.cm = &cpux_clk.mux,
@@ -1118,8 +1125,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
@@ -1130,6 +1136,10 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
sunxi_ccu_probe(node, reg, desc);
+ /* Gate then ungate PLL CPU after any rate changes */
+ ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
+
+ /* Reparent CPU during PLL CPU rate changes */
ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk,
&sun8i_h3_cpu_nb);
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
index e54816ec1dbe..71feb7b24e8a 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
@@ -290,8 +290,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.h b/drivers/clk/sunxi-ng/ccu-sun8i-r.h
index a7a407f12b56..fb01bffb929d 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.h
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.h
@@ -13,7 +13,7 @@
*/
#ifndef _CCU_SUN8I_R_H
-#define _CCU_SUN8I_R_H_
+#define _CCU_SUN8I_R_H
#include <dt-bindings/clock/sun8i-r-ccu.h>
#include <dt-bindings/reset/sun8i-r-ccu.h>
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r40.c b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c
new file mode 100644
index 000000000000..933f2e68f42a
--- /dev/null
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c
@@ -0,0 +1,1290 @@
+/*
+ * Copyright (c) 2017 Icenowy Zheng <[email protected]>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
+
+#include "ccu_common.h"
+#include "ccu_reset.h"
+
+#include "ccu_div.h"
+#include "ccu_gate.h"
+#include "ccu_mp.h"
+#include "ccu_mult.h"
+#include "ccu_nk.h"
+#include "ccu_nkm.h"
+#include "ccu_nkmp.h"
+#include "ccu_nm.h"
+#include "ccu_phase.h"
+
+#include "ccu-sun8i-r40.h"
+
+/* TODO: The result of N*K is required to be in [10, 88] range. */
+static struct ccu_nkmp pll_cpu_clk = {
+ .enable = BIT(31),
+ .lock = BIT(28),
+ .n = _SUNXI_CCU_MULT(8, 5),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .m = _SUNXI_CCU_DIV(0, 2),
+ .p = _SUNXI_CCU_DIV_MAX(16, 2, 4),
+ .common = {
+ .reg = 0x000,
+ .hw.init = CLK_HW_INIT("pll-cpu",
+ "osc24M",
+ &ccu_nkmp_ops,
+ CLK_SET_RATE_UNGATE),
+ },
+};
+
+/*
+ * The Audio PLL is supposed to have 4 outputs: 3 fixed factors from
+ * the base (2x, 4x and 8x), and one variable divider (the one true
+ * pll audio).
+ *
+ * We don't have any need for the variable divider for now, so we just
+ * hardcode it to match with the clock names
+ */
+#define SUN8I_R40_PLL_AUDIO_REG 0x008
+
+static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_audio_base_clk, "pll-audio-base",
+ "osc24M", 0x008,
+ 8, 7, /* N */
+ 0, 5, /* M */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/* TODO: The result of N/M is required to be in [8, 25] range. */
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_video0_clk, "pll-video0",
+ "osc24M", 0x0010,
+ 8, 7, /* N */
+ 0, 4, /* M */
+ BIT(24), /* frac enable */
+ BIT(25), /* frac select */
+ 270000000, /* frac rate 0 */
+ 297000000, /* frac rate 1 */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/* TODO: The result of N/M is required to be in [8, 25] range. */
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve",
+ "osc24M", 0x0018,
+ 8, 7, /* N */
+ 0, 4, /* M */
+ BIT(24), /* frac enable */
+ BIT(25), /* frac select */
+ 270000000, /* frac rate 0 */
+ 297000000, /* frac rate 1 */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/* TODO: The result of N*K is required to be in [10, 77] range. */
+static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr0_clk, "pll-ddr0",
+ "osc24M", 0x020,
+ 8, 5, /* N */
+ 4, 2, /* K */
+ 0, 2, /* M */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/* TODO: The result of N*K is required to be in [21, 58] range. */
+static struct ccu_nk pll_periph0_clk = {
+ .enable = BIT(31),
+ .lock = BIT(28),
+ .n = _SUNXI_CCU_MULT(8, 5),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .fixed_post_div = 2,
+ .common = {
+ .reg = 0x028,
+ .features = CCU_FEATURE_FIXED_POSTDIV,
+ .hw.init = CLK_HW_INIT("pll-periph0", "osc24M",
+ &ccu_nk_ops,
+ CLK_SET_RATE_UNGATE),
+ },
+};
+
+static struct ccu_div pll_periph0_sata_clk = {
+ .enable = BIT(24),
+ .div = _SUNXI_CCU_DIV(0, 2),
+ /*
+ * The formula of pll-periph0 (1x) is 24MHz*N*K/2, and the formula
+ * of pll-periph0-sata is 24MHz*N*K/M/6, so the postdiv here is
+ * 6/2 = 3.
+ */
+ .fixed_post_div = 3,
+ .common = {
+ .reg = 0x028,
+ .features = CCU_FEATURE_FIXED_POSTDIV,
+ .hw.init = CLK_HW_INIT("pll-periph0-sata",
+ "pll-periph0",
+ &ccu_div_ops, 0),
+ },
+};
+
+/* TODO: The result of N*K is required to be in [21, 58] range. */
+static struct ccu_nk pll_periph1_clk = {
+ .enable = BIT(31),
+ .lock = BIT(28),
+ .n = _SUNXI_CCU_MULT(8, 5),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .fixed_post_div = 2,
+ .common = {
+ .reg = 0x02c,
+ .features = CCU_FEATURE_FIXED_POSTDIV,
+ .hw.init = CLK_HW_INIT("pll-periph1", "osc24M",
+ &ccu_nk_ops,
+ CLK_SET_RATE_UNGATE),
+ },
+};
+
+/* TODO: The result of N/M is required to be in [8, 25] range. */
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_video1_clk, "pll-video1",
+ "osc24M", 0x030,
+ 8, 7, /* N */
+ 0, 4, /* M */
+ BIT(24), /* frac enable */
+ BIT(25), /* frac select */
+ 270000000, /* frac rate 0 */
+ 297000000, /* frac rate 1 */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+static struct ccu_nkm pll_sata_clk = {
+ .enable = BIT(31),
+ .lock = BIT(28),
+ .n = _SUNXI_CCU_MULT(8, 5),
+ .k = _SUNXI_CCU_MULT(4, 2),
+ .m = _SUNXI_CCU_DIV(0, 2),
+ .fixed_post_div = 6,
+ .common = {
+ .reg = 0x034,
+ .features = CCU_FEATURE_FIXED_POSTDIV,
+ .hw.init = CLK_HW_INIT("pll-sata", "osc24M",
+ &ccu_nkm_ops,
+ CLK_SET_RATE_UNGATE),
+ },
+};
+
+static const char * const pll_sata_out_parents[] = { "pll-sata",
+ "pll-periph0-sata" };
+static SUNXI_CCU_MUX_WITH_GATE(pll_sata_out_clk, "pll-sata-out",
+ pll_sata_out_parents, 0x034,
+ 30, 1, /* mux */
+ BIT(14), /* gate */
+ CLK_SET_RATE_PARENT);
+
+/* TODO: The result of N/M is required to be in [8, 25] range. */
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_gpu_clk, "pll-gpu",
+ "osc24M", 0x038,
+ 8, 7, /* N */
+ 0, 4, /* M */
+ BIT(24), /* frac enable */
+ BIT(25), /* frac select */
+ 270000000, /* frac rate 0 */
+ 297000000, /* frac rate 1 */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/*
+ * The MIPI PLL has 2 modes: "MIPI" and "HDMI".
+ *
+ * The MIPI mode is a standard NKM-style clock. The HDMI mode is an
+ * integer / fractional clock with switchable multipliers and dividers.
+ * This is not supported here. We hardcode the PLL to MIPI mode.
+ *
+ * TODO: In the MIPI mode, M/N is required to be equal or lesser than 3,
+ * which cannot be implemented now.
+ */
+#define SUN8I_R40_PLL_MIPI_REG 0x040
+
+static const char * const pll_mipi_parents[] = { "pll-video0" };
+static struct ccu_nkm pll_mipi_clk = {
+ .enable = BIT(31) | BIT(23) | BIT(22),
+ .lock = BIT(28),
+ .n = _SUNXI_CCU_MULT(8, 4),
+ .k = _SUNXI_CCU_MULT_MIN(4, 2, 2),
+ .m = _SUNXI_CCU_DIV(0, 4),
+ .mux = _SUNXI_CCU_MUX(21, 1),
+ .common = {
+ .reg = 0x040,
+ .hw.init = CLK_HW_INIT_PARENTS("pll-mipi",
+ pll_mipi_parents,
+ &ccu_nkm_ops,
+ CLK_SET_RATE_UNGATE)
+ },
+};
+
+/* TODO: The result of N/M is required to be in [8, 25] range. */
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_de_clk, "pll-de",
+ "osc24M", 0x048,
+ 8, 7, /* N */
+ 0, 4, /* M */
+ BIT(24), /* frac enable */
+ BIT(25), /* frac select */
+ 270000000, /* frac rate 0 */
+ 297000000, /* frac rate 1 */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+/* TODO: The N factor is required to be in [16, 75] range. */
+static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_ddr1_clk, "pll-ddr1",
+ "osc24M", 0x04c,
+ 8, 7, /* N */
+ 0, 2, /* M */
+ BIT(31), /* gate */
+ BIT(28), /* lock */
+ CLK_SET_RATE_UNGATE);
+
+static const char * const cpu_parents[] = { "osc32k", "osc24M",
+ "pll-cpu", "pll-cpu" };
+static SUNXI_CCU_MUX(cpu_clk, "cpu", cpu_parents,
+ 0x050, 16, 2, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_M(axi_clk, "axi", "cpu", 0x050, 0, 2, 0);
+
+static const char * const ahb1_parents[] = { "osc32k", "osc24M",
+ "axi", "pll-periph0" };
+static const struct ccu_mux_var_prediv ahb1_predivs[] = {
+ { .index = 3, .shift = 6, .width = 2 },
+};
+static struct ccu_div ahb1_clk = {
+ .div = _SUNXI_CCU_DIV_FLAGS(4, 2, CLK_DIVIDER_POWER_OF_TWO),
+
+ .mux = {
+ .shift = 12,
+ .width = 2,
+
+ .var_predivs = ahb1_predivs,
+ .n_var_predivs = ARRAY_SIZE(ahb1_predivs),
+ },
+
+ .common = {
+ .reg = 0x054,
+ .features = CCU_FEATURE_VARIABLE_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("ahb1",
+ ahb1_parents,
+ &ccu_div_ops,
+ 0),
+ },
+};
+
+static struct clk_div_table apb1_div_table[] = {
+ { .val = 0, .div = 2 },
+ { .val = 1, .div = 2 },
+ { .val = 2, .div = 4 },
+ { .val = 3, .div = 8 },
+ { /* Sentinel */ },
+};
+static SUNXI_CCU_DIV_TABLE(apb1_clk, "apb1", "ahb1",
+ 0x054, 8, 2, apb1_div_table, 0);
+
+static const char * const apb2_parents[] = { "osc32k", "osc24M",
+ "pll-periph0-2x",
+ "pll-periph0-2x" };
+static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", apb2_parents, 0x058,
+ 0, 5, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ 0);
+
+static SUNXI_CCU_GATE(bus_mipi_dsi_clk, "bus-mipi-dsi", "ahb1",
+ 0x060, BIT(1), 0);
+static SUNXI_CCU_GATE(bus_ce_clk, "bus-ce", "ahb1",
+ 0x060, BIT(5), 0);
+static SUNXI_CCU_GATE(bus_dma_clk, "bus-dma", "ahb1",
+ 0x060, BIT(6), 0);
+static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb1",
+ 0x060, BIT(8), 0);
+static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb1",
+ 0x060, BIT(9), 0);
+static SUNXI_CCU_GATE(bus_mmc2_clk, "bus-mmc2", "ahb1",
+ 0x060, BIT(10), 0);
+static SUNXI_CCU_GATE(bus_mmc3_clk, "bus-mmc3", "ahb1",
+ 0x060, BIT(11), 0);
+static SUNXI_CCU_GATE(bus_nand_clk, "bus-nand", "ahb1",
+ 0x060, BIT(13), 0);
+static SUNXI_CCU_GATE(bus_dram_clk, "bus-dram", "ahb1",
+ 0x060, BIT(14), 0);
+static SUNXI_CCU_GATE(bus_emac_clk, "bus-emac", "ahb1",
+ 0x060, BIT(17), 0);
+static SUNXI_CCU_GATE(bus_ts_clk, "bus-ts", "ahb1",
+ 0x060, BIT(18), 0);
+static SUNXI_CCU_GATE(bus_hstimer_clk, "bus-hstimer", "ahb1",
+ 0x060, BIT(19), 0);
+static SUNXI_CCU_GATE(bus_spi0_clk, "bus-spi0", "ahb1",
+ 0x060, BIT(20), 0);
+static SUNXI_CCU_GATE(bus_spi1_clk, "bus-spi1", "ahb1",
+ 0x060, BIT(21), 0);
+static SUNXI_CCU_GATE(bus_spi2_clk, "bus-spi2", "ahb1",
+ 0x060, BIT(22), 0);
+static SUNXI_CCU_GATE(bus_spi3_clk, "bus-spi3", "ahb1",
+ 0x060, BIT(23), 0);
+static SUNXI_CCU_GATE(bus_sata_clk, "bus-sata", "ahb1",
+ 0x060, BIT(24), 0);
+static SUNXI_CCU_GATE(bus_otg_clk, "bus-otg", "ahb1",
+ 0x060, BIT(25), 0);
+static SUNXI_CCU_GATE(bus_ehci0_clk, "bus-ehci0", "ahb1",
+ 0x060, BIT(26), 0);
+static SUNXI_CCU_GATE(bus_ehci1_clk, "bus-ehci1", "ahb1",
+ 0x060, BIT(27), 0);
+static SUNXI_CCU_GATE(bus_ehci2_clk, "bus-ehci2", "ahb1",
+ 0x060, BIT(28), 0);
+static SUNXI_CCU_GATE(bus_ohci0_clk, "bus-ohci0", "ahb1",
+ 0x060, BIT(29), 0);
+static SUNXI_CCU_GATE(bus_ohci1_clk, "bus-ohci1", "ahb1",
+ 0x060, BIT(30), 0);
+static SUNXI_CCU_GATE(bus_ohci2_clk, "bus-ohci2", "ahb1",
+ 0x060, BIT(31), 0);
+
+static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "ahb1",
+ 0x064, BIT(0), 0);
+static SUNXI_CCU_GATE(bus_mp_clk, "bus-mp", "ahb1",
+ 0x064, BIT(2), 0);
+static SUNXI_CCU_GATE(bus_deinterlace_clk, "bus-deinterlace", "ahb1",
+ 0x064, BIT(5), 0);
+static SUNXI_CCU_GATE(bus_csi0_clk, "bus-csi0", "ahb1",
+ 0x064, BIT(8), 0);
+static SUNXI_CCU_GATE(bus_csi1_clk, "bus-csi1", "ahb1",
+ 0x064, BIT(9), 0);
+static SUNXI_CCU_GATE(bus_hdmi0_clk, "bus-hdmi0", "ahb1",
+ 0x064, BIT(10), 0);
+static SUNXI_CCU_GATE(bus_hdmi1_clk, "bus-hdmi1", "ahb1",
+ 0x064, BIT(11), 0);
+static SUNXI_CCU_GATE(bus_de_clk, "bus-de", "ahb1",
+ 0x064, BIT(12), 0);
+static SUNXI_CCU_GATE(bus_tve0_clk, "bus-tve0", "ahb1",
+ 0x064, BIT(13), 0);
+static SUNXI_CCU_GATE(bus_tve1_clk, "bus-tve1", "ahb1",
+ 0x064, BIT(14), 0);
+static SUNXI_CCU_GATE(bus_tve_top_clk, "bus-tve-top", "ahb1",
+ 0x064, BIT(15), 0);
+static SUNXI_CCU_GATE(bus_gmac_clk, "bus-gmac", "ahb1",
+ 0x064, BIT(17), 0);
+static SUNXI_CCU_GATE(bus_gpu_clk, "bus-gpu", "ahb1",
+ 0x064, BIT(20), 0);
+static SUNXI_CCU_GATE(bus_tvd0_clk, "bus-tvd0", "ahb1",
+ 0x064, BIT(21), 0);
+static SUNXI_CCU_GATE(bus_tvd1_clk, "bus-tvd1", "ahb1",
+ 0x064, BIT(22), 0);
+static SUNXI_CCU_GATE(bus_tvd2_clk, "bus-tvd2", "ahb1",
+ 0x064, BIT(23), 0);
+static SUNXI_CCU_GATE(bus_tvd3_clk, "bus-tvd3", "ahb1",
+ 0x064, BIT(24), 0);
+static SUNXI_CCU_GATE(bus_tvd_top_clk, "bus-tvd-top", "ahb1",
+ 0x064, BIT(25), 0);
+static SUNXI_CCU_GATE(bus_tcon_lcd0_clk, "bus-tcon-lcd0", "ahb1",
+ 0x064, BIT(26), 0);
+static SUNXI_CCU_GATE(bus_tcon_lcd1_clk, "bus-tcon-lcd1", "ahb1",
+ 0x064, BIT(27), 0);
+static SUNXI_CCU_GATE(bus_tcon_tv0_clk, "bus-tcon-tv0", "ahb1",
+ 0x064, BIT(28), 0);
+static SUNXI_CCU_GATE(bus_tcon_tv1_clk, "bus-tcon-tv1", "ahb1",
+ 0x064, BIT(29), 0);
+static SUNXI_CCU_GATE(bus_tcon_top_clk, "bus-tcon-top", "ahb1",
+ 0x064, BIT(30), 0);
+
+static SUNXI_CCU_GATE(bus_codec_clk, "bus-codec", "apb1",
+ 0x068, BIT(0), 0);
+static SUNXI_CCU_GATE(bus_spdif_clk, "bus-spdif", "apb1",
+ 0x068, BIT(1), 0);
+static SUNXI_CCU_GATE(bus_ac97_clk, "bus-ac97", "apb1",
+ 0x068, BIT(2), 0);
+static SUNXI_CCU_GATE(bus_pio_clk, "bus-pio", "apb1",
+ 0x068, BIT(5), 0);
+static SUNXI_CCU_GATE(bus_ir0_clk, "bus-ir0", "apb1",
+ 0x068, BIT(6), 0);
+static SUNXI_CCU_GATE(bus_ir1_clk, "bus-ir1", "apb1",
+ 0x068, BIT(7), 0);
+static SUNXI_CCU_GATE(bus_ths_clk, "bus-ths", "apb1",
+ 0x068, BIT(8), 0);
+static SUNXI_CCU_GATE(bus_keypad_clk, "bus-keypad", "apb1",
+ 0x068, BIT(10), 0);
+static SUNXI_CCU_GATE(bus_i2s0_clk, "bus-i2s0", "apb1",
+ 0x068, BIT(12), 0);
+static SUNXI_CCU_GATE(bus_i2s1_clk, "bus-i2s1", "apb1",
+ 0x068, BIT(13), 0);
+static SUNXI_CCU_GATE(bus_i2s2_clk, "bus-i2s2", "apb1",
+ 0x068, BIT(14), 0);
+
+static SUNXI_CCU_GATE(bus_i2c0_clk, "bus-i2c0", "apb2",
+ 0x06c, BIT(0), 0);
+static SUNXI_CCU_GATE(bus_i2c1_clk, "bus-i2c1", "apb2",
+ 0x06c, BIT(1), 0);
+static SUNXI_CCU_GATE(bus_i2c2_clk, "bus-i2c2", "apb2",
+ 0x06c, BIT(2), 0);
+static SUNXI_CCU_GATE(bus_i2c3_clk, "bus-i2c3", "apb2",
+ 0x06c, BIT(3), 0);
+/*
+ * In datasheet here's "Reserved", however the gate exists in BSP soucre
+ * code.
+ */
+static SUNXI_CCU_GATE(bus_can_clk, "bus-can", "apb2",
+ 0x06c, BIT(4), 0);
+static SUNXI_CCU_GATE(bus_scr_clk, "bus-scr", "apb2",
+ 0x06c, BIT(5), 0);
+static SUNXI_CCU_GATE(bus_ps20_clk, "bus-ps20", "apb2",
+ 0x06c, BIT(6), 0);
+static SUNXI_CCU_GATE(bus_ps21_clk, "bus-ps21", "apb2",
+ 0x06c, BIT(7), 0);
+static SUNXI_CCU_GATE(bus_i2c4_clk, "bus-i2c4", "apb2",
+ 0x06c, BIT(15), 0);
+static SUNXI_CCU_GATE(bus_uart0_clk, "bus-uart0", "apb2",
+ 0x06c, BIT(16), 0);
+static SUNXI_CCU_GATE(bus_uart1_clk, "bus-uart1", "apb2",
+ 0x06c, BIT(17), 0);
+static SUNXI_CCU_GATE(bus_uart2_clk, "bus-uart2", "apb2",
+ 0x06c, BIT(18), 0);
+static SUNXI_CCU_GATE(bus_uart3_clk, "bus-uart3", "apb2",
+ 0x06c, BIT(19), 0);
+static SUNXI_CCU_GATE(bus_uart4_clk, "bus-uart4", "apb2",
+ 0x06c, BIT(20), 0);
+static SUNXI_CCU_GATE(bus_uart5_clk, "bus-uart5", "apb2",
+ 0x06c, BIT(21), 0);
+static SUNXI_CCU_GATE(bus_uart6_clk, "bus-uart6", "apb2",
+ 0x06c, BIT(22), 0);
+static SUNXI_CCU_GATE(bus_uart7_clk, "bus-uart7", "apb2",
+ 0x06c, BIT(23), 0);
+
+static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "ahb1",
+ 0x070, BIT(7), 0);
+
+static const char * const ths_parents[] = { "osc24M" };
+static struct ccu_div ths_clk = {
+ .enable = BIT(31),
+ .div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO),
+ .mux = _SUNXI_CCU_MUX(24, 2),
+ .common = {
+ .reg = 0x074,
+ .hw.init = CLK_HW_INIT_PARENTS("ths",
+ ths_parents,
+ &ccu_div_ops,
+ 0),
+ },
+};
+
+static const char * const mod0_default_parents[] = { "osc24M", "pll-periph0",
+ "pll-periph1" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(nand_clk, "nand", mod0_default_parents, 0x080,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc0_clk, "mmc0", mod0_default_parents, 0x088,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc1_clk, "mmc1", mod0_default_parents, 0x08c,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc2_clk, "mmc2", mod0_default_parents, 0x090,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(mmc3_clk, "mmc3", mod0_default_parents, 0x094,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static const char * const ts_parents[] = { "osc24M", "pll-periph0", };
+static SUNXI_CCU_MP_WITH_MUX_GATE(ts_clk, "ts", ts_parents, 0x098,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 4, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static const char * const ce_parents[] = { "osc24M", "pll-periph0-2x",
+ "pll-periph1-2x" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(ce_clk, "ce", ce_parents, 0x09c,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi0_clk, "spi0", mod0_default_parents, 0x0a0,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", mod0_default_parents, 0x0a4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi2_clk, "spi2", mod0_default_parents, 0x0a8,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(spi3_clk, "spi3", mod0_default_parents, 0x0ac,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static const char * const i2s_parents[] = { "pll-audio-8x", "pll-audio-4x",
+ "pll-audio-2x", "pll-audio" };
+static SUNXI_CCU_MUX_WITH_GATE(i2s0_clk, "i2s0", i2s_parents,
+ 0x0b0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_MUX_WITH_GATE(i2s1_clk, "i2s1", i2s_parents,
+ 0x0b4, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_MUX_WITH_GATE(i2s2_clk, "i2s2", i2s_parents,
+ 0x0b8, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_MUX_WITH_GATE(ac97_clk, "ac97", i2s_parents,
+ 0x0bc, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_MUX_WITH_GATE(spdif_clk, "spdif", i2s_parents,
+ 0x0c0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+
+static const char * const keypad_parents[] = { "osc24M", "osc32k" };
+static const u8 keypad_table[] = { 0, 2 };
+static struct ccu_mp keypad_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(0, 5),
+ .p = _SUNXI_CCU_DIV(16, 2),
+ .mux = _SUNXI_CCU_MUX_TABLE(24, 2, keypad_table),
+ .common = {
+ .reg = 0x0c4,
+ .hw.init = CLK_HW_INIT_PARENTS("keypad",
+ keypad_parents,
+ &ccu_mp_ops,
+ 0),
+ }
+};
+
+static const char * const sata_parents[] = { "pll-sata-out", "sata-ext" };
+static SUNXI_CCU_MUX_WITH_GATE(sata_clk, "sata", sata_parents,
+ 0x0c8, 24, 1, BIT(31), CLK_SET_RATE_PARENT);
+
+/*
+ * There are 3 OHCI 12M clock source selection bits in this register.
+ * We will force them to 0 (12M divided from 48M).
+ */
+#define SUN8I_R40_USB_CLK_REG 0x0cc
+
+static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "osc24M",
+ 0x0cc, BIT(8), 0);
+static SUNXI_CCU_GATE(usb_phy1_clk, "usb-phy1", "osc24M",
+ 0x0cc, BIT(9), 0);
+static SUNXI_CCU_GATE(usb_phy2_clk, "usb-phy2", "osc24M",
+ 0x0cc, BIT(10), 0);
+static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc12M",
+ 0x0cc, BIT(16), 0);
+static SUNXI_CCU_GATE(usb_ohci1_clk, "usb-ohci1", "osc12M",
+ 0x0cc, BIT(17), 0);
+static SUNXI_CCU_GATE(usb_ohci2_clk, "usb-ohci2", "osc12M",
+ 0x0cc, BIT(18), 0);
+
+static const char * const ir_parents[] = { "osc24M", "pll-periph0",
+ "pll-periph1", "osc32k" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir0_clk, "ir0", ir_parents, 0x0d0,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE(ir1_clk, "ir1", ir_parents, 0x0d4,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ 0);
+
+static const char * const dram_parents[] = { "pll-ddr0", "pll-ddr1" };
+static SUNXI_CCU_M_WITH_MUX(dram_clk, "dram", dram_parents,
+ 0x0f4, 0, 2, 20, 2, CLK_IS_CRITICAL);
+
+static SUNXI_CCU_GATE(dram_ve_clk, "dram-ve", "dram",
+ 0x100, BIT(0), 0);
+static SUNXI_CCU_GATE(dram_csi0_clk, "dram-csi0", "dram",
+ 0x100, BIT(1), 0);
+static SUNXI_CCU_GATE(dram_csi1_clk, "dram-csi1", "dram",
+ 0x100, BIT(2), 0);
+static SUNXI_CCU_GATE(dram_ts_clk, "dram-ts", "dram",
+ 0x100, BIT(3), 0);
+static SUNXI_CCU_GATE(dram_tvd_clk, "dram-tvd", "dram",
+ 0x100, BIT(4), 0);
+static SUNXI_CCU_GATE(dram_mp_clk, "dram-mp", "dram",
+ 0x100, BIT(5), 0);
+static SUNXI_CCU_GATE(dram_deinterlace_clk, "dram-deinterlace", "dram",
+ 0x100, BIT(6), 0);
+
+static const char * const de_parents[] = { "pll-periph0-2x", "pll-de" };
+static SUNXI_CCU_M_WITH_MUX_GATE(de_clk, "de", de_parents,
+ 0x104, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(mp_clk, "mp", de_parents,
+ 0x108, 0, 4, 24, 3, BIT(31), 0);
+
+static const char * const tcon_parents[] = { "pll-video0", "pll-video1",
+ "pll-video0-2x", "pll-video1-2x",
+ "pll-mipi" };
+static SUNXI_CCU_MUX_WITH_GATE(tcon_lcd0_clk, "tcon-lcd0", tcon_parents,
+ 0x110, 24, 3, BIT(31), CLK_SET_RATE_PARENT);
+static SUNXI_CCU_MUX_WITH_GATE(tcon_lcd1_clk, "tcon-lcd1", tcon_parents,
+ 0x114, 24, 3, BIT(31), CLK_SET_RATE_PARENT);
+static SUNXI_CCU_M_WITH_MUX_GATE(tcon_tv0_clk, "tcon-tv0", tcon_parents,
+ 0x118, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(tcon_tv1_clk, "tcon-tv1", tcon_parents,
+ 0x11c, 0, 4, 24, 3, BIT(31), 0);
+
+static const char * const deinterlace_parents[] = { "pll-periph0",
+ "pll-periph1" };
+static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace",
+ deinterlace_parents, 0x124, 0, 4, 24, 3,
+ BIT(31), 0);
+
+static const char * const csi_mclk_parents[] = { "osc24M", "pll-video1",
+ "pll-periph1" };
+static SUNXI_CCU_M_WITH_MUX_GATE(csi1_mclk_clk, "csi1-mclk", csi_mclk_parents,
+ 0x130, 0, 5, 8, 3, BIT(15), 0);
+
+static const char * const csi_sclk_parents[] = { "pll-periph0", "pll-periph1" };
+static SUNXI_CCU_M_WITH_MUX_GATE(csi_sclk_clk, "csi-sclk", csi_sclk_parents,
+ 0x134, 16, 4, 24, 3, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(csi0_mclk_clk, "csi0-mclk", csi_mclk_parents,
+ 0x134, 0, 5, 8, 3, BIT(15), 0);
+
+static SUNXI_CCU_M_WITH_GATE(ve_clk, "ve", "pll-ve",
+ 0x13c, 16, 3, BIT(31), CLK_SET_RATE_PARENT);
+
+static SUNXI_CCU_GATE(codec_clk, "codec", "pll-audio",
+ 0x140, BIT(31), CLK_SET_RATE_PARENT);
+static SUNXI_CCU_GATE(avs_clk, "avs", "osc24M",
+ 0x144, BIT(31), 0);
+
+static const char * const hdmi_parents[] = { "pll-video0", "pll-video1" };
+static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", hdmi_parents,
+ 0x150, 0, 4, 24, 2, BIT(31), 0);
+
+static SUNXI_CCU_GATE(hdmi_slow_clk, "hdmi-slow", "osc24M",
+ 0x154, BIT(31), 0);
+
+/*
+ * In the SoC's user manual, the P factor is mentioned, but not used in
+ * the frequency formula.
+ *
+ * Here the factor is included, according to the BSP kernel source,
+ * which contains the P factor of this clock.
+ */
+static const char * const mbus_parents[] = { "osc24M", "pll-periph0-2x",
+ "pll-ddr0" };
+static SUNXI_CCU_MP_WITH_MUX_GATE(mbus_clk, "mbus", mbus_parents, 0x15c,
+ 0, 4, /* M */
+ 16, 2, /* P */
+ 24, 2, /* mux */
+ BIT(31), /* gate */
+ CLK_IS_CRITICAL);
+
+static const char * const dsi_dphy_parents[] = { "pll-video0", "pll-video1",
+ "pll-periph0" };
+static SUNXI_CCU_M_WITH_MUX_GATE(dsi_dphy_clk, "dsi-dphy", dsi_dphy_parents,
+ 0x168, 0, 4, 8, 2, BIT(15), 0);
+
+static SUNXI_CCU_M_WITH_MUX_GATE(tve0_clk, "tve0", tcon_parents,
+ 0x180, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(tve1_clk, "tve1", tcon_parents,
+ 0x184, 0, 4, 24, 3, BIT(31), 0);
+
+static const char * const tvd_parents[] = { "pll-video0", "pll-video1",
+ "pll-video0-2x", "pll-video1-2x" };
+static SUNXI_CCU_M_WITH_MUX_GATE(tvd0_clk, "tvd0", tvd_parents,
+ 0x188, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(tvd1_clk, "tvd1", tvd_parents,
+ 0x18c, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(tvd2_clk, "tvd2", tvd_parents,
+ 0x190, 0, 4, 24, 3, BIT(31), 0);
+static SUNXI_CCU_M_WITH_MUX_GATE(tvd3_clk, "tvd3", tvd_parents,
+ 0x194, 0, 4, 24, 3, BIT(31), 0);
+
+static SUNXI_CCU_M_WITH_GATE(gpu_clk, "gpu", "pll-gpu",
+ 0x1a0, 0, 3, BIT(31), CLK_SET_RATE_PARENT);
+
+static const char * const out_parents[] = { "osc24M", "osc32k", "osc24M" };
+static const struct ccu_mux_fixed_prediv out_predivs[] = {
+ { .index = 0, .div = 750, },
+};
+
+static struct ccu_mp outa_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(8, 5),
+ .p = _SUNXI_CCU_DIV(20, 2),
+ .mux = {
+ .shift = 24,
+ .width = 2,
+ .fixed_predivs = out_predivs,
+ .n_predivs = ARRAY_SIZE(out_predivs),
+ },
+ .common = {
+ .reg = 0x1f0,
+ .features = CCU_FEATURE_FIXED_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("outa", out_parents,
+ &ccu_mp_ops, 0),
+ }
+};
+
+static struct ccu_mp outb_clk = {
+ .enable = BIT(31),
+ .m = _SUNXI_CCU_DIV(8, 5),
+ .p = _SUNXI_CCU_DIV(20, 2),
+ .mux = {
+ .shift = 24,
+ .width = 2,
+ .fixed_predivs = out_predivs,
+ .n_predivs = ARRAY_SIZE(out_predivs),
+ },
+ .common = {
+ .reg = 0x1f4,
+ .features = CCU_FEATURE_FIXED_PREDIV,
+ .hw.init = CLK_HW_INIT_PARENTS("outb", out_parents,
+ &ccu_mp_ops, 0),
+ }
+};
+
+static struct ccu_common *sun8i_r40_ccu_clks[] = {
+ &pll_cpu_clk.common,
+ &pll_audio_base_clk.common,
+ &pll_video0_clk.common,
+ &pll_ve_clk.common,
+ &pll_ddr0_clk.common,
+ &pll_periph0_clk.common,
+ &pll_periph0_sata_clk.common,
+ &pll_periph1_clk.common,
+ &pll_video1_clk.common,
+ &pll_sata_clk.common,
+ &pll_sata_out_clk.common,
+ &pll_gpu_clk.common,
+ &pll_mipi_clk.common,
+ &pll_de_clk.common,
+ &pll_ddr1_clk.common,
+ &cpu_clk.common,
+ &axi_clk.common,
+ &ahb1_clk.common,
+ &apb1_clk.common,
+ &apb2_clk.common,
+ &bus_mipi_dsi_clk.common,
+ &bus_ce_clk.common,
+ &bus_dma_clk.common,
+ &bus_mmc0_clk.common,
+ &bus_mmc1_clk.common,
+ &bus_mmc2_clk.common,
+ &bus_mmc3_clk.common,
+ &bus_nand_clk.common,
+ &bus_dram_clk.common,
+ &bus_emac_clk.common,
+ &bus_ts_clk.common,
+ &bus_hstimer_clk.common,
+ &bus_spi0_clk.common,
+ &bus_spi1_clk.common,
+ &bus_spi2_clk.common,
+ &bus_spi3_clk.common,
+ &bus_sata_clk.common,
+ &bus_otg_clk.common,
+ &bus_ehci0_clk.common,
+ &bus_ehci1_clk.common,
+ &bus_ehci2_clk.common,
+ &bus_ohci0_clk.common,
+ &bus_ohci1_clk.common,
+ &bus_ohci2_clk.common,
+ &bus_ve_clk.common,
+ &bus_mp_clk.common,
+ &bus_deinterlace_clk.common,
+ &bus_csi0_clk.common,
+ &bus_csi1_clk.common,
+ &bus_hdmi0_clk.common,
+ &bus_hdmi1_clk.common,
+ &bus_de_clk.common,
+ &bus_tve0_clk.common,
+ &bus_tve1_clk.common,
+ &bus_tve_top_clk.common,
+ &bus_gmac_clk.common,
+ &bus_gpu_clk.common,
+ &bus_tvd0_clk.common,
+ &bus_tvd1_clk.common,
+ &bus_tvd2_clk.common,
+ &bus_tvd3_clk.common,
+ &bus_tvd_top_clk.common,
+ &bus_tcon_lcd0_clk.common,
+ &bus_tcon_lcd1_clk.common,
+ &bus_tcon_tv0_clk.common,
+ &bus_tcon_tv1_clk.common,
+ &bus_tcon_top_clk.common,
+ &bus_codec_clk.common,
+ &bus_spdif_clk.common,
+ &bus_ac97_clk.common,
+ &bus_pio_clk.common,
+ &bus_ir0_clk.common,
+ &bus_ir1_clk.common,
+ &bus_ths_clk.common,
+ &bus_keypad_clk.common,
+ &bus_i2s0_clk.common,
+ &bus_i2s1_clk.common,
+ &bus_i2s2_clk.common,
+ &bus_i2c0_clk.common,
+ &bus_i2c1_clk.common,
+ &bus_i2c2_clk.common,
+ &bus_i2c3_clk.common,
+ &bus_can_clk.common,
+ &bus_scr_clk.common,
+ &bus_ps20_clk.common,
+ &bus_ps21_clk.common,
+ &bus_i2c4_clk.common,
+ &bus_uart0_clk.common,
+ &bus_uart1_clk.common,
+ &bus_uart2_clk.common,
+ &bus_uart3_clk.common,
+ &bus_uart4_clk.common,
+ &bus_uart5_clk.common,
+ &bus_uart6_clk.common,
+ &bus_uart7_clk.common,
+ &bus_dbg_clk.common,
+ &ths_clk.common,
+ &nand_clk.common,
+ &mmc0_clk.common,
+ &mmc1_clk.common,
+ &mmc2_clk.common,
+ &mmc3_clk.common,
+ &ts_clk.common,
+ &ce_clk.common,
+ &spi0_clk.common,
+ &spi1_clk.common,
+ &spi2_clk.common,
+ &spi3_clk.common,
+ &i2s0_clk.common,
+ &i2s1_clk.common,
+ &i2s2_clk.common,
+ &ac97_clk.common,
+ &spdif_clk.common,
+ &keypad_clk.common,
+ &sata_clk.common,
+ &usb_phy0_clk.common,
+ &usb_phy1_clk.common,
+ &usb_phy2_clk.common,
+ &usb_ohci0_clk.common,
+ &usb_ohci1_clk.common,
+ &usb_ohci2_clk.common,
+ &ir0_clk.common,
+ &ir1_clk.common,
+ &dram_clk.common,
+ &dram_ve_clk.common,
+ &dram_csi0_clk.common,
+ &dram_csi1_clk.common,
+ &dram_ts_clk.common,
+ &dram_tvd_clk.common,
+ &dram_mp_clk.common,
+ &dram_deinterlace_clk.common,
+ &de_clk.common,
+ &mp_clk.common,
+ &tcon_lcd0_clk.common,
+ &tcon_lcd1_clk.common,
+ &tcon_tv0_clk.common,
+ &tcon_tv1_clk.common,
+ &deinterlace_clk.common,
+ &csi1_mclk_clk.common,
+ &csi_sclk_clk.common,
+ &csi0_mclk_clk.common,
+ &ve_clk.common,
+ &codec_clk.common,
+ &avs_clk.common,
+ &hdmi_clk.common,
+ &hdmi_slow_clk.common,
+ &mbus_clk.common,
+ &dsi_dphy_clk.common,
+ &tve0_clk.common,
+ &tve1_clk.common,
+ &tvd0_clk.common,
+ &tvd1_clk.common,
+ &tvd2_clk.common,
+ &tvd3_clk.common,
+ &gpu_clk.common,
+ &outa_clk.common,
+ &outb_clk.common,
+};
+
+/* Fixed Factor clocks */
+static CLK_FIXED_FACTOR(osc12M_clk, "osc12M", "osc24M", 2, 1, 0);
+
+/* We hardcode the divider to 4 for now */
+static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio",
+ "pll-audio-base", 4, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_2x_clk, "pll-audio-2x",
+ "pll-audio-base", 2, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_4x_clk, "pll-audio-4x",
+ "pll-audio-base", 1, 1, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_audio_8x_clk, "pll-audio-8x",
+ "pll-audio-base", 1, 2, CLK_SET_RATE_PARENT);
+static CLK_FIXED_FACTOR(pll_periph0_2x_clk, "pll-periph0-2x",
+ "pll-periph0", 1, 2, 0);
+static CLK_FIXED_FACTOR(pll_periph1_2x_clk, "pll-periph1-2x",
+ "pll-periph1", 1, 2, 0);
+static CLK_FIXED_FACTOR(pll_video0_2x_clk, "pll-video0-2x",
+ "pll-video0", 1, 2, 0);
+static CLK_FIXED_FACTOR(pll_video1_2x_clk, "pll-video1-2x",
+ "pll-video1", 1, 2, 0);
+
+static struct clk_hw_onecell_data sun8i_r40_hw_clks = {
+ .hws = {
+ [CLK_OSC_12M] = &osc12M_clk.hw,
+ [CLK_PLL_CPU] = &pll_cpu_clk.common.hw,
+ [CLK_PLL_AUDIO_BASE] = &pll_audio_base_clk.common.hw,
+ [CLK_PLL_AUDIO] = &pll_audio_clk.hw,
+ [CLK_PLL_AUDIO_2X] = &pll_audio_2x_clk.hw,
+ [CLK_PLL_AUDIO_4X] = &pll_audio_4x_clk.hw,
+ [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw,
+ [CLK_PLL_VIDEO0] = &pll_video0_clk.common.hw,
+ [CLK_PLL_VIDEO0_2X] = &pll_video0_2x_clk.hw,
+ [CLK_PLL_VE] = &pll_ve_clk.common.hw,
+ [CLK_PLL_DDR0] = &pll_ddr0_clk.common.hw,
+ [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw,
+ [CLK_PLL_PERIPH0_SATA] = &pll_periph0_sata_clk.common.hw,
+ [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw,
+ [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw,
+ [CLK_PLL_PERIPH1_2X] = &pll_periph1_2x_clk.hw,
+ [CLK_PLL_VIDEO1] = &pll_video1_clk.common.hw,
+ [CLK_PLL_VIDEO1_2X] = &pll_video1_2x_clk.hw,
+ [CLK_PLL_SATA] = &pll_sata_clk.common.hw,
+ [CLK_PLL_SATA_OUT] = &pll_sata_out_clk.common.hw,
+ [CLK_PLL_GPU] = &pll_gpu_clk.common.hw,
+ [CLK_PLL_MIPI] = &pll_mipi_clk.common.hw,
+ [CLK_PLL_DE] = &pll_de_clk.common.hw,
+ [CLK_PLL_DDR1] = &pll_ddr1_clk.common.hw,
+ [CLK_CPU] = &cpu_clk.common.hw,
+ [CLK_AXI] = &axi_clk.common.hw,
+ [CLK_AHB1] = &ahb1_clk.common.hw,
+ [CLK_APB1] = &apb1_clk.common.hw,
+ [CLK_APB2] = &apb2_clk.common.hw,
+ [CLK_BUS_MIPI_DSI] = &bus_mipi_dsi_clk.common.hw,
+ [CLK_BUS_CE] = &bus_ce_clk.common.hw,
+ [CLK_BUS_DMA] = &bus_dma_clk.common.hw,
+ [CLK_BUS_MMC0] = &bus_mmc0_clk.common.hw,
+ [CLK_BUS_MMC1] = &bus_mmc1_clk.common.hw,
+ [CLK_BUS_MMC2] = &bus_mmc2_clk.common.hw,
+ [CLK_BUS_MMC3] = &bus_mmc3_clk.common.hw,
+ [CLK_BUS_NAND] = &bus_nand_clk.common.hw,
+ [CLK_BUS_DRAM] = &bus_dram_clk.common.hw,
+ [CLK_BUS_EMAC] = &bus_emac_clk.common.hw,
+ [CLK_BUS_TS] = &bus_ts_clk.common.hw,
+ [CLK_BUS_HSTIMER] = &bus_hstimer_clk.common.hw,
+ [CLK_BUS_SPI0] = &bus_spi0_clk.common.hw,
+ [CLK_BUS_SPI1] = &bus_spi1_clk.common.hw,
+ [CLK_BUS_SPI2] = &bus_spi2_clk.common.hw,
+ [CLK_BUS_SPI3] = &bus_spi3_clk.common.hw,
+ [CLK_BUS_SATA] = &bus_sata_clk.common.hw,
+ [CLK_BUS_OTG] = &bus_otg_clk.common.hw,
+ [CLK_BUS_EHCI0] = &bus_ehci0_clk.common.hw,
+ [CLK_BUS_EHCI1] = &bus_ehci1_clk.common.hw,
+ [CLK_BUS_EHCI2] = &bus_ehci2_clk.common.hw,
+ [CLK_BUS_OHCI0] = &bus_ohci0_clk.common.hw,
+ [CLK_BUS_OHCI1] = &bus_ohci1_clk.common.hw,
+ [CLK_BUS_OHCI2] = &bus_ohci2_clk.common.hw,
+ [CLK_BUS_VE] = &bus_ve_clk.common.hw,
+ [CLK_BUS_MP] = &bus_mp_clk.common.hw,
+ [CLK_BUS_DEINTERLACE] = &bus_deinterlace_clk.common.hw,
+ [CLK_BUS_CSI0] = &bus_csi0_clk.common.hw,
+ [CLK_BUS_CSI1] = &bus_csi1_clk.common.hw,
+ [CLK_BUS_HDMI0] = &bus_hdmi0_clk.common.hw,
+ [CLK_BUS_HDMI1] = &bus_hdmi1_clk.common.hw,
+ [CLK_BUS_DE] = &bus_de_clk.common.hw,
+ [CLK_BUS_TVE0] = &bus_tve0_clk.common.hw,
+ [CLK_BUS_TVE1] = &bus_tve1_clk.common.hw,
+ [CLK_BUS_TVE_TOP] = &bus_tve_top_clk.common.hw,
+ [CLK_BUS_GMAC] = &bus_gmac_clk.common.hw,
+ [CLK_BUS_GPU] = &bus_gpu_clk.common.hw,
+ [CLK_BUS_TVD0] = &bus_tvd0_clk.common.hw,
+ [CLK_BUS_TVD1] = &bus_tvd1_clk.common.hw,
+ [CLK_BUS_TVD2] = &bus_tvd2_clk.common.hw,
+ [CLK_BUS_TVD3] = &bus_tvd3_clk.common.hw,
+ [CLK_BUS_TVD_TOP] = &bus_tvd_top_clk.common.hw,
+ [CLK_BUS_TCON_LCD0] = &bus_tcon_lcd0_clk.common.hw,
+ [CLK_BUS_TCON_LCD1] = &bus_tcon_lcd1_clk.common.hw,
+ [CLK_BUS_TCON_TV0] = &bus_tcon_tv0_clk.common.hw,
+ [CLK_BUS_TCON_TV1] = &bus_tcon_tv1_clk.common.hw,
+ [CLK_BUS_TCON_TOP] = &bus_tcon_top_clk.common.hw,
+ [CLK_BUS_CODEC] = &bus_codec_clk.common.hw,
+ [CLK_BUS_SPDIF] = &bus_spdif_clk.common.hw,
+ [CLK_BUS_AC97] = &bus_ac97_clk.common.hw,
+ [CLK_BUS_PIO] = &bus_pio_clk.common.hw,
+ [CLK_BUS_IR0] = &bus_ir0_clk.common.hw,
+ [CLK_BUS_IR1] = &bus_ir1_clk.common.hw,
+ [CLK_BUS_THS] = &bus_ths_clk.common.hw,
+ [CLK_BUS_KEYPAD] = &bus_keypad_clk.common.hw,
+ [CLK_BUS_I2S0] = &bus_i2s0_clk.common.hw,
+ [CLK_BUS_I2S1] = &bus_i2s1_clk.common.hw,
+ [CLK_BUS_I2S2] = &bus_i2s2_clk.common.hw,
+ [CLK_BUS_I2C0] = &bus_i2c0_clk.common.hw,
+ [CLK_BUS_I2C1] = &bus_i2c1_clk.common.hw,
+ [CLK_BUS_I2C2] = &bus_i2c2_clk.common.hw,
+ [CLK_BUS_I2C3] = &bus_i2c3_clk.common.hw,
+ [CLK_BUS_CAN] = &bus_can_clk.common.hw,
+ [CLK_BUS_SCR] = &bus_scr_clk.common.hw,
+ [CLK_BUS_PS20] = &bus_ps20_clk.common.hw,
+ [CLK_BUS_PS21] = &bus_ps21_clk.common.hw,
+ [CLK_BUS_I2C4] = &bus_i2c4_clk.common.hw,
+ [CLK_BUS_UART0] = &bus_uart0_clk.common.hw,
+ [CLK_BUS_UART1] = &bus_uart1_clk.common.hw,
+ [CLK_BUS_UART2] = &bus_uart2_clk.common.hw,
+ [CLK_BUS_UART3] = &bus_uart3_clk.common.hw,
+ [CLK_BUS_UART4] = &bus_uart4_clk.common.hw,
+ [CLK_BUS_UART5] = &bus_uart5_clk.common.hw,
+ [CLK_BUS_UART6] = &bus_uart6_clk.common.hw,
+ [CLK_BUS_UART7] = &bus_uart7_clk.common.hw,
+ [CLK_BUS_DBG] = &bus_dbg_clk.common.hw,
+ [CLK_THS] = &ths_clk.common.hw,
+ [CLK_NAND] = &nand_clk.common.hw,
+ [CLK_MMC0] = &mmc0_clk.common.hw,
+ [CLK_MMC1] = &mmc1_clk.common.hw,
+ [CLK_MMC2] = &mmc2_clk.common.hw,
+ [CLK_MMC3] = &mmc3_clk.common.hw,
+ [CLK_TS] = &ts_clk.common.hw,
+ [CLK_CE] = &ce_clk.common.hw,
+ [CLK_SPI0] = &spi0_clk.common.hw,
+ [CLK_SPI1] = &spi1_clk.common.hw,
+ [CLK_SPI2] = &spi2_clk.common.hw,
+ [CLK_SPI3] = &spi3_clk.common.hw,
+ [CLK_I2S0] = &i2s0_clk.common.hw,
+ [CLK_I2S1] = &i2s1_clk.common.hw,
+ [CLK_I2S2] = &i2s2_clk.common.hw,
+ [CLK_AC97] = &ac97_clk.common.hw,
+ [CLK_SPDIF] = &spdif_clk.common.hw,
+ [CLK_KEYPAD] = &keypad_clk.common.hw,
+ [CLK_SATA] = &sata_clk.common.hw,
+ [CLK_USB_PHY0] = &usb_phy0_clk.common.hw,
+ [CLK_USB_PHY1] = &usb_phy1_clk.common.hw,
+ [CLK_USB_PHY2] = &usb_phy2_clk.common.hw,
+ [CLK_USB_OHCI0] = &usb_ohci0_clk.common.hw,
+ [CLK_USB_OHCI1] = &usb_ohci1_clk.common.hw,
+ [CLK_USB_OHCI2] = &usb_ohci2_clk.common.hw,
+ [CLK_IR0] = &ir0_clk.common.hw,
+ [CLK_IR1] = &ir1_clk.common.hw,
+ [CLK_DRAM] = &dram_clk.common.hw,
+ [CLK_DRAM_VE] = &dram_ve_clk.common.hw,
+ [CLK_DRAM_CSI0] = &dram_csi0_clk.common.hw,
+ [CLK_DRAM_CSI1] = &dram_csi1_clk.common.hw,
+ [CLK_DRAM_TS] = &dram_ts_clk.common.hw,
+ [CLK_DRAM_TVD] = &dram_tvd_clk.common.hw,
+ [CLK_DRAM_MP] = &dram_mp_clk.common.hw,
+ [CLK_DRAM_DEINTERLACE] = &dram_deinterlace_clk.common.hw,
+ [CLK_DE] = &de_clk.common.hw,
+ [CLK_MP] = &mp_clk.common.hw,
+ [CLK_TCON_LCD0] = &tcon_lcd0_clk.common.hw,
+ [CLK_TCON_LCD1] = &tcon_lcd1_clk.common.hw,
+ [CLK_TCON_TV0] = &tcon_tv0_clk.common.hw,
+ [CLK_TCON_TV1] = &tcon_tv1_clk.common.hw,
+ [CLK_DEINTERLACE] = &deinterlace_clk.common.hw,
+ [CLK_CSI1_MCLK] = &csi1_mclk_clk.common.hw,
+ [CLK_CSI_SCLK] = &csi_sclk_clk.common.hw,
+ [CLK_CSI0_MCLK] = &csi0_mclk_clk.common.hw,
+ [CLK_VE] = &ve_clk.common.hw,
+ [CLK_CODEC] = &codec_clk.common.hw,
+ [CLK_AVS] = &avs_clk.common.hw,
+ [CLK_HDMI] = &hdmi_clk.common.hw,
+ [CLK_HDMI_SLOW] = &hdmi_slow_clk.common.hw,
+ [CLK_MBUS] = &mbus_clk.common.hw,
+ [CLK_DSI_DPHY] = &dsi_dphy_clk.common.hw,
+ [CLK_TVE0] = &tve0_clk.common.hw,
+ [CLK_TVE1] = &tve1_clk.common.hw,
+ [CLK_TVD0] = &tvd0_clk.common.hw,
+ [CLK_TVD1] = &tvd1_clk.common.hw,
+ [CLK_TVD2] = &tvd2_clk.common.hw,
+ [CLK_TVD3] = &tvd3_clk.common.hw,
+ [CLK_GPU] = &gpu_clk.common.hw,
+ [CLK_OUTA] = &outa_clk.common.hw,
+ [CLK_OUTB] = &outb_clk.common.hw,
+ },
+ .num = CLK_NUMBER,
+};
+
+static struct ccu_reset_map sun8i_r40_ccu_resets[] = {
+ [RST_USB_PHY0] = { 0x0cc, BIT(0) },
+ [RST_USB_PHY1] = { 0x0cc, BIT(1) },
+ [RST_USB_PHY2] = { 0x0cc, BIT(2) },
+
+ [RST_DRAM] = { 0x0f4, BIT(31) },
+ [RST_MBUS] = { 0x0fc, BIT(31) },
+
+ [RST_BUS_MIPI_DSI] = { 0x2c0, BIT(1) },
+ [RST_BUS_CE] = { 0x2c0, BIT(5) },
+ [RST_BUS_DMA] = { 0x2c0, BIT(6) },
+ [RST_BUS_MMC0] = { 0x2c0, BIT(8) },
+ [RST_BUS_MMC1] = { 0x2c0, BIT(9) },
+ [RST_BUS_MMC2] = { 0x2c0, BIT(10) },
+ [RST_BUS_MMC3] = { 0x2c0, BIT(11) },
+ [RST_BUS_NAND] = { 0x2c0, BIT(13) },
+ [RST_BUS_DRAM] = { 0x2c0, BIT(14) },
+ [RST_BUS_EMAC] = { 0x2c0, BIT(17) },
+ [RST_BUS_TS] = { 0x2c0, BIT(18) },
+ [RST_BUS_HSTIMER] = { 0x2c0, BIT(19) },
+ [RST_BUS_SPI0] = { 0x2c0, BIT(20) },
+ [RST_BUS_SPI1] = { 0x2c0, BIT(21) },
+ [RST_BUS_SPI2] = { 0x2c0, BIT(22) },
+ [RST_BUS_SPI3] = { 0x2c0, BIT(23) },
+ [RST_BUS_SATA] = { 0x2c0, BIT(24) },
+ [RST_BUS_OTG] = { 0x2c0, BIT(25) },
+ [RST_BUS_EHCI0] = { 0x2c0, BIT(26) },
+ [RST_BUS_EHCI1] = { 0x2c0, BIT(27) },
+ [RST_BUS_EHCI2] = { 0x2c0, BIT(28) },
+ [RST_BUS_OHCI0] = { 0x2c0, BIT(29) },
+ [RST_BUS_OHCI1] = { 0x2c0, BIT(30) },
+ [RST_BUS_OHCI2] = { 0x2c0, BIT(31) },
+
+ [RST_BUS_VE] = { 0x2c4, BIT(0) },
+ [RST_BUS_MP] = { 0x2c4, BIT(2) },
+ [RST_BUS_DEINTERLACE] = { 0x2c4, BIT(5) },
+ [RST_BUS_CSI0] = { 0x2c4, BIT(8) },
+ [RST_BUS_CSI1] = { 0x2c4, BIT(9) },
+ [RST_BUS_HDMI0] = { 0x2c4, BIT(10) },
+ [RST_BUS_HDMI1] = { 0x2c4, BIT(11) },
+ [RST_BUS_DE] = { 0x2c4, BIT(12) },
+ [RST_BUS_TVE0] = { 0x2c4, BIT(13) },
+ [RST_BUS_TVE1] = { 0x2c4, BIT(14) },
+ [RST_BUS_TVE_TOP] = { 0x2c4, BIT(15) },
+ [RST_BUS_GMAC] = { 0x2c4, BIT(17) },
+ [RST_BUS_GPU] = { 0x2c4, BIT(20) },
+ [RST_BUS_TVD0] = { 0x2c4, BIT(21) },
+ [RST_BUS_TVD1] = { 0x2c4, BIT(22) },
+ [RST_BUS_TVD2] = { 0x2c4, BIT(23) },
+ [RST_BUS_TVD3] = { 0x2c4, BIT(24) },
+ [RST_BUS_TVD_TOP] = { 0x2c4, BIT(25) },
+ [RST_BUS_TCON_LCD0] = { 0x2c4, BIT(26) },
+ [RST_BUS_TCON_LCD1] = { 0x2c4, BIT(27) },
+ [RST_BUS_TCON_TV0] = { 0x2c4, BIT(28) },
+ [RST_BUS_TCON_TV1] = { 0x2c4, BIT(29) },
+ [RST_BUS_TCON_TOP] = { 0x2c4, BIT(30) },
+ [RST_BUS_DBG] = { 0x2c4, BIT(31) },
+
+ [RST_BUS_LVDS] = { 0x2c8, BIT(0) },
+
+ [RST_BUS_CODEC] = { 0x2d0, BIT(0) },
+ [RST_BUS_SPDIF] = { 0x2d0, BIT(1) },
+ [RST_BUS_AC97] = { 0x2d0, BIT(2) },
+ [RST_BUS_IR0] = { 0x2d0, BIT(6) },
+ [RST_BUS_IR1] = { 0x2d0, BIT(7) },
+ [RST_BUS_THS] = { 0x2d0, BIT(8) },
+ [RST_BUS_KEYPAD] = { 0x2d0, BIT(10) },
+ [RST_BUS_I2S0] = { 0x2d0, BIT(12) },
+ [RST_BUS_I2S1] = { 0x2d0, BIT(13) },
+ [RST_BUS_I2S2] = { 0x2d0, BIT(14) },
+
+ [RST_BUS_I2C0] = { 0x2d8, BIT(0) },
+ [RST_BUS_I2C1] = { 0x2d8, BIT(1) },
+ [RST_BUS_I2C2] = { 0x2d8, BIT(2) },
+ [RST_BUS_I2C3] = { 0x2d8, BIT(3) },
+ [RST_BUS_CAN] = { 0x2d8, BIT(4) },
+ [RST_BUS_SCR] = { 0x2d8, BIT(5) },
+ [RST_BUS_PS20] = { 0x2d8, BIT(6) },
+ [RST_BUS_PS21] = { 0x2d8, BIT(7) },
+ [RST_BUS_I2C4] = { 0x2d8, BIT(15) },
+ [RST_BUS_UART0] = { 0x2d8, BIT(16) },
+ [RST_BUS_UART1] = { 0x2d8, BIT(17) },
+ [RST_BUS_UART2] = { 0x2d8, BIT(18) },
+ [RST_BUS_UART3] = { 0x2d8, BIT(19) },
+ [RST_BUS_UART4] = { 0x2d8, BIT(20) },
+ [RST_BUS_UART5] = { 0x2d8, BIT(21) },
+ [RST_BUS_UART6] = { 0x2d8, BIT(22) },
+ [RST_BUS_UART7] = { 0x2d8, BIT(23) },
+};
+
+static const struct sunxi_ccu_desc sun8i_r40_ccu_desc = {
+ .ccu_clks = sun8i_r40_ccu_clks,
+ .num_ccu_clks = ARRAY_SIZE(sun8i_r40_ccu_clks),
+
+ .hw_clks = &sun8i_r40_hw_clks,
+
+ .resets = sun8i_r40_ccu_resets,
+ .num_resets = ARRAY_SIZE(sun8i_r40_ccu_resets),
+};
+
+static struct ccu_pll_nb sun8i_r40_pll_cpu_nb = {
+ .common = &pll_cpu_clk.common,
+ /* copy from pll_cpu_clk */
+ .enable = BIT(31),
+ .lock = BIT(28),
+};
+
+static struct ccu_mux_nb sun8i_r40_cpu_nb = {
+ .common = &cpu_clk.common,
+ .cm = &cpu_clk.mux,
+ .delay_us = 1, /* > 8 clock cycles at 24 MHz */
+ .bypass_index = 1, /* index of 24 MHz oscillator */
+};
+
+static void __init sun8i_r40_ccu_setup(struct device_node *node)
+{
+ void __iomem *reg;
+ u32 val;
+
+ reg = of_io_request_and_map(node, 0, of_node_full_name(node));
+ if (IS_ERR(reg)) {
+ pr_err("%s: Could not map the clock registers\n",
+ of_node_full_name(node));
+ return;
+ }
+
+ /* Force the PLL-Audio-1x divider to 4 */
+ val = readl(reg + SUN8I_R40_PLL_AUDIO_REG);
+ val &= ~GENMASK(19, 16);
+ writel(val | (3 << 16), reg + SUN8I_R40_PLL_AUDIO_REG);
+
+ /* Force PLL-MIPI to MIPI mode */
+ val = readl(reg + SUN8I_R40_PLL_MIPI_REG);
+ val &= ~BIT(16);
+ writel(val, reg + SUN8I_R40_PLL_MIPI_REG);
+
+ /* Force OHCI 12M parent to 12M divided from 48M */
+ val = readl(reg + SUN8I_R40_USB_CLK_REG);
+ val &= ~GENMASK(25, 20);
+ writel(val, reg + SUN8I_R40_USB_CLK_REG);
+
+ sunxi_ccu_probe(node, reg, &sun8i_r40_ccu_desc);
+
+ /* Gate then ungate PLL CPU after any rate changes */
+ ccu_pll_notifier_register(&sun8i_r40_pll_cpu_nb);
+
+ /* Reparent CPU during PLL CPU rate changes */
+ ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
+ &sun8i_r40_cpu_nb);
+}
+CLK_OF_DECLARE(sun8i_r40_ccu, "allwinner,sun8i-r40-ccu",
+ sun8i_r40_ccu_setup);
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r40.h b/drivers/clk/sunxi-ng/ccu-sun8i-r40.h
new file mode 100644
index 000000000000..0db8e1e97af8
--- /dev/null
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-r40.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2017 Icenowy Zheng <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _CCU_SUN8I_R40_H_
+#define _CCU_SUN8I_R40_H_
+
+#include <dt-bindings/clock/sun8i-r40-ccu.h>
+#include <dt-bindings/reset/sun8i-r40-ccu.h>
+
+#define CLK_OSC_12M 0
+#define CLK_PLL_CPU 1
+#define CLK_PLL_AUDIO_BASE 2
+#define CLK_PLL_AUDIO 3
+#define CLK_PLL_AUDIO_2X 4
+#define CLK_PLL_AUDIO_4X 5
+#define CLK_PLL_AUDIO_8X 6
+#define CLK_PLL_VIDEO0 7
+#define CLK_PLL_VIDEO0_2X 8
+#define CLK_PLL_VE 9
+#define CLK_PLL_DDR0 10
+#define CLK_PLL_PERIPH0 11
+#define CLK_PLL_PERIPH0_SATA 12
+#define CLK_PLL_PERIPH0_2X 13
+#define CLK_PLL_PERIPH1 14
+#define CLK_PLL_PERIPH1_2X 15
+#define CLK_PLL_VIDEO1 16
+#define CLK_PLL_VIDEO1_2X 17
+#define CLK_PLL_SATA 18
+#define CLK_PLL_SATA_OUT 19
+#define CLK_PLL_GPU 20
+#define CLK_PLL_MIPI 21
+#define CLK_PLL_DE 22
+#define CLK_PLL_DDR1 23
+
+/* The CPU clock is exported */
+
+#define CLK_AXI 25
+#define CLK_AHB1 26
+#define CLK_APB1 27
+#define CLK_APB2 28
+
+/* All the bus gates are exported */
+
+/* The first bunch of module clocks are exported */
+
+#define CLK_DRAM 132
+
+/* All the DRAM gates are exported */
+
+/* Some more module clocks are exported */
+
+#define CLK_MBUS 155
+
+/* Another bunch of module clocks are exported */
+
+#define CLK_NUMBER (CLK_OUTB + 1)
+
+#endif /* _CCU_SUN8I_R40_H_ */
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
index a34a78d7fb28..621b1cd996db 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
@@ -575,8 +575,7 @@ static void __init sun8i_v3s_ccu_setup(struct device_node *node)
reg = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(reg)) {
- pr_err("%s: Could not map the clock registers\n",
- of_node_full_name(node));
+ pr_err("%pOF: Could not map the clock registers\n", node);
return;
}
diff --git a/drivers/clk/sunxi-ng/ccu_div.c b/drivers/clk/sunxi-ng/ccu_div.c
index c0e5c10d0091..baa3cf96507b 100644
--- a/drivers/clk/sunxi-ng/ccu_div.c
+++ b/drivers/clk/sunxi-ng/ccu_div.c
@@ -21,10 +21,18 @@ static unsigned long ccu_div_round_rate(struct ccu_mux_internal *mux,
{
struct ccu_div *cd = data;
- return divider_round_rate_parent(&cd->common.hw, parent,
+ if (cd->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate *= cd->fixed_post_div;
+
+ rate = divider_round_rate_parent(&cd->common.hw, parent,
rate, parent_rate,
cd->div.table, cd->div.width,
cd->div.flags);
+
+ if (cd->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate /= cd->fixed_post_div;
+
+ return rate;
}
static void ccu_div_disable(struct clk_hw *hw)
@@ -62,8 +70,13 @@ static unsigned long ccu_div_recalc_rate(struct clk_hw *hw,
parent_rate = ccu_mux_helper_apply_prediv(&cd->common, &cd->mux, -1,
parent_rate);
- return divider_recalc_rate(hw, parent_rate, val, cd->div.table,
- cd->div.flags);
+ val = divider_recalc_rate(hw, parent_rate, val, cd->div.table,
+ cd->div.flags);
+
+ if (cd->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ val /= cd->fixed_post_div;
+
+ return val;
}
static int ccu_div_determine_rate(struct clk_hw *hw,
@@ -86,6 +99,9 @@ static int ccu_div_set_rate(struct clk_hw *hw, unsigned long rate,
parent_rate = ccu_mux_helper_apply_prediv(&cd->common, &cd->mux, -1,
parent_rate);
+ if (cd->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate *= cd->fixed_post_div;
+
val = divider_get_val(rate, parent_rate, cd->div.table, cd->div.width,
cd->div.flags);
diff --git a/drivers/clk/sunxi-ng/ccu_div.h b/drivers/clk/sunxi-ng/ccu_div.h
index 08d074451204..f3a5028dcd14 100644
--- a/drivers/clk/sunxi-ng/ccu_div.h
+++ b/drivers/clk/sunxi-ng/ccu_div.h
@@ -86,9 +86,10 @@ struct ccu_div_internal {
struct ccu_div {
u32 enable;
- struct ccu_div_internal div;
+ struct ccu_div_internal div;
struct ccu_mux_internal mux;
struct ccu_common common;
+ unsigned int fixed_post_div;
};
#define SUNXI_CCU_DIV_TABLE_WITH_GATE(_struct, _name, _parent, _reg, \
diff --git a/drivers/clk/sunxi-ng/ccu_frac.c b/drivers/clk/sunxi-ng/ccu_frac.c
index 8b5eb7756bf7..d1d168d4c4f0 100644
--- a/drivers/clk/sunxi-ng/ccu_frac.c
+++ b/drivers/clk/sunxi-ng/ccu_frac.c
@@ -67,25 +67,25 @@ unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,
{
u32 reg;
- printk("%s: Read fractional\n", clk_hw_get_name(&common->hw));
+ pr_debug("%s: Read fractional\n", clk_hw_get_name(&common->hw));
if (!(common->features & CCU_FEATURE_FRACTIONAL))
return 0;
- printk("%s: clock is fractional (rates %lu and %lu)\n",
- clk_hw_get_name(&common->hw), cf->rates[0], cf->rates[1]);
+ pr_debug("%s: clock is fractional (rates %lu and %lu)\n",
+ clk_hw_get_name(&common->hw), cf->rates[0], cf->rates[1]);
reg = readl(common->base + common->reg);
- printk("%s: clock reg is 0x%x (select is 0x%x)\n",
- clk_hw_get_name(&common->hw), reg, cf->select);
+ pr_debug("%s: clock reg is 0x%x (select is 0x%x)\n",
+ clk_hw_get_name(&common->hw), reg, cf->select);
return (reg & cf->select) ? cf->rates[1] : cf->rates[0];
}
int ccu_frac_helper_set_rate(struct ccu_common *common,
struct ccu_frac_internal *cf,
- unsigned long rate)
+ unsigned long rate, u32 lock)
{
unsigned long flags;
u32 reg, sel;
@@ -106,5 +106,7 @@ int ccu_frac_helper_set_rate(struct ccu_common *common,
writel(reg | sel, common->base + common->reg);
spin_unlock_irqrestore(common->lock, flags);
+ ccu_helper_wait_for_lock(common, lock);
+
return 0;
}
diff --git a/drivers/clk/sunxi-ng/ccu_frac.h b/drivers/clk/sunxi-ng/ccu_frac.h
index 7b1ee380156f..efe2dd6bac01 100644
--- a/drivers/clk/sunxi-ng/ccu_frac.h
+++ b/drivers/clk/sunxi-ng/ccu_frac.h
@@ -48,6 +48,6 @@ unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,
int ccu_frac_helper_set_rate(struct ccu_common *common,
struct ccu_frac_internal *cf,
- unsigned long rate);
+ unsigned long rate, u32 lock);
#endif /* _CCU_FRAC_H_ */
diff --git a/drivers/clk/sunxi-ng/ccu_mult.c b/drivers/clk/sunxi-ng/ccu_mult.c
index 20d0300867f2..12e0783caee6 100644
--- a/drivers/clk/sunxi-ng/ccu_mult.c
+++ b/drivers/clk/sunxi-ng/ccu_mult.c
@@ -111,10 +111,14 @@ static int ccu_mult_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long flags;
u32 reg;
- if (ccu_frac_helper_has_rate(&cm->common, &cm->frac, rate))
- return ccu_frac_helper_set_rate(&cm->common, &cm->frac, rate);
- else
+ if (ccu_frac_helper_has_rate(&cm->common, &cm->frac, rate)) {
+ ccu_frac_helper_enable(&cm->common, &cm->frac);
+
+ return ccu_frac_helper_set_rate(&cm->common, &cm->frac,
+ rate, cm->lock);
+ } else {
ccu_frac_helper_disable(&cm->common, &cm->frac);
+ }
parent_rate = ccu_mux_helper_apply_prediv(&cm->common, &cm->mux, -1,
parent_rate);
diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c
index 44b16dc8fea6..841840e35e61 100644
--- a/drivers/clk/sunxi-ng/ccu_nkm.c
+++ b/drivers/clk/sunxi-ng/ccu_nkm.c
@@ -75,7 +75,7 @@ static unsigned long ccu_nkm_recalc_rate(struct clk_hw *hw,
unsigned long parent_rate)
{
struct ccu_nkm *nkm = hw_to_ccu_nkm(hw);
- unsigned long n, m, k;
+ unsigned long n, m, k, rate;
u32 reg;
reg = readl(nkm->common.base + nkm->common.reg);
@@ -98,7 +98,12 @@ static unsigned long ccu_nkm_recalc_rate(struct clk_hw *hw,
if (!m)
m++;
- return parent_rate * n * k / m;
+ rate = parent_rate * n * k / m;
+
+ if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate /= nkm->fixed_post_div;
+
+ return rate;
}
static unsigned long ccu_nkm_round_rate(struct ccu_mux_internal *mux,
@@ -117,9 +122,17 @@ static unsigned long ccu_nkm_round_rate(struct ccu_mux_internal *mux,
_nkm.min_m = 1;
_nkm.max_m = nkm->m.max ?: 1 << nkm->m.width;
+ if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate *= nkm->fixed_post_div;
+
ccu_nkm_find_best(*parent_rate, rate, &_nkm);
- return *parent_rate * _nkm.n * _nkm.k / _nkm.m;
+ rate = *parent_rate * _nkm.n * _nkm.k / _nkm.m;
+
+ if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate /= nkm->fixed_post_div;
+
+ return rate;
}
static int ccu_nkm_determine_rate(struct clk_hw *hw,
@@ -139,6 +152,9 @@ static int ccu_nkm_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long flags;
u32 reg;
+ if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV)
+ rate *= nkm->fixed_post_div;
+
_nkm.min_n = nkm->n.min ?: 1;
_nkm.max_n = nkm->n.max ?: 1 << nkm->n.width;
_nkm.min_k = nkm->k.min ?: 1;
diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h
index 34580894f4d1..cc6efb70a102 100644
--- a/drivers/clk/sunxi-ng/ccu_nkm.h
+++ b/drivers/clk/sunxi-ng/ccu_nkm.h
@@ -34,6 +34,8 @@ struct ccu_nkm {
struct ccu_div_internal m;
struct ccu_mux_internal mux;
+ unsigned int fixed_post_div;
+
struct ccu_common common;
};
diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c
index 5e5e90a4a50c..a32158e8f2e3 100644
--- a/drivers/clk/sunxi-ng/ccu_nm.c
+++ b/drivers/clk/sunxi-ng/ccu_nm.c
@@ -117,10 +117,23 @@ static int ccu_nm_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long flags;
u32 reg;
- if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate))
- return ccu_frac_helper_set_rate(&nm->common, &nm->frac, rate);
- else
+ if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate)) {
+ spin_lock_irqsave(nm->common.lock, flags);
+
+ /* most SoCs require M to be 0 if fractional mode is used */
+ reg = readl(nm->common.base + nm->common.reg);
+ reg &= ~GENMASK(nm->m.width + nm->m.shift - 1, nm->m.shift);
+ writel(reg, nm->common.base + nm->common.reg);
+
+ spin_unlock_irqrestore(nm->common.lock, flags);
+
+ ccu_frac_helper_enable(&nm->common, &nm->frac);
+
+ return ccu_frac_helper_set_rate(&nm->common, &nm->frac,
+ rate, nm->lock);
+ } else {
ccu_frac_helper_disable(&nm->common, &nm->frac);
+ }
_nm.min_n = nm->n.min ?: 1;
_nm.max_n = nm->n.max ?: 1 << nm->n.width;
diff --git a/drivers/clk/sunxi/clk-sun8i-bus-gates.c b/drivers/clk/sunxi/clk-sun8i-bus-gates.c
index 63fdb790df29..bee305bdddbe 100644
--- a/drivers/clk/sunxi/clk-sun8i-bus-gates.c
+++ b/drivers/clk/sunxi/clk-sun8i-bus-gates.c
@@ -78,6 +78,10 @@ static void __init sun8i_h3_bus_gates_init(struct device_node *node)
clk_parent = APB1;
else if (index >= 96 && index <= 127)
clk_parent = APB2;
+ else {
+ WARN_ON(true);
+ continue;
+ }
clk_reg = reg + 4 * (index / 32);
clk_bit = index % 32;
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
index f2c9274b8bd5..aa4add580516 100644
--- a/drivers/clk/sunxi/clk-sunxi.c
+++ b/drivers/clk/sunxi/clk-sunxi.c
@@ -666,15 +666,14 @@ static struct clk * __init sunxi_mux_clk_setup(struct device_node *node,
reg = of_iomap(node, 0);
if (!reg) {
- pr_err("Could not map registers for mux-clk: %s\n",
- of_node_full_name(node));
+ pr_err("Could not map registers for mux-clk: %pOF\n", node);
return NULL;
}
i = of_clk_parent_fill(node, parents, SUNXI_MAX_PARENTS);
if (of_property_read_string(node, "clock-output-names", &clk_name)) {
- pr_err("%s: could not read clock-output-names from \"%s\"\n",
- __func__, of_node_full_name(node));
+ pr_err("%s: could not read clock-output-names from \"%pOF\"\n",
+ __func__, node);
goto out_unmap;
}
@@ -797,16 +796,15 @@ static void __init sunxi_divider_clk_setup(struct device_node *node,
reg = of_iomap(node, 0);
if (!reg) {
- pr_err("Could not map registers for mux-clk: %s\n",
- of_node_full_name(node));
+ pr_err("Could not map registers for mux-clk: %pOF\n", node);
return;
}
clk_parent = of_clk_get_parent_name(node, 0);
if (of_property_read_string(node, "clock-output-names", &clk_name)) {
- pr_err("%s: could not read clock-output-names from \"%s\"\n",
- __func__, of_node_full_name(node));
+ pr_err("%s: could not read clock-output-names from \"%pOF\"\n",
+ __func__, node);
goto out_unmap;
}
@@ -1010,8 +1008,7 @@ static struct clk ** __init sunxi_divs_clk_setup(struct device_node *node,
reg = of_iomap(node, 0);
if (!reg) {
- pr_err("Could not map registers for divs-clk: %s\n",
- of_node_full_name(node));
+ pr_err("Could not map registers for divs-clk: %pOF\n", node);
return NULL;
}
diff --git a/drivers/clk/tegra/clk-emc.c b/drivers/clk/tegra/clk-emc.c
index 74e7544f861b..11a5066e5c27 100644
--- a/drivers/clk/tegra/clk-emc.c
+++ b/drivers/clk/tegra/clk-emc.c
@@ -378,7 +378,7 @@ static int load_one_timing_from_dt(struct tegra_clk_emc *tegra,
err = of_property_read_u32(node, "clock-frequency", &tmp);
if (err) {
- pr_err("timing %s: failed to read rate\n", node->full_name);
+ pr_err("timing %pOF: failed to read rate\n", node);
return err;
}
@@ -386,8 +386,7 @@ static int load_one_timing_from_dt(struct tegra_clk_emc *tegra,
err = of_property_read_u32(node, "nvidia,parent-clock-frequency", &tmp);
if (err) {
- pr_err("timing %s: failed to read parent rate\n",
- node->full_name);
+ pr_err("timing %pOF: failed to read parent rate\n", node);
return err;
}
@@ -395,8 +394,7 @@ static int load_one_timing_from_dt(struct tegra_clk_emc *tegra,
timing->parent = of_clk_get_by_name(node, "emc-parent");
if (IS_ERR(timing->parent)) {
- pr_err("timing %s: failed to get parent clock\n",
- node->full_name);
+ pr_err("timing %pOF: failed to get parent clock\n", node);
return PTR_ERR(timing->parent);
}
@@ -409,8 +407,8 @@ static int load_one_timing_from_dt(struct tegra_clk_emc *tegra,
}
}
if (timing->parent_index == 0xff) {
- pr_err("timing %s: %s is not a valid parent\n",
- node->full_name, __clk_get_name(timing->parent));
+ pr_err("timing %pOF: %s is not a valid parent\n",
+ node, __clk_get_name(timing->parent));
clk_put(timing->parent);
return -EINVAL;
}
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
index 159a854779e6..7c369e21c91c 100644
--- a/drivers/clk/tegra/clk-pll.c
+++ b/drivers/clk/tegra/clk-pll.c
@@ -363,7 +363,7 @@ static void _clk_pll_enable(struct clk_hw *hw)
val = pll_readl(pll->params->iddq_reg, pll);
val &= ~BIT(pll->params->iddq_bit_idx);
pll_writel(val, pll->params->iddq_reg, pll);
- udelay(2);
+ udelay(5);
}
if (pll->params->reset_reg) {
@@ -418,6 +418,26 @@ static void _clk_pll_disable(struct clk_hw *hw)
}
}
+static void pll_clk_start_ss(struct tegra_clk_pll *pll)
+{
+ if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
+ u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
+
+ val |= pll->params->ssc_ctrl_en_mask;
+ pll_writel(val, pll->params->ssc_ctrl_reg, pll);
+ }
+}
+
+static void pll_clk_stop_ss(struct tegra_clk_pll *pll)
+{
+ if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
+ u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
+
+ val &= ~pll->params->ssc_ctrl_en_mask;
+ pll_writel(val, pll->params->ssc_ctrl_reg, pll);
+ }
+}
+
static int clk_pll_enable(struct clk_hw *hw)
{
struct tegra_clk_pll *pll = to_clk_pll(hw);
@@ -431,6 +451,8 @@ static int clk_pll_enable(struct clk_hw *hw)
ret = clk_pll_wait_for_lock(pll);
+ pll_clk_start_ss(pll);
+
if (pll->lock)
spin_unlock_irqrestore(pll->lock, flags);
@@ -445,6 +467,8 @@ static void clk_pll_disable(struct clk_hw *hw)
if (pll->lock)
spin_lock_irqsave(pll->lock, flags);
+ pll_clk_stop_ss(pll);
+
_clk_pll_disable(hw);
if (pll->lock)
@@ -666,6 +690,8 @@ static void _get_pll_mnp(struct tegra_clk_pll *pll,
struct tegra_clk_pll_params *params = pll->params;
struct div_nmp *div_nmp = params->div_nmp;
+ *cfg = (struct tegra_clk_pll_freq_table) { };
+
if ((params->flags & (TEGRA_PLLM | TEGRA_PLLMB)) &&
(pll_override_readl(PMC_PLLP_WB0_OVERRIDE, pll) &
PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)) {
@@ -716,26 +742,6 @@ static void _update_pll_cpcon(struct tegra_clk_pll *pll,
pll_writel_misc(val, pll);
}
-static void pll_clk_start_ss(struct tegra_clk_pll *pll)
-{
- if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
- u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
-
- val |= pll->params->ssc_ctrl_en_mask;
- pll_writel(val, pll->params->ssc_ctrl_reg, pll);
- }
-}
-
-static void pll_clk_stop_ss(struct tegra_clk_pll *pll)
-{
- if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
- u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
-
- val &= ~pll->params->ssc_ctrl_en_mask;
- pll_writel(val, pll->params->ssc_ctrl_reg, pll);
- }
-}
-
static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
unsigned long rate)
{
@@ -2251,7 +2257,7 @@ tegra_clk_register_pllu_tegra114(const char *name, const char *parent_name,
}
#endif
-#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
+#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC) || defined(CONFIG_ARCH_TEGRA_210_SOC)
static const struct clk_ops tegra_clk_pllss_ops = {
.is_enabled = clk_pll_is_enabled,
.enable = clk_pll_enable,
@@ -2349,7 +2355,6 @@ struct clk *tegra_clk_register_pllre_tegra210(const char *name,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock, unsigned long parent_rate)
{
- u32 val;
struct tegra_clk_pll *pll;
struct clk *clk;
@@ -2363,26 +2368,8 @@ struct clk *tegra_clk_register_pllre_tegra210(const char *name,
if (IS_ERR(pll))
return ERR_CAST(pll);
- /* program minimum rate by default */
-
- val = pll_readl_base(pll);
- if (val & PLL_BASE_ENABLE)
- WARN_ON(readl_relaxed(clk_base + pll_params->iddq_reg) &
- BIT(pll_params->iddq_bit_idx));
- else {
- val = 0x4 << divm_shift(pll);
- val |= 0x41 << divn_shift(pll);
- pll_writel_base(val, pll);
- }
-
- /* disable lock override */
-
- val = pll_readl_misc(pll);
- val &= ~BIT(29);
- pll_writel_misc(val, pll);
-
clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
- &tegra_clk_pllre_ops);
+ &tegra_clk_pll_ops);
if (IS_ERR(clk))
kfree(pll);
@@ -2604,46 +2591,6 @@ struct clk *tegra_clk_register_pllc_tegra210(const char *name,
return clk;
}
-struct clk *tegra_clk_register_pllxc_tegra210(const char *name,
- const char *parent_name, void __iomem *clk_base,
- void __iomem *pmc, unsigned long flags,
- struct tegra_clk_pll_params *pll_params,
- spinlock_t *lock)
-{
- struct tegra_clk_pll *pll;
- struct clk *clk, *parent;
- unsigned long parent_rate;
-
- parent = __clk_lookup(parent_name);
- if (!parent) {
- WARN(1, "parent clk %s of %s must be registered first\n",
- name, parent_name);
- return ERR_PTR(-EINVAL);
- }
-
- if (!pll_params->pdiv_tohw)
- return ERR_PTR(-EINVAL);
-
- parent_rate = clk_get_rate(parent);
-
- pll_params->vco_min = _clip_vco_min(pll_params->vco_min, parent_rate);
-
- if (pll_params->adjust_vco)
- pll_params->vco_min = pll_params->adjust_vco(pll_params,
- parent_rate);
-
- pll = _tegra_init_pll(clk_base, pmc, pll_params, lock);
- if (IS_ERR(pll))
- return ERR_CAST(pll);
-
- clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
- &tegra_clk_pll_ops);
- if (IS_ERR(clk))
- kfree(pll);
-
- return clk;
-}
-
struct clk *tegra_clk_register_pllss_tegra210(const char *name,
const char *parent_name, void __iomem *clk_base,
unsigned long flags,
@@ -2652,10 +2599,8 @@ struct clk *tegra_clk_register_pllss_tegra210(const char *name,
{
struct tegra_clk_pll *pll;
struct clk *clk, *parent;
- struct tegra_clk_pll_freq_table cfg;
unsigned long parent_rate;
u32 val;
- int i;
if (!pll_params->div_nmp)
return ERR_PTR(-EINVAL);
@@ -2667,13 +2612,11 @@ struct clk *tegra_clk_register_pllss_tegra210(const char *name,
return ERR_PTR(-EINVAL);
}
- pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
- if (IS_ERR(pll))
- return ERR_CAST(pll);
-
- val = pll_readl_base(pll);
- val &= ~PLLSS_REF_SRC_SEL_MASK;
- pll_writel_base(val, pll);
+ val = readl_relaxed(clk_base + pll_params->base_reg);
+ if (val & PLLSS_REF_SRC_SEL_MASK) {
+ WARN(1, "not supported reference clock for %s\n", name);
+ return ERR_PTR(-EINVAL);
+ }
parent_rate = clk_get_rate(parent);
@@ -2683,36 +2626,10 @@ struct clk *tegra_clk_register_pllss_tegra210(const char *name,
pll_params->vco_min = pll_params->adjust_vco(pll_params,
parent_rate);
- /* initialize PLL to minimum rate */
-
- cfg.m = _pll_fixed_mdiv(pll_params, parent_rate);
- cfg.n = cfg.m * pll_params->vco_min / parent_rate;
-
- for (i = 0; pll_params->pdiv_tohw[i].pdiv; i++)
- ;
- if (!i) {
- kfree(pll);
- return ERR_PTR(-EINVAL);
- }
-
- cfg.p = pll_params->pdiv_tohw[i-1].hw_val;
-
- _update_pll_mnp(pll, &cfg);
-
- pll_writel_misc(PLLSS_MISC_DEFAULT, pll);
-
- val = pll_readl_base(pll);
- if (val & PLL_BASE_ENABLE) {
- if (val & BIT(pll_params->iddq_bit_idx)) {
- WARN(1, "%s is on but IDDQ set\n", name);
- kfree(pll);
- return ERR_PTR(-EINVAL);
- }
- } else
- val |= BIT(pll_params->iddq_bit_idx);
-
- val &= ~PLLSS_LOCK_OVERRIDE;
- pll_writel_base(val, pll);
+ pll_params->flags |= TEGRA_PLL_BYPASS;
+ pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
+ if (IS_ERR(pll))
+ return ERR_CAST(pll);
clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
&tegra_clk_pll_ops);
diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c
index 294bfe40a4f5..848255cc0209 100644
--- a/drivers/clk/tegra/clk-tegra-periph.c
+++ b/drivers/clk/tegra/clk-tegra-periph.c
@@ -216,7 +216,8 @@
_clk_num, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
30, MASK(2), 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP,\
- _clk_num, 0, _clk_id, _parents##_idx, 0, NULL)
+ _clk_num, TEGRA_PERIPH_ON_APB, _clk_id, \
+ _parents##_idx, 0, NULL)
#define XUSB(_name, _parents, _offset, \
_clk_num, _gate_flags, _clk_id) \
diff --git a/drivers/clk/tegra/clk-tegra-super-gen4.c b/drivers/clk/tegra/clk-tegra-super-gen4.c
index 474de0f0c26d..4f6fd307cb70 100644
--- a/drivers/clk/tegra/clk-tegra-super-gen4.c
+++ b/drivers/clk/tegra/clk-tegra-super-gen4.c
@@ -232,8 +232,15 @@ static void __init tegra_super_clk_init(void __iomem *clk_base,
if (!dt_clk)
return;
- clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base,
- pmc_base, CLK_IGNORE_UNUSED, params, NULL);
+#if defined(CONFIG_ARCH_TEGRA_210_SOC)
+ if (gen_info->gen == gen5)
+ clk = tegra_clk_register_pllc_tegra210("pll_x", "pll_ref",
+ clk_base, pmc_base, CLK_IGNORE_UNUSED, params, NULL);
+ else
+#endif
+ clk = tegra_clk_register_pllxc("pll_x", "pll_ref", clk_base,
+ pmc_base, CLK_IGNORE_UNUSED, params, NULL);
+
*dt_clk = clk;
/* PLLX_OUT0 */
diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c
index 1024e853ea65..6d7a613f2656 100644
--- a/drivers/clk/tegra/clk-tegra210.c
+++ b/drivers/clk/tegra/clk-tegra210.c
@@ -146,7 +146,7 @@
#define PLLD_SDM_EN_MASK BIT(16)
#define PLLD2_SDM_EN_MASK BIT(31)
-#define PLLD2_SSC_EN_MASK BIT(30)
+#define PLLD2_SSC_EN_MASK 0
#define PLLDP_SS_CFG 0x598
#define PLLDP_SDM_EN_MASK BIT(31)
@@ -241,6 +241,9 @@
#define PLL_SDM_COEFF BIT(13)
#define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU))
#define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat)
+/* This macro returns ndiv effective scaled to SDM range */
+#define sdin_get_n_eff(cfg) ((cfg)->n * PLL_SDM_COEFF + ((cfg)->sdm_data ? \
+ (PLL_SDM_COEFF/2 + sdin_data_to_din((cfg)->sdm_data)) : 0))
/* Tegra CPU clock and reset control regs */
#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
@@ -715,8 +718,6 @@ static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *plldss,
plldss->params->defaults_set = true;
if (val & PLL_ENABLE) {
- pr_warn("%s already enabled. Postponing set full defaults\n",
- pll_name);
/*
* PLL is ON: check if defaults already set, then set those
@@ -755,6 +756,10 @@ static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *plldss,
(~PLLDSS_MISC1_CFG_EN_SDM));
}
+ if (!plldss->params->defaults_set)
+ pr_warn("%s already enabled. Postponing set full defaults\n",
+ pll_name);
+
/* Enable lock detect */
if (val & PLLDSS_BASE_LOCK_OVERRIDE) {
val &= ~PLLDSS_BASE_LOCK_OVERRIDE;
@@ -1288,8 +1293,7 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
s -= PLL_SDM_COEFF / 2;
cfg->sdm_data = sdin_din_to_data(s);
}
- cfg->output_rate *= cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 +
- sdin_data_to_din(cfg->sdm_data);
+ cfg->output_rate *= sdin_get_n_eff(cfg);
cfg->output_rate /= p * cfg->m * PLL_SDM_COEFF;
} else {
cfg->output_rate *= cfg->n;
@@ -1314,8 +1318,7 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
*/
static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg)
{
- cfg->n = cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 +
- sdin_data_to_din(cfg->sdm_data);
+ cfg->n = sdin_get_n_eff(cfg);
cfg->m *= PLL_SDM_COEFF;
}
@@ -2204,7 +2207,6 @@ static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
[tegra_clk_gpu] = { .dt_id = TEGRA210_CLK_GPU, .present = true },
[tegra_clk_pll_g_ref] = { .dt_id = TEGRA210_CLK_PLL_G_REF, .present = true, },
[tegra_clk_uartb_8] = { .dt_id = TEGRA210_CLK_UARTB, .present = true },
- [tegra_clk_vfir] = { .dt_id = TEGRA210_CLK_VFIR, .present = true },
[tegra_clk_spdif_in_8] = { .dt_id = TEGRA210_CLK_SPDIF_IN, .present = true },
[tegra_clk_spdif_out] = { .dt_id = TEGRA210_CLK_SPDIF_OUT, .present = true },
[tegra_clk_vi_10] = { .dt_id = TEGRA210_CLK_VI, .present = true },
@@ -2470,15 +2472,14 @@ static void tegra210_utmi_param_configure(void)
reg |= UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count);
reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
-
reg |=
UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i].active_delay_count);
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
/* Program UTMIP PLL delay and oscillator frequency counts */
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
- reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
+ reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
reg |=
UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i].enable_delay_count);
@@ -2494,7 +2495,8 @@ static void tegra210_utmi_param_configure(void)
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
reg |= UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
- udelay(1);
+
+ udelay(20);
/* Enable samplers for SNPS, XUSB_HOST, XUSB_DEV */
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
@@ -2552,6 +2554,7 @@ static int tegra210_enable_pllu(void)
reg = readl_relaxed(clk_base + pllu.params->ext_misc_reg[0]);
reg &= ~BIT(pllu.params->iddq_bit_idx);
writel_relaxed(reg, clk_base + pllu.params->ext_misc_reg[0]);
+ udelay(5);
reg = readl_relaxed(clk_base + PLLU_BASE);
reg &= ~GENMASK(20, 0);
@@ -2559,6 +2562,7 @@ static int tegra210_enable_pllu(void)
reg |= fentry->n << 8;
reg |= fentry->p << 16;
writel(reg, clk_base + PLLU_BASE);
+ udelay(1);
reg |= PLL_ENABLE;
writel(reg, clk_base + PLLU_BASE);
@@ -2699,7 +2703,7 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
struct clk *clk;
/* PLLC */
- clk = tegra_clk_register_pllxc_tegra210("pll_c", "pll_ref", clk_base,
+ clk = tegra_clk_register_pllc_tegra210("pll_c", "pll_ref", clk_base,
pmc, 0, &pll_c_params, NULL);
if (!WARN_ON(IS_ERR(clk)))
clk_register_clkdev(clk, "pll_c", NULL);
@@ -2798,14 +2802,14 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
/* PLLU_60M */
clk = clk_register_gate(NULL, "pll_u_60M", "pll_u_out2",
CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
- 23, 0, NULL);
+ 23, 0, &pll_u_lock);
clk_register_clkdev(clk, "pll_u_60M", NULL);
clks[TEGRA210_CLK_PLL_U_60M] = clk;
/* PLLU_48M */
clk = clk_register_gate(NULL, "pll_u_48M", "pll_u_out1",
CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
- 25, 0, NULL);
+ 25, 0, &pll_u_lock);
clk_register_clkdev(clk, "pll_u_48M", NULL);
clks[TEGRA210_CLK_PLL_U_48M] = clk;
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index 945b07093afa..872f1189ad7f 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -362,12 +362,6 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
-struct clk *tegra_clk_register_pllxc_tegra210(const char *name,
- const char *parent_name, void __iomem *clk_base,
- void __iomem *pmc, unsigned long flags,
- struct tegra_clk_pll_params *pll_params,
- spinlock_t *lock);
-
struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name,
void __iomem *clk_base, void __iomem *pmc,
unsigned long flags,
diff --git a/drivers/clk/ti/adpll.c b/drivers/clk/ti/adpll.c
index 255cafb18336..d6036c788fab 100644
--- a/drivers/clk/ti/adpll.c
+++ b/drivers/clk/ti/adpll.c
@@ -222,7 +222,7 @@ static int ti_adpll_setup_clock(struct ti_adpll_data *d, struct clk *clock,
/* Separate con_id in format "pll040dcoclkldo" to fit MAX_CON_ID */
postfix = strrchr(name, '.');
- if (strlen(postfix) > 1) {
+ if (postfix && strlen(postfix) > 1) {
if (strlen(postfix) > ADPLL_MAX_CON_ID)
dev_warn(d->dev, "clock %s con_id lookup may fail\n",
name);
@@ -486,7 +486,7 @@ static u8 ti_adpll_get_parent(struct clk_hw *hw)
return 0;
}
-static struct clk_ops ti_adpll_ops = {
+static const struct clk_ops ti_adpll_ops = {
.prepare = ti_adpll_prepare,
.unprepare = ti_adpll_unprepare,
.is_prepared = ti_adpll_is_prepared,
diff --git a/drivers/clk/ti/apll.c b/drivers/clk/ti/apll.c
index 06f486b3488c..83b148f8037c 100644
--- a/drivers/clk/ti/apll.c
+++ b/drivers/clk/ti/apll.c
@@ -304,7 +304,7 @@ static void omap2_apll_disable(struct clk_hw *hw)
ti_clk_ll_ops->clk_writel(v, &ad->control_reg);
}
-static struct clk_ops omap2_apll_ops = {
+static const struct clk_ops omap2_apll_ops = {
.enable = &omap2_apll_enable,
.disable = &omap2_apll_disable,
.is_enabled = &omap2_apll_is_enabled,
diff --git a/drivers/clk/ti/clockdomain.c b/drivers/clk/ti/clockdomain.c
index fbedc6a9fed0..07a805125e98 100644
--- a/drivers/clk/ti/clockdomain.c
+++ b/drivers/clk/ti/clockdomain.c
@@ -138,8 +138,8 @@ static void __init of_ti_clockdomain_setup(struct device_node *node)
for (i = 0; i < num_clks; i++) {
clk = of_clk_get(node, i);
if (IS_ERR(clk)) {
- pr_err("%s: Failed get %s' clock nr %d (%ld)\n",
- __func__, node->full_name, i, PTR_ERR(clk));
+ pr_err("%s: Failed get %pOF' clock nr %d (%ld)\n",
+ __func__, node, i, PTR_ERR(clk));
continue;
}
clk_hw = __clk_get_hw(clk);
diff --git a/drivers/clk/ti/fapll.c b/drivers/clk/ti/fapll.c
index 66a0d0ed8b55..071af44b1ba8 100644
--- a/drivers/clk/ti/fapll.c
+++ b/drivers/clk/ti/fapll.c
@@ -268,7 +268,7 @@ static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
return 0;
}
-static struct clk_ops ti_fapll_ops = {
+static const struct clk_ops ti_fapll_ops = {
.enable = ti_fapll_enable,
.disable = ti_fapll_disable,
.is_enabled = ti_fapll_is_enabled,
@@ -478,7 +478,7 @@ static int ti_fapll_synth_set_rate(struct clk_hw *hw, unsigned long rate,
return 0;
}
-static struct clk_ops ti_fapll_synt_ops = {
+static const struct clk_ops ti_fapll_synt_ops = {
.enable = ti_fapll_synth_enable,
.disable = ti_fapll_synth_disable,
.is_enabled = ti_fapll_synth_is_enabled,
diff --git a/drivers/clk/uniphier/clk-uniphier-core.c b/drivers/clk/uniphier/clk-uniphier-core.c
index 2cf386347f0c..e09f3dd46318 100644
--- a/drivers/clk/uniphier/clk-uniphier-core.c
+++ b/drivers/clk/uniphier/clk-uniphier-core.c
@@ -111,10 +111,6 @@ static int uniphier_clk_remove(struct platform_device *pdev)
static const struct of_device_id uniphier_clk_match[] = {
/* System clock */
{
- .compatible = "socionext,uniphier-sld3-clock",
- .data = uniphier_sld3_sys_clk_data,
- },
- {
.compatible = "socionext,uniphier-ld4-clock",
.data = uniphier_ld4_sys_clk_data,
},
@@ -142,22 +138,22 @@ static const struct of_device_id uniphier_clk_match[] = {
.compatible = "socionext,uniphier-ld20-clock",
.data = uniphier_ld20_sys_clk_data,
},
- /* Media I/O clock, SD clock */
{
- .compatible = "socionext,uniphier-sld3-mio-clock",
- .data = uniphier_sld3_mio_clk_data,
+ .compatible = "socionext,uniphier-pxs3-clock",
+ .data = uniphier_pxs3_sys_clk_data,
},
+ /* Media I/O clock, SD clock */
{
.compatible = "socionext,uniphier-ld4-mio-clock",
- .data = uniphier_sld3_mio_clk_data,
+ .data = uniphier_ld4_mio_clk_data,
},
{
.compatible = "socionext,uniphier-pro4-mio-clock",
- .data = uniphier_sld3_mio_clk_data,
+ .data = uniphier_ld4_mio_clk_data,
},
{
.compatible = "socionext,uniphier-sld8-mio-clock",
- .data = uniphier_sld3_mio_clk_data,
+ .data = uniphier_ld4_mio_clk_data,
},
{
.compatible = "socionext,uniphier-pro5-sd-clock",
@@ -169,12 +165,16 @@ static const struct of_device_id uniphier_clk_match[] = {
},
{
.compatible = "socionext,uniphier-ld11-mio-clock",
- .data = uniphier_sld3_mio_clk_data,
+ .data = uniphier_ld4_mio_clk_data,
},
{
.compatible = "socionext,uniphier-ld20-sd-clock",
.data = uniphier_pro5_sd_clk_data,
},
+ {
+ .compatible = "socionext,uniphier-pxs3-sd-clock",
+ .data = uniphier_pro5_sd_clk_data,
+ },
/* Peripheral clock */
{
.compatible = "socionext,uniphier-ld4-peri-clock",
@@ -204,6 +204,10 @@ static const struct of_device_id uniphier_clk_match[] = {
.compatible = "socionext,uniphier-ld20-peri-clock",
.data = uniphier_pro4_peri_clk_data,
},
+ {
+ .compatible = "socionext,uniphier-pxs3-peri-clock",
+ .data = uniphier_pro4_peri_clk_data,
+ },
{ /* sentinel */ }
};
diff --git a/drivers/clk/uniphier/clk-uniphier-mio.c b/drivers/clk/uniphier/clk-uniphier-mio.c
index 218d20f099ce..16e4d303f535 100644
--- a/drivers/clk/uniphier/clk-uniphier-mio.c
+++ b/drivers/clk/uniphier/clk-uniphier-mio.c
@@ -76,7 +76,7 @@
#define UNIPHIER_MIO_CLK_DMAC(idx) \
UNIPHIER_CLK_GATE("miodmac", (idx), "stdmac", 0x20, 25)
-const struct uniphier_clk_data uniphier_sld3_mio_clk_data[] = {
+const struct uniphier_clk_data uniphier_ld4_mio_clk_data[] = {
UNIPHIER_MIO_CLK_SD_FIXED,
UNIPHIER_MIO_CLK_SD(0, 0),
UNIPHIER_MIO_CLK_SD(1, 1),
@@ -85,11 +85,9 @@ const struct uniphier_clk_data uniphier_sld3_mio_clk_data[] = {
UNIPHIER_MIO_CLK_USB2(8, 0),
UNIPHIER_MIO_CLK_USB2(9, 1),
UNIPHIER_MIO_CLK_USB2(10, 2),
- UNIPHIER_MIO_CLK_USB2(11, 3),
UNIPHIER_MIO_CLK_USB2_PHY(12, 0),
UNIPHIER_MIO_CLK_USB2_PHY(13, 1),
UNIPHIER_MIO_CLK_USB2_PHY(14, 2),
- UNIPHIER_MIO_CLK_USB2_PHY(15, 3),
{ /* sentinel */ }
};
diff --git a/drivers/clk/uniphier/clk-uniphier-sys.c b/drivers/clk/uniphier/clk-uniphier-sys.c
index ad0218182a9f..0e396f3da526 100644
--- a/drivers/clk/uniphier/clk-uniphier-sys.c
+++ b/drivers/clk/uniphier/clk-uniphier-sys.c
@@ -17,7 +17,7 @@
#include "clk-uniphier.h"
-#define UNIPHIER_SLD3_SYS_CLK_SD \
+#define UNIPHIER_LD4_SYS_CLK_SD \
UNIPHIER_CLK_FACTOR("sd-200m", -1, "spll", 1, 8), \
UNIPHIER_CLK_FACTOR("sd-133m", -1, "vpll27a", 1, 2)
@@ -30,7 +30,7 @@
UNIPHIER_CLK_FACTOR("sd-133m", -1, "spll", 1, 15)
/* Denali driver requires clk_x rate (clk: 50MHz, clk_x & ecc_clk: 200MHz) */
-#define UNIPHIER_SLD3_SYS_CLK_NAND(idx) \
+#define UNIPHIER_LD4_SYS_CLK_NAND(idx) \
UNIPHIER_CLK_FACTOR("nand-200m", -1, "spll", 1, 8), \
UNIPHIER_CLK_GATE("nand", (idx), "nand-200m", 0x2104, 2)
@@ -45,7 +45,7 @@
#define UNIPHIER_LD11_SYS_CLK_EMMC(idx) \
UNIPHIER_CLK_GATE("emmc", (idx), NULL, 0x210c, 2)
-#define UNIPHIER_SLD3_SYS_CLK_STDMAC(idx) \
+#define UNIPHIER_LD4_SYS_CLK_STDMAC(idx) \
UNIPHIER_CLK_GATE("stdmac", (idx), NULL, 0x2104, 10)
#define UNIPHIER_LD11_SYS_CLK_STDMAC(idx) \
@@ -57,19 +57,23 @@
#define UNIPHIER_PRO4_SYS_CLK_USB3(idx, ch) \
UNIPHIER_CLK_GATE("usb3" #ch, (idx), NULL, 0x2104, 16 + (ch))
-const struct uniphier_clk_data uniphier_sld3_sys_clk_data[] = {
- UNIPHIER_CLK_FACTOR("spll", -1, "ref", 65, 1), /* 1597.44 MHz */
- UNIPHIER_CLK_FACTOR("upll", -1, "ref", 6000, 512), /* 288 MHz */
- UNIPHIER_CLK_FACTOR("a2pll", -1, "ref", 24, 1), /* 589.824 MHz */
- UNIPHIER_CLK_FACTOR("vpll27a", -1, "ref", 5625, 512), /* 270 MHz */
- UNIPHIER_CLK_FACTOR("uart", 0, "a2pll", 1, 16),
- UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 16),
- UNIPHIER_SLD3_SYS_CLK_NAND(2),
- UNIPHIER_SLD3_SYS_CLK_SD,
- UNIPHIER_CLK_FACTOR("usb2", -1, "upll", 1, 12),
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8),
- { /* sentinel */ }
-};
+#define UNIPHIER_LD11_SYS_CLK_AIO(idx) \
+ UNIPHIER_CLK_FACTOR("aio-io200m", -1, "spll", 1, 10), \
+ UNIPHIER_CLK_GATE("aio", (idx), "aio-io200m", 0x2108, 0)
+
+#define UNIPHIER_LD11_SYS_CLK_EVEA(idx) \
+ UNIPHIER_CLK_FACTOR("evea-io100m", -1, "spll", 1, 20), \
+ UNIPHIER_CLK_GATE("evea", (idx), "evea-io100m", 0x2108, 1)
+
+#define UNIPHIER_LD11_SYS_CLK_EXIV(idx) \
+ UNIPHIER_CLK_FACTOR("exiv-io200m", -1, "spll", 1, 10), \
+ UNIPHIER_CLK_GATE("exiv", (idx), "exiv-io200m", 0x2110, 2)
+
+#define UNIPHIER_PRO4_SYS_CLK_ETHER(idx) \
+ UNIPHIER_CLK_GATE("ether", (idx), NULL, 0x2104, 12)
+
+#define UNIPHIER_LD11_SYS_CLK_ETHER(idx) \
+ UNIPHIER_CLK_GATE("ether", (idx), NULL, 0x210c, 6)
const struct uniphier_clk_data uniphier_ld4_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("spll", -1, "ref", 65, 1), /* 1597.44 MHz */
@@ -78,10 +82,10 @@ const struct uniphier_clk_data uniphier_ld4_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("vpll27a", -1, "ref", 5625, 512), /* 270 MHz */
UNIPHIER_CLK_FACTOR("uart", 0, "a2pll", 1, 16),
UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 16),
- UNIPHIER_SLD3_SYS_CLK_NAND(2),
- UNIPHIER_SLD3_SYS_CLK_SD,
+ UNIPHIER_LD4_SYS_CLK_NAND(2),
+ UNIPHIER_LD4_SYS_CLK_SD,
UNIPHIER_CLK_FACTOR("usb2", -1, "upll", 1, 12),
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8), /* Ether, HSC, MIO */
+ UNIPHIER_LD4_SYS_CLK_STDMAC(8), /* Ether, HSC, MIO */
{ /* sentinel */ }
};
@@ -92,10 +96,11 @@ const struct uniphier_clk_data uniphier_pro4_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("vpll27a", -1, "ref", 270, 25), /* 270 MHz */
UNIPHIER_CLK_FACTOR("uart", 0, "a2pll", 1, 8),
UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 32),
- UNIPHIER_SLD3_SYS_CLK_NAND(2),
- UNIPHIER_SLD3_SYS_CLK_SD,
+ UNIPHIER_LD4_SYS_CLK_NAND(2),
+ UNIPHIER_LD4_SYS_CLK_SD,
UNIPHIER_CLK_FACTOR("usb2", -1, "upll", 1, 12),
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8), /* HSC, MIO, RLE */
+ UNIPHIER_PRO4_SYS_CLK_ETHER(6),
+ UNIPHIER_LD4_SYS_CLK_STDMAC(8), /* HSC, MIO, RLE */
UNIPHIER_PRO4_SYS_CLK_GIO(12), /* Ether, SATA, USB3 */
UNIPHIER_PRO4_SYS_CLK_USB3(14, 0),
UNIPHIER_PRO4_SYS_CLK_USB3(15, 1),
@@ -108,10 +113,10 @@ const struct uniphier_clk_data uniphier_sld8_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("vpll27a", -1, "ref", 270, 25), /* 270 MHz */
UNIPHIER_CLK_FACTOR("uart", 0, "spll", 1, 20),
UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 16),
- UNIPHIER_SLD3_SYS_CLK_NAND(2),
- UNIPHIER_SLD3_SYS_CLK_SD,
+ UNIPHIER_LD4_SYS_CLK_NAND(2),
+ UNIPHIER_LD4_SYS_CLK_SD,
UNIPHIER_CLK_FACTOR("usb2", -1, "upll", 1, 12),
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8), /* Ether, HSC, MIO */
+ UNIPHIER_LD4_SYS_CLK_STDMAC(8), /* Ether, HSC, MIO */
{ /* sentinel */ }
};
@@ -123,7 +128,7 @@ const struct uniphier_clk_data uniphier_pro5_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 48),
UNIPHIER_PRO5_SYS_CLK_NAND(2),
UNIPHIER_PRO5_SYS_CLK_SD,
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8), /* HSC */
+ UNIPHIER_LD4_SYS_CLK_STDMAC(8), /* HSC */
UNIPHIER_PRO4_SYS_CLK_GIO(12), /* PCIe, USB3 */
UNIPHIER_PRO4_SYS_CLK_USB3(14, 0),
UNIPHIER_PRO4_SYS_CLK_USB3(15, 1),
@@ -136,7 +141,8 @@ const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[] = {
UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 48),
UNIPHIER_PRO5_SYS_CLK_NAND(2),
UNIPHIER_PRO5_SYS_CLK_SD,
- UNIPHIER_SLD3_SYS_CLK_STDMAC(8), /* HSC, RLE */
+ UNIPHIER_PRO4_SYS_CLK_ETHER(6),
+ UNIPHIER_LD4_SYS_CLK_STDMAC(8), /* HSC, RLE */
/* GIO is always clock-enabled: no function for 0x2104 bit6 */
UNIPHIER_PRO4_SYS_CLK_USB3(14, 0),
UNIPHIER_PRO4_SYS_CLK_USB3(15, 1),
@@ -156,8 +162,12 @@ const struct uniphier_clk_data uniphier_ld11_sys_clk_data[] = {
UNIPHIER_LD11_SYS_CLK_NAND(2),
UNIPHIER_LD11_SYS_CLK_EMMC(4),
/* Index 5 reserved for eMMC PHY */
+ UNIPHIER_LD11_SYS_CLK_ETHER(6),
UNIPHIER_LD11_SYS_CLK_STDMAC(8), /* HSC, MIO */
UNIPHIER_CLK_FACTOR("usb2", -1, "ref", 24, 25),
+ UNIPHIER_LD11_SYS_CLK_AIO(40),
+ UNIPHIER_LD11_SYS_CLK_EVEA(41),
+ UNIPHIER_LD11_SYS_CLK_EXIV(42),
/* CPU gears */
UNIPHIER_CLK_DIV4("cpll", 2, 3, 4, 8),
UNIPHIER_CLK_DIV4("mpll", 2, 3, 4, 8),
@@ -185,6 +195,7 @@ const struct uniphier_clk_data uniphier_ld20_sys_clk_data[] = {
UNIPHIER_LD11_SYS_CLK_EMMC(4),
/* Index 5 reserved for eMMC PHY */
UNIPHIER_LD20_SYS_CLK_SD,
+ UNIPHIER_LD11_SYS_CLK_ETHER(6),
UNIPHIER_LD11_SYS_CLK_STDMAC(8), /* HSC */
/* GIO is always clock-enabled: no function for 0x210c bit5 */
/*
@@ -194,6 +205,9 @@ const struct uniphier_clk_data uniphier_ld20_sys_clk_data[] = {
UNIPHIER_CLK_GATE("usb30", 14, NULL, 0x210c, 14),
UNIPHIER_CLK_GATE("usb30-phy0", 16, NULL, 0x210c, 12),
UNIPHIER_CLK_GATE("usb30-phy1", 17, NULL, 0x210c, 13),
+ UNIPHIER_LD11_SYS_CLK_AIO(40),
+ UNIPHIER_LD11_SYS_CLK_EVEA(41),
+ UNIPHIER_LD11_SYS_CLK_EXIV(42),
/* CPU gears */
UNIPHIER_CLK_DIV4("cpll", 2, 3, 4, 8),
UNIPHIER_CLK_DIV4("spll", 2, 3, 4, 8),
@@ -209,3 +223,33 @@ const struct uniphier_clk_data uniphier_ld20_sys_clk_data[] = {
"spll/4", "spll/8", "s2pll/4", "s2pll/8"),
{ /* sentinel */ }
};
+
+const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[] = {
+ UNIPHIER_CLK_FACTOR("cpll", -1, "ref", 104, 1), /* ARM: 2600 MHz */
+ UNIPHIER_CLK_FACTOR("spll", -1, "ref", 80, 1), /* 2000 MHz */
+ UNIPHIER_CLK_FACTOR("s2pll", -1, "ref", 88, 1), /* IPP: 2400 MHz */
+ UNIPHIER_CLK_FACTOR("uart", 0, "spll", 1, 34),
+ UNIPHIER_CLK_FACTOR("i2c", 1, "spll", 1, 40),
+ UNIPHIER_LD20_SYS_CLK_SD,
+ UNIPHIER_LD11_SYS_CLK_NAND(2),
+ UNIPHIER_LD11_SYS_CLK_EMMC(4),
+ UNIPHIER_CLK_GATE("usb30", 12, NULL, 0x2104, 4), /* =GIO0 */
+ UNIPHIER_CLK_GATE("usb31-0", 13, NULL, 0x2104, 5), /* =GIO1 */
+ UNIPHIER_CLK_GATE("usb31-1", 14, NULL, 0x2104, 6), /* =GIO1-1 */
+ UNIPHIER_CLK_GATE("usb30-phy0", 16, NULL, 0x210c, 16),
+ UNIPHIER_CLK_GATE("usb30-phy1", 17, NULL, 0x210c, 18),
+ UNIPHIER_CLK_GATE("usb30-phy2", 18, NULL, 0x210c, 20),
+ UNIPHIER_CLK_GATE("usb31-phy0", 20, NULL, 0x210c, 17),
+ UNIPHIER_CLK_GATE("usb31-phy1", 21, NULL, 0x210c, 19),
+ /* CPU gears */
+ UNIPHIER_CLK_DIV4("cpll", 2, 3, 4, 8),
+ UNIPHIER_CLK_DIV4("spll", 2, 3, 4, 8),
+ UNIPHIER_CLK_DIV4("s2pll", 2, 3, 4, 8),
+ UNIPHIER_CLK_CPUGEAR("cpu-ca53", 33, 0x8080, 0xf, 8,
+ "cpll/2", "spll/2", "cpll/3", "spll/3",
+ "spll/4", "spll/8", "cpll/4", "cpll/8"),
+ UNIPHIER_CLK_CPUGEAR("cpu-ipp", 34, 0x8100, 0xf, 8,
+ "s2pll/2", "spll/2", "s2pll/3", "spll/3",
+ "spll/4", "spll/8", "s2pll/4", "s2pll/8"),
+ { /* sentinel */ }
+};
diff --git a/drivers/clk/uniphier/clk-uniphier.h b/drivers/clk/uniphier/clk-uniphier.h
index 01c16ecec48f..d10a009ada96 100644
--- a/drivers/clk/uniphier/clk-uniphier.h
+++ b/drivers/clk/uniphier/clk-uniphier.h
@@ -147,7 +147,6 @@ struct clk_hw *uniphier_clk_register_mux(struct device *dev,
const char *name,
const struct uniphier_clk_mux_data *data);
-extern const struct uniphier_clk_data uniphier_sld3_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_ld4_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_pro4_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_sld8_sys_clk_data[];
@@ -155,7 +154,8 @@ extern const struct uniphier_clk_data uniphier_pro5_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[];
extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[];
-extern const struct uniphier_clk_data uniphier_sld3_mio_clk_data[];
+extern const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[];
+extern const struct uniphier_clk_data uniphier_ld4_mio_clk_data[];
extern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[];
extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[];
extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[];
diff --git a/drivers/clk/ux500/clk-prcc.c b/drivers/clk/ux500/clk-prcc.c
index 0e950769ed03..f50592775c9d 100644
--- a/drivers/clk/ux500/clk-prcc.c
+++ b/drivers/clk/ux500/clk-prcc.c
@@ -79,13 +79,13 @@ static int clk_prcc_is_enabled(struct clk_hw *hw)
return clk->is_enabled;
}
-static struct clk_ops clk_prcc_pclk_ops = {
+static const struct clk_ops clk_prcc_pclk_ops = {
.enable = clk_prcc_pclk_enable,
.disable = clk_prcc_pclk_disable,
.is_enabled = clk_prcc_is_enabled,
};
-static struct clk_ops clk_prcc_kclk_ops = {
+static const struct clk_ops clk_prcc_kclk_ops = {
.enable = clk_prcc_kclk_enable,
.disable = clk_prcc_kclk_disable,
.is_enabled = clk_prcc_is_enabled,
@@ -96,7 +96,7 @@ static struct clk *clk_reg_prcc(const char *name,
resource_size_t phy_base,
u32 cg_sel,
unsigned long flags,
- struct clk_ops *clk_prcc_ops)
+ const struct clk_ops *clk_prcc_ops)
{
struct clk_prcc *clk;
struct clk_init_data clk_prcc_init;
diff --git a/drivers/clk/ux500/clk-prcmu.c b/drivers/clk/ux500/clk-prcmu.c
index 7f343821f4e4..6e3e16b2e5ca 100644
--- a/drivers/clk/ux500/clk-prcmu.c
+++ b/drivers/clk/ux500/clk-prcmu.c
@@ -186,7 +186,7 @@ static void clk_prcmu_opp_volt_unprepare(struct clk_hw *hw)
clk->is_prepared = 0;
}
-static struct clk_ops clk_prcmu_scalable_ops = {
+static const struct clk_ops clk_prcmu_scalable_ops = {
.prepare = clk_prcmu_prepare,
.unprepare = clk_prcmu_unprepare,
.is_prepared = clk_prcmu_is_prepared,
@@ -198,7 +198,7 @@ static struct clk_ops clk_prcmu_scalable_ops = {
.set_rate = clk_prcmu_set_rate,
};
-static struct clk_ops clk_prcmu_gate_ops = {
+static const struct clk_ops clk_prcmu_gate_ops = {
.prepare = clk_prcmu_prepare,
.unprepare = clk_prcmu_unprepare,
.is_prepared = clk_prcmu_is_prepared,
@@ -208,19 +208,19 @@ static struct clk_ops clk_prcmu_gate_ops = {
.recalc_rate = clk_prcmu_recalc_rate,
};
-static struct clk_ops clk_prcmu_scalable_rate_ops = {
+static const struct clk_ops clk_prcmu_scalable_rate_ops = {
.is_enabled = clk_prcmu_is_enabled,
.recalc_rate = clk_prcmu_recalc_rate,
.round_rate = clk_prcmu_round_rate,
.set_rate = clk_prcmu_set_rate,
};
-static struct clk_ops clk_prcmu_rate_ops = {
+static const struct clk_ops clk_prcmu_rate_ops = {
.is_enabled = clk_prcmu_is_enabled,
.recalc_rate = clk_prcmu_recalc_rate,
};
-static struct clk_ops clk_prcmu_opp_gate_ops = {
+static const struct clk_ops clk_prcmu_opp_gate_ops = {
.prepare = clk_prcmu_opp_prepare,
.unprepare = clk_prcmu_opp_unprepare,
.is_prepared = clk_prcmu_is_prepared,
@@ -230,7 +230,7 @@ static struct clk_ops clk_prcmu_opp_gate_ops = {
.recalc_rate = clk_prcmu_recalc_rate,
};
-static struct clk_ops clk_prcmu_opp_volt_scalable_ops = {
+static const struct clk_ops clk_prcmu_opp_volt_scalable_ops = {
.prepare = clk_prcmu_opp_volt_prepare,
.unprepare = clk_prcmu_opp_volt_unprepare,
.is_prepared = clk_prcmu_is_prepared,
@@ -247,7 +247,7 @@ static struct clk *clk_reg_prcmu(const char *name,
u8 cg_sel,
unsigned long rate,
unsigned long flags,
- struct clk_ops *clk_prcmu_ops)
+ const struct clk_ops *clk_prcmu_ops)
{
struct clk_prcmu *clk;
struct clk_init_data clk_prcmu_init;
diff --git a/drivers/clk/ux500/clk-sysctrl.c b/drivers/clk/ux500/clk-sysctrl.c
index 266ddea630d2..8a4e93ce1e42 100644
--- a/drivers/clk/ux500/clk-sysctrl.c
+++ b/drivers/clk/ux500/clk-sysctrl.c
@@ -98,18 +98,18 @@ static u8 clk_sysctrl_get_parent(struct clk_hw *hw)
return clk->parent_index;
}
-static struct clk_ops clk_sysctrl_gate_ops = {
+static const struct clk_ops clk_sysctrl_gate_ops = {
.prepare = clk_sysctrl_prepare,
.unprepare = clk_sysctrl_unprepare,
};
-static struct clk_ops clk_sysctrl_gate_fixed_rate_ops = {
+static const struct clk_ops clk_sysctrl_gate_fixed_rate_ops = {
.prepare = clk_sysctrl_prepare,
.unprepare = clk_sysctrl_unprepare,
.recalc_rate = clk_sysctrl_recalc_rate,
};
-static struct clk_ops clk_sysctrl_set_parent_ops = {
+static const struct clk_ops clk_sysctrl_set_parent_ops = {
.set_parent = clk_sysctrl_set_parent,
.get_parent = clk_sysctrl_get_parent,
};
@@ -124,7 +124,7 @@ static struct clk *clk_reg_sysctrl(struct device *dev,
unsigned long rate,
unsigned long enable_delay_us,
unsigned long flags,
- struct clk_ops *clk_sysctrl_ops)
+ const struct clk_ops *clk_sysctrl_ops)
{
struct clk_sysctrl *clk;
struct clk_init_data clk_sysctrl_init;
diff --git a/drivers/clk/versatile/clk-vexpress-osc.c b/drivers/clk/versatile/clk-vexpress-osc.c
index 7e5add7d7752..e7a868b83fe5 100644
--- a/drivers/clk/versatile/clk-vexpress-osc.c
+++ b/drivers/clk/versatile/clk-vexpress-osc.c
@@ -61,7 +61,7 @@ static int vexpress_osc_set_rate(struct clk_hw *hw, unsigned long rate,
return regmap_write(osc->reg, 0, rate);
}
-static struct clk_ops vexpress_osc_ops = {
+static const struct clk_ops vexpress_osc_ops = {
.recalc_rate = vexpress_osc_recalc_rate,
.round_rate = vexpress_osc_round_rate,
.set_rate = vexpress_osc_set_rate,
diff --git a/drivers/clk/zte/clk-zx296718.c b/drivers/clk/zte/clk-zx296718.c
index 27f853d4c76b..354dd508c516 100644
--- a/drivers/clk/zte/clk-zx296718.c
+++ b/drivers/clk/zte/clk-zx296718.c
@@ -451,7 +451,7 @@ static struct zx_clk_fixed_factor top_ffactor_clk[] = {
FFACTOR(0, "emmc_mux_div2", "emmc_mux", 1, 2, CLK_SET_RATE_PARENT),
};
-static struct clk_div_table noc_div_table[] = {
+static const struct clk_div_table noc_div_table[] = {
{ .val = 1, .div = 2, },
{ .val = 3, .div = 4, },
};
@@ -644,7 +644,7 @@ static int __init top_clocks_init(struct device_node *np)
return 0;
}
-static struct clk_div_table common_even_div_table[] = {
+static const struct clk_div_table common_even_div_table[] = {
{ .val = 0, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 3, .div = 4, },
@@ -656,7 +656,7 @@ static struct clk_div_table common_even_div_table[] = {
{ .val = 15, .div = 16, },
};
-static struct clk_div_table common_div_table[] = {
+static const struct clk_div_table common_div_table[] = {
{ .val = 0, .div = 1, },
{ .val = 1, .div = 2, },
{ .val = 2, .div = 3, },
diff --git a/drivers/clocksource/mips-gic-timer.c b/drivers/clocksource/mips-gic-timer.c
index 17b861ea2626..ae3167c28b12 100644
--- a/drivers/clocksource/mips-gic-timer.c
+++ b/drivers/clocksource/mips-gic-timer.c
@@ -10,25 +10,45 @@
#include <linux/cpu.h>
#include <linux/init.h>
#include <linux/interrupt.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/notifier.h>
#include <linux/of_irq.h>
#include <linux/percpu.h>
#include <linux/smp.h>
#include <linux/time.h>
+#include <asm/mips-cps.h>
static DEFINE_PER_CPU(struct clock_event_device, gic_clockevent_device);
static int gic_timer_irq;
static unsigned int gic_frequency;
+static u64 notrace gic_read_count(void)
+{
+ unsigned int hi, hi2, lo;
+
+ if (mips_cm_is64)
+ return read_gic_counter();
+
+ do {
+ hi = read_gic_counter_32h();
+ lo = read_gic_counter_32l();
+ hi2 = read_gic_counter_32h();
+ } while (hi2 != hi);
+
+ return (((u64) hi) << 32) + lo;
+}
+
static int gic_next_event(unsigned long delta, struct clock_event_device *evt)
{
+ unsigned long flags;
u64 cnt;
int res;
cnt = gic_read_count();
cnt += (u64)delta;
- gic_write_cpu_compare(cnt, cpumask_first(evt->cpumask));
+ local_irq_save(flags);
+ write_gic_vl_other(mips_cm_vp_id(cpumask_first(evt->cpumask)));
+ write_gic_vo_compare(cnt);
+ local_irq_restore(flags);
res = ((int)(gic_read_count() - cnt) >= 0) ? -ETIME : 0;
return res;
}
@@ -37,7 +57,7 @@ static irqreturn_t gic_compare_interrupt(int irq, void *dev_id)
{
struct clock_event_device *cd = dev_id;
- gic_write_compare(gic_read_compare());
+ write_gic_vl_compare(read_gic_vl_compare());
cd->event_handler(cd);
return IRQ_HANDLED;
}
@@ -139,10 +159,15 @@ static struct clocksource gic_clocksource = {
static int __init __gic_clocksource_init(void)
{
+ unsigned int count_width;
int ret;
/* Set clocksource mask. */
- gic_clocksource.mask = CLOCKSOURCE_MASK(gic_get_count_width());
+ count_width = read_gic_config() & GIC_CONFIG_COUNTBITS;
+ count_width >>= __fls(GIC_CONFIG_COUNTBITS);
+ count_width *= 4;
+ count_width += 32;
+ gic_clocksource.mask = CLOCKSOURCE_MASK(count_width);
/* Calculate a somewhat reasonable rating value. */
gic_clocksource.rating = 200 + gic_frequency / 10000000;
@@ -159,7 +184,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)
struct clk *clk;
int ret;
- if (!gic_present || !node->parent ||
+ if (!mips_gic_present() || !node->parent ||
!of_device_is_compatible(node->parent, "mti,gic")) {
pr_warn("No DT definition for the mips gic driver\n");
return -ENXIO;
@@ -197,7 +222,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)
}
/* And finally start the counter */
- gic_start_count();
+ clear_gic_config(GIC_CONFIG_COUNTSTOP);
return 0;
}
diff --git a/drivers/clocksource/numachip.c b/drivers/clocksource/numachip.c
index 6a20dc8b253f..9a7d7f0f23fe 100644
--- a/drivers/clocksource/numachip.c
+++ b/drivers/clocksource/numachip.c
@@ -43,7 +43,7 @@ static int numachip2_set_next_event(unsigned long delta, struct clock_event_devi
return 0;
}
-static struct clock_event_device numachip2_clockevent = {
+static const struct clock_event_device numachip2_clockevent __initconst = {
.name = "numachip2",
.rating = 400,
.set_next_event = numachip2_set_next_event,
diff --git a/drivers/clocksource/timer-integrator-ap.c b/drivers/clocksource/timer-integrator-ap.c
index 2ff64d9d4fb3..62d24690ba02 100644
--- a/drivers/clocksource/timer-integrator-ap.c
+++ b/drivers/clocksource/timer-integrator-ap.c
@@ -36,8 +36,8 @@ static u64 notrace integrator_read_sched_clock(void)
return -readl(sched_clk_base + TIMER_VALUE);
}
-static int integrator_clocksource_init(unsigned long inrate,
- void __iomem *base)
+static int __init integrator_clocksource_init(unsigned long inrate,
+ void __iomem *base)
{
u32 ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
unsigned long rate = inrate;
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
index a020da7940d6..a753c50e9e41 100644
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
@@ -106,6 +106,22 @@ static const struct of_device_id whitelist[] __initconst = {
* platforms using "operating-points-v2" property.
*/
static const struct of_device_id blacklist[] __initconst = {
+ { .compatible = "calxeda,highbank", },
+ { .compatible = "calxeda,ecx-2000", },
+
+ { .compatible = "marvell,armadaxp", },
+
+ { .compatible = "nvidia,tegra124", },
+
+ { .compatible = "st,stih407", },
+ { .compatible = "st,stih410", },
+
+ { .compatible = "sigma,tango4", },
+
+ { .compatible = "ti,am33xx", },
+ { .compatible = "ti,am43", },
+ { .compatible = "ti,dra7", },
+
{ }
};
diff --git a/drivers/cpufreq/powernow-k7.c b/drivers/cpufreq/powernow-k7.c
index 9f013ed42977..80ac313e6c59 100644
--- a/drivers/cpufreq/powernow-k7.c
+++ b/drivers/cpufreq/powernow-k7.c
@@ -578,7 +578,7 @@ static int acer_cpufreq_pst(const struct dmi_system_id *d)
* A BIOS update is all that can save them.
* Mention this, and disable cpufreq.
*/
-static struct dmi_system_id powernow_dmi_table[] = {
+static const struct dmi_system_id powernow_dmi_table[] = {
{
.callback = acer_cpufreq_pst,
.ident = "Acer Aspire",
diff --git a/drivers/cpufreq/ti-cpufreq.c b/drivers/cpufreq/ti-cpufreq.c
index b29cd3398463..4bf47de6101f 100644
--- a/drivers/cpufreq/ti-cpufreq.c
+++ b/drivers/cpufreq/ti-cpufreq.c
@@ -190,7 +190,7 @@ static int ti_cpufreq_setup_syscon_register(struct ti_cpufreq_data *opp_data)
static const struct of_device_id ti_cpufreq_of_match[] = {
{ .compatible = "ti,am33xx", .data = &am3x_soc_data, },
- { .compatible = "ti,am4372", .data = &am4x_soc_data, },
+ { .compatible = "ti,am43", .data = &am4x_soc_data, },
{ .compatible = "ti,dra7", .data = &dra7_soc_data },
{},
};
diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c
index 7080c384ad5d..52a75053ee03 100644
--- a/drivers/cpuidle/cpuidle-arm.c
+++ b/drivers/cpuidle/cpuidle-arm.c
@@ -104,13 +104,13 @@ static int __init arm_idle_init(void)
ret = dt_init_idle_driver(drv, arm_idle_state_match, 1);
if (ret <= 0) {
ret = ret ? : -ENODEV;
- goto out_fail;
+ goto init_fail;
}
ret = cpuidle_register_driver(drv);
if (ret) {
pr_err("Failed to register cpuidle driver\n");
- goto out_fail;
+ goto init_fail;
}
/*
@@ -149,6 +149,8 @@ static int __init arm_idle_init(void)
}
return 0;
+init_fail:
+ kfree(drv);
out_fail:
while (--cpu >= 0) {
dev = per_cpu(cpuidle_devices, cpu);
diff --git a/drivers/cpuidle/cpuidle-cps.c b/drivers/cpuidle/cpuidle-cps.c
index 12b9145913de..72b5e47286b4 100644
--- a/drivers/cpuidle/cpuidle-cps.c
+++ b/drivers/cpuidle/cpuidle-cps.c
@@ -37,7 +37,7 @@ static int cps_nc_enter(struct cpuidle_device *dev,
* TODO: don't treat core 0 specially, just prevent the final core
* TODO: remap interrupt affinity temporarily
*/
- if (!cpu_data[dev->cpu].core && (index > STATE_NC_WAIT))
+ if (cpus_are_siblings(0, dev->cpu) && (index > STATE_NC_WAIT))
index = STATE_NC_WAIT;
/* Select the appropriate cps_pm_state */
diff --git a/drivers/crypto/caam/Kconfig b/drivers/crypto/caam/Kconfig
index e36aeacd7635..1eb852765469 100644
--- a/drivers/crypto/caam/Kconfig
+++ b/drivers/crypto/caam/Kconfig
@@ -1,6 +1,7 @@
config CRYPTO_DEV_FSL_CAAM
tristate "Freescale CAAM-Multicore driver backend"
depends on FSL_SOC || ARCH_MXC || ARCH_LAYERSCAPE
+ select SOC_BUS
help
Enables the driver module for Freescale's Cryptographic Accelerator
and Assurance Module (CAAM), also known as the SEC version 4 (SEC4).
@@ -141,10 +142,6 @@ config CRYPTO_DEV_FSL_CAAM_RNG_API
To compile this as a module, choose M here: the module
will be called caamrng.
-config CRYPTO_DEV_FSL_CAAM_IMX
- def_bool SOC_IMX6 || SOC_IMX7D
- depends on CRYPTO_DEV_FSL_CAAM
-
config CRYPTO_DEV_FSL_CAAM_DEBUG
bool "Enable debug output in CAAM driver"
depends on CRYPTO_DEV_FSL_CAAM
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
index dacb53fb690e..027e121c6f70 100644
--- a/drivers/crypto/caam/ctrl.c
+++ b/drivers/crypto/caam/ctrl.c
@@ -7,6 +7,7 @@
#include <linux/device.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
+#include <linux/sys_soc.h>
#include "compat.h"
#include "regs.h"
@@ -19,6 +20,8 @@ bool caam_little_end;
EXPORT_SYMBOL(caam_little_end);
bool caam_dpaa2;
EXPORT_SYMBOL(caam_dpaa2);
+bool caam_imx;
+EXPORT_SYMBOL(caam_imx);
#ifdef CONFIG_CAAM_QI
#include "qi.h"
@@ -28,19 +31,11 @@ EXPORT_SYMBOL(caam_dpaa2);
* i.MX targets tend to have clock control subsystems that can
* enable/disable clocking to our device.
*/
-#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
static inline struct clk *caam_drv_identify_clk(struct device *dev,
char *clk_name)
{
- return devm_clk_get(dev, clk_name);
+ return caam_imx ? devm_clk_get(dev, clk_name) : NULL;
}
-#else
-static inline struct clk *caam_drv_identify_clk(struct device *dev,
- char *clk_name)
-{
- return NULL;
-}
-#endif
/*
* Descriptor to instantiate RNG State Handle 0 in normal mode and
@@ -430,6 +425,10 @@ static int caam_probe(struct platform_device *pdev)
{
int ret, ring, gen_sk, ent_delay = RTSDCTL_ENT_DLY_MIN;
u64 caam_id;
+ static const struct soc_device_attribute imx_soc[] = {
+ {.family = "Freescale i.MX"},
+ {},
+ };
struct device *dev;
struct device_node *nprop, *np;
struct caam_ctrl __iomem *ctrl;
@@ -451,6 +450,8 @@ static int caam_probe(struct platform_device *pdev)
dev_set_drvdata(dev, ctrlpriv);
nprop = pdev->dev.of_node;
+ caam_imx = (bool)soc_device_match(imx_soc);
+
/* Enable clocking */
clk = caam_drv_identify_clk(&pdev->dev, "ipg");
if (IS_ERR(clk)) {
diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h
index 2b5efff9ec3c..17cfd23a38fa 100644
--- a/drivers/crypto/caam/regs.h
+++ b/drivers/crypto/caam/regs.h
@@ -67,6 +67,7 @@
*/
extern bool caam_little_end;
+extern bool caam_imx;
#define caam_to_cpu(len) \
static inline u##len caam##len ## _to_cpu(u##len val) \
@@ -154,13 +155,10 @@ static inline u64 rd_reg64(void __iomem *reg)
#else /* CONFIG_64BIT */
static inline void wr_reg64(void __iomem *reg, u64 data)
{
-#ifndef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
- if (caam_little_end) {
+ if (!caam_imx && caam_little_end) {
wr_reg32((u32 __iomem *)(reg) + 1, data >> 32);
wr_reg32((u32 __iomem *)(reg), data);
- } else
-#endif
- {
+ } else {
wr_reg32((u32 __iomem *)(reg), data >> 32);
wr_reg32((u32 __iomem *)(reg) + 1, data);
}
@@ -168,41 +166,40 @@ static inline void wr_reg64(void __iomem *reg, u64 data)
static inline u64 rd_reg64(void __iomem *reg)
{
-#ifndef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
- if (caam_little_end)
+ if (!caam_imx && caam_little_end)
return ((u64)rd_reg32((u32 __iomem *)(reg) + 1) << 32 |
(u64)rd_reg32((u32 __iomem *)(reg)));
- else
-#endif
- return ((u64)rd_reg32((u32 __iomem *)(reg)) << 32 |
- (u64)rd_reg32((u32 __iomem *)(reg) + 1));
+
+ return ((u64)rd_reg32((u32 __iomem *)(reg)) << 32 |
+ (u64)rd_reg32((u32 __iomem *)(reg) + 1));
}
#endif /* CONFIG_64BIT */
+static inline u64 cpu_to_caam_dma64(dma_addr_t value)
+{
+ if (caam_imx)
+ return (((u64)cpu_to_caam32(lower_32_bits(value)) << 32) |
+ (u64)cpu_to_caam32(upper_32_bits(value)));
+
+ return cpu_to_caam64(value);
+}
+
+static inline u64 caam_dma64_to_cpu(u64 value)
+{
+ if (caam_imx)
+ return (((u64)caam32_to_cpu(lower_32_bits(value)) << 32) |
+ (u64)caam32_to_cpu(upper_32_bits(value)));
+
+ return caam64_to_cpu(value);
+}
+
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
-#ifdef CONFIG_SOC_IMX7D
-#define cpu_to_caam_dma(value) \
- (((u64)cpu_to_caam32(lower_32_bits(value)) << 32) | \
- (u64)cpu_to_caam32(upper_32_bits(value)))
-#define caam_dma_to_cpu(value) \
- (((u64)caam32_to_cpu(lower_32_bits(value)) << 32) | \
- (u64)caam32_to_cpu(upper_32_bits(value)))
-#else
-#define cpu_to_caam_dma(value) cpu_to_caam64(value)
-#define caam_dma_to_cpu(value) caam64_to_cpu(value)
-#endif /* CONFIG_SOC_IMX7D */
+#define cpu_to_caam_dma(value) cpu_to_caam_dma64(value)
+#define caam_dma_to_cpu(value) caam_dma64_to_cpu(value)
#else
#define cpu_to_caam_dma(value) cpu_to_caam32(value)
#define caam_dma_to_cpu(value) caam32_to_cpu(value)
-#endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT */
-
-#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
-#define cpu_to_caam_dma64(value) \
- (((u64)cpu_to_caam32(lower_32_bits(value)) << 32) | \
- (u64)cpu_to_caam32(upper_32_bits(value)))
-#else
-#define cpu_to_caam_dma64(value) cpu_to_caam64(value)
-#endif
+#endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT */
/*
* jr_outentry
diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c
index d2207ac5ba19..5438552bc6d7 100644
--- a/drivers/crypto/inside-secure/safexcel_cipher.c
+++ b/drivers/crypto/inside-secure/safexcel_cipher.c
@@ -386,7 +386,7 @@ static int safexcel_cipher_exit_inv(struct crypto_tfm *tfm)
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
struct safexcel_crypto_priv *priv = ctx->priv;
struct skcipher_request req;
- struct safexcel_inv_result result = { 0 };
+ struct safexcel_inv_result result = {};
int ring = ctx->base.ring;
memset(&req, 0, sizeof(struct skcipher_request));
diff --git a/drivers/crypto/inside-secure/safexcel_hash.c b/drivers/crypto/inside-secure/safexcel_hash.c
index 3f819399cd95..3980f946874f 100644
--- a/drivers/crypto/inside-secure/safexcel_hash.c
+++ b/drivers/crypto/inside-secure/safexcel_hash.c
@@ -419,7 +419,7 @@ static int safexcel_ahash_exit_inv(struct crypto_tfm *tfm)
struct safexcel_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
struct safexcel_crypto_priv *priv = ctx->priv;
struct ahash_request req;
- struct safexcel_inv_result result = { 0 };
+ struct safexcel_inv_result result = {};
int ring = ctx->base.ring;
memset(&req, 0, sizeof(struct ahash_request));
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index 79791c690858..dff88838dce7 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -1756,9 +1756,9 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc,
req_ctx->swinit = 0;
} else {
desc->ptr[1] = zero_entry;
- /* Indicate next op is not the first. */
- req_ctx->first = 0;
}
+ /* Indicate next op is not the first. */
+ req_ctx->first = 0;
/* HMAC key */
if (ctx->keylen)
@@ -1769,7 +1769,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc,
sg_count = edesc->src_nents ?: 1;
if (is_sec1 && sg_count > 1)
- sg_copy_to_buffer(areq->src, sg_count, edesc->buf, length);
+ sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length);
else
sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
DMA_TO_DEVICE);
@@ -3057,7 +3057,8 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
t_alg->algt.alg.hash.final = ahash_final;
t_alg->algt.alg.hash.finup = ahash_finup;
t_alg->algt.alg.hash.digest = ahash_digest;
- t_alg->algt.alg.hash.setkey = ahash_setkey;
+ if (!strncmp(alg->cra_name, "hmac", 4))
+ t_alg->algt.alg.hash.setkey = ahash_setkey;
t_alg->algt.alg.hash.import = ahash_import;
t_alg->algt.alg.hash.export = ahash_export;
diff --git a/drivers/dax/super.c b/drivers/dax/super.c
index 938eb4868f7f..557b93703532 100644
--- a/drivers/dax/super.c
+++ b/drivers/dax/super.c
@@ -46,6 +46,8 @@ void dax_read_unlock(int id)
EXPORT_SYMBOL_GPL(dax_read_unlock);
#ifdef CONFIG_BLOCK
+#include <linux/blkdev.h>
+
int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
pgoff_t *pgoff)
{
@@ -59,6 +61,16 @@ int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
}
EXPORT_SYMBOL(bdev_dax_pgoff);
+#if IS_ENABLED(CONFIG_FS_DAX)
+struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
+{
+ if (!blk_queue_dax(bdev->bd_queue))
+ return NULL;
+ return fs_dax_get_by_host(bdev->bd_disk->disk_name);
+}
+EXPORT_SYMBOL_GPL(fs_dax_get_by_bdev);
+#endif
+
/**
* __bdev_dax_supported() - Check if the device supports dax for filesystem
* @sb: The superblock of the device
@@ -189,8 +201,10 @@ static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n)
if (!dax_dev)
return 0;
- if (a == &dev_attr_write_cache.attr && !dax_dev->ops->flush)
+#ifndef CONFIG_ARCH_HAS_PMEM_API
+ if (a == &dev_attr_write_cache.attr)
return 0;
+#endif
return a->mode;
}
@@ -255,18 +269,23 @@ size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
}
EXPORT_SYMBOL_GPL(dax_copy_from_iter);
-void dax_flush(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
- size_t size)
+#ifdef CONFIG_ARCH_HAS_PMEM_API
+void arch_wb_cache_pmem(void *addr, size_t size);
+void dax_flush(struct dax_device *dax_dev, void *addr, size_t size)
{
- if (!dax_alive(dax_dev))
+ if (unlikely(!dax_alive(dax_dev)))
return;
- if (!test_bit(DAXDEV_WRITE_CACHE, &dax_dev->flags))
+ if (unlikely(!test_bit(DAXDEV_WRITE_CACHE, &dax_dev->flags)))
return;
- if (dax_dev->ops->flush)
- dax_dev->ops->flush(dax_dev, pgoff, addr, size);
+ arch_wb_cache_pmem(addr, size);
}
+#else
+void dax_flush(struct dax_device *dax_dev, void *addr, size_t size)
+{
+}
+#endif
EXPORT_SYMBOL_GPL(dax_flush);
void dax_write_cache(struct dax_device *dax_dev, bool wc)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 8043e51de897..7da9f1b83ebe 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -357,7 +357,7 @@ struct sensor_value {
} __packed;
struct dev_pstate_set {
- u16 dev_id;
+ __le16 dev_id;
u8 pstate;
} __packed;
@@ -965,7 +965,7 @@ static int scpi_probe(struct platform_device *pdev)
count = of_count_phandle_with_args(np, "mboxes", "#mbox-cells");
if (count < 0) {
- dev_err(dev, "no mboxes property in '%s'\n", np->full_name);
+ dev_err(dev, "no mboxes property in '%pOF'\n", np);
return -ENODEV;
}
diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
index bf3672a81e49..d2fcafcea07e 100644
--- a/drivers/firmware/efi/cper.c
+++ b/drivers/firmware/efi/cper.c
@@ -534,7 +534,7 @@ static void
cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata,
int sec_no)
{
- uuid_le *sec_type = (uuid_le *)gdata->section_type;
+ guid_t *sec_type = (guid_t *)gdata->section_type;
__u16 severity;
char newpfx[64];
@@ -545,12 +545,12 @@ cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata
printk("%s""Error %d, type: %s\n", pfx, sec_no,
cper_severity_str(severity));
if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)
- printk("%s""fru_id: %pUl\n", pfx, (uuid_le *)gdata->fru_id);
+ printk("%s""fru_id: %pUl\n", pfx, gdata->fru_id);
if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
printk("%s""fru_text: %.20s\n", pfx, gdata->fru_text);
snprintf(newpfx, sizeof(newpfx), "%s%s", pfx, INDENT_SP);
- if (!uuid_le_cmp(*sec_type, CPER_SEC_PROC_GENERIC)) {
+ if (guid_equal(sec_type, &CPER_SEC_PROC_GENERIC)) {
struct cper_sec_proc_generic *proc_err = acpi_hest_get_payload(gdata);
printk("%s""section_type: general processor error\n", newpfx);
@@ -558,7 +558,7 @@ cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata
cper_print_proc_generic(newpfx, proc_err);
else
goto err_section_too_small;
- } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
+ } else if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) {
struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);
printk("%s""section_type: memory error\n", newpfx);
@@ -568,7 +568,7 @@ cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata
gdata->error_data_length);
else
goto err_section_too_small;
- } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) {
+ } else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
struct cper_sec_pcie *pcie = acpi_hest_get_payload(gdata);
printk("%s""section_type: PCIe error\n", newpfx);
diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c
index c46387160976..c8f169bf2e27 100644
--- a/drivers/firmware/google/gsmi.c
+++ b/drivers/firmware/google/gsmi.c
@@ -709,7 +709,7 @@ static u32 __init hash_oem_table_id(char s[8])
return local_hash_64(input, 32);
}
-static struct dmi_system_id gsmi_dmi_table[] __initdata = {
+static const struct dmi_system_id gsmi_dmi_table[] __initconst = {
{
.ident = "Google Board",
.matches = {
diff --git a/drivers/firmware/google/memconsole-x86-legacy.c b/drivers/firmware/google/memconsole-x86-legacy.c
index 8c1bf6dbdaa6..19bcbd10855b 100644
--- a/drivers/firmware/google/memconsole-x86-legacy.c
+++ b/drivers/firmware/google/memconsole-x86-legacy.c
@@ -126,7 +126,7 @@ static bool memconsole_ebda_init(void)
return false;
}
-static struct dmi_system_id memconsole_dmi_table[] __initdata = {
+static const struct dmi_system_id memconsole_dmi_table[] __initconst = {
{
.ident = "Google Board",
.matches = {
diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c
index 493a56a4cfc4..d687ca3d5049 100644
--- a/drivers/firmware/psci.c
+++ b/drivers/firmware/psci.c
@@ -280,8 +280,8 @@ static int psci_dt_cpu_init_idle(struct device_node *cpu_node, int cpu)
"arm,psci-suspend-param",
&state);
if (ret) {
- pr_warn(" * %s missing arm,psci-suspend-param property\n",
- state_node->full_name);
+ pr_warn(" * %pOF missing arm,psci-suspend-param property\n",
+ state_node);
of_node_put(state_node);
goto free_mem;
}
diff --git a/drivers/firmware/tegra/bpmp.c b/drivers/firmware/tegra/bpmp.c
index b25179517cc5..73ca55b7b7ec 100644
--- a/drivers/firmware/tegra/bpmp.c
+++ b/drivers/firmware/tegra/bpmp.c
@@ -806,6 +806,8 @@ static int tegra_bpmp_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "firmware: %s\n", tag);
+ platform_set_drvdata(pdev, bpmp);
+
err = of_platform_default_populate(pdev->dev.of_node, NULL, &pdev->dev);
if (err < 0)
goto free_mrq;
@@ -822,8 +824,6 @@ static int tegra_bpmp_probe(struct platform_device *pdev)
if (err < 0)
goto free_mrq;
- platform_set_drvdata(pdev, bpmp);
-
return 0;
free_mrq:
diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c
index 08629ee69d11..00e73d28077c 100644
--- a/drivers/fpga/altera-cvp.c
+++ b/drivers/fpga/altera-cvp.c
@@ -361,12 +361,12 @@ static const struct fpga_manager_ops altera_cvp_ops = {
.write_complete = altera_cvp_write_complete,
};
-static ssize_t show_chkcfg(struct device_driver *dev, char *buf)
+static ssize_t chkcfg_show(struct device_driver *dev, char *buf)
{
return snprintf(buf, 3, "%d\n", altera_cvp_chkcfg);
}
-static ssize_t store_chkcfg(struct device_driver *drv, const char *buf,
+static ssize_t chkcfg_store(struct device_driver *drv, const char *buf,
size_t count)
{
int ret;
@@ -378,7 +378,7 @@ static ssize_t store_chkcfg(struct device_driver *drv, const char *buf,
return count;
}
-static DRIVER_ATTR(chkcfg, 0600, show_chkcfg, store_chkcfg);
+static DRIVER_ATTR_RW(chkcfg);
static int altera_cvp_probe(struct pci_dev *pdev,
const struct pci_device_id *dev_id);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 12e71bbfd222..103635ab784c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -76,7 +76,7 @@
extern int amdgpu_modeset;
extern int amdgpu_vram_limit;
extern int amdgpu_vis_vram_limit;
-extern unsigned amdgpu_gart_size;
+extern int amdgpu_gart_size;
extern int amdgpu_gtt_size;
extern int amdgpu_moverate;
extern int amdgpu_benchmarking;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index fb6e5dbd5a03..309f2419c6d8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -155,7 +155,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
{
return (struct kfd2kgd_calls *)&kfd2kgd;
- return (struct kfd2kgd_calls *)&kfd2kgd;
}
static inline struct amdgpu_device *get_amdgpu_device(struct kgd_dev *kgd)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 269b835571eb..60d8bedb694d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1079,6 +1079,9 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
GFP_KERNEL);
p->num_post_dep_syncobjs = 0;
+ if (!p->post_dep_syncobjs)
+ return -ENOMEM;
+
for (i = 0; i < num_deps; ++i) {
p->post_dep_syncobjs[i] = drm_syncobj_find(p->filp, deps[i].handle);
if (!p->post_dep_syncobjs[i])
@@ -1150,7 +1153,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence);
job->uf_sequence = cs->out.handle;
amdgpu_job_free_resources(job);
- amdgpu_cs_parser_fini(p, 0, true);
trace_amdgpu_cs_ioctl(job);
amd_sched_entity_push_job(&job->base);
@@ -1208,10 +1210,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
goto out;
r = amdgpu_cs_submit(&parser, cs);
- if (r)
- goto out;
- return 0;
out:
amdgpu_cs_parser_fini(&parser, r, reserved_buffers);
return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 1a459ac63df4..e630d918fefc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1062,11 +1062,11 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev)
amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
}
- if (amdgpu_gart_size < 32) {
+ if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {
/* gart size must be greater or equal to 32M */
dev_warn(adev->dev, "gart size (%d) too small\n",
amdgpu_gart_size);
- amdgpu_gart_size = 32;
+ amdgpu_gart_size = -1;
}
if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
@@ -2622,12 +2622,6 @@ static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
goto err;
}
- r = amdgpu_ttm_bind(&bo->shadow->tbo, &bo->shadow->tbo.mem);
- if (r) {
- DRM_ERROR("%p bind failed\n", bo->shadow);
- goto err;
- }
-
r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
NULL, fence, true);
if (r) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index e39ec981b11c..0f16986ec5bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -76,7 +76,7 @@
int amdgpu_vram_limit = 0;
int amdgpu_vis_vram_limit = 0;
-unsigned amdgpu_gart_size = 256;
+int amdgpu_gart_size = -1; /* auto */
int amdgpu_gtt_size = -1; /* auto */
int amdgpu_moverate = -1; /* auto */
int amdgpu_benchmarking = 0;
@@ -128,7 +128,7 @@ module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
MODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes");
module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);
-MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc.)");
+MODULE_PARM_DESC(gartsize, "Size of GART to setup in megabytes (32, 64, etc., -1=auto)");
module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)");
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 94c1e2e8e34c..f4370081f6e6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -57,18 +57,6 @@
*/
/**
- * amdgpu_gart_set_defaults - set the default gart_size
- *
- * @adev: amdgpu_device pointer
- *
- * Set the default gart_size based on parameters and available VRAM.
- */
-void amdgpu_gart_set_defaults(struct amdgpu_device *adev)
-{
- adev->mc.gart_size = (uint64_t)amdgpu_gart_size << 20;
-}
-
-/**
* amdgpu_gart_table_ram_alloc - allocate system ram for gart page table
*
* @adev: amdgpu_device pointer
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
index d4cce6936200..afbe803b1a13 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
@@ -56,7 +56,6 @@ struct amdgpu_gart {
const struct amdgpu_gart_funcs *gart_funcs;
};
-void amdgpu_gart_set_defaults(struct amdgpu_device *adev);
int amdgpu_gart_table_ram_alloc(struct amdgpu_device *adev);
void amdgpu_gart_table_ram_free(struct amdgpu_device *adev);
int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
index 9e05e257729f..0d15eb7d31d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
@@ -108,10 +108,10 @@ bool amdgpu_gtt_mgr_is_allocated(struct ttm_mem_reg *mem)
*
* Allocate the address space for a node.
*/
-int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
- struct ttm_buffer_object *tbo,
- const struct ttm_place *place,
- struct ttm_mem_reg *mem)
+static int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
+ struct ttm_buffer_object *tbo,
+ const struct ttm_place *place,
+ struct ttm_mem_reg *mem)
{
struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
struct amdgpu_gtt_mgr *mgr = man->priv;
@@ -143,12 +143,8 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
fpfn, lpfn, mode);
spin_unlock(&mgr->lock);
- if (!r) {
+ if (!r)
mem->start = node->start;
- if (&tbo->mem == mem)
- tbo->offset = (tbo->mem.start << PAGE_SHIFT) +
- tbo->bdev->man[tbo->mem.mem_type].gpu_offset;
- }
return r;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 4bdd851f56d0..538e5f27d120 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -221,8 +221,9 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
spin_lock_init(&adev->irq.lock);
- /* Disable vblank irqs aggressively for power-saving */
- adev->ddev->vblank_disable_immediate = true;
+ if (!adev->enable_virtual_display)
+ /* Disable vblank irqs aggressively for power-saving */
+ adev->ddev->vblank_disable_immediate = true;
r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc);
if (r) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index e7e899190bef..9e495da0bb03 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -91,7 +91,10 @@ static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,
if (domain & AMDGPU_GEM_DOMAIN_GTT) {
places[c].fpfn = 0;
- places[c].lpfn = 0;
+ if (flags & AMDGPU_GEM_CREATE_SHADOW)
+ places[c].lpfn = adev->mc.gart_size >> PAGE_SHIFT;
+ else
+ places[c].lpfn = 0;
places[c].flags = TTM_PL_FLAG_TT;
if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
places[c].flags |= TTM_PL_FLAG_WC |
@@ -446,17 +449,16 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
if (bo->shadow)
return 0;
- bo->flags |= AMDGPU_GEM_CREATE_SHADOW;
- memset(&placements, 0,
- (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
-
- amdgpu_ttm_placement_init(adev, &placement,
- placements, AMDGPU_GEM_DOMAIN_GTT,
- AMDGPU_GEM_CREATE_CPU_GTT_USWC);
+ memset(&placements, 0, sizeof(placements));
+ amdgpu_ttm_placement_init(adev, &placement, placements,
+ AMDGPU_GEM_DOMAIN_GTT,
+ AMDGPU_GEM_CREATE_CPU_GTT_USWC |
+ AMDGPU_GEM_CREATE_SHADOW);
r = amdgpu_bo_create_restricted(adev, size, byte_align, true,
AMDGPU_GEM_DOMAIN_GTT,
- AMDGPU_GEM_CREATE_CPU_GTT_USWC,
+ AMDGPU_GEM_CREATE_CPU_GTT_USWC |
+ AMDGPU_GEM_CREATE_SHADOW,
NULL, &placement,
bo->tbo.resv,
0,
@@ -484,30 +486,28 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
{
struct ttm_placement placement = {0};
struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];
+ uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW;
int r;
- memset(&placements, 0,
- (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
+ memset(&placements, 0, sizeof(placements));
+ amdgpu_ttm_placement_init(adev, &placement, placements,
+ domain, parent_flags);
- amdgpu_ttm_placement_init(adev, &placement,
- placements, domain, flags);
-
- r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel,
- domain, flags, sg, &placement,
- resv, init_value, bo_ptr);
+ r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel, domain,
+ parent_flags, sg, &placement, resv,
+ init_value, bo_ptr);
if (r)
return r;
- if (amdgpu_need_backup(adev) && (flags & AMDGPU_GEM_CREATE_SHADOW)) {
- if (!resv) {
- r = ww_mutex_lock(&(*bo_ptr)->tbo.resv->lock, NULL);
- WARN_ON(r != 0);
- }
+ if ((flags & AMDGPU_GEM_CREATE_SHADOW) && amdgpu_need_backup(adev)) {
+ if (!resv)
+ WARN_ON(reservation_object_lock((*bo_ptr)->tbo.resv,
+ NULL));
r = amdgpu_bo_create_shadow(adev, size, byte_align, (*bo_ptr));
if (!resv)
- ww_mutex_unlock(&(*bo_ptr)->tbo.resv->lock);
+ reservation_object_unlock((*bo_ptr)->tbo.resv);
if (r)
amdgpu_bo_unref(bo_ptr);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 6c5646b48d1a..5ce65280b396 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -170,6 +170,16 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
unsigned irq_type)
{
int r;
+ int sched_hw_submission = amdgpu_sched_hw_submission;
+
+ /* Set the hw submission limit higher for KIQ because
+ * it's used for a number of gfx/compute tasks by both
+ * KFD and KGD which may have outstanding fences and
+ * it doesn't really use the gpu scheduler anyway;
+ * KIQ tasks get submitted directly to the ring.
+ */
+ if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)
+ sched_hw_submission = max(sched_hw_submission, 256);
if (ring->adev == NULL) {
if (adev->num_rings >= AMDGPU_MAX_RINGS)
@@ -178,8 +188,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
ring->adev = adev;
ring->idx = adev->num_rings++;
adev->rings[ring->idx] = ring;
- r = amdgpu_fence_driver_init_ring(ring,
- amdgpu_sched_hw_submission);
+ r = amdgpu_fence_driver_init_ring(ring, sched_hw_submission);
if (r)
return r;
}
@@ -218,8 +227,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
return r;
}
- ring->ring_size = roundup_pow_of_two(max_dw * 4 *
- amdgpu_sched_hw_submission);
+ ring->ring_size = roundup_pow_of_two(max_dw * 4 * sched_hw_submission);
ring->buf_mask = (ring->ring_size / 4) - 1;
ring->ptr_mask = ring->funcs->support_64bit_ptrs ?
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 8b2c294f6f79..7ef6c28a34d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -761,35 +761,11 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
sg_free_table(ttm->sg);
}
-static int amdgpu_ttm_do_bind(struct ttm_tt *ttm, struct ttm_mem_reg *mem)
-{
- struct amdgpu_ttm_tt *gtt = (void *)ttm;
- uint64_t flags;
- int r;
-
- spin_lock(&gtt->adev->gtt_list_lock);
- flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, mem);
- gtt->offset = (u64)mem->start << PAGE_SHIFT;
- r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages,
- ttm->pages, gtt->ttm.dma_address, flags);
-
- if (r) {
- DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
- ttm->num_pages, gtt->offset);
- goto error_gart_bind;
- }
-
- list_add_tail(&gtt->list, &gtt->adev->gtt_list);
-error_gart_bind:
- spin_unlock(&gtt->adev->gtt_list_lock);
- return r;
-
-}
-
static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
struct ttm_mem_reg *bo_mem)
{
struct amdgpu_ttm_tt *gtt = (void*)ttm;
+ uint64_t flags;
int r = 0;
if (gtt->userptr) {
@@ -809,9 +785,24 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
bo_mem->mem_type == AMDGPU_PL_OA)
return -EINVAL;
- if (amdgpu_gtt_mgr_is_allocated(bo_mem))
- r = amdgpu_ttm_do_bind(ttm, bo_mem);
+ if (!amdgpu_gtt_mgr_is_allocated(bo_mem))
+ return 0;
+ spin_lock(&gtt->adev->gtt_list_lock);
+ flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem);
+ gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
+ r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages,
+ ttm->pages, gtt->ttm.dma_address, flags);
+
+ if (r) {
+ DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
+ ttm->num_pages, gtt->offset);
+ goto error_gart_bind;
+ }
+
+ list_add_tail(&gtt->list, &gtt->adev->gtt_list);
+error_gart_bind:
+ spin_unlock(&gtt->adev->gtt_list_lock);
return r;
}
@@ -824,20 +815,39 @@ bool amdgpu_ttm_is_bound(struct ttm_tt *ttm)
int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem)
{
+ struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
struct ttm_tt *ttm = bo->ttm;
+ struct ttm_mem_reg tmp;
+
+ struct ttm_placement placement;
+ struct ttm_place placements;
int r;
if (!ttm || amdgpu_ttm_is_bound(ttm))
return 0;
- r = amdgpu_gtt_mgr_alloc(&bo->bdev->man[TTM_PL_TT], bo,
- NULL, bo_mem);
- if (r) {
- DRM_ERROR("Failed to allocate GTT address space (%d)\n", r);
+ tmp = bo->mem;
+ tmp.mm_node = NULL;
+ placement.num_placement = 1;
+ placement.placement = &placements;
+ placement.num_busy_placement = 1;
+ placement.busy_placement = &placements;
+ placements.fpfn = 0;
+ placements.lpfn = adev->mc.gart_size >> PAGE_SHIFT;
+ placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+
+ r = ttm_bo_mem_space(bo, &placement, &tmp, true, false);
+ if (unlikely(r))
return r;
- }
- return amdgpu_ttm_do_bind(ttm, bo_mem);
+ r = ttm_bo_move_ttm(bo, true, false, &tmp);
+ if (unlikely(r))
+ ttm_bo_mem_put(bo, &tmp);
+ else
+ bo->offset = (bo->mem.start << PAGE_SHIFT) +
+ bo->bdev->man[bo->mem.mem_type].gpu_offset;
+
+ return r;
}
int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index f22a4758719d..43093bffa2cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -62,10 +62,6 @@ extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func;
extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func;
bool amdgpu_gtt_mgr_is_allocated(struct ttm_mem_reg *mem);
-int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
- struct ttm_buffer_object *tbo,
- const struct ttm_place *place,
- struct ttm_mem_reg *mem);
uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man);
uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index b9a5a77eedaf..bd20ff018512 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -165,14 +165,6 @@ static int amdgpu_vm_validate_level(struct amdgpu_vm_pt *parent,
unsigned i;
int r;
- if (parent->bo->shadow) {
- struct amdgpu_bo *shadow = parent->bo->shadow;
-
- r = amdgpu_ttm_bind(&shadow->tbo, &shadow->tbo.mem);
- if (r)
- return r;
- }
-
if (use_cpu_for_update) {
r = amdgpu_bo_kmap(parent->bo, NULL);
if (r)
@@ -1277,7 +1269,7 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
/* In the case of a mixed PT the PDE must point to it*/
if (p->adev->asic_type < CHIP_VEGA10 ||
nptes != AMDGPU_VM_PTE_COUNT(p->adev) ||
- p->func == amdgpu_vm_do_copy_ptes ||
+ p->src ||
!(flags & AMDGPU_PTE_VALID)) {
dst = amdgpu_bo_gpu_offset(entry->bo);
@@ -1294,9 +1286,23 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
entry->addr = (dst | flags);
if (use_cpu_update) {
+ /* In case a huge page is replaced with a system
+ * memory mapping, p->pages_addr != NULL and
+ * amdgpu_vm_cpu_set_ptes would try to translate dst
+ * through amdgpu_vm_map_gart. But dst is already a
+ * GPU address (of the page table). Disable
+ * amdgpu_vm_map_gart temporarily.
+ */
+ dma_addr_t *tmp;
+
+ tmp = p->pages_addr;
+ p->pages_addr = NULL;
+
pd_addr = (unsigned long)amdgpu_bo_kptr(parent->bo);
pde = pd_addr + (entry - parent->entries) * 8;
amdgpu_vm_cpu_set_ptes(p, pde, dst, 1, 0, flags);
+
+ p->pages_addr = tmp;
} else {
if (parent->bo->shadow) {
pd_addr = amdgpu_bo_gpu_offset(parent->bo->shadow);
@@ -1610,7 +1616,6 @@ error_free:
*
* @adev: amdgpu_device pointer
* @exclusive: fence we need to sync to
- * @gtt_flags: flags as they are used for GTT
* @pages_addr: DMA addresses to use for mapping
* @vm: requested vm
* @mapping: mapped range and flags to use for the update
@@ -1624,7 +1629,6 @@ error_free:
*/
static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
struct dma_fence *exclusive,
- uint64_t gtt_flags,
dma_addr_t *pages_addr,
struct amdgpu_vm *vm,
struct amdgpu_bo_va_mapping *mapping,
@@ -1679,11 +1683,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
}
if (pages_addr) {
- if (flags == gtt_flags)
- src = adev->gart.table_addr +
- (addr >> AMDGPU_GPU_PAGE_SHIFT) * 8;
- else
- max_entries = min(max_entries, 16ull * 1024ull);
+ max_entries = min(max_entries, 16ull * 1024ull);
addr = 0;
} else if (flags & AMDGPU_PTE_VALID) {
addr += adev->vm_manager.vram_base_offset;
@@ -1728,10 +1728,10 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
struct amdgpu_vm *vm = bo_va->base.vm;
struct amdgpu_bo_va_mapping *mapping;
dma_addr_t *pages_addr = NULL;
- uint64_t gtt_flags, flags;
struct ttm_mem_reg *mem;
struct drm_mm_node *nodes;
struct dma_fence *exclusive;
+ uint64_t flags;
int r;
if (clear || !bo_va->base.bo) {
@@ -1751,15 +1751,10 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
exclusive = reservation_object_get_excl(bo->tbo.resv);
}
- if (bo) {
+ if (bo)
flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem);
- gtt_flags = (amdgpu_ttm_is_bound(bo->tbo.ttm) &&
- adev == amdgpu_ttm_adev(bo->tbo.bdev)) ?
- flags : 0;
- } else {
+ else
flags = 0x0;
- gtt_flags = ~0x0;
- }
spin_lock(&vm->status_lock);
if (!list_empty(&bo_va->base.vm_status))
@@ -1767,8 +1762,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
spin_unlock(&vm->status_lock);
list_for_each_entry(mapping, &bo_va->invalids, list) {
- r = amdgpu_vm_bo_split_mapping(adev, exclusive,
- gtt_flags, pages_addr, vm,
+ r = amdgpu_vm_bo_split_mapping(adev, exclusive, pages_addr, vm,
mapping, flags, nodes,
&bo_va->last_pt_update);
if (r)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index d228f5a99044..dbbe986f90f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -636,7 +636,194 @@ static void gfx_v6_0_tiling_mode_table_init(struct amdgpu_device *adev)
NUM_BANKS(ADDR_SURF_2_BANK);
for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
WREG32(mmGB_TILE_MODE0 + reg_offset, tilemode[reg_offset]);
- } else if (adev->asic_type == CHIP_OLAND || adev->asic_type == CHIP_HAINAN) {
+ } else if (adev->asic_type == CHIP_OLAND) {
+ tilemode[0] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[1] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[2] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[3] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[4] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[5] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(split_equal_to_row_size) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[6] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(split_equal_to_row_size) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[7] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(split_equal_to_row_size) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[8] = MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[9] = MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[10] = MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[11] = MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[12] = MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[13] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[14] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[15] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[16] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[17] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P4_8x16) |
+ TILE_SPLIT(split_equal_to_row_size) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[21] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[22] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4);
+ tilemode[23] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[24] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+ NUM_BANKS(ADDR_SURF_16_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2);
+ tilemode[25] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
+ ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+ PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
+ TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
+ NUM_BANKS(ADDR_SURF_8_BANK) |
+ BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+ BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+ MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1);
+ for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+ WREG32(mmGB_TILE_MODE0 + reg_offset, tilemode[reg_offset]);
+ } else if (adev->asic_type == CHIP_HAINAN) {
tilemode[0] = MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
PIPE_CONFIG(ADDR_SURF_P2) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 832e592fcd07..fc260c13b1da 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -4579,9 +4579,9 @@ static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring)
mqd->compute_misc_reserved = 0x00000003;
if (!(adev->flags & AMD_IS_APU)) {
mqd->dynamic_cu_mask_addr_lo = lower_32_bits(ring->mqd_gpu_addr
- + offsetof(struct vi_mqd_allocation, dyamic_cu_mask));
+ + offsetof(struct vi_mqd_allocation, dynamic_cu_mask));
mqd->dynamic_cu_mask_addr_hi = upper_32_bits(ring->mqd_gpu_addr
- + offsetof(struct vi_mqd_allocation, dyamic_cu_mask));
+ + offsetof(struct vi_mqd_allocation, dynamic_cu_mask));
}
eop_base_addr = ring->eop_gpu_addr >> 8;
mqd->cp_hqd_eop_base_addr_lo = eop_base_addr;
@@ -4768,8 +4768,8 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
mutex_unlock(&adev->srbm_mutex);
} else {
memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
- ((struct vi_mqd_allocation *)mqd)->dyamic_cu_mask = 0xFFFFFFFF;
- ((struct vi_mqd_allocation *)mqd)->dyamic_rb_mask = 0xFFFFFFFF;
+ ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
+ ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
mutex_lock(&adev->srbm_mutex);
vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
gfx_v8_0_mqd_init(ring);
@@ -4792,8 +4792,8 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)
if (!adev->gfx.in_reset && !adev->gfx.in_suspend) {
memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
- ((struct vi_mqd_allocation *)mqd)->dyamic_cu_mask = 0xFFFFFFFF;
- ((struct vi_mqd_allocation *)mqd)->dyamic_rb_mask = 0xFFFFFFFF;
+ ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
+ ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
mutex_lock(&adev->srbm_mutex);
vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
gfx_v8_0_mqd_init(ring);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
index 4f2788b61a08..6c8040e616c4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
@@ -124,7 +124,7 @@ static void gfxhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
static void gfxhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
{
- uint32_t tmp, field;
+ uint32_t tmp;
/* Setup L2 cache */
tmp = RREG32_SOC15(GC, 0, mmVM_L2_CNTL);
@@ -143,9 +143,8 @@ static void gfxhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
WREG32_SOC15(GC, 0, mmVM_L2_CNTL2, tmp);
- field = adev->vm_manager.fragment_size;
tmp = mmVM_L2_CNTL3_DEFAULT;
- tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, field);
+ tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
WREG32_SOC15(GC, 0, mmVM_L2_CNTL3, tmp);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 12b0c4cd7a5a..5be9c83dfcf7 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -332,7 +332,24 @@ static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
adev->mc.real_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
adev->mc.visible_vram_size = adev->mc.aper_size;
- amdgpu_gart_set_defaults(adev);
+ /* set the gart size */
+ if (amdgpu_gart_size == -1) {
+ switch (adev->asic_type) {
+ case CHIP_HAINAN: /* no MM engines */
+ default:
+ adev->mc.gart_size = 256ULL << 20;
+ break;
+ case CHIP_VERDE: /* UVD, VCE do not support GPUVM */
+ case CHIP_TAHITI: /* UVD, VCE do not support GPUVM */
+ case CHIP_PITCAIRN: /* UVD, VCE do not support GPUVM */
+ case CHIP_OLAND: /* UVD, VCE do not support GPUVM */
+ adev->mc.gart_size = 1024ULL << 20;
+ break;
+ }
+ } else {
+ adev->mc.gart_size = (u64)amdgpu_gart_size << 20;
+ }
+
gmc_v6_0_vram_gtt_location(adev, &adev->mc);
return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index e42c1ad3af5e..eace9e7182c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -386,7 +386,27 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
if (adev->mc.visible_vram_size > adev->mc.real_vram_size)
adev->mc.visible_vram_size = adev->mc.real_vram_size;
- amdgpu_gart_set_defaults(adev);
+ /* set the gart size */
+ if (amdgpu_gart_size == -1) {
+ switch (adev->asic_type) {
+ case CHIP_TOPAZ: /* no MM engines */
+ default:
+ adev->mc.gart_size = 256ULL << 20;
+ break;
+#ifdef CONFIG_DRM_AMDGPU_CIK
+ case CHIP_BONAIRE: /* UVD, VCE do not support GPUVM */
+ case CHIP_HAWAII: /* UVD, VCE do not support GPUVM */
+ case CHIP_KAVERI: /* UVD, VCE do not support GPUVM */
+ case CHIP_KABINI: /* UVD, VCE do not support GPUVM */
+ case CHIP_MULLINS: /* UVD, VCE do not support GPUVM */
+ adev->mc.gart_size = 1024ULL << 20;
+ break;
+#endif
+ }
+ } else {
+ adev->mc.gart_size = (u64)amdgpu_gart_size << 20;
+ }
+
gmc_v7_0_vram_gtt_location(adev, &adev->mc);
return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 7ca2dae8237a..3b3326daf32b 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -562,7 +562,26 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
if (adev->mc.visible_vram_size > adev->mc.real_vram_size)
adev->mc.visible_vram_size = adev->mc.real_vram_size;
- amdgpu_gart_set_defaults(adev);
+ /* set the gart size */
+ if (amdgpu_gart_size == -1) {
+ switch (adev->asic_type) {
+ case CHIP_POLARIS11: /* all engines support GPUVM */
+ case CHIP_POLARIS10: /* all engines support GPUVM */
+ case CHIP_POLARIS12: /* all engines support GPUVM */
+ default:
+ adev->mc.gart_size = 256ULL << 20;
+ break;
+ case CHIP_TONGA: /* UVD, VCE do not support GPUVM */
+ case CHIP_FIJI: /* UVD, VCE do not support GPUVM */
+ case CHIP_CARRIZO: /* UVD, VCE do not support GPUVM, DCE SG support */
+ case CHIP_STONEY: /* UVD does not support GPUVM, DCE SG support */
+ adev->mc.gart_size = 1024ULL << 20;
+ break;
+ }
+ } else {
+ adev->mc.gart_size = (u64)amdgpu_gart_size << 20;
+ }
+
gmc_v8_0_vram_gtt_location(adev, &adev->mc);
return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 2769c2b3b56e..d04d0b123212 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -499,7 +499,21 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
if (adev->mc.visible_vram_size > adev->mc.real_vram_size)
adev->mc.visible_vram_size = adev->mc.real_vram_size;
- amdgpu_gart_set_defaults(adev);
+ /* set the gart size */
+ if (amdgpu_gart_size == -1) {
+ switch (adev->asic_type) {
+ case CHIP_VEGA10: /* all engines support GPUVM */
+ default:
+ adev->mc.gart_size = 256ULL << 20;
+ break;
+ case CHIP_RAVEN: /* DCE SG support */
+ adev->mc.gart_size = 1024ULL << 20;
+ break;
+ }
+ } else {
+ adev->mc.gart_size = (u64)amdgpu_gart_size << 20;
+ }
+
gmc_v9_0_vram_gtt_location(adev, &adev->mc);
return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
index 4395a4f12149..74cb647da30e 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
@@ -138,7 +138,7 @@ static void mmhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
static void mmhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
{
- uint32_t tmp, field;
+ uint32_t tmp;
/* Setup L2 cache */
tmp = RREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL);
@@ -157,9 +157,8 @@ static void mmhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL2, tmp);
- field = adev->vm_manager.fragment_size;
tmp = mmVM_L2_CNTL3_DEFAULT;
- tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, field);
+ tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL3, tmp);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index e4a8c2e52cb2..660b3fbade41 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -892,6 +892,8 @@ static int kfd_ioctl_get_tile_config(struct file *filep,
int err = 0;
dev = kfd_device_by_id(args->gpu_id);
+ if (!dev)
+ return -EINVAL;
dev->kfd2kgd->get_tile_config(dev->kgd, &config);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 5979158c3f7b..944abfad39c1 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -292,7 +292,10 @@ static int create_signal_event(struct file *devkfd,
struct kfd_event *ev)
{
if (p->signal_event_count == KFD_SIGNAL_EVENT_LIMIT) {
- pr_warn("Signal event wasn't created because limit was reached\n");
+ if (!p->signal_event_limit_reached) {
+ pr_warn("Signal event wasn't created because limit was reached\n");
+ p->signal_event_limit_reached = true;
+ }
return -ENOMEM;
}
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
index 681b639f5133..ed71ad40e8f7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
@@ -183,8 +183,8 @@ static void uninitialize(struct kernel_queue *kq)
{
if (kq->queue->properties.type == KFD_QUEUE_TYPE_HIQ)
kq->mqd->destroy_mqd(kq->mqd,
- NULL,
- false,
+ kq->queue->mqd,
+ KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS,
kq->queue->pipe,
kq->queue->queue);
@@ -210,6 +210,11 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
uint32_t wptr, rptr;
unsigned int *queue_address;
+ /* When rptr == wptr, the buffer is empty.
+ * When rptr == wptr + 1, the buffer is full.
+ * It is always rptr that advances to the position of wptr, rather than
+ * the opposite. So we can only use up to queue_size_dwords - 1 dwords.
+ */
rptr = *kq->rptr_kernel;
wptr = *kq->wptr_kernel;
queue_address = (unsigned int *)kq->pq_kernel_addr;
@@ -219,11 +224,10 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
pr_debug("wptr: %d\n", wptr);
pr_debug("queue_address 0x%p\n", queue_address);
- available_size = (rptr - 1 - wptr + queue_size_dwords) %
+ available_size = (rptr + queue_size_dwords - 1 - wptr) %
queue_size_dwords;
- if (packet_size_in_dwords >= queue_size_dwords ||
- packet_size_in_dwords >= available_size) {
+ if (packet_size_in_dwords > available_size) {
/*
* make sure calling functions know
* acquire_packet_buffer() failed
@@ -233,6 +237,14 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
}
if (wptr + packet_size_in_dwords >= queue_size_dwords) {
+ /* make sure after rolling back to position 0, there is
+ * still enough space.
+ */
+ if (packet_size_in_dwords >= rptr) {
+ *buffer_ptr = NULL;
+ return -ENOMEM;
+ }
+ /* fill nops, roll back and start at position 0 */
while (wptr > 0) {
queue_address[wptr] = kq->nop_packet;
wptr = (wptr + 1) % queue_size_dwords;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index b397ec726400..b87e96cee5fa 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -521,6 +521,7 @@ struct kfd_process {
struct list_head signal_event_pages;
u32 next_nonsignal_event_id;
size_t signal_event_count;
+ bool signal_event_limit_reached;
};
/**
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
index 1cae95e2b13a..03bec765b03d 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
@@ -143,7 +143,6 @@ int pqm_create_queue(struct process_queue_manager *pqm,
int num_queues = 0;
struct queue *cur;
- memset(&q_properties, 0, sizeof(struct queue_properties));
memcpy(&q_properties, properties, sizeof(struct queue_properties));
q = NULL;
kq = NULL;
diff --git a/drivers/gpu/drm/amd/include/vi_structs.h b/drivers/gpu/drm/amd/include/vi_structs.h
index ca93b5160ba6..3e606a761d0e 100644
--- a/drivers/gpu/drm/amd/include/vi_structs.h
+++ b/drivers/gpu/drm/amd/include/vi_structs.h
@@ -419,8 +419,8 @@ struct vi_mqd_allocation {
struct vi_mqd mqd;
uint32_t wptr_poll_mem;
uint32_t rptr_report_mem;
- uint32_t dyamic_cu_mask;
- uint32_t dyamic_rb_mask;
+ uint32_t dynamic_cu_mask;
+ uint32_t dynamic_rb_mask;
};
struct cz_mqd {
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
index 9d71a259d97d..f8f02e70b8bc 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -1558,7 +1558,8 @@ static int vega10_populate_smc_link_levels(struct pp_hwmgr *hwmgr)
*/
static int vega10_populate_single_gfx_level(struct pp_hwmgr *hwmgr,
- uint32_t gfx_clock, PllSetting_t *current_gfxclk_level)
+ uint32_t gfx_clock, PllSetting_t *current_gfxclk_level,
+ uint32_t *acg_freq)
{
struct phm_ppt_v2_information *table_info =
(struct phm_ppt_v2_information *)(hwmgr->pptable);
@@ -1609,6 +1610,8 @@ static int vega10_populate_single_gfx_level(struct pp_hwmgr *hwmgr,
cpu_to_le16(dividers.usPll_ss_slew_frac);
current_gfxclk_level->Did = (uint8_t)(dividers.ulDid);
+ *acg_freq = gfx_clock / 100; /* 100 Khz to Mhz conversion */
+
return 0;
}
@@ -1689,7 +1692,8 @@ static int vega10_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
for (i = 0; i < dpm_table->count; i++) {
result = vega10_populate_single_gfx_level(hwmgr,
dpm_table->dpm_levels[i].value,
- &(pp_table->GfxclkLevel[i]));
+ &(pp_table->GfxclkLevel[i]),
+ &(pp_table->AcgFreqTable[i]));
if (result)
return result;
}
@@ -1698,7 +1702,8 @@ static int vega10_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
while (i < NUM_GFXCLK_DPM_LEVELS) {
result = vega10_populate_single_gfx_level(hwmgr,
dpm_table->dpm_levels[j].value,
- &(pp_table->GfxclkLevel[i]));
+ &(pp_table->GfxclkLevel[i]),
+ &(pp_table->AcgFreqTable[i]));
if (result)
return result;
i++;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h b/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
index f6d6c61f796a..2818c98ff5ca 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
@@ -315,10 +315,12 @@ typedef struct {
uint8_t AcgEnable[NUM_GFXCLK_DPM_LEVELS];
GbVdroopTable_t AcgBtcGbVdroopTable;
QuadraticInt_t AcgAvfsGb;
- uint32_t Reserved[4];
+
+ /* ACG Frequency Table, in Mhz */
+ uint32_t AcgFreqTable[NUM_GFXCLK_DPM_LEVELS];
/* Padding - ignore */
- uint32_t MmHubPadding[7]; /* SMU internal use */
+ uint32_t MmHubPadding[3]; /* SMU internal use */
} PPTable_t;
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
index 76347ff6d655..c49a6f22002f 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
@@ -380,7 +380,8 @@ static int smu7_populate_single_firmware_entry(struct pp_smumgr *smumgr,
entry->num_register_entries = 0;
}
- if (fw_type == UCODE_ID_RLC_G)
+ if ((fw_type == UCODE_ID_RLC_G)
+ || (fw_type == UCODE_ID_CP_MEC))
entry->flags = 1;
else
entry->flags = 0;
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index 38cea6fb25a8..97c94f9683fa 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -205,17 +205,32 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
struct amd_sched_entity *entity)
{
struct amd_sched_rq *rq = entity->rq;
+ int r;
if (!amd_sched_entity_is_initialized(sched, entity))
return;
-
/**
* The client will not queue more IBs during this fini, consume existing
- * queued IBs
+ * queued IBs or discard them on SIGKILL
*/
- wait_event(sched->job_scheduled, amd_sched_entity_is_idle(entity));
-
+ if ((current->flags & PF_SIGNALED) && current->exit_code == SIGKILL)
+ r = -ERESTARTSYS;
+ else
+ r = wait_event_killable(sched->job_scheduled,
+ amd_sched_entity_is_idle(entity));
amd_sched_rq_remove_entity(rq, entity);
+ if (r) {
+ struct amd_sched_job *job;
+
+ /* Park the kernel for a moment to make sure it isn't processing
+ * our enity.
+ */
+ kthread_park(sched->thread);
+ kthread_unpark(sched->thread);
+ while (kfifo_out(&entity->job_queue, &job, sizeof(job)))
+ sched->ops->free_job(job);
+
+ }
kfifo_free(&entity->job_queue);
}
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index db6aeec50b82..2e5e089dd912 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -319,7 +319,7 @@ static int drm_atomic_helper_crtc_normalize_zpos(struct drm_crtc *crtc,
DRM_DEBUG_ATOMIC("[CRTC:%d:%s] calculating normalized zpos values\n",
crtc->base.id, crtc->name);
- states = kmalloc_array(total_planes, sizeof(*states), GFP_TEMPORARY);
+ states = kmalloc_array(total_planes, sizeof(*states), GFP_KERNEL);
if (!states)
return -ENOMEM;
diff --git a/drivers/gpu/drm/drm_dp_dual_mode_helper.c b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
index 80e62f669321..0ef9011a1856 100644
--- a/drivers/gpu/drm/drm_dp_dual_mode_helper.c
+++ b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
@@ -111,7 +111,7 @@ ssize_t drm_dp_dual_mode_write(struct i2c_adapter *adapter,
void *data;
int ret;
- data = kmalloc(msg.len, GFP_TEMPORARY);
+ data = kmalloc(msg.len, GFP_KERNEL);
if (!data)
return -ENOMEM;
diff --git a/drivers/gpu/drm/drm_scdc_helper.c b/drivers/gpu/drm/drm_scdc_helper.c
index 7d1b0f011d33..935653eb3616 100644
--- a/drivers/gpu/drm/drm_scdc_helper.c
+++ b/drivers/gpu/drm/drm_scdc_helper.c
@@ -102,7 +102,7 @@ ssize_t drm_scdc_write(struct i2c_adapter *adapter, u8 offset,
void *data;
int err;
- data = kmalloc(1 + size, GFP_TEMPORARY);
+ data = kmalloc(1 + size, GFP_KERNEL);
if (!data)
return -ENOMEM;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 5a634594a6ce..57881167ccd2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -551,12 +551,15 @@ static const struct etnaviv_gem_ops etnaviv_gem_shmem_ops = {
void etnaviv_gem_free_object(struct drm_gem_object *obj)
{
struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
+ struct etnaviv_drm_private *priv = obj->dev->dev_private;
struct etnaviv_vram_mapping *mapping, *tmp;
/* object should not be active */
WARN_ON(is_active(etnaviv_obj));
+ mutex_lock(&priv->gem_lock);
list_del(&etnaviv_obj->gem_node);
+ mutex_unlock(&priv->gem_lock);
list_for_each_entry_safe(mapping, tmp, &etnaviv_obj->vram_list,
obj_node) {
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index a7ff2e4c00d2..46dfe0737f43 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -37,7 +37,7 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
struct etnaviv_gem_submit *submit;
size_t sz = size_vstruct(nr, sizeof(submit->bos[0]), sizeof(*submit));
- submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
+ submit = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
if (submit) {
submit->dev = dev;
submit->gpu = gpu;
@@ -445,8 +445,10 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
cmdbuf->user_size = ALIGN(args->stream_size, 8);
ret = etnaviv_gpu_submit(gpu, submit, cmdbuf);
- if (ret == 0)
- cmdbuf = NULL;
+ if (ret)
+ goto out;
+
+ cmdbuf = NULL;
if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) {
/*
diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
index 730b8d9db187..6be5b53c3b27 100644
--- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
+++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
@@ -14,6 +14,7 @@
#include <linux/clk.h>
#include <linux/component.h>
#include <linux/iopoll.h>
+#include <linux/irq.h>
#include <linux/mfd/syscon.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index b1f7299600f0..e651a58c18cf 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -168,23 +168,19 @@ static struct drm_driver exynos_drm_driver = {
static int exynos_drm_suspend(struct device *dev)
{
struct drm_device *drm_dev = dev_get_drvdata(dev);
- struct drm_connector *connector;
- struct drm_connector_list_iter conn_iter;
+ struct exynos_drm_private *private = drm_dev->dev_private;
if (pm_runtime_suspended(dev) || !drm_dev)
return 0;
- drm_connector_list_iter_begin(drm_dev, &conn_iter);
- drm_for_each_connector_iter(connector, &conn_iter) {
- int old_dpms = connector->dpms;
-
- if (connector->funcs->dpms)
- connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF);
-
- /* Set the old mode back to the connector for resume */
- connector->dpms = old_dpms;
+ drm_kms_helper_poll_disable(drm_dev);
+ exynos_drm_fbdev_suspend(drm_dev);
+ private->suspend_state = drm_atomic_helper_suspend(drm_dev);
+ if (IS_ERR(private->suspend_state)) {
+ exynos_drm_fbdev_resume(drm_dev);
+ drm_kms_helper_poll_enable(drm_dev);
+ return PTR_ERR(private->suspend_state);
}
- drm_connector_list_iter_end(&conn_iter);
return 0;
}
@@ -192,22 +188,14 @@ static int exynos_drm_suspend(struct device *dev)
static int exynos_drm_resume(struct device *dev)
{
struct drm_device *drm_dev = dev_get_drvdata(dev);
- struct drm_connector *connector;
- struct drm_connector_list_iter conn_iter;
+ struct exynos_drm_private *private = drm_dev->dev_private;
if (pm_runtime_suspended(dev) || !drm_dev)
return 0;
- drm_connector_list_iter_begin(drm_dev, &conn_iter);
- drm_for_each_connector_iter(connector, &conn_iter) {
- if (connector->funcs->dpms) {
- int dpms = connector->dpms;
-
- connector->dpms = DRM_MODE_DPMS_OFF;
- connector->funcs->dpms(connector, dpms);
- }
- }
- drm_connector_list_iter_end(&conn_iter);
+ drm_atomic_helper_resume(drm_dev, private->suspend_state);
+ exynos_drm_fbdev_resume(drm_dev);
+ drm_kms_helper_poll_enable(drm_dev);
return 0;
}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index cf131c2aa23e..f8bae4cb4823 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -202,6 +202,7 @@ struct drm_exynos_file_private {
*/
struct exynos_drm_private {
struct drm_fb_helper *fb_helper;
+ struct drm_atomic_state *suspend_state;
struct device *dma_dev;
void *mapping;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index c3a068409b48..dfb66ecf417b 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -18,6 +18,8 @@
#include <drm/drm_crtc_helper.h>
#include <drm/exynos_drm.h>
+#include <linux/console.h>
+
#include "exynos_drm_drv.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_fbdev.h"
@@ -285,3 +287,21 @@ void exynos_drm_output_poll_changed(struct drm_device *dev)
drm_fb_helper_hotplug_event(fb_helper);
}
+
+void exynos_drm_fbdev_suspend(struct drm_device *dev)
+{
+ struct exynos_drm_private *private = dev->dev_private;
+
+ console_lock();
+ drm_fb_helper_set_suspend(private->fb_helper, 1);
+ console_unlock();
+}
+
+void exynos_drm_fbdev_resume(struct drm_device *dev)
+{
+ struct exynos_drm_private *private = dev->dev_private;
+
+ console_lock();
+ drm_fb_helper_set_suspend(private->fb_helper, 0);
+ console_unlock();
+}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
index 330eef87f718..645d1bb7f665 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.h
@@ -21,6 +21,8 @@ int exynos_drm_fbdev_init(struct drm_device *dev);
void exynos_drm_fbdev_fini(struct drm_device *dev);
void exynos_drm_fbdev_restore_mode(struct drm_device *dev);
void exynos_drm_output_poll_changed(struct drm_device *dev);
+void exynos_drm_fbdev_suspend(struct drm_device *drm);
+void exynos_drm_fbdev_resume(struct drm_device *drm);
#else
@@ -39,6 +41,14 @@ static inline void exynos_drm_fbdev_restore_mode(struct drm_device *dev)
#define exynos_drm_output_poll_changed (NULL)
+static inline void exynos_drm_fbdev_suspend(struct drm_device *drm)
+{
+}
+
+static inline void exynos_drm_fbdev_resume(struct drm_device *drm)
+{
+}
+
#endif
#endif
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 214fa5e51963..0109ff40b1db 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -944,22 +944,27 @@ static bool hdmi_mode_fixup(struct drm_encoder *encoder,
struct drm_device *dev = encoder->dev;
struct drm_connector *connector;
struct drm_display_mode *m;
+ struct drm_connector_list_iter conn_iter;
int mode_ok;
drm_mode_set_crtcinfo(adjusted_mode, 0);
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
if (connector->encoder == encoder)
break;
}
+ if (connector)
+ drm_connector_get(connector);
+ drm_connector_list_iter_end(&conn_iter);
- if (connector->encoder != encoder)
+ if (!connector)
return true;
mode_ok = hdmi_mode_valid(connector, adjusted_mode);
if (mode_ok == MODE_OK)
- return true;
+ goto cleanup;
/*
* Find the most suitable mode and copy it to adjusted_mode.
@@ -979,6 +984,9 @@ static bool hdmi_mode_fixup(struct drm_encoder *encoder,
}
}
+cleanup:
+ drm_connector_put(connector);
+
return true;
}
diff --git a/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c b/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c
index 771ff66711af..37c997e24b9e 100644
--- a/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c
+++ b/drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c
@@ -26,7 +26,7 @@
#include "mdfld_output.h"
#include "mdfld_dsi_pkg_sender.h"
#include "tc35876x-dsi-lvds.h"
-#include <linux/i2c/tc35876x.h>
+#include <linux/platform_data/tc35876x.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/intel_scu_ipc.h>
diff --git a/drivers/gpu/drm/i915/gvt/cfg_space.c b/drivers/gpu/drm/i915/gvt/cfg_space.c
index 40af17ec6312..ff3154fe6588 100644
--- a/drivers/gpu/drm/i915/gvt/cfg_space.c
+++ b/drivers/gpu/drm/i915/gvt/cfg_space.c
@@ -197,78 +197,65 @@ static int emulate_pci_command_write(struct intel_vgpu *vgpu,
static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset,
void *p_data, unsigned int bytes)
{
- unsigned int bar_index =
- (rounddown(offset, 8) % PCI_BASE_ADDRESS_0) / 8;
u32 new = *(u32 *)(p_data);
bool lo = IS_ALIGNED(offset, 8);
u64 size;
int ret = 0;
bool mmio_enabled =
vgpu_cfg_space(vgpu)[PCI_COMMAND] & PCI_COMMAND_MEMORY;
+ struct intel_vgpu_pci_bar *bars = vgpu->cfg_space.bar;
- if (WARN_ON(bar_index >= INTEL_GVT_PCI_BAR_MAX))
- return -EINVAL;
-
+ /*
+ * Power-up software can determine how much address
+ * space the device requires by writing a value of
+ * all 1's to the register and then reading the value
+ * back. The device will return 0's in all don't-care
+ * address bits.
+ */
if (new == 0xffffffff) {
- /*
- * Power-up software can determine how much address
- * space the device requires by writing a value of
- * all 1's to the register and then reading the value
- * back. The device will return 0's in all don't-care
- * address bits.
- */
- size = vgpu->cfg_space.bar[bar_index].size;
- if (lo) {
- new = rounddown(new, size);
- } else {
- u32 val = vgpu_cfg_space(vgpu)[rounddown(offset, 8)];
- /* for 32bit mode bar it returns all-0 in upper 32
- * bit, for 64bit mode bar it will calculate the
- * size with lower 32bit and return the corresponding
- * value
+ switch (offset) {
+ case PCI_BASE_ADDRESS_0:
+ case PCI_BASE_ADDRESS_1:
+ size = ~(bars[INTEL_GVT_PCI_BAR_GTTMMIO].size -1);
+ intel_vgpu_write_pci_bar(vgpu, offset,
+ size >> (lo ? 0 : 32), lo);
+ /*
+ * Untrap the BAR, since guest hasn't configured a
+ * valid GPA
*/
- if (val & PCI_BASE_ADDRESS_MEM_TYPE_64)
- new &= (~(size-1)) >> 32;
- else
- new = 0;
- }
- /*
- * Unmapp & untrap the BAR, since guest hasn't configured a
- * valid GPA
- */
- switch (bar_index) {
- case INTEL_GVT_PCI_BAR_GTTMMIO:
ret = trap_gttmmio(vgpu, false);
break;
- case INTEL_GVT_PCI_BAR_APERTURE:
+ case PCI_BASE_ADDRESS_2:
+ case PCI_BASE_ADDRESS_3:
+ size = ~(bars[INTEL_GVT_PCI_BAR_APERTURE].size -1);
+ intel_vgpu_write_pci_bar(vgpu, offset,
+ size >> (lo ? 0 : 32), lo);
ret = map_aperture(vgpu, false);
break;
+ default:
+ /* Unimplemented BARs */
+ intel_vgpu_write_pci_bar(vgpu, offset, 0x0, false);
}
- intel_vgpu_write_pci_bar(vgpu, offset, new, lo);
} else {
- /*
- * Unmapp & untrap the old BAR first, since guest has
- * re-configured the BAR
- */
- switch (bar_index) {
- case INTEL_GVT_PCI_BAR_GTTMMIO:
- ret = trap_gttmmio(vgpu, false);
+ switch (offset) {
+ case PCI_BASE_ADDRESS_0:
+ case PCI_BASE_ADDRESS_1:
+ /*
+ * Untrap the old BAR first, since guest has
+ * re-configured the BAR
+ */
+ trap_gttmmio(vgpu, false);
+ intel_vgpu_write_pci_bar(vgpu, offset, new, lo);
+ ret = trap_gttmmio(vgpu, mmio_enabled);
break;
- case INTEL_GVT_PCI_BAR_APERTURE:
- ret = map_aperture(vgpu, false);
+ case PCI_BASE_ADDRESS_2:
+ case PCI_BASE_ADDRESS_3:
+ map_aperture(vgpu, false);
+ intel_vgpu_write_pci_bar(vgpu, offset, new, lo);
+ ret = map_aperture(vgpu, mmio_enabled);
break;
- }
- intel_vgpu_write_pci_bar(vgpu, offset, new, lo);
- /* Track the new BAR */
- if (mmio_enabled) {
- switch (bar_index) {
- case INTEL_GVT_PCI_BAR_GTTMMIO:
- ret = trap_gttmmio(vgpu, true);
- break;
- case INTEL_GVT_PCI_BAR_APERTURE:
- ret = map_aperture(vgpu, true);
- break;
- }
+ default:
+ intel_vgpu_write_pci_bar(vgpu, offset, new, lo);
}
}
return ret;
@@ -299,10 +286,7 @@ int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
}
switch (rounddown(offset, 4)) {
- case PCI_BASE_ADDRESS_0:
- case PCI_BASE_ADDRESS_1:
- case PCI_BASE_ADDRESS_2:
- case PCI_BASE_ADDRESS_3:
+ case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_5:
if (WARN_ON(!IS_ALIGNED(offset, 4)))
return -EINVAL;
return emulate_pci_bar_write(vgpu, offset, p_data, bytes);
@@ -344,7 +328,6 @@ void intel_vgpu_init_cfg_space(struct intel_vgpu *vgpu,
struct intel_gvt *gvt = vgpu->gvt;
const struct intel_gvt_device_info *info = &gvt->device_info;
u16 *gmch_ctl;
- int i;
memcpy(vgpu_cfg_space(vgpu), gvt->firmware.cfg_space,
info->cfg_space_size);
@@ -371,13 +354,13 @@ void intel_vgpu_init_cfg_space(struct intel_vgpu *vgpu,
*/
memset(vgpu_cfg_space(vgpu) + PCI_BASE_ADDRESS_1, 0, 4);
memset(vgpu_cfg_space(vgpu) + PCI_BASE_ADDRESS_3, 0, 4);
+ memset(vgpu_cfg_space(vgpu) + PCI_BASE_ADDRESS_4, 0, 8);
memset(vgpu_cfg_space(vgpu) + INTEL_GVT_PCI_OPREGION, 0, 4);
- for (i = 0; i < INTEL_GVT_MAX_BAR_NUM; i++) {
- vgpu->cfg_space.bar[i].size = pci_resource_len(
- gvt->dev_priv->drm.pdev, i * 2);
- vgpu->cfg_space.bar[i].tracked = false;
- }
+ vgpu->cfg_space.bar[INTEL_GVT_PCI_BAR_GTTMMIO].size =
+ pci_resource_len(gvt->dev_priv->drm.pdev, 0);
+ vgpu->cfg_space.bar[INTEL_GVT_PCI_BAR_APERTURE].size =
+ pci_resource_len(gvt->dev_priv->drm.pdev, 2);
}
/**
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 57317715977f..19404c96eeb1 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2540,7 +2540,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,
if (n_pages > ARRAY_SIZE(stack_pages)) {
/* Too big for stack -- allocate temporary array instead */
- pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_TEMPORARY);
+ pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
if (!pages)
return NULL;
}
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 50d5e24f91a9..92437f455b43 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -293,7 +293,7 @@ static int eb_create(struct i915_execbuffer *eb)
* as possible to perform the allocation and warn
* if it fails.
*/
- flags = GFP_TEMPORARY;
+ flags = GFP_KERNEL;
if (size > 1)
flags |= __GFP_NORETRY | __GFP_NOWARN;
@@ -1515,7 +1515,7 @@ static int eb_copy_relocations(const struct i915_execbuffer *eb)
urelocs = u64_to_user_ptr(eb->exec[i].relocs_ptr);
size = nreloc * sizeof(*relocs);
- relocs = kvmalloc_array(size, 1, GFP_TEMPORARY);
+ relocs = kvmalloc_array(size, 1, GFP_KERNEL);
if (!relocs) {
kvfree(relocs);
err = -ENOMEM;
@@ -2077,7 +2077,7 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
return ERR_PTR(-EFAULT);
fences = kvmalloc_array(args->num_cliprects, sizeof(*fences),
- __GFP_NOWARN | GFP_TEMPORARY);
+ __GFP_NOWARN | GFP_KERNEL);
if (!fences)
return ERR_PTR(-ENOMEM);
@@ -2463,9 +2463,9 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
/* Copy in the exec list from userland */
exec_list = kvmalloc_array(args->buffer_count, sizeof(*exec_list),
- __GFP_NOWARN | GFP_TEMPORARY);
+ __GFP_NOWARN | GFP_KERNEL);
exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
- __GFP_NOWARN | GFP_TEMPORARY);
+ __GFP_NOWARN | GFP_KERNEL);
if (exec_list == NULL || exec2_list == NULL) {
DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
args->buffer_count);
@@ -2543,7 +2543,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
/* Allocate an extra slot for use by the command parser */
exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
- __GFP_NOWARN | GFP_TEMPORARY);
+ __GFP_NOWARN | GFP_KERNEL);
if (exec2_list == NULL) {
DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
args->buffer_count);
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 0d5a988b3867..e2410eb5d96e 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -3231,7 +3231,7 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,
/* Allocate a temporary list of source pages for random access. */
page_addr_list = kvmalloc_array(n_pages,
sizeof(dma_addr_t),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!page_addr_list)
return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 23fd18bd1b56..709efe2357ea 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -507,7 +507,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
ret = -ENOMEM;
pinned = 0;
- pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_TEMPORARY);
+ pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
if (pvec != NULL) {
struct mm_struct *mm = obj->userptr.mm->mm;
unsigned int flags = 0;
@@ -643,7 +643,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
if (mm == current->mm) {
pvec = kvmalloc_array(num_pages, sizeof(struct page *),
- GFP_TEMPORARY |
+ GFP_KERNEL |
__GFP_NORETRY |
__GFP_NOWARN);
if (pvec) /* defer to worker if malloc fails */
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index ed5a1eb839ad..0c779671fe2d 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -787,16 +787,16 @@ int i915_error_state_buf_init(struct drm_i915_error_state_buf *ebuf,
*/
ebuf->size = count + 1 > PAGE_SIZE ? count + 1 : PAGE_SIZE;
ebuf->buf = kmalloc(ebuf->size,
- GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);
+ GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);
if (ebuf->buf == NULL) {
ebuf->size = PAGE_SIZE;
- ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY);
+ ebuf->buf = kmalloc(ebuf->size, GFP_KERNEL);
}
if (ebuf->buf == NULL) {
ebuf->size = 128;
- ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY);
+ ebuf->buf = kmalloc(ebuf->size, GFP_KERNEL);
}
if (ebuf->buf == NULL)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index e21ce9c18b6e..b63893eeca73 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -839,7 +839,6 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
pipe);
int position;
int vbl_start, vbl_end, hsync_start, htotal, vtotal;
- bool in_vbl = true;
unsigned long irqflags;
if (WARN_ON(!mode->crtc_clock)) {
@@ -922,8 +921,6 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
- in_vbl = position >= vbl_start && position < vbl_end;
-
/*
* While in vblank, position will be negative
* counting up towards 0 at vbl_end. And outside
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f17275519484..00cd17c76fdc 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14030,7 +14030,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
if (mode_cmd->handles[i] != mode_cmd->handles[0]) {
DRM_DEBUG_KMS("bad plane %d handle\n", i);
- return -EINVAL;
+ goto err;
}
stride_alignment = intel_fb_stride_alignment(fb, i);
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index f0c11aec5ea5..7442891762be 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -892,8 +892,6 @@ static void intel_dsi_disable(struct intel_encoder *encoder,
struct intel_crtc_state *old_crtc_state,
struct drm_connector_state *old_conn_state)
{
- struct drm_device *dev = encoder->base.dev;
- struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
enum port port;
@@ -903,15 +901,6 @@ static void intel_dsi_disable(struct intel_encoder *encoder,
intel_panel_disable_backlight(old_conn_state);
/*
- * Disable Device ready before the port shutdown in order
- * to avoid split screen
- */
- if (IS_BROXTON(dev_priv)) {
- for_each_dsi_port(port, intel_dsi->ports)
- I915_WRITE(MIPI_DEVICE_READY(port), 0);
- }
-
- /*
* According to the spec we should send SHUTDOWN before
* MIPI_SEQ_DISPLAY_OFF only for v3+ VBTs, but field testing
* has shown that the v3 sequence works for v2 VBTs too
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index a17b1de7d7e0..3b1c5d783ee7 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1699,6 +1699,8 @@ bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
if (!panel->backlight.max)
return -ENODEV;
+ panel->backlight.min = get_backlight_min_vbt(connector);
+
val = bxt_get_backlight(connector);
val = intel_panel_compute_brightness(connector, val);
panel->backlight.level = clamp(val, panel->backlight.min,
@@ -1735,6 +1737,8 @@ cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
if (!panel->backlight.max)
return -ENODEV;
+ panel->backlight.min = get_backlight_min_vbt(connector);
+
val = bxt_get_backlight(connector);
val = intel_panel_compute_brightness(connector, val);
panel->backlight.level = clamp(val, panel->backlight.min,
diff --git a/drivers/gpu/drm/i915/selftests/i915_random.c b/drivers/gpu/drm/i915/selftests/i915_random.c
index d044bf9a6feb..222c511bea49 100644
--- a/drivers/gpu/drm/i915/selftests/i915_random.c
+++ b/drivers/gpu/drm/i915/selftests/i915_random.c
@@ -62,7 +62,7 @@ unsigned int *i915_random_order(unsigned int count, struct rnd_state *state)
{
unsigned int *order, i;
- order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
+ order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
if (!order)
return order;
diff --git a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
index 7276194c04f7..828904b7d468 100644
--- a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
@@ -117,12 +117,12 @@ static int igt_random_insert_remove(void *arg)
mock_engine_reset(engine);
- waiters = kvmalloc_array(count, sizeof(*waiters), GFP_TEMPORARY);
+ waiters = kvmalloc_array(count, sizeof(*waiters), GFP_KERNEL);
if (!waiters)
goto out_engines;
bitmap = kcalloc(DIV_ROUND_UP(count, BITS_PER_LONG), sizeof(*bitmap),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!bitmap)
goto out_waiters;
@@ -187,12 +187,12 @@ static int igt_insert_complete(void *arg)
mock_engine_reset(engine);
- waiters = kvmalloc_array(count, sizeof(*waiters), GFP_TEMPORARY);
+ waiters = kvmalloc_array(count, sizeof(*waiters), GFP_KERNEL);
if (!waiters)
goto out_engines;
bitmap = kcalloc(DIV_ROUND_UP(count, BITS_PER_LONG), sizeof(*bitmap),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!bitmap)
goto out_waiters;
@@ -368,7 +368,7 @@ static int igt_wakeup(void *arg)
mock_engine_reset(engine);
- waiters = kvmalloc_array(count, sizeof(*waiters), GFP_TEMPORARY);
+ waiters = kvmalloc_array(count, sizeof(*waiters), GFP_KERNEL);
if (!waiters)
goto out_engines;
diff --git a/drivers/gpu/drm/i915/selftests/intel_uncore.c b/drivers/gpu/drm/i915/selftests/intel_uncore.c
index 2d0fef2cfca6..3cac22eb47ce 100644
--- a/drivers/gpu/drm/i915/selftests/intel_uncore.c
+++ b/drivers/gpu/drm/i915/selftests/intel_uncore.c
@@ -127,7 +127,7 @@ static int intel_uncore_check_forcewake_domains(struct drm_i915_private *dev_pri
return 0;
valid = kzalloc(BITS_TO_LONGS(FW_RANGE) * sizeof(*valid),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!valid)
return -ENOMEM;
diff --git a/drivers/gpu/drm/lib/drm_random.c b/drivers/gpu/drm/lib/drm_random.c
index 7b12a68c3b54..a78c4b483e8d 100644
--- a/drivers/gpu/drm/lib/drm_random.c
+++ b/drivers/gpu/drm/lib/drm_random.c
@@ -28,7 +28,7 @@ unsigned int *drm_random_order(unsigned int count, struct rnd_state *state)
{
unsigned int *order, i;
- order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
+ order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
if (!order)
return order;
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 8a75c0bd8a78..5d0a75d4b249 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -40,7 +40,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
if (sz > SIZE_MAX)
return NULL;
- submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
+ submit = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
if (!submit)
return NULL;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
index 4a57defc99b3..1399d923d446 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
@@ -171,7 +171,7 @@ nvkm_gpio_fini(struct nvkm_subdev *subdev, bool suspend)
return 0;
}
-static struct dmi_system_id gpio_reset_ids[] = {
+static const struct dmi_system_id gpio_reset_ids[] = {
{
.ident = "Apple Macbook 10,1",
.matches = {
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 14c5613b4388..afbf50d0c08f 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -509,23 +509,25 @@ static void qxl_primary_atomic_update(struct drm_plane *plane,
.y2 = qfb->base.height
};
- if (!old_state->fb) {
- qxl_io_log(qdev,
- "create primary fb: %dx%d,%d,%d\n",
- bo->surf.width, bo->surf.height,
- bo->surf.stride, bo->surf.format);
+ if (old_state->fb) {
+ qfb_old = to_qxl_framebuffer(old_state->fb);
+ bo_old = gem_to_qxl_bo(qfb_old->obj);
+ } else {
+ bo_old = NULL;
+ }
- qxl_io_create_primary(qdev, 0, bo);
- bo->is_primary = true;
+ if (bo == bo_old)
return;
- } else {
- qfb_old = to_qxl_framebuffer(old_state->fb);
- bo_old = gem_to_qxl_bo(qfb_old->obj);
+ if (bo_old && bo_old->is_primary) {
+ qxl_io_destroy_primary(qdev);
bo_old->is_primary = false;
}
- bo->is_primary = true;
+ if (!bo->is_primary) {
+ qxl_io_create_primary(qdev, 0, bo);
+ bo->is_primary = true;
+ }
qxl_draw_dirty_fb(qdev, qfb, bo, 0, 0, &norect, 1, 1);
}
@@ -534,13 +536,15 @@ static void qxl_primary_atomic_disable(struct drm_plane *plane,
{
struct qxl_device *qdev = plane->dev->dev_private;
- if (old_state->fb)
- { struct qxl_framebuffer *qfb =
+ if (old_state->fb) {
+ struct qxl_framebuffer *qfb =
to_qxl_framebuffer(old_state->fb);
struct qxl_bo *bo = gem_to_qxl_bo(qfb->obj);
- qxl_io_destroy_primary(qdev);
- bo->is_primary = false;
+ if (bo->is_primary) {
+ qxl_io_destroy_primary(qdev);
+ bo->is_primary = false;
+ }
}
}
@@ -698,14 +702,15 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane,
struct drm_gem_object *obj;
struct qxl_bo *user_bo;
- if (!plane->state->fb) {
- /* we never executed prepare_fb, so there's nothing to
+ if (!old_state->fb) {
+ /*
+ * we never executed prepare_fb, so there's nothing to
* unpin.
*/
return;
}
- obj = to_qxl_framebuffer(plane->state->fb)->obj;
+ obj = to_qxl_framebuffer(old_state->fb)->obj;
user_bo = gem_to_qxl_bo(obj);
qxl_bo_unpin(user_bo);
}
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 997131d58c7f..ffc10cadcf34 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1663,7 +1663,7 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend,
radeon_agp_suspend(rdev);
pci_save_state(dev->pdev);
- if (freeze && rdev->family >= CHIP_CEDAR) {
+ if (freeze && rdev->family >= CHIP_CEDAR && !(rdev->flags & RADEON_IS_IGP)) {
rdev->asic->asic_reset(rdev, true);
pci_restore_state(dev->pdev);
} else if (suspend) {
diff --git a/drivers/gpu/drm/selftests/test-drm_mm.c b/drivers/gpu/drm/selftests/test-drm_mm.c
index dfdd858eda0a..86eb4c185a28 100644
--- a/drivers/gpu/drm/selftests/test-drm_mm.c
+++ b/drivers/gpu/drm/selftests/test-drm_mm.c
@@ -1627,7 +1627,7 @@ static int igt_topdown(void *ignored)
goto err;
bitmap = kzalloc(count / BITS_PER_LONG * sizeof(unsigned long),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!bitmap)
goto err_nodes;
@@ -1741,7 +1741,7 @@ static int igt_bottomup(void *ignored)
goto err;
bitmap = kzalloc(count / BITS_PER_LONG * sizeof(unsigned long),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!bitmap)
goto err_nodes;
diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig
index 06f05302ee75..882d85db9053 100644
--- a/drivers/gpu/drm/sun4i/Kconfig
+++ b/drivers/gpu/drm/sun4i/Kconfig
@@ -26,7 +26,7 @@ config DRM_SUN4I_HDMI_CEC
bool "Allwinner A10 HDMI CEC Support"
depends on DRM_SUN4I_HDMI
select CEC_CORE
- depends on CEC_PIN
+ select CEC_PIN
help
Choose this option if you have an Allwinner SoC with an HDMI
controller and want to use CEC.
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi.h b/drivers/gpu/drm/sun4i/sun4i_hdmi.h
index 1457750988da..a1f8cba251a2 100644
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi.h
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi.h
@@ -15,7 +15,7 @@
#include <drm/drm_connector.h>
#include <drm/drm_encoder.h>
-#include <media/cec.h>
+#include <media/cec-pin.h>
#define SUN4I_HDMI_CTRL_REG 0x004
#define SUN4I_HDMI_CTRL_ENABLE BIT(31)
diff --git a/drivers/gpu/drm/tegra/trace.h b/drivers/gpu/drm/tegra/trace.h
index e9b7cdad5c4c..5a1ab4046e92 100644
--- a/drivers/gpu/drm/tegra/trace.h
+++ b/drivers/gpu/drm/tegra/trace.h
@@ -63,6 +63,6 @@ DEFINE_EVENT(register_access, sor_readl,
/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
-#define TRACE_INCLUDE_PATH .
+#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/tegra
#define TRACE_INCLUDE_FILE trace
#include <trace/define_trace.h>
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index cba11f13d994..180ce6296416 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -109,8 +109,8 @@ static ssize_t ttm_bo_global_show(struct kobject *kobj,
struct ttm_bo_global *glob =
container_of(kobj, struct ttm_bo_global, kobj);
- return snprintf(buffer, PAGE_SIZE, "%lu\n",
- (unsigned long) atomic_read(&glob->bo_count));
+ return snprintf(buffer, PAGE_SIZE, "%d\n",
+ atomic_read(&glob->bo_count));
}
static struct attribute *ttm_bo_global_attrs[] = {
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index d0459b392e5e..c934ad5b3903 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -469,6 +469,7 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
* TODO: Explicit member copy would probably be better here.
*/
+ atomic_inc(&bo->glob->bo_count);
INIT_LIST_HEAD(&fbo->ddestroy);
INIT_LIST_HEAD(&fbo->lru);
INIT_LIST_HEAD(&fbo->swap);
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index b397a14ab970..a98919199858 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -533,6 +533,7 @@
#define USB_VENDOR_ID_IDEACOM 0x1cb6
#define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650
#define USB_DEVICE_ID_IDEACOM_IDC6651 0x6651
+#define USB_DEVICE_ID_IDEACOM_IDC6680 0x6680
#define USB_VENDOR_ID_ILITEK 0x222a
#define USB_DEVICE_ID_ILITEK_MULTITOUCH 0x0001
@@ -660,6 +661,7 @@
#define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048
#define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067
#define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085
+#define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3
#define USB_VENDOR_ID_LG 0x1fd2
#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 440b999304a5..9e8c4d2ba11d 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -930,6 +930,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
field->application != HID_DG_PEN &&
field->application != HID_DG_TOUCHPAD &&
field->application != HID_GD_KEYBOARD &&
+ field->application != HID_GD_SYSTEM_CONTROL &&
field->application != HID_CP_CONSUMER_CONTROL &&
field->application != HID_GD_WIRELESS_RADIO_CTLS &&
!(field->application == HID_VD_ASUS_CUSTOM_MEDIA_KEYS &&
@@ -1419,6 +1420,12 @@ static const struct hid_device_id mt_devices[] = {
USB_VENDOR_ID_ALPS_JP,
HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) },
+ /* Lenovo X1 TAB Gen 2 */
+ { .driver_data = MT_CLS_WIN_8_DUAL,
+ HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
+ USB_VENDOR_ID_LENOVO,
+ USB_DEVICE_ID_LENOVO_X1_TAB) },
+
/* Anton devices */
{ .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
MT_USB_DEVICE(USB_VENDOR_ID_ANTON,
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index 5b40c2614599..ef241d66562e 100644
--- a/drivers/hid/hid-rmi.c
+++ b/drivers/hid/hid-rmi.c
@@ -436,17 +436,24 @@ static int rmi_post_resume(struct hid_device *hdev)
if (!(data->device_flags & RMI_DEVICE))
return 0;
- ret = rmi_reset_attn_mode(hdev);
+ /* Make sure the HID device is ready to receive events */
+ ret = hid_hw_open(hdev);
if (ret)
return ret;
+ ret = rmi_reset_attn_mode(hdev);
+ if (ret)
+ goto out;
+
ret = rmi_driver_resume(rmi_dev, false);
if (ret) {
hid_warn(hdev, "Failed to resume device: %d\n", ret);
- return ret;
+ goto out;
}
- return 0;
+out:
+ hid_hw_close(hdev);
+ return ret;
}
#endif /* CONFIG_PM */
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index ec530454e6f6..5fbe0f81ab2e 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -337,8 +337,8 @@ static void drop_ref(struct hidraw *hidraw, int exists_bit)
kfree(hidraw);
} else {
/* close device for last reader */
- hid_hw_power(hidraw->hid, PM_HINT_NORMAL);
hid_hw_close(hidraw->hid);
+ hid_hw_power(hidraw->hid, PM_HINT_NORMAL);
}
}
}
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
index 77396145d2d0..9145c2129a96 100644
--- a/drivers/hid/i2c-hid/i2c-hid.c
+++ b/drivers/hid/i2c-hid/i2c-hid.c
@@ -543,7 +543,8 @@ static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
{
/* the worst case is computed from the set_report command with a
* reportID > 15 and the maximum report length */
- int args_len = sizeof(__u8) + /* optional ReportID byte */
+ int args_len = sizeof(__u8) + /* ReportID */
+ sizeof(__u8) + /* optional ReportID byte */
sizeof(__u16) + /* data register */
sizeof(__u16) + /* size of the report */
report_size; /* report */
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index a83fa76655b9..f489a5cfcb48 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -99,6 +99,7 @@ static const struct hid_blacklist {
{ USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL },
+ { USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS, HID_QUIRK_NOGET },
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index e82a696a1d07..906e654fb0ba 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -668,8 +668,10 @@ static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
/* Try to find an already-probed interface from the same device */
list_for_each_entry(data, &wacom_udev_list, list) {
- if (compare_device_paths(hdev, data->dev, '/'))
+ if (compare_device_paths(hdev, data->dev, '/')) {
+ kref_get(&data->kref);
return data;
+ }
}
/* Fallback to finding devices that appear to be "siblings" */
@@ -766,6 +768,9 @@ static int wacom_led_control(struct wacom *wacom)
if (!wacom->led.groups)
return -ENOTSUPP;
+ if (wacom->wacom_wac.features.type == REMOTE)
+ return -ENOTSUPP;
+
if (wacom->wacom_wac.pid) { /* wireless connected */
report_id = WAC_CMD_WL_LED_CONTROL;
buf_size = 13;
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index bb17d7bbefd3..aa692e28b2cd 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -567,8 +567,8 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
keys = data[9] & 0x07;
}
} else {
- buttons = ((data[6] & 0x10) << 10) |
- ((data[5] & 0x10) << 9) |
+ buttons = ((data[6] & 0x10) << 5) |
+ ((data[5] & 0x10) << 4) |
((data[6] & 0x0F) << 4) |
(data[5] & 0x0F);
}
@@ -1227,11 +1227,17 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
continue;
if (range) {
+ /* Fix rotation alignment: userspace expects zero at left */
+ int16_t rotation = (int16_t)get_unaligned_le16(&frame[9]);
+ rotation += 1800/4;
+ if (rotation > 899)
+ rotation -= 1800;
+
input_report_abs(pen_input, ABS_X, get_unaligned_le16(&frame[1]));
input_report_abs(pen_input, ABS_Y, get_unaligned_le16(&frame[3]));
- input_report_abs(pen_input, ABS_TILT_X, frame[7]);
- input_report_abs(pen_input, ABS_TILT_Y, frame[8]);
- input_report_abs(pen_input, ABS_Z, get_unaligned_le16(&frame[9]));
+ input_report_abs(pen_input, ABS_TILT_X, (char)frame[7]);
+ input_report_abs(pen_input, ABS_TILT_Y, (char)frame[8]);
+ input_report_abs(pen_input, ABS_Z, rotation);
input_report_abs(pen_input, ABS_WHEEL, get_unaligned_le16(&frame[11]));
}
input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
@@ -1319,12 +1325,19 @@ static void wacom_intuos_pro2_bt_pad(struct wacom_wac *wacom)
unsigned char *data = wacom->data;
int buttons = (data[282] << 1) | ((data[281] >> 6) & 0x01);
- int ring = data[285];
- int prox = buttons | (ring & 0x80);
+ int ring = data[285] & 0x7F;
+ bool ringstatus = data[285] & 0x80;
+ bool prox = buttons || ringstatus;
+
+ /* Fix touchring data: userspace expects 0 at left and increasing clockwise */
+ ring = 71 - ring;
+ ring += 3*72/16;
+ if (ring > 71)
+ ring -= 72;
wacom_report_numbered_buttons(pad_input, 9, buttons);
- input_report_abs(pad_input, ABS_WHEEL, (ring & 0x80) ? (ring & 0x7f) : 0);
+ input_report_abs(pad_input, ABS_WHEEL, ringstatus ? ring : 0);
input_report_key(pad_input, wacom->tool[1], prox ? 1 : 0);
input_report_abs(pad_input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
@@ -1616,6 +1629,20 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
return 0;
}
+static int wacom_offset_rotation(struct input_dev *input, struct hid_usage *usage,
+ int value, int num, int denom)
+{
+ struct input_absinfo *abs = &input->absinfo[usage->code];
+ int range = (abs->maximum - abs->minimum + 1);
+
+ value += num*range/denom;
+ if (value > abs->maximum)
+ value -= range;
+ else if (value < abs->minimum)
+ value += range;
+ return value;
+}
+
int wacom_equivalent_usage(int usage)
{
if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMDIGITIZER) {
@@ -1898,6 +1925,7 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
int i;
bool is_touch_on = value;
+ bool do_report = false;
/*
* Avoid reporting this event and setting inrange_state if this usage
@@ -1912,6 +1940,29 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
}
switch (equivalent_usage) {
+ case WACOM_HID_WD_TOUCHRING:
+ /*
+ * Userspace expects touchrings to increase in value with
+ * clockwise gestures and have their zero point at the
+ * tablet's left. HID events "should" be clockwise-
+ * increasing and zero at top, though the MobileStudio
+ * Pro and 2nd-gen Intuos Pro don't do this...
+ */
+ if (hdev->vendor == 0x56a &&
+ (hdev->product == 0x34d || hdev->product == 0x34e || /* MobileStudio Pro */
+ hdev->product == 0x357 || hdev->product == 0x358)) { /* Intuos Pro 2 */
+ value = (field->logical_maximum - value);
+
+ if (hdev->product == 0x357 || hdev->product == 0x358)
+ value = wacom_offset_rotation(input, usage, value, 3, 16);
+ else if (hdev->product == 0x34d || hdev->product == 0x34e)
+ value = wacom_offset_rotation(input, usage, value, 1, 2);
+ }
+ else {
+ value = wacom_offset_rotation(input, usage, value, 1, 4);
+ }
+ do_report = true;
+ break;
case WACOM_HID_WD_TOUCHRINGSTATUS:
if (!value)
input_event(input, usage->type, usage->code, 0);
@@ -1945,10 +1996,14 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
value, i);
/* fall through*/
default:
+ do_report = true;
+ break;
+ }
+
+ if (do_report) {
input_event(input, usage->type, usage->code, value);
if (value)
wacom_wac->hid_data.pad_input_event_flag = true;
- break;
}
}
@@ -2086,22 +2141,34 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
wacom_wac->hid_data.tipswitch |= value;
return;
case HID_DG_TOOLSERIALNUMBER:
- wacom_wac->serial[0] = (wacom_wac->serial[0] & ~0xFFFFFFFFULL);
- wacom_wac->serial[0] |= (__u32)value;
+ if (value) {
+ wacom_wac->serial[0] = (wacom_wac->serial[0] & ~0xFFFFFFFFULL);
+ wacom_wac->serial[0] |= (__u32)value;
+ }
return;
+ case HID_DG_TWIST:
+ /*
+ * Userspace expects pen twist to have its zero point when
+ * the buttons/finger is on the tablet's left. HID values
+ * are zero when buttons are toward the top.
+ */
+ value = wacom_offset_rotation(input, usage, value, 1, 4);
+ break;
case WACOM_HID_WD_SENSE:
wacom_wac->hid_data.sense_state = value;
return;
case WACOM_HID_WD_SERIALHI:
- wacom_wac->serial[0] = (wacom_wac->serial[0] & 0xFFFFFFFF);
- wacom_wac->serial[0] |= ((__u64)value) << 32;
- /*
- * Non-USI EMR devices may contain additional tool type
- * information here. See WACOM_HID_WD_TOOLTYPE case for
- * more details.
- */
- if (value >> 20 == 1) {
- wacom_wac->id[0] |= value & 0xFFFFF;
+ if (value) {
+ wacom_wac->serial[0] = (wacom_wac->serial[0] & 0xFFFFFFFF);
+ wacom_wac->serial[0] |= ((__u64)value) << 32;
+ /*
+ * Non-USI EMR devices may contain additional tool type
+ * information here. See WACOM_HID_WD_TOOLTYPE case for
+ * more details.
+ */
+ if (value >> 20 == 1) {
+ wacom_wac->id[0] |= value & 0xFFFFF;
+ }
}
return;
case WACOM_HID_WD_TOOLTYPE:
@@ -2205,7 +2272,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
input_report_key(input, wacom_wac->tool[0], prox);
if (wacom_wac->serial[0]) {
input_event(input, EV_MSC, MSC_SERIAL, wacom_wac->serial[0]);
- input_report_abs(input, ABS_MISC, id);
+ input_report_abs(input, ABS_MISC, prox ? id : 0);
}
wacom_wac->hid_data.tipswitch = false;
@@ -2216,6 +2283,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
if (!prox) {
wacom_wac->tool[0] = 0;
wacom_wac->id[0] = 0;
+ wacom_wac->serial[0] = 0;
}
}
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index 060df71c2e8b..bcbb031f7263 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -936,14 +936,10 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
void vmbus_hvsock_device_unregister(struct vmbus_channel *channel)
{
- mutex_lock(&vmbus_connection.channel_mutex);
-
BUG_ON(!is_hvsock_channel(channel));
channel->rescind = true;
vmbus_device_unregister(channel->device_obj);
-
- mutex_unlock(&vmbus_connection.channel_mutex);
}
EXPORT_SYMBOL_GPL(vmbus_hvsock_device_unregister);
diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c
index daa75bd41f86..2364281d8593 100644
--- a/drivers/hv/hv_fcopy.c
+++ b/drivers/hv/hv_fcopy.c
@@ -170,6 +170,10 @@ static void fcopy_send_data(struct work_struct *dummy)
out_src = smsg_out;
break;
+ case WRITE_TO_FILE:
+ out_src = fcopy_transaction.fcopy_msg;
+ out_len = sizeof(struct hv_do_fcopy);
+ break;
default:
out_src = fcopy_transaction.fcopy_msg;
out_len = fcopy_transaction.recv_len;
diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c
index 579bdf93be43..14a94d90c028 100644
--- a/drivers/hwmon/acpi_power_meter.c
+++ b/drivers/hwmon/acpi_power_meter.c
@@ -973,7 +973,7 @@ static int __init enable_cap_knobs(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id __initdata pm_dmi_table[] = {
+static const struct dmi_system_id pm_dmi_table[] __initconst = {
{
enable_cap_knobs, "IBM Active Energy Manager",
{
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
index 76c34f4fde13..5c677ba44014 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
@@ -1247,7 +1247,7 @@ static int applesmc_dmi_match(const struct dmi_system_id *id)
* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
* So we need to put "Apple MacBook Pro" before "Apple MacBook".
*/
-static __initdata struct dmi_system_id applesmc_whitelist[] = {
+static const struct dmi_system_id applesmc_whitelist[] __initconst = {
{ applesmc_dmi_match, "Apple MacBook Air", {
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c
index 3189246302a6..c7c9e95e58a8 100644
--- a/drivers/hwmon/dell-smm-hwmon.c
+++ b/drivers/hwmon/dell-smm-hwmon.c
@@ -890,7 +890,7 @@ static const struct i8k_config_data i8k_config_data[] = {
},
};
-static struct dmi_system_id i8k_dmi_table[] __initdata = {
+static const struct dmi_system_id i8k_dmi_table[] __initconst = {
{
.ident = "Dell Inspiron",
.matches = {
@@ -1013,7 +1013,7 @@ MODULE_DEVICE_TABLE(dmi, i8k_dmi_table);
* of affected Dell machines for which we disallow I8K_SMM_GET_FAN_TYPE call.
* See bug: https://bugzilla.kernel.org/show_bug.cgi?id=100121
*/
-static struct dmi_system_id i8k_blacklist_fan_type_dmi_table[] __initdata = {
+static const struct dmi_system_id i8k_blacklist_fan_type_dmi_table[] __initconst = {
{
.ident = "Dell Studio XPS 8000",
.matches = {
diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c
index bc9cebc30526..c2a2ce8ee541 100644
--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -144,6 +144,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
.driver_data = (kernel_ulong_t)0,
},
{
+ /* Lewisburg PCH */
+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa1a6),
+ .driver_data = (kernel_ulong_t)0,
+ },
+ {
/* Gemini Lake */
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e),
.driver_data = (kernel_ulong_t)&intel_th_2x,
@@ -158,6 +163,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6),
.driver_data = (kernel_ulong_t)&intel_th_2x,
},
+ {
+ /* Cedar Fork PCH */
+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1),
+ .driver_data = (kernel_ulong_t)&intel_th_2x,
+ },
{ 0 },
};
diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c
index 9414900575d8..f129869e05a9 100644
--- a/drivers/hwtracing/stm/core.c
+++ b/drivers/hwtracing/stm/core.c
@@ -1119,7 +1119,7 @@ void stm_source_unregister_device(struct stm_source_data *data)
stm_source_link_drop(src);
- device_destroy(&stm_source_class, src->dev.devt);
+ device_unregister(&src->dev);
}
EXPORT_SYMBOL_GPL(stm_source_unregister_device);
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 65fa29591d21..c06dce2c1da7 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -189,6 +189,14 @@ config I2C_PIIX4
This driver can also be built as a module. If so, the module
will be called i2c-piix4.
+config I2C_CHT_WC
+ tristate "Intel Cherry Trail Whiskey Cove PMIC smbus controller"
+ depends on INTEL_SOC_PMIC_CHTWC
+ help
+ If you say yes to this option, support will be included for the
+ SMBus controller found in the Intel Cherry Trail Whiskey Cove PMIC
+ found on some Intel Cherry Trail systems.
+
config I2C_NFORCE2
tristate "Nvidia nForce2, nForce3 and nForce4"
depends on PCI
@@ -328,6 +336,16 @@ config I2C_POWERMAC
comment "I2C system bus drivers (mostly embedded / system-on-chip)"
+config I2C_ALTERA
+ tristate "Altera Soft IP I2C"
+ depends on (ARCH_SOCFPGA || NIOS2) && OF
+ help
+ If you say yes to this option, support will be included for the
+ Altera Soft IP I2C interfaces on SoCFPGA and Nios2 architectures.
+
+ This driver can also be built as a module. If so, the module
+ will be called i2c-altera.
+
config I2C_ASPEED
tristate "Aspeed I2C Controller"
depends on ARCH_ASPEED || COMPILE_TEST
@@ -900,6 +918,13 @@ config I2C_SIRF
This driver can also be built as a module. If so, the module
will be called i2c-sirf.
+config I2C_SPRD
+ bool "Spreadtrum I2C interface"
+ depends on I2C=y && ARCH_SPRD
+ help
+ If you say yes to this option, support will be included for the
+ Spreadtrum I2C interface.
+
config I2C_ST
tristate "STMicroelectronics SSC I2C support"
depends on ARCH_STI
@@ -920,6 +945,16 @@ config I2C_STM32F4
This driver can also be built as module. If so, the module
will be called i2c-stm32f4.
+config I2C_STM32F7
+ tristate "STMicroelectronics STM32F7 I2C support"
+ depends on ARCH_STM32 || COMPILE_TEST
+ help
+ Enable this option to add support for STM32 I2C controller embedded
+ in STM32F7 SoCs.
+
+ This driver can also be built as module. If so, the module
+ will be called i2c-stm32f7.
+
config I2C_STU300
tristate "ST Microelectronics DDC I2C interface"
depends on MACH_U300
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 1b2fc815a4d8..47f3ac9a695a 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.o
obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o
obj-$(CONFIG_I2C_AMD756_S4882) += i2c-amd756-s4882.o
obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o
+obj-$(CONFIG_I2C_CHT_WC) += i2c-cht-wc.o
obj-$(CONFIG_I2C_I801) += i2c-i801.o
obj-$(CONFIG_I2C_ISCH) += i2c-isch.o
obj-$(CONFIG_I2C_ISMT) += i2c-ismt.o
@@ -29,6 +30,7 @@ obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o
obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o
# Embedded system I2C/SMBus host controller drivers
+obj-$(CONFIG_I2C_ALTERA) += i2c-altera.o
obj-$(CONFIG_I2C_ASPEED) += i2c-aspeed.o
obj-$(CONFIG_I2C_AT91) += i2c-at91.o
obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
@@ -89,8 +91,10 @@ obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o
obj-$(CONFIG_I2C_SH_MOBILE) += i2c-sh_mobile.o
obj-$(CONFIG_I2C_SIMTEC) += i2c-simtec.o
obj-$(CONFIG_I2C_SIRF) += i2c-sirf.o
+obj-$(CONFIG_I2C_SPRD) += i2c-sprd.o
obj-$(CONFIG_I2C_ST) += i2c-st.o
obj-$(CONFIG_I2C_STM32F4) += i2c-stm32f4.o
+obj-$(CONFIG_I2C_STM32F7) += i2c-stm32f7.o
obj-$(CONFIG_I2C_STU300) += i2c-stu300.o
obj-$(CONFIG_I2C_SUN6I_P2WI) += i2c-sun6i-p2wi.o
obj-$(CONFIG_I2C_TEGRA) += i2c-tegra.o
diff --git a/drivers/i2c/busses/i2c-altera.c b/drivers/i2c/busses/i2c-altera.c
new file mode 100644
index 000000000000..f5e1941e65b5
--- /dev/null
+++ b/drivers/i2c/busses/i2c-altera.c
@@ -0,0 +1,511 @@
+/*
+ * Copyright Intel Corporation (C) 2017.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Based on the i2c-axxia.c driver.
+ */
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/iopoll.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+
+#define ALTR_I2C_TFR_CMD 0x00 /* Transfer Command register */
+#define ALTR_I2C_TFR_CMD_STA BIT(9) /* send START before byte */
+#define ALTR_I2C_TFR_CMD_STO BIT(8) /* send STOP after byte */
+#define ALTR_I2C_TFR_CMD_RW_D BIT(0) /* Direction of transfer */
+#define ALTR_I2C_RX_DATA 0x04 /* RX data FIFO register */
+#define ALTR_I2C_CTRL 0x08 /* Control register */
+#define ALTR_I2C_CTRL_RXT_SHFT 4 /* RX FIFO Threshold */
+#define ALTR_I2C_CTRL_TCT_SHFT 2 /* TFER CMD FIFO Threshold */
+#define ALTR_I2C_CTRL_BSPEED BIT(1) /* Bus Speed (1=Fast) */
+#define ALTR_I2C_CTRL_EN BIT(0) /* Enable Core (1=Enable) */
+#define ALTR_I2C_ISER 0x0C /* Interrupt Status Enable register */
+#define ALTR_I2C_ISER_RXOF_EN BIT(4) /* Enable RX OVERFLOW IRQ */
+#define ALTR_I2C_ISER_ARB_EN BIT(3) /* Enable ARB LOST IRQ */
+#define ALTR_I2C_ISER_NACK_EN BIT(2) /* Enable NACK DET IRQ */
+#define ALTR_I2C_ISER_RXRDY_EN BIT(1) /* Enable RX Ready IRQ */
+#define ALTR_I2C_ISER_TXRDY_EN BIT(0) /* Enable TX Ready IRQ */
+#define ALTR_I2C_ISR 0x10 /* Interrupt Status register */
+#define ALTR_I2C_ISR_RXOF BIT(4) /* RX OVERFLOW IRQ */
+#define ALTR_I2C_ISR_ARB BIT(3) /* ARB LOST IRQ */
+#define ALTR_I2C_ISR_NACK BIT(2) /* NACK DET IRQ */
+#define ALTR_I2C_ISR_RXRDY BIT(1) /* RX Ready IRQ */
+#define ALTR_I2C_ISR_TXRDY BIT(0) /* TX Ready IRQ */
+#define ALTR_I2C_STATUS 0x14 /* Status register */
+#define ALTR_I2C_STAT_CORE BIT(0) /* Core Status (0=idle) */
+#define ALTR_I2C_TC_FIFO_LVL 0x18 /* Transfer FIFO LVL register */
+#define ALTR_I2C_RX_FIFO_LVL 0x1C /* Receive FIFO LVL register */
+#define ALTR_I2C_SCL_LOW 0x20 /* SCL low count register */
+#define ALTR_I2C_SCL_HIGH 0x24 /* SCL high count register */
+#define ALTR_I2C_SDA_HOLD 0x28 /* SDA hold count register */
+
+#define ALTR_I2C_ALL_IRQ (ALTR_I2C_ISR_RXOF | ALTR_I2C_ISR_ARB | \
+ ALTR_I2C_ISR_NACK | ALTR_I2C_ISR_RXRDY | \
+ ALTR_I2C_ISR_TXRDY)
+
+#define ALTR_I2C_THRESHOLD 0 /* IRQ Threshold at 1 element */
+#define ALTR_I2C_DFLT_FIFO_SZ 4
+#define ALTR_I2C_TIMEOUT 100000 /* 100ms */
+#define ALTR_I2C_XFER_TIMEOUT (msecs_to_jiffies(250))
+
+/**
+ * altr_i2c_dev - I2C device context
+ * @base: pointer to register struct
+ * @msg: pointer to current message
+ * @msg_len: number of bytes transferred in msg
+ * @msg_err: error code for completed message
+ * @msg_complete: xfer completion object
+ * @dev: device reference
+ * @adapter: core i2c abstraction
+ * @i2c_clk: clock reference for i2c input clock
+ * @bus_clk_rate: current i2c bus clock rate
+ * @buf: ptr to msg buffer for easier use.
+ * @fifo_size: size of the FIFO passed in.
+ * @isr_mask: cached copy of local ISR enables.
+ * @isr_status: cached copy of local ISR status.
+ * @lock: spinlock for IRQ synchronization.
+ */
+struct altr_i2c_dev {
+ void __iomem *base;
+ struct i2c_msg *msg;
+ size_t msg_len;
+ int msg_err;
+ struct completion msg_complete;
+ struct device *dev;
+ struct i2c_adapter adapter;
+ struct clk *i2c_clk;
+ u32 bus_clk_rate;
+ u8 *buf;
+ u32 fifo_size;
+ u32 isr_mask;
+ u32 isr_status;
+ spinlock_t lock; /* IRQ synchronization */
+};
+
+static void
+altr_i2c_int_enable(struct altr_i2c_dev *idev, u32 mask, bool enable)
+{
+ unsigned long flags;
+ u32 int_en;
+
+ spin_lock_irqsave(&idev->lock, flags);
+
+ int_en = readl(idev->base + ALTR_I2C_ISER);
+ if (enable)
+ idev->isr_mask = int_en | mask;
+ else
+ idev->isr_mask = int_en & ~mask;
+
+ writel(idev->isr_mask, idev->base + ALTR_I2C_ISER);
+
+ spin_unlock_irqrestore(&idev->lock, flags);
+}
+
+static void altr_i2c_int_clear(struct altr_i2c_dev *idev, u32 mask)
+{
+ u32 int_en = readl(idev->base + ALTR_I2C_ISR);
+
+ writel(int_en | mask, idev->base + ALTR_I2C_ISR);
+}
+
+static void altr_i2c_core_disable(struct altr_i2c_dev *idev)
+{
+ u32 tmp = readl(idev->base + ALTR_I2C_CTRL);
+
+ writel(tmp & ~ALTR_I2C_CTRL_EN, idev->base + ALTR_I2C_CTRL);
+}
+
+static void altr_i2c_core_enable(struct altr_i2c_dev *idev)
+{
+ u32 tmp = readl(idev->base + ALTR_I2C_CTRL);
+
+ writel(tmp | ALTR_I2C_CTRL_EN, idev->base + ALTR_I2C_CTRL);
+}
+
+static void altr_i2c_reset(struct altr_i2c_dev *idev)
+{
+ altr_i2c_core_disable(idev);
+ altr_i2c_core_enable(idev);
+}
+
+static inline void altr_i2c_stop(struct altr_i2c_dev *idev)
+{
+ writel(ALTR_I2C_TFR_CMD_STO, idev->base + ALTR_I2C_TFR_CMD);
+}
+
+static void altr_i2c_init(struct altr_i2c_dev *idev)
+{
+ u32 divisor = clk_get_rate(idev->i2c_clk) / idev->bus_clk_rate;
+ u32 clk_mhz = clk_get_rate(idev->i2c_clk) / 1000000;
+ u32 tmp = (ALTR_I2C_THRESHOLD << ALTR_I2C_CTRL_RXT_SHFT) |
+ (ALTR_I2C_THRESHOLD << ALTR_I2C_CTRL_TCT_SHFT);
+ u32 t_high, t_low;
+
+ if (idev->bus_clk_rate <= 100000) {
+ tmp &= ~ALTR_I2C_CTRL_BSPEED;
+ /* Standard mode SCL 50/50 */
+ t_high = divisor * 1 / 2;
+ t_low = divisor * 1 / 2;
+ } else {
+ tmp |= ALTR_I2C_CTRL_BSPEED;
+ /* Fast mode SCL 33/66 */
+ t_high = divisor * 1 / 3;
+ t_low = divisor * 2 / 3;
+ }
+ writel(tmp, idev->base + ALTR_I2C_CTRL);
+
+ dev_dbg(idev->dev, "rate=%uHz per_clk=%uMHz -> ratio=1:%u\n",
+ idev->bus_clk_rate, clk_mhz, divisor);
+
+ /* Reset controller */
+ altr_i2c_reset(idev);
+
+ /* SCL High Time */
+ writel(t_high, idev->base + ALTR_I2C_SCL_HIGH);
+ /* SCL Low Time */
+ writel(t_low, idev->base + ALTR_I2C_SCL_LOW);
+ /* SDA Hold Time, 300ns */
+ writel(div_u64(300 * clk_mhz, 1000), idev->base + ALTR_I2C_SDA_HOLD);
+
+ /* Mask all master interrupt bits */
+ altr_i2c_int_enable(idev, ALTR_I2C_ALL_IRQ, false);
+}
+
+/**
+ * altr_i2c_transfer - On the last byte to be transmitted, send
+ * a Stop bit on the last byte.
+ */
+static void altr_i2c_transfer(struct altr_i2c_dev *idev, u32 data)
+{
+ /* On the last byte to be transmitted, send STOP */
+ if (idev->msg_len == 1)
+ data |= ALTR_I2C_TFR_CMD_STO;
+ if (idev->msg_len > 0)
+ writel(data, idev->base + ALTR_I2C_TFR_CMD);
+}
+
+/**
+ * altr_i2c_empty_rx_fifo - Fetch data from RX FIFO until end of
+ * transfer. Send a Stop bit on the last byte.
+ */
+static void altr_i2c_empty_rx_fifo(struct altr_i2c_dev *idev)
+{
+ size_t rx_fifo_avail = readl(idev->base + ALTR_I2C_RX_FIFO_LVL);
+ int bytes_to_transfer = min(rx_fifo_avail, idev->msg_len);
+
+ while (bytes_to_transfer-- > 0) {
+ *idev->buf++ = readl(idev->base + ALTR_I2C_RX_DATA);
+ idev->msg_len--;
+ altr_i2c_transfer(idev, 0);
+ }
+}
+
+/**
+ * altr_i2c_fill_tx_fifo - Fill TX FIFO from current message buffer.
+ * @return: Number of bytes left to transfer.
+ */
+static int altr_i2c_fill_tx_fifo(struct altr_i2c_dev *idev)
+{
+ size_t tx_fifo_avail = idev->fifo_size - readl(idev->base +
+ ALTR_I2C_TC_FIFO_LVL);
+ int bytes_to_transfer = min(tx_fifo_avail, idev->msg_len);
+ int ret = idev->msg_len - bytes_to_transfer;
+
+ while (bytes_to_transfer-- > 0) {
+ altr_i2c_transfer(idev, *idev->buf++);
+ idev->msg_len--;
+ }
+
+ return ret;
+}
+
+static irqreturn_t altr_i2c_isr_quick(int irq, void *_dev)
+{
+ struct altr_i2c_dev *idev = _dev;
+ irqreturn_t ret = IRQ_HANDLED;
+
+ /* Read IRQ status but only interested in Enabled IRQs. */
+ idev->isr_status = readl(idev->base + ALTR_I2C_ISR) & idev->isr_mask;
+ if (idev->isr_status)
+ ret = IRQ_WAKE_THREAD;
+
+ return ret;
+}
+
+static irqreturn_t altr_i2c_isr(int irq, void *_dev)
+{
+ int ret;
+ bool read, finish = false;
+ struct altr_i2c_dev *idev = _dev;
+ u32 status = idev->isr_status;
+
+ if (!idev->msg) {
+ dev_warn(idev->dev, "unexpected interrupt\n");
+ altr_i2c_int_clear(idev, ALTR_I2C_ALL_IRQ);
+ return IRQ_HANDLED;
+ }
+ read = (idev->msg->flags & I2C_M_RD) != 0;
+
+ /* handle Lost Arbitration */
+ if (unlikely(status & ALTR_I2C_ISR_ARB)) {
+ altr_i2c_int_clear(idev, ALTR_I2C_ISR_ARB);
+ idev->msg_err = -EAGAIN;
+ finish = true;
+ } else if (unlikely(status & ALTR_I2C_ISR_NACK)) {
+ dev_dbg(idev->dev, "Could not get ACK\n");
+ idev->msg_err = -ENXIO;
+ altr_i2c_int_clear(idev, ALTR_I2C_ISR_NACK);
+ altr_i2c_stop(idev);
+ finish = true;
+ } else if (read && unlikely(status & ALTR_I2C_ISR_RXOF)) {
+ /* handle RX FIFO Overflow */
+ altr_i2c_empty_rx_fifo(idev);
+ altr_i2c_int_clear(idev, ALTR_I2C_ISR_RXRDY);
+ altr_i2c_stop(idev);
+ dev_err(idev->dev, "RX FIFO Overflow\n");
+ finish = true;
+ } else if (read && (status & ALTR_I2C_ISR_RXRDY)) {
+ /* RX FIFO needs service? */
+ altr_i2c_empty_rx_fifo(idev);
+ altr_i2c_int_clear(idev, ALTR_I2C_ISR_RXRDY);
+ if (!idev->msg_len)
+ finish = true;
+ } else if (!read && (status & ALTR_I2C_ISR_TXRDY)) {
+ /* TX FIFO needs service? */
+ altr_i2c_int_clear(idev, ALTR_I2C_ISR_TXRDY);
+ if (idev->msg_len > 0)
+ altr_i2c_fill_tx_fifo(idev);
+ else
+ finish = true;
+ } else {
+ dev_warn(idev->dev, "Unexpected interrupt: 0x%x\n", status);
+ altr_i2c_int_clear(idev, ALTR_I2C_ALL_IRQ);
+ }
+
+ if (finish) {
+ /* Wait for the Core to finish */
+ ret = readl_poll_timeout_atomic(idev->base + ALTR_I2C_STATUS,
+ status,
+ !(status & ALTR_I2C_STAT_CORE),
+ 1, ALTR_I2C_TIMEOUT);
+ if (ret)
+ dev_err(idev->dev, "message timeout\n");
+ altr_i2c_int_enable(idev, ALTR_I2C_ALL_IRQ, false);
+ altr_i2c_int_clear(idev, ALTR_I2C_ALL_IRQ);
+ complete(&idev->msg_complete);
+ dev_dbg(idev->dev, "Message Complete\n");
+ }
+
+ return IRQ_HANDLED;
+}
+
+static int altr_i2c_xfer_msg(struct altr_i2c_dev *idev, struct i2c_msg *msg)
+{
+ u32 imask = ALTR_I2C_ISR_RXOF | ALTR_I2C_ISR_ARB | ALTR_I2C_ISR_NACK;
+ unsigned long time_left;
+ u32 value;
+ u8 addr = i2c_8bit_addr_from_msg(msg);
+
+ idev->msg = msg;
+ idev->msg_len = msg->len;
+ idev->buf = msg->buf;
+ idev->msg_err = 0;
+ reinit_completion(&idev->msg_complete);
+ altr_i2c_core_enable(idev);
+
+ /* Make sure RX FIFO is empty */
+ do {
+ readl(idev->base + ALTR_I2C_RX_DATA);
+ } while (readl(idev->base + ALTR_I2C_RX_FIFO_LVL));
+
+ writel(ALTR_I2C_TFR_CMD_STA | addr, idev->base + ALTR_I2C_TFR_CMD);
+
+ if ((msg->flags & I2C_M_RD) != 0) {
+ imask |= ALTR_I2C_ISER_RXOF_EN | ALTR_I2C_ISER_RXRDY_EN;
+ altr_i2c_int_enable(idev, imask, true);
+ /* write the first byte to start the RX */
+ altr_i2c_transfer(idev, 0);
+ } else {
+ imask |= ALTR_I2C_ISR_TXRDY;
+ altr_i2c_int_enable(idev, imask, true);
+ altr_i2c_fill_tx_fifo(idev);
+ }
+
+ time_left = wait_for_completion_timeout(&idev->msg_complete,
+ ALTR_I2C_XFER_TIMEOUT);
+ altr_i2c_int_enable(idev, imask, false);
+
+ value = readl(idev->base + ALTR_I2C_STATUS) & ALTR_I2C_STAT_CORE;
+ if (value)
+ dev_err(idev->dev, "Core Status not IDLE...\n");
+
+ if (time_left == 0) {
+ idev->msg_err = -ETIMEDOUT;
+ dev_dbg(idev->dev, "Transaction timed out.\n");
+ }
+
+ altr_i2c_core_disable(idev);
+
+ return idev->msg_err;
+}
+
+static int
+altr_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+{
+ struct altr_i2c_dev *idev = i2c_get_adapdata(adap);
+ int i, ret;
+
+ for (i = 0; i < num; i++) {
+ ret = altr_i2c_xfer_msg(idev, msgs++);
+ if (ret)
+ return ret;
+ }
+ return num;
+}
+
+static u32 altr_i2c_func(struct i2c_adapter *adap)
+{
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static const struct i2c_algorithm altr_i2c_algo = {
+ .master_xfer = altr_i2c_xfer,
+ .functionality = altr_i2c_func,
+};
+
+static int altr_i2c_probe(struct platform_device *pdev)
+{
+ struct altr_i2c_dev *idev = NULL;
+ struct resource *res;
+ int irq, ret;
+ u32 val;
+
+ idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
+ if (!idev)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ idev->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(idev->base))
+ return PTR_ERR(idev->base);
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "missing interrupt resource\n");
+ return irq;
+ }
+
+ idev->i2c_clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(idev->i2c_clk)) {
+ dev_err(&pdev->dev, "missing clock\n");
+ return PTR_ERR(idev->i2c_clk);
+ }
+
+ idev->dev = &pdev->dev;
+ init_completion(&idev->msg_complete);
+ spin_lock_init(&idev->lock);
+
+ val = device_property_read_u32(idev->dev, "fifo-size",
+ &idev->fifo_size);
+ if (val) {
+ dev_err(&pdev->dev, "FIFO size set to default of %d\n",
+ ALTR_I2C_DFLT_FIFO_SZ);
+ idev->fifo_size = ALTR_I2C_DFLT_FIFO_SZ;
+ }
+
+ val = device_property_read_u32(idev->dev, "clock-frequency",
+ &idev->bus_clk_rate);
+ if (val) {
+ dev_err(&pdev->dev, "Default to 100kHz\n");
+ idev->bus_clk_rate = 100000; /* default clock rate */
+ }
+
+ if (idev->bus_clk_rate > 400000) {
+ dev_err(&pdev->dev, "invalid clock-frequency %d\n",
+ idev->bus_clk_rate);
+ return -EINVAL;
+ }
+
+ ret = devm_request_threaded_irq(&pdev->dev, irq, altr_i2c_isr_quick,
+ altr_i2c_isr, IRQF_ONESHOT,
+ pdev->name, idev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to claim IRQ %d\n", irq);
+ return ret;
+ }
+
+ ret = clk_prepare_enable(idev->i2c_clk);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to enable clock\n");
+ return ret;
+ }
+
+ altr_i2c_init(idev);
+
+ i2c_set_adapdata(&idev->adapter, idev);
+ strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name));
+ idev->adapter.owner = THIS_MODULE;
+ idev->adapter.algo = &altr_i2c_algo;
+ idev->adapter.dev.parent = &pdev->dev;
+ idev->adapter.dev.of_node = pdev->dev.of_node;
+
+ platform_set_drvdata(pdev, idev);
+
+ ret = i2c_add_adapter(&idev->adapter);
+ if (ret) {
+ clk_disable_unprepare(idev->i2c_clk);
+ return ret;
+ }
+ dev_info(&pdev->dev, "Altera SoftIP I2C Probe Complete\n");
+
+ return 0;
+}
+
+static int altr_i2c_remove(struct platform_device *pdev)
+{
+ struct altr_i2c_dev *idev = platform_get_drvdata(pdev);
+
+ clk_disable_unprepare(idev->i2c_clk);
+ i2c_del_adapter(&idev->adapter);
+
+ return 0;
+}
+
+/* Match table for of_platform binding */
+static const struct of_device_id altr_i2c_of_match[] = {
+ { .compatible = "altr,softip-i2c-v1.0" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, altr_i2c_of_match);
+
+static struct platform_driver altr_i2c_driver = {
+ .probe = altr_i2c_probe,
+ .remove = altr_i2c_remove,
+ .driver = {
+ .name = "altera-i2c",
+ .of_match_table = altr_i2c_of_match,
+ },
+};
+
+module_platform_driver(altr_i2c_driver);
+
+MODULE_DESCRIPTION("Altera Soft IP I2C bus driver");
+MODULE_AUTHOR("Thor Thayer <[email protected]>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c
index 6fdf9231c23c..284f8670dbeb 100644
--- a/drivers/i2c/busses/i2c-aspeed.c
+++ b/drivers/i2c/busses/i2c-aspeed.c
@@ -53,6 +53,9 @@
#define ASPEED_I2CD_MASTER_EN BIT(0)
/* 0x04 : I2CD Clock and AC Timing Control Register #1 */
+#define ASPEED_I2CD_TIME_TBUF_MASK GENMASK(31, 28)
+#define ASPEED_I2CD_TIME_THDSTA_MASK GENMASK(27, 24)
+#define ASPEED_I2CD_TIME_TACST_MASK GENMASK(23, 20)
#define ASPEED_I2CD_TIME_SCL_HIGH_SHIFT 16
#define ASPEED_I2CD_TIME_SCL_HIGH_MASK GENMASK(19, 16)
#define ASPEED_I2CD_TIME_SCL_LOW_SHIFT 12
@@ -132,6 +135,7 @@ struct aspeed_i2c_bus {
/* Synchronizes I/O mem access to base. */
spinlock_t lock;
struct completion cmd_complete;
+ u32 (*get_clk_reg_val)(u32 divisor);
unsigned long parent_clk_frequency;
u32 bus_frequency;
/* Transaction state. */
@@ -675,7 +679,7 @@ static const struct i2c_algorithm aspeed_i2c_algo = {
#endif /* CONFIG_I2C_SLAVE */
};
-static u32 aspeed_i2c_get_clk_reg_val(u32 divisor)
+static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor)
{
u32 base_clk, clk_high, clk_low, tmp;
@@ -695,16 +699,22 @@ static u32 aspeed_i2c_get_clk_reg_val(u32 divisor)
* Thus,
* SCL_freq = APB_freq /
* ((1 << base_clk) * (clk_high + 1 + clk_low + 1))
- * The documentation recommends clk_high >= 8 and clk_low >= 7 when
- * possible; this last constraint gives us the following solution:
+ * The documentation recommends clk_high >= clk_high_max / 2 and
+ * clk_low >= clk_low_max / 2 - 1 when possible; this last constraint
+ * gives us the following solution:
*/
- base_clk = divisor > 33 ? ilog2((divisor - 1) / 32) + 1 : 0;
- tmp = divisor / (1 << base_clk);
- clk_high = tmp / 2 + tmp % 2;
- clk_low = tmp - clk_high;
+ base_clk = divisor > clk_high_low_max ?
+ ilog2((divisor - 1) / clk_high_low_max) + 1 : 0;
+ tmp = (divisor + (1 << base_clk) - 1) >> base_clk;
+ clk_low = tmp / 2;
+ clk_high = tmp - clk_low;
+
+ if (clk_high)
+ clk_high--;
+
+ if (clk_low)
+ clk_low--;
- clk_high -= 1;
- clk_low -= 1;
return ((clk_high << ASPEED_I2CD_TIME_SCL_HIGH_SHIFT)
& ASPEED_I2CD_TIME_SCL_HIGH_MASK)
@@ -713,13 +723,35 @@ static u32 aspeed_i2c_get_clk_reg_val(u32 divisor)
| (base_clk & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK);
}
+static u32 aspeed_i2c_24xx_get_clk_reg_val(u32 divisor)
+{
+ /*
+ * clk_high and clk_low are each 3 bits wide, so each can hold a max
+ * value of 8 giving a clk_high_low_max of 16.
+ */
+ return aspeed_i2c_get_clk_reg_val(16, divisor);
+}
+
+static u32 aspeed_i2c_25xx_get_clk_reg_val(u32 divisor)
+{
+ /*
+ * clk_high and clk_low are each 4 bits wide, so each can hold a max
+ * value of 16 giving a clk_high_low_max of 32.
+ */
+ return aspeed_i2c_get_clk_reg_val(32, divisor);
+}
+
/* precondition: bus.lock has been acquired. */
static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus)
{
u32 divisor, clk_reg_val;
- divisor = bus->parent_clk_frequency / bus->bus_frequency;
- clk_reg_val = aspeed_i2c_get_clk_reg_val(divisor);
+ divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency);
+ clk_reg_val = readl(bus->base + ASPEED_I2C_AC_TIMING_REG1);
+ clk_reg_val &= (ASPEED_I2CD_TIME_TBUF_MASK |
+ ASPEED_I2CD_TIME_THDSTA_MASK |
+ ASPEED_I2CD_TIME_TACST_MASK);
+ clk_reg_val |= bus->get_clk_reg_val(divisor);
writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1);
writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2);
@@ -778,8 +810,22 @@ static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus)
return ret;
}
+static const struct of_device_id aspeed_i2c_bus_of_table[] = {
+ {
+ .compatible = "aspeed,ast2400-i2c-bus",
+ .data = aspeed_i2c_24xx_get_clk_reg_val,
+ },
+ {
+ .compatible = "aspeed,ast2500-i2c-bus",
+ .data = aspeed_i2c_25xx_get_clk_reg_val,
+ },
+ { },
+};
+MODULE_DEVICE_TABLE(of, aspeed_i2c_bus_of_table);
+
static int aspeed_i2c_probe_bus(struct platform_device *pdev)
{
+ const struct of_device_id *match;
struct aspeed_i2c_bus *bus;
struct clk *parent_clk;
struct resource *res;
@@ -809,6 +855,12 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev)
bus->bus_frequency = 100000;
}
+ match = of_match_node(aspeed_i2c_bus_of_table, pdev->dev.of_node);
+ if (!match)
+ bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val;
+ else
+ bus->get_clk_reg_val = match->data;
+
/* Initialize the I2C adapter */
spin_lock_init(&bus->lock);
init_completion(&bus->cmd_complete);
@@ -870,13 +922,6 @@ static int aspeed_i2c_remove_bus(struct platform_device *pdev)
return 0;
}
-static const struct of_device_id aspeed_i2c_bus_of_table[] = {
- { .compatible = "aspeed,ast2400-i2c-bus", },
- { .compatible = "aspeed,ast2500-i2c-bus", },
- { },
-};
-MODULE_DEVICE_TABLE(of, aspeed_i2c_bus_of_table);
-
static struct platform_driver aspeed_i2c_bus_driver = {
.probe = aspeed_i2c_probe_bus,
.remove = aspeed_i2c_remove_bus,
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index 38dd61d621df..bfd1fdff64a9 100644
--- a/drivers/i2c/busses/i2c-at91.c
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -809,7 +809,7 @@ out:
* The hardware can handle at most two messages concatenated by a
* repeated start via it's internal address feature.
*/
-static struct i2c_adapter_quirks at91_twi_quirks = {
+static const struct i2c_adapter_quirks at91_twi_quirks = {
.flags = I2C_AQ_COMB | I2C_AQ_COMB_WRITE_FIRST | I2C_AQ_COMB_SAME_ADDR,
.max_comb_1st_msg_len = 3,
};
diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c
index 318df559adc5..4c8c3bc4669c 100644
--- a/drivers/i2c/busses/i2c-bcm-iproc.c
+++ b/drivers/i2c/busses/i2c-bcm-iproc.c
@@ -510,8 +510,7 @@ static int bcm_iproc_i2c_remove(struct platform_device *pdev)
static int bcm_iproc_i2c_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct bcm_iproc_i2c_dev *iproc_i2c = platform_get_drvdata(pdev);
+ struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev);
/* make sure there's no pending interrupt when we go into suspend */
writel(0, iproc_i2c->base + IE_OFFSET);
@@ -526,8 +525,7 @@ static int bcm_iproc_i2c_suspend(struct device *dev)
static int bcm_iproc_i2c_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct bcm_iproc_i2c_dev *iproc_i2c = platform_get_drvdata(pdev);
+ struct bcm_iproc_i2c_dev *iproc_i2c = dev_get_drvdata(dev);
int ret;
u32 val;
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
index 9fe942b8c610..ff3343186a82 100644
--- a/drivers/i2c/busses/i2c-bfin-twi.c
+++ b/drivers/i2c/busses/i2c-bfin-twi.c
@@ -21,7 +21,6 @@
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
-#include <linux/i2c/bfin_twi.h>
#include <asm/irq.h>
#include <asm/portmux.h>
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c
index 75d80161931f..b13605718291 100644
--- a/drivers/i2c/busses/i2c-cadence.c
+++ b/drivers/i2c/busses/i2c-cadence.c
@@ -826,8 +826,7 @@ static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long
*/
static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct cdns_i2c *xi2c = platform_get_drvdata(pdev);
+ struct cdns_i2c *xi2c = dev_get_drvdata(dev);
clk_disable(xi2c->clk);
@@ -844,8 +843,7 @@ static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev)
*/
static int __maybe_unused cdns_i2c_runtime_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct cdns_i2c *xi2c = platform_get_drvdata(pdev);
+ struct cdns_i2c *xi2c = dev_get_drvdata(dev);
int ret;
ret = clk_enable(xi2c->clk);
diff --git a/drivers/i2c/busses/i2c-cht-wc.c b/drivers/i2c/busses/i2c-cht-wc.c
new file mode 100644
index 000000000000..190bbbc7bfee
--- /dev/null
+++ b/drivers/i2c/busses/i2c-cht-wc.c
@@ -0,0 +1,363 @@
+/*
+ * Intel CHT Whiskey Cove PMIC I2C Master driver
+ * Copyright (C) 2017 Hans de Goede <[email protected]>
+ *
+ * Based on various non upstream patches to support the CHT Whiskey Cove PMIC:
+ * Copyright (C) 2011 - 2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/completion.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/mfd/intel_soc_pmic.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#define CHT_WC_I2C_CTRL 0x5e24
+#define CHT_WC_I2C_CTRL_WR BIT(0)
+#define CHT_WC_I2C_CTRL_RD BIT(1)
+#define CHT_WC_I2C_CLIENT_ADDR 0x5e25
+#define CHT_WC_I2C_REG_OFFSET 0x5e26
+#define CHT_WC_I2C_WRDATA 0x5e27
+#define CHT_WC_I2C_RDDATA 0x5e28
+
+#define CHT_WC_EXTCHGRIRQ 0x6e0a
+#define CHT_WC_EXTCHGRIRQ_CLIENT_IRQ BIT(0)
+#define CHT_WC_EXTCHGRIRQ_WRITE_IRQ BIT(1)
+#define CHT_WC_EXTCHGRIRQ_READ_IRQ BIT(2)
+#define CHT_WC_EXTCHGRIRQ_NACK_IRQ BIT(3)
+#define CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK ((u8)GENMASK(3, 1))
+#define CHT_WC_EXTCHGRIRQ_MSK 0x6e17
+
+struct cht_wc_i2c_adap {
+ struct i2c_adapter adapter;
+ wait_queue_head_t wait;
+ struct irq_chip irqchip;
+ struct mutex adap_lock;
+ struct mutex irqchip_lock;
+ struct regmap *regmap;
+ struct irq_domain *irq_domain;
+ struct i2c_client *client;
+ int client_irq;
+ u8 irq_mask;
+ u8 old_irq_mask;
+ int read_data;
+ bool io_error;
+ bool done;
+};
+
+static irqreturn_t cht_wc_i2c_adap_thread_handler(int id, void *data)
+{
+ struct cht_wc_i2c_adap *adap = data;
+ int ret, reg;
+
+ mutex_lock(&adap->adap_lock);
+
+ /* Read IRQs */
+ ret = regmap_read(adap->regmap, CHT_WC_EXTCHGRIRQ, &reg);
+ if (ret) {
+ dev_err(&adap->adapter.dev, "Error reading extchgrirq reg\n");
+ mutex_unlock(&adap->adap_lock);
+ return IRQ_NONE;
+ }
+
+ reg &= ~adap->irq_mask;
+
+ /* Reads must be acked after reading the received data. */
+ ret = regmap_read(adap->regmap, CHT_WC_I2C_RDDATA, &adap->read_data);
+ if (ret)
+ adap->io_error = true;
+
+ /*
+ * Immediately ack IRQs, so that if new IRQs arrives while we're
+ * handling the previous ones our irq will re-trigger when we're done.
+ */
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, reg);
+ if (ret)
+ dev_err(&adap->adapter.dev, "Error writing extchgrirq reg\n");
+
+ if (reg & CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK) {
+ adap->io_error |= !!(reg & CHT_WC_EXTCHGRIRQ_NACK_IRQ);
+ adap->done = true;
+ }
+
+ mutex_unlock(&adap->adap_lock);
+
+ if (reg & CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK)
+ wake_up(&adap->wait);
+
+ /*
+ * Do NOT use handle_nested_irq here, the client irq handler will
+ * likely want to do i2c transfers and the i2c controller uses this
+ * interrupt handler as well, so running the client irq handler from
+ * this thread will cause things to lock up.
+ */
+ if (reg & CHT_WC_EXTCHGRIRQ_CLIENT_IRQ) {
+ /*
+ * generic_handle_irq expects local IRQs to be disabled
+ * as normally it is called from interrupt context.
+ */
+ local_irq_disable();
+ generic_handle_irq(adap->client_irq);
+ local_irq_enable();
+ }
+
+ return IRQ_HANDLED;
+}
+
+static u32 cht_wc_i2c_adap_master_func(struct i2c_adapter *adap)
+{
+ /* This i2c adapter only supports SMBUS byte transfers */
+ return I2C_FUNC_SMBUS_BYTE_DATA;
+}
+
+static int cht_wc_i2c_adap_smbus_xfer(struct i2c_adapter *_adap, u16 addr,
+ unsigned short flags, char read_write,
+ u8 command, int size,
+ union i2c_smbus_data *data)
+{
+ struct cht_wc_i2c_adap *adap = i2c_get_adapdata(_adap);
+ int ret;
+
+ mutex_lock(&adap->adap_lock);
+ adap->io_error = false;
+ adap->done = false;
+ mutex_unlock(&adap->adap_lock);
+
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_CLIENT_ADDR, addr);
+ if (ret)
+ return ret;
+
+ if (read_write == I2C_SMBUS_WRITE) {
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_WRDATA, data->byte);
+ if (ret)
+ return ret;
+ }
+
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_REG_OFFSET, command);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_CTRL,
+ (read_write == I2C_SMBUS_WRITE) ?
+ CHT_WC_I2C_CTRL_WR : CHT_WC_I2C_CTRL_RD);
+ if (ret)
+ return ret;
+
+ ret = wait_event_timeout(adap->wait, adap->done, msecs_to_jiffies(30));
+ if (ret == 0) {
+ /*
+ * The CHT GPIO controller serializes all IRQs, sometimes
+ * causing significant delays, check status manually.
+ */
+ cht_wc_i2c_adap_thread_handler(0, adap);
+ if (!adap->done)
+ return -ETIMEDOUT;
+ }
+
+ ret = 0;
+ mutex_lock(&adap->adap_lock);
+ if (adap->io_error)
+ ret = -EIO;
+ else if (read_write == I2C_SMBUS_READ)
+ data->byte = adap->read_data;
+ mutex_unlock(&adap->adap_lock);
+
+ return ret;
+}
+
+static const struct i2c_algorithm cht_wc_i2c_adap_algo = {
+ .functionality = cht_wc_i2c_adap_master_func,
+ .smbus_xfer = cht_wc_i2c_adap_smbus_xfer,
+};
+
+/**** irqchip for the client connected to the extchgr i2c adapter ****/
+static void cht_wc_i2c_irq_lock(struct irq_data *data)
+{
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
+
+ mutex_lock(&adap->irqchip_lock);
+}
+
+static void cht_wc_i2c_irq_sync_unlock(struct irq_data *data)
+{
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
+ int ret;
+
+ if (adap->irq_mask != adap->old_irq_mask) {
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK,
+ adap->irq_mask);
+ if (ret == 0)
+ adap->old_irq_mask = adap->irq_mask;
+ else
+ dev_err(&adap->adapter.dev, "Error writing EXTCHGRIRQ_MSK\n");
+ }
+
+ mutex_unlock(&adap->irqchip_lock);
+}
+
+static void cht_wc_i2c_irq_enable(struct irq_data *data)
+{
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
+
+ adap->irq_mask &= ~CHT_WC_EXTCHGRIRQ_CLIENT_IRQ;
+}
+
+static void cht_wc_i2c_irq_disable(struct irq_data *data)
+{
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
+
+ adap->irq_mask |= CHT_WC_EXTCHGRIRQ_CLIENT_IRQ;
+}
+
+static const struct irq_chip cht_wc_i2c_irq_chip = {
+ .irq_bus_lock = cht_wc_i2c_irq_lock,
+ .irq_bus_sync_unlock = cht_wc_i2c_irq_sync_unlock,
+ .irq_disable = cht_wc_i2c_irq_disable,
+ .irq_enable = cht_wc_i2c_irq_enable,
+ .name = "cht_wc_ext_chrg_irq_chip",
+};
+
+static const struct property_entry bq24190_props[] = {
+ PROPERTY_ENTRY_STRING("extcon-name", "cht_wcove_pwrsrc"),
+ PROPERTY_ENTRY_BOOL("omit-battery-class"),
+ PROPERTY_ENTRY_BOOL("disable-reset"),
+ { }
+};
+
+static int cht_wc_i2c_adap_i2c_probe(struct platform_device *pdev)
+{
+ struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
+ struct cht_wc_i2c_adap *adap;
+ struct i2c_board_info board_info = {
+ .type = "bq24190",
+ .addr = 0x6b,
+ .properties = bq24190_props,
+ };
+ int ret, reg, irq;
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "Error missing irq resource\n");
+ return -EINVAL;
+ }
+
+ adap = devm_kzalloc(&pdev->dev, sizeof(*adap), GFP_KERNEL);
+ if (!adap)
+ return -ENOMEM;
+
+ init_waitqueue_head(&adap->wait);
+ mutex_init(&adap->adap_lock);
+ mutex_init(&adap->irqchip_lock);
+ adap->irqchip = cht_wc_i2c_irq_chip;
+ adap->regmap = pmic->regmap;
+ adap->adapter.owner = THIS_MODULE;
+ adap->adapter.class = I2C_CLASS_HWMON;
+ adap->adapter.algo = &cht_wc_i2c_adap_algo;
+ strlcpy(adap->adapter.name, "PMIC I2C Adapter",
+ sizeof(adap->adapter.name));
+ adap->adapter.dev.parent = &pdev->dev;
+
+ /* Clear and activate i2c-adapter interrupts, disable client IRQ */
+ adap->old_irq_mask = adap->irq_mask = ~CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK;
+
+ ret = regmap_read(adap->regmap, CHT_WC_I2C_RDDATA, &reg);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, ~adap->irq_mask);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK, adap->irq_mask);
+ if (ret)
+ return ret;
+
+ /* Alloc and register client IRQ */
+ adap->irq_domain = irq_domain_add_linear(pdev->dev.of_node, 1,
+ &irq_domain_simple_ops, NULL);
+ if (!adap->irq_domain)
+ return -ENOMEM;
+
+ adap->client_irq = irq_create_mapping(adap->irq_domain, 0);
+ if (!adap->client_irq) {
+ ret = -ENOMEM;
+ goto remove_irq_domain;
+ }
+
+ irq_set_chip_data(adap->client_irq, adap);
+ irq_set_chip_and_handler(adap->client_irq, &adap->irqchip,
+ handle_simple_irq);
+
+ ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+ cht_wc_i2c_adap_thread_handler,
+ IRQF_ONESHOT, "PMIC I2C Adapter", adap);
+ if (ret)
+ goto remove_irq_domain;
+
+ i2c_set_adapdata(&adap->adapter, adap);
+ ret = i2c_add_adapter(&adap->adapter);
+ if (ret)
+ goto remove_irq_domain;
+
+ board_info.irq = adap->client_irq;
+ adap->client = i2c_new_device(&adap->adapter, &board_info);
+ if (!adap->client) {
+ ret = -ENOMEM;
+ goto del_adapter;
+ }
+
+ platform_set_drvdata(pdev, adap);
+ return 0;
+
+del_adapter:
+ i2c_del_adapter(&adap->adapter);
+remove_irq_domain:
+ irq_domain_remove(adap->irq_domain);
+ return ret;
+}
+
+static int cht_wc_i2c_adap_i2c_remove(struct platform_device *pdev)
+{
+ struct cht_wc_i2c_adap *adap = platform_get_drvdata(pdev);
+
+ i2c_unregister_device(adap->client);
+ i2c_del_adapter(&adap->adapter);
+ irq_domain_remove(adap->irq_domain);
+
+ return 0;
+}
+
+static struct platform_device_id cht_wc_i2c_adap_id_table[] = {
+ { .name = "cht_wcove_ext_chgr" },
+ {},
+};
+MODULE_DEVICE_TABLE(platform, cht_wc_i2c_adap_id_table);
+
+static struct platform_driver cht_wc_i2c_adap_driver = {
+ .probe = cht_wc_i2c_adap_i2c_probe,
+ .remove = cht_wc_i2c_adap_i2c_remove,
+ .driver = {
+ .name = "cht_wcove_ext_chgr",
+ },
+ .id_table = cht_wc_i2c_adap_id_table,
+};
+module_platform_driver(cht_wc_i2c_adap_driver);
+
+MODULE_DESCRIPTION("Intel CHT Whiskey Cove PMIC I2C Master driver");
+MODULE_AUTHOR("Hans de Goede <[email protected]>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c
index d89bde2c5da2..8a8ca945561b 100644
--- a/drivers/i2c/busses/i2c-cpm.c
+++ b/drivers/i2c/busses/i2c-cpm.c
@@ -413,7 +413,7 @@ static const struct i2c_algorithm cpm_i2c_algo = {
};
/* CPM_MAX_READ is also limiting writes according to the code! */
-static struct i2c_adapter_quirks cpm_i2c_quirks = {
+static const struct i2c_adapter_quirks cpm_i2c_quirks = {
.max_num_msgs = CPM_MAXBD,
.max_read_len = CPM_MAX_READ,
.max_write_len = CPM_MAX_READ,
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 9e7ef5cf5d49..b8c43535f16c 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -733,7 +733,7 @@ static inline void i2c_davinci_cpufreq_deregister(struct davinci_i2c_dev *dev)
}
#endif
-static struct i2c_algorithm i2c_davinci_algo = {
+static const struct i2c_algorithm i2c_davinci_algo = {
.master_xfer = i2c_davinci_xfer,
.functionality = i2c_davinci_func,
};
@@ -801,7 +801,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)
dev->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(dev->clk))
- return -ENODEV;
+ return PTR_ERR(dev->clk);
clk_prepare_enable(dev->clk);
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -876,8 +876,7 @@ static int davinci_i2c_remove(struct platform_device *pdev)
#ifdef CONFIG_PM
static int davinci_i2c_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct davinci_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
+ struct davinci_i2c_dev *i2c_dev = dev_get_drvdata(dev);
/* put I2C into reset */
davinci_i2c_reset_ctrl(i2c_dev, 0);
@@ -888,8 +887,7 @@ static int davinci_i2c_suspend(struct device *dev)
static int davinci_i2c_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct davinci_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
+ struct davinci_i2c_dev *i2c_dev = dev_get_drvdata(dev);
clk_prepare_enable(i2c_dev->clk);
/* take I2C out of reset */
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 2b98a173136f..0e65b97842b4 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -439,8 +439,7 @@ static void dw_i2c_plat_complete(struct device *dev)
#ifdef CONFIG_PM
static int dw_i2c_plat_runtime_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
+ struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
i_dev->disable(i_dev);
i2c_dw_plat_prepare_clk(i_dev, false);
@@ -450,8 +449,7 @@ static int dw_i2c_plat_runtime_suspend(struct device *dev)
static int dw_i2c_plat_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
+ struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
i2c_dw_plat_prepare_clk(i_dev, true);
i_dev->init(i_dev);
diff --git a/drivers/i2c/busses/i2c-designware-slave.c b/drivers/i2c/busses/i2c-designware-slave.c
index 78d8fb73927d..ea9578ab19a1 100644
--- a/drivers/i2c/busses/i2c-designware-slave.c
+++ b/drivers/i2c/busses/i2c-designware-slave.c
@@ -346,7 +346,7 @@ static irqreturn_t i2c_dw_isr_slave(int this_irq, void *dev_id)
return IRQ_RETVAL(ret);
}
-static struct i2c_algorithm i2c_dw_algo = {
+static const struct i2c_algorithm i2c_dw_algo = {
.functionality = i2c_dw_func,
.reg_slave = i2c_dw_reg_slave,
.unreg_slave = i2c_dw_unreg_slave,
diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
index 23ed4d67ecad..3855e0b11877 100644
--- a/drivers/i2c/busses/i2c-exynos5.c
+++ b/drivers/i2c/busses/i2c-exynos5.c
@@ -803,8 +803,7 @@ static int exynos5_i2c_remove(struct platform_device *pdev)
#ifdef CONFIG_PM_SLEEP
static int exynos5_i2c_suspend_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct exynos5_i2c *i2c = platform_get_drvdata(pdev);
+ struct exynos5_i2c *i2c = dev_get_drvdata(dev);
i2c->suspended = 1;
@@ -815,8 +814,7 @@ static int exynos5_i2c_suspend_noirq(struct device *dev)
static int exynos5_i2c_resume_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct exynos5_i2c *i2c = platform_get_drvdata(pdev);
+ struct exynos5_i2c *i2c = dev_get_drvdata(dev);
int ret = 0;
ret = clk_prepare_enable(i2c->clk);
diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c
index 34cfc0ebdcb9..0ef8fcc6ac3a 100644
--- a/drivers/i2c/busses/i2c-gpio.c
+++ b/drivers/i2c/busses/i2c-gpio.c
@@ -98,8 +98,8 @@ static int of_i2c_gpio_get_pins(struct device_node *np,
return -EPROBE_DEFER;
if (!gpio_is_valid(*sda_pin) || !gpio_is_valid(*scl_pin)) {
- pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n",
- np->full_name, *sda_pin, *scl_pin);
+ pr_err("%pOF: invalid GPIO pins, sda=%d/scl=%d\n",
+ np, *sda_pin, *scl_pin);
return -ENODEV;
}
diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c
index ae7f3180f7e8..bb68957d3da5 100644
--- a/drivers/i2c/busses/i2c-hix5hd2.c
+++ b/drivers/i2c/busses/i2c-hix5hd2.c
@@ -505,8 +505,7 @@ static int hix5hd2_i2c_remove(struct platform_device *pdev)
#ifdef CONFIG_PM
static int hix5hd2_i2c_runtime_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct hix5hd2_i2c_priv *priv = platform_get_drvdata(pdev);
+ struct hix5hd2_i2c_priv *priv = dev_get_drvdata(dev);
clk_disable_unprepare(priv->clk);
@@ -515,8 +514,7 @@ static int hix5hd2_i2c_runtime_suspend(struct device *dev)
static int hix5hd2_i2c_runtime_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct hix5hd2_i2c_priv *priv = platform_get_drvdata(pdev);
+ struct hix5hd2_i2c_priv *priv = dev_get_drvdata(dev);
clk_prepare_enable(priv->clk);
hix5hd2_i2c_init(priv);
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index c9536e17d6ff..e114e4e00d29 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1332,6 +1332,7 @@ static void i801_add_tco(struct i801_priv *priv)
u32 tco_base, tco_ctl;
u32 base_addr, ctrl_val;
u64 base64_addr;
+ u8 hidden;
if (!(priv->features & FEATURE_TCO))
return;
@@ -1376,8 +1377,10 @@ static void i801_add_tco(struct i801_priv *priv)
devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 1);
- /* Unhide the P2SB device */
- pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x0);
+ /* Unhide the P2SB device, if it is hidden */
+ pci_bus_read_config_byte(pci_dev->bus, devfn, 0xe1, &hidden);
+ if (hidden)
+ pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x0);
pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR, &base_addr);
base64_addr = base_addr & 0xfffffff0;
@@ -1385,8 +1388,9 @@ static void i801_add_tco(struct i801_priv *priv)
pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR + 0x4, &base_addr);
base64_addr |= (u64)base_addr << 32;
- /* Hide the P2SB device */
- pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x1);
+ /* Hide the P2SB device, if it was hidden before */
+ if (hidden)
+ pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden);
spin_unlock(&p2sb_spinlock);
res = &tco_res[ICH_RES_MEM_OFF];
diff --git a/drivers/i2c/busses/i2c-img-scb.c b/drivers/i2c/busses/i2c-img-scb.c
index 84fb35f6837f..eb1d91b986fd 100644
--- a/drivers/i2c/busses/i2c-img-scb.c
+++ b/drivers/i2c/busses/i2c-img-scb.c
@@ -1459,6 +1459,6 @@ static struct platform_driver img_scb_i2c_driver = {
};
module_platform_driver(img_scb_i2c_driver);
-MODULE_AUTHOR("James Hogan <[email protected]>");
+MODULE_AUTHOR("James Hogan <[email protected]>");
MODULE_DESCRIPTION("IMG host I2C driver");
MODULE_LICENSE("GPL v2");
diff --git a/drivers/i2c/busses/i2c-kempld.c b/drivers/i2c/busses/i2c-kempld.c
index 25993d2e64bf..e879190b5d1d 100644
--- a/drivers/i2c/busses/i2c-kempld.c
+++ b/drivers/i2c/busses/i2c-kempld.c
@@ -289,7 +289,7 @@ static const struct i2c_algorithm kempld_i2c_algorithm = {
.functionality = kempld_i2c_func,
};
-static struct i2c_adapter kempld_i2c_adapter = {
+static const struct i2c_adapter kempld_i2c_adapter = {
.owner = THIS_MODULE,
.name = "i2c-kempld",
.class = I2C_CLASS_HWMON | I2C_CLASS_SPD,
diff --git a/drivers/i2c/busses/i2c-lpc2k.c b/drivers/i2c/busses/i2c-lpc2k.c
index 9b1fef455a89..59167c018ae7 100644
--- a/drivers/i2c/busses/i2c-lpc2k.c
+++ b/drivers/i2c/busses/i2c-lpc2k.c
@@ -457,8 +457,7 @@ static int i2c_lpc2k_remove(struct platform_device *dev)
#ifdef CONFIG_PM
static int i2c_lpc2k_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct lpc2k_i2c *i2c = platform_get_drvdata(pdev);
+ struct lpc2k_i2c *i2c = dev_get_drvdata(dev);
clk_disable(i2c->clk);
@@ -467,8 +466,7 @@ static int i2c_lpc2k_suspend(struct device *dev)
static int i2c_lpc2k_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct lpc2k_i2c *i2c = platform_get_drvdata(pdev);
+ struct lpc2k_i2c *i2c = dev_get_drvdata(dev);
clk_enable(i2c->clk);
i2c_lpc2k_reset(i2c);
diff --git a/drivers/i2c/busses/i2c-mlxcpld.c b/drivers/i2c/busses/i2c-mlxcpld.c
index d271e6a0954c..4c28fa28ce76 100644
--- a/drivers/i2c/busses/i2c-mlxcpld.c
+++ b/drivers/i2c/busses/i2c-mlxcpld.c
@@ -433,7 +433,7 @@ static const struct i2c_algorithm mlxcpld_i2c_algo = {
.functionality = mlxcpld_i2c_func
};
-static struct i2c_adapter_quirks mlxcpld_i2c_quirks = {
+static const struct i2c_adapter_quirks mlxcpld_i2c_quirks = {
.flags = I2C_AQ_COMB_WRITE_THEN_READ,
.max_read_len = MLXCPLD_I2C_DATA_REG_SZ - MLXCPLD_I2C_MAX_ADDR_LEN,
.max_write_len = MLXCPLD_I2C_DATA_REG_SZ,
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index 45d61714c81b..09d288ce0ddb 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -50,7 +50,6 @@
#define I2C_FS_START_CON 0x1800
#define I2C_TIME_CLR_VALUE 0x0000
#define I2C_TIME_DEFAULT_VALUE 0x0003
-#define I2C_FS_TIME_INIT_VALUE 0x1303
#define I2C_WRRD_TRANAC_VALUE 0x0002
#define I2C_RD_TRANAC_VALUE 0x0001
@@ -154,6 +153,7 @@ struct mtk_i2c {
bool use_push_pull; /* IO config push-pull mode */
u16 irq_stat; /* interrupt status */
+ unsigned int clk_src_div;
unsigned int speed_hz; /* The speed in transfer */
enum mtk_trans_op op;
u16 timing_reg;
@@ -172,6 +172,10 @@ static const struct i2c_adapter_quirks mt6577_i2c_quirks = {
.max_comb_2nd_msg_len = 31,
};
+static const struct i2c_adapter_quirks mt7622_i2c_quirks = {
+ .max_num_msgs = 255,
+};
+
static const struct mtk_i2c_compatible mt6577_compat = {
.quirks = &mt6577_i2c_quirks,
.pmic_i2c = 0,
@@ -190,6 +194,15 @@ static const struct mtk_i2c_compatible mt6589_compat = {
.support_33bits = 0,
};
+static const struct mtk_i2c_compatible mt7622_compat = {
+ .quirks = &mt7622_i2c_quirks,
+ .pmic_i2c = 0,
+ .dcm = 1,
+ .auto_restart = 1,
+ .aux_len_reg = 1,
+ .support_33bits = 0,
+};
+
static const struct mtk_i2c_compatible mt8173_compat = {
.pmic_i2c = 0,
.dcm = 1,
@@ -201,6 +214,7 @@ static const struct mtk_i2c_compatible mt8173_compat = {
static const struct of_device_id mtk_i2c_of_match[] = {
{ .compatible = "mediatek,mt6577-i2c", .data = &mt6577_compat },
{ .compatible = "mediatek,mt6589-i2c", .data = &mt6589_compat },
+ { .compatible = "mediatek,mt7622-i2c", .data = &mt7622_compat },
{ .compatible = "mediatek,mt8173-i2c", .data = &mt8173_compat },
{}
};
@@ -285,23 +299,20 @@ static void mtk_i2c_init_hw(struct mtk_i2c *i2c)
* less than or equal to i2c->speed_hz. The calculation try to get
* sample_cnt and step_cn
*/
-static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk,
- unsigned int clock_div)
+static int mtk_i2c_calculate_speed(struct mtk_i2c *i2c, unsigned int clk_src,
+ unsigned int target_speed,
+ unsigned int *timing_step_cnt,
+ unsigned int *timing_sample_cnt)
{
- unsigned int clk_src;
unsigned int step_cnt;
unsigned int sample_cnt;
unsigned int max_step_cnt;
- unsigned int target_speed;
unsigned int base_sample_cnt = MAX_SAMPLE_CNT_DIV;
unsigned int base_step_cnt;
unsigned int opt_div;
unsigned int best_mul;
unsigned int cnt_mul;
- clk_src = parent_clk / clock_div;
- target_speed = i2c->speed_hz;
-
if (target_speed > MAX_HS_MODE_SPEED)
target_speed = MAX_HS_MODE_SPEED;
@@ -347,16 +358,48 @@ static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk,
return -EINVAL;
}
- step_cnt--;
- sample_cnt--;
+ *timing_step_cnt = step_cnt - 1;
+ *timing_sample_cnt = sample_cnt - 1;
+
+ return 0;
+}
+
+static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk)
+{
+ unsigned int clk_src;
+ unsigned int step_cnt;
+ unsigned int sample_cnt;
+ unsigned int target_speed;
+ int ret;
+
+ clk_src = parent_clk / i2c->clk_src_div;
+ target_speed = i2c->speed_hz;
if (target_speed > MAX_FS_MODE_SPEED) {
+ /* Set master code speed register */
+ ret = mtk_i2c_calculate_speed(i2c, clk_src, MAX_FS_MODE_SPEED,
+ &step_cnt, &sample_cnt);
+ if (ret < 0)
+ return ret;
+
+ i2c->timing_reg = (sample_cnt << 8) | step_cnt;
+
/* Set the high speed mode register */
- i2c->timing_reg = I2C_FS_TIME_INIT_VALUE;
+ ret = mtk_i2c_calculate_speed(i2c, clk_src, target_speed,
+ &step_cnt, &sample_cnt);
+ if (ret < 0)
+ return ret;
+
i2c->high_speed_reg = I2C_TIME_DEFAULT_VALUE |
(sample_cnt << 12) | (step_cnt << 8);
} else {
- i2c->timing_reg = (sample_cnt << 8) | (step_cnt << 0);
+ ret = mtk_i2c_calculate_speed(i2c, clk_src, target_speed,
+ &step_cnt, &sample_cnt);
+ if (ret < 0)
+ return ret;
+
+ i2c->timing_reg = (sample_cnt << 8) | step_cnt;
+
/* Disable the high speed transaction */
i2c->high_speed_reg = I2C_TIME_CLR_VALUE;
}
@@ -647,8 +690,7 @@ static const struct i2c_algorithm mtk_i2c_algorithm = {
.functionality = mtk_i2c_functionality,
};
-static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c,
- unsigned int *clk_src_div)
+static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c)
{
int ret;
@@ -656,11 +698,11 @@ static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c,
if (ret < 0)
i2c->speed_hz = I2C_DEFAULT_SPEED;
- ret = of_property_read_u32(np, "clock-div", clk_src_div);
+ ret = of_property_read_u32(np, "clock-div", &i2c->clk_src_div);
if (ret < 0)
return ret;
- if (*clk_src_div == 0)
+ if (i2c->clk_src_div == 0)
return -EINVAL;
i2c->have_pmic = of_property_read_bool(np, "mediatek,have-pmic");
@@ -676,7 +718,6 @@ static int mtk_i2c_probe(struct platform_device *pdev)
int ret = 0;
struct mtk_i2c *i2c;
struct clk *clk;
- unsigned int clk_src_div;
struct resource *res;
int irq;
@@ -684,7 +725,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)
if (!i2c)
return -ENOMEM;
- ret = mtk_i2c_parse_dt(pdev->dev.of_node, i2c, &clk_src_div);
+ ret = mtk_i2c_parse_dt(pdev->dev.of_node, i2c);
if (ret)
return -EINVAL;
@@ -745,7 +786,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)
strlcpy(i2c->adap.name, I2C_DRV_NAME, sizeof(i2c->adap.name));
- ret = mtk_i2c_set_speed(i2c, clk_get_rate(clk), clk_src_div);
+ ret = mtk_i2c_set_speed(i2c, clk_get_rate(clk));
if (ret) {
dev_err(&pdev->dev, "Failed to set the speed.\n");
return -EINVAL;
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
index 5c4db65c5019..a832c45276a4 100644
--- a/drivers/i2c/busses/i2c-mv64xxx.c
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
@@ -820,7 +820,7 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
goto out;
}
- drv_data->rstc = devm_reset_control_get_optional(dev, NULL);
+ drv_data->rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
if (IS_ERR(drv_data->rstc)) {
rc = PTR_ERR(drv_data->rstc);
goto out;
@@ -975,8 +975,7 @@ mv64xxx_i2c_remove(struct platform_device *dev)
#ifdef CONFIG_PM
static int mv64xxx_i2c_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(pdev);
+ struct mv64xxx_i2c_data *drv_data = dev_get_drvdata(dev);
mv64xxx_i2c_hw_init(drv_data);
diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
index da6609d62848..49c7c0c91486 100644
--- a/drivers/i2c/busses/i2c-nomadik.c
+++ b/drivers/i2c/busses/i2c-nomadik.c
@@ -1088,7 +1088,7 @@ static struct i2c_vendor_data vendor_db8500 = {
.fifodepth = 32, /* Guessed from TFTR/RFTR = 15 */
};
-static struct amba_id nmk_i2c_ids[] = {
+static const struct amba_id nmk_i2c_ids[] = {
{
.id = 0x00180024,
.mask = 0x00ffffff,
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c
index 34f1889a4073..8c42ca7107b2 100644
--- a/drivers/i2c/busses/i2c-ocores.c
+++ b/drivers/i2c/busses/i2c-ocores.c
@@ -276,7 +276,7 @@ static const struct i2c_algorithm ocores_algorithm = {
.functionality = ocores_func,
};
-static struct i2c_adapter ocores_adapter = {
+static const struct i2c_adapter ocores_adapter = {
.owner = THIS_MODULE,
.name = "i2c-ocores",
.class = I2C_CLASS_DEPRECATED,
diff --git a/drivers/i2c/busses/i2c-octeon-platdrv.c b/drivers/i2c/busses/i2c-octeon-platdrv.c
index 917524ce6890..64bda83e65ac 100644
--- a/drivers/i2c/busses/i2c-octeon-platdrv.c
+++ b/drivers/i2c/busses/i2c-octeon-platdrv.c
@@ -126,7 +126,7 @@ static const struct i2c_algorithm octeon_i2c_algo = {
.functionality = octeon_i2c_functionality,
};
-static struct i2c_adapter octeon_i2c_ops = {
+static const struct i2c_adapter octeon_i2c_ops = {
.owner = THIS_MODULE,
.name = "OCTEON adapter",
.algo = &octeon_i2c_algo,
diff --git a/drivers/i2c/busses/i2c-opal.c b/drivers/i2c/busses/i2c-opal.c
index 11e2a1fc10e9..0aabb7eca0c5 100644
--- a/drivers/i2c/busses/i2c-opal.c
+++ b/drivers/i2c/busses/i2c-opal.c
@@ -204,7 +204,7 @@ static const struct i2c_algorithm i2c_opal_algo = {
* For two messages, we basically support simple smbus transactions of a
* write-then-anything.
*/
-static struct i2c_adapter_quirks i2c_opal_quirks = {
+static const struct i2c_adapter_quirks i2c_opal_quirks = {
.flags = I2C_AQ_COMB | I2C_AQ_COMB_WRITE_FIRST | I2C_AQ_COMB_SAME_ADDR,
.max_comb_1st_msg_len = 4,
};
diff --git a/drivers/i2c/busses/i2c-pmcmsp.c b/drivers/i2c/busses/i2c-pmcmsp.c
index 217c78711d65..2aa0e83174c5 100644
--- a/drivers/i2c/busses/i2c-pmcmsp.c
+++ b/drivers/i2c/busses/i2c-pmcmsp.c
@@ -577,7 +577,7 @@ static u32 pmcmsptwi_i2c_func(struct i2c_adapter *adapter)
I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_PROC_CALL;
}
-static struct i2c_adapter_quirks pmcmsptwi_i2c_quirks = {
+static const struct i2c_adapter_quirks pmcmsptwi_i2c_quirks = {
.flags = I2C_AQ_COMB_WRITE_THEN_READ,
.max_write_len = MSP_MAX_BYTES_PER_RW,
.max_read_len = MSP_MAX_BYTES_PER_RW,
@@ -587,7 +587,7 @@ static struct i2c_adapter_quirks pmcmsptwi_i2c_quirks = {
/* -- Initialization -- */
-static struct i2c_algorithm pmcmsptwi_algo = {
+static const struct i2c_algorithm pmcmsptwi_algo = {
.master_xfer = pmcmsptwi_master_xfer,
.functionality = pmcmsptwi_i2c_func,
};
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c
index fd5f9d2bf6d9..42d6b3a226f8 100644
--- a/drivers/i2c/busses/i2c-pnx.c
+++ b/drivers/i2c/busses/i2c-pnx.c
@@ -590,7 +590,7 @@ static u32 i2c_pnx_func(struct i2c_adapter *adapter)
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}
-static struct i2c_algorithm pnx_algorithm = {
+static const struct i2c_algorithm pnx_algorithm = {
.master_xfer = i2c_pnx_xfer,
.functionality = i2c_pnx_func,
};
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c
index b0d9dee14a7e..f2a2067525ef 100644
--- a/drivers/i2c/busses/i2c-powermac.c
+++ b/drivers/i2c/busses/i2c-powermac.c
@@ -197,7 +197,7 @@ static const struct i2c_algorithm i2c_powermac_algorithm = {
.functionality = i2c_powermac_func,
};
-static struct i2c_adapter_quirks i2c_powermac_quirks = {
+static const struct i2c_adapter_quirks i2c_powermac_quirks = {
.max_num_msgs = 1,
};
@@ -234,7 +234,7 @@ static u32 i2c_powermac_get_addr(struct i2c_adapter *adap,
else if (!strcmp(node->name, "deq"))
return 0x34;
- dev_warn(&adap->dev, "No i2c address for %s\n", node->full_name);
+ dev_warn(&adap->dev, "No i2c address for %pOF\n", node);
return 0xffffffff;
}
@@ -315,8 +315,7 @@ static bool i2c_powermac_get_type(struct i2c_adapter *adap,
}
}
- dev_err(&adap->dev, "i2c-powermac: modalias failure"
- " on %s\n", node->full_name);
+ dev_err(&adap->dev, "i2c-powermac: modalias failure on %pOF\n", node);
return false;
}
@@ -348,8 +347,7 @@ static void i2c_powermac_register_devices(struct i2c_adapter *adap,
if (!pmac_i2c_match_adapter(node, adap))
continue;
- dev_dbg(&adap->dev, "i2c-powermac: register %s\n",
- node->full_name);
+ dev_dbg(&adap->dev, "i2c-powermac: register %pOF\n", node);
/*
* Keep track of some device existence to handle
@@ -372,7 +370,7 @@ static void i2c_powermac_register_devices(struct i2c_adapter *adap,
newdev = i2c_new_device(adap, &info);
if (!newdev) {
dev_err(&adap->dev, "i2c-powermac: Failure to register"
- " %s\n", node->full_name);
+ " %pOF\n", node);
of_node_put(node);
/* We do not dispose of the interrupt mapping on
* purpose. It's not necessary (interrupt cannot be
diff --git a/drivers/i2c/busses/i2c-puv3.c b/drivers/i2c/busses/i2c-puv3.c
index 0c8b1571886d..287088b8c4c8 100644
--- a/drivers/i2c/busses/i2c-puv3.c
+++ b/drivers/i2c/busses/i2c-puv3.c
@@ -175,7 +175,7 @@ static u32 puv3_i2c_func(struct i2c_adapter *adapter)
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}
-static struct i2c_algorithm puv3_i2c_algorithm = {
+static const struct i2c_algorithm puv3_i2c_algorithm = {
.master_xfer = puv3_i2c_xfer,
.functionality = puv3_i2c_func,
};
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
index 6cf333ecc8b8..600d264e080c 100644
--- a/drivers/i2c/busses/i2c-pxa.c
+++ b/drivers/i2c/busses/i2c-pxa.c
@@ -1346,8 +1346,7 @@ static int i2c_pxa_remove(struct platform_device *dev)
#ifdef CONFIG_PM
static int i2c_pxa_suspend_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct pxa_i2c *i2c = platform_get_drvdata(pdev);
+ struct pxa_i2c *i2c = dev_get_drvdata(dev);
clk_disable(i2c->clk);
@@ -1356,8 +1355,7 @@ static int i2c_pxa_suspend_noirq(struct device *dev)
static int i2c_pxa_resume_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct pxa_i2c *i2c = platform_get_drvdata(pdev);
+ struct pxa_i2c *i2c = dev_get_drvdata(dev);
clk_enable(i2c->clk);
i2c_pxa_reset(i2c);
diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index 1902d8ac9753..08f8e0107642 100644
--- a/drivers/i2c/busses/i2c-qup.c
+++ b/drivers/i2c/busses/i2c-qup.c
@@ -1396,7 +1396,7 @@ static const struct i2c_algorithm qup_i2c_algo_v2 = {
* the end of the read, the length of the read is specified as one byte
* which limits the possible read to 256 (QUP_READ_LIMIT) bytes.
*/
-static struct i2c_adapter_quirks qup_i2c_quirks = {
+static const struct i2c_adapter_quirks qup_i2c_quirks = {
.max_read_len = QUP_READ_LIMIT,
};
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
index 93c1a54981df..15d764afec3b 100644
--- a/drivers/i2c/busses/i2c-rcar.c
+++ b/drivers/i2c/busses/i2c-rcar.c
@@ -625,9 +625,8 @@ static struct dma_chan *rcar_i2c_request_dma_chan(struct device *dev,
chan = dma_request_chan(dev, chan_name);
if (IS_ERR(chan)) {
- ret = PTR_ERR(chan);
- dev_dbg(dev, "request_channel failed for %s (%d)\n",
- chan_name, ret);
+ dev_dbg(dev, "request_channel failed for %s (%ld)\n",
+ chan_name, PTR_ERR(chan));
return chan;
}
diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
index df220666d627..fe234578380a 100644
--- a/drivers/i2c/busses/i2c-rk3x.c
+++ b/drivers/i2c/busses/i2c-rk3x.c
@@ -1131,6 +1131,11 @@ static const struct i2c_algorithm rk3x_i2c_algorithm = {
.functionality = rk3x_i2c_func,
};
+static const struct rk3x_i2c_soc_data rv1108_soc_data = {
+ .grf_offset = -1,
+ .calc_timings = rk3x_i2c_v1_calc_timings,
+};
+
static const struct rk3x_i2c_soc_data rk3066_soc_data = {
.grf_offset = 0x154,
.calc_timings = rk3x_i2c_v0_calc_timings,
@@ -1158,6 +1163,10 @@ static const struct rk3x_i2c_soc_data rk3399_soc_data = {
static const struct of_device_id rk3x_i2c_match[] = {
{
+ .compatible = "rockchip,rv1108-i2c",
+ .data = (void *)&rv1108_soc_data
+ },
+ {
.compatible = "rockchip,rk3066-i2c",
.data = (void *)&rk3066_soc_data
},
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
index 499af26e736e..5d97510ee48b 100644
--- a/drivers/i2c/busses/i2c-s3c2410.c
+++ b/drivers/i2c/busses/i2c-s3c2410.c
@@ -1246,8 +1246,7 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)
#ifdef CONFIG_PM_SLEEP
static int s3c24xx_i2c_suspend_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
+ struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
i2c->suspended = 1;
@@ -1259,8 +1258,7 @@ static int s3c24xx_i2c_suspend_noirq(struct device *dev)
static int s3c24xx_i2c_resume_noirq(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
+ struct s3c24xx_i2c *i2c = dev_get_drvdata(dev);
int ret;
if (!IS_ERR(i2c->sysreg))
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
index 2e097d97d258..6f2aaeb7c4fa 100644
--- a/drivers/i2c/busses/i2c-sh_mobile.c
+++ b/drivers/i2c/busses/i2c-sh_mobile.c
@@ -561,8 +561,8 @@ static struct dma_chan *sh_mobile_i2c_request_dma_chan(struct device *dev,
chan = dma_request_slave_channel_reason(dev, chan_name);
if (IS_ERR(chan)) {
- ret = PTR_ERR(chan);
- dev_dbg(dev, "request_channel failed for %s (%d)\n", chan_name, ret);
+ dev_dbg(dev, "request_channel failed for %s (%ld)\n", chan_name,
+ PTR_ERR(chan));
return chan;
}
diff --git a/drivers/i2c/busses/i2c-sirf.c b/drivers/i2c/busses/i2c-sirf.c
index 95e81d0f72b4..2fd8b6d00391 100644
--- a/drivers/i2c/busses/i2c-sirf.c
+++ b/drivers/i2c/busses/i2c-sirf.c
@@ -421,8 +421,7 @@ static int i2c_sirfsoc_remove(struct platform_device *pdev)
#ifdef CONFIG_PM
static int i2c_sirfsoc_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct i2c_adapter *adapter = platform_get_drvdata(pdev);
+ struct i2c_adapter *adapter = dev_get_drvdata(dev);
struct sirfsoc_i2c *siic = adapter->algo_data;
clk_enable(siic->clk);
@@ -434,8 +433,7 @@ static int i2c_sirfsoc_suspend(struct device *dev)
static int i2c_sirfsoc_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct i2c_adapter *adapter = platform_get_drvdata(pdev);
+ struct i2c_adapter *adapter = dev_get_drvdata(dev);
struct sirfsoc_i2c *siic = adapter->algo_data;
clk_enable(siic->clk);
diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c
new file mode 100644
index 000000000000..22e08ae1704f
--- /dev/null
+++ b/drivers/i2c/busses/i2c-sprd.c
@@ -0,0 +1,646 @@
+/*
+ * Copyright (C) 2017 Spreadtrum Communications Inc.
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+
+#define I2C_CTL 0x00
+#define I2C_ADDR_CFG 0x04
+#define I2C_COUNT 0x08
+#define I2C_RX 0x0c
+#define I2C_TX 0x10
+#define I2C_STATUS 0x14
+#define I2C_HSMODE_CFG 0x18
+#define I2C_VERSION 0x1c
+#define ADDR_DVD0 0x20
+#define ADDR_DVD1 0x24
+#define ADDR_STA0_DVD 0x28
+#define ADDR_RST 0x2c
+
+/* I2C_CTL */
+#define STP_EN BIT(20)
+#define FIFO_AF_LVL_MASK GENMASK(19, 16)
+#define FIFO_AF_LVL 16
+#define FIFO_AE_LVL_MASK GENMASK(15, 12)
+#define FIFO_AE_LVL 12
+#define I2C_DMA_EN BIT(11)
+#define FULL_INTEN BIT(10)
+#define EMPTY_INTEN BIT(9)
+#define I2C_DVD_OPT BIT(8)
+#define I2C_OUT_OPT BIT(7)
+#define I2C_TRIM_OPT BIT(6)
+#define I2C_HS_MODE BIT(4)
+#define I2C_MODE BIT(3)
+#define I2C_EN BIT(2)
+#define I2C_INT_EN BIT(1)
+#define I2C_START BIT(0)
+
+/* I2C_STATUS */
+#define SDA_IN BIT(21)
+#define SCL_IN BIT(20)
+#define FIFO_FULL BIT(4)
+#define FIFO_EMPTY BIT(3)
+#define I2C_INT BIT(2)
+#define I2C_RX_ACK BIT(1)
+#define I2C_BUSY BIT(0)
+
+/* ADDR_RST */
+#define I2C_RST BIT(0)
+
+#define I2C_FIFO_DEEP 12
+#define I2C_FIFO_FULL_THLD 15
+#define I2C_FIFO_EMPTY_THLD 4
+#define I2C_DATA_STEP 8
+#define I2C_ADDR_DVD0_CALC(high, low) \
+ ((((high) & GENMASK(15, 0)) << 16) | ((low) & GENMASK(15, 0)))
+#define I2C_ADDR_DVD1_CALC(high, low) \
+ (((high) & GENMASK(31, 16)) | (((low) & GENMASK(31, 16)) >> 16))
+
+/* timeout (ms) for pm runtime autosuspend */
+#define SPRD_I2C_PM_TIMEOUT 1000
+
+/* SPRD i2c data structure */
+struct sprd_i2c {
+ struct i2c_adapter adap;
+ struct device *dev;
+ void __iomem *base;
+ struct i2c_msg *msg;
+ struct clk *clk;
+ u32 src_clk;
+ u32 bus_freq;
+ struct completion complete;
+ u8 *buf;
+ u32 count;
+ int irq;
+ int err;
+};
+
+static void sprd_i2c_set_count(struct sprd_i2c *i2c_dev, u32 count)
+{
+ writel(count, i2c_dev->base + I2C_COUNT);
+}
+
+static void sprd_i2c_send_stop(struct sprd_i2c *i2c_dev, int stop)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ if (stop)
+ writel(tmp & ~STP_EN, i2c_dev->base + I2C_CTL);
+ else
+ writel(tmp | STP_EN, i2c_dev->base + I2C_CTL);
+}
+
+static void sprd_i2c_clear_start(struct sprd_i2c *i2c_dev)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ writel(tmp & ~I2C_START, i2c_dev->base + I2C_CTL);
+}
+
+static void sprd_i2c_clear_ack(struct sprd_i2c *i2c_dev)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_STATUS);
+
+ writel(tmp & ~I2C_RX_ACK, i2c_dev->base + I2C_STATUS);
+}
+
+static void sprd_i2c_clear_irq(struct sprd_i2c *i2c_dev)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_STATUS);
+
+ writel(tmp & ~I2C_INT, i2c_dev->base + I2C_STATUS);
+}
+
+static void sprd_i2c_reset_fifo(struct sprd_i2c *i2c_dev)
+{
+ writel(I2C_RST, i2c_dev->base + ADDR_RST);
+}
+
+static void sprd_i2c_set_devaddr(struct sprd_i2c *i2c_dev, struct i2c_msg *m)
+{
+ writel(m->addr << 1, i2c_dev->base + I2C_ADDR_CFG);
+}
+
+static void sprd_i2c_write_bytes(struct sprd_i2c *i2c_dev, u8 *buf, u32 len)
+{
+ u32 i;
+
+ for (i = 0; i < len; i++)
+ writeb(buf[i], i2c_dev->base + I2C_TX);
+}
+
+static void sprd_i2c_read_bytes(struct sprd_i2c *i2c_dev, u8 *buf, u32 len)
+{
+ u32 i;
+
+ for (i = 0; i < len; i++)
+ buf[i] = readb(i2c_dev->base + I2C_RX);
+}
+
+static void sprd_i2c_set_full_thld(struct sprd_i2c *i2c_dev, u32 full_thld)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ tmp &= ~FIFO_AF_LVL_MASK;
+ tmp |= full_thld << FIFO_AF_LVL;
+ writel(tmp, i2c_dev->base + I2C_CTL);
+};
+
+static void sprd_i2c_set_empty_thld(struct sprd_i2c *i2c_dev, u32 empty_thld)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ tmp &= ~FIFO_AE_LVL_MASK;
+ tmp |= empty_thld << FIFO_AE_LVL;
+ writel(tmp, i2c_dev->base + I2C_CTL);
+};
+
+static void sprd_i2c_set_fifo_full_int(struct sprd_i2c *i2c_dev, int enable)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ if (enable)
+ tmp |= FULL_INTEN;
+ else
+ tmp &= ~FULL_INTEN;
+
+ writel(tmp, i2c_dev->base + I2C_CTL);
+};
+
+static void sprd_i2c_set_fifo_empty_int(struct sprd_i2c *i2c_dev, int enable)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ if (enable)
+ tmp |= EMPTY_INTEN;
+ else
+ tmp &= ~EMPTY_INTEN;
+
+ writel(tmp, i2c_dev->base + I2C_CTL);
+};
+
+static void sprd_i2c_opt_start(struct sprd_i2c *i2c_dev)
+{
+ u32 tmp = readl(i2c_dev->base + I2C_CTL);
+
+ writel(tmp | I2C_START, i2c_dev->base + I2C_CTL);
+}
+
+static void sprd_i2c_opt_mode(struct sprd_i2c *i2c_dev, int rw)
+{
+ u32 cmd = readl(i2c_dev->base + I2C_CTL) & ~I2C_MODE;
+
+ writel(cmd | rw << 3, i2c_dev->base + I2C_CTL);
+}
+
+static void sprd_i2c_data_transfer(struct sprd_i2c *i2c_dev)
+{
+ u32 i2c_count = i2c_dev->count;
+ u32 need_tran = i2c_count <= I2C_FIFO_DEEP ? i2c_count : I2C_FIFO_DEEP;
+ struct i2c_msg *msg = i2c_dev->msg;
+
+ if (msg->flags & I2C_M_RD) {
+ sprd_i2c_read_bytes(i2c_dev, i2c_dev->buf, I2C_FIFO_FULL_THLD);
+ i2c_dev->count -= I2C_FIFO_FULL_THLD;
+ i2c_dev->buf += I2C_FIFO_FULL_THLD;
+
+ /*
+ * If the read data count is larger than rx fifo full threshold,
+ * we should enable the rx fifo full interrupt to read data
+ * again.
+ */
+ if (i2c_dev->count >= I2C_FIFO_FULL_THLD)
+ sprd_i2c_set_fifo_full_int(i2c_dev, 1);
+ } else {
+ sprd_i2c_write_bytes(i2c_dev, i2c_dev->buf, need_tran);
+ i2c_dev->buf += need_tran;
+ i2c_dev->count -= need_tran;
+
+ /*
+ * If the write data count is arger than tx fifo depth which
+ * means we can not write all data in one time, then we should
+ * enable the tx fifo empty interrupt to write again.
+ */
+ if (i2c_count > I2C_FIFO_DEEP)
+ sprd_i2c_set_fifo_empty_int(i2c_dev, 1);
+ }
+}
+
+static int sprd_i2c_handle_msg(struct i2c_adapter *i2c_adap,
+ struct i2c_msg *msg, bool is_last_msg)
+{
+ struct sprd_i2c *i2c_dev = i2c_adap->algo_data;
+
+ i2c_dev->msg = msg;
+ i2c_dev->buf = msg->buf;
+ i2c_dev->count = msg->len;
+
+ reinit_completion(&i2c_dev->complete);
+ sprd_i2c_reset_fifo(i2c_dev);
+ sprd_i2c_set_devaddr(i2c_dev, msg);
+ sprd_i2c_set_count(i2c_dev, msg->len);
+
+ if (msg->flags & I2C_M_RD) {
+ sprd_i2c_opt_mode(i2c_dev, 1);
+ sprd_i2c_send_stop(i2c_dev, 1);
+ } else {
+ sprd_i2c_opt_mode(i2c_dev, 0);
+ sprd_i2c_send_stop(i2c_dev, !!is_last_msg);
+ }
+
+ /*
+ * We should enable rx fifo full interrupt to get data when receiving
+ * full data.
+ */
+ if (msg->flags & I2C_M_RD)
+ sprd_i2c_set_fifo_full_int(i2c_dev, 1);
+ else
+ sprd_i2c_data_transfer(i2c_dev);
+
+ sprd_i2c_opt_start(i2c_dev);
+
+ wait_for_completion(&i2c_dev->complete);
+
+ return i2c_dev->err;
+}
+
+static int sprd_i2c_master_xfer(struct i2c_adapter *i2c_adap,
+ struct i2c_msg *msgs, int num)
+{
+ struct sprd_i2c *i2c_dev = i2c_adap->algo_data;
+ int im, ret;
+
+ ret = pm_runtime_get_sync(i2c_dev->dev);
+ if (ret < 0)
+ return ret;
+
+ for (im = 0; im < num - 1; im++) {
+ ret = sprd_i2c_handle_msg(i2c_adap, &msgs[im], 0);
+ if (ret)
+ goto err_msg;
+ }
+
+ ret = sprd_i2c_handle_msg(i2c_adap, &msgs[im++], 1);
+
+err_msg:
+ pm_runtime_mark_last_busy(i2c_dev->dev);
+ pm_runtime_put_autosuspend(i2c_dev->dev);
+
+ return ret < 0 ? ret : im;
+}
+
+static u32 sprd_i2c_func(struct i2c_adapter *adap)
+{
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static const struct i2c_algorithm sprd_i2c_algo = {
+ .master_xfer = sprd_i2c_master_xfer,
+ .functionality = sprd_i2c_func,
+};
+
+static void sprd_i2c_set_clk(struct sprd_i2c *i2c_dev, u32 freq)
+{
+ u32 apb_clk = i2c_dev->src_clk;
+ /*
+ * From I2C databook, the prescale calculation formula:
+ * prescale = freq_i2c / (4 * freq_scl) - 1;
+ */
+ u32 i2c_dvd = apb_clk / (4 * freq) - 1;
+ /*
+ * From I2C databook, the high period of SCL clock is recommended as
+ * 40% (2/5), and the low period of SCL clock is recommended as 60%
+ * (3/5), then the formula should be:
+ * high = (prescale * 2 * 2) / 5
+ * low = (prescale * 2 * 3) / 5
+ */
+ u32 high = ((i2c_dvd << 1) * 2) / 5;
+ u32 low = ((i2c_dvd << 1) * 3) / 5;
+ u32 div0 = I2C_ADDR_DVD0_CALC(high, low);
+ u32 div1 = I2C_ADDR_DVD1_CALC(high, low);
+
+ writel(div0, i2c_dev->base + ADDR_DVD0);
+ writel(div1, i2c_dev->base + ADDR_DVD1);
+
+ /* Start hold timing = hold time(us) * source clock */
+ if (freq == 400000)
+ writel((6 * apb_clk) / 10000000, i2c_dev->base + ADDR_STA0_DVD);
+ else if (freq == 100000)
+ writel((4 * apb_clk) / 1000000, i2c_dev->base + ADDR_STA0_DVD);
+}
+
+static void sprd_i2c_enable(struct sprd_i2c *i2c_dev)
+{
+ u32 tmp = I2C_DVD_OPT;
+
+ writel(tmp, i2c_dev->base + I2C_CTL);
+
+ sprd_i2c_set_full_thld(i2c_dev, I2C_FIFO_FULL_THLD);
+ sprd_i2c_set_empty_thld(i2c_dev, I2C_FIFO_EMPTY_THLD);
+
+ sprd_i2c_set_clk(i2c_dev, i2c_dev->bus_freq);
+ sprd_i2c_reset_fifo(i2c_dev);
+ sprd_i2c_clear_irq(i2c_dev);
+
+ tmp = readl(i2c_dev->base + I2C_CTL);
+ writel(tmp | I2C_EN | I2C_INT_EN, i2c_dev->base + I2C_CTL);
+}
+
+static irqreturn_t sprd_i2c_isr_thread(int irq, void *dev_id)
+{
+ struct sprd_i2c *i2c_dev = dev_id;
+ struct i2c_msg *msg = i2c_dev->msg;
+ bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK);
+ u32 i2c_count = readl(i2c_dev->base + I2C_COUNT);
+ u32 i2c_tran;
+
+ if (msg->flags & I2C_M_RD)
+ i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD;
+ else
+ i2c_tran = i2c_count;
+
+ /*
+ * If we got one ACK from slave when writing data, and we did not
+ * finish this transmission (i2c_tran is not zero), then we should
+ * continue to write data.
+ *
+ * For reading data, ack is always true, if i2c_tran is not 0 which
+ * means we still need to contine to read data from slave.
+ */
+ if (i2c_tran && ack) {
+ sprd_i2c_data_transfer(i2c_dev);
+ return IRQ_HANDLED;
+ }
+
+ i2c_dev->err = 0;
+
+ /*
+ * If we did not get one ACK from slave when writing data, we should
+ * return -EIO to notify users.
+ */
+ if (!ack)
+ i2c_dev->err = -EIO;
+ else if (msg->flags & I2C_M_RD && i2c_dev->count)
+ sprd_i2c_read_bytes(i2c_dev, i2c_dev->buf, i2c_dev->count);
+
+ /* Transmission is done and clear ack and start operation */
+ sprd_i2c_clear_ack(i2c_dev);
+ sprd_i2c_clear_start(i2c_dev);
+ complete(&i2c_dev->complete);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t sprd_i2c_isr(int irq, void *dev_id)
+{
+ struct sprd_i2c *i2c_dev = dev_id;
+ struct i2c_msg *msg = i2c_dev->msg;
+ u32 i2c_count = readl(i2c_dev->base + I2C_COUNT);
+ bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK);
+ u32 i2c_tran;
+
+ if (msg->flags & I2C_M_RD)
+ i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD;
+ else
+ i2c_tran = i2c_count;
+
+ /*
+ * If we did not get one ACK from slave when writing data, then we
+ * should finish this transmission since we got some errors.
+ *
+ * When writing data, if i2c_tran == 0 which means we have writen
+ * done all data, then we can finish this transmission.
+ *
+ * When reading data, if conut < rx fifo full threshold, which
+ * means we can read all data in one time, then we can finish this
+ * transmission too.
+ */
+ if (!i2c_tran || !ack) {
+ sprd_i2c_clear_start(i2c_dev);
+ sprd_i2c_clear_irq(i2c_dev);
+ }
+
+ sprd_i2c_set_fifo_empty_int(i2c_dev, 0);
+ sprd_i2c_set_fifo_full_int(i2c_dev, 0);
+
+ return IRQ_WAKE_THREAD;
+}
+
+static int sprd_i2c_clk_init(struct sprd_i2c *i2c_dev)
+{
+ struct clk *clk_i2c, *clk_parent;
+
+ clk_i2c = devm_clk_get(i2c_dev->dev, "i2c");
+ if (IS_ERR(clk_i2c)) {
+ dev_warn(i2c_dev->dev, "i2c%d can't get the i2c clock\n",
+ i2c_dev->adap.nr);
+ clk_i2c = NULL;
+ }
+
+ clk_parent = devm_clk_get(i2c_dev->dev, "source");
+ if (IS_ERR(clk_parent)) {
+ dev_warn(i2c_dev->dev, "i2c%d can't get the source clock\n",
+ i2c_dev->adap.nr);
+ clk_parent = NULL;
+ }
+
+ if (clk_set_parent(clk_i2c, clk_parent))
+ i2c_dev->src_clk = clk_get_rate(clk_i2c);
+ else
+ i2c_dev->src_clk = 26000000;
+
+ dev_dbg(i2c_dev->dev, "i2c%d set source clock is %d\n",
+ i2c_dev->adap.nr, i2c_dev->src_clk);
+
+ i2c_dev->clk = devm_clk_get(i2c_dev->dev, "enable");
+ if (IS_ERR(i2c_dev->clk)) {
+ dev_warn(i2c_dev->dev, "i2c%d can't get the enable clock\n",
+ i2c_dev->adap.nr);
+ i2c_dev->clk = NULL;
+ }
+
+ return 0;
+}
+
+static int sprd_i2c_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct sprd_i2c *i2c_dev;
+ struct resource *res;
+ u32 prop;
+ int ret;
+
+ pdev->id = of_alias_get_id(dev->of_node, "i2c");
+
+ i2c_dev = devm_kzalloc(dev, sizeof(struct sprd_i2c), GFP_KERNEL);
+ if (!i2c_dev)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ i2c_dev->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(i2c_dev->base))
+ return PTR_ERR(i2c_dev->base);
+
+ i2c_dev->irq = platform_get_irq(pdev, 0);
+ if (i2c_dev->irq < 0) {
+ dev_err(&pdev->dev, "failed to get irq resource\n");
+ return i2c_dev->irq;
+ }
+
+ i2c_set_adapdata(&i2c_dev->adap, i2c_dev);
+ init_completion(&i2c_dev->complete);
+ snprintf(i2c_dev->adap.name, sizeof(i2c_dev->adap.name),
+ "%s", "sprd-i2c");
+
+ i2c_dev->bus_freq = 100000;
+ i2c_dev->adap.owner = THIS_MODULE;
+ i2c_dev->dev = dev;
+ i2c_dev->adap.retries = 3;
+ i2c_dev->adap.algo = &sprd_i2c_algo;
+ i2c_dev->adap.algo_data = i2c_dev;
+ i2c_dev->adap.dev.parent = dev;
+ i2c_dev->adap.nr = pdev->id;
+ i2c_dev->adap.dev.of_node = dev->of_node;
+
+ if (!of_property_read_u32(dev->of_node, "clock-frequency", &prop))
+ i2c_dev->bus_freq = prop;
+
+ /* We only support 100k and 400k now, otherwise will return error. */
+ if (i2c_dev->bus_freq != 100000 && i2c_dev->bus_freq != 400000)
+ return -EINVAL;
+
+ sprd_i2c_clk_init(i2c_dev);
+ platform_set_drvdata(pdev, i2c_dev);
+
+ ret = clk_prepare_enable(i2c_dev->clk);
+ if (ret)
+ return ret;
+
+ sprd_i2c_enable(i2c_dev);
+
+ pm_runtime_set_autosuspend_delay(i2c_dev->dev, SPRD_I2C_PM_TIMEOUT);
+ pm_runtime_use_autosuspend(i2c_dev->dev);
+ pm_runtime_set_active(i2c_dev->dev);
+ pm_runtime_enable(i2c_dev->dev);
+
+ ret = pm_runtime_get_sync(i2c_dev->dev);
+ if (ret < 0)
+ goto err_rpm_put;
+
+ ret = devm_request_threaded_irq(dev, i2c_dev->irq,
+ sprd_i2c_isr, sprd_i2c_isr_thread,
+ IRQF_NO_SUSPEND | IRQF_ONESHOT,
+ pdev->name, i2c_dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request irq %d\n", i2c_dev->irq);
+ goto err_rpm_put;
+ }
+
+ ret = i2c_add_numbered_adapter(&i2c_dev->adap);
+ if (ret) {
+ dev_err(&pdev->dev, "add adapter failed\n");
+ goto err_rpm_put;
+ }
+
+ pm_runtime_mark_last_busy(i2c_dev->dev);
+ pm_runtime_put_autosuspend(i2c_dev->dev);
+ return 0;
+
+err_rpm_put:
+ pm_runtime_put_noidle(i2c_dev->dev);
+ pm_runtime_disable(i2c_dev->dev);
+ clk_disable_unprepare(i2c_dev->clk);
+ return ret;
+}
+
+static int sprd_i2c_remove(struct platform_device *pdev)
+{
+ struct sprd_i2c *i2c_dev = platform_get_drvdata(pdev);
+ int ret;
+
+ ret = pm_runtime_get_sync(i2c_dev->dev);
+ if (ret < 0)
+ return ret;
+
+ i2c_del_adapter(&i2c_dev->adap);
+ clk_disable_unprepare(i2c_dev->clk);
+
+ pm_runtime_put_noidle(i2c_dev->dev);
+ pm_runtime_disable(i2c_dev->dev);
+
+ return 0;
+}
+
+static int __maybe_unused sprd_i2c_suspend_noirq(struct device *pdev)
+{
+ return pm_runtime_force_suspend(pdev);
+}
+
+static int __maybe_unused sprd_i2c_resume_noirq(struct device *pdev)
+{
+ return pm_runtime_force_resume(pdev);
+}
+
+static int __maybe_unused sprd_i2c_runtime_suspend(struct device *pdev)
+{
+ struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev);
+
+ clk_disable_unprepare(i2c_dev->clk);
+
+ return 0;
+}
+
+static int __maybe_unused sprd_i2c_runtime_resume(struct device *pdev)
+{
+ struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev);
+ int ret;
+
+ ret = clk_prepare_enable(i2c_dev->clk);
+ if (ret)
+ return ret;
+
+ sprd_i2c_enable(i2c_dev);
+
+ return 0;
+}
+
+static const struct dev_pm_ops sprd_i2c_pm_ops = {
+ SET_RUNTIME_PM_OPS(sprd_i2c_runtime_suspend,
+ sprd_i2c_runtime_resume, NULL)
+
+ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sprd_i2c_suspend_noirq,
+ sprd_i2c_resume_noirq)
+};
+
+static const struct of_device_id sprd_i2c_of_match[] = {
+ { .compatible = "sprd,sc9860-i2c", },
+};
+
+static struct platform_driver sprd_i2c_driver = {
+ .probe = sprd_i2c_probe,
+ .remove = sprd_i2c_remove,
+ .driver = {
+ .name = "sprd-i2c",
+ .of_match_table = sprd_i2c_of_match,
+ .pm = &sprd_i2c_pm_ops,
+ },
+};
+
+static int sprd_i2c_init(void)
+{
+ return platform_driver_register(&sprd_i2c_driver);
+}
+arch_initcall_sync(sprd_i2c_init);
diff --git a/drivers/i2c/busses/i2c-st.c b/drivers/i2c/busses/i2c-st.c
index 1eb9fa82dcfd..9e62f893958a 100644
--- a/drivers/i2c/busses/i2c-st.c
+++ b/drivers/i2c/busses/i2c-st.c
@@ -745,8 +745,7 @@ static int st_i2c_xfer(struct i2c_adapter *i2c_adap,
#ifdef CONFIG_PM_SLEEP
static int st_i2c_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct st_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
+ struct st_i2c_dev *i2c_dev = dev_get_drvdata(dev);
if (i2c_dev->busy)
return -EBUSY;
diff --git a/drivers/i2c/busses/i2c-stm32.h b/drivers/i2c/busses/i2c-stm32.h
new file mode 100644
index 000000000000..dab51761f8c5
--- /dev/null
+++ b/drivers/i2c/busses/i2c-stm32.h
@@ -0,0 +1,20 @@
+/*
+ * i2c-stm32.h
+ *
+ * Copyright (C) M'boumba Cedric Madianga 2017
+ * Author: M'boumba Cedric Madianga <[email protected]>
+ *
+ * License terms: GNU General Public License (GPL), version 2
+ */
+
+#ifndef _I2C_STM32_H
+#define _I2C_STM32_H
+
+enum stm32_i2c_speed {
+ STM32_I2C_SPEED_STANDARD, /* 100 kHz */
+ STM32_I2C_SPEED_FAST, /* 400 kHz */
+ STM32_I2C_SPEED_FAST_PLUS, /* 1 MHz */
+ STM32_I2C_SPEED_END,
+};
+
+#endif /* _I2C_STM32_H */
diff --git a/drivers/i2c/busses/i2c-stm32f4.c b/drivers/i2c/busses/i2c-stm32f4.c
index f9dd7e86b861..4ec108496f15 100644
--- a/drivers/i2c/busses/i2c-stm32f4.c
+++ b/drivers/i2c/busses/i2c-stm32f4.c
@@ -27,6 +27,8 @@
#include <linux/platform_device.h>
#include <linux/reset.h>
+#include "i2c-stm32.h"
+
/* STM32F4 I2C offset registers */
#define STM32F4_I2C_CR1 0x00
#define STM32F4_I2C_CR2 0x04
@@ -90,12 +92,6 @@
#define STM32F4_I2C_MAX_FREQ 46U
#define HZ_TO_MHZ 1000000
-enum stm32f4_i2c_speed {
- STM32F4_I2C_SPEED_STANDARD, /* 100 kHz */
- STM32F4_I2C_SPEED_FAST, /* 400 kHz */
- STM32F4_I2C_SPEED_END,
-};
-
/**
* struct stm32f4_i2c_msg - client specific data
* @addr: 8-bit slave addr, including r/w bit
@@ -159,7 +155,7 @@ static int stm32f4_i2c_set_periph_clk_freq(struct stm32f4_i2c_dev *i2c_dev)
i2c_dev->parent_rate = clk_get_rate(i2c_dev->clk);
freq = DIV_ROUND_UP(i2c_dev->parent_rate, HZ_TO_MHZ);
- if (i2c_dev->speed == STM32F4_I2C_SPEED_STANDARD) {
+ if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) {
/*
* To reach 100 kHz, the parent clk frequency should be between
* a minimum value of 2 MHz and a maximum value of 46 MHz due
@@ -216,7 +212,7 @@ static void stm32f4_i2c_set_rise_time(struct stm32f4_i2c_dev *i2c_dev)
* is not higher than 46 MHz . As a result trise is at most 4 bits wide
* and so fits into the TRISE bits [5:0].
*/
- if (i2c_dev->speed == STM32F4_I2C_SPEED_STANDARD)
+ if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD)
trise = freq + 1;
else
trise = freq * 3 / 10 + 1;
@@ -230,7 +226,7 @@ static void stm32f4_i2c_set_speed_mode(struct stm32f4_i2c_dev *i2c_dev)
u32 val;
u32 ccr = 0;
- if (i2c_dev->speed == STM32F4_I2C_SPEED_STANDARD) {
+ if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) {
/*
* In standard mode:
* t_scl_high = t_scl_low = CCR * I2C parent clk period
@@ -751,7 +747,7 @@ static u32 stm32f4_i2c_func(struct i2c_adapter *adap)
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}
-static struct i2c_algorithm stm32f4_i2c_algo = {
+static const struct i2c_algorithm stm32f4_i2c_algo = {
.master_xfer = stm32f4_i2c_xfer,
.functionality = stm32f4_i2c_func,
};
@@ -798,7 +794,7 @@ static int stm32f4_i2c_probe(struct platform_device *pdev)
return ret;
}
- rst = devm_reset_control_get(&pdev->dev, NULL);
+ rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
if (IS_ERR(rst)) {
dev_err(&pdev->dev, "Error: Missing controller reset\n");
ret = PTR_ERR(rst);
@@ -808,10 +804,10 @@ static int stm32f4_i2c_probe(struct platform_device *pdev)
udelay(2);
reset_control_deassert(rst);
- i2c_dev->speed = STM32F4_I2C_SPEED_STANDARD;
+ i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
ret = of_property_read_u32(np, "clock-frequency", &clk_rate);
if (!ret && clk_rate >= 400000)
- i2c_dev->speed = STM32F4_I2C_SPEED_FAST;
+ i2c_dev->speed = STM32_I2C_SPEED_FAST;
i2c_dev->dev = &pdev->dev;
diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c
new file mode 100644
index 000000000000..47c67b0ca896
--- /dev/null
+++ b/drivers/i2c/busses/i2c-stm32f7.c
@@ -0,0 +1,972 @@
+/*
+ * Driver for STMicroelectronics STM32F7 I2C controller
+ *
+ * This I2C controller is described in the STM32F75xxx and STM32F74xxx Soc
+ * reference manual.
+ * Please see below a link to the documentation:
+ * http://www.st.com/resource/en/reference_manual/dm00124865.pdf
+ *
+ * Copyright (C) M'boumba Cedric Madianga 2017
+ * Author: M'boumba Cedric Madianga <[email protected]>
+ *
+ * This driver is based on i2c-stm32f4.c
+ *
+ * License terms: GNU General Public License (GPL), version 2
+ */
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+#include <linux/slab.h>
+
+#include "i2c-stm32.h"
+
+/* STM32F7 I2C registers */
+#define STM32F7_I2C_CR1 0x00
+#define STM32F7_I2C_CR2 0x04
+#define STM32F7_I2C_TIMINGR 0x10
+#define STM32F7_I2C_ISR 0x18
+#define STM32F7_I2C_ICR 0x1C
+#define STM32F7_I2C_RXDR 0x24
+#define STM32F7_I2C_TXDR 0x28
+
+/* STM32F7 I2C control 1 */
+#define STM32F7_I2C_CR1_ANFOFF BIT(12)
+#define STM32F7_I2C_CR1_ERRIE BIT(7)
+#define STM32F7_I2C_CR1_TCIE BIT(6)
+#define STM32F7_I2C_CR1_STOPIE BIT(5)
+#define STM32F7_I2C_CR1_NACKIE BIT(4)
+#define STM32F7_I2C_CR1_ADDRIE BIT(3)
+#define STM32F7_I2C_CR1_RXIE BIT(2)
+#define STM32F7_I2C_CR1_TXIE BIT(1)
+#define STM32F7_I2C_CR1_PE BIT(0)
+#define STM32F7_I2C_ALL_IRQ_MASK (STM32F7_I2C_CR1_ERRIE \
+ | STM32F7_I2C_CR1_TCIE \
+ | STM32F7_I2C_CR1_STOPIE \
+ | STM32F7_I2C_CR1_NACKIE \
+ | STM32F7_I2C_CR1_RXIE \
+ | STM32F7_I2C_CR1_TXIE)
+
+/* STM32F7 I2C control 2 */
+#define STM32F7_I2C_CR2_RELOAD BIT(24)
+#define STM32F7_I2C_CR2_NBYTES_MASK GENMASK(23, 16)
+#define STM32F7_I2C_CR2_NBYTES(n) (((n) & 0xff) << 16)
+#define STM32F7_I2C_CR2_NACK BIT(15)
+#define STM32F7_I2C_CR2_STOP BIT(14)
+#define STM32F7_I2C_CR2_START BIT(13)
+#define STM32F7_I2C_CR2_RD_WRN BIT(10)
+#define STM32F7_I2C_CR2_SADD7_MASK GENMASK(7, 1)
+#define STM32F7_I2C_CR2_SADD7(n) (((n) & 0x7f) << 1)
+
+/* STM32F7 I2C Interrupt Status */
+#define STM32F7_I2C_ISR_BUSY BIT(15)
+#define STM32F7_I2C_ISR_ARLO BIT(9)
+#define STM32F7_I2C_ISR_BERR BIT(8)
+#define STM32F7_I2C_ISR_TCR BIT(7)
+#define STM32F7_I2C_ISR_TC BIT(6)
+#define STM32F7_I2C_ISR_STOPF BIT(5)
+#define STM32F7_I2C_ISR_NACKF BIT(4)
+#define STM32F7_I2C_ISR_RXNE BIT(2)
+#define STM32F7_I2C_ISR_TXIS BIT(1)
+
+/* STM32F7 I2C Interrupt Clear */
+#define STM32F7_I2C_ICR_ARLOCF BIT(9)
+#define STM32F7_I2C_ICR_BERRCF BIT(8)
+#define STM32F7_I2C_ICR_STOPCF BIT(5)
+#define STM32F7_I2C_ICR_NACKCF BIT(4)
+
+/* STM32F7 I2C Timing */
+#define STM32F7_I2C_TIMINGR_PRESC(n) (((n) & 0xf) << 28)
+#define STM32F7_I2C_TIMINGR_SCLDEL(n) (((n) & 0xf) << 20)
+#define STM32F7_I2C_TIMINGR_SDADEL(n) (((n) & 0xf) << 16)
+#define STM32F7_I2C_TIMINGR_SCLH(n) (((n) & 0xff) << 8)
+#define STM32F7_I2C_TIMINGR_SCLL(n) ((n) & 0xff)
+
+#define STM32F7_I2C_MAX_LEN 0xff
+
+#define STM32F7_I2C_DNF_DEFAULT 0
+#define STM32F7_I2C_DNF_MAX 16
+
+#define STM32F7_I2C_ANALOG_FILTER_ENABLE 1
+#define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */
+#define STM32F7_I2C_ANALOG_FILTER_DELAY_MAX 260 /* ns */
+
+#define STM32F7_I2C_RISE_TIME_DEFAULT 25 /* ns */
+#define STM32F7_I2C_FALL_TIME_DEFAULT 10 /* ns */
+
+#define STM32F7_PRESC_MAX BIT(4)
+#define STM32F7_SCLDEL_MAX BIT(4)
+#define STM32F7_SDADEL_MAX BIT(4)
+#define STM32F7_SCLH_MAX BIT(8)
+#define STM32F7_SCLL_MAX BIT(8)
+
+/**
+ * struct stm32f7_i2c_spec - private i2c specification timing
+ * @rate: I2C bus speed (Hz)
+ * @rate_min: 80% of I2C bus speed (Hz)
+ * @rate_max: 100% of I2C bus speed (Hz)
+ * @fall_max: Max fall time of both SDA and SCL signals (ns)
+ * @rise_max: Max rise time of both SDA and SCL signals (ns)
+ * @hddat_min: Min data hold time (ns)
+ * @vddat_max: Max data valid time (ns)
+ * @sudat_min: Min data setup time (ns)
+ * @l_min: Min low period of the SCL clock (ns)
+ * @h_min: Min high period of the SCL clock (ns)
+ */
+struct stm32f7_i2c_spec {
+ u32 rate;
+ u32 rate_min;
+ u32 rate_max;
+ u32 fall_max;
+ u32 rise_max;
+ u32 hddat_min;
+ u32 vddat_max;
+ u32 sudat_min;
+ u32 l_min;
+ u32 h_min;
+};
+
+/**
+ * struct stm32f7_i2c_setup - private I2C timing setup parameters
+ * @speed: I2C speed mode (standard, Fast Plus)
+ * @speed_freq: I2C speed frequency (Hz)
+ * @clock_src: I2C clock source frequency (Hz)
+ * @rise_time: Rise time (ns)
+ * @fall_time: Fall time (ns)
+ * @dnf: Digital filter coefficient (0-16)
+ * @analog_filter: Analog filter delay (On/Off)
+ */
+struct stm32f7_i2c_setup {
+ enum stm32_i2c_speed speed;
+ u32 speed_freq;
+ u32 clock_src;
+ u32 rise_time;
+ u32 fall_time;
+ u8 dnf;
+ bool analog_filter;
+};
+
+/**
+ * struct stm32f7_i2c_timings - private I2C output parameters
+ * @prec: Prescaler value
+ * @scldel: Data setup time
+ * @sdadel: Data hold time
+ * @sclh: SCL high period (master mode)
+ * @sclh: SCL low period (master mode)
+ */
+struct stm32f7_i2c_timings {
+ struct list_head node;
+ u8 presc;
+ u8 scldel;
+ u8 sdadel;
+ u8 sclh;
+ u8 scll;
+};
+
+/**
+ * struct stm32f7_i2c_msg - client specific data
+ * @addr: 8-bit slave addr, including r/w bit
+ * @count: number of bytes to be transferred
+ * @buf: data buffer
+ * @result: result of the transfer
+ * @stop: last I2C msg to be sent, i.e. STOP to be generated
+ */
+struct stm32f7_i2c_msg {
+ u8 addr;
+ u32 count;
+ u8 *buf;
+ int result;
+ bool stop;
+};
+
+/**
+ * struct stm32f7_i2c_dev - private data of the controller
+ * @adap: I2C adapter for this controller
+ * @dev: device for this controller
+ * @base: virtual memory area
+ * @complete: completion of I2C message
+ * @clk: hw i2c clock
+ * @speed: I2C clock frequency of the controller. Standard, Fast or Fast+
+ * @msg: Pointer to data to be written
+ * @msg_num: number of I2C messages to be executed
+ * @msg_id: message identifiant
+ * @f7_msg: customized i2c msg for driver usage
+ * @setup: I2C timing input setup
+ * @timing: I2C computed timings
+ */
+struct stm32f7_i2c_dev {
+ struct i2c_adapter adap;
+ struct device *dev;
+ void __iomem *base;
+ struct completion complete;
+ struct clk *clk;
+ int speed;
+ struct i2c_msg *msg;
+ unsigned int msg_num;
+ unsigned int msg_id;
+ struct stm32f7_i2c_msg f7_msg;
+ struct stm32f7_i2c_setup *setup;
+ struct stm32f7_i2c_timings timing;
+};
+
+/**
+ * All these values are coming from I2C Specification, Version 6.0, 4th of
+ * April 2014.
+ *
+ * Table10. Characteristics of the SDA and SCL bus lines for Standard, Fast,
+ * and Fast-mode Plus I2C-bus devices
+ */
+static struct stm32f7_i2c_spec i2c_specs[] = {
+ [STM32_I2C_SPEED_STANDARD] = {
+ .rate = 100000,
+ .rate_min = 80000,
+ .rate_max = 100000,
+ .fall_max = 300,
+ .rise_max = 1000,
+ .hddat_min = 0,
+ .vddat_max = 3450,
+ .sudat_min = 250,
+ .l_min = 4700,
+ .h_min = 4000,
+ },
+ [STM32_I2C_SPEED_FAST] = {
+ .rate = 400000,
+ .rate_min = 320000,
+ .rate_max = 400000,
+ .fall_max = 300,
+ .rise_max = 300,
+ .hddat_min = 0,
+ .vddat_max = 900,
+ .sudat_min = 100,
+ .l_min = 1300,
+ .h_min = 600,
+ },
+ [STM32_I2C_SPEED_FAST_PLUS] = {
+ .rate = 1000000,
+ .rate_min = 800000,
+ .rate_max = 1000000,
+ .fall_max = 100,
+ .rise_max = 120,
+ .hddat_min = 0,
+ .vddat_max = 450,
+ .sudat_min = 50,
+ .l_min = 500,
+ .h_min = 260,
+ },
+};
+
+struct stm32f7_i2c_setup stm32f7_setup = {
+ .rise_time = STM32F7_I2C_RISE_TIME_DEFAULT,
+ .fall_time = STM32F7_I2C_FALL_TIME_DEFAULT,
+ .dnf = STM32F7_I2C_DNF_DEFAULT,
+ .analog_filter = STM32F7_I2C_ANALOG_FILTER_ENABLE,
+};
+
+static inline void stm32f7_i2c_set_bits(void __iomem *reg, u32 mask)
+{
+ writel_relaxed(readl_relaxed(reg) | mask, reg);
+}
+
+static inline void stm32f7_i2c_clr_bits(void __iomem *reg, u32 mask)
+{
+ writel_relaxed(readl_relaxed(reg) & ~mask, reg);
+}
+
+static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev,
+ struct stm32f7_i2c_setup *setup,
+ struct stm32f7_i2c_timings *output)
+{
+ u32 p_prev = STM32F7_PRESC_MAX;
+ u32 i2cclk = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
+ setup->clock_src);
+ u32 i2cbus = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
+ setup->speed_freq);
+ u32 clk_error_prev = i2cbus;
+ u32 tsync;
+ u32 af_delay_min, af_delay_max;
+ u32 dnf_delay;
+ u32 clk_min, clk_max;
+ int sdadel_min, sdadel_max;
+ int scldel_min;
+ struct stm32f7_i2c_timings *v, *_v, *s;
+ struct list_head solutions;
+ u16 p, l, a, h;
+ int ret = 0;
+
+ if (setup->speed >= STM32_I2C_SPEED_END) {
+ dev_err(i2c_dev->dev, "speed out of bound {%d/%d}\n",
+ setup->speed, STM32_I2C_SPEED_END - 1);
+ return -EINVAL;
+ }
+
+ if ((setup->rise_time > i2c_specs[setup->speed].rise_max) ||
+ (setup->fall_time > i2c_specs[setup->speed].fall_max)) {
+ dev_err(i2c_dev->dev,
+ "timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
+ setup->rise_time, i2c_specs[setup->speed].rise_max,
+ setup->fall_time, i2c_specs[setup->speed].fall_max);
+ return -EINVAL;
+ }
+
+ if (setup->dnf > STM32F7_I2C_DNF_MAX) {
+ dev_err(i2c_dev->dev,
+ "DNF out of bound %d/%d\n",
+ setup->dnf, STM32F7_I2C_DNF_MAX);
+ return -EINVAL;
+ }
+
+ if (setup->speed_freq > i2c_specs[setup->speed].rate) {
+ dev_err(i2c_dev->dev, "ERROR: Freq {%d/%d}\n",
+ setup->speed_freq, i2c_specs[setup->speed].rate);
+ return -EINVAL;
+ }
+
+ /* Analog and Digital Filters */
+ af_delay_min =
+ (setup->analog_filter ?
+ STM32F7_I2C_ANALOG_FILTER_DELAY_MIN : 0);
+ af_delay_max =
+ (setup->analog_filter ?
+ STM32F7_I2C_ANALOG_FILTER_DELAY_MAX : 0);
+ dnf_delay = setup->dnf * i2cclk;
+
+ sdadel_min = setup->fall_time - i2c_specs[setup->speed].hddat_min -
+ af_delay_min - (setup->dnf + 3) * i2cclk;
+
+ sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -
+ af_delay_max - (setup->dnf + 4) * i2cclk;
+
+ scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min;
+
+ if (sdadel_min < 0)
+ sdadel_min = 0;
+ if (sdadel_max < 0)
+ sdadel_max = 0;
+
+ dev_dbg(i2c_dev->dev, "SDADEL(min/max): %i/%i, SCLDEL(Min): %i\n",
+ sdadel_min, sdadel_max, scldel_min);
+
+ INIT_LIST_HEAD(&solutions);
+ /* Compute possible values for PRESC, SCLDEL and SDADEL */
+ for (p = 0; p < STM32F7_PRESC_MAX; p++) {
+ for (l = 0; l < STM32F7_SCLDEL_MAX; l++) {
+ u32 scldel = (l + 1) * (p + 1) * i2cclk;
+
+ if (scldel < scldel_min)
+ continue;
+
+ for (a = 0; a < STM32F7_SDADEL_MAX; a++) {
+ u32 sdadel = (a * (p + 1) + 1) * i2cclk;
+
+ if (((sdadel >= sdadel_min) &&
+ (sdadel <= sdadel_max)) &&
+ (p != p_prev)) {
+ v = kmalloc(sizeof(*v), GFP_KERNEL);
+ if (!v) {
+ ret = -ENOMEM;
+ goto exit;
+ }
+
+ v->presc = p;
+ v->scldel = l;
+ v->sdadel = a;
+ p_prev = p;
+
+ list_add_tail(&v->node,
+ &solutions);
+ }
+ }
+ }
+ }
+
+ if (list_empty(&solutions)) {
+ dev_err(i2c_dev->dev, "no Prescaler solution\n");
+ ret = -EPERM;
+ goto exit;
+ }
+
+ tsync = af_delay_min + dnf_delay + (2 * i2cclk);
+ s = NULL;
+ clk_max = NSEC_PER_SEC / i2c_specs[setup->speed].rate_min;
+ clk_min = NSEC_PER_SEC / i2c_specs[setup->speed].rate_max;
+
+ /*
+ * Among Prescaler possibilities discovered above figures out SCL Low
+ * and High Period. Provided:
+ * - SCL Low Period has to be higher than SCL Clock Low Period
+ * defined by I2C Specification. I2C Clock has to be lower than
+ * (SCL Low Period - Analog/Digital filters) / 4.
+ * - SCL High Period has to be lower than SCL Clock High Period
+ * defined by I2C Specification
+ * - I2C Clock has to be lower than SCL High Period
+ */
+ list_for_each_entry(v, &solutions, node) {
+ u32 prescaler = (v->presc + 1) * i2cclk;
+
+ for (l = 0; l < STM32F7_SCLL_MAX; l++) {
+ u32 tscl_l = (l + 1) * prescaler + tsync;
+
+ if ((tscl_l < i2c_specs[setup->speed].l_min) ||
+ (i2cclk >=
+ ((tscl_l - af_delay_min - dnf_delay) / 4))) {
+ continue;
+ }
+
+ for (h = 0; h < STM32F7_SCLH_MAX; h++) {
+ u32 tscl_h = (h + 1) * prescaler + tsync;
+ u32 tscl = tscl_l + tscl_h +
+ setup->rise_time + setup->fall_time;
+
+ if ((tscl >= clk_min) && (tscl <= clk_max) &&
+ (tscl_h >= i2c_specs[setup->speed].h_min) &&
+ (i2cclk < tscl_h)) {
+ int clk_error = tscl - i2cbus;
+
+ if (clk_error < 0)
+ clk_error = -clk_error;
+
+ if (clk_error < clk_error_prev) {
+ clk_error_prev = clk_error;
+ v->scll = l;
+ v->sclh = h;
+ s = v;
+ }
+ }
+ }
+ }
+ }
+
+ if (!s) {
+ dev_err(i2c_dev->dev, "no solution at all\n");
+ ret = -EPERM;
+ goto exit;
+ }
+
+ output->presc = s->presc;
+ output->scldel = s->scldel;
+ output->sdadel = s->sdadel;
+ output->scll = s->scll;
+ output->sclh = s->sclh;
+
+ dev_dbg(i2c_dev->dev,
+ "Presc: %i, scldel: %i, sdadel: %i, scll: %i, sclh: %i\n",
+ output->presc,
+ output->scldel, output->sdadel,
+ output->scll, output->sclh);
+
+exit:
+ /* Release list and memory */
+ list_for_each_entry_safe(v, _v, &solutions, node) {
+ list_del(&v->node);
+ kfree(v);
+ }
+
+ return ret;
+}
+
+static int stm32f7_i2c_setup_timing(struct stm32f7_i2c_dev *i2c_dev,
+ struct stm32f7_i2c_setup *setup)
+{
+ int ret = 0;
+
+ setup->speed = i2c_dev->speed;
+ setup->speed_freq = i2c_specs[setup->speed].rate;
+ setup->clock_src = clk_get_rate(i2c_dev->clk);
+
+ if (!setup->clock_src) {
+ dev_err(i2c_dev->dev, "clock rate is 0\n");
+ return -EINVAL;
+ }
+
+ do {
+ ret = stm32f7_i2c_compute_timing(i2c_dev, setup,
+ &i2c_dev->timing);
+ if (ret) {
+ dev_err(i2c_dev->dev,
+ "failed to compute I2C timings.\n");
+ if (i2c_dev->speed > STM32_I2C_SPEED_STANDARD) {
+ i2c_dev->speed--;
+ setup->speed = i2c_dev->speed;
+ setup->speed_freq =
+ i2c_specs[setup->speed].rate;
+ dev_warn(i2c_dev->dev,
+ "downgrade I2C Speed Freq to (%i)\n",
+ i2c_specs[setup->speed].rate);
+ } else {
+ break;
+ }
+ }
+ } while (ret);
+
+ if (ret) {
+ dev_err(i2c_dev->dev, "Impossible to compute I2C timings.\n");
+ return ret;
+ }
+
+ dev_dbg(i2c_dev->dev, "I2C Speed(%i), Freq(%i), Clk Source(%i)\n",
+ setup->speed, setup->speed_freq, setup->clock_src);
+ dev_dbg(i2c_dev->dev, "I2C Rise(%i) and Fall(%i) Time\n",
+ setup->rise_time, setup->fall_time);
+ dev_dbg(i2c_dev->dev, "I2C Analog Filter(%s), DNF(%i)\n",
+ (setup->analog_filter ? "On" : "Off"), setup->dnf);
+
+ return 0;
+}
+
+static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
+{
+ struct stm32f7_i2c_timings *t = &i2c_dev->timing;
+ u32 timing = 0;
+
+ /* Timing settings */
+ timing |= STM32F7_I2C_TIMINGR_PRESC(t->presc);
+ timing |= STM32F7_I2C_TIMINGR_SCLDEL(t->scldel);
+ timing |= STM32F7_I2C_TIMINGR_SDADEL(t->sdadel);
+ timing |= STM32F7_I2C_TIMINGR_SCLH(t->sclh);
+ timing |= STM32F7_I2C_TIMINGR_SCLL(t->scll);
+ writel_relaxed(timing, i2c_dev->base + STM32F7_I2C_TIMINGR);
+
+ /* Enable I2C */
+ if (i2c_dev->setup->analog_filter)
+ stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
+ STM32F7_I2C_CR1_ANFOFF);
+ else
+ stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
+ STM32F7_I2C_CR1_ANFOFF);
+ stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
+ STM32F7_I2C_CR1_PE);
+}
+
+static void stm32f7_i2c_write_tx_data(struct stm32f7_i2c_dev *i2c_dev)
+{
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ void __iomem *base = i2c_dev->base;
+
+ if (f7_msg->count) {
+ writeb_relaxed(*f7_msg->buf++, base + STM32F7_I2C_TXDR);
+ f7_msg->count--;
+ }
+}
+
+static void stm32f7_i2c_read_rx_data(struct stm32f7_i2c_dev *i2c_dev)
+{
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ void __iomem *base = i2c_dev->base;
+
+ if (f7_msg->count) {
+ *f7_msg->buf++ = readb_relaxed(base + STM32F7_I2C_RXDR);
+ f7_msg->count--;
+ }
+}
+
+static void stm32f7_i2c_reload(struct stm32f7_i2c_dev *i2c_dev)
+{
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ u32 cr2;
+
+ cr2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_CR2);
+
+ cr2 &= ~STM32F7_I2C_CR2_NBYTES_MASK;
+ if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
+ cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
+ } else {
+ cr2 &= ~STM32F7_I2C_CR2_RELOAD;
+ cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
+ }
+
+ writel_relaxed(cr2, i2c_dev->base + STM32F7_I2C_CR2);
+}
+
+static int stm32f7_i2c_wait_free_bus(struct stm32f7_i2c_dev *i2c_dev)
+{
+ u32 status;
+ int ret;
+
+ ret = readl_relaxed_poll_timeout(i2c_dev->base + STM32F7_I2C_ISR,
+ status,
+ !(status & STM32F7_I2C_ISR_BUSY),
+ 10, 1000);
+ if (ret) {
+ dev_dbg(i2c_dev->dev, "bus busy\n");
+ ret = -EBUSY;
+ }
+
+ return ret;
+}
+
+static void stm32f7_i2c_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
+ struct i2c_msg *msg)
+{
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ void __iomem *base = i2c_dev->base;
+ u32 cr1, cr2;
+
+ f7_msg->addr = msg->addr;
+ f7_msg->buf = msg->buf;
+ f7_msg->count = msg->len;
+ f7_msg->result = 0;
+ f7_msg->stop = (i2c_dev->msg_id >= i2c_dev->msg_num - 1);
+
+ reinit_completion(&i2c_dev->complete);
+
+ cr1 = readl_relaxed(base + STM32F7_I2C_CR1);
+ cr2 = readl_relaxed(base + STM32F7_I2C_CR2);
+
+ /* Set transfer direction */
+ cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
+ if (msg->flags & I2C_M_RD)
+ cr2 |= STM32F7_I2C_CR2_RD_WRN;
+
+ /* Set slave address */
+ cr2 &= ~STM32F7_I2C_CR2_SADD7_MASK;
+ cr2 |= STM32F7_I2C_CR2_SADD7(f7_msg->addr);
+
+ /* Set nb bytes to transfer and reload if needed */
+ cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK | STM32F7_I2C_CR2_RELOAD);
+ if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
+ cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
+ cr2 |= STM32F7_I2C_CR2_RELOAD;
+ } else {
+ cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
+ }
+
+ /* Enable NACK, STOP, error and transfer complete interrupts */
+ cr1 |= STM32F7_I2C_CR1_ERRIE | STM32F7_I2C_CR1_TCIE |
+ STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE;
+
+ /* Clear TX/RX interrupt */
+ cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE);
+
+ /* Enable RX/TX interrupt according to msg direction */
+ if (msg->flags & I2C_M_RD)
+ cr1 |= STM32F7_I2C_CR1_RXIE;
+ else
+ cr1 |= STM32F7_I2C_CR1_TXIE;
+
+ /* Configure Start/Repeated Start */
+ cr2 |= STM32F7_I2C_CR2_START;
+
+ /* Write configurations registers */
+ writel_relaxed(cr1, base + STM32F7_I2C_CR1);
+ writel_relaxed(cr2, base + STM32F7_I2C_CR2);
+}
+
+static void stm32f7_i2c_disable_irq(struct stm32f7_i2c_dev *i2c_dev, u32 mask)
+{
+ stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1, mask);
+}
+
+static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
+{
+ struct stm32f7_i2c_dev *i2c_dev = data;
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ void __iomem *base = i2c_dev->base;
+ u32 status, mask;
+
+ status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
+
+ /* Tx empty */
+ if (status & STM32F7_I2C_ISR_TXIS)
+ stm32f7_i2c_write_tx_data(i2c_dev);
+
+ /* RX not empty */
+ if (status & STM32F7_I2C_ISR_RXNE)
+ stm32f7_i2c_read_rx_data(i2c_dev);
+
+ /* NACK received */
+ if (status & STM32F7_I2C_ISR_NACKF) {
+ dev_dbg(i2c_dev->dev, "<%s>: Receive NACK\n", __func__);
+ writel_relaxed(STM32F7_I2C_ICR_NACKCF, base + STM32F7_I2C_ICR);
+ f7_msg->result = -ENXIO;
+ }
+
+ /* STOP detection flag */
+ if (status & STM32F7_I2C_ISR_STOPF) {
+ /* Disable interrupts */
+ stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_ALL_IRQ_MASK);
+
+ /* Clear STOP flag */
+ writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
+
+ complete(&i2c_dev->complete);
+ }
+
+ /* Transfer complete */
+ if (status & STM32F7_I2C_ISR_TC) {
+ if (f7_msg->stop) {
+ mask = STM32F7_I2C_CR2_STOP;
+ stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
+ } else {
+ i2c_dev->msg_id++;
+ i2c_dev->msg++;
+ stm32f7_i2c_xfer_msg(i2c_dev, i2c_dev->msg);
+ }
+ }
+
+ /*
+ * Transfer Complete Reload: 255 data bytes have been transferred
+ * We have to prepare the I2C controller to transfer the remaining
+ * data.
+ */
+ if (status & STM32F7_I2C_ISR_TCR)
+ stm32f7_i2c_reload(i2c_dev);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
+{
+ struct stm32f7_i2c_dev *i2c_dev = data;
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ void __iomem *base = i2c_dev->base;
+ struct device *dev = i2c_dev->dev;
+ u32 status;
+
+ status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
+
+ /* Bus error */
+ if (status & STM32F7_I2C_ISR_BERR) {
+ dev_err(dev, "<%s>: Bus error\n", __func__);
+ writel_relaxed(STM32F7_I2C_ICR_BERRCF, base + STM32F7_I2C_ICR);
+ f7_msg->result = -EIO;
+ }
+
+ /* Arbitration loss */
+ if (status & STM32F7_I2C_ISR_ARLO) {
+ dev_dbg(dev, "<%s>: Arbitration loss\n", __func__);
+ writel_relaxed(STM32F7_I2C_ICR_ARLOCF, base + STM32F7_I2C_ICR);
+ f7_msg->result = -EAGAIN;
+ }
+
+ stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_ALL_IRQ_MASK);
+
+ complete(&i2c_dev->complete);
+
+ return IRQ_HANDLED;
+}
+
+static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
+ struct i2c_msg msgs[], int num)
+{
+ struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap);
+ struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
+ unsigned long time_left;
+ int ret;
+
+ i2c_dev->msg = msgs;
+ i2c_dev->msg_num = num;
+ i2c_dev->msg_id = 0;
+
+ ret = clk_enable(i2c_dev->clk);
+ if (ret) {
+ dev_err(i2c_dev->dev, "Failed to enable clock\n");
+ return ret;
+ }
+
+ ret = stm32f7_i2c_wait_free_bus(i2c_dev);
+ if (ret)
+ goto clk_free;
+
+ stm32f7_i2c_xfer_msg(i2c_dev, msgs);
+
+ time_left = wait_for_completion_timeout(&i2c_dev->complete,
+ i2c_dev->adap.timeout);
+ ret = f7_msg->result;
+
+ if (!time_left) {
+ dev_dbg(i2c_dev->dev, "Access to slave 0x%x timed out\n",
+ i2c_dev->msg->addr);
+ ret = -ETIMEDOUT;
+ }
+
+clk_free:
+ clk_disable(i2c_dev->clk);
+
+ return (ret < 0) ? ret : num;
+}
+
+static u32 stm32f7_i2c_func(struct i2c_adapter *adap)
+{
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static struct i2c_algorithm stm32f7_i2c_algo = {
+ .master_xfer = stm32f7_i2c_xfer,
+ .functionality = stm32f7_i2c_func,
+};
+
+static int stm32f7_i2c_probe(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node;
+ struct stm32f7_i2c_dev *i2c_dev;
+ const struct stm32f7_i2c_setup *setup;
+ struct resource *res;
+ u32 irq_error, irq_event, clk_rate, rise_time, fall_time;
+ struct i2c_adapter *adap;
+ struct reset_control *rst;
+ int ret;
+
+ i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
+ if (!i2c_dev)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ i2c_dev->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(i2c_dev->base))
+ return PTR_ERR(i2c_dev->base);
+
+ irq_event = irq_of_parse_and_map(np, 0);
+ if (!irq_event) {
+ dev_err(&pdev->dev, "IRQ event missing or invalid\n");
+ return -EINVAL;
+ }
+
+ irq_error = irq_of_parse_and_map(np, 1);
+ if (!irq_error) {
+ dev_err(&pdev->dev, "IRQ error missing or invalid\n");
+ return -EINVAL;
+ }
+
+ i2c_dev->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(i2c_dev->clk)) {
+ dev_err(&pdev->dev, "Error: Missing controller clock\n");
+ return PTR_ERR(i2c_dev->clk);
+ }
+ ret = clk_prepare_enable(i2c_dev->clk);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to prepare_enable clock\n");
+ return ret;
+ }
+
+ i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
+ ret = device_property_read_u32(&pdev->dev, "clock-frequency",
+ &clk_rate);
+ if (!ret && clk_rate >= 1000000)
+ i2c_dev->speed = STM32_I2C_SPEED_FAST_PLUS;
+ else if (!ret && clk_rate >= 400000)
+ i2c_dev->speed = STM32_I2C_SPEED_FAST;
+ else if (!ret && clk_rate >= 100000)
+ i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
+
+ rst = devm_reset_control_get(&pdev->dev, NULL);
+ if (IS_ERR(rst)) {
+ dev_err(&pdev->dev, "Error: Missing controller reset\n");
+ ret = PTR_ERR(rst);
+ goto clk_free;
+ }
+ reset_control_assert(rst);
+ udelay(2);
+ reset_control_deassert(rst);
+
+ i2c_dev->dev = &pdev->dev;
+
+ ret = devm_request_irq(&pdev->dev, irq_event, stm32f7_i2c_isr_event, 0,
+ pdev->name, i2c_dev);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to request irq event %i\n",
+ irq_event);
+ goto clk_free;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq_error, stm32f7_i2c_isr_error, 0,
+ pdev->name, i2c_dev);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to request irq error %i\n",
+ irq_error);
+ goto clk_free;
+ }
+
+ setup = of_device_get_match_data(&pdev->dev);
+ i2c_dev->setup->rise_time = setup->rise_time;
+ i2c_dev->setup->fall_time = setup->fall_time;
+ i2c_dev->setup->dnf = setup->dnf;
+ i2c_dev->setup->analog_filter = setup->analog_filter;
+
+ ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns",
+ &rise_time);
+ if (!ret)
+ i2c_dev->setup->rise_time = rise_time;
+
+ ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-falling-time-ns",
+ &fall_time);
+ if (!ret)
+ i2c_dev->setup->fall_time = fall_time;
+
+ ret = stm32f7_i2c_setup_timing(i2c_dev, i2c_dev->setup);
+ if (ret)
+ goto clk_free;
+
+ stm32f7_i2c_hw_config(i2c_dev);
+
+ adap = &i2c_dev->adap;
+ i2c_set_adapdata(adap, i2c_dev);
+ snprintf(adap->name, sizeof(adap->name), "STM32F7 I2C(%pa)",
+ &res->start);
+ adap->owner = THIS_MODULE;
+ adap->timeout = 2 * HZ;
+ adap->retries = 3;
+ adap->algo = &stm32f7_i2c_algo;
+ adap->dev.parent = &pdev->dev;
+ adap->dev.of_node = pdev->dev.of_node;
+
+ init_completion(&i2c_dev->complete);
+
+ ret = i2c_add_adapter(adap);
+ if (ret)
+ goto clk_free;
+
+ platform_set_drvdata(pdev, i2c_dev);
+
+ clk_disable(i2c_dev->clk);
+
+ dev_info(i2c_dev->dev, "STM32F7 I2C-%d bus adapter\n", adap->nr);
+
+ return 0;
+
+clk_free:
+ clk_disable_unprepare(i2c_dev->clk);
+
+ return ret;
+}
+
+static int stm32f7_i2c_remove(struct platform_device *pdev)
+{
+ struct stm32f7_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
+
+ i2c_del_adapter(&i2c_dev->adap);
+
+ clk_unprepare(i2c_dev->clk);
+
+ return 0;
+}
+
+static const struct of_device_id stm32f7_i2c_match[] = {
+ { .compatible = "st,stm32f7-i2c", .data = &stm32f7_setup},
+ {},
+};
+MODULE_DEVICE_TABLE(of, stm32f7_i2c_match);
+
+static struct platform_driver stm32f7_i2c_driver = {
+ .driver = {
+ .name = "stm32f7-i2c",
+ .of_match_table = stm32f7_i2c_match,
+ },
+ .probe = stm32f7_i2c_probe,
+ .remove = stm32f7_i2c_remove,
+};
+
+module_platform_driver(stm32f7_i2c_driver);
+
+MODULE_AUTHOR("M'boumba Cedric Madianga <[email protected]>");
+MODULE_DESCRIPTION("STMicroelectronics STM32F7 I2C driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/i2c/busses/i2c-sun6i-p2wi.c b/drivers/i2c/busses/i2c-sun6i-p2wi.c
index 7668e2e9b8fd..7c07ce116e38 100644
--- a/drivers/i2c/busses/i2c-sun6i-p2wi.c
+++ b/drivers/i2c/busses/i2c-sun6i-p2wi.c
@@ -223,8 +223,8 @@ static int p2wi_probe(struct platform_device *pdev)
if (childnp) {
ret = of_property_read_u32(childnp, "reg", &slave_addr);
if (ret) {
- dev_err(dev, "invalid slave address on node %s\n",
- childnp->full_name);
+ dev_err(dev, "invalid slave address on node %pOF\n",
+ childnp);
return -EINVAL;
}
@@ -258,7 +258,7 @@ static int p2wi_probe(struct platform_device *pdev)
parent_clk_freq = clk_get_rate(p2wi->clk);
- p2wi->rstc = devm_reset_control_get(dev, NULL);
+ p2wi->rstc = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(p2wi->rstc)) {
ret = PTR_ERR(p2wi->rstc);
dev_err(dev, "failed to retrieve reset controller: %d\n", ret);
diff --git a/drivers/i2c/busses/i2c-taos-evm.c b/drivers/i2c/busses/i2c-taos-evm.c
index 210ca82f8aa0..addd90a8cb59 100644
--- a/drivers/i2c/busses/i2c-taos-evm.c
+++ b/drivers/i2c/busses/i2c-taos-evm.c
@@ -291,7 +291,7 @@ static void taos_disconnect(struct serio *serio)
dev_info(&serio->dev, "Disconnected from TAOS EVM\n");
}
-static struct serio_device_id taos_serio_ids[] = {
+static const struct serio_device_id taos_serio_ids[] = {
{
.type = SERIO_RS232,
.proto = SERIO_TAOSEVM,
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 4af9bbae20df..60292d243e24 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -793,7 +793,7 @@ static const struct i2c_algorithm tegra_i2c_algo = {
};
/* payload size is only 12 bit */
-static struct i2c_adapter_quirks tegra_i2c_quirks = {
+static const struct i2c_adapter_quirks tegra_i2c_quirks = {
.max_read_len = 4096,
.max_write_len = 4096,
};
@@ -911,7 +911,7 @@ static int tegra_i2c_probe(struct platform_device *pdev)
i2c_dev->cont_id = pdev->id;
i2c_dev->dev = &pdev->dev;
- i2c_dev->rst = devm_reset_control_get(&pdev->dev, "i2c");
+ i2c_dev->rst = devm_reset_control_get_exclusive(&pdev->dev, "i2c");
if (IS_ERR(i2c_dev->rst)) {
dev_err(&pdev->dev, "missing controller reset\n");
return PTR_ERR(i2c_dev->rst);
diff --git a/drivers/i2c/busses/i2c-thunderx-pcidrv.c b/drivers/i2c/busses/i2c-thunderx-pcidrv.c
index ea35a895b568..df0976f4432a 100644
--- a/drivers/i2c/busses/i2c-thunderx-pcidrv.c
+++ b/drivers/i2c/busses/i2c-thunderx-pcidrv.c
@@ -75,7 +75,7 @@ static const struct i2c_algorithm thunderx_i2c_algo = {
.functionality = thunderx_i2c_functionality,
};
-static struct i2c_adapter thunderx_i2c_ops = {
+static const struct i2c_adapter thunderx_i2c_ops = {
.owner = THIS_MODULE,
.name = "ThunderX adapter",
.algo = &thunderx_i2c_algo,
diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c
index beee31892295..9918bdd81619 100644
--- a/drivers/i2c/busses/i2c-uniphier-f.c
+++ b/drivers/i2c/busses/i2c-uniphier-f.c
@@ -97,6 +97,7 @@ struct uniphier_fi2c_priv {
int error;
unsigned int flags;
unsigned int busy_cnt;
+ unsigned int clk_cycle;
};
static void uniphier_fi2c_fill_txfifo(struct uniphier_fi2c_priv *priv,
@@ -461,9 +462,9 @@ static struct i2c_bus_recovery_info uniphier_fi2c_bus_recovery_info = {
.unprepare_recovery = uniphier_fi2c_unprepare_recovery,
};
-static void uniphier_fi2c_hw_init(struct uniphier_fi2c_priv *priv,
- u32 bus_speed, unsigned long clk_rate)
+static void uniphier_fi2c_hw_init(struct uniphier_fi2c_priv *priv)
{
+ unsigned int cyc = priv->clk_cycle;
u32 tmp;
tmp = readl(priv->membase + UNIPHIER_FI2C_CR);
@@ -472,12 +473,10 @@ static void uniphier_fi2c_hw_init(struct uniphier_fi2c_priv *priv,
uniphier_fi2c_reset(priv);
- tmp = clk_rate / bus_speed;
-
- writel(tmp, priv->membase + UNIPHIER_FI2C_CYC);
- writel(tmp / 2, priv->membase + UNIPHIER_FI2C_LCTL);
- writel(tmp / 2, priv->membase + UNIPHIER_FI2C_SSUT);
- writel(tmp / 16, priv->membase + UNIPHIER_FI2C_DSUT);
+ writel(cyc, priv->membase + UNIPHIER_FI2C_CYC);
+ writel(cyc / 2, priv->membase + UNIPHIER_FI2C_LCTL);
+ writel(cyc / 2, priv->membase + UNIPHIER_FI2C_SSUT);
+ writel(cyc / 16, priv->membase + UNIPHIER_FI2C_DSUT);
uniphier_fi2c_prepare_operation(priv);
}
@@ -531,6 +530,7 @@ static int uniphier_fi2c_probe(struct platform_device *pdev)
goto disable_clk;
}
+ priv->clk_cycle = clk_rate / bus_speed;
init_completion(&priv->comp);
priv->adap.owner = THIS_MODULE;
priv->adap.algo = &uniphier_fi2c_algo;
@@ -541,7 +541,7 @@ static int uniphier_fi2c_probe(struct platform_device *pdev)
i2c_set_adapdata(&priv->adap, priv);
platform_set_drvdata(pdev, priv);
- uniphier_fi2c_hw_init(priv, bus_speed, clk_rate);
+ uniphier_fi2c_hw_init(priv);
ret = devm_request_irq(dev, irq, uniphier_fi2c_interrupt, 0,
pdev->name, priv);
@@ -568,6 +568,33 @@ static int uniphier_fi2c_remove(struct platform_device *pdev)
return 0;
}
+static int __maybe_unused uniphier_fi2c_suspend(struct device *dev)
+{
+ struct uniphier_fi2c_priv *priv = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(priv->clk);
+
+ return 0;
+}
+
+static int __maybe_unused uniphier_fi2c_resume(struct device *dev)
+{
+ struct uniphier_fi2c_priv *priv = dev_get_drvdata(dev);
+ int ret;
+
+ ret = clk_prepare_enable(priv->clk);
+ if (ret)
+ return ret;
+
+ uniphier_fi2c_hw_init(priv);
+
+ return 0;
+}
+
+static const struct dev_pm_ops uniphier_fi2c_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(uniphier_fi2c_suspend, uniphier_fi2c_resume)
+};
+
static const struct of_device_id uniphier_fi2c_match[] = {
{ .compatible = "socionext,uniphier-fi2c" },
{ /* sentinel */ }
@@ -580,6 +607,7 @@ static struct platform_driver uniphier_fi2c_drv = {
.driver = {
.name = "uniphier-fi2c",
.of_match_table = uniphier_fi2c_match,
+ .pm = &uniphier_fi2c_pm_ops,
},
};
module_platform_driver(uniphier_fi2c_drv);
diff --git a/drivers/i2c/busses/i2c-uniphier.c b/drivers/i2c/busses/i2c-uniphier.c
index 777c0fe93653..bb181b088291 100644
--- a/drivers/i2c/busses/i2c-uniphier.c
+++ b/drivers/i2c/busses/i2c-uniphier.c
@@ -53,6 +53,7 @@ struct uniphier_i2c_priv {
void __iomem *membase;
struct clk *clk;
unsigned int busy_cnt;
+ unsigned int clk_cycle;
};
static irqreturn_t uniphier_i2c_interrupt(int irq, void *dev_id)
@@ -316,13 +317,13 @@ static struct i2c_bus_recovery_info uniphier_i2c_bus_recovery_info = {
.unprepare_recovery = uniphier_i2c_unprepare_recovery,
};
-static void uniphier_i2c_hw_init(struct uniphier_i2c_priv *priv,
- u32 bus_speed, unsigned long clk_rate)
+static void uniphier_i2c_hw_init(struct uniphier_i2c_priv *priv)
{
+ unsigned int cyc = priv->clk_cycle;
+
uniphier_i2c_reset(priv, true);
- writel((clk_rate / bus_speed / 2 << 16) | (clk_rate / bus_speed),
- priv->membase + UNIPHIER_I2C_CLK);
+ writel((cyc / 2 << 16) | cyc, priv->membase + UNIPHIER_I2C_CLK);
uniphier_i2c_reset(priv, false);
}
@@ -376,6 +377,7 @@ static int uniphier_i2c_probe(struct platform_device *pdev)
goto disable_clk;
}
+ priv->clk_cycle = clk_rate / bus_speed;
init_completion(&priv->comp);
priv->adap.owner = THIS_MODULE;
priv->adap.algo = &uniphier_i2c_algo;
@@ -386,7 +388,7 @@ static int uniphier_i2c_probe(struct platform_device *pdev)
i2c_set_adapdata(&priv->adap, priv);
platform_set_drvdata(pdev, priv);
- uniphier_i2c_hw_init(priv, bus_speed, clk_rate);
+ uniphier_i2c_hw_init(priv);
ret = devm_request_irq(dev, irq, uniphier_i2c_interrupt, 0, pdev->name,
priv);
@@ -413,6 +415,33 @@ static int uniphier_i2c_remove(struct platform_device *pdev)
return 0;
}
+static int __maybe_unused uniphier_i2c_suspend(struct device *dev)
+{
+ struct uniphier_i2c_priv *priv = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(priv->clk);
+
+ return 0;
+}
+
+static int __maybe_unused uniphier_i2c_resume(struct device *dev)
+{
+ struct uniphier_i2c_priv *priv = dev_get_drvdata(dev);
+ int ret;
+
+ ret = clk_prepare_enable(priv->clk);
+ if (ret)
+ return ret;
+
+ uniphier_i2c_hw_init(priv);
+
+ return 0;
+}
+
+static const struct dev_pm_ops uniphier_i2c_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(uniphier_i2c_suspend, uniphier_i2c_resume)
+};
+
static const struct of_device_id uniphier_i2c_match[] = {
{ .compatible = "socionext,uniphier-i2c" },
{ /* sentinel */ }
@@ -425,6 +454,7 @@ static struct platform_driver uniphier_i2c_drv = {
.driver = {
.name = "uniphier-i2c",
.of_match_table = uniphier_i2c_match,
+ .pm = &uniphier_i2c_pm_ops,
},
};
module_platform_driver(uniphier_i2c_drv);
diff --git a/drivers/i2c/busses/i2c-versatile.c b/drivers/i2c/busses/i2c-versatile.c
index c73d2d22009e..f1ab2a637ec0 100644
--- a/drivers/i2c/busses/i2c-versatile.c
+++ b/drivers/i2c/busses/i2c-versatile.c
@@ -55,7 +55,7 @@ static int i2c_versatile_getscl(void *data)
return !!(readl(i2c->base + I2C_CONTROL) & SCL);
}
-static struct i2c_algo_bit_data i2c_versatile_algo = {
+static const struct i2c_algo_bit_data i2c_versatile_algo = {
.setsda = i2c_versatile_setsda,
.setscl = i2c_versatile_setscl,
.getsda = i2c_versatile_getsda,
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 66bce3b311a1..ae6ed254e01d 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -721,7 +721,7 @@ static const struct i2c_algorithm xiic_algorithm = {
.functionality = xiic_func,
};
-static struct i2c_adapter xiic_adapter = {
+static const struct i2c_adapter xiic_adapter = {
.owner = THIS_MODULE,
.name = DRIVER_NAME,
.class = I2C_CLASS_DEPRECATED,
@@ -853,8 +853,7 @@ MODULE_DEVICE_TABLE(of, xiic_of_match);
static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct xiic_i2c *i2c = platform_get_drvdata(pdev);
+ struct xiic_i2c *i2c = dev_get_drvdata(dev);
clk_disable(i2c->clk);
@@ -863,8 +862,7 @@ static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev)
static int __maybe_unused cdns_i2c_runtime_resume(struct device *dev)
{
- struct platform_device *pdev = to_platform_device(dev);
- struct xiic_i2c *i2c = platform_get_drvdata(pdev);
+ struct xiic_i2c *i2c = dev_get_drvdata(dev);
int ret;
ret = clk_enable(i2c->clk);
diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c
index ccf82fdbcd8e..8d474bb1dc15 100644
--- a/drivers/i2c/i2c-core-of.c
+++ b/drivers/i2c/i2c-core-of.c
@@ -32,18 +32,17 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
u32 addr;
int len;
- dev_dbg(&adap->dev, "of_i2c: register %s\n", node->full_name);
+ dev_dbg(&adap->dev, "of_i2c: register %pOF\n", node);
if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) {
- dev_err(&adap->dev, "of_i2c: modalias failure on %s\n",
- node->full_name);
+ dev_err(&adap->dev, "of_i2c: modalias failure on %pOF\n",
+ node);
return ERR_PTR(-EINVAL);
}
addr_be = of_get_property(node, "reg", &len);
if (!addr_be || (len < sizeof(*addr_be))) {
- dev_err(&adap->dev, "of_i2c: invalid reg on %s\n",
- node->full_name);
+ dev_err(&adap->dev, "of_i2c: invalid reg on %pOF\n", node);
return ERR_PTR(-EINVAL);
}
@@ -59,8 +58,8 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
}
if (i2c_check_addr_validity(addr, info.flags)) {
- dev_err(&adap->dev, "of_i2c: invalid addr=%x on %s\n",
- addr, node->full_name);
+ dev_err(&adap->dev, "of_i2c: invalid addr=%x on %pOF\n",
+ addr, node);
return ERR_PTR(-EINVAL);
}
@@ -76,8 +75,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
result = i2c_new_device(adap, &info);
if (result == NULL) {
- dev_err(&adap->dev, "of_i2c: Failure registering %s\n",
- node->full_name);
+ dev_err(&adap->dev, "of_i2c: Failure registering %pOF\n", node);
of_node_put(node);
return ERR_PTR(-EINVAL);
}
@@ -106,8 +104,8 @@ void of_i2c_register_devices(struct i2c_adapter *adap)
client = of_i2c_register_device(adap, node);
if (IS_ERR(client)) {
dev_warn(&adap->dev,
- "Failed to create I2C device for %s\n",
- node->full_name);
+ "Failed to create I2C device for %pOF\n",
+ node);
of_node_clear_flag(node, OF_POPULATED);
}
}
@@ -243,8 +241,8 @@ static int of_i2c_notify(struct notifier_block *nb, unsigned long action,
put_device(&adap->dev);
if (IS_ERR(client)) {
- dev_err(&adap->dev, "failed to create client for '%s'\n",
- rd->dn->full_name);
+ dev_err(&adap->dev, "failed to create client for '%pOF'\n",
+ rd->dn);
of_node_clear_flag(rd->dn, OF_POPULATED);
return notifier_from_errno(PTR_ERR(client));
}
diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
index 17121329bb79..0f5c8fc36625 100644
--- a/drivers/i2c/muxes/Kconfig
+++ b/drivers/i2c/muxes/Kconfig
@@ -8,7 +8,7 @@ menu "Multiplexer I2C Chip support"
config I2C_ARB_GPIO_CHALLENGE
tristate "GPIO-based I2C arbitration"
depends on GPIOLIB || COMPILE_TEST
- depends on OF
+ depends on OF || COMPILE_TEST
help
If you say yes to this option, support will be included for an
I2C multimaster arbitration scheme using GPIOs and a challenge &
@@ -76,6 +76,7 @@ config I2C_MUX_PCA954x
config I2C_MUX_PINCTRL
tristate "pinctrl-based I2C multiplexer"
depends on PINCTRL
+ depends on OF || COMPILE_TEST
help
If you say yes to this option, support will be included for an I2C
multiplexer that uses the pinctrl subsystem, i.e. pin multiplexing.
diff --git a/drivers/i2c/muxes/i2c-demux-pinctrl.c b/drivers/i2c/muxes/i2c-demux-pinctrl.c
index 3e6fe1760d82..33ce032cb701 100644
--- a/drivers/i2c/muxes/i2c-demux-pinctrl.c
+++ b/drivers/i2c/muxes/i2c-demux-pinctrl.c
@@ -167,8 +167,8 @@ static ssize_t available_masters_show(struct device *dev,
int count = 0, i;
for (i = 0; i < priv->num_chan && count < PAGE_SIZE; i++)
- count += scnprintf(buf + count, PAGE_SIZE - count, "%d:%s%c",
- i, priv->chan[i].parent_np->full_name,
+ count += scnprintf(buf + count, PAGE_SIZE - count, "%d:%pOF%c",
+ i, priv->chan[i].parent_np,
i == priv->num_chan - 1 ? '\n' : ' ');
return count;
diff --git a/drivers/i2c/muxes/i2c-mux-mlxcpld.c b/drivers/i2c/muxes/i2c-mux-mlxcpld.c
index e53f2abd1350..12ad8d65faf6 100644
--- a/drivers/i2c/muxes/i2c-mux-mlxcpld.c
+++ b/drivers/i2c/muxes/i2c-mux-mlxcpld.c
@@ -38,9 +38,9 @@
#include <linux/io.h>
#include <linux/init.h>
#include <linux/module.h>
+#include <linux/platform_data/x86/mlxcpld.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
-#include <linux/i2c/mlxcpld.h>
#define CPLD_MUX_MAX_NCHANS 8
diff --git a/drivers/i2c/muxes/i2c-mux-pca9541.c b/drivers/i2c/muxes/i2c-mux-pca9541.c
index 9e318c9516c7..6a39adaf433f 100644
--- a/drivers/i2c/muxes/i2c-mux-pca9541.c
+++ b/drivers/i2c/muxes/i2c-mux-pca9541.c
@@ -16,15 +16,14 @@
* warranty of any kind, whether express or implied.
*/
-#include <linux/module.h>
-#include <linux/jiffies.h>
#include <linux/delay.h>
-#include <linux/slab.h>
#include <linux/device.h>
#include <linux/i2c.h>
#include <linux/i2c-mux.h>
-
-#include <linux/i2c/pca954x.h>
+#include <linux/jiffies.h>
+#include <linux/module.h>
+#include <linux/platform_data/pca954x.h>
+#include <linux/slab.h>
/*
* The PCA9541 is a bus master selector. It supports two I2C masters connected
diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c
index f1751c290af6..7b992db38021 100644
--- a/drivers/i2c/muxes/i2c-mux-pca954x.c
+++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
@@ -39,13 +39,13 @@
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/i2c-mux.h>
-#include <linux/i2c/pca954x.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_irq.h>
+#include <linux/platform_data/pca954x.h>
#include <linux/pm.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
diff --git a/drivers/i2c/muxes/i2c-mux-pinctrl.c b/drivers/i2c/muxes/i2c-mux-pinctrl.c
index 7c0c264b07bc..cc6818aabab5 100644
--- a/drivers/i2c/muxes/i2c-mux-pinctrl.c
+++ b/drivers/i2c/muxes/i2c-mux-pinctrl.c
@@ -20,17 +20,14 @@
#include <linux/i2c-mux.h>
#include <linux/module.h>
#include <linux/pinctrl/consumer.h>
-#include <linux/i2c-mux-pinctrl.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/of.h>
#include "../../pinctrl/core.h"
struct i2c_mux_pinctrl {
- struct i2c_mux_pinctrl_platform_data *pdata;
struct pinctrl *pinctrl;
struct pinctrl_state **states;
- struct pinctrl_state *state_idle;
};
static int i2c_mux_pinctrl_select(struct i2c_mux_core *muxc, u32 chan)
@@ -42,85 +39,9 @@ static int i2c_mux_pinctrl_select(struct i2c_mux_core *muxc, u32 chan)
static int i2c_mux_pinctrl_deselect(struct i2c_mux_core *muxc, u32 chan)
{
- struct i2c_mux_pinctrl *mux = i2c_mux_priv(muxc);
-
- return pinctrl_select_state(mux->pinctrl, mux->state_idle);
+ return i2c_mux_pinctrl_select(muxc, muxc->num_adapters);
}
-#ifdef CONFIG_OF
-static int i2c_mux_pinctrl_parse_dt(struct i2c_mux_pinctrl *mux,
- struct platform_device *pdev)
-{
- struct device_node *np = pdev->dev.of_node;
- int num_names, i, ret;
- struct device_node *adapter_np;
- struct i2c_adapter *adapter;
-
- if (!np)
- return 0;
-
- mux->pdata = devm_kzalloc(&pdev->dev, sizeof(*mux->pdata), GFP_KERNEL);
- if (!mux->pdata)
- return -ENOMEM;
-
- num_names = of_property_count_strings(np, "pinctrl-names");
- if (num_names < 0) {
- dev_err(&pdev->dev, "Cannot parse pinctrl-names: %d\n",
- num_names);
- return num_names;
- }
-
- mux->pdata->pinctrl_states = devm_kzalloc(&pdev->dev,
- sizeof(*mux->pdata->pinctrl_states) * num_names,
- GFP_KERNEL);
- if (!mux->pdata->pinctrl_states)
- return -ENOMEM;
-
- for (i = 0; i < num_names; i++) {
- ret = of_property_read_string_index(np, "pinctrl-names", i,
- &mux->pdata->pinctrl_states[mux->pdata->bus_count]);
- if (ret < 0) {
- dev_err(&pdev->dev, "Cannot parse pinctrl-names: %d\n",
- ret);
- return ret;
- }
- if (!strcmp(mux->pdata->pinctrl_states[mux->pdata->bus_count],
- "idle")) {
- if (i != num_names - 1) {
- dev_err(&pdev->dev,
- "idle state must be last\n");
- return -EINVAL;
- }
- mux->pdata->pinctrl_state_idle = "idle";
- } else {
- mux->pdata->bus_count++;
- }
- }
-
- adapter_np = of_parse_phandle(np, "i2c-parent", 0);
- if (!adapter_np) {
- dev_err(&pdev->dev, "Cannot parse i2c-parent\n");
- return -ENODEV;
- }
- adapter = of_find_i2c_adapter_by_node(adapter_np);
- of_node_put(adapter_np);
- if (!adapter) {
- dev_err(&pdev->dev, "Cannot find parent bus\n");
- return -EPROBE_DEFER;
- }
- mux->pdata->parent_bus_num = i2c_adapter_id(adapter);
- put_device(&adapter->dev);
-
- return 0;
-}
-#else
-static inline int i2c_mux_pinctrl_parse_dt(struct i2c_mux_pinctrl *mux,
- struct platform_device *pdev)
-{
- return 0;
-}
-#endif
-
static struct i2c_adapter *i2c_mux_pinctrl_root_adapter(
struct pinctrl_state *state)
{
@@ -141,110 +62,108 @@ static struct i2c_adapter *i2c_mux_pinctrl_root_adapter(
return root;
}
+static struct i2c_adapter *i2c_mux_pinctrl_parent_adapter(struct device *dev)
+{
+ struct device_node *np = dev->of_node;
+ struct device_node *parent_np;
+ struct i2c_adapter *parent;
+
+ parent_np = of_parse_phandle(np, "i2c-parent", 0);
+ if (!parent_np) {
+ dev_err(dev, "Cannot parse i2c-parent\n");
+ return ERR_PTR(-ENODEV);
+ }
+ parent = of_find_i2c_adapter_by_node(parent_np);
+ of_node_put(parent_np);
+ if (!parent)
+ return ERR_PTR(-EPROBE_DEFER);
+
+ return parent;
+}
+
static int i2c_mux_pinctrl_probe(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
struct i2c_mux_core *muxc;
struct i2c_mux_pinctrl *mux;
+ struct i2c_adapter *parent;
struct i2c_adapter *root;
- int i, ret;
-
- mux = devm_kzalloc(&pdev->dev, sizeof(*mux), GFP_KERNEL);
- if (!mux) {
- ret = -ENOMEM;
- goto err;
- }
+ int num_names, i, ret;
+ const char *name;
- mux->pdata = dev_get_platdata(&pdev->dev);
- if (!mux->pdata) {
- ret = i2c_mux_pinctrl_parse_dt(mux, pdev);
- if (ret < 0)
- goto err;
- }
- if (!mux->pdata) {
- dev_err(&pdev->dev, "Missing platform data\n");
- ret = -ENODEV;
- goto err;
+ num_names = of_property_count_strings(np, "pinctrl-names");
+ if (num_names < 0) {
+ dev_err(dev, "Cannot parse pinctrl-names: %d\n",
+ num_names);
+ return num_names;
}
- mux->states = devm_kzalloc(&pdev->dev,
- sizeof(*mux->states) * mux->pdata->bus_count,
- GFP_KERNEL);
- if (!mux->states) {
- dev_err(&pdev->dev, "Cannot allocate states\n");
- ret = -ENOMEM;
- goto err;
- }
+ parent = i2c_mux_pinctrl_parent_adapter(dev);
+ if (IS_ERR(parent))
+ return PTR_ERR(parent);
- muxc = i2c_mux_alloc(NULL, &pdev->dev, mux->pdata->bus_count, 0, 0,
- i2c_mux_pinctrl_select, NULL);
+ muxc = i2c_mux_alloc(parent, dev, num_names,
+ sizeof(*mux) + num_names * sizeof(*mux->states),
+ 0, i2c_mux_pinctrl_select, NULL);
if (!muxc) {
ret = -ENOMEM;
- goto err;
+ goto err_put_parent;
}
- muxc->priv = mux;
+ mux = i2c_mux_priv(muxc);
+ mux->states = (struct pinctrl_state **)(mux + 1);
platform_set_drvdata(pdev, muxc);
- mux->pinctrl = devm_pinctrl_get(&pdev->dev);
+ mux->pinctrl = devm_pinctrl_get(dev);
if (IS_ERR(mux->pinctrl)) {
ret = PTR_ERR(mux->pinctrl);
- dev_err(&pdev->dev, "Cannot get pinctrl: %d\n", ret);
- goto err;
+ dev_err(dev, "Cannot get pinctrl: %d\n", ret);
+ goto err_put_parent;
}
- for (i = 0; i < mux->pdata->bus_count; i++) {
- mux->states[i] = pinctrl_lookup_state(mux->pinctrl,
- mux->pdata->pinctrl_states[i]);
+
+ for (i = 0; i < num_names; i++) {
+ ret = of_property_read_string_index(np, "pinctrl-names", i,
+ &name);
+ if (ret < 0) {
+ dev_err(dev, "Cannot parse pinctrl-names: %d\n", ret);
+ goto err_put_parent;
+ }
+
+ mux->states[i] = pinctrl_lookup_state(mux->pinctrl, name);
if (IS_ERR(mux->states[i])) {
ret = PTR_ERR(mux->states[i]);
- dev_err(&pdev->dev,
- "Cannot look up pinctrl state %s: %d\n",
- mux->pdata->pinctrl_states[i], ret);
- goto err;
- }
- }
- if (mux->pdata->pinctrl_state_idle) {
- mux->state_idle = pinctrl_lookup_state(mux->pinctrl,
- mux->pdata->pinctrl_state_idle);
- if (IS_ERR(mux->state_idle)) {
- ret = PTR_ERR(mux->state_idle);
- dev_err(&pdev->dev,
- "Cannot look up pinctrl state %s: %d\n",
- mux->pdata->pinctrl_state_idle, ret);
- goto err;
+ dev_err(dev, "Cannot look up pinctrl state %s: %d\n",
+ name, ret);
+ goto err_put_parent;
}
- muxc->deselect = i2c_mux_pinctrl_deselect;
- }
+ if (strcmp(name, "idle"))
+ continue;
- muxc->parent = i2c_get_adapter(mux->pdata->parent_bus_num);
- if (!muxc->parent) {
- dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
- mux->pdata->parent_bus_num);
- ret = -EPROBE_DEFER;
- goto err;
+ if (i != num_names - 1) {
+ dev_err(dev, "idle state must be last\n");
+ ret = -EINVAL;
+ goto err_put_parent;
+ }
+ muxc->deselect = i2c_mux_pinctrl_deselect;
}
root = i2c_root_adapter(&muxc->parent->dev);
muxc->mux_locked = true;
- for (i = 0; i < mux->pdata->bus_count; i++) {
+ for (i = 0; i < num_names; i++) {
if (root != i2c_mux_pinctrl_root_adapter(mux->states[i])) {
muxc->mux_locked = false;
break;
}
}
- if (muxc->mux_locked && mux->pdata->pinctrl_state_idle &&
- root != i2c_mux_pinctrl_root_adapter(mux->state_idle))
- muxc->mux_locked = false;
-
if (muxc->mux_locked)
- dev_info(&pdev->dev, "mux-locked i2c mux\n");
+ dev_info(dev, "mux-locked i2c mux\n");
- for (i = 0; i < mux->pdata->bus_count; i++) {
- u32 bus = mux->pdata->base_bus_num ?
- (mux->pdata->base_bus_num + i) : 0;
-
- ret = i2c_mux_add_adapter(muxc, bus, i, 0);
+ /* Do not add any adapter for the idle state (if it's there at all). */
+ for (i = 0; i < num_names - !!muxc->deselect; i++) {
+ ret = i2c_mux_add_adapter(muxc, 0, i, 0);
if (ret)
goto err_del_adapter;
}
@@ -253,8 +172,9 @@ static int i2c_mux_pinctrl_probe(struct platform_device *pdev)
err_del_adapter:
i2c_mux_del_adapters(muxc);
- i2c_put_adapter(muxc->parent);
-err:
+err_put_parent:
+ i2c_put_adapter(parent);
+
return ret;
}
@@ -264,16 +184,15 @@ static int i2c_mux_pinctrl_remove(struct platform_device *pdev)
i2c_mux_del_adapters(muxc);
i2c_put_adapter(muxc->parent);
+
return 0;
}
-#ifdef CONFIG_OF
static const struct of_device_id i2c_mux_pinctrl_of_match[] = {
{ .compatible = "i2c-mux-pinctrl", },
{},
};
MODULE_DEVICE_TABLE(of, i2c_mux_pinctrl_of_match);
-#endif
static struct platform_driver i2c_mux_pinctrl_driver = {
.driver = {
diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c
index e6706a09e100..47c3d7f32900 100644
--- a/drivers/iio/adc/ad7793.c
+++ b/drivers/iio/adc/ad7793.c
@@ -257,7 +257,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
unsigned int vref_mv)
{
struct ad7793_state *st = iio_priv(indio_dev);
- int i, ret = -1;
+ int i, ret;
unsigned long long scale_uv;
u32 id;
@@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
return ret;
/* reset the serial interface */
- ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret));
+ ret = ad_sd_reset(&st->sd, 32);
if (ret < 0)
goto out;
usleep_range(500, 2000); /* Wait for at least 500us */
diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c
index d10bd0c97233..22c4c17cd996 100644
--- a/drivers/iio/adc/ad_sigma_delta.c
+++ b/drivers/iio/adc/ad_sigma_delta.c
@@ -177,6 +177,34 @@ out:
}
EXPORT_SYMBOL_GPL(ad_sd_read_reg);
+/**
+ * ad_sd_reset() - Reset the serial interface
+ *
+ * @sigma_delta: The sigma delta device
+ * @reset_length: Number of SCLKs with DIN = 1
+ *
+ * Returns 0 on success, an error code otherwise.
+ **/
+int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
+ unsigned int reset_length)
+{
+ uint8_t *buf;
+ unsigned int size;
+ int ret;
+
+ size = DIV_ROUND_UP(reset_length, 8);
+ buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ memset(buf, 0xff, size);
+ ret = spi_write(sigma_delta->spi, buf, size);
+ kfree(buf);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ad_sd_reset);
+
static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
unsigned int mode, unsigned int channel)
{
diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c
index 634717ae12f3..071dd23a33d9 100644
--- a/drivers/iio/adc/mcp320x.c
+++ b/drivers/iio/adc/mcp320x.c
@@ -17,6 +17,8 @@
* MCP3204
* MCP3208
* ------------
+ * 13 bit converter
+ * MCP3301
*
* Datasheet can be found here:
* http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001
@@ -96,7 +98,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
}
static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
- bool differential, int device_index)
+ bool differential, int device_index, int *val)
{
int ret;
@@ -117,19 +119,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
switch (device_index) {
case mcp3001:
- return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
+ *val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
+ return 0;
case mcp3002:
case mcp3004:
case mcp3008:
- return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
+ *val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
+ return 0;
case mcp3201:
- return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
+ *val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
+ return 0;
case mcp3202:
case mcp3204:
case mcp3208:
- return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
+ *val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
+ return 0;
case mcp3301:
- return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12);
+ *val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8
+ | adc->rx_buf[1], 12);
+ return 0;
default:
return -EINVAL;
}
@@ -150,12 +158,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_RAW:
ret = mcp320x_adc_conversion(adc, channel->address,
- channel->differential, device_index);
-
+ channel->differential, device_index, val);
if (ret < 0)
goto out;
- *val = ret;
ret = IIO_VAL_INT;
break;
@@ -312,6 +318,7 @@ static int mcp320x_probe(struct spi_device *spi)
indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &mcp320x_info;
+ spi_set_drvdata(spi, indio_dev);
chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];
indio_dev->channels = chip_info->channels;
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index e3c15f88075f..4df32cf1650e 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -1666,7 +1666,7 @@ static int stm32_adc_chan_of_init(struct iio_dev *indio_dev)
num_channels = of_property_count_u32_elems(node, "st,adc-channels");
if (num_channels < 0 ||
- num_channels >= adc_info->max_channels) {
+ num_channels > adc_info->max_channels) {
dev_err(&indio_dev->dev, "Bad st,adc-channels?\n");
return num_channels < 0 ? num_channels : -EINVAL;
}
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index d1210024f6bc..e0dc20488335 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -52,7 +52,7 @@
#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0)
#define ADS1015_CFG_COMP_LAT_MASK BIT(2)
-#define ADS1015_CFG_COMP_POL_MASK BIT(2)
+#define ADS1015_CFG_COMP_POL_MASK BIT(3)
#define ADS1015_CFG_COMP_MODE_MASK BIT(4)
#define ADS1015_CFG_DR_MASK GENMASK(7, 5)
#define ADS1015_CFG_MOD_MASK BIT(8)
@@ -1017,10 +1017,12 @@ static int ads1015_probe(struct i2c_client *client,
switch (irq_trig) {
case IRQF_TRIGGER_LOW:
- cfg_comp |= ADS1015_CFG_COMP_POL_LOW;
+ cfg_comp |= ADS1015_CFG_COMP_POL_LOW <<
+ ADS1015_CFG_COMP_POL_SHIFT;
break;
case IRQF_TRIGGER_HIGH:
- cfg_comp |= ADS1015_CFG_COMP_POL_HIGH;
+ cfg_comp |= ADS1015_CFG_COMP_POL_HIGH <<
+ ADS1015_CFG_COMP_POL_SHIFT;
break;
default:
return -EINVAL;
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c
index 1edd99f0c5e5..e3cfb91bffc6 100644
--- a/drivers/iio/adc/twl4030-madc.c
+++ b/drivers/iio/adc/twl4030-madc.c
@@ -887,21 +887,27 @@ static int twl4030_madc_probe(struct platform_device *pdev)
/* Enable 3v1 bias regulator for MADC[3:6] */
madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
- if (IS_ERR(madc->usb3v1))
- return -ENODEV;
+ if (IS_ERR(madc->usb3v1)) {
+ ret = -ENODEV;
+ goto err_i2c;
+ }
ret = regulator_enable(madc->usb3v1);
- if (ret)
+ if (ret) {
dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
+ goto err_i2c;
+ }
ret = iio_device_register(iio_dev);
if (ret) {
dev_err(&pdev->dev, "could not register iio device\n");
- goto err_i2c;
+ goto err_usb3v1;
}
return 0;
+err_usb3v1:
+ regulator_disable(madc->usb3v1);
err_i2c:
twl4030_madc_set_current_generator(madc, 0, 0);
err_current_generator:
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index d99bb1460fe2..02e833b14db0 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -463,8 +463,17 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
u8 drdy_mask;
struct st_sensor_data *sdata = iio_priv(indio_dev);
- if (!sdata->sensor_settings->drdy_irq.addr)
+ if (!sdata->sensor_settings->drdy_irq.addr) {
+ /*
+ * there are some devices (e.g. LIS3MDL) where drdy line is
+ * routed to a given pin and it is not possible to select a
+ * different one. Take into account irq status register
+ * to understand if irq trigger can be properly supported
+ */
+ if (sdata->sensor_settings->drdy_irq.addr_stat_drdy)
+ sdata->hw_irq_trigger = enable;
return 0;
+ }
/* Enable/Disable the interrupt generator 1. */
if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) {
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 17ec4cee51dc..a47428b4d31b 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -310,8 +310,10 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf,
ret = indio_dev->info->debugfs_reg_access(indio_dev,
indio_dev->cached_reg_addr,
0, &val);
- if (ret)
+ if (ret) {
dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__);
+ return ret;
+ }
len = snprintf(buf, sizeof(buf), "0x%X\n", val);
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index e68368b5b2a3..08aafba4481c 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -315,6 +315,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
},
},
},
+ .drdy_irq = {
+ /* drdy line is routed drdy pin */
+ .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+ },
.multi_read_bit = true,
.bootime = 2,
},
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 0d2ea3ee371b..8f26428804a2 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -573,7 +573,7 @@ static int bmp280_chip_config(struct bmp280_data *data)
u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) |
BMP280_OSRS_PRESS_X(data->oversampling_press + 1);
- ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS,
+ ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
BMP280_OSRS_TEMP_MASK |
BMP280_OSRS_PRESS_MASK |
BMP280_MODE_MASK,
diff --git a/drivers/iio/trigger/stm32-timer-trigger.c b/drivers/iio/trigger/stm32-timer-trigger.c
index 9b9053494daf..eb212f8c8879 100644
--- a/drivers/iio/trigger/stm32-timer-trigger.c
+++ b/drivers/iio/trigger/stm32-timer-trigger.c
@@ -174,6 +174,7 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)
clk_disable(priv->clk);
/* Stop timer */
+ regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
regmap_write(priv->regmap, TIM_PSC, 0);
regmap_write(priv->regmap, TIM_ARR, 0);
@@ -715,8 +716,9 @@ static ssize_t stm32_count_set_preset(struct iio_dev *indio_dev,
if (ret)
return ret;
+ /* TIMx_ARR register shouldn't be buffered (ARPE=0) */
+ regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
regmap_write(priv->regmap, TIM_ARR, preset);
- regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
return len;
}
diff --git a/drivers/infiniband/core/security.c b/drivers/infiniband/core/security.c
index 70ad19c4c73e..88bdafb297f5 100644
--- a/drivers/infiniband/core/security.c
+++ b/drivers/infiniband/core/security.c
@@ -432,8 +432,10 @@ int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev)
atomic_set(&qp->qp_sec->error_list_count, 0);
init_completion(&qp->qp_sec->error_complete);
ret = security_ib_alloc_security(&qp->qp_sec->security);
- if (ret)
+ if (ret) {
kfree(qp->qp_sec);
+ qp->qp_sec = NULL;
+ }
return ret;
}
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 4ab30d832ac5..52a2cf2d83aa 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -3869,15 +3869,15 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file,
resp.raw_packet_caps = attr.raw_packet_caps;
resp.response_length += sizeof(resp.raw_packet_caps);
- if (ucore->outlen < resp.response_length + sizeof(resp.xrq_caps))
+ if (ucore->outlen < resp.response_length + sizeof(resp.tm_caps))
goto end;
- resp.xrq_caps.max_rndv_hdr_size = attr.xrq_caps.max_rndv_hdr_size;
- resp.xrq_caps.max_num_tags = attr.xrq_caps.max_num_tags;
- resp.xrq_caps.max_ops = attr.xrq_caps.max_ops;
- resp.xrq_caps.max_sge = attr.xrq_caps.max_sge;
- resp.xrq_caps.flags = attr.xrq_caps.flags;
- resp.response_length += sizeof(resp.xrq_caps);
+ resp.tm_caps.max_rndv_hdr_size = attr.tm_caps.max_rndv_hdr_size;
+ resp.tm_caps.max_num_tags = attr.tm_caps.max_num_tags;
+ resp.tm_caps.max_ops = attr.tm_caps.max_ops;
+ resp.tm_caps.max_sge = attr.tm_caps.max_sge;
+ resp.tm_caps.flags = attr.tm_caps.flags;
+ resp.response_length += sizeof(resp.tm_caps);
end:
err = ib_copy_to_udata(ucore, &resp, resp.response_length);
return err;
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index ee9e27dc799b..de57d6c11a25 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -1646,7 +1646,7 @@ static bool is_valid_mcast_lid(struct ib_qp *qp, u16 lid)
*/
if (!ib_query_qp(qp, &attr, IB_QP_STATE | IB_QP_PORT, &init_attr)) {
if (attr.qp_state >= IB_QPS_INIT) {
- if (qp->device->get_link_layer(qp->device, attr.port_num) !=
+ if (rdma_port_get_link_layer(qp->device, attr.port_num) !=
IB_LINK_LAYER_INFINIBAND)
return true;
goto lid_check;
@@ -1655,7 +1655,7 @@ static bool is_valid_mcast_lid(struct ib_qp *qp, u16 lid)
/* Can't get a quick answer, iterate over all ports */
for (port = 0; port < qp->device->phys_port_cnt; port++)
- if (qp->device->get_link_layer(qp->device, port) !=
+ if (rdma_port_get_link_layer(qp->device, port) !=
IB_LINK_LAYER_INFINIBAND)
num_eth_ports++;
diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index b3ad37fec578..ecbac91b2e14 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -93,11 +93,13 @@ struct bnxt_re_dev {
struct ib_device ibdev;
struct list_head list;
unsigned long flags;
-#define BNXT_RE_FLAG_NETDEV_REGISTERED 0
-#define BNXT_RE_FLAG_IBDEV_REGISTERED 1
-#define BNXT_RE_FLAG_GOT_MSIX 2
-#define BNXT_RE_FLAG_RCFW_CHANNEL_EN 8
-#define BNXT_RE_FLAG_QOS_WORK_REG 16
+#define BNXT_RE_FLAG_NETDEV_REGISTERED 0
+#define BNXT_RE_FLAG_IBDEV_REGISTERED 1
+#define BNXT_RE_FLAG_GOT_MSIX 2
+#define BNXT_RE_FLAG_HAVE_L2_REF 3
+#define BNXT_RE_FLAG_RCFW_CHANNEL_EN 4
+#define BNXT_RE_FLAG_QOS_WORK_REG 5
+#define BNXT_RE_FLAG_TASK_IN_PROG 6
struct net_device *netdev;
unsigned int version, major, minor;
struct bnxt_en_dev *en_dev;
@@ -108,6 +110,8 @@ struct bnxt_re_dev {
struct delayed_work worker;
u8 cur_prio_map;
+ u8 active_speed;
+ u8 active_width;
/* FP Notification Queue (CQ & SRQ) */
struct tasklet_struct nq_task;
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index 01eee15bbd65..0d89621d9fe8 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -259,14 +259,9 @@ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
port_attr->sm_sl = 0;
port_attr->subnet_timeout = 0;
port_attr->init_type_reply = 0;
- /* call the underlying netdev's ethtool hooks to query speed settings
- * for which we acquire rtnl_lock _only_ if it's registered with
- * IB stack to avoid race in the NETDEV_UNREG path
- */
- if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags))
- if (ib_get_eth_speed(ibdev, port_num, &port_attr->active_speed,
- &port_attr->active_width))
- return -EINVAL;
+ port_attr->active_speed = rdev->active_speed;
+ port_attr->active_width = rdev->active_width;
+
return 0;
}
@@ -319,6 +314,7 @@ int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
struct bnxt_re_gid_ctx *ctx, **ctx_tbl;
struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
+ struct bnxt_qplib_gid *gid_to_del;
/* Delete the entry from the hardware */
ctx = *context;
@@ -328,11 +324,25 @@ int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
if (sgid_tbl && sgid_tbl->active) {
if (ctx->idx >= sgid_tbl->max)
return -EINVAL;
+ gid_to_del = &sgid_tbl->tbl[ctx->idx];
+ /* DEL_GID is called in WQ context(netdevice_event_work_handler)
+ * or via the ib_unregister_device path. In the former case QP1
+ * may not be destroyed yet, in which case just return as FW
+ * needs that entry to be present and will fail it's deletion.
+ * We could get invoked again after QP1 is destroyed OR get an
+ * ADD_GID call with a different GID value for the same index
+ * where we issue MODIFY_GID cmd to update the GID entry -- TBD
+ */
+ if (ctx->idx == 0 &&
+ rdma_link_local_addr((struct in6_addr *)gid_to_del) &&
+ ctx->refcnt == 1 && rdev->qp1_sqp) {
+ dev_dbg(rdev_to_dev(rdev),
+ "Trying to delete GID0 while QP1 is alive\n");
+ return -EFAULT;
+ }
ctx->refcnt--;
if (!ctx->refcnt) {
- rc = bnxt_qplib_del_sgid(sgid_tbl,
- &sgid_tbl->tbl[ctx->idx],
- true);
+ rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, true);
if (rc) {
dev_err(rdev_to_dev(rdev),
"Failed to remove GID: %#x", rc);
@@ -816,6 +826,8 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp)
kfree(rdev->sqp_ah);
kfree(rdev->qp1_sqp);
+ rdev->qp1_sqp = NULL;
+ rdev->sqp_ah = NULL;
}
if (!IS_ERR_OR_NULL(qp->rumem))
@@ -1436,11 +1448,14 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
qp->qplib_qp.modify_flags |=
CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU;
qp->qplib_qp.path_mtu = __from_ib_mtu(qp_attr->path_mtu);
+ qp->qplib_qp.mtu = ib_mtu_enum_to_int(qp_attr->path_mtu);
} else if (qp_attr->qp_state == IB_QPS_RTR) {
qp->qplib_qp.modify_flags |=
CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU;
qp->qplib_qp.path_mtu =
__from_ib_mtu(iboe_get_mtu(rdev->netdev->mtu));
+ qp->qplib_qp.mtu =
+ ib_mtu_enum_to_int(iboe_get_mtu(rdev->netdev->mtu));
}
if (qp_attr_mask & IB_QP_TIMEOUT) {
@@ -1551,43 +1566,46 @@ int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
{
struct bnxt_re_qp *qp = container_of(ib_qp, struct bnxt_re_qp, ib_qp);
struct bnxt_re_dev *rdev = qp->rdev;
- struct bnxt_qplib_qp qplib_qp;
+ struct bnxt_qplib_qp *qplib_qp;
int rc;
- memset(&qplib_qp, 0, sizeof(struct bnxt_qplib_qp));
- qplib_qp.id = qp->qplib_qp.id;
- qplib_qp.ah.host_sgid_index = qp->qplib_qp.ah.host_sgid_index;
+ qplib_qp = kzalloc(sizeof(*qplib_qp), GFP_KERNEL);
+ if (!qplib_qp)
+ return -ENOMEM;
+
+ qplib_qp->id = qp->qplib_qp.id;
+ qplib_qp->ah.host_sgid_index = qp->qplib_qp.ah.host_sgid_index;
- rc = bnxt_qplib_query_qp(&rdev->qplib_res, &qplib_qp);
+ rc = bnxt_qplib_query_qp(&rdev->qplib_res, qplib_qp);
if (rc) {
dev_err(rdev_to_dev(rdev), "Failed to query HW QP");
- return rc;
+ goto out;
}
- qp_attr->qp_state = __to_ib_qp_state(qplib_qp.state);
- qp_attr->en_sqd_async_notify = qplib_qp.en_sqd_async_notify ? 1 : 0;
- qp_attr->qp_access_flags = __to_ib_access_flags(qplib_qp.access);
- qp_attr->pkey_index = qplib_qp.pkey_index;
- qp_attr->qkey = qplib_qp.qkey;
+ qp_attr->qp_state = __to_ib_qp_state(qplib_qp->state);
+ qp_attr->en_sqd_async_notify = qplib_qp->en_sqd_async_notify ? 1 : 0;
+ qp_attr->qp_access_flags = __to_ib_access_flags(qplib_qp->access);
+ qp_attr->pkey_index = qplib_qp->pkey_index;
+ qp_attr->qkey = qplib_qp->qkey;
qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
- rdma_ah_set_grh(&qp_attr->ah_attr, NULL, qplib_qp.ah.flow_label,
- qplib_qp.ah.host_sgid_index,
- qplib_qp.ah.hop_limit,
- qplib_qp.ah.traffic_class);
- rdma_ah_set_dgid_raw(&qp_attr->ah_attr, qplib_qp.ah.dgid.data);
- rdma_ah_set_sl(&qp_attr->ah_attr, qplib_qp.ah.sl);
- ether_addr_copy(qp_attr->ah_attr.roce.dmac, qplib_qp.ah.dmac);
- qp_attr->path_mtu = __to_ib_mtu(qplib_qp.path_mtu);
- qp_attr->timeout = qplib_qp.timeout;
- qp_attr->retry_cnt = qplib_qp.retry_cnt;
- qp_attr->rnr_retry = qplib_qp.rnr_retry;
- qp_attr->min_rnr_timer = qplib_qp.min_rnr_timer;
- qp_attr->rq_psn = qplib_qp.rq.psn;
- qp_attr->max_rd_atomic = qplib_qp.max_rd_atomic;
- qp_attr->sq_psn = qplib_qp.sq.psn;
- qp_attr->max_dest_rd_atomic = qplib_qp.max_dest_rd_atomic;
- qp_init_attr->sq_sig_type = qplib_qp.sig_type ? IB_SIGNAL_ALL_WR :
- IB_SIGNAL_REQ_WR;
- qp_attr->dest_qp_num = qplib_qp.dest_qpn;
+ rdma_ah_set_grh(&qp_attr->ah_attr, NULL, qplib_qp->ah.flow_label,
+ qplib_qp->ah.host_sgid_index,
+ qplib_qp->ah.hop_limit,
+ qplib_qp->ah.traffic_class);
+ rdma_ah_set_dgid_raw(&qp_attr->ah_attr, qplib_qp->ah.dgid.data);
+ rdma_ah_set_sl(&qp_attr->ah_attr, qplib_qp->ah.sl);
+ ether_addr_copy(qp_attr->ah_attr.roce.dmac, qplib_qp->ah.dmac);
+ qp_attr->path_mtu = __to_ib_mtu(qplib_qp->path_mtu);
+ qp_attr->timeout = qplib_qp->timeout;
+ qp_attr->retry_cnt = qplib_qp->retry_cnt;
+ qp_attr->rnr_retry = qplib_qp->rnr_retry;
+ qp_attr->min_rnr_timer = qplib_qp->min_rnr_timer;
+ qp_attr->rq_psn = qplib_qp->rq.psn;
+ qp_attr->max_rd_atomic = qplib_qp->max_rd_atomic;
+ qp_attr->sq_psn = qplib_qp->sq.psn;
+ qp_attr->max_dest_rd_atomic = qplib_qp->max_dest_rd_atomic;
+ qp_init_attr->sq_sig_type = qplib_qp->sig_type ? IB_SIGNAL_ALL_WR :
+ IB_SIGNAL_REQ_WR;
+ qp_attr->dest_qp_num = qplib_qp->dest_qpn;
qp_attr->cap.max_send_wr = qp->qplib_qp.sq.max_wqe;
qp_attr->cap.max_send_sge = qp->qplib_qp.sq.max_sge;
@@ -1596,7 +1614,9 @@ int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
qp_attr->cap.max_inline_data = qp->qplib_qp.max_inline_data;
qp_init_attr->cap = qp_attr->cap;
- return 0;
+out:
+ kfree(qplib_qp);
+ return rc;
}
/* Routine for sending QP1 packets for RoCE V1 an V2
@@ -1908,6 +1928,7 @@ static int bnxt_re_build_atomic_wqe(struct ib_send_wr *wr,
switch (wr->opcode) {
case IB_WR_ATOMIC_CMP_AND_SWP:
wqe->type = BNXT_QPLIB_SWQE_TYPE_ATOMIC_CMP_AND_SWP;
+ wqe->atomic.cmp_data = atomic_wr(wr)->compare_add;
wqe->atomic.swap_data = atomic_wr(wr)->swap;
break;
case IB_WR_ATOMIC_FETCH_AND_ADD:
@@ -3062,7 +3083,7 @@ int bnxt_re_dereg_mr(struct ib_mr *ib_mr)
return rc;
}
- if (mr->npages && mr->pages) {
+ if (mr->pages) {
rc = bnxt_qplib_free_fast_reg_page_list(&rdev->qplib_res,
&mr->qplib_frpl);
kfree(mr->pages);
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 82d1cbc27aee..e7450ea92aa9 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -1161,6 +1161,8 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
}
}
set_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags);
+ ib_get_eth_speed(&rdev->ibdev, 1, &rdev->active_speed,
+ &rdev->active_width);
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_PORT_ACTIVE);
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_GID_CHANGE);
@@ -1255,10 +1257,14 @@ static void bnxt_re_task(struct work_struct *work)
else if (netif_carrier_ok(rdev->netdev))
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
IB_EVENT_PORT_ACTIVE);
+ ib_get_eth_speed(&rdev->ibdev, 1, &rdev->active_speed,
+ &rdev->active_width);
break;
default:
break;
}
+ smp_mb__before_atomic();
+ clear_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags);
kfree(re_work);
}
@@ -1317,6 +1323,11 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
break;
case NETDEV_UNREGISTER:
+ /* netdev notifier will call NETDEV_UNREGISTER again later since
+ * we are still holding the reference to the netdev
+ */
+ if (test_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags))
+ goto exit;
bnxt_re_ib_unreg(rdev, false);
bnxt_re_remove_one(rdev);
bnxt_re_dev_unreg(rdev);
@@ -1335,6 +1346,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
re_work->vlan_dev = (real_dev == netdev ?
NULL : netdev);
INIT_WORK(&re_work->work, bnxt_re_task);
+ set_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags);
queue_work(bnxt_re_wq, &re_work->work);
}
}
@@ -1375,6 +1387,22 @@ err_netdev:
static void __exit bnxt_re_mod_exit(void)
{
+ struct bnxt_re_dev *rdev;
+ LIST_HEAD(to_be_deleted);
+
+ mutex_lock(&bnxt_re_dev_lock);
+ /* Free all adapter allocated resources */
+ if (!list_empty(&bnxt_re_dev_list))
+ list_splice_init(&bnxt_re_dev_list, &to_be_deleted);
+ mutex_unlock(&bnxt_re_dev_lock);
+
+ list_for_each_entry(rdev, &to_be_deleted, list) {
+ dev_info(rdev_to_dev(rdev), "Unregistering Device");
+ bnxt_re_dev_stop(rdev);
+ bnxt_re_ib_unreg(rdev, true);
+ bnxt_re_remove_one(rdev);
+ bnxt_re_dev_unreg(rdev);
+ }
unregister_netdevice_notifier(&bnxt_re_netdev_notifier);
if (bnxt_re_wq)
destroy_workqueue(bnxt_re_wq);
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
index 391bb7006e8f..2bdb1562bd21 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
@@ -107,6 +107,9 @@ static int __send_message(struct bnxt_qplib_rcfw *rcfw, struct cmdq_base *req,
return -EINVAL;
}
+ if (test_bit(FIRMWARE_TIMED_OUT, &rcfw->flags))
+ return -ETIMEDOUT;
+
/* Cmdq are in 16-byte units, each request can consume 1 or more
* cmdqe
*/
@@ -226,6 +229,7 @@ int bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
/* timed out */
dev_err(&rcfw->pdev->dev, "QPLIB: cmdq[%#x]=%#x timedout (%d)msec",
cookie, opcode, RCFW_CMD_WAIT_TIME_MS);
+ set_bit(FIRMWARE_TIMED_OUT, &rcfw->flags);
return rc;
}
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
index 0ed312f17c8d..85b16da287f9 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
@@ -162,8 +162,9 @@ struct bnxt_qplib_rcfw {
unsigned long *cmdq_bitmap;
u32 bmap_size;
unsigned long flags;
-#define FIRMWARE_INITIALIZED_FLAG 1
+#define FIRMWARE_INITIALIZED_FLAG BIT(0)
#define FIRMWARE_FIRST_FLAG BIT(31)
+#define FIRMWARE_TIMED_OUT BIT(3)
wait_queue_head_t waitq;
int (*aeq_handler)(struct bnxt_qplib_rcfw *,
struct creq_func_event *);
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index ceaa2fa54d32..daf7a56e5d7e 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -2333,9 +2333,14 @@ static int close_listsrv_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
unsigned int stid = GET_TID(rpl);
struct c4iw_listen_ep *ep = get_ep_from_stid(dev, stid);
+ if (!ep) {
+ pr_debug("%s stid %d lookup failure!\n", __func__, stid);
+ goto out;
+ }
pr_debug("%s ep %p\n", __func__, ep);
c4iw_wake_up(&ep->com.wr_wait, status2errno(rpl->status));
c4iw_put_ep(&ep->com);
+out:
return 0;
}
@@ -2594,9 +2599,9 @@ fail:
c4iw_put_ep(&child_ep->com);
reject:
reject_cr(dev, hwtid, skb);
+out:
if (parent_ep)
c4iw_put_ep(&parent_ep->com);
-out:
return 0;
}
@@ -3457,7 +3462,7 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id->provider_data = ep;
goto out;
}
-
+ remove_handle(ep->com.dev, &ep->com.dev->stid_idr, ep->stid);
cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
ep->com.local_addr.ss_family);
fail2:
diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
index b2ed4b9cda6e..0be42787759f 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -1066,6 +1066,8 @@ static int read_idle_sma(struct hfi1_devdata *dd, u64 *data);
static int thermal_init(struct hfi1_devdata *dd);
static void update_statusp(struct hfi1_pportdata *ppd, u32 state);
+static int wait_phys_link_offline_substates(struct hfi1_pportdata *ppd,
+ int msecs);
static int wait_logical_linkstate(struct hfi1_pportdata *ppd, u32 state,
int msecs);
static void log_state_transition(struct hfi1_pportdata *ppd, u32 state);
@@ -8238,6 +8240,7 @@ static irqreturn_t general_interrupt(int irq, void *data)
u64 regs[CCE_NUM_INT_CSRS];
u32 bit;
int i;
+ irqreturn_t handled = IRQ_NONE;
this_cpu_inc(*dd->int_counter);
@@ -8258,9 +8261,10 @@ static irqreturn_t general_interrupt(int irq, void *data)
for_each_set_bit(bit, (unsigned long *)&regs[0],
CCE_NUM_INT_CSRS * 64) {
is_interrupt(dd, bit);
+ handled = IRQ_HANDLED;
}
- return IRQ_HANDLED;
+ return handled;
}
static irqreturn_t sdma_interrupt(int irq, void *data)
@@ -9413,7 +9417,7 @@ static void set_qsfp_int_n(struct hfi1_pportdata *ppd, u8 enable)
write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK, mask);
}
-void reset_qsfp(struct hfi1_pportdata *ppd)
+int reset_qsfp(struct hfi1_pportdata *ppd)
{
struct hfi1_devdata *dd = ppd->dd;
u64 mask, qsfp_mask;
@@ -9443,6 +9447,13 @@ void reset_qsfp(struct hfi1_pportdata *ppd)
* for alarms and warnings
*/
set_qsfp_int_n(ppd, 1);
+
+ /*
+ * After the reset, AOC transmitters are enabled by default. They need
+ * to be turned off to complete the QSFP setup before they can be
+ * enabled again.
+ */
+ return set_qsfp_tx(ppd, 0);
}
static int handle_qsfp_error_conditions(struct hfi1_pportdata *ppd,
@@ -10305,6 +10316,7 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
{
struct hfi1_devdata *dd = ppd->dd;
u32 previous_state;
+ int offline_state_ret;
int ret;
update_lcb_cache(dd);
@@ -10326,28 +10338,11 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
ppd->offline_disabled_reason =
HFI1_ODR_MASK(OPA_LINKDOWN_REASON_TRANSIENT);
- /*
- * Wait for offline transition. It can take a while for
- * the link to go down.
- */
- ret = wait_physical_linkstate(ppd, PLS_OFFLINE, 10000);
- if (ret < 0)
- return ret;
-
- /*
- * Now in charge of LCB - must be after the physical state is
- * offline.quiet and before host_link_state is changed.
- */
- set_host_lcb_access(dd);
- write_csr(dd, DC_LCB_ERR_EN, ~0ull); /* watch LCB errors */
-
- /* make sure the logical state is also down */
- ret = wait_logical_linkstate(ppd, IB_PORT_DOWN, 1000);
- if (ret)
- force_logical_link_state_down(ppd);
-
- ppd->host_link_state = HLS_LINK_COOLDOWN; /* LCB access allowed */
+ offline_state_ret = wait_phys_link_offline_substates(ppd, 10000);
+ if (offline_state_ret < 0)
+ return offline_state_ret;
+ /* Disabling AOC transmitters */
if (ppd->port_type == PORT_TYPE_QSFP &&
ppd->qsfp_info.limiting_active &&
qsfp_mod_present(ppd)) {
@@ -10365,6 +10360,30 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
}
/*
+ * Wait for the offline.Quiet transition if it hasn't happened yet. It
+ * can take a while for the link to go down.
+ */
+ if (offline_state_ret != PLS_OFFLINE_QUIET) {
+ ret = wait_physical_linkstate(ppd, PLS_OFFLINE, 30000);
+ if (ret < 0)
+ return ret;
+ }
+
+ /*
+ * Now in charge of LCB - must be after the physical state is
+ * offline.quiet and before host_link_state is changed.
+ */
+ set_host_lcb_access(dd);
+ write_csr(dd, DC_LCB_ERR_EN, ~0ull); /* watch LCB errors */
+
+ /* make sure the logical state is also down */
+ ret = wait_logical_linkstate(ppd, IB_PORT_DOWN, 1000);
+ if (ret)
+ force_logical_link_state_down(ppd);
+
+ ppd->host_link_state = HLS_LINK_COOLDOWN; /* LCB access allowed */
+
+ /*
* The LNI has a mandatory wait time after the physical state
* moves to Offline.Quiet. The wait time may be different
* depending on how the link went down. The 8051 firmware
@@ -10396,6 +10415,9 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
& (HLS_DN_POLL | HLS_VERIFY_CAP | HLS_GOING_UP)) {
/* went down while attempting link up */
check_lni_states(ppd);
+
+ /* The QSFP doesn't need to be reset on LNI failure */
+ ppd->qsfp_info.reset_needed = 0;
}
/* the active link width (downgrade) is 0 on link down */
@@ -12804,6 +12826,39 @@ static int wait_physical_linkstate(struct hfi1_pportdata *ppd, u32 state,
return 0;
}
+/*
+ * wait_phys_link_offline_quiet_substates - wait for any offline substate
+ * @ppd: port device
+ * @msecs: the number of milliseconds to wait
+ *
+ * Wait up to msecs milliseconds for any offline physical link
+ * state change to occur.
+ * Returns 0 if at least one state is reached, otherwise -ETIMEDOUT.
+ */
+static int wait_phys_link_offline_substates(struct hfi1_pportdata *ppd,
+ int msecs)
+{
+ u32 read_state;
+ unsigned long timeout;
+
+ timeout = jiffies + msecs_to_jiffies(msecs);
+ while (1) {
+ read_state = read_physical_state(ppd->dd);
+ if ((read_state & 0xF0) == PLS_OFFLINE)
+ break;
+ if (time_after(jiffies, timeout)) {
+ dd_dev_err(ppd->dd,
+ "timeout waiting for phy link offline.quiet substates. Read state 0x%x, %dms\n",
+ read_state, msecs);
+ return -ETIMEDOUT;
+ }
+ usleep_range(1950, 2050); /* sleep 2ms-ish */
+ }
+
+ log_state_transition(ppd, read_state);
+ return read_state;
+}
+
#define CLEAR_STATIC_RATE_CONTROL_SMASK(r) \
(r &= ~SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
diff --git a/drivers/infiniband/hw/hfi1/chip.h b/drivers/infiniband/hw/hfi1/chip.h
index b8345a60a0fb..50b8645d0b87 100644
--- a/drivers/infiniband/hw/hfi1/chip.h
+++ b/drivers/infiniband/hw/hfi1/chip.h
@@ -204,6 +204,7 @@
#define PLS_OFFLINE_READY_TO_QUIET_LT 0x92
#define PLS_OFFLINE_REPORT_FAILURE 0x93
#define PLS_OFFLINE_READY_TO_QUIET_BCC 0x94
+#define PLS_OFFLINE_QUIET_DURATION 0x95
#define PLS_POLLING 0x20
#define PLS_POLLING_QUIET 0x20
#define PLS_POLLING_ACTIVE 0x21
@@ -722,7 +723,7 @@ void handle_link_downgrade(struct work_struct *work);
void handle_link_bounce(struct work_struct *work);
void handle_start_link(struct work_struct *work);
void handle_sma_message(struct work_struct *work);
-void reset_qsfp(struct hfi1_pportdata *ppd);
+int reset_qsfp(struct hfi1_pportdata *ppd);
void qsfp_event(struct work_struct *work);
void start_freeze_handling(struct hfi1_pportdata *ppd, int flags);
int send_idle_sma(struct hfi1_devdata *dd, u64 message);
diff --git a/drivers/infiniband/hw/hfi1/eprom.c b/drivers/infiniband/hw/hfi1/eprom.c
index d46b17107901..1613af1c58d9 100644
--- a/drivers/infiniband/hw/hfi1/eprom.c
+++ b/drivers/infiniband/hw/hfi1/eprom.c
@@ -204,7 +204,10 @@ done_asic:
return ret;
}
-/* magic character sequence that trails an image */
+/* magic character sequence that begins an image */
+#define IMAGE_START_MAGIC "APO="
+
+/* magic character sequence that might trail an image */
#define IMAGE_TRAIL_MAGIC "egamiAPO"
/* EPROM file types */
@@ -250,6 +253,7 @@ static int read_partition_platform_config(struct hfi1_devdata *dd, void **data,
{
void *buffer;
void *p;
+ u32 length;
int ret;
buffer = kmalloc(P1_SIZE, GFP_KERNEL);
@@ -262,15 +266,21 @@ static int read_partition_platform_config(struct hfi1_devdata *dd, void **data,
return ret;
}
- /* scan for image magic that may trail the actual data */
- p = strnstr(buffer, IMAGE_TRAIL_MAGIC, P1_SIZE);
- if (!p) {
+ /* config partition is valid only if it starts with IMAGE_START_MAGIC */
+ if (memcmp(buffer, IMAGE_START_MAGIC, strlen(IMAGE_START_MAGIC))) {
kfree(buffer);
return -ENOENT;
}
+ /* scan for image magic that may trail the actual data */
+ p = strnstr(buffer, IMAGE_TRAIL_MAGIC, P1_SIZE);
+ if (p)
+ length = p - buffer;
+ else
+ length = P1_SIZE;
+
*data = buffer;
- *size = p - buffer;
+ *size = length;
return 0;
}
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 2bc89260235a..d9a1e9893136 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -930,15 +930,8 @@ static int assign_ctxt(struct hfi1_filedata *fd, struct hfi1_user_info *uinfo)
switch (ret) {
case 0:
ret = setup_base_ctxt(fd, uctxt);
- if (uctxt->subctxt_cnt) {
- /*
- * Base context is done (successfully or not), notify
- * anybody using a sub-context that is waiting for
- * this completion.
- */
- clear_bit(HFI1_CTXT_BASE_UNINIT, &uctxt->event_flags);
- wake_up(&uctxt->wait);
- }
+ if (ret)
+ deallocate_ctxt(uctxt);
break;
case 1:
ret = complete_subctxt(fd);
@@ -1305,25 +1298,25 @@ static int setup_base_ctxt(struct hfi1_filedata *fd,
/* Now allocate the RcvHdr queue and eager buffers. */
ret = hfi1_create_rcvhdrq(dd, uctxt);
if (ret)
- return ret;
+ goto done;
ret = hfi1_setup_eagerbufs(uctxt);
if (ret)
- goto setup_failed;
+ goto done;
/* If sub-contexts are enabled, do the appropriate setup */
if (uctxt->subctxt_cnt)
ret = setup_subctxt(uctxt);
if (ret)
- goto setup_failed;
+ goto done;
ret = hfi1_alloc_ctxt_rcv_groups(uctxt);
if (ret)
- goto setup_failed;
+ goto done;
ret = init_user_ctxt(fd, uctxt);
if (ret)
- goto setup_failed;
+ goto done;
user_init(uctxt);
@@ -1331,12 +1324,22 @@ static int setup_base_ctxt(struct hfi1_filedata *fd,
fd->uctxt = uctxt;
hfi1_rcd_get(uctxt);
- return 0;
+done:
+ if (uctxt->subctxt_cnt) {
+ /*
+ * On error, set the failed bit so sub-contexts will clean up
+ * correctly.
+ */
+ if (ret)
+ set_bit(HFI1_CTXT_BASE_FAILED, &uctxt->event_flags);
-setup_failed:
- /* Set the failed bit so sub-context init can do the right thing */
- set_bit(HFI1_CTXT_BASE_FAILED, &uctxt->event_flags);
- deallocate_ctxt(uctxt);
+ /*
+ * Base context is done (successfully or not), notify anybody
+ * using a sub-context that is waiting for this completion.
+ */
+ clear_bit(HFI1_CTXT_BASE_UNINIT, &uctxt->event_flags);
+ wake_up(&uctxt->wait);
+ }
return ret;
}
diff --git a/drivers/infiniband/hw/hfi1/pcie.c b/drivers/infiniband/hw/hfi1/pcie.c
index 82447b7cdda1..09e50fd2a08f 100644
--- a/drivers/infiniband/hw/hfi1/pcie.c
+++ b/drivers/infiniband/hw/hfi1/pcie.c
@@ -68,7 +68,7 @@
/*
* Code to adjust PCIe capabilities.
*/
-static int tune_pcie_caps(struct hfi1_devdata *);
+static void tune_pcie_caps(struct hfi1_devdata *);
/*
* Do all the common PCIe setup and initialization.
@@ -351,7 +351,7 @@ int pcie_speeds(struct hfi1_devdata *dd)
*/
int request_msix(struct hfi1_devdata *dd, u32 msireq)
{
- int nvec, ret;
+ int nvec;
nvec = pci_alloc_irq_vectors(dd->pcidev, 1, msireq,
PCI_IRQ_MSIX | PCI_IRQ_LEGACY);
@@ -360,12 +360,7 @@ int request_msix(struct hfi1_devdata *dd, u32 msireq)
return nvec;
}
- ret = tune_pcie_caps(dd);
- if (ret) {
- dd_dev_err(dd, "tune_pcie_caps() failed: %d\n", ret);
- pci_free_irq_vectors(dd->pcidev);
- return ret;
- }
+ tune_pcie_caps(dd);
/* check for legacy IRQ */
if (nvec == 1 && !dd->pcidev->msix_enabled)
@@ -502,7 +497,7 @@ uint aspm_mode = ASPM_MODE_DISABLED;
module_param_named(aspm, aspm_mode, uint, S_IRUGO);
MODULE_PARM_DESC(aspm, "PCIe ASPM: 0: disable, 1: enable, 2: dynamic");
-static int tune_pcie_caps(struct hfi1_devdata *dd)
+static void tune_pcie_caps(struct hfi1_devdata *dd)
{
struct pci_dev *parent;
u16 rc_mpss, rc_mps, ep_mpss, ep_mps;
@@ -513,22 +508,14 @@ static int tune_pcie_caps(struct hfi1_devdata *dd)
* Turn on extended tags in DevCtl in case the BIOS has turned it off
* to improve WFR SDMA bandwidth
*/
- ret = pcie_capability_read_word(dd->pcidev,
- PCI_EXP_DEVCTL, &ectl);
- if (ret) {
- dd_dev_err(dd, "Unable to read from PCI config\n");
- return ret;
- }
-
- if (!(ectl & PCI_EXP_DEVCTL_EXT_TAG)) {
+ ret = pcie_capability_read_word(dd->pcidev, PCI_EXP_DEVCTL, &ectl);
+ if ((!ret) && !(ectl & PCI_EXP_DEVCTL_EXT_TAG)) {
dd_dev_info(dd, "Enabling PCIe extended tags\n");
ectl |= PCI_EXP_DEVCTL_EXT_TAG;
ret = pcie_capability_write_word(dd->pcidev,
PCI_EXP_DEVCTL, ectl);
- if (ret) {
- dd_dev_err(dd, "Unable to write to PCI config\n");
- return ret;
- }
+ if (ret)
+ dd_dev_info(dd, "Unable to write to PCI config\n");
}
/* Find out supported and configured values for parent (root) */
parent = dd->pcidev->bus->self;
@@ -536,15 +523,22 @@ static int tune_pcie_caps(struct hfi1_devdata *dd)
* The driver cannot perform the tuning if it does not have
* access to the upstream component.
*/
- if (!parent)
- return -EINVAL;
+ if (!parent) {
+ dd_dev_info(dd, "Parent not found\n");
+ return;
+ }
if (!pci_is_root_bus(parent->bus)) {
dd_dev_info(dd, "Parent not root\n");
- return -EINVAL;
+ return;
+ }
+ if (!pci_is_pcie(parent)) {
+ dd_dev_info(dd, "Parent is not PCI Express capable\n");
+ return;
+ }
+ if (!pci_is_pcie(dd->pcidev)) {
+ dd_dev_info(dd, "PCI device is not PCI Express capable\n");
+ return;
}
-
- if (!pci_is_pcie(parent) || !pci_is_pcie(dd->pcidev))
- return -EINVAL;
rc_mpss = parent->pcie_mpss;
rc_mps = ffs(pcie_get_mps(parent)) - 8;
/* Find out supported and configured values for endpoint (us) */
@@ -590,8 +584,6 @@ static int tune_pcie_caps(struct hfi1_devdata *dd)
ep_mrrs = max_mrrs;
pcie_set_readrq(dd->pcidev, ep_mrrs);
}
-
- return 0;
}
/* End of PCIe capability tuning */
diff --git a/drivers/infiniband/hw/hfi1/platform.c b/drivers/infiniband/hw/hfi1/platform.c
index a8af96d2b1b0..d486355880cb 100644
--- a/drivers/infiniband/hw/hfi1/platform.c
+++ b/drivers/infiniband/hw/hfi1/platform.c
@@ -790,7 +790,9 @@ static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
* reuse of stale settings established in our previous pass through.
*/
if (ppd->qsfp_info.reset_needed) {
- reset_qsfp(ppd);
+ ret = reset_qsfp(ppd);
+ if (ret)
+ return ret;
refresh_qsfp_cache(ppd, &ppd->qsfp_info);
} else {
ppd->qsfp_info.reset_needed = 1;
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h
index 9b1566468744..a65e4cbdce2f 100644
--- a/drivers/infiniband/hw/i40iw/i40iw.h
+++ b/drivers/infiniband/hw/i40iw/i40iw.h
@@ -201,7 +201,6 @@ enum init_completion_state {
CEQ_CREATED,
ILQ_CREATED,
IEQ_CREATED,
- INET_NOTIFIER,
IP_ADDR_REGISTERED,
RDMA_DEV_REGISTERED
};
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index 14f36ba4e5be..5230dd3c938c 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -1504,23 +1504,40 @@ static void i40iw_add_hte_node(struct i40iw_cm_core *cm_core,
}
/**
- * listen_port_in_use - determine if port is in use
- * @port: Listen port number
+ * i40iw_port_in_use - determine if port is in use
+ * @port: port number
+ * @active_side: flag for listener side vs active side
*/
-static bool i40iw_listen_port_in_use(struct i40iw_cm_core *cm_core, u16 port)
+static bool i40iw_port_in_use(struct i40iw_cm_core *cm_core, u16 port, bool active_side)
{
struct i40iw_cm_listener *listen_node;
+ struct i40iw_cm_node *cm_node;
unsigned long flags;
bool ret = false;
- spin_lock_irqsave(&cm_core->listen_list_lock, flags);
- list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
- if (listen_node->loc_port == port) {
- ret = true;
- break;
+ if (active_side) {
+ /* search connected node list */
+ spin_lock_irqsave(&cm_core->ht_lock, flags);
+ list_for_each_entry(cm_node, &cm_core->connected_nodes, list) {
+ if (cm_node->loc_port == port) {
+ ret = true;
+ break;
+ }
+ }
+ if (!ret)
+ clear_bit(port, cm_core->active_side_ports);
+ spin_unlock_irqrestore(&cm_core->ht_lock, flags);
+ } else {
+ spin_lock_irqsave(&cm_core->listen_list_lock, flags);
+ list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
+ if (listen_node->loc_port == port) {
+ ret = true;
+ break;
+ }
}
+ spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
}
- spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
+
return ret;
}
@@ -1868,7 +1885,7 @@ static int i40iw_dec_refcnt_listen(struct i40iw_cm_core *cm_core,
spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
if (listener->iwdev) {
- if (apbvt_del && !i40iw_listen_port_in_use(cm_core, listener->loc_port))
+ if (apbvt_del && !i40iw_port_in_use(cm_core, listener->loc_port, false))
i40iw_manage_apbvt(listener->iwdev,
listener->loc_port,
I40IW_MANAGE_APBVT_DEL);
@@ -2247,21 +2264,21 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node)
if (cm_node->listener) {
i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true);
} else {
- if (!i40iw_listen_port_in_use(cm_core, cm_node->loc_port) &&
- cm_node->apbvt_set) {
+ if (!i40iw_port_in_use(cm_core, cm_node->loc_port, true) && cm_node->apbvt_set) {
i40iw_manage_apbvt(cm_node->iwdev,
cm_node->loc_port,
I40IW_MANAGE_APBVT_DEL);
- i40iw_get_addr_info(cm_node, &nfo);
- if (cm_node->qhash_set) {
- i40iw_manage_qhash(cm_node->iwdev,
- &nfo,
- I40IW_QHASH_TYPE_TCP_ESTABLISHED,
- I40IW_QHASH_MANAGE_TYPE_DELETE,
- NULL,
- false);
- cm_node->qhash_set = 0;
- }
+ cm_node->apbvt_set = 0;
+ }
+ i40iw_get_addr_info(cm_node, &nfo);
+ if (cm_node->qhash_set) {
+ i40iw_manage_qhash(cm_node->iwdev,
+ &nfo,
+ I40IW_QHASH_TYPE_TCP_ESTABLISHED,
+ I40IW_QHASH_MANAGE_TYPE_DELETE,
+ NULL,
+ false);
+ cm_node->qhash_set = 0;
}
}
@@ -3255,7 +3272,8 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node,
tcp_info->snd_mss = cpu_to_le32(((u32)cm_node->tcp_cntxt.mss));
if (cm_node->vlan_id < VLAN_TAG_PRESENT) {
tcp_info->insert_vlan_tag = true;
- tcp_info->vlan_tag = cpu_to_le16(cm_node->vlan_id);
+ tcp_info->vlan_tag = cpu_to_le16(((u16)cm_node->user_pri << I40IW_VLAN_PRIO_SHIFT) |
+ cm_node->vlan_id);
}
if (cm_node->ipv4) {
tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
@@ -3737,10 +3755,8 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct sockaddr_in *raddr;
struct sockaddr_in6 *laddr6;
struct sockaddr_in6 *raddr6;
- bool qhash_set = false;
- int apbvt_set = 0;
- int err = 0;
- enum i40iw_status_code status;
+ int ret = 0;
+ unsigned long flags;
ibqp = i40iw_get_qp(cm_id->device, conn_param->qpn);
if (!ibqp)
@@ -3789,32 +3805,6 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
cm_info.user_pri = rt_tos2priority(cm_id->tos);
i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_DCB, "%s TOS:[%d] UP:[%d]\n",
__func__, cm_id->tos, cm_info.user_pri);
- if ((cm_info.ipv4 && (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr)) ||
- (!cm_info.ipv4 && memcmp(laddr6->sin6_addr.in6_u.u6_addr32,
- raddr6->sin6_addr.in6_u.u6_addr32,
- sizeof(laddr6->sin6_addr.in6_u.u6_addr32)))) {
- status = i40iw_manage_qhash(iwdev,
- &cm_info,
- I40IW_QHASH_TYPE_TCP_ESTABLISHED,
- I40IW_QHASH_MANAGE_TYPE_ADD,
- NULL,
- true);
- if (status)
- return -EINVAL;
- qhash_set = true;
- }
- status = i40iw_manage_apbvt(iwdev, cm_info.loc_port, I40IW_MANAGE_APBVT_ADD);
- if (status) {
- i40iw_manage_qhash(iwdev,
- &cm_info,
- I40IW_QHASH_TYPE_TCP_ESTABLISHED,
- I40IW_QHASH_MANAGE_TYPE_DELETE,
- NULL,
- false);
- return -EINVAL;
- }
-
- apbvt_set = 1;
cm_id->add_ref(cm_id);
cm_node = i40iw_create_cm_node(&iwdev->cm_core, iwdev,
conn_param->private_data_len,
@@ -3822,17 +3812,40 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
&cm_info);
if (IS_ERR(cm_node)) {
- err = PTR_ERR(cm_node);
- goto err_out;
+ ret = PTR_ERR(cm_node);
+ cm_id->rem_ref(cm_id);
+ return ret;
+ }
+
+ if ((cm_info.ipv4 && (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr)) ||
+ (!cm_info.ipv4 && memcmp(laddr6->sin6_addr.in6_u.u6_addr32,
+ raddr6->sin6_addr.in6_u.u6_addr32,
+ sizeof(laddr6->sin6_addr.in6_u.u6_addr32)))) {
+ if (i40iw_manage_qhash(iwdev, &cm_info, I40IW_QHASH_TYPE_TCP_ESTABLISHED,
+ I40IW_QHASH_MANAGE_TYPE_ADD, NULL, true)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ cm_node->qhash_set = true;
}
+ spin_lock_irqsave(&iwdev->cm_core.ht_lock, flags);
+ if (!test_and_set_bit(cm_info.loc_port, iwdev->cm_core.active_side_ports)) {
+ spin_unlock_irqrestore(&iwdev->cm_core.ht_lock, flags);
+ if (i40iw_manage_apbvt(iwdev, cm_info.loc_port, I40IW_MANAGE_APBVT_ADD)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ } else {
+ spin_unlock_irqrestore(&iwdev->cm_core.ht_lock, flags);
+ }
+
+ cm_node->apbvt_set = true;
i40iw_record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord);
if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO &&
!cm_node->ord_size)
cm_node->ord_size = 1;
- cm_node->apbvt_set = apbvt_set;
- cm_node->qhash_set = qhash_set;
iwqp->cm_node = cm_node;
cm_node->iwqp = iwqp;
iwqp->cm_id = cm_id;
@@ -3840,11 +3853,9 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
if (cm_node->state != I40IW_CM_STATE_OFFLOADED) {
cm_node->state = I40IW_CM_STATE_SYN_SENT;
- err = i40iw_send_syn(cm_node, 0);
- if (err) {
- i40iw_rem_ref_cm_node(cm_node);
- goto err_out;
- }
+ ret = i40iw_send_syn(cm_node, 0);
+ if (ret)
+ goto err;
}
i40iw_debug(cm_node->dev,
@@ -3853,9 +3864,10 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
cm_node->rem_port,
cm_node,
cm_node->cm_id);
+
return 0;
-err_out:
+err:
if (cm_info.ipv4)
i40iw_debug(&iwdev->sc_dev,
I40IW_DEBUG_CM,
@@ -3867,22 +3879,10 @@ err_out:
"Api - connect() FAILED: dest addr=%pI6",
cm_info.rem_addr);
- if (qhash_set)
- i40iw_manage_qhash(iwdev,
- &cm_info,
- I40IW_QHASH_TYPE_TCP_ESTABLISHED,
- I40IW_QHASH_MANAGE_TYPE_DELETE,
- NULL,
- false);
-
- if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core,
- cm_info.loc_port))
- i40iw_manage_apbvt(iwdev,
- cm_info.loc_port,
- I40IW_MANAGE_APBVT_DEL);
+ i40iw_rem_ref_cm_node(cm_node);
cm_id->rem_ref(cm_id);
iwdev->cm_core.stats_connect_errs++;
- return err;
+ return ret;
}
/**
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.h b/drivers/infiniband/hw/i40iw/i40iw_cm.h
index 2e52e38ffcf3..45abef76295b 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.h
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.h
@@ -71,6 +71,9 @@
#define I40IW_HW_IRD_SETTING_32 32
#define I40IW_HW_IRD_SETTING_64 64
+#define MAX_PORTS 65536
+#define I40IW_VLAN_PRIO_SHIFT 13
+
enum ietf_mpa_flags {
IETF_MPA_FLAGS_MARKERS = 0x80, /* receive Markers */
IETF_MPA_FLAGS_CRC = 0x40, /* receive Markers */
@@ -411,6 +414,8 @@ struct i40iw_cm_core {
spinlock_t ht_lock; /* manage hash table */
spinlock_t listen_list_lock; /* listen list */
+ unsigned long active_side_ports[BITS_TO_LONGS(MAX_PORTS)];
+
u64 stats_nodes_created;
u64 stats_nodes_destroyed;
u64 stats_listen_created;
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index cc742c3132c6..27590ae21881 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -99,8 +99,6 @@ static struct notifier_block i40iw_net_notifier = {
.notifier_call = i40iw_net_event
};
-static atomic_t i40iw_notifiers_registered;
-
/**
* i40iw_find_i40e_handler - find a handler given a client info
* @ldev: pointer to a client info
@@ -1376,11 +1374,20 @@ error:
*/
static void i40iw_register_notifiers(void)
{
- if (atomic_inc_return(&i40iw_notifiers_registered) == 1) {
- register_inetaddr_notifier(&i40iw_inetaddr_notifier);
- register_inet6addr_notifier(&i40iw_inetaddr6_notifier);
- register_netevent_notifier(&i40iw_net_notifier);
- }
+ register_inetaddr_notifier(&i40iw_inetaddr_notifier);
+ register_inet6addr_notifier(&i40iw_inetaddr6_notifier);
+ register_netevent_notifier(&i40iw_net_notifier);
+}
+
+/**
+ * i40iw_unregister_notifiers - unregister tcp ip notifiers
+ */
+
+static void i40iw_unregister_notifiers(void)
+{
+ unregister_netevent_notifier(&i40iw_net_notifier);
+ unregister_inetaddr_notifier(&i40iw_inetaddr_notifier);
+ unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);
}
/**
@@ -1400,6 +1407,11 @@ static enum i40iw_status_code i40iw_save_msix_info(struct i40iw_device *iwdev,
u32 i;
u32 size;
+ if (!ldev->msix_count) {
+ i40iw_pr_err("No MSI-X vectors\n");
+ return I40IW_ERR_CONFIG;
+ }
+
iwdev->msix_count = ldev->msix_count;
size = sizeof(struct i40iw_msix_vector) * iwdev->msix_count;
@@ -1462,12 +1474,6 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev)
if (!iwdev->reset)
i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx);
/* fallthrough */
- case INET_NOTIFIER:
- if (!atomic_dec_return(&i40iw_notifiers_registered)) {
- unregister_netevent_notifier(&i40iw_net_notifier);
- unregister_inetaddr_notifier(&i40iw_inetaddr_notifier);
- unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);
- }
/* fallthrough */
case PBLE_CHUNK_MEM:
i40iw_destroy_pble_pool(dev, iwdev->pble_rsrc);
@@ -1550,7 +1556,7 @@ static enum i40iw_status_code i40iw_setup_init_state(struct i40iw_handler *hdl,
status = i40iw_save_msix_info(iwdev, ldev);
if (status)
- goto exit;
+ return status;
iwdev->hw.dev_context = (void *)ldev->pcidev;
iwdev->hw.hw_addr = ldev->hw_addr;
status = i40iw_allocate_dma_mem(&iwdev->hw,
@@ -1667,8 +1673,6 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)
break;
iwdev->init_state = PBLE_CHUNK_MEM;
iwdev->virtchnl_wq = alloc_ordered_workqueue("iwvch", WQ_MEM_RECLAIM);
- i40iw_register_notifiers();
- iwdev->init_state = INET_NOTIFIER;
status = i40iw_add_mac_ip(iwdev);
if (status)
break;
@@ -2018,6 +2022,8 @@ static int __init i40iw_init_module(void)
i40iw_client.type = I40E_CLIENT_IWARP;
spin_lock_init(&i40iw_handler_lock);
ret = i40e_register_client(&i40iw_client);
+ i40iw_register_notifiers();
+
return ret;
}
@@ -2029,6 +2035,7 @@ static int __init i40iw_init_module(void)
*/
static void __exit i40iw_exit_module(void)
{
+ i40iw_unregister_notifiers();
i40e_unregister_client(&i40iw_client);
}
diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c
index 62f1f45b8737..e52dbbb4165e 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_utils.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c
@@ -160,7 +160,7 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
return NOTIFY_DONE;
iwdev = &hdl->device;
- if (iwdev->init_state < INET_NOTIFIER)
+ if (iwdev->init_state < IP_ADDR_REGISTERED || iwdev->closing)
return NOTIFY_DONE;
netdev = iwdev->ldev->netdev;
@@ -217,7 +217,7 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
return NOTIFY_DONE;
iwdev = &hdl->device;
- if (iwdev->init_state < INET_NOTIFIER)
+ if (iwdev->init_state < IP_ADDR_REGISTERED || iwdev->closing)
return NOTIFY_DONE;
netdev = iwdev->ldev->netdev;
@@ -266,7 +266,7 @@ int i40iw_net_event(struct notifier_block *notifier, unsigned long event, void *
if (!iwhdl)
return NOTIFY_DONE;
iwdev = &iwhdl->device;
- if (iwdev->init_state < INET_NOTIFIER)
+ if (iwdev->init_state < IP_ADDR_REGISTERED || iwdev->closing)
return NOTIFY_DONE;
p = (__be32 *)neigh->primary_key;
i40iw_copy_ip_ntohl(local_ipaddr, p);
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index 1aa411034a27..28b3d02d511b 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -1027,7 +1027,19 @@ int i40iw_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
iwqp->hw_tcp_state = I40IW_TCP_STATE_CLOSED;
iwqp->last_aeq = I40IW_AE_RESET_SENT;
spin_unlock_irqrestore(&iwqp->lock, flags);
+ i40iw_cm_disconn(iwqp);
}
+ } else {
+ spin_lock_irqsave(&iwqp->lock, flags);
+ if (iwqp->cm_id) {
+ if (atomic_inc_return(&iwqp->close_timer_started) == 1) {
+ iwqp->cm_id->add_ref(iwqp->cm_id);
+ i40iw_schedule_cm_timer(iwqp->cm_node,
+ (struct i40iw_puda_buf *)iwqp,
+ I40IW_TIMER_TYPE_CLOSE, 1, 0);
+ }
+ }
+ spin_unlock_irqrestore(&iwqp->lock, flags);
}
}
return 0;
diff --git a/drivers/infiniband/hw/mlx4/sysfs.c b/drivers/infiniband/hw/mlx4/sysfs.c
index 0ba5ba7540c8..e219093d2764 100644
--- a/drivers/infiniband/hw/mlx4/sysfs.c
+++ b/drivers/infiniband/hw/mlx4/sysfs.c
@@ -221,7 +221,7 @@ void del_sysfs_port_mcg_attr(struct mlx4_ib_dev *device, int port_num,
static int add_port_entries(struct mlx4_ib_dev *device, int port_num)
{
int i;
- char buff[10];
+ char buff[11];
struct mlx4_ib_iov_port *port = NULL;
int ret = 0 ;
struct ib_port_attr attr;
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index ab3c562d5ba7..d6fbad8f34aa 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -778,13 +778,13 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
}
if (MLX5_CAP_GEN(mdev, tag_matching)) {
- props->xrq_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE;
- props->xrq_caps.max_num_tags =
+ props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE;
+ props->tm_caps.max_num_tags =
(1 << MLX5_CAP_GEN(mdev, log_tag_matching_list_sz)) - 1;
- props->xrq_caps.flags = IB_TM_CAP_RC;
- props->xrq_caps.max_ops =
+ props->tm_caps.flags = IB_TM_CAP_RC;
+ props->tm_caps.max_ops =
1 << MLX5_CAP_GEN(mdev, log_max_qp_sz);
- props->xrq_caps.max_sge = MLX5_TM_MAX_SGE;
+ props->tm_caps.max_sge = MLX5_TM_MAX_SGE;
}
if (field_avail(typeof(resp), cqe_comp_caps, uhw->outlen)) {
@@ -3837,11 +3837,13 @@ static int delay_drop_debugfs_init(struct mlx5_ib_dev *dev)
if (!dbg)
return -ENOMEM;
+ dev->delay_drop.dbg = dbg;
+
dbg->dir_debugfs =
debugfs_create_dir("delay_drop",
dev->mdev->priv.dbg_root);
if (!dbg->dir_debugfs)
- return -ENOMEM;
+ goto out_debugfs;
dbg->events_cnt_debugfs =
debugfs_create_atomic_t("num_timeout_events", 0400,
@@ -3865,8 +3867,6 @@ static int delay_drop_debugfs_init(struct mlx5_ib_dev *dev)
if (!dbg->timeout_debugfs)
goto out_debugfs;
- dev->delay_drop.dbg = dbg;
-
return 0;
out_debugfs:
diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/mem.c
index 914f212e7ef6..f3dbd75a0a96 100644
--- a/drivers/infiniband/hw/mlx5/mem.c
+++ b/drivers/infiniband/hw/mlx5/mem.c
@@ -50,13 +50,9 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr,
{
unsigned long tmp;
unsigned long m;
- int i, k;
- u64 base = 0;
- int p = 0;
- int skip;
- int mask;
- u64 len;
- u64 pfn;
+ u64 base = ~0, p = 0;
+ u64 len, pfn;
+ int i = 0;
struct scatterlist *sg;
int entry;
unsigned long page_shift = umem->page_shift;
@@ -76,33 +72,24 @@ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr,
m = find_first_bit(&tmp, BITS_PER_LONG);
if (max_page_shift)
m = min_t(unsigned long, max_page_shift - page_shift, m);
- skip = 1 << m;
- mask = skip - 1;
- i = 0;
+
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
len = sg_dma_len(sg) >> page_shift;
pfn = sg_dma_address(sg) >> page_shift;
- for (k = 0; k < len; k++) {
- if (!(i & mask)) {
- tmp = (unsigned long)pfn;
- m = min_t(unsigned long, m, find_first_bit(&tmp, BITS_PER_LONG));
- skip = 1 << m;
- mask = skip - 1;
- base = pfn;
- p = 0;
- } else {
- if (base + p != pfn) {
- tmp = (unsigned long)p;
- m = find_first_bit(&tmp, BITS_PER_LONG);
- skip = 1 << m;
- mask = skip - 1;
- base = pfn;
- p = 0;
- }
- }
- p++;
- i++;
+ if (base + p != pfn) {
+ /* If either the offset or the new
+ * base are unaligned update m
+ */
+ tmp = (unsigned long)(pfn | p);
+ if (!IS_ALIGNED(tmp, 1 << m))
+ m = find_first_bit(&tmp, BITS_PER_LONG);
+
+ base = pfn;
+ p = 0;
}
+
+ p += len;
+ i += len;
}
if (i) {
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 0e2789d9bb4d..37bbc543847a 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -47,7 +47,8 @@ enum {
#define MLX5_UMR_ALIGN 2048
-static int clean_mr(struct mlx5_ib_mr *mr);
+static int clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
+static int dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
static int mr_cache_max_order(struct mlx5_ib_dev *dev);
static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
@@ -1270,8 +1271,9 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
err = mlx5_ib_update_xlt(mr, 0, ncont, page_shift,
update_xlt_flags);
+
if (err) {
- mlx5_ib_dereg_mr(&mr->ibmr);
+ dereg_mr(dev, mr);
return ERR_PTR(err);
}
}
@@ -1356,7 +1358,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
err = mr_umem_get(pd, addr, len, access_flags, &mr->umem,
&npages, &page_shift, &ncont, &order);
if (err < 0) {
- clean_mr(mr);
+ clean_mr(dev, mr);
return err;
}
}
@@ -1410,7 +1412,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
if (err) {
mlx5_ib_warn(dev, "Failed to rereg UMR\n");
ib_umem_release(mr->umem);
- clean_mr(mr);
+ clean_mr(dev, mr);
return err;
}
}
@@ -1469,9 +1471,8 @@ mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
}
}
-static int clean_mr(struct mlx5_ib_mr *mr)
+static int clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
{
- struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
int allocated_from_cache = mr->allocated_from_cache;
int err;
@@ -1507,10 +1508,8 @@ static int clean_mr(struct mlx5_ib_mr *mr)
return 0;
}
-int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
+static int dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
{
- struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
- struct mlx5_ib_mr *mr = to_mmr(ibmr);
int npages = mr->npages;
struct ib_umem *umem = mr->umem;
@@ -1539,7 +1538,7 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
}
#endif
- clean_mr(mr);
+ clean_mr(dev, mr);
if (umem) {
ib_umem_release(umem);
@@ -1549,6 +1548,14 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
return 0;
}
+int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
+{
+ struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
+ struct mlx5_ib_mr *mr = to_mmr(ibmr);
+
+ return dereg_mr(dev, mr);
+}
+
struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd,
enum ib_mr_type mr_type,
u32 max_num_sg)
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index f0dc5f4aa177..442b9bdc0f03 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -3232,7 +3232,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
mr->ibmr.iova);
set_wqe_32bit_value(wqe->wqe_words,
NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX,
- mr->ibmr.length);
+ lower_32_bits(mr->ibmr.length));
set_wqe_32bit_value(wqe->wqe_words,
NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX, 0);
set_wqe_32bit_value(wqe->wqe_words,
@@ -3274,7 +3274,7 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
mr->npages * 8);
nes_debug(NES_DBG_IW_TX, "SQ_REG_MR: iova_start: %llx, "
- "length: %d, rkey: %0x, pgl_paddr: %llx, "
+ "length: %lld, rkey: %0x, pgl_paddr: %llx, "
"page_list_len: %u, wqe_misc: %x\n",
(unsigned long long) mr->ibmr.iova,
mr->ibmr.length,
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index dcb5942f9fb5..65b166cc7437 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -252,7 +252,10 @@ static int ocrdma_get_mbx_errno(u32 status)
case OCRDMA_MBX_ADDI_STATUS_INSUFFICIENT_RESOURCES:
err_num = -EAGAIN;
break;
+ default:
+ err_num = -EFAULT;
}
+ break;
default:
err_num = -EFAULT;
}
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
index 663a0c301c43..984aa3484928 100644
--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
+++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
@@ -416,9 +416,34 @@ static inline enum ib_wc_status pvrdma_wc_status_to_ib(
return (enum ib_wc_status)status;
}
-static inline int pvrdma_wc_opcode_to_ib(int opcode)
-{
- return opcode;
+static inline int pvrdma_wc_opcode_to_ib(unsigned int opcode)
+{
+ switch (opcode) {
+ case PVRDMA_WC_SEND:
+ return IB_WC_SEND;
+ case PVRDMA_WC_RDMA_WRITE:
+ return IB_WC_RDMA_WRITE;
+ case PVRDMA_WC_RDMA_READ:
+ return IB_WC_RDMA_READ;
+ case PVRDMA_WC_COMP_SWAP:
+ return IB_WC_COMP_SWAP;
+ case PVRDMA_WC_FETCH_ADD:
+ return IB_WC_FETCH_ADD;
+ case PVRDMA_WC_LOCAL_INV:
+ return IB_WC_LOCAL_INV;
+ case PVRDMA_WC_FAST_REG_MR:
+ return IB_WC_REG_MR;
+ case PVRDMA_WC_MASKED_COMP_SWAP:
+ return IB_WC_MASKED_COMP_SWAP;
+ case PVRDMA_WC_MASKED_FETCH_ADD:
+ return IB_WC_MASKED_FETCH_ADD;
+ case PVRDMA_WC_RECV:
+ return IB_WC_RECV;
+ case PVRDMA_WC_RECV_RDMA_WITH_IMM:
+ return IB_WC_RECV_RDMA_WITH_IMM;
+ default:
+ return IB_WC_SEND;
+ }
}
static inline int pvrdma_wc_flags_to_ib(int flags)
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 14b62f7472b4..7774654c2ccb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -823,12 +823,18 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
wc->status != IB_WC_WR_FLUSH_ERR) {
struct ipoib_neigh *neigh;
- if (wc->status != IB_WC_RNR_RETRY_EXC_ERR)
- ipoib_warn(priv, "failed cm send event (status=%d, wrid=%d vend_err %x)\n",
- wc->status, wr_id, wc->vendor_err);
+ /* IB_WC[_RNR]_RETRY_EXC_ERR error is part of the life cycle,
+ * so don't make waves.
+ */
+ if (wc->status == IB_WC_RNR_RETRY_EXC_ERR ||
+ wc->status == IB_WC_RETRY_EXC_ERR)
+ ipoib_dbg(priv,
+ "%s: failed cm send event (status=%d, wrid=%d vend_err 0x%x)\n",
+ __func__, wc->status, wr_id, wc->vendor_err);
else
- ipoib_dbg(priv, "failed cm send event (status=%d, wrid=%d vend_err %x)\n",
- wc->status, wr_id, wc->vendor_err);
+ ipoib_warn(priv,
+ "%s: failed cm send event (status=%d, wrid=%d vend_err 0x%x)\n",
+ __func__, wc->status, wr_id, wc->vendor_err);
spin_lock_irqsave(&priv->lock, flags);
neigh = tx->neigh;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 2e075377242e..6cd61638b441 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -1000,19 +1000,6 @@ static inline int update_parent_pkey(struct ipoib_dev_priv *priv)
*/
priv->dev->broadcast[8] = priv->pkey >> 8;
priv->dev->broadcast[9] = priv->pkey & 0xff;
-
- /*
- * Update the broadcast address in the priv->broadcast object,
- * in case it already exists, otherwise no one will do that.
- */
- if (priv->broadcast) {
- spin_lock_irq(&priv->lock);
- memcpy(priv->broadcast->mcmember.mgid.raw,
- priv->dev->broadcast + 4,
- sizeof(union ib_gid));
- spin_unlock_irq(&priv->lock);
- }
-
return 0;
}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index bac95b509a9b..dcc77014018d 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -2180,6 +2180,7 @@ static struct net_device *ipoib_add_port(const char *format,
{
struct ipoib_dev_priv *priv;
struct ib_port_attr attr;
+ struct rdma_netdev *rn;
int result = -ENOMEM;
priv = ipoib_intf_alloc(hca, port, format);
@@ -2279,7 +2280,8 @@ register_failed:
ipoib_dev_cleanup(priv->dev);
device_init_failed:
- free_netdev(priv->dev);
+ rn = netdev_priv(priv->dev);
+ rn->free_rdma_netdev(priv->dev);
kfree(priv);
alloc_mem_failed:
@@ -2328,7 +2330,7 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data)
return;
list_for_each_entry_safe(priv, tmp, dev_list, list) {
- struct rdma_netdev *rn = netdev_priv(priv->dev);
+ struct rdma_netdev *parent_rn = netdev_priv(priv->dev);
ib_unregister_event_handler(&priv->event_handler);
flush_workqueue(ipoib_workqueue);
@@ -2350,10 +2352,15 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data)
unregister_netdev(priv->dev);
mutex_unlock(&priv->sysfs_mutex);
- rn->free_rdma_netdev(priv->dev);
+ parent_rn->free_rdma_netdev(priv->dev);
+
+ list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) {
+ struct rdma_netdev *child_rn;
- list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list)
+ child_rn = netdev_priv(cpriv->dev);
+ child_rn->free_rdma_netdev(cpriv->dev);
kfree(cpriv);
+ }
kfree(priv);
}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
index 9927cd6b7082..55a9b71ed05a 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
@@ -141,14 +141,17 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
return restart_syscall();
}
- priv = ipoib_intf_alloc(ppriv->ca, ppriv->port, intf_name);
- if (!priv) {
+ if (!down_write_trylock(&ppriv->vlan_rwsem)) {
rtnl_unlock();
mutex_unlock(&ppriv->sysfs_mutex);
- return -ENOMEM;
+ return restart_syscall();
}
- down_write(&ppriv->vlan_rwsem);
+ priv = ipoib_intf_alloc(ppriv->ca, ppriv->port, intf_name);
+ if (!priv) {
+ result = -ENOMEM;
+ goto out;
+ }
/*
* First ensure this isn't a duplicate. We check the parent device and
@@ -175,8 +178,11 @@ out:
rtnl_unlock();
mutex_unlock(&ppriv->sysfs_mutex);
- if (result) {
- free_netdev(priv->dev);
+ if (result && priv) {
+ struct rdma_netdev *rn;
+
+ rn = netdev_priv(priv->dev);
+ rn->free_rdma_netdev(priv->dev);
kfree(priv);
}
@@ -204,7 +210,12 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
return restart_syscall();
}
- down_write(&ppriv->vlan_rwsem);
+ if (!down_write_trylock(&ppriv->vlan_rwsem)) {
+ rtnl_unlock();
+ mutex_unlock(&ppriv->sysfs_mutex);
+ return restart_syscall();
+ }
+
list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) {
if (priv->pkey == pkey &&
priv->child_type == IPOIB_LEGACY_CHILD) {
@@ -224,7 +235,10 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
mutex_unlock(&ppriv->sysfs_mutex);
if (dev) {
- free_netdev(dev);
+ struct rdma_netdev *rn;
+
+ rn = netdev_priv(dev);
+ rn->free_rdma_netdev(priv->dev);
kfree(priv);
return 0;
}
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index 9c3e9ab53a41..322209d5ff58 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -154,7 +154,7 @@ static void iser_dump_page_vec(struct iser_page_vec *page_vec)
{
int i;
- iser_err("page vec npages %d data length %d\n",
+ iser_err("page vec npages %d data length %lld\n",
page_vec->npages, page_vec->fake_mr.length);
for (i = 0; i < page_vec->npages; i++)
iser_err("vec[%d]: %llx\n", i, page_vec->pages[i]);
diff --git a/drivers/input/ff-core.c b/drivers/input/ff-core.c
index 8f2042432c85..66a46c84e28f 100644
--- a/drivers/input/ff-core.c
+++ b/drivers/input/ff-core.c
@@ -237,9 +237,15 @@ int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file)
EXPORT_SYMBOL_GPL(input_ff_erase);
/*
- * flush_effects - erase all effects owned by a file handle
+ * input_ff_flush - erase all effects owned by a file handle
+ * @dev: input device to erase effect from
+ * @file: purported owner of the effects
+ *
+ * This function erases all force-feedback effects associated with
+ * the given owner from specified device. Note that @file may be %NULL,
+ * in which case all effects will be erased.
*/
-static int flush_effects(struct input_dev *dev, struct file *file)
+int input_ff_flush(struct input_dev *dev, struct file *file)
{
struct ff_device *ff = dev->ff;
int i;
@@ -255,6 +261,7 @@ static int flush_effects(struct input_dev *dev, struct file *file)
return 0;
}
+EXPORT_SYMBOL_GPL(input_ff_flush);
/**
* input_ff_event() - generic handler for force-feedback events
@@ -343,7 +350,7 @@ int input_ff_create(struct input_dev *dev, unsigned int max_effects)
mutex_init(&ff->mutex);
dev->ff = ff;
- dev->flush = flush_effects;
+ dev->flush = input_ff_flush;
dev->event = input_ff_event;
__set_bit(EV_FF, dev->evbit);
diff --git a/drivers/input/joystick/adi.c b/drivers/input/joystick/adi.c
index d09cefa37931..15a71acb6997 100644
--- a/drivers/input/joystick/adi.c
+++ b/drivers/input/joystick/adi.c
@@ -313,7 +313,7 @@ static void adi_close(struct input_dev *dev)
static void adi_init_digital(struct gameport *gameport)
{
- int seq[] = { 4, -2, -3, 10, -6, -11, -7, -9, 11, 0 };
+ static const int seq[] = { 4, -2, -3, 10, -6, -11, -7, -9, 11, 0 };
int i;
for (i = 0; seq[i]; i++) {
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index f8e34ef643c7..d86e59515b9c 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -1764,10 +1764,12 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
struct usb_endpoint_descriptor *ep =
&intf->cur_altsetting->endpoint[i].desc;
- if (usb_endpoint_dir_in(ep))
- ep_irq_in = ep;
- else
- ep_irq_out = ep;
+ if (usb_endpoint_xfer_int(ep)) {
+ if (usb_endpoint_dir_in(ep))
+ ep_irq_in = ep;
+ else
+ ep_irq_out = ep;
+ }
}
if (!ep_irq_in || !ep_irq_out) {
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index f47e836eaa0f..9f082a388388 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -581,6 +581,18 @@ config INPUT_PWM_BEEPER
To compile this driver as a module, choose M here: the module will be
called pwm-beeper.
+config INPUT_PWM_VIBRA
+ tristate "PWM vibrator support"
+ depends on PWM
+ select INPUT_FF_MEMLESS
+ help
+ Say Y here to get support for PWM based vibrator devices.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the module will be
+ called pwm-vibra.
+
config INPUT_RK805_PWRKEY
tristate "Rockchip RK805 PMIC power key support"
depends on MFD_RK808
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 1072e0760c19..03fd4262ada9 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_INPUT_PM8XXX_VIBRATOR) += pm8xxx-vibrator.o
obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o
obj-$(CONFIG_INPUT_POWERMATE) += powermate.o
obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o
+obj-$(CONFIG_INPUT_PWM_VIBRA) += pwm-vibra.o
obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o
obj-$(CONFIG_INPUT_REGULATOR_HAPTIC) += regulator-haptic.o
obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o
diff --git a/drivers/input/misc/pwm-vibra.c b/drivers/input/misc/pwm-vibra.c
new file mode 100644
index 000000000000..55da191ae550
--- /dev/null
+++ b/drivers/input/misc/pwm-vibra.c
@@ -0,0 +1,267 @@
+/*
+ * PWM vibrator driver
+ *
+ * Copyright (C) 2017 Collabora Ltd.
+ *
+ * Based on previous work from:
+ * Copyright (C) 2012 Dmitry Torokhov <[email protected]>
+ *
+ * Based on PWM beeper driver:
+ * Copyright (C) 2010, Lars-Peter Clausen <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/input.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/pwm.h>
+#include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+
+struct pwm_vibrator {
+ struct input_dev *input;
+ struct pwm_device *pwm;
+ struct pwm_device *pwm_dir;
+ struct regulator *vcc;
+
+ struct work_struct play_work;
+ u16 level;
+ u32 direction_duty_cycle;
+};
+
+static int pwm_vibrator_start(struct pwm_vibrator *vibrator)
+{
+ struct device *pdev = vibrator->input->dev.parent;
+ struct pwm_state state;
+ int err;
+
+ err = regulator_enable(vibrator->vcc);
+ if (err) {
+ dev_err(pdev, "failed to enable regulator: %d", err);
+ return err;
+ }
+
+ pwm_get_state(vibrator->pwm, &state);
+ pwm_set_relative_duty_cycle(&state, vibrator->level, 0xffff);
+ state.enabled = true;
+
+ err = pwm_apply_state(vibrator->pwm, &state);
+ if (err) {
+ dev_err(pdev, "failed to apply pwm state: %d", err);
+ return err;
+ }
+
+ if (vibrator->pwm_dir) {
+ pwm_get_state(vibrator->pwm_dir, &state);
+ state.duty_cycle = vibrator->direction_duty_cycle;
+ state.enabled = true;
+
+ err = pwm_apply_state(vibrator->pwm_dir, &state);
+ if (err) {
+ dev_err(pdev, "failed to apply dir-pwm state: %d", err);
+ pwm_disable(vibrator->pwm);
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+static void pwm_vibrator_stop(struct pwm_vibrator *vibrator)
+{
+ regulator_disable(vibrator->vcc);
+
+ if (vibrator->pwm_dir)
+ pwm_disable(vibrator->pwm_dir);
+ pwm_disable(vibrator->pwm);
+}
+
+static void pwm_vibrator_play_work(struct work_struct *work)
+{
+ struct pwm_vibrator *vibrator = container_of(work,
+ struct pwm_vibrator, play_work);
+
+ if (vibrator->level)
+ pwm_vibrator_start(vibrator);
+ else
+ pwm_vibrator_stop(vibrator);
+}
+
+static int pwm_vibrator_play_effect(struct input_dev *dev, void *data,
+ struct ff_effect *effect)
+{
+ struct pwm_vibrator *vibrator = input_get_drvdata(dev);
+
+ vibrator->level = effect->u.rumble.strong_magnitude;
+ if (!vibrator->level)
+ vibrator->level = effect->u.rumble.weak_magnitude;
+
+ schedule_work(&vibrator->play_work);
+
+ return 0;
+}
+
+static void pwm_vibrator_close(struct input_dev *input)
+{
+ struct pwm_vibrator *vibrator = input_get_drvdata(input);
+
+ cancel_work_sync(&vibrator->play_work);
+ pwm_vibrator_stop(vibrator);
+}
+
+static int pwm_vibrator_probe(struct platform_device *pdev)
+{
+ struct pwm_vibrator *vibrator;
+ struct pwm_state state;
+ int err;
+
+ vibrator = devm_kzalloc(&pdev->dev, sizeof(*vibrator), GFP_KERNEL);
+ if (!vibrator)
+ return -ENOMEM;
+
+ vibrator->input = devm_input_allocate_device(&pdev->dev);
+ if (!vibrator->input)
+ return -ENOMEM;
+
+ vibrator->vcc = devm_regulator_get(&pdev->dev, "vcc");
+ err = PTR_ERR_OR_ZERO(vibrator->vcc);
+ if (err) {
+ if (err != -EPROBE_DEFER)
+ dev_err(&pdev->dev, "Failed to request regulator: %d",
+ err);
+ return err;
+ }
+
+ vibrator->pwm = devm_pwm_get(&pdev->dev, "enable");
+ err = PTR_ERR_OR_ZERO(vibrator->pwm);
+ if (err) {
+ if (err != -EPROBE_DEFER)
+ dev_err(&pdev->dev, "Failed to request main pwm: %d",
+ err);
+ return err;
+ }
+
+ INIT_WORK(&vibrator->play_work, pwm_vibrator_play_work);
+
+ /* Sync up PWM state and ensure it is off. */
+ pwm_init_state(vibrator->pwm, &state);
+ state.enabled = false;
+ err = pwm_apply_state(vibrator->pwm, &state);
+ if (err) {
+ dev_err(&pdev->dev, "failed to apply initial PWM state: %d",
+ err);
+ return err;
+ }
+
+ vibrator->pwm_dir = devm_pwm_get(&pdev->dev, "direction");
+ err = PTR_ERR_OR_ZERO(vibrator->pwm_dir);
+ switch (err) {
+ case 0:
+ /* Sync up PWM state and ensure it is off. */
+ pwm_init_state(vibrator->pwm_dir, &state);
+ state.enabled = false;
+ err = pwm_apply_state(vibrator->pwm_dir, &state);
+ if (err) {
+ dev_err(&pdev->dev, "failed to apply initial PWM state: %d",
+ err);
+ return err;
+ }
+
+ vibrator->direction_duty_cycle =
+ pwm_get_period(vibrator->pwm_dir) / 2;
+ device_property_read_u32(&pdev->dev, "direction-duty-cycle-ns",
+ &vibrator->direction_duty_cycle);
+ break;
+
+ case -ENODATA:
+ /* Direction PWM is optional */
+ vibrator->pwm_dir = NULL;
+ break;
+
+ default:
+ dev_err(&pdev->dev, "Failed to request direction pwm: %d", err);
+ /* Fall through */
+
+ case -EPROBE_DEFER:
+ return err;
+ }
+
+ vibrator->input->name = "pwm-vibrator";
+ vibrator->input->id.bustype = BUS_HOST;
+ vibrator->input->dev.parent = &pdev->dev;
+ vibrator->input->close = pwm_vibrator_close;
+
+ input_set_drvdata(vibrator->input, vibrator);
+ input_set_capability(vibrator->input, EV_FF, FF_RUMBLE);
+
+ err = input_ff_create_memless(vibrator->input, NULL,
+ pwm_vibrator_play_effect);
+ if (err) {
+ dev_err(&pdev->dev, "Couldn't create FF dev: %d", err);
+ return err;
+ }
+
+ err = input_register_device(vibrator->input);
+ if (err) {
+ dev_err(&pdev->dev, "Couldn't register input dev: %d", err);
+ return err;
+ }
+
+ platform_set_drvdata(pdev, vibrator);
+
+ return 0;
+}
+
+static int __maybe_unused pwm_vibrator_suspend(struct device *dev)
+{
+ struct pwm_vibrator *vibrator = dev_get_drvdata(dev);
+
+ cancel_work_sync(&vibrator->play_work);
+ if (vibrator->level)
+ pwm_vibrator_stop(vibrator);
+
+ return 0;
+}
+
+static int __maybe_unused pwm_vibrator_resume(struct device *dev)
+{
+ struct pwm_vibrator *vibrator = dev_get_drvdata(dev);
+
+ if (vibrator->level)
+ pwm_vibrator_start(vibrator);
+
+ return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(pwm_vibrator_pm_ops,
+ pwm_vibrator_suspend, pwm_vibrator_resume);
+
+#ifdef CONFIG_OF
+static const struct of_device_id pwm_vibra_dt_match_table[] = {
+ { .compatible = "pwm-vibrator" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, pwm_vibra_dt_match_table);
+#endif
+
+static struct platform_driver pwm_vibrator_driver = {
+ .probe = pwm_vibrator_probe,
+ .driver = {
+ .name = "pwm-vibrator",
+ .pm = &pwm_vibrator_pm_ops,
+ .of_match_table = of_match_ptr(pwm_vibra_dt_match_table),
+ },
+};
+module_platform_driver(pwm_vibrator_driver);
+
+MODULE_AUTHOR("Sebastian Reichel <[email protected]>");
+MODULE_DESCRIPTION("PWM vibrator driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:pwm-vibrator");
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index 022be0e22eba..443151de90c6 100644
--- a/drivers/input/misc/uinput.c
+++ b/drivers/input/misc/uinput.c
@@ -98,14 +98,15 @@ static int uinput_request_reserve_slot(struct uinput_device *udev,
uinput_request_alloc_id(udev, request));
}
-static void uinput_request_done(struct uinput_device *udev,
- struct uinput_request *request)
+static void uinput_request_release_slot(struct uinput_device *udev,
+ unsigned int id)
{
/* Mark slot as available */
- udev->requests[request->id] = NULL;
- wake_up(&udev->requests_waitq);
+ spin_lock(&udev->requests_lock);
+ udev->requests[id] = NULL;
+ spin_unlock(&udev->requests_lock);
- complete(&request->done);
+ wake_up(&udev->requests_waitq);
}
static int uinput_request_send(struct uinput_device *udev,
@@ -138,20 +139,22 @@ static int uinput_request_send(struct uinput_device *udev,
static int uinput_request_submit(struct uinput_device *udev,
struct uinput_request *request)
{
- int error;
+ int retval;
- error = uinput_request_reserve_slot(udev, request);
- if (error)
- return error;
+ retval = uinput_request_reserve_slot(udev, request);
+ if (retval)
+ return retval;
- error = uinput_request_send(udev, request);
- if (error) {
- uinput_request_done(udev, request);
- return error;
- }
+ retval = uinput_request_send(udev, request);
+ if (retval)
+ goto out;
wait_for_completion(&request->done);
- return request->retval;
+ retval = request->retval;
+
+ out:
+ uinput_request_release_slot(udev, request->id);
+ return retval;
}
/*
@@ -169,7 +172,7 @@ static void uinput_flush_requests(struct uinput_device *udev)
request = udev->requests[i];
if (request) {
request->retval = -ENODEV;
- uinput_request_done(udev, request);
+ complete(&request->done);
}
}
@@ -230,6 +233,18 @@ static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id)
return uinput_request_submit(udev, &request);
}
+static int uinput_dev_flush(struct input_dev *dev, struct file *file)
+{
+ /*
+ * If we are called with file == NULL that means we are tearing
+ * down the device, and therefore we can not handle FF erase
+ * requests: either we are handling UI_DEV_DESTROY (and holding
+ * the udev->mutex), or the file descriptor is closed and there is
+ * nobody on the other side anymore.
+ */
+ return file ? input_ff_flush(dev, file) : 0;
+}
+
static void uinput_destroy_device(struct uinput_device *udev)
{
const char *name, *phys;
@@ -297,6 +312,12 @@ static int uinput_create_device(struct uinput_device *udev)
dev->ff->playback = uinput_dev_playback;
dev->ff->set_gain = uinput_dev_set_gain;
dev->ff->set_autocenter = uinput_dev_set_autocenter;
+ /*
+ * The standard input_ff_flush() implementation does
+ * not quite work for uinput as we can't reasonably
+ * handle FF requests during device teardown.
+ */
+ dev->flush = uinput_dev_flush;
}
error = input_register_device(udev->dev);
@@ -939,7 +960,7 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
}
req->retval = ff_up.retval;
- uinput_request_done(udev, req);
+ complete(&req->done);
goto out;
case UI_END_FF_ERASE:
@@ -955,7 +976,7 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
}
req->retval = ff_erase.retval;
- uinput_request_done(udev, req);
+ complete(&req->done);
goto out;
}
diff --git a/drivers/input/mouse/elan_i2c_i2c.c b/drivers/input/mouse/elan_i2c_i2c.c
index 15b1330606c1..e19eb60b3d2f 100644
--- a/drivers/input/mouse/elan_i2c_i2c.c
+++ b/drivers/input/mouse/elan_i2c_i2c.c
@@ -598,7 +598,7 @@ static int elan_i2c_write_fw_block(struct i2c_client *client,
}
/* Wait for F/W to update one page ROM data. */
- msleep(20);
+ msleep(35);
error = elan_i2c_read_cmd(client, ETP_I2C_IAP_CTRL_CMD, val);
if (error) {
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 6428d6f4d568..b84cd978fce2 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -700,7 +700,9 @@ static int elantech_debounce_check_v2(struct psmouse *psmouse)
* When we encounter packet that matches this exactly, it means the
* hardware is in debounce status. Just ignore the whole packet.
*/
- const u8 debounce_packet[] = { 0x84, 0xff, 0xff, 0x02, 0xff, 0xff };
+ static const u8 debounce_packet[] = {
+ 0x84, 0xff, 0xff, 0x02, 0xff, 0xff
+ };
unsigned char *packet = psmouse->packet;
return !memcmp(packet, debounce_packet, sizeof(debounce_packet));
@@ -741,7 +743,9 @@ static int elantech_packet_check_v2(struct psmouse *psmouse)
static int elantech_packet_check_v3(struct psmouse *psmouse)
{
struct elantech_data *etd = psmouse->private;
- const u8 debounce_packet[] = { 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff };
+ static const u8 debounce_packet[] = {
+ 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff
+ };
unsigned char *packet = psmouse->packet;
/*
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index ae81e57e13b9..6cbbdc6e9687 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -840,6 +840,13 @@ static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
},
},
{
+ /* Gigabyte P57 - Elantech touchpad */
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
+ },
+ },
+ {
/* Schenker XMG C504 - Elantech touchpad */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
index f872817e81e4..5bf63f76ddda 100644
--- a/drivers/input/touchscreen/edt-ft5x06.c
+++ b/drivers/input/touchscreen/edt-ft5x06.c
@@ -593,7 +593,7 @@ static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata)
tsdata->gain);
edt_ft5x06_register_write(tsdata, reg_addr->reg_offset,
tsdata->offset);
- if (reg_addr->reg_report_rate)
+ if (reg_addr->reg_report_rate != NO_REGISTER)
edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate,
tsdata->report_rate);
@@ -874,6 +874,7 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata)
case M09:
reg_addr->reg_threshold = M09_REGISTER_THRESHOLD;
+ reg_addr->reg_report_rate = NO_REGISTER;
reg_addr->reg_gain = M09_REGISTER_GAIN;
reg_addr->reg_offset = M09_REGISTER_OFFSET;
reg_addr->reg_num_x = M09_REGISTER_NUM_X;
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 240b16f3ee97..32d2762448aa 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -267,6 +267,12 @@ static void goodix_process_events(struct goodix_ts_data *ts)
if (touch_num < 0)
return;
+ /*
+ * Bit 4 of the first byte reports the status of the capacitive
+ * Windows/Home button.
+ */
+ input_report_key(ts->input_dev, KEY_LEFTMETA, point_data[0] & BIT(4));
+
for (i = 0; i < touch_num; i++)
goodix_ts_report_touch(ts,
&point_data[1 + GOODIX_CONTACT_SIZE * i]);
@@ -612,6 +618,9 @@ static int goodix_request_input_dev(struct goodix_ts_data *ts)
ts->input_dev->id.product = ts->id;
ts->input_dev->id.version = ts->version;
+ /* Capacitive Windows/Home button on some devices */
+ input_set_capability(ts->input_dev, EV_KEY, KEY_LEFTMETA);
+
error = input_register_device(ts->input_dev);
if (error) {
dev_err(&ts->client->dev,
diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c
index 92e2243fb77d..8fd909285877 100644
--- a/drivers/input/touchscreen/htcpen.c
+++ b/drivers/input/touchscreen/htcpen.c
@@ -219,7 +219,7 @@ static struct isa_driver htcpen_isa_driver = {
}
};
-static struct dmi_system_id htcshift_dmi_table[] __initdata = {
+static const struct dmi_system_id htcshift_dmi_table[] __initconst = {
{
.ident = "Shift",
.matches = {
diff --git a/drivers/input/touchscreen/surface3_spi.c b/drivers/input/touchscreen/surface3_spi.c
index e12fb9b63f31..5db0f1c4ef38 100644
--- a/drivers/input/touchscreen/surface3_spi.c
+++ b/drivers/input/touchscreen/surface3_spi.c
@@ -173,7 +173,7 @@ static void surface3_spi_process_pen(struct surface3_ts_data *ts_data, u8 *data)
static void surface3_spi_process(struct surface3_ts_data *ts_data)
{
- const char header[] = {
+ static const char header[] = {
0xff, 0xff, 0xff, 0xff, 0xa5, 0x5a, 0xe7, 0x7e, 0x01
};
u8 *data = ts_data->rd_buf;
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c
index c1e23cfc6155..1a86cbd9326f 100644
--- a/drivers/input/touchscreen/ucb1400_ts.c
+++ b/drivers/input/touchscreen/ucb1400_ts.c
@@ -414,7 +414,7 @@ static int __maybe_unused ucb1400_ts_suspend(struct device *dev)
mutex_lock(&idev->mutex);
if (idev->users)
- ucb1400_ts_start(ucb);
+ ucb1400_ts_stop(ucb);
mutex_unlock(&idev->mutex);
return 0;
@@ -428,7 +428,7 @@ static int __maybe_unused ucb1400_ts_resume(struct device *dev)
mutex_lock(&idev->mutex);
if (idev->users)
- ucb1400_ts_stop(ucb);
+ ucb1400_ts_start(ucb);
mutex_unlock(&idev->mutex);
return 0;
diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index f73ff28f77e2..f3a21343e636 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -76,6 +76,8 @@ config IOMMU_DMA
config FSL_PAMU
bool "Freescale IOMMU support"
+ depends on PCI
+ depends on PHYS_64BIT
depends on PPC_E500MC || (COMPILE_TEST && PPC)
select IOMMU_API
select GENERIC_ALLOCATOR
@@ -253,6 +255,7 @@ config TEGRA_IOMMU_SMMU
config EXYNOS_IOMMU
bool "Exynos IOMMU Support"
depends on ARCH_EXYNOS && MMU
+ depends on !CPU_BIG_ENDIAN # revisit driver if we can enable big-endian ptes
select IOMMU_API
select ARM_DMA_USE_IOMMU
help
@@ -275,7 +278,7 @@ config EXYNOS_IOMMU_DEBUG
config IPMMU_VMSA
bool "Renesas VMSA-compatible IPMMU"
depends on ARM || IOMMU_DMA
- depends on ARCH_RENESAS || COMPILE_TEST
+ depends on ARCH_RENESAS || (COMPILE_TEST && !GENERIC_ATOMIC64)
select IOMMU_API
select IOMMU_IO_PGTABLE_LPAE
select ARM_DMA_USE_IOMMU
@@ -367,4 +370,15 @@ config MTK_IOMMU_V1
if unsure, say N here.
+config QCOM_IOMMU
+ # Note: iommu drivers cannot (yet?) be built as modules
+ bool "Qualcomm IOMMU Support"
+ depends on ARCH_QCOM || (COMPILE_TEST && !GENERIC_ATOMIC64)
+ depends on HAS_DMA
+ select IOMMU_API
+ select IOMMU_IO_PGTABLE_LPAE
+ select ARM_DMA_USE_IOMMU
+ help
+ Support for IOMMU on certain Qualcomm SoCs.
+
endif # IOMMU_SUPPORT
diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile
index 195f7b997d8e..b910aea813a1 100644
--- a/drivers/iommu/Makefile
+++ b/drivers/iommu/Makefile
@@ -27,3 +27,4 @@ obj-$(CONFIG_TEGRA_IOMMU_SMMU) += tegra-smmu.o
obj-$(CONFIG_EXYNOS_IOMMU) += exynos-iommu.o
obj-$(CONFIG_FSL_PAMU) += fsl_pamu.o fsl_pamu_domain.o
obj-$(CONFIG_S390_IOMMU) += s390-iommu.o
+obj-$(CONFIG_QCOM_IOMMU) += qcom_iommu.o
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 4ad7e5e31943..51f8215877f5 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -103,29 +103,6 @@ int amd_iommu_max_glx_val = -1;
static const struct dma_map_ops amd_iommu_dma_ops;
/*
- * This struct contains device specific data for the IOMMU
- */
-struct iommu_dev_data {
- struct list_head list; /* For domain->dev_list */
- struct list_head dev_data_list; /* For global dev_data_list */
- struct protection_domain *domain; /* Domain the device is bound to */
- u16 devid; /* PCI Device ID */
- u16 alias; /* Alias Device ID */
- bool iommu_v2; /* Device can make use of IOMMUv2 */
- bool passthrough; /* Device is identity mapped */
- struct {
- bool enabled;
- int qdep;
- } ats; /* ATS state */
- bool pri_tlp; /* PASID TLB required for
- PPR completions */
- u32 errata; /* Bitmap for errata to apply */
- bool use_vapic; /* Enable device to use vapic mode */
-
- struct ratelimit_state rs; /* Ratelimit IOPF messages */
-};
-
-/*
* general struct to manage commands send to an IOMMU
*/
struct iommu_cmd {
@@ -137,20 +114,7 @@ struct kmem_cache *amd_iommu_irq_cache;
static void update_domain(struct protection_domain *domain);
static int protection_domain_init(struct protection_domain *domain);
static void detach_device(struct device *dev);
-
-#define FLUSH_QUEUE_SIZE 256
-
-struct flush_queue_entry {
- unsigned long iova_pfn;
- unsigned long pages;
- u64 counter; /* Flush counter when this entry was added to the queue */
-};
-
-struct flush_queue {
- struct flush_queue_entry *entries;
- unsigned head, tail;
- spinlock_t lock;
-};
+static void iova_domain_flush_tlb(struct iova_domain *iovad);
/*
* Data container for a dma_ops specific protection domain
@@ -161,36 +125,6 @@ struct dma_ops_domain {
/* IOVA RB-Tree */
struct iova_domain iovad;
-
- struct flush_queue __percpu *flush_queue;
-
- /*
- * We need two counter here to be race-free wrt. IOTLB flushing and
- * adding entries to the flush queue.
- *
- * The flush_start_cnt is incremented _before_ the IOTLB flush starts.
- * New entries added to the flush ring-buffer get their 'counter' value
- * from here. This way we can make sure that entries added to the queue
- * (or other per-cpu queues of the same domain) while the TLB is about
- * to be flushed are not considered to be flushed already.
- */
- atomic64_t flush_start_cnt;
-
- /*
- * The flush_finish_cnt is incremented when an IOTLB flush is complete.
- * This value is always smaller than flush_start_cnt. The queue_add
- * function frees all IOVAs that have a counter value smaller than
- * flush_finish_cnt. This makes sure that we only free IOVAs that are
- * flushed out of the IOTLB of the domain.
- */
- atomic64_t flush_finish_cnt;
-
- /*
- * Timer to make sure we don't keep IOVAs around unflushed
- * for too long
- */
- struct timer_list flush_timer;
- atomic_t flush_timer_on;
};
static struct iova_domain reserved_iova_ranges;
@@ -371,19 +305,25 @@ static u16 get_alias(struct device *dev)
static struct iommu_dev_data *find_dev_data(u16 devid)
{
struct iommu_dev_data *dev_data;
+ struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
dev_data = search_dev_data(devid);
- if (dev_data == NULL)
+ if (dev_data == NULL) {
dev_data = alloc_dev_data(devid);
+ if (translation_pre_enabled(iommu))
+ dev_data->defer_attach = true;
+ }
+
return dev_data;
}
-static struct iommu_dev_data *get_dev_data(struct device *dev)
+struct iommu_dev_data *get_dev_data(struct device *dev)
{
return dev->archdata.iommu;
}
+EXPORT_SYMBOL(get_dev_data);
/*
* Find or create an IOMMU group for a acpihid device.
@@ -1167,7 +1107,7 @@ static int iommu_flush_dte(struct amd_iommu *iommu, u16 devid)
return iommu_queue_command(iommu, &cmd);
}
-static void iommu_flush_dte_all(struct amd_iommu *iommu)
+static void amd_iommu_flush_dte_all(struct amd_iommu *iommu)
{
u32 devid;
@@ -1181,7 +1121,7 @@ static void iommu_flush_dte_all(struct amd_iommu *iommu)
* This function uses heavy locking and may disable irqs for some time. But
* this is no issue because it is only called during resume.
*/
-static void iommu_flush_tlb_all(struct amd_iommu *iommu)
+static void amd_iommu_flush_tlb_all(struct amd_iommu *iommu)
{
u32 dom_id;
@@ -1195,7 +1135,7 @@ static void iommu_flush_tlb_all(struct amd_iommu *iommu)
iommu_completion_wait(iommu);
}
-static void iommu_flush_all(struct amd_iommu *iommu)
+static void amd_iommu_flush_all(struct amd_iommu *iommu)
{
struct iommu_cmd cmd;
@@ -1214,7 +1154,7 @@ static void iommu_flush_irt(struct amd_iommu *iommu, u16 devid)
iommu_queue_command(iommu, &cmd);
}
-static void iommu_flush_irt_all(struct amd_iommu *iommu)
+static void amd_iommu_flush_irt_all(struct amd_iommu *iommu)
{
u32 devid;
@@ -1227,11 +1167,11 @@ static void iommu_flush_irt_all(struct amd_iommu *iommu)
void iommu_flush_all_caches(struct amd_iommu *iommu)
{
if (iommu_feature(iommu, FEATURE_IA)) {
- iommu_flush_all(iommu);
+ amd_iommu_flush_all(iommu);
} else {
- iommu_flush_dte_all(iommu);
- iommu_flush_irt_all(iommu);
- iommu_flush_tlb_all(iommu);
+ amd_iommu_flush_dte_all(iommu);
+ amd_iommu_flush_irt_all(iommu);
+ amd_iommu_flush_tlb_all(iommu);
}
}
@@ -1539,9 +1479,9 @@ static int iommu_map_page(struct protection_domain *dom,
if (count > 1) {
__pte = PAGE_SIZE_PTE(__sme_set(phys_addr), page_size);
- __pte |= PM_LEVEL_ENC(7) | IOMMU_PTE_P | IOMMU_PTE_FC;
+ __pte |= PM_LEVEL_ENC(7) | IOMMU_PTE_PR | IOMMU_PTE_FC;
} else
- __pte = __sme_set(phys_addr) | IOMMU_PTE_P | IOMMU_PTE_FC;
+ __pte = __sme_set(phys_addr) | IOMMU_PTE_PR | IOMMU_PTE_FC;
if (prot & IOMMU_PROT_IR)
__pte |= IOMMU_PTE_IR;
@@ -1790,178 +1730,19 @@ static void free_gcr3_table(struct protection_domain *domain)
free_page((unsigned long)domain->gcr3_tbl);
}
-static void dma_ops_domain_free_flush_queue(struct dma_ops_domain *dom)
-{
- int cpu;
-
- for_each_possible_cpu(cpu) {
- struct flush_queue *queue;
-
- queue = per_cpu_ptr(dom->flush_queue, cpu);
- kfree(queue->entries);
- }
-
- free_percpu(dom->flush_queue);
-
- dom->flush_queue = NULL;
-}
-
-static int dma_ops_domain_alloc_flush_queue(struct dma_ops_domain *dom)
-{
- int cpu;
-
- atomic64_set(&dom->flush_start_cnt, 0);
- atomic64_set(&dom->flush_finish_cnt, 0);
-
- dom->flush_queue = alloc_percpu(struct flush_queue);
- if (!dom->flush_queue)
- return -ENOMEM;
-
- /* First make sure everything is cleared */
- for_each_possible_cpu(cpu) {
- struct flush_queue *queue;
-
- queue = per_cpu_ptr(dom->flush_queue, cpu);
- queue->head = 0;
- queue->tail = 0;
- queue->entries = NULL;
- }
-
- /* Now start doing the allocation */
- for_each_possible_cpu(cpu) {
- struct flush_queue *queue;
-
- queue = per_cpu_ptr(dom->flush_queue, cpu);
- queue->entries = kzalloc(FLUSH_QUEUE_SIZE * sizeof(*queue->entries),
- GFP_KERNEL);
- if (!queue->entries) {
- dma_ops_domain_free_flush_queue(dom);
- return -ENOMEM;
- }
-
- spin_lock_init(&queue->lock);
- }
-
- return 0;
-}
-
static void dma_ops_domain_flush_tlb(struct dma_ops_domain *dom)
{
- atomic64_inc(&dom->flush_start_cnt);
domain_flush_tlb(&dom->domain);
domain_flush_complete(&dom->domain);
- atomic64_inc(&dom->flush_finish_cnt);
-}
-
-static inline bool queue_ring_full(struct flush_queue *queue)
-{
- assert_spin_locked(&queue->lock);
-
- return (((queue->tail + 1) % FLUSH_QUEUE_SIZE) == queue->head);
-}
-
-#define queue_ring_for_each(i, q) \
- for (i = (q)->head; i != (q)->tail; i = (i + 1) % FLUSH_QUEUE_SIZE)
-
-static inline unsigned queue_ring_add(struct flush_queue *queue)
-{
- unsigned idx = queue->tail;
-
- assert_spin_locked(&queue->lock);
- queue->tail = (idx + 1) % FLUSH_QUEUE_SIZE;
-
- return idx;
-}
-
-static inline void queue_ring_remove_head(struct flush_queue *queue)
-{
- assert_spin_locked(&queue->lock);
- queue->head = (queue->head + 1) % FLUSH_QUEUE_SIZE;
-}
-
-static void queue_ring_free_flushed(struct dma_ops_domain *dom,
- struct flush_queue *queue)
-{
- u64 counter = atomic64_read(&dom->flush_finish_cnt);
- int idx;
-
- queue_ring_for_each(idx, queue) {
- /*
- * This assumes that counter values in the ring-buffer are
- * monotonously rising.
- */
- if (queue->entries[idx].counter >= counter)
- break;
-
- free_iova_fast(&dom->iovad,
- queue->entries[idx].iova_pfn,
- queue->entries[idx].pages);
-
- queue_ring_remove_head(queue);
- }
-}
-
-static void queue_add(struct dma_ops_domain *dom,
- unsigned long address, unsigned long pages)
-{
- struct flush_queue *queue;
- unsigned long flags;
- int idx;
-
- pages = __roundup_pow_of_two(pages);
- address >>= PAGE_SHIFT;
-
- queue = get_cpu_ptr(dom->flush_queue);
- spin_lock_irqsave(&queue->lock, flags);
-
- /*
- * First remove the enries from the ring-buffer that are already
- * flushed to make the below queue_ring_full() check less likely
- */
- queue_ring_free_flushed(dom, queue);
-
- /*
- * When ring-queue is full, flush the entries from the IOTLB so
- * that we can free all entries with queue_ring_free_flushed()
- * below.
- */
- if (queue_ring_full(queue)) {
- dma_ops_domain_flush_tlb(dom);
- queue_ring_free_flushed(dom, queue);
- }
-
- idx = queue_ring_add(queue);
-
- queue->entries[idx].iova_pfn = address;
- queue->entries[idx].pages = pages;
- queue->entries[idx].counter = atomic64_read(&dom->flush_start_cnt);
-
- spin_unlock_irqrestore(&queue->lock, flags);
-
- if (atomic_cmpxchg(&dom->flush_timer_on, 0, 1) == 0)
- mod_timer(&dom->flush_timer, jiffies + msecs_to_jiffies(10));
-
- put_cpu_ptr(dom->flush_queue);
}
-static void queue_flush_timeout(unsigned long data)
+static void iova_domain_flush_tlb(struct iova_domain *iovad)
{
- struct dma_ops_domain *dom = (struct dma_ops_domain *)data;
- int cpu;
+ struct dma_ops_domain *dom;
- atomic_set(&dom->flush_timer_on, 0);
+ dom = container_of(iovad, struct dma_ops_domain, iovad);
dma_ops_domain_flush_tlb(dom);
-
- for_each_possible_cpu(cpu) {
- struct flush_queue *queue;
- unsigned long flags;
-
- queue = per_cpu_ptr(dom->flush_queue, cpu);
- spin_lock_irqsave(&queue->lock, flags);
- queue_ring_free_flushed(dom, queue);
- spin_unlock_irqrestore(&queue->lock, flags);
- }
}
/*
@@ -1975,11 +1756,6 @@ static void dma_ops_domain_free(struct dma_ops_domain *dom)
del_domain_from_list(&dom->domain);
- if (timer_pending(&dom->flush_timer))
- del_timer(&dom->flush_timer);
-
- dma_ops_domain_free_flush_queue(dom);
-
put_iova_domain(&dom->iovad);
free_pagetable(&dom->domain);
@@ -2015,16 +1791,11 @@ static struct dma_ops_domain *dma_ops_domain_alloc(void)
init_iova_domain(&dma_dom->iovad, PAGE_SIZE,
IOVA_START_PFN, DMA_32BIT_PFN);
- /* Initialize reserved ranges */
- copy_reserved_iova(&reserved_iova_ranges, &dma_dom->iovad);
-
- if (dma_ops_domain_alloc_flush_queue(dma_dom))
+ if (init_iova_flush_queue(&dma_dom->iovad, iova_domain_flush_tlb, NULL))
goto free_dma_dom;
- setup_timer(&dma_dom->flush_timer, queue_flush_timeout,
- (unsigned long)dma_dom);
-
- atomic_set(&dma_dom->flush_timer_on, 0);
+ /* Initialize reserved ranges */
+ copy_reserved_iova(&reserved_iova_ranges, &dma_dom->iovad);
add_domain_to_list(&dma_dom->domain);
@@ -2055,7 +1826,7 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats)
pte_root |= (domain->mode & DEV_ENTRY_MODE_MASK)
<< DEV_ENTRY_MODE_SHIFT;
- pte_root |= IOMMU_PTE_IR | IOMMU_PTE_IW | IOMMU_PTE_P | IOMMU_PTE_TV;
+ pte_root |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV;
flags = amd_iommu_dev_table[devid].data[1];
@@ -2088,8 +1859,7 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats)
flags |= tmp;
}
-
- flags &= ~(DTE_FLAG_SA | 0xffffULL);
+ flags &= ~DEV_DOMID_MASK;
flags |= domain->id;
amd_iommu_dev_table[devid].data[1] = flags;
@@ -2099,7 +1869,7 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats)
static void clear_dte_entry(u16 devid)
{
/* remove entry from the device table seen by the hardware */
- amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV;
+ amd_iommu_dev_table[devid].data[0] = DTE_FLAG_V | DTE_FLAG_TV;
amd_iommu_dev_table[devid].data[1] &= DTE_FLAG_MASK;
amd_iommu_apply_erratum_63(devid);
@@ -2480,11 +2250,21 @@ static struct iommu_group *amd_iommu_device_group(struct device *dev)
static struct protection_domain *get_domain(struct device *dev)
{
struct protection_domain *domain;
+ struct iommu_domain *io_domain;
if (!check_device(dev))
return ERR_PTR(-EINVAL);
domain = get_dev_data(dev)->domain;
+ if (domain == NULL && get_dev_data(dev)->defer_attach) {
+ get_dev_data(dev)->defer_attach = false;
+ io_domain = iommu_get_domain_for_dev(dev);
+ domain = to_pdomain(io_domain);
+ attach_device(dev, domain);
+ }
+ if (domain == NULL)
+ return ERR_PTR(-EBUSY);
+
if (!dma_ops_domain(domain))
return ERR_PTR(-EBUSY);
@@ -2530,6 +2310,7 @@ static int dir2prot(enum dma_data_direction direction)
else
return 0;
}
+
/*
* This function contains common code for mapping of a physically
* contiguous memory region into DMA address space. It is used by all
@@ -2621,7 +2402,8 @@ static void __unmap_single(struct dma_ops_domain *dma_dom,
domain_flush_tlb(&dma_dom->domain);
domain_flush_complete(&dma_dom->domain);
} else {
- queue_add(dma_dom, dma_addr, pages);
+ pages = __roundup_pow_of_two(pages);
+ queue_iova(&dma_dom->iovad, dma_addr >> PAGE_SHIFT, pages, 0);
}
}
@@ -3375,6 +3157,13 @@ static void amd_iommu_apply_resv_region(struct device *dev,
WARN_ON_ONCE(reserve_iova(&dma_dom->iovad, start, end) == NULL);
}
+static bool amd_iommu_is_attach_deferred(struct iommu_domain *domain,
+ struct device *dev)
+{
+ struct iommu_dev_data *dev_data = dev->archdata.iommu;
+ return dev_data->defer_attach;
+}
+
const struct iommu_ops amd_iommu_ops = {
.capable = amd_iommu_capable,
.domain_alloc = amd_iommu_domain_alloc,
@@ -3391,6 +3180,7 @@ const struct iommu_ops amd_iommu_ops = {
.get_resv_regions = amd_iommu_get_resv_regions,
.put_resv_regions = amd_iommu_put_resv_regions,
.apply_resv_region = amd_iommu_apply_resv_region,
+ .is_attach_deferred = amd_iommu_is_attach_deferred,
.pgsize_bitmap = AMD_IOMMU_PGSIZES,
};
@@ -3779,11 +3569,6 @@ EXPORT_SYMBOL(amd_iommu_device_info);
static struct irq_chip amd_ir_chip;
-#define DTE_IRQ_PHYS_ADDR_MASK (((1ULL << 45)-1) << 6)
-#define DTE_IRQ_REMAP_INTCTL (2ULL << 60)
-#define DTE_IRQ_TABLE_LEN (8ULL << 1)
-#define DTE_IRQ_REMAP_ENABLE 1ULL
-
static void set_dte_irq_entry(u16 devid, struct irq_remap_table *table)
{
u64 dte;
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 2292a6cece76..6fe2d0346073 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -29,7 +29,6 @@
#include <linux/export.h>
#include <linux/iommu.h>
#include <linux/kmemleak.h>
-#include <linux/crash_dump.h>
#include <linux/mem_encrypt.h>
#include <asm/pci-direct.h>
#include <asm/iommu.h>
@@ -39,6 +38,7 @@
#include <asm/io_apic.h>
#include <asm/irq_remapping.h>
+#include <linux/crash_dump.h>
#include "amd_iommu_proto.h"
#include "amd_iommu_types.h"
#include "irq_remapping.h"
@@ -197,6 +197,11 @@ spinlock_t amd_iommu_pd_lock;
* page table root pointer.
*/
struct dev_table_entry *amd_iommu_dev_table;
+/*
+ * Pointer to a device table which the content of old device table
+ * will be copied to. It's only be used in kdump kernel.
+ */
+static struct dev_table_entry *old_dev_tbl_cpy;
/*
* The alias table is a driver specific data structure which contains the
@@ -210,6 +215,7 @@ u16 *amd_iommu_alias_table;
* for a specific device. It is also indexed by the PCI device id.
*/
struct amd_iommu **amd_iommu_rlookup_table;
+EXPORT_SYMBOL(amd_iommu_rlookup_table);
/*
* This table is used to find the irq remapping table for a given device id
@@ -259,6 +265,28 @@ static int amd_iommu_enable_interrupts(void);
static int __init iommu_go_to_state(enum iommu_init_state state);
static void init_device_table_dma(void);
+static bool amd_iommu_pre_enabled = true;
+
+bool translation_pre_enabled(struct amd_iommu *iommu)
+{
+ return (iommu->flags & AMD_IOMMU_FLAG_TRANS_PRE_ENABLED);
+}
+EXPORT_SYMBOL(translation_pre_enabled);
+
+static void clear_translation_pre_enabled(struct amd_iommu *iommu)
+{
+ iommu->flags &= ~AMD_IOMMU_FLAG_TRANS_PRE_ENABLED;
+}
+
+static void init_translation_status(struct amd_iommu *iommu)
+{
+ u32 ctrl;
+
+ ctrl = readl(iommu->mmio_base + MMIO_CONTROL_OFFSET);
+ if (ctrl & (1<<CONTROL_IOMMU_EN))
+ iommu->flags |= AMD_IOMMU_FLAG_TRANS_PRE_ENABLED;
+}
+
static inline void update_last_devid(u16 devid)
{
if (devid > amd_iommu_last_bdf)
@@ -616,6 +644,14 @@ static void iommu_enable_command_buffer(struct amd_iommu *iommu)
amd_iommu_reset_cmd_buffer(iommu);
}
+/*
+ * This function disables the command buffer
+ */
+static void iommu_disable_command_buffer(struct amd_iommu *iommu)
+{
+ iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
+}
+
static void __init free_command_buffer(struct amd_iommu *iommu)
{
free_pages((unsigned long)iommu->cmd_buf, get_order(CMD_BUFFER_SIZE));
@@ -648,6 +684,14 @@ static void iommu_enable_event_buffer(struct amd_iommu *iommu)
iommu_feature_enable(iommu, CONTROL_EVT_LOG_EN);
}
+/*
+ * This function disables the event log buffer
+ */
+static void iommu_disable_event_buffer(struct amd_iommu *iommu)
+{
+ iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN);
+}
+
static void __init free_event_buffer(struct amd_iommu *iommu)
{
free_pages((unsigned long)iommu->evt_buf, get_order(EVT_BUFFER_SIZE));
@@ -809,6 +853,96 @@ static int get_dev_entry_bit(u16 devid, u8 bit)
}
+static bool copy_device_table(void)
+{
+ u64 int_ctl, int_tab_len, entry = 0, last_entry = 0;
+ struct dev_table_entry *old_devtb = NULL;
+ u32 lo, hi, devid, old_devtb_size;
+ phys_addr_t old_devtb_phys;
+ struct amd_iommu *iommu;
+ u16 dom_id, dte_v, irq_v;
+ gfp_t gfp_flag;
+ u64 tmp;
+
+ if (!amd_iommu_pre_enabled)
+ return false;
+
+ pr_warn("Translation is already enabled - trying to copy translation structures\n");
+ for_each_iommu(iommu) {
+ /* All IOMMUs should use the same device table with the same size */
+ lo = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET);
+ hi = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET + 4);
+ entry = (((u64) hi) << 32) + lo;
+ if (last_entry && last_entry != entry) {
+ pr_err("IOMMU:%d should use the same dev table as others!\n",
+ iommu->index);
+ return false;
+ }
+ last_entry = entry;
+
+ old_devtb_size = ((entry & ~PAGE_MASK) + 1) << 12;
+ if (old_devtb_size != dev_table_size) {
+ pr_err("The device table size of IOMMU:%d is not expected!\n",
+ iommu->index);
+ return false;
+ }
+ }
+
+ old_devtb_phys = entry & PAGE_MASK;
+ if (old_devtb_phys >= 0x100000000ULL) {
+ pr_err("The address of old device table is above 4G, not trustworthy!\n");
+ return false;
+ }
+ old_devtb = memremap(old_devtb_phys, dev_table_size, MEMREMAP_WB);
+ if (!old_devtb)
+ return false;
+
+ gfp_flag = GFP_KERNEL | __GFP_ZERO | GFP_DMA32;
+ old_dev_tbl_cpy = (void *)__get_free_pages(gfp_flag,
+ get_order(dev_table_size));
+ if (old_dev_tbl_cpy == NULL) {
+ pr_err("Failed to allocate memory for copying old device table!\n");
+ return false;
+ }
+
+ for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
+ old_dev_tbl_cpy[devid] = old_devtb[devid];
+ dom_id = old_devtb[devid].data[1] & DEV_DOMID_MASK;
+ dte_v = old_devtb[devid].data[0] & DTE_FLAG_V;
+
+ if (dte_v && dom_id) {
+ old_dev_tbl_cpy[devid].data[0] = old_devtb[devid].data[0];
+ old_dev_tbl_cpy[devid].data[1] = old_devtb[devid].data[1];
+ __set_bit(dom_id, amd_iommu_pd_alloc_bitmap);
+ /* If gcr3 table existed, mask it out */
+ if (old_devtb[devid].data[0] & DTE_FLAG_GV) {
+ tmp = DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B;
+ tmp |= DTE_GCR3_VAL_C(~0ULL) << DTE_GCR3_SHIFT_C;
+ old_dev_tbl_cpy[devid].data[1] &= ~tmp;
+ tmp = DTE_GCR3_VAL_A(~0ULL) << DTE_GCR3_SHIFT_A;
+ tmp |= DTE_FLAG_GV;
+ old_dev_tbl_cpy[devid].data[0] &= ~tmp;
+ }
+ }
+
+ irq_v = old_devtb[devid].data[2] & DTE_IRQ_REMAP_ENABLE;
+ int_ctl = old_devtb[devid].data[2] & DTE_IRQ_REMAP_INTCTL_MASK;
+ int_tab_len = old_devtb[devid].data[2] & DTE_IRQ_TABLE_LEN_MASK;
+ if (irq_v && (int_ctl || int_tab_len)) {
+ if ((int_ctl != DTE_IRQ_REMAP_INTCTL) ||
+ (int_tab_len != DTE_IRQ_TABLE_LEN)) {
+ pr_err("Wrong old irq remapping flag: %#x\n", devid);
+ return false;
+ }
+
+ old_dev_tbl_cpy[devid].data[2] = old_devtb[devid].data[2];
+ }
+ }
+ memunmap(old_devtb);
+
+ return true;
+}
+
void amd_iommu_apply_erratum_63(u16 devid)
{
int sysmgt;
@@ -1400,6 +1534,16 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
iommu->int_enabled = false;
+ init_translation_status(iommu);
+ if (translation_pre_enabled(iommu) && !is_kdump_kernel()) {
+ iommu_disable(iommu);
+ clear_translation_pre_enabled(iommu);
+ pr_warn("Translation was enabled for IOMMU:%d but we are not in kdump mode\n",
+ iommu->index);
+ }
+ if (amd_iommu_pre_enabled)
+ amd_iommu_pre_enabled = translation_pre_enabled(iommu);
+
ret = init_iommu_from_acpi(iommu, h);
if (ret)
return ret;
@@ -1893,8 +2037,7 @@ static int __init init_memory_definitions(struct acpi_table_header *table)
}
/*
- * Init the device table to not allow DMA access for devices and
- * suppress all page faults
+ * Init the device table to not allow DMA access for devices
*/
static void init_device_table_dma(void)
{
@@ -1903,14 +2046,6 @@ static void init_device_table_dma(void)
for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
set_dev_entry_bit(devid, DEV_ENTRY_VALID);
set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION);
- /*
- * In kdump kernels in-flight DMA from the old kernel might
- * cause IO_PAGE_FAULTs. There are no reports that a kdump
- * actually failed because of that, so just disable fault
- * reporting in the hardware to get rid of the messages
- */
- if (is_kdump_kernel())
- set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT);
}
}
@@ -2023,24 +2158,62 @@ static void iommu_enable_ga(struct amd_iommu *iommu)
#endif
}
+static void early_enable_iommu(struct amd_iommu *iommu)
+{
+ iommu_disable(iommu);
+ iommu_init_flags(iommu);
+ iommu_set_device_table(iommu);
+ iommu_enable_command_buffer(iommu);
+ iommu_enable_event_buffer(iommu);
+ iommu_set_exclusion_range(iommu);
+ iommu_enable_ga(iommu);
+ iommu_enable(iommu);
+ iommu_flush_all_caches(iommu);
+}
+
/*
* This function finally enables all IOMMUs found in the system after
- * they have been initialized
+ * they have been initialized.
+ *
+ * Or if in kdump kernel and IOMMUs are all pre-enabled, try to copy
+ * the old content of device table entries. Not this case or copy failed,
+ * just continue as normal kernel does.
*/
static void early_enable_iommus(void)
{
struct amd_iommu *iommu;
- for_each_iommu(iommu) {
- iommu_disable(iommu);
- iommu_init_flags(iommu);
- iommu_set_device_table(iommu);
- iommu_enable_command_buffer(iommu);
- iommu_enable_event_buffer(iommu);
- iommu_set_exclusion_range(iommu);
- iommu_enable_ga(iommu);
- iommu_enable(iommu);
- iommu_flush_all_caches(iommu);
+
+ if (!copy_device_table()) {
+ /*
+ * If come here because of failure in copying device table from old
+ * kernel with all IOMMUs enabled, print error message and try to
+ * free allocated old_dev_tbl_cpy.
+ */
+ if (amd_iommu_pre_enabled)
+ pr_err("Failed to copy DEV table from previous kernel.\n");
+ if (old_dev_tbl_cpy != NULL)
+ free_pages((unsigned long)old_dev_tbl_cpy,
+ get_order(dev_table_size));
+
+ for_each_iommu(iommu) {
+ clear_translation_pre_enabled(iommu);
+ early_enable_iommu(iommu);
+ }
+ } else {
+ pr_info("Copied DEV table from previous kernel.\n");
+ free_pages((unsigned long)amd_iommu_dev_table,
+ get_order(dev_table_size));
+ amd_iommu_dev_table = old_dev_tbl_cpy;
+ for_each_iommu(iommu) {
+ iommu_disable_command_buffer(iommu);
+ iommu_disable_event_buffer(iommu);
+ iommu_enable_command_buffer(iommu);
+ iommu_enable_event_buffer(iommu);
+ iommu_enable_ga(iommu);
+ iommu_set_device_table(iommu);
+ iommu_flush_all_caches(iommu);
+ }
}
#ifdef CONFIG_IRQ_REMAP
@@ -2276,7 +2449,8 @@ static int __init early_amd_iommu_init(void)
/* Device table - directly used by all IOMMUs */
ret = -ENOMEM;
- amd_iommu_dev_table = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+ amd_iommu_dev_table = (void *)__get_free_pages(
+ GFP_KERNEL | __GFP_ZERO | GFP_DMA32,
get_order(dev_table_size));
if (amd_iommu_dev_table == NULL)
goto out;
@@ -2326,7 +2500,8 @@ static int __init early_amd_iommu_init(void)
goto out;
/* Disable any previously enabled IOMMUs */
- disable_iommus();
+ if (!is_kdump_kernel() || amd_iommu_disabled)
+ disable_iommus();
if (amd_iommu_irq_remap)
amd_iommu_irq_remap = check_ioapic_information();
diff --git a/drivers/iommu/amd_iommu_proto.h b/drivers/iommu/amd_iommu_proto.h
index 3f12fb2338ea..640c286a0ab9 100644
--- a/drivers/iommu/amd_iommu_proto.h
+++ b/drivers/iommu/amd_iommu_proto.h
@@ -97,4 +97,6 @@ static inline void *iommu_phys_to_virt(unsigned long paddr)
return phys_to_virt(__sme_clr(paddr));
}
+extern bool translation_pre_enabled(struct amd_iommu *iommu);
+extern struct iommu_dev_data *get_dev_data(struct device *dev);
#endif /* _ASM_X86_AMD_IOMMU_PROTO_H */
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
index 8e3a85759242..f6b24c7d8b70 100644
--- a/drivers/iommu/amd_iommu_types.h
+++ b/drivers/iommu/amd_iommu_types.h
@@ -250,6 +250,14 @@
#define GA_GUEST_NR 0x1
+/* Bit value definition for dte irq remapping fields*/
+#define DTE_IRQ_PHYS_ADDR_MASK (((1ULL << 45)-1) << 6)
+#define DTE_IRQ_REMAP_INTCTL_MASK (0x3ULL << 60)
+#define DTE_IRQ_TABLE_LEN_MASK (0xfULL << 1)
+#define DTE_IRQ_REMAP_INTCTL (2ULL << 60)
+#define DTE_IRQ_TABLE_LEN (8ULL << 1)
+#define DTE_IRQ_REMAP_ENABLE 1ULL
+
#define PAGE_MODE_NONE 0x00
#define PAGE_MODE_1_LEVEL 0x01
#define PAGE_MODE_2_LEVEL 0x02
@@ -265,7 +273,7 @@
#define PM_LEVEL_INDEX(x, a) (((a) >> PM_LEVEL_SHIFT((x))) & 0x1ffULL)
#define PM_LEVEL_ENC(x) (((x) << 9) & 0xe00ULL)
#define PM_LEVEL_PDE(x, a) ((a) | PM_LEVEL_ENC((x)) | \
- IOMMU_PTE_P | IOMMU_PTE_IR | IOMMU_PTE_IW)
+ IOMMU_PTE_PR | IOMMU_PTE_IR | IOMMU_PTE_IW)
#define PM_PTE_LEVEL(pte) (((pte) >> 9) & 0x7ULL)
#define PM_MAP_4k 0
@@ -314,19 +322,29 @@
#define PTE_LEVEL_PAGE_SIZE(level) \
(1ULL << (12 + (9 * (level))))
-#define IOMMU_PTE_P (1ULL << 0)
-#define IOMMU_PTE_TV (1ULL << 1)
+/*
+ * Bit value definition for I/O PTE fields
+ */
+#define IOMMU_PTE_PR (1ULL << 0)
#define IOMMU_PTE_U (1ULL << 59)
#define IOMMU_PTE_FC (1ULL << 60)
#define IOMMU_PTE_IR (1ULL << 61)
#define IOMMU_PTE_IW (1ULL << 62)
+/*
+ * Bit value definition for DTE fields
+ */
+#define DTE_FLAG_V (1ULL << 0)
+#define DTE_FLAG_TV (1ULL << 1)
+#define DTE_FLAG_IR (1ULL << 61)
+#define DTE_FLAG_IW (1ULL << 62)
+
#define DTE_FLAG_IOTLB (1ULL << 32)
-#define DTE_FLAG_SA (1ULL << 34)
#define DTE_FLAG_GV (1ULL << 55)
#define DTE_FLAG_MASK (0x3ffULL << 32)
#define DTE_GLX_SHIFT (56)
#define DTE_GLX_MASK (3)
+#define DEV_DOMID_MASK 0xffffULL
#define DTE_GCR3_VAL_A(x) (((x) >> 12) & 0x00007ULL)
#define DTE_GCR3_VAL_B(x) (((x) >> 15) & 0x0ffffULL)
@@ -343,7 +361,7 @@
#define GCR3_VALID 0x01ULL
#define IOMMU_PAGE_MASK (((1ULL << 52) - 1) & ~0xfffULL)
-#define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_P)
+#define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_PR)
#define IOMMU_PTE_PAGE(pte) (iommu_phys_to_virt((pte) & IOMMU_PAGE_MASK))
#define IOMMU_PTE_MODE(pte) (((pte) >> 9) & 0x07)
@@ -435,6 +453,8 @@ struct iommu_domain;
struct irq_domain;
struct amd_irte_ops;
+#define AMD_IOMMU_FLAG_TRANS_PRE_ENABLED (1 << 0)
+
/*
* This structure contains generic data for IOMMU protection domains
* independent of their use.
@@ -569,6 +589,7 @@ struct amd_iommu {
struct amd_irte_ops *irte_ops;
#endif
+ u32 flags;
volatile u64 __aligned(8) cmd_sem;
};
@@ -599,6 +620,30 @@ struct devid_map {
bool cmd_line;
};
+/*
+ * This struct contains device specific data for the IOMMU
+ */
+struct iommu_dev_data {
+ struct list_head list; /* For domain->dev_list */
+ struct list_head dev_data_list; /* For global dev_data_list */
+ struct protection_domain *domain; /* Domain the device is bound to */
+ u16 devid; /* PCI Device ID */
+ u16 alias; /* Alias Device ID */
+ bool iommu_v2; /* Device can make use of IOMMUv2 */
+ bool passthrough; /* Device is identity mapped */
+ struct {
+ bool enabled;
+ int qdep;
+ } ats; /* ATS state */
+ bool pri_tlp; /* PASID TLB required for
+ PPR completions */
+ u32 errata; /* Bitmap for errata to apply */
+ bool use_vapic; /* Enable device to use vapic mode */
+ bool defer_attach;
+
+ struct ratelimit_state rs; /* Ratelimit IOPF messages */
+};
+
/* Map HPET and IOAPIC ids to the devid used by the IOMMU */
extern struct list_head ioapic_map;
extern struct list_head hpet_map;
diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c
index dccf5b76eff2..7d94e1d39e5e 100644
--- a/drivers/iommu/amd_iommu_v2.c
+++ b/drivers/iommu/amd_iommu_v2.c
@@ -554,14 +554,30 @@ static int ppr_notifier(struct notifier_block *nb, unsigned long e, void *data)
unsigned long flags;
struct fault *fault;
bool finish;
- u16 tag;
+ u16 tag, devid;
int ret;
+ struct iommu_dev_data *dev_data;
+ struct pci_dev *pdev = NULL;
iommu_fault = data;
tag = iommu_fault->tag & 0x1ff;
finish = (iommu_fault->tag >> 9) & 1;
+ devid = iommu_fault->device_id;
+ pdev = pci_get_bus_and_slot(PCI_BUS_NUM(devid), devid & 0xff);
+ if (!pdev)
+ return -ENODEV;
+ dev_data = get_dev_data(&pdev->dev);
+
+ /* In kdump kernel pci dev is not initialized yet -> send INVALID */
ret = NOTIFY_DONE;
+ if (translation_pre_enabled(amd_iommu_rlookup_table[devid])
+ && dev_data->defer_attach) {
+ amd_iommu_complete_ppr(pdev, iommu_fault->pasid,
+ PPR_INVALID, tag);
+ goto out;
+ }
+
dev_state = get_device_state(iommu_fault->device_id);
if (dev_state == NULL)
goto out;
diff --git a/drivers/iommu/arm-smmu-regs.h b/drivers/iommu/arm-smmu-regs.h
new file mode 100644
index 000000000000..a1226e4ab5f8
--- /dev/null
+++ b/drivers/iommu/arm-smmu-regs.h
@@ -0,0 +1,220 @@
+/*
+ * IOMMU API for ARM architected SMMU implementations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Copyright (C) 2013 ARM Limited
+ *
+ * Author: Will Deacon <[email protected]>
+ */
+
+#ifndef _ARM_SMMU_REGS_H
+#define _ARM_SMMU_REGS_H
+
+/* Configuration registers */
+#define ARM_SMMU_GR0_sCR0 0x0
+#define sCR0_CLIENTPD (1 << 0)
+#define sCR0_GFRE (1 << 1)
+#define sCR0_GFIE (1 << 2)
+#define sCR0_EXIDENABLE (1 << 3)
+#define sCR0_GCFGFRE (1 << 4)
+#define sCR0_GCFGFIE (1 << 5)
+#define sCR0_USFCFG (1 << 10)
+#define sCR0_VMIDPNE (1 << 11)
+#define sCR0_PTM (1 << 12)
+#define sCR0_FB (1 << 13)
+#define sCR0_VMID16EN (1 << 31)
+#define sCR0_BSU_SHIFT 14
+#define sCR0_BSU_MASK 0x3
+
+/* Auxiliary Configuration register */
+#define ARM_SMMU_GR0_sACR 0x10
+
+/* Identification registers */
+#define ARM_SMMU_GR0_ID0 0x20
+#define ARM_SMMU_GR0_ID1 0x24
+#define ARM_SMMU_GR0_ID2 0x28
+#define ARM_SMMU_GR0_ID3 0x2c
+#define ARM_SMMU_GR0_ID4 0x30
+#define ARM_SMMU_GR0_ID5 0x34
+#define ARM_SMMU_GR0_ID6 0x38
+#define ARM_SMMU_GR0_ID7 0x3c
+#define ARM_SMMU_GR0_sGFSR 0x48
+#define ARM_SMMU_GR0_sGFSYNR0 0x50
+#define ARM_SMMU_GR0_sGFSYNR1 0x54
+#define ARM_SMMU_GR0_sGFSYNR2 0x58
+
+#define ID0_S1TS (1 << 30)
+#define ID0_S2TS (1 << 29)
+#define ID0_NTS (1 << 28)
+#define ID0_SMS (1 << 27)
+#define ID0_ATOSNS (1 << 26)
+#define ID0_PTFS_NO_AARCH32 (1 << 25)
+#define ID0_PTFS_NO_AARCH32S (1 << 24)
+#define ID0_CTTW (1 << 14)
+#define ID0_NUMIRPT_SHIFT 16
+#define ID0_NUMIRPT_MASK 0xff
+#define ID0_NUMSIDB_SHIFT 9
+#define ID0_NUMSIDB_MASK 0xf
+#define ID0_EXIDS (1 << 8)
+#define ID0_NUMSMRG_SHIFT 0
+#define ID0_NUMSMRG_MASK 0xff
+
+#define ID1_PAGESIZE (1 << 31)
+#define ID1_NUMPAGENDXB_SHIFT 28
+#define ID1_NUMPAGENDXB_MASK 7
+#define ID1_NUMS2CB_SHIFT 16
+#define ID1_NUMS2CB_MASK 0xff
+#define ID1_NUMCB_SHIFT 0
+#define ID1_NUMCB_MASK 0xff
+
+#define ID2_OAS_SHIFT 4
+#define ID2_OAS_MASK 0xf
+#define ID2_IAS_SHIFT 0
+#define ID2_IAS_MASK 0xf
+#define ID2_UBS_SHIFT 8
+#define ID2_UBS_MASK 0xf
+#define ID2_PTFS_4K (1 << 12)
+#define ID2_PTFS_16K (1 << 13)
+#define ID2_PTFS_64K (1 << 14)
+#define ID2_VMID16 (1 << 15)
+
+#define ID7_MAJOR_SHIFT 4
+#define ID7_MAJOR_MASK 0xf
+
+/* Global TLB invalidation */
+#define ARM_SMMU_GR0_TLBIVMID 0x64
+#define ARM_SMMU_GR0_TLBIALLNSNH 0x68
+#define ARM_SMMU_GR0_TLBIALLH 0x6c
+#define ARM_SMMU_GR0_sTLBGSYNC 0x70
+#define ARM_SMMU_GR0_sTLBGSTATUS 0x74
+#define sTLBGSTATUS_GSACTIVE (1 << 0)
+
+/* Stream mapping registers */
+#define ARM_SMMU_GR0_SMR(n) (0x800 + ((n) << 2))
+#define SMR_VALID (1 << 31)
+#define SMR_MASK_SHIFT 16
+#define SMR_ID_SHIFT 0
+
+#define ARM_SMMU_GR0_S2CR(n) (0xc00 + ((n) << 2))
+#define S2CR_CBNDX_SHIFT 0
+#define S2CR_CBNDX_MASK 0xff
+#define S2CR_EXIDVALID (1 << 10)
+#define S2CR_TYPE_SHIFT 16
+#define S2CR_TYPE_MASK 0x3
+enum arm_smmu_s2cr_type {
+ S2CR_TYPE_TRANS,
+ S2CR_TYPE_BYPASS,
+ S2CR_TYPE_FAULT,
+};
+
+#define S2CR_PRIVCFG_SHIFT 24
+#define S2CR_PRIVCFG_MASK 0x3
+enum arm_smmu_s2cr_privcfg {
+ S2CR_PRIVCFG_DEFAULT,
+ S2CR_PRIVCFG_DIPAN,
+ S2CR_PRIVCFG_UNPRIV,
+ S2CR_PRIVCFG_PRIV,
+};
+
+/* Context bank attribute registers */
+#define ARM_SMMU_GR1_CBAR(n) (0x0 + ((n) << 2))
+#define CBAR_VMID_SHIFT 0
+#define CBAR_VMID_MASK 0xff
+#define CBAR_S1_BPSHCFG_SHIFT 8
+#define CBAR_S1_BPSHCFG_MASK 3
+#define CBAR_S1_BPSHCFG_NSH 3
+#define CBAR_S1_MEMATTR_SHIFT 12
+#define CBAR_S1_MEMATTR_MASK 0xf
+#define CBAR_S1_MEMATTR_WB 0xf
+#define CBAR_TYPE_SHIFT 16
+#define CBAR_TYPE_MASK 0x3
+#define CBAR_TYPE_S2_TRANS (0 << CBAR_TYPE_SHIFT)
+#define CBAR_TYPE_S1_TRANS_S2_BYPASS (1 << CBAR_TYPE_SHIFT)
+#define CBAR_TYPE_S1_TRANS_S2_FAULT (2 << CBAR_TYPE_SHIFT)
+#define CBAR_TYPE_S1_TRANS_S2_TRANS (3 << CBAR_TYPE_SHIFT)
+#define CBAR_IRPTNDX_SHIFT 24
+#define CBAR_IRPTNDX_MASK 0xff
+
+#define ARM_SMMU_GR1_CBA2R(n) (0x800 + ((n) << 2))
+#define CBA2R_RW64_32BIT (0 << 0)
+#define CBA2R_RW64_64BIT (1 << 0)
+#define CBA2R_VMID_SHIFT 16
+#define CBA2R_VMID_MASK 0xffff
+
+#define ARM_SMMU_CB_SCTLR 0x0
+#define ARM_SMMU_CB_ACTLR 0x4
+#define ARM_SMMU_CB_RESUME 0x8
+#define ARM_SMMU_CB_TTBCR2 0x10
+#define ARM_SMMU_CB_TTBR0 0x20
+#define ARM_SMMU_CB_TTBR1 0x28
+#define ARM_SMMU_CB_TTBCR 0x30
+#define ARM_SMMU_CB_CONTEXTIDR 0x34
+#define ARM_SMMU_CB_S1_MAIR0 0x38
+#define ARM_SMMU_CB_S1_MAIR1 0x3c
+#define ARM_SMMU_CB_PAR 0x50
+#define ARM_SMMU_CB_FSR 0x58
+#define ARM_SMMU_CB_FAR 0x60
+#define ARM_SMMU_CB_FSYNR0 0x68
+#define ARM_SMMU_CB_S1_TLBIVA 0x600
+#define ARM_SMMU_CB_S1_TLBIASID 0x610
+#define ARM_SMMU_CB_S1_TLBIVAL 0x620
+#define ARM_SMMU_CB_S2_TLBIIPAS2 0x630
+#define ARM_SMMU_CB_S2_TLBIIPAS2L 0x638
+#define ARM_SMMU_CB_TLBSYNC 0x7f0
+#define ARM_SMMU_CB_TLBSTATUS 0x7f4
+#define ARM_SMMU_CB_ATS1PR 0x800
+#define ARM_SMMU_CB_ATSR 0x8f0
+
+#define SCTLR_S1_ASIDPNE (1 << 12)
+#define SCTLR_CFCFG (1 << 7)
+#define SCTLR_CFIE (1 << 6)
+#define SCTLR_CFRE (1 << 5)
+#define SCTLR_E (1 << 4)
+#define SCTLR_AFE (1 << 2)
+#define SCTLR_TRE (1 << 1)
+#define SCTLR_M (1 << 0)
+
+#define CB_PAR_F (1 << 0)
+
+#define ATSR_ACTIVE (1 << 0)
+
+#define RESUME_RETRY (0 << 0)
+#define RESUME_TERMINATE (1 << 0)
+
+#define TTBCR2_SEP_SHIFT 15
+#define TTBCR2_SEP_UPSTREAM (0x7 << TTBCR2_SEP_SHIFT)
+#define TTBCR2_AS (1 << 4)
+
+#define TTBRn_ASID_SHIFT 48
+
+#define FSR_MULTI (1 << 31)
+#define FSR_SS (1 << 30)
+#define FSR_UUT (1 << 8)
+#define FSR_ASF (1 << 7)
+#define FSR_TLBLKF (1 << 6)
+#define FSR_TLBMCF (1 << 5)
+#define FSR_EF (1 << 4)
+#define FSR_PF (1 << 3)
+#define FSR_AFF (1 << 2)
+#define FSR_TF (1 << 1)
+
+#define FSR_IGN (FSR_AFF | FSR_ASF | \
+ FSR_TLBMCF | FSR_TLBLKF)
+#define FSR_FAULT (FSR_MULTI | FSR_SS | FSR_UUT | \
+ FSR_EF | FSR_PF | FSR_TF | FSR_IGN)
+
+#define FSYNR0_WNR (1 << 4)
+
+#endif /* _ARM_SMMU_REGS_H */
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index 568c400eeaed..e67ba6c40faf 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -2852,9 +2852,15 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
arm_smmu_device_disable(smmu);
+
return 0;
}
+static void arm_smmu_device_shutdown(struct platform_device *pdev)
+{
+ arm_smmu_device_remove(pdev);
+}
+
static const struct of_device_id arm_smmu_of_match[] = {
{ .compatible = "arm,smmu-v3", },
{ },
@@ -2868,6 +2874,7 @@ static struct platform_driver arm_smmu_driver = {
},
.probe = arm_smmu_device_probe,
.remove = arm_smmu_device_remove,
+ .shutdown = arm_smmu_device_shutdown,
};
module_platform_driver(arm_smmu_driver);
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 2d80fa8a0634..3bdb799d3b4b 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -54,6 +54,15 @@
#include <linux/amba/bus.h>
#include "io-pgtable.h"
+#include "arm-smmu-regs.h"
+
+#define ARM_MMU500_ACTLR_CPRE (1 << 1)
+
+#define ARM_MMU500_ACR_CACHE_LOCK (1 << 26)
+#define ARM_MMU500_ACR_SMTNMB_TLBEN (1 << 8)
+
+#define TLB_LOOP_TIMEOUT 1000000 /* 1s! */
+#define TLB_SPIN_COUNT 10
/* Maximum number of context banks per SMMU */
#define ARM_SMMU_MAX_CBS 128
@@ -83,211 +92,9 @@
#define smmu_write_atomic_lq writel_relaxed
#endif
-/* Configuration registers */
-#define ARM_SMMU_GR0_sCR0 0x0
-#define sCR0_CLIENTPD (1 << 0)
-#define sCR0_GFRE (1 << 1)
-#define sCR0_GFIE (1 << 2)
-#define sCR0_EXIDENABLE (1 << 3)
-#define sCR0_GCFGFRE (1 << 4)
-#define sCR0_GCFGFIE (1 << 5)
-#define sCR0_USFCFG (1 << 10)
-#define sCR0_VMIDPNE (1 << 11)
-#define sCR0_PTM (1 << 12)
-#define sCR0_FB (1 << 13)
-#define sCR0_VMID16EN (1 << 31)
-#define sCR0_BSU_SHIFT 14
-#define sCR0_BSU_MASK 0x3
-
-/* Auxiliary Configuration register */
-#define ARM_SMMU_GR0_sACR 0x10
-
-/* Identification registers */
-#define ARM_SMMU_GR0_ID0 0x20
-#define ARM_SMMU_GR0_ID1 0x24
-#define ARM_SMMU_GR0_ID2 0x28
-#define ARM_SMMU_GR0_ID3 0x2c
-#define ARM_SMMU_GR0_ID4 0x30
-#define ARM_SMMU_GR0_ID5 0x34
-#define ARM_SMMU_GR0_ID6 0x38
-#define ARM_SMMU_GR0_ID7 0x3c
-#define ARM_SMMU_GR0_sGFSR 0x48
-#define ARM_SMMU_GR0_sGFSYNR0 0x50
-#define ARM_SMMU_GR0_sGFSYNR1 0x54
-#define ARM_SMMU_GR0_sGFSYNR2 0x58
-
-#define ID0_S1TS (1 << 30)
-#define ID0_S2TS (1 << 29)
-#define ID0_NTS (1 << 28)
-#define ID0_SMS (1 << 27)
-#define ID0_ATOSNS (1 << 26)
-#define ID0_PTFS_NO_AARCH32 (1 << 25)
-#define ID0_PTFS_NO_AARCH32S (1 << 24)
-#define ID0_CTTW (1 << 14)
-#define ID0_NUMIRPT_SHIFT 16
-#define ID0_NUMIRPT_MASK 0xff
-#define ID0_NUMSIDB_SHIFT 9
-#define ID0_NUMSIDB_MASK 0xf
-#define ID0_EXIDS (1 << 8)
-#define ID0_NUMSMRG_SHIFT 0
-#define ID0_NUMSMRG_MASK 0xff
-
-#define ID1_PAGESIZE (1 << 31)
-#define ID1_NUMPAGENDXB_SHIFT 28
-#define ID1_NUMPAGENDXB_MASK 7
-#define ID1_NUMS2CB_SHIFT 16
-#define ID1_NUMS2CB_MASK 0xff
-#define ID1_NUMCB_SHIFT 0
-#define ID1_NUMCB_MASK 0xff
-
-#define ID2_OAS_SHIFT 4
-#define ID2_OAS_MASK 0xf
-#define ID2_IAS_SHIFT 0
-#define ID2_IAS_MASK 0xf
-#define ID2_UBS_SHIFT 8
-#define ID2_UBS_MASK 0xf
-#define ID2_PTFS_4K (1 << 12)
-#define ID2_PTFS_16K (1 << 13)
-#define ID2_PTFS_64K (1 << 14)
-#define ID2_VMID16 (1 << 15)
-
-#define ID7_MAJOR_SHIFT 4
-#define ID7_MAJOR_MASK 0xf
-
-/* Global TLB invalidation */
-#define ARM_SMMU_GR0_TLBIVMID 0x64
-#define ARM_SMMU_GR0_TLBIALLNSNH 0x68
-#define ARM_SMMU_GR0_TLBIALLH 0x6c
-#define ARM_SMMU_GR0_sTLBGSYNC 0x70
-#define ARM_SMMU_GR0_sTLBGSTATUS 0x74
-#define sTLBGSTATUS_GSACTIVE (1 << 0)
-#define TLB_LOOP_TIMEOUT 1000000 /* 1s! */
-#define TLB_SPIN_COUNT 10
-
-/* Stream mapping registers */
-#define ARM_SMMU_GR0_SMR(n) (0x800 + ((n) << 2))
-#define SMR_VALID (1 << 31)
-#define SMR_MASK_SHIFT 16
-#define SMR_ID_SHIFT 0
-
-#define ARM_SMMU_GR0_S2CR(n) (0xc00 + ((n) << 2))
-#define S2CR_CBNDX_SHIFT 0
-#define S2CR_CBNDX_MASK 0xff
-#define S2CR_EXIDVALID (1 << 10)
-#define S2CR_TYPE_SHIFT 16
-#define S2CR_TYPE_MASK 0x3
-enum arm_smmu_s2cr_type {
- S2CR_TYPE_TRANS,
- S2CR_TYPE_BYPASS,
- S2CR_TYPE_FAULT,
-};
-
-#define S2CR_PRIVCFG_SHIFT 24
-#define S2CR_PRIVCFG_MASK 0x3
-enum arm_smmu_s2cr_privcfg {
- S2CR_PRIVCFG_DEFAULT,
- S2CR_PRIVCFG_DIPAN,
- S2CR_PRIVCFG_UNPRIV,
- S2CR_PRIVCFG_PRIV,
-};
-
-/* Context bank attribute registers */
-#define ARM_SMMU_GR1_CBAR(n) (0x0 + ((n) << 2))
-#define CBAR_VMID_SHIFT 0
-#define CBAR_VMID_MASK 0xff
-#define CBAR_S1_BPSHCFG_SHIFT 8
-#define CBAR_S1_BPSHCFG_MASK 3
-#define CBAR_S1_BPSHCFG_NSH 3
-#define CBAR_S1_MEMATTR_SHIFT 12
-#define CBAR_S1_MEMATTR_MASK 0xf
-#define CBAR_S1_MEMATTR_WB 0xf
-#define CBAR_TYPE_SHIFT 16
-#define CBAR_TYPE_MASK 0x3
-#define CBAR_TYPE_S2_TRANS (0 << CBAR_TYPE_SHIFT)
-#define CBAR_TYPE_S1_TRANS_S2_BYPASS (1 << CBAR_TYPE_SHIFT)
-#define CBAR_TYPE_S1_TRANS_S2_FAULT (2 << CBAR_TYPE_SHIFT)
-#define CBAR_TYPE_S1_TRANS_S2_TRANS (3 << CBAR_TYPE_SHIFT)
-#define CBAR_IRPTNDX_SHIFT 24
-#define CBAR_IRPTNDX_MASK 0xff
-
-#define ARM_SMMU_GR1_CBA2R(n) (0x800 + ((n) << 2))
-#define CBA2R_RW64_32BIT (0 << 0)
-#define CBA2R_RW64_64BIT (1 << 0)
-#define CBA2R_VMID_SHIFT 16
-#define CBA2R_VMID_MASK 0xffff
-
/* Translation context bank */
#define ARM_SMMU_CB(smmu, n) ((smmu)->cb_base + ((n) << (smmu)->pgshift))
-#define ARM_SMMU_CB_SCTLR 0x0
-#define ARM_SMMU_CB_ACTLR 0x4
-#define ARM_SMMU_CB_RESUME 0x8
-#define ARM_SMMU_CB_TTBCR2 0x10
-#define ARM_SMMU_CB_TTBR0 0x20
-#define ARM_SMMU_CB_TTBR1 0x28
-#define ARM_SMMU_CB_TTBCR 0x30
-#define ARM_SMMU_CB_CONTEXTIDR 0x34
-#define ARM_SMMU_CB_S1_MAIR0 0x38
-#define ARM_SMMU_CB_S1_MAIR1 0x3c
-#define ARM_SMMU_CB_PAR 0x50
-#define ARM_SMMU_CB_FSR 0x58
-#define ARM_SMMU_CB_FAR 0x60
-#define ARM_SMMU_CB_FSYNR0 0x68
-#define ARM_SMMU_CB_S1_TLBIVA 0x600
-#define ARM_SMMU_CB_S1_TLBIASID 0x610
-#define ARM_SMMU_CB_S1_TLBIVAL 0x620
-#define ARM_SMMU_CB_S2_TLBIIPAS2 0x630
-#define ARM_SMMU_CB_S2_TLBIIPAS2L 0x638
-#define ARM_SMMU_CB_TLBSYNC 0x7f0
-#define ARM_SMMU_CB_TLBSTATUS 0x7f4
-#define ARM_SMMU_CB_ATS1PR 0x800
-#define ARM_SMMU_CB_ATSR 0x8f0
-
-#define SCTLR_S1_ASIDPNE (1 << 12)
-#define SCTLR_CFCFG (1 << 7)
-#define SCTLR_CFIE (1 << 6)
-#define SCTLR_CFRE (1 << 5)
-#define SCTLR_E (1 << 4)
-#define SCTLR_AFE (1 << 2)
-#define SCTLR_TRE (1 << 1)
-#define SCTLR_M (1 << 0)
-
-#define ARM_MMU500_ACTLR_CPRE (1 << 1)
-
-#define ARM_MMU500_ACR_CACHE_LOCK (1 << 26)
-#define ARM_MMU500_ACR_SMTNMB_TLBEN (1 << 8)
-
-#define CB_PAR_F (1 << 0)
-
-#define ATSR_ACTIVE (1 << 0)
-
-#define RESUME_RETRY (0 << 0)
-#define RESUME_TERMINATE (1 << 0)
-
-#define TTBCR2_SEP_SHIFT 15
-#define TTBCR2_SEP_UPSTREAM (0x7 << TTBCR2_SEP_SHIFT)
-#define TTBCR2_AS (1 << 4)
-
-#define TTBRn_ASID_SHIFT 48
-
-#define FSR_MULTI (1 << 31)
-#define FSR_SS (1 << 30)
-#define FSR_UUT (1 << 8)
-#define FSR_ASF (1 << 7)
-#define FSR_TLBLKF (1 << 6)
-#define FSR_TLBMCF (1 << 5)
-#define FSR_EF (1 << 4)
-#define FSR_PF (1 << 3)
-#define FSR_AFF (1 << 2)
-#define FSR_TF (1 << 1)
-
-#define FSR_IGN (FSR_AFF | FSR_ASF | \
- FSR_TLBMCF | FSR_TLBLKF)
-#define FSR_FAULT (FSR_MULTI | FSR_SS | FSR_UUT | \
- FSR_EF | FSR_PF | FSR_TF | FSR_IGN)
-
-#define FSYNR0_WNR (1 << 4)
-
#define MSI_IOVA_BASE 0x8000000
#define MSI_IOVA_LENGTH 0x100000
@@ -338,6 +145,13 @@ struct arm_smmu_smr {
bool valid;
};
+struct arm_smmu_cb {
+ u64 ttbr[2];
+ u32 tcr[2];
+ u32 mair[2];
+ struct arm_smmu_cfg *cfg;
+};
+
struct arm_smmu_master_cfg {
struct arm_smmu_device *smmu;
s16 smendx[];
@@ -380,6 +194,7 @@ struct arm_smmu_device {
u32 num_context_banks;
u32 num_s2_context_banks;
DECLARE_BITMAP(context_map, ARM_SMMU_MAX_CBS);
+ struct arm_smmu_cb *cbs;
atomic_t irptndx;
u32 num_mapping_groups;
@@ -776,17 +591,74 @@ static irqreturn_t arm_smmu_global_fault(int irq, void *dev)
static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
struct io_pgtable_cfg *pgtbl_cfg)
{
- u32 reg, reg2;
- u64 reg64;
- bool stage1;
struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
- struct arm_smmu_device *smmu = smmu_domain->smmu;
+ struct arm_smmu_cb *cb = &smmu_domain->smmu->cbs[cfg->cbndx];
+ bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
+
+ cb->cfg = cfg;
+
+ /* TTBCR */
+ if (stage1) {
+ if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
+ cb->tcr[0] = pgtbl_cfg->arm_v7s_cfg.tcr;
+ } else {
+ cb->tcr[0] = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
+ cb->tcr[1] = pgtbl_cfg->arm_lpae_s1_cfg.tcr >> 32;
+ cb->tcr[1] |= TTBCR2_SEP_UPSTREAM;
+ if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
+ cb->tcr[1] |= TTBCR2_AS;
+ }
+ } else {
+ cb->tcr[0] = pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
+ }
+
+ /* TTBRs */
+ if (stage1) {
+ if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
+ cb->ttbr[0] = pgtbl_cfg->arm_v7s_cfg.ttbr[0];
+ cb->ttbr[1] = pgtbl_cfg->arm_v7s_cfg.ttbr[1];
+ } else {
+ cb->ttbr[0] = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];
+ cb->ttbr[0] |= (u64)cfg->asid << TTBRn_ASID_SHIFT;
+ cb->ttbr[1] = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[1];
+ cb->ttbr[1] |= (u64)cfg->asid << TTBRn_ASID_SHIFT;
+ }
+ } else {
+ cb->ttbr[0] = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
+ }
+
+ /* MAIRs (stage-1 only) */
+ if (stage1) {
+ if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
+ cb->mair[0] = pgtbl_cfg->arm_v7s_cfg.prrr;
+ cb->mair[1] = pgtbl_cfg->arm_v7s_cfg.nmrr;
+ } else {
+ cb->mair[0] = pgtbl_cfg->arm_lpae_s1_cfg.mair[0];
+ cb->mair[1] = pgtbl_cfg->arm_lpae_s1_cfg.mair[1];
+ }
+ }
+}
+
+static void arm_smmu_write_context_bank(struct arm_smmu_device *smmu, int idx)
+{
+ u32 reg;
+ bool stage1;
+ struct arm_smmu_cb *cb = &smmu->cbs[idx];
+ struct arm_smmu_cfg *cfg = cb->cfg;
void __iomem *cb_base, *gr1_base;
+ cb_base = ARM_SMMU_CB(smmu, idx);
+
+ /* Unassigned context banks only need disabling */
+ if (!cfg) {
+ writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
+ return;
+ }
+
gr1_base = ARM_SMMU_GR1(smmu);
stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
- cb_base = ARM_SMMU_CB(smmu, cfg->cbndx);
+ /* CBA2R */
if (smmu->version > ARM_SMMU_V1) {
if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
reg = CBA2R_RW64_64BIT;
@@ -796,7 +668,7 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
if (smmu->features & ARM_SMMU_FEAT_VMID16)
reg |= cfg->vmid << CBA2R_VMID_SHIFT;
- writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBA2R(cfg->cbndx));
+ writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBA2R(idx));
}
/* CBAR */
@@ -815,72 +687,41 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
/* 8-bit VMIDs live in CBAR */
reg |= cfg->vmid << CBAR_VMID_SHIFT;
}
- writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBAR(cfg->cbndx));
+ writel_relaxed(reg, gr1_base + ARM_SMMU_GR1_CBAR(idx));
/*
* TTBCR
* We must write this before the TTBRs, since it determines the
* access behaviour of some fields (in particular, ASID[15:8]).
*/
- if (stage1) {
- if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
- reg = pgtbl_cfg->arm_v7s_cfg.tcr;
- reg2 = 0;
- } else {
- reg = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
- reg2 = pgtbl_cfg->arm_lpae_s1_cfg.tcr >> 32;
- reg2 |= TTBCR2_SEP_UPSTREAM;
- if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
- reg2 |= TTBCR2_AS;
- }
- if (smmu->version > ARM_SMMU_V1)
- writel_relaxed(reg2, cb_base + ARM_SMMU_CB_TTBCR2);
- } else {
- reg = pgtbl_cfg->arm_lpae_s2_cfg.vtcr;
- }
- writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBCR);
+ if (stage1 && smmu->version > ARM_SMMU_V1)
+ writel_relaxed(cb->tcr[1], cb_base + ARM_SMMU_CB_TTBCR2);
+ writel_relaxed(cb->tcr[0], cb_base + ARM_SMMU_CB_TTBCR);
/* TTBRs */
- if (stage1) {
- if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
- reg = pgtbl_cfg->arm_v7s_cfg.ttbr[0];
- writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR0);
- reg = pgtbl_cfg->arm_v7s_cfg.ttbr[1];
- writel_relaxed(reg, cb_base + ARM_SMMU_CB_TTBR1);
- writel_relaxed(cfg->asid, cb_base + ARM_SMMU_CB_CONTEXTIDR);
- } else {
- reg64 = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[0];
- reg64 |= (u64)cfg->asid << TTBRn_ASID_SHIFT;
- writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR0);
- reg64 = pgtbl_cfg->arm_lpae_s1_cfg.ttbr[1];
- reg64 |= (u64)cfg->asid << TTBRn_ASID_SHIFT;
- writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR1);
- }
+ if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
+ writel_relaxed(cfg->asid, cb_base + ARM_SMMU_CB_CONTEXTIDR);
+ writel_relaxed(cb->ttbr[0], cb_base + ARM_SMMU_CB_TTBR0);
+ writel_relaxed(cb->ttbr[1], cb_base + ARM_SMMU_CB_TTBR1);
} else {
- reg64 = pgtbl_cfg->arm_lpae_s2_cfg.vttbr;
- writeq_relaxed(reg64, cb_base + ARM_SMMU_CB_TTBR0);
+ writeq_relaxed(cb->ttbr[0], cb_base + ARM_SMMU_CB_TTBR0);
+ if (stage1)
+ writeq_relaxed(cb->ttbr[1], cb_base + ARM_SMMU_CB_TTBR1);
}
/* MAIRs (stage-1 only) */
if (stage1) {
- if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH32_S) {
- reg = pgtbl_cfg->arm_v7s_cfg.prrr;
- reg2 = pgtbl_cfg->arm_v7s_cfg.nmrr;
- } else {
- reg = pgtbl_cfg->arm_lpae_s1_cfg.mair[0];
- reg2 = pgtbl_cfg->arm_lpae_s1_cfg.mair[1];
- }
- writel_relaxed(reg, cb_base + ARM_SMMU_CB_S1_MAIR0);
- writel_relaxed(reg2, cb_base + ARM_SMMU_CB_S1_MAIR1);
+ writel_relaxed(cb->mair[0], cb_base + ARM_SMMU_CB_S1_MAIR0);
+ writel_relaxed(cb->mair[1], cb_base + ARM_SMMU_CB_S1_MAIR1);
}
/* SCTLR */
reg = SCTLR_CFIE | SCTLR_CFRE | SCTLR_AFE | SCTLR_TRE | SCTLR_M;
if (stage1)
reg |= SCTLR_S1_ASIDPNE;
-#ifdef __BIG_ENDIAN
- reg |= SCTLR_E;
-#endif
+ if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+ reg |= SCTLR_E;
+
writel_relaxed(reg, cb_base + ARM_SMMU_CB_SCTLR);
}
@@ -1043,6 +884,7 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain,
/* Initialise the context bank with our page table cfg */
arm_smmu_init_context_bank(smmu_domain, &pgtbl_cfg);
+ arm_smmu_write_context_bank(smmu, cfg->cbndx);
/*
* Request context fault interrupt. Do this last to avoid the
@@ -1075,7 +917,6 @@ static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
struct arm_smmu_device *smmu = smmu_domain->smmu;
struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
- void __iomem *cb_base;
int irq;
if (!smmu || domain->type == IOMMU_DOMAIN_IDENTITY)
@@ -1085,8 +926,8 @@ static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
* Disable the context bank and free the page tables before freeing
* it.
*/
- cb_base = ARM_SMMU_CB(smmu, cfg->cbndx);
- writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
+ smmu->cbs[cfg->cbndx].cfg = NULL;
+ arm_smmu_write_context_bank(smmu, cfg->cbndx);
if (cfg->irptndx != INVALID_IRPTNDX) {
irq = smmu->irqs[smmu->num_global_irqs + cfg->irptndx];
@@ -1736,7 +1577,6 @@ static struct iommu_ops arm_smmu_ops = {
static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
{
void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
- void __iomem *cb_base;
int i;
u32 reg, major;
@@ -1772,8 +1612,9 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
/* Make sure all context banks are disabled and clear CB_FSR */
for (i = 0; i < smmu->num_context_banks; ++i) {
- cb_base = ARM_SMMU_CB(smmu, i);
- writel_relaxed(0, cb_base + ARM_SMMU_CB_SCTLR);
+ void __iomem *cb_base = ARM_SMMU_CB(smmu, i);
+
+ arm_smmu_write_context_bank(smmu, i);
writel_relaxed(FSR_FAULT, cb_base + ARM_SMMU_CB_FSR);
/*
* Disable MMU-500's not-particularly-beneficial next-page
@@ -1979,6 +1820,10 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
smmu->cavium_id_base -= smmu->num_context_banks;
dev_notice(smmu->dev, "\tenabling workaround for Cavium erratum 27704\n");
}
+ smmu->cbs = devm_kcalloc(smmu->dev, smmu->num_context_banks,
+ sizeof(*smmu->cbs), GFP_KERNEL);
+ if (!smmu->cbs)
+ return -ENOMEM;
/* ID2 */
id = readl_relaxed(gr0_base + ARM_SMMU_GR0_ID2);
@@ -2336,13 +2181,30 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
return 0;
}
+static void arm_smmu_device_shutdown(struct platform_device *pdev)
+{
+ arm_smmu_device_remove(pdev);
+}
+
+static int __maybe_unused arm_smmu_pm_resume(struct device *dev)
+{
+ struct arm_smmu_device *smmu = dev_get_drvdata(dev);
+
+ arm_smmu_device_reset(smmu);
+ return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(arm_smmu_pm_ops, NULL, arm_smmu_pm_resume);
+
static struct platform_driver arm_smmu_driver = {
.driver = {
.name = "arm-smmu",
.of_match_table = of_match_ptr(arm_smmu_of_match),
+ .pm = &arm_smmu_pm_ops,
},
.probe = arm_smmu_device_probe,
.remove = arm_smmu_device_remove,
+ .shutdown = arm_smmu_device_shutdown,
};
module_platform_driver(arm_smmu_driver);
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index c8b0329c85d2..57c920c1372d 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -497,7 +497,7 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
#define dmar_parse_one_rhsa dmar_res_noop
#endif
-static void __init
+static void
dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
{
struct acpi_dmar_hardware_unit *drhd;
@@ -1343,7 +1343,7 @@ void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 qdep,
if (mask) {
BUG_ON(addr & ((1 << (VTD_PAGE_SHIFT + mask)) - 1));
- addr |= (1 << (VTD_PAGE_SHIFT + mask - 1)) - 1;
+ addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1)) - 1;
desc.high = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE;
} else
desc.high = QI_DEV_IOTLB_ADDR(addr);
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
index 2395478dde75..f596fcc32898 100644
--- a/drivers/iommu/exynos-iommu.c
+++ b/drivers/iommu/exynos-iommu.c
@@ -54,10 +54,6 @@ typedef u32 sysmmu_pte_t;
#define lv2ent_small(pent) ((*(pent) & 2) == 2)
#define lv2ent_large(pent) ((*(pent) & 3) == 1)
-#ifdef CONFIG_BIG_ENDIAN
-#warning "revisit driver if we can enable big-endian ptes"
-#endif
-
/*
* v1.x - v3.x SYSMMU supports 32bit physical and 32bit virtual address spaces
* v5.0 introduced support for 36bit physical address space by shifting
@@ -569,7 +565,7 @@ static void sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
spin_unlock_irqrestore(&data->lock, flags);
}
-static struct iommu_ops exynos_iommu_ops;
+static const struct iommu_ops exynos_iommu_ops;
static int __init exynos_sysmmu_probe(struct platform_device *pdev)
{
@@ -659,6 +655,13 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev)
}
}
+ /*
+ * use the first registered sysmmu device for performing
+ * dma mapping operations on iommu page tables (cpu cache flush)
+ */
+ if (!dma_dev)
+ dma_dev = &pdev->dev;
+
pm_runtime_enable(dev);
return 0;
@@ -1323,7 +1326,7 @@ static int exynos_iommu_of_xlate(struct device *dev,
return 0;
}
-static struct iommu_ops exynos_iommu_ops = {
+static const struct iommu_ops exynos_iommu_ops = {
.domain_alloc = exynos_iommu_domain_alloc,
.domain_free = exynos_iommu_domain_free,
.attach_dev = exynos_iommu_attach_device,
@@ -1339,8 +1342,6 @@ static struct iommu_ops exynos_iommu_ops = {
.of_xlate = exynos_iommu_of_xlate,
};
-static bool init_done;
-
static int __init exynos_iommu_init(void)
{
int ret;
@@ -1373,8 +1374,6 @@ static int __init exynos_iommu_init(void)
goto err_set_iommu;
}
- init_done = true;
-
return 0;
err_set_iommu:
kmem_cache_free(lv2table_kmem_cache, zero_lv2_table);
@@ -1384,27 +1383,6 @@ err_reg_driver:
kmem_cache_destroy(lv2table_kmem_cache);
return ret;
}
+core_initcall(exynos_iommu_init);
-static int __init exynos_iommu_of_setup(struct device_node *np)
-{
- struct platform_device *pdev;
-
- if (!init_done)
- exynos_iommu_init();
-
- pdev = of_platform_device_create(np, NULL, platform_bus_type.dev_root);
- if (!pdev)
- return -ENODEV;
-
- /*
- * use the first registered sysmmu device for performing
- * dma mapping operations on iommu page tables (cpu cache flush)
- */
- if (!dma_dev)
- dma_dev = &pdev->dev;
-
- return 0;
-}
-
-IOMMU_OF_DECLARE(exynos_iommu_of, "samsung,exynos-sysmmu",
- exynos_iommu_of_setup);
+IOMMU_OF_DECLARE(exynos_iommu_of, "samsung,exynos-sysmmu", NULL);
diff --git a/drivers/iommu/fsl_pamu.c b/drivers/iommu/fsl_pamu.c
index a34355fca37a..8540625796a1 100644
--- a/drivers/iommu/fsl_pamu.c
+++ b/drivers/iommu/fsl_pamu.c
@@ -42,6 +42,8 @@ struct pamu_isr_data {
static struct paace *ppaact;
static struct paace *spaact;
+static bool probed; /* Has PAMU been probed? */
+
/*
* Table for matching compatible strings, for device tree
* guts node, for QorIQ SOCs.
@@ -530,8 +532,8 @@ u32 get_stash_id(u32 stash_dest_hint, u32 vcpu)
if (node) {
prop = of_get_property(node, "cache-stash-id", NULL);
if (!prop) {
- pr_debug("missing cache-stash-id at %s\n",
- node->full_name);
+ pr_debug("missing cache-stash-id at %pOF\n",
+ node);
of_node_put(node);
return ~(u32)0;
}
@@ -557,8 +559,8 @@ found_cpu_node:
if (stash_dest_hint == cache_level) {
prop = of_get_property(node, "cache-stash-id", NULL);
if (!prop) {
- pr_debug("missing cache-stash-id at %s\n",
- node->full_name);
+ pr_debug("missing cache-stash-id at %pOF\n",
+ node);
of_node_put(node);
return ~(u32)0;
}
@@ -568,8 +570,7 @@ found_cpu_node:
prop = of_get_property(node, "next-level-cache", NULL);
if (!prop) {
- pr_debug("can't find next-level-cache at %s\n",
- node->full_name);
+ pr_debug("can't find next-level-cache at %pOF\n", node);
of_node_put(node);
return ~(u32)0; /* can't traverse any further */
}
@@ -1033,6 +1034,9 @@ static int fsl_pamu_probe(struct platform_device *pdev)
* NOTE : All PAMUs share the same LIODN tables.
*/
+ if (WARN_ON(probed))
+ return -EBUSY;
+
pamu_regs = of_iomap(dev->of_node, 0);
if (!pamu_regs) {
dev_err(dev, "ioremap of PAMU node failed\n");
@@ -1063,8 +1067,7 @@ static int fsl_pamu_probe(struct platform_device *pdev)
guts_node = of_find_matching_node(NULL, guts_device_ids);
if (!guts_node) {
- dev_err(dev, "could not find GUTS node %s\n",
- dev->of_node->full_name);
+ dev_err(dev, "could not find GUTS node %pOF\n", dev->of_node);
ret = -ENODEV;
goto error;
}
@@ -1172,6 +1175,8 @@ static int fsl_pamu_probe(struct platform_device *pdev)
setup_liodns();
+ probed = true;
+
return 0;
error_genpool:
@@ -1246,8 +1251,7 @@ static __init int fsl_pamu_init(void)
pdev = platform_device_alloc("fsl-of-pamu", 0);
if (!pdev) {
- pr_err("could not allocate device %s\n",
- np->full_name);
+ pr_err("could not allocate device %pOF\n", np);
ret = -ENOMEM;
goto error_device_alloc;
}
@@ -1259,8 +1263,7 @@ static __init int fsl_pamu_init(void)
ret = platform_device_add(pdev);
if (ret) {
- pr_err("could not add device %s (err=%i)\n",
- np->full_name, ret);
+ pr_err("could not add device %pOF (err=%i)\n", np, ret);
goto error_device_add;
}
diff --git a/drivers/iommu/fsl_pamu_domain.c b/drivers/iommu/fsl_pamu_domain.c
index da0e1e30ef37..f089136e9c3f 100644
--- a/drivers/iommu/fsl_pamu_domain.c
+++ b/drivers/iommu/fsl_pamu_domain.c
@@ -33,6 +33,8 @@ static struct kmem_cache *fsl_pamu_domain_cache;
static struct kmem_cache *iommu_devinfo_cache;
static DEFINE_SPINLOCK(device_domain_lock);
+struct iommu_device pamu_iommu; /* IOMMU core code handle */
+
static struct fsl_dma_domain *to_fsl_dma_domain(struct iommu_domain *dom)
{
return container_of(dom, struct fsl_dma_domain, iommu_domain);
@@ -619,8 +621,8 @@ static int handle_attach_device(struct fsl_dma_domain *dma_domain,
for (i = 0; i < num; i++) {
/* Ensure that LIODN value is valid */
if (liodn[i] >= PAACE_NUMBER_ENTRIES) {
- pr_debug("Invalid liodn %d, attach device failed for %s\n",
- liodn[i], dev->of_node->full_name);
+ pr_debug("Invalid liodn %d, attach device failed for %pOF\n",
+ liodn[i], dev->of_node);
ret = -EINVAL;
break;
}
@@ -684,8 +686,7 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,
liodn_cnt = len / sizeof(u32);
ret = handle_attach_device(dma_domain, dev, liodn, liodn_cnt);
} else {
- pr_debug("missing fsl,liodn property at %s\n",
- dev->of_node->full_name);
+ pr_debug("missing fsl,liodn property at %pOF\n", dev->of_node);
ret = -EINVAL;
}
@@ -720,8 +721,7 @@ static void fsl_pamu_detach_device(struct iommu_domain *domain,
if (prop)
detach_device(dev, dma_domain);
else
- pr_debug("missing fsl,liodn property at %s\n",
- dev->of_node->full_name);
+ pr_debug("missing fsl,liodn property at %pOF\n", dev->of_node);
}
static int configure_domain_geometry(struct iommu_domain *domain, void *data)
@@ -983,11 +983,14 @@ static int fsl_pamu_add_device(struct device *dev)
iommu_group_put(group);
+ iommu_device_link(&pamu_iommu, dev);
+
return 0;
}
static void fsl_pamu_remove_device(struct device *dev)
{
+ iommu_device_unlink(&pamu_iommu, dev);
iommu_group_remove_device(dev);
}
@@ -1073,6 +1076,19 @@ int __init pamu_domain_init(void)
if (ret)
return ret;
+ ret = iommu_device_sysfs_add(&pamu_iommu, NULL, NULL, "iommu0");
+ if (ret)
+ return ret;
+
+ iommu_device_set_ops(&pamu_iommu, &fsl_pamu_ops);
+
+ ret = iommu_device_register(&pamu_iommu);
+ if (ret) {
+ iommu_device_sysfs_remove(&pamu_iommu);
+ pr_err("Can't register iommu device\n");
+ return ret;
+ }
+
bus_set_iommu(&platform_bus_type, &fsl_pamu_ops);
bus_set_iommu(&pci_bus_type, &fsl_pamu_ops);
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index bb05fc50ee2e..6784a05dd6b2 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -458,31 +458,6 @@ static LIST_HEAD(dmar_rmrr_units);
#define for_each_rmrr_units(rmrr) \
list_for_each_entry(rmrr, &dmar_rmrr_units, list)
-static void flush_unmaps_timeout(unsigned long data);
-
-struct deferred_flush_entry {
- unsigned long iova_pfn;
- unsigned long nrpages;
- struct dmar_domain *domain;
- struct page *freelist;
-};
-
-#define HIGH_WATER_MARK 250
-struct deferred_flush_table {
- int next;
- struct deferred_flush_entry entries[HIGH_WATER_MARK];
-};
-
-struct deferred_flush_data {
- spinlock_t lock;
- int timer_on;
- struct timer_list timer;
- long size;
- struct deferred_flush_table *tables;
-};
-
-static DEFINE_PER_CPU(struct deferred_flush_data, deferred_flush);
-
/* bitmap for indexing intel_iommus */
static int g_num_of_iommus;
@@ -981,20 +956,6 @@ static int device_context_mapped(struct intel_iommu *iommu, u8 bus, u8 devfn)
return ret;
}
-static void clear_context_table(struct intel_iommu *iommu, u8 bus, u8 devfn)
-{
- struct context_entry *context;
- unsigned long flags;
-
- spin_lock_irqsave(&iommu->lock, flags);
- context = iommu_context_addr(iommu, bus, devfn, 0);
- if (context) {
- context_clear_entry(context);
- __iommu_flush_cache(iommu, context, sizeof(*context));
- }
- spin_unlock_irqrestore(&iommu->lock, flags);
-}
-
static void free_context_table(struct intel_iommu *iommu)
{
int i;
@@ -1144,8 +1105,9 @@ static void dma_pte_clear_range(struct dmar_domain *domain,
}
static void dma_pte_free_level(struct dmar_domain *domain, int level,
- struct dma_pte *pte, unsigned long pfn,
- unsigned long start_pfn, unsigned long last_pfn)
+ int retain_level, struct dma_pte *pte,
+ unsigned long pfn, unsigned long start_pfn,
+ unsigned long last_pfn)
{
pfn = max(start_pfn, pfn);
pte = &pte[pfn_level_offset(pfn, level)];
@@ -1160,12 +1122,17 @@ static void dma_pte_free_level(struct dmar_domain *domain, int level,
level_pfn = pfn & level_mask(level);
level_pte = phys_to_virt(dma_pte_addr(pte));
- if (level > 2)
- dma_pte_free_level(domain, level - 1, level_pte,
- level_pfn, start_pfn, last_pfn);
+ if (level > 2) {
+ dma_pte_free_level(domain, level - 1, retain_level,
+ level_pte, level_pfn, start_pfn,
+ last_pfn);
+ }
- /* If range covers entire pagetable, free it */
- if (!(start_pfn > level_pfn ||
+ /*
+ * Free the page table if we're below the level we want to
+ * retain and the range covers the entire table.
+ */
+ if (level < retain_level && !(start_pfn > level_pfn ||
last_pfn < level_pfn + level_size(level) - 1)) {
dma_clear_pte(pte);
domain_flush_cache(domain, pte, sizeof(*pte));
@@ -1176,10 +1143,14 @@ next:
} while (!first_pte_in_page(++pte) && pfn <= last_pfn);
}
-/* clear last level (leaf) ptes and free page table pages. */
+/*
+ * clear last level (leaf) ptes and free page table pages below the
+ * level we wish to keep intact.
+ */
static void dma_pte_free_pagetable(struct dmar_domain *domain,
unsigned long start_pfn,
- unsigned long last_pfn)
+ unsigned long last_pfn,
+ int retain_level)
{
BUG_ON(!domain_pfn_supported(domain, start_pfn));
BUG_ON(!domain_pfn_supported(domain, last_pfn));
@@ -1188,7 +1159,7 @@ static void dma_pte_free_pagetable(struct dmar_domain *domain,
dma_pte_clear_range(domain, start_pfn, last_pfn);
/* We don't need lock here; nobody else touches the iova range */
- dma_pte_free_level(domain, agaw_to_level(domain->agaw),
+ dma_pte_free_level(domain, agaw_to_level(domain->agaw), retain_level,
domain->pgd, 0, start_pfn, last_pfn);
/* free pgd */
@@ -1316,6 +1287,13 @@ static void dma_free_pagelist(struct page *freelist)
}
}
+static void iova_entry_free(unsigned long data)
+{
+ struct page *freelist = (struct page *)data;
+
+ dma_free_pagelist(freelist);
+}
+
/* iommu handling */
static int iommu_alloc_root_entry(struct intel_iommu *iommu)
{
@@ -1629,6 +1607,25 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
addr, mask);
}
+static void iommu_flush_iova(struct iova_domain *iovad)
+{
+ struct dmar_domain *domain;
+ int idx;
+
+ domain = container_of(iovad, struct dmar_domain, iovad);
+
+ for_each_domain_iommu(idx, domain) {
+ struct intel_iommu *iommu = g_iommus[idx];
+ u16 did = domain->iommu_did[iommu->seq_id];
+
+ iommu->flush.flush_iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH);
+
+ if (!cap_caching_mode(iommu->cap))
+ iommu_flush_dev_iotlb(get_iommu_domain(iommu, did),
+ 0, MAX_AGAW_PFN_WIDTH);
+ }
+}
+
static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu)
{
u32 pmen;
@@ -1939,9 +1936,16 @@ static int domain_init(struct dmar_domain *domain, struct intel_iommu *iommu,
{
int adjust_width, agaw;
unsigned long sagaw;
+ int err;
init_iova_domain(&domain->iovad, VTD_PAGE_SIZE, IOVA_START_PFN,
DMA_32BIT_PFN);
+
+ err = init_iova_flush_queue(&domain->iovad,
+ iommu_flush_iova, iova_entry_free);
+ if (err)
+ return err;
+
domain_reserve_special_ranges(domain);
/* calculate AGAW */
@@ -1993,14 +1997,6 @@ static void domain_exit(struct dmar_domain *domain)
if (!domain)
return;
- /* Flush any lazy unmaps that may reference this domain */
- if (!intel_iommu_strict) {
- int cpu;
-
- for_each_possible_cpu(cpu)
- flush_unmaps_timeout(cpu);
- }
-
/* Remove associated devices and clear attached or cached domains */
rcu_read_lock();
domain_remove_dev_info(domain);
@@ -2284,8 +2280,11 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
/*
* Ensure that old small page tables are
* removed to make room for superpage(s).
+ * We're adding new large pages, so make sure
+ * we don't remove their parent tables.
*/
- dma_pte_free_pagetable(domain, iov_pfn, end_pfn);
+ dma_pte_free_pagetable(domain, iov_pfn, end_pfn,
+ largepage_lvl + 1);
} else {
pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE;
}
@@ -2358,13 +2357,33 @@ static inline int domain_pfn_mapping(struct dmar_domain *domain, unsigned long i
static void domain_context_clear_one(struct intel_iommu *iommu, u8 bus, u8 devfn)
{
+ unsigned long flags;
+ struct context_entry *context;
+ u16 did_old;
+
if (!iommu)
return;
- clear_context_table(iommu, bus, devfn);
- iommu->flush.flush_context(iommu, 0, 0, 0,
- DMA_CCMD_GLOBAL_INVL);
- iommu->flush.flush_iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH);
+ spin_lock_irqsave(&iommu->lock, flags);
+ context = iommu_context_addr(iommu, bus, devfn, 0);
+ if (!context) {
+ spin_unlock_irqrestore(&iommu->lock, flags);
+ return;
+ }
+ did_old = context_domain_id(context);
+ context_clear_entry(context);
+ __iommu_flush_cache(iommu, context, sizeof(*context));
+ spin_unlock_irqrestore(&iommu->lock, flags);
+ iommu->flush.flush_context(iommu,
+ did_old,
+ (((u16)bus) << 8) | devfn,
+ DMA_CCMD_MASK_NOBIT,
+ DMA_CCMD_DEVICE_INVL);
+ iommu->flush.flush_iotlb(iommu,
+ did_old,
+ 0,
+ 0,
+ DMA_TLB_DSI_FLUSH);
}
static inline void unlink_domain_info(struct device_domain_info *info)
@@ -3213,7 +3232,7 @@ static int __init init_dmars(void)
bool copied_tables = false;
struct device *dev;
struct intel_iommu *iommu;
- int i, ret, cpu;
+ int i, ret;
/*
* for each drhd
@@ -3246,22 +3265,6 @@ static int __init init_dmars(void)
goto error;
}
- for_each_possible_cpu(cpu) {
- struct deferred_flush_data *dfd = per_cpu_ptr(&deferred_flush,
- cpu);
-
- dfd->tables = kzalloc(g_num_of_iommus *
- sizeof(struct deferred_flush_table),
- GFP_KERNEL);
- if (!dfd->tables) {
- ret = -ENOMEM;
- goto free_g_iommus;
- }
-
- spin_lock_init(&dfd->lock);
- setup_timer(&dfd->timer, flush_unmaps_timeout, cpu);
- }
-
for_each_active_iommu(iommu, drhd) {
g_iommus[iommu->seq_id] = iommu;
@@ -3444,10 +3447,9 @@ free_iommu:
disable_dmar_iommu(iommu);
free_dmar_iommu(iommu);
}
-free_g_iommus:
- for_each_possible_cpu(cpu)
- kfree(per_cpu_ptr(&deferred_flush, cpu)->tables);
+
kfree(g_iommus);
+
error:
return ret;
}
@@ -3652,110 +3654,6 @@ static dma_addr_t intel_map_page(struct device *dev, struct page *page,
dir, *dev->dma_mask);
}
-static void flush_unmaps(struct deferred_flush_data *flush_data)
-{
- int i, j;
-
- flush_data->timer_on = 0;
-
- /* just flush them all */
- for (i = 0; i < g_num_of_iommus; i++) {
- struct intel_iommu *iommu = g_iommus[i];
- struct deferred_flush_table *flush_table =
- &flush_data->tables[i];
- if (!iommu)
- continue;
-
- if (!flush_table->next)
- continue;
-
- /* In caching mode, global flushes turn emulation expensive */
- if (!cap_caching_mode(iommu->cap))
- iommu->flush.flush_iotlb(iommu, 0, 0, 0,
- DMA_TLB_GLOBAL_FLUSH);
- for (j = 0; j < flush_table->next; j++) {
- unsigned long mask;
- struct deferred_flush_entry *entry =
- &flush_table->entries[j];
- unsigned long iova_pfn = entry->iova_pfn;
- unsigned long nrpages = entry->nrpages;
- struct dmar_domain *domain = entry->domain;
- struct page *freelist = entry->freelist;
-
- /* On real hardware multiple invalidations are expensive */
- if (cap_caching_mode(iommu->cap))
- iommu_flush_iotlb_psi(iommu, domain,
- mm_to_dma_pfn(iova_pfn),
- nrpages, !freelist, 0);
- else {
- mask = ilog2(nrpages);
- iommu_flush_dev_iotlb(domain,
- (uint64_t)iova_pfn << PAGE_SHIFT, mask);
- }
- free_iova_fast(&domain->iovad, iova_pfn, nrpages);
- if (freelist)
- dma_free_pagelist(freelist);
- }
- flush_table->next = 0;
- }
-
- flush_data->size = 0;
-}
-
-static void flush_unmaps_timeout(unsigned long cpuid)
-{
- struct deferred_flush_data *flush_data = per_cpu_ptr(&deferred_flush, cpuid);
- unsigned long flags;
-
- spin_lock_irqsave(&flush_data->lock, flags);
- flush_unmaps(flush_data);
- spin_unlock_irqrestore(&flush_data->lock, flags);
-}
-
-static void add_unmap(struct dmar_domain *dom, unsigned long iova_pfn,
- unsigned long nrpages, struct page *freelist)
-{
- unsigned long flags;
- int entry_id, iommu_id;
- struct intel_iommu *iommu;
- struct deferred_flush_entry *entry;
- struct deferred_flush_data *flush_data;
-
- flush_data = raw_cpu_ptr(&deferred_flush);
-
- /* Flush all CPUs' entries to avoid deferring too much. If
- * this becomes a bottleneck, can just flush us, and rely on
- * flush timer for the rest.
- */
- if (flush_data->size == HIGH_WATER_MARK) {
- int cpu;
-
- for_each_online_cpu(cpu)
- flush_unmaps_timeout(cpu);
- }
-
- spin_lock_irqsave(&flush_data->lock, flags);
-
- iommu = domain_get_iommu(dom);
- iommu_id = iommu->seq_id;
-
- entry_id = flush_data->tables[iommu_id].next;
- ++(flush_data->tables[iommu_id].next);
-
- entry = &flush_data->tables[iommu_id].entries[entry_id];
- entry->domain = dom;
- entry->iova_pfn = iova_pfn;
- entry->nrpages = nrpages;
- entry->freelist = freelist;
-
- if (!flush_data->timer_on) {
- mod_timer(&flush_data->timer, jiffies + msecs_to_jiffies(10));
- flush_data->timer_on = 1;
- }
- flush_data->size++;
- spin_unlock_irqrestore(&flush_data->lock, flags);
-}
-
static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
{
struct dmar_domain *domain;
@@ -3791,7 +3689,8 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size)
free_iova_fast(&domain->iovad, iova_pfn, dma_to_mm_pfn(nrpages));
dma_free_pagelist(freelist);
} else {
- add_unmap(domain, iova_pfn, nrpages, freelist);
+ queue_iova(&domain->iovad, iova_pfn, nrpages,
+ (unsigned long)freelist);
/*
* queue up the release of the unmap to save the 1/6th of the
* cpu used up by the iotlb flush operation...
@@ -3945,7 +3844,8 @@ static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nele
ret = domain_sg_mapping(domain, start_vpfn, sglist, size, prot);
if (unlikely(ret)) {
dma_pte_free_pagetable(domain, start_vpfn,
- start_vpfn + size - 1);
+ start_vpfn + size - 1,
+ agaw_to_level(domain->agaw) + 1);
free_iova_fast(&domain->iovad, iova_pfn, dma_to_mm_pfn(size));
return 0;
}
@@ -4728,7 +4628,6 @@ static void free_all_cpu_cached_iovas(unsigned int cpu)
static int intel_iommu_cpu_dead(unsigned int cpu)
{
free_all_cpu_cached_iovas(cpu);
- flush_unmaps_timeout(cpu);
return 0;
}
@@ -5350,7 +5249,8 @@ int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_dev *sd
sdev->sid = PCI_DEVID(info->bus, info->devfn);
if (!(ctx_lo & CONTEXT_PASIDE)) {
- context[1].hi = (u64)virt_to_phys(iommu->pasid_state_table);
+ if (iommu->pasid_state_table)
+ context[1].hi = (u64)virt_to_phys(iommu->pasid_state_table);
context[1].lo = (u64)virt_to_phys(iommu->pasid_table) |
intel_iommu_get_pts(iommu);
diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
index f620dccec8ee..f6697e55c2d4 100644
--- a/drivers/iommu/intel-svm.c
+++ b/drivers/iommu/intel-svm.c
@@ -24,6 +24,7 @@
#include <linux/pci-ats.h>
#include <linux/dmar.h>
#include <linux/interrupt.h>
+#include <asm/page.h>
static irqreturn_t prq_event_thread(int irq, void *d);
@@ -546,6 +547,14 @@ static bool access_error(struct vm_area_struct *vma, struct page_req_dsc *req)
return (requested & ~vma->vm_flags) != 0;
}
+static bool is_canonical_address(u64 addr)
+{
+ int shift = 64 - (__VIRTUAL_MASK_SHIFT + 1);
+ long saddr = (long) addr;
+
+ return (((saddr << shift) >> shift) == saddr);
+}
+
static irqreturn_t prq_event_thread(int irq, void *d)
{
struct intel_iommu *iommu = d;
@@ -603,6 +612,11 @@ static irqreturn_t prq_event_thread(int irq, void *d)
/* If the mm is already defunct, don't handle faults. */
if (!mmget_not_zero(svm->mm))
goto bad_req;
+
+ /* If address is not canonical, return invalid response */
+ if (!is_canonical_address(address))
+ goto bad_req;
+
down_read(&svm->mm->mmap_sem);
vma = find_extend_vma(svm->mm, address);
if (!vma || address < vma->vm_start)
diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c
index d665d0dc16e8..6961fc393f0b 100644
--- a/drivers/iommu/io-pgtable-arm-v7s.c
+++ b/drivers/iommu/io-pgtable-arm-v7s.c
@@ -245,7 +245,7 @@ static void __arm_v7s_free_table(void *table, int lvl,
static void __arm_v7s_pte_sync(arm_v7s_iopte *ptep, int num_entries,
struct io_pgtable_cfg *cfg)
{
- if (!(cfg->quirks & IO_PGTABLE_QUIRK_NO_DMA))
+ if (cfg->quirks & IO_PGTABLE_QUIRK_NO_DMA)
return;
dma_sync_single_for_device(cfg->iommu_dev, __arm_v7s_dma_addr(ptep),
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 3f6ea160afed..3de5c0bcb5cc 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -527,6 +527,8 @@ static int iommu_group_create_direct_mappings(struct iommu_group *group,
}
+ iommu_flush_tlb_all(domain);
+
out:
iommu_put_resv_regions(dev, &mappings);
@@ -1005,11 +1007,10 @@ struct iommu_group *iommu_group_get_for_dev(struct device *dev)
if (group)
return group;
- group = ERR_PTR(-EINVAL);
-
- if (ops && ops->device_group)
- group = ops->device_group(dev);
+ if (!ops)
+ return ERR_PTR(-EINVAL);
+ group = ops->device_group(dev);
if (WARN_ON_ONCE(group == NULL))
return ERR_PTR(-EINVAL);
@@ -1283,6 +1284,10 @@ static int __iommu_attach_device(struct iommu_domain *domain,
struct device *dev)
{
int ret;
+ if ((domain->ops->is_attach_deferred != NULL) &&
+ domain->ops->is_attach_deferred(domain, dev))
+ return 0;
+
if (unlikely(domain->ops->attach_dev == NULL))
return -ENODEV;
@@ -1298,12 +1303,8 @@ int iommu_attach_device(struct iommu_domain *domain, struct device *dev)
int ret;
group = iommu_group_get(dev);
- /* FIXME: Remove this when groups a mandatory for iommu drivers */
- if (group == NULL)
- return __iommu_attach_device(domain, dev);
-
/*
- * We have a group - lock it to make sure the device-count doesn't
+ * Lock the group to make sure the device-count doesn't
* change while we are attaching
*/
mutex_lock(&group->mutex);
@@ -1324,6 +1325,10 @@ EXPORT_SYMBOL_GPL(iommu_attach_device);
static void __iommu_detach_device(struct iommu_domain *domain,
struct device *dev)
{
+ if ((domain->ops->is_attach_deferred != NULL) &&
+ domain->ops->is_attach_deferred(domain, dev))
+ return;
+
if (unlikely(domain->ops->detach_dev == NULL))
return;
@@ -1336,9 +1341,6 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev)
struct iommu_group *group;
group = iommu_group_get(dev);
- /* FIXME: Remove this when groups a mandatory for iommu drivers */
- if (group == NULL)
- return __iommu_detach_device(domain, dev);
mutex_lock(&group->mutex);
if (iommu_group_device_count(group) != 1) {
@@ -1360,8 +1362,7 @@ struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
struct iommu_group *group;
group = iommu_group_get(dev);
- /* FIXME: Remove this when groups a mandatory for iommu drivers */
- if (group == NULL)
+ if (!group)
return NULL;
domain = group->domain;
@@ -1556,13 +1557,16 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova,
}
EXPORT_SYMBOL_GPL(iommu_map);
-size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
+static size_t __iommu_unmap(struct iommu_domain *domain,
+ unsigned long iova, size_t size,
+ bool sync)
{
+ const struct iommu_ops *ops = domain->ops;
size_t unmapped_page, unmapped = 0;
- unsigned int min_pagesz;
unsigned long orig_iova = iova;
+ unsigned int min_pagesz;
- if (unlikely(domain->ops->unmap == NULL ||
+ if (unlikely(ops->unmap == NULL ||
domain->pgsize_bitmap == 0UL))
return -ENODEV;
@@ -1592,10 +1596,13 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
while (unmapped < size) {
size_t pgsize = iommu_pgsize(domain, iova, size - unmapped);
- unmapped_page = domain->ops->unmap(domain, iova, pgsize);
+ unmapped_page = ops->unmap(domain, iova, pgsize);
if (!unmapped_page)
break;
+ if (sync && ops->iotlb_range_add)
+ ops->iotlb_range_add(domain, iova, pgsize);
+
pr_debug("unmapped: iova 0x%lx size 0x%zx\n",
iova, unmapped_page);
@@ -1603,11 +1610,27 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
unmapped += unmapped_page;
}
+ if (sync && ops->iotlb_sync)
+ ops->iotlb_sync(domain);
+
trace_unmap(orig_iova, size, unmapped);
return unmapped;
}
+
+size_t iommu_unmap(struct iommu_domain *domain,
+ unsigned long iova, size_t size)
+{
+ return __iommu_unmap(domain, iova, size, true);
+}
EXPORT_SYMBOL_GPL(iommu_unmap);
+size_t iommu_unmap_fast(struct iommu_domain *domain,
+ unsigned long iova, size_t size)
+{
+ return __iommu_unmap(domain, iova, size, false);
+}
+EXPORT_SYMBOL_GPL(iommu_unmap_fast);
+
size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
struct scatterlist *sg, unsigned int nents, int prot)
{
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
index 246f14c83944..33edfa794ae9 100644
--- a/drivers/iommu/iova.c
+++ b/drivers/iommu/iova.c
@@ -32,6 +32,8 @@ static unsigned long iova_rcache_get(struct iova_domain *iovad,
unsigned long limit_pfn);
static void init_iova_rcaches(struct iova_domain *iovad);
static void free_iova_rcaches(struct iova_domain *iovad);
+static void fq_destroy_all_entries(struct iova_domain *iovad);
+static void fq_flush_timeout(unsigned long data);
void
init_iova_domain(struct iova_domain *iovad, unsigned long granule,
@@ -50,10 +52,61 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule,
iovad->granule = granule;
iovad->start_pfn = start_pfn;
iovad->dma_32bit_pfn = pfn_32bit + 1;
+ iovad->flush_cb = NULL;
+ iovad->fq = NULL;
init_iova_rcaches(iovad);
}
EXPORT_SYMBOL_GPL(init_iova_domain);
+static void free_iova_flush_queue(struct iova_domain *iovad)
+{
+ if (!iovad->fq)
+ return;
+
+ if (timer_pending(&iovad->fq_timer))
+ del_timer(&iovad->fq_timer);
+
+ fq_destroy_all_entries(iovad);
+
+ free_percpu(iovad->fq);
+
+ iovad->fq = NULL;
+ iovad->flush_cb = NULL;
+ iovad->entry_dtor = NULL;
+}
+
+int init_iova_flush_queue(struct iova_domain *iovad,
+ iova_flush_cb flush_cb, iova_entry_dtor entry_dtor)
+{
+ int cpu;
+
+ atomic64_set(&iovad->fq_flush_start_cnt, 0);
+ atomic64_set(&iovad->fq_flush_finish_cnt, 0);
+
+ iovad->fq = alloc_percpu(struct iova_fq);
+ if (!iovad->fq)
+ return -ENOMEM;
+
+ iovad->flush_cb = flush_cb;
+ iovad->entry_dtor = entry_dtor;
+
+ for_each_possible_cpu(cpu) {
+ struct iova_fq *fq;
+
+ fq = per_cpu_ptr(iovad->fq, cpu);
+ fq->head = 0;
+ fq->tail = 0;
+
+ spin_lock_init(&fq->lock);
+ }
+
+ setup_timer(&iovad->fq_timer, fq_flush_timeout, (unsigned long)iovad);
+ atomic_set(&iovad->fq_timer_on, 0);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(init_iova_flush_queue);
+
static struct rb_node *
__get_cached_rbnode(struct iova_domain *iovad, unsigned long *limit_pfn)
{
@@ -423,6 +476,135 @@ free_iova_fast(struct iova_domain *iovad, unsigned long pfn, unsigned long size)
}
EXPORT_SYMBOL_GPL(free_iova_fast);
+#define fq_ring_for_each(i, fq) \
+ for ((i) = (fq)->head; (i) != (fq)->tail; (i) = ((i) + 1) % IOVA_FQ_SIZE)
+
+static inline bool fq_full(struct iova_fq *fq)
+{
+ assert_spin_locked(&fq->lock);
+ return (((fq->tail + 1) % IOVA_FQ_SIZE) == fq->head);
+}
+
+static inline unsigned fq_ring_add(struct iova_fq *fq)
+{
+ unsigned idx = fq->tail;
+
+ assert_spin_locked(&fq->lock);
+
+ fq->tail = (idx + 1) % IOVA_FQ_SIZE;
+
+ return idx;
+}
+
+static void fq_ring_free(struct iova_domain *iovad, struct iova_fq *fq)
+{
+ u64 counter = atomic64_read(&iovad->fq_flush_finish_cnt);
+ unsigned idx;
+
+ assert_spin_locked(&fq->lock);
+
+ fq_ring_for_each(idx, fq) {
+
+ if (fq->entries[idx].counter >= counter)
+ break;
+
+ if (iovad->entry_dtor)
+ iovad->entry_dtor(fq->entries[idx].data);
+
+ free_iova_fast(iovad,
+ fq->entries[idx].iova_pfn,
+ fq->entries[idx].pages);
+
+ fq->head = (fq->head + 1) % IOVA_FQ_SIZE;
+ }
+}
+
+static void iova_domain_flush(struct iova_domain *iovad)
+{
+ atomic64_inc(&iovad->fq_flush_start_cnt);
+ iovad->flush_cb(iovad);
+ atomic64_inc(&iovad->fq_flush_finish_cnt);
+}
+
+static void fq_destroy_all_entries(struct iova_domain *iovad)
+{
+ int cpu;
+
+ /*
+ * This code runs when the iova_domain is being detroyed, so don't
+ * bother to free iovas, just call the entry_dtor on all remaining
+ * entries.
+ */
+ if (!iovad->entry_dtor)
+ return;
+
+ for_each_possible_cpu(cpu) {
+ struct iova_fq *fq = per_cpu_ptr(iovad->fq, cpu);
+ int idx;
+
+ fq_ring_for_each(idx, fq)
+ iovad->entry_dtor(fq->entries[idx].data);
+ }
+}
+
+static void fq_flush_timeout(unsigned long data)
+{
+ struct iova_domain *iovad = (struct iova_domain *)data;
+ int cpu;
+
+ atomic_set(&iovad->fq_timer_on, 0);
+ iova_domain_flush(iovad);
+
+ for_each_possible_cpu(cpu) {
+ unsigned long flags;
+ struct iova_fq *fq;
+
+ fq = per_cpu_ptr(iovad->fq, cpu);
+ spin_lock_irqsave(&fq->lock, flags);
+ fq_ring_free(iovad, fq);
+ spin_unlock_irqrestore(&fq->lock, flags);
+ }
+}
+
+void queue_iova(struct iova_domain *iovad,
+ unsigned long pfn, unsigned long pages,
+ unsigned long data)
+{
+ struct iova_fq *fq = get_cpu_ptr(iovad->fq);
+ unsigned long flags;
+ unsigned idx;
+
+ spin_lock_irqsave(&fq->lock, flags);
+
+ /*
+ * First remove all entries from the flush queue that have already been
+ * flushed out on another CPU. This makes the fq_full() check below less
+ * likely to be true.
+ */
+ fq_ring_free(iovad, fq);
+
+ if (fq_full(fq)) {
+ iova_domain_flush(iovad);
+ fq_ring_free(iovad, fq);
+ }
+
+ idx = fq_ring_add(fq);
+
+ fq->entries[idx].iova_pfn = pfn;
+ fq->entries[idx].pages = pages;
+ fq->entries[idx].data = data;
+ fq->entries[idx].counter = atomic64_read(&iovad->fq_flush_start_cnt);
+
+ spin_unlock_irqrestore(&fq->lock, flags);
+
+ if (atomic_cmpxchg(&iovad->fq_timer_on, 0, 1) == 0)
+ mod_timer(&iovad->fq_timer,
+ jiffies + msecs_to_jiffies(IOVA_FQ_TIMEOUT));
+
+ put_cpu_ptr(iovad->fq);
+}
+EXPORT_SYMBOL_GPL(queue_iova);
+
/**
* put_iova_domain - destroys the iova doamin
* @iovad: - iova domain in question.
@@ -433,6 +615,7 @@ void put_iova_domain(struct iova_domain *iovad)
struct rb_node *node;
unsigned long flags;
+ free_iova_flush_queue(iovad);
free_iova_rcaches(iovad);
spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
node = rb_first(&iovad->rbroot);
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index 2a38aa15be17..195d6e93ac71 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -19,6 +19,7 @@
#include <linux/iommu.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/sizes.h>
#include <linux/slab.h>
@@ -35,7 +36,7 @@
struct ipmmu_vmsa_device {
struct device *dev;
void __iomem *base;
- struct list_head list;
+ struct iommu_device iommu;
unsigned int num_utlbs;
spinlock_t lock; /* Protects ctx and domains[] */
@@ -58,36 +59,18 @@ struct ipmmu_vmsa_domain {
struct ipmmu_vmsa_iommu_priv {
struct ipmmu_vmsa_device *mmu;
- unsigned int *utlbs;
- unsigned int num_utlbs;
struct device *dev;
struct list_head list;
};
-static DEFINE_SPINLOCK(ipmmu_devices_lock);
-static LIST_HEAD(ipmmu_devices);
-
static struct ipmmu_vmsa_domain *to_vmsa_domain(struct iommu_domain *dom)
{
return container_of(dom, struct ipmmu_vmsa_domain, io_domain);
}
-
static struct ipmmu_vmsa_iommu_priv *to_priv(struct device *dev)
{
-#if defined(CONFIG_ARM)
- return dev->archdata.iommu;
-#else
- return dev->iommu_fwspec->iommu_priv;
-#endif
-}
-static void set_priv(struct device *dev, struct ipmmu_vmsa_iommu_priv *p)
-{
-#if defined(CONFIG_ARM)
- dev->archdata.iommu = p;
-#else
- dev->iommu_fwspec->iommu_priv = p;
-#endif
+ return dev->iommu_fwspec ? dev->iommu_fwspec->iommu_priv : NULL;
}
#define TLB_LOOP_TIMEOUT 100 /* 100us */
@@ -312,7 +295,7 @@ static void ipmmu_tlb_add_flush(unsigned long iova, size_t size,
/* The hardware doesn't support selective TLB flush. */
}
-static struct iommu_gather_ops ipmmu_gather_ops = {
+static const struct iommu_gather_ops ipmmu_gather_ops = {
.tlb_flush_all = ipmmu_tlb_flush_all,
.tlb_add_flush = ipmmu_tlb_add_flush,
.tlb_sync = ipmmu_tlb_flush_all,
@@ -341,6 +324,19 @@ static int ipmmu_domain_allocate_context(struct ipmmu_vmsa_device *mmu,
return ret;
}
+static void ipmmu_domain_free_context(struct ipmmu_vmsa_device *mmu,
+ unsigned int context_id)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&mmu->lock, flags);
+
+ clear_bit(context_id, mmu->ctx);
+ mmu->domains[context_id] = NULL;
+
+ spin_unlock_irqrestore(&mmu->lock, flags);
+}
+
static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
{
u64 ttbr;
@@ -370,22 +366,22 @@ static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
*/
domain->cfg.iommu_dev = domain->mmu->dev;
- domain->iop = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &domain->cfg,
- domain);
- if (!domain->iop)
- return -EINVAL;
-
/*
* Find an unused context.
*/
ret = ipmmu_domain_allocate_context(domain->mmu, domain);
- if (ret == IPMMU_CTX_MAX) {
- free_io_pgtable_ops(domain->iop);
+ if (ret == IPMMU_CTX_MAX)
return -EBUSY;
- }
domain->context_id = ret;
+ domain->iop = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &domain->cfg,
+ domain);
+ if (!domain->iop) {
+ ipmmu_domain_free_context(domain->mmu, domain->context_id);
+ return -EINVAL;
+ }
+
/* TTBR0 */
ttbr = domain->cfg.arm_lpae_s1_cfg.ttbr[0];
ipmmu_ctx_write(domain, IMTTLBR0, ttbr);
@@ -426,19 +422,6 @@ static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
return 0;
}
-static void ipmmu_domain_free_context(struct ipmmu_vmsa_device *mmu,
- unsigned int context_id)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&mmu->lock, flags);
-
- clear_bit(context_id, mmu->ctx);
- mmu->domains[context_id] = NULL;
-
- spin_unlock_irqrestore(&mmu->lock, flags);
-}
-
static void ipmmu_domain_destroy_context(struct ipmmu_vmsa_domain *domain)
{
/*
@@ -562,13 +545,14 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
struct device *dev)
{
struct ipmmu_vmsa_iommu_priv *priv = to_priv(dev);
+ struct iommu_fwspec *fwspec = dev->iommu_fwspec;
struct ipmmu_vmsa_device *mmu = priv->mmu;
struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
unsigned long flags;
unsigned int i;
int ret = 0;
- if (!mmu) {
+ if (!priv || !priv->mmu) {
dev_err(dev, "Cannot attach to IPMMU\n");
return -ENXIO;
}
@@ -595,8 +579,8 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
if (ret < 0)
return ret;
- for (i = 0; i < priv->num_utlbs; ++i)
- ipmmu_utlb_enable(domain, priv->utlbs[i]);
+ for (i = 0; i < fwspec->num_ids; ++i)
+ ipmmu_utlb_enable(domain, fwspec->ids[i]);
return 0;
}
@@ -604,12 +588,12 @@ static int ipmmu_attach_device(struct iommu_domain *io_domain,
static void ipmmu_detach_device(struct iommu_domain *io_domain,
struct device *dev)
{
- struct ipmmu_vmsa_iommu_priv *priv = to_priv(dev);
+ struct iommu_fwspec *fwspec = dev->iommu_fwspec;
struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
unsigned int i;
- for (i = 0; i < priv->num_utlbs; ++i)
- ipmmu_utlb_disable(domain, priv->utlbs[i]);
+ for (i = 0; i < fwspec->num_ids; ++i)
+ ipmmu_utlb_disable(domain, fwspec->ids[i]);
/*
* TODO: Optimize by disabling the context when no device is attached.
@@ -645,92 +629,36 @@ static phys_addr_t ipmmu_iova_to_phys(struct iommu_domain *io_domain,
return domain->iop->iova_to_phys(domain->iop, iova);
}
-static int ipmmu_find_utlbs(struct ipmmu_vmsa_device *mmu, struct device *dev,
- unsigned int *utlbs, unsigned int num_utlbs)
-{
- unsigned int i;
-
- for (i = 0; i < num_utlbs; ++i) {
- struct of_phandle_args args;
- int ret;
-
- ret = of_parse_phandle_with_args(dev->of_node, "iommus",
- "#iommu-cells", i, &args);
- if (ret < 0)
- return ret;
-
- of_node_put(args.np);
-
- if (args.np != mmu->dev->of_node || args.args_count != 1)
- return -EINVAL;
-
- utlbs[i] = args.args[0];
- }
-
- return 0;
-}
-
-static int ipmmu_init_platform_device(struct device *dev)
+static int ipmmu_init_platform_device(struct device *dev,
+ struct of_phandle_args *args)
{
+ struct platform_device *ipmmu_pdev;
struct ipmmu_vmsa_iommu_priv *priv;
- struct ipmmu_vmsa_device *mmu;
- unsigned int *utlbs;
- unsigned int i;
- int num_utlbs;
- int ret = -ENODEV;
-
- /* Find the master corresponding to the device. */
- num_utlbs = of_count_phandle_with_args(dev->of_node, "iommus",
- "#iommu-cells");
- if (num_utlbs < 0)
+ ipmmu_pdev = of_find_device_by_node(args->np);
+ if (!ipmmu_pdev)
return -ENODEV;
- utlbs = kcalloc(num_utlbs, sizeof(*utlbs), GFP_KERNEL);
- if (!utlbs)
- return -ENOMEM;
-
- spin_lock(&ipmmu_devices_lock);
-
- list_for_each_entry(mmu, &ipmmu_devices, list) {
- ret = ipmmu_find_utlbs(mmu, dev, utlbs, num_utlbs);
- if (!ret) {
- /*
- * TODO Take a reference to the MMU to protect
- * against device removal.
- */
- break;
- }
- }
-
- spin_unlock(&ipmmu_devices_lock);
-
- if (ret < 0)
- goto error;
-
- for (i = 0; i < num_utlbs; ++i) {
- if (utlbs[i] >= mmu->num_utlbs) {
- ret = -EINVAL;
- goto error;
- }
- }
-
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
- if (!priv) {
- ret = -ENOMEM;
- goto error;
- }
+ if (!priv)
+ return -ENOMEM;
- priv->mmu = mmu;
- priv->utlbs = utlbs;
- priv->num_utlbs = num_utlbs;
+ priv->mmu = platform_get_drvdata(ipmmu_pdev);
priv->dev = dev;
- set_priv(dev, priv);
+ dev->iommu_fwspec->iommu_priv = priv;
return 0;
+}
-error:
- kfree(utlbs);
- return ret;
+static int ipmmu_of_xlate(struct device *dev,
+ struct of_phandle_args *spec)
+{
+ iommu_fwspec_add_ids(dev, spec->args, 1);
+
+ /* Initialize once - xlate() will call multiple times */
+ if (to_priv(dev))
+ return 0;
+
+ return ipmmu_init_platform_device(dev, spec);
}
#if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA)
@@ -749,11 +677,11 @@ static int ipmmu_add_device(struct device *dev)
struct iommu_group *group;
int ret;
- if (to_priv(dev)) {
- dev_warn(dev, "IOMMU driver already assigned to device %s\n",
- dev_name(dev));
- return -EINVAL;
- }
+ /*
+ * Only let through devices that have been verified in xlate()
+ */
+ if (!to_priv(dev))
+ return -ENODEV;
/* Create a device group and add the device to it. */
group = iommu_group_alloc();
@@ -772,10 +700,6 @@ static int ipmmu_add_device(struct device *dev)
goto error;
}
- ret = ipmmu_init_platform_device(dev);
- if (ret < 0)
- goto error;
-
/*
* Create the ARM mapping, used by the ARM DMA mapping core to allocate
* VAs. This will allocate a corresponding IOMMU domain.
@@ -816,24 +740,13 @@ error:
if (!IS_ERR_OR_NULL(group))
iommu_group_remove_device(dev);
- kfree(to_priv(dev)->utlbs);
- kfree(to_priv(dev));
- set_priv(dev, NULL);
-
return ret;
}
static void ipmmu_remove_device(struct device *dev)
{
- struct ipmmu_vmsa_iommu_priv *priv = to_priv(dev);
-
arm_iommu_detach_device(dev);
iommu_group_remove_device(dev);
-
- kfree(priv->utlbs);
- kfree(priv);
-
- set_priv(dev, NULL);
}
static const struct iommu_ops ipmmu_ops = {
@@ -848,6 +761,7 @@ static const struct iommu_ops ipmmu_ops = {
.add_device = ipmmu_add_device,
.remove_device = ipmmu_remove_device,
.pgsize_bitmap = SZ_1G | SZ_2M | SZ_4K,
+ .of_xlate = ipmmu_of_xlate,
};
#endif /* !CONFIG_ARM && CONFIG_IOMMU_DMA */
@@ -890,14 +804,12 @@ static void ipmmu_domain_free_dma(struct iommu_domain *io_domain)
static int ipmmu_add_device_dma(struct device *dev)
{
- struct iommu_fwspec *fwspec = dev->iommu_fwspec;
struct iommu_group *group;
/*
* Only let through devices that have been verified in xlate()
- * We may get called with dev->iommu_fwspec set to NULL.
*/
- if (!fwspec || !fwspec->iommu_priv)
+ if (!to_priv(dev))
return -ENODEV;
group = iommu_group_get_for_dev(dev);
@@ -957,19 +869,6 @@ static struct iommu_group *ipmmu_find_group_dma(struct device *dev)
return group;
}
-static int ipmmu_of_xlate_dma(struct device *dev,
- struct of_phandle_args *spec)
-{
- /* If the IPMMU device is disabled in DT then return error
- * to make sure the of_iommu code does not install ops
- * even though the iommu device is disabled
- */
- if (!of_device_is_available(spec->np))
- return -ENODEV;
-
- return ipmmu_init_platform_device(dev);
-}
-
static const struct iommu_ops ipmmu_ops = {
.domain_alloc = ipmmu_domain_alloc_dma,
.domain_free = ipmmu_domain_free_dma,
@@ -983,7 +882,7 @@ static const struct iommu_ops ipmmu_ops = {
.remove_device = ipmmu_remove_device_dma,
.device_group = ipmmu_find_group_dma,
.pgsize_bitmap = SZ_1G | SZ_2M | SZ_4K,
- .of_xlate = ipmmu_of_xlate_dma,
+ .of_xlate = ipmmu_of_xlate,
};
#endif /* CONFIG_IOMMU_DMA */
@@ -1054,16 +953,24 @@ static int ipmmu_probe(struct platform_device *pdev)
ipmmu_device_reset(mmu);
+ ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL,
+ dev_name(&pdev->dev));
+ if (ret)
+ return ret;
+
+ iommu_device_set_ops(&mmu->iommu, &ipmmu_ops);
+ iommu_device_set_fwnode(&mmu->iommu, &pdev->dev.of_node->fwnode);
+
+ ret = iommu_device_register(&mmu->iommu);
+ if (ret)
+ return ret;
+
/*
* We can't create the ARM mapping here as it requires the bus to have
* an IOMMU, which only happens when bus_set_iommu() is called in
* ipmmu_init() after the probe function returns.
*/
- spin_lock(&ipmmu_devices_lock);
- list_add(&mmu->list, &ipmmu_devices);
- spin_unlock(&ipmmu_devices_lock);
-
platform_set_drvdata(pdev, mmu);
return 0;
@@ -1073,9 +980,8 @@ static int ipmmu_remove(struct platform_device *pdev)
{
struct ipmmu_vmsa_device *mmu = platform_get_drvdata(pdev);
- spin_lock(&ipmmu_devices_lock);
- list_del(&mmu->list);
- spin_unlock(&ipmmu_devices_lock);
+ iommu_device_sysfs_remove(&mmu->iommu);
+ iommu_device_unregister(&mmu->iommu);
#if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA)
arm_iommu_release_mapping(mmu->mapping);
diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c
index d0448353d501..04f4d51ffacb 100644
--- a/drivers/iommu/msm_iommu.c
+++ b/drivers/iommu/msm_iommu.c
@@ -393,6 +393,7 @@ static struct msm_iommu_dev *find_iommu_for_dev(struct device *dev)
static int msm_iommu_add_device(struct device *dev)
{
struct msm_iommu_dev *iommu;
+ struct iommu_group *group;
unsigned long flags;
int ret = 0;
@@ -406,7 +407,16 @@ static int msm_iommu_add_device(struct device *dev)
spin_unlock_irqrestore(&msm_iommu_lock, flags);
- return ret;
+ if (ret)
+ return ret;
+
+ group = iommu_group_get_for_dev(dev);
+ if (IS_ERR(group))
+ return PTR_ERR(group);
+
+ iommu_group_put(group);
+
+ return 0;
}
static void msm_iommu_remove_device(struct device *dev)
@@ -421,6 +431,8 @@ static void msm_iommu_remove_device(struct device *dev)
iommu_device_unlink(&iommu->iommu, dev);
spin_unlock_irqrestore(&msm_iommu_lock, flags);
+
+ iommu_group_remove_device(dev);
}
static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
@@ -700,6 +712,7 @@ static struct iommu_ops msm_iommu_ops = {
.iova_to_phys = msm_iommu_iova_to_phys,
.add_device = msm_iommu_add_device,
.remove_device = msm_iommu_remove_device,
+ .device_group = generic_device_group,
.pgsize_bitmap = MSM_IOMMU_PGSIZES,
.of_xlate = qcom_iommu_of_xlate,
};
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
index 91c6d367ab35..16d33ac19db0 100644
--- a/drivers/iommu/mtk_iommu.c
+++ b/drivers/iommu/mtk_iommu.c
@@ -31,7 +31,6 @@
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <asm/barrier.h>
-#include <dt-bindings/memory/mt8173-larb-port.h>
#include <soc/mediatek/smi.h>
#include "mtk_iommu.h"
@@ -54,10 +53,16 @@
#define REG_MMU_CTRL_REG 0x110
#define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4)
-#define F_MMU_TF_PROTECT_SEL(prot) (((prot) & 0x3) << 5)
+#define F_MMU_TF_PROTECT_SEL_SHIFT(data) \
+ ((data)->m4u_plat == M4U_MT2712 ? 4 : 5)
+/* It's named by F_MMU_TF_PROT_SEL in mt2712. */
+#define F_MMU_TF_PROTECT_SEL(prot, data) \
+ (((prot) & 0x3) << F_MMU_TF_PROTECT_SEL_SHIFT(data))
#define REG_MMU_IVRP_PADDR 0x114
#define F_MMU_IVRP_PA_SET(pa, ext) (((pa) >> 1) | ((!!(ext)) << 31))
+#define REG_MMU_VLD_PA_RNG 0x118
+#define F_MMU_VLD_PA_RNG(EA, SA) (((EA) << 8) | (SA))
#define REG_MMU_INT_CONTROL0 0x120
#define F_L2_MULIT_HIT_EN BIT(0)
@@ -82,7 +87,6 @@
#define REG_MMU_FAULT_ST1 0x134
#define REG_MMU_FAULT_VA 0x13c
-#define F_MMU_FAULT_VA_MSK 0xfffff000
#define F_MMU_FAULT_VA_WRITE_BIT BIT(1)
#define F_MMU_FAULT_VA_LAYER_BIT BIT(0)
@@ -93,6 +97,13 @@
#define MTK_PROTECT_PA_ALIGN 128
+/*
+ * Get the local arbiter ID and the portid within the larb arbiter
+ * from mtk_m4u_id which is defined by MTK_M4U_ID.
+ */
+#define MTK_M4U_TO_LARB(id) (((id) >> 5) & 0xf)
+#define MTK_M4U_TO_PORT(id) ((id) & 0x1f)
+
struct mtk_iommu_domain {
spinlock_t pgtlock; /* lock for page table */
@@ -104,6 +115,27 @@ struct mtk_iommu_domain {
static struct iommu_ops mtk_iommu_ops;
+static LIST_HEAD(m4ulist); /* List all the M4U HWs */
+
+#define for_each_m4u(data) list_for_each_entry(data, &m4ulist, list)
+
+/*
+ * There may be 1 or 2 M4U HWs, But we always expect they are in the same domain
+ * for the performance.
+ *
+ * Here always return the mtk_iommu_data of the first probed M4U where the
+ * iommu domain information is recorded.
+ */
+static struct mtk_iommu_data *mtk_iommu_get_m4u_data(void)
+{
+ struct mtk_iommu_data *data;
+
+ for_each_m4u(data)
+ return data;
+
+ return NULL;
+}
+
static struct mtk_iommu_domain *to_mtk_domain(struct iommu_domain *dom)
{
return container_of(dom, struct mtk_iommu_domain, domain);
@@ -113,9 +145,12 @@ static void mtk_iommu_tlb_flush_all(void *cookie)
{
struct mtk_iommu_data *data = cookie;
- writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, data->base + REG_MMU_INV_SEL);
- writel_relaxed(F_ALL_INVLD, data->base + REG_MMU_INVALIDATE);
- wmb(); /* Make sure the tlb flush all done */
+ for_each_m4u(data) {
+ writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0,
+ data->base + REG_MMU_INV_SEL);
+ writel_relaxed(F_ALL_INVLD, data->base + REG_MMU_INVALIDATE);
+ wmb(); /* Make sure the tlb flush all done */
+ }
}
static void mtk_iommu_tlb_add_flush_nosync(unsigned long iova, size_t size,
@@ -124,12 +159,17 @@ static void mtk_iommu_tlb_add_flush_nosync(unsigned long iova, size_t size,
{
struct mtk_iommu_data *data = cookie;
- writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, data->base + REG_MMU_INV_SEL);
+ for_each_m4u(data) {
+ writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0,
+ data->base + REG_MMU_INV_SEL);
- writel_relaxed(iova, data->base + REG_MMU_INVLD_START_A);
- writel_relaxed(iova + size - 1, data->base + REG_MMU_INVLD_END_A);
- writel_relaxed(F_MMU_INV_RANGE, data->base + REG_MMU_INVALIDATE);
- data->tlb_flush_active = true;
+ writel_relaxed(iova, data->base + REG_MMU_INVLD_START_A);
+ writel_relaxed(iova + size - 1,
+ data->base + REG_MMU_INVLD_END_A);
+ writel_relaxed(F_MMU_INV_RANGE,
+ data->base + REG_MMU_INVALIDATE);
+ data->tlb_flush_active = true;
+ }
}
static void mtk_iommu_tlb_sync(void *cookie)
@@ -138,20 +178,22 @@ static void mtk_iommu_tlb_sync(void *cookie)
int ret;
u32 tmp;
- /* Avoid timing out if there's nothing to wait for */
- if (!data->tlb_flush_active)
- return;
+ for_each_m4u(data) {
+ /* Avoid timing out if there's nothing to wait for */
+ if (!data->tlb_flush_active)
+ return;
- ret = readl_poll_timeout_atomic(data->base + REG_MMU_CPE_DONE, tmp,
- tmp != 0, 10, 100000);
- if (ret) {
- dev_warn(data->dev,
- "Partial TLB flush timed out, falling back to full flush\n");
- mtk_iommu_tlb_flush_all(cookie);
+ ret = readl_poll_timeout_atomic(data->base + REG_MMU_CPE_DONE,
+ tmp, tmp != 0, 10, 100000);
+ if (ret) {
+ dev_warn(data->dev,
+ "Partial TLB flush timed out, falling back to full flush\n");
+ mtk_iommu_tlb_flush_all(cookie);
+ }
+ /* Clear the CPE status */
+ writel_relaxed(0, data->base + REG_MMU_CPE_DONE);
+ data->tlb_flush_active = false;
}
- /* Clear the CPE status */
- writel_relaxed(0, data->base + REG_MMU_CPE_DONE);
- data->tlb_flush_active = false;
}
static const struct iommu_gather_ops mtk_iommu_gather_ops = {
@@ -173,7 +215,6 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id)
fault_iova = readl_relaxed(data->base + REG_MMU_FAULT_VA);
layer = fault_iova & F_MMU_FAULT_VA_LAYER_BIT;
write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT;
- fault_iova &= F_MMU_FAULT_VA_MSK;
fault_pa = readl_relaxed(data->base + REG_MMU_INVLD_PA);
regval = readl_relaxed(data->base + REG_MMU_INT_ID);
fault_larb = F_MMU0_INT_ID_LARB_ID(regval);
@@ -221,9 +262,9 @@ static void mtk_iommu_config(struct mtk_iommu_data *data,
}
}
-static int mtk_iommu_domain_finalise(struct mtk_iommu_data *data)
+static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom)
{
- struct mtk_iommu_domain *dom = data->m4u_dom;
+ struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
spin_lock_init(&dom->pgtlock);
@@ -249,9 +290,6 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_data *data)
/* Update our support page sizes bitmap */
dom->domain.pgsize_bitmap = dom->cfg.pgsize_bitmap;
-
- writel(data->m4u_dom->cfg.arm_v7s_cfg.ttbr[0],
- data->base + REG_MMU_PT_BASE_ADDR);
return 0;
}
@@ -266,20 +304,30 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type)
if (!dom)
return NULL;
- if (iommu_get_dma_cookie(&dom->domain)) {
- kfree(dom);
- return NULL;
- }
+ if (iommu_get_dma_cookie(&dom->domain))
+ goto free_dom;
+
+ if (mtk_iommu_domain_finalise(dom))
+ goto put_dma_cookie;
dom->domain.geometry.aperture_start = 0;
dom->domain.geometry.aperture_end = DMA_BIT_MASK(32);
dom->domain.geometry.force_aperture = true;
return &dom->domain;
+
+put_dma_cookie:
+ iommu_put_dma_cookie(&dom->domain);
+free_dom:
+ kfree(dom);
+ return NULL;
}
static void mtk_iommu_domain_free(struct iommu_domain *domain)
{
+ struct mtk_iommu_domain *dom = to_mtk_domain(domain);
+
+ free_io_pgtable_ops(dom->iop);
iommu_put_dma_cookie(domain);
kfree(to_mtk_domain(domain));
}
@@ -289,22 +337,15 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain,
{
struct mtk_iommu_domain *dom = to_mtk_domain(domain);
struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv;
- int ret;
if (!data)
return -ENODEV;
+ /* Update the pgtable base address register of the M4U HW */
if (!data->m4u_dom) {
data->m4u_dom = dom;
- ret = mtk_iommu_domain_finalise(data);
- if (ret) {
- data->m4u_dom = NULL;
- return ret;
- }
- } else if (data->m4u_dom != dom) {
- /* All the client devices should be in the same m4u domain */
- dev_err(dev, "try to attach into the error iommu domain\n");
- return -EPERM;
+ writel(dom->cfg.arm_v7s_cfg.ttbr[0],
+ data->base + REG_MMU_PT_BASE_ADDR);
}
mtk_iommu_config(data, dev, true);
@@ -330,7 +371,8 @@ static int mtk_iommu_map(struct iommu_domain *domain, unsigned long iova,
int ret;
spin_lock_irqsave(&dom->pgtlock, flags);
- ret = dom->iop->map(dom->iop, iova, paddr, size, prot);
+ ret = dom->iop->map(dom->iop, iova, paddr & DMA_BIT_MASK(32),
+ size, prot);
spin_unlock_irqrestore(&dom->pgtlock, flags);
return ret;
@@ -354,6 +396,7 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
dma_addr_t iova)
{
struct mtk_iommu_domain *dom = to_mtk_domain(domain);
+ struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
unsigned long flags;
phys_addr_t pa;
@@ -361,6 +404,9 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
pa = dom->iop->iova_to_phys(dom->iop, iova);
spin_unlock_irqrestore(&dom->pgtlock, flags);
+ if (data->enable_4GB)
+ pa |= BIT_ULL(32);
+
return pa;
}
@@ -399,7 +445,7 @@ static void mtk_iommu_remove_device(struct device *dev)
static struct iommu_group *mtk_iommu_device_group(struct device *dev)
{
- struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv;
+ struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
if (!data)
return ERR_PTR(-ENODEV);
@@ -464,8 +510,9 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data)
return ret;
}
- regval = F_MMU_PREFETCH_RT_REPLACE_MOD |
- F_MMU_TF_PROTECT_SEL(2);
+ regval = F_MMU_TF_PROTECT_SEL(2, data);
+ if (data->m4u_plat == M4U_MT8173)
+ regval |= F_MMU_PREFETCH_RT_REPLACE_MOD;
writel_relaxed(regval, data->base + REG_MMU_CTRL_REG);
regval = F_L2_MULIT_HIT_EN |
@@ -487,9 +534,19 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data)
writel_relaxed(F_MMU_IVRP_PA_SET(data->protect_base, data->enable_4GB),
data->base + REG_MMU_IVRP_PADDR);
-
+ if (data->enable_4GB && data->m4u_plat != M4U_MT8173) {
+ /*
+ * If 4GB mode is enabled, the validate PA range is from
+ * 0x1_0000_0000 to 0x1_ffff_ffff. here record bit[32:30].
+ */
+ regval = F_MMU_VLD_PA_RNG(7, 4);
+ writel_relaxed(regval, data->base + REG_MMU_VLD_PA_RNG);
+ }
writel_relaxed(0, data->base + REG_MMU_DCM_DIS);
- writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE);
+
+ /* It's MISC control register whose default value is ok except mt8173.*/
+ if (data->m4u_plat == M4U_MT8173)
+ writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE);
if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0,
dev_name(data->dev), (void *)data)) {
@@ -521,6 +578,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
if (!data)
return -ENOMEM;
data->dev = dev;
+ data->m4u_plat = (enum mtk_iommu_plat)of_device_get_match_data(dev);
/* Protect memory. HW will access here while translation fault.*/
protect = devm_kzalloc(dev, MTK_PROTECT_PA_ALIGN * 2, GFP_KERNEL);
@@ -529,7 +587,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
data->protect_base = ALIGN(virt_to_phys(protect), MTK_PROTECT_PA_ALIGN);
/* Whether the current dram is over 4GB */
- data->enable_4GB = !!(max_pfn > (0xffffffffUL >> PAGE_SHIFT));
+ data->enable_4GB = !!(max_pfn > (BIT_ULL(32) >> PAGE_SHIFT));
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
data->base = devm_ioremap_resource(dev, res);
@@ -554,6 +612,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
for (i = 0; i < larb_nr; i++) {
struct device_node *larbnode;
struct platform_device *plarbdev;
+ u32 id;
larbnode = of_parse_phandle(dev->of_node, "mediatek,larbs", i);
if (!larbnode)
@@ -562,17 +621,14 @@ static int mtk_iommu_probe(struct platform_device *pdev)
if (!of_device_is_available(larbnode))
continue;
+ ret = of_property_read_u32(larbnode, "mediatek,larb-id", &id);
+ if (ret)/* The id is consecutive if there is no this property */
+ id = i;
+
plarbdev = of_find_device_by_node(larbnode);
- if (!plarbdev) {
- plarbdev = of_platform_device_create(
- larbnode, NULL,
- platform_bus_type.dev_root);
- if (!plarbdev) {
- of_node_put(larbnode);
- return -EPROBE_DEFER;
- }
- }
- data->smi_imu.larb_imu[i].dev = &plarbdev->dev;
+ if (!plarbdev)
+ return -EPROBE_DEFER;
+ data->smi_imu.larb_imu[id].dev = &plarbdev->dev;
component_match_add_release(dev, &match, release_of,
compare_of, larbnode);
@@ -596,6 +652,8 @@ static int mtk_iommu_probe(struct platform_device *pdev)
if (ret)
return ret;
+ list_add_tail(&data->list, &m4ulist);
+
if (!iommu_present(&platform_bus_type))
bus_set_iommu(&platform_bus_type, &mtk_iommu_ops);
@@ -612,7 +670,6 @@ static int mtk_iommu_remove(struct platform_device *pdev)
if (iommu_present(&platform_bus_type))
bus_set_iommu(&platform_bus_type, NULL);
- free_io_pgtable_ops(data->m4u_dom->iop);
clk_disable_unprepare(data->bclk);
devm_free_irq(&pdev->dev, data->irq, data);
component_master_del(&pdev->dev, &mtk_iommu_com_ops);
@@ -631,6 +688,7 @@ static int __maybe_unused mtk_iommu_suspend(struct device *dev)
reg->ctrl_reg = readl_relaxed(base + REG_MMU_CTRL_REG);
reg->int_control0 = readl_relaxed(base + REG_MMU_INT_CONTROL0);
reg->int_main_control = readl_relaxed(base + REG_MMU_INT_MAIN_CONTROL);
+ clk_disable_unprepare(data->bclk);
return 0;
}
@@ -639,9 +697,13 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev)
struct mtk_iommu_data *data = dev_get_drvdata(dev);
struct mtk_iommu_suspend_reg *reg = &data->reg;
void __iomem *base = data->base;
+ int ret;
- writel_relaxed(data->m4u_dom->cfg.arm_v7s_cfg.ttbr[0],
- base + REG_MMU_PT_BASE_ADDR);
+ ret = clk_prepare_enable(data->bclk);
+ if (ret) {
+ dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret);
+ return ret;
+ }
writel_relaxed(reg->standard_axi_mode,
base + REG_MMU_STANDARD_AXI_MODE);
writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS);
@@ -650,15 +712,19 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev)
writel_relaxed(reg->int_main_control, base + REG_MMU_INT_MAIN_CONTROL);
writel_relaxed(F_MMU_IVRP_PA_SET(data->protect_base, data->enable_4GB),
base + REG_MMU_IVRP_PADDR);
+ if (data->m4u_dom)
+ writel(data->m4u_dom->cfg.arm_v7s_cfg.ttbr[0],
+ base + REG_MMU_PT_BASE_ADDR);
return 0;
}
-const struct dev_pm_ops mtk_iommu_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(mtk_iommu_suspend, mtk_iommu_resume)
+static const struct dev_pm_ops mtk_iommu_pm_ops = {
+ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_iommu_suspend, mtk_iommu_resume)
};
static const struct of_device_id mtk_iommu_of_ids[] = {
- { .compatible = "mediatek,mt8173-m4u", },
+ { .compatible = "mediatek,mt2712-m4u", .data = (void *)M4U_MT2712},
+ { .compatible = "mediatek,mt8173-m4u", .data = (void *)M4U_MT8173},
{}
};
@@ -667,27 +733,20 @@ static struct platform_driver mtk_iommu_driver = {
.remove = mtk_iommu_remove,
.driver = {
.name = "mtk-iommu",
- .of_match_table = mtk_iommu_of_ids,
+ .of_match_table = of_match_ptr(mtk_iommu_of_ids),
.pm = &mtk_iommu_pm_ops,
}
};
-static int mtk_iommu_init_fn(struct device_node *np)
+static int __init mtk_iommu_init(void)
{
int ret;
- struct platform_device *pdev;
-
- pdev = of_platform_device_create(np, NULL, platform_bus_type.dev_root);
- if (!pdev)
- return -ENOMEM;
ret = platform_driver_register(&mtk_iommu_driver);
- if (ret) {
- pr_err("%s: Failed to register driver\n", __func__);
- return ret;
- }
+ if (ret != 0)
+ pr_err("Failed to register MTK IOMMU driver\n");
- return 0;
+ return ret;
}
-IOMMU_OF_DECLARE(mtkm4u, "mediatek,mt8173-m4u", mtk_iommu_init_fn);
+subsys_initcall(mtk_iommu_init)
diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h
index c06cc91b5d9a..b4451a1c7c2f 100644
--- a/drivers/iommu/mtk_iommu.h
+++ b/drivers/iommu/mtk_iommu.h
@@ -34,6 +34,12 @@ struct mtk_iommu_suspend_reg {
u32 int_main_control;
};
+enum mtk_iommu_plat {
+ M4U_MT2701,
+ M4U_MT2712,
+ M4U_MT8173,
+};
+
struct mtk_iommu_domain;
struct mtk_iommu_data {
@@ -50,6 +56,9 @@ struct mtk_iommu_data {
bool tlb_flush_active;
struct iommu_device iommu;
+ enum mtk_iommu_plat m4u_plat;
+
+ struct list_head list;
};
static inline int compare_of(struct device *dev, void *data)
diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index 8cb60829a7a1..50947ebb6d17 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -25,6 +25,8 @@
#include <linux/of_pci.h>
#include <linux/slab.h>
+#define NO_IOMMU 1
+
static const struct of_device_id __iommu_of_table_sentinel
__used __section(__iommu_of_table_end);
@@ -109,8 +111,8 @@ static bool of_iommu_driver_present(struct device_node *np)
return of_match_node(&__iommu_of_table, np);
}
-static const struct iommu_ops
-*of_iommu_xlate(struct device *dev, struct of_phandle_args *iommu_spec)
+static int of_iommu_xlate(struct device *dev,
+ struct of_phandle_args *iommu_spec)
{
const struct iommu_ops *ops;
struct fwnode_handle *fwnode = &iommu_spec->np->fwnode;
@@ -120,95 +122,50 @@ static const struct iommu_ops
if ((ops && !ops->of_xlate) ||
!of_device_is_available(iommu_spec->np) ||
(!ops && !of_iommu_driver_present(iommu_spec->np)))
- return NULL;
+ return NO_IOMMU;
err = iommu_fwspec_init(dev, &iommu_spec->np->fwnode, ops);
if (err)
- return ERR_PTR(err);
+ return err;
/*
* The otherwise-empty fwspec handily serves to indicate the specific
* IOMMU device we're waiting for, which will be useful if we ever get
* a proper probe-ordering dependency mechanism in future.
*/
if (!ops)
- return ERR_PTR(-EPROBE_DEFER);
-
- err = ops->of_xlate(dev, iommu_spec);
- if (err)
- return ERR_PTR(err);
+ return -EPROBE_DEFER;
- return ops;
+ return ops->of_xlate(dev, iommu_spec);
}
-static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
-{
- struct of_phandle_args *iommu_spec = data;
-
- iommu_spec->args[0] = alias;
- return iommu_spec->np == pdev->bus->dev.of_node;
-}
+struct of_pci_iommu_alias_info {
+ struct device *dev;
+ struct device_node *np;
+};
-static const struct iommu_ops
-*of_pci_iommu_init(struct pci_dev *pdev, struct device_node *bridge_np)
+static int of_pci_iommu_init(struct pci_dev *pdev, u16 alias, void *data)
{
- const struct iommu_ops *ops;
- struct of_phandle_args iommu_spec;
+ struct of_pci_iommu_alias_info *info = data;
+ struct of_phandle_args iommu_spec = { .args_count = 1 };
int err;
- /*
- * Start by tracing the RID alias down the PCI topology as
- * far as the host bridge whose OF node we have...
- * (we're not even attempting to handle multi-alias devices yet)
- */
- iommu_spec.args_count = 1;
- iommu_spec.np = bridge_np;
- pci_for_each_dma_alias(pdev, __get_pci_rid, &iommu_spec);
- /*
- * ...then find out what that becomes once it escapes the PCI
- * bus into the system beyond, and which IOMMU it ends up at.
- */
- iommu_spec.np = NULL;
- err = of_pci_map_rid(bridge_np, iommu_spec.args[0], "iommu-map",
+ err = of_pci_map_rid(info->np, alias, "iommu-map",
"iommu-map-mask", &iommu_spec.np,
iommu_spec.args);
if (err)
- return err == -ENODEV ? NULL : ERR_PTR(err);
-
- ops = of_iommu_xlate(&pdev->dev, &iommu_spec);
+ return err == -ENODEV ? NO_IOMMU : err;
+ err = of_iommu_xlate(info->dev, &iommu_spec);
of_node_put(iommu_spec.np);
- return ops;
-}
-
-static const struct iommu_ops
-*of_platform_iommu_init(struct device *dev, struct device_node *np)
-{
- struct of_phandle_args iommu_spec;
- const struct iommu_ops *ops = NULL;
- int idx = 0;
-
- /*
- * We don't currently walk up the tree looking for a parent IOMMU.
- * See the `Notes:' section of
- * Documentation/devicetree/bindings/iommu/iommu.txt
- */
- while (!of_parse_phandle_with_args(np, "iommus", "#iommu-cells",
- idx, &iommu_spec)) {
- ops = of_iommu_xlate(dev, &iommu_spec);
- of_node_put(iommu_spec.np);
- idx++;
- if (IS_ERR_OR_NULL(ops))
- break;
- }
-
- return ops;
+ return err;
}
const struct iommu_ops *of_iommu_configure(struct device *dev,
struct device_node *master_np)
{
- const struct iommu_ops *ops;
+ const struct iommu_ops *ops = NULL;
struct iommu_fwspec *fwspec = dev->iommu_fwspec;
+ int err = NO_IOMMU;
if (!master_np)
return NULL;
@@ -221,25 +178,54 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
iommu_fwspec_free(dev);
}
- if (dev_is_pci(dev))
- ops = of_pci_iommu_init(to_pci_dev(dev), master_np);
- else
- ops = of_platform_iommu_init(dev, master_np);
+ /*
+ * We don't currently walk up the tree looking for a parent IOMMU.
+ * See the `Notes:' section of
+ * Documentation/devicetree/bindings/iommu/iommu.txt
+ */
+ if (dev_is_pci(dev)) {
+ struct of_pci_iommu_alias_info info = {
+ .dev = dev,
+ .np = master_np,
+ };
+
+ err = pci_for_each_dma_alias(to_pci_dev(dev),
+ of_pci_iommu_init, &info);
+ } else {
+ struct of_phandle_args iommu_spec;
+ int idx = 0;
+
+ while (!of_parse_phandle_with_args(master_np, "iommus",
+ "#iommu-cells",
+ idx, &iommu_spec)) {
+ err = of_iommu_xlate(dev, &iommu_spec);
+ of_node_put(iommu_spec.np);
+ idx++;
+ if (err)
+ break;
+ }
+ }
+
+ /*
+ * Two success conditions can be represented by non-negative err here:
+ * >0 : there is no IOMMU, or one was unavailable for non-fatal reasons
+ * 0 : we found an IOMMU, and dev->fwspec is initialised appropriately
+ * <0 : any actual error
+ */
+ if (!err)
+ ops = dev->iommu_fwspec->ops;
/*
* If we have reason to believe the IOMMU driver missed the initial
* add_device callback for dev, replay it to get things in order.
*/
- if (!IS_ERR_OR_NULL(ops) && ops->add_device &&
- dev->bus && !dev->iommu_group) {
- int err = ops->add_device(dev);
-
- if (err)
- ops = ERR_PTR(err);
- }
+ if (ops && ops->add_device && dev->bus && !dev->iommu_group)
+ err = ops->add_device(dev);
/* Ignore all other errors apart from EPROBE_DEFER */
- if (IS_ERR(ops) && (PTR_ERR(ops) != -EPROBE_DEFER)) {
- dev_dbg(dev, "Adding to IOMMU failed: %ld\n", PTR_ERR(ops));
+ if (err == -EPROBE_DEFER) {
+ ops = ERR_PTR(err);
+ } else if (err < 0) {
+ dev_dbg(dev, "Adding to IOMMU failed: %d\n", err);
ops = NULL;
}
@@ -255,8 +241,7 @@ static int __init of_iommu_init(void)
const of_iommu_init_fn init_fn = match->data;
if (init_fn && init_fn(np))
- pr_err("Failed to initialise IOMMU %s\n",
- of_node_full_name(np));
+ pr_err("Failed to initialise IOMMU %pOF\n", np);
}
return 0;
diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
index 641e035cf866..bd67e1b2c64e 100644
--- a/drivers/iommu/omap-iommu.c
+++ b/drivers/iommu/omap-iommu.c
@@ -11,6 +11,7 @@
* published by the Free Software Foundation.
*/
+#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
@@ -29,8 +30,6 @@
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
-#include <asm/cacheflush.h>
-
#include <linux/platform_data/iommu-omap.h>
#include "omap-iopgtable.h"
@@ -454,36 +453,35 @@ static void flush_iotlb_all(struct omap_iommu *obj)
/*
* H/W pagetable operations
*/
-static void flush_iopgd_range(u32 *first, u32 *last)
+static void flush_iopte_range(struct device *dev, dma_addr_t dma,
+ unsigned long offset, int num_entries)
{
- /* FIXME: L2 cache should be taken care of if it exists */
- do {
- asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pgd"
- : : "r" (first));
- first += L1_CACHE_BYTES / sizeof(*first);
- } while (first <= last);
-}
+ size_t size = num_entries * sizeof(u32);
-static void flush_iopte_range(u32 *first, u32 *last)
-{
- /* FIXME: L2 cache should be taken care of if it exists */
- do {
- asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pte"
- : : "r" (first));
- first += L1_CACHE_BYTES / sizeof(*first);
- } while (first <= last);
+ dma_sync_single_range_for_device(dev, dma, offset, size, DMA_TO_DEVICE);
}
-static void iopte_free(u32 *iopte)
+static void iopte_free(struct omap_iommu *obj, u32 *iopte, bool dma_valid)
{
+ dma_addr_t pt_dma;
+
/* Note: freed iopte's must be clean ready for re-use */
- if (iopte)
+ if (iopte) {
+ if (dma_valid) {
+ pt_dma = virt_to_phys(iopte);
+ dma_unmap_single(obj->dev, pt_dma, IOPTE_TABLE_SIZE,
+ DMA_TO_DEVICE);
+ }
+
kmem_cache_free(iopte_cachep, iopte);
+ }
}
-static u32 *iopte_alloc(struct omap_iommu *obj, u32 *iopgd, u32 da)
+static u32 *iopte_alloc(struct omap_iommu *obj, u32 *iopgd,
+ dma_addr_t *pt_dma, u32 da)
{
u32 *iopte;
+ unsigned long offset = iopgd_index(da) * sizeof(da);
/* a table has already existed */
if (*iopgd)
@@ -500,18 +498,38 @@ static u32 *iopte_alloc(struct omap_iommu *obj, u32 *iopgd, u32 da)
if (!iopte)
return ERR_PTR(-ENOMEM);
+ *pt_dma = dma_map_single(obj->dev, iopte, IOPTE_TABLE_SIZE,
+ DMA_TO_DEVICE);
+ if (dma_mapping_error(obj->dev, *pt_dma)) {
+ dev_err(obj->dev, "DMA map error for L2 table\n");
+ iopte_free(obj, iopte, false);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ /*
+ * we rely on dma address and the physical address to be
+ * the same for mapping the L2 table
+ */
+ if (WARN_ON(*pt_dma != virt_to_phys(iopte))) {
+ dev_err(obj->dev, "DMA translation error for L2 table\n");
+ dma_unmap_single(obj->dev, *pt_dma, IOPTE_TABLE_SIZE,
+ DMA_TO_DEVICE);
+ iopte_free(obj, iopte, false);
+ return ERR_PTR(-ENOMEM);
+ }
+
*iopgd = virt_to_phys(iopte) | IOPGD_TABLE;
- flush_iopgd_range(iopgd, iopgd);
+ flush_iopte_range(obj->dev, obj->pd_dma, offset, 1);
dev_vdbg(obj->dev, "%s: a new pte:%p\n", __func__, iopte);
} else {
/* We raced, free the reduniovant table */
- iopte_free(iopte);
+ iopte_free(obj, iopte, false);
}
pte_ready:
iopte = iopte_offset(iopgd, da);
-
+ *pt_dma = virt_to_phys(iopte);
dev_vdbg(obj->dev,
"%s: da:%08x pgd:%p *pgd:%08x pte:%p *pte:%08x\n",
__func__, da, iopgd, *iopgd, iopte, *iopte);
@@ -522,6 +540,7 @@ pte_ready:
static int iopgd_alloc_section(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
{
u32 *iopgd = iopgd_offset(obj, da);
+ unsigned long offset = iopgd_index(da) * sizeof(da);
if ((da | pa) & ~IOSECTION_MASK) {
dev_err(obj->dev, "%s: %08x:%08x should aligned on %08lx\n",
@@ -530,13 +549,14 @@ static int iopgd_alloc_section(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
}
*iopgd = (pa & IOSECTION_MASK) | prot | IOPGD_SECTION;
- flush_iopgd_range(iopgd, iopgd);
+ flush_iopte_range(obj->dev, obj->pd_dma, offset, 1);
return 0;
}
static int iopgd_alloc_super(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
{
u32 *iopgd = iopgd_offset(obj, da);
+ unsigned long offset = iopgd_index(da) * sizeof(da);
int i;
if ((da | pa) & ~IOSUPER_MASK) {
@@ -547,20 +567,22 @@ static int iopgd_alloc_super(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
for (i = 0; i < 16; i++)
*(iopgd + i) = (pa & IOSUPER_MASK) | prot | IOPGD_SUPER;
- flush_iopgd_range(iopgd, iopgd + 15);
+ flush_iopte_range(obj->dev, obj->pd_dma, offset, 16);
return 0;
}
static int iopte_alloc_page(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
{
u32 *iopgd = iopgd_offset(obj, da);
- u32 *iopte = iopte_alloc(obj, iopgd, da);
+ dma_addr_t pt_dma;
+ u32 *iopte = iopte_alloc(obj, iopgd, &pt_dma, da);
+ unsigned long offset = iopte_index(da) * sizeof(da);
if (IS_ERR(iopte))
return PTR_ERR(iopte);
*iopte = (pa & IOPAGE_MASK) | prot | IOPTE_SMALL;
- flush_iopte_range(iopte, iopte);
+ flush_iopte_range(obj->dev, pt_dma, offset, 1);
dev_vdbg(obj->dev, "%s: da:%08x pa:%08x pte:%p *pte:%08x\n",
__func__, da, pa, iopte, *iopte);
@@ -571,7 +593,9 @@ static int iopte_alloc_page(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
static int iopte_alloc_large(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
{
u32 *iopgd = iopgd_offset(obj, da);
- u32 *iopte = iopte_alloc(obj, iopgd, da);
+ dma_addr_t pt_dma;
+ u32 *iopte = iopte_alloc(obj, iopgd, &pt_dma, da);
+ unsigned long offset = iopte_index(da) * sizeof(da);
int i;
if ((da | pa) & ~IOLARGE_MASK) {
@@ -585,7 +609,7 @@ static int iopte_alloc_large(struct omap_iommu *obj, u32 da, u32 pa, u32 prot)
for (i = 0; i < 16; i++)
*(iopte + i) = (pa & IOLARGE_MASK) | prot | IOPTE_LARGE;
- flush_iopte_range(iopte, iopte + 15);
+ flush_iopte_range(obj->dev, pt_dma, offset, 16);
return 0;
}
@@ -674,6 +698,9 @@ static size_t iopgtable_clear_entry_core(struct omap_iommu *obj, u32 da)
size_t bytes;
u32 *iopgd = iopgd_offset(obj, da);
int nent = 1;
+ dma_addr_t pt_dma;
+ unsigned long pd_offset = iopgd_index(da) * sizeof(da);
+ unsigned long pt_offset = iopte_index(da) * sizeof(da);
if (!*iopgd)
return 0;
@@ -690,7 +717,8 @@ static size_t iopgtable_clear_entry_core(struct omap_iommu *obj, u32 da)
}
bytes *= nent;
memset(iopte, 0, nent * sizeof(*iopte));
- flush_iopte_range(iopte, iopte + (nent - 1) * sizeof(*iopte));
+ pt_dma = virt_to_phys(iopte);
+ flush_iopte_range(obj->dev, pt_dma, pt_offset, nent);
/*
* do table walk to check if this table is necessary or not
@@ -700,7 +728,7 @@ static size_t iopgtable_clear_entry_core(struct omap_iommu *obj, u32 da)
if (iopte[i])
goto out;
- iopte_free(iopte);
+ iopte_free(obj, iopte, true);
nent = 1; /* for the next L1 entry */
} else {
bytes = IOPGD_SIZE;
@@ -712,7 +740,7 @@ static size_t iopgtable_clear_entry_core(struct omap_iommu *obj, u32 da)
bytes *= nent;
}
memset(iopgd, 0, nent * sizeof(*iopgd));
- flush_iopgd_range(iopgd, iopgd + (nent - 1) * sizeof(*iopgd));
+ flush_iopte_range(obj->dev, obj->pd_dma, pd_offset, nent);
out:
return bytes;
}
@@ -738,6 +766,7 @@ static size_t iopgtable_clear_entry(struct omap_iommu *obj, u32 da)
static void iopgtable_clear_entry_all(struct omap_iommu *obj)
{
+ unsigned long offset;
int i;
spin_lock(&obj->page_table_lock);
@@ -748,15 +777,16 @@ static void iopgtable_clear_entry_all(struct omap_iommu *obj)
da = i << IOPGD_SHIFT;
iopgd = iopgd_offset(obj, da);
+ offset = iopgd_index(da) * sizeof(da);
if (!*iopgd)
continue;
if (iopgd_is_table(*iopgd))
- iopte_free(iopte_offset(iopgd, 0));
+ iopte_free(obj, iopte_offset(iopgd, 0), true);
*iopgd = 0;
- flush_iopgd_range(iopgd, iopgd);
+ flush_iopte_range(obj->dev, obj->pd_dma, offset, 1);
}
flush_iotlb_all(obj);
@@ -786,7 +816,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
if (!report_iommu_fault(domain, obj->dev, da, 0))
return IRQ_HANDLED;
- iommu_disable(obj);
+ iommu_write_reg(obj, 0, MMU_IRQENABLE);
iopgd = iopgd_offset(obj, da);
@@ -815,10 +845,18 @@ static int omap_iommu_attach(struct omap_iommu *obj, u32 *iopgd)
spin_lock(&obj->iommu_lock);
+ obj->pd_dma = dma_map_single(obj->dev, iopgd, IOPGD_TABLE_SIZE,
+ DMA_TO_DEVICE);
+ if (dma_mapping_error(obj->dev, obj->pd_dma)) {
+ dev_err(obj->dev, "DMA map error for L1 table\n");
+ err = -ENOMEM;
+ goto out_err;
+ }
+
obj->iopgd = iopgd;
err = iommu_enable(obj);
if (err)
- goto err_enable;
+ goto out_err;
flush_iotlb_all(obj);
spin_unlock(&obj->iommu_lock);
@@ -827,7 +865,7 @@ static int omap_iommu_attach(struct omap_iommu *obj, u32 *iopgd)
return 0;
-err_enable:
+out_err:
spin_unlock(&obj->iommu_lock);
return err;
@@ -844,7 +882,10 @@ static void omap_iommu_detach(struct omap_iommu *obj)
spin_lock(&obj->iommu_lock);
+ dma_unmap_single(obj->dev, obj->pd_dma, IOPGD_TABLE_SIZE,
+ DMA_TO_DEVICE);
iommu_disable(obj);
+ obj->pd_dma = 0;
obj->iopgd = NULL;
spin_unlock(&obj->iommu_lock);
@@ -1008,11 +1049,6 @@ static struct platform_driver omap_iommu_driver = {
},
};
-static void iopte_cachep_ctor(void *iopte)
-{
- clean_dcache_area(iopte, IOPTE_TABLE_SIZE);
-}
-
static u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, int pgsz)
{
memset(e, 0, sizeof(*e));
@@ -1159,7 +1195,6 @@ static struct iommu_domain *omap_iommu_domain_alloc(unsigned type)
if (WARN_ON(!IS_ALIGNED((long)omap_domain->pgtable, IOPGD_TABLE_SIZE)))
goto fail_align;
- clean_dcache_area(omap_domain->pgtable, IOPGD_TABLE_SIZE);
spin_lock_init(&omap_domain->lock);
omap_domain->domain.geometry.aperture_start = 0;
@@ -1347,7 +1382,7 @@ static int __init omap_iommu_init(void)
of_node_put(np);
p = kmem_cache_create("iopte_cache", IOPTE_TABLE_SIZE, align, flags,
- iopte_cachep_ctor);
+ NULL);
if (!p)
return -ENOMEM;
iopte_cachep = p;
diff --git a/drivers/iommu/omap-iommu.h b/drivers/iommu/omap-iommu.h
index 6e70515e6038..a675af29a6ec 100644
--- a/drivers/iommu/omap-iommu.h
+++ b/drivers/iommu/omap-iommu.h
@@ -61,6 +61,7 @@ struct omap_iommu {
*/
u32 *iopgd;
spinlock_t page_table_lock; /* protect iopgd */
+ dma_addr_t pd_dma;
int nr_tlb_entries;
diff --git a/drivers/iommu/qcom_iommu.c b/drivers/iommu/qcom_iommu.c
new file mode 100644
index 000000000000..c8a587d034b0
--- /dev/null
+++ b/drivers/iommu/qcom_iommu.c
@@ -0,0 +1,930 @@
+/*
+ * IOMMU API for QCOM secure IOMMUs. Somewhat based on arm-smmu.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2013 ARM Limited
+ * Copyright (C) 2017 Red Hat
+ */
+
+#include <linux/atomic.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/dma-iommu.h>
+#include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/io-64-nonatomic-hi-lo.h>
+#include <linux/iommu.h>
+#include <linux/iopoll.h>
+#include <linux/kconfig.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/of_iommu.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/pm_runtime.h>
+#include <linux/qcom_scm.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include "io-pgtable.h"
+#include "arm-smmu-regs.h"
+
+#define SMMU_INTR_SEL_NS 0x2000
+
+struct qcom_iommu_ctx;
+
+struct qcom_iommu_dev {
+ /* IOMMU core code handle */
+ struct iommu_device iommu;
+ struct device *dev;
+ struct clk *iface_clk;
+ struct clk *bus_clk;
+ void __iomem *local_base;
+ u32 sec_id;
+ u8 num_ctxs;
+ struct qcom_iommu_ctx *ctxs[0]; /* indexed by asid-1 */
+};
+
+struct qcom_iommu_ctx {
+ struct device *dev;
+ void __iomem *base;
+ bool secure_init;
+ u8 asid; /* asid and ctx bank # are 1:1 */
+};
+
+struct qcom_iommu_domain {
+ struct io_pgtable_ops *pgtbl_ops;
+ spinlock_t pgtbl_lock;
+ struct mutex init_mutex; /* Protects iommu pointer */
+ struct iommu_domain domain;
+ struct qcom_iommu_dev *iommu;
+};
+
+static struct qcom_iommu_domain *to_qcom_iommu_domain(struct iommu_domain *dom)
+{
+ return container_of(dom, struct qcom_iommu_domain, domain);
+}
+
+static const struct iommu_ops qcom_iommu_ops;
+
+static struct qcom_iommu_dev * to_iommu(struct iommu_fwspec *fwspec)
+{
+ if (!fwspec || fwspec->ops != &qcom_iommu_ops)
+ return NULL;
+ return fwspec->iommu_priv;
+}
+
+static struct qcom_iommu_ctx * to_ctx(struct iommu_fwspec *fwspec, unsigned asid)
+{
+ struct qcom_iommu_dev *qcom_iommu = to_iommu(fwspec);
+ if (!qcom_iommu)
+ return NULL;
+ return qcom_iommu->ctxs[asid - 1];
+}
+
+static inline void
+iommu_writel(struct qcom_iommu_ctx *ctx, unsigned reg, u32 val)
+{
+ writel_relaxed(val, ctx->base + reg);
+}
+
+static inline void
+iommu_writeq(struct qcom_iommu_ctx *ctx, unsigned reg, u64 val)
+{
+ writeq_relaxed(val, ctx->base + reg);
+}
+
+static inline u32
+iommu_readl(struct qcom_iommu_ctx *ctx, unsigned reg)
+{
+ return readl_relaxed(ctx->base + reg);
+}
+
+static inline u64
+iommu_readq(struct qcom_iommu_ctx *ctx, unsigned reg)
+{
+ return readq_relaxed(ctx->base + reg);
+}
+
+static void qcom_iommu_tlb_sync(void *cookie)
+{
+ struct iommu_fwspec *fwspec = cookie;
+ unsigned i;
+
+ for (i = 0; i < fwspec->num_ids; i++) {
+ struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
+ unsigned int val, ret;
+
+ iommu_writel(ctx, ARM_SMMU_CB_TLBSYNC, 0);
+
+ ret = readl_poll_timeout(ctx->base + ARM_SMMU_CB_TLBSTATUS, val,
+ (val & 0x1) == 0, 0, 5000000);
+ if (ret)
+ dev_err(ctx->dev, "timeout waiting for TLB SYNC\n");
+ }
+}
+
+static void qcom_iommu_tlb_inv_context(void *cookie)
+{
+ struct iommu_fwspec *fwspec = cookie;
+ unsigned i;
+
+ for (i = 0; i < fwspec->num_ids; i++) {
+ struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
+ iommu_writel(ctx, ARM_SMMU_CB_S1_TLBIASID, ctx->asid);
+ }
+
+ qcom_iommu_tlb_sync(cookie);
+}
+
+static void qcom_iommu_tlb_inv_range_nosync(unsigned long iova, size_t size,
+ size_t granule, bool leaf, void *cookie)
+{
+ struct iommu_fwspec *fwspec = cookie;
+ unsigned i, reg;
+
+ reg = leaf ? ARM_SMMU_CB_S1_TLBIVAL : ARM_SMMU_CB_S1_TLBIVA;
+
+ for (i = 0; i < fwspec->num_ids; i++) {
+ struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
+ size_t s = size;
+
+ iova &= ~12UL;
+ iova |= ctx->asid;
+ do {
+ iommu_writel(ctx, reg, iova);
+ iova += granule;
+ } while (s -= granule);
+ }
+}
+
+static const struct iommu_gather_ops qcom_gather_ops = {
+ .tlb_flush_all = qcom_iommu_tlb_inv_context,
+ .tlb_add_flush = qcom_iommu_tlb_inv_range_nosync,
+ .tlb_sync = qcom_iommu_tlb_sync,
+};
+
+static irqreturn_t qcom_iommu_fault(int irq, void *dev)
+{
+ struct qcom_iommu_ctx *ctx = dev;
+ u32 fsr, fsynr;
+ u64 iova;
+
+ fsr = iommu_readl(ctx, ARM_SMMU_CB_FSR);
+
+ if (!(fsr & FSR_FAULT))
+ return IRQ_NONE;
+
+ fsynr = iommu_readl(ctx, ARM_SMMU_CB_FSYNR0);
+ iova = iommu_readq(ctx, ARM_SMMU_CB_FAR);
+
+ dev_err_ratelimited(ctx->dev,
+ "Unhandled context fault: fsr=0x%x, "
+ "iova=0x%016llx, fsynr=0x%x, cb=%d\n",
+ fsr, iova, fsynr, ctx->asid);
+
+ iommu_writel(ctx, ARM_SMMU_CB_FSR, fsr);
+
+ return IRQ_HANDLED;
+}
+
+static int qcom_iommu_init_domain(struct iommu_domain *domain,
+ struct qcom_iommu_dev *qcom_iommu,
+ struct iommu_fwspec *fwspec)
+{
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ struct io_pgtable_ops *pgtbl_ops;
+ struct io_pgtable_cfg pgtbl_cfg;
+ int i, ret = 0;
+ u32 reg;
+
+ mutex_lock(&qcom_domain->init_mutex);
+ if (qcom_domain->iommu)
+ goto out_unlock;
+
+ pgtbl_cfg = (struct io_pgtable_cfg) {
+ .pgsize_bitmap = qcom_iommu_ops.pgsize_bitmap,
+ .ias = 32,
+ .oas = 40,
+ .tlb = &qcom_gather_ops,
+ .iommu_dev = qcom_iommu->dev,
+ };
+
+ qcom_domain->iommu = qcom_iommu;
+ pgtbl_ops = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &pgtbl_cfg, fwspec);
+ if (!pgtbl_ops) {
+ dev_err(qcom_iommu->dev, "failed to allocate pagetable ops\n");
+ ret = -ENOMEM;
+ goto out_clear_iommu;
+ }
+
+ /* Update the domain's page sizes to reflect the page table format */
+ domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
+ domain->geometry.aperture_end = (1ULL << pgtbl_cfg.ias) - 1;
+ domain->geometry.force_aperture = true;
+
+ for (i = 0; i < fwspec->num_ids; i++) {
+ struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
+
+ if (!ctx->secure_init) {
+ ret = qcom_scm_restore_sec_cfg(qcom_iommu->sec_id, ctx->asid);
+ if (ret) {
+ dev_err(qcom_iommu->dev, "secure init failed: %d\n", ret);
+ goto out_clear_iommu;
+ }
+ ctx->secure_init = true;
+ }
+
+ /* TTBRs */
+ iommu_writeq(ctx, ARM_SMMU_CB_TTBR0,
+ pgtbl_cfg.arm_lpae_s1_cfg.ttbr[0] |
+ ((u64)ctx->asid << TTBRn_ASID_SHIFT));
+ iommu_writeq(ctx, ARM_SMMU_CB_TTBR1,
+ pgtbl_cfg.arm_lpae_s1_cfg.ttbr[1] |
+ ((u64)ctx->asid << TTBRn_ASID_SHIFT));
+
+ /* TTBCR */
+ iommu_writel(ctx, ARM_SMMU_CB_TTBCR2,
+ (pgtbl_cfg.arm_lpae_s1_cfg.tcr >> 32) |
+ TTBCR2_SEP_UPSTREAM);
+ iommu_writel(ctx, ARM_SMMU_CB_TTBCR,
+ pgtbl_cfg.arm_lpae_s1_cfg.tcr);
+
+ /* MAIRs (stage-1 only) */
+ iommu_writel(ctx, ARM_SMMU_CB_S1_MAIR0,
+ pgtbl_cfg.arm_lpae_s1_cfg.mair[0]);
+ iommu_writel(ctx, ARM_SMMU_CB_S1_MAIR1,
+ pgtbl_cfg.arm_lpae_s1_cfg.mair[1]);
+
+ /* SCTLR */
+ reg = SCTLR_CFIE | SCTLR_CFRE | SCTLR_AFE | SCTLR_TRE |
+ SCTLR_M | SCTLR_S1_ASIDPNE;
+
+ if (IS_ENABLED(CONFIG_BIG_ENDIAN))
+ reg |= SCTLR_E;
+
+ iommu_writel(ctx, ARM_SMMU_CB_SCTLR, reg);
+ }
+
+ mutex_unlock(&qcom_domain->init_mutex);
+
+ /* Publish page table ops for map/unmap */
+ qcom_domain->pgtbl_ops = pgtbl_ops;
+
+ return 0;
+
+out_clear_iommu:
+ qcom_domain->iommu = NULL;
+out_unlock:
+ mutex_unlock(&qcom_domain->init_mutex);
+ return ret;
+}
+
+static struct iommu_domain *qcom_iommu_domain_alloc(unsigned type)
+{
+ struct qcom_iommu_domain *qcom_domain;
+
+ if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
+ return NULL;
+ /*
+ * Allocate the domain and initialise some of its data structures.
+ * We can't really do anything meaningful until we've added a
+ * master.
+ */
+ qcom_domain = kzalloc(sizeof(*qcom_domain), GFP_KERNEL);
+ if (!qcom_domain)
+ return NULL;
+
+ if (type == IOMMU_DOMAIN_DMA &&
+ iommu_get_dma_cookie(&qcom_domain->domain)) {
+ kfree(qcom_domain);
+ return NULL;
+ }
+
+ mutex_init(&qcom_domain->init_mutex);
+ spin_lock_init(&qcom_domain->pgtbl_lock);
+
+ return &qcom_domain->domain;
+}
+
+static void qcom_iommu_domain_free(struct iommu_domain *domain)
+{
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+
+ if (WARN_ON(qcom_domain->iommu)) /* forgot to detach? */
+ return;
+
+ iommu_put_dma_cookie(domain);
+
+ /* NOTE: unmap can be called after client device is powered off,
+ * for example, with GPUs or anything involving dma-buf. So we
+ * cannot rely on the device_link. Make sure the IOMMU is on to
+ * avoid unclocked accesses in the TLB inv path:
+ */
+ pm_runtime_get_sync(qcom_domain->iommu->dev);
+
+ free_io_pgtable_ops(qcom_domain->pgtbl_ops);
+
+ pm_runtime_put_sync(qcom_domain->iommu->dev);
+
+ kfree(qcom_domain);
+}
+
+static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
+{
+ struct qcom_iommu_dev *qcom_iommu = to_iommu(dev->iommu_fwspec);
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ int ret;
+
+ if (!qcom_iommu) {
+ dev_err(dev, "cannot attach to IOMMU, is it on the same bus?\n");
+ return -ENXIO;
+ }
+
+ /* Ensure that the domain is finalized */
+ pm_runtime_get_sync(qcom_iommu->dev);
+ ret = qcom_iommu_init_domain(domain, qcom_iommu, dev->iommu_fwspec);
+ pm_runtime_put_sync(qcom_iommu->dev);
+ if (ret < 0)
+ return ret;
+
+ /*
+ * Sanity check the domain. We don't support domains across
+ * different IOMMUs.
+ */
+ if (qcom_domain->iommu != qcom_iommu) {
+ dev_err(dev, "cannot attach to IOMMU %s while already "
+ "attached to domain on IOMMU %s\n",
+ dev_name(qcom_domain->iommu->dev),
+ dev_name(qcom_iommu->dev));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *dev)
+{
+ struct iommu_fwspec *fwspec = dev->iommu_fwspec;
+ struct qcom_iommu_dev *qcom_iommu = to_iommu(fwspec);
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ unsigned i;
+
+ if (!qcom_domain->iommu)
+ return;
+
+ pm_runtime_get_sync(qcom_iommu->dev);
+ for (i = 0; i < fwspec->num_ids; i++) {
+ struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
+
+ /* Disable the context bank: */
+ iommu_writel(ctx, ARM_SMMU_CB_SCTLR, 0);
+ }
+ pm_runtime_put_sync(qcom_iommu->dev);
+
+ qcom_domain->iommu = NULL;
+}
+
+static int qcom_iommu_map(struct iommu_domain *domain, unsigned long iova,
+ phys_addr_t paddr, size_t size, int prot)
+{
+ int ret;
+ unsigned long flags;
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ struct io_pgtable_ops *ops = qcom_domain->pgtbl_ops;
+
+ if (!ops)
+ return -ENODEV;
+
+ spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags);
+ ret = ops->map(ops, iova, paddr, size, prot);
+ spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags);
+ return ret;
+}
+
+static size_t qcom_iommu_unmap(struct iommu_domain *domain, unsigned long iova,
+ size_t size)
+{
+ size_t ret;
+ unsigned long flags;
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ struct io_pgtable_ops *ops = qcom_domain->pgtbl_ops;
+
+ if (!ops)
+ return 0;
+
+ /* NOTE: unmap can be called after client device is powered off,
+ * for example, with GPUs or anything involving dma-buf. So we
+ * cannot rely on the device_link. Make sure the IOMMU is on to
+ * avoid unclocked accesses in the TLB inv path:
+ */
+ pm_runtime_get_sync(qcom_domain->iommu->dev);
+ spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags);
+ ret = ops->unmap(ops, iova, size);
+ spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags);
+ pm_runtime_put_sync(qcom_domain->iommu->dev);
+
+ return ret;
+}
+
+static phys_addr_t qcom_iommu_iova_to_phys(struct iommu_domain *domain,
+ dma_addr_t iova)
+{
+ phys_addr_t ret;
+ unsigned long flags;
+ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
+ struct io_pgtable_ops *ops = qcom_domain->pgtbl_ops;
+
+ if (!ops)
+ return 0;
+
+ spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags);
+ ret = ops->iova_to_phys(ops, iova);
+ spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags);
+
+ return ret;
+}
+
+static bool qcom_iommu_capable(enum iommu_cap cap)
+{
+ switch (cap) {
+ case IOMMU_CAP_CACHE_COHERENCY:
+ /*
+ * Return true here as the SMMU can always send out coherent
+ * requests.
+ */
+ return true;
+ case IOMMU_CAP_NOEXEC:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static int qcom_iommu_add_device(struct device *dev)
+{
+ struct qcom_iommu_dev *qcom_iommu = to_iommu(dev->iommu_fwspec);
+ struct iommu_group *group;
+ struct device_link *link;
+
+ if (!qcom_iommu)
+ return -ENODEV;
+
+ /*
+ * Establish the link between iommu and master, so that the
+ * iommu gets runtime enabled/disabled as per the master's
+ * needs.
+ */
+ link = device_link_add(dev, qcom_iommu->dev, DL_FLAG_PM_RUNTIME);
+ if (!link) {
+ dev_err(qcom_iommu->dev, "Unable to create device link between %s and %s\n",
+ dev_name(qcom_iommu->dev), dev_name(dev));
+ return -ENODEV;
+ }
+
+ group = iommu_group_get_for_dev(dev);
+ if (IS_ERR_OR_NULL(group))
+ return PTR_ERR_OR_ZERO(group);
+
+ iommu_group_put(group);
+ iommu_device_link(&qcom_iommu->iommu, dev);
+
+ return 0;
+}
+
+static void qcom_iommu_remove_device(struct device *dev)
+{
+ struct qcom_iommu_dev *qcom_iommu = to_iommu(dev->iommu_fwspec);
+
+ if (!qcom_iommu)
+ return;
+
+ iommu_device_unlink(&qcom_iommu->iommu, dev);
+ iommu_group_remove_device(dev);
+ iommu_fwspec_free(dev);
+}
+
+static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
+{
+ struct qcom_iommu_dev *qcom_iommu;
+ struct platform_device *iommu_pdev;
+ unsigned asid = args->args[0];
+
+ if (args->args_count != 1) {
+ dev_err(dev, "incorrect number of iommu params found for %s "
+ "(found %d, expected 1)\n",
+ args->np->full_name, args->args_count);
+ return -EINVAL;
+ }
+
+ iommu_pdev = of_find_device_by_node(args->np);
+ if (WARN_ON(!iommu_pdev))
+ return -EINVAL;
+
+ qcom_iommu = platform_get_drvdata(iommu_pdev);
+
+ /* make sure the asid specified in dt is valid, so we don't have
+ * to sanity check this elsewhere, since 'asid - 1' is used to
+ * index into qcom_iommu->ctxs:
+ */
+ if (WARN_ON(asid < 1) ||
+ WARN_ON(asid > qcom_iommu->num_ctxs))
+ return -EINVAL;
+
+ if (!dev->iommu_fwspec->iommu_priv) {
+ dev->iommu_fwspec->iommu_priv = qcom_iommu;
+ } else {
+ /* make sure devices iommus dt node isn't referring to
+ * multiple different iommu devices. Multiple context
+ * banks are ok, but multiple devices are not:
+ */
+ if (WARN_ON(qcom_iommu != dev->iommu_fwspec->iommu_priv))
+ return -EINVAL;
+ }
+
+ return iommu_fwspec_add_ids(dev, &asid, 1);
+}
+
+static const struct iommu_ops qcom_iommu_ops = {
+ .capable = qcom_iommu_capable,
+ .domain_alloc = qcom_iommu_domain_alloc,
+ .domain_free = qcom_iommu_domain_free,
+ .attach_dev = qcom_iommu_attach_dev,
+ .detach_dev = qcom_iommu_detach_dev,
+ .map = qcom_iommu_map,
+ .unmap = qcom_iommu_unmap,
+ .map_sg = default_iommu_map_sg,
+ .iova_to_phys = qcom_iommu_iova_to_phys,
+ .add_device = qcom_iommu_add_device,
+ .remove_device = qcom_iommu_remove_device,
+ .device_group = generic_device_group,
+ .of_xlate = qcom_iommu_of_xlate,
+ .pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M,
+};
+
+static int qcom_iommu_enable_clocks(struct qcom_iommu_dev *qcom_iommu)
+{
+ int ret;
+
+ ret = clk_prepare_enable(qcom_iommu->iface_clk);
+ if (ret) {
+ dev_err(qcom_iommu->dev, "Couldn't enable iface_clk\n");
+ return ret;
+ }
+
+ ret = clk_prepare_enable(qcom_iommu->bus_clk);
+ if (ret) {
+ dev_err(qcom_iommu->dev, "Couldn't enable bus_clk\n");
+ clk_disable_unprepare(qcom_iommu->iface_clk);
+ return ret;
+ }
+
+ return 0;
+}
+
+static void qcom_iommu_disable_clocks(struct qcom_iommu_dev *qcom_iommu)
+{
+ clk_disable_unprepare(qcom_iommu->bus_clk);
+ clk_disable_unprepare(qcom_iommu->iface_clk);
+}
+
+static int qcom_iommu_sec_ptbl_init(struct device *dev)
+{
+ size_t psize = 0;
+ unsigned int spare = 0;
+ void *cpu_addr;
+ dma_addr_t paddr;
+ unsigned long attrs;
+ static bool allocated = false;
+ int ret;
+
+ if (allocated)
+ return 0;
+
+ ret = qcom_scm_iommu_secure_ptbl_size(spare, &psize);
+ if (ret) {
+ dev_err(dev, "failed to get iommu secure pgtable size (%d)\n",
+ ret);
+ return ret;
+ }
+
+ dev_info(dev, "iommu sec: pgtable size: %zu\n", psize);
+
+ attrs = DMA_ATTR_NO_KERNEL_MAPPING;
+
+ cpu_addr = dma_alloc_attrs(dev, psize, &paddr, GFP_KERNEL, attrs);
+ if (!cpu_addr) {
+ dev_err(dev, "failed to allocate %zu bytes for pgtable\n",
+ psize);
+ return -ENOMEM;
+ }
+
+ ret = qcom_scm_iommu_secure_ptbl_init(paddr, psize, spare);
+ if (ret) {
+ dev_err(dev, "failed to init iommu pgtable (%d)\n", ret);
+ goto free_mem;
+ }
+
+ allocated = true;
+ return 0;
+
+free_mem:
+ dma_free_attrs(dev, psize, cpu_addr, paddr, attrs);
+ return ret;
+}
+
+static int get_asid(const struct device_node *np)
+{
+ u32 reg;
+
+ /* read the "reg" property directly to get the relative address
+ * of the context bank, and calculate the asid from that:
+ */
+ if (of_property_read_u32_index(np, "reg", 0, &reg))
+ return -ENODEV;
+
+ return reg / 0x1000; /* context banks are 0x1000 apart */
+}
+
+static int qcom_iommu_ctx_probe(struct platform_device *pdev)
+{
+ struct qcom_iommu_ctx *ctx;
+ struct device *dev = &pdev->dev;
+ struct qcom_iommu_dev *qcom_iommu = dev_get_drvdata(dev->parent);
+ struct resource *res;
+ int ret, irq;
+
+ ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
+ if (!ctx)
+ return -ENOMEM;
+
+ ctx->dev = dev;
+ platform_set_drvdata(pdev, ctx);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ ctx->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(ctx->base))
+ return PTR_ERR(ctx->base);
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(dev, "failed to get irq\n");
+ return -ENODEV;
+ }
+
+ /* clear IRQs before registering fault handler, just in case the
+ * boot-loader left us a surprise:
+ */
+ iommu_writel(ctx, ARM_SMMU_CB_FSR, iommu_readl(ctx, ARM_SMMU_CB_FSR));
+
+ ret = devm_request_irq(dev, irq,
+ qcom_iommu_fault,
+ IRQF_SHARED,
+ "qcom-iommu-fault",
+ ctx);
+ if (ret) {
+ dev_err(dev, "failed to request IRQ %u\n", irq);
+ return ret;
+ }
+
+ ret = get_asid(dev->of_node);
+ if (ret < 0) {
+ dev_err(dev, "missing reg property\n");
+ return ret;
+ }
+
+ ctx->asid = ret;
+
+ dev_dbg(dev, "found asid %u\n", ctx->asid);
+
+ qcom_iommu->ctxs[ctx->asid - 1] = ctx;
+
+ return 0;
+}
+
+static int qcom_iommu_ctx_remove(struct platform_device *pdev)
+{
+ struct qcom_iommu_dev *qcom_iommu = dev_get_drvdata(pdev->dev.parent);
+ struct qcom_iommu_ctx *ctx = platform_get_drvdata(pdev);
+
+ platform_set_drvdata(pdev, NULL);
+
+ qcom_iommu->ctxs[ctx->asid - 1] = NULL;
+
+ return 0;
+}
+
+static const struct of_device_id ctx_of_match[] = {
+ { .compatible = "qcom,msm-iommu-v1-ns" },
+ { .compatible = "qcom,msm-iommu-v1-sec" },
+ { /* sentinel */ }
+};
+
+static struct platform_driver qcom_iommu_ctx_driver = {
+ .driver = {
+ .name = "qcom-iommu-ctx",
+ .of_match_table = of_match_ptr(ctx_of_match),
+ },
+ .probe = qcom_iommu_ctx_probe,
+ .remove = qcom_iommu_ctx_remove,
+};
+
+static bool qcom_iommu_has_secure_context(struct qcom_iommu_dev *qcom_iommu)
+{
+ struct device_node *child;
+
+ for_each_child_of_node(qcom_iommu->dev->of_node, child)
+ if (of_device_is_compatible(child, "qcom,msm-iommu-v1-sec"))
+ return true;
+
+ return false;
+}
+
+static int qcom_iommu_device_probe(struct platform_device *pdev)
+{
+ struct device_node *child;
+ struct qcom_iommu_dev *qcom_iommu;
+ struct device *dev = &pdev->dev;
+ struct resource *res;
+ int ret, sz, max_asid = 0;
+
+ /* find the max asid (which is 1:1 to ctx bank idx), so we know how
+ * many child ctx devices we have:
+ */
+ for_each_child_of_node(dev->of_node, child)
+ max_asid = max(max_asid, get_asid(child));
+
+ sz = sizeof(*qcom_iommu) + (max_asid * sizeof(qcom_iommu->ctxs[0]));
+
+ qcom_iommu = devm_kzalloc(dev, sz, GFP_KERNEL);
+ if (!qcom_iommu)
+ return -ENOMEM;
+ qcom_iommu->num_ctxs = max_asid;
+ qcom_iommu->dev = dev;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (res)
+ qcom_iommu->local_base = devm_ioremap_resource(dev, res);
+
+ qcom_iommu->iface_clk = devm_clk_get(dev, "iface");
+ if (IS_ERR(qcom_iommu->iface_clk)) {
+ dev_err(dev, "failed to get iface clock\n");
+ return PTR_ERR(qcom_iommu->iface_clk);
+ }
+
+ qcom_iommu->bus_clk = devm_clk_get(dev, "bus");
+ if (IS_ERR(qcom_iommu->bus_clk)) {
+ dev_err(dev, "failed to get bus clock\n");
+ return PTR_ERR(qcom_iommu->bus_clk);
+ }
+
+ if (of_property_read_u32(dev->of_node, "qcom,iommu-secure-id",
+ &qcom_iommu->sec_id)) {
+ dev_err(dev, "missing qcom,iommu-secure-id property\n");
+ return -ENODEV;
+ }
+
+ if (qcom_iommu_has_secure_context(qcom_iommu)) {
+ ret = qcom_iommu_sec_ptbl_init(dev);
+ if (ret) {
+ dev_err(dev, "cannot init secure pg table(%d)\n", ret);
+ return ret;
+ }
+ }
+
+ platform_set_drvdata(pdev, qcom_iommu);
+
+ pm_runtime_enable(dev);
+
+ /* register context bank devices, which are child nodes: */
+ ret = devm_of_platform_populate(dev);
+ if (ret) {
+ dev_err(dev, "Failed to populate iommu contexts\n");
+ return ret;
+ }
+
+ ret = iommu_device_sysfs_add(&qcom_iommu->iommu, dev, NULL,
+ dev_name(dev));
+ if (ret) {
+ dev_err(dev, "Failed to register iommu in sysfs\n");
+ return ret;
+ }
+
+ iommu_device_set_ops(&qcom_iommu->iommu, &qcom_iommu_ops);
+ iommu_device_set_fwnode(&qcom_iommu->iommu, dev->fwnode);
+
+ ret = iommu_device_register(&qcom_iommu->iommu);
+ if (ret) {
+ dev_err(dev, "Failed to register iommu\n");
+ return ret;
+ }
+
+ bus_set_iommu(&platform_bus_type, &qcom_iommu_ops);
+
+ if (qcom_iommu->local_base) {
+ pm_runtime_get_sync(dev);
+ writel_relaxed(0xffffffff, qcom_iommu->local_base + SMMU_INTR_SEL_NS);
+ pm_runtime_put_sync(dev);
+ }
+
+ return 0;
+}
+
+static int qcom_iommu_device_remove(struct platform_device *pdev)
+{
+ struct qcom_iommu_dev *qcom_iommu = platform_get_drvdata(pdev);
+
+ bus_set_iommu(&platform_bus_type, NULL);
+
+ pm_runtime_force_suspend(&pdev->dev);
+ platform_set_drvdata(pdev, NULL);
+ iommu_device_sysfs_remove(&qcom_iommu->iommu);
+ iommu_device_unregister(&qcom_iommu->iommu);
+
+ return 0;
+}
+
+static int __maybe_unused qcom_iommu_resume(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct qcom_iommu_dev *qcom_iommu = platform_get_drvdata(pdev);
+
+ return qcom_iommu_enable_clocks(qcom_iommu);
+}
+
+static int __maybe_unused qcom_iommu_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct qcom_iommu_dev *qcom_iommu = platform_get_drvdata(pdev);
+
+ qcom_iommu_disable_clocks(qcom_iommu);
+
+ return 0;
+}
+
+static const struct dev_pm_ops qcom_iommu_pm_ops = {
+ SET_RUNTIME_PM_OPS(qcom_iommu_suspend, qcom_iommu_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+};
+
+static const struct of_device_id qcom_iommu_of_match[] = {
+ { .compatible = "qcom,msm-iommu-v1" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, qcom_iommu_of_match);
+
+static struct platform_driver qcom_iommu_driver = {
+ .driver = {
+ .name = "qcom-iommu",
+ .of_match_table = of_match_ptr(qcom_iommu_of_match),
+ .pm = &qcom_iommu_pm_ops,
+ },
+ .probe = qcom_iommu_device_probe,
+ .remove = qcom_iommu_device_remove,
+};
+
+static int __init qcom_iommu_init(void)
+{
+ int ret;
+
+ ret = platform_driver_register(&qcom_iommu_ctx_driver);
+ if (ret)
+ return ret;
+
+ ret = platform_driver_register(&qcom_iommu_driver);
+ if (ret)
+ platform_driver_unregister(&qcom_iommu_ctx_driver);
+
+ return ret;
+}
+
+static void __exit qcom_iommu_exit(void)
+{
+ platform_driver_unregister(&qcom_iommu_driver);
+ platform_driver_unregister(&qcom_iommu_ctx_driver);
+}
+
+module_init(qcom_iommu_init);
+module_exit(qcom_iommu_exit);
+
+IOMMU_OF_DECLARE(qcom_iommu_dev, "qcom,msm-iommu-v1", NULL);
+
+MODULE_DESCRIPTION("IOMMU API for QCOM IOMMU v1 implementations");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index 4ba48a26b389..9d991c2d8767 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -90,7 +90,9 @@ struct rk_iommu {
struct device *dev;
void __iomem **bases;
int num_mmu;
- int irq;
+ int *irq;
+ int num_irq;
+ bool reset_disabled;
struct iommu_device iommu;
struct list_head node; /* entry in rk_iommu_domain.iommus */
struct iommu_domain *domain; /* domain to which iommu is attached */
@@ -414,6 +416,9 @@ static int rk_iommu_force_reset(struct rk_iommu *iommu)
int ret, i;
u32 dte_addr;
+ if (iommu->reset_disabled)
+ return 0;
+
/*
* Check if register DTE_ADDR is working by writing DTE_ADDR_DUMMY
* and verifying that upper 5 nybbles are read back.
@@ -825,10 +830,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
iommu->domain = domain;
- ret = devm_request_irq(iommu->dev, iommu->irq, rk_iommu_irq,
- IRQF_SHARED, dev_name(dev), iommu);
- if (ret)
- return ret;
+ for (i = 0; i < iommu->num_irq; i++) {
+ ret = devm_request_irq(iommu->dev, iommu->irq[i], rk_iommu_irq,
+ IRQF_SHARED, dev_name(dev), iommu);
+ if (ret)
+ return ret;
+ }
for (i = 0; i < iommu->num_mmu; i++) {
rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR,
@@ -878,7 +885,8 @@ static void rk_iommu_detach_device(struct iommu_domain *domain,
}
rk_iommu_disable_stall(iommu);
- devm_free_irq(iommu->dev, iommu->irq, iommu);
+ for (i = 0; i < iommu->num_irq; i++)
+ devm_free_irq(iommu->dev, iommu->irq[i], iommu);
iommu->domain = NULL;
@@ -1008,20 +1016,20 @@ static int rk_iommu_group_set_iommudata(struct iommu_group *group,
ret = of_parse_phandle_with_args(np, "iommus", "#iommu-cells", 0,
&args);
if (ret) {
- dev_err(dev, "of_parse_phandle_with_args(%s) => %d\n",
- np->full_name, ret);
+ dev_err(dev, "of_parse_phandle_with_args(%pOF) => %d\n",
+ np, ret);
return ret;
}
if (args.args_count != 0) {
- dev_err(dev, "incorrect number of iommu params found for %s (found %d, expected 0)\n",
- args.np->full_name, args.args_count);
+ dev_err(dev, "incorrect number of iommu params found for %pOF (found %d, expected 0)\n",
+ args.np, args.args_count);
return -EINVAL;
}
pd = of_find_device_by_node(args.np);
of_node_put(args.np);
if (!pd) {
- dev_err(dev, "iommu %s not found\n", args.np->full_name);
+ dev_err(dev, "iommu %pOF not found\n", args.np);
return -EPROBE_DEFER;
}
@@ -1157,12 +1165,28 @@ static int rk_iommu_probe(struct platform_device *pdev)
if (iommu->num_mmu == 0)
return PTR_ERR(iommu->bases[0]);
- iommu->irq = platform_get_irq(pdev, 0);
- if (iommu->irq < 0) {
- dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq);
+ iommu->num_irq = platform_irq_count(pdev);
+ if (iommu->num_irq < 0)
+ return iommu->num_irq;
+ if (iommu->num_irq == 0)
return -ENXIO;
+
+ iommu->irq = devm_kcalloc(dev, iommu->num_irq, sizeof(*iommu->irq),
+ GFP_KERNEL);
+ if (!iommu->irq)
+ return -ENOMEM;
+
+ for (i = 0; i < iommu->num_irq; i++) {
+ iommu->irq[i] = platform_get_irq(pdev, i);
+ if (iommu->irq[i] < 0) {
+ dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq[i]);
+ return -ENXIO;
+ }
}
+ iommu->reset_disabled = device_property_read_bool(dev,
+ "rockchip,disable-mmu-reset");
+
err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));
if (err)
return err;
diff --git a/drivers/iommu/s390-iommu.c b/drivers/iommu/s390-iommu.c
index 8788640756a7..0e2f31f9032b 100644
--- a/drivers/iommu/s390-iommu.c
+++ b/drivers/iommu/s390-iommu.c
@@ -18,6 +18,8 @@
*/
#define S390_IOMMU_PGSIZES (~0xFFFUL)
+static const struct iommu_ops s390_iommu_ops;
+
struct s390_domain {
struct iommu_domain domain;
struct list_head devices;
@@ -166,11 +168,13 @@ static void s390_iommu_detach_device(struct iommu_domain *domain,
static int s390_iommu_add_device(struct device *dev)
{
struct iommu_group *group = iommu_group_get_for_dev(dev);
+ struct zpci_dev *zdev = to_pci_dev(dev)->sysdata;
if (IS_ERR(group))
return PTR_ERR(group);
iommu_group_put(group);
+ iommu_device_link(&zdev->iommu_dev, dev);
return 0;
}
@@ -197,6 +201,7 @@ static void s390_iommu_remove_device(struct device *dev)
s390_iommu_detach_device(domain, dev);
}
+ iommu_device_unlink(&zdev->iommu_dev, dev);
iommu_group_remove_device(dev);
}
@@ -327,7 +332,37 @@ static size_t s390_iommu_unmap(struct iommu_domain *domain,
return size;
}
-static struct iommu_ops s390_iommu_ops = {
+int zpci_init_iommu(struct zpci_dev *zdev)
+{
+ int rc = 0;
+
+ rc = iommu_device_sysfs_add(&zdev->iommu_dev, NULL, NULL,
+ "s390-iommu.%08x", zdev->fid);
+ if (rc)
+ goto out_err;
+
+ iommu_device_set_ops(&zdev->iommu_dev, &s390_iommu_ops);
+
+ rc = iommu_device_register(&zdev->iommu_dev);
+ if (rc)
+ goto out_sysfs;
+
+ return 0;
+
+out_sysfs:
+ iommu_device_sysfs_remove(&zdev->iommu_dev);
+
+out_err:
+ return rc;
+}
+
+void zpci_destroy_iommu(struct zpci_dev *zdev)
+{
+ iommu_device_unregister(&zdev->iommu_dev);
+ iommu_device_sysfs_remove(&zdev->iommu_dev);
+}
+
+static const struct iommu_ops s390_iommu_ops = {
.capable = s390_iommu_capable,
.domain_alloc = s390_domain_alloc,
.domain_free = s390_domain_free,
diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c
index 37e708fdbb5a..b62f790ad1ba 100644
--- a/drivers/iommu/tegra-gart.c
+++ b/drivers/iommu/tegra-gart.c
@@ -61,6 +61,8 @@ struct gart_device {
struct list_head client;
spinlock_t client_lock; /* for client list */
struct device *dev;
+
+ struct iommu_device iommu; /* IOMMU Core handle */
};
struct gart_domain {
@@ -334,12 +336,35 @@ static bool gart_iommu_capable(enum iommu_cap cap)
return false;
}
+static int gart_iommu_add_device(struct device *dev)
+{
+ struct iommu_group *group = iommu_group_get_for_dev(dev);
+
+ if (IS_ERR(group))
+ return PTR_ERR(group);
+
+ iommu_group_put(group);
+
+ iommu_device_link(&gart_handle->iommu, dev);
+
+ return 0;
+}
+
+static void gart_iommu_remove_device(struct device *dev)
+{
+ iommu_group_remove_device(dev);
+ iommu_device_unlink(&gart_handle->iommu, dev);
+}
+
static const struct iommu_ops gart_iommu_ops = {
.capable = gart_iommu_capable,
.domain_alloc = gart_iommu_domain_alloc,
.domain_free = gart_iommu_domain_free,
.attach_dev = gart_iommu_attach_dev,
.detach_dev = gart_iommu_detach_dev,
+ .add_device = gart_iommu_add_device,
+ .remove_device = gart_iommu_remove_device,
+ .device_group = generic_device_group,
.map = gart_iommu_map,
.map_sg = default_iommu_map_sg,
.unmap = gart_iommu_unmap,
@@ -378,6 +403,7 @@ static int tegra_gart_probe(struct platform_device *pdev)
struct resource *res, *res_remap;
void __iomem *gart_regs;
struct device *dev = &pdev->dev;
+ int ret;
if (gart_handle)
return -EIO;
@@ -404,6 +430,22 @@ static int tegra_gart_probe(struct platform_device *pdev)
return -ENXIO;
}
+ ret = iommu_device_sysfs_add(&gart->iommu, &pdev->dev, NULL,
+ dev_name(&pdev->dev));
+ if (ret) {
+ dev_err(dev, "Failed to register IOMMU in sysfs\n");
+ return ret;
+ }
+
+ iommu_device_set_ops(&gart->iommu, &gart_iommu_ops);
+
+ ret = iommu_device_register(&gart->iommu);
+ if (ret) {
+ dev_err(dev, "Failed to register IOMMU\n");
+ iommu_device_sysfs_remove(&gart->iommu);
+ return ret;
+ }
+
gart->dev = &pdev->dev;
spin_lock_init(&gart->pte_lock);
spin_lock_init(&gart->client_lock);
@@ -430,6 +472,9 @@ static int tegra_gart_remove(struct platform_device *pdev)
{
struct gart_device *gart = platform_get_drvdata(pdev);
+ iommu_device_unregister(&gart->iommu);
+ iommu_device_sysfs_remove(&gart->iommu);
+
writel(0, gart->regs + GART_CONFIG);
if (gart->savedata)
vfree(gart->savedata);
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index eeb19f560a05..3b6449e2cbf1 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -36,6 +36,8 @@ struct tegra_smmu {
struct list_head list;
struct dentry *debugfs;
+
+ struct iommu_device iommu; /* IOMMU Core code handle */
};
struct tegra_smmu_as {
@@ -704,6 +706,7 @@ static struct tegra_smmu *tegra_smmu_find(struct device_node *np)
static int tegra_smmu_add_device(struct device *dev)
{
struct device_node *np = dev->of_node;
+ struct iommu_group *group;
struct of_phandle_args args;
unsigned int index = 0;
@@ -719,18 +722,33 @@ static int tegra_smmu_add_device(struct device *dev)
* first match.
*/
dev->archdata.iommu = smmu;
+
+ iommu_device_link(&smmu->iommu, dev);
+
break;
}
index++;
}
+ group = iommu_group_get_for_dev(dev);
+ if (IS_ERR(group))
+ return PTR_ERR(group);
+
+ iommu_group_put(group);
+
return 0;
}
static void tegra_smmu_remove_device(struct device *dev)
{
+ struct tegra_smmu *smmu = dev->archdata.iommu;
+
+ if (smmu)
+ iommu_device_unlink(&smmu->iommu, dev);
+
dev->archdata.iommu = NULL;
+ iommu_group_remove_device(dev);
}
static const struct iommu_ops tegra_smmu_ops = {
@@ -741,6 +759,7 @@ static const struct iommu_ops tegra_smmu_ops = {
.detach_dev = tegra_smmu_detach_dev,
.add_device = tegra_smmu_add_device,
.remove_device = tegra_smmu_remove_device,
+ .device_group = generic_device_group,
.map = tegra_smmu_map,
.unmap = tegra_smmu_unmap,
.map_sg = default_iommu_map_sg,
@@ -930,9 +949,24 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
tegra_smmu_ahb_enable();
+ err = iommu_device_sysfs_add(&smmu->iommu, dev, NULL, dev_name(dev));
+ if (err)
+ return ERR_PTR(err);
+
+ iommu_device_set_ops(&smmu->iommu, &tegra_smmu_ops);
+
+ err = iommu_device_register(&smmu->iommu);
+ if (err) {
+ iommu_device_sysfs_remove(&smmu->iommu);
+ return ERR_PTR(err);
+ }
+
err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
- if (err < 0)
+ if (err < 0) {
+ iommu_device_unregister(&smmu->iommu);
+ iommu_device_sysfs_remove(&smmu->iommu);
return ERR_PTR(err);
+ }
if (IS_ENABLED(CONFIG_DEBUG_FS))
tegra_smmu_debugfs_init(smmu);
@@ -942,6 +976,9 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
void tegra_smmu_remove(struct tegra_smmu *smmu)
{
+ iommu_device_unregister(&smmu->iommu);
+ iommu_device_sysfs_remove(&smmu->iommu);
+
if (IS_ENABLED(CONFIG_DEBUG_FS))
tegra_smmu_debugfs_exit(smmu);
}
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 519149ec9053..b5df99c6f680 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -1042,7 +1042,7 @@ static int get_cpu_number(struct device_node *dn)
{
const __be32 *cell;
u64 hwid;
- int i;
+ int cpu;
cell = of_get_property(dn, "reg", NULL);
if (!cell)
@@ -1056,9 +1056,9 @@ static int get_cpu_number(struct device_node *dn)
if (hwid & ~MPIDR_HWID_BITMASK)
return -1;
- for (i = 0; i < num_possible_cpus(); i++)
- if (cpu_logical_map(i) == hwid)
- return i;
+ for_each_possible_cpu(cpu)
+ if (cpu_logical_map(cpu) == hwid)
+ return cpu;
return -1;
}
diff --git a/drivers/irqchip/irq-gic-v4.c b/drivers/irqchip/irq-gic-v4.c
index 2370e6d9e603..cd0bcc3b7e33 100644
--- a/drivers/irqchip/irq-gic-v4.c
+++ b/drivers/irqchip/irq-gic-v4.c
@@ -173,7 +173,9 @@ int its_map_vlpi(int irq, struct its_vlpi_map *map)
{
struct its_cmd_info info = {
.cmd_type = MAP_VLPI,
- .map = map,
+ {
+ .map = map,
+ },
};
/*
@@ -189,7 +191,9 @@ int its_get_vlpi(int irq, struct its_vlpi_map *map)
{
struct its_cmd_info info = {
.cmd_type = GET_VLPI,
- .map = map,
+ {
+ .map = map,
+ },
};
return irq_set_vcpu_affinity(irq, &info);
@@ -205,7 +209,9 @@ int its_prop_update_vlpi(int irq, u8 config, bool inv)
{
struct its_cmd_info info = {
.cmd_type = inv ? PROP_UPDATE_AND_INV_VLPI : PROP_UPDATE_VLPI,
- .config = config,
+ {
+ .config = config,
+ },
};
return irq_set_vcpu_affinity(irq, &info);
diff --git a/drivers/irqchip/irq-mips-cpu.c b/drivers/irqchip/irq-mips-cpu.c
index 14461cbfab2f..66f97fde13d8 100644
--- a/drivers/irqchip/irq-mips-cpu.c
+++ b/drivers/irqchip/irq-mips-cpu.c
@@ -101,7 +101,7 @@ static void mips_mt_send_ipi(struct irq_data *d, unsigned int cpu)
local_irq_save(flags);
/* We can only send IPIs to VPEs within the local core */
- WARN_ON(cpu_data[cpu].core != current_cpu_data.core);
+ WARN_ON(!cpus_are_siblings(smp_processor_id(), cpu));
vpflags = dvpe();
settc(cpu_vpe_id(&cpu_data[cpu]));
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
index b3a60da088db..c90976d7e53c 100644
--- a/drivers/irqchip/irq-mips-gic.c
+++ b/drivers/irqchip/irq-mips-gic.c
@@ -12,27 +12,38 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/irqchip.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/of_address.h>
+#include <linux/percpu.h>
#include <linux/sched.h>
#include <linux/smp.h>
-#include <asm/mips-cm.h>
+#include <asm/mips-cps.h>
#include <asm/setup.h>
#include <asm/traps.h>
#include <dt-bindings/interrupt-controller/mips-gic.h>
-unsigned int gic_present;
+#define GIC_MAX_INTRS 256
+#define GIC_MAX_LONGS BITS_TO_LONGS(GIC_MAX_INTRS)
-struct gic_pcpu_mask {
- DECLARE_BITMAP(pcpu_mask, GIC_MAX_INTRS);
-};
+/* Add 2 to convert GIC CPU pin to core interrupt */
+#define GIC_CPU_PIN_OFFSET 2
+
+/* Mapped interrupt to pin X, then GIC will generate the vector (X+1). */
+#define GIC_PIN_TO_VEC_OFFSET 1
+
+/* Convert between local/shared IRQ number and GIC HW IRQ number. */
+#define GIC_LOCAL_HWIRQ_BASE 0
+#define GIC_LOCAL_TO_HWIRQ(x) (GIC_LOCAL_HWIRQ_BASE + (x))
+#define GIC_HWIRQ_TO_LOCAL(x) ((x) - GIC_LOCAL_HWIRQ_BASE)
+#define GIC_SHARED_HWIRQ_BASE GIC_NUM_LOCAL_INTRS
+#define GIC_SHARED_TO_HWIRQ(x) (GIC_SHARED_HWIRQ_BASE + (x))
+#define GIC_HWIRQ_TO_SHARED(x) ((x) - GIC_SHARED_HWIRQ_BASE)
+
+void __iomem *mips_gic_base;
-static unsigned long __gic_base_addr;
+DEFINE_PER_CPU_READ_MOSTLY(unsigned long[GIC_MAX_LONGS], pcpu_masks);
-static void __iomem *gic_base;
-static struct gic_pcpu_mask pcpu_masks[NR_CPUS];
static DEFINE_SPINLOCK(gic_lock);
static struct irq_domain *gic_irq_domain;
static struct irq_domain *gic_ipi_domain;
@@ -44,202 +55,13 @@ static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller;
DECLARE_BITMAP(ipi_resrv, GIC_MAX_INTRS);
DECLARE_BITMAP(ipi_available, GIC_MAX_INTRS);
-static void __gic_irq_dispatch(void);
-
-static inline u32 gic_read32(unsigned int reg)
-{
- return __raw_readl(gic_base + reg);
-}
-
-static inline u64 gic_read64(unsigned int reg)
-{
- return __raw_readq(gic_base + reg);
-}
-
-static inline unsigned long gic_read(unsigned int reg)
-{
- if (!mips_cm_is64)
- return gic_read32(reg);
- else
- return gic_read64(reg);
-}
-
-static inline void gic_write32(unsigned int reg, u32 val)
-{
- return __raw_writel(val, gic_base + reg);
-}
-
-static inline void gic_write64(unsigned int reg, u64 val)
-{
- return __raw_writeq(val, gic_base + reg);
-}
-
-static inline void gic_write(unsigned int reg, unsigned long val)
-{
- if (!mips_cm_is64)
- return gic_write32(reg, (u32)val);
- else
- return gic_write64(reg, (u64)val);
-}
-
-static inline void gic_update_bits(unsigned int reg, unsigned long mask,
- unsigned long val)
-{
- unsigned long regval;
-
- regval = gic_read(reg);
- regval &= ~mask;
- regval |= val;
- gic_write(reg, regval);
-}
-
-static inline void gic_reset_mask(unsigned int intr)
-{
- gic_write(GIC_REG(SHARED, GIC_SH_RMASK) + GIC_INTR_OFS(intr),
- 1ul << GIC_INTR_BIT(intr));
-}
-
-static inline void gic_set_mask(unsigned int intr)
-{
- gic_write(GIC_REG(SHARED, GIC_SH_SMASK) + GIC_INTR_OFS(intr),
- 1ul << GIC_INTR_BIT(intr));
-}
-
-static inline void gic_set_polarity(unsigned int intr, unsigned int pol)
-{
- gic_update_bits(GIC_REG(SHARED, GIC_SH_SET_POLARITY) +
- GIC_INTR_OFS(intr), 1ul << GIC_INTR_BIT(intr),
- (unsigned long)pol << GIC_INTR_BIT(intr));
-}
-
-static inline void gic_set_trigger(unsigned int intr, unsigned int trig)
-{
- gic_update_bits(GIC_REG(SHARED, GIC_SH_SET_TRIGGER) +
- GIC_INTR_OFS(intr), 1ul << GIC_INTR_BIT(intr),
- (unsigned long)trig << GIC_INTR_BIT(intr));
-}
-
-static inline void gic_set_dual_edge(unsigned int intr, unsigned int dual)
-{
- gic_update_bits(GIC_REG(SHARED, GIC_SH_SET_DUAL) + GIC_INTR_OFS(intr),
- 1ul << GIC_INTR_BIT(intr),
- (unsigned long)dual << GIC_INTR_BIT(intr));
-}
-
-static inline void gic_map_to_pin(unsigned int intr, unsigned int pin)
-{
- gic_write32(GIC_REG(SHARED, GIC_SH_INTR_MAP_TO_PIN_BASE) +
- GIC_SH_MAP_TO_PIN(intr), GIC_MAP_TO_PIN_MSK | pin);
-}
-
-static inline void gic_map_to_vpe(unsigned int intr, unsigned int vpe)
-{
- gic_write(GIC_REG(SHARED, GIC_SH_INTR_MAP_TO_VPE_BASE) +
- GIC_SH_MAP_TO_VPE_REG_OFF(intr, vpe),
- GIC_SH_MAP_TO_VPE_REG_BIT(vpe));
-}
-
-#ifdef CONFIG_CLKSRC_MIPS_GIC
-u64 notrace gic_read_count(void)
-{
- unsigned int hi, hi2, lo;
-
- if (mips_cm_is64)
- return (u64)gic_read(GIC_REG(SHARED, GIC_SH_COUNTER));
-
- do {
- hi = gic_read32(GIC_REG(SHARED, GIC_SH_COUNTER_63_32));
- lo = gic_read32(GIC_REG(SHARED, GIC_SH_COUNTER_31_00));
- hi2 = gic_read32(GIC_REG(SHARED, GIC_SH_COUNTER_63_32));
- } while (hi2 != hi);
-
- return (((u64) hi) << 32) + lo;
-}
-
-unsigned int gic_get_count_width(void)
+static void gic_clear_pcpu_masks(unsigned int intr)
{
- unsigned int bits, config;
-
- config = gic_read(GIC_REG(SHARED, GIC_SH_CONFIG));
- bits = 32 + 4 * ((config & GIC_SH_CONFIG_COUNTBITS_MSK) >>
- GIC_SH_CONFIG_COUNTBITS_SHF);
-
- return bits;
-}
-
-void notrace gic_write_compare(u64 cnt)
-{
- if (mips_cm_is64) {
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE), cnt);
- } else {
- gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_HI),
- (int)(cnt >> 32));
- gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_LO),
- (int)(cnt & 0xffffffff));
- }
-}
-
-void notrace gic_write_cpu_compare(u64 cnt, int cpu)
-{
- unsigned long flags;
-
- local_irq_save(flags);
-
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR), mips_cm_vp_id(cpu));
-
- if (mips_cm_is64) {
- gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE), cnt);
- } else {
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_HI),
- (int)(cnt >> 32));
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_LO),
- (int)(cnt & 0xffffffff));
- }
-
- local_irq_restore(flags);
-}
-
-u64 gic_read_compare(void)
-{
- unsigned int hi, lo;
-
- if (mips_cm_is64)
- return (u64)gic_read(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE));
-
- hi = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_HI));
- lo = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_COMPARE_LO));
-
- return (((u64) hi) << 32) + lo;
-}
-
-void gic_start_count(void)
-{
- u32 gicconfig;
-
- /* Start the counter */
- gicconfig = gic_read(GIC_REG(SHARED, GIC_SH_CONFIG));
- gicconfig &= ~(1 << GIC_SH_CONFIG_COUNTSTOP_SHF);
- gic_write(GIC_REG(SHARED, GIC_SH_CONFIG), gicconfig);
-}
-
-void gic_stop_count(void)
-{
- u32 gicconfig;
-
- /* Stop the counter */
- gicconfig = gic_read(GIC_REG(SHARED, GIC_SH_CONFIG));
- gicconfig |= 1 << GIC_SH_CONFIG_COUNTSTOP_SHF;
- gic_write(GIC_REG(SHARED, GIC_SH_CONFIG), gicconfig);
-}
-
-#endif
-
-unsigned gic_read_local_vp_id(void)
-{
- unsigned long ident;
+ unsigned int i;
- ident = gic_read(GIC_REG(VPE_LOCAL, GIC_VP_IDENT));
- return ident & GIC_VP_IDENT_VCNUM_MSK;
+ /* Clear the interrupt's bit in all pcpu_masks */
+ for_each_possible_cpu(i)
+ clear_bit(intr, per_cpu_ptr(pcpu_masks, i));
}
static bool gic_local_irq_is_routable(int intr)
@@ -250,17 +72,17 @@ static bool gic_local_irq_is_routable(int intr)
if (cpu_has_veic)
return true;
- vpe_ctl = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_CTL));
+ vpe_ctl = read_gic_vl_ctl();
switch (intr) {
case GIC_LOCAL_INT_TIMER:
- return vpe_ctl & GIC_VPE_CTL_TIMER_RTBL_MSK;
+ return vpe_ctl & GIC_VX_CTL_TIMER_ROUTABLE;
case GIC_LOCAL_INT_PERFCTR:
- return vpe_ctl & GIC_VPE_CTL_PERFCNT_RTBL_MSK;
+ return vpe_ctl & GIC_VX_CTL_PERFCNT_ROUTABLE;
case GIC_LOCAL_INT_FDC:
- return vpe_ctl & GIC_VPE_CTL_FDC_RTBL_MSK;
+ return vpe_ctl & GIC_VX_CTL_FDC_ROUTABLE;
case GIC_LOCAL_INT_SWINT0:
case GIC_LOCAL_INT_SWINT1:
- return vpe_ctl & GIC_VPE_CTL_SWINT_RTBL_MSK;
+ return vpe_ctl & GIC_VX_CTL_SWINT_ROUTABLE;
default:
return true;
}
@@ -272,15 +94,14 @@ static void gic_bind_eic_interrupt(int irq, int set)
irq -= GIC_PIN_TO_VEC_OFFSET;
/* Set irq to use shadow set */
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_EIC_SHADOW_SET_BASE) +
- GIC_VPE_EIC_SS(irq), set);
+ write_gic_vl_eic_shadow_set(irq, set);
}
static void gic_send_ipi(struct irq_data *d, unsigned int cpu)
{
irq_hw_number_t hwirq = GIC_HWIRQ_TO_SHARED(irqd_to_hwirq(d));
- gic_write(GIC_REG(SHARED, GIC_SH_WEDGE), GIC_SH_WEDGE_SET(hwirq));
+ write_gic_wedge(GIC_WEDGE_RW | hwirq);
}
int gic_get_c0_compare_int(void)
@@ -316,47 +137,22 @@ int gic_get_c0_fdc_int(void)
GIC_LOCAL_TO_HWIRQ(GIC_LOCAL_INT_FDC));
}
-int gic_get_usm_range(struct resource *gic_usm_res)
-{
- if (!gic_present)
- return -1;
-
- gic_usm_res->start = __gic_base_addr + USM_VISIBLE_SECTION_OFS;
- gic_usm_res->end = gic_usm_res->start + (USM_VISIBLE_SECTION_SIZE - 1);
-
- return 0;
-}
-
static void gic_handle_shared_int(bool chained)
{
- unsigned int i, intr, virq, gic_reg_step = mips_cm_is64 ? 8 : 4;
+ unsigned int intr, virq;
unsigned long *pcpu_mask;
- unsigned long pending_reg, intrmask_reg;
DECLARE_BITMAP(pending, GIC_MAX_INTRS);
- DECLARE_BITMAP(intrmask, GIC_MAX_INTRS);
/* Get per-cpu bitmaps */
- pcpu_mask = pcpu_masks[smp_processor_id()].pcpu_mask;
-
- pending_reg = GIC_REG(SHARED, GIC_SH_PEND);
- intrmask_reg = GIC_REG(SHARED, GIC_SH_MASK);
-
- for (i = 0; i < BITS_TO_LONGS(gic_shared_intrs); i++) {
- pending[i] = gic_read(pending_reg);
- intrmask[i] = gic_read(intrmask_reg);
- pending_reg += gic_reg_step;
- intrmask_reg += gic_reg_step;
+ pcpu_mask = this_cpu_ptr(pcpu_masks);
- if (!IS_ENABLED(CONFIG_64BIT) || mips_cm_is64)
- continue;
-
- pending[i] |= (u64)gic_read(pending_reg) << 32;
- intrmask[i] |= (u64)gic_read(intrmask_reg) << 32;
- pending_reg += gic_reg_step;
- intrmask_reg += gic_reg_step;
- }
+ if (mips_cm_is64)
+ __ioread64_copy(pending, addr_gic_pend(),
+ DIV_ROUND_UP(gic_shared_intrs, 64));
+ else
+ __ioread32_copy(pending, addr_gic_pend(),
+ DIV_ROUND_UP(gic_shared_intrs, 32));
- bitmap_and(pending, pending, intrmask, gic_shared_intrs);
bitmap_and(pending, pending, pcpu_mask, gic_shared_intrs);
for_each_set_bit(intr, pending, gic_shared_intrs) {
@@ -371,19 +167,29 @@ static void gic_handle_shared_int(bool chained)
static void gic_mask_irq(struct irq_data *d)
{
- gic_reset_mask(GIC_HWIRQ_TO_SHARED(d->hwirq));
+ unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq);
+
+ write_gic_rmask(intr);
+ gic_clear_pcpu_masks(intr);
}
static void gic_unmask_irq(struct irq_data *d)
{
- gic_set_mask(GIC_HWIRQ_TO_SHARED(d->hwirq));
+ unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq);
+ unsigned int cpu;
+
+ write_gic_smask(intr);
+
+ gic_clear_pcpu_masks(intr);
+ cpu = cpumask_first(irq_data_get_effective_affinity_mask(d));
+ set_bit(intr, per_cpu_ptr(pcpu_masks, cpu));
}
static void gic_ack_irq(struct irq_data *d)
{
unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
- gic_write(GIC_REG(SHARED, GIC_SH_WEDGE), GIC_SH_WEDGE_CLR(irq));
+ write_gic_wedge(irq);
}
static int gic_set_type(struct irq_data *d, unsigned int type)
@@ -395,34 +201,34 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
spin_lock_irqsave(&gic_lock, flags);
switch (type & IRQ_TYPE_SENSE_MASK) {
case IRQ_TYPE_EDGE_FALLING:
- gic_set_polarity(irq, GIC_POL_NEG);
- gic_set_trigger(irq, GIC_TRIG_EDGE);
- gic_set_dual_edge(irq, GIC_TRIG_DUAL_DISABLE);
+ change_gic_pol(irq, GIC_POL_FALLING_EDGE);
+ change_gic_trig(irq, GIC_TRIG_EDGE);
+ change_gic_dual(irq, GIC_DUAL_SINGLE);
is_edge = true;
break;
case IRQ_TYPE_EDGE_RISING:
- gic_set_polarity(irq, GIC_POL_POS);
- gic_set_trigger(irq, GIC_TRIG_EDGE);
- gic_set_dual_edge(irq, GIC_TRIG_DUAL_DISABLE);
+ change_gic_pol(irq, GIC_POL_RISING_EDGE);
+ change_gic_trig(irq, GIC_TRIG_EDGE);
+ change_gic_dual(irq, GIC_DUAL_SINGLE);
is_edge = true;
break;
case IRQ_TYPE_EDGE_BOTH:
/* polarity is irrelevant in this case */
- gic_set_trigger(irq, GIC_TRIG_EDGE);
- gic_set_dual_edge(irq, GIC_TRIG_DUAL_ENABLE);
+ change_gic_trig(irq, GIC_TRIG_EDGE);
+ change_gic_dual(irq, GIC_DUAL_DUAL);
is_edge = true;
break;
case IRQ_TYPE_LEVEL_LOW:
- gic_set_polarity(irq, GIC_POL_NEG);
- gic_set_trigger(irq, GIC_TRIG_LEVEL);
- gic_set_dual_edge(irq, GIC_TRIG_DUAL_DISABLE);
+ change_gic_pol(irq, GIC_POL_ACTIVE_LOW);
+ change_gic_trig(irq, GIC_TRIG_LEVEL);
+ change_gic_dual(irq, GIC_DUAL_SINGLE);
is_edge = false;
break;
case IRQ_TYPE_LEVEL_HIGH:
default:
- gic_set_polarity(irq, GIC_POL_POS);
- gic_set_trigger(irq, GIC_TRIG_LEVEL);
- gic_set_dual_edge(irq, GIC_TRIG_DUAL_DISABLE);
+ change_gic_pol(irq, GIC_POL_ACTIVE_HIGH);
+ change_gic_trig(irq, GIC_TRIG_LEVEL);
+ change_gic_dual(irq, GIC_DUAL_SINGLE);
is_edge = false;
break;
}
@@ -443,32 +249,28 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
bool force)
{
unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
- cpumask_t tmp = CPU_MASK_NONE;
- unsigned long flags;
- int i, cpu;
+ unsigned long flags;
+ unsigned int cpu;
- cpumask_and(&tmp, cpumask, cpu_online_mask);
- if (cpumask_empty(&tmp))
+ cpu = cpumask_first_and(cpumask, cpu_online_mask);
+ if (cpu >= NR_CPUS)
return -EINVAL;
- cpu = cpumask_first(&tmp);
-
/* Assumption : cpumask refers to a single CPU */
spin_lock_irqsave(&gic_lock, flags);
/* Re-route this IRQ */
- gic_map_to_vpe(irq, mips_cm_vp_id(cpu));
+ write_gic_map_vp(irq, BIT(mips_cm_vp_id(cpu)));
/* Update the pcpu_masks */
- for (i = 0; i < min(gic_vpes, NR_CPUS); i++)
- clear_bit(irq, pcpu_masks[i].pcpu_mask);
- set_bit(irq, pcpu_masks[cpu].pcpu_mask);
+ gic_clear_pcpu_masks(irq);
+ if (read_gic_mask(irq))
+ set_bit(irq, per_cpu_ptr(pcpu_masks, cpu));
- cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
irq_data_update_effective_affinity(d, cpumask_of(cpu));
spin_unlock_irqrestore(&gic_lock, flags);
- return IRQ_SET_MASK_OK_NOCOPY;
+ return IRQ_SET_MASK_OK;
}
#endif
@@ -499,8 +301,8 @@ static void gic_handle_local_int(bool chained)
unsigned long pending, masked;
unsigned int intr, virq;
- pending = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_PEND));
- masked = gic_read32(GIC_REG(VPE_LOCAL, GIC_VPE_MASK));
+ pending = read_gic_vl_pend();
+ masked = read_gic_vl_mask();
bitmap_and(&pending, &pending, &masked, GIC_NUM_LOCAL_INTRS);
@@ -518,14 +320,14 @@ static void gic_mask_local_irq(struct irq_data *d)
{
int intr = GIC_HWIRQ_TO_LOCAL(d->hwirq);
- gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_RMASK), 1 << intr);
+ write_gic_vl_rmask(BIT(intr));
}
static void gic_unmask_local_irq(struct irq_data *d)
{
int intr = GIC_HWIRQ_TO_LOCAL(d->hwirq);
- gic_write32(GIC_REG(VPE_LOCAL, GIC_VPE_SMASK), 1 << intr);
+ write_gic_vl_smask(BIT(intr));
}
static struct irq_chip gic_local_irq_controller = {
@@ -542,9 +344,8 @@ static void gic_mask_local_irq_all_vpes(struct irq_data *d)
spin_lock_irqsave(&gic_lock, flags);
for (i = 0; i < gic_vpes; i++) {
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
- mips_cm_vp_id(i));
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_RMASK), 1 << intr);
+ write_gic_vl_other(mips_cm_vp_id(i));
+ write_gic_vo_rmask(BIT(intr));
}
spin_unlock_irqrestore(&gic_lock, flags);
}
@@ -557,9 +358,8 @@ static void gic_unmask_local_irq_all_vpes(struct irq_data *d)
spin_lock_irqsave(&gic_lock, flags);
for (i = 0; i < gic_vpes; i++) {
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
- mips_cm_vp_id(i));
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_SMASK), 1 << intr);
+ write_gic_vl_other(mips_cm_vp_id(i));
+ write_gic_vo_smask(BIT(intr));
}
spin_unlock_irqrestore(&gic_lock, flags);
}
@@ -582,103 +382,54 @@ static void gic_irq_dispatch(struct irq_desc *desc)
gic_handle_shared_int(true);
}
-static void __init gic_basic_init(void)
-{
- unsigned int i;
-
- board_bind_eic_interrupt = &gic_bind_eic_interrupt;
-
- /* Setup defaults */
- for (i = 0; i < gic_shared_intrs; i++) {
- gic_set_polarity(i, GIC_POL_POS);
- gic_set_trigger(i, GIC_TRIG_LEVEL);
- gic_reset_mask(i);
- }
-
- for (i = 0; i < gic_vpes; i++) {
- unsigned int j;
-
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
- mips_cm_vp_id(i));
- for (j = 0; j < GIC_NUM_LOCAL_INTRS; j++) {
- if (!gic_local_irq_is_routable(j))
- continue;
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_RMASK), 1 << j);
- }
- }
-}
-
static int gic_local_irq_domain_map(struct irq_domain *d, unsigned int virq,
irq_hw_number_t hw)
{
int intr = GIC_HWIRQ_TO_LOCAL(hw);
- int ret = 0;
int i;
unsigned long flags;
+ u32 val;
if (!gic_local_irq_is_routable(intr))
return -EPERM;
+ if (intr > GIC_LOCAL_INT_FDC) {
+ pr_err("Invalid local IRQ %d\n", intr);
+ return -EINVAL;
+ }
+
+ if (intr == GIC_LOCAL_INT_TIMER) {
+ /* CONFIG_MIPS_CMP workaround (see __gic_init) */
+ val = GIC_MAP_PIN_MAP_TO_PIN | timer_cpu_pin;
+ } else {
+ val = GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin;
+ }
+
spin_lock_irqsave(&gic_lock, flags);
for (i = 0; i < gic_vpes; i++) {
- u32 val = GIC_MAP_TO_PIN_MSK | gic_cpu_pin;
-
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
- mips_cm_vp_id(i));
-
- switch (intr) {
- case GIC_LOCAL_INT_WD:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_WD_MAP), val);
- break;
- case GIC_LOCAL_INT_COMPARE:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP),
- val);
- break;
- case GIC_LOCAL_INT_TIMER:
- /* CONFIG_MIPS_CMP workaround (see __gic_init) */
- val = GIC_MAP_TO_PIN_MSK | timer_cpu_pin;
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP),
- val);
- break;
- case GIC_LOCAL_INT_PERFCTR:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_PERFCTR_MAP),
- val);
- break;
- case GIC_LOCAL_INT_SWINT0:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_SWINT0_MAP),
- val);
- break;
- case GIC_LOCAL_INT_SWINT1:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_SWINT1_MAP),
- val);
- break;
- case GIC_LOCAL_INT_FDC:
- gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_FDC_MAP), val);
- break;
- default:
- pr_err("Invalid local IRQ %d\n", intr);
- ret = -EINVAL;
- break;
- }
+ write_gic_vl_other(mips_cm_vp_id(i));
+ write_gic_vo_map(intr, val);
}
spin_unlock_irqrestore(&gic_lock, flags);
- return ret;
+ return 0;
}
static int gic_shared_irq_domain_map(struct irq_domain *d, unsigned int virq,
- irq_hw_number_t hw, unsigned int vpe)
+ irq_hw_number_t hw, unsigned int cpu)
{
int intr = GIC_HWIRQ_TO_SHARED(hw);
+ struct irq_data *data;
unsigned long flags;
- int i;
+
+ data = irq_get_irq_data(virq);
spin_lock_irqsave(&gic_lock, flags);
- gic_map_to_pin(intr, gic_cpu_pin);
- gic_map_to_vpe(intr, mips_cm_vp_id(vpe));
- for (i = 0; i < min(gic_vpes, NR_CPUS); i++)
- clear_bit(intr, pcpu_masks[i].pcpu_mask);
- set_bit(intr, pcpu_masks[vpe].pcpu_mask);
+ write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin);
+ write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu)));
+ gic_clear_pcpu_masks(intr);
+ set_bit(intr, per_cpu_ptr(pcpu_masks, cpu));
+ irq_data_update_effective_affinity(data, cpumask_of(cpu));
spin_unlock_irqrestore(&gic_lock, flags);
return 0;
@@ -885,34 +636,69 @@ static const struct irq_domain_ops gic_ipi_domain_ops = {
.match = gic_ipi_domain_match,
};
-static void __init __gic_init(unsigned long gic_base_addr,
- unsigned long gic_addrspace_size,
- unsigned int cpu_vec, unsigned int irqbase,
- struct device_node *node)
+
+static int __init gic_of_init(struct device_node *node,
+ struct device_node *parent)
{
- unsigned int gicconfig, cpu;
- unsigned int v[2];
+ unsigned int cpu_vec, i, j, gicconfig, cpu, v[2];
+ unsigned long reserved;
+ phys_addr_t gic_base;
+ struct resource res;
+ size_t gic_len;
- __gic_base_addr = gic_base_addr;
+ /* Find the first available CPU vector. */
+ i = 0;
+ reserved = (C_SW0 | C_SW1) >> __ffs(C_SW0);
+ while (!of_property_read_u32_index(node, "mti,reserved-cpu-vectors",
+ i++, &cpu_vec))
+ reserved |= BIT(cpu_vec);
- gic_base = ioremap_nocache(gic_base_addr, gic_addrspace_size);
+ cpu_vec = find_first_zero_bit(&reserved, hweight_long(ST0_IM));
+ if (cpu_vec == hweight_long(ST0_IM)) {
+ pr_err("No CPU vectors available for GIC\n");
+ return -ENODEV;
+ }
- gicconfig = gic_read(GIC_REG(SHARED, GIC_SH_CONFIG));
- gic_shared_intrs = (gicconfig & GIC_SH_CONFIG_NUMINTRS_MSK) >>
- GIC_SH_CONFIG_NUMINTRS_SHF;
- gic_shared_intrs = ((gic_shared_intrs + 1) * 8);
+ if (of_address_to_resource(node, 0, &res)) {
+ /*
+ * Probe the CM for the GIC base address if not specified
+ * in the device-tree.
+ */
+ if (mips_cm_present()) {
+ gic_base = read_gcr_gic_base() &
+ ~CM_GCR_GIC_BASE_GICEN;
+ gic_len = 0x20000;
+ } else {
+ pr_err("Failed to get GIC memory range\n");
+ return -ENODEV;
+ }
+ } else {
+ gic_base = res.start;
+ gic_len = resource_size(&res);
+ }
+
+ if (mips_cm_present()) {
+ write_gcr_gic_base(gic_base | CM_GCR_GIC_BASE_GICEN);
+ /* Ensure GIC region is enabled before trying to access it */
+ __sync();
+ }
+
+ mips_gic_base = ioremap_nocache(gic_base, gic_len);
- gic_vpes = (gicconfig & GIC_SH_CONFIG_NUMVPES_MSK) >>
- GIC_SH_CONFIG_NUMVPES_SHF;
+ gicconfig = read_gic_config();
+ gic_shared_intrs = gicconfig & GIC_CONFIG_NUMINTERRUPTS;
+ gic_shared_intrs >>= __ffs(GIC_CONFIG_NUMINTERRUPTS);
+ gic_shared_intrs = (gic_shared_intrs + 1) * 8;
+
+ gic_vpes = gicconfig & GIC_CONFIG_PVPS;
+ gic_vpes >>= __ffs(GIC_CONFIG_PVPS);
gic_vpes = gic_vpes + 1;
if (cpu_has_veic) {
/* Set EIC mode for all VPEs */
for_each_present_cpu(cpu) {
- gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
- mips_cm_vp_id(cpu));
- gic_write(GIC_REG(VPE_OTHER, GIC_VPE_CTL),
- GIC_VPE_CTL_EIC_MODE_MSK);
+ write_gic_vl_other(mips_cm_vp_id(cpu));
+ write_gic_vo_ctl(GIC_VX_CTL_EIC);
}
/* Always use vector 1 in EIC mode */
@@ -937,9 +723,7 @@ static void __init __gic_init(unsigned long gic_base_addr,
*/
if (IS_ENABLED(CONFIG_MIPS_CMP) &&
gic_local_irq_is_routable(GIC_LOCAL_INT_TIMER)) {
- timer_cpu_pin = gic_read32(GIC_REG(VPE_LOCAL,
- GIC_VPE_TIMER_MAP)) &
- GIC_MAP_MSK;
+ timer_cpu_pin = read_gic_vl_timer_map() & GIC_MAP_PIN_MAP;
irq_set_chained_handler(MIPS_CPU_IRQ_BASE +
GIC_CPU_PIN_OFFSET +
timer_cpu_pin,
@@ -950,17 +734,21 @@ static void __init __gic_init(unsigned long gic_base_addr,
}
gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS +
- gic_shared_intrs, irqbase,
+ gic_shared_intrs, 0,
&gic_irq_domain_ops, NULL);
- if (!gic_irq_domain)
- panic("Failed to add GIC IRQ domain");
+ if (!gic_irq_domain) {
+ pr_err("Failed to add GIC IRQ domain");
+ return -ENXIO;
+ }
gic_ipi_domain = irq_domain_add_hierarchy(gic_irq_domain,
IRQ_DOMAIN_FLAG_IPI_PER_CPU,
GIC_NUM_LOCAL_INTRS + gic_shared_intrs,
node, &gic_ipi_domain_ops, NULL);
- if (!gic_ipi_domain)
- panic("Failed to add GIC IPI domain");
+ if (!gic_ipi_domain) {
+ pr_err("Failed to add GIC IPI domain");
+ return -ENXIO;
+ }
irq_domain_update_bus_token(gic_ipi_domain, DOMAIN_BUS_IPI);
@@ -975,64 +763,25 @@ static void __init __gic_init(unsigned long gic_base_addr,
}
bitmap_copy(ipi_available, ipi_resrv, GIC_MAX_INTRS);
- gic_basic_init();
-}
-
-void __init gic_init(unsigned long gic_base_addr,
- unsigned long gic_addrspace_size,
- unsigned int cpu_vec, unsigned int irqbase)
-{
- __gic_init(gic_base_addr, gic_addrspace_size, cpu_vec, irqbase, NULL);
-}
-static int __init gic_of_init(struct device_node *node,
- struct device_node *parent)
-{
- struct resource res;
- unsigned int cpu_vec, i = 0, reserved = 0;
- phys_addr_t gic_base;
- size_t gic_len;
+ board_bind_eic_interrupt = &gic_bind_eic_interrupt;
- /* Find the first available CPU vector. */
- while (!of_property_read_u32_index(node, "mti,reserved-cpu-vectors",
- i++, &cpu_vec))
- reserved |= BIT(cpu_vec);
- for (cpu_vec = 2; cpu_vec < 8; cpu_vec++) {
- if (!(reserved & BIT(cpu_vec)))
- break;
- }
- if (cpu_vec == 8) {
- pr_err("No CPU vectors available for GIC\n");
- return -ENODEV;
+ /* Setup defaults */
+ for (i = 0; i < gic_shared_intrs; i++) {
+ change_gic_pol(i, GIC_POL_ACTIVE_HIGH);
+ change_gic_trig(i, GIC_TRIG_LEVEL);
+ write_gic_rmask(i);
}
- if (of_address_to_resource(node, 0, &res)) {
- /*
- * Probe the CM for the GIC base address if not specified
- * in the device-tree.
- */
- if (mips_cm_present()) {
- gic_base = read_gcr_gic_base() &
- ~CM_GCR_GIC_BASE_GICEN_MSK;
- gic_len = 0x20000;
- } else {
- pr_err("Failed to get GIC memory range\n");
- return -ENODEV;
+ for (i = 0; i < gic_vpes; i++) {
+ write_gic_vl_other(mips_cm_vp_id(i));
+ for (j = 0; j < GIC_NUM_LOCAL_INTRS; j++) {
+ if (!gic_local_irq_is_routable(j))
+ continue;
+ write_gic_vo_rmask(BIT(j));
}
- } else {
- gic_base = res.start;
- gic_len = resource_size(&res);
}
- if (mips_cm_present()) {
- write_gcr_gic_base(gic_base | CM_GCR_GIC_BASE_GICEN_MSK);
- /* Ensure GIC region is enabled before trying to access it */
- __sync();
- }
- gic_present = true;
-
- __gic_init(gic_base, gic_len, cpu_vec, 0, node);
-
return 0;
}
IRQCHIP_DECLARE(mips_gic, "mti,gic", gic_of_init);
diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c
index 6c44609fd83a..cd2b3c69771a 100644
--- a/drivers/isdn/i4l/isdn_ppp.c
+++ b/drivers/isdn/i4l/isdn_ppp.c
@@ -825,7 +825,6 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
isdn_net_local *lp;
struct ippp_struct *is;
int proto;
- unsigned char protobuf[4];
is = file->private_data;
@@ -839,24 +838,28 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
if (!lp)
printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
else {
- /*
- * Don't reset huptimer for
- * LCP packets. (Echo requests).
- */
- if (copy_from_user(protobuf, buf, 4))
- return -EFAULT;
- proto = PPP_PROTOCOL(protobuf);
- if (proto != PPP_LCP)
- lp->huptimer = 0;
+ if (lp->isdn_device < 0 || lp->isdn_channel < 0) {
+ unsigned char protobuf[4];
+ /*
+ * Don't reset huptimer for
+ * LCP packets. (Echo requests).
+ */
+ if (copy_from_user(protobuf, buf, 4))
+ return -EFAULT;
+
+ proto = PPP_PROTOCOL(protobuf);
+ if (proto != PPP_LCP)
+ lp->huptimer = 0;
- if (lp->isdn_device < 0 || lp->isdn_channel < 0)
return 0;
+ }
if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
lp->dialstate == 0 &&
(lp->flags & ISDN_NET_CONNECTED)) {
unsigned short hl;
struct sk_buff *skb;
+ unsigned char *cpy_buf;
/*
* we need to reserve enough space in front of
* sk_buff. old call to dev_alloc_skb only reserved
@@ -869,11 +872,21 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
return count;
}
skb_reserve(skb, hl);
- if (copy_from_user(skb_put(skb, count), buf, count))
+ cpy_buf = skb_put(skb, count);
+ if (copy_from_user(cpy_buf, buf, count))
{
kfree_skb(skb);
return -EFAULT;
}
+
+ /*
+ * Don't reset huptimer for
+ * LCP packets. (Echo requests).
+ */
+ proto = PPP_PROTOCOL(cpy_buf);
+ if (proto != PPP_LCP)
+ lp->huptimer = 0;
+
if (is->debug & 0x40) {
printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
diff --git a/drivers/leds/leds-as3645a.c b/drivers/leds/leds-as3645a.c
index bbbbe0898233..9a257f969300 100644
--- a/drivers/leds/leds-as3645a.c
+++ b/drivers/leds/leds-as3645a.c
@@ -112,6 +112,10 @@
#define AS_PEAK_mA_TO_REG(a) \
((min_t(u32, AS_PEAK_mA_MAX, a) - 1250) / 250)
+/* LED numbers for Devicetree */
+#define AS_LED_FLASH 0
+#define AS_LED_INDICATOR 1
+
enum as_mode {
AS_MODE_EXT_TORCH = 0 << AS_CONTROL_MODE_SETTING_SHIFT,
AS_MODE_INDICATOR = 1 << AS_CONTROL_MODE_SETTING_SHIFT,
@@ -491,10 +495,29 @@ static int as3645a_parse_node(struct as3645a *flash,
struct device_node *node)
{
struct as3645a_config *cfg = &flash->cfg;
+ struct device_node *child;
const char *name;
int rval;
- flash->flash_node = of_get_child_by_name(node, "flash");
+ for_each_child_of_node(node, child) {
+ u32 id = 0;
+
+ of_property_read_u32(child, "reg", &id);
+
+ switch (id) {
+ case AS_LED_FLASH:
+ flash->flash_node = of_node_get(child);
+ break;
+ case AS_LED_INDICATOR:
+ flash->indicator_node = of_node_get(child);
+ break;
+ default:
+ dev_warn(&flash->client->dev,
+ "unknown LED %u encountered, ignoring\n", id);
+ break;
+ }
+ }
+
if (!flash->flash_node) {
dev_err(&flash->client->dev, "can't find flash node\n");
return -ENODEV;
@@ -534,11 +557,10 @@ static int as3645a_parse_node(struct as3645a *flash,
of_property_read_u32(flash->flash_node, "voltage-reference",
&cfg->voltage_reference);
- of_property_read_u32(flash->flash_node, "peak-current-limit",
+ of_property_read_u32(flash->flash_node, "ams,input-max-microamp",
&cfg->peak);
cfg->peak = AS_PEAK_mA_TO_REG(cfg->peak);
- flash->indicator_node = of_get_child_by_name(node, "indicator");
if (!flash->indicator_node) {
dev_warn(&flash->client->dev,
"can't find indicator node\n");
@@ -721,6 +743,7 @@ static int as3645a_remove(struct i2c_client *client)
as3645a_set_control(flash, AS_MODE_EXT_TORCH, false);
v4l2_flash_release(flash->vf);
+ v4l2_flash_release(flash->vfind);
led_classdev_flash_unregister(&flash->fled);
led_classdev_unregister(&flash->iled_cdev);
diff --git a/drivers/leds/leds-clevo-mail.c b/drivers/leds/leds-clevo-mail.c
index 0f9ed1ea0e89..492789f56896 100644
--- a/drivers/leds/leds-clevo-mail.c
+++ b/drivers/leds/leds-clevo-mail.c
@@ -40,7 +40,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id)
* detected as working, but in reality it is not) as low as
* possible.
*/
-static struct dmi_system_id clevo_mail_led_dmi_table[] __initdata = {
+static const struct dmi_system_id clevo_mail_led_dmi_table[] __initconst = {
{
.callback = clevo_mail_led_dmi_callback,
.ident = "Clevo D410J",
diff --git a/drivers/leds/leds-ss4200.c b/drivers/leds/leds-ss4200.c
index 732eb86bc1a5..a9db8674cd02 100644
--- a/drivers/leds/leds-ss4200.c
+++ b/drivers/leds/leds-ss4200.c
@@ -91,7 +91,7 @@ MODULE_PARM_DESC(nodetect, "Skip DMI-based hardware detection");
* detected as working, but in reality it is not) as low as
* possible.
*/
-static struct dmi_system_id nas_led_whitelist[] __initdata = {
+static const struct dmi_system_id nas_led_whitelist[] __initconst = {
{
.callback = ss4200_led_dmi_callback,
.ident = "Intel SS4200-E",
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index 9601225e0ae9..d216a8f7bc22 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -64,6 +64,12 @@
#define DM_BUFIO_BLOCK_SIZE_GFP_LIMIT (PAGE_SIZE << (MAX_ORDER - 1))
/*
+ * Align buffer writes to this boundary.
+ * Tests show that SSDs have the highest IOPS when using 4k writes.
+ */
+#define DM_BUFIO_WRITE_ALIGN 4096
+
+/*
* dm_buffer->list_mode
*/
#define LIST_CLEAN 0
@@ -149,6 +155,10 @@ struct dm_buffer {
blk_status_t write_error;
unsigned long state;
unsigned long last_accessed;
+ unsigned dirty_start;
+ unsigned dirty_end;
+ unsigned write_start;
+ unsigned write_end;
struct dm_bufio_client *c;
struct list_head write_list;
struct bio bio;
@@ -560,7 +570,7 @@ static void dmio_complete(unsigned long error, void *context)
}
static void use_dmio(struct dm_buffer *b, int rw, sector_t sector,
- unsigned n_sectors, bio_end_io_t *end_io)
+ unsigned n_sectors, unsigned offset, bio_end_io_t *end_io)
{
int r;
struct dm_io_request io_req = {
@@ -578,10 +588,10 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t sector,
if (b->data_mode != DATA_MODE_VMALLOC) {
io_req.mem.type = DM_IO_KMEM;
- io_req.mem.ptr.addr = b->data;
+ io_req.mem.ptr.addr = (char *)b->data + offset;
} else {
io_req.mem.type = DM_IO_VMA;
- io_req.mem.ptr.vma = b->data;
+ io_req.mem.ptr.vma = (char *)b->data + offset;
}
b->bio.bi_end_io = end_io;
@@ -609,10 +619,10 @@ static void inline_endio(struct bio *bio)
}
static void use_inline_bio(struct dm_buffer *b, int rw, sector_t sector,
- unsigned n_sectors, bio_end_io_t *end_io)
+ unsigned n_sectors, unsigned offset, bio_end_io_t *end_io)
{
char *ptr;
- int len;
+ unsigned len;
bio_init(&b->bio, b->bio_vec, DM_BUFIO_INLINE_VECS);
b->bio.bi_iter.bi_sector = sector;
@@ -625,29 +635,20 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t sector,
b->bio.bi_private = end_io;
bio_set_op_attrs(&b->bio, rw, 0);
- /*
- * We assume that if len >= PAGE_SIZE ptr is page-aligned.
- * If len < PAGE_SIZE the buffer doesn't cross page boundary.
- */
- ptr = b->data;
+ ptr = (char *)b->data + offset;
len = n_sectors << SECTOR_SHIFT;
- if (len >= PAGE_SIZE)
- BUG_ON((unsigned long)ptr & (PAGE_SIZE - 1));
- else
- BUG_ON((unsigned long)ptr & (len - 1));
-
do {
- if (!bio_add_page(&b->bio, virt_to_page(ptr),
- len < PAGE_SIZE ? len : PAGE_SIZE,
+ unsigned this_step = min((unsigned)(PAGE_SIZE - offset_in_page(ptr)), len);
+ if (!bio_add_page(&b->bio, virt_to_page(ptr), this_step,
offset_in_page(ptr))) {
BUG_ON(b->c->block_size <= PAGE_SIZE);
- use_dmio(b, rw, sector, n_sectors, end_io);
+ use_dmio(b, rw, sector, n_sectors, offset, end_io);
return;
}
- len -= PAGE_SIZE;
- ptr += PAGE_SIZE;
+ len -= this_step;
+ ptr += this_step;
} while (len > 0);
submit_bio(&b->bio);
@@ -657,18 +658,33 @@ static void submit_io(struct dm_buffer *b, int rw, bio_end_io_t *end_io)
{
unsigned n_sectors;
sector_t sector;
-
- if (rw == WRITE && b->c->write_callback)
- b->c->write_callback(b);
+ unsigned offset, end;
sector = (b->block << b->c->sectors_per_block_bits) + b->c->start;
- n_sectors = 1 << b->c->sectors_per_block_bits;
+
+ if (rw != WRITE) {
+ n_sectors = 1 << b->c->sectors_per_block_bits;
+ offset = 0;
+ } else {
+ if (b->c->write_callback)
+ b->c->write_callback(b);
+ offset = b->write_start;
+ end = b->write_end;
+ offset &= -DM_BUFIO_WRITE_ALIGN;
+ end += DM_BUFIO_WRITE_ALIGN - 1;
+ end &= -DM_BUFIO_WRITE_ALIGN;
+ if (unlikely(end > b->c->block_size))
+ end = b->c->block_size;
+
+ sector += offset >> SECTOR_SHIFT;
+ n_sectors = (end - offset) >> SECTOR_SHIFT;
+ }
if (n_sectors <= ((DM_BUFIO_INLINE_VECS * PAGE_SIZE) >> SECTOR_SHIFT) &&
b->data_mode != DATA_MODE_VMALLOC)
- use_inline_bio(b, rw, sector, n_sectors, end_io);
+ use_inline_bio(b, rw, sector, n_sectors, offset, end_io);
else
- use_dmio(b, rw, sector, n_sectors, end_io);
+ use_dmio(b, rw, sector, n_sectors, offset, end_io);
}
/*----------------------------------------------------------------
@@ -720,6 +736,9 @@ static void __write_dirty_buffer(struct dm_buffer *b,
clear_bit(B_DIRTY, &b->state);
wait_on_bit_lock_io(&b->state, B_WRITING, TASK_UNINTERRUPTIBLE);
+ b->write_start = b->dirty_start;
+ b->write_end = b->dirty_end;
+
if (!write_list)
submit_io(b, WRITE, write_endio);
else
@@ -1221,19 +1240,37 @@ void dm_bufio_release(struct dm_buffer *b)
}
EXPORT_SYMBOL_GPL(dm_bufio_release);
-void dm_bufio_mark_buffer_dirty(struct dm_buffer *b)
+void dm_bufio_mark_partial_buffer_dirty(struct dm_buffer *b,
+ unsigned start, unsigned end)
{
struct dm_bufio_client *c = b->c;
+ BUG_ON(start >= end);
+ BUG_ON(end > b->c->block_size);
+
dm_bufio_lock(c);
BUG_ON(test_bit(B_READING, &b->state));
- if (!test_and_set_bit(B_DIRTY, &b->state))
+ if (!test_and_set_bit(B_DIRTY, &b->state)) {
+ b->dirty_start = start;
+ b->dirty_end = end;
__relink_lru(b, LIST_DIRTY);
+ } else {
+ if (start < b->dirty_start)
+ b->dirty_start = start;
+ if (end > b->dirty_end)
+ b->dirty_end = end;
+ }
dm_bufio_unlock(c);
}
+EXPORT_SYMBOL_GPL(dm_bufio_mark_partial_buffer_dirty);
+
+void dm_bufio_mark_buffer_dirty(struct dm_buffer *b)
+{
+ dm_bufio_mark_partial_buffer_dirty(b, 0, b->c->block_size);
+}
EXPORT_SYMBOL_GPL(dm_bufio_mark_buffer_dirty);
void dm_bufio_write_dirty_buffers_async(struct dm_bufio_client *c)
@@ -1398,6 +1435,8 @@ retry:
wait_on_bit_io(&b->state, B_WRITING,
TASK_UNINTERRUPTIBLE);
set_bit(B_DIRTY, &b->state);
+ b->dirty_start = 0;
+ b->dirty_end = c->block_size;
__unlink_buffer(b);
__link_buffer(b, new_block, LIST_DIRTY);
} else {
diff --git a/drivers/md/dm-bufio.h b/drivers/md/dm-bufio.h
index b6d8f53ec15b..be732d3f8611 100644
--- a/drivers/md/dm-bufio.h
+++ b/drivers/md/dm-bufio.h
@@ -94,6 +94,15 @@ void dm_bufio_release(struct dm_buffer *b);
void dm_bufio_mark_buffer_dirty(struct dm_buffer *b);
/*
+ * Mark a part of the buffer dirty.
+ *
+ * The specified part of the buffer is scheduled to be written. dm-bufio may
+ * write the specified part of the buffer or it may write a larger superset.
+ */
+void dm_bufio_mark_partial_buffer_dirty(struct dm_buffer *b,
+ unsigned start, unsigned end);
+
+/*
* Initiate writing of dirty buffers, without waiting for completion.
*/
void dm_bufio_write_dirty_buffers_async(struct dm_bufio_client *c);
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index dcac25c2be7a..8785134c9f1f 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -2306,7 +2306,7 @@ static void init_features(struct cache_features *cf)
static int parse_features(struct cache_args *ca, struct dm_arg_set *as,
char **error)
{
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 2, "Invalid number of cache feature arguments"},
};
@@ -2348,7 +2348,7 @@ static int parse_features(struct cache_args *ca, struct dm_arg_set *as,
static int parse_policy(struct cache_args *ca, struct dm_arg_set *as,
char **error)
{
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 1024, "Invalid number of policy arguments"},
};
diff --git a/drivers/md/dm-core.h b/drivers/md/dm-core.h
index 24eddbdf2ab4..203144762f36 100644
--- a/drivers/md/dm-core.h
+++ b/drivers/md/dm-core.h
@@ -149,5 +149,6 @@ static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen
extern atomic_t dm_global_event_nr;
extern wait_queue_head_t dm_global_eventq;
+void dm_issue_global_event(void);
#endif
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 54aef8ed97db..96ab46512e1f 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -2466,6 +2466,7 @@ static int crypt_ctr_cipher_old(struct dm_target *ti, char *cipher_in, char *key
kfree(cipher_api);
return ret;
}
+ kfree(cipher_api);
return 0;
bad_mem:
@@ -2529,7 +2530,7 @@ static int crypt_ctr_optional(struct dm_target *ti, unsigned int argc, char **ar
{
struct crypt_config *cc = ti->private;
struct dm_arg_set as;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 6, "Invalid number of feature args"},
};
unsigned int opt_params, val;
@@ -2584,6 +2585,10 @@ static int crypt_ctr_optional(struct dm_target *ti, unsigned int argc, char **ar
ti->error = "Invalid feature value for sector_size";
return -EINVAL;
}
+ if (ti->len & ((cc->sector_size >> SECTOR_SHIFT) - 1)) {
+ ti->error = "Device size is not multiple of sector_size feature";
+ return -EINVAL;
+ }
cc->sector_shift = __ffs(cc->sector_size) - SECTOR_SHIFT;
} else if (!strcasecmp(opt_string, "iv_large_sectors"))
set_bit(CRYPT_IV_LARGE_SECTORS, &cc->cipher_flags);
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
index 7146c2d9762d..b82cb1ab1eaa 100644
--- a/drivers/md/dm-flakey.c
+++ b/drivers/md/dm-flakey.c
@@ -51,7 +51,7 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc,
unsigned argc;
const char *arg_name;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 6, "Invalid number of feature args"},
{1, UINT_MAX, "Invalid corrupt bio byte"},
{0, 255, "Invalid corrupt value to write into bio byte (0-255)"},
@@ -178,7 +178,7 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc,
*/
static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
{
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, UINT_MAX, "Invalid up interval"},
{0, UINT_MAX, "Invalid down interval"},
};
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 27c0f223f8ea..096fe9b66c50 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -225,6 +225,8 @@ struct dm_integrity_c {
struct alg_spec internal_hash_alg;
struct alg_spec journal_crypt_alg;
struct alg_spec journal_mac_alg;
+
+ atomic64_t number_of_mismatches;
};
struct dm_integrity_range {
@@ -298,7 +300,7 @@ static void __DEBUG_bytes(__u8 *bytes, size_t len, const char *msg, ...)
/*
* DM Integrity profile, protection is performed layer above (dm-crypt)
*/
-static struct blk_integrity_profile dm_integrity_profile = {
+static const struct blk_integrity_profile dm_integrity_profile = {
.name = "DM-DIF-EXT-TAG",
.generate_fn = NULL,
.verify_fn = NULL,
@@ -310,6 +312,8 @@ static void dm_integrity_dtr(struct dm_target *ti);
static void dm_integrity_io_error(struct dm_integrity_c *ic, const char *msg, int err)
{
+ if (err == -EILSEQ)
+ atomic64_inc(&ic->number_of_mismatches);
if (!cmpxchg(&ic->failed, 0, err))
DMERR("Error on %s: %d", msg, err);
}
@@ -770,13 +774,13 @@ static void write_journal(struct dm_integrity_c *ic, unsigned commit_start, unsi
unsigned i;
io_comp.ic = ic;
- io_comp.comp = COMPLETION_INITIALIZER_ONSTACK(io_comp.comp);
+ init_completion(&io_comp.comp);
if (commit_start + commit_sections <= ic->journal_sections) {
io_comp.in_flight = (atomic_t)ATOMIC_INIT(1);
if (ic->journal_io) {
crypt_comp_1.ic = ic;
- crypt_comp_1.comp = COMPLETION_INITIALIZER_ONSTACK(crypt_comp_1.comp);
+ init_completion(&crypt_comp_1.comp);
crypt_comp_1.in_flight = (atomic_t)ATOMIC_INIT(0);
encrypt_journal(ic, true, commit_start, commit_sections, &crypt_comp_1);
wait_for_completion_io(&crypt_comp_1.comp);
@@ -792,18 +796,18 @@ static void write_journal(struct dm_integrity_c *ic, unsigned commit_start, unsi
to_end = ic->journal_sections - commit_start;
if (ic->journal_io) {
crypt_comp_1.ic = ic;
- crypt_comp_1.comp = COMPLETION_INITIALIZER_ONSTACK(crypt_comp_1.comp);
+ init_completion(&crypt_comp_1.comp);
crypt_comp_1.in_flight = (atomic_t)ATOMIC_INIT(0);
encrypt_journal(ic, true, commit_start, to_end, &crypt_comp_1);
if (try_wait_for_completion(&crypt_comp_1.comp)) {
rw_journal(ic, REQ_OP_WRITE, REQ_FUA, commit_start, to_end, &io_comp);
- crypt_comp_1.comp = COMPLETION_INITIALIZER_ONSTACK(crypt_comp_1.comp);
+ reinit_completion(&crypt_comp_1.comp);
crypt_comp_1.in_flight = (atomic_t)ATOMIC_INIT(0);
encrypt_journal(ic, true, 0, commit_sections - to_end, &crypt_comp_1);
wait_for_completion_io(&crypt_comp_1.comp);
} else {
crypt_comp_2.ic = ic;
- crypt_comp_2.comp = COMPLETION_INITIALIZER_ONSTACK(crypt_comp_2.comp);
+ init_completion(&crypt_comp_2.comp);
crypt_comp_2.in_flight = (atomic_t)ATOMIC_INIT(0);
encrypt_journal(ic, true, 0, commit_sections - to_end, &crypt_comp_2);
wait_for_completion_io(&crypt_comp_1.comp);
@@ -1041,7 +1045,7 @@ static int dm_integrity_rw_tag(struct dm_integrity_c *ic, unsigned char *tag, se
memcpy(tag, dp, to_copy);
} else if (op == TAG_WRITE) {
memcpy(dp, tag, to_copy);
- dm_bufio_mark_buffer_dirty(b);
+ dm_bufio_mark_partial_buffer_dirty(b, *metadata_offset, *metadata_offset + to_copy);
} else {
/* e.g.: op == TAG_CMP */
if (unlikely(memcmp(dp, tag, to_copy))) {
@@ -1275,6 +1279,7 @@ again:
DMERR("Checksum failed at sector 0x%llx",
(unsigned long long)(sector - ((r + ic->tag_size - 1) / ic->tag_size)));
r = -EILSEQ;
+ atomic64_inc(&ic->number_of_mismatches);
}
if (likely(checksums != checksums_onstack))
kfree(checksums);
@@ -1676,7 +1681,7 @@ sleep:
dio->in_flight = (atomic_t)ATOMIC_INIT(2);
if (need_sync_io) {
- read_comp = COMPLETION_INITIALIZER_ONSTACK(read_comp);
+ init_completion(&read_comp);
dio->completion = &read_comp;
} else
dio->completion = NULL;
@@ -1700,7 +1705,11 @@ sleep:
if (need_sync_io) {
wait_for_completion_io(&read_comp);
- integrity_metadata(&dio->work);
+ if (likely(!bio->bi_status))
+ integrity_metadata(&dio->work);
+ else
+ dec_in_flight(dio);
+
} else {
INIT_WORK(&dio->work, integrity_metadata);
queue_work(ic->metadata_wq, &dio->work);
@@ -1834,7 +1843,7 @@ static void do_journal_write(struct dm_integrity_c *ic, unsigned write_start,
comp.ic = ic;
comp.in_flight = (atomic_t)ATOMIC_INIT(1);
- comp.comp = COMPLETION_INITIALIZER_ONSTACK(comp.comp);
+ init_completion(&comp.comp);
i = write_start;
for (n = 0; n < write_sections; n++, i++, wraparound_section(ic, &i)) {
@@ -2061,7 +2070,7 @@ static void replay_journal(struct dm_integrity_c *ic)
if (ic->journal_io) {
struct journal_completion crypt_comp;
crypt_comp.ic = ic;
- crypt_comp.comp = COMPLETION_INITIALIZER_ONSTACK(crypt_comp.comp);
+ init_completion(&crypt_comp.comp);
crypt_comp.in_flight = (atomic_t)ATOMIC_INIT(0);
encrypt_journal(ic, false, 0, ic->journal_sections, &crypt_comp);
wait_for_completion(&crypt_comp.comp);
@@ -2233,7 +2242,7 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
switch (type) {
case STATUSTYPE_INFO:
- result[0] = '\0';
+ DMEMIT("%llu", (unsigned long long)atomic64_read(&ic->number_of_mismatches));
break;
case STATUSTYPE_TABLE: {
@@ -2634,7 +2643,7 @@ static int create_journal(struct dm_integrity_c *ic, char **error)
memset(iv, 0x00, ivsize);
skcipher_request_set_crypt(req, sg, sg, PAGE_SIZE * ic->journal_pages + sizeof ic->commit_ids, iv);
- comp.comp = COMPLETION_INITIALIZER_ONSTACK(comp.comp);
+ init_completion(&comp.comp);
comp.in_flight = (atomic_t)ATOMIC_INIT(1);
if (do_crypt(true, req, &comp))
wait_for_completion(&comp.comp);
@@ -2691,7 +2700,7 @@ static int create_journal(struct dm_integrity_c *ic, char **error)
sg_init_one(&sg, crypt_data, crypt_len);
skcipher_request_set_crypt(req, &sg, &sg, crypt_len, iv);
- comp.comp = COMPLETION_INITIALIZER_ONSTACK(comp.comp);
+ init_completion(&comp.comp);
comp.in_flight = (atomic_t)ATOMIC_INIT(1);
if (do_crypt(true, req, &comp))
wait_for_completion(&comp.comp);
@@ -2778,7 +2787,7 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
int r;
unsigned extra_args;
struct dm_arg_set as;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 9, "Invalid number of feature args"},
};
unsigned journal_sectors, interleave_sectors, buffer_sectors, journal_watermark, sync_msec;
@@ -2806,6 +2815,7 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
bio_list_init(&ic->flush_bio_list);
init_waitqueue_head(&ic->copy_to_journal_wait);
init_completion(&ic->crypto_backoff);
+ atomic64_set(&ic->number_of_mismatches, 0);
r = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &ic->dev);
if (r) {
@@ -3202,7 +3212,7 @@ static void dm_integrity_dtr(struct dm_target *ti)
static struct target_type integrity_target = {
.name = "integrity",
- .version = {1, 0, 0},
+ .version = {1, 1, 0},
.module = THIS_MODULE,
.features = DM_TARGET_SINGLETON | DM_TARGET_INTEGRITY,
.ctr = dm_integrity_ctr,
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index e06f0ef7d2ec..e52676fa9832 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -477,9 +477,13 @@ static int remove_all(struct file *filp, struct dm_ioctl *param, size_t param_si
* Round up the ptr to an 8-byte boundary.
*/
#define ALIGN_MASK 7
+static inline size_t align_val(size_t val)
+{
+ return (val + ALIGN_MASK) & ~ALIGN_MASK;
+}
static inline void *align_ptr(void *ptr)
{
- return (void *) (((size_t) (ptr + ALIGN_MASK)) & ~ALIGN_MASK);
+ return (void *)align_val((size_t)ptr);
}
/*
@@ -505,7 +509,7 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
struct hash_cell *hc;
size_t len, needed = 0;
struct gendisk *disk;
- struct dm_name_list *nl, *old_nl = NULL;
+ struct dm_name_list *orig_nl, *nl, *old_nl = NULL;
uint32_t *event_nr;
down_write(&_hash_lock);
@@ -516,17 +520,15 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
*/
for (i = 0; i < NUM_BUCKETS; i++) {
list_for_each_entry (hc, _name_buckets + i, name_list) {
- needed += sizeof(struct dm_name_list);
- needed += strlen(hc->name) + 1;
- needed += ALIGN_MASK;
- needed += (sizeof(uint32_t) + ALIGN_MASK) & ~ALIGN_MASK;
+ needed += align_val(offsetof(struct dm_name_list, name) + strlen(hc->name) + 1);
+ needed += align_val(sizeof(uint32_t));
}
}
/*
* Grab our output buffer.
*/
- nl = get_result_buffer(param, param_size, &len);
+ nl = orig_nl = get_result_buffer(param, param_size, &len);
if (len < needed) {
param->flags |= DM_BUFFER_FULL_FLAG;
goto out;
@@ -549,11 +551,16 @@ static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_
strcpy(nl->name, hc->name);
old_nl = nl;
- event_nr = align_ptr(((void *) (nl + 1)) + strlen(hc->name) + 1);
+ event_nr = align_ptr(nl->name + strlen(hc->name) + 1);
*event_nr = dm_get_event_nr(hc->md);
nl = align_ptr(event_nr + 1);
}
}
+ /*
+ * If mismatch happens, security may be compromised due to buffer
+ * overflow, so it's better to crash.
+ */
+ BUG_ON((char *)nl - (char *)orig_nl != needed);
out:
up_write(&_hash_lock);
@@ -1621,7 +1628,8 @@ static int target_message(struct file *filp, struct dm_ioctl *param, size_t para
* which has a variable size, is not used by the function processing
* the ioctl.
*/
-#define IOCTL_FLAGS_NO_PARAMS 1
+#define IOCTL_FLAGS_NO_PARAMS 1
+#define IOCTL_FLAGS_ISSUE_GLOBAL_EVENT 2
/*-----------------------------------------------------------------
* Implementation of open/close/ioctl on the special char
@@ -1629,18 +1637,18 @@ static int target_message(struct file *filp, struct dm_ioctl *param, size_t para
*---------------------------------------------------------------*/
static ioctl_fn lookup_ioctl(unsigned int cmd, int *ioctl_flags)
{
- static struct {
+ static const struct {
int cmd;
int flags;
ioctl_fn fn;
} _ioctls[] = {
{DM_VERSION_CMD, 0, NULL}, /* version is dealt with elsewhere */
- {DM_REMOVE_ALL_CMD, IOCTL_FLAGS_NO_PARAMS, remove_all},
+ {DM_REMOVE_ALL_CMD, IOCTL_FLAGS_NO_PARAMS | IOCTL_FLAGS_ISSUE_GLOBAL_EVENT, remove_all},
{DM_LIST_DEVICES_CMD, 0, list_devices},
- {DM_DEV_CREATE_CMD, IOCTL_FLAGS_NO_PARAMS, dev_create},
- {DM_DEV_REMOVE_CMD, IOCTL_FLAGS_NO_PARAMS, dev_remove},
- {DM_DEV_RENAME_CMD, 0, dev_rename},
+ {DM_DEV_CREATE_CMD, IOCTL_FLAGS_NO_PARAMS | IOCTL_FLAGS_ISSUE_GLOBAL_EVENT, dev_create},
+ {DM_DEV_REMOVE_CMD, IOCTL_FLAGS_NO_PARAMS | IOCTL_FLAGS_ISSUE_GLOBAL_EVENT, dev_remove},
+ {DM_DEV_RENAME_CMD, IOCTL_FLAGS_ISSUE_GLOBAL_EVENT, dev_rename},
{DM_DEV_SUSPEND_CMD, IOCTL_FLAGS_NO_PARAMS, dev_suspend},
{DM_DEV_STATUS_CMD, IOCTL_FLAGS_NO_PARAMS, dev_status},
{DM_DEV_WAIT_CMD, 0, dev_wait},
@@ -1869,6 +1877,9 @@ static int ctl_ioctl(struct file *file, uint command, struct dm_ioctl __user *us
unlikely(ioctl_flags & IOCTL_FLAGS_NO_PARAMS))
DMERR("ioctl %d tried to output some data but has IOCTL_FLAGS_NO_PARAMS set", cmd);
+ if (!r && ioctl_flags & IOCTL_FLAGS_ISSUE_GLOBAL_EVENT)
+ dm_issue_global_event();
+
/*
* Copy the results back to userland.
*/
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 405eca206d67..d5f8eff7c11d 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -184,20 +184,6 @@ static size_t linear_dax_copy_from_iter(struct dm_target *ti, pgoff_t pgoff,
return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i);
}
-static void linear_dax_flush(struct dm_target *ti, pgoff_t pgoff, void *addr,
- size_t size)
-{
- struct linear_c *lc = ti->private;
- struct block_device *bdev = lc->dev->bdev;
- struct dax_device *dax_dev = lc->dev->dax_dev;
- sector_t dev_sector, sector = pgoff * PAGE_SECTORS;
-
- dev_sector = linear_map_sector(ti, sector);
- if (bdev_dax_pgoff(bdev, dev_sector, ALIGN(size, PAGE_SIZE), &pgoff))
- return;
- dax_flush(dax_dev, pgoff, addr, size);
-}
-
static struct target_type linear_target = {
.name = "linear",
.version = {1, 4, 0},
@@ -212,7 +198,6 @@ static struct target_type linear_target = {
.iterate_devices = linear_iterate_devices,
.direct_access = linear_dax_direct_access,
.dax_copy_from_iter = linear_dax_copy_from_iter,
- .dax_flush = linear_dax_flush,
};
int __init dm_linear_init(void)
diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c
index 534a254eb977..8b80a9ce9ea9 100644
--- a/drivers/md/dm-log-writes.c
+++ b/drivers/md/dm-log-writes.c
@@ -100,6 +100,7 @@ struct log_writes_c {
struct dm_dev *logdev;
u64 logged_entries;
u32 sectorsize;
+ u32 sectorshift;
atomic_t io_blocks;
atomic_t pending_blocks;
sector_t next_sector;
@@ -128,6 +129,18 @@ struct per_bio_data {
struct pending_block *block;
};
+static inline sector_t bio_to_dev_sectors(struct log_writes_c *lc,
+ sector_t sectors)
+{
+ return sectors >> (lc->sectorshift - SECTOR_SHIFT);
+}
+
+static inline sector_t dev_to_bio_sectors(struct log_writes_c *lc,
+ sector_t sectors)
+{
+ return sectors << (lc->sectorshift - SECTOR_SHIFT);
+}
+
static void put_pending_block(struct log_writes_c *lc)
{
if (atomic_dec_and_test(&lc->pending_blocks)) {
@@ -253,7 +266,7 @@ static int log_one_block(struct log_writes_c *lc,
if (!block->vec_cnt)
goto out;
- sector++;
+ sector += dev_to_bio_sectors(lc, 1);
atomic_inc(&lc->io_blocks);
bio = bio_alloc(GFP_KERNEL, min(block->vec_cnt, BIO_MAX_PAGES));
@@ -354,10 +367,9 @@ static int log_writes_kthread(void *arg)
goto next;
sector = lc->next_sector;
- if (block->flags & LOG_DISCARD_FLAG)
- lc->next_sector++;
- else
- lc->next_sector += block->nr_sectors + 1;
+ if (!(block->flags & LOG_DISCARD_FLAG))
+ lc->next_sector += dev_to_bio_sectors(lc, block->nr_sectors);
+ lc->next_sector += dev_to_bio_sectors(lc, 1);
/*
* Apparently the size of the device may not be known
@@ -399,7 +411,7 @@ next:
if (!try_to_freeze()) {
set_current_state(TASK_INTERRUPTIBLE);
if (!kthread_should_stop() &&
- !atomic_read(&lc->pending_blocks))
+ list_empty(&lc->logging_blocks))
schedule();
__set_current_state(TASK_RUNNING);
}
@@ -435,7 +447,6 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
INIT_LIST_HEAD(&lc->unflushed_blocks);
INIT_LIST_HEAD(&lc->logging_blocks);
init_waitqueue_head(&lc->wait);
- lc->sectorsize = 1 << SECTOR_SHIFT;
atomic_set(&lc->io_blocks, 0);
atomic_set(&lc->pending_blocks, 0);
@@ -455,6 +466,8 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
goto bad;
}
+ lc->sectorsize = bdev_logical_block_size(lc->dev->bdev);
+ lc->sectorshift = ilog2(lc->sectorsize);
lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write");
if (IS_ERR(lc->log_kthread)) {
ret = PTR_ERR(lc->log_kthread);
@@ -464,8 +477,12 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
goto bad;
}
- /* We put the super at sector 0, start logging at sector 1 */
- lc->next_sector = 1;
+ /*
+ * next_sector is in 512b sectors to correspond to what bi_sector expects.
+ * The super starts at sector 0, and the next_sector is the next logical
+ * one based on the sectorsize of the device.
+ */
+ lc->next_sector = lc->sectorsize >> SECTOR_SHIFT;
lc->logging_enabled = true;
lc->end_sector = logdev_last_sector(lc);
lc->device_supports_discard = true;
@@ -599,8 +616,8 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio)
if (discard_bio)
block->flags |= LOG_DISCARD_FLAG;
- block->sector = bio->bi_iter.bi_sector;
- block->nr_sectors = bio_sectors(bio);
+ block->sector = bio_to_dev_sectors(lc, bio->bi_iter.bi_sector);
+ block->nr_sectors = bio_to_dev_sectors(lc, bio_sectors(bio));
/* We don't need the data, just submit */
if (discard_bio) {
@@ -767,9 +784,12 @@ static void log_writes_io_hints(struct dm_target *ti, struct queue_limits *limit
if (!q || !blk_queue_discard(q)) {
lc->device_supports_discard = false;
- limits->discard_granularity = 1 << SECTOR_SHIFT;
+ limits->discard_granularity = lc->sectorsize;
limits->max_discard_sectors = (UINT_MAX >> SECTOR_SHIFT);
}
+ limits->logical_block_size = bdev_logical_block_size(lc->dev->bdev);
+ limits->physical_block_size = bdev_physical_block_size(lc->dev->bdev);
+ limits->io_min = limits->physical_block_size;
}
static struct target_type log_writes_target = {
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 96aedaac2c64..11f273d2f018 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -632,6 +632,10 @@ static void process_queued_bios(struct work_struct *work)
case DM_MAPIO_REMAPPED:
generic_make_request(bio);
break;
+ case 0:
+ break;
+ default:
+ WARN_ONCE(true, "__multipath_map_bio() returned %d\n", r);
}
}
blk_finish_plug(&plug);
@@ -698,7 +702,7 @@ static int parse_path_selector(struct dm_arg_set *as, struct priority_group *pg,
struct path_selector_type *pst;
unsigned ps_argc;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 1024, "invalid number of path selector args"},
};
@@ -822,7 +826,7 @@ retain:
static struct priority_group *parse_priority_group(struct dm_arg_set *as,
struct multipath *m)
{
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{1, 1024, "invalid number of paths"},
{0, 1024, "invalid number of selector args"}
};
@@ -898,7 +902,7 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m)
int ret;
struct dm_target *ti = m->ti;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 1024, "invalid number of hardware handler args"},
};
@@ -950,7 +954,7 @@ static int parse_features(struct dm_arg_set *as, struct multipath *m)
struct dm_target *ti = m->ti;
const char *arg_name;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 8, "invalid number of feature args"},
{1, 50, "pg_init_retries must be between 1 and 50"},
{0, 60000, "pg_init_delay_msecs must be between 0 and 60000"},
@@ -1019,7 +1023,7 @@ static int parse_features(struct dm_arg_set *as, struct multipath *m)
static int multipath_ctr(struct dm_target *ti, unsigned argc, char **argv)
{
/* target arguments */
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 1024, "invalid number of priority groups"},
{0, 1024, "invalid initial priority group number"},
};
@@ -1379,6 +1383,7 @@ static void pg_init_done(void *data, int errors)
case SCSI_DH_RETRY:
/* Wait before retrying. */
delay_retry = 1;
+ /* fall through */
case SCSI_DH_IMM_RETRY:
case SCSI_DH_RES_TEMP_UNAVAIL:
if (pg_init_limit_reached(m, pgpath))
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index 5bfe285ea9d1..2245d06d2045 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -3238,7 +3238,7 @@ static int raid_map(struct dm_target *ti, struct bio *bio)
if (unlikely(bio_end_sector(bio) > mddev->array_sectors))
return DM_MAPIO_REQUEUE;
- mddev->pers->make_request(mddev, bio);
+ md_handle_request(mddev, bio);
return DM_MAPIO_SUBMITTED;
}
@@ -3297,11 +3297,10 @@ static const char *__raid_dev_status(struct raid_set *rs, struct md_rdev *rdev,
static sector_t rs_get_progress(struct raid_set *rs,
sector_t resync_max_sectors, bool *array_in_sync)
{
- sector_t r, recovery_cp, curr_resync_completed;
+ sector_t r, curr_resync_completed;
struct mddev *mddev = &rs->md;
curr_resync_completed = mddev->curr_resync_completed ?: mddev->recovery_cp;
- recovery_cp = mddev->recovery_cp;
*array_in_sync = false;
if (rs_is_raid0(rs)) {
@@ -3330,9 +3329,11 @@ static sector_t rs_get_progress(struct raid_set *rs,
} else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
r = curr_resync_completed;
else
- r = recovery_cp;
+ r = mddev->recovery_cp;
- if (r == MaxSector) {
+ if ((r == MaxSector) ||
+ (test_bit(MD_RECOVERY_DONE, &mddev->recovery) &&
+ (mddev->curr_resync_completed == resync_max_sectors))) {
/*
* Sync complete.
*/
@@ -3892,7 +3893,7 @@ static void raid_resume(struct dm_target *ti)
static struct target_type raid_target = {
.name = "raid",
- .version = {1, 12, 1},
+ .version = {1, 13, 0},
.module = THIS_MODULE,
.ctr = raid_ctr,
.dtr = raid_dtr,
diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index c6ebc5b1e00e..eadfcfd106ff 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -117,9 +117,9 @@ static void end_clone_bio(struct bio *clone)
struct dm_rq_clone_bio_info *info =
container_of(clone, struct dm_rq_clone_bio_info, clone);
struct dm_rq_target_io *tio = info->tio;
- struct bio *bio = info->orig;
unsigned int nr_bytes = info->orig->bi_iter.bi_size;
blk_status_t error = clone->bi_status;
+ bool is_last = !clone->bi_next;
bio_put(clone);
@@ -137,28 +137,23 @@ static void end_clone_bio(struct bio *clone)
* when the request is completed.
*/
tio->error = error;
- return;
+ goto exit;
}
/*
* I/O for the bio successfully completed.
* Notice the data completion to the upper layer.
*/
-
- /*
- * bios are processed from the head of the list.
- * So the completing bio should always be rq->bio.
- * If it's not, something wrong is happening.
- */
- if (tio->orig->bio != bio)
- DMERR("bio completion is going in the middle of the request");
+ tio->completed += nr_bytes;
/*
* Update the original request.
* Do not use blk_end_request() here, because it may complete
* the original request before the clone, and break the ordering.
*/
- blk_update_request(tio->orig, BLK_STS_OK, nr_bytes);
+ if (is_last)
+ exit:
+ blk_update_request(tio->orig, BLK_STS_OK, tio->completed);
}
static struct dm_rq_target_io *tio_from_request(struct request *rq)
@@ -237,14 +232,14 @@ static void dm_end_request(struct request *clone, blk_status_t error)
/*
* Requeue the original request of a clone.
*/
-static void dm_old_requeue_request(struct request *rq)
+static void dm_old_requeue_request(struct request *rq, unsigned long delay_ms)
{
struct request_queue *q = rq->q;
unsigned long flags;
spin_lock_irqsave(q->queue_lock, flags);
blk_requeue_request(q, rq);
- blk_run_queue_async(q);
+ blk_delay_queue(q, delay_ms);
spin_unlock_irqrestore(q->queue_lock, flags);
}
@@ -270,6 +265,7 @@ static void dm_requeue_original_request(struct dm_rq_target_io *tio, bool delay_
struct mapped_device *md = tio->md;
struct request *rq = tio->orig;
int rw = rq_data_dir(rq);
+ unsigned long delay_ms = delay_requeue ? 100 : 0;
rq_end_stats(md, rq);
if (tio->clone) {
@@ -278,9 +274,9 @@ static void dm_requeue_original_request(struct dm_rq_target_io *tio, bool delay_
}
if (!rq->q->mq_ops)
- dm_old_requeue_request(rq);
+ dm_old_requeue_request(rq, delay_ms);
else
- dm_mq_delay_requeue_request(rq, delay_requeue ? 100/*ms*/ : 0);
+ dm_mq_delay_requeue_request(rq, delay_ms);
rq_completed(md, rw, false);
}
@@ -455,6 +451,7 @@ static void init_tio(struct dm_rq_target_io *tio, struct request *rq,
tio->clone = NULL;
tio->orig = rq;
tio->error = 0;
+ tio->completed = 0;
/*
* Avoid initializing info for blk-mq; it passes
* target-specific data through info.ptr
diff --git a/drivers/md/dm-rq.h b/drivers/md/dm-rq.h
index 9813922e4fe5..f43c45460aac 100644
--- a/drivers/md/dm-rq.h
+++ b/drivers/md/dm-rq.h
@@ -29,6 +29,7 @@ struct dm_rq_target_io {
struct dm_stats_aux stats_aux;
unsigned long duration_jiffies;
unsigned n_sectors;
+ unsigned completed;
};
/*
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c
index ab50d7c4377f..b5e892149c54 100644
--- a/drivers/md/dm-stripe.c
+++ b/drivers/md/dm-stripe.c
@@ -351,25 +351,6 @@ static size_t stripe_dax_copy_from_iter(struct dm_target *ti, pgoff_t pgoff,
return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i);
}
-static void stripe_dax_flush(struct dm_target *ti, pgoff_t pgoff, void *addr,
- size_t size)
-{
- sector_t dev_sector, sector = pgoff * PAGE_SECTORS;
- struct stripe_c *sc = ti->private;
- struct dax_device *dax_dev;
- struct block_device *bdev;
- uint32_t stripe;
-
- stripe_map_sector(sc, sector, &stripe, &dev_sector);
- dev_sector += sc->stripe[stripe].physical_start;
- dax_dev = sc->stripe[stripe].dev->dax_dev;
- bdev = sc->stripe[stripe].dev->bdev;
-
- if (bdev_dax_pgoff(bdev, dev_sector, ALIGN(size, PAGE_SIZE), &pgoff))
- return;
- dax_flush(dax_dev, pgoff, addr, size);
-}
-
/*
* Stripe status:
*
@@ -489,7 +470,6 @@ static struct target_type stripe_target = {
.io_hints = stripe_io_hints,
.direct_access = stripe_dax_direct_access,
.dax_copy_from_iter = stripe_dax_copy_from_iter,
- .dax_flush = stripe_dax_flush,
};
int __init dm_stripe_init(void)
diff --git a/drivers/md/dm-switch.c b/drivers/md/dm-switch.c
index 2dcea4c56f37..4c8de1ff78ca 100644
--- a/drivers/md/dm-switch.c
+++ b/drivers/md/dm-switch.c
@@ -251,7 +251,7 @@ static void switch_dtr(struct dm_target *ti)
*/
static int switch_ctr(struct dm_target *ti, unsigned argc, char **argv)
{
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{1, (KMALLOC_MAX_SIZE - sizeof(struct switch_ctx)) / sizeof(struct switch_path), "Invalid number of paths"},
{1, UINT_MAX, "Invalid region size"},
{0, 0, "Invalid number of optional args"},
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 28a4071cdf85..ef7b8f201f73 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -806,7 +806,8 @@ int dm_table_add_target(struct dm_table *t, const char *type,
/*
* Target argument parsing helpers.
*/
-static int validate_next_arg(struct dm_arg *arg, struct dm_arg_set *arg_set,
+static int validate_next_arg(const struct dm_arg *arg,
+ struct dm_arg_set *arg_set,
unsigned *value, char **error, unsigned grouped)
{
const char *arg_str = dm_shift_arg(arg_set);
@@ -824,14 +825,14 @@ static int validate_next_arg(struct dm_arg *arg, struct dm_arg_set *arg_set,
return 0;
}
-int dm_read_arg(struct dm_arg *arg, struct dm_arg_set *arg_set,
+int dm_read_arg(const struct dm_arg *arg, struct dm_arg_set *arg_set,
unsigned *value, char **error)
{
return validate_next_arg(arg, arg_set, value, error, 0);
}
EXPORT_SYMBOL(dm_read_arg);
-int dm_read_arg_group(struct dm_arg *arg, struct dm_arg_set *arg_set,
+int dm_read_arg_group(const struct dm_arg *arg, struct dm_arg_set *arg_set,
unsigned *value, char **error)
{
return validate_next_arg(arg, arg_set, value, error, 1);
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 69d88aee3055..1e25705209c2 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -3041,7 +3041,7 @@ static int parse_pool_features(struct dm_arg_set *as, struct pool_features *pf,
unsigned argc;
const char *arg_name;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, 4, "Invalid number of pool feature arguments"},
};
diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
index 1c5b6185c79d..bda3caca23ca 100644
--- a/drivers/md/dm-verity-target.c
+++ b/drivers/md/dm-verity-target.c
@@ -839,7 +839,7 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v)
struct dm_target *ti = v->ti;
const char *arg_name;
- static struct dm_arg _args[] = {
+ static const struct dm_arg _args[] = {
{0, DM_VERITY_OPTS_MAX, "Invalid number of feature args"},
};
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 04ae795e8a5f..4be85324f44d 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -52,6 +52,12 @@ static struct workqueue_struct *deferred_remove_workqueue;
atomic_t dm_global_event_nr = ATOMIC_INIT(0);
DECLARE_WAIT_QUEUE_HEAD(dm_global_eventq);
+void dm_issue_global_event(void)
+{
+ atomic_inc(&dm_global_event_nr);
+ wake_up(&dm_global_eventq);
+}
+
/*
* One of these is allocated per bio.
*/
@@ -987,24 +993,6 @@ static size_t dm_dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff,
return ret;
}
-static void dm_dax_flush(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
- size_t size)
-{
- struct mapped_device *md = dax_get_private(dax_dev);
- sector_t sector = pgoff * PAGE_SECTORS;
- struct dm_target *ti;
- int srcu_idx;
-
- ti = dm_dax_get_live_target(md, sector, &srcu_idx);
-
- if (!ti)
- goto out;
- if (ti->type->dax_flush)
- ti->type->dax_flush(ti, pgoff, addr, size);
- out:
- dm_put_live_table(md, srcu_idx);
-}
-
/*
* A target may call dm_accept_partial_bio only from the map routine. It is
* allowed for all bio types except REQ_PREFLUSH.
@@ -1883,9 +1871,8 @@ static void event_callback(void *context)
dm_send_uevents(&uevents, &disk_to_dev(md->disk)->kobj);
atomic_inc(&md->event_nr);
- atomic_inc(&dm_global_event_nr);
wake_up(&md->eventq);
- wake_up(&dm_global_eventq);
+ dm_issue_global_event();
}
/*
@@ -2301,6 +2288,7 @@ struct dm_table *dm_swap_table(struct mapped_device *md, struct dm_table *table)
}
map = __bind(md, table, &limits);
+ dm_issue_global_event();
out:
mutex_unlock(&md->suspend_lock);
@@ -2992,7 +2980,6 @@ static const struct block_device_operations dm_blk_dops = {
static const struct dax_operations dm_dax_ops = {
.direct_access = dm_dax_direct_access,
.copy_from_iter = dm_dax_copy_from_iter,
- .flush = dm_dax_flush,
};
/*
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 08fcaebc61bd..0ff1bbf6c90e 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -266,6 +266,37 @@ static DEFINE_SPINLOCK(all_mddevs_lock);
* call has finished, the bio has been linked into some internal structure
* and so is visible to ->quiesce(), so we don't need the refcount any more.
*/
+void md_handle_request(struct mddev *mddev, struct bio *bio)
+{
+check_suspended:
+ rcu_read_lock();
+ if (mddev->suspended) {
+ DEFINE_WAIT(__wait);
+ for (;;) {
+ prepare_to_wait(&mddev->sb_wait, &__wait,
+ TASK_UNINTERRUPTIBLE);
+ if (!mddev->suspended)
+ break;
+ rcu_read_unlock();
+ schedule();
+ rcu_read_lock();
+ }
+ finish_wait(&mddev->sb_wait, &__wait);
+ }
+ atomic_inc(&mddev->active_io);
+ rcu_read_unlock();
+
+ if (!mddev->pers->make_request(mddev, bio)) {
+ atomic_dec(&mddev->active_io);
+ wake_up(&mddev->sb_wait);
+ goto check_suspended;
+ }
+
+ if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended)
+ wake_up(&mddev->sb_wait);
+}
+EXPORT_SYMBOL(md_handle_request);
+
static blk_qc_t md_make_request(struct request_queue *q, struct bio *bio)
{
const int rw = bio_data_dir(bio);
@@ -285,23 +316,6 @@ static blk_qc_t md_make_request(struct request_queue *q, struct bio *bio)
bio_endio(bio);
return BLK_QC_T_NONE;
}
-check_suspended:
- rcu_read_lock();
- if (mddev->suspended) {
- DEFINE_WAIT(__wait);
- for (;;) {
- prepare_to_wait(&mddev->sb_wait, &__wait,
- TASK_UNINTERRUPTIBLE);
- if (!mddev->suspended)
- break;
- rcu_read_unlock();
- schedule();
- rcu_read_lock();
- }
- finish_wait(&mddev->sb_wait, &__wait);
- }
- atomic_inc(&mddev->active_io);
- rcu_read_unlock();
/*
* save the sectors now since our bio can
@@ -310,20 +324,14 @@ check_suspended:
sectors = bio_sectors(bio);
/* bio could be mergeable after passing to underlayer */
bio->bi_opf &= ~REQ_NOMERGE;
- if (!mddev->pers->make_request(mddev, bio)) {
- atomic_dec(&mddev->active_io);
- wake_up(&mddev->sb_wait);
- goto check_suspended;
- }
+
+ md_handle_request(mddev, bio);
cpu = part_stat_lock();
part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]);
part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], sectors);
part_stat_unlock();
- if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended)
- wake_up(&mddev->sb_wait);
-
return BLK_QC_T_NONE;
}
@@ -439,16 +447,22 @@ static void md_submit_flush_data(struct work_struct *ws)
struct mddev *mddev = container_of(ws, struct mddev, flush_work);
struct bio *bio = mddev->flush_bio;
+ /*
+ * must reset flush_bio before calling into md_handle_request to avoid a
+ * deadlock, because other bios passed md_handle_request suspend check
+ * could wait for this and below md_handle_request could wait for those
+ * bios because of suspend check
+ */
+ mddev->flush_bio = NULL;
+ wake_up(&mddev->sb_wait);
+
if (bio->bi_iter.bi_size == 0)
/* an empty barrier - all done */
bio_endio(bio);
else {
bio->bi_opf &= ~REQ_PREFLUSH;
- mddev->pers->make_request(mddev, bio);
+ md_handle_request(mddev, bio);
}
-
- mddev->flush_bio = NULL;
- wake_up(&mddev->sb_wait);
}
void md_flush_request(struct mddev *mddev, struct bio *bio)
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 561d22b9a9a8..d8287d3cd1bf 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -692,6 +692,7 @@ extern void md_stop_writes(struct mddev *mddev);
extern int md_rdev_init(struct md_rdev *rdev);
extern void md_rdev_clear(struct md_rdev *rdev);
+extern void md_handle_request(struct mddev *mddev, struct bio *bio);
extern void mddev_suspend(struct mddev *mddev);
extern void mddev_resume(struct mddev *mddev);
extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 4188a4881148..928e24a07133 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -811,6 +811,14 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
spin_unlock(&head->batch_head->batch_lock);
goto unlock_out;
}
+ /*
+ * We must assign batch_head of this stripe within the
+ * batch_lock, otherwise clear_batch_ready of batch head
+ * stripe could clear BATCH_READY bit of this stripe and
+ * this stripe->batch_head doesn't get assigned, which
+ * could confuse clear_batch_ready for this stripe
+ */
+ sh->batch_head = head->batch_head;
/*
* at this point, head's BATCH_READY could be cleared, but we
@@ -818,8 +826,6 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
*/
list_add(&sh->batch_list, &head->batch_list);
spin_unlock(&head->batch_head->batch_lock);
-
- sh->batch_head = head->batch_head;
} else {
head->batch_head = head;
sh->batch_head = head->batch_head;
@@ -4599,7 +4605,8 @@ static void break_stripe_batch_list(struct stripe_head *head_sh,
set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS |
(1 << STRIPE_PREREAD_ACTIVE) |
- (1 << STRIPE_DEGRADED)),
+ (1 << STRIPE_DEGRADED) |
+ (1 << STRIPE_ON_UNPLUG_LIST)),
head_sh->state & (1 << STRIPE_INSYNC));
sh->check_state = head_sh->check_state;
@@ -6568,14 +6575,17 @@ static ssize_t
raid5_store_group_thread_cnt(struct mddev *mddev, const char *page, size_t len)
{
struct r5conf *conf;
- unsigned long new;
+ unsigned int new;
int err;
struct r5worker_group *new_groups, *old_groups;
int group_cnt, worker_cnt_per_group;
if (len >= PAGE_SIZE)
return -EINVAL;
- if (kstrtoul(page, 10, &new))
+ if (kstrtouint(page, 10, &new))
+ return -EINVAL;
+ /* 8192 should be big enough */
+ if (new > 8192)
return -EINVAL;
err = mddev_lock(mddev);
diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c
index dd769e40416f..eed6c397d840 100644
--- a/drivers/media/cec/cec-adap.c
+++ b/drivers/media/cec/cec-adap.c
@@ -181,7 +181,10 @@ static void cec_queue_msg_fh(struct cec_fh *fh, const struct cec_msg *msg)
{
static const struct cec_event ev_lost_msgs = {
.event = CEC_EVENT_LOST_MSGS,
- .lost_msgs.lost_msgs = 1,
+ .flags = 0,
+ {
+ .lost_msgs = { 1 },
+ },
};
struct cec_msg_entry *entry;
diff --git a/drivers/media/pci/cx25821/cx25821-audio-upstream.c b/drivers/media/pci/cx25821/cx25821-audio-upstream.c
index b94eb1c0023d..ada26d4acfb4 100644
--- a/drivers/media/pci/cx25821/cx25821-audio-upstream.c
+++ b/drivers/media/pci/cx25821/cx25821-audio-upstream.c
@@ -277,7 +277,7 @@ static int cx25821_get_audio_data(struct cx25821_dev *dev,
p = (char *)dev->_audiodata_buf_virt_addr + frame_offset;
for (i = 0; i < dev->_audio_lines_count; i++) {
- int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE);
+ int n = kernel_read(file, mybuf, AUDIO_LINE_SIZE, &file_offset);
if (n < AUDIO_LINE_SIZE) {
pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
__func__);
@@ -290,7 +290,6 @@ static int cx25821_get_audio_data(struct cx25821_dev *dev,
memcpy(p, mybuf, n);
p += n;
}
- file_offset += n;
}
dev->_audioframe_count++;
fput(file);
@@ -318,7 +317,7 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,
{
char *p = (void *)dev->_audiodata_buf_virt_addr;
struct file *file;
- loff_t offset;
+ loff_t file_offset = 0;
int i, j;
file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
@@ -328,11 +327,11 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,
return PTR_ERR(file);
}
- for (j = 0, offset = 0; j < NUM_AUDIO_FRAMES; j++) {
+ for (j = 0; j < NUM_AUDIO_FRAMES; j++) {
for (i = 0; i < dev->_audio_lines_count; i++) {
char buf[AUDIO_LINE_SIZE];
- int n = kernel_read(file, offset, buf,
- AUDIO_LINE_SIZE);
+ loff_t offset = file_offset;
+ int n = kernel_read(file, buf, AUDIO_LINE_SIZE, &file_offset);
if (n < AUDIO_LINE_SIZE) {
pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
@@ -344,8 +343,6 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,
if (p)
memcpy(p + offset, buf, n);
-
- offset += n;
}
dev->_audioframe_count++;
}
diff --git a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c
index 96dc01750bc0..36762ec954e7 100644
--- a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c
+++ b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c
@@ -1708,11 +1708,10 @@ static int sh_mobile_ceu_probe(struct platform_device *pdev)
err = dma_declare_coherent_memory(&pdev->dev, res->start,
res->start,
resource_size(res),
- DMA_MEMORY_MAP |
DMA_MEMORY_EXCLUSIVE);
- if (!err) {
+ if (err) {
dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
- return -ENXIO;
+ return err;
}
pcdev->video_limit = resource_size(res);
diff --git a/drivers/media/rc/ir-sharp-decoder.c b/drivers/media/rc/ir-sharp-decoder.c
index ed43a4212479..129b558acc92 100644
--- a/drivers/media/rc/ir-sharp-decoder.c
+++ b/drivers/media/rc/ir-sharp-decoder.c
@@ -245,5 +245,5 @@ module_init(ir_sharp_decode_init);
module_exit(ir_sharp_decode_exit);
MODULE_LICENSE("GPL");
-MODULE_AUTHOR("James Hogan <[email protected]>");
+MODULE_AUTHOR("James Hogan <[email protected]>");
MODULE_DESCRIPTION("Sharp IR protocol decoder");
diff --git a/drivers/memory/atmel-ebi.c b/drivers/memory/atmel-ebi.c
index c00a7c7f460a..b907865d4664 100644
--- a/drivers/memory/atmel-ebi.c
+++ b/drivers/memory/atmel-ebi.c
@@ -159,8 +159,8 @@ static int atmel_ebi_xslate_smc_timings(struct atmel_ebi_dev *ebid,
out:
if (ret) {
dev_err(ebid->ebi->dev,
- "missing or invalid timings definition in %s",
- np->full_name);
+ "missing or invalid timings definition in %pOF",
+ np);
return ret;
}
@@ -270,8 +270,8 @@ static int atmel_ebi_xslate_smc_config(struct atmel_ebi_dev *ebid,
return -EINVAL;
if ((ret > 0 && !required) || (!ret && required)) {
- dev_err(ebid->ebi->dev, "missing atmel,smc- properties in %s",
- np->full_name);
+ dev_err(ebid->ebi->dev, "missing atmel,smc- properties in %pOF",
+ np);
return -EINVAL;
}
@@ -314,8 +314,7 @@ static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np,
if (cs >= AT91_MATRIX_EBI_NUM_CS ||
!(ebi->caps->available_cs & BIT(cs))) {
- dev_err(dev, "invalid reg property in %s\n",
- np->full_name);
+ dev_err(dev, "invalid reg property in %pOF\n", np);
return -EINVAL;
}
@@ -324,7 +323,7 @@ static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np,
}
if (!numcs) {
- dev_err(dev, "invalid reg property in %s\n", np->full_name);
+ dev_err(dev, "invalid reg property in %pOF\n", np);
return -EINVAL;
}
@@ -576,8 +575,8 @@ static int atmel_ebi_probe(struct platform_device *pdev)
ret = atmel_ebi_dev_setup(ebi, child, reg_cells);
if (ret) {
- dev_err(dev, "failed to configure EBI bus for %s, disabling the device",
- child->full_name);
+ dev_err(dev, "failed to configure EBI bus for %pOF, disabling the device",
+ child);
ret = atmel_ebi_dev_disable(ebi, child);
if (ret)
diff --git a/drivers/memory/jz4780-nemc.c b/drivers/memory/jz4780-nemc.c
index 919d1925acb9..bcf06adefc96 100644
--- a/drivers/memory/jz4780-nemc.c
+++ b/drivers/memory/jz4780-nemc.c
@@ -322,8 +322,8 @@ static int jz4780_nemc_probe(struct platform_device *pdev)
bank = of_read_number(prop, 1);
if (bank < 1 || bank >= JZ4780_NEMC_NUM_BANKS) {
dev_err(nemc->dev,
- "%s requests invalid bank %u\n",
- child->full_name, bank);
+ "%pOF requests invalid bank %u\n",
+ child, bank);
/* Will continue the outer loop below. */
referenced = 0;
@@ -334,12 +334,12 @@ static int jz4780_nemc_probe(struct platform_device *pdev)
}
if (!referenced) {
- dev_err(nemc->dev, "%s has no addresses\n",
- child->full_name);
+ dev_err(nemc->dev, "%pOF has no addresses\n",
+ child);
continue;
} else if (nemc->banks_present & referenced) {
- dev_err(nemc->dev, "%s conflicts with another node\n",
- child->full_name);
+ dev_err(nemc->dev, "%pOF conflicts with another node\n",
+ child);
continue;
}
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index 4afbc412f959..8f2d152a78b8 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -16,6 +16,7 @@
#include <linux/device.h>
#include <linux/err.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
@@ -23,7 +24,10 @@
#include <soc/mediatek/smi.h>
#include <dt-bindings/memory/mt2701-larb-port.h>
+/* mt8173 */
#define SMI_LARB_MMU_EN 0xf00
+
+/* mt2701 */
#define REG_SMI_SECUR_CON_BASE 0x5c0
/* every register control 8 port, register offset 0x4 */
@@ -41,7 +45,12 @@
/* mt2701 domain should be set to 3 */
#define SMI_SECUR_CON_VAL_DOMAIN(id) (0x3 << ((((id) & 0x7) << 2) + 1))
+/* mt2712 */
+#define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
+#define F_MMU_EN BIT(0)
+
struct mtk_smi_larb_gen {
+ bool need_larbid;
int port_in_larb[MTK_LARB_NR_MAX + 1];
void (*config_port)(struct device *);
};
@@ -148,6 +157,15 @@ mtk_smi_larb_bind(struct device *dev, struct device *master, void *data)
struct mtk_smi_iommu *smi_iommu = data;
unsigned int i;
+ if (larb->larb_gen->need_larbid) {
+ larb->mmu = &smi_iommu->larb_imu[larb->larbid].mmu;
+ return 0;
+ }
+
+ /*
+ * If there is no larbid property, Loop to find the corresponding
+ * iommu information.
+ */
for (i = 0; i < smi_iommu->larb_nr; i++) {
if (dev == smi_iommu->larb_imu[i].dev) {
/* The 'mmu' may be updated in iommu-attach/detach. */
@@ -158,13 +176,32 @@ mtk_smi_larb_bind(struct device *dev, struct device *master, void *data)
return -ENODEV;
}
-static void mtk_smi_larb_config_port(struct device *dev)
+static void mtk_smi_larb_config_port_mt2712(struct device *dev)
{
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
+ u32 reg;
+ int i;
- writel(*larb->mmu, larb->base + SMI_LARB_MMU_EN);
+ /*
+ * larb 8/9 is the bdpsys larb, the iommu_en is enabled defaultly.
+ * Don't need to set it again.
+ */
+ if (larb->larbid == 8 || larb->larbid == 9)
+ return;
+
+ for_each_set_bit(i, (unsigned long *)larb->mmu, 32) {
+ reg = readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i));
+ reg |= F_MMU_EN;
+ writel(reg, larb->base + SMI_LARB_NONSEC_CON(i));
+ }
}
+static void mtk_smi_larb_config_port_mt8173(struct device *dev)
+{
+ struct mtk_smi_larb *larb = dev_get_drvdata(dev);
+
+ writel(*larb->mmu, larb->base + SMI_LARB_MMU_EN);
+}
static void mtk_smi_larb_config_port_gen1(struct device *dev)
{
@@ -210,10 +247,11 @@ static const struct component_ops mtk_smi_larb_component_ops = {
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8173 = {
/* mt8173 do not need the port in larb */
- .config_port = mtk_smi_larb_config_port,
+ .config_port = mtk_smi_larb_config_port_mt8173,
};
static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701 = {
+ .need_larbid = true,
.port_in_larb = {
LARB0_PORT_OFFSET, LARB1_PORT_OFFSET,
LARB2_PORT_OFFSET, LARB3_PORT_OFFSET
@@ -221,6 +259,11 @@ static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701 = {
.config_port = mtk_smi_larb_config_port_gen1,
};
+static const struct mtk_smi_larb_gen mtk_smi_larb_mt2712 = {
+ .need_larbid = true,
+ .config_port = mtk_smi_larb_config_port_mt2712,
+};
+
static const struct of_device_id mtk_smi_larb_of_ids[] = {
{
.compatible = "mediatek,mt8173-smi-larb",
@@ -230,6 +273,10 @@ static const struct of_device_id mtk_smi_larb_of_ids[] = {
.compatible = "mediatek,mt2701-smi-larb",
.data = &mtk_smi_larb_mt2701
},
+ {
+ .compatible = "mediatek,mt2712-smi-larb",
+ .data = &mtk_smi_larb_mt2712
+ },
{}
};
@@ -240,20 +287,13 @@ static int mtk_smi_larb_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct device_node *smi_node;
struct platform_device *smi_pdev;
- const struct of_device_id *of_id;
-
- if (!dev->pm_domain)
- return -EPROBE_DEFER;
-
- of_id = of_match_node(mtk_smi_larb_of_ids, pdev->dev.of_node);
- if (!of_id)
- return -EINVAL;
+ int err;
larb = devm_kzalloc(dev, sizeof(*larb), GFP_KERNEL);
if (!larb)
return -ENOMEM;
- larb->larb_gen = of_id->data;
+ larb->larb_gen = of_device_get_match_data(dev);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
larb->base = devm_ioremap_resource(dev, res);
if (IS_ERR(larb->base))
@@ -268,6 +308,15 @@ static int mtk_smi_larb_probe(struct platform_device *pdev)
return PTR_ERR(larb->smi.clk_smi);
larb->smi.dev = dev;
+ if (larb->larb_gen->need_larbid) {
+ err = of_property_read_u32(dev->of_node, "mediatek,larb-id",
+ &larb->larbid);
+ if (err) {
+ dev_err(dev, "missing larbid property\n");
+ return err;
+ }
+ }
+
smi_node = of_parse_phandle(dev->of_node, "mediatek,smi", 0);
if (!smi_node)
return -EINVAL;
@@ -275,6 +324,8 @@ static int mtk_smi_larb_probe(struct platform_device *pdev)
smi_pdev = of_find_device_by_node(smi_node);
of_node_put(smi_node);
if (smi_pdev) {
+ if (!platform_get_drvdata(smi_pdev))
+ return -EPROBE_DEFER;
larb->smi_common_dev = &smi_pdev->dev;
} else {
dev_err(dev, "Failed to get the smi_common device\n");
@@ -311,6 +362,10 @@ static const struct of_device_id mtk_smi_common_of_ids[] = {
.compatible = "mediatek,mt2701-smi-common",
.data = (void *)MTK_SMI_GEN1
},
+ {
+ .compatible = "mediatek,mt2712-smi-common",
+ .data = (void *)MTK_SMI_GEN2
+ },
{}
};
@@ -319,11 +374,8 @@ static int mtk_smi_common_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct mtk_smi *common;
struct resource *res;
- const struct of_device_id *of_id;
enum mtk_smi_gen smi_gen;
-
- if (!dev->pm_domain)
- return -EPROBE_DEFER;
+ int ret;
common = devm_kzalloc(dev, sizeof(*common), GFP_KERNEL);
if (!common)
@@ -338,17 +390,13 @@ static int mtk_smi_common_probe(struct platform_device *pdev)
if (IS_ERR(common->clk_smi))
return PTR_ERR(common->clk_smi);
- of_id = of_match_node(mtk_smi_common_of_ids, pdev->dev.of_node);
- if (!of_id)
- return -EINVAL;
-
/*
* for mtk smi gen 1, we need to get the ao(always on) base to config
* m4u port, and we need to enable the aync clock for transform the smi
* clock into emi clock domain, but for mtk smi gen2, there's no smi ao
* base.
*/
- smi_gen = (enum mtk_smi_gen)of_id->data;
+ smi_gen = (enum mtk_smi_gen)of_device_get_match_data(dev);
if (smi_gen == MTK_SMI_GEN1) {
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
common->smi_ao_base = devm_ioremap_resource(dev, res);
@@ -359,7 +407,9 @@ static int mtk_smi_common_probe(struct platform_device *pdev)
if (IS_ERR(common->clk_async))
return PTR_ERR(common->clk_async);
- clk_prepare_enable(common->clk_async);
+ ret = clk_prepare_enable(common->clk_async);
+ if (ret)
+ return ret;
}
pm_runtime_enable(dev);
platform_set_drvdata(pdev, common);
@@ -403,4 +453,4 @@ err_unreg_smi:
return ret;
}
-subsys_initcall(mtk_smi_init);
+module_init(mtk_smi_init);
diff --git a/drivers/memory/mvebu-devbus.c b/drivers/memory/mvebu-devbus.c
index 24852812fd44..981860879d02 100644
--- a/drivers/memory/mvebu-devbus.c
+++ b/drivers/memory/mvebu-devbus.c
@@ -105,8 +105,8 @@ static int get_timing_param_ps(struct devbus *devbus,
err = of_property_read_u32(node, name, &time_ps);
if (err < 0) {
- dev_err(devbus->dev, "%s has no '%s' property\n",
- name, node->full_name);
+ dev_err(devbus->dev, "%pOF has no '%s' property\n",
+ node, name);
return err;
}
@@ -127,8 +127,8 @@ static int devbus_get_timing_params(struct devbus *devbus,
err = of_property_read_u32(node, "devbus,bus-width", &r->bus_width);
if (err < 0) {
dev_err(devbus->dev,
- "%s has no 'devbus,bus-width' property\n",
- node->full_name);
+ "%pOF has no 'devbus,bus-width' property\n",
+ node);
return err;
}
@@ -180,8 +180,8 @@ static int devbus_get_timing_params(struct devbus *devbus,
&w->sync_enable);
if (err < 0) {
dev_err(devbus->dev,
- "%s has no 'devbus,sync-enable' property\n",
- node->full_name);
+ "%pOF has no 'devbus,sync-enable' property\n",
+ node);
return err;
}
}
diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c
index a80e17de906d..7059bbda2fac 100644
--- a/drivers/memory/omap-gpmc.c
+++ b/drivers/memory/omap-gpmc.c
@@ -1930,8 +1930,8 @@ static int gpmc_probe_onenand_child(struct platform_device *pdev,
struct omap_onenand_platform_data *gpmc_onenand_data;
if (of_property_read_u32(child, "reg", &val) < 0) {
- dev_err(&pdev->dev, "%s has no 'reg' property\n",
- child->full_name);
+ dev_err(&pdev->dev, "%pOF has no 'reg' property\n",
+ child);
return -ENODEV;
}
@@ -1979,14 +1979,14 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
struct gpmc_device *gpmc = platform_get_drvdata(pdev);
if (of_property_read_u32(child, "reg", &cs) < 0) {
- dev_err(&pdev->dev, "%s has no 'reg' property\n",
- child->full_name);
+ dev_err(&pdev->dev, "%pOF has no 'reg' property\n",
+ child);
return -ENODEV;
}
if (of_address_to_resource(child, 0, &res) < 0) {
- dev_err(&pdev->dev, "%s has malformed 'reg' property\n",
- child->full_name);
+ dev_err(&pdev->dev, "%pOF has malformed 'reg' property\n",
+ child);
return -ENODEV;
}
@@ -2084,8 +2084,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
ret = of_property_read_u32(child, "bank-width",
&gpmc_s.device_width);
if (ret < 0) {
- dev_err(&pdev->dev, "%s has no 'bank-width' property\n",
- child->full_name);
+ dev_err(&pdev->dev, "%pOF has no 'bank-width' property\n",
+ child);
goto err;
}
}
diff --git a/drivers/mfd/kempld-core.c b/drivers/mfd/kempld-core.c
index 895f655780a7..55d824b3a808 100644
--- a/drivers/mfd/kempld-core.c
+++ b/drivers/mfd/kempld-core.c
@@ -494,7 +494,7 @@ static struct platform_driver kempld_driver = {
.remove = kempld_remove,
};
-static struct dmi_system_id kempld_dmi_table[] __initdata = {
+static const struct dmi_system_id kempld_dmi_table[] __initconst = {
{
.ident = "BBD6",
.matches = {
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index d18b3d9292fd..3ba04f371380 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1279,7 +1279,7 @@ ssize_t cxl_pci_afu_read_err_buffer(struct cxl_afu *afu, char *buf,
}
/* use bounce buffer for copy */
- tbuf = (void *)__get_free_page(GFP_TEMPORARY);
+ tbuf = (void *)__get_free_page(GFP_KERNEL);
if (!tbuf)
return -ENOMEM;
diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
index affa7370ba82..74c663b1c0a7 100644
--- a/drivers/mmc/core/queue.c
+++ b/drivers/mmc/core/queue.c
@@ -242,6 +242,12 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,
if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask)
limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT;
+ /*
+ * mmc_init_request() depends on card->bouncesz so it must be calculated
+ * before blk_init_allocated_queue() starts allocating requests.
+ */
+ card->bouncesz = mmc_queue_calc_bouncesz(host);
+
mq->card = card;
mq->queue = blk_alloc_queue(GFP_KERNEL);
if (!mq->queue)
@@ -265,7 +271,6 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,
if (mmc_can_erase(card))
mmc_queue_setup_discard(mq->queue, card);
- card->bouncesz = mmc_queue_calc_bouncesz(host);
if (card->bouncesz) {
blk_queue_max_hw_sectors(mq->queue, card->bouncesz / 512);
blk_queue_max_segments(mq->queue, card->bouncesz / 512);
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 02179ed2a40d..8c15637178ff 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -5,7 +5,7 @@
comment "MMC/SD/SDIO Host Controller Drivers"
config MMC_DEBUG
- bool "MMC host drivers debugginG"
+ bool "MMC host drivers debugging"
depends on MMC != n
help
This is an option for use by developers; most people should
diff --git a/drivers/mmc/host/cavium-thunderx.c b/drivers/mmc/host/cavium-thunderx.c
index b9cc95998799..eee08d81b242 100644
--- a/drivers/mmc/host/cavium-thunderx.c
+++ b/drivers/mmc/host/cavium-thunderx.c
@@ -7,6 +7,7 @@
*
* Copyright (C) 2016 Cavium Inc.
*/
+#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/mmc/mmc.h>
@@ -149,8 +150,11 @@ error:
for (i = 0; i < CAVIUM_MAX_MMC; i++) {
if (host->slot[i])
cvm_mmc_of_slot_remove(host->slot[i]);
- if (host->slot_pdev[i])
+ if (host->slot_pdev[i]) {
+ get_device(&host->slot_pdev[i]->dev);
of_platform_device_destroy(&host->slot_pdev[i]->dev, NULL);
+ put_device(&host->slot_pdev[i]->dev);
+ }
}
clk_disable_unprepare(host->clk);
return ret;
diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
index bbaddf18a1b3..d0ccc6729fd2 100644
--- a/drivers/mmc/host/sdhci-pci-core.c
+++ b/drivers/mmc/host/sdhci-pci-core.c
@@ -392,6 +392,7 @@ static const struct sdhci_pci_fixes sdhci_intel_pch_sdio = {
enum {
INTEL_DSM_FNS = 0,
+ INTEL_DSM_V18_SWITCH = 3,
INTEL_DSM_DRV_STRENGTH = 9,
INTEL_DSM_D3_RETUNE = 10,
};
@@ -557,6 +558,19 @@ static void intel_hs400_enhanced_strobe(struct mmc_host *mmc,
sdhci_writel(host, val, INTEL_HS400_ES_REG);
}
+static void sdhci_intel_voltage_switch(struct sdhci_host *host)
+{
+ struct sdhci_pci_slot *slot = sdhci_priv(host);
+ struct intel_host *intel_host = sdhci_pci_priv(slot);
+ struct device *dev = &slot->chip->pdev->dev;
+ u32 result = 0;
+ int err;
+
+ err = intel_dsm(intel_host, dev, INTEL_DSM_V18_SWITCH, &result);
+ pr_debug("%s: %s DSM error %d result %u\n",
+ mmc_hostname(host->mmc), __func__, err, result);
+}
+
static const struct sdhci_ops sdhci_intel_byt_ops = {
.set_clock = sdhci_set_clock,
.set_power = sdhci_intel_set_power,
@@ -565,6 +579,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
.reset = sdhci_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
.hw_reset = sdhci_pci_hw_reset,
+ .voltage_switch = sdhci_intel_voltage_switch,
};
static void byt_read_dsm(struct sdhci_pci_slot *slot)
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index 12cf8288d663..a7293e186e03 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -129,50 +129,6 @@ static int tmio_mmc_next_sg(struct tmio_mmc_host *host)
#define CMDREQ_TIMEOUT 5000
-#ifdef CONFIG_MMC_DEBUG
-
-#define STATUS_TO_TEXT(a, status, i) \
- do { \
- if ((status) & TMIO_STAT_##a) { \
- if ((i)++) \
- printk(KERN_DEBUG " | "); \
- printk(KERN_DEBUG #a); \
- } \
- } while (0)
-
-static void pr_debug_status(u32 status)
-{
- int i = 0;
-
- pr_debug("status: %08x = ", status);
- STATUS_TO_TEXT(CARD_REMOVE, status, i);
- STATUS_TO_TEXT(CARD_INSERT, status, i);
- STATUS_TO_TEXT(SIGSTATE, status, i);
- STATUS_TO_TEXT(WRPROTECT, status, i);
- STATUS_TO_TEXT(CARD_REMOVE_A, status, i);
- STATUS_TO_TEXT(CARD_INSERT_A, status, i);
- STATUS_TO_TEXT(SIGSTATE_A, status, i);
- STATUS_TO_TEXT(CMD_IDX_ERR, status, i);
- STATUS_TO_TEXT(STOPBIT_ERR, status, i);
- STATUS_TO_TEXT(ILL_FUNC, status, i);
- STATUS_TO_TEXT(CMD_BUSY, status, i);
- STATUS_TO_TEXT(CMDRESPEND, status, i);
- STATUS_TO_TEXT(DATAEND, status, i);
- STATUS_TO_TEXT(CRCFAIL, status, i);
- STATUS_TO_TEXT(DATATIMEOUT, status, i);
- STATUS_TO_TEXT(CMDTIMEOUT, status, i);
- STATUS_TO_TEXT(RXOVERFLOW, status, i);
- STATUS_TO_TEXT(TXUNDERRUN, status, i);
- STATUS_TO_TEXT(RXRDY, status, i);
- STATUS_TO_TEXT(TXRQ, status, i);
- STATUS_TO_TEXT(ILL_ACCESS, status, i);
- printk("\n");
-}
-
-#else
-#define pr_debug_status(s) do { } while (0)
-#endif
-
static void tmio_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
struct tmio_mmc_host *host = mmc_priv(mmc);
@@ -762,9 +718,6 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid)
status = sd_ctrl_read16_and_16_as_32(host, CTL_STATUS);
ireg = status & TMIO_MASK_IRQ & ~host->sdcard_irq_mask;
- pr_debug_status(status);
- pr_debug_status(ireg);
-
/* Clear the status except the interrupt status */
sd_ctrl_write32_as_16_and_16(host, CTL_STATUS, TMIO_MASK_IRQ);
diff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c
index b833e6cc684c..84b16133554b 100644
--- a/drivers/mtd/devices/docg3.c
+++ b/drivers/mtd/devices/docg3.c
@@ -1809,37 +1809,22 @@ static int dbg_protection_show(struct seq_file *s, void *p)
}
DEBUGFS_RO_ATTR(protection, dbg_protection_show);
-static int __init doc_dbg_register(struct docg3 *docg3)
-{
- struct dentry *root, *entry;
-
- root = debugfs_create_dir("docg3", NULL);
- if (!root)
- return -ENOMEM;
-
- entry = debugfs_create_file("flashcontrol", S_IRUSR, root, docg3,
- &flashcontrol_fops);
- if (entry)
- entry = debugfs_create_file("asic_mode", S_IRUSR, root,
- docg3, &asic_mode_fops);
- if (entry)
- entry = debugfs_create_file("device_id", S_IRUSR, root,
- docg3, &device_id_fops);
- if (entry)
- entry = debugfs_create_file("protection", S_IRUSR, root,
- docg3, &protection_fops);
- if (entry) {
- docg3->debugfs_root = root;
- return 0;
- } else {
- debugfs_remove_recursive(root);
- return -ENOMEM;
- }
-}
-
-static void doc_dbg_unregister(struct docg3 *docg3)
+static void __init doc_dbg_register(struct mtd_info *floor)
{
- debugfs_remove_recursive(docg3->debugfs_root);
+ struct dentry *root = floor->dbg.dfs_dir;
+ struct docg3 *docg3 = floor->priv;
+
+ if (IS_ERR_OR_NULL(root))
+ return;
+
+ debugfs_create_file("docg3_flashcontrol", S_IRUSR, root, docg3,
+ &flashcontrol_fops);
+ debugfs_create_file("docg3_asic_mode", S_IRUSR, root, docg3,
+ &asic_mode_fops);
+ debugfs_create_file("docg3_device_id", S_IRUSR, root, docg3,
+ &device_id_fops);
+ debugfs_create_file("docg3_protection", S_IRUSR, root, docg3,
+ &protection_fops);
}
/**
@@ -2114,6 +2099,8 @@ static int __init docg3_probe(struct platform_device *pdev)
0);
if (ret)
goto err_probe;
+
+ doc_dbg_register(cascade->floors[floor]);
}
ret = doc_register_sysfs(pdev, cascade);
@@ -2121,7 +2108,6 @@ static int __init docg3_probe(struct platform_device *pdev)
goto err_probe;
platform_set_drvdata(pdev, cascade);
- doc_dbg_register(cascade->floors[0]->priv);
return 0;
notfound:
@@ -2148,7 +2134,6 @@ static int docg3_release(struct platform_device *pdev)
int floor;
doc_unregister_sysfs(pdev, cascade);
- doc_dbg_unregister(docg3);
for (floor = 0; floor < DOC_MAX_NBFLOORS; floor++)
if (cascade->floors[floor])
doc_release_device(cascade->floors[floor]);
diff --git a/drivers/mtd/devices/docg3.h b/drivers/mtd/devices/docg3.h
index 19fb93f96a3a..e99946575398 100644
--- a/drivers/mtd/devices/docg3.h
+++ b/drivers/mtd/devices/docg3.h
@@ -299,7 +299,6 @@ struct docg3_cascade {
* @oob_autoecc: if 1, use only bytes 0-7, 15, and fill the others with HW ECC
* if 0, use all the 16 bytes.
* @oob_write_buf: prepared OOB for next page_write
- * @debugfs_root: debugfs root node
*/
struct docg3 {
struct device *dev;
@@ -312,7 +311,6 @@ struct docg3 {
loff_t oob_write_ofs;
int oob_autoecc;
u8 oob_write_buf[DOC_LAYOUT_OOB_SIZE];
- struct dentry *debugfs_root;
};
#define doc_err(fmt, arg...) dev_err(docg3->dev, (fmt), ## arg)
diff --git a/drivers/mtd/devices/spear_smi.c b/drivers/mtd/devices/spear_smi.c
index dd5069876537..ddf478976013 100644
--- a/drivers/mtd/devices/spear_smi.c
+++ b/drivers/mtd/devices/spear_smi.c
@@ -775,6 +775,8 @@ static int spear_smi_probe_config_dt(struct platform_device *pdev,
pdata->board_flash_info = devm_kzalloc(&pdev->dev,
sizeof(*pdata->board_flash_info),
GFP_KERNEL);
+ if (!pdata->board_flash_info)
+ return -ENOMEM;
/* Fill structs for each subnode (flash device) */
while ((pp = of_get_next_child(np, pp))) {
diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c
index 21afd94cd904..7bc29d725200 100644
--- a/drivers/mtd/devices/st_spi_fsm.c
+++ b/drivers/mtd/devices/st_spi_fsm.c
@@ -2073,15 +2073,17 @@ static int stfsm_probe(struct platform_device *pdev)
ret = stfsm_init(fsm);
if (ret) {
dev_err(&pdev->dev, "Failed to initialise FSM Controller\n");
- return ret;
+ goto err_clk_unprepare;
}
stfsm_fetch_platform_configs(pdev);
/* Detect SPI FLASH device */
info = stfsm_jedec_probe(fsm);
- if (!info)
- return -ENODEV;
+ if (!info) {
+ ret = -ENODEV;
+ goto err_clk_unprepare;
+ }
fsm->info = info;
/* Use device size to determine address width */
@@ -2095,11 +2097,11 @@ static int stfsm_probe(struct platform_device *pdev)
if (info->config) {
ret = info->config(fsm);
if (ret)
- return ret;
+ goto err_clk_unprepare;
} else {
ret = stfsm_prepare_rwe_seqs_default(fsm);
if (ret)
- return ret;
+ goto err_clk_unprepare;
}
fsm->mtd.name = info->name;
@@ -2124,6 +2126,10 @@ static int stfsm_probe(struct platform_device *pdev)
fsm->mtd.erasesize, (fsm->mtd.erasesize >> 10));
return mtd_device_register(&fsm->mtd, NULL, 0);
+
+err_clk_unprepare:
+ clk_disable_unprepare(fsm->clk);
+ return ret;
}
static int stfsm_remove(struct platform_device *pdev)
@@ -2147,9 +2153,7 @@ static int stfsmfsm_resume(struct device *dev)
{
struct stfsm *fsm = dev_get_drvdata(dev);
- clk_prepare_enable(fsm->clk);
-
- return 0;
+ return clk_prepare_enable(fsm->clk);
}
#endif
diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c
index 8db740d6eb08..57ef1fb42a04 100644
--- a/drivers/mtd/inftlcore.c
+++ b/drivers/mtd/inftlcore.c
@@ -33,7 +33,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/nftl.h>
#include <linux/mtd/inftl.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/uaccess.h>
#include <asm/errno.h>
#include <asm/io.h>
diff --git a/drivers/mtd/maps/amd76xrom.c b/drivers/mtd/maps/amd76xrom.c
index f2b68667ea59..26de0a1d08cf 100644
--- a/drivers/mtd/maps/amd76xrom.c
+++ b/drivers/mtd/maps/amd76xrom.c
@@ -296,7 +296,7 @@ static void amd76xrom_remove_one(struct pci_dev *pdev)
amd76xrom_cleanup(window);
}
-static struct pci_device_id amd76xrom_pci_tbl[] = {
+static const struct pci_device_id amd76xrom_pci_tbl[] = {
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7410,
PCI_ANY_ID, PCI_ANY_ID, },
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7440,
@@ -319,7 +319,7 @@ static struct pci_driver amd76xrom_driver = {
static int __init init_amd76xrom(void)
{
struct pci_dev *pdev;
- struct pci_device_id *id;
+ const struct pci_device_id *id;
pdev = NULL;
for(id = amd76xrom_pci_tbl; id->vendor; id++) {
pdev = pci_get_device(id->vendor, id->device, NULL);
diff --git a/drivers/mtd/maps/ck804xrom.c b/drivers/mtd/maps/ck804xrom.c
index 4f206a99164c..584962ec49f8 100644
--- a/drivers/mtd/maps/ck804xrom.c
+++ b/drivers/mtd/maps/ck804xrom.c
@@ -326,7 +326,7 @@ static void ck804xrom_remove_one(struct pci_dev *pdev)
ck804xrom_cleanup(window);
}
-static struct pci_device_id ck804xrom_pci_tbl[] = {
+static const struct pci_device_id ck804xrom_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0051), .driver_data = DEV_CK804 },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0360), .driver_data = DEV_MCP55 },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0361), .driver_data = DEV_MCP55 },
@@ -353,7 +353,7 @@ static struct pci_driver ck804xrom_driver = {
static int __init init_ck804xrom(void)
{
struct pci_dev *pdev;
- struct pci_device_id *id;
+ const struct pci_device_id *id;
int retVal;
pdev = NULL;
diff --git a/drivers/mtd/maps/esb2rom.c b/drivers/mtd/maps/esb2rom.c
index 9646b0766ce0..da9f6d76ce1d 100644
--- a/drivers/mtd/maps/esb2rom.c
+++ b/drivers/mtd/maps/esb2rom.c
@@ -384,7 +384,7 @@ static void esb2rom_remove_one(struct pci_dev *pdev)
esb2rom_cleanup(window);
}
-static struct pci_device_id esb2rom_pci_tbl[] = {
+static const struct pci_device_id esb2rom_pci_tbl[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0,
PCI_ANY_ID, PCI_ANY_ID, },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0,
@@ -414,7 +414,7 @@ static struct pci_driver esb2rom_driver = {
static int __init init_esb2rom(void)
{
struct pci_dev *pdev;
- struct pci_device_id *id;
+ const struct pci_device_id *id;
int retVal;
pdev = NULL;
diff --git a/drivers/mtd/maps/ichxrom.c b/drivers/mtd/maps/ichxrom.c
index 976d42f63aef..1888c5bf13f8 100644
--- a/drivers/mtd/maps/ichxrom.c
+++ b/drivers/mtd/maps/ichxrom.c
@@ -323,7 +323,7 @@ static void ichxrom_remove_one(struct pci_dev *pdev)
ichxrom_cleanup(window);
}
-static struct pci_device_id ichxrom_pci_tbl[] = {
+static const struct pci_device_id ichxrom_pci_tbl[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0,
PCI_ANY_ID, PCI_ANY_ID, },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0,
@@ -351,7 +351,7 @@ static struct pci_driver ichxrom_driver = {
static int __init init_ichxrom(void)
{
struct pci_dev *pdev;
- struct pci_device_id *id;
+ const struct pci_device_id *id;
pdev = NULL;
for (id = ichxrom_pci_tbl; id->vendor; id++) {
diff --git a/drivers/mtd/maps/intel_vr_nor.c b/drivers/mtd/maps/intel_vr_nor.c
index 8bf79775e7c1..dd5d6855f543 100644
--- a/drivers/mtd/maps/intel_vr_nor.c
+++ b/drivers/mtd/maps/intel_vr_nor.c
@@ -170,7 +170,7 @@ static int vr_nor_init_maps(struct vr_nor_mtd *p)
return err;
}
-static struct pci_device_id vr_nor_pci_ids[] = {
+static const struct pci_device_id vr_nor_pci_ids[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x500D)},
{0,}
};
diff --git a/drivers/mtd/maps/lantiq-flash.c b/drivers/mtd/maps/lantiq-flash.c
index 3e33ab66eb24..77b1d8013295 100644
--- a/drivers/mtd/maps/lantiq-flash.c
+++ b/drivers/mtd/maps/lantiq-flash.c
@@ -114,12 +114,6 @@ ltq_mtd_probe(struct platform_device *pdev)
struct cfi_private *cfi;
int err;
- if (of_machine_is_compatible("lantiq,falcon") &&
- (ltq_boot_select() != BS_FLASH)) {
- dev_err(&pdev->dev, "invalid bootstrap options\n");
- return -ENODEV;
- }
-
ltq_mtd = devm_kzalloc(&pdev->dev, sizeof(struct ltq_mtd), GFP_KERNEL);
if (!ltq_mtd)
return -ENOMEM;
diff --git a/drivers/mtd/maps/pci.c b/drivers/mtd/maps/pci.c
index eb0242e0b2d9..7b3bb40aff72 100644
--- a/drivers/mtd/maps/pci.c
+++ b/drivers/mtd/maps/pci.c
@@ -228,7 +228,7 @@ static struct mtd_pci_info intel_dc21285_info = {
* PCI device ID table
*/
-static struct pci_device_id mtd_pci_ids[] = {
+static const struct pci_device_id mtd_pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_INTEL,
.device = 0x530d,
diff --git a/drivers/mtd/maps/physmap_of_core.c b/drivers/mtd/maps/physmap_of_core.c
index 62fa6836f218..b1bd4faecfb2 100644
--- a/drivers/mtd/maps/physmap_of_core.c
+++ b/drivers/mtd/maps/physmap_of_core.c
@@ -178,8 +178,8 @@ static int of_flash_probe(struct platform_device *dev)
*/
p = of_get_property(dp, "reg", &count);
if (!p || count % reg_tuple_size != 0) {
- dev_err(&dev->dev, "Malformed reg property on %s\n",
- dev->dev.of_node->full_name);
+ dev_err(&dev->dev, "Malformed reg property on %pOF\n",
+ dev->dev.of_node);
err = -EINVAL;
goto err_flash_remove;
}
@@ -235,10 +235,10 @@ static int of_flash_probe(struct platform_device *dev)
err = of_flash_probe_gemini(dev, dp, &info->list[i].map);
if (err)
- return err;
+ goto err_out;
err = of_flash_probe_versatile(dev, dp, &info->list[i].map);
if (err)
- return err;
+ goto err_out;
err = -ENOMEM;
info->list[i].map.virt = ioremap(info->list[i].map.phys,
diff --git a/drivers/mtd/maps/physmap_of_gemini.c b/drivers/mtd/maps/physmap_of_gemini.c
index 05b286b5289f..4ed1a6bb4d3c 100644
--- a/drivers/mtd/maps/physmap_of_gemini.c
+++ b/drivers/mtd/maps/physmap_of_gemini.c
@@ -43,13 +43,6 @@
#define FLASH_PARALLEL_HIGH_PIN_CNT (1 << 20) /* else low pin cnt */
-/* Miscellaneous Control Register */
-#define GLOBAL_MISC_CTRL 0x30
-#define FLASH_PADS_MASK 0x07
-#define NAND_PADS_DISABLE BIT(2)
-#define PFLASH_PADS_DISABLE BIT(1)
-#define SFLASH_PADS_DISABLE BIT(0)
-
static const struct of_device_id syscon_match[] = {
{ .compatible = "cortina,gemini-syscon" },
{ },
@@ -102,15 +95,6 @@ int of_flash_probe_gemini(struct platform_device *pdev,
map->bankwidth * 8);
}
- /* Activate parallel (NOR flash) mode */
- ret = regmap_update_bits(rmap, GLOBAL_MISC_CTRL,
- FLASH_PADS_MASK,
- SFLASH_PADS_DISABLE | NAND_PADS_DISABLE);
- if (ret) {
- dev_err(dev, "unable to set up physmap pads\n");
- return -ENODEV;
- }
-
dev_info(&pdev->dev, "initialized Gemini-specific physmap control\n");
return 0;
diff --git a/drivers/mtd/maps/physmap_of_versatile.c b/drivers/mtd/maps/physmap_of_versatile.c
index 8c6ccded9be8..03f2b6e7bc7e 100644
--- a/drivers/mtd/maps/physmap_of_versatile.c
+++ b/drivers/mtd/maps/physmap_of_versatile.c
@@ -97,7 +97,7 @@ static const struct of_device_id ebi_match[] = {
static int ap_flash_init(struct platform_device *pdev)
{
struct device_node *ebi;
- static void __iomem *ebi_base;
+ void __iomem *ebi_base;
u32 val;
int ret;
diff --git a/drivers/mtd/maps/sun_uflash.c b/drivers/mtd/maps/sun_uflash.c
index 414956eca0c9..1e73bba6e286 100644
--- a/drivers/mtd/maps/sun_uflash.c
+++ b/drivers/mtd/maps/sun_uflash.c
@@ -55,8 +55,8 @@ int uflash_devinit(struct platform_device *op, struct device_node *dp)
/* Non-CFI userflash device-- once I find one we
* can work on supporting it.
*/
- printk(KERN_ERR PFX "Unsupported device at %s, 0x%llx\n",
- dp->full_name, (unsigned long long)op->resource[0].start);
+ printk(KERN_ERR PFX "Unsupported device at %pOF, 0x%llx\n",
+ dp, (unsigned long long)op->resource[0].start);
return -ENODEV;
}
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 956382cea256..e7ea842ba3db 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -40,6 +40,7 @@
#include <linux/slab.h>
#include <linux/reboot.h>
#include <linux/leds.h>
+#include <linux/debugfs.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
@@ -339,7 +340,7 @@ static struct attribute *mtd_attrs[] = {
};
ATTRIBUTE_GROUPS(mtd);
-static struct device_type mtd_devtype = {
+static const struct device_type mtd_devtype = {
.name = "mtd",
.groups = mtd_groups,
.release = mtd_release,
@@ -477,6 +478,8 @@ int mtd_pairing_groups(struct mtd_info *mtd)
}
EXPORT_SYMBOL_GPL(mtd_pairing_groups);
+static struct dentry *dfs_dir_mtd;
+
/**
* add_mtd_device - register an MTD device
* @mtd: pointer to new MTD device info structure
@@ -552,6 +555,14 @@ int add_mtd_device(struct mtd_info *mtd)
if (error)
goto fail_added;
+ if (!IS_ERR_OR_NULL(dfs_dir_mtd)) {
+ mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(&mtd->dev), dfs_dir_mtd);
+ if (IS_ERR_OR_NULL(mtd->dbg.dfs_dir)) {
+ pr_debug("mtd device %s won't show data in debugfs\n",
+ dev_name(&mtd->dev));
+ }
+ }
+
device_create(&mtd_class, mtd->dev.parent, MTD_DEVT(i) + 1, NULL,
"mtd%dro", i);
@@ -594,6 +605,8 @@ int del_mtd_device(struct mtd_info *mtd)
mutex_lock(&mtd_table_mutex);
+ debugfs_remove_recursive(mtd->dbg.dfs_dir);
+
if (idr_find(&mtd_idr, mtd->index) != mtd) {
ret = -ENODEV;
goto out_error;
@@ -1811,6 +1824,8 @@ static int __init init_mtd(void)
if (ret)
goto out_procfs;
+ dfs_dir_mtd = debugfs_create_dir("mtd", NULL);
+
return 0;
out_procfs:
@@ -1826,6 +1841,7 @@ err_reg:
static void __exit cleanup_mtd(void)
{
+ debugfs_remove_recursive(dfs_dir_mtd);
cleanup_mtdchar();
if (proc_mtd)
remove_proc_entry("mtd", NULL);
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 5736b0c90b33..a308e707392d 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -581,6 +581,14 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,
slave->mtd.erasesize = parent->erasesize;
}
+ /*
+ * Slave erasesize might differ from the master one if the master
+ * exposes several regions with different erasesize. Adjust
+ * wr_alignment accordingly.
+ */
+ if (!(slave->mtd.flags & MTD_NO_ERASE))
+ wr_alignment = slave->mtd.erasesize;
+
tmp = slave->offset;
remainder = do_div(tmp, wr_alignment);
if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
diff --git a/drivers/mtd/mtdswap.c b/drivers/mtd/mtdswap.c
index f12879a3d4ff..7d9080e33865 100644
--- a/drivers/mtd/mtdswap.c
+++ b/drivers/mtd/mtdswap.c
@@ -138,8 +138,6 @@ struct mtdswap_dev {
char *page_buf;
char *oob_buf;
-
- struct dentry *debugfs_root;
};
struct mtdswap_oobdata {
@@ -1315,29 +1313,19 @@ static const struct file_operations mtdswap_fops = {
static int mtdswap_add_debugfs(struct mtdswap_dev *d)
{
- struct gendisk *gd = d->mbd_dev->disk;
- struct device *dev = disk_to_dev(gd);
-
- struct dentry *root;
+ struct dentry *root = d->mtd->dbg.dfs_dir;
struct dentry *dent;
- root = debugfs_create_dir(gd->disk_name, NULL);
- if (IS_ERR(root))
+ if (!IS_ENABLED(CONFIG_DEBUG_FS))
return 0;
- if (!root) {
- dev_err(dev, "failed to initialize debugfs\n");
+ if (IS_ERR_OR_NULL(root))
return -1;
- }
-
- d->debugfs_root = root;
- dent = debugfs_create_file("stats", S_IRUSR, root, d,
+ dent = debugfs_create_file("mtdswap_stats", S_IRUSR, root, d,
&mtdswap_fops);
if (!dent) {
dev_err(d->dev, "debugfs_create_file failed\n");
- debugfs_remove_recursive(root);
- d->debugfs_root = NULL;
return -1;
}
@@ -1540,7 +1528,6 @@ static void mtdswap_remove_dev(struct mtd_blktrans_dev *dev)
{
struct mtdswap_dev *d = MTDSWAP_MBD_TO_MTDSWAP(dev);
- debugfs_remove_recursive(d->debugfs_root);
del_mtd_blktrans_dev(dev);
mtdswap_cleanup(d);
kfree(d);
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index dbfa72d61d5a..3f2036f31da4 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -315,7 +315,7 @@ config MTD_NAND_ATMEL
config MTD_NAND_PXA3xx
tristate "NAND support on PXA3xx and Armada 370/XP"
- depends on PXA3xx || ARCH_MMP || PLAT_ORION
+ depends on PXA3xx || ARCH_MMP || PLAT_ORION || ARCH_MVEBU
help
This enables the driver for the NAND flash device found on
PXA3xx processors (NFCv1) and also on Armada 370/XP (NFCv2).
diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c
index 5d6c26f3cf7f..dcec9cf4983f 100644
--- a/drivers/mtd/nand/ams-delta.c
+++ b/drivers/mtd/nand/ams-delta.c
@@ -20,7 +20,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/gpio.h>
#include <linux/platform_data/gpio-omap.h>
diff --git a/drivers/mtd/nand/atmel/nand-controller.c b/drivers/mtd/nand/atmel/nand-controller.c
index 1913ce18fb1c..f25eca79f4e5 100644
--- a/drivers/mtd/nand/atmel/nand-controller.c
+++ b/drivers/mtd/nand/atmel/nand-controller.c
@@ -59,7 +59,7 @@
#include <linux/mfd/syscon/atmel-matrix.h>
#include <linux/mfd/syscon/atmel-smc.h>
#include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
@@ -2091,8 +2091,8 @@ atmel_hsmc_nand_controller_legacy_init(struct atmel_hsmc_nand_controller *nc)
}
nc->irq = of_irq_get(nand_np, 0);
- if (nc->irq < 0) {
- ret = nc->irq;
+ if (nc->irq <= 0) {
+ ret = nc->irq ?: -ENXIO;
if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get IRQ number (err = %d)\n",
ret);
@@ -2183,11 +2183,12 @@ atmel_hsmc_nand_controller_init(struct atmel_hsmc_nand_controller *nc)
nc->irq = of_irq_get(np, 0);
of_node_put(np);
- if (nc->irq < 0) {
- if (nc->irq != -EPROBE_DEFER)
+ if (nc->irq <= 0) {
+ ret = nc->irq ?: -ENXIO;
+ if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get IRQ number (err = %d)\n",
- nc->irq);
- return nc->irq;
+ ret);
+ return ret;
}
np = of_parse_phandle(dev->of_node, "atmel,nfc-io", 0);
diff --git a/drivers/mtd/nand/atmel/pmecc.c b/drivers/mtd/nand/atmel/pmecc.c
index 8c210a5776bc..8268636675ef 100644
--- a/drivers/mtd/nand/atmel/pmecc.c
+++ b/drivers/mtd/nand/atmel/pmecc.c
@@ -47,7 +47,7 @@
#include <linux/genalloc.h>
#include <linux/iopoll.h>
#include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
@@ -363,7 +363,7 @@ atmel_pmecc_create_user(struct atmel_pmecc *pmecc,
size += (req->ecc.strength + 1) * sizeof(u16);
/* Reserve space for mu, dmu and delta. */
size = ALIGN(size, sizeof(s32));
- size += (req->ecc.strength + 1) * sizeof(s32);
+ size += (req->ecc.strength + 1) * sizeof(s32) * 3;
user = kzalloc(size, GFP_KERNEL);
if (!user)
diff --git a/drivers/mtd/nand/au1550nd.c b/drivers/mtd/nand/au1550nd.c
index 9bf6d9915694..9d4a28fa6b73 100644
--- a/drivers/mtd/nand/au1550nd.c
+++ b/drivers/mtd/nand/au1550nd.c
@@ -14,7 +14,7 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
#include <asm/io.h>
diff --git a/drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h b/drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h
index 8ea75710a854..c8834767ab6d 100644
--- a/drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h
+++ b/drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h
@@ -6,7 +6,7 @@
#endif
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
struct bcm47xxnflash {
struct bcma_drv_cc *cc;
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
index 3962f55bd034..5655dca6ce43 100644
--- a/drivers/mtd/nand/bf5xx_nand.c
+++ b/drivers/mtd/nand/bf5xx_nand.c
@@ -49,7 +49,7 @@
#include <linux/bitops.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
index 7419c5ce63f8..e0eb51d8c012 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -29,7 +29,7 @@
#include <linux/bitops.h>
#include <linux/mm.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of.h>
#include <linux/of_platform.h>
diff --git a/drivers/mtd/nand/cafe_nand.c b/drivers/mtd/nand/cafe_nand.c
index 2fd733eba0a3..bc558c438a57 100644
--- a/drivers/mtd/nand/cafe_nand.c
+++ b/drivers/mtd/nand/cafe_nand.c
@@ -13,7 +13,7 @@
#include <linux/device.h>
#undef DEBUG
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/rslib.h>
#include <linux/pci.h>
diff --git a/drivers/mtd/nand/cmx270_nand.c b/drivers/mtd/nand/cmx270_nand.c
index 949b9400dcb7..1fc435f994e1 100644
--- a/drivers/mtd/nand/cmx270_nand.c
+++ b/drivers/mtd/nand/cmx270_nand.c
@@ -18,7 +18,7 @@
* CM-X270 board.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/slab.h>
#include <linux/gpio.h>
diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c
index 594b28684138..d48877540f14 100644
--- a/drivers/mtd/nand/cs553x_nand.c
+++ b/drivers/mtd/nand/cs553x_nand.c
@@ -24,7 +24,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
index 7b26e53b95b1..ccc8c43abcff 100644
--- a/drivers/mtd/nand/davinci_nand.c
+++ b/drivers/mtd/nand/davinci_nand.c
@@ -29,7 +29,7 @@
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/io.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/slab.h>
#include <linux/of_device.h>
diff --git a/drivers/mtd/nand/denali.h b/drivers/mtd/nand/denali.h
index 237cc706b0fb..9239e6793e6e 100644
--- a/drivers/mtd/nand/denali.h
+++ b/drivers/mtd/nand/denali.h
@@ -21,7 +21,7 @@
#define __DENALI_H__
#include <linux/bitops.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#define DEVICE_RESET 0x0
#define DEVICE_RESET__BANK(bank) BIT(bank)
diff --git a/drivers/mtd/nand/denali_dt.c b/drivers/mtd/nand/denali_dt.c
index 47f398edf18f..56e2e177644d 100644
--- a/drivers/mtd/nand/denali_dt.c
+++ b/drivers/mtd/nand/denali_dt.c
@@ -118,7 +118,9 @@ static int denali_dt_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "no clk available\n");
return PTR_ERR(dt->clk);
}
- clk_prepare_enable(dt->clk);
+ ret = clk_prepare_enable(dt->clk);
+ if (ret)
+ return ret;
denali->clk_x_rate = clk_get_rate(dt->clk);
diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
index a023ab9e9cbf..c3aa53caab5c 100644
--- a/drivers/mtd/nand/diskonchip.c
+++ b/drivers/mtd/nand/diskonchip.c
@@ -27,7 +27,7 @@
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/doc2000.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/inftl.h>
diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c
index a27a84fbfb84..2436cbc71662 100644
--- a/drivers/mtd/nand/docg4.c
+++ b/drivers/mtd/nand/docg4.c
@@ -41,7 +41,7 @@
#include <linux/bitops.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/bch.h>
#include <linux/bitrev.h>
#include <linux/jiffies.h>
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index b9ac16f05057..17db2f90aa2c 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -34,7 +34,7 @@
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
index 59408ec2c69f..9e03bac7f34c 100644
--- a/drivers/mtd/nand/fsl_ifc_nand.c
+++ b/drivers/mtd/nand/fsl_ifc_nand.c
@@ -26,7 +26,7 @@
#include <linux/of_address.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/fsl_ifc.h>
diff --git a/drivers/mtd/nand/fsl_upm.c b/drivers/mtd/nand/fsl_upm.c
index d85fa2555b68..a88e2cf66e0f 100644
--- a/drivers/mtd/nand/fsl_upm.c
+++ b/drivers/mtd/nand/fsl_upm.c
@@ -14,7 +14,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/mtd.h>
diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
index 9d8b051d3187..eac15d9bf49e 100644
--- a/drivers/mtd/nand/fsmc_nand.c
+++ b/drivers/mtd/nand/fsmc_nand.c
@@ -28,7 +28,7 @@
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/platform_device.h>
#include <linux/of.h>
diff --git a/drivers/mtd/nand/gpio.c b/drivers/mtd/nand/gpio.c
index 85294f150f4f..fd3648952b5a 100644
--- a/drivers/mtd/nand/gpio.c
+++ b/drivers/mtd/nand/gpio.c
@@ -26,7 +26,7 @@
#include <linux/gpio.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand-gpio.h>
#include <linux/of.h>
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
index 9df0ad64e7e0..a45e4ce13d10 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
@@ -17,7 +17,7 @@
#ifndef __DRIVERS_MTD_NAND_GPMI_NAND_H
#define __DRIVERS_MTD_NAND_GPMI_NAND_H
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
diff --git a/drivers/mtd/nand/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c
index 530caa80b1b6..d9ee1a7e6956 100644
--- a/drivers/mtd/nand/hisi504_nand.c
+++ b/drivers/mtd/nand/hisi504_nand.c
@@ -26,7 +26,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
#include <linux/mtd/partitions.h>
diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c
index 0d06a1f07d82..ad827d4af3e9 100644
--- a/drivers/mtd/nand/jz4740_nand.c
+++ b/drivers/mtd/nand/jz4740_nand.c
@@ -20,7 +20,7 @@
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/gpio.h>
diff --git a/drivers/mtd/nand/jz4780_nand.c b/drivers/mtd/nand/jz4780_nand.c
index 8bc835f71b26..e69f6ae4c539 100644
--- a/drivers/mtd/nand/jz4780_nand.c
+++ b/drivers/mtd/nand/jz4780_nand.c
@@ -20,7 +20,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/jz4780-nemc.h>
diff --git a/drivers/mtd/nand/lpc32xx_mlc.c b/drivers/mtd/nand/lpc32xx_mlc.c
index 846a66c1b133..5796468db653 100644
--- a/drivers/mtd/nand/lpc32xx_mlc.c
+++ b/drivers/mtd/nand/lpc32xx_mlc.c
@@ -27,7 +27,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/clk.h>
#include <linux/err.h>
@@ -705,7 +705,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
res = -ENOENT;
goto err_exit1;
}
- clk_prepare_enable(host->clk);
+ res = clk_prepare_enable(host->clk);
+ if (res)
+ goto err_put_clk;
nand_chip->cmd_ctrl = lpc32xx_nand_cmd_ctrl;
nand_chip->dev_ready = lpc32xx_nand_device_ready;
@@ -812,6 +814,7 @@ err_exit3:
dma_release_channel(host->dma_chan);
err_exit2:
clk_disable_unprepare(host->clk);
+err_put_clk:
clk_put(host->clk);
err_exit1:
lpc32xx_wp_enable(host);
@@ -846,9 +849,12 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
static int lpc32xx_nand_resume(struct platform_device *pdev)
{
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
+ int ret;
/* Re-enable NAND clock */
- clk_prepare_enable(host->clk);
+ ret = clk_prepare_enable(host->clk);
+ if (ret)
+ return ret;
/* Fresh init of NAND controller */
lpc32xx_nand_setup(host);
diff --git a/drivers/mtd/nand/lpc32xx_slc.c b/drivers/mtd/nand/lpc32xx_slc.c
index a0669a33f8fe..b61f28a1554d 100644
--- a/drivers/mtd/nand/lpc32xx_slc.c
+++ b/drivers/mtd/nand/lpc32xx_slc.c
@@ -23,7 +23,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/clk.h>
#include <linux/err.h>
@@ -840,7 +840,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
res = -ENOENT;
goto err_exit1;
}
- clk_prepare_enable(host->clk);
+ res = clk_prepare_enable(host->clk);
+ if (res)
+ goto err_exit1;
/* Set NAND IO addresses and command/ready functions */
chip->IO_ADDR_R = SLC_DATA(host->io_base);
@@ -972,9 +974,12 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
static int lpc32xx_nand_resume(struct platform_device *pdev)
{
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
+ int ret;
/* Re-enable NAND clock */
- clk_prepare_enable(host->clk);
+ ret = clk_prepare_enable(host->clk);
+ if (ret)
+ return ret;
/* Fresh init of NAND controller */
lpc32xx_nand_setup(host);
diff --git a/drivers/mtd/nand/mpc5121_nfc.c b/drivers/mtd/nand/mpc5121_nfc.c
index 0e86fb6277c3..b6b97cc9fba6 100644
--- a/drivers/mtd/nand/mpc5121_nfc.c
+++ b/drivers/mtd/nand/mpc5121_nfc.c
@@ -33,7 +33,7 @@
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
diff --git a/drivers/mtd/nand/mtk_ecc.c b/drivers/mtd/nand/mtk_ecc.c
index 6c3a4aab0b48..7f3b065b6b8f 100644
--- a/drivers/mtd/nand/mtk_ecc.c
+++ b/drivers/mtd/nand/mtk_ecc.c
@@ -464,8 +464,8 @@ static int mtk_ecc_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
- dev_err(dev, "failed to get irq\n");
- return -EINVAL;
+ dev_err(dev, "failed to get irq: %d\n", irq);
+ return irq;
}
ret = dma_set_mask(dev, DMA_BIT_MASK(32));
diff --git a/drivers/mtd/nand/mtk_nand.c b/drivers/mtd/nand/mtk_nand.c
index f7ae99464375..d86a7d131cc0 100644
--- a/drivers/mtd/nand/mtk_nand.c
+++ b/drivers/mtd/nand/mtk_nand.c
@@ -19,7 +19,7 @@
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/clk.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/mtd.h>
#include <linux/module.h>
#include <linux/iopoll.h>
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index a764d5ca7536..53e5e0337c3e 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -22,7 +22,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/interrupt.h>
#include <linux/device.h>
@@ -876,6 +876,8 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
}
}
+#define MXC_V1_ECCBYTES 5
+
static int mxc_v1_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{
@@ -885,7 +887,7 @@ static int mxc_v1_ooblayout_ecc(struct mtd_info *mtd, int section,
return -ERANGE;
oobregion->offset = (section * 16) + 6;
- oobregion->length = nand_chip->ecc.bytes;
+ oobregion->length = MXC_V1_ECCBYTES;
return 0;
}
@@ -907,8 +909,7 @@ static int mxc_v1_ooblayout_free(struct mtd_info *mtd, int section,
oobregion->length = 4;
}
} else {
- oobregion->offset = ((section - 1) * 16) +
- nand_chip->ecc.bytes + 6;
+ oobregion->offset = ((section - 1) * 16) + MXC_V1_ECCBYTES + 6;
if (section < nand_chip->ecc.steps)
oobregion->length = (section * 16) + 6 -
oobregion->offset;
diff --git a/drivers/mtd/nand/nand_amd.c b/drivers/mtd/nand/nand_amd.c
index 170403a3bfa8..22f060f38123 100644
--- a/drivers/mtd/nand/nand_amd.c
+++ b/drivers/mtd/nand/nand_amd.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
static void amd_nand_decode_id(struct nand_chip *chip)
{
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index c6c18b82f8f4..12edaae17d81 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -39,7 +39,7 @@
#include <linux/nmi.h>
#include <linux/types.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/nand_bch.h>
#include <linux/interrupt.h>
@@ -1248,179 +1248,6 @@ int nand_reset(struct nand_chip *chip, int chipnr)
}
/**
- * __nand_unlock - [REPLACEABLE] unlocks specified locked blocks
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- * @invert:
- * - when = 0, unlock the range of blocks within the lower and
- * upper boundary address
- * - when = 1, unlock the range of blocks outside the boundaries
- * of the lower and upper boundary address
- *
- * Returs unlock status.
- */
-static int __nand_unlock(struct mtd_info *mtd, loff_t ofs,
- uint64_t len, int invert)
-{
- int ret = 0;
- int status, page;
- struct nand_chip *chip = mtd_to_nand(mtd);
-
- /* Submit address of first page to unlock */
- page = ofs >> chip->page_shift;
- chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);
-
- /* Submit address of last page to unlock */
- page = (ofs + len) >> chip->page_shift;
- chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1,
- (page | invert) & chip->pagemask);
-
- /* Call wait ready function */
- status = chip->waitfunc(mtd, chip);
- /* See if device thinks it succeeded */
- if (status & NAND_STATUS_FAIL) {
- pr_debug("%s: error status = 0x%08x\n",
- __func__, status);
- ret = -EIO;
- }
-
- return ret;
-}
-
-/**
- * nand_unlock - [REPLACEABLE] unlocks specified locked blocks
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- *
- * Returns unlock status.
- */
-int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
-{
- int ret = 0;
- int chipnr;
- struct nand_chip *chip = mtd_to_nand(mtd);
-
- pr_debug("%s: start = 0x%012llx, len = %llu\n",
- __func__, (unsigned long long)ofs, len);
-
- if (check_offs_len(mtd, ofs, len))
- return -EINVAL;
-
- /* Align to last block address if size addresses end of the device */
- if (ofs + len == mtd->size)
- len -= mtd->erasesize;
-
- nand_get_device(mtd, FL_UNLOCKING);
-
- /* Shift to get chip number */
- chipnr = ofs >> chip->chip_shift;
-
- /*
- * Reset the chip.
- * If we want to check the WP through READ STATUS and check the bit 7
- * we must reset the chip
- * some operation can also clear the bit 7 of status register
- * eg. erase/program a locked block
- */
- nand_reset(chip, chipnr);
-
- chip->select_chip(mtd, chipnr);
-
- /* Check, if it is write protected */
- if (nand_check_wp(mtd)) {
- pr_debug("%s: device is write protected!\n",
- __func__);
- ret = -EIO;
- goto out;
- }
-
- ret = __nand_unlock(mtd, ofs, len, 0);
-
-out:
- chip->select_chip(mtd, -1);
- nand_release_device(mtd);
-
- return ret;
-}
-EXPORT_SYMBOL(nand_unlock);
-
-/**
- * nand_lock - [REPLACEABLE] locks all blocks present in the device
- * @mtd: mtd info
- * @ofs: offset to start unlock from
- * @len: length to unlock
- *
- * This feature is not supported in many NAND parts. 'Micron' NAND parts do
- * have this feature, but it allows only to lock all blocks, not for specified
- * range for block. Implementing 'lock' feature by making use of 'unlock', for
- * now.
- *
- * Returns lock status.
- */
-int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
-{
- int ret = 0;
- int chipnr, status, page;
- struct nand_chip *chip = mtd_to_nand(mtd);
-
- pr_debug("%s: start = 0x%012llx, len = %llu\n",
- __func__, (unsigned long long)ofs, len);
-
- if (check_offs_len(mtd, ofs, len))
- return -EINVAL;
-
- nand_get_device(mtd, FL_LOCKING);
-
- /* Shift to get chip number */
- chipnr = ofs >> chip->chip_shift;
-
- /*
- * Reset the chip.
- * If we want to check the WP through READ STATUS and check the bit 7
- * we must reset the chip
- * some operation can also clear the bit 7 of status register
- * eg. erase/program a locked block
- */
- nand_reset(chip, chipnr);
-
- chip->select_chip(mtd, chipnr);
-
- /* Check, if it is write protected */
- if (nand_check_wp(mtd)) {
- pr_debug("%s: device is write protected!\n",
- __func__);
- status = MTD_ERASE_FAILED;
- ret = -EIO;
- goto out;
- }
-
- /* Submit address of first page to lock */
- page = ofs >> chip->page_shift;
- chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask);
-
- /* Call wait ready function */
- status = chip->waitfunc(mtd, chip);
- /* See if device thinks it succeeded */
- if (status & NAND_STATUS_FAIL) {
- pr_debug("%s: error status = 0x%08x\n",
- __func__, status);
- ret = -EIO;
- goto out;
- }
-
- ret = __nand_unlock(mtd, ofs, len, 0x1);
-
-out:
- chip->select_chip(mtd, -1);
- nand_release_device(mtd);
-
- return ret;
-}
-EXPORT_SYMBOL(nand_lock);
-
-/**
* nand_check_erased_buf - check if a buffer contains (almost) only 0xff data
* @buf: buffer to test
* @len: buffer length
@@ -2841,7 +2668,7 @@ static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
struct mtd_oob_ops *ops)
{
- int chipnr, realpage, page, blockmask, column;
+ int chipnr, realpage, page, column;
struct nand_chip *chip = mtd_to_nand(mtd);
uint32_t writelen = ops->len;
@@ -2877,7 +2704,6 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
realpage = (int)(to >> chip->page_shift);
page = realpage & chip->pagemask;
- blockmask = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
/* Invalidate the page cache, when we write to the cached page */
if (to <= ((loff_t)chip->pagebuf << chip->page_shift) &&
@@ -3993,10 +3819,13 @@ static void nand_manufacturer_detect(struct nand_chip *chip)
* nand_decode_ext_id() otherwise.
*/
if (chip->manufacturer.desc && chip->manufacturer.desc->ops &&
- chip->manufacturer.desc->ops->detect)
+ chip->manufacturer.desc->ops->detect) {
+ /* The 3rd id byte holds MLC / multichip data */
+ chip->bits_per_cell = nand_get_bits_per_cell(chip->id.data[2]);
chip->manufacturer.desc->ops->detect(chip);
- else
+ } else {
nand_decode_ext_id(chip);
+ }
}
/*
@@ -4036,7 +3865,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
const struct nand_manufacturer *manufacturer;
struct mtd_info *mtd = nand_to_mtd(chip);
int busw;
- int i, ret;
+ int i;
u8 *id_data = chip->id.data;
u8 maf_id, dev_id;
@@ -4066,7 +3895,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
/* Read entire ID string */
- for (i = 0; i < 8; i++)
+ for (i = 0; i < ARRAY_SIZE(chip->id.data); i++)
id_data[i] = chip->read_byte(mtd);
if (id_data[0] != maf_id || id_data[1] != dev_id) {
@@ -4075,7 +3904,7 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
return -ENODEV;
}
- chip->id.len = nand_id_len(id_data, 8);
+ chip->id.len = nand_id_len(id_data, ARRAY_SIZE(chip->id.data));
/* Try to identify manufacturer */
manufacturer = nand_get_manufacturer(maf_id);
@@ -4177,10 +4006,6 @@ ident_done:
if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
chip->cmdfunc = nand_command_lp;
- ret = nand_manufacturer_init(chip);
- if (ret)
- return ret;
-
pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
maf_id, dev_id);
@@ -4388,23 +4213,6 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
return ret;
}
- /* Initialize the ->data_interface field. */
- ret = nand_init_data_interface(chip);
- if (ret)
- goto err_nand_init;
-
- /*
- * Setup the data interface correctly on the chip and controller side.
- * This explicit call to nand_setup_data_interface() is only required
- * for the first die, because nand_reset() has been called before
- * ->data_interface and ->default_onfi_timing_mode were set.
- * For the other dies, nand_reset() will automatically switch to the
- * best mode for us.
- */
- ret = nand_setup_data_interface(chip, 0);
- if (ret)
- goto err_nand_init;
-
nand_maf_id = chip->id.data[0];
nand_dev_id = chip->id.data[1];
@@ -4434,12 +4242,6 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
mtd->size = i * chip->chipsize;
return 0;
-
-err_nand_init:
- /* Free manufacturer priv data. */
- nand_manufacturer_cleanup(chip);
-
- return ret;
}
EXPORT_SYMBOL(nand_scan_ident);
@@ -4826,55 +4628,60 @@ int nand_scan_tail(struct mtd_info *mtd)
struct nand_chip *chip = mtd_to_nand(mtd);
struct nand_ecc_ctrl *ecc = &chip->ecc;
struct nand_buffers *nbuf = NULL;
- int ret;
+ int ret, i;
/* New bad blocks should be marked in OOB, flash-based BBT, or both */
if (WARN_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
!(chip->bbt_options & NAND_BBT_USE_FLASH))) {
- ret = -EINVAL;
- goto err_ident;
+ return -EINVAL;
}
if (invalid_ecc_page_accessors(chip)) {
pr_err("Invalid ECC page accessors setup\n");
- ret = -EINVAL;
- goto err_ident;
+ return -EINVAL;
}
if (!(chip->options & NAND_OWN_BUFFERS)) {
nbuf = kzalloc(sizeof(*nbuf), GFP_KERNEL);
- if (!nbuf) {
- ret = -ENOMEM;
- goto err_ident;
- }
+ if (!nbuf)
+ return -ENOMEM;
nbuf->ecccalc = kmalloc(mtd->oobsize, GFP_KERNEL);
if (!nbuf->ecccalc) {
ret = -ENOMEM;
- goto err_free;
+ goto err_free_nbuf;
}
nbuf->ecccode = kmalloc(mtd->oobsize, GFP_KERNEL);
if (!nbuf->ecccode) {
ret = -ENOMEM;
- goto err_free;
+ goto err_free_nbuf;
}
nbuf->databuf = kmalloc(mtd->writesize + mtd->oobsize,
GFP_KERNEL);
if (!nbuf->databuf) {
ret = -ENOMEM;
- goto err_free;
+ goto err_free_nbuf;
}
chip->buffers = nbuf;
- } else {
- if (!chip->buffers) {
- ret = -ENOMEM;
- goto err_ident;
- }
+ } else if (!chip->buffers) {
+ return -ENOMEM;
}
+ /*
+ * FIXME: some NAND manufacturer drivers expect the first die to be
+ * selected when manufacturer->init() is called. They should be fixed
+ * to explictly select the relevant die when interacting with the NAND
+ * chip.
+ */
+ chip->select_chip(mtd, 0);
+ ret = nand_manufacturer_init(chip);
+ chip->select_chip(mtd, -1);
+ if (ret)
+ goto err_free_nbuf;
+
/* Set the internal oob buffer location, just after the page data */
chip->oob_poi = chip->buffers->databuf + mtd->writesize;
@@ -4896,7 +4703,7 @@ int nand_scan_tail(struct mtd_info *mtd)
WARN(1, "No oob scheme defined for oobsize %d\n",
mtd->oobsize);
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
}
@@ -4911,7 +4718,7 @@ int nand_scan_tail(struct mtd_info *mtd)
if (!ecc->calculate || !ecc->correct || !ecc->hwctl) {
WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
if (!ecc->read_page)
ecc->read_page = nand_read_page_hwecc_oob_first;
@@ -4943,7 +4750,7 @@ int nand_scan_tail(struct mtd_info *mtd)
ecc->write_page == nand_write_page_hwecc)) {
WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
/* Use standard syndrome read/write page function? */
if (!ecc->read_page)
@@ -4963,7 +4770,7 @@ int nand_scan_tail(struct mtd_info *mtd)
if (!ecc->strength) {
WARN(1, "Driver must set ecc.strength when using hardware ECC\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
break;
}
@@ -4976,7 +4783,7 @@ int nand_scan_tail(struct mtd_info *mtd)
ret = nand_set_ecc_soft_ops(mtd);
if (ret) {
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
break;
@@ -4984,7 +4791,7 @@ int nand_scan_tail(struct mtd_info *mtd)
if (!ecc->read_page || !ecc->write_page) {
WARN(1, "No ECC functions supplied; on-die ECC not possible\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
if (!ecc->read_oob)
ecc->read_oob = nand_read_oob_std;
@@ -5008,7 +4815,7 @@ int nand_scan_tail(struct mtd_info *mtd)
default:
WARN(1, "Invalid NAND_ECC_MODE %d\n", ecc->mode);
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
/* For many systems, the standard OOB write also works for raw */
@@ -5029,13 +4836,13 @@ int nand_scan_tail(struct mtd_info *mtd)
if (ecc->steps * ecc->size != mtd->writesize) {
WARN(1, "Invalid ECC parameters\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
ecc->total = ecc->steps * ecc->bytes;
if (ecc->total > mtd->oobsize) {
WARN(1, "Total number of ECC bytes exceeded oobsize\n");
ret = -EINVAL;
- goto err_free;
+ goto err_nand_manuf_cleanup;
}
/*
@@ -5117,6 +4924,21 @@ int nand_scan_tail(struct mtd_info *mtd)
if (!mtd->bitflip_threshold)
mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4);
+ /* Initialize the ->data_interface field. */
+ ret = nand_init_data_interface(chip);
+ if (ret)
+ goto err_nand_manuf_cleanup;
+
+ /* Enter fastest possible mode on all dies. */
+ for (i = 0; i < chip->numchips; i++) {
+ chip->select_chip(mtd, i);
+ ret = nand_setup_data_interface(chip, i);
+ chip->select_chip(mtd, -1);
+
+ if (ret)
+ goto err_nand_data_iface_cleanup;
+ }
+
/* Check, if we should skip the bad block table scan */
if (chip->options & NAND_SKIP_BBTSCAN)
return 0;
@@ -5124,10 +4946,17 @@ int nand_scan_tail(struct mtd_info *mtd)
/* Build bad block table */
ret = chip->scan_bbt(mtd);
if (ret)
- goto err_free;
+ goto err_nand_data_iface_cleanup;
+
return 0;
-err_free:
+err_nand_data_iface_cleanup:
+ nand_release_data_interface(chip);
+
+err_nand_manuf_cleanup:
+ nand_manufacturer_cleanup(chip);
+
+err_free_nbuf:
if (nbuf) {
kfree(nbuf->databuf);
kfree(nbuf->ecccode);
@@ -5135,12 +4964,6 @@ err_free:
kfree(nbuf);
}
-err_ident:
- /* Clean up nand_scan_ident(). */
-
- /* Free manufacturer priv data. */
- nand_manufacturer_cleanup(chip);
-
return ret;
}
EXPORT_SYMBOL(nand_scan_tail);
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 7695efea65f2..2915b6739bf8 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -61,7 +61,7 @@
#include <linux/types.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/bbm.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/vmalloc.h>
diff --git a/drivers/mtd/nand/nand_bch.c b/drivers/mtd/nand/nand_bch.c
index 44763f87eae4..505441c9373b 100644
--- a/drivers/mtd/nand/nand_bch.c
+++ b/drivers/mtd/nand/nand_bch.c
@@ -25,7 +25,7 @@
#include <linux/slab.h>
#include <linux/bitops.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_bch.h>
#include <linux/bch.h>
diff --git a/drivers/mtd/nand/nand_ecc.c b/drivers/mtd/nand/nand_ecc.c
index d1770b066396..7613a0388044 100644
--- a/drivers/mtd/nand/nand_ecc.c
+++ b/drivers/mtd/nand/nand_ecc.c
@@ -43,7 +43,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <asm/byteorder.h>
#else
diff --git a/drivers/mtd/nand/nand_hynix.c b/drivers/mtd/nand/nand_hynix.c
index b12dc7325378..985751eda317 100644
--- a/drivers/mtd/nand/nand_hynix.c
+++ b/drivers/mtd/nand/nand_hynix.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/sizes.h>
#include <linux/slab.h>
@@ -477,7 +477,7 @@ static void hynix_nand_extract_ecc_requirements(struct nand_chip *chip,
* The ECC requirements field meaning depends on the
* NAND technology.
*/
- u8 nand_tech = chip->id.data[5] & 0x3;
+ u8 nand_tech = chip->id.data[5] & 0x7;
if (nand_tech < 3) {
/* > 26nm, reference: H27UBG8T2A datasheet */
@@ -533,7 +533,7 @@ static void hynix_nand_extract_scrambling_requirements(struct nand_chip *chip,
if (nand_tech > 0)
chip->options |= NAND_NEED_SCRAMBLING;
} else {
- nand_tech = chip->id.data[5] & 0x3;
+ nand_tech = chip->id.data[5] & 0x7;
/* < 32nm */
if (nand_tech > 2)
diff --git a/drivers/mtd/nand/nand_ids.c b/drivers/mtd/nand/nand_ids.c
index 92e2cf8e9ff9..5423c3bb388e 100644
--- a/drivers/mtd/nand/nand_ids.c
+++ b/drivers/mtd/nand/nand_ids.c
@@ -6,7 +6,7 @@
* published by the Free Software Foundation.
*
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/sizes.h>
#define LP_OPTIONS 0
diff --git a/drivers/mtd/nand/nand_macronix.c b/drivers/mtd/nand/nand_macronix.c
index 84855c3e1a02..d290ff2a6d2f 100644
--- a/drivers/mtd/nand/nand_macronix.c
+++ b/drivers/mtd/nand/nand_macronix.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
static int macronix_nand_init(struct nand_chip *chip)
{
diff --git a/drivers/mtd/nand/nand_micron.c b/drivers/mtd/nand/nand_micron.c
index c30ab60f8e1b..abf6a3c376e8 100644
--- a/drivers/mtd/nand/nand_micron.c
+++ b/drivers/mtd/nand/nand_micron.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
/*
* Special Micron status bit that indicates when the block has been
diff --git a/drivers/mtd/nand/nand_samsung.c b/drivers/mtd/nand/nand_samsung.c
index 1e0755997762..d348f0129ae7 100644
--- a/drivers/mtd/nand/nand_samsung.c
+++ b/drivers/mtd/nand/nand_samsung.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
static void samsung_nand_decode_id(struct nand_chip *chip)
{
diff --git a/drivers/mtd/nand/nand_timings.c b/drivers/mtd/nand/nand_timings.c
index 7e36d7d13c26..5d1533bcc5bd 100644
--- a/drivers/mtd/nand/nand_timings.c
+++ b/drivers/mtd/nand/nand_timings.c
@@ -11,7 +11,7 @@
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/export.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
static const struct nand_data_interface onfi_sdr_timings[] = {
/* Mode 0 */
diff --git a/drivers/mtd/nand/nand_toshiba.c b/drivers/mtd/nand/nand_toshiba.c
index fa787ba38dcd..57df857074e6 100644
--- a/drivers/mtd/nand/nand_toshiba.c
+++ b/drivers/mtd/nand/nand_toshiba.c
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
static void toshiba_nand_decode_id(struct nand_chip *chip)
{
diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
index e4211c3cc49b..246b4393118e 100644
--- a/drivers/mtd/nand/nandsim.c
+++ b/drivers/mtd/nand/nandsim.c
@@ -33,7 +33,7 @@
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_bch.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>
@@ -287,11 +287,6 @@ MODULE_PARM_DESC(bch, "Enable BCH ecc and set how many bits should "
/* Maximum page cache pages needed to read or write a NAND page to the cache_file */
#define NS_MAX_HELD_PAGES 16
-struct nandsim_debug_info {
- struct dentry *dfs_root;
- struct dentry *dfs_wear_report;
-};
-
/*
* A union to represent flash memory contents and flash buffer.
*/
@@ -370,8 +365,6 @@ struct nandsim {
void *file_buf;
struct page *held_pages[NS_MAX_HELD_PAGES];
int held_cnt;
-
- struct nandsim_debug_info dbg;
};
/*
@@ -524,39 +517,23 @@ static const struct file_operations dfs_fops = {
*/
static int nandsim_debugfs_create(struct nandsim *dev)
{
- struct nandsim_debug_info *dbg = &dev->dbg;
+ struct dentry *root = nsmtd->dbg.dfs_dir;
struct dentry *dent;
if (!IS_ENABLED(CONFIG_DEBUG_FS))
return 0;
- dent = debugfs_create_dir("nandsim", NULL);
- if (!dent) {
- NS_ERR("cannot create \"nandsim\" debugfs directory\n");
- return -ENODEV;
- }
- dbg->dfs_root = dent;
+ if (IS_ERR_OR_NULL(root))
+ return -1;
- dent = debugfs_create_file("wear_report", S_IRUSR,
- dbg->dfs_root, dev, &dfs_fops);
- if (!dent)
- goto out_remove;
- dbg->dfs_wear_report = dent;
+ dent = debugfs_create_file("nandsim_wear_report", S_IRUSR,
+ root, dev, &dfs_fops);
+ if (IS_ERR_OR_NULL(dent)) {
+ NS_ERR("cannot create \"nandsim_wear_report\" debugfs entry\n");
+ return -1;
+ }
return 0;
-
-out_remove:
- debugfs_remove_recursive(dbg->dfs_root);
- return -ENODEV;
-}
-
-/**
- * nandsim_debugfs_remove - destroy all debugfs files
- */
-static void nandsim_debugfs_remove(struct nandsim *ns)
-{
- if (IS_ENABLED(CONFIG_DEBUG_FS))
- debugfs_remove_recursive(ns->dbg.dfs_root);
}
/*
@@ -1379,7 +1356,7 @@ static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_
if (err)
return err;
noreclaim_flag = memalloc_noreclaim_save();
- tx = kernel_read(file, pos, buf, count);
+ tx = kernel_read(file, buf, count, &pos);
memalloc_noreclaim_restore(noreclaim_flag);
put_pages(ns);
return tx;
@@ -1395,7 +1372,7 @@ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size
if (err)
return err;
noreclaim_flag = memalloc_noreclaim_save();
- tx = kernel_write(file, buf, count, pos);
+ tx = kernel_write(file, buf, count, &pos);
memalloc_noreclaim_restore(noreclaim_flag);
put_pages(ns);
return tx;
@@ -2352,9 +2329,6 @@ static int __init ns_init_module(void)
if ((retval = setup_wear_reporting(nsmtd)) != 0)
goto err_exit;
- if ((retval = nandsim_debugfs_create(nand)) != 0)
- goto err_exit;
-
if ((retval = init_nandsim(nsmtd)) != 0)
goto err_exit;
@@ -2370,10 +2344,12 @@ static int __init ns_init_module(void)
if (retval != 0)
goto err_exit;
+ if ((retval = nandsim_debugfs_create(nand)) != 0)
+ goto err_exit;
+
return 0;
err_exit:
- nandsim_debugfs_remove(nand);
free_nandsim(nand);
nand_release(nsmtd);
for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
@@ -2396,7 +2372,6 @@ static void __exit ns_cleanup_module(void)
struct nandsim *ns = nand_get_controller_data(chip);
int i;
- nandsim_debugfs_remove(ns);
free_nandsim(ns); /* Free nandsim private resources */
nand_release(nsmtd); /* Unregister driver */
for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i)
diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
index 28e6118362f7..d8a806894937 100644
--- a/drivers/mtd/nand/ndfc.c
+++ b/drivers/mtd/nand/ndfc.c
@@ -22,7 +22,7 @@
*
*/
#include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/ndfc.h>
diff --git a/drivers/mtd/nand/nuc900_nand.c b/drivers/mtd/nand/nuc900_nand.c
index 8f64011d32ef..7bb4d2ea9342 100644
--- a/drivers/mtd/nand/nuc900_nand.c
+++ b/drivers/mtd/nand/nuc900_nand.c
@@ -19,7 +19,7 @@
#include <linux/err.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#define REG_FMICSR 0x00
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 084934a9f19c..54540c8fa1a2 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -18,7 +18,7 @@
#include <linux/jiffies.h>
#include <linux/sched.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/omap-dma.h>
#include <linux/io.h>
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c
index 209170ed2b76..5a5aa1f07d07 100644
--- a/drivers/mtd/nand/orion_nand.c
+++ b/drivers/mtd/nand/orion_nand.c
@@ -15,7 +15,7 @@
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/clk.h>
#include <linux/err.h>
@@ -54,13 +54,16 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
{
struct nand_chip *chip = mtd_to_nand(mtd);
void __iomem *io_base = chip->IO_ADDR_R;
+#if __LINUX_ARM_ARCH__ >= 5
uint64_t *buf64;
+#endif
int i = 0;
while (len && (unsigned long)buf & 7) {
*buf++ = readb(io_base);
len--;
}
+#if __LINUX_ARM_ARCH__ >= 5
buf64 = (uint64_t *)buf;
while (i < len/8) {
/*
@@ -74,6 +77,10 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
buf64[i++] = x;
}
i *= 8;
+#else
+ readsl(io_base, buf, len/4);
+ i = len / 4 * 4;
+#endif
while (i < len)
buf[i++] = readb(io_base);
}
diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c
index 1b207aac840c..d649d5944826 100644
--- a/drivers/mtd/nand/oxnas_nand.c
+++ b/drivers/mtd/nand/oxnas_nand.c
@@ -21,7 +21,7 @@
#include <linux/clk.h>
#include <linux/reset.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of.h>
@@ -112,14 +112,19 @@ static int oxnas_nand_probe(struct platform_device *pdev)
if (count > 1)
return -EINVAL;
- clk_prepare_enable(oxnas->clk);
+ err = clk_prepare_enable(oxnas->clk);
+ if (err)
+ return err;
+
device_reset_optional(&pdev->dev);
for_each_child_of_node(np, nand_np) {
chip = devm_kzalloc(&pdev->dev, sizeof(struct nand_chip),
GFP_KERNEL);
- if (!chip)
- return -ENOMEM;
+ if (!chip) {
+ err = -ENOMEM;
+ goto err_clk_unprepare;
+ }
chip->controller = &oxnas->base;
@@ -139,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev)
/* Scan to find existence of the device */
err = nand_scan(mtd, 1);
if (err)
- return err;
+ goto err_clk_unprepare;
err = mtd_device_register(mtd, NULL, 0);
if (err) {
nand_release(mtd);
- return err;
+ goto err_clk_unprepare;
}
oxnas->chips[nchips] = chip;
@@ -152,12 +157,18 @@ static int oxnas_nand_probe(struct platform_device *pdev)
}
/* Exit if no chips found */
- if (!nchips)
- return -ENODEV;
+ if (!nchips) {
+ err = -ENODEV;
+ goto err_clk_unprepare;
+ }
platform_set_drvdata(pdev, oxnas);
return 0;
+
+err_clk_unprepare:
+ clk_disable_unprepare(oxnas->clk);
+ return err;
}
static int oxnas_nand_remove(struct platform_device *pdev)
diff --git a/drivers/mtd/nand/pasemi_nand.c b/drivers/mtd/nand/pasemi_nand.c
index 074b8b01289e..a47a7e4bd25a 100644
--- a/drivers/mtd/nand/pasemi_nand.c
+++ b/drivers/mtd/nand/pasemi_nand.c
@@ -25,7 +25,7 @@
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c
index 791de3e4bbb6..925a1323604d 100644
--- a/drivers/mtd/nand/plat_nand.c
+++ b/drivers/mtd/nand/plat_nand.c
@@ -15,7 +15,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
struct plat_nand_data {
diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
index 74dae4bbdac8..85cff68643e0 100644
--- a/drivers/mtd/nand/pxa3xx_nand.c
+++ b/drivers/mtd/nand/pxa3xx_nand.c
@@ -21,7 +21,7 @@
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/io.h>
#include <linux/iopoll.h>
diff --git a/drivers/mtd/nand/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c
index 88af7145a51a..3baddfc997d1 100644
--- a/drivers/mtd/nand/qcom_nandc.c
+++ b/drivers/mtd/nand/qcom_nandc.c
@@ -17,7 +17,7 @@
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of.h>
#include <linux/of_device.h>
@@ -53,6 +53,8 @@
#define NAND_VERSION 0xf08
#define NAND_READ_LOCATION_0 0xf20
#define NAND_READ_LOCATION_1 0xf24
+#define NAND_READ_LOCATION_2 0xf28
+#define NAND_READ_LOCATION_3 0xf2c
/* dummy register offsets, used by write_reg_dma */
#define NAND_DEV_CMD1_RESTORE 0xdead
@@ -109,7 +111,11 @@
#define READ_ADDR 0
/* NAND_DEV_CMD_VLD bits */
-#define READ_START_VLD 0
+#define READ_START_VLD BIT(0)
+#define READ_STOP_VLD BIT(1)
+#define WRITE_START_VLD BIT(2)
+#define ERASE_START_VLD BIT(3)
+#define SEQ_READ_START_VLD BIT(4)
/* NAND_EBI2_ECC_BUF_CFG bits */
#define NUM_STEPS 0
@@ -131,6 +137,11 @@
#define ERASED_PAGE (PAGE_ALL_ERASED | PAGE_ERASED)
#define ERASED_CW (CODEWORD_ALL_ERASED | CODEWORD_ERASED)
+/* NAND_READ_LOCATION_n bits */
+#define READ_LOCATION_OFFSET 0
+#define READ_LOCATION_SIZE 16
+#define READ_LOCATION_LAST 31
+
/* Version Mask */
#define NAND_VERSION_MAJOR_MASK 0xf0000000
#define NAND_VERSION_MAJOR_SHIFT 28
@@ -148,6 +159,13 @@
#define FETCH_ID 0xb
#define RESET_DEVICE 0xd
+/* Default Value for NAND_DEV_CMD_VLD */
+#define NAND_DEV_CMD_VLD_VAL (READ_START_VLD | WRITE_START_VLD | \
+ ERASE_START_VLD | SEQ_READ_START_VLD)
+
+/* NAND_CTRL bits */
+#define BAM_MODE_EN BIT(0)
+
/*
* the NAND controller performs reads/writes with ECC in 516 byte chunks.
* the driver calls the chunks 'step' or 'codeword' interchangeably
@@ -169,11 +187,81 @@
#define ECC_BCH_4BIT BIT(2)
#define ECC_BCH_8BIT BIT(3)
+#define nandc_set_read_loc(nandc, reg, offset, size, is_last) \
+nandc_set_reg(nandc, NAND_READ_LOCATION_##reg, \
+ ((offset) << READ_LOCATION_OFFSET) | \
+ ((size) << READ_LOCATION_SIZE) | \
+ ((is_last) << READ_LOCATION_LAST))
+
+/*
+ * Returns the actual register address for all NAND_DEV_ registers
+ * (i.e. NAND_DEV_CMD0, NAND_DEV_CMD1, NAND_DEV_CMD2 and NAND_DEV_CMD_VLD)
+ */
+#define dev_cmd_reg_addr(nandc, reg) ((nandc)->props->dev_cmd_reg_start + (reg))
+
+#define QPIC_PER_CW_CMD_SGL 32
+#define QPIC_PER_CW_DATA_SGL 8
+
+/*
+ * Flags used in DMA descriptor preparation helper functions
+ * (i.e. read_reg_dma/write_reg_dma/read_data_dma/write_data_dma)
+ */
+/* Don't set the EOT in current tx BAM sgl */
+#define NAND_BAM_NO_EOT BIT(0)
+/* Set the NWD flag in current BAM sgl */
+#define NAND_BAM_NWD BIT(1)
+/* Finish writing in the current BAM sgl and start writing in another BAM sgl */
+#define NAND_BAM_NEXT_SGL BIT(2)
+/*
+ * Erased codeword status is being used two times in single transfer so this
+ * flag will determine the current value of erased codeword status register
+ */
+#define NAND_ERASED_CW_SET BIT(4)
+
+/*
+ * This data type corresponds to the BAM transaction which will be used for all
+ * NAND transfers.
+ * @cmd_sgl - sgl for NAND BAM command pipe
+ * @data_sgl - sgl for NAND BAM consumer/producer pipe
+ * @cmd_sgl_pos - current index in command sgl.
+ * @cmd_sgl_start - start index in command sgl.
+ * @tx_sgl_pos - current index in data sgl for tx.
+ * @tx_sgl_start - start index in data sgl for tx.
+ * @rx_sgl_pos - current index in data sgl for rx.
+ * @rx_sgl_start - start index in data sgl for rx.
+ */
+struct bam_transaction {
+ struct scatterlist *cmd_sgl;
+ struct scatterlist *data_sgl;
+ u32 cmd_sgl_pos;
+ u32 cmd_sgl_start;
+ u32 tx_sgl_pos;
+ u32 tx_sgl_start;
+ u32 rx_sgl_pos;
+ u32 rx_sgl_start;
+};
+
+/*
+ * This data type corresponds to the nand dma descriptor
+ * @list - list for desc_info
+ * @dir - DMA transfer direction
+ * @adm_sgl - sgl which will be used for single sgl dma descriptor. Only used by
+ * ADM
+ * @bam_sgl - sgl which will be used for dma descriptor. Only used by BAM
+ * @sgl_cnt - number of SGL in bam_sgl. Only used by BAM
+ * @dma_desc - low level DMA engine descriptor
+ */
struct desc_info {
struct list_head node;
enum dma_data_direction dir;
- struct scatterlist sgl;
+ union {
+ struct scatterlist adm_sgl;
+ struct {
+ struct scatterlist *bam_sgl;
+ int sgl_cnt;
+ };
+ };
struct dma_async_tx_descriptor *dma_desc;
};
@@ -202,6 +290,13 @@ struct nandc_regs {
__le32 orig_vld;
__le32 ecc_buf_cfg;
+ __le32 read_location0;
+ __le32 read_location1;
+ __le32 read_location2;
+ __le32 read_location3;
+
+ __le32 erased_cw_detect_cfg_clr;
+ __le32 erased_cw_detect_cfg_set;
};
/*
@@ -226,14 +321,17 @@ struct nandc_regs {
* by upper layers directly
* @buf_size/count/start: markers for chip->read_buf/write_buf functions
* @reg_read_buf: local buffer for reading back registers via DMA
+ * @reg_read_dma: contains dma address for register read buffer
* @reg_read_pos: marker for data read in reg_read_buf
*
* @regs: a contiguous chunk of memory for DMA register
* writes. contains the register values to be
* written to controller
* @cmd1/vld: some fixed controller register values
- * @ecc_modes: supported ECC modes by the current controller,
+ * @props: properties of current NAND controller,
* initialized via DT match data
+ * @max_cwperpage: maximum QPIC codewords required. calculated
+ * from all connected NAND devices pagesize
*/
struct qcom_nand_controller {
struct nand_hw_control controller;
@@ -247,23 +345,39 @@ struct qcom_nand_controller {
struct clk *core_clk;
struct clk *aon_clk;
- struct dma_chan *chan;
- unsigned int cmd_crci;
- unsigned int data_crci;
+ union {
+ /* will be used only by QPIC for BAM DMA */
+ struct {
+ struct dma_chan *tx_chan;
+ struct dma_chan *rx_chan;
+ struct dma_chan *cmd_chan;
+ };
+
+ /* will be used only by EBI2 for ADM DMA */
+ struct {
+ struct dma_chan *chan;
+ unsigned int cmd_crci;
+ unsigned int data_crci;
+ };
+ };
+
struct list_head desc_list;
+ struct bam_transaction *bam_txn;
u8 *data_buffer;
int buf_size;
int buf_count;
int buf_start;
+ unsigned int max_cwperpage;
__le32 *reg_read_buf;
+ dma_addr_t reg_read_dma;
int reg_read_pos;
struct nandc_regs *regs;
u32 cmd1, vld;
- u32 ecc_modes;
+ const struct qcom_nandc_props *props;
};
/*
@@ -316,6 +430,78 @@ struct qcom_nand_host {
u32 clrreadstatus;
};
+/*
+ * This data type corresponds to the NAND controller properties which varies
+ * among different NAND controllers.
+ * @ecc_modes - ecc mode for NAND
+ * @is_bam - whether NAND controller is using BAM
+ * @dev_cmd_reg_start - NAND_DEV_CMD_* registers starting offset
+ */
+struct qcom_nandc_props {
+ u32 ecc_modes;
+ bool is_bam;
+ u32 dev_cmd_reg_start;
+};
+
+/* Frees the BAM transaction memory */
+static void free_bam_transaction(struct qcom_nand_controller *nandc)
+{
+ struct bam_transaction *bam_txn = nandc->bam_txn;
+
+ devm_kfree(nandc->dev, bam_txn);
+}
+
+/* Allocates and Initializes the BAM transaction */
+static struct bam_transaction *
+alloc_bam_transaction(struct qcom_nand_controller *nandc)
+{
+ struct bam_transaction *bam_txn;
+ size_t bam_txn_size;
+ unsigned int num_cw = nandc->max_cwperpage;
+ void *bam_txn_buf;
+
+ bam_txn_size =
+ sizeof(*bam_txn) + num_cw *
+ ((sizeof(*bam_txn->cmd_sgl) * QPIC_PER_CW_CMD_SGL) +
+ (sizeof(*bam_txn->data_sgl) * QPIC_PER_CW_DATA_SGL));
+
+ bam_txn_buf = devm_kzalloc(nandc->dev, bam_txn_size, GFP_KERNEL);
+ if (!bam_txn_buf)
+ return NULL;
+
+ bam_txn = bam_txn_buf;
+ bam_txn_buf += sizeof(*bam_txn);
+
+ bam_txn->cmd_sgl = bam_txn_buf;
+ bam_txn_buf +=
+ sizeof(*bam_txn->cmd_sgl) * QPIC_PER_CW_CMD_SGL * num_cw;
+
+ bam_txn->data_sgl = bam_txn_buf;
+
+ return bam_txn;
+}
+
+/* Clears the BAM transaction indexes */
+static void clear_bam_transaction(struct qcom_nand_controller *nandc)
+{
+ struct bam_transaction *bam_txn = nandc->bam_txn;
+
+ if (!nandc->props->is_bam)
+ return;
+
+ bam_txn->cmd_sgl_pos = 0;
+ bam_txn->cmd_sgl_start = 0;
+ bam_txn->tx_sgl_pos = 0;
+ bam_txn->tx_sgl_start = 0;
+ bam_txn->rx_sgl_pos = 0;
+ bam_txn->rx_sgl_start = 0;
+
+ sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage *
+ QPIC_PER_CW_CMD_SGL);
+ sg_init_table(bam_txn->data_sgl, nandc->max_cwperpage *
+ QPIC_PER_CW_DATA_SGL);
+}
+
static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip)
{
return container_of(chip, struct qcom_nand_host, chip);
@@ -339,6 +525,24 @@ static inline void nandc_write(struct qcom_nand_controller *nandc, int offset,
iowrite32(val, nandc->base + offset);
}
+static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc,
+ bool is_cpu)
+{
+ if (!nandc->props->is_bam)
+ return;
+
+ if (is_cpu)
+ dma_sync_single_for_cpu(nandc->dev, nandc->reg_read_dma,
+ MAX_REG_RD *
+ sizeof(*nandc->reg_read_buf),
+ DMA_FROM_DEVICE);
+ else
+ dma_sync_single_for_device(nandc->dev, nandc->reg_read_dma,
+ MAX_REG_RD *
+ sizeof(*nandc->reg_read_buf),
+ DMA_FROM_DEVICE);
+}
+
static __le32 *offset_to_nandc_reg(struct nandc_regs *regs, int offset)
{
switch (offset) {
@@ -372,6 +576,14 @@ static __le32 *offset_to_nandc_reg(struct nandc_regs *regs, int offset)
return &regs->orig_vld;
case NAND_EBI2_ECC_BUF_CFG:
return &regs->ecc_buf_cfg;
+ case NAND_READ_LOCATION_0:
+ return &regs->read_location0;
+ case NAND_READ_LOCATION_1:
+ return &regs->read_location1;
+ case NAND_READ_LOCATION_2:
+ return &regs->read_location2;
+ case NAND_READ_LOCATION_3:
+ return &regs->read_location3;
default:
return NULL;
}
@@ -446,11 +658,119 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read)
nandc_set_reg(nandc, NAND_FLASH_STATUS, host->clrflashstatus);
nandc_set_reg(nandc, NAND_READ_STATUS, host->clrreadstatus);
nandc_set_reg(nandc, NAND_EXEC_CMD, 1);
+
+ if (read)
+ nandc_set_read_loc(nandc, 0, 0, host->use_ecc ?
+ host->cw_data : host->cw_size, 1);
+}
+
+/*
+ * Maps the scatter gather list for DMA transfer and forms the DMA descriptor
+ * for BAM. This descriptor will be added in the NAND DMA descriptor queue
+ * which will be submitted to DMA engine.
+ */
+static int prepare_bam_async_desc(struct qcom_nand_controller *nandc,
+ struct dma_chan *chan,
+ unsigned long flags)
+{
+ struct desc_info *desc;
+ struct scatterlist *sgl;
+ unsigned int sgl_cnt;
+ int ret;
+ struct bam_transaction *bam_txn = nandc->bam_txn;
+ enum dma_transfer_direction dir_eng;
+ struct dma_async_tx_descriptor *dma_desc;
+
+ desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+
+ if (chan == nandc->cmd_chan) {
+ sgl = &bam_txn->cmd_sgl[bam_txn->cmd_sgl_start];
+ sgl_cnt = bam_txn->cmd_sgl_pos - bam_txn->cmd_sgl_start;
+ bam_txn->cmd_sgl_start = bam_txn->cmd_sgl_pos;
+ dir_eng = DMA_MEM_TO_DEV;
+ desc->dir = DMA_TO_DEVICE;
+ } else if (chan == nandc->tx_chan) {
+ sgl = &bam_txn->data_sgl[bam_txn->tx_sgl_start];
+ sgl_cnt = bam_txn->tx_sgl_pos - bam_txn->tx_sgl_start;
+ bam_txn->tx_sgl_start = bam_txn->tx_sgl_pos;
+ dir_eng = DMA_MEM_TO_DEV;
+ desc->dir = DMA_TO_DEVICE;
+ } else {
+ sgl = &bam_txn->data_sgl[bam_txn->rx_sgl_start];
+ sgl_cnt = bam_txn->rx_sgl_pos - bam_txn->rx_sgl_start;
+ bam_txn->rx_sgl_start = bam_txn->rx_sgl_pos;
+ dir_eng = DMA_DEV_TO_MEM;
+ desc->dir = DMA_FROM_DEVICE;
+ }
+
+ sg_mark_end(sgl + sgl_cnt - 1);
+ ret = dma_map_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
+ if (ret == 0) {
+ dev_err(nandc->dev, "failure in mapping desc\n");
+ kfree(desc);
+ return -ENOMEM;
+ }
+
+ desc->sgl_cnt = sgl_cnt;
+ desc->bam_sgl = sgl;
+
+ dma_desc = dmaengine_prep_slave_sg(chan, sgl, sgl_cnt, dir_eng,
+ flags);
+
+ if (!dma_desc) {
+ dev_err(nandc->dev, "failure in prep desc\n");
+ dma_unmap_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
+ kfree(desc);
+ return -EINVAL;
+ }
+
+ desc->dma_desc = dma_desc;
+
+ list_add_tail(&desc->node, &nandc->desc_list);
+
+ return 0;
+}
+
+/*
+ * Prepares the data descriptor for BAM DMA which will be used for NAND
+ * data reads and writes.
+ */
+static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
+ const void *vaddr,
+ int size, unsigned int flags)
+{
+ int ret;
+ struct bam_transaction *bam_txn = nandc->bam_txn;
+
+ if (read) {
+ sg_set_buf(&bam_txn->data_sgl[bam_txn->rx_sgl_pos],
+ vaddr, size);
+ bam_txn->rx_sgl_pos++;
+ } else {
+ sg_set_buf(&bam_txn->data_sgl[bam_txn->tx_sgl_pos],
+ vaddr, size);
+ bam_txn->tx_sgl_pos++;
+
+ /*
+ * BAM will only set EOT for DMA_PREP_INTERRUPT so if this flag
+ * is not set, form the DMA descriptor
+ */
+ if (!(flags & NAND_BAM_NO_EOT)) {
+ ret = prepare_bam_async_desc(nandc, nandc->tx_chan,
+ DMA_PREP_INTERRUPT);
+ if (ret)
+ return ret;
+ }
+ }
+
+ return 0;
}
-static int prep_dma_desc(struct qcom_nand_controller *nandc, bool read,
- int reg_off, const void *vaddr, int size,
- bool flow_control)
+static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
+ int reg_off, const void *vaddr, int size,
+ bool flow_control)
{
struct desc_info *desc;
struct dma_async_tx_descriptor *dma_desc;
@@ -463,7 +783,7 @@ static int prep_dma_desc(struct qcom_nand_controller *nandc, bool read,
if (!desc)
return -ENOMEM;
- sgl = &desc->sgl;
+ sgl = &desc->adm_sgl;
sg_init_one(sgl, vaddr, size);
@@ -524,9 +844,10 @@ err:
*
* @first: offset of the first register in the contiguous block
* @num_regs: number of registers to read
+ * @flags: flags to control DMA descriptor preparation
*/
static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
- int num_regs)
+ int num_regs, unsigned int flags)
{
bool flow_control = false;
void *vaddr;
@@ -535,11 +856,14 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
flow_control = true;
+ if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
+ first = dev_cmd_reg_addr(nandc, first);
+
size = num_regs * sizeof(u32);
vaddr = nandc->reg_read_buf + nandc->reg_read_pos;
nandc->reg_read_pos += num_regs;
- return prep_dma_desc(nandc, true, first, vaddr, size, flow_control);
+ return prep_adm_dma_desc(nandc, true, first, vaddr, size, flow_control);
}
/*
@@ -548,9 +872,10 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
*
* @first: offset of the first register in the contiguous block
* @num_regs: number of registers to write
+ * @flags: flags to control DMA descriptor preparation
*/
static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
- int num_regs)
+ int num_regs, unsigned int flags)
{
bool flow_control = false;
struct nandc_regs *regs = nandc->regs;
@@ -562,15 +887,26 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
if (first == NAND_FLASH_CMD)
flow_control = true;
- if (first == NAND_DEV_CMD1_RESTORE)
- first = NAND_DEV_CMD1;
+ if (first == NAND_ERASED_CW_DETECT_CFG) {
+ if (flags & NAND_ERASED_CW_SET)
+ vaddr = &regs->erased_cw_detect_cfg_set;
+ else
+ vaddr = &regs->erased_cw_detect_cfg_clr;
+ }
+
+ if (first == NAND_EXEC_CMD)
+ flags |= NAND_BAM_NWD;
+
+ if (first == NAND_DEV_CMD1_RESTORE || first == NAND_DEV_CMD1)
+ first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD1);
- if (first == NAND_DEV_CMD_VLD_RESTORE)
- first = NAND_DEV_CMD_VLD;
+ if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
+ first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
size = num_regs * sizeof(u32);
- return prep_dma_desc(nandc, false, first, vaddr, size, flow_control);
+ return prep_adm_dma_desc(nandc, false, first, vaddr, size,
+ flow_control);
}
/*
@@ -580,11 +916,15 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
* @reg_off: offset within the controller's data buffer
* @vaddr: virtual address of the buffer we want to write to
* @size: DMA transaction size in bytes
+ * @flags: flags to control DMA descriptor preparation
*/
static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
- const u8 *vaddr, int size)
+ const u8 *vaddr, int size, unsigned int flags)
{
- return prep_dma_desc(nandc, true, reg_off, vaddr, size, false);
+ if (nandc->props->is_bam)
+ return prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
+
+ return prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
}
/*
@@ -594,48 +934,84 @@ static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
* @reg_off: offset within the controller's data buffer
* @vaddr: virtual address of the buffer we want to read from
* @size: DMA transaction size in bytes
+ * @flags: flags to control DMA descriptor preparation
*/
static int write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
- const u8 *vaddr, int size)
+ const u8 *vaddr, int size, unsigned int flags)
{
- return prep_dma_desc(nandc, false, reg_off, vaddr, size, false);
+ if (nandc->props->is_bam)
+ return prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
+
+ return prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
}
/*
- * helper to prepare dma descriptors to configure registers needed for reading a
- * codeword/step in a page
+ * Helper to prepare DMA descriptors for configuring registers
+ * before reading a NAND page.
*/
-static void config_cw_read(struct qcom_nand_controller *nandc)
+static void config_nand_page_read(struct qcom_nand_controller *nandc)
{
- write_reg_dma(nandc, NAND_FLASH_CMD, 3);
- write_reg_dma(nandc, NAND_DEV0_CFG0, 3);
- write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1);
+ write_reg_dma(nandc, NAND_ADDR0, 2, 0);
+ write_reg_dma(nandc, NAND_DEV0_CFG0, 3, 0);
+ write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1, 0);
+ write_reg_dma(nandc, NAND_ERASED_CW_DETECT_CFG, 1, 0);
+ write_reg_dma(nandc, NAND_ERASED_CW_DETECT_CFG, 1,
+ NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
+}
- write_reg_dma(nandc, NAND_EXEC_CMD, 1);
+/*
+ * Helper to prepare DMA descriptors for configuring registers
+ * before reading each codeword in NAND page.
+ */
+static void config_nand_cw_read(struct qcom_nand_controller *nandc)
+{
+ if (nandc->props->is_bam)
+ write_reg_dma(nandc, NAND_READ_LOCATION_0, 4,
+ NAND_BAM_NEXT_SGL);
- read_reg_dma(nandc, NAND_FLASH_STATUS, 2);
- read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1);
+ write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
+
+ read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
+ read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
+ NAND_BAM_NEXT_SGL);
}
/*
- * helpers to prepare dma descriptors used to configure registers needed for
- * writing a codeword/step in a page
+ * Helper to prepare dma descriptors to configure registers needed for reading a
+ * single codeword in page
*/
-static void config_cw_write_pre(struct qcom_nand_controller *nandc)
+static void config_nand_single_cw_page_read(struct qcom_nand_controller *nandc)
{
- write_reg_dma(nandc, NAND_FLASH_CMD, 3);
- write_reg_dma(nandc, NAND_DEV0_CFG0, 3);
- write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1);
+ config_nand_page_read(nandc);
+ config_nand_cw_read(nandc);
}
-static void config_cw_write_post(struct qcom_nand_controller *nandc)
+/*
+ * Helper to prepare DMA descriptors used to configure registers needed for
+ * before writing a NAND page.
+ */
+static void config_nand_page_write(struct qcom_nand_controller *nandc)
{
- write_reg_dma(nandc, NAND_EXEC_CMD, 1);
+ write_reg_dma(nandc, NAND_ADDR0, 2, 0);
+ write_reg_dma(nandc, NAND_DEV0_CFG0, 3, 0);
+ write_reg_dma(nandc, NAND_EBI2_ECC_BUF_CFG, 1,
+ NAND_BAM_NEXT_SGL);
+}
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1);
+/*
+ * Helper to prepare DMA descriptors for configuring registers
+ * before writing each codeword in NAND page.
+ */
+static void config_nand_cw_write(struct qcom_nand_controller *nandc)
+{
+ write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
- write_reg_dma(nandc, NAND_FLASH_STATUS, 1);
- write_reg_dma(nandc, NAND_READ_STATUS, 1);
+ read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
+
+ write_reg_dma(nandc, NAND_FLASH_STATUS, 1, 0);
+ write_reg_dma(nandc, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
}
/*
@@ -672,8 +1048,7 @@ static int nandc_param(struct qcom_nand_host *host)
/* configure CMD1 and VLD for ONFI param probing */
nandc_set_reg(nandc, NAND_DEV_CMD_VLD,
- (nandc->vld & ~(1 << READ_START_VLD))
- | 0 << READ_START_VLD);
+ (nandc->vld & ~READ_START_VLD));
nandc_set_reg(nandc, NAND_DEV_CMD1,
(nandc->cmd1 & ~(0xFF << READ_ADDR))
| NAND_CMD_PARAM << READ_ADDR);
@@ -682,21 +1057,22 @@ static int nandc_param(struct qcom_nand_host *host)
nandc_set_reg(nandc, NAND_DEV_CMD1_RESTORE, nandc->cmd1);
nandc_set_reg(nandc, NAND_DEV_CMD_VLD_RESTORE, nandc->vld);
+ nandc_set_read_loc(nandc, 0, 0, 512, 1);
- write_reg_dma(nandc, NAND_DEV_CMD_VLD, 1);
- write_reg_dma(nandc, NAND_DEV_CMD1, 1);
+ write_reg_dma(nandc, NAND_DEV_CMD_VLD, 1, 0);
+ write_reg_dma(nandc, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
nandc->buf_count = 512;
memset(nandc->data_buffer, 0xff, nandc->buf_count);
- config_cw_read(nandc);
+ config_nand_single_cw_page_read(nandc);
read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
- nandc->buf_count);
+ nandc->buf_count, 0);
/* restore CMD1 and VLD regs */
- write_reg_dma(nandc, NAND_DEV_CMD1_RESTORE, 1);
- write_reg_dma(nandc, NAND_DEV_CMD_VLD_RESTORE, 1);
+ write_reg_dma(nandc, NAND_DEV_CMD1_RESTORE, 1, 0);
+ write_reg_dma(nandc, NAND_DEV_CMD_VLD_RESTORE, 1, NAND_BAM_NEXT_SGL);
return 0;
}
@@ -718,14 +1094,14 @@ static int erase_block(struct qcom_nand_host *host, int page_addr)
nandc_set_reg(nandc, NAND_FLASH_STATUS, host->clrflashstatus);
nandc_set_reg(nandc, NAND_READ_STATUS, host->clrreadstatus);
- write_reg_dma(nandc, NAND_FLASH_CMD, 3);
- write_reg_dma(nandc, NAND_DEV0_CFG0, 2);
- write_reg_dma(nandc, NAND_EXEC_CMD, 1);
+ write_reg_dma(nandc, NAND_FLASH_CMD, 3, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1);
+ read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
- write_reg_dma(nandc, NAND_FLASH_STATUS, 1);
- write_reg_dma(nandc, NAND_READ_STATUS, 1);
+ write_reg_dma(nandc, NAND_FLASH_STATUS, 1, 0);
+ write_reg_dma(nandc, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
return 0;
}
@@ -742,13 +1118,14 @@ static int read_id(struct qcom_nand_host *host, int column)
nandc_set_reg(nandc, NAND_FLASH_CMD, FETCH_ID);
nandc_set_reg(nandc, NAND_ADDR0, column);
nandc_set_reg(nandc, NAND_ADDR1, 0);
- nandc_set_reg(nandc, NAND_FLASH_CHIP_SELECT, DM_EN);
+ nandc_set_reg(nandc, NAND_FLASH_CHIP_SELECT,
+ nandc->props->is_bam ? 0 : DM_EN);
nandc_set_reg(nandc, NAND_EXEC_CMD, 1);
- write_reg_dma(nandc, NAND_FLASH_CMD, 4);
- write_reg_dma(nandc, NAND_EXEC_CMD, 1);
+ write_reg_dma(nandc, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
- read_reg_dma(nandc, NAND_READ_ID, 1);
+ read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
return 0;
}
@@ -762,10 +1139,10 @@ static int reset(struct qcom_nand_host *host)
nandc_set_reg(nandc, NAND_FLASH_CMD, RESET_DEVICE);
nandc_set_reg(nandc, NAND_EXEC_CMD, 1);
- write_reg_dma(nandc, NAND_FLASH_CMD, 1);
- write_reg_dma(nandc, NAND_EXEC_CMD, 1);
+ write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
+ write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1);
+ read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
return 0;
}
@@ -775,12 +1152,43 @@ static int submit_descs(struct qcom_nand_controller *nandc)
{
struct desc_info *desc;
dma_cookie_t cookie = 0;
+ struct bam_transaction *bam_txn = nandc->bam_txn;
+ int r;
+
+ if (nandc->props->is_bam) {
+ if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
+ r = prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
+ if (r)
+ return r;
+ }
+
+ if (bam_txn->tx_sgl_pos > bam_txn->tx_sgl_start) {
+ r = prepare_bam_async_desc(nandc, nandc->tx_chan,
+ DMA_PREP_INTERRUPT);
+ if (r)
+ return r;
+ }
+
+ if (bam_txn->cmd_sgl_pos > bam_txn->cmd_sgl_start) {
+ r = prepare_bam_async_desc(nandc, nandc->cmd_chan, 0);
+ if (r)
+ return r;
+ }
+ }
list_for_each_entry(desc, &nandc->desc_list, node)
cookie = dmaengine_submit(desc->dma_desc);
- if (dma_sync_wait(nandc->chan, cookie) != DMA_COMPLETE)
- return -ETIMEDOUT;
+ if (nandc->props->is_bam) {
+ dma_async_issue_pending(nandc->tx_chan);
+ dma_async_issue_pending(nandc->rx_chan);
+
+ if (dma_sync_wait(nandc->cmd_chan, cookie) != DMA_COMPLETE)
+ return -ETIMEDOUT;
+ } else {
+ if (dma_sync_wait(nandc->chan, cookie) != DMA_COMPLETE)
+ return -ETIMEDOUT;
+ }
return 0;
}
@@ -791,7 +1199,14 @@ static void free_descs(struct qcom_nand_controller *nandc)
list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
list_del(&desc->node);
- dma_unmap_sg(nandc->dev, &desc->sgl, 1, desc->dir);
+
+ if (nandc->props->is_bam)
+ dma_unmap_sg(nandc->dev, desc->bam_sgl,
+ desc->sgl_cnt, desc->dir);
+ else
+ dma_unmap_sg(nandc->dev, &desc->adm_sgl, 1,
+ desc->dir);
+
kfree(desc);
}
}
@@ -800,8 +1215,7 @@ static void free_descs(struct qcom_nand_controller *nandc)
static void clear_read_regs(struct qcom_nand_controller *nandc)
{
nandc->reg_read_pos = 0;
- memset(nandc->reg_read_buf, 0,
- MAX_REG_RD * sizeof(*nandc->reg_read_buf));
+ nandc_read_buffer_sync(nandc, false);
}
static void pre_command(struct qcom_nand_host *host, int command)
@@ -815,6 +1229,10 @@ static void pre_command(struct qcom_nand_host *host, int command)
host->last_command = command;
clear_read_regs(nandc);
+
+ if (command == NAND_CMD_RESET || command == NAND_CMD_READID ||
+ command == NAND_CMD_PARAM || command == NAND_CMD_ERASE1)
+ clear_bam_transaction(nandc);
}
/*
@@ -831,6 +1249,7 @@ static void parse_erase_write_errors(struct qcom_nand_host *host, int command)
int i;
num_cw = command == NAND_CMD_PAGEPROG ? ecc->steps : 1;
+ nandc_read_buffer_sync(nandc, true);
for (i = 0; i < num_cw; i++) {
u32 flash_status = le32_to_cpu(nandc->reg_read_buf[i]);
@@ -852,6 +1271,7 @@ static void post_command(struct qcom_nand_host *host, int command)
switch (command) {
case NAND_CMD_READID:
+ nandc_read_buffer_sync(nandc, true);
memcpy(nandc->data_buffer, nandc->reg_read_buf,
nandc->buf_count);
break;
@@ -1015,6 +1435,7 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf,
int i;
buf = (struct read_stats *)nandc->reg_read_buf;
+ nandc_read_buffer_sync(nandc, true);
for (i = 0; i < ecc->steps; i++, buf++) {
u32 flash, buffer, erased_cw;
@@ -1102,6 +1523,8 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
struct nand_ecc_ctrl *ecc = &chip->ecc;
int i, ret;
+ config_nand_page_read(nandc);
+
/* queue cmd descs for each codeword */
for (i = 0; i < ecc->steps; i++) {
int data_size, oob_size;
@@ -1115,11 +1538,24 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
oob_size = host->ecc_bytes_hw + host->spare_bytes;
}
- config_cw_read(nandc);
+ if (nandc->props->is_bam) {
+ if (data_buf && oob_buf) {
+ nandc_set_read_loc(nandc, 0, 0, data_size, 0);
+ nandc_set_read_loc(nandc, 1, data_size,
+ oob_size, 1);
+ } else if (data_buf) {
+ nandc_set_read_loc(nandc, 0, 0, data_size, 1);
+ } else {
+ nandc_set_read_loc(nandc, 0, data_size,
+ oob_size, 1);
+ }
+ }
+
+ config_nand_cw_read(nandc);
if (data_buf)
read_data_dma(nandc, FLASH_BUF_ACC, data_buf,
- data_size);
+ data_size, 0);
/*
* when ecc is enabled, the controller doesn't read the real
@@ -1135,7 +1571,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
*oob_buf++ = 0xff;
read_data_dma(nandc, FLASH_BUF_ACC + data_size,
- oob_buf, oob_size);
+ oob_buf, oob_size, 0);
}
if (data_buf)
@@ -1175,9 +1611,9 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
set_address(host, host->cw_size * (ecc->steps - 1), page);
update_rw_regs(host, 1, true);
- config_cw_read(nandc);
+ config_nand_single_cw_page_read(nandc);
- read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size);
+ read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0);
ret = submit_descs(nandc);
if (ret)
@@ -1200,6 +1636,7 @@ static int qcom_nandc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
data_buf = buf;
oob_buf = oob_required ? chip->oob_poi : NULL;
+ clear_bam_transaction(nandc);
ret = read_page_ecc(host, data_buf, oob_buf);
if (ret) {
dev_err(nandc->dev, "failure to read page\n");
@@ -1219,12 +1656,16 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd,
u8 *data_buf, *oob_buf;
struct nand_ecc_ctrl *ecc = &chip->ecc;
int i, ret;
+ int read_loc;
data_buf = buf;
oob_buf = chip->oob_poi;
host->use_ecc = false;
+
+ clear_bam_transaction(nandc);
update_rw_regs(host, ecc->steps, true);
+ config_nand_page_read(nandc);
for (i = 0; i < ecc->steps; i++) {
int data_size1, data_size2, oob_size1, oob_size2;
@@ -1243,21 +1684,35 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd,
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
}
- config_cw_read(nandc);
+ if (nandc->props->is_bam) {
+ read_loc = 0;
+ nandc_set_read_loc(nandc, 0, read_loc, data_size1, 0);
+ read_loc += data_size1;
+
+ nandc_set_read_loc(nandc, 1, read_loc, oob_size1, 0);
+ read_loc += oob_size1;
+
+ nandc_set_read_loc(nandc, 2, read_loc, data_size2, 0);
+ read_loc += data_size2;
- read_data_dma(nandc, reg_off, data_buf, data_size1);
+ nandc_set_read_loc(nandc, 3, read_loc, oob_size2, 1);
+ }
+
+ config_nand_cw_read(nandc);
+
+ read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
reg_off += data_size1;
data_buf += data_size1;
- read_data_dma(nandc, reg_off, oob_buf, oob_size1);
+ read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
reg_off += oob_size1;
oob_buf += oob_size1;
- read_data_dma(nandc, reg_off, data_buf, data_size2);
+ read_data_dma(nandc, reg_off, data_buf, data_size2, 0);
reg_off += data_size2;
data_buf += data_size2;
- read_data_dma(nandc, reg_off, oob_buf, oob_size2);
+ read_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
oob_buf += oob_size2;
}
@@ -1280,6 +1735,7 @@ static int qcom_nandc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
int ret;
clear_read_regs(nandc);
+ clear_bam_transaction(nandc);
host->use_ecc = true;
set_address(host, 0, page);
@@ -1303,12 +1759,14 @@ static int qcom_nandc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
int i, ret;
clear_read_regs(nandc);
+ clear_bam_transaction(nandc);
data_buf = (u8 *)buf;
oob_buf = chip->oob_poi;
host->use_ecc = true;
update_rw_regs(host, ecc->steps, false);
+ config_nand_page_write(nandc);
for (i = 0; i < ecc->steps; i++) {
int data_size, oob_size;
@@ -1322,9 +1780,9 @@ static int qcom_nandc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
oob_size = ecc->bytes;
}
- config_cw_write_pre(nandc);
- write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size);
+ write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size,
+ i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0);
/*
* when ECC is enabled, we don't really need to write anything
@@ -1337,10 +1795,10 @@ static int qcom_nandc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
oob_buf += host->bbm_size;
write_data_dma(nandc, FLASH_BUF_ACC + data_size,
- oob_buf, oob_size);
+ oob_buf, oob_size, 0);
}
- config_cw_write_post(nandc);
+ config_nand_cw_write(nandc);
data_buf += data_size;
oob_buf += oob_size;
@@ -1367,12 +1825,14 @@ static int qcom_nandc_write_page_raw(struct mtd_info *mtd,
int i, ret;
clear_read_regs(nandc);
+ clear_bam_transaction(nandc);
data_buf = (u8 *)buf;
oob_buf = chip->oob_poi;
host->use_ecc = false;
update_rw_regs(host, ecc->steps, false);
+ config_nand_page_write(nandc);
for (i = 0; i < ecc->steps; i++) {
int data_size1, data_size2, oob_size1, oob_size2;
@@ -1391,24 +1851,25 @@ static int qcom_nandc_write_page_raw(struct mtd_info *mtd,
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
}
- config_cw_write_pre(nandc);
-
- write_data_dma(nandc, reg_off, data_buf, data_size1);
+ write_data_dma(nandc, reg_off, data_buf, data_size1,
+ NAND_BAM_NO_EOT);
reg_off += data_size1;
data_buf += data_size1;
- write_data_dma(nandc, reg_off, oob_buf, oob_size1);
+ write_data_dma(nandc, reg_off, oob_buf, oob_size1,
+ NAND_BAM_NO_EOT);
reg_off += oob_size1;
oob_buf += oob_size1;
- write_data_dma(nandc, reg_off, data_buf, data_size2);
+ write_data_dma(nandc, reg_off, data_buf, data_size2,
+ NAND_BAM_NO_EOT);
reg_off += data_size2;
data_buf += data_size2;
- write_data_dma(nandc, reg_off, oob_buf, oob_size2);
+ write_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
oob_buf += oob_size2;
- config_cw_write_post(nandc);
+ config_nand_cw_write(nandc);
}
ret = submit_descs(nandc);
@@ -1441,11 +1902,13 @@ static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
host->use_ecc = true;
+ clear_bam_transaction(nandc);
ret = copy_last_cw(host, page);
if (ret)
return ret;
clear_read_regs(nandc);
+ clear_bam_transaction(nandc);
/* calculate the data and oob size for the last codeword/step */
data_size = ecc->size - ((ecc->steps - 1) << 2);
@@ -1458,10 +1921,10 @@ static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
set_address(host, host->cw_size * (ecc->steps - 1), page);
update_rw_regs(host, 1, false);
- config_cw_write_pre(nandc);
- write_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
- data_size + oob_size);
- config_cw_write_post(nandc);
+ config_nand_page_write(nandc);
+ write_data_dma(nandc, FLASH_BUF_ACC,
+ nandc->data_buffer, data_size + oob_size, 0);
+ config_nand_cw_write(nandc);
ret = submit_descs(nandc);
@@ -1498,6 +1961,7 @@ static int qcom_nandc_block_bad(struct mtd_info *mtd, loff_t ofs)
*/
host->use_ecc = false;
+ clear_bam_transaction(nandc);
ret = copy_last_cw(host, page);
if (ret)
goto err;
@@ -1528,6 +1992,7 @@ static int qcom_nandc_block_markbad(struct mtd_info *mtd, loff_t ofs)
int page, ret, status = 0;
clear_read_regs(nandc);
+ clear_bam_transaction(nandc);
/*
* to mark the BBM as bad, we flash the entire last codeword with 0s.
@@ -1543,9 +2008,10 @@ static int qcom_nandc_block_markbad(struct mtd_info *mtd, loff_t ofs)
set_address(host, host->cw_size * (ecc->steps - 1), page);
update_rw_regs(host, 1, false);
- config_cw_write_pre(nandc);
- write_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, host->cw_size);
- config_cw_write_post(nandc);
+ config_nand_page_write(nandc);
+ write_data_dma(nandc, FLASH_BUF_ACC,
+ nandc->data_buffer, host->cw_size, 0);
+ config_nand_cw_write(nandc);
ret = submit_descs(nandc);
@@ -1794,7 +2260,7 @@ static int qcom_nand_host_setup(struct qcom_nand_host *host)
* uses lesser bytes for ECC. If RS is used, the ECC bytes is
* always 10 bytes
*/
- if (nandc->ecc_modes & ECC_BCH_4BIT) {
+ if (nandc->props->ecc_modes & ECC_BCH_4BIT) {
/* BCH */
host->bch_enabled = true;
ecc_mode = 0;
@@ -1842,6 +2308,8 @@ static int qcom_nand_host_setup(struct qcom_nand_host *host)
mtd_set_ooblayout(mtd, &qcom_nand_ooblayout_ops);
cwperpage = mtd->writesize / ecc->size;
+ nandc->max_cwperpage = max_t(unsigned int, nandc->max_cwperpage,
+ cwperpage);
/*
* DATA_UD_BYTES varies based on whether the read/write command protects
@@ -1893,7 +2361,7 @@ static int qcom_nand_host_setup(struct qcom_nand_host *host)
| wide_bus << WIDE_FLASH
| 1 << DEV0_CFG1_ECC_DISABLE;
- host->ecc_bch_cfg = host->bch_enabled << ECC_CFG_ECC_DISABLE
+ host->ecc_bch_cfg = !host->bch_enabled << ECC_CFG_ECC_DISABLE
| 0 << ECC_SW_RESET
| host->cw_data << ECC_NUM_DATA_BYTES
| 1 << ECC_FORCE_CLK_OPEN
@@ -1904,6 +2372,10 @@ static int qcom_nand_host_setup(struct qcom_nand_host *host)
host->clrflashstatus = FS_READY_BSY_N;
host->clrreadstatus = 0xc0;
+ nandc->regs->erased_cw_detect_cfg_clr =
+ cpu_to_le32(CLR_ERASED_PAGE_DET);
+ nandc->regs->erased_cw_detect_cfg_set =
+ cpu_to_le32(SET_ERASED_PAGE_DET);
dev_dbg(nandc->dev,
"cfg0 %x cfg1 %x ecc_buf_cfg %x ecc_bch cfg %x cw_size %d cw_data %d strength %d parity_bytes %d steps %d\n",
@@ -1948,10 +2420,55 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
if (!nandc->reg_read_buf)
return -ENOMEM;
- nandc->chan = dma_request_slave_channel(nandc->dev, "rxtx");
- if (!nandc->chan) {
- dev_err(nandc->dev, "failed to request slave channel\n");
- return -ENODEV;
+ if (nandc->props->is_bam) {
+ nandc->reg_read_dma =
+ dma_map_single(nandc->dev, nandc->reg_read_buf,
+ MAX_REG_RD *
+ sizeof(*nandc->reg_read_buf),
+ DMA_FROM_DEVICE);
+ if (dma_mapping_error(nandc->dev, nandc->reg_read_dma)) {
+ dev_err(nandc->dev, "failed to DMA MAP reg buffer\n");
+ return -EIO;
+ }
+
+ nandc->tx_chan = dma_request_slave_channel(nandc->dev, "tx");
+ if (!nandc->tx_chan) {
+ dev_err(nandc->dev, "failed to request tx channel\n");
+ return -ENODEV;
+ }
+
+ nandc->rx_chan = dma_request_slave_channel(nandc->dev, "rx");
+ if (!nandc->rx_chan) {
+ dev_err(nandc->dev, "failed to request rx channel\n");
+ return -ENODEV;
+ }
+
+ nandc->cmd_chan = dma_request_slave_channel(nandc->dev, "cmd");
+ if (!nandc->cmd_chan) {
+ dev_err(nandc->dev, "failed to request cmd channel\n");
+ return -ENODEV;
+ }
+
+ /*
+ * Initially allocate BAM transaction to read ONFI param page.
+ * After detecting all the devices, this BAM transaction will
+ * be freed and the next BAM tranasction will be allocated with
+ * maximum codeword size
+ */
+ nandc->max_cwperpage = 1;
+ nandc->bam_txn = alloc_bam_transaction(nandc);
+ if (!nandc->bam_txn) {
+ dev_err(nandc->dev,
+ "failed to allocate bam transaction\n");
+ return -ENOMEM;
+ }
+ } else {
+ nandc->chan = dma_request_slave_channel(nandc->dev, "rxtx");
+ if (!nandc->chan) {
+ dev_err(nandc->dev,
+ "failed to request slave channel\n");
+ return -ENODEV;
+ }
}
INIT_LIST_HEAD(&nandc->desc_list);
@@ -1964,21 +2481,48 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
static void qcom_nandc_unalloc(struct qcom_nand_controller *nandc)
{
- dma_release_channel(nandc->chan);
+ if (nandc->props->is_bam) {
+ if (!dma_mapping_error(nandc->dev, nandc->reg_read_dma))
+ dma_unmap_single(nandc->dev, nandc->reg_read_dma,
+ MAX_REG_RD *
+ sizeof(*nandc->reg_read_buf),
+ DMA_FROM_DEVICE);
+
+ if (nandc->tx_chan)
+ dma_release_channel(nandc->tx_chan);
+
+ if (nandc->rx_chan)
+ dma_release_channel(nandc->rx_chan);
+
+ if (nandc->cmd_chan)
+ dma_release_channel(nandc->cmd_chan);
+ } else {
+ if (nandc->chan)
+ dma_release_channel(nandc->chan);
+ }
}
/* one time setup of a few nand controller registers */
static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
{
+ u32 nand_ctrl;
+
/* kill onenand */
nandc_write(nandc, SFLASHC_BURST_CFG, 0);
+ nandc_write(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD),
+ NAND_DEV_CMD_VLD_VAL);
- /* enable ADM DMA */
- nandc_write(nandc, NAND_FLASH_CHIP_SELECT, DM_EN);
+ /* enable ADM or BAM DMA */
+ if (nandc->props->is_bam) {
+ nand_ctrl = nandc_read(nandc, NAND_CTRL);
+ nandc_write(nandc, NAND_CTRL, nand_ctrl | BAM_MODE_EN);
+ } else {
+ nandc_write(nandc, NAND_FLASH_CHIP_SELECT, DM_EN);
+ }
/* save the original values of these registers */
- nandc->cmd1 = nandc_read(nandc, NAND_DEV_CMD1);
- nandc->vld = nandc_read(nandc, NAND_DEV_CMD_VLD);
+ nandc->cmd1 = nandc_read(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD1));
+ nandc->vld = NAND_DEV_CMD_VLD_VAL;
return 0;
}
@@ -2034,14 +2578,77 @@ static int qcom_nand_host_init(struct qcom_nand_controller *nandc,
return ret;
ret = qcom_nand_host_setup(host);
- if (ret)
- return ret;
+
+ return ret;
+}
+
+static int qcom_nand_mtd_register(struct qcom_nand_controller *nandc,
+ struct qcom_nand_host *host,
+ struct device_node *dn)
+{
+ struct nand_chip *chip = &host->chip;
+ struct mtd_info *mtd = nand_to_mtd(chip);
+ int ret;
ret = nand_scan_tail(mtd);
if (ret)
return ret;
- return mtd_device_register(mtd, NULL, 0);
+ ret = mtd_device_register(mtd, NULL, 0);
+ if (ret)
+ nand_cleanup(mtd_to_nand(mtd));
+
+ return ret;
+}
+
+static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)
+{
+ struct device *dev = nandc->dev;
+ struct device_node *dn = dev->of_node, *child;
+ struct qcom_nand_host *host, *tmp;
+ int ret;
+
+ for_each_available_child_of_node(dn, child) {
+ host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
+ if (!host) {
+ of_node_put(child);
+ return -ENOMEM;
+ }
+
+ ret = qcom_nand_host_init(nandc, host, child);
+ if (ret) {
+ devm_kfree(dev, host);
+ continue;
+ }
+
+ list_add_tail(&host->node, &nandc->host_list);
+ }
+
+ if (list_empty(&nandc->host_list))
+ return -ENODEV;
+
+ if (nandc->props->is_bam) {
+ free_bam_transaction(nandc);
+ nandc->bam_txn = alloc_bam_transaction(nandc);
+ if (!nandc->bam_txn) {
+ dev_err(nandc->dev,
+ "failed to allocate bam transaction\n");
+ return -ENOMEM;
+ }
+ }
+
+ list_for_each_entry_safe(host, tmp, &nandc->host_list, node) {
+ ret = qcom_nand_mtd_register(nandc, host, child);
+ if (ret) {
+ list_del(&host->node);
+ devm_kfree(dev, host);
+ }
+ }
+
+ if (list_empty(&nandc->host_list))
+ return -ENODEV;
+
+ return 0;
}
/* parse custom DT properties here */
@@ -2051,16 +2658,20 @@ static int qcom_nandc_parse_dt(struct platform_device *pdev)
struct device_node *np = nandc->dev->of_node;
int ret;
- ret = of_property_read_u32(np, "qcom,cmd-crci", &nandc->cmd_crci);
- if (ret) {
- dev_err(nandc->dev, "command CRCI unspecified\n");
- return ret;
- }
+ if (!nandc->props->is_bam) {
+ ret = of_property_read_u32(np, "qcom,cmd-crci",
+ &nandc->cmd_crci);
+ if (ret) {
+ dev_err(nandc->dev, "command CRCI unspecified\n");
+ return ret;
+ }
- ret = of_property_read_u32(np, "qcom,data-crci", &nandc->data_crci);
- if (ret) {
- dev_err(nandc->dev, "data CRCI unspecified\n");
- return ret;
+ ret = of_property_read_u32(np, "qcom,data-crci",
+ &nandc->data_crci);
+ if (ret) {
+ dev_err(nandc->dev, "data CRCI unspecified\n");
+ return ret;
+ }
}
return 0;
@@ -2069,10 +2680,8 @@ static int qcom_nandc_parse_dt(struct platform_device *pdev)
static int qcom_nandc_probe(struct platform_device *pdev)
{
struct qcom_nand_controller *nandc;
- struct qcom_nand_host *host;
const void *dev_data;
struct device *dev = &pdev->dev;
- struct device_node *dn = dev->of_node, *child;
struct resource *res;
int ret;
@@ -2089,7 +2698,7 @@ static int qcom_nandc_probe(struct platform_device *pdev)
return -ENODEV;
}
- nandc->ecc_modes = (unsigned long)dev_data;
+ nandc->props = dev_data;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
nandc->base = devm_ioremap_resource(dev, res);
@@ -2112,7 +2721,7 @@ static int qcom_nandc_probe(struct platform_device *pdev)
ret = qcom_nandc_alloc(nandc);
if (ret)
- return ret;
+ goto err_core_clk;
ret = clk_prepare_enable(nandc->core_clk);
if (ret)
@@ -2126,35 +2735,12 @@ static int qcom_nandc_probe(struct platform_device *pdev)
if (ret)
goto err_setup;
- for_each_available_child_of_node(dn, child) {
- if (of_device_is_compatible(child, "qcom,nandcs")) {
- host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
- if (!host) {
- of_node_put(child);
- ret = -ENOMEM;
- goto err_cs_init;
- }
-
- ret = qcom_nand_host_init(nandc, host, child);
- if (ret) {
- devm_kfree(dev, host);
- continue;
- }
-
- list_add_tail(&host->node, &nandc->host_list);
- }
- }
-
- if (list_empty(&nandc->host_list)) {
- ret = -ENODEV;
- goto err_cs_init;
- }
+ ret = qcom_probe_nand_devices(nandc);
+ if (ret)
+ goto err_setup;
return 0;
-err_cs_init:
- list_for_each_entry(host, &nandc->host_list, node)
- nand_release(nand_to_mtd(&host->chip));
err_setup:
clk_disable_unprepare(nandc->aon_clk);
err_aon_clk:
@@ -2181,15 +2767,40 @@ static int qcom_nandc_remove(struct platform_device *pdev)
return 0;
}
-#define EBI2_NANDC_ECC_MODES (ECC_RS_4BIT | ECC_BCH_8BIT)
+static const struct qcom_nandc_props ipq806x_nandc_props = {
+ .ecc_modes = (ECC_RS_4BIT | ECC_BCH_8BIT),
+ .is_bam = false,
+ .dev_cmd_reg_start = 0x0,
+};
+
+static const struct qcom_nandc_props ipq4019_nandc_props = {
+ .ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT),
+ .is_bam = true,
+ .dev_cmd_reg_start = 0x0,
+};
+
+static const struct qcom_nandc_props ipq8074_nandc_props = {
+ .ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT),
+ .is_bam = true,
+ .dev_cmd_reg_start = 0x7000,
+};
/*
* data will hold a struct pointer containing more differences once we support
* more controller variants
*/
static const struct of_device_id qcom_nandc_of_match[] = {
- { .compatible = "qcom,ipq806x-nand",
- .data = (void *)EBI2_NANDC_ECC_MODES,
+ {
+ .compatible = "qcom,ipq806x-nand",
+ .data = &ipq806x_nandc_props,
+ },
+ {
+ .compatible = "qcom,ipq4019-nand",
+ .data = &ipq4019_nandc_props,
+ },
+ {
+ .compatible = "qcom,ipq8074-nand",
+ .data = &ipq8074_nandc_props,
},
{}
};
diff --git a/drivers/mtd/nand/r852.h b/drivers/mtd/nand/r852.h
index d042ddb71a8b..8713c57f6207 100644
--- a/drivers/mtd/nand/r852.h
+++ b/drivers/mtd/nand/r852.h
@@ -10,7 +10,7 @@
#include <linux/pci.h>
#include <linux/completion.h>
#include <linux/workqueue.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/spinlock.h>
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 9e0c849607b9..4c383eeec6f6 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -43,7 +43,7 @@
#include <linux/of_device.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 891ac7b99305..e7f3c98487e6 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -38,7 +38,7 @@
#include <linux/string.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/sh_flctl.h>
@@ -411,7 +411,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
dma_addr = dma_map_single(chan->device->dev, buf, len, dir);
- if (dma_addr)
+ if (!dma_mapping_error(chan->device->dev, dma_addr))
desc = dmaengine_prep_slave_single(chan, dma_addr, len,
tr_dir, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
@@ -1141,8 +1141,8 @@ static int flctl_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
- dev_err(&pdev->dev, "failed to get flste irq data\n");
- return -ENXIO;
+ dev_err(&pdev->dev, "failed to get flste irq data: %d\n", irq);
+ return irq;
}
ret = devm_request_irq(&pdev->dev, irq, flctl_handle_flste, IRQF_SHARED,
diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c
index 064ca1757589..f59c455d9f51 100644
--- a/drivers/mtd/nand/sharpsl.c
+++ b/drivers/mtd/nand/sharpsl.c
@@ -17,7 +17,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/sharpsl.h>
@@ -183,7 +183,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)
/* Register the partitions */
mtd->name = "sharpsl-nand";
- err = mtd_device_parse_register(mtd, NULL, NULL,
+ err = mtd_device_parse_register(mtd, data->part_parsers, NULL,
data->partitions, data->nr_partitions);
if (err)
goto err_add;
diff --git a/drivers/mtd/nand/sm_common.c b/drivers/mtd/nand/sm_common.c
index 5939dff253c2..c378705c6e2b 100644
--- a/drivers/mtd/nand/sm_common.c
+++ b/drivers/mtd/nand/sm_common.c
@@ -7,7 +7,7 @@
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/module.h>
#include <linux/sizes.h>
#include "sm_common.h"
diff --git a/drivers/mtd/nand/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c
index 72369bd079af..575997d0ef8a 100644
--- a/drivers/mtd/nand/socrates_nand.c
+++ b/drivers/mtd/nand/socrates_nand.c
@@ -13,7 +13,7 @@
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c
index 6abd142b1324..82244be3e766 100644
--- a/drivers/mtd/nand/sunxi_nand.c
+++ b/drivers/mtd/nand/sunxi_nand.c
@@ -31,7 +31,7 @@
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/clk.h>
#include <linux/delay.h>
@@ -2212,7 +2212,7 @@ static int sunxi_nfc_probe(struct platform_device *pdev)
if (ret)
goto out_ahb_clk_unprepare;
- nfc->reset = devm_reset_control_get_optional(dev, "ahb");
+ nfc->reset = devm_reset_control_get_optional_exclusive(dev, "ahb");
if (IS_ERR(nfc->reset)) {
ret = PTR_ERR(nfc->reset);
goto out_mod_clk_unprepare;
diff --git a/drivers/mtd/nand/tango_nand.c b/drivers/mtd/nand/tango_nand.c
index 9d40b793b1c4..766906f03943 100644
--- a/drivers/mtd/nand/tango_nand.c
+++ b/drivers/mtd/nand/tango_nand.c
@@ -11,7 +11,7 @@
#include <linux/clk.h>
#include <linux/iopoll.h>
#include <linux/module.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
diff --git a/drivers/mtd/nand/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c
index fc5e773f8b60..84dbf32332e1 100644
--- a/drivers/mtd/nand/tmio_nand.c
+++ b/drivers/mtd/nand/tmio_nand.c
@@ -34,7 +34,7 @@
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/slab.h>
@@ -440,7 +440,9 @@ static int tmio_probe(struct platform_device *dev)
goto err_irq;
/* Register the partitions */
- retval = mtd_device_parse_register(mtd, NULL, NULL,
+ retval = mtd_device_parse_register(mtd,
+ data ? data->part_parsers : NULL,
+ NULL,
data ? data->partition : NULL,
data ? data->num_partitions : 0);
if (!retval)
diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c
index 0a14fda2e41b..b567d212fe7d 100644
--- a/drivers/mtd/nand/txx9ndfmc.c
+++ b/drivers/mtd/nand/txx9ndfmc.c
@@ -16,7 +16,7 @@
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <linux/io.h>
diff --git a/drivers/mtd/nand/vf610_nfc.c b/drivers/mtd/nand/vf610_nfc.c
index 744ab10e8962..8037d4b48a05 100644
--- a/drivers/mtd/nand/vf610_nfc.c
+++ b/drivers/mtd/nand/vf610_nfc.c
@@ -31,10 +31,9 @@
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/of_device.h>
-#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
@@ -814,12 +813,14 @@ static int vf610_nfc_suspend(struct device *dev)
static int vf610_nfc_resume(struct device *dev)
{
+ int err;
+
struct mtd_info *mtd = dev_get_drvdata(dev);
struct vf610_nfc *nfc = mtd_to_nfc(mtd);
- pinctrl_pm_select_default_state(dev);
-
- clk_prepare_enable(nfc->clk);
+ err = clk_prepare_enable(nfc->clk);
+ if (err)
+ return err;
vf610_nfc_preinit_controller(nfc);
vf610_nfc_init_controller(nfc);
diff --git a/drivers/mtd/nand/xway_nand.c b/drivers/mtd/nand/xway_nand.c
index ddee4005248c..9926b4e3d69d 100644
--- a/drivers/mtd/nand/xway_nand.c
+++ b/drivers/mtd/nand/xway_nand.c
@@ -7,7 +7,7 @@
* Copyright © 2016 Hauke Mehrtens <[email protected]>
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c
index e21161353e76..1f1a61168b3d 100644
--- a/drivers/mtd/nftlcore.c
+++ b/drivers/mtd/nftlcore.c
@@ -34,7 +34,7 @@
#include <linux/kmod.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nftl.h>
#include <linux/mtd/blktrans.h>
diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c
index a5dfbfbebfca..184c8fbfe465 100644
--- a/drivers/mtd/nftlmount.c
+++ b/drivers/mtd/nftlmount.c
@@ -25,7 +25,7 @@
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nftl.h>
#define SECTORSIZE 512
diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c
index 2861c7079d7b..6bdf4e525677 100644
--- a/drivers/mtd/ofpart.c
+++ b/drivers/mtd/ofpart.c
@@ -50,8 +50,8 @@ static int parse_ofpart_partitions(struct mtd_info *master,
* when using another parser), so don't be louder than
* KERN_DEBUG
*/
- pr_debug("%s: 'partitions' subnode not found on %s. Trying to parse direct subnodes as partitions.\n",
- master->name, mtd_node->full_name);
+ pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n",
+ master->name, mtd_node);
ofpart_node = mtd_node;
dedicated = false;
} else if (!of_device_is_compatible(ofpart_node, "fixed-partitions")) {
@@ -87,9 +87,9 @@ static int parse_ofpart_partitions(struct mtd_info *master,
reg = of_get_property(pp, "reg", &len);
if (!reg) {
if (dedicated) {
- pr_debug("%s: ofpart partition %s (%s) missing reg property.\n",
- master->name, pp->full_name,
- mtd_node->full_name);
+ pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
+ master->name, pp,
+ mtd_node);
goto ofpart_fail;
} else {
nr_parts--;
@@ -100,9 +100,9 @@ static int parse_ofpart_partitions(struct mtd_info *master,
a_cells = of_n_addr_cells(pp);
s_cells = of_n_size_cells(pp);
if (len / 4 != a_cells + s_cells) {
- pr_debug("%s: ofpart partition %s (%s) error parsing reg property.\n",
- master->name, pp->full_name,
- mtd_node->full_name);
+ pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
+ master->name, pp,
+ mtd_node);
goto ofpart_fail;
}
@@ -131,8 +131,8 @@ static int parse_ofpart_partitions(struct mtd_info *master,
return nr_parts;
ofpart_fail:
- pr_err("%s: error parsing ofpart partition %s (%s)\n",
- master->name, pp->full_name, mtd_node->full_name);
+ pr_err("%s: error parsing ofpart partition %pOF (%pOF)\n",
+ master->name, pp, mtd_node);
ret = -EINVAL;
ofpart_none:
of_node_put(pp);
@@ -166,8 +166,7 @@ static int parse_ofoldpart_partitions(struct mtd_info *master,
if (!part)
return 0; /* No partitions found */
- pr_warn("Device tree uses obsolete partition map binding: %s\n",
- dp->full_name);
+ pr_warn("Device tree uses obsolete partition map binding: %pOF\n", dp);
nr_parts = plen / sizeof(part[0]);
diff --git a/drivers/mtd/spi-nor/Kconfig b/drivers/mtd/spi-nor/Kconfig
index 293c8a4d1e49..69c638dd0484 100644
--- a/drivers/mtd/spi-nor/Kconfig
+++ b/drivers/mtd/spi-nor/Kconfig
@@ -89,6 +89,22 @@ config SPI_NXP_SPIFI
config SPI_INTEL_SPI
tristate
+config SPI_INTEL_SPI_PCI
+ tristate "Intel PCH/PCU SPI flash PCI driver" if EXPERT
+ depends on X86 && PCI
+ select SPI_INTEL_SPI
+ help
+ This enables PCI support for the Intel PCH/PCU SPI controller in
+ master mode. This controller is present in modern Intel hardware
+ and is used to hold BIOS and other persistent settings. Using
+ this driver it is possible to upgrade BIOS directly from Linux.
+
+ Say N here unless you know what you are doing. Overwriting the
+ SPI flash may render the system unbootable.
+
+ To compile this driver as a module, choose M here: the module
+ will be called intel-spi-pci.
+
config SPI_INTEL_SPI_PLATFORM
tristate "Intel PCH/PCU SPI flash platform driver" if EXPERT
depends on X86
diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile
index 285aab86c7ca..7d84c5108e17 100644
--- a/drivers/mtd/spi-nor/Makefile
+++ b/drivers/mtd/spi-nor/Makefile
@@ -7,5 +7,6 @@ obj-$(CONFIG_SPI_HISI_SFC) += hisi-sfc.o
obj-$(CONFIG_MTD_MT81xx_NOR) += mtk-quadspi.o
obj-$(CONFIG_SPI_NXP_SPIFI) += nxp-spifi.o
obj-$(CONFIG_SPI_INTEL_SPI) += intel-spi.o
+obj-$(CONFIG_SPI_INTEL_SPI_PCI) += intel-spi-pci.o
obj-$(CONFIG_SPI_INTEL_SPI_PLATFORM) += intel-spi-platform.o
-obj-$(CONFIG_SPI_STM32_QUADSPI) += stm32-quadspi.o \ No newline at end of file
+obj-$(CONFIG_SPI_STM32_QUADSPI) += stm32-quadspi.o
diff --git a/drivers/mtd/spi-nor/aspeed-smc.c b/drivers/mtd/spi-nor/aspeed-smc.c
index 0106357421bd..8d3cbe27efb6 100644
--- a/drivers/mtd/spi-nor/aspeed-smc.c
+++ b/drivers/mtd/spi-nor/aspeed-smc.c
@@ -621,19 +621,18 @@ static void aspeed_smc_chip_set_type(struct aspeed_smc_chip *chip, int type)
}
/*
- * The AST2500 FMC flash controller should be strapped by hardware, or
- * autodetected, but the AST2500 SPI flash needs to be set.
+ * The first chip of the AST2500 FMC flash controller is strapped by
+ * hardware, or autodetected, but other chips need to be set. Enforce
+ * the 4B setting for all chips.
*/
static void aspeed_smc_chip_set_4b(struct aspeed_smc_chip *chip)
{
struct aspeed_smc_controller *controller = chip->controller;
u32 reg;
- if (chip->controller->info == &spi_2500_info) {
- reg = readl(controller->regs + CE_CONTROL_REG);
- reg |= 1 << chip->cs;
- writel(reg, controller->regs + CE_CONTROL_REG);
- }
+ reg = readl(controller->regs + CE_CONTROL_REG);
+ reg |= 1 << chip->cs;
+ writel(reg, controller->regs + CE_CONTROL_REG);
}
/*
diff --git a/drivers/mtd/spi-nor/atmel-quadspi.c b/drivers/mtd/spi-nor/atmel-quadspi.c
index ba76fa8f2031..6c5708bacad8 100644
--- a/drivers/mtd/spi-nor/atmel-quadspi.c
+++ b/drivers/mtd/spi-nor/atmel-quadspi.c
@@ -35,7 +35,6 @@
#include <linux/io.h>
#include <linux/gpio.h>
-#include <linux/pinctrl/consumer.h>
/* QSPI register offsets */
#define QSPI_CR 0x0000 /* Control Register */
diff --git a/drivers/mtd/spi-nor/hisi-sfc.c b/drivers/mtd/spi-nor/hisi-sfc.c
index d1106832b9d5..04f9fb5cd9b6 100644
--- a/drivers/mtd/spi-nor/hisi-sfc.c
+++ b/drivers/mtd/spi-nor/hisi-sfc.c
@@ -355,16 +355,16 @@ static int hisi_spi_nor_register(struct device_node *np,
ret = of_property_read_u32(np, "reg", &priv->chipselect);
if (ret) {
- dev_err(dev, "There's no reg property for %s\n",
- np->full_name);
+ dev_err(dev, "There's no reg property for %pOF\n",
+ np);
return ret;
}
ret = of_property_read_u32(np, "spi-max-frequency",
&priv->clkrate);
if (ret) {
- dev_err(dev, "There's no spi-max-frequency property for %s\n",
- np->full_name);
+ dev_err(dev, "There's no spi-max-frequency property for %pOF\n",
+ np);
return ret;
}
priv->host = host;
diff --git a/drivers/mtd/spi-nor/intel-spi-pci.c b/drivers/mtd/spi-nor/intel-spi-pci.c
new file mode 100644
index 000000000000..e82652335ede
--- /dev/null
+++ b/drivers/mtd/spi-nor/intel-spi-pci.c
@@ -0,0 +1,82 @@
+/*
+ * Intel PCH/PCU SPI flash PCI driver.
+ *
+ * Copyright (C) 2016, Intel Corporation
+ * Author: Mika Westerberg <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+
+#include "intel-spi.h"
+
+#define BCR 0xdc
+#define BCR_WPD BIT(0)
+
+static const struct intel_spi_boardinfo bxt_info = {
+ .type = INTEL_SPI_BXT,
+};
+
+static int intel_spi_pci_probe(struct pci_dev *pdev,
+ const struct pci_device_id *id)
+{
+ struct intel_spi_boardinfo *info;
+ struct intel_spi *ispi;
+ u32 bcr;
+ int ret;
+
+ ret = pcim_enable_device(pdev);
+ if (ret)
+ return ret;
+
+ info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
+ GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ /* Try to make the chip read/write */
+ pci_read_config_dword(pdev, BCR, &bcr);
+ if (!(bcr & BCR_WPD)) {
+ bcr |= BCR_WPD;
+ pci_write_config_dword(pdev, BCR, bcr);
+ pci_read_config_dword(pdev, BCR, &bcr);
+ }
+ info->writeable = !!(bcr & BCR_WPD);
+
+ ispi = intel_spi_probe(&pdev->dev, &pdev->resource[0], info);
+ if (IS_ERR(ispi))
+ return PTR_ERR(ispi);
+
+ pci_set_drvdata(pdev, ispi);
+ return 0;
+}
+
+static void intel_spi_pci_remove(struct pci_dev *pdev)
+{
+ intel_spi_remove(pci_get_drvdata(pdev));
+}
+
+static const struct pci_device_id intel_spi_pci_ids[] = {
+ { PCI_VDEVICE(INTEL, 0x19e0), (unsigned long)&bxt_info },
+ { },
+};
+MODULE_DEVICE_TABLE(pci, intel_spi_pci_ids);
+
+static struct pci_driver intel_spi_pci_driver = {
+ .name = "intel-spi",
+ .id_table = intel_spi_pci_ids,
+ .probe = intel_spi_pci_probe,
+ .remove = intel_spi_pci_remove,
+};
+
+module_pci_driver(intel_spi_pci_driver);
+
+MODULE_DESCRIPTION("Intel PCH/PCU SPI flash PCI driver");
+MODULE_AUTHOR("Mika Westerberg <[email protected]>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/mtd/spi-nor/mtk-quadspi.c b/drivers/mtd/spi-nor/mtk-quadspi.c
index 8a20ec4991c8..c258c7adf1c5 100644
--- a/drivers/mtd/spi-nor/mtk-quadspi.c
+++ b/drivers/mtd/spi-nor/mtk-quadspi.c
@@ -24,7 +24,6 @@
#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/of_device.h>
-#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 1413828ff1fb..19c000722cbc 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -17,6 +17,7 @@
#include <linux/mutex.h>
#include <linux/math64.h>
#include <linux/sizes.h>
+#include <linux/slab.h>
#include <linux/mtd/mtd.h>
#include <linux/of_platform.h>
@@ -86,6 +87,8 @@ struct flash_info {
* to support memory size above 128Mib.
*/
#define NO_CHIP_ERASE BIT(12) /* Chip does not support chip erase */
+#define SPI_NOR_SKIP_SFDP BIT(13) /* Skip parsing of SFDP tables */
+#define USE_CLSR BIT(14) /* use CLSR command */
};
#define JEDEC_MFR(info) ((info)->id[0])
@@ -306,8 +309,18 @@ static inline int spi_nor_sr_ready(struct spi_nor *nor)
int sr = read_sr(nor);
if (sr < 0)
return sr;
- else
- return !(sr & SR_WIP);
+
+ if (nor->flags & SNOR_F_USE_CLSR && sr & (SR_E_ERR | SR_P_ERR)) {
+ if (sr & SR_E_ERR)
+ dev_err(nor->dev, "Erase Error occurred\n");
+ else
+ dev_err(nor->dev, "Programming Error occurred\n");
+
+ nor->write_reg(nor, SPINOR_OP_CLSR, NULL, 0);
+ return -EIO;
+ }
+
+ return !(sr & SR_WIP);
}
static inline int spi_nor_fsr_ready(struct spi_nor *nor)
@@ -1041,15 +1054,15 @@ static const struct flash_info spi_nor_ids[] = {
*/
{ "s25sl032p", INFO(0x010215, 0x4d00, 64 * 1024, 64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
{ "s25sl064p", INFO(0x010216, 0x4d00, 64 * 1024, 128, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) },
- { "s25fl256s1", INFO(0x010219, 0x4d01, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "s25fl512s", INFO(0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+ { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, USE_CLSR) },
+ { "s25fl256s1", INFO(0x010219, 0x4d01, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
+ { "s25fl512s", INFO(0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
{ "s70fl01gs", INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
{ "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024, 64, 0) },
{ "s25sl12801", INFO(0x012018, 0x0301, 64 * 1024, 256, 0) },
- { "s25fl128s", INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024, 64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "s25fl129p1", INFO(0x012018, 0x4d01, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+ { "s25fl128s", INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
+ { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024, 64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
+ { "s25fl129p1", INFO(0x012018, 0x4d01, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
{ "s25sl004a", INFO(0x010212, 0, 64 * 1024, 8, 0) },
{ "s25sl008a", INFO(0x010213, 0, 64 * 1024, 16, 0) },
{ "s25sl016a", INFO(0x010214, 0, 64 * 1024, 32, 0) },
@@ -1079,6 +1092,7 @@ static const struct flash_info spi_nor_ids[] = {
{ "sst25wf040b", INFO(0x621613, 0, 64 * 1024, 8, SECT_4K) },
{ "sst25wf040", INFO(0xbf2504, 0, 64 * 1024, 8, SECT_4K | SST_WRITE) },
{ "sst25wf080", INFO(0xbf2505, 0, 64 * 1024, 16, SECT_4K | SST_WRITE) },
+ { "sst26vf064b", INFO(0xbf2643, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
/* ST Microelectronics -- newer production may have feature updates */
{ "m25p05", INFO(0x202010, 0, 32 * 1024, 2, 0) },
@@ -1380,6 +1394,16 @@ write_err:
return ret;
}
+/**
+ * macronix_quad_enable() - set QE bit in Status Register.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Set the Quad Enable (QE) bit in the Status Register.
+ *
+ * bit 6 of the Status Register is the QE bit for Macronix like QSPI memories.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
static int macronix_quad_enable(struct spi_nor *nor)
{
int ret, val;
@@ -1413,22 +1437,13 @@ static int macronix_quad_enable(struct spi_nor *nor)
* second byte will be written to the configuration register.
* Return negative if error occurred.
*/
-static int write_sr_cr(struct spi_nor *nor, u16 val)
-{
- nor->cmd_buf[0] = val & 0xff;
- nor->cmd_buf[1] = (val >> 8);
-
- return nor->write_reg(nor, SPINOR_OP_WRSR, nor->cmd_buf, 2);
-}
-
-static int spansion_quad_enable(struct spi_nor *nor)
+static int write_sr_cr(struct spi_nor *nor, u8 *sr_cr)
{
int ret;
- int quad_en = CR_QUAD_EN_SPAN << 8;
write_enable(nor);
- ret = write_sr_cr(nor, quad_en);
+ ret = nor->write_reg(nor, SPINOR_OP_WRSR, sr_cr, 2);
if (ret < 0) {
dev_err(nor->dev,
"error while writing configuration register\n");
@@ -1442,6 +1457,41 @@ static int spansion_quad_enable(struct spi_nor *nor)
return ret;
}
+ return 0;
+}
+
+/**
+ * spansion_quad_enable() - set QE bit in Configuraiton Register.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Set the Quad Enable (QE) bit in the Configuration Register.
+ * This function is kept for legacy purpose because it has been used for a
+ * long time without anybody complaining but it should be considered as
+ * deprecated and maybe buggy.
+ * First, this function doesn't care about the previous values of the Status
+ * and Configuration Registers when it sets the QE bit (bit 1) in the
+ * Configuration Register: all other bits are cleared, which may have unwanted
+ * side effects like removing some block protections.
+ * Secondly, it uses the Read Configuration Register (35h) instruction though
+ * some very old and few memories don't support this instruction. If a pull-up
+ * resistor is present on the MISO/IO1 line, we might still be able to pass the
+ * "read back" test because the QSPI memory doesn't recognize the command,
+ * so leaves the MISO/IO1 line state unchanged, hence read_cr() returns 0xFF.
+ *
+ * bit 1 of the Configuration Register is the QE bit for Spansion like QSPI
+ * memories.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spansion_quad_enable(struct spi_nor *nor)
+{
+ u8 sr_cr[2] = {0, CR_QUAD_EN_SPAN};
+ int ret;
+
+ ret = write_sr_cr(nor, sr_cr);
+ if (ret)
+ return ret;
+
/* read back and check it */
ret = read_cr(nor);
if (!(ret > 0 && (ret & CR_QUAD_EN_SPAN))) {
@@ -1452,6 +1502,140 @@ static int spansion_quad_enable(struct spi_nor *nor)
return 0;
}
+/**
+ * spansion_no_read_cr_quad_enable() - set QE bit in Configuration Register.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Set the Quad Enable (QE) bit in the Configuration Register.
+ * This function should be used with QSPI memories not supporting the Read
+ * Configuration Register (35h) instruction.
+ *
+ * bit 1 of the Configuration Register is the QE bit for Spansion like QSPI
+ * memories.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spansion_no_read_cr_quad_enable(struct spi_nor *nor)
+{
+ u8 sr_cr[2];
+ int ret;
+
+ /* Keep the current value of the Status Register. */
+ ret = read_sr(nor);
+ if (ret < 0) {
+ dev_err(nor->dev, "error while reading status register\n");
+ return -EINVAL;
+ }
+ sr_cr[0] = ret;
+ sr_cr[1] = CR_QUAD_EN_SPAN;
+
+ return write_sr_cr(nor, sr_cr);
+}
+
+/**
+ * spansion_read_cr_quad_enable() - set QE bit in Configuration Register.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Set the Quad Enable (QE) bit in the Configuration Register.
+ * This function should be used with QSPI memories supporting the Read
+ * Configuration Register (35h) instruction.
+ *
+ * bit 1 of the Configuration Register is the QE bit for Spansion like QSPI
+ * memories.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spansion_read_cr_quad_enable(struct spi_nor *nor)
+{
+ struct device *dev = nor->dev;
+ u8 sr_cr[2];
+ int ret;
+
+ /* Check current Quad Enable bit value. */
+ ret = read_cr(nor);
+ if (ret < 0) {
+ dev_err(dev, "error while reading configuration register\n");
+ return -EINVAL;
+ }
+
+ if (ret & CR_QUAD_EN_SPAN)
+ return 0;
+
+ sr_cr[1] = ret | CR_QUAD_EN_SPAN;
+
+ /* Keep the current value of the Status Register. */
+ ret = read_sr(nor);
+ if (ret < 0) {
+ dev_err(dev, "error while reading status register\n");
+ return -EINVAL;
+ }
+ sr_cr[0] = ret;
+
+ ret = write_sr_cr(nor, sr_cr);
+ if (ret)
+ return ret;
+
+ /* Read back and check it. */
+ ret = read_cr(nor);
+ if (!(ret > 0 && (ret & CR_QUAD_EN_SPAN))) {
+ dev_err(nor->dev, "Spansion Quad bit not set\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/**
+ * sr2_bit7_quad_enable() - set QE bit in Status Register 2.
+ * @nor: pointer to a 'struct spi_nor'
+ *
+ * Set the Quad Enable (QE) bit in the Status Register 2.
+ *
+ * This is one of the procedures to set the QE bit described in the SFDP
+ * (JESD216 rev B) specification but no manufacturer using this procedure has
+ * been identified yet, hence the name of the function.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int sr2_bit7_quad_enable(struct spi_nor *nor)
+{
+ u8 sr2;
+ int ret;
+
+ /* Check current Quad Enable bit value. */
+ ret = nor->read_reg(nor, SPINOR_OP_RDSR2, &sr2, 1);
+ if (ret)
+ return ret;
+ if (sr2 & SR2_QUAD_EN_BIT7)
+ return 0;
+
+ /* Update the Quad Enable bit. */
+ sr2 |= SR2_QUAD_EN_BIT7;
+
+ write_enable(nor);
+
+ ret = nor->write_reg(nor, SPINOR_OP_WRSR2, &sr2, 1);
+ if (ret < 0) {
+ dev_err(nor->dev, "error while writing status register 2\n");
+ return -EINVAL;
+ }
+
+ ret = spi_nor_wait_till_ready(nor);
+ if (ret < 0) {
+ dev_err(nor->dev, "timeout while writing status register 2\n");
+ return ret;
+ }
+
+ /* Read back and check it. */
+ ret = nor->read_reg(nor, SPINOR_OP_RDSR2, &sr2, 1);
+ if (!(ret > 0 && (sr2 & SR2_QUAD_EN_BIT7))) {
+ dev_err(nor->dev, "SR2 Quad bit not set\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int spi_nor_check(struct spi_nor *nor)
{
if (!nor->dev || !nor->read || !nor->write ||
@@ -1591,6 +1775,599 @@ spi_nor_set_pp_settings(struct spi_nor_pp_command *pp,
pp->proto = proto;
}
+/*
+ * Serial Flash Discoverable Parameters (SFDP) parsing.
+ */
+
+/**
+ * spi_nor_read_sfdp() - read Serial Flash Discoverable Parameters.
+ * @nor: pointer to a 'struct spi_nor'
+ * @addr: offset in the SFDP area to start reading data from
+ * @len: number of bytes to read
+ * @buf: buffer where the SFDP data are copied into (dma-safe memory)
+ *
+ * Whatever the actual numbers of bytes for address and dummy cycles are
+ * for (Fast) Read commands, the Read SFDP (5Ah) instruction is always
+ * followed by a 3-byte address and 8 dummy clock cycles.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spi_nor_read_sfdp(struct spi_nor *nor, u32 addr,
+ size_t len, void *buf)
+{
+ u8 addr_width, read_opcode, read_dummy;
+ int ret;
+
+ read_opcode = nor->read_opcode;
+ addr_width = nor->addr_width;
+ read_dummy = nor->read_dummy;
+
+ nor->read_opcode = SPINOR_OP_RDSFDP;
+ nor->addr_width = 3;
+ nor->read_dummy = 8;
+
+ while (len) {
+ ret = nor->read(nor, addr, len, (u8 *)buf);
+ if (!ret || ret > len) {
+ ret = -EIO;
+ goto read_err;
+ }
+ if (ret < 0)
+ goto read_err;
+
+ buf += ret;
+ addr += ret;
+ len -= ret;
+ }
+ ret = 0;
+
+read_err:
+ nor->read_opcode = read_opcode;
+ nor->addr_width = addr_width;
+ nor->read_dummy = read_dummy;
+
+ return ret;
+}
+
+/**
+ * spi_nor_read_sfdp_dma_unsafe() - read Serial Flash Discoverable Parameters.
+ * @nor: pointer to a 'struct spi_nor'
+ * @addr: offset in the SFDP area to start reading data from
+ * @len: number of bytes to read
+ * @buf: buffer where the SFDP data are copied into
+ *
+ * Wrap spi_nor_read_sfdp() using a kmalloc'ed bounce buffer as @buf is now not
+ * guaranteed to be dma-safe.
+ *
+ * Return: -ENOMEM if kmalloc() fails, the return code of spi_nor_read_sfdp()
+ * otherwise.
+ */
+static int spi_nor_read_sfdp_dma_unsafe(struct spi_nor *nor, u32 addr,
+ size_t len, void *buf)
+{
+ void *dma_safe_buf;
+ int ret;
+
+ dma_safe_buf = kmalloc(len, GFP_KERNEL);
+ if (!dma_safe_buf)
+ return -ENOMEM;
+
+ ret = spi_nor_read_sfdp(nor, addr, len, dma_safe_buf);
+ memcpy(buf, dma_safe_buf, len);
+ kfree(dma_safe_buf);
+
+ return ret;
+}
+
+struct sfdp_parameter_header {
+ u8 id_lsb;
+ u8 minor;
+ u8 major;
+ u8 length; /* in double words */
+ u8 parameter_table_pointer[3]; /* byte address */
+ u8 id_msb;
+};
+
+#define SFDP_PARAM_HEADER_ID(p) (((p)->id_msb << 8) | (p)->id_lsb)
+#define SFDP_PARAM_HEADER_PTP(p) \
+ (((p)->parameter_table_pointer[2] << 16) | \
+ ((p)->parameter_table_pointer[1] << 8) | \
+ ((p)->parameter_table_pointer[0] << 0))
+
+#define SFDP_BFPT_ID 0xff00 /* Basic Flash Parameter Table */
+#define SFDP_SECTOR_MAP_ID 0xff81 /* Sector Map Table */
+
+#define SFDP_SIGNATURE 0x50444653U
+#define SFDP_JESD216_MAJOR 1
+#define SFDP_JESD216_MINOR 0
+#define SFDP_JESD216A_MINOR 5
+#define SFDP_JESD216B_MINOR 6
+
+struct sfdp_header {
+ u32 signature; /* Ox50444653U <=> "SFDP" */
+ u8 minor;
+ u8 major;
+ u8 nph; /* 0-base number of parameter headers */
+ u8 unused;
+
+ /* Basic Flash Parameter Table. */
+ struct sfdp_parameter_header bfpt_header;
+};
+
+/* Basic Flash Parameter Table */
+
+/*
+ * JESD216 rev B defines a Basic Flash Parameter Table of 16 DWORDs.
+ * They are indexed from 1 but C arrays are indexed from 0.
+ */
+#define BFPT_DWORD(i) ((i) - 1)
+#define BFPT_DWORD_MAX 16
+
+/* The first version of JESB216 defined only 9 DWORDs. */
+#define BFPT_DWORD_MAX_JESD216 9
+
+/* 1st DWORD. */
+#define BFPT_DWORD1_FAST_READ_1_1_2 BIT(16)
+#define BFPT_DWORD1_ADDRESS_BYTES_MASK GENMASK(18, 17)
+#define BFPT_DWORD1_ADDRESS_BYTES_3_ONLY (0x0UL << 17)
+#define BFPT_DWORD1_ADDRESS_BYTES_3_OR_4 (0x1UL << 17)
+#define BFPT_DWORD1_ADDRESS_BYTES_4_ONLY (0x2UL << 17)
+#define BFPT_DWORD1_DTR BIT(19)
+#define BFPT_DWORD1_FAST_READ_1_2_2 BIT(20)
+#define BFPT_DWORD1_FAST_READ_1_4_4 BIT(21)
+#define BFPT_DWORD1_FAST_READ_1_1_4 BIT(22)
+
+/* 5th DWORD. */
+#define BFPT_DWORD5_FAST_READ_2_2_2 BIT(0)
+#define BFPT_DWORD5_FAST_READ_4_4_4 BIT(4)
+
+/* 11th DWORD. */
+#define BFPT_DWORD11_PAGE_SIZE_SHIFT 4
+#define BFPT_DWORD11_PAGE_SIZE_MASK GENMASK(7, 4)
+
+/* 15th DWORD. */
+
+/*
+ * (from JESD216 rev B)
+ * Quad Enable Requirements (QER):
+ * - 000b: Device does not have a QE bit. Device detects 1-1-4 and 1-4-4
+ * reads based on instruction. DQ3/HOLD# functions are hold during
+ * instruction phase.
+ * - 001b: QE is bit 1 of status register 2. It is set via Write Status with
+ * two data bytes where bit 1 of the second byte is one.
+ * [...]
+ * Writing only one byte to the status register has the side-effect of
+ * clearing status register 2, including the QE bit. The 100b code is
+ * used if writing one byte to the status register does not modify
+ * status register 2.
+ * - 010b: QE is bit 6 of status register 1. It is set via Write Status with
+ * one data byte where bit 6 is one.
+ * [...]
+ * - 011b: QE is bit 7 of status register 2. It is set via Write status
+ * register 2 instruction 3Eh with one data byte where bit 7 is one.
+ * [...]
+ * The status register 2 is read using instruction 3Fh.
+ * - 100b: QE is bit 1 of status register 2. It is set via Write Status with
+ * two data bytes where bit 1 of the second byte is one.
+ * [...]
+ * In contrast to the 001b code, writing one byte to the status
+ * register does not modify status register 2.
+ * - 101b: QE is bit 1 of status register 2. Status register 1 is read using
+ * Read Status instruction 05h. Status register2 is read using
+ * instruction 35h. QE is set via Writ Status instruction 01h with
+ * two data bytes where bit 1 of the second byte is one.
+ * [...]
+ */
+#define BFPT_DWORD15_QER_MASK GENMASK(22, 20)
+#define BFPT_DWORD15_QER_NONE (0x0UL << 20) /* Micron */
+#define BFPT_DWORD15_QER_SR2_BIT1_BUGGY (0x1UL << 20)
+#define BFPT_DWORD15_QER_SR1_BIT6 (0x2UL << 20) /* Macronix */
+#define BFPT_DWORD15_QER_SR2_BIT7 (0x3UL << 20)
+#define BFPT_DWORD15_QER_SR2_BIT1_NO_RD (0x4UL << 20)
+#define BFPT_DWORD15_QER_SR2_BIT1 (0x5UL << 20) /* Spansion */
+
+struct sfdp_bfpt {
+ u32 dwords[BFPT_DWORD_MAX];
+};
+
+/* Fast Read settings. */
+
+static inline void
+spi_nor_set_read_settings_from_bfpt(struct spi_nor_read_command *read,
+ u16 half,
+ enum spi_nor_protocol proto)
+{
+ read->num_mode_clocks = (half >> 5) & 0x07;
+ read->num_wait_states = (half >> 0) & 0x1f;
+ read->opcode = (half >> 8) & 0xff;
+ read->proto = proto;
+}
+
+struct sfdp_bfpt_read {
+ /* The Fast Read x-y-z hardware capability in params->hwcaps.mask. */
+ u32 hwcaps;
+
+ /*
+ * The <supported_bit> bit in <supported_dword> BFPT DWORD tells us
+ * whether the Fast Read x-y-z command is supported.
+ */
+ u32 supported_dword;
+ u32 supported_bit;
+
+ /*
+ * The half-word at offset <setting_shift> in <setting_dword> BFPT DWORD
+ * encodes the op code, the number of mode clocks and the number of wait
+ * states to be used by Fast Read x-y-z command.
+ */
+ u32 settings_dword;
+ u32 settings_shift;
+
+ /* The SPI protocol for this Fast Read x-y-z command. */
+ enum spi_nor_protocol proto;
+};
+
+static const struct sfdp_bfpt_read sfdp_bfpt_reads[] = {
+ /* Fast Read 1-1-2 */
+ {
+ SNOR_HWCAPS_READ_1_1_2,
+ BFPT_DWORD(1), BIT(16), /* Supported bit */
+ BFPT_DWORD(4), 0, /* Settings */
+ SNOR_PROTO_1_1_2,
+ },
+
+ /* Fast Read 1-2-2 */
+ {
+ SNOR_HWCAPS_READ_1_2_2,
+ BFPT_DWORD(1), BIT(20), /* Supported bit */
+ BFPT_DWORD(4), 16, /* Settings */
+ SNOR_PROTO_1_2_2,
+ },
+
+ /* Fast Read 2-2-2 */
+ {
+ SNOR_HWCAPS_READ_2_2_2,
+ BFPT_DWORD(5), BIT(0), /* Supported bit */
+ BFPT_DWORD(6), 16, /* Settings */
+ SNOR_PROTO_2_2_2,
+ },
+
+ /* Fast Read 1-1-4 */
+ {
+ SNOR_HWCAPS_READ_1_1_4,
+ BFPT_DWORD(1), BIT(22), /* Supported bit */
+ BFPT_DWORD(3), 16, /* Settings */
+ SNOR_PROTO_1_1_4,
+ },
+
+ /* Fast Read 1-4-4 */
+ {
+ SNOR_HWCAPS_READ_1_4_4,
+ BFPT_DWORD(1), BIT(21), /* Supported bit */
+ BFPT_DWORD(3), 0, /* Settings */
+ SNOR_PROTO_1_4_4,
+ },
+
+ /* Fast Read 4-4-4 */
+ {
+ SNOR_HWCAPS_READ_4_4_4,
+ BFPT_DWORD(5), BIT(4), /* Supported bit */
+ BFPT_DWORD(7), 16, /* Settings */
+ SNOR_PROTO_4_4_4,
+ },
+};
+
+struct sfdp_bfpt_erase {
+ /*
+ * The half-word at offset <shift> in DWORD <dwoard> encodes the
+ * op code and erase sector size to be used by Sector Erase commands.
+ */
+ u32 dword;
+ u32 shift;
+};
+
+static const struct sfdp_bfpt_erase sfdp_bfpt_erases[] = {
+ /* Erase Type 1 in DWORD8 bits[15:0] */
+ {BFPT_DWORD(8), 0},
+
+ /* Erase Type 2 in DWORD8 bits[31:16] */
+ {BFPT_DWORD(8), 16},
+
+ /* Erase Type 3 in DWORD9 bits[15:0] */
+ {BFPT_DWORD(9), 0},
+
+ /* Erase Type 4 in DWORD9 bits[31:16] */
+ {BFPT_DWORD(9), 16},
+};
+
+static int spi_nor_hwcaps_read2cmd(u32 hwcaps);
+
+/**
+ * spi_nor_parse_bfpt() - read and parse the Basic Flash Parameter Table.
+ * @nor: pointer to a 'struct spi_nor'
+ * @bfpt_header: pointer to the 'struct sfdp_parameter_header' describing
+ * the Basic Flash Parameter Table length and version
+ * @params: pointer to the 'struct spi_nor_flash_parameter' to be
+ * filled
+ *
+ * The Basic Flash Parameter Table is the main and only mandatory table as
+ * defined by the SFDP (JESD216) specification.
+ * It provides us with the total size (memory density) of the data array and
+ * the number of address bytes for Fast Read, Page Program and Sector Erase
+ * commands.
+ * For Fast READ commands, it also gives the number of mode clock cycles and
+ * wait states (regrouped in the number of dummy clock cycles) for each
+ * supported instruction op code.
+ * For Page Program, the page size is now available since JESD216 rev A, however
+ * the supported instruction op codes are still not provided.
+ * For Sector Erase commands, this table stores the supported instruction op
+ * codes and the associated sector sizes.
+ * Finally, the Quad Enable Requirements (QER) are also available since JESD216
+ * rev A. The QER bits encode the manufacturer dependent procedure to be
+ * executed to set the Quad Enable (QE) bit in some internal register of the
+ * Quad SPI memory. Indeed the QE bit, when it exists, must be set before
+ * sending any Quad SPI command to the memory. Actually, setting the QE bit
+ * tells the memory to reassign its WP# and HOLD#/RESET# pins to functions IO2
+ * and IO3 hence enabling 4 (Quad) I/O lines.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spi_nor_parse_bfpt(struct spi_nor *nor,
+ const struct sfdp_parameter_header *bfpt_header,
+ struct spi_nor_flash_parameter *params)
+{
+ struct mtd_info *mtd = &nor->mtd;
+ struct sfdp_bfpt bfpt;
+ size_t len;
+ int i, cmd, err;
+ u32 addr;
+ u16 half;
+
+ /* JESD216 Basic Flash Parameter Table length is at least 9 DWORDs. */
+ if (bfpt_header->length < BFPT_DWORD_MAX_JESD216)
+ return -EINVAL;
+
+ /* Read the Basic Flash Parameter Table. */
+ len = min_t(size_t, sizeof(bfpt),
+ bfpt_header->length * sizeof(u32));
+ addr = SFDP_PARAM_HEADER_PTP(bfpt_header);
+ memset(&bfpt, 0, sizeof(bfpt));
+ err = spi_nor_read_sfdp_dma_unsafe(nor, addr, len, &bfpt);
+ if (err < 0)
+ return err;
+
+ /* Fix endianness of the BFPT DWORDs. */
+ for (i = 0; i < BFPT_DWORD_MAX; i++)
+ bfpt.dwords[i] = le32_to_cpu(bfpt.dwords[i]);
+
+ /* Number of address bytes. */
+ switch (bfpt.dwords[BFPT_DWORD(1)] & BFPT_DWORD1_ADDRESS_BYTES_MASK) {
+ case BFPT_DWORD1_ADDRESS_BYTES_3_ONLY:
+ nor->addr_width = 3;
+ break;
+
+ case BFPT_DWORD1_ADDRESS_BYTES_4_ONLY:
+ nor->addr_width = 4;
+ break;
+
+ default:
+ break;
+ }
+
+ /* Flash Memory Density (in bits). */
+ params->size = bfpt.dwords[BFPT_DWORD(2)];
+ if (params->size & BIT(31)) {
+ params->size &= ~BIT(31);
+
+ /*
+ * Prevent overflows on params->size. Anyway, a NOR of 2^64
+ * bits is unlikely to exist so this error probably means
+ * the BFPT we are reading is corrupted/wrong.
+ */
+ if (params->size > 63)
+ return -EINVAL;
+
+ params->size = 1ULL << params->size;
+ } else {
+ params->size++;
+ }
+ params->size >>= 3; /* Convert to bytes. */
+
+ /* Fast Read settings. */
+ for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_reads); i++) {
+ const struct sfdp_bfpt_read *rd = &sfdp_bfpt_reads[i];
+ struct spi_nor_read_command *read;
+
+ if (!(bfpt.dwords[rd->supported_dword] & rd->supported_bit)) {
+ params->hwcaps.mask &= ~rd->hwcaps;
+ continue;
+ }
+
+ params->hwcaps.mask |= rd->hwcaps;
+ cmd = spi_nor_hwcaps_read2cmd(rd->hwcaps);
+ read = &params->reads[cmd];
+ half = bfpt.dwords[rd->settings_dword] >> rd->settings_shift;
+ spi_nor_set_read_settings_from_bfpt(read, half, rd->proto);
+ }
+
+ /* Sector Erase settings. */
+ for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_erases); i++) {
+ const struct sfdp_bfpt_erase *er = &sfdp_bfpt_erases[i];
+ u32 erasesize;
+ u8 opcode;
+
+ half = bfpt.dwords[er->dword] >> er->shift;
+ erasesize = half & 0xff;
+
+ /* erasesize == 0 means this Erase Type is not supported. */
+ if (!erasesize)
+ continue;
+
+ erasesize = 1U << erasesize;
+ opcode = (half >> 8) & 0xff;
+#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
+ if (erasesize == SZ_4K) {
+ nor->erase_opcode = opcode;
+ mtd->erasesize = erasesize;
+ break;
+ }
+#endif
+ if (!mtd->erasesize || mtd->erasesize < erasesize) {
+ nor->erase_opcode = opcode;
+ mtd->erasesize = erasesize;
+ }
+ }
+
+ /* Stop here if not JESD216 rev A or later. */
+ if (bfpt_header->length < BFPT_DWORD_MAX)
+ return 0;
+
+ /* Page size: this field specifies 'N' so the page size = 2^N bytes. */
+ params->page_size = bfpt.dwords[BFPT_DWORD(11)];
+ params->page_size &= BFPT_DWORD11_PAGE_SIZE_MASK;
+ params->page_size >>= BFPT_DWORD11_PAGE_SIZE_SHIFT;
+ params->page_size = 1U << params->page_size;
+
+ /* Quad Enable Requirements. */
+ switch (bfpt.dwords[BFPT_DWORD(15)] & BFPT_DWORD15_QER_MASK) {
+ case BFPT_DWORD15_QER_NONE:
+ params->quad_enable = NULL;
+ break;
+
+ case BFPT_DWORD15_QER_SR2_BIT1_BUGGY:
+ case BFPT_DWORD15_QER_SR2_BIT1_NO_RD:
+ params->quad_enable = spansion_no_read_cr_quad_enable;
+ break;
+
+ case BFPT_DWORD15_QER_SR1_BIT6:
+ params->quad_enable = macronix_quad_enable;
+ break;
+
+ case BFPT_DWORD15_QER_SR2_BIT7:
+ params->quad_enable = sr2_bit7_quad_enable;
+ break;
+
+ case BFPT_DWORD15_QER_SR2_BIT1:
+ params->quad_enable = spansion_read_cr_quad_enable;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/**
+ * spi_nor_parse_sfdp() - parse the Serial Flash Discoverable Parameters.
+ * @nor: pointer to a 'struct spi_nor'
+ * @params: pointer to the 'struct spi_nor_flash_parameter' to be
+ * filled
+ *
+ * The Serial Flash Discoverable Parameters are described by the JEDEC JESD216
+ * specification. This is a standard which tends to supported by almost all
+ * (Q)SPI memory manufacturers. Those hard-coded tables allow us to learn at
+ * runtime the main parameters needed to perform basic SPI flash operations such
+ * as Fast Read, Page Program or Sector Erase commands.
+ *
+ * Return: 0 on success, -errno otherwise.
+ */
+static int spi_nor_parse_sfdp(struct spi_nor *nor,
+ struct spi_nor_flash_parameter *params)
+{
+ const struct sfdp_parameter_header *param_header, *bfpt_header;
+ struct sfdp_parameter_header *param_headers = NULL;
+ struct sfdp_header header;
+ struct device *dev = nor->dev;
+ size_t psize;
+ int i, err;
+
+ /* Get the SFDP header. */
+ err = spi_nor_read_sfdp_dma_unsafe(nor, 0, sizeof(header), &header);
+ if (err < 0)
+ return err;
+
+ /* Check the SFDP header version. */
+ if (le32_to_cpu(header.signature) != SFDP_SIGNATURE ||
+ header.major != SFDP_JESD216_MAJOR ||
+ header.minor < SFDP_JESD216_MINOR)
+ return -EINVAL;
+
+ /*
+ * Verify that the first and only mandatory parameter header is a
+ * Basic Flash Parameter Table header as specified in JESD216.
+ */
+ bfpt_header = &header.bfpt_header;
+ if (SFDP_PARAM_HEADER_ID(bfpt_header) != SFDP_BFPT_ID ||
+ bfpt_header->major != SFDP_JESD216_MAJOR)
+ return -EINVAL;
+
+ /*
+ * Allocate memory then read all parameter headers with a single
+ * Read SFDP command. These parameter headers will actually be parsed
+ * twice: a first time to get the latest revision of the basic flash
+ * parameter table, then a second time to handle the supported optional
+ * tables.
+ * Hence we read the parameter headers once for all to reduce the
+ * processing time. Also we use kmalloc() instead of devm_kmalloc()
+ * because we don't need to keep these parameter headers: the allocated
+ * memory is always released with kfree() before exiting this function.
+ */
+ if (header.nph) {
+ psize = header.nph * sizeof(*param_headers);
+
+ param_headers = kmalloc(psize, GFP_KERNEL);
+ if (!param_headers)
+ return -ENOMEM;
+
+ err = spi_nor_read_sfdp(nor, sizeof(header),
+ psize, param_headers);
+ if (err < 0) {
+ dev_err(dev, "failed to read SFDP parameter headers\n");
+ goto exit;
+ }
+ }
+
+ /*
+ * Check other parameter headers to get the latest revision of
+ * the basic flash parameter table.
+ */
+ for (i = 0; i < header.nph; i++) {
+ param_header = &param_headers[i];
+
+ if (SFDP_PARAM_HEADER_ID(param_header) == SFDP_BFPT_ID &&
+ param_header->major == SFDP_JESD216_MAJOR &&
+ (param_header->minor > bfpt_header->minor ||
+ (param_header->minor == bfpt_header->minor &&
+ param_header->length > bfpt_header->length)))
+ bfpt_header = param_header;
+ }
+
+ err = spi_nor_parse_bfpt(nor, bfpt_header, params);
+ if (err)
+ goto exit;
+
+ /* Parse other parameter headers. */
+ for (i = 0; i < header.nph; i++) {
+ param_header = &param_headers[i];
+
+ switch (SFDP_PARAM_HEADER_ID(param_header)) {
+ case SFDP_SECTOR_MAP_ID:
+ dev_info(dev, "non-uniform erase sector maps are not supported yet.\n");
+ break;
+
+ default:
+ break;
+ }
+
+ if (err)
+ goto exit;
+ }
+
+exit:
+ kfree(param_headers);
+ return err;
+}
+
static int spi_nor_init_params(struct spi_nor *nor,
const struct flash_info *info,
struct spi_nor_flash_parameter *params)
@@ -1646,11 +2423,28 @@ static int spi_nor_init_params(struct spi_nor *nor,
break;
default:
+ /* Kept only for backward compatibility purpose. */
params->quad_enable = spansion_quad_enable;
break;
}
}
+ /* Override the parameters with data read from SFDP tables. */
+ nor->addr_width = 0;
+ nor->mtd.erasesize = 0;
+ if ((info->flags & (SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)) &&
+ !(info->flags & SPI_NOR_SKIP_SFDP)) {
+ struct spi_nor_flash_parameter sfdp_params;
+
+ memcpy(&sfdp_params, params, sizeof(sfdp_params));
+ if (spi_nor_parse_sfdp(nor, &sfdp_params)) {
+ nor->addr_width = 0;
+ nor->mtd.erasesize = 0;
+ } else {
+ memcpy(params, &sfdp_params, sizeof(*params));
+ }
+ }
+
return 0;
}
@@ -1762,6 +2556,10 @@ static int spi_nor_select_erase(struct spi_nor *nor,
{
struct mtd_info *mtd = &nor->mtd;
+ /* Do nothing if already configured from SFDP. */
+ if (mtd->erasesize)
+ return 0;
+
#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
/* prefer "small sector" erase if possible */
if (info->flags & SECT_4K) {
@@ -1960,6 +2758,8 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
nor->flags |= SNOR_F_HAS_SR_TB;
if (info->flags & NO_CHIP_ERASE)
nor->flags |= SNOR_F_NO_OP_CHIP_ERASE;
+ if (info->flags & USE_CLSR)
+ nor->flags |= SNOR_F_USE_CLSR;
if (info->flags & SPI_NOR_NO_ERASE)
mtd->flags |= MTD_NO_ERASE;
@@ -1994,9 +2794,11 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
if (ret)
return ret;
- if (info->addr_width)
+ if (nor->addr_width) {
+ /* already configured from SFDP */
+ } else if (info->addr_width) {
nor->addr_width = info->addr_width;
- else if (mtd->size > 0x1000000) {
+ } else if (mtd->size > 0x1000000) {
/* enable 4-byte addressing if the device exceeds 16MiB */
nor->addr_width = 4;
if (JEDEC_MFR(info) == SNOR_MFR_SPANSION ||
diff --git a/drivers/mtd/ssfdc.c b/drivers/mtd/ssfdc.c
index 41b13d1cdcc4..95f0bf95f095 100644
--- a/drivers/mtd/ssfdc.c
+++ b/drivers/mtd/ssfdc.c
@@ -16,7 +16,7 @@
#include <linux/slab.h>
#include <linux/hdreg.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/blktrans.h>
struct ssfdcr_record {
diff --git a/drivers/mtd/tests/nandbiterrs.c b/drivers/mtd/tests/nandbiterrs.c
index f26dec896afa..5f03b8c885a9 100644
--- a/drivers/mtd/tests/nandbiterrs.c
+++ b/drivers/mtd/tests/nandbiterrs.c
@@ -47,7 +47,7 @@
#include <linux/moduleparam.h>
#include <linux/mtd/mtd.h>
#include <linux/err.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/slab.h>
#include "mtd_test.h"
diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index c3963f880448..b210fdb31c98 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -383,7 +383,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
/* Initialize the gendisk of this ubiblock device */
gd = alloc_disk(1);
if (!gd) {
- pr_err("UBI: block: alloc_disk failed");
+ pr_err("UBI: block: alloc_disk failed\n");
ret = -ENODEV;
goto out_free_dev;
}
@@ -607,7 +607,7 @@ static void __init ubiblock_create_from_param(void)
desc = open_volume_desc(p->name, p->ubi_num, p->vol_id);
if (IS_ERR(desc)) {
pr_err(
- "UBI: block: can't open volume on ubi%d_%d, err=%ld",
+ "UBI: block: can't open volume on ubi%d_%d, err=%ld\n",
p->ubi_num, p->vol_id, PTR_ERR(desc));
continue;
}
@@ -618,7 +618,7 @@ static void __init ubiblock_create_from_param(void)
ret = ubiblock_create(&vi);
if (ret) {
pr_err(
- "UBI: block: can't add '%s' volume on ubi%d_%d, err=%d",
+ "UBI: block: can't add '%s' volume on ubi%d_%d, err=%d\n",
vi.name, p->ubi_num, p->vol_id, ret);
continue;
}
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index d854521962ef..842550b5712a 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -825,7 +825,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
for (i = 0; i < UBI_MAX_DEVICES; i++) {
ubi = ubi_devices[i];
if (ubi && mtd->index == ubi->mtd->index) {
- pr_err("ubi: mtd%d is already attached to ubi%d",
+ pr_err("ubi: mtd%d is already attached to ubi%d\n",
mtd->index, i);
return -EEXIST;
}
@@ -840,7 +840,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
* no sense to attach emulated MTD devices, so we prohibit this.
*/
if (mtd->type == MTD_UBIVOLUME) {
- pr_err("ubi: refuse attaching mtd%d - it is already emulated on top of UBI",
+ pr_err("ubi: refuse attaching mtd%d - it is already emulated on top of UBI\n",
mtd->index);
return -EINVAL;
}
@@ -851,7 +851,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
if (!ubi_devices[ubi_num])
break;
if (ubi_num == UBI_MAX_DEVICES) {
- pr_err("ubi: only %d UBI devices may be created",
+ pr_err("ubi: only %d UBI devices may be created\n",
UBI_MAX_DEVICES);
return -ENFILE;
}
@@ -861,7 +861,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
/* Make sure ubi_num is not busy */
if (ubi_devices[ubi_num]) {
- pr_err("ubi: ubi%i already exists", ubi_num);
+ pr_err("ubi: ubi%i already exists\n", ubi_num);
return -EEXIST;
}
}
@@ -1166,7 +1166,7 @@ static int __init ubi_init(void)
BUILD_BUG_ON(sizeof(struct ubi_vid_hdr) != 64);
if (mtd_devs > UBI_MAX_DEVICES) {
- pr_err("UBI error: too many MTD devices, maximum is %d",
+ pr_err("UBI error: too many MTD devices, maximum is %d\n",
UBI_MAX_DEVICES);
return -EINVAL;
}
@@ -1178,7 +1178,7 @@ static int __init ubi_init(void)
err = misc_register(&ubi_ctrl_cdev);
if (err) {
- pr_err("UBI error: cannot register device");
+ pr_err("UBI error: cannot register device\n");
goto out;
}
@@ -1205,7 +1205,7 @@ static int __init ubi_init(void)
mtd = open_mtd_device(p->name);
if (IS_ERR(mtd)) {
err = PTR_ERR(mtd);
- pr_err("UBI error: cannot open mtd %s, error %d",
+ pr_err("UBI error: cannot open mtd %s, error %d\n",
p->name, err);
/* See comment below re-ubi_is_module(). */
if (ubi_is_module())
@@ -1218,7 +1218,7 @@ static int __init ubi_init(void)
p->vid_hdr_offs, p->max_beb_per1024);
mutex_unlock(&ubi_devices_mutex);
if (err < 0) {
- pr_err("UBI error: cannot attach mtd%d",
+ pr_err("UBI error: cannot attach mtd%d\n",
mtd->index);
put_mtd_device(mtd);
@@ -1242,7 +1242,7 @@ static int __init ubi_init(void)
err = ubiblock_init();
if (err) {
- pr_err("UBI error: block: cannot initialize, error %d", err);
+ pr_err("UBI error: block: cannot initialize, error %d\n", err);
/* See comment above re-ubi_is_module(). */
if (ubi_is_module())
@@ -1265,7 +1265,7 @@ out_dev_unreg:
misc_deregister(&ubi_ctrl_cdev);
out:
class_unregister(&ubi_class);
- pr_err("UBI error: cannot initialize UBI, error %d", err);
+ pr_err("UBI error: cannot initialize UBI, error %d\n", err);
return err;
}
late_initcall(ubi_init);
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c
index b44c8d348e78..5a832bc79b1b 100644
--- a/drivers/mtd/ubi/fastmap.c
+++ b/drivers/mtd/ubi/fastmap.c
@@ -1667,7 +1667,7 @@ err:
ret = invalidate_fastmap(ubi);
if (ret < 0) {
- ubi_err(ubi, "Unable to invalidiate current fastmap!");
+ ubi_err(ubi, "Unable to invalidate current fastmap!");
ubi_ro_mode(ubi);
} else {
return_fm_pebs(ubi, old_fm);
diff --git a/drivers/mtd/ubi/ubi-media.h b/drivers/mtd/ubi/ubi-media.h
index 22ed3f627506..bfceae5a890e 100644
--- a/drivers/mtd/ubi/ubi-media.h
+++ b/drivers/mtd/ubi/ubi-media.h
@@ -229,7 +229,7 @@ struct ubi_ec_hdr {
* copy. UBI also calculates data CRC when the data is moved and stores it at
* the @data_crc field of the copy (P1). So when UBI needs to pick one physical
* eraseblock of two (P or P1), the @copy_flag of the newer one (P1) is
- * examined. If it is cleared, the situation* is simple and the newer one is
+ * examined. If it is cleared, the situation is simple and the newer one is
* picked. If it is set, the data CRC of the copy (P1) is examined. If the CRC
* checksum is correct, this physical eraseblock is selected (P1). Otherwise
* the older one (P) is selected.
@@ -389,7 +389,7 @@ struct ubi_vtbl_record {
#define UBI_FM_POOL_MAGIC 0x67AF4D08
#define UBI_FM_EBA_MAGIC 0xf0c040a8
-/* A fastmap supber block can be located between PEB 0 and
+/* A fastmap super block can be located between PEB 0 and
* UBI_FM_MAX_START */
#define UBI_FM_MAX_START 64
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index fc63992ab0e0..c99dc59d729b 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -4289,7 +4289,7 @@ static int bond_check_params(struct bond_params *params)
int bond_mode = BOND_MODE_ROUNDROBIN;
int xmit_hashtype = BOND_XMIT_POLICY_LAYER2;
int lacp_fast = 0;
- int tlb_dynamic_lb = 0;
+ int tlb_dynamic_lb;
/* Convert string parameters. */
if (mode) {
@@ -4601,16 +4601,13 @@ static int bond_check_params(struct bond_params *params)
}
ad_user_port_key = valptr->value;
- if ((bond_mode == BOND_MODE_TLB) || (bond_mode == BOND_MODE_ALB)) {
- bond_opt_initstr(&newval, "default");
- valptr = bond_opt_parse(bond_opt_get(BOND_OPT_TLB_DYNAMIC_LB),
- &newval);
- if (!valptr) {
- pr_err("Error: No tlb_dynamic_lb default value");
- return -EINVAL;
- }
- tlb_dynamic_lb = valptr->value;
+ bond_opt_initstr(&newval, "default");
+ valptr = bond_opt_parse(bond_opt_get(BOND_OPT_TLB_DYNAMIC_LB), &newval);
+ if (!valptr) {
+ pr_err("Error: No tlb_dynamic_lb default value");
+ return -EINVAL;
}
+ tlb_dynamic_lb = valptr->value;
if (lp_interval == 0) {
pr_warn("Warning: ip_interval must be between 1 and %d, so it was reset to %d\n",
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index a12d603d41c6..5931aa2fe997 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -754,6 +754,9 @@ static int bond_option_mode_set(struct bonding *bond,
bond->params.miimon);
}
+ if (newval->value == BOND_MODE_ALB)
+ bond->params.tlb_dynamic_lb = 1;
+
/* don't cache arp_validate between modes */
bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
bond->params.mode = newval->value;
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index c6678aa9b4ef..d74c7335c512 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -1100,6 +1100,10 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
};
int i, err;
+ /* DSA and CPU ports have to be members of multiple vlans */
+ if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
+ return 0;
+
if (!vid_begin)
return -EOPNOTSUPP;
@@ -3947,7 +3951,9 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)
if (chip->irq > 0) {
if (chip->info->g2_irqs > 0)
mv88e6xxx_g2_irq_free(chip);
+ mutex_lock(&chip->reg_lock);
mv88e6xxx_g1_irq_free(chip);
+ mutex_unlock(&chip->reg_lock);
}
}
diff --git a/drivers/net/ethernet/amd/au1000_eth.c b/drivers/net/ethernet/amd/au1000_eth.c
index a3c90fe5de00..73ca8879ada7 100644
--- a/drivers/net/ethernet/amd/au1000_eth.c
+++ b/drivers/net/ethernet/amd/au1000_eth.c
@@ -1180,9 +1180,10 @@ static int au1000_probe(struct platform_device *pdev)
/* Allocate the data buffers
* Snooping works fine with eth on all au1xxx
*/
- aup->vaddr = (u32)dma_alloc_noncoherent(NULL, MAX_BUF_SIZE *
- (NUM_TX_BUFFS + NUM_RX_BUFFS),
- &aup->dma_addr, 0);
+ aup->vaddr = (u32)dma_alloc_attrs(NULL, MAX_BUF_SIZE *
+ (NUM_TX_BUFFS + NUM_RX_BUFFS),
+ &aup->dma_addr, 0,
+ DMA_ATTR_NON_CONSISTENT);
if (!aup->vaddr) {
dev_err(&pdev->dev, "failed to allocate data buffers\n");
err = -ENOMEM;
@@ -1361,8 +1362,9 @@ err_remap3:
err_remap2:
iounmap(aup->mac);
err_remap1:
- dma_free_noncoherent(NULL, MAX_BUF_SIZE * (NUM_TX_BUFFS + NUM_RX_BUFFS),
- (void *)aup->vaddr, aup->dma_addr);
+ dma_free_attrs(NULL, MAX_BUF_SIZE * (NUM_TX_BUFFS + NUM_RX_BUFFS),
+ (void *)aup->vaddr, aup->dma_addr,
+ DMA_ATTR_NON_CONSISTENT);
err_vaddr:
free_netdev(dev);
err_alloc:
@@ -1394,9 +1396,9 @@ static int au1000_remove(struct platform_device *pdev)
if (aup->tx_db_inuse[i])
au1000_ReleaseDB(aup, aup->tx_db_inuse[i]);
- dma_free_noncoherent(NULL, MAX_BUF_SIZE *
- (NUM_TX_BUFFS + NUM_RX_BUFFS),
- (void *)aup->vaddr, aup->dma_addr);
+ dma_free_attrs(NULL, MAX_BUF_SIZE * (NUM_TX_BUFFS + NUM_RX_BUFFS),
+ (void *)aup->vaddr, aup->dma_addr,
+ DMA_ATTR_NON_CONSISTENT);
iounmap(aup->macdma);
iounmap(aup->mac);
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
index 214986436ece..0fdaaa643073 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
@@ -51,6 +51,10 @@
#define AQ_CFG_SKB_FRAGS_MAX 32U
+/* Number of descriptors available in one ring to resume this ring queue
+ */
+#define AQ_CFG_RESTART_DESC_THRES (AQ_CFG_SKB_FRAGS_MAX * 2)
+
#define AQ_CFG_NAPI_WEIGHT 64U
#define AQ_CFG_MULTICAST_ADDRESS_MAX 32U
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 6ac9e2602d6d..0a5bb4114eb4 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -119,6 +119,35 @@ int aq_nic_cfg_start(struct aq_nic_s *self)
return 0;
}
+static int aq_nic_update_link_status(struct aq_nic_s *self)
+{
+ int err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);
+
+ if (err)
+ return err;
+
+ if (self->link_status.mbps != self->aq_hw->aq_link_status.mbps)
+ pr_info("%s: link change old %d new %d\n",
+ AQ_CFG_DRV_NAME, self->link_status.mbps,
+ self->aq_hw->aq_link_status.mbps);
+
+ self->link_status = self->aq_hw->aq_link_status;
+ if (!netif_carrier_ok(self->ndev) && self->link_status.mbps) {
+ aq_utils_obj_set(&self->header.flags,
+ AQ_NIC_FLAG_STARTED);
+ aq_utils_obj_clear(&self->header.flags,
+ AQ_NIC_LINK_DOWN);
+ netif_carrier_on(self->ndev);
+ netif_tx_wake_all_queues(self->ndev);
+ }
+ if (netif_carrier_ok(self->ndev) && !self->link_status.mbps) {
+ netif_carrier_off(self->ndev);
+ netif_tx_disable(self->ndev);
+ aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);
+ }
+ return 0;
+}
+
static void aq_nic_service_timer_cb(unsigned long param)
{
struct aq_nic_s *self = (struct aq_nic_s *)param;
@@ -131,26 +160,13 @@ static void aq_nic_service_timer_cb(unsigned long param)
if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))
goto err_exit;
- err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);
- if (err < 0)
+ err = aq_nic_update_link_status(self);
+ if (err)
goto err_exit;
- self->link_status = self->aq_hw->aq_link_status;
-
self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,
self->aq_nic_cfg.is_interrupt_moderation);
- if (self->link_status.mbps) {
- aq_utils_obj_set(&self->header.flags,
- AQ_NIC_FLAG_STARTED);
- aq_utils_obj_clear(&self->header.flags,
- AQ_NIC_LINK_DOWN);
- netif_carrier_on(self->ndev);
- } else {
- netif_carrier_off(self->ndev);
- aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);
- }
-
memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));
memset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));
for (i = AQ_DIMOF(self->aq_vec); i--;) {
@@ -214,7 +230,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
SET_NETDEV_DEV(ndev, dev);
ndev->if_port = port;
- ndev->min_mtu = ETH_MIN_MTU;
self->ndev = ndev;
self->aq_pci_func = aq_pci_func;
@@ -241,7 +256,6 @@ err_exit:
int aq_nic_ndev_register(struct aq_nic_s *self)
{
int err = 0;
- unsigned int i = 0U;
if (!self->ndev) {
err = -EINVAL;
@@ -263,8 +277,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)
netif_carrier_off(self->ndev);
- for (i = AQ_CFG_VECS_MAX; i--;)
- aq_nic_ndev_queue_stop(self, i);
+ netif_tx_disable(self->ndev);
err = register_netdev(self->ndev);
if (err < 0)
@@ -283,6 +296,7 @@ int aq_nic_ndev_init(struct aq_nic_s *self)
self->ndev->features = aq_hw_caps->hw_features;
self->ndev->priv_flags = aq_hw_caps->hw_priv_flags;
self->ndev->mtu = aq_nic_cfg->mtu - ETH_HLEN;
+ self->ndev->max_mtu = self->aq_hw_caps.mtu - ETH_FCS_LEN - ETH_HLEN;
return 0;
}
@@ -318,12 +332,8 @@ struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)
err = -EINVAL;
goto err_exit;
}
- if (netif_running(ndev)) {
- unsigned int i;
-
- for (i = AQ_CFG_VECS_MAX; i--;)
- netif_stop_subqueue(ndev, i);
- }
+ if (netif_running(ndev))
+ netif_tx_disable(ndev);
for (self->aq_vecs = 0; self->aq_vecs < self->aq_nic_cfg.vecs;
self->aq_vecs++) {
@@ -383,16 +393,6 @@ err_exit:
return err;
}
-void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx)
-{
- netif_start_subqueue(self->ndev, idx);
-}
-
-void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx)
-{
- netif_stop_subqueue(self->ndev, idx);
-}
-
int aq_nic_start(struct aq_nic_s *self)
{
struct aq_vec_s *aq_vec = NULL;
@@ -451,10 +451,6 @@ int aq_nic_start(struct aq_nic_s *self)
goto err_exit;
}
- for (i = 0U, aq_vec = self->aq_vec[0];
- self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
- aq_nic_ndev_queue_start(self, i);
-
err = netif_set_real_num_tx_queues(self->ndev, self->aq_vecs);
if (err < 0)
goto err_exit;
@@ -463,6 +459,8 @@ int aq_nic_start(struct aq_nic_s *self)
if (err < 0)
goto err_exit;
+ netif_tx_start_all_queues(self->ndev);
+
err_exit:
return err;
}
@@ -475,6 +473,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
unsigned int frag_count = 0U;
unsigned int dx = ring->sw_tail;
+ struct aq_ring_buff_s *first = NULL;
struct aq_ring_buff_s *dx_buff = &ring->buff_ring[dx];
if (unlikely(skb_is_gso(skb))) {
@@ -485,6 +484,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
dx_buff->len_l4 = tcp_hdrlen(skb);
dx_buff->mss = skb_shinfo(skb)->gso_size;
dx_buff->is_txc = 1U;
+ dx_buff->eop_index = 0xffffU;
dx_buff->is_ipv6 =
(ip_hdr(skb)->version == 6) ? 1U : 0U;
@@ -504,6 +504,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa)))
goto exit;
+ first = dx_buff;
dx_buff->len_pkt = skb->len;
dx_buff->is_sop = 1U;
dx_buff->is_mapped = 1U;
@@ -532,40 +533,46 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
for (; nr_frags--; ++frag_count) {
unsigned int frag_len = 0U;
+ unsigned int buff_offset = 0U;
+ unsigned int buff_size = 0U;
dma_addr_t frag_pa;
skb_frag_t *frag = &skb_shinfo(skb)->frags[frag_count];
frag_len = skb_frag_size(frag);
- frag_pa = skb_frag_dma_map(aq_nic_get_dev(self), frag, 0,
- frag_len, DMA_TO_DEVICE);
- if (unlikely(dma_mapping_error(aq_nic_get_dev(self), frag_pa)))
- goto mapping_error;
+ while (frag_len) {
+ if (frag_len > AQ_CFG_TX_FRAME_MAX)
+ buff_size = AQ_CFG_TX_FRAME_MAX;
+ else
+ buff_size = frag_len;
+
+ frag_pa = skb_frag_dma_map(aq_nic_get_dev(self),
+ frag,
+ buff_offset,
+ buff_size,
+ DMA_TO_DEVICE);
+
+ if (unlikely(dma_mapping_error(aq_nic_get_dev(self),
+ frag_pa)))
+ goto mapping_error;
- while (frag_len > AQ_CFG_TX_FRAME_MAX) {
dx = aq_ring_next_dx(ring, dx);
dx_buff = &ring->buff_ring[dx];
dx_buff->flags = 0U;
- dx_buff->len = AQ_CFG_TX_FRAME_MAX;
+ dx_buff->len = buff_size;
dx_buff->pa = frag_pa;
dx_buff->is_mapped = 1U;
+ dx_buff->eop_index = 0xffffU;
+
+ frag_len -= buff_size;
+ buff_offset += buff_size;
- frag_len -= AQ_CFG_TX_FRAME_MAX;
- frag_pa += AQ_CFG_TX_FRAME_MAX;
++ret;
}
-
- dx = aq_ring_next_dx(ring, dx);
- dx_buff = &ring->buff_ring[dx];
-
- dx_buff->flags = 0U;
- dx_buff->len = frag_len;
- dx_buff->pa = frag_pa;
- dx_buff->is_mapped = 1U;
- ++ret;
}
+ first->eop_index = dx;
dx_buff->is_eop = 1U;
dx_buff->skb = skb;
goto exit;
@@ -602,7 +609,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
unsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs;
unsigned int tc = 0U;
int err = NETDEV_TX_OK;
- bool is_nic_in_bad_state;
frags = skb_shinfo(skb)->nr_frags + 1;
@@ -613,13 +619,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
goto err_exit;
}
- is_nic_in_bad_state = aq_utils_obj_test(&self->header.flags,
- AQ_NIC_FLAGS_IS_NOT_TX_READY) ||
- (aq_ring_avail_dx(ring) <
- AQ_CFG_SKB_FRAGS_MAX);
+ aq_ring_update_queue_state(ring);
- if (is_nic_in_bad_state) {
- aq_nic_ndev_queue_stop(self, ring->idx);
+ /* Above status update may stop the queue. Check this. */
+ if (__netif_subqueue_stopped(self->ndev, ring->idx)) {
err = NETDEV_TX_BUSY;
goto err_exit;
}
@@ -631,9 +634,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
ring,
frags);
if (err >= 0) {
- if (aq_ring_avail_dx(ring) < AQ_CFG_SKB_FRAGS_MAX + 1)
- aq_nic_ndev_queue_stop(self, ring->idx);
-
++ring->stats.tx.packets;
ring->stats.tx.bytes += skb->len;
}
@@ -693,16 +693,9 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
{
- int err = 0;
-
- if (new_mtu > self->aq_hw_caps.mtu) {
- err = -EINVAL;
- goto err_exit;
- }
self->aq_nic_cfg.mtu = new_mtu;
-err_exit:
- return err;
+ return 0;
}
int aq_nic_set_mac(struct aq_nic_s *self, struct net_device *ndev)
@@ -905,9 +898,7 @@ int aq_nic_stop(struct aq_nic_s *self)
struct aq_vec_s *aq_vec = NULL;
unsigned int i = 0U;
- for (i = 0U, aq_vec = self->aq_vec[0];
- self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
- aq_nic_ndev_queue_stop(self, i);
+ netif_tx_disable(self->ndev);
del_timer_sync(&self->service_timer);
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
index 7fc2a5ecb2b7..0ddd556ff901 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
@@ -83,8 +83,6 @@ struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);
int aq_nic_init(struct aq_nic_s *self);
int aq_nic_cfg_start(struct aq_nic_s *self);
int aq_nic_ndev_register(struct aq_nic_s *self);
-void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx);
-void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx);
void aq_nic_ndev_free(struct aq_nic_s *self);
int aq_nic_start(struct aq_nic_s *self);
int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb);
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
index 4eee1996a825..0654e0c76bc2 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -104,6 +104,38 @@ int aq_ring_init(struct aq_ring_s *self)
return 0;
}
+static inline bool aq_ring_dx_in_range(unsigned int h, unsigned int i,
+ unsigned int t)
+{
+ return (h < t) ? ((h < i) && (i < t)) : ((h < i) || (i < t));
+}
+
+void aq_ring_update_queue_state(struct aq_ring_s *ring)
+{
+ if (aq_ring_avail_dx(ring) <= AQ_CFG_SKB_FRAGS_MAX)
+ aq_ring_queue_stop(ring);
+ else if (aq_ring_avail_dx(ring) > AQ_CFG_RESTART_DESC_THRES)
+ aq_ring_queue_wake(ring);
+}
+
+void aq_ring_queue_wake(struct aq_ring_s *ring)
+{
+ struct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);
+
+ if (__netif_subqueue_stopped(ndev, ring->idx)) {
+ netif_wake_subqueue(ndev, ring->idx);
+ ring->stats.tx.queue_restarts++;
+ }
+}
+
+void aq_ring_queue_stop(struct aq_ring_s *ring)
+{
+ struct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);
+
+ if (!__netif_subqueue_stopped(ndev, ring->idx))
+ netif_stop_subqueue(ndev, ring->idx);
+}
+
void aq_ring_tx_clean(struct aq_ring_s *self)
{
struct device *dev = aq_nic_get_dev(self->aq_nic);
@@ -113,23 +145,28 @@ void aq_ring_tx_clean(struct aq_ring_s *self)
struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
if (likely(buff->is_mapped)) {
- if (unlikely(buff->is_sop))
+ if (unlikely(buff->is_sop)) {
+ if (!buff->is_eop &&
+ buff->eop_index != 0xffffU &&
+ (!aq_ring_dx_in_range(self->sw_head,
+ buff->eop_index,
+ self->hw_head)))
+ break;
+
dma_unmap_single(dev, buff->pa, buff->len,
DMA_TO_DEVICE);
- else
+ } else {
dma_unmap_page(dev, buff->pa, buff->len,
DMA_TO_DEVICE);
+ }
}
if (unlikely(buff->is_eop))
dev_kfree_skb_any(buff->skb);
- }
-}
-static inline unsigned int aq_ring_dx_in_range(unsigned int h, unsigned int i,
- unsigned int t)
-{
- return (h < t) ? ((h < i) && (i < t)) : ((h < i) || (i < t));
+ buff->pa = 0U;
+ buff->eop_index = 0xffffU;
+ }
}
#define AQ_SKB_ALIGN SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
index 782176c5f4f8..5844078764bd 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
@@ -65,7 +65,7 @@ struct __packed aq_ring_buff_s {
};
union {
struct {
- u32 len:16;
+ u16 len;
u32 is_ip_cso:1;
u32 is_udp_cso:1;
u32 is_tcp_cso:1;
@@ -77,8 +77,10 @@ struct __packed aq_ring_buff_s {
u32 is_cleaned:1;
u32 is_error:1;
u32 rsvd3:6;
+ u16 eop_index;
+ u16 rsvd4;
};
- u32 flags;
+ u64 flags;
};
};
@@ -94,6 +96,7 @@ struct aq_ring_stats_tx_s {
u64 errors;
u64 packets;
u64 bytes;
+ u64 queue_restarts;
};
union aq_ring_stats_s {
@@ -147,6 +150,9 @@ struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
int aq_ring_init(struct aq_ring_s *self);
void aq_ring_rx_deinit(struct aq_ring_s *self);
void aq_ring_free(struct aq_ring_s *self);
+void aq_ring_update_queue_state(struct aq_ring_s *ring);
+void aq_ring_queue_wake(struct aq_ring_s *ring);
+void aq_ring_queue_stop(struct aq_ring_s *ring);
void aq_ring_tx_clean(struct aq_ring_s *self);
int aq_ring_rx_clean(struct aq_ring_s *self,
struct napi_struct *napi,
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
index ebf588004c46..305ff8ffac2c 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
@@ -59,12 +59,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
if (ring[AQ_VEC_TX_ID].sw_head !=
ring[AQ_VEC_TX_ID].hw_head) {
aq_ring_tx_clean(&ring[AQ_VEC_TX_ID]);
-
- if (aq_ring_avail_dx(&ring[AQ_VEC_TX_ID]) >
- AQ_CFG_SKB_FRAGS_MAX) {
- aq_nic_ndev_queue_start(self->aq_nic,
- ring[AQ_VEC_TX_ID].idx);
- }
+ aq_ring_update_queue_state(&ring[AQ_VEC_TX_ID]);
was_tx_cleaned = true;
}
@@ -364,6 +359,7 @@ void aq_vec_add_stats(struct aq_vec_s *self,
stats_tx->packets += tx->packets;
stats_tx->bytes += tx->bytes;
stats_tx->errors += tx->errors;
+ stats_tx->queue_restarts += tx->queue_restarts;
}
}
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h
index f3957e930340..fcf89e25a773 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h
@@ -16,7 +16,7 @@
#include "../aq_common.h"
-#define HW_ATL_B0_MTU_JUMBO (16000U)
+#define HW_ATL_B0_MTU_JUMBO 16352U
#define HW_ATL_B0_MTU 1514U
#define HW_ATL_B0_TX_RINGS 4U
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
index 4f5ec9a0fbfb..bf734b32e44b 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
@@ -351,8 +351,7 @@ int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self)
break;
default:
- link_status->mbps = 0U;
- break;
+ return -EBUSY;
}
}
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index a6572b51435a..83eec9a8c275 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -432,6 +432,27 @@ static void bcm_sysport_update_mib_counters(struct bcm_sysport_priv *priv)
netif_dbg(priv, hw, priv->netdev, "updated MIB counters\n");
}
+static void bcm_sysport_update_tx_stats(struct bcm_sysport_priv *priv,
+ u64 *tx_bytes, u64 *tx_packets)
+{
+ struct bcm_sysport_tx_ring *ring;
+ u64 bytes = 0, packets = 0;
+ unsigned int start;
+ unsigned int q;
+
+ for (q = 0; q < priv->netdev->num_tx_queues; q++) {
+ ring = &priv->tx_rings[q];
+ do {
+ start = u64_stats_fetch_begin_irq(&priv->syncp);
+ bytes = ring->bytes;
+ packets = ring->packets;
+ } while (u64_stats_fetch_retry_irq(&priv->syncp, start));
+
+ *tx_bytes += bytes;
+ *tx_packets += packets;
+ }
+}
+
static void bcm_sysport_get_stats(struct net_device *dev,
struct ethtool_stats *stats, u64 *data)
{
@@ -439,11 +460,16 @@ static void bcm_sysport_get_stats(struct net_device *dev,
struct bcm_sysport_stats64 *stats64 = &priv->stats64;
struct u64_stats_sync *syncp = &priv->syncp;
struct bcm_sysport_tx_ring *ring;
+ u64 tx_bytes = 0, tx_packets = 0;
unsigned int start;
int i, j;
- if (netif_running(dev))
+ if (netif_running(dev)) {
bcm_sysport_update_mib_counters(priv);
+ bcm_sysport_update_tx_stats(priv, &tx_bytes, &tx_packets);
+ stats64->tx_bytes = tx_bytes;
+ stats64->tx_packets = tx_packets;
+ }
for (i = 0, j = 0; i < BCM_SYSPORT_STATS_LEN; i++) {
const struct bcm_sysport_stats *s;
@@ -461,12 +487,13 @@ static void bcm_sysport_get_stats(struct net_device *dev,
continue;
p += s->stat_offset;
- if (s->stat_sizeof == sizeof(u64))
+ if (s->stat_sizeof == sizeof(u64) &&
+ s->type == BCM_SYSPORT_STAT_NETDEV64) {
do {
start = u64_stats_fetch_begin_irq(syncp);
data[i] = *(u64 *)p;
} while (u64_stats_fetch_retry_irq(syncp, start));
- else
+ } else
data[i] = *(u32 *)p;
j++;
}
@@ -1716,30 +1743,12 @@ static void bcm_sysport_get_stats64(struct net_device *dev,
{
struct bcm_sysport_priv *priv = netdev_priv(dev);
struct bcm_sysport_stats64 *stats64 = &priv->stats64;
- struct bcm_sysport_tx_ring *ring;
- u64 tx_packets = 0, tx_bytes = 0;
unsigned int start;
- unsigned int q;
netdev_stats_to_stats64(stats, &dev->stats);
- for (q = 0; q < dev->num_tx_queues; q++) {
- ring = &priv->tx_rings[q];
- do {
- start = u64_stats_fetch_begin_irq(&priv->syncp);
- tx_bytes = ring->bytes;
- tx_packets = ring->packets;
- } while (u64_stats_fetch_retry_irq(&priv->syncp, start));
-
- stats->tx_bytes += tx_bytes;
- stats->tx_packets += tx_packets;
- }
-
- /* lockless update tx_bytes and tx_packets */
- u64_stats_update_begin(&priv->syncp);
- stats64->tx_bytes = stats->tx_bytes;
- stats64->tx_packets = stats->tx_packets;
- u64_stats_update_end(&priv->syncp);
+ bcm_sysport_update_tx_stats(priv, &stats->tx_bytes,
+ &stats->tx_packets);
do {
start = u64_stats_fetch_begin_irq(&priv->syncp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
index ccd699fb2d70..7dd3d131043a 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
@@ -750,6 +750,10 @@ int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
{
int rc = 0;
+ if (!is_classid_clsact_ingress(cls_flower->common.classid) ||
+ cls_flower->common.chain_index)
+ return -EOPNOTSUPP;
+
switch (cls_flower->command) {
case TC_CLSFLOWER_REPLACE:
rc = bnxt_tc_add_flow(bp, src_fid, cls_flower);
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c
index cec94bbb2ea5..8bc126a156e8 100644
--- a/drivers/net/ethernet/broadcom/cnic.c
+++ b/drivers/net/ethernet/broadcom/cnic.c
@@ -1278,7 +1278,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0);
if (ret)
- return -ENOMEM;
+ goto error;
n = CNIC_PAGE_SIZE / CNIC_KWQ16_DATA_SIZE;
for (i = 0, j = 0; i < cp->max_cid_space; i++) {
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index af33dc15c55f..656e6af70f0a 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -11536,11 +11536,11 @@ static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq,
tg3_napi_enable(tp);
for (i = 0; i < tp->irq_cnt; i++) {
- struct tg3_napi *tnapi = &tp->napi[i];
err = tg3_request_irq(tp, i);
if (err) {
for (i--; i >= 0; i--) {
- tnapi = &tp->napi[i];
+ struct tg3_napi *tnapi = &tp->napi[i];
+
free_irq(tnapi->irq_vec, tnapi);
}
goto out_napi_fini;
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 674cf9d13b98..8984c4938881 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -930,6 +930,14 @@ static inline bool is_ipv4_pkt(struct sk_buff *skb)
return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
}
+static inline bool is_ipv6_ext_hdr(struct sk_buff *skb)
+{
+ if (ip_hdr(skb)->version == 6)
+ return ipv6_ext_hdr(ipv6_hdr(skb)->nexthdr);
+ else
+ return false;
+}
+
#define be_error_recovering(adapter) \
(adapter->flags & BE_FLAGS_TRY_RECOVERY)
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 319eee36649b..0e3d9f39a807 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5089,6 +5089,20 @@ static netdev_features_t be_features_check(struct sk_buff *skb,
struct be_adapter *adapter = netdev_priv(dev);
u8 l4_hdr = 0;
+ if (skb_is_gso(skb)) {
+ /* IPv6 TSO requests with extension hdrs are a problem
+ * to Lancer and BE3 HW. Disable TSO6 feature.
+ */
+ if (!skyhawk_chip(adapter) && is_ipv6_ext_hdr(skb))
+ features &= ~NETIF_F_TSO6;
+
+ /* Lancer cannot handle the packet with MSS less than 256.
+ * Disable the GSO support in such cases
+ */
+ if (lancer_chip(adapter) && skb_shinfo(skb)->gso_size < 256)
+ features &= ~NETIF_F_GSO_MASK;
+ }
+
/* The code below restricts offload features for some tunneled and
* Q-in-Q packets.
* Offload features for normal (non tunnel) packets are unchanged.
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 38c7b21e5d63..ede1876a9a19 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -374,8 +374,8 @@ struct bufdesc_ex {
#define FEC_ENET_TS_AVAIL ((uint)0x00010000)
#define FEC_ENET_TS_TIMER ((uint)0x00008000)
-#define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII | FEC_ENET_TS_TIMER)
-#define FEC_NAPI_IMASK (FEC_ENET_MII | FEC_ENET_TS_TIMER)
+#define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII)
+#define FEC_NAPI_IMASK FEC_ENET_MII
#define FEC_RX_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_RXF))
/* ENET interrupt coalescing macro define */
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 56f56d6ada9c..3dc2d771a222 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1559,14 +1559,14 @@ fec_enet_collect_events(struct fec_enet_private *fep, uint int_events)
if (int_events == 0)
return false;
- if (int_events & FEC_ENET_RXF)
+ if (int_events & FEC_ENET_RXF_0)
fep->work_rx |= (1 << 2);
if (int_events & FEC_ENET_RXF_1)
fep->work_rx |= (1 << 0);
if (int_events & FEC_ENET_RXF_2)
fep->work_rx |= (1 << 1);
- if (int_events & FEC_ENET_TXF)
+ if (int_events & FEC_ENET_TXF_0)
fep->work_tx |= (1 << 2);
if (int_events & FEC_ENET_TXF_1)
fep->work_tx |= (1 << 0);
@@ -1604,8 +1604,8 @@ fec_enet_interrupt(int irq, void *dev_id)
}
if (fep->ptp_clock)
- fec_ptp_check_pps_event(fep);
-
+ if (fec_ptp_check_pps_event(fep))
+ ret = IRQ_HANDLED;
return ret;
}
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
index 59efbd605416..5bcb2238acb2 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
@@ -37,20 +37,15 @@ static bool hnae3_client_match(enum hnae3_client_type client_type,
}
static int hnae3_match_n_instantiate(struct hnae3_client *client,
- struct hnae3_ae_dev *ae_dev,
- bool is_reg, bool *matched)
+ struct hnae3_ae_dev *ae_dev, bool is_reg)
{
int ret;
- *matched = false;
-
/* check if this client matches the type of ae_dev */
if (!(hnae3_client_match(client->type, ae_dev->dev_type) &&
hnae_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))) {
return 0;
}
- /* there is a match of client and dev */
- *matched = true;
/* now, (un-)instantiate client by calling lower layer */
if (is_reg) {
@@ -69,7 +64,6 @@ int hnae3_register_client(struct hnae3_client *client)
{
struct hnae3_client *client_tmp;
struct hnae3_ae_dev *ae_dev;
- bool matched;
int ret = 0;
mutex_lock(&hnae3_common_lock);
@@ -86,7 +80,7 @@ int hnae3_register_client(struct hnae3_client *client)
/* if the client could not be initialized on current port, for
* any error reasons, move on to next available port
*/
- ret = hnae3_match_n_instantiate(client, ae_dev, true, &matched);
+ ret = hnae3_match_n_instantiate(client, ae_dev, true);
if (ret)
dev_err(&ae_dev->pdev->dev,
"match and instantiation failed for port\n");
@@ -102,12 +96,11 @@ EXPORT_SYMBOL(hnae3_register_client);
void hnae3_unregister_client(struct hnae3_client *client)
{
struct hnae3_ae_dev *ae_dev;
- bool matched;
mutex_lock(&hnae3_common_lock);
/* un-initialize the client on every matched port */
list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
- hnae3_match_n_instantiate(client, ae_dev, false, &matched);
+ hnae3_match_n_instantiate(client, ae_dev, false);
}
list_del(&client->node);
@@ -124,7 +117,6 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)
const struct pci_device_id *id;
struct hnae3_ae_dev *ae_dev;
struct hnae3_client *client;
- bool matched;
int ret = 0;
mutex_lock(&hnae3_common_lock);
@@ -151,13 +143,10 @@ int hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo)
* initialize the figure out client instance
*/
list_for_each_entry(client, &hnae3_client_list, node) {
- ret = hnae3_match_n_instantiate(client, ae_dev, true,
- &matched);
+ ret = hnae3_match_n_instantiate(client, ae_dev, true);
if (ret)
dev_err(&ae_dev->pdev->dev,
"match and instantiation failed\n");
- if (matched)
- break;
}
}
@@ -175,7 +164,6 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)
const struct pci_device_id *id;
struct hnae3_ae_dev *ae_dev;
struct hnae3_client *client;
- bool matched;
mutex_lock(&hnae3_common_lock);
/* Check if there are matched ae_dev */
@@ -187,12 +175,8 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo)
/* check the client list for the match with this ae_dev type and
* un-initialize the figure out client instance
*/
- list_for_each_entry(client, &hnae3_client_list, node) {
- hnae3_match_n_instantiate(client, ae_dev, false,
- &matched);
- if (matched)
- break;
- }
+ list_for_each_entry(client, &hnae3_client_list, node)
+ hnae3_match_n_instantiate(client, ae_dev, false);
ae_algo->ops->uninit_ae_dev(ae_dev);
hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0);
@@ -212,7 +196,6 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)
const struct pci_device_id *id;
struct hnae3_ae_algo *ae_algo;
struct hnae3_client *client;
- bool matched;
int ret = 0;
mutex_lock(&hnae3_common_lock);
@@ -246,13 +229,10 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev)
* initialize the figure out client instance
*/
list_for_each_entry(client, &hnae3_client_list, node) {
- ret = hnae3_match_n_instantiate(client, ae_dev, true,
- &matched);
+ ret = hnae3_match_n_instantiate(client, ae_dev, true);
if (ret)
dev_err(&ae_dev->pdev->dev,
"match and instantiation failed\n");
- if (matched)
- break;
}
out_err:
@@ -270,7 +250,6 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)
const struct pci_device_id *id;
struct hnae3_ae_algo *ae_algo;
struct hnae3_client *client;
- bool matched;
mutex_lock(&hnae3_common_lock);
/* Check if there are matched ae_algo */
@@ -279,12 +258,8 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev)
if (!id)
continue;
- list_for_each_entry(client, &hnae3_client_list, node) {
- hnae3_match_n_instantiate(client, ae_dev, false,
- &matched);
- if (matched)
- break;
- }
+ list_for_each_entry(client, &hnae3_client_list, node)
+ hnae3_match_n_instantiate(client, ae_dev, false);
ae_algo->ops->uninit_ae_dev(ae_dev);
hnae_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
index b2f28ae81273..1a01cadfe5f3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
@@ -49,7 +49,17 @@
#define HNAE3_CLASS_NAME_SIZE 16
#define HNAE3_DEV_INITED_B 0x0
-#define HNAE_DEV_SUPPORT_ROCE_B 0x1
+#define HNAE3_DEV_SUPPORT_ROCE_B 0x1
+#define HNAE3_DEV_SUPPORT_DCB_B 0x2
+
+#define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\
+ BIT(HNAE3_DEV_SUPPORT_ROCE_B))
+
+#define hnae3_dev_roce_supported(hdev) \
+ hnae_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_ROCE_B)
+
+#define hnae3_dev_dcb_supported(hdev) \
+ hnae_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B)
#define ring_ptr_move_fw(ring, p) \
((ring)->p = ((ring)->p + 1) % (ring)->desc_num)
@@ -366,12 +376,12 @@ struct hnae3_ae_algo {
struct hnae3_tc_info {
u16 tqp_offset; /* TQP offset from base TQP */
u16 tqp_count; /* Total TQPs */
- u8 up; /* user priority */
u8 tc; /* TC index */
bool enable; /* If this TC is enable or not */
};
#define HNAE3_MAX_TC 8
+#define HNAE3_MAX_USER_PRIO 8
struct hnae3_knic_private_info {
struct net_device *netdev; /* Set by KNIC client when init instance */
u16 rss_size; /* Allocated RSS queues */
@@ -379,6 +389,7 @@ struct hnae3_knic_private_info {
u16 num_desc;
u8 num_tc; /* Total number of enabled TCs */
+ u8 prio_tc[HNAE3_MAX_USER_PRIO]; /* TC indexed by prio */
struct hnae3_tc_info tc_info[HNAE3_MAX_TC]; /* Idx of array is HW TC */
u16 num_tqps; /* total number of TQPs in this handle */
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
index 91ae0135ee50..758cf3948131 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
@@ -238,7 +238,7 @@ struct hclge_tqp_map {
u8 rsv[18];
};
-#define HCLGE_VECTOR_ELEMENTS_PER_CMD 11
+#define HCLGE_VECTOR_ELEMENTS_PER_CMD 10
enum hclge_int_type {
HCLGE_INT_TX,
@@ -252,8 +252,12 @@ struct hclge_ctrl_vector_chain {
#define HCLGE_INT_TYPE_S 0
#define HCLGE_INT_TYPE_M 0x3
#define HCLGE_TQP_ID_S 2
-#define HCLGE_TQP_ID_M (0x3fff << HCLGE_TQP_ID_S)
+#define HCLGE_TQP_ID_M (0x7ff << HCLGE_TQP_ID_S)
+#define HCLGE_INT_GL_IDX_S 13
+#define HCLGE_INT_GL_IDX_M (0x3 << HCLGE_INT_GL_IDX_S)
__le16 tqp_type_and_id[HCLGE_VECTOR_ELEMENTS_PER_CMD];
+ u8 vfid;
+ u8 rsv;
};
#define HCLGE_TC_NUM 8
@@ -266,7 +270,8 @@ struct hclge_tx_buff_alloc {
struct hclge_rx_priv_buff {
__le16 buf_num[HCLGE_TC_NUM];
- u8 rsv[8];
+ __le16 shared_buf;
+ u8 rsv[6];
};
struct hclge_query_version {
@@ -684,6 +689,7 @@ struct hclge_reset_tqp_queue {
#define HCLGE_DEFAULT_TX_BUF 0x4000 /* 16k bytes */
#define HCLGE_TOTAL_PKT_BUF 0x108000 /* 1.03125M bytes */
#define HCLGE_DEFAULT_DV 0xA000 /* 40k byte */
+#define HCLGE_DEFAULT_NON_DCB_DV 0x7800 /* 30K byte */
#define HCLGE_TYPE_CRQ 0
#define HCLGE_TYPE_CSQ 1
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index bb45365fb817..c1cdbfd83bdb 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -46,17 +46,7 @@ static const struct pci_device_id ae_algo_pci_tbl[] = {
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0},
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0},
- /* Required last entry */
- {0, }
-};
-
-static const struct pci_device_id roce_pci_tbl[] = {
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0},
- /* Required last entry */
+ /* required last entry */
{0, }
};
@@ -894,7 +884,7 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
hdev->num_tqps = __le16_to_cpu(req->tqp_num);
hdev->pkt_buf_size = __le16_to_cpu(req->buf_size) << HCLGE_BUF_UNIT_S;
- if (hnae_get_bit(hdev->ae_dev->flag, HNAE_DEV_SUPPORT_ROCE_B)) {
+ if (hnae3_dev_roce_supported(hdev)) {
hdev->num_roce_msix =
hnae_get_field(__le16_to_cpu(req->pf_intr_vector_number),
HCLGE_PF_VEC_NUM_M, HCLGE_PF_VEC_NUM_S);
@@ -1063,9 +1053,9 @@ static int hclge_configure(struct hclge_dev *hdev)
hdev->base_tqp_pid = 0;
hdev->rss_size_max = 1;
hdev->rx_buf_len = cfg.rx_buf_len;
- for (i = 0; i < ETH_ALEN; i++)
- hdev->hw.mac.mac_addr[i] = cfg.mac_addr[i];
+ ether_addr_copy(hdev->hw.mac.mac_addr, cfg.mac_addr);
hdev->hw.mac.media_type = cfg.media_type;
+ hdev->hw.mac.phy_addr = cfg.phy_addr;
hdev->num_desc = cfg.tqp_desc_num;
hdev->tm_info.num_pg = 1;
hdev->tm_info.num_tc = cfg.tc_num;
@@ -1454,7 +1444,11 @@ static bool hclge_is_rx_buf_ok(struct hclge_dev *hdev, u32 rx_all)
tc_num = hclge_get_tc_num(hdev);
pfc_enable_num = hclge_get_pfc_enalbe_num(hdev);
- shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_DV;
+ if (hnae3_dev_dcb_supported(hdev))
+ shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_DV;
+ else
+ shared_buf_min = 2 * hdev->mps + HCLGE_DEFAULT_NON_DCB_DV;
+
shared_buf_tc = pfc_enable_num * hdev->mps +
(tc_num - pfc_enable_num) * hdev->mps / 2 +
hdev->mps;
@@ -1495,6 +1489,16 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
struct hclge_priv_buf *priv;
int i;
+ /* When DCB is not supported, rx private
+ * buffer is not allocated.
+ */
+ if (!hnae3_dev_dcb_supported(hdev)) {
+ if (!hclge_is_rx_buf_ok(hdev, rx_all))
+ return -ENOMEM;
+
+ return 0;
+ }
+
/* step 1, try to alloc private buffer for all enabled tc */
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
priv = &hdev->priv_buf[i];
@@ -1510,6 +1514,11 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
priv->wl.high = 2 * hdev->mps;
priv->buf_size = priv->wl.high;
}
+ } else {
+ priv->enable = 0;
+ priv->wl.low = 0;
+ priv->wl.high = 0;
+ priv->buf_size = 0;
}
}
@@ -1522,8 +1531,15 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
priv = &hdev->priv_buf[i];
- if (hdev->hw_tc_map & BIT(i))
- priv->enable = 1;
+ priv->enable = 0;
+ priv->wl.low = 0;
+ priv->wl.high = 0;
+ priv->buf_size = 0;
+
+ if (!(hdev->hw_tc_map & BIT(i)))
+ continue;
+
+ priv->enable = 1;
if (hdev->tm_info.hw_pfc_map & BIT(i)) {
priv->wl.low = 128;
@@ -1616,6 +1632,10 @@ static int hclge_rx_priv_buf_alloc(struct hclge_dev *hdev)
cpu_to_le16(true << HCLGE_TC0_PRI_BUF_EN_B);
}
+ req->shared_buf =
+ cpu_to_le16((hdev->s_buf.buf_size >> HCLGE_BUF_UNIT_S) |
+ (1 << HCLGE_TC0_PRI_BUF_EN_B));
+
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) {
dev_err(&hdev->pdev->dev,
@@ -1782,18 +1802,22 @@ int hclge_buffer_alloc(struct hclge_dev *hdev)
return ret;
}
- ret = hclge_rx_priv_wl_config(hdev);
- if (ret) {
- dev_err(&hdev->pdev->dev,
- "could not configure rx private waterline %d\n", ret);
- return ret;
- }
+ if (hnae3_dev_dcb_supported(hdev)) {
+ ret = hclge_rx_priv_wl_config(hdev);
+ if (ret) {
+ dev_err(&hdev->pdev->dev,
+ "could not configure rx private waterline %d\n",
+ ret);
+ return ret;
+ }
- ret = hclge_common_thrd_config(hdev);
- if (ret) {
- dev_err(&hdev->pdev->dev,
- "could not configure common threshold %d\n", ret);
- return ret;
+ ret = hclge_common_thrd_config(hdev);
+ if (ret) {
+ dev_err(&hdev->pdev->dev,
+ "could not configure common threshold %d\n",
+ ret);
+ return ret;
+ }
}
ret = hclge_common_wl_config(hdev);
@@ -2582,6 +2606,7 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
u16 tc_valid[HCLGE_MAX_TC_NUM];
u16 tc_size[HCLGE_MAX_TC_NUM];
u32 *rss_indir = NULL;
+ u16 rss_size = 0, roundup_size;
const u8 *key;
int i, ret, j;
@@ -2596,7 +2621,13 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
for (j = 0; j < hdev->num_vmdq_vport + 1; j++) {
for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++) {
vport[j].rss_indirection_tbl[i] =
- i % hdev->rss_size_max;
+ i % vport[j].alloc_rss_size;
+
+ /* vport 0 is for PF */
+ if (j != 0)
+ continue;
+
+ rss_size = vport[j].alloc_rss_size;
rss_indir[i] = vport[j].rss_indirection_tbl[i];
}
}
@@ -2613,42 +2644,32 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
if (ret)
goto err;
+ /* Each TC have the same queue size, and tc_size set to hardware is
+ * the log2 of roundup power of two of rss_size, the acutal queue
+ * size is limited by indirection table.
+ */
+ if (rss_size > HCLGE_RSS_TC_SIZE_7 || rss_size == 0) {
+ dev_err(&hdev->pdev->dev,
+ "Configure rss tc size failed, invalid TC_SIZE = %d\n",
+ rss_size);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ roundup_size = roundup_pow_of_two(rss_size);
+ roundup_size = ilog2(roundup_size);
+
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
- if (hdev->hw_tc_map & BIT(i))
- tc_valid[i] = 1;
- else
- tc_valid[i] = 0;
+ tc_valid[i] = 0;
- switch (hdev->rss_size_max) {
- case HCLGE_RSS_TC_SIZE_0:
- tc_size[i] = 0;
- break;
- case HCLGE_RSS_TC_SIZE_1:
- tc_size[i] = 1;
- break;
- case HCLGE_RSS_TC_SIZE_2:
- tc_size[i] = 2;
- break;
- case HCLGE_RSS_TC_SIZE_3:
- tc_size[i] = 3;
- break;
- case HCLGE_RSS_TC_SIZE_4:
- tc_size[i] = 4;
- break;
- case HCLGE_RSS_TC_SIZE_5:
- tc_size[i] = 5;
- break;
- case HCLGE_RSS_TC_SIZE_6:
- tc_size[i] = 6;
- break;
- case HCLGE_RSS_TC_SIZE_7:
- tc_size[i] = 7;
- break;
- default:
- break;
- }
- tc_offset[i] = hdev->rss_size_max * i;
+ if (!(hdev->hw_tc_map & BIT(i)))
+ continue;
+
+ tc_valid[i] = 1;
+ tc_size[i] = roundup_size;
+ tc_offset[i] = rss_size * i;
}
+
ret = hclge_set_rss_tc_mode(hdev, tc_valid, tc_size, tc_offset);
err:
@@ -2679,7 +2700,11 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
HCLGE_TQP_ID_S, node->tqp_index);
+ hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
+ HCLGE_INT_GL_IDX_S,
+ hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
+ req->vfid = vport->vport_id;
if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD;
@@ -2763,8 +2788,12 @@ static int hclge_unmap_ring_from_vector(
hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
HCLGE_TQP_ID_S, node->tqp_index);
+ hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
+ HCLGE_INT_GL_IDX_S,
+ hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
+ req->vfid = vport->vport_id;
if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
req->int_cause_num = HCLGE_VECTOR_ELEMENTS_PER_CMD;
@@ -2778,7 +2807,7 @@ static int hclge_unmap_ring_from_vector(
}
i = 0;
hclge_cmd_setup_basic_desc(&desc,
- HCLGE_OPC_ADD_RING_TO_VECTOR,
+ HCLGE_OPC_DEL_RING_TO_VECTOR,
false);
req->int_vector_id = vector_id;
}
@@ -3665,6 +3694,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
{
#define HCLGE_VLAN_TYPE_VF_TABLE 0
#define HCLGE_VLAN_TYPE_PORT_TABLE 1
+ struct hnae3_handle *handle;
int ret;
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_VF_TABLE,
@@ -3674,8 +3704,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_VLAN_TYPE_PORT_TABLE,
true);
+ if (ret)
+ return ret;
- return ret;
+ handle = &hdev->vport[0].nic;
+ return hclge_set_port_vlan_filter(handle, htons(ETH_P_8021Q), 0, false);
}
static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)
@@ -3920,8 +3953,7 @@ static int hclge_init_client_instance(struct hnae3_client *client,
goto err;
if (hdev->roce_client &&
- hnae_get_bit(hdev->ae_dev->flag,
- HNAE_DEV_SUPPORT_ROCE_B)) {
+ hnae3_dev_roce_supported(hdev)) {
struct hnae3_client *rc = hdev->roce_client;
ret = hclge_init_roce_base_info(vport);
@@ -3944,8 +3976,7 @@ static int hclge_init_client_instance(struct hnae3_client *client,
break;
case HNAE3_CLIENT_ROCE:
- if (hnae_get_bit(hdev->ae_dev->flag,
- HNAE_DEV_SUPPORT_ROCE_B)) {
+ if (hnae3_dev_roce_supported(hdev)) {
hdev->roce_client = client;
vport->roce.client = client;
}
@@ -4057,7 +4088,6 @@ static void hclge_pci_uninit(struct hclge_dev *hdev)
static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
{
struct pci_dev *pdev = ae_dev->pdev;
- const struct pci_device_id *id;
struct hclge_dev *hdev;
int ret;
@@ -4072,10 +4102,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
hdev->ae_dev = ae_dev;
ae_dev->priv = hdev;
- id = pci_match_id(roce_pci_tbl, ae_dev->pdev);
- if (id)
- hnae_set_bit(ae_dev->flag, HNAE_DEV_SUPPORT_ROCE_B, 1);
-
ret = hclge_pci_init(hdev);
if (ret) {
dev_err(&pdev->dev, "PCI init failed\n");
@@ -4138,12 +4164,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
return ret;
}
- ret = hclge_rss_init_hw(hdev);
- if (ret) {
- dev_err(&pdev->dev, "Rss init fail, ret =%d\n", ret);
- return ret;
- }
-
ret = hclge_init_vlan_config(hdev);
if (ret) {
dev_err(&pdev->dev, "VLAN init fail, ret =%d\n", ret);
@@ -4156,6 +4176,12 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
return ret;
}
+ ret = hclge_rss_init_hw(hdev);
+ if (ret) {
+ dev_err(&pdev->dev, "Rss init fail, ret =%d\n", ret);
+ return ret;
+ }
+
setup_timer(&hdev->service_timer, hclge_service_timer,
(unsigned long)hdev);
INIT_WORK(&hdev->service_task, hclge_service_task);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
index edb10ad075eb..9fcfd9395424 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
@@ -176,7 +176,6 @@ struct hclge_pg_info {
struct hclge_tc_info {
u8 tc_id;
u8 tc_sch_mode; /* 0: sp; 1: dwrr */
- u8 up;
u8 pgid;
u32 bw_limit;
};
@@ -197,6 +196,7 @@ struct hclge_tm_info {
u8 num_tc;
u8 num_pg; /* It must be 1 if vNET-Base schd */
u8 pg_dwrr[HCLGE_PG_NUM];
+ u8 prio_tc[HNAE3_MAX_USER_PRIO];
struct hclge_pg_info pg_info[HCLGE_PG_NUM];
struct hclge_tc_info tc_info[HNAE3_MAX_TC];
enum hclge_fc_mode fc_mode;
@@ -477,6 +477,7 @@ struct hclge_vport {
u8 rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */
/* User configured lookup table entries */
u8 rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE];
+ u16 alloc_rss_size;
u16 qs_offset;
u16 bw_limit; /* VSI BW Limit (0 = disabled) */
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
index 1c577d268f00..73a75d7cc551 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
@@ -128,9 +128,7 @@ static int hclge_fill_pri_array(struct hclge_dev *hdev, u8 *pri, u8 pri_id)
{
u8 tc;
- for (tc = 0; tc < hdev->tm_info.num_tc; tc++)
- if (hdev->tm_info.tc_info[tc].up == pri_id)
- break;
+ tc = hdev->tm_info.prio_tc[pri_id];
if (tc >= hdev->tm_info.num_tc)
return -EINVAL;
@@ -158,7 +156,7 @@ static int hclge_up_to_tc_map(struct hclge_dev *hdev)
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PRI_TO_TC_MAPPING, false);
- for (pri_id = 0; pri_id < hdev->tm_info.num_tc; pri_id++) {
+ for (pri_id = 0; pri_id < HNAE3_MAX_USER_PRIO; pri_id++) {
ret = hclge_fill_pri_array(hdev, pri, pri_id);
if (ret)
return ret;
@@ -280,11 +278,11 @@ static int hclge_tm_pg_shapping_cfg(struct hclge_dev *hdev,
shap_cfg_cmd->pg_id = pg_id;
- hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_B, ir_b);
- hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_U, ir_u);
- hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, IR_S, ir_s);
- hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, BS_B, bs_b);
- hclge_tm_set_feild(shap_cfg_cmd->pg_shapping_para, BS_S, bs_s);
+ hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_B, ir_b);
+ hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_U, ir_u);
+ hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, IR_S, ir_s);
+ hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, BS_B, bs_b);
+ hclge_tm_set_field(shap_cfg_cmd->pg_shapping_para, BS_S, bs_s);
return hclge_cmd_send(&hdev->hw, &desc, 1);
}
@@ -307,11 +305,11 @@ static int hclge_tm_pri_shapping_cfg(struct hclge_dev *hdev,
shap_cfg_cmd->pri_id = pri_id;
- hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_B, ir_b);
- hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_U, ir_u);
- hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, IR_S, ir_s);
- hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, BS_B, bs_b);
- hclge_tm_set_feild(shap_cfg_cmd->pri_shapping_para, BS_S, bs_s);
+ hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_B, ir_b);
+ hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_U, ir_u);
+ hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, IR_S, ir_s);
+ hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, BS_B, bs_b);
+ hclge_tm_set_field(shap_cfg_cmd->pri_shapping_para, BS_S, bs_s);
return hclge_cmd_send(&hdev->hw, &desc, 1);
}
@@ -397,6 +395,7 @@ static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)
kinfo->num_tqps / kinfo->num_tc);
vport->qs_offset = hdev->tm_info.num_tc * vport->vport_id;
vport->dwrr = 100; /* 100 percent as init */
+ vport->alloc_rss_size = kinfo->rss_size;
for (i = 0; i < kinfo->num_tc; i++) {
if (hdev->hw_tc_map & BIT(i)) {
@@ -404,16 +403,17 @@ static void hclge_tm_vport_tc_info_update(struct hclge_vport *vport)
kinfo->tc_info[i].tqp_offset = i * kinfo->rss_size;
kinfo->tc_info[i].tqp_count = kinfo->rss_size;
kinfo->tc_info[i].tc = i;
- kinfo->tc_info[i].up = hdev->tm_info.tc_info[i].up;
} else {
/* Set to default queue if TC is disable */
kinfo->tc_info[i].enable = false;
kinfo->tc_info[i].tqp_offset = 0;
kinfo->tc_info[i].tqp_count = 1;
kinfo->tc_info[i].tc = 0;
- kinfo->tc_info[i].up = 0;
}
}
+
+ memcpy(kinfo->prio_tc, hdev->tm_info.prio_tc,
+ FIELD_SIZEOF(struct hnae3_knic_private_info, prio_tc));
}
static void hclge_tm_vport_info_update(struct hclge_dev *hdev)
@@ -435,12 +435,15 @@ static void hclge_tm_tc_info_init(struct hclge_dev *hdev)
for (i = 0; i < hdev->tm_info.num_tc; i++) {
hdev->tm_info.tc_info[i].tc_id = i;
hdev->tm_info.tc_info[i].tc_sch_mode = HCLGE_SCH_MODE_DWRR;
- hdev->tm_info.tc_info[i].up = i;
hdev->tm_info.tc_info[i].pgid = 0;
hdev->tm_info.tc_info[i].bw_limit =
hdev->tm_info.pg_info[0].bw_limit;
}
+ for (i = 0; i < HNAE3_MAX_USER_PRIO; i++)
+ hdev->tm_info.prio_tc[i] =
+ (i >= hdev->tm_info.num_tc) ? 0 : i;
+
hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;
}
@@ -976,6 +979,10 @@ int hclge_pause_setup_hw(struct hclge_dev *hdev)
if (ret)
return ret;
+ /* Only DCB-supported dev supports qset back pressure setting */
+ if (!hnae3_dev_dcb_supported(hdev))
+ return 0;
+
for (i = 0; i < hdev->tm_info.num_tc; i++) {
ret = hclge_tm_qs_bp_cfg(hdev, i);
if (ret)
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
index 7e67337dfaf2..85158b0d73fe 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
@@ -94,10 +94,10 @@ struct hclge_bp_to_qs_map_cmd {
u32 rsvd1;
};
-#define hclge_tm_set_feild(dest, string, val) \
+#define hclge_tm_set_field(dest, string, val) \
hnae_set_field((dest), (HCLGE_TM_SHAP_##string##_MSK), \
(HCLGE_TM_SHAP_##string##_LSH), val)
-#define hclge_tm_get_feild(src, string) \
+#define hclge_tm_get_field(src, string) \
hnae_get_field((src), (HCLGE_TM_SHAP_##string##_MSK), \
(HCLGE_TM_SHAP_##string##_LSH))
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c
index 1c3e29447891..35369e1c8036 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c
@@ -41,11 +41,16 @@ static struct hnae3_client client;
static const struct pci_device_id hns3_pci_tbl[] = {
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_GE), 0},
{PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},
- {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0},
+ {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA),
+ HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
+ {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC),
+ HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
+ {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA),
+ HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
+ {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC),
+ HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
+ {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC),
+ HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},
/* required last entry */
{0, }
};
@@ -1348,6 +1353,7 @@ static int hns3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
}
ae_dev->pdev = pdev;
+ ae_dev->flag = ent->driver_data;
ae_dev->dev_type = HNAE3_DEV_KNIC;
pci_set_drvdata(pdev, ae_dev);
@@ -2705,10 +2711,11 @@ static void hns3_init_mac_addr(struct net_device *netdev)
eth_hw_addr_random(netdev);
dev_warn(priv->dev, "using random MAC address %pM\n",
netdev->dev_addr);
- /* Also copy this new MAC address into hdev */
- if (h->ae_algo->ops->set_mac_addr)
- h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr);
}
+
+ if (h->ae_algo->ops->set_mac_addr)
+ h->ae_algo->ops->set_mac_addr(h, netdev->dev_addr);
+
}
static void hns3_nic_set_priv_ops(struct net_device *netdev)
diff --git a/drivers/net/ethernet/i825xx/lasi_82596.c b/drivers/net/ethernet/i825xx/lasi_82596.c
index aa22e108f09b..b69c622ba8b2 100644
--- a/drivers/net/ethernet/i825xx/lasi_82596.c
+++ b/drivers/net/ethernet/i825xx/lasi_82596.c
@@ -96,8 +96,6 @@
#define OPT_SWAP_PORT 0x0001 /* Need to wordswp on the MPU port */
-#define DMA_ALLOC dma_alloc_noncoherent
-#define DMA_FREE dma_free_noncoherent
#define DMA_WBACK(ndev, addr, len) \
do { dma_cache_sync((ndev)->dev.parent, (void *)addr, len, DMA_TO_DEVICE); } while (0)
@@ -200,8 +198,8 @@ static int __exit lan_remove_chip(struct parisc_device *pdev)
struct i596_private *lp = netdev_priv(dev);
unregister_netdev (dev);
- DMA_FREE(&pdev->dev, sizeof(struct i596_private),
- (void *)lp->dma, lp->dma_addr);
+ dma_free_attrs(&pdev->dev, sizeof(struct i596_private), lp->dma,
+ lp->dma_addr, DMA_ATTR_NON_CONSISTENT);
free_netdev (dev);
return 0;
}
diff --git a/drivers/net/ethernet/i825xx/lib82596.c b/drivers/net/ethernet/i825xx/lib82596.c
index 8449c58f01fd..f00a1dc2128c 100644
--- a/drivers/net/ethernet/i825xx/lib82596.c
+++ b/drivers/net/ethernet/i825xx/lib82596.c
@@ -1063,8 +1063,9 @@ static int i82596_probe(struct net_device *dev)
if (!dev->base_addr || !dev->irq)
return -ENODEV;
- dma = (struct i596_dma *) DMA_ALLOC(dev->dev.parent,
- sizeof(struct i596_dma), &lp->dma_addr, GFP_KERNEL);
+ dma = dma_alloc_attrs(dev->dev.parent, sizeof(struct i596_dma),
+ &lp->dma_addr, GFP_KERNEL,
+ DMA_ATTR_NON_CONSISTENT);
if (!dma) {
printk(KERN_ERR "%s: Couldn't get shared memory\n", __FILE__);
return -ENOMEM;
@@ -1085,8 +1086,8 @@ static int i82596_probe(struct net_device *dev)
i = register_netdev(dev);
if (i) {
- DMA_FREE(dev->dev.parent, sizeof(struct i596_dma),
- (void *)dma, lp->dma_addr);
+ dma_free_attrs(dev->dev.parent, sizeof(struct i596_dma),
+ dma, lp->dma_addr, DMA_ATTR_NON_CONSISTENT);
return i;
}
diff --git a/drivers/net/ethernet/i825xx/sni_82596.c b/drivers/net/ethernet/i825xx/sni_82596.c
index 2af7f77345fb..b2c04a789744 100644
--- a/drivers/net/ethernet/i825xx/sni_82596.c
+++ b/drivers/net/ethernet/i825xx/sni_82596.c
@@ -23,8 +23,6 @@
static const char sni_82596_string[] = "snirm_82596";
-#define DMA_ALLOC dma_alloc_coherent
-#define DMA_FREE dma_free_coherent
#define DMA_WBACK(priv, addr, len) do { } while (0)
#define DMA_INV(priv, addr, len) do { } while (0)
#define DMA_WBACK_INV(priv, addr, len) do { } while (0)
@@ -152,8 +150,8 @@ static int sni_82596_driver_remove(struct platform_device *pdev)
struct i596_private *lp = netdev_priv(dev);
unregister_netdev(dev);
- DMA_FREE(dev->dev.parent, sizeof(struct i596_private),
- lp->dma, lp->dma_addr);
+ dma_free_attrs(dev->dev.parent, sizeof(struct i596_private), lp->dma,
+ lp->dma_addr, DMA_ATTR_NON_CONSISTENT);
iounmap(lp->ca);
iounmap(lp->mpu_port);
free_netdev (dev);
diff --git a/drivers/net/ethernet/ibm/emac/mal.c b/drivers/net/ethernet/ibm/emac/mal.c
index 2c74baa2398a..fff09dcf9e34 100644
--- a/drivers/net/ethernet/ibm/emac/mal.c
+++ b/drivers/net/ethernet/ibm/emac/mal.c
@@ -402,7 +402,7 @@ static int mal_poll(struct napi_struct *napi, int budget)
unsigned long flags;
MAL_DBG2(mal, "poll(%d)" NL, budget);
- again:
+
/* Process TX skbs */
list_for_each(l, &mal->poll_list) {
struct mal_commac *mc =
@@ -451,7 +451,6 @@ static int mal_poll(struct napi_struct *napi, int budget)
spin_lock_irqsave(&mal->lock, flags);
mal_disable_eob_irq(mal);
spin_unlock_irqrestore(&mal->lock, flags);
- goto again;
}
mc->ops->poll_tx(mc->dev);
}
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index dd0ee2691c86..9c86cb7cb988 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -333,7 +333,7 @@
#define MVPP2_GMAC_INBAND_AN_MASK BIT(0)
#define MVPP2_GMAC_FLOW_CTRL_MASK GENMASK(2, 1)
#define MVPP2_GMAC_PCS_ENABLE_MASK BIT(3)
-#define MVPP2_GMAC_PORT_RGMII_MASK BIT(4)
+#define MVPP2_GMAC_INTERNAL_CLK_MASK BIT(4)
#define MVPP2_GMAC_DISABLE_PADDING BIT(5)
#define MVPP2_GMAC_PORT_RESET_MASK BIT(6)
#define MVPP2_GMAC_AUTONEG_CONFIG 0xc
@@ -676,6 +676,7 @@ enum mvpp2_tag_type {
#define MVPP2_PRS_RI_L3_MCAST BIT(15)
#define MVPP2_PRS_RI_L3_BCAST (BIT(15) | BIT(16))
#define MVPP2_PRS_RI_IP_FRAG_MASK 0x20000
+#define MVPP2_PRS_RI_IP_FRAG_TRUE BIT(17)
#define MVPP2_PRS_RI_UDF3_MASK 0x300000
#define MVPP2_PRS_RI_UDF3_RX_SPECIAL BIT(21)
#define MVPP2_PRS_RI_L4_PROTO_MASK 0x1c00000
@@ -792,6 +793,7 @@ struct mvpp2 {
struct clk *pp_clk;
struct clk *gop_clk;
struct clk *mg_clk;
+ struct clk *axi_clk;
/* List of pointers to port structures */
struct mvpp2_port **port_list;
@@ -2315,7 +2317,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
(proto != IPPROTO_IGMP))
return -EINVAL;
- /* Fragmented packet */
+ /* Not fragmented packet */
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
MVPP2_PE_LAST_FREE_TID);
if (tid < 0)
@@ -2334,8 +2336,12 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
mvpp2_prs_sram_ai_update(&pe, MVPP2_PRS_IPV4_DIP_AI_BIT,
MVPP2_PRS_IPV4_DIP_AI_BIT);
- mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_MASK,
- ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
+ mvpp2_prs_sram_ri_update(&pe, ri, ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
+
+ mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00,
+ MVPP2_PRS_TCAM_PROTO_MASK_L);
+ mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00,
+ MVPP2_PRS_TCAM_PROTO_MASK);
mvpp2_prs_tcam_data_byte_set(&pe, 5, proto, MVPP2_PRS_TCAM_PROTO_MASK);
mvpp2_prs_tcam_ai_update(&pe, 0, MVPP2_PRS_IPV4_DIP_AI_BIT);
@@ -2346,7 +2352,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4);
mvpp2_prs_hw_write(priv, &pe);
- /* Not fragmented packet */
+ /* Fragmented packet */
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
MVPP2_PE_LAST_FREE_TID);
if (tid < 0)
@@ -2358,8 +2364,11 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
pe.sram.word[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;
mvpp2_prs_sram_ri_update(&pe, ri, ri_mask);
- mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, MVPP2_PRS_TCAM_PROTO_MASK_L);
- mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, MVPP2_PRS_TCAM_PROTO_MASK);
+ mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_TRUE,
+ ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
+
+ mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, 0x0);
+ mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, 0x0);
/* Update shadow table and hw entry */
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4);
@@ -4591,7 +4600,6 @@ static void mvpp2_port_mii_gmac_configure(struct mvpp2_port *port)
val |= MVPP2_GMAC_INBAND_AN_MASK | MVPP2_GMAC_PCS_ENABLE_MASK;
} else if (phy_interface_mode_is_rgmii(port->phy_interface)) {
val &= ~MVPP2_GMAC_PCS_ENABLE_MASK;
- val |= MVPP2_GMAC_PORT_RGMII_MASK;
}
writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
@@ -7496,7 +7504,7 @@ static void mvpp2_port_copy_mac_addr(struct net_device *dev, struct mvpp2 *priv,
/* Ports initialization */
static int mvpp2_port_probe(struct platform_device *pdev,
struct device_node *port_node,
- struct mvpp2 *priv)
+ struct mvpp2 *priv, int index)
{
struct device_node *phy_node;
struct phy *comphy;
@@ -7670,7 +7678,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
}
netdev_info(dev, "Using %s mac address %pM\n", mac_from, dev->dev_addr);
- priv->port_list[id] = port;
+ priv->port_list[index] = port;
return 0;
err_free_port_pcpu:
@@ -7963,6 +7971,18 @@ static int mvpp2_probe(struct platform_device *pdev)
err = clk_prepare_enable(priv->mg_clk);
if (err < 0)
goto err_gop_clk;
+
+ priv->axi_clk = devm_clk_get(&pdev->dev, "axi_clk");
+ if (IS_ERR(priv->axi_clk)) {
+ err = PTR_ERR(priv->axi_clk);
+ if (err == -EPROBE_DEFER)
+ goto err_gop_clk;
+ priv->axi_clk = NULL;
+ } else {
+ err = clk_prepare_enable(priv->axi_clk);
+ if (err < 0)
+ goto err_gop_clk;
+ }
}
/* Get system's tclk rate */
@@ -8005,16 +8025,19 @@ static int mvpp2_probe(struct platform_device *pdev)
}
/* Initialize ports */
+ i = 0;
for_each_available_child_of_node(dn, port_node) {
- err = mvpp2_port_probe(pdev, port_node, priv);
+ err = mvpp2_port_probe(pdev, port_node, priv, i);
if (err < 0)
goto err_mg_clk;
+ i++;
}
platform_set_drvdata(pdev, priv);
return 0;
err_mg_clk:
+ clk_disable_unprepare(priv->axi_clk);
if (priv->hw_version == MVPP22)
clk_disable_unprepare(priv->mg_clk);
err_gop_clk:
@@ -8052,6 +8075,7 @@ static int mvpp2_remove(struct platform_device *pdev)
aggr_txq->descs_dma);
}
+ clk_disable_unprepare(priv->axi_clk);
clk_disable_unprepare(priv->mg_clk);
clk_disable_unprepare(priv->pp_clk);
clk_disable_unprepare(priv->gop_clk);
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c
index 8a835e82256a..eef35bf3e849 100644
--- a/drivers/net/ethernet/marvell/skge.c
+++ b/drivers/net/ethernet/marvell/skge.c
@@ -4193,7 +4193,7 @@ static struct pci_driver skge_driver = {
.driver.pm = SKGE_PM_OPS,
};
-static struct dmi_system_id skge_32bit_dma_boards[] = {
+static const struct dmi_system_id skge_32bit_dma_boards[] = {
{
.ident = "Gigabyte nForce boards",
.matches = {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
index 1e3a6c3e4132..80eef4163f52 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
@@ -139,7 +139,7 @@ TRACE_EVENT(mlx5_fs_del_fg,
{MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO, "NEXT_PRIO"}
TRACE_EVENT(mlx5_fs_set_fte,
- TP_PROTO(const struct fs_fte *fte, bool new_fte),
+ TP_PROTO(const struct fs_fte *fte, int new_fte),
TP_ARGS(fte, new_fte),
TP_STRUCT__entry(
__field(const struct fs_fte *, fte)
@@ -149,7 +149,7 @@ TRACE_EVENT(mlx5_fs_set_fte,
__field(u32, action)
__field(u32, flow_tag)
__field(u8, mask_enable)
- __field(bool, new_fte)
+ __field(int, new_fte)
__array(u32, mask_outer, MLX5_ST_SZ_DW(fte_match_set_lyr_2_4))
__array(u32, mask_inner, MLX5_ST_SZ_DW(fte_match_set_lyr_2_4))
__array(u32, mask_misc, MLX5_ST_SZ_DW(fte_match_set_misc))
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
index f11fd07ac4dd..850cdc980ab5 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
@@ -291,7 +291,7 @@ void mlx5e_enable_vlan_filter(struct mlx5e_priv *priv)
priv->fs.vlan.filter_disabled = false;
if (priv->netdev->flags & IFF_PROMISC)
return;
- mlx5e_del_any_vid_rules(priv);
+ mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_CTAG_VID, 0);
}
void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv)
@@ -302,7 +302,7 @@ void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv)
priv->fs.vlan.filter_disabled = true;
if (priv->netdev->flags & IFF_PROMISC)
return;
- mlx5e_add_any_vid_rules(priv);
+ mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_CTAG_VID, 0);
}
int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index dfc29720ab77..cc11bbbd0309 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -184,7 +184,6 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
struct mlx5e_sw_stats temp, *s = &temp;
struct mlx5e_rq_stats *rq_stats;
struct mlx5e_sq_stats *sq_stats;
- u64 tx_offload_none = 0;
int i, j;
memset(s, 0, sizeof(*s));
@@ -199,6 +198,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
s->rx_lro_bytes += rq_stats->lro_bytes;
s->rx_csum_none += rq_stats->csum_none;
s->rx_csum_complete += rq_stats->csum_complete;
+ s->rx_csum_unnecessary += rq_stats->csum_unnecessary;
s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner;
s->rx_xdp_drop += rq_stats->xdp_drop;
s->rx_xdp_tx += rq_stats->xdp_tx;
@@ -229,14 +229,11 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
s->tx_queue_dropped += sq_stats->dropped;
s->tx_xmit_more += sq_stats->xmit_more;
s->tx_csum_partial_inner += sq_stats->csum_partial_inner;
- tx_offload_none += sq_stats->csum_none;
+ s->tx_csum_none += sq_stats->csum_none;
+ s->tx_csum_partial += sq_stats->csum_partial;
}
}
- /* Update calculated offload counters */
- s->tx_csum_partial = s->tx_packets - tx_offload_none - s->tx_csum_partial_inner;
- s->rx_csum_unnecessary = s->rx_packets - s->rx_csum_none - s->rx_csum_complete;
-
s->link_down_events_phy = MLX5_GET(ppcnt_reg,
priv->stats.pport.phy_counters,
counter_set.phys_layer_cntrs.link_down_events);
@@ -3333,8 +3330,8 @@ static int mlx5e_handle_feature(struct net_device *netdev,
err = feature_handler(netdev, enable);
if (err) {
- netdev_err(netdev, "%s feature 0x%llx failed err %d\n",
- enable ? "Enable" : "Disable", feature, err);
+ netdev_err(netdev, "%s feature %pNF failed, err %d\n",
+ enable ? "Enable" : "Disable", &feature, err);
return err;
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index f1dd638384d3..15a1687483cc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -627,6 +627,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
if (lro) {
skb->ip_summed = CHECKSUM_UNNECESSARY;
+ rq->stats.csum_unnecessary++;
return;
}
@@ -644,7 +645,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
skb->csum_level = 1;
skb->encapsulation = 1;
rq->stats.csum_unnecessary_inner++;
+ return;
}
+ rq->stats.csum_unnecessary++;
return;
}
csum_none:
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
index 6d199ffb1c0b..f8637213afc0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
@@ -68,6 +68,7 @@ struct mlx5e_sw_stats {
u64 rx_xdp_drop;
u64 rx_xdp_tx;
u64 rx_xdp_tx_full;
+ u64 tx_csum_none;
u64 tx_csum_partial;
u64 tx_csum_partial_inner;
u64 tx_queue_stopped;
@@ -108,6 +109,7 @@ static const struct counter_desc sw_stats_desc[] = {
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx) },
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
+ { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) },
@@ -339,6 +341,7 @@ struct mlx5e_rq_stats {
u64 packets;
u64 bytes;
u64 csum_complete;
+ u64 csum_unnecessary;
u64 csum_unnecessary_inner;
u64 csum_none;
u64 lro_packets;
@@ -363,6 +366,7 @@ static const struct counter_desc rq_stats_desc[] = {
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) },
+ { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
@@ -392,6 +396,7 @@ struct mlx5e_sq_stats {
u64 tso_bytes;
u64 tso_inner_packets;
u64 tso_inner_bytes;
+ u64 csum_partial;
u64 csum_partial_inner;
u64 nop;
/* less likely accessed in data path */
@@ -408,6 +413,7 @@ static const struct counter_desc sq_stats_desc[] = {
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
+ { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) },
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index da503e6411da..1aa2028ed995 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -1317,6 +1317,69 @@ static bool csum_offload_supported(struct mlx5e_priv *priv, u32 action, u32 upda
return true;
}
+static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
+ struct tcf_exts *exts)
+{
+ const struct tc_action *a;
+ bool modify_ip_header;
+ LIST_HEAD(actions);
+ u8 htype, ip_proto;
+ void *headers_v;
+ u16 ethertype;
+ int nkeys, i;
+
+ headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
+ ethertype = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ethertype);
+
+ /* for non-IP we only re-write MACs, so we're okay */
+ if (ethertype != ETH_P_IP && ethertype != ETH_P_IPV6)
+ goto out_ok;
+
+ modify_ip_header = false;
+ tcf_exts_to_list(exts, &actions);
+ list_for_each_entry(a, &actions, list) {
+ if (!is_tcf_pedit(a))
+ continue;
+
+ nkeys = tcf_pedit_nkeys(a);
+ for (i = 0; i < nkeys; i++) {
+ htype = tcf_pedit_htype(a, i);
+ if (htype == TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 ||
+ htype == TCA_PEDIT_KEY_EX_HDR_TYPE_IP6) {
+ modify_ip_header = true;
+ break;
+ }
+ }
+ }
+
+ ip_proto = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol);
+ if (modify_ip_header && ip_proto != IPPROTO_TCP && ip_proto != IPPROTO_UDP) {
+ pr_info("can't offload re-write of ip proto %d\n", ip_proto);
+ return false;
+ }
+
+out_ok:
+ return true;
+}
+
+static bool actions_match_supported(struct mlx5e_priv *priv,
+ struct tcf_exts *exts,
+ struct mlx5e_tc_flow_parse_attr *parse_attr,
+ struct mlx5e_tc_flow *flow)
+{
+ u32 actions;
+
+ if (flow->flags & MLX5E_TC_FLOW_ESWITCH)
+ actions = flow->esw_attr->action;
+ else
+ actions = flow->nic_attr->action;
+
+ if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
+ return modify_header_match_supported(&parse_attr->spec, exts);
+
+ return true;
+}
+
static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
struct mlx5e_tc_flow_parse_attr *parse_attr,
struct mlx5e_tc_flow *flow)
@@ -1378,6 +1441,9 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
return -EINVAL;
}
+ if (!actions_match_supported(priv, exts, parse_attr, flow))
+ return -EOPNOTSUPP;
+
return 0;
}
@@ -1564,7 +1630,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
break;
default:
err = -EOPNOTSUPP;
- goto out;
+ goto free_encap;
}
fl4.flowi4_tos = tun_key->tos;
fl4.daddr = tun_key->u.ipv4.dst;
@@ -1573,7 +1639,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
err = mlx5e_route_lookup_ipv4(priv, mirred_dev, &out_dev,
&fl4, &n, &ttl);
if (err)
- goto out;
+ goto free_encap;
/* used by mlx5e_detach_encap to lookup a neigh hash table
* entry in the neigh hash table when a user deletes a rule
@@ -1590,7 +1656,7 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
*/
err = mlx5e_rep_encap_entry_attach(netdev_priv(out_dev), e);
if (err)
- goto out;
+ goto free_encap;
read_lock_bh(&n->lock);
nud_state = n->nud_state;
@@ -1630,8 +1696,9 @@ static int mlx5e_create_encap_header_ipv4(struct mlx5e_priv *priv,
destroy_neigh_entry:
mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e);
-out:
+free_encap:
kfree(encap_header);
+out:
if (n)
neigh_release(n);
return err;
@@ -1668,7 +1735,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
break;
default:
err = -EOPNOTSUPP;
- goto out;
+ goto free_encap;
}
fl6.flowlabel = ip6_make_flowinfo(RT_TOS(tun_key->tos), tun_key->label);
@@ -1678,7 +1745,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
err = mlx5e_route_lookup_ipv6(priv, mirred_dev, &out_dev,
&fl6, &n, &ttl);
if (err)
- goto out;
+ goto free_encap;
/* used by mlx5e_detach_encap to lookup a neigh hash table
* entry in the neigh hash table when a user deletes a rule
@@ -1695,7 +1762,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
*/
err = mlx5e_rep_encap_entry_attach(netdev_priv(out_dev), e);
if (err)
- goto out;
+ goto free_encap;
read_lock_bh(&n->lock);
nud_state = n->nud_state;
@@ -1736,8 +1803,9 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv,
destroy_neigh_entry:
mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e);
-out:
+free_encap:
kfree(encap_header);
+out:
if (n)
neigh_release(n);
return err;
@@ -1791,6 +1859,7 @@ vxlan_encap_offload_err:
}
}
+ /* must verify if encap is valid or not */
if (found)
goto attach_flow;
@@ -1817,6 +1886,8 @@ attach_flow:
*encap_dev = e->out_dev;
if (e->flags & MLX5_ENCAP_ENTRY_VALID)
attr->encap_id = e->encap_id;
+ else
+ err = -EAGAIN;
return err;
@@ -1934,6 +2005,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
return -EINVAL;
}
+
+ if (!actions_match_supported(priv, exts, parse_attr, flow))
+ return -EOPNOTSUPP;
+
return err;
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index fee43e40fa16..1d6925d4369a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -193,6 +193,7 @@ mlx5e_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struct sk_buff *skb, struct
sq->stats.csum_partial_inner++;
} else {
eseg->cs_flags |= MLX5_ETH_WQE_L4_CSUM;
+ sq->stats.csum_partial++;
}
} else
sq->stats.csum_none++;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c
index e37453d838db..c0fd2212e890 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c
@@ -71,11 +71,11 @@ int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr,
return 0;
}
-int mlx5_fpga_caps(struct mlx5_core_dev *dev, u32 *caps)
+int mlx5_fpga_caps(struct mlx5_core_dev *dev)
{
u32 in[MLX5_ST_SZ_DW(fpga_cap)] = {0};
- return mlx5_core_access_reg(dev, in, sizeof(in), caps,
+ return mlx5_core_access_reg(dev, in, sizeof(in), dev->caps.fpga,
MLX5_ST_SZ_BYTES(fpga_cap),
MLX5_REG_FPGA_CAP, 0, 0);
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h
index 94bdfd47c3f0..d05233c9b4f6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h
@@ -65,7 +65,7 @@ struct mlx5_fpga_qp_counters {
u64 rx_total_drop;
};
-int mlx5_fpga_caps(struct mlx5_core_dev *dev, u32 *caps);
+int mlx5_fpga_caps(struct mlx5_core_dev *dev);
int mlx5_fpga_query(struct mlx5_core_dev *dev, struct mlx5_fpga_query *query);
int mlx5_fpga_ctrl_op(struct mlx5_core_dev *dev, u8 op);
int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c
index 9034e9960a76..dc8970346521 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c
@@ -139,8 +139,7 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
if (err)
goto out;
- err = mlx5_fpga_caps(fdev->mdev,
- fdev->mdev->caps.hca_cur[MLX5_CAP_FPGA]);
+ err = mlx5_fpga_caps(fdev->mdev);
if (err)
goto out;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
index e0d0efd903bc..36ecc2b2e187 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
@@ -293,6 +293,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
}
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
+ int max_list_size = BIT(MLX5_CAP_FLOWTABLE_TYPE(dev,
+ log_max_flow_counter,
+ ft->type));
int list_size = 0;
list_for_each_entry(dst, &fte->node.children, node.list) {
@@ -305,12 +308,17 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
in_dests += MLX5_ST_SZ_BYTES(dest_format_struct);
list_size++;
}
+ if (list_size > max_list_size) {
+ err = -EINVAL;
+ goto err_out;
+ }
MLX5_SET(flow_context, in_flow_context, flow_counter_list_size,
list_size);
}
err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
+err_out:
kvfree(in);
return err;
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
index 5509a752f98e..48dd78975062 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
@@ -52,6 +52,7 @@ enum fs_flow_table_type {
FS_FT_FDB = 0X4,
FS_FT_SNIFFER_RX = 0X5,
FS_FT_SNIFFER_TX = 0X6,
+ FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,
};
enum fs_flow_table_op_mod {
@@ -260,4 +261,14 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev);
#define fs_for_each_dst(pos, fte) \
fs_list_for_each_entry(pos, &(fte)->node.children)
+#define MLX5_CAP_FLOWTABLE_TYPE(mdev, cap, type) ( \
+ (type == FS_FT_NIC_RX) ? MLX5_CAP_FLOWTABLE_NIC_RX(mdev, cap) : \
+ (type == FS_FT_ESW_EGRESS_ACL) ? MLX5_CAP_ESW_EGRESS_ACL(mdev, cap) : \
+ (type == FS_FT_ESW_INGRESS_ACL) ? MLX5_CAP_ESW_INGRESS_ACL(mdev, cap) : \
+ (type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \
+ (type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) : \
+ (type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) : \
+ (BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\
+ )
+
#endif
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
index 85298051a3e4..145e392ab849 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
@@ -572,12 +572,13 @@ void mlx5_rdma_netdev_free(struct net_device *netdev)
{
struct mlx5e_priv *priv = mlx5i_epriv(netdev);
const struct mlx5e_profile *profile = priv->profile;
+ struct mlx5_core_dev *mdev = priv->mdev;
mlx5e_detach_netdev(priv);
profile->cleanup(priv);
destroy_workqueue(priv->wq);
free_netdev(netdev);
- mlx5e_destroy_mdev_resources(priv->mdev);
+ mlx5e_destroy_mdev_resources(mdev);
}
EXPORT_SYMBOL(mlx5_rdma_netdev_free);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
index 6c48e9959b65..2a8b529ce6dd 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
@@ -109,7 +109,7 @@ static int mlx5_device_enable_sriov(struct mlx5_core_dev *dev, int num_vfs)
mlx5_core_warn(dev,
"failed to restore VF %d settings, err %d\n",
vf, err);
- continue;
+ continue;
}
}
mlx5_core_dbg(dev, "successfully enabled VF* %d\n", vf);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index ed7cd6c48019..696b99e65a5a 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -575,15 +575,14 @@ static void mlxsw_sp_span_entry_destroy(struct mlxsw_sp *mlxsw_sp,
}
static struct mlxsw_sp_span_entry *
-mlxsw_sp_span_entry_find(struct mlxsw_sp_port *port)
+mlxsw_sp_span_entry_find(struct mlxsw_sp *mlxsw_sp, u8 local_port)
{
- struct mlxsw_sp *mlxsw_sp = port->mlxsw_sp;
int i;
for (i = 0; i < mlxsw_sp->span.entries_count; i++) {
struct mlxsw_sp_span_entry *curr = &mlxsw_sp->span.entries[i];
- if (curr->used && curr->local_port == port->local_port)
+ if (curr->used && curr->local_port == local_port)
return curr;
}
return NULL;
@@ -594,7 +593,8 @@ static struct mlxsw_sp_span_entry
{
struct mlxsw_sp_span_entry *span_entry;
- span_entry = mlxsw_sp_span_entry_find(port);
+ span_entry = mlxsw_sp_span_entry_find(port->mlxsw_sp,
+ port->local_port);
if (span_entry) {
/* Already exists, just take a reference */
span_entry->ref_count++;
@@ -783,12 +783,13 @@ err_port_bind:
}
static void mlxsw_sp_span_mirror_remove(struct mlxsw_sp_port *from,
- struct mlxsw_sp_port *to,
+ u8 destination_port,
enum mlxsw_sp_span_type type)
{
struct mlxsw_sp_span_entry *span_entry;
- span_entry = mlxsw_sp_span_entry_find(to);
+ span_entry = mlxsw_sp_span_entry_find(from->mlxsw_sp,
+ destination_port);
if (!span_entry) {
netdev_err(from->dev, "no span entry found\n");
return;
@@ -1563,14 +1564,12 @@ static void
mlxsw_sp_port_del_cls_matchall_mirror(struct mlxsw_sp_port *mlxsw_sp_port,
struct mlxsw_sp_port_mall_mirror_tc_entry *mirror)
{
- struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
enum mlxsw_sp_span_type span_type;
- struct mlxsw_sp_port *to_port;
- to_port = mlxsw_sp->ports[mirror->to_local_port];
span_type = mirror->ingress ?
MLXSW_SP_SPAN_INGRESS : MLXSW_SP_SPAN_EGRESS;
- mlxsw_sp_span_mirror_remove(mlxsw_sp_port, to_port, span_type);
+ mlxsw_sp_span_mirror_remove(mlxsw_sp_port, mirror->to_local_port,
+ span_type);
}
static int
@@ -2545,7 +2544,9 @@ out:
return err;
}
-#define MLXSW_SP_QSFP_I2C_ADDR 0x50
+#define MLXSW_SP_I2C_ADDR_LOW 0x50
+#define MLXSW_SP_I2C_ADDR_HIGH 0x51
+#define MLXSW_SP_EEPROM_PAGE_LENGTH 256
static int mlxsw_sp_query_module_eeprom(struct mlxsw_sp_port *mlxsw_sp_port,
u16 offset, u16 size, void *data,
@@ -2554,12 +2555,25 @@ static int mlxsw_sp_query_module_eeprom(struct mlxsw_sp_port *mlxsw_sp_port,
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
char eeprom_tmp[MLXSW_SP_REG_MCIA_EEPROM_SIZE];
char mcia_pl[MLXSW_REG_MCIA_LEN];
+ u16 i2c_addr;
int status;
int err;
size = min_t(u16, size, MLXSW_SP_REG_MCIA_EEPROM_SIZE);
+
+ if (offset < MLXSW_SP_EEPROM_PAGE_LENGTH &&
+ offset + size > MLXSW_SP_EEPROM_PAGE_LENGTH)
+ /* Cross pages read, read until offset 256 in low page */
+ size = MLXSW_SP_EEPROM_PAGE_LENGTH - offset;
+
+ i2c_addr = MLXSW_SP_I2C_ADDR_LOW;
+ if (offset >= MLXSW_SP_EEPROM_PAGE_LENGTH) {
+ i2c_addr = MLXSW_SP_I2C_ADDR_HIGH;
+ offset -= MLXSW_SP_EEPROM_PAGE_LENGTH;
+ }
+
mlxsw_reg_mcia_pack(mcia_pl, mlxsw_sp_port->mapping.module,
- 0, 0, offset, size, MLXSW_SP_QSFP_I2C_ADDR);
+ 0, 0, offset, size, i2c_addr);
err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(mcia), mcia_pl);
if (err)
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index f0fb898533fb..c16718d296d3 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -2723,6 +2723,7 @@ static void mlxsw_sp_nexthop_type_fini(struct mlxsw_sp *mlxsw_sp,
mlxsw_sp_nexthop_rif_fini(nh);
break;
case MLXSW_SP_NEXTHOP_TYPE_IPIP:
+ mlxsw_sp_nexthop_rif_fini(nh);
mlxsw_sp_nexthop_ipip_fini(mlxsw_sp, nh);
break;
}
@@ -2742,7 +2743,11 @@ static int mlxsw_sp_nexthop4_type_init(struct mlxsw_sp *mlxsw_sp,
router->ipip_ops_arr[ipipt]->can_offload(mlxsw_sp, dev,
MLXSW_SP_L3_PROTO_IPV4)) {
nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP;
- return mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev);
+ err = mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev);
+ if (err)
+ return err;
+ mlxsw_sp_nexthop_rif_init(nh, &nh->ipip_entry->ol_lb->common);
+ return 0;
}
nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH;
@@ -3500,20 +3505,6 @@ static int mlxsw_sp_fib_lpm_tree_link(struct mlxsw_sp *mlxsw_sp,
static void mlxsw_sp_fib_lpm_tree_unlink(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_fib *fib)
{
- struct mlxsw_sp_prefix_usage req_prefix_usage = {{ 0 } };
- struct mlxsw_sp_lpm_tree *lpm_tree;
-
- /* Aggregate prefix lengths across all virtual routers to make
- * sure we only have used prefix lengths in the LPM tree.
- */
- mlxsw_sp_vrs_prefixes(mlxsw_sp, fib->proto, &req_prefix_usage);
- lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage,
- fib->proto);
- if (IS_ERR(lpm_tree))
- goto err_tree_get;
- mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree);
-
-err_tree_get:
if (!mlxsw_sp_prefix_usage_none(&fib->prefix_usage))
return;
mlxsw_sp_vr_lpm_tree_unbind(mlxsw_sp, fib);
@@ -4009,7 +4000,11 @@ static int mlxsw_sp_nexthop6_type_init(struct mlxsw_sp *mlxsw_sp,
router->ipip_ops_arr[ipipt]->can_offload(mlxsw_sp, dev,
MLXSW_SP_L3_PROTO_IPV6)) {
nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP;
- return mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev);
+ err = mlxsw_sp_nexthop_ipip_init(mlxsw_sp, ipipt, nh, dev);
+ if (err)
+ return err;
+ mlxsw_sp_nexthop_rif_init(nh, &nh->ipip_entry->ol_lb->common);
+ return 0;
}
nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH;
@@ -4868,7 +4863,8 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
struct fib_notifier_info *info = ptr;
struct mlxsw_sp_router *router;
- if (!net_eq(info->net, &init_net))
+ if (!net_eq(info->net, &init_net) ||
+ (info->family != AF_INET && info->family != AF_INET6))
return NOTIFY_DONE;
fib_work = kzalloc(sizeof(*fib_work), GFP_ATOMIC);
@@ -5067,6 +5063,7 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN);
if (IS_ERR(vr))
return ERR_CAST(vr);
+ vr->rif_count++;
err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index);
if (err)
@@ -5098,7 +5095,6 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
mlxsw_sp_rif_counters_alloc(rif);
mlxsw_sp->router->rifs[rif_index] = rif;
- vr->rif_count++;
return rif;
@@ -5109,6 +5105,7 @@ err_fid_get:
kfree(rif);
err_rif_alloc:
err_rif_index_alloc:
+ vr->rif_count--;
mlxsw_sp_vr_put(vr);
return ERR_PTR(err);
}
@@ -5123,7 +5120,6 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
mlxsw_sp_router_rif_gone_sync(mlxsw_sp, rif);
vr = &mlxsw_sp->router->vrs[rif->vr_id];
- vr->rif_count--;
mlxsw_sp->router->rifs[rif->rif_index] = NULL;
mlxsw_sp_rif_counters_free(rif);
ops->deconfigure(rif);
@@ -5131,6 +5127,7 @@ void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif)
/* Loopback RIFs are not associated with a FID. */
mlxsw_sp_fid_put(fid);
kfree(rif);
+ vr->rif_count--;
mlxsw_sp_vr_put(vr);
}
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c
index d396183108f7..a18b4d2b1d3e 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c
@@ -44,6 +44,16 @@
#include "../nfp_net.h"
#include "../nfp_port.h"
+#define NFP_FLOWER_WHITELIST_DISSECTOR \
+ (BIT(FLOW_DISSECTOR_KEY_CONTROL) | \
+ BIT(FLOW_DISSECTOR_KEY_BASIC) | \
+ BIT(FLOW_DISSECTOR_KEY_IPV4_ADDRS) | \
+ BIT(FLOW_DISSECTOR_KEY_IPV6_ADDRS) | \
+ BIT(FLOW_DISSECTOR_KEY_PORTS) | \
+ BIT(FLOW_DISSECTOR_KEY_ETH_ADDRS) | \
+ BIT(FLOW_DISSECTOR_KEY_VLAN) | \
+ BIT(FLOW_DISSECTOR_KEY_IP))
+
static int
nfp_flower_xmit_flow(struct net_device *netdev,
struct nfp_fl_payload *nfp_flow, u8 mtype)
@@ -112,6 +122,9 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
u8 key_layer;
int key_size;
+ if (flow->dissector->used_keys & ~NFP_FLOWER_WHITELIST_DISSECTOR)
+ return -EOPNOTSUPP;
+
if (dissector_uses_key(flow->dissector,
FLOW_DISSECTOR_KEY_ENC_CONTROL)) {
struct flow_dissector_key_control *mask_enc_ctl =
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index f055b1774d65..f8fa63b66739 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -74,6 +74,45 @@ static const struct pci_device_id nfp_pci_device_ids[] = {
};
MODULE_DEVICE_TABLE(pci, nfp_pci_device_ids);
+static bool nfp_board_ready(struct nfp_pf *pf)
+{
+ const char *cp;
+ long state;
+ int err;
+
+ cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
+ if (!cp)
+ return false;
+
+ err = kstrtol(cp, 0, &state);
+ if (err < 0)
+ return false;
+
+ return state == 15;
+}
+
+static int nfp_pf_board_state_wait(struct nfp_pf *pf)
+{
+ const unsigned long wait_until = jiffies + 10 * HZ;
+
+ while (!nfp_board_ready(pf)) {
+ if (time_is_before_eq_jiffies(wait_until)) {
+ nfp_err(pf->cpp, "NFP board initialization timeout\n");
+ return -EINVAL;
+ }
+
+ nfp_info(pf->cpp, "waiting for board initialization\n");
+ if (msleep_interruptible(500))
+ return -ERESTARTSYS;
+
+ /* Refresh cached information */
+ kfree(pf->hwinfo);
+ pf->hwinfo = nfp_hwinfo_read(pf->cpp);
+ }
+
+ return 0;
+}
+
static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
{
int err;
@@ -312,6 +351,10 @@ static int nfp_nsp_init(struct pci_dev *pdev, struct nfp_pf *pf)
struct nfp_nsp *nsp;
int err;
+ err = nfp_resource_wait(pf->cpp, NFP_RESOURCE_NSP, 30);
+ if (err)
+ return err;
+
nsp = nfp_nsp_open(pf->cpp);
if (IS_ERR(nsp)) {
err = PTR_ERR(nsp);
@@ -425,6 +468,10 @@ static int nfp_pci_probe(struct pci_dev *pdev,
nfp_hwinfo_lookup(pf->hwinfo, "assembly.revision"),
nfp_hwinfo_lookup(pf->hwinfo, "cpld.version"));
+ err = nfp_pf_board_state_wait(pf);
+ if (err)
+ goto err_hwinfo_free;
+
err = devlink_register(devlink, &pdev->dev);
if (err)
goto err_hwinfo_free;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
index 5abb9ba31e7d..ff373acd28f3 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
@@ -64,23 +64,6 @@
#define NFP_PF_CSR_SLICE_SIZE (32 * 1024)
-static int nfp_is_ready(struct nfp_pf *pf)
-{
- const char *cp;
- long state;
- int err;
-
- cp = nfp_hwinfo_lookup(pf->hwinfo, "board.state");
- if (!cp)
- return 0;
-
- err = kstrtol(cp, 0, &state);
- if (err < 0)
- return 0;
-
- return state == 15;
-}
-
/**
* nfp_net_get_mac_addr() - Get the MAC address.
* @pf: NFP PF handle
@@ -725,12 +708,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics);
- /* Verify that the board has completed initialization */
- if (!nfp_is_ready(pf)) {
- nfp_err(pf->cpp, "NFP is not ready for NIC operation.\n");
- return -EINVAL;
- }
-
if (!pf->rtbl) {
nfp_err(pf->cpp, "No %s, giving up.\n",
pf->fw_loaded ? "symbol table" : "firmware found");
diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h
index 1a8d04a1e113..3ce51f03126f 100644
--- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h
+++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h
@@ -97,6 +97,8 @@ nfp_resource_acquire(struct nfp_cpp *cpp, const char *name);
void nfp_resource_release(struct nfp_resource *res);
+int nfp_resource_wait(struct nfp_cpp *cpp, const char *name, unsigned int secs);
+
u32 nfp_resource_cpp_id(struct nfp_resource *res);
const char *nfp_resource_name(struct nfp_resource *res);
diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c
index 072612263dab..b1dd13ff282b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c
+++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c
@@ -250,6 +250,51 @@ void nfp_resource_release(struct nfp_resource *res)
}
/**
+ * nfp_resource_wait() - Wait for resource to appear
+ * @cpp: NFP CPP handle
+ * @name: Name of the resource
+ * @secs: Number of seconds to wait
+ *
+ * Wait for resource to appear in the resource table, grab and release
+ * its lock. The wait is jiffies-based, don't expect fine granularity.
+ *
+ * Return: 0 on success, errno otherwise.
+ */
+int nfp_resource_wait(struct nfp_cpp *cpp, const char *name, unsigned int secs)
+{
+ unsigned long warn_at = jiffies + NFP_MUTEX_WAIT_FIRST_WARN * HZ;
+ unsigned long err_at = jiffies + secs * HZ;
+ struct nfp_resource *res;
+
+ while (true) {
+ res = nfp_resource_acquire(cpp, name);
+ if (!IS_ERR(res)) {
+ nfp_resource_release(res);
+ return 0;
+ }
+
+ if (PTR_ERR(res) != -ENOENT) {
+ nfp_err(cpp, "error waiting for resource %s: %ld\n",
+ name, PTR_ERR(res));
+ return PTR_ERR(res);
+ }
+ if (time_is_before_eq_jiffies(err_at)) {
+ nfp_err(cpp, "timeout waiting for resource %s\n", name);
+ return -ETIMEDOUT;
+ }
+ if (time_is_before_eq_jiffies(warn_at)) {
+ warn_at = jiffies + NFP_MUTEX_WAIT_NEXT_WARN * HZ;
+ nfp_info(cpp, "waiting for NFP resource %s\n", name);
+ }
+ if (msleep_interruptible(10)) {
+ nfp_err(cpp, "wait for resource %s interrupted\n",
+ name);
+ return -ERESTARTSYS;
+ }
+ }
+}
+
+/**
* nfp_resource_cpp_id() - Return the cpp_id of a resource handle
* @res: NFP Resource handle
*
diff --git a/drivers/net/ethernet/nuvoton/w90p910_ether.c b/drivers/net/ethernet/nuvoton/w90p910_ether.c
index 89ab786da25f..4a67c55aa9f1 100644
--- a/drivers/net/ethernet/nuvoton/w90p910_ether.c
+++ b/drivers/net/ethernet/nuvoton/w90p910_ether.c
@@ -11,6 +11,7 @@
#include <linux/module.h>
#include <linux/init.h>
+#include <linux/interrupt.h>
#include <linux/mii.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
index eaca4578435d..8f6ccc0c39e5 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
@@ -1244,7 +1244,6 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
if (!dcbx_info)
return -ENOMEM;
- memset(dcbx_info, 0, sizeof(*dcbx_info));
rc = qed_dcbx_query_params(p_hwfn, dcbx_info, QED_DCBX_OPERATIONAL_MIB);
if (rc) {
kfree(dcbx_info);
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c b/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c
index bbe24639aa5a..c8c6231b87f3 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-ethtool.c
@@ -88,6 +88,8 @@ static void emac_set_msglevel(struct net_device *netdev, u32 data)
static int emac_get_sset_count(struct net_device *netdev, int sset)
{
switch (sset) {
+ case ETH_SS_PRIV_FLAGS:
+ return 1;
case ETH_SS_STATS:
return EMAC_STATS_LEN;
default:
@@ -100,6 +102,10 @@ static void emac_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
unsigned int i;
switch (stringset) {
+ case ETH_SS_PRIV_FLAGS:
+ strcpy(data, "single-pause-mode");
+ break;
+
case ETH_SS_STATS:
for (i = 0; i < EMAC_STATS_LEN; i++) {
strlcpy(data, emac_ethtool_stat_strings[i],
@@ -230,6 +236,27 @@ static int emac_get_regs_len(struct net_device *netdev)
return EMAC_MAX_REG_SIZE * sizeof(u32);
}
+#define EMAC_PRIV_ENABLE_SINGLE_PAUSE BIT(0)
+
+static int emac_set_priv_flags(struct net_device *netdev, u32 flags)
+{
+ struct emac_adapter *adpt = netdev_priv(netdev);
+
+ adpt->single_pause_mode = !!(flags & EMAC_PRIV_ENABLE_SINGLE_PAUSE);
+
+ if (netif_running(netdev))
+ return emac_reinit_locked(adpt);
+
+ return 0;
+}
+
+static u32 emac_get_priv_flags(struct net_device *netdev)
+{
+ struct emac_adapter *adpt = netdev_priv(netdev);
+
+ return adpt->single_pause_mode ? EMAC_PRIV_ENABLE_SINGLE_PAUSE : 0;
+}
+
static const struct ethtool_ops emac_ethtool_ops = {
.get_link_ksettings = phy_ethtool_get_link_ksettings,
.set_link_ksettings = phy_ethtool_set_link_ksettings,
@@ -253,6 +280,9 @@ static const struct ethtool_ops emac_ethtool_ops = {
.get_regs_len = emac_get_regs_len,
.get_regs = emac_get_regs,
+
+ .set_priv_flags = emac_set_priv_flags,
+ .get_priv_flags = emac_get_priv_flags,
};
void emac_set_ethtool_ops(struct net_device *netdev)
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
index bcd4708b3745..3ed9033e56db 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
@@ -551,6 +551,28 @@ static void emac_mac_start(struct emac_adapter *adpt)
mac &= ~(HUGEN | VLAN_STRIP | TPAUSE | SIMR | HUGE | MULTI_ALL |
DEBUG_MODE | SINGLE_PAUSE_MODE);
+ /* Enable single-pause-frame mode if requested.
+ *
+ * If enabled, the EMAC will send a single pause frame when the RX
+ * queue is full. This normally leads to packet loss because
+ * the pause frame disables the remote MAC only for 33ms (the quanta),
+ * and then the remote MAC continues sending packets even though
+ * the RX queue is still full.
+ *
+ * If disabled, the EMAC sends a pause frame every 31ms until the RX
+ * queue is no longer full. Normally, this is the preferred
+ * method of operation. However, when the system is hung (e.g.
+ * cores are halted), the EMAC interrupt handler is never called
+ * and so the RX queue fills up quickly and stays full. The resuling
+ * non-stop "flood" of pause frames sometimes has the effect of
+ * disabling nearby switches. In some cases, other nearby switches
+ * are also affected, shutting down the entire network.
+ *
+ * The user can enable or disable single-pause-frame mode
+ * via ethtool.
+ */
+ mac |= adpt->single_pause_mode ? SINGLE_PAUSE_MODE : 0;
+
writel_relaxed(csr1, adpt->csr + EMAC_EMAC_WRAPPER_CSR1);
writel_relaxed(mac, adpt->base + EMAC_MAC_CTRL);
@@ -876,7 +898,8 @@ static void emac_mac_rx_descs_refill(struct emac_adapter *adpt,
curr_rxbuf->dma_addr =
dma_map_single(adpt->netdev->dev.parent, skb->data,
- curr_rxbuf->length, DMA_FROM_DEVICE);
+ adpt->rxbuf_size, DMA_FROM_DEVICE);
+
ret = dma_mapping_error(adpt->netdev->dev.parent,
curr_rxbuf->dma_addr);
if (ret) {
diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c b/drivers/net/ethernet/qualcomm/emac/emac.c
index 60850bfa3d32..759543512117 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac.c
@@ -443,6 +443,9 @@ static void emac_init_adapter(struct emac_adapter *adpt)
/* default to automatic flow control */
adpt->automatic = true;
+
+ /* Disable single-pause-frame mode by default */
+ adpt->single_pause_mode = false;
}
/* Get the clock */
diff --git a/drivers/net/ethernet/qualcomm/emac/emac.h b/drivers/net/ethernet/qualcomm/emac/emac.h
index 8ee4ec6aef2e..d7c9f44209d4 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac.h
+++ b/drivers/net/ethernet/qualcomm/emac/emac.h
@@ -363,6 +363,9 @@ struct emac_adapter {
bool tx_flow_control;
bool rx_flow_control;
+ /* True == use single-pause-frame mode. */
+ bool single_pause_mode;
+
/* Ring parameter */
u8 tpd_burst;
u8 rfd_burst;
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
index 98f22551eb45..1e33aea59f50 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
@@ -51,10 +51,7 @@ struct rmnet_walk_data {
static int rmnet_is_real_dev_registered(const struct net_device *real_dev)
{
- rx_handler_func_t *rx_handler;
-
- rx_handler = rcu_dereference(real_dev->rx_handler);
- return (rx_handler == rmnet_rx_handler);
+ return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler;
}
/* Needs rtnl lock */
diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
index ca22f2898664..d24b47b8e0b2 100644
--- a/drivers/net/ethernet/realtek/8139too.c
+++ b/drivers/net/ethernet/realtek/8139too.c
@@ -2135,11 +2135,12 @@ static int rtl8139_poll(struct napi_struct *napi, int budget)
if (likely(RTL_R16(IntrStatus) & RxAckBits))
work_done += rtl8139_rx(dev, tp, budget);
- if (work_done < budget && napi_complete_done(napi, work_done)) {
+ if (work_done < budget) {
unsigned long flags;
spin_lock_irqsave(&tp->lock, flags);
- RTL_W16_F(IntrMask, rtl8139_intr_mask);
+ if (napi_complete_done(napi, work_done))
+ RTL_W16_F(IntrMask, rtl8139_intr_mask);
spin_unlock_irqrestore(&tp->lock, flags);
}
spin_unlock(&tp->rx_lock);
diff --git a/drivers/net/ethernet/rocker/rocker_tlv.h b/drivers/net/ethernet/rocker/rocker_tlv.h
index a63ef82e7c72..dfae3c9d57c6 100644
--- a/drivers/net/ethernet/rocker/rocker_tlv.h
+++ b/drivers/net/ethernet/rocker/rocker_tlv.h
@@ -139,40 +139,52 @@ rocker_tlv_start(struct rocker_desc_info *desc_info)
int rocker_tlv_put(struct rocker_desc_info *desc_info,
int attrtype, int attrlen, const void *data);
-static inline int rocker_tlv_put_u8(struct rocker_desc_info *desc_info,
- int attrtype, u8 value)
+static inline int
+rocker_tlv_put_u8(struct rocker_desc_info *desc_info, int attrtype, u8 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &value);
+ u8 tmp = value; /* work around GCC PR81715 */
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &tmp);
}
-static inline int rocker_tlv_put_u16(struct rocker_desc_info *desc_info,
- int attrtype, u16 value)
+static inline int
+rocker_tlv_put_u16(struct rocker_desc_info *desc_info, int attrtype, u16 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &value);
+ u16 tmp = value;
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &tmp);
}
-static inline int rocker_tlv_put_be16(struct rocker_desc_info *desc_info,
- int attrtype, __be16 value)
+static inline int
+rocker_tlv_put_be16(struct rocker_desc_info *desc_info, int attrtype, __be16 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &value);
+ __be16 tmp = value;
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &tmp);
}
-static inline int rocker_tlv_put_u32(struct rocker_desc_info *desc_info,
- int attrtype, u32 value)
+static inline int
+rocker_tlv_put_u32(struct rocker_desc_info *desc_info, int attrtype, u32 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &value);
+ u32 tmp = value;
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &tmp);
}
-static inline int rocker_tlv_put_be32(struct rocker_desc_info *desc_info,
- int attrtype, __be32 value)
+static inline int
+rocker_tlv_put_be32(struct rocker_desc_info *desc_info, int attrtype, __be32 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &value);
+ __be32 tmp = value;
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &tmp);
}
-static inline int rocker_tlv_put_u64(struct rocker_desc_info *desc_info,
- int attrtype, u64 value)
+static inline int
+rocker_tlv_put_u64(struct rocker_desc_info *desc_info, int attrtype, u64 value)
{
- return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &value);
+ u64 tmp = value;
+
+ return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &tmp);
}
static inline struct rocker_tlv *
diff --git a/drivers/net/ethernet/seeq/sgiseeq.c b/drivers/net/ethernet/seeq/sgiseeq.c
index 70347720fdf9..573691bc3b71 100644
--- a/drivers/net/ethernet/seeq/sgiseeq.c
+++ b/drivers/net/ethernet/seeq/sgiseeq.c
@@ -737,8 +737,8 @@ static int sgiseeq_probe(struct platform_device *pdev)
sp = netdev_priv(dev);
/* Make private data page aligned */
- sr = dma_alloc_noncoherent(&pdev->dev, sizeof(*sp->srings),
- &sp->srings_dma, GFP_KERNEL);
+ sr = dma_alloc_attrs(&pdev->dev, sizeof(*sp->srings), &sp->srings_dma,
+ GFP_KERNEL, DMA_ATTR_NON_CONSISTENT);
if (!sr) {
printk(KERN_ERR "Sgiseeq: Page alloc failed, aborting.\n");
err = -ENOMEM;
@@ -813,8 +813,8 @@ static int sgiseeq_remove(struct platform_device *pdev)
struct sgiseeq_private *sp = netdev_priv(dev);
unregister_netdev(dev);
- dma_free_noncoherent(&pdev->dev, sizeof(*sp->srings), sp->srings,
- sp->srings_dma);
+ dma_free_attrs(&pdev->dev, sizeof(*sp->srings), sp->srings,
+ sp->srings_dma, DMA_ATTR_NON_CONSISTENT);
free_netdev(dev);
return 0;
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
index 0b6a39b003a4..012fb66eed8d 100644
--- a/drivers/net/ethernet/smsc/smsc911x.c
+++ b/drivers/net/ethernet/smsc/smsc911x.c
@@ -2595,6 +2595,11 @@ static int smsc911x_suspend(struct device *dev)
struct net_device *ndev = dev_get_drvdata(dev);
struct smsc911x_data *pdata = netdev_priv(ndev);
+ if (netif_running(ndev)) {
+ netif_stop_queue(ndev);
+ netif_device_detach(ndev);
+ }
+
/* enable wake on LAN, energy detection and the external PME
* signal. */
smsc911x_reg_write(pdata, PMT_CTRL,
@@ -2628,7 +2633,15 @@ static int smsc911x_resume(struct device *dev)
while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to)
udelay(1000);
- return (to == 0) ? -EIO : 0;
+ if (to == 0)
+ return -EIO;
+
+ if (netif_running(ndev)) {
+ netif_device_attach(ndev);
+ netif_start_queue(ndev);
+ }
+
+ return 0;
}
static const struct dev_pm_ops smsc911x_pm_ops = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
index dd6a2f9791cc..5efef8001edf 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
@@ -511,6 +511,7 @@ static struct platform_driver dwc_eth_dwmac_driver = {
.remove = dwc_eth_dwmac_remove,
.driver = {
.name = "dwc-eth-dwmac",
+ .pm = &stmmac_pltfr_pm_ops,
.of_match_table = dwc_eth_dwmac_match,
},
};
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 99823f54696a..13133b30b575 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -83,6 +83,117 @@ struct rk_priv_data {
(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
+#define RK3128_GRF_MAC_CON0 0x0168
+#define RK3128_GRF_MAC_CON1 0x016c
+
+/* RK3128_GRF_MAC_CON0 */
+#define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
+#define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
+#define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
+#define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
+#define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
+#define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
+
+/* RK3128_GRF_MAC_CON1 */
+#define RK3128_GMAC_PHY_INTF_SEL_RGMII \
+ (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
+#define RK3128_GMAC_PHY_INTF_SEL_RMII \
+ (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
+#define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
+#define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
+#define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
+#define RK3128_GMAC_SPEED_100M GRF_BIT(10)
+#define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
+#define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
+#define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
+#define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
+#define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
+#define RK3128_GMAC_RMII_MODE GRF_BIT(14)
+#define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
+
+static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ int tx_delay, int rx_delay)
+{
+ struct device *dev = &bsp_priv->pdev->dev;
+
+ if (IS_ERR(bsp_priv->grf)) {
+ dev_err(dev, "Missing rockchip,grf property\n");
+ return;
+ }
+
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_PHY_INTF_SEL_RGMII |
+ RK3128_GMAC_RMII_MODE_CLR);
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
+ DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
+ RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
+ RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
+}
+
+static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
+{
+ struct device *dev = &bsp_priv->pdev->dev;
+
+ if (IS_ERR(bsp_priv->grf)) {
+ dev_err(dev, "Missing rockchip,grf property\n");
+ return;
+ }
+
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
+}
+
+static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
+{
+ struct device *dev = &bsp_priv->pdev->dev;
+
+ if (IS_ERR(bsp_priv->grf)) {
+ dev_err(dev, "Missing rockchip,grf property\n");
+ return;
+ }
+
+ if (speed == 10)
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_CLK_2_5M);
+ else if (speed == 100)
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_CLK_25M);
+ else if (speed == 1000)
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_CLK_125M);
+ else
+ dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
+}
+
+static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
+{
+ struct device *dev = &bsp_priv->pdev->dev;
+
+ if (IS_ERR(bsp_priv->grf)) {
+ dev_err(dev, "Missing rockchip,grf property\n");
+ return;
+ }
+
+ if (speed == 10) {
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_RMII_CLK_2_5M |
+ RK3128_GMAC_SPEED_10M);
+ } else if (speed == 100) {
+ regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ RK3128_GMAC_RMII_CLK_25M |
+ RK3128_GMAC_SPEED_100M);
+ } else {
+ dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
+ }
+}
+
+static const struct rk_gmac_ops rk3128_ops = {
+ .set_to_rgmii = rk3128_set_to_rgmii,
+ .set_to_rmii = rk3128_set_to_rmii,
+ .set_rgmii_speed = rk3128_set_rgmii_speed,
+ .set_rmii_speed = rk3128_set_rmii_speed,
+};
+
#define RK3228_GRF_MAC_CON0 0x0900
#define RK3228_GRF_MAC_CON1 0x0904
@@ -1313,6 +1424,7 @@ static int rk_gmac_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
static const struct of_device_id rk_gmac_dwmac_match[] = {
+ { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
{ .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
{ .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
{ .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
index c4407e8e39a3..2f7d7ec59962 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
@@ -296,6 +296,7 @@ static void dwmac4_pmt(struct mac_device_info *hw, unsigned long mode)
{
void __iomem *ioaddr = hw->pcsr;
unsigned int pmt = 0;
+ u32 config;
if (mode & WAKE_MAGIC) {
pr_debug("GMAC: WOL Magic frame\n");
@@ -306,6 +307,12 @@ static void dwmac4_pmt(struct mac_device_info *hw, unsigned long mode)
pmt |= power_down | global_unicast | wake_up_frame_en;
}
+ if (pmt) {
+ /* The receiver must be enabled for WOL before powering down */
+ config = readl(ioaddr + GMAC_CONFIG);
+ config |= GMAC_CONFIG_RE;
+ writel(config, ioaddr + GMAC_CONFIG);
+ }
writel(pmt, ioaddr + GMAC_PMT);
}
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index a366b3747eeb..8a280b48e3a9 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -315,6 +315,7 @@ static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
{ .compatible = "allwinner,sun8i-h3-emac" },
{ .compatible = "allwinner,sun8i-v3s-emac" },
{ .compatible = "allwinner,sun50i-a64-emac" },
+ {},
};
/* If phy-handle property is passed from DT, use it as the PHY */
diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c
index acd29d60174a..83e6f76eb965 100644
--- a/drivers/net/ethernet/via/via-rhine.c
+++ b/drivers/net/ethernet/via/via-rhine.c
@@ -2598,7 +2598,7 @@ static struct platform_driver rhine_driver_platform = {
}
};
-static struct dmi_system_id rhine_dmi_table[] __initdata = {
+static const struct dmi_system_id rhine_dmi_table[] __initconst = {
{
.ident = "EPIA-M",
.matches = {
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index ec546da86683..5176be76ca7d 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -150,6 +150,8 @@ struct netvsc_device_info {
u32 num_chn;
u32 send_sections;
u32 recv_sections;
+ u32 send_section_size;
+ u32 recv_section_size;
};
enum rndis_device_state {
@@ -204,6 +206,8 @@ int netvsc_recv_callback(struct net_device *net,
const struct ndis_pkt_8021q_info *vlan);
void netvsc_channel_cb(void *context);
int netvsc_poll(struct napi_struct *napi, int budget);
+
+void rndis_set_subchannel(struct work_struct *w);
bool rndis_filter_opened(const struct netvsc_device *nvdev);
int rndis_filter_open(struct netvsc_device *nvdev);
int rndis_filter_close(struct netvsc_device *nvdev);
@@ -782,6 +786,7 @@ struct netvsc_device {
u32 num_chn;
atomic_t open_chn;
+ struct work_struct subchan_work;
wait_queue_head_t subchan_open;
struct rndis_device *extension;
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 0062b802676f..8d5077fb0492 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -76,11 +76,9 @@ static struct netvsc_device *alloc_net_device(void)
net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT;
net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT;
- net_device->recv_section_size = NETVSC_RECV_SECTION_SIZE;
- net_device->send_section_size = NETVSC_SEND_SECTION_SIZE;
-
init_completion(&net_device->channel_init_wait);
init_waitqueue_head(&net_device->subchan_open);
+ INIT_WORK(&net_device->subchan_work, rndis_set_subchannel);
return net_device;
}
@@ -261,7 +259,7 @@ static int netvsc_init_buf(struct hv_device *device,
int ret = 0;
/* Get receive buffer area. */
- buf_size = device_info->recv_sections * net_device->recv_section_size;
+ buf_size = device_info->recv_sections * device_info->recv_section_size;
buf_size = roundup(buf_size, PAGE_SIZE);
net_device->recv_buf = vzalloc(buf_size);
@@ -343,7 +341,7 @@ static int netvsc_init_buf(struct hv_device *device,
goto cleanup;
/* Now setup the send buffer. */
- buf_size = device_info->send_sections * net_device->send_section_size;
+ buf_size = device_info->send_sections * device_info->send_section_size;
buf_size = round_up(buf_size, PAGE_SIZE);
net_device->send_buf = vzalloc(buf_size);
@@ -557,6 +555,8 @@ void netvsc_device_remove(struct hv_device *device)
= rtnl_dereference(net_device_ctx->nvdev);
int i;
+ cancel_work_sync(&net_device->subchan_work);
+
netvsc_disconnect_vsp(device);
RCU_INIT_POINTER(net_device_ctx->nvdev, NULL);
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 165ba4b3b423..a32ae02e1b6c 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -49,7 +49,7 @@
#define NETVSC_MIN_TX_SECTIONS 10
#define NETVSC_DEFAULT_TX 192 /* ~1M */
#define NETVSC_MIN_RX_SECTIONS 10 /* ~64K */
-#define NETVSC_DEFAULT_RX 2048 /* ~4M */
+#define NETVSC_DEFAULT_RX 10485 /* Max ~16M */
#define LINKCHANGE_INT (2 * HZ)
#define VF_TAKEOVER_INT (HZ / 10)
@@ -848,15 +848,14 @@ static int netvsc_set_channels(struct net_device *net,
device_info.num_chn = count;
device_info.ring_size = ring_size;
device_info.send_sections = nvdev->send_section_cnt;
+ device_info.send_section_size = nvdev->send_section_size;
device_info.recv_sections = nvdev->recv_section_cnt;
+ device_info.recv_section_size = nvdev->recv_section_size;
rndis_filter_device_remove(dev, nvdev);
nvdev = rndis_filter_device_add(dev, &device_info);
- if (!IS_ERR(nvdev)) {
- netif_set_real_num_tx_queues(net, nvdev->num_chn);
- netif_set_real_num_rx_queues(net, nvdev->num_chn);
- } else {
+ if (IS_ERR(nvdev)) {
ret = PTR_ERR(nvdev);
device_info.num_chn = orig;
nvdev = rndis_filter_device_add(dev, &device_info);
@@ -966,7 +965,9 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
device_info.ring_size = ring_size;
device_info.num_chn = nvdev->num_chn;
device_info.send_sections = nvdev->send_section_cnt;
+ device_info.send_section_size = nvdev->send_section_size;
device_info.recv_sections = nvdev->recv_section_cnt;
+ device_info.recv_section_size = nvdev->recv_section_size;
rndis_filter_device_remove(hdev, nvdev);
@@ -1488,7 +1489,9 @@ static int netvsc_set_ringparam(struct net_device *ndev,
device_info.num_chn = nvdev->num_chn;
device_info.ring_size = ring_size;
device_info.send_sections = new_tx;
+ device_info.send_section_size = nvdev->send_section_size;
device_info.recv_sections = new_rx;
+ device_info.recv_section_size = nvdev->recv_section_size;
netif_device_detach(ndev);
was_opened = rndis_filter_opened(nvdev);
@@ -1937,7 +1940,9 @@ static int netvsc_probe(struct hv_device *dev,
device_info.ring_size = ring_size;
device_info.num_chn = VRSS_CHANNEL_DEFAULT;
device_info.send_sections = NETVSC_DEFAULT_TX;
+ device_info.send_section_size = NETVSC_SEND_SECTION_SIZE;
device_info.recv_sections = NETVSC_DEFAULT_RX;
+ device_info.recv_section_size = NETVSC_RECV_SECTION_SIZE;
nvdev = rndis_filter_device_add(dev, &device_info);
if (IS_ERR(nvdev)) {
@@ -1954,9 +1959,6 @@ static int netvsc_probe(struct hv_device *dev,
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
net->vlan_features = net->features;
- netif_set_real_num_tx_queues(net, nvdev->num_chn);
- netif_set_real_num_rx_queues(net, nvdev->num_chn);
-
netdev_lockdep_set_classes(net);
/* MTU range: 68 - 1500 or 65521 */
@@ -2012,9 +2014,10 @@ static int netvsc_remove(struct hv_device *dev)
if (vf_netdev)
netvsc_unregister_vf(vf_netdev);
+ unregister_netdevice(net);
+
rndis_filter_device_remove(dev,
rtnl_dereference(ndev_ctx->nvdev));
- unregister_netdevice(net);
rtnl_unlock();
hv_set_drvdata(dev, NULL);
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 69c40b8fccc3..065b204d8e17 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -1039,8 +1039,6 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)
/* Set the channel before opening.*/
nvchan->channel = new_sc;
- netif_napi_add(ndev, &nvchan->napi,
- netvsc_poll, NAPI_POLL_WEIGHT);
ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
nvscdev->ring_size * PAGE_SIZE, NULL, 0,
@@ -1048,10 +1046,86 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)
if (ret == 0)
napi_enable(&nvchan->napi);
else
- netif_napi_del(&nvchan->napi);
+ netdev_notice(ndev, "sub channel open failed: %d\n", ret);
- atomic_inc(&nvscdev->open_chn);
- wake_up(&nvscdev->subchan_open);
+ if (atomic_inc_return(&nvscdev->open_chn) == nvscdev->num_chn)
+ wake_up(&nvscdev->subchan_open);
+}
+
+/* Open sub-channels after completing the handling of the device probe.
+ * This breaks overlap of processing the host message for the
+ * new primary channel with the initialization of sub-channels.
+ */
+void rndis_set_subchannel(struct work_struct *w)
+{
+ struct netvsc_device *nvdev
+ = container_of(w, struct netvsc_device, subchan_work);
+ struct nvsp_message *init_packet = &nvdev->channel_init_pkt;
+ struct net_device_context *ndev_ctx;
+ struct rndis_device *rdev;
+ struct net_device *ndev;
+ struct hv_device *hv_dev;
+ int i, ret;
+
+ if (!rtnl_trylock()) {
+ schedule_work(w);
+ return;
+ }
+
+ rdev = nvdev->extension;
+ if (!rdev)
+ goto unlock; /* device was removed */
+
+ ndev = rdev->ndev;
+ ndev_ctx = netdev_priv(ndev);
+ hv_dev = ndev_ctx->device_ctx;
+
+ memset(init_packet, 0, sizeof(struct nvsp_message));
+ init_packet->hdr.msg_type = NVSP_MSG5_TYPE_SUBCHANNEL;
+ init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE;
+ init_packet->msg.v5_msg.subchn_req.num_subchannels =
+ nvdev->num_chn - 1;
+ ret = vmbus_sendpacket(hv_dev->channel, init_packet,
+ sizeof(struct nvsp_message),
+ (unsigned long)init_packet,
+ VM_PKT_DATA_INBAND,
+ VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
+ if (ret) {
+ netdev_err(ndev, "sub channel allocate send failed: %d\n", ret);
+ goto failed;
+ }
+
+ wait_for_completion(&nvdev->channel_init_wait);
+ if (init_packet->msg.v5_msg.subchn_comp.status != NVSP_STAT_SUCCESS) {
+ netdev_err(ndev, "sub channel request failed\n");
+ goto failed;
+ }
+
+ nvdev->num_chn = 1 +
+ init_packet->msg.v5_msg.subchn_comp.num_subchannels;
+
+ /* wait for all sub channels to open */
+ wait_event(nvdev->subchan_open,
+ atomic_read(&nvdev->open_chn) == nvdev->num_chn);
+
+ /* ignore failues from setting rss parameters, still have channels */
+ rndis_filter_set_rss_param(rdev, netvsc_hash_key);
+
+ netif_set_real_num_tx_queues(ndev, nvdev->num_chn);
+ netif_set_real_num_rx_queues(ndev, nvdev->num_chn);
+
+ rtnl_unlock();
+ return;
+
+failed:
+ /* fallback to only primary channel */
+ for (i = 1; i < nvdev->num_chn; i++)
+ netif_napi_del(&nvdev->chan_table[i].napi);
+
+ nvdev->max_chn = 1;
+ nvdev->num_chn = 1;
+unlock:
+ rtnl_unlock();
}
struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
@@ -1063,7 +1137,6 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
struct rndis_device *rndis_device;
struct ndis_offload hwcaps;
struct ndis_offload_params offloads;
- struct nvsp_message *init_packet;
struct ndis_recv_scale_cap rsscap;
u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
unsigned int gso_max_size = GSO_MAX_SIZE;
@@ -1215,9 +1288,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
net_device->num_chn);
atomic_set(&net_device->open_chn, 1);
-
- if (net_device->num_chn == 1)
- return net_device;
+ vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
for (i = 1; i < net_device->num_chn; i++) {
ret = netvsc_alloc_recv_comp_ring(net_device, i);
@@ -1228,38 +1299,15 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
}
}
- vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
+ for (i = 1; i < net_device->num_chn; i++)
+ netif_napi_add(net, &net_device->chan_table[i].napi,
+ netvsc_poll, NAPI_POLL_WEIGHT);
- init_packet = &net_device->channel_init_pkt;
- memset(init_packet, 0, sizeof(struct nvsp_message));
- init_packet->hdr.msg_type = NVSP_MSG5_TYPE_SUBCHANNEL;
- init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE;
- init_packet->msg.v5_msg.subchn_req.num_subchannels =
- net_device->num_chn - 1;
- ret = vmbus_sendpacket(dev->channel, init_packet,
- sizeof(struct nvsp_message),
- (unsigned long)init_packet,
- VM_PKT_DATA_INBAND,
- VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
- if (ret)
- goto out;
-
- wait_for_completion(&net_device->channel_init_wait);
- if (init_packet->msg.v5_msg.subchn_comp.status != NVSP_STAT_SUCCESS) {
- ret = -ENODEV;
- goto out;
- }
+ if (net_device->num_chn > 1)
+ schedule_work(&net_device->subchan_work);
- net_device->num_chn = 1 +
- init_packet->msg.v5_msg.subchn_comp.num_subchannels;
-
- /* wait for all sub channels to open */
- wait_event(net_device->subchan_open,
- atomic_read(&net_device->open_chn) == net_device->num_chn);
-
- /* ignore failues from setting rss parameters, still have channels */
- rndis_filter_set_rss_param(rndis_device, netvsc_hash_key);
out:
+ /* if unavailable, just proceed with one queue */
if (ret) {
net_device->max_chn = 1;
net_device->num_chn = 1;
@@ -1280,10 +1328,10 @@ void rndis_filter_device_remove(struct hv_device *dev,
/* Halt and release the rndis device */
rndis_filter_halt_device(rndis_dev);
- kfree(rndis_dev);
net_dev->extension = NULL;
netvsc_device_remove(dev);
+ kfree(rndis_dev);
}
int rndis_filter_open(struct netvsc_device *nvdev)
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index a9d16a3af514..cd931cf9dcc2 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -160,15 +160,6 @@ config MDIO_XGENE
endif
-menuconfig PHYLIB
- tristate "PHY Device support and infrastructure"
- depends on NETDEVICES
- select MDIO_DEVICE
- help
- Ethernet controllers are usually attached to PHY
- devices. This option provides infrastructure for
- managing PHY devices.
-
config PHYLINK
tristate
depends on NETDEVICES
@@ -179,6 +170,15 @@ config PHYLINK
configuration links, PHYs, and Serdes links with MAC level
autonegotiation modes.
+menuconfig PHYLIB
+ tristate "PHY Device support and infrastructure"
+ depends on NETDEVICES
+ select MDIO_DEVICE
+ help
+ Ethernet controllers are usually attached to PHY
+ devices. This option provides infrastructure for
+ managing PHY devices.
+
if PHYLIB
config SWPHY
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index e842d2cd1ee7..2b1e67bc1e73 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -373,7 +373,8 @@ void phy_ethtool_ksettings_get(struct phy_device *phydev,
cmd->base.port = PORT_BNC;
else
cmd->base.port = PORT_MII;
-
+ cmd->base.transceiver = phy_is_internal(phydev) ?
+ XCVR_INTERNAL : XCVR_EXTERNAL;
cmd->base.phy_address = phydev->mdio.addr;
cmd->base.autoneg = phydev->autoneg;
cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl;
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 8cf0c5901f95..67f25ac29025 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -879,7 +879,7 @@ void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
{
const char *drv_name = phydev->drv ? phydev->drv->name : "unbound";
char *irq_str;
- char irq_num[4];
+ char irq_num[8];
switch(phydev->irq) {
case PHY_POLL:
diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c
index d15dd3938ba8..2e5150b0b8d5 100644
--- a/drivers/net/phy/xilinx_gmii2rgmii.c
+++ b/drivers/net/phy/xilinx_gmii2rgmii.c
@@ -44,7 +44,7 @@ static int xgmiitorgmii_read_status(struct phy_device *phydev)
priv->phy_drv->read_status(phydev);
val = mdiobus_read(phydev->mdio.bus, priv->addr, XILINX_GMII2RGMII_REG);
- val &= XILINX_GMII2RGMII_SPEED_MASK;
+ val &= ~XILINX_GMII2RGMII_SPEED_MASK;
if (phydev->speed == SPEED_1000)
val |= BMCR_SPEED1000;
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index a404552555d4..e365866600ba 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -120,7 +120,7 @@ struct ppp {
int n_channels; /* how many channels are attached 54 */
spinlock_t rlock; /* lock for receive side 58 */
spinlock_t wlock; /* lock for transmit side 5c */
- int *xmit_recursion __percpu; /* xmit recursion detect */
+ int __percpu *xmit_recursion; /* xmit recursion detect */
int mru; /* max receive unit 60 */
unsigned int flags; /* control bits 64 */
unsigned int xstate; /* transmit state bits 68 */
@@ -1339,7 +1339,17 @@ ppp_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats64)
static int ppp_dev_init(struct net_device *dev)
{
+ struct ppp *ppp;
+
netdev_lockdep_set_classes(dev);
+
+ ppp = netdev_priv(dev);
+ /* Let the netdevice take a reference on the ppp file. This ensures
+ * that ppp_destroy_interface() won't run before the device gets
+ * unregistered.
+ */
+ atomic_inc(&ppp->file.refcnt);
+
return 0;
}
@@ -1362,6 +1372,15 @@ static void ppp_dev_uninit(struct net_device *dev)
wake_up_interruptible(&ppp->file.rwait);
}
+static void ppp_dev_priv_destructor(struct net_device *dev)
+{
+ struct ppp *ppp;
+
+ ppp = netdev_priv(dev);
+ if (atomic_dec_and_test(&ppp->file.refcnt))
+ ppp_destroy_interface(ppp);
+}
+
static const struct net_device_ops ppp_netdev_ops = {
.ndo_init = ppp_dev_init,
.ndo_uninit = ppp_dev_uninit,
@@ -1387,6 +1406,7 @@ static void ppp_setup(struct net_device *dev)
dev->tx_queue_len = 3;
dev->type = ARPHRD_PPP;
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
+ dev->priv_destructor = ppp_dev_priv_destructor;
netif_keep_dst(dev);
}
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 3c9985f29950..5ce580f413b9 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1496,11 +1496,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
switch (tun->flags & TUN_TYPE_MASK) {
case IFF_TUN:
if (tun->flags & IFF_NO_PI) {
- switch (skb->data[0] & 0xf0) {
- case 0x40:
+ u8 ip_version = skb->len ? (skb->data[0] >> 4) : 0;
+
+ switch (ip_version) {
+ case 4:
pi.proto = htons(ETH_P_IP);
break;
- case 0x60:
+ case 6:
pi.proto = htons(ETH_P_IPV6);
break;
default:
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 8ab281b478f2..29c7e2ec0dcb 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -54,11 +54,19 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc)
desc->bInterfaceProtocol == 3);
}
+static int is_novatel_rndis(struct usb_interface_descriptor *desc)
+{
+ return (desc->bInterfaceClass == USB_CLASS_MISC &&
+ desc->bInterfaceSubClass == 4 &&
+ desc->bInterfaceProtocol == 1);
+}
+
#else
#define is_rndis(desc) 0
#define is_activesync(desc) 0
#define is_wireless_rndis(desc) 0
+#define is_novatel_rndis(desc) 0
#endif
@@ -150,7 +158,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
*/
rndis = (is_rndis(&intf->cur_altsetting->desc) ||
is_activesync(&intf->cur_altsetting->desc) ||
- is_wireless_rndis(&intf->cur_altsetting->desc));
+ is_wireless_rndis(&intf->cur_altsetting->desc) ||
+ is_novatel_rndis(&intf->cur_altsetting->desc));
memset(info, 0, sizeof(*info));
info->control = intf;
@@ -547,6 +556,7 @@ static const struct driver_info wwan_info = {
#define REALTEK_VENDOR_ID 0x0bda
#define SAMSUNG_VENDOR_ID 0x04e8
#define LENOVO_VENDOR_ID 0x17ef
+#define LINKSYS_VENDOR_ID 0x13b1
#define NVIDIA_VENDOR_ID 0x0955
#define HP_VENDOR_ID 0x03f0
#define MICROSOFT_VENDOR_ID 0x045e
@@ -737,6 +747,15 @@ static const struct usb_device_id products[] = {
.driver_info = 0,
},
+#if IS_ENABLED(CONFIG_USB_RTL8152)
+/* Linksys USB3GIGV1 Ethernet Adapter */
+{
+ USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+ .driver_info = 0,
+},
+#endif
+
/* ThinkPad USB-C Dock (based on Realtek RTL8153) */
{
USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index b99a7fb09f8e..0161f77641fa 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -1265,30 +1265,45 @@ static int lan78xx_ethtool_get_eeprom(struct net_device *netdev,
struct ethtool_eeprom *ee, u8 *data)
{
struct lan78xx_net *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = usb_autopm_get_interface(dev->intf);
+ if (ret)
+ return ret;
ee->magic = LAN78XX_EEPROM_MAGIC;
- return lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data);
+ ret = lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data);
+
+ usb_autopm_put_interface(dev->intf);
+
+ return ret;
}
static int lan78xx_ethtool_set_eeprom(struct net_device *netdev,
struct ethtool_eeprom *ee, u8 *data)
{
struct lan78xx_net *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = usb_autopm_get_interface(dev->intf);
+ if (ret)
+ return ret;
- /* Allow entire eeprom update only */
- if ((ee->magic == LAN78XX_EEPROM_MAGIC) &&
- (ee->offset == 0) &&
- (ee->len == 512) &&
- (data[0] == EEPROM_INDICATOR))
- return lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data);
+ /* Invalid EEPROM_INDICATOR at offset zero will result in a failure
+ * to load data from EEPROM
+ */
+ if (ee->magic == LAN78XX_EEPROM_MAGIC)
+ ret = lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data);
else if ((ee->magic == LAN78XX_OTP_MAGIC) &&
(ee->offset == 0) &&
(ee->len == 512) &&
(data[0] == OTP_INDICATOR_1))
- return lan78xx_write_raw_otp(dev, ee->offset, ee->len, data);
+ ret = lan78xx_write_raw_otp(dev, ee->offset, ee->len, data);
+
+ usb_autopm_put_interface(dev->intf);
- return -EINVAL;
+ return ret;
}
static void lan78xx_get_strings(struct net_device *netdev, u32 stringset,
@@ -2434,7 +2449,6 @@ static int lan78xx_reset(struct lan78xx_net *dev)
/* LAN7801 only has RGMII mode */
if (dev->chipid == ID_REV_CHIP_ID_7801_)
buf &= ~MAC_CR_GMII_EN_;
- buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_;
ret = lan78xx_write_reg(dev, MAC_CR, buf);
ret = lan78xx_read_reg(dev, MAC_TX, &buf);
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index ceb78e2ea4f0..941ece08ba78 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -613,6 +613,7 @@ enum rtl8152_flags {
#define VENDOR_ID_MICROSOFT 0x045e
#define VENDOR_ID_SAMSUNG 0x04e8
#define VENDOR_ID_LENOVO 0x17ef
+#define VENDOR_ID_LINKSYS 0x13b1
#define VENDOR_ID_NVIDIA 0x0955
#define MCU_TYPE_PLA 0x0100
@@ -5316,6 +5317,7 @@ static const struct usb_device_id rtl8152_table[] = {
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)},
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c)},
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214)},
+ {REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)},
{REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff)},
{}
};
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
index a151f267aebb..b807c91abe1d 100644
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -632,6 +632,10 @@ static const struct usb_device_id products [] = {
/* RNDIS for tethering */
USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
.driver_info = (unsigned long) &rndis_info,
+}, {
+ /* Novatel Verizon USB730L */
+ USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),
+ .driver_info = (unsigned long) &rndis_info,
},
{ }, // END
};
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 340c13484e5c..309b88acd3d0 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -526,7 +526,7 @@ static void smsc95xx_set_multicast(struct net_device *netdev)
static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
u16 lcladv, u16 rmtadv)
{
- u32 flow, afc_cfg = 0;
+ u32 flow = 0, afc_cfg;
int ret = smsc95xx_read_reg(dev, AFC_CFG, &afc_cfg);
if (ret < 0)
@@ -537,20 +537,19 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
if (cap & FLOW_CTRL_RX)
flow = 0xFFFF0002;
- else
- flow = 0;
- if (cap & FLOW_CTRL_TX)
+ if (cap & FLOW_CTRL_TX) {
afc_cfg |= 0xF;
- else
+ flow |= 0xFFFF0000;
+ } else {
afc_cfg &= ~0xF;
+ }
netif_dbg(dev, link, dev->net, "rx pause %s, tx pause %s\n",
cap & FLOW_CTRL_RX ? "enabled" : "disabled",
cap & FLOW_CTRL_TX ? "enabled" : "disabled");
} else {
netif_dbg(dev, link, dev->net, "half duplex\n");
- flow = 0;
afc_cfg |= 0xF;
}
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 7e19051f3230..9b243e6f3008 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -957,12 +957,12 @@ static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,
{
const struct ipv6hdr *iph = ipv6_hdr(skb);
struct flowi6 fl6 = {
+ .flowi6_iif = ifindex,
+ .flowi6_mark = skb->mark,
+ .flowi6_proto = iph->nexthdr,
.daddr = iph->daddr,
.saddr = iph->saddr,
.flowlabel = ip6_flowinfo(iph),
- .flowi6_mark = skb->mark,
- .flowi6_proto = iph->nexthdr,
- .flowi6_iif = ifindex,
};
struct net *net = dev_net(vrf_dev);
struct rt6_info *rt6;
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index bc1633945a56..195dafb98131 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -3396,9 +3396,7 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
MODULE_DEVICE_TABLE(pci, ath10k_pci_id_table);
-#ifdef CONFIG_PM
-
-static int ath10k_pci_pm_suspend(struct device *dev)
+static __maybe_unused int ath10k_pci_pm_suspend(struct device *dev)
{
struct ath10k *ar = dev_get_drvdata(dev);
int ret;
@@ -3414,7 +3412,7 @@ static int ath10k_pci_pm_suspend(struct device *dev)
return ret;
}
-static int ath10k_pci_pm_resume(struct device *dev)
+static __maybe_unused int ath10k_pci_pm_resume(struct device *dev)
{
struct ath10k *ar = dev_get_drvdata(dev);
int ret;
@@ -3433,7 +3431,6 @@ static int ath10k_pci_pm_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(ath10k_pci_pm_ops,
ath10k_pci_pm_suspend,
ath10k_pci_pm_resume);
-#endif
static struct pci_driver ath10k_pci_driver = {
.name = "ath10k_pci",
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index aaed4ab503ad..4157c90ad973 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -980,7 +980,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
eth_broadcast_addr(params_le->bssid);
params_le->bss_type = DOT11_BSSTYPE_ANY;
- params_le->scan_type = 0;
+ params_le->scan_type = BRCMF_SCANTYPE_ACTIVE;
params_le->channel_num = 0;
params_le->nprobes = cpu_to_le32(-1);
params_le->active_time = cpu_to_le32(-1);
@@ -988,12 +988,9 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
params_le->home_time = cpu_to_le32(-1);
memset(&params_le->ssid_le, 0, sizeof(params_le->ssid_le));
- /* if request is null exit so it will be all channel broadcast scan */
- if (!request)
- return;
-
n_ssids = request->n_ssids;
n_channels = request->n_channels;
+
/* Copy channel array if applicable */
brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n",
n_channels);
@@ -1030,16 +1027,8 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
ptr += sizeof(ssid_le);
}
} else {
- brcmf_dbg(SCAN, "Broadcast scan %p\n", request->ssids);
- if ((request->ssids) && request->ssids->ssid_len) {
- brcmf_dbg(SCAN, "SSID %s len=%d\n",
- params_le->ssid_le.SSID,
- request->ssids->ssid_len);
- params_le->ssid_le.SSID_len =
- cpu_to_le32(request->ssids->ssid_len);
- memcpy(&params_le->ssid_le.SSID, request->ssids->ssid,
- request->ssids->ssid_len);
- }
+ brcmf_dbg(SCAN, "Performing passive scan\n");
+ params_le->scan_type = BRCMF_SCANTYPE_PASSIVE;
}
/* Adding mask to channel numbers */
params_le->channel_num =
@@ -3162,6 +3151,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
s32 status;
struct brcmf_escan_result_le *escan_result_le;
+ u32 escan_buflen;
struct brcmf_bss_info_le *bss_info_le;
struct brcmf_bss_info_le *bss = NULL;
u32 bi_length;
@@ -3181,11 +3171,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
if (status == BRCMF_E_STATUS_PARTIAL) {
brcmf_dbg(SCAN, "ESCAN Partial result\n");
+ if (e->datalen < sizeof(*escan_result_le)) {
+ brcmf_err("invalid event data length\n");
+ goto exit;
+ }
escan_result_le = (struct brcmf_escan_result_le *) data;
if (!escan_result_le) {
brcmf_err("Invalid escan result (NULL pointer)\n");
goto exit;
}
+ escan_buflen = le32_to_cpu(escan_result_le->buflen);
+ if (escan_buflen > BRCMF_ESCAN_BUF_SIZE ||
+ escan_buflen > e->datalen ||
+ escan_buflen < sizeof(*escan_result_le)) {
+ brcmf_err("Invalid escan buffer length: %d\n",
+ escan_buflen);
+ goto exit;
+ }
if (le16_to_cpu(escan_result_le->bss_count) != 1) {
brcmf_err("Invalid bss_count %d: ignoring\n",
escan_result_le->bss_count);
@@ -3202,9 +3204,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
}
bi_length = le32_to_cpu(bss_info_le->length);
- if (bi_length != (le32_to_cpu(escan_result_le->buflen) -
- WL_ESCAN_RESULTS_FIXED_SIZE)) {
- brcmf_err("Invalid bss_info length %d: ignoring\n",
+ if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) {
+ brcmf_err("Ignoring invalid bss_info length: %d\n",
bi_length);
goto exit;
}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
index 8391989b1882..e0d22fedb2b4 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
@@ -45,6 +45,11 @@
#define BRCMF_SCAN_PARAMS_COUNT_MASK 0x0000ffff
#define BRCMF_SCAN_PARAMS_NSSID_SHIFT 16
+/* scan type definitions */
+#define BRCMF_SCANTYPE_DEFAULT 0xFF
+#define BRCMF_SCANTYPE_ACTIVE 0
+#define BRCMF_SCANTYPE_PASSIVE 1
+
#define BRCMF_WSEC_MAX_PSK_LEN 32
#define BRCMF_WSEC_PASSPHRASE BIT(0)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 5de19ea10575..b205a7bfb828 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -2167,7 +2167,7 @@ out:
* 1. We are not using a unified image
* 2. We are using a unified image but had an error while exiting D3
*/
- set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
+ set_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status);
set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status);
/*
* When switching images we return 1, which causes mac80211
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 15f2d826bb4b..3bcaa82f59b2 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -1546,6 +1546,11 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,
struct iwl_mvm_mc_iter_data *data = _data;
struct iwl_mvm *mvm = data->mvm;
struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd;
+ struct iwl_host_cmd hcmd = {
+ .id = MCAST_FILTER_CMD,
+ .flags = CMD_ASYNC,
+ .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
+ };
int ret, len;
/* if we don't have free ports, mcast frames will be dropped */
@@ -1560,7 +1565,10 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,
memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4);
- ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd);
+ hcmd.len[0] = len;
+ hcmd.data[0] = cmd;
+
+ ret = iwl_mvm_send_cmd(mvm, &hcmd);
if (ret)
IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);
}
@@ -1635,6 +1643,12 @@ static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,
if (!cmd)
goto out;
+ if (changed_flags & FIF_ALLMULTI)
+ cmd->pass_all = !!(*total_flags & FIF_ALLMULTI);
+
+ if (cmd->pass_all)
+ cmd->count = 0;
+
iwl_mvm_recalc_multicast(mvm);
out:
mutex_unlock(&mvm->mutex);
@@ -2563,7 +2577,7 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,
* queues, so we should never get a second deferred
* frame for the RA/TID.
*/
- iwl_mvm_start_mac_queues(mvm, info->hw_queue);
+ iwl_mvm_start_mac_queues(mvm, BIT(info->hw_queue));
ieee80211_free_txskb(mvm->hw, skb);
}
}
@@ -3975,6 +3989,43 @@ out_unlock:
return ret;
}
+static void iwl_mvm_flush_no_vif(struct iwl_mvm *mvm, u32 queues, bool drop)
+{
+ if (drop) {
+ if (iwl_mvm_has_new_tx_api(mvm))
+ /* TODO new tx api */
+ WARN_ONCE(1,
+ "Need to implement flush TX queue\n");
+ else
+ iwl_mvm_flush_tx_path(mvm,
+ iwl_mvm_flushable_queues(mvm) & queues,
+ 0);
+ } else {
+ if (iwl_mvm_has_new_tx_api(mvm)) {
+ struct ieee80211_sta *sta;
+ int i;
+
+ mutex_lock(&mvm->mutex);
+
+ for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++) {
+ sta = rcu_dereference_protected(
+ mvm->fw_id_to_mac_id[i],
+ lockdep_is_held(&mvm->mutex));
+ if (IS_ERR_OR_NULL(sta))
+ continue;
+
+ iwl_mvm_wait_sta_queues_empty(mvm,
+ iwl_mvm_sta_from_mac80211(sta));
+ }
+
+ mutex_unlock(&mvm->mutex);
+ } else {
+ iwl_trans_wait_tx_queues_empty(mvm->trans,
+ queues);
+ }
+ }
+}
+
static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, u32 queues, bool drop)
{
@@ -3985,7 +4036,12 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
int i;
u32 msk = 0;
- if (!vif || vif->type != NL80211_IFTYPE_STATION)
+ if (!vif) {
+ iwl_mvm_flush_no_vif(mvm, queues, drop);
+ return;
+ }
+
+ if (vif->type != NL80211_IFTYPE_STATION)
return;
/* Make sure we're done with the deferred traffic before flushing */
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
index ba7bd049d3d4..0fe723ca844e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
@@ -661,7 +661,8 @@ static void rs_tl_turn_on_agg(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
(lq_sta->tx_agg_tid_en & BIT(tid)) &&
(tid_data->tx_count_last >= IWL_MVM_RS_AGG_START_THRESHOLD)) {
IWL_DEBUG_RATE(mvm, "try to aggregate tid %d\n", tid);
- rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta);
+ if (rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta) == 0)
+ tid_data->state = IWL_AGG_QUEUED;
}
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
index 67ffd9774712..77f77bc5d083 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -672,11 +672,12 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
* If there was a significant jump in the nssn - adjust.
* If the SN is smaller than the NSSN it might need to first go into
* the reorder buffer, in which case we just release up to it and the
- * rest of the function will take of storing it and releasing up to the
- * nssn
+ * rest of the function will take care of storing it and releasing up to
+ * the nssn
*/
if (!iwl_mvm_is_sn_less(nssn, buffer->head_sn + buffer->buf_size,
- buffer->buf_size)) {
+ buffer->buf_size) ||
+ !ieee80211_sn_less(sn, buffer->head_sn + buffer->buf_size)) {
u16 min_sn = ieee80211_sn_less(sn, nssn) ? sn : nssn;
iwl_mvm_release_frames(mvm, sta, napi, buffer, min_sn);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index 50983615dce6..774122fed454 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -555,7 +555,7 @@ static int iwl_mvm_lmac_scan_abort(struct iwl_mvm *mvm)
struct iwl_host_cmd cmd = {
.id = SCAN_OFFLOAD_ABORT_CMD,
};
- u32 status;
+ u32 status = CAN_ABORT_STATUS;
ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status);
if (ret)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 411a2055dc45..c4a343534c5e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1285,7 +1285,7 @@ static int iwl_mvm_add_int_sta_common(struct iwl_mvm *mvm,
{
struct iwl_mvm_add_sta_cmd cmd;
int ret;
- u32 status;
+ u32 status = ADD_STA_SUCCESS;
lockdep_assert_held(&mvm->mutex);
@@ -2385,8 +2385,10 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))
return -EINVAL;
- if (mvmsta->tid_data[tid].state != IWL_AGG_OFF) {
- IWL_ERR(mvm, "Start AGG when state is not IWL_AGG_OFF %d!\n",
+ if (mvmsta->tid_data[tid].state != IWL_AGG_QUEUED &&
+ mvmsta->tid_data[tid].state != IWL_AGG_OFF) {
+ IWL_ERR(mvm,
+ "Start AGG when state is not IWL_AGG_QUEUED or IWL_AGG_OFF %d!\n",
mvmsta->tid_data[tid].state);
return -ENXIO;
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
index d13893806513..aedabe101cf0 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
@@ -281,6 +281,7 @@ struct iwl_mvm_vif;
* These states relate to a specific RA / TID.
*
* @IWL_AGG_OFF: aggregation is not used
+ * @IWL_AGG_QUEUED: aggregation start work has been queued
* @IWL_AGG_STARTING: aggregation are starting (between start and oper)
* @IWL_AGG_ON: aggregation session is up
* @IWL_EMPTYING_HW_QUEUE_ADDBA: establishing a BA session - waiting for the
@@ -290,6 +291,7 @@ struct iwl_mvm_vif;
*/
enum iwl_mvm_agg_state {
IWL_AGG_OFF = 0,
+ IWL_AGG_QUEUED,
IWL_AGG_STARTING,
IWL_AGG_ON,
IWL_EMPTYING_HW_QUEUE_ADDBA,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
index 8876c2abc440..4d907f60bce9 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
@@ -529,6 +529,7 @@ int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 state)
lockdep_assert_held(&mvm->mutex);
+ status = 0;
ret = iwl_mvm_send_cmd_pdu_status(mvm, WIDE_ID(PHY_OPS_GROUP,
CTDP_CONFIG_CMD),
sizeof(cmd), &cmd, &status);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 172b5e63d3fb..6f2e2af23219 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -564,8 +564,8 @@ static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
case NL80211_IFTYPE_AP:
case NL80211_IFTYPE_ADHOC:
/*
- * Handle legacy hostapd as well, where station will be added
- * only just before sending the association response.
+ * Non-bufferable frames use the broadcast station, thus they
+ * use the probe queue.
* Also take care of the case where we send a deauth to a
* station that we don't have, or similarly an association
* response (with non-success status) for a station we can't
@@ -573,9 +573,9 @@ static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
* Also, disassociate frames might happen, particular with
* reason 7 ("Class 3 frame received from nonassociated STA").
*/
- if (ieee80211_is_probe_resp(fc) || ieee80211_is_auth(fc) ||
- ieee80211_is_deauth(fc) || ieee80211_is_assoc_resp(fc) ||
- ieee80211_is_disassoc(fc))
+ if (ieee80211_is_mgmt(fc) &&
+ (!ieee80211_is_bufferable_mmpdu(fc) ||
+ ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc)))
return mvm->probe_queue;
if (info->hw_queue == info->control.vif->cab_queue)
return mvmvif->cab_queue;
diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
index 856fa6e8327e..a450bc6bc774 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
@@ -115,6 +115,8 @@ int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
vif = qtnf_netdev_get_priv(wdev->netdev);
+ qtnf_scan_done(vif->mac, true);
+
if (qtnf_cmd_send_del_intf(vif))
pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid,
vif->vifid);
@@ -335,6 +337,8 @@ static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev)
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
int ret;
+ qtnf_scan_done(vif->mac, true);
+
ret = qtnf_cmd_send_stop_ap(vif);
if (ret) {
pr_err("VIF%u.%u: failed to stop AP operation in FW\n",
@@ -570,8 +574,6 @@ qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,
!qtnf_sta_list_lookup(&vif->sta_list, params->mac))
return 0;
- qtnf_scan_done(vif->mac, true);
-
ret = qtnf_cmd_send_del_sta(vif, params);
if (ret)
pr_err("VIF%u.%u: failed to delete STA %pM\n",
@@ -1134,8 +1136,9 @@ void qtnf_virtual_intf_cleanup(struct net_device *ndev)
}
vif->sta_state = QTNF_STA_DISCONNECTED;
- qtnf_scan_done(mac, true);
}
+
+ qtnf_scan_done(mac, true);
}
void qtnf_cfg80211_vif_reset(struct qtnf_vif *vif)
diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h
index 6a4af52522b8..66db26613b1f 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h
+++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h
@@ -34,6 +34,9 @@ static inline void qtnf_scan_done(struct qtnf_wmac *mac, bool aborted)
.aborted = aborted,
};
+ if (timer_pending(&mac->scan_timeout))
+ del_timer_sync(&mac->scan_timeout);
+
mutex_lock(&mac->mac_lock);
if (mac->scan_req) {
diff --git a/drivers/net/wireless/quantenna/qtnfmac/event.c b/drivers/net/wireless/quantenna/qtnfmac/event.c
index 0fc2814eafad..43d2e7fd6e02 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/event.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/event.c
@@ -345,8 +345,6 @@ qtnf_event_handle_scan_complete(struct qtnf_wmac *mac,
return -EINVAL;
}
- if (timer_pending(&mac->scan_timeout))
- del_timer_sync(&mac->scan_timeout);
qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED);
return 0;
diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c
index 502e72b7cdcc..69131965a298 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c
@@ -661,14 +661,18 @@ static int qtnf_pcie_data_tx(struct qtnf_bus *bus, struct sk_buff *skb)
struct qtnf_pcie_bus_priv *priv = (void *)get_bus_priv(bus);
dma_addr_t txbd_paddr, skb_paddr;
struct qtnf_tx_bd *txbd;
+ unsigned long flags;
int len, i;
u32 info;
int ret = 0;
+ spin_lock_irqsave(&priv->tx0_lock, flags);
+
if (!qtnf_tx_queue_ready(priv)) {
if (skb->dev)
netif_stop_queue(skb->dev);
+ spin_unlock_irqrestore(&priv->tx0_lock, flags);
return NETDEV_TX_BUSY;
}
@@ -717,8 +721,10 @@ tx_done:
dev_kfree_skb_any(skb);
}
- qtnf_pcie_data_tx_reclaim(priv);
priv->tx_done_count++;
+ spin_unlock_irqrestore(&priv->tx0_lock, flags);
+
+ qtnf_pcie_data_tx_reclaim(priv);
return NETDEV_TX_OK;
}
@@ -1247,6 +1253,7 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
strcpy(bus->fwname, QTN_PCI_PEARL_FW_NAME);
init_completion(&bus->request_firmware_complete);
mutex_init(&bus->bus_lock);
+ spin_lock_init(&pcie_priv->tx0_lock);
spin_lock_init(&pcie_priv->irq_lock);
spin_lock_init(&pcie_priv->tx_reclaim_lock);
diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h
index e76a23716ee0..86ac1ccedb52 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h
+++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h
@@ -34,6 +34,8 @@ struct qtnf_pcie_bus_priv {
/* lock for tx reclaim operations */
spinlock_t tx_reclaim_lock;
+ /* lock for tx0 operations */
+ spinlock_t tx0_lock;
u8 msi_enabled;
int mps;
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 60491641a8d6..d5612bd1cc81 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -31,6 +31,16 @@ enum log_ent_request {
LOG_OLD_ENT
};
+static struct device *to_dev(struct arena_info *arena)
+{
+ return &arena->nd_btt->dev;
+}
+
+static u64 adjust_initial_offset(struct nd_btt *nd_btt, u64 offset)
+{
+ return offset + nd_btt->initial_offset;
+}
+
static int arena_read_bytes(struct arena_info *arena, resource_size_t offset,
void *buf, size_t n, unsigned long flags)
{
@@ -38,7 +48,7 @@ static int arena_read_bytes(struct arena_info *arena, resource_size_t offset,
struct nd_namespace_common *ndns = nd_btt->ndns;
/* arena offsets may be shifted from the base of the device */
- offset += arena->nd_btt->initial_offset;
+ offset = adjust_initial_offset(nd_btt, offset);
return nvdimm_read_bytes(ndns, offset, buf, n, flags);
}
@@ -49,7 +59,7 @@ static int arena_write_bytes(struct arena_info *arena, resource_size_t offset,
struct nd_namespace_common *ndns = nd_btt->ndns;
/* arena offsets may be shifted from the base of the device */
- offset += arena->nd_btt->initial_offset;
+ offset = adjust_initial_offset(nd_btt, offset);
return nvdimm_write_bytes(ndns, offset, buf, n, flags);
}
@@ -62,8 +72,10 @@ static int btt_info_write(struct arena_info *arena, struct btt_sb *super)
* We rely on that to make sure rw_bytes does error clearing
* correctly, so make sure that is the case.
*/
- WARN_ON_ONCE(!IS_ALIGNED(arena->infooff, 512));
- WARN_ON_ONCE(!IS_ALIGNED(arena->info2off, 512));
+ dev_WARN_ONCE(to_dev(arena), !IS_ALIGNED(arena->infooff, 512),
+ "arena->infooff: %#llx is unaligned\n", arena->infooff);
+ dev_WARN_ONCE(to_dev(arena), !IS_ALIGNED(arena->info2off, 512),
+ "arena->info2off: %#llx is unaligned\n", arena->info2off);
ret = arena_write_bytes(arena, arena->info2off, super,
sizeof(struct btt_sb), 0);
@@ -76,7 +88,6 @@ static int btt_info_write(struct arena_info *arena, struct btt_sb *super)
static int btt_info_read(struct arena_info *arena, struct btt_sb *super)
{
- WARN_ON(!super);
return arena_read_bytes(arena, arena->infooff, super,
sizeof(struct btt_sb), 0);
}
@@ -92,7 +103,10 @@ static int __btt_map_write(struct arena_info *arena, u32 lba, __le32 mapping,
{
u64 ns_off = arena->mapoff + (lba * MAP_ENT_SIZE);
- WARN_ON(lba >= arena->external_nlba);
+ if (unlikely(lba >= arena->external_nlba))
+ dev_err_ratelimited(to_dev(arena),
+ "%s: lba %#x out of range (max: %#x)\n",
+ __func__, lba, arena->external_nlba);
return arena_write_bytes(arena, ns_off, &mapping, MAP_ENT_SIZE, flags);
}
@@ -106,7 +120,7 @@ static int btt_map_write(struct arena_info *arena, u32 lba, u32 mapping,
* This 'mapping' is supposed to be just the LBA mapping, without
* any flags set, so strip the flag bits.
*/
- mapping &= MAP_LBA_MASK;
+ mapping = ent_lba(mapping);
ze = (z_flag << 1) + e_flag;
switch (ze) {
@@ -131,7 +145,8 @@ static int btt_map_write(struct arena_info *arena, u32 lba, u32 mapping,
* construed as a valid 'normal' case, but we decide not to,
* to avoid confusion
*/
- WARN_ONCE(1, "Invalid use of Z and E flags\n");
+ dev_err_ratelimited(to_dev(arena),
+ "Invalid use of Z and E flags\n");
return -EIO;
}
@@ -147,7 +162,10 @@ static int btt_map_read(struct arena_info *arena, u32 lba, u32 *mapping,
u32 raw_mapping, postmap, ze, z_flag, e_flag;
u64 ns_off = arena->mapoff + (lba * MAP_ENT_SIZE);
- WARN_ON(lba >= arena->external_nlba);
+ if (unlikely(lba >= arena->external_nlba))
+ dev_err_ratelimited(to_dev(arena),
+ "%s: lba %#x out of range (max: %#x)\n",
+ __func__, lba, arena->external_nlba);
ret = arena_read_bytes(arena, ns_off, &in, MAP_ENT_SIZE, rwb_flags);
if (ret)
@@ -155,10 +173,10 @@ static int btt_map_read(struct arena_info *arena, u32 lba, u32 *mapping,
raw_mapping = le32_to_cpu(in);
- z_flag = (raw_mapping & MAP_TRIM_MASK) >> MAP_TRIM_SHIFT;
- e_flag = (raw_mapping & MAP_ERR_MASK) >> MAP_ERR_SHIFT;
+ z_flag = ent_z_flag(raw_mapping);
+ e_flag = ent_e_flag(raw_mapping);
ze = (z_flag << 1) + e_flag;
- postmap = raw_mapping & MAP_LBA_MASK;
+ postmap = ent_lba(raw_mapping);
/* Reuse the {z,e}_flag variables for *trim and *error */
z_flag = 0;
@@ -195,7 +213,6 @@ static int btt_map_read(struct arena_info *arena, u32 lba, u32 *mapping,
static int btt_log_read_pair(struct arena_info *arena, u32 lane,
struct log_entry *ent)
{
- WARN_ON(!ent);
return arena_read_bytes(arena,
arena->logoff + (2 * lane * LOG_ENT_SIZE), ent,
2 * LOG_ENT_SIZE, 0);
@@ -299,11 +316,6 @@ static int btt_log_get_old(struct log_entry *ent)
return old;
}
-static struct device *to_dev(struct arena_info *arena)
-{
- return &arena->nd_btt->dev;
-}
-
/*
* This function copies the desired (old/new) log entry into ent if
* it is not NULL. It returns the sub-slot number (0 or 1)
@@ -381,7 +393,9 @@ static int btt_flog_write(struct arena_info *arena, u32 lane, u32 sub,
arena->freelist[lane].sub = 1 - arena->freelist[lane].sub;
if (++(arena->freelist[lane].seq) == 4)
arena->freelist[lane].seq = 1;
- arena->freelist[lane].block = le32_to_cpu(ent->old_map);
+ if (ent_e_flag(ent->old_map))
+ arena->freelist[lane].has_err = 1;
+ arena->freelist[lane].block = le32_to_cpu(ent_lba(ent->old_map));
return ret;
}
@@ -407,12 +421,14 @@ static int btt_map_init(struct arena_info *arena)
* make sure rw_bytes does error clearing correctly, so make sure that
* is the case.
*/
- WARN_ON_ONCE(!IS_ALIGNED(arena->mapoff, 512));
+ dev_WARN_ONCE(to_dev(arena), !IS_ALIGNED(arena->mapoff, 512),
+ "arena->mapoff: %#llx is unaligned\n", arena->mapoff);
while (mapsize) {
size_t size = min(mapsize, chunk_size);
- WARN_ON_ONCE(size < 512);
+ dev_WARN_ONCE(to_dev(arena), size < 512,
+ "chunk size: %#zx is unaligned\n", size);
ret = arena_write_bytes(arena, arena->mapoff + offset, zerobuf,
size, 0);
if (ret)
@@ -449,12 +465,14 @@ static int btt_log_init(struct arena_info *arena)
* make sure rw_bytes does error clearing correctly, so make sure that
* is the case.
*/
- WARN_ON_ONCE(!IS_ALIGNED(arena->logoff, 512));
+ dev_WARN_ONCE(to_dev(arena), !IS_ALIGNED(arena->logoff, 512),
+ "arena->logoff: %#llx is unaligned\n", arena->logoff);
while (logsize) {
size_t size = min(logsize, chunk_size);
- WARN_ON_ONCE(size < 512);
+ dev_WARN_ONCE(to_dev(arena), size < 512,
+ "chunk size: %#zx is unaligned\n", size);
ret = arena_write_bytes(arena, arena->logoff + offset, zerobuf,
size, 0);
if (ret)
@@ -480,6 +498,40 @@ static int btt_log_init(struct arena_info *arena)
return ret;
}
+static u64 to_namespace_offset(struct arena_info *arena, u64 lba)
+{
+ return arena->dataoff + ((u64)lba * arena->internal_lbasize);
+}
+
+static int arena_clear_freelist_error(struct arena_info *arena, u32 lane)
+{
+ int ret = 0;
+
+ if (arena->freelist[lane].has_err) {
+ void *zero_page = page_address(ZERO_PAGE(0));
+ u32 lba = arena->freelist[lane].block;
+ u64 nsoff = to_namespace_offset(arena, lba);
+ unsigned long len = arena->sector_size;
+
+ mutex_lock(&arena->err_lock);
+
+ while (len) {
+ unsigned long chunk = min(len, PAGE_SIZE);
+
+ ret = arena_write_bytes(arena, nsoff, zero_page,
+ chunk, 0);
+ if (ret)
+ break;
+ len -= chunk;
+ nsoff += chunk;
+ if (len == 0)
+ arena->freelist[lane].has_err = 0;
+ }
+ mutex_unlock(&arena->err_lock);
+ }
+ return ret;
+}
+
static int btt_freelist_init(struct arena_info *arena)
{
int old, new, ret;
@@ -505,6 +557,17 @@ static int btt_freelist_init(struct arena_info *arena)
arena->freelist[i].seq = nd_inc_seq(le32_to_cpu(log_new.seq));
arena->freelist[i].block = le32_to_cpu(log_new.old_map);
+ /*
+ * FIXME: if error clearing fails during init, we want to make
+ * the BTT read-only
+ */
+ if (ent_e_flag(log_new.old_map)) {
+ ret = arena_clear_freelist_error(arena, i);
+ if (ret)
+ dev_err_ratelimited(to_dev(arena),
+ "Unable to clear known errors\n");
+ }
+
/* This implies a newly created or untouched flog entry */
if (log_new.old_map == log_new.new_map)
continue;
@@ -525,7 +588,6 @@ static int btt_freelist_init(struct arena_info *arena)
if (ret)
return ret;
}
-
}
return 0;
@@ -566,6 +628,7 @@ static struct arena_info *alloc_arena(struct btt *btt, size_t size,
if (!arena)
return NULL;
arena->nd_btt = btt->nd_btt;
+ arena->sector_size = btt->sector_size;
if (!size)
return arena;
@@ -694,6 +757,7 @@ static int discover_arenas(struct btt *btt)
arena->external_lba_start = cur_nlba;
parse_arena_meta(arena, super, cur_off);
+ mutex_init(&arena->err_lock);
ret = btt_freelist_init(arena);
if (ret)
goto out;
@@ -904,11 +968,6 @@ static void unlock_map(struct arena_info *arena, u32 premap)
spin_unlock(&arena->map_locks[idx].lock);
}
-static u64 to_namespace_offset(struct arena_info *arena, u64 lba)
-{
- return arena->dataoff + ((u64)lba * arena->internal_lbasize);
-}
-
static int btt_data_read(struct arena_info *arena, struct page *page,
unsigned int off, u32 lba, u32 len)
{
@@ -1032,6 +1091,7 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
while (1) {
u32 new_map;
+ int new_t, new_e;
if (t_flag) {
zero_fill_data(page, off, cur_len);
@@ -1050,20 +1110,29 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
barrier();
- ret = btt_map_read(arena, premap, &new_map, &t_flag,
- &e_flag, NVDIMM_IO_ATOMIC);
+ ret = btt_map_read(arena, premap, &new_map, &new_t,
+ &new_e, NVDIMM_IO_ATOMIC);
if (ret)
goto out_rtt;
- if (postmap == new_map)
+ if ((postmap == new_map) && (t_flag == new_t) &&
+ (e_flag == new_e))
break;
postmap = new_map;
+ t_flag = new_t;
+ e_flag = new_e;
}
ret = btt_data_read(arena, page, off, postmap, cur_len);
- if (ret)
+ if (ret) {
+ int rc;
+
+ /* Media error - set the e_flag */
+ rc = btt_map_write(arena, premap, postmap, 0, 1,
+ NVDIMM_IO_ATOMIC);
goto out_rtt;
+ }
if (bip) {
ret = btt_rw_integrity(btt, bip, arena, postmap, READ);
@@ -1088,6 +1157,21 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
return ret;
}
+/*
+ * Normally, arena_{read,write}_bytes will take care of the initial offset
+ * adjustment, but in the case of btt_is_badblock, where we query is_bad_pmem,
+ * we need the final, raw namespace offset here
+ */
+static bool btt_is_badblock(struct btt *btt, struct arena_info *arena,
+ u32 postmap)
+{
+ u64 nsoff = adjust_initial_offset(arena->nd_btt,
+ to_namespace_offset(arena, postmap));
+ sector_t phys_sector = nsoff >> 9;
+
+ return is_bad_pmem(btt->phys_bb, phys_sector, arena->internal_lbasize);
+}
+
static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
sector_t sector, struct page *page, unsigned int off,
unsigned int len)
@@ -1100,7 +1184,9 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
while (len) {
u32 cur_len;
+ int e_flag;
+ retry:
lane = nd_region_acquire_lane(btt->nd_region);
ret = lba_to_arena(btt, sector, &premap, &arena);
@@ -1113,6 +1199,21 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
goto out_lane;
}
+ if (btt_is_badblock(btt, arena, arena->freelist[lane].block))
+ arena->freelist[lane].has_err = 1;
+
+ if (mutex_is_locked(&arena->err_lock)
+ || arena->freelist[lane].has_err) {
+ nd_region_release_lane(btt->nd_region, lane);
+
+ ret = arena_clear_freelist_error(arena, lane);
+ if (ret)
+ return ret;
+
+ /* OK to acquire a different lane/free block */
+ goto retry;
+ }
+
new_postmap = arena->freelist[lane].block;
/* Wait if the new block is being read from */
@@ -1138,7 +1239,7 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
}
lock_map(arena, premap);
- ret = btt_map_read(arena, premap, &old_postmap, NULL, NULL,
+ ret = btt_map_read(arena, premap, &old_postmap, NULL, &e_flag,
NVDIMM_IO_ATOMIC);
if (ret)
goto out_map;
@@ -1146,6 +1247,8 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
ret = -EIO;
goto out_map;
}
+ if (e_flag)
+ set_e_flag(old_postmap);
log.lba = cpu_to_le32(premap);
log.old_map = cpu_to_le32(old_postmap);
@@ -1156,13 +1259,20 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
if (ret)
goto out_map;
- ret = btt_map_write(arena, premap, new_postmap, 0, 0, 0);
+ ret = btt_map_write(arena, premap, new_postmap, 0, 0,
+ NVDIMM_IO_ATOMIC);
if (ret)
goto out_map;
unlock_map(arena, premap);
nd_region_release_lane(btt->nd_region, lane);
+ if (e_flag) {
+ ret = arena_clear_freelist_error(arena, lane);
+ if (ret)
+ return ret;
+ }
+
len -= cur_len;
off += cur_len;
sector += btt->sector_size >> SECTOR_SHIFT;
@@ -1211,11 +1321,13 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio)
bio_for_each_segment(bvec, bio, iter) {
unsigned int len = bvec.bv_len;
- BUG_ON(len > PAGE_SIZE);
- /* Make sure len is in multiples of sector size. */
- /* XXX is this right? */
- BUG_ON(len < btt->sector_size);
- BUG_ON(len % btt->sector_size);
+ if (len > PAGE_SIZE || len < btt->sector_size ||
+ len % btt->sector_size) {
+ dev_err_ratelimited(&btt->nd_btt->dev,
+ "unaligned bio segment (len: %d)\n", len);
+ bio->bi_status = BLK_STS_IOERR;
+ break;
+ }
err = btt_do_bvec(btt, bip, bvec.bv_page, len, bvec.bv_offset,
op_is_write(bio_op(bio)), iter.bi_sector);
@@ -1345,6 +1457,7 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
{
int ret;
struct btt *btt;
+ struct nd_namespace_io *nsio;
struct device *dev = &nd_btt->dev;
btt = devm_kzalloc(dev, sizeof(struct btt), GFP_KERNEL);
@@ -1358,6 +1471,8 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
INIT_LIST_HEAD(&btt->arena_list);
mutex_init(&btt->init_lock);
btt->nd_region = nd_region;
+ nsio = to_nd_namespace_io(&nd_btt->ndns->dev);
+ btt->phys_bb = &nsio->bb;
ret = discover_arenas(btt);
if (ret) {
@@ -1431,6 +1546,8 @@ int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
}
btt_sb = devm_kzalloc(&nd_btt->dev, sizeof(*btt_sb), GFP_KERNEL);
+ if (!btt_sb)
+ return -ENOMEM;
/*
* If this returns < 0, that is ok as it just means there wasn't
diff --git a/drivers/nvdimm/btt.h b/drivers/nvdimm/btt.h
index 888e862907a0..578c2057524d 100644
--- a/drivers/nvdimm/btt.h
+++ b/drivers/nvdimm/btt.h
@@ -15,6 +15,7 @@
#ifndef _LINUX_BTT_H
#define _LINUX_BTT_H
+#include <linux/badblocks.h>
#include <linux/types.h>
#define BTT_SIG_LEN 16
@@ -38,6 +39,11 @@
#define IB_FLAG_ERROR 0x00000001
#define IB_FLAG_ERROR_MASK 0x00000001
+#define ent_lba(ent) (ent & MAP_LBA_MASK)
+#define ent_e_flag(ent) (!!(ent & MAP_ERR_MASK))
+#define ent_z_flag(ent) (!!(ent & MAP_TRIM_MASK))
+#define set_e_flag(ent) (ent |= MAP_ERR_MASK)
+
enum btt_init_state {
INIT_UNCHECKED = 0,
INIT_NOTFOUND,
@@ -78,6 +84,7 @@ struct free_entry {
u32 block;
u8 sub;
u8 seq;
+ u8 has_err;
};
struct aligned_lock {
@@ -104,6 +111,7 @@ struct aligned_lock {
* handle incoming writes.
* @version_major: Metadata layout version major.
* @version_minor: Metadata layout version minor.
+ * @sector_size: The Linux sector size - 512 or 4096
* @nextoff: Offset in bytes to the start of the next arena.
* @infooff: Offset in bytes to the info block of this arena.
* @dataoff: Offset in bytes to the data area of this arena.
@@ -131,6 +139,7 @@ struct arena_info {
u32 nfree;
u16 version_major;
u16 version_minor;
+ u32 sector_size;
/* Byte offsets to the different on-media structures */
u64 nextoff;
u64 infooff;
@@ -147,6 +156,7 @@ struct arena_info {
struct dentry *debugfs_dir;
/* Arena flags */
u32 flags;
+ struct mutex err_lock;
};
/**
@@ -181,6 +191,7 @@ struct btt {
struct mutex init_lock;
int init_state;
int num_arenas;
+ struct badblocks *phys_bb;
};
bool nd_btt_arena_is_valid(struct nd_btt *nd_btt, struct btt_sb *super);
diff --git a/drivers/nvdimm/btt_devs.c b/drivers/nvdimm/btt_devs.c
index 3e359d282f8e..d58925295aa7 100644
--- a/drivers/nvdimm/btt_devs.c
+++ b/drivers/nvdimm/btt_devs.c
@@ -61,7 +61,7 @@ static ssize_t sector_size_show(struct device *dev,
{
struct nd_btt *nd_btt = to_nd_btt(dev);
- return nd_sector_size_show(nd_btt->lbasize, btt_lbasize_supported, buf);
+ return nd_size_select_show(nd_btt->lbasize, btt_lbasize_supported, buf);
}
static ssize_t sector_size_store(struct device *dev,
@@ -72,7 +72,7 @@ static ssize_t sector_size_store(struct device *dev,
device_lock(dev);
nvdimm_bus_lock(dev);
- rc = nd_sector_size_store(dev, buf, &nd_btt->lbasize,
+ rc = nd_size_select_store(dev, buf, &nd_btt->lbasize,
btt_lbasize_supported);
dev_dbg(dev, "%s: result: %zd wrote: %s%s", __func__,
rc, buf, buf[len - 1] == '\n' ? "" : "\n");
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 937fafa1886a..baf283986a7e 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -11,6 +11,7 @@
* General Public License for more details.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <linux/sched/mm.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
#include <linux/module.h>
@@ -234,6 +235,7 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
struct nd_cmd_clear_error clear_err;
struct nd_cmd_ars_cap ars_cap;
u32 clear_err_unit, mask;
+ unsigned int noio_flag;
int cmd_rc, rc;
if (!nvdimm_bus)
@@ -250,8 +252,10 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
memset(&ars_cap, 0, sizeof(ars_cap));
ars_cap.address = phys;
ars_cap.length = len;
+ noio_flag = memalloc_noio_save();
rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_ARS_CAP, &ars_cap,
sizeof(ars_cap), &cmd_rc);
+ memalloc_noio_restore(noio_flag);
if (rc < 0)
return rc;
if (cmd_rc < 0)
@@ -266,8 +270,10 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
memset(&clear_err, 0, sizeof(clear_err));
clear_err.address = phys;
clear_err.length = len;
+ noio_flag = memalloc_noio_save();
rc = nd_desc->ndctl(nd_desc, NULL, ND_CMD_CLEAR_ERROR, &clear_err,
sizeof(clear_err), &cmd_rc);
+ memalloc_noio_restore(noio_flag);
if (rc < 0)
return rc;
if (cmd_rc < 0)
@@ -905,19 +911,20 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
int read_only, unsigned int ioctl_cmd, unsigned long arg)
{
struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
- size_t buf_len = 0, in_len = 0, out_len = 0;
static char out_env[ND_CMD_MAX_ENVELOPE];
static char in_env[ND_CMD_MAX_ENVELOPE];
const struct nd_cmd_desc *desc = NULL;
unsigned int cmd = _IOC_NR(ioctl_cmd);
- unsigned int func = cmd;
- void __user *p = (void __user *) arg;
struct device *dev = &nvdimm_bus->dev;
- struct nd_cmd_pkg pkg;
+ void __user *p = (void __user *) arg;
const char *cmd_name, *dimm_name;
+ u32 in_len = 0, out_len = 0;
+ unsigned int func = cmd;
unsigned long cmd_mask;
- void *buf;
+ struct nd_cmd_pkg pkg;
int rc, i, cmd_rc;
+ u64 buf_len = 0;
+ void *buf;
if (nvdimm) {
desc = nd_cmd_dimm_desc(cmd);
@@ -977,13 +984,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
if (cmd == ND_CMD_CALL) {
func = pkg.nd_command;
- dev_dbg(dev, "%s:%s, idx: %llu, in: %zu, out: %zu, len %zu\n",
+ dev_dbg(dev, "%s:%s, idx: %llu, in: %u, out: %u, len %llu\n",
__func__, dimm_name, pkg.nd_command,
in_len, out_len, buf_len);
-
- for (i = 0; i < ARRAY_SIZE(pkg.nd_reserved2); i++)
- if (pkg.nd_reserved2[i])
- return -EINVAL;
}
/* process an output envelope */
@@ -1007,9 +1010,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
out_len += out_size;
}
- buf_len = out_len + in_len;
+ buf_len = (u64) out_len + (u64) in_len;
if (buf_len > ND_IOCTL_MAX_BUFLEN) {
- dev_dbg(dev, "%s:%s cmd: %s buf_len: %zu > %d\n", __func__,
+ dev_dbg(dev, "%s:%s cmd: %s buf_len: %llu > %d\n", __func__,
dimm_name, cmd_name, buf_len,
ND_IOCTL_MAX_BUFLEN);
return -EINVAL;
diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
index 47770460f3d3..b2fc29b8279b 100644
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -280,18 +280,11 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
}
if (unlikely(is_bad_pmem(&nsio->bb, sector, sz_align))) {
- /*
- * FIXME: nsio_rw_bytes() may be called from atomic
- * context in the btt case and the ACPI DSM path for
- * clearing the error takes sleeping locks and allocates
- * memory. An explicit error clearing path, and support
- * for tracking badblocks in BTT metadata is needed to
- * work around this collision.
- */
if (IS_ALIGNED(offset, 512) && IS_ALIGNED(size, 512)
&& !(flags & NVDIMM_IO_ATOMIC)) {
long cleared;
+ might_sleep();
cleared = nvdimm_clear_poison(&ndns->dev,
nsio->res.start + offset, size);
if (cleared < size)
diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c
index 75bc08c6838c..bb71f0cf8f5d 100644
--- a/drivers/nvdimm/core.c
+++ b/drivers/nvdimm/core.c
@@ -277,14 +277,14 @@ int nd_uuid_store(struct device *dev, u8 **uuid_out, const char *buf,
return 0;
}
-ssize_t nd_sector_size_show(unsigned long current_lbasize,
+ssize_t nd_size_select_show(unsigned long current_size,
const unsigned long *supported, char *buf)
{
ssize_t len = 0;
int i;
for (i = 0; supported[i]; i++)
- if (current_lbasize == supported[i])
+ if (current_size == supported[i])
len += sprintf(buf + len, "[%ld] ", supported[i]);
else
len += sprintf(buf + len, "%ld ", supported[i]);
@@ -292,8 +292,8 @@ ssize_t nd_sector_size_show(unsigned long current_lbasize,
return len;
}
-ssize_t nd_sector_size_store(struct device *dev, const char *buf,
- unsigned long *current_lbasize, const unsigned long *supported)
+ssize_t nd_size_select_store(struct device *dev, const char *buf,
+ unsigned long *current_size, const unsigned long *supported)
{
unsigned long lbasize;
int rc, i;
@@ -310,7 +310,7 @@ ssize_t nd_sector_size_store(struct device *dev, const char *buf,
break;
if (supported[i]) {
- *current_lbasize = lbasize;
+ *current_size = lbasize;
return 0;
} else {
return -EINVAL;
diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
index 87796f840777..9c5f108910e3 100644
--- a/drivers/nvdimm/label.c
+++ b/drivers/nvdimm/label.c
@@ -45,12 +45,14 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd)
return ndd->nslabel_size;
}
-size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd)
+int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd)
{
- u32 index_span;
+ return ndd->nsarea.config_size / (sizeof_namespace_label(ndd) + 1);
+}
- if (ndd->nsindex_size)
- return ndd->nsindex_size;
+size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd)
+{
+ u32 nslot, space, size;
/*
* The minimum index space is 512 bytes, with that amount of
@@ -60,16 +62,16 @@ size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd)
* starts to waste space at larger config_sizes, but it's
* unlikely we'll ever see anything but 128K.
*/
- index_span = ndd->nsarea.config_size / (sizeof_namespace_label(ndd) + 1);
- index_span /= NSINDEX_ALIGN * 2;
- ndd->nsindex_size = index_span * NSINDEX_ALIGN;
-
- return ndd->nsindex_size;
-}
-
-int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd)
-{
- return ndd->nsarea.config_size / (sizeof_namespace_label(ndd) + 1);
+ nslot = nvdimm_num_label_slots(ndd);
+ space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd);
+ size = ALIGN(sizeof(struct nd_namespace_index) + DIV_ROUND_UP(nslot, 8),
+ NSINDEX_ALIGN) * 2;
+ if (size <= space)
+ return size / 2;
+
+ dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n",
+ ndd->nsarea.config_size, sizeof_namespace_label(ndd));
+ return 0;
}
static int __nd_label_validate(struct nvdimm_drvdata *ndd)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 5f1c6756e57c..3e4d1e7998da 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1313,14 +1313,14 @@ static ssize_t sector_size_show(struct device *dev,
if (is_namespace_blk(dev)) {
struct nd_namespace_blk *nsblk = to_nd_namespace_blk(dev);
- return nd_sector_size_show(nsblk->lbasize,
+ return nd_size_select_show(nsblk->lbasize,
blk_lbasize_supported, buf);
}
if (is_namespace_pmem(dev)) {
struct nd_namespace_pmem *nspm = to_nd_namespace_pmem(dev);
- return nd_sector_size_show(nspm->lbasize,
+ return nd_size_select_show(nspm->lbasize,
pmem_lbasize_supported, buf);
}
return -ENXIO;
@@ -1352,7 +1352,7 @@ static ssize_t sector_size_store(struct device *dev,
if (to_ndns(dev)->claim)
rc = -EBUSY;
if (rc >= 0)
- rc = nd_sector_size_store(dev, buf, lbasize, supported);
+ rc = nd_size_select_store(dev, buf, lbasize, supported);
if (rc >= 0)
rc = nd_namespace_label_update(nd_region, dev);
dev_dbg(dev, "%s: result: %zd %s: %s%s", __func__,
@@ -1417,6 +1417,15 @@ static int btt_claim_class(struct device *dev)
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
struct nd_namespace_index *nsindex;
+ /*
+ * If any of the DIMMs do not support labels the only
+ * possible BTT format is v1.
+ */
+ if (!ndd) {
+ loop_bitmask = 0;
+ break;
+ }
+
nsindex = to_namespace_index(ndd, ndd->ns_current);
if (nsindex == NULL)
loop_bitmask |= 1;
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index a87f793f2945..9c758a91372b 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -42,7 +42,7 @@ struct nd_poison {
struct nvdimm_drvdata {
struct device *dev;
- int nsindex_size, nslabel_size;
+ int nslabel_size;
struct nd_cmd_get_config_size nsarea;
void *data;
int ns_current, ns_next;
@@ -134,6 +134,7 @@ struct nd_mapping {
struct nvdimm *nvdimm;
u64 start;
u64 size;
+ int position;
struct list_head labels;
struct mutex lock;
/*
@@ -233,10 +234,10 @@ void nd_device_unregister(struct device *dev, enum nd_async_mode mode);
void nd_device_notify(struct device *dev, enum nvdimm_event event);
int nd_uuid_store(struct device *dev, u8 **uuid_out, const char *buf,
size_t len);
-ssize_t nd_sector_size_show(unsigned long current_lbasize,
+ssize_t nd_size_select_show(unsigned long current_size,
const unsigned long *supported, char *buf);
-ssize_t nd_sector_size_store(struct device *dev, const char *buf,
- unsigned long *current_lbasize, const unsigned long *supported);
+ssize_t nd_size_select_store(struct device *dev, const char *buf,
+ unsigned long *current_size, const unsigned long *supported);
int __init nvdimm_init(void);
int __init nd_region_init(void);
int __init nd_label_init(void);
@@ -285,6 +286,13 @@ static inline struct device *nd_btt_create(struct nd_region *nd_region)
struct nd_pfn *to_nd_pfn(struct device *dev);
#if IS_ENABLED(CONFIG_NVDIMM_PFN)
+
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+#define PFN_DEFAULT_ALIGNMENT HPAGE_PMD_SIZE
+#else
+#define PFN_DEFAULT_ALIGNMENT PAGE_SIZE
+#endif
+
int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns);
bool is_nd_pfn(struct device *dev);
struct device *nd_pfn_create(struct nd_region *nd_region);
diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
index 5fcb6f5b22a2..9576c444f0ab 100644
--- a/drivers/nvdimm/pfn_devs.c
+++ b/drivers/nvdimm/pfn_devs.c
@@ -111,24 +111,27 @@ static ssize_t align_show(struct device *dev,
return sprintf(buf, "%ld\n", nd_pfn->align);
}
-static ssize_t __align_store(struct nd_pfn *nd_pfn, const char *buf)
+static const unsigned long *nd_pfn_supported_alignments(void)
{
- unsigned long val;
- int rc;
-
- rc = kstrtoul(buf, 0, &val);
- if (rc)
- return rc;
-
- if (!is_power_of_2(val) || val < PAGE_SIZE || val > SZ_1G)
- return -EINVAL;
+ /*
+ * This needs to be a non-static variable because the *_SIZE
+ * macros aren't always constants.
+ */
+ const unsigned long supported_alignments[] = {
+ PAGE_SIZE,
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ HPAGE_PMD_SIZE,
+#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
+ HPAGE_PUD_SIZE,
+#endif
+#endif
+ 0,
+ };
+ static unsigned long data[ARRAY_SIZE(supported_alignments)];
- if (nd_pfn->dev.driver)
- return -EBUSY;
- else
- nd_pfn->align = val;
+ memcpy(data, supported_alignments, sizeof(data));
- return 0;
+ return data;
}
static ssize_t align_store(struct device *dev,
@@ -139,7 +142,8 @@ static ssize_t align_store(struct device *dev,
device_lock(dev);
nvdimm_bus_lock(dev);
- rc = __align_store(nd_pfn, buf);
+ rc = nd_size_select_store(dev, buf, &nd_pfn->align,
+ nd_pfn_supported_alignments());
dev_dbg(dev, "%s: result: %zd wrote: %s%s", __func__,
rc, buf, buf[len - 1] == '\n' ? "" : "\n");
nvdimm_bus_unlock(dev);
@@ -260,6 +264,13 @@ static ssize_t size_show(struct device *dev,
}
static DEVICE_ATTR_RO(size);
+static ssize_t supported_alignments_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return nd_size_select_show(0, nd_pfn_supported_alignments(), buf);
+}
+static DEVICE_ATTR_RO(supported_alignments);
+
static struct attribute *nd_pfn_attributes[] = {
&dev_attr_mode.attr,
&dev_attr_namespace.attr,
@@ -267,6 +278,7 @@ static struct attribute *nd_pfn_attributes[] = {
&dev_attr_align.attr,
&dev_attr_resource.attr,
&dev_attr_size.attr,
+ &dev_attr_supported_alignments.attr,
NULL,
};
@@ -290,7 +302,7 @@ struct device *nd_pfn_devinit(struct nd_pfn *nd_pfn,
return NULL;
nd_pfn->mode = PFN_MODE_NONE;
- nd_pfn->align = HPAGE_SIZE;
+ nd_pfn->align = PFN_DEFAULT_ALIGNMENT;
dev = &nd_pfn->dev;
device_initialize(&nd_pfn->dev);
if (ndns && !__nd_attach_ndns(&nd_pfn->dev, ndns, &nd_pfn->ndns)) {
@@ -638,11 +650,12 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
/ PAGE_SIZE);
if (nd_pfn->mode == PFN_MODE_PMEM) {
/*
- * vmemmap_populate_hugepages() allocates the memmap array in
- * HPAGE_SIZE chunks.
+ * The altmap should be padded out to the block size used
+ * when populating the vmemmap. This *should* be equal to
+ * PMD_SIZE for most architectures.
*/
offset = ALIGN(start + SZ_8K + 64 * npfns + dax_label_reserve,
- max(nd_pfn->align, HPAGE_SIZE)) - start;
+ max(nd_pfn->align, PMD_SIZE)) - start;
} else if (nd_pfn->mode == PFN_MODE_RAM)
offset = ALIGN(start + SZ_8K + dax_label_reserve,
nd_pfn->align) - start;
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index e9aa453da50c..39dfd7affa31 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -262,16 +262,9 @@ static size_t pmem_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff,
return copy_from_iter_flushcache(addr, bytes, i);
}
-static void pmem_dax_flush(struct dax_device *dax_dev, pgoff_t pgoff,
- void *addr, size_t size)
-{
- arch_wb_cache_pmem(addr, size);
-}
-
static const struct dax_operations pmem_dax_ops = {
.direct_access = pmem_dax_direct_access,
.copy_from_iter = pmem_copy_from_iter,
- .flush = pmem_dax_flush,
};
static const struct attribute_group *pmem_attribute_groups[] = {
diff --git a/drivers/nvdimm/pmem.h b/drivers/nvdimm/pmem.h
index 5434321cad67..c5917f040fa7 100644
--- a/drivers/nvdimm/pmem.h
+++ b/drivers/nvdimm/pmem.h
@@ -5,20 +5,6 @@
#include <linux/pfn_t.h>
#include <linux/fs.h>
-#ifdef CONFIG_ARCH_HAS_PMEM_API
-#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
-void arch_wb_cache_pmem(void *addr, size_t size);
-void arch_invalidate_pmem(void *addr, size_t size);
-#else
-#define ARCH_MEMREMAP_PMEM MEMREMAP_WT
-static inline void arch_wb_cache_pmem(void *addr, size_t size)
-{
-}
-static inline void arch_invalidate_pmem(void *addr, size_t size)
-{
-}
-#endif
-
/* this definition is in it's own header for tools/testing/nvdimm to consume */
struct pmem_device {
/* One contiguous memory region per device */
diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
index 5954cfbea3fc..829d760f651c 100644
--- a/drivers/nvdimm/region_devs.c
+++ b/drivers/nvdimm/region_devs.c
@@ -723,8 +723,9 @@ static ssize_t mappingN(struct device *dev, char *buf, int n)
nd_mapping = &nd_region->mapping[n];
nvdimm = nd_mapping->nvdimm;
- return sprintf(buf, "%s,%llu,%llu\n", dev_name(&nvdimm->dev),
- nd_mapping->start, nd_mapping->size);
+ return sprintf(buf, "%s,%llu,%llu,%d\n", dev_name(&nvdimm->dev),
+ nd_mapping->start, nd_mapping->size,
+ nd_mapping->position);
}
#define REGION_MAPPING(idx) \
@@ -965,6 +966,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus,
nd_region->mapping[i].nvdimm = nvdimm;
nd_region->mapping[i].start = mapping->start;
nd_region->mapping[i].size = mapping->size;
+ nd_region->mapping[i].position = mapping->position;
INIT_LIST_HEAD(&nd_region->mapping[i].labels);
mutex_init(&nd_region->mapping[i].lock);
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 277a7a02cba5..bb2aad078637 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -134,8 +134,6 @@ static inline bool nvme_req_needs_retry(struct request *req)
return false;
if (nvme_req(req)->status & NVME_SC_DNR)
return false;
- if (jiffies - req->start_time >= req->timeout)
- return false;
if (nvme_req(req)->retries >= nvme_max_retries)
return false;
return true;
@@ -1897,6 +1895,8 @@ int nvme_init_identify(struct nvme_ctrl *ctrl)
ctrl->cntlid = le16_to_cpu(id->cntlid);
ctrl->hmpre = le32_to_cpu(id->hmpre);
ctrl->hmmin = le32_to_cpu(id->hmmin);
+ ctrl->hmminds = le32_to_cpu(id->hmminds);
+ ctrl->hmmaxd = le16_to_cpu(id->hmmaxd);
}
kfree(id);
@@ -2377,10 +2377,11 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
nvme_report_ns_ids(ctrl, ns->ns_id, id, ns->eui, ns->nguid, &ns->uuid);
- if (nvme_nvm_ns_supported(ns, id) &&
- nvme_nvm_register(ns, disk_name, node)) {
- dev_warn(ctrl->device, "%s: LightNVM init failure\n", __func__);
- goto out_free_id;
+ if ((ctrl->quirks & NVME_QUIRK_LIGHTNVM) && id->vs[0] == 0x1) {
+ if (nvme_nvm_register(ns, disk_name, node)) {
+ dev_warn(ctrl->device, "LightNVM init failure\n");
+ goto out_free_id;
+ }
}
disk = alloc_disk_node(0, node);
@@ -2587,7 +2588,7 @@ static void nvme_async_event_work(struct work_struct *work)
container_of(work, struct nvme_ctrl, async_event_work);
spin_lock_irq(&ctrl->lock);
- while (ctrl->event_limit > 0) {
+ while (ctrl->state == NVME_CTRL_LIVE && ctrl->event_limit > 0) {
int aer_idx = --ctrl->event_limit;
spin_unlock_irq(&ctrl->lock);
@@ -2674,7 +2675,8 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
/*FALLTHRU*/
case NVME_SC_ABORT_REQ:
++ctrl->event_limit;
- queue_work(nvme_wq, &ctrl->async_event_work);
+ if (ctrl->state == NVME_CTRL_LIVE)
+ queue_work(nvme_wq, &ctrl->async_event_work);
break;
default:
break;
@@ -2689,7 +2691,7 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
nvme_queue_scan(ctrl);
break;
case NVME_AER_NOTICE_FW_ACT_STARTING:
- schedule_work(&ctrl->fw_act_work);
+ queue_work(nvme_wq, &ctrl->fw_act_work);
break;
default:
dev_warn(ctrl->device, "async event result %08x\n", result);
diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index 47307752dc65..555c976cc2ee 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -565,6 +565,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
opts->queue_size = NVMF_DEF_QUEUE_SIZE;
opts->nr_io_queues = num_online_cpus();
opts->reconnect_delay = NVMF_DEF_RECONNECT_DELAY;
+ opts->kato = NVME_DEFAULT_KATO;
options = o = kstrdup(buf, GFP_KERNEL);
if (!options)
@@ -655,21 +656,22 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
goto out;
}
- if (opts->discovery_nqn) {
- pr_err("Discovery controllers cannot accept keep_alive_tmo != 0\n");
- ret = -EINVAL;
- goto out;
- }
-
if (token < 0) {
pr_err("Invalid keep_alive_tmo %d\n", token);
ret = -EINVAL;
goto out;
- } else if (token == 0) {
+ } else if (token == 0 && !opts->discovery_nqn) {
/* Allowed for debug */
pr_warn("keep_alive_tmo 0 won't execute keep alives!!!\n");
}
opts->kato = token;
+
+ if (opts->discovery_nqn && opts->kato) {
+ pr_err("Discovery controllers cannot accept KATO != 0\n");
+ ret = -EINVAL;
+ goto out;
+ }
+
break;
case NVMF_OPT_CTRL_LOSS_TMO:
if (match_int(args, &token)) {
@@ -762,8 +764,6 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
uuid_copy(&opts->host->id, &hostid);
out:
- if (!opts->discovery_nqn && !opts->kato)
- opts->kato = NVME_DEFAULT_KATO;
kfree(options);
return ret;
}
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
index d2e882c0f496..af075e998944 100644
--- a/drivers/nvme/host/fc.c
+++ b/drivers/nvme/host/fc.c
@@ -1376,7 +1376,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
if (atomic_read(&op->state) == FCPOP_STATE_ABORTED)
status = cpu_to_le16((NVME_SC_ABORT_REQ | NVME_SC_DNR) << 1);
else if (freq->status)
- status = cpu_to_le16(NVME_SC_FC_TRANSPORT_ERROR << 1);
+ status = cpu_to_le16(NVME_SC_INTERNAL << 1);
/*
* For the linux implementation, if we have an unsuccesful
@@ -1404,7 +1404,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
*/
if (freq->transferred_length !=
be32_to_cpu(op->cmd_iu.data_len)) {
- status = cpu_to_le16(NVME_SC_FC_TRANSPORT_ERROR << 1);
+ status = cpu_to_le16(NVME_SC_INTERNAL << 1);
goto done;
}
result.u64 = 0;
@@ -1421,7 +1421,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
freq->transferred_length ||
op->rsp_iu.status_code ||
sqe->common.command_id != cqe->command_id)) {
- status = cpu_to_le16(NVME_SC_FC_TRANSPORT_ERROR << 1);
+ status = cpu_to_le16(NVME_SC_INTERNAL << 1);
goto done;
}
result = cqe->result;
@@ -1429,7 +1429,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
break;
default:
- status = cpu_to_le16(NVME_SC_FC_TRANSPORT_ERROR << 1);
+ status = cpu_to_le16(NVME_SC_INTERNAL << 1);
goto done;
}
@@ -1989,16 +1989,17 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
* as well as those by FC-NVME spec.
*/
WARN_ON_ONCE(sqe->common.metadata);
- WARN_ON_ONCE(sqe->common.dptr.prp1);
- WARN_ON_ONCE(sqe->common.dptr.prp2);
sqe->common.flags |= NVME_CMD_SGL_METABUF;
/*
- * format SQE DPTR field per FC-NVME rules
- * type=data block descr; subtype=offset;
- * offset is currently 0.
+ * format SQE DPTR field per FC-NVME rules:
+ * type=0x5 Transport SGL Data Block Descriptor
+ * subtype=0xA Transport-specific value
+ * address=0
+ * length=length of the data series
*/
- sqe->rw.dptr.sgl.type = NVME_SGL_FMT_OFFSET;
+ sqe->rw.dptr.sgl.type = (NVME_TRANSPORT_SGL_DATA_DESC << 4) |
+ NVME_SGL_FMT_TRANSPORT_A;
sqe->rw.dptr.sgl.length = cpu_to_le32(data_len);
sqe->rw.dptr.sgl.addr = 0;
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index c1a28569e843..1f79e3f141e6 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -955,29 +955,3 @@ void nvme_nvm_unregister_sysfs(struct nvme_ns *ns)
sysfs_remove_group(&disk_to_dev(ns->disk)->kobj,
&nvm_dev_attr_group);
}
-
-/* move to shared place when used in multiple places. */
-#define PCI_VENDOR_ID_CNEX 0x1d1d
-#define PCI_DEVICE_ID_CNEX_WL 0x2807
-#define PCI_DEVICE_ID_CNEX_QEMU 0x1f1f
-
-int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id)
-{
- struct nvme_ctrl *ctrl = ns->ctrl;
- /* XXX: this is poking into PCI structures from generic code! */
- struct pci_dev *pdev = to_pci_dev(ctrl->dev);
-
- /* QEMU NVMe simulator - PCI ID + Vendor specific bit */
- if (pdev->vendor == PCI_VENDOR_ID_CNEX &&
- pdev->device == PCI_DEVICE_ID_CNEX_QEMU &&
- id->vs[0] == 0x1)
- return 1;
-
- /* CNEX Labs - PCI ID + Vendor specific bit */
- if (pdev->vendor == PCI_VENDOR_ID_CNEX &&
- pdev->device == PCI_DEVICE_ID_CNEX_WL &&
- id->vs[0] == 0x1)
- return 1;
-
- return 0;
-}
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index a19a587d60ed..d3f3c4447515 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -75,6 +75,11 @@ enum nvme_quirks {
* The deepest sleep state should not be used.
*/
NVME_QUIRK_NO_DEEPEST_PS = (1 << 5),
+
+ /*
+ * Supports the LighNVM command set if indicated in vs[1].
+ */
+ NVME_QUIRK_LIGHTNVM = (1 << 6),
};
/*
@@ -176,8 +181,11 @@ struct nvme_ctrl {
u64 ps_max_latency_us;
bool apst_enabled;
+ /* PCIe only: */
u32 hmpre;
u32 hmmin;
+ u32 hmminds;
+ u16 hmmaxd;
/* Fabrics only */
u16 sqsize;
@@ -320,7 +328,6 @@ void nvme_stop_keep_alive(struct nvme_ctrl *ctrl);
int nvme_reset_ctrl(struct nvme_ctrl *ctrl);
#ifdef CONFIG_NVM
-int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node);
void nvme_nvm_unregister(struct nvme_ns *ns);
int nvme_nvm_register_sysfs(struct nvme_ns *ns);
@@ -339,10 +346,6 @@ static inline int nvme_nvm_register_sysfs(struct nvme_ns *ns)
return 0;
}
static inline void nvme_nvm_unregister_sysfs(struct nvme_ns *ns) {};
-static inline int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id)
-{
- return 0;
-}
static inline int nvme_nvm_ioctl(struct nvme_ns *ns, unsigned int cmd,
unsigned long arg)
{
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 198245faba6b..cb73bc8cad3b 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -24,6 +24,7 @@
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/mutex.h>
+#include <linux/once.h>
#include <linux/pci.h>
#include <linux/poison.h>
#include <linux/t10-pi.h>
@@ -540,6 +541,20 @@ static void nvme_dif_complete(u32 p, u32 v, struct t10_pi_tuple *pi)
}
#endif
+static void nvme_print_sgl(struct scatterlist *sgl, int nents)
+{
+ int i;
+ struct scatterlist *sg;
+
+ for_each_sg(sgl, sg, nents, i) {
+ dma_addr_t phys = sg_phys(sg);
+ pr_warn("sg[%d] phys_addr:%pad offset:%d length:%d "
+ "dma_address:%pad dma_length:%d\n",
+ i, &phys, sg->offset, sg->length, &sg_dma_address(sg),
+ sg_dma_len(sg));
+ }
+}
+
static blk_status_t nvme_setup_prps(struct nvme_dev *dev, struct request *req)
{
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
@@ -622,19 +637,10 @@ static blk_status_t nvme_setup_prps(struct nvme_dev *dev, struct request *req)
return BLK_STS_OK;
bad_sgl:
- if (WARN_ONCE(1, "Invalid SGL for payload:%d nents:%d\n",
- blk_rq_payload_bytes(req), iod->nents)) {
- for_each_sg(iod->sg, sg, iod->nents, i) {
- dma_addr_t phys = sg_phys(sg);
- pr_warn("sg[%d] phys_addr:%pad offset:%d length:%d "
- "dma_address:%pad dma_length:%d\n", i, &phys,
- sg->offset, sg->length,
- &sg_dma_address(sg),
- sg_dma_len(sg));
- }
- }
+ WARN(DO_ONCE(nvme_print_sgl, iod->sg, iod->nents),
+ "Invalid SGL for payload:%d nents:%d\n",
+ blk_rq_payload_bytes(req), iod->nents);
return BLK_STS_IOERR;
-
}
static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
@@ -1313,11 +1319,11 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid)
if (result < 0)
goto release_cq;
+ nvme_init_queue(nvmeq, qid);
result = queue_request_irq(nvmeq);
if (result < 0)
goto release_sq;
- nvme_init_queue(nvmeq, qid);
return result;
release_sq:
@@ -1464,6 +1470,7 @@ static int nvme_pci_configure_admin_queue(struct nvme_dev *dev)
return result;
nvmeq->cq_vector = 0;
+ nvme_init_queue(nvmeq, 0);
result = queue_request_irq(nvmeq);
if (result) {
nvmeq->cq_vector = -1;
@@ -1612,21 +1619,23 @@ static void nvme_free_host_mem(struct nvme_dev *dev)
dev->host_mem_descs = NULL;
}
-static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)
+static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred,
+ u32 chunk_size)
{
struct nvme_host_mem_buf_desc *descs;
- u32 chunk_size, max_entries, len;
+ u32 max_entries, len;
dma_addr_t descs_dma;
int i = 0;
void **bufs;
u64 size = 0, tmp;
- /* start big and work our way down */
- chunk_size = min(preferred, (u64)PAGE_SIZE << MAX_ORDER);
-retry:
tmp = (preferred + chunk_size - 1);
do_div(tmp, chunk_size);
max_entries = tmp;
+
+ if (dev->ctrl.hmmaxd && dev->ctrl.hmmaxd < max_entries)
+ max_entries = dev->ctrl.hmmaxd;
+
descs = dma_zalloc_coherent(dev->dev, max_entries * sizeof(*descs),
&descs_dma, GFP_KERNEL);
if (!descs)
@@ -1650,15 +1659,9 @@ retry:
i++;
}
- if (!size || (min && size < min)) {
- dev_warn(dev->ctrl.device,
- "failed to allocate host memory buffer.\n");
+ if (!size)
goto out_free_bufs;
- }
- dev_info(dev->ctrl.device,
- "allocated %lld MiB host memory buffer.\n",
- size >> ilog2(SZ_1M));
dev->nr_host_mem_descs = i;
dev->host_mem_size = size;
dev->host_mem_descs = descs;
@@ -1679,21 +1682,35 @@ out_free_descs:
dma_free_coherent(dev->dev, max_entries * sizeof(*descs), descs,
descs_dma);
out:
- /* try a smaller chunk size if we failed early */
- if (chunk_size >= PAGE_SIZE * 2 && (i == 0 || size < min)) {
- chunk_size /= 2;
- goto retry;
- }
dev->host_mem_descs = NULL;
return -ENOMEM;
}
-static void nvme_setup_host_mem(struct nvme_dev *dev)
+static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)
+{
+ u32 chunk_size;
+
+ /* start big and work our way down */
+ for (chunk_size = min_t(u64, preferred, PAGE_SIZE * MAX_ORDER_NR_PAGES);
+ chunk_size >= max_t(u32, dev->ctrl.hmminds * 4096, PAGE_SIZE * 2);
+ chunk_size /= 2) {
+ if (!__nvme_alloc_host_mem(dev, preferred, chunk_size)) {
+ if (!min || dev->host_mem_size >= min)
+ return 0;
+ nvme_free_host_mem(dev);
+ }
+ }
+
+ return -ENOMEM;
+}
+
+static int nvme_setup_host_mem(struct nvme_dev *dev)
{
u64 max = (u64)max_host_mem_size_mb * SZ_1M;
u64 preferred = (u64)dev->ctrl.hmpre * 4096;
u64 min = (u64)dev->ctrl.hmmin * 4096;
u32 enable_bits = NVME_HOST_MEM_ENABLE;
+ int ret = 0;
preferred = min(preferred, max);
if (min > max) {
@@ -1701,7 +1718,7 @@ static void nvme_setup_host_mem(struct nvme_dev *dev)
"min host memory (%lld MiB) above limit (%d MiB).\n",
min >> ilog2(SZ_1M), max_host_mem_size_mb);
nvme_free_host_mem(dev);
- return;
+ return 0;
}
/*
@@ -1715,12 +1732,21 @@ static void nvme_setup_host_mem(struct nvme_dev *dev)
}
if (!dev->host_mem_descs) {
- if (nvme_alloc_host_mem(dev, min, preferred))
- return;
+ if (nvme_alloc_host_mem(dev, min, preferred)) {
+ dev_warn(dev->ctrl.device,
+ "failed to allocate host memory buffer.\n");
+ return 0; /* controller must work without HMB */
+ }
+
+ dev_info(dev->ctrl.device,
+ "allocated %lld MiB host memory buffer.\n",
+ dev->host_mem_size >> ilog2(SZ_1M));
}
- if (nvme_set_host_mem(dev, enable_bits))
+ ret = nvme_set_host_mem(dev, enable_bits);
+ if (ret)
nvme_free_host_mem(dev);
+ return ret;
}
static int nvme_setup_io_queues(struct nvme_dev *dev)
@@ -2137,7 +2163,6 @@ static void nvme_reset_work(struct work_struct *work)
if (result)
goto out;
- nvme_init_queue(dev->queues[0], 0);
result = nvme_alloc_admin_tags(dev);
if (result)
goto out;
@@ -2164,8 +2189,11 @@ static void nvme_reset_work(struct work_struct *work)
"unable to allocate dma for dbbuf\n");
}
- if (dev->ctrl.hmpre)
- nvme_setup_host_mem(dev);
+ if (dev->ctrl.hmpre) {
+ result = nvme_setup_host_mem(dev);
+ if (result < 0)
+ goto out;
+ }
result = nvme_setup_io_queues(dev);
if (result)
@@ -2497,6 +2525,10 @@ static const struct pci_device_id nvme_id_table[] = {
.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, },
{ PCI_DEVICE(0x144d, 0xa822), /* Samsung PM1725a */
.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, },
+ { PCI_DEVICE(0x1d1d, 0x1f1f), /* LighNVM qemu device */
+ .driver_data = NVME_QUIRK_LIGHTNVM, },
+ { PCI_DEVICE(0x1d1d, 0x2807), /* CNEX WL */
+ .driver_data = NVME_QUIRK_LIGHTNVM, },
{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) },
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) },
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 58983000964b..92a03ff5fb4d 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -942,7 +942,12 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work)
}
changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_LIVE);
- WARN_ON_ONCE(!changed);
+ if (!changed) {
+ /* state change failure is ok if we're in DELETING state */
+ WARN_ON_ONCE(ctrl->ctrl.state != NVME_CTRL_DELETING);
+ return;
+ }
+
ctrl->ctrl.nr_reconnects = 0;
nvme_start_ctrl(&ctrl->ctrl);
@@ -962,7 +967,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work)
struct nvme_rdma_ctrl *ctrl = container_of(work,
struct nvme_rdma_ctrl, err_work);
- nvme_stop_ctrl(&ctrl->ctrl);
+ nvme_stop_keep_alive(&ctrl->ctrl);
if (ctrl->ctrl.queue_count > 1) {
nvme_stop_queues(&ctrl->ctrl);
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 7c23eaf8e563..1b208beeef50 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -390,10 +390,10 @@ static void __nvmet_req_complete(struct nvmet_req *req, u16 status)
if (status)
nvmet_set_status(req, status);
- /* XXX: need to fill in something useful for sq_head */
- req->rsp->sq_head = 0;
- if (likely(req->sq)) /* may happen during early failure */
- req->rsp->sq_id = cpu_to_le16(req->sq->qid);
+ if (req->sq->size)
+ req->sq->sqhd = (req->sq->sqhd + 1) % req->sq->size;
+ req->rsp->sq_head = cpu_to_le16(req->sq->sqhd);
+ req->rsp->sq_id = cpu_to_le16(req->sq->qid);
req->rsp->command_id = req->cmd->common.command_id;
if (req->ns)
@@ -420,6 +420,7 @@ void nvmet_cq_setup(struct nvmet_ctrl *ctrl, struct nvmet_cq *cq,
void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq,
u16 qid, u16 size)
{
+ sq->sqhd = 0;
sq->qid = qid;
sq->size = size;
diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c
index 859a66725291..db3bf6b8bf9e 100644
--- a/drivers/nvme/target/fabrics-cmd.c
+++ b/drivers/nvme/target/fabrics-cmd.c
@@ -109,9 +109,14 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req)
pr_warn("queue already connected!\n");
return NVME_SC_CONNECT_CTRL_BUSY | NVME_SC_DNR;
}
+ if (!sqsize) {
+ pr_warn("queue size zero!\n");
+ return NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR;
+ }
- nvmet_cq_setup(ctrl, req->cq, qid, sqsize);
- nvmet_sq_setup(ctrl, req->sq, qid, sqsize);
+ /* note: convert queue size from 0's-based value to 1's-based value */
+ nvmet_cq_setup(ctrl, req->cq, qid, sqsize + 1);
+ nvmet_sq_setup(ctrl, req->sq, qid, sqsize + 1);
return 0;
}
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index 421e43bf1dd7..58e010bdda3e 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -148,7 +148,7 @@ struct nvmet_fc_tgt_assoc {
u32 a_id;
struct nvmet_fc_tgtport *tgtport;
struct list_head a_list;
- struct nvmet_fc_tgt_queue *queues[NVMET_NR_QUEUES];
+ struct nvmet_fc_tgt_queue *queues[NVMET_NR_QUEUES + 1];
struct kref ref;
};
@@ -608,7 +608,7 @@ nvmet_fc_alloc_target_queue(struct nvmet_fc_tgt_assoc *assoc,
unsigned long flags;
int ret;
- if (qid >= NVMET_NR_QUEUES)
+ if (qid > NVMET_NR_QUEUES)
return NULL;
queue = kzalloc((sizeof(*queue) +
@@ -783,6 +783,9 @@ nvmet_fc_find_target_queue(struct nvmet_fc_tgtport *tgtport,
u16 qid = nvmet_fc_getqueueid(connection_id);
unsigned long flags;
+ if (qid > NVMET_NR_QUEUES)
+ return NULL;
+
spin_lock_irqsave(&tgtport->lock, flags);
list_for_each_entry(assoc, &tgtport->assoc_list, a_list) {
if (association_id == assoc->association_id) {
@@ -888,7 +891,7 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc)
int i;
spin_lock_irqsave(&tgtport->lock, flags);
- for (i = NVMET_NR_QUEUES - 1; i >= 0; i--) {
+ for (i = NVMET_NR_QUEUES; i >= 0; i--) {
queue = assoc->queues[i];
if (queue) {
if (!nvmet_fc_tgt_q_get(queue))
@@ -1910,8 +1913,7 @@ nvmet_fc_transfer_fcp_data(struct nvmet_fc_tgtport *tgtport,
spin_lock_irqsave(&fod->flock, flags);
fod->writedataactive = false;
spin_unlock_irqrestore(&fod->flock, flags);
- nvmet_req_complete(&fod->req,
- NVME_SC_FC_TRANSPORT_ERROR);
+ nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
} else /* NVMET_FCOP_READDATA or NVMET_FCOP_READDATA_RSP */ {
fcpreq->fcp_error = ret;
fcpreq->transferred_length = 0;
@@ -1929,8 +1931,7 @@ __nvmet_fc_fod_op_abort(struct nvmet_fc_fcp_iod *fod, bool abort)
/* if in the middle of an io and we need to tear down */
if (abort) {
if (fcpreq->op == NVMET_FCOP_WRITEDATA) {
- nvmet_req_complete(&fod->req,
- NVME_SC_FC_TRANSPORT_ERROR);
+ nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
return true;
}
@@ -1968,8 +1969,7 @@ nvmet_fc_fod_op_done(struct nvmet_fc_fcp_iod *fod)
fod->abort = true;
spin_unlock(&fod->flock);
- nvmet_req_complete(&fod->req,
- NVME_SC_FC_TRANSPORT_ERROR);
+ nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
return;
}
@@ -2533,13 +2533,17 @@ nvmet_fc_remove_port(struct nvmet_port *port)
{
struct nvmet_fc_tgtport *tgtport = port->priv;
unsigned long flags;
+ bool matched = false;
spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
if (tgtport->port == port) {
- nvmet_fc_tgtport_put(tgtport);
+ matched = true;
tgtport->port = NULL;
}
spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
+
+ if (matched)
+ nvmet_fc_tgtport_put(tgtport);
}
static struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c
index 1cb9847ec261..7b75d9de55ab 100644
--- a/drivers/nvme/target/fcloop.c
+++ b/drivers/nvme/target/fcloop.c
@@ -224,8 +224,6 @@ struct fcloop_nport {
struct fcloop_lport *lport;
struct list_head nport_list;
struct kref ref;
- struct completion rport_unreg_done;
- struct completion tport_unreg_done;
u64 node_name;
u64 port_name;
u32 port_role;
@@ -576,7 +574,7 @@ fcloop_tgt_fcp_abort(struct nvmet_fc_target_port *tgtport,
tfcp_req->aborted = true;
spin_unlock(&tfcp_req->reqlock);
- tfcp_req->status = NVME_SC_FC_TRANSPORT_ABORTED;
+ tfcp_req->status = NVME_SC_INTERNAL;
/*
* nothing more to do. If io wasn't active, the transport should
@@ -631,6 +629,32 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport,
}
static void
+fcloop_nport_free(struct kref *ref)
+{
+ struct fcloop_nport *nport =
+ container_of(ref, struct fcloop_nport, ref);
+ unsigned long flags;
+
+ spin_lock_irqsave(&fcloop_lock, flags);
+ list_del(&nport->nport_list);
+ spin_unlock_irqrestore(&fcloop_lock, flags);
+
+ kfree(nport);
+}
+
+static void
+fcloop_nport_put(struct fcloop_nport *nport)
+{
+ kref_put(&nport->ref, fcloop_nport_free);
+}
+
+static int
+fcloop_nport_get(struct fcloop_nport *nport)
+{
+ return kref_get_unless_zero(&nport->ref);
+}
+
+static void
fcloop_localport_delete(struct nvme_fc_local_port *localport)
{
struct fcloop_lport *lport = localport->private;
@@ -644,8 +668,7 @@ fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport)
{
struct fcloop_rport *rport = remoteport->private;
- /* release any threads waiting for the unreg to complete */
- complete(&rport->nport->rport_unreg_done);
+ fcloop_nport_put(rport->nport);
}
static void
@@ -653,8 +676,7 @@ fcloop_targetport_delete(struct nvmet_fc_target_port *targetport)
{
struct fcloop_tport *tport = targetport->private;
- /* release any threads waiting for the unreg to complete */
- complete(&tport->nport->tport_unreg_done);
+ fcloop_nport_put(tport->nport);
}
#define FCLOOP_HW_QUEUES 4
@@ -722,6 +744,7 @@ fcloop_create_local_port(struct device *dev, struct device_attribute *attr,
goto out_free_opts;
}
+ memset(&pinfo, 0, sizeof(pinfo));
pinfo.node_name = opts->wwnn;
pinfo.port_name = opts->wwpn;
pinfo.port_role = opts->roles;
@@ -804,32 +827,6 @@ fcloop_delete_local_port(struct device *dev, struct device_attribute *attr,
return ret ? ret : count;
}
-static void
-fcloop_nport_free(struct kref *ref)
-{
- struct fcloop_nport *nport =
- container_of(ref, struct fcloop_nport, ref);
- unsigned long flags;
-
- spin_lock_irqsave(&fcloop_lock, flags);
- list_del(&nport->nport_list);
- spin_unlock_irqrestore(&fcloop_lock, flags);
-
- kfree(nport);
-}
-
-static void
-fcloop_nport_put(struct fcloop_nport *nport)
-{
- kref_put(&nport->ref, fcloop_nport_free);
-}
-
-static int
-fcloop_nport_get(struct fcloop_nport *nport)
-{
- return kref_get_unless_zero(&nport->ref);
-}
-
static struct fcloop_nport *
fcloop_alloc_nport(const char *buf, size_t count, bool remoteport)
{
@@ -938,6 +935,7 @@ fcloop_create_remote_port(struct device *dev, struct device_attribute *attr,
if (!nport)
return -EIO;
+ memset(&pinfo, 0, sizeof(pinfo));
pinfo.node_name = nport->node_name;
pinfo.port_name = nport->port_name;
pinfo.port_role = nport->port_role;
@@ -979,24 +977,12 @@ __unlink_remote_port(struct fcloop_nport *nport)
}
static int
-__wait_remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport)
+__remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport)
{
- int ret;
-
if (!rport)
return -EALREADY;
- init_completion(&nport->rport_unreg_done);
-
- ret = nvme_fc_unregister_remoteport(rport->remoteport);
- if (ret)
- return ret;
-
- wait_for_completion(&nport->rport_unreg_done);
-
- fcloop_nport_put(nport);
-
- return ret;
+ return nvme_fc_unregister_remoteport(rport->remoteport);
}
static ssize_t
@@ -1029,7 +1015,7 @@ fcloop_delete_remote_port(struct device *dev, struct device_attribute *attr,
if (!nport)
return -ENOENT;
- ret = __wait_remoteport_unreg(nport, rport);
+ ret = __remoteport_unreg(nport, rport);
return ret ? ret : count;
}
@@ -1086,24 +1072,12 @@ __unlink_target_port(struct fcloop_nport *nport)
}
static int
-__wait_targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport)
+__targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport)
{
- int ret;
-
if (!tport)
return -EALREADY;
- init_completion(&nport->tport_unreg_done);
-
- ret = nvmet_fc_unregister_targetport(tport->targetport);
- if (ret)
- return ret;
-
- wait_for_completion(&nport->tport_unreg_done);
-
- fcloop_nport_put(nport);
-
- return ret;
+ return nvmet_fc_unregister_targetport(tport->targetport);
}
static ssize_t
@@ -1136,7 +1110,7 @@ fcloop_delete_target_port(struct device *dev, struct device_attribute *attr,
if (!nport)
return -ENOENT;
- ret = __wait_targetport_unreg(nport, tport);
+ ret = __targetport_unreg(nport, tport);
return ret ? ret : count;
}
@@ -1223,11 +1197,11 @@ static void __exit fcloop_exit(void)
spin_unlock_irqrestore(&fcloop_lock, flags);
- ret = __wait_targetport_unreg(nport, tport);
+ ret = __targetport_unreg(nport, tport);
if (ret)
pr_warn("%s: Failed deleting target port\n", __func__);
- ret = __wait_remoteport_unreg(nport, rport);
+ ret = __remoteport_unreg(nport, rport);
if (ret)
pr_warn("%s: Failed deleting remote port\n", __func__);
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index 7d261ab894f4..7b8e20adf760 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -74,6 +74,7 @@ struct nvmet_sq {
struct percpu_ref ref;
u16 qid;
u16 size;
+ u16 sqhd;
struct completion free_done;
struct completion confirm_done;
};
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index de54c7f5048a..d12e5de78e70 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -135,7 +135,7 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
/* Stop the user from writing */
if (pos >= nvmem->size)
- return 0;
+ return -EFBIG;
if (count < nvmem->word_size)
return -EINVAL;
@@ -789,6 +789,7 @@ struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
return ERR_PTR(-EINVAL);
nvmem = __nvmem_device_get(nvmem_np, NULL, NULL);
+ of_node_put(nvmem_np);
if (IS_ERR(nvmem))
return ERR_CAST(nvmem);
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 17b66e9715d2..64b710265d39 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -9,6 +9,9 @@
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/slab.h>
+#include <linux/pci.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
#include <asm/errno.h>
#include "of_private.h"
@@ -84,31 +87,28 @@ int of_device_add(struct platform_device *ofdev)
*/
int of_dma_configure(struct device *dev, struct device_node *np)
{
- u64 dma_addr, paddr, size;
+ u64 dma_addr, paddr, size = 0;
int ret;
bool coherent;
unsigned long offset;
const struct iommu_ops *iommu;
u64 mask;
- /*
- * Set default coherent_dma_mask to 32 bit. Drivers are expected to
- * setup the correct supported mask.
- */
- if (!dev->coherent_dma_mask)
- dev->coherent_dma_mask = DMA_BIT_MASK(32);
-
- /*
- * Set it to coherent_dma_mask by default if the architecture
- * code has not set it.
- */
- if (!dev->dma_mask)
- dev->dma_mask = &dev->coherent_dma_mask;
-
ret = of_dma_get_range(np, &dma_addr, &paddr, &size);
if (ret < 0) {
+ /*
+ * For legacy reasons, we have to assume some devices need
+ * DMA configuration regardless of whether "dma-ranges" is
+ * correctly specified or not.
+ */
+ if (!dev_is_pci(dev) &&
+#ifdef CONFIG_ARM_AMBA
+ dev->bus != &amba_bustype &&
+#endif
+ dev->bus != &platform_bus_type)
+ return ret == -ENODEV ? 0 : ret;
+
dma_addr = offset = 0;
- size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
} else {
offset = PFN_DOWN(paddr - dma_addr);
@@ -129,6 +129,22 @@ int of_dma_configure(struct device *dev, struct device_node *np)
dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
}
+ /*
+ * Set default coherent_dma_mask to 32 bit. Drivers are expected to
+ * setup the correct supported mask.
+ */
+ if (!dev->coherent_dma_mask)
+ dev->coherent_dma_mask = DMA_BIT_MASK(32);
+ /*
+ * Set it to coherent_dma_mask by default if the architecture
+ * code has not set it.
+ */
+ if (!dev->dma_mask)
+ dev->dma_mask = &dev->coherent_dma_mask;
+
+ if (!size)
+ size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
+
dev->dma_pfn_offset = offset;
/*
diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
index 4ddc6e8f9fe7..f9308c2f22e6 100644
--- a/drivers/pci/endpoint/functions/pci-epf-test.c
+++ b/drivers/pci/endpoint/functions/pci-epf-test.c
@@ -251,9 +251,8 @@ err:
return ret;
}
-static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test)
+static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test, u8 irq)
{
- u8 irq;
u8 msi_count;
struct pci_epf *epf = epf_test->epf;
struct pci_epc *epc = epf->epc;
@@ -262,7 +261,6 @@ static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test)
reg->status |= STATUS_IRQ_RAISED;
msi_count = pci_epc_get_msi(epc);
- irq = (reg->command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
if (irq > msi_count || msi_count <= 0)
pci_epc_raise_irq(epc, PCI_EPC_IRQ_LEGACY, 0);
else
@@ -289,6 +287,8 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
reg->command = 0;
reg->status = 0;
+ irq = (command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
+
if (command & COMMAND_RAISE_LEGACY_IRQ) {
reg->status = STATUS_IRQ_RAISED;
pci_epc_raise_irq(epc, PCI_EPC_IRQ_LEGACY, 0);
@@ -301,7 +301,7 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
reg->status |= STATUS_WRITE_FAIL;
else
reg->status |= STATUS_WRITE_SUCCESS;
- pci_epf_test_raise_irq(epf_test);
+ pci_epf_test_raise_irq(epf_test, irq);
goto reset_handler;
}
@@ -311,7 +311,7 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
reg->status |= STATUS_READ_SUCCESS;
else
reg->status |= STATUS_READ_FAIL;
- pci_epf_test_raise_irq(epf_test);
+ pci_epf_test_raise_irq(epf_test, irq);
goto reset_handler;
}
@@ -321,13 +321,12 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
reg->status |= STATUS_COPY_SUCCESS;
else
reg->status |= STATUS_COPY_FAIL;
- pci_epf_test_raise_irq(epf_test);
+ pci_epf_test_raise_irq(epf_test, irq);
goto reset_handler;
}
if (command & COMMAND_RAISE_MSI_IRQ) {
msi_count = pci_epc_get_msi(epc);
- irq = (command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
if (irq > msi_count || msi_count <= 0)
goto reset_handler;
reg->status = STATUS_IRQ_RAISED;
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index 1eecfa301f7f..8e075ea2743e 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -686,7 +686,7 @@ static ssize_t driver_override_store(struct device *dev,
const char *buf, size_t count)
{
struct pci_dev *pdev = to_pci_dev(dev);
- char *driver_override, *old = pdev->driver_override, *cp;
+ char *driver_override, *old, *cp;
/* We need to keep extra room for a newline */
if (count >= (PAGE_SIZE - 1))
@@ -700,12 +700,15 @@ static ssize_t driver_override_store(struct device *dev,
if (cp)
*cp = '\0';
+ device_lock(dev);
+ old = pdev->driver_override;
if (strlen(driver_override)) {
pdev->driver_override = driver_override;
} else {
kfree(driver_override);
pdev->driver_override = NULL;
}
+ device_unlock(dev);
kfree(old);
@@ -716,8 +719,12 @@ static ssize_t driver_override_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
+ ssize_t len;
- return snprintf(buf, PAGE_SIZE, "%s\n", pdev->driver_override);
+ device_lock(dev);
+ len = snprintf(buf, PAGE_SIZE, "%s\n", pdev->driver_override);
+ device_unlock(dev);
+ return len;
}
static DEVICE_ATTR_RW(driver_override);
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index b0002daa50f3..6078dfc11b11 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -52,7 +52,6 @@ static void pci_pme_list_scan(struct work_struct *work);
static LIST_HEAD(pci_pme_list);
static DEFINE_MUTEX(pci_pme_list_mutex);
static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan);
-static DEFINE_MUTEX(pci_bridge_mutex);
struct pci_pme_device {
struct list_head list;
@@ -1351,16 +1350,10 @@ static void pci_enable_bridge(struct pci_dev *dev)
if (bridge)
pci_enable_bridge(bridge);
- /*
- * Hold pci_bridge_mutex to prevent a race when enabling two
- * devices below the bridge simultaneously. The race may cause a
- * PCI_COMMAND_MEMORY update to be lost (see changelog).
- */
- mutex_lock(&pci_bridge_mutex);
if (pci_is_enabled(dev)) {
if (!dev->is_busmaster)
pci_set_master(dev);
- goto end;
+ return;
}
retval = pci_enable_device(dev);
@@ -1368,8 +1361,6 @@ static void pci_enable_bridge(struct pci_dev *dev)
dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n",
retval);
pci_set_master(dev);
-end:
- mutex_unlock(&pci_bridge_mutex);
}
static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
@@ -1394,7 +1385,7 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
return 0; /* already enabled */
bridge = pci_upstream_bridge(dev);
- if (bridge && !pci_is_enabled(bridge))
+ if (bridge)
pci_enable_bridge(bridge);
/* only skip sriov related */
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
index be635f017756..083276e03c38 100644
--- a/drivers/pci/pcie/portdrv_pci.c
+++ b/drivers/pci/pcie/portdrv_pci.c
@@ -260,7 +260,7 @@ static int __init dmi_pcie_pme_disable_msi(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id __initdata pcie_portdrv_dmi_table[] = {
+static const struct dmi_system_id pcie_portdrv_dmi_table[] __initconst = {
/*
* Boxes that should not use MSI for PCIe PME signaling.
*/
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index a2afb44fad10..a4d33619a7bb 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1707,7 +1707,7 @@ static int dmi_disable_ioapicreroute(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id boot_interrupt_dmi_table[] = {
+static const struct dmi_system_id boot_interrupt_dmi_table[] = {
/*
* Systems to exclude from boot interrupt reroute quirks
*/
diff --git a/drivers/pcmcia/db1xxx_ss.c b/drivers/pcmcia/db1xxx_ss.c
index 944674ee3464..19e17829f515 100644
--- a/drivers/pcmcia/db1xxx_ss.c
+++ b/drivers/pcmcia/db1xxx_ss.c
@@ -131,22 +131,27 @@ static irqreturn_t db1000_pcmcia_stschgirq(int irq, void *data)
return IRQ_HANDLED;
}
+/* Db/Pb1200 have separate per-socket insertion and ejection
+ * interrupts which stay asserted as long as the card is
+ * inserted/missing. The one which caused us to be called
+ * needs to be disabled and the other one enabled.
+ */
static irqreturn_t db1200_pcmcia_cdirq(int irq, void *data)
{
+ disable_irq_nosync(irq);
+ return IRQ_WAKE_THREAD;
+}
+
+static irqreturn_t db1200_pcmcia_cdirq_fn(int irq, void *data)
+{
struct db1x_pcmcia_sock *sock = data;
- /* Db/Pb1200 have separate per-socket insertion and ejection
- * interrupts which stay asserted as long as the card is
- * inserted/missing. The one which caused us to be called
- * needs to be disabled and the other one enabled.
- */
- if (irq == sock->insert_irq) {
- disable_irq_nosync(sock->insert_irq);
+ /* Wait a bit for the signals to stop bouncing. */
+ msleep(100);
+ if (irq == sock->insert_irq)
enable_irq(sock->eject_irq);
- } else {
- disable_irq_nosync(sock->eject_irq);
+ else
enable_irq(sock->insert_irq);
- }
pcmcia_parse_events(&sock->socket, SS_DETECT);
@@ -172,13 +177,13 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
*/
if ((sock->board_type == BOARD_TYPE_DB1200) ||
(sock->board_type == BOARD_TYPE_DB1300)) {
- ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq,
- 0, "pcmcia_insert", sock);
+ ret = request_threaded_irq(sock->insert_irq, db1200_pcmcia_cdirq,
+ db1200_pcmcia_cdirq_fn, 0, "pcmcia_insert", sock);
if (ret)
goto out1;
- ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq,
- 0, "pcmcia_eject", sock);
+ ret = request_threaded_irq(sock->eject_irq, db1200_pcmcia_cdirq,
+ db1200_pcmcia_cdirq_fn, 0, "pcmcia_eject", sock);
if (ret) {
free_irq(sock->insert_irq, sock);
goto out1;
diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
index 0a9b78705ee8..3303dd8d8eb5 100644
--- a/drivers/perf/arm_pmu_acpi.c
+++ b/drivers/perf/arm_pmu_acpi.c
@@ -235,6 +235,7 @@ int arm_pmu_acpi_probe(armpmu_init_fn init_fn)
ret = armpmu_register(pmu);
if (ret) {
pr_warn("Failed to register PMU for CPU%d\n", cpu);
+ kfree(pmu->name);
return ret;
}
}
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index 441912c10b82..5c8d452e35e2 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -44,6 +44,7 @@ source "drivers/phy/allwinner/Kconfig"
source "drivers/phy/amlogic/Kconfig"
source "drivers/phy/broadcom/Kconfig"
source "drivers/phy/hisilicon/Kconfig"
+source "drivers/phy/lantiq/Kconfig"
source "drivers/phy/marvell/Kconfig"
source "drivers/phy/mediatek/Kconfig"
source "drivers/phy/motorola/Kconfig"
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index 06f3c500030d..3a52dcb09566 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -6,9 +6,9 @@ obj-$(CONFIG_GENERIC_PHY) += phy-core.o
obj-$(CONFIG_PHY_LPC18XX_USB_OTG) += phy-lpc18xx-usb-otg.o
obj-$(CONFIG_PHY_XGENE) += phy-xgene.o
obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o
-
obj-$(CONFIG_ARCH_SUNXI) += allwinner/
obj-$(CONFIG_ARCH_MESON) += amlogic/
+obj-$(CONFIG_LANTIQ) += lantiq/
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
obj-$(CONFIG_ARCH_RENESAS) += renesas/
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
diff --git a/drivers/phy/lantiq/Kconfig b/drivers/phy/lantiq/Kconfig
new file mode 100644
index 000000000000..326d88a6417d
--- /dev/null
+++ b/drivers/phy/lantiq/Kconfig
@@ -0,0 +1,9 @@
+#
+# Phy drivers for Lantiq / Intel platforms
+#
+config PHY_LANTIQ_RCU_USB2
+ tristate "Lantiq XWAY SoC RCU based USB PHY"
+ depends on OF && (SOC_TYPE_XWAY || COMPILE_TEST)
+ select GENERIC_PHY
+ help
+ Support for the USB PHY(s) on the Lantiq / Intel XWAY family SoCs.
diff --git a/drivers/phy/lantiq/Makefile b/drivers/phy/lantiq/Makefile
new file mode 100644
index 000000000000..f73eb56a5416
--- /dev/null
+++ b/drivers/phy/lantiq/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_PHY_LANTIQ_RCU_USB2) += phy-lantiq-rcu-usb2.o
diff --git a/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c b/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c
new file mode 100644
index 000000000000..986224fca9e9
--- /dev/null
+++ b/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c
@@ -0,0 +1,254 @@
+/*
+ * Lantiq XWAY SoC RCU module based USB 1.1/2.0 PHY driver
+ *
+ * Copyright (C) 2016 Martin Blumenstingl <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+/* Transmitter HS Pre-Emphasis Enable */
+#define RCU_CFG1_TX_PEE BIT(0)
+/* Disconnect Threshold */
+#define RCU_CFG1_DIS_THR_MASK 0x00038000
+#define RCU_CFG1_DIS_THR_SHIFT 15
+
+struct ltq_rcu_usb2_bits {
+ u8 hostmode;
+ u8 slave_endianness;
+ u8 host_endianness;
+ bool have_ana_cfg;
+};
+
+struct ltq_rcu_usb2_priv {
+ struct regmap *regmap;
+ unsigned int phy_reg_offset;
+ unsigned int ana_cfg1_reg_offset;
+ const struct ltq_rcu_usb2_bits *reg_bits;
+ struct device *dev;
+ struct phy *phy;
+ struct clk *phy_gate_clk;
+ struct reset_control *ctrl_reset;
+ struct reset_control *phy_reset;
+};
+
+static const struct ltq_rcu_usb2_bits xway_rcu_usb2_reg_bits = {
+ .hostmode = 11,
+ .slave_endianness = 9,
+ .host_endianness = 10,
+ .have_ana_cfg = false,
+};
+
+static const struct ltq_rcu_usb2_bits xrx100_rcu_usb2_reg_bits = {
+ .hostmode = 11,
+ .slave_endianness = 17,
+ .host_endianness = 10,
+ .have_ana_cfg = false,
+};
+
+static const struct ltq_rcu_usb2_bits xrx200_rcu_usb2_reg_bits = {
+ .hostmode = 11,
+ .slave_endianness = 9,
+ .host_endianness = 10,
+ .have_ana_cfg = true,
+};
+
+static const struct of_device_id ltq_rcu_usb2_phy_of_match[] = {
+ {
+ .compatible = "lantiq,ase-usb2-phy",
+ .data = &xway_rcu_usb2_reg_bits,
+ },
+ {
+ .compatible = "lantiq,danube-usb2-phy",
+ .data = &xway_rcu_usb2_reg_bits,
+ },
+ {
+ .compatible = "lantiq,xrx100-usb2-phy",
+ .data = &xrx100_rcu_usb2_reg_bits,
+ },
+ {
+ .compatible = "lantiq,xrx200-usb2-phy",
+ .data = &xrx200_rcu_usb2_reg_bits,
+ },
+ {
+ .compatible = "lantiq,xrx300-usb2-phy",
+ .data = &xrx200_rcu_usb2_reg_bits,
+ },
+ { },
+};
+MODULE_DEVICE_TABLE(of, ltq_rcu_usb2_phy_of_match);
+
+static int ltq_rcu_usb2_phy_init(struct phy *phy)
+{
+ struct ltq_rcu_usb2_priv *priv = phy_get_drvdata(phy);
+
+ if (priv->reg_bits->have_ana_cfg) {
+ regmap_update_bits(priv->regmap, priv->ana_cfg1_reg_offset,
+ RCU_CFG1_TX_PEE, RCU_CFG1_TX_PEE);
+ regmap_update_bits(priv->regmap, priv->ana_cfg1_reg_offset,
+ RCU_CFG1_DIS_THR_MASK, 7 << RCU_CFG1_DIS_THR_SHIFT);
+ }
+
+ /* Configure core to host mode */
+ regmap_update_bits(priv->regmap, priv->phy_reg_offset,
+ BIT(priv->reg_bits->hostmode), 0);
+
+ /* Select DMA endianness (Host-endian: big-endian) */
+ regmap_update_bits(priv->regmap, priv->phy_reg_offset,
+ BIT(priv->reg_bits->slave_endianness), 0);
+ regmap_update_bits(priv->regmap, priv->phy_reg_offset,
+ BIT(priv->reg_bits->host_endianness),
+ BIT(priv->reg_bits->host_endianness));
+
+ return 0;
+}
+
+static int ltq_rcu_usb2_phy_power_on(struct phy *phy)
+{
+ struct ltq_rcu_usb2_priv *priv = phy_get_drvdata(phy);
+ struct device *dev = priv->dev;
+ int ret;
+
+ reset_control_deassert(priv->phy_reset);
+
+ ret = clk_prepare_enable(priv->phy_gate_clk);
+ if (ret)
+ dev_err(dev, "failed to enable PHY gate\n");
+
+ return ret;
+}
+
+static int ltq_rcu_usb2_phy_power_off(struct phy *phy)
+{
+ struct ltq_rcu_usb2_priv *priv = phy_get_drvdata(phy);
+
+ reset_control_assert(priv->phy_reset);
+
+ clk_disable_unprepare(priv->phy_gate_clk);
+
+ return 0;
+}
+
+static struct phy_ops ltq_rcu_usb2_phy_ops = {
+ .init = ltq_rcu_usb2_phy_init,
+ .power_on = ltq_rcu_usb2_phy_power_on,
+ .power_off = ltq_rcu_usb2_phy_power_off,
+ .owner = THIS_MODULE,
+};
+
+static int ltq_rcu_usb2_of_parse(struct ltq_rcu_usb2_priv *priv,
+ struct platform_device *pdev)
+{
+ struct device *dev = priv->dev;
+ const __be32 *offset;
+ int ret;
+
+ priv->reg_bits = of_device_get_match_data(dev);
+
+ priv->regmap = syscon_node_to_regmap(dev->of_node->parent);
+ if (IS_ERR(priv->regmap)) {
+ dev_err(dev, "Failed to lookup RCU regmap\n");
+ return PTR_ERR(priv->regmap);
+ }
+
+ offset = of_get_address(dev->of_node, 0, NULL, NULL);
+ if (!offset) {
+ dev_err(dev, "Failed to get RCU PHY reg offset\n");
+ return -ENOENT;
+ }
+ priv->phy_reg_offset = __be32_to_cpu(*offset);
+
+ if (priv->reg_bits->have_ana_cfg) {
+ offset = of_get_address(dev->of_node, 1, NULL, NULL);
+ if (!offset) {
+ dev_err(dev, "Failed to get RCU ANA CFG1 reg offset\n");
+ return -ENOENT;
+ }
+ priv->ana_cfg1_reg_offset = __be32_to_cpu(*offset);
+ }
+
+ priv->phy_gate_clk = devm_clk_get(dev, "phy");
+ if (IS_ERR(priv->phy_gate_clk)) {
+ dev_err(dev, "Unable to get USB phy gate clk\n");
+ return PTR_ERR(priv->phy_gate_clk);
+ }
+
+ priv->ctrl_reset = devm_reset_control_get_shared(dev, "ctrl");
+ if (IS_ERR(priv->ctrl_reset)) {
+ if (PTR_ERR(priv->ctrl_reset) != -EPROBE_DEFER)
+ dev_err(dev, "failed to get 'ctrl' reset\n");
+ return PTR_ERR(priv->ctrl_reset);
+ }
+
+ priv->phy_reset = devm_reset_control_get_optional(dev, "phy");
+ if (IS_ERR(priv->phy_reset))
+ return PTR_ERR(priv->phy_reset);
+
+ return 0;
+}
+
+static int ltq_rcu_usb2_phy_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct ltq_rcu_usb2_priv *priv;
+ struct phy_provider *provider;
+ int ret;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ priv->dev = dev;
+
+ ret = ltq_rcu_usb2_of_parse(priv, pdev);
+ if (ret)
+ return ret;
+
+ /* Reset USB core through reset controller */
+ reset_control_deassert(priv->ctrl_reset);
+
+ reset_control_assert(priv->phy_reset);
+
+ priv->phy = devm_phy_create(dev, dev->of_node, &ltq_rcu_usb2_phy_ops);
+ if (IS_ERR(priv->phy)) {
+ dev_err(dev, "failed to create PHY\n");
+ return PTR_ERR(priv->phy);
+ }
+
+ phy_set_drvdata(priv->phy, priv);
+
+ provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
+ if (IS_ERR(provider))
+ return PTR_ERR(provider);
+
+ dev_set_drvdata(priv->dev, priv);
+ return 0;
+}
+
+static struct platform_driver ltq_rcu_usb2_phy_driver = {
+ .probe = ltq_rcu_usb2_phy_probe,
+ .driver = {
+ .name = "lantiq-rcu-usb2-phy",
+ .of_match_table = ltq_rcu_usb2_phy_of_match,
+ }
+};
+module_platform_driver(ltq_rcu_usb2_phy_driver);
+
+MODULE_AUTHOR("Martin Blumenstingl <[email protected]>");
+MODULE_DESCRIPTION("Lantiq XWAY USB2 PHY driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
index b8b6ab072cd0..71b944748304 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
@@ -550,9 +550,9 @@ static int armada_37xx_irq_set_wake(struct irq_data *d, unsigned int on)
spin_lock_irqsave(&info->irq_lock, flags);
val = readl(info->base + reg);
if (on)
- val |= d->mask;
+ val |= (BIT(d->hwirq % GPIO_PER_REG));
else
- val &= ~d->mask;
+ val &= ~(BIT(d->hwirq % GPIO_PER_REG));
writel(val, info->base + reg);
spin_unlock_irqrestore(&info->irq_lock, flags);
@@ -571,10 +571,10 @@ static int armada_37xx_irq_set_type(struct irq_data *d, unsigned int type)
val = readl(info->base + reg);
switch (type) {
case IRQ_TYPE_EDGE_RISING:
- val &= ~d->mask;
+ val &= ~(BIT(d->hwirq % GPIO_PER_REG));
break;
case IRQ_TYPE_EDGE_FALLING:
- val |= d->mask;
+ val |= (BIT(d->hwirq % GPIO_PER_REG));
break;
default:
spin_unlock_irqrestore(&info->irq_lock, flags);
@@ -624,11 +624,27 @@ static void armada_37xx_irq_handler(struct irq_desc *desc)
chained_irq_exit(chip, desc);
}
+static unsigned int armada_37xx_irq_startup(struct irq_data *d)
+{
+ struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
+ int irq = d->hwirq - chip->irq_base;
+ /*
+ * The mask field is a "precomputed bitmask for accessing the
+ * chip registers" which was introduced for the generic
+ * irqchip framework. As we don't use this framework, we can
+ * reuse this field for our own usage.
+ */
+ d->mask = BIT(irq % GPIO_PER_REG);
+
+ armada_37xx_irq_unmask(d);
+
+ return 0;
+}
+
static int armada_37xx_irqchip_register(struct platform_device *pdev,
struct armada_37xx_pinctrl *info)
{
struct device_node *np = info->dev->of_node;
- int nrirqs = info->data->nr_pins;
struct gpio_chip *gc = &info->gpio_chip;
struct irq_chip *irqchip = &info->irq_chip;
struct resource res;
@@ -666,8 +682,8 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,
irqchip->irq_unmask = armada_37xx_irq_unmask;
irqchip->irq_set_wake = armada_37xx_irq_set_wake;
irqchip->irq_set_type = armada_37xx_irq_set_type;
+ irqchip->irq_startup = armada_37xx_irq_startup;
irqchip->name = info->data->name;
-
ret = gpiochip_irqchip_add(gc, irqchip, 0,
handle_edge_irq, IRQ_TYPE_NONE);
if (ret) {
@@ -680,19 +696,6 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,
* controller. But we do not take advantage of this and use
* the chained irq with all of them.
*/
- for (i = 0; i < nrirqs; i++) {
- struct irq_data *d = irq_get_irq_data(gc->irq_base + i);
-
- /*
- * The mask field is a "precomputed bitmask for
- * accessing the chip registers" which was introduced
- * for the generic irqchip framework. As we don't use
- * this framework, we can reuse this field for our own
- * usage.
- */
- d->mask = BIT(i % GPIO_PER_REG);
- }
-
for (i = 0; i < nr_irq_parent; i++) {
int irq = irq_of_parse_and_map(np, i);
diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index 38af1ec2df0c..3f6b34febbf1 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -36,6 +36,7 @@
#include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinconf-generic.h>
+#include "core.h"
#include "pinctrl-utils.h"
#include "pinctrl-amd.h"
@@ -725,6 +726,69 @@ static const struct pinconf_ops amd_pinconf_ops = {
.pin_config_group_set = amd_pinconf_group_set,
};
+#ifdef CONFIG_PM_SLEEP
+static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
+{
+ const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin);
+
+ if (!pd)
+ return false;
+
+ /*
+ * Only restore the pin if it is actually in use by the kernel (or
+ * by userspace).
+ */
+ if (pd->mux_owner || pd->gpio_owner ||
+ gpiochip_line_is_irq(&gpio_dev->gc, pin))
+ return true;
+
+ return false;
+}
+
+int amd_gpio_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
+ struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
+ int i;
+
+ for (i = 0; i < desc->npins; i++) {
+ int pin = desc->pins[i].number;
+
+ if (!amd_gpio_should_save(gpio_dev, pin))
+ continue;
+
+ gpio_dev->saved_regs[i] = readl(gpio_dev->base + pin*4);
+ }
+
+ return 0;
+}
+
+int amd_gpio_resume(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
+ struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
+ int i;
+
+ for (i = 0; i < desc->npins; i++) {
+ int pin = desc->pins[i].number;
+
+ if (!amd_gpio_should_save(gpio_dev, pin))
+ continue;
+
+ writel(gpio_dev->saved_regs[i], gpio_dev->base + pin*4);
+ }
+
+ return 0;
+}
+
+static const struct dev_pm_ops amd_gpio_pm_ops = {
+ SET_LATE_SYSTEM_SLEEP_PM_OPS(amd_gpio_suspend,
+ amd_gpio_resume)
+};
+#endif
+
static struct pinctrl_desc amd_pinctrl_desc = {
.pins = kerncz_pins,
.npins = ARRAY_SIZE(kerncz_pins),
@@ -764,6 +828,14 @@ static int amd_gpio_probe(struct platform_device *pdev)
return irq_base;
}
+#ifdef CONFIG_PM_SLEEP
+ gpio_dev->saved_regs = devm_kcalloc(&pdev->dev, amd_pinctrl_desc.npins,
+ sizeof(*gpio_dev->saved_regs),
+ GFP_KERNEL);
+ if (!gpio_dev->saved_regs)
+ return -ENOMEM;
+#endif
+
gpio_dev->pdev = pdev;
gpio_dev->gc.direction_input = amd_gpio_direction_input;
gpio_dev->gc.direction_output = amd_gpio_direction_output;
@@ -853,6 +925,9 @@ static struct platform_driver amd_gpio_driver = {
.driver = {
.name = "amd_gpio",
.acpi_match_table = ACPI_PTR(amd_gpio_acpi_match),
+#ifdef CONFIG_PM_SLEEP
+ .pm = &amd_gpio_pm_ops,
+#endif
},
.probe = amd_gpio_probe,
.remove = amd_gpio_remove,
diff --git a/drivers/pinctrl/pinctrl-amd.h b/drivers/pinctrl/pinctrl-amd.h
index 5b1cb965c767..8fa453a59da5 100644
--- a/drivers/pinctrl/pinctrl-amd.h
+++ b/drivers/pinctrl/pinctrl-amd.h
@@ -97,6 +97,7 @@ struct amd_gpio {
unsigned int hwbank_num;
struct resource *res;
struct platform_device *pdev;
+ u32 *saved_regs;
};
/* KERNCZ configuration*/
diff --git a/drivers/pinctrl/sprd/Kconfig b/drivers/pinctrl/sprd/Kconfig
index 6f4a7f9ac6fd..bc7f3fab22f1 100644
--- a/drivers/pinctrl/sprd/Kconfig
+++ b/drivers/pinctrl/sprd/Kconfig
@@ -4,6 +4,8 @@
config PINCTRL_SPRD
bool "Spreadtrum pinctrl driver"
+ depends on OF
+ depends on ARCH_SPRD || COMPILE_TEST
select PINMUX
select PINCONF
select GENERIC_PINCONF
@@ -13,5 +15,6 @@ config PINCTRL_SPRD
config PINCTRL_SPRD_SC9860
bool "Spreadtrum SC9860 pinctrl driver"
+ depends on PINCTRL_SPRD
help
Say Y here to enable Spreadtrum SC9860 pinctrl driver
diff --git a/drivers/pinctrl/sprd/pinctrl-sprd.c b/drivers/pinctrl/sprd/pinctrl-sprd.c
index 7e7b9ac7e836..63529911445c 100644
--- a/drivers/pinctrl/sprd/pinctrl-sprd.c
+++ b/drivers/pinctrl/sprd/pinctrl-sprd.c
@@ -353,13 +353,13 @@ static const struct pinctrl_ops sprd_pctrl_ops = {
.dt_free_map = pinctrl_utils_free_map,
};
-int sprd_pmx_get_function_count(struct pinctrl_dev *pctldev)
+static int sprd_pmx_get_function_count(struct pinctrl_dev *pctldev)
{
return PIN_FUNC_MAX;
}
-const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev,
- unsigned int selector)
+static const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev,
+ unsigned int selector)
{
switch (selector) {
case PIN_FUNC_1:
@@ -375,10 +375,10 @@ const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev,
}
}
-int sprd_pmx_get_function_groups(struct pinctrl_dev *pctldev,
- unsigned int selector,
- const char * const **groups,
- unsigned int * const num_groups)
+static int sprd_pmx_get_function_groups(struct pinctrl_dev *pctldev,
+ unsigned int selector,
+ const char * const **groups,
+ unsigned int * const num_groups)
{
struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
struct sprd_pinctrl_soc_info *info = pctl->info;
@@ -400,7 +400,7 @@ static int sprd_pmx_set_mux(struct pinctrl_dev *pctldev,
unsigned long reg;
unsigned int val = 0;
- if (group_selector > info->ngroups)
+ if (group_selector >= info->ngroups)
return -EINVAL;
switch (func_selector) {
@@ -734,7 +734,7 @@ static int sprd_pinconf_group_get(struct pinctrl_dev *pctldev,
struct sprd_pin_group *grp;
unsigned int pin_id;
- if (selector > info->ngroups)
+ if (selector >= info->ngroups)
return -EINVAL;
grp = &info->groups[selector];
@@ -753,7 +753,7 @@ static int sprd_pinconf_group_set(struct pinctrl_dev *pctldev,
struct sprd_pin_group *grp;
int ret, i;
- if (selector > info->ngroups)
+ if (selector >= info->ngroups)
return -EINVAL;
grp = &info->groups[selector];
@@ -813,7 +813,7 @@ static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
const char *name;
int i, ret;
- if (selector > info->ngroups)
+ if (selector >= info->ngroups)
return;
grp = &info->groups[selector];
@@ -1100,12 +1100,16 @@ int sprd_pinctrl_remove(struct platform_device *pdev)
void sprd_pinctrl_shutdown(struct platform_device *pdev)
{
- struct pinctrl *pinctl = devm_pinctrl_get(&pdev->dev);
+ struct pinctrl *pinctl;
struct pinctrl_state *state;
+ pinctl = devm_pinctrl_get(&pdev->dev);
+ if (IS_ERR(pinctl))
+ return;
state = pinctrl_lookup_state(pinctl, "shutdown");
- if (!IS_ERR(state))
- pinctrl_select_state(pinctl, state);
+ if (IS_ERR(state))
+ return;
+ pinctrl_select_state(pinctl, state);
}
MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");
diff --git a/drivers/pinctrl/uniphier/pinctrl-uniphier.h b/drivers/pinctrl/uniphier/pinctrl-uniphier.h
index c075ecb8e5db..0a3d2ac27503 100644
--- a/drivers/pinctrl/uniphier/pinctrl-uniphier.h
+++ b/drivers/pinctrl/uniphier/pinctrl-uniphier.h
@@ -17,7 +17,7 @@
#define __PINCTRL_UNIPHIER_H__
#include <linux/bitops.h>
-#include <linux/bug.h>
+#include <linux/build_bug.h>
#include <linux/kernel.h>
#include <linux/types.h>
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c
index e8a44a9bc916..d8599736a41a 100644
--- a/drivers/platform/chrome/chromeos_laptop.c
+++ b/drivers/platform/chrome/chromeos_laptop.c
@@ -518,7 +518,7 @@ static struct chromeos_laptop cr48 = {
.callback = chromeos_laptop_dmi_matched, \
.driver_data = (void *)&board_
-static struct dmi_system_id chromeos_laptop_dmi_table[] __initdata = {
+static const struct dmi_system_id chromeos_laptop_dmi_table[] __initconst = {
{
.ident = "Samsung Series 5 550",
.matches = {
diff --git a/drivers/platform/chrome/chromeos_pstore.c b/drivers/platform/chrome/chromeos_pstore.c
index 308a853ac4f1..b0693fdec8c6 100644
--- a/drivers/platform/chrome/chromeos_pstore.c
+++ b/drivers/platform/chrome/chromeos_pstore.c
@@ -14,7 +14,7 @@
#include <linux/platform_device.h>
#include <linux/pstore_ram.h>
-static struct dmi_system_id chromeos_pstore_dmi_table[] __initdata = {
+static const struct dmi_system_id chromeos_pstore_dmi_table[] __initconst = {
{
/*
* Today all Chromebooks/boxes ship with Google_* as version and
diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c
index 2b6436d1b6a4..1baf720faf69 100644
--- a/drivers/platform/chrome/cros_ec_lpc.c
+++ b/drivers/platform/chrome/cros_ec_lpc.c
@@ -329,7 +329,7 @@ static const struct acpi_device_id cros_ec_lpc_acpi_device_ids[] = {
};
MODULE_DEVICE_TABLE(acpi, cros_ec_lpc_acpi_device_ids);
-static struct dmi_system_id cros_ec_lpc_dmi_table[] __initdata = {
+static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = {
{
/*
* Today all Chromebooks/boxes ship with Google_* as version and
diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c
index a8e4a539e704..6bcb750e1865 100644
--- a/drivers/platform/x86/compal-laptop.c
+++ b/drivers/platform/x86/compal-laptop.c
@@ -805,7 +805,7 @@ static int dmi_check_cb_extra(const struct dmi_system_id *id)
return 1;
}
-static struct dmi_system_id __initdata compal_dmi_table[] = {
+static const struct dmi_system_id compal_dmi_table[] __initconst = {
{
.ident = "FL90/IFL90",
.matches = {
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c
index 85de30f93a9c..56a8195096a2 100644
--- a/drivers/platform/x86/fujitsu-laptop.c
+++ b/drivers/platform/x86/fujitsu-laptop.c
@@ -254,10 +254,12 @@ static int bl_update_status(struct backlight_device *b)
{
struct acpi_device *device = bl_get_data(b);
- if (b->props.power == FB_BLANK_POWERDOWN)
- call_fext_func(fext, FUNC_BACKLIGHT, 0x1, 0x4, 0x3);
- else
- call_fext_func(fext, FUNC_BACKLIGHT, 0x1, 0x4, 0x0);
+ if (fext) {
+ if (b->props.power == FB_BLANK_POWERDOWN)
+ call_fext_func(fext, FUNC_BACKLIGHT, 0x1, 0x4, 0x3);
+ else
+ call_fext_func(fext, FUNC_BACKLIGHT, 0x1, 0x4, 0x0);
+ }
return set_lcd_level(device, b->props.brightness);
}
diff --git a/drivers/platform/x86/hdaps.c b/drivers/platform/x86/hdaps.c
index 458e6c948c11..c26baf77938e 100644
--- a/drivers/platform/x86/hdaps.c
+++ b/drivers/platform/x86/hdaps.c
@@ -514,7 +514,7 @@ static int __init hdaps_dmi_match_invert(const struct dmi_system_id *id)
"ThinkPad T42p", so the order of the entries matters.
If your ThinkPad is not recognized, please update to latest
BIOS. This is especially the case for some R52 ThinkPads. */
-static struct dmi_system_id __initdata hdaps_whitelist[] = {
+static const struct dmi_system_id hdaps_whitelist[] __initconst = {
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_BOTH_AXES),
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R50"),
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"),
diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c
index 610ac8391caa..18d55cee5bcd 100644
--- a/drivers/platform/x86/ibm_rtl.c
+++ b/drivers/platform/x86/ibm_rtl.c
@@ -227,7 +227,7 @@ static void rtl_teardown_sysfs(void) {
}
-static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
+static const struct dmi_system_id ibm_rtl_dmi_table[] __initconst = {
{ \
.matches = { \
DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \
diff --git a/drivers/platform/x86/intel_oaktrail.c b/drivers/platform/x86/intel_oaktrail.c
index 6aa33c4a809f..5747f63c8d9f 100644
--- a/drivers/platform/x86/intel_oaktrail.c
+++ b/drivers/platform/x86/intel_oaktrail.c
@@ -299,7 +299,7 @@ static int dmi_check_cb(const struct dmi_system_id *id)
return 0;
}
-static struct dmi_system_id __initdata oaktrail_dmi_table[] = {
+static const struct dmi_system_id oaktrail_dmi_table[] __initconst = {
{
.ident = "OakTrail platform",
.matches = {
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
index 8f98c211b440..4f3de2a8c4df 100644
--- a/drivers/platform/x86/mlx-platform.c
+++ b/drivers/platform/x86/mlx-platform.c
@@ -247,7 +247,7 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
return 1;
};
-static struct dmi_system_id mlxplat_dmi_table[] __initdata = {
+static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
{
.callback = mlxplat_dmi_default_matched,
.matches = {
diff --git a/drivers/platform/x86/msi-laptop.c b/drivers/platform/x86/msi-laptop.c
index 61b9014d2610..d5bfcc602090 100644
--- a/drivers/platform/x86/msi-laptop.c
+++ b/drivers/platform/x86/msi-laptop.c
@@ -605,7 +605,7 @@ static int dmi_check_cb(const struct dmi_system_id *dmi)
return 1;
}
-static struct dmi_system_id __initdata msi_dmi_table[] = {
+static const struct dmi_system_id msi_dmi_table[] __initconst = {
{
.ident = "MSI S270",
.matches = {
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c
index 0c703feaeb88..d3cb26f6df73 100644
--- a/drivers/platform/x86/samsung-laptop.c
+++ b/drivers/platform/x86/samsung-laptop.c
@@ -1567,7 +1567,7 @@ static int __init samsung_dmi_matched(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id __initdata samsung_dmi_table[] = {
+static const struct dmi_system_id samsung_dmi_table[] __initconst = {
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR,
diff --git a/drivers/platform/x86/samsung-q10.c b/drivers/platform/x86/samsung-q10.c
index e6aac725a0af..a2fb7fbc3273 100644
--- a/drivers/platform/x86/samsung-q10.c
+++ b/drivers/platform/x86/samsung-q10.c
@@ -95,7 +95,7 @@ static int __init dmi_check_callback(const struct dmi_system_id *id)
return 1;
}
-static struct dmi_system_id __initdata samsungq10_dmi_table[] = {
+static const struct dmi_system_id samsungq10_dmi_table[] __initconst = {
{
.ident = "Samsung Q10",
.matches = {
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index bfae79534f44..a16cea2be9c3 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -4880,7 +4880,7 @@ static struct acpi_driver sony_pic_driver = {
.drv.pm = &sony_pic_pm,
};
-static struct dmi_system_id __initdata sonypi_dmi_table[] = {
+static const struct dmi_system_id sonypi_dmi_table[] __initconst = {
{
.ident = "Sony Vaio",
.matches = {
diff --git a/drivers/platform/x86/toshiba-wmi.c b/drivers/platform/x86/toshiba-wmi.c
index 440528676170..03d7620cd6d7 100644
--- a/drivers/platform/x86/toshiba-wmi.c
+++ b/drivers/platform/x86/toshiba-wmi.c
@@ -64,7 +64,7 @@ static void toshiba_wmi_notify(u32 value, void *context)
kfree(response.pointer);
}
-static struct dmi_system_id toshiba_wmi_dmi_table[] __initdata = {
+static const struct dmi_system_id toshiba_wmi_dmi_table[] __initconst = {
{
.ident = "Toshiba laptop",
.matches = {
diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c
index 0ced908e7aa8..e681140b85d8 100644
--- a/drivers/pnp/pnpbios/core.c
+++ b/drivers/pnp/pnpbios/core.c
@@ -495,7 +495,7 @@ static int __init exploding_pnp_bios(const struct dmi_system_id *d)
return 0;
}
-static struct dmi_system_id pnpbios_dmi_table[] __initdata = {
+static const struct dmi_system_id pnpbios_dmi_table[] __initconst = {
{ /* PnPBIOS GPF on boot */
.callback = exploding_pnp_bios,
.ident = "Higraded P14H",
diff --git a/drivers/power/reset/at91-sama5d2_shdwc.c b/drivers/power/reset/at91-sama5d2_shdwc.c
index 55fce8b75245..31080c254124 100644
--- a/drivers/power/reset/at91-sama5d2_shdwc.c
+++ b/drivers/power/reset/at91-sama5d2_shdwc.c
@@ -171,8 +171,8 @@ static u32 at91_shdwc_get_wakeup_input(struct platform_device *pdev,
for_each_child_of_node(np, cnp) {
if (of_property_read_u32(cnp, "reg", &wk_input)) {
- dev_warn(&pdev->dev, "reg property is missing for %s\n",
- cnp->full_name);
+ dev_warn(&pdev->dev, "reg property is missing for %pOF\n",
+ cnp);
continue;
}
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index 969f5005669c..5ab90c1f3f7c 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -198,6 +198,15 @@ config BATTERY_BQ27XXX_I2C
Say Y here to enable support for batteries with BQ27xxx chips
connected over an I2C bus.
+config BATTERY_BQ27XXX_HDQ
+ tristate "BQ27xxx HDQ support"
+ depends on BATTERY_BQ27XXX
+ depends on W1
+ default y
+ help
+ Say Y here to enable support for batteries with BQ27xxx chips
+ connected over an HDQ bus.
+
config BATTERY_BQ27XXX_DT_UPDATES_NVM
bool "BQ27xxx support for update of NVM/flash data memory"
depends on BATTERY_BQ27XXX_I2C
@@ -313,6 +322,19 @@ config BATTERY_MAX17042
with MAX17042. This driver also supports max17047/50 chips which are
improved version of max17042.
+config BATTERY_MAX1721X
+ tristate "MAX17211/MAX17215 standalone gas-gauge"
+ depends on W1
+ select REGMAP_W1
+ help
+ MAX1721x is fuel-gauge systems for lithium-ion (Li+) batteries
+ in handheld and portable equipment. MAX17211 used with single cell
+ battery. MAX17215 designed for muticell battery. Both them have
+ OneWire (W1) host interface.
+
+ Say Y here to enable support for the MAX17211/MAX17215 standalone
+ battery gas-gauge.
+
config BATTERY_Z2
tristate "Z2 battery driver"
depends on I2C && MACH_ZIPIT2
@@ -365,6 +387,7 @@ config BATTERY_RX51
config CHARGER_CPCAP
tristate "CPCAP PMIC Charger Driver"
depends on MFD_CPCAP && IIO
+ depends on OMAP_USB2 || (!OMAP_USB2 && COMPILE_TEST)
default MFD_CPCAP
help
Say Y to enable support for CPCAP PMIC charger driver for Motorola
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index a41f40957847..621a19058fec 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -38,12 +38,14 @@ obj-$(CONFIG_BATTERY_SBS) += sbs-battery.o
obj-$(CONFIG_CHARGER_SBS) += sbs-charger.o
obj-$(CONFIG_BATTERY_BQ27XXX) += bq27xxx_battery.o
obj-$(CONFIG_BATTERY_BQ27XXX_I2C) += bq27xxx_battery_i2c.o
+obj-$(CONFIG_BATTERY_BQ27XXX_HDQ) += bq27xxx_battery_hdq.o
obj-$(CONFIG_BATTERY_DA9030) += da9030_battery.o
obj-$(CONFIG_BATTERY_DA9052) += da9052-battery.o
obj-$(CONFIG_CHARGER_DA9150) += da9150-charger.o
obj-$(CONFIG_BATTERY_DA9150) += da9150-fg.o
obj-$(CONFIG_BATTERY_MAX17040) += max17040_battery.o
obj-$(CONFIG_BATTERY_MAX17042) += max17042_battery.o
+obj-$(CONFIG_BATTERY_MAX1721X) += max1721x_battery.o
obj-$(CONFIG_BATTERY_Z2) += z2_battery.o
obj-$(CONFIG_BATTERY_RT5033) += rt5033_battery.o
obj-$(CONFIG_CHARGER_RT9455) += rt9455_charger.o
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index d1eb2e359532..8e117b31ba79 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -596,9 +596,9 @@ static int act8945a_charger_probe(struct platform_device *pdev)
return ret;
irq = of_irq_get(pdev->dev.of_node, 0);
- if (irq == -EPROBE_DEFER) {
+ if (irq <= 0) {
dev_err(&pdev->dev, "failed to find IRQ number\n");
- return -EPROBE_DEFER;
+ return irq ?: -ENXIO;
}
ret = devm_request_irq(&pdev->dev, irq, act8945a_status_changed,
diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c
index d5a707e14526..35ff406aca48 100644
--- a/drivers/power/supply/bq24190_charger.c
+++ b/drivers/power/supply/bq24190_charger.c
@@ -16,6 +16,9 @@
#include <linux/of_device.h>
#include <linux/pm_runtime.h>
#include <linux/power_supply.h>
+#include <linux/power/bq24190_charger.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
@@ -43,6 +46,8 @@
#define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
#define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
#define BQ24190_REG_POC_SYS_MIN_SHIFT 1
+#define BQ24190_REG_POC_SYS_MIN_MIN 3000
+#define BQ24190_REG_POC_SYS_MIN_MAX 3700
#define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
#define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
@@ -57,9 +62,13 @@
#define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
BIT(4))
#define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
+#define BQ24190_REG_PCTCC_IPRECHG_MIN 128
+#define BQ24190_REG_PCTCC_IPRECHG_MAX 2048
#define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
BIT(0))
#define BQ24190_REG_PCTCC_ITERM_SHIFT 0
+#define BQ24190_REG_PCTCC_ITERM_MIN 128
+#define BQ24190_REG_PCTCC_ITERM_MAX 2048
#define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */
#define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
@@ -156,9 +165,13 @@ struct bq24190_dev_info {
struct extcon_dev *extcon;
struct notifier_block extcon_nb;
struct delayed_work extcon_work;
+ struct delayed_work input_current_limit_work;
char model_name[I2C_NAME_SIZE];
bool initialized;
bool irq_event;
+ u16 sys_min;
+ u16 iprechg;
+ u16 iterm;
struct mutex f_reg_lock;
u8 f_reg;
u8 ss_reg;
@@ -504,15 +517,112 @@ static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {}
#endif
-/*
- * According to the "Host Mode and default Mode" section of the
- * manual, a write to any register causes the bq24190 to switch
- * from default mode to host mode. It will switch back to default
- * mode after a WDT timeout unless the WDT is turned off as well.
- * So, by simply turning off the WDT, we accomplish both with the
- * same write.
- */
-static int bq24190_set_mode_host(struct bq24190_dev_info *bdi)
+#ifdef CONFIG_REGULATOR
+static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
+{
+ struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
+ int ret;
+
+ ret = pm_runtime_get_sync(bdi->dev);
+ if (ret < 0) {
+ dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
+ pm_runtime_put_noidle(bdi->dev);
+ return ret;
+ }
+
+ ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
+ BQ24190_REG_POC_CHG_CONFIG_MASK,
+ BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
+
+ pm_runtime_mark_last_busy(bdi->dev);
+ pm_runtime_put_autosuspend(bdi->dev);
+
+ return ret;
+}
+
+static int bq24190_vbus_enable(struct regulator_dev *dev)
+{
+ return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
+}
+
+static int bq24190_vbus_disable(struct regulator_dev *dev)
+{
+ return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
+}
+
+static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
+{
+ struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
+ int ret;
+ u8 val;
+
+ ret = pm_runtime_get_sync(bdi->dev);
+ if (ret < 0) {
+ dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
+ pm_runtime_put_noidle(bdi->dev);
+ return ret;
+ }
+
+ ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
+ BQ24190_REG_POC_CHG_CONFIG_MASK,
+ BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
+
+ pm_runtime_mark_last_busy(bdi->dev);
+ pm_runtime_put_autosuspend(bdi->dev);
+
+ return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
+}
+
+static const struct regulator_ops bq24190_vbus_ops = {
+ .enable = bq24190_vbus_enable,
+ .disable = bq24190_vbus_disable,
+ .is_enabled = bq24190_vbus_is_enabled,
+};
+
+static const struct regulator_desc bq24190_vbus_desc = {
+ .name = "usb_otg_vbus",
+ .type = REGULATOR_VOLTAGE,
+ .owner = THIS_MODULE,
+ .ops = &bq24190_vbus_ops,
+ .fixed_uV = 5000000,
+ .n_voltages = 1,
+};
+
+static const struct regulator_init_data bq24190_vbus_init_data = {
+ .constraints = {
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+};
+
+static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
+{
+ struct bq24190_platform_data *pdata = bdi->dev->platform_data;
+ struct regulator_config cfg = { };
+ struct regulator_dev *reg;
+ int ret = 0;
+
+ cfg.dev = bdi->dev;
+ if (pdata && pdata->regulator_init_data)
+ cfg.init_data = pdata->regulator_init_data;
+ else
+ cfg.init_data = &bq24190_vbus_init_data;
+ cfg.driver_data = bdi;
+ reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
+ if (IS_ERR(reg)) {
+ ret = PTR_ERR(reg);
+ dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
+ }
+
+ return ret;
+}
+#else
+static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
+{
+ return 0;
+}
+#endif
+
+static int bq24190_set_config(struct bq24190_dev_info *bdi)
{
int ret;
u8 v;
@@ -523,9 +633,52 @@ static int bq24190_set_mode_host(struct bq24190_dev_info *bdi)
bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
BQ24190_REG_CTTC_WATCHDOG_SHIFT);
+
+ /*
+ * According to the "Host Mode and default Mode" section of the
+ * manual, a write to any register causes the bq24190 to switch
+ * from default mode to host mode. It will switch back to default
+ * mode after a WDT timeout unless the WDT is turned off as well.
+ * So, by simply turning off the WDT, we accomplish both with the
+ * same write.
+ */
v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
- return bq24190_write(bdi, BQ24190_REG_CTTC, v);
+ ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
+ if (ret < 0)
+ return ret;
+
+ if (bdi->sys_min) {
+ v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
+ ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
+ BQ24190_REG_POC_SYS_MIN_MASK,
+ BQ24190_REG_POC_SYS_MIN_SHIFT,
+ v);
+ if (ret < 0)
+ return ret;
+ }
+
+ if (bdi->iprechg) {
+ v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
+ ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
+ BQ24190_REG_PCTCC_IPRECHG_MASK,
+ BQ24190_REG_PCTCC_IPRECHG_SHIFT,
+ v);
+ if (ret < 0)
+ return ret;
+ }
+
+ if (bdi->iterm) {
+ v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
+ ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
+ BQ24190_REG_PCTCC_ITERM_MASK,
+ BQ24190_REG_PCTCC_ITERM_SHIFT,
+ v);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
}
static int bq24190_register_reset(struct bq24190_dev_info *bdi)
@@ -773,6 +926,38 @@ static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
return bq24190_battery_set_temp_alert_max(bdi, val);
}
+static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
+ union power_supply_propval *val)
+{
+ u8 v;
+ int ret;
+
+ ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
+ BQ24190_REG_PCTCC_IPRECHG_MASK,
+ BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
+ if (ret < 0)
+ return ret;
+
+ val->intval = ++v * 128 * 1000;
+ return 0;
+}
+
+static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
+ union power_supply_propval *val)
+{
+ u8 v;
+ int ret;
+
+ ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
+ BQ24190_REG_PCTCC_ITERM_MASK,
+ BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
+ if (ret < 0)
+ return ret;
+
+ val->intval = ++v * 128 * 1000;
+ return 0;
+}
+
static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
union power_supply_propval *val)
{
@@ -865,6 +1050,33 @@ static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
}
+static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
+ union power_supply_propval *val)
+{
+ int iinlimit, ret;
+
+ ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
+ BQ24190_REG_ISC_IINLIM_MASK,
+ BQ24190_REG_ISC_IINLIM_SHIFT,
+ bq24190_isc_iinlim_values,
+ ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
+ if (ret < 0)
+ return ret;
+
+ val->intval = iinlimit;
+ return 0;
+}
+
+static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
+ const union power_supply_propval *val)
+{
+ return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
+ BQ24190_REG_ISC_IINLIM_MASK,
+ BQ24190_REG_ISC_IINLIM_SHIFT,
+ bq24190_isc_iinlim_values,
+ ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
+}
+
static int bq24190_charger_get_property(struct power_supply *psy,
enum power_supply_property psp, union power_supply_propval *val)
{
@@ -893,6 +1105,12 @@ static int bq24190_charger_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
ret = bq24190_charger_get_temp_alert_max(bdi, val);
break;
+ case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
+ ret = bq24190_charger_get_precharge(bdi, val);
+ break;
+ case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
+ ret = bq24190_charger_get_charge_term(bdi, val);
+ break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
ret = bq24190_charger_get_current(bdi, val);
break;
@@ -905,6 +1123,9 @@ static int bq24190_charger_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
ret = bq24190_charger_get_voltage_max(bdi, val);
break;
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+ ret = bq24190_charger_get_iinlimit(bdi, val);
+ break;
case POWER_SUPPLY_PROP_SCOPE:
val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
ret = 0;
@@ -956,6 +1177,9 @@ static int bq24190_charger_set_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = bq24190_charger_set_voltage(bdi, val);
break;
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+ ret = bq24190_charger_set_iinlimit(bdi, val);
+ break;
default:
ret = -EINVAL;
}
@@ -977,6 +1201,7 @@ static int bq24190_charger_property_is_writeable(struct power_supply *psy,
case POWER_SUPPLY_PROP_CHARGE_TYPE:
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
ret = 1;
break;
default:
@@ -986,16 +1211,45 @@ static int bq24190_charger_property_is_writeable(struct power_supply *psy,
return ret;
}
+static void bq24190_input_current_limit_work(struct work_struct *work)
+{
+ struct bq24190_dev_info *bdi =
+ container_of(work, struct bq24190_dev_info,
+ input_current_limit_work.work);
+
+ power_supply_set_input_current_limit_from_supplier(bdi->charger);
+}
+
+/* Sync the input-current-limit with our parent supply (if we have one) */
+static void bq24190_charger_external_power_changed(struct power_supply *psy)
+{
+ struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
+
+ /*
+ * The Power-Good detection may take up to 220ms, sometimes
+ * the external charger detection is quicker, and the bq24190 will
+ * reset to iinlim based on its own charger detection (which is not
+ * hooked up when using external charger detection) resulting in a
+ * too low default 500mA iinlim. Delay setting the input-current-limit
+ * for 300ms to avoid this.
+ */
+ queue_delayed_work(system_wq, &bdi->input_current_limit_work,
+ msecs_to_jiffies(300));
+}
+
static enum power_supply_property bq24190_charger_properties[] = {
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
+ POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
+ POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
POWER_SUPPLY_PROP_SCOPE,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER,
@@ -1013,6 +1267,7 @@ static const struct power_supply_desc bq24190_charger_desc = {
.get_property = bq24190_charger_get_property,
.set_property = bq24190_charger_set_property,
.property_is_writeable = bq24190_charger_property_is_writeable,
+ .external_power_changed = bq24190_charger_external_power_changed,
};
/* Battery power supply property routines */
@@ -1460,13 +1715,50 @@ static int bq24190_hw_init(struct bq24190_dev_info *bdi)
if (ret < 0)
return ret;
- ret = bq24190_set_mode_host(bdi);
+ ret = bq24190_set_config(bdi);
if (ret < 0)
return ret;
return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
}
+static int bq24190_get_config(struct bq24190_dev_info *bdi)
+{
+ const char * const s = "ti,system-minimum-microvolt";
+ struct power_supply_battery_info info = {};
+ int v;
+
+ if (device_property_read_u32(bdi->dev, s, &v) == 0) {
+ v /= 1000;
+ if (v >= BQ24190_REG_POC_SYS_MIN_MIN
+ && v <= BQ24190_REG_POC_SYS_MIN_MAX)
+ bdi->sys_min = v;
+ else
+ dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
+ }
+
+ if (bdi->dev->of_node &&
+ !power_supply_get_battery_info(bdi->charger, &info)) {
+ v = info.precharge_current_ua / 1000;
+ if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
+ && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
+ bdi->iprechg = v;
+ else
+ dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
+ v);
+
+ v = info.charge_term_current_ua / 1000;
+ if (v >= BQ24190_REG_PCTCC_ITERM_MIN
+ && v <= BQ24190_REG_PCTCC_ITERM_MAX)
+ bdi->iterm = v;
+ else
+ dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
+ v);
+ }
+
+ return 0;
+}
+
static int bq24190_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1494,10 +1786,12 @@ static int bq24190_probe(struct i2c_client *client,
mutex_init(&bdi->f_reg_lock);
bdi->f_reg = 0;
bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
+ INIT_DELAYED_WORK(&bdi->input_current_limit_work,
+ bq24190_input_current_limit_work);
i2c_set_clientdata(client, bdi);
- if (!client->irq) {
+ if (client->irq <= 0) {
dev_err(dev, "Can't get irq info\n");
return -EINVAL;
}
@@ -1530,13 +1824,8 @@ static int bq24190_probe(struct i2c_client *client,
goto out_pmrt;
}
- ret = bq24190_hw_init(bdi);
- if (ret < 0) {
- dev_err(dev, "Hardware init failed\n");
- goto out_pmrt;
- }
-
charger_cfg.drv_data = bdi;
+ charger_cfg.of_node = dev->of_node;
charger_cfg.supplied_to = bq24190_charger_supplied_to;
charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
@@ -1560,8 +1849,20 @@ static int bq24190_probe(struct i2c_client *client,
}
}
+ ret = bq24190_get_config(bdi);
+ if (ret < 0) {
+ dev_err(dev, "Can't get devicetree config\n");
+ goto out_charger;
+ }
+
+ ret = bq24190_hw_init(bdi);
+ if (ret < 0) {
+ dev_err(dev, "Hardware init failed\n");
+ goto out_charger;
+ }
+
ret = bq24190_sysfs_create_group(bdi);
- if (ret) {
+ if (ret < 0) {
dev_err(dev, "Can't create sysfs entries\n");
goto out_charger;
}
@@ -1577,6 +1878,10 @@ static int bq24190_probe(struct i2c_client *client,
goto out_sysfs;
}
+ ret = bq24190_register_vbus_regulator(bdi);
+ if (ret < 0)
+ goto out_sysfs;
+
if (bdi->extcon) {
INIT_DELAYED_WORK(&bdi->extcon_work, bq24190_extcon_work);
bdi->extcon_nb.notifier_call = bq24190_extcon_event;
@@ -1704,7 +2009,7 @@ static __maybe_unused int bq24190_pm_resume(struct device *dev)
}
bq24190_register_reset(bdi);
- bq24190_set_mode_host(bdi);
+ bq24190_set_config(bdi);
bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
if (error >= 0) {
@@ -1736,6 +2041,7 @@ MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
#ifdef CONFIG_OF
static const struct of_device_id bq24190_of_match[] = {
{ .compatible = "ti,bq24190", },
+ { .compatible = "ti,bq24192i", },
{ },
};
MODULE_DEVICE_TABLE(of, bq24190_of_match);
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index ed44439d0112..51f0961ecf3e 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -58,8 +58,6 @@
#include <linux/power/bq27xxx_battery.h>
-#define DRIVER_VERSION "1.2.0"
-
#define BQ27XXX_MANUFACTURER "Texas Instruments"
/* BQ27XXX Flags */
@@ -132,8 +130,8 @@ enum bq27xxx_reg_index {
[BQ27XXX_DM_CKSUM] = 0x60
/* Register mappings */
-static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
- [BQ27000] = {
+static u8
+ bq27000_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -157,7 +155,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
},
- [BQ27010] = {
+ bq27010_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -181,7 +179,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR,
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR,
},
- [BQ2750X] = {
+ bq2750x_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -201,47 +199,9 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
BQ27XXX_DM_REG_ROWS,
},
- [BQ2751X] = {
- [BQ27XXX_REG_CTRL] = 0x00,
- [BQ27XXX_REG_TEMP] = 0x06,
- [BQ27XXX_REG_INT_TEMP] = 0x28,
- [BQ27XXX_REG_VOLT] = 0x08,
- [BQ27XXX_REG_AI] = 0x14,
- [BQ27XXX_REG_FLAGS] = 0x0a,
- [BQ27XXX_REG_TTE] = 0x16,
- [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
- [BQ27XXX_REG_TTES] = 0x1a,
- [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
- [BQ27XXX_REG_NAC] = 0x0c,
- [BQ27XXX_REG_FCC] = 0x12,
- [BQ27XXX_REG_CYCT] = 0x1e,
- [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
- [BQ27XXX_REG_SOC] = 0x20,
- [BQ27XXX_REG_DCAP] = 0x2e,
- [BQ27XXX_REG_AP] = INVALID_REG_ADDR,
- BQ27XXX_DM_REG_ROWS,
- },
- [BQ27500] = {
- [BQ27XXX_REG_CTRL] = 0x00,
- [BQ27XXX_REG_TEMP] = 0x06,
- [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
- [BQ27XXX_REG_VOLT] = 0x08,
- [BQ27XXX_REG_AI] = 0x14,
- [BQ27XXX_REG_FLAGS] = 0x0a,
- [BQ27XXX_REG_TTE] = 0x16,
- [BQ27XXX_REG_TTF] = 0x18,
- [BQ27XXX_REG_TTES] = 0x1c,
- [BQ27XXX_REG_TTECP] = 0x26,
- [BQ27XXX_REG_NAC] = 0x0c,
- [BQ27XXX_REG_FCC] = 0x12,
- [BQ27XXX_REG_CYCT] = 0x2a,
- [BQ27XXX_REG_AE] = 0x22,
- [BQ27XXX_REG_SOC] = 0x2c,
- [BQ27XXX_REG_DCAP] = 0x3c,
- [BQ27XXX_REG_AP] = 0x24,
- BQ27XXX_DM_REG_ROWS,
- },
- [BQ27510G1] = {
+#define bq2751x_regs bq27510g3_regs
+#define bq2752x_regs bq27510g3_regs
+ bq27500_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -261,27 +221,9 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27510G2] = {
- [BQ27XXX_REG_CTRL] = 0x00,
- [BQ27XXX_REG_TEMP] = 0x06,
- [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
- [BQ27XXX_REG_VOLT] = 0x08,
- [BQ27XXX_REG_AI] = 0x14,
- [BQ27XXX_REG_FLAGS] = 0x0a,
- [BQ27XXX_REG_TTE] = 0x16,
- [BQ27XXX_REG_TTF] = 0x18,
- [BQ27XXX_REG_TTES] = 0x1c,
- [BQ27XXX_REG_TTECP] = 0x26,
- [BQ27XXX_REG_NAC] = 0x0c,
- [BQ27XXX_REG_FCC] = 0x12,
- [BQ27XXX_REG_CYCT] = 0x2a,
- [BQ27XXX_REG_AE] = 0x22,
- [BQ27XXX_REG_SOC] = 0x2c,
- [BQ27XXX_REG_DCAP] = 0x3c,
- [BQ27XXX_REG_AP] = 0x24,
- BQ27XXX_DM_REG_ROWS,
- },
- [BQ27510G3] = {
+#define bq27510g1_regs bq27500_regs
+#define bq27510g2_regs bq27500_regs
+ bq27510g3_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -301,7 +243,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27520G1] = {
+ bq27520g1_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -321,7 +263,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27520G2] = {
+ bq27520g2_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x36,
@@ -341,7 +283,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27520G3] = {
+ bq27520g3_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x36,
@@ -361,7 +303,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27520G4] = {
+ bq27520g4_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -381,7 +323,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27530] = {
+ bq27530_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x32,
@@ -401,7 +343,8 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27541] = {
+#define bq27531_regs bq27530_regs
+ bq27541_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -421,7 +364,10 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27545] = {
+#define bq27542_regs bq27541_regs
+#define bq27546_regs bq27541_regs
+#define bq27742_regs bq27541_regs
+ bq27545_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x06,
[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -441,7 +387,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_AP] = 0x24,
BQ27XXX_DM_REG_ROWS,
},
- [BQ27421] = {
+ bq27421_regs[BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_CTRL] = 0x00,
[BQ27XXX_REG_TEMP] = 0x02,
[BQ27XXX_REG_INT_TEMP] = 0x1e,
@@ -460,10 +406,12 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_DCAP] = 0x3c,
[BQ27XXX_REG_AP] = 0x18,
BQ27XXX_DM_REG_ROWS,
- },
-};
+ };
+#define bq27425_regs bq27421_regs
+#define bq27441_regs bq27421_regs
+#define bq27621_regs bq27421_regs
-static enum power_supply_property bq27000_battery_props[] = {
+static enum power_supply_property bq27000_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -485,7 +433,7 @@ static enum power_supply_property bq27000_battery_props[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27010_battery_props[] = {
+static enum power_supply_property bq27010_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -505,25 +453,11 @@ static enum power_supply_property bq27010_battery_props[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq2750x_battery_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CAPACITY_LEVEL,
- POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TECHNOLOGY,
- POWER_SUPPLY_PROP_CHARGE_FULL,
- POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_MANUFACTURER,
-};
+#define bq2750x_props bq27510g3_props
+#define bq2751x_props bq27510g3_props
+#define bq2752x_props bq27510g3_props
-static enum power_supply_property bq2751x_battery_props[] = {
+static enum power_supply_property bq27500_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -532,16 +466,21 @@ static enum power_supply_property bq2751x_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
+ POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CYCLE_COUNT,
+ POWER_SUPPLY_PROP_ENERGY_NOW,
+ POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
+#define bq27510g1_props bq27500_props
+#define bq27510g2_props bq27500_props
-static enum power_supply_property bq27500_battery_props[] = {
+static enum power_supply_property bq27510g3_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -550,19 +489,16 @@ static enum power_supply_property bq27500_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_ENERGY_NOW,
- POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27510g1_battery_props[] = {
+static enum power_supply_property bq27520g1_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -576,14 +512,15 @@ static enum power_supply_property bq27510g1_battery_props[] = {
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_ENERGY_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27510g2_battery_props[] = {
+#define bq27520g2_props bq27500_props
+
+static enum power_supply_property bq27520g3_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -592,7 +529,6 @@ static enum power_supply_property bq27510g2_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
@@ -604,7 +540,7 @@ static enum power_supply_property bq27510g2_battery_props[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27510g3_battery_props[] = {
+static enum power_supply_property bq27520g4_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -616,13 +552,12 @@ static enum power_supply_property bq27510g3_battery_props[] = {
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27520g1_battery_props[] = {
+static enum power_supply_property bq27530_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -631,18 +566,17 @@ static enum power_supply_property bq27520g1_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- POWER_SUPPLY_PROP_ENERGY_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
+ POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_MANUFACTURER,
};
+#define bq27531_props bq27530_props
-static enum power_supply_property bq27520g2_battery_props[] = {
+static enum power_supply_property bq27541_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -651,19 +585,20 @@ static enum power_supply_property bq27520g2_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_ENERGY_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
+#define bq27542_props bq27541_props
+#define bq27546_props bq27541_props
+#define bq27742_props bq27541_props
-static enum power_supply_property bq27520g3_battery_props[] = {
+static enum power_supply_property bq27545_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -675,15 +610,13 @@ static enum power_supply_property bq27520g3_battery_props[] = {
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
+ POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_ENERGY_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
- POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_MANUFACTURER,
};
-static enum power_supply_property bq27520g4_battery_props[] = {
+static enum power_supply_property bq27421_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -691,111 +624,144 @@ static enum power_supply_property bq27520g4_battery_props[] = {
POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_HEALTH,
+ POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_MANUFACTURER,
};
+#define bq27425_props bq27421_props
+#define bq27441_props bq27421_props
+#define bq27621_props bq27421_props
-static enum power_supply_property bq27530_battery_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CAPACITY_LEVEL,
- POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TECHNOLOGY,
- POWER_SUPPLY_PROP_CHARGE_FULL,
- POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_POWER_AVG,
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_MANUFACTURER,
+struct bq27xxx_dm_reg {
+ u8 subclass_id;
+ u8 offset;
+ u8 bytes;
+ u16 min, max;
};
-static enum power_supply_property bq27541_battery_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CAPACITY_LEVEL,
- POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TECHNOLOGY,
- POWER_SUPPLY_PROP_CHARGE_FULL,
- POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_POWER_AVG,
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_MANUFACTURER,
+enum bq27xxx_dm_reg_id {
+ BQ27XXX_DM_DESIGN_CAPACITY = 0,
+ BQ27XXX_DM_DESIGN_ENERGY,
+ BQ27XXX_DM_TERMINATE_VOLTAGE,
};
-static enum power_supply_property bq27545_battery_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CAPACITY_LEVEL,
- POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
- POWER_SUPPLY_PROP_TECHNOLOGY,
- POWER_SUPPLY_PROP_CHARGE_FULL,
- POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_CYCLE_COUNT,
- POWER_SUPPLY_PROP_POWER_AVG,
- POWER_SUPPLY_PROP_MANUFACTURER,
+#define bq27000_dm_regs 0
+#define bq27010_dm_regs 0
+#define bq2750x_dm_regs 0
+#define bq2751x_dm_regs 0
+#define bq2752x_dm_regs 0
+
+#if 0 /* not yet tested */
+static struct bq27xxx_dm_reg bq27500_dm_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] = { 48, 10, 2, 0, 65535 },
+ [BQ27XXX_DM_DESIGN_ENERGY] = { }, /* missing on chip */
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 80, 48, 2, 1000, 32767 },
};
+#else
+#define bq27500_dm_regs 0
+#endif
-static enum power_supply_property bq27421_battery_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CAPACITY_LEVEL,
- POWER_SUPPLY_PROP_TEMP,
- POWER_SUPPLY_PROP_TECHNOLOGY,
- POWER_SUPPLY_PROP_CHARGE_FULL,
- POWER_SUPPLY_PROP_CHARGE_NOW,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- POWER_SUPPLY_PROP_MANUFACTURER,
+/* todo create data memory definitions from datasheets and test on chips */
+#define bq27510g1_dm_regs 0
+#define bq27510g2_dm_regs 0
+#define bq27510g3_dm_regs 0
+#define bq27520g1_dm_regs 0
+#define bq27520g2_dm_regs 0
+#define bq27520g3_dm_regs 0
+#define bq27520g4_dm_regs 0
+#define bq27530_dm_regs 0
+#define bq27531_dm_regs 0
+#define bq27541_dm_regs 0
+#define bq27542_dm_regs 0
+#define bq27546_dm_regs 0
+#define bq27742_dm_regs 0
+
+#if 0 /* not yet tested */
+static struct bq27xxx_dm_reg bq27545_dm_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] = { 48, 23, 2, 0, 32767 },
+ [BQ27XXX_DM_DESIGN_ENERGY] = { 48, 25, 2, 0, 32767 },
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 80, 67, 2, 2800, 3700 },
};
+#else
+#define bq27545_dm_regs 0
+#endif
-#define BQ27XXX_PROP(_id, _prop) \
- [_id] = { \
- .props = _prop, \
- .size = ARRAY_SIZE(_prop), \
- }
+static struct bq27xxx_dm_reg bq27421_dm_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 10, 2, 0, 8000 },
+ [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 12, 2, 0, 32767 },
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 16, 2, 2500, 3700 },
+};
+
+static struct bq27xxx_dm_reg bq27425_dm_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 12, 2, 0, 32767 },
+ [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 14, 2, 0, 32767 },
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 18, 2, 2800, 3700 },
+};
+
+#if 0 /* not yet tested */
+#define bq27441_dm_regs bq27421_dm_regs
+#else
+#define bq27441_dm_regs 0
+#endif
+
+#if 0 /* not yet tested */
+static struct bq27xxx_dm_reg bq27621_dm_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 3, 2, 0, 8000 },
+ [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 5, 2, 0, 32767 },
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 9, 2, 2500, 3700 },
+};
+#else
+#define bq27621_dm_regs 0
+#endif
+
+#define BQ27XXX_O_ZERO 0x00000001
+#define BQ27XXX_O_OTDC 0x00000002
+#define BQ27XXX_O_UTOT 0x00000004
+#define BQ27XXX_O_CFGUP 0x00000008
+#define BQ27XXX_O_RAM 0x00000010
+
+#define BQ27XXX_DATA(ref, key, opt) { \
+ .opts = (opt), \
+ .unseal_key = key, \
+ .regs = ref##_regs, \
+ .dm_regs = ref##_dm_regs, \
+ .props = ref##_props, \
+ .props_size = ARRAY_SIZE(ref##_props) }
static struct {
+ u32 opts;
+ u32 unseal_key;
+ u8 *regs;
+ struct bq27xxx_dm_reg *dm_regs;
enum power_supply_property *props;
- size_t size;
-} bq27xxx_battery_props[] = {
- BQ27XXX_PROP(BQ27000, bq27000_battery_props),
- BQ27XXX_PROP(BQ27010, bq27010_battery_props),
- BQ27XXX_PROP(BQ2750X, bq2750x_battery_props),
- BQ27XXX_PROP(BQ2751X, bq2751x_battery_props),
- BQ27XXX_PROP(BQ27500, bq27500_battery_props),
- BQ27XXX_PROP(BQ27510G1, bq27510g1_battery_props),
- BQ27XXX_PROP(BQ27510G2, bq27510g2_battery_props),
- BQ27XXX_PROP(BQ27510G3, bq27510g3_battery_props),
- BQ27XXX_PROP(BQ27520G1, bq27520g1_battery_props),
- BQ27XXX_PROP(BQ27520G2, bq27520g2_battery_props),
- BQ27XXX_PROP(BQ27520G3, bq27520g3_battery_props),
- BQ27XXX_PROP(BQ27520G4, bq27520g4_battery_props),
- BQ27XXX_PROP(BQ27530, bq27530_battery_props),
- BQ27XXX_PROP(BQ27541, bq27541_battery_props),
- BQ27XXX_PROP(BQ27545, bq27545_battery_props),
- BQ27XXX_PROP(BQ27421, bq27421_battery_props),
+ size_t props_size;
+} bq27xxx_chip_data[] = {
+ [BQ27000] = BQ27XXX_DATA(bq27000, 0 , BQ27XXX_O_ZERO),
+ [BQ27010] = BQ27XXX_DATA(bq27010, 0 , BQ27XXX_O_ZERO),
+ [BQ2750X] = BQ27XXX_DATA(bq2750x, 0 , BQ27XXX_O_OTDC),
+ [BQ2751X] = BQ27XXX_DATA(bq2751x, 0 , BQ27XXX_O_OTDC),
+ [BQ2752X] = BQ27XXX_DATA(bq2752x, 0 , BQ27XXX_O_OTDC),
+ [BQ27500] = BQ27XXX_DATA(bq27500, 0x04143672, BQ27XXX_O_OTDC),
+ [BQ27510G1] = BQ27XXX_DATA(bq27510g1, 0 , BQ27XXX_O_OTDC),
+ [BQ27510G2] = BQ27XXX_DATA(bq27510g2, 0 , BQ27XXX_O_OTDC),
+ [BQ27510G3] = BQ27XXX_DATA(bq27510g3, 0 , BQ27XXX_O_OTDC),
+ [BQ27520G1] = BQ27XXX_DATA(bq27520g1, 0 , BQ27XXX_O_OTDC),
+ [BQ27520G2] = BQ27XXX_DATA(bq27520g2, 0 , BQ27XXX_O_OTDC),
+ [BQ27520G3] = BQ27XXX_DATA(bq27520g3, 0 , BQ27XXX_O_OTDC),
+ [BQ27520G4] = BQ27XXX_DATA(bq27520g4, 0 , BQ27XXX_O_OTDC),
+ [BQ27530] = BQ27XXX_DATA(bq27530, 0 , BQ27XXX_O_UTOT),
+ [BQ27531] = BQ27XXX_DATA(bq27531, 0 , BQ27XXX_O_UTOT),
+ [BQ27541] = BQ27XXX_DATA(bq27541, 0 , BQ27XXX_O_OTDC),
+ [BQ27542] = BQ27XXX_DATA(bq27542, 0 , BQ27XXX_O_OTDC),
+ [BQ27546] = BQ27XXX_DATA(bq27546, 0 , BQ27XXX_O_OTDC),
+ [BQ27742] = BQ27XXX_DATA(bq27742, 0 , BQ27XXX_O_OTDC),
+ [BQ27545] = BQ27XXX_DATA(bq27545, 0x04143672, BQ27XXX_O_OTDC),
+ [BQ27421] = BQ27XXX_DATA(bq27421, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
+ [BQ27425] = BQ27XXX_DATA(bq27425, 0x04143672, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP),
+ [BQ27441] = BQ27XXX_DATA(bq27441, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
+ [BQ27621] = BQ27XXX_DATA(bq27621, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
};
static DEFINE_MUTEX(bq27xxx_list_lock);
@@ -805,13 +771,6 @@ static LIST_HEAD(bq27xxx_battery_devices);
#define BQ27XXX_DM_SZ 32
-struct bq27xxx_dm_reg {
- u8 subclass_id;
- u8 offset;
- u8 bytes;
- u16 min, max;
-};
-
/**
* struct bq27xxx_dm_buf - chip data memory buffer
* @class: data memory subclass_id
@@ -844,12 +803,6 @@ static inline u16 *bq27xxx_dm_reg_ptr(struct bq27xxx_dm_buf *buf,
return NULL;
}
-enum bq27xxx_dm_reg_id {
- BQ27XXX_DM_DESIGN_CAPACITY = 0,
- BQ27XXX_DM_DESIGN_ENERGY,
- BQ27XXX_DM_TERMINATE_VOLTAGE,
-};
-
static const char * const bq27xxx_dm_reg_name[] = {
[BQ27XXX_DM_DESIGN_CAPACITY] = "design-capacity",
[BQ27XXX_DM_DESIGN_ENERGY] = "design-energy",
@@ -1092,9 +1045,9 @@ static void bq27xxx_battery_update_dm_block(struct bq27xxx_device_info *di,
}
#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
- if (!di->ram_chip && !bq27xxx_dt_to_nvm) {
+ if (!(di->opts & BQ27XXX_O_RAM) && !bq27xxx_dt_to_nvm) {
#else
- if (!di->ram_chip) {
+ if (!(di->opts & BQ27XXX_O_RAM)) {
#endif
/* devicetree and NVM differ; defer to NVM */
dev_warn(di->dev, "%s has %u; update to %u disallowed "
@@ -1130,7 +1083,7 @@ static int bq27xxx_battery_cfgupdate_priv(struct bq27xxx_device_info *di, bool a
return ret;
} while (!!(ret & BQ27XXX_FLAG_CFGUP) != active && --try);
- if (!try) {
+ if (!try && di->chip != BQ27425) { // 425 has a bug
dev_err(di->dev, "timed out waiting for cfgupdate flag %d\n", active);
return -EINVAL;
}
@@ -1162,7 +1115,7 @@ static inline int bq27xxx_battery_soft_reset(struct bq27xxx_device_info *di)
static int bq27xxx_battery_write_dm_block(struct bq27xxx_device_info *di,
struct bq27xxx_dm_buf *buf)
{
- bool cfgup = di->chip == BQ27421; /* assume related chips need cfgupdate */
+ bool cfgup = di->opts & BQ27XXX_O_CFGUP;
int ret;
if (!buf->dirty)
@@ -1261,7 +1214,7 @@ static void bq27xxx_battery_set_config(struct bq27xxx_device_info *di,
bq27xxx_battery_seal(di);
- if (updated && di->chip != BQ27421) { /* not a cfgupdate chip, so reset */
+ if (updated && !(di->opts & BQ27XXX_O_CFGUP)) {
bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_RESET, false);
BQ27XXX_MSLEEP(300); /* reset time is not documented */
}
@@ -1328,7 +1281,7 @@ static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
{
int soc;
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true);
else
soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);
@@ -1354,7 +1307,7 @@ static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
return charge;
}
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
else
charge *= 1000;
@@ -1370,7 +1323,7 @@ static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
{
int flags;
- if (di->chip == BQ27000 || di->chip == BQ27010) {
+ if (di->opts & BQ27XXX_O_ZERO) {
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
if (flags >= 0 && (flags & BQ27000_FLAG_CI))
return -ENODATA;
@@ -1396,7 +1349,7 @@ static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
{
int dcap;
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, true);
else
dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false);
@@ -1406,7 +1359,7 @@ static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
return dcap;
}
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
dcap = (dcap << 8) * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
else
dcap *= 1000;
@@ -1428,7 +1381,7 @@ static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di)
return ae;
}
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS;
else
ae *= 1000;
@@ -1450,7 +1403,7 @@ static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di)
return temp;
}
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
temp = 5 * temp / 2;
return temp;
@@ -1507,7 +1460,7 @@ static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
return tval;
}
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
else
return tval;
@@ -1518,26 +1471,12 @@ static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
*/
static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
{
- switch (di->chip) {
- case BQ2750X:
- case BQ2751X:
- case BQ27500:
- case BQ27510G1:
- case BQ27510G2:
- case BQ27510G3:
- case BQ27520G1:
- case BQ27520G2:
- case BQ27520G3:
- case BQ27520G4:
- case BQ27541:
- case BQ27545:
+ if (di->opts & BQ27XXX_O_OTDC)
return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
- case BQ27530:
- case BQ27421:
+ if (di->opts & BQ27XXX_O_UTOT)
return flags & BQ27XXX_FLAG_OT;
- default:
- return false;
- }
+
+ return false;
}
/*
@@ -1545,7 +1484,7 @@ static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
*/
static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags)
{
- if (di->chip == BQ27530 || di->chip == BQ27421)
+ if (di->opts & BQ27XXX_O_UTOT)
return flags & BQ27XXX_FLAG_UT;
return false;
@@ -1556,7 +1495,7 @@ static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags)
*/
static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
{
- if (di->chip == BQ27000 || di->chip == BQ27010)
+ if (di->opts & BQ27XXX_O_ZERO)
return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
else
return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
@@ -1569,7 +1508,7 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
{
int flags;
- bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010;
+ bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
if (flags < 0) {
@@ -1591,8 +1530,8 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
void bq27xxx_battery_update(struct bq27xxx_device_info *di)
{
struct bq27xxx_reg_cache cache = {0, };
- bool has_ci_flag = di->chip == BQ27000 || di->chip == BQ27010;
- bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010;
+ bool has_ci_flag = di->opts & BQ27XXX_O_ZERO;
+ bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;
cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
if ((cache.flags & 0xff) == 0xff)
@@ -1670,7 +1609,7 @@ static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
return curr;
}
- if (di->chip == BQ27000 || di->chip == BQ27010) {
+ if (di->opts & BQ27XXX_O_ZERO) {
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
if (flags & BQ27000_FLAG_CHGS) {
dev_dbg(di->dev, "negative current!\n");
@@ -1691,7 +1630,7 @@ static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
{
int status;
- if (di->chip == BQ27000 || di->chip == BQ27010) {
+ if (di->opts & BQ27XXX_O_ZERO) {
if (di->cache.flags & BQ27000_FLAG_FC)
status = POWER_SUPPLY_STATUS_FULL;
else if (di->cache.flags & BQ27000_FLAG_CHGS)
@@ -1719,7 +1658,7 @@ static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
{
int level;
- if (di->chip == BQ27000 || di->chip == BQ27010) {
+ if (di->opts & BQ27XXX_O_ZERO) {
if (di->cache.flags & BQ27000_FLAG_FC)
level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
else if (di->cache.flags & BQ27000_FLAG_EDV1)
@@ -1884,7 +1823,11 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
mutex_init(&di->lock);
- di->regs = bq27xxx_regs[di->chip];
+
+ di->regs = bq27xxx_chip_data[di->chip].regs;
+ di->unseal_key = bq27xxx_chip_data[di->chip].unseal_key;
+ di->dm_regs = bq27xxx_chip_data[di->chip].dm_regs;
+ di->opts = bq27xxx_chip_data[di->chip].opts;
psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
if (!psy_desc)
@@ -1892,8 +1835,8 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
psy_desc->name = di->name;
psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
- psy_desc->properties = bq27xxx_battery_props[di->chip].props;
- psy_desc->num_properties = bq27xxx_battery_props[di->chip].size;
+ psy_desc->properties = bq27xxx_chip_data[di->chip].props;
+ psy_desc->num_properties = bq27xxx_chip_data[di->chip].props_size;
psy_desc->get_property = bq27xxx_battery_get_property;
psy_desc->external_power_changed = bq27xxx_external_power_changed;
@@ -1903,8 +1846,6 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
return PTR_ERR(di->bat);
}
- dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
-
bq27xxx_battery_settings(di);
bq27xxx_battery_update(di);
@@ -1938,110 +1879,6 @@ void bq27xxx_battery_teardown(struct bq27xxx_device_info *di)
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown);
-static int bq27xxx_battery_platform_read(struct bq27xxx_device_info *di, u8 reg,
- bool single)
-{
- struct device *dev = di->dev;
- struct bq27xxx_platform_data *pdata = dev->platform_data;
- unsigned int timeout = 3;
- int upper, lower;
- int temp;
-
- if (!single) {
- /* Make sure the value has not changed in between reading the
- * lower and the upper part */
- upper = pdata->read(dev, reg + 1);
- do {
- temp = upper;
- if (upper < 0)
- return upper;
-
- lower = pdata->read(dev, reg);
- if (lower < 0)
- return lower;
-
- upper = pdata->read(dev, reg + 1);
- } while (temp != upper && --timeout);
-
- if (timeout == 0)
- return -EIO;
-
- return (upper << 8) | lower;
- }
-
- return pdata->read(dev, reg);
-}
-
-static int bq27xxx_battery_platform_probe(struct platform_device *pdev)
-{
- struct bq27xxx_device_info *di;
- struct bq27xxx_platform_data *pdata = pdev->dev.platform_data;
-
- if (!pdata) {
- dev_err(&pdev->dev, "no platform_data supplied\n");
- return -EINVAL;
- }
-
- if (!pdata->read) {
- dev_err(&pdev->dev, "no hdq read callback supplied\n");
- return -EINVAL;
- }
-
- if (!pdata->chip) {
- dev_err(&pdev->dev, "no device supplied\n");
- return -EINVAL;
- }
-
- di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
- if (!di)
- return -ENOMEM;
-
- platform_set_drvdata(pdev, di);
-
- di->dev = &pdev->dev;
- di->chip = pdata->chip;
- di->name = pdata->name ?: dev_name(&pdev->dev);
- di->bus.read = bq27xxx_battery_platform_read;
-
- return bq27xxx_battery_setup(di);
-}
-
-static int bq27xxx_battery_platform_remove(struct platform_device *pdev)
-{
- struct bq27xxx_device_info *di = platform_get_drvdata(pdev);
-
- bq27xxx_battery_teardown(di);
-
- return 0;
-}
-
-static const struct platform_device_id bq27xxx_battery_platform_id_table[] = {
- { "bq27000-battery", },
- { /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(platform, bq27xxx_battery_platform_id_table);
-
-#ifdef CONFIG_OF
-static const struct of_device_id bq27xxx_battery_platform_of_match_table[] = {
- { .compatible = "ti,bq27000" },
- {},
-};
-MODULE_DEVICE_TABLE(of, bq27xxx_battery_platform_of_match_table);
-#endif
-
-static struct platform_driver bq27xxx_battery_platform_driver = {
- .probe = bq27xxx_battery_platform_probe,
- .remove = bq27xxx_battery_platform_remove,
- .driver = {
- .name = "bq27000-battery",
- .of_match_table = of_match_ptr(bq27xxx_battery_platform_of_match_table),
- },
- .id_table = bq27xxx_battery_platform_id_table,
-};
-module_platform_driver(bq27xxx_battery_platform_driver);
-
-MODULE_ALIAS("platform:bq27000-battery");
-
MODULE_AUTHOR("Rodolfo Giometti <[email protected]>");
MODULE_DESCRIPTION("BQ27xxx battery monitor driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/power/supply/bq27xxx_battery_hdq.c b/drivers/power/supply/bq27xxx_battery_hdq.c
new file mode 100644
index 000000000000..9aff896c9802
--- /dev/null
+++ b/drivers/power/supply/bq27xxx_battery_hdq.c
@@ -0,0 +1,135 @@
+/*
+ * BQ27xxx battery monitor HDQ/1-wire driver
+ *
+ * Copyright (C) 2007-2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/types.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+#include <linux/power/bq27xxx_battery.h>
+
+#include <linux/w1.h>
+
+#define W1_FAMILY_BQ27000 0x01
+
+#define HDQ_CMD_READ (0 << 7)
+#define HDQ_CMD_WRITE (1 << 7)
+
+static int F_ID;
+module_param(F_ID, int, S_IRUSR);
+MODULE_PARM_DESC(F_ID, "1-wire slave FID for BQ27xxx device");
+
+static int w1_bq27000_read(struct w1_slave *sl, unsigned int reg)
+{
+ u8 val;
+
+ mutex_lock(&sl->master->bus_mutex);
+ w1_write_8(sl->master, HDQ_CMD_READ | reg);
+ val = w1_read_8(sl->master);
+ mutex_unlock(&sl->master->bus_mutex);
+
+ return val;
+}
+
+static int bq27xxx_battery_hdq_read(struct bq27xxx_device_info *di, u8 reg,
+ bool single)
+{
+ struct w1_slave *sl = dev_to_w1_slave(di->dev);
+ unsigned int timeout = 3;
+ int upper, lower;
+ int temp;
+
+ if (!single) {
+ /*
+ * Make sure the value has not changed in between reading the
+ * lower and the upper part
+ */
+ upper = w1_bq27000_read(sl, reg + 1);
+ do {
+ temp = upper;
+ if (upper < 0)
+ return upper;
+
+ lower = w1_bq27000_read(sl, reg);
+ if (lower < 0)
+ return lower;
+
+ upper = w1_bq27000_read(sl, reg + 1);
+ } while (temp != upper && --timeout);
+
+ if (timeout == 0)
+ return -EIO;
+
+ return (upper << 8) | lower;
+ }
+
+ return w1_bq27000_read(sl, reg);
+}
+
+static int bq27xxx_battery_hdq_add_slave(struct w1_slave *sl)
+{
+ struct bq27xxx_device_info *di;
+
+ di = devm_kzalloc(&sl->dev, sizeof(*di), GFP_KERNEL);
+ if (!di)
+ return -ENOMEM;
+
+ dev_set_drvdata(&sl->dev, di);
+
+ di->dev = &sl->dev;
+ di->chip = BQ27000;
+ di->name = "bq27000-battery";
+ di->bus.read = bq27xxx_battery_hdq_read;
+
+ return bq27xxx_battery_setup(di);
+}
+
+static void bq27xxx_battery_hdq_remove_slave(struct w1_slave *sl)
+{
+ struct bq27xxx_device_info *di = dev_get_drvdata(&sl->dev);
+
+ bq27xxx_battery_teardown(di);
+}
+
+static struct w1_family_ops bq27xxx_battery_hdq_fops = {
+ .add_slave = bq27xxx_battery_hdq_add_slave,
+ .remove_slave = bq27xxx_battery_hdq_remove_slave,
+};
+
+static struct w1_family bq27xxx_battery_hdq_family = {
+ .fid = W1_FAMILY_BQ27000,
+ .fops = &bq27xxx_battery_hdq_fops,
+};
+
+static int __init bq27xxx_battery_hdq_init(void)
+{
+ if (F_ID)
+ bq27xxx_battery_hdq_family.fid = F_ID;
+
+ return w1_register_family(&bq27xxx_battery_hdq_family);
+}
+module_init(bq27xxx_battery_hdq_init);
+
+static void __exit bq27xxx_battery_hdq_exit(void)
+{
+ w1_unregister_family(&bq27xxx_battery_hdq_family);
+}
+module_exit(bq27xxx_battery_hdq_exit);
+
+MODULE_AUTHOR("Texas Instruments Ltd");
+MODULE_DESCRIPTION("BQ27xxx battery monitor HDQ/1-wire driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_BQ27000));
diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index a5972214f074..0b11ed472f33 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -230,7 +230,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
{ "bq27210", BQ27010 },
{ "bq27500", BQ2750X },
{ "bq27510", BQ2751X },
- { "bq27520", BQ2751X },
+ { "bq27520", BQ2752X },
{ "bq27500-1", BQ27500 },
{ "bq27510g1", BQ27510G1 },
{ "bq27510g2", BQ27510G2 },
@@ -240,16 +240,16 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
{ "bq27520g3", BQ27520G3 },
{ "bq27520g4", BQ27520G4 },
{ "bq27530", BQ27530 },
- { "bq27531", BQ27530 },
+ { "bq27531", BQ27531 },
{ "bq27541", BQ27541 },
- { "bq27542", BQ27541 },
- { "bq27546", BQ27541 },
- { "bq27742", BQ27541 },
+ { "bq27542", BQ27542 },
+ { "bq27546", BQ27546 },
+ { "bq27742", BQ27742 },
{ "bq27545", BQ27545 },
{ "bq27421", BQ27421 },
- { "bq27425", BQ27421 },
- { "bq27441", BQ27421 },
- { "bq27621", BQ27421 },
+ { "bq27425", BQ27425 },
+ { "bq27441", BQ27441 },
+ { "bq27621", BQ27621 },
{},
};
MODULE_DEVICE_TABLE(i2c, bq27xxx_i2c_id_table);
diff --git a/drivers/power/supply/charger-manager.c b/drivers/power/supply/charger-manager.c
index adc3761831e1..6502fa7c2106 100644
--- a/drivers/power/supply/charger-manager.c
+++ b/drivers/power/supply/charger-manager.c
@@ -1632,8 +1632,7 @@ static int charger_manager_probe(struct platform_device *pdev)
return -ENODEV;
}
- cm = devm_kzalloc(&pdev->dev,
- sizeof(struct charger_manager), GFP_KERNEL);
+ cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL);
if (!cm)
return -ENOMEM;
@@ -1645,12 +1644,14 @@ static int charger_manager_probe(struct platform_device *pdev)
/* Initialize alarm timer */
if (alarmtimer_get_rtcdev()) {
cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL);
+ if (!cm_timer)
+ return -ENOMEM;
alarm_init(cm_timer, ALARM_BOOTTIME, cm_timer_func);
}
/*
- * The following two do not need to be errors.
- * Users may intentionally ignore those two features.
+ * Some of the following do not need to be errors.
+ * Users may intentionally ignore those features.
*/
if (desc->fullbatt_uV == 0) {
dev_info(&pdev->dev, "Ignoring full-battery voltage threshold as it is not supplied\n");
diff --git a/drivers/power/supply/ds2780_battery.c b/drivers/power/supply/ds2780_battery.c
index 8edd4aa5f475..e5d81b493c45 100644
--- a/drivers/power/supply/ds2780_battery.c
+++ b/drivers/power/supply/ds2780_battery.c
@@ -663,7 +663,7 @@ static ssize_t ds2780_write_param_eeprom_bin(struct file *filp,
return count;
}
-static struct bin_attribute ds2780_param_eeprom_bin_attr = {
+static const struct bin_attribute ds2780_param_eeprom_bin_attr = {
.attr = {
.name = "param_eeprom",
.mode = S_IRUGO | S_IWUSR,
@@ -708,7 +708,7 @@ static ssize_t ds2780_write_user_eeprom_bin(struct file *filp,
return count;
}
-static struct bin_attribute ds2780_user_eeprom_bin_attr = {
+static const struct bin_attribute ds2780_user_eeprom_bin_attr = {
.attr = {
.name = "user_eeprom",
.mode = S_IRUGO | S_IWUSR,
diff --git a/drivers/power/supply/ds2781_battery.c b/drivers/power/supply/ds2781_battery.c
index 4400402f9ec5..efe83ef8670c 100644
--- a/drivers/power/supply/ds2781_battery.c
+++ b/drivers/power/supply/ds2781_battery.c
@@ -665,7 +665,7 @@ static ssize_t ds2781_write_param_eeprom_bin(struct file *filp,
return count;
}
-static struct bin_attribute ds2781_param_eeprom_bin_attr = {
+static const struct bin_attribute ds2781_param_eeprom_bin_attr = {
.attr = {
.name = "param_eeprom",
.mode = S_IRUGO | S_IWUSR,
@@ -711,7 +711,7 @@ static ssize_t ds2781_write_user_eeprom_bin(struct file *filp,
return count;
}
-static struct bin_attribute ds2781_user_eeprom_bin_attr = {
+static const struct bin_attribute ds2781_user_eeprom_bin_attr = {
.attr = {
.name = "user_eeprom",
.mode = S_IRUGO | S_IWUSR,
diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c
index 677f7c40b25a..0f3432795f3c 100644
--- a/drivers/power/supply/lp8788-charger.c
+++ b/drivers/power/supply/lp8788-charger.c
@@ -626,7 +626,7 @@ static ssize_t lp8788_show_charger_status(struct device *dev,
{
struct lp8788_charger *pchg = dev_get_drvdata(dev);
enum lp8788_charging_state state;
- char *desc[LP8788_MAX_CHG_STATE] = {
+ static const char * const desc[LP8788_MAX_CHG_STATE] = {
[LP8788_OFF] = "CHARGER OFF",
[LP8788_WARM_UP] = "WARM UP",
[LP8788_LOW_INPUT] = "LOW INPUT STATE",
@@ -650,8 +650,10 @@ static ssize_t lp8788_show_eoc_time(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct lp8788_charger *pchg = dev_get_drvdata(dev);
- char *stime[] = { "400ms", "5min", "10min", "15min",
- "20min", "25min", "30min", "No timeout" };
+ static const char * const stime[] = {
+ "400ms", "5min", "10min", "15min",
+ "20min", "25min", "30min", "No timeout"
+ };
u8 val;
lp8788_read_byte(pchg->lp, LP8788_CHG_EOC, &val);
@@ -665,9 +667,13 @@ static ssize_t lp8788_show_eoc_level(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct lp8788_charger *pchg = dev_get_drvdata(dev);
- char *abs_level[] = { "25mA", "49mA", "75mA", "98mA" };
- char *relative_level[] = { "5%", "10%", "15%", "20%" };
- char *level;
+ static const char * const abs_level[] = {
+ "25mA", "49mA", "75mA", "98mA"
+ };
+ static const char * const relative_level[] = {
+ "5%", "10%", "15%", "20%"
+ };
+ const char *level;
u8 val;
u8 mode;
diff --git a/drivers/power/supply/ltc2941-battery-gauge.c b/drivers/power/supply/ltc2941-battery-gauge.c
index 7efb908f4451..08e4fd9ee607 100644
--- a/drivers/power/supply/ltc2941-battery-gauge.c
+++ b/drivers/power/supply/ltc2941-battery-gauge.c
@@ -1,6 +1,6 @@
/*
- * I2C client/driver for the Linear Technology LTC2941 and LTC2943
- * Battery Gas Gauge IC
+ * I2C client/driver for the Linear Technology LTC2941, LTC2942, LTC2943
+ * and LTC2944 Battery Gas Gauge IC
*
* Copyright (C) 2014 Topic Embedded Systems
*
@@ -34,35 +34,39 @@ enum ltc294x_reg {
LTC294X_REG_CONTROL = 0x01,
LTC294X_REG_ACC_CHARGE_MSB = 0x02,
LTC294X_REG_ACC_CHARGE_LSB = 0x03,
- LTC294X_REG_THRESH_HIGH_MSB = 0x04,
- LTC294X_REG_THRESH_HIGH_LSB = 0x05,
- LTC294X_REG_THRESH_LOW_MSB = 0x06,
- LTC294X_REG_THRESH_LOW_LSB = 0x07,
- LTC294X_REG_VOLTAGE_MSB = 0x08,
- LTC294X_REG_VOLTAGE_LSB = 0x09,
- LTC294X_REG_CURRENT_MSB = 0x0E,
- LTC294X_REG_CURRENT_LSB = 0x0F,
- LTC294X_REG_TEMPERATURE_MSB = 0x14,
- LTC294X_REG_TEMPERATURE_LSB = 0x15,
+ LTC294X_REG_VOLTAGE_MSB = 0x08,
+ LTC294X_REG_VOLTAGE_LSB = 0x09,
+ LTC2942_REG_TEMPERATURE_MSB = 0x0C,
+ LTC2942_REG_TEMPERATURE_LSB = 0x0D,
+ LTC2943_REG_CURRENT_MSB = 0x0E,
+ LTC2943_REG_CURRENT_LSB = 0x0F,
+ LTC2943_REG_TEMPERATURE_MSB = 0x14,
+ LTC2943_REG_TEMPERATURE_LSB = 0x15,
};
-#define LTC2943_REG_CONTROL_MODE_MASK (BIT(7) | BIT(6))
-#define LTC2943_REG_CONTROL_MODE_SCAN BIT(7)
+enum ltc294x_id {
+ LTC2941_ID,
+ LTC2942_ID,
+ LTC2943_ID,
+ LTC2944_ID,
+};
+
+#define LTC2941_REG_STATUS_CHIP_ID BIT(7)
+
+#define LTC2942_REG_CONTROL_MODE_SCAN (BIT(7) | BIT(6))
+#define LTC2943_REG_CONTROL_MODE_SCAN BIT(7)
#define LTC294X_REG_CONTROL_PRESCALER_MASK (BIT(5) | BIT(4) | BIT(3))
#define LTC294X_REG_CONTROL_SHUTDOWN_MASK (BIT(0))
#define LTC294X_REG_CONTROL_PRESCALER_SET(x) \
((x << 3) & LTC294X_REG_CONTROL_PRESCALER_MASK)
#define LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED 0
-#define LTC2941_NUM_REGS 0x08
-#define LTC2943_NUM_REGS 0x18
-
struct ltc294x_info {
struct i2c_client *client; /* I2C Client pointer */
struct power_supply *supply; /* Supply pointer */
struct power_supply_desc supply_desc; /* Supply description */
struct delayed_work work; /* Work scheduler */
- unsigned long num_regs; /* Number of registers (chip type) */
+ enum ltc294x_id id; /* Chip type */
int charge; /* Last charge register content */
int r_sense; /* mOhm */
int Qlsb; /* nAh */
@@ -145,9 +149,18 @@ static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) |
LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED;
- /* Put the 2943 into "monitor" mode, so it measures every 10 sec */
- if (info->num_regs == LTC2943_NUM_REGS)
+ /* Put device into "monitor" mode */
+ switch (info->id) {
+ case LTC2942_ID: /* 2942 measures every 2 sec */
+ control |= LTC2942_REG_CONTROL_MODE_SCAN;
+ break;
+ case LTC2943_ID:
+ case LTC2944_ID: /* 2943 and 2944 measure every 10 sec */
control |= LTC2943_REG_CONTROL_MODE_SCAN;
+ break;
+ default:
+ break;
+ }
if (value != control) {
ret = ltc294x_write_regs(info->client,
@@ -252,7 +265,24 @@ static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val)
ret = ltc294x_read_regs(info->client,
LTC294X_REG_VOLTAGE_MSB, &datar[0], 2);
value = (datar[0] << 8) | datar[1];
- *val = ((value * 23600) / 0xFFFF) * 1000; /* in uV */
+ switch (info->id) {
+ case LTC2943_ID:
+ value *= 23600 * 2;
+ value /= 0xFFFF;
+ value *= 1000 / 2;
+ break;
+ case LTC2944_ID:
+ value *= 70800 / 5*4;
+ value /= 0xFFFF;
+ value *= 1000 * 5/4;
+ break;
+ default:
+ value *= 6000 * 10;
+ value /= 0xFFFF;
+ value *= 1000 / 10;
+ break;
+ }
+ *val = value;
return ret;
}
@@ -263,27 +293,38 @@ static int ltc294x_get_current(const struct ltc294x_info *info, int *val)
s32 value;
ret = ltc294x_read_regs(info->client,
- LTC294X_REG_CURRENT_MSB, &datar[0], 2);
+ LTC2943_REG_CURRENT_MSB, &datar[0], 2);
value = (datar[0] << 8) | datar[1];
value -= 0x7FFF;
+ if (info->id == LTC2944_ID)
+ value *= 64000;
+ else
+ value *= 60000;
/* Value is in range -32k..+32k, r_sense is usually 10..50 mOhm,
* the formula below keeps everything in s32 range while preserving
* enough digits */
- *val = 1000 * ((60000 * value) / (info->r_sense * 0x7FFF)); /* in uA */
+ *val = 1000 * (value / (info->r_sense * 0x7FFF)); /* in uA */
return ret;
}
static int ltc294x_get_temperature(const struct ltc294x_info *info, int *val)
{
+ enum ltc294x_reg reg;
int ret;
u8 datar[2];
u32 value;
- ret = ltc294x_read_regs(info->client,
- LTC294X_REG_TEMPERATURE_MSB, &datar[0], 2);
- value = (datar[0] << 8) | datar[1];
- /* Full-scale is 510 Kelvin, convert to centidegrees */
- *val = (((51000 * value) / 0xFFFF) - 27215);
+ if (info->id == LTC2942_ID) {
+ reg = LTC2942_REG_TEMPERATURE_MSB;
+ value = 60000; /* Full-scale is 600 Kelvin */
+ } else {
+ reg = LTC2943_REG_TEMPERATURE_MSB;
+ value = 51000; /* Full-scale is 510 Kelvin */
+ }
+ ret = ltc294x_read_regs(info->client, reg, &datar[0], 2);
+ value *= (datar[0] << 8) | datar[1];
+ /* Convert to centidegrees */
+ *val = value / 0xFFFF - 27215;
return ret;
}
@@ -357,8 +398,8 @@ static enum power_supply_property ltc294x_properties[] = {
POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_TEMP,
+ POWER_SUPPLY_PROP_CURRENT_NOW,
};
static int ltc294x_i2c_remove(struct i2c_client *client)
@@ -375,10 +416,11 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
{
struct power_supply_config psy_cfg = {};
struct ltc294x_info *info;
+ struct device_node *np;
int ret;
u32 prescaler_exp;
s32 r_sense;
- struct device_node *np;
+ u8 status;
info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL);
if (info == NULL)
@@ -388,7 +430,7 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
np = of_node_get(client->dev.of_node);
- info->num_regs = (unsigned long)of_device_get_match_data(&client->dev);
+ info->id = (enum ltc294x_id)of_device_get_match_data(&client->dev);
info->supply_desc.name = np->name;
/* r_sense can be negative, when sense+ is connected to the battery
@@ -409,7 +451,7 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
prescaler_exp = LTC2941_MAX_PRESCALER_EXP;
}
- if (info->num_regs == LTC2943_NUM_REGS) {
+ if (info->id == LTC2943_ID) {
if (prescaler_exp > LTC2943_MAX_PRESCALER_EXP)
prescaler_exp = LTC2943_MAX_PRESCALER_EXP;
info->Qlsb = ((340 * 50000) / r_sense) /
@@ -421,21 +463,39 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
(128 / (1 << prescaler_exp));
}
+ /* Read status register to check for LTC2942 */
+ if (info->id == LTC2941_ID || info->id == LTC2942_ID) {
+ ret = ltc294x_read_regs(client, LTC294X_REG_STATUS, &status, 1);
+ if (ret < 0) {
+ dev_err(&client->dev,
+ "Could not read status register\n");
+ return ret;
+ }
+ if (status & LTC2941_REG_STATUS_CHIP_ID)
+ info->id = LTC2941_ID;
+ else
+ info->id = LTC2942_ID;
+ }
+
info->client = client;
info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY;
info->supply_desc.properties = ltc294x_properties;
- if (info->num_regs >= LTC294X_REG_TEMPERATURE_LSB)
+ switch (info->id) {
+ case LTC2944_ID:
+ case LTC2943_ID:
info->supply_desc.num_properties =
ARRAY_SIZE(ltc294x_properties);
- else if (info->num_regs >= LTC294X_REG_CURRENT_LSB)
+ break;
+ case LTC2942_ID:
info->supply_desc.num_properties =
ARRAY_SIZE(ltc294x_properties) - 1;
- else if (info->num_regs >= LTC294X_REG_VOLTAGE_LSB)
- info->supply_desc.num_properties =
- ARRAY_SIZE(ltc294x_properties) - 2;
- else
+ break;
+ case LTC2941_ID:
+ default:
info->supply_desc.num_properties =
ARRAY_SIZE(ltc294x_properties) - 3;
+ break;
+ }
info->supply_desc.get_property = ltc294x_get_property;
info->supply_desc.set_property = ltc294x_set_property;
info->supply_desc.property_is_writeable = ltc294x_property_is_writeable;
@@ -492,8 +552,10 @@ static SIMPLE_DEV_PM_OPS(ltc294x_pm_ops, ltc294x_suspend, ltc294x_resume);
static const struct i2c_device_id ltc294x_i2c_id[] = {
- {"ltc2941", LTC2941_NUM_REGS},
- {"ltc2943", LTC2943_NUM_REGS},
+ { "ltc2941", LTC2941_ID, },
+ { "ltc2942", LTC2942_ID, },
+ { "ltc2943", LTC2943_ID, },
+ { "ltc2944", LTC2944_ID, },
{ },
};
MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
@@ -501,11 +563,19 @@ MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
static const struct of_device_id ltc294x_i2c_of_match[] = {
{
.compatible = "lltc,ltc2941",
- .data = (void *)LTC2941_NUM_REGS
+ .data = (void *)LTC2941_ID,
+ },
+ {
+ .compatible = "lltc,ltc2942",
+ .data = (void *)LTC2942_ID,
},
{
.compatible = "lltc,ltc2943",
- .data = (void *)LTC2943_NUM_REGS
+ .data = (void *)LTC2943_ID,
+ },
+ {
+ .compatible = "lltc,ltc2944",
+ .data = (void *)LTC2944_ID,
},
{ },
};
@@ -525,5 +595,5 @@ module_i2c_driver(ltc294x_driver);
MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems");
MODULE_AUTHOR("Mike Looijmans, Topic Embedded Products");
-MODULE_DESCRIPTION("LTC2941/LTC2943 Battery Gas Gauge IC driver");
+MODULE_DESCRIPTION("LTC2941/LTC2942/LTC2943/LTC2944 Battery Gas Gauge IC driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index aecaaa2b0586..5b556a13f517 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -22,6 +22,7 @@
* This driver is based on max17040_battery.c
*/
+#include <linux/acpi.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
@@ -982,6 +983,8 @@ static int max17042_probe(struct i2c_client *client,
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
const struct power_supply_desc *max17042_desc = &max17042_psy_desc;
struct power_supply_config psy_cfg = {};
+ const struct acpi_device_id *acpi_id = NULL;
+ struct device *dev = &client->dev;
struct max17042_chip *chip;
int ret;
int i;
@@ -995,7 +998,15 @@ static int max17042_probe(struct i2c_client *client,
return -ENOMEM;
chip->client = client;
- chip->chip_type = id->driver_data;
+ if (id) {
+ chip->chip_type = id->driver_data;
+ } else {
+ acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
+ if (!acpi_id)
+ return -ENODEV;
+
+ chip->chip_type = acpi_id->driver_data;
+ }
chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config);
if (IS_ERR(chip->regmap)) {
dev_err(&client->dev, "Failed to initialize regmap\n");
@@ -1039,11 +1050,18 @@ static int max17042_probe(struct i2c_client *client,
}
if (client->irq) {
+ unsigned int flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
+
+ /*
+ * On ACPI systems the IRQ may be handled by ACPI-event code,
+ * so we need to share (if the ACPI code is willing to share).
+ */
+ if (acpi_id)
+ flags |= IRQF_SHARED | IRQF_PROBE_SHARED;
+
ret = devm_request_threaded_irq(&client->dev, client->irq,
NULL,
- max17042_thread_handler,
- IRQF_TRIGGER_FALLING |
- IRQF_ONESHOT,
+ max17042_thread_handler, flags,
chip->battery->desc->name,
chip);
if (!ret) {
@@ -1053,10 +1071,13 @@ static int max17042_probe(struct i2c_client *client,
max17042_set_soc_threshold(chip, 1);
} else {
client->irq = 0;
- dev_err(&client->dev, "%s(): cannot get IRQ\n",
- __func__);
+ if (ret != -EBUSY)
+ dev_err(&client->dev, "Failed to get IRQ\n");
}
}
+ /* Not able to update the charge threshold when exceeded? -> disable */
+ if (!client->irq)
+ regmap_write(chip->regmap, MAX17042_SALRT_Th, 0xff00);
regmap_read(chip->regmap, MAX17042_STATUS, &val);
if (val & STATUS_POR_BIT) {
@@ -1104,6 +1125,14 @@ static int max17042_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(max17042_pm_ops, max17042_suspend,
max17042_resume);
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id max17042_acpi_match[] = {
+ { "MAX17047", MAXIM_DEVICE_TYPE_MAX17047 },
+ { }
+};
+MODULE_DEVICE_TABLE(acpi, max17042_acpi_match);
+#endif
+
#ifdef CONFIG_OF
static const struct of_device_id max17042_dt_match[] = {
{ .compatible = "maxim,max17042" },
@@ -1125,6 +1154,7 @@ MODULE_DEVICE_TABLE(i2c, max17042_id);
static struct i2c_driver max17042_i2c_driver = {
.driver = {
.name = "max17042",
+ .acpi_match_table = ACPI_PTR(max17042_acpi_match),
.of_match_table = of_match_ptr(max17042_dt_match),
.pm = &max17042_pm_ops,
},
diff --git a/drivers/power/supply/max1721x_battery.c b/drivers/power/supply/max1721x_battery.c
new file mode 100644
index 000000000000..9ee601a03d9b
--- /dev/null
+++ b/drivers/power/supply/max1721x_battery.c
@@ -0,0 +1,448 @@
+/*
+ * 1-Wire implementation for Maxim Semiconductor
+ * MAX7211/MAX17215 stanalone fuel gauge chip
+ *
+ * Copyright (C) 2017 Radioavionica Corporation
+ * Author: Alex A. Mihaylov <[email protected]>
+ *
+ * Use consistent with the GNU GPL is permitted,
+ * provided that this copyright notice is
+ * preserved in its entirety in all copies and derived works.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/w1.h>
+#include <linux/regmap.h>
+#include <linux/power_supply.h>
+
+#define W1_MAX1721X_FAMILY_ID 0x26
+#define DEF_DEV_NAME_MAX17211 "MAX17211"
+#define DEF_DEV_NAME_MAX17215 "MAX17215"
+#define DEF_DEV_NAME_UNKNOWN "UNKNOWN"
+#define DEF_MFG_NAME "MAXIM"
+
+#define PSY_MAX_NAME_LEN 32
+
+/* Number of valid register addresses in W1 mode */
+#define MAX1721X_MAX_REG_NR 0x1EF
+
+/* Factory settings (nonvilatile registers) (W1 specific) */
+#define MAX1721X_REG_NRSENSE 0x1CF /* RSense in 10^-5 Ohm */
+/* Strings */
+#define MAX1721X_REG_MFG_STR 0x1CC
+#define MAX1721X_REG_MFG_NUMB 3
+#define MAX1721X_REG_DEV_STR 0x1DB
+#define MAX1721X_REG_DEV_NUMB 5
+/* HEX Strings */
+#define MAX1721X_REG_SER_HEX 0x1D8
+
+/* MAX172XX Output Registers for W1 chips */
+#define MAX172XX_REG_STATUS 0x000 /* status reg */
+#define MAX172XX_BAT_PRESENT (1<<4) /* battery connected bit */
+#define MAX172XX_REG_DEVNAME 0x021 /* chip config */
+#define MAX172XX_DEV_MASK 0x000F /* chip type mask */
+#define MAX172X1_DEV 0x0001
+#define MAX172X5_DEV 0x0005
+#define MAX172XX_REG_TEMP 0x008 /* Temperature */
+#define MAX172XX_REG_BATT 0x0DA /* Battery voltage */
+#define MAX172XX_REG_CURRENT 0x00A /* Actual current */
+#define MAX172XX_REG_AVGCURRENT 0x00B /* Average current */
+#define MAX172XX_REG_REPSOC 0x006 /* Percentage of charge */
+#define MAX172XX_REG_DESIGNCAP 0x018 /* Design capacity */
+#define MAX172XX_REG_REPCAP 0x005 /* Average capacity */
+#define MAX172XX_REG_TTE 0x011 /* Time to empty */
+#define MAX172XX_REG_TTF 0x020 /* Time to full */
+
+struct max17211_device_info {
+ char name[PSY_MAX_NAME_LEN];
+ struct power_supply *bat;
+ struct power_supply_desc bat_desc;
+ struct device *w1_dev;
+ struct regmap *regmap;
+ /* battery design format */
+ unsigned int rsense; /* in tenths uOhm */
+ char DeviceName[2 * MAX1721X_REG_DEV_NUMB + 1];
+ char ManufacturerName[2 * MAX1721X_REG_MFG_NUMB + 1];
+ char SerialNumber[13]; /* see get_sn_str() later for comment */
+};
+
+/* Convert regs value to power_supply units */
+
+static inline int max172xx_time_to_ps(unsigned int reg)
+{
+ return reg * 5625 / 1000; /* in sec. */
+}
+
+static inline int max172xx_percent_to_ps(unsigned int reg)
+{
+ return reg / 256; /* in percent from 0 to 100 */
+}
+
+static inline int max172xx_voltage_to_ps(unsigned int reg)
+{
+ return reg * 1250; /* in uV */
+}
+
+static inline int max172xx_capacity_to_ps(unsigned int reg)
+{
+ return reg * 500; /* in uAh */
+}
+
+/*
+ * Current and temperature is signed values, so unsigned regs
+ * value must be converted to signed type
+ */
+
+static inline int max172xx_temperature_to_ps(unsigned int reg)
+{
+ int val = (int16_t)(reg);
+
+ return val * 10 / 256; /* in tenths of deg. C */
+}
+
+/*
+ * Calculating current registers resolution:
+ *
+ * RSense stored in 10^-5 Ohm, so mesaurment voltage must be
+ * in 10^-11 Volts for get current in uA.
+ * 16 bit current reg fullscale +/-51.2mV is 102400 uV.
+ * So: 102400 / 65535 * 10^5 = 156252
+ */
+static inline int max172xx_current_to_voltage(unsigned int reg)
+{
+ int val = (int16_t)(reg);
+
+ return val * 156252;
+}
+
+
+static inline struct max17211_device_info *
+to_device_info(struct power_supply *psy)
+{
+ return power_supply_get_drvdata(psy);
+}
+
+static int max1721x_battery_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct max17211_device_info *info = to_device_info(psy);
+ unsigned int reg = 0;
+ int ret = 0;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_PRESENT:
+ /*
+ * POWER_SUPPLY_PROP_PRESENT will always readable via
+ * sysfs interface. Value return 0 if battery not
+ * present or unaccesable via W1.
+ */
+ val->intval =
+ regmap_read(info->regmap, MAX172XX_REG_STATUS,
+ &reg) ? 0 : !(reg & MAX172XX_BAT_PRESENT);
+ break;
+ case POWER_SUPPLY_PROP_CAPACITY:
+ ret = regmap_read(info->regmap, MAX172XX_REG_REPSOC, &reg);
+ val->intval = max172xx_percent_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
+ ret = regmap_read(info->regmap, MAX172XX_REG_BATT, &reg);
+ val->intval = max172xx_voltage_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
+ ret = regmap_read(info->regmap, MAX172XX_REG_DESIGNCAP, &reg);
+ val->intval = max172xx_capacity_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_CHARGE_AVG:
+ ret = regmap_read(info->regmap, MAX172XX_REG_REPCAP, &reg);
+ val->intval = max172xx_capacity_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
+ ret = regmap_read(info->regmap, MAX172XX_REG_TTE, &reg);
+ val->intval = max172xx_time_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG:
+ ret = regmap_read(info->regmap, MAX172XX_REG_TTF, &reg);
+ val->intval = max172xx_time_to_ps(reg);
+ break;
+ case POWER_SUPPLY_PROP_TEMP:
+ ret = regmap_read(info->regmap, MAX172XX_REG_TEMP, &reg);
+ val->intval = max172xx_temperature_to_ps(reg);
+ break;
+ /* We need signed current, so must cast info->rsense to signed type */
+ case POWER_SUPPLY_PROP_CURRENT_NOW:
+ ret = regmap_read(info->regmap, MAX172XX_REG_CURRENT, &reg);
+ val->intval =
+ max172xx_current_to_voltage(reg) / (int)info->rsense;
+ break;
+ case POWER_SUPPLY_PROP_CURRENT_AVG:
+ ret = regmap_read(info->regmap, MAX172XX_REG_AVGCURRENT, &reg);
+ val->intval =
+ max172xx_current_to_voltage(reg) / (int)info->rsense;
+ break;
+ /*
+ * Strings already received and inited by probe.
+ * We do dummy read for check battery still available.
+ */
+ case POWER_SUPPLY_PROP_MODEL_NAME:
+ ret = regmap_read(info->regmap, MAX1721X_REG_DEV_STR, &reg);
+ val->strval = info->DeviceName;
+ break;
+ case POWER_SUPPLY_PROP_MANUFACTURER:
+ ret = regmap_read(info->regmap, MAX1721X_REG_MFG_STR, &reg);
+ val->strval = info->ManufacturerName;
+ break;
+ case POWER_SUPPLY_PROP_SERIAL_NUMBER:
+ ret = regmap_read(info->regmap, MAX1721X_REG_SER_HEX, &reg);
+ val->strval = info->SerialNumber;
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static enum power_supply_property max1721x_battery_props[] = {
+ /* int */
+ POWER_SUPPLY_PROP_PRESENT,
+ POWER_SUPPLY_PROP_CAPACITY,
+ POWER_SUPPLY_PROP_VOLTAGE_NOW,
+ POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
+ POWER_SUPPLY_PROP_CHARGE_AVG,
+ POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
+ POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,
+ POWER_SUPPLY_PROP_TEMP,
+ POWER_SUPPLY_PROP_CURRENT_NOW,
+ POWER_SUPPLY_PROP_CURRENT_AVG,
+ /* strings */
+ POWER_SUPPLY_PROP_MODEL_NAME,
+ POWER_SUPPLY_PROP_MANUFACTURER,
+ POWER_SUPPLY_PROP_SERIAL_NUMBER,
+};
+
+static int get_string(struct max17211_device_info *info,
+ uint16_t reg, uint8_t nr, char *str)
+{
+ unsigned int val;
+
+ if (!str || !(reg == MAX1721X_REG_MFG_STR ||
+ reg == MAX1721X_REG_DEV_STR))
+ return -EFAULT;
+
+ while (nr--) {
+ if (regmap_read(info->regmap, reg++, &val))
+ return -EFAULT;
+ *str++ = val>>8 & 0x00FF;
+ *str++ = val & 0x00FF;
+ }
+ return 0;
+}
+
+/* Maxim say: Serial number is a hex string up to 12 hex characters */
+static int get_sn_string(struct max17211_device_info *info, char *str)
+{
+ unsigned int val[3];
+
+ if (!str)
+ return -EFAULT;
+
+ if (regmap_read(info->regmap, MAX1721X_REG_SER_HEX, &val[0]))
+ return -EFAULT;
+ if (regmap_read(info->regmap, MAX1721X_REG_SER_HEX + 1, &val[1]))
+ return -EFAULT;
+ if (regmap_read(info->regmap, MAX1721X_REG_SER_HEX + 2, &val[2]))
+ return -EFAULT;
+
+ snprintf(str, 13, "%04X%04X%04X", val[0], val[1], val[2]);
+ return 0;
+}
+
+/*
+ * MAX1721x registers description for w1-regmap
+ */
+static const struct regmap_range max1721x_allow_range[] = {
+ regmap_reg_range(0, 0xDF), /* volatile data */
+ regmap_reg_range(0x180, 0x1DF), /* non-volatile memory */
+ regmap_reg_range(0x1E0, 0x1EF), /* non-volatile history (unused) */
+};
+
+static const struct regmap_range max1721x_deny_range[] = {
+ /* volatile data unused registers */
+ regmap_reg_range(0x24, 0x26),
+ regmap_reg_range(0x30, 0x31),
+ regmap_reg_range(0x33, 0x34),
+ regmap_reg_range(0x37, 0x37),
+ regmap_reg_range(0x3B, 0x3C),
+ regmap_reg_range(0x40, 0x41),
+ regmap_reg_range(0x43, 0x44),
+ regmap_reg_range(0x47, 0x49),
+ regmap_reg_range(0x4B, 0x4C),
+ regmap_reg_range(0x4E, 0xAF),
+ regmap_reg_range(0xB1, 0xB3),
+ regmap_reg_range(0xB5, 0xB7),
+ regmap_reg_range(0xBF, 0xD0),
+ regmap_reg_range(0xDB, 0xDB),
+ /* hole between volatile and non-volatile registers */
+ regmap_reg_range(0xE0, 0x17F),
+};
+
+static const struct regmap_access_table max1721x_regs = {
+ .yes_ranges = max1721x_allow_range,
+ .n_yes_ranges = ARRAY_SIZE(max1721x_allow_range),
+ .no_ranges = max1721x_deny_range,
+ .n_no_ranges = ARRAY_SIZE(max1721x_deny_range),
+};
+
+/*
+ * Model Gauge M5 Algorithm output register
+ * Volatile data (must not be cached)
+ */
+static const struct regmap_range max1721x_volatile_allow[] = {
+ regmap_reg_range(0, 0xDF),
+};
+
+static const struct regmap_access_table max1721x_volatile_regs = {
+ .yes_ranges = max1721x_volatile_allow,
+ .n_yes_ranges = ARRAY_SIZE(max1721x_volatile_allow),
+};
+
+/*
+ * W1-regmap config
+ */
+static const struct regmap_config max1721x_regmap_w1_config = {
+ .reg_bits = 16,
+ .val_bits = 16,
+ .rd_table = &max1721x_regs,
+ .volatile_table = &max1721x_volatile_regs,
+ .max_register = MAX1721X_MAX_REG_NR,
+};
+
+static int devm_w1_max1721x_add_device(struct w1_slave *sl)
+{
+ struct power_supply_config psy_cfg = {};
+ struct max17211_device_info *info;
+
+ info = devm_kzalloc(&sl->dev, sizeof(*info), GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ sl->family_data = (void *)info;
+ info->w1_dev = &sl->dev;
+
+ /*
+ * power_supply class battery name translated from W1 slave device
+ * unical ID (look like 26-0123456789AB) to "max1721x-0123456789AB\0"
+ * so, 26 (device family) correcpondent to max1721x devices.
+ * Device name still unical for any numbers connected devices.
+ */
+ snprintf(info->name, sizeof(info->name),
+ "max1721x-%012X", (unsigned int)sl->reg_num.id);
+ info->bat_desc.name = info->name;
+
+ /*
+ * FixMe: battery device name exceed max len for thermal_zone device
+ * name and translation to thermal_zone must be disabled.
+ */
+ info->bat_desc.no_thermal = true;
+ info->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY;
+ info->bat_desc.properties = max1721x_battery_props;
+ info->bat_desc.num_properties = ARRAY_SIZE(max1721x_battery_props);
+ info->bat_desc.get_property = max1721x_battery_get_property;
+ psy_cfg.drv_data = info;
+
+ /* regmap init */
+ info->regmap = devm_regmap_init_w1(info->w1_dev,
+ &max1721x_regmap_w1_config);
+ if (IS_ERR(info->regmap)) {
+ int err = PTR_ERR(info->regmap);
+
+ dev_err(info->w1_dev, "Failed to allocate register map: %d\n",
+ err);
+ return err;
+ }
+
+ /* rsense init */
+ info->rsense = 0;
+ if (regmap_read(info->regmap, MAX1721X_REG_NRSENSE, &info->rsense)) {
+ dev_err(info->w1_dev, "Can't read RSense. Hardware error.\n");
+ return -ENODEV;
+ }
+
+ if (!info->rsense) {
+ dev_warn(info->w1_dev, "RSenese not calibrated, set 10 mOhms!\n");
+ info->rsense = 1000; /* in regs in 10^-5 */
+ }
+ dev_info(info->w1_dev, "RSense: %d mOhms.\n", info->rsense / 100);
+
+ if (get_string(info, MAX1721X_REG_MFG_STR,
+ MAX1721X_REG_MFG_NUMB, info->ManufacturerName)) {
+ dev_err(info->w1_dev, "Can't read manufacturer. Hardware error.\n");
+ return -ENODEV;
+ }
+
+ if (!info->ManufacturerName[0])
+ strncpy(info->ManufacturerName, DEF_MFG_NAME,
+ 2 * MAX1721X_REG_MFG_NUMB);
+
+ if (get_string(info, MAX1721X_REG_DEV_STR,
+ MAX1721X_REG_DEV_NUMB, info->DeviceName)) {
+ dev_err(info->w1_dev, "Can't read device. Hardware error.\n");
+ return -ENODEV;
+ }
+ if (!info->DeviceName[0]) {
+ unsigned int dev_name;
+
+ if (regmap_read(info->regmap,
+ MAX172XX_REG_DEVNAME, &dev_name)) {
+ dev_err(info->w1_dev, "Can't read device name reg.\n");
+ return -ENODEV;
+ }
+
+ switch (dev_name & MAX172XX_DEV_MASK) {
+ case MAX172X1_DEV:
+ strncpy(info->DeviceName, DEF_DEV_NAME_MAX17211,
+ 2 * MAX1721X_REG_DEV_NUMB);
+ break;
+ case MAX172X5_DEV:
+ strncpy(info->DeviceName, DEF_DEV_NAME_MAX17215,
+ 2 * MAX1721X_REG_DEV_NUMB);
+ break;
+ default:
+ strncpy(info->DeviceName, DEF_DEV_NAME_UNKNOWN,
+ 2 * MAX1721X_REG_DEV_NUMB);
+ }
+ }
+
+ if (get_sn_string(info, info->SerialNumber)) {
+ dev_err(info->w1_dev, "Can't read serial. Hardware error.\n");
+ return -ENODEV;
+ }
+
+ info->bat = devm_power_supply_register(&sl->dev, &info->bat_desc,
+ &psy_cfg);
+ if (IS_ERR(info->bat)) {
+ dev_err(info->w1_dev, "failed to register battery\n");
+ return PTR_ERR(info->bat);
+ }
+
+ return 0;
+}
+
+static struct w1_family_ops w1_max1721x_fops = {
+ .add_slave = devm_w1_max1721x_add_device,
+};
+
+static struct w1_family w1_max1721x_family = {
+ .fid = W1_MAX1721X_FAMILY_ID,
+ .fops = &w1_max1721x_fops,
+};
+
+module_w1_family(w1_max1721x_family);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Alex A. Mihaylov <[email protected]>");
+MODULE_DESCRIPTION("Maxim MAX17211/MAX17215 Fuel Gauage IC driver");
+MODULE_ALIAS("w1-family-" __stringify(W1_MAX1721X_FAMILY_ID));
diff --git a/drivers/power/supply/olpc_battery.c b/drivers/power/supply/olpc_battery.c
index 9e29b1321648..3bc2eea7b3b7 100644
--- a/drivers/power/supply/olpc_battery.c
+++ b/drivers/power/supply/olpc_battery.c
@@ -535,7 +535,7 @@ static ssize_t olpc_bat_eeprom_read(struct file *filp, struct kobject *kobj,
return count;
}
-static struct bin_attribute olpc_bat_eeprom = {
+static const struct bin_attribute olpc_bat_eeprom = {
.attr = {
.name = "eeprom",
.mode = S_IRUGO,
@@ -559,7 +559,7 @@ static ssize_t olpc_bat_error_read(struct device *dev,
return sprintf(buf, "%d\n", ec_byte);
}
-static struct device_attribute olpc_bat_error = {
+static const struct device_attribute olpc_bat_error = {
.attr = {
.name = "error",
.mode = S_IRUGO,
diff --git a/drivers/power/supply/pcf50633-charger.c b/drivers/power/supply/pcf50633-charger.c
index b3c1873ad84d..1ad7ccce6075 100644
--- a/drivers/power/supply/pcf50633-charger.c
+++ b/drivers/power/supply/pcf50633-charger.c
@@ -254,7 +254,7 @@ static struct attribute *pcf50633_mbc_sysfs_entries[] = {
NULL,
};
-static struct attribute_group mbc_attr_group = {
+static const struct attribute_group mbc_attr_group = {
.name = NULL, /* put in device directory */
.attrs = pcf50633_mbc_sysfs_entries,
};
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index 540d3e0aa011..02c6340ae36f 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -259,18 +259,14 @@ static int power_supply_check_supplies(struct power_supply *psy)
/* All supplies found, allocate char ** array for filling */
psy->supplied_from = devm_kzalloc(&psy->dev, sizeof(psy->supplied_from),
GFP_KERNEL);
- if (!psy->supplied_from) {
- dev_err(&psy->dev, "Couldn't allocate memory for supply list\n");
+ if (!psy->supplied_from)
return -ENOMEM;
- }
*psy->supplied_from = devm_kzalloc(&psy->dev,
sizeof(char *) * (cnt - 1),
GFP_KERNEL);
- if (!*psy->supplied_from) {
- dev_err(&psy->dev, "Couldn't allocate memory for supply list\n");
+ if (!*psy->supplied_from)
return -ENOMEM;
- }
return power_supply_populate_supplied_from(psy);
}
@@ -314,11 +310,12 @@ static int __power_supply_am_i_supplied(struct device *dev, void *_data)
struct power_supply *epsy = dev_get_drvdata(dev);
struct psy_am_i_supplied_data *data = _data;
- data->count++;
- if (__power_supply_is_supplied_by(epsy, data->psy))
+ if (__power_supply_is_supplied_by(epsy, data->psy)) {
+ data->count++;
if (!epsy->desc->get_property(epsy, POWER_SUPPLY_PROP_ONLINE,
&ret))
return ret.intval;
+ }
return 0;
}
@@ -374,6 +371,47 @@ int power_supply_is_system_supplied(void)
}
EXPORT_SYMBOL_GPL(power_supply_is_system_supplied);
+static int __power_supply_get_supplier_max_current(struct device *dev,
+ void *data)
+{
+ union power_supply_propval ret = {0,};
+ struct power_supply *epsy = dev_get_drvdata(dev);
+ struct power_supply *psy = data;
+
+ if (__power_supply_is_supplied_by(epsy, psy))
+ if (!epsy->desc->get_property(epsy,
+ POWER_SUPPLY_PROP_CURRENT_MAX,
+ &ret))
+ return ret.intval;
+
+ return 0;
+}
+
+int power_supply_set_input_current_limit_from_supplier(struct power_supply *psy)
+{
+ union power_supply_propval val = {0,};
+ int curr;
+
+ if (!psy->desc->set_property)
+ return -EINVAL;
+
+ /*
+ * This function is not intended for use with a supply with multiple
+ * suppliers, we simply pick the first supply to report a non 0
+ * max-current.
+ */
+ curr = class_for_each_device(power_supply_class, NULL, psy,
+ __power_supply_get_supplier_max_current);
+ if (curr <= 0)
+ return (curr == 0) ? -ENODEV : curr;
+
+ val.intval = curr;
+
+ return psy->desc->set_property(psy,
+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &val);
+}
+EXPORT_SYMBOL_GPL(power_supply_set_input_current_limit_from_supplier);
+
int power_supply_set_battery_charged(struct power_supply *psy)
{
if (atomic_read(&psy->use_cnt) >= 0 &&
diff --git a/drivers/power/supply/sbs-battery.c b/drivers/power/supply/sbs-battery.c
index f7059459f0fb..b19a73176910 100644
--- a/drivers/power/supply/sbs-battery.c
+++ b/drivers/power/supply/sbs-battery.c
@@ -12,25 +12,21 @@
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
+#include <linux/delay.h>
#include <linux/err.h>
-#include <linux/power_supply.h>
+#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
-#include <linux/slab.h>
+#include <linux/init.h>
#include <linux/interrupt.h>
-#include <linux/gpio/consumer.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
#include <linux/of.h>
-#include <linux/stat.h>
-
#include <linux/power/sbs-battery.h>
+#include <linux/power_supply.h>
+#include <linux/slab.h>
+#include <linux/stat.h>
enum {
REG_MANUFACTURER_DATA,
@@ -60,8 +56,8 @@ enum {
#define BATTERY_MODE_OFFSET 0x03
#define BATTERY_MODE_MASK 0x8000
enum sbs_battery_mode {
- BATTERY_MODE_AMPS,
- BATTERY_MODE_WATTS
+ BATTERY_MODE_AMPS = 0,
+ BATTERY_MODE_WATTS = 0x8000
};
/* manufacturer access defines */
@@ -532,6 +528,8 @@ static enum sbs_battery_mode sbs_set_battery_mode(struct i2c_client *client,
if (ret < 0)
return ret;
+ usleep_range(1000, 2000);
+
return original_val & BATTERY_MODE_MASK;
}
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index 7cb982b54c8c..763ee50ea57d 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -300,7 +300,7 @@ config PWM_MEDIATEK
Generic PWM framework driver for Mediatek ARM SoC.
To compile this driver as a module, choose M here: the module
- will be called pwm-mxs.
+ will be called pwm-mediatek.
config PWM_MXS
tristate "Freescale MXS PWM support"
@@ -456,7 +456,7 @@ config PWM_TEGRA
config PWM_TIECAP
tristate "ECAP PWM support"
- depends on ARCH_OMAP2PLUS || ARCH_DAVINCI_DA8XX
+ depends on ARCH_OMAP2PLUS || ARCH_DAVINCI_DA8XX || ARCH_KEYSTONE
help
PWM driver support for the ECAP APWM controller found on AM33XX
TI SOC
@@ -510,4 +510,13 @@ config PWM_VT8500
To compile this driver as a module, choose M here: the module
will be called pwm-vt8500.
+config PWM_ZX
+ tristate "ZTE ZX PWM support"
+ depends on ARCH_ZX
+ help
+ Generic PWM framework driver for ZTE ZX family SoCs.
+
+ To compile this driver as a module, choose M here: the module
+ will be called pwm-zx.
+
endif
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index a3a4beef6daa..ebefba5f528b 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -50,3 +50,4 @@ obj-$(CONFIG_PWM_TIPWMSS) += pwm-tipwmss.o
obj-$(CONFIG_PWM_TWL) += pwm-twl.o
obj-$(CONFIG_PWM_TWL_LED) += pwm-twl-led.o
obj-$(CONFIG_PWM_VT8500) += pwm-vt8500.o
+obj-$(CONFIG_PWM_ZX) += pwm-zx.o
diff --git a/drivers/pwm/pwm-bcm2835.c b/drivers/pwm/pwm-bcm2835.c
index c5dbf16d810b..db001cba937f 100644
--- a/drivers/pwm/pwm-bcm2835.c
+++ b/drivers/pwm/pwm-bcm2835.c
@@ -167,6 +167,8 @@ static int bcm2835_pwm_probe(struct platform_device *pdev)
pc->chip.dev = &pdev->dev;
pc->chip.ops = &bcm2835_pwm_ops;
pc->chip.npwm = 2;
+ pc->chip.of_xlate = of_pwm_xlate_with_flags;
+ pc->chip.of_pwm_n_cells = 3;
platform_set_drvdata(pdev, pc);
diff --git a/drivers/pwm/pwm-hibvt.c b/drivers/pwm/pwm-hibvt.c
index 8dadc58d6cdf..27c107e78d59 100644
--- a/drivers/pwm/pwm-hibvt.c
+++ b/drivers/pwm/pwm-hibvt.c
@@ -208,7 +208,7 @@ static int hibvt_pwm_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
- pwm_chip->rstc = devm_reset_control_get(&pdev->dev, NULL);
+ pwm_chip->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
if (IS_ERR(pwm_chip->rstc)) {
clk_disable_unprepare(pwm_chip->clk);
return PTR_ERR(pwm_chip->rstc);
diff --git a/drivers/pwm/pwm-mediatek.c b/drivers/pwm/pwm-mediatek.c
index 5c11bc708a3c..b52f3afb2ba1 100644
--- a/drivers/pwm/pwm-mediatek.c
+++ b/drivers/pwm/pwm-mediatek.c
@@ -2,6 +2,7 @@
* Mediatek Pulse Width Modulator driver
*
* Copyright (C) 2015 John Crispin <[email protected]>
+ * Copyright (C) 2017 Zhi Mao <[email protected]>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
@@ -29,6 +30,8 @@
#define PWMDWIDTH 0x2c
#define PWMTHRES 0x30
+#define PWM_CLK_DIV_MAX 7
+
enum {
MTK_CLK_MAIN = 0,
MTK_CLK_TOP,
@@ -61,6 +64,42 @@ static inline struct mtk_pwm_chip *to_mtk_pwm_chip(struct pwm_chip *chip)
return container_of(chip, struct mtk_pwm_chip, chip);
}
+static int mtk_pwm_clk_enable(struct pwm_chip *chip, struct pwm_device *pwm)
+{
+ struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip);
+ int ret;
+
+ ret = clk_prepare_enable(pc->clks[MTK_CLK_TOP]);
+ if (ret < 0)
+ return ret;
+
+ ret = clk_prepare_enable(pc->clks[MTK_CLK_MAIN]);
+ if (ret < 0)
+ goto disable_clk_top;
+
+ ret = clk_prepare_enable(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]);
+ if (ret < 0)
+ goto disable_clk_main;
+
+ return 0;
+
+disable_clk_main:
+ clk_disable_unprepare(pc->clks[MTK_CLK_MAIN]);
+disable_clk_top:
+ clk_disable_unprepare(pc->clks[MTK_CLK_TOP]);
+
+ return ret;
+}
+
+static void mtk_pwm_clk_disable(struct pwm_chip *chip, struct pwm_device *pwm)
+{
+ struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip);
+
+ clk_disable_unprepare(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]);
+ clk_disable_unprepare(pc->clks[MTK_CLK_MAIN]);
+ clk_disable_unprepare(pc->clks[MTK_CLK_TOP]);
+}
+
static inline u32 mtk_pwm_readl(struct mtk_pwm_chip *chip, unsigned int num,
unsigned int offset)
{
@@ -80,6 +119,11 @@ static int mtk_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip);
struct clk *clk = pc->clks[MTK_CLK_PWM1 + pwm->hwpwm];
u32 resolution, clkdiv = 0;
+ int ret;
+
+ ret = mtk_pwm_clk_enable(chip, pwm);
+ if (ret < 0)
+ return ret;
resolution = NSEC_PER_SEC / clk_get_rate(clk);
@@ -88,13 +132,18 @@ static int mtk_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
clkdiv++;
}
- if (clkdiv > 7)
+ if (clkdiv > PWM_CLK_DIV_MAX) {
+ mtk_pwm_clk_disable(chip, pwm);
+ dev_err(chip->dev, "period %d not supported\n", period_ns);
return -EINVAL;
+ }
- mtk_pwm_writel(pc, pwm->hwpwm, PWMCON, BIT(15) | BIT(3) | clkdiv);
+ mtk_pwm_writel(pc, pwm->hwpwm, PWMCON, BIT(15) | clkdiv);
mtk_pwm_writel(pc, pwm->hwpwm, PWMDWIDTH, period_ns / resolution);
mtk_pwm_writel(pc, pwm->hwpwm, PWMTHRES, duty_ns / resolution);
+ mtk_pwm_clk_disable(chip, pwm);
+
return 0;
}
@@ -104,7 +153,7 @@ static int mtk_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
u32 value;
int ret;
- ret = clk_prepare(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]);
+ ret = mtk_pwm_clk_enable(chip, pwm);
if (ret < 0)
return ret;
@@ -124,7 +173,7 @@ static void mtk_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
value &= ~BIT(pwm->hwpwm);
writel(value, pc->regs);
- clk_unprepare(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]);
+ mtk_pwm_clk_disable(chip, pwm);
}
static const struct pwm_ops mtk_pwm_ops = {
@@ -156,14 +205,6 @@ static int mtk_pwm_probe(struct platform_device *pdev)
return PTR_ERR(pc->clks[i]);
}
- ret = clk_prepare(pc->clks[MTK_CLK_TOP]);
- if (ret < 0)
- return ret;
-
- ret = clk_prepare(pc->clks[MTK_CLK_MAIN]);
- if (ret < 0)
- goto disable_clk_top;
-
platform_set_drvdata(pdev, pc);
pc->chip.dev = &pdev->dev;
@@ -174,26 +215,15 @@ static int mtk_pwm_probe(struct platform_device *pdev)
ret = pwmchip_add(&pc->chip);
if (ret < 0) {
dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
- goto disable_clk_main;
+ return ret;
}
return 0;
-
-disable_clk_main:
- clk_unprepare(pc->clks[MTK_CLK_MAIN]);
-disable_clk_top:
- clk_unprepare(pc->clks[MTK_CLK_TOP]);
-
- return ret;
}
static int mtk_pwm_remove(struct platform_device *pdev)
{
struct mtk_pwm_chip *pc = platform_get_drvdata(pdev);
- unsigned int i;
-
- for (i = 0; i < pc->chip.npwm; i++)
- pwm_disable(&pc->chip.pwms[i]);
return pwmchip_remove(&pc->chip);
}
diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c
index cb845edfe2b4..d589331d1884 100644
--- a/drivers/pwm/pwm-meson.c
+++ b/drivers/pwm/pwm-meson.c
@@ -441,7 +441,7 @@ static int meson_pwm_init_channels(struct meson_pwm *meson,
for (i = 0; i < meson->chip.npwm; i++) {
struct meson_pwm_channel *channel = &channels[i];
- snprintf(name, sizeof(name), "%s#mux%u", np->full_name, i);
+ snprintf(name, sizeof(name), "%pOF#mux%u", np, i);
init.name = name;
init.ops = &clk_mux_ops;
diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c
index 5f55cfab9b1c..a7eaf962a95b 100644
--- a/drivers/pwm/pwm-pca9685.c
+++ b/drivers/pwm/pwm-pca9685.c
@@ -241,11 +241,11 @@ static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca)
}
#endif
-static void pca9685_set_sleep_mode(struct pca9685 *pca, int sleep)
+static void pca9685_set_sleep_mode(struct pca9685 *pca, bool enable)
{
regmap_update_bits(pca->regmap, PCA9685_MODE1,
- MODE1_SLEEP, sleep ? MODE1_SLEEP : 0);
- if (!sleep) {
+ MODE1_SLEEP, enable ? MODE1_SLEEP : 0);
+ if (!enable) {
/* Wait 500us for the oscillator to be back up */
udelay(500);
}
@@ -272,13 +272,13 @@ static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
* state is guaranteed active here.
*/
/* Put chip into sleep mode */
- pca9685_set_sleep_mode(pca, 1);
+ pca9685_set_sleep_mode(pca, true);
/* Change the chip-wide output frequency */
regmap_write(pca->regmap, PCA9685_PRESCALE, prescale);
/* Wake the chip up */
- pca9685_set_sleep_mode(pca, 0);
+ pca9685_set_sleep_mode(pca, false);
pca->period_ns = period_ns;
} else {
@@ -534,7 +534,7 @@ static int pca9685_pwm_runtime_suspend(struct device *dev)
struct i2c_client *client = to_i2c_client(dev);
struct pca9685 *pca = i2c_get_clientdata(client);
- pca9685_set_sleep_mode(pca, 1);
+ pca9685_set_sleep_mode(pca, true);
return 0;
}
@@ -543,7 +543,7 @@ static int pca9685_pwm_runtime_resume(struct device *dev)
struct i2c_client *client = to_i2c_client(dev);
struct pca9685 *pca = i2c_get_clientdata(client);
- pca9685_set_sleep_mode(pca, 0);
+ pca9685_set_sleep_mode(pca, false);
return 0;
}
#endif
diff --git a/drivers/pwm/pwm-renesas-tpu.c b/drivers/pwm/pwm-renesas-tpu.c
index 075c1a764ba2..29267d12fb4c 100644
--- a/drivers/pwm/pwm-renesas-tpu.c
+++ b/drivers/pwm/pwm-renesas-tpu.c
@@ -455,7 +455,6 @@ static const struct of_device_id tpu_of_table[] = {
{ .compatible = "renesas,tpu-r8a73a4", },
{ .compatible = "renesas,tpu-r8a7740", },
{ .compatible = "renesas,tpu-r8a7790", },
- { .compatible = "renesas,tpu-sh7372", },
{ .compatible = "renesas,tpu", },
{ },
};
diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c
index 744d56197286..4d99d468df09 100644
--- a/drivers/pwm/pwm-rockchip.c
+++ b/drivers/pwm/pwm-rockchip.c
@@ -27,12 +27,15 @@
#define PWM_DUTY_NEGATIVE (0 << 3)
#define PWM_INACTIVE_NEGATIVE (0 << 4)
#define PWM_INACTIVE_POSITIVE (1 << 4)
+#define PWM_POLARITY_MASK (PWM_DUTY_POSITIVE | PWM_INACTIVE_POSITIVE)
#define PWM_OUTPUT_LEFT (0 << 5)
+#define PWM_LOCK_EN (1 << 6)
#define PWM_LP_DISABLE (0 << 8)
struct rockchip_pwm_chip {
struct pwm_chip chip;
struct clk *clk;
+ struct clk *pclk;
const struct rockchip_pwm_data *data;
void __iomem *base;
};
@@ -48,13 +51,8 @@ struct rockchip_pwm_data {
struct rockchip_pwm_regs regs;
unsigned int prescaler;
bool supports_polarity;
- const struct pwm_ops *ops;
-
- void (*set_enable)(struct pwm_chip *chip,
- struct pwm_device *pwm, bool enable,
- enum pwm_polarity polarity);
- void (*get_state)(struct pwm_chip *chip, struct pwm_device *pwm,
- struct pwm_state *state);
+ bool supports_lock;
+ u32 enable_conf;
};
static inline struct rockchip_pwm_chip *to_rockchip_pwm_chip(struct pwm_chip *c)
@@ -62,90 +60,18 @@ static inline struct rockchip_pwm_chip *to_rockchip_pwm_chip(struct pwm_chip *c)
return container_of(c, struct rockchip_pwm_chip, chip);
}
-static void rockchip_pwm_set_enable_v1(struct pwm_chip *chip,
- struct pwm_device *pwm, bool enable,
- enum pwm_polarity polarity)
-{
- struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
- u32 enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN;
- u32 val;
-
- val = readl_relaxed(pc->base + pc->data->regs.ctrl);
-
- if (enable)
- val |= enable_conf;
- else
- val &= ~enable_conf;
-
- writel_relaxed(val, pc->base + pc->data->regs.ctrl);
-}
-
-static void rockchip_pwm_get_state_v1(struct pwm_chip *chip,
- struct pwm_device *pwm,
- struct pwm_state *state)
-{
- struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
- u32 enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN;
- u32 val;
-
- val = readl_relaxed(pc->base + pc->data->regs.ctrl);
- if ((val & enable_conf) == enable_conf)
- state->enabled = true;
-}
-
-static void rockchip_pwm_set_enable_v2(struct pwm_chip *chip,
- struct pwm_device *pwm, bool enable,
- enum pwm_polarity polarity)
-{
- struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
- u32 enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE |
- PWM_CONTINUOUS;
- u32 val;
-
- if (polarity == PWM_POLARITY_INVERSED)
- enable_conf |= PWM_DUTY_NEGATIVE | PWM_INACTIVE_POSITIVE;
- else
- enable_conf |= PWM_DUTY_POSITIVE | PWM_INACTIVE_NEGATIVE;
-
- val = readl_relaxed(pc->base + pc->data->regs.ctrl);
-
- if (enable)
- val |= enable_conf;
- else
- val &= ~enable_conf;
-
- writel_relaxed(val, pc->base + pc->data->regs.ctrl);
-}
-
-static void rockchip_pwm_get_state_v2(struct pwm_chip *chip,
- struct pwm_device *pwm,
- struct pwm_state *state)
-{
- struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
- u32 enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE |
- PWM_CONTINUOUS;
- u32 val;
-
- val = readl_relaxed(pc->base + pc->data->regs.ctrl);
- if ((val & enable_conf) != enable_conf)
- return;
-
- state->enabled = true;
-
- if (!(val & PWM_DUTY_POSITIVE))
- state->polarity = PWM_POLARITY_INVERSED;
-}
-
static void rockchip_pwm_get_state(struct pwm_chip *chip,
struct pwm_device *pwm,
struct pwm_state *state)
{
struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+ u32 enable_conf = pc->data->enable_conf;
unsigned long clk_rate;
u64 tmp;
+ u32 val;
int ret;
- ret = clk_enable(pc->clk);
+ ret = clk_enable(pc->pclk);
if (ret)
return;
@@ -157,19 +83,31 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip,
tmp = readl_relaxed(pc->base + pc->data->regs.duty);
tmp *= pc->data->prescaler * NSEC_PER_SEC;
- state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate);
+ state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate);
+
+ val = readl_relaxed(pc->base + pc->data->regs.ctrl);
+ if (pc->data->supports_polarity)
+ state->enabled = ((val & enable_conf) != enable_conf) ?
+ false : true;
+ else
+ state->enabled = ((val & enable_conf) == enable_conf) ?
+ true : false;
- pc->data->get_state(chip, pwm, state);
+ if (pc->data->supports_polarity) {
+ if (!(val & PWM_DUTY_POSITIVE))
+ state->polarity = PWM_POLARITY_INVERSED;
+ }
- clk_disable(pc->clk);
+ clk_disable(pc->pclk);
}
-static int rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns)
+static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
+ struct pwm_state *state)
{
struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
unsigned long period, duty;
u64 clk_rate, div;
+ u32 ctrl;
clk_rate = clk_get_rate(pc->clk);
@@ -178,26 +116,53 @@ static int rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
* bits, every possible input period can be obtained using the
* default prescaler value for all practical clock rate values.
*/
- div = clk_rate * period_ns;
+ div = clk_rate * state->period;
period = DIV_ROUND_CLOSEST_ULL(div,
pc->data->prescaler * NSEC_PER_SEC);
- div = clk_rate * duty_ns;
+ div = clk_rate * state->duty_cycle;
duty = DIV_ROUND_CLOSEST_ULL(div, pc->data->prescaler * NSEC_PER_SEC);
+ /*
+ * Lock the period and duty of previous configuration, then
+ * change the duty and period, that would not be effective.
+ */
+ ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl);
+ if (pc->data->supports_lock) {
+ ctrl |= PWM_LOCK_EN;
+ writel_relaxed(ctrl, pc->base + pc->data->regs.ctrl);
+ }
+
writel(period, pc->base + pc->data->regs.period);
writel(duty, pc->base + pc->data->regs.duty);
- return 0;
+ if (pc->data->supports_polarity) {
+ ctrl &= ~PWM_POLARITY_MASK;
+ if (state->polarity == PWM_POLARITY_INVERSED)
+ ctrl |= PWM_DUTY_NEGATIVE | PWM_INACTIVE_POSITIVE;
+ else
+ ctrl |= PWM_DUTY_POSITIVE | PWM_INACTIVE_NEGATIVE;
+ }
+
+ /*
+ * Unlock and set polarity at the same time,
+ * the configuration of duty, period and polarity
+ * would be effective together at next period.
+ */
+ if (pc->data->supports_lock)
+ ctrl &= ~PWM_LOCK_EN;
+
+ writel(ctrl, pc->base + pc->data->regs.ctrl);
}
static int rockchip_pwm_enable(struct pwm_chip *chip,
- struct pwm_device *pwm,
- bool enable,
- enum pwm_polarity polarity)
+ struct pwm_device *pwm,
+ bool enable)
{
struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+ u32 enable_conf = pc->data->enable_conf;
int ret;
+ u32 val;
if (enable) {
ret = clk_enable(pc->clk);
@@ -205,7 +170,14 @@ static int rockchip_pwm_enable(struct pwm_chip *chip,
return ret;
}
- pc->data->set_enable(chip, pwm, enable, polarity);
+ val = readl_relaxed(pc->base + pc->data->regs.ctrl);
+
+ if (enable)
+ val |= enable_conf;
+ else
+ val &= ~enable_conf;
+
+ writel_relaxed(val, pc->base + pc->data->regs.ctrl);
if (!enable)
clk_disable(pc->clk);
@@ -219,33 +191,26 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
struct pwm_state curstate;
bool enabled;
- int ret;
+ int ret = 0;
- pwm_get_state(pwm, &curstate);
- enabled = curstate.enabled;
-
- ret = clk_enable(pc->clk);
+ ret = clk_enable(pc->pclk);
if (ret)
return ret;
- if (state->polarity != curstate.polarity && enabled) {
- ret = rockchip_pwm_enable(chip, pwm, false, state->polarity);
+ pwm_get_state(pwm, &curstate);
+ enabled = curstate.enabled;
+
+ if (state->polarity != curstate.polarity && enabled &&
+ !pc->data->supports_lock) {
+ ret = rockchip_pwm_enable(chip, pwm, false);
if (ret)
goto out;
enabled = false;
}
- ret = rockchip_pwm_config(chip, pwm, state->duty_cycle, state->period);
- if (ret) {
- if (enabled != curstate.enabled)
- rockchip_pwm_enable(chip, pwm, !enabled,
- state->polarity);
- goto out;
- }
-
+ rockchip_pwm_config(chip, pwm, state);
if (state->enabled != enabled) {
- ret = rockchip_pwm_enable(chip, pwm, state->enabled,
- state->polarity);
+ ret = rockchip_pwm_enable(chip, pwm, state->enabled);
if (ret)
goto out;
}
@@ -257,18 +222,12 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
rockchip_pwm_get_state(chip, pwm, state);
out:
- clk_disable(pc->clk);
+ clk_disable(pc->pclk);
return ret;
}
-static const struct pwm_ops rockchip_pwm_ops_v1 = {
- .get_state = rockchip_pwm_get_state,
- .apply = rockchip_pwm_apply,
- .owner = THIS_MODULE,
-};
-
-static const struct pwm_ops rockchip_pwm_ops_v2 = {
+static const struct pwm_ops rockchip_pwm_ops = {
.get_state = rockchip_pwm_get_state,
.apply = rockchip_pwm_apply,
.owner = THIS_MODULE,
@@ -282,9 +241,9 @@ static const struct rockchip_pwm_data pwm_data_v1 = {
.ctrl = 0x0c,
},
.prescaler = 2,
- .ops = &rockchip_pwm_ops_v1,
- .set_enable = rockchip_pwm_set_enable_v1,
- .get_state = rockchip_pwm_get_state_v1,
+ .supports_polarity = false,
+ .supports_lock = false,
+ .enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN,
};
static const struct rockchip_pwm_data pwm_data_v2 = {
@@ -296,9 +255,9 @@ static const struct rockchip_pwm_data pwm_data_v2 = {
},
.prescaler = 1,
.supports_polarity = true,
- .ops = &rockchip_pwm_ops_v2,
- .set_enable = rockchip_pwm_set_enable_v2,
- .get_state = rockchip_pwm_get_state_v2,
+ .supports_lock = false,
+ .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE |
+ PWM_CONTINUOUS,
};
static const struct rockchip_pwm_data pwm_data_vop = {
@@ -310,15 +269,30 @@ static const struct rockchip_pwm_data pwm_data_vop = {
},
.prescaler = 1,
.supports_polarity = true,
- .ops = &rockchip_pwm_ops_v2,
- .set_enable = rockchip_pwm_set_enable_v2,
- .get_state = rockchip_pwm_get_state_v2,
+ .supports_lock = false,
+ .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE |
+ PWM_CONTINUOUS,
+};
+
+static const struct rockchip_pwm_data pwm_data_v3 = {
+ .regs = {
+ .duty = 0x08,
+ .period = 0x04,
+ .cntr = 0x00,
+ .ctrl = 0x0c,
+ },
+ .prescaler = 1,
+ .supports_polarity = true,
+ .supports_lock = true,
+ .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE |
+ PWM_CONTINUOUS,
};
static const struct of_device_id rockchip_pwm_dt_ids[] = {
{ .compatible = "rockchip,rk2928-pwm", .data = &pwm_data_v1},
{ .compatible = "rockchip,rk3288-pwm", .data = &pwm_data_v2},
{ .compatible = "rockchip,vop-pwm", .data = &pwm_data_vop},
+ { .compatible = "rockchip,rk3328-pwm", .data = &pwm_data_v3},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, rockchip_pwm_dt_ids);
@@ -328,7 +302,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
const struct of_device_id *id;
struct rockchip_pwm_chip *pc;
struct resource *r;
- int ret;
+ int ret, count;
id = of_match_device(rockchip_pwm_dt_ids, &pdev->dev);
if (!id)
@@ -343,19 +317,49 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
if (IS_ERR(pc->base))
return PTR_ERR(pc->base);
- pc->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(pc->clk))
- return PTR_ERR(pc->clk);
+ pc->clk = devm_clk_get(&pdev->dev, "pwm");
+ if (IS_ERR(pc->clk)) {
+ pc->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(pc->clk)) {
+ ret = PTR_ERR(pc->clk);
+ if (ret != -EPROBE_DEFER)
+ dev_err(&pdev->dev, "Can't get bus clk: %d\n",
+ ret);
+ return ret;
+ }
+ }
+
+ count = of_count_phandle_with_args(pdev->dev.of_node,
+ "clocks", "#clock-cells");
+ if (count == 2)
+ pc->pclk = devm_clk_get(&pdev->dev, "pclk");
+ else
+ pc->pclk = pc->clk;
+
+ if (IS_ERR(pc->pclk)) {
+ ret = PTR_ERR(pc->pclk);
+ if (ret != -EPROBE_DEFER)
+ dev_err(&pdev->dev, "Can't get APB clk: %d\n", ret);
+ return ret;
+ }
ret = clk_prepare_enable(pc->clk);
- if (ret)
+ if (ret) {
+ dev_err(&pdev->dev, "Can't prepare enable bus clk: %d\n", ret);
return ret;
+ }
+
+ ret = clk_prepare(pc->pclk);
+ if (ret) {
+ dev_err(&pdev->dev, "Can't prepare APB clk: %d\n", ret);
+ goto err_clk;
+ }
platform_set_drvdata(pdev, pc);
pc->data = id->data;
pc->chip.dev = &pdev->dev;
- pc->chip.ops = pc->data->ops;
+ pc->chip.ops = &rockchip_pwm_ops;
pc->chip.base = -1;
pc->chip.npwm = 1;
@@ -368,12 +372,20 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
if (ret < 0) {
clk_unprepare(pc->clk);
dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
+ goto err_pclk;
}
/* Keep the PWM clk enabled if the PWM appears to be up and running. */
if (!pwm_is_enabled(pc->chip.pwms))
clk_disable(pc->clk);
+ return 0;
+
+err_pclk:
+ clk_unprepare(pc->pclk);
+err_clk:
+ clk_disable_unprepare(pc->clk);
+
return ret;
}
@@ -395,6 +407,7 @@ static int rockchip_pwm_remove(struct platform_device *pdev)
if (pwm_is_enabled(pc->chip.pwms))
clk_disable(pc->clk);
+ clk_unprepare(pc->pclk);
clk_unprepare(pc->clk);
return pwmchip_remove(&pc->chip);
diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c
index f113cda47032..062f2cfc45ec 100644
--- a/drivers/pwm/pwm-samsung.c
+++ b/drivers/pwm/pwm-samsung.c
@@ -3,6 +3,7 @@
* Copyright (c) 2008 Simtec Electronics
* Copyright (c) 2013 Tomasz Figa <[email protected]>
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
*
* PWM driver for Samsung SoCs
*
@@ -74,6 +75,7 @@ struct samsung_pwm_channel {
* @chip: generic PWM chip
* @variant: local copy of hardware variant data
* @inverter_mask: inverter status for all channels - one bit per channel
+ * @disabled_mask: disabled status for all channels - one bit per channel
* @base: base address of mapped PWM registers
* @base_clk: base clock used to drive the timers
* @tclk0: external clock 0 (can be ERR_PTR if not present)
@@ -83,6 +85,7 @@ struct samsung_pwm_chip {
struct pwm_chip chip;
struct samsung_pwm_variant variant;
u8 inverter_mask;
+ u8 disabled_mask;
void __iomem *base;
struct clk *base_clk;
@@ -257,6 +260,8 @@ static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm)
tcon |= TCON_START(tcon_chan) | TCON_AUTORELOAD(tcon_chan);
writel(tcon, our_chip->base + REG_TCON);
+ our_chip->disabled_mask &= ~BIT(pwm->hwpwm);
+
spin_unlock_irqrestore(&samsung_pwm_lock, flags);
return 0;
@@ -275,6 +280,8 @@ static void pwm_samsung_disable(struct pwm_chip *chip, struct pwm_device *pwm)
tcon &= ~TCON_AUTORELOAD(tcon_chan);
writel(tcon, our_chip->base + REG_TCON);
+ our_chip->disabled_mask |= BIT(pwm->hwpwm);
+
spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
@@ -297,8 +304,8 @@ static void pwm_samsung_manual_update(struct samsung_pwm_chip *chip,
spin_unlock_irqrestore(&samsung_pwm_lock, flags);
}
-static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns)
+static int __pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
+ int duty_ns, int period_ns, bool force_period)
{
struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip);
struct samsung_pwm_channel *chan = pwm_get_chip_data(pwm);
@@ -312,9 +319,6 @@ static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
if (period_ns > NSEC_PER_SEC)
return -ERANGE;
- if (period_ns == chan->period_ns && duty_ns == chan->duty_ns)
- return 0;
-
tcnt = readl(our_chip->base + REG_TCNTB(pwm->hwpwm));
oldtcmp = readl(our_chip->base + REG_TCMPB(pwm->hwpwm));
@@ -322,7 +326,7 @@ static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
++tcnt;
/* Check to see if we are changing the clock rate of the PWM. */
- if (chan->period_ns != period_ns) {
+ if (chan->period_ns != period_ns || force_period) {
unsigned long tin_rate;
u32 period;
@@ -381,6 +385,12 @@ static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
return 0;
}
+static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
+ int duty_ns, int period_ns)
+{
+ return __pwm_samsung_config(chip, pwm, duty_ns, period_ns, false);
+}
+
static void pwm_samsung_set_invert(struct samsung_pwm_chip *chip,
unsigned int channel, bool invert)
{
@@ -592,51 +602,41 @@ static int pwm_samsung_remove(struct platform_device *pdev)
}
#ifdef CONFIG_PM_SLEEP
-static int pwm_samsung_suspend(struct device *dev)
+static int pwm_samsung_resume(struct device *dev)
{
- struct samsung_pwm_chip *chip = dev_get_drvdata(dev);
+ struct samsung_pwm_chip *our_chip = dev_get_drvdata(dev);
+ struct pwm_chip *chip = &our_chip->chip;
unsigned int i;
- /*
- * No one preserves these values during suspend so reset them.
- * Otherwise driver leaves PWM unconfigured if same values are
- * passed to pwm_config() next time.
- */
- for (i = 0; i < SAMSUNG_PWM_NUM; ++i) {
- struct pwm_device *pwm = &chip->chip.pwms[i];
+ for (i = 0; i < SAMSUNG_PWM_NUM; i++) {
+ struct pwm_device *pwm = &chip->pwms[i];
struct samsung_pwm_channel *chan = pwm_get_chip_data(pwm);
if (!chan)
continue;
- chan->period_ns = 0;
- chan->duty_ns = 0;
- }
-
- return 0;
-}
+ if (our_chip->variant.output_mask & BIT(i))
+ pwm_samsung_set_invert(our_chip, i,
+ our_chip->inverter_mask & BIT(i));
-static int pwm_samsung_resume(struct device *dev)
-{
- struct samsung_pwm_chip *chip = dev_get_drvdata(dev);
- unsigned int chan;
+ if (chan->period_ns) {
+ __pwm_samsung_config(chip, pwm, chan->duty_ns,
+ chan->period_ns, true);
+ /* needed to make PWM disable work on Odroid-XU3 */
+ pwm_samsung_manual_update(our_chip, pwm);
+ }
- /*
- * Inverter setting must be preserved across suspend/resume
- * as nobody really seems to configure it more than once.
- */
- for (chan = 0; chan < SAMSUNG_PWM_NUM; ++chan) {
- if (chip->variant.output_mask & BIT(chan))
- pwm_samsung_set_invert(chip, chan,
- chip->inverter_mask & BIT(chan));
+ if (our_chip->disabled_mask & BIT(i))
+ pwm_samsung_disable(chip, pwm);
+ else
+ pwm_samsung_enable(chip, pwm);
}
return 0;
}
#endif
-static SIMPLE_DEV_PM_OPS(pwm_samsung_pm_ops, pwm_samsung_suspend,
- pwm_samsung_resume);
+static SIMPLE_DEV_PM_OPS(pwm_samsung_pm_ops, NULL, pwm_samsung_resume);
static struct platform_driver pwm_samsung_driver = {
.driver = {
diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c
index e9b33f09ff09..f8ebbece57b7 100644
--- a/drivers/pwm/pwm-tegra.c
+++ b/drivers/pwm/pwm-tegra.c
@@ -218,7 +218,7 @@ static int tegra_pwm_probe(struct platform_device *pdev)
*/
pwm->clk_rate = clk_get_rate(pwm->clk);
- pwm->rst = devm_reset_control_get(&pdev->dev, "pwm");
+ pwm->rst = devm_reset_control_get_exclusive(&pdev->dev, "pwm");
if (IS_ERR(pwm->rst)) {
ret = PTR_ERR(pwm->rst);
dev_err(&pdev->dev, "Reset control is not found: %d\n", ret);
diff --git a/drivers/pwm/pwm-tiecap.c b/drivers/pwm/pwm-tiecap.c
index 6ec342dd3eea..34b228626bd5 100644
--- a/drivers/pwm/pwm-tiecap.c
+++ b/drivers/pwm/pwm-tiecap.c
@@ -39,15 +39,15 @@
#define ECCTL2_TSCTR_FREERUN BIT(4)
struct ecap_context {
- u32 cap3;
- u32 cap4;
- u16 ecctl2;
+ u32 cap3;
+ u32 cap4;
+ u16 ecctl2;
};
struct ecap_pwm_chip {
- struct pwm_chip chip;
- unsigned int clk_rate;
- void __iomem *mmio_base;
+ struct pwm_chip chip;
+ unsigned int clk_rate;
+ void __iomem *mmio_base;
struct ecap_context ctx;
};
@@ -64,9 +64,9 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
int duty_ns, int period_ns)
{
struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip);
+ u32 period_cycles, duty_cycles;
unsigned long long c;
- unsigned long period_cycles, duty_cycles;
- unsigned int reg_val;
+ u16 value;
if (period_ns > NSEC_PER_SEC)
return -ERANGE;
@@ -74,7 +74,7 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
c = pc->clk_rate;
c = c * period_ns;
do_div(c, NSEC_PER_SEC);
- period_cycles = (unsigned long)c;
+ period_cycles = (u32)c;
if (period_cycles < 1) {
period_cycles = 1;
@@ -83,17 +83,17 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
c = pc->clk_rate;
c = c * duty_ns;
do_div(c, NSEC_PER_SEC);
- duty_cycles = (unsigned long)c;
+ duty_cycles = (u32)c;
}
pm_runtime_get_sync(pc->chip.dev);
- reg_val = readw(pc->mmio_base + ECCTL2);
+ value = readw(pc->mmio_base + ECCTL2);
/* Configure APWM mode & disable sync option */
- reg_val |= ECCTL2_APWM_MODE | ECCTL2_SYNC_SEL_DISA;
+ value |= ECCTL2_APWM_MODE | ECCTL2_SYNC_SEL_DISA;
- writew(reg_val, pc->mmio_base + ECCTL2);
+ writew(value, pc->mmio_base + ECCTL2);
if (!pwm_is_enabled(pwm)) {
/* Update active registers if not running */
@@ -110,40 +110,45 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
}
if (!pwm_is_enabled(pwm)) {
- reg_val = readw(pc->mmio_base + ECCTL2);
+ value = readw(pc->mmio_base + ECCTL2);
/* Disable APWM mode to put APWM output Low */
- reg_val &= ~ECCTL2_APWM_MODE;
- writew(reg_val, pc->mmio_base + ECCTL2);
+ value &= ~ECCTL2_APWM_MODE;
+ writew(value, pc->mmio_base + ECCTL2);
}
pm_runtime_put_sync(pc->chip.dev);
+
return 0;
}
static int ecap_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm,
- enum pwm_polarity polarity)
+ enum pwm_polarity polarity)
{
struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip);
- unsigned short reg_val;
+ u16 value;
pm_runtime_get_sync(pc->chip.dev);
- reg_val = readw(pc->mmio_base + ECCTL2);
+
+ value = readw(pc->mmio_base + ECCTL2);
+
if (polarity == PWM_POLARITY_INVERSED)
/* Duty cycle defines LOW period of PWM */
- reg_val |= ECCTL2_APWM_POL_LOW;
+ value |= ECCTL2_APWM_POL_LOW;
else
/* Duty cycle defines HIGH period of PWM */
- reg_val &= ~ECCTL2_APWM_POL_LOW;
+ value &= ~ECCTL2_APWM_POL_LOW;
+
+ writew(value, pc->mmio_base + ECCTL2);
- writew(reg_val, pc->mmio_base + ECCTL2);
pm_runtime_put_sync(pc->chip.dev);
+
return 0;
}
static int ecap_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip);
- unsigned int reg_val;
+ u16 value;
/* Leave clock enabled on enabling PWM */
pm_runtime_get_sync(pc->chip.dev);
@@ -152,24 +157,25 @@ static int ecap_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
* Enable 'Free run Time stamp counter mode' to start counter
* and 'APWM mode' to enable APWM output
*/
- reg_val = readw(pc->mmio_base + ECCTL2);
- reg_val |= ECCTL2_TSCTR_FREERUN | ECCTL2_APWM_MODE;
- writew(reg_val, pc->mmio_base + ECCTL2);
+ value = readw(pc->mmio_base + ECCTL2);
+ value |= ECCTL2_TSCTR_FREERUN | ECCTL2_APWM_MODE;
+ writew(value, pc->mmio_base + ECCTL2);
+
return 0;
}
static void ecap_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip);
- unsigned int reg_val;
+ u16 value;
/*
* Disable 'Free run Time stamp counter mode' to stop counter
* and 'APWM mode' to put APWM output to low
*/
- reg_val = readw(pc->mmio_base + ECCTL2);
- reg_val &= ~(ECCTL2_TSCTR_FREERUN | ECCTL2_APWM_MODE);
- writew(reg_val, pc->mmio_base + ECCTL2);
+ value = readw(pc->mmio_base + ECCTL2);
+ value &= ~(ECCTL2_TSCTR_FREERUN | ECCTL2_APWM_MODE);
+ writew(value, pc->mmio_base + ECCTL2);
/* Disable clock on PWM disable */
pm_runtime_put_sync(pc->chip.dev);
@@ -184,12 +190,12 @@ static void ecap_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
}
static const struct pwm_ops ecap_pwm_ops = {
- .free = ecap_pwm_free,
- .config = ecap_pwm_config,
- .set_polarity = ecap_pwm_set_polarity,
- .enable = ecap_pwm_enable,
- .disable = ecap_pwm_disable,
- .owner = THIS_MODULE,
+ .free = ecap_pwm_free,
+ .config = ecap_pwm_config,
+ .set_polarity = ecap_pwm_set_polarity,
+ .enable = ecap_pwm_enable,
+ .disable = ecap_pwm_disable,
+ .owner = THIS_MODULE,
};
static const struct of_device_id ecap_of_match[] = {
@@ -202,10 +208,10 @@ MODULE_DEVICE_TABLE(of, ecap_of_match);
static int ecap_pwm_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
- int ret;
+ struct ecap_pwm_chip *pc;
struct resource *r;
struct clk *clk;
- struct ecap_pwm_chip *pc;
+ int ret;
pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);
if (!pc)
@@ -248,9 +254,9 @@ static int ecap_pwm_probe(struct platform_device *pdev)
return ret;
}
+ platform_set_drvdata(pdev, pc);
pm_runtime_enable(&pdev->dev);
- platform_set_drvdata(pdev, pc);
return 0;
}
@@ -259,6 +265,7 @@ static int ecap_pwm_remove(struct platform_device *pdev)
struct ecap_pwm_chip *pc = platform_get_drvdata(pdev);
pm_runtime_disable(&pdev->dev);
+
return pwmchip_remove(&pc->chip);
}
@@ -311,14 +318,13 @@ static SIMPLE_DEV_PM_OPS(ecap_pwm_pm_ops, ecap_pwm_suspend, ecap_pwm_resume);
static struct platform_driver ecap_pwm_driver = {
.driver = {
- .name = "ecap",
+ .name = "ecap",
.of_match_table = ecap_of_match,
- .pm = &ecap_pwm_pm_ops,
+ .pm = &ecap_pwm_pm_ops,
},
.probe = ecap_pwm_probe,
.remove = ecap_pwm_remove,
};
-
module_platform_driver(ecap_pwm_driver);
MODULE_DESCRIPTION("ECAP PWM driver");
diff --git a/drivers/pwm/pwm-tiehrpwm.c b/drivers/pwm/pwm-tiehrpwm.c
index b5c6b0636893..4c22cb395040 100644
--- a/drivers/pwm/pwm-tiehrpwm.c
+++ b/drivers/pwm/pwm-tiehrpwm.c
@@ -122,12 +122,12 @@ struct ehrpwm_context {
};
struct ehrpwm_pwm_chip {
- struct pwm_chip chip;
- unsigned int clk_rate;
- void __iomem *mmio_base;
+ struct pwm_chip chip;
+ unsigned long clk_rate;
+ void __iomem *mmio_base;
unsigned long period_cycles[NUM_PWM_CHANNEL];
enum pwm_polarity polarity[NUM_PWM_CHANNEL];
- struct clk *tbclk;
+ struct clk *tbclk;
struct ehrpwm_context ctx;
};
@@ -136,25 +136,26 @@ static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip)
return container_of(chip, struct ehrpwm_pwm_chip, chip);
}
-static inline u16 ehrpwm_read(void __iomem *base, int offset)
+static inline u16 ehrpwm_read(void __iomem *base, unsigned int offset)
{
return readw(base + offset);
}
-static inline void ehrpwm_write(void __iomem *base, int offset, unsigned int val)
+static inline void ehrpwm_write(void __iomem *base, unsigned int offset,
+ u16 value)
{
- writew(val & 0xFFFF, base + offset);
+ writew(value, base + offset);
}
-static void ehrpwm_modify(void __iomem *base, int offset,
- unsigned short mask, unsigned short val)
+static void ehrpwm_modify(void __iomem *base, unsigned int offset, u16 mask,
+ u16 value)
{
- unsigned short regval;
+ unsigned short val;
- regval = readw(base + offset);
- regval &= ~mask;
- regval |= val & mask;
- writew(regval, base + offset);
+ val = readw(base + offset);
+ val &= ~mask;
+ val |= value & mask;
+ writew(val, base + offset);
}
/**
@@ -163,14 +164,13 @@ static void ehrpwm_modify(void __iomem *base, int offset,
* @prescale_div: prescaler value set
* @tb_clk_div: Time Base Control prescaler bits
*/
-static int set_prescale_div(unsigned long rqst_prescaler,
- unsigned short *prescale_div, unsigned short *tb_clk_div)
+static int set_prescale_div(unsigned long rqst_prescaler, u16 *prescale_div,
+ u16 *tb_clk_div)
{
unsigned int clkdiv, hspclkdiv;
for (clkdiv = 0; clkdiv <= CLKDIV_MAX; clkdiv++) {
for (hspclkdiv = 0; hspclkdiv <= HSPCLKDIV_MAX; hspclkdiv++) {
-
/*
* calculations for prescaler value :
* prescale_div = HSPCLKDIVIDER * CLKDIVIDER.
@@ -191,13 +191,14 @@ static int set_prescale_div(unsigned long rqst_prescaler,
}
}
}
+
return 1;
}
static void configure_polarity(struct ehrpwm_pwm_chip *pc, int chan)
{
- int aqctl_reg;
- unsigned short aqctl_val, aqctl_mask;
+ u16 aqctl_val, aqctl_mask;
+ unsigned int aqctl_reg;
/*
* Configure PWM output to HIGH/LOW level on counter
@@ -232,13 +233,13 @@ static void configure_polarity(struct ehrpwm_pwm_chip *pc, int chan)
* duty_ns = 10^9 * (ps_divval * duty_cycles) / PWM_CLK_RATE
*/
static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns)
+ int duty_ns, int period_ns)
{
struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip);
+ u32 period_cycles, duty_cycles;
+ u16 ps_divval, tb_divval;
+ unsigned int i, cmp_reg;
unsigned long long c;
- unsigned long period_cycles, duty_cycles;
- unsigned short ps_divval, tb_divval;
- int i, cmp_reg;
if (period_ns > NSEC_PER_SEC)
return -ERANGE;
@@ -272,8 +273,9 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
if (i == pwm->hwpwm)
continue;
- dev_err(chip->dev, "Period value conflicts with channel %d\n",
- i);
+ dev_err(chip->dev,
+ "period value conflicts with channel %u\n",
+ i);
return -EINVAL;
}
}
@@ -282,7 +284,7 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
/* Configure clock prescaler to support Low frequency PWM wave */
if (set_prescale_div(period_cycles/PERIOD_MAX, &ps_divval,
- &tb_divval)) {
+ &tb_divval)) {
dev_err(chip->dev, "Unsupported values\n");
return -EINVAL;
}
@@ -303,7 +305,7 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
/* Configure ehrpwm counter for up-count mode */
ehrpwm_modify(pc->mmio_base, TBCTL, TBCTL_CTRMODE_MASK,
- TBCTL_CTRMODE_UP);
+ TBCTL_CTRMODE_UP);
if (pwm->hwpwm == 1)
/* Channel 1 configured with compare B register */
@@ -315,23 +317,26 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
ehrpwm_write(pc->mmio_base, cmp_reg, duty_cycles);
pm_runtime_put_sync(chip->dev);
+
return 0;
}
static int ehrpwm_pwm_set_polarity(struct pwm_chip *chip,
- struct pwm_device *pwm, enum pwm_polarity polarity)
+ struct pwm_device *pwm,
+ enum pwm_polarity polarity)
{
struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip);
/* Configuration of polarity in hardware delayed, do at enable */
pc->polarity[pwm->hwpwm] = polarity;
+
return 0;
}
static int ehrpwm_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip);
- unsigned short aqcsfrc_val, aqcsfrc_mask;
+ u16 aqcsfrc_val, aqcsfrc_mask;
int ret;
/* Leave clock enabled on enabling PWM */
@@ -348,7 +353,7 @@ static int ehrpwm_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
/* Changes to shadow mode */
ehrpwm_modify(pc->mmio_base, AQSFRC, AQSFRC_RLDCSF_MASK,
- AQSFRC_RLDCSF_ZRO);
+ AQSFRC_RLDCSF_ZRO);
ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val);
@@ -358,20 +363,21 @@ static int ehrpwm_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
/* Enable TBCLK before enabling PWM device */
ret = clk_enable(pc->tbclk);
if (ret) {
- dev_err(chip->dev, "Failed to enable TBCLK for %s\n",
- dev_name(pc->chip.dev));
+ dev_err(chip->dev, "Failed to enable TBCLK for %s: %d\n",
+ dev_name(pc->chip.dev), ret);
return ret;
}
/* Enable time counter for free_run */
ehrpwm_modify(pc->mmio_base, TBCTL, TBCTL_RUN_MASK, TBCTL_FREE_RUN);
+
return 0;
}
static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip);
- unsigned short aqcsfrc_val, aqcsfrc_mask;
+ u16 aqcsfrc_val, aqcsfrc_mask;
/* Action Qualifier puts PWM output low forcefully */
if (pwm->hwpwm) {
@@ -387,7 +393,7 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
* Action Qualifier control on PWM output from next TBCLK
*/
ehrpwm_modify(pc->mmio_base, AQSFRC, AQSFRC_RLDCSF_MASK,
- AQSFRC_RLDCSF_IMDT);
+ AQSFRC_RLDCSF_IMDT);
ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val);
@@ -415,17 +421,17 @@ static void ehrpwm_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
}
static const struct pwm_ops ehrpwm_pwm_ops = {
- .free = ehrpwm_pwm_free,
- .config = ehrpwm_pwm_config,
- .set_polarity = ehrpwm_pwm_set_polarity,
- .enable = ehrpwm_pwm_enable,
- .disable = ehrpwm_pwm_disable,
- .owner = THIS_MODULE,
+ .free = ehrpwm_pwm_free,
+ .config = ehrpwm_pwm_config,
+ .set_polarity = ehrpwm_pwm_set_polarity,
+ .enable = ehrpwm_pwm_enable,
+ .disable = ehrpwm_pwm_disable,
+ .owner = THIS_MODULE,
};
static const struct of_device_id ehrpwm_of_match[] = {
- { .compatible = "ti,am3352-ehrpwm" },
- { .compatible = "ti,am33xx-ehrpwm" },
+ { .compatible = "ti,am3352-ehrpwm" },
+ { .compatible = "ti,am33xx-ehrpwm" },
{},
};
MODULE_DEVICE_TABLE(of, ehrpwm_of_match);
@@ -433,10 +439,10 @@ MODULE_DEVICE_TABLE(of, ehrpwm_of_match);
static int ehrpwm_pwm_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
- int ret;
+ struct ehrpwm_pwm_chip *pc;
struct resource *r;
struct clk *clk;
- struct ehrpwm_pwm_chip *pc;
+ int ret;
pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);
if (!pc)
@@ -489,13 +495,18 @@ static int ehrpwm_pwm_probe(struct platform_device *pdev)
ret = pwmchip_add(&pc->chip);
if (ret < 0) {
dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
- return ret;
+ goto err_clk_unprepare;
}
+ platform_set_drvdata(pdev, pc);
pm_runtime_enable(&pdev->dev);
- platform_set_drvdata(pdev, pc);
return 0;
+
+err_clk_unprepare:
+ clk_unprepare(pc->tbclk);
+
+ return ret;
}
static int ehrpwm_pwm_remove(struct platform_device *pdev)
@@ -504,8 +515,8 @@ static int ehrpwm_pwm_remove(struct platform_device *pdev)
clk_unprepare(pc->tbclk);
- pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev);
+
return pwmchip_remove(&pc->chip);
}
@@ -513,6 +524,7 @@ static int ehrpwm_pwm_remove(struct platform_device *pdev)
static void ehrpwm_pwm_save_context(struct ehrpwm_pwm_chip *pc)
{
pm_runtime_get_sync(pc->chip.dev);
+
pc->ctx.tbctl = ehrpwm_read(pc->mmio_base, TBCTL);
pc->ctx.tbprd = ehrpwm_read(pc->mmio_base, TBPRD);
pc->ctx.cmpa = ehrpwm_read(pc->mmio_base, CMPA);
@@ -521,6 +533,7 @@ static void ehrpwm_pwm_save_context(struct ehrpwm_pwm_chip *pc)
pc->ctx.aqctlb = ehrpwm_read(pc->mmio_base, AQCTLB);
pc->ctx.aqsfrc = ehrpwm_read(pc->mmio_base, AQSFRC);
pc->ctx.aqcsfrc = ehrpwm_read(pc->mmio_base, AQCSFRC);
+
pm_runtime_put_sync(pc->chip.dev);
}
@@ -539,9 +552,10 @@ static void ehrpwm_pwm_restore_context(struct ehrpwm_pwm_chip *pc)
static int ehrpwm_pwm_suspend(struct device *dev)
{
struct ehrpwm_pwm_chip *pc = dev_get_drvdata(dev);
- int i;
+ unsigned int i;
ehrpwm_pwm_save_context(pc);
+
for (i = 0; i < pc->chip.npwm; i++) {
struct pwm_device *pwm = &pc->chip.pwms[i];
@@ -551,13 +565,14 @@ static int ehrpwm_pwm_suspend(struct device *dev)
/* Disable explicitly if PWM is running */
pm_runtime_put_sync(dev);
}
+
return 0;
}
static int ehrpwm_pwm_resume(struct device *dev)
{
struct ehrpwm_pwm_chip *pc = dev_get_drvdata(dev);
- int i;
+ unsigned int i;
for (i = 0; i < pc->chip.npwm; i++) {
struct pwm_device *pwm = &pc->chip.pwms[i];
@@ -568,24 +583,25 @@ static int ehrpwm_pwm_resume(struct device *dev)
/* Enable explicitly if PWM was running */
pm_runtime_get_sync(dev);
}
+
ehrpwm_pwm_restore_context(pc);
+
return 0;
}
#endif
static SIMPLE_DEV_PM_OPS(ehrpwm_pwm_pm_ops, ehrpwm_pwm_suspend,
- ehrpwm_pwm_resume);
+ ehrpwm_pwm_resume);
static struct platform_driver ehrpwm_pwm_driver = {
.driver = {
- .name = "ehrpwm",
+ .name = "ehrpwm",
.of_match_table = ehrpwm_of_match,
- .pm = &ehrpwm_pwm_pm_ops,
+ .pm = &ehrpwm_pwm_pm_ops,
},
.probe = ehrpwm_pwm_probe,
.remove = ehrpwm_pwm_remove,
};
-
module_platform_driver(ehrpwm_pwm_driver);
MODULE_DESCRIPTION("EHRPWM PWM driver");
diff --git a/drivers/pwm/pwm-vt8500.c b/drivers/pwm/pwm-vt8500.c
index 8141a4984126..3a78dd09ac81 100644
--- a/drivers/pwm/pwm-vt8500.c
+++ b/drivers/pwm/pwm-vt8500.c
@@ -241,6 +241,7 @@ static int vt8500_pwm_probe(struct platform_device *pdev)
ret = pwmchip_add(&chip->chip);
if (ret < 0) {
dev_err(&pdev->dev, "failed to add PWM chip\n");
+ clk_unprepare(chip->clk);
return ret;
}
diff --git a/drivers/pwm/pwm-zx.c b/drivers/pwm/pwm-zx.c
new file mode 100644
index 000000000000..5d27c16edfb1
--- /dev/null
+++ b/drivers/pwm/pwm-zx.c
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * Copyright 2017 Linaro Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/pwm.h>
+#include <linux/slab.h>
+
+#define ZX_PWM_MODE 0x0
+#define ZX_PWM_CLKDIV_SHIFT 2
+#define ZX_PWM_CLKDIV_MASK GENMASK(11, 2)
+#define ZX_PWM_CLKDIV(x) (((x) << ZX_PWM_CLKDIV_SHIFT) & \
+ ZX_PWM_CLKDIV_MASK)
+#define ZX_PWM_POLAR BIT(1)
+#define ZX_PWM_EN BIT(0)
+#define ZX_PWM_PERIOD 0x4
+#define ZX_PWM_DUTY 0x8
+
+#define ZX_PWM_CLKDIV_MAX 1023
+#define ZX_PWM_PERIOD_MAX 65535
+
+struct zx_pwm_chip {
+ struct pwm_chip chip;
+ struct clk *pclk;
+ struct clk *wclk;
+ void __iomem *base;
+};
+
+static inline struct zx_pwm_chip *to_zx_pwm_chip(struct pwm_chip *chip)
+{
+ return container_of(chip, struct zx_pwm_chip, chip);
+}
+
+static inline u32 zx_pwm_readl(struct zx_pwm_chip *zpc, unsigned int hwpwm,
+ unsigned int offset)
+{
+ return readl(zpc->base + (hwpwm + 1) * 0x10 + offset);
+}
+
+static inline void zx_pwm_writel(struct zx_pwm_chip *zpc, unsigned int hwpwm,
+ unsigned int offset, u32 value)
+{
+ writel(value, zpc->base + (hwpwm + 1) * 0x10 + offset);
+}
+
+static void zx_pwm_set_mask(struct zx_pwm_chip *zpc, unsigned int hwpwm,
+ unsigned int offset, u32 mask, u32 value)
+{
+ u32 data;
+
+ data = zx_pwm_readl(zpc, hwpwm, offset);
+ data &= ~mask;
+ data |= value & mask;
+ zx_pwm_writel(zpc, hwpwm, offset, data);
+}
+
+static void zx_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
+ struct pwm_state *state)
+{
+ struct zx_pwm_chip *zpc = to_zx_pwm_chip(chip);
+ unsigned long rate;
+ unsigned int div;
+ u32 value;
+ u64 tmp;
+
+ value = zx_pwm_readl(zpc, pwm->hwpwm, ZX_PWM_MODE);
+
+ if (value & ZX_PWM_POLAR)
+ state->polarity = PWM_POLARITY_NORMAL;
+ else
+ state->polarity = PWM_POLARITY_INVERSED;
+
+ if (value & ZX_PWM_EN)
+ state->enabled = true;
+ else
+ state->enabled = false;
+
+ div = (value & ZX_PWM_CLKDIV_MASK) >> ZX_PWM_CLKDIV_SHIFT;
+ rate = clk_get_rate(zpc->wclk);
+
+ tmp = zx_pwm_readl(zpc, pwm->hwpwm, ZX_PWM_PERIOD);
+ tmp *= div * NSEC_PER_SEC;
+ state->period = DIV_ROUND_CLOSEST_ULL(tmp, rate);
+
+ tmp = zx_pwm_readl(zpc, pwm->hwpwm, ZX_PWM_DUTY);
+ tmp *= div * NSEC_PER_SEC;
+ state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, rate);
+}
+
+static int zx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
+ unsigned int duty_ns, unsigned int period_ns)
+{
+ struct zx_pwm_chip *zpc = to_zx_pwm_chip(chip);
+ unsigned int period_cycles, duty_cycles;
+ unsigned long long c;
+ unsigned int div = 1;
+ unsigned long rate;
+
+ /* Find out the best divider */
+ rate = clk_get_rate(zpc->wclk);
+
+ while (1) {
+ c = rate / div;
+ c = c * period_ns;
+ do_div(c, NSEC_PER_SEC);
+
+ if (c < ZX_PWM_PERIOD_MAX)
+ break;
+
+ div++;
+
+ if (div > ZX_PWM_CLKDIV_MAX)
+ return -ERANGE;
+ }
+
+ /* Calculate duty cycles */
+ period_cycles = c;
+ c *= duty_ns;
+ do_div(c, period_ns);
+ duty_cycles = c;
+
+ /*
+ * If the PWM is being enabled, we have to temporarily disable it
+ * before configuring the registers.
+ */
+ if (pwm_is_enabled(pwm))
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE, ZX_PWM_EN, 0);
+
+ /* Set up registers */
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE, ZX_PWM_CLKDIV_MASK,
+ ZX_PWM_CLKDIV(div));
+ zx_pwm_writel(zpc, pwm->hwpwm, ZX_PWM_PERIOD, period_cycles);
+ zx_pwm_writel(zpc, pwm->hwpwm, ZX_PWM_DUTY, duty_cycles);
+
+ /* Re-enable the PWM if needed */
+ if (pwm_is_enabled(pwm))
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE,
+ ZX_PWM_EN, ZX_PWM_EN);
+
+ return 0;
+}
+
+static int zx_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+ struct pwm_state *state)
+{
+ struct zx_pwm_chip *zpc = to_zx_pwm_chip(chip);
+ struct pwm_state cstate;
+ int ret;
+
+ pwm_get_state(pwm, &cstate);
+
+ if (state->polarity != cstate.polarity)
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE, ZX_PWM_POLAR,
+ (state->polarity == PWM_POLARITY_INVERSED) ?
+ 0 : ZX_PWM_POLAR);
+
+ if (state->period != cstate.period ||
+ state->duty_cycle != cstate.duty_cycle) {
+ ret = zx_pwm_config(chip, pwm, state->duty_cycle,
+ state->period);
+ if (ret)
+ return ret;
+ }
+
+ if (state->enabled != cstate.enabled) {
+ if (state->enabled) {
+ ret = clk_prepare_enable(zpc->wclk);
+ if (ret)
+ return ret;
+
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE,
+ ZX_PWM_EN, ZX_PWM_EN);
+ } else {
+ zx_pwm_set_mask(zpc, pwm->hwpwm, ZX_PWM_MODE,
+ ZX_PWM_EN, 0);
+ clk_disable_unprepare(zpc->wclk);
+ }
+ }
+
+ return 0;
+}
+
+static const struct pwm_ops zx_pwm_ops = {
+ .apply = zx_pwm_apply,
+ .get_state = zx_pwm_get_state,
+ .owner = THIS_MODULE,
+};
+
+static int zx_pwm_probe(struct platform_device *pdev)
+{
+ struct zx_pwm_chip *zpc;
+ struct resource *res;
+ unsigned int i;
+ int ret;
+
+ zpc = devm_kzalloc(&pdev->dev, sizeof(*zpc), GFP_KERNEL);
+ if (!zpc)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ zpc->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(zpc->base))
+ return PTR_ERR(zpc->base);
+
+ zpc->pclk = devm_clk_get(&pdev->dev, "pclk");
+ if (IS_ERR(zpc->pclk))
+ return PTR_ERR(zpc->pclk);
+
+ zpc->wclk = devm_clk_get(&pdev->dev, "wclk");
+ if (IS_ERR(zpc->wclk))
+ return PTR_ERR(zpc->wclk);
+
+ ret = clk_prepare_enable(zpc->pclk);
+ if (ret)
+ return ret;
+
+ zpc->chip.dev = &pdev->dev;
+ zpc->chip.ops = &zx_pwm_ops;
+ zpc->chip.base = -1;
+ zpc->chip.npwm = 4;
+ zpc->chip.of_xlate = of_pwm_xlate_with_flags;
+ zpc->chip.of_pwm_n_cells = 3;
+
+ /*
+ * PWM devices may be enabled by firmware, and let's disable all of
+ * them initially to save power.
+ */
+ for (i = 0; i < zpc->chip.npwm; i++)
+ zx_pwm_set_mask(zpc, i, ZX_PWM_MODE, ZX_PWM_EN, 0);
+
+ ret = pwmchip_add(&zpc->chip);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret);
+ return ret;
+ }
+
+ platform_set_drvdata(pdev, zpc);
+
+ return 0;
+}
+
+static int zx_pwm_remove(struct platform_device *pdev)
+{
+ struct zx_pwm_chip *zpc = platform_get_drvdata(pdev);
+ int ret;
+
+ ret = pwmchip_remove(&zpc->chip);
+ clk_disable_unprepare(zpc->pclk);
+
+ return ret;
+}
+
+static const struct of_device_id zx_pwm_dt_ids[] = {
+ { .compatible = "zte,zx296718-pwm", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, zx_pwm_dt_ids);
+
+static struct platform_driver zx_pwm_driver = {
+ .driver = {
+ .name = "zx-pwm",
+ .of_match_table = zx_pwm_dt_ids,
+ },
+ .probe = zx_pwm_probe,
+ .remove = zx_pwm_remove,
+};
+module_platform_driver(zx_pwm_driver);
+
+MODULE_ALIAS("platform:zx-pwm");
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("ZTE ZX PWM Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c
index 315a4be8dc1e..9a68914100ad 100644
--- a/drivers/rapidio/devices/tsi721.c
+++ b/drivers/rapidio/devices/tsi721.c
@@ -51,6 +51,8 @@ module_param(mbox_sel, byte, S_IRUGO);
MODULE_PARM_DESC(mbox_sel,
"RIO Messaging MBOX Selection Mask (default: 0x0f = all)");
+static DEFINE_SPINLOCK(tsi721_maint_lock);
+
static void tsi721_omsg_handler(struct tsi721_device *priv, int ch);
static void tsi721_imsg_handler(struct tsi721_device *priv, int ch);
@@ -124,12 +126,15 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size,
void __iomem *regs = priv->regs + TSI721_DMAC_BASE(priv->mdma.ch_id);
struct tsi721_dma_desc *bd_ptr;
u32 rd_count, swr_ptr, ch_stat;
+ unsigned long flags;
int i, err = 0;
u32 op = do_wr ? MAINT_WR : MAINT_RD;
if (offset > (RIO_MAINT_SPACE_SZ - len) || (len != sizeof(u32)))
return -EINVAL;
+ spin_lock_irqsave(&tsi721_maint_lock, flags);
+
bd_ptr = priv->mdma.bd_base;
rd_count = ioread32(regs + TSI721_DMAC_DRDCNT);
@@ -197,7 +202,9 @@ static int tsi721_maint_dma(struct tsi721_device *priv, u32 sys_size,
*/
swr_ptr = ioread32(regs + TSI721_DMAC_DSWP);
iowrite32(swr_ptr, regs + TSI721_DMAC_DSRP);
+
err_out:
+ spin_unlock_irqrestore(&tsi721_maint_lock, flags);
return err;
}
diff --git a/drivers/rapidio/rio-access.c b/drivers/rapidio/rio-access.c
index a3824baca2e5..3ee9af83b638 100644
--- a/drivers/rapidio/rio-access.c
+++ b/drivers/rapidio/rio-access.c
@@ -14,16 +14,8 @@
#include <linux/module.h>
/*
- * These interrupt-safe spinlocks protect all accesses to RIO
- * configuration space and doorbell access.
- */
-static DEFINE_SPINLOCK(rio_config_lock);
-static DEFINE_SPINLOCK(rio_doorbell_lock);
-
-/*
* Wrappers for all RIO configuration access functions. They just check
- * alignment, do locking and call the low-level functions pointed to
- * by rio_mport->ops.
+ * alignment and call the low-level functions pointed to by rio_mport->ops.
*/
#define RIO_8_BAD 0
@@ -44,13 +36,10 @@ int __rio_local_read_config_##size \
(struct rio_mport *mport, u32 offset, type *value) \
{ \
int res; \
- unsigned long flags; \
u32 data = 0; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
- spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->lcread(mport, mport->id, offset, len, &data); \
*value = (type)data; \
- spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \
}
@@ -67,13 +56,8 @@ int __rio_local_read_config_##size \
int __rio_local_write_config_##size \
(struct rio_mport *mport, u32 offset, type value) \
{ \
- int res; \
- unsigned long flags; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
- spin_lock_irqsave(&rio_config_lock, flags); \
- res = mport->ops->lcwrite(mport, mport->id, offset, len, value);\
- spin_unlock_irqrestore(&rio_config_lock, flags); \
- return res; \
+ return mport->ops->lcwrite(mport, mport->id, offset, len, value);\
}
RIO_LOP_READ(8, u8, 1)
@@ -104,13 +88,10 @@ int rio_mport_read_config_##size \
(struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type *value) \
{ \
int res; \
- unsigned long flags; \
u32 data = 0; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
- spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->cread(mport, mport->id, destid, hopcount, offset, len, &data); \
*value = (type)data; \
- spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \
}
@@ -127,13 +108,9 @@ int rio_mport_read_config_##size \
int rio_mport_write_config_##size \
(struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type value) \
{ \
- int res; \
- unsigned long flags; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
- spin_lock_irqsave(&rio_config_lock, flags); \
- res = mport->ops->cwrite(mport, mport->id, destid, hopcount, offset, len, value); \
- spin_unlock_irqrestore(&rio_config_lock, flags); \
- return res; \
+ return mport->ops->cwrite(mport, mport->id, destid, hopcount, \
+ offset, len, value); \
}
RIO_OP_READ(8, u8, 1)
@@ -162,14 +139,7 @@ EXPORT_SYMBOL_GPL(rio_mport_write_config_32);
*/
int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid, u16 data)
{
- int res;
- unsigned long flags;
-
- spin_lock_irqsave(&rio_doorbell_lock, flags);
- res = mport->ops->dsend(mport, mport->id, destid, data);
- spin_unlock_irqrestore(&rio_doorbell_lock, flags);
-
- return res;
+ return mport->ops->dsend(mport, mport->id, destid, data);
}
EXPORT_SYMBOL_GPL(rio_mport_send_doorbell);
diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig
index 8891a8e50f12..df63e44526ac 100644
--- a/drivers/remoteproc/Kconfig
+++ b/drivers/remoteproc/Kconfig
@@ -12,6 +12,15 @@ config REMOTEPROC
if REMOTEPROC
+config IMX_REMOTEPROC
+ tristate "IMX6/7 remoteproc support"
+ depends on SOC_IMX6SX || SOC_IMX7D
+ help
+ Say y here to support iMX's remote processors (Cortex M4
+ on iMX7D) via the remote processor framework.
+
+ It's safe to say N here.
+
config OMAP_REMOTEPROC
tristate "OMAP remoteproc support"
depends on HAS_DMA
@@ -83,6 +92,7 @@ config QCOM_ADSP_PIL
depends on OF && ARCH_QCOM
depends on QCOM_SMEM
depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
+ depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
select MFD_SYSCON
select QCOM_MDT_LOADER
select QCOM_RPROC_COMMON
diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile
index f1ce5fc8a2f3..1a0b3dd44b8c 100644
--- a/drivers/remoteproc/Makefile
+++ b/drivers/remoteproc/Makefile
@@ -8,6 +8,7 @@ remoteproc-y += remoteproc_debugfs.o
remoteproc-y += remoteproc_sysfs.o
remoteproc-y += remoteproc_virtio.o
remoteproc-y += remoteproc_elf_loader.o
+obj-$(CONFIG_IMX_REMOTEPROC) += imx_rproc.o
obj-$(CONFIG_OMAP_REMOTEPROC) += omap_remoteproc.o
obj-$(CONFIG_WKUP_M3_RPROC) += wkup_m3_rproc.o
obj-$(CONFIG_DA8XX_REMOTEPROC) += da8xx_remoteproc.o
diff --git a/drivers/remoteproc/da8xx_remoteproc.c b/drivers/remoteproc/da8xx_remoteproc.c
index 99539cec1329..bf3b9034c319 100644
--- a/drivers/remoteproc/da8xx_remoteproc.c
+++ b/drivers/remoteproc/da8xx_remoteproc.c
@@ -16,6 +16,7 @@
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of_reserved_mem.h>
#include <linux/platform_device.h>
#include <linux/remoteproc.h>
@@ -38,9 +39,27 @@ MODULE_PARM_DESC(da8xx_fw_name,
#define SYSCFG_CHIPSIG3 BIT(3)
#define SYSCFG_CHIPSIG4 BIT(4)
+#define DA8XX_RPROC_LOCAL_ADDRESS_MASK (SZ_16M - 1)
+
+/**
+ * struct da8xx_rproc_mem - internal memory structure
+ * @cpu_addr: MPU virtual address of the memory region
+ * @bus_addr: Bus address used to access the memory region
+ * @dev_addr: Device address of the memory region from DSP view
+ * @size: Size of the memory region
+ */
+struct da8xx_rproc_mem {
+ void __iomem *cpu_addr;
+ phys_addr_t bus_addr;
+ u32 dev_addr;
+ size_t size;
+};
+
/**
* struct da8xx_rproc - da8xx remote processor instance state
* @rproc: rproc handle
+ * @mem: internal memory regions data
+ * @num_mems: number of internal memory regions
* @dsp_clk: placeholder for platform's DSP clk
* @ack_fxn: chip-specific ack function for ack'ing irq
* @irq_data: ack_fxn function parameter
@@ -50,6 +69,8 @@ MODULE_PARM_DESC(da8xx_fw_name,
*/
struct da8xx_rproc {
struct rproc *rproc;
+ struct da8xx_rproc_mem *mem;
+ int num_mems;
struct clk *dsp_clk;
void (*ack_fxn)(struct irq_data *data);
struct irq_data *irq_data;
@@ -158,6 +179,44 @@ static const struct rproc_ops da8xx_rproc_ops = {
.kick = da8xx_rproc_kick,
};
+static int da8xx_rproc_get_internal_memories(struct platform_device *pdev,
+ struct da8xx_rproc *drproc)
+{
+ static const char * const mem_names[] = {"l2sram", "l1pram", "l1dram"};
+ int num_mems = ARRAY_SIZE(mem_names);
+ struct device *dev = &pdev->dev;
+ struct resource *res;
+ int i;
+
+ drproc->mem = devm_kcalloc(dev, num_mems, sizeof(*drproc->mem),
+ GFP_KERNEL);
+ if (!drproc->mem)
+ return -ENOMEM;
+
+ for (i = 0; i < num_mems; i++) {
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ mem_names[i]);
+ drproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
+ if (IS_ERR(drproc->mem[i].cpu_addr)) {
+ dev_err(dev, "failed to parse and map %s memory\n",
+ mem_names[i]);
+ return PTR_ERR(drproc->mem[i].cpu_addr);
+ }
+ drproc->mem[i].bus_addr = res->start;
+ drproc->mem[i].dev_addr =
+ res->start & DA8XX_RPROC_LOCAL_ADDRESS_MASK;
+ drproc->mem[i].size = resource_size(res);
+
+ dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %p da 0x%x\n",
+ mem_names[i], &drproc->mem[i].bus_addr,
+ drproc->mem[i].size, drproc->mem[i].cpu_addr,
+ drproc->mem[i].dev_addr);
+ }
+ drproc->num_mems = num_mems;
+
+ return 0;
+}
+
static int da8xx_rproc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -184,12 +243,14 @@ static int da8xx_rproc_probe(struct platform_device *pdev)
return -EINVAL;
}
- bootreg_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ bootreg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ "host1cfg");
bootreg = devm_ioremap_resource(dev, bootreg_res);
if (IS_ERR(bootreg))
return PTR_ERR(bootreg);
- chipsig_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ chipsig_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ "chipsig");
chipsig = devm_ioremap_resource(dev, chipsig_res);
if (IS_ERR(chipsig))
return PTR_ERR(chipsig);
@@ -201,16 +262,31 @@ static int da8xx_rproc_probe(struct platform_device *pdev)
return PTR_ERR(dsp_clk);
}
+ if (dev->of_node) {
+ ret = of_reserved_mem_device_init(dev);
+ if (ret) {
+ dev_err(dev, "device does not have specific CMA pool: %d\n",
+ ret);
+ return ret;
+ }
+ }
+
rproc = rproc_alloc(dev, "dsp", &da8xx_rproc_ops, da8xx_fw_name,
sizeof(*drproc));
- if (!rproc)
- return -ENOMEM;
+ if (!rproc) {
+ ret = -ENOMEM;
+ goto free_mem;
+ }
drproc = rproc->priv;
drproc->rproc = rproc;
drproc->dsp_clk = dsp_clk;
rproc->has_iommu = false;
+ ret = da8xx_rproc_get_internal_memories(pdev, drproc);
+ if (ret)
+ goto free_rproc;
+
platform_set_drvdata(pdev, rproc);
/* everything the ISR needs is now setup, so hook it up */
@@ -247,7 +323,9 @@ static int da8xx_rproc_probe(struct platform_device *pdev)
free_rproc:
rproc_free(rproc);
-
+free_mem:
+ if (dev->of_node)
+ of_reserved_mem_device_release(dev);
return ret;
}
@@ -255,6 +333,7 @@ static int da8xx_rproc_remove(struct platform_device *pdev)
{
struct rproc *rproc = platform_get_drvdata(pdev);
struct da8xx_rproc *drproc = (struct da8xx_rproc *)rproc->priv;
+ struct device *dev = &pdev->dev;
/*
* The devm subsystem might end up releasing things before
@@ -265,15 +344,24 @@ static int da8xx_rproc_remove(struct platform_device *pdev)
rproc_del(rproc);
rproc_free(rproc);
+ if (dev->of_node)
+ of_reserved_mem_device_release(dev);
return 0;
}
+static const struct of_device_id davinci_rproc_of_match[] __maybe_unused = {
+ { .compatible = "ti,da850-dsp", },
+ { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, davinci_rproc_of_match);
+
static struct platform_driver da8xx_rproc_driver = {
.probe = da8xx_rproc_probe,
.remove = da8xx_rproc_remove,
.driver = {
.name = "davinci-rproc",
+ .of_match_table = of_match_ptr(davinci_rproc_of_match),
},
};
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
new file mode 100644
index 000000000000..612d91403341
--- /dev/null
+++ b/drivers/remoteproc/imx_rproc.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright (c) 2017 Pengutronix, Oleksij Rempel <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ */
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/remoteproc.h>
+
+#define IMX7D_SRC_SCR 0x0C
+#define IMX7D_ENABLE_M4 BIT(3)
+#define IMX7D_SW_M4P_RST BIT(2)
+#define IMX7D_SW_M4C_RST BIT(1)
+#define IMX7D_SW_M4C_NON_SCLR_RST BIT(0)
+
+#define IMX7D_M4_RST_MASK (IMX7D_ENABLE_M4 | IMX7D_SW_M4P_RST \
+ | IMX7D_SW_M4C_RST \
+ | IMX7D_SW_M4C_NON_SCLR_RST)
+
+#define IMX7D_M4_START (IMX7D_ENABLE_M4 | IMX7D_SW_M4P_RST \
+ | IMX7D_SW_M4C_RST)
+#define IMX7D_M4_STOP IMX7D_SW_M4C_NON_SCLR_RST
+
+/* Address: 0x020D8000 */
+#define IMX6SX_SRC_SCR 0x00
+#define IMX6SX_ENABLE_M4 BIT(22)
+#define IMX6SX_SW_M4P_RST BIT(12)
+#define IMX6SX_SW_M4C_NON_SCLR_RST BIT(4)
+#define IMX6SX_SW_M4C_RST BIT(3)
+
+#define IMX6SX_M4_START (IMX6SX_ENABLE_M4 | IMX6SX_SW_M4P_RST \
+ | IMX6SX_SW_M4C_RST)
+#define IMX6SX_M4_STOP IMX6SX_SW_M4C_NON_SCLR_RST
+#define IMX6SX_M4_RST_MASK (IMX6SX_ENABLE_M4 | IMX6SX_SW_M4P_RST \
+ | IMX6SX_SW_M4C_NON_SCLR_RST \
+ | IMX6SX_SW_M4C_RST)
+
+#define IMX7D_RPROC_MEM_MAX 8
+
+/**
+ * struct imx_rproc_mem - slim internal memory structure
+ * @cpu_addr: MPU virtual address of the memory region
+ * @sys_addr: Bus address used to access the memory region
+ * @size: Size of the memory region
+ */
+struct imx_rproc_mem {
+ void __iomem *cpu_addr;
+ phys_addr_t sys_addr;
+ size_t size;
+};
+
+/* att flags */
+/* M4 own area. Can be mapped at probe */
+#define ATT_OWN BIT(1)
+
+/* address translation table */
+struct imx_rproc_att {
+ u32 da; /* device address (From Cortex M4 view)*/
+ u32 sa; /* system bus address */
+ u32 size; /* size of reg range */
+ int flags;
+};
+
+struct imx_rproc_dcfg {
+ u32 src_reg;
+ u32 src_mask;
+ u32 src_start;
+ u32 src_stop;
+ const struct imx_rproc_att *att;
+ size_t att_size;
+};
+
+struct imx_rproc {
+ struct device *dev;
+ struct regmap *regmap;
+ struct rproc *rproc;
+ const struct imx_rproc_dcfg *dcfg;
+ struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX];
+ struct clk *clk;
+};
+
+static const struct imx_rproc_att imx_rproc_att_imx7d[] = {
+ /* dev addr , sys addr , size , flags */
+ /* OCRAM_S (M4 Boot code) - alias */
+ { 0x00000000, 0x00180000, 0x00008000, 0 },
+ /* OCRAM_S (Code) */
+ { 0x00180000, 0x00180000, 0x00008000, ATT_OWN },
+ /* OCRAM (Code) - alias */
+ { 0x00900000, 0x00900000, 0x00020000, 0 },
+ /* OCRAM_EPDC (Code) - alias */
+ { 0x00920000, 0x00920000, 0x00020000, 0 },
+ /* OCRAM_PXP (Code) - alias */
+ { 0x00940000, 0x00940000, 0x00008000, 0 },
+ /* TCML (Code) */
+ { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN },
+ /* DDR (Code) - alias, first part of DDR (Data) */
+ { 0x10000000, 0x80000000, 0x0FFF0000, 0 },
+
+ /* TCMU (Data) */
+ { 0x20000000, 0x00800000, 0x00008000, ATT_OWN },
+ /* OCRAM (Data) */
+ { 0x20200000, 0x00900000, 0x00020000, 0 },
+ /* OCRAM_EPDC (Data) */
+ { 0x20220000, 0x00920000, 0x00020000, 0 },
+ /* OCRAM_PXP (Data) */
+ { 0x20240000, 0x00940000, 0x00008000, 0 },
+ /* DDR (Data) */
+ { 0x80000000, 0x80000000, 0x60000000, 0 },
+};
+
+static const struct imx_rproc_att imx_rproc_att_imx6sx[] = {
+ /* dev addr , sys addr , size , flags */
+ /* TCML (M4 Boot Code) - alias */
+ { 0x00000000, 0x007F8000, 0x00008000, 0 },
+ /* OCRAM_S (Code) */
+ { 0x00180000, 0x008F8000, 0x00004000, 0 },
+ /* OCRAM_S (Code) - alias */
+ { 0x00180000, 0x008FC000, 0x00004000, 0 },
+ /* TCML (Code) */
+ { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN },
+ /* DDR (Code) - alias, first part of DDR (Data) */
+ { 0x10000000, 0x80000000, 0x0FFF8000, 0 },
+
+ /* TCMU (Data) */
+ { 0x20000000, 0x00800000, 0x00008000, ATT_OWN },
+ /* OCRAM_S (Data) - alias? */
+ { 0x208F8000, 0x008F8000, 0x00004000, 0 },
+ /* DDR (Data) */
+ { 0x80000000, 0x80000000, 0x60000000, 0 },
+};
+
+static const struct imx_rproc_dcfg imx_rproc_cfg_imx7d = {
+ .src_reg = IMX7D_SRC_SCR,
+ .src_mask = IMX7D_M4_RST_MASK,
+ .src_start = IMX7D_M4_START,
+ .src_stop = IMX7D_M4_STOP,
+ .att = imx_rproc_att_imx7d,
+ .att_size = ARRAY_SIZE(imx_rproc_att_imx7d),
+};
+
+static const struct imx_rproc_dcfg imx_rproc_cfg_imx6sx = {
+ .src_reg = IMX6SX_SRC_SCR,
+ .src_mask = IMX6SX_M4_RST_MASK,
+ .src_start = IMX6SX_M4_START,
+ .src_stop = IMX6SX_M4_STOP,
+ .att = imx_rproc_att_imx6sx,
+ .att_size = ARRAY_SIZE(imx_rproc_att_imx6sx),
+};
+
+static int imx_rproc_start(struct rproc *rproc)
+{
+ struct imx_rproc *priv = rproc->priv;
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+ struct device *dev = priv->dev;
+ int ret;
+
+ ret = regmap_update_bits(priv->regmap, dcfg->src_reg,
+ dcfg->src_mask, dcfg->src_start);
+ if (ret)
+ dev_err(dev, "Filed to enable M4!\n");
+
+ return ret;
+}
+
+static int imx_rproc_stop(struct rproc *rproc)
+{
+ struct imx_rproc *priv = rproc->priv;
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+ struct device *dev = priv->dev;
+ int ret;
+
+ ret = regmap_update_bits(priv->regmap, dcfg->src_reg,
+ dcfg->src_mask, dcfg->src_stop);
+ if (ret)
+ dev_err(dev, "Filed to stop M4!\n");
+
+ return ret;
+}
+
+static int imx_rproc_da_to_sys(struct imx_rproc *priv, u64 da,
+ int len, u64 *sys)
+{
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+ int i;
+
+ /* parse address translation table */
+ for (i = 0; i < dcfg->att_size; i++) {
+ const struct imx_rproc_att *att = &dcfg->att[i];
+
+ if (da >= att->da && da + len < att->da + att->size) {
+ unsigned int offset = da - att->da;
+
+ *sys = att->sa + offset;
+ return 0;
+ }
+ }
+
+ dev_warn(priv->dev, "Translation filed: da = 0x%llx len = 0x%x\n",
+ da, len);
+ return -ENOENT;
+}
+
+static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, int len)
+{
+ struct imx_rproc *priv = rproc->priv;
+ void *va = NULL;
+ u64 sys;
+ int i;
+
+ if (len <= 0)
+ return NULL;
+
+ /*
+ * On device side we have many aliases, so we need to convert device
+ * address (M4) to system bus address first.
+ */
+ if (imx_rproc_da_to_sys(priv, da, len, &sys))
+ return NULL;
+
+ for (i = 0; i < IMX7D_RPROC_MEM_MAX; i++) {
+ if (sys >= priv->mem[i].sys_addr && sys + len <
+ priv->mem[i].sys_addr + priv->mem[i].size) {
+ unsigned int offset = sys - priv->mem[i].sys_addr;
+ /* __force to make sparse happy with type conversion */
+ va = (__force void *)(priv->mem[i].cpu_addr + offset);
+ break;
+ }
+ }
+
+ dev_dbg(&rproc->dev, "da = 0x%llx len = 0x%x va = 0x%p\n", da, len, va);
+
+ return va;
+}
+
+static const struct rproc_ops imx_rproc_ops = {
+ .start = imx_rproc_start,
+ .stop = imx_rproc_stop,
+ .da_to_va = imx_rproc_da_to_va,
+};
+
+static int imx_rproc_addr_init(struct imx_rproc *priv,
+ struct platform_device *pdev)
+{
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ int a, b = 0, err, nph;
+
+ /* remap required addresses */
+ for (a = 0; a < dcfg->att_size; a++) {
+ const struct imx_rproc_att *att = &dcfg->att[a];
+
+ if (!(att->flags & ATT_OWN))
+ continue;
+
+ if (b > IMX7D_RPROC_MEM_MAX)
+ break;
+
+ priv->mem[b].cpu_addr = devm_ioremap(&pdev->dev,
+ att->sa, att->size);
+ if (IS_ERR(priv->mem[b].cpu_addr)) {
+ dev_err(dev, "devm_ioremap_resource failed\n");
+ err = PTR_ERR(priv->mem[b].cpu_addr);
+ return err;
+ }
+ priv->mem[b].sys_addr = att->sa;
+ priv->mem[b].size = att->size;
+ b++;
+ }
+
+ /* memory-region is optional property */
+ nph = of_count_phandle_with_args(np, "memory-region", NULL);
+ if (nph <= 0)
+ return 0;
+
+ /* remap optional addresses */
+ for (a = 0; a < nph; a++) {
+ struct device_node *node;
+ struct resource res;
+
+ node = of_parse_phandle(np, "memory-region", a);
+ err = of_address_to_resource(node, 0, &res);
+ if (err) {
+ dev_err(dev, "unable to resolve memory region\n");
+ return err;
+ }
+
+ if (b > IMX7D_RPROC_MEM_MAX)
+ break;
+
+ priv->mem[b].cpu_addr = devm_ioremap_resource(&pdev->dev, &res);
+ if (IS_ERR(priv->mem[b].cpu_addr)) {
+ dev_err(dev, "devm_ioremap_resource failed\n");
+ err = PTR_ERR(priv->mem[b].cpu_addr);
+ return err;
+ }
+ priv->mem[b].sys_addr = res.start;
+ priv->mem[b].size = resource_size(&res);
+ b++;
+ }
+
+ return 0;
+}
+
+static int imx_rproc_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ struct imx_rproc *priv;
+ struct rproc *rproc;
+ struct regmap_config config = { .name = "imx-rproc" };
+ const struct imx_rproc_dcfg *dcfg;
+ struct regmap *regmap;
+ int ret;
+
+ regmap = syscon_regmap_lookup_by_phandle(np, "syscon");
+ if (IS_ERR(regmap)) {
+ dev_err(dev, "failed to find syscon\n");
+ return PTR_ERR(regmap);
+ }
+ regmap_attach_dev(dev, regmap, &config);
+
+ /* set some other name then imx */
+ rproc = rproc_alloc(dev, "imx-rproc", &imx_rproc_ops,
+ NULL, sizeof(*priv));
+ if (!rproc) {
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ dcfg = of_device_get_match_data(dev);
+ if (!dcfg)
+ return -EINVAL;
+
+ priv = rproc->priv;
+ priv->rproc = rproc;
+ priv->regmap = regmap;
+ priv->dcfg = dcfg;
+ priv->dev = dev;
+
+ dev_set_drvdata(dev, rproc);
+
+ ret = imx_rproc_addr_init(priv, pdev);
+ if (ret) {
+ dev_err(dev, "filed on imx_rproc_addr_init\n");
+ goto err_put_rproc;
+ }
+
+ priv->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(priv->clk)) {
+ dev_err(dev, "Failed to get clock\n");
+ rproc_free(rproc);
+ return PTR_ERR(priv->clk);
+ }
+
+ /*
+ * clk for M4 block including memory. Should be
+ * enabled before .start for FW transfer.
+ */
+ ret = clk_prepare_enable(priv->clk);
+ if (ret) {
+ dev_err(&rproc->dev, "Failed to enable clock\n");
+ rproc_free(rproc);
+ return ret;
+ }
+
+ ret = rproc_add(rproc);
+ if (ret) {
+ dev_err(dev, "rproc_add failed\n");
+ goto err_put_clk;
+ }
+
+ return ret;
+
+err_put_clk:
+ clk_disable_unprepare(priv->clk);
+err_put_rproc:
+ rproc_free(rproc);
+err:
+ return ret;
+}
+
+static int imx_rproc_remove(struct platform_device *pdev)
+{
+ struct rproc *rproc = platform_get_drvdata(pdev);
+ struct imx_rproc *priv = rproc->priv;
+
+ clk_disable_unprepare(priv->clk);
+ rproc_del(rproc);
+ rproc_free(rproc);
+
+ return 0;
+}
+
+static const struct of_device_id imx_rproc_of_match[] = {
+ { .compatible = "fsl,imx7d-cm4", .data = &imx_rproc_cfg_imx7d },
+ { .compatible = "fsl,imx6sx-cm4", .data = &imx_rproc_cfg_imx6sx },
+ {},
+};
+MODULE_DEVICE_TABLE(of, imx_rproc_of_match);
+
+static struct platform_driver imx_rproc_driver = {
+ .probe = imx_rproc_probe,
+ .remove = imx_rproc_remove,
+ .driver = {
+ .name = "imx-rproc",
+ .of_match_table = imx_rproc_of_match,
+ },
+};
+
+module_platform_driver(imx_rproc_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("IMX6SX/7D remote processor control driver");
+MODULE_AUTHOR("Oleksij Rempel <[email protected]>");
diff --git a/drivers/remoteproc/keystone_remoteproc.c b/drivers/remoteproc/keystone_remoteproc.c
index 5f776bfd674a..aaac31134e39 100644
--- a/drivers/remoteproc/keystone_remoteproc.c
+++ b/drivers/remoteproc/keystone_remoteproc.c
@@ -410,7 +410,7 @@ static int keystone_rproc_probe(struct platform_device *pdev)
if (ret)
goto free_rproc;
- ksproc->reset = devm_reset_control_get(dev, NULL);
+ ksproc->reset = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(ksproc->reset)) {
ret = PTR_ERR(ksproc->reset);
goto free_rproc;
@@ -505,6 +505,7 @@ static const struct of_device_id keystone_rproc_of_match[] = {
{ .compatible = "ti,k2hk-dsp", },
{ .compatible = "ti,k2l-dsp", },
{ .compatible = "ti,k2e-dsp", },
+ { .compatible = "ti,k2g-dsp", },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, keystone_rproc_of_match);
diff --git a/drivers/remoteproc/qcom_adsp_pil.c b/drivers/remoteproc/qcom_adsp_pil.c
index 49fe2f807e1d..3f6af54dbc96 100644
--- a/drivers/remoteproc/qcom_adsp_pil.c
+++ b/drivers/remoteproc/qcom_adsp_pil.c
@@ -38,6 +38,7 @@ struct adsp_data {
const char *firmware_name;
int pas_id;
bool has_aggre2_clk;
+ const char *ssr_name;
};
struct qcom_adsp {
@@ -71,7 +72,9 @@ struct qcom_adsp {
void *mem_region;
size_t mem_size;
+ struct qcom_rproc_glink glink_subdev;
struct qcom_rproc_subdev smd_subdev;
+ struct qcom_rproc_ssr ssr_subdev;
};
static int adsp_load(struct rproc *rproc, const struct firmware *fw)
@@ -266,10 +269,7 @@ static int adsp_init_regulator(struct qcom_adsp *adsp)
regulator_set_load(adsp->cx_supply, 100000);
adsp->px_supply = devm_regulator_get(adsp->dev, "px");
- if (IS_ERR(adsp->px_supply))
- return PTR_ERR(adsp->px_supply);
-
- return 0;
+ return PTR_ERR_OR_ZERO(adsp->px_supply);
}
static int adsp_request_irq(struct qcom_adsp *adsp,
@@ -401,7 +401,9 @@ static int adsp_probe(struct platform_device *pdev)
goto free_rproc;
}
+ qcom_add_glink_subdev(rproc, &adsp->glink_subdev);
qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
+ qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
ret = rproc_add(rproc);
if (ret)
@@ -422,7 +424,9 @@ static int adsp_remove(struct platform_device *pdev)
qcom_smem_state_put(adsp->state);
rproc_del(adsp->rproc);
+ qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
+ qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
rproc_free(adsp->rproc);
return 0;
@@ -433,6 +437,7 @@ static const struct adsp_data adsp_resource_init = {
.firmware_name = "adsp.mdt",
.pas_id = 1,
.has_aggre2_clk = false,
+ .ssr_name = "lpass",
};
static const struct adsp_data slpi_resource_init = {
@@ -440,6 +445,7 @@ static const struct adsp_data slpi_resource_init = {
.firmware_name = "slpi.mdt",
.pas_id = 12,
.has_aggre2_clk = true,
+ .ssr_name = "dsps",
};
static const struct of_device_id adsp_of_match[] = {
diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c
index bb90481215c6..d487040b528b 100644
--- a/drivers/remoteproc/qcom_common.c
+++ b/drivers/remoteproc/qcom_common.c
@@ -18,13 +18,19 @@
#include <linux/firmware.h>
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/notifier.h>
#include <linux/remoteproc.h>
+#include <linux/rpmsg/qcom_glink.h>
#include <linux/rpmsg/qcom_smd.h>
#include "remoteproc_internal.h"
#include "qcom_common.h"
+#define to_glink_subdev(d) container_of(d, struct qcom_rproc_glink, subdev)
#define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev)
+#define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, subdev)
+
+static BLOCKING_NOTIFIER_HEAD(ssr_notifiers);
/**
* qcom_mdt_find_rsc_table() - provide dummy resource table for remoteproc
@@ -45,13 +51,60 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
}
EXPORT_SYMBOL_GPL(qcom_mdt_find_rsc_table);
+static int glink_subdev_probe(struct rproc_subdev *subdev)
+{
+ struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
+
+ glink->edge = qcom_glink_smem_register(glink->dev, glink->node);
+
+ return IS_ERR(glink->edge) ? PTR_ERR(glink->edge) : 0;
+}
+
+static void glink_subdev_remove(struct rproc_subdev *subdev)
+{
+ struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
+
+ qcom_glink_smem_unregister(glink->edge);
+ glink->edge = NULL;
+}
+
+/**
+ * qcom_add_glink_subdev() - try to add a GLINK subdevice to rproc
+ * @rproc: rproc handle to parent the subdevice
+ * @glink: reference to a GLINK subdev context
+ */
+void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
+{
+ struct device *dev = &rproc->dev;
+
+ glink->node = of_get_child_by_name(dev->parent->of_node, "glink-edge");
+ if (!glink->node)
+ return;
+
+ glink->dev = dev;
+ rproc_add_subdev(rproc, &glink->subdev, glink_subdev_probe, glink_subdev_remove);
+}
+EXPORT_SYMBOL_GPL(qcom_add_glink_subdev);
+
+/**
+ * qcom_remove_glink_subdev() - remove a GLINK subdevice from rproc
+ * @rproc: rproc handle
+ * @glink: reference to a GLINK subdev context
+ */
+void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
+{
+ rproc_remove_subdev(rproc, &glink->subdev);
+ of_node_put(glink->node);
+}
+EXPORT_SYMBOL_GPL(qcom_remove_glink_subdev);
+
static int smd_subdev_probe(struct rproc_subdev *subdev)
{
struct qcom_rproc_subdev *smd = to_smd_subdev(subdev);
smd->edge = qcom_smd_register_edge(smd->dev, smd->node);
- return IS_ERR(smd->edge) ? PTR_ERR(smd->edge) : 0;
+ return PTR_ERR_OR_ZERO(smd->edge);
}
static void smd_subdev_remove(struct rproc_subdev *subdev)
@@ -92,5 +145,72 @@ void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd)
}
EXPORT_SYMBOL_GPL(qcom_remove_smd_subdev);
+/**
+ * qcom_register_ssr_notifier() - register SSR notification handler
+ * @nb: notifier_block to notify for restart notifications
+ *
+ * Returns 0 on success, negative errno on failure.
+ *
+ * This register the @notify function as handler for restart notifications. As
+ * remote processors are stopped this function will be called, with the SSR
+ * name passed as a parameter.
+ */
+int qcom_register_ssr_notifier(struct notifier_block *nb)
+{
+ return blocking_notifier_chain_register(&ssr_notifiers, nb);
+}
+EXPORT_SYMBOL_GPL(qcom_register_ssr_notifier);
+
+/**
+ * qcom_unregister_ssr_notifier() - unregister SSR notification handler
+ * @nb: notifier_block to unregister
+ */
+void qcom_unregister_ssr_notifier(struct notifier_block *nb)
+{
+ blocking_notifier_chain_unregister(&ssr_notifiers, nb);
+}
+EXPORT_SYMBOL_GPL(qcom_unregister_ssr_notifier);
+
+static int ssr_notify_start(struct rproc_subdev *subdev)
+{
+ return 0;
+}
+
+static void ssr_notify_stop(struct rproc_subdev *subdev)
+{
+ struct qcom_rproc_ssr *ssr = to_ssr_subdev(subdev);
+
+ blocking_notifier_call_chain(&ssr_notifiers, 0, (void *)ssr->name);
+}
+
+/**
+ * qcom_add_ssr_subdev() - register subdevice as restart notification source
+ * @rproc: rproc handle
+ * @ssr: SSR subdevice handle
+ * @ssr_name: identifier to use for notifications originating from @rproc
+ *
+ * As the @ssr is registered with the @rproc SSR events will be sent to all
+ * registered listeners in the system as the remoteproc is shut down.
+ */
+void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr,
+ const char *ssr_name)
+{
+ ssr->name = ssr_name;
+
+ rproc_add_subdev(rproc, &ssr->subdev, ssr_notify_start, ssr_notify_stop);
+}
+EXPORT_SYMBOL_GPL(qcom_add_ssr_subdev);
+
+/**
+ * qcom_remove_ssr_subdev() - remove subdevice as restart notification source
+ * @rproc: rproc handle
+ * @ssr: SSR subdevice handle
+ */
+void qcom_remove_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr)
+{
+ rproc_remove_subdev(rproc, &ssr->subdev);
+}
+EXPORT_SYMBOL_GPL(qcom_remove_ssr_subdev);
+
MODULE_DESCRIPTION("Qualcomm Remoteproc helper driver");
MODULE_LICENSE("GPL v2");
diff --git a/drivers/remoteproc/qcom_common.h b/drivers/remoteproc/qcom_common.h
index db5c826d5cd4..4f8bc168473c 100644
--- a/drivers/remoteproc/qcom_common.h
+++ b/drivers/remoteproc/qcom_common.h
@@ -4,6 +4,14 @@
#include <linux/remoteproc.h>
#include "remoteproc_internal.h"
+struct qcom_rproc_glink {
+ struct rproc_subdev subdev;
+
+ struct device *dev;
+ struct device_node *node;
+ struct qcom_glink *edge;
+};
+
struct qcom_rproc_subdev {
struct rproc_subdev subdev;
@@ -12,11 +20,24 @@ struct qcom_rproc_subdev {
struct qcom_smd_edge *edge;
};
+struct qcom_rproc_ssr {
+ struct rproc_subdev subdev;
+
+ const char *name;
+};
+
struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
const struct firmware *fw,
int *tablesz);
+void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
+void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
+
void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
+void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr,
+ const char *ssr_name);
+void qcom_remove_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr);
+
#endif
diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c
index 8fd697a3cf8f..2d3d5ac92c06 100644
--- a/drivers/remoteproc/qcom_q6v5_pil.c
+++ b/drivers/remoteproc/qcom_q6v5_pil.c
@@ -153,6 +153,7 @@ struct q6v5 {
size_t mpss_size;
struct qcom_rproc_subdev smd_subdev;
+ struct qcom_rproc_ssr ssr_subdev;
};
static int q6v5_regulator_init(struct device *dev, struct reg_info *regs,
@@ -867,7 +868,8 @@ static int q6v5_init_clocks(struct device *dev, struct clk **clks,
static int q6v5_init_reset(struct q6v5 *qproc)
{
- qproc->mss_restart = devm_reset_control_get(qproc->dev, NULL);
+ qproc->mss_restart = devm_reset_control_get_exclusive(qproc->dev,
+ NULL);
if (IS_ERR(qproc->mss_restart)) {
dev_err(qproc->dev, "failed to acquire mss restart\n");
return PTR_ERR(qproc->mss_restart);
@@ -1038,6 +1040,7 @@ static int q6v5_probe(struct platform_device *pdev)
}
qcom_add_smd_subdev(rproc, &qproc->smd_subdev);
+ qcom_add_ssr_subdev(rproc, &qproc->ssr_subdev, "mpss");
ret = rproc_add(rproc);
if (ret)
@@ -1058,6 +1061,7 @@ static int q6v5_remove(struct platform_device *pdev)
rproc_del(qproc->rproc);
qcom_remove_smd_subdev(qproc->rproc, &qproc->smd_subdev);
+ qcom_remove_ssr_subdev(qproc->rproc, &qproc->ssr_subdev);
rproc_free(qproc->rproc);
return 0;
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 564061dcc019..eab14b414bf0 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -794,7 +794,7 @@ static void rproc_remove_subdevices(struct rproc *rproc)
{
struct rproc_subdev *subdev;
- list_for_each_entry(subdev, &rproc->subdevs, node)
+ list_for_each_entry_reverse(subdev, &rproc->subdevs, node)
subdev->remove(subdev);
}
@@ -1119,7 +1119,7 @@ static void rproc_crash_handler_work(struct work_struct *work)
}
/**
- * __rproc_boot() - boot a remote processor
+ * rproc_boot() - boot a remote processor
* @rproc: handle of a remote processor
*
* Boot a remote processor (i.e. load its firmware, power it on, ...).
@@ -1129,7 +1129,7 @@ static void rproc_crash_handler_work(struct work_struct *work)
*
* Returns 0 on success, and an appropriate error value otherwise.
*/
-static int __rproc_boot(struct rproc *rproc)
+int rproc_boot(struct rproc *rproc)
{
const struct firmware *firmware_p;
struct device *dev;
@@ -1180,15 +1180,6 @@ unlock_mutex:
mutex_unlock(&rproc->lock);
return ret;
}
-
-/**
- * rproc_boot() - boot a remote processor
- * @rproc: handle of a remote processor
- */
-int rproc_boot(struct rproc *rproc)
-{
- return __rproc_boot(rproc);
-}
EXPORT_SYMBOL(rproc_boot);
/**
@@ -1369,7 +1360,7 @@ static void rproc_type_release(struct device *dev)
kfree(rproc);
}
-static struct device_type rproc_type = {
+static const struct device_type rproc_type = {
.name = "remoteproc",
.release = rproc_type_release,
};
@@ -1440,6 +1431,7 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
rproc->dev.parent = dev;
rproc->dev.type = &rproc_type;
rproc->dev.class = &rproc_class;
+ rproc->dev.driver_data = rproc;
/* Assign a unique device index and name */
rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
@@ -1579,6 +1571,23 @@ void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev)
EXPORT_SYMBOL(rproc_remove_subdev);
/**
+ * rproc_get_by_child() - acquire rproc handle of @dev's ancestor
+ * @dev: child device to find ancestor of
+ *
+ * Returns the ancestor rproc instance, or NULL if not found.
+ */
+struct rproc *rproc_get_by_child(struct device *dev)
+{
+ for (dev = dev->parent; dev; dev = dev->parent) {
+ if (dev->type == &rproc_type)
+ return dev->driver_data;
+ }
+
+ return NULL;
+}
+EXPORT_SYMBOL(rproc_get_by_child);
+
+/**
* rproc_report_crash() - rproc crash reporter function
* @rproc: remote processor
* @type: crash type
diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h
index 1e9e5b3f021c..c1077bec5d0b 100644
--- a/drivers/remoteproc/remoteproc_internal.h
+++ b/drivers/remoteproc/remoteproc_internal.h
@@ -48,7 +48,6 @@ struct rproc_fw_ops {
/* from remoteproc_core.c */
void rproc_release(struct kref *kref);
irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
-int rproc_boot_nowait(struct rproc *rproc);
void rproc_vdev_release(struct kref *ref);
/* from remoteproc_virtio.c */
diff --git a/drivers/remoteproc/st_remoteproc.c b/drivers/remoteproc/st_remoteproc.c
index d534bf23dc56..aacef0ea3b90 100644
--- a/drivers/remoteproc/st_remoteproc.c
+++ b/drivers/remoteproc/st_remoteproc.c
@@ -212,7 +212,8 @@ static int st_rproc_parse_dt(struct platform_device *pdev)
int err;
if (ddata->config->sw_reset) {
- ddata->sw_reset = devm_reset_control_get(dev, "sw_reset");
+ ddata->sw_reset = devm_reset_control_get_exclusive(dev,
+ "sw_reset");
if (IS_ERR(ddata->sw_reset)) {
dev_err(dev, "Failed to get S/W Reset\n");
return PTR_ERR(ddata->sw_reset);
@@ -220,7 +221,8 @@ static int st_rproc_parse_dt(struct platform_device *pdev)
}
if (ddata->config->pwr_reset) {
- ddata->pwr_reset = devm_reset_control_get(dev, "pwr_reset");
+ ddata->pwr_reset = devm_reset_control_get_exclusive(dev,
+ "pwr_reset");
if (IS_ERR(ddata->pwr_reset)) {
dev_err(dev, "Failed to get Power Reset\n");
return PTR_ERR(ddata->pwr_reset);
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 608c071e4bbf..e2baecbb9dd3 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -34,12 +34,12 @@ config RESET_BERLIN
help
This enables the reset controller driver for Marvell Berlin SoCs.
-config RESET_GEMINI
- bool "Gemini Reset Driver" if COMPILE_TEST
- default ARCH_GEMINI
- select MFD_SYSCON
+config RESET_HSDK
+ bool "Synopsys HSDK Reset Driver"
+ depends on HAS_IOMEM
+ depends on ARC_SOC_HSDK || COMPILE_TEST
help
- This enables the reset controller driver for Cortina Systems Gemini.
+ This enables the reset controller driver for HSDK board.
config RESET_IMX7
bool "i.MX7 Reset Driver" if COMPILE_TEST
@@ -48,6 +48,12 @@ config RESET_IMX7
help
This enables the reset controller driver for i.MX7 SoCs.
+config RESET_LANTIQ
+ bool "Lantiq XWAY Reset Driver" if COMPILE_TEST
+ default SOC_TYPE_XWAY
+ help
+ This enables the reset controller driver for Lantiq / Intel XWAY SoCs.
+
config RESET_LPC18XX
bool "LPC18xx/43xx Reset Driver" if COMPILE_TEST
default ARCH_LPC18XX
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 7081f9da2599..af1c15c330b3 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -5,8 +5,9 @@ obj-$(CONFIG_ARCH_TEGRA) += tegra/
obj-$(CONFIG_RESET_A10SR) += reset-a10sr.o
obj-$(CONFIG_RESET_ATH79) += reset-ath79.o
obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
-obj-$(CONFIG_RESET_GEMINI) += reset-gemini.o
+obj-$(CONFIG_RESET_HSDK) += reset-hsdk.o
obj-$(CONFIG_RESET_IMX7) += reset-imx7.o
+obj-$(CONFIG_RESET_LANTIQ) += reset-lantiq.o
obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o
obj-$(CONFIG_RESET_MESON) += reset-meson.o
obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index 0090784ff410..1d21c6f7d56c 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -43,11 +43,24 @@ struct reset_control {
unsigned int id;
struct kref refcnt;
bool shared;
+ bool array;
atomic_t deassert_count;
atomic_t triggered_count;
};
/**
+ * struct reset_control_array - an array of reset controls
+ * @base: reset control for compatibility with reset control API functions
+ * @num_rstcs: number of reset controls
+ * @rstc: array of reset controls
+ */
+struct reset_control_array {
+ struct reset_control base;
+ unsigned int num_rstcs;
+ struct reset_control *rstc[];
+};
+
+/**
* of_reset_simple_xlate - translate reset_spec to the reset line number
* @rcdev: a pointer to the reset controller device
* @reset_spec: reset line specifier as found in the device tree
@@ -135,6 +148,65 @@ int devm_reset_controller_register(struct device *dev,
}
EXPORT_SYMBOL_GPL(devm_reset_controller_register);
+static inline struct reset_control_array *
+rstc_to_array(struct reset_control *rstc) {
+ return container_of(rstc, struct reset_control_array, base);
+}
+
+static int reset_control_array_reset(struct reset_control_array *resets)
+{
+ int ret, i;
+
+ for (i = 0; i < resets->num_rstcs; i++) {
+ ret = reset_control_reset(resets->rstc[i]);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int reset_control_array_assert(struct reset_control_array *resets)
+{
+ int ret, i;
+
+ for (i = 0; i < resets->num_rstcs; i++) {
+ ret = reset_control_assert(resets->rstc[i]);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ while (i--)
+ reset_control_deassert(resets->rstc[i]);
+ return ret;
+}
+
+static int reset_control_array_deassert(struct reset_control_array *resets)
+{
+ int ret, i;
+
+ for (i = 0; i < resets->num_rstcs; i++) {
+ ret = reset_control_deassert(resets->rstc[i]);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ while (i--)
+ reset_control_assert(resets->rstc[i]);
+ return ret;
+}
+
+static inline bool reset_control_is_array(struct reset_control *rstc)
+{
+ return rstc->array;
+}
+
/**
* reset_control_reset - reset the controlled device
* @rstc: reset controller
@@ -158,6 +230,9 @@ int reset_control_reset(struct reset_control *rstc)
if (WARN_ON(IS_ERR(rstc)))
return -EINVAL;
+ if (reset_control_is_array(rstc))
+ return reset_control_array_reset(rstc_to_array(rstc));
+
if (!rstc->rcdev->ops->reset)
return -ENOTSUPP;
@@ -202,8 +277,8 @@ int reset_control_assert(struct reset_control *rstc)
if (WARN_ON(IS_ERR(rstc)))
return -EINVAL;
- if (!rstc->rcdev->ops->assert)
- return -ENOTSUPP;
+ if (reset_control_is_array(rstc))
+ return reset_control_array_assert(rstc_to_array(rstc));
if (rstc->shared) {
if (WARN_ON(atomic_read(&rstc->triggered_count) != 0))
@@ -214,6 +289,21 @@ int reset_control_assert(struct reset_control *rstc)
if (atomic_dec_return(&rstc->deassert_count) != 0)
return 0;
+
+ /*
+ * Shared reset controls allow the reset line to be in any state
+ * after this call, so doing nothing is a valid option.
+ */
+ if (!rstc->rcdev->ops->assert)
+ return 0;
+ } else {
+ /*
+ * If the reset controller does not implement .assert(), there
+ * is no way to guarantee that the reset line is asserted after
+ * this call.
+ */
+ if (!rstc->rcdev->ops->assert)
+ return -ENOTSUPP;
}
return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id);
@@ -240,8 +330,8 @@ int reset_control_deassert(struct reset_control *rstc)
if (WARN_ON(IS_ERR(rstc)))
return -EINVAL;
- if (!rstc->rcdev->ops->deassert)
- return -ENOTSUPP;
+ if (reset_control_is_array(rstc))
+ return reset_control_array_deassert(rstc_to_array(rstc));
if (rstc->shared) {
if (WARN_ON(atomic_read(&rstc->triggered_count) != 0))
@@ -251,6 +341,16 @@ int reset_control_deassert(struct reset_control *rstc)
return 0;
}
+ /*
+ * If the reset controller does not implement .deassert(), we assume
+ * that it handles self-deasserting reset lines via .reset(). In that
+ * case, the reset lines are deasserted by default. If that is not the
+ * case, the reset controller driver should implement .deassert() and
+ * return -ENOTSUPP.
+ */
+ if (!rstc->rcdev->ops->deassert)
+ return 0;
+
return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id);
}
EXPORT_SYMBOL_GPL(reset_control_deassert);
@@ -266,7 +366,7 @@ int reset_control_status(struct reset_control *rstc)
if (!rstc)
return 0;
- if (WARN_ON(IS_ERR(rstc)))
+ if (WARN_ON(IS_ERR(rstc)) || reset_control_is_array(rstc))
return -EINVAL;
if (rstc->rcdev->ops->status)
@@ -404,6 +504,16 @@ struct reset_control *__reset_control_get(struct device *dev, const char *id,
}
EXPORT_SYMBOL_GPL(__reset_control_get);
+static void reset_control_array_put(struct reset_control_array *resets)
+{
+ int i;
+
+ mutex_lock(&reset_list_mutex);
+ for (i = 0; i < resets->num_rstcs; i++)
+ __reset_control_put_internal(resets->rstc[i]);
+ mutex_unlock(&reset_list_mutex);
+}
+
/**
* reset_control_put - free the reset controller
* @rstc: reset controller
@@ -413,6 +523,11 @@ void reset_control_put(struct reset_control *rstc)
if (IS_ERR_OR_NULL(rstc))
return;
+ if (reset_control_is_array(rstc)) {
+ reset_control_array_put(rstc_to_array(rstc));
+ return;
+ }
+
mutex_lock(&reset_list_mutex);
__reset_control_put_internal(rstc);
mutex_unlock(&reset_list_mutex);
@@ -472,3 +587,116 @@ int device_reset(struct device *dev)
return ret;
}
EXPORT_SYMBOL_GPL(device_reset);
+
+/**
+ * APIs to manage an array of reset controls.
+ */
+/**
+ * of_reset_control_get_count - Count number of resets available with a device
+ *
+ * @node: device node that contains 'resets'.
+ *
+ * Returns positive reset count on success, or error number on failure and
+ * on count being zero.
+ */
+static int of_reset_control_get_count(struct device_node *node)
+{
+ int count;
+
+ if (!node)
+ return -EINVAL;
+
+ count = of_count_phandle_with_args(node, "resets", "#reset-cells");
+ if (count == 0)
+ count = -ENOENT;
+
+ return count;
+}
+
+/**
+ * of_reset_control_array_get - Get a list of reset controls using
+ * device node.
+ *
+ * @np: device node for the device that requests the reset controls array
+ * @shared: whether reset controls are shared or not
+ * @optional: whether it is optional to get the reset controls
+ *
+ * Returns pointer to allocated reset_control_array on success or
+ * error on failure
+ */
+struct reset_control *
+of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
+{
+ struct reset_control_array *resets;
+ struct reset_control *rstc;
+ int num, i;
+
+ num = of_reset_control_get_count(np);
+ if (num < 0)
+ return optional ? NULL : ERR_PTR(num);
+
+ resets = kzalloc(sizeof(*resets) + sizeof(resets->rstc[0]) * num,
+ GFP_KERNEL);
+ if (!resets)
+ return ERR_PTR(-ENOMEM);
+
+ for (i = 0; i < num; i++) {
+ rstc = __of_reset_control_get(np, NULL, i, shared, optional);
+ if (IS_ERR(rstc))
+ goto err_rst;
+ resets->rstc[i] = rstc;
+ }
+ resets->num_rstcs = num;
+ resets->base.array = true;
+
+ return &resets->base;
+
+err_rst:
+ mutex_lock(&reset_list_mutex);
+ while (--i >= 0)
+ __reset_control_put_internal(resets->rstc[i]);
+ mutex_unlock(&reset_list_mutex);
+
+ kfree(resets);
+
+ return rstc;
+}
+EXPORT_SYMBOL_GPL(of_reset_control_array_get);
+
+/**
+ * devm_reset_control_array_get - Resource managed reset control array get
+ *
+ * @dev: device that requests the list of reset controls
+ * @shared: whether reset controls are shared or not
+ * @optional: whether it is optional to get the reset controls
+ *
+ * The reset control array APIs are intended for a list of resets
+ * that just have to be asserted or deasserted, without any
+ * requirements on the order.
+ *
+ * Returns pointer to allocated reset_control_array on success or
+ * error on failure
+ */
+struct reset_control *
+devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
+{
+ struct reset_control **devres;
+ struct reset_control *rstc;
+
+ devres = devres_alloc(devm_reset_control_release, sizeof(*devres),
+ GFP_KERNEL);
+ if (!devres)
+ return ERR_PTR(-ENOMEM);
+
+ rstc = of_reset_control_array_get(dev->of_node, shared, optional);
+ if (IS_ERR(rstc)) {
+ devres_free(devres);
+ return rstc;
+ }
+
+ *devres = rstc;
+ devres_add(dev, devres);
+
+ return rstc;
+}
+EXPORT_SYMBOL_GPL(devm_reset_control_array_get);
diff --git a/drivers/reset/reset-gemini.c b/drivers/reset/reset-gemini.c
deleted file mode 100644
index a2478997c75b..000000000000
--- a/drivers/reset/reset-gemini.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Cortina Gemini Reset controller driver
- * Copyright (C) 2017 Linus Walleij <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/err.h>
-#include <linux/init.h>
-#include <linux/mfd/syscon.h>
-#include <linux/regmap.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/reset-controller.h>
-#include <dt-bindings/reset/cortina,gemini-reset.h>
-
-/**
- * struct gemini_reset - gemini reset controller
- * @map: regmap to access the containing system controller
- * @rcdev: reset controller device
- */
-struct gemini_reset {
- struct regmap *map;
- struct reset_controller_dev rcdev;
-};
-
-#define GEMINI_GLOBAL_SOFT_RESET 0x0c
-
-#define to_gemini_reset(p) \
- container_of((p), struct gemini_reset, rcdev)
-
-/*
- * This is a self-deasserting reset controller.
- */
-static int gemini_reset(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- struct gemini_reset *gr = to_gemini_reset(rcdev);
-
- /* Manual says to always set BIT 30 (CPU1) to 1 */
- return regmap_write(gr->map,
- GEMINI_GLOBAL_SOFT_RESET,
- BIT(GEMINI_RESET_CPU1) | BIT(id));
-}
-
-static int gemini_reset_status(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- struct gemini_reset *gr = to_gemini_reset(rcdev);
- u32 val;
- int ret;
-
- ret = regmap_read(gr->map, GEMINI_GLOBAL_SOFT_RESET, &val);
- if (ret)
- return ret;
-
- return !!(val & BIT(id));
-}
-
-static const struct reset_control_ops gemini_reset_ops = {
- .reset = gemini_reset,
- .status = gemini_reset_status,
-};
-
-static int gemini_reset_probe(struct platform_device *pdev)
-{
- struct gemini_reset *gr;
- struct device *dev = &pdev->dev;
- struct device_node *np = dev->of_node;
- int ret;
-
- gr = devm_kzalloc(dev, sizeof(*gr), GFP_KERNEL);
- if (!gr)
- return -ENOMEM;
-
- gr->map = syscon_node_to_regmap(np);
- if (IS_ERR(gr->map)) {
- ret = PTR_ERR(gr->map);
- dev_err(dev, "unable to get regmap (%d)", ret);
- return ret;
- }
- gr->rcdev.owner = THIS_MODULE;
- gr->rcdev.nr_resets = 32;
- gr->rcdev.ops = &gemini_reset_ops;
- gr->rcdev.of_node = pdev->dev.of_node;
-
- ret = devm_reset_controller_register(&pdev->dev, &gr->rcdev);
- if (ret)
- return ret;
-
- dev_info(dev, "registered Gemini reset controller\n");
- return 0;
-}
-
-static const struct of_device_id gemini_reset_dt_ids[] = {
- { .compatible = "cortina,gemini-syscon", },
- { /* sentinel */ },
-};
-
-static struct platform_driver gemini_reset_driver = {
- .probe = gemini_reset_probe,
- .driver = {
- .name = "gemini-reset",
- .of_match_table = gemini_reset_dt_ids,
- .suppress_bind_attrs = true,
- },
-};
-builtin_platform_driver(gemini_reset_driver);
diff --git a/drivers/reset/reset-hsdk.c b/drivers/reset/reset-hsdk.c
new file mode 100644
index 000000000000..8bce391c6943
--- /dev/null
+++ b/drivers/reset/reset-hsdk.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2017 Synopsys.
+ *
+ * Synopsys HSDK Development platform reset driver.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+
+#define to_hsdk_rst(p) container_of((p), struct hsdk_rst, rcdev)
+
+struct hsdk_rst {
+ void __iomem *regs_ctl;
+ void __iomem *regs_rst;
+ spinlock_t lock;
+ struct reset_controller_dev rcdev;
+};
+
+static const u32 rst_map[] = {
+ BIT(16), /* APB_RST */
+ BIT(17), /* AXI_RST */
+ BIT(18), /* ETH_RST */
+ BIT(19), /* USB_RST */
+ BIT(20), /* SDIO_RST */
+ BIT(21), /* HDMI_RST */
+ BIT(22), /* GFX_RST */
+ BIT(25), /* DMAC_RST */
+ BIT(31), /* EBI_RST */
+};
+
+#define HSDK_MAX_RESETS ARRAY_SIZE(rst_map)
+
+#define CGU_SYS_RST_CTRL 0x0
+#define CGU_IP_SW_RESET 0x0
+#define CGU_IP_SW_RESET_DELAY_SHIFT 16
+#define CGU_IP_SW_RESET_DELAY_MASK GENMASK(31, CGU_IP_SW_RESET_DELAY_SHIFT)
+#define CGU_IP_SW_RESET_DELAY 0
+#define CGU_IP_SW_RESET_RESET BIT(0)
+#define SW_RESET_TIMEOUT 10000
+
+static void hsdk_reset_config(struct hsdk_rst *rst, unsigned long id)
+{
+ writel(rst_map[id], rst->regs_ctl + CGU_SYS_RST_CTRL);
+}
+
+static int hsdk_reset_do(struct hsdk_rst *rst)
+{
+ u32 reg;
+
+ reg = readl(rst->regs_rst + CGU_IP_SW_RESET);
+ reg &= ~CGU_IP_SW_RESET_DELAY_MASK;
+ reg |= CGU_IP_SW_RESET_DELAY << CGU_IP_SW_RESET_DELAY_SHIFT;
+ reg |= CGU_IP_SW_RESET_RESET;
+ writel(reg, rst->regs_rst + CGU_IP_SW_RESET);
+
+ /* wait till reset bit is back to 0 */
+ return readl_poll_timeout_atomic(rst->regs_rst + CGU_IP_SW_RESET, reg,
+ !(reg & CGU_IP_SW_RESET_RESET), 5, SW_RESET_TIMEOUT);
+}
+
+static int hsdk_reset_reset(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ struct hsdk_rst *rst = to_hsdk_rst(rcdev);
+ unsigned long flags;
+ int ret;
+
+ spin_lock_irqsave(&rst->lock, flags);
+ hsdk_reset_config(rst, id);
+ ret = hsdk_reset_do(rst);
+ spin_unlock_irqrestore(&rst->lock, flags);
+
+ return ret;
+}
+
+static const struct reset_control_ops hsdk_reset_ops = {
+ .reset = hsdk_reset_reset,
+};
+
+static int hsdk_reset_probe(struct platform_device *pdev)
+{
+ struct hsdk_rst *rst;
+ struct resource *mem;
+
+ rst = devm_kzalloc(&pdev->dev, sizeof(*rst), GFP_KERNEL);
+ if (!rst)
+ return -ENOMEM;
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ rst->regs_ctl = devm_ioremap_resource(&pdev->dev, mem);
+ if (IS_ERR(rst->regs_ctl))
+ return PTR_ERR(rst->regs_ctl);
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ rst->regs_rst = devm_ioremap_resource(&pdev->dev, mem);
+ if (IS_ERR(rst->regs_rst))
+ return PTR_ERR(rst->regs_rst);
+
+ spin_lock_init(&rst->lock);
+
+ rst->rcdev.owner = THIS_MODULE;
+ rst->rcdev.ops = &hsdk_reset_ops;
+ rst->rcdev.of_node = pdev->dev.of_node;
+ rst->rcdev.nr_resets = HSDK_MAX_RESETS;
+ rst->rcdev.of_reset_n_cells = 1;
+
+ return reset_controller_register(&rst->rcdev);
+}
+
+static const struct of_device_id hsdk_reset_dt_match[] = {
+ { .compatible = "snps,hsdk-reset" },
+ { },
+};
+
+static struct platform_driver hsdk_reset_driver = {
+ .probe = hsdk_reset_probe,
+ .driver = {
+ .name = "hsdk-reset",
+ .of_match_table = hsdk_reset_dt_match,
+ },
+};
+builtin_platform_driver(hsdk_reset_driver);
+
+MODULE_AUTHOR("Eugeniy Paltsev <[email protected]>");
+MODULE_DESCRIPTION("Synopsys HSDK SDP reset driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/reset/reset-lantiq.c b/drivers/reset/reset-lantiq.c
new file mode 100644
index 000000000000..11a582e50d30
--- /dev/null
+++ b/drivers/reset/reset-lantiq.c
@@ -0,0 +1,212 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Copyright (C) 2010 John Crispin <[email protected]>
+ * Copyright (C) 2013-2015 Lantiq Beteiligungs-GmbH & Co.KG
+ * Copyright (C) 2016 Martin Blumenstingl <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
+ */
+
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+
+#define LANTIQ_RCU_RESET_TIMEOUT 10000
+
+struct lantiq_rcu_reset_priv {
+ struct reset_controller_dev rcdev;
+ struct device *dev;
+ struct regmap *regmap;
+ u32 reset_offset;
+ u32 status_offset;
+};
+
+static struct lantiq_rcu_reset_priv *to_lantiq_rcu_reset_priv(
+ struct reset_controller_dev *rcdev)
+{
+ return container_of(rcdev, struct lantiq_rcu_reset_priv, rcdev);
+}
+
+static int lantiq_rcu_reset_status(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ struct lantiq_rcu_reset_priv *priv = to_lantiq_rcu_reset_priv(rcdev);
+ unsigned int status = (id >> 8) & 0x1f;
+ u32 val;
+ int ret;
+
+ ret = regmap_read(priv->regmap, priv->status_offset, &val);
+ if (ret)
+ return ret;
+
+ return !!(val & BIT(status));
+}
+
+static int lantiq_rcu_reset_status_timeout(struct reset_controller_dev *rcdev,
+ unsigned long id, bool assert)
+{
+ int ret;
+ int retry = LANTIQ_RCU_RESET_TIMEOUT;
+
+ do {
+ ret = lantiq_rcu_reset_status(rcdev, id);
+ if (ret < 0)
+ return ret;
+ if (ret == assert)
+ return 0;
+ usleep_range(20, 40);
+ } while (--retry);
+
+ return -ETIMEDOUT;
+}
+
+static int lantiq_rcu_reset_update(struct reset_controller_dev *rcdev,
+ unsigned long id, bool assert)
+{
+ struct lantiq_rcu_reset_priv *priv = to_lantiq_rcu_reset_priv(rcdev);
+ unsigned int set = id & 0x1f;
+ u32 val = assert ? BIT(set) : 0;
+ int ret;
+
+ ret = regmap_update_bits(priv->regmap, priv->reset_offset, BIT(set),
+ val);
+ if (ret) {
+ dev_err(priv->dev, "Failed to set reset bit %u\n", set);
+ return ret;
+ }
+
+
+ ret = lantiq_rcu_reset_status_timeout(rcdev, id, assert);
+ if (ret)
+ dev_err(priv->dev, "Failed to %s bit %u\n",
+ assert ? "assert" : "deassert", set);
+
+ return ret;
+}
+
+static int lantiq_rcu_reset_assert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ return lantiq_rcu_reset_update(rcdev, id, true);
+}
+
+static int lantiq_rcu_reset_deassert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ return lantiq_rcu_reset_update(rcdev, id, false);
+}
+
+static int lantiq_rcu_reset_reset(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ int ret;
+
+ ret = lantiq_rcu_reset_assert(rcdev, id);
+ if (ret)
+ return ret;
+
+ return lantiq_rcu_reset_deassert(rcdev, id);
+}
+
+static const struct reset_control_ops lantiq_rcu_reset_ops = {
+ .assert = lantiq_rcu_reset_assert,
+ .deassert = lantiq_rcu_reset_deassert,
+ .status = lantiq_rcu_reset_status,
+ .reset = lantiq_rcu_reset_reset,
+};
+
+static int lantiq_rcu_reset_of_parse(struct platform_device *pdev,
+ struct lantiq_rcu_reset_priv *priv)
+{
+ struct device *dev = &pdev->dev;
+ const __be32 *offset;
+
+ priv->regmap = syscon_node_to_regmap(dev->of_node->parent);
+ if (IS_ERR(priv->regmap)) {
+ dev_err(&pdev->dev, "Failed to lookup RCU regmap\n");
+ return PTR_ERR(priv->regmap);
+ }
+
+ offset = of_get_address(dev->of_node, 0, NULL, NULL);
+ if (!offset) {
+ dev_err(&pdev->dev, "Failed to get RCU reset offset\n");
+ return -ENOENT;
+ }
+ priv->reset_offset = __be32_to_cpu(*offset);
+
+ offset = of_get_address(dev->of_node, 1, NULL, NULL);
+ if (!offset) {
+ dev_err(&pdev->dev, "Failed to get RCU status offset\n");
+ return -ENOENT;
+ }
+ priv->status_offset = __be32_to_cpu(*offset);
+
+ return 0;
+}
+
+static int lantiq_rcu_reset_xlate(struct reset_controller_dev *rcdev,
+ const struct of_phandle_args *reset_spec)
+{
+ unsigned int status, set;
+
+ set = reset_spec->args[0];
+ status = reset_spec->args[1];
+
+ if (set >= rcdev->nr_resets || status >= rcdev->nr_resets)
+ return -EINVAL;
+
+ return (status << 8) | set;
+}
+
+static int lantiq_rcu_reset_probe(struct platform_device *pdev)
+{
+ struct lantiq_rcu_reset_priv *priv;
+ int err;
+
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ priv->dev = &pdev->dev;
+ platform_set_drvdata(pdev, priv);
+
+ err = lantiq_rcu_reset_of_parse(pdev, priv);
+ if (err)
+ return err;
+
+ priv->rcdev.ops = &lantiq_rcu_reset_ops;
+ priv->rcdev.owner = THIS_MODULE;
+ priv->rcdev.of_node = pdev->dev.of_node;
+ priv->rcdev.nr_resets = 32;
+ priv->rcdev.of_xlate = lantiq_rcu_reset_xlate;
+ priv->rcdev.of_reset_n_cells = 2;
+
+ return reset_controller_register(&priv->rcdev);
+}
+
+static const struct of_device_id lantiq_rcu_reset_dt_ids[] = {
+ { .compatible = "lantiq,danube-reset", },
+ { .compatible = "lantiq,xrx200-reset", },
+ { },
+};
+MODULE_DEVICE_TABLE(of, lantiq_rcu_reset_dt_ids);
+
+static struct platform_driver lantiq_rcu_reset_driver = {
+ .probe = lantiq_rcu_reset_probe,
+ .driver = {
+ .name = "lantiq-reset",
+ .of_match_table = lantiq_rcu_reset_dt_ids,
+ },
+};
+module_platform_driver(lantiq_rcu_reset_driver);
+
+MODULE_AUTHOR("Martin Blumenstingl <[email protected]>");
+MODULE_DESCRIPTION("Lantiq XWAY RCU Reset Controller Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c
index cd585cd2f04d..2c7dd1fd08df 100644
--- a/drivers/reset/reset-sunxi.c
+++ b/drivers/reset/reset-sunxi.c
@@ -107,7 +107,7 @@ static int sunxi_reset_init(struct device_node *np)
spin_lock_init(&data->lock);
data->rcdev.owner = THIS_MODULE;
- data->rcdev.nr_resets = size * 32;
+ data->rcdev.nr_resets = size * 8;
data->rcdev.ops = &sunxi_reset_ops;
data->rcdev.of_node = np;
@@ -162,7 +162,7 @@ static int sunxi_reset_probe(struct platform_device *pdev)
spin_lock_init(&data->lock);
data->rcdev.owner = THIS_MODULE;
- data->rcdev.nr_resets = resource_size(res) * 32;
+ data->rcdev.nr_resets = resource_size(res) * 8;
data->rcdev.ops = &sunxi_reset_ops;
data->rcdev.of_node = pdev->dev.of_node;
diff --git a/drivers/reset/reset-uniphier.c b/drivers/reset/reset-uniphier.c
index c4ba89832796..bda2dd196ae5 100644
--- a/drivers/reset/reset-uniphier.c
+++ b/drivers/reset/reset-uniphier.c
@@ -50,59 +50,35 @@ struct uniphier_reset_data {
}
/* System reset data */
-#define UNIPHIER_SLD3_SYS_RESET_NAND(id) \
- UNIPHIER_RESETX((id), 0x2004, 2)
-
-#define UNIPHIER_LD11_SYS_RESET_NAND(id) \
- UNIPHIER_RESETX((id), 0x200c, 0)
-
-#define UNIPHIER_LD11_SYS_RESET_EMMC(id) \
- UNIPHIER_RESETX((id), 0x200c, 2)
-
-#define UNIPHIER_SLD3_SYS_RESET_STDMAC(id) \
- UNIPHIER_RESETX((id), 0x2000, 10)
-
-#define UNIPHIER_LD11_SYS_RESET_STDMAC(id) \
- UNIPHIER_RESETX((id), 0x200c, 8)
-
-#define UNIPHIER_PRO4_SYS_RESET_GIO(id) \
- UNIPHIER_RESETX((id), 0x2000, 6)
-
-#define UNIPHIER_LD20_SYS_RESET_GIO(id) \
- UNIPHIER_RESETX((id), 0x200c, 5)
-
-#define UNIPHIER_PRO4_SYS_RESET_USB3(id, ch) \
- UNIPHIER_RESETX((id), 0x2000 + 0x4 * (ch), 17)
-
-static const struct uniphier_reset_data uniphier_sld3_sys_reset_data[] = {
- UNIPHIER_SLD3_SYS_RESET_NAND(2),
- UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* Ether, HSC, MIO */
+static const struct uniphier_reset_data uniphier_ld4_sys_reset_data[] = {
+ UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */
+ UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (Ether, HSC, MIO) */
UNIPHIER_RESET_END,
};
static const struct uniphier_reset_data uniphier_pro4_sys_reset_data[] = {
- UNIPHIER_SLD3_SYS_RESET_NAND(2),
- UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC, MIO, RLE */
- UNIPHIER_PRO4_SYS_RESET_GIO(12), /* Ether, SATA, USB3 */
- UNIPHIER_PRO4_SYS_RESET_USB3(14, 0),
- UNIPHIER_PRO4_SYS_RESET_USB3(15, 1),
+ UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */
+ UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, MIO, RLE) */
+ UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (Ether, SATA, USB3) */
+ UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */
+ UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */
UNIPHIER_RESET_END,
};
static const struct uniphier_reset_data uniphier_pro5_sys_reset_data[] = {
- UNIPHIER_SLD3_SYS_RESET_NAND(2),
- UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC */
- UNIPHIER_PRO4_SYS_RESET_GIO(12), /* PCIe, USB3 */
- UNIPHIER_PRO4_SYS_RESET_USB3(14, 0),
- UNIPHIER_PRO4_SYS_RESET_USB3(15, 1),
+ UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */
+ UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC) */
+ UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (PCIe, USB3) */
+ UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */
+ UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */
UNIPHIER_RESET_END,
};
static const struct uniphier_reset_data uniphier_pxs2_sys_reset_data[] = {
- UNIPHIER_SLD3_SYS_RESET_NAND(2),
- UNIPHIER_SLD3_SYS_RESET_STDMAC(8), /* HSC, RLE */
- UNIPHIER_PRO4_SYS_RESET_USB3(14, 0),
- UNIPHIER_PRO4_SYS_RESET_USB3(15, 1),
+ UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */
+ UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, RLE) */
+ UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */
+ UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */
UNIPHIER_RESETX(16, 0x2014, 4), /* USB30-PHY0 */
UNIPHIER_RESETX(17, 0x2014, 0), /* USB30-PHY1 */
UNIPHIER_RESETX(18, 0x2014, 2), /* USB30-PHY2 */
@@ -114,21 +90,27 @@ static const struct uniphier_reset_data uniphier_pxs2_sys_reset_data[] = {
};
static const struct uniphier_reset_data uniphier_ld11_sys_reset_data[] = {
- UNIPHIER_LD11_SYS_RESET_NAND(2),
- UNIPHIER_LD11_SYS_RESET_EMMC(4),
- UNIPHIER_LD11_SYS_RESET_STDMAC(8), /* HSC, MIO */
+ UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */
+ UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */
+ UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC, MIO) */
+ UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */
+ UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */
+ UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */
UNIPHIER_RESET_END,
};
static const struct uniphier_reset_data uniphier_ld20_sys_reset_data[] = {
- UNIPHIER_LD11_SYS_RESET_NAND(2),
- UNIPHIER_LD11_SYS_RESET_EMMC(4),
- UNIPHIER_LD11_SYS_RESET_STDMAC(8), /* HSC */
- UNIPHIER_LD20_SYS_RESET_GIO(12), /* PCIe, USB3 */
+ UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */
+ UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */
+ UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC) */
+ UNIPHIER_RESETX(12, 0x200c, 5), /* GIO (PCIe, USB3) */
UNIPHIER_RESETX(16, 0x200c, 12), /* USB30-PHY0 */
UNIPHIER_RESETX(17, 0x200c, 13), /* USB30-PHY1 */
UNIPHIER_RESETX(18, 0x200c, 14), /* USB30-PHY2 */
UNIPHIER_RESETX(19, 0x200c, 15), /* USB30-PHY3 */
+ UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */
+ UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */
+ UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */
UNIPHIER_RESET_END,
};
@@ -151,7 +133,7 @@ static const struct uniphier_reset_data uniphier_ld20_sys_reset_data[] = {
#define UNIPHIER_MIO_RESET_DMAC(id) \
UNIPHIER_RESETX((id), 0x110, 17)
-static const struct uniphier_reset_data uniphier_sld3_mio_reset_data[] = {
+static const struct uniphier_reset_data uniphier_ld4_mio_reset_data[] = {
UNIPHIER_MIO_RESET_SD(0, 0),
UNIPHIER_MIO_RESET_SD(1, 1),
UNIPHIER_MIO_RESET_SD(2, 2),
@@ -163,11 +145,9 @@ static const struct uniphier_reset_data uniphier_sld3_mio_reset_data[] = {
UNIPHIER_MIO_RESET_USB2(8, 0),
UNIPHIER_MIO_RESET_USB2(9, 1),
UNIPHIER_MIO_RESET_USB2(10, 2),
- UNIPHIER_MIO_RESET_USB2(11, 3),
UNIPHIER_MIO_RESET_USB2_BRIDGE(12, 0),
UNIPHIER_MIO_RESET_USB2_BRIDGE(13, 1),
UNIPHIER_MIO_RESET_USB2_BRIDGE(14, 2),
- UNIPHIER_MIO_RESET_USB2_BRIDGE(15, 3),
UNIPHIER_RESET_END,
};
@@ -216,6 +196,12 @@ static const struct uniphier_reset_data uniphier_pro4_peri_reset_data[] = {
UNIPHIER_RESET_END,
};
+/* Analog signal amplifiers reset data */
+static const struct uniphier_reset_data uniphier_ld11_adamv_reset_data[] = {
+ UNIPHIER_RESETX(0, 0x10, 6), /* EVEA */
+ UNIPHIER_RESET_END,
+};
+
/* core implementaton */
struct uniphier_reset_priv {
struct reset_controller_dev rcdev;
@@ -346,12 +332,8 @@ static int uniphier_reset_probe(struct platform_device *pdev)
static const struct of_device_id uniphier_reset_match[] = {
/* System reset */
{
- .compatible = "socionext,uniphier-sld3-reset",
- .data = uniphier_sld3_sys_reset_data,
- },
- {
.compatible = "socionext,uniphier-ld4-reset",
- .data = uniphier_sld3_sys_reset_data,
+ .data = uniphier_ld4_sys_reset_data,
},
{
.compatible = "socionext,uniphier-pro4-reset",
@@ -359,7 +341,7 @@ static const struct of_device_id uniphier_reset_match[] = {
},
{
.compatible = "socionext,uniphier-sld8-reset",
- .data = uniphier_sld3_sys_reset_data,
+ .data = uniphier_ld4_sys_reset_data,
},
{
.compatible = "socionext,uniphier-pro5-reset",
@@ -379,20 +361,16 @@ static const struct of_device_id uniphier_reset_match[] = {
},
/* Media I/O reset, SD reset */
{
- .compatible = "socionext,uniphier-sld3-mio-reset",
- .data = uniphier_sld3_mio_reset_data,
- },
- {
.compatible = "socionext,uniphier-ld4-mio-reset",
- .data = uniphier_sld3_mio_reset_data,
+ .data = uniphier_ld4_mio_reset_data,
},
{
.compatible = "socionext,uniphier-pro4-mio-reset",
- .data = uniphier_sld3_mio_reset_data,
+ .data = uniphier_ld4_mio_reset_data,
},
{
.compatible = "socionext,uniphier-sld8-mio-reset",
- .data = uniphier_sld3_mio_reset_data,
+ .data = uniphier_ld4_mio_reset_data,
},
{
.compatible = "socionext,uniphier-pro5-sd-reset",
@@ -404,7 +382,7 @@ static const struct of_device_id uniphier_reset_match[] = {
},
{
.compatible = "socionext,uniphier-ld11-mio-reset",
- .data = uniphier_sld3_mio_reset_data,
+ .data = uniphier_ld4_mio_reset_data,
},
{
.compatible = "socionext,uniphier-ld11-sd-reset",
@@ -443,6 +421,15 @@ static const struct of_device_id uniphier_reset_match[] = {
.compatible = "socionext,uniphier-ld20-peri-reset",
.data = uniphier_pro4_peri_reset_data,
},
+ /* Analog signal amplifiers reset */
+ {
+ .compatible = "socionext,uniphier-ld11-adamv-reset",
+ .data = uniphier_ld11_adamv_reset_data,
+ },
+ {
+ .compatible = "socionext,uniphier-ld20-adamv-reset",
+ .data = uniphier_ld11_adamv_reset_data,
+ },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, uniphier_reset_match);
diff --git a/drivers/reset/reset-zx2967.c b/drivers/reset/reset-zx2967.c
index 4dabb9ec4841..4f319f7753d4 100644
--- a/drivers/reset/reset-zx2967.c
+++ b/drivers/reset/reset-zx2967.c
@@ -55,7 +55,7 @@ static int zx2967_reset_deassert(struct reset_controller_dev *rcdev,
return zx2967_reset_act(rcdev, id, false);
}
-static struct reset_control_ops zx2967_reset_ops = {
+static const struct reset_control_ops zx2967_reset_ops = {
.assert = zx2967_reset_assert,
.deassert = zx2967_reset_deassert,
};
diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig
index 1323a245763b..0fe6eac46512 100644
--- a/drivers/rpmsg/Kconfig
+++ b/drivers/rpmsg/Kconfig
@@ -13,9 +13,13 @@ config RPMSG_CHAR
in /dev. They make it possible for user-space programs to send and
receive rpmsg packets.
+config RPMSG_QCOM_GLINK_NATIVE
+ tristate
+ select RPMSG
+
config RPMSG_QCOM_GLINK_RPM
tristate "Qualcomm RPM Glink driver"
- select RPMSG
+ select RPMSG_QCOM_GLINK_NATIVE
depends on HAS_IOMEM
depends on MAILBOX
help
@@ -23,6 +27,16 @@ config RPMSG_QCOM_GLINK_RPM
which serves as a channel for communication with the RPM in GLINK
enabled systems.
+config RPMSG_QCOM_GLINK_SMEM
+ tristate "Qualcomm SMEM Glink driver"
+ select RPMSG_QCOM_GLINK_NATIVE
+ depends on MAILBOX
+ depends on QCOM_SMEM
+ help
+ Say y here to enable support for the GLINK SMEM communication driver,
+ which provides support for using the GLINK communication protocol
+ over SMEM.
+
config RPMSG_QCOM_SMD
tristate "Qualcomm Shared Memory Driver (SMD)"
depends on QCOM_SMEM
diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile
index 28cc19088cc0..c71f4ab1ae17 100644
--- a/drivers/rpmsg/Makefile
+++ b/drivers/rpmsg/Makefile
@@ -1,5 +1,7 @@
obj-$(CONFIG_RPMSG) += rpmsg_core.o
obj-$(CONFIG_RPMSG_CHAR) += rpmsg_char.o
obj-$(CONFIG_RPMSG_QCOM_GLINK_RPM) += qcom_glink_rpm.o
+obj-$(CONFIG_RPMSG_QCOM_GLINK_NATIVE) += qcom_glink_native.o
+obj-$(CONFIG_RPMSG_QCOM_GLINK_SMEM) += qcom_glink_smem.o
obj-$(CONFIG_RPMSG_QCOM_SMD) += qcom_smd.o
obj-$(CONFIG_RPMSG_VIRTIO) += virtio_rpmsg_bus.o
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
new file mode 100644
index 000000000000..5a5e927ea50f
--- /dev/null
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -0,0 +1,1612 @@
+/*
+ * Copyright (c) 2016-2017, Linaro Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/idr.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/list.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/rpmsg.h>
+#include <linux/sizes.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+#include <linux/mailbox_client.h>
+
+#include "rpmsg_internal.h"
+#include "qcom_glink_native.h"
+
+#define GLINK_NAME_SIZE 32
+#define GLINK_VERSION_1 1
+
+#define RPM_GLINK_CID_MIN 1
+#define RPM_GLINK_CID_MAX 65536
+
+struct glink_msg {
+ __le16 cmd;
+ __le16 param1;
+ __le32 param2;
+ u8 data[];
+} __packed;
+
+/**
+ * struct glink_defer_cmd - deferred incoming control message
+ * @node: list node
+ * @msg: message header
+ * data: payload of the message
+ *
+ * Copy of a received control message, to be added to @rx_queue and processed
+ * by @rx_work of @qcom_glink.
+ */
+struct glink_defer_cmd {
+ struct list_head node;
+
+ struct glink_msg msg;
+ u8 data[];
+};
+
+/**
+ * struct glink_core_rx_intent - RX intent
+ * RX intent
+ *
+ * data: pointer to the data (may be NULL for zero-copy)
+ * id: remote or local intent ID
+ * size: size of the original intent (do not modify)
+ * reuse: To mark if the intent can be reused after first use
+ * in_use: To mark if intent is already in use for the channel
+ * offset: next write offset (initially 0)
+ */
+struct glink_core_rx_intent {
+ void *data;
+ u32 id;
+ size_t size;
+ bool reuse;
+ bool in_use;
+ u32 offset;
+
+ struct list_head node;
+};
+
+/**
+ * struct qcom_glink - driver context, relates to one remote subsystem
+ * @dev: reference to the associated struct device
+ * @mbox_client: mailbox client
+ * @mbox_chan: mailbox channel
+ * @rx_pipe: pipe object for receive FIFO
+ * @tx_pipe: pipe object for transmit FIFO
+ * @irq: IRQ for signaling incoming events
+ * @rx_work: worker for handling received control messages
+ * @rx_lock: protects the @rx_queue
+ * @rx_queue: queue of received control messages to be processed in @rx_work
+ * @tx_lock: synchronizes operations on the tx fifo
+ * @idr_lock: synchronizes @lcids and @rcids modifications
+ * @lcids: idr of all channels with a known local channel id
+ * @rcids: idr of all channels with a known remote channel id
+ */
+struct qcom_glink {
+ struct device *dev;
+
+ struct mbox_client mbox_client;
+ struct mbox_chan *mbox_chan;
+
+ struct qcom_glink_pipe *rx_pipe;
+ struct qcom_glink_pipe *tx_pipe;
+
+ int irq;
+
+ struct work_struct rx_work;
+ spinlock_t rx_lock;
+ struct list_head rx_queue;
+
+ struct mutex tx_lock;
+
+ spinlock_t idr_lock;
+ struct idr lcids;
+ struct idr rcids;
+ unsigned long features;
+
+ bool intentless;
+};
+
+enum {
+ GLINK_STATE_CLOSED,
+ GLINK_STATE_OPENING,
+ GLINK_STATE_OPEN,
+ GLINK_STATE_CLOSING,
+};
+
+/**
+ * struct glink_channel - internal representation of a channel
+ * @rpdev: rpdev reference, only used for primary endpoints
+ * @ept: rpmsg endpoint this channel is associated with
+ * @glink: qcom_glink context handle
+ * @refcount: refcount for the channel object
+ * @recv_lock: guard for @ept.cb
+ * @name: unique channel name/identifier
+ * @lcid: channel id, in local space
+ * @rcid: channel id, in remote space
+ * @intent_lock: lock for protection of @liids, @riids
+ * @liids: idr of all local intents
+ * @riids: idr of all remote intents
+ * @intent_work: worker responsible for transmitting rx_done packets
+ * @done_intents: list of intents that needs to be announced rx_done
+ * @buf: receive buffer, for gathering fragments
+ * @buf_offset: write offset in @buf
+ * @buf_size: size of current @buf
+ * @open_ack: completed once remote has acked the open-request
+ * @open_req: completed once open-request has been received
+ * @intent_req_lock: Synchronises multiple intent requests
+ * @intent_req_result: Result of intent request
+ * @intent_req_comp: Completion for intent_req signalling
+ */
+struct glink_channel {
+ struct rpmsg_endpoint ept;
+
+ struct rpmsg_device *rpdev;
+ struct qcom_glink *glink;
+
+ struct kref refcount;
+
+ spinlock_t recv_lock;
+
+ char *name;
+ unsigned int lcid;
+ unsigned int rcid;
+
+ spinlock_t intent_lock;
+ struct idr liids;
+ struct idr riids;
+ struct work_struct intent_work;
+ struct list_head done_intents;
+
+ struct glink_core_rx_intent *buf;
+ int buf_offset;
+ int buf_size;
+
+ struct completion open_ack;
+ struct completion open_req;
+
+ struct mutex intent_req_lock;
+ bool intent_req_result;
+ struct completion intent_req_comp;
+};
+
+#define to_glink_channel(_ept) container_of(_ept, struct glink_channel, ept)
+
+static const struct rpmsg_endpoint_ops glink_endpoint_ops;
+
+#define RPM_CMD_VERSION 0
+#define RPM_CMD_VERSION_ACK 1
+#define RPM_CMD_OPEN 2
+#define RPM_CMD_CLOSE 3
+#define RPM_CMD_OPEN_ACK 4
+#define RPM_CMD_INTENT 5
+#define RPM_CMD_RX_DONE 6
+#define RPM_CMD_RX_INTENT_REQ 7
+#define RPM_CMD_RX_INTENT_REQ_ACK 8
+#define RPM_CMD_TX_DATA 9
+#define RPM_CMD_CLOSE_ACK 11
+#define RPM_CMD_TX_DATA_CONT 12
+#define RPM_CMD_READ_NOTIF 13
+#define RPM_CMD_RX_DONE_W_REUSE 14
+
+#define GLINK_FEATURE_INTENTLESS BIT(1)
+
+static void qcom_glink_rx_done_work(struct work_struct *work);
+
+static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink,
+ const char *name)
+{
+ struct glink_channel *channel;
+
+ channel = kzalloc(sizeof(*channel), GFP_KERNEL);
+ if (!channel)
+ return ERR_PTR(-ENOMEM);
+
+ /* Setup glink internal glink_channel data */
+ spin_lock_init(&channel->recv_lock);
+ spin_lock_init(&channel->intent_lock);
+
+ channel->glink = glink;
+ channel->name = kstrdup(name, GFP_KERNEL);
+
+ init_completion(&channel->open_req);
+ init_completion(&channel->open_ack);
+
+ INIT_LIST_HEAD(&channel->done_intents);
+ INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work);
+
+ idr_init(&channel->liids);
+ idr_init(&channel->riids);
+ kref_init(&channel->refcount);
+
+ return channel;
+}
+
+static void qcom_glink_channel_release(struct kref *ref)
+{
+ struct glink_channel *channel = container_of(ref, struct glink_channel,
+ refcount);
+ unsigned long flags;
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ idr_destroy(&channel->liids);
+ idr_destroy(&channel->riids);
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+
+ kfree(channel->name);
+ kfree(channel);
+}
+
+static size_t qcom_glink_rx_avail(struct qcom_glink *glink)
+{
+ return glink->rx_pipe->avail(glink->rx_pipe);
+}
+
+static void qcom_glink_rx_peak(struct qcom_glink *glink,
+ void *data, unsigned int offset, size_t count)
+{
+ glink->rx_pipe->peak(glink->rx_pipe, data, offset, count);
+}
+
+static void qcom_glink_rx_advance(struct qcom_glink *glink, size_t count)
+{
+ glink->rx_pipe->advance(glink->rx_pipe, count);
+}
+
+static size_t qcom_glink_tx_avail(struct qcom_glink *glink)
+{
+ return glink->tx_pipe->avail(glink->tx_pipe);
+}
+
+static void qcom_glink_tx_write(struct qcom_glink *glink,
+ const void *hdr, size_t hlen,
+ const void *data, size_t dlen)
+{
+ glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen);
+}
+
+static int qcom_glink_tx(struct qcom_glink *glink,
+ const void *hdr, size_t hlen,
+ const void *data, size_t dlen, bool wait)
+{
+ unsigned int tlen = hlen + dlen;
+ int ret;
+
+ /* Reject packets that are too big */
+ if (tlen >= glink->tx_pipe->length)
+ return -EINVAL;
+
+ ret = mutex_lock_interruptible(&glink->tx_lock);
+ if (ret)
+ return ret;
+
+ while (qcom_glink_tx_avail(glink) < tlen) {
+ if (!wait) {
+ ret = -EAGAIN;
+ goto out;
+ }
+
+ usleep_range(10000, 15000);
+ }
+
+ qcom_glink_tx_write(glink, hdr, hlen, data, dlen);
+
+ mbox_send_message(glink->mbox_chan, NULL);
+ mbox_client_txdone(glink->mbox_chan, 0);
+
+out:
+ mutex_unlock(&glink->tx_lock);
+
+ return ret;
+}
+
+static int qcom_glink_send_version(struct qcom_glink *glink)
+{
+ struct glink_msg msg;
+
+ msg.cmd = cpu_to_le16(RPM_CMD_VERSION);
+ msg.param1 = cpu_to_le16(GLINK_VERSION_1);
+ msg.param2 = cpu_to_le32(glink->features);
+
+ return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
+}
+
+static void qcom_glink_send_version_ack(struct qcom_glink *glink)
+{
+ struct glink_msg msg;
+
+ msg.cmd = cpu_to_le16(RPM_CMD_VERSION_ACK);
+ msg.param1 = cpu_to_le16(GLINK_VERSION_1);
+ msg.param2 = cpu_to_le32(glink->features);
+
+ qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
+}
+
+static void qcom_glink_send_open_ack(struct qcom_glink *glink,
+ struct glink_channel *channel)
+{
+ struct glink_msg msg;
+
+ msg.cmd = cpu_to_le16(RPM_CMD_OPEN_ACK);
+ msg.param1 = cpu_to_le16(channel->rcid);
+ msg.param2 = cpu_to_le32(0);
+
+ qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
+}
+
+static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink,
+ unsigned int cid, bool granted)
+{
+ struct glink_channel *channel;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, cid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (!channel) {
+ dev_err(glink->dev, "unable to find channel\n");
+ return;
+ }
+
+ channel->intent_req_result = granted;
+ complete(&channel->intent_req_comp);
+}
+
+/**
+ * qcom_glink_send_open_req() - send a RPM_CMD_OPEN request to the remote
+ * @glink: Ptr to the glink edge
+ * @channel: Ptr to the channel that the open req is sent
+ *
+ * Allocates a local channel id and sends a RPM_CMD_OPEN message to the remote.
+ * Will return with refcount held, regardless of outcome.
+ *
+ * Returns 0 on success, negative errno otherwise.
+ */
+static int qcom_glink_send_open_req(struct qcom_glink *glink,
+ struct glink_channel *channel)
+{
+ struct {
+ struct glink_msg msg;
+ u8 name[GLINK_NAME_SIZE];
+ } __packed req;
+ int name_len = strlen(channel->name) + 1;
+ int req_len = ALIGN(sizeof(req.msg) + name_len, 8);
+ int ret;
+ unsigned long flags;
+
+ kref_get(&channel->refcount);
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ ret = idr_alloc_cyclic(&glink->lcids, channel,
+ RPM_GLINK_CID_MIN, RPM_GLINK_CID_MAX,
+ GFP_ATOMIC);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (ret < 0)
+ return ret;
+
+ channel->lcid = ret;
+
+ req.msg.cmd = cpu_to_le16(RPM_CMD_OPEN);
+ req.msg.param1 = cpu_to_le16(channel->lcid);
+ req.msg.param2 = cpu_to_le32(name_len);
+ strcpy(req.name, channel->name);
+
+ ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true);
+ if (ret)
+ goto remove_idr;
+
+ return 0;
+
+remove_idr:
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_remove(&glink->lcids, channel->lcid);
+ channel->lcid = 0;
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ return ret;
+}
+
+static void qcom_glink_send_close_req(struct qcom_glink *glink,
+ struct glink_channel *channel)
+{
+ struct glink_msg req;
+
+ req.cmd = cpu_to_le16(RPM_CMD_CLOSE);
+ req.param1 = cpu_to_le16(channel->lcid);
+ req.param2 = 0;
+
+ qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
+}
+
+static void qcom_glink_send_close_ack(struct qcom_glink *glink,
+ unsigned int rcid)
+{
+ struct glink_msg req;
+
+ req.cmd = cpu_to_le16(RPM_CMD_CLOSE_ACK);
+ req.param1 = cpu_to_le16(rcid);
+ req.param2 = 0;
+
+ qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
+}
+
+static void qcom_glink_rx_done_work(struct work_struct *work)
+{
+ struct glink_channel *channel = container_of(work, struct glink_channel,
+ intent_work);
+ struct qcom_glink *glink = channel->glink;
+ struct glink_core_rx_intent *intent, *tmp;
+ struct {
+ u16 id;
+ u16 lcid;
+ u32 liid;
+ } __packed cmd;
+
+ unsigned int cid = channel->lcid;
+ unsigned int iid;
+ bool reuse;
+ unsigned long flags;
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) {
+ list_del(&intent->node);
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+ iid = intent->id;
+ reuse = intent->reuse;
+
+ cmd.id = reuse ? RPM_CMD_RX_DONE_W_REUSE : RPM_CMD_RX_DONE;
+ cmd.lcid = cid;
+ cmd.liid = iid;
+
+ qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
+ if (!reuse) {
+ kfree(intent->data);
+ kfree(intent);
+ }
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ }
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+}
+
+static void qcom_glink_rx_done(struct qcom_glink *glink,
+ struct glink_channel *channel,
+ struct glink_core_rx_intent *intent)
+{
+ /* We don't send RX_DONE to intentless systems */
+ if (glink->intentless) {
+ kfree(intent->data);
+ kfree(intent);
+ return;
+ }
+
+ /* Take it off the tree of receive intents */
+ if (!intent->reuse) {
+ spin_lock(&channel->intent_lock);
+ idr_remove(&channel->liids, intent->id);
+ spin_unlock(&channel->intent_lock);
+ }
+
+ /* Schedule the sending of a rx_done indication */
+ spin_lock(&channel->intent_lock);
+ list_add_tail(&intent->node, &channel->done_intents);
+ spin_unlock(&channel->intent_lock);
+
+ schedule_work(&channel->intent_work);
+}
+
+/**
+ * qcom_glink_receive_version() - receive version/features from remote system
+ *
+ * @glink: pointer to transport interface
+ * @r_version: remote version
+ * @r_features: remote features
+ *
+ * This function is called in response to a remote-initiated version/feature
+ * negotiation sequence.
+ */
+static void qcom_glink_receive_version(struct qcom_glink *glink,
+ u32 version,
+ u32 features)
+{
+ switch (version) {
+ case 0:
+ break;
+ case GLINK_VERSION_1:
+ glink->features &= features;
+ /* FALLTHROUGH */
+ default:
+ qcom_glink_send_version_ack(glink);
+ break;
+ }
+}
+
+/**
+ * qcom_glink_receive_version_ack() - receive negotiation ack from remote system
+ *
+ * @glink: pointer to transport interface
+ * @r_version: remote version response
+ * @r_features: remote features response
+ *
+ * This function is called in response to a local-initiated version/feature
+ * negotiation sequence and is the counter-offer from the remote side based
+ * upon the initial version and feature set requested.
+ */
+static void qcom_glink_receive_version_ack(struct qcom_glink *glink,
+ u32 version,
+ u32 features)
+{
+ switch (version) {
+ case 0:
+ /* Version negotiation failed */
+ break;
+ case GLINK_VERSION_1:
+ if (features == glink->features)
+ break;
+
+ glink->features &= features;
+ /* FALLTHROUGH */
+ default:
+ qcom_glink_send_version(glink);
+ break;
+ }
+}
+
+/**
+ * qcom_glink_send_intent_req_ack() - convert an rx intent request ack cmd to
+ wire format and transmit
+ * @glink: The transport to transmit on.
+ * @channel: The glink channel
+ * @granted: The request response to encode.
+ *
+ * Return: 0 on success or standard Linux error code.
+ */
+static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink,
+ struct glink_channel *channel,
+ bool granted)
+{
+ struct glink_msg msg;
+
+ msg.cmd = cpu_to_le16(RPM_CMD_RX_INTENT_REQ_ACK);
+ msg.param1 = cpu_to_le16(channel->lcid);
+ msg.param2 = cpu_to_le32(granted);
+
+ qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
+
+ return 0;
+}
+
+/**
+ * qcom_glink_advertise_intent - convert an rx intent cmd to wire format and
+ * transmit
+ * @glink: The transport to transmit on.
+ * @channel: The local channel
+ * @size: The intent to pass on to remote.
+ *
+ * Return: 0 on success or standard Linux error code.
+ */
+static int qcom_glink_advertise_intent(struct qcom_glink *glink,
+ struct glink_channel *channel,
+ struct glink_core_rx_intent *intent)
+{
+ struct command {
+ u16 id;
+ u16 lcid;
+ u32 count;
+ u32 size;
+ u32 liid;
+ } __packed;
+ struct command cmd;
+
+ cmd.id = cpu_to_le16(RPM_CMD_INTENT);
+ cmd.lcid = cpu_to_le16(channel->lcid);
+ cmd.count = cpu_to_le32(1);
+ cmd.size = cpu_to_le32(intent->size);
+ cmd.liid = cpu_to_le32(intent->id);
+
+ qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
+
+ return 0;
+}
+
+static struct glink_core_rx_intent *
+qcom_glink_alloc_intent(struct qcom_glink *glink,
+ struct glink_channel *channel,
+ size_t size,
+ bool reuseable)
+{
+ struct glink_core_rx_intent *intent;
+ int ret;
+ unsigned long flags;
+
+ intent = kzalloc(sizeof(*intent), GFP_KERNEL);
+
+ if (!intent)
+ return NULL;
+
+ intent->data = kzalloc(size, GFP_KERNEL);
+ if (!intent->data)
+ return NULL;
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC);
+ if (ret < 0) {
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+ return NULL;
+ }
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+
+ intent->id = ret;
+ intent->size = size;
+ intent->reuse = reuseable;
+
+ return intent;
+}
+
+static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
+ u32 cid, uint32_t iid,
+ bool reuse)
+{
+ struct glink_core_rx_intent *intent;
+ struct glink_channel *channel;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, cid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (!channel) {
+ dev_err(glink->dev, "invalid channel id received\n");
+ return;
+ }
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ intent = idr_find(&channel->riids, iid);
+
+ if (!intent) {
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+ dev_err(glink->dev, "invalid intent id received\n");
+ return;
+ }
+
+ intent->in_use = false;
+
+ if (!reuse) {
+ idr_remove(&channel->riids, intent->id);
+ kfree(intent);
+ }
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+}
+
+/**
+ * qcom_glink_handle_intent_req() - Receive a request for rx_intent
+ * from remote side
+ * if_ptr: Pointer to the transport interface
+ * rcid: Remote channel ID
+ * size: size of the intent
+ *
+ * The function searches for the local channel to which the request for
+ * rx_intent has arrived and allocates and notifies the remote back
+ */
+static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
+ u32 cid, size_t size)
+{
+ struct glink_core_rx_intent *intent;
+ struct glink_channel *channel;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, cid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ if (!channel) {
+ pr_err("%s channel not found for cid %d\n", __func__, cid);
+ return;
+ }
+
+ intent = qcom_glink_alloc_intent(glink, channel, size, false);
+ if (intent)
+ qcom_glink_advertise_intent(glink, channel, intent);
+
+ qcom_glink_send_intent_req_ack(glink, channel, !!intent);
+}
+
+static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra)
+{
+ struct glink_defer_cmd *dcmd;
+
+ extra = ALIGN(extra, 8);
+
+ if (qcom_glink_rx_avail(glink) < sizeof(struct glink_msg) + extra) {
+ dev_dbg(glink->dev, "Insufficient data in rx fifo");
+ return -ENXIO;
+ }
+
+ dcmd = kzalloc(sizeof(*dcmd) + extra, GFP_ATOMIC);
+ if (!dcmd)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&dcmd->node);
+
+ qcom_glink_rx_peak(glink, &dcmd->msg, 0, sizeof(dcmd->msg) + extra);
+
+ spin_lock(&glink->rx_lock);
+ list_add_tail(&dcmd->node, &glink->rx_queue);
+ spin_unlock(&glink->rx_lock);
+
+ schedule_work(&glink->rx_work);
+ qcom_glink_rx_advance(glink, sizeof(dcmd->msg) + extra);
+
+ return 0;
+}
+
+static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
+{
+ struct glink_core_rx_intent *intent;
+ struct glink_channel *channel;
+ struct {
+ struct glink_msg msg;
+ __le32 chunk_size;
+ __le32 left_size;
+ } __packed hdr;
+ unsigned int chunk_size;
+ unsigned int left_size;
+ unsigned int rcid;
+ unsigned int liid;
+ int ret = 0;
+ unsigned long flags;
+
+ if (avail < sizeof(hdr)) {
+ dev_dbg(glink->dev, "Not enough data in fifo\n");
+ return -EAGAIN;
+ }
+
+ qcom_glink_rx_peak(glink, &hdr, 0, sizeof(hdr));
+ chunk_size = le32_to_cpu(hdr.chunk_size);
+ left_size = le32_to_cpu(hdr.left_size);
+
+ if (avail < sizeof(hdr) + chunk_size) {
+ dev_dbg(glink->dev, "Payload not yet in fifo\n");
+ return -EAGAIN;
+ }
+
+ if (WARN(chunk_size % 4, "Incoming data must be word aligned\n"))
+ return -EINVAL;
+
+ rcid = le16_to_cpu(hdr.msg.param1);
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, rcid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (!channel) {
+ dev_dbg(glink->dev, "Data on non-existing channel\n");
+
+ /* Drop the message */
+ goto advance_rx;
+ }
+
+ if (glink->intentless) {
+ /* Might have an ongoing, fragmented, message to append */
+ if (!channel->buf) {
+ intent = kzalloc(sizeof(*intent), GFP_ATOMIC);
+ if (!intent)
+ return -ENOMEM;
+
+ intent->data = kmalloc(chunk_size + left_size,
+ GFP_ATOMIC);
+ if (!intent->data) {
+ kfree(intent);
+ return -ENOMEM;
+ }
+
+ intent->id = 0xbabababa;
+ intent->size = chunk_size + left_size;
+ intent->offset = 0;
+
+ channel->buf = intent;
+ } else {
+ intent = channel->buf;
+ }
+ } else {
+ liid = le32_to_cpu(hdr.msg.param2);
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ intent = idr_find(&channel->liids, liid);
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+
+ if (!intent) {
+ dev_err(glink->dev,
+ "no intent found for channel %s intent %d",
+ channel->name, liid);
+ goto advance_rx;
+ }
+ }
+
+ if (intent->size - intent->offset < chunk_size) {
+ dev_err(glink->dev, "Insufficient space in intent\n");
+
+ /* The packet header lied, drop payload */
+ goto advance_rx;
+ }
+
+ qcom_glink_rx_peak(glink, intent->data + intent->offset,
+ sizeof(hdr), chunk_size);
+ intent->offset += chunk_size;
+
+ /* Handle message when no fragments remain to be received */
+ if (!left_size) {
+ spin_lock(&channel->recv_lock);
+ if (channel->ept.cb) {
+ channel->ept.cb(channel->ept.rpdev,
+ intent->data,
+ intent->offset,
+ channel->ept.priv,
+ RPMSG_ADDR_ANY);
+ }
+ spin_unlock(&channel->recv_lock);
+
+ intent->offset = 0;
+ channel->buf = NULL;
+
+ qcom_glink_rx_done(glink, channel, intent);
+ }
+
+advance_rx:
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8));
+
+ return ret;
+}
+
+static void qcom_glink_handle_intent(struct qcom_glink *glink,
+ unsigned int cid,
+ unsigned int count,
+ size_t avail)
+{
+ struct glink_core_rx_intent *intent;
+ struct glink_channel *channel;
+ struct intent_pair {
+ __le32 size;
+ __le32 iid;
+ };
+
+ struct {
+ struct glink_msg msg;
+ struct intent_pair intents[];
+ } __packed * msg;
+
+ const size_t msglen = sizeof(*msg) + sizeof(struct intent_pair) * count;
+ int ret;
+ int i;
+ unsigned long flags;
+
+ if (avail < msglen) {
+ dev_dbg(glink->dev, "Not enough data in fifo\n");
+ return;
+ }
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, cid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (!channel) {
+ dev_err(glink->dev, "intents for non-existing channel\n");
+ return;
+ }
+
+ msg = kmalloc(msglen, GFP_ATOMIC);
+ if (!msg)
+ return;
+
+ qcom_glink_rx_peak(glink, msg, 0, msglen);
+
+ for (i = 0; i < count; ++i) {
+ intent = kzalloc(sizeof(*intent), GFP_ATOMIC);
+ if (!intent)
+ break;
+
+ intent->id = le32_to_cpu(msg->intents[i].iid);
+ intent->size = le32_to_cpu(msg->intents[i].size);
+
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ ret = idr_alloc(&channel->riids, intent,
+ intent->id, intent->id + 1, GFP_ATOMIC);
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+
+ if (ret < 0)
+ dev_err(glink->dev, "failed to store remote intent\n");
+ }
+
+ kfree(msg);
+ qcom_glink_rx_advance(glink, ALIGN(msglen, 8));
+}
+
+static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
+{
+ struct glink_channel *channel;
+
+ spin_lock(&glink->idr_lock);
+ channel = idr_find(&glink->lcids, lcid);
+ spin_unlock(&glink->idr_lock);
+ if (!channel) {
+ dev_err(glink->dev, "Invalid open ack packet\n");
+ return -EINVAL;
+ }
+
+ complete(&channel->open_ack);
+
+ return 0;
+}
+
+static irqreturn_t qcom_glink_native_intr(int irq, void *data)
+{
+ struct qcom_glink *glink = data;
+ struct glink_msg msg;
+ unsigned int param1;
+ unsigned int param2;
+ unsigned int avail;
+ unsigned int cmd;
+ int ret = 0;
+
+ for (;;) {
+ avail = qcom_glink_rx_avail(glink);
+ if (avail < sizeof(msg))
+ break;
+
+ qcom_glink_rx_peak(glink, &msg, 0, sizeof(msg));
+
+ cmd = le16_to_cpu(msg.cmd);
+ param1 = le16_to_cpu(msg.param1);
+ param2 = le32_to_cpu(msg.param2);
+
+ switch (cmd) {
+ case RPM_CMD_VERSION:
+ case RPM_CMD_VERSION_ACK:
+ case RPM_CMD_CLOSE:
+ case RPM_CMD_CLOSE_ACK:
+ case RPM_CMD_RX_INTENT_REQ:
+ ret = qcom_glink_rx_defer(glink, 0);
+ break;
+ case RPM_CMD_OPEN_ACK:
+ ret = qcom_glink_rx_open_ack(glink, param1);
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+ break;
+ case RPM_CMD_OPEN:
+ ret = qcom_glink_rx_defer(glink, param2);
+ break;
+ case RPM_CMD_TX_DATA:
+ case RPM_CMD_TX_DATA_CONT:
+ ret = qcom_glink_rx_data(glink, avail);
+ break;
+ case RPM_CMD_READ_NOTIF:
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+
+ mbox_send_message(glink->mbox_chan, NULL);
+ mbox_client_txdone(glink->mbox_chan, 0);
+ break;
+ case RPM_CMD_INTENT:
+ qcom_glink_handle_intent(glink, param1, param2, avail);
+ break;
+ case RPM_CMD_RX_DONE:
+ qcom_glink_handle_rx_done(glink, param1, param2, false);
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+ break;
+ case RPM_CMD_RX_DONE_W_REUSE:
+ qcom_glink_handle_rx_done(glink, param1, param2, true);
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+ break;
+ case RPM_CMD_RX_INTENT_REQ_ACK:
+ qcom_glink_handle_intent_req_ack(glink, param1, param2);
+ qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
+ break;
+ default:
+ dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
+ ret = -EINVAL;
+ break;
+ }
+
+ if (ret)
+ break;
+ }
+
+ return IRQ_HANDLED;
+}
+
+/* Locally initiated rpmsg_create_ept */
+static struct glink_channel *qcom_glink_create_local(struct qcom_glink *glink,
+ const char *name)
+{
+ struct glink_channel *channel;
+ int ret;
+ unsigned long flags;
+
+ channel = qcom_glink_alloc_channel(glink, name);
+ if (IS_ERR(channel))
+ return ERR_CAST(channel);
+
+ ret = qcom_glink_send_open_req(glink, channel);
+ if (ret)
+ goto release_channel;
+
+ ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ);
+ if (!ret)
+ goto err_timeout;
+
+ ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ);
+ if (!ret)
+ goto err_timeout;
+
+ qcom_glink_send_open_ack(glink, channel);
+
+ return channel;
+
+err_timeout:
+ /* qcom_glink_send_open_req() did register the channel in lcids*/
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_remove(&glink->lcids, channel->lcid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+release_channel:
+ /* Release qcom_glink_send_open_req() reference */
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+ /* Release qcom_glink_alloc_channel() reference */
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+
+ return ERR_PTR(-ETIMEDOUT);
+}
+
+/* Remote initiated rpmsg_create_ept */
+static int qcom_glink_create_remote(struct qcom_glink *glink,
+ struct glink_channel *channel)
+{
+ int ret;
+
+ qcom_glink_send_open_ack(glink, channel);
+
+ ret = qcom_glink_send_open_req(glink, channel);
+ if (ret)
+ goto close_link;
+
+ ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ);
+ if (!ret) {
+ ret = -ETIMEDOUT;
+ goto close_link;
+ }
+
+ return 0;
+
+close_link:
+ /*
+ * Send a close request to "undo" our open-ack. The close-ack will
+ * release the last reference.
+ */
+ qcom_glink_send_close_req(glink, channel);
+
+ /* Release qcom_glink_send_open_req() reference */
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+
+ return ret;
+}
+
+static struct rpmsg_endpoint *qcom_glink_create_ept(struct rpmsg_device *rpdev,
+ rpmsg_rx_cb_t cb,
+ void *priv,
+ struct rpmsg_channel_info
+ chinfo)
+{
+ struct glink_channel *parent = to_glink_channel(rpdev->ept);
+ struct glink_channel *channel;
+ struct qcom_glink *glink = parent->glink;
+ struct rpmsg_endpoint *ept;
+ const char *name = chinfo.name;
+ int cid;
+ int ret;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_for_each_entry(&glink->rcids, channel, cid) {
+ if (!strcmp(channel->name, name))
+ break;
+ }
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ if (!channel) {
+ channel = qcom_glink_create_local(glink, name);
+ if (IS_ERR(channel))
+ return NULL;
+ } else {
+ ret = qcom_glink_create_remote(glink, channel);
+ if (ret)
+ return NULL;
+ }
+
+ ept = &channel->ept;
+ ept->rpdev = rpdev;
+ ept->cb = cb;
+ ept->priv = priv;
+ ept->ops = &glink_endpoint_ops;
+
+ return ept;
+}
+
+static int qcom_glink_announce_create(struct rpmsg_device *rpdev)
+{
+ struct glink_channel *channel = to_glink_channel(rpdev->ept);
+ struct glink_core_rx_intent *intent;
+ struct qcom_glink *glink = channel->glink;
+ int num_intents = glink->intentless ? 0 : 5;
+
+ /* Channel is now open, advertise base set of intents */
+ while (num_intents--) {
+ intent = qcom_glink_alloc_intent(glink, channel, SZ_1K, true);
+ if (!intent)
+ break;
+
+ qcom_glink_advertise_intent(glink, channel, intent);
+ }
+
+ return 0;
+}
+
+static void qcom_glink_destroy_ept(struct rpmsg_endpoint *ept)
+{
+ struct glink_channel *channel = to_glink_channel(ept);
+ struct qcom_glink *glink = channel->glink;
+ unsigned long flags;
+
+ spin_lock_irqsave(&channel->recv_lock, flags);
+ channel->ept.cb = NULL;
+ spin_unlock_irqrestore(&channel->recv_lock, flags);
+
+ /* Decouple the potential rpdev from the channel */
+ channel->rpdev = NULL;
+
+ qcom_glink_send_close_req(glink, channel);
+}
+
+static int qcom_glink_request_intent(struct qcom_glink *glink,
+ struct glink_channel *channel,
+ size_t size)
+{
+ struct {
+ u16 id;
+ u16 cid;
+ u32 size;
+ } __packed cmd;
+
+ int ret;
+
+ mutex_lock(&channel->intent_req_lock);
+
+ reinit_completion(&channel->intent_req_comp);
+
+ cmd.id = RPM_CMD_RX_INTENT_REQ;
+ cmd.cid = channel->lcid;
+ cmd.size = size;
+
+ ret = qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
+ if (ret)
+ return ret;
+
+ ret = wait_for_completion_timeout(&channel->intent_req_comp, 10 * HZ);
+ if (!ret) {
+ dev_err(glink->dev, "intent request timed out\n");
+ ret = -ETIMEDOUT;
+ } else {
+ ret = channel->intent_req_result ? 0 : -ECANCELED;
+ }
+
+ mutex_unlock(&channel->intent_req_lock);
+ return ret;
+}
+
+static int __qcom_glink_send(struct glink_channel *channel,
+ void *data, int len, bool wait)
+{
+ struct qcom_glink *glink = channel->glink;
+ struct glink_core_rx_intent *intent = NULL;
+ struct glink_core_rx_intent *tmp;
+ int iid = 0;
+ struct {
+ struct glink_msg msg;
+ __le32 chunk_size;
+ __le32 left_size;
+ } __packed req;
+ int ret;
+ unsigned long flags;
+
+ if (!glink->intentless) {
+ while (!intent) {
+ spin_lock_irqsave(&channel->intent_lock, flags);
+ idr_for_each_entry(&channel->riids, tmp, iid) {
+ if (tmp->size >= len && !tmp->in_use) {
+ tmp->in_use = true;
+ intent = tmp;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&channel->intent_lock, flags);
+
+ /* We found an available intent */
+ if (intent)
+ break;
+
+ if (!wait)
+ return -EBUSY;
+
+ ret = qcom_glink_request_intent(glink, channel, len);
+ if (ret < 0)
+ return ret;
+ }
+
+ iid = intent->id;
+ }
+
+ req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA);
+ req.msg.param1 = cpu_to_le16(channel->lcid);
+ req.msg.param2 = cpu_to_le32(iid);
+ req.chunk_size = cpu_to_le32(len);
+ req.left_size = cpu_to_le32(0);
+
+ ret = qcom_glink_tx(glink, &req, sizeof(req), data, len, wait);
+
+ /* Mark intent available if we failed */
+ if (ret && intent)
+ intent->in_use = false;
+
+ return ret;
+}
+
+static int qcom_glink_send(struct rpmsg_endpoint *ept, void *data, int len)
+{
+ struct glink_channel *channel = to_glink_channel(ept);
+
+ return __qcom_glink_send(channel, data, len, true);
+}
+
+static int qcom_glink_trysend(struct rpmsg_endpoint *ept, void *data, int len)
+{
+ struct glink_channel *channel = to_glink_channel(ept);
+
+ return __qcom_glink_send(channel, data, len, false);
+}
+
+/*
+ * Finds the device_node for the glink child interested in this channel.
+ */
+static struct device_node *qcom_glink_match_channel(struct device_node *node,
+ const char *channel)
+{
+ struct device_node *child;
+ const char *name;
+ const char *key;
+ int ret;
+
+ for_each_available_child_of_node(node, child) {
+ key = "qcom,glink-channels";
+ ret = of_property_read_string(child, key, &name);
+ if (ret)
+ continue;
+
+ if (strcmp(name, channel) == 0)
+ return child;
+ }
+
+ return NULL;
+}
+
+static const struct rpmsg_device_ops glink_device_ops = {
+ .create_ept = qcom_glink_create_ept,
+ .announce_create = qcom_glink_announce_create,
+};
+
+static const struct rpmsg_endpoint_ops glink_endpoint_ops = {
+ .destroy_ept = qcom_glink_destroy_ept,
+ .send = qcom_glink_send,
+ .trysend = qcom_glink_trysend,
+};
+
+static void qcom_glink_rpdev_release(struct device *dev)
+{
+ struct rpmsg_device *rpdev = to_rpmsg_device(dev);
+ struct glink_channel *channel = to_glink_channel(rpdev->ept);
+
+ channel->rpdev = NULL;
+ kfree(rpdev);
+}
+
+static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
+ char *name)
+{
+ struct glink_channel *channel;
+ struct rpmsg_device *rpdev;
+ bool create_device = false;
+ struct device_node *node;
+ int lcid;
+ int ret;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_for_each_entry(&glink->lcids, channel, lcid) {
+ if (!strcmp(channel->name, name))
+ break;
+ }
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ if (!channel) {
+ channel = qcom_glink_alloc_channel(glink, name);
+ if (IS_ERR(channel))
+ return PTR_ERR(channel);
+
+ /* The opening dance was initiated by the remote */
+ create_device = true;
+ }
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
+ if (ret < 0) {
+ dev_err(glink->dev, "Unable to insert channel into rcid list\n");
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ goto free_channel;
+ }
+ channel->rcid = ret;
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ complete(&channel->open_req);
+
+ if (create_device) {
+ rpdev = kzalloc(sizeof(*rpdev), GFP_KERNEL);
+ if (!rpdev) {
+ ret = -ENOMEM;
+ goto rcid_remove;
+ }
+
+ rpdev->ept = &channel->ept;
+ strncpy(rpdev->id.name, name, RPMSG_NAME_SIZE);
+ rpdev->src = RPMSG_ADDR_ANY;
+ rpdev->dst = RPMSG_ADDR_ANY;
+ rpdev->ops = &glink_device_ops;
+
+ node = qcom_glink_match_channel(glink->dev->of_node, name);
+ rpdev->dev.of_node = node;
+ rpdev->dev.parent = glink->dev;
+ rpdev->dev.release = qcom_glink_rpdev_release;
+
+ ret = rpmsg_register_device(rpdev);
+ if (ret)
+ goto free_rpdev;
+
+ channel->rpdev = rpdev;
+ }
+
+ return 0;
+
+free_rpdev:
+ kfree(rpdev);
+rcid_remove:
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_remove(&glink->rcids, channel->rcid);
+ channel->rcid = 0;
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+free_channel:
+ /* Release the reference, iff we took it */
+ if (create_device)
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+
+ return ret;
+}
+
+static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
+{
+ struct rpmsg_channel_info chinfo;
+ struct glink_channel *channel;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->rcids, rcid);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ if (WARN(!channel, "close request on unknown channel\n"))
+ return;
+
+ /* cancel pending rx_done work */
+ cancel_work_sync(&channel->intent_work);
+
+ if (channel->rpdev) {
+ strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
+ chinfo.src = RPMSG_ADDR_ANY;
+ chinfo.dst = RPMSG_ADDR_ANY;
+
+ rpmsg_unregister_device(glink->dev, &chinfo);
+ }
+
+ qcom_glink_send_close_ack(glink, channel->rcid);
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ idr_remove(&glink->rcids, channel->rcid);
+ channel->rcid = 0;
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+}
+
+static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid)
+{
+ struct glink_channel *channel;
+ unsigned long flags;
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ channel = idr_find(&glink->lcids, lcid);
+ if (WARN(!channel, "close ack on unknown channel\n")) {
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ return;
+ }
+
+ idr_remove(&glink->lcids, channel->lcid);
+ channel->lcid = 0;
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+}
+
+static void qcom_glink_work(struct work_struct *work)
+{
+ struct qcom_glink *glink = container_of(work, struct qcom_glink,
+ rx_work);
+ struct glink_defer_cmd *dcmd;
+ struct glink_msg *msg;
+ unsigned long flags;
+ unsigned int param1;
+ unsigned int param2;
+ unsigned int cmd;
+
+ for (;;) {
+ spin_lock_irqsave(&glink->rx_lock, flags);
+ if (list_empty(&glink->rx_queue)) {
+ spin_unlock_irqrestore(&glink->rx_lock, flags);
+ break;
+ }
+ dcmd = list_first_entry(&glink->rx_queue,
+ struct glink_defer_cmd, node);
+ list_del(&dcmd->node);
+ spin_unlock_irqrestore(&glink->rx_lock, flags);
+
+ msg = &dcmd->msg;
+ cmd = le16_to_cpu(msg->cmd);
+ param1 = le16_to_cpu(msg->param1);
+ param2 = le32_to_cpu(msg->param2);
+
+ switch (cmd) {
+ case RPM_CMD_VERSION:
+ qcom_glink_receive_version(glink, param1, param2);
+ break;
+ case RPM_CMD_VERSION_ACK:
+ qcom_glink_receive_version_ack(glink, param1, param2);
+ break;
+ case RPM_CMD_OPEN:
+ qcom_glink_rx_open(glink, param1, msg->data);
+ break;
+ case RPM_CMD_CLOSE:
+ qcom_glink_rx_close(glink, param1);
+ break;
+ case RPM_CMD_CLOSE_ACK:
+ qcom_glink_rx_close_ack(glink, param1);
+ break;
+ case RPM_CMD_RX_INTENT_REQ:
+ qcom_glink_handle_intent_req(glink, param1, param2);
+ break;
+ default:
+ WARN(1, "Unknown defer object %d\n", cmd);
+ break;
+ }
+
+ kfree(dcmd);
+ }
+}
+
+struct qcom_glink *qcom_glink_native_probe(struct device *dev,
+ unsigned long features,
+ struct qcom_glink_pipe *rx,
+ struct qcom_glink_pipe *tx,
+ bool intentless)
+{
+ int irq;
+ int ret;
+ struct qcom_glink *glink;
+
+ glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL);
+ if (!glink)
+ return ERR_PTR(-ENOMEM);
+
+ glink->dev = dev;
+ glink->tx_pipe = tx;
+ glink->rx_pipe = rx;
+
+ glink->features = features;
+ glink->intentless = intentless;
+
+ mutex_init(&glink->tx_lock);
+ spin_lock_init(&glink->rx_lock);
+ INIT_LIST_HEAD(&glink->rx_queue);
+ INIT_WORK(&glink->rx_work, qcom_glink_work);
+
+ spin_lock_init(&glink->idr_lock);
+ idr_init(&glink->lcids);
+ idr_init(&glink->rcids);
+
+ glink->mbox_client.dev = dev;
+ glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0);
+ if (IS_ERR(glink->mbox_chan)) {
+ if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER)
+ dev_err(dev, "failed to acquire IPC channel\n");
+ return ERR_CAST(glink->mbox_chan);
+ }
+
+ irq = of_irq_get(dev->of_node, 0);
+ ret = devm_request_irq(dev, irq,
+ qcom_glink_native_intr,
+ IRQF_NO_SUSPEND | IRQF_SHARED,
+ "glink-native", glink);
+ if (ret) {
+ dev_err(dev, "failed to request IRQ\n");
+ return ERR_PTR(ret);
+ }
+
+ glink->irq = irq;
+
+ ret = qcom_glink_send_version(glink);
+ if (ret)
+ return ERR_PTR(ret);
+
+ return glink;
+}
+EXPORT_SYMBOL_GPL(qcom_glink_native_probe);
+
+static int qcom_glink_remove_device(struct device *dev, void *data)
+{
+ device_unregister(dev);
+
+ return 0;
+}
+
+void qcom_glink_native_remove(struct qcom_glink *glink)
+{
+ struct glink_channel *channel;
+ int cid;
+ int ret;
+ unsigned long flags;
+
+ disable_irq(glink->irq);
+ cancel_work_sync(&glink->rx_work);
+
+ ret = device_for_each_child(glink->dev, NULL, qcom_glink_remove_device);
+ if (ret)
+ dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret);
+
+ spin_lock_irqsave(&glink->idr_lock, flags);
+ /* Release any defunct local channels, waiting for close-ack */
+ idr_for_each_entry(&glink->lcids, channel, cid)
+ kref_put(&channel->refcount, qcom_glink_channel_release);
+
+ idr_destroy(&glink->lcids);
+ idr_destroy(&glink->rcids);
+ spin_unlock_irqrestore(&glink->idr_lock, flags);
+ mbox_free_channel(glink->mbox_chan);
+}
+EXPORT_SYMBOL_GPL(qcom_glink_native_remove);
+
+void qcom_glink_native_unregister(struct qcom_glink *glink)
+{
+ device_unregister(glink->dev);
+}
+EXPORT_SYMBOL_GPL(qcom_glink_native_unregister);
diff --git a/drivers/rpmsg/qcom_glink_native.h b/drivers/rpmsg/qcom_glink_native.h
new file mode 100644
index 000000000000..0cae8a8199f8
--- /dev/null
+++ b/drivers/rpmsg/qcom_glink_native.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016-2017, Linaro Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __QCOM_GLINK_NATIVE_H__
+#define __QCOM_GLINK_NATIVE_H__
+
+#define GLINK_FEATURE_INTENT_REUSE BIT(0)
+#define GLINK_FEATURE_MIGRATION BIT(1)
+#define GLINK_FEATURE_TRACER_PKT BIT(2)
+
+struct qcom_glink_pipe {
+ size_t length;
+
+ size_t (*avail)(struct qcom_glink_pipe *glink_pipe);
+
+ void (*peak)(struct qcom_glink_pipe *glink_pipe, void *data,
+ unsigned int offset, size_t count);
+ void (*advance)(struct qcom_glink_pipe *glink_pipe, size_t count);
+
+ void (*write)(struct qcom_glink_pipe *glink_pipe,
+ const void *hdr, size_t hlen,
+ const void *data, size_t dlen);
+};
+
+struct qcom_glink;
+
+struct qcom_glink *qcom_glink_native_probe(struct device *dev,
+ unsigned long features,
+ struct qcom_glink_pipe *rx,
+ struct qcom_glink_pipe *tx,
+ bool intentless);
+void qcom_glink_native_remove(struct qcom_glink *glink);
+
+void qcom_glink_native_unregister(struct qcom_glink *glink);
+#endif
diff --git a/drivers/rpmsg/qcom_glink_rpm.c b/drivers/rpmsg/qcom_glink_rpm.c
index 3559a3e84c1e..69b25d157d0f 100644
--- a/drivers/rpmsg/qcom_glink_rpm.c
+++ b/drivers/rpmsg/qcom_glink_rpm.c
@@ -27,6 +27,7 @@
#include <linux/mailbox_client.h>
#include "rpmsg_internal.h"
+#include "qcom_glink_native.h"
#define RPM_TOC_SIZE 256
#define RPM_TOC_MAGIC 0x67727430 /* grt0 */
@@ -36,10 +37,7 @@
#define RPM_TX_FIFO_ID 0x61703272 /* ap2r */
#define RPM_RX_FIFO_ID 0x72326170 /* r2ap */
-#define GLINK_NAME_SIZE 32
-
-#define RPM_GLINK_CID_MIN 1
-#define RPM_GLINK_CID_MAX 65536
+#define to_rpm_pipe(p) container_of(p, struct glink_rpm_pipe, native)
struct rpm_toc_entry {
__le32 id;
@@ -54,170 +52,18 @@ struct rpm_toc {
struct rpm_toc_entry entries[];
} __packed;
-struct glink_msg {
- __le16 cmd;
- __le16 param1;
- __le32 param2;
- u8 data[];
-} __packed;
-
struct glink_rpm_pipe {
+ struct qcom_glink_pipe native;
+
void __iomem *tail;
void __iomem *head;
void __iomem *fifo;
-
- size_t length;
-};
-
-/**
- * struct glink_defer_cmd - deferred incoming control message
- * @node: list node
- * @msg: message header
- * data: payload of the message
- *
- * Copy of a received control message, to be added to @rx_queue and processed
- * by @rx_work of @glink_rpm.
- */
-struct glink_defer_cmd {
- struct list_head node;
-
- struct glink_msg msg;
- u8 data[];
-};
-
-/**
- * struct glink_rpm - driver context, relates to one remote subsystem
- * @dev: reference to the associated struct device
- * @doorbell: "rpm_hlos" ipc doorbell
- * @rx_pipe: pipe object for receive FIFO
- * @tx_pipe: pipe object for transmit FIFO
- * @irq: IRQ for signaling incoming events
- * @rx_work: worker for handling received control messages
- * @rx_lock: protects the @rx_queue
- * @rx_queue: queue of received control messages to be processed in @rx_work
- * @tx_lock: synchronizes operations on the tx fifo
- * @idr_lock: synchronizes @lcids and @rcids modifications
- * @lcids: idr of all channels with a known local channel id
- * @rcids: idr of all channels with a known remote channel id
- */
-struct glink_rpm {
- struct device *dev;
-
- struct mbox_client mbox_client;
- struct mbox_chan *mbox_chan;
-
- struct glink_rpm_pipe rx_pipe;
- struct glink_rpm_pipe tx_pipe;
-
- int irq;
-
- struct work_struct rx_work;
- spinlock_t rx_lock;
- struct list_head rx_queue;
-
- struct mutex tx_lock;
-
- struct mutex idr_lock;
- struct idr lcids;
- struct idr rcids;
-};
-
-enum {
- GLINK_STATE_CLOSED,
- GLINK_STATE_OPENING,
- GLINK_STATE_OPEN,
- GLINK_STATE_CLOSING,
};
-/**
- * struct glink_channel - internal representation of a channel
- * @rpdev: rpdev reference, only used for primary endpoints
- * @ept: rpmsg endpoint this channel is associated with
- * @glink: glink_rpm context handle
- * @refcount: refcount for the channel object
- * @recv_lock: guard for @ept.cb
- * @name: unique channel name/identifier
- * @lcid: channel id, in local space
- * @rcid: channel id, in remote space
- * @buf: receive buffer, for gathering fragments
- * @buf_offset: write offset in @buf
- * @buf_size: size of current @buf
- * @open_ack: completed once remote has acked the open-request
- * @open_req: completed once open-request has been received
- */
-struct glink_channel {
- struct rpmsg_endpoint ept;
-
- struct rpmsg_device *rpdev;
- struct glink_rpm *glink;
-
- struct kref refcount;
-
- spinlock_t recv_lock;
-
- char *name;
- unsigned int lcid;
- unsigned int rcid;
-
- void *buf;
- int buf_offset;
- int buf_size;
-
- struct completion open_ack;
- struct completion open_req;
-};
-
-#define to_glink_channel(_ept) container_of(_ept, struct glink_channel, ept)
-
-static const struct rpmsg_endpoint_ops glink_endpoint_ops;
-
-#define RPM_CMD_VERSION 0
-#define RPM_CMD_VERSION_ACK 1
-#define RPM_CMD_OPEN 2
-#define RPM_CMD_CLOSE 3
-#define RPM_CMD_OPEN_ACK 4
-#define RPM_CMD_TX_DATA 9
-#define RPM_CMD_CLOSE_ACK 11
-#define RPM_CMD_TX_DATA_CONT 12
-#define RPM_CMD_READ_NOTIF 13
-
-#define GLINK_FEATURE_INTENTLESS BIT(1)
-
-static struct glink_channel *glink_rpm_alloc_channel(struct glink_rpm *glink,
- const char *name)
-{
- struct glink_channel *channel;
-
- channel = kzalloc(sizeof(*channel), GFP_KERNEL);
- if (!channel)
- return ERR_PTR(-ENOMEM);
-
- /* Setup glink internal glink_channel data */
- spin_lock_init(&channel->recv_lock);
- channel->glink = glink;
- channel->name = kstrdup(name, GFP_KERNEL);
-
- init_completion(&channel->open_req);
- init_completion(&channel->open_ack);
-
- kref_init(&channel->refcount);
-
- return channel;
-}
-
-static void glink_rpm_channel_release(struct kref *ref)
-{
- struct glink_channel *channel = container_of(ref, struct glink_channel,
- refcount);
-
- kfree(channel->name);
- kfree(channel);
-}
-
-static size_t glink_rpm_rx_avail(struct glink_rpm *glink)
+static size_t glink_rpm_rx_avail(struct qcom_glink_pipe *glink_pipe)
{
- struct glink_rpm_pipe *pipe = &glink->rx_pipe;
+ struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
unsigned int head;
unsigned int tail;
@@ -225,21 +71,24 @@ static size_t glink_rpm_rx_avail(struct glink_rpm *glink)
tail = readl(pipe->tail);
if (head < tail)
- return pipe->length - tail + head;
+ return pipe->native.length - tail + head;
else
return head - tail;
}
-static void glink_rpm_rx_peak(struct glink_rpm *glink,
- void *data, size_t count)
+static void glink_rpm_rx_peak(struct qcom_glink_pipe *glink_pipe,
+ void *data, unsigned int offset, size_t count)
{
- struct glink_rpm_pipe *pipe = &glink->rx_pipe;
+ struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
unsigned int tail;
size_t len;
tail = readl(pipe->tail);
+ tail += offset;
+ if (tail >= pipe->native.length)
+ tail -= pipe->native.length;
- len = min_t(size_t, count, pipe->length - tail);
+ len = min_t(size_t, count, pipe->native.length - tail);
if (len) {
__ioread32_copy(data, pipe->fifo + tail,
len / sizeof(u32));
@@ -251,24 +100,24 @@ static void glink_rpm_rx_peak(struct glink_rpm *glink,
}
}
-static void glink_rpm_rx_advance(struct glink_rpm *glink,
+static void glink_rpm_rx_advance(struct qcom_glink_pipe *glink_pipe,
size_t count)
{
- struct glink_rpm_pipe *pipe = &glink->rx_pipe;
+ struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
unsigned int tail;
tail = readl(pipe->tail);
tail += count;
- if (tail >= pipe->length)
- tail -= pipe->length;
+ if (tail >= pipe->native.length)
+ tail -= pipe->native.length;
writel(tail, pipe->tail);
}
-static size_t glink_rpm_tx_avail(struct glink_rpm *glink)
+static size_t glink_rpm_tx_avail(struct qcom_glink_pipe *glink_pipe)
{
- struct glink_rpm_pipe *pipe = &glink->tx_pipe;
+ struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
unsigned int head;
unsigned int tail;
@@ -276,19 +125,18 @@ static size_t glink_rpm_tx_avail(struct glink_rpm *glink)
tail = readl(pipe->tail);
if (tail <= head)
- return pipe->length - head + tail;
+ return pipe->native.length - head + tail;
else
return tail - head;
}
-static unsigned int glink_rpm_tx_write(struct glink_rpm *glink,
- unsigned int head,
- const void *data, size_t count)
+static unsigned int glink_rpm_tx_write_one(struct glink_rpm_pipe *pipe,
+ unsigned int head,
+ const void *data, size_t count)
{
- struct glink_rpm_pipe *pipe = &glink->tx_pipe;
size_t len;
- len = min_t(size_t, count, pipe->length - head);
+ len = min_t(size_t, count, pipe->native.length - head);
if (len) {
__iowrite32_copy(pipe->fifo + head, data,
len / sizeof(u32));
@@ -300,725 +148,43 @@ static unsigned int glink_rpm_tx_write(struct glink_rpm *glink,
}
head += count;
- if (head >= pipe->length)
- head -= pipe->length;
+ if (head >= pipe->native.length)
+ head -= pipe->native.length;
return head;
}
-static int glink_rpm_tx(struct glink_rpm *glink,
- const void *hdr, size_t hlen,
- const void *data, size_t dlen, bool wait)
+static void glink_rpm_tx_write(struct qcom_glink_pipe *glink_pipe,
+ const void *hdr, size_t hlen,
+ const void *data, size_t dlen)
{
- struct glink_rpm_pipe *pipe = &glink->tx_pipe;
+ struct glink_rpm_pipe *pipe = to_rpm_pipe(glink_pipe);
+ size_t tlen = hlen + dlen;
+ size_t aligned_dlen;
unsigned int head;
- unsigned int tlen = hlen + dlen;
- int ret;
-
- /* Reject packets that are too big */
- if (tlen >= glink->tx_pipe.length)
- return -EINVAL;
-
- if (WARN(tlen % 8, "Unaligned TX request"))
- return -EINVAL;
-
- ret = mutex_lock_interruptible(&glink->tx_lock);
- if (ret)
- return ret;
-
- while (glink_rpm_tx_avail(glink) < tlen) {
- if (!wait) {
- ret = -ENOMEM;
- goto out;
- }
-
- msleep(10);
- }
-
- head = readl(pipe->head);
- head = glink_rpm_tx_write(glink, head, hdr, hlen);
- head = glink_rpm_tx_write(glink, head, data, dlen);
- writel(head, pipe->head);
-
- mbox_send_message(glink->mbox_chan, NULL);
- mbox_client_txdone(glink->mbox_chan, 0);
-
-out:
- mutex_unlock(&glink->tx_lock);
+ char padding[8] = {0};
+ size_t pad;
- return ret;
-}
-
-static int glink_rpm_send_version(struct glink_rpm *glink)
-{
- struct glink_msg msg;
-
- msg.cmd = cpu_to_le16(RPM_CMD_VERSION);
- msg.param1 = cpu_to_le16(1);
- msg.param2 = cpu_to_le32(GLINK_FEATURE_INTENTLESS);
-
- return glink_rpm_tx(glink, &msg, sizeof(msg), NULL, 0, true);
-}
-
-static void glink_rpm_send_version_ack(struct glink_rpm *glink)
-{
- struct glink_msg msg;
-
- msg.cmd = cpu_to_le16(RPM_CMD_VERSION_ACK);
- msg.param1 = cpu_to_le16(1);
- msg.param2 = cpu_to_le32(0);
-
- glink_rpm_tx(glink, &msg, sizeof(msg), NULL, 0, true);
-}
-
-static void glink_rpm_send_open_ack(struct glink_rpm *glink,
- struct glink_channel *channel)
-{
- struct glink_msg msg;
-
- msg.cmd = cpu_to_le16(RPM_CMD_OPEN_ACK);
- msg.param1 = cpu_to_le16(channel->rcid);
- msg.param2 = cpu_to_le32(0);
-
- glink_rpm_tx(glink, &msg, sizeof(msg), NULL, 0, true);
-}
-
-/**
- * glink_rpm_send_open_req() - send a RPM_CMD_OPEN request to the remote
- * @glink:
- * @channel:
- *
- * Allocates a local channel id and sends a RPM_CMD_OPEN message to the remote.
- * Will return with refcount held, regardless of outcome.
- *
- * Returns 0 on success, negative errno otherwise.
- */
-static int glink_rpm_send_open_req(struct glink_rpm *glink,
- struct glink_channel *channel)
-{
- struct {
- struct glink_msg msg;
- u8 name[GLINK_NAME_SIZE];
- } __packed req;
- int name_len = strlen(channel->name) + 1;
- int req_len = ALIGN(sizeof(req.msg) + name_len, 8);
- int ret;
-
- kref_get(&channel->refcount);
-
- mutex_lock(&glink->idr_lock);
- ret = idr_alloc_cyclic(&glink->lcids, channel,
- RPM_GLINK_CID_MIN, RPM_GLINK_CID_MAX, GFP_KERNEL);
- mutex_unlock(&glink->idr_lock);
- if (ret < 0)
- return ret;
-
- channel->lcid = ret;
-
- req.msg.cmd = cpu_to_le16(RPM_CMD_OPEN);
- req.msg.param1 = cpu_to_le16(channel->lcid);
- req.msg.param2 = cpu_to_le32(name_len);
- strcpy(req.name, channel->name);
-
- ret = glink_rpm_tx(glink, &req, req_len, NULL, 0, true);
- if (ret)
- goto remove_idr;
-
- return 0;
-
-remove_idr:
- mutex_lock(&glink->idr_lock);
- idr_remove(&glink->lcids, channel->lcid);
- channel->lcid = 0;
- mutex_unlock(&glink->idr_lock);
-
- return ret;
-}
-
-static void glink_rpm_send_close_req(struct glink_rpm *glink,
- struct glink_channel *channel)
-{
- struct glink_msg req;
-
- req.cmd = cpu_to_le16(RPM_CMD_CLOSE);
- req.param1 = cpu_to_le16(channel->lcid);
- req.param2 = 0;
-
- glink_rpm_tx(glink, &req, sizeof(req), NULL, 0, true);
-}
-
-static void glink_rpm_send_close_ack(struct glink_rpm *glink, unsigned int rcid)
-{
- struct glink_msg req;
-
- req.cmd = cpu_to_le16(RPM_CMD_CLOSE_ACK);
- req.param1 = cpu_to_le16(rcid);
- req.param2 = 0;
-
- glink_rpm_tx(glink, &req, sizeof(req), NULL, 0, true);
-}
-
-static int glink_rpm_rx_defer(struct glink_rpm *glink, size_t extra)
-{
- struct glink_defer_cmd *dcmd;
-
- extra = ALIGN(extra, 8);
-
- if (glink_rpm_rx_avail(glink) < sizeof(struct glink_msg) + extra) {
- dev_dbg(glink->dev, "Insufficient data in rx fifo");
- return -ENXIO;
- }
-
- dcmd = kzalloc(sizeof(*dcmd) + extra, GFP_ATOMIC);
- if (!dcmd)
- return -ENOMEM;
-
- INIT_LIST_HEAD(&dcmd->node);
-
- glink_rpm_rx_peak(glink, &dcmd->msg, sizeof(dcmd->msg) + extra);
-
- spin_lock(&glink->rx_lock);
- list_add_tail(&dcmd->node, &glink->rx_queue);
- spin_unlock(&glink->rx_lock);
-
- schedule_work(&glink->rx_work);
- glink_rpm_rx_advance(glink, sizeof(dcmd->msg) + extra);
-
- return 0;
-}
-
-static int glink_rpm_rx_data(struct glink_rpm *glink, size_t avail)
-{
- struct glink_channel *channel;
- struct {
- struct glink_msg msg;
- __le32 chunk_size;
- __le32 left_size;
- } __packed hdr;
- unsigned int chunk_size;
- unsigned int left_size;
- unsigned int rcid;
-
- if (avail < sizeof(hdr)) {
- dev_dbg(glink->dev, "Not enough data in fifo\n");
- return -EAGAIN;
- }
-
- glink_rpm_rx_peak(glink, &hdr, sizeof(hdr));
- chunk_size = le32_to_cpu(hdr.chunk_size);
- left_size = le32_to_cpu(hdr.left_size);
-
- if (avail < sizeof(hdr) + chunk_size) {
- dev_dbg(glink->dev, "Payload not yet in fifo\n");
- return -EAGAIN;
- }
-
- if (WARN(chunk_size % 4, "Incoming data must be word aligned\n"))
- return -EINVAL;
-
- rcid = le16_to_cpu(hdr.msg.param1);
- channel = idr_find(&glink->rcids, rcid);
- if (!channel) {
- dev_dbg(glink->dev, "Data on non-existing channel\n");
-
- /* Drop the message */
- glink_rpm_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8));
- return 0;
- }
-
- /* Might have an ongoing, fragmented, message to append */
- if (!channel->buf) {
- channel->buf = kmalloc(chunk_size + left_size, GFP_ATOMIC);
- if (!channel->buf)
- return -ENOMEM;
-
- channel->buf_size = chunk_size + left_size;
- channel->buf_offset = 0;
- }
-
- glink_rpm_rx_advance(glink, sizeof(hdr));
-
- if (channel->buf_size - channel->buf_offset < chunk_size) {
- dev_err(glink->dev, "Insufficient space in input buffer\n");
-
- /* The packet header lied, drop payload */
- glink_rpm_rx_advance(glink, chunk_size);
- return -ENOMEM;
- }
-
- glink_rpm_rx_peak(glink, channel->buf + channel->buf_offset, chunk_size);
- channel->buf_offset += chunk_size;
-
- /* Handle message when no fragments remain to be received */
- if (!left_size) {
- spin_lock(&channel->recv_lock);
- if (channel->ept.cb) {
- channel->ept.cb(channel->ept.rpdev,
- channel->buf,
- channel->buf_offset,
- channel->ept.priv,
- RPMSG_ADDR_ANY);
- }
- spin_unlock(&channel->recv_lock);
-
- kfree(channel->buf);
- channel->buf = NULL;
- channel->buf_size = 0;
- }
-
- /* Each message starts at 8 byte aligned address */
- glink_rpm_rx_advance(glink, ALIGN(chunk_size, 8));
-
- return 0;
-}
-
-static int glink_rpm_rx_open_ack(struct glink_rpm *glink, unsigned int lcid)
-{
- struct glink_channel *channel;
-
- channel = idr_find(&glink->lcids, lcid);
- if (!channel) {
- dev_err(glink->dev, "Invalid open ack packet\n");
- return -EINVAL;
- }
-
- complete(&channel->open_ack);
-
- return 0;
-}
-
-static irqreturn_t glink_rpm_intr(int irq, void *data)
-{
- struct glink_rpm *glink = data;
- struct glink_msg msg;
- unsigned int param1;
- unsigned int param2;
- unsigned int avail;
- unsigned int cmd;
- int ret;
-
- for (;;) {
- avail = glink_rpm_rx_avail(glink);
- if (avail < sizeof(msg))
- break;
-
- glink_rpm_rx_peak(glink, &msg, sizeof(msg));
-
- cmd = le16_to_cpu(msg.cmd);
- param1 = le16_to_cpu(msg.param1);
- param2 = le32_to_cpu(msg.param2);
-
- switch (cmd) {
- case RPM_CMD_VERSION:
- case RPM_CMD_VERSION_ACK:
- case RPM_CMD_CLOSE:
- case RPM_CMD_CLOSE_ACK:
- ret = glink_rpm_rx_defer(glink, 0);
- break;
- case RPM_CMD_OPEN_ACK:
- ret = glink_rpm_rx_open_ack(glink, param1);
- glink_rpm_rx_advance(glink, ALIGN(sizeof(msg), 8));
- break;
- case RPM_CMD_OPEN:
- ret = glink_rpm_rx_defer(glink, param2);
- break;
- case RPM_CMD_TX_DATA:
- case RPM_CMD_TX_DATA_CONT:
- ret = glink_rpm_rx_data(glink, avail);
- break;
- case RPM_CMD_READ_NOTIF:
- glink_rpm_rx_advance(glink, ALIGN(sizeof(msg), 8));
-
- mbox_send_message(glink->mbox_chan, NULL);
- mbox_client_txdone(glink->mbox_chan, 0);
-
- ret = 0;
- break;
- default:
- dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
- ret = -EINVAL;
- break;
- }
-
- if (ret)
- break;
- }
-
- return IRQ_HANDLED;
-}
-
-/* Locally initiated rpmsg_create_ept */
-static struct glink_channel *glink_rpm_create_local(struct glink_rpm *glink,
- const char *name)
-{
- struct glink_channel *channel;
- int ret;
-
- channel = glink_rpm_alloc_channel(glink, name);
- if (IS_ERR(channel))
- return ERR_CAST(channel);
-
- ret = glink_rpm_send_open_req(glink, channel);
- if (ret)
- goto release_channel;
-
- ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ);
- if (!ret)
- goto err_timeout;
-
- ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ);
- if (!ret)
- goto err_timeout;
-
- glink_rpm_send_open_ack(glink, channel);
-
- return channel;
-
-err_timeout:
- /* glink_rpm_send_open_req() did register the channel in lcids*/
- mutex_lock(&glink->idr_lock);
- idr_remove(&glink->lcids, channel->lcid);
- mutex_unlock(&glink->idr_lock);
-
-release_channel:
- /* Release glink_rpm_send_open_req() reference */
- kref_put(&channel->refcount, glink_rpm_channel_release);
- /* Release glink_rpm_alloc_channel() reference */
- kref_put(&channel->refcount, glink_rpm_channel_release);
-
- return ERR_PTR(-ETIMEDOUT);
-}
-
-/* Remote initiated rpmsg_create_ept */
-static int glink_rpm_create_remote(struct glink_rpm *glink,
- struct glink_channel *channel)
-{
- int ret;
-
- glink_rpm_send_open_ack(glink, channel);
-
- ret = glink_rpm_send_open_req(glink, channel);
- if (ret)
- goto close_link;
-
- ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ);
- if (!ret) {
- ret = -ETIMEDOUT;
- goto close_link;
- }
-
- return 0;
+ /* Header length comes from glink native and is always 4 byte aligned */
+ if (WARN(hlen % 4, "Glink Header length must be 4 bytes aligned\n"))
+ return;
-close_link:
/*
- * Send a close request to "undo" our open-ack. The close-ack will
- * release the last reference.
+ * Move the unaligned tail of the message to the padding chunk, to
+ * ensure word aligned accesses
*/
- glink_rpm_send_close_req(glink, channel);
-
- /* Release glink_rpm_send_open_req() reference */
- kref_put(&channel->refcount, glink_rpm_channel_release);
-
- return ret;
-}
-
-static struct rpmsg_endpoint *glink_rpm_create_ept(struct rpmsg_device *rpdev,
- rpmsg_rx_cb_t cb, void *priv,
- struct rpmsg_channel_info chinfo)
-{
- struct glink_channel *parent = to_glink_channel(rpdev->ept);
- struct glink_channel *channel;
- struct glink_rpm *glink = parent->glink;
- struct rpmsg_endpoint *ept;
- const char *name = chinfo.name;
- int cid;
- int ret;
-
- idr_for_each_entry(&glink->rcids, channel, cid) {
- if (!strcmp(channel->name, name))
- break;
- }
-
- if (!channel) {
- channel = glink_rpm_create_local(glink, name);
- if (IS_ERR(channel))
- return NULL;
- } else {
- ret = glink_rpm_create_remote(glink, channel);
- if (ret)
- return NULL;
- }
-
- ept = &channel->ept;
- ept->rpdev = rpdev;
- ept->cb = cb;
- ept->priv = priv;
- ept->ops = &glink_endpoint_ops;
-
- return ept;
-}
-
-static void glink_rpm_destroy_ept(struct rpmsg_endpoint *ept)
-{
- struct glink_channel *channel = to_glink_channel(ept);
- struct glink_rpm *glink = channel->glink;
- unsigned long flags;
-
- spin_lock_irqsave(&channel->recv_lock, flags);
- channel->ept.cb = NULL;
- spin_unlock_irqrestore(&channel->recv_lock, flags);
-
- /* Decouple the potential rpdev from the channel */
- channel->rpdev = NULL;
-
- glink_rpm_send_close_req(glink, channel);
-}
-
-static int __glink_rpm_send(struct glink_channel *channel,
- void *data, int len, bool wait)
-{
- struct glink_rpm *glink = channel->glink;
- struct {
- struct glink_msg msg;
- __le32 chunk_size;
- __le32 left_size;
- } __packed req;
-
- if (WARN(len % 8, "RPM GLINK expects 8 byte aligned messages\n"))
- return -EINVAL;
-
- req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA);
- req.msg.param1 = cpu_to_le16(channel->lcid);
- req.msg.param2 = cpu_to_le32(channel->rcid);
- req.chunk_size = cpu_to_le32(len);
- req.left_size = cpu_to_le32(0);
-
- return glink_rpm_tx(glink, &req, sizeof(req), data, len, wait);
-}
-
-static int glink_rpm_send(struct rpmsg_endpoint *ept, void *data, int len)
-{
- struct glink_channel *channel = to_glink_channel(ept);
-
- return __glink_rpm_send(channel, data, len, true);
-}
-
-static int glink_rpm_trysend(struct rpmsg_endpoint *ept, void *data, int len)
-{
- struct glink_channel *channel = to_glink_channel(ept);
-
- return __glink_rpm_send(channel, data, len, false);
-}
-
-/*
- * Finds the device_node for the glink child interested in this channel.
- */
-static struct device_node *glink_rpm_match_channel(struct device_node *node,
- const char *channel)
-{
- struct device_node *child;
- const char *name;
- const char *key;
- int ret;
-
- for_each_available_child_of_node(node, child) {
- key = "qcom,glink-channels";
- ret = of_property_read_string(child, key, &name);
- if (ret)
- continue;
-
- if (strcmp(name, channel) == 0)
- return child;
- }
-
- return NULL;
-}
-
-static const struct rpmsg_device_ops glink_device_ops = {
- .create_ept = glink_rpm_create_ept,
-};
-
-static const struct rpmsg_endpoint_ops glink_endpoint_ops = {
- .destroy_ept = glink_rpm_destroy_ept,
- .send = glink_rpm_send,
- .trysend = glink_rpm_trysend,
-};
-
-static void glink_rpm_rpdev_release(struct device *dev)
-{
- struct rpmsg_device *rpdev = to_rpmsg_device(dev);
- struct glink_channel *channel = to_glink_channel(rpdev->ept);
-
- channel->rpdev = NULL;
- kfree(rpdev);
-}
-
-static int glink_rpm_rx_open(struct glink_rpm *glink, unsigned int rcid,
- char *name)
-{
- struct glink_channel *channel;
- struct rpmsg_device *rpdev;
- bool create_device = false;
- int lcid;
- int ret;
-
- idr_for_each_entry(&glink->lcids, channel, lcid) {
- if (!strcmp(channel->name, name))
- break;
- }
-
- if (!channel) {
- channel = glink_rpm_alloc_channel(glink, name);
- if (IS_ERR(channel))
- return PTR_ERR(channel);
-
- /* The opening dance was initiated by the remote */
- create_device = true;
- }
-
- mutex_lock(&glink->idr_lock);
- ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_KERNEL);
- if (ret < 0) {
- dev_err(glink->dev, "Unable to insert channel into rcid list\n");
- mutex_unlock(&glink->idr_lock);
- goto free_channel;
- }
- channel->rcid = ret;
- mutex_unlock(&glink->idr_lock);
-
- complete(&channel->open_req);
-
- if (create_device) {
- rpdev = kzalloc(sizeof(*rpdev), GFP_KERNEL);
- if (!rpdev) {
- ret = -ENOMEM;
- goto rcid_remove;
- }
-
- rpdev->ept = &channel->ept;
- strncpy(rpdev->id.name, name, RPMSG_NAME_SIZE);
- rpdev->src = RPMSG_ADDR_ANY;
- rpdev->dst = RPMSG_ADDR_ANY;
- rpdev->ops = &glink_device_ops;
-
- rpdev->dev.of_node = glink_rpm_match_channel(glink->dev->of_node, name);
- rpdev->dev.parent = glink->dev;
- rpdev->dev.release = glink_rpm_rpdev_release;
-
- ret = rpmsg_register_device(rpdev);
- if (ret)
- goto free_rpdev;
-
- channel->rpdev = rpdev;
- }
-
- return 0;
-
-free_rpdev:
- kfree(rpdev);
-rcid_remove:
- mutex_lock(&glink->idr_lock);
- idr_remove(&glink->rcids, channel->rcid);
- channel->rcid = 0;
- mutex_unlock(&glink->idr_lock);
-free_channel:
- /* Release the reference, iff we took it */
- if (create_device)
- kref_put(&channel->refcount, glink_rpm_channel_release);
-
- return ret;
-}
-
-static void glink_rpm_rx_close(struct glink_rpm *glink, unsigned int rcid)
-{
- struct rpmsg_channel_info chinfo;
- struct glink_channel *channel;
-
- channel = idr_find(&glink->rcids, rcid);
- if (WARN(!channel, "close request on unknown channel\n"))
- return;
-
- if (channel->rpdev) {
- strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
- chinfo.src = RPMSG_ADDR_ANY;
- chinfo.dst = RPMSG_ADDR_ANY;
-
- rpmsg_unregister_device(glink->dev, &chinfo);
- }
-
- glink_rpm_send_close_ack(glink, channel->rcid);
-
- mutex_lock(&glink->idr_lock);
- idr_remove(&glink->rcids, channel->rcid);
- channel->rcid = 0;
- mutex_unlock(&glink->idr_lock);
-
- kref_put(&channel->refcount, glink_rpm_channel_release);
-}
+ aligned_dlen = ALIGN_DOWN(dlen, 4);
+ if (aligned_dlen != dlen)
+ memcpy(padding, data + aligned_dlen, dlen - aligned_dlen);
-static void glink_rpm_rx_close_ack(struct glink_rpm *glink, unsigned int lcid)
-{
- struct glink_channel *channel;
-
- channel = idr_find(&glink->lcids, lcid);
- if (WARN(!channel, "close ack on unknown channel\n"))
- return;
-
- mutex_lock(&glink->idr_lock);
- idr_remove(&glink->lcids, channel->lcid);
- channel->lcid = 0;
- mutex_unlock(&glink->idr_lock);
-
- kref_put(&channel->refcount, glink_rpm_channel_release);
-}
-
-static void glink_rpm_work(struct work_struct *work)
-{
- struct glink_rpm *glink = container_of(work, struct glink_rpm, rx_work);
- struct glink_defer_cmd *dcmd;
- struct glink_msg *msg;
- unsigned long flags;
- unsigned int param1;
- unsigned int param2;
- unsigned int cmd;
-
- for (;;) {
- spin_lock_irqsave(&glink->rx_lock, flags);
- if (list_empty(&glink->rx_queue)) {
- spin_unlock_irqrestore(&glink->rx_lock, flags);
- break;
- }
- dcmd = list_first_entry(&glink->rx_queue, struct glink_defer_cmd, node);
- list_del(&dcmd->node);
- spin_unlock_irqrestore(&glink->rx_lock, flags);
-
- msg = &dcmd->msg;
- cmd = le16_to_cpu(msg->cmd);
- param1 = le16_to_cpu(msg->param1);
- param2 = le32_to_cpu(msg->param2);
-
- switch (cmd) {
- case RPM_CMD_VERSION:
- glink_rpm_send_version_ack(glink);
- break;
- case RPM_CMD_VERSION_ACK:
- break;
- case RPM_CMD_OPEN:
- glink_rpm_rx_open(glink, param1, msg->data);
- break;
- case RPM_CMD_CLOSE:
- glink_rpm_rx_close(glink, param1);
- break;
- case RPM_CMD_CLOSE_ACK:
- glink_rpm_rx_close_ack(glink, param1);
- break;
- default:
- WARN(1, "Unknown defer object %d\n", cmd);
- break;
- }
+ head = readl(pipe->head);
+ head = glink_rpm_tx_write_one(pipe, head, hdr, hlen);
+ head = glink_rpm_tx_write_one(pipe, head, data, aligned_dlen);
- kfree(dcmd);
- }
+ pad = ALIGN(tlen, 8) - ALIGN_DOWN(tlen, 4);
+ if (pad)
+ head = glink_rpm_tx_write_one(pipe, head, padding, pad);
+ writel(head, pipe->head);
}
static int glink_rpm_parse_toc(struct device *dev,
@@ -1067,14 +233,14 @@ static int glink_rpm_parse_toc(struct device *dev,
switch (id) {
case RPM_RX_FIFO_ID:
- rx->length = size;
+ rx->native.length = size;
rx->tail = msg_ram + offset;
rx->head = msg_ram + offset + sizeof(u32);
rx->fifo = msg_ram + offset + 2 * sizeof(u32);
break;
case RPM_TX_FIFO_ID:
- tx->length = size;
+ tx->native.length = size;
tx->tail = msg_ram + offset;
tx->head = msg_ram + offset + sizeof(u32);
@@ -1098,38 +264,21 @@ err_inval:
static int glink_rpm_probe(struct platform_device *pdev)
{
- struct glink_rpm *glink;
+ struct qcom_glink *glink;
+ struct glink_rpm_pipe *rx_pipe;
+ struct glink_rpm_pipe *tx_pipe;
struct device_node *np;
void __iomem *msg_ram;
size_t msg_ram_size;
struct device *dev = &pdev->dev;
struct resource r;
- int irq;
int ret;
- glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL);
- if (!glink)
+ rx_pipe = devm_kzalloc(&pdev->dev, sizeof(*rx_pipe), GFP_KERNEL);
+ tx_pipe = devm_kzalloc(&pdev->dev, sizeof(*tx_pipe), GFP_KERNEL);
+ if (!rx_pipe || !tx_pipe)
return -ENOMEM;
- glink->dev = dev;
-
- mutex_init(&glink->tx_lock);
- spin_lock_init(&glink->rx_lock);
- INIT_LIST_HEAD(&glink->rx_queue);
- INIT_WORK(&glink->rx_work, glink_rpm_work);
-
- mutex_init(&glink->idr_lock);
- idr_init(&glink->lcids);
- idr_init(&glink->rcids);
-
- glink->mbox_client.dev = &pdev->dev;
- glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0);
- if (IS_ERR(glink->mbox_chan)) {
- if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER)
- dev_err(&pdev->dev, "failed to acquire IPC channel\n");
- return PTR_ERR(glink->mbox_chan);
- }
-
np = of_parse_phandle(dev->of_node, "qcom,rpm-msg-ram", 0);
ret = of_address_to_resource(np, 0, &r);
of_node_put(np);
@@ -1142,61 +291,38 @@ static int glink_rpm_probe(struct platform_device *pdev)
return -ENOMEM;
ret = glink_rpm_parse_toc(dev, msg_ram, msg_ram_size,
- &glink->rx_pipe, &glink->tx_pipe);
+ rx_pipe, tx_pipe);
if (ret)
return ret;
- writel(0, glink->tx_pipe.head);
- writel(0, glink->rx_pipe.tail);
+ /* Pipe specific accessors */
+ rx_pipe->native.avail = glink_rpm_rx_avail;
+ rx_pipe->native.peak = glink_rpm_rx_peak;
+ rx_pipe->native.advance = glink_rpm_rx_advance;
+ tx_pipe->native.avail = glink_rpm_tx_avail;
+ tx_pipe->native.write = glink_rpm_tx_write;
- irq = platform_get_irq(pdev, 0);
- ret = devm_request_irq(dev, irq,
- glink_rpm_intr,
- IRQF_NO_SUSPEND | IRQF_SHARED,
- "glink-rpm", glink);
- if (ret) {
- dev_err(dev, "Failed to request IRQ\n");
- return ret;
- }
-
- glink->irq = irq;
+ writel(0, tx_pipe->head);
+ writel(0, rx_pipe->tail);
- ret = glink_rpm_send_version(glink);
- if (ret)
- return ret;
+ glink = qcom_glink_native_probe(&pdev->dev,
+ 0,
+ &rx_pipe->native,
+ &tx_pipe->native,
+ true);
+ if (IS_ERR(glink))
+ return PTR_ERR(glink);
platform_set_drvdata(pdev, glink);
return 0;
}
-static int glink_rpm_remove_device(struct device *dev, void *data)
-{
- device_unregister(dev);
-
- return 0;
-}
-
static int glink_rpm_remove(struct platform_device *pdev)
{
- struct glink_rpm *glink = platform_get_drvdata(pdev);
- struct glink_channel *channel;
- int cid;
- int ret;
-
- disable_irq(glink->irq);
- cancel_work_sync(&glink->rx_work);
-
- ret = device_for_each_child(glink->dev, NULL, glink_rpm_remove_device);
- if (ret)
- dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret);
-
- /* Release any defunct local channels, waiting for close-ack */
- idr_for_each_entry(&glink->lcids, channel, cid)
- kref_put(&channel->refcount, glink_rpm_channel_release);
+ struct qcom_glink *glink = platform_get_drvdata(pdev);
- idr_destroy(&glink->lcids);
- idr_destroy(&glink->rcids);
+ qcom_glink_native_remove(glink);
return 0;
}
diff --git a/drivers/rpmsg/qcom_glink_smem.c b/drivers/rpmsg/qcom_glink_smem.c
new file mode 100644
index 000000000000..5cdaa5f8fb61
--- /dev/null
+++ b/drivers/rpmsg/qcom_glink_smem.c
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 2016, Linaro Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+#include <linux/rpmsg.h>
+#include <linux/idr.h>
+#include <linux/circ_buf.h>
+#include <linux/soc/qcom/smem.h>
+#include <linux/sizes.h>
+#include <linux/delay.h>
+#include <linux/regmap.h>
+#include <linux/workqueue.h>
+#include <linux/list.h>
+
+#include <linux/delay.h>
+#include <linux/rpmsg.h>
+#include <linux/rpmsg/qcom_glink.h>
+
+#include "qcom_glink_native.h"
+
+#define FIFO_FULL_RESERVE 8
+#define FIFO_ALIGNMENT 8
+#define TX_BLOCKED_CMD_RESERVE 8 /* size of struct read_notif_request */
+
+#define SMEM_GLINK_NATIVE_XPRT_DESCRIPTOR 478
+#define SMEM_GLINK_NATIVE_XPRT_FIFO_0 479
+#define SMEM_GLINK_NATIVE_XPRT_FIFO_1 480
+
+struct glink_smem_pipe {
+ struct qcom_glink_pipe native;
+
+ __le32 *tail;
+ __le32 *head;
+
+ void *fifo;
+
+ int remote_pid;
+};
+
+#define to_smem_pipe(p) container_of(p, struct glink_smem_pipe, native)
+
+static size_t glink_smem_rx_avail(struct qcom_glink_pipe *np)
+{
+ struct glink_smem_pipe *pipe = to_smem_pipe(np);
+ size_t len;
+ void *fifo;
+ u32 head;
+ u32 tail;
+
+ if (!pipe->fifo) {
+ fifo = qcom_smem_get(pipe->remote_pid,
+ SMEM_GLINK_NATIVE_XPRT_FIFO_1, &len);
+ if (IS_ERR(fifo)) {
+ pr_err("failed to acquire RX fifo handle: %ld\n",
+ PTR_ERR(fifo));
+ return 0;
+ }
+
+ pipe->fifo = fifo;
+ pipe->native.length = len;
+ }
+
+ head = le32_to_cpu(*pipe->head);
+ tail = le32_to_cpu(*pipe->tail);
+
+ if (head < tail)
+ return pipe->native.length - tail + head;
+ else
+ return head - tail;
+}
+
+static void glink_smem_rx_peak(struct qcom_glink_pipe *np,
+ void *data, unsigned int offset, size_t count)
+{
+ struct glink_smem_pipe *pipe = to_smem_pipe(np);
+ size_t len;
+ u32 tail;
+
+ tail = le32_to_cpu(*pipe->tail);
+ tail += offset;
+ if (tail >= pipe->native.length)
+ tail -= pipe->native.length;
+
+ len = min_t(size_t, count, pipe->native.length - tail);
+ if (len) {
+ __ioread32_copy(data, pipe->fifo + tail,
+ len / sizeof(u32));
+ }
+
+ if (len != count) {
+ __ioread32_copy(data + len, pipe->fifo,
+ (count - len) / sizeof(u32));
+ }
+}
+
+static void glink_smem_rx_advance(struct qcom_glink_pipe *np,
+ size_t count)
+{
+ struct glink_smem_pipe *pipe = to_smem_pipe(np);
+ u32 tail;
+
+ tail = le32_to_cpu(*pipe->tail);
+
+ tail += count;
+ if (tail > pipe->native.length)
+ tail -= pipe->native.length;
+
+ *pipe->tail = cpu_to_le32(tail);
+}
+
+static size_t glink_smem_tx_avail(struct qcom_glink_pipe *np)
+{
+ struct glink_smem_pipe *pipe = to_smem_pipe(np);
+ u32 head;
+ u32 tail;
+ u32 avail;
+
+ head = le32_to_cpu(*pipe->head);
+ tail = le32_to_cpu(*pipe->tail);
+
+ if (tail <= head)
+ avail = pipe->native.length - head + tail;
+ else
+ avail = tail - head;
+
+ if (avail < (FIFO_FULL_RESERVE + TX_BLOCKED_CMD_RESERVE))
+ avail = 0;
+ else
+ avail -= FIFO_FULL_RESERVE + TX_BLOCKED_CMD_RESERVE;
+
+ return avail;
+}
+
+static unsigned int glink_smem_tx_write_one(struct glink_smem_pipe *pipe,
+ unsigned int head,
+ const void *data, size_t count)
+{
+ size_t len;
+
+ len = min_t(size_t, count, pipe->native.length - head);
+ if (len)
+ memcpy(pipe->fifo + head, data, len);
+
+ if (len != count)
+ memcpy(pipe->fifo, data + len, count - len);
+
+ head += count;
+ if (head >= pipe->native.length)
+ head -= pipe->native.length;
+
+ return head;
+}
+
+static void glink_smem_tx_write(struct qcom_glink_pipe *glink_pipe,
+ const void *hdr, size_t hlen,
+ const void *data, size_t dlen)
+{
+ struct glink_smem_pipe *pipe = to_smem_pipe(glink_pipe);
+ unsigned int head;
+
+ head = le32_to_cpu(*pipe->head);
+
+ head = glink_smem_tx_write_one(pipe, head, hdr, hlen);
+ head = glink_smem_tx_write_one(pipe, head, data, dlen);
+
+ /* Ensure head is always aligned to 8 bytes */
+ head = ALIGN(head, 8);
+ if (head >= pipe->native.length)
+ head -= pipe->native.length;
+
+ *pipe->head = cpu_to_le32(head);
+}
+
+static void qcom_glink_smem_release(struct device *dev)
+{
+ kfree(dev);
+}
+
+struct qcom_glink *qcom_glink_smem_register(struct device *parent,
+ struct device_node *node)
+{
+ struct glink_smem_pipe *rx_pipe;
+ struct glink_smem_pipe *tx_pipe;
+ struct qcom_glink *glink;
+ struct device *dev;
+ u32 remote_pid;
+ __le32 *descs;
+ size_t size;
+ int ret;
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return ERR_PTR(-ENOMEM);
+
+ dev->parent = parent;
+ dev->of_node = node;
+ dev->release = qcom_glink_smem_release;
+ dev_set_name(dev, "%s:%s", node->parent->name, node->name);
+ ret = device_register(dev);
+ if (ret) {
+ pr_err("failed to register glink edge\n");
+ return ERR_PTR(ret);
+ }
+
+ ret = of_property_read_u32(dev->of_node, "qcom,remote-pid",
+ &remote_pid);
+ if (ret) {
+ dev_err(dev, "failed to parse qcom,remote-pid\n");
+ goto err_put_dev;
+ }
+
+ rx_pipe = devm_kzalloc(dev, sizeof(*rx_pipe), GFP_KERNEL);
+ tx_pipe = devm_kzalloc(dev, sizeof(*tx_pipe), GFP_KERNEL);
+ if (!rx_pipe || !tx_pipe) {
+ ret = -ENOMEM;
+ goto err_put_dev;
+ }
+
+ ret = qcom_smem_alloc(remote_pid,
+ SMEM_GLINK_NATIVE_XPRT_DESCRIPTOR, 32);
+ if (ret && ret != -EEXIST) {
+ dev_err(dev, "failed to allocate glink descriptors\n");
+ goto err_put_dev;
+ }
+
+ descs = qcom_smem_get(remote_pid,
+ SMEM_GLINK_NATIVE_XPRT_DESCRIPTOR, &size);
+ if (IS_ERR(descs)) {
+ dev_err(dev, "failed to acquire xprt descriptor\n");
+ ret = PTR_ERR(descs);
+ goto err_put_dev;
+ }
+
+ if (size != 32) {
+ dev_err(dev, "glink descriptor of invalid size\n");
+ ret = -EINVAL;
+ goto err_put_dev;
+ }
+
+ tx_pipe->tail = &descs[0];
+ tx_pipe->head = &descs[1];
+ rx_pipe->tail = &descs[2];
+ rx_pipe->head = &descs[3];
+
+ ret = qcom_smem_alloc(remote_pid, SMEM_GLINK_NATIVE_XPRT_FIFO_0,
+ SZ_16K);
+ if (ret && ret != -EEXIST) {
+ dev_err(dev, "failed to allocate TX fifo\n");
+ goto err_put_dev;
+ }
+
+ tx_pipe->fifo = qcom_smem_get(remote_pid, SMEM_GLINK_NATIVE_XPRT_FIFO_0,
+ &tx_pipe->native.length);
+ if (IS_ERR(tx_pipe->fifo)) {
+ dev_err(dev, "failed to acquire TX fifo\n");
+ ret = PTR_ERR(tx_pipe->fifo);
+ goto err_put_dev;
+ }
+
+ rx_pipe->native.avail = glink_smem_rx_avail;
+ rx_pipe->native.peak = glink_smem_rx_peak;
+ rx_pipe->native.advance = glink_smem_rx_advance;
+ rx_pipe->remote_pid = remote_pid;
+
+ tx_pipe->native.avail = glink_smem_tx_avail;
+ tx_pipe->native.write = glink_smem_tx_write;
+ tx_pipe->remote_pid = remote_pid;
+
+ *rx_pipe->tail = 0;
+ *tx_pipe->head = 0;
+
+ glink = qcom_glink_native_probe(dev,
+ GLINK_FEATURE_INTENT_REUSE,
+ &rx_pipe->native, &tx_pipe->native,
+ false);
+ if (IS_ERR(glink)) {
+ ret = PTR_ERR(glink);
+ goto err_put_dev;
+ }
+
+ return glink;
+
+err_put_dev:
+ put_device(dev);
+
+ return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(qcom_glink_smem_register);
+
+void qcom_glink_smem_unregister(struct qcom_glink *glink)
+{
+ qcom_glink_native_remove(glink);
+ qcom_glink_native_unregister(glink);
+}
+EXPORT_SYMBOL_GPL(qcom_glink_smem_unregister);
+
+MODULE_AUTHOR("Bjorn Andersson <[email protected]>");
+MODULE_DESCRIPTION("Qualcomm GLINK SMEM driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
index a0a39a8821a3..b01774e9fac0 100644
--- a/drivers/rpmsg/qcom_smd.c
+++ b/drivers/rpmsg/qcom_smd.c
@@ -1368,6 +1368,7 @@ struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent,
edge->dev.parent = parent;
edge->dev.release = qcom_smd_edge_release;
+ edge->dev.of_node = node;
edge->dev.groups = qcom_smd_edge_groups;
dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name);
ret = device_register(&edge->dev);
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index eee2a9f77d37..82b83002fcba 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -45,6 +45,7 @@
* @rbufs: kernel address of rx buffers
* @sbufs: kernel address of tx buffers
* @num_bufs: total number of buffers for rx and tx
+ * @buf_size: size of one rx or tx buffer
* @last_sbuf: index of last tx buffer used
* @bufs_dma: dma base addr of the buffers
* @tx_lock: protects svq, sbufs and sleepers, to allow concurrent senders.
@@ -65,6 +66,7 @@ struct virtproc_info {
struct virtqueue *rvq, *svq;
void *rbufs, *sbufs;
unsigned int num_bufs;
+ unsigned int buf_size;
int last_sbuf;
dma_addr_t bufs_dma;
struct mutex tx_lock;
@@ -158,7 +160,7 @@ struct virtio_rpmsg_channel {
* processor.
*/
#define MAX_RPMSG_NUM_BUFS (512)
-#define RPMSG_BUF_SIZE (512)
+#define MAX_RPMSG_BUF_SIZE (512)
/*
* Local addresses are dynamically allocated on-demand.
@@ -193,6 +195,28 @@ static const struct rpmsg_endpoint_ops virtio_endpoint_ops = {
};
/**
+ * rpmsg_sg_init - initialize scatterlist according to cpu address location
+ * @sg: scatterlist to fill
+ * @cpu_addr: virtual address of the buffer
+ * @len: buffer length
+ *
+ * An internal function filling scatterlist according to virtual address
+ * location (in vmalloc or in kernel).
+ */
+static void
+rpmsg_sg_init(struct scatterlist *sg, void *cpu_addr, unsigned int len)
+{
+ if (is_vmalloc_addr(cpu_addr)) {
+ sg_init_table(sg, 1);
+ sg_set_page(sg, vmalloc_to_page(cpu_addr), len,
+ offset_in_page(cpu_addr));
+ } else {
+ WARN_ON(!virt_addr_valid(cpu_addr));
+ sg_init_one(sg, cpu_addr, len);
+ }
+}
+
+/**
* __ept_release() - deallocate an rpmsg endpoint
* @kref: the ept's reference count
*
@@ -435,7 +459,7 @@ static void *get_a_tx_buf(struct virtproc_info *vrp)
* (half of our buffers are used for sending messages)
*/
if (vrp->last_sbuf < vrp->num_bufs / 2)
- ret = vrp->sbufs + RPMSG_BUF_SIZE * vrp->last_sbuf++;
+ ret = vrp->sbufs + vrp->buf_size * vrp->last_sbuf++;
/* or recycle a used one */
else
ret = virtqueue_get_buf(vrp->svq, &len);
@@ -561,7 +585,7 @@ static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev,
* messaging), or to improve the buffer allocator, to support
* variable-length buffer sizes.
*/
- if (len > RPMSG_BUF_SIZE - sizeof(struct rpmsg_hdr)) {
+ if (len > vrp->buf_size - sizeof(struct rpmsg_hdr)) {
dev_err(dev, "message is too big (%d)\n", len);
return -EMSGSIZE;
}
@@ -610,7 +634,7 @@ static int rpmsg_send_offchannel_raw(struct rpmsg_device *rpdev,
msg, sizeof(*msg) + msg->len, true);
#endif
- sg_init_one(&sg, msg, sizeof(*msg) + len);
+ rpmsg_sg_init(&sg, msg, sizeof(*msg) + len);
mutex_lock(&vrp->tx_lock);
@@ -632,7 +656,6 @@ out:
mutex_unlock(&vrp->tx_lock);
return err;
}
-EXPORT_SYMBOL(rpmsg_send_offchannel_raw);
static int virtio_rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len)
{
@@ -702,7 +725,7 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
* We currently use fixed-sized buffers, so trivially sanitize
* the reported payload length.
*/
- if (len > RPMSG_BUF_SIZE ||
+ if (len > vrp->buf_size ||
msg->len > (len - sizeof(struct rpmsg_hdr))) {
dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len);
return -EINVAL;
@@ -735,7 +758,7 @@ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
dev_warn(dev, "msg received with no recipient\n");
/* publish the real size of the buffer */
- sg_init_one(&sg, msg, RPMSG_BUF_SIZE);
+ rpmsg_sg_init(&sg, msg, vrp->buf_size);
/* add the buffer back to the remote processor's virtqueue */
err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, msg, GFP_KERNEL);
@@ -892,7 +915,9 @@ static int rpmsg_probe(struct virtio_device *vdev)
else
vrp->num_bufs = MAX_RPMSG_NUM_BUFS;
- total_buf_space = vrp->num_bufs * RPMSG_BUF_SIZE;
+ vrp->buf_size = MAX_RPMSG_BUF_SIZE;
+
+ total_buf_space = vrp->num_bufs * vrp->buf_size;
/* allocate coherent memory for the buffers */
bufs_va = dma_alloc_coherent(vdev->dev.parent->parent,
@@ -915,9 +940,9 @@ static int rpmsg_probe(struct virtio_device *vdev)
/* set up the receive buffers */
for (i = 0; i < vrp->num_bufs / 2; i++) {
struct scatterlist sg;
- void *cpu_addr = vrp->rbufs + i * RPMSG_BUF_SIZE;
+ void *cpu_addr = vrp->rbufs + i * vrp->buf_size;
- sg_init_one(&sg, cpu_addr, RPMSG_BUF_SIZE);
+ rpmsg_sg_init(&sg, cpu_addr, vrp->buf_size);
err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, cpu_addr,
GFP_KERNEL);
@@ -982,7 +1007,7 @@ static int rpmsg_remove_device(struct device *dev, void *data)
static void rpmsg_remove(struct virtio_device *vdev)
{
struct virtproc_info *vrp = vdev->priv;
- size_t total_buf_space = vrp->num_bufs * RPMSG_BUF_SIZE;
+ size_t total_buf_space = vrp->num_bufs * vrp->buf_size;
int ret;
vdev->config->reset(vdev);
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 72419ac2c52a..e0e58f3b1420 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -227,14 +227,14 @@ config RTC_DRV_AS3722
will be called rtc-as3722.
config RTC_DRV_DS1307
- tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025, ISL12057"
+ tristate "Dallas/Maxim DS1307/37/38/39/40/41, ST M41T00, EPSON RX-8025, ISL12057"
help
If you say yes here you get support for various compatible RTC
chips (often with battery backup) connected with I2C. This driver
- should handle DS1307, DS1337, DS1338, DS1339, DS1340, ST M41T00,
- EPSON RX-8025, Intersil ISL12057 and probably other chips. In some
- cases the RTC must already have been initialized (by manufacturing or
- a bootloader).
+ should handle DS1307, DS1337, DS1338, DS1339, DS1340, DS1341,
+ ST M41T00, EPSON RX-8025, Intersil ISL12057 and probably other chips.
+ In some cases the RTC must already have been initialized (by
+ manufacturing or a bootloader).
The first seven registers on these chips hold an RTC, and other
registers may add features such as NVRAM, a trickle charger for
@@ -371,11 +371,11 @@ config RTC_DRV_MAX77686
will be called rtc-max77686.
config RTC_DRV_RK808
- tristate "Rockchip RK808/RK818 RTC"
+ tristate "Rockchip RK805/RK808/RK818 RTC"
depends on MFD_RK808
help
If you say yes here you will get support for the
- RTC of RK808 and RK818 PMIC.
+ RTC of RK805, RK808 and RK818 PMIC.
This driver can also be built as a module. If so, the module
will be called rk808-rtc.
@@ -1765,6 +1765,14 @@ config RTC_DRV_CPCAP
Say y here for CPCAP rtc found on some Motorola phones
and tablets such as Droid 4.
+config RTC_DRV_RTD119X
+ bool "Realtek RTD129x RTC"
+ depends on ARCH_REALTEK || COMPILE_TEST
+ default ARCH_REALTEK
+ help
+ If you say yes here, you get support for the RTD1295 SoC
+ Real Time Clock.
+
comment "HID Sensor RTC drivers"
config RTC_DRV_HID_SENSOR_TIME
@@ -1780,5 +1788,13 @@ config RTC_DRV_HID_SENSOR_TIME
If this driver is compiled as a module, it will be named
rtc-hid-sensor-time.
+config RTC_DRV_GOLDFISH
+ tristate "Goldfish Real Time Clock"
+ depends on MIPS && (GOLDFISH || COMPILE_TEST)
+ help
+ Say yes to enable RTC driver for the Goldfish based virtual platform.
+
+ Goldfish is a code name for the virtual platform developed by Google
+ for Android emulation.
endif # RTC_CLASS
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index acd366b41c85..7230014c92af 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -131,6 +131,7 @@ obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c01.o
obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
+obj-$(CONFIG_RTC_DRV_RTD119X) += rtc-rtd119x.o
obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o
obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o
obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o
@@ -170,3 +171,4 @@ obj-$(CONFIG_RTC_DRV_WM8350) += rtc-wm8350.o
obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o
obj-$(CONFIG_RTC_DRV_XGENE) += rtc-xgene.o
obj-$(CONFIG_RTC_DRV_ZYNQMP) += rtc-zynqmp.o
+obj-$(CONFIG_RTC_DRV_GOLDFISH) += rtc-goldfish.o
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c
index 794bc4fa4937..00efe24a6063 100644
--- a/drivers/rtc/rtc-dev.c
+++ b/drivers/rtc/rtc-dev.c
@@ -24,28 +24,19 @@ static dev_t rtc_devt;
static int rtc_dev_open(struct inode *inode, struct file *file)
{
- int err;
struct rtc_device *rtc = container_of(inode->i_cdev,
struct rtc_device, char_dev);
- const struct rtc_class_ops *ops = rtc->ops;
if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags))
return -EBUSY;
file->private_data = rtc;
- err = ops->open ? ops->open(rtc->dev.parent) : 0;
- if (err == 0) {
- spin_lock_irq(&rtc->irq_lock);
- rtc->irq_data = 0;
- spin_unlock_irq(&rtc->irq_lock);
-
- return 0;
- }
+ spin_lock_irq(&rtc->irq_lock);
+ rtc->irq_data = 0;
+ spin_unlock_irq(&rtc->irq_lock);
- /* something has gone wrong */
- clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
- return err;
+ return 0;
}
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
@@ -438,9 +429,6 @@ static int rtc_dev_release(struct inode *inode, struct file *file)
rtc_update_irq_enable(rtc, 0);
rtc_irq_set_state(rtc, NULL, 0);
- if (rtc->ops->release)
- rtc->ops->release(rtc->dev.parent);
-
clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
return 0;
}
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index 4b43aa62fbc7..e7d9215c9201 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -39,6 +39,7 @@ enum ds_type {
ds_1338,
ds_1339,
ds_1340,
+ ds_1341,
ds_1388,
ds_3231,
m41t0,
@@ -50,7 +51,6 @@ enum ds_type {
/* rs5c372 too? different address... */
};
-
/* RTC registers don't differ much, except for the century flag */
#define DS1307_REG_SECS 0x00 /* 00-59 */
# define DS1307_BIT_CH 0x80
@@ -113,11 +113,7 @@ enum ds_type {
# define RX8025_BIT_VDET 0x40
# define RX8025_BIT_XST 0x20
-
struct ds1307 {
- u8 offset; /* register's offset */
- u8 regs[11];
- u16 nvram_offset;
struct nvmem_config nvmem_cfg;
enum ds_type type;
unsigned long flags;
@@ -126,7 +122,6 @@ struct ds1307 {
struct device *dev;
struct regmap *regmap;
const char *name;
- int irq;
struct rtc_device *rtc;
#ifdef CONFIG_COMMON_CLK
struct clk_hw clks[2];
@@ -137,18 +132,47 @@ struct chip_desc {
unsigned alarm:1;
u16 nvram_offset;
u16 nvram_size;
+ u8 offset; /* register's offset */
u8 century_reg;
u8 century_enable_bit;
u8 century_bit;
+ u8 bbsqi_bit;
+ irq_handler_t irq_handler;
+ const struct rtc_class_ops *rtc_ops;
u16 trickle_charger_reg;
- u8 trickle_charger_setup;
- u8 (*do_trickle_setup)(struct ds1307 *, uint32_t,
+ u8 (*do_trickle_setup)(struct ds1307 *, u32,
bool);
};
-static u8 do_trickle_setup_ds1339(struct ds1307 *, uint32_t ohms, bool diode);
+static int ds1307_get_time(struct device *dev, struct rtc_time *t);
+static int ds1307_set_time(struct device *dev, struct rtc_time *t);
+static u8 do_trickle_setup_ds1339(struct ds1307 *, u32 ohms, bool diode);
+static irqreturn_t rx8130_irq(int irq, void *dev_id);
+static int rx8130_read_alarm(struct device *dev, struct rtc_wkalrm *t);
+static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t);
+static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled);
+static irqreturn_t mcp794xx_irq(int irq, void *dev_id);
+static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t);
+static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t);
+static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled);
-static struct chip_desc chips[last_ds_type] = {
+static const struct rtc_class_ops rx8130_rtc_ops = {
+ .read_time = ds1307_get_time,
+ .set_time = ds1307_set_time,
+ .read_alarm = rx8130_read_alarm,
+ .set_alarm = rx8130_set_alarm,
+ .alarm_irq_enable = rx8130_alarm_irq_enable,
+};
+
+static const struct rtc_class_ops mcp794xx_rtc_ops = {
+ .read_time = ds1307_get_time,
+ .set_time = ds1307_set_time,
+ .read_alarm = mcp794xx_read_alarm,
+ .set_alarm = mcp794xx_set_alarm,
+ .alarm_irq_enable = mcp794xx_alarm_irq_enable,
+};
+
+static const struct chip_desc chips[last_ds_type] = {
[ds_1307] = {
.nvram_offset = 8,
.nvram_size = 56,
@@ -170,6 +194,7 @@ static struct chip_desc chips[last_ds_type] = {
.alarm = 1,
.century_reg = DS1307_REG_MONTH,
.century_bit = DS1337_BIT_CENTURY,
+ .bbsqi_bit = DS1339_BIT_BBSQI,
.trickle_charger_reg = 0x10,
.do_trickle_setup = &do_trickle_setup_ds1339,
},
@@ -179,25 +204,36 @@ static struct chip_desc chips[last_ds_type] = {
.century_bit = DS1340_BIT_CENTURY,
.trickle_charger_reg = 0x08,
},
+ [ds_1341] = {
+ .century_reg = DS1307_REG_MONTH,
+ .century_bit = DS1337_BIT_CENTURY,
+ },
[ds_1388] = {
+ .offset = 1,
.trickle_charger_reg = 0x0a,
},
[ds_3231] = {
.alarm = 1,
.century_reg = DS1307_REG_MONTH,
.century_bit = DS1337_BIT_CENTURY,
+ .bbsqi_bit = DS3231_BIT_BBSQW,
},
[rx_8130] = {
.alarm = 1,
/* this is battery backed SRAM */
.nvram_offset = 0x20,
.nvram_size = 4, /* 32bit (4 word x 8 bit) */
+ .offset = 0x10,
+ .irq_handler = rx8130_irq,
+ .rtc_ops = &rx8130_rtc_ops,
},
[mcp794xx] = {
.alarm = 1,
/* this is battery backed SRAM */
.nvram_offset = 0x20,
.nvram_size = 0x40,
+ .irq_handler = mcp794xx_irq,
+ .rtc_ops = &mcp794xx_rtc_ops,
},
};
@@ -209,6 +245,7 @@ static const struct i2c_device_id ds1307_id[] = {
{ "ds1339", ds_1339 },
{ "ds1388", ds_1388 },
{ "ds1340", ds_1340 },
+ { "ds1341", ds_1341 },
{ "ds3231", ds_3231 },
{ "m41t0", m41t0 },
{ "m41t00", m41t00 },
@@ -253,6 +290,10 @@ static const struct of_device_id ds1307_of_match[] = {
.data = (void *)ds_1340
},
{
+ .compatible = "dallas,ds1341",
+ .data = (void *)ds_1341
+ },
+ {
.compatible = "maxim,ds3231",
.data = (void *)ds_3231
},
@@ -298,6 +339,7 @@ static const struct acpi_device_id ds1307_acpi_ids[] = {
{ .id = "DS1339", .driver_data = ds_1339 },
{ .id = "DS1388", .driver_data = ds_1388 },
{ .id = "DS1340", .driver_data = ds_1340 },
+ { .id = "DS1341", .driver_data = ds_1341 },
{ .id = "DS3231", .driver_data = ds_3231 },
{ .id = "M41T0", .driver_data = m41t0 },
{ .id = "M41T00", .driver_data = m41t00 },
@@ -352,34 +394,36 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
struct ds1307 *ds1307 = dev_get_drvdata(dev);
int tmp, ret;
const struct chip_desc *chip = &chips[ds1307->type];
+ u8 regs[7];
/* read the RTC date and time registers all at once */
- ret = regmap_bulk_read(ds1307->regmap, ds1307->offset, ds1307->regs, 7);
+ ret = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
+ sizeof(regs));
if (ret) {
dev_err(dev, "%s error %d\n", "read", ret);
return ret;
}
- dev_dbg(dev, "%s: %7ph\n", "read", ds1307->regs);
+ dev_dbg(dev, "%s: %7ph\n", "read", regs);
/* if oscillator fail bit is set, no data can be trusted */
if (ds1307->type == m41t0 &&
- ds1307->regs[DS1307_REG_MIN] & M41T0_BIT_OF) {
+ regs[DS1307_REG_MIN] & M41T0_BIT_OF) {
dev_warn_once(dev, "oscillator failed, set time!\n");
return -EINVAL;
}
- t->tm_sec = bcd2bin(ds1307->regs[DS1307_REG_SECS] & 0x7f);
- t->tm_min = bcd2bin(ds1307->regs[DS1307_REG_MIN] & 0x7f);
- tmp = ds1307->regs[DS1307_REG_HOUR] & 0x3f;
+ t->tm_sec = bcd2bin(regs[DS1307_REG_SECS] & 0x7f);
+ t->tm_min = bcd2bin(regs[DS1307_REG_MIN] & 0x7f);
+ tmp = regs[DS1307_REG_HOUR] & 0x3f;
t->tm_hour = bcd2bin(tmp);
- t->tm_wday = bcd2bin(ds1307->regs[DS1307_REG_WDAY] & 0x07) - 1;
- t->tm_mday = bcd2bin(ds1307->regs[DS1307_REG_MDAY] & 0x3f);
- tmp = ds1307->regs[DS1307_REG_MONTH] & 0x1f;
+ t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
+ t->tm_mday = bcd2bin(regs[DS1307_REG_MDAY] & 0x3f);
+ tmp = regs[DS1307_REG_MONTH] & 0x1f;
t->tm_mon = bcd2bin(tmp) - 1;
- t->tm_year = bcd2bin(ds1307->regs[DS1307_REG_YEAR]) + 100;
+ t->tm_year = bcd2bin(regs[DS1307_REG_YEAR]) + 100;
- if (ds1307->regs[chip->century_reg] & chip->century_bit &&
+ if (regs[chip->century_reg] & chip->century_bit &&
IS_ENABLED(CONFIG_RTC_DRV_DS1307_CENTURY))
t->tm_year += 100;
@@ -399,7 +443,7 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
const struct chip_desc *chip = &chips[ds1307->type];
int result;
int tmp;
- u8 *buf = ds1307->regs;
+ u8 regs[7];
dev_dbg(dev, "%s secs=%d, mins=%d, "
"hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
@@ -418,35 +462,36 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
return -EINVAL;
#endif
- buf[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
- buf[DS1307_REG_MIN] = bin2bcd(t->tm_min);
- buf[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
- buf[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
- buf[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
- buf[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
+ regs[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
+ regs[DS1307_REG_MIN] = bin2bcd(t->tm_min);
+ regs[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
+ regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
+ regs[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
+ regs[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
/* assume 20YY not 19YY */
tmp = t->tm_year - 100;
- buf[DS1307_REG_YEAR] = bin2bcd(tmp);
+ regs[DS1307_REG_YEAR] = bin2bcd(tmp);
if (chip->century_enable_bit)
- buf[chip->century_reg] |= chip->century_enable_bit;
+ regs[chip->century_reg] |= chip->century_enable_bit;
if (t->tm_year > 199 && chip->century_bit)
- buf[chip->century_reg] |= chip->century_bit;
+ regs[chip->century_reg] |= chip->century_bit;
if (ds1307->type == mcp794xx) {
/*
* these bits were cleared when preparing the date/time
* values and need to be set again before writing the
- * buffer out to the device.
+ * regsfer out to the device.
*/
- buf[DS1307_REG_SECS] |= MCP794XX_BIT_ST;
- buf[DS1307_REG_WDAY] |= MCP794XX_BIT_VBATEN;
+ regs[DS1307_REG_SECS] |= MCP794XX_BIT_ST;
+ regs[DS1307_REG_WDAY] |= MCP794XX_BIT_VBATEN;
}
- dev_dbg(dev, "%s: %7ph\n", "write", buf);
+ dev_dbg(dev, "%s: %7ph\n", "write", regs);
- result = regmap_bulk_write(ds1307->regmap, ds1307->offset, buf, 7);
+ result = regmap_bulk_write(ds1307->regmap, chip->offset, regs,
+ sizeof(regs));
if (result) {
dev_err(dev, "%s error %d\n", "write", result);
return result;
@@ -458,33 +503,34 @@ static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
{
struct ds1307 *ds1307 = dev_get_drvdata(dev);
int ret;
+ u8 regs[9];
if (!test_bit(HAS_ALARM, &ds1307->flags))
return -EINVAL;
/* read all ALARM1, ALARM2, and status registers at once */
ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS,
- ds1307->regs, 9);
+ regs, sizeof(regs));
if (ret) {
dev_err(dev, "%s error %d\n", "alarm read", ret);
return ret;
}
dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read",
- &ds1307->regs[0], &ds1307->regs[4], &ds1307->regs[7]);
+ &regs[0], &regs[4], &regs[7]);
/*
* report alarm time (ALARM1); assume 24 hour and day-of-month modes,
* and that all four fields are checked matches
*/
- t->time.tm_sec = bcd2bin(ds1307->regs[0] & 0x7f);
- t->time.tm_min = bcd2bin(ds1307->regs[1] & 0x7f);
- t->time.tm_hour = bcd2bin(ds1307->regs[2] & 0x3f);
- t->time.tm_mday = bcd2bin(ds1307->regs[3] & 0x3f);
+ t->time.tm_sec = bcd2bin(regs[0] & 0x7f);
+ t->time.tm_min = bcd2bin(regs[1] & 0x7f);
+ t->time.tm_hour = bcd2bin(regs[2] & 0x3f);
+ t->time.tm_mday = bcd2bin(regs[3] & 0x3f);
/* ... and status */
- t->enabled = !!(ds1307->regs[7] & DS1337_BIT_A1IE);
- t->pending = !!(ds1307->regs[8] & DS1337_BIT_A1I);
+ t->enabled = !!(regs[7] & DS1337_BIT_A1IE);
+ t->pending = !!(regs[8] & DS1337_BIT_A1I);
dev_dbg(dev, "%s secs=%d, mins=%d, "
"hours=%d, mday=%d, enabled=%d, pending=%d\n",
@@ -498,7 +544,7 @@ static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
{
struct ds1307 *ds1307 = dev_get_drvdata(dev);
- unsigned char *buf = ds1307->regs;
+ unsigned char regs[9];
u8 control, status;
int ret;
@@ -512,33 +558,35 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
t->enabled, t->pending);
/* read current status of both alarms and the chip */
- ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
+ ret = regmap_bulk_read(ds1307->regmap, DS1339_REG_ALARM1_SECS, regs,
+ sizeof(regs));
if (ret) {
dev_err(dev, "%s error %d\n", "alarm write", ret);
return ret;
}
- control = ds1307->regs[7];
- status = ds1307->regs[8];
+ control = regs[7];
+ status = regs[8];
dev_dbg(dev, "%s: %4ph, %3ph, %02x %02x\n", "alarm set (old status)",
- &ds1307->regs[0], &ds1307->regs[4], control, status);
+ &regs[0], &regs[4], control, status);
/* set ALARM1, using 24 hour and day-of-month modes */
- buf[0] = bin2bcd(t->time.tm_sec);
- buf[1] = bin2bcd(t->time.tm_min);
- buf[2] = bin2bcd(t->time.tm_hour);
- buf[3] = bin2bcd(t->time.tm_mday);
+ regs[0] = bin2bcd(t->time.tm_sec);
+ regs[1] = bin2bcd(t->time.tm_min);
+ regs[2] = bin2bcd(t->time.tm_hour);
+ regs[3] = bin2bcd(t->time.tm_mday);
/* set ALARM2 to non-garbage */
- buf[4] = 0;
- buf[5] = 0;
- buf[6] = 0;
+ regs[4] = 0;
+ regs[5] = 0;
+ regs[6] = 0;
/* disable alarms */
- buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
- buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
+ regs[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
+ regs[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
- ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, buf, 9);
+ ret = regmap_bulk_write(ds1307->regmap, DS1339_REG_ALARM1_SECS, regs,
+ sizeof(regs));
if (ret) {
dev_err(dev, "can't set alarm time\n");
return ret;
@@ -547,8 +595,8 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
/* optionally enable ALARM1 */
if (t->enabled) {
dev_dbg(dev, "alarm IRQ armed\n");
- buf[7] |= DS1337_BIT_A1IE; /* only ALARM1 is used */
- regmap_write(ds1307->regmap, DS1337_REG_CONTROL, buf[7]);
+ regs[7] |= DS1337_BIT_A1IE; /* only ALARM1 is used */
+ regmap_write(ds1307->regmap, DS1337_REG_CONTROL, regs[7]);
}
return 0;
@@ -584,11 +632,11 @@ static const struct rtc_class_ops ds13xx_rtc_ops = {
#define RX8130_REG_ALARM_HOUR 0x08
#define RX8130_REG_ALARM_WEEK_OR_DAY 0x09
#define RX8130_REG_EXTENSION 0x0c
-#define RX8130_REG_EXTENSION_WADA (1 << 3)
+#define RX8130_REG_EXTENSION_WADA BIT(3)
#define RX8130_REG_FLAG 0x0d
-#define RX8130_REG_FLAG_AF (1 << 3)
+#define RX8130_REG_FLAG_AF BIT(3)
#define RX8130_REG_CONTROL0 0x0e
-#define RX8130_REG_CONTROL0_AIE (1 << 3)
+#define RX8130_REG_CONTROL0_AIE BIT(3)
static irqreturn_t rx8130_irq(int irq, void *dev_id)
{
@@ -600,7 +648,8 @@ static irqreturn_t rx8130_irq(int irq, void *dev_id)
mutex_lock(lock);
/* Read control registers. */
- ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
if (ret < 0)
goto out;
if (!(ctl[1] & RX8130_REG_FLAG_AF))
@@ -608,7 +657,8 @@ static irqreturn_t rx8130_irq(int irq, void *dev_id)
ctl[1] &= ~RX8130_REG_FLAG_AF;
ctl[2] &= ~RX8130_REG_CONTROL0_AIE;
- ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
if (ret < 0)
goto out;
@@ -630,12 +680,14 @@ static int rx8130_read_alarm(struct device *dev, struct rtc_wkalrm *t)
return -EINVAL;
/* Read alarm registers. */
- ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_ALARM_MIN, ald, 3);
+ ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_ALARM_MIN, ald,
+ sizeof(ald));
if (ret < 0)
return ret;
/* Read control registers. */
- ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
if (ret < 0)
return ret;
@@ -676,7 +728,8 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t)
t->enabled, t->pending);
/* Read control registers. */
- ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ ret = regmap_bulk_read(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
if (ret < 0)
return ret;
@@ -684,7 +737,8 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t)
ctl[1] |= RX8130_REG_FLAG_AF;
ctl[2] &= ~RX8130_REG_CONTROL0_AIE;
- ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
if (ret < 0)
return ret;
@@ -693,7 +747,8 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t)
ald[1] = bin2bcd(t->time.tm_hour);
ald[2] = bin2bcd(t->time.tm_mday);
- ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_ALARM_MIN, ald, 3);
+ ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_ALARM_MIN, ald,
+ sizeof(ald));
if (ret < 0)
return ret;
@@ -702,7 +757,8 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t)
ctl[2] |= RX8130_REG_CONTROL0_AIE;
- return regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, 3);
+ return regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl,
+ sizeof(ctl));
}
static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled)
@@ -725,14 +781,6 @@ static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled)
return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, reg);
}
-static const struct rtc_class_ops rx8130_rtc_ops = {
- .read_time = ds1307_get_time,
- .set_time = ds1307_set_time,
- .read_alarm = rx8130_read_alarm,
- .set_alarm = rx8130_set_alarm,
- .alarm_irq_enable = rx8130_alarm_irq_enable,
-};
-
/*----------------------------------------------------------------------*/
/*
@@ -748,11 +796,11 @@ static const struct rtc_class_ops rx8130_rtc_ops = {
#define MCP794XX_REG_ALARM0_CTRL 0x0d
#define MCP794XX_REG_ALARM1_BASE 0x11
#define MCP794XX_REG_ALARM1_CTRL 0x14
-# define MCP794XX_BIT_ALMX_IF (1 << 3)
-# define MCP794XX_BIT_ALMX_C0 (1 << 4)
-# define MCP794XX_BIT_ALMX_C1 (1 << 5)
-# define MCP794XX_BIT_ALMX_C2 (1 << 6)
-# define MCP794XX_BIT_ALMX_POL (1 << 7)
+# define MCP794XX_BIT_ALMX_IF BIT(3)
+# define MCP794XX_BIT_ALMX_C0 BIT(4)
+# define MCP794XX_BIT_ALMX_C1 BIT(5)
+# define MCP794XX_BIT_ALMX_C2 BIT(6)
+# define MCP794XX_BIT_ALMX_POL BIT(7)
# define MCP794XX_MSK_ALMX_MATCH (MCP794XX_BIT_ALMX_C0 | \
MCP794XX_BIT_ALMX_C1 | \
MCP794XX_BIT_ALMX_C2)
@@ -793,37 +841,38 @@ out:
static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
{
struct ds1307 *ds1307 = dev_get_drvdata(dev);
- u8 *regs = ds1307->regs;
+ u8 regs[10];
int ret;
if (!test_bit(HAS_ALARM, &ds1307->flags))
return -EINVAL;
/* Read control and alarm 0 registers. */
- ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+ ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
+ sizeof(regs));
if (ret)
return ret;
t->enabled = !!(regs[0] & MCP794XX_BIT_ALM0_EN);
/* Report alarm 0 time assuming 24-hour and day-of-month modes. */
- t->time.tm_sec = bcd2bin(ds1307->regs[3] & 0x7f);
- t->time.tm_min = bcd2bin(ds1307->regs[4] & 0x7f);
- t->time.tm_hour = bcd2bin(ds1307->regs[5] & 0x3f);
- t->time.tm_wday = bcd2bin(ds1307->regs[6] & 0x7) - 1;
- t->time.tm_mday = bcd2bin(ds1307->regs[7] & 0x3f);
- t->time.tm_mon = bcd2bin(ds1307->regs[8] & 0x1f) - 1;
+ t->time.tm_sec = bcd2bin(regs[3] & 0x7f);
+ t->time.tm_min = bcd2bin(regs[4] & 0x7f);
+ t->time.tm_hour = bcd2bin(regs[5] & 0x3f);
+ t->time.tm_wday = bcd2bin(regs[6] & 0x7) - 1;
+ t->time.tm_mday = bcd2bin(regs[7] & 0x3f);
+ t->time.tm_mon = bcd2bin(regs[8] & 0x1f) - 1;
t->time.tm_year = -1;
t->time.tm_yday = -1;
t->time.tm_isdst = -1;
dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
- "enabled=%d polarity=%d irq=%d match=%d\n", __func__,
+ "enabled=%d polarity=%d irq=%d match=%lu\n", __func__,
t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled,
- !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_POL),
- !!(ds1307->regs[6] & MCP794XX_BIT_ALMX_IF),
- (ds1307->regs[6] & MCP794XX_MSK_ALMX_MATCH) >> 4);
+ !!(regs[6] & MCP794XX_BIT_ALMX_POL),
+ !!(regs[6] & MCP794XX_BIT_ALMX_IF),
+ (regs[6] & MCP794XX_MSK_ALMX_MATCH) >> 4);
return 0;
}
@@ -831,7 +880,7 @@ static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t)
static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
{
struct ds1307 *ds1307 = dev_get_drvdata(dev);
- unsigned char *regs = ds1307->regs;
+ unsigned char regs[10];
int ret;
if (!test_bit(HAS_ALARM, &ds1307->flags))
@@ -844,7 +893,8 @@ static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
t->enabled, t->pending);
/* Read control and alarm 0 registers. */
- ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+ ret = regmap_bulk_read(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
+ sizeof(regs));
if (ret)
return ret;
@@ -863,7 +913,8 @@ static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t)
/* Disable interrupt. We will not enable until completely programmed */
regs[0] &= ~MCP794XX_BIT_ALM0_EN;
- ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs, 10);
+ ret = regmap_bulk_write(ds1307->regmap, MCP794XX_REG_CONTROL, regs,
+ sizeof(regs));
if (ret)
return ret;
@@ -885,22 +936,15 @@ static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled)
enabled ? MCP794XX_BIT_ALM0_EN : 0);
}
-static const struct rtc_class_ops mcp794xx_rtc_ops = {
- .read_time = ds1307_get_time,
- .set_time = ds1307_set_time,
- .read_alarm = mcp794xx_read_alarm,
- .set_alarm = mcp794xx_set_alarm,
- .alarm_irq_enable = mcp794xx_alarm_irq_enable,
-};
-
/*----------------------------------------------------------------------*/
static int ds1307_nvram_read(void *priv, unsigned int offset, void *val,
size_t bytes)
{
struct ds1307 *ds1307 = priv;
+ const struct chip_desc *chip = &chips[ds1307->type];
- return regmap_bulk_read(ds1307->regmap, ds1307->nvram_offset + offset,
+ return regmap_bulk_read(ds1307->regmap, chip->nvram_offset + offset,
val, bytes);
}
@@ -908,15 +952,16 @@ static int ds1307_nvram_write(void *priv, unsigned int offset, void *val,
size_t bytes)
{
struct ds1307 *ds1307 = priv;
+ const struct chip_desc *chip = &chips[ds1307->type];
- return regmap_bulk_write(ds1307->regmap, ds1307->nvram_offset + offset,
+ return regmap_bulk_write(ds1307->regmap, chip->nvram_offset + offset,
val, bytes);
}
/*----------------------------------------------------------------------*/
static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307,
- uint32_t ohms, bool diode)
+ u32 ohms, bool diode)
{
u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE :
DS1307_TRICKLE_CHARGER_NO_DIODE;
@@ -939,23 +984,23 @@ static u8 do_trickle_setup_ds1339(struct ds1307 *ds1307,
return setup;
}
-static void ds1307_trickle_init(struct ds1307 *ds1307,
- struct chip_desc *chip)
+static u8 ds1307_trickle_init(struct ds1307 *ds1307,
+ const struct chip_desc *chip)
{
- uint32_t ohms = 0;
+ u32 ohms;
bool diode = true;
if (!chip->do_trickle_setup)
- goto out;
+ return 0;
+
if (device_property_read_u32(ds1307->dev, "trickle-resistor-ohms",
&ohms))
- goto out;
+ return 0;
+
if (device_property_read_bool(ds1307->dev, "trickle-diode-disable"))
diode = false;
- chip->trickle_charger_setup = chip->do_trickle_setup(ds1307,
- ohms, diode);
-out:
- return;
+
+ return chip->do_trickle_setup(ds1307, ohms, diode);
}
/*----------------------------------------------------------------------*/
@@ -995,7 +1040,7 @@ static int ds3231_hwmon_read_temp(struct device *dev, s32 *mC)
}
static ssize_t ds3231_hwmon_show_temp(struct device *dev,
- struct device_attribute *attr, char *buf)
+ struct device_attribute *attr, char *buf)
{
int ret;
s32 temp;
@@ -1006,8 +1051,8 @@ static ssize_t ds3231_hwmon_show_temp(struct device *dev,
return sprintf(buf, "%d\n", temp);
}
-static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ds3231_hwmon_show_temp,
- NULL, 0);
+static SENSOR_DEVICE_ATTR(temp1_input, 0444, ds3231_hwmon_show_temp,
+ NULL, 0);
static struct attribute *ds3231_hwmon_attrs[] = {
&sensor_dev_attr_temp1_input.dev_attr.attr,
@@ -1023,7 +1068,8 @@ static void ds1307_hwmon_register(struct ds1307 *ds1307)
return;
dev = devm_hwmon_device_register_with_groups(ds1307->dev, ds1307->name,
- ds1307, ds3231_hwmon_groups);
+ ds1307,
+ ds3231_hwmon_groups);
if (IS_ERR(dev)) {
dev_warn(ds1307->dev, "unable to register hwmon device %ld\n",
PTR_ERR(dev));
@@ -1095,7 +1141,7 @@ static unsigned long ds3231_clk_sqw_recalc_rate(struct clk_hw *hw,
}
static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long *prate)
+ unsigned long *prate)
{
int i;
@@ -1108,7 +1154,7 @@ static long ds3231_clk_sqw_round_rate(struct clk_hw *hw, unsigned long rate,
}
static int ds3231_clk_sqw_set_rate(struct clk_hw *hw, unsigned long rate,
- unsigned long parent_rate)
+ unsigned long parent_rate)
{
struct ds1307 *ds1307 = clk_sqw_to_ds1307(hw);
int control = 0;
@@ -1168,7 +1214,7 @@ static const struct clk_ops ds3231_clk_sqw_ops = {
};
static unsigned long ds3231_clk_32khz_recalc_rate(struct clk_hw *hw,
- unsigned long parent_rate)
+ unsigned long parent_rate)
{
return 32768;
}
@@ -1259,7 +1305,7 @@ static int ds3231_clks_register(struct ds1307 *ds1307)
/* optional override of the clockname */
of_property_read_string_index(node, "clock-output-names", i,
- &init.name);
+ &init.name);
ds1307->clks[i].init = &init;
onecell->clks[i] = devm_clk_register(ds1307->dev,
@@ -1309,22 +1355,14 @@ static int ds1307_probe(struct i2c_client *client,
struct ds1307 *ds1307;
int err = -ENODEV;
int tmp, wday;
- struct chip_desc *chip;
- bool want_irq = false;
+ const struct chip_desc *chip;
+ bool want_irq;
bool ds1307_can_wakeup_device = false;
- unsigned char *buf;
+ unsigned char regs[8];
struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
struct rtc_time tm;
unsigned long timestamp;
-
- irq_handler_t irq_handler = ds1307_irq;
-
- static const int bbsqi_bitpos[] = {
- [ds_1337] = 0,
- [ds_1339] = DS1339_BIT_BBSQI,
- [ds_3231] = DS3231_BIT_BBSQW,
- };
- const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
+ u8 trickle_charger_setup = 0;
ds1307 = devm_kzalloc(&client->dev, sizeof(struct ds1307), GFP_KERNEL);
if (!ds1307)
@@ -1333,7 +1371,6 @@ static int ds1307_probe(struct i2c_client *client,
dev_set_drvdata(&client->dev, ds1307);
ds1307->dev = &client->dev;
ds1307->name = client->name;
- ds1307->irq = client->irq;
ds1307->regmap = devm_regmap_init_i2c(client, &regmap_config);
if (IS_ERR(ds1307->regmap)) {
@@ -1361,23 +1398,22 @@ static int ds1307_probe(struct i2c_client *client,
ds1307->type = acpi_id->driver_data;
}
+ want_irq = client->irq > 0 && chip->alarm;
+
if (!pdata)
- ds1307_trickle_init(ds1307, chip);
+ trickle_charger_setup = ds1307_trickle_init(ds1307, chip);
else if (pdata->trickle_charger_setup)
- chip->trickle_charger_setup = pdata->trickle_charger_setup;
+ trickle_charger_setup = pdata->trickle_charger_setup;
- if (chip->trickle_charger_setup && chip->trickle_charger_reg) {
+ if (trickle_charger_setup && chip->trickle_charger_reg) {
+ trickle_charger_setup |= DS13XX_TRICKLE_CHARGER_MAGIC;
dev_dbg(ds1307->dev,
"writing trickle charger info 0x%x to 0x%x\n",
- DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup,
- chip->trickle_charger_reg);
+ trickle_charger_setup, chip->trickle_charger_reg);
regmap_write(ds1307->regmap, chip->trickle_charger_reg,
- DS13XX_TRICKLE_CHARGER_MAGIC |
- chip->trickle_charger_setup);
+ trickle_charger_setup);
}
- buf = ds1307->regs;
-
#ifdef CONFIG_OF
/*
* For devices with no IRQ directly connected to the SoC, the RTC chip
@@ -1387,31 +1423,27 @@ static int ds1307_probe(struct i2c_client *client,
* This will guarantee the 'wakealarm' sysfs entry is available on the device,
* if supported by the RTC.
*/
- if (of_property_read_bool(client->dev.of_node, "wakeup-source")) {
- ds1307_can_wakeup_device = true;
- }
- /* Intersil ISL12057 DT backward compatibility */
- if (of_property_read_bool(client->dev.of_node,
- "isil,irq2-can-wakeup-machine")) {
+ if (chip->alarm && of_property_read_bool(client->dev.of_node,
+ "wakeup-source"))
ds1307_can_wakeup_device = true;
- }
#endif
switch (ds1307->type) {
case ds_1337:
case ds_1339:
+ case ds_1341:
case ds_3231:
/* get registers that the "rtc" read below won't read... */
err = regmap_bulk_read(ds1307->regmap, DS1337_REG_CONTROL,
- buf, 2);
+ regs, 2);
if (err) {
dev_dbg(ds1307->dev, "read error %d\n", err);
goto exit;
}
/* oscillator off? turn it on, so clock can tick. */
- if (ds1307->regs[0] & DS1337_BIT_nEOSC)
- ds1307->regs[0] &= ~DS1337_BIT_nEOSC;
+ if (regs[0] & DS1337_BIT_nEOSC)
+ regs[0] &= ~DS1337_BIT_nEOSC;
/*
* Using IRQ or defined as wakeup-source?
@@ -1419,114 +1451,92 @@ static int ds1307_probe(struct i2c_client *client,
* For some variants, be sure alarms can trigger when we're
* running on Vbackup (BBSQI/BBSQW)
*/
- if (chip->alarm && (ds1307->irq > 0 ||
- ds1307_can_wakeup_device)) {
- ds1307->regs[0] |= DS1337_BIT_INTCN
- | bbsqi_bitpos[ds1307->type];
- ds1307->regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
-
- want_irq = true;
+ if (want_irq || ds1307_can_wakeup_device) {
+ regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit;
+ regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE);
}
regmap_write(ds1307->regmap, DS1337_REG_CONTROL,
- ds1307->regs[0]);
+ regs[0]);
/* oscillator fault? clear flag, and warn */
- if (ds1307->regs[1] & DS1337_BIT_OSF) {
+ if (regs[1] & DS1337_BIT_OSF) {
regmap_write(ds1307->regmap, DS1337_REG_STATUS,
- ds1307->regs[1] & ~DS1337_BIT_OSF);
+ regs[1] & ~DS1337_BIT_OSF);
dev_warn(ds1307->dev, "SET TIME!\n");
}
break;
case rx_8025:
err = regmap_bulk_read(ds1307->regmap,
- RX8025_REG_CTRL1 << 4 | 0x08, buf, 2);
+ RX8025_REG_CTRL1 << 4 | 0x08, regs, 2);
if (err) {
dev_dbg(ds1307->dev, "read error %d\n", err);
goto exit;
}
/* oscillator off? turn it on, so clock can tick. */
- if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
- ds1307->regs[1] |= RX8025_BIT_XST;
+ if (!(regs[1] & RX8025_BIT_XST)) {
+ regs[1] |= RX8025_BIT_XST;
regmap_write(ds1307->regmap,
RX8025_REG_CTRL2 << 4 | 0x08,
- ds1307->regs[1]);
+ regs[1]);
dev_warn(ds1307->dev,
"oscillator stop detected - SET TIME!\n");
}
- if (ds1307->regs[1] & RX8025_BIT_PON) {
- ds1307->regs[1] &= ~RX8025_BIT_PON;
+ if (regs[1] & RX8025_BIT_PON) {
+ regs[1] &= ~RX8025_BIT_PON;
regmap_write(ds1307->regmap,
RX8025_REG_CTRL2 << 4 | 0x08,
- ds1307->regs[1]);
+ regs[1]);
dev_warn(ds1307->dev, "power-on detected\n");
}
- if (ds1307->regs[1] & RX8025_BIT_VDET) {
- ds1307->regs[1] &= ~RX8025_BIT_VDET;
+ if (regs[1] & RX8025_BIT_VDET) {
+ regs[1] &= ~RX8025_BIT_VDET;
regmap_write(ds1307->regmap,
RX8025_REG_CTRL2 << 4 | 0x08,
- ds1307->regs[1]);
+ regs[1]);
dev_warn(ds1307->dev, "voltage drop detected\n");
}
/* make sure we are running in 24hour mode */
- if (!(ds1307->regs[0] & RX8025_BIT_2412)) {
+ if (!(regs[0] & RX8025_BIT_2412)) {
u8 hour;
/* switch to 24 hour mode */
regmap_write(ds1307->regmap,
RX8025_REG_CTRL1 << 4 | 0x08,
- ds1307->regs[0] | RX8025_BIT_2412);
+ regs[0] | RX8025_BIT_2412);
err = regmap_bulk_read(ds1307->regmap,
RX8025_REG_CTRL1 << 4 | 0x08,
- buf, 2);
+ regs, 2);
if (err) {
dev_dbg(ds1307->dev, "read error %d\n", err);
goto exit;
}
/* correct hour */
- hour = bcd2bin(ds1307->regs[DS1307_REG_HOUR]);
+ hour = bcd2bin(regs[DS1307_REG_HOUR]);
if (hour == 12)
hour = 0;
- if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
+ if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
hour += 12;
regmap_write(ds1307->regmap,
DS1307_REG_HOUR << 4 | 0x08, hour);
}
break;
- case rx_8130:
- ds1307->offset = 0x10; /* Seconds starts at 0x10 */
- rtc_ops = &rx8130_rtc_ops;
- if (chip->alarm && ds1307->irq > 0) {
- irq_handler = rx8130_irq;
- want_irq = true;
- }
- break;
- case ds_1388:
- ds1307->offset = 1; /* Seconds starts at 1 */
- break;
- case mcp794xx:
- rtc_ops = &mcp794xx_rtc_ops;
- if (chip->alarm && (ds1307->irq > 0 ||
- ds1307_can_wakeup_device)) {
- irq_handler = mcp794xx_irq;
- want_irq = true;
- }
- break;
default:
break;
}
read_rtc:
/* read RTC registers */
- err = regmap_bulk_read(ds1307->regmap, ds1307->offset, buf, 8);
+ err = regmap_bulk_read(ds1307->regmap, chip->offset, regs,
+ sizeof(regs));
if (err) {
dev_dbg(ds1307->dev, "read error %d\n", err);
goto exit;
@@ -1537,7 +1547,7 @@ read_rtc:
* specify the extra bits as must-be-zero, but there are
* still a few values that are clearly out-of-range.
*/
- tmp = ds1307->regs[DS1307_REG_SECS];
+ tmp = regs[DS1307_REG_SECS];
switch (ds1307->type) {
case ds_1307:
case m41t0:
@@ -1556,10 +1566,10 @@ read_rtc:
regmap_write(ds1307->regmap, DS1307_REG_SECS, 0);
/* oscillator fault? clear flag, and warn */
- if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
+ if (regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
regmap_write(ds1307->regmap, DS1307_REG_CONTROL,
- ds1307->regs[DS1307_REG_CONTROL] &
- ~DS1338_BIT_OSF);
+ regs[DS1307_REG_CONTROL] &
+ ~DS1338_BIT_OSF);
dev_warn(ds1307->dev, "SET TIME!\n");
goto read_rtc;
}
@@ -1583,9 +1593,9 @@ read_rtc:
break;
case mcp794xx:
/* make sure that the backup battery is enabled */
- if (!(ds1307->regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
+ if (!(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
regmap_write(ds1307->regmap, DS1307_REG_WDAY,
- ds1307->regs[DS1307_REG_WDAY] |
+ regs[DS1307_REG_WDAY] |
MCP794XX_BIT_VBATEN);
}
@@ -1602,7 +1612,7 @@ read_rtc:
break;
}
- tmp = ds1307->regs[DS1307_REG_HOUR];
+ tmp = regs[DS1307_REG_HOUR];
switch (ds1307->type) {
case ds_1340:
case m41t0:
@@ -1625,9 +1635,9 @@ read_rtc:
tmp = bcd2bin(tmp & 0x1f);
if (tmp == 12)
tmp = 0;
- if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
+ if (regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
tmp += 12;
- regmap_write(ds1307->regmap, ds1307->offset + DS1307_REG_HOUR,
+ regmap_write(ds1307->regmap, chip->offset + DS1307_REG_HOUR,
bin2bcd(tmp));
}
@@ -1650,19 +1660,16 @@ read_rtc:
MCP794XX_REG_WEEKDAY_WDAY_MASK,
tm.tm_wday + 1);
- if (want_irq) {
+ if (want_irq || ds1307_can_wakeup_device) {
device_set_wakeup_capable(ds1307->dev, true);
set_bit(HAS_ALARM, &ds1307->flags);
}
ds1307->rtc = devm_rtc_allocate_device(ds1307->dev);
- if (IS_ERR(ds1307->rtc)) {
+ if (IS_ERR(ds1307->rtc))
return PTR_ERR(ds1307->rtc);
- }
- if (ds1307_can_wakeup_device && ds1307->irq <= 0) {
- /* Disable request for an IRQ */
- want_irq = false;
+ if (ds1307_can_wakeup_device && !want_irq) {
dev_info(ds1307->dev,
"'wakeup-source' is set, request for an IRQ is disabled!\n");
/* We cannot support UIE mode if we do not have an IRQ line */
@@ -1670,8 +1677,8 @@ read_rtc:
}
if (want_irq) {
- err = devm_request_threaded_irq(ds1307->dev,
- ds1307->irq, NULL, irq_handler,
+ err = devm_request_threaded_irq(ds1307->dev, client->irq, NULL,
+ chip->irq_handler ?: ds1307_irq,
IRQF_SHARED | IRQF_ONESHOT,
ds1307->name, ds1307);
if (err) {
@@ -1679,8 +1686,9 @@ read_rtc:
device_set_wakeup_capable(ds1307->dev, false);
clear_bit(HAS_ALARM, &ds1307->flags);
dev_err(ds1307->dev, "unable to request IRQ!\n");
- } else
+ } else {
dev_dbg(ds1307->dev, "got IRQ %d\n", client->irq);
+ }
}
if (chip->nvram_size) {
@@ -1691,13 +1699,12 @@ read_rtc:
ds1307->nvmem_cfg.reg_read = ds1307_nvram_read;
ds1307->nvmem_cfg.reg_write = ds1307_nvram_write;
ds1307->nvmem_cfg.priv = ds1307;
- ds1307->nvram_offset = chip->nvram_offset;
ds1307->rtc->nvmem_config = &ds1307->nvmem_cfg;
ds1307->rtc->nvram_old_abi = true;
}
- ds1307->rtc->ops = rtc_ops;
+ ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops;
err = rtc_register_device(ds1307->rtc);
if (err)
return err;
diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c
index 7bf46bfe11a4..9caaccccaa57 100644
--- a/drivers/rtc/rtc-ds1672.c
+++ b/drivers/rtc/rtc-ds1672.c
@@ -190,7 +190,7 @@ static int ds1672_probe(struct i2c_client *client,
return 0;
}
-static struct i2c_device_id ds1672_id[] = {
+static const struct i2c_device_id ds1672_id[] = {
{ "ds1672", 0 },
{ }
};
diff --git a/drivers/rtc/rtc-em3027.c b/drivers/rtc/rtc-em3027.c
index 4f4930a2004c..b0ef8cfe742d 100644
--- a/drivers/rtc/rtc-em3027.c
+++ b/drivers/rtc/rtc-em3027.c
@@ -132,7 +132,7 @@ static int em3027_probe(struct i2c_client *client,
return 0;
}
-static struct i2c_device_id em3027_id[] = {
+static const struct i2c_device_id em3027_id[] = {
{ "em3027", 0 },
{ }
};
diff --git a/drivers/rtc/rtc-goldfish.c b/drivers/rtc/rtc-goldfish.c
new file mode 100644
index 000000000000..d67769265185
--- /dev/null
+++ b/drivers/rtc/rtc-goldfish.c
@@ -0,0 +1,237 @@
+/* drivers/rtc/rtc-goldfish.c
+ *
+ * Copyright (C) 2007 Google, Inc.
+ * Copyright (C) 2017 Imagination Technologies Ltd.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/rtc.h>
+#include <linux/io.h>
+
+#define TIMER_TIME_LOW 0x00 /* get low bits of current time */
+ /* and update TIMER_TIME_HIGH */
+#define TIMER_TIME_HIGH 0x04 /* get high bits of time at last */
+ /* TIMER_TIME_LOW read */
+#define TIMER_ALARM_LOW 0x08 /* set low bits of alarm and */
+ /* activate it */
+#define TIMER_ALARM_HIGH 0x0c /* set high bits of next alarm */
+#define TIMER_IRQ_ENABLED 0x10
+#define TIMER_CLEAR_ALARM 0x14
+#define TIMER_ALARM_STATUS 0x18
+#define TIMER_CLEAR_INTERRUPT 0x1c
+
+struct goldfish_rtc {
+ void __iomem *base;
+ int irq;
+ struct rtc_device *rtc;
+};
+
+static int goldfish_rtc_read_alarm(struct device *dev,
+ struct rtc_wkalrm *alrm)
+{
+ u64 rtc_alarm;
+ u64 rtc_alarm_low;
+ u64 rtc_alarm_high;
+ void __iomem *base;
+ struct goldfish_rtc *rtcdrv;
+
+ rtcdrv = dev_get_drvdata(dev);
+ base = rtcdrv->base;
+
+ rtc_alarm_low = readl(base + TIMER_ALARM_LOW);
+ rtc_alarm_high = readl(base + TIMER_ALARM_HIGH);
+ rtc_alarm = (rtc_alarm_high << 32) | rtc_alarm_low;
+
+ do_div(rtc_alarm, NSEC_PER_SEC);
+ memset(alrm, 0, sizeof(struct rtc_wkalrm));
+
+ rtc_time_to_tm(rtc_alarm, &alrm->time);
+
+ if (readl(base + TIMER_ALARM_STATUS))
+ alrm->enabled = 1;
+ else
+ alrm->enabled = 0;
+
+ return 0;
+}
+
+static int goldfish_rtc_set_alarm(struct device *dev,
+ struct rtc_wkalrm *alrm)
+{
+ struct goldfish_rtc *rtcdrv;
+ unsigned long rtc_alarm;
+ u64 rtc_alarm64;
+ u64 rtc_status_reg;
+ void __iomem *base;
+ int ret = 0;
+
+ rtcdrv = dev_get_drvdata(dev);
+ base = rtcdrv->base;
+
+ if (alrm->enabled) {
+ ret = rtc_tm_to_time(&alrm->time, &rtc_alarm);
+ if (ret != 0)
+ return ret;
+
+ rtc_alarm64 = rtc_alarm * NSEC_PER_SEC;
+ writel((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH);
+ writel(rtc_alarm64, base + TIMER_ALARM_LOW);
+ } else {
+ /*
+ * if this function was called with enabled=0
+ * then it could mean that the application is
+ * trying to cancel an ongoing alarm
+ */
+ rtc_status_reg = readl(base + TIMER_ALARM_STATUS);
+ if (rtc_status_reg)
+ writel(1, base + TIMER_CLEAR_ALARM);
+ }
+
+ return ret;
+}
+
+static int goldfish_rtc_alarm_irq_enable(struct device *dev,
+ unsigned int enabled)
+{
+ void __iomem *base;
+ struct goldfish_rtc *rtcdrv;
+
+ rtcdrv = dev_get_drvdata(dev);
+ base = rtcdrv->base;
+
+ if (enabled)
+ writel(1, base + TIMER_IRQ_ENABLED);
+ else
+ writel(0, base + TIMER_IRQ_ENABLED);
+
+ return 0;
+}
+
+static irqreturn_t goldfish_rtc_interrupt(int irq, void *dev_id)
+{
+ struct goldfish_rtc *rtcdrv = dev_id;
+ void __iomem *base = rtcdrv->base;
+
+ writel(1, base + TIMER_CLEAR_INTERRUPT);
+
+ rtc_update_irq(rtcdrv->rtc, 1, RTC_IRQF | RTC_AF);
+
+ return IRQ_HANDLED;
+}
+
+static int goldfish_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+ struct goldfish_rtc *rtcdrv;
+ void __iomem *base;
+ u64 time_high;
+ u64 time_low;
+ u64 time;
+
+ rtcdrv = dev_get_drvdata(dev);
+ base = rtcdrv->base;
+
+ time_low = readl(base + TIMER_TIME_LOW);
+ time_high = readl(base + TIMER_TIME_HIGH);
+ time = (time_high << 32) | time_low;
+
+ do_div(time, NSEC_PER_SEC);
+
+ rtc_time_to_tm(time, tm);
+
+ return 0;
+}
+
+static int goldfish_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ struct goldfish_rtc *rtcdrv;
+ void __iomem *base;
+ unsigned long now;
+ u64 now64;
+ int ret;
+
+ rtcdrv = dev_get_drvdata(dev);
+ base = rtcdrv->base;
+
+ ret = rtc_tm_to_time(tm, &now);
+ if (ret == 0) {
+ now64 = now * NSEC_PER_SEC;
+ writel((now64 >> 32), base + TIMER_TIME_HIGH);
+ writel(now64, base + TIMER_TIME_LOW);
+ }
+
+ return ret;
+}
+
+static const struct rtc_class_ops goldfish_rtc_ops = {
+ .read_time = goldfish_rtc_read_time,
+ .set_time = goldfish_rtc_set_time,
+ .read_alarm = goldfish_rtc_read_alarm,
+ .set_alarm = goldfish_rtc_set_alarm,
+ .alarm_irq_enable = goldfish_rtc_alarm_irq_enable
+};
+
+static int goldfish_rtc_probe(struct platform_device *pdev)
+{
+ struct goldfish_rtc *rtcdrv;
+ struct resource *r;
+ int err;
+
+ rtcdrv = devm_kzalloc(&pdev->dev, sizeof(*rtcdrv), GFP_KERNEL);
+ if (!rtcdrv)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, rtcdrv);
+
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!r)
+ return -ENODEV;
+
+ rtcdrv->base = devm_ioremap_resource(&pdev->dev, r);
+ if (IS_ERR(rtcdrv->base))
+ return -ENODEV;
+
+ rtcdrv->irq = platform_get_irq(pdev, 0);
+ if (rtcdrv->irq < 0)
+ return -ENODEV;
+
+ rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
+ &goldfish_rtc_ops,
+ THIS_MODULE);
+ if (IS_ERR(rtcdrv->rtc))
+ return PTR_ERR(rtcdrv->rtc);
+
+ err = devm_request_irq(&pdev->dev, rtcdrv->irq,
+ goldfish_rtc_interrupt,
+ 0, pdev->name, rtcdrv);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static const struct of_device_id goldfish_rtc_of_match[] = {
+ { .compatible = "google,goldfish-rtc", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, goldfish_rtc_of_match);
+
+static struct platform_driver goldfish_rtc = {
+ .probe = goldfish_rtc_probe,
+ .driver = {
+ .name = "goldfish_rtc",
+ .of_match_table = goldfish_rtc_of_match,
+ }
+};
+
+module_platform_driver(goldfish_rtc);
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 8940e9e43ea0..f4c070ea8384 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -440,28 +440,6 @@ static int m41t80_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(m41t80_pm, m41t80_suspend, m41t80_resume);
-static ssize_t flags_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- int val;
-
- val = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
- if (val < 0)
- return val;
- return sprintf(buf, "%#x\n", val);
-}
-static DEVICE_ATTR_RO(flags);
-
-static struct attribute *attrs[] = {
- &dev_attr_flags.attr,
- NULL,
-};
-
-static struct attribute_group attr_group = {
- .attrs = attrs,
-};
-
#ifdef CONFIG_COMMON_CLK
#define sqw_to_m41t80_data(_hw) container_of(_hw, struct m41t80_data, sqw)
@@ -912,13 +890,6 @@ static struct notifier_block wdt_notifier = {
*****************************************************************************
*/
-static void m41t80_remove_sysfs_group(void *_dev)
-{
- struct device *dev = _dev;
-
- sysfs_remove_group(&dev->kobj, &attr_group);
-}
-
static int m41t80_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -927,6 +898,7 @@ static int m41t80_probe(struct i2c_client *client,
struct rtc_device *rtc = NULL;
struct rtc_time tm;
struct m41t80_data *m41t80_data = NULL;
+ bool wakeup_source = false;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK |
I2C_FUNC_SMBUS_BYTE_DATA)) {
@@ -947,6 +919,10 @@ static int m41t80_probe(struct i2c_client *client,
m41t80_data->features = id->driver_data;
i2c_set_clientdata(client, m41t80_data);
+#ifdef CONFIG_OF
+ wakeup_source = of_property_read_bool(client->dev.of_node,
+ "wakeup-source");
+#endif
if (client->irq > 0) {
rc = devm_request_threaded_irq(&client->dev, client->irq,
NULL, m41t80_handle_irq,
@@ -955,14 +931,16 @@ static int m41t80_probe(struct i2c_client *client,
if (rc) {
dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
client->irq = 0;
- } else {
- m41t80_rtc_ops.read_alarm = m41t80_read_alarm;
- m41t80_rtc_ops.set_alarm = m41t80_set_alarm;
- m41t80_rtc_ops.alarm_irq_enable = m41t80_alarm_irq_enable;
- /* Enable the wakealarm */
- device_init_wakeup(&client->dev, true);
+ wakeup_source = false;
}
}
+ if (client->irq > 0 || wakeup_source) {
+ m41t80_rtc_ops.read_alarm = m41t80_read_alarm;
+ m41t80_rtc_ops.set_alarm = m41t80_set_alarm;
+ m41t80_rtc_ops.alarm_irq_enable = m41t80_alarm_irq_enable;
+ /* Enable the wakealarm */
+ device_init_wakeup(&client->dev, true);
+ }
rtc = devm_rtc_device_register(&client->dev, client->name,
&m41t80_rtc_ops, THIS_MODULE);
@@ -970,6 +948,10 @@ static int m41t80_probe(struct i2c_client *client,
return PTR_ERR(rtc);
m41t80_data->rtc = rtc;
+ if (client->irq <= 0) {
+ /* We cannot support UIE mode if we do not have an IRQ line */
+ rtc->uie_unsupported = 1;
+ }
/* Make sure HT (Halt Update) bit is cleared */
rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR);
@@ -1004,21 +986,6 @@ static int m41t80_probe(struct i2c_client *client,
return rc;
}
- /* Export sysfs entries */
- rc = sysfs_create_group(&(&client->dev)->kobj, &attr_group);
- if (rc) {
- dev_err(&client->dev, "Failed to create sysfs group: %d\n", rc);
- return rc;
- }
-
- rc = devm_add_action_or_reset(&client->dev, m41t80_remove_sysfs_group,
- &client->dev);
- if (rc) {
- dev_err(&client->dev,
- "Failed to add sysfs cleanup action: %d\n", rc);
- return rc;
- }
-
#ifdef CONFIG_RTC_DRV_M41T80_WDT
if (m41t80_data->features & M41T80_FEATURE_HT) {
save_client = client;
diff --git a/drivers/rtc/rtc-max6900.c b/drivers/rtc/rtc-max6900.c
index 48b6b411f8b2..cbdc86a560ba 100644
--- a/drivers/rtc/rtc-max6900.c
+++ b/drivers/rtc/rtc-max6900.c
@@ -226,7 +226,7 @@ max6900_probe(struct i2c_client *client, const struct i2c_device_id *id)
return 0;
}
-static struct i2c_device_id max6900_id[] = {
+static const struct i2c_device_id max6900_id[] = {
{ "max6900", 0 },
{ }
};
diff --git a/drivers/rtc/rtc-max8925.c b/drivers/rtc/rtc-max8925.c
index 16d129a0bb3b..67d6fc2d23e6 100644
--- a/drivers/rtc/rtc-max8925.c
+++ b/drivers/rtc/rtc-max8925.c
@@ -234,8 +234,6 @@ static int max8925_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
ret = max8925_reg_write(info->rtc, MAX8925_ALARM0_CNTL, 0x77);
else
ret = max8925_reg_write(info->rtc, MAX8925_ALARM0_CNTL, 0x0);
- if (ret < 0)
- goto out;
out:
return ret;
}
diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c
index 401f46d8f21b..bce427d202ee 100644
--- a/drivers/rtc/rtc-mxc.c
+++ b/drivers/rtc/rtc-mxc.c
@@ -238,26 +238,6 @@ static irqreturn_t mxc_rtc_interrupt(int irq, void *dev_id)
return IRQ_HANDLED;
}
-/*
- * Clear all interrupts and release the IRQ
- */
-static void mxc_rtc_release(struct device *dev)
-{
- struct platform_device *pdev = to_platform_device(dev);
- struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
- void __iomem *ioaddr = pdata->ioaddr;
-
- spin_lock_irq(&pdata->rtc->irq_lock);
-
- /* Disable all rtc interrupts */
- writew(0, ioaddr + RTC_RTCIENR);
-
- /* Clear all interrupt status */
- writew(0xffffffff, ioaddr + RTC_RTCISR);
-
- spin_unlock_irq(&pdata->rtc->irq_lock);
-}
-
static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
{
mxc_rtc_irq_enable(dev, RTC_ALM_BIT, enabled);
@@ -343,7 +323,6 @@ static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
/* RTC layer */
static const struct rtc_class_ops mxc_rtc_ops = {
- .release = mxc_rtc_release,
.read_time = mxc_rtc_read_time,
.set_mmss64 = mxc_rtc_set_mmss,
.read_alarm = mxc_rtc_read_alarm,
diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c
index c0a6e638c672..9e83be32ff43 100644
--- a/drivers/rtc/rtc-puv3.c
+++ b/drivers/rtc/rtc-puv3.c
@@ -157,49 +157,7 @@ static int puv3_rtc_proc(struct device *dev, struct seq_file *seq)
return 0;
}
-static int puv3_rtc_open(struct device *dev)
-{
- struct platform_device *pdev = to_platform_device(dev);
- struct rtc_device *rtc_dev = platform_get_drvdata(pdev);
- int ret;
-
- ret = request_irq(puv3_rtc_alarmno, puv3_rtc_alarmirq,
- 0, "pkunity-rtc alarm", rtc_dev);
-
- if (ret) {
- dev_err(dev, "IRQ%d error %d\n", puv3_rtc_alarmno, ret);
- return ret;
- }
-
- ret = request_irq(puv3_rtc_tickno, puv3_rtc_tickirq,
- 0, "pkunity-rtc tick", rtc_dev);
-
- if (ret) {
- dev_err(dev, "IRQ%d error %d\n", puv3_rtc_tickno, ret);
- goto tick_err;
- }
-
- return ret;
-
- tick_err:
- free_irq(puv3_rtc_alarmno, rtc_dev);
- return ret;
-}
-
-static void puv3_rtc_release(struct device *dev)
-{
- struct platform_device *pdev = to_platform_device(dev);
- struct rtc_device *rtc_dev = platform_get_drvdata(pdev);
-
- /* do not clear AIE here, it may be needed for wake */
- puv3_rtc_setpie(dev, 0);
- free_irq(puv3_rtc_alarmno, rtc_dev);
- free_irq(puv3_rtc_tickno, rtc_dev);
-}
-
static const struct rtc_class_ops puv3_rtcops = {
- .open = puv3_rtc_open,
- .release = puv3_rtc_release,
.read_time = puv3_rtc_gettime,
.set_time = puv3_rtc_settime,
.read_alarm = puv3_rtc_getalarm,
@@ -222,10 +180,6 @@ static void puv3_rtc_enable(struct device *dev, int en)
static int puv3_rtc_remove(struct platform_device *dev)
{
- struct rtc_device *rtc = platform_get_drvdata(dev);
-
- rtc_device_unregister(rtc);
-
puv3_rtc_setpie(&dev->dev, 0);
puv3_rtc_setaie(&dev->dev, 0);
@@ -259,6 +213,24 @@ static int puv3_rtc_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "PKUnity_rtc: tick irq %d, alarm irq %d\n",
puv3_rtc_tickno, puv3_rtc_alarmno);
+ rtc = devm_rtc_allocate_device(&pdev->dev);
+ if (IS_ERR(rtc))
+ return PTR_ERR(rtc);
+
+ ret = devm_request_irq(&pdev->dev, puv3_rtc_alarmno, puv3_rtc_alarmirq,
+ 0, "pkunity-rtc alarm", rtc);
+ if (ret) {
+ dev_err(&pdev->dev, "IRQ%d error %d\n", puv3_rtc_alarmno, ret);
+ return ret;
+ }
+
+ ret = devm_request_irq(&pdev->dev, puv3_rtc_tickno, puv3_rtc_tickirq,
+ 0, "pkunity-rtc tick", rtc);
+ if (ret) {
+ dev_err(&pdev->dev, "IRQ%d error %d\n", puv3_rtc_tickno, ret);
+ return ret;
+ }
+
/* get the memory region */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) {
@@ -278,12 +250,10 @@ static int puv3_rtc_probe(struct platform_device *pdev)
puv3_rtc_enable(&pdev->dev, 1);
/* register RTC and exit */
- rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,
- THIS_MODULE);
-
- if (IS_ERR(rtc)) {
+ rtc->ops = &puv3_rtcops;
+ ret = rtc_register_device(rtc);
+ if (ret) {
dev_err(&pdev->dev, "cannot attach rtc\n");
- ret = PTR_ERR(rtc);
goto err_nortc;
}
diff --git a/drivers/rtc/rtc-pxa.c b/drivers/rtc/rtc-pxa.c
index fe4985b54608..47304f5664d8 100644
--- a/drivers/rtc/rtc-pxa.c
+++ b/drivers/rtc/rtc-pxa.c
@@ -348,7 +348,7 @@ static int __init pxa_rtc_probe(struct platform_device *pdev)
dev_err(dev, "No alarm IRQ resource defined\n");
return -ENXIO;
}
- pxa_rtc_open(dev);
+
pxa_rtc->base = devm_ioremap(dev, pxa_rtc->ress->start,
resource_size(pxa_rtc->ress));
if (!pxa_rtc->base) {
@@ -356,6 +356,8 @@ static int __init pxa_rtc_probe(struct platform_device *pdev)
return -ENOMEM;
}
+ pxa_rtc_open(dev);
+
sa1100_rtc->rcnr = pxa_rtc->base + 0x0;
sa1100_rtc->rtsr = pxa_rtc->base + 0x8;
sa1100_rtc->rtar = pxa_rtc->base + 0x4;
diff --git a/drivers/rtc/rtc-rtd119x.c b/drivers/rtc/rtc-rtd119x.c
new file mode 100644
index 000000000000..b233559d950b
--- /dev/null
+++ b/drivers/rtc/rtc-rtd119x.c
@@ -0,0 +1,242 @@
+/*
+ * Realtek RTD129x RTC
+ *
+ * Copyright (c) 2017 Andreas Färber
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/rtc.h>
+#include <linux/spinlock.h>
+
+#define RTD_RTCSEC 0x00
+#define RTD_RTCMIN 0x04
+#define RTD_RTCHR 0x08
+#define RTD_RTCDATE1 0x0c
+#define RTD_RTCDATE2 0x10
+#define RTD_RTCACR 0x28
+#define RTD_RTCEN 0x2c
+#define RTD_RTCCR 0x30
+
+#define RTD_RTCSEC_RTCSEC_MASK 0x7f
+
+#define RTD_RTCMIN_RTCMIN_MASK 0x3f
+
+#define RTD_RTCHR_RTCHR_MASK 0x1f
+
+#define RTD_RTCDATE1_RTCDATE1_MASK 0xff
+
+#define RTD_RTCDATE2_RTCDATE2_MASK 0x7f
+
+#define RTD_RTCACR_RTCPWR BIT(7)
+
+#define RTD_RTCEN_RTCEN_MASK 0xff
+
+#define RTD_RTCCR_RTCRST BIT(6)
+
+struct rtd119x_rtc {
+ void __iomem *base;
+ struct clk *clk;
+ struct rtc_device *rtcdev;
+ unsigned int base_year;
+};
+
+static inline int rtd119x_rtc_days_in_year(int year)
+{
+ return 365 + (is_leap_year(year) ? 1 : 0);
+}
+
+static void rtd119x_rtc_reset(struct device *dev)
+{
+ struct rtd119x_rtc *data = dev_get_drvdata(dev);
+ u32 val;
+
+ val = readl_relaxed(data->base + RTD_RTCCR);
+ val |= RTD_RTCCR_RTCRST;
+ writel_relaxed(val, data->base + RTD_RTCCR);
+
+ val &= ~RTD_RTCCR_RTCRST;
+ writel(val, data->base + RTD_RTCCR);
+}
+
+static void rtd119x_rtc_set_enabled(struct device *dev, bool enable)
+{
+ struct rtd119x_rtc *data = dev_get_drvdata(dev);
+ u32 val;
+
+ val = readl_relaxed(data->base + RTD_RTCEN);
+ if (enable) {
+ if ((val & RTD_RTCEN_RTCEN_MASK) == 0x5a)
+ return;
+ writel_relaxed(0x5a, data->base + RTD_RTCEN);
+ } else {
+ writel_relaxed(0, data->base + RTD_RTCEN);
+ }
+}
+
+static int rtd119x_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+ struct rtd119x_rtc *data = dev_get_drvdata(dev);
+ s32 day;
+ u32 sec;
+ unsigned int year;
+ int tries = 0;
+
+ while (true) {
+ tm->tm_sec = (readl_relaxed(data->base + RTD_RTCSEC) & RTD_RTCSEC_RTCSEC_MASK) >> 1;
+ tm->tm_min = readl_relaxed(data->base + RTD_RTCMIN) & RTD_RTCMIN_RTCMIN_MASK;
+ tm->tm_hour = readl_relaxed(data->base + RTD_RTCHR) & RTD_RTCHR_RTCHR_MASK;
+ day = readl_relaxed(data->base + RTD_RTCDATE1) & RTD_RTCDATE1_RTCDATE1_MASK;
+ day |= (readl_relaxed(data->base + RTD_RTCDATE2) & RTD_RTCDATE2_RTCDATE2_MASK) << 8;
+ sec = (readl_relaxed(data->base + RTD_RTCSEC) & RTD_RTCSEC_RTCSEC_MASK) >> 1;
+ tries++;
+
+ if (sec == tm->tm_sec)
+ break;
+
+ if (tries >= 3)
+ return -EINVAL;
+ }
+ if (tries > 1)
+ dev_dbg(dev, "%s: needed %i tries\n", __func__, tries);
+
+ year = data->base_year;
+ while (day >= rtd119x_rtc_days_in_year(year)) {
+ day -= rtd119x_rtc_days_in_year(year);
+ year++;
+ }
+ tm->tm_year = year - 1900;
+ tm->tm_yday = day;
+
+ tm->tm_mon = 0;
+ while (day >= rtc_month_days(tm->tm_mon, year)) {
+ day -= rtc_month_days(tm->tm_mon, year);
+ tm->tm_mon++;
+ }
+ tm->tm_mday = day + 1;
+
+ return 0;
+}
+
+static int rtd119x_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ struct rtd119x_rtc *data = dev_get_drvdata(dev);
+ unsigned int day;
+ int i;
+
+ if (1900 + tm->tm_year < data->base_year)
+ return -EINVAL;
+
+ day = 0;
+ for (i = data->base_year; i < 1900 + tm->tm_year; i++)
+ day += rtd119x_rtc_days_in_year(i);
+
+ day += tm->tm_yday;
+ if (day > 0x7fff)
+ return -EINVAL;
+
+ rtd119x_rtc_set_enabled(dev, false);
+
+ writel_relaxed((tm->tm_sec << 1) & RTD_RTCSEC_RTCSEC_MASK, data->base + RTD_RTCSEC);
+ writel_relaxed(tm->tm_min & RTD_RTCMIN_RTCMIN_MASK, data->base + RTD_RTCMIN);
+ writel_relaxed(tm->tm_hour & RTD_RTCHR_RTCHR_MASK, data->base + RTD_RTCHR);
+ writel_relaxed(day & RTD_RTCDATE1_RTCDATE1_MASK, data->base + RTD_RTCDATE1);
+ writel_relaxed((day >> 8) & RTD_RTCDATE2_RTCDATE2_MASK, data->base + RTD_RTCDATE2);
+
+ rtd119x_rtc_set_enabled(dev, true);
+
+ return 0;
+}
+
+static const struct rtc_class_ops rtd119x_rtc_ops = {
+ .read_time = rtd119x_rtc_read_time,
+ .set_time = rtd119x_rtc_set_time,
+};
+
+static const struct of_device_id rtd119x_rtc_dt_ids[] = {
+ { .compatible = "realtek,rtd1295-rtc" },
+ { }
+};
+
+static int rtd119x_rtc_probe(struct platform_device *pdev)
+{
+ struct rtd119x_rtc *data;
+ struct resource *res;
+ u32 val;
+ int ret;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, data);
+ data->base_year = 2014;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ data->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(data->base))
+ return PTR_ERR(data->base);
+
+ data->clk = of_clk_get(pdev->dev.of_node, 0);
+ if (IS_ERR(data->clk))
+ return PTR_ERR(data->clk);
+
+ ret = clk_prepare_enable(data->clk);
+ if (ret) {
+ clk_put(data->clk);
+ return ret;
+ }
+
+ val = readl_relaxed(data->base + RTD_RTCACR);
+ if (!(val & RTD_RTCACR_RTCPWR)) {
+ writel_relaxed(RTD_RTCACR_RTCPWR, data->base + RTD_RTCACR);
+
+ rtd119x_rtc_reset(&pdev->dev);
+
+ writel_relaxed(0, data->base + RTD_RTCMIN);
+ writel_relaxed(0, data->base + RTD_RTCHR);
+ writel_relaxed(0, data->base + RTD_RTCDATE1);
+ writel_relaxed(0, data->base + RTD_RTCDATE2);
+ }
+
+ rtd119x_rtc_set_enabled(&pdev->dev, true);
+
+ data->rtcdev = devm_rtc_device_register(&pdev->dev, "rtc",
+ &rtd119x_rtc_ops, THIS_MODULE);
+ if (IS_ERR(data->rtcdev)) {
+ dev_err(&pdev->dev, "failed to register rtc device");
+ clk_disable_unprepare(data->clk);
+ clk_put(data->clk);
+ return PTR_ERR(data->rtcdev);
+ }
+
+ return 0;
+}
+
+static int rtd119x_rtc_remove(struct platform_device *pdev)
+{
+ struct rtd119x_rtc *data = platform_get_drvdata(pdev);
+
+ rtd119x_rtc_set_enabled(&pdev->dev, false);
+
+ clk_disable_unprepare(data->clk);
+ clk_put(data->clk);
+
+ return 0;
+}
+
+static struct platform_driver rtd119x_rtc_driver = {
+ .probe = rtd119x_rtc_probe,
+ .remove = rtd119x_rtc_remove,
+ .driver = {
+ .name = "rtd1295-rtc",
+ .of_match_table = rtd119x_rtc_dt_ids,
+ },
+};
+builtin_platform_driver(rtd119x_rtc_driver);
diff --git a/drivers/rtc/rtc-rv3029c2.c b/drivers/rtc/rtc-rv3029c2.c
index 85fa1da03762..aa09771de04f 100644
--- a/drivers/rtc/rtc-rv3029c2.c
+++ b/drivers/rtc/rtc-rv3029c2.c
@@ -868,7 +868,7 @@ static int rv3029_i2c_probe(struct i2c_client *client,
return rv3029_probe(&client->dev, regmap, client->irq, client->name);
}
-static struct i2c_device_id rv3029_id[] = {
+static const struct i2c_device_id rv3029_id[] = {
{ "rv3029", 0 },
{ "rv3029c2", 0 },
{ }
diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c
index 449820eeefe8..7067bca5c20d 100644
--- a/drivers/rtc/rtc-s35390a.c
+++ b/drivers/rtc/rtc-s35390a.c
@@ -106,33 +106,12 @@ static int s35390a_get_reg(struct s35390a *s35390a, int reg, char *buf, int len)
return 0;
}
-/*
- * Returns <0 on error, 0 if rtc is setup fine and 1 if the chip was reset.
- * To keep the information if an irq is pending, pass the value read from
- * STATUS1 to the caller.
- */
-static int s35390a_reset(struct s35390a *s35390a, char *status1)
+static int s35390a_init(struct s35390a *s35390a)
{
char buf;
int ret;
unsigned initcount = 0;
- ret = s35390a_get_reg(s35390a, S35390A_CMD_STATUS1, status1, 1);
- if (ret < 0)
- return ret;
-
- if (*status1 & S35390A_FLAG_POC)
- /*
- * Do not communicate for 0.5 seconds since the power-on
- * detection circuit is in operation.
- */
- msleep(500);
- else if (!(*status1 & S35390A_FLAG_BLD))
- /*
- * If both POC and BLD are unset everything is fine.
- */
- return 0;
-
/*
* At least one of POC and BLD are set, so reinitialise chip. Keeping
* this information in the hardware to know later that the time isn't
@@ -142,7 +121,6 @@ static int s35390a_reset(struct s35390a *s35390a, char *status1)
* The 24H bit is kept over reset, so set it already here.
*/
initialize:
- *status1 = S35390A_FLAG_24H;
buf = S35390A_FLAG_RESET | S35390A_FLAG_24H;
ret = s35390a_set_reg(s35390a, S35390A_CMD_STATUS1, &buf, 1);
@@ -165,6 +143,34 @@ initialize:
return 1;
}
+/*
+ * Returns <0 on error, 0 if rtc is setup fine and 1 if the chip was reset.
+ * To keep the information if an irq is pending, pass the value read from
+ * STATUS1 to the caller.
+ */
+static int s35390a_read_status(struct s35390a *s35390a, char *status1)
+{
+ int ret;
+
+ ret = s35390a_get_reg(s35390a, S35390A_CMD_STATUS1, status1, 1);
+ if (ret < 0)
+ return ret;
+
+ if (*status1 & S35390A_FLAG_POC) {
+ /*
+ * Do not communicate for 0.5 seconds since the power-on
+ * detection circuit is in operation.
+ */
+ msleep(500);
+ return 1;
+ } else if (*status1 & S35390A_FLAG_BLD)
+ return 1;
+ /*
+ * If both POC and BLD are unset everything is fine.
+ */
+ return 0;
+}
+
static int s35390a_disable_test_mode(struct s35390a *s35390a)
{
char buf[1];
@@ -208,13 +214,16 @@ static int s35390a_set_datetime(struct i2c_client *client, struct rtc_time *tm)
{
struct s35390a *s35390a = i2c_get_clientdata(client);
int i, err;
- char buf[7];
+ char buf[7], status;
dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d mday=%d, "
"mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec,
tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year,
tm->tm_wday);
+ if (s35390a_read_status(s35390a, &status) == 1)
+ s35390a_init(s35390a);
+
buf[S35390A_BYTE_YEAR] = bin2bcd(tm->tm_year - 100);
buf[S35390A_BYTE_MONTH] = bin2bcd(tm->tm_mon + 1);
buf[S35390A_BYTE_DAY] = bin2bcd(tm->tm_mday);
@@ -235,9 +244,12 @@ static int s35390a_set_datetime(struct i2c_client *client, struct rtc_time *tm)
static int s35390a_get_datetime(struct i2c_client *client, struct rtc_time *tm)
{
struct s35390a *s35390a = i2c_get_clientdata(client);
- char buf[7];
+ char buf[7], status;
int i, err;
+ if (s35390a_read_status(s35390a, &status) == 1)
+ return -EINVAL;
+
err = s35390a_get_reg(s35390a, S35390A_CMD_TIME1, buf, sizeof(buf));
if (err < 0)
return err;
@@ -392,12 +404,42 @@ static int s35390a_rtc_set_time(struct device *dev, struct rtc_time *tm)
return s35390a_set_datetime(to_i2c_client(dev), tm);
}
+static int s35390a_rtc_ioctl(struct device *dev, unsigned int cmd,
+ unsigned long arg)
+{
+ struct i2c_client *client = to_i2c_client(dev);
+ struct s35390a *s35390a = i2c_get_clientdata(client);
+ char sts;
+ int err;
+
+ switch (cmd) {
+ case RTC_VL_READ:
+ /* s35390a_reset set lowvoltage flag and init RTC if needed */
+ err = s35390a_read_status(s35390a, &sts);
+ if (err < 0)
+ return err;
+ if (copy_to_user((void __user *)arg, &err, sizeof(int)))
+ return -EFAULT;
+ break;
+ case RTC_VL_CLR:
+ /* update flag and clear register */
+ err = s35390a_init(s35390a);
+ if (err < 0)
+ return err;
+ break;
+ default:
+ return -ENOIOCTLCMD;
+ }
+
+ return 0;
+}
+
static const struct rtc_class_ops s35390a_rtc_ops = {
.read_time = s35390a_rtc_read_time,
.set_time = s35390a_rtc_set_time,
.set_alarm = s35390a_rtc_set_alarm,
.read_alarm = s35390a_rtc_read_alarm,
-
+ .ioctl = s35390a_rtc_ioctl,
};
static struct i2c_driver s35390a_driver;
@@ -405,7 +447,7 @@ static struct i2c_driver s35390a_driver;
static int s35390a_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
- int err, err_reset;
+ int err, err_read;
unsigned int i;
struct s35390a *s35390a;
struct rtc_time tm;
@@ -438,9 +480,9 @@ static int s35390a_probe(struct i2c_client *client,
}
}
- err_reset = s35390a_reset(s35390a, &status1);
- if (err_reset < 0) {
- err = err_reset;
+ err_read = s35390a_read_status(s35390a, &status1);
+ if (err_read < 0) {
+ err = err_read;
dev_err(&client->dev, "error resetting chip\n");
goto exit_dummy;
}
@@ -466,7 +508,7 @@ static int s35390a_probe(struct i2c_client *client,
}
}
- if (err_reset > 0 || s35390a_get_datetime(client, &tm) < 0)
+ if (err_read > 0 || s35390a_get_datetime(client, &tm) < 0)
dev_warn(&client->dev, "clock needs to be set\n");
device_set_wakeup_capable(&client->dev, 1);
diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c
index c2187bf6c7e4..ed71d1113627 100644
--- a/drivers/rtc/rtc-sa1100.c
+++ b/drivers/rtc/rtc-sa1100.c
@@ -95,46 +95,6 @@ static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id)
return IRQ_HANDLED;
}
-static int sa1100_rtc_open(struct device *dev)
-{
- struct sa1100_rtc *info = dev_get_drvdata(dev);
- struct rtc_device *rtc = info->rtc;
- int ret;
-
- ret = request_irq(info->irq_1hz, sa1100_rtc_interrupt, 0, "rtc 1Hz", dev);
- if (ret) {
- dev_err(dev, "IRQ %d already in use.\n", info->irq_1hz);
- goto fail_ui;
- }
- ret = request_irq(info->irq_alarm, sa1100_rtc_interrupt, 0, "rtc Alrm", dev);
- if (ret) {
- dev_err(dev, "IRQ %d already in use.\n", info->irq_alarm);
- goto fail_ai;
- }
- rtc->max_user_freq = RTC_FREQ;
- rtc_irq_set_freq(rtc, NULL, RTC_FREQ);
-
- return 0;
-
- fail_ai:
- free_irq(info->irq_1hz, dev);
- fail_ui:
- clk_disable_unprepare(info->clk);
- return ret;
-}
-
-static void sa1100_rtc_release(struct device *dev)
-{
- struct sa1100_rtc *info = dev_get_drvdata(dev);
-
- spin_lock_irq(&info->lock);
- writel_relaxed(0, info->rtsr);
- spin_unlock_irq(&info->lock);
-
- free_irq(info->irq_alarm, dev);
- free_irq(info->irq_1hz, dev);
-}
-
static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
{
u32 rtsr;
@@ -216,8 +176,6 @@ static int sa1100_rtc_proc(struct device *dev, struct seq_file *seq)
}
static const struct rtc_class_ops sa1100_rtc_ops = {
- .open = sa1100_rtc_open,
- .release = sa1100_rtc_release,
.read_time = sa1100_rtc_read_time,
.set_time = sa1100_rtc_set_time,
.read_alarm = sa1100_rtc_read_alarm,
@@ -265,6 +223,9 @@ int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info)
}
info->rtc = rtc;
+ rtc->max_user_freq = RTC_FREQ;
+ rtc_irq_set_freq(rtc, NULL, RTC_FREQ);
+
/* Fix for a nasty initialization problem the in SA11xx RTSR register.
* See also the comments in sa1100_rtc_interrupt().
*
@@ -299,6 +260,7 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
struct resource *iores;
void __iomem *base;
int irq_1hz, irq_alarm;
+ int ret;
irq_1hz = platform_get_irq_byname(pdev, "rtc 1Hz");
irq_alarm = platform_get_irq_byname(pdev, "rtc alarm");
@@ -311,6 +273,19 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
info->irq_1hz = irq_1hz;
info->irq_alarm = irq_alarm;
+ ret = devm_request_irq(&pdev->dev, irq_1hz, sa1100_rtc_interrupt, 0,
+ "rtc 1Hz", &pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_1hz);
+ return ret;
+ }
+ ret = devm_request_irq(&pdev->dev, irq_alarm, sa1100_rtc_interrupt, 0,
+ "rtc Alrm", &pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_alarm);
+ return ret;
+ }
+
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
base = devm_ioremap_resource(&pdev->dev, iores);
if (IS_ERR(base))
@@ -339,8 +314,12 @@ static int sa1100_rtc_remove(struct platform_device *pdev)
{
struct sa1100_rtc *info = platform_get_drvdata(pdev);
- if (info)
+ if (info) {
+ spin_lock_irq(&info->lock);
+ writel_relaxed(0, info->rtsr);
+ spin_unlock_irq(&info->lock);
clk_disable_unprepare(info->clk);
+ }
return 0;
}
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
index 39cbc1238b92..3d2216ccd860 100644
--- a/drivers/rtc/rtc-sun6i.c
+++ b/drivers/rtc/rtc-sun6i.c
@@ -73,6 +73,9 @@
#define SUN6I_ALARM_CONFIG 0x0050
#define SUN6I_ALARM_CONFIG_WAKEUP BIT(0)
+#define SUN6I_LOSC_OUT_GATING 0x0060
+#define SUN6I_LOSC_OUT_GATING_EN BIT(0)
+
/*
* Get date values
*/
@@ -125,6 +128,7 @@ struct sun6i_rtc_dev {
struct clk_hw hw;
struct clk_hw *int_osc;
struct clk *losc;
+ struct clk *ext_losc;
spinlock_t lock;
};
@@ -188,23 +192,24 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
struct clk_init_data init = {
.ops = &sun6i_rtc_osc_ops,
};
+ const char *clkout_name = "osc32k-out";
const char *parents[2];
rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
if (!rtc)
return;
- spin_lock_init(&rtc->lock);
- clk_data = kzalloc(sizeof(*clk_data) + sizeof(*clk_data->hws),
+ clk_data = kzalloc(sizeof(*clk_data) + (sizeof(*clk_data->hws) * 2),
GFP_KERNEL);
if (!clk_data)
return;
+
spin_lock_init(&rtc->lock);
rtc->base = of_io_request_and_map(node, 0, of_node_full_name(node));
if (IS_ERR(rtc->base)) {
pr_crit("Can't map RTC registers");
- return;
+ goto err;
}
/* Switch to the external, more precise, oscillator */
@@ -216,7 +221,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
/* Deal with old DTs */
if (!of_get_property(node, "clocks", NULL))
- return;
+ goto err;
rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL,
"rtc-int-osc",
@@ -235,7 +240,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
init.parent_names = parents;
init.num_parents = of_clk_get_parent_count(node) + 1;
- of_property_read_string(node, "clock-output-names", &init.name);
+ of_property_read_string_index(node, "clock-output-names", 0,
+ &init.name);
rtc->losc = clk_register(NULL, &rtc->hw);
if (IS_ERR(rtc->losc)) {
@@ -243,9 +249,25 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)
return;
}
- clk_data->num = 1;
+ of_property_read_string_index(node, "clock-output-names", 1,
+ &clkout_name);
+ rtc->ext_losc = clk_register_gate(NULL, clkout_name, rtc->hw.init->name,
+ 0, rtc->base + SUN6I_LOSC_OUT_GATING,
+ SUN6I_LOSC_OUT_GATING_EN, 0,
+ &rtc->lock);
+ if (IS_ERR(rtc->ext_losc)) {
+ pr_crit("Couldn't register the LOSC external gate\n");
+ return;
+ }
+
+ clk_data->num = 2;
clk_data->hws[0] = &rtc->hw;
+ clk_data->hws[1] = __clk_get_hw(rtc->ext_losc);
of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ return;
+
+err:
+ kfree(clk_data);
}
CLK_OF_DECLARE_DRIVER(sun6i_rtc_clk, "allwinner,sun6i-a31-rtc",
sun6i_rtc_clk_init);
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c
index e1b86bb01062..7ce22967fd16 100644
--- a/drivers/rtc/rtc-vr41xx.c
+++ b/drivers/rtc/rtc-vr41xx.c
@@ -119,23 +119,6 @@ static inline void write_elapsed_second(unsigned long sec)
spin_unlock_irq(&rtc_lock);
}
-static void vr41xx_rtc_release(struct device *dev)
-{
-
- spin_lock_irq(&rtc_lock);
-
- rtc1_write(ECMPLREG, 0);
- rtc1_write(ECMPMREG, 0);
- rtc1_write(ECMPHREG, 0);
- rtc1_write(RTCL1LREG, 0);
- rtc1_write(RTCL1HREG, 0);
-
- spin_unlock_irq(&rtc_lock);
-
- disable_irq(aie_irq);
- disable_irq(pie_irq);
-}
-
static int vr41xx_rtc_read_time(struct device *dev, struct rtc_time *time)
{
unsigned long epoch_sec, elapsed_sec;
@@ -272,7 +255,6 @@ static irqreturn_t rtclong1_interrupt(int irq, void *dev_id)
}
static const struct rtc_class_ops vr41xx_rtc_ops = {
- .release = vr41xx_rtc_release,
.ioctl = vr41xx_rtc_ioctl,
.read_time = vr41xx_rtc_read_time,
.set_time = vr41xx_rtc_set_time,
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 9c97ad1ee121..29f35e29d480 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -62,7 +62,6 @@ MODULE_LICENSE("GPL");
static int dasd_alloc_queue(struct dasd_block *);
static void dasd_setup_queue(struct dasd_block *);
static void dasd_free_queue(struct dasd_block *);
-static void dasd_flush_request_queue(struct dasd_block *);
static int dasd_flush_block_queue(struct dasd_block *);
static void dasd_device_tasklet(struct dasd_device *);
static void dasd_block_tasklet(struct dasd_block *);
@@ -158,7 +157,6 @@ struct dasd_block *dasd_alloc_block(void)
/* open_count = 0 means device online but not in use */
atomic_set(&block->open_count, -1);
- spin_lock_init(&block->request_queue_lock);
atomic_set(&block->tasklet_scheduled, 0);
tasklet_init(&block->tasklet,
(void (*)(unsigned long)) dasd_block_tasklet,
@@ -391,7 +389,6 @@ static int dasd_state_ready_to_basic(struct dasd_device *device)
device->state = DASD_STATE_READY;
return rc;
}
- dasd_flush_request_queue(block);
dasd_destroy_partitions(block);
block->blocks = 0;
block->bp_block = 0;
@@ -1645,8 +1642,12 @@ void dasd_generic_handle_state_change(struct dasd_device *device)
dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING);
dasd_schedule_device_bh(device);
- if (device->block)
+ if (device->block) {
dasd_schedule_block_bh(device->block);
+ if (device->block->request_queue)
+ blk_mq_run_hw_queues(device->block->request_queue,
+ true);
+ }
}
EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
@@ -2638,6 +2639,7 @@ static void dasd_block_timeout(unsigned long ptr)
dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING);
spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags);
dasd_schedule_block_bh(block);
+ blk_mq_run_hw_queues(block->request_queue, true);
}
/*
@@ -2677,115 +2679,11 @@ static void __dasd_process_erp(struct dasd_device *device,
erp_fn(cqr);
}
-/*
- * Fetch requests from the block device queue.
- */
-static void __dasd_process_request_queue(struct dasd_block *block)
-{
- struct request_queue *queue;
- struct request *req;
- struct dasd_ccw_req *cqr;
- struct dasd_device *basedev;
- unsigned long flags;
- queue = block->request_queue;
- basedev = block->base;
- /* No queue ? Then there is nothing to do. */
- if (queue == NULL)
- return;
-
- /*
- * We requeue request from the block device queue to the ccw
- * queue only in two states. In state DASD_STATE_READY the
- * partition detection is done and we need to requeue requests
- * for that. State DASD_STATE_ONLINE is normal block device
- * operation.
- */
- if (basedev->state < DASD_STATE_READY) {
- while ((req = blk_fetch_request(block->request_queue)))
- __blk_end_request_all(req, BLK_STS_IOERR);
- return;
- }
-
- /*
- * if device is stopped do not fetch new requests
- * except failfast is active which will let requests fail
- * immediately in __dasd_block_start_head()
- */
- if (basedev->stopped && !(basedev->features & DASD_FEATURE_FAILFAST))
- return;
-
- /* Now we try to fetch requests from the request queue */
- while ((req = blk_peek_request(queue))) {
- if (basedev->features & DASD_FEATURE_READONLY &&
- rq_data_dir(req) == WRITE) {
- DBF_DEV_EVENT(DBF_ERR, basedev,
- "Rejecting write request %p",
- req);
- blk_start_request(req);
- __blk_end_request_all(req, BLK_STS_IOERR);
- continue;
- }
- if (test_bit(DASD_FLAG_ABORTALL, &basedev->flags) &&
- (basedev->features & DASD_FEATURE_FAILFAST ||
- blk_noretry_request(req))) {
- DBF_DEV_EVENT(DBF_ERR, basedev,
- "Rejecting failfast request %p",
- req);
- blk_start_request(req);
- __blk_end_request_all(req, BLK_STS_TIMEOUT);
- continue;
- }
- cqr = basedev->discipline->build_cp(basedev, block, req);
- if (IS_ERR(cqr)) {
- if (PTR_ERR(cqr) == -EBUSY)
- break; /* normal end condition */
- if (PTR_ERR(cqr) == -ENOMEM)
- break; /* terminate request queue loop */
- if (PTR_ERR(cqr) == -EAGAIN) {
- /*
- * The current request cannot be build right
- * now, we have to try later. If this request
- * is the head-of-queue we stop the device
- * for 1/2 second.
- */
- if (!list_empty(&block->ccw_queue))
- break;
- spin_lock_irqsave(
- get_ccwdev_lock(basedev->cdev), flags);
- dasd_device_set_stop_bits(basedev,
- DASD_STOPPED_PENDING);
- spin_unlock_irqrestore(
- get_ccwdev_lock(basedev->cdev), flags);
- dasd_block_set_timer(block, HZ/2);
- break;
- }
- DBF_DEV_EVENT(DBF_ERR, basedev,
- "CCW creation failed (rc=%ld) "
- "on request %p",
- PTR_ERR(cqr), req);
- blk_start_request(req);
- __blk_end_request_all(req, BLK_STS_IOERR);
- continue;
- }
- /*
- * Note: callback is set to dasd_return_cqr_cb in
- * __dasd_block_start_head to cover erp requests as well
- */
- cqr->callback_data = (void *) req;
- cqr->status = DASD_CQR_FILLED;
- req->completion_data = cqr;
- blk_start_request(req);
- list_add_tail(&cqr->blocklist, &block->ccw_queue);
- INIT_LIST_HEAD(&cqr->devlist);
- dasd_profile_start(block, cqr, req);
- }
-}
-
static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
{
struct request *req;
- int status;
blk_status_t error = BLK_STS_OK;
+ int status;
req = (struct request *) cqr->callback_data;
dasd_profile_end(cqr->block, cqr, req);
@@ -2809,7 +2707,19 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
break;
}
}
- __blk_end_request_all(req, error);
+
+ /*
+ * We need to take care for ETIMEDOUT errors here since the
+ * complete callback does not get called in this case.
+ * Take care of all errors here and avoid additional code to
+ * transfer the error value to the complete callback.
+ */
+ if (error) {
+ blk_mq_end_request(req, error);
+ blk_mq_run_hw_queues(req->q, true);
+ } else {
+ blk_mq_complete_request(req);
+ }
}
/*
@@ -2938,27 +2848,30 @@ static void dasd_block_tasklet(struct dasd_block *block)
struct list_head final_queue;
struct list_head *l, *n;
struct dasd_ccw_req *cqr;
+ struct dasd_queue *dq;
atomic_set(&block->tasklet_scheduled, 0);
INIT_LIST_HEAD(&final_queue);
- spin_lock(&block->queue_lock);
+ spin_lock_irq(&block->queue_lock);
/* Finish off requests on ccw queue */
__dasd_process_block_ccw_queue(block, &final_queue);
- spin_unlock(&block->queue_lock);
+ spin_unlock_irq(&block->queue_lock);
+
/* Now call the callback function of requests with final status */
- spin_lock_irq(&block->request_queue_lock);
list_for_each_safe(l, n, &final_queue) {
cqr = list_entry(l, struct dasd_ccw_req, blocklist);
+ dq = cqr->dq;
+ spin_lock_irq(&dq->lock);
list_del_init(&cqr->blocklist);
__dasd_cleanup_cqr(cqr);
+ spin_unlock_irq(&dq->lock);
}
- spin_lock(&block->queue_lock);
- /* Get new request from the block device request queue */
- __dasd_process_request_queue(block);
+
+ spin_lock_irq(&block->queue_lock);
/* Now check if the head of the ccw queue needs to be started. */
__dasd_block_start_head(block);
- spin_unlock(&block->queue_lock);
- spin_unlock_irq(&block->request_queue_lock);
+ spin_unlock_irq(&block->queue_lock);
+
if (waitqueue_active(&shutdown_waitq))
wake_up(&shutdown_waitq);
dasd_put_device(block->base);
@@ -2977,14 +2890,13 @@ static int _dasd_requeue_request(struct dasd_ccw_req *cqr)
{
struct dasd_block *block = cqr->block;
struct request *req;
- unsigned long flags;
if (!block)
return -EINVAL;
- spin_lock_irqsave(&block->request_queue_lock, flags);
+ spin_lock_irq(&cqr->dq->lock);
req = (struct request *) cqr->callback_data;
- blk_requeue_request(block->request_queue, req);
- spin_unlock_irqrestore(&block->request_queue_lock, flags);
+ blk_mq_requeue_request(req, false);
+ spin_unlock_irq(&cqr->dq->lock);
return 0;
}
@@ -2999,6 +2911,7 @@ static int dasd_flush_block_queue(struct dasd_block *block)
struct dasd_ccw_req *cqr, *n;
int rc, i;
struct list_head flush_queue;
+ unsigned long flags;
INIT_LIST_HEAD(&flush_queue);
spin_lock_bh(&block->queue_lock);
@@ -3037,11 +2950,11 @@ restart_cb:
goto restart_cb;
}
/* call the callback function */
- spin_lock_irq(&block->request_queue_lock);
+ spin_lock_irqsave(&cqr->dq->lock, flags);
cqr->endclk = get_tod_clock();
list_del_init(&cqr->blocklist);
__dasd_cleanup_cqr(cqr);
- spin_unlock_irq(&block->request_queue_lock);
+ spin_unlock_irqrestore(&cqr->dq->lock, flags);
}
return rc;
}
@@ -3069,42 +2982,114 @@ EXPORT_SYMBOL(dasd_schedule_block_bh);
/*
* Dasd request queue function. Called from ll_rw_blk.c
*/
-static void do_dasd_request(struct request_queue *queue)
+static blk_status_t do_dasd_request(struct blk_mq_hw_ctx *hctx,
+ const struct blk_mq_queue_data *qd)
{
- struct dasd_block *block;
+ struct dasd_block *block = hctx->queue->queuedata;
+ struct dasd_queue *dq = hctx->driver_data;
+ struct request *req = qd->rq;
+ struct dasd_device *basedev;
+ struct dasd_ccw_req *cqr;
+ blk_status_t rc = BLK_STS_OK;
+
+ basedev = block->base;
+ spin_lock_irq(&dq->lock);
+ if (basedev->state < DASD_STATE_READY) {
+ DBF_DEV_EVENT(DBF_ERR, basedev,
+ "device not ready for request %p", req);
+ rc = BLK_STS_IOERR;
+ goto out;
+ }
+
+ /*
+ * if device is stopped do not fetch new requests
+ * except failfast is active which will let requests fail
+ * immediately in __dasd_block_start_head()
+ */
+ if (basedev->stopped && !(basedev->features & DASD_FEATURE_FAILFAST)) {
+ DBF_DEV_EVENT(DBF_ERR, basedev,
+ "device stopped request %p", req);
+ rc = BLK_STS_RESOURCE;
+ goto out;
+ }
+
+ if (basedev->features & DASD_FEATURE_READONLY &&
+ rq_data_dir(req) == WRITE) {
+ DBF_DEV_EVENT(DBF_ERR, basedev,
+ "Rejecting write request %p", req);
+ rc = BLK_STS_IOERR;
+ goto out;
+ }
- block = queue->queuedata;
+ if (test_bit(DASD_FLAG_ABORTALL, &basedev->flags) &&
+ (basedev->features & DASD_FEATURE_FAILFAST ||
+ blk_noretry_request(req))) {
+ DBF_DEV_EVENT(DBF_ERR, basedev,
+ "Rejecting failfast request %p", req);
+ rc = BLK_STS_IOERR;
+ goto out;
+ }
+
+ cqr = basedev->discipline->build_cp(basedev, block, req);
+ if (IS_ERR(cqr)) {
+ if (PTR_ERR(cqr) == -EBUSY ||
+ PTR_ERR(cqr) == -ENOMEM ||
+ PTR_ERR(cqr) == -EAGAIN) {
+ rc = BLK_STS_RESOURCE;
+ goto out;
+ }
+ DBF_DEV_EVENT(DBF_ERR, basedev,
+ "CCW creation failed (rc=%ld) on request %p",
+ PTR_ERR(cqr), req);
+ rc = BLK_STS_IOERR;
+ goto out;
+ }
+ /*
+ * Note: callback is set to dasd_return_cqr_cb in
+ * __dasd_block_start_head to cover erp requests as well
+ */
+ cqr->callback_data = req;
+ cqr->status = DASD_CQR_FILLED;
+ cqr->dq = dq;
+ req->completion_data = cqr;
+ blk_mq_start_request(req);
spin_lock(&block->queue_lock);
- /* Get new request from the block device request queue */
- __dasd_process_request_queue(block);
- /* Now check if the head of the ccw queue needs to be started. */
- __dasd_block_start_head(block);
+ list_add_tail(&cqr->blocklist, &block->ccw_queue);
+ INIT_LIST_HEAD(&cqr->devlist);
+ dasd_profile_start(block, cqr, req);
+ dasd_schedule_block_bh(block);
spin_unlock(&block->queue_lock);
+
+out:
+ spin_unlock_irq(&dq->lock);
+ return rc;
}
/*
* Block timeout callback, called from the block layer
*
- * request_queue lock is held on entry.
- *
* Return values:
* BLK_EH_RESET_TIMER if the request should be left running
* BLK_EH_NOT_HANDLED if the request is handled or terminated
* by the driver.
*/
-enum blk_eh_timer_return dasd_times_out(struct request *req)
+enum blk_eh_timer_return dasd_times_out(struct request *req, bool reserved)
{
struct dasd_ccw_req *cqr = req->completion_data;
struct dasd_block *block = req->q->queuedata;
struct dasd_device *device;
+ unsigned long flags;
int rc = 0;
if (!cqr)
return BLK_EH_NOT_HANDLED;
+ spin_lock_irqsave(&cqr->dq->lock, flags);
device = cqr->startdev ? cqr->startdev : block->base;
- if (!device->blk_timeout)
+ if (!device->blk_timeout) {
+ spin_unlock_irqrestore(&cqr->dq->lock, flags);
return BLK_EH_RESET_TIMER;
+ }
DBF_DEV_EVENT(DBF_WARNING, device,
" dasd_times_out cqr %p status %x",
cqr, cqr->status);
@@ -3154,19 +3139,64 @@ enum blk_eh_timer_return dasd_times_out(struct request *req)
}
dasd_schedule_block_bh(block);
spin_unlock(&block->queue_lock);
+ spin_unlock_irqrestore(&cqr->dq->lock, flags);
return rc ? BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED;
}
+static int dasd_init_hctx(struct blk_mq_hw_ctx *hctx, void *data,
+ unsigned int idx)
+{
+ struct dasd_queue *dq = kzalloc(sizeof(*dq), GFP_KERNEL);
+
+ if (!dq)
+ return -ENOMEM;
+
+ spin_lock_init(&dq->lock);
+ hctx->driver_data = dq;
+
+ return 0;
+}
+
+static void dasd_exit_hctx(struct blk_mq_hw_ctx *hctx, unsigned int idx)
+{
+ kfree(hctx->driver_data);
+ hctx->driver_data = NULL;
+}
+
+static void dasd_request_done(struct request *req)
+{
+ blk_mq_end_request(req, 0);
+ blk_mq_run_hw_queues(req->q, true);
+}
+
+static struct blk_mq_ops dasd_mq_ops = {
+ .queue_rq = do_dasd_request,
+ .complete = dasd_request_done,
+ .timeout = dasd_times_out,
+ .init_hctx = dasd_init_hctx,
+ .exit_hctx = dasd_exit_hctx,
+};
+
/*
* Allocate and initialize request queue and default I/O scheduler.
*/
static int dasd_alloc_queue(struct dasd_block *block)
{
- block->request_queue = blk_init_queue(do_dasd_request,
- &block->request_queue_lock);
- if (block->request_queue == NULL)
- return -ENOMEM;
+ int rc;
+
+ block->tag_set.ops = &dasd_mq_ops;
+ block->tag_set.nr_hw_queues = DASD_NR_HW_QUEUES;
+ block->tag_set.queue_depth = DASD_MAX_LCU_DEV * DASD_REQ_PER_DEV;
+ block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
+
+ rc = blk_mq_alloc_tag_set(&block->tag_set);
+ if (rc)
+ return rc;
+
+ block->request_queue = blk_mq_init_queue(&block->tag_set);
+ if (IS_ERR(block->request_queue))
+ return PTR_ERR(block->request_queue);
block->request_queue->queuedata = block;
@@ -3229,26 +3259,11 @@ static void dasd_free_queue(struct dasd_block *block)
{
if (block->request_queue) {
blk_cleanup_queue(block->request_queue);
+ blk_mq_free_tag_set(&block->tag_set);
block->request_queue = NULL;
}
}
-/*
- * Flush request on the request queue.
- */
-static void dasd_flush_request_queue(struct dasd_block *block)
-{
- struct request *req;
-
- if (!block->request_queue)
- return;
-
- spin_lock_irq(&block->request_queue_lock);
- while ((req = blk_fetch_request(block->request_queue)))
- __blk_end_request_all(req, BLK_STS_IOERR);
- spin_unlock_irq(&block->request_queue_lock);
-}
-
static int dasd_open(struct block_device *bdev, fmode_t mode)
{
struct dasd_device *base;
@@ -3744,8 +3759,12 @@ int dasd_generic_path_operational(struct dasd_device *device)
return 1;
}
dasd_schedule_device_bh(device);
- if (device->block)
+ if (device->block) {
dasd_schedule_block_bh(device->block);
+ if (device->block->request_queue)
+ blk_mq_run_hw_queues(device->block->request_queue,
+ true);
+ }
if (!device->stopped)
wake_up(&generic_waitq);
@@ -4008,8 +4027,12 @@ int dasd_generic_restore_device(struct ccw_device *cdev)
*/
device->stopped |= DASD_UNRESUMED_PM;
- if (device->block)
+ if (device->block) {
dasd_schedule_block_bh(device->block);
+ if (device->block->request_queue)
+ blk_mq_run_hw_queues(device->block->request_queue,
+ true);
+ }
clear_bit(DASD_FLAG_SUSPENDED, &device->flags);
dasd_put_device(device);
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c
index e38042ce94e6..c95a4784c191 100644
--- a/drivers/s390/block/dasd_devmap.c
+++ b/drivers/s390/block/dasd_devmap.c
@@ -1326,7 +1326,7 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
{
struct dasd_device *device;
struct request_queue *q;
- unsigned long val, flags;
+ unsigned long val;
device = dasd_device_from_cdev(to_ccwdev(dev));
if (IS_ERR(device) || !device->block)
@@ -1342,16 +1342,10 @@ dasd_timeout_store(struct device *dev, struct device_attribute *attr,
dasd_put_device(device);
return -ENODEV;
}
- spin_lock_irqsave(&device->block->request_queue_lock, flags);
- if (!val)
- blk_queue_rq_timed_out(q, NULL);
- else
- blk_queue_rq_timed_out(q, dasd_times_out);
device->blk_timeout = val;
blk_queue_rq_timeout(q, device->blk_timeout * HZ);
- spin_unlock_irqrestore(&device->block->request_queue_lock, flags);
dasd_put_device(device);
return count;
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h
index f9e25fc03d6b..db470bd10175 100644
--- a/drivers/s390/block/dasd_int.h
+++ b/drivers/s390/block/dasd_int.h
@@ -56,6 +56,7 @@
#include <asm/dasd.h>
#include <asm/idals.h>
#include <linux/bitops.h>
+#include <linux/blk-mq.h>
/* DASD discipline magic */
#define DASD_ECKD_MAGIC 0xC5C3D2C4
@@ -185,6 +186,7 @@ struct dasd_ccw_req {
char status; /* status of this request */
short retries; /* A retry counter */
unsigned long flags; /* flags of this request */
+ struct dasd_queue *dq;
/* ... and how */
unsigned long starttime; /* jiffies time of request start */
@@ -248,6 +250,16 @@ struct dasd_ccw_req {
#define DASD_CQR_SUPPRESS_IL 6 /* Suppress 'Incorrect Length' error */
#define DASD_CQR_SUPPRESS_CR 7 /* Suppress 'Command Reject' error */
+/*
+ * There is no reliable way to determine the number of available CPUs on
+ * LPAR but there is no big performance difference between 1 and the
+ * maximum CPU number.
+ * 64 is a good trade off performance wise.
+ */
+#define DASD_NR_HW_QUEUES 64
+#define DASD_MAX_LCU_DEV 256
+#define DASD_REQ_PER_DEV 4
+
/* Signature for error recovery functions. */
typedef struct dasd_ccw_req *(*dasd_erp_fn_t) (struct dasd_ccw_req *);
@@ -539,6 +551,7 @@ struct dasd_block {
struct gendisk *gdp;
struct request_queue *request_queue;
spinlock_t request_queue_lock;
+ struct blk_mq_tag_set tag_set;
struct block_device *bdev;
atomic_t open_count;
@@ -563,6 +576,10 @@ struct dasd_attention_data {
__u8 lpum;
};
+struct dasd_queue {
+ spinlock_t lock;
+};
+
/* reasons why device (ccw_device_start) was stopped */
#define DASD_STOPPED_NOT_ACC 1 /* not accessible */
#define DASD_STOPPED_QUIESCE 2 /* Quiesced */
@@ -731,7 +748,7 @@ void dasd_free_device(struct dasd_device *);
struct dasd_block *dasd_alloc_block(void);
void dasd_free_block(struct dasd_block *);
-enum blk_eh_timer_return dasd_times_out(struct request *req);
+enum blk_eh_timer_return dasd_times_out(struct request *req, bool reserved);
void dasd_enable_device(struct dasd_device *);
void dasd_set_target_state(struct dasd_device *, int);
diff --git a/drivers/s390/block/scm_blk.c b/drivers/s390/block/scm_blk.c
index 2e7fd966c515..eb51893c74a4 100644
--- a/drivers/s390/block/scm_blk.c
+++ b/drivers/s390/block/scm_blk.c
@@ -249,7 +249,7 @@ static void scm_request_requeue(struct scm_request *scmrq)
static void scm_request_finish(struct scm_request *scmrq)
{
struct scm_blk_dev *bdev = scmrq->bdev;
- int *error;
+ blk_status_t *error;
int i;
for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
@@ -415,7 +415,7 @@ void scm_blk_irq(struct scm_device *scmdev, void *data, blk_status_t error)
static void scm_blk_request_done(struct request *req)
{
- int *error = blk_mq_rq_to_pdu(req);
+ blk_status_t *error = blk_mq_rq_to_pdu(req);
blk_mq_end_request(req, *error);
}
@@ -450,7 +450,7 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
atomic_set(&bdev->queued_reqs, 0);
bdev->tag_set.ops = &scm_mq_ops;
- bdev->tag_set.cmd_size = sizeof(int);
+ bdev->tag_set.cmd_size = sizeof(blk_status_t);
bdev->tag_set.nr_hw_queues = nr_requests;
bdev->tag_set.queue_depth = nr_requests_per_io * nr_requests;
bdev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 489b583f263d..e5c32f4b5287 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -1225,10 +1225,16 @@ static int device_is_disconnected(struct ccw_device *cdev)
static int recovery_check(struct device *dev, void *data)
{
struct ccw_device *cdev = to_ccwdev(dev);
+ struct subchannel *sch;
int *redo = data;
spin_lock_irq(cdev->ccwlock);
switch (cdev->private->state) {
+ case DEV_STATE_ONLINE:
+ sch = to_subchannel(cdev->dev.parent);
+ if ((sch->schib.pmcw.pam & sch->opm) == sch->vpm)
+ break;
+ /* fall through */
case DEV_STATE_DISCONNECTED:
CIO_MSG_EVENT(3, "recovery: trigger 0.%x.%04x\n",
cdev->private->dev_id.ssid,
@@ -1260,7 +1266,7 @@ static void recovery_work_func(struct work_struct *unused)
}
spin_unlock_irq(&recovery_lock);
} else
- CIO_MSG_EVENT(4, "recovery: end\n");
+ CIO_MSG_EVENT(3, "recovery: end\n");
}
static DECLARE_WORK(recovery_work, recovery_work_func);
@@ -1274,11 +1280,11 @@ static void recovery_func(unsigned long data)
schedule_work(&recovery_work);
}
-static void ccw_device_schedule_recovery(void)
+void ccw_device_schedule_recovery(void)
{
unsigned long flags;
- CIO_MSG_EVENT(4, "recovery: schedule\n");
+ CIO_MSG_EVENT(3, "recovery: schedule\n");
spin_lock_irqsave(&recovery_lock, flags);
if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) {
recovery_phase = 0;
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h
index ec497af99dd8..69cb70f080a5 100644
--- a/drivers/s390/cio/device.h
+++ b/drivers/s390/cio/device.h
@@ -134,6 +134,7 @@ void ccw_device_set_disconnected(struct ccw_device *cdev);
void ccw_device_set_notoper(struct ccw_device *cdev);
void ccw_device_set_timeout(struct ccw_device *, int);
+void ccw_device_schedule_recovery(void);
/* Channel measurement facility related */
void retry_set_schib(struct ccw_device *cdev);
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index 12016e32e519..f98ea674c3d8 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -476,6 +476,17 @@ static void create_fake_irb(struct irb *irb, int type)
}
}
+static void ccw_device_handle_broken_paths(struct ccw_device *cdev)
+{
+ struct subchannel *sch = to_subchannel(cdev->dev.parent);
+ u8 broken_paths = (sch->schib.pmcw.pam & sch->opm) ^ sch->vpm;
+
+ if (broken_paths && (cdev->private->path_broken_mask != broken_paths))
+ ccw_device_schedule_recovery();
+
+ cdev->private->path_broken_mask = broken_paths;
+}
+
void ccw_device_verify_done(struct ccw_device *cdev, int err)
{
struct subchannel *sch;
@@ -508,6 +519,7 @@ callback:
memset(&cdev->private->irb, 0, sizeof(struct irb));
}
ccw_device_report_path_events(cdev);
+ ccw_device_handle_broken_paths(cdev);
break;
case -ETIME:
case -EUSERS:
diff --git a/drivers/s390/cio/io_sch.h b/drivers/s390/cio/io_sch.h
index 220f49145b2f..9a1b56b2df3e 100644
--- a/drivers/s390/cio/io_sch.h
+++ b/drivers/s390/cio/io_sch.h
@@ -131,6 +131,8 @@ struct ccw_device_private {
not operable */
u8 path_gone_mask; /* mask of paths, that became unavailable */
u8 path_new_mask; /* mask of paths, that became available */
+ u8 path_broken_mask; /* mask of paths, which were found to be
+ unusable */
struct {
unsigned int fast:1; /* post with "channel end" */
unsigned int repall:1; /* report every interrupt status */
diff --git a/drivers/s390/crypto/ap_asm.h b/drivers/s390/crypto/ap_asm.h
index 287b4ad0999e..cd350345b3d2 100644
--- a/drivers/s390/crypto/ap_asm.h
+++ b/drivers/s390/crypto/ap_asm.h
@@ -69,16 +69,19 @@ static inline struct ap_queue_status ap_rapq(ap_qid_t qid)
}
/**
- * ap_aqic(): Enable interruption for a specific AP.
+ * ap_aqic(): Control interruption for a specific AP.
* @qid: The AP queue number
+ * @qirqctrl: struct ap_qirq_ctrl (64 bit value)
* @ind: The notification indicator byte
*
* Returns AP queue status.
*/
-static inline struct ap_queue_status ap_aqic(ap_qid_t qid, void *ind)
+static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
+ struct ap_qirq_ctrl qirqctrl,
+ void *ind)
{
register unsigned long reg0 asm ("0") = qid | (3UL << 24);
- register unsigned long reg1_in asm ("1") = (8UL << 44) | AP_ISC;
+ register struct ap_qirq_ctrl reg1_in asm ("1") = qirqctrl;
register struct ap_queue_status reg1_out asm ("1");
register void *reg2 asm ("2") = ind;
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index 6dee598979e7..5f0be2040272 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -166,26 +166,51 @@ static int ap_configuration_available(void)
}
/**
+ * ap_apft_available(): Test if AP facilities test (APFT)
+ * facility is available.
+ *
+ * Returns 1 if APFT is is available.
+ */
+static int ap_apft_available(void)
+{
+ return test_facility(15);
+}
+
+/**
* ap_test_queue(): Test adjunct processor queue.
* @qid: The AP queue number
+ * @tbit: Test facilities bit
* @info: Pointer to queue descriptor
*
* Returns AP queue status structure.
*/
-static inline struct ap_queue_status
-ap_test_queue(ap_qid_t qid, unsigned long *info)
+struct ap_queue_status ap_test_queue(ap_qid_t qid,
+ int tbit,
+ unsigned long *info)
{
- if (test_facility(15))
- qid |= 1UL << 23; /* set APFT T bit*/
+ if (tbit)
+ qid |= 1UL << 23; /* set T bit*/
return ap_tapq(qid, info);
}
+EXPORT_SYMBOL(ap_test_queue);
-static inline int ap_query_configuration(void)
+/*
+ * ap_query_configuration(): Fetch cryptographic config info
+ *
+ * Returns the ap configuration info fetched via PQAP(QCI).
+ * On success 0 is returned, on failure a negative errno
+ * is returned, e.g. if the PQAP(QCI) instruction is not
+ * available, the return value will be -EOPNOTSUPP.
+ */
+int ap_query_configuration(struct ap_config_info *info)
{
- if (!ap_configuration)
+ if (!ap_configuration_available())
return -EOPNOTSUPP;
- return ap_qci(ap_configuration);
+ if (!info)
+ return -EINVAL;
+ return ap_qci(info);
}
+EXPORT_SYMBOL(ap_query_configuration);
/**
* ap_init_configuration(): Allocate and query configuration array.
@@ -198,7 +223,7 @@ static void ap_init_configuration(void)
ap_configuration = kzalloc(sizeof(*ap_configuration), GFP_KERNEL);
if (!ap_configuration)
return;
- if (ap_query_configuration() != 0) {
+ if (ap_query_configuration(ap_configuration) != 0) {
kfree(ap_configuration);
ap_configuration = NULL;
return;
@@ -261,7 +286,7 @@ static int ap_query_queue(ap_qid_t qid, int *queue_depth, int *device_type,
if (!ap_test_config_card_id(AP_QID_CARD(qid)))
return -ENODEV;
- status = ap_test_queue(qid, &info);
+ status = ap_test_queue(qid, ap_apft_available(), &info);
switch (status.response_code) {
case AP_RESPONSE_NORMAL:
*queue_depth = (int)(info & 0xff);
@@ -940,7 +965,9 @@ static int ap_select_domain(void)
for (j = 0; j < AP_DEVICES; j++) {
if (!ap_test_config_card_id(j))
continue;
- status = ap_test_queue(AP_MKQID(j, i), NULL);
+ status = ap_test_queue(AP_MKQID(j, i),
+ ap_apft_available(),
+ NULL);
if (status.response_code != AP_RESPONSE_NORMAL)
continue;
count++;
@@ -993,7 +1020,7 @@ static void ap_scan_bus(struct work_struct *unused)
AP_DBF(DBF_DEBUG, "ap_scan_bus running\n");
- ap_query_configuration();
+ ap_query_configuration(ap_configuration);
if (ap_select_domain() != 0)
goto out;
diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h
index 4dc7c88fb054..754cf2223cfb 100644
--- a/drivers/s390/crypto/ap_bus.h
+++ b/drivers/s390/crypto/ap_bus.h
@@ -28,6 +28,7 @@
#include <linux/device.h>
#include <linux/types.h>
+#include <asm/ap.h>
#define AP_DEVICES 64 /* Number of AP devices. */
#define AP_DOMAINS 256 /* Number of AP domains. */
@@ -40,41 +41,6 @@ extern int ap_domain_index;
extern spinlock_t ap_list_lock;
extern struct list_head ap_card_list;
-/**
- * The ap_qid_t identifier of an ap queue. It contains a
- * 6 bit card index and a 4 bit queue index (domain).
- */
-typedef unsigned int ap_qid_t;
-
-#define AP_MKQID(_card, _queue) (((_card) & 63) << 8 | ((_queue) & 255))
-#define AP_QID_CARD(_qid) (((_qid) >> 8) & 63)
-#define AP_QID_QUEUE(_qid) ((_qid) & 255)
-
-/**
- * structy ap_queue_status - Holds the AP queue status.
- * @queue_empty: Shows if queue is empty
- * @replies_waiting: Waiting replies
- * @queue_full: Is 1 if the queue is full
- * @pad: A 4 bit pad
- * @int_enabled: Shows if interrupts are enabled for the AP
- * @response_code: Holds the 8 bit response code
- * @pad2: A 16 bit pad
- *
- * The ap queue status word is returned by all three AP functions
- * (PQAP, NQAP and DQAP). There's a set of flags in the first
- * byte, followed by a 1 byte response code.
- */
-struct ap_queue_status {
- unsigned int queue_empty : 1;
- unsigned int replies_waiting : 1;
- unsigned int queue_full : 1;
- unsigned int pad1 : 4;
- unsigned int int_enabled : 1;
- unsigned int response_code : 8;
- unsigned int pad2 : 16;
-} __packed;
-
-
static inline int ap_test_bit(unsigned int *ptr, unsigned int nr)
{
return (*ptr & (0x80000000u >> nr)) != 0;
@@ -238,17 +204,6 @@ struct ap_message {
struct ap_message *);
};
-struct ap_config_info {
- unsigned int special_command:1;
- unsigned int ap_extended:1;
- unsigned char reserved1:6;
- unsigned char reserved2[15];
- unsigned int apm[8]; /* AP ID mask */
- unsigned int aqm[8]; /* AP queue mask */
- unsigned int adm[8]; /* AP domain mask */
- unsigned char reserved4[16];
-} __packed;
-
/**
* ap_init_message() - Initialize ap_message.
* Initialize a message before using. Otherwise this might result in
diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c
index 0f1a5d02acb0..56b96edffd5b 100644
--- a/drivers/s390/crypto/ap_queue.c
+++ b/drivers/s390/crypto/ap_queue.c
@@ -16,6 +16,25 @@
#include "ap_asm.h"
/**
+ * ap_queue_irq_ctrl(): Control interruption on a AP queue.
+ * @qirqctrl: struct ap_qirq_ctrl (64 bit value)
+ * @ind: The notification indicator byte
+ *
+ * Returns AP queue status.
+ *
+ * Control interruption on the given AP queue.
+ * Just a simple wrapper function for the low level PQAP(AQIC)
+ * instruction available for other kernel modules.
+ */
+struct ap_queue_status ap_queue_irq_ctrl(ap_qid_t qid,
+ struct ap_qirq_ctrl qirqctrl,
+ void *ind)
+{
+ return ap_aqic(qid, qirqctrl, ind);
+}
+EXPORT_SYMBOL(ap_queue_irq_ctrl);
+
+/**
* ap_queue_enable_interruption(): Enable interruption on an AP queue.
* @qid: The AP queue number
* @ind: the notification indicator byte
@@ -27,8 +46,11 @@
static int ap_queue_enable_interruption(struct ap_queue *aq, void *ind)
{
struct ap_queue_status status;
+ struct ap_qirq_ctrl qirqctrl = { 0 };
- status = ap_aqic(aq->qid, ind);
+ qirqctrl.ir = 1;
+ qirqctrl.isc = AP_ISC;
+ status = ap_aqic(aq->qid, qirqctrl, ind);
switch (status.response_code) {
case AP_RESPONSE_NORMAL:
case AP_RESPONSE_OTHERWISE_CHANGED:
@@ -362,7 +384,7 @@ static enum ap_wait ap_sm_setirq_wait(struct ap_queue *aq)
/* Get the status with TAPQ */
status = ap_tapq(aq->qid, NULL);
- if (status.int_enabled == 1) {
+ if (status.irq_enabled == 1) {
/* Irqs are now enabled */
aq->interrupt = AP_INTR_ENABLED;
aq->state = (aq->queue_count > 0) ?
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index d145e0d90227..41366339b950 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -283,7 +283,7 @@ config SCSI_ISCSI_ATTRS
config SCSI_SAS_ATTRS
tristate "SAS Transport Attributes"
depends on SCSI
- select BLK_DEV_BSG
+ select BLK_DEV_BSGLIB
help
If you wish to export transport-specific information about
each attached SAS device to sysfs, say Y.
diff --git a/drivers/scsi/NCR_Q720.c b/drivers/scsi/NCR_Q720.c
index 05835bf1bf9c..54e7d26908ee 100644
--- a/drivers/scsi/NCR_Q720.c
+++ b/drivers/scsi/NCR_Q720.c
@@ -217,8 +217,7 @@ NCR_Q720_probe(struct device *dev)
}
if (dma_declare_coherent_memory(dev, base_addr, base_addr,
- mem_size, DMA_MEMORY_MAP)
- != DMA_MEMORY_MAP) {
+ mem_size, 0)) {
printk(KERN_ERR "NCR_Q720: DMA declare memory failed\n");
goto out_release_region;
}
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index a64285ab0728..af3e4d3f9735 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -699,13 +699,13 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
int status;
dresp = (struct aac_mount *) fib_data(fibptr);
- if (!(fibptr->dev->supplement_adapter_info.supported_options2 &
- AAC_OPTION_VARIABLE_BLOCK_SIZE))
+ if (!aac_supports_2T(fibptr->dev)) {
dresp->mnt[0].capacityhigh = 0;
- if ((le32_to_cpu(dresp->status) != ST_OK) ||
- (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
- _aac_probe_container2(context, fibptr);
- return;
+ if ((le32_to_cpu(dresp->status) == ST_OK) &&
+ (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
+ _aac_probe_container2(context, fibptr);
+ return;
+ }
}
scsicmd = (struct scsi_cmnd *) context;
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 92fabf2b0c24..403a639574e5 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -2701,6 +2701,11 @@ static inline int aac_is_src(struct aac_dev *dev)
return 0;
}
+static inline int aac_supports_2T(struct aac_dev *dev)
+{
+ return (dev->adapter_info.options & AAC_OPT_NEW_COMM_64);
+}
+
char * get_container_type(unsigned type);
extern int numacb;
extern char aac_driver_version[];
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 87cc4a93e637..62beb2596466 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -906,12 +906,14 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
- info = &aac->hba_map[bus][cid];
- if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
- info->devtype != AAC_DEVTYPE_NATIVE_RAW)
+
+ if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
return FAILED;
- if (info->reset_state > 0)
+ info = &aac->hba_map[bus][cid];
+
+ if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
+ info->reset_state > 0)
return FAILED;
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
@@ -962,12 +964,14 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
- info = &aac->hba_map[bus][cid];
- if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
- info->devtype != AAC_DEVTYPE_NATIVE_RAW)
+
+ if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
return FAILED;
- if (info->reset_state > 0)
+ info = &aac->hba_map[bus][cid];
+
+ if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
+ info->reset_state > 0)
return FAILED;
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 48c2b2b34b72..0c9361c87ec8 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -740,6 +740,8 @@ static void aac_send_iop_reset(struct aac_dev *dev)
aac_set_intx_mode(dev);
src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
+
+ msleep(5000);
}
static void aac_send_hardware_soft_reset(struct aac_dev *dev)
diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c
index 690816f3c6af..421fe869a11e 100644
--- a/drivers/scsi/arm/acornscsi.c
+++ b/drivers/scsi/arm/acornscsi.c
@@ -2725,9 +2725,9 @@ int acornscsi_abort(struct scsi_cmnd *SCpnt)
* Params : SCpnt - command causing reset
* Returns : one of SCSI_RESET_ macros
*/
-int acornscsi_host_reset(struct Scsi_Host *shpnt)
+int acornscsi_host_reset(struct scsi_cmnd *SCpnt)
{
- AS_Host *host = (AS_Host *)shpnt->hostdata;
+ AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata;
struct scsi_cmnd *SCptr;
host->stats.resets += 1;
@@ -2741,7 +2741,7 @@ int acornscsi_host_reset(struct Scsi_Host *shpnt)
printk(KERN_WARNING "acornscsi_reset: ");
print_sbic_status(asr, ssr, host->scsi.phase);
- for (devidx = 0; devidx < 9; devidx ++) {
+ for (devidx = 0; devidx < 9; devidx++)
acornscsi_dumplog(host, devidx);
}
#endif
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 831a1c8b9f89..fe3a0da3ec97 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -315,8 +315,6 @@ static void scsi_host_dev_release(struct device *dev)
{
struct Scsi_Host *shost = dev_to_shost(dev);
struct device *parent = dev->parent;
- struct request_queue *q;
- void *queuedata;
scsi_proc_hostdir_rm(shost->hostt);
@@ -326,12 +324,6 @@ static void scsi_host_dev_release(struct device *dev)
kthread_stop(shost->ehandler);
if (shost->work_q)
destroy_workqueue(shost->work_q);
- q = shost->uspace_req_q;
- if (q) {
- queuedata = q->queuedata;
- blk_cleanup_queue(q);
- kfree(queuedata);
- }
if (shost->shost_state == SHOST_CREATED) {
/*
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 7e7ae786121b..100bc4c8798d 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -6131,6 +6131,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
"Extents and RPI headers enabled.\n");
}
mempool_free(mboxq, phba->mbox_mem_pool);
+ rc = -EIO;
goto out_free_bsmbx;
}
diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c
index 79ba3ce063a4..23bdb1ca106e 100644
--- a/drivers/scsi/lpfc/lpfc_nvme.c
+++ b/drivers/scsi/lpfc/lpfc_nvme.c
@@ -884,7 +884,7 @@ out_err:
wcqe->total_data_placed);
nCmd->transferred_length = 0;
nCmd->rcv_rsplen = 0;
- nCmd->status = NVME_SC_FC_TRANSPORT_ERROR;
+ nCmd->status = NVME_SC_INTERNAL;
}
}
diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 1f59e7a74c7b..6b33a1f24f56 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -180,7 +180,7 @@ static void qla_nvme_sp_done(void *ptr, int res)
goto rel;
if (unlikely(res == QLA_FUNCTION_FAILED))
- fd->status = NVME_SC_FC_TRANSPORT_ERROR;
+ fd->status = NVME_SC_INTERNAL;
else
fd->status = 0;
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 38942050b265..dab876c65473 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -580,7 +580,8 @@ int scsi_check_sense(struct scsi_cmnd *scmd)
if (sshdr.asc == 0x20 || /* Invalid command operation code */
sshdr.asc == 0x21 || /* Logical block address out of range */
sshdr.asc == 0x24 || /* Invalid field in cdb */
- sshdr.asc == 0x26) { /* Parameter value invalid */
+ sshdr.asc == 0x26 || /* Parameter value invalid */
+ sshdr.asc == 0x27) { /* Write protected */
set_host_byte(scmd, DID_TARGET_FAILURE);
}
return SUCCESS;
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 3c6bc0081fcb..cbd4495d0ff9 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -2739,7 +2739,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
list_for_each_entry(rport, &fc_host->rports, peers) {
- if ((rport->port_state == FC_PORTSTATE_BLOCKED) &&
+ if ((rport->port_state == FC_PORTSTATE_BLOCKED ||
+ rport->port_state == FC_PORTSTATE_NOTPRESENT) &&
(rport->channel == channel)) {
switch (fc_host->tgtid_bind_type) {
@@ -2876,7 +2877,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
memcpy(&rport->port_name, &ids->port_name,
sizeof(rport->port_name));
rport->port_id = ids->port_id;
- rport->roles = ids->roles;
rport->port_state = FC_PORTSTATE_ONLINE;
rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
@@ -2885,15 +2885,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
fci->f->dd_fcrport_size);
spin_unlock_irqrestore(shost->host_lock, flags);
- if (ids->roles & FC_PORT_ROLE_FCP_TARGET) {
- scsi_target_unblock(&rport->dev, SDEV_RUNNING);
-
- /* initiate a scan of the target */
- spin_lock_irqsave(shost->host_lock, flags);
- rport->flags |= FC_RPORT_SCAN_PENDING;
- scsi_queue_work(shost, &rport->scan_work);
- spin_unlock_irqrestore(shost->host_lock, flags);
- }
+ fc_remote_port_rolechg(rport, ids->roles);
return rport;
}
}
@@ -3571,7 +3563,7 @@ fc_vport_sched_delete(struct work_struct *work)
static enum blk_eh_timer_return
fc_bsg_job_timeout(struct request *req)
{
- struct bsg_job *job = (void *) req->special;
+ struct bsg_job *job = blk_mq_rq_to_pdu(req);
struct Scsi_Host *shost = fc_bsg_to_shost(job);
struct fc_rport *rport = fc_bsg_to_rport(job);
struct fc_internal *i = to_fc_internal(shost->transportt);
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 8934f19bce8e..0190aeff5f7f 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -3689,7 +3689,7 @@ iscsi_if_rx(struct sk_buff *skb)
uint32_t group;
nlh = nlmsg_hdr(skb);
- if (nlh->nlmsg_len < sizeof(*nlh) ||
+ if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) ||
skb->len < nlh->nlmsg_len) {
break;
}
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 11c1738c2100..fb9f8b5f4673 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -2915,8 +2915,6 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
sd_config_discard(sdkp, SD_LBP_WS16);
else if (sdkp->lbpws10)
sd_config_discard(sdkp, SD_LBP_WS10);
- else if (sdkp->lbpu && sdkp->max_unmap_blocks)
- sd_config_discard(sdkp, SD_LBP_UNMAP);
else
sd_config_discard(sdkp, SD_LBP_DISABLE);
}
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index cf0e71db9e51..0419c2298eab 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -828,6 +828,39 @@ static int max_sectors_bytes(struct request_queue *q)
return max_sectors << 9;
}
+static void
+sg_fill_request_table(Sg_fd *sfp, sg_req_info_t *rinfo)
+{
+ Sg_request *srp;
+ int val;
+ unsigned int ms;
+
+ val = 0;
+ list_for_each_entry(srp, &sfp->rq_list, entry) {
+ if (val > SG_MAX_QUEUE)
+ break;
+ rinfo[val].req_state = srp->done + 1;
+ rinfo[val].problem =
+ srp->header.masked_status &
+ srp->header.host_status &
+ srp->header.driver_status;
+ if (srp->done)
+ rinfo[val].duration =
+ srp->header.duration;
+ else {
+ ms = jiffies_to_msecs(jiffies);
+ rinfo[val].duration =
+ (ms > srp->header.duration) ?
+ (ms - srp->header.duration) : 0;
+ }
+ rinfo[val].orphan = srp->orphan;
+ rinfo[val].sg_io_owned = srp->sg_io_owned;
+ rinfo[val].pack_id = srp->header.pack_id;
+ rinfo[val].usr_ptr = srp->header.usr_ptr;
+ val++;
+ }
+}
+
static long
sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
{
@@ -1012,38 +1045,13 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
return -EFAULT;
else {
sg_req_info_t *rinfo;
- unsigned int ms;
- rinfo = kmalloc(SZ_SG_REQ_INFO * SG_MAX_QUEUE,
- GFP_KERNEL);
+ rinfo = kzalloc(SZ_SG_REQ_INFO * SG_MAX_QUEUE,
+ GFP_KERNEL);
if (!rinfo)
return -ENOMEM;
read_lock_irqsave(&sfp->rq_list_lock, iflags);
- val = 0;
- list_for_each_entry(srp, &sfp->rq_list, entry) {
- if (val >= SG_MAX_QUEUE)
- break;
- memset(&rinfo[val], 0, SZ_SG_REQ_INFO);
- rinfo[val].req_state = srp->done + 1;
- rinfo[val].problem =
- srp->header.masked_status &
- srp->header.host_status &
- srp->header.driver_status;
- if (srp->done)
- rinfo[val].duration =
- srp->header.duration;
- else {
- ms = jiffies_to_msecs(jiffies);
- rinfo[val].duration =
- (ms > srp->header.duration) ?
- (ms - srp->header.duration) : 0;
- }
- rinfo[val].orphan = srp->orphan;
- rinfo[val].sg_io_owned = srp->sg_io_owned;
- rinfo[val].pack_id = srp->header.pack_id;
- rinfo[val].usr_ptr = srp->header.usr_ptr;
- val++;
- }
+ sg_fill_request_table(sfp, rinfo);
read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
result = __copy_to_user(p, rinfo,
SZ_SG_REQ_INFO * SG_MAX_QUEUE);
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 07fc0ac51c52..fc9e98047421 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,6 +1,7 @@
menu "SOC (System On Chip) specific Drivers"
source "drivers/soc/actions/Kconfig"
+source "drivers/soc/amlogic/Kconfig"
source "drivers/soc/atmel/Kconfig"
source "drivers/soc/bcm/Kconfig"
source "drivers/soc/fsl/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 9241125416ba..2fcaff864584 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -9,7 +9,9 @@ obj-$(CONFIG_ARCH_DOVE) += dove/
obj-$(CONFIG_MACH_DOVE) += dove/
obj-y += fsl/
obj-$(CONFIG_ARCH_MXC) += imx/
+obj-$(CONFIG_SOC_XWAY) += lantiq/
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
+obj-$(CONFIG_ARCH_MESON) += amlogic/
obj-$(CONFIG_ARCH_QCOM) += qcom/
obj-y += renesas/
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
diff --git a/drivers/soc/amlogic/Kconfig b/drivers/soc/amlogic/Kconfig
new file mode 100644
index 000000000000..22acf064531f
--- /dev/null
+++ b/drivers/soc/amlogic/Kconfig
@@ -0,0 +1,12 @@
+menu "Amlogic SoC drivers"
+
+config MESON_GX_SOCINFO
+ bool "Amlogic Meson GX SoC Information driver"
+ depends on ARCH_MESON || COMPILE_TEST
+ default ARCH_MESON
+ select SOC_BUS
+ help
+ Say yes to support decoding of Amlogic Meson GX SoC family
+ information about the type, package and version.
+
+endmenu
diff --git a/drivers/soc/amlogic/Makefile b/drivers/soc/amlogic/Makefile
new file mode 100644
index 000000000000..3e85fc462c21
--- /dev/null
+++ b/drivers/soc/amlogic/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
diff --git a/drivers/soc/amlogic/meson-gx-socinfo.c b/drivers/soc/amlogic/meson-gx-socinfo.c
new file mode 100644
index 000000000000..89f4cf507be6
--- /dev/null
+++ b/drivers/soc/amlogic/meson-gx-socinfo.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/bitfield.h>
+#include <linux/regmap.h>
+#include <linux/mfd/syscon.h>
+
+#define AO_SEC_SD_CFG8 0xe0
+#define AO_SEC_SOCINFO_OFFSET AO_SEC_SD_CFG8
+
+#define SOCINFO_MAJOR GENMASK(31, 24)
+#define SOCINFO_MINOR GENMASK(23, 16)
+#define SOCINFO_PACK GENMASK(15, 8)
+#define SOCINFO_MISC GENMASK(7, 0)
+
+static const struct meson_gx_soc_id {
+ const char *name;
+ unsigned int id;
+} soc_ids[] = {
+ { "GXBB", 0x1f },
+ { "GXTVBB", 0x20 },
+ { "GXL", 0x21 },
+ { "GXM", 0x22 },
+ { "TXL", 0x23 },
+};
+
+static const struct meson_gx_package_id {
+ const char *name;
+ unsigned int major_id;
+ unsigned int pack_id;
+} soc_packages[] = {
+ { "S905", 0x1f, 0 },
+ { "S905M", 0x1f, 0x20 },
+ { "S905D", 0x21, 0 },
+ { "S905X", 0x21, 0x80 },
+ { "S905L", 0x21, 0xc0 },
+ { "S905M2", 0x21, 0xe0 },
+ { "S912", 0x22, 0 },
+};
+
+static inline unsigned int socinfo_to_major(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MAJOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_minor(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MINOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_pack(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_PACK, socinfo);
+}
+
+static inline unsigned int socinfo_to_misc(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MISC, socinfo);
+}
+
+static const char *socinfo_to_package_id(u32 socinfo)
+{
+ unsigned int pack = socinfo_to_pack(socinfo) & 0xf0;
+ unsigned int major = socinfo_to_major(socinfo);
+ int i;
+
+ for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) {
+ if (soc_packages[i].major_id == major &&
+ soc_packages[i].pack_id == pack)
+ return soc_packages[i].name;
+ }
+
+ return "Unknown";
+}
+
+static const char *socinfo_to_soc_id(u32 socinfo)
+{
+ unsigned int id = socinfo_to_major(socinfo);
+ int i;
+
+ for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) {
+ if (soc_ids[i].id == id)
+ return soc_ids[i].name;
+ }
+
+ return "Unknown";
+}
+
+int __init meson_gx_socinfo_init(void)
+{
+ struct soc_device_attribute *soc_dev_attr;
+ struct soc_device *soc_dev;
+ struct device_node *np;
+ struct regmap *regmap;
+ unsigned int socinfo;
+ struct device *dev;
+ int ret;
+
+ /* look up for chipid node */
+ np = of_find_compatible_node(NULL, NULL, "amlogic,meson-gx-ao-secure");
+ if (!np)
+ return -ENODEV;
+
+ /* check if interface is enabled */
+ if (!of_device_is_available(np))
+ return -ENODEV;
+
+ /* check if chip-id is available */
+ if (!of_property_read_bool(np, "amlogic,has-chip-id"))
+ return -ENODEV;
+
+ /* node should be a syscon */
+ regmap = syscon_node_to_regmap(np);
+ of_node_put(np);
+ if (IS_ERR(regmap)) {
+ pr_err("%s: failed to get regmap\n", __func__);
+ return -ENODEV;
+ }
+
+ ret = regmap_read(regmap, AO_SEC_SOCINFO_OFFSET, &socinfo);
+ if (ret < 0)
+ return ret;
+
+ if (!socinfo) {
+ pr_err("%s: invalid chipid value\n", __func__);
+ return -EINVAL;
+ }
+
+ soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+ if (!soc_dev_attr)
+ return -ENODEV;
+
+ soc_dev_attr->family = "Amlogic Meson";
+
+ np = of_find_node_by_path("/");
+ of_property_read_string(np, "model", &soc_dev_attr->machine);
+ of_node_put(np);
+
+ soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%x:%x - %x:%x",
+ socinfo_to_major(socinfo),
+ socinfo_to_minor(socinfo),
+ socinfo_to_pack(socinfo),
+ socinfo_to_misc(socinfo));
+ soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%s (%s)",
+ socinfo_to_soc_id(socinfo),
+ socinfo_to_package_id(socinfo));
+
+ soc_dev = soc_device_register(soc_dev_attr);
+ if (IS_ERR(soc_dev)) {
+ kfree(soc_dev_attr->revision);
+ kfree_const(soc_dev_attr->soc_id);
+ kfree(soc_dev_attr);
+ return PTR_ERR(soc_dev);
+ }
+ dev = soc_device_to_device(soc_dev);
+
+ dev_info(dev, "Amlogic Meson %s Revision %x:%x (%x:%x) Detected\n",
+ soc_dev_attr->soc_id,
+ socinfo_to_major(socinfo),
+ socinfo_to_minor(socinfo),
+ socinfo_to_pack(socinfo),
+ socinfo_to_misc(socinfo));
+
+ return 0;
+}
+device_initcall(meson_gx_socinfo_init);
diff --git a/drivers/soc/fsl/qbman/bman_ccsr.c b/drivers/soc/fsl/qbman/bman_ccsr.c
index a8e8389a6894..eaa9585c7347 100644
--- a/drivers/soc/fsl/qbman/bman_ccsr.c
+++ b/drivers/soc/fsl/qbman/bman_ccsr.c
@@ -177,8 +177,8 @@ static int fsl_bman_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
- dev_err(dev, "Can't get %s property 'IORESOURCE_MEM'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'IORESOURCE_MEM'\n",
+ node);
return -ENXIO;
}
bm_ccsr_start = devm_ioremap(dev, res->start, resource_size(res));
@@ -205,14 +205,14 @@ static int fsl_bman_probe(struct platform_device *pdev)
err_irq = platform_get_irq(pdev, 0);
if (err_irq <= 0) {
- dev_info(dev, "Can't get %s IRQ\n", node->full_name);
+ dev_info(dev, "Can't get %pOF IRQ\n", node);
return -ENODEV;
}
ret = devm_request_irq(dev, err_irq, bman_isr, IRQF_SHARED, "bman-err",
dev);
if (ret) {
- dev_err(dev, "devm_request_irq() failed %d for '%s'\n",
- ret, node->full_name);
+ dev_err(dev, "devm_request_irq() failed %d for '%pOF'\n",
+ ret, node);
return ret;
}
/* Disable Buffer Pool State Change */
diff --git a/drivers/soc/fsl/qbman/bman_portal.c b/drivers/soc/fsl/qbman/bman_portal.c
index 8354d4dabdad..39b39c8f1399 100644
--- a/drivers/soc/fsl/qbman/bman_portal.c
+++ b/drivers/soc/fsl/qbman/bman_portal.c
@@ -103,16 +103,14 @@ static int bman_portal_probe(struct platform_device *pdev)
addr_phys[0] = platform_get_resource(pdev, IORESOURCE_MEM,
DPAA_PORTAL_CE);
if (!addr_phys[0]) {
- dev_err(dev, "Can't get %s property 'reg::CE'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node);
return -ENXIO;
}
addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM,
DPAA_PORTAL_CI);
if (!addr_phys[1]) {
- dev_err(dev, "Can't get %s property 'reg::CI'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node);
return -ENXIO;
}
@@ -120,7 +118,7 @@ static int bman_portal_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq <= 0) {
- dev_err(dev, "Can't get %s IRQ'\n", node->full_name);
+ dev_err(dev, "Can't get %pOF IRQ'\n", node);
return -ENXIO;
}
pcfg->irq = irq;
diff --git a/drivers/soc/fsl/qbman/qman_ccsr.c b/drivers/soc/fsl/qbman/qman_ccsr.c
index 90bc40c48675..835ce947ffca 100644
--- a/drivers/soc/fsl/qbman/qman_ccsr.c
+++ b/drivers/soc/fsl/qbman/qman_ccsr.c
@@ -695,8 +695,8 @@ static int fsl_qman_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
- dev_err(dev, "Can't get %s property 'IORESOURCE_MEM'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'IORESOURCE_MEM'\n",
+ node);
return -ENXIO;
}
qm_ccsr_start = devm_ioremap(dev, res->start, resource_size(res));
@@ -740,15 +740,15 @@ static int fsl_qman_probe(struct platform_device *pdev)
err_irq = platform_get_irq(pdev, 0);
if (err_irq <= 0) {
- dev_info(dev, "Can't get %s property 'interrupts'\n",
- node->full_name);
+ dev_info(dev, "Can't get %pOF property 'interrupts'\n",
+ node);
return -ENODEV;
}
ret = devm_request_irq(dev, err_irq, qman_isr, IRQF_SHARED, "qman-err",
dev);
if (ret) {
- dev_err(dev, "devm_request_irq() failed %d for '%s'\n",
- ret, node->full_name);
+ dev_err(dev, "devm_request_irq() failed %d for '%pOF'\n",
+ ret, node);
return ret;
}
diff --git a/drivers/soc/fsl/qbman/qman_portal.c b/drivers/soc/fsl/qbman/qman_portal.c
index adbaa30d3c5a..cbacdf4f98ed 100644
--- a/drivers/soc/fsl/qbman/qman_portal.c
+++ b/drivers/soc/fsl/qbman/qman_portal.c
@@ -237,30 +237,27 @@ static int qman_portal_probe(struct platform_device *pdev)
addr_phys[0] = platform_get_resource(pdev, IORESOURCE_MEM,
DPAA_PORTAL_CE);
if (!addr_phys[0]) {
- dev_err(dev, "Can't get %s property 'reg::CE'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node);
return -ENXIO;
}
addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM,
DPAA_PORTAL_CI);
if (!addr_phys[1]) {
- dev_err(dev, "Can't get %s property 'reg::CI'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node);
return -ENXIO;
}
err = of_property_read_u32(node, "cell-index", &val);
if (err) {
- dev_err(dev, "Can't get %s property 'cell-index'\n",
- node->full_name);
+ dev_err(dev, "Can't get %pOF property 'cell-index'\n", node);
return err;
}
pcfg->channel = val;
pcfg->cpu = -1;
irq = platform_get_irq(pdev, 0);
if (irq <= 0) {
- dev_err(dev, "Can't get %s IRQ\n", node->full_name);
+ dev_err(dev, "Can't get %pOF IRQ\n", node);
return -ENXIO;
}
pcfg->irq = irq;
diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c
index 0aaf429f31d5..3b27075c21a7 100644
--- a/drivers/soc/fsl/qe/gpio.c
+++ b/drivers/soc/fsl/qe/gpio.c
@@ -304,8 +304,8 @@ static int __init qe_add_gpiochips(void)
goto err;
continue;
err:
- pr_err("%s: registration failed with status %d\n",
- np->full_name, ret);
+ pr_err("%pOF: registration failed with status %d\n",
+ np, ret);
kfree(qe_gc);
/* try others anyway */
}
diff --git a/drivers/soc/lantiq/Makefile b/drivers/soc/lantiq/Makefile
new file mode 100644
index 000000000000..be9e866d53e5
--- /dev/null
+++ b/drivers/soc/lantiq/Makefile
@@ -0,0 +1,2 @@
+obj-y += fpi-bus.o
+obj-$(CONFIG_XRX200_PHY_FW) += gphy.o
diff --git a/drivers/soc/lantiq/fpi-bus.c b/drivers/soc/lantiq/fpi-bus.c
new file mode 100644
index 000000000000..a671c9984c4c
--- /dev/null
+++ b/drivers/soc/lantiq/fpi-bus.c
@@ -0,0 +1,87 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Copyright (C) 2011-2015 John Crispin <[email protected]>
+ * Copyright (C) 2015 Martin Blumenstingl <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/regmap.h>
+
+#include <lantiq_soc.h>
+
+#define XBAR_ALWAYS_LAST 0x430
+#define XBAR_FPI_BURST_EN BIT(1)
+#define XBAR_AHB_BURST_EN BIT(2)
+
+#define RCU_VR9_BE_AHB1S 0x00000008
+
+static int ltq_fpi_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ struct resource *res_xbar;
+ struct regmap *rcu_regmap;
+ void __iomem *xbar_membase;
+ u32 rcu_ahb_endianness_reg_offset;
+ int ret;
+
+ res_xbar = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ xbar_membase = devm_ioremap_resource(dev, res_xbar);
+ if (IS_ERR(xbar_membase))
+ return PTR_ERR(xbar_membase);
+
+ /* RCU configuration is optional */
+ rcu_regmap = syscon_regmap_lookup_by_phandle(np, "lantiq,rcu");
+ if (IS_ERR(rcu_regmap))
+ return PTR_ERR(rcu_regmap);
+
+ ret = device_property_read_u32(dev, "lantiq,offset-endianness",
+ &rcu_ahb_endianness_reg_offset);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to get RCU reg offset\n");
+ return ret;
+ }
+
+ ret = regmap_update_bits(rcu_regmap, rcu_ahb_endianness_reg_offset,
+ RCU_VR9_BE_AHB1S, RCU_VR9_BE_AHB1S);
+ if (ret) {
+ dev_warn(&pdev->dev,
+ "Failed to configure RCU AHB endianness\n");
+ return ret;
+ }
+
+ /* disable fpi burst */
+ ltq_w32_mask(XBAR_FPI_BURST_EN, 0, xbar_membase + XBAR_ALWAYS_LAST);
+
+ return of_platform_populate(dev->of_node, NULL, NULL, dev);
+}
+
+static const struct of_device_id ltq_fpi_match[] = {
+ { .compatible = "lantiq,xrx200-fpi" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, ltq_fpi_match);
+
+static struct platform_driver ltq_fpi_driver = {
+ .probe = ltq_fpi_probe,
+ .driver = {
+ .name = "fpi-xway",
+ .of_match_table = ltq_fpi_match,
+ },
+};
+
+module_platform_driver(ltq_fpi_driver);
+
+MODULE_DESCRIPTION("Lantiq FPI bus driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/soc/lantiq/gphy.c b/drivers/soc/lantiq/gphy.c
new file mode 100644
index 000000000000..8d8659463b3e
--- /dev/null
+++ b/drivers/soc/lantiq/gphy.c
@@ -0,0 +1,260 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Copyright (C) 2012 John Crispin <[email protected]>
+ * Copyright (C) 2016 Martin Blumenstingl <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/firmware.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/reboot.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#include <linux/property.h>
+#include <dt-bindings/mips/lantiq_rcu_gphy.h>
+
+#include <lantiq_soc.h>
+
+#define XRX200_GPHY_FW_ALIGN (16 * 1024)
+
+struct xway_gphy_priv {
+ struct clk *gphy_clk_gate;
+ struct reset_control *gphy_reset;
+ struct reset_control *gphy_reset2;
+ struct notifier_block gphy_reboot_nb;
+ void __iomem *membase;
+ char *fw_name;
+};
+
+struct xway_gphy_match_data {
+ char *fe_firmware_name;
+ char *ge_firmware_name;
+};
+
+static const struct xway_gphy_match_data xrx200a1x_gphy_data = {
+ .fe_firmware_name = "lantiq/xrx200_phy22f_a14.bin",
+ .ge_firmware_name = "lantiq/xrx200_phy11g_a14.bin",
+};
+
+static const struct xway_gphy_match_data xrx200a2x_gphy_data = {
+ .fe_firmware_name = "lantiq/xrx200_phy22f_a22.bin",
+ .ge_firmware_name = "lantiq/xrx200_phy11g_a22.bin",
+};
+
+static const struct xway_gphy_match_data xrx300_gphy_data = {
+ .fe_firmware_name = "lantiq/xrx300_phy22f_a21.bin",
+ .ge_firmware_name = "lantiq/xrx300_phy11g_a21.bin",
+};
+
+static const struct of_device_id xway_gphy_match[] = {
+ { .compatible = "lantiq,xrx200a1x-gphy", .data = &xrx200a1x_gphy_data },
+ { .compatible = "lantiq,xrx200a2x-gphy", .data = &xrx200a2x_gphy_data },
+ { .compatible = "lantiq,xrx300-gphy", .data = &xrx300_gphy_data },
+ { .compatible = "lantiq,xrx330-gphy", .data = &xrx300_gphy_data },
+ {},
+};
+MODULE_DEVICE_TABLE(of, xway_gphy_match);
+
+static struct xway_gphy_priv *to_xway_gphy_priv(struct notifier_block *nb)
+{
+ return container_of(nb, struct xway_gphy_priv, gphy_reboot_nb);
+}
+
+static int xway_gphy_reboot_notify(struct notifier_block *reboot_nb,
+ unsigned long code, void *unused)
+{
+ struct xway_gphy_priv *priv = to_xway_gphy_priv(reboot_nb);
+
+ if (priv) {
+ reset_control_assert(priv->gphy_reset);
+ reset_control_assert(priv->gphy_reset2);
+ }
+
+ return NOTIFY_DONE;
+}
+
+static int xway_gphy_load(struct device *dev, struct xway_gphy_priv *priv,
+ dma_addr_t *dev_addr)
+{
+ const struct firmware *fw;
+ void *fw_addr;
+ dma_addr_t dma_addr;
+ size_t size;
+ int ret;
+
+ ret = request_firmware(&fw, priv->fw_name, dev);
+ if (ret) {
+ dev_err(dev, "failed to load firmware: %s, error: %i\n",
+ priv->fw_name, ret);
+ return ret;
+ }
+
+ /*
+ * GPHY cores need the firmware code in a persistent and contiguous
+ * memory area with a 16 kB boundary aligned start address.
+ */
+ size = fw->size + XRX200_GPHY_FW_ALIGN;
+
+ fw_addr = dmam_alloc_coherent(dev, size, &dma_addr, GFP_KERNEL);
+ if (fw_addr) {
+ fw_addr = PTR_ALIGN(fw_addr, XRX200_GPHY_FW_ALIGN);
+ *dev_addr = ALIGN(dma_addr, XRX200_GPHY_FW_ALIGN);
+ memcpy(fw_addr, fw->data, fw->size);
+ } else {
+ dev_err(dev, "failed to alloc firmware memory\n");
+ ret = -ENOMEM;
+ }
+
+ release_firmware(fw);
+
+ return ret;
+}
+
+static int xway_gphy_of_probe(struct platform_device *pdev,
+ struct xway_gphy_priv *priv)
+{
+ struct device *dev = &pdev->dev;
+ const struct xway_gphy_match_data *gphy_fw_name_cfg;
+ u32 gphy_mode;
+ int ret;
+ struct resource *res_gphy;
+
+ gphy_fw_name_cfg = of_device_get_match_data(dev);
+
+ priv->gphy_clk_gate = devm_clk_get(dev, NULL);
+ if (IS_ERR(priv->gphy_clk_gate)) {
+ dev_err(dev, "Failed to lookup gate clock\n");
+ return PTR_ERR(priv->gphy_clk_gate);
+ }
+
+ res_gphy = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ priv->membase = devm_ioremap_resource(dev, res_gphy);
+ if (IS_ERR(priv->membase))
+ return PTR_ERR(priv->membase);
+
+ priv->gphy_reset = devm_reset_control_get(dev, "gphy");
+ if (IS_ERR(priv->gphy_reset)) {
+ if (PTR_ERR(priv->gphy_reset) != -EPROBE_DEFER)
+ dev_err(dev, "Failed to lookup gphy reset\n");
+ return PTR_ERR(priv->gphy_reset);
+ }
+
+ priv->gphy_reset2 = devm_reset_control_get_optional(dev, "gphy2");
+ if (IS_ERR(priv->gphy_reset2))
+ return PTR_ERR(priv->gphy_reset2);
+
+ ret = device_property_read_u32(dev, "lantiq,gphy-mode", &gphy_mode);
+ /* Default to GE mode */
+ if (ret)
+ gphy_mode = GPHY_MODE_GE;
+
+ switch (gphy_mode) {
+ case GPHY_MODE_FE:
+ priv->fw_name = gphy_fw_name_cfg->fe_firmware_name;
+ break;
+ case GPHY_MODE_GE:
+ priv->fw_name = gphy_fw_name_cfg->ge_firmware_name;
+ break;
+ default:
+ dev_err(dev, "Unknown GPHY mode %d\n", gphy_mode);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int xway_gphy_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct xway_gphy_priv *priv;
+ dma_addr_t fw_addr = 0;
+ int ret;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ ret = xway_gphy_of_probe(pdev, priv);
+ if (ret)
+ return ret;
+
+ ret = clk_prepare_enable(priv->gphy_clk_gate);
+ if (ret)
+ return ret;
+
+ ret = xway_gphy_load(dev, priv, &fw_addr);
+ if (ret) {
+ clk_disable_unprepare(priv->gphy_clk_gate);
+ return ret;
+ }
+
+ reset_control_assert(priv->gphy_reset);
+ reset_control_assert(priv->gphy_reset2);
+
+ iowrite32be(fw_addr, priv->membase);
+
+ reset_control_deassert(priv->gphy_reset);
+ reset_control_deassert(priv->gphy_reset2);
+
+ /* assert the gphy reset because it can hang after a reboot: */
+ priv->gphy_reboot_nb.notifier_call = xway_gphy_reboot_notify;
+ priv->gphy_reboot_nb.priority = -1;
+
+ ret = register_reboot_notifier(&priv->gphy_reboot_nb);
+ if (ret)
+ dev_warn(dev, "Failed to register reboot notifier\n");
+
+ platform_set_drvdata(pdev, priv);
+
+ return ret;
+}
+
+static int xway_gphy_remove(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct xway_gphy_priv *priv = platform_get_drvdata(pdev);
+ int ret;
+
+ reset_control_assert(priv->gphy_reset);
+ reset_control_assert(priv->gphy_reset2);
+
+ iowrite32be(0, priv->membase);
+
+ clk_disable_unprepare(priv->gphy_clk_gate);
+
+ ret = unregister_reboot_notifier(&priv->gphy_reboot_nb);
+ if (ret)
+ dev_warn(dev, "Failed to unregister reboot notifier\n");
+
+ return 0;
+}
+
+static struct platform_driver xway_gphy_driver = {
+ .probe = xway_gphy_probe,
+ .remove = xway_gphy_remove,
+ .driver = {
+ .name = "xway-rcu-gphy",
+ .of_match_table = xway_gphy_match,
+ },
+};
+
+module_platform_driver(xway_gphy_driver);
+
+MODULE_FIRMWARE("lantiq/xrx300_phy11g_a21.bin");
+MODULE_FIRMWARE("lantiq/xrx300_phy22f_a21.bin");
+MODULE_FIRMWARE("lantiq/xrx200_phy11g_a14.bin");
+MODULE_FIRMWARE("lantiq/xrx200_phy11g_a22.bin");
+MODULE_FIRMWARE("lantiq/xrx200_phy22f_a14.bin");
+MODULE_FIRMWARE("lantiq/xrx200_phy22f_a22.bin");
+MODULE_AUTHOR("Martin Blumenstingl <[email protected]>");
+MODULE_DESCRIPTION("Lantiq XWAY GPHY Firmware Loader");
+MODULE_LICENSE("GPL");
diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c
index c80a04e1b2b1..c2048382830f 100644
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
@@ -1067,7 +1067,7 @@ static const struct pmic_wrapper_type pwrap_mt2701 = {
.init_soc_specific = pwrap_mt2701_init_soc_specific,
};
-static struct pmic_wrapper_type pwrap_mt8135 = {
+static const struct pmic_wrapper_type pwrap_mt8135 = {
.regs = mt8135_regs,
.type = PWRAP_MT8135,
.arb_en_all = 0x1ff,
@@ -1079,7 +1079,7 @@ static struct pmic_wrapper_type pwrap_mt8135 = {
.init_soc_specific = pwrap_mt8135_init_soc_specific,
};
-static struct pmic_wrapper_type pwrap_mt8173 = {
+static const struct pmic_wrapper_type pwrap_mt8173 = {
.regs = mt8173_regs,
.type = PWRAP_MT8173,
.arb_en_all = 0x3f,
@@ -1091,7 +1091,7 @@ static struct pmic_wrapper_type pwrap_mt8173 = {
.init_soc_specific = pwrap_mt8173_init_soc_specific,
};
-static struct of_device_id of_pwrap_match_tbl[] = {
+static const struct of_device_id of_pwrap_match_tbl[] = {
{
.compatible = "mediatek,mt2701-pwrap",
.data = &pwrap_mt2701,
@@ -1233,8 +1233,8 @@ static int pwrap_probe(struct platform_device *pdev)
ret = of_platform_populate(np, NULL, NULL, wrp->dev);
if (ret) {
- dev_dbg(wrp->dev, "failed to create child devices at %s\n",
- np->full_name);
+ dev_dbg(wrp->dev, "failed to create child devices at %pOF\n",
+ np);
goto err_out2;
}
diff --git a/drivers/soc/mediatek/mtk-scpsys.c b/drivers/soc/mediatek/mtk-scpsys.c
index ceb2cc495cd0..e1ce8b1b5090 100644
--- a/drivers/soc/mediatek/mtk-scpsys.c
+++ b/drivers/soc/mediatek/mtk-scpsys.c
@@ -22,6 +22,7 @@
#include <dt-bindings/power/mt2701-power.h>
#include <dt-bindings/power/mt6797-power.h>
+#include <dt-bindings/power/mt7622-power.h>
#include <dt-bindings/power/mt8173-power.h>
#define SPM_VDE_PWR_CON 0x0210
@@ -39,6 +40,11 @@
#define SPM_MFG_2D_PWR_CON 0x02c0
#define SPM_MFG_ASYNC_PWR_CON 0x02c4
#define SPM_USB_PWR_CON 0x02cc
+#define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */
+#define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */
+#define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */
+#define SPM_WB_PWR_CON 0x02ec /* MT7622 */
+
#define SPM_PWR_STATUS 0x060c
#define SPM_PWR_STATUS_2ND 0x0610
@@ -64,6 +70,10 @@
#define PWR_STATUS_MFG_ASYNC BIT(23)
#define PWR_STATUS_AUDIO BIT(24)
#define PWR_STATUS_USB BIT(25)
+#define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */
+#define PWR_STATUS_HIF0 BIT(25) /* MT7622 */
+#define PWR_STATUS_HIF1 BIT(26) /* MT7622 */
+#define PWR_STATUS_WB BIT(27) /* MT7622 */
enum clk_id {
CLK_NONE,
@@ -73,6 +83,7 @@ enum clk_id {
CLK_VENC_LT,
CLK_ETHIF,
CLK_VDEC,
+ CLK_HIFSEL,
CLK_MAX,
};
@@ -84,6 +95,7 @@ static const char * const clk_names[] = {
"venc_lt",
"ethif",
"vdec",
+ "hif_sel",
NULL,
};
@@ -124,6 +136,19 @@ struct scp {
struct scp_ctrl_reg ctrl_reg;
};
+struct scp_subdomain {
+ int origin;
+ int subdomain;
+};
+
+struct scp_soc_data {
+ const struct scp_domain_data *domains;
+ int num_domains;
+ const struct scp_subdomain *subdomains;
+ int num_subdomains;
+ const struct scp_ctrl_reg regs;
+};
+
static int scpsys_domain_is_on(struct scp_domain *scpd)
{
struct scp *scp = scpd->scp;
@@ -357,7 +382,7 @@ static void init_clks(struct platform_device *pdev, struct clk **clk)
static struct scp *init_scp(struct platform_device *pdev,
const struct scp_domain_data *scp_domain_data, int num,
- struct scp_ctrl_reg *scp_ctrl_reg)
+ const struct scp_ctrl_reg *scp_ctrl_reg)
{
struct genpd_onecell_data *pd_data;
struct resource *res;
@@ -565,26 +590,6 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = {
},
};
-#define NUM_DOMAINS_MT2701 ARRAY_SIZE(scp_domain_data_mt2701)
-
-static int __init scpsys_probe_mt2701(struct platform_device *pdev)
-{
- struct scp *scp;
- struct scp_ctrl_reg scp_reg;
-
- scp_reg.pwr_sta_offs = SPM_PWR_STATUS;
- scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND;
-
- scp = init_scp(pdev, scp_domain_data_mt2701, NUM_DOMAINS_MT2701,
- &scp_reg);
- if (IS_ERR(scp))
- return PTR_ERR(scp);
-
- mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT2701);
-
- return 0;
-}
-
/*
* MT6797 power domain support
*/
@@ -649,51 +654,62 @@ static const struct scp_domain_data scp_domain_data_mt6797[] = {
},
};
-#define NUM_DOMAINS_MT6797 ARRAY_SIZE(scp_domain_data_mt6797)
#define SPM_PWR_STATUS_MT6797 0x0180
#define SPM_PWR_STATUS_2ND_MT6797 0x0184
-static int __init scpsys_probe_mt6797(struct platform_device *pdev)
-{
- struct scp *scp;
- struct genpd_onecell_data *pd_data;
- int ret;
- struct scp_ctrl_reg scp_reg;
-
- scp_reg.pwr_sta_offs = SPM_PWR_STATUS_MT6797;
- scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797;
-
- scp = init_scp(pdev, scp_domain_data_mt6797, NUM_DOMAINS_MT6797,
- &scp_reg);
- if (IS_ERR(scp))
- return PTR_ERR(scp);
-
- mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT6797);
-
- pd_data = &scp->pd_data;
-
- ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM],
- pd_data->domains[MT6797_POWER_DOMAIN_VDEC]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
-
- ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM],
- pd_data->domains[MT6797_POWER_DOMAIN_ISP]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
-
- ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM],
- pd_data->domains[MT6797_POWER_DOMAIN_VENC]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
+static const struct scp_subdomain scp_subdomain_mt6797[] = {
+ {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VDEC},
+ {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_ISP},
+ {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VENC},
+ {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_MJC},
+};
- ret = pm_genpd_add_subdomain(pd_data->domains[MT6797_POWER_DOMAIN_MM],
- pd_data->domains[MT6797_POWER_DOMAIN_MJC]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
+/*
+ * MT7622 power domain support
+ */
- return 0;
-}
+static const struct scp_domain_data scp_domain_data_mt7622[] = {
+ [MT7622_POWER_DOMAIN_ETHSYS] = {
+ .name = "ethsys",
+ .sta_mask = PWR_STATUS_ETHSYS,
+ .ctl_offs = SPM_ETHSYS_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .clk_id = {CLK_NONE},
+ .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_ETHSYS,
+ .active_wakeup = true,
+ },
+ [MT7622_POWER_DOMAIN_HIF0] = {
+ .name = "hif0",
+ .sta_mask = PWR_STATUS_HIF0,
+ .ctl_offs = SPM_HIF0_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .clk_id = {CLK_HIFSEL},
+ .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF0,
+ .active_wakeup = true,
+ },
+ [MT7622_POWER_DOMAIN_HIF1] = {
+ .name = "hif1",
+ .sta_mask = PWR_STATUS_HIF1,
+ .ctl_offs = SPM_HIF1_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .clk_id = {CLK_HIFSEL},
+ .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF1,
+ .active_wakeup = true,
+ },
+ [MT7622_POWER_DOMAIN_WB] = {
+ .name = "wb",
+ .sta_mask = PWR_STATUS_WB,
+ .ctl_offs = SPM_WB_PWR_CON,
+ .sram_pdn_bits = 0,
+ .sram_pdn_ack_bits = 0,
+ .clk_id = {CLK_NONE},
+ .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_WB,
+ .active_wakeup = true,
+ },
+};
/*
* MT8173 power domain support
@@ -789,39 +805,50 @@ static const struct scp_domain_data scp_domain_data_mt8173[] = {
},
};
-#define NUM_DOMAINS_MT8173 ARRAY_SIZE(scp_domain_data_mt8173)
-
-static int __init scpsys_probe_mt8173(struct platform_device *pdev)
-{
- struct scp *scp;
- struct genpd_onecell_data *pd_data;
- int ret;
- struct scp_ctrl_reg scp_reg;
-
- scp_reg.pwr_sta_offs = SPM_PWR_STATUS;
- scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND;
-
- scp = init_scp(pdev, scp_domain_data_mt8173, NUM_DOMAINS_MT8173,
- &scp_reg);
- if (IS_ERR(scp))
- return PTR_ERR(scp);
-
- mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT8173);
+static const struct scp_subdomain scp_subdomain_mt8173[] = {
+ {MT8173_POWER_DOMAIN_MFG_ASYNC, MT8173_POWER_DOMAIN_MFG_2D},
+ {MT8173_POWER_DOMAIN_MFG_2D, MT8173_POWER_DOMAIN_MFG},
+};
- pd_data = &scp->pd_data;
+static const struct scp_soc_data mt2701_data = {
+ .domains = scp_domain_data_mt2701,
+ .num_domains = ARRAY_SIZE(scp_domain_data_mt2701),
+ .regs = {
+ .pwr_sta_offs = SPM_PWR_STATUS,
+ .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
+ }
+};
- ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC],
- pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
+static const struct scp_soc_data mt6797_data = {
+ .domains = scp_domain_data_mt6797,
+ .num_domains = ARRAY_SIZE(scp_domain_data_mt6797),
+ .subdomains = scp_subdomain_mt6797,
+ .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6797),
+ .regs = {
+ .pwr_sta_offs = SPM_PWR_STATUS_MT6797,
+ .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797
+ }
+};
- ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D],
- pd_data->domains[MT8173_POWER_DOMAIN_MFG]);
- if (ret && IS_ENABLED(CONFIG_PM))
- dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret);
+static const struct scp_soc_data mt7622_data = {
+ .domains = scp_domain_data_mt7622,
+ .num_domains = ARRAY_SIZE(scp_domain_data_mt7622),
+ .regs = {
+ .pwr_sta_offs = SPM_PWR_STATUS,
+ .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
+ }
+};
- return 0;
-}
+static const struct scp_soc_data mt8173_data = {
+ .domains = scp_domain_data_mt8173,
+ .num_domains = ARRAY_SIZE(scp_domain_data_mt8173),
+ .subdomains = scp_subdomain_mt8173,
+ .num_subdomains = ARRAY_SIZE(scp_subdomain_mt8173),
+ .regs = {
+ .pwr_sta_offs = SPM_PWR_STATUS,
+ .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
+ }
+};
/*
* scpsys driver init
@@ -830,13 +857,16 @@ static int __init scpsys_probe_mt8173(struct platform_device *pdev)
static const struct of_device_id of_scpsys_match_tbl[] = {
{
.compatible = "mediatek,mt2701-scpsys",
- .data = scpsys_probe_mt2701,
+ .data = &mt2701_data,
}, {
.compatible = "mediatek,mt6797-scpsys",
- .data = scpsys_probe_mt6797,
+ .data = &mt6797_data,
+ }, {
+ .compatible = "mediatek,mt7622-scpsys",
+ .data = &mt7622_data,
}, {
.compatible = "mediatek,mt8173-scpsys",
- .data = scpsys_probe_mt8173,
+ .data = &mt8173_data,
}, {
/* sentinel */
}
@@ -844,16 +874,33 @@ static const struct of_device_id of_scpsys_match_tbl[] = {
static int scpsys_probe(struct platform_device *pdev)
{
- int (*probe)(struct platform_device *);
- const struct of_device_id *of_id;
+ const struct of_device_id *match;
+ const struct scp_subdomain *sd;
+ const struct scp_soc_data *soc;
+ struct scp *scp;
+ struct genpd_onecell_data *pd_data;
+ int i, ret;
- of_id = of_match_node(of_scpsys_match_tbl, pdev->dev.of_node);
- if (!of_id || !of_id->data)
- return -EINVAL;
+ match = of_match_device(of_scpsys_match_tbl, &pdev->dev);
+ soc = (const struct scp_soc_data *)match->data;
+
+ scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs);
+ if (IS_ERR(scp))
+ return PTR_ERR(scp);
- probe = of_id->data;
+ mtk_register_power_domains(pdev, scp, soc->num_domains);
- return probe(pdev);
+ pd_data = &scp->pd_data;
+
+ for (i = 0, sd = soc->subdomains ; i < soc->num_subdomains ; i++) {
+ ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin],
+ pd_data->domains[sd->subdomain]);
+ if (ret && IS_ENABLED(CONFIG_PM))
+ dev_err(&pdev->dev, "Failed to add subdomain: %d\n",
+ ret);
+ }
+
+ return 0;
}
static struct platform_driver scpsys_drv = {
diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig
index 9fca977ef18d..b00bccddcd3b 100644
--- a/drivers/soc/qcom/Kconfig
+++ b/drivers/soc/qcom/Kconfig
@@ -1,6 +1,17 @@
#
# QCOM Soc drivers
#
+menu "Qualcomm SoC drivers"
+
+config QCOM_GLINK_SSR
+ tristate "Qualcomm Glink SSR driver"
+ depends on RPMSG
+ depends on QCOM_RPROC_COMMON
+ help
+ Say y here to enable GLINK SSR support. The GLINK SSR driver
+ implements the SSR protocol for notifying the remote processor about
+ neighboring subsystems going up or down.
+
config QCOM_GSBI
tristate "QCOM General Serial Bus Interface"
depends on ARCH_QCOM
@@ -74,3 +85,5 @@ config QCOM_WCNSS_CTRL
help
Client driver for the WCNSS_CTRL SMD channel, used to download nv
firmware to a newly booted WCNSS chip.
+
+endmenu
diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile
index 414f0de274fa..f151de41eb93 100644
--- a/drivers/soc/qcom/Makefile
+++ b/drivers/soc/qcom/Makefile
@@ -1,3 +1,4 @@
+obj-$(CONFIG_QCOM_GLINK_SSR) += glink_ssr.o
obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o
obj-$(CONFIG_QCOM_MDT_LOADER) += mdt_loader.o
obj-$(CONFIG_QCOM_PM) += spm.o
diff --git a/drivers/soc/qcom/glink_ssr.c b/drivers/soc/qcom/glink_ssr.c
new file mode 100644
index 000000000000..19c7399eddb5
--- /dev/null
+++ b/drivers/soc/qcom/glink_ssr.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017, Linaro Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/completion.h>
+#include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/rpmsg.h>
+#include <linux/remoteproc/qcom_rproc.h>
+
+/**
+ * struct do_cleanup_msg - The data structure for an SSR do_cleanup message
+ * version: The G-Link SSR protocol version
+ * command: The G-Link SSR command - do_cleanup
+ * seq_num: Sequence number
+ * name_len: Length of the name of the subsystem being restarted
+ * name: G-Link edge name of the subsystem being restarted
+ */
+struct do_cleanup_msg {
+ __le32 version;
+ __le32 command;
+ __le32 seq_num;
+ __le32 name_len;
+ char name[32];
+};
+
+/**
+ * struct cleanup_done_msg - The data structure for an SSR cleanup_done message
+ * version: The G-Link SSR protocol version
+ * response: The G-Link SSR response to a do_cleanup command, cleanup_done
+ * seq_num: Sequence number
+ */
+struct cleanup_done_msg {
+ __le32 version;
+ __le32 response;
+ __le32 seq_num;
+};
+
+/**
+ * G-Link SSR protocol commands
+ */
+#define GLINK_SSR_DO_CLEANUP 0
+#define GLINK_SSR_CLEANUP_DONE 1
+
+struct glink_ssr {
+ struct device *dev;
+ struct rpmsg_endpoint *ept;
+
+ struct notifier_block nb;
+
+ u32 seq_num;
+ struct completion completion;
+};
+
+static int qcom_glink_ssr_callback(struct rpmsg_device *rpdev,
+ void *data, int len, void *priv, u32 addr)
+{
+ struct cleanup_done_msg *msg = data;
+ struct glink_ssr *ssr = dev_get_drvdata(&rpdev->dev);
+
+ if (len < sizeof(*msg)) {
+ dev_err(ssr->dev, "message too short\n");
+ return -EINVAL;
+ }
+
+ if (le32_to_cpu(msg->version) != 0)
+ return -EINVAL;
+
+ if (le32_to_cpu(msg->response) != GLINK_SSR_CLEANUP_DONE)
+ return 0;
+
+ if (le32_to_cpu(msg->seq_num) != ssr->seq_num) {
+ dev_err(ssr->dev, "invalid sequence number of response\n");
+ return -EINVAL;
+ }
+
+ complete(&ssr->completion);
+
+ return 0;
+}
+
+static int qcom_glink_ssr_notify(struct notifier_block *nb, unsigned long event,
+ void *data)
+{
+ struct glink_ssr *ssr = container_of(nb, struct glink_ssr, nb);
+ struct do_cleanup_msg msg;
+ char *ssr_name = data;
+ int ret;
+
+ ssr->seq_num++;
+ reinit_completion(&ssr->completion);
+
+ memset(&msg, 0, sizeof(msg));
+ msg.command = cpu_to_le32(GLINK_SSR_DO_CLEANUP);
+ msg.seq_num = cpu_to_le32(ssr->seq_num);
+ msg.name_len = cpu_to_le32(strlen(ssr_name));
+ strlcpy(msg.name, ssr_name, sizeof(msg.name));
+
+ ret = rpmsg_send(ssr->ept, &msg, sizeof(msg));
+ if (ret < 0)
+ dev_err(ssr->dev, "failed to send cleanup message\n");
+
+ ret = wait_for_completion_timeout(&ssr->completion, HZ);
+ if (!ret)
+ dev_err(ssr->dev, "timeout waiting for cleanup done message\n");
+
+ return NOTIFY_DONE;
+}
+
+static int qcom_glink_ssr_probe(struct rpmsg_device *rpdev)
+{
+ struct glink_ssr *ssr;
+
+ ssr = devm_kzalloc(&rpdev->dev, sizeof(*ssr), GFP_KERNEL);
+ if (!ssr)
+ return -ENOMEM;
+
+ init_completion(&ssr->completion);
+
+ ssr->dev = &rpdev->dev;
+ ssr->ept = rpdev->ept;
+ ssr->nb.notifier_call = qcom_glink_ssr_notify;
+
+ dev_set_drvdata(&rpdev->dev, ssr);
+
+ return qcom_register_ssr_notifier(&ssr->nb);
+}
+
+static void qcom_glink_ssr_remove(struct rpmsg_device *rpdev)
+{
+ struct glink_ssr *ssr = dev_get_drvdata(&rpdev->dev);
+
+ qcom_unregister_ssr_notifier(&ssr->nb);
+}
+
+static const struct rpmsg_device_id qcom_glink_ssr_match[] = {
+ { "glink_ssr" },
+ {}
+};
+
+static struct rpmsg_driver qcom_glink_ssr_driver = {
+ .probe = qcom_glink_ssr_probe,
+ .remove = qcom_glink_ssr_remove,
+ .callback = qcom_glink_ssr_callback,
+ .id_table = qcom_glink_ssr_match,
+ .drv = {
+ .name = "qcom_glink_ssr",
+ },
+};
+module_rpmsg_driver(qcom_glink_ssr_driver);
+
+MODULE_ALIAS("rpmsg:glink_ssr");
+MODULE_DESCRIPTION("Qualcomm GLINK SSR notifier");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c
index bd63df0d14e0..08bd8549242a 100644
--- a/drivers/soc/qcom/mdt_loader.c
+++ b/drivers/soc/qcom/mdt_loader.c
@@ -178,14 +178,13 @@ int qcom_mdt_load(struct device *dev, const struct firmware *fw,
if (phdr->p_filesz) {
sprintf(fw_name + fw_name_len - 3, "b%02d", i);
- ret = request_firmware(&seg_fw, fw_name, dev);
+ ret = request_firmware_into_buf(&seg_fw, fw_name, dev,
+ ptr, phdr->p_filesz);
if (ret) {
dev_err(dev, "failed to load %s\n", fw_name);
break;
}
- memcpy(ptr, seg_fw->data, seg_fw->size);
-
release_firmware(seg_fw);
}
diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c
index dc540ea92e9d..403bea9d546b 100644
--- a/drivers/soc/qcom/smsm.c
+++ b/drivers/soc/qcom/smsm.c
@@ -496,7 +496,8 @@ static int qcom_smsm_probe(struct platform_device *pdev)
if (!smsm->hosts)
return -ENOMEM;
- local_node = of_find_node_with_property(pdev->dev.of_node, "#qcom,smem-state-cells");
+ local_node = of_find_node_with_property(of_node_get(pdev->dev.of_node),
+ "#qcom,smem-state-cells");
if (!local_node) {
dev_err(&pdev->dev, "no state entry\n");
return -EINVAL;
diff --git a/drivers/soc/qcom/wcnss_ctrl.c b/drivers/soc/qcom/wcnss_ctrl.c
index b9069184df19..d008e5b82db4 100644
--- a/drivers/soc/qcom/wcnss_ctrl.c
+++ b/drivers/soc/qcom/wcnss_ctrl.c
@@ -347,6 +347,7 @@ static const struct of_device_id wcnss_ctrl_of_match[] = {
{ .compatible = "qcom,wcnss", },
{}
};
+MODULE_DEVICE_TABLE(of, wcnss_ctrl_of_match);
static struct rpmsg_driver wcnss_ctrl_driver = {
.probe = wcnss_ctrl_probe,
diff --git a/drivers/soc/renesas/Kconfig b/drivers/soc/renesas/Kconfig
index 87a4be46bd98..567414cb42ba 100644
--- a/drivers/soc/renesas/Kconfig
+++ b/drivers/soc/renesas/Kconfig
@@ -3,7 +3,7 @@ config SOC_RENESAS
default y if ARCH_RENESAS
select SOC_BUS
select RST_RCAR if ARCH_RCAR_GEN1 || ARCH_RCAR_GEN2 || \
- ARCH_R8A7795 || ARCH_R8A7796
+ ARCH_R8A7795 || ARCH_R8A7796 || ARCH_R8A77995
select SYSC_R8A7743 if ARCH_R8A7743
select SYSC_R8A7745 if ARCH_R8A7745
select SYSC_R8A7779 if ARCH_R8A7779
@@ -13,6 +13,7 @@ config SOC_RENESAS
select SYSC_R8A7794 if ARCH_R8A7794
select SYSC_R8A7795 if ARCH_R8A7795
select SYSC_R8A7796 if ARCH_R8A7796
+ select SYSC_R8A77995 if ARCH_R8A77995
if SOC_RENESAS
@@ -53,6 +54,10 @@ config SYSC_R8A7796
bool "R-Car M3-W System Controller support" if COMPILE_TEST
select SYSC_RCAR
+config SYSC_R8A77995
+ bool "R-Car D3 System Controller support" if COMPILE_TEST
+ select SYSC_RCAR
+
# Family
config RST_RCAR
bool "R-Car Reset Controller support" if COMPILE_TEST
diff --git a/drivers/soc/renesas/Makefile b/drivers/soc/renesas/Makefile
index 1a1a297b26a7..6b6e7f16104c 100644
--- a/drivers/soc/renesas/Makefile
+++ b/drivers/soc/renesas/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_SYSC_R8A7792) += r8a7792-sysc.o
obj-$(CONFIG_SYSC_R8A7794) += r8a7794-sysc.o
obj-$(CONFIG_SYSC_R8A7795) += r8a7795-sysc.o
obj-$(CONFIG_SYSC_R8A7796) += r8a7796-sysc.o
+obj-$(CONFIG_SYSC_R8A77995) += r8a77995-sysc.o
# Family
obj-$(CONFIG_RST_RCAR) += rcar-rst.o
diff --git a/drivers/soc/renesas/r8a77995-sysc.c b/drivers/soc/renesas/r8a77995-sysc.c
new file mode 100644
index 000000000000..f718429cab02
--- /dev/null
+++ b/drivers/soc/renesas/r8a77995-sysc.c
@@ -0,0 +1,31 @@
+/*
+ * Renesas R-Car D3 System Controller
+ *
+ * Copyright (C) 2017 Glider bvba
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/bug.h>
+#include <linux/kernel.h>
+#include <linux/sys_soc.h>
+
+#include <dt-bindings/power/r8a77995-sysc.h>
+
+#include "rcar-sysc.h"
+
+static struct rcar_sysc_area r8a77995_areas[] __initdata = {
+ { "always-on", 0, 0, R8A77995_PD_ALWAYS_ON, -1, PD_ALWAYS_ON },
+ { "ca53-scu", 0x140, 0, R8A77995_PD_CA53_SCU, R8A77995_PD_ALWAYS_ON,
+ PD_SCU },
+ { "ca53-cpu0", 0x200, 0, R8A77995_PD_CA53_CPU0, R8A77995_PD_CA53_SCU,
+ PD_CPU_NOCR },
+};
+
+
+const struct rcar_sysc_info r8a77995_sysc_info __initconst = {
+ .areas = r8a77995_areas,
+ .num_areas = ARRAY_SIZE(r8a77995_areas),
+};
diff --git a/drivers/soc/renesas/rcar-rst.c b/drivers/soc/renesas/rcar-rst.c
index a6d1c26d3167..baa47014e96b 100644
--- a/drivers/soc/renesas/rcar-rst.c
+++ b/drivers/soc/renesas/rcar-rst.c
@@ -41,6 +41,7 @@ static const struct of_device_id rcar_rst_matches[] __initconst = {
/* R-Car Gen3 is handled like R-Car Gen2 */
{ .compatible = "renesas,r8a7795-rst", .data = &rcar_rst_gen2 },
{ .compatible = "renesas,r8a7796-rst", .data = &rcar_rst_gen2 },
+ { .compatible = "renesas,r8a77995-rst", .data = &rcar_rst_gen2 },
{ /* sentinel */ }
};
@@ -61,7 +62,7 @@ static int __init rcar_rst_init(void)
base = of_iomap(np, 0);
if (!base) {
- pr_warn("%s: Cannot map regs\n", np->full_name);
+ pr_warn("%pOF: Cannot map regs\n", np);
error = -ENOMEM;
goto out_put;
}
@@ -70,7 +71,7 @@ static int __init rcar_rst_init(void)
cfg = match->data;
saved_mode = ioread32(base + cfg->modemr);
- pr_debug("%s: MODE = 0x%08x\n", np->full_name, saved_mode);
+ pr_debug("%pOF: MODE = 0x%08x\n", np, saved_mode);
out_put:
of_node_put(np);
diff --git a/drivers/soc/renesas/rcar-sysc.c b/drivers/soc/renesas/rcar-sysc.c
index 7c8da3c90011..c8406e81640f 100644
--- a/drivers/soc/renesas/rcar-sysc.c
+++ b/drivers/soc/renesas/rcar-sysc.c
@@ -284,6 +284,9 @@ static const struct of_device_id rcar_sysc_matches[] = {
#ifdef CONFIG_SYSC_R8A7796
{ .compatible = "renesas,r8a7796-sysc", .data = &r8a7796_sysc_info },
#endif
+#ifdef CONFIG_SYSC_R8A77995
+ { .compatible = "renesas,r8a77995-sysc", .data = &r8a77995_sysc_info },
+#endif
{ /* sentinel */ }
};
@@ -323,7 +326,7 @@ static int __init rcar_sysc_pd_init(void)
base = of_iomap(np, 0);
if (!base) {
- pr_warn("%s: Cannot map regs\n", np->full_name);
+ pr_warn("%pOF: Cannot map regs\n", np);
error = -ENOMEM;
goto out_put;
}
@@ -348,13 +351,13 @@ static int __init rcar_sysc_pd_init(void)
*/
syscimr = ioread32(base + SYSCIMR);
syscimr |= syscier;
- pr_debug("%s: syscimr = 0x%08x\n", np->full_name, syscimr);
+ pr_debug("%pOF: syscimr = 0x%08x\n", np, syscimr);
iowrite32(syscimr, base + SYSCIMR);
/*
* SYSC needs all interrupt sources enabled to control power.
*/
- pr_debug("%s: syscier = 0x%08x\n", np->full_name, syscier);
+ pr_debug("%pOF: syscier = 0x%08x\n", np, syscier);
iowrite32(syscier, base + SYSCIER);
for (i = 0; i < info->num_areas; i++) {
diff --git a/drivers/soc/renesas/rcar-sysc.h b/drivers/soc/renesas/rcar-sysc.h
index 1a5bebaf54ba..2f524922c4d2 100644
--- a/drivers/soc/renesas/rcar-sysc.h
+++ b/drivers/soc/renesas/rcar-sysc.h
@@ -58,6 +58,7 @@ extern const struct rcar_sysc_info r8a7792_sysc_info;
extern const struct rcar_sysc_info r8a7794_sysc_info;
extern const struct rcar_sysc_info r8a7795_sysc_info;
extern const struct rcar_sysc_info r8a7796_sysc_info;
+extern const struct rcar_sysc_info r8a77995_sysc_info;
/*
diff --git a/drivers/soc/renesas/renesas-soc.c b/drivers/soc/renesas/renesas-soc.c
index ca26f13d399c..90d6b7a4340a 100644
--- a/drivers/soc/renesas/renesas-soc.c
+++ b/drivers/soc/renesas/renesas-soc.c
@@ -144,6 +144,11 @@ static const struct renesas_soc soc_rcar_m3_w __initconst __maybe_unused = {
.id = 0x52,
};
+static const struct renesas_soc soc_rcar_d3 __initconst __maybe_unused = {
+ .family = &fam_rcar_gen3,
+ .id = 0x58,
+};
+
static const struct renesas_soc soc_shmobile_ag5 __initconst __maybe_unused = {
.family = &fam_shmobile,
.id = 0x37,
@@ -199,6 +204,9 @@ static const struct of_device_id renesas_socs[] __initconst = {
#ifdef CONFIG_ARCH_R8A7796
{ .compatible = "renesas,r8a7796", .data = &soc_rcar_m3_w },
#endif
+#ifdef CONFIG_ARCH_R8A77995
+ { .compatible = "renesas,r8a77995", .data = &soc_rcar_d3 },
+#endif
#ifdef CONFIG_ARCH_SH73A0
{ .compatible = "renesas,sh73a0", .data = &soc_shmobile_ag5 },
#endif
diff --git a/drivers/soc/rockchip/grf.c b/drivers/soc/rockchip/grf.c
index d61db34ad6dd..15e71fd6c513 100644
--- a/drivers/soc/rockchip/grf.c
+++ b/drivers/soc/rockchip/grf.c
@@ -54,6 +54,17 @@ static const struct rockchip_grf_info rk3288_grf __initconst = {
.num_values = ARRAY_SIZE(rk3288_defaults),
};
+#define RK3328_GRF_SOC_CON4 0x410
+
+static const struct rockchip_grf_value rk3328_defaults[] __initconst = {
+ { "jtag switching", RK3328_GRF_SOC_CON4, HIWORD_UPDATE(0, 1, 12) },
+};
+
+static const struct rockchip_grf_info rk3328_grf __initconst = {
+ .values = rk3328_defaults,
+ .num_values = ARRAY_SIZE(rk3328_defaults),
+};
+
#define RK3368_GRF_SOC_CON15 0x43c
static const struct rockchip_grf_value rk3368_defaults[] __initconst = {
@@ -84,6 +95,9 @@ static const struct of_device_id rockchip_grf_dt_match[] __initconst = {
.compatible = "rockchip,rk3288-grf",
.data = (void *)&rk3288_grf,
}, {
+ .compatible = "rockchip,rk3328-grf",
+ .data = (void *)&rk3328_grf,
+ }, {
.compatible = "rockchip,rk3368-grf",
.data = (void *)&rk3368_grf,
}, {
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index 796c46a6cbe7..40b75748835f 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -20,6 +20,7 @@
#include <linux/mfd/syscon.h>
#include <dt-bindings/power/rk3288-power.h>
#include <dt-bindings/power/rk3328-power.h>
+#include <dt-bindings/power/rk3366-power.h>
#include <dt-bindings/power/rk3368-power.h>
#include <dt-bindings/power/rk3399-power.h>
@@ -730,6 +731,16 @@ static const struct rockchip_domain_info rk3328_pm_domains[] = {
[RK3328_PD_VPU] = DOMAIN_RK3328(-1, 9, 9, false),
};
+static const struct rockchip_domain_info rk3366_pm_domains[] = {
+ [RK3366_PD_PERI] = DOMAIN_RK3368(10, 10, 6, true),
+ [RK3366_PD_VIO] = DOMAIN_RK3368(14, 14, 8, false),
+ [RK3366_PD_VIDEO] = DOMAIN_RK3368(13, 13, 7, false),
+ [RK3366_PD_RKVDEC] = DOMAIN_RK3368(11, 11, 7, false),
+ [RK3366_PD_WIFIBT] = DOMAIN_RK3368(8, 8, 9, false),
+ [RK3366_PD_VPU] = DOMAIN_RK3368(12, 12, 7, false),
+ [RK3366_PD_GPU] = DOMAIN_RK3368(15, 15, 2, false),
+};
+
static const struct rockchip_domain_info rk3368_pm_domains[] = {
[RK3368_PD_PERI] = DOMAIN_RK3368(13, 12, 6, true),
[RK3368_PD_VIO] = DOMAIN_RK3368(15, 14, 8, false),
@@ -794,6 +805,23 @@ static const struct rockchip_pmu_info rk3328_pmu = {
.domain_info = rk3328_pm_domains,
};
+static const struct rockchip_pmu_info rk3366_pmu = {
+ .pwr_offset = 0x0c,
+ .status_offset = 0x10,
+ .req_offset = 0x3c,
+ .idle_offset = 0x40,
+ .ack_offset = 0x40,
+
+ .core_pwrcnt_offset = 0x48,
+ .gpu_pwrcnt_offset = 0x50,
+
+ .core_power_transition_time = 24,
+ .gpu_power_transition_time = 24,
+
+ .num_domains = ARRAY_SIZE(rk3366_pm_domains),
+ .domain_info = rk3366_pm_domains,
+};
+
static const struct rockchip_pmu_info rk3368_pmu = {
.pwr_offset = 0x0c,
.status_offset = 0x10,
@@ -834,6 +862,10 @@ static const struct of_device_id rockchip_pm_domain_dt_match[] = {
.data = (void *)&rk3328_pmu,
},
{
+ .compatible = "rockchip,rk3366-power-controller",
+ .data = (void *)&rk3366_pmu,
+ },
+ {
.compatible = "rockchip,rk3368-power-controller",
.data = (void *)&rk3368_pmu,
},
diff --git a/drivers/soc/samsung/pm_domains.c b/drivers/soc/samsung/pm_domains.c
index a6a5d807cc2b..7c4fec1f93b5 100644
--- a/drivers/soc/samsung/pm_domains.c
+++ b/drivers/soc/samsung/pm_domains.c
@@ -147,7 +147,7 @@ static __init const char *exynos_get_domain_name(struct device_node *node)
const char *name;
if (of_property_read_string(node, "label", &name) < 0)
- name = strrchr(node->full_name, '/') + 1;
+ name = kbasename(node->full_name);
return kstrdup_const(name, GFP_KERNEL);
}
@@ -237,11 +237,11 @@ no_clk:
continue;
if (of_genpd_add_subdomain(&parent, &child))
- pr_warn("%s failed to add subdomain: %s\n",
- parent.np->full_name, child.np->full_name);
+ pr_warn("%pOF failed to add subdomain: %pOF\n",
+ parent.np, child.np);
else
- pr_info("%s has as child subdomain: %s.\n",
- parent.np->full_name, child.np->full_name);
+ pr_info("%pOF has as child subdomain: %pOF.\n",
+ parent.np, child.np);
}
return 0;
diff --git a/drivers/soc/sunxi/sunxi_sram.c b/drivers/soc/sunxi/sunxi_sram.c
index 99e354c8f53f..882be5ed7e84 100644
--- a/drivers/soc/sunxi/sunxi_sram.c
+++ b/drivers/soc/sunxi/sunxi_sram.c
@@ -23,6 +23,7 @@
struct sunxi_sram_func {
char *func;
u8 val;
+ u32 reg_val;
};
struct sunxi_sram_data {
@@ -39,10 +40,11 @@ struct sunxi_sram_desc {
bool claimed;
};
-#define SUNXI_SRAM_MAP(_val, _func) \
+#define SUNXI_SRAM_MAP(_reg_val, _val, _func) \
{ \
.func = _func, \
.val = _val, \
+ .reg_val = _reg_val, \
}
#define SUNXI_SRAM_DATA(_name, _reg, _off, _width, ...) \
@@ -57,14 +59,20 @@ struct sunxi_sram_desc {
static struct sunxi_sram_desc sun4i_a10_sram_a3_a4 = {
.data = SUNXI_SRAM_DATA("A3-A4", 0x4, 0x4, 2,
- SUNXI_SRAM_MAP(0, "cpu"),
- SUNXI_SRAM_MAP(1, "emac")),
+ SUNXI_SRAM_MAP(0, 0, "cpu"),
+ SUNXI_SRAM_MAP(1, 1, "emac")),
};
static struct sunxi_sram_desc sun4i_a10_sram_d = {
.data = SUNXI_SRAM_DATA("D", 0x4, 0x0, 1,
- SUNXI_SRAM_MAP(0, "cpu"),
- SUNXI_SRAM_MAP(1, "usb-otg")),
+ SUNXI_SRAM_MAP(0, 0, "cpu"),
+ SUNXI_SRAM_MAP(1, 1, "usb-otg")),
+};
+
+static struct sunxi_sram_desc sun50i_a64_sram_c = {
+ .data = SUNXI_SRAM_DATA("C", 0x4, 24, 1,
+ SUNXI_SRAM_MAP(0, 1, "cpu"),
+ SUNXI_SRAM_MAP(1, 0, "de2")),
};
static const struct of_device_id sunxi_sram_dt_ids[] = {
@@ -76,6 +84,10 @@ static const struct of_device_id sunxi_sram_dt_ids[] = {
.compatible = "allwinner,sun4i-a10-sram-d",
.data = &sun4i_a10_sram_d.data,
},
+ {
+ .compatible = "allwinner,sun50i-a64-sram-c",
+ .data = &sun50i_a64_sram_c.data,
+ },
{}
};
@@ -121,7 +133,8 @@ static int sunxi_sram_show(struct seq_file *s, void *data)
for (func = sram_data->func; func->func; func++) {
seq_printf(s, "\t\t%s%c\n", func->func,
- func->val == val ? '*' : ' ');
+ func->reg_val == val ?
+ '*' : ' ');
}
}
@@ -149,10 +162,13 @@ static inline struct sunxi_sram_desc *to_sram_desc(const struct sunxi_sram_data
}
static const struct sunxi_sram_data *sunxi_sram_of_parse(struct device_node *node,
- unsigned int *value)
+ unsigned int *reg_value)
{
const struct of_device_id *match;
+ const struct sunxi_sram_data *data;
+ struct sunxi_sram_func *func;
struct of_phandle_args args;
+ u8 val;
int ret;
ret = of_parse_phandle_with_fixed_args(node, "allwinner,sram", 1, 0,
@@ -165,8 +181,7 @@ static const struct sunxi_sram_data *sunxi_sram_of_parse(struct device_node *nod
goto err;
}
- if (value)
- *value = args.args[0];
+ val = args.args[0];
match = of_match_node(sunxi_sram_dt_ids, args.np);
if (!match) {
@@ -174,6 +189,26 @@ static const struct sunxi_sram_data *sunxi_sram_of_parse(struct device_node *nod
goto err;
}
+ data = match->data;
+ if (!data) {
+ ret = -EINVAL;
+ goto err;
+ };
+
+ for (func = data->func; func->func; func++) {
+ if (val == func->val) {
+ if (reg_value)
+ *reg_value = func->reg_val;
+
+ break;
+ }
+ }
+
+ if (!func->func) {
+ ret = -EINVAL;
+ goto err;
+ }
+
of_node_put(args.np);
return match->data;
@@ -190,6 +225,9 @@ int sunxi_sram_claim(struct device *dev)
u32 val, mask;
if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ if (!base)
return -EPROBE_DEFER;
if (!dev || !dev->of_node)
@@ -267,6 +305,7 @@ static int sunxi_sram_probe(struct platform_device *pdev)
static const struct of_device_id sunxi_sram_dt_match[] = {
{ .compatible = "allwinner,sun4i-a10-sram-controller" },
+ { .compatible = "allwinner,sun50i-a64-sram-controller" },
{ },
};
MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);
diff --git a/drivers/soc/tegra/Kconfig b/drivers/soc/tegra/Kconfig
index 1beb7c347344..e9e277178c94 100644
--- a/drivers/soc/tegra/Kconfig
+++ b/drivers/soc/tegra/Kconfig
@@ -107,6 +107,11 @@ config ARCH_TEGRA_186_SOC
endif
endif
+config SOC_TEGRA_FUSE
+ def_bool y
+ depends on ARCH_TEGRA
+ select SOC_BUS
+
config SOC_TEGRA_FLOWCTRL
bool
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index 7413f60fa855..b7c552e3133c 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -19,10 +19,12 @@
#include <linux/device.h>
#include <linux/kobject.h>
#include <linux/init.h>
-#include <linux/platform_device.h>
+#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
-#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
#include <soc/tegra/common.h>
#include <soc/tegra/fuse.h>
@@ -210,6 +212,31 @@ static void tegra_enable_fuse_clk(void __iomem *base)
writel(reg, base + 0x14);
}
+struct device * __init tegra_soc_device_register(void)
+{
+ struct soc_device_attribute *attr;
+ struct soc_device *dev;
+
+ attr = kzalloc(sizeof(*attr), GFP_KERNEL);
+ if (!attr)
+ return NULL;
+
+ attr->family = kasprintf(GFP_KERNEL, "Tegra");
+ attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_sku_info.revision);
+ attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id());
+
+ dev = soc_device_register(attr);
+ if (IS_ERR(dev)) {
+ kfree(attr->soc_id);
+ kfree(attr->revision);
+ kfree(attr->family);
+ kfree(attr);
+ return ERR_CAST(dev);
+ }
+
+ return soc_device_to_device(dev);
+}
+
static int __init tegra_init_fuse(void)
{
const struct of_device_id *match;
@@ -311,6 +338,31 @@ static int __init tegra_init_fuse(void)
pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n",
tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);
+
return 0;
}
early_initcall(tegra_init_fuse);
+
+#ifdef CONFIG_ARM64
+static int __init tegra_init_soc(void)
+{
+ struct device_node *np;
+ struct device *soc;
+
+ /* make sure we're running on Tegra */
+ np = of_find_matching_node(NULL, tegra_fuse_match);
+ if (!np)
+ return 0;
+
+ of_node_put(np);
+
+ soc = tegra_soc_device_register();
+ if (IS_ERR(soc)) {
+ pr_err("failed to register SoC device: %ld\n", PTR_ERR(soc));
+ return PTR_ERR(soc);
+ }
+
+ return 0;
+}
+device_initcall(tegra_init_soc);
+#endif
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index e233dd5dcab3..0453ff6839a7 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -918,10 +918,8 @@ static void tegra_powergate_init(struct tegra_pmc *pmc,
if (!np)
return;
- for_each_child_of_node(np, child) {
+ for_each_child_of_node(np, child)
tegra_powergate_add(pmc, child);
- of_node_put(child);
- }
of_node_put(np);
}
diff --git a/drivers/soc/versatile/soc-realview.c b/drivers/soc/versatile/soc-realview.c
index 282e371378ce..caf698e5f0b0 100644
--- a/drivers/soc/versatile/soc-realview.c
+++ b/drivers/soc/versatile/soc-realview.c
@@ -85,7 +85,7 @@ static struct device_attribute realview_build_attr =
static int realview_soc_probe(struct platform_device *pdev)
{
- static struct regmap *syscon_regmap;
+ struct regmap *syscon_regmap;
struct soc_device *soc_dev;
struct soc_device_attribute *soc_dev_attr;
struct device_node *np = pdev->dev.of_node;
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
index 6ba270e0494d..0f695df14c9d 100644
--- a/drivers/staging/android/ashmem.c
+++ b/drivers/staging/android/ashmem.c
@@ -294,19 +294,9 @@ static int ashmem_release(struct inode *ignored, struct file *file)
return 0;
}
-/**
- * ashmem_read() - Reads a set of bytes from an Ashmem-enabled file
- * @file: The associated backing file.
- * @buf: The buffer of data being written to
- * @len: The number of bytes being read
- * @pos: The position of the first byte to read.
- *
- * Return: 0 if successful, or another return code if not.
- */
-static ssize_t ashmem_read(struct file *file, char __user *buf,
- size_t len, loff_t *pos)
+static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
- struct ashmem_area *asma = file->private_data;
+ struct ashmem_area *asma = iocb->ki_filp->private_data;
int ret = 0;
mutex_lock(&ashmem_mutex);
@@ -320,20 +310,17 @@ static ssize_t ashmem_read(struct file *file, char __user *buf,
goto out_unlock;
}
- mutex_unlock(&ashmem_mutex);
-
/*
* asma and asma->file are used outside the lock here. We assume
* once asma->file is set it will never be changed, and will not
* be destroyed until all references to the file are dropped and
* ashmem_release is called.
*/
- ret = __vfs_read(asma->file, buf, len, pos);
- if (ret >= 0)
- /** Update backing file pos, since f_ops->read() doesn't */
- asma->file->f_pos = *pos;
- return ret;
-
+ mutex_unlock(&ashmem_mutex);
+ ret = vfs_iter_read(asma->file, iter, &iocb->ki_pos, 0);
+ mutex_lock(&ashmem_mutex);
+ if (ret > 0)
+ asma->file->f_pos = iocb->ki_pos;
out_unlock:
mutex_unlock(&ashmem_mutex);
return ret;
@@ -834,7 +821,7 @@ static const struct file_operations ashmem_fops = {
.owner = THIS_MODULE,
.open = ashmem_open,
.release = ashmem_release,
- .read = ashmem_read,
+ .read_iter = ashmem_read_iter,
.llseek = ashmem_llseek,
.mmap = ashmem_mmap,
.unlocked_ioctl = ashmem_ioctl,
diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c
index 0d33e520f635..cc18e25103ca 100644
--- a/drivers/staging/comedi/drivers/serial2002.c
+++ b/drivers/staging/comedi/drivers/serial2002.c
@@ -106,16 +106,8 @@ static long serial2002_tty_ioctl(struct file *f, unsigned int op,
static int serial2002_tty_write(struct file *f, unsigned char *buf, int count)
{
- const char __user *p = (__force const char __user *)buf;
- int result;
- loff_t offset = 0;
- mm_segment_t oldfs;
-
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- result = __vfs_write(f, p, count, &offset);
- set_fs(oldfs);
- return result;
+ loff_t pos = 0;
+ return kernel_write(f, buf, count, &pos);
}
static void serial2002_tty_read_poll_wait(struct file *f, int timeout)
@@ -148,19 +140,14 @@ static int serial2002_tty_read(struct file *f, int timeout)
{
unsigned char ch;
int result;
+ loff_t pos = 0;
result = -1;
if (!IS_ERR(f)) {
- mm_segment_t oldfs;
- char __user *p = (__force char __user *)&ch;
- loff_t offset = 0;
-
- oldfs = get_fs();
- set_fs(KERNEL_DS);
if (f->f_op->poll) {
serial2002_tty_read_poll_wait(f, timeout);
- if (__vfs_read(f, p, 1, &offset) == 1)
+ if (kernel_read(f, &ch, 1, &pos) == 1)
result = ch;
} else {
/* Device does not support poll, busy wait */
@@ -171,14 +158,13 @@ static int serial2002_tty_read(struct file *f, int timeout)
if (retries >= timeout)
break;
- if (__vfs_read(f, p, 1, &offset) == 1) {
+ if (kernel_read(f, &ch, 1, &pos) == 1) {
result = ch;
break;
}
usleep_range(100, 1000);
}
}
- set_fs(oldfs);
}
return result;
}
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index d11c6de9c777..6150d2780e22 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -223,11 +223,9 @@ static int ad7192_setup(struct ad7192_state *st,
struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
unsigned long long scale_uv;
int i, ret, id;
- u8 ones[6];
/* reset the serial interface */
- memset(&ones, 0xFF, 6);
- ret = spi_write(st->sd.spi, &ones, 6);
+ ret = ad_sd_reset(&st->sd, 48);
if (ret < 0)
goto out;
usleep_range(500, 1000); /* Wait for at least 500us */
diff --git a/drivers/staging/lustre/lnet/libcfs/tracefile.c b/drivers/staging/lustre/lnet/libcfs/tracefile.c
index 68f283a2744c..f916b475e767 100644
--- a/drivers/staging/lustre/lnet/libcfs/tracefile.c
+++ b/drivers/staging/lustre/lnet/libcfs/tracefile.c
@@ -731,8 +731,7 @@ int cfs_tracefile_dump_all_pages(char *filename)
__LASSERT_TAGE_INVARIANT(tage);
buf = kmap(tage->page);
- rc = vfs_write(filp, (__force const char __user *)buf,
- tage->used, &filp->f_pos);
+ rc = kernel_write(filp, buf, tage->used, &filp->f_pos);
kunmap(tage->page);
if (rc != (int)tage->used) {
@@ -976,7 +975,6 @@ static int tracefiled(void *arg)
struct tracefiled_ctl *tctl = arg;
struct cfs_trace_page *tage;
struct cfs_trace_page *tmp;
- mm_segment_t __oldfs;
struct file *filp;
char *buf;
int last_loop = 0;
@@ -1014,8 +1012,6 @@ static int tracefiled(void *arg)
__LASSERT(list_empty(&pc.pc_pages));
goto end_loop;
}
- __oldfs = get_fs();
- set_fs(get_ds());
list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) {
static loff_t f_pos;
@@ -1028,8 +1024,7 @@ static int tracefiled(void *arg)
f_pos = i_size_read(file_inode(filp));
buf = kmap(tage->page);
- rc = vfs_write(filp, (__force const char __user *)buf,
- tage->used, &f_pos);
+ rc = kernel_write(filp, buf, tage->used, &f_pos);
kunmap(tage->page);
if (rc != (int)tage->used) {
@@ -1040,7 +1035,6 @@ static int tracefiled(void *arg)
break;
}
}
- set_fs(__oldfs);
filp_close(filp, NULL);
put_pages_on_daemon_list(&pc);
diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
index d855129768f8..25393e3a0fe8 100644
--- a/drivers/staging/lustre/lustre/llite/llite_lib.c
+++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
@@ -210,7 +210,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
data->ocd_ibits_known = MDS_INODELOCK_FULL;
data->ocd_version = LUSTRE_VERSION_CODE;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
data->ocd_connect_flags |= OBD_CONNECT_RDONLY;
if (sbi->ll_flags & LL_SBI_USER_XATTR)
data->ocd_connect_flags |= OBD_CONNECT_XATTR;
@@ -2031,7 +2031,7 @@ int ll_remount_fs(struct super_block *sb, int *flags, char *data)
int err;
__u32 read_only;
- if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) {
+ if ((bool)(*flags & MS_RDONLY) != sb_rdonly(sb)) {
read_only = *flags & MS_RDONLY;
err = obd_set_info_async(NULL, sbi->ll_md_exp,
sizeof(KEY_READ_ONLY),
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c
index 4897dbd3286d..5cc2b3255207 100644
--- a/drivers/staging/lustre/lustre/llite/namei.c
+++ b/drivers/staging/lustre/lustre/llite/namei.c
@@ -561,8 +561,7 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
}
}
- if (it->it_op & IT_OPEN && it->it_flags & FMODE_WRITE &&
- dentry->d_sb->s_flags & MS_RDONLY)
+ if (it->it_op & IT_OPEN && it->it_flags & FMODE_WRITE && sb_rdonly(dentry->d_sb))
return ERR_PTR(-EROFS);
if (it->it_op & IT_CREAT)
diff --git a/drivers/staging/lustre/lustre/obdclass/kernelcomm.c b/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
index 8f0707a27a83..4f0a42633d5a 100644
--- a/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
+++ b/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
@@ -52,7 +52,6 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
struct kuc_hdr *kuch = (struct kuc_hdr *)payload;
ssize_t count = kuch->kuc_msglen;
loff_t offset = 0;
- mm_segment_t fs;
int rc = -ENXIO;
if (IS_ERR_OR_NULL(filp))
@@ -63,18 +62,14 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
return rc;
}
- fs = get_fs();
- set_fs(KERNEL_DS);
while (count > 0) {
- rc = vfs_write(filp, (void __force __user *)payload,
- count, &offset);
+ rc = kernel_write(filp, payload, count, &offset);
if (rc < 0)
break;
count -= rc;
payload += rc;
rc = 0;
}
- set_fs(fs);
if (rc < 0)
CWARN("message send failed (%d)\n", rc);
diff --git a/drivers/staging/mt29f_spinand/mt29f_spinand.c b/drivers/staging/mt29f_spinand/mt29f_spinand.c
index a4e3ae8f0c85..87595c594b12 100644
--- a/drivers/staging/mt29f_spinand/mt29f_spinand.c
+++ b/drivers/staging/mt29f_spinand/mt29f_spinand.c
@@ -18,7 +18,7 @@
#include <linux/delay.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/spi/spi.h>
#include "mt29f_spinand.h"
@@ -496,8 +496,12 @@ static int spinand_program_page(struct spi_device *spi_nand,
if (!wbuf)
return -ENOMEM;
- enable_read_hw_ecc = 0;
- spinand_read_page(spi_nand, page_id, 0, CACHE_BUF, wbuf);
+ enable_read_hw_ecc = 1;
+ retval = spinand_read_page(spi_nand, page_id, 0, CACHE_BUF, wbuf);
+ if (retval < 0) {
+ dev_err(&spi_nand->dev, "ecc error on read page!!!\n");
+ return retval;
+ }
for (i = offset, j = 0; i < len; i++, j++)
wbuf[i] &= buf[j];
diff --git a/drivers/staging/pi433/rf69.c b/drivers/staging/pi433/rf69.c
index c4b1b218ea38..290b419aa9dd 100644
--- a/drivers/staging/pi433/rf69.c
+++ b/drivers/staging/pi433/rf69.c
@@ -570,12 +570,6 @@ int rf69_set_dio_mapping(struct spi_device *spi, u8 DIONumber, u8 value)
dev_dbg(&spi->dev, "set: DIO mapping");
#endif
- // check DIO number
- if (DIONumber > 5) {
- dev_dbg(&spi->dev, "set: illegal input param");
- return -EINVAL;
- }
-
switch (DIONumber) {
case 0: mask=MASK_DIO0; shift=SHIFT_DIO0; regaddr=REG_DIOMAPPING1; break;
case 1: mask=MASK_DIO1; shift=SHIFT_DIO1; regaddr=REG_DIOMAPPING1; break;
@@ -583,6 +577,9 @@ int rf69_set_dio_mapping(struct spi_device *spi, u8 DIONumber, u8 value)
case 3: mask=MASK_DIO3; shift=SHIFT_DIO3; regaddr=REG_DIOMAPPING1; break;
case 4: mask=MASK_DIO4; shift=SHIFT_DIO4; regaddr=REG_DIOMAPPING2; break;
case 5: mask=MASK_DIO5; shift=SHIFT_DIO5; regaddr=REG_DIOMAPPING2; break;
+ default:
+ dev_dbg(&spi->dev, "set: illegal input param");
+ return -EINVAL;
}
// read reg
diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme.c b/drivers/staging/rtl8723bs/core/rtw_mlme.c
index 6b778206a1a3..cb8a95aabd6c 100644
--- a/drivers/staging/rtl8723bs/core/rtw_mlme.c
+++ b/drivers/staging/rtl8723bs/core/rtw_mlme.c
@@ -119,9 +119,8 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv)
{
- rtw_free_mlme_priv_ie_data(pmlmepriv);
-
if (pmlmepriv) {
+ rtw_free_mlme_priv_ie_data(pmlmepriv);
if (pmlmepriv->free_bss_buf) {
vfree(pmlmepriv->free_bss_buf);
}
diff --git a/drivers/staging/rtl8723bs/os_dep/rtw_proc.c b/drivers/staging/rtl8723bs/os_dep/rtw_proc.c
index 92277457aba4..ce1dd6f9036f 100644
--- a/drivers/staging/rtl8723bs/os_dep/rtw_proc.c
+++ b/drivers/staging/rtl8723bs/os_dep/rtw_proc.c
@@ -311,6 +311,8 @@ static ssize_t proc_set_cam(struct file *file, const char __user *buffer, size_t
if (num < 2)
return count;
+ if (id >= TOTAL_CAM_ENTRY)
+ return -EINVAL;
if (strcmp("c", cmd) == 0) {
_clear_cam_entry(adapter, id);
diff --git a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c
index 5f84526cb5b5..edbf6af1c8b7 100644
--- a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c
+++ b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c
@@ -2901,11 +2901,11 @@ halmac_update_datapack_88xx(struct halmac_adapter *halmac_adapter,
if (halmac_adapter->fw_version.h2c_version < 4)
return HALMAC_RET_FW_NO_SUPPORT;
+ driver_adapter = halmac_adapter->driver_adapter;
+
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"[TRACE]%s ==========>\n", __func__);
- driver_adapter = halmac_adapter->driver_adapter;
-
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"[TRACE]%s <==========\n", __func__);
diff --git a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c
index f33024e4d853..544f638ed3ef 100644
--- a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c
+++ b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c
@@ -1618,10 +1618,11 @@ halmac_send_h2c_set_pwr_mode_88xx(struct halmac_adapter *halmac_adapter,
void *driver_adapter = NULL;
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
+ driver_adapter = halmac_adapter->driver_adapter;
+
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"%s!!\n", __func__);
- driver_adapter = halmac_adapter->driver_adapter;
h2c_header = h2c_buff;
h2c_cmd = h2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX;
@@ -1713,10 +1714,11 @@ halmac_media_status_rpt_88xx(struct halmac_adapter *halmac_adapter, u8 op_mode,
void *driver_adapter = NULL;
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
+ driver_adapter = halmac_adapter->driver_adapter;
+
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"halmac_send_h2c_set_pwr_mode_88xx!!\n");
- driver_adapter = halmac_adapter->driver_adapter;
h2c_header = H2c_buff;
h2c_cmd = h2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX;
@@ -2143,10 +2145,11 @@ halmac_func_ctrl_ch_switch_88xx(struct halmac_adapter *halmac_adapter,
enum halmac_cmd_process_status *process_status =
&halmac_adapter->halmac_state.scan_state_set.process_status;
+ driver_adapter = halmac_adapter->driver_adapter;
+
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"halmac_ctrl_ch_switch!!\n");
- driver_adapter = halmac_adapter->driver_adapter;
halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
if (halmac_transition_scan_state_88xx(
@@ -2276,15 +2279,13 @@ enum halmac_ret_status halmac_send_h2c_update_bcn_parse_info_88xx(
{
u8 h2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = {0};
u16 h2c_seq_mum = 0;
- void *driver_adapter = NULL;
+ void *driver_adapter = halmac_adapter->driver_adapter;
struct halmac_h2c_header_info h2c_header_info;
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
"%s!!\n", __func__);
- driver_adapter = halmac_adapter->driver_adapter;
-
UPDATE_BEACON_PARSING_INFO_SET_FUNC_EN(h2c_buff, bcn_ie_info->func_en);
UPDATE_BEACON_PARSING_INFO_SET_SIZE_TH(h2c_buff, bcn_ie_info->size_th);
UPDATE_BEACON_PARSING_INFO_SET_TIMEOUT(h2c_buff, bcn_ie_info->timeout);
diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c
index 67956e24779c..56f7be6af1f6 100644
--- a/drivers/staging/speakup/main.c
+++ b/drivers/staging/speakup/main.c
@@ -1376,6 +1376,8 @@ static void reset_highlight_buffers(struct vc_data *);
static int read_all_key;
+static int in_keyboard_notifier;
+
static void start_read_all_timer(struct vc_data *vc, int command);
enum {
@@ -1408,7 +1410,10 @@ static void read_all_doc(struct vc_data *vc)
cursor_track = read_all_mode;
spk_reset_index_count(0);
if (get_sentence_buf(vc, 0) == -1) {
- kbd_fakekey2(vc, RA_DOWN_ARROW);
+ del_timer(&cursor_timer);
+ if (!in_keyboard_notifier)
+ speakup_fake_down_arrow();
+ start_read_all_timer(vc, RA_DOWN_ARROW);
} else {
say_sentence_num(0, 0);
synth_insert_next_index(0);
@@ -2212,8 +2217,10 @@ static int keyboard_notifier_call(struct notifier_block *nb,
int ret = NOTIFY_OK;
static int keycode; /* to hold the current keycode */
+ in_keyboard_notifier = 1;
+
if (vc->vc_mode == KD_GRAPHICS)
- return ret;
+ goto out;
/*
* First, determine whether we are handling a fake keypress on
@@ -2225,7 +2232,7 @@ static int keyboard_notifier_call(struct notifier_block *nb,
*/
if (speakup_fake_key_pressed())
- return ret;
+ goto out;
switch (code) {
case KBD_KEYCODE:
@@ -2266,6 +2273,8 @@ static int keyboard_notifier_call(struct notifier_block *nb,
break;
}
}
+out:
+ in_keyboard_notifier = 0;
return ret;
}
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 74cce4f1a7bd..27ecf6fb49fd 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1826,7 +1826,7 @@ static __init int visorutil_spar_detect(void)
return 0;
}
-static int init_unisys(void)
+static int __init init_unisys(void)
{
int result;
@@ -1841,7 +1841,7 @@ static int init_unisys(void)
return 0;
};
-static void exit_unisys(void)
+static void __exit exit_unisys(void)
{
acpi_bus_unregister_driver(&unisys_acpi_driver);
}
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
index 0159ca4407d8..be08849175ea 100644
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
@@ -612,18 +612,20 @@ free_pagelist(struct vchiq_pagelist_info *pagelistinfo,
if (head_bytes > actual)
head_bytes = actual;
- memcpy((char *)page_address(pages[0]) +
+ memcpy((char *)kmap(pages[0]) +
pagelist->offset,
fragments,
head_bytes);
+ kunmap(pages[0]);
}
if ((actual >= 0) && (head_bytes < actual) &&
(tail_bytes != 0)) {
- memcpy((char *)page_address(pages[num_pages - 1]) +
+ memcpy((char *)kmap(pages[num_pages - 1]) +
((pagelist->offset + actual) &
(PAGE_SIZE - 1) & ~(g_cache_line_size - 1)),
fragments + g_cache_line_size,
tail_bytes);
+ kunmap(pages[num_pages - 1]);
}
down(&g_free_fragments_mutex);
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index a91b7c25ffd4..928127642574 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -896,13 +896,14 @@ static int core_alua_write_tpg_metadata(
u32 md_buf_len)
{
struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
+ loff_t pos = 0;
int ret;
if (IS_ERR(file)) {
pr_err("filp_open(%s) for ALUA metadata failed\n", path);
return -ENODEV;
}
- ret = kernel_write(file, md_buf, md_buf_len, 0);
+ ret = kernel_write(file, md_buf, md_buf_len, &pos);
if (ret < 0)
pr_err("Error writing ALUA metadata file: %s\n", path);
fput(file);
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index 24cf11d9e50a..c629817a8854 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -443,7 +443,7 @@ fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb,
for (prot = 0; prot < prot_length;) {
sector_t len = min_t(sector_t, bufsize, prot_length - prot);
- ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot);
+ ssize_t ret = kernel_write(prot_fd, buf, len, &pos);
if (ret != len) {
pr_err("vfs_write to prot file failed: %zd\n", ret);
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 6d5def64db61..dd2cd8048582 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -1974,6 +1974,7 @@ static int __core_scsi3_write_aptpl_to_file(
char path[512];
u32 pr_aptpl_buf_len;
int ret;
+ loff_t pos = 0;
memset(path, 0, 512);
@@ -1993,7 +1994,7 @@ static int __core_scsi3_write_aptpl_to_file(
pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */
- ret = kernel_write(file, buf, pr_aptpl_buf_len, 0);
+ ret = kernel_write(file, buf, pr_aptpl_buf_len, &pos);
if (ret < 0)
pr_debug("Error writing APTPL metadata file: %s\n", path);
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index 58169e519422..7952357df9c8 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -224,13 +224,14 @@ static void optee_release(struct tee_context *ctx)
if (!IS_ERR(shm)) {
arg = tee_shm_get_va(shm, 0);
/*
- * If va2pa fails for some reason, we can't call
- * optee_close_session(), only free the memory. Secure OS
- * will leak sessions and finally refuse more sessions, but
- * we will at least let normal world reclaim its memory.
+ * If va2pa fails for some reason, we can't call into
+ * secure world, only free the memory. Secure OS will leak
+ * sessions and finally refuse more sessions, but we will
+ * at least let normal world reclaim its memory.
*/
if (!IS_ERR(arg))
- tee_shm_va2pa(shm, arg, &parg);
+ if (tee_shm_va2pa(shm, arg, &parg))
+ arg = NULL; /* prevent usage of parg below */
}
list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list,
@@ -258,7 +259,7 @@ static void optee_release(struct tee_context *ctx)
}
}
-static struct tee_driver_ops optee_ops = {
+static const struct tee_driver_ops optee_ops = {
.get_version = optee_get_version,
.open = optee_open,
.release = optee_release,
@@ -268,13 +269,13 @@ static struct tee_driver_ops optee_ops = {
.cancel_req = optee_cancel_req,
};
-static struct tee_desc optee_desc = {
+static const struct tee_desc optee_desc = {
.name = DRIVER_NAME "-clnt",
.ops = &optee_ops,
.owner = THIS_MODULE,
};
-static struct tee_driver_ops optee_supp_ops = {
+static const struct tee_driver_ops optee_supp_ops = {
.get_version = optee_get_version,
.open = optee_open,
.release = optee_release,
@@ -282,7 +283,7 @@ static struct tee_driver_ops optee_supp_ops = {
.supp_send = optee_supp_send,
};
-static struct tee_desc optee_supp_desc = {
+static const struct tee_desc optee_supp_desc = {
.name = DRIVER_NAME "-supp",
.ops = &optee_supp_ops,
.owner = THIS_MODULE,
diff --git a/drivers/tee/optee/optee_smc.h b/drivers/tee/optee/optee_smc.h
index 13b7c98cdf25..069c8e1429de 100644
--- a/drivers/tee/optee/optee_smc.h
+++ b/drivers/tee/optee/optee_smc.h
@@ -298,7 +298,7 @@ struct optee_smc_disable_shm_cache_result {
OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE)
/*
- * Resume from RPC (for example after processing an IRQ)
+ * Resume from RPC (for example after processing a foreign interrupt)
*
* Call register usage:
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC
@@ -383,19 +383,19 @@ struct optee_smc_disable_shm_cache_result {
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FREE)
/*
- * Deliver an IRQ in normal world.
+ * Deliver foreign interrupt to normal world.
*
* "Call" register usage:
- * a0 OPTEE_SMC_RETURN_RPC_IRQ
+ * a0 OPTEE_SMC_RETURN_RPC_FOREIGN_INTR
* a1-7 Resume information, must be preserved
*
* "Return" register usage:
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
* a1-7 Preserved
*/
-#define OPTEE_SMC_RPC_FUNC_IRQ 4
-#define OPTEE_SMC_RETURN_RPC_IRQ \
- OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_IRQ)
+#define OPTEE_SMC_RPC_FUNC_FOREIGN_INTR 4
+#define OPTEE_SMC_RETURN_RPC_FOREIGN_INTR \
+ OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FOREIGN_INTR)
/*
* Do an RPC request. The supplied struct optee_msg_arg tells which
diff --git a/drivers/tee/optee/rpc.c b/drivers/tee/optee/rpc.c
index 8814eca06021..cef417f4f4d2 100644
--- a/drivers/tee/optee/rpc.c
+++ b/drivers/tee/optee/rpc.c
@@ -140,11 +140,8 @@ static void handle_rpc_func_cmd_wait(struct optee_msg_arg *arg)
msec_to_wait = arg->params[0].u.value.a;
- /* set task's state to interruptible sleep */
- set_current_state(TASK_INTERRUPTIBLE);
-
- /* take a nap */
- msleep(msec_to_wait);
+ /* Go to interruptible sleep */
+ msleep_interruptible(msec_to_wait);
arg->ret = TEEC_SUCCESS;
return;
@@ -374,11 +371,11 @@ void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param)
shm = reg_pair_to_ptr(param->a1, param->a2);
tee_shm_free(shm);
break;
- case OPTEE_SMC_RPC_FUNC_IRQ:
+ case OPTEE_SMC_RPC_FUNC_FOREIGN_INTR:
/*
- * An IRQ was raised while secure world was executing,
- * since all IRQs are handled in Linux a dummy RPC is
- * performed to let Linux take the IRQ through the normal
+ * A foreign interrupt was raised while secure world was
+ * executing, since they are handled in Linux a dummy RPC is
+ * performed to let Linux take the interrupt through the normal
* vector.
*/
break;
diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c
index 5c60bf4423e6..58a5009eacc3 100644
--- a/drivers/tee/tee_core.c
+++ b/drivers/tee/tee_core.c
@@ -90,8 +90,13 @@ static int tee_ioctl_version(struct tee_context *ctx,
struct tee_ioctl_version_data vers;
ctx->teedev->desc->ops->get_version(ctx->teedev, &vers);
+
+ if (ctx->teedev->desc->flags & TEE_DESC_PRIVILEGED)
+ vers.gen_caps |= TEE_GEN_CAP_PRIVILEGED;
+
if (copy_to_user(uvers, &vers, sizeof(vers)))
return -EFAULT;
+
return 0;
}
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index d356d7f025eb..4bc7956cefc4 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -80,7 +80,7 @@ static int tee_shm_op_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
size, vma->vm_page_prot);
}
-static struct dma_buf_ops tee_shm_dma_buf_ops = {
+static const struct dma_buf_ops tee_shm_dma_buf_ops = {
.map_dma_buf = tee_shm_op_map_dma_buf,
.unmap_dma_buf = tee_shm_op_unmap_dma_buf,
.release = tee_shm_op_release,
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index b5b5facb8747..07002df4f83a 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -342,7 +342,7 @@ config X86_PKG_TEMP_THERMAL
config INTEL_SOC_DTS_IOSF_CORE
tristate
- depends on X86
+ depends on X86 && PCI
select IOSF_MBI
help
This is becoming a common feature for Intel SoCs to expose the additional
@@ -352,7 +352,7 @@ config INTEL_SOC_DTS_IOSF_CORE
config INTEL_SOC_DTS_THERMAL
tristate "Intel SoCs DTS thermal driver"
- depends on X86
+ depends on X86 && PCI
select INTEL_SOC_DTS_IOSF_CORE
select THERMAL_WRITABLE_TRIPS
help
@@ -473,4 +473,12 @@ config ZX2967_THERMAL
the primitive temperature sensor embedded in zx2967 SoCs.
This sensor generates the real time die temperature.
+config UNIPHIER_THERMAL
+ tristate "Socionext UniPhier thermal driver"
+ depends on ARCH_UNIPHIER || COMPILE_TEST
+ depends on THERMAL_OF && MFD_SYSCON
+ help
+ Enable this to plug in UniPhier on-chip PVT thermal driver into the
+ thermal framework. The driver supports CPU thermal zone temperature
+ reporting and a couple of trip points.
endif
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index 094d7039981c..8b79bca23536 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -59,3 +59,4 @@ obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o
obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o
obj-$(CONFIG_GENERIC_ADC_THERMAL) += thermal-generic-adc.o
obj-$(CONFIG_ZX2967_THERMAL) += zx2967_thermal.o
+obj-$(CONFIG_UNIPHIER_THERMAL) += uniphier_thermal.o
diff --git a/drivers/thermal/broadcom/bcm2835_thermal.c b/drivers/thermal/broadcom/bcm2835_thermal.c
index e6863c841662..a4d6a0e2e993 100644
--- a/drivers/thermal/broadcom/bcm2835_thermal.c
+++ b/drivers/thermal/broadcom/bcm2835_thermal.c
@@ -145,7 +145,7 @@ static void bcm2835_thermal_debugfs(struct platform_device *pdev)
debugfs_create_regset32("regset", 0444, data->debugfsdir, regset);
}
-static struct thermal_zone_of_device_ops bcm2835_thermal_ops = {
+static const struct thermal_zone_of_device_ops bcm2835_thermal_ops = {
.get_temp = bcm2835_thermal_get_temp,
};
diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c
index 9c3ce341eb97..bd3572c41585 100644
--- a/drivers/thermal/hisi_thermal.c
+++ b/drivers/thermal/hisi_thermal.c
@@ -206,7 +206,7 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp)
return 0;
}
-static struct thermal_zone_of_device_ops hisi_of_thermal_ops = {
+static const struct thermal_zone_of_device_ops hisi_of_thermal_ops = {
.get_temp = hisi_thermal_get_temp,
};
diff --git a/drivers/thermal/int340x_thermal/acpi_thermal_rel.c b/drivers/thermal/int340x_thermal/acpi_thermal_rel.c
index 51ceb80212a7..c719167e9f28 100644
--- a/drivers/thermal/int340x_thermal/acpi_thermal_rel.c
+++ b/drivers/thermal/int340x_thermal/acpi_thermal_rel.c
@@ -228,7 +228,7 @@ static void get_single_name(acpi_handle handle, char *name)
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER};
if (ACPI_FAILURE(acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer)))
- pr_warn("Failed get name from handle\n");
+ pr_warn("Failed to get device name from acpi handle\n");
else {
memcpy(name, buffer.pointer, ACPI_NAME_SIZE);
kfree(buffer.pointer);
diff --git a/drivers/thermal/int340x_thermal/acpi_thermal_rel.h b/drivers/thermal/int340x_thermal/acpi_thermal_rel.h
index f00700bc9d79..65075b174329 100644
--- a/drivers/thermal/int340x_thermal/acpi_thermal_rel.h
+++ b/drivers/thermal/int340x_thermal/acpi_thermal_rel.h
@@ -34,10 +34,10 @@ struct trt {
acpi_handle target;
u64 influence;
u64 sample_period;
- u64 reverved1;
- u64 reverved2;
- u64 reverved3;
- u64 reverved4;
+ u64 reserved1;
+ u64 reserved2;
+ u64 reserved3;
+ u64 reserved4;
} __packed;
#define ACPI_NR_ART_ELEMENTS 13
diff --git a/drivers/thermal/int340x_thermal/int3400_thermal.c b/drivers/thermal/int340x_thermal/int3400_thermal.c
index a9ec94ed7a42..8ee38f55c7f3 100644
--- a/drivers/thermal/int340x_thermal/int3400_thermal.c
+++ b/drivers/thermal/int340x_thermal/int3400_thermal.c
@@ -16,6 +16,8 @@
#include <linux/thermal.h>
#include "acpi_thermal_rel.h"
+#define INT3400_THERMAL_TABLE_CHANGED 0x83
+
enum int3400_thermal_uuid {
INT3400_THERMAL_PASSIVE_1,
INT3400_THERMAL_ACTIVE,
@@ -104,7 +106,7 @@ static struct attribute *uuid_attrs[] = {
NULL
};
-static struct attribute_group uuid_attribute_group = {
+static const struct attribute_group uuid_attribute_group = {
.attrs = uuid_attrs,
.name = "uuids"
};
@@ -185,6 +187,35 @@ static int int3400_thermal_run_osc(acpi_handle handle,
return result;
}
+static void int3400_notify(acpi_handle handle,
+ u32 event,
+ void *data)
+{
+ struct int3400_thermal_priv *priv = data;
+ char *thermal_prop[5];
+
+ if (!priv)
+ return;
+
+ switch (event) {
+ case INT3400_THERMAL_TABLE_CHANGED:
+ thermal_prop[0] = kasprintf(GFP_KERNEL, "NAME=%s",
+ priv->thermal->type);
+ thermal_prop[1] = kasprintf(GFP_KERNEL, "TEMP=%d",
+ priv->thermal->temperature);
+ thermal_prop[2] = kasprintf(GFP_KERNEL, "TRIP=");
+ thermal_prop[3] = kasprintf(GFP_KERNEL, "EVENT=%d",
+ THERMAL_TABLE_CHANGED);
+ thermal_prop[4] = NULL;
+ kobject_uevent_env(&priv->thermal->device.kobj, KOBJ_CHANGE,
+ thermal_prop);
+ break;
+ default:
+ dev_err(&priv->adev->dev, "Unsupported event [0x%x]\n", event);
+ break;
+ }
+}
+
static int int3400_thermal_get_temp(struct thermal_zone_device *thermal,
int *temp)
{
@@ -290,6 +321,12 @@ static int int3400_thermal_probe(struct platform_device *pdev)
if (result)
goto free_zone;
+ result = acpi_install_notify_handler(
+ priv->adev->handle, ACPI_DEVICE_NOTIFY, int3400_notify,
+ (void *)priv);
+ if (result)
+ goto free_zone;
+
return 0;
free_zone:
@@ -306,6 +343,10 @@ static int int3400_thermal_remove(struct platform_device *pdev)
{
struct int3400_thermal_priv *priv = platform_get_drvdata(pdev);
+ acpi_remove_notify_handler(
+ priv->adev->handle, ACPI_DEVICE_NOTIFY,
+ int3400_notify);
+
if (!priv->rel_misc_dev_res)
acpi_thermal_rel_misc_device_remove(priv->adev->handle);
diff --git a/drivers/thermal/int340x_thermal/int3406_thermal.c b/drivers/thermal/int340x_thermal/int3406_thermal.c
index 1891f34ab7fc..f69ab026ba24 100644
--- a/drivers/thermal/int340x_thermal/int3406_thermal.c
+++ b/drivers/thermal/int340x_thermal/int3406_thermal.c
@@ -21,39 +21,33 @@
struct int3406_thermal_data {
int upper_limit;
- int upper_limit_index;
int lower_limit;
- int lower_limit_index;
acpi_handle handle;
struct acpi_video_device_brightness *br;
struct backlight_device *raw_bd;
struct thermal_cooling_device *cooling_dev;
};
-static int int3406_thermal_to_raw(int level, struct int3406_thermal_data *d)
-{
- int max_level = d->br->levels[d->br->count - 1];
- int raw_max = d->raw_bd->props.max_brightness;
-
- return level * raw_max / max_level;
-}
-
-static int int3406_thermal_to_acpi(int level, struct int3406_thermal_data *d)
-{
- int raw_max = d->raw_bd->props.max_brightness;
- int max_level = d->br->levels[d->br->count - 1];
-
- return level * max_level / raw_max;
-}
+/*
+ * According to the ACPI spec,
+ * "Each brightness level is represented by a number between 0 and 100,
+ * and can be thought of as a percentage. For example, 50 can be 50%
+ * power consumption or 50% brightness, as defined by the OEM."
+ *
+ * As int3406 device uses this value to communicate with the native
+ * graphics driver, we make the assumption that it represents
+ * the percentage of brightness only
+ */
+#define ACPI_TO_RAW(v, d) (d->raw_bd->props.max_brightness * v / 100)
+#define RAW_TO_ACPI(v, d) (v * 100 / d->raw_bd->props.max_brightness)
static int
int3406_thermal_get_max_state(struct thermal_cooling_device *cooling_dev,
unsigned long *state)
{
struct int3406_thermal_data *d = cooling_dev->devdata;
- int index = d->lower_limit_index ? d->lower_limit_index : 2;
- *state = d->br->count - 1 - index;
+ *state = d->upper_limit - d->lower_limit;
return 0;
}
@@ -62,19 +56,15 @@ int3406_thermal_set_cur_state(struct thermal_cooling_device *cooling_dev,
unsigned long state)
{
struct int3406_thermal_data *d = cooling_dev->devdata;
- int level, raw_level;
+ int acpi_level, raw_level;
- if (state > d->br->count - 3)
+ if (state > d->upper_limit - d->lower_limit)
return -EINVAL;
- state = d->br->count - 1 - state;
- level = d->br->levels[state];
+ acpi_level = d->br->levels[d->upper_limit - state];
- if ((d->upper_limit && level > d->upper_limit) ||
- (d->lower_limit && level < d->lower_limit))
- return -EINVAL;
+ raw_level = ACPI_TO_RAW(acpi_level, d);
- raw_level = int3406_thermal_to_raw(level, d);
return backlight_device_set_brightness(d->raw_bd, raw_level);
}
@@ -83,27 +73,22 @@ int3406_thermal_get_cur_state(struct thermal_cooling_device *cooling_dev,
unsigned long *state)
{
struct int3406_thermal_data *d = cooling_dev->devdata;
- int raw_level, level, i;
- int *levels = d->br->levels;
+ int acpi_level;
+ int index;
- raw_level = d->raw_bd->props.brightness;
- level = int3406_thermal_to_acpi(raw_level, d);
+ acpi_level = RAW_TO_ACPI(d->raw_bd->props.brightness, d);
/*
- * There is no 1:1 mapping between the firmware interface level with the
- * raw interface level, we will have to find one that is close enough.
+ * There is no 1:1 mapping between the firmware interface level
+ * with the raw interface level, we will have to find one that is
+ * right above it.
*/
- for (i = 2; i < d->br->count; i++) {
- if (level < levels[i]) {
- if (i == 2)
- break;
- if ((level - levels[i - 1]) < (levels[i] - level))
- i--;
+ for (index = d->lower_limit; index < d->upper_limit; index++) {
+ if (acpi_level <= d->br->levels[index])
break;
- }
}
- *state = d->br->count - 1 - i;
+ *state = d->upper_limit - index;
return 0;
}
@@ -117,7 +102,7 @@ static int int3406_thermal_get_index(int *array, int nr, int value)
{
int i;
- for (i = 0; i < nr; i++) {
+ for (i = 2; i < nr; i++) {
if (array[i] == value)
break;
}
@@ -128,27 +113,20 @@ static void int3406_thermal_get_limit(struct int3406_thermal_data *d)
{
acpi_status status;
unsigned long long lower_limit, upper_limit;
- int index;
status = acpi_evaluate_integer(d->handle, "DDDL", NULL, &lower_limit);
- if (ACPI_SUCCESS(status)) {
- index = int3406_thermal_get_index(d->br->levels, d->br->count,
- lower_limit);
- if (index > 0) {
- d->lower_limit = (int)lower_limit;
- d->lower_limit_index = index;
- }
- }
+ if (ACPI_SUCCESS(status))
+ d->lower_limit = int3406_thermal_get_index(d->br->levels,
+ d->br->count, lower_limit);
status = acpi_evaluate_integer(d->handle, "DDPC", NULL, &upper_limit);
- if (ACPI_SUCCESS(status)) {
- index = int3406_thermal_get_index(d->br->levels, d->br->count,
- upper_limit);
- if (index > 0) {
- d->upper_limit = (int)upper_limit;
- d->upper_limit_index = index;
- }
- }
+ if (ACPI_SUCCESS(status))
+ d->upper_limit = int3406_thermal_get_index(d->br->levels,
+ d->br->count, upper_limit);
+
+ /* lower_limit and upper_limit should be always set */
+ d->lower_limit = d->lower_limit > 0 ? d->lower_limit : 2;
+ d->upper_limit = d->upper_limit > 0 ? d->upper_limit : d->br->count - 1;
}
static void int3406_notify(acpi_handle handle, u32 event, void *data)
diff --git a/drivers/thermal/int340x_thermal/processor_thermal_device.c b/drivers/thermal/int340x_thermal/processor_thermal_device.c
index ff3b36f339e3..f02341f7134d 100644
--- a/drivers/thermal/int340x_thermal/processor_thermal_device.c
+++ b/drivers/thermal/int340x_thermal/processor_thermal_device.c
@@ -127,7 +127,7 @@ static struct attribute *power_limit_attrs[] = {
NULL
};
-static struct attribute_group power_limit_attribute_group = {
+static const struct attribute_group power_limit_attribute_group = {
.attrs = power_limit_attrs,
.name = "power_limits"
};
diff --git a/drivers/thermal/intel_pch_thermal.c b/drivers/thermal/intel_pch_thermal.c
index 2b49e8d0fe9e..c60b1cfcc64e 100644
--- a/drivers/thermal/intel_pch_thermal.c
+++ b/drivers/thermal/intel_pch_thermal.c
@@ -49,7 +49,7 @@
#define WPT_TSGPEN 0x84 /* General Purpose Event Enables */
/* Wildcat Point-LP PCH Thermal Register bit definitions */
-#define WPT_TEMP_TSR 0x00ff /* Temp TS Reading */
+#define WPT_TEMP_TSR 0x01ff /* Temp TS Reading */
#define WPT_TSC_CPDE 0x01 /* Catastrophic Power-Down Enable */
#define WPT_TSS_TSDSS 0x10 /* Thermal Sensor Dynamic Shutdown Status */
#define WPT_TSS_GPES 0x08 /* GPE status */
@@ -125,7 +125,7 @@ static int pch_wpt_init(struct pch_thermal_device *ptd, int *nr_trips)
*nr_trips = 0;
/* Check if BIOS has already enabled thermal sensor */
- if (WPT_TSS_TSDSS & readb(ptd->hw_base + WPT_TSS)) {
+ if (WPT_TSEL_ETS & readb(ptd->hw_base + WPT_TSEL)) {
ptd->bios_enabled = true;
goto read_trips;
}
@@ -141,7 +141,7 @@ static int pch_wpt_init(struct pch_thermal_device *ptd, int *nr_trips)
}
writeb(tsel|WPT_TSEL_ETS, ptd->hw_base + WPT_TSEL);
- if (!(WPT_TSS_TSDSS & readb(ptd->hw_base + WPT_TSS))) {
+ if (!(WPT_TSEL_ETS & readb(ptd->hw_base + WPT_TSEL))) {
dev_err(&ptd->pdev->dev, "Sensor can't be enabled\n");
return -ENODEV;
}
@@ -174,9 +174,9 @@ read_trips:
static int pch_wpt_get_temp(struct pch_thermal_device *ptd, int *temp)
{
- u8 wpt_temp;
+ u16 wpt_temp;
- wpt_temp = WPT_TEMP_TSR & readl(ptd->hw_base + WPT_TEMP);
+ wpt_temp = WPT_TEMP_TSR & readw(ptd->hw_base + WPT_TEMP);
/* Resolution of 1/2 degree C and an offset of -50C */
*temp = (wpt_temp * 1000 / 2 - 50000);
@@ -387,7 +387,7 @@ static int intel_pch_thermal_resume(struct device *device)
return ptd->ops->resume(ptd);
}
-static struct pci_device_id intel_pch_thermal_id[] = {
+static const struct pci_device_id intel_pch_thermal_id[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCH_THERMAL_DID_HSW_1),
.driver_data = board_hsw, },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCH_THERMAL_DID_HSW_2),
diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c
index 7737f14846f9..1e61c09153c9 100644
--- a/drivers/thermal/mtk_thermal.c
+++ b/drivers/thermal/mtk_thermal.c
@@ -3,6 +3,7 @@
* Author: Hanyi Wu <[email protected]>
* Sascha Hauer <[email protected]>
* Dawei Chien <[email protected]>
+ * Louis Yu <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -111,9 +112,10 @@
/*
* Layout of the fuses providing the calibration data
- * These macros could be used for both MT8173 and MT2701.
- * MT8173 has five sensors and need five VTS calibration data,
- * and MT2701 has three sensors and need three VTS calibration data.
+ * These macros could be used for MT8173, MT2701, and MT2712.
+ * MT8173 has 5 sensors and needs 5 VTS calibration data.
+ * MT2701 has 3 sensors and needs 3 VTS calibration data.
+ * MT2712 has 4 sensors and needs 4 VTS calibration data.
*/
#define MT8173_CALIB_BUF0_VALID BIT(0)
#define MT8173_CALIB_BUF1_ADC_GE(x) (((x) >> 22) & 0x3ff)
@@ -124,6 +126,8 @@
#define MT8173_CALIB_BUF2_VTS_TSABB(x) (((x) >> 14) & 0x1ff)
#define MT8173_CALIB_BUF0_DEGC_CALI(x) (((x) >> 1) & 0x3f)
#define MT8173_CALIB_BUF0_O_SLOPE(x) (((x) >> 26) & 0x3f)
+#define MT8173_CALIB_BUF0_O_SLOPE_SIGN(x) (((x) >> 7) & 0x1)
+#define MT8173_CALIB_BUF1_ID(x) (((x) >> 9) & 0x1)
/* MT2701 thermal sensors */
#define MT2701_TS1 0
@@ -136,11 +140,26 @@
/* The total number of temperature sensors in the MT2701 */
#define MT2701_NUM_SENSORS 3
-#define THERMAL_NAME "mtk-thermal"
-
/* The number of sensing points per bank */
#define MT2701_NUM_SENSORS_PER_ZONE 3
+/* MT2712 thermal sensors */
+#define MT2712_TS1 0
+#define MT2712_TS2 1
+#define MT2712_TS3 2
+#define MT2712_TS4 3
+
+/* AUXADC channel 11 is used for the temperature sensors */
+#define MT2712_TEMP_AUXADC_CHANNEL 11
+
+/* The total number of temperature sensors in the MT2712 */
+#define MT2712_NUM_SENSORS 4
+
+/* The number of sensing points per bank */
+#define MT2712_NUM_SENSORS_PER_ZONE 4
+
+#define THERMAL_NAME "mtk-thermal"
+
struct mtk_thermal;
struct thermal_bank_cfg {
@@ -215,6 +234,21 @@ static const int mt2701_adcpnp[MT2701_NUM_SENSORS_PER_ZONE] = {
static const int mt2701_mux_values[MT2701_NUM_SENSORS] = { 0, 1, 16 };
+/* MT2712 thermal sensor data */
+static const int mt2712_bank_data[MT2712_NUM_SENSORS] = {
+ MT2712_TS1, MT2712_TS2, MT2712_TS3, MT2712_TS4
+};
+
+static const int mt2712_msr[MT2712_NUM_SENSORS_PER_ZONE] = {
+ TEMP_MSR0, TEMP_MSR1, TEMP_MSR2, TEMP_MSR3
+};
+
+static const int mt2712_adcpnp[MT2712_NUM_SENSORS_PER_ZONE] = {
+ TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2, TEMP_ADCPNP3
+};
+
+static const int mt2712_mux_values[MT2712_NUM_SENSORS] = { 0, 1, 2, 3 };
+
/**
* The MT8173 thermal controller has four banks. Each bank can read up to
* four temperature sensors simultaneously. The MT8173 has a total of 5
@@ -278,6 +312,31 @@ static const struct mtk_thermal_data mt2701_thermal_data = {
};
/**
+ * The MT2712 thermal controller has one bank, which can read up to
+ * four temperature sensors simultaneously. The MT2712 has a total of 4
+ * temperature sensors.
+ *
+ * The thermal core only gets the maximum temperature of this one bank,
+ * so the bank concept wouldn't be necessary here. However, the SVS (Smart
+ * Voltage Scaling) unit makes its decisions based on the same bank
+ * data.
+ */
+static const struct mtk_thermal_data mt2712_thermal_data = {
+ .auxadc_channel = MT2712_TEMP_AUXADC_CHANNEL,
+ .num_banks = 1,
+ .num_sensors = MT2712_NUM_SENSORS,
+ .bank_data = {
+ {
+ .num_sensors = 4,
+ .sensors = mt2712_bank_data,
+ },
+ },
+ .msr = mt2712_msr,
+ .adcpnp = mt2712_adcpnp,
+ .sensor_mux_values = mt2712_mux_values,
+};
+
+/**
* raw_to_mcelsius - convert a raw ADC value to mcelsius
* @mt: The thermal controller
* @raw: raw ADC value
@@ -552,7 +611,11 @@ static int mtk_thermal_get_calibration_data(struct device *dev,
mt->vts[MT8173_TS4] = MT8173_CALIB_BUF2_VTS_TS4(buf[2]);
mt->vts[MT8173_TSABB] = MT8173_CALIB_BUF2_VTS_TSABB(buf[2]);
mt->degc_cali = MT8173_CALIB_BUF0_DEGC_CALI(buf[0]);
- mt->o_slope = MT8173_CALIB_BUF0_O_SLOPE(buf[0]);
+ if (MT8173_CALIB_BUF1_ID(buf[1]) &
+ MT8173_CALIB_BUF0_O_SLOPE_SIGN(buf[0]))
+ mt->o_slope = -MT8173_CALIB_BUF0_O_SLOPE(buf[0]);
+ else
+ mt->o_slope = MT8173_CALIB_BUF0_O_SLOPE(buf[0]);
} else {
dev_info(dev, "Device not calibrated, using default calibration values\n");
}
@@ -571,6 +634,10 @@ static const struct of_device_id mtk_thermal_of_match[] = {
{
.compatible = "mediatek,mt2701-thermal",
.data = (void *)&mt2701_thermal_data,
+ },
+ {
+ .compatible = "mediatek,mt2712-thermal",
+ .data = (void *)&mt2712_thermal_data,
}, {
},
};
@@ -645,16 +712,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -EINVAL;
}
+ ret = device_reset(&pdev->dev);
+ if (ret)
+ return ret;
+
ret = clk_prepare_enable(mt->clk_auxadc);
if (ret) {
dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
return ret;
}
- ret = device_reset(&pdev->dev);
- if (ret)
- goto err_disable_clk_auxadc;
-
ret = clk_prepare_enable(mt->clk_peri_therm);
if (ret) {
dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
@@ -705,6 +772,7 @@ static struct platform_driver mtk_thermal_driver = {
module_platform_driver(mtk_thermal_driver);
+MODULE_AUTHOR("Louis Yu <[email protected]>");
MODULE_AUTHOR("Dawei Chien <[email protected]>");
MODULE_AUTHOR("Sascha Hauer <[email protected]>");
MODULE_AUTHOR("Hanyi Wu <[email protected]>");
diff --git a/drivers/thermal/qoriq_thermal.c b/drivers/thermal/qoriq_thermal.c
index 4362a69ac88d..c866cc165960 100644
--- a/drivers/thermal/qoriq_thermal.c
+++ b/drivers/thermal/qoriq_thermal.c
@@ -188,7 +188,7 @@ static void qoriq_tmu_init_device(struct qoriq_tmu_data *data)
tmu_write(data, TMR_DISABLE, &data->regs->tmr);
}
-static struct thermal_zone_of_device_ops tmu_tz_ops = {
+static const struct thermal_zone_of_device_ops tmu_tz_ops = {
.get_temp = tmu_get_temp,
};
diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c
index 37fcefd06d9f..203aca44a2bb 100644
--- a/drivers/thermal/rcar_gen3_thermal.c
+++ b/drivers/thermal/rcar_gen3_thermal.c
@@ -225,7 +225,7 @@ static int rcar_gen3_thermal_set_trips(void *devdata, int low, int high)
return 0;
}
-static struct thermal_zone_of_device_ops rcar_gen3_tz_of_ops = {
+static const struct thermal_zone_of_device_ops rcar_gen3_tz_of_ops = {
.get_temp = rcar_gen3_thermal_get_temp,
.set_trips = rcar_gen3_thermal_set_trips,
};
diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
index 4c7796512453..206035139110 100644
--- a/drivers/thermal/rockchip_thermal.c
+++ b/drivers/thermal/rockchip_thermal.c
@@ -320,6 +320,44 @@ static const struct tsadc_table rk3288_code_table[] = {
{0, 125000},
};
+static const struct tsadc_table rk3328_code_table[] = {
+ {0, -40000},
+ {296, -40000},
+ {304, -35000},
+ {313, -30000},
+ {331, -20000},
+ {340, -15000},
+ {349, -10000},
+ {359, -5000},
+ {368, 0},
+ {378, 5000},
+ {388, 10000},
+ {398, 15000},
+ {408, 20000},
+ {418, 25000},
+ {429, 30000},
+ {440, 35000},
+ {451, 40000},
+ {462, 45000},
+ {473, 50000},
+ {485, 55000},
+ {496, 60000},
+ {508, 65000},
+ {521, 70000},
+ {533, 75000},
+ {546, 80000},
+ {559, 85000},
+ {572, 90000},
+ {586, 95000},
+ {600, 100000},
+ {614, 105000},
+ {629, 110000},
+ {644, 115000},
+ {659, 120000},
+ {675, 125000},
+ {TSADCV2_DATA_MASK, 125000},
+};
+
static const struct tsadc_table rk3368_code_table[] = {
{0, -40000},
{106, -40000},
@@ -790,6 +828,29 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
},
};
+static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
+ .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
+ .chn_num = 1, /* one channels for tsadc */
+
+ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
+ .tshut_temp = 95000,
+
+ .initialize = rk_tsadcv2_initialize,
+ .irq_ack = rk_tsadcv3_irq_ack,
+ .control = rk_tsadcv3_control,
+ .get_temp = rk_tsadcv2_get_temp,
+ .set_alarm_temp = rk_tsadcv2_alarm_temp,
+ .set_tshut_temp = rk_tsadcv2_tshut_temp,
+ .set_tshut_mode = rk_tsadcv2_tshut_mode,
+
+ .table = {
+ .id = rk3328_code_table,
+ .length = ARRAY_SIZE(rk3328_code_table),
+ .data_mask = TSADCV2_DATA_MASK,
+ .mode = ADC_INCREMENT,
+ },
+};
+
static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
@@ -875,6 +936,10 @@ static const struct of_device_id of_rockchip_thermal_match[] = {
.data = (void *)&rk3288_tsadc_data,
},
{
+ .compatible = "rockchip,rk3328-tsadc",
+ .data = (void *)&rk3328_tsadc_data,
+ },
+ {
.compatible = "rockchip,rk3366-tsadc",
.data = (void *)&rk3366_tsadc_data,
},
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 7b8ef09d2b3c..ed805c7c5ace 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -1286,7 +1286,7 @@ static int exynos_map_dt_data(struct platform_device *pdev)
return 0;
}
-static struct thermal_zone_of_device_ops exynos_sensor_ops = {
+static const struct thermal_zone_of_device_ops exynos_sensor_ops = {
.get_temp = exynos_get_temp,
.set_emul_temp = exynos_tmu_set_emulation,
};
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 5a51c740e372..2b1b0ba393a4 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -390,7 +390,7 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
if (trip_type == THERMAL_TRIP_CRITICAL) {
dev_emerg(&tz->device,
- "critical temperature reached(%d C),shutting down\n",
+ "critical temperature reached (%d C), shutting down\n",
tz->temperature / 1000);
mutex_lock(&poweroff_lock);
if (!power_off_triggered) {
@@ -836,11 +836,7 @@ static void thermal_release(struct device *dev)
if (!strncmp(dev_name(dev), "thermal_zone",
sizeof("thermal_zone") - 1)) {
tz = to_thermal_zone(dev);
- kfree(tz->trip_type_attrs);
- kfree(tz->trip_temp_attrs);
- kfree(tz->trip_hyst_attrs);
- kfree(tz->trips_attribute_group.attrs);
- kfree(tz->device.groups);
+ thermal_zone_destroy_device_groups(tz);
kfree(tz);
} else if (!strncmp(dev_name(dev), "cooling_device",
sizeof("cooling_device") - 1)) {
@@ -1213,10 +1209,8 @@ thermal_zone_device_register(const char *type, int trips, int mask,
ida_init(&tz->ida);
mutex_init(&tz->lock);
result = ida_simple_get(&thermal_tz_ida, 0, 0, GFP_KERNEL);
- if (result < 0) {
- kfree(tz);
- return ERR_PTR(result);
- }
+ if (result < 0)
+ goto free_tz;
tz->id = result;
strlcpy(tz->type, type, sizeof(tz->type));
@@ -1232,18 +1226,15 @@ thermal_zone_device_register(const char *type, int trips, int mask,
/* Add nodes that are always present via .groups */
result = thermal_zone_create_device_groups(tz, mask);
if (result)
- goto unregister;
+ goto remove_id;
/* A new thermal zone needs to be updated anyway. */
atomic_set(&tz->need_update, 1);
dev_set_name(&tz->device, "thermal_zone%d", tz->id);
result = device_register(&tz->device);
- if (result) {
- ida_simple_remove(&thermal_tz_ida, tz->id);
- kfree(tz);
- return ERR_PTR(result);
- }
+ if (result)
+ goto remove_device_groups;
for (count = 0; count < trips; count++) {
if (tz->ops->get_trip_type(tz, count, &trip_type))
@@ -1297,6 +1288,14 @@ unregister:
ida_simple_remove(&thermal_tz_ida, tz->id);
device_unregister(&tz->device);
return ERR_PTR(result);
+
+remove_device_groups:
+ thermal_zone_destroy_device_groups(tz);
+remove_id:
+ ida_simple_remove(&thermal_tz_ida, tz->id);
+free_tz:
+ kfree(tz);
+ return ERR_PTR(result);
}
EXPORT_SYMBOL_GPL(thermal_zone_device_register);
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index 2412b3759e16..27e3b1df7360 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -71,6 +71,7 @@ int thermal_build_list_of_policies(char *buf);
/* sysfs I/F */
int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
+void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
/* used only at binding time */
ssize_t
diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index a694de907a26..fb80c96d8f73 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -605,6 +605,24 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
return 0;
}
+/**
+ * destroy_trip_attrs() - destroy attributes for trip points
+ * @tz: the thermal zone device
+ *
+ * helper function to free resources allocated by create_trip_attrs()
+ */
+static void destroy_trip_attrs(struct thermal_zone_device *tz)
+{
+ if (!tz)
+ return;
+
+ kfree(tz->trip_type_attrs);
+ kfree(tz->trip_temp_attrs);
+ if (tz->ops->get_trip_hyst)
+ kfree(tz->trip_hyst_attrs);
+ kfree(tz->trips_attribute_group.attrs);
+}
+
int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
int mask)
{
@@ -637,6 +655,17 @@ int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
return 0;
}
+void thermal_zone_destroy_device_groups(struct thermal_zone_device *tz)
+{
+ if (!tz)
+ return;
+
+ if (tz->trips)
+ destroy_trip_attrs(tz);
+
+ kfree(tz->device.groups);
+}
+
/* sys I/F for cooling device */
static ssize_t
thermal_cooling_device_type_show(struct device *dev,
diff --git a/drivers/thermal/uniphier_thermal.c b/drivers/thermal/uniphier_thermal.c
new file mode 100644
index 000000000000..95704732f760
--- /dev/null
+++ b/drivers/thermal/uniphier_thermal.c
@@ -0,0 +1,384 @@
+/**
+ * uniphier_thermal.c - Socionext UniPhier thermal driver
+ *
+ * Copyright 2014 Panasonic Corporation
+ * Copyright 2016-2017 Socionext Inc.
+ * All rights reserved.
+ *
+ * Author:
+ * Kunihiko Hayashi <[email protected]>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 of
+ * the License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/bitops.h>
+#include <linux/interrupt.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/thermal.h>
+
+#include "thermal_core.h"
+
+/*
+ * block registers
+ * addresses are the offset from .block_base
+ */
+#define PVTCTLEN 0x0000
+#define PVTCTLEN_EN BIT(0)
+
+#define PVTCTLMODE 0x0004
+#define PVTCTLMODE_MASK 0xf
+#define PVTCTLMODE_TEMPMON 0x5
+
+#define EMONREPEAT 0x0040
+#define EMONREPEAT_ENDLESS BIT(24)
+#define EMONREPEAT_PERIOD GENMASK(3, 0)
+#define EMONREPEAT_PERIOD_1000000 0x9
+
+/*
+ * common registers
+ * addresses are the offset from .map_base
+ */
+#define PVTCTLSEL 0x0900
+#define PVTCTLSEL_MASK GENMASK(2, 0)
+#define PVTCTLSEL_MONITOR 0
+
+#define SETALERT0 0x0910
+#define SETALERT1 0x0914
+#define SETALERT2 0x0918
+#define SETALERT_TEMP_OVF (GENMASK(7, 0) << 16)
+#define SETALERT_TEMP_OVF_VALUE(val) (((val) & GENMASK(7, 0)) << 16)
+#define SETALERT_EN BIT(0)
+
+#define PMALERTINTCTL 0x0920
+#define PMALERTINTCTL_CLR(ch) BIT(4 * (ch) + 2)
+#define PMALERTINTCTL_SET(ch) BIT(4 * (ch) + 1)
+#define PMALERTINTCTL_EN(ch) BIT(4 * (ch) + 0)
+#define PMALERTINTCTL_MASK (GENMASK(10, 8) | GENMASK(6, 4) | \
+ GENMASK(2, 0))
+
+#define TMOD 0x0928
+#define TMOD_WIDTH 9
+
+#define TMODCOEF 0x0e5c
+
+#define TMODSETUP0_EN BIT(30)
+#define TMODSETUP0_VAL(val) (((val) & GENMASK(13, 0)) << 16)
+#define TMODSETUP1_EN BIT(15)
+#define TMODSETUP1_VAL(val) ((val) & GENMASK(14, 0))
+
+/* SoC critical temperature */
+#define CRITICAL_TEMP_LIMIT (120 * 1000)
+
+/* Max # of alert channels */
+#define ALERT_CH_NUM 3
+
+/* SoC specific thermal sensor data */
+struct uniphier_tm_soc_data {
+ u32 map_base;
+ u32 block_base;
+ u32 tmod_setup_addr;
+};
+
+struct uniphier_tm_dev {
+ struct regmap *regmap;
+ struct device *dev;
+ bool alert_en[ALERT_CH_NUM];
+ struct thermal_zone_device *tz_dev;
+ const struct uniphier_tm_soc_data *data;
+};
+
+static int uniphier_tm_initialize_sensor(struct uniphier_tm_dev *tdev)
+{
+ struct regmap *map = tdev->regmap;
+ u32 val;
+ u32 tmod_calib[2];
+ int ret;
+
+ /* stop PVT */
+ regmap_write_bits(map, tdev->data->block_base + PVTCTLEN,
+ PVTCTLEN_EN, 0);
+
+ /*
+ * Since SoC has a calibrated value that was set in advance,
+ * TMODCOEF shows non-zero and PVT refers the value internally.
+ *
+ * If TMODCOEF shows zero, the boards don't have the calibrated
+ * value, and the driver has to set default value from DT.
+ */
+ ret = regmap_read(map, tdev->data->map_base + TMODCOEF, &val);
+ if (ret)
+ return ret;
+ if (!val) {
+ /* look for the default values in DT */
+ ret = of_property_read_u32_array(tdev->dev->of_node,
+ "socionext,tmod-calibration",
+ tmod_calib,
+ ARRAY_SIZE(tmod_calib));
+ if (ret)
+ return ret;
+
+ regmap_write(map, tdev->data->tmod_setup_addr,
+ TMODSETUP0_EN | TMODSETUP0_VAL(tmod_calib[0]) |
+ TMODSETUP1_EN | TMODSETUP1_VAL(tmod_calib[1]));
+ }
+
+ /* select temperature mode */
+ regmap_write_bits(map, tdev->data->block_base + PVTCTLMODE,
+ PVTCTLMODE_MASK, PVTCTLMODE_TEMPMON);
+
+ /* set monitoring period */
+ regmap_write_bits(map, tdev->data->block_base + EMONREPEAT,
+ EMONREPEAT_ENDLESS | EMONREPEAT_PERIOD,
+ EMONREPEAT_ENDLESS | EMONREPEAT_PERIOD_1000000);
+
+ /* set monitor mode */
+ regmap_write_bits(map, tdev->data->map_base + PVTCTLSEL,
+ PVTCTLSEL_MASK, PVTCTLSEL_MONITOR);
+
+ return 0;
+}
+
+static void uniphier_tm_set_alert(struct uniphier_tm_dev *tdev, u32 ch,
+ u32 temp)
+{
+ struct regmap *map = tdev->regmap;
+
+ /* set alert temperature */
+ regmap_write_bits(map, tdev->data->map_base + SETALERT0 + (ch << 2),
+ SETALERT_EN | SETALERT_TEMP_OVF,
+ SETALERT_EN |
+ SETALERT_TEMP_OVF_VALUE(temp / 1000));
+}
+
+static void uniphier_tm_enable_sensor(struct uniphier_tm_dev *tdev)
+{
+ struct regmap *map = tdev->regmap;
+ int i;
+ u32 bits = 0;
+
+ for (i = 0; i < ALERT_CH_NUM; i++)
+ if (tdev->alert_en[i])
+ bits |= PMALERTINTCTL_EN(i);
+
+ /* enable alert interrupt */
+ regmap_write_bits(map, tdev->data->map_base + PMALERTINTCTL,
+ PMALERTINTCTL_MASK, bits);
+
+ /* start PVT */
+ regmap_write_bits(map, tdev->data->block_base + PVTCTLEN,
+ PVTCTLEN_EN, PVTCTLEN_EN);
+
+ usleep_range(700, 1500); /* The spec note says at least 700us */
+}
+
+static void uniphier_tm_disable_sensor(struct uniphier_tm_dev *tdev)
+{
+ struct regmap *map = tdev->regmap;
+
+ /* disable alert interrupt */
+ regmap_write_bits(map, tdev->data->map_base + PMALERTINTCTL,
+ PMALERTINTCTL_MASK, 0);
+
+ /* stop PVT */
+ regmap_write_bits(map, tdev->data->block_base + PVTCTLEN,
+ PVTCTLEN_EN, 0);
+
+ usleep_range(1000, 2000); /* The spec note says at least 1ms */
+}
+
+static int uniphier_tm_get_temp(void *data, int *out_temp)
+{
+ struct uniphier_tm_dev *tdev = data;
+ struct regmap *map = tdev->regmap;
+ int ret;
+ u32 temp;
+
+ ret = regmap_read(map, tdev->data->map_base + TMOD, &temp);
+ if (ret)
+ return ret;
+
+ /* MSB of the TMOD field is a sign bit */
+ *out_temp = sign_extend32(temp, TMOD_WIDTH - 1) * 1000;
+
+ return 0;
+}
+
+static const struct thermal_zone_of_device_ops uniphier_of_thermal_ops = {
+ .get_temp = uniphier_tm_get_temp,
+};
+
+static void uniphier_tm_irq_clear(struct uniphier_tm_dev *tdev)
+{
+ u32 mask = 0, bits = 0;
+ int i;
+
+ for (i = 0; i < ALERT_CH_NUM; i++) {
+ mask |= (PMALERTINTCTL_CLR(i) | PMALERTINTCTL_SET(i));
+ bits |= PMALERTINTCTL_CLR(i);
+ }
+
+ /* clear alert interrupt */
+ regmap_write_bits(tdev->regmap,
+ tdev->data->map_base + PMALERTINTCTL, mask, bits);
+}
+
+static irqreturn_t uniphier_tm_alarm_irq(int irq, void *_tdev)
+{
+ struct uniphier_tm_dev *tdev = _tdev;
+
+ disable_irq_nosync(irq);
+ uniphier_tm_irq_clear(tdev);
+
+ return IRQ_WAKE_THREAD;
+}
+
+static irqreturn_t uniphier_tm_alarm_irq_thread(int irq, void *_tdev)
+{
+ struct uniphier_tm_dev *tdev = _tdev;
+
+ thermal_zone_device_update(tdev->tz_dev, THERMAL_EVENT_UNSPECIFIED);
+
+ return IRQ_HANDLED;
+}
+
+static int uniphier_tm_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct regmap *regmap;
+ struct device_node *parent;
+ struct uniphier_tm_dev *tdev;
+ const struct thermal_trip *trips;
+ int i, ret, irq, ntrips, crit_temp = INT_MAX;
+
+ tdev = devm_kzalloc(dev, sizeof(*tdev), GFP_KERNEL);
+ if (!tdev)
+ return -ENOMEM;
+ tdev->dev = dev;
+
+ tdev->data = of_device_get_match_data(dev);
+ if (WARN_ON(!tdev->data))
+ return -EINVAL;
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
+
+ /* get regmap from syscon node */
+ parent = of_get_parent(dev->of_node); /* parent should be syscon node */
+ regmap = syscon_node_to_regmap(parent);
+ of_node_put(parent);
+ if (IS_ERR(regmap)) {
+ dev_err(dev, "failed to get regmap (error %ld)\n",
+ PTR_ERR(regmap));
+ return PTR_ERR(regmap);
+ }
+ tdev->regmap = regmap;
+
+ ret = uniphier_tm_initialize_sensor(tdev);
+ if (ret) {
+ dev_err(dev, "failed to initialize sensor\n");
+ return ret;
+ }
+
+ ret = devm_request_threaded_irq(dev, irq, uniphier_tm_alarm_irq,
+ uniphier_tm_alarm_irq_thread,
+ 0, "thermal", tdev);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(pdev, tdev);
+
+ tdev->tz_dev = devm_thermal_zone_of_sensor_register(dev, 0, tdev,
+ &uniphier_of_thermal_ops);
+ if (IS_ERR(tdev->tz_dev)) {
+ dev_err(dev, "failed to register sensor device\n");
+ return PTR_ERR(tdev->tz_dev);
+ }
+
+ /* get trip points */
+ trips = of_thermal_get_trip_points(tdev->tz_dev);
+ ntrips = of_thermal_get_ntrips(tdev->tz_dev);
+ if (ntrips > ALERT_CH_NUM) {
+ dev_err(dev, "thermal zone has too many trips\n");
+ return -E2BIG;
+ }
+
+ /* set alert temperatures */
+ for (i = 0; i < ntrips; i++) {
+ if (trips[i].type == THERMAL_TRIP_CRITICAL &&
+ trips[i].temperature < crit_temp)
+ crit_temp = trips[i].temperature;
+ uniphier_tm_set_alert(tdev, i, trips[i].temperature);
+ tdev->alert_en[i] = true;
+ }
+ if (crit_temp > CRITICAL_TEMP_LIMIT) {
+ dev_err(dev, "critical trip is over limit(>%d), or not set\n",
+ CRITICAL_TEMP_LIMIT);
+ return -EINVAL;
+ }
+
+ uniphier_tm_enable_sensor(tdev);
+
+ return 0;
+}
+
+static int uniphier_tm_remove(struct platform_device *pdev)
+{
+ struct uniphier_tm_dev *tdev = platform_get_drvdata(pdev);
+
+ /* disable sensor */
+ uniphier_tm_disable_sensor(tdev);
+
+ return 0;
+}
+
+static const struct uniphier_tm_soc_data uniphier_pxs2_tm_data = {
+ .map_base = 0xe000,
+ .block_base = 0xe000,
+ .tmod_setup_addr = 0xe904,
+};
+
+static const struct uniphier_tm_soc_data uniphier_ld20_tm_data = {
+ .map_base = 0xe000,
+ .block_base = 0xe800,
+ .tmod_setup_addr = 0xe938,
+};
+
+static const struct of_device_id uniphier_tm_dt_ids[] = {
+ {
+ .compatible = "socionext,uniphier-pxs2-thermal",
+ .data = &uniphier_pxs2_tm_data,
+ },
+ {
+ .compatible = "socionext,uniphier-ld20-thermal",
+ .data = &uniphier_ld20_tm_data,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, uniphier_tm_dt_ids);
+
+static struct platform_driver uniphier_tm_driver = {
+ .probe = uniphier_tm_probe,
+ .remove = uniphier_tm_remove,
+ .driver = {
+ .name = "uniphier-thermal",
+ .of_match_table = uniphier_tm_dt_ids,
+ },
+};
+module_platform_driver(uniphier_tm_driver);
+
+MODULE_AUTHOR("Kunihiko Hayashi <[email protected]>");
+MODULE_DESCRIPTION("UniPhier thermal driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/thermal/zx2967_thermal.c b/drivers/thermal/zx2967_thermal.c
index a5670ad2cfc8..6acce0bce7c0 100644
--- a/drivers/thermal/zx2967_thermal.c
+++ b/drivers/thermal/zx2967_thermal.c
@@ -111,7 +111,7 @@ unlock:
return ret;
}
-static struct thermal_zone_of_device_ops zx2967_of_thermal_ops = {
+static const struct thermal_zone_of_device_ops zx2967_of_thermal_ops = {
.get_temp = zx2967_thermal_get_temp,
};
diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig
index 873e0ba89737..cc2b4d9433ed 100644
--- a/drivers/tty/Kconfig
+++ b/drivers/tty/Kconfig
@@ -458,4 +458,9 @@ config MIPS_EJTAG_FDC_KGDB_CHAN
help
FDC channel number to use for KGDB.
+config VCC
+ tristate "Sun Virtual Console Concentrator"
+ depends on SUN_LDOMS
+ help
+ Support for Sun logical domain consoles.
endif # TTY
diff --git a/drivers/tty/Makefile b/drivers/tty/Makefile
index 8689279afdf1..16330a819685 100644
--- a/drivers/tty/Makefile
+++ b/drivers/tty/Makefile
@@ -33,5 +33,6 @@ obj-$(CONFIG_PPC_EPAPR_HV_BYTECHAN) += ehv_bytechan.o
obj-$(CONFIG_GOLDFISH_TTY) += goldfish.o
obj-$(CONFIG_DA_TTY) += metag_da.o
obj-$(CONFIG_MIPS_EJTAG_FDC_TTY) += mips_ejtag_fdc.o
+obj-$(CONFIG_VCC) += vcc.o
obj-y += ipwireless/
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index 1c0c9553bc05..7dd38047ba23 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -246,11 +246,11 @@ struct mxser_port {
unsigned char err_shadow;
struct async_icount icount; /* kernel counters for 4 input interrupts */
- int timeout;
+ unsigned int timeout;
int read_status_mask;
int ignore_status_mask;
- int xmit_fifo_size;
+ unsigned int xmit_fifo_size;
int xmit_head;
int xmit_tail;
int xmit_cnt;
@@ -572,8 +572,9 @@ static void mxser_dtr_rts(struct tty_port *port, int on)
static int mxser_set_baud(struct tty_struct *tty, long newspd)
{
struct mxser_port *info = tty->driver_data;
- int quot = 0, baud;
+ unsigned int quot = 0, baud;
unsigned char cval;
+ u64 timeout;
if (!info->ioaddr)
return -1;
@@ -594,8 +595,13 @@ static int mxser_set_baud(struct tty_struct *tty, long newspd)
quot = 0;
}
- info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base);
- info->timeout += HZ / 50; /* Add .02 seconds of slop */
+ /*
+ * worst case (128 * 1000 * 10 * 18432) needs 35 bits, so divide in the
+ * u64 domain
+ */
+ timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot;
+ do_div(timeout, info->baud_base);
+ info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */
if (quot) {
info->MCR |= UART_MCR_DTR;
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c
index 583c9a0c7ecc..8c48c3784831 100644
--- a/drivers/tty/serial/bcm63xx_uart.c
+++ b/drivers/tty/serial/bcm63xx_uart.c
@@ -507,9 +507,14 @@ static void bcm_uart_set_termios(struct uart_port *port,
{
unsigned int ctl, baud, quot, ier;
unsigned long flags;
+ int tries;
spin_lock_irqsave(&port->lock, flags);
+ /* Drain the hot tub fully before we power it off for the winter. */
+ for (tries = 3; !bcm_uart_tx_empty(port) && tries; tries--)
+ mdelay(10);
+
/* disable uart while changing speed */
bcm_uart_disable(port);
bcm_uart_flush(port);
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index 849c1f9991ce..f0252184291e 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -1276,7 +1276,6 @@ static void rx_dma_timer_init(struct lpuart_port *sport)
static int lpuart_startup(struct uart_port *port)
{
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
- int ret;
unsigned long flags;
unsigned char temp;
@@ -1291,11 +1290,6 @@ static int lpuart_startup(struct uart_port *port)
sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) &
UARTPFIFO_FIFOSIZE_MASK) + 1);
- ret = devm_request_irq(port->dev, port->irq, lpuart_int, 0,
- DRIVER_NAME, sport);
- if (ret)
- return ret;
-
spin_lock_irqsave(&sport->port.lock, flags);
lpuart_setup_watermark(sport);
@@ -1333,7 +1327,6 @@ static int lpuart_startup(struct uart_port *port)
static int lpuart32_startup(struct uart_port *port)
{
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
- int ret;
unsigned long flags;
unsigned long temp;
@@ -1346,11 +1339,6 @@ static int lpuart32_startup(struct uart_port *port)
sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) &
UARTFIFO_FIFOSIZE_MASK) - 1);
- ret = devm_request_irq(port->dev, port->irq, lpuart32_int, 0,
- DRIVER_NAME, sport);
- if (ret)
- return ret;
-
spin_lock_irqsave(&sport->port.lock, flags);
lpuart32_setup_watermark(sport);
@@ -1380,8 +1368,6 @@ static void lpuart_shutdown(struct uart_port *port)
spin_unlock_irqrestore(&port->lock, flags);
- devm_free_irq(port->dev, port->irq, sport);
-
if (sport->lpuart_dma_rx_use) {
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port);
@@ -1400,7 +1386,6 @@ static void lpuart_shutdown(struct uart_port *port)
static void lpuart32_shutdown(struct uart_port *port)
{
- struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
unsigned long temp;
unsigned long flags;
@@ -1413,8 +1398,6 @@ static void lpuart32_shutdown(struct uart_port *port)
lpuart32_write(port, temp, UARTCTRL);
spin_unlock_irqrestore(&port->lock, flags);
-
- devm_free_irq(port->dev, port->irq, sport);
}
static void
@@ -2212,16 +2195,22 @@ static int lpuart_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, &sport->port);
- if (lpuart_is_32(sport))
+ if (lpuart_is_32(sport)) {
lpuart_reg.cons = LPUART32_CONSOLE;
- else
+ ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart32_int, 0,
+ DRIVER_NAME, sport);
+ } else {
lpuart_reg.cons = LPUART_CONSOLE;
+ ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart_int, 0,
+ DRIVER_NAME, sport);
+ }
+
+ if (ret)
+ goto failed_irq_request;
ret = uart_add_one_port(&lpuart_reg, &sport->port);
- if (ret) {
- clk_disable_unprepare(sport->clk);
- return ret;
- }
+ if (ret)
+ goto failed_attach_port;
sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
if (!sport->dma_tx_chan)
@@ -2240,6 +2229,11 @@ static int lpuart_probe(struct platform_device *pdev)
}
return 0;
+
+failed_attach_port:
+failed_irq_request:
+ clk_disable_unprepare(sport->clk);
+ return ret;
}
static int lpuart_remove(struct platform_device *pdev)
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
index ae8cfc81ffc5..d9123f995705 100644
--- a/drivers/tty/serial/pch_uart.c
+++ b/drivers/tty/serial/pch_uart.c
@@ -371,7 +371,7 @@ static const struct file_operations port_regs_ops = {
};
#endif /* CONFIG_DEBUG_FS */
-static struct dmi_system_id pch_uart_dmi_table[] = {
+static const struct dmi_system_id pch_uart_dmi_table[] = {
{
.ident = "CM-iTC",
{
diff --git a/drivers/tty/serial/sccnxp.c b/drivers/tty/serial/sccnxp.c
index cdd2f942317c..b9c7a904c1ea 100644
--- a/drivers/tty/serial/sccnxp.c
+++ b/drivers/tty/serial/sccnxp.c
@@ -889,7 +889,16 @@ static int sccnxp_probe(struct platform_device *pdev)
goto err_out;
uartclk = 0;
} else {
- clk_prepare_enable(clk);
+ ret = clk_prepare_enable(clk);
+ if (ret)
+ goto err_out;
+
+ ret = devm_add_action_or_reset(&pdev->dev,
+ (void(*)(void *))clk_disable_unprepare,
+ clk);
+ if (ret)
+ goto err_out;
+
uartclk = clk_get_rate(clk);
}
@@ -988,7 +997,7 @@ static int sccnxp_probe(struct platform_device *pdev)
uart_unregister_driver(&s->uart);
err_out:
if (!IS_ERR(s->regulator))
- return regulator_disable(s->regulator);
+ regulator_disable(s->regulator);
return ret;
}
diff --git a/drivers/tty/vcc.c b/drivers/tty/vcc.c
new file mode 100644
index 000000000000..ef01d24858cd
--- /dev/null
+++ b/drivers/tty/vcc.c
@@ -0,0 +1,1155 @@
+/* vcc.c: sun4v virtual channel concentrator
+ *
+ * Copyright (C) 2017 Oracle. All rights reserved.
+ */
+
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/sysfs.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <asm/vio.h>
+#include <asm/ldc.h>
+
+#define DRV_MODULE_NAME "vcc"
+#define DRV_MODULE_VERSION "1.1"
+#define DRV_MODULE_RELDATE "July 1, 2017"
+
+static char version[] =
+ DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";
+
+MODULE_DESCRIPTION("Sun LDOM virtual console concentrator driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_MODULE_VERSION);
+
+struct vcc_port {
+ struct vio_driver_state vio;
+
+ spinlock_t lock;
+ char *domain;
+ struct tty_struct *tty; /* only populated while dev is open */
+ unsigned long index; /* index into the vcc_table */
+
+ u64 refcnt;
+ bool excl_locked;
+
+ bool removed;
+
+ /* This buffer is required to support the tty write_room interface
+ * and guarantee that any characters that the driver accepts will
+ * be eventually sent, either immediately or later.
+ */
+ int chars_in_buffer;
+ struct vio_vcc buffer;
+
+ struct timer_list rx_timer;
+ struct timer_list tx_timer;
+};
+
+/* Microseconds that thread will delay waiting for a vcc port ref */
+#define VCC_REF_DELAY 100
+
+#define VCC_MAX_PORTS 1024
+#define VCC_MINOR_START 0 /* must be zero */
+#define VCC_BUFF_LEN VIO_VCC_MTU_SIZE
+
+#define VCC_CTL_BREAK -1
+#define VCC_CTL_HUP -2
+
+static const char vcc_driver_name[] = "vcc";
+static const char vcc_device_node[] = "vcc";
+static struct tty_driver *vcc_tty_driver;
+
+static struct vcc_port *vcc_table[VCC_MAX_PORTS];
+static DEFINE_SPINLOCK(vcc_table_lock);
+
+int vcc_dbg;
+int vcc_dbg_ldc;
+int vcc_dbg_vio;
+
+module_param(vcc_dbg, uint, 0664);
+module_param(vcc_dbg_ldc, uint, 0664);
+module_param(vcc_dbg_vio, uint, 0664);
+
+#define VCC_DBG_DRV 0x1
+#define VCC_DBG_LDC 0x2
+#define VCC_DBG_PKT 0x4
+
+#define vccdbg(f, a...) \
+ do { \
+ if (vcc_dbg & VCC_DBG_DRV) \
+ pr_info(f, ## a); \
+ } while (0) \
+
+#define vccdbgl(l) \
+ do { \
+ if (vcc_dbg & VCC_DBG_LDC) \
+ ldc_print(l); \
+ } while (0) \
+
+#define vccdbgp(pkt) \
+ do { \
+ if (vcc_dbg & VCC_DBG_PKT) { \
+ int i; \
+ for (i = 0; i < pkt.tag.stype; i++) \
+ pr_info("[%c]", pkt.data[i]); \
+ } \
+ } while (0) \
+
+/* Note: Be careful when adding flags to this line discipline. Don't
+ * add anything that will cause echoing or we'll go into recursive
+ * loop echoing chars back and forth with the console drivers.
+ */
+static const struct ktermios vcc_tty_termios = {
+ .c_iflag = IGNBRK | IGNPAR,
+ .c_oflag = OPOST,
+ .c_cflag = B38400 | CS8 | CREAD | HUPCL,
+ .c_cc = INIT_C_CC,
+ .c_ispeed = 38400,
+ .c_ospeed = 38400
+};
+
+/**
+ * vcc_table_add() - Add VCC port to the VCC table
+ * @port: pointer to the VCC port
+ *
+ * Return: index of the port in the VCC table on success,
+ * -1 on failure
+ */
+static int vcc_table_add(struct vcc_port *port)
+{
+ unsigned long flags;
+ int i;
+
+ spin_lock_irqsave(&vcc_table_lock, flags);
+ for (i = VCC_MINOR_START; i < VCC_MAX_PORTS; i++) {
+ if (!vcc_table[i]) {
+ vcc_table[i] = port;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+
+ if (i < VCC_MAX_PORTS)
+ return i;
+ else
+ return -1;
+}
+
+/**
+ * vcc_table_remove() - Removes a VCC port from the VCC table
+ * @index: Index into the VCC table
+ */
+static void vcc_table_remove(unsigned long index)
+{
+ unsigned long flags;
+
+ if (WARN_ON(index >= VCC_MAX_PORTS))
+ return;
+
+ spin_lock_irqsave(&vcc_table_lock, flags);
+ vcc_table[index] = NULL;
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+}
+
+/**
+ * vcc_get() - Gets a reference to VCC port
+ * @index: Index into the VCC table
+ * @excl: Indicates if an exclusive access is requested
+ *
+ * Return: reference to the VCC port, if found
+ * NULL, if port not found
+ */
+static struct vcc_port *vcc_get(unsigned long index, bool excl)
+{
+ struct vcc_port *port;
+ unsigned long flags;
+
+try_again:
+ spin_lock_irqsave(&vcc_table_lock, flags);
+
+ port = vcc_table[index];
+ if (!port) {
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+ return NULL;
+ }
+
+ if (!excl) {
+ if (port->excl_locked) {
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+ udelay(VCC_REF_DELAY);
+ goto try_again;
+ }
+ port->refcnt++;
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+ return port;
+ }
+
+ if (port->refcnt) {
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+ /* Threads wanting exclusive access will wait half the time,
+ * probably giving them higher priority in the case of
+ * multiple waiters.
+ */
+ udelay(VCC_REF_DELAY/2);
+ goto try_again;
+ }
+
+ port->refcnt++;
+ port->excl_locked = true;
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+
+ return port;
+}
+
+/**
+ * vcc_put() - Returns a reference to VCC port
+ * @port: pointer to VCC port
+ * @excl: Indicates if the returned reference is an exclusive reference
+ *
+ * Note: It's the caller's responsibility to ensure the correct value
+ * for the excl flag
+ */
+static void vcc_put(struct vcc_port *port, bool excl)
+{
+ unsigned long flags;
+
+ if (!port)
+ return;
+
+ spin_lock_irqsave(&vcc_table_lock, flags);
+
+ /* check if caller attempted to put with the wrong flags */
+ if (WARN_ON((excl && !port->excl_locked) ||
+ (!excl && port->excl_locked)))
+ goto done;
+
+ port->refcnt--;
+
+ if (excl)
+ port->excl_locked = false;
+
+done:
+ spin_unlock_irqrestore(&vcc_table_lock, flags);
+}
+
+/**
+ * vcc_get_ne() - Get a non-exclusive reference to VCC port
+ * @index: Index into the VCC table
+ *
+ * Gets a non-exclusive reference to VCC port, if it's not removed
+ *
+ * Return: pointer to the VCC port, if found
+ * NULL, if port not found
+ */
+static struct vcc_port *vcc_get_ne(unsigned long index)
+{
+ struct vcc_port *port;
+
+ port = vcc_get(index, false);
+
+ if (port && port->removed) {
+ vcc_put(port, false);
+ return NULL;
+ }
+
+ return port;
+}
+
+static void vcc_kick_rx(struct vcc_port *port)
+{
+ struct vio_driver_state *vio = &port->vio;
+
+ assert_spin_locked(&port->lock);
+
+ if (!timer_pending(&port->rx_timer) && !port->removed) {
+ disable_irq_nosync(vio->vdev->rx_irq);
+ port->rx_timer.expires = (jiffies + 1);
+ add_timer(&port->rx_timer);
+ }
+}
+
+static void vcc_kick_tx(struct vcc_port *port)
+{
+ assert_spin_locked(&port->lock);
+
+ if (!timer_pending(&port->tx_timer) && !port->removed) {
+ port->tx_timer.expires = (jiffies + 1);
+ add_timer(&port->tx_timer);
+ }
+}
+
+static int vcc_rx_check(struct tty_struct *tty, int size)
+{
+ if (WARN_ON(!tty || !tty->port))
+ return 1;
+
+ /* tty_buffer_request_room won't sleep because it uses
+ * GFP_ATOMIC flag to allocate buffer
+ */
+ if (test_bit(TTY_THROTTLED, &tty->flags) ||
+ (tty_buffer_request_room(tty->port, VCC_BUFF_LEN) < VCC_BUFF_LEN))
+ return 0;
+
+ return 1;
+}
+
+static int vcc_rx(struct tty_struct *tty, char *buf, int size)
+{
+ int len = 0;
+
+ if (WARN_ON(!tty || !tty->port))
+ return len;
+
+ len = tty_insert_flip_string(tty->port, buf, size);
+ if (len)
+ tty_flip_buffer_push(tty->port);
+
+ return len;
+}
+
+static int vcc_ldc_read(struct vcc_port *port)
+{
+ struct vio_driver_state *vio = &port->vio;
+ struct tty_struct *tty;
+ struct vio_vcc pkt;
+ int rv = 0;
+
+ tty = port->tty;
+ if (!tty) {
+ rv = ldc_rx_reset(vio->lp);
+ vccdbg("VCC: reset rx q: rv=%d\n", rv);
+ goto done;
+ }
+
+ /* Read as long as LDC has incoming data. */
+ while (1) {
+ if (!vcc_rx_check(tty, VIO_VCC_MTU_SIZE)) {
+ vcc_kick_rx(port);
+ break;
+ }
+
+ vccdbgl(vio->lp);
+
+ rv = ldc_read(vio->lp, &pkt, sizeof(pkt));
+ if (rv <= 0)
+ break;
+
+ vccdbg("VCC: ldc_read()=%d\n", rv);
+ vccdbg("TAG [%02x:%02x:%04x:%08x]\n",
+ pkt.tag.type, pkt.tag.stype,
+ pkt.tag.stype_env, pkt.tag.sid);
+
+ if (pkt.tag.type == VIO_TYPE_DATA) {
+ vccdbgp(pkt);
+ /* vcc_rx_check ensures memory availability */
+ vcc_rx(tty, pkt.data, pkt.tag.stype);
+ } else {
+ pr_err("VCC: unknown msg [%02x:%02x:%04x:%08x]\n",
+ pkt.tag.type, pkt.tag.stype,
+ pkt.tag.stype_env, pkt.tag.sid);
+ rv = -ECONNRESET;
+ break;
+ }
+
+ WARN_ON(rv != LDC_PACKET_SIZE);
+ }
+
+done:
+ return rv;
+}
+
+static void vcc_rx_timer(unsigned long index)
+{
+ struct vio_driver_state *vio;
+ struct vcc_port *port;
+ unsigned long flags;
+ int rv;
+
+ port = vcc_get_ne(index);
+ if (!port)
+ return;
+
+ spin_lock_irqsave(&port->lock, flags);
+ port->rx_timer.expires = 0;
+
+ vio = &port->vio;
+
+ enable_irq(vio->vdev->rx_irq);
+
+ if (!port->tty || port->removed)
+ goto done;
+
+ rv = vcc_ldc_read(port);
+ if (rv == -ECONNRESET)
+ vio_conn_reset(vio);
+
+done:
+ spin_unlock_irqrestore(&port->lock, flags);
+ vcc_put(port, false);
+}
+
+static void vcc_tx_timer(unsigned long index)
+{
+ struct vcc_port *port;
+ struct vio_vcc *pkt;
+ unsigned long flags;
+ int tosend = 0;
+ int rv;
+
+ port = vcc_get_ne(index);
+ if (!port)
+ return;
+
+ spin_lock_irqsave(&port->lock, flags);
+ port->tx_timer.expires = 0;
+
+ if (!port->tty || port->removed)
+ goto done;
+
+ tosend = min(VCC_BUFF_LEN, port->chars_in_buffer);
+ if (!tosend)
+ goto done;
+
+ pkt = &port->buffer;
+ pkt->tag.type = VIO_TYPE_DATA;
+ pkt->tag.stype = tosend;
+ vccdbgl(port->vio.lp);
+
+ rv = ldc_write(port->vio.lp, pkt, (VIO_TAG_SIZE + tosend));
+ WARN_ON(!rv);
+
+ if (rv < 0) {
+ vccdbg("VCC: ldc_write()=%d\n", rv);
+ vcc_kick_tx(port);
+ } else {
+ struct tty_struct *tty = port->tty;
+
+ port->chars_in_buffer = 0;
+ if (tty)
+ tty_wakeup(tty);
+ }
+
+done:
+ spin_unlock_irqrestore(&port->lock, flags);
+ vcc_put(port, false);
+}
+
+/**
+ * vcc_event() - LDC event processing engine
+ * @arg: VCC private data
+ * @event: LDC event
+ *
+ * Handles LDC events for VCC
+ */
+static void vcc_event(void *arg, int event)
+{
+ struct vio_driver_state *vio;
+ struct vcc_port *port;
+ unsigned long flags;
+ int rv;
+
+ port = arg;
+ vio = &port->vio;
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ switch (event) {
+ case LDC_EVENT_RESET:
+ case LDC_EVENT_UP:
+ vio_link_state_change(vio, event);
+ break;
+
+ case LDC_EVENT_DATA_READY:
+ rv = vcc_ldc_read(port);
+ if (rv == -ECONNRESET)
+ vio_conn_reset(vio);
+ break;
+
+ default:
+ pr_err("VCC: unexpected LDC event(%d)\n", event);
+ }
+
+ spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static struct ldc_channel_config vcc_ldc_cfg = {
+ .event = vcc_event,
+ .mtu = VIO_VCC_MTU_SIZE,
+ .mode = LDC_MODE_RAW,
+ .debug = 0,
+};
+
+/* Ordered from largest major to lowest */
+static struct vio_version vcc_versions[] = {
+ { .major = 1, .minor = 0 },
+};
+
+static struct tty_port_operations vcc_port_ops = { 0 };
+
+static ssize_t vcc_sysfs_domain_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct vcc_port *port;
+ int rv;
+
+ port = dev_get_drvdata(dev);
+ if (!port)
+ return -ENODEV;
+
+ rv = scnprintf(buf, PAGE_SIZE, "%s\n", port->domain);
+
+ return rv;
+}
+
+static int vcc_send_ctl(struct vcc_port *port, int ctl)
+{
+ struct vio_vcc pkt;
+ int rv;
+
+ pkt.tag.type = VIO_TYPE_CTRL;
+ pkt.tag.sid = ctl;
+ pkt.tag.stype = 0;
+
+ rv = ldc_write(port->vio.lp, &pkt, sizeof(pkt.tag));
+ WARN_ON(!rv);
+ vccdbg("VCC: ldc_write(%ld)=%d\n", sizeof(pkt.tag), rv);
+
+ return rv;
+}
+
+static ssize_t vcc_sysfs_break_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct vcc_port *port;
+ unsigned long flags;
+ int rv = count;
+ int brk;
+
+ port = dev_get_drvdata(dev);
+ if (!port)
+ return -ENODEV;
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ if (sscanf(buf, "%ud", &brk) != 1 || brk != 1)
+ rv = -EINVAL;
+ else if (vcc_send_ctl(port, VCC_CTL_BREAK) < 0)
+ vcc_kick_tx(port);
+
+ spin_unlock_irqrestore(&port->lock, flags);
+
+ return rv;
+}
+
+static DEVICE_ATTR(domain, 0400, vcc_sysfs_domain_show, NULL);
+static DEVICE_ATTR(break, 0200, NULL, vcc_sysfs_break_store);
+
+static struct attribute *vcc_sysfs_entries[] = {
+ &dev_attr_domain.attr,
+ &dev_attr_break.attr,
+ NULL
+};
+
+static struct attribute_group vcc_attribute_group = {
+ .name = NULL,
+ .attrs = vcc_sysfs_entries,
+};
+
+/**
+ * vcc_probe() - Initialize VCC port
+ * @vdev: Pointer to VIO device of the new VCC port
+ * @id: VIO device ID
+ *
+ * Initializes a VCC port to receive serial console data from
+ * the guest domain. Sets up a TTY end point on the control
+ * domain. Sets up VIO/LDC link between the guest & control
+ * domain endpoints.
+ *
+ * Return: status of the probe
+ */
+static int vcc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
+{
+ struct mdesc_handle *hp;
+ struct vcc_port *port;
+ struct device *dev;
+ const char *domain;
+ char *name;
+ u64 node;
+ int rv;
+
+ vccdbg("VCC: name=%s\n", dev_name(&vdev->dev));
+
+ if (!vcc_tty_driver) {
+ pr_err("VCC: TTY driver not registered\n");
+ return -ENODEV;
+ }
+
+ port = kzalloc(sizeof(struct vcc_port), GFP_KERNEL);
+ if (!port)
+ return -ENOMEM;
+
+ name = kstrdup(dev_name(&vdev->dev), GFP_KERNEL);
+
+ rv = vio_driver_init(&port->vio, vdev, VDEV_CONSOLE_CON, vcc_versions,
+ ARRAY_SIZE(vcc_versions), NULL, name);
+ if (rv)
+ goto free_port;
+
+ port->vio.debug = vcc_dbg_vio;
+ vcc_ldc_cfg.debug = vcc_dbg_ldc;
+
+ rv = vio_ldc_alloc(&port->vio, &vcc_ldc_cfg, port);
+ if (rv)
+ goto free_port;
+
+ spin_lock_init(&port->lock);
+
+ port->index = vcc_table_add(port);
+ if (port->index == -1) {
+ pr_err("VCC: no more TTY indices left for allocation\n");
+ goto free_ldc;
+ }
+
+ /* Register the device using VCC table index as TTY index */
+ dev = tty_register_device(vcc_tty_driver, port->index, &vdev->dev);
+ if (IS_ERR(dev)) {
+ rv = PTR_ERR(dev);
+ goto free_table;
+ }
+
+ hp = mdesc_grab();
+
+ node = vio_vdev_node(hp, vdev);
+ if (node == MDESC_NODE_NULL) {
+ rv = -ENXIO;
+ mdesc_release(hp);
+ goto unreg_tty;
+ }
+
+ domain = mdesc_get_property(hp, node, "vcc-domain-name", NULL);
+ if (!domain) {
+ rv = -ENXIO;
+ mdesc_release(hp);
+ goto unreg_tty;
+ }
+ port->domain = kstrdup(domain, GFP_KERNEL);
+
+ mdesc_release(hp);
+
+ rv = sysfs_create_group(&vdev->dev.kobj, &vcc_attribute_group);
+ if (rv)
+ goto free_domain;
+
+ init_timer(&port->rx_timer);
+ port->rx_timer.function = vcc_rx_timer;
+ port->rx_timer.data = port->index;
+
+ init_timer(&port->tx_timer);
+ port->tx_timer.function = vcc_tx_timer;
+ port->tx_timer.data = port->index;
+
+ dev_set_drvdata(&vdev->dev, port);
+
+ /* It's possible to receive IRQs in the middle of vio_port_up. Disable
+ * IRQs until the port is up.
+ */
+ disable_irq_nosync(vdev->rx_irq);
+ vio_port_up(&port->vio);
+ enable_irq(vdev->rx_irq);
+
+ return 0;
+
+free_domain:
+ kfree(port->domain);
+unreg_tty:
+ tty_unregister_device(vcc_tty_driver, port->index);
+free_table:
+ vcc_table_remove(port->index);
+free_ldc:
+ vio_ldc_free(&port->vio);
+free_port:
+ kfree(name);
+ kfree(port);
+
+ return rv;
+}
+
+/**
+ * vcc_remove() - Terminate a VCC port
+ * @vdev: Pointer to VIO device of the VCC port
+ *
+ * Terminates a VCC port. Sets up the teardown of TTY and
+ * VIO/LDC link between guest and primary domains.
+ *
+ * Return: status of removal
+ */
+static int vcc_remove(struct vio_dev *vdev)
+{
+ struct vcc_port *port = dev_get_drvdata(&vdev->dev);
+
+ if (!port)
+ return -ENODEV;
+
+ del_timer_sync(&port->rx_timer);
+ del_timer_sync(&port->tx_timer);
+
+ /* If there's a process with the device open, do a synchronous
+ * hangup of the TTY. This *may* cause the process to call close
+ * asynchronously, but it's not guaranteed.
+ */
+ if (port->tty)
+ tty_vhangup(port->tty);
+
+ /* Get exclusive reference to VCC, ensures that there are no other
+ * clients to this port
+ */
+ port = vcc_get(port->index, true);
+
+ if (WARN_ON(!port))
+ return -ENODEV;
+
+ tty_unregister_device(vcc_tty_driver, port->index);
+
+ del_timer_sync(&port->vio.timer);
+ vio_ldc_free(&port->vio);
+ sysfs_remove_group(&vdev->dev.kobj, &vcc_attribute_group);
+ dev_set_drvdata(&vdev->dev, NULL);
+ if (port->tty) {
+ port->removed = true;
+ vcc_put(port, true);
+ } else {
+ vcc_table_remove(port->index);
+
+ kfree(port->vio.name);
+ kfree(port->domain);
+ kfree(port);
+ }
+
+ return 0;
+}
+
+static const struct vio_device_id vcc_match[] = {
+ {
+ .type = "vcc-port",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(vio, vcc_match);
+
+static struct vio_driver vcc_driver = {
+ .id_table = vcc_match,
+ .probe = vcc_probe,
+ .remove = vcc_remove,
+ .name = "vcc",
+};
+
+static int vcc_open(struct tty_struct *tty, struct file *vcc_file)
+{
+ struct vcc_port *port;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: open: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ if (tty->count > 1)
+ return -EBUSY;
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: open: Failed to find VCC port\n");
+ return -ENODEV;
+ }
+
+ if (unlikely(!port->vio.lp)) {
+ pr_err("VCC: open: LDC channel not configured\n");
+ vcc_put(port, false);
+ return -EPIPE;
+ }
+ vccdbgl(port->vio.lp);
+
+ vcc_put(port, false);
+
+ if (unlikely(!tty->port)) {
+ pr_err("VCC: open: TTY port not found\n");
+ return -ENXIO;
+ }
+
+ if (unlikely(!tty->port->ops)) {
+ pr_err("VCC: open: TTY ops not defined\n");
+ return -ENXIO;
+ }
+
+ return tty_port_open(tty->port, tty, vcc_file);
+}
+
+static void vcc_close(struct tty_struct *tty, struct file *vcc_file)
+{
+ if (unlikely(!tty)) {
+ pr_err("VCC: close: Invalid TTY handle\n");
+ return;
+ }
+
+ if (unlikely(tty->count > 1))
+ return;
+
+ if (unlikely(!tty->port)) {
+ pr_err("VCC: close: TTY port not found\n");
+ return;
+ }
+
+ tty_port_close(tty->port, tty, vcc_file);
+}
+
+static void vcc_ldc_hup(struct vcc_port *port)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ if (vcc_send_ctl(port, VCC_CTL_HUP) < 0)
+ vcc_kick_tx(port);
+
+ spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static void vcc_hangup(struct tty_struct *tty)
+{
+ struct vcc_port *port;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: hangup: Invalid TTY handle\n");
+ return;
+ }
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: hangup: Failed to find VCC port\n");
+ return;
+ }
+
+ if (unlikely(!tty->port)) {
+ pr_err("VCC: hangup: TTY port not found\n");
+ vcc_put(port, false);
+ return;
+ }
+
+ vcc_ldc_hup(port);
+
+ vcc_put(port, false);
+
+ tty_port_hangup(tty->port);
+}
+
+static int vcc_write(struct tty_struct *tty, const unsigned char *buf,
+ int count)
+{
+ struct vcc_port *port;
+ struct vio_vcc *pkt;
+ unsigned long flags;
+ int total_sent = 0;
+ int tosend = 0;
+ int rv = -EINVAL;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: write: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: write: Failed to find VCC port");
+ return -ENODEV;
+ }
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ pkt = &port->buffer;
+ pkt->tag.type = VIO_TYPE_DATA;
+
+ while (count > 0) {
+ /* Minimum of data to write and space available */
+ tosend = min(count, (VCC_BUFF_LEN - port->chars_in_buffer));
+
+ if (!tosend)
+ break;
+
+ memcpy(&pkt->data[port->chars_in_buffer], &buf[total_sent],
+ tosend);
+ port->chars_in_buffer += tosend;
+ pkt->tag.stype = tosend;
+
+ vccdbg("TAG [%02x:%02x:%04x:%08x]\n", pkt->tag.type,
+ pkt->tag.stype, pkt->tag.stype_env, pkt->tag.sid);
+ vccdbg("DATA [%s]\n", pkt->data);
+ vccdbgl(port->vio.lp);
+
+ /* Since we know we have enough room in VCC buffer for tosend
+ * we record that it was sent regardless of whether the
+ * hypervisor actually took it because we have it buffered.
+ */
+ rv = ldc_write(port->vio.lp, pkt, (VIO_TAG_SIZE + tosend));
+ vccdbg("VCC: write: ldc_write(%d)=%d\n",
+ (VIO_TAG_SIZE + tosend), rv);
+
+ total_sent += tosend;
+ count -= tosend;
+ if (rv < 0) {
+ vcc_kick_tx(port);
+ break;
+ }
+
+ port->chars_in_buffer = 0;
+ }
+
+ spin_unlock_irqrestore(&port->lock, flags);
+
+ vcc_put(port, false);
+
+ vccdbg("VCC: write: total=%d rv=%d", total_sent, rv);
+
+ return total_sent ? total_sent : rv;
+}
+
+static int vcc_write_room(struct tty_struct *tty)
+{
+ struct vcc_port *port;
+ u64 num;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: write_room: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: write_room: Failed to find VCC port\n");
+ return -ENODEV;
+ }
+
+ num = VCC_BUFF_LEN - port->chars_in_buffer;
+
+ vcc_put(port, false);
+
+ return num;
+}
+
+static int vcc_chars_in_buffer(struct tty_struct *tty)
+{
+ struct vcc_port *port;
+ u64 num;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: chars_in_buffer: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: chars_in_buffer: Failed to find VCC port\n");
+ return -ENODEV;
+ }
+
+ num = port->chars_in_buffer;
+
+ vcc_put(port, false);
+
+ return num;
+}
+
+static int vcc_break_ctl(struct tty_struct *tty, int state)
+{
+ struct vcc_port *port;
+ unsigned long flags;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: break_ctl: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ port = vcc_get_ne(tty->index);
+ if (unlikely(!port)) {
+ pr_err("VCC: break_ctl: Failed to find VCC port\n");
+ return -ENODEV;
+ }
+
+ /* Turn off break */
+ if (state == 0) {
+ vcc_put(port, false);
+ return 0;
+ }
+
+ spin_lock_irqsave(&port->lock, flags);
+
+ if (vcc_send_ctl(port, VCC_CTL_BREAK) < 0)
+ vcc_kick_tx(port);
+
+ spin_unlock_irqrestore(&port->lock, flags);
+
+ vcc_put(port, false);
+
+ return 0;
+}
+
+static int vcc_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+ struct vcc_port *port_vcc;
+ struct tty_port *port_tty;
+ int ret;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: install: Invalid TTY handle\n");
+ return -ENXIO;
+ }
+
+ if (tty->index >= VCC_MAX_PORTS)
+ return -EINVAL;
+
+ ret = tty_standard_install(driver, tty);
+ if (ret)
+ return ret;
+
+ port_tty = kzalloc(sizeof(struct tty_port), GFP_KERNEL);
+ if (!port_tty)
+ return -ENOMEM;
+
+ port_vcc = vcc_get(tty->index, true);
+ if (!port_vcc) {
+ pr_err("VCC: install: Failed to find VCC port\n");
+ tty->port = NULL;
+ kfree(port_tty);
+ return -ENODEV;
+ }
+
+ tty_port_init(port_tty);
+ port_tty->ops = &vcc_port_ops;
+ tty->port = port_tty;
+
+ port_vcc->tty = tty;
+
+ vcc_put(port_vcc, true);
+
+ return 0;
+}
+
+static void vcc_cleanup(struct tty_struct *tty)
+{
+ struct vcc_port *port;
+
+ if (unlikely(!tty)) {
+ pr_err("VCC: cleanup: Invalid TTY handle\n");
+ return;
+ }
+
+ port = vcc_get(tty->index, true);
+ if (port) {
+ port->tty = NULL;
+
+ if (port->removed) {
+ vcc_table_remove(tty->index);
+ kfree(port->vio.name);
+ kfree(port->domain);
+ kfree(port);
+ } else {
+ vcc_put(port, true);
+ }
+ }
+
+ tty_port_destroy(tty->port);
+ kfree(tty->port);
+ tty->port = NULL;
+}
+
+static const struct tty_operations vcc_ops = {
+ .open = vcc_open,
+ .close = vcc_close,
+ .hangup = vcc_hangup,
+ .write = vcc_write,
+ .write_room = vcc_write_room,
+ .chars_in_buffer = vcc_chars_in_buffer,
+ .break_ctl = vcc_break_ctl,
+ .install = vcc_install,
+ .cleanup = vcc_cleanup,
+};
+
+#define VCC_TTY_FLAGS (TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_REAL_RAW)
+
+static int vcc_tty_init(void)
+{
+ int rv;
+
+ pr_info("VCC: %s\n", version);
+
+ vcc_tty_driver = tty_alloc_driver(VCC_MAX_PORTS, VCC_TTY_FLAGS);
+ if (IS_ERR(vcc_tty_driver)) {
+ pr_err("VCC: TTY driver alloc failed\n");
+ return PTR_ERR(vcc_tty_driver);
+ }
+
+ vcc_tty_driver->driver_name = vcc_driver_name;
+ vcc_tty_driver->name = vcc_device_node;
+
+ vcc_tty_driver->minor_start = VCC_MINOR_START;
+ vcc_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
+ vcc_tty_driver->init_termios = vcc_tty_termios;
+
+ tty_set_operations(vcc_tty_driver, &vcc_ops);
+
+ rv = tty_register_driver(vcc_tty_driver);
+ if (rv) {
+ pr_err("VCC: TTY driver registration failed\n");
+ put_tty_driver(vcc_tty_driver);
+ vcc_tty_driver = NULL;
+ return rv;
+ }
+
+ vccdbg("VCC: TTY driver registered\n");
+
+ return 0;
+}
+
+static void vcc_tty_exit(void)
+{
+ tty_unregister_driver(vcc_tty_driver);
+ put_tty_driver(vcc_tty_driver);
+ vccdbg("VCC: TTY driver unregistered\n");
+
+ vcc_tty_driver = NULL;
+}
+
+static int __init vcc_init(void)
+{
+ int rv;
+
+ rv = vcc_tty_init();
+ if (rv) {
+ pr_err("VCC: TTY init failed\n");
+ return rv;
+ }
+
+ rv = vio_register_driver(&vcc_driver);
+ if (rv) {
+ pr_err("VCC: VIO driver registration failed\n");
+ vcc_tty_exit();
+ } else {
+ vccdbg("VCC: VIO driver registered successfully\n");
+ }
+
+ return rv;
+}
+
+static void __exit vcc_exit(void)
+{
+ vio_unregister_driver(&vcc_driver);
+ vccdbg("VCC: VIO driver unregistered\n");
+ vcc_tty_exit();
+ vccdbg("VCC: TTY driver unregistered\n");
+}
+
+module_init(vcc_init);
+module_exit(vcc_exit);
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 5aacea1978a5..3e865dbf878c 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -190,8 +190,10 @@ static void wdm_in_callback(struct urb *urb)
/*
* only set a new error if there is no previous error.
* Errors are only cleared during read/open
+ * Avoid propagating -EPIPE (stall) to userspace since it is
+ * better handled as an empty read
*/
- if (desc->rerr == 0)
+ if (desc->rerr == 0 && status != -EPIPE)
desc->rerr = status;
if (length + desc->length > desc->wMaxCommand) {
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index 4be52c602e9b..68b54bd88d1e 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -643,15 +643,23 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
} else if (header->bDescriptorType ==
USB_DT_INTERFACE_ASSOCIATION) {
+ struct usb_interface_assoc_descriptor *d;
+
+ d = (struct usb_interface_assoc_descriptor *)header;
+ if (d->bLength < USB_DT_INTERFACE_ASSOCIATION_SIZE) {
+ dev_warn(ddev,
+ "config %d has an invalid interface association descriptor of length %d, skipping\n",
+ cfgno, d->bLength);
+ continue;
+ }
+
if (iad_num == USB_MAXIADS) {
dev_warn(ddev, "found more Interface "
"Association Descriptors "
"than allocated for in "
"configuration %d\n", cfgno);
} else {
- config->intf_assoc[iad_num] =
- (struct usb_interface_assoc_descriptor
- *)header;
+ config->intf_assoc[iad_num] = d;
iad_num++;
}
@@ -852,7 +860,7 @@ int usb_get_configuration(struct usb_device *dev)
}
if (dev->quirks & USB_QUIRK_DELAY_INIT)
- msleep(100);
+ msleep(200);
result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,
bigbuffer, length);
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index 318bb3b96687..4664e543cf2f 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -140,6 +140,9 @@ module_param(usbfs_memory_mb, uint, 0644);
MODULE_PARM_DESC(usbfs_memory_mb,
"maximum MB allowed for usbfs buffers (0 = no limit)");
+/* Hard limit, necessary to avoid arithmetic overflow */
+#define USBFS_XFER_MAX (UINT_MAX / 2 - 1000000)
+
static atomic64_t usbfs_memory_usage; /* Total memory currently allocated */
/* Check whether it's okay to allocate more memory for a transfer */
@@ -1460,6 +1463,8 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
USBDEVFS_URB_ZERO_PACKET |
USBDEVFS_URB_NO_INTERRUPT))
return -EINVAL;
+ if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX)
+ return -EINVAL;
if (uurb->buffer_length > 0 && !uurb->buffer)
return -EINVAL;
if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL &&
@@ -1571,7 +1576,11 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
totlen += isopkt[u].length;
}
u *= sizeof(struct usb_iso_packet_descriptor);
- uurb->buffer_length = totlen;
+ if (totlen <= uurb->buffer_length)
+ uurb->buffer_length = totlen;
+ else
+ WARN_ONCE(1, "uurb->buffer_length is too short %d vs %d",
+ totlen, uurb->buffer_length);
break;
default:
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 41eaf0b52518..b5c733613823 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4838,7 +4838,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
goto loop;
if (udev->quirks & USB_QUIRK_DELAY_INIT)
- msleep(1000);
+ msleep(2000);
/* consecutive bus-powered hubs aren't reliable; they can
* violate the voltage drop budget. if the new child has
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 4c38ea41ae96..371a07d874a3 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -2069,6 +2069,10 @@ int cdc_parse_cdc_header(struct usb_cdc_parsed_header *hdr,
elength = 1;
goto next_desc;
}
+ if ((buflen < elength) || (elength < 3)) {
+ dev_err(&intf->dev, "invalid descriptor buffer length\n");
+ break;
+ }
if (buffer[1] != USB_DT_CS_INTERFACE) {
dev_err(&intf->dev, "skipping garbage\n");
goto next_desc;
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c
index 4cef7d4f9cd0..a26d1fde0f5e 100644
--- a/drivers/usb/dwc3/dwc3-of-simple.c
+++ b/drivers/usb/dwc3/dwc3-of-simple.c
@@ -177,6 +177,7 @@ static const struct of_device_id of_dwc3_simple_match[] = {
{ .compatible = "rockchip,rk3399-dwc3" },
{ .compatible = "xlnx,zynqmp-dwc3" },
{ .compatible = "cavium,octeon-7130-usb-uctl" },
+ { .compatible = "sprd,sc9860-dwc3" },
{ /* Sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_dwc3_simple_match);
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 827e376bfa97..75e6cb044eb2 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -990,6 +990,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
DWC3_TRBCTL_CONTROL_DATA,
true);
+ req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
+
/* Now prepare one extra TRB to align transfer size */
dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
maxpacket - rem,
@@ -1015,6 +1017,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
DWC3_TRBCTL_CONTROL_DATA,
true);
+ req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
+
/* Now prepare one extra TRB to align transfer size */
dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
0, DWC3_TRBCTL_CONTROL_DATA,
@@ -1029,6 +1033,9 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
dwc3_ep0_prepare_one_trb(dep, req->request.dma,
req->request.length, DWC3_TRBCTL_CONTROL_DATA,
false);
+
+ req->trb = &dwc->ep0_trb[dep->trb_enqueue];
+
ret = dwc3_ep0_start_trans(dep);
}
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 9990944a7245..8b342587f8ad 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -46,7 +46,8 @@
static void ffs_data_get(struct ffs_data *ffs);
static void ffs_data_put(struct ffs_data *ffs);
/* Creates new ffs_data object. */
-static struct ffs_data *__must_check ffs_data_new(void) __attribute__((malloc));
+static struct ffs_data *__must_check ffs_data_new(const char *dev_name)
+ __attribute__((malloc));
/* Opened counter handling. */
static void ffs_data_opened(struct ffs_data *ffs);
@@ -780,11 +781,12 @@ static void ffs_epfile_async_io_complete(struct usb_ep *_ep,
struct usb_request *req)
{
struct ffs_io_data *io_data = req->context;
+ struct ffs_data *ffs = io_data->ffs;
ENTER();
INIT_WORK(&io_data->work, ffs_user_copy_worker);
- schedule_work(&io_data->work);
+ queue_work(ffs->io_completion_wq, &io_data->work);
}
static void __ffs_epfile_read_buffer_free(struct ffs_epfile *epfile)
@@ -1500,7 +1502,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
if (unlikely(ret < 0))
return ERR_PTR(ret);
- ffs = ffs_data_new();
+ ffs = ffs_data_new(dev_name);
if (unlikely(!ffs))
return ERR_PTR(-ENOMEM);
ffs->file_perms = data.perms;
@@ -1610,6 +1612,7 @@ static void ffs_data_put(struct ffs_data *ffs)
BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
waitqueue_active(&ffs->ep0req_completion.wait) ||
waitqueue_active(&ffs->wait));
+ destroy_workqueue(ffs->io_completion_wq);
kfree(ffs->dev_name);
kfree(ffs);
}
@@ -1642,7 +1645,7 @@ static void ffs_data_closed(struct ffs_data *ffs)
ffs_data_put(ffs);
}
-static struct ffs_data *ffs_data_new(void)
+static struct ffs_data *ffs_data_new(const char *dev_name)
{
struct ffs_data *ffs = kzalloc(sizeof *ffs, GFP_KERNEL);
if (unlikely(!ffs))
@@ -1650,6 +1653,12 @@ static struct ffs_data *ffs_data_new(void)
ENTER();
+ ffs->io_completion_wq = alloc_ordered_workqueue("%s", 0, dev_name);
+ if (!ffs->io_completion_wq) {
+ kfree(ffs);
+ return NULL;
+ }
+
refcount_set(&ffs->ref, 1);
atomic_set(&ffs->opened, 0);
ffs->state = FFS_READ_DESCRIPTORS;
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
index f95bddd6513f..5153e29870c3 100644
--- a/drivers/usb/gadget/function/f_mass_storage.c
+++ b/drivers/usb/gadget/function/f_mass_storage.c
@@ -307,8 +307,6 @@ struct fsg_common {
struct completion thread_notifier;
struct task_struct *thread_task;
- /* Callback functions. */
- const struct fsg_operations *ops;
/* Gadget's private data. */
void *private_data;
@@ -686,9 +684,8 @@ static int do_read(struct fsg_common *common)
/* Perform the read */
file_offset_tmp = file_offset;
- nread = vfs_read(curlun->filp,
- (char __user *)bh->buf,
- amount, &file_offset_tmp);
+ nread = kernel_read(curlun->filp, bh->buf, amount,
+ &file_offset_tmp);
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
(unsigned long long)file_offset, (int)nread);
if (signal_pending(current))
@@ -883,8 +880,8 @@ static int do_write(struct fsg_common *common)
/* Perform the write */
file_offset_tmp = file_offset;
- nwritten = vfs_write(curlun->filp, (char __user *)bh->buf,
- amount, &file_offset_tmp);
+ nwritten = kernel_write(curlun->filp, bh->buf, amount,
+ &file_offset_tmp);
VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
(unsigned long long)file_offset, (int)nwritten);
if (signal_pending(current))
@@ -1021,9 +1018,8 @@ static int do_verify(struct fsg_common *common)
/* Perform the read */
file_offset_tmp = file_offset;
- nread = vfs_read(curlun->filp,
- (char __user *) bh->buf,
- amount, &file_offset_tmp);
+ nread = kernel_read(curlun->filp, bh->buf, amount,
+ &file_offset_tmp);
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
(unsigned long long) file_offset,
(int) nread);
@@ -2440,6 +2436,7 @@ static void handle_exception(struct fsg_common *common)
static int fsg_main_thread(void *common_)
{
struct fsg_common *common = common_;
+ int i;
/*
* Allow the thread to be killed by a signal, but set the signal mask
@@ -2453,13 +2450,6 @@ static int fsg_main_thread(void *common_)
/* Allow the thread to be frozen */
set_freezable();
- /*
- * Arrange for userspace references to be interpreted as kernel
- * pointers. That way we can pass a kernel pointer to a routine
- * that expects a __user pointer and it will work okay.
- */
- set_fs(get_ds());
-
/* The main loop */
while (common->state != FSG_STATE_TERMINATED) {
if (exception_in_progress(common) || signal_pending(current)) {
@@ -2485,21 +2475,16 @@ static int fsg_main_thread(void *common_)
common->thread_task = NULL;
spin_unlock_irq(&common->lock);
- if (!common->ops || !common->ops->thread_exits
- || common->ops->thread_exits(common) < 0) {
- int i;
+ /* Eject media from all LUNs */
- down_write(&common->filesem);
- for (i = 0; i < ARRAY_SIZE(common->luns); i++) {
- struct fsg_lun *curlun = common->luns[i];
- if (!curlun || !fsg_lun_is_open(curlun))
- continue;
+ down_write(&common->filesem);
+ for (i = 0; i < ARRAY_SIZE(common->luns); i++) {
+ struct fsg_lun *curlun = common->luns[i];
+ if (curlun && fsg_lun_is_open(curlun))
fsg_lun_close(curlun);
- curlun->unit_attention_data = SS_MEDIUM_NOT_PRESENT;
- }
- up_write(&common->filesem);
}
+ up_write(&common->filesem);
/* Let fsg_unbind() know the thread has exited */
complete_and_exit(&common->thread_notifier, 0);
@@ -2690,13 +2675,6 @@ void fsg_common_remove_luns(struct fsg_common *common)
}
EXPORT_SYMBOL_GPL(fsg_common_remove_luns);
-void fsg_common_set_ops(struct fsg_common *common,
- const struct fsg_operations *ops)
-{
- common->ops = ops;
-}
-EXPORT_SYMBOL_GPL(fsg_common_set_ops);
-
void fsg_common_free_buffers(struct fsg_common *common)
{
_fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers);
diff --git a/drivers/usb/gadget/function/f_mass_storage.h b/drivers/usb/gadget/function/f_mass_storage.h
index d3902313b8ac..dc05ca0c4359 100644
--- a/drivers/usb/gadget/function/f_mass_storage.h
+++ b/drivers/usb/gadget/function/f_mass_storage.h
@@ -60,17 +60,6 @@ struct fsg_module_parameters {
struct fsg_common;
/* FSF callback functions */
-struct fsg_operations {
- /*
- * Callback function to call when thread exits. If no
- * callback is set or it returns value lower then zero MSF
- * will force eject all LUNs it operates on (including those
- * marked as non-removable or with prevent_medium_removal flag
- * set).
- */
- int (*thread_exits)(struct fsg_common *common);
-};
-
struct fsg_lun_opts {
struct config_group group;
struct fsg_lun *lun;
@@ -142,9 +131,6 @@ void fsg_common_remove_lun(struct fsg_lun *lun);
void fsg_common_remove_luns(struct fsg_common *common);
-void fsg_common_set_ops(struct fsg_common *common,
- const struct fsg_operations *ops);
-
int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg,
unsigned int id, const char *name,
const char **name_pfx);
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 8df244fc9d80..ea0da35a44e2 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -555,6 +555,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
size_t size; /* Amount of data in a TX request. */
size_t bytes_copied = 0;
struct usb_request *req;
+ int value;
DBG(dev, "printer_write trying to send %d bytes\n", (int)len);
@@ -634,7 +635,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
return -EAGAIN;
}
- if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) {
+ /* here, we unlock, and only unlock, to avoid deadlock. */
+ spin_unlock(&dev->lock);
+ value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC);
+ spin_lock(&dev->lock);
+ if (value) {
list_add(&req->list, &dev->tx_reqs);
spin_unlock_irqrestore(&dev->lock, flags);
mutex_unlock(&dev->lock_printer_io);
diff --git a/drivers/usb/gadget/function/u_fs.h b/drivers/usb/gadget/function/u_fs.h
index 540f1c48c1a8..79f70ebf85dc 100644
--- a/drivers/usb/gadget/function/u_fs.h
+++ b/drivers/usb/gadget/function/u_fs.h
@@ -279,6 +279,7 @@ struct ffs_data {
} file_perms;
struct eventfd_ctx *ffs_eventfd;
+ struct workqueue_struct *io_completion_wq;
bool no_disconnect;
struct work_struct reset_work;
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
index 684900fcfe24..5c28bee327e1 100644
--- a/drivers/usb/gadget/legacy/inode.c
+++ b/drivers/usb/gadget/legacy/inode.c
@@ -28,7 +28,7 @@
#include <linux/aio.h>
#include <linux/uio.h>
#include <linux/refcount.h>
-
+#include <linux/delay.h>
#include <linux/device.h>
#include <linux/moduleparam.h>
@@ -116,6 +116,7 @@ enum ep0_state {
struct dev_data {
spinlock_t lock;
refcount_t count;
+ int udc_usage;
enum ep0_state state; /* P: lock */
struct usb_gadgetfs_event event [N_EVENT];
unsigned ev_next;
@@ -513,9 +514,9 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req)
INIT_WORK(&priv->work, ep_user_copy_worker);
schedule_work(&priv->work);
}
- spin_unlock(&epdata->dev->lock);
usb_ep_free_request(ep, req);
+ spin_unlock(&epdata->dev->lock);
put_ep(epdata);
}
@@ -939,9 +940,11 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr)
struct usb_request *req = dev->req;
if ((retval = setup_req (ep, req, 0)) == 0) {
+ ++dev->udc_usage;
spin_unlock_irq (&dev->lock);
retval = usb_ep_queue (ep, req, GFP_KERNEL);
spin_lock_irq (&dev->lock);
+ --dev->udc_usage;
}
dev->state = STATE_DEV_CONNECTED;
@@ -983,11 +986,14 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr)
retval = -EIO;
else {
len = min (len, (size_t)dev->req->actual);
-// FIXME don't call this with the spinlock held ...
+ ++dev->udc_usage;
+ spin_unlock_irq(&dev->lock);
if (copy_to_user (buf, dev->req->buf, len))
retval = -EFAULT;
else
retval = len;
+ spin_lock_irq(&dev->lock);
+ --dev->udc_usage;
clean_req (dev->gadget->ep0, dev->req);
/* NOTE userspace can't yet choose to stall */
}
@@ -1131,6 +1137,7 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
retval = setup_req (dev->gadget->ep0, dev->req, len);
if (retval == 0) {
dev->state = STATE_DEV_CONNECTED;
+ ++dev->udc_usage;
spin_unlock_irq (&dev->lock);
if (copy_from_user (dev->req->buf, buf, len))
retval = -EFAULT;
@@ -1142,6 +1149,7 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
GFP_KERNEL);
}
spin_lock_irq(&dev->lock);
+ --dev->udc_usage;
if (retval < 0) {
clean_req (dev->gadget->ep0, dev->req);
} else
@@ -1243,9 +1251,21 @@ static long dev_ioctl (struct file *fd, unsigned code, unsigned long value)
struct usb_gadget *gadget = dev->gadget;
long ret = -ENOTTY;
- if (gadget->ops->ioctl)
+ spin_lock_irq(&dev->lock);
+ if (dev->state == STATE_DEV_OPENED ||
+ dev->state == STATE_DEV_UNBOUND) {
+ /* Not bound to a UDC */
+ } else if (gadget->ops->ioctl) {
+ ++dev->udc_usage;
+ spin_unlock_irq(&dev->lock);
+
ret = gadget->ops->ioctl (gadget, code, value);
+ spin_lock_irq(&dev->lock);
+ --dev->udc_usage;
+ }
+ spin_unlock_irq(&dev->lock);
+
return ret;
}
@@ -1463,10 +1483,12 @@ delegate:
if (value < 0)
break;
+ ++dev->udc_usage;
spin_unlock (&dev->lock);
value = usb_ep_queue (gadget->ep0, dev->req,
GFP_KERNEL);
spin_lock (&dev->lock);
+ --dev->udc_usage;
if (value < 0) {
clean_req (gadget->ep0, dev->req);
break;
@@ -1490,8 +1512,12 @@ delegate:
req->length = value;
req->zero = value < w_length;
+ ++dev->udc_usage;
spin_unlock (&dev->lock);
value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL);
+ spin_lock(&dev->lock);
+ --dev->udc_usage;
+ spin_unlock(&dev->lock);
if (value < 0) {
DBG (dev, "ep_queue --> %d\n", value);
req->status = 0;
@@ -1518,21 +1544,24 @@ static void destroy_ep_files (struct dev_data *dev)
/* break link to FS */
ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles);
list_del_init (&ep->epfiles);
+ spin_unlock_irq (&dev->lock);
+
dentry = ep->dentry;
ep->dentry = NULL;
parent = d_inode(dentry->d_parent);
/* break link to controller */
+ mutex_lock(&ep->lock);
if (ep->state == STATE_EP_ENABLED)
(void) usb_ep_disable (ep->ep);
ep->state = STATE_EP_UNBOUND;
usb_ep_free_request (ep->ep, ep->req);
ep->ep = NULL;
+ mutex_unlock(&ep->lock);
+
wake_up (&ep->wait);
put_ep (ep);
- spin_unlock_irq (&dev->lock);
-
/* break link to dcache */
inode_lock(parent);
d_delete (dentry);
@@ -1603,6 +1632,11 @@ gadgetfs_unbind (struct usb_gadget *gadget)
spin_lock_irq (&dev->lock);
dev->state = STATE_DEV_UNBOUND;
+ while (dev->udc_usage > 0) {
+ spin_unlock_irq(&dev->lock);
+ usleep_range(1000, 2000);
+ spin_lock_irq(&dev->lock);
+ }
spin_unlock_irq (&dev->lock);
destroy_ep_files (dev);
diff --git a/drivers/usb/gadget/legacy/mass_storage.c b/drivers/usb/gadget/legacy/mass_storage.c
index e99ab57ee3e5..fcba59782f26 100644
--- a/drivers/usb/gadget/legacy/mass_storage.c
+++ b/drivers/usb/gadget/legacy/mass_storage.c
@@ -107,15 +107,6 @@ static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS;
FSG_MODULE_PARAMETERS(/* no prefix */, mod_data);
-static unsigned long msg_registered;
-static void msg_cleanup(void);
-
-static int msg_thread_exits(struct fsg_common *common)
-{
- msg_cleanup();
- return 0;
-}
-
static int msg_do_config(struct usb_configuration *c)
{
struct fsg_opts *opts;
@@ -154,9 +145,6 @@ static struct usb_configuration msg_config_driver = {
static int msg_bind(struct usb_composite_dev *cdev)
{
- static const struct fsg_operations ops = {
- .thread_exits = msg_thread_exits,
- };
struct fsg_opts *opts;
struct fsg_config config;
int status;
@@ -173,8 +161,6 @@ static int msg_bind(struct usb_composite_dev *cdev)
if (status)
goto fail;
- fsg_common_set_ops(opts->common, &ops);
-
status = fsg_common_set_cdev(opts->common, cdev, config.can_stall);
if (status)
goto fail_set_cdev;
@@ -256,18 +242,12 @@ MODULE_LICENSE("GPL");
static int __init msg_init(void)
{
- int ret;
-
- ret = usb_composite_probe(&msg_driver);
- set_bit(0, &msg_registered);
-
- return ret;
+ return usb_composite_probe(&msg_driver);
}
module_init(msg_init);
-static void msg_cleanup(void)
+static void __exit msg_cleanup(void)
{
- if (test_and_clear_bit(0, &msg_registered))
- usb_composite_unregister(&msg_driver);
+ usb_composite_unregister(&msg_driver);
}
module_exit(msg_cleanup);
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig
index 7cd5c969fcbe..1e9567091d86 100644
--- a/drivers/usb/gadget/udc/Kconfig
+++ b/drivers/usb/gadget/udc/Kconfig
@@ -273,6 +273,7 @@ config USB_SNP_CORE
config USB_SNP_UDC_PLAT
tristate "Synopsys USB 2.0 Device controller"
depends on USB_GADGET && OF && HAS_DMA
+ depends on EXTCON || EXTCON=n
select USB_GADGET_DUALSPEED
select USB_SNP_CORE
default ARCH_BCM_IPROC
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c
index 98d71400f8a1..a884c022df7a 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -29,6 +29,8 @@
#include <linux/of_gpio.h>
#include "atmel_usba_udc.h"
+#define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \
+ | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING)
#ifdef CONFIG_USB_GADGET_DEBUG_FS
#include <linux/debugfs.h>
@@ -2361,7 +2363,7 @@ static int usba_udc_probe(struct platform_device *pdev)
IRQ_NOAUTOEN);
ret = devm_request_threaded_irq(&pdev->dev,
gpio_to_irq(udc->vbus_pin), NULL,
- usba_vbus_irq_thread, IRQF_ONESHOT,
+ usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS,
"atmel_usba_udc", udc);
if (ret) {
udc->vbus_pin = -ENODEV;
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index 75c51ca4ee0f..d41d07aae0ce 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -1320,8 +1320,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri
udc->dev.driver = &driver->driver;
udc->gadget->dev.driver = &driver->driver;
- if (driver->max_speed < udc->gadget->max_speed)
- usb_gadget_udc_set_speed(udc, driver->max_speed);
+ usb_gadget_udc_set_speed(udc, driver->max_speed);
ret = driver->bind(udc->gadget, driver);
if (ret)
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c
index a030d7923d7d..b17618a55f1b 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -237,6 +237,8 @@ struct dummy_hcd {
struct usb_device *udev;
struct list_head urbp_list;
+ struct urbp *next_frame_urbp;
+
u32 stream_en_ep;
u8 num_stream[30 / 2];
@@ -253,11 +255,13 @@ struct dummy {
*/
struct dummy_ep ep[DUMMY_ENDPOINTS];
int address;
+ int callback_usage;
struct usb_gadget gadget;
struct usb_gadget_driver *driver;
struct dummy_request fifo_req;
u8 fifo_buf[FIFO_SIZE];
u16 devstatus;
+ unsigned ints_enabled:1;
unsigned udc_suspended:1;
unsigned pullup:1;
@@ -375,11 +379,10 @@ static void set_link_state_by_speed(struct dummy_hcd *dum_hcd)
USB_PORT_STAT_CONNECTION) == 0)
dum_hcd->port_status |=
(USB_PORT_STAT_C_CONNECTION << 16);
- if ((dum_hcd->port_status &
- USB_PORT_STAT_ENABLE) == 1 &&
- (dum_hcd->port_status &
- USB_SS_PORT_LS_U0) == 1 &&
- dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
+ if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) &&
+ (dum_hcd->port_status &
+ USB_PORT_STAT_LINK_STATE) == USB_SS_PORT_LS_U0 &&
+ dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
dum_hcd->active = 1;
}
} else {
@@ -440,18 +443,27 @@ static void set_link_state(struct dummy_hcd *dum_hcd)
(~dum_hcd->old_status) & dum_hcd->port_status;
/* Report reset and disconnect events to the driver */
- if (dum->driver && (disconnect || reset)) {
+ if (dum->ints_enabled && (disconnect || reset)) {
stop_activity(dum);
+ ++dum->callback_usage;
+ spin_unlock(&dum->lock);
if (reset)
usb_gadget_udc_reset(&dum->gadget, dum->driver);
else
dum->driver->disconnect(&dum->gadget);
+ spin_lock(&dum->lock);
+ --dum->callback_usage;
}
- } else if (dum_hcd->active != dum_hcd->old_active) {
+ } else if (dum_hcd->active != dum_hcd->old_active &&
+ dum->ints_enabled) {
+ ++dum->callback_usage;
+ spin_unlock(&dum->lock);
if (dum_hcd->old_active && dum->driver->suspend)
dum->driver->suspend(&dum->gadget);
else if (!dum_hcd->old_active && dum->driver->resume)
dum->driver->resume(&dum->gadget);
+ spin_lock(&dum->lock);
+ --dum->callback_usage;
}
dum_hcd->old_status = dum_hcd->port_status;
@@ -972,8 +984,11 @@ static int dummy_udc_start(struct usb_gadget *g,
* can't enumerate without help from the driver we're binding.
*/
+ spin_lock_irq(&dum->lock);
dum->devstatus = 0;
dum->driver = driver;
+ dum->ints_enabled = 1;
+ spin_unlock_irq(&dum->lock);
return 0;
}
@@ -984,6 +999,16 @@ static int dummy_udc_stop(struct usb_gadget *g)
struct dummy *dum = dum_hcd->dum;
spin_lock_irq(&dum->lock);
+ dum->ints_enabled = 0;
+ stop_activity(dum);
+
+ /* emulate synchronize_irq(): wait for callbacks to finish */
+ while (dum->callback_usage > 0) {
+ spin_unlock_irq(&dum->lock);
+ usleep_range(1000, 2000);
+ spin_lock_irq(&dum->lock);
+ }
+
dum->driver = NULL;
spin_unlock_irq(&dum->lock);
@@ -1037,7 +1062,12 @@ static int dummy_udc_probe(struct platform_device *pdev)
memzero_explicit(&dum->gadget, sizeof(struct usb_gadget));
dum->gadget.name = gadget_name;
dum->gadget.ops = &dummy_ops;
- dum->gadget.max_speed = USB_SPEED_SUPER;
+ if (mod_data.is_super_speed)
+ dum->gadget.max_speed = USB_SPEED_SUPER;
+ else if (mod_data.is_high_speed)
+ dum->gadget.max_speed = USB_SPEED_HIGH;
+ else
+ dum->gadget.max_speed = USB_SPEED_FULL;
dum->gadget.dev.parent = &pdev->dev;
init_dummy_udc_hw(dum);
@@ -1246,6 +1276,8 @@ static int dummy_urb_enqueue(
list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
urb->hcpriv = urbp;
+ if (!dum_hcd->next_frame_urbp)
+ dum_hcd->next_frame_urbp = urbp;
if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
urb->error_count = 1; /* mark as a new urb */
@@ -1521,6 +1553,8 @@ static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address)
if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ?
dum->ss_hcd : dum->hs_hcd)))
return NULL;
+ if (!dum->ints_enabled)
+ return NULL;
if ((address & ~USB_DIR_IN) == 0)
return &dum->ep[0];
for (i = 1; i < DUMMY_ENDPOINTS; i++) {
@@ -1762,6 +1796,7 @@ static void dummy_timer(unsigned long _dum_hcd)
spin_unlock_irqrestore(&dum->lock, flags);
return;
}
+ dum_hcd->next_frame_urbp = NULL;
for (i = 0; i < DUMMY_ENDPOINTS; i++) {
if (!ep_info[i].name)
@@ -1778,6 +1813,10 @@ restart:
int type;
int status = -EINPROGRESS;
+ /* stop when we reach URBs queued after the timer interrupt */
+ if (urbp == dum_hcd->next_frame_urbp)
+ break;
+
urb = urbp->urb;
if (urb->unlinked)
goto return_urb;
@@ -1857,10 +1896,12 @@ restart:
* until setup() returns; no reentrancy issues etc.
*/
if (value > 0) {
+ ++dum->callback_usage;
spin_unlock(&dum->lock);
value = dum->driver->setup(&dum->gadget,
&setup);
spin_lock(&dum->lock);
+ --dum->callback_usage;
if (value >= 0) {
/* no delays (max 64KB data stage) */
@@ -2561,8 +2602,6 @@ static struct hc_driver dummy_hcd = {
.product_desc = "Dummy host controller",
.hcd_priv_size = sizeof(struct dummy_hcd),
- .flags = HCD_USB3 | HCD_SHARED,
-
.reset = dummy_setup,
.start = dummy_start,
.stop = dummy_stop,
@@ -2591,8 +2630,12 @@ static int dummy_hcd_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
dum = *((void **)dev_get_platdata(&pdev->dev));
- if (!mod_data.is_super_speed)
+ if (mod_data.is_super_speed)
+ dummy_hcd.flags = HCD_USB3 | HCD_SHARED;
+ else if (mod_data.is_high_speed)
dummy_hcd.flags = HCD_USB2;
+ else
+ dummy_hcd.flags = HCD_USB11;
hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
if (!hs_hcd)
return -ENOMEM;
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c
index df37c1e6e9d5..63a206122058 100644
--- a/drivers/usb/gadget/udc/renesas_usb3.c
+++ b/drivers/usb/gadget/udc/renesas_usb3.c
@@ -1038,7 +1038,7 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep,
usb3_ep->ep.maxpacket);
u8 *buf = usb3_req->req.buf + usb3_req->req.actual;
u32 tmp = 0;
- bool is_last;
+ bool is_last = !len ? true : false;
if (usb3_wait_pipe_status(usb3_ep, PX_STA_BUFSTS) < 0)
return -EBUSY;
@@ -1059,7 +1059,8 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep,
usb3_write(usb3, tmp, fifo_reg);
}
- is_last = usb3_is_transfer_complete(usb3_ep, usb3_req);
+ if (!is_last)
+ is_last = usb3_is_transfer_complete(usb3_ep, usb3_req);
/* Send the data */
usb3_set_px_con_send(usb3_ep, len, is_last);
@@ -1150,7 +1151,8 @@ static void usb3_start_pipe0(struct renesas_usb3_ep *usb3_ep,
usb3_set_p0_con_for_ctrl_read_data(usb3);
} else {
usb3_clear_bit(usb3, P0_MOD_DIR, USB3_P0_MOD);
- usb3_set_p0_con_for_ctrl_write_data(usb3);
+ if (usb3_req->req.length)
+ usb3_set_p0_con_for_ctrl_write_data(usb3);
}
usb3_p0_xfer(usb3_ep, usb3_req);
@@ -2053,7 +2055,16 @@ static u32 usb3_calc_ramarea(int ram_size)
static u32 usb3_calc_rammap_val(struct renesas_usb3_ep *usb3_ep,
const struct usb_endpoint_descriptor *desc)
{
- return usb3_ep->rammap_val | PN_RAMMAP_MPKT(usb_endpoint_maxp(desc));
+ int i;
+ const u32 max_packet_array[] = {8, 16, 32, 64, 512};
+ u32 mpkt = PN_RAMMAP_MPKT(1024);
+
+ for (i = 0; i < ARRAY_SIZE(max_packet_array); i++) {
+ if (usb_endpoint_maxp(desc) <= max_packet_array[i])
+ mpkt = PN_RAMMAP_MPKT(max_packet_array[i]);
+ }
+
+ return usb3_ep->rammap_val | mpkt;
}
static int usb3_enable_pipe_n(struct renesas_usb3_ep *usb3_ep,
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c
index a8b8d8b8d9f3..d4e0f7cd96fa 100644
--- a/drivers/usb/host/ohci-sm501.c
+++ b/drivers/usb/host/ohci-sm501.c
@@ -123,13 +123,12 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
* regular memory. The HCD_LOCAL_MEM flag does just that.
*/
- if (!dma_declare_coherent_memory(dev, mem->start,
+ retval = dma_declare_coherent_memory(dev, mem->start,
mem->start - mem->parent->start,
resource_size(mem),
- DMA_MEMORY_MAP |
- DMA_MEMORY_EXCLUSIVE)) {
+ DMA_MEMORY_EXCLUSIVE);
+ if (retval) {
dev_err(dev, "cannot declare coherent memory\n");
- retval = -ENXIO;
goto err1;
}
diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c
index cfcfadfc94fc..16d081a093bb 100644
--- a/drivers/usb/host/ohci-tmio.c
+++ b/drivers/usb/host/ohci-tmio.c
@@ -227,13 +227,10 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
goto err_ioremap_regs;
}
- if (!dma_declare_coherent_memory(&dev->dev, sram->start,
- sram->start,
- resource_size(sram),
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE)) {
- ret = -EBUSY;
+ ret = dma_declare_coherent_memory(&dev->dev, sram->start, sram->start,
+ resource_size(sram), DMA_MEMORY_EXCLUSIVE);
+ if (ret)
goto err_dma_declare;
- }
if (cell->enable) {
ret = cell->enable(dev);
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index 658d9d1f9ea3..6dda3623a276 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -447,7 +447,7 @@ static int usb_asmedia_wait_write(struct pci_dev *pdev)
if ((value & ASMT_CONTROL_WRITE_BIT) == 0)
return 0;
- usleep_range(40, 60);
+ udelay(50);
}
dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__);
@@ -1022,7 +1022,7 @@ EXPORT_SYMBOL_GPL(usb_disable_xhci_ports);
*
* Takes care of the handoff between the Pre-OS (i.e. BIOS) and the OS.
* It signals to the BIOS that the OS wants control of the host controller,
- * and then waits 5 seconds for the BIOS to hand over control.
+ * and then waits 1 second for the BIOS to hand over control.
* If we timeout, assume the BIOS is broken and take control anyway.
*/
static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
@@ -1069,9 +1069,9 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
if (val & XHCI_HC_BIOS_OWNED) {
writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset);
- /* Wait for 5 seconds with 10 microsecond polling interval */
+ /* Wait for 1 second with 10 microsecond polling interval */
timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED,
- 0, 5000, 10);
+ 0, 1000000, 10);
/* Assume a buggy BIOS and take HC ownership anyway */
if (timeout) {
@@ -1100,7 +1100,7 @@ hc_init:
* operational or runtime registers. Wait 5 seconds and no more.
*/
timeout = handshake(op_reg_base + XHCI_STS_OFFSET, XHCI_STS_CNR, 0,
- 5000, 10);
+ 5000000, 10);
/* Assume a buggy HC and start HC initialization anyway */
if (timeout) {
val = readl(op_reg_base + XHCI_STS_OFFSET);
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index ad89a6d4111b..da9158f171cb 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -112,7 +112,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
/* If PSI table exists, add the custom speed attributes from it */
if (usb3_1 && xhci->usb3_rhub.psi_count) {
- u32 ssp_cap_base, bm_attrib, psi;
+ u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp;
int offset;
ssp_cap_base = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE;
@@ -139,6 +139,15 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
for (i = 0; i < xhci->usb3_rhub.psi_count; i++) {
psi = xhci->usb3_rhub.psi[i];
psi &= ~USB_SSP_SUBLINK_SPEED_RSVD;
+ psi_exp = XHCI_EXT_PORT_PSIE(psi);
+ psi_mant = XHCI_EXT_PORT_PSIM(psi);
+
+ /* Shift to Gbps and set SSP Link BIT(14) if 10Gpbs */
+ for (; psi_exp < 3; psi_exp++)
+ psi_mant /= 1000;
+ if (psi_mant >= 10)
+ psi |= BIT(14);
+
if ((psi & PLT_MASK) == PLT_SYM) {
/* Symmetric, create SSA RX and TX from one PSI entry */
put_unaligned_le32(psi, &buf[offset]);
@@ -1506,9 +1515,6 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
t2 |= PORT_WKOC_E | PORT_WKCONN_E;
t2 &= ~PORT_WKDISC_E;
}
- if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) &&
- (hcd->speed < HCD_USB3))
- t2 &= ~PORT_WAKE_BITS;
} else
t2 &= ~PORT_WAKE_BITS;
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 8071c8fdd15e..76f392954733 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -54,11 +54,6 @@
#define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8
#define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0
-#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9
-#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
-#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
-#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc
-
#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
static const char hcd_name[] = "xhci_hcd";
@@ -142,13 +137,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
if (pdev->vendor == PCI_VENDOR_ID_AMD)
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
- if ((pdev->vendor == PCI_VENDOR_ID_AMD) &&
- ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) ||
- (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) ||
- (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) ||
- (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1)))
- xhci->quirks |= XHCI_U2_DISABLE_WAKE;
-
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
xhci->quirks |= XHCI_LPM_SUPPORT;
xhci->quirks |= XHCI_INTEL_HOST;
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 163bafde709f..1cb6eaef4ae1 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -178,14 +178,18 @@ static int xhci_plat_probe(struct platform_device *pdev)
* 2. xhci_plat is child of a device from firmware (dwc3-plat)
* 3. xhci_plat is grandchild of a pci device (dwc3-pci)
*/
- sysdev = &pdev->dev;
- if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node)
- sysdev = sysdev->parent;
+ for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) {
+ if (is_of_node(sysdev->fwnode) ||
+ is_acpi_device_node(sysdev->fwnode))
+ break;
#ifdef CONFIG_PCI
- else if (sysdev->parent && sysdev->parent->parent &&
- sysdev->parent->parent->bus == &pci_bus_type)
- sysdev = sysdev->parent->parent;
+ else if (sysdev->bus == &pci_bus_type)
+ break;
#endif
+ }
+
+ if (!sysdev)
+ sysdev = &pdev->dev;
/* Try to set 64-bit DMA first */
if (WARN_ON(!sysdev->dma_mask))
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index b2ff1ff1a02f..ee198ea47f49 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1703,7 +1703,8 @@ static int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev,
if (xhci->quirks & XHCI_MTK_HOST) {
ret = xhci_mtk_add_ep_quirk(hcd, udev, ep);
if (ret < 0) {
- xhci_free_endpoint_ring(xhci, virt_dev, ep_index);
+ xhci_ring_free(xhci, virt_dev->eps[ep_index].new_ring);
+ virt_dev->eps[ep_index].new_ring = NULL;
return ret;
}
}
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 2abaa4d6d39d..2b48aa4f6b76 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -735,6 +735,8 @@ struct xhci_ep_ctx {
#define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK)
/* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */
#define EP_HAS_LSA (1 << 15)
+/* hosts with LEC=1 use bits 31:24 as ESIT high bits. */
+#define CTX_TO_MAX_ESIT_PAYLOAD_HI(p) (((p) >> 24) & 0xff)
/* ep_info2 bitmasks */
/*
@@ -1681,7 +1683,7 @@ struct xhci_bus_state {
static inline unsigned int hcd_index(struct usb_hcd *hcd)
{
- if (hcd->speed == HCD_USB3)
+ if (hcd->speed >= HCD_USB3)
return 0;
else
return 1;
@@ -1826,7 +1828,7 @@ struct xhci_hcd {
/* For controller with a broken Port Disable implementation */
#define XHCI_BROKEN_PORT_PED (1 << 25)
#define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26)
-#define XHCI_U2_DISABLE_WAKE (1 << 27)
+/* Reserved. It was XHCI_U2_DISABLE_WAKE */
#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28)
unsigned int num_active_eps;
@@ -2540,8 +2542,8 @@ static inline const char *xhci_decode_ep_context(u32 info, u32 info2, u64 deq,
u8 lsa;
u8 hid;
- esit = EP_MAX_ESIT_PAYLOAD_HI(info) << 16 |
- EP_MAX_ESIT_PAYLOAD_LO(tx_info);
+ esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 |
+ CTX_TO_MAX_ESIT_PAYLOAD(tx_info);
ep_state = info & EP_STATE_MASK;
max_pstr = info & EP_MAXPSTREAMS_MASK;
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c
index d1af831f43eb..68f26904c316 100644
--- a/drivers/usb/renesas_usbhs/fifo.c
+++ b/drivers/usb/renesas_usbhs/fifo.c
@@ -282,11 +282,26 @@ static void usbhsf_fifo_clear(struct usbhs_pipe *pipe,
struct usbhs_fifo *fifo)
{
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
+ int ret = 0;
- if (!usbhs_pipe_is_dcp(pipe))
- usbhsf_fifo_barrier(priv, fifo);
+ if (!usbhs_pipe_is_dcp(pipe)) {
+ /*
+ * This driver checks the pipe condition first to avoid -EBUSY
+ * from usbhsf_fifo_barrier() with about 10 msec delay in
+ * the interrupt handler if the pipe is RX direction and empty.
+ */
+ if (usbhs_pipe_is_dir_in(pipe))
+ ret = usbhs_pipe_is_accessible(pipe);
+ if (!ret)
+ ret = usbhsf_fifo_barrier(priv, fifo);
+ }
- usbhs_write(priv, fifo->ctr, BCLR);
+ /*
+ * if non-DCP pipe, this driver should set BCLR when
+ * usbhsf_fifo_barrier() returns 0.
+ */
+ if (!ret)
+ usbhs_write(priv, fifo->ctr, BCLR);
}
static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv,
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 1a59f335b063..a3ccb899df60 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -834,13 +834,25 @@ Retry_Sense:
if (result == USB_STOR_TRANSPORT_GOOD) {
srb->result = SAM_STAT_GOOD;
srb->sense_buffer[0] = 0x0;
+ }
+
+ /*
+ * ATA-passthru commands use sense data to report
+ * the command completion status, and often devices
+ * return Check Condition status when nothing is
+ * wrong.
+ */
+ else if (srb->cmnd[0] == ATA_16 ||
+ srb->cmnd[0] == ATA_12) {
+ /* leave the data alone */
+ }
/*
* If there was a problem, report an unspecified
* hardware error to prevent the higher layers from
* entering an infinite retry loop.
*/
- } else {
+ else {
srb->result = DID_ERROR << 16;
if ((sshdr.response_code & 0x72) == 0x72)
srb->sense_buffer[1] = HARDWARE_ERROR;
diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h
index f58caa9e6a27..a155cd02bce2 100644
--- a/drivers/usb/storage/uas-detect.h
+++ b/drivers/usb/storage/uas-detect.h
@@ -9,7 +9,8 @@ static int uas_is_interface(struct usb_host_interface *intf)
intf->desc.bInterfaceProtocol == USB_PR_UAS);
}
-static int uas_find_uas_alt_setting(struct usb_interface *intf)
+static struct usb_host_interface *uas_find_uas_alt_setting(
+ struct usb_interface *intf)
{
int i;
@@ -17,10 +18,10 @@ static int uas_find_uas_alt_setting(struct usb_interface *intf)
struct usb_host_interface *alt = &intf->altsetting[i];
if (uas_is_interface(alt))
- return alt->desc.bAlternateSetting;
+ return alt;
}
- return -ENODEV;
+ return NULL;
}
static int uas_find_endpoints(struct usb_host_interface *alt,
@@ -58,14 +59,14 @@ static int uas_use_uas_driver(struct usb_interface *intf,
struct usb_device *udev = interface_to_usbdev(intf);
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
unsigned long flags = id->driver_info;
- int r, alt;
-
+ struct usb_host_interface *alt;
+ int r;
alt = uas_find_uas_alt_setting(intf);
- if (alt < 0)
+ if (!alt)
return 0;
- r = uas_find_endpoints(&intf->altsetting[alt], eps);
+ r = uas_find_endpoints(alt, eps);
if (r < 0)
return 0;
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index cfb1e3bbd434..63cf981ed81c 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -873,14 +873,14 @@ MODULE_DEVICE_TABLE(usb, uas_usb_ids);
static int uas_switch_interface(struct usb_device *udev,
struct usb_interface *intf)
{
- int alt;
+ struct usb_host_interface *alt;
alt = uas_find_uas_alt_setting(intf);
- if (alt < 0)
- return alt;
+ if (!alt)
+ return -ENODEV;
- return usb_set_interface(udev,
- intf->altsetting[0].desc.bInterfaceNumber, alt);
+ return usb_set_interface(udev, alt->desc.bInterfaceNumber,
+ alt->desc.bAlternateSetting);
}
static int uas_configure_endpoints(struct uas_dev_info *devinfo)
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 5a70c33ef0e0..eb06d88b41d6 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -1459,6 +1459,13 @@ UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_SANE_SENSE ),
+/* Reported by Kris Lindgren <[email protected]> */
+UNUSUAL_DEV( 0x0bc2, 0x3332, 0x0000, 0x9999,
+ "Seagate",
+ "External",
+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+ US_FL_NO_WP_DETECT ),
+
UNUSUAL_DEV( 0x0d49, 0x7310, 0x0000, 0x9999,
"Maxtor",
"USB to SATA",
diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c
index 35a1e777b449..9a53912bdfe9 100644
--- a/drivers/uwb/hwa-rc.c
+++ b/drivers/uwb/hwa-rc.c
@@ -825,6 +825,8 @@ static int hwarc_probe(struct usb_interface *iface,
if (iface->cur_altsetting->desc.bNumEndpoints < 1)
return -ENODEV;
+ if (!usb_endpoint_xfer_int(&iface->cur_altsetting->endpoint[0].desc))
+ return -ENODEV;
result = -ENOMEM;
uwb_rc = uwb_rc_alloc();
diff --git a/drivers/uwb/uwbd.c b/drivers/uwb/uwbd.c
index 01c20a260a8b..39dd4ef53c77 100644
--- a/drivers/uwb/uwbd.c
+++ b/drivers/uwb/uwbd.c
@@ -302,18 +302,22 @@ static int uwbd(void *param)
/** Start the UWB daemon */
void uwbd_start(struct uwb_rc *rc)
{
- rc->uwbd.task = kthread_run(uwbd, rc, "uwbd");
- if (rc->uwbd.task == NULL)
+ struct task_struct *task = kthread_run(uwbd, rc, "uwbd");
+ if (IS_ERR(task)) {
+ rc->uwbd.task = NULL;
printk(KERN_ERR "UWB: Cannot start management daemon; "
"UWB won't work\n");
- else
+ } else {
+ rc->uwbd.task = task;
rc->uwbd.pid = rc->uwbd.task->pid;
+ }
}
/* Stop the UWB daemon and free any unprocessed events */
void uwbd_stop(struct uwb_rc *rc)
{
- kthread_stop(rc->uwbd.task);
+ if (rc->uwbd.task)
+ kthread_stop(rc->uwbd.task);
uwbd_flush(rc);
}
diff --git a/drivers/vfio/platform/vfio_amba.c b/drivers/vfio/platform/vfio_amba.c
index 31372fbf6c5b..62dfbfeaabfc 100644
--- a/drivers/vfio/platform/vfio_amba.c
+++ b/drivers/vfio/platform/vfio_amba.c
@@ -93,7 +93,7 @@ static int vfio_amba_remove(struct amba_device *adev)
return -EINVAL;
}
-static struct amba_id pl330_ids[] = {
+static const struct amba_id pl330_ids[] = {
{ 0, 0 },
};
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 330d50582f40..f5a86f651f38 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -85,6 +85,7 @@ struct vfio_group {
struct list_head unbound_list;
struct mutex unbound_lock;
atomic_t opened;
+ wait_queue_head_t container_q;
bool noiommu;
struct kvm *kvm;
struct blocking_notifier_head notifier;
@@ -138,9 +139,10 @@ struct iommu_group *vfio_iommu_group_get(struct device *dev)
iommu_group_set_name(group, "vfio-noiommu");
iommu_group_set_iommudata(group, &noiommu, NULL);
ret = iommu_group_add_device(group, dev);
- iommu_group_put(group);
- if (ret)
+ if (ret) {
+ iommu_group_put(group);
return NULL;
+ }
/*
* Where to taint? At this point we've added an IOMMU group for a
@@ -337,6 +339,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
mutex_init(&group->unbound_lock);
atomic_set(&group->container_users, 0);
atomic_set(&group->opened, 0);
+ init_waitqueue_head(&group->container_q);
group->iommu_group = iommu_group;
#ifdef CONFIG_VFIO_NOIOMMU
group->noiommu = (iommu_group_get_iommudata(iommu_group) == &noiommu);
@@ -993,6 +996,23 @@ void *vfio_del_group_dev(struct device *dev)
}
} while (ret <= 0);
+ /*
+ * In order to support multiple devices per group, devices can be
+ * plucked from the group while other devices in the group are still
+ * in use. The container persists with this group and those remaining
+ * devices still attached. If the user creates an isolation violation
+ * by binding this device to another driver while the group is still in
+ * use, that's their fault. However, in the case of removing the last,
+ * or potentially the only, device in the group there can be no other
+ * in-use devices in the group. The user has done their due diligence
+ * and we should lay no claims to those devices. In order to do that,
+ * we need to make sure the group is detached from the container.
+ * Without this stall, we're potentially racing with a user process
+ * that may attempt to immediately bind this device to another driver.
+ */
+ if (list_empty(&group->device_list))
+ wait_event(group->container_q, !group->container);
+
vfio_group_put(group);
return device_data;
@@ -1298,6 +1318,7 @@ static void __vfio_group_unset_container(struct vfio_group *group)
group->iommu_group);
group->container = NULL;
+ wake_up(&group->container_q);
list_del(&group->container_next);
/* Detaching the last group deprivileges a container, remove iommu */
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 8549cb111627..92155cce926d 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -1169,13 +1169,21 @@ static bool vfio_iommu_has_sw_msi(struct iommu_group *group, phys_addr_t *base)
INIT_LIST_HEAD(&group_resv_regions);
iommu_get_group_resv_regions(group, &group_resv_regions);
list_for_each_entry(region, &group_resv_regions, list) {
+ /*
+ * The presence of any 'real' MSI regions should take
+ * precedence over the software-managed one if the
+ * IOMMU driver happens to advertise both types.
+ */
+ if (region->type == IOMMU_RESV_MSI) {
+ ret = false;
+ break;
+ }
+
if (region->type == IOMMU_RESV_SW_MSI) {
*base = region->start;
ret = true;
- goto out;
}
}
-out:
list_for_each_entry_safe(region, next, &group_resv_regions, list)
kfree(region);
return ret;
@@ -1265,8 +1273,8 @@ static int vfio_iommu_type1_attach_group(void *iommu_data,
INIT_LIST_HEAD(&domain->group_list);
list_add(&group->next, &domain->group_list);
- msi_remap = resv_msi ? irq_domain_check_msi_remap() :
- iommu_capable(bus, IOMMU_CAP_INTR_REMAP);
+ msi_remap = irq_domain_check_msi_remap() ||
+ iommu_capable(bus, IOMMU_CAP_INTR_REMAP);
if (!allow_unsafe_interrupts && !msi_remap) {
pr_warn("%s: No interrupt remapping support. Use the module param \"allow_unsafe_interrupts\" to enable VFIO IOMMU support on this platform\n",
diff --git a/drivers/video/backlight/kb3886_bl.c b/drivers/video/backlight/kb3886_bl.c
index 84a110a719cb..96312c3afc07 100644
--- a/drivers/video/backlight/kb3886_bl.c
+++ b/drivers/video/backlight/kb3886_bl.c
@@ -78,7 +78,7 @@ static struct kb3886bl_machinfo *bl_machinfo;
static unsigned long kb3886bl_flags;
#define KB3886BL_SUSPENDED 0x01
-static struct dmi_system_id kb3886bl_device_table[] __initdata = {
+static const struct dmi_system_id kb3886bl_device_table[] __initconst = {
{
.ident = "Sahara Touch-iT",
.matches = {
diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
index 2111d06f8c81..7f1f1fbcef9e 100644
--- a/drivers/video/console/Kconfig
+++ b/drivers/video/console/Kconfig
@@ -117,7 +117,7 @@ config DUMMY_CONSOLE_ROWS
Select 25 if you use a 640x480 resolution by default.
config FRAMEBUFFER_CONSOLE
- tristate "Framebuffer Console support"
+ bool "Framebuffer Console support"
depends on FB && !UML
select VT_HW_CONSOLE_BINDING
select CRC32
diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile
index 43bfa485db96..eb2cbec52643 100644
--- a/drivers/video/console/Makefile
+++ b/drivers/video/console/Makefile
@@ -7,13 +7,5 @@ obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o
obj-$(CONFIG_STI_CONSOLE) += sticon.o sticore.o
obj-$(CONFIG_VGA_CONSOLE) += vgacon.o
obj-$(CONFIG_MDA_CONSOLE) += mdacon.o
-obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o softcursor.o
-ifeq ($(CONFIG_FB_TILEBLITTING),y)
-obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += tileblit.o
-endif
-ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y)
-obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \
- fbcon_ccw.o
-endif
obj-$(CONFIG_FB_STI) += sticore.o
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index dc06cb6a15dc..445b1dc5d441 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -398,9 +398,8 @@ static const char *vgacon_startup(void)
#endif
}
- /* boot_params.screen_info initialized? */
- if ((screen_info.orig_video_mode == 0) &&
- (screen_info.orig_video_lines == 0) &&
+ /* boot_params.screen_info reasonably initialized? */
+ if ((screen_info.orig_video_lines == 0) ||
(screen_info.orig_video_cols == 0))
goto no_vga;
diff --git a/drivers/video/fbdev/68328fb.c b/drivers/video/fbdev/68328fb.c
index c0c6b88d3839..d48e96088f76 100644
--- a/drivers/video/fbdev/68328fb.c
+++ b/drivers/video/fbdev/68328fb.c
@@ -72,7 +72,7 @@ static struct fb_var_screeninfo mc68x328fb_default __initdata = {
.vmode = FB_VMODE_NONINTERLACED,
};
-static struct fb_fix_screeninfo mc68x328fb_fix __initdata = {
+static const struct fb_fix_screeninfo mc68x328fb_fix __initconst = {
.id = "68328fb",
.type = FB_TYPE_PACKED_PIXELS,
.xpanstep = 1,
diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index 5c6696bb56da..5e58f5ec0a28 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2173,7 +2173,7 @@ config FB_PS3_DEFAULT_SIZE_M
config FB_XILINX
tristate "Xilinx frame buffer support"
- depends on FB && (XILINX_VIRTEX || MICROBLAZE || ARCH_ZYNQ)
+ depends on FB && (XILINX_VIRTEX || MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP)
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c
index ffc2c33c6cef..36d25190b48c 100644
--- a/drivers/video/fbdev/amba-clcd.c
+++ b/drivers/video/fbdev/amba-clcd.c
@@ -1035,7 +1035,7 @@ static struct clcd_vendor_data vendor_nomadik = {
.init_panel = nomadik_clcd_init_panel,
};
-static struct amba_id clcdfb_id_table[] = {
+static const struct amba_id clcdfb_id_table[] = {
{
.id = 0x00041110,
.mask = 0x000ffffe,
diff --git a/drivers/video/fbdev/arkfb.c b/drivers/video/fbdev/arkfb.c
index 6a317de7082c..13ba371e70aa 100644
--- a/drivers/video/fbdev/arkfb.c
+++ b/drivers/video/fbdev/arkfb.c
@@ -1157,7 +1157,7 @@ fail:
/* List of boards that we are trying to support */
-static struct pci_device_id ark_devices[] = {
+static const struct pci_device_id ark_devices[] = {
{PCI_DEVICE(0xEDD8, 0xA099)},
{0, 0, 0, 0, 0, 0, 0}
};
diff --git a/drivers/video/fbdev/asiliantfb.c b/drivers/video/fbdev/asiliantfb.c
index 91eea4583382..ea31054a28ca 100644
--- a/drivers/video/fbdev/asiliantfb.c
+++ b/drivers/video/fbdev/asiliantfb.c
@@ -592,7 +592,7 @@ static void asiliantfb_remove(struct pci_dev *dp)
framebuffer_release(p);
}
-static struct pci_device_id asiliantfb_pci_tbl[] = {
+static const struct pci_device_id asiliantfb_pci_tbl[] = {
{ PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69000, PCI_ANY_ID, PCI_ANY_ID },
{ 0 }
};
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
index 669ecc755fa9..e06358da4b99 100644
--- a/drivers/video/fbdev/atmel_lcdfb.c
+++ b/drivers/video/fbdev/atmel_lcdfb.c
@@ -320,7 +320,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
}
}
-static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = {
+static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
.xpanstep = 0,
diff --git a/drivers/video/fbdev/aty/aty128fb.c b/drivers/video/fbdev/aty/aty128fb.c
index fa07242a78d2..db18474607c9 100644
--- a/drivers/video/fbdev/aty/aty128fb.c
+++ b/drivers/video/fbdev/aty/aty128fb.c
@@ -116,7 +116,7 @@ static const struct fb_var_screeninfo default_var = {
/* default modedb mode */
/* 640x480, 60 Hz, Non-Interlaced (25.172 MHz dotclock) */
-static struct fb_videomode defaultmode = {
+static const struct fb_videomode defaultmode = {
.refresh = 60,
.xres = 640,
.yres = 480,
@@ -166,7 +166,7 @@ static int aty128_pci_resume(struct pci_dev *pdev);
static int aty128_do_resume(struct pci_dev *pdev);
/* supported Rage128 chipsets */
-static struct pci_device_id aty128_pci_tbl[] = {
+static const struct pci_device_id aty128_pci_tbl[] = {
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LE,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, rage_M3_pci },
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RAGE128_LF,
diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c
index b55fdac9c9f5..3ec72f19114b 100644
--- a/drivers/video/fbdev/aty/atyfb_base.c
+++ b/drivers/video/fbdev/aty/atyfb_base.c
@@ -274,7 +274,7 @@ static struct fb_var_screeninfo default_var = {
0, FB_VMODE_NONINTERLACED
};
-static struct fb_videomode defmode = {
+static const struct fb_videomode defmode = {
/* 640x480 @ 60 Hz, 31.5 kHz hsync */
NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,
0, FB_VMODE_NONINTERLACED
@@ -1855,7 +1855,7 @@ static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
#if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
case ATYIO_CLKR:
if (M64_HAS(INTEGRATED)) {
- struct atyclk clk;
+ struct atyclk clk = { 0 };
union aty_pll *pll = &par->pll;
u32 dsp_config = pll->ct.dsp_config;
u32 dsp_on_off = pll->ct.dsp_on_off;
@@ -3756,7 +3756,7 @@ static void atyfb_pci_remove(struct pci_dev *pdev)
atyfb_remove(info);
}
-static struct pci_device_id atyfb_pci_tbl[] = {
+static const struct pci_device_id atyfb_pci_tbl[] = {
#ifdef CONFIG_FB_ATY_GX
{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GX) },
{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CX) },
diff --git a/drivers/video/fbdev/aty/radeon_base.c b/drivers/video/fbdev/aty/radeon_base.c
index 6b4c7872b375..1e2ec360f8c1 100644
--- a/drivers/video/fbdev/aty/radeon_base.c
+++ b/drivers/video/fbdev/aty/radeon_base.c
@@ -96,7 +96,7 @@
#define CHIP_DEF(id, family, flags) \
{ PCI_VENDOR_ID_ATI, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (flags) | (CHIP_FAMILY_##family) }
-static struct pci_device_id radeonfb_pci_table[] = {
+static const struct pci_device_id radeonfb_pci_table[] = {
/* Radeon Xpress 200m */
CHIP_DEF(PCI_CHIP_RS480_5955, RS480, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
CHIP_DEF(PCI_CHIP_RS482_5975, RS480, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
@@ -2241,7 +2241,7 @@ static ssize_t radeon_show_edid2(struct file *filp, struct kobject *kobj,
return radeon_show_one_edid(buf, off, count, rinfo->mon2_EDID);
}
-static struct bin_attribute edid1_attr = {
+static const struct bin_attribute edid1_attr = {
.attr = {
.name = "edid1",
.mode = 0444,
@@ -2250,7 +2250,7 @@ static struct bin_attribute edid1_attr = {
.read = radeon_show_edid1,
};
-static struct bin_attribute edid2_attr = {
+static const struct bin_attribute edid2_attr = {
.attr = {
.name = "edid2",
.mode = 0444,
diff --git a/drivers/video/fbdev/bfin-lq035q1-fb.c b/drivers/video/fbdev/bfin-lq035q1-fb.c
index b594a58ff21d..b459354ad940 100644
--- a/drivers/video/fbdev/bfin-lq035q1-fb.c
+++ b/drivers/video/fbdev/bfin-lq035q1-fb.c
@@ -841,7 +841,7 @@ static int bfin_lq035q1_resume(struct device *dev)
return 0;
}
-static struct dev_pm_ops bfin_lq035q1_dev_pm_ops = {
+static const struct dev_pm_ops bfin_lq035q1_dev_pm_ops = {
.suspend = bfin_lq035q1_suspend,
.resume = bfin_lq035q1_resume,
};
diff --git a/drivers/video/fbdev/bw2.c b/drivers/video/fbdev/bw2.c
index 8c5b281f0b29..7aa972072357 100644
--- a/drivers/video/fbdev/bw2.c
+++ b/drivers/video/fbdev/bw2.c
@@ -333,8 +333,8 @@ static int bw2_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: bwtwo at %lx:%lx\n",
- dp->full_name, par->which_io, info->fix.smem_start);
+ printk(KERN_INFO "%pOF: bwtwo at %lx:%lx\n",
+ dp, par->which_io, info->fix.smem_start);
return 0;
diff --git a/drivers/video/fbdev/cg14.c b/drivers/video/fbdev/cg14.c
index 43e915eaf606..8de88b129b62 100644
--- a/drivers/video/fbdev/cg14.c
+++ b/drivers/video/fbdev/cg14.c
@@ -553,8 +553,8 @@ static int cg14_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: cgfourteen at %lx:%lx, %dMB\n",
- dp->full_name,
+ printk(KERN_INFO "%pOF: cgfourteen at %lx:%lx, %dMB\n",
+ dp,
par->iospace, info->fix.smem_start,
par->ramsize >> 20);
diff --git a/drivers/video/fbdev/cg3.c b/drivers/video/fbdev/cg3.c
index 716391f22e75..6c334260cf53 100644
--- a/drivers/video/fbdev/cg3.c
+++ b/drivers/video/fbdev/cg3.c
@@ -412,8 +412,8 @@ static int cg3_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: cg3 at %lx:%lx\n",
- dp->full_name, par->which_io, info->fix.smem_start);
+ printk(KERN_INFO "%pOF: cg3 at %lx:%lx\n",
+ dp, par->which_io, info->fix.smem_start);
return 0;
diff --git a/drivers/video/fbdev/cg6.c b/drivers/video/fbdev/cg6.c
index bdf901ed5291..0296c21acc78 100644
--- a/drivers/video/fbdev/cg6.c
+++ b/drivers/video/fbdev/cg6.c
@@ -810,8 +810,8 @@ static int cg6_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: CGsix [%s] at %lx:%lx\n",
- dp->full_name, info->fix.id,
+ printk(KERN_INFO "%pOF: CGsix [%s] at %lx:%lx\n",
+ dp, info->fix.id,
par->which_io, info->fix.smem_start);
return 0;
diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c
index 59abdc6a97f6..f103665cad43 100644
--- a/drivers/video/fbdev/chipsfb.c
+++ b/drivers/video/fbdev/chipsfb.c
@@ -292,7 +292,7 @@ static void chips_hw_init(void)
write_fr(chips_init_fr[i].addr, chips_init_fr[i].data);
}
-static struct fb_fix_screeninfo chipsfb_fix = {
+static const struct fb_fix_screeninfo chipsfb_fix = {
.id = "C&T 65550",
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_PSEUDOCOLOR,
@@ -309,7 +309,7 @@ static struct fb_fix_screeninfo chipsfb_fix = {
.smem_len = 0x100000, /* 1MB */
};
-static struct fb_var_screeninfo chipsfb_var = {
+static const struct fb_var_screeninfo chipsfb_var = {
.xres = 800,
.yres = 600,
.xres_virtual = 800,
diff --git a/drivers/video/fbdev/cobalt_lcdfb.c b/drivers/video/fbdev/cobalt_lcdfb.c
index 9da90bd242f4..0ef633e278a1 100644
--- a/drivers/video/fbdev/cobalt_lcdfb.c
+++ b/drivers/video/fbdev/cobalt_lcdfb.c
@@ -126,7 +126,7 @@ static void lcd_clear(struct fb_info *info)
lcd_write_control(info, LCD_RESET);
}
-static struct fb_fix_screeninfo cobalt_lcdfb_fix = {
+static const struct fb_fix_screeninfo cobalt_lcdfb_fix = {
.id = "cobalt-lcd",
.type = FB_TYPE_TEXT,
.type_aux = FB_AUX_TEXT_MDA,
diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile
index 9e3ddf225393..73493bbd7a15 100644
--- a/drivers/video/fbdev/core/Makefile
+++ b/drivers/video/fbdev/core/Makefile
@@ -4,6 +4,20 @@ obj-$(CONFIG_FB) += fb.o
fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \
modedb.o fbcvt.o
fb-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o
+
+ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE),y)
+fb-y += fbcon.o bitblit.o softcursor.o
+ifeq ($(CONFIG_FB_TILEBLITTING),y)
+fb-y += tileblit.o
+endif
+ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y)
+fb-y += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \
+ fbcon_ccw.o
+endif
+ifeq ($(CONFIG_DMI),y)
+fb-y += fbcon_dmi_quirks.o
+endif
+endif
fb-objs := $(fb-y)
obj-$(CONFIG_FB_CFB_FILLRECT) += cfbfillrect.o
diff --git a/drivers/video/console/bitblit.c b/drivers/video/fbdev/core/bitblit.c
index dbfe4eecf12e..790900d646c0 100644
--- a/drivers/video/console/bitblit.c
+++ b/drivers/video/fbdev/core/bitblit.c
@@ -203,7 +203,7 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
}
static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
- int bottom_only)
+ int color, int bottom_only)
{
unsigned int cw = vc->vc_font.width;
unsigned int ch = vc->vc_font.height;
@@ -213,7 +213,7 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
unsigned int bs = info->var.yres - bh;
struct fb_fillrect region;
- region.color = 0;
+ region.color = color;
region.rop = ROP_COPY;
if (rw && !bottom_only) {
@@ -416,7 +416,3 @@ void fbcon_set_bitops(struct fbcon_ops *ops)
EXPORT_SYMBOL(fbcon_set_bitops);
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Bit Blitting Operation");
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/video/console/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 12ded23f1aaf..04612f938bab 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -68,6 +68,7 @@
#include <linux/kd.h>
#include <linux/slab.h>
#include <linux/fb.h>
+#include <linux/fbcon.h>
#include <linux/vt_kern.h>
#include <linux/selection.h>
#include <linux/font.h>
@@ -135,8 +136,9 @@ static char fontname[40];
static int info_idx = -1;
/* console rotation */
-static int initial_rotation;
+static int initial_rotation = -1;
static int fbcon_has_sysfs;
+static int margin_color;
static const struct consw fb_con;
@@ -491,6 +493,13 @@ static int __init fb_console_setup(char *this_opt)
initial_rotation = 0;
continue;
}
+
+ if (!strncmp(options, "margin:", 7)) {
+ options += 7;
+ if (*options)
+ margin_color = simple_strtoul(options, &options, 0);
+ continue;
+ }
}
return 1;
}
@@ -563,7 +572,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
unsigned short *save = NULL, *r, *q;
int logo_height;
- if (info->flags & FBINFO_MODULE) {
+ if (info->fbops->owner) {
logo_shown = FBCON_LOGO_DONTSHOW;
return;
}
@@ -954,7 +963,10 @@ static const char *fbcon_startup(void)
ops->cur_rotate = -1;
ops->cur_blink_jiffies = HZ / 5;
info->fbcon_par = ops;
- p->con_rotate = initial_rotation;
+ if (initial_rotation != -1)
+ p->con_rotate = initial_rotation;
+ else
+ p->con_rotate = fbcon_platform_get_rotate(info);
set_blitting_type(vc, info);
if (info->fix.type != FB_TYPE_TEXT) {
@@ -1091,7 +1103,10 @@ static void fbcon_init(struct vc_data *vc, int init)
ops = info->fbcon_par;
ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
- p->con_rotate = initial_rotation;
+ if (initial_rotation != -1)
+ p->con_rotate = initial_rotation;
+ else
+ p->con_rotate = fbcon_platform_get_rotate(info);
set_blitting_type(vc, info);
cols = vc->vc_cols;
@@ -1299,7 +1314,7 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
struct fbcon_ops *ops = info->fbcon_par;
if (!fbcon_is_inactive(vc, info))
- ops->clear_margins(vc, info, bottom_only);
+ ops->clear_margins(vc, info, margin_color, bottom_only);
}
static void fbcon_cursor(struct vc_data *vc, int mode)
@@ -3606,7 +3621,7 @@ static void fbcon_exit(void)
fbcon_has_exited = 1;
}
-static int __init fb_console_init(void)
+void __init fb_console_init(void)
{
int i;
@@ -3628,11 +3643,8 @@ static int __init fb_console_init(void)
console_unlock();
fbcon_start();
- return 0;
}
-fs_initcall(fb_console_init);
-
#ifdef MODULE
static void __exit fbcon_deinit_device(void)
@@ -3647,7 +3659,7 @@ static void __exit fbcon_deinit_device(void)
}
}
-static void __exit fb_console_exit(void)
+void __exit fb_console_exit(void)
{
console_lock();
fb_unregister_client(&fbcon_event_notifier);
@@ -3657,9 +3669,4 @@ static void __exit fb_console_exit(void)
do_unregister_con_driver(&fb_con);
console_unlock();
}
-
-module_exit(fb_console_exit);
-
#endif
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/console/fbcon.h b/drivers/video/fbdev/core/fbcon.h
index 7aaa4eabbba0..18f3ac144237 100644
--- a/drivers/video/console/fbcon.h
+++ b/drivers/video/fbdev/core/fbcon.h
@@ -60,7 +60,7 @@ struct fbcon_ops {
const unsigned short *s, int count, int yy, int xx,
int fg, int bg);
void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
- int bottom_only);
+ int color, int bottom_only);
void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
int softback_lines, int fg, int bg);
int (*update_start)(struct fb_info *info);
@@ -261,5 +261,10 @@ extern void fbcon_set_rotate(struct fbcon_ops *ops);
#define fbcon_set_rotate(x) do {} while(0)
#endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */
-#endif /* _VIDEO_FBCON_H */
+#ifdef CONFIG_DMI
+int fbcon_platform_get_rotate(struct fb_info *info);
+#else
+#define fbcon_platform_get_rotate(i) FB_ROTATE_UR
+#endif /* CONFIG_DMI */
+#endif /* _VIDEO_FBCON_H */
diff --git a/drivers/video/console/fbcon_ccw.c b/drivers/video/fbdev/core/fbcon_ccw.c
index 5a3cbf6dff4d..37a8b0b22566 100644
--- a/drivers/video/console/fbcon_ccw.c
+++ b/drivers/video/fbdev/core/fbcon_ccw.c
@@ -189,7 +189,7 @@ static void ccw_putcs(struct vc_data *vc, struct fb_info *info,
}
static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
- int bottom_only)
+ int color, int bottom_only)
{
unsigned int cw = vc->vc_font.width;
unsigned int ch = vc->vc_font.height;
@@ -198,7 +198,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
unsigned int bs = vc->vc_rows*ch;
struct fb_fillrect region;
- region.color = 0;
+ region.color = color;
region.rop = ROP_COPY;
if (rw && !bottom_only) {
@@ -418,7 +418,3 @@ void fbcon_rotate_ccw(struct fbcon_ops *ops)
ops->update_start = ccw_update_start;
}
EXPORT_SYMBOL(fbcon_rotate_ccw);
-
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Console Rotation (270 degrees) Support");
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/console/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
index e7ee44db4e98..1888f8c866e8 100644
--- a/drivers/video/console/fbcon_cw.c
+++ b/drivers/video/fbdev/core/fbcon_cw.c
@@ -172,7 +172,7 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
}
static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
- int bottom_only)
+ int color, int bottom_only)
{
unsigned int cw = vc->vc_font.width;
unsigned int ch = vc->vc_font.height;
@@ -181,7 +181,7 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
unsigned int rs = info->var.yres - rw;
struct fb_fillrect region;
- region.color = 0;
+ region.color = color;
region.rop = ROP_COPY;
if (rw && !bottom_only) {
@@ -401,7 +401,3 @@ void fbcon_rotate_cw(struct fbcon_ops *ops)
ops->update_start = cw_update_start;
}
EXPORT_SYMBOL(fbcon_rotate_cw);
-
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Console Rotation (90 degrees) Support");
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/fbdev/core/fbcon_dmi_quirks.c b/drivers/video/fbdev/core/fbcon_dmi_quirks.c
new file mode 100644
index 000000000000..6904e47d1e51
--- /dev/null
+++ b/drivers/video/fbdev/core/fbcon_dmi_quirks.c
@@ -0,0 +1,145 @@
+/*
+ * fbcon_dmi_quirks.c -- DMI based quirk detection for fbcon
+ *
+ * Copyright (C) 2017 Hans de Goede <[email protected]>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of this archive for
+ * more details.
+ */
+
+#include <linux/dmi.h>
+#include <linux/fb.h>
+#include <linux/kernel.h>
+#include "fbcon.h"
+
+/*
+ * Some x86 clamshell design devices use portrait tablet screens and a display
+ * engine which cannot rotate in hardware, so we need to rotate the fbcon to
+ * compensate. Unfortunately these (cheap) devices also typically have quite
+ * generic DMI data, so we match on a combination of DMI data, screen resolution
+ * and a list of known BIOS dates to avoid false positives.
+ */
+
+struct fbcon_dmi_rotate_data {
+ int width;
+ int height;
+ const char * const *bios_dates;
+ int rotate;
+};
+
+static const struct fbcon_dmi_rotate_data rotate_data_asus_t100ha = {
+ .width = 800,
+ .height = 1280,
+ .rotate = FB_ROTATE_CCW,
+};
+
+static const struct fbcon_dmi_rotate_data rotate_data_gpd_pocket = {
+ .width = 1200,
+ .height = 1920,
+ .bios_dates = (const char * const []){ "05/26/2017", "06/28/2017",
+ "07/05/2017", "08/07/2017", NULL },
+ .rotate = FB_ROTATE_CW,
+};
+
+static const struct fbcon_dmi_rotate_data rotate_data_gpd_win = {
+ .width = 720,
+ .height = 1280,
+ .bios_dates = (const char * const []){
+ "10/25/2016", "11/18/2016", "12/23/2016", "12/26/2016",
+ "02/21/2017", "03/20/2017", "05/25/2017", NULL },
+ .rotate = FB_ROTATE_CW,
+};
+
+static const struct fbcon_dmi_rotate_data rotate_data_itworks_tw891 = {
+ .width = 800,
+ .height = 1280,
+ .bios_dates = (const char * const []){ "10/16/2015", NULL },
+ .rotate = FB_ROTATE_CW,
+};
+
+static const struct fbcon_dmi_rotate_data rotate_data_vios_lth17 = {
+ .width = 800,
+ .height = 1280,
+ .rotate = FB_ROTATE_CW,
+};
+
+static const struct dmi_system_id rotate_data[] = {
+ { /* Asus T100HA */
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"),
+ },
+ .driver_data = (void *)&rotate_data_asus_t100ha,
+ }, { /*
+ * GPD Pocket, note that the the DMI data is less generic then
+ * it seems, devices with a board-vendor of "AMI Corporation"
+ * are quite rare, as are devices which have both board- *and*
+ * product-id set to "Default String"
+ */
+ .matches = {
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
+ DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
+ },
+ .driver_data = (void *)&rotate_data_gpd_pocket,
+ }, { /* GPD Win (same note on DMI match as GPD Pocket) */
+ .matches = {
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
+ DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
+ },
+ .driver_data = (void *)&rotate_data_gpd_win,
+ }, { /* I.T.Works TW891 */
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TW891"),
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "To be filled by O.E.M."),
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "TW891"),
+ },
+ .driver_data = (void *)&rotate_data_itworks_tw891,
+ }, { /* VIOS LTH17 */
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VIOS"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LTH17"),
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "VIOS"),
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "LTH17"),
+ },
+ .driver_data = (void *)&rotate_data_vios_lth17,
+ },
+ {}
+};
+
+int fbcon_platform_get_rotate(struct fb_info *info)
+{
+ const struct dmi_system_id *match;
+ const struct fbcon_dmi_rotate_data *data;
+ const char *bios_date;
+ int i;
+
+ for (match = dmi_first_match(rotate_data);
+ match;
+ match = dmi_first_match(match + 1)) {
+ data = match->driver_data;
+
+ if (data->width != info->var.xres ||
+ data->height != info->var.yres)
+ continue;
+
+ if (!data->bios_dates)
+ return data->rotate;
+
+ bios_date = dmi_get_system_info(DMI_BIOS_DATE);
+ if (!bios_date)
+ continue;
+
+ for (i = 0; data->bios_dates[i]; i++) {
+ if (!strcmp(data->bios_dates[i], bios_date))
+ return data->rotate;
+ }
+ }
+
+ return FB_ROTATE_UR;
+}
diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/fbdev/core/fbcon_rotate.c
index db6528f2d3f2..8a51e4d95cc5 100644
--- a/drivers/video/console/fbcon_rotate.c
+++ b/drivers/video/fbdev/core/fbcon_rotate.c
@@ -110,7 +110,3 @@ void fbcon_set_rotate(struct fbcon_ops *ops)
}
}
EXPORT_SYMBOL(fbcon_set_rotate);
-
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Console Rotation Support");
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/console/fbcon_rotate.h b/drivers/video/fbdev/core/fbcon_rotate.h
index e233444cda66..e233444cda66 100644
--- a/drivers/video/console/fbcon_rotate.h
+++ b/drivers/video/fbdev/core/fbcon_rotate.h
diff --git a/drivers/video/console/fbcon_ud.c b/drivers/video/fbdev/core/fbcon_ud.c
index 19e3714abfe8..f98eee263597 100644
--- a/drivers/video/console/fbcon_ud.c
+++ b/drivers/video/fbdev/core/fbcon_ud.c
@@ -220,7 +220,7 @@ static void ud_putcs(struct vc_data *vc, struct fb_info *info,
}
static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
- int bottom_only)
+ int color, int bottom_only)
{
unsigned int cw = vc->vc_font.width;
unsigned int ch = vc->vc_font.height;
@@ -228,7 +228,7 @@ static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
unsigned int bh = info->var.yres - (vc->vc_rows*ch);
struct fb_fillrect region;
- region.color = 0;
+ region.color = color;
region.rop = ROP_COPY;
if (rw && !bottom_only) {
@@ -446,7 +446,3 @@ void fbcon_rotate_ud(struct fbcon_ops *ops)
ops->update_start = ud_update_start;
}
EXPORT_SYMBOL(fbcon_rotate_ud);
-
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Console Rotation (180 degrees) Support");
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index 25e862c487f6..f741ba8df01b 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -32,6 +32,7 @@
#include <linux/device.h>
#include <linux/efi.h>
#include <linux/fb.h>
+#include <linux/fbcon.h>
#include <linux/mem_encrypt.h>
#include <asm/fb.h>
@@ -316,7 +317,7 @@ static void fb_set_logo(struct fb_info *info,
for (i = 0; i < logo->height; i++) {
for (j = 0; j < logo->width; src++) {
d = *src ^ xor;
- for (k = 7; k >= 0; k--) {
+ for (k = 7; k >= 0 && j < logo->width; k--) {
*dst++ = ((d >> k) & 1) ? fg : 0;
j++;
}
@@ -463,7 +464,7 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
/* Return if the frame buffer is not mapped or suspended */
if (logo == NULL || info->state != FBINFO_STATE_RUNNING ||
- info->flags & FBINFO_MODULE)
+ info->fbops->owner)
return 0;
image.depth = 8;
@@ -601,7 +602,7 @@ int fb_prepare_logo(struct fb_info *info, int rotate)
memset(&fb_logo, 0, sizeof(struct logo_data));
if (info->flags & FBINFO_MISC_TILEBLITTING ||
- info->flags & FBINFO_MODULE)
+ info->fbops->owner)
return 0;
if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
@@ -1892,6 +1893,9 @@ fbmem_init(void)
fb_class = NULL;
goto err_class;
}
+
+ fb_console_init();
+
return 0;
err_class:
@@ -1906,6 +1910,8 @@ module_init(fbmem_init);
static void __exit
fbmem_exit(void)
{
+ fb_console_exit();
+
remove_proc_entry("fb", NULL);
class_destroy(fb_class);
unregister_chrdev(FB_MAJOR, "fb");
diff --git a/drivers/video/fbdev/core/fbmon.c b/drivers/video/fbdev/core/fbmon.c
index 41d7979d81c5..2b2d67328514 100644
--- a/drivers/video/fbdev/core/fbmon.c
+++ b/drivers/video/fbdev/core/fbmon.c
@@ -1479,8 +1479,8 @@ int of_get_fb_videomode(struct device_node *np, struct fb_videomode *fb,
if (ret)
return ret;
- pr_debug("%s: got %dx%d display mode from %s\n",
- of_node_full_name(np), vm.hactive, vm.vactive, np->name);
+ pr_debug("%pOF: got %dx%d display mode from %s\n",
+ np, vm.hactive, vm.vactive, np->name);
dump_fb_videomode(fb);
return 0;
diff --git a/drivers/video/console/softcursor.c b/drivers/video/fbdev/core/softcursor.c
index 46dd8f5d2e9e..fc93f254498e 100644
--- a/drivers/video/console/softcursor.c
+++ b/drivers/video/fbdev/core/softcursor.c
@@ -76,7 +76,3 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
}
EXPORT_SYMBOL(soft_cursor);
-
-MODULE_AUTHOR("James Simmons <[email protected]>");
-MODULE_DESCRIPTION("Generic software cursor");
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/console/tileblit.c b/drivers/video/fbdev/core/tileblit.c
index 15e8e1a89c45..93390312957f 100644
--- a/drivers/video/console/tileblit.c
+++ b/drivers/video/fbdev/core/tileblit.c
@@ -74,7 +74,7 @@ static void tile_putcs(struct vc_data *vc, struct fb_info *info,
}
static void tile_clear_margins(struct vc_data *vc, struct fb_info *info,
- int bottom_only)
+ int color, int bottom_only)
{
return;
}
@@ -152,8 +152,3 @@ void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info)
}
EXPORT_SYMBOL(fbcon_set_tileops);
-
-MODULE_AUTHOR("Antonino Daplas <[email protected]>");
-MODULE_DESCRIPTION("Tile Blitting Operation");
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/video/fbdev/cyber2000fb.c b/drivers/video/fbdev/cyber2000fb.c
index 99acf538a8b8..9a5751cb4e16 100644
--- a/drivers/video/fbdev/cyber2000fb.c
+++ b/drivers/video/fbdev/cyber2000fb.c
@@ -1336,7 +1336,7 @@ static void cyber2000fb_i2c_unregister(struct cfb_info *cfb)
* These parameters give
* 640x480, hsync 31.5kHz, vsync 60Hz
*/
-static struct fb_videomode cyber2000fb_default_mode = {
+static const struct fb_videomode cyber2000fb_default_mode = {
.refresh = 60,
.xres = 640,
.yres = 480,
diff --git a/drivers/video/fbdev/da8xx-fb.c b/drivers/video/fbdev/da8xx-fb.c
index c229b1a0d13b..a74096c53cb5 100644
--- a/drivers/video/fbdev/da8xx-fb.c
+++ b/drivers/video/fbdev/da8xx-fb.c
@@ -1341,7 +1341,7 @@ static int fb_probe(struct platform_device *device)
{
struct da8xx_lcdc_platform_data *fb_pdata =
dev_get_platdata(&device->dev);
- static struct resource *lcdc_regs;
+ struct resource *lcdc_regs;
struct lcd_ctrl_config *lcd_cfg;
struct fb_videomode *lcdc_info;
struct fb_info *da8xx_fb_info;
diff --git a/drivers/video/fbdev/dnfb.c b/drivers/video/fbdev/dnfb.c
index 3526899da61b..7b1492d34e98 100644
--- a/drivers/video/fbdev/dnfb.c
+++ b/drivers/video/fbdev/dnfb.c
@@ -126,7 +126,7 @@ struct fb_var_screeninfo dnfb_var = {
.vmode = FB_VMODE_NONINTERLACED,
};
-static struct fb_fix_screeninfo dnfb_fix = {
+static const struct fb_fix_screeninfo dnfb_fix = {
.id = "Apollo Mono",
.smem_start = (FRAME_BUFFER_START + IO_BASE),
.smem_len = FRAME_BUFFER_LEN,
diff --git a/drivers/video/fbdev/fb-puv3.c b/drivers/video/fbdev/fb-puv3.c
index 88fa2e70a0bb..d9e816d53531 100644
--- a/drivers/video/fbdev/fb-puv3.c
+++ b/drivers/video/fbdev/fb-puv3.c
@@ -69,7 +69,7 @@ static const struct fb_videomode unifb_modes[] = {
0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
};
-static struct fb_var_screeninfo unifb_default = {
+static const struct fb_var_screeninfo unifb_default = {
.xres = 640,
.yres = 480,
.xres_virtual = 640,
diff --git a/drivers/video/fbdev/ffb.c b/drivers/video/fbdev/ffb.c
index dda31e0a45af..6b1915872af1 100644
--- a/drivers/video/fbdev/ffb.c
+++ b/drivers/video/fbdev/ffb.c
@@ -997,9 +997,9 @@ static int ffb_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: %s at %016lx, type %d, "
+ printk(KERN_INFO "%pOF: %s at %016lx, type %d, "
"DAC pnum[%x] rev[%d] manuf_rev[%d]\n",
- dp->full_name,
+ dp,
((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
par->physbase, par->board_type,
dac_pnum, dac_rev, dac_mrev);
diff --git a/drivers/video/fbdev/fm2fb.c b/drivers/video/fbdev/fm2fb.c
index e69d47af9932..ac7a4ebfd390 100644
--- a/drivers/video/fbdev/fm2fb.c
+++ b/drivers/video/fbdev/fm2fb.c
@@ -213,7 +213,7 @@ static int fm2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
static int fm2fb_probe(struct zorro_dev *z, const struct zorro_device_id *id);
-static struct zorro_device_id fm2fb_devices[] = {
+static const struct zorro_device_id fm2fb_devices[] = {
{ ZORRO_PROD_BSC_FRAMEMASTER_II },
{ ZORRO_PROD_HELFRICH_RAINBOW_II },
{ 0 }
diff --git a/drivers/video/fbdev/geode/gxfb_core.c b/drivers/video/fbdev/geode/gxfb_core.c
index ec9fc9ac23de..f4f76373b2a8 100644
--- a/drivers/video/fbdev/geode/gxfb_core.c
+++ b/drivers/video/fbdev/geode/gxfb_core.c
@@ -474,7 +474,7 @@ static void gxfb_remove(struct pci_dev *pdev)
framebuffer_release(info);
}
-static struct pci_device_id gxfb_id_table[] = {
+static const struct pci_device_id gxfb_id_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_GX_VIDEO) },
{ 0, }
};
diff --git a/drivers/video/fbdev/grvga.c b/drivers/video/fbdev/grvga.c
index b471f92969b1..8fc8f46dadeb 100644
--- a/drivers/video/fbdev/grvga.c
+++ b/drivers/video/fbdev/grvga.c
@@ -70,7 +70,7 @@ static const struct fb_videomode grvga_modedb[] = {
}
};
-static struct fb_fix_screeninfo grvga_fix = {
+static const struct fb_fix_screeninfo grvga_fix = {
.id = "AG SVGACTRL",
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_PSEUDOCOLOR,
diff --git a/drivers/video/fbdev/i810/i810_main.c b/drivers/video/fbdev/i810/i810_main.c
index 2488baab7c89..d18f7b31932c 100644
--- a/drivers/video/fbdev/i810/i810_main.c
+++ b/drivers/video/fbdev/i810/i810_main.c
@@ -107,7 +107,7 @@ static const char * const i810_pci_list[] = {
"Intel(R) 815 (Internal Graphics with AGP) Framebuffer Device"
};
-static struct pci_device_id i810fb_pci_tbl[] = {
+static const struct pci_device_id i810fb_pci_tbl[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG1,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG3,
@@ -1542,7 +1542,7 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
return 0;
}
-static struct fb_ops i810fb_ops = {
+static const struct fb_ops i810fb_ops = {
.owner = THIS_MODULE,
.fb_open = i810fb_open,
.fb_release = i810fb_release,
diff --git a/drivers/video/fbdev/imsttfb.c b/drivers/video/fbdev/imsttfb.c
index 4363c64d74e8..ecdcf358ad5e 100644
--- a/drivers/video/fbdev/imsttfb.c
+++ b/drivers/video/fbdev/imsttfb.c
@@ -1318,7 +1318,7 @@ imsttfb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
}
}
-static struct pci_device_id imsttfb_pci_tbl[] = {
+static const struct pci_device_id imsttfb_pci_tbl[] = {
{ PCI_VENDOR_ID_IMS, PCI_DEVICE_ID_IMS_TT128,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, IBM },
{ PCI_VENDOR_ID_IMS, PCI_DEVICE_ID_IMS_TT3D,
diff --git a/drivers/video/fbdev/intelfb/intelfbdrv.c b/drivers/video/fbdev/intelfb/intelfbdrv.c
index ffc391208b27..d7463a2a5d83 100644
--- a/drivers/video/fbdev/intelfb/intelfbdrv.c
+++ b/drivers/video/fbdev/intelfb/intelfbdrv.c
@@ -173,7 +173,7 @@ static int intelfb_set_fbinfo(struct intelfb_info *dinfo);
#define INTELFB_CLASS_MASK 0
#endif
-static struct pci_device_id intelfb_pci_table[] = {
+static const struct pci_device_id intelfb_pci_table[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_830M, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_830M },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_845G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_845G },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_85XGM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_85XGM },
diff --git a/drivers/video/fbdev/kyro/fbdev.c b/drivers/video/fbdev/kyro/fbdev.c
index f77478fb3d14..a7bd9f25911b 100644
--- a/drivers/video/fbdev/kyro/fbdev.c
+++ b/drivers/video/fbdev/kyro/fbdev.c
@@ -633,7 +633,7 @@ static int kyrofb_ioctl(struct fb_info *info,
return 0;
}
-static struct pci_device_id kyrofb_pci_tbl[] = {
+static const struct pci_device_id kyrofb_pci_tbl[] = {
{ PCI_VENDOR_ID_ST, PCI_DEVICE_ID_STG4000,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0, }
diff --git a/drivers/video/fbdev/leo.c b/drivers/video/fbdev/leo.c
index 62e59dc90ee6..71862188f528 100644
--- a/drivers/video/fbdev/leo.c
+++ b/drivers/video/fbdev/leo.c
@@ -619,8 +619,8 @@ static int leo_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: leo at %lx:%lx\n",
- dp->full_name,
+ printk(KERN_INFO "%pOF: leo at %lx:%lx\n",
+ dp,
par->which_io, info->fix.smem_start);
return 0;
diff --git a/drivers/video/fbdev/matrox/matroxfb_base.c b/drivers/video/fbdev/matrox/matroxfb_base.c
index f6a0b9af97a9..b9b284d79631 100644
--- a/drivers/video/fbdev/matrox/matroxfb_base.c
+++ b/drivers/video/fbdev/matrox/matroxfb_base.c
@@ -1198,7 +1198,7 @@ static int matroxfb_blank(int blank, struct fb_info *info)
return 0;
}
-static struct fb_ops matroxfb_ops = {
+static const struct fb_ops matroxfb_ops = {
.owner = THIS_MODULE,
.fb_open = matroxfb_open,
.fb_release = matroxfb_release,
@@ -1573,14 +1573,14 @@ static struct board {
NULL}};
#ifndef MODULE
-static struct fb_videomode defaultmode = {
+static const struct fb_videomode defaultmode = {
/* 640x480 @ 60Hz, 31.5 kHz */
NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,
0, FB_VMODE_NONINTERLACED
};
-#endif /* !MODULE */
static int hotplug = 0;
+#endif /* !MODULE */
static void setDefaultOutputs(struct matrox_fb_info *minfo)
{
@@ -1623,7 +1623,7 @@ static int initMatrox2(struct matrox_fb_info *minfo, struct board *b)
unsigned int memsize;
int err;
- static struct pci_device_id intel_82437[] = {
+ static const struct pci_device_id intel_82437[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437) },
{ },
};
@@ -1794,9 +1794,7 @@ static int initMatrox2(struct matrox_fb_info *minfo, struct board *b)
minfo->fbops = matroxfb_ops;
minfo->fbcon.fbops = &minfo->fbops;
minfo->fbcon.pseudo_palette = minfo->cmap;
- /* after __init time we are like module... no logo */
- minfo->fbcon.flags = hotplug ? FBINFO_FLAG_MODULE : FBINFO_FLAG_DEFAULT;
- minfo->fbcon.flags |= FBINFO_PARTIAL_PAN_OK | /* Prefer panning for scroll under MC viewer/edit */
+ minfo->fbcon.flags = FBINFO_PARTIAL_PAN_OK | /* Prefer panning for scroll under MC viewer/edit */
FBINFO_HWACCEL_COPYAREA | /* We have hw-assisted bmove */
FBINFO_HWACCEL_FILLRECT | /* And fillrect */
FBINFO_HWACCEL_IMAGEBLIT | /* And imageblit */
@@ -2116,7 +2114,7 @@ static void pci_remove_matrox(struct pci_dev* pdev) {
matroxfb_remove(minfo, 1);
}
-static struct pci_device_id matroxfb_devices[] = {
+static const struct pci_device_id matroxfb_devices[] = {
#ifdef CONFIG_FB_MATROX_MILLENIUM
{PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MIL,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
diff --git a/drivers/video/fbdev/maxinefb.c b/drivers/video/fbdev/maxinefb.c
index cab7333208ea..5bb1b5c308a7 100644
--- a/drivers/video/fbdev/maxinefb.c
+++ b/drivers/video/fbdev/maxinefb.c
@@ -39,7 +39,7 @@
static struct fb_info fb_info;
-static struct fb_var_screeninfo maxinefb_defined = {
+static const struct fb_var_screeninfo maxinefb_defined = {
.xres = 1024,
.yres = 768,
.xres_virtual = 1024,
diff --git a/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c b/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c
index f9ec5c0484fa..cd372527c9e4 100644
--- a/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c
+++ b/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c
@@ -982,7 +982,7 @@ static inline int mb862xx_pci_gdc_init(struct mb862xxfb_par *par)
#define CHIP_ID(id) \
{ PCI_DEVICE(PCI_VENDOR_ID_FUJITSU_LIMITED, id) }
-static struct pci_device_id mb862xx_pci_tbl[] = {
+static const struct pci_device_id mb862xx_pci_tbl[] = {
/* MB86295/MB86296 */
CHIP_ID(PCI_DEVICE_ID_FUJITSU_CORALP),
CHIP_ID(PCI_DEVICE_ID_FUJITSU_CORALPA),
diff --git a/drivers/video/fbdev/mbx/mbxfb.c b/drivers/video/fbdev/mbx/mbxfb.c
index 698df9543e30..539b85da0897 100644
--- a/drivers/video/fbdev/mbx/mbxfb.c
+++ b/drivers/video/fbdev/mbx/mbxfb.c
@@ -79,7 +79,7 @@ struct mbxfb_info {
};
-static struct fb_var_screeninfo mbxfb_default = {
+static const struct fb_var_screeninfo mbxfb_default = {
.xres = 640,
.yres = 480,
.xres_virtual = 640,
@@ -102,7 +102,7 @@ static struct fb_var_screeninfo mbxfb_default = {
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
};
-static struct fb_fix_screeninfo mbxfb_fix = {
+static const struct fb_fix_screeninfo mbxfb_fix = {
.id = "MBX",
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
diff --git a/drivers/video/fbdev/neofb.c b/drivers/video/fbdev/neofb.c
index db023a97d1ea..5d3a444083f7 100644
--- a/drivers/video/fbdev/neofb.c
+++ b/drivers/video/fbdev/neofb.c
@@ -2138,7 +2138,7 @@ static void neofb_remove(struct pci_dev *dev)
}
}
-static struct pci_device_id neofb_devices[] = {
+static const struct pci_device_id neofb_devices[] = {
{PCI_VENDOR_ID_NEOMAGIC, PCI_CHIP_NM2070,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, FB_ACCEL_NEOMAGIC_NM2070},
diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
index ce7dab7299fe..418a2d0d06a9 100644
--- a/drivers/video/fbdev/nvidia/nvidia.c
+++ b/drivers/video/fbdev/nvidia/nvidia.c
@@ -55,7 +55,7 @@
/* HW cursor parameters */
#define MAX_CURS 32
-static struct pci_device_id nvidiafb_pci_tbl[] = {
+static const struct pci_device_id nvidiafb_pci_tbl[] = {
{PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0},
{ 0, }
diff --git a/drivers/video/fbdev/offb.c b/drivers/video/fbdev/offb.c
index 9be884b0c778..90d38de34479 100644
--- a/drivers/video/fbdev/offb.c
+++ b/drivers/video/fbdev/offb.c
@@ -383,7 +383,7 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp
FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR;
}
-static void __init offb_init_fb(const char *name, const char *full_name,
+static void __init offb_init_fb(const char *name,
int width, int height, int depth,
int pitch, unsigned long address,
int foreign_endian, struct device_node *dp)
@@ -402,14 +402,13 @@ static void __init offb_init_fb(const char *name, const char *full_name,
"Using unsupported %dx%d %s at %lx, depth=%d, pitch=%d\n",
width, height, name, address, depth, pitch);
if (depth != 8 && depth != 15 && depth != 16 && depth != 32) {
- printk(KERN_ERR "%s: can't use depth = %d\n", full_name,
- depth);
+ printk(KERN_ERR "%pOF: can't use depth = %d\n", dp, depth);
release_mem_region(res_start, res_size);
return;
}
info = framebuffer_alloc(sizeof(u32) * 16, NULL);
-
+
if (info == 0) {
release_mem_region(res_start, res_size);
return;
@@ -515,7 +514,7 @@ static void __init offb_init_fb(const char *name, const char *full_name,
if (register_framebuffer(info) < 0)
goto out_err;
- fb_info(info, "Open Firmware frame buffer device on %s\n", full_name);
+ fb_info(info, "Open Firmware frame buffer device on %pOF\n", dp);
return;
out_err:
@@ -644,7 +643,6 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)
if (strcmp(dp->name, "valkyrie") == 0)
address += 0x1000;
offb_init_fb(no_real_node ? "bootx" : dp->name,
- no_real_node ? "display" : dp->full_name,
width, height, depth, pitch, address,
foreign_endian, no_real_node ? NULL : dp);
}
diff --git a/drivers/video/fbdev/omap/lcd_mipid.c b/drivers/video/fbdev/omap/lcd_mipid.c
index df9e6ebcfad5..e3a85432f926 100644
--- a/drivers/video/fbdev/omap/lcd_mipid.c
+++ b/drivers/video/fbdev/omap/lcd_mipid.c
@@ -496,7 +496,7 @@ static void mipid_cleanup(struct lcd_panel *panel)
mipid_esd_stop_check(md);
}
-static struct lcd_panel mipid_panel = {
+static const struct lcd_panel mipid_panel = {
.config = OMAP_LCDC_PANEL_TFT,
.bpp = 16,
diff --git a/drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c b/drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c
index f14691ce8d02..6cd759c01037 100644
--- a/drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c
@@ -18,7 +18,7 @@
#include <video/omapfb_dss.h>
-static struct omap_video_timings lb035q02_timings = {
+static const struct omap_video_timings lb035q02_timings = {
.x_res = 320,
.y_res = 240,
diff --git a/drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c b/drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c
index 468560a6daae..f2c2fef3db74 100644
--- a/drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c
+++ b/drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c
@@ -509,7 +509,7 @@ static struct attribute *bldev_attrs[] = {
NULL,
};
-static struct attribute_group bldev_attr_group = {
+static const struct attribute_group bldev_attr_group = {
.attrs = bldev_attrs,
};
diff --git a/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c b/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c
index b529a8c2b652..57e9e146ff74 100644
--- a/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c
+++ b/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c
@@ -41,7 +41,7 @@ struct panel_drv_data {
struct spi_device *spi_dev;
};
-static struct omap_video_timings td028ttec1_panel_timings = {
+static const struct omap_video_timings td028ttec1_panel_timings = {
.x_res = 480,
.y_res = 640,
.pixelclock = 22153000,
diff --git a/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c b/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c
index 51e628b85f4a..ea8c79a42b41 100644
--- a/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c
+++ b/drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c
@@ -282,7 +282,7 @@ static struct attribute *tpo_td043_attrs[] = {
NULL,
};
-static struct attribute_group tpo_td043_attr_group = {
+static const struct attribute_group tpo_td043_attr_group = {
.attrs = tpo_td043_attrs,
};
diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dss-of.c b/drivers/video/fbdev/omap2/omapfb/dss/dss-of.c
index d356a252ab4a..f1eb8b0f8a2a 100644
--- a/drivers/video/fbdev/omap2/omapfb/dss/dss-of.c
+++ b/drivers/video/fbdev/omap2/omapfb/dss/dss-of.c
@@ -16,6 +16,7 @@
#include <linux/err.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/of_graph.h>
#include <linux/seq_file.h>
#include <video/omapfb_dss.h>
@@ -128,7 +129,7 @@ static struct device_node *omapdss_of_get_remote_port(const struct device_node *
{
struct device_node *np;
- np = of_parse_phandle(node, "remote-endpoint", 0);
+ np = of_graph_get_remote_endpoint(node);
if (!np)
return NULL;
diff --git a/drivers/video/fbdev/p9100.c b/drivers/video/fbdev/p9100.c
index 1f6ee76af878..64de5cda541d 100644
--- a/drivers/video/fbdev/p9100.c
+++ b/drivers/video/fbdev/p9100.c
@@ -304,8 +304,8 @@ static int p9100_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: p9100 at %lx:%lx\n",
- dp->full_name,
+ printk(KERN_INFO "%pOF: p9100 at %lx:%lx\n",
+ dp,
par->which_io, info->fix.smem_start);
return 0;
diff --git a/drivers/video/fbdev/pm2fb.c b/drivers/video/fbdev/pm2fb.c
index 1a4070f719c2..bd6c2f5f6095 100644
--- a/drivers/video/fbdev/pm2fb.c
+++ b/drivers/video/fbdev/pm2fb.c
@@ -1732,7 +1732,7 @@ static void pm2fb_remove(struct pci_dev *pdev)
framebuffer_release(info);
}
-static struct pci_device_id pm2fb_id_table[] = {
+static const struct pci_device_id pm2fb_id_table[] = {
{ PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TVP4020,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_3DLABS, PCI_DEVICE_ID_3DLABS_PERMEDIA2,
diff --git a/drivers/video/fbdev/pm3fb.c b/drivers/video/fbdev/pm3fb.c
index 6ff5077a2e15..6130aa56a1e9 100644
--- a/drivers/video/fbdev/pm3fb.c
+++ b/drivers/video/fbdev/pm3fb.c
@@ -1479,7 +1479,7 @@ static void pm3fb_remove(struct pci_dev *dev)
}
}
-static struct pci_device_id pm3fb_id_table[] = {
+static const struct pci_device_id pm3fb_id_table[] = {
{ PCI_VENDOR_ID_3DLABS, 0x0a,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0, }
diff --git a/drivers/video/fbdev/pmag-aa-fb.c b/drivers/video/fbdev/pmag-aa-fb.c
index 39922f072db4..ca7e9390d1e7 100644
--- a/drivers/video/fbdev/pmag-aa-fb.c
+++ b/drivers/video/fbdev/pmag-aa-fb.c
@@ -67,7 +67,7 @@ struct aafb_par {
struct bt431_regs __iomem *bt431;
};
-static struct fb_var_screeninfo aafb_defined = {
+static const struct fb_var_screeninfo aafb_defined = {
.xres = 1280,
.yres = 1024,
.xres_virtual = 2048,
@@ -90,7 +90,7 @@ static struct fb_var_screeninfo aafb_defined = {
.vmode = FB_VMODE_NONINTERLACED,
};
-static struct fb_fix_screeninfo aafb_fix = {
+static const struct fb_fix_screeninfo aafb_fix = {
.id = "PMAG-AA",
.smem_len = (2048 * 1024),
.type = FB_TYPE_PACKED_PIXELS,
diff --git a/drivers/video/fbdev/pmag-ba-fb.c b/drivers/video/fbdev/pmag-ba-fb.c
index 1fd02f40708e..3b9249449ea6 100644
--- a/drivers/video/fbdev/pmag-ba-fb.c
+++ b/drivers/video/fbdev/pmag-ba-fb.c
@@ -43,7 +43,7 @@ struct pmagbafb_par {
};
-static struct fb_var_screeninfo pmagbafb_defined = {
+static const struct fb_var_screeninfo pmagbafb_defined = {
.xres = 1024,
.yres = 864,
.xres_virtual = 1024,
@@ -67,7 +67,7 @@ static struct fb_var_screeninfo pmagbafb_defined = {
.vmode = FB_VMODE_NONINTERLACED,
};
-static struct fb_fix_screeninfo pmagbafb_fix = {
+static const struct fb_fix_screeninfo pmagbafb_fix = {
.id = "PMAG-BA",
.smem_len = (1024 * 1024),
.type = FB_TYPE_PACKED_PIXELS,
diff --git a/drivers/video/fbdev/pmagb-b-fb.c b/drivers/video/fbdev/pmagb-b-fb.c
index 46e96c451506..e58df36233c4 100644
--- a/drivers/video/fbdev/pmagb-b-fb.c
+++ b/drivers/video/fbdev/pmagb-b-fb.c
@@ -44,7 +44,7 @@ struct pmagbbfb_par {
};
-static struct fb_var_screeninfo pmagbbfb_defined = {
+static const struct fb_var_screeninfo pmagbbfb_defined = {
.bits_per_pixel = 8,
.red.length = 8,
.green.length = 8,
@@ -57,7 +57,7 @@ static struct fb_var_screeninfo pmagbbfb_defined = {
.vmode = FB_VMODE_NONINTERLACED,
};
-static struct fb_fix_screeninfo pmagbbfb_fix = {
+static const struct fb_fix_screeninfo pmagbbfb_fix = {
.id = "PMAGB-BA",
.smem_len = (2048 * 1024),
.type = FB_TYPE_PACKED_PIXELS,
diff --git a/drivers/video/fbdev/ps3fb.c b/drivers/video/fbdev/ps3fb.c
index b269abd932aa..5ed2db39d823 100644
--- a/drivers/video/fbdev/ps3fb.c
+++ b/drivers/video/fbdev/ps3fb.c
@@ -952,7 +952,7 @@ static struct fb_ops ps3fb_ops = {
.fb_compat_ioctl = ps3fb_ioctl
};
-static struct fb_fix_screeninfo ps3fb_fix = {
+static const struct fb_fix_screeninfo ps3fb_fix = {
.id = DEVICE_NAME,
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
diff --git a/drivers/video/fbdev/pvr2fb.c b/drivers/video/fbdev/pvr2fb.c
index a2564ab91e62..867c5218968f 100644
--- a/drivers/video/fbdev/pvr2fb.c
+++ b/drivers/video/fbdev/pvr2fb.c
@@ -154,7 +154,7 @@ static struct fb_fix_screeninfo pvr2_fix = {
.accel = FB_ACCEL_NONE,
};
-static struct fb_var_screeninfo pvr2_var = {
+static const struct fb_var_screeninfo pvr2_var = {
.xres = 640,
.yres = 480,
.xres_virtual = 640,
@@ -966,7 +966,7 @@ static void pvr2fb_pci_remove(struct pci_dev *pdev)
pci_release_regions(pdev);
}
-static struct pci_device_id pvr2fb_pci_tbl[] = {
+static const struct pci_device_id pvr2fb_pci_tbl[] = {
{ PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_NEON250,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0, },
diff --git a/drivers/video/fbdev/pxa3xx-gcu.c b/drivers/video/fbdev/pxa3xx-gcu.c
index 50bce45e7f3d..933619da1a94 100644
--- a/drivers/video/fbdev/pxa3xx-gcu.c
+++ b/drivers/video/fbdev/pxa3xx-gcu.c
@@ -626,8 +626,8 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)
/* request the IRQ */
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
- dev_err(dev, "no IRQ defined\n");
- return -ENODEV;
+ dev_err(dev, "no IRQ defined: %d\n", irq);
+ return irq;
}
ret = devm_request_irq(dev, irq, pxa3xx_gcu_handle_irq,
diff --git a/drivers/video/fbdev/q40fb.c b/drivers/video/fbdev/q40fb.c
index 04ea330ccf5d..0b93aa964d43 100644
--- a/drivers/video/fbdev/q40fb.c
+++ b/drivers/video/fbdev/q40fb.c
@@ -36,7 +36,7 @@ static struct fb_fix_screeninfo q40fb_fix = {
.accel = FB_ACCEL_NONE,
};
-static struct fb_var_screeninfo q40fb_var = {
+static const struct fb_var_screeninfo q40fb_var = {
.xres = 1024,
.yres = 512,
.xres_virtual = 1024,
diff --git a/drivers/video/fbdev/riva/fbdev.c b/drivers/video/fbdev/riva/fbdev.c
index 2ef26ad99341..1ea78bb911fb 100644
--- a/drivers/video/fbdev/riva/fbdev.c
+++ b/drivers/video/fbdev/riva/fbdev.c
@@ -101,7 +101,7 @@ static int rivafb_blank(int blank, struct fb_info *info);
*
* ------------------------------------------------------------------------- */
-static struct pci_device_id rivafb_pci_tbl[] = {
+static const struct pci_device_id rivafb_pci_tbl[] = {
{ PCI_VENDOR_ID_NVIDIA_SGS, PCI_DEVICE_ID_NVIDIA_SGS_RIVA128,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT,
diff --git a/drivers/video/fbdev/s3fb.c b/drivers/video/fbdev/s3fb.c
index 13b109073c63..d63f23e26f7d 100644
--- a/drivers/video/fbdev/s3fb.c
+++ b/drivers/video/fbdev/s3fb.c
@@ -1483,7 +1483,7 @@ static int s3_pci_resume(struct pci_dev* dev)
/* List of boards that we are trying to support */
-static struct pci_device_id s3_devices[] = {
+static const struct pci_device_id s3_devices[] = {
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8810), .driver_data = CHIP_XXX_TRIO},
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8811), .driver_data = CHIP_XXX_TRIO},
{PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8812), .driver_data = CHIP_M65_AURORA64VP},
diff --git a/drivers/video/fbdev/savage/savagefb_driver.c b/drivers/video/fbdev/savage/savagefb_driver.c
index c30a91c1137c..c20468362f11 100644
--- a/drivers/video/fbdev/savage/savagefb_driver.c
+++ b/drivers/video/fbdev/savage/savagefb_driver.c
@@ -2429,7 +2429,7 @@ static int savagefb_resume(struct pci_dev* dev)
}
-static struct pci_device_id savagefb_devices[] = {
+static const struct pci_device_id savagefb_devices[] = {
{PCI_VENDOR_ID_S3, PCI_CHIP_SUPSAV_MX128,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, FB_ACCEL_SUPERSAVAGE},
diff --git a/drivers/video/fbdev/sis/init301.c b/drivers/video/fbdev/sis/init301.c
index 20f7234e809e..1ec9c3e0e1d8 100644
--- a/drivers/video/fbdev/sis/init301.c
+++ b/drivers/video/fbdev/sis/init301.c
@@ -6848,8 +6848,6 @@ SiS_SetGroup2(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short
if(SiS_Pr->SiS_VGAHDE >= 1280) {
tempch = 20;
tempbx &= ~0x20;
- } else if(SiS_Pr->SiS_VGAHDE >= 1024) {
- tempch = 25;
} else {
tempch = 25; /* OK */
}
@@ -7964,14 +7962,9 @@ SiS_SetCHTVReg(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short
}
}
} else { /* ---- PAL ---- */
- /* We don't play around with FSCI in PAL mode */
- if(resindex == 0x04) {
- SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
- SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE); /* ACIV on */
- } else {
- SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
- SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE); /* ACIV on */
- }
+ /* We don't play around with FSCI in PAL mode */
+ SiS_SetCH70xxANDOR(SiS_Pr, 0x20, 0x00, 0xEF); /* loop filter off */
+ SiS_SetCH70xxANDOR(SiS_Pr, 0x21, 0x01, 0xFE); /* ACIV on */
}
#endif /* 300 */
@@ -9657,8 +9650,6 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
delay = 0x0a;
} else if(IS_SIS740) {
delay = 0x00;
- } else if(SiS_Pr->ChipType < SIS_330) {
- delay = 0x0c;
} else {
delay = 0x0c;
}
diff --git a/drivers/video/fbdev/skeletonfb.c b/drivers/video/fbdev/skeletonfb.c
index e219a0a22077..7f4e908330bf 100644
--- a/drivers/video/fbdev/skeletonfb.c
+++ b/drivers/video/fbdev/skeletonfb.c
@@ -84,7 +84,7 @@ struct xxx_par;
* if we don't use modedb. If we do use modedb see xxxfb_init how to use it
* to get a fb_var_screeninfo. Otherwise define a default var as well.
*/
-static struct fb_fix_screeninfo xxxfb_fix = {
+static const struct fb_fix_screeninfo xxxfb_fix = {
.id = "FB's name",
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_PSEUDOCOLOR,
@@ -866,7 +866,7 @@ static int xxxfb_resume(struct pci_dev *dev)
#define xxxfb_resume NULL
#endif /* CONFIG_PM */
-static struct pci_device_id xxxfb_id_table[] = {
+static const struct pci_device_id xxxfb_id_table[] = {
{ PCI_VENDOR_ID_XXX, PCI_DEVICE_ID_XXX,
PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
PCI_CLASS_MASK, 0 },
diff --git a/drivers/video/fbdev/sm501fb.c b/drivers/video/fbdev/sm501fb.c
index 67e314fdd947..076dd2711630 100644
--- a/drivers/video/fbdev/sm501fb.c
+++ b/drivers/video/fbdev/sm501fb.c
@@ -46,7 +46,7 @@
static char *fb_mode = "640x480-16@60";
static unsigned long default_bpp = 16;
-static struct fb_videomode sm501_default_mode = {
+static const struct fb_videomode sm501_default_mode = {
.refresh = 60,
.xres = 640,
.yres = 480,
diff --git a/drivers/video/fbdev/sm712fb.c b/drivers/video/fbdev/sm712fb.c
index 73cb4ffff3c5..502d0de2feec 100644
--- a/drivers/video/fbdev/sm712fb.c
+++ b/drivers/video/fbdev/sm712fb.c
@@ -33,8 +33,8 @@
#include "sm712.h"
/*
-* Private structure
-*/
+ * Private structure
+ */
struct smtcfb_info {
struct pci_dev *pdev;
struct fb_info *fb;
@@ -785,7 +785,7 @@ static void __init sm7xx_vga_setup(char *options)
smtc_scr_info.lfb_height = 0;
smtc_scr_info.lfb_depth = 0;
- pr_debug("sm7xx_vga_setup = %s\n", options);
+ pr_debug("%s = %s\n", __func__, options);
for (i = 0; i < ARRAY_SIZE(vesa_mode_table); i++) {
if (strstr(options, vesa_mode_table[i].index)) {
@@ -798,8 +798,8 @@ static void __init sm7xx_vga_setup(char *options)
}
}
-static void sm712_setpalette(int regno, unsigned red, unsigned green,
- unsigned blue, struct fb_info *info)
+static void sm712_setpalette(int regno, unsigned int red, unsigned int green,
+ unsigned int blue, struct fb_info *info)
{
/* set bit 5:4 = 01 (write LCD RAM only) */
smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x10);
@@ -896,8 +896,9 @@ static int smtc_blank(int blank_mode, struct fb_info *info)
return 0;
}
-static int smtc_setcolreg(unsigned regno, unsigned red, unsigned green,
- unsigned blue, unsigned trans, struct fb_info *info)
+static int smtc_setcolreg(unsigned int regno, unsigned int red,
+ unsigned int green, unsigned int blue,
+ unsigned int trans, struct fb_info *info)
{
struct smtcfb_info *sfb;
u32 val;
@@ -1477,7 +1478,7 @@ static int smtcfb_pci_probe(struct pci_dev *pdev,
}
/* can support 32 bpp */
- if (15 == sfb->fb->var.bits_per_pixel)
+ if (sfb->fb->var.bits_per_pixel == 15)
sfb->fb->var.bits_per_pixel = 16;
sfb->fb->var.xres_virtual = sfb->fb->var.xres;
diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c
index 449fceaf79d5..2275e80b5776 100644
--- a/drivers/video/fbdev/smscufx.c
+++ b/drivers/video/fbdev/smscufx.c
@@ -122,7 +122,7 @@ static const u32 smscufx_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST |
FBINFO_VIRTFB | FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT |
FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR;
-static struct usb_device_id id_table[] = {
+static const struct usb_device_id id_table[] = {
{USB_DEVICE(0x0424, 0x9d00),},
{USB_DEVICE(0x0424, 0x9d01),},
{},
diff --git a/drivers/video/fbdev/sunxvr1000.c b/drivers/video/fbdev/sunxvr1000.c
index fb37f6e05391..8fe37c0ef2f5 100644
--- a/drivers/video/fbdev/sunxvr1000.c
+++ b/drivers/video/fbdev/sunxvr1000.c
@@ -33,8 +33,8 @@ static int gfb_get_props(struct gfb_info *gp)
gp->depth = of_getintprop_default(gp->of_node, "depth", 32);
if (!gp->width || !gp->height) {
- printk(KERN_ERR "gfb: Critical properties missing for %s\n",
- gp->of_node->full_name);
+ printk(KERN_ERR "gfb: Critical properties missing for %pOF\n",
+ gp->of_node);
return -EINVAL;
}
@@ -151,12 +151,12 @@ static int gfb_probe(struct platform_device *op)
if (err)
goto err_unmap_fb;
- printk("gfb: Found device at %s\n", dp->full_name);
+ printk("gfb: Found device at %pOF\n", dp);
err = register_framebuffer(info);
if (err < 0) {
- printk(KERN_ERR "gfb: Could not register framebuffer %s\n",
- dp->full_name);
+ printk(KERN_ERR "gfb: Could not register framebuffer %pOF\n",
+ dp);
goto err_unmap_fb;
}
diff --git a/drivers/video/fbdev/sunxvr2500.c b/drivers/video/fbdev/sunxvr2500.c
index 1a053292f2eb..544465ba1dc0 100644
--- a/drivers/video/fbdev/sunxvr2500.c
+++ b/drivers/video/fbdev/sunxvr2500.c
@@ -220,7 +220,7 @@ err_out:
return err;
}
-static struct pci_device_id s3d_pci_table[] = {
+static const struct pci_device_id s3d_pci_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x002c), },
{ PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x002d), },
{ PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x002e), },
diff --git a/drivers/video/fbdev/sunxvr500.c b/drivers/video/fbdev/sunxvr500.c
index dc0d886e4e7e..bc595937df08 100644
--- a/drivers/video/fbdev/sunxvr500.c
+++ b/drivers/video/fbdev/sunxvr500.c
@@ -393,7 +393,7 @@ err_out:
return err;
}
-static struct pci_device_id e3d_pci_table[] = {
+static const struct pci_device_id e3d_pci_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x7a0), },
{ PCI_DEVICE(0x1091, 0x7a0), },
{ PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x7a2), },
diff --git a/drivers/video/fbdev/tcx.c b/drivers/video/fbdev/tcx.c
index 54ad08854c94..c98d8a569ccd 100644
--- a/drivers/video/fbdev/tcx.c
+++ b/drivers/video/fbdev/tcx.c
@@ -467,8 +467,8 @@ static int tcx_probe(struct platform_device *op)
dev_set_drvdata(&op->dev, info);
- printk(KERN_INFO "%s: TCX at %lx:%lx, %s\n",
- dp->full_name,
+ printk(KERN_INFO "%pOF: TCX at %lx:%lx, %s\n",
+ dp,
par->which_io,
info->fix.smem_start,
par->lowdepth ? "8-bit only" : "24-bit depth");
diff --git a/drivers/video/fbdev/tdfxfb.c b/drivers/video/fbdev/tdfxfb.c
index d5fa313806fe..dec1fed9880e 100644
--- a/drivers/video/fbdev/tdfxfb.c
+++ b/drivers/video/fbdev/tdfxfb.c
@@ -120,7 +120,7 @@ static const struct fb_var_screeninfo tdfx_var = {
static int tdfxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id);
static void tdfxfb_remove(struct pci_dev *pdev);
-static struct pci_device_id tdfxfb_id_table[] = {
+static const struct pci_device_id tdfxfb_id_table[] = {
{ PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE,
PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
0xff0000, 0 },
diff --git a/drivers/video/fbdev/tridentfb.c b/drivers/video/fbdev/tridentfb.c
index 8a5bbc13082e..284706184b1b 100644
--- a/drivers/video/fbdev/tridentfb.c
+++ b/drivers/video/fbdev/tridentfb.c
@@ -1737,7 +1737,7 @@ static void trident_pci_remove(struct pci_dev *dev)
}
/* List of boards that we are trying to support */
-static struct pci_device_id trident_devices[] = {
+static const struct pci_device_id trident_devices[] = {
{PCI_VENDOR_ID_TRIDENT, BLADE3D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
{PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
{PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c
index 05ef657235df..ef08a104fb42 100644
--- a/drivers/video/fbdev/udlfb.c
+++ b/drivers/video/fbdev/udlfb.c
@@ -54,7 +54,7 @@ static const u32 udlfb_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST |
* which is compatible with all known USB 2.0 era graphics chips and firmware,
* but allows DisplayLink to increment those for any future incompatible chips
*/
-static struct usb_device_id id_table[] = {
+static const struct usb_device_id id_table[] = {
{.idVendor = 0x17e9,
.bInterfaceClass = 0xff,
.bInterfaceSubClass = 0x00,
@@ -1465,7 +1465,7 @@ static ssize_t metrics_reset_store(struct device *fbdev,
return count;
}
-static struct bin_attribute edid_attr = {
+static const struct bin_attribute edid_attr = {
.attr.name = "edid",
.attr.mode = 0666,
.size = EDID_LENGTH,
@@ -1655,7 +1655,6 @@ static int dlfb_usb_probe(struct usb_interface *interface,
error:
if (dev) {
- kref_put(&dev->kref, dlfb_free); /* ref for framebuffer */
kref_put(&dev->kref, dlfb_free); /* last ref from kref_init */
/* dev has been deallocated. Do not dereference */
diff --git a/drivers/video/fbdev/uvesafb.c b/drivers/video/fbdev/uvesafb.c
index 6f8c0b9fc558..73676eb0244a 100644
--- a/drivers/video/fbdev/uvesafb.c
+++ b/drivers/video/fbdev/uvesafb.c
@@ -1666,7 +1666,7 @@ static struct attribute *uvesafb_dev_attrs[] = {
NULL,
};
-static struct attribute_group uvesafb_dev_attgrp = {
+static const struct attribute_group uvesafb_dev_attgrp = {
.name = NULL,
.attrs = uvesafb_dev_attrs,
};
diff --git a/drivers/video/fbdev/vermilion/vermilion.c b/drivers/video/fbdev/vermilion/vermilion.c
index ce4c4729a5e8..6f8d444eb0e3 100644
--- a/drivers/video/fbdev/vermilion/vermilion.c
+++ b/drivers/video/fbdev/vermilion/vermilion.c
@@ -55,7 +55,7 @@ static struct list_head global_has_mode;
static struct fb_ops vmlfb_ops;
static struct vml_sys *subsys = NULL;
static char *vml_default_mode = "1024x768@60";
-static struct fb_videomode defaultmode = {
+static const struct fb_videomode defaultmode = {
NULL, 60, 1024, 768, 12896, 144, 24, 29, 3, 136, 6,
0, FB_VMODE_NONINTERLACED
};
@@ -1044,7 +1044,7 @@ static struct fb_ops vmlfb_ops = {
.fb_setcolreg = vmlfb_setcolreg
};
-static struct pci_device_id vml_ids[] = {
+static const struct pci_device_id vml_ids[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, VML_DEVICE_VDC)},
{0}
};
diff --git a/drivers/video/fbdev/via/via-core.c b/drivers/video/fbdev/via/via-core.c
index 1d28e16888e9..77774d8abf94 100644
--- a/drivers/video/fbdev/via/via-core.c
+++ b/drivers/video/fbdev/via/via-core.c
@@ -724,7 +724,7 @@ static void via_pci_remove(struct pci_dev *pdev)
}
-static struct pci_device_id via_pci_table[] = {
+static const struct pci_device_id via_pci_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CLE266_DID),
.driver_data = UNICHROME_CLE266 },
{ PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K400_DID),
diff --git a/drivers/video/fbdev/vt8623fb.c b/drivers/video/fbdev/vt8623fb.c
index dd0f18e42d3e..5cac871db3ee 100644
--- a/drivers/video/fbdev/vt8623fb.c
+++ b/drivers/video/fbdev/vt8623fb.c
@@ -81,7 +81,7 @@ static struct vga_regset vt8623_line_compare_regs[] = {{0x18, 0, 7}, {0x07, 4,
static struct vga_regset vt8623_fetch_count_regs[] = {{0x1C, 0, 7}, {0x1D, 0, 1}, VGA_REGSET_END};
static struct vga_regset vt8623_start_address_regs[] = {{0x0d, 0, 7}, {0x0c, 0, 7}, {0x34, 0, 7}, {0x48, 0, 1}, VGA_REGSET_END};
-static struct svga_timing_regs vt8623_timing_regs = {
+static const struct svga_timing_regs vt8623_timing_regs = {
vt8623_h_total_regs, vt8623_h_display_regs, vt8623_h_blank_start_regs,
vt8623_h_blank_end_regs, vt8623_h_sync_start_regs, vt8623_h_sync_end_regs,
vt8623_v_total_regs, vt8623_v_display_regs, vt8623_v_blank_start_regs,
@@ -888,7 +888,7 @@ fail:
/* List of boards that we are trying to support */
-static struct pci_device_id vt8623_devices[] = {
+static const struct pci_device_id vt8623_devices[] = {
{PCI_DEVICE(PCI_VENDOR_ID_VIA, 0x3122)},
{0, 0, 0, 0, 0, 0, 0}
};
diff --git a/drivers/video/fbdev/xilinxfb.c b/drivers/video/fbdev/xilinxfb.c
index 17dc119c7a98..8628829b470d 100644
--- a/drivers/video/fbdev/xilinxfb.c
+++ b/drivers/video/fbdev/xilinxfb.c
@@ -41,7 +41,6 @@
#define DRIVER_NAME "xilinxfb"
-
/*
* Xilinx calls it "TFT LCD Controller" though it can also be used for
* the VGA port on the Xilinx ML40x board. This is a hardware display
@@ -92,15 +91,16 @@ struct xilinxfb_platform_data {
u32 xvirt, yvirt; /* resolution of memory buffer */
/* Physical address of framebuffer memory; If non-zero, driver
- * will use provided memory address instead of allocating one from
- * the consistent pool. */
+ * will use provided memory address instead of allocating one from
+ * the consistent pool.
+ */
u32 fb_phys;
};
/*
* Default xilinxfb configuration
*/
-static struct xilinxfb_platform_data xilinx_fb_default_pdata = {
+static const struct xilinxfb_platform_data xilinx_fb_default_pdata = {
.xres = 640,
.yres = 480,
.xvirt = 1024,
@@ -110,14 +110,14 @@ static struct xilinxfb_platform_data xilinx_fb_default_pdata = {
/*
* Here are the default fb_fix_screeninfo and fb_var_screeninfo structures
*/
-static struct fb_fix_screeninfo xilinx_fb_fix = {
+static const struct fb_fix_screeninfo xilinx_fb_fix = {
.id = "Xilinx",
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
.accel = FB_ACCEL_NONE
};
-static struct fb_var_screeninfo xilinx_fb_var = {
+static const struct fb_var_screeninfo xilinx_fb_var = {
.bits_per_pixel = BITS_PER_PIXEL,
.red = { RED_SHIFT, 8, 0 },
@@ -128,18 +128,18 @@ static struct fb_var_screeninfo xilinx_fb_var = {
.activate = FB_ACTIVATE_NOW
};
-
#define BUS_ACCESS_FLAG 0x1 /* 1 = BUS, 0 = DCR */
#define LITTLE_ENDIAN_ACCESS 0x2 /* LITTLE ENDIAN IO functions */
struct xilinxfb_drvdata {
-
struct fb_info info; /* FB driver info record */
phys_addr_t regs_phys; /* phys. address of the control
- registers */
+ * registers
+ */
void __iomem *regs; /* virt. address of the control
- registers */
+ * registers
+ */
#ifdef CONFIG_PPC_DCR
dcr_host_t dcr_host;
unsigned int dcr_len;
@@ -148,7 +148,7 @@ struct xilinxfb_drvdata {
dma_addr_t fb_phys; /* phys. address of the frame buffer */
int fb_alloced; /* Flag, was the fb memory alloced? */
- u8 flags; /* features of the driver */
+ u8 flags; /* features of the driver */
u32 reg_ctrl_default;
@@ -165,7 +165,7 @@ struct xilinxfb_drvdata {
* which bus its connected and call the appropriate write API.
*/
static void xilinx_fb_out32(struct xilinxfb_drvdata *drvdata, u32 offset,
- u32 val)
+ u32 val)
{
if (drvdata->flags & BUS_ACCESS_FLAG) {
if (drvdata->flags & LITTLE_ENDIAN_ACCESS)
@@ -195,8 +195,8 @@ static u32 xilinx_fb_in32(struct xilinxfb_drvdata *drvdata, u32 offset)
}
static int
-xilinx_fb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
- unsigned transp, struct fb_info *fbi)
+xilinx_fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green,
+ unsigned int blue, unsigned int transp, struct fb_info *fbi)
{
u32 *palette = fbi->pseudo_palette;
@@ -205,9 +205,11 @@ xilinx_fb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
if (fbi->var.grayscale) {
/* Convert color to grayscale.
- * grayscale = 0.30*R + 0.59*G + 0.11*B */
- red = green = blue =
- (red * 77 + green * 151 + blue * 28 + 127) >> 8;
+ * grayscale = 0.30*R + 0.59*G + 0.11*B
+ */
+ blue = (red * 77 + green * 151 + blue * 28 + 127) >> 8;
+ green = blue;
+ red = green;
}
/* fbi->fix.visual is always FB_VISUAL_TRUECOLOR */
@@ -241,13 +243,11 @@ xilinx_fb_blank(int blank_mode, struct fb_info *fbi)
xilinx_fb_out32(drvdata, REG_CTRL, 0);
default:
break;
-
}
return 0; /* success */
}
-static struct fb_ops xilinxfb_ops =
-{
+static struct fb_ops xilinxfb_ops = {
.owner = THIS_MODULE,
.fb_setcolreg = xilinx_fb_setcolreg,
.fb_blank = xilinx_fb_blank,
@@ -286,7 +286,8 @@ static int xilinxfb_assign(struct platform_device *pdev,
} else {
drvdata->fb_alloced = 1;
drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
- &drvdata->fb_phys, GFP_KERNEL);
+ &drvdata->fb_phys,
+ GFP_KERNEL);
}
if (!drvdata->fb_virt) {
@@ -300,7 +301,7 @@ static int xilinxfb_assign(struct platform_device *pdev,
/* Tell the hardware where the frame buffer is */
xilinx_fb_out32(drvdata, REG_FB_ADDR, drvdata->fb_phys);
rc = xilinx_fb_in32(drvdata, REG_FB_ADDR);
- /* Endianess detection */
+ /* Endianness detection */
if (rc != drvdata->fb_phys) {
drvdata->flags |= LITTLE_ENDIAN_ACCESS;
xilinx_fb_out32(drvdata, REG_FB_ADDR, drvdata->fb_phys);
@@ -310,8 +311,7 @@ static int xilinxfb_assign(struct platform_device *pdev,
drvdata->reg_ctrl_default = REG_CTRL_ENABLE;
if (pdata->rotate_screen)
drvdata->reg_ctrl_default |= REG_CTRL_ROTATE;
- xilinx_fb_out32(drvdata, REG_CTRL,
- drvdata->reg_ctrl_default);
+ xilinx_fb_out32(drvdata, REG_CTRL, drvdata->reg_ctrl_default);
/* Fill struct fb_info */
drvdata->info.device = dev;
@@ -364,7 +364,7 @@ err_regfb:
err_cmap:
if (drvdata->fb_alloced)
dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
- drvdata->fb_phys);
+ drvdata->fb_phys);
else
iounmap(drvdata->fb_virt);
@@ -435,12 +435,12 @@ static int xilinxfb_of_probe(struct platform_device *pdev)
* Fill the resource structure if its direct BUS interface
* otherwise fill the dcr_host structure.
*/
- if (tft_access) {
+ if (tft_access)
drvdata->flags |= BUS_ACCESS_FLAG;
- }
#ifdef CONFIG_PPC_DCR
else {
int start;
+
start = dcr_resource_start(pdev->dev.of_node, 0);
drvdata->dcr_len = dcr_resource_len(pdev->dev.of_node, 0);
drvdata->dcr_host = dcr_map(pdev->dev.of_node, start, drvdata->dcr_len);
@@ -452,19 +452,19 @@ static int xilinxfb_of_probe(struct platform_device *pdev)
#endif
prop = of_get_property(pdev->dev.of_node, "phys-size", &size);
- if ((prop) && (size >= sizeof(u32)*2)) {
+ if ((prop) && (size >= sizeof(u32) * 2)) {
pdata.screen_width_mm = prop[0];
pdata.screen_height_mm = prop[1];
}
prop = of_get_property(pdev->dev.of_node, "resolution", &size);
- if ((prop) && (size >= sizeof(u32)*2)) {
+ if ((prop) && (size >= sizeof(u32) * 2)) {
pdata.xres = prop[0];
pdata.yres = prop[1];
}
prop = of_get_property(pdev->dev.of_node, "virtual-resolution", &size);
- if ((prop) && (size >= sizeof(u32)*2)) {
+ if ((prop) && (size >= sizeof(u32) * 2)) {
pdata.xvirt = prop[0];
pdata.yvirt = prop[1];
}
@@ -482,7 +482,7 @@ static int xilinxfb_of_remove(struct platform_device *op)
}
/* Match table for of_platform binding */
-static struct of_device_id xilinxfb_of_match[] = {
+static const struct of_device_id xilinxfb_of_match[] = {
{ .compatible = "xlnx,xps-tft-1.00.a", },
{ .compatible = "xlnx,xps-tft-2.00.a", },
{ .compatible = "xlnx,xps-tft-2.01.a", },
diff --git a/drivers/video/of_display_timing.c b/drivers/video/of_display_timing.c
index 32b0a7543433..8ce0a99bf17c 100644
--- a/drivers/video/of_display_timing.c
+++ b/drivers/video/of_display_timing.c
@@ -31,8 +31,7 @@ static int parse_timing_property(const struct device_node *np, const char *name,
prop = of_find_property(np, name, &length);
if (!prop) {
- pr_err("%s: could not find property %s\n",
- of_node_full_name(np), name);
+ pr_err("%pOF: could not find property %s\n", np, name);
return -EINVAL;
}
@@ -44,8 +43,7 @@ static int parse_timing_property(const struct device_node *np, const char *name,
} else if (cells == 3) {
ret = of_property_read_u32_array(np, name, &result->min, cells);
} else {
- pr_err("%s: illegal timing specification in %s\n",
- of_node_full_name(np), name);
+ pr_err("%pOF: illegal timing specification in %s\n", np, name);
return -EINVAL;
}
@@ -105,8 +103,7 @@ static int of_parse_display_timing(const struct device_node *np,
dt->flags |= DISPLAY_FLAGS_DOUBLECLK;
if (ret) {
- pr_err("%s: error reading timing properties\n",
- of_node_full_name(np));
+ pr_err("%pOF: error reading timing properties\n", np);
return -EINVAL;
}
@@ -129,8 +126,7 @@ int of_get_display_timing(const struct device_node *np, const char *name,
timing_np = of_get_child_by_name(np, name);
if (!timing_np) {
- pr_err("%s: could not find node '%s'\n",
- of_node_full_name(np), name);
+ pr_err("%pOF: could not find node '%s'\n", np, name);
return -ENOENT;
}
@@ -154,15 +150,13 @@ struct display_timings *of_get_display_timings(const struct device_node *np)
timings_np = of_get_child_by_name(np, "display-timings");
if (!timings_np) {
- pr_err("%s: could not find display-timings node\n",
- of_node_full_name(np));
+ pr_err("%pOF: could not find display-timings node\n", np);
return NULL;
}
disp = kzalloc(sizeof(*disp), GFP_KERNEL);
if (!disp) {
- pr_err("%s: could not allocate struct disp'\n",
- of_node_full_name(np));
+ pr_err("%pOF: could not allocate struct disp'\n", np);
goto dispfail;
}
@@ -172,28 +166,25 @@ struct display_timings *of_get_display_timings(const struct device_node *np)
entry = of_get_next_child(timings_np, NULL);
/* if there is no child, it is useless to go on */
if (!entry) {
- pr_err("%s: no timing specifications given\n",
- of_node_full_name(np));
+ pr_err("%pOF: no timing specifications given\n", np);
goto entryfail;
}
- pr_debug("%s: using %s as default timing\n",
- of_node_full_name(np), entry->name);
+ pr_debug("%pOF: using %s as default timing\n", np, entry->name);
native_mode = entry;
disp->num_timings = of_get_child_count(timings_np);
if (disp->num_timings == 0) {
/* should never happen, as entry was already found above */
- pr_err("%s: no timings specified\n", of_node_full_name(np));
+ pr_err("%pOF: no timings specified\n", np);
goto entryfail;
}
disp->timings = kzalloc(sizeof(struct display_timing *) *
disp->num_timings, GFP_KERNEL);
if (!disp->timings) {
- pr_err("%s: could not allocate timings array\n",
- of_node_full_name(np));
+ pr_err("%pOF: could not allocate timings array\n", np);
goto entryfail;
}
@@ -206,8 +197,8 @@ struct display_timings *of_get_display_timings(const struct device_node *np)
dt = kzalloc(sizeof(*dt), GFP_KERNEL);
if (!dt) {
- pr_err("%s: could not allocate display_timing struct\n",
- of_node_full_name(np));
+ pr_err("%pOF: could not allocate display_timing struct\n",
+ np);
goto timingfail;
}
@@ -217,8 +208,8 @@ struct display_timings *of_get_display_timings(const struct device_node *np)
* to not encourage wrong devicetrees, fail in case of
* an error
*/
- pr_err("%s: error in timing %d\n",
- of_node_full_name(np), disp->num_timings + 1);
+ pr_err("%pOF: error in timing %d\n",
+ np, disp->num_timings + 1);
kfree(dt);
goto timingfail;
}
@@ -236,8 +227,8 @@ struct display_timings *of_get_display_timings(const struct device_node *np)
*/
of_node_put(native_mode);
- pr_debug("%s: got %d timings. Using timing #%d as default\n",
- of_node_full_name(np), disp->num_timings,
+ pr_debug("%pOF: got %d timings. Using timing #%d as default\n",
+ np, disp->num_timings,
disp->native_mode + 1);
return disp;
diff --git a/drivers/video/of_videomode.c b/drivers/video/of_videomode.c
index b5102aa6090d..9b5f9de88fec 100644
--- a/drivers/video/of_videomode.c
+++ b/drivers/video/of_videomode.c
@@ -36,7 +36,7 @@ int of_get_videomode(struct device_node *np, struct videomode *vm,
disp = of_get_display_timings(np);
if (!disp) {
- pr_err("%s: no timings specified\n", of_node_full_name(np));
+ pr_err("%pOF: no timings specified\n", np);
return -EINVAL;
}
diff --git a/drivers/w1/slaves/Kconfig b/drivers/w1/slaves/Kconfig
index bb4d7ed2ce55..3c945f9f5f0f 100644
--- a/drivers/w1/slaves/Kconfig
+++ b/drivers/w1/slaves/Kconfig
@@ -148,10 +148,4 @@ config W1_SLAVE_DS28E04
If you are unsure, say N.
-config W1_SLAVE_BQ27000
- tristate "BQ27000 slave support"
- help
- Say Y here if you want to use a hdq
- bq27000 slave support.
-
endmenu
diff --git a/drivers/w1/slaves/Makefile b/drivers/w1/slaves/Makefile
index 4622d8fed362..36b22fb2d3a1 100644
--- a/drivers/w1/slaves/Makefile
+++ b/drivers/w1/slaves/Makefile
@@ -16,5 +16,4 @@ obj-$(CONFIG_W1_SLAVE_DS2438) += w1_ds2438.o
obj-$(CONFIG_W1_SLAVE_DS2760) += w1_ds2760.o
obj-$(CONFIG_W1_SLAVE_DS2780) += w1_ds2780.o
obj-$(CONFIG_W1_SLAVE_DS2781) += w1_ds2781.o
-obj-$(CONFIG_W1_SLAVE_BQ27000) += w1_bq27000.o
obj-$(CONFIG_W1_SLAVE_DS28E04) += w1_ds28e04.o
diff --git a/drivers/w1/slaves/w1_bq27000.c b/drivers/w1/slaves/w1_bq27000.c
deleted file mode 100644
index 8046ac45381a..000000000000
--- a/drivers/w1/slaves/w1_bq27000.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * drivers/w1/slaves/w1_bq27000.c
- *
- * Copyright (C) 2007 Texas Instruments, Inc.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/device.h>
-#include <linux/types.h>
-#include <linux/platform_device.h>
-#include <linux/mutex.h>
-#include <linux/power/bq27xxx_battery.h>
-
-#include <linux/w1.h>
-
-#define W1_FAMILY_BQ27000 0x01
-
-#define HDQ_CMD_READ (0)
-#define HDQ_CMD_WRITE (1<<7)
-
-static int F_ID;
-module_param(F_ID, int, S_IRUSR);
-MODULE_PARM_DESC(F_ID, "1-wire slave FID for BQ device");
-
-static int w1_bq27000_read(struct device *dev, unsigned int reg)
-{
- u8 val;
- struct w1_slave *sl = container_of(dev->parent, struct w1_slave, dev);
-
- mutex_lock(&sl->master->bus_mutex);
- w1_write_8(sl->master, HDQ_CMD_READ | reg);
- val = w1_read_8(sl->master);
- mutex_unlock(&sl->master->bus_mutex);
-
- return val;
-}
-
-static struct bq27xxx_platform_data bq27000_battery_info = {
- .read = w1_bq27000_read,
- .name = "bq27000-battery",
- .chip = BQ27000,
-};
-
-static int w1_bq27000_add_slave(struct w1_slave *sl)
-{
- int ret;
- struct platform_device *pdev;
-
- pdev = platform_device_alloc("bq27000-battery", -1);
- if (!pdev) {
- ret = -ENOMEM;
- return ret;
- }
- ret = platform_device_add_data(pdev,
- &bq27000_battery_info,
- sizeof(bq27000_battery_info));
- if (ret)
- goto pdev_add_failed;
- pdev->dev.parent = &sl->dev;
-
- ret = platform_device_add(pdev);
- if (ret)
- goto pdev_add_failed;
-
- dev_set_drvdata(&sl->dev, pdev);
-
- goto success;
-
-pdev_add_failed:
- platform_device_put(pdev);
-success:
- return ret;
-}
-
-static void w1_bq27000_remove_slave(struct w1_slave *sl)
-{
- struct platform_device *pdev = dev_get_drvdata(&sl->dev);
-
- platform_device_unregister(pdev);
-}
-
-static struct w1_family_ops w1_bq27000_fops = {
- .add_slave = w1_bq27000_add_slave,
- .remove_slave = w1_bq27000_remove_slave,
-};
-
-static struct w1_family w1_bq27000_family = {
- .fid = W1_FAMILY_BQ27000,
- .fops = &w1_bq27000_fops,
-};
-
-static int __init w1_bq27000_init(void)
-{
- if (F_ID)
- w1_bq27000_family.fid = F_ID;
-
- return w1_register_family(&w1_bq27000_family);
-}
-
-static void __exit w1_bq27000_exit(void)
-{
- w1_unregister_family(&w1_bq27000_family);
-}
-
-module_init(w1_bq27000_init);
-module_exit(w1_bq27000_exit);
-
-MODULE_AUTHOR("Texas Instruments Ltd");
-MODULE_DESCRIPTION("HDQ/1-wire slave driver bq27000 battery monitor chip");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_BQ27000));
diff --git a/drivers/watchdog/asm9260_wdt.c b/drivers/watchdog/asm9260_wdt.c
index 53da001f0838..7dd0da644a7f 100644
--- a/drivers/watchdog/asm9260_wdt.c
+++ b/drivers/watchdog/asm9260_wdt.c
@@ -82,7 +82,7 @@ static unsigned int asm9260_wdt_gettimeleft(struct watchdog_device *wdd)
counter = ioread32(priv->iobase + HW_WDTV);
- return DIV_ROUND_CLOSEST(counter, priv->wdt_freq);
+ return counter / priv->wdt_freq;
}
static int asm9260_wdt_updatetimeout(struct watchdog_device *wdd)
@@ -296,7 +296,7 @@ static int asm9260_wdt_probe(struct platform_device *pdev)
if (ret)
return ret;
- priv->rst = devm_reset_control_get(&pdev->dev, "wdt_rst");
+ priv->rst = devm_reset_control_get_exclusive(&pdev->dev, "wdt_rst");
if (IS_ERR(priv->rst))
return PTR_ERR(priv->rst);
diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
index 1c652582de40..79cc766cd30f 100644
--- a/drivers/watchdog/aspeed_wdt.c
+++ b/drivers/watchdog/aspeed_wdt.c
@@ -23,9 +23,21 @@ struct aspeed_wdt {
u32 ctrl;
};
+struct aspeed_wdt_config {
+ u32 ext_pulse_width_mask;
+};
+
+static const struct aspeed_wdt_config ast2400_config = {
+ .ext_pulse_width_mask = 0xff,
+};
+
+static const struct aspeed_wdt_config ast2500_config = {
+ .ext_pulse_width_mask = 0xfffff,
+};
+
static const struct of_device_id aspeed_wdt_of_table[] = {
- { .compatible = "aspeed,ast2400-wdt" },
- { .compatible = "aspeed,ast2500-wdt" },
+ { .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
+ { .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
{ },
};
MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
@@ -36,12 +48,45 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
#define WDT_CTRL 0x0C
#define WDT_CTRL_RESET_MODE_SOC (0x00 << 5)
#define WDT_CTRL_RESET_MODE_FULL_CHIP (0x01 << 5)
+#define WDT_CTRL_RESET_MODE_ARM_CPU (0x10 << 5)
#define WDT_CTRL_1MHZ_CLK BIT(4)
#define WDT_CTRL_WDT_EXT BIT(3)
#define WDT_CTRL_WDT_INTR BIT(2)
#define WDT_CTRL_RESET_SYSTEM BIT(1)
#define WDT_CTRL_ENABLE BIT(0)
+/*
+ * WDT_RESET_WIDTH controls the characteristics of the external pulse (if
+ * enabled), specifically:
+ *
+ * * Pulse duration
+ * * Drive mode: push-pull vs open-drain
+ * * Polarity: Active high or active low
+ *
+ * Pulse duration configuration is available on both the AST2400 and AST2500,
+ * though the field changes between SoCs:
+ *
+ * AST2400: Bits 7:0
+ * AST2500: Bits 19:0
+ *
+ * This difference is captured in struct aspeed_wdt_config.
+ *
+ * The AST2500 exposes the drive mode and polarity options, but not in a
+ * regular fashion. For read purposes, bit 31 represents active high or low,
+ * and bit 30 represents push-pull or open-drain. With respect to write, magic
+ * values need to be written to the top byte to change the state of the drive
+ * mode and polarity bits. Any other value written to the top byte has no
+ * effect on the state of the drive mode or polarity bits. However, the pulse
+ * width value must be preserved (as desired) if written.
+ */
+#define WDT_RESET_WIDTH 0x18
+#define WDT_RESET_WIDTH_ACTIVE_HIGH BIT(31)
+#define WDT_ACTIVE_HIGH_MAGIC (0xA5 << 24)
+#define WDT_ACTIVE_LOW_MAGIC (0x5A << 24)
+#define WDT_RESET_WIDTH_PUSH_PULL BIT(30)
+#define WDT_PUSH_PULL_MAGIC (0xA8 << 24)
+#define WDT_OPEN_DRAIN_MAGIC (0x8A << 24)
+
#define WDT_RESTART_MAGIC 0x4755
/* 32 bits at 1MHz, in milliseconds */
@@ -138,8 +183,13 @@ static const struct watchdog_info aspeed_wdt_info = {
static int aspeed_wdt_probe(struct platform_device *pdev)
{
+ const struct aspeed_wdt_config *config;
+ const struct of_device_id *ofdid;
struct aspeed_wdt *wdt;
struct resource *res;
+ struct device_node *np;
+ const char *reset_type;
+ u32 duration;
int ret;
wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
@@ -164,20 +214,88 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
wdt->wdd.timeout = WDT_DEFAULT_TIMEOUT;
watchdog_init_timeout(&wdt->wdd, 0, &pdev->dev);
+ np = pdev->dev.of_node;
+
+ ofdid = of_match_node(aspeed_wdt_of_table, np);
+ if (!ofdid)
+ return -EINVAL;
+ config = ofdid->data;
+
+ wdt->ctrl = WDT_CTRL_1MHZ_CLK;
+
/*
* Control reset on a per-device basis to ensure the
- * host is not affected by a BMC reboot, so only reset
- * the SOC and not the full chip
+ * host is not affected by a BMC reboot
*/
- wdt->ctrl = WDT_CTRL_RESET_MODE_SOC |
- WDT_CTRL_1MHZ_CLK |
- WDT_CTRL_RESET_SYSTEM;
+ ret = of_property_read_string(np, "aspeed,reset-type", &reset_type);
+ if (ret) {
+ wdt->ctrl |= WDT_CTRL_RESET_MODE_SOC | WDT_CTRL_RESET_SYSTEM;
+ } else {
+ if (!strcmp(reset_type, "cpu"))
+ wdt->ctrl |= WDT_CTRL_RESET_MODE_ARM_CPU;
+ else if (!strcmp(reset_type, "soc"))
+ wdt->ctrl |= WDT_CTRL_RESET_MODE_SOC;
+ else if (!strcmp(reset_type, "system"))
+ wdt->ctrl |= WDT_CTRL_RESET_SYSTEM;
+ else if (strcmp(reset_type, "none"))
+ return -EINVAL;
+ }
+ if (of_property_read_bool(np, "aspeed,external-signal"))
+ wdt->ctrl |= WDT_CTRL_WDT_EXT;
+
+ writel(wdt->ctrl, wdt->base + WDT_CTRL);
if (readl(wdt->base + WDT_CTRL) & WDT_CTRL_ENABLE) {
aspeed_wdt_start(&wdt->wdd);
set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
}
+ if (of_device_is_compatible(np, "aspeed,ast2500-wdt")) {
+ u32 reg = readl(wdt->base + WDT_RESET_WIDTH);
+
+ reg &= config->ext_pulse_width_mask;
+ if (of_property_read_bool(np, "aspeed,ext-push-pull"))
+ reg |= WDT_PUSH_PULL_MAGIC;
+ else
+ reg |= WDT_OPEN_DRAIN_MAGIC;
+
+ writel(reg, wdt->base + WDT_RESET_WIDTH);
+
+ reg &= config->ext_pulse_width_mask;
+ if (of_property_read_bool(np, "aspeed,ext-active-high"))
+ reg |= WDT_ACTIVE_HIGH_MAGIC;
+ else
+ reg |= WDT_ACTIVE_LOW_MAGIC;
+
+ writel(reg, wdt->base + WDT_RESET_WIDTH);
+ }
+
+ if (!of_property_read_u32(np, "aspeed,ext-pulse-duration", &duration)) {
+ u32 max_duration = config->ext_pulse_width_mask + 1;
+
+ if (duration == 0 || duration > max_duration) {
+ dev_err(&pdev->dev, "Invalid pulse duration: %uus\n",
+ duration);
+ duration = max(1U, min(max_duration, duration));
+ dev_info(&pdev->dev, "Pulse duration set to %uus\n",
+ duration);
+ }
+
+ /*
+ * The watchdog is always configured with a 1MHz source, so
+ * there is no need to scale the microsecond value. However we
+ * need to offset it - from the datasheet:
+ *
+ * "This register decides the asserting duration of wdt_ext and
+ * wdt_rstarm signal. The default value is 0xFF. It means the
+ * default asserting duration of wdt_ext and wdt_rstarm is
+ * 256us."
+ *
+ * This implies a value of 0 gives a 1us pulse.
+ */
+ writel(duration - 1, wdt->base + WDT_RESET_WIDTH);
+ }
+
ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdd);
if (ret) {
dev_err(&pdev->dev, "failed to register\n");
diff --git a/drivers/watchdog/bcm7038_wdt.c b/drivers/watchdog/bcm7038_wdt.c
index c1b8e534fb55..f88f546e8050 100644
--- a/drivers/watchdog/bcm7038_wdt.c
+++ b/drivers/watchdog/bcm7038_wdt.c
@@ -136,7 +136,9 @@ static int bcm7038_wdt_probe(struct platform_device *pdev)
wdt->clk = devm_clk_get(dev, NULL);
/* If unable to get clock, use default frequency */
if (!IS_ERR(wdt->clk)) {
- clk_prepare_enable(wdt->clk);
+ err = clk_prepare_enable(wdt->clk);
+ if (err)
+ return err;
wdt->rate = clk_get_rate(wdt->clk);
/* Prevent divide-by-zero exception */
if (!wdt->rate)
diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index 05c000081e9d..064cf7b6c1c5 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -52,12 +52,12 @@
static int wdt_timeout;
static int nowayout = WATCHDOG_NOWAYOUT;
-module_param(wdt_timeout, int, 0);
+module_param(wdt_timeout, int, 0644);
MODULE_PARM_DESC(wdt_timeout,
"Watchdog time in seconds. (default="
__MODULE_STRING(CDNS_WDT_DEFAULT_TIMEOUT) ")");
-module_param(nowayout, int, 0);
+module_param(nowayout, int, 0644);
MODULE_PARM_DESC(nowayout,
"Watchdog cannot be stopped once started (default="
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@ -368,7 +368,7 @@ static int cdns_wdt_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, wdt);
- dev_dbg(&pdev->dev, "Xilinx Watchdog Timer at %p with timeout %ds%s\n",
+ dev_info(&pdev->dev, "Xilinx Watchdog Timer at %p with timeout %ds%s\n",
wdt->regs, cdns_wdt_device->timeout,
nowayout ? ", nowayout" : "");
diff --git a/drivers/watchdog/coh901327_wdt.c b/drivers/watchdog/coh901327_wdt.c
index 38dd60f0cfcc..4410337f4f7f 100644
--- a/drivers/watchdog/coh901327_wdt.c
+++ b/drivers/watchdog/coh901327_wdt.c
@@ -218,7 +218,7 @@ static const struct watchdog_info coh901327_ident = {
.identity = DRV_NAME,
};
-static struct watchdog_ops coh901327_ops = {
+static const struct watchdog_ops coh901327_ops = {
.owner = THIS_MODULE,
.start = coh901327_start,
.stop = coh901327_stop,
diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c
index 4691c5509129..2a20fc163ed0 100644
--- a/drivers/watchdog/da9063_wdt.c
+++ b/drivers/watchdog/da9063_wdt.c
@@ -36,11 +36,6 @@ static const unsigned int wdt_timeout[] = { 0, 2, 4, 8, 16, 32, 65, 131 };
#define DA9063_WDG_TIMEOUT wdt_timeout[3]
#define DA9063_RESET_PROTECTION_MS 256
-struct da9063_watchdog {
- struct da9063 *da9063;
- struct watchdog_device wdtdev;
-};
-
static unsigned int da9063_wdt_timeout_to_sel(unsigned int secs)
{
unsigned int i;
@@ -61,14 +56,14 @@ static int _da9063_wdt_set_timeout(struct da9063 *da9063, unsigned int regval)
static int da9063_wdt_start(struct watchdog_device *wdd)
{
- struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
+ struct da9063 *da9063 = watchdog_get_drvdata(wdd);
unsigned int selector;
int ret;
- selector = da9063_wdt_timeout_to_sel(wdt->wdtdev.timeout);
- ret = _da9063_wdt_set_timeout(wdt->da9063, selector);
+ selector = da9063_wdt_timeout_to_sel(wdd->timeout);
+ ret = _da9063_wdt_set_timeout(da9063, selector);
if (ret)
- dev_err(wdt->da9063->dev, "Watchdog failed to start (err = %d)\n",
+ dev_err(da9063->dev, "Watchdog failed to start (err = %d)\n",
ret);
return ret;
@@ -76,13 +71,13 @@ static int da9063_wdt_start(struct watchdog_device *wdd)
static int da9063_wdt_stop(struct watchdog_device *wdd)
{
- struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
+ struct da9063 *da9063 = watchdog_get_drvdata(wdd);
int ret;
- ret = regmap_update_bits(wdt->da9063->regmap, DA9063_REG_CONTROL_D,
+ ret = regmap_update_bits(da9063->regmap, DA9063_REG_CONTROL_D,
DA9063_TWDSCALE_MASK, DA9063_TWDSCALE_DISABLE);
if (ret)
- dev_alert(wdt->da9063->dev, "Watchdog failed to stop (err = %d)\n",
+ dev_alert(da9063->dev, "Watchdog failed to stop (err = %d)\n",
ret);
return ret;
@@ -90,13 +85,13 @@ static int da9063_wdt_stop(struct watchdog_device *wdd)
static int da9063_wdt_ping(struct watchdog_device *wdd)
{
- struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
+ struct da9063 *da9063 = watchdog_get_drvdata(wdd);
int ret;
- ret = regmap_write(wdt->da9063->regmap, DA9063_REG_CONTROL_F,
+ ret = regmap_write(da9063->regmap, DA9063_REG_CONTROL_F,
DA9063_WATCHDOG);
if (ret)
- dev_alert(wdt->da9063->dev, "Failed to ping the watchdog (err = %d)\n",
+ dev_alert(da9063->dev, "Failed to ping the watchdog (err = %d)\n",
ret);
return ret;
@@ -105,14 +100,14 @@ static int da9063_wdt_ping(struct watchdog_device *wdd)
static int da9063_wdt_set_timeout(struct watchdog_device *wdd,
unsigned int timeout)
{
- struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
+ struct da9063 *da9063 = watchdog_get_drvdata(wdd);
unsigned int selector;
int ret;
selector = da9063_wdt_timeout_to_sel(timeout);
- ret = _da9063_wdt_set_timeout(wdt->da9063, selector);
+ ret = _da9063_wdt_set_timeout(da9063, selector);
if (ret)
- dev_err(wdt->da9063->dev, "Failed to set watchdog timeout (err = %d)\n",
+ dev_err(da9063->dev, "Failed to set watchdog timeout (err = %d)\n",
ret);
else
wdd->timeout = wdt_timeout[selector];
@@ -123,13 +118,13 @@ static int da9063_wdt_set_timeout(struct watchdog_device *wdd,
static int da9063_wdt_restart(struct watchdog_device *wdd, unsigned long action,
void *data)
{
- struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
+ struct da9063 *da9063 = watchdog_get_drvdata(wdd);
int ret;
- ret = regmap_write(wdt->da9063->regmap, DA9063_REG_CONTROL_F,
+ ret = regmap_write(da9063->regmap, DA9063_REG_CONTROL_F,
DA9063_SHUTDOWN);
if (ret)
- dev_alert(wdt->da9063->dev, "Failed to shutdown (err = %d)\n",
+ dev_alert(da9063->dev, "Failed to shutdown (err = %d)\n",
ret);
return ret;
@@ -152,7 +147,7 @@ static const struct watchdog_ops da9063_watchdog_ops = {
static int da9063_wdt_probe(struct platform_device *pdev)
{
struct da9063 *da9063;
- struct da9063_watchdog *wdt;
+ struct watchdog_device *wdd;
if (!pdev->dev.parent)
return -EINVAL;
@@ -161,27 +156,25 @@ static int da9063_wdt_probe(struct platform_device *pdev)
if (!da9063)
return -EINVAL;
- wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
- if (!wdt)
+ wdd = devm_kzalloc(&pdev->dev, sizeof(*wdd), GFP_KERNEL);
+ if (!wdd)
return -ENOMEM;
- wdt->da9063 = da9063;
-
- wdt->wdtdev.info = &da9063_watchdog_info;
- wdt->wdtdev.ops = &da9063_watchdog_ops;
- wdt->wdtdev.min_timeout = DA9063_WDT_MIN_TIMEOUT;
- wdt->wdtdev.max_timeout = DA9063_WDT_MAX_TIMEOUT;
- wdt->wdtdev.min_hw_heartbeat_ms = DA9063_RESET_PROTECTION_MS;
- wdt->wdtdev.timeout = DA9063_WDG_TIMEOUT;
- wdt->wdtdev.parent = &pdev->dev;
+ wdd->info = &da9063_watchdog_info;
+ wdd->ops = &da9063_watchdog_ops;
+ wdd->min_timeout = DA9063_WDT_MIN_TIMEOUT;
+ wdd->max_timeout = DA9063_WDT_MAX_TIMEOUT;
+ wdd->min_hw_heartbeat_ms = DA9063_RESET_PROTECTION_MS;
+ wdd->timeout = DA9063_WDG_TIMEOUT;
+ wdd->parent = &pdev->dev;
- wdt->wdtdev.status = WATCHDOG_NOWAYOUT_INIT_STATUS;
+ wdd->status = WATCHDOG_NOWAYOUT_INIT_STATUS;
- watchdog_set_restart_priority(&wdt->wdtdev, 128);
+ watchdog_set_restart_priority(wdd, 128);
- watchdog_set_drvdata(&wdt->wdtdev, wdt);
+ watchdog_set_drvdata(wdd, da9063);
- return devm_watchdog_register_device(&pdev->dev, &wdt->wdtdev);
+ return devm_watchdog_register_device(&pdev->dev, wdd);
}
static struct platform_driver da9063_wdt_driver = {
diff --git a/drivers/watchdog/diag288_wdt.c b/drivers/watchdog/diag288_wdt.c
index 6f591084bb7a..806a04a676b7 100644
--- a/drivers/watchdog/diag288_wdt.c
+++ b/drivers/watchdog/diag288_wdt.c
@@ -213,7 +213,7 @@ static const struct watchdog_ops wdt_ops = {
.set_timeout = wdt_set_timeout,
};
-static struct watchdog_info wdt_info = {
+static const struct watchdog_info wdt_info = {
.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
.firmware_version = 0,
.identity = "z Watchdog",
diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
index c4f65873bfa4..347f0389b089 100644
--- a/drivers/watchdog/iTCO_wdt.c
+++ b/drivers/watchdog/iTCO_wdt.c
@@ -306,15 +306,16 @@ static int iTCO_wdt_ping(struct watchdog_device *wd_dev)
iTCO_vendor_pre_keepalive(p->smi_res, wd_dev->timeout);
- /* Reset the timeout status bit so that the timer
- * needs to count down twice again before rebooting */
- outw(0x0008, TCO1_STS(p)); /* write 1 to clear bit */
-
/* Reload the timer by writing to the TCO Timer Counter register */
- if (p->iTCO_version >= 2)
+ if (p->iTCO_version >= 2) {
outw(0x01, TCO_RLD(p));
- else if (p->iTCO_version == 1)
+ } else if (p->iTCO_version == 1) {
+ /* Reset the timeout status bit so that the timer
+ * needs to count down twice again before rebooting */
+ outw(0x0008, TCO1_STS(p)); /* write 1 to clear bit */
+
outb(0x01, TCO_RLD(p));
+ }
spin_unlock(&p->io_lock);
return 0;
@@ -327,8 +328,11 @@ static int iTCO_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t)
unsigned char val8;
unsigned int tmrval;
- /* The timer counts down twice before rebooting */
- tmrval = seconds_to_ticks(p, t) / 2;
+ tmrval = seconds_to_ticks(p, t);
+
+ /* For TCO v1 the timer counts down twice before rebooting */
+ if (p->iTCO_version == 1)
+ tmrval /= 2;
/* from the specs: */
/* "Values of 0h-3h are ignored and should not be attempted" */
@@ -381,8 +385,6 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
spin_lock(&p->io_lock);
val16 = inw(TCO_RLD(p));
val16 &= 0x3ff;
- if (!(inw(TCO1_STS(p)) & 0x0008))
- val16 += (inw(TCOv2_TMR(p)) & 0x3ff);
spin_unlock(&p->io_lock);
time_left = ticks_to_seconds(p, val16);
diff --git a/drivers/watchdog/it87_wdt.c b/drivers/watchdog/it87_wdt.c
index dd1e7eaef50f..e96faea24925 100644
--- a/drivers/watchdog/it87_wdt.c
+++ b/drivers/watchdog/it87_wdt.c
@@ -253,7 +253,7 @@ static const struct watchdog_info ident = {
.identity = WATCHDOG_NAME,
};
-static struct watchdog_ops wdt_ops = {
+static const struct watchdog_ops wdt_ops = {
.owner = THIS_MODULE,
.start = wdt_start,
.stop = wdt_stop,
diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c
index e0823677d8c1..7f43cefa0eae 100644
--- a/drivers/watchdog/lantiq_wdt.c
+++ b/drivers/watchdog/lantiq_wdt.c
@@ -4,6 +4,7 @@
* by the Free Software Foundation.
*
* Copyright (C) 2010 John Crispin <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
* Based on EP93xx wdt driver
*/
@@ -17,9 +18,20 @@
#include <linux/uaccess.h>
#include <linux/clk.h>
#include <linux/io.h>
+#include <linux/regmap.h>
+#include <linux/mfd/syscon.h>
#include <lantiq_soc.h>
+#define LTQ_XRX_RCU_RST_STAT 0x0014
+#define LTQ_XRX_RCU_RST_STAT_WDT BIT(31)
+
+/* CPU0 Reset Source Register */
+#define LTQ_FALCON_SYS1_CPU0RS 0x0060
+/* reset cause mask */
+#define LTQ_FALCON_SYS1_CPU0RS_MASK 0x0007
+#define LTQ_FALCON_SYS1_CPU0RS_WDT 0x02
+
/*
* Section 3.4 of the datasheet
* The password sequence protects the WDT control register from unintended
@@ -186,16 +198,70 @@ static struct miscdevice ltq_wdt_miscdev = {
.fops = &ltq_wdt_fops,
};
+typedef int (*ltq_wdt_bootstatus_set)(struct platform_device *pdev);
+
+static int ltq_wdt_bootstatus_xrx(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct regmap *rcu_regmap;
+ u32 val;
+ int err;
+
+ rcu_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "regmap");
+ if (IS_ERR(rcu_regmap))
+ return PTR_ERR(rcu_regmap);
+
+ err = regmap_read(rcu_regmap, LTQ_XRX_RCU_RST_STAT, &val);
+ if (err)
+ return err;
+
+ if (val & LTQ_XRX_RCU_RST_STAT_WDT)
+ ltq_wdt_bootstatus = WDIOF_CARDRESET;
+
+ return 0;
+}
+
+static int ltq_wdt_bootstatus_falcon(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct regmap *rcu_regmap;
+ u32 val;
+ int err;
+
+ rcu_regmap = syscon_regmap_lookup_by_phandle(dev->of_node,
+ "lantiq,rcu");
+ if (IS_ERR(rcu_regmap))
+ return PTR_ERR(rcu_regmap);
+
+ err = regmap_read(rcu_regmap, LTQ_FALCON_SYS1_CPU0RS, &val);
+ if (err)
+ return err;
+
+ if ((val & LTQ_FALCON_SYS1_CPU0RS_MASK) == LTQ_FALCON_SYS1_CPU0RS_WDT)
+ ltq_wdt_bootstatus = WDIOF_CARDRESET;
+
+ return 0;
+}
+
static int
ltq_wdt_probe(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct clk *clk;
+ ltq_wdt_bootstatus_set ltq_wdt_bootstatus_set;
+ int ret;
ltq_wdt_membase = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(ltq_wdt_membase))
return PTR_ERR(ltq_wdt_membase);
+ ltq_wdt_bootstatus_set = of_device_get_match_data(&pdev->dev);
+ if (ltq_wdt_bootstatus_set) {
+ ret = ltq_wdt_bootstatus_set(pdev);
+ if (ret)
+ return ret;
+ }
+
/* we do not need to enable the clock as it is always running */
clk = clk_get_io();
if (IS_ERR(clk)) {
@@ -205,10 +271,6 @@ ltq_wdt_probe(struct platform_device *pdev)
ltq_io_region_clk_rate = clk_get_rate(clk);
clk_put(clk);
- /* find out if the watchdog caused the last reboot */
- if (ltq_reset_cause() == LTQ_RST_CAUSE_WDTRST)
- ltq_wdt_bootstatus = WDIOF_CARDRESET;
-
dev_info(&pdev->dev, "Init done\n");
return misc_register(&ltq_wdt_miscdev);
}
@@ -222,7 +284,9 @@ ltq_wdt_remove(struct platform_device *pdev)
}
static const struct of_device_id ltq_wdt_match[] = {
- { .compatible = "lantiq,wdt" },
+ { .compatible = "lantiq,wdt", .data = NULL},
+ { .compatible = "lantiq,xrx100-wdt", .data = ltq_wdt_bootstatus_xrx },
+ { .compatible = "lantiq,falcon-wdt", .data = ltq_wdt_bootstatus_falcon },
{},
};
MODULE_DEVICE_TABLE(of, ltq_wdt_match);
diff --git a/drivers/watchdog/max77620_wdt.c b/drivers/watchdog/max77620_wdt.c
index 68c41fa2be27..2c9f53eaff4f 100644
--- a/drivers/watchdog/max77620_wdt.c
+++ b/drivers/watchdog/max77620_wdt.c
@@ -201,7 +201,7 @@ static int max77620_wdt_remove(struct platform_device *pdev)
return 0;
}
-static struct platform_device_id max77620_wdt_devtype[] = {
+static const struct platform_device_id max77620_wdt_devtype[] = {
{ .name = "max77620-watchdog", },
{ },
};
diff --git a/drivers/watchdog/mei_wdt.c b/drivers/watchdog/mei_wdt.c
index b29c6fde7473..ea60b29494fb 100644
--- a/drivers/watchdog/mei_wdt.c
+++ b/drivers/watchdog/mei_wdt.c
@@ -670,7 +670,7 @@ static int mei_wdt_remove(struct mei_cl_device *cldev)
#define MEI_UUID_WD UUID_LE(0x05B79A6F, 0x4628, 0x4D7F, \
0x89, 0x9D, 0xA9, 0x15, 0x14, 0xCB, 0x32, 0xAB)
-static struct mei_cl_device_id mei_wdt_tbl[] = {
+static const struct mei_cl_device_id mei_wdt_tbl[] = {
{ .uuid = MEI_UUID_WD, .version = MEI_CL_VERSION_ANY },
/* required last entry */
{ }
diff --git a/drivers/watchdog/meson_wdt.c b/drivers/watchdog/meson_wdt.c
index 491b9bf13d84..304274c67735 100644
--- a/drivers/watchdog/meson_wdt.c
+++ b/drivers/watchdog/meson_wdt.c
@@ -155,7 +155,9 @@ static const struct watchdog_ops meson_wdt_ops = {
static const struct of_device_id meson_wdt_dt_ids[] = {
{ .compatible = "amlogic,meson6-wdt", .data = &meson6_wdt_data },
+ { .compatible = "amlogic,meson8-wdt", .data = &meson6_wdt_data },
{ .compatible = "amlogic,meson8b-wdt", .data = &meson8b_wdt_data },
+ { .compatible = "amlogic,meson8m2-wdt", .data = &meson8b_wdt_data },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, meson_wdt_dt_ids);
diff --git a/drivers/watchdog/mt7621_wdt.c b/drivers/watchdog/mt7621_wdt.c
index 48a06067075d..db38f8017218 100644
--- a/drivers/watchdog/mt7621_wdt.c
+++ b/drivers/watchdog/mt7621_wdt.c
@@ -105,7 +105,7 @@ static int mt7621_wdt_bootcause(void)
return 0;
}
-static struct watchdog_info mt7621_wdt_info = {
+static const struct watchdog_info mt7621_wdt_info = {
.identity = "Mediatek Watchdog",
.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
};
@@ -135,7 +135,7 @@ static int mt7621_wdt_probe(struct platform_device *pdev)
if (IS_ERR(mt7621_wdt_base))
return PTR_ERR(mt7621_wdt_base);
- mt7621_wdt_reset = devm_reset_control_get(&pdev->dev, NULL);
+ mt7621_wdt_reset = devm_reset_control_get_exclusive(&pdev->dev, NULL);
if (!IS_ERR(mt7621_wdt_reset))
reset_control_deassert(mt7621_wdt_reset);
diff --git a/drivers/watchdog/octeon-wdt-main.c b/drivers/watchdog/octeon-wdt-main.c
index b5cdceb36cff..0ec419a3f7ed 100644
--- a/drivers/watchdog/octeon-wdt-main.c
+++ b/drivers/watchdog/octeon-wdt-main.c
@@ -1,7 +1,7 @@
/*
* Octeon Watchdog driver
*
- * Copyright (C) 2007, 2008, 2009, 2010 Cavium Networks
+ * Copyright (C) 2007-2017 Cavium, Inc.
*
* Converted to use WATCHDOG_CORE by Aaro Koskinen <[email protected]>.
*
@@ -59,20 +59,23 @@
#include <linux/interrupt.h>
#include <linux/watchdog.h>
#include <linux/cpumask.h>
-#include <linux/bitops.h>
-#include <linux/kernel.h>
#include <linux/module.h>
-#include <linux/string.h>
#include <linux/delay.h>
#include <linux/cpu.h>
-#include <linux/smp.h>
-#include <linux/fs.h>
#include <linux/irq.h>
#include <asm/mipsregs.h>
#include <asm/uasm.h>
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-boot-vector.h>
+#include <asm/octeon/cvmx-ciu2-defs.h>
+#include <asm/octeon/cvmx-rst-defs.h>
+
+/* Watchdog interrupt major block number (8 MSBs of intsn) */
+#define WD_BLOCK_NUMBER 0x01
+
+static int divisor;
/* The count needed to achieve timeout_sec. */
static unsigned int timeout_cnt;
@@ -84,7 +87,7 @@ static unsigned int max_timeout_sec;
static unsigned int timeout_sec;
/* Set to non-zero when userspace countdown mode active */
-static int do_coundown;
+static bool do_countdown;
static unsigned int countdown_reset;
static unsigned int per_cpu_countdown[NR_CPUS];
@@ -92,152 +95,38 @@ static cpumask_t irq_enabled_cpus;
#define WD_TIMO 60 /* Default heartbeat = 60 seconds */
+#define CVMX_GSERX_SCRATCH(offset) (CVMX_ADD_IO_SEG(0x0001180090000020ull) + ((offset) & 15) * 0x1000000ull)
+
static int heartbeat = WD_TIMO;
-module_param(heartbeat, int, S_IRUGO);
+module_param(heartbeat, int, 0444);
MODULE_PARM_DESC(heartbeat,
"Watchdog heartbeat in seconds. (0 < heartbeat, default="
__MODULE_STRING(WD_TIMO) ")");
static bool nowayout = WATCHDOG_NOWAYOUT;
-module_param(nowayout, bool, S_IRUGO);
+module_param(nowayout, bool, 0444);
MODULE_PARM_DESC(nowayout,
"Watchdog cannot be stopped once started (default="
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
-static u32 nmi_stage1_insns[64] __initdata;
-/* We need one branch and therefore one relocation per target label. */
-static struct uasm_label labels[5] __initdata;
-static struct uasm_reloc relocs[5] __initdata;
-
-enum lable_id {
- label_enter_bootloader = 1
-};
+static int disable;
+module_param(disable, int, 0444);
+MODULE_PARM_DESC(disable,
+ "Disable the watchdog entirely (default=0)");
-/* Some CP0 registers */
-#define K0 26
-#define C0_CVMMEMCTL 11, 7
-#define C0_STATUS 12, 0
-#define C0_EBASE 15, 1
-#define C0_DESAVE 31, 0
+static struct cvmx_boot_vector_element *octeon_wdt_bootvector;
void octeon_wdt_nmi_stage2(void);
-static void __init octeon_wdt_build_stage1(void)
-{
- int i;
- int len;
- u32 *p = nmi_stage1_insns;
-#ifdef CONFIG_HOTPLUG_CPU
- struct uasm_label *l = labels;
- struct uasm_reloc *r = relocs;
-#endif
-
- /*
- * For the next few instructions running the debugger may
- * cause corruption of k0 in the saved registers. Since we're
- * about to crash, nobody probably cares.
- *
- * Save K0 into the debug scratch register
- */
- uasm_i_dmtc0(&p, K0, C0_DESAVE);
-
- uasm_i_mfc0(&p, K0, C0_STATUS);
-#ifdef CONFIG_HOTPLUG_CPU
- if (octeon_bootloader_entry_addr)
- uasm_il_bbit0(&p, &r, K0, ilog2(ST0_NMI),
- label_enter_bootloader);
-#endif
- /* Force 64-bit addressing enabled */
- uasm_i_ori(&p, K0, K0, ST0_UX | ST0_SX | ST0_KX);
- uasm_i_mtc0(&p, K0, C0_STATUS);
-
-#ifdef CONFIG_HOTPLUG_CPU
- if (octeon_bootloader_entry_addr) {
- uasm_i_mfc0(&p, K0, C0_EBASE);
- /* Coreid number in K0 */
- uasm_i_andi(&p, K0, K0, 0xf);
- /* 8 * coreid in bits 16-31 */
- uasm_i_dsll_safe(&p, K0, K0, 3 + 16);
- uasm_i_ori(&p, K0, K0, 0x8001);
- uasm_i_dsll_safe(&p, K0, K0, 16);
- uasm_i_ori(&p, K0, K0, 0x0700);
- uasm_i_drotr_safe(&p, K0, K0, 32);
- /*
- * Should result in: 0x8001,0700,0000,8*coreid which is
- * CVMX_CIU_WDOGX(coreid) - 0x0500
- *
- * Now ld K0, CVMX_CIU_WDOGX(coreid)
- */
- uasm_i_ld(&p, K0, 0x500, K0);
- /*
- * If bit one set handle the NMI as a watchdog event.
- * otherwise transfer control to bootloader.
- */
- uasm_il_bbit0(&p, &r, K0, 1, label_enter_bootloader);
- uasm_i_nop(&p);
- }
-#endif
-
- /* Clear Dcache so cvmseg works right. */
- uasm_i_cache(&p, 1, 0, 0);
-
- /* Use K0 to do a read/modify/write of CVMMEMCTL */
- uasm_i_dmfc0(&p, K0, C0_CVMMEMCTL);
- /* Clear out the size of CVMSEG */
- uasm_i_dins(&p, K0, 0, 0, 6);
- /* Set CVMSEG to its largest value */
- uasm_i_ori(&p, K0, K0, 0x1c0 | 54);
- /* Store the CVMMEMCTL value */
- uasm_i_dmtc0(&p, K0, C0_CVMMEMCTL);
-
- /* Load the address of the second stage handler */
- UASM_i_LA(&p, K0, (long)octeon_wdt_nmi_stage2);
- uasm_i_jr(&p, K0);
- uasm_i_dmfc0(&p, K0, C0_DESAVE);
-
-#ifdef CONFIG_HOTPLUG_CPU
- if (octeon_bootloader_entry_addr) {
- uasm_build_label(&l, p, label_enter_bootloader);
- /* Jump to the bootloader and restore K0 */
- UASM_i_LA(&p, K0, (long)octeon_bootloader_entry_addr);
- uasm_i_jr(&p, K0);
- uasm_i_dmfc0(&p, K0, C0_DESAVE);
- }
-#endif
- uasm_resolve_relocs(relocs, labels);
-
- len = (int)(p - nmi_stage1_insns);
- pr_debug("Synthesized NMI stage 1 handler (%d instructions)\n", len);
-
- pr_debug("\t.set push\n");
- pr_debug("\t.set noreorder\n");
- for (i = 0; i < len; i++)
- pr_debug("\t.word 0x%08x\n", nmi_stage1_insns[i]);
- pr_debug("\t.set pop\n");
-
- if (len > 32)
- panic("NMI stage 1 handler exceeds 32 instructions, was %d\n",
- len);
-}
-
static int cpu2core(int cpu)
{
#ifdef CONFIG_SMP
- return cpu_logical_map(cpu);
+ return cpu_logical_map(cpu) & 0x3f;
#else
return cvmx_get_core_num();
#endif
}
-static int core2cpu(int coreid)
-{
-#ifdef CONFIG_SMP
- return cpu_number_map(coreid);
-#else
- return 0;
-#endif
-}
-
/**
* Poke the watchdog when an interrupt is received
*
@@ -248,13 +137,14 @@ static int core2cpu(int coreid)
*/
static irqreturn_t octeon_wdt_poke_irq(int cpl, void *dev_id)
{
- unsigned int core = cvmx_get_core_num();
- int cpu = core2cpu(core);
+ int cpu = raw_smp_processor_id();
+ unsigned int core = cpu2core(cpu);
+ int node = cpu_to_node(cpu);
- if (do_coundown) {
+ if (do_countdown) {
if (per_cpu_countdown[cpu] > 0) {
/* We're alive, poke the watchdog */
- cvmx_write_csr(CVMX_CIU_PP_POKEX(core), 1);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(core), 1);
per_cpu_countdown[cpu]--;
} else {
/* Bad news, you are about to reboot. */
@@ -263,7 +153,7 @@ static irqreturn_t octeon_wdt_poke_irq(int cpl, void *dev_id)
}
} else {
/* Not open, just ping away... */
- cvmx_write_csr(CVMX_CIU_PP_POKEX(core), 1);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(core), 1);
}
return IRQ_HANDLED;
}
@@ -338,10 +228,10 @@ void octeon_wdt_nmi_stage3(u64 reg[32])
u64 cp0_epc = read_c0_epc();
/* Delay so output from all cores output is not jumbled together. */
- __delay(100000000ull * coreid);
+ udelay(85000 * coreid);
octeon_wdt_write_string("\r\n*** NMI Watchdog interrupt on Core 0x");
- octeon_wdt_write_hex(coreid, 1);
+ octeon_wdt_write_hex(coreid, 2);
octeon_wdt_write_string(" ***\r\n");
for (i = 0; i < 32; i++) {
octeon_wdt_write_string("\t");
@@ -364,33 +254,98 @@ void octeon_wdt_nmi_stage3(u64 reg[32])
octeon_wdt_write_hex(cp0_cause, 16);
octeon_wdt_write_string("\r\n");
- octeon_wdt_write_string("\tsum0\t0x");
- octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU_INTX_SUM0(coreid * 2)), 16);
- octeon_wdt_write_string("\ten0\t0x");
- octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU_INTX_EN0(coreid * 2)), 16);
- octeon_wdt_write_string("\r\n");
+ /* The CIU register is different for each Octeon model. */
+ if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+ octeon_wdt_write_string("\tsrc_wd\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU2_SRC_PPX_IP2_WDOG(coreid)), 16);
+ octeon_wdt_write_string("\ten_wd\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU2_EN_PPX_IP2_WDOG(coreid)), 16);
+ octeon_wdt_write_string("\r\n");
+ octeon_wdt_write_string("\tsrc_rml\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU2_SRC_PPX_IP2_RML(coreid)), 16);
+ octeon_wdt_write_string("\ten_rml\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU2_EN_PPX_IP2_RML(coreid)), 16);
+ octeon_wdt_write_string("\r\n");
+ octeon_wdt_write_string("\tsum\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU2_SUM_PPX_IP2(coreid)), 16);
+ octeon_wdt_write_string("\r\n");
+ } else if (!octeon_has_feature(OCTEON_FEATURE_CIU3)) {
+ octeon_wdt_write_string("\tsum0\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU_INTX_SUM0(coreid * 2)), 16);
+ octeon_wdt_write_string("\ten0\t0x");
+ octeon_wdt_write_hex(cvmx_read_csr(CVMX_CIU_INTX_EN0(coreid * 2)), 16);
+ octeon_wdt_write_string("\r\n");
+ }
octeon_wdt_write_string("*** Chip soft reset soon ***\r\n");
+
+ /*
+ * G-30204: We must trigger a soft reset before watchdog
+ * does an incomplete job of doing it.
+ */
+ if (OCTEON_IS_OCTEON3() && !OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+ u64 scr;
+ unsigned int node = cvmx_get_node_num();
+ unsigned int lcore = cvmx_get_local_core_num();
+ union cvmx_ciu_wdogx ciu_wdog;
+
+ /*
+ * Wait for other cores to print out information, but
+ * not too long. Do the soft reset before watchdog
+ * can trigger it.
+ */
+ do {
+ ciu_wdog.u64 = cvmx_read_csr_node(node, CVMX_CIU_WDOGX(lcore));
+ } while (ciu_wdog.s.cnt > 0x10000);
+
+ scr = cvmx_read_csr_node(0, CVMX_GSERX_SCRATCH(0));
+ scr |= 1 << 11; /* Indicate watchdog in bit 11 */
+ cvmx_write_csr_node(0, CVMX_GSERX_SCRATCH(0), scr);
+ cvmx_write_csr_node(0, CVMX_RST_SOFT_RST, 1);
+ }
+}
+
+static int octeon_wdt_cpu_to_irq(int cpu)
+{
+ unsigned int coreid;
+ int node;
+ int irq;
+
+ coreid = cpu2core(cpu);
+ node = cpu_to_node(cpu);
+
+ if (octeon_has_feature(OCTEON_FEATURE_CIU3)) {
+ struct irq_domain *domain;
+ int hwirq;
+
+ domain = octeon_irq_get_block_domain(node,
+ WD_BLOCK_NUMBER);
+ hwirq = WD_BLOCK_NUMBER << 12 | 0x200 | coreid;
+ irq = irq_find_mapping(domain, hwirq);
+ } else {
+ irq = OCTEON_IRQ_WDOG0 + coreid;
+ }
+ return irq;
}
static int octeon_wdt_cpu_pre_down(unsigned int cpu)
{
unsigned int core;
- unsigned int irq;
+ int node;
union cvmx_ciu_wdogx ciu_wdog;
core = cpu2core(cpu);
- irq = OCTEON_IRQ_WDOG0 + core;
+ node = cpu_to_node(cpu);
/* Poke the watchdog to clear out its state */
- cvmx_write_csr(CVMX_CIU_PP_POKEX(core), 1);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(core), 1);
/* Disable the hardware. */
ciu_wdog.u64 = 0;
- cvmx_write_csr(CVMX_CIU_WDOGX(core), ciu_wdog.u64);
+ cvmx_write_csr_node(node, CVMX_CIU_WDOGX(core), ciu_wdog.u64);
- free_irq(irq, octeon_wdt_poke_irq);
+ free_irq(octeon_wdt_cpu_to_irq(cpu), octeon_wdt_poke_irq);
return 0;
}
@@ -399,31 +354,56 @@ static int octeon_wdt_cpu_online(unsigned int cpu)
unsigned int core;
unsigned int irq;
union cvmx_ciu_wdogx ciu_wdog;
+ int node;
+ struct irq_domain *domain;
+ int hwirq;
core = cpu2core(cpu);
+ node = cpu_to_node(cpu);
+
+ octeon_wdt_bootvector[core].target_ptr = (u64)octeon_wdt_nmi_stage2;
/* Disable it before doing anything with the interrupts. */
ciu_wdog.u64 = 0;
- cvmx_write_csr(CVMX_CIU_WDOGX(core), ciu_wdog.u64);
+ cvmx_write_csr_node(node, CVMX_CIU_WDOGX(core), ciu_wdog.u64);
per_cpu_countdown[cpu] = countdown_reset;
- irq = OCTEON_IRQ_WDOG0 + core;
+ if (octeon_has_feature(OCTEON_FEATURE_CIU3)) {
+ /* Must get the domain for the watchdog block */
+ domain = octeon_irq_get_block_domain(node, WD_BLOCK_NUMBER);
+
+ /* Get a irq for the wd intsn (hardware interrupt) */
+ hwirq = WD_BLOCK_NUMBER << 12 | 0x200 | core;
+ irq = irq_create_mapping(domain, hwirq);
+ irqd_set_trigger_type(irq_get_irq_data(irq),
+ IRQ_TYPE_EDGE_RISING);
+ } else
+ irq = OCTEON_IRQ_WDOG0 + core;
if (request_irq(irq, octeon_wdt_poke_irq,
IRQF_NO_THREAD, "octeon_wdt", octeon_wdt_poke_irq))
panic("octeon_wdt: Couldn't obtain irq %d", irq);
+ /* Must set the irq affinity here */
+ if (octeon_has_feature(OCTEON_FEATURE_CIU3)) {
+ cpumask_t mask;
+
+ cpumask_clear(&mask);
+ cpumask_set_cpu(cpu, &mask);
+ irq_set_affinity(irq, &mask);
+ }
+
cpumask_set_cpu(cpu, &irq_enabled_cpus);
/* Poke the watchdog to clear out its state */
- cvmx_write_csr(CVMX_CIU_PP_POKEX(core), 1);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(core), 1);
/* Finally enable the watchdog now that all handlers are installed */
ciu_wdog.u64 = 0;
ciu_wdog.s.len = timeout_cnt;
ciu_wdog.s.mode = 3; /* 3 = Interrupt + NMI + Soft-Reset */
- cvmx_write_csr(CVMX_CIU_WDOGX(core), ciu_wdog.u64);
+ cvmx_write_csr_node(node, CVMX_CIU_WDOGX(core), ciu_wdog.u64);
return 0;
}
@@ -432,17 +412,20 @@ static int octeon_wdt_ping(struct watchdog_device __always_unused *wdog)
{
int cpu;
int coreid;
+ int node;
+
+ if (disable)
+ return 0;
for_each_online_cpu(cpu) {
coreid = cpu2core(cpu);
- cvmx_write_csr(CVMX_CIU_PP_POKEX(coreid), 1);
+ node = cpu_to_node(cpu);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(coreid), 1);
per_cpu_countdown[cpu] = countdown_reset;
- if ((countdown_reset || !do_coundown) &&
+ if ((countdown_reset || !do_countdown) &&
!cpumask_test_cpu(cpu, &irq_enabled_cpus)) {
/* We have to enable the irq */
- int irq = OCTEON_IRQ_WDOG0 + coreid;
-
- enable_irq(irq);
+ enable_irq(octeon_wdt_cpu_to_irq(cpu));
cpumask_set_cpu(cpu, &irq_enabled_cpus);
}
}
@@ -472,7 +455,7 @@ static void octeon_wdt_calc_parameters(int t)
countdown_reset = periods > 2 ? periods - 2 : 0;
heartbeat = t;
- timeout_cnt = ((octeon_get_io_clock_rate() >> 8) * timeout_sec) >> 8;
+ timeout_cnt = ((octeon_get_io_clock_rate() / divisor) * timeout_sec) >> 8;
}
static int octeon_wdt_set_timeout(struct watchdog_device *wdog,
@@ -481,20 +464,25 @@ static int octeon_wdt_set_timeout(struct watchdog_device *wdog,
int cpu;
int coreid;
union cvmx_ciu_wdogx ciu_wdog;
+ int node;
if (t <= 0)
return -1;
octeon_wdt_calc_parameters(t);
+ if (disable)
+ return 0;
+
for_each_online_cpu(cpu) {
coreid = cpu2core(cpu);
- cvmx_write_csr(CVMX_CIU_PP_POKEX(coreid), 1);
+ node = cpu_to_node(cpu);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(coreid), 1);
ciu_wdog.u64 = 0;
ciu_wdog.s.len = timeout_cnt;
ciu_wdog.s.mode = 3; /* 3 = Interrupt + NMI + Soft-Reset */
- cvmx_write_csr(CVMX_CIU_WDOGX(coreid), ciu_wdog.u64);
- cvmx_write_csr(CVMX_CIU_PP_POKEX(coreid), 1);
+ cvmx_write_csr_node(node, CVMX_CIU_WDOGX(coreid), ciu_wdog.u64);
+ cvmx_write_csr_node(node, CVMX_CIU_PP_POKEX(coreid), 1);
}
octeon_wdt_ping(wdog); /* Get the irqs back on. */
return 0;
@@ -503,13 +491,13 @@ static int octeon_wdt_set_timeout(struct watchdog_device *wdog,
static int octeon_wdt_start(struct watchdog_device *wdog)
{
octeon_wdt_ping(wdog);
- do_coundown = 1;
+ do_countdown = 1;
return 0;
}
static int octeon_wdt_stop(struct watchdog_device *wdog)
{
- do_coundown = 0;
+ do_countdown = 0;
octeon_wdt_ping(wdog);
return 0;
}
@@ -540,14 +528,25 @@ static enum cpuhp_state octeon_wdt_online;
*/
static int __init octeon_wdt_init(void)
{
- int i;
int ret;
- u64 *ptr;
+
+ octeon_wdt_bootvector = cvmx_boot_vector_get();
+ if (!octeon_wdt_bootvector) {
+ pr_err("Error: Cannot allocate boot vector.\n");
+ return -ENOMEM;
+ }
+
+ if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+ divisor = 0x200;
+ else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+ divisor = 0x400;
+ else
+ divisor = 0x100;
/*
* Watchdog time expiration length = The 16 bits of LEN
* represent the most significant bits of a 24 bit decrementer
- * that decrements every 256 cycles.
+ * that decrements every divisor cycle.
*
* Try for a timeout of 5 sec, if that fails a smaller number
* of even seconds,
@@ -555,8 +554,7 @@ static int __init octeon_wdt_init(void)
max_timeout_sec = 6;
do {
max_timeout_sec--;
- timeout_cnt = ((octeon_get_io_clock_rate() >> 8) *
- max_timeout_sec) >> 8;
+ timeout_cnt = ((octeon_get_io_clock_rate() / divisor) * max_timeout_sec) >> 8;
} while (timeout_cnt > 65535);
BUG_ON(timeout_cnt == 0);
@@ -576,16 +574,10 @@ static int __init octeon_wdt_init(void)
return ret;
}
- /* Build the NMI handler ... */
- octeon_wdt_build_stage1();
-
- /* ... and install it. */
- ptr = (u64 *) nmi_stage1_insns;
- for (i = 0; i < 16; i++) {
- cvmx_write_csr(CVMX_MIO_BOOT_LOC_ADR, i * 8);
- cvmx_write_csr(CVMX_MIO_BOOT_LOC_DAT, ptr[i]);
+ if (disable) {
+ pr_notice("disabled\n");
+ return 0;
}
- cvmx_write_csr(CVMX_MIO_BOOT_LOC_CFGX(0), 0x81fc0000);
cpumask_clear(&irq_enabled_cpus);
@@ -607,6 +599,10 @@ err:
static void __exit octeon_wdt_cleanup(void)
{
watchdog_unregister_device(&octeon_wdt);
+
+ if (disable)
+ return;
+
cpuhp_remove_state(octeon_wdt_online);
/*
@@ -617,7 +613,7 @@ static void __exit octeon_wdt_cleanup(void)
}
MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Cavium Networks <[email protected]>");
-MODULE_DESCRIPTION("Cavium Networks Octeon Watchdog driver.");
+MODULE_AUTHOR("Cavium Inc. <[email protected]>");
+MODULE_DESCRIPTION("Cavium Inc. OCTEON Watchdog driver.");
module_init(octeon_wdt_init);
module_exit(octeon_wdt_cleanup);
diff --git a/drivers/watchdog/octeon-wdt-nmi.S b/drivers/watchdog/octeon-wdt-nmi.S
index 8a900a5e3233..97f6eb7b5a8e 100644
--- a/drivers/watchdog/octeon-wdt-nmi.S
+++ b/drivers/watchdog/octeon-wdt-nmi.S
@@ -3,20 +3,40 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2007 Cavium Networks
+ * Copyright (C) 2007-2017 Cavium, Inc.
*/
#include <asm/asm.h>
#include <asm/regdef.h>
-#define SAVE_REG(r) sd $r, -32768+6912-(32-r)*8($0)
+#define CVMSEG_BASE -32768
+#define CVMSEG_SIZE 6912
+#define SAVE_REG(r) sd $r, CVMSEG_BASE + CVMSEG_SIZE - ((32 - r) * 8)($0)
NESTED(octeon_wdt_nmi_stage2, 0, sp)
.set push
.set noreorder
.set noat
- /* Save all registers to the top CVMSEG. This shouldn't
+ /* Clear Dcache so cvmseg works right. */
+ cache 1,0($0)
+ /* Use K0 to do a read/modify/write of CVMMEMCTL */
+ dmfc0 k0, $11, 7
+ /* Clear out the size of CVMSEG */
+ dins k0, $0, 0, 6
+ /* Set CVMSEG to its largest value */
+ ori k0, k0, 0x1c0 | 54
+ /* Store the CVMMEMCTL value */
+ dmtc0 k0, $11, 7
+ /*
+ * Restore K0 from the debug scratch register, it was saved in
+ * the boot-vector code.
+ */
+ dmfc0 k0, $31
+
+ /*
+ * Save all registers to the top CVMSEG. This shouldn't
* corrupt any state used by the kernel. Also all registers
- * should have the value right before the NMI. */
+ * should have the value right before the NMI.
+ */
SAVE_REG(0)
SAVE_REG(1)
SAVE_REG(2)
@@ -49,16 +69,22 @@
SAVE_REG(29)
SAVE_REG(30)
SAVE_REG(31)
+ /* Write zero to all CVMSEG locations per Core-15169 */
+ dli a0, CVMSEG_SIZE - (33 * 8)
+1: sd zero, CVMSEG_BASE(a0)
+ daddiu a0, a0, -8
+ bgez a0, 1b
+ nop
/* Set the stack to begin right below the registers */
- li sp, -32768+6912-32*8
+ dli sp, CVMSEG_BASE + CVMSEG_SIZE - (32 * 8)
/* Load the address of the third stage handler */
- dla a0, octeon_wdt_nmi_stage3
+ dla $25, octeon_wdt_nmi_stage3
/* Call the third stage handler */
- jal a0
+ jal $25
/* a0 is the address of the saved registers */
move a0, sp
/* Loop forvever if we get here. */
-1: b 1b
+2: b 2b
nop
.set pop
END(octeon_wdt_nmi_stage2)
diff --git a/drivers/watchdog/of_xilinx_wdt.c b/drivers/watchdog/of_xilinx_wdt.c
index fae7fe929ea3..1cf286945b7a 100644
--- a/drivers/watchdog/of_xilinx_wdt.c
+++ b/drivers/watchdog/of_xilinx_wdt.c
@@ -51,9 +51,16 @@ struct xwdt_device {
static int xilinx_wdt_start(struct watchdog_device *wdd)
{
+ int ret;
u32 control_status_reg;
struct xwdt_device *xdev = watchdog_get_drvdata(wdd);
+ ret = clk_enable(xdev->clk);
+ if (ret) {
+ dev_err(wdd->parent, "Failed to enable clock\n");
+ return ret;
+ }
+
spin_lock(&xdev->spinlock);
/* Clean previous status and enable the watchdog timer */
@@ -85,6 +92,9 @@ static int xilinx_wdt_stop(struct watchdog_device *wdd)
iowrite32(0, xdev->base + XWT_TWCSR1_OFFSET);
spin_unlock(&xdev->spinlock);
+
+ clk_disable(xdev->clk);
+
pr_info("Stopped!\n");
return 0;
@@ -167,11 +177,6 @@ static int xwdt_probe(struct platform_device *pdev)
if (IS_ERR(xdev->base))
return PTR_ERR(xdev->base);
- rc = of_property_read_u32(pdev->dev.of_node, "clock-frequency", &pfreq);
- if (rc)
- dev_warn(&pdev->dev,
- "The watchdog clock frequency cannot be obtained\n");
-
rc = of_property_read_u32(pdev->dev.of_node, "xlnx,wdt-interval",
&xdev->wdt_interval);
if (rc)
@@ -186,6 +191,26 @@ static int xwdt_probe(struct platform_device *pdev)
watchdog_set_nowayout(xilinx_wdt_wdd, enable_once);
+ xdev->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(xdev->clk)) {
+ if (PTR_ERR(xdev->clk) != -ENOENT)
+ return PTR_ERR(xdev->clk);
+
+ /*
+ * Clock framework support is optional, continue on
+ * anyways if we don't find a matching clock.
+ */
+ xdev->clk = NULL;
+
+ rc = of_property_read_u32(pdev->dev.of_node, "clock-frequency",
+ &pfreq);
+ if (rc)
+ dev_warn(&pdev->dev,
+ "The watchdog clock freq cannot be obtained\n");
+ } else {
+ pfreq = clk_get_rate(xdev->clk);
+ }
+
/*
* Twice of the 2^wdt_interval / freq because the first wdt overflow is
* ignored (interrupt), reset is only generated at second wdt overflow
@@ -197,14 +222,6 @@ static int xwdt_probe(struct platform_device *pdev)
spin_lock_init(&xdev->spinlock);
watchdog_set_drvdata(xilinx_wdt_wdd, xdev);
- xdev->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(xdev->clk)) {
- if (PTR_ERR(xdev->clk) == -ENOENT)
- xdev->clk = NULL;
- else
- return PTR_ERR(xdev->clk);
- }
-
rc = clk_prepare_enable(xdev->clk);
if (rc) {
dev_err(&pdev->dev, "unable to enable clock\n");
@@ -223,6 +240,8 @@ static int xwdt_probe(struct platform_device *pdev)
goto err_clk_disable;
}
+ clk_disable(xdev->clk);
+
dev_info(&pdev->dev, "Xilinx Watchdog Timer at %p with timeout %ds\n",
xdev->base, xilinx_wdt_wdd->timeout);
@@ -245,6 +264,43 @@ static int xwdt_remove(struct platform_device *pdev)
return 0;
}
+/**
+ * xwdt_suspend - Suspend the device.
+ *
+ * @dev: handle to the device structure.
+ * Return: 0 always.
+ */
+static int __maybe_unused xwdt_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct xwdt_device *xdev = platform_get_drvdata(pdev);
+
+ if (watchdog_active(&xdev->xilinx_wdt_wdd))
+ xilinx_wdt_stop(&xdev->xilinx_wdt_wdd);
+
+ return 0;
+}
+
+/**
+ * xwdt_resume - Resume the device.
+ *
+ * @dev: handle to the device structure.
+ * Return: 0 on success, errno otherwise.
+ */
+static int __maybe_unused xwdt_resume(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct xwdt_device *xdev = platform_get_drvdata(pdev);
+ int ret = 0;
+
+ if (watchdog_active(&xdev->xilinx_wdt_wdd))
+ ret = xilinx_wdt_start(&xdev->xilinx_wdt_wdd);
+
+ return ret;
+}
+
+static SIMPLE_DEV_PM_OPS(xwdt_pm_ops, xwdt_suspend, xwdt_resume);
+
/* Match table for of_platform binding */
static const struct of_device_id xwdt_of_match[] = {
{ .compatible = "xlnx,xps-timebase-wdt-1.00.a", },
@@ -259,6 +315,7 @@ static struct platform_driver xwdt_driver = {
.driver = {
.name = WATCHDOG_NAME,
.of_match_table = xwdt_of_match,
+ .pm = &xwdt_pm_ops,
},
};
diff --git a/drivers/watchdog/pcwd_usb.c b/drivers/watchdog/pcwd_usb.c
index 5615f4013924..b9e376c8e2e3 100644
--- a/drivers/watchdog/pcwd_usb.c
+++ b/drivers/watchdog/pcwd_usb.c
@@ -74,7 +74,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
#define USB_PCWD_PRODUCT_ID 0x1140
/* table of devices that work with this driver */
-static struct usb_device_id usb_pcwd_table[] = {
+static const struct usb_device_id usb_pcwd_table[] = {
{ USB_DEVICE(USB_PCWD_VENDOR_ID, USB_PCWD_PRODUCT_ID) },
{ } /* Terminating entry */
};
diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
index 4f47b5e90956..780971318810 100644
--- a/drivers/watchdog/qcom-wdt.c
+++ b/drivers/watchdog/qcom-wdt.c
@@ -162,6 +162,8 @@ static int qcom_wdt_probe(struct platform_device *pdev)
return -ENOMEM;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENOMEM;
/* We use CPU0's DGT for the watchdog */
if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c
index cf61c92f7ecd..831ef83f6de1 100644
--- a/drivers/watchdog/renesas_wdt.c
+++ b/drivers/watchdog/renesas_wdt.c
@@ -1,8 +1,8 @@
/*
* Watchdog driver for Renesas WDT watchdog
*
- * Copyright (C) 2015-16 Wolfram Sang, Sang Engineering <[email protected]>
- * Copyright (C) 2015-16 Renesas Electronics Corporation
+ * Copyright (C) 2015-17 Wolfram Sang, Sang Engineering <[email protected]>
+ * Copyright (C) 2015-17 Renesas Electronics Corporation
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
@@ -23,10 +23,22 @@
#define RWTCSRA_WOVF BIT(4)
#define RWTCSRA_WRFLG BIT(5)
#define RWTCSRA_TME BIT(7)
+#define RWTCSRB 8
#define RWDT_DEFAULT_TIMEOUT 60U
-static const unsigned int clk_divs[] = { 1, 4, 16, 32, 64, 128, 1024 };
+/*
+ * In probe, clk_rate is checked to be not more than 16 bit * biggest clock
+ * divider (12 bits). d is only a factor to fully utilize the WDT counter and
+ * will not exceed its 16 bits. Thus, no overflow, we stay below 32 bits.
+ */
+#define MUL_BY_CLKS_PER_SEC(p, d) \
+ DIV_ROUND_UP((d) * (p)->clk_rate, clk_divs[(p)->cks])
+
+/* d is 16 bit, clk_divs 12 bit -> no 32 bit overflow */
+#define DIV_BY_CLKS_PER_SEC(p, d) ((d) * clk_divs[(p)->cks] / (p)->clk_rate)
+
+static const unsigned int clk_divs[] = { 1, 4, 16, 32, 64, 128, 1024, 4096 };
static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
@@ -36,8 +48,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
struct rwdt_priv {
void __iomem *base;
struct watchdog_device wdev;
- struct clk *clk;
- unsigned int clks_per_sec;
+ unsigned long clk_rate;
u8 cks;
};
@@ -55,7 +66,7 @@ static int rwdt_init_timeout(struct watchdog_device *wdev)
{
struct rwdt_priv *priv = watchdog_get_drvdata(wdev);
- rwdt_write(priv, 65536 - wdev->timeout * priv->clks_per_sec, RWTCNT);
+ rwdt_write(priv, 65536 - MUL_BY_CLKS_PER_SEC(priv, wdev->timeout), RWTCNT);
return 0;
}
@@ -64,8 +75,9 @@ static int rwdt_start(struct watchdog_device *wdev)
{
struct rwdt_priv *priv = watchdog_get_drvdata(wdev);
- clk_prepare_enable(priv->clk);
+ pm_runtime_get_sync(wdev->parent);
+ rwdt_write(priv, 0, RWTCSRB);
rwdt_write(priv, priv->cks, RWTCSRA);
rwdt_init_timeout(wdev);
@@ -82,7 +94,7 @@ static int rwdt_stop(struct watchdog_device *wdev)
struct rwdt_priv *priv = watchdog_get_drvdata(wdev);
rwdt_write(priv, priv->cks, RWTCSRA);
- clk_disable_unprepare(priv->clk);
+ pm_runtime_put(wdev->parent);
return 0;
}
@@ -92,7 +104,7 @@ static unsigned int rwdt_get_timeleft(struct watchdog_device *wdev)
struct rwdt_priv *priv = watchdog_get_drvdata(wdev);
u16 val = readw_relaxed(priv->base + RWTCNT);
- return DIV_ROUND_CLOSEST(65536 - val, priv->clks_per_sec);
+ return DIV_BY_CLKS_PER_SEC(priv, 65536 - val);
}
static const struct watchdog_info rwdt_ident = {
@@ -112,8 +124,8 @@ static int rwdt_probe(struct platform_device *pdev)
{
struct rwdt_priv *priv;
struct resource *res;
- unsigned long rate;
- unsigned int clks_per_sec;
+ struct clk *clk;
+ unsigned long clks_per_sec;
int ret, i;
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
@@ -125,36 +137,40 @@ static int rwdt_probe(struct platform_device *pdev)
if (IS_ERR(priv->base))
return PTR_ERR(priv->base);
- priv->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(priv->clk))
- return PTR_ERR(priv->clk);
+ clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+ pm_runtime_enable(&pdev->dev);
- rate = clk_get_rate(priv->clk);
- if (!rate)
- return -ENOENT;
+ pm_runtime_get_sync(&pdev->dev);
+ priv->clk_rate = clk_get_rate(clk);
+ pm_runtime_put(&pdev->dev);
+
+ if (!priv->clk_rate) {
+ ret = -ENOENT;
+ goto out_pm_disable;
+ }
for (i = ARRAY_SIZE(clk_divs) - 1; i >= 0; i--) {
- clks_per_sec = DIV_ROUND_UP(rate, clk_divs[i]);
- if (clks_per_sec) {
- priv->clks_per_sec = clks_per_sec;
+ clks_per_sec = priv->clk_rate / clk_divs[i];
+ if (clks_per_sec && clks_per_sec < 65536) {
priv->cks = i;
break;
}
}
- if (!clks_per_sec) {
+ if (i < 0) {
dev_err(&pdev->dev, "Can't find suitable clock divider\n");
- return -ERANGE;
+ ret = -ERANGE;
+ goto out_pm_disable;
}
- pm_runtime_enable(&pdev->dev);
- pm_runtime_get_sync(&pdev->dev);
-
priv->wdev.info = &rwdt_ident,
priv->wdev.ops = &rwdt_ops,
priv->wdev.parent = &pdev->dev;
priv->wdev.min_timeout = 1;
- priv->wdev.max_timeout = 65536 / clks_per_sec;
+ priv->wdev.max_timeout = DIV_BY_CLKS_PER_SEC(priv, 65536);
priv->wdev.timeout = min(priv->wdev.max_timeout, RWDT_DEFAULT_TIMEOUT);
platform_set_drvdata(pdev, priv);
@@ -167,13 +183,14 @@ static int rwdt_probe(struct platform_device *pdev)
dev_warn(&pdev->dev, "Specified timeout value invalid, using default\n");
ret = watchdog_register_device(&priv->wdev);
- if (ret < 0) {
- pm_runtime_put(&pdev->dev);
- pm_runtime_disable(&pdev->dev);
- return ret;
- }
+ if (ret < 0)
+ goto out_pm_disable;
return 0;
+
+ out_pm_disable:
+ pm_runtime_disable(&pdev->dev);
+ return ret;
}
static int rwdt_remove(struct platform_device *pdev)
@@ -181,7 +198,6 @@ static int rwdt_remove(struct platform_device *pdev)
struct rwdt_priv *priv = platform_get_drvdata(pdev);
watchdog_unregister_device(&priv->wdev);
- pm_runtime_put(&pdev->dev);
pm_runtime_disable(&pdev->dev);
return 0;
diff --git a/drivers/watchdog/rt2880_wdt.c b/drivers/watchdog/rt2880_wdt.c
index 05524baf7dcc..98967f0a7d10 100644
--- a/drivers/watchdog/rt2880_wdt.c
+++ b/drivers/watchdog/rt2880_wdt.c
@@ -119,7 +119,7 @@ static int rt288x_wdt_bootcause(void)
return 0;
}
-static struct watchdog_info rt288x_wdt_info = {
+static const struct watchdog_info rt288x_wdt_info = {
.identity = "Ralink Watchdog",
.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
};
@@ -152,7 +152,7 @@ static int rt288x_wdt_probe(struct platform_device *pdev)
if (IS_ERR(rt288x_wdt_clk))
return PTR_ERR(rt288x_wdt_clk);
- rt288x_wdt_reset = devm_reset_control_get(&pdev->dev, NULL);
+ rt288x_wdt_reset = devm_reset_control_get_exclusive(&pdev->dev, NULL);
if (!IS_ERR(rt288x_wdt_reset))
reset_control_deassert(rt288x_wdt_reset);
diff --git a/drivers/watchdog/sc1200wdt.c b/drivers/watchdog/sc1200wdt.c
index b34d3d5ba632..8e4e2fc13f87 100644
--- a/drivers/watchdog/sc1200wdt.c
+++ b/drivers/watchdog/sc1200wdt.c
@@ -342,7 +342,7 @@ static int __init sc1200wdt_probe(void)
#if defined CONFIG_PNP
-static struct pnp_device_id scl200wdt_pnp_devices[] = {
+static const struct pnp_device_id scl200wdt_pnp_devices[] = {
/* National Semiconductor PC87307/PC97307 watchdog component */
{.id = "NSC0800", .driver_data = 0},
{.id = ""},
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index e7a715e82021..03805bc5d67a 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -281,7 +281,7 @@ static int __maybe_unused sp805_wdt_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(sp805_wdt_dev_pm_ops, sp805_wdt_suspend,
sp805_wdt_resume);
-static struct amba_id sp805_wdt_ids[] = {
+static const struct amba_id sp805_wdt_ids[] = {
{
.id = 0x00141805,
.mask = 0x00ffffff,
diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c
index 6c501b7dba29..be64a8699de3 100644
--- a/drivers/watchdog/stm32_iwdg.c
+++ b/drivers/watchdog/stm32_iwdg.c
@@ -140,7 +140,7 @@ static const struct watchdog_info stm32_iwdg_info = {
.identity = "STM32 Independent Watchdog",
};
-static struct watchdog_ops stm32_iwdg_ops = {
+static const struct watchdog_ops stm32_iwdg_ops = {
.owner = THIS_MODULE,
.start = stm32_iwdg_start,
.ping = stm32_iwdg_ping,
diff --git a/drivers/watchdog/ts72xx_wdt.c b/drivers/watchdog/ts72xx_wdt.c
index 17c25daebcce..811e43c39ec4 100644
--- a/drivers/watchdog/ts72xx_wdt.c
+++ b/drivers/watchdog/ts72xx_wdt.c
@@ -112,7 +112,7 @@ static const struct watchdog_info ts72xx_wdt_ident = {
.identity = "TS-72XX WDT",
};
-static struct watchdog_ops ts72xx_wdt_ops = {
+static const struct watchdog_ops ts72xx_wdt_ops = {
.owner = THIS_MODULE,
.start = ts72xx_wdt_start,
.stop = ts72xx_wdt_stop,
diff --git a/drivers/watchdog/w83627hf_wdt.c b/drivers/watchdog/w83627hf_wdt.c
index d9ba0496713c..7817836bff55 100644
--- a/drivers/watchdog/w83627hf_wdt.c
+++ b/drivers/watchdog/w83627hf_wdt.c
@@ -429,7 +429,7 @@ static int __init wdt_init(void)
{
int ret;
int chip;
- const char * const chip_name[] = {
+ static const char * const chip_name[] = {
"W83627HF",
"W83627S",
"W83697HF",
diff --git a/drivers/watchdog/ziirave_wdt.c b/drivers/watchdog/ziirave_wdt.c
index b4e0cea5a64e..d3594aa3a374 100644
--- a/drivers/watchdog/ziirave_wdt.c
+++ b/drivers/watchdog/ziirave_wdt.c
@@ -737,7 +737,7 @@ static int ziirave_wdt_remove(struct i2c_client *client)
return 0;
}
-static struct i2c_device_id ziirave_wdt_id[] = {
+static const struct i2c_device_id ziirave_wdt_id[] = {
{ "rave-wdt", 0 },
{ }
};
diff --git a/drivers/watchdog/zx2967_wdt.c b/drivers/watchdog/zx2967_wdt.c
index 69ec5855584b..9261f7c77f6d 100644
--- a/drivers/watchdog/zx2967_wdt.c
+++ b/drivers/watchdog/zx2967_wdt.c
@@ -229,7 +229,7 @@ static int zx2967_wdt_probe(struct platform_device *pdev)
}
clk_set_rate(wdt->clock, ZX2967_WDT_CLK_FREQ);
- rstc = devm_reset_control_get(dev, NULL);
+ rstc = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(rstc)) {
dev_err(dev, "failed to get rstc");
ret = PTR_ERR(rstc);
diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 1bf55a32a4b3..3fa40c723e8e 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -294,7 +294,7 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
goto out;
}
- gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_TEMPORARY);
+ gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_KERNEL);
if (!gref_ids) {
rc = -ENOMEM;
goto out;
diff --git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c
index 5fbfd9cfb6d6..5b3d57fc82d3 100644
--- a/drivers/xen/xen-pciback/conf_space_header.c
+++ b/drivers/xen/xen-pciback/conf_space_header.c
@@ -169,6 +169,9 @@ static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data)
static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
{
struct pci_bar_info *bar = data;
+ unsigned int pos = (offset - PCI_BASE_ADDRESS_0) / 4;
+ const struct resource *res = dev->resource;
+ u32 mask;
if (unlikely(!bar)) {
pr_warn(DRV_NAME ": driver data not found for %s\n",
@@ -179,7 +182,13 @@ static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
/* A write to obtain the length must happen as a 32-bit write.
* This does not (yet) support writing individual bytes
*/
- if (value == ~0)
+ if (res[pos].flags & IORESOURCE_IO)
+ mask = ~PCI_BASE_ADDRESS_IO_MASK;
+ else if (pos && (res[pos - 1].flags & IORESOURCE_MEM_64))
+ mask = 0;
+ else
+ mask = ~PCI_BASE_ADDRESS_MEM_MASK;
+ if ((value | mask) == ~0U)
bar->which = 1;
else {
u32 tmpval;
diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 82a8866758ee..a1c17000129b 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -519,64 +519,6 @@ static int __xenbus_map_ring(struct xenbus_device *dev,
return err;
}
-static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
- grant_ref_t *gnt_refs,
- unsigned int nr_grefs,
- void **vaddr)
-{
- struct xenbus_map_node *node;
- struct vm_struct *area;
- pte_t *ptes[XENBUS_MAX_RING_GRANTS];
- phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS];
- int err = GNTST_okay;
- int i;
- bool leaked;
-
- *vaddr = NULL;
-
- if (nr_grefs > XENBUS_MAX_RING_GRANTS)
- return -EINVAL;
-
- node = kzalloc(sizeof(*node), GFP_KERNEL);
- if (!node)
- return -ENOMEM;
-
- area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes);
- if (!area) {
- kfree(node);
- return -ENOMEM;
- }
-
- for (i = 0; i < nr_grefs; i++)
- phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr;
-
- err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles,
- phys_addrs,
- GNTMAP_host_map | GNTMAP_contains_pte,
- &leaked);
- if (err)
- goto failed;
-
- node->nr_handles = nr_grefs;
- node->pv.area = area;
-
- spin_lock(&xenbus_valloc_lock);
- list_add(&node->next, &xenbus_valloc_pages);
- spin_unlock(&xenbus_valloc_lock);
-
- *vaddr = area->addr;
- return 0;
-
-failed:
- if (!leaked)
- free_vm_area(area);
- else
- pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs);
-
- kfree(node);
- return err;
-}
-
struct map_ring_valloc_hvm
{
unsigned int idx;
@@ -725,6 +667,65 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
}
EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
+#ifdef CONFIG_XEN_PV
+static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
+ grant_ref_t *gnt_refs,
+ unsigned int nr_grefs,
+ void **vaddr)
+{
+ struct xenbus_map_node *node;
+ struct vm_struct *area;
+ pte_t *ptes[XENBUS_MAX_RING_GRANTS];
+ phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS];
+ int err = GNTST_okay;
+ int i;
+ bool leaked;
+
+ *vaddr = NULL;
+
+ if (nr_grefs > XENBUS_MAX_RING_GRANTS)
+ return -EINVAL;
+
+ node = kzalloc(sizeof(*node), GFP_KERNEL);
+ if (!node)
+ return -ENOMEM;
+
+ area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes);
+ if (!area) {
+ kfree(node);
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < nr_grefs; i++)
+ phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr;
+
+ err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles,
+ phys_addrs,
+ GNTMAP_host_map | GNTMAP_contains_pte,
+ &leaked);
+ if (err)
+ goto failed;
+
+ node->nr_handles = nr_grefs;
+ node->pv.area = area;
+
+ spin_lock(&xenbus_valloc_lock);
+ list_add(&node->next, &xenbus_valloc_pages);
+ spin_unlock(&xenbus_valloc_lock);
+
+ *vaddr = area->addr;
+ return 0;
+
+failed:
+ if (!leaked)
+ free_vm_area(area);
+ else
+ pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs);
+
+ kfree(node);
+ return err;
+}
+
static int xenbus_unmap_ring_vfree_pv(struct xenbus_device *dev, void *vaddr)
{
struct xenbus_map_node *node;
@@ -788,6 +789,12 @@ static int xenbus_unmap_ring_vfree_pv(struct xenbus_device *dev, void *vaddr)
return err;
}
+static const struct xenbus_ring_ops ring_ops_pv = {
+ .map = xenbus_map_ring_valloc_pv,
+ .unmap = xenbus_unmap_ring_vfree_pv,
+};
+#endif
+
struct unmap_ring_vfree_hvm
{
unsigned int idx;
@@ -916,11 +923,6 @@ enum xenbus_state xenbus_read_driver_state(const char *path)
}
EXPORT_SYMBOL_GPL(xenbus_read_driver_state);
-static const struct xenbus_ring_ops ring_ops_pv = {
- .map = xenbus_map_ring_valloc_pv,
- .unmap = xenbus_unmap_ring_vfree_pv,
-};
-
static const struct xenbus_ring_ops ring_ops_hvm = {
.map = xenbus_map_ring_valloc_hvm,
.unmap = xenbus_unmap_ring_vfree_hvm,
@@ -928,8 +930,10 @@ static const struct xenbus_ring_ops ring_ops_hvm = {
void __init xenbus_ring_ops_init(void)
{
+#ifdef CONFIG_XEN_PV
if (!xen_feature(XENFEAT_auto_translated_physmap))
ring_ops = &ring_ops_pv;
else
+#endif
ring_ops = &ring_ops_hvm;
}
diff --git a/firmware/3com/typhoon.bin.ihex b/firmware/3com/typhoon.bin.ihex
deleted file mode 100644
index d7a83bea0c3b..000000000000
--- a/firmware/3com/typhoon.bin.ihex
+++ /dev/null
@@ -1,2819 +0,0 @@
-:10000000545950484F4F4E000200000009000000B4
-:100010000000FFFFCB99B1D44CB8D04B3202D4EEE4
-:10002000737E0B139BC0AEF440010000E8FC00009F
-:100030000000FFFF390000EA050000EA040000EAC2
-:10004000030000EA020000EA010000EA320200EACE
-:10005000C51400EA07002DE90E00A0E100100FE131
-:10006000D0209FE512FF2FE1FEFFFFEA010080E0B4
-:10007000042081E4010050E1FCFFFF1A0EF0A0E132
-:1000800000A0A0E10EB0A0E10000A0E3A8109FE551
-:10009000000081E5A4109FE5000081E50116A0E3C2
-:1000A000000091E5010080E3000081E5D700A0E3B6
-:1000B00000F021E188D09FE5DB00A0E300F021E122
-:1000C0007CD09FE5D200A0E300F021E174D09FE551
-:1000D000D100A0E300F021E16CD09FE59B1400EB80
-:1000E000D300A0E300F021E160D09FE560009FE530
-:1000F00060109FE560209FE5DBFFFFEB5C009FE564
-:100100005C109FE50020A0E3D7FFFFEB54009FE5C4
-:1001100054109FE5D4FFFFEB0A00A0E10BF0A0E133
-:10012000D310A0E301F021E1D4FFFFEB3CA09FE559
-:100130001AFF2FE1C6FFFFEA1521FFFF0C00100098
-:100140001C0010003C380080FC370080FC3F008021
-:100150007C340080800F000080300080ADDEADDE9A
-:10016000B0BB000024AB20404829000028050080D7
-:10017000BDBA214000000000FFFF000000000000A9
-:1001800000000000FFFF00000000000058570000C2
-:10019000864B00006001FFFFB0B5071C124D002424
-:1001A000286800281ED0381C104904F07BFD2968FF
-:1001B000C0460860002815D038010D4940181923A1
-:1001C000DB01C018416B80290CD2013141632868E2
-:1001D000C169C0462960390741600462C762B0BC8A
-:1001E00008BC1847201CFAE7E8170080EE0500005D
-:1001F000A01C008002490A68C046C26108607047BE
-:10020000E81700807047000070470000704700004A
-:1002100000000FE10010A0E1C01081E301F021E136
-:100220001EFF2FE100F021E11EFF2FE100000FE192
-:10023000C00080E300F021E11EFF2FE100000FE18C
-:10024000C000C0E300F021E11EFF2FE100000FE13C
-:10025000400080E300F021E11EFF2FE100000FE1EC
-:10026000800010E3800080E300F021E10000001234
-:100270001EFF2FE1000050E300000FE18000C013DB
-:1002800000F021E11EFF2FE100000FE18000C0E33C
-:1002900000F021E11EFF2FE1910000E01EFF2FE1A1
-:1002A000012080E0010080E01EFF2FE180B5084FB3
-:1002B000642804D3642038630020C04303E038631B
-:1002C000044905F001FB7863B86380BC08BC18479B
-:1002D000680E00808813000080B4104B00221F6B52
-:1002E000642F03D209680968490802D2101C80BC37
-:1002F0007047191CDB6B4F6BBB4205D24068000492
-:10030000000C1818C863F1E74168054B19434160B8
-:100310000448C16B0131C1630220E8E7680E008028
-:10032000000000800C2B008090B5071C154C0020AD
-:10033000216B64290BD2B96E490808D3216CA26BDA
-:10034000914207D2FA1D3932528B8918216490BC30
-:1003500008BC1847786A396BC0464862386B02F0AF
-:100360002DFE381C02F0E8FA0120BB231B01E11826
-:10037000C87305490A6C12180A6404498A6D121878
-:100380008A65E4E7680E00800C2B0080A42A0080B8
-:1003900080B40A48C06D02231840094A0021002891
-:1003A00003D0D163116480BC7047064807687B1C8A
-:1003B00003600A2FF7D30160F3E70000A42A00804E
-:1003C000680E0080E001008070470204120C000CEF
-:1003D00010180A04120C090C51180818010C05D049
-:1003E0000104090C000C0818010CF9D10004000CE0
-:1003F000704780B40022002918D04F087B1E002FC0
-:1004000006D00788BA1802301F1C013B002FF8D114
-:10041000490803D300880006000E8218100C05D08E
-:100420001004000C110C4218100CF9D11004000C2F
-:1004300080BC704780B58389C789FB18078AFB1881
-:10044000478AFB18407A0002C718380C05D03804D8
-:10045000000C3B0CC718380CF9D1081C111CFFF715
-:10046000C8FF011C381CFFF7B0FF80BC08BC184750
-:1004700090B5022382681A400027002A0FD00A4A4A
-:100480009369013393610A688B689A1800681C1895
-:1004900057810969101CFFF7ACFFC0436081381C0D
-:1004A00090BC08BC184700000C2B008090B50423BA
-:1004B00082681A400027002A11D04A6852090ED3D8
-:1004C000094A136A01331362CB6802689C1801233E
-:1004D0009B07083A1A43126800F02EF82082381C55
-:1004E00090BC08BC184700000C2B008090B58023FE
-:1004F00082681A400024002A15D04A68920912D353
-:100500000B4AD3690133D361CB6802689F1801237A
-:100510009B07083A1A43126800F00EF8002800D131
-:100520000448C046F880201C90BC08BC1847000056
-:100530000C2B0080FFFF0000B0B5141C051C0F1C25
-:100540003869B96841183868FFF753FFC0430104A0
-:10055000090C201CFFF739FF041CB86879694018A2
-:10056000696888420CD22A681218091A101C00F017
-:1005700005F9C0430104090C201CFFF726FF041CE9
-:10058000E0430004000CB0BC08BC184780B5071C51
-:10059000B86BC0081AD3B86AF96B4018796C00F0D0
-:1005A000EDF8C0430104090C0A4807D02023B969BB
-:1005B0001943B961016B0131016307E0FF23013386
-:1005C000B9691943B961416A01314162002080BCB7
-:1005D00008BC18470C2B008080B5071CB86B41097C
-:1005E0001CD3C0081AD3F81D3930007B062815D15A
-:1005F000381C00F053F8011C0A4807D04023B969A1
-:100600001943B961816B0131816307E001239B02CA
-:10061000B9691943B961C16A0131C162002080BC66
-:1006200008BC18470C2B0080B0B5071CB86B8109BB
-:100630002CD3C0082AD3F81D3930007B112825D1CE
-:10064000B86A396C401801239B07063018430068CC
-:1006500005042D0C0F4C11D0381C00F01FF8002899
-:100660000CD0A84202D10C4B984207D08023B86925
-:100670001843B861606B0130606307E001235B02DF
-:10068000B8691843B861A06A0130A0620020B0BC0C
-:1006900008BC18470C2B0080FFFF0000F0B5FFB02E
-:1006A00099B0041CE06B616C091803AA8518A36A51
-:1006B00000208A080132979207D082009F5803AE2B
-:1006C000B750979A01308242F7D8606A01239B079E
-:1006D000043018430068C046029002AF3F8803A868
-:1006E000FFF787FEC0430104090C381CFFF76DFEBD
-:1006F000071CE06BA16C4018616A01239B0708315D
-:1007000019430968C046019101A90988013188424D
-:100710000CD2A26A1218091A101C00F02FF8C0435C
-:100720000104090C381CFFF750FE071CA889E98951
-:100730000818298A0818698A0818697A09020818A5
-:10074000A16C626C891A0A04120C1102120A11437C
-:100750000904090C0918080C05D00804000C090C40
-:100760004118080CF9D1381CFFF72FFEC0430004D4
-:10077000000C7FB019B0F0BC08BC1847B0B4002220
-:1007800000292ED083079B0FDC0047180425EF1BA0
-:10079000BF07BF0FFF008008800059180331890888
-:1007A0004D1E02C8E140A1406B1E002D09D00C0473
-:1007B000240CA218090C8A1802C81C1C013B002C2E
-:1007C000F5D1B940081CF8400104090C8918000C47
-:1007D0004218100C05D01004000C110C4218100C1B
-:1007E000F9D11004000CB0BC7047000090B4002098
-:1007F0000127114942001218D20053189C680123A6
-:100800009B0723431B681B031B0B8A581203120B05
-:1008100093420CD101300428ECD30848C06A01038C
-:10082000090B0748006F0003000B814202D0381CFF
-:1008300090BC70470020FBE7A803008000401440F4
-:10084000680E008098B4144AC04600928300134892
-:10085000C05807033F0B1248C0580203120B11483F
-:10086000C0580003000B104CE45801239B0723439E
-:100870001B689B00CC000121984201D1081C09E0B3
-:10088000984203D9101ADA1B801800E0181A844223
-:10089000F4D3002098BC704755555555200400806E
-:1008A00028040080080400801804008080B4130429
-:1008B00000D0013A80000B1C13490F58C0463B6022
-:1008C0000B58C0465A600A580832104B1B589A42BF
-:1008D00001D30F4A12580F4B1F5801239B073B436C
-:1008E0001B689B0017033F0B9F4206D10A48C16853
-:1008F0000131C160012080BC7047084B1B58C046C5
-:100900001A600A500020F6E70804008028040080DE
-:100910002004008018040080A08220401004008081
-:10092000FF5F2DE948FEFFEB01B6A0E301B18BE2CA
-:10093000028AA0E3017AA0E301A9A0E30156A0E3A3
-:10094000C8609FE5C8909FE514409BE5000054E314
-:100950002C00000A030A14E31100000A0C0096E5BB
-:10096000000050E32100000A010A14E30500000A18
-:100970001C0096E5010AC0E31C0086E51C0085E525
-:10098000147085E5060000EA020A14E30400000A78
-:100990001C0096E5020AC0E31C0086E51C0085E504
-:1009A000148085E5010914E30400000A1C0096E5A3
-:1009B0000109C0E31C0086E51C0085E514A085E55F
-:1009C000020014E34000001B010014E35400001B6C
-:1009D000020B14E36700001B010B14E32000001B53
-:1009E000180099E5010080E2180089E5D5FFFFEACB
-:1009F0001C0096E5010AC0E31C0086E51C0085E5A5
-:100A0000147085E5E1FFFFEAFF5FBDE804F05EE2F8
-:100A1000680E00800883204010101FE5143091E517
-:100A20000020C3E1142081E50116A0E30C2081E53C
-:100A30000B12A0E3000081E518109FE5B024D1E17E
-:100A4000012082E2B024C1E13C2091E5000082E176
-:100A50003C0081E51EFF2FE1A0822040FFFFFFEA5E
-:100A6000FEFFFFEA010BA0E30116A0E3140081E5FD
-:100A7000001A81E1242091E570001FE500000000CC
-:100A8000242080E5281091E500000000281080E572
-:100A90002C2090E5012082E22C2080E53F0001E23D
-:100AA0003F0050E31EFF2F1118009FE5001090E556
-:100AB000011081E2001080E50218A0E30B02A0E320
-:100AC000001080E51EFF2FE1300400800106A0E346
-:100AD000010180E2001090E5010811E30B10A0E392
-:100AE000021981E20500001A002090E54228B0E1D9
-:100AF0000500001A000090E5020C10E30200000A55
-:100B00000607A0E34C1180E5030000EA0C009FE516
-:100B100000000000401080E5FFFFFFEAFEFFFFEA53
-:100B2000000000800106A0E3010180E2001090E5D2
-:100B3000010811E30C10A0E3021981E20500001A7C
-:100B4000002090E54228B0E10500001A000090E581
-:100B5000020C10E30200000A0607A0E34C1180E536
-:100B6000030000EA4C001FE500000000401080E593
-:100B7000FFFFFFEAFEFFFFEA021BA0E30106A0E37E
-:100B8000141080E51EFF2FE180211FE5143092E54F
-:100B900000000000003080E51C0092E5000000002D
-:100BA000000081E50010A0E3141082E50106A0E337
-:100BB0001C1082E50C1080E51C1092E5000000007E
-:100BC0001C1080E51EFF2FE1C0211FE50000000082
-:100BD0001C1082E50116A0E3140082E50C0081E5FB
-:100BE0001C0092E5000000001C0081E51EFF2FE1C3
-:100BF00080B50F1C381C00F017F8002802D0381CF4
-:100C000000F092F8002080BC08BC184780B50F1C8B
-:100C1000381C00F009F8002802D0381C00F084F8D5
-:100C2000002080BC08BC1847F0B407683A78D207A7
-:100C3000D20F0024002A03D0FF220132426000E0DC
-:100C400044603A7B7B7B1B021A43812A08D1012333
-:100C50005B0242681A4342600422BF18826000E0CF
-:100C600084603A7B7B7B1B021A43082A06D1062349
-:100C700041681943416081680E313CE0C123DB00CB
-:100C80009A4203D14168244B19433EE0234B9A42D8
-:100C900004D101231B034168194336E01302120AF1
-:100CA0001206120E1A431204120C2E3A1C4B9A42D0
-:100CB0002DD80125426815434560BA7BFB7B1B029A
-:100CC0001A43184B9A4222D1FB1D093344CB9B0790
-:100CD000DB0EDA405B4220339E401643032E18D1D0
-:100CE000397D7B7D1B021943082907D10421294343
-:100CF000416081681631816001210AE0C123DB0077
-:100D0000994204D1012189032943416000E08460B4
-:100D10000021081CF0BC70470240000081800000E8
-:100D2000AE050000AAAA000080B44268D1083FD3F3
-:100D300001688368591802398F783F073F0F052FE4
-:100D400003D1DA1D0D32C26005E0BF00DB19C360BC
-:100D500008231A4342608A781207120F9200026138
-:100D60000A794B791B021A431302120A1206120E59
-:100D70001A431204120C4261CA7A062A03D11023C4
-:100D800042681A4310E0112A03D1202342681A4313
-:100D90000AE0332A03D1402342681A4304E0322A8E
-:100DA00003D1802342681A434260C97AC046017663
-:100DB00080BC70470A78C04602604B781B021A4319
-:100DC00002608B781B041A430260C978090611433C
-:100DD0000160704780B5071C4868800926D3B86A4F
-:100DE000C968401801239B070230184300680004BB
-:100DF000000C11239B02984218D1786A396BC046C7
-:100E00004862386B02F0DAF8381C01F095FD0120D9
-:100E10000749C046C87307494A6C12184A64064914
-:100E20008A6D12188A6580BC08BC18470020FAE752
-:100E3000181A00800C2B0080A42A0080810719D08A
-:100E40008008800001239B07011D18430068194397
-:100E500009680202120E1206000AFF231B04184042
-:100E600010430A0A1206120E104309021B0A194007
-:100E70000843704701239B071843006801060202DC
-:100E8000FF231B041A401143020A1B0A1A40114394
-:100E9000000E0843EDE70000F0B50423816B194014
-:100EA0000022002946D0C71D3937397B332901D0AC
-:100EB00032293FD1016BC0464A65C41D2D34CD1D7A
-:100EC0002D3500229300E658C046EE500132072A25
-:100ED000F8D3826AC0464A63826AC0468A627A8BC5
-:100EE000CB1D39335A83406AC046486212480127F5
-:100EF0004268002A10D1C268002A13D14269002A30
-:100F00000DD10161C160016A022902D3203007714D
-:100F10000CE000F013F809E0C268002A02D1016178
-:100F2000C16003E00269C04651650161381CF0BC34
-:100F300008BC1847101CFAE76C06008080B51E49F3
-:100F40000022CB68002B34D0C81DF9308362CB68F7
-:100F50009B6AC046C362CF697B00DF197F02174BD3
-:100F6000FF18FF37653783630763CB1DFF335A33A1
-:100F70001A72CB69002B01D0CA6101E00123CB6159
-:100F80000F1CC968496A098901314163F81DFF30A6
-:100F90003A30426002828260C260381C00F0CEFAB1
-:100FA000386A01303862381C00F00AF880BC08BC8E
-:100FB0001847101CFAE700006C060080ACAB20401C
-:100FC000F0B5071CF91DF931886AC21D2D320123C5
-:100FD0009B0708321A43C86A12681204120C801860
-:100FE0008279C3791B021A431302120A1206120EE7
-:100FF0001A431204120C02389204920C0026254D5A
-:10100000EC1DFF343A34002A04D0208A01239B02CD
-:1010100018432BE001239B07C21D0D321A431268AF
-:1010200012041230184300680004000C1043031C23
-:10103000F81DFF304A308278C86B191C02F002F8A4
-:10104000002804DA208AFF23013318430EE0F91D3B
-:10105000FF313A3108600104090C381C00F01CF81B
-:10106000002814D1208A01235B0218432082218AA0
-:10107000381C00F0A2FBE86801239B07543018439A
-:101080000068C046E860301CF0BC08BC184701206E
-:10109000FAE700006C060080F8B5071CFC1DF93467
-:1010A000A06BA66AC51D0D353848C06A4B0059189B
-:1010B0004901421801208007104300680004000C19
-:1010C000009001239B07D01D053018430068381C91
-:1010D000291C00F0C2FAA888410701D0002051E085
-:1010E00029890918606B8142F8D86989EA888918CA
-:1010F0008142F3D80098012825D1E06AF16B4018AD
-:10110000716CFA1DCD3201F033F9FA1DFF323A321B
-:10111000E06A51694018C31D0333002081005E5806
-:10112000C919FF3101314E6101300428F6D3E06A5C
-:1011300051694018C11D0531002000224300CA52E8
-:1011400001300628FAD3291C114A0020FFF7AEFB14
-:1011500001225204606B02430120216BFFF7A6FBC2
-:1011600001225204606B02430020E16AFFF79EFBFC
-:10117000A16B084A0120FFF799FB03200649C046EE
-:1011800048620120F8BC08BC184700004C2A0080C7
-:101190005400030014000F006C070080F0B58DB000
-:1011A0000020B54AD51DF935686201200005B34914
-:1011B000C0460860A86AC41D2D34B148C06AD71D56
-:1011C000FF373A3739684B00591849014018012355
-:1011D0009B07C11D05311943096808301843006891
-:1011E000C0460990FF231B021840000A0A900A9883
-:1011F000A44E012859D1286BA2688018A24A2169FF
-:101200000904090C01F026F9286B79694018C11D01
-:10121000053100208200984BD318FF3301335B69FE
-:10122000C0468B5001300428F4D30020311C8200CA
-:10123000561801239B0733431B6804AEB35001309B
-:101240000328F4D300200890904942008B5AB25AE8
-:10125000934213D08E48C1890131C181B8680028FA
-:1012600003D1388A1023184371E0388A4023184389
-:101270006DE000F011F901F067FFF5E0013006289C
-:10128000E3D3089800280CD1B868411CB960002845
-:1012900003D1388A0123184302E0388A0423184313
-:1012A000388278680130786062E00A9802285FD15D
-:1012B0000998400C73D301239B07E01D01301843AC
-:1012C0000068E11D0D311943096840180C3800040D
-:1012D000000C00218A006B4BD61801239B07334377
-:1012E0001B6804AEB35001310329F3D30021831EE0
-:1012F0000C93684A166BC0460B968A000C9B9B1891
-:101300000B9E9E1901239B0733431B686E46B35007
-:1013100001310429F1D369468B1C07930021089100
-:1013200004AE4A00079B9B5AB25A934211D05848C8
-:10133000C1890131C181F868411CF960002803D1DD
-:10134000388A2023184302E0388A802318433882E1
-:101350008FE701310629E4D3089900290DD1F968F6
-:101360004A1CFA60002904D1398A0223194303E098
-:101370000CE0398A082319433982296B08180123A4
-:101380009B07013818430068C046207601239B075D
-:10139000E01D1130184300680106090E00E019E055
-:1013A00035482A6BC046EA6204294FD10121C61D87
-:1013B000FF365A3631720A9902291ED10999090E4F
-:1013C00049061AD1E11D0531194309680906090EBC
-:1013D00008391AE001239B07E01D0130184300681B
-:1013E000E11D0D311943096840180004000CF9682B
-:1013F0004A1CFA600029BCD1B6E701239B07E11D16
-:101400000531194309680906090EA160E86AC0465A
-:101410002060201CFFF788FC207E332801D0322872
-:1014200011D10121144CC046F960B960201C00F0B4
-:1014300085F8286BA96AC0468862201CFFF7C0FDAA
-:10144000002811D10EE00020307211E0332901D0C4
-:1014500032290DD1071C00F071F8381CFFF7B0FDE0
-:10146000002801D101F070FE0DB0F0BC08BC184797
-:1014700000F012F8F6E700006C060080000000B0F3
-:101480004C2A0080ACAB20404007008082070080DF
-:101490000C2B00806C070080F0B5254841680131B5
-:1014A0004160244FF91DF9310024886AFA68C0466A
-:1014B00094610422FB68C046DA601022FB68C046D3
-:1014C0009A61FA1DFF325A32137A1B4A002B0BD055
-:1014D000158A2E0A360233232B409B001E43CC2351
-:1014E0002B409B0833431382128AFB68C046DA8381
-:1014F0004A6BFB68C046DA810A6BC0468262C462EE
-:10150000C31D39334A6BC0465A83042302681A4309
-:101510000260886A01F032FAF86801239B075430B0
-:1015200018430068C046F860F0BC08BC18470000CB
-:101530000C2B00806C060080AC07008080B5C11DBC
-:10154000F9318A6A01239B07D11D45311943096886
-:101550000B061B0E0127C11DFF314A31332B05D16C
-:101560008B70011C101C00F00FF806E0322B08D124
-:101570008B70011C101C00F03CF8381C80BC08BCAF
-:10158000184700208870F9E790B4CA1DF932332754
-:10159000CC1DFF344A34D36AC046A770FF314131B5
-:1015A000076CC0464F61FB18391C9F1E01239B0727
-:1015B000FC1C23431B681B061B0E9B001B041B0CFF
-:1015C000C9180831016401239B07B91C1943096834
-:1015D00034300176F81D0130184300680004B91D4D
-:1015E0001943D06309680904090C0843D06390BC0F
-:1015F0007047B0B5CA1DF932C51D2D353220CF1D3B
-:10160000FF374A37D36AC046B870CC1DFF343A342E
-:10161000E868C04660611030E8606069C018871EE5
-:1016200001239B07381D184300680004B91C1943A7
-:10163000D06309680904090C0843D063F81D03301E
-:10164000FFF7FCFB2062F81D0730FFF7F7FB606235
-:1016500000202876B0BC08BC1847F7B581B00198C7
-:10166000C71DF937B86A01239B07D41D05342343EE
-:101670001C68FF23FE3323407F6B3F043B430B601A
-:1016800034301C1C80232340019FFF374137002B3F
-:101690003CD00C23009300239D00AE1836696D18D2
-:1016A0006E610133052BF7D300239D00AE18766AD7
-:1016B0006D18AE620133052BF7D3019BFF33513315
-:1016C0009B78332B0ED101239B07C51D01352B437E
-:1016D0001B68C0464B8101239B07C51D0D352B435D
-:1016E0001B6816E07B69C0464B8101239B07C51D23
-:1016F0000D352B431B687D695D1B01239B07C61DB0
-:10170000013633431B68EB180C3B02E000230093C7
-:101710004B81CB80630949D301239B07C41D05344A
-:1017200023431B68C0460B8101239B07C41D0D3456
-:1017300023431B680C891B1B009C1C1B01239B075C
-:1017400008301843006820188880386A040EFF2388
-:101750001B0403401B0A1C43FF231B0203401B0204
-:10176000234300061843C860786A070EFF231B0452
-:1017700003401B0A1F43FF231B0203401B023B4382
-:10178000000618430861D06BC046C863906BC04622
-:101790000864506CC0464864106CC0468864D06CC5
-:1017A000C046C864906CC046086502E000230B8107
-:1017B0008B8004B0F0BC08BC184700B50F4A938971
-:1017C00001339381C21DF9320423906AC046C3607D
-:1017D00010238361CB0A01D318238361C183516B2A
-:1017E000C046C181516BC21D393251830423016847
-:1017F0001943016001F0C2F808BC18470C2B0080A7
-:10180000B0B51B4C206A02281BD20020E71D1937F7
-:101810003871E168E01DF930002915D0426A002ACC
-:1018200012D101250AE0FFF789FB002809D1206ABF
-:10183000022800D33D71E068002802D038790028E2
-:10184000F1D0B0BC08BC1847406A0028F9D1002983
-:10185000F7D16069002804D00648006803F0A8FCAE
-:10186000EFE760680028ECD000F05AF8E9E70000E4
-:101870006C06008034040080B0B5071C2023B868D3
-:1018800018400124002500280BD1386A002803D114
-:10189000281CB0BC08BC18471F48016E0131016606
-:1018A00003E04868C423184003D1386A00F00CFCF8
-:1018B0002FE0381C00F01CFC381C00F07BFAB868E4
-:1018C000C00802D3386A00F0D1FBB868396AC04654
-:1018D0008860386AC046C56010484168002911D147
-:1018E000C168002909D14169002906D1396AC04679
-:1018F0008160416000F014F80BE0396AC0468160F5
-:10190000416006E0396A8268C046D160396AC046E3
-:101910008160201CBDE70000A42A00806C060080C6
-:1019200090B50B4C6768002F0FD0381C00F012F8F0
-:1019300000280AD16068C068C0466060381C00F0AA
-:10194000C3FB002090BC08BC18470120FAE7000048
-:101950006C060080F0B5071CFE1D4936307840004B
-:10196000C019858B334C344B9D423CD0381C211C14
-:101970002A1C00F01DF93148806A5821694340183B
-:1019800001239B07184300680004000C2C4D01281C
-:101990001AD13078C019C11D1931087A3A688018F7
-:1019A000097BEA1D213200F0E3FC3078C0192030B9
-:1019B000007939684018C11D05310020002342001C
-:1019C0008B5201300628FAD3A08841070BD1218918
-:1019D000091878680004000C814204D86189E28803
-:1019E0008918814203D90020F0BC08BC1847211C8B
-:1019F000144A0020FEF75AFF01225204786802437D
-:101A000001203968FEF752FF012252047868024330
-:101A100000203968FEF74AFF0B490C4A0120FEF707
-:101A200045FF0120E91D193148710221EA1DF932F3
-:101A30005162D9E728AC2040FFFF00004C2A00800B
-:101A40006C0600805400030014AC20401400070012
-:101A5000F0B583B000214F48C21DF9325162012117
-:101A6000C9044D4AC0461160C11D19314979002988
-:101A700004D14A48006803F09BFB87E0454847686B
-:101A8000FC1D493421784800C019808B444A926A71
-:101A900058235843151801239B07EA1D05321A43A2
-:101AA000126808352B431D68FF231B022B401B0ABD
-:101AB0003C4D012B24D1C819C11D1931087A3A684F
-:101AC0008018394A097B00F0C5FC2078C019203005
-:101AD0000079396841180020820053199B6E6E46C8
-:101AE000B35001300328F7D3CA1D053269460020E0
-:101AF0004300CD5AC046D55201300628F8D32DE018
-:101B0000022B2BD1110A29D300218A0053199B6E75
-:101B10006E46B35001310329F7D321784900C91922
-:101B2000098F3A688B186A4600214D00565BC04603
-:101B30005E5301310629F8D319498A6A13181A6DC0
-:101B4000009D5540194AD66875401D65896A081878
-:101B5000416D029B59409269514041652078411E78
-:101B6000217000280DD0381CFFF7F4FE00280DD19D
-:101B7000084A5068C068C0465060381C00F0A4FA9B
-:101B800002E0381C00F073FA01F0DEFA03B0F0BC9A
-:101B900008BC18476C060080000000B038040080C4
-:101BA0004C2A0080ACAB2040940600800883204083
-:101BB000F0B582B0694B9F6A58235A43BA18C31DC7
-:101BC00049331F7801239B07D41D013423431D682B
-:101BD00043681C0401239B07D61D053633431B684D
-:101BE0001C4342231C430C60FF2636022E40012377
-:101BF0005B029E4274D16B0C2BD3C31920331B792B
-:101C0000C0464B817B001B181B8F4C891B1BCB8054
-:101C10000024A6000196B318DE1D093601239B0798
-:101C200033431B68019E761873610134052CF0D391
-:101C30000024A6000096B318DE1D1D3601239B0765
-:101C400033431B68009E7618B3620134052CF0D331
-:101C500006E000234B81CB8040239C430C60231C77
-:101C60006B0E4AD3C31920331B7910330B817B00D1
-:101C70001B181B8F0F89DB1B8B8001239B07D41D37
-:101C8000353423431B68C046CB6301239B07D41D17
-:101C9000313423431B68C0460B64AB0E21D20123B1
-:101CA0009B07D41D3D3423431B68C0464B6401236E
-:101CB0009B07D41D393423431B68C0468B64012322
-:101CC0009B07D41D453423431B68C046CB640123C6
-:101CD0009B07D41D413423431B68C0460B6500E0BD
-:101CE0000FE0FB1F013B1B041B0C0768FF18036977
-:101CF000081C391C00F034F82CE000230B818B8089
-:101D000028E000238B800B81C31920331B7AC04647
-:101D10004B817B001818008EC046C88000208700C9
-:101D2000BB18DC1D093401239B0723431B687F1864
-:101D30007B6101300528F2D300208700BB18DC1D31
-:101D40001D3401239B0723431B687F18BB620130AE
-:101D50000528F2D302B0F0BC08BC18474C2A00801A
-:101D600080B41F1C3B0C18D2176D114BC046DF60AE
-:101D7000526DC0461A61C7601A69C0460261D868D0
-:101D8000C0460880D868000C48801869C046888022
-:101D90001869000CC88080BC70474A8812040B8800
-:101DA0001A43C2608A88C988090411430161F2E7B5
-:101DB0002C070080F1B588B000220898006A089BC3
-:101DC0009968490A02D30127FF0300E00027038B2B
-:101DD000002B19D0A349896A1C1C58236343C918D6
-:101DE00001239B075839194309680904090C022982
-:101DF00002D108231F4307E0418B002902D00C23A6
-:101E00001F4301E004231F43838A002B18D0954908
-:101E1000896A1C1C58236343C91801239B0758393E
-:101E2000194309680904090C022901D10F4307E08D
-:101E3000C18A002902D003231F4301E001231F436D
-:101E4000C11D393107914B890C891C192404240CBC
-:101E5000089D2D68C0460195C9887D081AD31A1CB3
-:101E6000C31D19331A72079A9289C0461A73079ACA
-:101E70001289C04602860487828A013A828301223F
-:101E80001971089B1B685B185B789B001B041B0C7B
-:101E900008335918BB0847D3079B5B8985180695FB
-:101EA00020352B72079B9B89C0462B73079B1B8990
-:101EB0002E1C55002D1805952B86002A01D0C38AAB
-:101EC00000E0838A013B059DC046AB833171654BC1
-:101ED0009D6A059B9E8B58237343EB18DD1D0135CE
-:101EE00001239B072B431D682B0E5B0601D1083194
-:101EF00000E0103181235B021D409D4203D1E31FAE
-:101F0000053B1C04240C059BC0461C87089B1B68D2
-:101F10001B19103B9B7B069D40352B702B780233A1
-:101F2000E31A1C04240C0132BB089B076DD08318F4
-:101F3000203304931972019B5D1801239B072B43E7
-:101F40001B681B071B0F9B00049EC0463373009544
-:101F50002B781B071B0F9B00049DC0462B73009D15
-:101F6000EB78AD781B021D432B022D0A2D062D0E9A
-:101F70002B4355002D182B86049BC0465972049B99
-:101F80001B7B2E1C049DC0466B73338EC04673862C
-:101F9000009D2B781B071B0F9B001B041B0C591863
-:101FA00004253D400ED03487038B013BB383131CC3
-:101FB0001B1820331971019B5B185B789B00591823
-:101FC000083101323B0937D3002D01D0438B00E0AB
-:101FD000038B55002D18013BAB83831803932033EB
-:101FE0001971204B9D6A53001B1802939E8B582336
-:101FF0007343EB18DD1D013501239B072B431D683F
-:102000002B0E5B0602D1083101E015E0103181236F
-:102010005B021D409D4203D1E31F053B1C04240CC1
-:10202000029BC0461C87089B1B681B19103B9B7BAF
-:10203000039C403423700132079BC046D980511E57
-:10204000C31D493319700761042A06D2064953009B
-:102050001B1899830132042AF9D309B0F0BC08BCDB
-:10206000184700004C2A0080FFFF0000704780B531
-:102070008CB0071C12480168013101603868C04605
-:1020800000907868C0460190B868C04602900D483C
-:102090004168C968C0464160381C00F04FF8B86814
-:1020A000400906D31023029818430290684602F0B4
-:1020B000E1FF684602F09AFE0CB080BC08BC1847ED
-:1020C0000C2B00806C06008000B58CB00168C04607
-:1020D00000914168054B1943019100F02FF86846C3
-:1020E00002F084FE0CB008BC18470000000000A0FD
-:1020F000026A0368C04613604068C04650604032C0
-:102100004868C0469080C868C046D0804869C046CC
-:1021100010818868C0465081087EC0469073086967
-:10212000C0469081704704490868002800D1704774
-:10213000C268C0460A60FAE76C06008002490A6875
-:10214000C046C260086070476C060080B0B40022D0
-:10215000124F7C7F01347C770323FC1D19343862D5
-:10216000796223720E4C25686B0C05D223681B0C18
-:1021700010D12468A30A0DD301230A4FC046FB6285
-:10218000094F0A4BC046DF6099605860101C186008
-:102190000132FBE7101C38640132FBE700000080CD
-:1021A00000001040C000180002810000400118002B
-:1021B000F0B5474F3868474E474D07235B02EC1890
-:1021C00000281DD1206B013020634449C0460860BF
-:1021D00043484169002913D0C11D6931097B002999
-:1021E0000ED001239B07016D19430968C046816128
-:1021F000C269914204D0F16C0131F16401F050FEEA
-:102200003868012817D137484169002913D0C11D0A
-:102210006931097B00290ED001239B07016D194309
-:102220000968C0468161C269914204D0F16C0131F4
-:10223000F16401F035FE386802282FD1BB231B0161
-:10224000EE18707B002803D00020707300F04AFD68
-:10225000307B002802D0786802F0AAFF1B23DB0144
-:10226000E818C08B04260640E06AB04214D0F86833
-:102270000130F860192811D31B48017B00290DD1CA
-:10228000FF3041304078002808D1B86802F090FF54
-:102290000020F860E66201E00020F860386803285A
-:1022A0000BD1EC1D7934E06B800802D3022002F0E0
-:1022B00007FC0223E06B9843E06338680130386024
-:1022C000032801D900203860F0BC08BC1847000082
-:1022D0003C040080A0822040680E0080400118006D
-:1022E000642D0080E42C008028050080B0B41D48D7
-:1022F000848A1D4A138AC11D093101279C4203D1DA
-:10230000438A548AA34210D00B78002B0DD04B780F
-:10231000002B0AD0448B938A9C4204DC134BC046AA
-:102320005F60978201E001339382C38B5C1CC4839E
-:10233000848BA3420EDB848A058B0023AC4205DA32
-:10234000448AC58AAC4201DA4B7000E04F70438288
-:102350008382C383418AC0465182808AC0461082EC
-:10236000B0BC7047E80E00803C04008040011800BB
-:10237000F7B591B06B46841E129914291AD9002022
-:1023800081006758C046575001300006000E1028E3
-:10239000F6D3002105208700D6594F1C3D062D0E8F
-:1023A0000F1CBF00DE51291C01300006000E102852
-:1023B000F1D309E0002081006358C046535001303A
-:1023C0000006000E0628F6D30020E070207260722E
-:1023D000A072207360731299142937D969468E1C34
-:1023E00091780907090F890014390D062D16002769
-:1023F000002D1BDDF01910A900F03DF800280ED0CB
-:10240000002010A90978002909DD0022391872542A
-:1024100001300006000E10A909788842F6DB10A8EA
-:102420000078381807063F0EAF42E3DB6846E21D2E
-:102430000D320021AB085F1C08D08B00C458C04689
-:10244000D45001310906090E8F42F6D814B0F0BC01
-:1024500008BC184790B4871E002089084B1C08D080
-:1024600081005458C0467C5001300006000E834263
-:10247000F6D890BC704780B40278D206D20E002302
-:102480000127012A01DC0F7011E04078C046087076
-:10249000142A04D10848017A0131017207E0022AA6
-:1024A00005D0052A03D0062A01D0152A02D1181C0E
-:1024B00080BC7047381CFBE7E082204000B50F4825
-:1024C00001231B06416999431A094161D16000212A
-:1024D000A12252039161191C094AC04611601B23B5
-:1024E000DB01C0188069002803D002F061FE08BC3F
-:1024F00018470448418801314180F8E7680E0080A0
-:10250000000000B0E082204070470000F0B586B0C7
-:10251000954AD068D71D7937012809D13889002814
-:1025200006D1D06F022301689943016014203881DD
-:102530008E4C616A8E48C36B5918C163A06A192317
-:10254000DB01D418A062216A0903090B814205D17D
-:10255000012040048749C0460860F3E0BB8A581C4C
-:10256000B8823D8B01200021AB4204DBD31D8933AF
-:102570005870B982F98333239B01D31805935B69A3
-:102580000F2B73D200217C4FC0463961216A8A68C3
-:102590001204120C4B681E0C3604FD1F093D002E60
-:1025A00005D13B2A03D30123DB029A4201D9A87348
-:1025B000C8E001239B07083119430968C04603910D
-:1025C00003A9098801310904090C798249090531F7
-:1025D0000906090E694EC04602966948436AC0461C
-:1025E0000193836AC0460093C21D113280690003C3
-:1025F000000B9268B3071A431268904201D1012080
-:102600000DE0904205D9009B181A019BD21A82183E
-:1026100000E0121A01200901914200D30020012894
-:1026200065D151492069002862D005994869013077
-:1026300048610220216AC046086000F0A7FC786368
-:10264000BE604949226AA36BD318666BB34200D9B6
-:10265000226BC046BA62BA6A0C32FA620022FA6190
-:1026600003AA5288D20903D3012200E07BE000E0F4
-:1026700000227A607A68C0460260788A414E6028FB
-:1026800004DCB083788AC046F08308E06020B08321
-:10269000798AF86A4218636B9A4203D8F183002260
-:1026A0003A6305E0216BC0463963616B081AF08319
-:1026B0002D49786B4268C046BA608268C046FA60AD
-:1026C0000269C0467A614069C046B8612E4BC8189D
-:1026D000049000F037F9049800F088F800F0F6FA5A
-:1026E000788AF18B884204D1F96A081804E038E04E
-:1026F00032E03A6B1018401A810702D0800880003F
-:102700000430616B091AA26B914200D2206BC04663
-:102710002062E87B002808D00022EA730599486906
-:1027200001384861786B00F073FA1848806A8006B7
-:10273000800E01280AD1206A0003000B0B4CA16A0D
-:10274000884203D006B0F0BC08BC18470120400402
-:102750000849C046086006E0E068002801D000F0A3
-:10276000B5FA0120A873EDE7680E00800040144020
-:10277000A42A0080000000B0281A00805555555545
-:10278000A8030080681A0080C40B000000001040FD
-:1027900080B5071C786A4089FF210131014010484B
-:1027A00002D1816C01318164796A4989490B02D275
-:1027B000416C013141640B48416A01314162786AE0
-:1027C000396BC0464862386B00F0F8FB381C00F0EB
-:1027D000B3F801200449C046C87380BC08BC184740
-:1027E000A42A0080A0822040181A0080F8B5071C97
-:1027F0000022F91D61310D1C786AC04600904089A5
-:10280000030C01D2400A03D2381CFFF7C1FF67E076
-:102810003548C06B00091FD3087840081CD200203F
-:102820004300CC5A314E9E1933239B01F3181B8869
-:102830009C420ED0B869396BC0468861F868396B24
-:10284000C046C860381C00F027F9381C00F074F846
-:1028500046E001300328E3DB022043005C18E488F3
-:10286000224E9E1933239B01F3181B889C4203D1EF
-:1028700001230138D842F0DC0123D842C4D01B4EDA
-:102880000B231B02F0184069002824D07D630098B8
-:102890004089000C1FD200242D239B01F018C06B2F
-:1028A000351C002817D0FE1D2D36A20052192D23ED
-:1028B0009B01D218D26B381C311C02F07BFC012822
-:1028C0000ED00134A00040192D239B01C018C06B0D
-:1028D0000028EAD101E0012A02D0381C00F008F8F3
-:1028E000F8BC08BC18470000E81A0080680E008099
-:1028F00080B5071CB869396BC0468861F868396BC8
-:10290000C046C860786A4089010C0ED2400A0CD3D8
-:102910003868400802D3381C02F00CFC381C00F068
-:10292000BBF8381C00F008F802E0381CFFF730FF55
-:10293000012080BC08BC18470121006B406AC046DA
-:1029400001607047B0B4C11D3931098B8908090491
-:10295000090C846AC21D6132002000290CDD870049
-:102960003D1901239B072B431B68C046D3510130FF
-:102970000004000C8842F2DBB0BC7047F0B5A0B098
-:1029800001239B07C11D213119430968C0460B91E2
-:10299000C11D533119431F91096801AFFA1D393226
-:1029A0001E9217AB59803A4901239B070A6A1343C9
-:1029B000CC1D113489690903090B2269E568C046F9
-:1029C0001D95FC1D3934648B640905342406240EDE
-:1029D0001C94561A1B961C9C2E4AC0460092012637
-:1029E0001D9D1A68914201D1321C0BE0914203D91E
-:1029F000521B1B9EB51800E0551A01222401AC425F
-:102A000000D30022012AE6D1910701430968C0469C
-:102A100039609307011D19430968C0467960C11DDB
-:102A2000013119430968C046B9601F9909681E9AA7
-:102A3000C0465183C11D1D3119430968C046386322
-:102A40007962C11D113119430968C046B961C11DC0
-:102A5000053119430968C046F960C11D1731194392
-:102A60000968C046F9830E3018430068C046F881F3
-:102A70003868400802D3381C02F05CFB381C00F0B8
-:102A80000BF8381CFFF758FF20B0F0BC08BC184703
-:102A9000A803008055555555F8B5071CF81D393069
-:102AA000418B394A914200DD4283428BC0460092FD
-:102AB00001203A1D06CABB6A02F00EFF334AC04627
-:102AC0000092334E306A334CE16D4118386BC31DB0
-:102AD00005330120726A02F0FBFEE06D183000251C
-:102AE000B16A814201D8E56500E0E0652F239B01D2
-:102AF000201CE16DE41822689200274BC0469950D3
-:102B00002648C16B4A0805D349084900C163012022
-:102B100001F0D6FF224A1F48C11D89310B78002BD6
-:102B200002D04978002900D11E4AC0460092206890
-:102B30008000194BC31805CEC11D1131012002F0D0
-:102B4000C7FE1448216801312160172900D3256090
-:102B5000396BC0460D65796A3A6BC04651623323C2
-:102B60009B01C0188168002903D1396BC046816080
-:102B700004E0396BC268C0461165396BC046C1605C
-:102B8000F8BC08BC18470000EA0500001800140251
-:102B90007C290080680E008044822040E80E00807E
-:102BA0000400000204000003F0B5114EFF250135BA
-:102BB000104FC0463560786901387861BC68002CD8
-:102BC00010D0206DC046B860201C00F021F8201CF9
-:102BD00000F004FA0848806A000C0007E9D1F0BC54
-:102BE00008BC18470548C1790131C171F7E70000F9
-:102BF000000000B0281B008000001040A082204090
-:102C0000012080030149C04608607047000000B001
-:102C100090B5071C3868C00809D31D48016A0139FE
-:102C2000016220300079002801D0FEF7E9FD012380
-:102C30009B07F81D1D3018430068164C616A8142DD
-:102C400021D1011C194309680904090C01291AD171
-:102C500000F022F86062606A216A884205D0012192
-:102C60008907014309680904F2D051218903626A86
-:102C7000236B9A4202D1606BA26B801A0438C86041
-:102C800090BC08BC18470020796AC0460860F7E786
-:102C90006C060080E81A008001239B07C11D0131EA
-:102CA000194309680904090C08180D30810702D07E
-:102CB00080088000043004498A6B12184B6B9A42DA
-:102CC00000D9086B70470000E81A008000B504487E
-:102CD000C068102801D300F005F808BC18470000B0
-:102CE000E81A008088B50C4F3879002811D10B49BB
-:102CF000102002F0F5FD00280BD001203871084AA1
-:102D0000C046009207484268074B0168002002F065
-:102D1000DFFD88BC08BC1847F81A0080F52CFFFFBF
-:102D2000100035027C2900804480204090B50120AD
-:102D300040021049C04608600F4F1021F81D3D3079
-:102D400002F04CFC1923DB01FC18E068002801D0DC
-:102D500000F014F80020C9231B01F9180871E0687D
-:102D6000102804D30120BB231B01F918487390BC21
-:102D700008BC1847000000B0680E0080F8B537485E
-:102D80001923DB01C118C968354D102900D910215C
-:102D900069623248C16C006E814207D9081A07097E
-:102DA0000024686AB84212D2071C10E081422AD27D
-:102DB0002C4A526B101A0709686AB84205D90C09E7
-:102DC0003919884203D2C41B01E00024071C3E19B4
-:102DD0003001254902F084FD00283DD02348002C15
-:102DE0001AD11E493A016F62096E8C181D4D6B6B2A
-:102DF000A34200D8E41A1E4B1A430092EA6A511803
-:102E00002A6B031C20E01B48016B01310163002089
-:102E10006862F8BC08BC1847104924013F01112220
-:102E200052053A436E6200920E4DEA6A096E5118DD
-:102E3000031C061C00202A6B02F04AFD0C4A2243A8
-:102E40000092BB19E96A2A6B002002F041FD034899
-:102E5000C046046600F010F80120DAE7680E008032
-:102E6000281B00807C2900805D2EFFFF44802040CD
-:102E700000003602A08220400448016E044A8030DF
-:102E8000D1600223C16B1943C1637047680E008093
-:102E900090EE2040F0B584B0012080021C49C0466D
-:102EA000086000271B4E33239B01F518686A002831
-:102EB0001DD9194C6846102102F090FB684600F0BD
-:102EC00033F8002804D015494869013048610AE008
-:102ED0001349607B01306073887901308871114833
-:102EE000006802F065F9686A0137B842E2D8BB238E
-:102EF0001B01F018817B002903D000218173FFF7AB
-:102F000005FBFFF7E3FE04B0F0BC08BC1847000067
-:102F1000000000B0680E0080B0822040088320408E
-:102F2000A08220405804008090B4174F1923DB0181
-:102F3000F9180022CB68002B23D0013BCB60332350
-:102F40009B01FF18BB691C6DC046BC610468C0468C
-:102F50005C604468C0469C608468C0461C61C06870
-:102F6000C04658611A650869421C0A61002803D0EE
-:102F7000386AC046036500E0FB613B62181C90BCE8
-:102F80007047101CFBE70000680E00800A4A3323DC
-:102F90009B01D118C8691923DB01D2181369002BD2
-:102FA00006D0013B1361CA69126DC046CA61704701
-:102FB00000211161FBE70000680E0080064A1169DC
-:102FC0004B1C13614032002901D0D16900E000217F
-:102FD0000165D06170470000E81A0080064AD16898
-:102FE0004B1CD3604032002901D0916900E00021E0
-:102FF0000165906170470000E81A008090B40021DC
-:103000000F4A9789926A4B001B189B8A002B12D09B
-:10301000BB4210DC1C1C58236343D318DC1F493C03
-:1030200001239B0723431B681B061B0E032B02D0A7
-:10303000002090BC704701310429E4D30120F8E757
-:103040004C2A0080F7B586B03D4A071CD1698F40F5
-:10305000031C146AE3405F40079E8E407740CF40D8
-:103060009469C0460594031CA34000251469C0461A
-:103070000494002C5DD91C1C324E26439469E64012
-:10308000331C0396536AC0460293D26AC04601922B
-:10309000BB00029AD258131C059CE340039CA34238
-:1030A0003ED18A40CA40141C63001B195B01019A7F
-:1030B000D21801239B07D61D013633431B681B061C
-:1030C0001B0E032B2CD101239B07D61D51363343F6
-:1030D0001B68079E1E40009601239B07D61D49369C
-:1030E00033431B6883421BD101239B07D61D4D36FA
-:1030F00033431B68009EB34212D101239B071A433E
-:1031000012681204120C089B322B04D1022A07D138
-:10311000200400140FE0089B332B01D1012AF7D0C3
-:10312000049A0137974200D30027049A0135AA4236
-:10313000AED80020C04309B0F0BC08BC184700005E
-:103140004C2A008000000080F0B5274D68690028F7
-:1031500006D02648006802F02BF8F0BC08BC1847DF
-:10316000234C0026A068234F002816D00FE0286AC1
-:10317000022802D3012038710FE0A660FDF7DEFEC1
-:103180000028EAD1286A022801D301203871E868B2
-:10319000002802D038790028E9D0686800281BD0C0
-:1031A0000120A060FEF7BCFB0028D6D1686800288B
-:1031B000F6D111E00028D0D1286A022802D30120DC
-:1031C0003871CAE7A660FDF7B9FE0028C5D1286AA4
-:1031D000022801D301203871E8680028BDD0387971
-:1031E0000028E7D0B9E700006C0600805C0400808E
-:1031F0004C2A00808C060080704700007047000059
-:103200007047000090B540201D49C046086001F09D
-:103210009DFC03231B07416819400C0F6101091B2A
-:103220008900184A8F1801213980816AC046796562
-:10323000416AC0467967B96CFA6C8918B964002193
-:10324000F964BA6B3B6DD218BA633965426A2032B1
-:103250005171796D7A6FD26DC0461160FCF7CAFF6B
-:103260002001094940181923DB01C018416B0139BD
-:103270004163786F01F0C6FB90BC08BC18470000A2
-:10328000000000B05C2B0080A01C0080F0B5402046
-:103290001249C046086001F059FC071C406803232E
-:1032A0001B071840060F7001801B80000C49441852
-:1032B000B86AC0466065786AC0466067806F051D61
-:1032C000E563B969281C02F089F9381C211C321CFD
-:1032D0002B1C00F020F8F0BC08BC1847000000B020
-:1032E0005C2B0080F0B54B6F9B6F1F1DCF63056893
-:1032F00000238469A40808D09C002E59C0463E5182
-:103300008469A40801339C42F6D83B1C00F003F802
-:10331000F0BC08BC1847FFB581B0041C1D1C0F1C75
-:103320004648016901310161F91D5131BD650091C6
-:10333000201CFDF75DFCF86D400936D2B86D067BA8
-:10334000437B1B021E431721490201730B0A43737F
-:103350000099201CFDF74CFCB86DC0460673330A7B
-:103360004373F86D400920D260680104090C03988A
-:1033700001F0CCFC6068324B18436060201C01F007
-:1033800035FD00257D60BD603D647D64201CFCF73B
-:1033900031FF38884023184338807D622948C04671
-:1033A000B862381C00F0A0FB44E0206801239B07B2
-:1033B000083818430068C046786460680204120C3C
-:1033C000786E0126C11D0D318A4202D23A64081C72
-:1033D0000EE041198989F023194009098900401834
-:1033E000F860F96161680904090C814216D23964F8
-:1033F00063681904090C401A033080088200A06138
-:10340000206809189B186360C31F053B381C00F037
-:10341000B6FA7E80201C00F0BFFB0BE0B968081AEA
-:1034200000257862BD62381C00F03CFC201C391C71
-:1034300000F064F805B0F0BC08BC18470C2B008005
-:1034400000000080010000C0F0B5041C0F1C386CA7
-:10345000F96B0D18216841180020A269002A0BD9C8
-:103460008200561801239B0733431B68C046AB50AC
-:10347000A26901308242F3D8786EF96B0918898904
-:10348000F0231940090989004018F860F9612068A3
-:1034900001239B07083818430168786CFCF795FFF7
-:1034A000786460680104090CF868814219D23964B3
-:1034B00063681904090C401A033080088200A06177
-:1034C000206809189B186360C31F053B381C00F077
-:1034D00056FA01207880201C00F05EFBF0BC08BC8E
-:1034E0001847B968081A78620020B862381C00F0E2
-:1034F000D9FB201C391C00F001F8EFE7F0B584B0CF
-:10350000041C0F1C8E4841690131416103200007F2
-:1035100061680840060F0A04120C20681118FB6845
-:10352000D21A7B689D1AC31F053B381C2A1C00F069
-:1035300026FA00207880201C00F02EFB60684019DD
-:103540000104090C6060301C01F0E0FB7D4E0B2390
-:103550001B02F0180069002819D000252D239B01BB
-:10356000F018C068002812D0AA0092192D239B01E0
-:10357000D218D268201C391C01F01CFE0135A800AD
-:1035800080192D239B01C018C0680028ECD1F86B6E
-:10359000011F8A1CFA63FA687D6C00F0BBF9C04316
-:1035A0000104090C281CFCF710FF0390F96B3A6E1C
-:1035B0008E182068121801927A6E8D1811180291D7
-:1035C000C81D0930E060B1880802090A0906090E21
-:1035D00008430004000C78616868010EFF221204A1
-:1035E0000240120A1143FF2212020240120211434A
-:1035F000000608433861A88909231B021840B861F6
-:10360000A8899843A881A8890299C046888100208A
-:103610007080B080708168602882B96E301CFCF7C1
-:10362000E8FE3886FA69301C291CFCF703FF78860F
-:103630003D8E788E0399FCF7C8FE00906068000408
-:10364000000C396E411A0904090C7A6E821A1304AF
-:103650001B0C1A021B0A1A431604360CBA68824263
-:1036600001D2002000E0101AB86008020912090611
-:10367000090E08430104090C0198C0464180281C2A
-:10368000FCF7A3FE051C0098311CFCF79EFE061CEF
-:1036900078690004000C0102000A08430104090CC7
-:1036A0000198C0468180281CFCF78FFE79690131A2
-:1036B000C0437961019AC04650813869010EFF22EA
-:1036C00012040240120A1143FF22120202401202A7
-:1036D000114300060143301CFCF777FE39697A6814
-:1036E00089183961B968002909D102998989BA69AB
-:1036F0001143029AC0469181B969FCF766FE2082A7
-:1037000000206082F86D410816D3800A0AD36068F1
-:1037100010380104090C0802090A08432168C04650
-:10372000088209E060680C380104090C0802090AE3
-:1037300008432168C046888104B0F0BC08BC184723
-:103740000C2B0080680E0080F1B584B06E4D2869A6
-:10375000012204998A409043286104984301181A71
-:103760008000161C69494418E06BC0460090A068B0
-:10377000002801D1002626E06548416901314161F8
-:103780000498FCF709FD071C03D128693043286120
-:10379000B5E0A0686568A84200D2051CA16CA942EA
-:1037A00016D2401A626A101A00266062A660A662EB
-:1037B00020884823184320800D1C09D1381CFCF7B1
-:1037C00019FD032060806660201C00F08DF996E0F2
-:1037D000E16838680918C31F053B201C02392A1C00
-:1037E00000F0CDF8381C00F0D7F9E0684619786889
-:1037F000304378600498311C01F088FA216E0098FB
-:1038000008180190701A0004000C616E711A0A0405
-:10381000120C1102120A11430904090C029101024F
-:10382000000A08430104090C0198C0464180208E1B
-:10383000FCF7CBFD061C608E0299FCF7C6FD0390D9
-:1038400060690104090C0802090A08430104090C13
-:103850000198C0468180301CFCF7B7FD61690131D9
-:10386000C04361610199C0464881606E0099461865
-:103870002069010EFF2212040240120A1143FF22A6
-:1038800012020240120211430006014371600398C4
-:10389000FCF79BFD216949192161A168491BA160C1
-:1038A00006D1B189A2691143B181A169FCF78DFDEF
-:1038B0003882616E386809180E31F960E268009943
-:1038C000043800F04CF802207882E06D410816D3ED
-:1038D000800A0AD3786810380104090C0802090A22
-:1038E00008433968C046C88109E078680C3801048B
-:1038F000090C0802090A08433968C046488105B026
-:10390000F0BC08BC18470000D02C00805C2B008065
-:103910000C2B0080F7B5031C0F1C00201C6826042C
-:10392000311C1D1DFCF751FD40C7029AD11C8908AE
-:1039300001394A1E029200290DD0210C10CD22041B
-:103940000A43111C161CFCF740FD40C702994A1E91
-:1039500002920029F1D103B0F0BC08BC18478008DE
-:10396000800089088900033293085A1E002B05D075
-:1039700008C908C0131C013A002BF9D17047FFB5E4
-:1039800086B0171C00260698806CC01B0699C0469E
-:1039900088640120C0050699896BC046019106998B
-:1039A0004C6B67E02168C04602916168C046039194
-:1039B000A168C046049102A94988B94208D202AD63
-:1039C0006D8802A949887F1A002102AB598019E04D
-:1039D00002A94988C91B02AB59803D1C002701215F
-:1039E0004906079B9A07920F0DD0EB06DB0E08D015
-:1039F0001E2B08D31E2B02D1032A04D101E0022A78
-:103A000001D301260021294301430A1C0091002013
-:103A10000399049A079B01F05BFF079949190791E5
-:103A2000002E0AD01D4AC04600921D48016D426D0D
-:103A30000020079B01F04CFF002602A840880028C8
-:103A40000CD00398401903900298C0462060039858
-:103A5000C04660600498C046A06003E00198013849
-:103A6000019010340698C046446301980699C046F8
-:103A700088630020002F02D00199002992D1094AC1
-:103A8000C04600920648016D426D0020099B01F07E
-:103A90001FFF0AB0F0BC08BC18470000010000027C
-:103AA0007C2900800400530290B50C1C071C386868
-:103AB00001239B07083818430168388AFCF785FC06
-:103AC000C043F968C0460880788A3968081A3860A7
-:103AD000381C01F08BF9381CFCF78CFB201CFFF71D
-:103AE00033FE90BC08BC184780B501888A0921D3F1
-:103AF000CA091FD28A081DD3002101804180476F67
-:103B0000406DFA1D19325171FA6DC04610603A6E5F
-:103B1000C04610600C48C0468163C16B490849002B
-:103B2000C163012000F0CCFF381C00F06BFF80BCAB
-:103B300008BC184780231943018001884909F6D23F
-:103B400000F0B0F8F3E70000E80E0080F0B5071CC5
-:103B5000101C0D1C00245E1E002B19D00168C046ED
-:103B6000396041880C194168C04679608168C04657
-:103B7000B960C168C046F96010301037E96A814207
-:103B800002D8281C00F0ECFF311C013E0029E5D1D1
-:103B9000201CF0BC08BC18470021C16105490A6817
-:103BA000002A01D1086002E04A68C046D06148603E
-:103BB00070470000D02C008003490868002802D01C
-:103BC000C269C0460A607047D02C0080002181671E
-:103BD00005498A68002A01D1886002E0CA68C046A7
-:103BE0009067C86070470000D02C00800349886847
-:103BF000002802D0826FC0468A607047D02C0080B7
-:103C000000B580201349C0460860FFF7D5FF0028A3
-:103C10001BD003231B07416819400A0F5101891A61
-:103C200089000D4BC9184B88002B04D1111CFFF7DC
-:103C30003BFF08BC1847012B02D1FFF705FCF8E752
-:103C4000022BF6D1FFF74EFBF3E70448016D01317B
-:103C50000165EEE7000000B05C2B0080A0822040F0
-:103C600000B520200D49C0460860FFF7BFFF0028BF
-:103C70000ED0018820231943018001881023994325
-:103C800001800188090A01D3FFF72EFF08BC1847FD
-:103C90000348016D01310165F8E70000000000B044
-:103CA000A082204098B5071C2248C04600902248B8
-:103CB000C31D4133416D826D806C0003000B9C6815
-:103CC00001239B0723431B68984200D10CE09842D4
-:103CD00003D9101A591A411800E0191A01201029A5
-:103CE00000D8002000281FD0786AF96AC046086012
-:103CF000B86AF96AC0464860104AC0460092FB6A3A
-:103D00000F48426D0320396A01F0E2FD3888102324
-:103D1000184338803888402398433880381CFFF790
-:103D200055FF98BC08BC1847388840231843388092
-:103D3000F7E7000055555555A8030080080011020B
-:103D40007C290080B0B540202C49C046086000F0B6
-:103D5000FDFE071C406803231B071840050F680180
-:103D6000401B8000264944182088022318432080E5
-:103D70002088410834D3400840002080A06CE16CCA
-:103D80004018A0640020E064A16B226D8918A16333
-:103D90002065B86AC046606503231B077868184031
-:103DA000786061683631942904D8382318437860E4
-:103DB000382003E09423184378609420B861396870
-:103DC00078680204120C201CCB1F053BFFF7D7FDBF
-:103DD00002206080381CFFF7DFFEB0BC08BC18472B
-:103DE000381CFCF707FA2801064940181923DB01A3
-:103DF000C018416B01394163EFE70000000000B0DB
-:103E00005C2B0080A01C008090B500270F4C0DE0BB
-:103E1000426B013A4263002A05DC026BC0464263F2
-:103E2000C06A01F0C6F901370B2F07D2380100191B
-:103E300033239B01C018816A0029E9D10120400683
-:103E40000349C046086090BC08BC1847680E008053
-:103E5000000000B01048C1680131C1600F49C86856
-:103E6000012817D1C81D79300289002A12D0013AE1
-:103E700002810289002A0DD14289002A08D1C96F26
-:103E800002230A681A430A6004210181012100E02B
-:103E9000002141817047000008832040680E0080A7
-:103EA000B0B5071C0123F81D693003731E48C21DFD
-:103EB0007932548A611C5182D58A0021AC4204DBDC
-:103EC000C41D893463705182D18301239B073A6DED
-:103ED0001A431268C046BA61FB699A4206D1F86C6F
-:103EE0001249C0460860B0BC08BC184779614169F6
-:103EF000FA6C9143416101200005C16038690228D4
-:103F0000F1D0B869F969411A01D5786D4118381CAA
-:103F100000F00EF8F9690918F961786D8142E2D371
-:103F2000081AF861DFE70000680E0080000000B0AA
-:103F3000F8B5041C0F1CFF2321339F4201D9FF2732
-:103F40002137E16E381C01F0CBFC2D4D002813D138
-:103F5000E01D4930017A012319430172294AC04604
-:103F600000922948016D426D00202B1C01F0B0FC2D
-:103F70000020F8BC08BC18472069013020612349A3
-:103F8000C81DB930026B92005118C0310F61016B2E
-:103F900001318907890F0163206BC219616D8A4263
-:103FA00003D8232212053A4305E0091A7E1A07D1E5
-:103FB000232212050A430092616E0918A26E10E0D6
-:103FC000112252050A430092616E09180020A26E68
-:103FD0002B1C01F07DFC2322120532430092616EFE
-:103FE000A26E00202B1C01F073FC206BC01900098D
-:103FF0000001616D814200D8401A2063381CB8E787
-:104000004480204004001B027C290080680E008050
-:1040100080B50120C0030D49C04608600C49C81D89
-:104020004930027A0027002A03D00772081CFFF7E4
-:1040300037FF0849C81D4930027A002A03D00772A9
-:10404000081CFFF72DFF80BC08BC1847000000B01B
-:10405000642D0080E42C008090B5071C10201849C6
-:10406000C0460860F8680130F8601648C41DB934CD
-:10407000616B89000918C03109697A689200D21908
-:104080005164616B89000818C0300169786880004C
-:10409000C019C06B01F0A2FA01237868584078601B
-:1040A000606B01308007800F6063F81D1930407924
-:1040B000002802D1381C00F007F890BC08BC184753
-:1040C000000000B0680E008090B5071C3948C06839
-:1040D000002805D0B86AC068800901D3022000E03A
-:1040E000786FFCF759F8041C06D10120F91D19312D
-:1040F000087190BC08BC1847F86C2F49C04608608E
-:10410000BA6A381C211C00F059F86762002803D1F4
-:10411000201C00F00BFDECE7F96D0968091809098E
-:1041200009017A6D8A4200D8891AA162B9688900AA
-:10413000C9194A6C002A07D04A6C121A4A648008CE
-:104140008000B96A0818B8623868B96A8000C01976
-:10415000426B91420ED300214164B86A39688900EC
-:10416000C919496B401AB862B9688900C919C96B85
-:104170004018B862B8688100C919496C0029B8D1E3
-:10418000B96AFA6B9142B4D03A6C9142B1D0012332
-:104190005840B8608000C019C06BC046B862F8686B
-:1041A000002801D00138F86038690028A1D0013812
-:1041B00038619EE768190080000000B0F7B590B044
-:1041C000041C0D1C00200590029000220192F94869
-:1041D000C06AC046A861A06881000919496BC04641
-:1041E0002060E162129AD068C046A860129A5178A5
-:1041F000C0460C91F048C0460390D71D0937E06ACD
-:10420000C11B0909E31D19330C9AC0460F93EB4BF0
-:10421000C0460E93914201D3B84221D8E1680229E9
-:104220001ED201200F99C04648710020039901F069
-:1042300057FB002803D10E9BD86B0130D8630120B7
-:10424000800600276860AF61DD4AC0460092DD4805
-:10425000016D426DDC4B002001F03AFB381C5CE341
-:10426000B84203D8201C00F07BFC071CD748C0686C
-:10427000002864D038784007400F032860D10598A3
-:1042800001300006000E05903878F023184058D110
-:10429000E06AC01B00090C99884202D2E06802283B
-:1042A00005D3CB49886800F083FF061C06D1039B29
-:1042B000281C391C221C00F08BFC16E12E62F868C9
-:1042C00000280DD0B889002803D0C149C96800F082
-:1042D00070FFF889002803D0BD49C96800F069FF64
-:1042E0007A68C0467261B968C046B161301CB8498D
-:1042F000096800F05EFF002817D1301CB4494968F6
-:1043000000F057FF1037E06AB84203D8201C00F0D5
-:1043100027FC071C6868AF4B184368600020A86141
-:10432000AC23A8689843A860B0E0A869A82801D287
-:10433000A820A8611037E06AB8426CD89CE0A5E0DC
-:10434000A4E0102868D103231B0768681840010FF8
-:104350004801401A8000A04A821801927888420BD6
-:1043600031D3820B2FD39D48C04603900220019A7F
-:10437000C046108078880005000D019AC046506044
-:10438000B868019AC04690607868019AC046106289
-:104390000020019AC0469064019AC046906388024A
-:1043A0008F494018019AC0465063019A50683630D0
-:1043B000942801D8382000E09420A8611037E06AE2
-:1043C000B84228D858E07A88920B03D38548C04673
-:1043D000039023E0012212030240834B1DD003937C
-:1043E0000005000D019AC0465060B868019AC046A9
-:1043F00090607868019AC04610620020019AC04619
-:104400009064019AC0469063880275494018019AE9
-:10441000C046506302E033E02AE0039301200F9985
-:10442000C0464871129A50780599431A0B93103779
-:10443000E06AB84203D8201C00F092FB071C019AE6
-:10444000506B916B090140180B9B211C3A1CFFF724
-:104450007DFB019AC046D064019A0B9BC046136550
-:1044600001235B066868184368600020A8610DE0BE
-:104470001037E06AB84203D8201C00F071FB071C1B
-:1044800038784007400F032800D1F8E6A86903995F
-:1044900001F026FA00282AD1381C211C00F079FBF3
-:1044A000A868800904D3301C4949496800F081FE9E
-:1044B0004149002001F014FA002804D10E9BD86B6A
-:1044C0000130D86311E001200F99C0464871800681
-:1044D00000276860AF613A4AC04600923948016DD2
-:1044E000426D394B002001F0F3F9002015E20598E8
-:1044F0000C99081A0004000C0C900B900C980028E2
-:1045000003D001200F99C04648712868C046049026
-:1045100000260020089000220A920C9801380D9085
-:10452000A3E078888A1B1204120C904205DD0792E2
-:10453000801A0004000C089000E0079008980028FA
-:1045400007D10D980A9A904207DD079830188842E3
-:1045500003D80120400506901CE01120400506907C
-:10456000A8688C23184002D12048C0460690B107A5
-:10457000890F0FD00798C006C00E08D01E2809DB8F
-:104580001E2802D1032905D101E0022902D301200E
-:104590000290DEE70A9A002A04D10123DB0506987F
-:1045A00018430690079806990843021C0090049847
-:1045B00083191DE0E80E00800149FFFF280F0080ED
-:1045C000040012027C290080448020406819008089
-:1045D00060040080000000805C2B00805532FFFFEB
-:1045E000AC5E21400D3DFFFFCD31FFFF00003202E8
-:1045F00000203A1D06CA01F06BF907983618029898
-:10460000002816D0A8688C23184004D109235B0425
-:104610000698184306900698C24A024300920498EE
-:104620008319C148016D426D002001F051F900204D
-:104630000290089800280BD10B9B013B0B9310377D
-:10464000E06AB8420CD8201C00F08AFA071C07E088
-:104650007868079A801878607888079A801A788036
-:104660000A9A501C0204120C0A920C980A9A82426E
-:1046700003DAA969B14200D953E7A869B0426BD106
-:10468000A868010969D2089A002A56D00C990A9A9A
-:104690008A423EDBB107890F0CD0089AD206D20EAF
-:1046A0000BD01E2A06DB1E2A02D1032905D001E009
-:1046B000022902D20299002921D0089AC04600920C
-:1046C0000498831900203A1D06CA01F001F90898E0
-:1046D0003618A8688C23184002D00120400600E05C
-:1046E0009248012202430092049883198E48016D7A
-:1046F000426D002001F0ECF80020029015E08C23C0
-:10470000184002D00120400600E08848089A024381
-:1047100000E0089AC04600920498831900203A1DD0
-:1047200006CA01F0D5F8089836181037E06AB84282
-:1047300003D8201C00F014FA071C6868800E6BD2A6
-:104740000A98C04609900C9988425CDA0D9809993C
-:10475000884203D07A881EE05FE05EE0788801221C
-:1047600052060243A9688C23194002D109235B0435
-:104770001A43B107890F0ED0C306DB0E08D01E2BDB
-:1047800009DB1E2B02D1032905D101E0022902D346
-:1047900001210291021C0998002802D10123DB05A6
-:1047A0001A4300920498831900203A1D06CA01F0AA
-:1047B0008FF87888861910370298002814D0A868D6
-:1047C0008C23184002D00120400600E05748012207
-:1047D00002430092049883195348016D426D0020F2
-:1047E00001F076F800200290E06AB84203D8201C5D
-:1047F00000F0B6F9071C099801300004000C09907C
-:104800000C998842A2DB686830430104090C686097
-:10481000E86A00F07BFA28E027E0A868000914D3D2
-:104820006868800E15D2019A002A12D0019A506B46
-:104830000B9B211C3A1CFFF789F9019AC046906432
-:10484000019A0B9BC046936303E0E86A311C00F0B9
-:104850005DFA686830436860A869B04205D9000411
-:10486000000C801B00F0EEF9AE61A8688C231840A4
-:104870000BD02F4AC04600920498C31F053B2A481C
-:10488000016D426D002001F023F801239B07206D8C
-:1048900018430068C046A061E169814212D02269D4
-:1048A000022A0FD2411A01D5606D4118201CFFF772
-:1048B0003FFBE1694018E061616D884224D3401AF2
-:1048C000E06121E081421FD1206902281CD2012031
-:1048D000606118484169E26C0A4342618169E36C96
-:1048E0009943816101210905CA608069C046086158
-:1048F0008B02206D18430068C046A061E1698142C7
-:1049000002D0201CFFF7CCFA281C00F00FF90C98FD
-:104910000599401800011030686113B0F0BC08BC64
-:1049200018470000010000027C29008000001202EC
-:1049300004005202680E0080F0B540202D49C046A8
-:10494000086000F003F9071C8169446AA06F00F059
-:1049500045FE0020E11D193148717968C90E09D35F
-:10496000F86A000124494018244BC0180168013935
-:10497000016036E0E16D0968226EC0461160204E8C
-:10498000F51D79350123E96B1943E963B96AE26DD5
-:10499000C0461160B96A226EC04611606169002983
-:1049A00004D1A96B0131A963082907D3A8630120A9
-:1049B00000F086F8E86B40084000E8637868810EF4
-:1049C0000FD20B231B02F118C968002906D000087A
-:1049D00004D2201C391C00F043F802E0381C00F01F
-:1049E00005FA381CFBF706FC201C00F00BF8F0BCA5
-:1049F00008BC1847000000B0A01C0080B40C0000E8
-:104A0000680E008080B5071CF81D19300179002957
-:104A100004D000210171381CFFF756FBF86802280A
-:104A20000DD0B8688000C219506C002811D0B86A47
-:104A3000417809011031526B101A884205D3381C95
-:104A4000FFF742FB80BC08BC1847381CFFF728FA68
-:104A5000F8E778688000C019C06BC046B862F1E71B
-:104A6000B0B587B00F1C806FC04600900024134D76
-:104A70000B231B02E8188069002817D06946A200A2
-:104A800052190B231B02D2189269381C00F092FBBA
-:104A9000002809D10134A00040190B231B02C018C3
-:104AA00080690028EAD101E0012802D0381C00F01A
-:104AB0009DF907B0B0BC08BC18470000680E008024
-:104AC000B8B5C207D20F164C164901D0082208E02B
-:104AD000820805D30C22A4180B68DF1D153703E0EC
-:104AE0001C220B68DF1D09370F4B1D78002D13D0DA
-:104AF0005B78002B10D001235B061A43002801D1FC
-:104B00005B081A4300924A680120391C231C00F0FC
-:104B1000DFFEB8BC08BC184703231B061A43F1E7A5
-:104B200090EE20407C290080F80E00800021C161B9
-:104B300005498A68002A01D1886002E0CA68C04637
-:104B4000D061C86070470000280F00800349886862
-:104B5000002802D0C269C0468A607047280F0080D2
-:104B6000011C0123886858408860CA68013ACA60FD
-:104B70000A69013A80000A614218D06B536BC04643
-:104B8000CB620B689B005918496C536CC91851646F
-:104B900070478A6892005218D36B834217D1D01D98
-:104BA0003D300A6892005218526C03689A1A0260EB
-:104BB0000123886858408860CA680132CA600A695F
-:104BC0000132800040180A61406BC046C8627047DD
-:104BD000B8B5041C1D1C171C081C391CFFF7D9FF95
-:104BE0000020291C00F07CFE0120F91D19314871BC
-:104BF000800660600020A061064AC0460092064818
-:104C0000016D426D054B002000F062FEB8BC08BC8F
-:104C100018470000040012027C29008044802040D4
-:104C200006490A681018086001235B02984203D9FC
-:104C300003490A7901320A7170470000E42D0080AF
-:104C4000A08220408008800006490A681018086089
-:104C500001235B02984203D903490A7901320A71A0
-:104C600070470000E42D0080A082204003308008BF
-:104C7000800006490A681018086001235B02984208
-:104C800003D903490A7901320A717047E42D008083
-:104C9000A0822040024841790131417170470000F3
-:104CA000A082204090B48200174B9A588B0702D004
-:104CB00089080B1D01E08908CB1C1169D768124CCB
-:104CC000800020584068B94203D1814219D9116847
-:104CD00017E00024B94209D9814212D91168781A23
-:104CE00000D50330801098420BD807E0814205D8E8
-:104CF000781A00D503308010984202D8201C90BC4E
-:104D00007047C81D0530FAE77004008080B5800048
-:104D10000F4A1758880702D08808043001E0880835
-:104D2000033039697A68914209D93968C0463961D6
-:104D3000F9687A68914202D93968C046F960810001
-:104D4000386900F0D1FD386180BC08BC184700000C
-:104D50007004008090B50321090701400C0F010485
-:104D6000090C012292070240A3001C4FFF5889073B
-:104D7000890F0004000C8008002900D00130002AAF
-:104D800001D0023000E00330F9687A68914202D91C
-:104D90003968C046F9608100F86800F0A5FDF86048
-:104DA0000F480069002805D00120A04002D0201C37
-:104DB000FEF7CAFC0B49C81D193003790022002BED
-:104DC00005D10949C81D19300379002B03D00271A0
-:104DD000081CFFF779F990BC08BC184770040080E4
-:104DE000D02C0080642D0080E42C0080B0B52B49CD
-:104DF0000979002903D14168294B19434160816831
-:104E0000490802D30921090401E00D2109040CC855
-:104E1000083819438768BB0A03D343685B0800D38B
-:104E20000131406803231B071840070FF8001D4C91
-:104E300000192368C01850300079012810D160682B
-:104E400001280DD0101C00F071F838010019192349
-:104E5000DB01C018416B01394163B0BC08BC184785
-:104E6000380100191923DB01C018036B5D1C0563B1
-:104E7000BD022D19DB00EB1880331963DA62816BF8
-:104E8000013181630121B940226811432160016B26
-:104E90008029E2D300210163DFE70000280F0080B2
-:104EA00000000080A01C0080F0B51F4E7068002834
-:104EB00036D10024B168481CC9008919B060326835
-:104EC000891860310D7B082800D3B460280180194F
-:104ED0001923DB01C018876B002F21D0C16A4B1C3E
-:104EE000AA029219C90051188031C362CA6A096BBB
-:104EF000013F8763802B00D3C462002F06D10127B6
-:104F0000AF403B1CDB4337683B403360436B013BA6
-:104F10004363101C371C00F009F878680028C9D0DA
-:104F2000F0BC08BC18470000A01C0080F0B5CD0FF5
-:104F3000ED07012400272E4B2E4A002D1DD0D86AE4
-:104F40000130D862101C5269002A12D00269531C29
-:104F50009200121803619161416901314161026956
-:104F60000F2A00D307610F2900D34460F0BC08BCAE
-:104F70001847081CFFF7EEFEF8E715696E1CAD0038
-:104F8000AD181661A96155690135556116690F2E75
-:104F900000D317610F2D00D354608C02A40A164F62
-:104FA0003A6FFD68F91D7931012D0CD1DB6D5B087D
-:104FB00009D30B89002B06D1FD6F033B2E683340CC
-:104FC0002B6014230B8110608007800A20430304A8
-:104FD00000D001385060096A0832914200D8074A6F
-:104FE000000D02D35120800382613A67BEE70000C2
-:104FF000A42A0080A01C0080680E008024A7204006
-:10500000B0B5002804D10120C0051649C04608608B
-:10501000154C00256769002F16D0E068411C800000
-:105020000019E1608069013FFFF794FEE0680F28F6
-:1050300000D3E560E068800000198069000801D3B2
-:10504000002FEAD1676103E00848016D0131016575
-:1050500065602068002801D0FFF726FFB0BC08BCBF
-:1050600018470000000000B0A01C0080A082204073
-:1050700000207047B0B41023826813400021002B39
-:1050800015D00C4B1A401201812414430268156894
-:10509000131D80CB1B68043A026020C280C208C284
-:1050A0001460426801239B0704321A434260081CC3
-:1050B000B0BC704700F0FF0FF0B48268530934D3DE
-:1050C0001B4B1A4012018126164303681D681F1DE1
-:1050D00010CF3F68043B036020C310C380C31E6031
-:1050E00043681F1D01239B073B434360CB6B181F85
-:1050F000C86380CB80C01C681F1D031D0460381C62
-:105100003F68C0461F601F1D43681C04240C812398
-:1051100023433B604068000C000410437860086E35
-:1051200004300866486E043048660020F0BC7047C2
-:1051300000F0FF0F80B4816A01239B07CA1D05326E
-:105140001A431268CF1D01373B431B68C046CB6032
-:1051500001239B070F1D3B431B68C0468B60012347
-:105160009B070B431B680CC10262016BC0460A62BD
-:105170000423816919438161026BC0469161816A90
-:1051800004318162026BC0469162C11D39314A8B84
-:10519000043A4A83498B026B40325183C1890439F6
-:1051A000C181C168006BC046C160002080BC7047EF
-:1051B00000470847104718472047284730473847D7
-:1051C00030402DE90CC09DE50C48A0E12448B0E139
-:1051D0001E00000A01C04CE21840A0E364519FE5A4
-:1051E000945020E0005090E5144090E5003085E5B3
-:1051F00004C085E5081085E50C2085E5101090E5D4
-:10520000105085E2010055E10C509055040055E125
-:105210000500000A041090E5005080E5005081E58B
-:105220000000A0E33040BDE81EFF2FE1003093E511
-:10523000082090E5013183E3023683E3030055E162
-:10524000143080E5F2FFFF1A0100A0E3F4FFFFEA4B
-:1052500001061CE3F1FFFF0AEC109FE502C6CCE358
-:10526000542091E5E4309FE5501091E5D9FFFFEA25
-:10527000F0472DE920C09DE50C68A0E12668B0E16B
-:105280002500000A1840A0E3B8509FE5940000E014
-:10529000050080E0084090E5048090E50070A0E300
-:1052A0001FC0A0E302C48CE3005090E5109090E58D
-:1052B00014A090E5003085E504C085E5081085E57B
-:1052C0000C2085E5105085E2090055E10C50905501
-:1052D0000A0055E11500000A037017E2201081E270
-:1052E000203083E20A00000A006096E2017087E243
-:1052F0000900000A206046E2200056E3ECFFFFCAE6
-:105300000070A0E301C046E202C48CE30060A0E3A9
-:10531000E7FFFFEA005088E5F2FFFFEA0010A0E394
-:10532000005080E50100A0E1F047BDE81EFF2FE13D
-:1053300000A094E50A0055E114A080E5E5FFFF1AFE
-:105340000110A0E3F5FFFFEAA80300807C2900809C
-:105350000080204068829FE50B92A0E364A29FE555
-:1053600058B09AE50EF0A0E154B09AE51EFF2FE187
-:105370003F402DE900004FE11F0000E2120050E322
-:105380005400000A00000FE18000C0E300F021E1BA
-:105390000450A0E3004099E5090000EA020014E38C
-:1053A0005300001B800014E35900001B200014E38D
-:1053B0005900001B020714E35900001B010614E307
-:1053C0005900001B080014E34500001B020514E30C
-:1053D0004A00001B020814E34B00001BE50E14E317
-:1053E0000700000A042098E50C1098E5043052E20A
-:1053F0003C30A0B3043088E5020091E70FE0A0E163
-:1054000010FF2FE1015055E20300000A004099E52A
-:105410000C009AE5000014E11BFF2F1108009AE52B
-:10542000000014E10B00000A010C14E398019F1521
-:105430000FE0A01110FF2F11020414E38C019F153F
-:105440000FE0A01110FF2F11010914E380019F1537
-:105450000FE0A01110FF2F1104009AE5000014E1E5
-:105460001600000A54E08FE2040014E340009A158D
-:1054700010FF2F11020A14E344009A1510FF2F1198
-:10548000020914E348009A1510FF2F11010214E3DA
-:105490004C009A1510FF2F11010414E350009A15C7
-:1054A00010FF2F11010A14E32100001B020014E376
-:1054B0000E00001B10009AE5000014E11C00001B08
-:1054C000004099E50450A0E3004094E21BFF2F1137
-:1054D0003F40BDE804F05EE2C00080E300F061E11F
-:1054E000FAFFFFEA18009AE51C109AE511FF2FE178
-:1054F00054B09AE51C109AE514009AE511FF2FE1CB
-:1055000020109AE50000A0E311FF2FE124109AE596
-:1055100011FF2FE128109AE511FF2FE12C109AE5D9
-:1055200011FF2FE130109AE511FF2FE134109AE5B9
-:1055300011FF2FE1FEFFFFEA38E09AE53C109AE503
-:1055400018009AE511FF2FE138E09AE53C109AE542
-:1055500014009AE511FF2FE164209FE5003092E5E9
-:10556000003053E00A0000BA003082E50C0092E5FA
-:10557000083092E5001091E20300000A031080E772
-:10558000043053E23C30A0B3083082E50100A0E3D0
-:105590001EFF2FE13C109FE5000091E5010080E235
-:1055A000000081E50000A0E3F8FFFFEA10009FE59E
-:1055B000081090E5041051E23C10A0B3081080E5FB
-:1055C0001EFF2FE1E42D0080CC040080712BFFFF33
-:1055D000D13DFFFFC92BFFFFA0822040C91C8908D5
-:1055E00089000123854A5B07184313685B18136021
-:1055F000001F81A35B1A18470420A0E50420A0E542
-:105600000420A0E50420A0E50420A0E50420A0E5F6
-:105610000420A0E50420A0E50420A0E50420A0E5E6
-:105620000420A0E50420A0E50420A0E50420A0E5D6
-:105630000420A0E50420A0E50420A0E50420A0E5C6
-:105640000420A0E50420A0E50420A0E50420A0E5B6
-:105650000420A0E50420A0E50420A0E50420A0E5A6
-:105660000420A0E50420A0E50420A0E50420A0E596
-:105670000420A0E50420A0E50420A0E50420A0E586
-:105680000420A0E50420A0E50420A0E50420A0E576
-:105690000420A0E50420A0E50420A0E50420A0E566
-:1056A0000420A0E50420A0E50420A0E50420A0E556
-:1056B0000420A0E50420A0E50420A0E50420A0E546
-:1056C0000420A0E50420A0E50420A0E50420A0E536
-:1056D0000420A0E50420A0E50420A0E50420A0E526
-:1056E0000420A0E50420A0E50420A0E50420A0E516
-:1056F0000420A0E50420A0E50420A0E50420A0E506
-:105700000420A0E50420A0E50420A0E50420A0E5F5
-:105710000420A0E50420A0E50420A0E50420A0E5E5
-:105720000420A0E50420A0E50420A0E50420A0E5D5
-:105730000420A0E50420A0E50420A0E50420A0E5C5
-:105740000420A0E50420A0E50420A0E50420A0E5B5
-:105750000420A0E50420A0E50420A0E50420A0E5A5
-:105760000420A0E50420A0E50420A0E50420A0E595
-:105770000420A0E50420A0E50420A0E50420A0E585
-:105780000420A0E50420A0E50420A0E50420A0E575
-:105790000420A0E50420A0E50420A0E50420A0E565
-:1057A0000420A0E50420A0E50420A0E50420A0E555
-:1057B0000420A0E50420A0E50420A0E50420A0E545
-:1057C0000420A0E50420A0E50420A0E50420A0E535
-:1057D0000420A0E50420A0E50420A0E50420A0E525
-:1057E0000420A0E50420A0E50420A0E50420A0E515
-:1057F0000420A0E50420A0E51EFF2FE1E42D008099
-:1058000098009FE598109FE5012040E094309FE5C7
-:10581000000091E5030050E10300001A041081E24A
-:10582000042052E20000000AF8FFFFEA78009FE53A
-:10583000002080E574009FE574109FE5012040E0A2
-:1058400060309FE5000091E5030050E10300001A7D
-:10585000041081E2042052E20000000AF8FFFFEA8F
-:1058600050009FE5002080E54C009FE54C109FE52F
-:10587000012040E02C309FE5000091E5030050E15D
-:105880000300001A041081E2042052E20000000A22
-:10589000F8FFFFEA28009FE5002080E51EFF2FE1CA
-:1058A0007C34008080300080ADDEADDEC00400803E
-:1058B000FC37008080340080C4040080FC3F0080FE
-:1058C00040380080C80400807847000071EAFFEA91
-:1058D0007847000039FEFFEA7847000063FEFFEAE0
-:1058E000784700001BFFFFEA784700006BEAFFEAF9
-:1058F00000000000FFFF00000000008028040000FE
-:10590000F83D00000001008000FF000000000000E2
-:10591000B90BFFFF00000000D50BFFFF03FF06548B
-:10592000030000007504FFFF00000000A105FFFF59
-:1059300004FF075403000000B504FFFF000000004F
-:10594000F105FFFF05FF0554030000003904FFFFC8
-:10595000000000005505FFFF01FF040003000000E8
-:105960004118FFFF00000000610EFFFF02FF020868
-:1059700000000000A102FFFF00000000F102FFFF95
-:10598000FFFF0144030000000000000000000000D1
-:105990009D0DFFFF0600FF00000000003D50FFFFCF
-:1059A0008150FFFF00000000FFFFFF00000000002B
-:1059B000000000000000000000000000FFFFFF00EA
-:1059C00000000000000000000000000000000000D7
-:1059D000FFFFFF00000000000000000000000000CA
-:1059E00000000000000000000000000048050080EA
-:1059F000117521401B7521403175214049752140A9
-:105A000055752140637521407D752140A975214060
-:105A10006D762140C5762140D3762140DD76214048
-:105A2000E776214099772140A7772140B57721403B
-:105A3000617821405F7C2140E97C2140897D2140C3
-:105A4000BD7E2140C97E2140297F21408D7F21409C
-:105A5000B97F2140DD7F21401D80214045802140CC
-:105A60008D8021409D802140C5802140D5802140EE
-:105A70001D8121405B812140B18121401182214063
-:105A80001B8221401F8221408D822140D9822140EA
-:105A9000318321406D832140D183214009842140FD
-:105AA0001984214051842140618421407584214022
-:105AB0009D842140A7842140B18421401585214047
-:105AC0004585214051852140C5852140CF85214014
-:105AD000D9852140E3852140ED852140F78521408E
-:105AE000018621400B8621401586214001892140F5
-:105AF0001F86214029862140338621403D86214052
-:105B0000658621406F862140D1862140DB86214079
-:105B1000E5862140EF862140F98621409D74214091
-:105B20000387214069872140B5872140F9872140BB
-:105B3000098821409D742140558821405988214081
-:105B40005D882140B5882140DD882140E9882140D9
-:105B5000ED882140F1882140F5882140F9882140D5
-:105B6000FD8821402D852140898521409D7421405B
-:105B70009D7421400D8921409D742140E174214094
-:105B80009D7421409D7421409D7421409D7421404D
-:105B90009D7421409D7421406B782140F57B21400C
-:105BA000317C2140000000000000000000000000E7
-:105BB000000000005C0118405801184024A3204058
-:105BC00024A7204000000000000000006C011840E5
-:105BD000680118402483204024A3204000000000D6
-:105BE000000000007C01184078011840000000000F
-:105BF0000000000000000000000000008C011840C0
-:105C00008801184024A9204024AB20400000000057
-:105C10000000000000000000080012001800120040
-:105C20000C0012001C00120024A82040A4A8204050
-:105C3000A4A8204024A9204000000000D1A82140B1
-:105C40002DAA21400000000089702140C9A12140F7
-:105C50000000000000000000010000000000000043
-:105C600057892140D1A82140C52FFFFF0521FFFF03
-:105C7000EF20FFFF59A72140342E0080482E0080DE
-:105C80005C2E008030333A31313A31310030372FD9
-:105C900032332F3031003030303031353639004337
-:105CA0006F707972696768742028632920323030F8
-:105CB000312033436F6D20436F72706F726174696E
-:105CC0006F6E0A00081000030000000000000000D2
-:105CD000000000008C53FFFF27F07DFD0001000253
-:105CE000DA0E820001406404642D0080E42C008000
-:105CF000693EFFFFC94FFFFFD524FFFFC93BFFFFF0
-:105D0000293CFFFF191AFFFF6511FFFFCC53FFFF6E
-:105D10002140FFFF8970214049722140D93FFFFF98
-:105D2000219A21408524FFFF6453FFFF8C53FFFF1E
-:105D300000000000FFFF0000803000800000000035
-:105D4000FFFF000000002040B05000007B0E00006C
-:105D5000006E21400000000000000000ED8921409D
-:105D60008B892140A58C2140058D2140CD8D21407E
-:105D70008B8B2140A98E2140158F2140698B2140BA
-:105D80000000000000000000000000000000000013
-:105D90000000000000000000000000000000000003
-:105DA0000000000059BD2140C1BD21402DBE214051
-:105DB00000200A4A0B231B02D1182D239B01D31864
-:105DC0008861D860D8638032C86008614861D06259
-:105DD0000348C0464860886070470000680E008035
-:105DE000FE030000F0B584B00C1C051C00230093DA
-:105DF000FFF7DEFF68490B231B02CF1878682840A5
-:105E00000022F8603A61BA6822407A610C1C4109AC
-:105E100003D2510901D2800A02D3604800F0C2F8CF
-:105E20000120F968490903D27969490900D20020A3
-:105E30000006000E03F0D4FAF868002870D00023A2
-:105E400002930193544A01231843F8600020D51DA2
-:105E500079350395012400214F4DFA68224039D04D
-:105E60008A00521892004E4B9B5C1E1C834204D049
-:105E70004B4BD3185B7883422CD1494BD218D37843
-:105E8000039DED6AAB4202D9039DC046EB625368A5
-:105E90005B0801D30123009386420AD19568029BD7
-:105EA0005E1C02969B003C4E9E190B231B02F318AE
-:105EB0009D61537883420DD1D268019B5D1C019591
-:105EC0009B00354D5D192D239B01EB18DA603A6973
-:105ED00001323A61640001310B29BDD30130092838
-:105EE000B8D30020029B99002B4A89180B231B0270
-:105EF000C9188861019B990089182D239B01C91835
-:105F0000C860009B002B0CD1810089180B231B0259
-:105F1000C918CB69C0468B6101300B28F4D308E067
-:105F200007E0039DE86A302803D23020039DC04675
-:105F3000E862194A786900282AD000210123184311
-:105F40007861002001240022134E7B69234010D089
-:105F500093009B189B00124D5B199D78854208D1D8
-:105F60001D690B1C9B009E192D239B01F318DD63FB
-:105F70000131640001320B2AE6D301300928E1D354
-:105F800000208900044A89182D239B01C918C86381
-:105F900004B0F0BC08BC1847680E00803053FFFF07
-:105FA0000001008000470847104718477847C0465F
-:105FB00018C09FE51CFF2FE17847C04610C09FE541
-:105FC0001CFF2FE17847C04608C09FE51CFF2FE16A
-:105FD0003852FFFF8851FFFFD5B02140F0B50420B3
-:105FE0001A49012508601A4FBB231B01F8180573D5
-:105FF0001848416B2C0500207A6E174B8A421DD041
-:10600000197B002917D1D91DFF313A3149781E1C5F
-:10601000002910D1B06010207060104A1049FFF7BD
-:10602000C3FF002807D035730423B8691843B8614B
-:10603000206100F017F8F0BC08BC1847187304235F
-:10604000B8699843B8612061F5E70000000000B02E
-:10605000680E008000011840280500802055FFFFD1
-:106060007D712140F8B5154F396C1548406E0C1AFA
-:10607000144E7168144DA14206D8144A0A43009286
-:10608000B96B0918FA6B11E01122520522430092F4
-:10609000B96B09180020FA6B2B1CFFF78DFF706895
-:1060A000001B0A4A02430092B96BFA6B00202B1CBA
-:1060B000FFF782FFF8BC08BC184700007C2900806D
-:1060C000680E0080280500804480204000003702D0
-:1060D000F0B52B4FB8687968C0192030294AFFF70E
-:1060E00063FF0120C0022849C0460860B968381C17
-:1060F000264D0024264EEF1D7937002931D1316815
-:106100000A78120A03D20473F0BC08BC1847497815
-:1061100000290CD1051C406800F03EF9306800F001
-:1061200067F8002826D12C73FFF758FF22E00901F9
-:10613000071C4160081C174A1749FFF735FF002864
-:1061400007D13C730423A86998439904A8610861A6
-:10615000DAE7102000F020F91020B860FFF782FF86
-:10616000D2E7051C406800F017F9306800F040F8ED
-:106170000028D8D00223F86B1843F863C4E7000066
-:1061800028050080A555FFFF000000B0680E0080C4
-:10619000E40100802055FFFF7D71214090B5012072
-:1061A00040031049002708600F4CE01DFF303A30D3
-:1061B0004770E06980000019006900F0D7F8E069D5
-:1061C000002801D0E76101E00120E06107480223D7
-:1061D000C16B1943C1632773FFF700FF90BC08BC74
-:1061E00018470000000000B028050080E80E00807D
-:1061F00080B584B0071C78886D2803DB381C00F05C
-:10620000F7F817E080000D490958381CFFF7CBFE5E
-:1062100000280FD13978C9090CD36946381C00F021
-:10622000CFF86846002100F00BF8002801D10120CA
-:1062300000E0002004B080BC08BC1847E8010080E2
-:10624000F0B582B0021C414BDD1DFF353A352F7889
-:10625000002F01D0002700E001272F702F78FB00CE
-:10626000DB195B013A4FDC1940780001C71D093783
-:1062700000208300D658C046E65001300428F8D3E9
-:1062800000290FD00022BB08019383420BD9131CB5
-:106290009B00CB588600A351019B01300132834201
-:1062A000F5D800E010272B48026D806E2A49824203
-:1062B00003D8821ACB6C9A1A00E0121ABA4205D897
-:1062C0002648816B01318163012037E0C319CA6C14
-:1062D000934208D8224A3A4300920A1C496C091892
-:1062E000926C231C12E0161A00961B49496C09187F
-:1062F0001948826C0320231CFFF75EFEB81B184A66
-:1063000002430092A3191448826C416C0320FFF7EA
-:1063100053FE01200D49C04668708A6992005218E8
-:1063200017618A69002A02D000278F6100E0886126
-:106330000C480223C16B1943C163002001270A499D
-:10634000C0464F7302B0F0BC08BC18472805008057
-:1063500050BA2040680E00807C290080A082204036
-:1063600000001902E80E0080181A008007498A6EA2
-:106370001018074AD26C13041B0C834200D8801AF1
-:106380008866886E0349C04648617047680E008081
-:106390007C29008090EE204006494A6E1018064A7B
-:1063A000126C824200D8801A4866486E0349C04683
-:1063B00008617047680E00807C29008090EE2040C4
-:1063C00005220A608288C0468A8000224A7040887E
-:1063D000C0464880CA808A60CA6070470522026051
-:1063E0000022828042704180C2808260C260704719
-:1063F00080B584B0071C0E48416B0131416369468A
-:10640000381CFFF7DDFF3868C0460090452000AB20
-:1064100018700127DF8068460021FFF711FF002870
-:1064200001D1381C00E0002004B080BC08BC184733
-:10643000A082204000B584B0C188094AC04691813D
-:106440006946FFF7BDFF0120400201AB5880684656
-:106450000021FFF7F5FE012004B008BC184700003A
-:10646000E80E008000B5FFF7C3FF08BC1847012005
-:106470000349C0460871A121490388600020704784
-:10648000280F008000200449C0460871FF21A12286
-:106490005203013191607047280F00800220A12132
-:1064A000490388600020704701204002A121490370
-:1064B000886000207047C088C006C00EA121490333
-:1064C00048610249C046C86300207047E81A00804E
-:1064D00080B584B008490F6B6946FFF771FFF80675
-:1064E000C00E01AB588068460021FFF7A9FE0120CD
-:1064F00004B080BC08BC18478000144080B585B04B
-:10650000071C6946381CFFF75BFFF88804A903F0F5
-:10651000C9FF01AB588001A8408800280FD001A80E
-:1065200040888008033880080130043B5870049884
-:106530000168C04602914068C046039005E000A88B
-:1065400000784023184300AB18700498C11D013136
-:106550006846FFF775FE012005B080BC08BC1847EF
-:1065600090B584B0144F397B002920D1F91DFF313B
-:106570003A31497800291AD110490522009208229F
-:1065800000AB5A809880062000AB58700024DC8055
-:106590000868C04602904868C046039001203873DE
-:1065A00068460831FFF74CFE002800D03C7304B069
-:1065B00090BC08BC1847000028050080A42A008071
-:1065C00090B584B0071C6946381CFFF7F9FEBA681D
-:1065D0000D4C0E48002A05D10D49FFF7E4FC0028B8
-:1065E0000CDA05E0B9880B4BFFF7DFFC002805DA71
-:1065F00001AB5C8068460021FFF722FE002004B05A
-:1066000090BC08BC18470000FFFF00000D76214039
-:10661000C1BD214059BD214000B5C08803F02EFF07
-:10662000002008BC184700B5FFF7E2FE08BC184779
-:1066300000B5FFF7DDFE08BC184700B5011C0220BD
-:1066400000F002F808BC1847B0B5C6B0071C081C1B
-:106650006946FFF7B5FE2148FFF7A4FC041C204A59
-:106660000021381CFFF7A0FC002827D004A91D4AF0
-:10667000381CFFF799FC04A80023012F06D10CAAAF
-:1066800002320021136001311029FBD30168042973
-:1066900004D9890803398908013100E0191C00ABCD
-:1066A000597006A90978C046D9800068C046029092
-:1066B0000798C0460390043308AD02E0452000ABC4
-:1066C00018700949201CFFF76EFC6846291CFFF76B
-:1066D000B7FD012046B0B0BC08BC18472402FFFF3C
-:1066E00059B121409DAF21403C02FFFF00B5011C84
-:1066F000022000F010F808BC184700B5011C01206A
-:10670000FFF7A2FF08BC184700B5011C012000F0EC
-:1067100002F808BC1847F0B5C7B0041C0F1C381CA1
-:1067200001A9FFF74DFE2148FFF73CFC0090787867
-:106730000001BA680430FC2A25D8FF2309339842A7
-:1067400021D8192C1FD8FD88F868C0460590F91D7E
-:10675000093106AB00207E78002E0DDD40C940C314
-:1067600040C940C340C940C340C940C301300004D0
-:10677000000C7E788642F1DC201C05A92B1CFFF75B
-:1067800021FC002805D001A800784023184301AB64
-:10679000187007490098FFF706FC002101A8FFF7D1
-:1067A0004FFD012047B0F0BC08BC18472402FFFF92
-:1067B0003C02FFFF00B5FFF71BFE08BC1847F0B511
-:1067C000C6B0071CFC88254D6868013069466860C2
-:1067D000381CFFF7F5FD102C08D300A800784023E3
-:1067E000184300AB18700220D88017E07878820038
-:1067F000FB1D09330020B968002A15D940CB0F1CB6
-:106800000131BE420DD000AA127840231A4300ABDA
-:106810001A700422DA800290039104336846002142
-:1068200015E001309042E9D300AB5C7002946968D6
-:10683000C0460391A20000201033002A05D90F1C86
-:1068400080C3013001319042F9D3684604A9FFF7B3
-:10685000F7FC012046B0F0BC08BC18479C03008040
-:1068600090B4234800680121420900D30021002789
-:106870003A1C430B00D2022211431E4A2024D36843
-:10688000012B2ED1800A00D200240C43201C1B2394
-:10689000DB01D118898B090B00D204273843D16F53
-:1068A0000968090A07D2D11D793109680968090AFE
-:1068B00001D308231843E3231B01D1188979032945
-:1068C00002D1FF23013318430B49096A10224B0AF6
-:1068D00000D2002210438907890F8901084390BC28
-:1068E0007047400C00D200240C43201CECE7000051
-:1068F00000001040680E0080C0001840F0B53A4C0F
-:10690000201C04F007FA3948E3231B01C718B979A2
-:10691000374EC51D7935062962D202A35B5C5B0048
-:106920009F44001C030E1E374E550120B8710020F5
-:10693000B060FFF795FF0523984300F06FF80CE077
-:10694000FFF78EFFC00806D3B068411CB1600A286B
-:1069500003D9042000E00220B8716422201C2BE03F
-:10696000061CC06F80230168194301600320B871C1
-:10697000201C204A002104F099F9F06F04230168DB
-:10698000994301602868016819430160F0BC08BCA4
-:1069900018470521B971296804230A689A430A60D7
-:1069A000C06F016819430160FFF75AFF08231843BD
-:1069B00000F034F8201C104A002104F077F9E5E7D4
-:1069C000FFF74EFF0423184300F028F8DEE700200D
-:1069D000296860230A689A430A60FFF7E3FAD5E75B
-:1069E0000620B871D2E70000A9792140680E008026
-:1069F0009C030080307500001027000000B50020C7
-:106A00000449C046887104480122002104F04EF96F
-:106A100008BC1847981C0080A979214090B5071C34
-:106A200031480068790803D31023011C994301E021
-:106A3000102101432D4CE268012A05D12279002A58
-:106A400002D001239B021943814202D0012000059C
-:106A50000160E068012820D11B23DB01E018808B56
-:106A6000F90804D30123DB02011C994301E0012151
-:106A7000C902814202D0002002F01AFB380907D374
-:106A8000E06F8023016899430160E018006800E02E
-:106A9000E06F80230168194301601548016A780995
-:106AA00003D3FF200130084303E0FF23081C013318
-:106AB000984380088000BA099207920F10438842D9
-:106AC00002D00C49C0460862E168012908D1790A60
-:106AD00006D3FF2304331840032801D1FFF78EFFAC
-:106AE00090BC08BC1847000000001040680E0080F1
-:106AF000C0001840C000180080B5FFF7B1FE800943
-:106B00001BD20F48E3231B01C1184A79002A14D174
-:106B100001224A7100278030006860230168994390
-:106B20000160084806E0022002F08CFC072002F019
-:106B30005BFC381CFFF736FAF5E780BC08BC184749
-:106B4000680E0080F401FFFF00B584B06946FFF7CE
-:106B500037FCFFF785FE01AB588008480068C04647
-:106B600002900748006AC046039068460021FFF77C
-:106B700067FB012004B008BC18470000000010406B
-:106B8000C000184080B584B0071C6946381CFFF768
-:106B900017FCF888FFF742FFFFF762FE01AB588051
-:106BA00068460021FFF74CFB012004B080BC08BC04
-:106BB0001847B0B5C6B0C7886946FFF701FC012485
-:106BC0001A4B9F420AD900A800784023184300AB13
-:106BD00018700220D8806846002120E01448FFF792
-:106BE000E1F9051C134A381C04A9FFF7DDF9124925
-:106BF000281CFFF7D8F9012F06D10CA9002000228C
-:106C00000A6001301028FBD3102000AB58700498A4
-:106C1000C04602900598C0460390684606A9FFF753
-:106C20000FFB201C46B0B0BC08BC1847FF01000099
-:106C30002402FFFF9DAF21403C02FFFFF0B5C6B02C
-:106C4000071C6946381CFFF7BBFBFC8878780125D8
-:106C5000102801D1192C09D900A800784023184325
-:106C600000AB18700220D880043327E0B868C04613
-:106C70000490F868C046059006AAFB1D0933002160
-:106C8000787800280DDD002040CB40C201300004A0
-:106C9000000C0428F8DB481C0104090C78788842B1
-:106CA000F1DC0B48FFF77EF9071C0A4A201C04A9F7
-:106CB000FFF77AF90849381CFFF775F96846002193
-:106CC000FFF7BEFA281C46B0F0BC08BC184700000D
-:106CD0002402FFFFC5AF21403C02FFFFF0B584B0A6
-:106CE000041C0027E688A26847490879002808D0D4
-:106CF000002E01D0012E01D1012701E0042E00D188
-:106D0000032601254148052E66D202A39B5D5B0048
-:106D10009F44001C0306080C10000580002303E0BC
-:106D2000058005E000230380438006E00023038004
-:106D3000458002E0FF2301330380CB1D79339E8918
-:106D400001235B029E4202DBD207D20F00E0012248
-:106D50006D235B01C9188988FF23E133994301231F
-:106D600019430688FF339E420DD1FF20E1300843CE
-:106D7000002A04D101239B029843011C20E0012139
-:106D8000890201431CE0012E0AD14088012804D168
-:106D900060231943002A13D00CE0202319430FE08D
-:106DA000002E0DD14088012808D1FF2381331943DB
-:106DB000002A05D001239B02194301E080231943D7
-:106DC000042002F075F909214902002002F070F94F
-:106DD000002F02D1002012E0FFE76946201CFFF7D8
-:106DE000EFFA00A800784023184300AB1870022087
-:106DF000D880684600210433FFF722FA281C04B02B
-:106E0000F0BC08BC18470000680E0080881C008099
-:106E1000C0885121890308620020704780B5164F51
-:106E2000F868012807D137239B01F818408A802190
-:106E300001431B2007E06D235B01F818808B0121C3
-:106E400049030143102002F033F9012071235B0153
-:106E5000F918088048801B23DB01F818808B012378
-:106E60001B039843412109020143002002F020F94D
-:106E7000002080BC08BC1847680E008080B5174F02
-:106E8000F868012808D137239B01F818408A80232D
-:106E90009843011C1B2008E06D235B01F818808BD0
-:106EA00001235B039843011C102002F001F9FF202D
-:106EB00071235B01F918013008801B23DB01F818EE
-:106EC000808B41231B029843092149020143002082
-:106ED00002F0EEF8002080BC08BC1847680E008065
-:106EE00080B584B00849CF6A6946FFF769FAB805EA
-:106EF000800D01AB588068460021FFF7A1F9012001
-:106F000004B080BC08BC184740001440C0889F23D0
-:106F100018400549C96A1B235B011940084303490E
-:106F2000C046C86200207047400014404000140072
-:106F300080B584B00D490F6A012F01D1FF0307E02E
-:106F4000022F01D13F0303E0002F01D10127FF02EF
-:106F50006946FFF735FA01AB5F8068460021FFF70D
-:106F60006FF9012004B080BC08BC18470020144011
-:106F7000C288A1204003002101235B039A4201D172
-:106F8000022204E00123DB039A4202D101220262C1
-:106F900000E00162081C704790B584B0071C02F045
-:106FA0009FF86946041C381CFFF70AFA01AB5C80A5
-:106FB000094FF86DC046029068460021FFF740F97E
-:106FC000F86DC007C00F0549C046C862012004B073
-:106FD00090BC08BC18470000A42A0080681C0080F0
-:106FE000C0880249C04648610020704780001400F4
-:106FF00000B584B06946FFF7E3F90648C06801AB05
-:10700000588068460021FFF71BF9012004B008BC36
-:107010001847000080001440C0880249C046C8607C
-:10702000002070478000140080B584B069468768EE
-:10703000FFF7C6F9202F07D278000C4940181B2310
-:10704000DB01C018808B06E000A8007840231843BD
-:1070500000AB1870022001AB588068460021FFF792
-:10706000EFF8012004B080BC08BC1847680E00800F
-:1070700000B584B0C1888268202A04D2101C02F0B6
-:1070800017F8002010E06946FFF79AF900A8007889
-:107090004023184300AB18700220D88068460021B6
-:1070A0000433FFF7CDF8012004B008BC184790B5B1
-:1070B00084B0C7886946FFF783F91048FEF772FF6E
-:1070C0000220391C02F0F2FF002806D00220391CF1
-:1070D00002F036FF01AB588002E0452000AB18708B
-:1070E0000749201CFEF75FFF68460021FFF7A8F85C
-:1070F000012004B090BC08BC184700002402FFFF28
-:107100003C02FFFFB0B584B0C78869468468FFF7CA
-:1071100057F91048FEF746FF0F4A0220391CFEF7C8
-:1071200043FF002806D00D4B0220391C221CFEF71D
-:107130003CFF02E0452000AB18700949281CFEF70F
-:1071400032FF68460021FFF77BF8012004B0B0BC95
-:1071500008BC18472402FFFF59B1214059B0214013
-:107160003C02FFFF00B5FFF743F908BC18470020B9
-:10717000704780B4C288194BA1214903002A03D16A
-:10718000186B1023984304E0012A04D1186B1023D4
-:10719000184348611FE0022A1DD1C2688768002099
-:1071A0003B1CC340DB07DB0F9B0203430B61013039
-:1071B0000004000C2028F3DB0020131CC340DB0775
-:1071C000DB0F9B02C71D19373B430B6101300004E5
-:1071D000000C2028F1DB002080BC704780001440A8
-:1071E00080B4C28881681002120A10430204120C93
-:1071F0000C48C04602600C4BC0461A800A0C1702AD
-:1072000012123A431204120C42605A800904090C0B
-:107210000A02090A11430904090C816099800020BF
-:1072200080BC704740001400281B0080B0B584B0BB
-:1072300013490A681204120C1302121213434A680B
-:107240001204120C1F1C1302121213438968090442
-:10725000090C0A02091211430C04240C69461D1C76
-:10726000FFF7AEF801AB5F80280420430290684628
-:107270000021FEF7E5FF012004B0B0BC08BC1847B0
-:1072800040001440C18882680802090A08430004CB
-:10729000000C0A49C046C860100C030200121843D3
-:1072A0000004000C08611004000C0202000A1043E4
-:1072B0000004000C486100207047000040001400EA
-:1072C00090B584B0164BD9680904090C0A0209125A
-:1072D00011431A691204120C170212123A435B6925
-:1072E0001B041B0C1F021B123B431F043F0C0523F6
-:1072F0000093848801AB1C800024043B5C704088B0
-:1073000000AB5880D980100438430290039468463B
-:107310000021FEF795FF012004B090BC08BC18477F
-:107320004000144000B584B00B498A6A05210091E1
-:10733000818801AB19800021043B5970408800AB63
-:107340005880DA80029103916846FEF779FF0120A8
-:1073500004B008BC18470000C0001440C0880249AF
-:10736000C046886200207047C000140000B584B099
-:107370000B490A6A05210091818801AB198000211F
-:10738000043B5970408800AB5880DA800291039129
-:107390006846FEF755FF012004B008BC18470000FE
-:1073A000C0001440C0880249C046086200207047EF
-:1073B000C000140000B5C0880249FEF7F4FD0020AB
-:1073C00008BC18477502FFFF00B584B06946FEF798
-:1073D000F7FF0648006B01AB588068460021FEF7B6
-:1073E0002FFF012004B008BC18470000680E008081
-:1073F00000B5FEF7FDFF08BC184700B5FEF7F8FF23
-:1074000008BC184700B5FEF7F3FF08BC184780B565
-:10741000071C1048FEF7C6FD01204002A1214903C8
-:10742000886000210C48C04601710C480268520C6B
-:1074300005D20268120C06D10068800A03D30848FE
-:10744000C046C76002E00748C0460764081C80BC0D
-:1074500008BC1847D5942140280F00800000104038
-:10746000400118000000008000B501200349C0461B
-:1074700008721220FFF7CBFF08BC1847881C008059
-:1074800000B501200349C04648721520FFF7BFFF31
-:1074900008BC1847881C008000B501F0F9FF0120E6
-:1074A00008BC184780B584B0071CF88802F0FEF8C5
-:1074B00000280CD16946381CFEF782FF064801AB54
-:1074C000588068460021FEF7BBFE012000E0002046
-:1074D00004B080BC08BC1847FFFF000080B584B032
-:1074E0006946FEF76DFF012701AB5F80094881897E
-:1074F0000904C2891143029181880904C0880843A4
-:10750000039068460021FEF79BFE381C04B080BC47
-:1075100008BC18474C2A008000B5FEF769FF08BC7C
-:10752000184700B5FEF764FF08BC184700B5FEF722
-:107530005FFF08BC184700B5FEF75AFF08BC1847A4
-:1075400000B5FEF755FF08BC184700B5FEF750FF21
-:1075500008BC184700B5FEF74BFF08BC184700B53C
-:10756000FEF746FF08BC184700B5FEF741FF08BC10
-:10757000184700B5FEF73CFF08BC184700B5FEF7FA
-:1075800037FF08BC184700B5FEF732FF08BC1847A4
-:1075900000B58CB008A9FEF713FF694608A802F0F1
-:1075A000A9FF022008AB5870694608A8FEF748FEFC
-:1075B00001200CB008BC184700B5FEF719FF08BC45
-:1075C000184790B584B0071C6946381CFEF7F8FED2
-:1075D000FA8812490124C81D8930002A0FD004708E
-:1075E0004470B868000C8031C882B868C04608830F
-:1075F000F868000C4883F868C046888302E00021E0
-:1076000001704170064801AB588068460021FEF7C2
-:1076100017FE201C04B090BC08BC1847680E008000
-:10762000FFFF000000B5FEF7E3FE08BC184700B5F9
-:10763000FEF7DEFE08BC184700B5FEF7D9FE08BC11
-:10764000184700B5FEF7D4FE08BC184700B5FEF792
-:10765000CFFE08BC184790B584B0071C6946381C9B
-:10766000FEF7AEFEF8880324E40404430323DB049E
-:107670009C4202D30F4B9C4206D90F4801AB588065
-:1076800068460021FEF7DCFD0120800720430068EA
-:10769000002100AB5970FA88C046DA80029003914D
-:1076A00068460433FEF7CCFD012004B090BC08BC52
-:1076B00018470000E0001800FFFF000080B584B00C
-:1076C000071C6946381CFEF77BFEF8880323DB04A1
-:1076D0001843984202D30A4B984208D9094801AB93
-:1076E000588068460021FEF7ABFD012003E0B96831
-:1076F000C0460160002004B080BC08BC18470000F0
-:10770000E0001800FFFF000080B586B002A9FEF778
-:1077100057FE012702AB5F700020D8800A484168FD
-:10772000C04604918168C0460591C168C046009179
-:107730004069C0460190694602A8FEF781FD381CE9
-:1077400006B080BC08BC18476819008000B5C16845
-:107750008068FEF747FB002008BC184700207047F0
-:1077600090B584B0041C0F1C68465021FEF736FE0D
-:1077700001AB5C80029768460021FEF761FD04B012
-:1077800090BC08BC184780B584B0071C68465121DE
-:10779000FEF724FE01AB5F8068460021FEF750FD36
-:1077A00004B080BC08BC1847002070470020704718
-:1077B00090B584B0002712490968124A126B102351
-:1077C0001A400124002A00D001278A0C03D33A046E
-:1077D000120C02271743C90C03D33904090C0427E0
-:1077E0000F436946FEF7ECFD01AB5F806846002160
-:1077F000FEF726FD201C04B090BC08BC1847000012
-:1078000000001040C000184000B584B06946FEF783
-:10781000D7FD0648C06D01AB588068460021FEF7D1
-:107820000FFD012004B008BC18470000A42A008006
-:1078300000B5FEF7DDFD08BC184770470020704713
-:1078400000207047002070470020704700207047DC
-:107850000020704700B5FEF7CBFD08BC18470000BC
-:1078600080B585B001A9FEF7ABFD002001AB5870D3
-:107870000C49C9680127012902D10397049701E047
-:1078800003970490684601F033FD02AB0098C046B0
-:107890005880002101A8FEF7D3FC381C05B080BC3D
-:1078A00008BC1847680E0080704704490020002279
-:1078B0000A70013001316828FAD37047A082204055
-:1078C0000022884203D3401A01328842FBD2101CA6
-:1078D0007047884202D3401A8842FCD2704790B465
-:1078E000011CFF27042927DA0020144A43001B1833
-:1078F000DB00D458630C1AD24B005918C9005758F2
-:1079000043001B18DB00D75089189A184F68C046EF
-:1079100057608B68C04693600B69C04613614B6922
-:10792000C0465361C968C046D16090BC7047013001
-:107930000006000E0428D9DB381CF6E740AB2040D7
-:10794000F7B5C4B0041C0020469A112111406ED036
-:1079500000277900C919C900574A5158490C03D268
-:1079600001300006000E04E0791C0F063F0E042FC4
-:10797000EFDB00285BD0002600220092402300218C
-:10798000002002AA00F088FA04A9002082008A5888
-:107990001206120EA24203D1721C1606360E04E025
-:1079A00001300006000E1028F0DB002E3DD0042C24
-:1079B0003ED1800008584001800D00220092102323
-:1079C000002102AA00F068FA0021019102A805999D
-:1079D000490C890529D0C1680A06120E459B9A42B6
-:1079E00011D1C0684001860D002200920C230021B5
-:1079F000301C02AA00F050FA0199029D481C0106B1
-:107A0000090E01910EE04801860D0022009210231C
-:107A10000021301C02AA00F03FFA02A80599490C87
-:107A20008905D8D1019900290FD1FF203DE040E020
-:107A3000800008584001860D002200920C2300218E
-:107A4000301C02AA00F028FA029D01200004469A88
-:107A500010437900C919C900174AC0465050301C5C
-:107A60008E1870601020042C00D00C20041CB06014
-:107A700000202021469A1140202900D0281C306186
-:107A80002819FF21FF3008300931FFF719FF4301A2
-:107A90001818C000001B706100205021469A114048
-:107AA000502900D1281CF060381C47B0F0BC08BC3D
-:107AB0001847FF20F9E7000040AB204080B40023C6
-:107AC0000022002906D9875C7B401B061B0E013271
-:107AD0008A42F8D3D8430006000E80BC7047F0B548
-:107AE000C6B0042807DA41000918C9004591414A87
-:107AF00051584B0C02D20020C04376E001235B04B6
-:107B0000194043001818C0003A4A1418002961D0DF
-:107B1000002102912069A168451830D0FF21681E1C
-:107B20000931FFF7CDFE616840180190019881424C
-:107B300002D1A668AF1B09E00026FF21281C0931ED
-:107B4000FFF7C7FE071C01D1FF270937002200926B
-:107B50000198311C03AA3B1C00F09EF903A8391CB4
-:107B6000FFF7ACFFC043029948400106090E02919D
-:107B7000ED1BA068A84200D10025002DCED80299A7
-:107B8000CF43002200920C230021606803AA00F07A
-:107B900083F92069C04603900598000A000239065F
-:107BA000090E08430590FF231B02984305900C2102
-:107BB00003A8FFF783FFFF231B02059999430006E3
-:107BC000000E0002084305900C230021606803AA00
-:107BD00000F0CAF900204599064AC0465050C143FA
-:107BE0006160A160E1602161616146B0F0BC08BCE8
-:107BF0001847000040AB2040B0B44C42002900DBE5
-:107C00000C1C0027FF43042821DA124D43001818EA
-:107C1000C0004019012A05D0022A09D0032A16D132
-:107C200001690BE0002912DB02698A420FD305E0EB
-:107C3000002907DAC168A14209D3091BC160C068E5
-:107C4000B0BC7047C168091902699142F6D9381C65
-:107C5000F6E7000040AB2040F0B584B0171C0D1CC7
-:107C60000021029142001218D2002C498B581B06A9
-:107C70001B0E01930023DB43042802DA019840081D
-:107C800001D2181C46E05418E068C21921698A42E2
-:107C900000D90F1A002F3CD9A068E1684018FF21D5
-:107CA0000931FFF70DFE61684618A068E1684018C9
-:107CB000FF210931FFF70DFEC219FF2109318A4268
-:107CC00014D9019AC04600920B1A0393011C301C70
-:107CD0002A1C00F0E1F8E068039BC018E060039BF9
-:107CE0005D19FF1A02981818029010E0019AC04618
-:107CF0000092011C301C2A1C3B1C00F0CDF8E068EF
-:107D0000C019ED19E0600298C01902900027002FF9
-:107D1000C2D8029804B0F0BC08BC184740AB204061
-:107D2000F0B583B0171C0D1C002101914200121800
-:107D3000D200029230498A581206120E0024E443FF
-:107D4000042801DA500901D2201C51E0029A54188B
-:107D5000E068C2196069824201D92269871A002F3E
-:107D600045D9254EA068E1684018FF210931FFF789
-:107D7000A7FD616840180090A068E1684018FF21E5
-:107D80000931FFF7A6FD029AB15801235B0419439C
-:107D9000B150C119FF220932914213D9131A011CA3
-:107DA00000982A1C1E1C00F0DFF8E0688019751985
-:107DB000E0602169884200D92061BF1B019830181A
-:107DC000019012E0011C009E301C2A1C3B1C00F09C
-:107DD000CBF8E068C019ED19E0602169884200D94C
-:107DE00020610198C01901900027002FB9D801988F
-:107DF00003B0F0BC08BC184740AB2040B0B5C3B0DE
-:107E00000C1C0027FA43042806DA41000918C900AF
-:107E1000144845586B0C04D2101C43B0B0BC08BCCD
-:107E2000184762091BD300220092081840680C23EF
-:107E3000002101AA00F030F8112C0DD0122C0DD029
-:107E4000132C05D0142C0AD103980004070E06E069
-:107E5000039807063F0E02E0019F00E0029F381CD6
-:107E6000DBE7000040AB20400349002000220A5419
-:107E700001306028FBD3704740AB204000B502F0D2
-:107E80006FFA572002F0CCF902F040F9000AFBD358
-:107E900002F04EFA08BC1847F0B582B0079D141CDA
-:107EA0001F1C304AD26F202316689E431660331C75
-:107EB000FF2201322A4040020843050A061C000C3A
-:107EC0000190002A20D002F04BFA532002F0A8F9CA
-:107ED0000198C046009002F0A3F9281C02F0A0F916
-:107EE000301C02F09DF902F023FAFFF7C7FF02F001
-:107EF00037FA542002F094F9009802F091F9281C06
-:107F000002F08EF9301C14E002F02AFA522002F03E
-:107F100087F9019802F084F9281C02F081F9301CDD
-:107F200002F07EF9002002F07BF9002002F078F9DF
-:107F3000002002F075F9002002F072F9002F05D937
-:107F400002F0E4F820700134013FF9D102F0F0F9B9
-:107F5000044AD06F202301681943016002B0F0BCCD
-:107F600008BC1847680E0080F0B582B0141C1F1CB6
-:107F700042020A43151C012854D02C49C86F202303
-:107F800002689A430260C86F402301681943016088
-:107F900002F0E6F9532002F043F9280C061C02F027
-:107FA0003FF9280A0190009002F03AF9281C02F0EB
-:107FB00037F902F0BDF9FFF761FF02F0D1F9842033
-:107FC00002F02EF9301C02F02BF9009802F028F98B
-:107FD000281C02F025F9002F05D92078013402F081
-:107FE0001FF9013FF9D102F0A3F902F0B9F983209A
-:107FF00002F016F9301C02F013F9019802F010F9A2
-:10800000281C02F00DF902F093F9FFF737FF07493A
-:10801000C86F402302689A430260C86F202301683A
-:108020001943016002B0F0BC08BC1847680E00801C
-:108030007047000080B501F08FF8064FC046F86029
-:1080400001F0F2F8788001F0B1F8387180BC08BC1A
-:1080500018470000680E008000B501F005F90249DC
-:10806000C046088008BC1847680E00800B48C168ED
-:10807000012911D1C16F02230A681A430A60C16F36
-:1080800080230A681A430A60C118086882230268BC
-:108090001A4302600020088170470000680E0080CB
-:1080A000F0B44A49CA1D9D32002000278300D750F2
-:1080B00001301728FAD3464C00208200A750013027
-:1080C0002028FAD3434A00208300D75001302028CB
-:1080D000FAD3A76197614F658F653F4DC0462F600A
-:1080E0006F60AF60AF61EF602F616F610020C10012
-:1080F00009184901354BC9188600CB1DF933344C9A
-:108100003419E36311235B01CB1863630D239B01D7
-:10811000CB18B418E36323235B01C91861630130F2
-:108120000228E4DB2948C11DF931294CC046A1626F
-:10813000616B0D239B01E162C1189162516BC046D6
-:10814000D1620821E1642549C046216524490B69B3
-:10815000C0466365C31D4D33E36525668B68C04625
-:108160006366CB68C046A3661E4BC046E3662767BE
-:108170000B23DB01C318A36767670126E31D69337F
-:108180006661E7611F730223D364174BC046136512
-:10819000CB69C0465365C31D5133D3652B1D136690
-:1081A0004B69C04653668969C04691660F49C0460F
-:1081B000D16616670F23DB01C01890675667D76139
-:1081C000D01D693056610773F0BC7047680E00809F
-:1081D000E42C0080642D008090EE204030011800D7
-:1081E0007C2900800055FFFF380118001055FFFF63
-:1081F00090B400211E4ABB231B01D718F973192321
-:10820000DB01D0180124CD231B01D318C1611C70E0
-:1082100033239B01D3189960B97359612F239B01B4
-:10822000D3181960134B5127BF0303633B60846964
-:10823000E4184463043C7C600124E40284630E4C33
-:10824000C046BC60046BC04644628469E4180B4BB2
-:10825000E318FB60036BC0468362436AC046036257
-:10826000C16351649164D165D16690BC70470000D0
-:10827000680E008000002040FC070000FCF7FFFFB4
-:1082800090B400221B49C9231B01C81802710120A8
-:10829000BB231B01CB1858731748031C0027DC1D98
-:1082A000C1341C65231C01373F2FF8D31A651923ED
-:1082B000DB01CF1833239B01CB183A619861402032
-:1082C000F860DA611A62CA640A660C48C046C26085
-:1082D0000B48006BC006C00EF8630A480168C04630
-:1082E00019804168C04659808068C046988090BC1B
-:1082F00070470000680E008090BC204090EE204047
-:10830000800014404000144000200A49C046087311
-:10831000CB1DFF333A338861C8611870064AC046E6
-:1083200010655066906608705870BB231B01D11809
-:108330000873704728050080680E0080F0B42F494C
-:108340002F4AC046116101239B02C81850612D4875
-:10835000C0461062DB00C3185362002313635363EB
-:10836000294A2A4FD41DFF34FA3414C7083F3B6111
-:108370001C1F7C61264FC0463960B8617961F86284
-:108380003B637B64BA64FA65224FFE1DF936224DC9
-:10839000EC1D793426625126B6033761246AC04643
-:1083A00074612F671D4D09277F04EC1D75347C60B7
-:1083B0003D601B4CC0463C61E61D75367E61194F21
-:1083C000C0467C603D600F1C0021FF2401341D1C51
-:1083D0008B00FD500131A142FAD3011C002001277E
-:1083E000FF028300CD500130B842FAD30020810053
-:1083F000555001308028FAD3F0BC704724A32040A8
-:10840000400118002483204024A920408001180046
-:10841000A803008024A72040680E008024A82040E4
-:10842000A4A8204008040080B8B52C48FDF7BAFD88
-:1084300001202B490A68520C06D20A68120C02D19C
-:108440000A68920A00D200200406240E254AD71D8D
-:108450000D37002300209D0078510133042BFAD3FF
-:1084600001273F055061F860D061F8610023DB43CC
-:1084700093613B6113623B6200271B4B8D68C046D2
-:1084800000958D69C0460095002C0BD0DD6BC04671
-:1084900000959D6BC04600955D6BC04600951D6BB9
-:1084A000C04600950137402FE8D300276C460123D2
-:1084B0005B071C4301E0206001370D682B0902D2E5
-:1084C000802FF8D301E0802F03D308494B6E01338E
-:1084D0004B66D062B8BC08BC18470000F401FFFF2F
-:1084E00000001040680E008000011840A08220406B
-:1084F00090B400210E4F0F4A00204C01641AA400D2
-:10850000A318586098601864586410535880CC00C1
-:10851000E4199867DC6201310329EED30649C046AD
-:10852000086048608860C860086190BC70470000BF
-:10853000AC6621405C2B0080D02C00806421054873
-:10854000C04601630021C943416381630021C163C7
-:1085500001647047680E008080B4012040020A491F
-:10856000C04608603C20486088600848C046C86033
-:108570000020074A8700CB68C046DA510130102836
-:10858000F8D380BC70470000E42D0080F42D0080FB
-:108590005D4CFFFF1249134867239B01CA1806C0B0
-:1085A0000838114BCA18C160826001610F49104838
-:1085B000A7239B01CA1806C008380E4BCA18C16011
-:1085C000826001610C480D4967239B01C21805C1F7
-:1085D0000839054BC218C8608A60086170470000FE
-:1085E000AC1E2140482E0080FC1F0000ACEE204055
-:1085F000342E0080FC2F0000AC3E21405C2E008019
-:1086000090B40021404C00200A0112191923DB010B
-:10861000D218D06210635063906301310329F3D301
-:108620003A49C04608634863886320600121E31D1E
-:108630005933606019711872987198725971587233
-:10864000D871D872E21D4932117319709073987005
-:1086500051735970D073D8701171117290719072FA
-:1086600050715072D071D07218730222E71D6937B1
-:108670003A709973BA7058737870D873F87039710A
-:108680003A72B971B97278717A72F971F972397393
-:10869000E31D79331A70B973997078735A70F9734E
-:1086A000D9701A711A7299719A7258715A72D97175
-:1086B000DA721973E71D89373A709973B970587374
-:1086C0007A70D973F97039713A72B971B972787177
-:1086D0007A72F971F9723A73E31D99331A70B973AA
-:1086E0009A7078735A70F973DA7019711A729971F5
-:1086F000997258715A72D971D9722061E0606061C3
-:10870000A06090BC70470000A01C0080E8190080A9
-:10871000812000020149C04688627047C0001400F1
-:1087200009490A4BC818043BC91808600021C21D3A
-:108730002932C261101C01310829F8D3C11F29391F
-:108740000020C86170470000680E008084090000A6
-:1087500006480749C0460880488000208880C880B5
-:1087600088600449C046486188617047FFFF000087
-:108770004C2A00806C06008000210648C21D193278
-:10878000C1600161C16101621171FF30013041625C
-:10879000704700006C06008009480A4BC04618600C
-:1087A0000021C21D4D32C260101C01311429F8D3C2
-:1087B000C11F4D390020C8605860986070470000A4
-:1087C000D80700806C06008000B50B490B48FDF708
-:1087D000EAFB0B48006A0123DB0398430949C046C2
-:1087E00008620948C168012904D1C06F802301686B
-:1087F0001943016008BC1847C1BD2140759821404C
-:10880000C0001840C0001800680E008000B50F4876
-:10881000C168012904D1C06F8023016899430160B8
-:108820000B4B0C480C4A0021FDF7BFFB0B48418D58
-:10883000013141850021C1850948006A0123DB031C
-:1088400018430849C046086208BC1847680E0080F3
-:1088500059BD214075982140B80B000000000080F0
-:10886000C0001840C0001800F0B51B4C1026E0688E
-:10887000012808D16088002805D12079002802D17C
-:108880001920A06700E0A667002007235B02E51817
-:10889000C143E86169625908A1277F0379600F210C
-:1088A0007960E11DB93108710120B8604002B860FB
-:1088B00000F04CFA00F0F0FA0420B860072078616C
-:1088C0007E601B23DB01E018C08B04231840E862A4
-:1088D000F0BC08BC18470000680E008090B4021C71
-:1088E0000020FF2301339A4208D0012900D1012042
-:1088F000002A01D10223184390BC70471B4AD76855
-:108900001A4B19791C1C37239B01E318012F0DD139
-:108910005788002F0AD100290AD1598B0A0900D3A0
-:1089200002204909E8D301231843E5E7002903D0D1
-:10893000988A8007800FDFE76D235B01D1188A8852
-:10894000FF27013717400A49C98803D04B0A01D3D2
-:108950000320D1E7130A03D30B0A01D30220CBE78C
-:10896000D209C9D3C909C7D30120C5E7680E008061
-:10897000081C0080F0B5C1B0012000075249C04674
-:10898000086052484269400DA1214903486050489F
-:10899000C06A504B1843002103031B0B4E4C276F3A
-:1089A0003D032D0BE71D7937AB421CD0E31D793316
-:1089B0001B6AC046409301239B0703431B68CC00FE
-:1089C0006E46335101239B07061D33431B686C44DD
-:1089D000636008300131409B834200D83F48030365
-:1089E0001B0BAB42E7D1002001231B0313403C4C7F
-:1089F00003D0636A0133636209E0130B03D3236A74
-:108A00000133236203E0374B5C6D01345C65002960
-:108A100009D0031CDC00231C6B445C680130230D6F
-:108A200001D28842F5D1304C25686B0C05D2236801
-:108A30001B0C08D12468A30A05D320242B4BC04665
-:108A40005C6200245C62254B234C5126B6032367ED
-:108A500033613D6AC04675610225A12676037560C3
-:108A60000125B560E61DB9363571884221D0251C37
-:108A7000C3006C46E4582E6F6B4434605B682C6F07
-:108A8000C04663602B6F08332B673C6AA34202D356
-:108A9000124BC0462B67031CDB006B445C68013043
-:108AA000230D04D35124A4032B6FC046A361884235
-:108AB000DED1100B03D30E490120FDF774FA41B04B
-:108AC000F0BC08BC18470000000000B000011440D2
-:108AD0000040144000002040680E008024A7204081
-:108AE000A42A0080A082204000001040C00018008E
-:108AF000C94FFFFFF0B40021002307220624474F8F
-:108B0000C0463C613A610133202BF9D304253D6115
-:108B100005233B613C613A613C613A613D613B61E7
-:108B20003F4DAB6FDE0802231E40042333433B61FD
-:108B3000052333433B61AB6F9E0802231E40042391
-:108B400033433B61052333433B61AB6F5E08022334
-:108B50001E40042333433B61052333433B6102231F
-:108B6000AE6F1E40042333433B61052333433B6117
-:108B7000AB6F5D0002231D4004232B433B610523A3
-:108B80002B433B61C50802231D4004232B433B615B
-:108B900005232B433B61850802231D4004232B43FF
-:108BA0003B6105232B433B61450802231D40042301
-:108BB0002B433B6105232B433B61022505400423E6
-:108BC0002B433B6105232B433B61400002231840AC
-:108BD000042303433B6105231843386100253D61AD
-:108BE00001233B613D613B6100203D610D4B1B69F1
-:108BF00049001E1C02233340194301233B6101300D
-:108C00001028F2D302203861032038613C613A61B8
-:108C10003C613A6138614808F0BC7047800014003C
-:108C2000680E008080001440F0B40024072306275B
-:108C3000444AC046176113610134202CF9D304263D
-:108C4000166105241461176107231361166114610D
-:108C5000176113613C4B9B6FDD0802231D402B1CE9
-:108C60003343136125431561374B9B6F9D080223E6
-:108C70001D402B1C3343136125431561324B9B6F01
-:108C80005D0802231D402B1C3343136125431561EE
-:108C90002D4B9D6F02231D402B1C33431361254335
-:108CA0001561294B9B6F5D0002231D402B1C334334
-:108CB000136125431561C50802231D402B1C334356
-:108CC000136125431561850802231D402B1C334386
-:108CD000136125431561450802231D402B1C3343B6
-:108CE000136125431561022505402B1C3343136195
-:108CF00025431561400002231840031C33431361D0
-:108D000020431061176107231361166114614C0041
-:108D100000200F21251CCD4002231D4004232B439E
-:108D2000136105232B431361013001391028F1D35E
-:108D30001761072313611761136103201061F0BCF1
-:108D40007047000080001400680E0080F0B54F4DA1
-:108D5000082102202A1CFDF727F94D4C71235B01E5
-:108D6000E71838801A2102202A1CFDF71DF97880A7
-:108D7000207900280BD000203880E068012810D12D
-:108D80004448006801239B02184399020860E06888
-:108D9000012806D16088002803D1F9211220FFF7AD
-:108DA00043FF0121C9030020FFF73EFF00257D2678
-:108DB000F60000E001350020FFF79CFE000C01D317
-:108DC000B542F7D3002505E0032109030020FFF792
-:108DD0002BFF01350020FFF78DFE400B01D2B5427D
-:108DE000F2D30420FFF786FEFF23E13398430121ED
-:108DF00001433888FF230133984203D12F235B01BD
-:108E0000194316E0012809D17888012803D12323CA
-:108E10005B0119430DE0202319430AE0002808D123
-:108E20007888012803D10B23DB01194301E080235B
-:108E300019430420FFF7F8FE092149020020FFF73B
-:108E4000F3FEE06800280CD100211B20FFF7ECFEA8
-:108E50001A20FFF74FFE0121C90301431A20FFF733
-:108E6000E3FE002703E0082F01D30F2F08D9381C99
-:108E7000FFF740FE790009191B23DB01C91888831D
-:108E80000137202FEFD3F0BC08BC1847EDAF2140CD
-:108E9000680E00800000104081B013480168C04691
-:108EA00000914168C04600918168C0460091C16848
-:108EB000C04600910169C04600914169C0460091D9
-:108EC0008169C0460091C169C0460091016AC046EF
-:108ED0000091416AC0460091816AC0460091C06A13
-:108EE000C046009001B0704700081440F0B583B050
-:108EF000684D1B23DB01EF18F88B0422024002921D
-:108F000071235B01E8180188C04601914088C04682
-:108F10000090002403E0082C01D30F2C08D9201C5A
-:108F2000FFF7E8FD610049191B23DB01C91888839D
-:108F30000134202CEFD3584CE069002815D0574E4F
-:108F40002025013D5349E06930400BD068004018AE
-:108F500037239B01C018818B281CFFF765FEE06951
-:108F6000B043E0617608002DEBD10120FFF7C2FD90
-:108F70004849C046F883F88BC20825D3CA68012A3D
-:108F800013D10A79002A1FD1498800291CD10199DF
-:108F9000434A002905D0012916D1518BC90813D2A3
-:108FA0000FE0518B09090FD20BE00A79002A0BD18F
-:108FB0006D235B01C9188A88C988114049090907CE
-:108FC00002D104239843F883F88B04210140029ACC
-:108FD0001FD0B98B4A0B27D3800925D3FF230198D3
-:108FE0000133984220D000250098012800D10502C5
-:108FF0000198002802D101235B031D43A94213D02D
-:109000000020291CFFF710FEBD830020C0436062D2
-:109010000AE0B88B400B07D2092149020020FFF774
-:1090200003FE09204002B883F88BC0082DD31D48E9
-:10903000C76A01980099FFF751FCC207D20F1A497D
-:1090400003D00423CD6D2B4303E00423CD6D9D435A
-:109050002B1CCB65830803D30223CD6D2B4303E088
-:109060000223CD6D9D432B1CCB65616A81420CD0E0
-:1090700060620E48002A03D0FF212131394303E00A
-:10908000FF2321339F43391CC16203B0F0BC08BCED
-:1090900018470000680E0080681C008000000080F7
-:1090A000281C008040001440A42A008040001400C6
-:1090B00090B4012220280FD243000F1C07495C18EE
-:1090C00037239B01E3189F83824007235B02C91863
-:1090D000101CCA691043C86190BC7047680E0080BC
-:1090E0000B4840690B49C98B04220A400A4906D043
-:1090F0000123DB0298430123CA6D1A4305E00123D3
-:10910000DB021843CA6D52085200CA65704700005E
-:1091100080001440E81B0080A42A008000B584B0C1
-:10912000FFF7DEFF011C05200090002001AB188036
-:10913000043B58701B2200AB5A80D9800549C96D89
-:10914000C0460291039068460021FDF779F804B00B
-:1091500008BC1847A42A00800F480168490C05D2B2
-:109160000168090C06D10068800A03D30B48006827
-:10917000000C01E00A48806C0004000C094B984286
-:1091800005D00233984202D0074B984201D101200A
-:1091900070470020FCE7000000001040000018406D
-:1091A00000000080049900000799000090B4012499
-:1091B000211C18480268520C06D20268120C02D117
-:1091C0000068800A00D200210906090E124F134AD6
-:1091D00002D03868000C00E0906C0004000C104BCA
-:1091E000984208D00233984205D00E4B984202D0E4
-:1091F000023B98420CD1002902D0F86A000C00E032
-:10920000D06C400A00D200242006000E90BC7047AB
-:109210000020FBE700001040000018400000008024
-:1092200004990000079900000C480168490C05D218
-:109230000168090C05D10068800A02D308488068DB
-:1092400001E00848406C0004000C0021032803D012
-:10925000400801D301207047081CFCE700001040C3
-:109260000000184000000080F0B501271A4C256866
-:10927000FFF772FF031C194A022101261848012B2F
-:109280001BD1CB041E605523036000234360066896
-:10929000552E1BD1AA26066043600368AA2B15D160
-:1092A0000923036005230F4FC0463B6003230E4F85
-:1092B000C0463B601160076808E008232360042370
-:1092C0000A4FC0463B60116006602768C0462560B3
-:1092D000381CF0BC08BC18470000204000002440A7
-:1092E0000000224000002A400000264000002840E4
-:1092F00080B5071CFFF730FF012805D11948006829
-:109300001949496B084022E018480168490C05D208
-:109310000168090C06D10068800A03D3144800686C
-:10932000000C01E01348806C0004000C124BC018C4
-:1093300008280BD201A31B5C5B009F4405030703B5
-:1093400007070503032002E0012000E000200121BF
-:109350003860800700D100210806000E80BC08BCE0
-:1093600018470000346E21400000114000001040FA
-:109370000000184000000080FE66FFFFF0B582B0DC
-:10938000071C01200190FFF7E7FE012813D1382FB9
-:1093900001D0A82F07D10026F643341CA82F02D1F4
-:1093A000301C0096351C1120000406624462856260
-:1093B0000099C046C16200210848C0460160382FAC
-:1093C00001D0A82F05D101210160A82F01D10321CF
-:1093D0000160019802B0F0BC08BC1847346E21400F
-:1093E000704700007047000090B5071C124C2168C0
-:1093F000124881420BD00023211CE21DC13200E043
-:1094000008C19142FCD32060C820A0806772380157
-:1094100000F018F827720A48C046E060092F00DB08
-:109420000027E019017D01310175E0880130E080FD
-:10943000012090BC08BC184700000080EEFFC0D09F
-:109440000810000380B4084AD11D89310B7A202B03
-:1094500001D300230B72071C087A431C0B7280187F
-:109460009030477280BC704700000080074901229D
-:109470001204086802400120002A06D10A68120C72
-:1094800002D10968890A00D200207047000010400C
-:1094900090B5071C094C381C211CFCF791FF381CA7
-:1094A00000F00EF80123D84201D1000CE080002129
-:1094B000201CFCF7C5FE90BC08BC1847C4662140C0
-:1094C000F8B5071C797A76480023764C01295DD1DE
-:1094D000A288C0460092A1898A4274DAFA7A002AE8
-:1094E00015D07A6C002A12D08A4210D8009A511CEA
-:1094F000A180A188C0464181786C6B4EC046F08047
-:10950000A06A5823796C59434018C11A28E0228870
-:1095100001321204120C22808A4200DB23800022D6
-:10952000002969DD5F4CA46A5E4B1D8858236B439C
-:10953000E318DE1D013601239B0733431B681B061E
-:1095400015D15849009A01328A808A88C0464281E2
-:1095500008880130544EC046F080582068432118D6
-:10956000381C00F039FBF0880004001495E04D4BE6
-:1095700001352D042D0C1D808D4201DB00251D8041
-:109580000132120412149142CEDC81E0E188E289BA
-:10959000914218DAF97A00292FD0796C4904490CE4
-:1095A00079642AD0E289914227D8E1880131E180AB
-:1095B000E188C04681810123DB03786C18433A4E71
-:1095C000C046F08000E063E0E06A796C4B00591817
-:1095D00049014018C11F5939381C00F00FFBE06ADF
-:1095E000796C4A0052185201801801390904090C9B
-:1095F000603800F089FBB6E74AE061880131090470
-:10960000090C6180E289914200DB63800021002A1D
-:109610003EDD244CE46A234B5D886B005B195B01E3
-:10962000E318DE1D013601239B0733431B681B062D
-:1096300020D11C4EF1880131F180F188C046818132
-:1096400070880123DB03013018431749C046C880E6
-:109650006800401940012118381C00F0CFFA7188C9
-:109660004A0052185201F06A801800F04DFB0E4972
-:10967000C88879E70B4B01352D042D0C5D80954290
-:1096800001DB00255D800131090409148A42C2DC36
-:109690000189013101810020C043F8BC08BC184792
-:1096A0004C2B00804C2A0080C4662140F0B4061C7C
-:1096B0000123DB0333400124444F0020444A454D3D
-:1096C000D11D3931002B41D0E303F31A73D0EE8959
-:1096D0009E4271D3EE88002E6DD0ED6A5E1E73003F
-:1096E0009B195B01ED18AE683606360E032E02D0CC
-:1096F000CE890136CE814035AD8BAD00354E766AD0
-:10970000C0467051558901355581324EF26AD218E2
-:109710009060F26AD2189063F26AD218D063F26A4B
-:10972000D2181064F26AD2185064F26AD2189064A7
-:10973000F26AD218D064F0880138F080F088C04610
-:1097400088812449002839D14F8037E0002E38D94C
-:10975000AB89B34230D3AB88002B2CD05389013373
-:1097600053812A1CAD6A5823013E7343ED18AE683D
-:109770003606360E032E02D0CE890136CE81A86081
-:10978000956AED18A863956AED18E863956AED1877
-:109790002864956AED186864956AED18A864956A5E
-:1097A000EB18D8649088013890809088C046488132
-:1097B000002803D101E004E003E01780201CF0BC86
-:1097C0007047CA890132CA81F9E70000FFFF000033
-:1097D0000C2B00804C2A008000B50021416010490C
-:1097E0004A68002A10D1CA68002A04D0CA1D19325A
-:1097F0001279002A08D04A69002A0BD18861486191
-:1098000000F010F808BC18474A69002A02D18861A4
-:109810004861F7E78A69C04650608861F2E7000056
-:109820006C060080B0B52A48406900284CD0082258
-:10983000C1680A400027274BD91DB931002A11D031
-:109840000422254CC0460C61244CC0464C62244C7A
-:10985000C0468C62234CC046CC62234CC0460C638D
-:109860004F6312E00522214CC0460C61204CC046DB
-:109870004C62204CC0468C621F4CC046CC621F4CD0
-:10988000C0460C631E4CC0464C634024CC824F83C0
-:109890001C4F0021002A0CD98C0005196D6A7D40EF
-:1098A000E418FF340134656201319142F4D3102988
-:1098B00007D28A00D218FF320132576201311029D3
-:1098C000F7D3114900F022F8B0BC08BC18470000DB
-:1098D0006C060080ACAB20402801400001234567A6
-:1098E00089ABCDEFFEDCBA987654321020014000EF
-:1098F00067452301EFCDAB8998BADCFE1032547670
-:10990000C3D2E1F03636363630802040B0B50F1C79
-:10991000154DE91DC931154C231C154A0020FCF7D3
-:1099200044FBE91DFF311E31231C0D1C114A01208F
-:10993000FCF73BFB291C231C0E4A0020FCF735FBDF
-:10994000391C231C0C4A0120FCF72FFB00210B487B
-:10995000C21D193251710121FF3001304162081CD2
-:10996000B0BC08BC18470000ACAB20407508FFFF36
-:109970002800030040000200140007006C0600806D
-:10998000F0B5374A506901239B0708301843006837
-:109990000106090E334B012949D11F68191C324BAE
-:1099A0009F4204D1FFF73EFFF0BC08BC18470023DC
-:1099B0009F00CC595569EF193C610133052BF7D352
-:1099C000000A0002022318435369C0469860506998
-:1099D0000823C2681340254FFA1DB932002B02D06C
-:1099E0000423234C01E00523224CC046146140248B
-:1099F000D48200245483204C0022002B0CD99500E3
-:109A00004619766A6640ED19FF3501356E620132FE
-:109A10009A42F4D3102A07D29300DB19FF330133A3
-:109A20005C620132102AF7D3FFF770FFBCE7002118
-:109A30008F00DC595569EF197C6201310529F7D394
-:109A4000000A0002032318435169C0468860506928
-:109A50004068C04650610948FCF7A4FAA4E700003A
-:109A60006C0600803080204067452301ACAB20406D
-:109A700028014000200140005C5C5C5C1131FFFF6C
-:109A8000F0B5071C3B483C4C08212060A180002019
-:109A90002081E18060813948C046E0603848C04696
-:109AA00020613848C04660613748C046A0613748E9
-:109AB000C046E0613648C04620623648C046606213
-:109AC0003548C046A0623548C046E0623448C046CA
-:109AD00020633448C04660633348C046A0633348BF
-:109AE000C046E0633248C04620643248C0466064E5
-:109AF0003148C046A0643148C046E0643048C046A2
-:109B000020653049C868020489694A40E31D7933F9
-:109B10000904C943C0434840E11DB931DA63086014
-:109B2000294D211C2B1C294A0020FCF73EFA284A0B
-:109B3000E11DB53101202B1C0E1CFCF736FA244A1E
-:109B40000020311C2B1CFCF730FAE11D4D312B1C81
-:109B5000204A0120FCF729FAE01D5D300168002948
-:109B6000FCD0606DC0463865206EC0467865F0BC9C
-:109B700008BC1847800008008CB92040818148BD8E
-:109B80007956238C930C82951D0E12CF9B3BC0E916
-:109B9000E6557C8299F67802D1D72573728C331002
-:109BA000F703F1426C9B4AA7828E23A990B1828E63
-:109BB000DC3FFB2900622245882BF1851261D173BD
-:109BC0006EB11116088320407508FFFF5400030092
-:109BD000080002001400030080B50F1C391C00F0BF
-:109BE00033F8381CFFF74CFF03480189013101812C
-:109BF00080BC08BC184700000C2B008090B5041CEA
-:109C00000F1C201C391C00F01FF8E068010EFF2219
-:109C100012040240120A1143FF22120202401202F1
-:109C200011430006084338652069C04678656069BD
-:109C3000C046B865034801890131018190BC08BC68
-:109C4000184700000C2B008090B5002293001F18CD
-:109C5000BF695B185F620132052AF7D3077AFB08F8
-:109C600003D30023920052181362076BC0468F6320
-:109C7000C76AC046CF63876BC0460F64476BC04658
-:109C80004F64076CC0468F64C26BC046CA64C2880A
-:109C9000C0460A80827A1206037A1B041A43C388DC
-:109CA0001B021A43437ADB071A438A60171C837A24
-:109CB0005A0805D314221C1CA30802D2152200E066
-:109CC0000022007A430810D3C00802D38820104332
-:109CD00001E0802010433A0A120201231A43C860AF
-:109CE0008A60081CFFF778FD05E0380A00020323AC
-:109CF00018438860CA60034801890131018190BC22
-:109D000008BC18470C2B0080F0B4026D144C151CD5
-:109D1000E769BD40131C266AF3405D402E1C456D6B
-:109D2000BD406E402B1C351CFD402F1CBB00656ADE
-:109D3000EB58002B08D0236901379F4200D300273E
-:109D4000BE00AE59002EF7D1A469A2401143054BC5
-:109D50001943BA00A95040308783F0BC7047000017
-:109D60004C2A00800000008080B4002200230029DB
-:109D700005D907787A40013001338B42F9D3D043BB
-:109D80000006000E80BC7047F0B5071C0024FF26BB
-:109D90000936201C00F09AF800F0B8F9051C00F014
-:109DA000C7FA3D70281C01370134B442F1D3F0BC2E
-:109DB00008BC184780B500F093F800F0A7F9071C1D
-:109DC00000F0B6FA380AF6D380BC08BC1847F3B5E1
-:109DD00082B002984102532000F064F800F0A8FA23
-:109DE000FFF7E8FF0024002001902E2000900025BE
-:109DF00000270298012804D10098844201D300264C
-:109E000009E00198411C019100F060F800F07EF932
-:109E1000061C00F08DFAF800864035430134013706
-:109E2000042FE6D3039920C10391FF2309339C42F9
-:109E3000DDD304B0F0BC08BC1847F0B5041C0F1CFF
-:109E4000012C2AD01648C06F4023016819430160D5
-:109E5000002620CFB100842000F024F8281C00F058
-:109E6000DFF9280A00F0DCF9280C00F0D9F9280EF7
-:109E700000F0D6F900F05CFA0136422EE9D3610217
-:109E8000832000F00FF800F053FAFFF793FF044827
-:109E9000C06F4023016899430160F0BC08BC1847BB
-:109EA000680E008090B5041C0F1C00F059FA201CAD
-:109EB00000F0B6F9380C00F0B3F9380A00F0B0F948
-:109EC000381C00F0ADF990BC08BC184700B5011C67
-:109ED0005420FFF7E7FF002000F0A2F908BC184764
-:109EE00000B500F03DFA572000F09AF908BC184779
-:109EF00090B5084FFA6F202314689C431460231C0C
-:109F0000FFF765FFF86F202301681943016090BCDB
-:109F100008BC1847680E008090B5084FFA6F2023E0
-:109F200014689C431460231CFFF787FFF86F2023FD
-:109F300001681943016090BC08BC1847680E008096
-:109F4000F0B5041C0F1C184EF06F202301689943D4
-:109F5000016061025320FFF7A5FF00F0E9F9FFF768
-:109F600029FFF81D0530012C03D1222F01D3002732
-:109F70000FE0441CFFF7AAFF00F0C8F8071C00F030
-:109F8000D7F9201CFFF7A2FF00F0C0F8051C00F075
-:109F9000CFF9F06F2023016819430160280238438C
-:109FA000F0BC08BC18470000680E0080F0B5C2B0D5
-:109FB000141C0D1C071C012F2FD07902194EF06FB5
-:109FC000202302689A4302605320FFF76BFF00F0E2
-:109FD000AFF9FFF7EFFE6846FFF7D6FE6A46E81DC9
-:109FE00005301454210A68444170684600990C30C9
-:109FF000FFF7BAFE02AB18700020587068460C21BB
-:10A00000FFF7B2FE02AB58706946381CFFF715FF28
-:10A01000F06F202301681943016042B0F0BC08BC16
-:10A0200018470000680E0080FFB5C2B0071C012F62
-:10A0300001D1012036E06B460020C44310C301303B
-:10A040004228FBD368460C30031C0024002A0AD99E
-:10A050000E88C04606700E883612467002300231F5
-:10A0600002349442F4D30092181C111CFFF77CFEBA
-:10A07000041C0020019002AB1C7058709D70684653
-:10A080000C21FFF771FE02AB5870459B1D062D0E8B
-:10A09000AC4203D16946381CFFF73EFF0120AC42B9
-:10A0A00000D1002046B0F0BC08BC1847B0B5C2B023
-:10A0B0000F1C4102144CE06F202302689A43026097
-:10A0C0005320FFF7EFFE00F033F9FFF773FE684609
-:10A0D000FFF75AFEE06F20230168194302AD0160CB
-:10A0E0006D78002402AB5C7068460C21FFF73CFEE3
-:10A0F000A84202D10098874201D3201C00E0012031
-:10A1000042B0B0BC08BC1847680E0080FC466047EF
-:10A110000000A0E3B4229FE5B4329FE50110A0E364
-:10A12000001082E5001082E50010A0E3001082E537
-:10A13000001082E5001093E5810380E10110A0E3A7
-:10A14000001082E5001082E50010A0E3001082E517
-:10A15000001082E5001093E5010380E10110A0E307
-:10A16000001082E5001082E50010A0E3001082E5F7
-:10A17000001082E5001093E5810280E10110A0E368
-:10A18000001082E5001082E50010A0E3001082E5D7
-:10A19000001082E5001093E5010280E10110A0E3C8
-:10A1A000001082E5001082E50010A0E3001082E5B7
-:10A1B000001082E5001093E5810180E10110A0E329
-:10A1C000001082E5001082E50010A0E3001082E597
-:10A1D000001082E5001093E5010180E10110A0E389
-:10A1E000001082E5001082E50010A0E3001082E577
-:10A1F000001082E5001093E5810080E10110A0E3EA
-:10A20000001082E5001082E50010A0E3001082E556
-:10A21000001082E5001093E5010080E11EFF2FE1B0
-:10A22000FC466047A4219FE5A8319FE5A013A0E16B
-:10A23000001083E50110A0E3001082E5001082E524
-:10A240000010A0E3001082E5001082E52013A0E1D9
-:10A25000001083E50110A0E3001082E5001082E504
-:10A260000010A0E3001082E5001082E5A012A0E13A
-:10A27000001083E50110A0E3001082E5001082E5E4
-:10A280000010A0E3001082E5001082E52012A0E19A
-:10A29000001083E50110A0E3001082E5001082E5C4
-:10A2A0000010A0E3001082E5001082E5A011A0E1FB
-:10A2B000001083E50110A0E3001082E5001082E5A4
-:10A2C0000010A0E3001082E5001082E52011A0E15B
-:10A2D000001083E50110A0E3001082E5001082E584
-:10A2E0000010A0E3001082E5001082E5A010A0E1BC
-:10A2F000001083E50110A0E3001082E5001082E564
-:10A300000010A0E3001082E5001082E50010A0E13B
-:10A31000001083E50110A0E3001082E5001082E543
-:10A320000010A0E3001082E5001082E51EFF2FE17F
-:10A33000FC466047A0309FE50110A0E3001083E5D4
-:10A34000001083E5001083E5001083E5001083E52D
-:10A35000001083E5001083E5001083E51EFF2FE168
-:10A36000FC46604770309FE50010A0E3001083E5D5
-:10A37000001083E5001083E5001083E5001083E5FD
-:10A38000001083E5001083E5001083E51EFF2FE138
-:10A39000FC46604734209FE53C309FE50010A0E379
-:10A3A000001082E5001082E50110A0E3001083E5B3
-:10A3B000001083E5001083E5001083E5001083E5BD
-:10A3C000001083E5001083E5001083E51EFF2FE1F8
-:10A3D000F80018400401184000011840FC00184023
-:10A3E00080B500F00CF80027381C00F047F8781C06
-:10A3F00007043F0C0C2FF7DD80BC08BC18471D4834
-:10A4000002681D498B69D218026002668A6A436835
-:10A410009B184360934202D2826801328260C26814
-:10A420000B6AD218C2604269CB68D2184261C26915
-:10A430008B68D218C26102690B69D2180261826905
-:10A440000B68D2188261026BCB69D21802634A6A28
-:10A45000436B9B184363934202D2826B0132826347
-:10A46000C26B4B69D218C263026CC96A511801648D
-:10A4700070470000A42A00800008144088B569468F
-:10A4800000F017F881080AD00020002907D900221F
-:10A490008300009FC046FA5001308842F8D388BC40
-:10A4A00008BC184700B500F004F80004000C08BC14
-:10A4B0001847002200280AD001280AD002280CD010
-:10A4C000032802D107481C220860101C7047064868
-:10A4D00004E0064850220860F7E705486822086053
-:10A4E000F3E7000008832040A42A00800C2B0080A2
-:10A4F000A082204080B40322C280154AC0468260F8
-:10A50000144A12880132C2600020134A135CC0460C
-:10A510000B70013001310828F8D320220A70013174
-:10A5200000200E4B1F5CC0460F700130013108281F
-:10A53000F8D30A7001310020094A135CC0460B7041
-:10A54000013001310828F8D30020087080BC704722
-:10A5500008100003680E00807C04008085040080E1
-:10A560008E04008000B501230A48C11D89314B705B
-:10A5700000220A7064218030C182018343837D21DF
-:10A58000C9008183C28304480122002100F08EFBB0
-:10A5900008BC1847680E0080B522FFFF00B5FFF722
-:10A5A000E1FF13480222002100F080FB0123D84282
-:10A5B0000AD11048C11D3931CA880132CA80817957
-:10A5C00001318171FDF770F90B48C068012805D190
-:10A5D0000A487D22D200002100F068FB0848FBF702
-:10A5E000E1FC08482822002100F060FB08BC184765
-:10A5F0007921FFFFA0822040680E0080A57B2140CA
-:10A60000952CFFFF5903FFFF00B510200F49C046EE
-:10A6100008600F4A0F486421FBF7C6FC0E48012270
-:10A62000120401680A400821002A05D10268120CB0
-:10A6300007D10068800A04D30848C046C16008BC3E
-:10A6400018470748C0460164F9E70000000000B061
-:10A65000A555FFFF7C290080000010404001180034
-:10A6600000000080F8B527480122120401680A4062
-:10A670000721002A05D10268120C06D10068800A61
-:10A6800003D32148C046C16002E02048C0460164AF
-:10A690001F48FBF787FC1F48C16BFF29FCD1816B6A
-:10A6A000426B161C0F1C1C4C102360691843606120
-:10A6B000A16999431D04A161E860A069C0462861B1
-:10A6C000164A17496420FBF76FFC164AC0460092F1
-:10A6D000154B0020391C321CFBF76EFC1348C16877
-:10A6E0000829FCD11248FBF75DFC102360699843F0
-:10A6F0006061E8600120E3231B01E118C871F8BC28
-:10A7000008BC1847000010404001180000000080FD
-:10A710000402FFFF00011840680E00802055FFFF73
-:10A72000B5B621406400300244802040400118400A
-:10A73000F401FFFF00B5FDF701FF0648FBF732FC0F
-:10A74000FDF7D6FEFEF704F8FEF716F8FEF724F83C
-:10A7500008BC18479103FFFF90B5FDF76BFC344F21
-:10A760000024F968F81D793001290FD13149C0461C
-:10A77000F9673149C04601603049C0460C604C6001
-:10A780008C60CC600C614C618C6104E0F91D7D3102
-:10A79000F96712C008380068602301681943016036
-:10A7A000F86F2023016819430160F86F40230168A6
-:10A7B0009943016000F054F8FDF74EFC00F05EF99B
-:10A7C000FDF773F8FFF70CFEFDF72EFEFDF7B6FD63
-:10A7D000FDF7C2FEFDF754FDFDF70AFDFDF794FD00
-:10A7E00000F01AFAFDF79CFFFDF70AFFFDF7D2FE15
-:10A7F000FDF73CFCFBF7DCFAFFF79CFF71235B01E4
-:10A80000F8180472447207235B02F8180463F868AE
-:10A81000012802D1A820FEF7B1FD0948C0464462D4
-:10A8200000F018FA0748FBF7BDFB90BC08BC1847BE
-:10A83000680E008000011140040111400001110068
-:10A84000C0001800158F214000B50448FBF7AAFB93
-:10A85000FDF75EFFFDF724FC08BC18471599214061
-:10A86000FA210348C046416240214162704700001E
-:10A87000C000180007484169074B194341618269CC
-:10A880009A43826101221205D1608069C04610613D
-:10A8900070470000680E0080FEAF9A1000B50248B5
-:10A8A000FBF780FB08BC1847C857FFFFF0B5244CE6
-:10A8B00001210904206801400920224E224D00296F
-:10A8C00005D12168090C04D12168890A01D3F060FF
-:10A8D00000E028641D48FBF765FB1D4F1D49886992
-:10A8E00001308861387A002802D1787A00281FD098
-:10A8F0001948FBF757FB1948FBF754FB0028FAD11E
-:10A90000387A002802D01648FBF74CFB01210904D5
-:10A91000206801401420002905D12168090C04D1C8
-:10A920002168890A01D3F06001E02864FFE7FEE7AF
-:10A93000FFF765FD0B48FBF735FBFFF7AFFFCDE7F2
-:10A940000000104040011800000000800402FFFFDA
-:10A95000881C008008832040F401FFFFB507FFFF3B
-:10A960000000FFFF999F21400020074A01210905AF
-:10A970005061C860D061C8610323DB04034A012130
-:10A98000D1635860FCE70000680E0080C00018002A
-:10A9900080B5C0B0012200210A20FCF7D1FF071CBE
-:10A9A000FF2F28D06946FF22381C0132FDF754F9E9
-:10A9B000FF23013398421BD10D98000918D3381C8E
-:10A9C000FDF78DF80E4901221204086802400D4877
-:10A9D00005D10A68120C06D10968890A03D30A490D
-:10A9E000C046C86002E00949C0460864FFF7BCFFE2
-:10A9F000381CFDF774F840B080BC08BC1847000054
-:10AA00000000104007800000400118000000008096
-:10AA100000B5174901221204086802400620002AE6
-:10AA200005D10A68120C06D10968890A03D31149B5
-:10AA3000C046C86002E01049C04608640320FEF723
-:10AA4000D3FCFBF70DFF01231843FBF7E7FFFFF7EC
-:10AA500083FEFFF79DFFFFF705FEFFF7F5FEFFF70B
-:10AA600009FFFFF79BFDFFF721FF08BC1847000017
-:10AA7000000010404001180000000080F0B4464A79
-:10AA80000121C903454D1923DB01EC18A161288878
-:10AA90004004434BC018871A0420AF60414EC046A3
-:10AAA000B0610820C8234343BB4221D941003D4E39
-:10AAB000C0463161B66920239B1B3A4EC046F36104
-:10AAC000103B33628B00FF1A4008814217D3B82332
-:10AAD0004343BB4208D9411E324BC0469981D981BC
-:10AAE0004000023858610AE001308142EFD206E0AE
-:10AAF0002C4EB3690133B36140008842D2D92A4950
-:10AB00000020A3699B0807D0284B8700CB51A76979
-:10AB1000BF0801308742F8D82249C0468A628C8932
-:10AB200058206043871800200022002C0ADD58239B
-:10AB300043438C6AE31801300004000C9A608B894F
-:10AB40008342F4DCCF62CC89600000194001C71950
-:10AB50000020002C0BDD43001B185B01CC6AE318BE
-:10AB600001300004000C9A60CB898342F3DC4F6211
-:10AB700000200B69002B07D987004B6AC046DA51C9
-:10AB80000B6901308342F7D8496A800008180438FD
-:10AB90002861F0BC70470000B0BE2140680E008004
-:10ABA000000020404C2A00800000204000ADDE0064
-:10ABB0000A4801231B06416999431A094161D16082
-:10ABC0000021A122520391611B23DB01C018816186
-:10ABD000012000065905086070470000680E0080DB
-:10ABE00080B4021C0B481B23DB01C3189A610123AC
-:10ABF0001B0642691A43426187699F4301231B0573
-:10AC00008761DA608069C0461861A12040038161D4
-:10AC100080BC7047680E008080B5FFF7C9FF002038
-:10AC200000F020F800200949002203015F183323B7
-:10AC30009B01FB189A6201300B28F6D304480122CD
-:10AC4000002100F033F880BC08BC1847680E008073
-:10AC50001D3EFFFF00B5024800F004F808BC18478D
-:10AC6000A861000080B4012212050F4BA121490305
-:10AC700000280ED0C861181C59695301194341615D
-:10AC800087699F438761D1608069C046106180BC3D
-:10AC90007047181C5F6901235B069F434761D760BB
-:10ACA0000020C861F3E70000680E0080B0B4071C04
-:10ACB0000020174C03011D1933239B01EB189D6ADB
-:10ACC000BD4205D11D6B954202D1DB6A8B421CD07F
-:10ACD00001300B28EED3002003011D1933239B0103
-:10ACE000EB189B6A002B09D103011C1933239B012C
-:10ACF000E3181A63D9625A639F6202E001300B289D
-:10AD0000EAD30B2801D10020C043B0BC704700003B
-:10AD1000680E008090B4011C00220120164F01E053
-:10AD2000002A07D10301DC1933239B01E3189B6937
-:10AD30008B4211D10201D21933239B01D218936A9D
-:10AD4000C0469361D36AC046D361136BC046136299
-:10AD5000536BC0465362012201300B28E0D3074BEE
-:10AD6000002A02D19A688A4203D10021996090BCDE
-:10AD700070470020C043FAE7680E0080E81B00809F
-:10AD80000B2817DA0C4901235B068A691343012259
-:10AD900012058B6113610001401833239B01C01819
-:10ADA000036BC0464363530188699843886110610F
-:10ADB000012070470020FCE7680E008090B4084A2C
-:10ADC000D0690021074FD369834202D9FC1A2018A9
-:10ADD00000E0C01A0918181CB942F4D990BC704799
-:10ADE00000201440A861000090B5071C0024002F2B
-:10ADF00004D3FFF7E3FF0134BC42FAD990BC08BC8E
-:04AE000018470000EF
-:00000001FF
-/* ver 03.001.008 */
-/*
- * Copyright 1999-2004 3Com Corporation. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms of the 3c990img.h
- * microcode software are permitted provided that the following conditions
- * are met:
- * 1. Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of 3Com may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY 3COM ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3c990img.h
- * MICROCODE SOFTWARE WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY
- * IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS
- * (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT)
- * EMBODIED IN ANY OTHER 3COM HARDWARE OR SOFTWARE EITHER SOLELY OR IN
- * COMBINATION WITH THE 3c990img.h MICROCODE SOFTWARE
- */
diff --git a/firmware/Makefile b/firmware/Makefile
index fa3e81c2a97b..fa0808853883 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -9,144 +9,6 @@ fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir))
fw-external-y := $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE))
-# There are three cases to care about:
-# 1. Building kernel with CONFIG_FIRMWARE_IN_KERNEL=y -- $(fw-shipped-y) should
-# include the firmware files to include, according to .config
-# 2. 'make modules_install', which will install firmware for modules, and
-# _also_ for the in-kernel drivers when CONFIG_FIRMWARE_IN_KERNEL=n
-# 3. 'make firmware_install', which installs all firmware, unconditionally.
-
-# For the former two cases we want $(fw-shipped-y) and $(fw-shipped-m) to be
-# accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all).
-# But be aware that the config file might not be included at all.
-
-ifdef CONFIG_ACENIC_OMIT_TIGON_I
-acenic-objs := acenic/tg2.bin
-fw-shipped- += acenic/tg1.bin
-else
-acenic-objs := acenic/tg1.bin acenic/tg2.bin
-endif
-fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs)
-fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
- adaptec/starfire_tx.bin
-fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
-fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
-fw-shipped-$(CONFIG_BNX2X) += bnx2x/bnx2x-e1-6.2.9.0.fw \
- bnx2x/bnx2x-e1h-6.2.9.0.fw \
- bnx2x/bnx2x-e2-6.2.9.0.fw
-fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-6.2.1a.fw \
- bnx2/bnx2-rv2p-09-6.0.17.fw \
- bnx2/bnx2-rv2p-09ax-6.0.17.fw \
- bnx2/bnx2-mips-06-6.2.1.fw \
- bnx2/bnx2-rv2p-06-6.0.15.fw
-fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin
-fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
- cxgb3/t3c_psram-1.1.0.bin \
- cxgb3/ael2005_opt_edc.bin \
- cxgb3/ael2005_twx_edc.bin \
- cxgb3/ael2020_twx_edc.bin
-fw-shipped-$(CONFIG_DRM_MGA) += matrox/g200_warp.fw matrox/g400_warp.fw
-fw-shipped-$(CONFIG_DRM_R128) += r128/r128_cce.bin
-fw-shipped-$(CONFIG_DRM_RADEON) += radeon/R100_cp.bin radeon/R200_cp.bin \
- radeon/R300_cp.bin radeon/R420_cp.bin \
- radeon/RS690_cp.bin radeon/RS600_cp.bin \
- radeon/R520_cp.bin \
- radeon/R600_pfp.bin radeon/R600_me.bin \
- radeon/RV610_pfp.bin radeon/RV610_me.bin \
- radeon/RV630_pfp.bin radeon/RV630_me.bin \
- radeon/RV620_pfp.bin radeon/RV620_me.bin \
- radeon/RV635_pfp.bin radeon/RV635_me.bin \
- radeon/RV670_pfp.bin radeon/RV670_me.bin \
- radeon/RS780_pfp.bin radeon/RS780_me.bin \
- radeon/RV770_pfp.bin radeon/RV770_me.bin \
- radeon/RV730_pfp.bin radeon/RV730_me.bin \
- radeon/RV710_pfp.bin radeon/RV710_me.bin
-fw-shipped-$(CONFIG_DVB_AV7110) += av7110/bootcode.bin
-fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
-fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
- e100/d102e_ucode.bin
-fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
-fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \
- cis/DP83903.cis cis/NE2K.cis \
- cis/tamarack.cis cis/PE-200.cis \
- cis/PE520.cis
-fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
-fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
-fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \
- cis/COMpad2.cis cis/COMpad4.cis \
- cis/SW_555_SER.cis cis/SW_7xx_SER.cis \
- cis/SW_8xx_SER.cis
-fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
-fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
- advansys/3550.bin advansys/38C0800.bin
-fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \
- qlogic/12160.bin
-fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin
-fw-shipped-$(CONFIG_INFINIBAND_QIB) += qlogic/sd7220.fw
-fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp
-fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \
- ess/maestro3_assp_minisrc.fw
-fw-shipped-$(CONFIG_SND_SB16_CSP) += sb16/mulaw_main.csp sb16/alaw_main.csp \
- sb16/ima_adpcm_init.csp \
- sb16/ima_adpcm_playback.csp \
- sb16/ima_adpcm_capture.csp
-fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \
- yamaha/ds1e_ctrl.fw
-fw-shipped-$(CONFIG_SND_WAVEFRONT) += yamaha/yss225_registers.bin
-fw-shipped-$(CONFIG_TEHUTI) += tehuti/bdx.bin
-fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \
- tigon/tg3_tso5.bin
-fw-shipped-$(CONFIG_TYPHOON) += 3com/typhoon.bin
-fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \
- emi26/bitstream.fw
-fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \
- emi62/spdif.fw emi62/midi.fw
-fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \
- kaweth/new_code_fix.bin \
- kaweth/trigger_code_fix.bin
-ifdef CONFIG_FIRMWARE_IN_KERNEL
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19) += keyspan/usa19.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QI) += keyspan/usa19qi.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QW) += keyspan/usa19qw.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19W) += keyspan/usa19w.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28) += keyspan/usa28.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XA) += keyspan/usa28xa.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XB) += keyspan/usa28xb.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28X) += keyspan/usa28x.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49W) += keyspan/usa49w.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49WLC) += keyspan/usa49wlc.fw
-else
-fw-shipped- += keyspan/mpr.fw keyspan/usa18x.fw keyspan/usa19.fw \
- keyspan/usa19qi.fw keyspan/usa19qw.fw keyspan/usa19w.fw \
- keyspan/usa28.fw keyspan/usa28xa.fw keyspan/usa28xb.fw \
- keyspan/usa28x.fw keyspan/usa49w.fw keyspan/usa49wlc.fw
-endif
-fw-shipped-$(CONFIG_USB_SERIAL_TI) += ti_3410.fw ti_5052.fw \
- mts_cdma.fw mts_gsm.fw mts_edge.fw
-fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT) += edgeport/boot.fw edgeport/boot2.fw \
- edgeport/down.fw edgeport/down2.fw
-fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += edgeport/down3.bin
-fw-shipped-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat_loader.fw whiteheat.fw \
- # whiteheat_loader_debug.fw
-fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda/keyspan_pda.fw
-fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw
-fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw
-fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin
-fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin
-
-fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-)
-
-quiet_cmd_ihex = IHEX $@
- cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@
-
-quiet_cmd_ihex2fw = IHEX2FW $@
- cmd_ihex2fw = $(objtree)/$(obj)/ihex2fw $< $@
-
-quiet_cmd_h16tofw = H16TOFW $@
- cmd_h16tofw = $(objtree)/$(obj)/ihex2fw -w $< $@
-
quiet_cmd_fwbin = MK_FW $@
cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \
FWSTR="$(subst /,_,$(subst .,_,$(subst -,_,$(patsubst \
@@ -179,46 +41,14 @@ wordsize_deps := $(wildcard include/config/64bit.h include/config/32bit.h \
include/config/x86_32.h include/config/x86_64.h \
firmware/Makefile)
-$(patsubst %,$(obj)/%.gen.S, $(fw-shipped-y)): %: $(wordsize_deps)
- $(call cmd,fwbin,$(patsubst %.gen.S,%,$@))
$(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \
include/config/extra/firmware/dir.h
$(call cmd,fwbin,$(fwabs)/$(patsubst $(obj)/%.gen.S,%,$@))
# The .o files depend on the binaries directly; the .S files don't.
-$(patsubst %,$(obj)/%.gen.o, $(fw-shipped-y)): %.gen.o: %
$(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/%
-# .ihex is used just as a simple way to hold binary files in a source tree
-# where binaries are frowned upon. They are directly converted with objcopy.
-$(obj)/%: $(obj)/%.ihex
- $(call cmd,ihex)
-
-# Don't depend on ihex2fw if we're installing and it already exists.
-# Putting it after | in the dependencies doesn't seem sufficient when
-# we're installing after a cross-compile, because ihex2fw has dependencies
-# on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and
-# thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree
-# is exported read-only for someone to run 'make install'.
-ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw)
-ihex2fw_dep :=
-else
-ihex2fw_dep := $(obj)/ihex2fw
-endif
-
-# .HEX is also Intel HEX, but where the offset and length in each record
-# is actually meaningful, because the firmware has to be loaded in a certain
-# order rather than as a single binary blob. Thus, we convert them into our
-# more compact binary representation of ihex records (<linux/ihex.h>)
-$(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep)
- $(call cmd,ihex2fw)
-
-# .H16 is our own modified form of Intel HEX, with 16-bit length for records.
-$(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep)
- $(call cmd,h16tofw)
-
obj-y += $(patsubst %,%.gen.o, $(fw-external-y))
-obj-$(CONFIG_FIRMWARE_IN_KERNEL) += $(patsubst %,%.gen.o, $(fw-shipped-y))
ifeq ($(KBUILD_SRC),)
# Makefile.build only creates subdirectories for O= builds, but external
@@ -226,13 +56,8 @@ ifeq ($(KBUILD_SRC),)
_dummy := $(foreach d,$(addprefix $(obj)/,$(dir $(fw-external-y))), $(shell [ -d $(d) ] || mkdir -p $(d)))
endif
-# Remove .S files and binaries created from ihex
-# (during 'make clean' .config isn't included so they're all in $(fw-shipped-))
-targets := $(fw-shipped-) $(patsubst $(obj)/%,%, \
- $(shell find $(obj) -name \*.gen.S 2>/dev/null))
-
+targets := $(patsubst $(obj)/%,%, \
+ $(shell find $(obj) -name \*.gen.S 2>/dev/null))
# Without this, built-in.o won't be created when it's empty, and the
# final vmlinux link will fail.
obj- := dummy
-
-hostprogs-y := ihex2fw
diff --git a/firmware/README.AddingFirmware b/firmware/README.AddingFirmware
deleted file mode 100644
index bcb5f46aff83..000000000000
--- a/firmware/README.AddingFirmware
+++ /dev/null
@@ -1,45 +0,0 @@
-
- DO NOT ADD FIRMWARE TO THIS DIRECTORY.
- ======================================
-
-This directory is only here to contain firmware images extracted from old
-device drivers which predate the common use of request_firmware().
-
-As we update those drivers to use request_firmware() and keep a clean
-separation between code and firmware, we put the extracted firmware
-here.
-
-This directory is _NOT_ for adding arbitrary new firmware images. The
-place to add those is the separate linux-firmware repository:
-
- git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
-
-That repository contains all these firmware images which have been
-extracted from older drivers, as well various new firmware images which
-we were never permitted to include in a GPL'd work, but which we _have_
-been permitted to redistribute under separate cover.
-
-To submit firmware to that repository, please send either a git binary
-diff or preferably a git pull request to:
-and also cc: to related mailing lists.
-
-Your commit should include an update to the WHENCE file clearly
-identifying the licence under which the firmware is available, and
-that it is redistributable. If the licence is long and involved, it's
-permitted to include it in a separate file and refer to it from the
-WHENCE file.
-And if it were possible, a changelog of the firmware itself.
-
-Ideally, your commit should contain a Signed-Off-By: from someone
-authoritative on the licensing of the firmware in question (i.e. from
-within the company that owns the code).
-
-
-WARNING:
-=======
-
-Don't send any "CONFIDENTIALITY STATEMENT" in your e-mail, patch or
-request. Otherwise your firmware _will never be accepted_.
-
-Maintainers are really busy, so don't expect a prompt reply.
diff --git a/firmware/WHENCE b/firmware/WHENCE
deleted file mode 100644
index de6f22e008f1..000000000000
--- a/firmware/WHENCE
+++ /dev/null
@@ -1,854 +0,0 @@
- **********
- * WHENCE *
- **********
-
-This file attempts to document the origin and licensing information,
-if known, for each piece of firmware distributed for use with the Linux
-kernel.
-
---------------------------------------------------------------------------
-
-Driver: ambassador -- Madge Ambassador (Collage PCI 155 Server) ATM NIC.
-
-File: firmware/atmsar11.fw
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
-
- Madge Ambassador ATM Adapter microcode.
- Copyright (C) 1995-1999 Madge Networks Ltd.
-
- This microcode data is placed under the terms of the GNU General
- Public License. The GPL is contained in /usr/doc/copyright/GPL on a
- Debian system and in the file COPYING in the Linux kernel source.
-
- We would prefer you not to distribute modified versions without
- consultation and not to ask for assembly/other microcode source.
-
---------------------------------------------------------------------------
-
-Driver: korg1212 -- Korg 1212 IO audio device
-
-File: korg/k1212.dsp
-
-Licence: Unknown
-
-Found in alsa-firmware package in hex form; no licensing information.
-
---------------------------------------------------------------------------
-
-Driver: maestro3 -- ESS Allegro Maestro3 audio device
-
-File: ess/maestro3_assp_kernel.fw
-File: ess/maestro3_assp_minisrc.fw
-
-Licence: Unknown
-
-Found in alsa-firmware package in hex form with a comment claiming to
-be GPLv2+, but without source -- and with another comment saying "ESS
-drops binary dsp code images on our heads, but we don't get to see
-specs on the dsp."
-
---------------------------------------------------------------------------
-
-Driver: ymfpci -- Yamaha YMF724/740/744/754 audio devices
-
-File: yamaha/ds1_ctrl.fw
-File: yamaha/ds1_dsp.fw
-File: yamaha/ds1e_ctrl.fw
-
-Licence: Unknown
-
-Found alsa-firmware package in hex form, with the following comment:
- Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved.
-
---------------------------------------------------------------------------
-
-Driver: SCSI_ADVANSYS - AdvanSys SCSI
-
-File: advansys/mcode.bin
-File: advansys/3550.bin
-File: advansys/38C0800.bin
-File: advansys/38C1600.bin
-
-Licence: BSD, no source available.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: SCSI_QLOGIC_1280 - Qlogic QLA 1240/1x80/1x160 SCSI support
-
-File: qlogic/1040.bin
-File: qlogic/1280.bin
-File: qlogic/12160.bin
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
-
- QLOGIC LINUX SOFTWARE
- QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
- Copyright (C) 2001 Qlogic Corporation (www.qlogic.com)
-
---------------------------------------------------------------------------
-
-Driver: kaweth -- USB KLSI KL5USB101-based Ethernet device
-
-File: kaweth/new_code.bin
-File: kaweth/new_code_fix.bin
-File: kaweth/trigger_code.bin
-File: kaweth/trigger_code_fix.bin
-
-Licence: Unknown
-
-Found in hex form in the kernel source.
-
---------------------------------------------------------------------------
-
-Driver: ttusb-budget -- Technotrend/Hauppauge Nova-USB devices
-
-File: ttusb-budget/dspbootcode.bin
-
-Licence: Unknown
-
-Found in hex form in the kernel source.
-
---------------------------------------------------------------------------
-
-Driver: keyspan -- USB Keyspan USA-xxx serial device
-
-File: keyspan/mpr.fw
-File: keyspan/usa18x.fw
-File: keyspan/usa19.fw
-File: keyspan/usa19qi.fw
-File: keyspan/usa19qw.fw
-File: keyspan/usa19w.fw
-File: keyspan/usa28.fw
-File: keyspan/usa28xa.fw
-File: keyspan/usa28xb.fw
-File: keyspan/usa28x.fw
-File: keyspan/usa49w.fw
-File: keyspan/usa49wlc.fw
-
-Converted from Intel HEX files, used in our binary representation of ihex.
-
-Original licence information:
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
-
---------------------------------------------------------------------------
-
-Driver: keyspan_pda -- USB Keyspan PDA single-port serial device
-
-File: keyspan_pda/keyspan_pda.fw
-Source: keyspan_pda/keyspan_pda.S
-
-File: keyspan_pda/xircom_pgs.fw
-Source: keyspan_pda/xircom_pgs.S
-
-Licence: GPLv2+
-
-Compiled from original 8051 source into Intel HEX, used in our binary ihex form.
-
---------------------------------------------------------------------------
-
-Driver: emi26 -- EMI 2|6 USB Audio interface
-
-File: emi26/bitstream.fw
-Info: VERSION=1.1.1.131 DATE=2001dec06
-
-File: emi26/firmware.fw
-Info: VERSION=1.0.2.916 DATE=12.02.2002
-
-File: emi26/loader.fw
-
-Converted from Intel HEX files, used in our binary representation of ihex.
-
-Original licence information:
-/*
- * This firmware is for the Emagic EMI 2|6 Audio Interface
- *
- * The firmware contained herein is Copyright (c) 1999-2002 Emagic
- * as an unpublished work. This notice does not imply unrestricted
- * or public access to this firmware which is a trade secret of Emagic,
- * and which may not be reproduced, used, sold or transferred to
- * any third party without Emagic's written consent. All Rights Reserved.
- *
- * Permission is hereby granted for the distribution of this firmware
- * image as part of a Linux or other Open Source operating system kernel
- * in text or binary form as required.
- *
- * This firmware may not be modified and may only be used with the
- * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of
- * any driver which includes this firmware, in whole or in part,
- * requires the inclusion of this statement.
- */
-
---------------------------------------------------------------------------
-
-Driver: emi62 -- EMI 6|2m USB Audio interface
-
-File: emi62/bitstream.fw
-Info: VERSION=1.0.0.191 DATE= 2002oct28
-
-File: emi62/loader.fw
-Source: EMILOAD.HEX
-Info: VERSION=1.0.2.002 DATE=10.01.2002
-
-File: emi62/midi.fw
-Source: EMI62MFW.HEX
-Info: VERSION=1.04.062 DATE=16.10.2002
-
-File: emi62/spdif.fw
-Source: EMI62SFW.HEX
-Info: VERSION=1.04.062 DATE=16.10.2002
-
-Converted from Intel HEX files, used in our binary representation of ihex.
-
-Original licence information: None
-
---------------------------------------------------------------------------
-
-Driver: ti_usb_3410_5052 -- USB TI 3410/5052 serial device
-
-File: ti_3410.fw
-Info: firmware 9/10/04 FW3410_Special_StartWdogOnStartPort
-
-File: ti_5052.fw
-Info: firmware 9/18/04
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
- Copyright (C) 2004 Texas Instruments
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: ti_usb_3410_5052 -- Multi-Tech USB cell modems
-
-File: mts_cdma.fw
-File: mts_gsm.fw
-File: mts_edge.fw
-
-Licence: "all firmware components are redistributable in binary form"
- Copyright (C) 2005 Multi-Tech Systems, Inc.
-
-Found in hex form in ftp://ftp.multitech.com/wireless/wireless_linux.zip
-
---------------------------------------------------------------------------
-
-Driver: whiteheat -- USB ConnectTech WhiteHEAT serial device
-
-File: whiteheat.fw
-Version: 4.06
-
-File: whiteheat_loader.fw
-File: whiteheat_loader_debug.fw
-
-Licence: Allegedly GPLv2, but no source visible. Marked:
- Copyright (C) 2000-2002 ConnectTech Inc
-
-Debug loader claims the following behaviour:
- Port 1 LED flashes when the vend_ax program is running
- Port 2 LED flashes when any SETUP command arrives
- Port 3 LED flashes when any valid VENDOR request occurs
- Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
-
-Converted from Intel HEX files, used in our binary representation of ihex.
-
---------------------------------------------------------------------------
-
-Driver: CPiA2 -- cameras based on Vision's CPiA2
-
-File: cpia2/stv0672_vp4.bin
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
- Copyright (C) 2001 STMicroelectronics, Inc.
- Description: This file contains patch data for the CPiA2 (stv0672) VP4.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: DABUSB -- Digital Audio Broadcasting (DAB) Receiver for USB and Linux
-
-File: dabusb/firmware.fw
-File: dabusb/bitstream.bin
-
-Licence: Distributable
-
- * Copyright (C) 1999 BayCom GmbH
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
-
---------------------------------------------------------------------------
-
-Driver: USB_VICAM -- USB 3com HomeConnect (aka vicam)
-
-File: vicam/firmware.fw
-
-Licence: Unknown
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: USB_SERIAL_EDGEPORT - USB Inside Out Edgeport Serial Driver
-
-File: edgeport/boot.fw
-File: edgeport/boot2.fw
-File: edgeport/down.fw
-File: edgeport/down2.fw
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
-//**************************************************************
-//* Edgeport/4 Binary Image
-//* Generated by HEX2C v1.06
-//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
-//**************************************************************
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: USB_SERIAL_EDGEPORT_TI - USB Inside Out Edgeport Serial Driver
-(TI Devices)
-
-File: edgeport/down3.bin
-
-Licence:
-//**************************************************************
-//* Edgeport Binary Image (for TI based products)
-//* Generated by TIBin2C v2.00 (watchport)
-//* Copyright (C) 2001 Inside Out Networks, All rights reserved.
-//**************************************************************
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: ATARI_DSP56K - Atari DSP56k support
-
-File: dsp56k/bootstrap.bin
-Source: dsp56k/bootstrap.asm
-
-Licence: GPLv2 or later
-
-DSP56001 assembler, possibly buildable with a56 from
-http://www.zdomain.com/a56.html
-
---------------------------------------------------------------------------
-
-Driver: SND_SB16_CSP - Sound Blaster 16/AWE CSP support
-
-File: sb16/mulaw_main.csp
-File: sb16/alaw_main.csp
-File: sb16/ima_adpcm_init.csp
-File: sb16/ima_adpcm_playback.csp
-File: sb16/ima_adpcm_capture.csp
-
-Licence: Allegedly GPLv2+, but no source visible. Marked:
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: CASSINI - Sun Cassini
-
-File: sun/cassini.bin
-
-Licence: Unknown
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter
-
-File: cxgb3/t3b_psram-1.1.0.bin.ihex
-File: cxgb3/t3c_psram-1.1.0.bin.ihex
-file: cxgb3/t3fw-7.4.0.bin.ihex
-
-License: GPLv2 or OpenIB.org BSD license, no source visible
-
---------------------------------------------------------------------------
-
-Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter
-
-File: cxgb3/ael2005_opt_edc.bin.ihex
-File: cxgb3/ael2005_twx_edc.bin.ihex
-File: cxgb3/ael2020_twx_edc.bin.ihex
-
-Licence:
- * Copyright (c) 2007-2009 NetLogic Microsystems, Inc.
- *
- * Permission is hereby granted for the distribution of this firmware
- * data in hexadecimal or equivalent format, provided this copyright
- * notice is accompanying it.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: e100 -- Intel PRO/100 Ethernet NIC
-
-File: e100/d101m_ucode.bin
-File: e100/d101s_ucode.bin
-File: e100/d102e_ucode.bin
-
-Licence: Unknown
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: acenic -- Alteon AceNIC Gigabit Ethernet card
-
-File: acenic/tg1.bin
-File: acenic/tg2.bin
-
-Licence: Unknown
-
-Found in hex form in kernel source, but source allegedly available at
-http://alteon.shareable.org/
-
---------------------------------------------------------------------------
-
-Driver: tigon3 -- Broadcom Tigon3 based gigabit Ethernet cards
-
-File: tigon/tg3.bin
-File: tigon/tg3_tso.bin
-File: tigon/tg3_tso5.bin
-
-Licence:
- * Firmware is:
- * Derived from proprietary unpublished source code,
- * Copyright (C) 2000-2003 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware
- * data in hexadecimal or equivalent format, provided this copyright
- * notice is accompanying it.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: ADAPTEC_STARFIRE - Adaptec Starfire/DuraLAN support
-
-File: adaptec/starfire_rx.bin
-File: adaptec/starfire_tx.bin
-
-Licence: Allegedly GPLv2, but no source visible.
-
-Found in hex form in kernel source, with the following notice:
-
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND
- THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE
- IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE
- (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR
- OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR
- DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
- ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM.
-
---------------------------------------------------------------------------
-
-Driver: TEHUTI - Tehuti Networks 10G Ethernet
-
-File: tehuti/bdx.bin
-
-Licence:
-
- Copyright (C) 2007 Tehuti Networks Ltd.
-
- Permission is hereby granted for the distribution of this firmware data
- in hexadecimal or equivalent format, provided this copyright notice is
- accompanying it.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: TYPHOON - 3cr990 series Typhoon
-
-File: 3com/typhoon.bin
-
-Licence:
-/*
- * Copyright 1999-2004 3Com Corporation. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms of the 3c990img.h
- * microcode software are permitted provided that the following conditions
- * are met:
- * 1. Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of 3Com may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY 3COM ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3c990img.h
- * MICROCODE SOFTWARE WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY
- * IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS
- * (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT)
- * EMBODIED IN ANY OTHER 3COM HARDWARE OR SOFTWARE EITHER SOLELY OR IN
- * COMBINATION WITH THE 3c990img.h MICROCODE SOFTWARE
- */
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: YAM - YAM driver for AX.25
-
-File: yam/1200.bin
-File: yam/9600.bin
-
-Licence:
- * (C) F6FBB 1998
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter
-
-File: cis/LA-PCM.cis
- cis/PCMLM28.cis
- cis/DP83903.cis
- cis/NE2K.cis
- cis/tamarack.cis
- cis/PE-200.cis
- cis/PE520.cis
-
-Licence: GPL
-
-Originally developed by the pcmcia-cs project
-
---------------------------------------------------------------------------
-
-Driver: PCMCIA_3C589 - 3Com PCMCIA adapter
-
-File: cis/3CXEM556.cis
-
-Licence: GPL
-
-Originally developed by the pcmcia-cs project
-
---------------------------------------------------------------------------
-
-Driver: PCMCIA_3C574 - 3Com PCMCIA adapter
-
-File: cis/3CCFEM556.cis
-
-Licence: GPL
-
-Originally developed by the pcmcia-cs project
-
---------------------------------------------------------------------------
-
-Driver: SERIAL_8250_CS - Serial PCMCIA adapter
-
-File: cis/MT5634ZLX.cis
- cis/RS-COM-2P.cis
- cis/COMpad2.cis
- cis/COMpad4.cis
- cis/SW_555_SER.cis
- cis/SW_7xx_SER.cis
- cis/SW_8xx_SER.cis
-
-Licence: GPL
-
-Originally developed by the pcmcia-cs project
-
---------------------------------------------------------------------------
-
-Driver: PCMCIA_SMC91C92 - SMC 91Cxx PCMCIA
-
-File: ositech/Xilinx7OD.bin
-
-Licence: Allegedly GPL, but no source visible. Marked:
- This file contains the firmware of Seven of Diamonds from OSITECH.
- (Special thanks to Kevin MacPherson of OSITECH)
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: SCSI_QLOGICPTI - PTI Qlogic, ISP Driver
-
-File: qlogic/isp1000.bin
-
-Licence: Unknown
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: MYRI_SBUS - MyriCOM Gigabit Ethernet
-
-File: myricom/lanai.bin
-
-Licence: Unknown
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: bnx2x: Broadcom Everest
-
-File: bnx2x/bnx2x-e1-6.2.9.0.fw
-File: bnx2x/bnx2x-e1h-6.2.9.0.fw
-File: bnx2x/bnx2x-e2-6.2.9.0.fw
-
-License:
- Copyright (c) 2007-2011 Broadcom Corporation
-
- This file contains firmware data derived from proprietary unpublished
- source code, Copyright (c) 2007-2011 Broadcom Corporation.
-
- Permission is hereby granted for the distribution of this firmware data
- in hexadecimal or equivalent format, provided this copyright notice is
- accompanying it.
-
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: BNX2 - Broadcom NetXtremeII
-
-File: bnx2/bnx2-mips-06-6.2.1.fw
-File: bnx2/bnx2-rv2p-06-6.0.15.fw
-File: bnx2/bnx2-mips-09-6.2.1a.fw
-File: bnx2/bnx2-rv2p-09-6.0.17.fw
-File: bnx2/bnx2-rv2p-09ax-6.0.17.fw
-
-Licence:
-
- This file contains firmware data derived from proprietary unpublished
- source code, Copyright (c) 2004 - 2010 Broadcom Corporation.
-
- Permission is hereby granted for the distribution of this firmware data
- in hexadecimal or equivalent format, provided this copyright notice is
- accompanying it.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: DVB AV7110 -- AV7110 cards
-
-File: av7110/bootcode.bin
-
-Licence: GPLv2 or later
-
-ARM assembly source code available at https://linuxtv.org/downloads/firmware/Boot.S
-
---------------------------------------------------------------------------
-
-Driver: wavefront - ISA WaveFront sound card
-
-File: yamaha/yss225_registers.bin
-
-Licence: Allegedly GPLv2+, but no source visible.
-
-Found in hex form in kernel source, with the following comment:
- Copyright (c) 1998-2002 by Paul Davis <[email protected]>
-
---------------------------------------------------------------------------
-
-Driver: mga - Matrox G200/G400/G550
-
-File: matrox/g200_warp.fw
-File: matrox/g400_warp.fw
-
-Licence:
-
-Copyright 1999 Matrox Graphics Inc.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-MATROX GRAPHICS INC., OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: r128 - ATI Rage 128
-
-File: r128/r128_cce.bin
-
-Licence:
-
-Copyright 2000 Advanced Micro Devices, Inc.
-
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
-
-Found in decimal form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: radeon - ATI Radeon
-
-File: radeon/R100_cp.bin
-File: radeon/R200_cp.bin
-File: radeon/R300_cp.bin
-File: radeon/R420_cp.bin
-File: radeon/RS600_cp.bin
-File: radeon/RS690_cp.bin
-File: radeon/R520_cp.bin
-File: radeon/R600_pfp.bin
-File: radeon/R600_me.bin
-File: radeon/RV610_pfp.bin
-File: radeon/RV610_me.bin
-File: radeon/RV630_pfp.bin
-File: radeon/RV630_me.bin
-File: radeon/RV620_pfp.bin
-File: radeon/RV620_me.bin
-File: radeon/RV635_pfp.bin
-File: radeon/RV635_me.bin
-File: radeon/RV670_pfp.bin
-File: radeon/RV670_me.bin
-File: radeon/RS780_pfp.bin
-File: radeon/RS780_me.bin
-File: radeon/RV770_pfp.bin
-File: radeon/RV770_me.bin
-File: radeon/RV730_pfp.bin
-File: radeon/RV730_me.bin
-File: radeon/RV710_pfp.bin
-File: radeon/RV710_me.bin
-
-Licence:
-
- * Copyright 2007-2009 Advanced Micro Devices, Inc.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
-
-Driver: ib_qib - QLogic Infiniband
-
-File: qlogic/sd7220.fw
-
-Licence:
-
- * Copyright (c) 2007, 2008 QLogic Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses. You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
-
-Found in hex form in kernel source.
-
---------------------------------------------------------------------------
diff --git a/firmware/acenic/tg1.bin.ihex b/firmware/acenic/tg1.bin.ihex
deleted file mode 100644
index bef2659d3645..000000000000
--- a/firmware/acenic/tg1.bin.ihex
+++ /dev/null
@@ -1,4573 +0,0 @@
-:100000000C040B0000004000000040001000000342
-:10001000000000000000000D0000000D3C1D00016C
-:100020008FBD5C5403A0F0213C100000261040005E
-:100030000C00100C000000000000000D27BDFFD8D0
-:100040003C1CC0003C1B0013377BD8000000D021B3
-:100050003C17001336F7541802E02021340583E8DA
-:10006000AFBF00240C002488AFB000200C0023E8B0
-:10007000000000003C040001248451A42405000178
-:1000800002E03021000038213C10000126107E5093
-:10009000AFB000100C002403AFBB00143C02000FF3
-:1000A0003442FFFF020210240362102B10400009AB
-:1000B000240500033C040001248451B002003021D7
-:1000C000036038213C020010AFA200100C00240392
-:1000D000AFA00014000020213405C0003C01000145
-:1000E00000370821A02083B03C010001003708211F
-:1000F000A02083B23C01000100370821A02083B377
-:100100003C01000100370821AC2083B4A2E004D8F0
-:10011000000418C02484000100771021AC40727CD8
-:1001200000771021AC40728002E31021A445727C5C
-:100130002C8200201440FFF7000418C0000020218A
-:100140003405C000000418C0248400010077102189
-:10015000AC40737C00771021AC40738002E3102127
-:10016000A445737C2C8200805440FFF7000418C023
-:10017000AF800054AF80011C8F82004434420040A5
-:10018000AF8200448F82004434420020AF8200449A
-:100190008F420218304200021040000900000000A7
-:1001A0008F4202203C030002346300040043102508
-:1001B000AEE204C48F42021C0800107434420004F2
-:1001C0008F4202203C0300023463000600431025E6
-:1001D000AEE204C48F42021C34420006AEE204CCFC
-:1001E0008F420218304200101040000A0000000048
-:1001F0008F42021C34420004AEE204C88F42022047
-:100200003C03000A34630004004310250800108AF0
-:10021000AEE204C08F4202203C03000A34630006B1
-:1002200000431025AEE204C08F42021C3442000697
-:10023000AEE204C88F4202183042020010400003B0
-:100240002402000108001091A2E27248A2E0724864
-:1002500024020001AF8200A0AF8200B08F8300545F
-:100260008F82005408001099246300648F82005428
-:10027000006210232C4200651440FFFC00000000C7
-:10028000AF8000448F4202088F43020CAEE20010A0
-:10029000AEE300148EE400108EE5001426E2003078
-:1002A000AEE2002824020490AEE20018AF84009071
-:1002B000AF8500948EE20028AF8200B496E2001A67
-:1002C000AF82009C8F8200B08EE304CC00431025E7
-:1002D000AF8200B08F8200B0304200041440FFFDB6
-:1002E000000000008EE204508EE30454AEE304FCF0
-:1002F0008EE204FC2442E0002C4220011440000D58
-:1003000026E400308EE204508EE304543C040001E5
-:10031000248451BC3C050001AFA00010AFA0001424
-:100320008EE704FC34A5F0000C00240300603021AB
-:1003300026E400300C0024882405040027440080B3
-:100340000C0024882405008026E4777C0C00248897
-:10035000240504008F42025C26E40094AEE20060B3
-:100360008F4202602745020024060008AEE20068C2
-:10037000240200060C00249AAEE200643C023B9A80
-:100380003442CA000000202124030002AEE30074BE
-:10039000AEE30070AEE2006C240203E8AEE20104BA
-:1003A00024020001AEE30100AEE2010C3C030001B7
-:1003B0000064182190635C2002E410212484000171
-:1003C000A043009C2C82000F1440FFF800000000A6
-:1003D0008F82004002E418212484000100021702E9
-:1003E00024420030A062009C02E41021A040009C46
-:1003F00096E2046A30420003144000090000000045
-:1004000096E2047A30420003504001313C03080078
-:1004100096E2046A304200031040002A3C020700C2
-:1004200096E2047A30420003104000263C020700A6
-:1004300096E3047A96E2046A146200223C02070002
-:100440008EE204C024030001A2E34E2034420E00D9
-:10045000AEE204C08F420218304201001040000595
-:10046000000000003C0200012442E1680800111D68
-:10047000000211003C0200012442D35C0002110082
-:10048000000211823C030800004310253C010001DA
-:10049000AC2212383C0200012442F6800002110016
-:1004A000000211823C030800004310253C010001BA
-:1004B000AC2212788EE2000034424000080012386C
-:1004C000AEE2000034423000AFA200188EE206080F
-:1004D0008F43022824420001304900FF512300E2EB
-:1004E000AFA000108EE20608000210C000571021D5
-:1004F0008FA300188FA4001CAC43060CAC4406105C
-:100500008F8701202762380024E800200102102B89
-:1005100050400001276830008F820128110200043A
-:10052000000000008F820124150200070000102146
-:100530008EE201A40000302124420001AEE201A4B9
-:10054000080011A08EE201A48EE40608000420C079
-:10055000008018218EE404308EE5043400A32821A5
-:1005600000A3302B0082202100862021ACE4000073
-:10057000ACE500048EE3060824020008A4E2000EA5
-:100580002402000DACE20018ACE9001C000318C006
-:100590002463060C02E31021ACE200088EE204C4DE
-:1005A000ACE20010AF88012092E24E2014400037E8
-:1005B000240600018EE24E30000210C02442503862
-:1005C00002E220218C830000240200071462001F35
-:1005D000000000008EE34E308EE24E341062001BAD
-:1005E000240300408C82000424420001AC820004F9
-:1005F0008EE24E348EE54E30244200011043000757
-:10060000000000008EE24E342442000110A20005DA
-:10061000000000000800118A0000000014A000057E
-:10062000000000008F82012824420020AF820128B0
-:100630008F8201288C8200042C420011504000134C
-:10064000AC800000080011A0000000008EE24E30D7
-:100650002403004024420001504300030000102105
-:100660008EE24E3024420001AEE24E308EE24E3039
-:10067000000210C02442503802E220212402000768
-:10068000AC82000024020001AC82000454C0000CC3
-:10069000AEE906083C040001248451C8AFA0001054
-:1006A000AFA000148EE606088F4702283C0500091B
-:1006B0000C00240334A5F000080012230000000001
-:1006C0008F830120276238002466002000C2102B8F
-:1006D00050400001276630008F82012810C20004BC
-:1006E000000000008F82012414C2000700000000F7
-:1006F0008EE201A40000302124420001AEE201A4F8
-:10070000080012078EE201A48EE20608AC62001C0B
-:100710008EE404A08EE504A42462001CAC620008F0
-:1007200024020008A462000E24020011AC6200182A
-:10073000AC640000AC6500048EE204C4AC6200103E
-:10074000AF86012092E24E201440003724060001BB
-:100750008EE24E30000210C02442503802E22021C6
-:100760008C830000240200121462001F00000000AD
-:100770008EE34E308EE24E341062001B24030040A4
-:100780008C82000424420001AC8200048EE24E34CC
-:100790008EE54E30244200011043000700000000A7
-:1007A0008EE24E342442000110A200050000000039
-:1007B000080011F10000000014A000050000000076
-:1007C0008F82012824420020AF8201288F820128D5
-:1007D0008C8200042C42001150400013AC800000B9
-:1007E00008001207000000008EE24E302403004093
-:1007F0002442000150430003000010218EE24E30DD
-:1008000024420001AEE24E308EE24E30000210C0B3
-:100810002442503802E2202124020012AC8200005F
-:1008200024020001AC82000414C0001B0000000080
-:100830003C040001248451D0AFA00010AFA00014EC
-:100840008EE606088F4702283C0500090C002403A9
-:1008500034A5F0018EE201B024420001AEE201B005
-:10086000080012238EE201B03C040001248451DC14
-:10087000AFA000148EE606088F4702283C05000949
-:100880000C00240334A5F0058EE201AC24420001E3
-:10089000AEE201AC8EE201AC8EE201603C040001EC
-:1008A000248451E83405F00124420001AEE20160E5
-:1008B0008EE201600000302100003821AFA000105E
-:1008C0000C002403AFA00014080012380000000040
-:1008D0003C0200012442F5A800021100000211822E
-:1008E000004310253C010001AC22127896E2045A24
-:1008F00030420003104000253C050FFF8EE204C883
-:1009000034A5FFFF34420A00AEE204C88EE304C8F7
-:100910003C040001248451F424020001A2E204EC0E
-:10092000A2E204ED3C020002006218253C02000134
-:100930002442A3900045102400021082AEE304C8B4
-:100940003C030800004310253C010001AC221220AA
-:100950003C0200012442ADD4004510240002108264
-:10096000004310253C010001AC22128096E6045A97
-:100970000000382124050011AFA000100C00240352
-:10098000AFA0001408001268000000003C02000143
-:100990002442A9D400021100000211823C03080085
-:1009A000004310253C010001AC22128096E2046A4B
-:1009B00030420010144000090000000096E2047A62
-:1009C00030420010104001120000000096E2046A5C
-:1009D00030420010104000053C02070096E2047A05
-:1009E00030420010144001023C0207003442300043
-:1009F000AFA200188EE206088F43022824420001AD
-:100A0000304900FF512300E2AFA000108EE206083B
-:100A1000000210C0005710218FA300188FA4001CE3
-:100A2000AC43060CAC4406108F87012027623800C7
-:100A300024E800200102102B5040000127683000FC
-:100A40008F82012811020004000000008F8201241F
-:100A500015020007000010218EE201A400003021E1
-:100A600024420001AEE201A4080012EA8EE201A4D1
-:100A70008EE40608000420C0008018218EE40430B3
-:100A80008EE5043400A3282100A3302B008220210E
-:100A900000862021ACE40000ACE500048EE30608EB
-:100AA00024020008A4E2000E2402000DACE20018AB
-:100AB000ACE9001C000318C02463060C02E31021FB
-:100AC000ACE200088EE204C4ACE20010AF88012062
-:100AD00092E24E2014400037240600018EE24E3090
-:100AE000000210C02442503802E220218C83000012
-:100AF000240200071462001F000000008EE34E3045
-:100B00008EE24E341062001B240300408C820004ED
-:100B100024420001AC8200048EE24E348EE54E3059
-:100B20002442000110430007000000008EE24E3412
-:100B30002442000110A2000500000000080012D4A9
-:100B40000000000014A00005000000008F820128B2
-:100B500024420020AF8201288F8201288C82000469
-:100B60002C42001150400013AC800000080012EA33
-:100B7000000000008EE24E302403004024420001B9
-:100B800050430003000010218EE24E302442000149
-:100B9000AEE24E308EE24E30000210C02442503899
-:100BA00002E2202124020007AC820000240200019E
-:100BB000AC82000454C0000CAEE906083C040001FD
-:100BC000248451C8AFA00010AFA000148EE6060820
-:100BD0008F4702283C0500090C00240334A5F000CF
-:100BE0000800136D000000008F8301202762380089
-:100BF0002466002000C2102B504000012766300000
-:100C00008F82012810C20004000000008F8201249E
-:100C100014C20007000000008EE201A40000302191
-:100C200024420001AEE201A4080013518EE201A4A7
-:100C30008EE20608AC62001C8EE404A08EE504A4DB
-:100C40002462001CAC62000824020008A462000EAA
-:100C500024020011AC620018AC640000AC65000412
-:100C60008EE204C4AC620010AF86012092E24E20F6
-:100C700014400037240600018EE24E30000210C0FE
-:100C80002442503802E220218C830000240200120A
-:100C90001462001F000000008EE34E308EE24E34DE
-:100CA0001062001B240300408C82000424420001D7
-:100CB000AC8200048EE24E348EE54E3024420001B8
-:100CC00010430007000000008EE24E342442000171
-:100CD00010A20005000000000800133B0000000007
-:100CE00014A00005000000008F820128244200208B
-:100CF000AF8201288F8201288C8200042C420011CF
-:100D000050400013AC8000000800135100000000A8
-:100D10008EE24E3024030040244200015043000381
-:100D2000000010218EE24E3024420001AEE24E302F
-:100D30008EE24E30000210C02442503802E22021E0
-:100D400024020012AC82000024020001AC820004E4
-:100D500014C0001B000000003C040001248451D09A
-:100D6000AFA00010AFA000148EE606088F4702283F
-:100D70003C0500090C00240334A5F0018EE201B00B
-:100D800024420001AEE201B00800136D8EE201B012
-:100D90003C040001248451DCAFA000148EE6060858
-:100DA0008F4702283C0500090C00240334A5F005F8
-:100DB0008EE201AC24420001AEE201AC8EE201AC55
-:100DC0008EE201603C040001248451E83405F00205
-:100DD00024420001AEE201608EE201600000302199
-:100DE00000003821AFA000100C002403AFA00014B5
-:100DF00096E6047A96E7046A3C04000124845200D3
-:100E000024050012AFA000100C002403AFA00014B2
-:100E10000C004500000000000C002318000000003A
-:100E20003C06000134C63800AEE00608AF40022898
-:100E3000AF40022C96E304588EE400003C0512D823
-:100E400034A5C35827623800AEE2725827623800D2
-:100E5000AEE2726027623800AEE27264036610216F
-:100E6000AEE272702402FFFFAEE004D4AEE004E014
-:100E7000AEE004E4AEE004F0A2E004F4AEE00E0C58
-:100E8000AEE00E18AEE00E10AEE00E14AEE00E1C9A
-:100E9000AEE0724CAEE05244AEE05240AEE0523CA6
-:100EA000AEE07250AEE07254AEE0725CAEE07268DA
-:100EB000AEE004D02463FFFF00852025AEE304F8F4
-:100EC000AEE40000AF800060AF8200643C0201002D
-:100ED000AFA200188EE206088F43022824420001C8
-:100EE000304900FF512300E2AFA000108EE2060857
-:100EF000000210C0005710218FA300188FA4001CFF
-:100F0000AC43060CAC4406108F87012027623800E2
-:100F100024E800200102102B504000012768300017
-:100F20008F82012811020004000000008F8201243A
-:100F300015020007000010218EE201A400003021FC
-:100F400024420001AEE201A4080014228EE201A4B2
-:100F50008EE40608000420C0008018218EE40430CE
-:100F60008EE5043400A3282100A3302B0082202129
-:100F700000862021ACE40000ACE500048EE3060806
-:100F800024020008A4E2000E2402000DACE20018C6
-:100F9000ACE9001C000318C02463060C02E3102116
-:100FA000ACE200088EE204C4ACE20010AF8801207D
-:100FB00092E24E2014400037240600018EE24E30AB
-:100FC000000210C02442503802E220218C8300002D
-:100FD000240200071462001F000000008EE34E3060
-:100FE0008EE24E341062001B240300408C82000409
-:100FF00024420001AC8200048EE24E348EE54E3075
-:101000002442000110430007000000008EE24E342D
-:101010002442000110A20005000000000800140C8A
-:101020000000000014A00005000000008F820128CD
-:1010300024420020AF8201288F8201288C82000484
-:101040002C42001150400013AC8000000800142214
-:10105000000000008EE24E302403004024420001D4
-:1010600050430003000010218EE24E302442000164
-:10107000AEE24E308EE24E30000210C024425038B4
-:1010800002E2202124020007AC82000024020001B9
-:10109000AC82000454C0000CAEE906083C04000118
-:1010A000248451C8AFA00010AFA000148EE606083B
-:1010B0008F4702283C0500090C00240334A5F000EA
-:1010C000080014A5000000008F830120276238006B
-:1010D0002466002000C2102B50400001276630001B
-:1010E0008F82012810C20004000000008F820124BA
-:1010F00014C20007000000008EE201A400003021AD
-:1011000024420001AEE201A4080014898EE201A489
-:101110008EE20608AC62001C8EE404A08EE504A4F6
-:101120002462001CAC62000824020008A462000EC5
-:1011300024020011AC620018AC640000AC6500042D
-:101140008EE204C4AC620010AF86012092E24E2011
-:1011500014400037240600018EE24E30000210C019
-:101160002442503802E220218C8300002402001225
-:101170001462001F000000008EE34E308EE24E34F9
-:101180001062001B240300408C82000424420001F2
-:10119000AC8200048EE24E348EE54E3024420001D3
-:1011A00010430007000000008EE24E34244200018C
-:1011B00010A20005000000000800147300000000E9
-:1011C00014A00005000000008F82012824420020A6
-:1011D000AF8201288F8201288C8200042C420011EA
-:1011E00050400013AC80000008001489000000008B
-:1011F0008EE24E302403004024420001504300039D
-:10120000000010218EE24E3024420001AEE24E304A
-:101210008EE24E30000210C02442503802E22021FB
-:1012200024020012AC82000024020001AC820004FF
-:1012300014C0001B000000003C040001248451D0B5
-:10124000AFA00010AFA000148EE606088F4702285A
-:101250003C0500090C00240334A5F0018EE201B026
-:1012600024420001AEE201B0080014A58EE201B0F4
-:101270003C040001248451DCAFA000148EE6060873
-:101280008F4702283C0500090C00240334A5F00513
-:101290008EE201AC24420001AEE201AC8EE201AC70
-:1012A0008EE2015424420001AEE201540C0014DC31
-:1012B0008EE201548F8200A0304200041440FFFDF2
-:1012C000000000008F8200403042000114400008FE
-:1012D000000000008F43010424020001106200049A
-:1012E000000000008F420264104000060000000071
-:1012F0008EE2017C24420001AEE2017C080014C5AC
-:101300008EE2017C8F82004434420004AF820044AC
-:101310008EE2017824420001AEE201788EE201788B
-:101320008F8200D88F8300D400431023AEE2726C0A
-:101330008EE2726C1C4000033C030001004310214C
-:10134000AEE2726C0C004064000000000C004440EF
-:10135000AF8002288FBF00248FB0002003E0000878
-:1013600027BD002803E000080000000003E000089B
-:101370000000000000000000000000002402002C1B
-:10138000AF820050AEE072748F420238AEE27278E3
-:101390008F82005424420067AF820058AEE07B8801
-:1013A000AEE07B8CAEE07B843C010001003708217D
-:1013B000AC2083BC3C0100010037082103E0000899
-:1013C000A02083B927BDFFD8AFBF0024AFB0002055
-:1013D0008F8200543C0300018C635CD82442006778
-:1013E0001060000DAF8200583C0200010057102130
-:1013F000904283B8104000053C0302003C0100010C
-:101400000037082108001503A02083B88EE20000F1
-:1014100000431025AEE200008F4202183042010066
-:10142000104000C6000000008F8200B0304200046F
-:10143000104000C2000000003C03000100771821AA
-:101440008C6383D08F820104146200B4000000001A
-:101450003C030001007718218C6383D48F8200B491
-:10146000146200AE000000008F8200B03C030080D8
-:10147000004310241040000D000000008F82011C6A
-:1014800034420002AF82011C8F8200B02403FFFBB4
-:1014900000431024AF8200B08F82011C2403FFFDA3
-:1014A00000431024080015CCAF82011C3C0300014E
-:1014B000007718218C6383D08F820104146200822C
-:1014C000000000003C030001007718218C6383D4E6
-:1014D0008F8200B41462007C000000003C07000111
-:1014E00000F738218CE783D08F8200B03C040001E4
-:1014F00024845270AFA00014AFA200108F8600B0F9
-:101500003C0500050C00240334A509008F82011C52
-:1015100034420002AF82011C8F8301048F8200B02D
-:1015200034420001AF8200B0AF8301048F830120F9
-:10153000276238002466002000C2102B50400001B2
-:10154000276630008F82012810C2000400000000CE
-:101550008F82012414C20006000000008EE201A464
-:1015600024420001AEE201A4080015A08EE201A40D
-:101570008F4402088F45020C26E20030AC6200085E
-:1015800024020400A462000E2402000FAC620018C2
-:10159000AC60001CAC640000AC6500048EE204C4C6
-:1015A000AC620010AF86012092E24E20144000375A
-:1015B000000000008EE24E30000210C0244250387D
-:1015C00002E220218C830000240200071462001F25
-:1015D000000000008EE34E308EE24E341062001B9D
-:1015E000240300408C82000424420001AC820004E9
-:1015F0008EE24E348EE54E30244200011043000747
-:10160000000000008EE24E342442000110A20005CA
-:10161000000000000800158A0000000014A000056A
-:10162000000000008F82012824420020AF820128A0
-:101630008F8201288C8200042C420011504000133C
-:10164000AC800000080015A0000000008EE24E30C3
-:1016500024030040244200015043000300001021F5
-:101660008EE24E3024420001AEE24E308EE24E3029
-:10167000000210C02442503802E220212402000758
-:10168000AC82000024020001AC8200048F82011CA5
-:101690002403FFFD00431024AF82011C8EE201E40D
-:1016A0003C07000100F738218CE783D02442000179
-:1016B000AEE201E48EE201E43C0400012484527CA9
-:1016C000080015BDAFA000108F8201043C0100018D
-:1016D00000370821AC2283D08F8200B43C07000180
-:1016E00000F738218CE783D03C0400012484528425
-:1016F0003C01000100370821AC2283D4AFA00010C8
-:10170000AFA000148F8600B03C0500050C00240338
-:1017100034A50900080015CC000000008F820104E8
-:101720003C01000100370821AC2283D08F8200B435
-:101730003C01000100370821AC2283D48EE2727490
-:1017400092E304F42442006714600006AEE272746F
-:101750008EE272748F4302340043102B1440007BDE
-:10176000000000008EE304E48EE204F8146200043A
-:101770000000000092E204F450400074A2E004F47F
-:101780008F830120276238002466002000C2102BBE
-:1017900050400001276630008F82012810C20004EB
-:1017A000000000008F82012414C200070000000026
-:1017B0008EE201A40000802124420001AEE201A4D7
-:1017C000080016378EE201A48EE204E4AC62001C2D
-:1017D0008EE404B08EE504B42462001CAC62000800
-:1017E00024020008A462000E24020011AC6200185A
-:1017F000AC640000AC6500048EE204C4AC6200106E
-:10180000AF86012092E24E201440003724100001E0
-:101810008EE24E30000210C02442503802E22021F5
-:101820008C830000240200121462001F00000000DC
-:101830008EE34E308EE24E341062001B24030040D3
-:101840008C82000424420001AC8200048EE24E34FB
-:101850008EE54E30244200011043000700000000D6
-:101860008EE24E342442000110A200050000000068
-:10187000080016210000000014A000050000000070
-:101880008F82012824420020AF8201288F82012804
-:101890008C8200042C42001150400013AC800000E8
-:1018A00008001637000000008EE24E30240300408E
-:1018B0002442000150430003000010218EE24E300C
-:1018C00024420001AEE24E308EE24E30000210C0E3
-:1018D0002442503802E2202124020012AC8200008F
-:1018E00024020001AC8200045600000B2410000109
-:1018F0008EE204E43C0400012484528CAFA0001466
-:10190000AFA200108EE606088F4702283C050009AA
-:101910000C00240334A5F006160000032402000185
-:1019200008001650A2E204F48EE201702442000185
-:10193000AEE201708EE201708EE204E4A2E004F4F3
-:10194000AEE004F0AEE07274AEE204F88EE20E1C7B
-:101950001040006D000000008F83012027623800D6
-:101960002466002000C2102B504000012766300082
-:101970008F82012810C20004000000008F82012421
-:1019800014C20007000000008EE201A400008021C4
-:1019900024420001AEE201A4080016AD8EE201A4CB
-:1019A0008EE2724CAC62001C8EE404A88EE504AC9E
-:1019B0002462001CAC62000824020008A462000E2D
-:1019C00024020011AC620018AC640000AC65000495
-:1019D0008EE204C4AC620010AF86012092E24E2079
-:1019E00014400037241000018EE24E30000210C077
-:1019F0002442503802E220218C830000240200128D
-:101A00001462001F000000008EE34E308EE24E3460
-:101A10001062001B240300408C8200042442000159
-:101A2000AC8200048EE24E348EE54E30244200013A
-:101A300010430007000000008EE24E3424420001F3
-:101A400010A200050000000008001697000000002A
-:101A500014A00005000000008F820128244200200D
-:101A6000AF8201288F8201288C8200042C42001151
-:101A700050400013AC800000080016AD00000000CC
-:101A80008EE24E3024030040244200015043000304
-:101A9000000010218EE24E3024420001AEE24E30B2
-:101AA0008EE24E30000210C02442503802E2202163
-:101AB00024020012AC82000024020001AC82000467
-:101AC0005600000B241000018EE2724C3C04000111
-:101AD00024845298AFA00014AFA200108EE6724C7E
-:101AE0008F4702803C0500090C00240334A5F00850
-:101AF00056000001AEE00E1C8EE20174244200018B
-:101B0000AEE201748EE201748EE24E2410400019A0
-:101B100000000000AEE04E248F8200403042000101
-:101B200014400008000000008F430104240200015B
-:101B300010620004000000008F42026410400006A2
-:101B4000000000008EE2017C24420001AEE2017C34
-:101B5000080016DA8EE2017C8F82004434420004D1
-:101B6000AF8200448EE2017824420001AEE20178A7
-:101B70008EE201788EE272782442FF99AEE27278AA
-:101B80008EE272781C4002AD000000008F420238E5
-:101B9000104002AA000000003C0200010057102182
-:101BA000904283E0144002A5000000008F420080B4
-:101BB000AEE2004C8F4200C0AEE200488F4200848B
-:101BC000AEE200388F420084AEE202448F420088C9
-:101BD000AEE202488F42008CAEE2024C8F4200908F
-:101BE000AEE202508F420094AEE202548F4200985F
-:101BF000AEE202588F42009CAEE2025C8F4200A02F
-:101C0000AEE202608F4200A4AEE202648F4200A8FE
-:101C1000AEE202688F4200ACAEE2026C8F4200B0CE
-:101C2000AEE202708F4200B4AEE202748F4200B89E
-:101C3000AEE202788F4200BC24040001AEE2027CD6
-:101C4000AEE0003C00041080005710218EE3003C01
-:101C50008C42024424840001006218212C82000F6F
-:101C6000AEE3003C1440FFF8000410808F4200CC2B
-:101C7000AEE200508F4200D0AEE200548F830120CC
-:101C8000276238002466002000C2102B504000015B
-:101C9000276630008F82012810C200040000000077
-:101CA0008F82012414C20007000000008EE201A40C
-:101CB0000000802124420001AEE201A40800177553
-:101CC0008EE201A48F4402088F45020C26E2003008
-:101CD000AC62000824020400A462000E2402000F7B
-:101CE000AC620018AC60001CAC640000AC65000481
-:101CF0008EE204C4AC620010AF86012092E24E2056
-:101D000014400037241000018EE24E30000210C053
-:101D10002442503802E220218C8300002402000774
-:101D20001462001F000000008EE34E308EE24E343D
-:101D30001062001B240300408C8200042442000136
-:101D4000AC8200048EE24E348EE54E302442000117
-:101D500010430007000000008EE24E3424420001D0
-:101D600010A20005000000000800175F000000003E
-:101D700014A00005000000008F82012824420020EA
-:101D8000AF8201288F8201288C8200042C4200112E
-:101D900050400013AC8000000800177500000000E0
-:101DA0008EE24E30240300402442000150430003E1
-:101DB000000010218EE24E3024420001AEE24E308F
-:101DC0008EE24E30000210C02442503802E2202140
-:101DD00024020007AC82000024020001AC8200044F
-:101DE000120002123C020400AFA200183C020001E3
-:101DF00000571021904283B01040010B00000000FA
-:101E00008EE206088F43022824420001304A00FF78
-:101E1000514300FDAFA000108EE20608000210C082
-:101E2000005710218FA300188FA4001CAC43060C90
-:101E3000AC4406108F8300548F8200542469003212
-:101E4000012210232C4200331040006A0000582168
-:101E500024180008240F000D240D0007240C004056
-:101E6000240E00018F8701202762380024E800201B
-:101E70000102102B50400001276830008F8201289A
-:101E800011020004000000008F82012415020007E7
-:101E9000000010218EE201A40000802124420001F4
-:101EA000AEE201A4080017F38EE201A48EE4060856
-:101EB000000420C0008018218EE404308EE5043434
-:101EC00000A3282100A3302B00822021008620219E
-:101ED000ACE40000ACE500048EE20608A4F8000EB5
-:101EE000ACEF0018ACEA001C000210C02442060C43
-:101EF00002E21021ACE200088EE204C4ACE2001061
-:101F0000AF88012092E24E201440003324100001DB
-:101F10008EE24E30000210C02442503802E22021EE
-:101F20008C820000144D001F000000008EE34E3034
-:101F30008EE24E341062001B000000008C82000410
-:101F400024420001AC8200048EE24E348EE34E3017
-:101F500024420001104C0007000000008EE24E34C5
-:101F6000244200011062000500000000080017E094
-:101F70000000000014600005000000008F820128AE
-:101F800024420020AF8201288F8201288C82000425
-:101F90002C42001150400010AC800000080017F3E4
-:101FA000000000008EE24E3024420001504C00033D
-:101FB000000010218EE24E3024420001AEE24E308D
-:101FC0008EE24E30000210C02442503802E220213E
-:101FD000AC8D0000AC8E000456000006240B0001FE
-:101FE0008F820054012210232C4200331440FF9DA5
-:101FF00000000000316300FF24020001146200773A
-:102000003C050009AEEA06088F8300548F82005415
-:1020100024690032012210232C4200331040006159
-:1020200000005821240D0008240C0011240800127F
-:1020300024070040240A00018F8301202762380012
-:102040002466002000C2102B50400001276630009B
-:102050008F82012810C20004000000008F8201243A
-:1020600014C20007000000008EE201A400008021DD
-:1020700024420001AEE201A40800185F8EE201A430
-:102080008EE20608AC62001C8EE404A08EE504A477
-:102090002462001CAC620008A46D000EAC6C001839
-:1020A000AC640000AC6500048EE204C4AC620010B5
-:1020B000AF86012092E24E2014400033241000012C
-:1020C0008EE24E30000210C02442503802E220213D
-:1020D0008C8200001448001F000000008EE34E3088
-:1020E0008EE24E341062001B000000008C8200045F
-:1020F00024420001AC8200048EE24E348EE34E3066
-:102100002442000110470007000000008EE24E3418
-:102110002442000110620005000000000800184C75
-:102120000000000014600005000000008F820128FC
-:1021300024420020AF8201288F8201288C82000473
-:102140002C42001150400010AC8000000800185FC5
-:10215000000000008EE24E30244200015047000390
-:10216000000010218EE24E3024420001AEE24E30DB
-:102170008EE24E30000210C02442503802E220218C
-:10218000AC880000AC8A000456000006240B000155
-:102190008F820054012210232C4200331440FFA6EA
-:1021A00000000000316300FF2402000114620003FC
-:1021B0003C0500090800197C241000013C040001C2
-:1021C000248452A4AFA00010AFA000148F86012079
-:1021D0008F8701240800187B34A5F0113C0400010E
-:1021E000248452B0AFA00010AFA000148F8601204D
-:1021F0008F87012434A5F0100C00240300008021F7
-:102200000800197C000000003C040001248452BC3A
-:10221000AFA000148EE606088F4702283C0500098F
-:102220000800197534A5F00F8EE206088F430228C6
-:1022300024420001304900FF512300E2AFA000100A
-:102240008EE20608000210C0005710218FA300186C
-:102250008FA4001CAC43060CAC4406108F870120F1
-:102260002762380024E800200102102B50400001B2
-:10227000276830008F82012811020004000000004E
-:102280008F82012415020007000010218EE201A4B4
-:102290000000802124420001AEE201A4080018F7EA
-:1022A0008EE201A48EE40608000420C000801821FC
-:1022B0008EE404308EE5043400A3282100A3302BE3
-:1022C0000082202100862021ACE40000ACE500045F
-:1022D0008EE3060824020008A4E2000E2402000D8A
-:1022E000ACE20018ACE9001C000318C02463060C23
-:1022F00002E31021ACE200088EE204C4ACE200105C
-:10230000AF88012092E24E201440003724100001D3
-:102310008EE24E30000210C02442503802E22021EA
-:102320008C830000240200071462001F00000000DC
-:102330008EE34E308EE24E341062001B24030040C8
-:102340008C82000424420001AC8200048EE24E34F0
-:102350008EE54E30244200011043000700000000CB
-:102360008EE24E342442000110A20005000000005D
-:10237000080018E10000000014A0000500000000A3
-:102380008F82012824420020AF8201288F820128F9
-:102390008C8200042C42001150400013AC800000DD
-:1023A000080018F7000000008EE24E3024030040C1
-:1023B0002442000150430003000010218EE24E3001
-:1023C00024420001AEE24E308EE24E30000210C0D8
-:1023D0002442503802E2202124020007AC8200008F
-:1023E00024020001AC8200045600000CAEE906088D
-:1023F0003C040001248452C8AFA00010AFA0001418
-:102400008EE606088F4702283C0500090C002403CD
-:1024100034A5F0000800197C000000008F83012023
-:10242000276238002466002000C2102B50400001B3
-:10243000276630008F82012810C2000400000000CF
-:102440008F82012414C20007000000008EE201A464
-:102450000000802124420001AEE201A40800195EC0
-:102460008EE201A48EE20608AC62001C8EE404A099
-:102470008EE504A42462001CAC620008240200085B
-:10248000A462000E24020011AC620018AC640000CB
-:10249000AC6500048EE204C4AC620010AF8601207B
-:1024A00092E24E2014400037241000018EE24E309C
-:1024B000000210C02442503802E220218C83000028
-:1024C000240200121462001F000000008EE34E3050
-:1024D0008EE24E341062001B240300408C82000404
-:1024E00024420001AC8200048EE24E348EE54E3070
-:1024F0002442000110430007000000008EE24E3429
-:102500002442000110A20005000000000800194844
-:102510000000000014A00005000000008F820128C8
-:1025200024420020AF8201288F8201288C8200047F
-:102530002C42001150400013AC8000000800195ECE
-:10254000000000008EE24E302403004024420001CF
-:1025500050430003000010218EE24E30244200015F
-:10256000AEE24E308EE24E30000210C024425038AF
-:1025700002E2202124020012AC82000024020001A9
-:10258000AC8200045600001D241000013C04000130
-:10259000248452D0AFA00010AFA000148EE606082D
-:1025A0008F4702283C0500090C00240334A5F001E4
-:1025B0008EE201B024420001AEE201B00800197CB5
-:1025C0008EE201B03C040001248452DCAFA0001470
-:1025D0008EE606088F4702283C05000934A5F00561
-:1025E0000C002403000000008EE201AC00008021FA
-:1025F00024420001AEE201AC8EE201AC1200000CFC
-:10260000240200013C01000100370821A02083B012
-:102610008F4202388EE3015824630001AEE3015873
-:102620008EE301580800198CAEE272782402000192
-:102630003C01000100370821A02283B03C020001C8
-:102640008C425CD810400187000000008EE27B8441
-:1026500024430001284200C9144001A4AEE37B8456
-:102660008EE204D43042000214400119AEE07B84B3
-:102670008EE204D43C0306003463100034420002AE
-:10268000AEE204D4AFA300188EE206088F430228FE
-:1026900024420001304A00FF514300FDAFA000106A
-:1026A0008EE20608000210C0005710218FA3001808
-:1026B0008FA4001CAC43060CAC4406108F8300545E
-:1026C0008F82005424690032012210232C420033EF
-:1026D0001040006A0000582124180008240F000D43
-:1026E000240D0007240C0040240E00018F870120D8
-:1026F0002762380024E800200102102B504000011E
-:10270000276830008F8201281102000400000000B9
-:102710008F82012415020007000010218EE201A41F
-:102720000000802124420001AEE201A408001A1535
-:102730008EE201A48EE40608000420C00080182167
-:102740008EE404308EE5043400A3282100A3302B4E
-:102750000082202100862021ACE40000ACE50004CA
-:102760008EE20608A4F8000EACEF0018ACEA001CDC
-:10277000000210C02442060C02E21021ACE2000864
-:102780008EE204C4ACE20010AF88012092E24E2039
-:1027900014400033241000018EE24E30000210C0BD
-:1027A0002442503802E220218C820000144D001F88
-:1027B000000000008EE34E308EE24E341062001BAB
-:1027C000000000008C82000424420001AC8200045E
-:1027D0008EE24E348EE34E3024420001104C00074E
-:1027E000000000008EE24E34244200011062000519
-:1027F0000000000008001A0200000000146000053C
-:10280000000000008F82012824420020AF820128AE
-:102810008F8201288C8200042C420011504000104D
-:10282000AC80000008001A15000000008EE24E3057
-:1028300024420001504C0003000010218EE24E3073
-:1028400024420001AEE24E308EE24E30000210C053
-:102850002442503802E22021AC8D0000AC8E0004EE
-:1028600056000006240B00018F8200540122102321
-:102870002C4200331440FF9D00000000316300FF34
-:102880002402000154620078AFA00010AEEA0608EE
-:102890008F8300548F820054246900320122102358
-:1028A0002C4200331040006100005821240D000824
-:1028B000240C00112408001224070040240A0001FF
-:1028C0008F830120276238002466002000C2102B6D
-:1028D00050400001276630008F82012810C200049A
-:1028E000000000008F82012414C2000700000000D5
-:1028F0008EE201A40000802124420001AEE201A486
-:1029000008001A818EE201A48EE20608AC62001C67
-:102910008EE404A08EE504A42462001CAC620008CE
-:10292000A46D000EAC6C0018AC640000AC65000433
-:102930008EE204C4AC620010AF86012092E24E2009
-:1029400014400033241000018EE24E30000210C00B
-:102950002442503802E220218C8200001448001FDB
-:10296000000000008EE34E308EE24E341062001BF9
-:10297000000000008C82000424420001AC820004AC
-:102980008EE24E348EE34E302442000110470007A1
-:10299000000000008EE24E34244200011062000567
-:1029A0000000000008001A6E00000000146000051E
-:1029B000000000008F82012824420020AF820128FD
-:1029C0008F8201288C8200042C420011504000109C
-:1029D000AC80000008001A81000000008EE24E303A
-:1029E0002442000150470003000010218EE24E30C7
-:1029F00024420001AEE24E308EE24E30000210C0A2
-:102A00002442503802E22021AC880000AC8A000445
-:102A100056000006240B00018F820054012210236F
-:102A20002C4200331440FFA600000000316300FF79
-:102A30002402000110620022000000003C0400019A
-:102A4000248452A4AFA00010AFA000148F860120F0
-:102A50008F8701243C0500090C00240334A5F011E4
-:102A600008001AAD000000003C040001248452B0AC
-:102A7000AFA000148F8601208F8701243C05000938
-:102A80000C00240334A5F01008001AAD000000006B
-:102A90003C040001248452BCAFA000148EE606085A
-:102AA0008F4702283C0500090C00240334A5F00FD1
-:102AB0008EE201AC24420001AEE201AC8EE201AC38
-:102AC0008EE2015C24420001AEE2015C8EE2015C18
-:102AD0008EE204D430420001104000550000000096
-:102AE0008F42021830420080104000290000000090
-:102AF0008F82004434420040AF8200448EE27B7CEF
-:102B0000004028218EE200C08EE300C424060000AD
-:102B10002407FFFF00002021004610241444000D6C
-:102B2000006718241465000B000000008EE27B8013
-:102B3000004028218EE200E08EE300E40000202126
-:102B40000046102414440003006718241065000B8D
-:102B5000000000008EE200C08EE300C48EE400E0BE
-:102B60008EE500E4AEE37B7CAEE57B808F820044A3
-:102B70003842002008001B38AF8200448F82004496
-:102B80002403FFDF0043102408001B38AF820044F9
-:102B90008F8200442403FFDF00431024AF820044EF
-:102BA0008EE27B7C004028218EE200C08EE300C4D0
-:102BB000240600002407FFFF000020210046102407
-:102BC0001444000D006718241465000B0000000079
-:102BD0008EE27B80004028218EE200E08EE300E45C
-:102BE000000020210046102414440003006718242C
-:102BF0001065000B000000008EE200C08EE300C4F0
-:102C00008EE400E08EE500E4AEE37B7CAEE57B8005
-:102C10008F8200443842004008001B38AF820044D5
-:102C20008F8200443442004008001B38AF820044C9
-:102C30008F82004434420040AF8200448EE27B8C9D
-:102C4000244300012842001514400028AEE37B8C89
-:102C50008F82004438420020AF82004408001B38B5
-:102C6000AEE07B8C8EE204D43042000110400011B3
-:102C7000000000008F42021830420080104000091E
-:102C8000000000008F82004434420020AF820044E4
-:102C90008F8200442403FFBF0043102408001B362A
-:102CA000AF8200448F8200443442006008001B362B
-:102CB000AF8200448F82004434420040AF8200441F
-:102CC0008EE27B88244300012842138914400005CA
-:102CD000AEE37B888F82004438420020AF820044FC
-:102CE000AEE07B880C004603000000008FBF00248C
-:102CF0008FB0002003E0000827BD002827BDFFB8E3
-:102D0000AFBF0044AFB60040AFB5003CAFB4003831
-:102D1000AFB30034AFB20030AFB1002CAFB0002879
-:102D20008F96006432C200041040000C240200049C
-:102D3000AF8200648F420114AEE204E08F82006033
-:102D400034420008AF8200608EE2016C2442000130
-:102D5000AEE2016C080022F48EE2016C32C2000186
-:102D60001040000424020001AF820064080022F435
-:102D70000000000032C200021440000C3C050003B9
-:102D80003C0400012484535434A5000102C03021C6
-:102D900000003821AFA000100C002403AFA00014E5
-:102DA0002402FFF8080022F4AF8200648F43022C53
-:102DB0008F42010C5062000CAFA000108F42022C19
-:102DC00000021080005A10218C420300AFA20020A4
-:102DD0008F42022C24070001244200013042003FB0
-:102DE00008001B80AF42022C3C0400012484536085
-:102DF000AFA000148F46022C8F47010C3C05000346
-:102E00000C00240334A5F01F0000382114E0000357
-:102E100000000000080022EDAF96006493A200209D
-:102E20002443FFFF2C62001110400658000310805D
-:102E30003C010001002208218C22541800400008A7
-:102E4000000000008FA2002030420FFFAEE20E0C07
-:102E50008F82006034420200AF8200608EE201186F
-:102E600024420001AEE20118080022E88EE20118B7
-:102E70008FA20020240300013C010001003708213B
-:102E8000A02383B130420FFFAEE252388F82006040
-:102E900034420100AF8200608EE20144244200010E
-:102EA000AEE20144080022E88EE201448FA2002035
-:102EB0000002120000022502240200011082000517
-:102EC00024020002108200092402FFFE08001BC930
-:102ED000AFA000108EE204D4AEE40070AEE4007443
-:102EE0003442000108001BBDAEE204D48EE304D4DA
-:102EF000AEE40070AEE4007400621824AEE304D4C3
-:102F00008F8400540004144200041C8200431021EA
-:102F100000041CC20043102300041D0200431021C2
-:102F200000041D420043102308001BD0AEE20078CD
-:102F30003C0400012484536CAFA000148FA6002031
-:102F40003C0500030C00240334A500048EE20110AC
-:102F500024420001AEE20110080022E88EE20110D6
-:102F6000274402120C0022FE240500063049001FEF
-:102F7000000920C002E410219442727C30424000DB
-:102F80001040000A0097102197430212A443727E5A
-:102F90008F43021400971021AC43728002E4182181
-:102FA0003402800008001C79A462727C9443727E13
-:102FB000974202121462000602E4102100971021C9
-:102FC0008C4372808F4202141062009F02E4102131
-:102FD0009442727C304280001040002A2406FFFF99
-:102FE00000002021000410C002E210219442737CF2
-:102FF000304240005440000500803021248400010C
-:103000002C8200801440FFF8000410C004C100109E
-:10301000000618C0000610C0005718218C63737C8E
-:1030200000571021AFA300108C4273803C040001B4
-:1030300024845378AFA200148F4702143C05000388
-:103040000C00240334A5001308001C903C02080067
-:103050009744021200771021A444737E8F44021417
-:103060000077102102E31821AC4473803402800001
-:10307000A462737C000910C002E2102108001C79D0
-:10308000A446727C02E410219445727C08001C2E38
-:10309000000510C09443737E97420212146200062A
-:1030A000000510C0009710218C4373808F420214DA
-:1030B00010620065000510C002E210219445737C87
-:1030C000000510C002E210219442737C304280005F
-:1030D0001040FFF000971021000520C0009710213C
-:1030E0009443737E97420212146200062406FFFF87
-:1030F000009710218C4373808F420214106200539A
-:103100003C02080000002021000410C002E210214F
-:103110009442737C304240005440000500803021CE
-:10312000248400012C8200801440FFF8000410C0A9
-:1031300004C10023000618C0000910C00057182160
-:103140008C63727C00571021AFA300108C427280F8
-:103150003C04000124845384AFA200148F4702145E
-:103160003C0500030C00240334A5F01708001C9054
-:103170003C0208008F43021000B71021AC43777C5B
-:103180008F43021400B71021AC4377803C0200014A
-:10319000005710218C4283B4244200013C010001FD
-:1031A00000370821AC2283B43C03000100771821CA
-:1031B0008C6383B402E5102108001C82A443777C51
-:1031C0009744021200771021A444737E8F440214A6
-:1031D0000077102102E31821AC4473803402800090
-:1031E000A462737C000510C002E21021A446737C27
-:1031F00000002021000428C002E510219442777CC1
-:103200001040FFDC248400012C8200805440FFFA2F
-:10321000000428C092E204D81040000624020001F5
-:103220008EE304DC012210040062182508001C8FC4
-:10323000AEE304DC8F830228240200010122100483
-:1032400000621825AF8302283C02080034421000B7
-:10325000AFA200188EE206088F4302282442000124
-:10326000304A00FF514300FDAFA000108EE2060877
-:10327000000210C0005710218FA300188FA4001C5B
-:10328000AC43060CAC4406108F8300548F8200546C
-:1032900024690032012210232C4200331040006ABE
-:1032A0000000582124100008240F000D240D0007F1
-:1032B000240C0040240E00018F8701202762380073
-:1032C00024E800200102102B504000012768300044
-:1032D0008F82012811020004000000008F82012467
-:1032E00015020007000010218EE201A40000382121
-:1032F00024420001AEE201A408001D088EE201A4F0
-:103300008EE40608000420C0008018218EE40430FA
-:103310008EE5043400A3282100A3302B0082202155
-:1033200000862021ACE40000ACE500048EE2060833
-:10333000A4F0000EACEF0018ACEA001C000210C0B4
-:103340002442060C02E21021ACE200088EE204C422
-:10335000ACE20010AF88012092E24E20144000330E
-:10336000240700018EE24E30000210C02442503883
-:1033700002E220218C820000144D001F000000009A
-:103380008EE34E308EE24E341062001B00000000CF
-:103390008C82000424420001AC8200048EE24E3490
-:1033A0008EE34E3024420001104C00070000000064
-:1033B0008EE24E342442000110620005000000003D
-:1033C00008001CF50000000014600005000000006B
-:1033D0008F82012824420020AF8201288F82012899
-:1033E0008C8200042C42001150400010AC80000080
-:1033F00008001D08000000008EE24E30244200014B
-:10340000504C0003000010218EE24E302442000197
-:10341000AEE24E308EE24E30000210C024425038F0
-:1034200002E22021AC8D0000AC8E000454E00006C6
-:10343000240B00018F820054012210232C42003300
-:103440001440FF9D00000000316300FF24020001D2
-:1034500054620078AFA00010AEEA06088F830054D3
-:103460008F82005424690032012210232C42003341
-:103470001040006100005821240E0008240D0011A6
-:10348000240A001224080040240C00018F8301202C
-:10349000276238002466002000C2102B5040000133
-:1034A000276630008F82012810C20004000000004F
-:1034B0008F82012414C20007000000008EE201A4E4
-:1034C0000000382124420001AEE201A408001D746E
-:1034D0008EE201A48EE20608AC62001C8EE404A019
-:1034E0008EE504A42462001CAC620008A46E000EE9
-:1034F000AC6D0018AC640000AC6500048EE204C43E
-:10350000AC620010AF86012092E24E2014400033DE
-:10351000240700018EE24E30000210C024425038D1
-:1035200002E220218C820000144A001F00000000EB
-:103530008EE34E308EE24E341062001B000000001D
-:103540008C82000424420001AC8200048EE24E34DE
-:103550008EE34E30244200011048000700000000B6
-:103560008EE24E342442000110620005000000008B
-:1035700008001D610000000014600005000000004C
-:103580008F82012824420020AF8201288F820128E7
-:103590008C8200042C42001150400010AC800000CE
-:1035A00008001D74000000008EE24E30244200012D
-:1035B00050480003000010218EE24E3024420001EA
-:1035C000AEE24E308EE24E30000210C0244250383F
-:1035D00002E22021AC8A0000AC8C000454E000061A
-:1035E000240B00018F820054012210232C4200334F
-:1035F0001440FFA600000000316300FF2402000118
-:1036000010620022000000003C040001248453905A
-:10361000AFA00010AFA000148F8601208F87012477
-:103620003C0500090C00240334A5F01108001DA07E
-:10363000000000003C0400012484539CAFA000144F
-:103640008F8601208F8701243C0500090C0024038C
-:1036500034A5F01008001DA0000000003C0400018B
-:10366000248453A8AFA000148EE606088F470228D2
-:103670003C0500090C00240334A5F00F8EE201ACD8
-:1036800024420001AEE201AC8EE201AC8EE20124E4
-:1036900024420001AEE2012408001F978EE20124BB
-:1036A000274402120C0022FE240500063049001FA8
-:1036B000000928C002E510219442727C304280004B
-:1036C0001040002F02E510219442727C30424000ED
-:1036D0001440001C00B710219443727E97420212DE
-:1036E0001462001800B710218C4372808F420214BC
-:1036F00054620016AFA2001092E204D810400007F6
-:10370000240200018EE304DC0122100400021027D1
-:103710000062182408001DC9AEE304DC8F83022870
-:10372000012210040002102700621824AF8302282F
-:10373000000910C002E218213402C00008001E4E29
-:10374000A462727C8F420214AFA20010000910C064
-:10375000005710218C42727C3C040001248453B435
-:103760003C050003AFA200148F47021034A5F01CE3
-:103770000C0024030120302108001E833C020800B5
-:1037800000B710219443727E97420212146200190E
-:10379000000918C000B710218C4372808F420214B8
-:1037A00014620014000918C002E510219447727CCD
-:1037B000000720C0009710219443737E00B71021AA
-:1037C000A443727E009710218C43738000B71021B0
-:1037D000AC43728002E410219443737C02E5102113
-:1037E000A443727C02E418213402C00008001E4E7B
-:1037F000A462737C02E310219447727C00003021A4
-:10380000000720C002E410219442737C0000402194
-:10381000304280001440002500E028210060502143
-:10382000340BC000009710219443737E974202121C
-:103830005462001500E02821009710218C4373800A
-:103840008F4202145462001000E02821110000068B
-:1038500002E410219443737C000510C002E21021A1
-:1038600008001E1AA443737C9443737C02EA10215F
-:10387000A443727C000710C002E21021A44B737CA9
-:1038800008001E2824060001000510C002E21021D5
-:103890009447737C000720C002E410219442737C9B
-:1038A000304280001040FFDF2508000130C200FFD9
-:1038B0001440002500002021000720C0009710219F
-:1038C0009443737E974202121462000F000910C0E5
-:1038D000009710218C4373808F4202141462000AF7
-:1038E000000910C002E418213402C00015000015C0
-:1038F000A462737C000910C002E218213402800027
-:1039000008001E4EA462727C005710218C42727C0B
-:103910003C040001248453C03C050003AFA2001006
-:10392000000710C0005710218C42737C34A5001E84
-:10393000012030210C002403AFA2001408001E83D4
-:103940003C02080000002021000428C000B710211C
-:103950009443777E974202125462002B2484000124
-:1039600000B710218C4377808F42021454620026E6
-:10397000248400013C020001005710218C4283B4D2
-:103980002442FFFF3C01000100370821AC2283B430
-:103990003C020001005710218C4283B4008090212A
-:1039A0000242102B1040000E24B1777C24B07784A3
-:1039B00002F0202102F128210C00249024060008A6
-:1039C000263100083C020001005710218C4283B4CC
-:1039D000265200010242102B1440FFF52610000869
-:1039E0003C040001009720218C8483B42405000846
-:1039F000000420C02484777C0C00248802E4202169
-:103A000008001E833C0208002C8200801440FFCF77
-:103A1000000428C03C02080034422000AFA2001875
-:103A20008EE206088F43022824420001304A00FF3C
-:103A3000514300FDAFA000108EE20608000210C046
-:103A4000005710218FA300188FA4001CAC43060C54
-:103A5000AC4406108F8300548F82005424690032D6
-:103A6000012210232C4200331040006A000058212C
-:103A700024100008240F000D240D0007240C004022
-:103A8000240E00018F8701202762380024E80020DF
-:103A90000102102B50400001276830008F8201285E
-:103AA00011020004000000008F82012415020007AB
-:103AB000000010218EE201A4000038212442000100
-:103AC000AEE201A408001EFB8EE201A48EE406080B
-:103AD000000420C0008018218EE404308EE50434F8
-:103AE00000A3282100A3302B008220210086202162
-:103AF000ACE40000ACE500048EE20608A4F0000E81
-:103B0000ACEF0018ACEA001C000210C02442060C06
-:103B100002E21021ACE200088EE204C4ACE2001024
-:103B2000AF88012092E24E201440003324070001A8
-:103B30008EE24E30000210C02442503802E22021B2
-:103B40008C820000144D001F000000008EE34E30F8
-:103B50008EE24E341062001B000000008C820004D4
-:103B600024420001AC8200048EE24E348EE34E30DB
-:103B700024420001104C0007000000008EE24E3489
-:103B800024420001106200050000000008001EE849
-:103B90000000000014600005000000008F82012872
-:103BA00024420020AF8201288F8201288C820004E9
-:103BB0002C42001150400010AC80000008001EFB99
-:103BC000000000008EE24E3024420001504C000301
-:103BD000000010218EE24E3024420001AEE24E3051
-:103BE0008EE24E30000210C02442503802E2202102
-:103BF000AC8D0000AC8E000454E00006240B0001E4
-:103C00008F820054012210232C4200331440FF9D68
-:103C100000000000316300FF2402000154620078BC
-:103C2000AFA00010AEEA06088F8300548F820054C4
-:103C300024690032012210232C420033104000611D
-:103C400000005821240E0008240D0011240A00123F
-:103C500024080040240C00018F83012027623800D3
-:103C60002466002000C2102B50400001276630005F
-:103C70008F82012810C20004000000008F820124FE
-:103C800014C20007000000008EE201A400003821E9
-:103C900024420001AEE201A408001F678EE201A4E5
-:103CA0008EE20608AC62001C8EE404A08EE504A43B
-:103CB0002462001CAC620008A46E000EAC6D0018FB
-:103CC000AC640000AC6500048EE204C4AC62001079
-:103CD000AF86012092E24E201440003324070001F9
-:103CE0008EE24E30000210C02442503802E2202101
-:103CF0008C820000144A001F000000008EE34E304A
-:103D00008EE24E341062001B000000008C82000422
-:103D100024420001AC8200048EE24E348EE34E3029
-:103D20002442000110480007000000008EE24E34DB
-:103D300024420001106200050000000008001F542A
-:103D40000000000014600005000000008F820128C0
-:103D500024420020AF8201288F8201288C82000437
-:103D60002C42001150400010AC80000008001F677A
-:103D7000000000008EE24E30244200015048000353
-:103D8000000010218EE24E3024420001AEE24E309F
-:103D90008EE24E30000210C02442503802E2202150
-:103DA000AC8A0000AC8C000454E00006240B000137
-:103DB0008F820054012210232C4200331440FFA6AE
-:103DC00000000000316300FF2402000110620022A5
-:103DD000000000003C04000124845390AFA00010B8
-:103DE000AFA000148F8601208F8701243C050009B5
-:103DF0000C00240334A5F01108001F9300000000FC
-:103E00003C0400012484539CAFA000148F86012041
-:103E10008F8701243C0500090C00240334A5F01011
-:103E200008001F93000000003C040001248453A8F4
-:103E3000AFA000148EE606088F4702283C05000953
-:103E40000C00240334A5F00F8EE201AC24420001E3
-:103E5000AEE201AC8EE201AC8EE201282442000108
-:103E6000AEE201288EE201288EE2016424420001C4
-:103E7000AEE20164080022E88EE201648FA2002015
-:103E80000002120000021D0224020001106200055F
-:103E9000240200021062000D0000000008001FB79D
-:103EA000AFA0001092E204D81440000624020001E2
-:103EB0008F820228AEE204DC2402FFFFAF820228D8
-:103EC0002402000108001FBEA2E204D892E204D836
-:103ED0005040000CA2E004D88EE204DCAF8202283D
-:103EE00008001FBEA2E004D83C040001248453C88B
-:103EF000AFA000148FA600203C0500030C00240393
-:103F000034A5F0098EE2013C24420001AEE2013CFE
-:103F1000080022E88EE2013C8FA20020000212007D
-:103F20000002250224020001108200052402000282
-:103F30001082000F0000000008001FE3AFA0001077
-:103F40008F8202203C0308FF3463FFFF00431024EC
-:103F500034420008AF820220240200013C0100012B
-:103F600000370821A02283B208001FEAAEE401084E
-:103F70008F8202203C0308FF3463FFF700431024C4
-:103F8000AF8202203C01000100370821A02083B24B
-:103F900008001FEAAEE401083C040001248453D465
-:103FA000AFA000148FA600203C0500030C002403E2
-:103FB00034A5F00A8EE2012C24420001AEE2012C6D
-:103FC000080022E88EE2012C8FA2002000021200DD
-:103FD00000021D02240200011062000524020002FA
-:103FE0001062000E0000000008002011AFA00010B9
-:103FF0008F8202203C0308FF3463FFFF004310243C
-:1040000034420008AF820220240200013C0100017A
-:104010000037082108002018A02283B33C020001C9
-:1040200000571021904283B23C0100010037082163
-:104030001440000EA02083B38F8202203C0308FFAF
-:104040003463FFF70043102408002018AF820220D9
-:104050003C040001248453E0AFA000148FA600208C
-:104060003C0500030C00240334A5F00B8EE2011480
-:1040700024420001AEE20114080022E88EE201149D
-:1040800027840208274502000C00249A2406000811
-:1040900026E40094274502000C00249A2406000818
-:1040A0008EE2013424420001AEE20134080022E82D
-:1040B0008EE201348F460248000020210C00510896
-:1040C000240500048EE2013024420001AEE20130FA
-:1040D000080022E88EE201308EF301CC8EF401D08C
-:1040E0008EF501D88EE2014026E400302442000122
-:1040F000AEE201408EF001408EF100748EF200704D
-:104100000C00248824050400AEF301CCAEF401D0E9
-:10411000AEF501D8AEF00140AEF10074AEF2007021
-:104120008F42025C26E40094AEE200608F4202609F
-:104130002745020024060008AEE2006824020006BB
-:104140000C00249AAEE200643C023B9A3442CA005E
-:10415000AEE2006C240203E8240400022403000100
-:10416000AEE20104AEE40100AEE3010C8F82022056
-:10417000304200081040000400000000AEE30108D7
-:104180000800206100002021AEE401080000202189
-:104190003C0300010064182190635C3002E41021AC
-:1041A00024840001A043009C2C82000F1440FFF8DF
-:1041B000000000008F82004002E4182124840001E6
-:1041C0000002170224420030A062009C02E4102189
-:1041D000080022E8A040009C240200013C010001EC
-:1041E00000370821A02283E0240B040024080014D7
-:1041F000240A0040240900018F8301002762300057
-:104200002466002000C2102B5040000127662800C1
-:104210008F82010810C20004000000008F82010498
-:1042200014C2000726E200308EE201A80000382107
-:1042300024420001AEE201A8080020A88EE201A8F5
-:104240008EE404B88EE504BCAC620008A46B000EDA
-:10425000AC680018AC60001CAC640000AC650004E5
-:104260008EE204CCAC620010AF86010092E204EC56
-:104270001440000E240700018EE24E282442000163
-:10428000504A0003000010218EE24E282442000113
-:10429000AEE24E288EE24E28000210C024424E3874
-:1042A00002E21021AC480000AC49000410E0FFD24B
-:1042B00000000000080022E8000000003C020900A5
-:1042C000AEE05238AEE0523CAEE05240AEE0524476
-:1042D000AEE001D03C01000100370821A02083B1ED
-:1042E000AFA200188EE206088F4302282442000184
-:1042F000304A00FF514300FDAFA000108EE20608D7
-:10430000000210C0005710218FA300188FA4001CBA
-:10431000AC43060CAC4406108F8300548F820054CB
-:1043200024690032012210232C4200331040006A1D
-:104330000000582124100008240F000D240D000750
-:10434000240C0040240E00018F87012027623800D2
-:1043500024E800200102102B5040000127683000A3
-:104360008F82012811020004000000008F820124C6
-:1043700015020007000010218EE201A40000382180
-:1043800024420001AEE201A40800212C8EE201A427
-:104390008EE40608000420C0008018218EE404305A
-:1043A0008EE5043400A3282100A3302B00822021B5
-:1043B00000862021ACE40000ACE500048EE2060893
-:1043C000A4F0000EACEF0018ACEA001C000210C014
-:1043D0002442060C02E21021ACE200088EE204C482
-:1043E000ACE20010AF88012092E24E20144000336E
-:1043F000240700018EE24E30000210C024425038E3
-:1044000002E220218C820000144D001F00000000F9
-:104410008EE34E308EE24E341062001B000000002E
-:104420008C82000424420001AC8200048EE24E34EF
-:104430008EE34E3024420001104C000700000000C3
-:104440008EE24E342442000110620005000000009C
-:1044500008002119000000001460000500000000A1
-:104460008F82012824420020AF8201288F820128F8
-:104470008C8200042C42001150400010AC800000DF
-:104480000800212C000000008EE24E302442000182
-:10449000504C0003000010218EE24E3024420001F7
-:1044A000AEE24E308EE24E30000210C02442503850
-:1044B00002E22021AC8D0000AC8E000454E0000626
-:1044C000240B00018F820054012210232C42003360
-:1044D0001440FF9D00000000316300FF2402000132
-:1044E00054620078AFA00010AEEA06088F83005433
-:1044F0008F82005424690032012210232C420033A1
-:104500001040006100005821240E0008240D001105
-:10451000240A001224080040240C00018F8301208B
-:10452000276238002466002000C2102B5040000192
-:10453000276630008F82012810C2000400000000AE
-:104540008F82012414C20007000000008EE201A443
-:104550000000382124420001AEE201A408002198A5
-:104560008EE201A48EE20608AC62001C8EE404A078
-:104570008EE504A42462001CAC620008A46E000E48
-:10458000AC6D0018AC640000AC6500048EE204C49D
-:10459000AC620010AF86012092E24E20144000333E
-:1045A000240700018EE24E30000210C02442503831
-:1045B00002E220218C820000144A001F000000004B
-:1045C0008EE34E308EE24E341062001B000000007D
-:1045D0008C82000424420001AC8200048EE24E343E
-:1045E0008EE34E3024420001104800070000000016
-:1045F0008EE24E34244200011062000500000000EB
-:104600000800218500000000146000050000000083
-:104610008F82012824420020AF8201288F82012846
-:104620008C8200042C42001150400010AC8000002D
-:1046300008002198000000008EE24E302442000164
-:1046400050480003000010218EE24E302442000149
-:10465000AEE24E308EE24E30000210C0244250389E
-:1046600002E22021AC8A0000AC8C000454E0000679
-:10467000240B00018F820054012210232C420033AE
-:104680001440FFA600000000316300FF2402000177
-:1046900010620022000000003C04000124845390BA
-:1046A000AFA00010AFA000148F8601208F870124D7
-:1046B0003C0500090C00240334A5F011080021C4B6
-:1046C000000000003C0400012484539CAFA00014AF
-:1046D0008F8601208F8701243C0500090C002403EC
-:1046E00034A5F010080021C4000000003C040001C3
-:1046F000248453A8AFA000148EE606088F47022832
-:104700003C0500090C00240334A5F00F8EE201AC37
-:1047100024420001AEE201AC8EE201AC8EE2012047
-:1047200024420001AEE201208EE201208EE2016807
-:1047300024420001AEE20168080022E88EE201682E
-:104740008F42025C26E40094AEE200608F42026079
-:1047500027450200240600080C00249AAEE20068F7
-:104760008F8202203042000814400002240200011F
-:1047700024020002AEE201088EE2011C2442000184
-:10478000AEE2011C080022E88EE2011C3C0400019C
-:10479000248453ECAFA00010AFA000148FA600201B
-:1047A0003C0500030C00240334A5F00F93A2002065
-:1047B0003C0307003463100000431025AFA200182B
-:1047C0008EE206088F43022824420001304900FF90
-:1047D000512300E2AFA000108EE20608000210C0D4
-:1047E000005710218FA300188FA4001CAC43060CA7
-:1047F000AC4406108F8701202762380024E800208F
-:104800000102102B50400001276830008F820128E0
-:1048100011020004000000008F820124150200072D
-:10482000000010218EE201A4000038212442000182
-:10483000AEE201A40800225D8EE201A48EE4060827
-:10484000000420C0008018218EE404308EE504347A
-:1048500000A3282100A3302B0082202100862021E4
-:10486000ACE40000ACE500048EE306082402000876
-:10487000A4E2000E2402000DACE20018ACE9001C1A
-:10488000000318C02463060C02E31021ACE2000808
-:104890008EE204C4ACE20010AF88012092E24E2008
-:1048A00014400037240700018EE24E30000210C091
-:1048B0002442503802E220218C83000024020007A9
-:1048C0001462001F000000008EE34E308EE24E3472
-:1048D0001062001B240300408C820004244200016B
-:1048E000AC8200048EE24E348EE54E30244200014C
-:1048F00010430007000000008EE24E342442000105
-:1049000010A200050000000008002247000000007F
-:1049100014A00005000000008F820128244200201E
-:10492000AF8201288F8201288C8200042C42001162
-:1049300050400013AC8000000800225D0000000021
-:104940008EE24E3024030040244200015043000315
-:10495000000010218EE24E3024420001AEE24E30C3
-:104960008EE24E30000210C02442503802E2202174
-:1049700024020007AC82000024020001AC82000483
-:1049800054E0000CAEE906083C040001248453F412
-:10499000AFA00010AFA000148EE606088F470228D3
-:1049A0003C0500090C00240334A5F000080022E0B7
-:1049B000000000008F830120276238002466002059
-:1049C00000C2102B50400001276630008F82012862
-:1049D00010C20004000000008F82012414C20007EE
-:1049E000000000008EE201A40000382124420001F2
-:1049F000AEE201A4080022C48EE201A48EE2060801
-:104A0000AC62001C8EE404A08EE504A42462001CA9
-:104A1000AC62000824020008A462000E2402001107
-:104A2000AC620018AC640000AC6500048EE204C403
-:104A3000AC620010AF86012092E24E201440003795
-:104A4000240700018EE24E30000210C0244250388C
-:104A500002E220218C830000240200121462001F55
-:104A6000000000008EE34E308EE24E341062001BD8
-:104A7000240300408C82000424420001AC82000424
-:104A80008EE24E348EE54E30244200011043000782
-:104A9000000000008EE24E342442000110A2000506
-:104AA00000000000080022AE0000000014A0000575
-:104AB000000000008F82012824420020AF820128DC
-:104AC0008F8201288C8200042C4200115040001378
-:104AD000AC800000080022C4000000008EE24E30CE
-:104AE0002403004024420001504300030000102131
-:104AF0008EE24E3024420001AEE24E308EE24E3065
-:104B0000000210C02442503802E220212402001288
-:104B1000AC82000024020001AC82000414E0001BFF
-:104B2000000000003C040001248453FCAFA00010EE
-:104B3000AFA000148EE606088F4702283C05000946
-:104B40000C00240334A5F0018EE201B024420001E0
-:104B5000AEE201B0080022E08EE201B03C040001A8
-:104B600024845408AFA000148EE606088F4702285C
-:104B70003C0500090C00240334A5F0058EE201ACCD
-:104B800024420001AEE201AC8EE201AC8EE20150A3
-:104B900024420001AEE201508EE201508EE201603B
-:104BA00024420001AEE201608EE201608F43022CDC
-:104BB0008F42010C1462000924020002AF820064DB
-:104BC0008F82006414400005000000008F43022C17
-:104BD0008F42010C1462F875000000008FBF004482
-:104BE0008FB600408FB5003C8FB400388FB30034CF
-:104BF0008FB200308FB1002C8FB0002803E0000886
-:104C000027BD004827BDFFF82408FFFF10A00014AF
-:104C1000000048213C0AEDB8354A83209087000007
-:104C200024840001000030210107102630420001D9
-:104C30001040000200081842006A18260060402157
-:104C400024C600012CC200081440FFF700073842B8
-:104C5000252900010125102B1440FFF00000000061
-:104C60000100102103E0000827BD000827BDFFE870
-:104C700027642800AFBF00100C0024882405100012
-:104C800024020021AF800100AF800104AF80010841
-:104C9000AF800110AF800114AF800118AF800120F8
-:104CA000AF800124AF800128AF800130AF80013494
-:104CB000AF800138AEE04E28AEE04E2CAEE04E3074
-:104CC000AEE04E34AF82011C8F42021830420040E9
-:104CD00010400004000000008F82011C34420004D8
-:104CE000AF82011C8FBF001003E0000827BD001831
-:104CF00027BDFFE0AFBF00188F820104AFA20010F4
-:104D00008F8201003C050002AFA200148F8600B024
-:104D10008F87011C3C040001248454C00C00240330
-:104D200034A5F0008F8300B03C027F00006218249D
-:104D30003C020400106200290043102B14400008BC
-:104D40003C0220003C020100106200243C020200F0
-:104D50001062001100000000080023740000000031
-:104D6000106200083C0240001462001C00000000B9
-:104D70008EE2019024420001AEE20190080023740B
-:104D80008EE201908EE2018C24420001AEE2018CA1
-:104D9000080023748EE2018C8F82011C34420002D1
-:104DA000AF82011C8F8301048F8200B03442000166
-:104DB000AF8200B0AF8301048F82011C2403FFFD8A
-:104DC00000431024AF82011C8EE201A024420001A6
-:104DD000AEE201A0080023778EE201A08F8200B02E
-:104DE00034420001AF8200B08FBF001803E000081A
-:104DF00027BD002027BDFFE0AFBF001CAFB00018EB
-:104E00008F820120AFA200108F8201243C05000197
-:104E1000AFA200148F8600A08F87011C3C04000104
-:104E2000248454CC0C00240334A5F0008F8300A00C
-:104E30003C027F00006218243C0204001062005310
-:104E4000000080210043102B144000083C04200087
-:104E50003C0201001062004D3C0202001062003A68
-:104E600000000000080023E00000000010640003C0
-:104E70003C02400014620045000000008F8200A048
-:104E80000044102410400006000000008EE201944F
-:104E900024420001AEE20194080023A98EE20194AD
-:104EA0008EE2019824420001AEE201988EE2019860
-:104EB0008F82011C34420002AF82011C8F82011CD0
-:104EC000304202001040001B000000008F8300A051
-:104ED0008F8401248F8200AC14400007240200015B
-:104EE0003C0200013442F0000062102450400001F6
-:104EF00024100001240200011200000DAF8200A066
-:104F00008F8201242442FFE0AF8201248F8201249A
-:104F10008F820124276330000043102B10400005CE
-:104F2000276237E0AF820124080023CA0000000096
-:104F3000AF8401248F82011C2403FFFD0043102451
-:104F4000080023E3AF82011C8F82011C344200025F
-:104F5000AF82011C8F8301248F8200A034420001A4
-:104F6000AF8200A0AF8301248F82011C2403FFFDC8
-:104F700000431024AF82011C8EE2019C24420001F8
-:104F8000AEE2019C080023E38EE2019C8F8200A028
-:104F900034420001AF8200A08FBF001C8FB0001808
-:104FA00003E0000827BD0020000000003C020001D3
-:104FB0008C425C5827BDFFE8AFBF001414400012BC
-:104FC000AFB000103C10000126105DD0020020217F
-:104FD0000C0024882405200026021FE03C0100016B
-:104FE000AC225D943C010001AC225D90AF420250C6
-:104FF00024022000AF500254AF42025824020001A4
-:105000003C010001AC225C588FBF00148FB000102F
-:1050100003E0000827BD00183C0300018C635D9489
-:105020008C8200008FA800108FA90014AC620000D1
-:105030003C0200018C425D948C830004AC4300046C
-:10504000AC4500088F8400542443FFE0AC460010B8
-:10505000AC470014AC480018AC49001C3C010001EE
-:10506000AC235D94AC44000C3C02000124425DD0B2
-:105070000062182B10600005000000003C020001D7
-:105080008C425D903C010001AC225D943C03000128
-:105090008C635D943C0200018C425C40AC62000079
-:1050A0003C0300018C635D943C0200018C425C4037
-:1050B000AC62000403E00008AF4302503C0300016F
-:1050C0008C635D943C0200018C425C4027BDFFD0A4
-:1050D000AFB400208FB40040AFB00010008080213A
-:1050E000AFB500248FB500448FA40048AFB10014C1
-:1050F00000A08821AFBF0028AFB3001CAFB20018DA
-:10510000AC6200003C0500018CA55D943C020001EE
-:105110008C425C4000C0902100E098211080000685
-:10512000ACA2000424A500080C002490240600185A
-:105130000800244E0000000024A400080C0024886D
-:10514000240500183C0200018C425D943C050001DE
-:1051500024A55DD02442FFE03C010001AC225D9417
-:105160000045102B10400005000000003C0200012B
-:105170008C425D903C010001AC225D943C03000137
-:105180008C635D948E020000AC6200003C03000161
-:105190008C635D948E020004AC620004AC71000864
-:1051A0008F8400542462FFE03C010001AC225D9436
-:1051B0000045102BAC720010AC730014AC740018D6
-:1051C000AC75001C10400005AC64000C3C020001F2
-:1051D0008C425D903C010001AC225D943C030001D7
-:1051E0008C635D943C0200018C425C40AC62000028
-:1051F0003C0300018C635D943C0200018C425C40E6
-:10520000AC620004AF4302508FBF00288FB500246A
-:105210008FB400208FB3001C8FB200188FB1001420
-:105220008FB0001003E0000827BD003010A000057B
-:1052300000000000AC80000024A5FFFC14A0FFFDCE
-:105240002484000403E000080000000010C00007F0
-:10525000000000008C8200002484000424C6FFFCAF
-:10526000ACA2000014C0FFFB24A5000403E000086A
-:105270000000000010C00007000000008CA2000029
-:1052800024A5000424C6FFFCAC82000014C0FFFB70
-:105290002484000403E000080000000003E000088C
-:1052A0000000000027BDFFD8AFBF00208EE304E45C
-:1052B0008EE204E010620436000000008EE204E496
-:1052C0008EE304FC00021100006260219587000853
-:1052D0008D8A00008D8B0004958D000A8EE2725C31
-:1052E0008EE3726C30E4FFFF004410210062182B43
-:1052F0001060001531A200048F8200D88EE372582E
-:1053000000431023AEE2726C8EE2726C1C4000030C
-:105310003C03000100431021AEE2726C8EE2725C2D
-:105320008EE3726C004410210062182B106000069E
-:1053300031A200048EE201B824420001AEE201B8BD
-:10534000080028E18EE201B81040024031A20200BC
-:105350001040014D0000482196E2045A30420010EE
-:1053600010400149000000008F84010027623000D6
-:105370002485002000A2102B504000012765280042
-:105380008F82010810A20004000000008F82010437
-:1053900014A200062402000C8EE201A8244200019F
-:1053A000AEE201A80800252C8EE201A8AC8A00001C
-:1053B000AC8B00048EE3726424060005A482000E08
-:1053C000AC860018AC8300088EE204E4AC82001CBA
-:1053D0008EE204C8AC820010AF85010092E204ECBA
-:1053E00014400036240900018EE24E28000210C04D
-:1053F00024424E3802E220218C8200001446001F15
-:10540000000000008EE34E288EE24E2C1062001B3E
-:10541000240300408C82000424420001AC8200047A
-:105420008EE24E2C8EE54E282442000110430007E8
-:10543000000000008EE24E2C2442000110A2000564
-:1054400000000000080025160000000014A0000560
-:10545000000000008F82010824420020AF82010872
-:105460008F8201088C8200042C42001150400013EE
-:10547000AC8000000800252C000000008EE24E28C1
-:105480002403004024420001504300030000102187
-:105490008EE24E2824420001AEE24E288EE24E28D3
-:1054A000000210C024424E3802E2202124020005EE
-:1054B000AC82000024020001AC8200041520000A26
-:1054C0003C040001AFAB00108EE272643C040001AA
-:1054D000248457303C050004AFA200148EE604E497
-:1054E000080028BE34A5F1148EE2726434843800BA
-:1054F00003641821244200100043102B1440007351
-:10550000000000008EE27264244800100364102141
-:105510000102102B144000023C02FFFF0102402157
-:105520008F8501002762300024A6002000C2102BC6
-:1055300050400001276628008F82010810C2000435
-:10554000000000008F82010414C200072563000CD4
-:105550008EE201A80000482124420001AEE201A829
-:10556000080025A08EE201A82C64000C0144102143
-:10557000ACA20000ACA3000424E2FFF4A4A2000E3D
-:1055800024020006ACA80008ACA200188EE204E4D5
-:10559000ACA2001C8EE204C83C03000200431025AC
-:1055A000ACA20010AF86010092E204EC1440003778
-:1055B000240900018EE24E28000210C024424E3819
-:1055C00002E220218C830000240200051462001FE7
-:1055D000000000008EE34E288EE24E2C1062001B6D
-:1055E000240300408C82000424420001AC820004A9
-:1055F0008EE24E2C8EE54E28244200011043000717
-:10560000000000008EE24E2C2442000110A2000592
-:10561000000000000800258A0000000014A000051A
-:10562000000000008F82010824420020AF820108A0
-:105630008F8201088C8200042C420011504000131C
-:10564000AC800000080025A0000000008EE24E287B
-:1056500024030040244200015043000300001021B5
-:105660008EE24E2824420001AEE24E288EE24E2801
-:10567000000210C024424E3802E22021240200051C
-:10568000AC82000024020001AC8200041520000A54
-:105690002508FFFCAFAB00108EE272643C040001F1
-:1056A000248457303C050004AFA200148EE604E4C5
-:1056B000080028BE34A5F12534028100A5020000AF
-:1056C0009582000E0800261DA50200028F850100AC
-:1056D0002762300024A6002000C2102B5040000199
-:1056E000276628008F82010810C200040000000015
-:1056F0008F82010414C200072563000C8EE201A80A
-:105700000000482124420001AEE201A80800260D55
-:105710008EE201A82C64000C01441021ACA2000010
-:10572000ACA300048EE3726424E2FFF4A4A2000E92
-:1057300024020006ACA2001824630010ACA30008E9
-:105740008EE204E4ACA2001C8EE204C83C0300021A
-:1057500000431025ACA20010AF86010092E204ECD9
-:1057600014400037240900018EE24E28000210C0C8
-:1057700024424E3802E220218C83000024020005DE
-:105780001462001F000000008EE34E288EE24E2CB3
-:105790001062001B240300408C820004244200019C
-:1057A000AC8200048EE24E2C8EE54E28244200018D
-:1057B00010430007000000008EE24E2C244200013E
-:1057C00010A2000500000000080025F700000000FE
-:1057D00014A00005000000008F8201082442002070
-:1057E000AF8201088F8201088C8200042C420011D4
-:1057F00050400013AC8000000800260D000000009F
-:105800008EE24E282403004024420001504300034E
-:10581000000010218EE24E2824420001AEE24E2804
-:105820008EE24E28000210C024424E3802E22021AF
-:1058300024020005AC82000024020001AC820004B6
-:105840001520000A34028100AFAB00108EE27264B2
-:105850003C040001248457303C050004AFA200142E
-:105860008EE604E4080028BE34A5F0158EE37264C9
-:10587000A462000C8EE372649582000EA462000E96
-:105880000800268124E700048F840100276230008D
-:105890002485002000A2102B50400001276528001D
-:1058A0008F82010810A20004000000008F82010412
-:1058B00014A20007240200068EE201A8000048217D
-:1058C00024420001AEE201A8080026778EE201A87A
-:1058D000AC8A0000AC8B00048EE37264A487000ED7
-:1058E000AC820018AC8300088EE204E4AC82001C99
-:1058F0008EE204C83C03000200431025AC82001075
-:10590000AF85010092E204EC144000372409000145
-:105910008EE24E28000210C024424E3802E22021BE
-:105920008C830000240200051462001F00000000A8
-:105930008EE34E288EE24E2C1062001B24030040A2
-:105940008C82000424420001AC8200048EE24E2CC2
-:105950008EE54E282442000110430007000000009D
-:105960008EE24E2C2442000110A20005000000002F
-:10597000080026610000000014A0000500000000DF
-:105980008F82010824420020AF8201088F82010823
-:105990008C8200042C42001150400013AC800000A7
-:1059A00008002677000000008EE24E282403004005
-:1059B0002442000150430003000010218EE24E28D3
-:1059C00024420001AEE24E288EE24E28000210C0B2
-:1059D00024424E3802E2202124020005AC8200005D
-:1059E00024020001AC820004152000093C050004DB
-:1059F000AFAB00108EE272643C0400012484573087
-:105A0000AFA200148EE604E4080028BE34A5F0041A
-:105A10008EE2725C30E7FFFF00471021AEE2725C5D
-:105A20008EE204E48EE304FC8EE47258000211005E
-:105A300000431021AC44000C8EE27258AFA2001853
-:105A40008EE3725CAFA3001C8EE2725C2C42003CC1
-:105A500010400004246200012403FFFE00431024D0
-:105A6000AFA2001C8EE272643C06000134C638000E
-:105A70008EE3725C2405FFF80047102124420007E2
-:105A80000045102424630007AEE272588EE2726C67
-:105A90008EE472580065182400431023AEE2726C45
-:105AA000036610210082202B148000043C03FFFFBA
-:105AB0008EE2725800431021AEE272588EE27258A4
-:105AC000AEE272648F8200F024470008276218005B
-:105AD00000E2102B50400001276710008F8200F475
-:105AE00014E20007000000008EE201B4000048212B
-:105AF00024420001AEE201B4080026C48EE201B4E3
-:105B00008F8200F0240900018FA300188FA4001CCD
-:105B1000AC430000AC440004AF8700F01520001235
-:105B2000000D11428F8200F0AFA200108F8200F4AE
-:105B30003C0400012484573CAFA200148FA6001837
-:105B40008FA7001C3C0500040C00240334A5F005BD
-:105B50008EE2008824420001AEE200888EE20088D6
-:105B6000080028D3AEE0725C304300032402000238
-:105B70001062001628620003104000052402000194
-:105B80001062000800000000080027030000000069
-:105B90002402000310620017000000000800270321
-:105BA000000000008EE200E88EE300EC24630001B8
-:105BB0002C64000100441021AEE200E8AEE300ECEA
-:105BC0008EE200E8080027038EE300EC8EE200F08E
-:105BD0008EE300F4246300012C64000100441021D2
-:105BE000AEE200F0AEE300F48EE200F0080027031E
-:105BF0008EE300F48EE200F88EE300FC24630001E3
-:105C00002C64000100441021AEE200F8AEE300FC79
-:105C10008EE200F88EE300FC8EE2725C8EE400E01F
-:105C20008EE500E4004018210000102100A3282187
-:105C300000A3302B0082202100862021AEE400E06A
-:105C4000AEE500E4080028D3AEE0725C30E2FFFF6E
-:105C5000104001C131A202001040014D0000482156
-:105C600096E2045A30420010104001490000000042
-:105C70008F840100276230002485002000A2102BB1
-:105C800050400001276528008F82010810A20004FF
-:105C9000000000008F82010414A200062402000C00
-:105CA0008EE201A824420001AEE201A80800276E9E
-:105CB0008EE201A8AC8A0000AC8B00048EE3726413
-:105CC00024060005A482000EAC860018AC830008F0
-:105CD0008EE204E4AC82001C8EE204C8AC820010A8
-:105CE000AF85010092E204EC144000362409000163
-:105CF0008EE24E28000210C024424E3802E22021DB
-:105D00008C8200001446001F000000008EE34E2825
-:105D10008EE24E2C1062001B240300408C82000493
-:105D200024420001AC8200048EE24E2C8EE54E2807
-:105D30002442000110430007000000008EE24E2CB8
-:105D40002442000110A200050000000008002758AE
-:105D50000000000014A00005000000008F82010870
-:105D600024420020AF8201088F8201088C82000447
-:105D70002C42001150400013AC8000000800276E38
-:105D8000000000008EE24E2824030040244200015F
-:105D900050430003000010218EE24E2824420001EF
-:105DA000AEE24E288EE24E28000210C024424E3849
-:105DB00002E2202124020005AC820000240200013E
-:105DC000AC8200041520000A3C040001AFAB0010B7
-:105DD0008EE272643C040001248457303C050004C8
-:105DE000AFA200148EE604E4080028BE34A5F01427
-:105DF0008EE2726434843800036418212442001057
-:105E00000043102B14400073000000008EE2726407
-:105E100024480010036410210102102B14400002DA
-:105E20003C02FFFF010240218F8501002762300004
-:105E300024A6002000C2102B504000012766280035
-:105E40008F82010810C20004000000008F8201044C
-:105E500014C200072563000C8EE201A8000048214F
-:105E600024420001AEE201A8080027E28EE201A868
-:105E70002C64000C01441021ACA20000ACA300046F
-:105E800024E2FFF4A4A2000E24020006ACA800083D
-:105E9000ACA200188EE204E4ACA2001C8EE204C89E
-:105EA0003C03000200431025ACA20010AF860100A5
-:105EB00092E204EC14400037240900018EE24E28DF
-:105EC000000210C024424E3802E220218C830000E0
-:105ED000240200051462001F000000008EE34E281B
-:105EE0008EE24E2C1062001B240300408C820004C2
-:105EF00024420001AC8200048EE24E2C8EE54E2836
-:105F00002442000110430007000000008EE24E2CE6
-:105F10002442000110A2000500000000080027CC68
-:105F20000000000014A00005000000008F8201089E
-:105F300024420020AF8201088F8201088C82000475
-:105F40002C42001150400013AC800000080027E2F2
-:105F5000000000008EE24E2824030040244200018D
-:105F600050430003000010218EE24E28244200011D
-:105F7000AEE24E288EE24E28000210C024424E3877
-:105F800002E2202124020005AC820000240200016C
-:105F9000AC8200041520000A2508FFFCAFAB0010FE
-:105FA0008EE272643C040001248457303C050004F6
-:105FB000AFA200148EE604E4080028BE34A5F01554
-:105FC00034028100A50200009582000E0800285FBF
-:105FD000A50200028F8501002762300024A6002060
-:105FE00000C2102B50400001276628008F82010854
-:105FF00010C20004000000008F82010414C20007D8
-:106000002563000C8EE201A8000048212442000113
-:10601000AEE201A80800284F8EE201A82C64000C13
-:1060200001441021ACA20000ACA300048EE3726412
-:1060300024E2FFF4A4A2000E24020006ACA2001881
-:1060400024630010ACA300088EE204E4ACA2001CA0
-:106050008EE204C83C03000200431025ACA20010ED
-:10606000AF86010092E204EC1440003724090001DD
-:106070008EE24E28000210C024424E3802E2202157
-:106080008C830000240200051462001F0000000041
-:106090008EE34E288EE24E2C1062001B240300403B
-:1060A0008C82000424420001AC8200048EE24E2C5B
-:1060B0008EE54E2824420001104300070000000036
-:1060C0008EE24E2C2442000110A2000500000000C8
-:1060D000080028390000000014A00005000000009E
-:1060E0008F82010824420020AF8201088F820108BC
-:1060F0008C8200042C42001150400013AC80000040
-:106100000800284F000000008EE24E2824030040C3
-:106110002442000150430003000010218EE24E286B
-:1061200024420001AEE24E288EE24E28000210C04A
-:1061300024424E3802E2202124020005AC820000F5
-:1061400024020001AC8200041520000A3402810000
-:10615000AFAB00108EE272643C040001248457301F
-:106160003C050004AFA200148EE604E4080028BE3B
-:1061700034A5F0168EE37264A462000C8EE37264A0
-:106180009582000EA462000E080028C224E70004D5
-:106190008F83010027623000246400200082102BCE
-:1061A00050400001276428008F82010810820004FB
-:1061B000000000008F8201041482000724050005FE
-:1061C0008EE201A80000482124420001AEE201A8AD
-:1061D000080028B68EE201A8AC6A0000AC6B00048F
-:1061E0008EE27264A467000EAC650018AC62000811
-:1061F0008EE204E4AC62001C8EE204C8AC620010C3
-:10620000AF84010092E204EC14400036240900013E
-:106210008EE24E28000210C024424E3802E22021B5
-:106220008C8200001445001F000000008EE34E2801
-:106230008EE24E2C1062001B240300408C8200046E
-:1062400024420001AC8200048EE24E2C8EE54E28E2
-:106250002442000110430007000000008EE24E2C93
-:106260002442000110A2000500000000080028A040
-:106270000000000014A00005000000008F8201084B
-:1062800024420020AF8201088F8201088C82000422
-:106290002C42001150400013AC800000080028B6CA
-:1062A000000000008EE24E2824030040244200013A
-:1062B00050430003000010218EE24E2824420001CA
-:1062C000AEE24E288EE24E28000210C024424E3824
-:1062D00002E2202124020005AC8200002402000119
-:1062E000AC8200041520000B3C0500043C040001B6
-:1062F00024845748AFAB0010AFA000148EE604E42E
-:1063000034A5F0170C00240330E7FFFF080028E154
-:10631000000000008EE272643C05000130E4FFFFE3
-:1063200000441021AEE272648EE2725C8EE372640D
-:1063300034A5380000441021AEE2725C03651021E0
-:106340000062182B146000043C03FFFF8EE27264AD
-:1063500000431021AEE272648EE304E496E2045836
-:10636000246300012442FFFF00621824AEE304E42A
-:106370008EE304E48EE204E01462000500000000F5
-:106380008F8200602403FFF700431024AF82006077
-:106390008FBF002003E0000827BD002827BDFFE0D5
-:1063A000AFBF00188EE304E88EE204E010620189BA
-:1063B000000000008EE204E88EE304FC00021100FD
-:1063C000006218219467000892E204ED8C680000D6
-:1063D0008C69000410400023946A000A8EE204C80D
-:1063E00034460400314202001040001F000000004B
-:1063F00096E2045A304200101040001B3C0280001C
-:106400003C01000100370821AC2283D88EE272647F
-:106410009464000E3C05000134A5380024420004B9
-:10642000AEE272648EE372640004240003651021FE
-:106430003C01000100370821AC2483DC0062182BEA
-:106440001460000524E700048EE272643C03FFFF41
-:1064500000431021AEE272648EE2726408002917D4
-:10646000AEE272588EE604C88EE2726C30E4FFFF32
-:106470000044102A10400015000000008F8200D850
-:106480008EE3725800431023AEE2726C8EE2726C9F
-:106490001C4000070044102A8EE2726C3C0300018D
-:1064A00000431021AEE2726C8EE2726C0044102A3E
-:1064B00010400006000000008EE201B824420001F6
-:1064C000AEE201B808002A728EE201B83C02000177
-:1064D000005710218C4283D85440000124E7FFFC70
-:1064E00031420004104000B930E2FFFF3C020001DD
-:1064F000005710218C4283D81040002F00005021FB
-:106500008F840100276230002485002000A2102B18
-:1065100050400001276528008F82010810A2003238
-:10652000000000008F82010410A2002F2402001539
-:10653000AC880000AC8900048EE37264A487000E6E
-:10654000AC820018AC8300088EE204E83C03000132
-:10655000007718218C6383DCAC8600100043102583
-:10656000AC82001CAF85010092E204EC144000668E
-:10657000240A00018EE24E28240300402442000138
-:1065800050430003000010218EE24E2824420001F7
-:10659000AEE24E288EE24E28000210C024424E3851
-:1065A00002E2182124020015AC620000240200015E
-:1065B000080029BFAC6200048F840100276230000C
-:1065C0002485002000A2102B5040000127652800E0
-:1065D0008F82010810A20004000000008F820104D5
-:1065E00014A20006240200068EE201A82442000143
-:1065F000AEE201A8080029BF8EE201A8AC88000025
-:10660000AC8900048EE37264A487000EAC8200188B
-:10661000AC8300088EE204E8AC860010AC82001C5B
-:10662000AF85010092E204EC14400037240A000117
-:106630008EE24E28000210C024424E3802E2202191
-:106640008C830000240200051462001F000000007B
-:106650008EE34E288EE24E2C1062001B2403004075
-:106660008C82000424420001AC8200048EE24E2C95
-:106670008EE54E2824420001104300070000000070
-:106680008EE24E2C2442000110A200050000000002
-:10669000080029A90000000014A000050000000067
-:1066A0008F82010824420020AF8201088F820108F6
-:1066B0008C8200042C42001150400013AC8000007A
-:1066C000080029BF000000008EE24E28240300408D
-:1066D0002442000150430003000010218EE24E28A6
-:1066E00024420001AEE24E288EE24E28000210C085
-:1066F00024424E3802E2202124020005AC82000030
-:1067000024020001AC8200041540000A24020001AA
-:10671000AFA900108EE272643C040001248457305B
-:106720003C050004AFA200148EE604E408002A4FE2
-:1067300034A5F204A2E204ED8EE204E88EE304FC48
-:106740008EE472583C06000134C638003C0100015A
-:1067500000370821AC2083D83C0100010037082114
-:10676000AC2083DC0002110000431021AC44000C7B
-:106770008EE272642405FFF830E3FFFF004310212E
-:10678000244200070045102424630007AEE272583B
-:106790008EE2726C8EE47258006518240043102358
-:1067A000AEE2726C036610210082202B148000047C
-:1067B0003C03FFFF8EE2725800431021AEE2725894
-:1067C0008EE2725808002A64AEE2726410400073D0
-:1067D000000000008F830100276230002464002045
-:1067E0000082102B14400002000050212764280072
-:1067F0008F82010810820004000000008F820104D3
-:1068000014820006240500058EE201A8244200013E
-:10681000AEE201A808002A468EE201A8AC6800009A
-:10682000AC6900048EE27264A467000EAC650018C7
-:10683000AC6200088EE204E8AC660010AC62001C9A
-:10684000AF84010092E204EC14400036240A0001F7
-:106850008EE24E28000210C024424E3802E220216F
-:106860008C8200001445001F000000008EE34E28BB
-:106870008EE24E2C1062001B240300408C82000428
-:1068800024420001AC8200048EE24E2C8EE54E289C
-:106890002442000110430007000000008EE24E2C4D
-:1068A0002442000110A200050000000008002A3068
-:1068B0000000000014A00005000000008F82010805
-:1068C00024420020AF8201088F8201088C820004DC
-:1068D0002C42001150400013AC80000008002A46F2
-:1068E000000000008EE24E282403004024420001F4
-:1068F00050430003000010218EE24E282442000184
-:10690000AEE24E288EE24E28000210C024424E38DD
-:1069100002E2202124020005AC82000024020001D2
-:10692000AC8200041540000C30E5FFFF3C04000180
-:10693000248457483C050004AFA90010AFA0001400
-:106940008EE604E434A5F2370C00240330E7FFFFA1
-:1069500008002A72000000008EE2726400451021D7
-:10696000AEE272648EE2726C8EE372643C040001EB
-:1069700034843800A2E004ED00451023AEE2726CCE
-:10698000036410210062182B146000043C03FFFF15
-:106990008EE2726400431021AEE272648EE304E87A
-:1069A00096E20458246300012442FFFF0062182489
-:1069B000AEE304E88EE304E88EE204E0146200052E
-:1069C000000000008F8200602403FFF700431024C2
-:1069D000AF8200608FBF001803E0000827BD0020D1
-:1069E00027BDFFE0AFBF001CAFB000188F820100D1
-:1069F0008EE34E2C8F8201048F8501082402004013
-:106A00002463000150620003000010218EE24E2C2E
-:106A100024420001AEE24E2C8EE24E2C8EE34E2C30
-:106A2000000210C024424E3802E220218EE24E289D
-:106A30008C8700041462000700A030218F820108B7
-:106A400024420020AF8201088F82010808002AA298
-:106A5000AC8000008EE24E2C240300402442000152
-:106A600050430003000010218EE24E2C244200010E
-:106A7000000210C024424E3802E220218C82000421
-:106A80008F8301080002114000621821AF830108C2
-:106A9000AC8000008CC200182443FFFE2C6200135F
-:106AA000104000C1000310803C01000100220821B9
-:106AB0008C22577000400008000000008EE204F0B5
-:106AC00000471021AEE204F08EE204F08F43023C56
-:106AD0000043102B144000BE000000008EE304E4CD
-:106AE0008EE204F8506200BAA2E004F48F83012021
-:106AF000276238002466002000C2102B504000019D
-:106B0000276630008F82012810C2000400000000B8
-:106B10008F82012414C20007000000008EE201A44D
-:106B20000000802124420001AEE201A408002B12E3
-:106B30008EE201A48EE204E4AC62001C8EE404B098
-:106B40008EE504B42462001CAC6200082402000834
-:106B5000A462000E24020011AC620018AC640000B4
-:106B6000AC6500048EE204C4AC620010AF86012064
-:106B700092E24E2014400037241000018EE24E3085
-:106B8000000210C02442503802E220218C83000011
-:106B9000240200121462001F000000008EE34E3039
-:106BA0008EE24E341062001B240300408C820004ED
-:106BB00024420001AC8200048EE24E348EE54E3059
-:106BC0002442000110430007000000008EE24E3412
-:106BD0002442000110A200050000000008002AFC69
-:106BE0000000000014A00005000000008F820128B2
-:106BF00024420020AF8201288F8201288C82000469
-:106C00002C42001150400013AC80000008002B12F1
-:106C1000000000008EE24E302403004024420001B8
-:106C200050430003000010218EE24E302442000148
-:106C3000AEE24E308EE24E30000210C02442503898
-:106C400002E2202124020012AC8200002402000192
-:106C5000AC8200045600000B241000018EE204E414
-:106C60003C04000124845754AFA00014AFA20010CC
-:106C70008EE606088F4702283C0500090C00240315
-:106C800034A5F006160000032402000108002B7151
-:106C9000A2E204F48EE2017024420001AEE201702F
-:106CA0008EE201708EE204E4A2E004F4AEE004F0AF
-:106CB000AEE204F88F42023C50400045AEE07274F0
-:106CC0008EE2018424420001AEE201848EE201845E
-:106CD00008002B71AEE072748EE2050424030040BC
-:106CE0002442000150430003000010218EE20504FD
-:106CF00024420001AEE205048EE205048CC30018B4
-:106D000000021080005710218C4405082402000363
-:106D10001462000F000000003C0200010057102127
-:106D2000904283B110400014000000008EE201D0B8
-:106D30008EE3524000441021AEE201D08EE201D831
-:106D400000641821306300FF08002B59AEE3524065
-:106D50008EE201CC8EE30E1000441021AEE201CC95
-:106D60008EE201D800641821306301FFAEE30E10FB
-:106D700000441021AEE201D88EE20000344200400F
-:106D800008002B71AEE200008EE2014C3C010001D4
-:106D900000370821A02083E024420001AEE2014C2C
-:106DA00008002B718EE2014C94C7000E8CC2001CAF
-:106DB0003C04000124845760AFA60014AFA2001069
-:106DC0008CC600183C0500080C00240334A50910EB
-:106DD0008FBF001C8FB0001803E0000827BD002003
-:106DE00027BDFF98AFBF0060AFBE005CAFB60058D4
-:106DF000AFB50054AFB40050AFB3004CAFB20048D1
-:106E0000AFB10044AFB000408F8301088F8201040E
-:106E1000AFA00024106203E7AFA0002C3C1E0001CD
-:106E200037DE38003C0BFFFF8F9301088E6200189D
-:106E30008F8301042443FFFE2C620014104003CF13
-:106E4000000310803C010001002208218C2257C061
-:106E500000400008000000009663000E8EE2725CA5
-:106E60008EE404F000431021AEE2725C8E63001CDD
-:106E700096E2045824840001AEE404F02463000187
-:106E80002442FFFF00621824AEE304E48F42023C78
-:106E90000082202B148003B9000000008F830120A2
-:106EA000276238002466002000C2102B50400001E9
-:106EB000276630008F82012810C200040000000005
-:106EC0008F82012414C20007000000008EE201A49A
-:106ED0000000802124420001AEE201A408002BFE44
-:106EE0008EE201A48EE204E4AC62001C8EE404B0E5
-:106EF0008EE504B42462001CAC6200082402000881
-:106F0000A462000E24020011AC620018AC64000000
-:106F1000AC6500048EE204C4AC620010AF860120B0
-:106F200092E24E2014400037241000018EE24E30D1
-:106F3000000210C02442503802E220218C8300005D
-:106F4000240200121462001F000000008EE34E3085
-:106F50008EE24E341062001B240C00408C82000430
-:106F600024420001AC8200048EE24E348EE34E30A7
-:106F700024420001104C0007000000008EE24E3455
-:106F800024420001106200050000000008002BE808
-:106F90000000000014600005000000008F8201283E
-:106FA00024420020AF8201288F8201288C820004B5
-:106FB0002C42001150400013AC80000008002BFE52
-:106FC000000000008EE24E30240C004024420001FC
-:106FD000504C0003000010218EE24E30244200018C
-:106FE000AEE24E308EE24E30000210C024425038E5
-:106FF00002E2202124020012240C0001AC820000D5
-:10700000AC8C00045600000D241000018EE204E454
-:107010003C04000124845754AFA00014AFA2001018
-:107020008EE606088F4702283C05000934A5F006C5
-:107030000C002403AFAB00388FAB00381200030AFA
-:10704000240C000108002F1900000000966C001CA1
-:10705000AFAC002C9662001E3C0C8000AFAC00244C
-:10706000AE62001C8E75001C8EE204FC8EE404FCF3
-:1070700000151900006210218C52000C92E27B98DE
-:10708000006418219476000A1440000332C2000202
-:10709000AEF27BA4AEF57B9C1040004B000080213B
-:1070A00096E2045A304200021040004700000000FF
-:1070B0008E63001C8EE204FC00032100008210217C
-:1070C0008C42000C037E1821244200220043102B26
-:1070D0001440000A240500148EE204FC00821021F2
-:1070E0008C44000CAFAB00380C002F752484000ECC
-:1070F0008FAB003808002C523050FFFF8EE204FCAA
-:10710000008210218C42000C9450000E9443001019
-:10711000944400129445001402038021020480214B
-:107120000205802194430016944400189445001AE7
-:107130000203802102048021020580219443001C67
-:107140009444001E94420020020380210204802106
-:107150000202802100101C023202FFFF0062802127
-:107160008E63001C8EE204FC001024020003290040
-:1071700000A210218C43000C3202FFFF008280210C
-:10718000037E1021246300180062182B146000098C
-:10719000000000008EE204FC00A210218C43000CD1
-:1071A000001010273C01FFFF0023082108002C6F6E
-:1071B000A42200188EE204FC00A210218C43000CD3
-:1071C00000101027A462001896E2045A00008821DB
-:1071D00030420008144000630000A0218E63001CB0
-:1071E0008EE204FC0003310000C210218C42000C2E
-:1071F000037E1821244200220043102B1440003546
-:10720000000000008EE204FC00C210218C42000C41
-:1072100024470010037E102100E2102B5040000193
-:1072200000EB38218EE204FC94F1000000C2102132
-:107230008C42000C24470016037E102100E2102B24
-:10724000144000022634FFEC00EB38218EE204FCEF
-:1072500090E3000100C210218C42000C2447001A68
-:10726000037E102100E2102B1440000202838821CB
-:1072700000EB382194E2000024E70002022288217A
-:10728000037E102100E2102B5040000100EB38215A
-:1072900094E2000024E7000202228821037E1021EC
-:1072A00000E2102B5040000100EB382194E2000076
-:1072B00024E7000202228821037E102100E2102B25
-:1072C0005040000100EB382194E2000008002CD06F
-:1072D000022288218EE204FC00C210218C43000CA3
-:1072E0008EE204FC947100108EE304FC00C21021B5
-:1072F0008C44000C00C318218C62000C2634FFEC77
-:10730000908400178EE304FC9442001A02848821C2
-:1073100000C318218C65000C8EE304FC0222882136
-:107320008EE204FC00C3182100C210218C44000C22
-:107330008C62000C94A3001C9484001E94420020D4
-:1073400002238821022488210222882100111C02A4
-:107350003222FFFF0062882100111C023222FFFF4F
-:107360000062882132C20001104000B2000000001B
-:1073700096E2045A30420001104000AE32C2008052
-:10738000104000080000000092E27B9814400005C5
-:1073900000000000240C0001A2EC7B98AEF57B9C61
-:1073A000AEF27BA48EE304FC001511000043102113
-:1073B0008C47000C037E182124E2000E0043102BA2
-:1073C0001440000800E020212405000E0C002F7559
-:1073D000AFAB00383042FFFF8FAB003808002D09FB
-:1073E0000202802194E6000024E7000294E50000F8
-:1073F00024E7000294E3000024E7000294E2000086
-:1074000024E7000294E4000024E700020206802141
-:1074100002058021020380210202802194E2000003
-:1074200094E30002020480210202802102038021F1
-:1074300000101C023202FFFF0062802100101C02BB
-:107440003202FFFF8EE47B9C0062802114950004D1
-:107450003205FFFF9662001608002D17005120210B
-:107460009662001600542021000414023083FFFFAE
-:1074700000432021008520230004140200822021E3
-:107480003084FFFF508000013404FFFF8EE27BA4B4
-:1074900024430017037E10210062102B504000018E
-:1074A000006B182190630000240200111462003167
-:1074B000240200068EE27BA4037E182124420028C9
-:1074C0000043102B14400018000000008EE27B9C4B
-:1074D00012A2000A32C201008EE27BA43C01FFFF2F
-:1074E00000220821942200280082202100041C028E
-:1074F0003082FFFF0062202132C2010014400004EC
-:107500000004102792E27B98144000020004102728
-:107510003044FFFF8EE27BA43C01FFFF00220821E4
-:1075200008002D8AA42400288EE27B9C12A2000869
-:1075300032C201008EE27BA4944200280082202106
-:1075400000041C023082FFFF0062202132C20100D1
-:10755000144000040004102792E27B9814400002BB
-:10756000000410273044FFFF8EE27BA408002D8A20
-:10757000A44400281462002F037E18218EE27BA40D
-:10758000244200320043102B144000180000000079
-:107590008EE27B9C12A2000A32C201008EE27BA422
-:1075A0003C01FFFF002208219422003200822021AA
-:1075B00000041C023082FFFF0062202132C2010061
-:1075C000144000040004102792E27B98144000024B
-:1075D000000410273044FFFF8EE27BA43C01FFFF34
-:1075E0000022082108002D8AA42400328EE27B9C10
-:1075F00012A2000832C201008EE27BA49442003243
-:107600000082202100041C023082FFFF0062202142
-:1076100032C20100144000040004102792E27B985B
-:1076200014400002000410273044FFFF8EE27BA4C8
-:10763000A44400328FAC00241180002C037E18215A
-:107640008E420000AE42FFFC2642000A0043102B8F
-:107650001440001B3403810026430004037E1021E4
-:107660000062102B1440000300602021006B1821E1
-:10767000006020218C62000024630004AE42000000
-:10768000037E10210062102B50400001006B182176
-:107690008C620000AC82000034028100A462000011
-:1076A00024630002037E10210062102B5040000171
-:1076B000006B182197AC002E08002DB4A46C0000BC
-:1076C0008E4200048E440008A643000897AC002EAA
-:1076D000A64C000AAE420000AE4400049662000EC2
-:1076E0002652FFFC24420004A662000E9662000EA1
-:1076F0008EE3725C00621821AEE3725CAFB20018D8
-:107700008EE3725CAFA3001C8EE2725C2C42003CE4
-:1077100010400004246200012403FFFE00431024F3
-:10772000AFA2001C32C200801040000C32C2010027
-:107730008EE27BA824430001000210C000571021F4
-:10774000AEE37BA88FA300188FA4001CAC437BACD6
-:10775000AC447BB008002EA0AEE0725C104000721A
-:10776000000000008EE27BA824430001000210C04C
-:1077700000571021AEE37BA88FA300188FA4001C34
-:10778000AC437BACAC447BB08EE27BA81040006382
-:1077900000004821000050218F8200F0244800089A
-:1077A000276218000102102B5040000127681000CA
-:1077B0008F8200F415020007000000008EE201B481
-:1077C0000000802124420001AEE201B408002DFA3D
-:1077D0008EE201B48F8300F02410000101571021C4
-:1077E0008C447BAC8C457BB0AC640000AC65000481
-:1077F000AF8800F01600000602EA10218EE2008831
-:1078000024420001AEE2008808002E3F8EE200888C
-:107810008C427BB08EE400E08EE500E48EE67B9C3B
-:10782000004018210000102100A3282100A3382BBC
-:1078300000822021008720218EE204FC00C9302133
-:1078400000063100AEE400E0AEE500E400C2302105
-:1078500094C2000A240C00020002114230430003CB
-:10786000106C00162862000310400005240C000173
-:10787000106C00080000000008002E3F000000000F
-:10788000240C0003106C00170000000008002E3FBD
-:10789000000000008EE200E88EE300EC24630001AB
-:1078A0002C64000100441021AEE200E8AEE300ECDD
-:1078B0008EE200E808002E3F8EE300EC8EE200F03E
-:1078C0008EE300F4246300012C64000100441021C5
-:1078D000AEE200F0AEE300F48EE200F008002E3FCE
-:1078E0008EE300F48EE200F88EE300FC24630001D6
-:1078F0002C64000100441021AEE200F8AEE300FC6D
-:107900008EE200F88EE300FC8EE27BA825290001C0
-:107910000122102B1440FFA0254A0008A2E07B980A
-:1079200008002E9FAEE07BA88F8200F0244700085D
-:107930002762180000E2102B50400001276710005A
-:107940008F8200F414E20007000000008EE201B410
-:107950000000802124420001AEE201B408002E5D47
-:107960008EE201B48F8200F0241000018FA3001872
-:107970008FA4001CAC430000AC440004AF8700F0AF
-:1079800016000007000000008EE20088244200017B
-:10799000AEE200888EE2008808002EA0AEE0725CA5
-:1079A0008EE2725C8EE400E08EE500E4240C0002BE
-:1079B000004018210000102100A3282100A3302B33
-:1079C000008220210086202100161142304300034E
-:1079D000AEE400E0AEE500E4106C00172C6200039A
-:1079E00010400005240C0001106C0008000000008D
-:1079F00008002EA0AEE0725C240C0003106C00198D
-:107A00000000000008002EA0AEE0725C8EE200E8EC
-:107A10008EE300EC246300012C640001004410217B
-:107A2000AEE200E8AEE300EC8EE200E88EE300ECAC
-:107A300008002EA0AEE0725C8EE200F08EE300F44F
-:107A4000246300012C64000100441021AEE200F028
-:107A5000AEE300F48EE200F08EE300F408002EA006
-:107A6000AEE0725C8EE200F88EE300FC246300015D
-:107A70002C64000100441021AEE200F8AEE300FCEB
-:107A80008EE200F88EE300FCAEE0725C8E62001CB9
-:107A900096E304588EE404F0244200012463FFFFBF
-:107AA0000043102424840001AEE204E4AEE404F0B8
-:107AB0008F42023C0082202B148000B000000000A6
-:107AC0008F830120276238002466002000C2102B1B
-:107AD00050400001276630008F82012810C2000448
-:107AE000000000008F82012414C200070000000083
-:107AF0008EE201A40000802124420001AEE201A434
-:107B000008002F078EE201A48EE204E4AC62001CA0
-:107B10008EE404B08EE504B42462001CAC6200085C
-:107B200024020008A462000E24020011AC620018B6
-:107B3000AC640000AC6500048EE204C4AC620010CA
-:107B4000AF86012092E24E2014400037241000013D
-:107B50008EE24E30000210C02442503802E2202152
-:107B60008C830000240200121462001F0000000039
-:107B70008EE34E308EE24E341062001B240C004027
-:107B80008C82000424420001AC8200048EE24E3458
-:107B90008EE34E3024420001104C0007000000002C
-:107BA0008EE24E3424420001106200050000000005
-:107BB00008002EF100000000146000050000000025
-:107BC0008F82012824420020AF8201288F82012861
-:107BD0008C8200042C42001150400013AC80000045
-:107BE00008002F07000000008EE24E30240C0040F9
-:107BF00024420001504C0003000010218EE24E3060
-:107C000024420001AEE24E308EE24E30000210C03F
-:107C10002442503802E2202124020012240C0001E8
-:107C2000AC820000AC8C00045600000D2410000152
-:107C30008EE204E43C04000124845754AFA00014F5
-:107C4000AFA200108EE606088F4702283C05000907
-:107C500034A5F0060C002403AFAB00388FAB00381E
-:107C600016000003240C000108002F5CA2EC04F4B1
-:107C70008EE2017024420001AEE201708EE20170DA
-:107C80008EE204E4A2E004F4AEE004F0AEE072742C
-:107C9000AEE204F88F42023C1040003800000000C1
-:107CA0008EE2018424420001AEE2018408002F5CD0
-:107CB0008EE201848EE20504240C0040244200017F
-:107CC000504C0003000010218EE205042442000104
-:107CD000AEE205048EE205048E630018240C000356
-:107CE0000002108000571021146C000F8C4405080E
-:107CF0003C02000100571021904283B11040001453
-:107D0000000000008EE201D08EE3524000441021BA
-:107D1000AEE201D08EE201D800641821306300FF8A
-:107D200008002F4FAEE352408EE201CC8EE30E10DE
-:107D300000441021AEE201CC8EE201D8006418218B
-:107D4000306301FFAEE30E1000441021AEE201D813
-:107D50008EE200003442004008002F5CAEE20000DA
-:107D60008EE2014C3C01000100370821A02083E095
-:107D700024420001AEE2014C8EE2014C8F820108E8
-:107D800024420020AF8201088F8201088F820108FF
-:107D9000276330000043102B1440000227622800A4
-:107DA000AF8201088F8301088F8201041462FC1ED8
-:107DB000000000008FBF00608FBE005C8FB60058CF
-:107DC0008FB500548FB400508FB3004C8FB2004871
-:107DD0008FB100448FB0004003E0000827BD006869
-:107DE0000005284310A0000D000030213C030001D5
-:107DF000346338003C07FFFF036310210082102B1F
-:107E00005040000100872021948200002484000259
-:107E100024A5FFFF14A0FFF800C2302100061C02B9
-:107E200030C2FFFF0062302100061C0230C2FFFF9B
-:107E30000062302103E0000830C2FFFF27BDFF8849
-:107E4000240F0001AFBF0070AFBE006CAFB600687A
-:107E5000AFB50064AFB40060AFB3005CAFB2005820
-:107E6000AFB10054AFB00050A3A00027AFAF002CBB
-:107E70008EE204D400008021304200011440002A28
-:107E8000A3A000378F8700E08F8800C48F8200E8AE
-:107E900000E220232C8210005040000124841000B6
-:107EA000000420C2008018218EE400C88EE500CCBA
-:107EB0000000102100A3282100A3302B00822021E4
-:107EC00000862021AEE400C8AEE500CC8F8300C858
-:107ED0003C02000A3442EFFF010320230044102B30
-:107EE000104000033C02000A3442F00000822021CE
-:107EF000008018218EE400C08EE500C4000010212F
-:107F000000A3282100A3302B0082202100862021FD
-:107F1000AEE400C0AEE500C4AF8800C8AF8700E49F
-:107F2000080034CCAF8700E83C0200010057102164
-:107F3000904283C01040000B000000003C14000180
-:107F40000297A0218E9483C43C13000102779821EC
-:107F50008E7383C83C1200010257902108003193B0
-:107F60008E5283CC8F8300E08F8200E410430007A1
-:107F7000000088218F8200E4241100018C4300005E
-:107F80008C440004AFA30018AFA4001C1620000E00
-:107F90003C02FFFF8F8200C4AFA200108F8200C896
-:107FA0003C04000124845870AFA200148F8600E0C6
-:107FB0008F8700E43C0500060C00240334A5F00084
-:107FC000080034CC000000008FA3001C8FB2001802
-:107FD0003074FFFF2694FFFC00621024104000580C
-:107FE000024098213C020080006210241040000AE8
-:107FF0003C0400408EE2007C24420001AEE2007CA2
-:108000008EE2007C8EE201FC24420001AEE201FC23
-:10801000080034C68EE201FC3C0600043C0B000163
-:108020003C0A00023C0500103C0900088EE200807A
-:108030003C0800203407800024420001AEE20080AA
-:108040008EE200808FA2001C0044182410660021DC
-:1080500000C3102B1440000700000000106B00113B
-:1080600000000000106A0015000000000800304900
-:10807000000420421065002300A3102B14400005CB
-:1080800000000000106900190000000008003049DD
-:108090000004204210680021000000000800304960
-:1080A000000420428EE2003424420001AEE200349B
-:1080B0008EE2003408003049000420428EE201ECD8
-:1080C00024420001AEE201EC8EE201EC08003049EE
-:1080D000000420428EE201F024420001AEE201F0F1
-:1080E0008EE201F008003049000420428EE201F4E3
-:1080F00024420001AEE201F48EE201F408003049AE
-:10810000000420428EE2003024420001AEE2003042
-:108110008EE2003008003049000420428EE201F86F
-:1081200024420001AEE201F88EE201F80004204290
-:108130001087047C000000000800300E00000000E2
-:108140003C02000100571021904283B21440008489
-:10815000240200013C03000100771821906383B3DF
-:108160001462007F3C0201008E4300000062102474
-:108170001040006F2402FFFF14620005241000016C
-:10818000964300043402FFFF1062007500000000F7
-:1081900092E204D814400072000000003C0200018A
-:1081A000005710218C4283B4284200051040002063
-:1081B000000038213C020001005710218C4283B49A
-:1081C000184000160000282196660000000520C017
-:1081D000009710219442777E1446000900971021E1
-:1081E0009443778096620002146200050097102184
-:1081F00094437782966200045062000824070001CD
-:108200003C020001005710218C4283B424A50001D8
-:1082100000A2102A5440FFEE000520C030E200FF0B
-:108220001040044000000000080030D500000000AD
-:10823000024020210C0022FE240500063044001FCD
-:10824000000428C002E510219442727C30424000B4
-:108250001440043400B710219443727E96620000EB
-:108260001462000B000418C000B710219443728000
-:108270009662000214620006000418C000B71021C4
-:10828000944372829662000410620035000418C0A4
-:1082900002E310219442727C304280001440042199
-:1082A00002E31021944B727C96670000000B28C0FB
-:1082B00000B710219442737E080030B700003021CF
-:1082C000000420C002E410219443737C02E41021D6
-:1082D000944B737C3063800014600010000B28C046
-:1082E00000B710219442737E1447FFF501602021EE
-:1082F00000B7102194437380966200025462FFF12C
-:10830000000420C000B710219443738296620004D9
-:108310005462FFEC000420C02406000130C200FFBC
-:108320001040040000000000080030D500000000EC
-:108330009743020296420000146203FA0000000014
-:108340009743020496420002146203F60000000004
-:108350009743020696420004146203F200000000F4
-:10836000924200003A030001304200010043102411
-:10837000104000742402FFFF8E63000014620004AA
-:108380003402FFFF966300041062006F240F0002A6
-:108390003C02000100571021904283B21440006A51
-:1083A000240F000392E204D854400068AFAF002CC1
-:1083B0003C020001005710218C4283B42842000582
-:1083C00010400020000038213C020001005710211D
-:1083D0008C4283B4184000160000282196660000E5
-:1083E000000520C0009710219442777E14460009B2
-:1083F0000097102194437780966200021462000572
-:10840000009710219443778296620004506200081E
-:10841000240700013C020001005710218C4283B464
-:1084200024A5000100A2102A5440FFEE000520C040
-:1084300030E200FF14400044240F0003080034C65B
-:1084400000000000024020210C0022FE240500064E
-:108450003044001F000428C002E510219442727CC1
-:1084600030424000144003AF00B710219443727EA5
-:10847000966200001462000B000418C000B71021BF
-:10848000944372809662000214620006000418C0D1
-:1084900000B7102194437282966200041062002794
-:1084A000000418C002E310219442727C3042800024
-:1084B0001440039C02E31021944B727C96670000E9
-:1084C000000B28C000B710219442737E0800313C95
-:1084D00000003021000420C002E410219443737C8A
-:1084E00002E41021944B737C306380001460001010
-:1084F000000B28C000B710219442737E1447FFF58B
-:108500000160202100B7102194437380966200021D
-:108510005462FFF1000420C000B71021944373821D
-:10852000966200045462FFEC000420C0240600019F
-:1085300030C200FF1040037B000000000800314FF4
-:10854000240F0003240F0001AFAF002C8F42026004
-:108550000054102B1040003A000000008F8300E40C
-:108560008F8200E01062000324630008AF8300E400
-:10857000AF8300E88EE400C08EE500C402801821BD
-:108580000000102100A3282100A3302B008220210D
-:1085900000862021AEE400C0AEE500C48EE20058A3
-:1085A00024420001AEE200588EE200588EE2007CC8
-:1085B00024420001AEE2007C8EE2007C8F8200E06B
-:1085C000AFA200108F8200E43C040001248458789C
-:1085D000AFA200148FA600188FA7001C3C05000650
-:1085E0000C00240334A5F003080034CC0000000084
-:1085F0008EE25240AFA200108EE252443C040001D1
-:1086000024845884AFA200148EE60E108EE70E1854
-:108610003C0500060C00240334A5F0028EE201C0E4
-:1086200024420001AEE201C08EE200008EE301C0F0
-:108630002403FFBF0043102408003470AEE20000A2
-:1086400096E204680054102B104000030000000064
-:10865000240F0001A3AF0027128003012416000796
-:1086600024150040241E0001240E00128EE2724CDC
-:108670008F43028024420001304207FF106202D380
-:108680000000000093A2002710400014000000002A
-:108690008EE352408EE252441062000926ED5244AD
-:1086A0008EE652448EE35244000211402442524866
-:1086B00002E2802124630001080031BF306B00FF1B
-:1086C00092E272481440FFCA000000008EE201E00E
-:1086D00024420001AEE201E08EE201E08EE30E10E2
-:1086E0008EE20E181062FFC226ED0E188EE60E18EE
-:1086F0008EE30E180002114024420E2002E2802177
-:1087000024630001306B01FF96E2046A30420010DE
-:1087100010400019000000009642000C340F810048
-:10872000144F0015000000003C020001005710210A
-:10873000904283C014400010000000009642000EDA
-:10874000A60200168E4200088E4300048E440000EC
-:108750002694FFFCAE42000CAE430008AE44000479
-:108760009602000E26730004240F0001A3AF003709
-:1087700034420200A602000E8E0200008E030004A6
-:108780003C04000134843800306A0007026A9823F0
-:10879000036410210262102B10400005028AA02100
-:1087A00002641023036218233C0200200043982334
-:1087B000268200072404FFF89603000A0044602480
-:1087C000006A1821006C102B104000020180382133
-:1087D00000603821AE1300188F88012024E20007C2
-:1087E0000044382427623800250900200122102B7C
-:1087F00050400001276930008F82012811220004B7
-:10880000000000008F82012415220007014018217A
-:108810008EE201A40000882124420001AEE201A4FE
-:108820000800324C8EE201A48E0400008E05000484
-:1088300000001021AD130008A507000EAD160018AA
-:10884000AD06001C00A3302B00A3282300822023A8
-:1088500000862023AD040000AD0500048EE204C0B4
-:10886000AD020010AF89012092E24E201440003387
-:10887000241100018EE24E30000210C02442503814
-:1088800002E220218C8200001456001F000000002C
-:108890008EE34E308EE24E341062001B000000006A
-:1088A0008C82000424420001AC8200048EE24E342B
-:1088B0008EE34E30244200011055000700000000F6
-:1088C0008EE24E34244200011062000500000000D8
-:1088D00008003239000000001460000500000000AC
-:1088E0008F82012824420020AF8201288F82012834
-:1088F0008C8200042C42001150400010AC8000001B
-:108900000800324C000000008EE24E30244200018C
-:1089100050550003000010218EE24E302442000129
-:10892000AEE24E308EE24E30000210C0244250388B
-:1089300002E22021AC960000AC9E00041620001834
-:108940003C0500068E0200183C0400012484589067
-:10895000AFA200108E0200008E03000434A5F009BF
-:10896000020030210C002403AFA3001493A20037AF
-:1089700010400216340F81008E4200048E4300081E
-:108980008E44000CA64F000CAE420000AE43000423
-:10899000AE4400089602001608003470A642000E8D
-:1089A00014EC0168028A1823960C000A9603000E44
-:1089B000028A1023A602000A34620004A602000EF6
-:1089C0008F88012027623800250900200122102B02
-:1089D00014400002306AFFFF276930008F820128AF
-:1089E00011220004000000008F82012415220007DC
-:1089F000240400208EE201A400008821244200010A
-:108A0000AEE201A4080032CA8EE201A48EE5724CE7
-:108A10008EE604908EE70494A504000E240400045E
-:108A2000AD100008AD0400180005294000A0182171
-:108A30000000102100E3382100E3202B00C2302188
-:108A400000C43021AD060000AD0700048EE2724C78
-:108A5000AD02001C8EE204C4AD020010AF890120FB
-:108A600092E24E2014400033241100018EE24E3079
-:108A7000000210C02442503802E220218C82000003
-:108A80001456001F000000008EE34E308EE24E347C
-:108A90001062001B000000008C82000424420001D0
-:108AA000AC8200048EE24E348EE34E30244200014C
-:108AB00010550007000000008EE24E3424420001F1
-:108AC0001062000500000000080032B7000000003E
-:108AD00014600005000000008F820128244200205D
-:108AE000AF8201288F8201288C8200042C42001161
-:108AF00050400010AC800000080032CA00000000A6
-:108B00008EE24E3024420001505500030000102137
-:108B10008EE24E3024420001AEE24E308EE24E3004
-:108B2000000210C02442503802E22021AC9600001E
-:108B3000AC9E00041620000D00000000A60C000AE8
-:108B4000A60A000E8F820100AFA200108F820104DE
-:108B50003C0400012484589C3C050006AFA200148C
-:108B60008EE6724C0800343B34A5F00B3C0100014A
-:108B700000370821A02083C0ADAB00008EE201D8F1
-:108B80008EE3724C2442FFFFAEE201D88EE201D8A0
-:108B900024630001306307FF26E2524415A2000659
-:108BA000AEE3724C8EE201D02442FFFFAEE201D070
-:108BB000080032EF8EE201D08EE201CC2442FFFFAA
-:108BC000AEE201CC8EE201CC8F4202401040007335
-:108BD000000000008EE20E1C24420001AEE20E1CDA
-:108BE0008F4302400043102B144001760000A02167
-:108BF0008F830120276238002466002000C2102BDA
-:108C000050400001276630008F82012810C2000406
-:108C1000000000008F82012414C200070000000041
-:108C20008EE201A40000882124420001AEE201A4EA
-:108C30000800334F8EE201A48EE2724CAC62001C3D
-:108C40008EE404A88EE504AC2462001CAC6200082B
-:108C500024020008A462000E24020011AC62001875
-:108C6000AC640000AC6500048EE204C4AC62001089
-:108C7000AF86012092E24E201440003324110001FF
-:108C80008EE24E30000210C02442503802E2202111
-:108C90008C820000144E001F000000008EE34E3056
-:108CA0008EE24E341062001B000000008C82000433
-:108CB00024420001AC8200048EE24E348EE34E303A
-:108CC0002442000110550007000000008EE24E34DF
-:108CD0002442000110620005000000000800333C3F
-:108CE0000000000014600005000000008F820128D1
-:108CF00024420020AF8201288F8201288C82000448
-:108D00002C42001150400010AC8000000800334F8E
-:108D1000000000008EE24E30244200015055000356
-:108D2000000010218EE24E3024420001AEE24E30AF
-:108D30008EE24E30000210C02442503802E2202160
-:108D4000AC8E0000AC9E00045620000D24110001E2
-:108D50008EE2724C3C040001248458A8AFA0001499
-:108D6000AFA200108EE6724C8F4702803C050009CE
-:108D700034A5F0080C002403AFAE00488FAE0048C5
-:108D800056200001AEE00E1C8EE201882442000154
-:108D9000AEE20188080033C88EE201888F8301208B
-:108DA000276238002466002000C2102B50400001CA
-:108DB000276630008F82012810C2000400000000E6
-:108DC0008F82012414C20007000000008EE201A47B
-:108DD0000000882124420001AEE201A4080033BA59
-:108DE0008EE201A48EE2724CAC62001C8EE404A8F8
-:108DF0008EE504AC2462001CAC620008240200086A
-:108E0000A462000E24020011AC620018AC640000E1
-:108E1000AC6500048EE204C4AC620010AF86012091
-:108E200092E24E2014400033241100018EE24E30B5
-:108E3000000210C02442503802E220218C8200003F
-:108E4000144E001F000000008EE34E308EE24E34C0
-:108E50001062001B000000008C820004244200010C
-:108E6000AC8200048EE24E348EE34E302442000188
-:108E700010550007000000008EE24E34244200012D
-:108E80001062000500000000080033A70000000089
-:108E900014600005000000008F8201282442002099
-:108EA000AF8201288F8201288C8200042C4200119D
-:108EB00050400010AC800000080033BA00000000F1
-:108EC0008EE24E3024420001505500030000102174
-:108ED0008EE24E3024420001AEE24E308EE24E3041
-:108EE000000210C02442503802E22021AC8E000063
-:108EF000AC9E00041620000D000000008EE2724CB3
-:108F00003C040001248458A8AFA00014AFA20010B4
-:108F10008EE6724C8F4702803C05000934A5F008AC
-:108F20000C002403AFAE00488FAE00488EE20174FF
-:108F300024420001AEE201748EE201740800346E36
-:108F40000000A021960C000A0183102B5440000160
-:108F500001801821A603000A8F88012027623800AB
-:108F6000250900200122102B504000012769300004
-:108F70008F82012811220004000000008F8201244A
-:108F800015220007240400208EE201A4000088219D
-:108F900024420001AEE201A40800342F8EE201A4B5
-:108FA0008EE5724C8EE604908EE70494A504000EC4
-:108FB00024040004AD100008AD0400180005294089
-:108FC00000A018210000102100E3382100E3202B2D
-:108FD00000C2302100C43021AD060000AD070004FE
-:108FE0008EE2724CAD02001C8EE204C4AD02001091
-:108FF000AF89012092E24E20144000332411000179
-:109000008EE24E30000210C02442503802E220218D
-:109010008C8200001456001F000000008EE34E30CA
-:109020008EE24E341062001B000000008C820004AF
-:1090300024420001AC8200048EE24E348EE34E30B6
-:109040002442000110550007000000008EE24E345B
-:109050002442000110620005000000000800341CDA
-:109060000000000014600005000000008F8201284D
-:1090700024420020AF8201288F8201288C820004C4
-:109080002C42001150400010AC8000000800342F2A
-:10909000000000008EE24E302442000150550003D3
-:1090A000000010218EE24E3024420001AEE24E302C
-:1090B0008EE24E30000210C02442503802E22021DD
-:1090C000AC960000AC9E00041620001D00000000BD
-:1090D000A60C000A8F820100AFA200108F8201044B
-:1090E0003C0400012484589C3C050006AFA20014F7
-:1090F0008EE6724C34A5F00D0C00240302003821DA
-:1091000093A2003710400031340F81008E420004DA
-:109110008E4300088E44000CA64F000CAE420000A7
-:10912000AE430004AE44000896020016A642000EAC
-:109130009602000E3042FDFF08003470A602000EB9
-:109140008EE201D82442FFFFAEE201D88EE201D8C0
-:109150008EE201CC3C04001F3C01000100370821D5
-:10916000A03E83C02442FFFFAEE201CC9603000A7A
-:109170003484FFFF8EE201CC006A1821026398213B
-:109180000093202B108000033C02FFF534421000B6
-:1091900002629821ADAB00008EE2724C24420001C5
-:1091A000304207FFAEE2724C8F4202401040000492
-:1091B0000283A0238EE20E1C24420001AEE20E1CAC
-:1091C000A3A000271680FD290000000012800024C3
-:1091D000000000003C01000100370821AC3483C4CA
-:1091E0003C01000100370821AC3383C83C01000179
-:1091F00000370821AC3283CC93A20037104000081E
-:10920000000000003C020001005710218C4283CC7A
-:10921000244200043C01000100370821AC2283CC29
-:109220008EE2724C8F43028024420001304207FFDD
-:1092300014620006000000008EE201C42442000116
-:10924000AEE201C4080034CC8EE201C48EE201BC5F
-:1092500024420001AEE201BC080034CC8EE201BC25
-:1092600097A4001E2484FFFC008018218EE400C017
-:109270008EE500C40000102100A3282100A3302B9C
-:109280000082202100862021AEE400C0AEE500C4AB
-:109290008FAF002C2402000211E2000F29E200032C
-:1092A000144000172402000315E20015000000001E
-:1092B0008EE200D08EE300D4246300012C64000110
-:1092C00000441021AEE200D0AEE300D48EE200D024
-:1092D000080034C68EE300D48EE200D88EE300DCB2
-:1092E000246300012C64000100441021AEE200D888
-:1092F000AEE300DC8EE200D8080034C68EE300DC6A
-:109300008EE200C88EE300CC246300012C640001CF
-:1093100000441021AEE200C8AEE300CC8EE200C8EB
-:109320008EE300CC8F8300E48F8200E010620003A4
-:1093300024630008AF8300E4AF8300E88FBF0070B0
-:109340008FBE006C8FB600688FB500648FB400606C
-:109350008FB3005C8FB200588FB100548FB00050B3
-:1093600003E0000827BD007827BDFFB0AFB500447B
-:109370000000A821AFB0003000008021AFBF004C3A
-:10938000AFB60048AFB40040AFB3003CAFB2003856
-:10939000AFB100348EE204D4241400013042000145
-:1093A0001440002A0000B0218F8700E08F8800C49D
-:1093B0008F8200E800E220232C8210005040000140
-:1093C00024841000000420C2008018218EE400C80C
-:1093D0008EE500CC0000102100A3282100A3302B33
-:1093E0000082202100862021AEE400C8AEE500CC3A
-:1093F0008F8300C83C02000A3442EFFF01032023A0
-:109400000044102B104000033C02000A3442F000DC
-:1094100000822021008018218EE400C08EE500C467
-:109420000000102100A3282100A3302B008220215E
-:1094300000862021AEE400C0AEE500C4AF8800C8BD
-:10944000AF8700E408003850AF8700E83C02000115
-:1094500000571021904283C01040000B0000000014
-:109460003C130001027798218E7383C43C110001E4
-:10947000023788218E3183C83C12000102579021A7
-:10948000080036E88E5283CC8F8300E08F8200E4A0
-:1094900010430007000048218F8200E424090001E6
-:1094A0008C4300008C440004AFA30018AFA4001C40
-:1094B0001520000E3C02FFFF8F8200C4AFA20010F7
-:1094C0008F8200C83C04000124845870AFA20014AD
-:1094D0008F8600E08F8700E43C0500060C00240323
-:1094E00034A5F00008003850000000008FA3001CD5
-:1094F0008FB200183073FFFF2673FFFC0062102448
-:1095000010400058024088213C0200800062102474
-:109510001040000A3C0400408EE2007C244200011E
-:10952000AEE2007C8EE2007C8EE201FC244200016F
-:10953000AEE201FC0800384A8EE201FC3C06000461
-:109540003C0B00013C0A00023C0500103C090008ED
-:109550008EE200803C080020340780002442000195
-:10956000AEE200808EE200808FA2001C004418242E
-:109570001066002100C3102B1440000700000000FB
-:10958000106B001100000000106A001500000000C0
-:1095900008003592000420421065002300A3102B20
-:1095A00014400005000000001069001900000000D0
-:1095B00008003592000420421068002100000000DD
-:1095C00008003592000420428EE20034244200015B
-:1095D000AEE200348EE200340800359200042042EE
-:1095E0008EE201EC24420001AEE201EC8EE201ECDD
-:1095F00008003592000420428EE201F0244200016E
-:10960000AEE201F08EE201F0080035920004204243
-:109610008EE201F424420001AEE201F48EE201F494
-:1096200008003592000420428EE2003024420001FE
-:10963000AEE200308EE20030080035920004204295
-:109640008EE201F824420001AEE201F88EE201F858
-:1096500000042042108702B70000000008003557C0
-:10966000000000003C02000100571021904283B22C
-:1096700014400084240200013C03000100771821FB
-:10968000906383B31462007F3C0201008E430000AC
-:10969000006210241040006F2402FFFF14620005D6
-:1096A00024100001964300043402FFFF106200758D
-:1096B0000000000092E204D8144000720000000094
-:1096C0003C020001005710218C4283B4284200055F
-:1096D00010400020000038213C02000100571021FA
-:1096E0008C4283B418400016000028219626000002
-:1096F000000520C0009710219442777E144600098F
-:10970000009710219443778096220002146200058E
-:10971000009710219443778296220004506200083B
-:10972000240700013C020001005710218C4283B441
-:1097300024A5000100A2102A5440FFEE000520C01D
-:1097400030E200FF1040027B000000000800361EDF
-:1097500000000000024020210C0022FE240500062B
-:109760003044001F000428C002E510219442727C9E
-:10977000304240001440026F00B710219443727EC3
-:10978000962200001462000B000418C000B71021DC
-:10979000944372809622000214620006000418C0EE
-:1097A00000B71021944372829622000410620035A3
-:1097B000000418C002E310219442727C3042800001
-:1097C0001440025C02E310219448727C962700004A
-:1097D000000828C000B710219442737E08003600AC
-:1097E00000003021000420C002E410219443737C67
-:1097F00002E410219448737C3063800014600010F0
-:10980000000828C000B710219442737E1447FFF56A
-:109810000100202100B7102194437380962200029A
-:109820005462FFF1000420C000B7102194437382FA
-:10983000962200045462FFEC000420C024060001BC
-:1098400030C200FF1040023B000000000800361E3E
-:1098500000000000974302029642000014620235A5
-:109860000000000097430204964200021462023195
-:109870000000000097430206964200041462022D85
-:1098800000000000924200003A0300013042000153
-:1098900000431024104000742402FFFF8E230000B8
-:1098A000146200043402FFFF962300041062006F6C
-:1098B000241400023C02000100571021904283B2A0
-:1098C0001440006A2414000392E204D81440006794
-:1098D000000000003C020001005710218C4283B4BC
-:1098E0002842000510400020000038213C02000101
-:1098F000005710218C4283B4184000160000282124
-:1099000096260000000520C0009710219442777E23
-:109910001446000900971021944377809622000294
-:109920001462000500971021944377829622000468
-:1099300050620008240700013C020001005710217A
-:109940008C4283B424A5000100A2102A5440FFEEEB
-:10995000000520C030E200FF14400044241400033E
-:109960000800384A00000000024020210C0022FEBE
-:10997000240500063044001F000428C002E5102121
-:109980009442727C30424000144001EA00B710213A
-:109990009443727E962200001462000B000418C0EB
-:1099A00000B71021944372809622000214620006D0
-:1099B000000418C000B7102194437282962200045C
-:1099C00010620027000418C002E310219442727C48
-:1099D00030428000144001D702E310219448727C89
-:1099E00096270000000828C000B710219442737E1B
-:1099F0000800368500003021000420C002E4102158
-:109A00009443737C02E410219448737C306380009B
-:109A100014600010000828C000B710219442737E23
-:109A20001447FFF50100202100B7102194437380F3
-:109A3000962200025462FFF1000420C000B71021FA
-:109A400094437382962200045462FFEC000420C009
-:109A50002406000130C200FF104001B600000000E3
-:109A60000800369824140003241400018F42026079
-:109A70000053102B10400049000000008F8300E4C9
-:109A80008F8200E01062000324630008AF8300E4CB
-:109A9000AF8300E88EE400C08EE500C402601821A8
-:109AA0000000102100A3282100A3302B00822021D8
-:109AB00000862021AEE400C0AEE500C48EE200586E
-:109AC00024420001AEE200588EE200588EE2007C93
-:109AD00024420001AEE2007C8EE2007C8F8200E036
-:109AE000AFA200108F8200E43C0400012484587867
-:109AF000AFA200148FA600188FA7001C3C0500061B
-:109B00000C00240334A5F0030800385000000000C6
-:109B10008EE25240AFA200108EE252443C0400019B
-:109B200024845884AFA200148EE60E108EE70E181F
-:109B30000C00240334A5F0028EE201C0244200018F
-:109B4000AEE201C08EE200008EE301C02403FFBF3D
-:109B500000431024080037F8AEE200008EE25240C5
-:109B6000AFA200108EE252443C04000124845884C9
-:109B7000AFA200148EE60E108EE70E183C0500060C
-:109B80000C00240334A5F0028EE201C0244200013F
-:109B9000AEE201C0080037F88EE201C096E2046828
-:109BA0000053102B544000013C158000126001311D
-:109BB0003C0C001F358CFFFF8EE2724C8F430280FD
-:109BC00024420001304207FF10620108000000003B
-:109BD00012A00014000000008EE352408EE25244B6
-:109BE0001062000926EE52448EEB52448EE352443A
-:109BF000000211402442524802E280212463000105
-:109C000008003712306800FF92E272481440FFC02B
-:109C10003C0500068EE201E024420001AEE201E0D4
-:109C20008EE201E08EE30E108EE20E181062FFCB82
-:109C300026EE0E188EEB0E180000A8218EE30E18EB
-:109C40000002114024420E2002E280212463000120
-:109C5000306801FF96E2046A30420010104000179D
-:109C6000340281009643000C1462001400000000CE
-:109C70003C02000100571021904283C01440000FA5
-:109C8000000000009642000EA60200168E42000858
-:109C90008E4300048E4400002673FFFCAE42000C8D
-:109CA000AE430008AE4400049602000E26310004C4
-:109CB0002416000134420200A602000E9603000A98
-:109CC000026050210073102B1040000202606821D6
-:109CD000006050212D42003D1040002A0000382134
-:109CE0009623000C2402080054620027AE110018CD
-:109CF0003C02000100571021904283C054400022D2
-:109D0000AE110018262200170182102B10400013FC
-:109D1000000000003C02FFF5005110219042101796
-:109D2000384300062C630001384200112C42000128
-:109D30000062182510600013262200100182102BEB
-:109D40001040000E000000003C07FFF500F1382134
-:109D500094E710100800375E24E7000E92220017E7
-:109D6000384300062C630001384200112C420001E8
-:109D70000062182550600004AE11001896270010EC
-:109D800024E7000EAE1100183C020001005710211C
-:109D9000904283C00002102B14E0000200024EC06B
-:109DA000014038218F83012027623800246600207B
-:109DB00000C2102B50400001276630008F8201281E
-:109DC00010C20004000000008F82012414C20007AA
-:109DD0002402000B8EE201A400004821244200016D
-:109DE000AEE201A4080037BF8EE201A48E04000099
-:109DF0008E050004AC62001801751025004910257D
-:109E0000AC710008A467000EAC62001CAC640000DA
-:109E1000AC6500048EE204C0AC620010AF86012085
-:109E200092E24E2014400038240900018EE24E30A8
-:109E3000000210C02442503802E220218C8300002E
-:109E40002402000714620020000000008EE34E3060
-:109E50008EE24E341062001C000000008C82000470
-:109E600024420001AC8200048EE34E348EE54E3075
-:109E7000240200402463000110620007000000007B
-:109E80008EE24E342442000110A2000500000000C2
-:109E9000080037A90000000014A000050000000021
-:109EA0008F82012824420020AF8201288F8201285E
-:109EB0008C8200042C42001150400013AC80000042
-:109EC000080037BF000000008EE24E30240300403F
-:109ED0002442000150430003000010218EE24E3066
-:109EE00024420001AEE24E308EE24E30000210C03D
-:109EF0002442503802E2202124020007AC820000F4
-:109F000024020001AC820004152000183C05000664
-:109F10008E0200183C04000124845890AFA2001067
-:109F20008E0200008E03000434A5F00902003021E7
-:109F30000C002403AFA3001432C200FF1040002B1A
-:109F4000340281008E4300048E4400088E45000CCC
-:109F5000A642000CAE430000AE440004AE4500082B
-:109F600096020016080037F8A642000E154D000AAA
-:109F7000000000009602000EA613000A34420004FE
-:109F8000A602000E3C01000100370821A02083C07A
-:109F9000080037F6000098219604000A0093102B61
-:109FA00010400002026018210080182124020001E4
-:109FB000A603000A3C01000100370821A02283C04B
-:109FC0009604000A022488210191102B10400003FE
-:109FD0003C02FFF5344210000222882102649823DB
-:109FE0000000A8211660FEF4ADC800001260002138
-:109FF00032C200FF3C01000100370821AC3383C4AA
-:10A000003C01000100370821AC3183C83C0100014C
-:10A010000037082110400008AC3283CC3C0200011C
-:10A02000005710218C4283CC244200043C010001E3
-:10A0300000370821AC2283CC8EE2724C8F43028021
-:10A040002442000114620006000000008EE201C4F8
-:10A0500024420001AEE201C4080038508EE201C47F
-:10A060008EE201BC24420001AEE201BC080038507F
-:10A070008EE201BC97A4001E2484FFFC00801821FE
-:10A080008EE400C08EE500C40000102100A328214A
-:10A0900000A3302B00822021008620212402000210
-:10A0A000AEE400C0AEE500C41282000F2A820003B5
-:10A0B000144000172402000316820015000000005F
-:10A0C0008EE200D08EE300D4246300012C640001F2
-:10A0D00000441021AEE200D0AEE300D48EE200D006
-:10A0E0000800384A8EE300D48EE200D88EE300DC0C
-:10A0F000246300012C64000100441021AEE200D86A
-:10A10000AEE300DC8EE200D80800384A8EE300DCC3
-:10A110008EE200C88EE300CC246300012C640001B1
-:10A1200000441021AEE200C8AEE300CC8EE200C8CD
-:10A130008EE300CC8F8300E48F8200E01062000386
-:10A1400024630008AF8300E4AF8300E88FBF004CB6
-:10A150008FB600488FB500448FB400408FB3003CE9
-:10A160008FB200388FB100348FB0003003E00008A8
-:10A1700027BD005027BDFF90AFB600600000B021A2
-:10A18000AFBF0068AFBE0064AFB5005CAFB40058AD
-:10A19000AFB30054AFB20050AFB1004CAFB0004805
-:10A1A0008EE204D400008821241500013042000111
-:10A1B0001440002AA3A0002F8F8700E08F8800C4DE
-:10A1C0008F8200E800E220232C8210005040000122
-:10A1D00024841000000420C2008018218EE400C8EE
-:10A1E0008EE500CC0000102100A3282100A3302B15
-:10A1F0000082202100862021AEE400C8AEE500CC1C
-:10A200008F8300C83C02000A3442EFFF0103202381
-:10A210000044102B104000033C02000A3442F000BE
-:10A2200000822021008018218EE400C08EE500C449
-:10A230000000102100A3282100A3302B0082202140
-:10A2400000862021AEE400C0AEE500C4AF8800C89F
-:10A25000AF8700E408003C5BAF8700E83C020001E8
-:10A2600000571021904283C01040000B00000000F6
-:10A270003C130001027798218E7383C43C100001C7
-:10A28000021780218E1083C83C12000102579021D2
-:10A2900008003A598E5283CC8F8300E08F8200E40D
-:10A2A00010430007000038218F8200E424070001DA
-:10A2B0008C4300008C440004AFA30018AFA4001C22
-:10A2C00014E0000E3C02FFFF8F8200C4AFA200101A
-:10A2D0008F8200C83C040001248458B4AFA200144B
-:10A2E0008F8600E08F8700E43C0500060C00240305
-:10A2F00034A5F20008003C5B000000008FA3001CA6
-:10A300008FB200183073FFFF2673FFFC0062102429
-:10A3100010400058024080213C020080006210245E
-:10A320001040000A3C0400408EE2007C2442000100
-:10A33000AEE2007C8EE2007C8EE201FC2442000151
-:10A34000AEE201FC08003C558EE201FC3C06000434
-:10A350003C0B00013C0A00023C0500103C090008CF
-:10A360008EE200803C080020340780002442000177
-:10A37000AEE200808EE200808FA2001C0044182410
-:10A380001066002100C3102B1440000700000000DD
-:10A39000106B001100000000106A001500000000A2
-:10A3A00008003916000420421065002300A3102B7A
-:10A3B00014400005000000001069001900000000B2
-:10A3C0000800391600042042106800210000000037
-:10A3D00008003916000420428EE2003424420001B5
-:10A3E000AEE200348EE20034080039160004204248
-:10A3F0008EE201EC24420001AEE201EC8EE201ECBF
-:10A4000008003916000420428EE201F024420001C7
-:10A41000AEE201F08EE201F008003916000420429D
-:10A420008EE201F424420001AEE201F48EE201F476
-:10A4300008003916000420428EE200302442000158
-:10A44000AEE200308EE200300800391600042042EF
-:10A450008EE201F824420001AEE201F88EE201F83A
-:10A46000000420421087033E00000000080038DB93
-:10A47000000000003C02000100571021904283B20E
-:10A4800014400084240200013C03000100771821DD
-:10A49000906383B31462007F3C0201008E4300008E
-:10A4A000006210241040006F2402FFFF14620005B8
-:10A4B00024110001964300043402FFFF106200756E
-:10A4C0000000000092E204D8144000720000000076
-:10A4D0003C020001005710218C4283B42842000541
-:10A4E00010400020000038213C02000100571021DC
-:10A4F0008C4283B418400016000028219606000004
-:10A50000000520C0009710219442777E1446000970
-:10A510000097102194437780960200021462000590
-:10A52000009710219443778296020004506200083D
-:10A53000240700013C020001005710218C4283B423
-:10A5400024A5000100A2102A5440FFEE000520C0FF
-:10A5500030E200FF1040030200000000080039A2B2
-:10A5600000000000024020210C0022FE240500060D
-:10A570003044001F000428C002E510219442727C80
-:10A5800030424000144002F600B710219443727E1E
-:10A59000960200001462000B000418C000B71021DE
-:10A5A000944372809602000214620006000418C0F0
-:10A5B00000B71021944372829602000410620035A5
-:10A5C000000418C002E310219442727C30428000E3
-:10A5D000144002E302E31021944D727C96070000C0
-:10A5E000000D28C000B710219442737E0800398402
-:10A5F00000003021000420C002E410219443737C49
-:10A6000002E41021944D737C3063800014600010CC
-:10A61000000D28C000B710219442737E1447FFF547
-:10A6200001A0202100B710219443738096020002FC
-:10A630005462FFF1000420C000B7102194437382DC
-:10A64000960200045462FFEC000420C024060001BE
-:10A6500030C200FF104002C200000000080039A212
-:10A66000000000009743020296420000146202BC00
-:10A67000000000009743020496420002146202B8F0
-:10A68000000000009743020696420004146202B4E0
-:10A6900000000000924200003A2300013042000115
-:10A6A00000431024104000742402FFFF8E030000BA
-:10A6B000146200043402FFFF960300041062006F6E
-:10A6C000241500023C02000100571021904283B281
-:10A6D0001440006A2415000392E204D81440006775
-:10A6E000000000003C020001005710218C4283B49E
-:10A6F0002842000510400020000038213C020001E3
-:10A70000005710218C4283B4184000160000282105
-:10A7100096060000000520C0009710219442777E25
-:10A720001446000900971021944377809602000296
-:10A73000146200050097102194437782960200046A
-:10A7400050620008240700013C020001005710215C
-:10A750008C4283B424A5000100A2102A5440FFEECD
-:10A76000000520C030E200FF14400044241500031F
-:10A7700008003C5500000000024020210C0022FE91
-:10A78000240500063044001F000428C002E5102103
-:10A790009442727C304240001440027100B7102194
-:10A7A0009443727E960200001462000B000418C0ED
-:10A7B00000B71021944372809602000214620006D2
-:10A7C000000418C000B7102194437282960200045E
-:10A7D00010620027000418C002E310219442727C2A
-:10A7E000304280001440025E02E31021944D727CDE
-:10A7F00096070000000D28C000B710219442737E18
-:10A8000008003A0900003021000420C002E41021B1
-:10A810009443737C02E41021944D737C3063800078
-:10A8200014600010000D28C000B710219442737E00
-:10A830001447FFF501A0202100B710219443738035
-:10A84000960200025462FFF1000420C000B71021FC
-:10A8500094437382960200045462FFEC000420C00B
-:10A860002406000130C200FF1040023D000000003D
-:10A8700008003A1C24150003241500018F420260D1
-:10A880000053102B10400036000000008F8300E4BE
-:10A890008F8200E01062000324630008AF8300E4AD
-:10A8A000AF8300E88EE400C08EE500C4026018218A
-:10A8B0000000102100A3282100A3302B00822021BA
-:10A8C00000862021AEE400C0AEE500C48EE2005850
-:10A8D00024420001AEE200588EE200588EE2007C75
-:10A8E00024420001AEE2007C8EE2007C8F8200E018
-:10A8F000AFA200108F8200E43C040001248458C001
-:10A90000AFA200148FA600188FA7001C3C050006FC
-:10A910000C00240334A5F20308003C5B0000000097
-:10A920008EE25240AFA200108EE252443C0400017D
-:10A93000248458CCAFA200148EE60E108EE70E18B9
-:10A940003C0500060C00240334A5F2028EE201C08F
-:10A9500024420001AEE201C008003C028EE201C0C8
-:10A9600096E204680053102B544000013C1680000E
-:10A97000126001CB3C0E001F35CEFFFF3C0FFFF5F0
-:10A9800035EF1000241E00408EE2724C8F4302808F
-:10A9900024420001304207FF1062019E00000000C7
-:10A9A00012C00012000000008EE352408EE25244BA
-:10A9B0001062000A26F852448EF45244AFB80024C4
-:10A9C0008EE35244000211402442524802E28821A0
-:10A9D0002463000108003A85306D00FF8EE201E03B
-:10A9E00024420001AEE201E08EE201E08EE30E10AF
-:10A9F0008EE20E181062FFCA26F80E188EF40E189A
-:10AA00000000B021AFB800248EE30E180002114000
-:10AA100024420E2002E2882124630001306D01FFF0
-:10AA200096E2046A3042001010400018340281009F
-:10AA30009643000C14620015000000003C02000167
-:10AA400000571021904283C0144000100000000005
-:10AA50009642000EA62200168E4200088E43000485
-:10AA60008E4400002673FFFCAE42000CAE4300088B
-:10AA7000AE4400049622000E2610000424180001A3
-:10AA8000A3B8002F34420200A622000E8E2200003E
-:10AA90008E2300043C04000134843800020030217D
-:10AAA000306A0007020A8023036410210202102B7F
-:10AAB00010400005026A9821020410230362182343
-:10AAC0003C02002000438023266200079623000AF0
-:10AAD0002418FFF80058C824006A18210079102BA8
-:10AAE00010400002032060210060602101801821D5
-:10AAF000246200072418FFF800586024026C102B11
-:10AB000014400004019328230183282308003AC33A
-:10AB100000C3102100D31021004A202301C4102BB0
-:10AB200054400001008F202125420040004C102B92
-:10AB3000144000350000582194C3000C2402080082
-:10AB400054620032AE2600183C020001005710216A
-:10AB5000904283C05440002DAE26001824C2001736
-:10AB600001C2102B10400013000000003C02FFF552
-:10AB70000046102190421017384300062C63000154
-:10AB8000384200112C4200010062182510600014A8
-:10AB900024C2001001C2102B1040000E0000000063
-:10ABA0003C0BFFF501665821956B101008003AF434
-:10ABB0002562000E90C20017384300062C63000186
-:10ABC000384200112C420001006218251060000577
-:10ABD0000160182194CB00102562000E004A582114
-:10ABE00001601821246200072418FFF80058582437
-:10ABF00000C31021004A202301C4102B1040000282
-:10AC000001632823008F2021AE2600183C0200019A
-:10AC100000571021904283C00002102B000216C082
-:10AC200015600002AFA2004401805821308200016B
-:10AC3000104000070000402190880000248400019B
-:10AC400001C4102B1040000224A5FFFF008F20211B
-:10AC500050A0001200081C022CA20002544000095F
-:10AC600024A5FFFF948200002484000201024021F9
-:10AC700001C4102B1040000624A5FFFE08003B2154
-:10AC8000008F20219082000000021200010240216A
-:10AC900014A0FFF22CA2000200081C023102FFFFE8
-:10ACA000006240213108FFFF0140282111400011BE
-:10ACB000020020212CA200025440000924A5FFFF1D
-:10ACC00094820000248400020102402101C4102B60
-:10ACD0001040000624A5FFFE08003B38008F20210D
-:10ACE00090820000000212000102402114A0FFF235
-:10ACF0002CA2000200081C023102FFFF006240216A
-:10AD000000081C023102FFFF8F89012000624021F0
-:10AD100027623800252300200062102B1440000217
-:10AD20003108FFFF276330008F8201281062000482
-:10AD3000000000008F8201241462000701402821D6
-:10AD40008EE201A40000382124420001AEE201A4F9
-:10AD500008003BC98EE201A48E2600008E27000465
-:10AD6000000814003448000BAD300008A52B000E7D
-:10AD7000AD2800188FB8004400002021029610254D
-:10AD800000581025AD22001C00E5102B00E53823EB
-:10AD900000C4302300C23023AD260000AD270004DC
-:10ADA0008EE204C0AD220010AF83012092E24E205B
-:10ADB0001440005F240700012502FFEE2C42000230
-:10ADC00014400003240200111502002400000000BA
-:10ADD0008EE24E30000210C02442503802E22021A0
-:10ADE0008C830000240200121462000F0000000097
-:10ADF0008EE34E308EE24E341062000B00000000F5
-:10AE00008C82000424420001AC8200048EE24E34A5
-:10AE10008EE34E3024420001105E002A0000000044
-:10AE200008003BA8000000008EE24E3024420001E2
-:10AE3000505E0003000010218EE24E3024420001DB
-:10AE4000AEE24E308EE24E30000210C02442503846
-:10AE500002E2202108003BC6240200128EE24E309E
-:10AE6000000210C02442503802E220218C830000EE
-:10AE7000240200071462001F000000008EE34E3021
-:10AE80008EE24E341062001B000000008C82000431
-:10AE900024420001AC8200048EE24E348EE34E3038
-:10AEA00024420001105E0007000000008EE24E34D4
-:10AEB00024420001106200050000000008003BB4BD
-:10AEC0000000000014600005000000008F820128CF
-:10AED00024420020AF8201288F8201288C82000446
-:10AEE0002C42001150400012AC80000008003BC909
-:10AEF000000000008EE24E3024420001505E00034C
-:10AF0000000010218EE24E3024420001AEE24E30AD
-:10AF10008EE24E30000210C02442503802E220215E
-:10AF200024020007AC82000024020001AC8200046D
-:10AF300014E000193C0500063C04000124845890EC
-:10AF40008E22001834A5F209AFA200108E22000054
-:10AF50008E23000402203021016038210C002403DC
-:10AF6000AFA3001493A2002F1040002A34028100E6
-:10AF70008E4300048E4400088E45000CA642000C4F
-:10AF8000AE430000AE440004AE4500089622001611
-:10AF900008003C02A642000E1599000A026A182316
-:10AFA0009622000EA623000A34420004A622000EB8
-:10AFB0003C01000100370821A02083C008003BFFAE
-:10AFC000000098219624000A0083102B54400001B1
-:10AFD0000080182124020001A623000A3C01000180
-:10AFE00000370821A02283C09622000A004A1821B7
-:10AFF0000203802101D0102B54400001020F802158
-:10B00000026398230000B0218FB800241660FE5E12
-:10B01000AF0D000012600022000000003C010001A2
-:10B0200000370821AC3383C43C01000100370821FC
-:10B03000AC3083C83C01000100370821AC3283CC1E
-:10B0400093A2002F10400008000000003C02000105
-:10B05000005710218C4283CC244200043C010001A3
-:10B0600000370821AC2283CC8F4302808EE2724CE1
-:10B0700014620006000000008EE201C424420001B8
-:10B08000AEE201C408003C5B8EE201C48EE201BC6A
-:10B0900024420001AEE201BC08003C5B8EE201BC30
-:10B0A00097A4001E2484FFFC008018218EE400C0B9
-:10B0B0008EE500C40000102100A3282100A3302B3E
-:10B0C000008220210086202124020002AEE400C07C
-:10B0D000AEE500C412A2000F2AA20003144000171C
-:10B0E0002402000316A20015000000008EE200D02A
-:10B0F0008EE300D4246300012C640001004410217D
-:10B10000AEE200D0AEE300D48EE200D008003C55A1
-:10B110008EE300D48EE200D88EE300DC24630001CD
-:10B120002C64000100441021AEE200D8AEE300DC44
-:10B130008EE200D808003C558EE300DC8EE200C8A9
-:10B140008EE300CC246300012C6400010044102134
-:10B15000AEE200C8AEE300CC8EE200C88EE300CCC5
-:10B160008F8300E48F8200E01062000324630008F4
-:10B17000AF8300E4AF8300E88FBF00688FBE006438
-:10B180008FB600608FB5005C8FB400588FB3005449
-:10B190008FB200508FB1004C8FB0004803E0000820
-:10B1A00027BD007027BDFFE0AFBF00188EE30E146F
-:10B1B0008EE20E0C10620074000000008EE30E0C94
-:10B1C0008EE20E1400622023048200012484020017
-:10B1D0008EE30E188EE20E140043102B1440000470
-:10B1E000240202008EE30E1408003C7D0043182365
-:10B1F0008EE20E188EE30E14004310232443FFFF4B
-:10B20000008048210069102A544000010060482154
-:10B210008F8701002762300024E800200102102BF4
-:10B2200050400001276828008F82010811020004A5
-:10B23000000000008F8201041502000700001021A9
-:10B240008EE201A80000202124420001AEE201A804
-:10B2500008003CBF8EE201A88EE40E1400042140D9
-:10B26000008018218EE404608EE5046400A3282188
-:10B2700000A3302B0082202100862021ACE40000B6
-:10B28000ACE500048EE30E1400091140A4E2000EA8
-:10B2900024020002ACE200180003194024630E20CF
-:10B2A00002E31021ACE200088EE20E14ACE2001CB6
-:10B2B0008EE204CCACE20010AF88010092E204EC14
-:10B2C00014400011240400018EE24E2824030040A3
-:10B2D0002442000150430003000010218EE24E285A
-:10B2E00024420001AEE24E288EE24E28000210C039
-:10B2F00024424E3802E2182124020002AC6200000F
-:10B3000024020001AC6200041480000E24030040FB
-:10B310008EE20E14AFA200108EE20E183C0500075C
-:10B32000AFA200148EE60E0C8EE70E103C04000156
-:10B33000248458D40C00240334A5F00108003CDD1B
-:10B34000000000008EE2050024420001504300038B
-:10B35000000010218EE2050024420001AEE205004B
-:10B360008EE205000002108000571021AC4905084C
-:10B370008EE20E1400491021304201FFAEE20E149D
-:10B380008EE30E148EE20E0C146200050000000025
-:10B390008F8200602403FDFF00431024AF82006011
-:10B3A0008FBF001803E0000827BD002027BDFFE085
-:10B3B000AFBF00188EE3523C8EE252381062007428
-:10B3C000000000008EE352388EE2523C00622023DF
-:10B3D00004820001248401008EE352448EE2523C38
-:10B3E0000043102B14400004240201008EE3523C61
-:10B3F00008003CFF004318238EE252448EE3523C87
-:10B40000004310232443FFFF008048210069102AD5
-:10B4100054400001006048218F87010027623000FE
-:10B4200024E800200102102B50400001276828006A
-:10B430008F82010811020004000000008F820104C5
-:10B4400015020007000010218EE201A80000202153
-:10B4500024420001AEE201A808003D418EE201A8AD
-:10B460008EE4523C00042140008018218EE40470D8
-:10B470008EE5047400A3282100A3302B0082202134
-:10B4800000862021ACE40000ACE500048EE3523CD1
-:10B4900000091140A4E2000E24020003ACE20018EF
-:10B4A000000319402463524802E31021ACE2000873
-:10B4B0008EE2523CACE2001C8EE204CCACE2001006
-:10B4C000AF88010092E204EC144000112404000152
-:10B4D0008EE24E2824030040244200015043000322
-:10B4E000000010218EE24E2824420001AEE24E28D8
-:10B4F0008EE24E28000210C024424E3802E218218B
-:10B5000024020003AC62000024020001AC620004CB
-:10B510001480000E240300408EE2523CAFA20010C3
-:10B520008EE252443C050007AFA200148EE652386A
-:10B530008EE752403C040001248458E00C002403B0
-:10B5400034A5F01008003D5F000000008EE2050009
-:10B550002442000150430003000010218EE2050048
-:10B5600024420001AEE205008EE2050000021080D8
-:10B5700000571021AC4905088EE2523C00491021C9
-:10B58000304200FFAEE2523C8EE3523C8EE2523833
-:10B5900014620005000000008F8200602403FEFF9B
-:10B5A00000431024AF8200608FBF001803E0000842
-:10B5B00027BD00208F8201208EE34E348F8201242C
-:10B5C0008F8601282402004024630001506200039A
-:10B5D000000010218EE24E3424420001AEE24E34CF
-:10B5E0008EE24E348EE44E348EE34E30000210C0B4
-:10B5F000244250381483000702E228218F82012858
-:10B6000024420020AF8201288F82012808003D9249
-:10B61000ACA000008EE24E3424030040244200011E
-:10B6200050430003000010218EE24E3424420001FA
-:10B63000000210C02442503802E228218CA20004EB
-:10B640008F8301280002114000621821AF83012876
-:10B65000ACA000008CC200182443FFFE2C62001234
-:10B6600010400008000310803C0100010022082166
-:10B670008C2258F000400008000000002402000165
-:10B68000AEE24E2403E000080000000027BDFFC822
-:10B69000AFBF0030AFB5002CAFB40028AFB300246B
-:10B6A000AFB20020AFB1001CAFB000188F830128EB
-:10B6B0008F820124106202B0000098213C11001F0B
-:10B6C0003631FFFF3C12FFF53652100024150012F0
-:10B6D000241400408F8C01288F82012824420020EE
-:10B6E000AF8201289182001B8F8301282443FFFE33
-:10B6F0002C6200121040029C000310803C010001EB
-:10B70000002208218C225948004000080000000057
-:10B710008F42021830420100104000070000000074
-:10B720009583001695820018006218230003140206
-:10B7300000431021A58200168D82001C3C0380006E
-:10B740003044FFFF004368243C03080000431824F2
-:10B7500011A00004AD84001C0004114008003DD875
-:10B76000244252480004114024420E2002E2582193
-:10B770009562000E3042FFFC10600004A562000ECE
-:10B780009584001608003EC0000000008D69001876
-:10B7900000004021952A000025290002952700007D
-:10B7A0002529000295260000252900029525000084
-:10B7B0002529000295240000252900029523000078
-:10B7C0002529000295220000252900020147502169
-:10B7D000014650210145502101445021014350218F
-:10B7E00001425021000A1C023142FFFF0062502139
-:10B7F000000A1C023142FFFF0062502196E2046AF7
-:10B80000314EFFFF30420002104000440000502142
-:10B81000252200140222102B1040001401201821B0
-:10B820002405000A000020210223102B54400001AF
-:10B8300000721821946200002463000224A5FFFF17
-:10B8400014A0FFF90082202100041C023082FFFFB7
-:10B8500000622021000414023083FFFF0043102106
-:10B860003042FFFF08003E3301425021952A00007C
-:10B8700025290002952800002529000295270000AF
-:10B8800025290002952600002529000295250000A3
-:10B890002529000295230000252900029522000099
-:10B8A0002529000295240000252900020148502185
-:10B8B00001475021014650210145502101435021AB
-:10B8C000014250219522000095230002014450219D
-:10B8D0000142502101435021000A1C023142FFFF66
-:10B8E00000625021000A1C023142FFFF0062502119
-:10B8F0003148FFFF510000013408FFFF8D6200183E
-:10B900009443000C2402080054620005A56800104E
-:10B910009562000E34420002A562000EA568001078
-:10B9200096E2046A000028213042000814400056C4
-:10B93000000030218D630018246200240222102BA5
-:10B9400010400034246900100229102B54400001DB
-:10B950000132482195250000246900140229102B8A
-:10B960001040000224A5FFEC01324821952200007E
-:10B9700030420FFF144000032529000208003E60FA
-:10B98000241300010000982100A030210229102B6F
-:10B990005440000101324821912200012529000272
-:10B9A00000A228210229102B544000010132482115
-:10B9B000252900020229102B5440000101324821A0
-:10B9C000952200002529000200A228210229102B1F
-:10B9D000544000010132482195220000252900022F
-:10B9E00000A228210229102B5440000101324821D5
-:10B9F000952200002529000200A228210229102BEF
-:10BA000054400001013248219522000008003E996F
-:10BA100000A2282194650010946200142469001685
-:10BA200030420FFF1440000324A5FFEC08003E8CB9
-:10BA3000241300010000982100A03021912300016F
-:10BA400025290004952200002529000295240000E4
-:10BA50002529000200A3282100A228219522000008
-:10BA60009523000200A4282100A2282100A3282158
-:10BA700000051C0230A2FFFF0062282100051C0205
-:10BA800030A2FFFF0062282196E2046A30420001E2
-:10BA90001040001E0000202195820016004E202339
-:10BAA0000004140200822021326200FF5040000294
-:10BAB000008620210085202100041402008220211C
-:10BAC0003084FFFF508000013404FFFF8D620018B6
-:10BAD000244300170223102B544000010072182148
-:10BAE00090620000384300112C63000138420006C8
-:10BAF0002C420001006218251060000400000000C4
-:10BB00009562000E34420001A562000E9562000E9F
-:10BB1000240A00023042000410400002A564001212
-:10BB2000240A00048F88012027623800250900209C
-:10BB30000122102B50400001276930008F8201281C
-:10BB400011220004000000008F820124152200074A
-:10BB5000240400208EE201A4000080212442000180
-:10BB6000AEE201A408003F4F8EE201A48EE5724CC4
-:10BB70008EE604908EE70494AD0B0008A504000E39
-:10BB8000AD0A00180005294000A01821000010216E
-:10BB900000E3382100E3202B00C2302100C4302113
-:10BBA000AD060000AD0700048EE2724C004D10257A
-:10BBB000AD02001C8EE204C4AD020010AF8901206A
-:10BBC00092E24E2014400060241000012543FFEE55
-:10BBD0002C630002394200112C420001006218253A
-:10BBE00010600024000000008EE24E30000210C001
-:10BBF0002442503802E220218C8200001455000FAC
-:10BC0000000000008EE34E308EE24E341062000BD6
-:10BC1000000000008C82000424420001AC82000479
-:10BC20008EE24E348EE34E30244200011054002B3D
-:10BC30000000000008003F2E000000008EE24E30A1
-:10BC40002442000150540003000010218EE24E30C7
-:10BC500024420001AEE24E308EE24E30000210C0AF
-:10BC60002442503802E220212402000108003F4E05
-:10BC7000AC9500008EE24E30000210C024425038D5
-:10BC800002E220218C830000240200071462001FBE
-:10BC9000000000008EE34E308EE24E341062001B36
-:10BCA000000000008C82000424420001AC820004E9
-:10BCB0008EE24E348EE34E302442000110540007D1
-:10BCC000000000008EE24E342442000110620005A4
-:10BCD0000000000008003F3A00000000146000056A
-:10BCE000000000008F82012824420020AF8201283A
-:10BCF0008F8201288C8200042C42001150400012D7
-:10BD0000AC80000008003F4F000000008EE24E3083
-:10BD10002442000150540003000010218EE24E30F6
-:10BD200024420001AEE24E308EE24E30000210C0DE
-:10BD30002442503802E2202124020007AC82000095
-:10BD400024020001AC8200041600000D0000000077
-:10BD50008F8201203C04000124845938AFA00014D4
-:10BD6000AFA200108D86001C8F8701243C050008BF
-:10BD70000C00240334A50001080040570000000017
-:10BD80008EE2724C24420001304207FF11A00006EF
-:10BD9000AEE2724C8EE201D02442FFFFAEE201D04F
-:10BDA00008003F6B8EE201D08EE201CC2442FFFFFF
-:10BDB000AEE201CC8EE201CC8EE201D82442FFFF3C
-:10BDC000AEE201D8080040578EE201D88F4202400F
-:10BDD000104000E5000000008EE20E1C244200012D
-:10BDE00008004057AEE20E1C9582001EAD82001C7A
-:10BDF0008F42024010400072000000008EE20E1CD4
-:10BE000024420001AEE20E1C8F4302400043102B7F
-:10BE1000144000D5000000008F8301202762380005
-:10BE20002466002000C2102B50400001276630001D
-:10BE30008F82012810C20004000000008F820124BC
-:10BE400014C20007000000008EE201A4000080215F
-:10BE500024420001AEE201A408003FDA8EE201A410
-:10BE60008EE2724CAC62001C8EE404A88EE504AC39
-:10BE70002462001CAC62000824020008A462000EC8
-:10BE800024020011AC620018AC640000AC65000430
-:10BE90008EE204C4AC620010AF86012092E24E2014
-:10BEA00014400034241000018EE24E30000210C015
-:10BEB0002442503802E220218C8200001455001FD9
-:10BEC000000000008EE34E308EE24E341062001B04
-:10BED000000000008C82000424420001AC820004B7
-:10BEE0008EE24E348EE34E3024420001105400079F
-:10BEF000000000008EE24E34244200011062000572
-:10BF00000000000008003FC60000000014600005AB
-:10BF1000000000008F82012824420020AF82012807
-:10BF20008F8201288C8200042C42001150400011A5
-:10BF3000AC80000008003FDA000000008EE24E30C6
-:10BF40002442000150540003000010218EE24E30C4
-:10BF500024420001AEE24E308EE24E30000210C0AC
-:10BF60002442503802E2202124020001AC95000056
-:10BF7000AC8200045600000B241000018EE2724CCB
-:10BF80003C040001248458A8AFA00014AFA2001004
-:10BF90008EE6724C8F4702803C0500090C0024039A
-:10BFA00034A5F00856000001AEE00E1C8EE20188B8
-:10BFB00024420001AEE20188080040508EE2018870
-:10BFC0008F830120276238002466002000C2102BD6
-:10BFD00050400001276630008F82012810C2000403
-:10BFE000000000008F82012414C20007000000003E
-:10BFF0008EE201A40000802124420001AEE201A4EF
-:10C00000080040448EE201A48EE2724CAC62001C37
-:10C010008EE404A88EE504AC2462001CAC62000827
-:10C0200024020008A462000E24020011AC62001871
-:10C03000AC640000AC6500048EE204C4AC62001085
-:10C04000AF86012092E24E201440003424100001FB
-:10C050008EE24E30000210C02442503802E220210D
-:10C060008C8200001455001F000000008EE34E304B
-:10C070008EE24E341062001B000000008C8200042F
-:10C0800024420001AC8200048EE24E348EE34E3036
-:10C090002442000110540007000000008EE24E34DC
-:10C0A000244200011062000500000000080040303A
-:10C0B0000000000014600005000000008F820128CD
-:10C0C00024420020AF8201288F8201288C82000444
-:10C0D0002C42001150400011AC8000000800404488
-:10C0E000000000008EE24E30244200015054000354
-:10C0F000000010218EE24E3024420001AEE24E30AC
-:10C100008EE24E30000210C02442503802E220215C
-:10C1100024020001AC950000AC8200041600000B64
-:10C12000000000008EE2724C3C040001248458A8F8
-:10C13000AFA00014AFA200108EE6724C8F470280B1
-:10C140003C0500090C00240334A5F0088EE20174BC
-:10C1500024420001AEE20174080040578EE20174EF
-:10C1600024020001AEE24E248F8301288F82012435
-:10C170001462FD58000000008FBF00308FB5002C06
-:10C180008FB400288FB300248FB200208FB1001C21
-:10C190008FB0001803E0000827BD003827BDFFE876
-:10C1A000278402082745020024060008AFBF0014B8
-:10C1B0000C00249AAFB000100000202124100001D0
-:10C1C0002402241FAF900210AF900200AF8002043F
-:10C1D000AF8202148F460248240300043C02004050
-:10C1E0003C010001AC235CC43C010001AC235CC8F1
-:10C1F0003C010001AC205D9C3C010001AC225CC014
-:10C200003C010001AC235CC80C005108240500046B
-:10C210000C004822000000008EE200003C03FEFFFC
-:10C220003463FFFD00431024AEE200003C023C00FA
-:10C23000AF82021C3C01000100370821AC3083AC06
-:10C240008FBF00148FB0001003E0000827BD001856
-:10C2500027BDFFE03C05000834A50400AFBF00186F
-:10C26000AFA00010AFA000148F8602003C040001B4
-:10C27000248459F00C002403000038218EE202804F
-:10C2800024420001AEE202808EE202808F8302002F
-:10C290003C023F00006218248FBF00183C020400DB
-:10C2A00003E0000827BD002027BDFFD8AFBF002056
-:10C2B000AFB1001CAFB000188F9002208EE20214C4
-:10C2C0000000382124420001AEE202148EE2021482
-:10C2D0003C02030002021024104000273C1104001D
-:10C2E0000C00429B000000003C02010002021024EE
-:10C2F00010400007000000008EE2021824420001F6
-:10C30000AEE202188EE20218080040C63C03FDFFB0
-:10C310008EE2021C24420001AEE2021C8EE2021CEC
-:10C320003C03FDFF3463FFFF3C0808FF3508FFFFB7
-:10C330008EE200003C040001248459FC3C05000806
-:10C340000200302100431024AEE200008F82022060
-:10C35000000038213C03030000481024004310254E
-:10C36000AF820220AFA000100C002403AFA0001485
-:10C370000800429600000000021110241040001F27
-:10C380003C0240008F830224240214021462000B3A
-:10C390003C03FDFF3C04000124845A083C050008CE
-:10C3A000AFA00010AFA000148F86022434A5FFFFB9
-:10C3B0000C002403000038213C03FDFF8EE2000046
-:10C3C0003463FFFF02002021004310240C004E5470
-:10C3D000AEE200008EE2022024420001AEE2022022
-:10C3E0008EE202208F8202203C0308FF3463FFFFAD
-:10C3F0000043102408004295005110250202102429
-:10C4000010400142000000008EE2022C2442000194
-:10C41000AEE2022C8EE2022C8F8202203C0308FF47
-:10C420003463FFFF0043102434420004AF82022033
-:10C430008F8300548F8200540800410E2463000251
-:10C440008F820054006210232C4200031440FFFC32
-:10C45000000000008F8600E08F8400E430C20007F7
-:10C4600010400012000000008F8300E42402FFF857
-:10C4700000C210241043000D000000008F82005401
-:10C480008F8300E014C30009244400508F820054BD
-:10C49000008210232C4200511040000400000000D4
-:10C4A0008F8200E010C2FFF9000000008F8202209E
-:10C4B0003C0308FF3463FFFD00431024AF820220D9
-:10C4C0008F8600E030C20007104000032402FFF80E
-:10C4D00000C23024AF8600E08F8300C43C02001FFE
-:10C4E0003442FFFF246800080048102B104000036E
-:10C4F0003C02FFF534421000010240218F8B00C83E
-:10C500008F8501208F8401240800414500006021AF
-:10C51000276238000082102B504000012764300051
-:10C5200010A40010318200FF8C82001838430007ED
-:10C530002C6300013842000B2C42000100621825D8
-:10C540005060FFF3248400208EE20240240C00019E
-:10C5500024420001AEE202408EE202408C8B0008D1
-:10C56000318200FF14400065000000003C02000121
-:10C5700000571021904283C014400060000000006A
-:10C580008F8400E400C41023000218C30462000179
-:10C59000246302008F8900C410600005240200019A
-:10C5A0001062000900000000080041870000000040
-:10C5B0008EE202300120582124420001AEE2023016
-:10C5C000080041BC8EE202308EE202343C05000AD3
-:10C5D00024420001AEE202348C8B000034A5F0004E
-:10C5E0008EE20234012B182300A3102B54400001CB
-:10C5F000006518212C62233F144000400000000019
-:10C600008F8200E824420008AF8200E88F8200E8B1
-:10C610008F8200E40120582124420008AF8200E408
-:10C62000080041BC8F8200E48EE202383C03000A1D
-:10C6300024420001AEE202388C8400003463F00032
-:10C640008EE20238008838230067102B5440000126
-:10C6500000E338213C02000334420D400047102B18
-:10C660001040000300000000080041BC0080582179
-:10C670008F8200E424440008AF8400E48F8400E447
-:10C68000108600183C05000A34A5F0003C0A00039F
-:10C69000354A0D408EE2007C24420001AEE2007C6F
-:10C6A0008C8300008EE2007C0068382300A7102BEA
-:10C6B0005440000100E538210147102B5440000789
-:10C6C000006058218F8200E424440008AF8400E415
-:10C6D0008F8400E41486FFEF00000000148600053C
-:10C6E0000000000001205821AF8600E4080041BC92
-:10C6F000AF8600E8AF8400E4AF8400E88F8200C812
-:10C700003C03000A3463F000004838230067102B14
-:10C710005440000100E338213C02000334420D3F45
-:10C720000047102B544000070000602101683823A7
-:10C730000067102B5440000300E33821080041CF6C
-:10C740003C0200033C02000334420D3F0047102B23
-:10C7500014400016318200FF144000060000000063
-:10C760003C02000100571021904283C01040000F8E
-:10C77000000000008EE2023C3C04FDFF8EE300005E
-:10C780003484FFFF24420001AEE2023C8EE2023C10
-:10C7900024020001006418243C0100010037082134
-:10C7A000A02283B80800422CAEE30000AF8B00C883
-:10C7B0008F8300C88F8200C43C04000A3484F000D8
-:10C7C000006238230087102B5440000100E4382118
-:10C7D0003C02000334420D400047102B2CE30001C3
-:10C7E0000043102510400008000000008F82022046
-:10C7F0003C0308FF3463FFFF004310243C03400068
-:10C8000000431025AF8202208F8600E08F8400E471
-:10C8100010C4002A000000008EE2007C24420001C7
-:10C82000AEE2007C8EE2007C24C2FFF8AF8200E022
-:10C830003C0200018C427E303C0300088F8600E001
-:10C84000004310241040001D0000000010C4001B15
-:10C85000240DFFF83C0A000A354AF0003C0C008029
-:10C86000248500082762280050A2000127651800CF
-:10C870008C8800048C8200008CA900003103FFFF2B
-:10C8800000431021004D102424430010006B102B96
-:10C8900054400001006A1821012B102B5440000164
-:10C8A000012A482110690002010C1025AC82000405
-:10C8B00000A0202114C4FFEB248500088F820220F1
-:10C8C0003C0308FF3463FFFF00431024344200029E
-:10C8D000AF8202208F8300548F82005408004237B9
-:10C8E000246300018F820054006210232C42000256
-:10C8F0001440FFFC000000008F8202203C0308FF70
-:10C900003463FFFB00431024AF8202200601005570
-:10C91000000000008EE2022824420001AEE202285C
-:10C920008EE202288F8202203C0308FF3463FFFF5F
-:10C930000043102434420004AF8202208F8300544D
-:10C940008F82005408004251246300028F820054F9
-:10C95000006210232C4200031440FFFC0000000082
-:10C960008F8600E030C20007104000120000000077
-:10C970008F8300E42402FFF800C210241043000D4E
-:10C98000000000008F8200548F8300E014C3000970
-:10C99000244400328F820054008210232C42003342
-:10C9A00010400004000000008F8200E010C2FFF978
-:10C9B000000000008F8202203C0308FF3463FFFD6B
-:10C9C00000431024AF8202208F8600E030C20007AF
-:10C9D000104000032402FFF800C23024AF8600E0BC
-:10C9E000240301F58F8200E800673823000718C090
-:10C9F00000431021AF8200E88F8200E8AF8200E49C
-:10CA00008EE2007C3C0408FF3484FFFF00471021C5
-:10CA1000AEE2007C8F8202203C038000346300027F
-:10CA20000044102400431025AF8202208F8300545D
-:10CA30008F8200540800428D246300018F820054CD
-:10CA4000006210232C4200021440FFFC0000000092
-:10CA50008F8202203C0308FF3463FFFB0043102455
-:10CA6000AF8202208FBF00208FB1001C8FB0001852
-:10CA700003E0000827BD00283C0200018C425CD87E
-:10CA800027BDFFD810400012AFBF00203C040001BA
-:10CA900024845A143C050008240200013C010001D2
-:10CAA00000370821AC2283ACAFA00010AFA0001467
-:10CAB0008F86022034A504983C010001AC205CD88C
-:10CAC0003C010001AC225CCC0C00240300003821A6
-:10CAD0008F4202683C037FFF3463FFFF0043102452
-:10CAE000AF4202688EE204D08EE404D42403FFFE39
-:10CAF00000431024308400021080011EAEE204D0F6
-:10CB00008EE204D42403FFFD00431024AEE204D4DB
-:10CB10008F8200443C03060034632000344200202E
-:10CB2000AF820044AFA300188EE206088F430228AC
-:10CB300024420001304A00FF514300FEAFA0001024
-:10CB40008EE20608000210C0005710218FA30018C3
-:10CB50008FA4001CAC43060CAC4406108F83005419
-:10CB60008F82005424690032012210232C420033AA
-:10CB70001040006A0000582124180008240F000DFE
-:10CB8000240D0007240C0040240E00018F87012093
-:10CB90002762380024E800200102102B50400001D9
-:10CBA000276830008F820128110200040000000075
-:10CBB0008F82012415020007000010218EE201A4DB
-:10CBC0000000282124420001AEE201A40800433DF8
-:10CBD0008EE201A48EE40608000420C00080182123
-:10CBE0008EE404308EE5043400A3282100A3302B0A
-:10CBF0000082202100862021ACE40000ACE5000486
-:10CC00008EE20608A4F8000EACEF0018ACEA001C97
-:10CC1000000210C02442060C02E21021ACE200081F
-:10CC20008EE204C4ACE20010AF88012092E24E20F4
-:10CC300014400033240500018EE24E30000210C083
-:10CC40002442503802E220218C820000144D001F43
-:10CC5000000000008EE34E308EE24E341062001B66
-:10CC6000000000008C82000424420001AC82000419
-:10CC70008EE24E348EE34E3024420001104C000709
-:10CC8000000000008EE24E342442000110620005D4
-:10CC9000000000000800432A0000000014600005A6
-:10CCA000000000008F82012824420020AF8201286A
-:10CCB0008F8201288C8200042C4200115040001009
-:10CCC000AC8000000800433D000000008EE24E30C2
-:10CCD00024420001504C0003000010218EE24E302F
-:10CCE00024420001AEE24E308EE24E30000210C00F
-:10CCF0002442503802E22021AC8D0000AC8E0004AA
-:10CD000054A00006240B00018F820054012210233E
-:10CD10002C4200331440FF9D00000000316300FFEF
-:10CD20002402000154620079AFA00010AEEA0608A8
-:10CD30008F8300548F820054246900320122102313
-:10CD40002C4200331040006100005821240D0008DF
-:10CD5000240C00112408001224070040240A0001BA
-:10CD60008F830120276238002466002000C2102B28
-:10CD700050400001276630008F82012810C2000455
-:10CD8000000000008F82012414C200070000000090
-:10CD90008EE201A40000282124420001AEE201A499
-:10CDA000080043A98EE201A48EE20608AC62001CD2
-:10CDB0008EE404A08EE504A42462001CAC6200088A
-:10CDC000A46D000EAC6C0018AC640000AC650004EF
-:10CDD0008EE204C4AC620010AF86012092E24E20C5
-:10CDE00014400033240500018EE24E30000210C0D2
-:10CDF0002442503802E220218C8200001448001F97
-:10CE0000000000008EE34E308EE24E341062001BB4
-:10CE1000000000008C82000424420001AC82000467
-:10CE20008EE24E348EE34E3024420001104700075C
-:10CE3000000000008EE24E34244200011062000522
-:10CE40000000000008004396000000001460000588
-:10CE5000000000008F82012824420020AF820128B8
-:10CE60008F8201288C8200042C4200115040001057
-:10CE7000AC800000080043A9000000008EE24E30A4
-:10CE80002442000150470003000010218EE24E3082
-:10CE900024420001AEE24E308EE24E30000210C05D
-:10CEA0002442503802E22021AC880000AC8A000401
-:10CEB00054A00006240B00018F820054012210238D
-:10CEC0002C4200331440FFA600000000316300FF35
-:10CED0002402000154620003AFA00010080043D6F2
-:10CEE000000000003C04000124845A20AFA000147C
-:10CEF0008F8601208F8701243C0500090C00240344
-:10CF000034A5F011080043D6000000003C040001E5
-:10CF100024845A2CAFA000148F8601208F8701240F
-:10CF20003C0500090C00240334A5F010080043D68A
-:10CF3000000000003C04000124845A38AFA0001413
-:10CF40008EE606088F4702283C0500090C002403E2
-:10CF500034A5F00F8EE201AC24420001AEE201AC38
-:10CF60008EE201AC8EE2015C24420001AEE2015C83
-:10CF70008EE2015C8FBF002003E0000827BD00287F
-:10CF80003C0200018C425CD827BDFFE01440000D3C
-:10CF9000AFBF00183C04000124845A443C0500083B
-:10CFA000AFA00010AFA000148F86022034A5049912
-:10CFB000240200013C010001AC225CD80C002403D7
-:10CFC000000038218EE204D03C03000100771821D4
-:10CFD000946383B23442000110600007AEE204D0D3
-:10CFE0008F8202203C0308FF3463FFFF00431024BC
-:10CFF00034420008AF820220000020210C0052A21F
-:10D0000024050004AF4202688FBF001803E0000847
-:10D0100027BD00200000000000000000000000000C
-:10D020000000000000000000000000000000000000
-:10D0300000000000000000000000000000000000F0
-:10D0400000000000000000000000000000000000E0
-:10D0500000000000000000000000000000000000D0
-:10D0600000000000000000000000000000000000C0
-:10D0700000000000000000000000000000000000B0
-:10D0800000000000000000000000000000000000A0
-:10D090000000000000000000000000000000000090
-:10D0A0000000000000000000000000000000000080
-:10D0B0000000000000000000000000000000000070
-:10D0C0000000000000000000000000000000000060
-:10D0D0000000000000000000000000000000000050
-:10D0E0000000000000000000000000000000000040
-:10D0F0000000000000000000000000000000000030
-:10D100000000000000000000000000003C120001D0
-:10D11000265212003C1400018E945C503C10000119
-:10D12000261011203C15C00036B500608E8A000024
-:10D130008EB30000026A400B0248000A0200F82188
-:10D14000000000000000000D0000000000000000D2
-:10D1500000000000000000000000000000000000CF
-:10D1600000000000000000000000000000000000BF
-:10D1700000000000000000000000000000000000AF
-:10D18000000000000000000000000000000000009F
-:10D19000000000000000000000000000000000008F
-:10D1A000000000000000000000000000000000007F
-:10D1B000000000000000000000000000000000006F
-:10D1C000000000000000000000000000000000005F
-:10D1D000000000000000000000000000000000004F
-:10D1E000000000000000000000000000000000003F
-:10D1F000000000000000000000000000000000002F
-:10D20000000000000000000000000000080014D62C
-:10D2100000000000080014D83C0A0001080014D8DF
-:10D220003C0A0002080014D800000000080024A6F0
-:10D2300000000000080014D83C0A0003080014D8BD
-:10D240003C0A000408002F8C00000000080014D8DD
-:10D250003C0A000508003CE80000000008003C66AD
-:10D2600000000000080014D83C0A0006080014D88A
-:10D270003C0A0007080014D800000000080014D879
-:10D2800000000000080014D80000000008002A7503
-:10D2900000000000080014D83C0A000B080014D855
-:10D2A0003C0A000C080014D83C0A000D0800237A40
-:10D2B000000000000800233900000000080014D816
-:10D2C0003C0A000E08001B3C00000000080024A4DB
-:10D2D00000000000080014D83C0A000F080040A716
-:10D2E000000000000800409100000000080014D871
-:10D2F0003C0A0010080014EE00000000080014D8DA
-:10D300003C0A0011080014D83C0A0012080014D886
-:10D310003C0A0013000000000000000000000000B4
-:10D3200000000000000000000000000000000000FD
-:10D3300000000000000000000000000000000000ED
-:10D3400000000000000000000000000000000000DD
-:10D3500000000000000000000000000000000000CD
-:10D3600000000000000000000000000000000000BD
-:10D3700000000000000000000000000000000000AD
-:10D38000000000000000000000000000000000009D
-:10D39000000000000000000000000000000000008D
-:10D3A000000000000000000000000000000000007D
-:10D3B000000000000000000000000000000000006D
-:10D3C000000000000000000000000000000000005D
-:10D3D000000000000000000000000000000000004D
-:10D3E000000000000000000000000000000000003D
-:10D3F000000000000000000000000000000000002D
-:10D400000000000000000000000000003C030001DC
-:10D4100034633800240500802404001F2406FFFF25
-:10D4200024020001AF80021CAF820200AF82022002
-:10D4300003631021AF8200C003631021AF8200C4D8
-:10D4400003631021AF8200C827623800AF8200D08A
-:10D4500027623800AF8200D427623800AF8200D83C
-:10D4600027621800AF8200E027621800AF8200E454
-:10D4700027621800AF8200E827621000AF8200F038
-:10D4800027621000AF8200F427621000AF8200F81C
-:10D49000ACA000002484FFFF1486FFFD24A5000437
-:10D4A0008F8300403C02F000006218243C025000D0
-:10D4B0001062000C0043102B144000063C02600078
-:10D4C0003C024000106200082402080008004539B0
-:10D4D0000000000010620004240208000800453922
-:10D4E00000000000240207003C010001AC225CDCCB
-:10D4F00003E000080000000027BDFFD8AFBF0024F4
-:10D50000AFB000208F8300548F8200543C01000193
-:10D51000AC205CC408004545246300648F8200543D
-:10D52000006210232C4200651440FFFC0000000044
-:10D530000C004D71000000002404000100002821AF
-:10D5400027A60018340280000C00498EA7A20018FC
-:10D550008F8300548F820054080045562463006472
-:10D560008F820054006210232C4200651440FFFC9F
-:10D5700024040001240500010C00494C27A60018D2
-:10D580008F8300548F820054080045622463006436
-:10D590008F820054006210232C4200651440FFFC6F
-:10D5A00024040001240500010C00494C27A60018A2
-:10D5B0008F8300548F8200540800456E24630064FA
-:10D5C0008F820054006210232C4200651440FFFC3F
-:10D5D000240400013C06000124C65DA00C00494C57
-:10D5E000240500028F8300548F8200540800457B7D
-:10D5F000246300648F820054006210232C42006573
-:10D600001440FFFC24040001240500033C10000129
-:10D6100026105DA20C00494C0200302197A600188C
-:10D620003C07000194E75DA03C04000124845AB04B
-:10D63000AFA00014960200003C05000D34A50100C7
-:10D640000C002403AFA2001097A200181040004C59
-:10D6500024036040960200003042FFF01443000AA9
-:10D66000240200203C03000194635DA05462000981
-:10D6700024027830240200033C010001AC225CC487
-:10D68000080045AC240200053C03000194635DA042
-:10D69000240278301462000F240300103C020001C1
-:10D6A00094425DA23042FFF01443000A24020003BA
-:10D6B0003C010001AC225CC4240200063C010001D4
-:10D6C000AC225DB03C010001AC225DBC080045E627
-:10D6D0003C09FFF03C0200018C425CC43C030001A9
-:10D6E00094635DA0344200013C010001AC225CC4A3
-:10D6F000240200151462000F000000003C0200012B
-:10D7000094425DA23042FFF03843F4202C630001C4
-:10D710003842F4302C4200010062182510600005E8
-:10D72000240200033C010001AC225DBC080045E678
-:10D730003C09FFF03C03000194635DA024027810D3
-:10D740001462000B240200023C02000194425DA21C
-:10D750003042FFF0144000062402000224020004BC
-:10D760003C010001AC225DBC080045E63C09FFF02D
-:10D770003C010001AC225DBC080045E63C09FFF01D
-:10D780003C0200018C425CC4240300013C01000106
-:10D79000AC235DBC344200043C010001AC225CC4FB
-:10D7A0003C09FFF03529BDC03C0600018CC65CC4B5
-:10D7B0003C04000124845AB0240200013C01000111
-:10D7C000AC225CCC8F8200543C0700018CE75DBC2E
-:10D7D0003C03000194635DA03C08000195085DA234
-:10D7E0003C05000D34A501003C010001AC205CC8E3
-:10D7F000004910213C010001AC225DACAFA3001038
-:10D800000C002403AFA800148FBF00248FB00020A9
-:10D8100003E0000827BD002827BDFFE83C05000104
-:10D820008CA55CC8240600042402000114A2001484
-:10D83000AFBF00103C0200018C427E3C30428000B1
-:10D84000104000053C04000F3C0300018C635DBCEC
-:10D8500008004617348442403C0400043C030001A5
-:10D860008C635DBC348493E02402000514620016CE
-:10D87000000000003C04003D0800462F34840900ED
-:10D880003C0200018C427E3830428000104000058E
-:10D890003C04001E3C0300018C635DBC0800462A6A
-:10D8A000348484803C04000F3C0300018C635DBC25
-:10D8B000348442402402000514620003000000008A
-:10D8C0003C04007A348412003C0200018C425DACBE
-:10D8D0008F83005400441021004310230044102B78
-:10D8E00014400037000000003C0200018C425CD074
-:10D8F00014400033000000003C01000110C000256E
-:10D90000AC205CE03C0900018D295CC424070001C7
-:10D910003C0440003C08000125087E3C250AFFFC31
-:10D920000005284214A0000224C6FFFF24050008B9
-:10D9300000A91024104000100000000014A70008E7
-:10D94000000000008D020000004410241040000A76
-:10D95000000000003C0100010800465BAC255CE0D3
-:10D960008D4200000044102410400003000000001D
-:10D970003C010001AC275CE03C0200018C425CE011
-:10D980000006182B2C420001004310245440FFE5F0
-:10D99000000528428F8200543C0300018C635CE048
-:10D9A0003C010001AC225DAC1060002A24020001A1
-:10D9B0003C010001AC255CC83C010001AC225CCC00
-:10D9C0003C0200018C425CE010400022000000009C
-:10D9D0003C0200018C425CCC1040000A2402000191
-:10D9E0003C010001AC205CCC3C0100010037082167
-:10D9F000AC2283AC3C010001AC205D4C3C01000139
-:10DA0000AC225D043C030001007718218C6383ACD9
-:10DA10002402000810620005240200010C00469553
-:10DA20000000000008004692000000003C030001D6
-:10DA30008C635CC8106200072402000E3C030001E6
-:10DA40008C637DD010620003000000000C004E5477
-:10DA50008F8402208FBF001003E0000827BD00184C
-:10DA600027BDFFE03C02FDFFAFBF00188EE30000C2
-:10DA70003C0500018CA55CC83C0400018C845CF072
-:10DA80003442FFFF0062182414A40008AEE3000033
-:10DA90003C030001007718218C6383AC3C02000139
-:10DAA0008C425CF410620008000000003C0200019F
-:10DAB000005710218C4283AC3C010001AC255CF086
-:10DAC0003C010001AC225CF43C0300018C635CC8A7
-:10DAD00024020002106201692C620003104000055C
-:10DAE0002402000110620008000000000800481C29
-:10DAF0000000000024020004106200B124020001B2
-:10DB00000800481D000000003C02000100571021E1
-:10DB10008C4283AC2443FFFF2C6200081040015A62
-:10DB2000000310803C010001002208218C225AC809
-:10DB300000400008000000003C0300018C635DBC55
-:10DB40002402000514620014000000003C020001E1
-:10DB50008C425CD41040000A240200030C004822CE
-:10DB600000000000240200023C01000100370821EF
-:10DB7000AC2283AC3C010001080046E0AC205CD440
-:10DB80003C01000100370821AC2283AC3C010001BC
-:10DB90000800481FAC205C600C0048220000000018
-:10DBA0003C0200018C425CD43C010001AC205C6072
-:10DBB000104000DD240200023C0100010037082172
-:10DBC000AC2283AC3C0100010800481FAC205CD4AF
-:10DBD0003C0300018C635DBC240200051462000359
-:10DBE000240200013C010001AC225D000C0049CF81
-:10DBF000000000003C0300018C635D000800478EBC
-:10DC0000240200113C0500018CA55CC83C06000103
-:10DC10008CC67E3C0C005108000020212402000527
-:10DC20003C010001AC205CD43C010001003708211C
-:10DC30000800481FAC2283AC3C04000124845ABC79
-:10DC40003C05000F34A50100000030210000382100
-:10DC5000AFA000100C002403AFA000140800481F60
-:10DC6000000000008F8202203C03F70000431025D3
-:10DC7000080047B7AF8202208F8202203C030004D5
-:10DC800000431024144000A9240200078F8300548D
-:10DC90003C0200018C425DA42463D8F000431023B1
-:10DCA0002C422710144000F8240200010800481DEF
-:10DCB000000000003C0500018CA55CC80C0052A2CD
-:10DCC000000020210C005386000020213C030001AD
-:10DCD0008C637E34046100EA240200013C020008E7
-:10DCE0000062102410400006000000008F82021421
-:10DCF0003C03FFFF00431024080047413442251F26
-:10DD00008F8202143C03FFFF004310243442241F7F
-:10DD1000AF8202148EE200003C0302000043102593
-:10DD2000AEE200008F8202202403FFFB0043102498
-:10DD3000AF8202208F82022034420002AF82022092
-:10DD4000240200083C01000100370821AC2283AC0A
-:10DD50008F8202203C03000400431024144000057D
-:10DD6000000000008F8202203C03F70000431025D2
-:10DD7000AF8202203C0300018C635DBC24020005DD
-:10DD80001462000A000000003C02000194425DA2FF
-:10DD900024429FBC2C4200041040000424040018BC
-:10DDA000240500020C004D93240600200C0043DDE6
-:10DDB000000000003C0100010800481FAC205D503D
-:10DDC0003C020001005710218C4283AC2443FFFF2A
-:10DDD0002C620008104000AC000310803C010001E0
-:10DDE000002208218C225AE80040000800000000B0
-:10DDF0000C00429B000000003C010001AC205CCC08
-:10DE0000AF8002043C0100010C004822AC207E20BF
-:10DE1000240200013C010001AC225CE42402000267
-:10DE20003C010001003708210800481FAC2283ACE8
-:10DE30000C00489F000000003C0300018C635CE480
-:10DE40002402000914620090240200033C01000136
-:10DE5000003708210800481FAC2283AC3C020001B7
-:10DE60008C427E3830424000104000050000000027
-:10DE70008F8200443C03FFFF0800479F34637FFF0D
-:10DE80008F8200442403FF7F00431024AF820044AC
-:10DE90008F830054080047B9240200048F83005484
-:10DEA0003C0200018C425DA42463D8F0004310239F
-:10DEB0002C42271014400074240200053C0100018C
-:10DEC000003708210800481FAC2283AC8F82022053
-:10DED0003C03F70000431025AF820220AF8002040C
-:10DEE0003C010001AC207E208F83005424020006F8
-:10DEF0003C01000100370821AC2283AC3C01000149
-:10DF00000800481FAC235DA48F8300543C0200012D
-:10DF10008C425DA42463FFF6004310232C42000AC8
-:10DF20001440005900000000240200073C010001D9
-:10DF3000003708210800481FAC2283AC8F820220E2
-:10DF40003C04F70000441025AF8202208F8202209B
-:10DF50003C03030000431024144000050000182176
-:10DF60008F8202202403000100441025AF8202208A
-:10DF700010600043240200018F8202143C03FFFF63
-:10DF80003C0400018C845D98004310243442251F1A
-:10DF9000AF820214240200083C010001003708216E
-:10DFA0001080000BAC2283AC3C0200018C425D74FB
-:10DFB00014400007240200013C010001AC227DD086
-:10DFC0000C004E548F8402200800480C0000000012
-:10DFD0008F8202203C0300080043102414400017E5
-:10DFE0002402000E3C010001AC227DD08EE2000034
-:10DFF000000020213C030200004310250C00538642
-:10E00000AEE200008F8202202403FFFB00431024B5
-:10E01000AF8202208F820220344200020C0043DDD6
-:10E02000AF8202203C0500018CA55CC80C0052A206
-:10E03000000020210800481F000000003C020001F1
-:10E040008C425D7410400010000000003C02000192
-:10E050008C425D702442FFFF3C010001AC225D70E8
-:10E0600014400009240200023C010001AC205D7450
-:10E070003C0100010800481FAC225D702402000131
-:10E080003C010001AC225CCC8FBF001803E000080B
-:10E0900027BD00208F8202008F8202208F82022003
-:10E0A00034420004AF8202208F8202003C0600014D
-:10E0B0008CC65CC834420004AF8202002402000215
-:10E0C00010C2003A2CC200031040000524020001D7
-:10E0D00010C20008000000000800486800000000AE
-:10E0E0002402000410C20013240200010800486842
-:10E0F000000000003C0300018C635CB83C0200019E
-:10E100008C425CC03C0400018C845CDC3C0500015A
-:10E110008CA55CBCAF860200AF860220346300226F
-:10E1200000441025004510253442000208004867CD
-:10E13000AF8302003C0300018C635D98AF82020054
-:10E1400010600009AF8202203C0200018C425D7425
-:10E15000144000053C033F003C0200018C425CB0CF
-:10E160000800485B346300E03C0200018C425CB074
-:10E170003C033F00346300E200431025AF820200FD
-:10E180003C0300018C635CB43C04F7003C020001DA
-:10E190008C425CC03C0500018CA55CDC0064182549
-:10E1A0000043102500451025AF82022003E000083F
-:10E1B000000000008F8202203C0300018C635CC8D9
-:10E1C00034420004AF820220240200011062000FDA
-:10E1D000000000008F8300548F82005424630002EB
-:10E1E000006210232C4200031040001100000000C8
-:10E1F0008F820054006210232C4200031040000C58
-:10E200000000000008004879000000008F830054DF
-:10E210008F82005408004885246300078F820054D1
-:10E22000006210232C4200081440FFFC0000000094
-:10E230008F8400E0308200071040000D00000000D5
-:10E240008F8200548F8300E014830009244500323C
-:10E250008F82005400A210232C420033104000048F
-:10E26000000000008F8200E01082FFF90000000033
-:10E270008F8202202403FFFD00431024AF8202207E
-:10E2800003E00008000000003C0300018C635CE434
-:10E290003C0200018C425CE8506200042463FFFFF2
-:10E2A0003C010001AC235CE82463FFFF2C62000901
-:10E2B0001040009D000310803C0100010022082155
-:10E2C0008C225B0800400008000000008F820044A0
-:10E2D00034428080AF8200448F8300540800493864
-:10E2E000240200028F8300543C0200018C425DA88E
-:10E2F0002463D8F0004310232C4227101440008AD6
-:10E300002402000308004945000000008F820044F9
-:10E310003C03FFFF34637FFF00431024AF820044BF
-:10E320008F83005408004938240200048F8300546E
-:10E330003C0200018C425DA82463FFF600431023D9
-:10E340002C42000A144000782402000508004945C8
-:10E35000000000008F8202203C03F70000431025DC
-:10E36000AF8202208F8202202403FFFB004310248F
-:10E37000AF8202208F82022034420002AF8202204C
-:10E380003C023F00344200E0AF8202008F82020074
-:10E390002403FFFD00431024AF8202002404000187
-:10E3A0003405FFFFAF8402048F8300548F82005432
-:10E3B000080048EC246300018F820054006210239F
-:10E3C0002C4200021440FFFC000000008F82022457
-:10E3D0000004204000A4102B1040FFF200000000B9
-:10E3E0008F8202203C03F70000431025AF820220F9
-:10E3F0008F8202143C03FFFF004310243442251F88
-:10E40000AF8202148F8202202403FFFB00431024FA
-:10E41000AF8202208F8202203C04F700348400087F
-:10E4200034420002AF8202208F8202203C033F0070
-:10E43000346300E200441025AF820220AF83020063
-:10E440008F8400F0276217F81482000224850008E8
-:10E45000276510008F8200F410A200073C038000A3
-:10E46000346300403C02000124425C70AC82000036
-:10E47000AC830004AF8500F08F8300540800493856
-:10E48000240200068F8300543C0200018C425DA8E8
-:10E490002463FFF6004310232C42000A144000229C
-:10E4A0002402000708004945000000008F8200E0B8
-:10E4B000AF8200E48F8200E0AF8200E88F8202200A
-:10E4C00034420004AF8202208F8202202403FFF72F
-:10E4D00000431024AF8202208F82004434428080A7
-:10E4E000AF8200448F830054240200083C010001E5
-:10E4F000AC225CE43C01000108004947AC235DA864
-:10E500008F8300543C0200018C425DA82463D8F044
-:10E51000004310232C42271014400003240200095A
-:10E520003C010001AC225CE403E0000800000000B4
-:10E5300000000000000000000000000027BDFFD820
-:10E54000AFB2001800809021AFB3001C00A098214A
-:10E55000AFB1001400C08821AFB0001000008021CE
-:10E56000AFBF0020A62000000C004D4B240400018A
-:10E57000261000012E0200201440FFFB00000000C6
-:10E580000C004D4B000020210C004D4B24040001D9
-:10E590000C004D4B240400010C004D4B00002021C9
-:10E5A000241000100250102410400002000020210E
-:10E5B000240400010C004D4B001080421600FFFAAD
-:10E5C0000250102424100010027010241040000289
-:10E5D00000002021240400010C004D4B001080425B
-:10E5E0001600FFFA027010240C004D7134108000E8
-:10E5F0000C004D71000000000C004D2B00000000CD
-:10E600005040000500108042962200000050102566
-:10E61000A6220000001080421600FFF70000000054
-:10E620000C004D71000000008FBF00208FB3001C54
-:10E630008FB200188FB100148FB0001003E00008F3
-:10E6400027BD002827BDFFD8AFB100140080882166
-:10E65000AFB2001800A09021AFB3001C00C09821F9
-:10E66000AFB0001000008021AFBF00200C004D4B68
-:10E6700024040001261000012E0200201440FFFB9C
-:10E68000000000000C004D4B000020210C004D4B01
-:10E69000240400010C004D4B000020210C004D4BC8
-:10E6A0002404000124100010023010241040000245
-:10E6B00000002021240400010C004D4B001080427A
-:10E6C0001600FFFA0230102424100010025010240B
-:10E6D0001040000200002021240400010C004D4BDA
-:10E6E000001080421600FFFA025010240C004D4B1F
-:10E6F000240400010C004D4B000020213410800048
-:10E7000096620000005010241040000200002021FA
-:10E71000240400010C004D4B001080421600FFF84D
-:10E72000000000000C004D71000000008FBF0020B1
-:10E730008FB3001C8FB200188FB100148FB000107F
-:10E7400003E0000827BD00283C0300018C635D0046
-:10E750003C0200018C425D4827BDFFD8AFBF0020BE
-:10E76000AFB1001C10620003AFB000183C01000103
-:10E77000AC235D482463FFFF2C6200131040034963
-:10E78000000310803C010001002208218C225B3034
-:10E7900000400008000000000C004D7100008021C6
-:10E7A00034028000A7A2001027B100100C004D4BCE
-:10E7B00024040001261000012E0200201440FFFB5B
-:10E7C000000000000C004D4B000020210C004D4BC0
-:10E7D000240400010C004D4B000020210C004D4B87
-:10E7E0002404000124100010320200011040000235
-:10E7F00000002021240400010C004D4B0010804239
-:10E800001600FFFA32020001241000100C004D4BDC
-:10E8100000002021001080421600FFFC00000000D4
-:10E820000C004D4B240400010C004D4B0000202136
-:10E830003410800096220000005010241040000286
-:10E8400000002021240400010C004D4B00108042E8
-:10E850001600FFF8000000000C004D7100000000E1
-:10E8600008004D242402000227B10010A7A00010C8
-:10E87000000080210C004D4B2404000126100001F3
-:10E880002E0200201440FFFB000000000C004D4B46
-:10E89000000020210C004D4B240400010C004D4BC6
-:10E8A000240400010C004D4B000020212410001016
-:10E8B0003202000110400002000020212404000167
-:10E8C0000C004D4B001080421600FFFA320200018E
-:10E8D000241000100C004D4B00002021001080423D
-:10E8E0001600FFFC000000000C004D713410800089
-:10E8F0000C004D71000000000C004D2B00000000CA
-:10E900005040000500108042962200000050102563
-:10E91000A6220000001080421600FFF70000000051
-:10E920000C004D710000000097A2001030428000E2
-:10E93000144002DC2402000308004D240000000003
-:10E9400024021200A7A2001027B1001000008021AD
-:10E950000C004D4B24040001261000012E02002063
-:10E960001440FFFB000000000C004D4B0000202174
-:10E970000C004D4B240400010C004D4B00002021E5
-:10E980000C004D4B24040001241000103202000141
-:10E990001040000200002021240400010C004D4B17
-:10E9A000001080421600FFFA32020001241000100D
-:10E9B0000C004D4B00002021001080421600FFFC8F
-:10E9C000000000000C004D4B240400010C004D4BD6
-:10E9D00000002021341080009622000000501024F6
-:10E9E0001040000200002021240400010C004D4BC7
-:10E9F000001080421600FFF8000000000C004D716E
-:10EA0000000000008F83005408004D16240200040B
-:10EA10008F8300543C0200018C425DB82463FF9C4C
-:10EA2000004310232C4200641440029E2402000282
-:10EA30003C0300018C635DBC106202972C620003F2
-:10EA40001440029624020011240200031062000503
-:10EA500024020004106202912402000F08004D24D9
-:10EA60002402001108004D24240200052402001491
-:10EA7000A7A2001027B10010000080210C004D4B10
-:10EA800024040001261000012E0200201440FFFB88
-:10EA9000000000000C004D4B000020210C004D4BED
-:10EAA000240400010C004D4B000020210C004D4BB4
-:10EAB0002404000124100010320200011040000262
-:10EAC00000002021240400010C004D4B0010804266
-:10EAD0001600FFFA32020001241000103202001268
-:10EAE0001040000200002021240400010C004D4BC6
-:10EAF000001080421600FFFA320200120C004D4B4B
-:10EB0000240400010C004D4B000020213410800033
-:10EB10009622000000501024104000020000202126
-:10EB2000240400010C004D4B001080421600FFF839
-:10EB3000000000000C004D71000000008F830054A5
-:10EB400008004D16240200068F8300543C02000189
-:10EB50008C425DB82463FF9C004310232C42006468
-:10EB6000144002502402000708004D240000000059
-:10EB700024020006A7A2001027B100100000802187
-:10EB80000C004D4B24040001261000012E02002031
-:10EB90001440FFFB000000000C004D4B0000202142
-:10EBA0000C004D4B240400010C004D4B00002021B3
-:10EBB0000C004D4B2404000124100010320200010F
-:10EBC0001040000200002021240400010C004D4BE5
-:10EBD000001080421600FFFA3202000124100010DB
-:10EBE0003202001310400002000020212404000122
-:10EBF0000C004D4B001080421600FFFA3202001349
-:10EC00000C004D4B240400010C004D4B0000202152
-:10EC100034108000962200000050102410400002A2
-:10EC200000002021240400010C004D4B0010804204
-:10EC30001600FFF8000000000C004D7100000000FD
-:10EC40008F83005408004D16240200088F8300545F
-:10EC50003C0200018C425DB82463FF9C00431023FA
-:10EC60002C4200641440020F2402000908004D24C5
-:10EC70000000000027B10010A7A0001000008021B4
-:10EC80000C004D4B24040001261000012E02002030
-:10EC90001440FFFB000000000C004D4B0000202141
-:10ECA0000C004D4B240400010C004D4B24040001CA
-:10ECB0000C004D4B000020212410001032020001F6
-:10ECC0001040000200002021240400010C004D4BE4
-:10ECD000001080421600FFFA3202000124100010DA
-:10ECE000320200181040000200002021240400011C
-:10ECF0000C004D4B001080421600FFFA3202001843
-:10ED00000C004D71341080000C004D7100000000AB
-:10ED10000C004D2B00000000504000050010804208
-:10ED20009622000000501025A6220000001080420C
-:10ED30001600FFF7000000000C004D71000080215C
-:10ED400097A2001027B1001034420001A7A20010C2
-:10ED50000C004D4B24040001261000012E0200205F
-:10ED60001440FFFB000000000C004D4B0000202170
-:10ED70000C004D4B240400010C004D4B00002021E1
-:10ED80000C004D4B2404000124100010320200013D
-:10ED90001040000200002021240400010C004D4B13
-:10EDA000001080421600FFFA320200012410001009
-:10EDB000320200181040000200002021240400014B
-:10EDC0000C004D4B001080421600FFFA3202001872
-:10EDD0000C004D4B240400010C004D4B0000202181
-:10EDE00034108000962200000050102410400002D1
-:10EDF00000002021240400010C004D4B0010804233
-:10EE00001600FFF8000000000C004D71000000002B
-:10EE10008F83005408004D162402000A8F8300548B
-:10EE20003C0200018C425DB82463FF9C0043102328
-:10EE30002C4200641440019B2402000B08004D2466
-:10EE40000000000027B10010A7A0001000008021E2
-:10EE50000C004D4B24040001261000012E0200205E
-:10EE60001440FFFB000000000C004D4B000020216F
-:10EE70000C004D4B240400010C004D4B24040001F8
-:10EE80000C004D4B00002021241000103202000124
-:10EE90001040000200002021240400010C004D4B12
-:10EEA000001080421600FFFA320200012410001008
-:10EEB000320200171040000200002021240400014B
-:10EEC0000C004D4B001080421600FFFA3202001772
-:10EED0000C004D71341080000C004D7100000000DA
-:10EEE0000C004D2B00000000504000050010804237
-:10EEF0009622000000501025A6220000001080423B
-:10EF00001600FFF7000000000C004D71000080218A
-:10EF100097A2001027B1001034420700A7A20010EA
-:10EF20000C004D4B24040001261000012E0200208D
-:10EF30001440FFFB000000000C004D4B000020219E
-:10EF40000C004D4B240400010C004D4B000020210F
-:10EF50000C004D4B2404000124100010320200016B
-:10EF60001040000200002021240400010C004D4B41
-:10EF7000001080421600FFFA320200012410001037
-:10EF8000320200171040000200002021240400017A
-:10EF90000C004D4B001080421600FFFA32020017A1
-:10EFA0000C004D4B240400010C004D4B00002021AF
-:10EFB00034108000962200000050102410400002FF
-:10EFC00000002021240400010C004D4B0010804261
-:10EFD0001600FFF8000000000C004D71000000005A
-:10EFE0008F83005408004D162402000C8F830054B8
-:10EFF0003C0200018C425DB82463FF9C0043102357
-:10F000002C420064144001272402001208004D2401
-:10F010000000000027B10010A7A000100000802110
-:10F020000C004D4B24040001261000012E0200208C
-:10F030001440FFFB000000000C004D4B000020219D
-:10F040000C004D4B240400010C004D4B2404000126
-:10F050000C004D4B00002021241000103202000152
-:10F060001040000200002021240400010C004D4B40
-:10F07000001080421600FFFA320200012410001036
-:10F08000320200141040000200002021240400017C
-:10F090000C004D4B001080421600FFFA32020014A3
-:10F0A0000C004D71341080000C004D710000000008
-:10F0B0000C004D2B00000000504000050010804265
-:10F0C0009622000000501025A62200000010804269
-:10F0D0001600FFF7000000000C004D7100008021B9
-:10F0E00097A2001027B1001034420010A7A2001010
-:10F0F0000C004D4B24040001261000012E020020BC
-:10F100001440FFFB000000000C004D4B00002021CC
-:10F110000C004D4B240400010C004D4B000020213D
-:10F120000C004D4B24040001241000103202000199
-:10F130001040000200002021240400010C004D4B6F
-:10F14000001080421600FFFA320200012410001065
-:10F1500032020014104000020000202124040001AB
-:10F160000C004D4B001080421600FFFA32020014D2
-:10F170000C004D4B240400010C004D4B00002021DD
-:10F18000341080009622000000501024104000022D
-:10F1900000002021240400010C004D4B001080428F
-:10F1A0001600FFF8000000000C004D710000000088
-:10F1B0008F83005408004D16240200138F830054DF
-:10F1C0003C0200018C425DB82463FF9C0043102385
-:10F1D0002C420064144000B32402000D08004D24AA
-:10F1E0000000000027B10010A7A00010000080213F
-:10F1F0000C004D4B24040001261000012E020020BB
-:10F200001440FFFB000000000C004D4B00002021CB
-:10F210000C004D4B240400010C004D4B2404000154
-:10F220000C004D4B00002021241000103202000180
-:10F230001040000200002021240400010C004D4B6E
-:10F24000001080421600FFFA320200012410001064
-:10F2500032020018104000020000202124040001A6
-:10F260000C004D4B001080421600FFFA32020018CD
-:10F270000C004D71341080000C004D710000000036
-:10F280000C004D2B00000000504000050010804293
-:10F290009622000000501025A62200000010804297
-:10F2A0001600FFF7000000000C004D7100008021E7
-:10F2B00097A2001027B100103042FFFEA7A2001055
-:10F2C0000C004D4B24040001261000012E020020EA
-:10F2D0001440FFFB000000000C004D4B00002021FB
-:10F2E0000C004D4B240400010C004D4B000020216C
-:10F2F0000C004D4B240400012410001032020001C8
-:10F300001040000200002021240400010C004D4B9D
-:10F31000001080421600FFFA320200012410001093
-:10F3200032020018104000020000202124040001D5
-:10F330000C004D4B001080421600FFFA32020018FC
-:10F340000C004D4B240400010C004D4B000020210B
-:10F35000341080009622000000501024104000025B
-:10F3600000002021240400010C004D4B00108042BD
-:10F370001600FFF8000000000C004D7100000000B6
-:10F380008F83005408004D162402000E240208400A
-:10F39000A7A2001027B10010000080210C004D4BE7
-:10F3A00024040001261000012E0200201440FFFB5F
-:10F3B000000000000C004D4B000020210C004D4BC4
-:10F3C000240400010C004D4B000020210C004D4B8B
-:10F3D0002404000124100010320200011040000239
-:10F3E00000002021240400010C004D4B001080423D
-:10F3F0001600FFFA3202000124100010320200133E
-:10F400001040000200002021240400010C004D4B9C
-:10F41000001080421600FFFA320200130C004D4B20
-:10F42000240400010C004D4B00002021341080000A
-:10F4300096220000005010241040000200002021FD
-:10F44000240400010C004D4B001080421600FFF810
-:10F45000000000000C004D71000000008F8300547C
-:10F46000240200103C010001AC225D003C010001BF
-:10F4700008004D26AC235DB88F8300543C02000188
-:10F480008C425DB82463FF9C004310232C4200642F
-:10F490001440000400000000240200113C0100019F
-:10F4A000AC225D008FBF00208FB1001C8FB0001810
-:10F4B00003E0000827BD00288F8500448F820044A8
-:10F4C0003C030001004310253C030008AF820044C8
-:10F4D0008F8400548F82005400A3282408004D37E5
-:10F4E000248400018F820054008210232C420002E9
-:10F4F0001440FFFC000000008F8200443C03FFFE2C
-:10F500003463FFFF00431024AF8200448F83005414
-:10F510008F82005408004D45246300018F820054FF
-:10F52000006210232C4200021440FFFC0000000087
-:10F5300003E0000800A010218F8300443C02FFF08C
-:10F540003442FFFF00042480006218243C020002C1
-:10F550000082202500641825AF8300448F82004478
-:10F560003C03FFFE3463FFFF00431024AF820044DE
-:10F570008F8300548F82005408004D5E2463000185
-:10F580008F820054006210232C4200021440FFFCC2
-:10F59000000000008F8200443C030001004310255E
-:10F5A000AF8200448F8300548F82005408004D6B5B
-:10F5B000246300018F820054006210232C42000259
-:10F5C0001440FFFC0000000003E000080000000001
-:10F5D0008F8200443C03FFF03463FFFF004310249C
-:10F5E000AF8200448F8200443C0300010043102599
-:10F5F000AF8200448F8300548F82005408004D7FF7
-:10F60000246300018F820054006210232C42000208
-:10F610001440FFFC000000008F8200443C03FFFE0A
-:10F620003463FFFF00431024AF8200448F830054F3
-:10F630008F82005408004D8D246300018F82005496
-:10F64000006210232C4200021440FFFC0000000066
-:10F6500003E000080000000027BDFFC8AFB300248E
-:10F6600000809821AFB5002C00A0A821AFB20020E7
-:10F6700000C0902132A2FFFFAFBF0030AFB400281E
-:10F68000AFB1001CAFB0001814400034A7B2001096
-:10F690003271FFFF27B20010000080210C004D4B9B
-:10F6A00024040001261000012E0200201440FFFB5C
-:10F6B000000000000C004D4B000020210C004D4BC1
-:10F6C000240400010C004D4B000020210C004D4B88
-:10F6D0002404000124100010320200011040000236
-:10F6E00000002021240400010C004D4B001080423A
-:10F6F0001600FFFA3202000124100010023010241C
-:10F700001040000200002021240400010C004D4B99
-:10F71000001080421600FFFA023010240C004D4BFE
-:10F72000240400010C004D4B000020213410800007
-:10F7300096420000005010241040000200002021DA
-:10F74000240400010C004D4B001080421200007593
-:10F750000000000008004DC9000000003274FFFFE7
-:10F7600027B10010A7A00010000080210C004D4B15
-:10F7700024040001261000012E0200201440FFFB8B
-:10F78000000000000C004D4B000020210C004D4BF0
-:10F79000240400010C004D4B240400010C004D4BCF
-:10F7A000000020212410001032020001104000024D
-:10F7B00000002021240400010C004D4B0010804269
-:10F7C0001600FFFA320200012410001002901024EB
-:10F7D0001040000200002021240400010C004D4BC9
-:10F7E000001080421600FFFA029010240C004D71A8
-:10F7F000341080000C004D71000000000C004D2BF7
-:10F8000000000000504000050010804296220000D9
-:10F8100000501025A6220000001080421600FFF7BD
-:10F82000000000000C004D710000000032A5FFFF39
-:10F830002402000154A200042402000297A2001036
-:10F8400008004E140052102514A200063271FFFF6A
-:10F8500097A200100012182700431024A7A200103E
-:10F860003271FFFF27B20010000080210C004D4BC9
-:10F8700024040001261000012E0200201440FFFB8A
-:10F88000000000000C004D4B000020210C004D4BEF
-:10F89000240400010C004D4B000020210C004D4BB6
-:10F8A0002404000124100010320200011040000264
-:10F8B00000002021240400010C004D4B0010804268
-:10F8C0001600FFFA3202000124100010023010244A
-:10F8D0001040000200002021240400010C004D4BC8
-:10F8E000001080421600FFFA023010240C004D4B2D
-:10F8F000240400010C004D4B000020213410800036
-:10F900009642000000501024104000020000202108
-:10F91000240400010C004D4B001080421600FFF83B
-:10F92000000000000C004D71000000008FBF00308F
-:10F930008FB5002C8FB400288FB300248FB2002025
-:10F940008FB1001C8FB0001803E0000827BD0038FD
-:10F9500000000000000000000000000027BDFFE8DC
-:10F96000AFBF00103C030001007718218C6383AC0B
-:10F97000240200081462022C008030213C020001A5
-:10F980008C425D9814400033000000008F850224F3
-:10F9900038A300202C63000138A200102C42000183
-:10F9A000006218251460000D38A300302C6300019C
-:10F9B00038A204002C4200010062182514600007E0
-:10F9C00038A304022C63000138A204042C42000175
-:10F9D0000062182510600005000000000C00429B2A
-:10F9E0000000000008004E8D2402000E0C0043DDD4
-:10F9F000000000003C0500018CA55CC80C0052A270
-:10FA0000000020213C0300018C635CC82402000438
-:10FA1000146200052403FFFB3C0200018C425CC41D
-:10FA200008004E892403FFF73C0200018C425CC4AD
-:10FA3000004310243C010001AC225CC42402000EEF
-:10FA40003C0100010C00429BAC227DD00800508795
-:10FA5000000000008F8202203C03040000431024B9
-:10FA6000104000272403FFBF8F8502243C020001C1
-:10FA70008C427DDC00A32024004310241482000C5F
-:10FA8000000000003C0200018C427DE024420001A5
-:10FA90003C010001AC227DE02C4200021440000831
-:10FAA000240200013C01000108004EADAC227E00A2
-:10FAB0003C010001AC207DE03C010001AC207E0057
-:10FAC0003C0200018C427E001040000630A2004043
-:10FAD00010400004240200013C01000108004EB85F
-:10FAE000AC227E043C010001AC207E043C010001FC
-:10FAF000AC257DDC3C01000108004EC8AC207E1026
-:10FB0000240200013C010001AC227E103C010001F6
-:10FB1000AC207E003C010001AC207DE03C010001F6
-:10FB2000AC207E043C010001AC207DDC3C030001E4
-:10FB30008C637DD03C0200018C427DD410620003B6
-:10FB40003C0202003C010001AC237DD400C2102421
-:10FB5000104000072463FFFF8F820220240300016E
-:10FB60003C010001AC235CCC080050853C03F7004D
-:10FB70002C62000E104001A8000310803C0100011F
-:10FB8000002208218C225B80004000080000000059
-:10FB90003C010001AC207E003C010001AC207DE076
-:10FBA0003C010001AC207DDC3C010001AC207E0466
-:10FBB0003C010001AC207DF83C010001AC207DF04F
-:10FBC0000C00486AAF800224240200023C010001BC
-:10FBD000AC227DD03C0200018C427E1014400056C5
-:10FBE0003C03FDFF8EE200003463FFFF004310245E
-:10FBF0000C00429BAEE20000AF8002048F82020044
-:10FC00002403FFFD00431024AF8202003C010001E9
-:10FC1000AC207E208F8300543C0200018C427DF892
-:10FC2000240400013C010001AC247E0C24420001AC
-:10FC30003C010001AC227DF82C4200043C01000193
-:10FC4000AC237DF414400006240200033C010001B3
-:10FC5000AC245CCC3C01000108005083AC207DF852
-:10FC60003C01000108005083AC227DD08F830054FA
-:10FC70003C0200018C427DF42463D8F00043102341
-:10FC80002C42271014400003240200043C01000110
-:10FC9000AC227DD03C0200018C427E101440002634
-:10FCA0003C03FDFF8EE200003463FFFF004310249D
-:10FCB00008005083AEE200003C0400018C845D9C8F
-:10FCC0003C0100010C00508AAC207DE83C020001A0
-:10FCD0008C427E1CAF8202043C0200018C427E10EA
-:10FCE000144000153C03FDFF8EE200003463FFFF6B
-:10FCF00000431024AEE200008F8202043042003044
-:10FD00001440013C240200023C0300018C637E1C71
-:10FD1000240200053C010001AC227DD03C01000121
-:10FD200008005083AC237E203C0200018C427E10F0
-:10FD3000104000103C03FDFF3C0200018C425D6C52
-:10FD4000244200013C010001AC225D6C2C42000207
-:10FD500014400131240200013C010001AC225D7419
-:10FD60003C010001AC205D6C3C01000108005083A7
-:10FD7000AC225CCC8EE200003463FFFF0043102411
-:10FD8000AEE200003C0200018C427E0010400122E5
-:10FD9000000000003C0200018C427DDC1040011E8E
-:10FDA000000000003C010001AC227E082402000398
-:10FDB0003C010001AC227DE0080050242402000632
-:10FDC0003C010001AC207DE88F82020434420040F7
-:10FDD000AF8202043C0200018C427E202403000713
-:10FDE0003C010001AC237DD0344200403C010001C5
-:10FDF000AC227E203C0200018C427E0010400005B7
-:10FE0000000000003C0200018C427DDC104000F943
-:10FE1000240200023C05000124A57DE08CA2000024
-:10FE20002C424E21104000F3240200023C0200014B
-:10FE30008C427E04104000F82404FFBF3C02000105
-:10FE40008C427DDC3C0300018C637E08004410245E
-:10FE50000064182410430004240200013C01000146
-:10FE600008005083AC227DD024020003ACA2000025
-:10FE7000240200083C010001AC227DD03C020001BC
-:10FE80008C427E0C1040000C240200013C04000156
-:10FE90000C0050978C847DDC3C0200018C427E2853
-:10FEA00014400005240200013C0200018C427E2423
-:10FEB00010400006240200013C010001AC225CCC91
-:10FEC0003C01000108005083AC207DF83C02000199
-:10FED0008C427DF03C0300018C637DDC2C420001F0
-:10FEE000000210C0306300083C010001AC227DF02C
-:10FEF0003C010001AC237DEC8F83005424020009F7
-:10FF00003C010001AC227DD03C010001080050837F
-:10FF1000AC237DF48F8300543C0200018C427DF4BD
-:10FF20002463D8F0004310232C422710144000A86B
-:10FF3000000000003C0200018C427E0010400005E1
-:10FF4000000000003C0200018C427DDC104000A952
-:10FF5000240200023C03000124637DE08C62000067
-:10FF60002C424E21104000A3240200023C0200015A
-:10FF70008C427E0C1040000E000000003C0200018C
-:10FF80008C427DDC3C010001AC207E0C30420080C4
-:10FF90001040002F2402000C8F82020430420080A7
-:10FFA0001440000C24020003080050112402000C2D
-:10FFB0003C0200018C427DDC304200801440000590
-:10FFC000240200038F820204304200801040001F90
-:10FFD00024020003AC6200002402000A3C0100017C
-:10FFE000AC227DD03C04000124847E188C82000069
-:10FFF0003C0300018C637DF000431025AF820204B6
-:020000021000EC
-:100000008C8300003C0400018C847DF02402000BF2
-:100010003C010001AC227DD0006418253C010001A8
-:10002000AC237E203C05000124A57DE08CA20000CD
-:100030002C424E211040006F240200023C020001BD
-:100040008C427E1010400005000000002402000CCD
-:100050003C01000108005083AC227DD03C0200012D
-:100060008C427E001040006C000000003C04000147
-:100070008C847DDC1080005E308200083C0300012F
-:100080008C637DEC10620064240200033C010001DB
-:10009000AC247E08ACA20000240200063C01000152
-:1000A00008005083AC227DD08F82020034420002CF
-:1000B000AF8202008F8300542402000D3C01000136
-:1000C000AC227DD03C010001AC237DF48F83005431
-:1000D0003C0200018C427DF42463D8F000431023DD
-:1000E0002C4227101440003A000000003C0200019E
-:1000F0008C427E10104000292402000E3C030001B7
-:100100008C637E243C01000114600015AC227DD07C
-:100110000C0043DD000000003C0500018CA55CC81C
-:100120000C0052A2000020213C0300018C635CC83B
-:1001300024020004146200052403FFFB3C020001BA
-:100140008C425CC4080050522403FFF73C020001BB
-:100150008C425CC4004310243C010001AC225CC40E
-:100160008EE200003C03020000431025AEE20000D6
-:100170008F8202243C010001AC227E2C8F8202205F
-:100180002403FFFB00431024AF8202208F82022051
-:100190003442000208005083AF8202203C0200017A
-:1001A0008C427E0010400005000000003C0200016F
-:1001B0008C427DDC1040000F240200023C02000152
-:1001C0008C427DE02C424E211040000A24020002A5
-:1001D0003C0200018C427E001040000F0000000035
-:1001E0003C0200018C427DDC1440000B000000004A
-:1001F000240200023C01000108005083AC227DD0A3
-:100200003C0200018C427E00104000030000000010
-:100210000C00429B000000008F8202203C03F7008C
-:1002200000431025AF8202208FBF001003E00008BA
-:1002300027BD00183C03000124637E288C62000067
-:1002400010400005344220003C010001AC227E1C1D
-:1002500008005095AC6000003C010001AC247E1CFD
-:1002600003E000080000000027BDFFE030820030FE
-:10027000AFBF00183C010001AC227E24144000678F
-:100280003C02FFFF34421F0E008210241440006124
-:1002900024020030308220001040005D3083800056
-:1002A00000031A0230820001000212003C04000127
-:1002B0008C845D9C00621825000331C23C03000160
-:1002C00024635D78308280000002120230840001D5
-:1002D0000004220000441025000239C200061080EC
-:1002E0000043102100471021904300002402000128
-:1002F00010620025000000001060000724020002C8
-:1003000010620013240200031062002C3C05000F51
-:10031000080050F9000000008F8202002403FEFF55
-:1003200000431024AF8202008F8202203C03FFFEB4
-:100330003463FFFF00431024AF8202203C01000120
-:10034000AC207E443C01000108005104AC207E4CEE
-:100350008F82020034420100AF8202008F820220AD
-:100360003C03FFFE3463FFFF00431024AF820220F2
-:10037000240201003C010001AC227E443C0100014A
-:1003800008005104AC207E4C8F8202002403FEFF43
-:1003900000431024AF8202008F8202203C03000140
-:1003A00000431025AF8202203C010001AC207E44B6
-:1003B0003C01000108005104AC237E4C8F820200F6
-:1003C00034420100AF8202008F8202203C03000110
-:1003D00000431025AF820220240201003C010001ED
-:1003E000AC227E443C01000108005104AC237E4C49
-:1003F00034A5FFFF3C04000124845BB8AFA30010C8
-:100400000C002403AFA000140800510400000000F9
-:10041000240200303C010001AC227E288FBF00186E
-:1004200003E0000827BD00200000000027BDFFC832
-:10043000AFB2002800809021AFB3002C00A098211B
-:10044000AFB0002000C080213C04000124845BD0B8
-:100450003C0500093C0200018C425CC834A59001B7
-:100460000240302102603821AFBF0030AFB100241C
-:10047000A7A0001AAFB000140C002403AFA2001014
-:1004800024020002126200832E6200031040000565
-:10049000240200011262000A000000000800529BC2
-:1004A0000000000024020004126200FA2402000886
-:1004B000126200F93C02FFEC0800529B00000000B1
-:1004C0003C0200018C425CC4304200021440000433
-:1004D000001289403C02FFFB3442FFFF02028024ED
-:1004E0003C01000100310821AC307E3C3C02400060
-:1004F000020210241040004E001023C2308400304D
-:10050000001013823042001C3C03000124635D088C
-:1005100000431021008238213C02002002021024F6
-:1005200010400006240201003C01000100310821B6
-:10053000AC227E40080051503C0200803C0100018A
-:1005400000310821AC207E403C02008002021024D1
-:1005500010400006001219403C0200013C0100015D
-:10056000002308210800515CAC227E480012114093
-:100570003C01000100220821AC207E4894E40000E8
-:100580003C0300018C635DBC240200051062001076
-:10059000A7A400183202400010400002348240003C
-:1005A000A7A200182404000194E20002240500041C
-:1005B00024E60002344200010C00498EA4E200024D
-:1005C00024040001000028210C00498E27A60018F1
-:1005D0003C0200018C425CC8241100013C01000176
-:1005E000AC315CD414530004320280000C00429BF6
-:1005F00000000000320280001040011F00000000D7
-:100600000C00429B000000003C0300018C635DBCB9
-:100610002402000510620118240200023C010001BE
-:10062000AC315CCC3C0100010800529BAC225CC8A0
-:10063000240400012405000427B0001A0C00498E90
-:100640000200302124040001000028210C00498E02
-:10065000020030213C020001005110218C427E3406
-:100660003C0400018C845CC83C03BFFF3463FFFF83
-:100670003C010001AC335CD4004310243C01000178
-:1006800000310821109300FAAC227E340800529BFE
-:10069000000000003C02200002021024104000056F
-:1006A000240200013C010001AC225D98080051AD1C
-:1006B000001289403C010001AC205D980012894085
-:1006C0003C01000100310821AC307E383C02400082
-:1006D0000202102414400016000000003C02000139
-:1006E0008C425D9810400008240400042405000199
-:1006F0000C004D9324062000240200013C0100015F
-:1007000000370821AC2283AC3C02000100511021CB
-:100710008C427E303C03BFFF3463FFFF0043102454
-:100720003C0100010031082108005299AC227E30C2
-:100730003C0200018C425D98104000283C0300A060
-:10074000020310245443000D3C0200203C0200012F
-:100750008C425D9C240301003C0100010031082112
-:10076000AC237E443C0300013C0100010031082120
-:10077000AC237E4C080051F03442040002021024E5
-:1007800010400008240301003C0200018C425D9CE3
-:100790003C01000100310821AC237E44080051F0E7
-:1007A000344208003C020080020210241040002E57
-:1007B0003C0300013C0200018C425D9C3C010001B5
-:1007C00000310821AC237E4C34420C003C01000176
-:1007D000AC225D9C08005218240400013C02002059
-:1007E0000202102410400006240201003C01000116
-:1007F00000310821AC227E44080052013C020080F6
-:100800003C01000100310821AC207E443C02008004
-:100810000202102410400007001219403C0200019F
-:100820003C01000100230821AC227E4C0800520F3D
-:1008300024040001001211403C01000100220821A3
-:10084000AC207E4C240400010000282127B0001EAB
-:100850000C00494C02003021240400010000282132
-:100860000C00494C02003021240400012405000141
-:1008700027B0001C0C00494C020030212404000168
-:10088000240500010C00494C020030210800529957
-:10089000000000003C02FFEC3442FFFF0202802413
-:1008A0003C02000802028025001211403C010001B8
-:1008B00000220821AC307E383C02200002021024C5
-:1008C00010400009000000003C0200018C425D74F1
-:1008D00014400005240200013C010001AC225D9897
-:1008E0000800523A3C0240003C010001AC205D98F7
-:1008F0003C024000020210241440001E00000000D0
-:100900003C0200018C425D983C010001AC205CE09F
-:1009100010400007240220203C010001AC225D9C15
-:10092000240200013C01000100370821AC2283AC05
-:100930003C04BFFF001219403C020001004310219B
-:100940008C427E303C0500018CA55CC83484FFFFDE
-:10095000004410243C01000100230821AC227E3019
-:100960002402000110A20044000000000800529977
-:10097000000000003C0200018C425D981040001C09
-:10098000240220003C010001AC225D9C3C0300A03D
-:100990000203102414430005001211403402A00089
-:1009A0003C01000108005294AC225D9C3C03000114
-:1009B000006218218C637E383C0200200062102403
-:1009C00010400004240220013C0100010800529460
-:1009D000AC225D9C3C020080006210241040001F8D
-:1009E0003402A0013C01000108005294AC225D9C3D
-:1009F0003C0200200202102410400007001219409F
-:100A0000240201003C01000100230821AC227E44A5
-:100A1000080052883C020080001211403C01000195
-:100A200000220821AC207E443C02008002021024F7
-:100A300010400006001219403C0200013C01000178
-:100A40000023082108005294AC227E4C0012114071
-:100A50003C01000100220821AC207E4C3C03000137
-:100A60008C635CC8240200011062000300000000D7
-:100A70000C00429B000000008FBF00308FB3002CA1
-:100A80008FB200288FB100248FB0002003E000084F
-:100A900027BD003827BDFFD8AFB2002000809021CD
-:100AA000AFB1001C0000882124020002AFBF002467
-:100AB000AFB00018A7A0001210A200D3A7A000108A
-:100AC0002CA20003104000052402000110A2000A1D
-:100AD00000128140080053800220102124020004EB
-:100AE00010A2007D2402000810A2007C0012294000
-:100AF00008005380022010213C03000100701821DF
-:100B00008C637E3C3C0240000062102414400009CB
-:100B1000240400013C027FFF3442FFFF006288246E
-:100B20003C01000100300821AC317E3408005380C4
-:100B300002201021240500010C00494C27A60010BA
-:100B400024040001240500010C00494C27A60010D4
-:100B500097A2001030420004104000343C114000C5
-:100B60003C0200018C425DBC2443FFFF2C62000666
-:100B700010400034000310803C01000100220821D5
-:100B80008C225BE00040000800000000240400010B
-:100B90002405001127B000120C00494C020030213E
-:100BA00024040001240500110C00494C02003021EE
-:100BB00097A5001230A24000104000023C04001033
-:100BC0003C0400083C0300010800530130A28000EF
-:100BD000240400012405001427B000120C00494C25
-:100BE0000200302124040001240500140C00494CAB
-:100BF0000200302197A5001230A210001040000220
-:100C00003C0400103C0400083C03000130A2080032
-:100C1000544000013C0300023C02800002221025E7
-:100C2000006418250800530E004388253C1100017C
-:100C3000023088218E317E3C3C027FFF3442FFFF30
-:100C4000022288243C0200018C425CD81040001D26
-:100C5000001211403C0200018C425D9810400002DD
-:100C60003C02200002228825001211403C010001B4
-:100C7000002208218C227E40104000033C0200200C
-:100C800008005322022288253C02FFDF3442FFFF86
-:100C900002228824001211403C0100010022082198
-:100CA0008C227E48104000033C0200800800532D37
-:100CB000022288253C02FF7F3442FFFF0222882463
-:100CC000001211403C01000100220821AC317E34A9
-:100CD0000800538002201021001229403C0300012B
-:100CE000006518218C637E383C02400000621024AD
-:100CF000144000083C027FFF3442FFFF006288245A
-:100D00003C01000100250821AC317E3008005380F1
-:100D1000022010213C0200018C425CD810400033BC
-:100D20003C11C00C3C0200018C425D743C04C00CC0
-:100D3000348420003C0300018C635D980002102B7A
-:100D40000002102300441024106000030051882585
-:100D50003C022000022288253C02000100451021AF
-:100D60008C427E44104000033C0200200800535D8A
-:100D7000022288253C02FFDF3442FFFF0222882442
-:100D8000001211403C010001002208218C227E4CFF
-:100D9000104000033C0200800800536802228825AE
-:100DA0003C02FF7F3442FFFF022288243C02000104
-:100DB0008C425D60104000023C020800022288253F
-:100DC0003C0200018C425D64104000023C020400C1
-:100DD000022288253C0200018C425D68104000061A
-:100DE0003C0201000800537B022288253C027FFF61
-:100DF0003442FFFF00628824001211403C010001D0
-:100E000000220821AC317E30022010218FBF002447
-:100E10008FB200208FB1001C8FB0001803E00008D3
-:100E200027BD002827BDFFD8AFB400200080A02137
-:100E3000AFBF0024AFB3001CAFB20018AFB10014B5
-:100E4000AFB000108F9002003C0300018C635CC8BF
-:100E50008F93022024020002106200632C620003C0
-:100E600010400005240200011062000A001419401D
-:100E70000800544800000000240200041062005AD8
-:100E800024020008106200590014914008005448E0
-:100E9000000000003C040001008320218C847E3C83
-:100EA0003C110001022388218E317E343C02400037
-:100EB000008210241040003E3C0200080222102450
-:100EC00010400020361000023C02000100431021B7
-:100ED0008C427E4010400005361000203610010084
-:100EE0003C020020080053BD022288252402FEFF98
-:100EF000020280243C02FFDF3442FFFF02228824EA
-:100F0000001411403C010001002208218C227E487F
-:100F1000104000053C020001026298253C0200805E
-:100F2000080053DC022288253C02FFFE3442FFFF0A
-:100F3000026298243C02FF7F3442FFFF080053DC2A
-:100F4000022288242402FEDF020280243C02FFFEEB
-:100F50003442FFFF026298243C02FF5F3442FFFFED
-:100F6000022288243C01000100230821AC207E409D
-:100F70003C01000100230821AC207E480C00486A97
-:100F800000000000AF900200AF9302208F82022089
-:100F90002403FFFB00431024AF8202208F82022033
-:100FA00034420002AF820220080053F300141140C3
-:100FB0008F8202002403FFFD004310240C00486AC6
-:100FC000AF8202003C02BFFF3442FFFF0C00429B95
-:100FD00002228824001411403C0100010022082153
-:100FE00008005448AC317E34001491403C040001A8
-:100FF000009220218C847E383C110001023288212D
-:101000008E317E303C0240000082102414400011DA
-:10101000000000003C0200018C425D981440000674
-:101020003C02BFFF8F820200344200020C00486A7B
-:10103000AF8202003C02BFFF3442FFFF0C00429B24
-:10104000022288243C010001003208210800544893
-:10105000AC317E303C0200018C425D9810400005AE
-:101060003C0200203C0200018C425D741040002BC9
-:101070003C0200200082102410400007361000209F
-:10108000240201003C01000100320821AC227E4410
-:1010900008005428361001003C01000100320821EC
-:1010A000AC207E442402FEFF020280243C02008029
-:1010B0000082102410400007001419403C02000177
-:1010C0003C01000100230821AC227E4C0800543969
-:1010D00002629825001411403C0100010022082101
-:1010E000AC207E4C3C02FFFE3442FFFF026298249B
-:1010F0000C00486A00000000AF900200AF9302208D
-:101100008F8202202403FFFB00431024AF820220C1
-:101110008F82022034420002AF820220001411406C
-:101120003C01000100220821AC317E308FBF002439
-:101130008FB400208FB3001C8FB200188FB1001441
-:101140008FB0001003E0000827BD00282448656127
-:101150006465723A202F70726F6A656374732F72C0
-:1011600063732F73772F67652F2E2F6E69632F663A
-:10117000772F636F6D6D6F6E2F66776D61696E2E61
-:10118000632C7620312E312E322E313120313939F7
-:10119000382F30342F32372032323A31333A34322A
-:1011A00020736875616E6720457870202400000008
-:1011B0007468655F4441574E00000000535441433A
-:1011C0004B5F312000000000426164536E64526E38
-:1011D000670000003F456E71457674003F6E6F51A9
-:1011E00064457650000000006576526E6746756C67
-:1011F0006C000000496C6C436F6E66527800000012
-:1012000053656E64436B53756D00000052656376E1
-:10121000566C616E0000000000000000244865610B
-:101220006465723A202F70726F6A656374732F72EF
-:1012300063732F73772F67652F2E2F6E69632F6669
-:10124000772F636F6D6D6F6E2F74696D65722E638E
-:101250002C7620312E312E322E3820313939382F4C
-:1012600030372F33312031373A35383A343520731F
-:101270006875616E6720457870202400542D446D98
-:101280006152643100000000542D446D61424200FF
-:10129000542D446D613200003F6E6F5164547845A7
-:1012A000000000003F6E6F5164527845000000005E
-:1012B000656E714D4576504661696C00656E714D85
-:1012C00045764661696C00006661696C456E454D06
-:1012D000000000003F456E71457674003F6E6F510F
-:1012E00064457650000000006576526E6746756C66
-:1012F0006C00000000000000000000002448656150
-:101300006465723A202F70726F6A656374732F720E
-:1013100063732F73772F67652F2E2F6E69632F6688
-:10132000772F636F6D6D6F6E2F636F6D6D616E6480
-:101330002E632C7620312E312E322E313020313951
-:1013400039382F31312F31382031373A31313A3174
-:101350003820736875616E6720457870202400001E
-:101360003F4D626F78457674000000004E4F636F0A
-:101370006D616E6400000000687374655F455252D1
-:1013800000000000412D45727242756300000000AC
-:101390004552524F522D416464000000656E714DFC
-:1013A0004576504661696C00656E714D45764661C3
-:1013B000696C00006661696C456E454D0000000077
-:1013C000442D4572724C617374000000442D4572C7
-:1013D000723200006D4373744D6445525200000038
-:1013E00070726F6D4D6445525200000046696C7416
-:1013F0004D64455252000000636D645F45525200D7
-:101400003F456E71457674003F6E6F51644576506E
-:10141000000000006576526E6746756C6C00000037
-:101420000000000000006EA000007FBC00006E38CD
-:1014300000008734000082B00000878000008780B1
-:1014400000006F540000769400007F0C000080A81C
-:10145000000080740000878000007E70000080CC57
-:1014600000006E64000081CC00000000244865612B
-:101470006465723A202F70726F6A656374732F729D
-:1014800063732F73772F67652F2E2F6E69632F6617
-:10149000772F636F6D6D6F6E2F646D612E632C7689
-:1014A00020312E312E322E3320313939382F30343D
-:1014B0002F32372032323A31333A34312073687563
-:1014C000616E67204578702024000000646D6172B1
-:1014D0006441544E00000000646D61777241544EC7
-:1014E00000000000000000000000000024486561CA
-:1014F0006465723A202F70726F6A656374732F721D
-:1015000063732F73772F67652F2E2F6E69632F6696
-:10151000772F636F6D6D6F6E2F74726163652E63CD
-:101520002C7620312E312E322E3220313939382F7F
-:1015300030342F32372032323A31333A353020735B
-:101540006875616E672045787020240024486561C5
-:101550006465723A202F70726F6A656374732F72BC
-:1015600063732F73772F67652F2E2F6E69632F6636
-:10157000772F636F6D6D6F6E2F646174612E632CB6
-:101580007620312E312E322E3220313939382F301B
-:10159000342F32372032323A31333A3430207368C4
-:1015A00075616E67204578702024000046575F56AD
-:1015B000455253494F4E3A2023312046726920410B
-:1015C000707220372031373A35353A34382050445C
-:1015D000542032303030000046575F434F4D504961
-:1015E0004C455F54494D453A2031373A35353A3408
-:1015F0003800000046575F434F4D50494C455F420D
-:10160000593A2064657672637300000046575F4361
-:101610004F4D50494C455F484F53543A20636F6DCE
-:10162000707574650000000046575F434F4D504988
-:101630004C455F444F4D41494E3A20656E672E61DF
-:101640006374656F6E2E636F6D00000046575F43D5
-:101650004F4D50494C45523A20676363207665727E
-:1016600073696F6E20322E372E32000000000000AA
-:101670000000000000000000000000002448656138
-:101680006465723A202F70726F6A656374732F728B
-:1016900063732F73772F67652F2E2F6E69632F6605
-:1016A000772F636F6D6D6F6E2F6D656D2E632C766A
-:1016B00020312E312E322E3220313939382F30342C
-:1016C0002F32372032323A31333A3434207368754E
-:1016D000616E672045787020240000002448656111
-:1016E0006465723A202F70726F6A656374732F722B
-:1016F00063732F73772F67652F2E2F6E69632F66A5
-:10170000772F636F6D6D6F6E2F73656E642E632C14
-:101710007620312E312E322E313120313939382F89
-:1017200031322F32322031373A31373A3535207362
-:101730006875616E6720457870202400736E64645C
-:10174000654E6F51200000006E6F454E515F54583A
-:1017500000000000736E6464744E6F51200000003E
-:101760003F6E6F516454784500000000756E6B72D7
-:101770006474797065000000000000000000ACCCCB
-:101780000000ACCC0000AD9C0000AAB00000AAB0E4
-:101790000000AD9C0000AD9C0000AD9C0000AD9C25
-:1017A0000000AD9C0000AD9C0000AD9C0000AD9C15
-:1017B0000000AD9C0000AD9C0000AD9C0000AD9C05
-:1017C0000000AD9C0000AD7C000000000000BCA843
-:1017D0000000BCA80000BD700000AE4C0000B05876
-:1017E0000000BD700000BD700000BD700000BD7045
-:1017F0000000BD700000BD700000BD700000BD7035
-:101800000000BD700000BD700000BD700000BD7024
-:101810000000BD700000BD540000B0402448656168
-:101820006465723A202F70726F6A656374732F72E9
-:1018300063732F73772F67652F2E2F6E69632F6663
-:10184000772F636F6D6D6F6E2F726563762E632CCD
-:101850007620312E312E322E313920313939382F40
-:1018600030372F32342032313A33303A303520732A
-:101870006875616E6720457870202400706B52781F
-:101880004552520066726D324C617267650000000D
-:1018900072784E6F527842640000000072785144B2
-:1018A0006D61444600000000727851446D6142460B
-:1018B000000000003F6E6F51645278450000000048
-:1018C000706B5278455252730000000066726D32A0
-:1018D0004C7267530000000072784E6F42645300F0
-:1018E0003F724264446D6146000000003F724A420C
-:1018F00064446D4600000000000000000000F6781F
-:101900000000F6780000F6780000F6780000F6781F
-:101910000000F6780000F6780000F6780000F6780F
-:101920000000F6780000F6780000F6780000F678FF
-:101930000000F6780000F6780000F6700000F670FF
-:101940000000F670572D444D41456E4600000000E2
-:10195000000000000000FDC00001015C0000FDDC93
-:101960000001015C0001015C0001015C0001015CFF
-:101970000001015C0001015C0000F7040001015C52
-:101980000001015C0001015C0001015C0001015CDF
-:101990000001015400010154000101542448656113
-:1019A0006465723A202F70726F6A656374732F7268
-:1019B00063732F73772F67652F2E2F6E69632F66E2
-:1019C000772F636F6D6D6F6E2F6D61632E632C7655
-:1019D00020312E312E322E313220313939382F300C
-:1019E000342F32372032323A31333A34322073686E
-:1019F00075616E6720457870202400006D61637406
-:101A00007841544E000000004E7453796E264C6BA2
-:101A10000000000072656D61737372740000000055
-:101A20006C696E6B444F574E00000000656E714D3F
-:101A30004576504661696C00656E714D457646612C
-:101A4000696C00006661696C456E454D00000000E0
-:101A50006C696E6B55500000000000002448656101
-:101A60006465723A202F70726F6A656374732F72A7
-:101A700063732F73772F67652F2E2F6E69632F6621
-:101A8000772F636F6D6D6F6E2F636B73756D2E6344
-:101A90002C7620312E312E322E3220313939382F0A
-:101AA00030342F32372032323A31333A33392073DF
-:101AB0006875616E672045787020240050726F62EF
-:101AC00065506879000000006C6E6B4153535254AE
-:101AD0000000000000011B2C00011BC400011BF8CA
-:101AE00000011C2C00011C5800011C6C00011CA8EA
-:101AF0000001207C00011DE400011E2400011E5095
-:101B000000011E9000011EC000011EFC00011F30DC
-:101B10000001207C000122C0000122D80001230026
-:101B2000000123200001234800012478000124A0A3
-:101B3000000124F40001251C000000000001278C96
-:101B40000001285C0001293400012A0400012A60F8
-:101B500000012B3C00012B6400012C4000012C688B
-:101B600000012E1000012E3800012FE0000131D8B5
-:101B70000001346C000133800001346C00013498A2
-:101B800000013008000131B00000000000013B847A
-:101B900000013BC800013C6000013CAC00013D1C61
-:101BA00000013DB400013DE800013E7000013F0826
-:101BB00000013FD8000140180001409C000140C0D6
-:101BC000000141F4646F42617365506700000000DA
-:101BD00000000000000000000000000073746D6150
-:101BE000634C4E4B000000000000000000014C3828
-:101BF00000014C3800014B8000014BC400014C38FF
-:101C000000014C380000000000000000000000004F
-:101C100000000000000000000000000000000000C4
-:101C2000000000000000000000000000416C74652E
-:101C30006F6E204163654E4943205600416C7465C8
-:101C40006F6E204163654E49432056004242424236
-:101C50000000000000000000000000000013541805
-:101C60000013E7FC0000000000000000000000007E
-:101C70000000000000000000000000000060CF0035
-:101C800000000060CF000000000000000000000025
-:101C90000000000000000000000000000000000044
-:101CA0000000000000000000000000000000000034
-:101CB0000000000000000000000000000000000024
-:101CC0000000000000000000000000000000000014
-:101CD0000000000000000000000000030000000001
-:101CE00000000001000000000000000000000000F3
-:101CF00000000001000000000000000100000000E2
-:101D000000000000000000000000000000000001D2
-:101D100000000001000000000000000000000000C2
-:101D20000000000000000000010000002100000091
-:101D30001200014000000000000000002000000030
-:101D4000120000A0000000001200006012000180DC
-:101D5000120001E000000000000000000000000090
-:101D60000000000100000000000000000000000072
-:101D70000000000000000000000000000000000261
-:101D8000000000000000000000030001000000014E
-:0C1D900000030201000000000000000041
-:00000001FF
-/* tg1 firmware v12.4.11 */
diff --git a/firmware/acenic/tg2.bin.ihex b/firmware/acenic/tg2.bin.ihex
deleted file mode 100644
index a9ff4f431f22..000000000000
--- a/firmware/acenic/tg2.bin.ihex
+++ /dev/null
@@ -1,4844 +0,0 @@
-:100000000C040B0000004000000040000000000055
-:1000100010000003000000000000000D0000000DB3
-:100020003C1D00018FBD6D2003A0F0213C1000009D
-:10003000261040000C0010C0000000000000000D61
-:100040003C1D00018FBD6D2403A0F0213C10000079
-:10005000261040000C0017E0000000000000000D1A
-:100060000000000000000000000000000000000090
-:100070000000000000000000000000000000000080
-:100080000000000000000000000000000000000070
-:100090000000000000000000000000000000000060
-:1000A0000000000000000000000000000000000050
-:1000B0000000000000000000000000000000000040
-:1000C0000000000000000000000000000000000030
-:1000D0000000000000000000000000000000000020
-:1000E0000000000000000000000000000000000010
-:1000F0000000000000000000000000000000000000
-:1001000000000000000000000000000002000008E5
-:10011000000000000800172F3C0A00010800172FFC
-:100120003C0A00020800172F0000000008002CAC59
-:100130000000000008002C4F000000000800172FEE
-:100140003C0A00040800328A0000000008001A522D
-:10015000000000000800394D00000000080038F4DD
-:10016000000000000800172F3C0A0006080039BBF9
-:100170003C0A00070800172F3C0A00080800172F48
-:100180003C0A000908003A130000000008002EA6EF
-:10019000000000000800172F3C0A000B0800172F72
-:1001A0003C0A000C0800172F3C0A000D080028FB31
-:1001B0000000000008002890000000000800172F31
-:1001C0003C0A000E0800208C0000000008001964A2
-:1001D0000000000008001A040000000008003CA60F
-:1001E0000000000008003C94000000000800172FE9
-:1001F000000000000800191A000000000800172F76
-:10020000000000000800172F3C0A00130800172FF9
-:100210003C0A001400000000000000000000000084
-:1002200000000000000000000000000000000000CE
-:1002300000000000000000000000000000000000BE
-:1002400000000000000000000000000000000000AE
-:10025000000000000000000000000000000000009E
-:10026000000000000000000000000000000000008E
-:10027000000000000000000000000000000000007E
-:10028000000000000000000000000000000000006E
-:10029000000000000000000000000000000000005E
-:1002A000000000000000000000000000000000004E
-:1002B000000000000000000000000000000000003E
-:1002C000000000000000000000000000000000002E
-:1002D000000000000000000000000000000000001E
-:1002E000000000000000000000000000000000000E
-:1002F00000000000000000000000000000000000FE
-:1003000000000000000000000000000027BDFFE02A
-:100310003C1CC000AFBF001CAFB000188F82014072
-:1003200024030003AF8300EC344200040C002B20B4
-:10033000AF8201403C0100C00C001763AC203FFCC1
-:10034000004018213C0200103C010001AC236E9CCF
-:10035000106200110043102B144000023C020020E8
-:100360003C0200081062000C240501003C0600015C
-:100370008CC66E9C3C04000124845C74000038210F
-:10038000AFA000100C002B3BAFA000143C020020DB
-:100390003C010001AC226E9C240200083C010001DB
-:1003A000AC226EB42402001F3C010001AC226EC4DA
-:1003B000240200163C010001AC226E983C05FFFEB1
-:1003C00034A56F083C0200018C426E9C3C03000285
-:1003D000246390103C0400018C846CC400431023FF
-:1003E00014800002004580212610FA382402F00013
-:1003F000020280240C00178502002021020228231B
-:100400003C0400200082182300651823247BB000E0
-:100410003C03FFFE3463BF080363B8213C0600BF02
-:1004200034C6F0003C0700018CE76CC03C0300BF01
-:100430003463E000008520233C010001AC246EA859
-:10044000008220233C010001AC256E90000528426B
-:100450003C010001AC226E8427620FFC3C010001CC
-:10046000AC226D2027621FFC00DB3023007B1823A9
-:100470003C010001AC246E883C010001AC256EAC4F
-:100480003C010001AC226D24AF86015010E0001148
-:10049000AF8302503C1D00018FBD6CCC03A0F02146
-:1004A0000C001749000000003C0200018C426CD097
-:1004B0003C0300018C636CD42442FE0024630200E0
-:1004C0003C010001AC226CD03C0100011000000492
-:1004D000AC236CD43C1D00018FBD6D2003A0F02126
-:1004E0003C0200018C426CC41040000D26FAFA3820
-:1004F0003C0200018C426CD03C0300018C636CD444
-:100500003C1A00018F5A6CD42442FA38246305C87F
-:100510003C010001AC226CD03C010001AC236CD446
-:100520003C0200018C426CC8144000030000000033
-:100530003C010001AC206CD00C0011510000000007
-:100540008FBF001C8FB0001803E0000827BD0020FB
-:100550003C0200018C426CD03C0300018C636CD4E3
-:1005600027BDFF98AFB000483C1000018E1066B860
-:10057000AFB200503C12000026524100AFBF0060F5
-:10058000AFBE005CAFB50058AFB30054AFB1004C84
-:10059000AFA20034AFA30030AFA00010AFA0001492
-:1005A0008F8600403C04000124845C802405020006
-:1005B0003C010001AC326E800C002B3B0200382164
-:1005C0008F8300403C02F000006218243C0260006F
-:1005D0001062000BA3A0003F240E00013C040001A8
-:1005E00024845C88A3AE003FAFA00010AFA000142D
-:1005F0008F860040240503000C002B3B02003821AD
-:100600008F8202403C03000100431025AF8202406C
-:10061000AF8000488F8200481440000500000000B1
-:10062000AF8000488F8200481040000400000000A6
-:10063000AF8000481000000302E02021AF80004C92
-:1006400002E020213C0500010C002BA834A540F855
-:10065000034020210C002BA8240505C83C02000102
-:100660008C426EA83C0D00018DAD6E883C030001EC
-:100670008C636E843C0800018D086E903C0900017B
-:100680008D296EAC3C0A00018D4A6EB43C0B000112
-:100690008D6B6EC43C0C00018D8C6E983C04000187
-:1006A00024845C9424050400AF42013C8F42013C49
-:1006B0002406000124070001AF400000AF4D0138BF
-:1006C000AF430144AF480148AF49014CAF4A015024
-:1006D000AF4B0154AF4C01582442FF80AF42014060
-:1006E00024020001AFA200100C002B3BAFA00014AD
-:1006F0008F420138AFA200108F42013CAFA200141C
-:100700008F4601448F4701483C04000124845CA0CB
-:100710000C002B3B24050500AFB70010AFBA001446
-:100720008F46014C8F4701503C04000124845CAC8F
-:100730000C002B3B240506003C0200018C426E9C01
-:10074000036038213C06000224C690102448FFFFB5
-:100750000106182400E810240043102B1040000666
-:10076000240509003C04000124845CB8AFA80010F3
-:100770000C002B3BAFA000148F82000CAFA2001026
-:100780008F82003CAFA200148F8600008F87000488
-:100790003C04000124845CC40C002B3B24051000A5
-:1007A0008C0202208C0302248C0602188C07021C87
-:1007B0003C04000124845CCC24051100AFA200108D
-:1007C0000C002B3BAFA30014AF800054AF80011C82
-:1007D0008C020218304200021040000900000000A4
-:1007E0008C0202203C030002346300040043102505
-:1007F000AF42000C8C02021C1000000834420004BE
-:100800008C0202203C0300023463000600431025E2
-:10081000AF42000C8C02021C34420006AF420014AE
-:100820008C020218304200101040000A0000000044
-:100830008C02021C34420004AF4200108C020220E1
-:100840003C03000A34630004004310251000000933
-:10085000AF4200088C0202203C03000A3463000609
-:1008600000431025AF4200088C02021C34420006EF
-:10087000AF42001024020001AF8200A0AF8200B09E
-:100880008F8300548F820054AF8000D0AF8000C0AF
-:1008900010000002246300648F8200540062102361
-:1008A0002C4200651440FFFC000000008C0402088C
-:1008B0008C05020C26E20028AEE2002024020490FF
-:1008C000AEE20010AEE40008AEE5000C26E400083D
-:1008D0008C8200008C830004AF820090AF83009470
-:1008E0008C820018AF8200B49482000AAF82009C10
-:1008F0008F420014AF8200B08F8200B030420004FB
-:100900001440FFFD000000008F8200B03C03EF00A8
-:100910000043102410400021000000008F8200B42A
-:10092000AFA200108F8200908F8300943C040001DE
-:1009300024845CD4AFA300148F8600B08F87009C02
-:100940003C0500010C002B3B34A5200D3C040001AC
-:1009500024845CE0240203C0AFA20010AFA0001406
-:100960008F8601443C07000124E75CE80C002B3B28
-:100970003405DEAD8F82011C34420002AF82011CBF
-:100980008F82022034420004AF8202208F82014015
-:100990003C03000100431025AF82014096E204723F
-:1009A00096E6045296E70462AFA2001096E2048233
-:1009B0003C04000124845D14240512000C002B3B30
-:1009C000AFA2001496F0045232020001104000025F
-:1009D0000000B02124160001320200025440000140
-:1009E00036D60002320200085440000136D6000418
-:1009F000320200105440000136D6000832020020B6
-:100A00005440000136D6001032020040544000012C
-:100A100036D60020320200805440000136D6004015
-:100A200096E6048230C202005440000136D64000EF
-:100A300096E304723062020010400003306201004D
-:100A40001000000336D620005440000136D61000B6
-:100A500096F0046232C24000144000043207009B4A
-:100A600030C2009B14E20007240E000132C22000B5
-:100A70001440000D320200013062009B10E20009B8
-:100A8000240E00013C04000124845D202405130091
-:100A900002003821A3AE003FAFA300100C002B3B97
-:100AA000AFA00014320200015440000136D600808D
-:100AB000320200025440000136D601003202000822
-:100AC0005440000136D602003202001054400001AA
-:100AD00036D60400320200805440000136D60800A9
-:100AE0008C02021830420200104000023C02000852
-:100AF00002C2B0258C0202183042080010400002E9
-:100B00003C02008002C2B0258C0202183042040070
-:100B1000104000023C02010002C2B0258C02021803
-:100B200030420100104000023C02020002C2B02527
-:100B30008C02021830420080104000023C02040087
-:100B400002C2B0258C020218304220001040000280
-:100B50003C02001002C2B0258C0202183042400054
-:100B6000104000023C02002002C2B0258C02021894
-:100B700030421000104000023C02004002C2B0258A
-:100B80008EE204988EE3049CAF420160AF4301649F
-:100B90008EE204A08EE304A4AF420168AF43016C6F
-:100BA0008EE204A88EE304ACAF420170AF4301743F
-:100BB0008EE204288EE3042CAF420178AF43017C1F
-:100BC0008EE204488EE3044CAF420180AF430184BF
-:100BD0008EE204588EE3045CAF420188AF43018C7F
-:100BE0008EE204688EE3046CAF420190AF4301943F
-:100BF0008EE204788EE3047CAF420198AF43019CFF
-:100C00008EE204888EE3048CAF4201A0AF4301A4BE
-:100C10008EE204B08EE304B424040080AF4201A845
-:100C2000AF4301AC0C002BA8240500808C02025CB1
-:100C300027440224AF4201F08C0202602405020026
-:100C4000240600080C002BBFAF4201F83C043B9A7D
-:100C50003484CA0000003821240200062403000264
-:100C6000AF4201F4240203E8AF430204AF430200A1
-:100C7000AF4401FCAF42029424020001AF43029052
-:100C8000AF42029C3C0300010067182190636CD8BE
-:100C90000347102124E70001A043022C2CE2000F9F
-:100CA0001440FFF80347182124E700013C08000125
-:100CB000350840F88F8200403C04000124845D2CFC
-:100CC000240514000002170224420030A062022C06
-:100CD00003471021A040022C8C07021802C03021CB
-:100CE000240205C8AFA200100C002B3BAFA80014D3
-:100CF0003C04000124845D383C05000024A55C8090
-:100D00002406001027B100300220382127B3003418
-:100D10000C0017A3AFB300103C0300018C636CC838
-:100D20001060000A004080218FA300302405FF00DE
-:100D30008FA20034246400FF008520240083182340
-:100D400000431023AFA20034AFA400303C040001E4
-:100D500024845D443C05000024A5410024060108CC
-:100D6000022038210C0017A3AFB3001000409021DF
-:100D700032C200033C010001AC326E8010400045DD
-:100D8000022038218F8200503C03001000431024C1
-:100D900010400016000000008C0202183042004093
-:100DA0001040000F240200018F8200508C030218B3
-:100DB000240E00013C04000124845D50A3AE003FDA
-:100DC000AFA20010AFA300148F87004024051500C8
-:100DD0000C002B3B02C0302110000004000000007A
-:100DE0003C01000100370821A02240F43C0400012E
-:100DF00024845D5C3C05000124A55B403C060001A9
-:100E000024C65BAC00C530238F42001027B30030EE
-:100E10000260382127B1003434420A00AF4200108A
-:100E20000C0017A3AFB100103C04000124845D70D6
-:100E30003C05000124A5B7143C06000124C6BA9065
-:100E400000C5302302603821AF4201080C0017A30F
-:100E5000AFB100103C04000124845D8C3C0500010E
-:100E600024A5BE583C06000124C6C90000C5302395
-:100E7000026038213C010001AC226EF40C0017A383
-:100E8000AFB100103C04000124845DA410000024D4
-:100E9000240516003C04000124845DAC3C050001DF
-:100EA00024A5A10C3C06000124C6A23800C53023AD
-:100EB0000C0017A3AFB300103C04000124845DBCF8
-:100EC0003C05000124A5B2B03C06000124C6B70CC5
-:100ED00000C5302302203821AF4201080C0017A3BF
-:100EE000AFB300103C04000124845DD03C05000138
-:100EF00024A5BA983C06000124C6BE5000C5302384
-:100F0000022038213C010001AC226EF40C0017A332
-:100F1000AFB300103C04000124845DE424051650A6
-:100F200002C03021000038213C010001AC226EF8E3
-:100F3000AFA000100C002B3BAFA0001432C2002069
-:100F40001040002127A700303C04000124845DF0FC
-:100F50003C05000124A5B13C3C06000124C6B2A812
-:100F600000C5302324022000AF42001C27A2003419
-:100F70000C0017A3AFA20010000219000003198291
-:100F80003C04080000641825AE4300282403001028
-:100F9000AF43003C96E30450AF4300408F43004012
-:100FA0003C04000124845E04AFA00014AFA3001031
-:100FB0008F47001C240516603C010001AC226EF036
-:100FC0001000002532C600208EE204488EE3044C57
-:100FD000AF43001C8F42001C2442E0002C42200141
-:100FE0001440000A240E00013C04000124845E1019
-:100FF000A3AE003FAFA00010AFA000148F46001CAE
-:10100000240517000C002B3B000038213C02000097
-:1010100024425CBC00021100000211823C03080063
-:1010200000431025AE42002824020008AF42003CD5
-:1010300096E20450AF4200408F4200403C04000161
-:1010400024845E1CAFA00014AFA200108F47001CC8
-:101050002405180032C600200C002B3B00000000C5
-:101060003C050FFF3C0300018C636EF434A5FFFFC9
-:10107000024030213C0200018C426EF83C04080022
-:101080000065182400031882006418250045102408
-:101090000002108200441025ACC2008032C20180E0
-:1010A00010400056ACC300208F82005C3C030080DF
-:1010B000004310241040000D000000008F820050FB
-:1010C000AFA200108F82005C240E00013C040001DE
-:1010D00024845E28A3AE003FAFA200148F87004097
-:1010E000240519000C002B3B02C030218F820050D8
-:1010F0003C030010004310241040001600000000C4
-:101100008C020218304200401040000F24020001FF
-:101110008F8200508C030218240E00013C04000151
-:1011200024845D50A3AE003FAFA20010AFA3001413
-:101130008F870040240520000C002B3B02C030218B
-:1011400010000004000000003C01000100370821ED
-:10115000A02240F43C04000124845E343C050001DC
-:1011600024A55AC03C06000124C65B3800C53023C4
-:101170008F42000827B300300260382127B10034C5
-:1011800034420E00AF4200080C0017A3AFB10010AC
-:101190003C04000124845E4C3C05000124A5D8B425
-:1011A0003C06000124C6E3C800C530230260382194
-:1011B000AF42010C0C0017A3AFB100103C040001BA
-:1011C00024845E643C05000124A5E9AC3C060001D2
-:1011D00024C6F0F000C53023026038213C01000134
-:1011E000AC226F040C0017A3AFB100103C04000147
-:1011F00024845E7C10000027240521003C040001AB
-:1012000024845E843C05000124A59FC83C0600019F
-:1012100024C6A10400C5302327B1003002203821A4
-:1012200027B300340C0017A3AFB300103C04000137
-:1012300024845E943C05000124A5CAD43C06000128
-:1012400024C6D8AC00C5302302203821AF42010C9F
-:101250000C0017A3AFB300103C04000124845EA46B
-:101260003C05000124A5E84C3C06000124C6E9A485
-:1012700000C53023022038213C010001AC226F045C
-:101280000C0017A3AFB300103C04000124845EB827
-:101290002405215002C03021000038213C0100010A
-:1012A000AC226F10AFA000100C002B3BAFA00014BD
-:1012B0003C110FFF3C0300018C636F043631FFFFCC
-:1012C000024098213C0200018C426F103C0E080045
-:1012D0000071182400031882006E18250051102494
-:1012E00000021082004E1025AE630038AE62007816
-:1012F0008C02021830420040144000042402000115
-:101300003C01000100370821A02240F43C04000108
-:1013100024845EC43C05000124A5E3D03C06000102
-:1013200024C6E52C00C5302327BE003003C0382179
-:1013300027B500340C0017A3AFB500103C01000125
-:10134000AC226EFC00511024000210823C0E0800FA
-:10135000004E1025AE62005032C220001040000640
-:1013600003C038213C02000024425CBC022210244D
-:101370001000000F000210823C04000124845ED89B
-:101380003C05000124A5E5343C06000124C6E6E442
-:1013900000C530230C0017A3AFB500103C010001BD
-:1013A000AC226F1400511024000210823C0E080081
-:1013B000004E1025AE62004832C2400010400005C9
-:1013C00027A700303C02000024425CBC1000000E45
-:1013D000000211003C04000124845EF03C05000181
-:1013E00024A5E6EC3C06000124C6E84400C53023F1
-:1013F00027A200340C0017A3AFA200103C0100018B
-:10140000AC226F0800021100000211823C030800A8
-:1014100000431025AE4200603C04000124845F08B4
-:101420003C05000124A582303C06000124C68650FC
-:1014300000C5302327B100300220382127B3003403
-:101440000C0017A3AFB300103C0E0FFF35CEFFFF0B
-:101450003C04000124845F143C05000024A564685A
-:101460003C06000024C6658800C5302302203821D0
-:101470000240F0213C010001AC226EDC004E102441
-:10148000000210823C15080000551025AFAE004444
-:10149000AFC200B80C0017A3AFB300103C040001AA
-:1014A00024845F203C05000024A565903C060000D4
-:1014B00024C668088FAE004400C5302302203821BE
-:1014C0003C010001AC226ED0004E102400021082BC
-:1014D00000551025AFC200E80C0017A3AFB30010F1
-:1014E0003C04000124845F383C05000024A56810FA
-:1014F0003C06000024C669408FAE004400C530237E
-:10150000022038213C010001AC226EC8004E10249C
-:101510000002108200551025AFC200C00C0017A3B6
-:10152000AFB300103C04000124845F503C0500016F
-:1015300024A5FAD03C06000124C6FBA88FAE0044C7
-:1015400000C53023022038213C010001AC226ED4BA
-:10155000004E10240002108200551025AFC200C8B2
-:101560000C0017A3AFB300103C04000124845F5C9F
-:101570003C05000124A5C93C3C06000124C6CA2044
-:1015800000C5302302203821AF4201100C0017A300
-:10159000AFB300103C04000124845F6C3C050001E3
-:1015A00024A5C9103C06000124C6C93400C5302357
-:1015B00002203821AF4201240C0017A3AFB3001062
-:1015C0003C04000124845F7C3C05000124A55A8072
-:1015D0003C06000124C65AAC00C530230220382145
-:1015E000AF420120AF4201140C0017A3AFB30010AB
-:1015F0003C04000124845F883C05000124A5F29886
-:101600003C06000124C6F6B400C530230220382170
-:10161000AF4201180C0017A3AFB300108FAE004407
-:101620003C010001AC226F18004E10240002108211
-:10163000005510250C003FC3AFC200D00C003C4049
-:10164000000000000C0027A800000000AC000228E9
-:10165000AC00022C96E204502442FFFFAF42003857
-:1016600096E20460AF42008032C2400014400003A2
-:101670000000000096E20480AF42008496E70490E8
-:1016800050E000012407080024E2FFFFAF42008879
-:10169000AF42007C2402080010E2000F32C240007A
-:1016A000104000032402040010E2000B00000000C0
-:1016B000240E00013C04000124845F98A3AE003F87
-:1016C00096E604902405217002C03821AFA00010D6
-:1016D0000C002B3BAFA000148F4301388F4401381E
-:1016E00024020001A34205C2AF430094AF44009816
-:1016F000AFA00010AFA000148F4600808F47008479
-:101700003C04000124845FA40C002B3B2405220030
-:101710000C0024A43C1108003C1433D83694CB5858
-:101720003C020800344200803C04000124845FB085
-:101730003C05000024A55D003C06000024C65D1C9D
-:1017400000C5302327A70030AF8200602402FFFFCE
-:10175000AF82006427A200340C0017A3AFA20010D0
-:101760003C010001AC226EB800021100000211829F
-:10177000005110250C0018FCAE4200008F82024080
-:101780003C03000100431025AF8202403C020000F0
-:1017900024424034AF820244AF8002408F82006016
-:1017A00000511024144000053C0308008F820060A3
-:1017B000004310241040FFFD000000000C003C4DD1
-:1017C000000088213C020100AFA200208F530018C6
-:1017D000240200FF56620001267100018C020228DB
-:1017E0001622000E001330C08F42033C2442000139
-:1017F000AF42033C8F42033C8C0202283C040001B0
-:1018000024845C243C050009AFA00014AFA20010A2
-:101810008FA600201000003F34A5010000D7102142
-:101820008FA300208FA40024AC4304C0AC4404C4A4
-:1018300000C018218F4401788F45017C00001021E1
-:1018400024070004AFA70010AFB100148F48000CAC
-:1018500024C604C002E63021AFA800188F48010C4E
-:101860002407000800A3282100A3482B0082202180
-:101870000100F809008920211440000B240700080A
-:101880008F820120AFA200108F8201243C0400014E
-:1018900024845C2C3C050009AFA200148FA6002014
-:1018A0001000001C34A502008F4401608F450164C4
-:1018B0008F43000CAF5100188F86012024020010C6
-:1018C000AFA20010AFB10014AFA300188F42010CFB
-:1018D0000040F80924C6001C14400010000000005D
-:1018E0008F42034024420001AF4203408F42034035
-:1018F0008F820120AFA200108F8201243C040001DE
-:1019000024845C343C050009AFA200148FA600209B
-:1019100034A503000C002B3B026038218F4202E407
-:1019200024420001AF4202E48F4202E493A2003F4E
-:10193000104000693C02070034423000AFA200288A
-:101940008F530018240200FF126200020000882159
-:10195000267100018C0202281622000E001330C0EE
-:101960008F42033C24420001AF42033C8F42033CC0
-:101970008C0202283C04000124845C243C050009FC
-:10198000AFA00014AFA200108FA600281000003FE7
-:1019900034A5010000D710218FA300288FA4002CAC
-:1019A000AC4304C0AC4404C400C018218F44017887
-:1019B0008F45017C0000102124070004AFA7001010
-:1019C000AFB100148F48000C24C604C002E63021D9
-:1019D000AFA800188F48010C2407000800A3282195
-:1019E00000A3482B008220210100F8090089202152
-:1019F0001440000B240700088F820120AFA20010C2
-:101A00008F8201243C04000124845C2C3C050009E5
-:101A1000AFA200148FA600281000001C34A50200FD
-:101A20008F4401608F4501648F43000CAF51001853
-:101A30008F86012024020010AFA20010AFB1001465
-:101A4000AFA300188F42010C0040F80924C6001C07
-:101A500014400010000000008F42034024420001A7
-:101A6000AF4203408F4203408F820120AFA200109B
-:101A70008F8201243C04000124845C343C0500096D
-:101A8000AFA200148FA6002834A503000C002B3B46
-:101A9000026038218F4202F024420001AF4202F07E
-:101AA0008F4202F03C04000124845FC0AFA000100C
-:101AB000AFA000148FA60028240523000C002B3BA8
-:101AC0000000382110000004000000008C020264B5
-:101AD00010400005000000008F8200A0304200048A
-:101AE0001440FFFA000000008F82004434420004DA
-:101AF000AF8200448F42030824420001AF42030832
-:101B00008F4203088F8200D88F8300D400431023B4
-:101B10002442FF80AF4200908F4200902842FF8114
-:101B200010400006240200018F4200908F430144C0
-:101B300000431021AF42009024020001AF42008C0C
-:101B400032C2000810400006000000008F8202141C
-:101B50003C0381003042FFFF00431025AF82021496
-:101B60003C0300018C636D94306200021040000958
-:101B7000306200013C04000124845FCC3C0500007D
-:101B800024A56D503C06000024C671C81000001248
-:101B900000C5302310400009000000003C04000193
-:101BA00024845FDC3C05000024A571D03C060000C5
-:101BB00024C676781000000800C530233C040001DC
-:101BC00024845FEC3C05000024A569483C06000025
-:101BD00024C66D4800C5302327A7003027A2003453
-:101BE0000C0017A3AFA200103C010001AC226ECC88
-:101BF0003C0200018C426ECC3C0308000002110044
-:101C00000002118200431025AE4200408F8200A0E6
-:101C1000AFA200108F8200B0AFA200148F86005CCC
-:101C20008F87011C3C04000124845FFC3C010001FF
-:101C3000AC366EA43C010001AC206E943C01000166
-:101C4000AC3C6E8C3C010001AC3B6EBC3C01000125
-:101C5000AC376EC03C010001AC3A6EA00C002B3BCF
-:101C6000240524008F820200AFA200108F82022080
-:101C7000AFA200148F8600448F8700503C040001FF
-:101C8000248460080C002B3B240525008F83006012
-:101C90000074100B0242000A0200F821000000004C
-:101CA0000000000D8FBF00608FBE005C8FB5005834
-:101CB0008FB300548FB200508FB1004C8FB00048EA
-:101CC00003E0000827BD006827BDFFE03C040001D9
-:101CD00024846014240526000000302100003821EF
-:101CE000AFBF0018AFA000100C002B3BAFA000143A
-:101CF0008FBF001803E0000827BD002003E00008A4
-:101D00000000000003E000080000000000000000E8
-:101D100000000000000000000000000000000000C3
-:101D200003E000080000000003E0000800000000DD
-:101D300027BDFDE027A500183C04DEAD3484BEEFCE
-:101D4000AFBF02188F8201503C03001F3463FFFFB6
-:101D5000AFA4001800A2282300A328248CA200000E
-:101D60001044000A00000000AFA500108CA2000083
-:101D7000AFA200148F8601508F8702503C040001EF
-:101D80002484601C0C002B3B240527008FBF021805
-:101D900003E0000827BD022027BDFFE03C06ABBAE8
-:101DA00034C6BABEAFB000183C1000043C07007F38
-:101DB00034E7FFFFAFBF001C001028408E04000076
-:101DC0008CA30000ACA00000AE0600008CA20000B6
-:101DD000ACA3000010460005AE04000000A0802166
-:101DE00000F0102B1040FFF5001028403C040001CB
-:101DF00024846028240528000200302100003821B6
-:101E0000AFA000100C002B3BAFA00014020010216B
-:101E10008FBF001C8FB0001803E0000827BD002012
-:101E20008C0202243047003F10E000100080302177
-:101E3000000028212403002000E3102410400002A9
-:101E40000006304200A62821000318421460FFFB60
-:101E500000E310242402F00000A228243402FFFF33
-:101E60000045102B144000033C0200011000000844
-:101E70003C0200013442FFFF008518230043102B71
-:101E80001440000300A010213C02FFFE008210213C
-:101E900003E000080000000027BDFFD0AFB5002818
-:101EA0008FB50040AFB2002000A09021AFB1001C60
-:101EB00024C60003AFBF002CAFB30024AFB000189E
-:101EC0008EA200002403FFFC00C380240050102BCE
-:101ED0001440001B00E088218E330000AFB00010DA
-:101EE0008EA20000AFA200148E270000240530004F
-:101EF0000C002B3B024030218E230000007020217B
-:101F00000064102B10400007024028218CA2000022
-:101F1000AC620000246300040064102B1440FFFB3B
-:101F200024A500048EA2000000501023AEA20000E1
-:101F30008E220000005010211000000BAE22000085
-:101F40002402002DA0820000AFB000108EA200007D
-:101F500002409821AFA200148E2700002405310012
-:101F60000C002B3B02603021026010218FBF002C3F
-:101F70008FB500288FB300248FB200208FB1001CD2
-:101F80008FB0001803E0000827BD003027BDFFE830
-:101F90003C1CC0003C05FFFE3C0300018C636E84CA
-:101FA0003C0400018C846E9034A5BF0824021FFC01
-:101FB0003C010001AC226CD03C0200C03C0100019D
-:101FC000AC226CD43C020020AFBF00103C0100C02A
-:101FD000AC201FFC0043102300441023245BB000FE
-:101FE0000365B8213C1D00018FBD6CCC03A0F0211E
-:101FF0003C0400C0348402003C1A00C03C0300C012
-:10200000346307C824021DFC3C010001AC226CD0E3
-:10201000240218343C010001AC246CD43C010001C2
-:10202000AC226CD03C010001AC236CD40C00180D28
-:10203000375A02008FBF001003E0000827BD0018C8
-:1020400027BDFFC83C04000124846034240532000D
-:102050003C0200018C426CD03C0300018C636CD4C8
-:102060000000302103603821AFBF0030AFB3002C37
-:10207000AFB20028AFB10024AFB00020AFA2001C67
-:10208000AFA30018AFB700100C002B3BAFBA001481
-:102090000C001916000000008F8202403442000438
-:1020A000AF82024024020001AF4200003C02000166
-:1020B00000571021904240F4104000922403FFFC8E
-:1020C0003C1000012610AC733C1200012652A84CB3
-:1020D00002121023004380248FA3001C3C04000143
-:1020E000248460400070102B1440001A27B300189D
-:1020F0008FB100182405300002403021AFB000102D
-:10210000AFA300140C002B3B022038218FA3001832
-:10211000007020210064102B104000070240302185
-:102120008CC20000AC620000246300040064102B29
-:102130001440FFFB24C600048FA2001C0050102393
-:10214000AFA2001C8E620000005010211000000A97
-:10215000AE6200000240882124053100AFB00010BB
-:10216000AFA300148FA70018022030212402002DF5
-:102170000C002B3BA0820000240700208FA3001C32
-:102180003C0400012484605C241200203C01000116
-:10219000AC316EB02C6200201440001D27B1001835
-:1021A0008FB00018240530003C06000124C66F5093
-:1021B000AFA70010AFA300140C002B3B0200382186
-:1021C0008FA300183C04000124846F502465002074
-:1021D0000065102B10400007000000008C820000FA
-:1021E000AC620000246300040065102B1440FFFB68
-:1021F000248400048FA2001C00521023AFA2001CF4
-:102200008E220000005210211000000BAE220000B0
-:102210003C10000126106F5024053100AFA70010BC
-:10222000AFA300148FA70018020030212402002D54
-:102230000C002B3BA0820000240700203C0400017E
-:10224000248460708FA3001C241200203C01000134
-:10225000AC306EE42C6200201440001D27B1001841
-:102260008FB00018240530003C06000124C66F70B2
-:10227000AFA70010AFA300140C002B3B02003821C5
-:102280008FA300183C04000124846F702465002093
-:102290000065102B10400007000000008C82000039
-:1022A000AC620000246300040065102B1440FFFBA7
-:1022B000248400048FA2001C00521023AFA2001C33
-:1022C0008E220000005210211000000BAE220000F0
-:1022D0003C10000126106F7024053100AFA70010DC
-:1022E000AFA300148FA70018020030212402002D94
-:1022F0000C002B3BA08200003C01000110000031CB
-:10230000AC306EE03C1000012610821F3C12000130
-:102310002652809C02121023004380248FA3001CAD
-:102320003C040001248460840070102B1440001AC7
-:1023300027B300188FB10018240530000240302167
-:10234000AFB00010AFA300140C002B3B02203821CB
-:102350008FA30018007020210064102B104000078C
-:10236000024030218CC20000AC62000024630004F3
-:102370000064102B1440FFFB24C600048FA2001C35
-:1023800000501023AFA2001C8E62000000501021EC
-:102390001000000AAE6200000240882124053100CE
-:1023A000AFB00010AFA300148FA700180220302197
-:1023B0002402002D0C002B3BA08200003C010001F8
-:1023C000AC316EB03C0300018C636EB0240204009B
-:1023D0000060F809AF8200708FBF00308FB3002C0F
-:1023E0008FB200288FB100248FB0002003E00008D6
-:1023F00027BD003800000000000000008F82004070
-:102400003C03F000004310243C036000144300062A
-:10241000000000008F8200502403FF80004310243E
-:1024200034420055AF8200508F820054244203E8AA
-:10243000AF820058240201F4AF4200E024020004FD
-:10244000AF4200E824020002AF4001B0AF4000E418
-:10245000AF4200DCAF4000D8AF4000D403E000083A
-:10246000AF4000D08F8200542442000503E00008F2
-:10247000AF82007827BDFFE8AFBF00108F82005405
-:10248000244203E8AF8200583C02080002C2102434
-:10249000104000043C02F7FF3442FFFF02C2B024A8
-:1024A000369400403C0200018C426DA81040001799
-:1024B0003C0202003C0300018C636F1C106000169C
-:1024C0000282A0253C0200018C426E44144000129E
-:1024D0003C0202003C0200018C426D943042000339
-:1024E0001440000D3C0202008F8302243C020002D3
-:1024F0008C428FEC106200083C0202000C003DAFE1
-:1025000000000000100000043C0202000C00419694
-:10251000000000003C02020002C210241040000330
-:10252000000000000C001F4B000000008F4200D88C
-:102530008F4300DC24420001AF4200D80043102B3F
-:102540001440000300000000AF4000D83694008023
-:102550008C0302381060000C000000008F4201B0B4
-:10256000244203E8AF4201B00043102B14400006A0
-:1025700000000000934205C5144000030000000065
-:102580000C001DA0000000008FBF001003E0000839
-:1025900027BD001803E000080000000027BDFFD899
-:1025A000AFBF00208F43002C8F42003810620059CB
-:1025B000000000003C02000100571021904240F052
-:1025C00010400026240700088F4401708F450174D5
-:1025D0008F48000C8F86012024020020AFA200103B
-:1025E000AFA30014AFA800188F42010C0040F809F7
-:1025F00024C6001C14400011240200013C0100010B
-:1026000000370821A02240F08F820124AFA20010E1
-:102610008F8201283C04000124846128AFA20014A9
-:102620008F46002C8F8701203C0500090C002B3BB6
-:1026300034A509001000005C000000008F42030078
-:1026400024420001AF4203008F4203008F42002C5E
-:10265000A34005C110000027AF4200388F4401702D
-:102660008F4501748F43002C8F48000C8F8601200A
-:1026700024020080AFA20010AFA30014AFA800187E
-:102680008F42010C0040F80924C6001C14400011C0
-:10269000240200013C01000100370821A02240F182
-:1026A0008F820124AFA200108F8201283C04000118
-:1026B00024846134AFA200148F46002C8F87012040
-:1026C0003C0500090C002B3B34A51100100000361E
-:1026D000000000008F4203008F43002C24420001C1
-:1026E000AF4203008F42030024020001A34205C150
-:1026F000AF4300383C01000100370821A02040F121
-:102700003C01000100370821A02040F01000002605
-:10271000AF400034934205C11040001D000000008E
-:10272000A34005C18F8200403042000114400008E0
-:10273000000020218C0301042402000150620005E6
-:10274000240400018C020264104000030080102168
-:102750002404000100801021104000060000000049
-:102760008F42030C24420001AF42030C100000080A
-:102770008F42030C8F82004434420004AF82004435
-:102780008F42030824420001AF4203088F4203082E
-:102790003C01000100370821A02040F03C0100016D
-:1027A00000370821A02040F18F42000010400007B0
-:1027B00000000000AF80004C8F82004C1040FFFDF5
-:1027C000000000001000000500000000AF8000487D
-:1027D0008F8200481040FFFD000000008F820060E3
-:1027E0003C03FF7F3463FFFF00431024AF8200608F
-:1027F0008F420000104000030000000010000002A3
-:10280000AF80004CAF8000488FBF002003E000087D
-:1028100027BD002803E000080000000027BDFFD806
-:10282000AFBF00208F4300448F42007C106200291C
-:10283000240700088F4401688F45016C8F48000C05
-:102840008F86012024020040AFA20010AFA3001425
-:10285000AFA800188F42010C0040F80924C6001CE4
-:1028600014400011240200013C010001003708213E
-:10287000A02240F28F820124AFA200108F82012893
-:102880003C0400012484613CAFA200148F46004444
-:102890008F8701203C0500090C002B3B34A5130059
-:1028A0001000000F000000008F42030424420001CA
-:1028B000AF4203048F4203048F420044AF42007CC6
-:1028C0003C01000100370821A02040F21000000464
-:1028D000AF4000783C01000100370821A02040F201
-:1028E0008F4200001040000700000000AF80004C45
-:1028F0008F82004C1040FFFD00000000100000051A
-:1029000000000000AF8000488F8200481040FFFDAB
-:10291000000000008F8200603C03FEFF3463FFFF75
-:1029200000431024AF8200608F420000104000037B
-:102930000000000010000002AF80004CAF80004893
-:102940008FBF002003E0000827BD002803E0000837
-:10295000000000003C0200018C426DA827BDFFA8CA
-:10296000AFBF0050AFBE004CAFB50048AFB300449E
-:10297000AFB20040AFB1003CAFB00038104000D55E
-:102980008F9000448F4200D0244300012842000B66
-:10299000144000E4AF4300D08F42000430420002F4
-:1029A0001440009CAF4000D08F4200043C03000163
-:1029B0008C636D9834420002AF420004240200018F
-:1029C000146200033C020600100000023442300092
-:1029D00034421000AFA200208F4A0018AFAA003482
-:1029E00027AA0020AFAA002C8FAA0034240200FFDF
-:1029F0001142000200001821254300018C02022828
-:102A0000006098211662000E3C0500098F42033CCD
-:102A100024420001AF42033C8F42033C8C02022857
-:102A20008FA700343C0400012484610CAFA0001483
-:102A3000AFA200108FA600201000007034A5050082
-:102A40008FAA0034000A38C000F710218FA300209D
-:102A50008FA40024AC4304C0AC4404C48F8300544E
-:102A60008F820054247103E8022210232C4203E9D0
-:102A70001040001B0000A82100E09021265E04C049
-:102A80008F4401788F45017C02401821240A0004FC
-:102A9000AFAA0010AFB300148F48000C0000102143
-:102AA00002FE3021AFA800188F48010C240700084F
-:102AB00000A3282100A3482B008220210100F8094F
-:102AC0000089202154400006241500018F82005403
-:102AD000022210232C4203E91440FFE90000000009
-:102AE00032A200FF54400018AF5300188F42037801
-:102AF00024420001AF4203788F4203788F82012085
-:102B00008FAA002C8FA70034AFA200108F8201245F
-:102B10003C04000124846118AFA200148D4600001B
-:102B20003C0500091000003534A506008F4203085B
-:102B30002415000124420001AF4203088F4203081C
-:102B40001000001E32A200FF8F8300548F820054B9
-:102B5000247103E8022210232C4203E910400016DE
-:102B60000000A8213C1E0020241200108F42000CFF
-:102B70008F4401608F4501648F860120AFB2001041
-:102B8000AFB30014005E1025AFA200188F42010CF5
-:102B9000240700080040F80924C6001C1440FFE385
-:102BA000000000008F820054022210232C4203E90F
-:102BB0001440FFEE0000000032A200FF144000119C
-:102BC0003C0500098F42037824420001AF4203789C
-:102BD0008F4203788F8201208FAA002C8FA70034A8
-:102BE000AFA200108F8201243C04000124846120E4
-:102BF000AFA200148D46000034A507000C002B3B4B
-:102C0000000000008F4202EC24420001AF4202ECBF
-:102C10008F4202EC8F4200043042000150400029F4
-:102C2000361000403C02040002C210241040001381
-:102C30002404FFDF8F4202508F4302548F4401B4BB
-:102C400014640006361000408F4202708F430274F5
-:102C50008F4401B8106400072402FFDF8F42025046
-:102C60008F4302548F4402708F450274100000128B
-:102C70003A1000201000002B020280248F420250E4
-:102C80008F4302548F4501B414650006020480246A
-:102C90008F4202708F4302748F4401B85064002148
-:102CA000361000408F4202508F4302548F4402700E
-:102CB0008F4502743A100040AF4301B41000001970
-:102CC000AF4501B88F4200D4244300011000001129
-:102CD000284200338F4200043042000110400009B6
-:102CE0003C02040002C21024104000042402FFDF52
-:102CF000020280241000000B361000401000000972
-:102D0000361000608F4200D436100040244300018A
-:102D1000284201F514400003AF4300D4AF4000D473
-:102D20003A100020AF9000442402FF7F0282A024CA
-:102D30008FBF00508FBE004C8FB500488FB300444A
-:102D40008FB200408FB1003C8FB0003803E0000824
-:102D500027BD005803E00008000000003C0200010D
-:102D60008C426DA827BDFFB0AFBF0048AFBE004486
-:102D7000AFB50040AFB3003CAFB20038AFB10034E4
-:102D8000104000C7AFB000308F4200D02443000194
-:102D90002842000B144000DAAF4300D08F420004F9
-:102DA0003042000214400097AF4000D08F42000430
-:102DB0003C0300018C636D9834420002AF42000472
-:102DC00024020001146200033C020600100000020D
-:102DD0003442300034421000AFA20020000018211D
-:102DE0008F5E001827AA0020240200FF13C20002F1
-:102DF000AFAA002C27C300018C020228006090219A
-:102E00001642000E001E38C08F42033C24420001CF
-:102E1000AF42033C8F42033C8C0202283C04000179
-:102E20002484610C3C050009AFA00014AFA200107F
-:102E30008FA600201000006D34A5050000F71021BA
-:102E40008FA300208FA40024AC4304C0AC4404C46E
-:102E50008F8300548F820054247003E802021023F1
-:102E60002C4203E91040001B0000982100E088215B
-:102E7000263504C08F4401788F45017C022018213B
-:102E8000240A0004AFAA0010AFB200148F48000C4F
-:102E90000000102102F53021AFA800188F48010C66
-:102EA0002407000800A3282100A3482B008220212A
-:102EB0000100F80900892021544000062413000174
-:102EC0008F820054020210232C4203E91440FFE9D0
-:102ED00000000000326200FF54400017AF5200189B
-:102EE0008F42037824420001AF4203788F42037877
-:102EF0008F8201208FAA002CAFA200108F820124A4
-:102F00003C040001248461183C050009AFA20014B0
-:102F10008D4600001000003534A506008F420308DE
-:102F20002413000124420001AF4203088F4203082A
-:102F30001000001E326200FF8F8300548F82005405
-:102F4000247003E8020210232C4203E9104000160B
-:102F5000000098213C150020241100108F42000C25
-:102F60008F4401608F4501648F860120AFB100104E
-:102F7000AFB2001400551025AFA200188F42010C0B
-:102F8000240700080040F80924C6001C1440FFE391
-:102F9000000000008F820054020210232C4203E93B
-:102FA0001440FFEE00000000326200FF14400011E8
-:102FB000000000008F42037824420001AF420378F2
-:102FC0008F4203788F8201208FAA002CAFA20010BD
-:102FD0008F8201243C040001248461203C05000907
-:102FE000AFA200148D46000034A507000C002B3B57
-:102FF00003C038218F4202EC24420001AF4202ECB0
-:103000008F4202EC8F420004304200011040001851
-:10301000240400018F4202508F4302548F4501B4B3
-:103020003C01000114650006A0246CF18F4202707F
-:103030008F4302748F4401B8106400210000000027
-:103040008F4202508F4302543C04000190846CF084
-:103050008F4602708F47027438840001AF4301B479
-:10306000AF4701B83C01000110000025A0246CF01E
-:103070008F4200D43C010001A0206CF024430001E9
-:10308000284200331440001EAF4300D43C0200012C
-:1030900090426CF1AF4000D410000017384200019C
-:1030A0008F42000430420001104000080000000080
-:1030B0000C00565A000020213C010001A0206CF1B8
-:1030C0003C0100011000000EA0206CF08F4200D4E3
-:1030D0003C010001A0206CF024430001284201F5CE
-:1030E00014400007AF4300D43C02000190426CF151
-:1030F000AF4000D4004210263C010001A0226CF138
-:103100003C0300018C636D98240200021462000CE1
-:103110003C0300023C03000190636CF124020001B7
-:103120005462001F000020213C02000190426CF01C
-:103130001443001B24040005100000192404000699
-:103140003C0200028C428FF4004310241040000B1C
-:10315000240200013C03000190636CF154620010F2
-:10316000000020213C02000190426CF01443000C4E
-:10317000240400031000000A240400043C0300019E
-:1031800090636CF114620006000020213C020001F3
-:1031900090426CF024040001504400012404000219
-:1031A0000C00565A000000002402FF7F0282A02477
-:1031B0008FBF00488FBE00448FB500408FB3003CE6
-:1031C0008FB200388FB100348FB0003003E00008B8
-:1031D00027BD005003E00008000000003C02000191
-:1031E0008C426DA827BDFFB0AFBF0048AFBE004402
-:1031F000AFB50040AFB3003CAFB20038AFB1003460
-:10320000104000DEAFB000308F4200D03C0400011F
-:103210008C846D98244300012842000BAF4400E8E1
-:10322000144000FEAF4300D08F4200043042000241
-:1032300014400095AF4000D08F4200043442000299
-:10324000AF42000424020001148200033C02060085
-:10325000100000023442300034421000AFA20020BF
-:10326000000018218F5E001827AA0020240200FF0A
-:1032700013C20002AFAA002C27C300018C0202284F
-:10328000006090211642000E001E38C08F42033CA1
-:1032900024420001AF42033C8F42033C8C020228CF
-:1032A0003C0400012484610C3C050009AFA000141B
-:1032B000AFA200108FA600201000006D34A50500FD
-:1032C00000F710218FA300208FA40024AC4304C07A
-:1032D000AC4404C48F8300548F820054247003E8EC
-:1032E000020210232C4203E91040001B0000982129
-:1032F00000E08821263504C08F4401788F45017C89
-:1033000002201821240A0004AFAA0010AFB2001452
-:103310008F48000C0000102102F53021AFA80018E2
-:103320008F48010C2407000800A3282100A3482B84
-:10333000008220210100F809008920215440000664
-:10334000241300018F820054020210232C4203E94F
-:103350001440FFE900000000326200FF54400017F3
-:10336000AF5200188F42037824420001AF42037825
-:103370008F4203788F8201208FAA002CAFA2001009
-:103380008F8201243C040001248461183C0500095B
-:10339000AFA200148D4600001000003534A50600D1
-:1033A0008F4203082413000124420001AF420308A6
-:1033B0008F4203081000001E326200FF8F8300540A
-:1033C0008F820054247003E8020210232C4203E988
-:1033D00010400016000098213C1500202411001018
-:1033E0008F42000C8F4401608F4501648F8601205D
-:1033F000AFB10010AFB2001400551025AFA20018F5
-:103400008F42010C240700080040F80924C6001C64
-:103410001440FFE3000000008F82005402021023DA
-:103420002C4203E91440FFEE00000000326200FF6E
-:1034300014400011000000008F4203782442000174
-:10344000AF4203788F4203788F8201208FAA002C2D
-:10345000AFA200108F8201243C040001248461206B
-:103460003C050009AFA200148D46000034A50700FA
-:103470000C002B3B03C038218F4202EC2442000198
-:10348000AF4202EC8F4202EC8F4200043042000156
-:10349000104000333C02040002C210241040001708
-:1034A00000000000934205C08F4402508F45025433
-:1034B0008F4301B43442002014A30006A34205C088
-:1034C0008F4202708F4302748F4401B81064000869
-:1034D000000000008F4202508F430254934405C005
-:1034E0008F4602708F470274100000163884004027
-:1034F000934205C010000048304200BF934205C00F
-:103500008F4402508F4502548F4301B4304200BFB4
-:1035100014A30006A34205C08F4202708F430274B9
-:103520008F4401B81064000B000000008F4202506D
-:103530008F430254934405C08F4602708F47027434
-:1035400038840020AF4301B4AF4701B81000003306
-:10355000A34405C0934205C01000002F3442002050
-:10356000934205C08F4300D434420020A34205C0DB
-:103570002462000110000023286300338F4200E41E
-:103580008F4300E024420001AF4200E40043102AD0
-:1035900014400006240300018F4200E81443000297
-:1035A000AF4000E424030004AF4300E88F4200046E
-:1035B000304200011040000D3C02040002C2102401
-:1035C0001040000700000000934205C03442004054
-:1035D000A34205C0934205C01000000F304200DF37
-:1035E000934205C01000000C34420060934205C0B5
-:1035F0008F4300D434420020A34205C0246200015E
-:10360000286300FB14600005AF4200D4934205C05C
-:10361000AF4000D438420040A34205C0934205C0E9
-:103620008F4300E83042007FA34205C0240200011E
-:103630001462000500000000934405C0000421024C
-:1036400010000003348400F0934405C03484000F5C
-:103650000C005640000000002402FF7F0282A024DC
-:103660008FBF00488FBE00448FB500408FB3003C31
-:103670008FB200388FB100348FB0003003E0000803
-:1036800027BD005003E000080000000027BDFFB088
-:10369000274401C026E30028246504000065102BA0
-:1036A000AFBF0048AFBE0044AFB50040AFB3003C71
-:1036B000AFB20038AFB1003410400007AFB00030F7
-:1036C0008C820000AC620000246300040065102BB3
-:1036D0001440FFFB248400048C020080AEE200440E
-:1036E0008C0200C0AEE200408C020084AEE20030EA
-:1036F0008C020084AEE2023C8C020088AEE2024002
-:103700008C02008CAEE202448C020090AEE20248D1
-:103710008C020094AEE2024C8C020098AEE20250A1
-:103720008C02009CAEE202548C0200A0AEE2025871
-:103730008C0200A4AEE2025C8C0200A8AEE2026041
-:103740008C0200ACAEE202648C0200B0AEE2026811
-:103750008C0200B4AEE2026C8C0200B8AEE20270E1
-:103760008C0200BC24040001AEE20274AEE000341E
-:1037700000041080005710218EE300348C42023C7C
-:1037800024840001006218212C82000FAEE3003473
-:103790001440FFF8000410808C0200CCAEE2004818
-:1037A0008C0200D0AEE2004C8C0200E0AEE201F8E8
-:1037B0008C0200E4AEE201FC8C0200E8AEE2020002
-:1037C0008C0200ECAEE202048C0200F0AEE20208D1
-:1037D0008EE400C08EE500C48C0200FC0045102B76
-:1037E0001040000B000000008EE200C08EE300C419
-:1037F0002404000124050000006518210065302B19
-:103800000044102100461021AEE200C0AEE300C427
-:103810008C0200FC8EE400C08EE500C42408FFFF8B
-:1038200024090000004018210000102100882024F5
-:1038300000A928240082202500A32825AEE400C08A
-:10384000AEE500C48EE400D08EE500D48C0200F416
-:103850000045102B1040000B000000008EE200D04D
-:103860008EE300D424040001240500000065182123
-:103870000065302B0044102100461021AEE200D03C
-:10388000AEE300D48C0200F48EE400D08EE500D4C8
-:1038900000401821000010210088202400A92824BD
-:1038A0000082202500A32825AEE400D0AEE500D498
-:1038B0008EE400C88EE500CC8C0200F80045102B89
-:1038C0001040000B000000008EE200C88EE300CC28
-:1038D0002404000124050000006518210065302B38
-:1038E0000044102100461021AEE200C8AEE300CC37
-:1038F0008C0200F88EE400C88EE500CC0040182150
-:10390000000010210088202400A9282400822025FE
-:1039100000A3282524020008AEE400C8AEE500CCD0
-:10392000AFA20010AFA000148F42000C8C0402085C
-:103930008C05020CAFA200188F42010C26E600286D
-:103940000040F80924070400104000F03C02040085
-:10395000AFA20020934205C6104000890000182144
-:103960008F5E001827AA0020240200FF13C2000265
-:10397000AFAA002C27C300018C020228006090210E
-:103980001642000E001E38C08F42033C2442000144
-:10399000AF42033C8F42033C8C0202283C040001EE
-:1039A0002484610C3C050009AFA00014AFA20010F4
-:1039B0008FA600201000006B34A5050000F7102131
-:1039C0008FA300208FA40024AC4304C0AC4404C4E3
-:1039D0008F8300548F820054247003E80202102366
-:1039E0002C4203E91040001B0000982100E08821D0
-:1039F000263504C08F4401788F45017C02201821B0
-:103A0000240A0004AFAA0010AFB200148F48000CC3
-:103A10000000102102F53021AFA800188F48010CDA
-:103A20002407000800A3282100A3482B008220219E
-:103A30000100F809008920215440000624130001E8
-:103A40008F820054020210232C4203E91440FFE944
-:103A500000000000326200FF54400017AF5200180F
-:103A60008F42037824420001AF4203788F420378EB
-:103A70008F8201208FAA002CAFA200108F82012418
-:103A80003C040001248461183C050009AFA2001425
-:103A90008D4600001000003334A506008F42030855
-:103AA0002413000124420001AF4203088F4203089F
-:103AB0001000001C326200FF8F8300548F8200547C
-:103AC000247003E8020210232C4203E91040001482
-:103AD00000009821241100108F42000C8F440160D7
-:103AE0008F4501648F860120AFB10010AFB2001482
-:103AF000AFA200188F42010C240700080040F8090B
-:103B000024C6001C1440FFE5000000008F82005412
-:103B1000020210232C4203E91440FFEF00000000D2
-:103B2000326200FF54400012240200018F420378E9
-:103B300024420001AF4203788F4203788F82012034
-:103B40008FAA002CAFA200108F8201243C04000138
-:103B5000248461203C050009AFA200148D460000BA
-:103B600034A507000C002B3B03C0382100001021B6
-:103B70001440005B240200011000006500000000FA
-:103B80008F510018240200FF122200020000802141
-:103B9000263000018C0202281602000E001130C0EF
-:103BA0008F42033C24420001AF42033C8F42033C5E
-:103BB0008C0202283C040001248460F43C050009C6
-:103BC000AFA00014AFA200108FA600201000003F8D
-:103BD00034A5010000D710218FA300208FA400245A
-:103BE000AC4304C0AC4404C400C018218F44017825
-:103BF0008F45017C0000102124070004AFA70010AE
-:103C0000AFB000148F48000C24C604C002E6302177
-:103C1000AFA800188F48010C2407000800A3282132
-:103C200000A3482B008220210100F80900892021EF
-:103C30001440000B240700088F820120AFA200105F
-:103C40008F8201243C040001248460FC3C050009AF
-:103C5000AFA200148FA600201000001C34A50200A3
-:103C60008F4401608F4501648F43000CAF500018F2
-:103C70008F86012024020010AFA20010AFB0001404
-:103C8000AFA300188F42010C0040F80924C6001CA5
-:103C900054400011240200018F42034024420001DD
-:103CA000AF4203408F4203408F820120AFA2001039
-:103CB0008F8201243C040001248461043C05000936
-:103CC000AFA200148FA6002034A503000C002B3BEC
-:103CD00002203821000010211040000D24020001B4
-:103CE0008F4202E8A34005C6AF4001B02442000164
-:103CF000AF4202E88F4202E88EE201502442000106
-:103D0000AEE20150100000038EE2015024020001D7
-:103D1000A34205C68FBF00488FBE00448FB5004048
-:103D20008FB3003C8FB200388FB100348FB00030B9
-:103D300003E0000827BD005027BDFFD8AFBF00201B
-:103D40008F8200B030420004104000680000000084
-:103D50008F4301288F8201041462000500000000D7
-:103D60008F4301308F8200B4106200060000000013
-:103D70008F820104AF4201288F8200B41000005BE3
-:103D8000AF4201308F8200B03C030080004310241A
-:103D90001040000D000000008F82011C3442000220
-:103DA000AF82011C8F8200B02403FFFB004310246C
-:103DB000AF8200B08F82011C2403FFFD004310245A
-:103DC0001000004AAF82011C8F4301288F8201043A
-:103DD00014620005000000008F4301308F8200B4A0
-:103DE00010620010000000008F820104AF42012821
-:103DF0008F8200B48F430128AF420130AFA300107F
-:103E00008F4201303C04000124846144AFA20014BD
-:103E10008F86011C8F8700B03C0500051000003123
-:103E200034A509008F420128AFA200108F42013053
-:103E30003C04000124846150AFA200148F86011C51
-:103E40008F8700B03C0500050C002B3B34A510000B
-:103E50008F82011C34420002AF82011C8F83010457
-:103E60008F8200B034420001AF8200B0240200080B
-:103E7000AF830104AFA20010AFA000148F42000C6A
-:103E80008C0402088C05020CAFA200188F42010CB2
-:103E900026E600280040F809240704008F82011C50
-:103EA0002403FFFD00431024AF82011C8EE201DCDD
-:103EB00024420001AEE201DC8EE201DC8F420128E7
-:103EC000AFA200108F4201303C0400012484615CE9
-:103ED000AFA200148F86011C8F8700B03C0500053F
-:103EE00034A511000C002B3B000000008F8200A0C5
-:103EF0003042000410400069000000008F43012C94
-:103F00008F82012414620005000000008F430134F9
-:103F10008F8200A410620006000000008F8201243E
-:103F2000AF42012C8F8200A41000005CAF4201342C
-:103F30008F8200A03C030080004310241040000D3D
-:103F4000000000008F82011C34420002AF82011C7D
-:103F50008F8200A02403FFFB00431024AF8200A047
-:103F60008F82011C2403FFFD004310241000004B2E
-:103F7000AF82011C8F43012C8F8201241462000543
-:103F8000000000008F4301348F8200A410620010F3
-:103F9000000000008F820124AF42012C8F8200A418
-:103FA0008F43012CAF420134AFA300108F42013484
-:103FB0003C04000124846168AFA200148F86011CB8
-:103FC0008F8700A03C0500051000003234A51200C8
-:103FD0008F42012CAFA200108F4201343C0400013B
-:103FE00024846174AFA200148F86011C8F8700A007
-:103FF0003C0500050C002B3B34A513008F82011CEF
-:1040000034420002AF82011C8F8301248F8200A002
-:1040100034420001AF8200A024020080AF8301245B
-:10402000AFA20010AFA000148F4200148C0402084D
-:104030008C05020CAFA200188F4201083C0600015B
-:1040400024C66ED80040F809240700048F82011CA2
-:104050002403FFFD00431024AF82011C8EE201DC2B
-:1040600024420001AEE201DC8EE201DC8F42012C31
-:10407000AFA200108F4201343C040001248461800F
-:10408000AFA200148F86011C8F8700A03C0500059D
-:1040900034A514000C002B3B000000008FBF002053
-:1040A00003E0000827BD00283C0810002407000199
-:1040B0003C0600803C0501008F82007000481024FF
-:1040C0001040FFFD000000008F82005424420005D4
-:1040D000AF8200788C040234108000160000182192
-:1040E0003C020001005710218C4240E824420005A8
-:1040F0003C01000100370821AC2240E83C020001ED
-:10410000005710218C4240E80044102B1440000955
-:10411000000000003C0300803C0100010037082142
-:10412000AC2040E83C010001003708211000000BE2
-:10413000A02740F03C02000100571021904240F0BF
-:1041400054400006006618253C020001005710216B
-:10415000904240F154400001006618258C04023062
-:1041600010800013000000003C02000100571021E5
-:104170008C4240EC244200053C010001003708213C
-:10418000AC2240EC3C020001005710218C4240EC74
-:104190000044102B14400006000000003C01000108
-:1041A00000370821AC2040EC1000000600651825FF
-:1041B0003C02000100571021904240F2544000019F
-:1041C000006518251060FFBC000000008F42000051
-:1041D0001040000700000000AF80004C8F82004CB0
-:1041E0001040FFFD0000000010000005000000006E
-:1041F000AF8000488F8200481040FFFD00000000A3
-:104200008F82006000431025AF8200608F42000063
-:1042100010400003000000001000FFA7AF80004C1A
-:104220001000FFA5AF80004803E000080000000078
-:1042300000000000000000000000000027BDFFE0BB
-:10424000AFBF00188F86006430C200041040002504
-:10425000240400048C020114AF420020AF840064E7
-:104260008F4202FC24420001AF4202FC8F4202FC5A
-:104270008F820064304200041440000500000000FA
-:104280008C0301148F4200201462FFF20000000032
-:104290008F420000104000078F43003CAF80004C6D
-:1042A0008F82004C1040FFFD000000001000000550
-:1042B00000000000AF8000488F8200481040FFFDE2
-:1042C000000000008F82006000431025AF82006074
-:1042D0008F42000010400073000000001000006FCB
-:1042E0000000000030C20008104000202404000834
-:1042F0008C02011CAF420048AF8400648F4202A8C8
-:1043000024420001AF4202A88F4202A88F820064BB
-:104310003042000814400005000000008C03011C1E
-:104320008F4200481462FFF2000000008F4200003C
-:104330001040000700000000AF80004C8F82004C4E
-:104340001040FFFD0000000010000005000000000C
-:10435000AF8000488F8200481040FFFD0000000041
-:104360008F8200601000FFD93442020030C200206A
-:1043700010400023240400208C02012CAF4200686E
-:10438000AF8400648F4202D824420001AF4202D8B9
-:104390008F4202D88F820064304200201440000512
-:1043A00032C240008C03012C8F4200681462FFF27D
-:1043B00032C24000144000023C02000102C2B0259B
-:1043C0008F4200001040000700000000AF80004C4A
-:1043D0008F82004C1040FFFD00000000100000051F
-:1043E00000000000AF8000488F8200481040FFFDB1
-:1043F000000000008F8200601000FFB4344208000B
-:1044000030C2001010400029240400108C02012446
-:10441000AF420058AF8400648F4202D424420001AE
-:10442000AF4202D48F4202D48F8200643042001027
-:104430001440000532C220008C0301248F42005832
-:104440001462FFF232C220005040000136D68000D4
-:104450008F4200001040000700000000AF80004CB9
-:104460008F82004C1040FFFD00000000100000058E
-:1044700000000000AF8000488F8200481040FFFD20
-:10448000000000008F82006034420100AF820060B3
-:104490008F42000010400003000000001000006C7C
-:1044A000AF80004C1000006AAF80004830C20001AD
-:1044B0001040000424020001AF8200641000006478
-:1044C0000000000030C200021440000B3C05000355
-:1044D0003C0400012484624434A505000000382116
-:1044E000AFA000100C002B3BAFA000142402FFC0B3
-:1044F00010000057AF8200648C05022C8C02010C66
-:1045000010A20048000510808C46030024A2000180
-:104510003045003F24020003AC05022C00061E02B9
-:1045200010620005240200101062001D30C20FFF4F
-:1045300010000039000000008F4302A88F440000E3
-:1045400030C20FFFAF42004824630001AF4302A80E
-:10455000108000078F4202A8AF80004C8F82004C71
-:104560001040FFFD000000001000000500000000EA
-:10457000AF8000488F8200481040FFFD000000001F
-:104580008F82006034420200AF8200608F420000E0
-:104590001040001F000000001000001B0000000081
-:1045A000AF42005832C220005040000136D6800091
-:1045B0008F4202D48F43000024420001AF4202D454
-:1045C000106000078F4202D4AF80004C8F82004CF5
-:1045D0001040FFFD0000000010000005000000007A
-:1045E000AF8000488F8200481040FFFD00000000AF
-:1045F0008F82006034420100AF8200608F42000071
-:10460000104000030000000010000006AF80004CC6
-:1046100010000004AF8000480C00219600C020214B
-:10462000004028218C02010C14A200022402000286
-:10463000AF8200648F8200643042000214400004A4
-:10464000000000008C02010C14A2FFAC000000006E
-:104650008FBF001803E0000827BD002003E000081A
-:104660000000000027BDFFA0AFB000400080802107
-:10467000001016022442FFFF304300FF2C6200139B
-:10468000AFBF0058AFBE0054AFB50050AFB3004C41
-:10469000AFB20048AFB10044104001F3AFA5003401
-:1046A000000310803C010001002208218C22628856
-:1046B00000400008000000000010130230440FFF0B
-:1046C0002402000110820005240200021082000C66
-:1046D0002402FFFE100000243C0500038F43000469
-:1046E0003C0200018C426F04AF440200AF4402045C
-:1046F0003C0400018C846E801000000934630001CA
-:104700008F430004AF440200AF4402043C040001A4
-:104710008C846E80006218243C0200012442CA2866
-:104720000002110000021182AF4300043C030800A4
-:1047300000431025AC8200388F84005400041442DA
-:1047400000041C820043102100041CC200431023FB
-:1047500000041D020043102100041D4200431023E9
-:1047600010000009AF4202083C040001248462509A
-:1047700034A510000200302100003821AFA0001045
-:104780000C002B3BAFA000148F4202A0244200017A
-:10479000AF4202A01000021F8F4202A027B00028E3
-:1047A00002002021240502100C002BBF2406000863
-:1047B0000C00251802002021100002160000000045
-:1047C0008FAA003427A40028000A1880254200017F
-:1047D0003042003FAFA200348C6503008FAA003442
-:1047E000000210808C430300254200013042003F4C
-:1047F000AFA20034AC02022CAFA500280C00251893
-:10480000AFA3002C100002030000000027B0002816
-:1048100002002021240502100C002BBF24060008F2
-:104820000C00265702002021100001FA00000000B1
-:104830008FAA003427A40028000A1880254200010E
-:104840003042003FAFA200348C6503008FAA0034D1
-:10485000000210808C430300254200013042003FDB
-:10486000AFA20034AC02022CAFA500280C002657E2
-:10487000AFA3002C100001E700000000001013029D
-:1048800030430FFF240200011062000524020002E1
-:104890001062001E3C020002100000333C050003C1
-:1048A0003C03000202C310245440003702C3B02569
-:1048B0008F8202283C01000100370821AC2238D841
-:1048C0008F82022C3C01000100370821AC2238DC29
-:1048D0008F8202303C01000100370821AC2238E011
-:1048E0008F8202343C01000100370821AC2238E4F9
-:1048F0002402FFFFAF820228AF82022CAF82023077
-:10490000AF8202341000002002C3B02502C210247E
-:10491000104000123C02FFFD3C0200010057102134
-:104920008C4238D8AF8202283C0200010057102187
-:104930008C4238DCAF82022C3C020001005710216F
-:104940008C4238E0AF8202303C0200010057102157
-:104950008C4238E4AF8202343C02FFFD3442FFFF58
-:104960001000000902C2B0243C0400012484625CEF
-:1049700034A511000200302100003821AFA0001042
-:104980000C002B3BAFA000148F4202CC244200014C
-:10499000AF4202CC1000019F8F4202CC00101302E4
-:1049A00030450FFF2402000110A20005240200027E
-:1049B00010A2000D3C0408FF100000143C05000389
-:1049C0003C0208FF3442FFFF8F8302203C040004B6
-:1049D00002C4B0250062182434630008AF830220AB
-:1049E00010000012AF4502983484FFF73C03FFFB30
-:1049F0008F8202203463FFFF02C3B02400441024DE
-:104A0000AF82022010000009AF4502983C0400016B
-:104A10002484626834A5120002003021000038218D
-:104A2000AFA000100C002B3BAFA000148F4202BCC3
-:104A300024420001AF4202BC100001768F4202BC4A
-:104A400027840208240502000C002BBF240600085E
-:104A500027440224240502000C002BBF2406000872
-:104A60008F4202C424420001AF4202C41000016917
-:104A70008F4202C40010130230430FFF24020001D2
-:104A8000106200112862000250400005240200025A
-:104A90001060000700000000100000170000000078
-:104AA0001062000F00000000100000130000000062
-:104AB0008C060248000020210C005104240500044B
-:104AC00010000007000000008C06024800002021B2
-:104AD0000C00510424050004100000100000000028
-:104AE0008C06024C000020210C005104240500011A
-:104AF0001000000A000000003C04000124846274DD
-:104B00003C05000334A513000200302100003821C9
-:104B1000AFA000100C002B3BAFA000148F4202C0CE
-:104B200024420001AF4202C01000013A8F4202C08D
-:104B30000C002426000000001000013600000000D8
-:104B400024020001A34205C5241001008F4401A8DE
-:104B50008F4501ACAFB00010AFA000148F4200141D
-:104B6000AFA200188F42010826E600280040F8098D
-:104B7000240704001040FFF500000000100001258C
-:104B8000000000003C03FFFF34637FFF8F42036897
-:104B90008F44036002C3B02400001821AF400058C6
-:104BA000AF40005CAF400060AF40006400441023A1
-:104BB000AF4203683C020900AF400360AFA200208F
-:104BC0008F5E001827AA0020240200FF13C20002F3
-:104BD000AFAA003C27C300018C020228006090218C
-:104BE0001642000E001E38C08F42033C24420001D2
-:104BF000AF42033C8F42033C8C0202283C0400017C
-:104C00002484620C3C050009AFA00014AFA2001080
-:104C10008FA600201000006B34A5050000F71021BE
-:104C20008FA300208FA40024AC4304C0AC4404C470
-:104C30008F8300548F820054247003E802021023F3
-:104C40002C4203E91040001B0000982100E088215D
-:104C5000263504C08F4401788F45017C022018213D
-:104C6000240A0004AFAA0010AFB200148F48000C51
-:104C70000000102102F53021AFA800188F48010C68
-:104C80002407000800A3282100A3482B008220212C
-:104C90000100F80900892021544000062413000176
-:104CA0008F820054020210232C4203E91440FFE9D2
-:104CB00000000000326200FF54400017AF5200189D
-:104CC0008F42037824420001AF4203788F42037879
-:104CD0008F8201208FAA003CAFA200108F82012496
-:104CE0003C040001248462183C050009AFA20014B2
-:104CF0008D4600001000003334A506008F420308E3
-:104D00002413000124420001AF4203088F4203082C
-:104D10001000001C326200FF8F8300548F82005409
-:104D2000247003E8020210232C4203E9104000140F
-:104D300000009821241100108F42000C8F44016064
-:104D40008F4501648F860120AFB10010AFB200140F
-:104D5000AFA200188F42010C240700080040F80998
-:104D600024C6001C1440FFE5000000008F820054A0
-:104D7000020210232C4203E91440FFEF0000000060
-:104D8000326200FF14400011000000008F420378DF
-:104D900024420001AF4203788F4203788F820120C2
-:104DA0008FAA003CAFA200108F8201243C040001B6
-:104DB000248462203C050009AFA200148D46000047
-:104DC00034A507000C002B3B03C038218F4202B0F2
-:104DD00024420001AF4202B08F4202B08F4202F87B
-:104DE00024420001AF4202F81000008A8F4202F80C
-:104DF0008C02025C27440224AF4201F08C02026064
-:104E000024050200240600080C002BBFAF4201F865
-:104E10008F82022030420008144000022402000168
-:104E200024020002AF4202988F4202AC24420001E9
-:104E3000AF4202AC100000778F4202AC3C0200FF90
-:104E40003442FFFF0202182432C2018014400006DF
-:104E50003402FFFB0043102B14400003000000004D
-:104E60001000006CAF4300BC3C040001248462804D
-:104E70003C05000334A51500020030210000382154
-:104E8000AFA000100C002B3BAFA000143C020700A9
-:104E90003442100000101E0200621825AFA300204B
-:104EA0008F510018240200FF12220002000080210E
-:104EB000263000018C0202281602000E001130C0BC
-:104EC0008F42033C24420001AF42033C8F42033C2B
-:104ED0008C0202283C040001248461F43C05000992
-:104EE000AFA00014AFA200108FA600201000003F5A
-:104EF00034A5010000D710218FA300208FA4002427
-:104F0000AC4304C0AC4404C400C018218F440178F1
-:104F10008F45017C0000102124070004AFA700107A
-:104F2000AFB000148F48000C24C604C002E6302144
-:104F3000AFA800188F48010C2407000800A32821FF
-:104F400000A3482B008220210100F80900892021BC
-:104F50001440000B240700088F820120AFA200102C
-:104F60008F8201243C040001248461FC3C0500097B
-:104F7000AFA200148FA600201000001C34A5020070
-:104F80008F4401608F4501648F43000CAF500018BF
-:104F90008F86012024020010AFA20010AFB00014D1
-:104FA000AFA300188F42010C0040F80924C6001C72
-:104FB00014400010000000008F4203402442000112
-:104FC000AF4203408F4203408F820120AFA2001006
-:104FD0008F8201243C040001248462043C05000902
-:104FE000AFA200148FA6002034A503000C002B3BB9
-:104FF000022038218F4202E024420001AF4202E049
-:105000008F4202E08F4202F024420001AF4202F0E0
-:105010008F4202F08FA200348FBF00588FBE005421
-:105020008FB500508FB3004C8FB200488FB1004451
-:105030008FB0004003E0000827BD006027BDFFF8E7
-:105040002408FFFF10A00014000048213C0AEDB81E
-:10505000354A83209087000024840001000030211D
-:1050600001071026304200011040000200081842DB
-:10507000006A18260060402124C600012CC20008E6
-:105080001440FFF700073842252900010125102BA5
-:105090001440FFF0000000000100102103E00008B0
-:1050A00027BD000827BDFFB0AFBF0048AFBE00441A
-:1050B000AFB50040AFB3003CAFB20038AFB1003481
-:1050C000AFB000308F870220AFA700248F87020087
-:1050D000AFA7002C8F8202203C0308FF3463FFFF40
-:1050E0000043102434420004AF8202208F82020069
-:1050F0003C03C0FF3463FFFF00431024344200042C
-:10510000AF8202008F5303588F55035C8F5E03609C
-:105110008F470364AFA700148F470368AFA7001C35
-:105120008F4202D0274401C024420001AF4202D086
-:105130008F5002D08F5102048F5202000C002BA816
-:1051400024050400AF530358AF55035CAF5E036002
-:105150008FA70014AF4703648FA7001CAF470368F5
-:10516000AF5002D0AF510204AF5202008C02025C79
-:1051700027440224AF4201F08C02026024050200A1
-:1051800024060008AF4201F8240200060C002BBFE1
-:10519000AF4201F43C023B9A3442CA00AF4201FCE8
-:1051A000240203E82404000224030001AF42029415
-:1051B000AF440290AF43029C8F820220304200082D
-:1051C0001040000400000000AF43029810000003EC
-:1051D00000003021AF440298000030213C03000160
-:1051E0000066182190636D000346102124C600015B
-:1051F000A043022C2CC2000F1440FFF803461821D4
-:1052000024C600018F820040240400802405008011
-:105210000002170224420030A062022C0346102133
-:105220000C002BA8A040022C8FA7002430E2000421
-:1052300014400006000000008F8202203C0308FF9B
-:105240003463FFFB00431024AF8202208FA7002CA1
-:1052500030E2000414400006000000008F820200CB
-:105260003C03C0FF3463FFFB00431024AF82020005
-:105270008FBF00488FBE00448FB500408FB3003C05
-:105280008FB200388FB100348FB0003003E00008D7
-:1052900027BD00500000000000000000AF400104E6
-:1052A00024040001000410C002E21821248200013D
-:1052B0003C01000100230821A42234D00040202119
-:1052C0002C8200801440FFF8000410C0240200016A
-:1052D0003C01000100370821A42038D0AF42010072
-:1052E000AF800228AF80022CAF800230AF80023442
-:1052F00003E000080000000027BDFFE8AFBF001476
-:10530000AFB000108F420104284200051040002673
-:10531000008080213C0200018F430104344230D0E0
-:1053200002E22021000318C00062182102E31821C4
-:105330000083102B1040001500001021960700007C
-:1053400024840006246600069482FFFC14470009AA
-:10535000000028219483FFFE9602000214620006DA
-:1053600000A0102194820000960300040043102640
-:105370002C45000100A010211440000924840008DD
-:105380000086102B1440FFF000001021304200FF77
-:1053900014400030240200011000002E00001021F3
-:1053A0001000FFFA24020001020020210C00240C4E
-:1053B000240500063042007F000218C002E31021DD
-:1053C0003C01000100220821942230D01040FFF25D
-:1053D00002E310213C06000100C2302194C630D007
-:1053E00010C0FFED3C080001350834D296070000DC
-:1053F000000610C000572021008820219482000060
-:10540000144700090000282194830002960200023C
-:105410001462000600A01021948200049603000488
-:10542000004310262C45000100A010211440000765
-:10543000000610C002E210213C06000100C230212B
-:1054400094C634D014C0FFEB000610C010C0FFD2C9
-:10545000240200018FBF00148FB0001003E0000889
-:1054600027BD001803E000080000000027BDFFB0C2
-:1054700000801021AFB00030245000020200202133
-:1054800024050006AFB1003400408821AFBF0048BA
-:10549000AFBE0044AFB50040AFB3003C0C00240CDD
-:1054A000AFB200383047007F000710C002E2102181
-:1054B0003C05000100A2282194A530D050A0001C7A
-:1054C00000A030213C090001352934D29628000281
-:1054D000000510C00057202100892021948200007F
-:1054E0001448000900003021948300029602000253
-:1054F0001462000600C01021948200049603000488
-:10550000004310262C46000100C010211440000763
-:10551000000510C002E210213C05000100A2282174
-:1055200094A534D014A0FFEB000510C000A03021DA
-:1055300010C00014000610C0005718213C010001E3
-:10554000002308218C2334D000571021AFA3001072
-:105550003C010001002208218C2234D43C040001CB
-:1055600024846394AFA200148E2600008E270004CA
-:105570003C0500040C002B3B34A504001000006324
-:105580003C0208008F45010010A00006000510C075
-:1055900002E210213C01000100220821942234D0B3
-:1055A000AF42010000A0302114C00011000628C045
-:1055B000000710C002E21021AFA700103C0100015B
-:1055C00000220821942230D03C040001248463A0EE
-:1055D000AFA200148E2600008E2700043C050004B4
-:1055E0000C002B3B34A50500100000483C020800CD
-:1055F00000B718213C02000196040000344234D266
-:1056000000621821A46400008E020002000720C07E
-:10561000AC62000202E410213C0300010062182188
-:10562000946330D002E510213C01000100220821E2
-:10563000A42334D002E410213C01000100220821FF
-:10564000A42630D08F420104244200012842008069
-:105650001040000F3C0200028F4201043C04000194
-:10566000348430D296030000000210C0005710218D
-:1056700000441021A44300008E030002AC4300024A
-:105680008F42010424420001AF4201043C020002A7
-:1056900002C2102410400011000721423C03000107
-:1056A000346338D824020003004410230002108021
-:1056B0000057202100832021005710210043102192
-:1056C00030E5001F8C4300002402000100A21004FA
-:1056D000006218251000000CAC83000024020003B7
-:1056E0000044102300021080005C2821005C10217F
-:1056F00030E4001F8C4302282402000100821004C1
-:1057000000621825ACA302283C02080034421000B5
-:1057100000001821AFA200208F5E001827AA0020E9
-:10572000240200FF13C20002AFAA002C27C300010D
-:105730008C020228006090211642000E001E38C024
-:105740008F42033C24420001AF42033C8F42033CA2
-:105750008C0202283C0400012484635C3C0500099F
-:10576000AFA00014AFA200108FA600201000006BA5
-:1057700034A5050000F710218FA300208FA400247A
-:10578000AC4304C0AC4404C48F8300548F820054E3
-:10579000247003E8020210232C4203E91040001B8E
-:1057A0000000982100E08821263504C08F4401784C
-:1057B0008F45017C02201821240A0004AFAA0010A2
-:1057C000AFB200148F48000C0000102102F5302108
-:1057D000AFA800188F48010C2407000800A3282157
-:1057E00000A3482B008220210100F8090089202114
-:1057F00054400006241300018F820054020210233B
-:105800002C4203E91440FFE900000000326200FF6F
-:1058100054400017AF5200188F4203782442000111
-:10582000AF4203788F4203788F8201208FAA002C29
-:10583000AFA200108F8201243C040001248463681D
-:105840003C050009AFA200148D4600001000003393
-:1058500034A506008F4203082413000124420001EE
-:10586000AF4203088F4203081000001C326200FFA1
-:105870008F8300548F820054247003E802021023A7
-:105880002C4203E91040001400009821241100105C
-:105890008F42000C8F4401608F4501648F86012088
-:1058A000AFB10010AFB20014AFA200188F42010CCC
-:1058B000240700080040F80924C6001C1440FFE536
-:1058C000000000008F820054020210232C4203E9E2
-:1058D0001440FFEF00000000326200FF144000118E
-:1058E000000000008F42037824420001AF42037899
-:1058F0008F4203788F8201208FAA002CAFA2001064
-:105900008F8201243C040001248463703C0500095B
-:10591000AFA200148D46000034A507000C002B3BFD
-:1059200003C038218F4202B424420001AF4202B4C6
-:105930008F4202B48F4202F424420001AF4202F4CB
-:105940008F4202F48FBF00488FBE00448FB50040E5
-:105950008FB3003C8FB200388FB100348FB000306D
-:1059600003E0000827BD005027BDFFA000801021E4
-:10597000AFB00040245000020200202124050006A0
-:10598000AFB1004400408821AFBF0058AFBE005403
-:10599000AFB50050AFB3004C0C00240CAFB20048C0
-:1059A0003048007F000810C002E210213C060001D0
-:1059B00000C2302194C630D010C0001C0000382135
-:1059C0003C0A0001354A34D296290002000610C074
-:1059D00000572021008A20219482000014490009E8
-:1059E000000028219483000296020002146200063F
-:1059F00000A01021948200049603000400431026A6
-:105A00002C45000100A0102114400008000610C021
-:105A100000C0382102E210213C06000100C2302102
-:105A200094C634D014C0FFEA000610C014C00011A0
-:105A3000AFA70028000810C002E21021AFA8001094
-:105A40003C01000100220821942230D03C040001D6
-:105A5000248463ACAFA200148E2600008E270004BD
-:105A60003C0500040C002B3B34A509001000007518
-:105A70003C02080010E0000C000610C002E21021F9
-:105A80003C03000100621821946334D0000710C069
-:105A900002E210213C01000100220821A42334D09D
-:105AA0001000000B3C04000102E210213C03000145
-:105AB00000621821946334D0000810C002E2102163
-:105AC0003C01000100220821A42330D03C04000145
-:105AD000348430D08F430100000610C002E2102150
-:105AE0003C01000100220821A42334D08F4201048C
-:105AF00002E438210000282118400029AF460100A7
-:105B000024E6000694C3FFFC96020000146200091C
-:105B10000000202194C3FFFE9602000214620006DA
-:105B20000080102194C20000960300040043102658
-:105B30002C440001008010215040001424A50001D5
-:105B40008F4201042442FFFF00A2102A1040000BE4
-:105B500024E40004948200068C830008A482FFFEE3
-:105B6000AC8300008F42010424A500012442FFFF02
-:105B700000A2102A1440FFF7248400088F42010479
-:105B80002442FFFF10000006AF4201048F420104CF
-:105B900024C6000800A2102A1440FFDA24E70008F7
-:105BA000000810C002E210213C010001002208217F
-:105BB000942230D0144000233C0208003C02000232
-:105BC00002C2102410400012000821423C030001D0
-:105BD000346338D8240200030044102300021080EC
-:105BE000005720210083202100571021004310215D
-:105BF0003105001F240300018C42000000A318049B
-:105C000000031827004310241000000DAC82000090
-:105C1000240200030044102300021080005C2821AD
-:105C2000005C10213104001F240300018C42022873
-:105C3000008318040003182700431024ACA2022894
-:105C40003C0208003442200000001821AFA20020CE
-:105C50008F5E001827AB0020240200FF13C2000251
-:105C6000AFAB003427C300018C02022800609021F2
-:105C70001642000E001E38C08F42033C2442000131
-:105C8000AF42033C8F42033C8C0202283C040001DB
-:105C90002484635C3C050009AFA00014AFA200108F
-:105CA0008FA600201000006B34A5050000F710211E
-:105CB0008FA300208FA40024AC4304C0AC4404C4D0
-:105CC0008F8300548F820054247003E80202102353
-:105CD0002C4203E91040001B0000982100E08821BD
-:105CE000263504C08F4401788F45017C022018219D
-:105CF000240B0004AFAB0010AFB200148F48000CAF
-:105D00000000102102F53021AFA800188F48010CC7
-:105D10002407000800A3282100A3482B008220218B
-:105D20000100F809008920215440000624130001D5
-:105D30008F820054020210232C4203E91440FFE931
-:105D400000000000326200FF54400017AF520018FC
-:105D50008F42037824420001AF4203788F420378D8
-:105D60008F8201208FAB0034AFA200108F820124FC
-:105D70003C040001248463683C050009AFA20014C0
-:105D80008D6600001000003334A506008F42030822
-:105D90002413000124420001AF4203088F4203088C
-:105DA0001000001C326200FF8F8300548F82005469
-:105DB000247003E8020210232C4203E9104000146F
-:105DC00000009821241100108F42000C8F440160C4
-:105DD0008F4501648F860120AFB10010AFB200146F
-:105DE000AFA200188F42010C240700080040F809F8
-:105DF00024C6001C1440FFE5000000008F82005400
-:105E0000020210232C4203E91440FFEF00000000BF
-:105E1000326200FF14400011000000008F4203783E
-:105E200024420001AF4203788F4203788F82012021
-:105E30008FAB0034AFA200108F8201243C0400011C
-:105E4000248463703C050009AFA200148D66000035
-:105E500034A507000C002B3B03C038218F4202B849
-:105E600024420001AF4202B88F4202B88F4202F4CE
-:105E700024420001AF4202F48F4202F48FBF005867
-:105E80008FBE00548FB500508FB3004C8FB20048C6
-:105E90008FB100448FB0004003E0000827BD0060D0
-:105EA00000000000000000000000000027BDFFE02F
-:105EB00027644000AFBF00180C002BA82405100079
-:105EC0003C03000134632CC03C04000134842EC820
-:105ED00024020020AF82011C02E31021AF800100E8
-:105EE000AF800104AF800108AF800110AF800114C2
-:105EF000AF800118AF800120AF800124AF8001285E
-:105F0000AF800130AF800134AF800138AF4200EC88
-:105F100002E31021AF4200F002E41021AF4200F48E
-:105F200002E41021AF4200F83C02000100571021AA
-:105F3000904240F41440001C3C0500018F82011C7B
-:105F40003C040001248464703C05000134420001DB
-:105F5000AF82011CAFA00010AFA000148F86011CFF
-:105F600034A501000C002B3B000038218C020218E4
-:105F70003042004010400014000000008F82011CDD
-:105F80003C0400012484647C3C050001344200048C
-:105F9000AF82011CAFA00010AFA000148F86011CBF
-:105FA0001000000734A502003C040001248464842E
-:105FB000AFA00010AFA000148F86011C34A5030011
-:105FC0000C002B3B000038218FBF001803E00008B5
-:105FD00027BD00208FA900108F83012C8FAA0014E9
-:105FE0008FAB00181060000A27624FE014620002B5
-:105FF00024680020276848008F82012811020004CD
-:10600000000000008F82012415020007000000003C
-:106010008F4303340000102124630001AF43033495
-:10602000100000398F430334AC640000AC650004F9
-:10603000AC660008A467000EAC690018AC6A001CCE
-:10604000AC6B0010AC620014AF8801208F4200FCE2
-:106050008F4400F42442FFFFAF4200FC8C8200001A
-:10606000104900053042FF8F104000193122FF8F88
-:10607000104000183C0200018C8300042C620010C8
-:10608000104000133C02000124630001AC830004B3
-:106090008F4300F8344230C802E2102154620004F9
-:1060A000246200083C02000134422EC802E21021A2
-:1060B00014440015240200018F820128244200208C
-:1060C000AF8201288F8201281000000F24020001F6
-:1060D0003C020001344230C802E210215482000424
-:1060E000248200083C02000134422EC802E2102142
-:1060F0000040202124020001AF4400F4AC890000DC
-:10610000AC8200042402000103E00008000000004B
-:1061100003E00008000000008FA900108F83010C2D
-:106120008FAA00148FAB00181060000A276247E0A6
-:106130001462000224680020276840008F82010852
-:1061400011020004000000008F8201041502000704
-:10615000000000008F430338000010212463000179
-:10616000AF430338100000358F430338AC640000A0
-:10617000AC650004AC660008A467000EAC690018AA
-:10618000AC6A001CAC6B0010AC620014AF8801005C
-:106190008F4400EC8C820000304200061040001951
-:1061A00031220006104000183C0200018C830004DC
-:1061B0002C620010104000133C0200012463000117
-:1061C000AC8300048F4300F034422EC002E2102161
-:1061D00054620004246200083C02000134422CC0D6
-:1061E00002E2102114440015240200018F820108EC
-:1061F00024420020AF8201088F8201081000000FA6
-:10620000240200013C02000134422EC002E21021AF
-:1062100054820004248200083C02000134422CC055
-:1062200002E210210040202124020001AF4400ECD2
-:10623000AC890000AC8200042402000103E00008E5
-:106240000000000003E000080000000027BDFFD8A8
-:106250003C0400012484648C3C050001AFBF002491
-:10626000AFB20020AFB1001CAFB000188F90010496
-:106270008F9100B08F92011C34A525008F82010000
-:106280000240302102203821AFA200100C002B3B2D
-:10629000AFB000148E020008AFA200108E02000CF6
-:1062A0003C04000124846498AFA200148E06000010
-:1062B0008E0700043C0500010C002B3B34A5251083
-:1062C0008E020018AFA200108E02001C3C040001D8
-:1062D000248464A4AFA200148E0600108E0700145C
-:1062E0003C0500010C002B3B34A525203C027F001F
-:1062F000022210243C030800544300163C03020011
-:106300008F82009C3042FFFF144000123C030200C9
-:106310003C040001248464B03C05000234A5F03044
-:10632000000030210000382136420002AF82011CFB
-:1063300036220001AF8200B0AF900104AF92011C81
-:10634000AFA000100C002B3BAFA0001410000024E5
-:106350000000000002C310241040000D022310248E
-:106360001040000B36420002AF82011C36220001B1
-:10637000AF8200B0AF900104AF92011C8F42033096
-:1063800024420001AF420330100000158F42033059
-:106390003C040001248464B8240202A9AFA20010C6
-:1063A000AFA000148F8601443C07000124E764C0BD
-:1063B0000C002B3B3405DEAD8F82011C3442000201
-:1063C000AF82011C8F82022034420004AF8202207F
-:1063D0008F8201403C03000100431025AF82014041
-:1063E0008FBF00248FB200208FB1001C8FB0001827
-:1063F00003E0000827BD002827BDFFD83C040001AA
-:10640000248464E83C050001AFBF0024AFB2002043
-:10641000AFB1001CAFB000188F9001248F9100A085
-:106420008F92011C34A526008F820120024030216A
-:1064300002203821AFA200100C002B3BAFB000149B
-:106440008E020008AFA200108E02000C3C04000176
-:10645000248464F4AFA200148E0600008E070004AA
-:106460003C0500010C002B3B34A526108E020018C1
-:10647000AFA200108E02001C3C04000124846500C1
-:10648000AFA200148E0600108E0700143C05000118
-:106490000C002B3B34A526203C027F000222102456
-:1064A0003C030800544300163C0302008F8200ACFA
-:1064B0003042FFFF144000123C0302003C04000184
-:1064C0002484650C3C05000134A5F0300000302127
-:1064D0000000382136420002AF82011C3622000142
-:1064E000AF8200A0AF900124AF92011CAFA00010BA
-:1064F0000C002B3BAFA00014100000240000000093
-:1065000002C310241040000D022310241040000B81
-:1065100036420002AF82011C36220001AF8200A089
-:10652000AF900124AF92011C8F42032C2442000142
-:10653000AF42032C100000158F42032C3C040001D5
-:10654000248464B8240202E2AFA20010AFA00014B9
-:106550008F8601443C07000124E764C00C002B3BFC
-:106560003405DEAD8F82011C34420002AF82011C73
-:106570008F82022034420004AF8202208F820140C9
-:106580003C03000100431025AF8201408FBF00246F
-:106590008FB200208FB1001C8FB0001803E00008FC
-:1065A00027BD00280000602100005021000030219C
-:1065B0000000282100006821000048210000782107
-:1065C000000070218F8801248F8701041580002E20
-:1065D0008F8B011C11A00014316208008F820120F2
-:1065E00010460029000000003C0400018C846EE489
-:1065F0008CC200008CC30004AC820000AC83000499
-:106600008CC20008AC82000894C2000EA482000E66
-:106610008CC20010240C0001AC8200108CC200144B
-:106620001000001224C600201040001700000000D7
-:106630003C0400018C846EE48D0200008D03000494
-:10664000AC820000AC8300048D020008AC8200081C
-:106650009502000EA482000E8D0200102506002077
-:10666000AC8200108D020014240C000100C018211F
-:10667000AC82001427624FE00043102B544000010D
-:1066800027634800006030211540002F316201006F
-:1066900011200014316280008F8201001045002A11
-:1066A000316201003C0400018C846EE08CA2000089
-:1066B0008CA30004AC820000AC8300048CA2000810
-:1066C000AC82000894A2000EA482000E8CA20010DE
-:1066D000240A0001AC8200108CA2001410000012E9
-:1066E00024A5002010400018316201003C04000184
-:1066F0008C846EE08CE200008CE30004AC8200002D
-:10670000AC8300048CE20008AC82000894E2000E26
-:10671000A482000E8CE2001024E50020AC82001060
-:106720008CE20014240A000100A01821AC8200149D
-:10673000276247E00043102B5440000127634000CC
-:1067400000602821316201005440001D31621000B8
-:1067500011A0000931A20800104000042502002009
-:106760008F8200A8A5E2000025020020AF8201244C
-:106770008F8801240000682111800011316210000F
-:106780003C0400018C846EE48C8200008C83000445
-:10679000AF820080AF8300848C820008AF8200A4A7
-:1067A0009482000EAF8200AC8C8200100000602149
-:1067B000AF8200A08C8D00108C8F0014316210000D
-:1067C0001440FF82000000001120000F3122080059
-:1067D000104000043C0200028F8200B8A5C20000F5
-:1067E0003C020002012210241040000424E2002098
-:1067F0008F8200B4AF8200D424E20020AF82010473
-:106800008F870104000048211140FF700000000044
-:106810003C0400018C846EE08C8200008C830004B8
-:10682000AF820090AF8300948C820008AF8200B4E6
-:106830009482000EAF82009C8C82001000005021D8
-:10684000AF8200B08C8900101000FF608C8E0014A5
-:1068500003E0000800000000000060210000582153
-:106860000000302100002821000068210000502194
-:1068700000007821000070218F8801248F87010497
-:106880003C1801001580002E8F89011C11A00014F6
-:10689000312208008F8201201046002900000000EC
-:1068A0003C0400018C846EE48CC200008CC30004A4
-:1068B000AC820000AC8300048CC20008AC820008EB
-:1068C00094C2000EA482000E8CC20010240C0001A1
-:1068D000AC8200108CC200141000001224C60020EC
-:1068E00010400017000000003C0400018C846EE49E
-:1068F0008D0200008D030004AC820000AC83000414
-:106900008D020008AC8200089502000EA482000EE1
-:106910008D02001025060020AC8200108D020014AC
-:10692000240C000100C01821AC82001427624FE043
-:106930000043102B544000012763480000603021C1
-:106940001560002F31220100114000143122800017
-:106950008F8201001045002A312201003C04000111
-:106960008C846EE08CA200008CA30004AC8200003A
-:10697000AC8300048CA20008AC82000894A2000E34
-:10698000A482000E8CA20010240B0001AC82001027
-:106990008CA200141000001224A500201040001842
-:1069A000312201003C0400018C846EE08CE2000086
-:1069B0008CE30004AC820000AC8300048CE200088D
-:1069C000AC82000894E2000EA482000E8CE200105B
-:1069D00024E50020AC8200108CE20014240B00019E
-:1069E00000A01821AC820014276247E00043102B5E
-:1069F000544000012763400000602821312201003B
-:106A00005440001D3122100011A0000931A20800DD
-:106A100010400004250200208F8200A8A5E200009B
-:106A200025020020AF8201248F8801240000682104
-:106A300011800011312210003C0400018C846EE4AE
-:106A40008C8200008C830004AF820080AF830084BE
-:106A50008C820008AF8200A49482000EAF8200AC4A
-:106A60008C82001000006021AF8200A08C8D00108D
-:106A70008C8F00143122100014400022000000000E
-:106A80001140000F31420800104000043C02000297
-:106A90008F8200B8A5C200003C020002014210240F
-:106AA0001040000424E200208F8200B4AF8200D4A2
-:106AB00024E20020AF8201048F87010400005021EE
-:106AC00011600010000000003C0400018C846EE0A6
-:106AD0008C8200008C830004AF820090AF8300940E
-:106AE0008C820008AF8200B49482000EAF82009CBA
-:106AF0008C82001000005821AF8200B08C8A0010F8
-:106B00008C8E00148F8200703C0310000043102410
-:106B10001040FF5C000000008F82005424420005FA
-:106B2000AF8200788C040234108000160000182117
-:106B30003C020001005710218C4240E8244200052D
-:106B40003C01000100370821AC2240E83C02000172
-:106B5000005710218C4240E80044102B14400009DB
-:106B6000240200013C0300803C01000100370821A1
-:106B7000AC2040E83C010001003708211000000C67
-:106B8000A02240F03C02000100571021904240F04A
-:106B9000144000063C0200803C0200010057102116
-:106BA000904240F1104000023C0200800062182533
-:106BB0008C04023010800013000000003C02000131
-:106BC000005710218C4240EC244200053C0100019A
-:106BD00000370821AC2240EC3C0200010057102194
-:106BE0008C4240EC0044102B1440000600000000D2
-:106BF0003C01000100370821AC2040EC10000006E9
-:106C0000007818253C02000100571021904240F204
-:106C100054400001007818251060FF1A00000000A1
-:106C20008F4200001040000700000000AF80004CC1
-:106C30008F82004C1040FFFD000000001000000596
-:106C400000000000AF8000488F8200481040FFFD28
-:106C5000000000008F82006000431025AF820060BA
-:106C60008F42000010400003000000001000FF05EC
-:106C7000AF80004C1000FF03AF80004803E0000825
-:106C80000000000000000000000000003C020001C5
-:106C90008C426D2827BDFFE8AFBF001414400012DE
-:106CA000AFB000103C10000126106F9002002021B0
-:106CB0000C002BA82405200026021FE03C01000147
-:106CC000AC226EEC3C010001AC226EE8AC0202503A
-:106CD00024022000AC100254AC020258240200012D
-:106CE0003C010001AC226D288FBF00148FB0001052
-:106CF00003E0000827BD00183C0900018D296EEC57
-:106D00008C8200008FA300108FA80014AD22000019
-:106D10008C820004AD250008AD2200048F8200544F
-:106D2000AD260010AD270014AD230018AD28001CBF
-:106D3000AD22000C2529FFE03C02000124426F90A7
-:106D40000122102B10400003000000003C0900014C
-:106D50008D296EE83C0200018C426D10AD220000CE
-:106D60003C0200018C426D103C010001AC296EEC2C
-:106D7000AD220004AC09025003E00008000000004E
-:106D800027BDFFD0AFB000103C1000018E106EEC9C
-:106D90003C0200018C426D10AFB1001400808821CC
-:106DA000AFBE00248FBE00408FA40048AFB20018D1
-:106DB00000A09021AFBF0028AFB50020AFB3001CEA
-:106DC000AE0200003C0200018C426D1000C0982110
-:106DD00000E0A82110800006AE020004260500088D
-:106DE0000C002BB324060018100000052610FFE04D
-:106DF000260400080C002BA8240500182610FFE02C
-:106E00003C03000124636F900203102B1040000329
-:106E1000000000003C1000018E106EE88E22000081
-:106E2000AE0200008E220004AE120008AE02000482
-:106E30008F820054AE130010AE150014AE1E001861
-:106E40008FA80044AE08001CAE02000C2610FFE024
-:106E50000203102B10400003000000003C10000152
-:106E60008E106EE83C0200018C426D10AE020000F4
-:106E70003C0200018C426D103C010001AC306EEC14
-:106E8000AE020004AC1002508FBF00288FBE002459
-:106E90008FB500208FB3001C8FB200188FB1001483
-:106EA0008FB0001003E0000827BD003000851821D6
-:106EB0000083102B1040000600000000AC80000092
-:106EC000248400040083102B5440FFFDAC8000009C
-:106ED00003E000080000000000A6182100A3102B0A
-:106EE00010400007000000008C820000ACA20000EF
-:106EF00024A5000400A3102B1440FFFB24840004ED
-:106F000003E0000800000000008618210083102B19
-:106F100010400007000000008CA20000AC820000BE
-:106F2000248400040083102B1440FFFB24A50004DC
-:106F300003E00008000000000006308000861821F1
-:106F40000083102B1040000600000000AC850000FC
-:106F5000248400040083102B5440FFFDAC85000006
-:106F600003E00008000000000000000026E5002803
-:106F700000A03021274301C08F4D03588F47035C89
-:106F80008F4803608F4903648F4A03688F4B020464
-:106F90008F4C0200246404000064102B1040000891
-:106FA0003C0208FF8CC20000AC62000024630004B5
-:106FB0000064102B1440FFFB24C600043C0208FFB1
-:106FC0003442FFFF3C03C0FFAF4D0358AF47035CA3
-:106FD000AF480360AF490364AF4A0368AF4B020494
-:106FE000AF4C02008F8402203463FFFF8F860200C3
-:106FF000008210243442000400C3182434630004C7
-:10700000AF820220AF8302008CA20214AC02008483
-:107010008CA20218AC0200888CA2021CAC02008C6C
-:107020008CA20220AC0200908CA20224AC0200943C
-:107030008CA20228AC0200988CA2022CAC02009C0C
-:107040008CA20230AC0200A08CA20234AC0200A4DC
-:107050008CA20238AC0200A88CA2023CAC0200ACAC
-:107060008CA20240AC0200B08CA20244AC0200B47C
-:107070008CA20248AC0200B88CA2024CAC0200BC4C
-:107080008CA2001CAC0200808CA20018AC0200C0D4
-:107090008CA20020AC0200CC8CA20024AC0200D058
-:1070A0008CA201D0AC0200E08CA201D4AC0200E4BE
-:1070B0008CA201D8AC0200E88CA201DCAC0200EC8E
-:1070C0008CA201E0AC0200F08CA200988CA3009C82
-:1070D000AC0300FC8CA200A88CA300ACAC0300F4B1
-:1070E0008CA200A08CA300A430840004AC0300F8A0
-:1070F0001480000730C200048F8202203C0308FF86
-:107100003463FFFB00431024AF82022030C200042E
-:1071100014400006000000008F8202003C03C0FF04
-:107120003463FFFB00431024AF8202008F4202DC75
-:10713000A34005C524420001AF4202DC8F4202DCBD
-:1071400003E000080000000027BDFFD8AFBF002407
-:10715000AFB000208F4300248F420020106200381F
-:10716000000000008F4300208F4200240062202393
-:1071700004810003000000008F42004000822021B3
-:107180008F4300308F4200240043102B1440000531
-:10719000000000008F4300408F42002410000005D3
-:1071A000006210238F4200308F43002400431023DD
-:1071B0002442FFFF00406021008C102A544000014F
-:1071C000008060218F4A00248F4900408F480024AE
-:1071D0008F4401808F4501848F4600248F4B001C13
-:1071E00024070001AFA7001000084100010018218A
-:1071F000014C50212529FFFF01498024AFB0001424
-:107200008F4700140000102100063100AFA70018BE
-:1072100000A3282100A3382B0082202100872021F1
-:107220008F420108016630210040F809000C390046
-:1072300054400001AF5000248F4300248F420020AF
-:1072400014620018000000008F4200001040000788
-:1072500000000000AF80004C8F82004C1040FFFD0A
-:10726000000000001000000500000000AF80004892
-:107270008F8200481040FFFD000000008F820060F8
-:107280002403FFEF00431024AF8200608F42000010
-:10729000104000030000000010000002AF80004C0E
-:1072A000AF8000488FBF00248FB0002003E00008AB
-:1072B00027BD002803E000080000000027BDFFC034
-:1072C00032C20020AFBF0038AFB30034AFB20030DD
-:1072D000AFB1002C10400004AFB000288F5300283D
-:1072E00010000002000000008F5300208F42003089
-:1072F000105300EB000211008F43001C006280213C
-:107300008E0400008E050004961200088F42009043
-:107310009611000A3246FFFF0046102A104000175F
-:10732000000000008F8200D88F4300980043102394
-:107330002442DCBEAF4200908F4200902842DCBF66
-:1073400010400005000000008F4200908F43014470
-:1073500000431021AF4200908F4200900046102A57
-:1073600010400006000000008F4203482442000144
-:10737000AF420348100000E18F4203488F8200FCB7
-:1073800014400006000000008F4203442442000124
-:10739000AF420344100000D98F420344934205C218
-:1073A0001040000B32C200081040000832220200D8
-:1073B000104000063C0340009602000EAF4300ACB4
-:1073C0000002140010000002AF4200B0AF4000AC59
-:1073D000322200041040007F3222080010400003D7
-:1073E0003247FFFF100000022402002024020004A4
-:1073F000AFA200108F420030AFA200148F420010E5
-:107400003C03000200431025AFA200188F460098ED
-:107410008F4201080040F80900000000104000B74A
-:10742000000000008F42009C8F4300940242102114
-:10743000AF42009CAE03000C8F4200AC104000082D
-:107440003C0340008F42009400431025AFA200206F
-:107450008F42009C8F4300B01000000400431025B1
-:107460008F420094AFA200208F42009CAFA2002464
-:107470008F8200FC8FA300208FA40024AC43000067
-:10748000AC44000424420008AF8200F08F42009C0C
-:107490008F4402708F4502740040182100001021B3
-:1074A00000A3282100A3302B008220210086202168
-:1074B0003223006024020040AF440270AF450274E2
-:1074C000106200172C6200411040000524020020C9
-:1074D00010620008240200011000002600000000D5
-:1074E0002402006010620019240200011000002133
-:1074F000000000008F4202788F43027C2463000169
-:107500002C64000100441021AF420278AF43027C9A
-:107510008F4202788F43027C100000162402000183
-:107520008F4202808F430284246300012C64000197
-:1075300000441021AF420280AF4302848F42028098
-:107540008F4302841000000B240200018F42028846
-:107550008F43028C246300012C640001004410213D
-:10756000AF420288AF43028C8F4202888F43028C65
-:1075700024020001A34205C28F4200983244FFFF5B
-:107580002406FFF88F45013C0044102124420007E7
-:107590000046102424840007AF4200948F420090DC
-:1075A0008F43009400862024004410230065182B8C
-:1075B00014600005AF4200908F4200948F43014455
-:1075C00000431023AF4200948F4200941000002328
-:1075D000AF40009C3247FFFF50E0002232C2002043
-:1075E000144000022402001024020002AFA2001086
-:1075F0008F420030AFA200148F420010AFA20018DB
-:107600008F4600988F4201080040F80900000000F2
-:107610001040003A3245FFFF8F4200988F430090A0
-:107620008F46013C00451021AF4200988F42009CDC
-:107630008F440098A34005C200651823AF43009013
-:10764000004510210086202B14800005AF42009CCD
-:107650008F4200988F43014400431023AF420098AB
-:1076600032C2002010400005000000008F42035885
-:107670002442FFFFAF4203588F4203588F4200302D
-:107680008F430040244200012463FFFF0043102485
-:10769000AF4200308F420030145300180000000049
-:1076A0008F4200001040000700000000AF80004C37
-:1076B0008F82004C1040FFFD00000000100000050C
-:1076C00000000000AF8000488F8200481040FFFD9E
-:1076D000000000008F8200602403FFF700431024A5
-:1076E000AF8200608F4200001040000300000000E5
-:1076F00010000002AF80004CAF8000488FBF003800
-:107700008FB300348FB200308FB1002C8FB00028BF
-:1077100003E0000827BD004003E00008000000006F
-:1077200027BDFFD032C20020AFBF002CAFB200286F
-:10773000AFB1002410400004AFB000208F520028E9
-:1077400010000002000000008F5200208F42003025
-:10775000105200B5000211008F43001C006280210E
-:107760008E0400008E050004961100088F420090E0
-:107770009607000A3226FFFF0046102A1040001725
-:10778000000000008F8200D88F4300980043102330
-:107790002442DC46AF4200908F4200902842DC47F2
-:1077A00010400005000000008F4200908F4301440C
-:1077B00000431021AF4200908F4200900046102AF3
-:1077C00010400006000000008F42034824420001E0
-:1077D000AF420348100000AB8F4203488F8600FC85
-:1077E00010C0000C000000008F8200F42403FFF89A
-:1077F0000043102400461023000218C35860000103
-:10780000246301008F42008C0043102B14400006BB
-:10781000000712C28F42034424420001AF420344D6
-:10782000100000988F420344934305C21060000F7C
-:10783000304600018F4200103448040032C2000874
-:107840001040000830E20200104000063C034000F7
-:107850009602000EAF4300AC0002140010000004BA
-:10786000AF4200B010000002AF4000AC8F480010E3
-:1078700030E20004104000453227FFFF8F4900AC82
-:107880001120000530C200FF144000062402004011
-:10789000100000042402000814400002240200200A
-:1078A00024020004AFA200108F4300301120000416
-:1078B000AFA300148F4200B000621025AFA20014E5
-:1078C0003C02000201021025AFA200188F4600986A
-:1078D0008F4201080040F8090000000010400069D4
-:1078E0003224FFFF8F42008C8F430094244200011A
-:1078F000AF42008C24020001AE03000CA34205C27B
-:107900008F4200982406FFF88F45013C0044102167
-:10791000244200070046102424840007AF4200944C
-:107920008F4200908F43009400862024004410234F
-:107930000065182B14600005AF4200908F42009440
-:107940008F43014400431023AF4200948F430094BF
-:107950008F4201400043102B10400009000000003E
-:107960008F43013C8F4400948F4200908F45013833
-:107970000064182300431023AF420090AF450094E9
-:107980008F4200941000001FAF42009810E0001DCD
-:1079900030C200FF14400002240200102402000242
-:1079A000AFA200108F420030AFA80018AFA20014A1
-:1079B0008F4600988F4201080040F809000000003F
-:1079C000104000303225FFFF8F4200988F44013C69
-:1079D00000451021AF4200988F4200908F430098DD
-:1079E000A34005C2004510230064182B1460000555
-:1079F000AF4200908F4200988F4301440043102310
-:107A0000AF4200988F4200308F4300402442000173
-:107A10002463FFFF00431024AF4200308F42003048
-:107A200014520018000000008F42000010400007B0
-:107A300000000000AF80004C8F82004C1040FFFD22
-:107A4000000000001000000500000000AF800048AA
-:107A50008F8200481040FFFD000000008F82006010
-:107A60002403FFF700431024AF8200608F42000020
-:107A7000104000030000000010000002AF80004C26
-:107A8000AF8000488FBF002C8FB200288FB1002438
-:107A90008FB0002003E0000827BD003003E000089D
-:107AA0000000000027BDFFD83C02000134422EC078
-:107AB000AFBF00208F4300F08F84010802E2102145
-:107AC00054620004246200083C02000134422CC0CD
-:107AD00002E2102100401821AF4300F0AC6000002A
-:107AE0008F4200EC8C660004146200043C0200012A
-:107AF000248200201000000FAF8201088F4300F0A5
-:107B000034422EC002E210215462000424620008B4
-:107B10003C02000134422CC002E210210040182136
-:107B20008C6200040002114000821021AF82010823
-:107B3000AC6000008C85001830A200361040006C4C
-:107B400030A200018C82001C8F4300408F4400341F
-:107B5000244200012463FFFF0043102400862021FB
-:107B6000AF42002C30A2003014400006AF44003475
-:107B70008F4200348C03023C0043102B144000B4AD
-:107B80000000000032C20010104000282407000846
-:107B90008F4401708F4501748F43002C8F48000C77
-:107BA0008F86012024020080AFA20010AFA3001432
-:107BB000AFA800188F42010C0040F80924C6001C31
-:107BC00014400011240200013C010001003708218B
-:107BD000A02240F18F820124AFA200108F820128E1
-:107BE0003C040001248467C4AFA200148F46002C1B
-:107BF0008F8701203C0500090C002B3B34A51100A8
-:107C000010000036000000008F4203008F43002C5C
-:107C100024420001AF4203008F420300240200010E
-:107C2000A34205C110000026AF4300388F44017005
-:107C30008F4501748F43002C8F48000C8F860120E4
-:107C400024020020AFA20010AFA30014AFA80018B8
-:107C50008F42010C0040F80924C6001C144000119A
-:107C6000240200013C01000100370821A02240F05D
-:107C70008F820124AFA200108F8201283C040001F2
-:107C8000248467B8AFA200148F46002C8F87012090
-:107C90003C0500090C002B3B34A509001000000F27
-:107CA000000000008F42030024420001AF420300A5
-:107CB0008F4203008F42002CA34005C1AF42003821
-:107CC0003C01000100370821A02040F13C010001E7
-:107CD00000370821A02040F0AF4000348F42031449
-:107CE00024420001AF420314100000598F420314D4
-:107CF0001040002230A270008C85001C8F420028AA
-:107D000000A2202304810003000000008F420040F5
-:107D1000008220218F4203588F430000AF45002886
-:107D20000044102110600007AF420358AF80004CA0
-:107D30008F82004C1040FFFD000000001000000585
-:107D400000000000AF8000488F8200481040FFFD17
-:107D5000000000008F82006034420008AF820060A3
-:107D60008F420000104000030000000010000038A7
-:107D7000AF80004C10000036AF8000481040002F4C
-:107D800030A210001040000C30A240008C83001C78
-:107D90008F420050006220230482000124840200EC
-:107DA0008F42035C00441021AF42035C8F420368A2
-:107DB0001000001AAF4300501040000C32C2800087
-:107DC0008C83001C8F42007000622023048200011B
-:107DD000248404008F42036400441021AF420364F2
-:107DE0008F4203681000000DAF4300701040000E7A
-:107DF0003C0208008C83001C8F420060006220233C
-:107E000004820001248401008F4203600044102199
-:107E1000AF4203608F420368AF430060004410210B
-:107E2000AF4203683C02080002C210245040000820
-:107E300036940040100000060000000030A201004F
-:107E400010400003000000000C002BD800000000D0
-:107E50008FBF002003E0000827BD002803E00008D2
-:107E60000000000027BDFFA8AFBF0050AFBE004C10
-:107E7000AFB50048AFB30044AFB20040AFB1003C73
-:107E8000AFB000388F91010826220020AF82010890
-:107E90008E3200180000A82132420024104001BA9E
-:107EA0000000F0218E26001C8F43001C00061100EC
-:107EB000006218218C70000C9604000C962D0016A0
-:107EC0009473000A2C8305DD388288702C420001EF
-:107ED00000621825106000150000282132C2004001
-:107EE00010400015240208009603001414620012CA
-:107EF0003402AAAA9603000E146200070000202193
-:107F00009603001024020300146200040080102174
-:107F1000960200122C4400010080102154400006FB
-:107F200024050016100000040000000024020800D0
-:107F3000508200012405000E934205C3144000083E
-:107F400000005821240B000132620180AF4500A8D7
-:107F5000AF5000A010400002AF4600A4A34B05C3E1
-:107F600010A0008502054021910200000000382188
-:107F70003042000F0002508032C200021040001256
-:107F8000010A1821326200021040001032C20001C2
-:107F900001002021948200002484000200E23821A4
-:107FA0000083102B1440FFFB30E2FFFF00071C0290
-:107FB0000062382100071C0230E2FFFF0062382116
-:107FC00000071027A502000A32C200011040006A13
-:107FD0003262000110400068000000008F4200A8DB
-:107FE00010400065000000008F4200A08F4300A8F1
-:107FF00000431021904C0009318900FF392300060D
-:108000000003182B392200110002102B00621824E3
-:108010001060000C3C0500068F4200A43C040001E7
-:10802000248467D4AFA200108F4200A034A546007C
-:10803000012038210C002B3BAFA200141000004E91
-:108040000000000032C20004144000130000282188
-:10805000316200FF1440000400000000950200029D
-:108060001000000D004A28239505000C9502000E13
-:108070009503001000A2282100A3282195030012D7
-:10808000910400099502000200A3282100A42821E0
-:10809000004A102300A2282102002021948200001F
-:1080A0002484000200E238210088102B1440FFFBDA
-:1080B00000071C0230E2FFFF0062382100071C02AB
-:1080C00030E2FFFF0062382101A5282100051C02D3
-:1080D00030A2FFFF0062282100051C0230A2FFFF32
-:1080E0000062282100A728230005140200A22821ED
-:1080F00030A5FFFF50A000013405FFFF316200FFF3
-:1081000014400008318300FF8F4300A08F4200A875
-:1081100000624021910200003042000F00025080B6
-:10812000318300FF2402000614620003010A1021BB
-:10813000100000022444001024440006316200FFB5
-:1081400014400006000000009482000000A22821D4
-:1081500000051C0230A2FFFF00622821934205C3E4
-:10816000104000033262010050400003A48500006B
-:1081700000052827A48500009622000E8F43009C4E
-:108180000062182132A200FF10400007AF43009C9C
-:108190003C02400002021025AFA200208F42009C4A
-:1081A00010000003005E1025AFB000208F42009C3D
-:1081B000AFA2002432620080104000103262010041
-:1081C0008F4200B424430001000210C00057102168
-:1081D000AF4300B48FA300208FA400243C01000112
-:1081E00000220821AC2338E83C01000100220821CC
-:1081F000AC2438EC100000A532C20020104000640E
-:10820000000000008F4200B424430001000210C0AF
-:1082100000571021AF4300B48FA300208FA4002487
-:108220003C01000100220821AC2338E83C01000198
-:1082300000220821AC2438EC8F4200B410400051D9
-:10824000000038213C090001352938E83C08001FAE
-:108250003508FFFF240BFFFF340AFFFF000710C0A3
-:1082600000571021004910218C4300008C44000469
-:10827000AFA30028AFA4002C8F8200FC8FA300289E
-:108280008FA4002CAC430000AC440004244200083E
-:10829000AF8200F08F42008C2442FFFFAF42008C7F
-:1082A00097A2002E8F4402708F450274004018215F
-:1082B0000000102100A3282100A3302B00822021E0
-:1082C00000862021AF440270AF4502748FA20028BF
-:1082D0000048102490430000306300011460000B3C
-:1082E000004020218F4202788F43027C24630001EA
-:1082F0002C64000100441021AF420278AF43027C9D
-:108300008F4202781000001A8F43027C8C8200009A
-:10831000144B000E0000000094820004144A000B6D
-:10832000000000008F4202888F43028C246300010A
-:108330002C64000100441021AF420288AF43028C3C
-:108340008F4202881000000A8F43028C8F42028005
-:108350008F430284246300012C6400010044102137
-:10836000AF420280AF4302848F4202808F43028477
-:108370008F4200B424E7000100E2102B1440FFB844
-:10838000000710C0A34005C31000003FAF4000B479
-:108390008F8200FC8FA300208FA40024AC43000038
-:1083A000AC44000424420008AF8200F08F42009CDD
-:1083B0008F46008C8F4402708F4502740040182154
-:1083C0000000102124C6FFFFAF46008C00A3282127
-:1083D00000A3302B0082202100862021AF440270B0
-:1083E000AF45027492020000304200011440000CBC
-:1083F0002402FFFF8F4202788F43027C2463000136
-:108400002C64000100441021AF420278AF43027C8B
-:108410008F4202788F43027C1000001C32C2002081
-:108420008E0300001462000F3402FFFF9603000465
-:108430001462000C000000008F4202888F43028CFF
-:10844000246300012C64000100441021AF42028823
-:10845000AF43028C8F4202888F43028C1000000BC6
-:1084600032C200208F4202808F43028424630001C5
-:108470002C64000100441021AF420280AF4302840B
-:108480008F4202808F43028432C2002010400005D8
-:10849000AF40009C8F4203582442FFFFAF42035875
-:1084A0008F4203588E22001C8F430040244200015B
-:1084B0002463FFFF00431024AF42002C32420060CF
-:1084C0001440000832C200108F42003424420001E0
-:1084D000AF4200348C03023C0043102B14400102D5
-:1084E00032C2001010400018240700088F440170A9
-:1084F0008F4501748F43002C8F48000C8F8601201C
-:1085000024020080AFA20010AFA30014AFA800188F
-:108510008F42010C0040F80924C6001C104000479F
-:10852000240200018F4203008F43002C24420001EB
-:10853000AF4203008F42030024020001A34205C1A1
-:108540001000007CAF4300388F4401708F450174E8
-:108550008F43002C8F48000C8F86012024020020BE
-:10856000AFA20010AFA30014AFA800188F42010CF7
-:108570000040F80924C6001C1040005724020001E6
-:10858000100000650000000032420012104000752B
-:10859000324200019622000E8F43009C0062182197
-:1085A00032C2002010400005AF43009C8F420358A8
-:1085B0002442FFFFAF4203588F4203588E22001C13
-:1085C0008F430040244200012463FFFF0043102436
-:1085D000AF42002C324200101440000832C200109A
-:1085E0008F42003424420001AF4200348C03023C2D
-:1085F0000043102B144000BC32C200101040002871
-:10860000240700088F4401708F4501748F43002CAC
-:108610008F48000C8F86012024020080AFA200103A
-:10862000AFA30014AFA800188F42010C0040F80956
-:1086300024C6001C14400011240200013C0100016A
-:1086400000370821A02240F18F820124AFA2001040
-:108650008F8201283C040001248467C4AFA2001467
-:108660008F46002C8F8701203C0500090C002B3B16
-:1086700034A5110010000036000000008F420300F6
-:108680008F43002C24420001AF4203008F420300BD
-:1086900024020001A34205C110000026AF430038A8
-:1086A0008F4401708F4501748F43002C8F48000C5C
-:1086B0008F86012024020020AFA20010AFA3001477
-:1086C000AFA800188F42010C0040F80924C6001C16
-:1086D00014400011240200013C0100010037082170
-:1086E000A02240F08F820124AFA200108F820128C7
-:1086F0003C040001248467B8AFA200148F46002C0C
-:108700008F8701203C0500090C002B3B34A5090094
-:108710001000000F000000008F42030024420001FF
-:10872000AF4203008F4203008F42002CA34005C1DB
-:10873000AF4200383C01000100370821A02040F181
-:108740003C01000100370821A02040F0AF40003478
-:108750008F42031424420001AF4203141000006250
-:108760008F42031410400022324270008E25001CFC
-:108770008F42002800A22023048100030000000093
-:108780008F420040008220218F4203588F43000017
-:10879000AF4500280044102110600007AF42035885
-:1087A000AF80004C8F82004C1040FFFD00000000A5
-:1087B0001000000500000000AF8000488F820048D4
-:1087C0001040FFFD000000008F820060344200086E
-:1087D000AF8200608F4200001040000300000000E4
-:1087E00010000041AF80004C1000003FAF800048F7
-:1087F0001040002F324210001040000C3242400066
-:108800008E23001C8F42005000622023048200014E
-:10881000248402008F42035C00441021AF42035CB9
-:108820008F4203681000001AAF4300501040000C44
-:1088300032C280008E23001C8F4200700062202311
-:1088400004820001248404008F4203640044102148
-:10885000AF4203648F4203681000000DAF43007005
-:108860001040000E3C0208008E23001C8F42006066
-:108870000062202304820001248401008F420360EF
-:1088800000441021AF4203608F420368AF43006091
-:1088900000441021AF4203683C02080002C21024C9
-:1088A00050400011369400401000000F00000000FE
-:1088B0003242004810400007241500018E22001C9F
-:1088C0003C03FFFF0043F0243042FFFF1000FD7522
-:1088D000AE22001C324201001040000300000000E4
-:1088E0000C002BD8000000008FBF00508FBE004C42
-:1088F0008FB500488FB300448FB200408FB1003C69
-:108900008FB0003803E0000827BD005803E00008DE
-:108910000000000000000000000000008F8300E461
-:108920008F8200E02404FFF8004410240062102627
-:108930000002102B0002102303E000080062102444
-:1089400003E000080000000027BDFFE0AFBF001CEF
-:10895000AFB000188F8600C48F8400E08F8500E4DC
-:108960002402FFF80082182410A3000927623FF8B0
-:1089700014A2000224A200082762300000408021D7
-:1089800016030005308200041040000400C02021BE
-:1089900010000022000010218E0400008F42011CF4
-:1089A00014A20003000000008F420120AF42011416
-:1089B0008CA300008F420148008318230043102B32
-:1089C00010400003000000008F420148006218219F
-:1089D00094A20006244200500062102B1440000FA5
-:1089E00000A01021AFA40010AFA300148CA60000BB
-:1089F0008CA700043C0400010C002B3B24846894E9
-:108A00008F42020C24420001AF42020C8F42020C42
-:108A100000001021AF9000E8AF9000E48FBF001C71
-:108A20008FB0001803E0000827BD002003E0000815
-:108A3000000000008F8400E08F8800C48F8300E86E
-:108A40002402FFF80082382400E320232C82100047
-:108A50005040000124841000000420C2008018212E
-:108A60008F4402588F45025C0000102100A328218A
-:108A700000A3302B0082202100862021AF44025821
-:108A8000AF45025C8F8300C88F4201480103202359
-:108A90000082102B14400004008018218F420148EE
-:108AA00000822021008018218F4402508F450254FB
-:108AB0000000102100A3282100A3302B00822021D8
-:108AC00000862021AF440250AF450254AF8800C851
-:108AD000AF8700E4AF8700E803E000080000000073
-:108AE00027BDFF30240A0001AFBF00C8AFBE00C4DD
-:108AF000AFB500C0AFB300BCAFB200B8AFB100B407
-:108B0000AFB000B0A3A00097AFA00044AFAA005C34
-:108B1000934205C4A7A0008E1040000AA7A00086BB
-:108B20008F4B00C4AFAB00648F4A00C0AFAA006C8B
-:108B30008F4B00CCAFAB00748F4A00C810000129E6
-:108B4000AFAA007C8F4201140040F8090000000029
-:108B50000040302110C0034F000000008CC2000014
-:108B60008CC30004AFA20020AFA300248FAB00246D
-:108B70008FAA00203162FFFF2442FFFCAFA2006CED
-:108B80003C02000602C21024AFAB007C144000156A
-:108B9000AFAA006491420000304200011040001171
-:108BA0002402FFFF8D430000146200043402FFFF23
-:108BB000954300041062000B000000000C0024BB71
-:108BC0008FA40064304200FF144000060000000043
-:108BD0008F4201180040F809000000001000032D2A
-:108BE000000000008FA200243C03FFBF3463FFFF9E
-:108BF000004310243C03FFFF0043182414600003CB
-:108C0000AFA2002410000040000018213C020080A8
-:108C10000062102410400007000000008F42038C07
-:108C200024420001AF42038C8F42038C10000036B7
-:108C3000240300018F42021024420001AF420210BF
-:108C40008F4202103C020001006210241040000616
-:108C50003C0200028F4201C424420001AF4201C421
-:108C60008F4201C43C020002006210241040000642
-:108C70003C0200048F42037C24420001AF42037C8B
-:108C80008F42037C3C020004006210241040000666
-:108C90003C0200088F42038024420001AF4203805F
-:108CA0008F4203803C02000800621024104000063E
-:108CB0003C0200108F42038424420001AF4203842F
-:108CC0008F4203843C020010006210241040000612
-:108CD0003C0200208F4201C024420001AF4201C08B
-:108CE0008F4201C03C0200200062102410400006A8
-:108CF000240300018F42038824420001AF4203880D
-:108D00008F420388240300018C0202608FAB006C49
-:108D1000004B102B10400014307000FF8F4201E810
-:108D200024420001AF4201E88F4201E88FAA007C93
-:108D30008F8200E0354A0100AFAA007CAFA200108C
-:108D40008F8200E4241000013C040001248468A008
-:108D5000AFA200148FA600208FA700243C050007B7
-:108D60000C002B3B34A50800120000103C020080D0
-:108D700002C210241440000E32C204008FAB007CEB
-:108D80003C020080344201000162102410400005C2
-:108D9000000000008F42020C24420001AF42020C8E
-:108DA0008F42020C100002B08FA3006C32C204008C
-:108DB00010400015340281008FAA00649543000C16
-:108DC000146200123C020100240B0200A7AB008ECB
-:108DD0009542000E8D4300088D4400048D4500002F
-:108DE0008FAA006C8FAB0064254AFFFCAFAA006C11
-:108DF000A7A20086AD63000CAD640008AD65000459
-:108E0000256B0004AFAB00643C02010002C21024D9
-:108E100010400004000000008FAA006C254A0004E6
-:108E2000AFAA006C8F4200BC5040000AAFA0007493
-:108E30008FAB006C004B102B50400006AFA00074AD
-:108E40008F4200BC01621023AFA200748F4A00BCA5
-:108E5000AFAA006C8F4200808FAB006C004B102BD0
-:108E60001040005632C280001040005E240A000309
-:108E700032C210001040005BAFAA005C1000005826
-:108E8000240B00048F4203502403FFBF0283A0245D
-:108E900024420001AF4203501000024F8F420350A2
-:108EA00002C2B0252402FFBF0282A0248F830128C2
-:108EB0003C040001248468D026620001AFA20014A3
-:108EC000AFA300108F8601208F8701243C05000787
-:108ED0000C002B3B34A522501000023F0000000084
-:108EE00002C2B0252402FFBF0282A0248F83012882
-:108EF0003C040001248468D024020002AFA20014C4
-:108F0000AFA300108F8601208F8701243C05000746
-:108F10000C002B3B34A524501000022F0000000051
-:108F20008EA200008EA300043C040001248468E8A3
-:108F3000AFB00010AFBE00148EA7001834A52800F3
-:108F40000C002B3B006030211000022300000000C9
-:108F5000A6B1000A8F8201243C040001248468F039
-:108F6000AFBE0014AFA200108F4600448F870120CF
-:108F70003C0500070C002B3B34A530001000021606
-:108F800000000000A6B1000AA6B2000E8F820124E4
-:108F90003C040001248468FCAFBE0014AFA20010A2
-:108FA0008F4600448F8701203C0500070C002B3BB7
-:108FB00034A5320010000208000000008F42008437
-:108FC0008FAA006C004A102B144000073C020001DD
-:108FD00002C210241040000400000000240B000214
-:108FE000AFAB005C8FAA006C1140021B27AB0020C6
-:108FF000AFAB00A43C0A001F354AFFFFAFAA009C9C
-:109000008FAB005C240A0001556A0021240A00028B
-:109010008F4300548F4200501062000B274B0054C6
-:109020008F5E00543403ECC0AFAB004C27C200018C
-:10903000304201FFAFA20054001E11400043102136
-:109040001000006B02E2A8218F4200448FAA006C3E
-:109050003C040001248468ACAFAA0014AFA2001045
-:109060008F4600548F4700503C0500070C002B3BF7
-:1090700034A513008F4303502402FFBF0282A024B3
-:1090800024630001AF430350100001D38F4203500B
-:10909000156A001D000000008F4300748F420070AD
-:1090A0001062000A274B00748F5E0074AFAB004C57
-:1090B00027C20001304203FFAFA20054001E11403E
-:1090C00024426CC01000004A02E2A8218F420044F2
-:1090D0008FAA006C3C040001248468B83C0500079A
-:1090E000AFAA0014AFA200108F4600748F47007023
-:1090F00034A51500240B00010C002B3BAFAB005C2A
-:109100001000FFC3000000008F4300648F42006026
-:109110001062001A274A00648F5E00648FAB005C07
-:10912000AFAA004C27C20001304200FFAFA200549A
-:10913000240200041562000E001E1140001E118062
-:1091400024420CC002E21021AFA200449442002A43
-:109150008FAA00448FAB006C004B102B10400024F2
-:1091600025550020240A000110000021A3AA009721
-:1091700024424CC01000001E02E2A8218F4200448D
-:109180008FAB006C3C040001248468C4AFAB0014B6
-:10919000AFA200108F4600648F4700603C050007B7
-:1091A0000C002B3B34A518003C02000802C210241E
-:1091B0001440FF34000000008F420370240A0001B5
-:1091C000AFAA005C24420001AF4203701000FF9080
-:1091D0008F42037027A3003600131040006218214D
-:1091E000946200000044102110000020A4620000DE
-:1091F0008FAB0064AEAB001893A2009710400072D2
-:10920000000098218FAA00448FA4006C8FA300A4B3
-:1092100025420020AFA2002825420008AFA200305E
-:1092200025420010AFAA002CAFA200349542002ABC
-:10923000A7A2003895420018A7A2003A9542001A4A
-:10924000A7A2003C9542001CA7A2003E9462001811
-:1092500024630002008220231880FFDE26730001B1
-:109260002E6200041440FFF9000000008F4200FC51
-:109270002665000100A2102A1440002B24030001DF
-:109280008F83012C10600023000000008F820124D6
-:109290000043102300022143588000012484004031
-:1092A0008F820128004310230002194358600001F7
-:1092B000246300400064102A544000010060202113
-:1092C000AF4400FC8F4200FC00A2102A10400011A5
-:1092D0002403000110000015306200FF8FAB006412
-:1092E00096070018AFAB00108E2200083C04000166
-:1092F000248468DC8C4300048C42000034A52400E4
-:10930000024030210C002B3BAFA300141000002BB7
-:10931000000000008F4203340000182124420001A5
-:10932000AF4203348F420334306200FF5040FEDC12
-:109330003C02080012600021000090218FB100A4BF
-:10934000022080218E220008960700188FA6006454
-:109350008C4400008C450004240A0001AFAA0010D0
-:10936000AFBE00148F420008AFA200188F42010C5C
-:109370000040F809000000001040FFD83C0500073D
-:10938000960200188FAB00648FAA009C01625821DE
-:10939000014B102B10400004AFAB00648F4201481A
-:1093A00001625823AFAB0064261000022652000170
-:1093B0000253102B1440FFE3263100048FB0006CE1
-:1093C0001000003697B100388F4200FC24050002DF
-:1093D00000A2102A1440001B240300018F83012CDB
-:1093E00010600013000000008F820124004310234E
-:1093F0000002214358800001248400408F8201280C
-:109400000043102300021943586000012463004008
-:109410000064102A5440000100602021AF4400FC89
-:109420008F4200FC00A2102A144000062403000111
-:109430008F4203340000182124420001AF4203345C
-:109440008F420334306200FF1040FEA53C0208004A
-:1094500096B1000A8FB0006C3223FFFF0070102B12
-:1094600054400001006080218EA400008EA50004FD
-:10947000240B0001AFAB0010AFBE00148F420008F8
-:109480008FA60064AFA200188F42010C0040F809BB
-:10949000020038211040FEA23C05000796A3000EF2
-:1094A00097AA008E1140000700609021934205C4E6
-:1094B000144000040000000097AB0086006A1825E5
-:1094C000A6AB00168FAA007C3C02FFFF01421024CD
-:1094D00010400003000A140234630400A6A2001422
-:1094E0008FAB006C560B0072A6A3000E3462000412
-:1094F000A6A2000E8FAA0074016A1021A6A2000A7B
-:109500008F4300448F4401A08F4501A434028000A2
-:10951000AFA200108F42004402A030212407002097
-:10952000AFA200148F42000C0003194000604821D4
-:10953000AFA200188F42010C0000402100A9282191
-:1095400000A9182B008820210040F8090083202161
-:109550005040FE7FA6B2000E8F420368AFA0006CA1
-:10956000A34005C42442FFFFAF4203688FAB005CF9
-:10957000240A00018F420368156A0006240A0002CB
-:109580008F42035C2442FFFFAF42035C1000000CDB
-:109590008F42035C156A0006000000008F420364DE
-:1095A0002442FFFFAF420364100000058F420364B2
-:1095B0008F4203602442FFFFAF4203608F4203608B
-:1095C0008FAA00548FAB004CAD6A00008F4200445C
-:1095D0008F4400888F430078244200010044102407
-:1095E00024630001AF420044AF4300788C02024084
-:1095F0000062182B14600075240700088F4401686E
-:109600008F45016C8F4300448F48000C8F860120EA
-:1096100024020040AFA20010AFA30014AFA80018AE
-:109620008F42010C0040F80924C6001C14400011B0
-:10963000240B00013C01000100370821A02B40F25F
-:109640008F820124AFA200108F8201283C04000108
-:109650002484688CAFA200148F4600448F870120B9
-:109660003C0500090C002B3B34A513001000000B37
-:10967000000000008F42030424420001AF420304B3
-:109680008F4203048F420044AF42007C3C01000142
-:1096900000370821A02040F2AF4000788F42031825
-:1096A00024420001AF420318100000488F42031803
-:1096B000A6B0000A8F4300448F4401A08F4501A447
-:1096C00034028000AFA200108F42004402A030217B
-:1096D00024070020AFA200148F42000C00031940A1
-:1096E00000604821AFA200188F42010C0000402109
-:1096F00000A9282100A9182B008820210040F80982
-:10970000008320211040FE1F240A0001A34A05C443
-:109710008FAB006C8FAA006401705823AFAB006C54
-:109720008FAB009C01505021016A102B10400004A7
-:10973000AFAA00648F42014801425023AFAA0064DF
-:109740008F4203682442FFFFAF4203688FAA005C88
-:10975000240B00018F420368154B0006240B000206
-:109760008F42035C2442FFFFAF42035C1000000CF9
-:109770008F42035C114B0006000000008F42036023
-:109780002442FFFFAF420360100000058F420360D8
-:109790008F4203642442FFFFAF4203648F4203649D
-:1097A0008FAB00548FAA004CAD4B00008F42004499
-:1097B0008F4400888F430078244200010044102425
-:1097C00024630001AF420044AF4300788FAA006CCD
-:1097D0001540FE0B000000008FAB006C1160001EF6
-:1097E00000000000934205C4104000090000000082
-:1097F0008FAA0064AF4A00C4AF4B00C08FAB007C9F
-:10980000AF4B00C88FAA00741000000EAF4A00CC06
-:1098100097AB008E1160000B340381008FA20020F3
-:109820008C46000CA443000C97AA00868C440004CC
-:109830008C450008A44A000EAC440000AC4500046E
-:10984000AC4600088F42034C24420001AF42034C57
-:10985000100000108F42034C8FAB007C3164FFFF7F
-:109860002484FFFC008018218F4402508F4502544D
-:109870008F4601180000102100A3282100A3382BD7
-:109880000082202100872021AF44025000C0F80947
-:10989000AF4502548FBF00C88FBE00C48FB500C053
-:1098A0008FB300BC8FB200B88FB100B48FB000B0DE
-:1098B00003E0000827BD00D003E00008000000001E
-:1098C00027BDFF38240B0001AFBF00C0AFBE00BCF6
-:1098D000AFB500B8AFB300B4AFB200B0AFB100AC39
-:1098E000AFB000A8A3A00087AFA00044AFAB005C5E
-:1098F000934205C4A7A0007610400007A7A0007EF1
-:109900008F4C00C0AFAC00648F4B00C88F5E00C4AA
-:1099100010000130AFAB006C8F4201140040F80919
-:10992000000000000040302110C002A10000000033
-:109930008CC200008CC30004AFA20020AFA300249F
-:109940008FAC00248FBE00203182FFFF2442FFFC39
-:10995000AFA200643C02000602C2102414400015AD
-:10996000AFAC006C93C20000304200011040001107
-:109970002402FFFF8FC30000146200043402FFFFC3
-:1099800097C300041062000B000000000C0024BB11
-:1099900003C02021304200FF1440000600000000F8
-:1099A0008F4201180040F8090000000010000280FA
-:1099B000000000008FA200243C03FFBF3463FFFFC0
-:1099C000004310243C03FFFF0043182414600003ED
-:1099D000AFA2002410000040000080213C02008063
-:1099E0000062102410400007000000008F42038C2A
-:1099F00024420001AF42038C8F42038C10000036DA
-:109A0000241000018F42021024420001AF420210D4
-:109A10008F4202103C020001006210241040000638
-:109A20003C0200028F4201C424420001AF4201C443
-:109A30008F4201C43C020002006210241040000664
-:109A40003C0200048F42037C24420001AF42037CAD
-:109A50008F42037C3C020004006210241040000688
-:109A60003C0200088F42038024420001AF42038081
-:109A70008F4203803C020008006210241040000660
-:109A80003C0200108F42038424420001AF42038451
-:109A90008F4203843C020010006210241040000634
-:109AA0003C0200208F4201C024420001AF4201C0AD
-:109AB0008F4201C03C0200200062102410400006CA
-:109AC000241000018F42038824420001AF42038822
-:109AD0008F420388241000018C0202608FAB006467
-:109AE000004B102B10400015320200FF8F4201E89E
-:109AF00024420001AF4201E88F4201E88FAC006CC4
-:109B00008F8200E0358C0100AFAC006CAFA200107A
-:109B10008F8200E4241000013C040001248468A02A
-:109B2000AFA200148FA600208FA700243C050007D9
-:109B30000C002B3B34A53600320200FF1040001011
-:109B40003C02008002C210241440000E32C2040005
-:109B50008FAB006C3C020080344201000162102493
-:109B600010400005000000008F42020C244200015A
-:109B7000AF42020C8F42020C100002028FA300645D
-:109B800032C20400104000123402810097C3000C5E
-:109B90001462000F00000000240C0200A7AC007645
-:109BA00097C2000E8FC300088FC400048FAB0064FF
-:109BB0008FC50000256BFFFCAFAB0064A7A2007E41
-:109BC000AFC3000CAFC40008AFC5000427DE00041B
-:109BD0008FA70064320200FF144000343C020100F1
-:109BE00097C4000C2C8305DD388288702C4200015C
-:109BF00000621825106000150000282132C20800FC
-:109C0000104000152402080097C3001414620012CB
-:109C10003402AAAA97C3000E146200070000202194
-:109C200097C3001024020300146200040080102176
-:109C300097C200122C4400010080102154400006FD
-:109C40002405001610000004000000002402080093
-:109C5000508200012405000E10A0001303C520212E
-:109C6000248300093C02001F3442FFFF0043102BF5
-:109C700010400003000000008F42014800621823DA
-:109C800090620000384300062C6300013842001146
-:109C90002C42000100621825106000043C02010003
-:109CA00094820002004538213C02010002C21024C7
-:109CB0005040000EAFA700648FAC006410EC0008A9
-:109CC0003C0500073C040001248469088FA6006459
-:109CD00034A54000AFA000100C002B3BAFA0001437
-:109CE0008FAB0064256B0004AFAB00648F42008033
-:109CF0008FAC0064004C102B1040002C32C280004E
-:109D000010400034240B000332C210001040003118
-:109D1000AFAB005C1000002E240C00048F420350F7
-:109D20002403FFBF0283A02424420001AF4203505A
-:109D3000100001738F4203503C02080002C2B0259C
-:109D40002402FFBF0282A0248F8301283C0400016B
-:109D5000248468D026620001AFA20014AFA30010D3
-:109D60008F8601208F8701243C0500070C002B3BC8
-:109D700034A5530010000162000000008EA2000014
-:109D80008EA300043C040001248468E8AFB00010F6
-:109D9000AFB100148EA7001834A559000C002B3B5E
-:109DA0000060302110000156000000008F42008446
-:109DB0008FAB0064004B102B144000073C020001E5
-:109DC00002C210241040000400000000240C000215
-:109DD000AFAC005C8FAB00641160016627AC002063
-:109DE000AFAC008C8FAB005C240C0001556C0021E3
-:109DF000240C00028F4300548F4200501062000B6D
-:109E0000274B00548F5100543403ECC0AFAB004CCF
-:109E100026220001304201FFAFA200540011114080
-:109E2000004310211000006B02E2A8218F42004481
-:109E30008FAC00643C040001248468ACAFAC001417
-:109E4000AFA200108F4600548F4700503C0500071A
-:109E50000C002B3B34A543008F4303502402FFBF6B
-:109E60000282A02424630001AF43035010000124A8
-:109E70008F420350156C001D000000008F430074DA
-:109E80008F4200701062000A274B00748F510074DB
-:109E9000AFAB004C26220001304203FFAFA20054BA
-:109EA0000011114024426CC01000004A02E2A821B7
-:109EB0008F4200448FAC00643C040001248468B8E5
-:109EC0003C050007AFAC0014AFA200108F46007431
-:109ED0008F47007034A54500240B00010C002B3B7C
-:109EE000AFAB005C1000FFC3000000008F430064B4
-:109EF0008F4200601062001A274C00648F5100648A
-:109F00008FAB005CAFAC004C26220001304200FF5A
-:109F1000AFA20054240200041562000E001111408B
-:109F20000011118024420CC002E21021AFA20044B3
-:109F30009442002A8FAC00448FAB0064004B102B7E
-:109F40001040002425950020240C00011000002161
-:109F5000A3AC008724424CC01000001E02E2A821DE
-:109F60008F4200448FAB00643C040001248468C429
-:109F7000AFAB0014AFA200108F4600648F470060A3
-:109F80003C0500070C002B3B34A548003C020008B0
-:109F900002C210241440FF61000000008F420370D1
-:109FA000240C0001AFAC005C24420001AF420370FE
-:109FB0001000FF908F42037027A30036001310405B
-:109FC0000062182194620000004410211000001F5C
-:109FD000A4620000AEBE001893A200871040008467
-:109FE000000098218FAB00448FA400648FA3008CE5
-:109FF00025620020AFA2002825620008AFA2003031
-:10A0000025620010AFAB002CAFA200349562002A8D
-:10A01000A7A2003895620018A7A2003A9562001A1C
-:10A02000A7A2003C9562001CA7A2003E9462001803
-:10A0300024630002008220231880FFDF26730001C2
-:10A040002E6200041440FFF9000000008F4200FC63
-:10A050000262102A14400030240300018F83012C77
-:10A0600010600028000000008F82012400431023AC
-:10A070000002214358800001248400408F8201287F
-:10A08000004310230002194358600001246300407C
-:10A090000064102A5440000100602021AF4400FCFD
-:10A0A0008F4200FC0262102A1040001624030001B7
-:10A0B0001000001A306200FF8FAC008C00101040BE
-:10A0C000004C10219447001800101080004C102103
-:10A0D000AFBE00108C4200083C040001248468DC00
-:10A0E0003C0500078C4300048C42000034A5550059
-:10A0F000020030210C002B3BAFA3001410000039EC
-:10A10000000000008F4203340000182124420001A7
-:10A11000AF4203348F420334306200FF1040FF0629
-:10A12000000080218F4300082402FBFF1260002DF5
-:10A13000006250243C0B4000022B40258FB1008C64
-:10A140002669FFFF022090218E4200089627001802
-:10A150008C4400008C45000456090004240B0001C7
-:10A16000240C000210000002AFAC0010AFAB0010D6
-:10A1700016000004AFA800148F420008100000026F
-:10A18000AFA20018AFAA00188F42010C03C0302103
-:10A19000AFA80098AFA9009C0040F809AFAA00A0A2
-:10A1A0008FA800988FA9009C8FAA00A01040FFC222
-:10A1B0003C02001F962300183442FFFF03C3F02126
-:10A1C000005E102B10400003263100028F42014830
-:10A1D00003C2F023261000010213102B1440FFDAF3
-:10A1E000265200048FB000641000001A0000000026
-:10A1F00096A3000A8FB000640070102B5440000139
-:10A20000006080218EA400008EA500048FAB005C4E
-:10A21000240C0002AFAC0010934305C4000B1700E0
-:10A2200010600003022230253C02080000C23025E5
-:10A23000AFA600148F420008AFA200188F42010C95
-:10A2400003C030210040F809020038211040FECB45
-:10A250003C05000797AC00761180000796A3000E1E
-:10A26000934205C4144000040000000097AB007E38
-:10A27000006C1825A6AB00168FAC006C3C02FFFFEB
-:10A280000182102410400003000C14023463040007
-:10A29000A6A20014A6B0000A8FAB0064560B0006FD
-:10A2A00003D0F02134620004AFA00064A6A2000E27
-:10A2B0001000000DA34005C48FAC00643C02001FD9
-:10A2C0003442FFFF005E102B01906023AFAC0064AE
-:10A2D000A6A3000E240B000110400003A34B05C4ED
-:10A2E0008F42014803C2F0238FAB00548FAC004C67
-:10A2F000AD8B00008FAC00641580FEBA000000003A
-:10A300008FAB00641160001B00000000934205C485
-:10A310001040000600000000AF5E00C4AF4B00C05C
-:10A320008FAC006C1000000EAF4C00C897AB0076ED
-:10A330001160000B340381008FA200208C46000CBA
-:10A34000A443000C97AC007E8C4400048C450008AC
-:10A35000A44C000EAC440000AC450004AC46000820
-:10A360008F42034C24420001AF42034C1000001006
-:10A370008F42034C8FAB006C3164FFFF2484FFFCE1
-:10A38000008018218F4402508F4502548F460118D7
-:10A390000000102100A3282100A3382B00822021D7
-:10A3A00000872021AF44025000C0F809AF45025495
-:10A3B0008FBF00C08FBE00BC8FB500B88FB300B494
-:10A3C0008FB200B08FB100AC8FB000A803E00008DE
-:10A3D00027BD00C803E000080000000027BDFFD82B
-:10A3E000AFBF0024AFB000208F43004C8F42004825
-:10A3F00010620034000000008F4300488F42004C80
-:10A400000062202304820001248402008F43005450
-:10A410008F42004C0043102B144000042402020021
-:10A420008F43004C10000005004310238F4200545E
-:10A430008F43004C004310232442FFFF0040502173
-:10A44000008A102A54400001008050218F49004C9E
-:10A450008F48004C8F4401888F45018C8F46004CFB
-:10A4600024071000AFA70010000841400100182188
-:10A47000012A4821313001FFAFB000148F4700148A
-:10A480000000102100063140AFA7001800A32821CA
-:10A4900000A3382B00822021008720213402ECC049
-:10A4A00000C230218F42010802E630210040F80945
-:10A4B000000A394054400001AF50004C8F43004C1B
-:10A4C0008F42004814620018000000008F42000014
-:10A4D0001040000700000000AF80004C8F82004C4D
-:10A4E0001040FFFD0000000010000005000000000B
-:10A4F000AF8000488F8200481040FFFD0000000040
-:10A500008F8200602403FDFF00431024AF820060AF
-:10A510008F42000010400003000000001000000205
-:10A52000AF80004CAF8000488FBF00248FB0002068
-:10A5300003E0000827BD002803E000080000000039
-:10A5400027BDFFD8AFBF0024AFB000208F43005C11
-:10A550008F42005810620049000000008F430058ED
-:10A560008F42005C006220230482000124840100E9
-:10A570008F4300648F42005C0043102B14400004A2
-:10A58000240201008F43005C1000000500431023EB
-:10A590008F4200648F43005C004310232442FFFF7E
-:10A5A000004038210087102A5440000100803821E3
-:10A5B0008F42005C00471021305000FF32C2100073
-:10A5C00010400015240820008F49005C8F44019042
-:10A5D0008F4501948F46005C00073980AFA80010BA
-:10A5E000AFB000148F4800140009498001201821E1
-:10A5F0000000102100A3282100A3482B0082202165
-:10A600000089202100063180AFA800188F42010880
-:10A610001000001424C60CC08F49005C8F440190C8
-:10A620008F4501948F46005C00073940AFA80010A9
-:10A63000AFB000148F4800140009494001201821D0
-:10A640000000102100A3282100A3482B0082202114
-:10A650000089202100063140AFA800188F42010870
-:10A6600024C64CC00040F80902E6302154400001E5
-:10A67000AF50005C8F43005C8F420058146200189A
-:10A68000000000008F4200001040000700000000A2
-:10A69000AF80004C8F82004C1040FFFD0000000096
-:10A6A0001000000500000000AF8000488F820048C5
-:10A6B0001040FFFD000000008F8200602403FEFFB9
-:10A6C00000431024AF8200608F420000104000035E
-:10A6D0000000000010000002AF80004CAF80004876
-:10A6E0008FBF00248FB0002003E0000827BD0028A2
-:10A6F00003E000080000000027BDFFD8AFBF002422
-:10A70000AFB000208F43006C8F42006810620033AE
-:10A71000000000008F4300688F42006C006220231D
-:10A7200004820001248404008F4300748F42006C73
-:10A730000043102B14400004240204008F43006CDB
-:10A7400010000005004310238F4200748F43006CFB
-:10A75000004310232442FFFF00405021008A102AAA
-:10A7600054400001008050218F49006C8F48006CDC
-:10A770008F4401988F45019C8F46006C2407400050
-:10A78000AFA700100008414001001821012A48210C
-:10A79000313003FFAFB000148F47001400001021C8
-:10A7A0000006314024C66CC0AFA7001800A32821C2
-:10A7B00000A3382B00822021008720218F4201082E
-:10A7C00002E630210040F809000A394054400001F7
-:10A7D000AF50006C8F43006C8F4200681462001809
-:10A7E000000000008F420000104000070000000041
-:10A7F000AF80004C8F82004C1040FFFD0000000035
-:10A800001000000500000000AF8000488F82004863
-:10A810001040FFFD000000008F8200602403F7FF5E
-:10A8200000431024AF8200608F42000010400003FC
-:10A830000000000010000002AF80004CAF80004814
-:10A840008FBF00248FB0002003E0000827BD002840
-:10A8500003E00008000000008F4200FC3C03000100
-:10A860008F4400F8346330C824420001AF4200FC3A
-:10A870008F85012802E310215482000424820008FD
-:10A880003C02000134422EC802E21021004018218F
-:10A89000AF4300F8AC6000008F4200F41462000483
-:10A8A0003C02000124A200201000000FAF8201280A
-:10A8B0008F4300F8344230C802E210215462000491
-:10A8C000246200083C02000134422EC802E210213A
-:10A8D000004018218C6200040002114000A21021E7
-:10A8E000AF820128AC6000008CA3001830620070B9
-:10A8F0001040002D30620020104000043C02001087
-:10A9000002C210241040000D000000003062004020
-:10A91000104000043C02002002C210241040000736
-:10A9200000000000306200101040001F3C02004098
-:10A9300002C210241440001C000000008F8200405E
-:10A940003042000114400008000020218C03010463
-:10A950002402000150620005240400018C020264FC
-:10A960001040000300801021240400010080102109
-:10A9700010400006000000008F42030C244200013A
-:10A98000AF42030C100000088F42030C8F8200447A
-:10A9900034420004AF8200448F4203082442000185
-:10A9A000AF4203088F42030803E0000800000000E4
-:10A9B00003E000080000000027BDFF98AFBF006063
-:10A9C000AFBE005CAFB50058AFB30054AFB200509B
-:10A9D000AFB1004CAFB000488F4200FC24420001F0
-:10A9E000AF4200FC8F88012825020020AF82012899
-:10A9F0008D030018306200701040002E306200207D
-:10AA0000104000043C02001002C210241040000D4F
-:10AA10000000000030620040104000043C020020B2
-:10AA200002C2102410400007000000003062001035
-:10AA3000104001A93C02004002C21024144001A6AB
-:10AA4000000000008F8200403042000114400008E6
-:10AA5000000020218C030104240200015062000543
-:10AA6000240400018C0202641040000300801021C5
-:10AA700024040001008010211040000600000000A6
-:10AA80008F42030C24420001AF42030C10000192DC
-:10AA90008F42030C8F82004434420004AF82004492
-:10AAA0008F42030824420001AF4203081000018ACC
-:10AAB0008F420308306200021040014B3C02080044
-:10AAC0008D1E001C001E5702AFAA0034950A001606
-:10AAD00003C22024AFAA00248FAA0034240200015C
-:10AAE0001542000633DEFFFF001E11403403ECC0A8
-:10AAF000004310211000001002E2A82124020002ED
-:10AB00001542000524020003001E114024426CC0BF
-:10AB10001000000902E2A82115420005001E118064
-:10AB2000001E114024424CC01000000302E2A82184
-:10AB30000057102124550CE096A2000E304AFFFC6D
-:10AB40003042040010400003AFAA002C100000E1C6
-:10AB500000008821108000040000882197B10026A1
-:10AB6000100000DDA6B100128EB30018966A000C2A
-:10AB7000A7AA003E97A5003E2CA305DD38A2887049
-:10AB80002C420001006218251060001500002021F1
-:10AB900032C2080010400015240208009663001419
-:10ABA000146200123402AAAA9663000E146200070F
-:10ABB00000002821966300102402030014620004A0
-:10ABC00000A01021966200122C45000100A0102167
-:10ABD0005440000624040016100000040000000089
-:10ABE0002402080050A200012404000E108000B9C5
-:10ABF00002649021924200003042000F00028080E7
-:10AC000032C2010010400020025018213C020020F6
-:10AC10000043102B1440000E024020210000282188
-:10AC2000948200002484000200A228210083102BBB
-:10AC30001440FFFB30A2FFFF00051C020062282128
-:10AC400000051C0230A2FFFF10000009006228214D
-:10AC50008F4701488F420110001028423C06002017
-:10AC60000040F809AFA800403045FFFF8FA8004022
-:10AC700050A000013405FFFF8FAA002C354A0002C6
-:10AC800010000002AFAA002C0000282132C2008070
-:10AC900010400090A6A50010264300093C02001FAA
-:10ACA0003442FFFF0043102B10400003000000005F
-:10ACB0008F420148006218239066000030C200FFF6
-:10ACC000384300062C630001384200112C42000179
-:10ACD000006218251060007F24020800000088210F
-:10ACE00097A3003E1462000F0260202196710000BD
-:10ACF0009662000296630004966400060222882190
-:10AD00000223882102248821966200089663000AA3
-:10AD10009664000C0222882102238821100000077B
-:10AD200002248821948200002484000202228821C7
-:10AD30000092102B1440FFFB0000000000111C02C9
-:10AD40003222FFFF0062882100111C023222FFFF25
-:10AD50000062882132C2020010400003264400062F
-:10AD60001000003E000080213C05001F34A5FFFFBD
-:10AD700000A4102B10400003000000008F42014887
-:10AD8000008220239482000030421FFF1040000404
-:10AD90002644000C96420002100000300050802330
-:10ADA0009642000226430014005080233C020020FB
-:10ADB0000043102B1440000A00D080219642000C62
-:10ADC000020280219642000E964300109644001223
-:10ADD0000202802102038021100000200204802151
-:10ADE00000A4102B10400003000000008F42014817
-:10ADF0000082202394820000248400020202802129
-:10AE000000A4102B10400003000000008F420148F6
-:10AE10000082202394820000248400020202802108
-:10AE200000A4102B10400003000000008F420148D6
-:10AE300000822023948200002484000202028021E8
-:10AE400000A4102B10400003000000008F420148B6
-:10AE50000082202394820000020280213C02010033
-:10AE600002C210241040000E000000008FAA002C27
-:10AE7000314200041040000A000000009504000E5A
-:10AE8000026420210C003EEC2484FFFC3042FFFFD2
-:10AE90000222882100111C023222FFFF0062882159
-:10AEA0008FAA002401518823001114020222882154
-:10AEB0000230882100111402022288213231FFFF62
-:10AEC000522000013411FFFF8FAA002C354A0001E7
-:10AED000AFAA002CA6B1001297AA002EA6AA000EB7
-:10AEE0008FAA002C314200041040000224091000F7
-:10AEF000340980008F4800448F4401A08F4501A48D
-:10AF0000AFA900108F4900440008414001001821FA
-:10AF1000AFA900148F48000C02A0302124070020A4
-:10AF2000AFA800188F48010C0000102100A32821B1
-:10AF300000A3482B008220210100F809008920216C
-:10AF40001440000B000000008F8201283C04000127
-:10AF500024846914AFBE0014AFA200108F860124B0
-:10AF60008F8701203C0500070C002B3B34A599205E
-:10AF70008F4203682442FFFFAF4203688F420044C0
-:10AF80008F4300882442000100431024AF42004454
-:10AF90008FAA00348F440368240200011542000682
-:10AFA000240200028F42035C2442FFFFAF42035C95
-:10AFB000100000498F42035C1542000600000000AB
-:10AFC0008F4203642442FFFFAF420364100000423B
-:10AFD0008F4203648F4203602442FFFFAF4203604D
-:10AFE0001000003D8F4203603062100010400005E9
-:10AFF000306280008F420078244200011000003649
-:10B00000AF42007810400034000000008F4200780A
-:10B0100024420001AF4200788C0302400043102B11
-:10B020001440002D240700088F4401688F45016CEF
-:10B030008F4300448F48000C8F860120240200407B
-:10B04000AFA20010AFA30014AFA800188F42010CEC
-:10B050000040F80924C6001C14400011240200011D
-:10B060003C01000100370821A02240F28F82012418
-:10B07000AFA200108F8201283C0400012484688C58
-:10B08000AFA200148F4600448F8701203C050009C1
-:10B090000C002B3B34A513001000000B0000000037
-:10B0A0008F42030424420001AF4203048F42030491
-:10B0B0008F420044AF42007C3C0100010037082170
-:10B0C000A02040F2AF4000788F42031824420001D4
-:10B0D000AF4203188F4203188FBF00608FBE005C21
-:10B0E0008FB500588FB300548FB200508FB1004C11
-:10B0F0008FB0004803E0000827BD006803E00008A7
-:10B100000000000000000000000000008F42013C31
-:10B11000AF8200C08F42013CAF8200C48F42013C2D
-:10B12000AF8200C88F420138AF8200D08F42013811
-:10B13000AF8200D48F42013803E00008AF8200D80C
-:10B1400027BDFFE02784020824050200AFBF0018D6
-:10B150000C002BBF240600088C0202040C004012D5
-:10B16000AF8202103C0200018C426D94304200021A
-:10B170001040000E000020218C060248240200022C
-:10B180003C010001AC226D980C0051042405000222
-:10B19000000020218C060248240200013C0100012D
-:10B1A000AC226D9810000011240500018C060248A5
-:10B1B000240200043C010001AC226D980C005104F3
-:10B1C000240500043C0200018C426D9430420001D1
-:10B1D00010400008240200013C010001AC226D98DF
-:10B1E00000002021240500013C06601B0C005104D6
-:10B1F000000000003C040001248469D08F4201500B
-:10B200008F4301543C0500088F4601580002164048
-:10B21000000319403463040300431025000633C0C3
-:10B2200000461025AF82021CAFA00010AFA0001492
-:10B230008F86021C34A502000C002B3B0000382135
-:10B240003C010001AC206D903C010001AC206DA8D8
-:10B250008FBF001803E0000827BD002027BDFFE0D6
-:10B260003C05000834A50300AFBF0018AFA00010D4
-:10B27000AFA000148F8602003C040001248469DC26
-:10B280000C002B3B000038218F42041024420001A7
-:10B29000AF4204108F4204108FBF001803E0000873
-:10B2A00027BD002027BDFFD8AFBF0020AFB1001CD5
-:10B2B000AFB000188F4203A424420001AF4203A4A0
-:10B2C0008F4203A48F9002208F8200E0AFA2001073
-:10B2D0008F8200E4AFA200148F8600C48F8700C85D
-:10B2E0003C040001248469E80C002B3B0200282167
-:10B2F0003C04400002041024504000B43C0401000F
-:10B300008F4203BC24420001AF4203BC8F4203BC06
-:10B310008F8700C48F8300C88F42014800671823BD
-:10B320000043102B10400003000000008F42014832
-:10B330000062182110600005000000008F42014CDF
-:10B340000043102B1040000B000000008F8200E033
-:10B350008F430124AF42011CAF4301148F820220AE
-:10B360003C0308FF3463FFFB00431024100000CEB1
-:10B37000004410258F8202203C0308FF3463FFFF46
-:10B380000043102434420004AF8202208F8200E088
-:10B390008F430124AF42011CAF4301148F8600C8C4
-:10B3A0008F8401208F8301241000000500002821D4
-:10B3B0001462000224620020276248000040182125
-:10B3C0001064000C30A200FF8C62001830420003B1
-:10B3D0001040FFF727624FE08F4203D024050001A1
-:10B3E00024420001AF4203D08F4203D08C66000894
-:10B3F00030A200FF1440005800000000934205C432
-:10B4000014400055000000008F8700C48F8800E0C2
-:10B410008F8400E42402FFF8010240240104102379
-:10B42000000218C3046200012463020010600005DA
-:10B430002402000110620009000000001000001F3B
-:10B44000000000008F4203C000E0302124420001D0
-:10B45000AF4203C0100000408F4203C08F4203C4BC
-:10B4600024420001AF4203C48C8600008F42014891
-:10B470008F4303C400E618230043102B1040000440
-:10B480002C62233F8F420148006218212C62233F27
-:10B4900014400031000000008F42020C24420001E1
-:10B4A000AF42020C8F42020C00E0302124820008DF
-:10B4B000AF8200E410000028AF8200E88F4203C88A
-:10B4C00024420001AF4203C88F4203C88C850000AC
-:10B4D0008F42014800A718230043102B104000039F
-:10B4E000000000008F420148006218218F42014C89
-:10B4F0000043102B5440000A00A030218F42020C60
-:10B5000024420001AF42020C8F42020C2482000848
-:10B51000AF8200E48F8400E41488FFECAF8400E87D
-:10B520001488000D27623000148200022482FFF884
-:10B5300027623FF8944300063C02001F3442FFFF9D
-:10B5400000C330210046102B104000030000000013
-:10B550008F42014800C23023AF8600C88F8300C4E9
-:10B560008F42014800C318230043102B10400003F2
-:10B57000000000008F4201480062182110600005A1
-:10B58000000000008F42014C0043102B5040000887
-:10B590003C02FDFF8F8202203C0308FF3463FFFB67
-:10B5A000004310243C0340001000003F00431025DE
-:10B5B0008F4303CC3442FFFF0282A02424630001A6
-:10B5C000AF4303CC100000398F4203CC0204102497
-:10B5D0001040000E3C1102008F4203A824420001DB
-:10B5E000AF4203A88F4203A88F8202203C0308FFCA
-:10B5F0003463FFFF00431024004410250C003DAFCE
-:10B60000AF82022010000029000000000211102467
-:10B61000504000083C1104008F4203AC244200015A
-:10B62000AF4203AC0C003DAF8F4203AC10000019D9
-:10B6300000000000021110241040001C0000000057
-:10B640008F83022424021402146200093C050008BE
-:10B650003C040001248469F4AFA00010AFA00014E2
-:10B660008F86022434A505000C002B3B00003821F6
-:10B670008F4203B024420001AF4203B08F4203B0B7
-:10B680008F82022002002021344200020C004E9CD6
-:10B69000AF8202208F8202203C0308FF3463FFFF49
-:10B6A0000043102400511025AF8202208FBF0020DC
-:10B6B0008FB1001C8FB0001803E0000827BD0028E0
-:10B6C00003E00008000000003C0200018C426DA86D
-:10B6D00027BDFFB0AFBF0048AFBE0044AFB50040CC
-:10B6E000AFB3003CAFB20038AFB100341040000F30
-:10B6F000AFB000303C04000124846A003C0500081F
-:10B70000AFA00010AFA000148F86022034A5060061
-:10B71000240200013C010001AC206DA83C010001A5
-:10B72000AC226D9C0C002B3B000038213C037FFFBA
-:10B730008C0202683463FFFF3C04FDFF00431024C9
-:10B74000AC0202688F4200043484FFFF30420002E2
-:10B75000104000920284A0243C040600348420009F
-:10B760008F420004000028212403FFFD0043102421
-:10B77000AF420004AFA400208F5E001827AA00206B
-:10B78000240200FF13C20002AFAA002C27C500014B
-:10B790008C02022800A090211642000E001E38C024
-:10B7A0008F42033C24420001AF42033C8F42033CE2
-:10B7B0008C0202283C040001248469983C0500099D
-:10B7C000AFA00014AFA200108FA600201000006DE3
-:10B7D00034A5050000F710218FA300208FA40024BA
-:10B7E000AC4304C0AC4404C48F8300548F82005423
-:10B7F000247003E8020210232C4203E91040001BCE
-:10B800000000982100E08821263504C08F4401788B
-:10B810008F45017C02201821240A0004AFAA0010E1
-:10B82000AFB200148F48000C0000102102F5302147
-:10B83000AFA800188F48010C2407000800A3282196
-:10B8400000A3482B008220210100F8090089202153
-:10B8500054400006241300018F820054020210237A
-:10B860002C4203E91440FFE900000000326200FFAF
-:10B8700054400017AF5200188F4203782442000151
-:10B88000AF4203788F4203788F8201208FAA002C69
-:10B89000AFA200108F8201243C040001248469A41B
-:10B8A0003C050009AFA200148D46000010000035D1
-:10B8B00034A506008F42030824130001244200012E
-:10B8C000AF4203088F4203081000001E326200FFDF
-:10B8D0008F8300548F820054247003E802021023E7
-:10B8E0002C4203E910400016000098213C1500206E
-:10B8F000241100108F42000C8F4401608F450164B9
-:10B900008F860120AFB10010AFB200140055102592
-:10B91000AFA200188F42010C240700080040F8096C
-:10B9200024C6001C1440FFE3000000008F82005476
-:10B93000020210232C4203E91440FFEE0000000035
-:10B94000326200FF14400011000000008F420378B3
-:10B9500024420001AF4203788F4203788F82012096
-:10B960008FAA002CAFA200108F8201243C0400019A
-:10B97000248469AC3C050009AFA200148D46000088
-:10B9800034A507000C002B3B03C038218F4202EC8A
-:10B9900024420001AF4202EC8F4202EC8FBF00480C
-:10B9A0008FBE00448FB500408FB3003C8FB200388B
-:10B9B0008FB100348FB0003003E0000827BD005085
-:10B9C0003C0200018C426DA827BDFFE01440000D31
-:10B9D000AFBF00183C04000124846A0C3C05000839
-:10B9E000AFA00010AFA000148F86022034A507007E
-:10B9F000240200013C010001AC226DA80C002B3B8D
-:10BA0000000038213C02000402C21024104000074C
-:10BA1000000000008F8202203C0308FF3463FFFF18
-:10BA20000043102434420008AF8202203C0500018C
-:10BA30008CA56D982402000114A2000700002021AB
-:10BA40000C00529B24050001AC02026C8C03026CBA
-:10BA5000100000063C0200070C00529B0000202151
-:10BA6000AC0202688C0302683C02000700621824E2
-:10BA70003C0200025062000D3C0205F50043102B11
-:10BA8000144000063C0200043C0200011062000960
-:10BA90003C0200981000000B000000001462000936
-:10BAA0003C023B9A100000043442CA00100000021D
-:10BAB0003442E10034429680AF4201FC8F4201FCE7
-:10BAC000AEE200648FBF001803E0000827BD00202D
-:10BAD0000000000000000000000000000086102BA5
-:10BAE000504000010087202300C410230002484377
-:10BAF0000125102B1040001B00091040008240213E
-:10BB00000088102B104000070000182194820000CC
-:10BB100024840002006218210088102B1440FFFBCF
-:10BB2000000000000060202100C7302300A910237E
-:10BB30000002104000C2282100C5102B1040000751
-:10BB40000000182194C2000024C6000200621821DF
-:10BB500000C5102B1440FFFB000000001000000D7A
-:10BB60000083202100051040008228210085102B31
-:10BB70001040000700001821948200002484000275
-:10BB8000006218210085102B1440FFFB000000000C
-:10BB90000060202100041C023082FFFF006220218F
-:10BBA00000041C023082FFFF0062202103E0000835
-:10BBB0003082FFFF03E00008000000000080282121
-:10BBC00030A200011040002B3C03001F3463FFFF34
-:10BBD00024A200040062102B544000070065102BC3
-:10BBE00090A2000190A4000390A3000090A5000281
-:10BBF0001000002A00441021104000030000000043
-:10BC00008F42014800A2282390A4000024A500012F
-:10BC10000065102B10400003000000008F42014817
-:10BC200000A2282390A2000024A500010002120017
-:10BC3000008220210065102B10400003000000004E
-:10BC40008F42014800A2282390A2000024A50001F1
-:10BC5000008220210065102B10400003000000002E
-:10BC60008F42014800A2282390A200001000002D5E
-:10BC7000000212003463FFFF24A200040062102BB4
-:10BC80005440000A0065102B90A2000090A400020E
-:10BC900090A3000190A500030044102100021200AF
-:10BCA00000651821100000200043202110400003EF
-:10BCB000000000008F42014800A2282390A200004B
-:10BCC00024A50001000222000065102B1040000393
-:10BCD000000000008F42014800A2282390A200002B
-:10BCE00024A50001008220210065102B10400003D4
-:10BCF000000000008F42014800A2282390A200000B
-:10BD000024A5000100021200008220210065102BF2
-:10BD100010400003000000008F42014800A22823C9
-:10BD200090A200000082202100041C023082FFFF4C
-:10BD30000062202100041C023082FFFF00622021EB
-:10BD400003E000083082FFFF000000008F82022025
-:10BD500034420002AF8202203C0200028C428FF883
-:10BD60003042400010400054240400018F82020041
-:10BD700024067FFF8F830200304500022402FFFD6E
-:10BD800000621824AF830200AF8402048F83005442
-:10BD90008F82005410000002246300018F8200543F
-:10BDA000006210232C4200021440FFFC000000003F
-:10BDB0008F8202241444004D0004204000C4102B44
-:10BDC0001040FFF1000000008F82020000451025A6
-:10BDD000AF8202008F82022034428000AF820220B4
-:10BDE0008F8300548F8200541000000224630001EE
-:10BDF0008F820054006210232C4200021440FFFC8A
-:10BE0000000000008F8202203C0300040043102445
-:10BE10001440000F000000008F8202203C03FFFF4F
-:10BE200034637FFF00431024AF8202208F830054CD
-:10BE30008F82005410000002246300018F8200549E
-:10BE4000006210232C4200021440FFFC000000009E
-:10BE50008F8202203C030004004310241440000D94
-:10BE6000000000008F82022034428000AF82022056
-:10BE70008F8300548F82005410000002246300015D
-:10BE80008F820054006210232C4200021440FFFCF9
-:10BE9000000000008F8202203C03000400431024B5
-:10BEA0001040001B000010218F830220240200019B
-:10BEB000100000153C04F7008F8202203C04F700BC
-:10BEC00000441025AF8202208F8202202403FFFD50
-:10BED00000431024AF8202208F8202203C03030023
-:10BEE000004310241440000300000000100000086C
-:10BEF000000010218F82022034420002AF82022013
-:10BF00008F8302202402000100641825AF830220E1
-:10BF100003E0000800000000000020213C050100B3
-:10BF200024020001AF80021CAF820200AF82022017
-:10BF300027625000AF8200C027625000AF8200C469
-:10BF400027625000AF8200C827625000AF8200D045
-:10BF500027625000AF8200D427625000AF8200D821
-:10BF600027623000AF8200E027623000AF8200E439
-:10BF700027623000AF8200E827622800AF8200F01D
-:10BF800027622800AF8200F427622800AF8200F801
-:10BF9000000418C02484000103631021AC45300460
-:10BFA00003631021AC403000288202001440FFF9E6
-:10BFB000000418C000002021000418C024840001DF
-:10BFC00003631021AC40280403631021AC40280017
-:10BFD000288201001440FFF9000418C0AF80023C21
-:10BFE0002403008024040100AC60000024630004EA
-:10BFF0000064102B5440FFFDAC6000008F830040B4
-:10C000003C02F000006218243C0250001062000C58
-:10C010000043102B144000063C0260003C0240002C
-:10C020001062000824020800100000080000000050
-:10C030001062000424020800100000040000000048
-:10C04000240207003C010001AC226DAC03E00008B3
-:10C05000000000003C0200018C426DBC27BDFFD0F7
-:10C06000AFBF002CAFB20028AFB10024AFB00020AA
-:10C070003C01000110400005AC206D940C004D9E69
-:10C08000000000003C010001AC206DBC8F83005417
-:10C090008F82005410000002246300648F820054D9
-:10C0A000006210232C4200651440FFFC00000000D9
-:10C0B0000C004DB9000000002404000100002821FC
-:10C0C00027A60018340280000C0045BEA7A2001865
-:10C0D0008F8300548F820054100000022463006498
-:10C0E0008F820054006210232C4200651440FFFC34
-:10C0F00024040001240500010C00457C27A600183B
-:10C100008F8300548F820054100000022463006467
-:10C110008F820054006210232C4200651440FFFC03
-:10C1200024040001240500010C00457C27A600180A
-:10C130008F8300548F820054100000022463006437
-:10C140008F820054006210232C4200651440FFFCD3
-:10C15000240400013C06000124C66F240C00457C29
-:10C16000240500028F8300548F82005410000002C7
-:10C17000246300648F820054006210232C42006507
-:10C180001440FFFC24040001240500033C100001BE
-:10C1900026106F260C00457C0200302197A600185F
-:10C1A0003C07000194E76F243C04000124846AE00A
-:10C1B000AFA00014960200003C05000D34A501005C
-:10C1C0000C002B3BAFA2001097A200181040004DAE
-:10C1D00024036040960200003042FFF01443000C3C
-:10C1E000240200203C03000194636F241462000BBE
-:10C1F00024027830240200033C010001AC226D943B
-:10C20000240200053C0100011000003FAC226F3405
-:10C210003C03000194636F24240278301462000C04
-:10C22000240300103C02000194426F263042FFF0CC
-:10C2300014430007240200033C010001AC226D946A
-:10C24000240200063C0100011000002FAC226F34D4
-:10C250003C0200018C426D943C03000194636F2406
-:10C26000344200013C010001AC226D94240200150F
-:10C270001462000B000000003C02000194426F2693
-:10C280003042FFF03843F4202C6300013842F43090
-:10C290002C420001006218251460001B24020003D8
-:10C2A0003C03000194636F2424027810146200168A
-:10C2B000240200023C02000194426F263042FFF04B
-:10C2C00014400011240200021000000F2402000498
-:10C2D0003C0200018C426D94344200083C01000194
-:10C2E000AC226D941000005E240200043C020001A8
-:10C2F0008C426D94344200043C010001100000AFF8
-:10C30000AC226D94240200013C010001AC226F407C
-:10C310003C0200018C426D9430420002144000B295
-:10C320003C09FFF024020E00AF8202388F840054D3
-:10C330008F820054240300083C010001AC236D9857
-:10C3400010000002248401F48F8200540082102324
-:10C350002C4201F51440FFFC3C0200C8344201FBB2
-:10C36000AF8202388F8300548F8200541000000285
-:10C37000246301F48F820054006210232C4201F5E3
-:10C380001440FFFC00008021241200012411000948
-:10C390000C004482000000003C010001AC326DB48E
-:10C3A0000C004547000000003C0200018C426DB4C7
-:10C3B0001451FFFB3C0200C8344201F6AF82023840
-:10C3C0008F8300548F820054100000022463000AFF
-:10C3D0008F820054006210232C42000B1440FFFC9B
-:10C3E000000000008F820220240400013442000279
-:10C3F000AF8202208F83020024057FFF2402FFFD0D
-:10C4000000621824AF830200AF8402048F830054BB
-:10C410008F82005410000002246300018F820054B8
-:10C42000006210232C4200021440FFFC00000000B8
-:10C430008F8202241444000534028000000420404E
-:10C4400000A4102B1040FFF0340280001082FFA0E7
-:10C45000261000012E0200141440FFCD2402000417
-:10C460003C010001AC226D980000802124120009DB
-:10C470003C11FFFF36313F7F0C004482000000007A
-:10C48000240200013C010001AC226DB40C004547C0
-:10C49000000000003C0200018C426DB41452FFFB0E
-:10C4A000000000008F82004400511024344250806C
-:10C4B000AF8200448F8300548F820054100000022A
-:10C4C0002463000A8F820054006210232C42000B68
-:10C4D0001440FFFC000000008F8200440051102433
-:10C4E0003442F080AF8200448F8300548F82005426
-:10C4F000100000022463000A8F820054006210239F
-:10C500002C42000B1440FFFC000000008F82022030
-:10C510003C03F70000431025AF8202208F830054B4
-:10C520008F82005410000002246300648F82005444
-:10C53000006210232C4200651440FFFC0000000044
-:10C540008F8202202404000134420002AF820220C4
-:10C550008F83020024057FFF2402FFFD0062182460
-:10C56000AF830200AF8402048F8300548F82005493
-:10C5700010000002246300018F8200540062102327
-:10C580002C4200021440FFFC000000008F820224B5
-:10C5900014440005340280000004204000A4102B45
-:10C5A0001040FFF0340280001082FF50261000017E
-:10C5B0002E0200641440FFB0000000003C020001A5
-:10C5C0008C426D9430420004144000073C09FFF097
-:10C5D0008F8200443C03FFFF34633F7F00431024FD
-:10C5E000AF8200443C09FFF03529BDC03C06000184
-:10C5F0008CC66D943C04000124846AE0240200018E
-:10C600003C010001AC226D9C8F8200543C0700016C
-:10C610008CE76F403C03000194636F243C080001E9
-:10C6200095086F263C05000D34A501003C01000172
-:10C63000AC206D98004910213C010001AC226F3004
-:10C64000AFA300100C002B3BAFA800148FBF002C31
-:10C650008FB200288FB100248FB0002003E00008C3
-:10C6600027BD003027BDFFE83C0500018CA56D9873
-:10C67000240600042402000114A20014AFBF00101D
-:10C680003C0200028C428FFC3042800010400005CA
-:10C690003C04000F3C0300018C636F401000000558
-:10C6A000348442403C0400043C0300018C636F402E
-:10C6B000348493E024020005146200160000000098
-:10C6C0003C04003D10000013348409003C020002C9
-:10C6D0008C428FF830428000104000053C04001E60
-:10C6E0003C0300018C636F4010000005348484809B
-:10C6F0003C04000F3C0300018C636F4034844240D3
-:10C700002402000514620003000000003C04007ACB
-:10C71000348412003C0200018C426F308F8300543D
-:10C7200000441021004310230044102B1440004CFF
-:10C73000000000003C0200018C426DA01440004843
-:10C74000000000003C01000110C00025AC206DB0CD
-:10C750003C0900018D296D94240700013C04400030
-:10C760003C08000225088FFC250AFFFC0005284232
-:10C7700014A0000224C6FFFF2405000800A910240D
-:10C78000104000100000000014A700080000000086
-:10C790008D020000004410241040000A0000000038
-:10C7A0003C01000110000007AC256DB08D42000077
-:10C7B0000044102410400003000000003C01000170
-:10C7C000AC276DB03C0200018C426DB00006182B06
-:10C7D0002C420001004310245440FFE5000528428C
-:10C7E0008F8200543C0300018C636DB03C0100015A
-:10C7F000AC226F301060003B240200053C030001B6
-:10C800008C636F403C010001AC256D9814620012EE
-:10C81000240200013C0200028C428FF83C032000FD
-:10C820003463500000431024144000062402000129
-:10C830003C010001AC206F1C3C010001AC226D9852
-:10C84000240200013C010001AC226E243C010001E5
-:10C85000AC226DA4240200013C010001AC226D9CBD
-:10C860003C0200018C426DB01040001E0000000030
-:10C870003C0200018C426D9C104000082402000123
-:10C880003C010001AC206D9CAEE204B83C0100010B
-:10C89000AC206E1C3C010001AC226DD48EE304B8C8
-:10C8A0002402000810620005240200010C00423935
-:10C8B000000000001000000B000000003C0300011D
-:10C8C0008C636D98106200072402000E3C03000286
-:10C8D0008C638F9010620003000000000C004E9CDF
-:10C8E0008F8402208FBF001003E0000827BD0018CE
-:10C8F00027BDFFE03C03FDFF3C0400018C846D98E4
-:10C900003C0200018C426DC03463FFFF0283A0240F
-:10C9100014820006AFBF00188EE304B83C02000189
-:10C920008C426DC410620006000000008EE204B864
-:10C930003C010001AC246DC03C010001AC226DC47F
-:10C940003C0300018C636D98240200021062019C7C
-:10C950002C62000310400005240200011062000A4E
-:10C960000000000010000226000000002402000465
-:10C97000106200B6240200081062010A24020001BD
-:10C980001000021F000000008EE204B82443FFFFE5
-:10C990002C6200081040021C000310803C010001C2
-:10C9A000002208218C226AF80040000800000000E4
-:10C9B0003C0300018C636F402402000514620010E8
-:10C9C000000000003C0200018C426DA410400008F1
-:10C9D000240200030C004482000000002402000234
-:10C9E000AEE204B83C01000110000002AC206DA4CE
-:10C9F000AEE204B83C01000110000203AC206D302F
-:10CA00000C004482000000003C0200018C426DA436
-:10CA10003C010001AC206D301440017A2402000278
-:10CA20001000019D240200073C0300018C636F404D
-:10CA30002402000514620003240200013C010001ED
-:10CA4000AC226DD00C0045FF000000003C0300014B
-:10CA50008C636DD010000174240200113C050001AC
-:10CA60008CA56D983C0600028CC68FFC0C0051040E
-:10CA700000002021240200053C010001AC206DA42F
-:10CA8000100001E1AEE204B83C04000124846AEC29
-:10CA90003C05000F34A501000000302100003821C2
-:10CAA000AFA000100C002B3BAFA00014100001D66B
-:10CAB000000000008F8202203C0300040043102489
-:10CAC00014400175240200078F8300543C020001CA
-:10CAD0008C426F282463D8F0004310232C42271087
-:10CAE00014400003240200013C010001AC226D9CB3
-:10CAF0003C0200028C428FFC30425000104001C2C8
-:10CB0000000000008F820220304280001040017D32
-:10CB10000000000010000175000000003C0500014D
-:10CB20008CA56D980C00529B000020210C00551B19
-:10CB3000000020213C0300028C638FF4046101B0EB
-:10CB4000240200013C02000800621024104000068C
-:10CB5000000000008F8202143C03FFFF00431024FA
-:10CB6000100000053442251F8F8202143C03FFFF92
-:10CB7000004310243442241FAF8202148F8202200B
-:10CB80003C03020034420002AF820220240200086B
-:10CB9000AEE204B88F8202200283A0253C03000489
-:10CBA0000043102414400016000000003C02000264
-:10CBB0008C428FFC304250001040000D00000000FD
-:10CBC0008F820220304280001040000600000000EA
-:10CBD0008F8202203C03FFFF34637FFF10000003BD
-:10CBE000004310248F82022034428000AF82022052
-:10CBF0008F8202203C03F70000431025AF82022001
-:10CC00003C0300018C636F40240200051462000A9B
-:10CC1000000000003C02000194426F2624429FBCA9
-:10CC20002C420004104000042404001824050002D3
-:10CC30000C004DDB240600200C003E6D00000000BF
-:10CC40003C01000110000170AC206E208EE204B89F
-:10CC50002443FFFF2C6200081040016B000310808A
-:10CC60003C010001002208218C226B1800400008C2
-:10CC7000000000000C004547000000003C030001DC
-:10CC80008C636DB4100000E8240200093C0200022D
-:10CC90008C428FF830424000104000040000000039
-:10CCA0008F820044100000063442F0808F820044DE
-:10CCB0003C03FFFF34633F7F004310243442A080D5
-:10CCC000AF8200448F830054100000EA2402000465
-:10CCD0008F8300543C0200018C426F282463D8F0FB
-:10CCE000004310232C422710144001472402000562
-:10CCF000100000D8000000008F8202203C03F700E3
-:10CD000000431025AF820220AF8002043C010002E4
-:10CD1000100000D6AC208FE08F8300543C0200014D
-:10CD20008C426F282463FFF6004310232C42000A34
-:10CD30001440013524020007100000D70000000055
-:10CD40000C003F50000000001040012D24020001A3
-:10CD50008F8202143C03FFFF3C0400018C846F1C93
-:10CD6000004310243442251FAF820214240200081D
-:10CD700010800005AEE204B83C0200018C426E4413
-:10CD800010400064240200018F8202203C0300084E
-:10CD9000004310241040006A3C020200100000789A
-:10CDA000000000008EE204B82443FFFF2C6200075D
-:10CDB00010400115000310803C01000100220821F1
-:10CDC0008C226B3800400008000000000C003DAFD2
-:10CDD000000000003C010001AC206D9CAF8002040B
-:10CDE0003C0100020C004482AC208FE024020001D0
-:10CDF0003C010001AC226DB42402000210000102CB
-:10CE0000AEE204B80C004547000000003C030001FE
-:10CE10008C636DB410000084240200093C020002FF
-:10CE20008C428FF830424000104000033C0200C8A2
-:10CE300010000002344201F6344201FEAF82023893
-:10CE40008F8300541000008B240200048F83005451
-:10CE50003C0200018C426F282463D8F00043102369
-:10CE60002C422710144000E824020005100000792D
-:10CE7000000000008F8202203C03F70000431025D1
-:10CE8000AF820220AF8002043C0100021000007754
-:10CE9000AC208FE08F8300543C0200018C426F284D
-:10CEA0002463FFF6004310232C42000A144000D6EE
-:10CEB0002402000710000078000000000C003F5022
-:10CEC00000000000104000CE240200018F820214F6
-:10CED0003C03FFFF3C0400018C846F1C00431024C2
-:10CEE0003442251FAF820214240200081080000F74
-:10CEF000AEE204B83C0200018C426E441440000BC8
-:10CF0000000000008F82022034420002AF82022023
-:10CF1000240200013C010002AC228F900C004E9CC8
-:10CF20008F84022010000016000000008F82022073
-:10CF30003C03000800431024144000113C0202008E
-:10CF40000282A0252402000E3C010002AC228F9038
-:10CF50000C00551B000020218F8202203442000269
-:10CF60000C003E6DAF8202203C0500018CA56D983F
-:10CF70000C00529B00002021100000A300000000C4
-:10CF80003C0200018C426E441040009F00000000F3
-:10CF90003C0200018C426E402442FFFF3C01000134
-:10CFA000AC226E4014400098240200023C010001B3
-:10CFB000AC206E443C01000110000093AC226E4096
-:10CFC0008EE204B82443FFFF2C6200071040008E5D
-:10CFD000000310803C010001002208218C226B58C4
-:10CFE00000400008000000003C0200018C426DA4DB
-:10CFF00010400018240200050C00448200000000CC
-:10D0000024020002AEE204B83C0100011000007EE0
-:10D01000AC206DA40C004963000000003C0300013B
-:10D020008C636DD42402000614620077240200038E
-:10D0300010000075AEE204B83C0500018CA56D98A7
-:10D040003C0600028CC68FF80C0051040000202121
-:10D05000240200051000006CAEE204B88F820220AA
-:10D060003C03F70000431025AF8202208F83005459
-:10D0700024020006AEE204B83C0100011000006288
-:10D08000AC236F288F8202203C030004004310244D
-:10D0900010400003240200071000005BAEE204B859
-:10D0A0008F8300543C0200018C426F282463D8F027
-:10D0B000004310232C4227101440000324020001D7
-:10D0C0003C010001AC226D9C3C0200028C428FF8B6
-:10D0D000304250001040004C000000008F820220BF
-:10D0E0003042800010400007000000008F820220C4
-:10D0F0003C03FFFF34637FFF004310241000004215
-:10D10000AF8202208F820220344280001000003E55
-:10D11000AF8202203C0500018CA56D980C00529B4B
-:10D12000000020210C00551B000020213C020002C1
-:10D130008C428FF004410032240200018F820214DD
-:10D140003C03FFFF004310243442251FAF8202142A
-:10D1500024020008AEE204B88F82022034420002AA
-:10D16000AF8202208F8202203C030004004310247F
-:10D1700014400016000000003C0200028C428FF8B0
-:10D18000304250001040000D000000008F8202204D
-:10D190003042800010400006000000008F82022014
-:10D1A0003C03FFFF34637FFF1000000300431024A3
-:10D1B0008F82022034428000AF8202208F820220C0
-:10D1C0003C03F70000431025AF8202203C0200011F
-:10D1D00094426F2624429FBC2C420004104000045D
-:10D1E00024040018240500020C004DDB2406002056
-:10D1F0000C003E6D00000000100000030000000065
-:10D200003C010001AC226D9C8FBF001803E00008B8
-:10D2100027BD00208F8202008F8202208F82022091
-:10D2200034420004AF8202208F8202003C050001DC
-:10D230008CA56D9834420004AF82020024020002E3
-:10D2400010A2004B2CA20003104000052402000194
-:10D2500010A2000A00000000100000B10000000051
-:10D260002402000410A200722402000810A200850B
-:10D270003C02F0FF100000AA000000008F83005065
-:10D280003C02F0FF3442FFFF3C0400018C846F40FD
-:10D29000006218243C0207000062182524020E00D8
-:10D2A0002484FFFB2C840002AF830050AF85020072
-:10D2B000AF85022014800006AF8202388F820044BE
-:10D2C0003C03FFFF34633F7F00431024AF820044E0
-:10D2D0003C0300018C636F402402000514620004CB
-:10D2E000000000008F82004434425000AF820044AE
-:10D2F0003C0200018C426D883C0300018C636F404E
-:10D30000344200222463FFFC2C6300021460000CF2
-:10D31000AF8202003C0200018C426DAC3C03000174
-:10D320008C636D903C0400018C846D8C34428000D1
-:10D3300000621825006418251000000A34620002FB
-:10D340003C0200018C426D903C0300018C636DAC8B
-:10D350003C0400018C846D8C004310250044102592
-:10D3600034420002AF8202201000002F240200018C
-:10D3700024020E01AF8202388F8300503C02F0FF7E
-:10D380003442FFFF3C0400018C846F1C00621824AF
-:10D390003C020D000062182524020001AF830050FA
-:10D3A000AF820200AF820220108000053C033F00E4
-:10D3B0003C0200018C426D80100000043463007058
-:10D3C0003C0200018C426D803463007200431025E2
-:10D3D000AF8202003C0300018C636D843C02F700C5
-:10D3E000006218253C0200018C426D903C04000153
-:10D3F0008C846DAC3C0500018CA56F40004310256A
-:10D4000000441025AF8202202402000514A2000669
-:10D41000240200018F8200442403AFFF0043102444
-:10D42000AF820044240200011000003DAF820238A8
-:10D430008F8300503C02F0FF3442FFFF3C040001A8
-:10D440008C846F1C006218243C020A0000621825BC
-:10D4500024020001AF830050AF8202001080001E42
-:10D46000AF8202203C0200018C426E441440001A3C
-:10D470003C033F003C0200018C426D801000001A0A
-:10D48000346300E08F8300503C0400018C846F1CE7
-:10D490003442FFFF006218241080000FAF83005059
-:10D4A0003C0200018C426E441440000B3C043F00DF
-:10D4B0003C0300018C636D80348400E02402000191
-:10D4C000AF820200AF82022000641825AF83020001
-:10D4D000100000083C05F7003C0200018C426D8002
-:10D4E0003C033F00346300E200431025AF8202009A
-:10D4F0003C05F70034A580003C0300018C636D847B
-:10D500003C0200018C426D903C0400018C846DACA7
-:10D51000006518250043102500441025AF82022025
-:10D5200003E00008000000003C0300018C636DB4C0
-:10D530003C0200018C426DB810620003240200021C
-:10D540003C010001AC236DB81062001D2C62000389
-:10D55000104000252402000114620023240200046C
-:10D560003C0300018C636D981062000624020008E1
-:10D570001462000C3C0200C8344201FB1000000998
-:10D58000AF82023824020E01AF8202388F8200443B
-:10D590003C03FFFF34633F7F00431024344200808C
-:10D5A000AF8200448F830054240200023C0100013A
-:10D5B000AC226DB43C0100011000000BAC236F2CB9
-:10D5C0008F8300543C0200018C426F2C2463D8F0FE
-:10D5D000004310232C4227101440000324020009AA
-:10D5E0003C010001AC226DB403E000080000000023
-:10D5F00000000000000000000000000027BDFFD870
-:10D60000AFB2001800809021AFB3001C00A0982199
-:10D61000AFB1001400C08821AFB00010000080211D
-:10D62000AFBF0020A62000000C004D7824040001AC
-:10D63000261000012E0200201440FFFB0000000015
-:10D640000C004D78000020210C004D7824040001CE
-:10D650000C004D78240400010C004D7800002021BE
-:10D66000241000100250102410400002000020215D
-:10D67000240400010C004D78001080421600FFFACF
-:10D6800002501024241000100270102410400002D8
-:10D6900000002021240400010C004D78001080427D
-:10D6A0001600FFFA027010240C004DB934108000EF
-:10D6B0000C004DB9000000000C004D5800000000A7
-:10D6C00050400005001080429622000000501025B6
-:10D6D000A6220000001080421600FFF700000000A4
-:10D6E0000C004DB9000000008FBF00208FB3001C5C
-:10D6F0008FB200188FB100148FB0001003E0000843
-:10D7000027BD002827BDFFD8AFB1001400808821B5
-:10D71000AFB2001800A09021AFB3001C00C0982148
-:10D72000AFB0001000008021AFBF00200C004D788A
-:10D7300024040001261000012E0200201440FFFBEB
-:10D74000000000000C004D78000020210C004D78F6
-:10D75000240400010C004D78000020210C004D78BD
-:10D760002404000124100010023010241040000294
-:10D7700000002021240400010C004D78001080429C
-:10D780001600FFFA0230102424100010025010245A
-:10D790001040000200002021240400010C004D78FC
-:10D7A000001080421600FFFA025010240C004D7841
-:10D7B000240400010C004D7800002021341080006A
-:10D7C000966200000050102410400002000020214A
-:10D7D000240400010C004D78001080421600FFF870
-:10D7E000000000000C004DB9000000008FBF0020B9
-:10D7F0008FB3001C8FB200188FB100148FB00010CF
-:10D8000003E0000827BD00283C0400018C846DD093
-:10D810003C0200018C426E1827BDFFD8AFBF00202C
-:10D82000AFB1001C10820003AFB000183C01000132
-:10D83000AC246E183C0300018C636F402402000589
-:10D84000146200052483FFFF0C0049630000000000
-:10D850001000034C000000002C620013104003492C
-:10D86000000310803C010001002208218C226B8003
-:10D8700000400008000000000C004DB900008021AD
-:10D8800034028000A7A2001027B100100C004D78D0
-:10D8900024040001261000012E0200201440FFFB8A
-:10D8A000000000000C004D78000020210C004D7895
-:10D8B000240400010C004D78000020210C004D785C
-:10D8C0002404000124100010320200011040000264
-:10D8D00000002021240400010C004D78001080423B
-:10D8E0001600FFFA32020001241000100C004D78DF
-:10D8F00000002021001080421600FFFC0000000004
-:10D900000C004D78240400010C004D78000020210B
-:10D9100034108000962200000050102410400002B5
-:10D9200000002021240400010C004D7800108042EA
-:10D930001600FFF8000000000C004DB900000000C8
-:10D940001000030E2402000227B10010A7A000104F
-:10D95000000080210C004D782404000126100001F5
-:10D960002E0200201440FFFB000000000C004D7848
-:10D97000000020210C004D78240400010C004D789B
-:10D98000240400010C004D78000020212410001018
-:10D990003202000110400002000020212404000196
-:10D9A0000C004D78001080421600FFFA3202000190
-:10D9B000241000100C004D7800002021001080423F
-:10D9C0001600FFFC000000000C004DB93410800070
-:10D9D0000C004DB9000000000C004D580000000084
-:10D9E0005040000500108042962200000050102593
-:10D9F000A6220000001080421600FFF70000000081
-:10DA00000C004DB90000000097A2001030428000C9
-:10DA1000144002DC24020003100002D800000000C1
-:10DA200024021200A7A2001027B1001000008021DC
-:10DA30000C004D7824040001261000012E02002065
-:10DA40001440FFFB000000000C004D780000202176
-:10DA50000C004D78240400010C004D7800002021BA
-:10DA60000C004D7824040001241000103202000143
-:10DA70001040000200002021240400010C004D7819
-:10DA8000001080421600FFFA32020001241000103C
-:10DA90000C004D7800002021001080421600FFFC91
-:10DAA000000000000C004D78240400010C004D78AB
-:10DAB0000000202134108000962200000050102425
-:10DAC0001040000200002021240400010C004D78C9
-:10DAD000001080421600FFF8000000000C004DB955
-:10DAE000000000008F8300541000029624020004FE
-:10DAF0008F8300543C0200018C426F3C2463FF9CE6
-:10DB0000004310232C4200641440029E24020002B1
-:10DB10003C0300018C636F40106202972C6200038B
-:10DB20001440029624020011240200031062000532
-:10DB300024020004106202912402000F1000028FE0
-:10DB4000240200111000028D24020005240200149A
-:10DB5000A7A2001027B10010000080210C004D7812
-:10DB600024040001261000012E0200201440FFFBB7
-:10DB7000000000000C004D78000020210C004D78C2
-:10DB8000240400010C004D78000020210C004D7889
-:10DB90002404000124100010320200011040000291
-:10DBA00000002021240400010C004D780010804268
-:10DBB0001600FFFA32020001241000103202001297
-:10DBC0001040000200002021240400010C004D78C8
-:10DBD000001080421600FFFA320200120C004D784D
-:10DBE000240400010C004D78000020213410800036
-:10DBF0009622000000501024104000020000202156
-:10DC0000240400010C004D78001080421600FFF83B
-:10DC1000000000000C004DB9000000008F8300548C
-:10DC200010000248240200068F8300543C020001C9
-:10DC30008C426F3C2463FF9C004310232C42006401
-:10DC400014400250240200071000024C00000000A3
-:10DC500024020006A7A2001027B1001000008021B6
-:10DC60000C004D7824040001261000012E02002033
-:10DC70001440FFFB000000000C004D780000202144
-:10DC80000C004D78240400010C004D780000202188
-:10DC90000C004D7824040001241000103202000111
-:10DCA0001040000200002021240400010C004D78E7
-:10DCB000001080421600FFFA32020001241000100A
-:10DCC0003202001310400002000020212404000151
-:10DCD0000C004D78001080421600FFFA320200134B
-:10DCE0000C004D78240400010C004D780000202128
-:10DCF00034108000962200000050102410400002D2
-:10DD000000002021240400010C004D780010804206
-:10DD10001600FFF8000000000C004DB900000000E4
-:10DD20008F83005410000207240200088F830054E0
-:10DD30003C0200018C426F3C2463FF9C0043102393
-:10DD40002C4200641440020F240200091000020B50
-:10DD50000000000027B10010A7A0001000008021E3
-:10DD60000C004D7824040001261000012E02002032
-:10DD70001440FFFB000000000C004D780000202143
-:10DD80000C004D78240400010C004D78240400019F
-:10DD90000C004D78000020212410001032020001F8
-:10DDA0001040000200002021240400010C004D78E6
-:10DDB000001080421600FFFA320200012410001009
-:10DDC000320200181040000200002021240400014B
-:10DDD0000C004D78001080421600FFFA3202001845
-:10DDE0000C004DB9341080000C004DB9000000004B
-:10DDF0000C004D580000000050400005001080420B
-:10DE00009622000000501025A6220000001080423B
-:10DE10001600FFF7000000000C004DB90000802143
-:10DE200097A2001027B1001034420001A7A20010F1
-:10DE30000C004D7824040001261000012E02002061
-:10DE40001440FFFB000000000C004D780000202172
-:10DE50000C004D78240400010C004D7800002021B6
-:10DE60000C004D782404000124100010320200013F
-:10DE70001040000200002021240400010C004D7815
-:10DE8000001080421600FFFA320200012410001038
-:10DE9000320200181040000200002021240400017A
-:10DEA0000C004D78001080421600FFFA3202001874
-:10DEB0000C004D78240400010C004D780000202156
-:10DEC0003410800096220000005010241040000200
-:10DED00000002021240400010C004D780010804235
-:10DEE0001600FFF8000000000C004DB90000000013
-:10DEF0008F830054100001932402000A8F83005482
-:10DF00003C0200018C426F3C2463FF9C00431023C1
-:10DF10002C4200641440019B2402000B1000019766
-:10DF20000000000027B10010A7A000100000802111
-:10DF30000C004D7824040001261000012E02002060
-:10DF40001440FFFB000000000C004D780000202171
-:10DF50000C004D78240400010C004D7824040001CD
-:10DF60000C004D7800002021241000103202000126
-:10DF70001040000200002021240400010C004D7814
-:10DF8000001080421600FFFA320200012410001037
-:10DF9000320200171040000200002021240400017A
-:10DFA0000C004D78001080421600FFFA3202001774
-:10DFB0000C004DB9341080000C004DB90000000079
-:10DFC0000C004D5800000000504000050010804239
-:10DFD0009622000000501025A6220000001080426A
-:10DFE0001600FFF7000000000C004DB90000802172
-:10DFF00097A2001027B1001034420700A7A200101A
-:10E000000C004D7824040001261000012E0200208F
-:10E010001440FFFB000000000C004D7800002021A0
-:10E020000C004D78240400010C004D7800002021E4
-:10E030000C004D782404000124100010320200016D
-:10E040001040000200002021240400010C004D7843
-:10E05000001080421600FFFA320200012410001066
-:10E0600032020017104000020000202124040001A9
-:10E070000C004D78001080421600FFFA32020017A3
-:10E080000C004D78240400010C004D780000202184
-:10E09000341080009622000000501024104000022E
-:10E0A00000002021240400010C004D780010804263
-:10E0B0001600FFF8000000000C004DB90000000041
-:10E0C0008F8300541000011F2402000C8F83005422
-:10E0D0003C0200018C426F3C2463FF9C00431023F0
-:10E0E0002C42006414400127240200121000012376
-:10E0F0000000000027B10010A7A000100000802140
-:10E100000C004D7824040001261000012E0200208E
-:10E110001440FFFB000000000C004D78000020219F
-:10E120000C004D78240400010C004D7824040001FB
-:10E130000C004D7800002021241000103202000154
-:10E140001040000200002021240400010C004D7842
-:10E15000001080421600FFFA320200012410001065
-:10E1600032020014104000020000202124040001AB
-:10E170000C004D78001080421600FFFA32020014A5
-:10E180000C004DB9341080000C004DB900000000A7
-:10E190000C004D5800000000504000050010804267
-:10E1A0009622000000501025A62200000010804298
-:10E1B0001600FFF7000000000C004DB900008021A0
-:10E1C00097A2001027B1001034420010A7A200103F
-:10E1D0000C004D7824040001261000012E020020BE
-:10E1E0001440FFFB000000000C004D7800002021CF
-:10E1F0000C004D78240400010C004D780000202113
-:10E200000C004D782404000124100010320200019B
-:10E210001040000200002021240400010C004D7871
-:10E22000001080421600FFFA320200012410001094
-:10E2300032020014104000020000202124040001DA
-:10E240000C004D78001080421600FFFA32020014D4
-:10E250000C004D78240400010C004D7800002021B2
-:10E26000341080009622000000501024104000025C
-:10E2700000002021240400010C004D780010804291
-:10E280001600FFF8000000000C004DB9000000006F
-:10E290008F830054100000AB240200138F830054BE
-:10E2A0003C0200018C426F3C2463FF9C004310231E
-:10E2B0002C420064144000B32402000D100000AF93
-:10E2C0000000000027B10010A7A00010000080216E
-:10E2D0000C004D7824040001261000012E020020BD
-:10E2E0001440FFFB000000000C004D7800002021CE
-:10E2F0000C004D78240400010C004D78240400012A
-:10E300000C004D7800002021241000103202000182
-:10E310001040000200002021240400010C004D7870
-:10E32000001080421600FFFA320200012410001093
-:10E3300032020018104000020000202124040001D5
-:10E340000C004D78001080421600FFFA32020018CF
-:10E350000C004DB9341080000C004DB900000000D5
-:10E360000C004D5800000000504000050010804295
-:10E370009622000000501025A622000000108042C6
-:10E380001600FFF7000000000C004DB900008021CE
-:10E3900097A2001027B100103042FFFEA7A2001084
-:10E3A0000C004D7824040001261000012E020020EC
-:10E3B0001440FFFB000000000C004D7800002021FD
-:10E3C0000C004D78240400010C004D780000202141
-:10E3D0000C004D78240400012410001032020001CA
-:10E3E0001040000200002021240400010C004D78A0
-:10E3F000001080421600FFFA3202000124100010C3
-:10E400003202001810400002000020212404000104
-:10E410000C004D78001080421600FFFA32020018FE
-:10E420000C004D78240400010C004D7800002021E0
-:10E43000341080009622000000501024104000028A
-:10E4400000002021240400010C004D7800108042BF
-:10E450001600FFF8000000000C004DB9000000009D
-:10E460008F830054100000372402000E240208405D
-:10E47000A7A2001027B10010000080210C004D78E9
-:10E4800024040001261000012E0200201440FFFB8E
-:10E49000000000000C004D78000020210C004D7899
-:10E4A000240400010C004D78000020210C004D7860
-:10E4B0002404000124100010320200011040000268
-:10E4C00000002021240400010C004D78001080423F
-:10E4D0001600FFFA3202000124100010320200136D
-:10E4E0001040000200002021240400010C004D789F
-:10E4F000001080421600FFFA320200130C004D7823
-:10E50000240400010C004D7800002021341080000C
-:10E51000962200000050102410400002000020212C
-:10E52000240400010C004D78001080421600FFF812
-:10E53000000000000C004DB9000000008F83005463
-:10E54000240200103C010001AC226DD03C0100010E
-:10E550001000000CAC236F3C8F8300543C02000180
-:10E560008C426F3C2463FF9C004310232C420064C8
-:10E570001440000400000000240200113C010001CE
-:10E58000AC226DD08FBF00208FB1001C8FB000185F
-:10E5900003E0000827BD00283C0300018C636D9850
-:10E5A00027BDFFC824020002AFBF0034AFB2003065
-:10E5B000AFB1002C14620004AFB000283C1200027E
-:10E5C000100000038E528FF83C1200028E528FFC16
-:10E5D0003C0300018C636DD43C0200018C426E1C34
-:10E5E000506200042463FFFF3C010001AC236E1C59
-:10E5F0002463FFFF2C6200061040037700031080A5
-:10E600003C010001002208218C226BD80040000848
-:10E610000000000000002021000028210C004DDB3C
-:10E6200034068000240400102405000224060002A1
-:10E63000240200020C004DDBA7A2001824020002F5
-:10E640003C01000110000364AC226DD427B1001816
-:10E65000A7A00018000080210C004D7824040001C0
-:10E66000261000012E0200201440FFFB00000000D5
-:10E670000C004D78000020210C004D78240400018E
-:10E680000C004D78240400010C004D78000020217E
-:10E69000241000103202000110400002000020216E
-:10E6A000240400010C004D78001080421600FFFA8F
-:10E6B00032020001241000100C004D7800002021CF
-:10E6C000001080421600FFFC000000000C004DB955
-:10E6D000341080000C004DB9000000000C004D58B3
-:10E6E000000000005040000500108042962200000B
-:10E6F00000501025A6220000001080421600FFF7EF
-:10E70000000000000C004DB90000000097A20018A6
-:10E710003042800014400004240200033C01000148
-:10E72000AC226DD4240200033C0100011000032A36
-:10E73000AC226DD42404001024050002240600023B
-:10E74000240200020C004DDBA7A200183C030001CC
-:10E750008C636E2024020001146201E1000080211C
-:10E7600027B10018A7A000180C004D782404000160
-:10E77000261000012E0200201440FFFB00000000C4
-:10E780000C004D78000020210C004D78240400017D
-:10E790000C004D78240400010C004D78000020216D
-:10E7A000241000103202000110400002000020215D
-:10E7B000240400010C004D78001080421600FFFA7E
-:10E7C0003202000124100010320200181040000232
-:10E7D00000002021240400010C004D78001080422C
-:10E7E0001600FFFA320200180C004DB934108000F8
-:10E7F0000C004DB9000000000C004D580000000056
-:10E800005040000500108042962200000050102564
-:10E81000A6220000001080421600FFF70000000052
-:10E820000C004DB90000802127B10018A7A00018E6
-:10E830000C004D7824040001261000012E02002057
-:10E840001440FFFB000000000C004D780000202168
-:10E850000C004D78240400010C004D7824040001C4
-:10E860000C004D780000202124100010320200011D
-:10E870001040000200002021240400010C004D780B
-:10E88000001080421600FFFA32020001241000102E
-:10E890003202001810400002000020212404000170
-:10E8A0000C004D78001080421600FFFA320200186A
-:10E8B0000C004DB9341080000C004DB90000000070
-:10E8C0000C004D5800000000504000050010804230
-:10E8D0009622000000501025A62200000010804261
-:10E8E0001600FFF7000000000C004DB90000802169
-:10E8F00024040018000028210C004DDB2406040429
-:10E90000A7A0001A0C004D78240400012610000175
-:10E910002E0200201440FFFB000000000C004D7888
-:10E92000000020210C004D78240400010C004D78DB
-:10E93000240400010C004D78000020212410001058
-:10E9400032020001104000020000202124040001D6
-:10E950000C004D78001080421600FFFA32020001D0
-:10E960002410001032020018104000020000202184
-:10E97000240400010C004D78001080421600FFFABC
-:10E98000320200180C004DB9341080000C004DB953
-:10E99000000000000C004D58000000005040000531
-:10E9A0000010804297A2001A00501025A7A2001A5A
-:10E9B000001080421600FFF7000000000C004DB967
-:10E9C00000008021A7A0001A0C004D78240400014B
-:10E9D000261000012E0200201440FFFB0000000062
-:10E9E0000C004D78000020210C004D78240400011B
-:10E9F0000C004D78240400010C004D78000020210B
-:10EA000024100010320200011040000200002021FA
-:10EA1000240400010C004D78001080421600FFFA1B
-:10EA200032020001241000103202001810400002CF
-:10EA300000002021240400010C004D7800108042C9
-:10EA40001600FFFA320200180C004DB93410800095
-:10EA50000C004DB9000000000C004D5800000000F3
-:10EA6000504000050010804297A2001A0050102567
-:10EA7000A7A2001A001080421600FFF70000000055
-:10EA80000C004DB900008021A7A0001C0C004D789F
-:10EA900024040001261000012E0200201440FFFB78
-:10EAA000000000000C004D78000020210C004D7883
-:10EAB000240400010C004D78240400010C004D7862
-:10EAC00000002021241000100C004D7800002021AF
-:10EAD000001080421600FFFC00000000241000100F
-:10EAE0003202001E10400002000020212404000118
-:10EAF0000C004D78001080421600FFFA3202001E12
-:10EB00000C004DB9341080000C004DB9000000001D
-:10EB10000C004D58000000005040000500108042DD
-:10EB200097A2001C00501025A7A2001C00108042D4
-:10EB30001600FFF7000000000C004DB90000802116
-:10EB4000A7A0001C0C004D78240400012610000131
-:10EB50002E0200201440FFFB000000000C004D7846
-:10EB6000000020210C004D78240400010C004D7899
-:10EB7000240400010C004D78000020212410001016
-:10EB80000C004D7800002021001080421600FFFC90
-:10EB900000000000241000103202001E104000028D
-:10EBA00000002021240400010C004D780010804258
-:10EBB0001600FFFA3202001E0C004DB9341080001E
-:10EBC0000C004DB9000000000C004D580000000082
-:10EBD000504000050010804297A2001C00501025F4
-:10EBE000A7A2001C001080421600FFF700000000E2
-:10EBF0000C004DB90000802124020002A7A2001ED3
-:10EC00000C004D7824040001261000012E02002083
-:10EC10001440FFFB000000000C004D780000202194
-:10EC20000C004D78240400010C004D7800002021D8
-:10EC30000C004D7824040001241000100C004D78C5
-:10EC400000002021001080421600FFFC00000000A0
-:10EC5000241000103202001E10400002000020218B
-:10EC6000240400010C004D78001080421600FFFAC9
-:10EC70003202001E0C004D78240400010C004D7877
-:10EC8000000020213410800097A2001E00501024A4
-:10EC90001040000200002021240400010C004D78E7
-:10ECA000001080421600FFF8000000000C004DB973
-:10ECB00000008021A7A000200C004D782404000152
-:10ECC000261000012E0200201440FFFB000000006F
-:10ECD0000C004D78000020210C004D782404000128
-:10ECE0000C004D78240400010C004D780000202118
-:10ECF000241000100C004D780000202100108042EC
-:10ED00001600FFFC00000000241000103202001E5C
-:10ED10001040000200002021240400010C004D7866
-:10ED2000001080421600FFFA3202001E0C004DB99E
-:10ED3000341080000C004DB9000000000C004D584C
-:10ED400000000000504000050010804297A2002003
-:10ED500000501025A7A20020001080421600FFF7E7
-:10ED6000000000000C004DB900008021A7A0002089
-:10ED70000C004D7824040001261000012E02002012
-:10ED80001440FFFB000000000C004D780000202123
-:10ED90000C004D78240400010C004D78240400017F
-:10EDA0000C004D7800002021241000100C004D783C
-:10EDB00000002021001080421600FFFC000000002F
-:10EDC000241000103202001E10400002000020211A
-:10EDD000240400010C004D78001080421600FFFA58
-:10EDE0003202001E0C004DB9341080000C004DB9E9
-:10EDF000000000000C004D580000000050400005CD
-:10EE00000010804297A2002000501025A7A20020E9
-:10EE1000001080421600FFF7000000000C004DB902
-:10EE200000008021A7A000220C004D7824040001DE
-:10EE3000261000012E0200201440FFFB00000000FD
-:10EE40000C004D78000020210C004D7824040001B6
-:10EE50000C004D78000020210C004D7824040001A6
-:10EE6000241000100C004D7800002021001080427A
-:10EE70001600FFFC00000000241000100C004D786C
-:10EE800000002021001080421600FFFC000000005E
-:10EE90000C004D78240400010C004D780000202166
-:10EEA0003410800097A2002200501024104000026D
-:10EEB00000002021240400010C004D780010804245
-:10EEC0001600FFF8000000000C004DB90000000023
-:10EED00024040018240500020C004DDB2406000465
-:10EEE0003C1000018E106E24240200011602011D48
-:10EEF000000000003C02000194426F263C0100012A
-:10EF0000AC206E2424429FBC2C4200041040000C14
-:10EF100024040009240500010C004DDB2406040034
-:10EF200024040018240500010C004DDB24060020F9
-:10EF300024040018240500010C004DDB24062000E9
-:10EF40003C02400002421024104001233C022000F9
-:10EF50000242102410400004000000003C010001A7
-:10EF600010000003AC306F1C3C010001AC206F1C92
-:10EF70003C0300018C636F3424020005146200F925
-:10EF8000000000003C0200018C426F1C1040006732
-:10EF90003C0200040242102410400011A7A00018F7
-:10EFA0003C02000802421024104000022402020029
-:10EFB000A7A200183C0200100242102410400004D6
-:10EFC0000000000097A2001834420100A7A2001818
-:10EFD00097A600182404000910000004000028214E
-:10EFE0002404000900002821000030210C004DDB22
-:10EFF0000000000024020001A7A2001A3C02000841
-:10F00000024210241040000C3C0200020242102474
-:10F010001040000224020101A7A2001A3C020001D4
-:10F0200002421024104000053C02001097A2001A72
-:10F0300034420040A7A2001A3C02001002421024F1
-:10F040001040000E3C020002024210241040000555
-:10F050003C02000197A2001A34420080A7A2001AC5
-:10F060003C02000102421024104000053C0300A0B5
-:10F0700097A2001A34420020A7A2001A3C0300A065
-:10F0800002431024544300043C02002097A2001ABB
-:10F090001000000C344204000242102450400004CE
-:10F0A0003C02008097A2001A1000000634420800BB
-:10F0B00002421024104000040000000097A2001A31
-:10F0C00034420C00A7A2001A97A6001A24040004D8
-:10F0D0000C004DDB000028213C02000402421024F9
-:10F0E00010400004A7A0001C32425000144000044D
-:10F0F00000000000324240001040000500002021C6
-:10F100000C004CF902402021100000960000000085
-:10F1100097A6001C0000282134C612000C004DDB0D
-:10F12000A7A6001C1000008F00000000024210245F
-:10F1300010400004A7A00018324250001440000400
-:10F140000000000032424000104000053C02001068
-:10F150000C004CF90240202110000019A7A0001A51
-:10F1600002421024104000040000000097A2001882
-:10F1700010000004A7A2001897A200183442010052
-:10F18000A7A200183C020001024210241040000413
-:10F190000000000097A2001810000004A7A20018A9
-:10F1A00097A2001834422000A7A2001897A60018C2
-:10F1B000000020210C004DDB00002821A7A0001A30
-:10F1C000000080210C004D7824040001261000016D
-:10F1D0002E0200201440FFFB000000000C004D78C0
-:10F1E000000020210C004D78240400010C004D7813
-:10F1F000240400010C004D78000020212410001090
-:10F20000320200011040000200002021240400010D
-:10F210000C004D78001080421600FFFA3202000107
-:10F22000241000100C004D780000202100108042B6
-:10F230001600FFFC000000000C004DB934108000E7
-:10F240000C004DB9000000000C004D5800000000FB
-:10F25000504000050010804297A2001A005010256F
-:10F26000A7A2001A001080421600FFF7000000005D
-:10F270000C004DB900008021A7A0001A0C004D78A9
-:10F2800024040001261000012E0200201440FFFB80
-:10F29000000000000C004D78000020210C004D788B
-:10F2A000240400010C004D78240400010C004D786A
-:10F2B0000000202124100010320200011040000242
-:10F2C00000002021240400010C004D780010804231
-:10F2D0001600FFFA32020001241000100C004D78D5
-:10F2E00000002021001080421600FFFC00000000FA
-:10F2F0000C004DB9341080000C004DB90000000026
-:10F300000C004D58000000005040000500108042E5
-:10F3100097A2001A00501025A7A2001A00108042E0
-:10F320001600FFF7000000000C004DB900000000BF
-:10F330003C04000124846BCC97A6001897A7001A00
-:10F340003C0200018C426D983C0300018C636F1CF1
-:10F350003C05000D34A50205AFA200100C002B3BAC
-:10F36000AFA300148F830054240200043C01000169
-:10F37000AC226DD43C01000110000017AC236F38A3
-:10F380008F8300543C0200018C426F382463FF9C41
-:10F39000004310232C4200641440000F00000000C2
-:10F3A0008F820220240300053C010001AC236DD4B0
-:10F3B0003C03F7000043102510000007AF82022035
-:10F3C000240200063C010001AC226DD4240200118D
-:10F3D0003C010001AC226DD08FBF00348FB20030F1
-:10F3E0008FB1002C8FB0002803E0000827BD003843
-:10F3F00027BDFFD8AFB0001800808021AFB1001C3E
-:10F40000000088213202400010400013AFBF0020EE
-:10F410003C020010020210242C42000100021023C2
-:10F42000304341003C020001020210241440000657
-:10F43000347140003C020002020210241440000219
-:10F440003471600034714040000020210000282108
-:10F45000100000360220302132021000104000352A
-:10F4600000002021000028210C004DDB2406004074
-:10F4700024040018000028210C004DDB24060C0099
-:10F4800024040017000028210C004DDB2406040092
-:10F4900024040016000028210C004DDB2406000681
-:10F4A00024040017000028210C004DDB2406250051
-:10F4B00024040016000028210C004DDB2406000661
-:10F4C00024040017000028210C004DDB2406460010
-:10F4D00024040016000028210C004DDB2406000641
-:10F4E00024040017000028210C004DDB24066700CF
-:10F4F00024040016000028210C004DDB2406000621
-:10F500002404001F000028210C004DDB24060010FD
-:10F5100024040009000028210C004DDB24061500FE
-:10F52000240400090000282124061D000C004DDBE6
-:10F53000000000003C04000124846BF03C05000E38
-:10F5400034A501000200302102203821AFA00010B4
-:10F550000C002B3BAFA000148FBF00208FB1001C0C
-:10F560008FB0001803E0000827BD00288F850044F5
-:10F570008F8200443C030001004310253C03000837
-:10F58000AF8200448F8400548F82005400A328244B
-:10F5900010000002248400018F8200540082102396
-:10F5A0002C4200021440FFFC000000008F82004447
-:10F5B0003C03FFFE3463FFFF00431024AF8200448E
-:10F5C0008F8300548F8200541000000224630001D6
-:10F5D0008F820054006210232C4200021440FFFC72
-:10F5E0000000000003E0000800A010218F83004409
-:10F5F0003C02FFF03442FFFF000424800062182424
-:10F600003C0200020082202500641825AF830044DC
-:10F610008F8200443C03FFFE3463FFFF004310244D
-:10F62000AF8200448F8300548F8200541000000288
-:10F63000246300018F820054006210232C420002D8
-:10F640001440FFFC000000008F8200443C030001D6
-:10F6500000431025AF8200448F8300548F820054F2
-:10F6600010000002246300018F8200540062102306
-:10F670002C4200021440FFFC0000000003E00008E0
-:10F68000000000008F8200442403FF7F0043102409
-:10F69000AF8200448F8300548F8200541000000218
-:10F6A000246300018F820054006210232C42000268
-:10F6B0001440FFFC000000008F82004434420080B0
-:10F6C000AF8200448F8300548F82005410000002E8
-:10F6D000246300018F820054006210232C42000238
-:10F6E0001440FFFC0000000003E0000800000000E0
-:10F6F0008F8200443C03FFF03463FFFF004310247B
-:10F70000AF8200448F8200443C0300010043102577
-:10F71000AF8200448F8300548F8200541000000297
-:10F72000246300018F820054006210232C420002E7
-:10F730001440FFFC000000008F8200443C03FFFEE9
-:10F740003463FFFF00431024AF8200448F830054D2
-:10F750008F82005410000002246300018F82005445
-:10F76000006210232C4200021440FFFC0000000045
-:10F7700003E000080000000027BDFFC8AFB300246D
-:10F7800000809821AFBE002C00A0F021AFB2002075
-:10F7900000C0902133C2FFFFAFBF0030AFB50028DB
-:10F7A000AFB1001CAFB0001814400034A7B2001075
-:10F7B0003271FFFF27B20010000080210C004D784D
-:10F7C00024040001261000012E0200201440FFFB3B
-:10F7D000000000000C004D78000020210C004D7846
-:10F7E000240400010C004D78000020210C004D780D
-:10F7F0002404000124100010320200011040000215
-:10F8000000002021240400010C004D7800108042EB
-:10F810001600FFFA320200012410001002301024FA
-:10F820001040000200002021240400010C004D784B
-:10F83000001080421600FFFA023010240C004D78B0
-:10F84000240400010C004D780000202134108000B9
-:10F8500096420000005010241040000200002021B9
-:10F86000240400010C004D78001080421200007545
-:10F87000000000001000FFF6000000003275FFFFDE
-:10F8800027B10010A7A00010000080210C004D78C7
-:10F8900024040001261000012E0200201440FFFB6A
-:10F8A000000000000C004D78000020210C004D7875
-:10F8B000240400010C004D78240400010C004D7854
-:10F8C000000020212410001032020001104000022C
-:10F8D00000002021240400010C004D78001080421B
-:10F8E0001600FFFA320200012410001002B01024AA
-:10F8F0001040000200002021240400010C004D787B
-:10F90000001080421600FFFA02B010240C004DB91E
-:10F91000341080000C004DB9000000000C004D5860
-:10F9200000000000504000050010804296220000B8
-:10F9300000501025A6220000001080421600FFF79C
-:10F94000000000000C004DB90000000033C5FFFFAF
-:10F950002402000154A200042402000297A2001015
-:10F96000100000060052102514A200063271FFFF9D
-:10F9700097A200100012182700431024A7A200101D
-:10F980003271FFFF27B20010000080210C004D787B
-:10F9900024040001261000012E0200201440FFFB69
-:10F9A000000000000C004D78000020210C004D7874
-:10F9B000240400010C004D78000020210C004D783B
-:10F9C0002404000124100010320200011040000243
-:10F9D00000002021240400010C004D78001080421A
-:10F9E0001600FFFA32020001241000100230102429
-:10F9F0001040000200002021240400010C004D787A
-:10FA0000001080421600FFFA023010240C004D78DE
-:10FA1000240400010C004D780000202134108000E7
-:10FA200096420000005010241040000200002021E7
-:10FA3000240400010C004D78001080421600FFF8ED
-:10FA4000000000000C004DB9000000008FBF003026
-:10FA50008FBE002C8FB500288FB300248FB20020FA
-:10FA60008FB1001C8FB0001803E0000827BD0038DC
-:10FA700000000000000000000000000027BDFFE8BB
-:10FA8000AFBF00108EE304B824020008146201E046
-:10FA9000000000003C0200018C426F1C1440000575
-:10FAA000000000000C003DAF8F840224100001D83C
-:10FAB000000000008F8202203C0300080043102455
-:10FAC00010400026240200018F8402248F8202202D
-:10FAD0003C03040000431024104000060000000016
-:10FAE0003C010002AC208FA03C0100021000000B82
-:10FAF000AC208FC03C03000224638FA08C62000006
-:10FB000024420001AC6200002C42000214400003B9
-:10FB1000240200013C010002AC228FC03C02000222
-:10FB20008C428FC01040000630820040104000041C
-:10FB3000240200013C01000210000003AC228FC42B
-:10FB40003C010002AC208FC43C010002AC248F9C1D
-:10FB50003C0100021000000BAC208FD03C010002E1
-:10FB6000AC228FD03C010002AC208FC03C010002CF
-:10FB7000AC208FA03C010002AC208FC43C010002ED
-:10FB8000AC208F9C3C0300028C638F903C020002EF
-:10FB90008C428F94506200042463FFFF3C010002FA
-:10FBA000AC238F942463FFFF2C62000E104001945D
-:10FBB000000310803C010001002208218C226C000F
-:10FBC0000040000800000000240200023C01000286
-:10FBD000AC208FC03C010002AC208FA03C01000291
-:10FBE000AC208F9C3C010002AC208FC43C01000281
-:10FBF000AC208FB83C010002AC208FB0AF80022453
-:10FC00003C010002AC228F903C0200028C428FD05B
-:10FC10001440004F3C02FDFF3442FFFF0C003DAF9B
-:10FC20000282A024AF8002048F8202002403FFFD21
-:10FC300000431024AF8202003C010002AC208FE0A0
-:10FC40008F8300543C0200028C428FB824040001D0
-:10FC50003C010002AC248FCC244200013C01000294
-:10FC6000AC228FB82C4200043C010002AC238FB4BC
-:10FC700014400006240200033C010001AC246D9CEA
-:10FC80003C0100021000015EAC208FB83C01000274
-:10FC90001000015BAC228F908F8300543C02000265
-:10FCA0008C428FB42463D8F0004310232C422710D9
-:10FCB00014400003240200043C010002AC228F9097
-:10FCC0003C0200028C428FD0144000213C02FDFF18
-:10FCD0003442FFFF1000014A0282A0243C040001CC
-:10FCE0008C846F203C0100020C005084AC208FA853
-:10FCF0003C0200028C428FDCAF8202043C02000214
-:10FD00008C428FD0144000123C03FDFF8F8202040E
-:10FD10003463FFFF304200301440012F0283A024DF
-:10FD20003C0300028C638FDC240200053C010002CE
-:10FD3000AC228F903C01000210000131AC238FE017
-:10FD40003C0200028C428FD0104000103C02FDFFAC
-:10FD50003C0200018C426E3C244200013C01000147
-:10FD6000AC226E3C2C42000214400125240200010A
-:10FD70003C010001AC226E443C010001AC206E3C11
-:10FD80003C0100011000011EAC226D9C3C030002EE
-:10FD90008C638FC03442FFFF106001190282A024DF
-:10FDA0003C0200028C428F9C1040011500000000B4
-:10FDB0003C010002AC228FC8240200033C01000277
-:10FDC000AC228FA0100000B8240200063C01000203
-:10FDD000AC208FA88F82020434420040AF8202041C
-:10FDE0003C0200028C428FE0240300073C01000229
-:10FDF000AC238F90344200403C010002AC228FE0E3
-:10FE00003C0200028C428FC0104000050000000040
-:10FE10003C0200028C428F9C104000F02402000241
-:10FE20003C05000224A58FA08CA200002C424E218C
-:10FE3000104000EA240200023C0200028C428FC4FF
-:10FE4000104000EF2404FFBF3C0200028C428F9C54
-:10FE50003C0300028C638FC8004410240064182403
-:10FE600010430004240200013C010002100000E4E1
-:10FE7000AC228F9024020003ACA2000024020008F0
-:10FE80003C010002AC228F903C0200028C428FCCDD
-:10FE90001040000C240200013C0400020C005091B0
-:10FEA0008C848F9C3C0200028C428FE81440000539
-:10FEB000240200013C0200028C428FE41040000644
-:10FEC000240200013C010001AC226D9C3C010002B7
-:10FED000100000CBAC208FB83C0200028C428FB0E7
-:10FEE0003C0300028C638F9C2C420001000210C076
-:10FEF000306300083C010002AC228FB03C010002DC
-:10FF0000AC238FAC8F830054240200093C01000213
-:10FF1000AC228F903C010002100000B9AC238FB4DA
-:10FF20008F8300543C0200028C428FB42463D8F0CB
-:10FF3000004310232C4227101440009F00000000B3
-:10FF40003C0200028C428FC01040000500000000FF
-:10FF50003C0200028C428F9C104000A02402000250
-:10FF60003C03000224638FA08C6200002C424E21CF
-:10FF70001040009A240200023C0200028C428FCC06
-:10FF80001040000E000000003C0200028C428F9CDA
-:10FF90003C010002AC208FCC304200801040002F8A
-:10FFA0002402000C8F820204304200801440000CB6
-:10FFB00024020003100000292402000C3C0200026D
-:10FFC0008C428F9C304200801440000524020003C4
-:10FFD0008F820204304200801040001F2402000380
-:10FFE000AC6200002402000A3C010002AC228F90A7
-:10FFF0003C04000224848FD88C8200003C03000261
-:020000021000EC
-:100000008C638FB000431025AF8202048C83000004
-:100010003C0400028C848FB02402000B3C010002DF
-:10002000AC228F90006418253C010002AC238FE0C5
-:100030003C05000224A58FA08CA200002C424E217A
-:1000400010400066240200023C0200028C428FD065
-:1000500010400005000000002402000C3C010002DA
-:1000600010000067AC228F903C0200028C428FC0CF
-:1000700010400063000000003C0400028C848F9C50
-:1000800010800055308200083C0300028C638FAC66
-:100090001062005B240200033C010002AC248FC804
-:1000A000ACA20000240200063C0100021000005433
-:1000B000AC228F908F82020034420002AF82020095
-:1000C0008F8300542402000D3C010002AC228F906B
-:1000D0003C010002AC238FB48F8300543C02000229
-:1000E0008C428FB42463D8F0004310232C42271095
-:1000F00014400031000000003C0200028C428FD00E
-:10010000104000202402000E3C0300028C638FE4A8
-:100110003C01000214600015AC228F900C003E6D73
-:10012000000000003C0500018CA56D980C00529B5E
-:10013000000020213C0300018C636D982402000420
-:10014000146200052403FFFB3C0200018C426D9405
-:10015000100000032403FFF73C0200018C426D9461
-:10016000004310243C010001AC226D948F830224D3
-:100170003C0202003C010002AC238FEC1000002086
-:100180000282A0253C0200028C428FC01040000574
-:10019000000000003C0200028C428F9C1040000FC7
-:1001A000240200023C0200028C428FA02C424E210D
-:1001B0001040000A240200023C0200028C428FC060
-:1001C0001040000F000000003C0200028C428F9C97
-:1001D0001440000B00000000240200023C01000259
-:1001E00010000007AC228F903C0200028C428FC0AE
-:1001F00010400003000000000C003DAF00000000B4
-:100200008F8202203C03F70000431025AF820220BA
-:100210008FBF001003E0000827BD00183C03000258
-:1002200024638FE88C6200001040000534422000F7
-:100230003C010002AC228FDC10000003AC60000027
-:100240003C010002AC248FDC03E000080000000049
-:1002500027BDFFE030820030AFBF00183C01000234
-:10026000AC228FE4144000673C02FFFF34421F0EB3
-:1002700000821024144000612402003030822000EB
-:100280001040005D3083800000031A0230820001BC
-:10029000000212003C0400018C846F2000621825CB
-:1002A000000331C23C03000124636E4830828000A9
-:1002B00000021202308400010004220000441025D4
-:1002C000000239C2000610800043102100471021AF
-:1002D000904300002402000110620025000000008D
-:1002E00010600007240200021062001324020003C1
-:1002F0001062002C3C05000F1000003700000000C9
-:100300008F8202002403FEFF00431024AF8202000C
-:100310008F8202203C03FFFE3463FFFF0043102462
-:10032000AF8202203C010002AC2090043C0100029C
-:1003300010000034AC20900C8F8202003442010087
-:10034000AF8202008F8202203C03FFFE3463FFFF76
-:1003500000431024AF820220240201003C0100026D
-:10036000AC2290043C01000210000026AC20900C4E
-:100370008F8202002403FEFF00431024AF8202009C
-:100380008F8202203C03000100431025AF8202202F
-:100390003C010002AC2090043C0100021000001956
-:1003A000AC23900C8F82020034420100AF82020025
-:1003B0008F8202203C03000100431025AF820220FF
-:1003C000240201003C010002AC2290043C01000226
-:1003D0001000000CAC23900C34A5FFFF3C0400017E
-:1003E00024846C38AFA300100C002B3BAFA000148A
-:1003F0001000000400000000240200303C01000254
-:10040000AC228FE88FBF001803E0000827BD002052
-:1004100000000000000000000000000027BDFFC831
-:10042000AFB2002800809021AFB3002C00A098212B
-:10043000AFB0002000C080213C04000124846C5037
-:100440003C0500093C0200018C426D9834A59001E6
-:100450000240302102603821AFBF0030AFB100242C
-:10046000A7A0001AAFB000140C002B3BAFA20010E5
-:1004700024020002126200832E6200031040000575
-:10048000240200011262000A000000001000017343
-:100490000000000024020004126200F82402000898
-:1004A000126200F73C02FFEC1000016C000000003B
-:1004B0003C0200018C426D94304200021440000462
-:1004C000001289403C02FFFB3442FFFF02028024FD
-:1004D0003C01000200310821AC308FFC3C0240009E
-:1004E000020210241040004E001023C2308400305D
-:1004F000001013823042001C3C03000124636DD8BD
-:1005000000431021008238213C0200200202102406
-:1005100010400006240201003C01000200310821C5
-:10052000AC229000100000053C0200803C0100025B
-:1005300000310821AC2090003C020080020210240F
-:1005400010400006001219403C0200013C0100026C
-:100550000023082110000005AC2290080012114071
-:100560003C01000200220821AC20900894E4000025
-:100570003C0300018C636F402402000510620010F0
-:10058000A7A400183202400010400002348240004C
-:10059000A7A200182404000194E20002240500042C
-:1005A00024E60002344200010C0045BEA4E2000231
-:1005B00024040001000028210C0045BE27A60018D5
-:1005C0003C0200018C426D98241100013C010001A5
-:1005D000AC316DA414530004320280000C003DAF16
-:1005E00000000000320280001040011C00000000EA
-:1005F0000C003DAF000000003C0300018C636F4025
-:100600002402000510620115240200023C010001D1
-:10061000AC316D9C3C01000110000110AC226D98C2
-:10062000240400012405000427B0001A0C0045BE74
-:100630000200302124040001000028210C0045BEE6
-:10064000020030213C020002005110218C428FF444
-:100650003C0400018C846D983C03BFFF3463FFFFB2
-:100660003C010001AC336DA4004310243C010002A6
-:1006700000310821109300F7AC228FF4100000F72E
-:10068000000000003C02200002021024104000057F
-:10069000240200013C010001AC226F1C1000000488
-:1006A000001289403C010001AC206F1C00128940FF
-:1006B0003C01000200310821AC308FF83C024000C0
-:1006C0000202102414400014000000003C0200014B
-:1006D0008C426F1C10400006240400042405000115
-:1006E0000C004DDB2406200024020001AEE204B819
-:1006F0003C020002005110218C428FF03C03BFFFEE
-:100700003463FFFF004310243C0100020031082144
-:10071000100000D0AC228FF03C0200018C426F1C14
-:10072000104000283C0300A0020310245443000D95
-:100730003C0200203C0200018C426F202403010097
-:100740003C01000200310821AC2390043C0300016D
-:100750003C01000200310821AC23900C1000001570
-:100760003442040002021024104000082403010057
-:100770003C0200018C426F203C0100020031082144
-:10078000AC2390041000000B344208003C020080AF
-:10079000020210241040002E3C0300013C02000124
-:1007A0008C426F203C01000200310821AC23900CE8
-:1007B00034420C003C010001AC226F2010000025E7
-:1007C000240400013C020020020210241040000614
-:1007D000240201003C01000200310821AC229004F7
-:1007E000100000053C0200803C010002003108219D
-:1007F000AC2090043C02008002021024104000074C
-:10080000001219403C0200013C01000200230821B3
-:10081000AC22900C100000062404000100121140CC
-:100820003C01000200220821AC20900C24040001AD
-:100830000000282127B0001E0C00457C020030215A
-:1008400024040001000028210C00457C0200302116
-:10085000240400012405000127B0001C0C00457C85
-:100860000200302124040001240500010C00457C15
-:100870000200302110000077000000003C02FFEC75
-:100880003442FFFF020280243C020008020280255D
-:10089000001211403C01000200220821AC308FF808
-:1008A0003C02200002021024104000090000000059
-:1008B0003C0200018C426E441440000524020001F9
-:1008C0003C010001AC226F1C100000043C024000FF
-:1008D0003C010001AC206F1C3C02400002021024CD
-:1008E0001440001D24020E013C0300018C636F1CA8
-:1008F000AF8202383C010001AC206DB010600005F1
-:10090000240220203C010001AC226F2024020001BF
-:10091000AEE204B83C04BFFF001219403C020002E2
-:10092000004310218C428FF03C0500018CA56D988E
-:100930003484FFFF004410243C01000200230821FE
-:10094000AC228FF02402000110A20044000000003D
-:1009500010000040000000003C0200018C426F1CAF
-:100960001040001C240220003C010001AC226F203A
-:100970003C0300A0020310241443000500121140A0
-:100980003402A0003C0100011000002DAC226F20B9
-:100990003C030002006218218C638FF83C020020A7
-:1009A0000062102410400004240220013C010001D8
-:1009B00010000023AC226F203C0200800062102453
-:1009C0001040001F3402A0013C0100011000001C77
-:1009D000AC226F203C0200200202102410400007CD
-:1009E00000121940240201003C01000200230821EA
-:1009F000AC229004100000063C020080001211405E
-:100A00003C01000200220821AC2090043C0200803E
-:100A10000202102410400006001219403C0200019E
-:100A20003C0100020023082110000005AC22900CBC
-:100A3000001211403C01000200220821AC20900C61
-:100A40003C0300018C636D982402000110620003D6
-:100A5000000000000C003DAF000000008FBF003020
-:100A60008FB3002C8FB200288FB100248FB00020EC
-:100A700003E0000827BD003827BDFFB0AFB3003C3E
-:100A800000009821AFB500400000A821AFB10034AC
-:100A90000000882124020002AFBF0048AFBE00441E
-:100AA000AFB20038AFB00030AFA4002CA7A0001A3E
-:100AB000A7A00018A7A00020A7A0001EA7A00022A2
-:100AC00010A20130A7A0001C2CA2000310400005BA
-:100AD0002402000110A2000A3C0240001000025D46
-:100AE000022010212402000410A2020A240200089D
-:100AF00010A202080220102110000256000000007F
-:100B00008FA8002C000881403C03000200701821CF
-:100B10008C638FFC0062102414400009240400013F
-:100B20003C027FFF3442FFFF006288243C01000248
-:100B300000300821AC318FF4100002460220102151
-:100B4000240500010C00457C27A6001824040001A0
-:100B5000240500010C00457C27A6001897A2001868
-:100B600030420004104000D93C1140003C0200011A
-:100B70008C426F402443FFFF2C620006104000D9D6
-:100B8000000310803C010001002208218C226C68C7
-:100B900000400008000000002404000124050011AA
-:100BA00027B0001A0C00457C02003021240400010B
-:100BB000240500110C00457C0200302197A3001A87
-:100BC00030624000104000023C1500103C15000847
-:100BD00030628000104000AA3C130001100000A801
-:100BE0003C130002240400012405001427B0001A5D
-:100BF0000C00457C0200302124040001240500146F
-:100C00000C00457C0200302197A3001A30621000CE
-:100C1000104000023C1500103C150008306208002E
-:100C2000104000973C130001100000953C13000297
-:100C3000240400012405001927B0001C0C00457C89
-:100C40000200302124040001240500190C00457C19
-:100C50000200302197A2001C304307002402040048
-:100C600010620027286204011040000E24020200D6
-:100C70001062001F286202011040000524020100DA
-:100C80005062001E3C1300011000001E24040001ED
-:100C900024020300506200193C13000210000019E6
-:100CA00024040001240206001062000D28620601DF
-:100CB00010400005240205005062000B3C130002A6
-:100CC0001000001024040001240207001462000D2B
-:100CD000240400013C1300041000000A3C15000825
-:100CE000100000063C130004100000053C1500082D
-:100CF0003C130001100000023C1500083C150010D8
-:100D0000240400012405001827B0001E0C00457CB7
-:100D10000200302124040001240500180C00457C49
-:100D2000020030218FA8002C97A7001E0008114058
-:100D30003C06000200C230218CC68FF497A200222C
-:100D40003C10000126106C5C02002021AFA20010B4
-:100D500097A2001C3C05000C34A503030C002B3BA0
-:100D6000AFA200143C020004166200103C02000115
-:100D70008F84005424030001240200023C0100017E
-:100D8000AC236D9C3C010001AC226D983C0100013C
-:100D9000AC236DA43C010001AC236E243C01000196
-:100DA000AC246F301000004F02B388251662003962
-:100DB0003C0280003C0200018C426E201440001E68
-:100DC0002404001800002021000028210C004DDB25
-:100DD000340680008F8300548F82005402B388252C
-:100DE00010000002246300328F820054006210233E
-:100DF0002C4200331440FFFC000000008F8300549D
-:100E0000240200013C010001AC226E203C010001E3
-:100E1000AC226D9C3C010001AC226D983C010001AC
-:100E2000AC226DA43C010001AC226E243C01000107
-:100E30001000002CAC236F30000028210C004DDB8B
-:100E400024060404000020212405001E27A6001803
-:100E5000240200020C0045BEA7A2001800002021B9
-:100E60000000282127A600180C0045BEA7A00018E6
-:100E700024040018240500020C004DDB24060004A5
-:100E80003C0280000222102502B318251000001534
-:100E90000043882502221025027518250043882565
-:100EA0000200202197A6001C3C0700018CE76D98EA
-:100EB0003C05000C34A50326AFB300100C002B3BFF
-:100EC000AFB1001410000007000000003C11000248
-:100ED000023088218E318FFC3C027FFF3442FFFFBD
-:100EE000022288243C0200018C426DA81040001EA2
-:100EF000000000003C0200018C426F1C1040000208
-:100F00003C022000022288258FA8002C00081140F6
-:100F10003C010002002208218C22900010400003B6
-:100F20003C02002010000005022288253C02FFDF61
-:100F30003442FFFF022288248FA8002C00081140B1
-:100F40003C010002002208218C229008104000037E
-:100F50003C02008010000004022288253C02FF7F32
-:100F60003442FFFF022288248FA8002C0008114081
-:100F70003C01000200220821AC318FF41000013541
-:100F8000022010218FA8002C0008F1403C03000231
-:100F9000007E18218C638FF83C0240000062102410
-:100FA00014400009240400013C027FFF3442FFFF8B
-:100FB000006288243C010002003E0821AC318FF021
-:100FC0001000012402201021000028210C00457C83
-:100FD00027A6001824040001000028210C00457CED
-:100FE00027A60018240400012405000127B20020D0
-:100FF0000C00457C0240302124040001240500013E
-:101000000C00457C0240302124040001240500042A
-:1010100027B1001E0C00457C022030212404000171
-:10102000240500040C00457C02203021240400012A
-:101030002405000527B000220C00457C0200302169
-:1010400024040001240500050C00457C0200302129
-:1010500024040001240500100C00457C27A600187C
-:1010600024040001240500100C00457C27A600186C
-:10107000240400012405000A0C00457C02403021B4
-:10108000240400012405000A0C00457C02403021A4
-:1010900024040001240500180C00457C02203021A6
-:1010A00024040001240500180C00457C0220302196
-:1010B00024040001240500010C00457C27A600182B
-:1010C00024040001240500010C00457C27A600181B
-:1010D00097A2001830420004104000663C11400006
-:1010E0003C0300018C636F34240200051462006726
-:1010F000240400012405001927B0001C0C00457CC5
-:101100000200302124040001240500190C00457C54
-:101110000200302197A2001C304307002402040083
-:1011200010620027286204011040000E2402020011
-:101130001062001F28620201104000052402010015
-:101140005062001E3C1300011000001E3C0200040F
-:1011500024020300506200193C1300021000001921
-:101160003C020004240206001062000D2862060101
-:1011700010400005240205005062000B3C130002E1
-:10118000100000103C020004240207001462000D4D
-:101190003C0200043C1300041000000A3C15000847
-:1011A000100000063C130004100000053C15000868
-:1011B0003C130001100000023C1500083C15001013
-:1011C0003C020004126200173C0280008F8200542F
-:1011D000241000013C010001AC306D9C3C01000179
-:1011E000AC306D983C010001AC306DA43C010001B5
-:1011F000AC306E243C010001AC226F303C02000197
-:101200001662002202758825000020210000282196
-:101210000C004DDB340680003C0100011000001B77
-:10122000AC306E200222102502B318250043882519
-:1012300097A6001C3C0200018C426F1C3C07000179
-:101240008CE76D983C04000124846C5CAFA2001014
-:1012500097A2001E3C05000C34A503233C010001AD
-:10126000AC206E200C002B3BAFA200141000000736
-:10127000000000003C110002023E88218E318FF0F8
-:101280003C027FFF3442FFFF022288243C0200011F
-:101290008C426DA810400069000000003C02000173
-:1012A0008C426F1C104000023C0220000222882564
-:1012B0008FA8002C000811403C01000200220821E8
-:1012C0008C229004104000033C0200201000000516
-:1012D000022288253C02FFDF3442FFFF02228824DD
-:1012E0008FA8002C000811403C01000200220821B8
-:1012F0008C22900C104000033C0200801000004F34
-:10130000022288253C02FF7F3442FFFF1000004B81
-:10131000022288248FA8002C000829403C030002E8
-:10132000006518218C638FF83C0240000062102495
-:10133000144000083C027FFF3442FFFF0062882413
-:101340003C01000200250821AC318FF01000004163
-:10135000022010213C0200018C426DA81040003494
-:101360003C11C00C3C0200018C426E443C04C00C99
-:10137000348420003C0300018C636F1C0002102B9E
-:10138000000210230044102410600003005188253F
-:101390003C022000022288253C0200020045102168
-:1013A0008C429004104000033C0200201000000416
-:1013B000022288253C02FFDF3442FFFF02228824FC
-:1013C0008FA8002C000811403C01000200220821D7
-:1013D0008C22900C104000033C020080100000049E
-:1013E000022288253C02FF7F3442FFFF022288242C
-:1013F0003C0200018C426E30104000023C020800AA
-:10140000022288253C0200018C426E34104000020A
-:101410003C020400022288253C0200018C426E3806
-:10142000104000063C020100100000040222882542
-:101430003C027FFF3442FFFF006288248FA8002C0B
-:10144000000811403C01000200220821AC318FF05D
-:10145000022010218FBF00488FBE00448FB500408E
-:101460008FB3003C8FB200388FB100348FB00030A2
-:1014700003E0000827BD005027BDFFD0AFB2002811
-:1014800000809021AFBF002CAFB10024AFB000208E
-:101490008F8402003C1000018E106D988F86022010
-:1014A000240200021202005C2E020003104000051C
-:1014B000240200011202000A001219401000010C5F
-:1014C0000000000024020004120200BF24020008F1
-:1014D000120200BE00128940100001050000000049
-:1014E0003C05000200A328218CA58FFC3C100002C3
-:1014F000020380218E108FF43C02400000A21024D1
-:10150000104000383C020008020210241040002065
-:10151000348400023C020002004310218C429000FF
-:101520001040000534840020348401003C02002077
-:1015300010000006020280252402FEFF0082202403
-:101540003C02FFDF3442FFFF020280240012114000
-:101550003C010002002208218C2290081040000566
-:101560003C02000100C230253C0200801000001641
-:10157000020280253C02FFFE3442FFFF00C23024FD
-:101580003C02FF7F3442FFFF1000000F0202802464
-:101590002402FEDF008220243C02FFFE3442FFFFD3
-:1015A00000C230243C02FF5F3442FFFF020280246D
-:1015B0003C01000200230821AC2090003C01000205
-:1015C00000230821AC209008AF840200AF860220DF
-:1015D0008F82022034420002AF8202201000000AF3
-:1015E000001211403C02BFFF3442FFFF8F83020014
-:1015F000020280242402FFFD006218240C003DAF8B
-:10160000AF830200001211403C01000200220821B9
-:10161000100000B7AC308FF43C0200018C426F1C0C
-:101620001040006924050004240400010C00457CDE
-:1016300027A6001824040001240500050C00457CA1
-:1016400027A6001A97A3001897A2001A3C040001CD
-:1016500024846E4830630C0000031A8230420C0070
-:1016600000021282A7A2001A00021080004410217A
-:1016700000431021A7A30018904800002402000195
-:101680003103FFFF106200292862000210400005AC
-:101690000000000010600009000000001000003D84
-:1016A0000000000010700013240200031062002CE0
-:1016B0000000000010000037000000008F820200D0
-:1016C0002403FEFF00431024AF8202008F82022019
-:1016D0003C03FFFE3463FFFF00431024AF8202206F
-:1016E0003C010002AC2090043C01000210000032DA
-:1016F000AC20900C8F82020034420100AF820200C5
-:101700008F8202203C03FFFE3463FFFF004310245E
-:10171000AF820220240201003C010002AC229004AE
-:101720003C01000210000024AC20900C8F820200CB
-:101730002403FEFF00431024AF8202008F820220A8
-:101740003C03000100431025AF8202203C0100024F
-:10175000AC2090043C01000210000017AC23900C58
-:101760008F82020034420100AF8202008F82022089
-:101770003C03000100431025AF8202202402010037
-:101780003C010002AC2290043C0100021000000A5F
-:10179000AC23900C3C04000124846C8097A6001AB2
-:1017A00097A700183C05000134A5FFFFAFA8001063
-:1017B0000C002B3BAFA000148F82020034420002C9
-:1017C0001000004BAF820200001289403C0500026D
-:1017D00000B128218CA58FF83C1000020211802155
-:1017E0008E108FF03C02400000A210241440001024
-:1017F000000000003C0200018C426F1C14400005F8
-:101800003C02BFFF8F82020034420002AF8202001E
-:101810003C02BFFF3442FFFF0C003DAF02028024B8
-:101820003C0100020031082110000031AC308FF083
-:101830003C0200018C426F1C104000053C0200205D
-:101840003C0200018C426E44104000253C02002006
-:1018500000A210241040000734840020240201005C
-:101860003C01000200310821AC2290041000000667
-:10187000348401003C01000200310821AC209004B6
-:101880002402FEFF008220243C02008000A21024DB
-:1018900010400007001219403C0200013C01000208
-:1018A00000230821AC22900C1000000800C2302553
-:1018B000001211403C01000200220821AC20900CD3
-:1018C0003C02FFFE3442FFFF00C23024AF8402001E
-:1018D000AF8602208F82022034420002AF820220B3
-:1018E000001211403C01000200220821AC308FF0B0
-:1018F0008FBF002C8FB200288FB100248FB0002042
-:1019000003E0000827BD003000000000000018219F
-:10191000308400FF2405FFDF2406FFBF00641007AA
-:101920003042000110400004000000008F8200449B
-:1019300010000003344200408F820044004610240F
-:10194000AF8200448F82004434420020AF820044C2
-:101950008F82004400451024AF82004424630001BC
-:10196000286200085440FFEE0064100703E00008FE
-:10197000000000002C8200081040001B0000000046
-:101980002405FFDF2406FFBF000418803C0200018D
-:1019900024426E60006218212464000490620000FA
-:1019A00010400004000000008F820044100000037B
-:1019B000344200408F82004400461024AF8200442D
-:1019C0008F82004434420020AF8200448F82004462
-:1019D00000451024AF820044246300010064102BF2
-:1019E0001440FFEE0000000003E0000800000000CB
-:1019F0000000000000000000000000008F8400C410
-:101A00008F8600E08F8700E42402FFF800C22824BC
-:101A100010E5001A27623FF814E2000224E80008EB
-:101A200027683000550500048D0A000030C200040C
-:101A300014400012008050218CE900008F42013CCC
-:101A4000014948230049182B94EB0006106000025E
-:101A500025630050004948210123182B5040000302
-:101A60008F4201FC03E0000800E01021AF8800E88D
-:101A700024420001AF4201FCAF8800E403E000080B
-:101A80000000102103E00008000000008F8300E444
-:101A900027623FF81062000424620008AF8200E869
-:101AA00003E00008AF8200E427623000AF8200E864
-:101AB00003E00008AF8200E403E00008000000003B
-:101AC0000000000000000000000000008F880120DE
-:101AD00027624FE08F8301281502000225090020AC
-:101AE00027694800112300128FA20010AD040000E6
-:101AF000AD050004AD060008A507000E8FA3001475
-:101B0000AD0200188FA20018AD03001C25030016BB
-:101B1000AD020010AD030014AF8901208F4300FC1B
-:101B2000240200012463FFFF03E00008AF4300FC30
-:101B30008F430324000010212463000103E0000808
-:101B4000AF43032403E00008000000008F88010079
-:101B5000276247E08F830108150200022509002053
-:101B6000276940001123000F8FA20010AD04000070
-:101B7000AD050004AD060008A507000E8FA30014F4
-:101B8000AD0200188FA20018AD03001C250300163B
-:101B9000AD020010AD030014AF89010003E000089E
-:101BA000240200018F430328000010212463000158
-:101BB00003E00008AF43032803E000080000000032
-:101BC00000000000000000000000000024486561E3
-:101BD0006465723A202F70726F6A656374732F7236
-:101BE00063732F73772F67652F2E2F6E69632F66B0
-:101BF00077322F636F6D6D6F6E2F66776D61696ED3
-:101C00002E632C7620312E312E322E343520313970
-:101C100039392F30312F32342030303A31303A35A3
-:101C20003520736875616E67204578702024000048
-:101C3000657674526E674600516576744600000002
-:101C400051657674505F46004D657674526E6746F6
-:101C5000000000004D516576744600004D516576D8
-:101C6000505F46005173436F6E495F4600000000AD
-:101C70005173436F6E734600517250726F64460029
-:101C80006261644D656D537A0000000068775665A7
-:101C900072000000626164487756657200000000BF
-:101CA0002A2A4441574E5F41000000007478527860
-:101CB0004266537A00000000626641746E4D726B9A
-:101CC000000000007265645A6F6E6531000000000C
-:101CD000706369436F6E660067656E436F6E660082
-:101CE0002A646D615244666C000000002A50414E27
-:101CF00049432A002E2E2F2E2E2F2E2E2F2E2E2F02
-:101D00002E2E2F7372632F6E69632F6677322F63C7
-:101D10006F6D6D6F6E2F66776D61696E2E6300005B
-:101D2000726362466C616773000000006261645216
-:101D30007852636200000000676C6F62466C6773E4
-:101D4000000000002B5F646973705F6C6F6F700040
-:101D50002B65765F68616E646C65720063616E749A
-:101D600031446D61000000002B715F646D615F7430
-:101D70006F5F6E69635F636B73756D002B685F7374
-:101D8000656E645F646174615F72656164795F63ED
-:101D90006B73756D000000002B685F646D615F728E
-:101DA000645F6173736973745F636B73756D000057
-:101DB00074436B736D4F6E002B715F646D615F7464
-:101DC0006F5F6E69630000002B685F73656E645F10
-:101DD000646174615F726561647900002B685F649F
-:101DE0006D615F72645F61737369737400000000FA
-:101DF00074436B736D4F6666000000002B685F7361
-:101E0000656E645F62645F72656164790000000002
-:101E10006873745352696E67000000006261645316
-:101E200052696E67000000006E69635352696E6705
-:101E30000000000077446D61416C6C4100000000BF
-:101E40002B715F646D615F746F5F686F73745F6344
-:101E50006B73756D000000002B685F6D61635F72CE
-:101E6000785F636F6D705F636B73756D000000006A
-:101E70002B685F646D615F77725F61737369737400
-:101E80005F636B73756D000072436B736D4F6E0013
-:101E90002B715F646D615F746F5F686F73740000B6
-:101EA0002B685F6D61635F72785F636F6D700000B8
-:101EB0002B685F646D615F77725F617373697374C0
-:101EC0000000000072436B736D4F666600000000F7
-:101ED0002B685F726563765F62645F7265616479C7
-:101EE000000000002B685F726563765F6A756D6243
-:101EF0006F5F62645F726561647900002B685F7276
-:101F00006563765F6D696E695F62645F7265616467
-:101F1000790000002B6D685F636F6D6D616E64000A
-:101F20002B685F74696D6572000000002B685F6448
-:101F30006F5F7570646174655F74785F636F6E73F3
-:101F4000000000002B685F646F5F757064617465EA
-:101F50005F72785F70726F64000000002B636B73B8
-:101F6000756D3136000000002B7065656B5F6D612B
-:101F7000635F72785F7761002B7065656B5F6D6181
-:101F8000635F7278000000002B6465715F6D6163B0
-:101F90005F7278002B685F6D61635F72785F617458
-:101FA000746E0000626164526574537A0000000030
-:101FB000727842644266537A000000002B6E756CA2
-:101FC0006C5F68616E646C657200000066774F70CC
-:101FD0004661696C000000002B685F757064617475
-:101FE000655F6C65643400002B685F7570646174B4
-:101FF000655F6C65643600002B685F7570646174A2
-:10200000655F6C6564320000696E74537461746559
-:10201000000000002A2A696E697443700000000005
-:102020002373637265616D0069537461636B4572FC
-:102030000000000070726F62654D656D0000000069
-:102040002A2A4441574E5F42000000002B73775FFD
-:10205000646D615F6173736973745F706C75735FD6
-:1020600074696D65720000002B267072656C6F617B
-:10207000645F77725F646573637200002B26707211
-:10208000656C6F61645F72645F64657363720000A6
-:102090002B685F68665F74696D65720024486561CE
-:1020A0006465723A202F70726F6A656374732F7261
-:1020B00063732F73772F67652F2E2F6E69632F66DB
-:1020C00077322F636F6D6D6F6E2F74696D65722E31
-:1020D000632C7620312E312E322E33352031393992
-:1020E000392F30312F32372031393A30393A3530C3
-:1020F0002068617965732045787020240000000015
-:10210000657674526E67460051657674460000002D
-:1021100051657674505F46004D657674526E674621
-:10212000000000004D516576744600004D51657603
-:10213000505F46005173436F6E495F4600000000D8
-:102140005173436F6E734600517250726F64460054
-:10215000542D446D6152643200000000542D446DD2
-:102160006152643100000000542D446D615264429C
-:1021700000000000542D446D6157723200000000D1
-:10218000542D446D6157723100000000542D446D90
-:1021900061577242000000000000000024486561A1
-:1021A0006465723A202F70726F6A656374732F7260
-:1021B00063732F73772F67652F2E2F6E69632F66DA
-:1021C00077322F636F6D6D6F6E2F636F6D6D616E04
-:1021D000642E632C7620312E312E322E323820316F
-:1021E0003939392F30312F32302031393A34393AB8
-:1021F000343920736875616E67204578702024003B
-:10220000657674526E67460051657674460000002C
-:1022100051657674505F46004D657674526E674620
-:10222000000000004D516576744600004D51657602
-:10223000505F46005173436F6E495F4600000000D7
-:102240005173436F6E734600517250726F64460053
-:102250003F48636D644D6278000000003F636D6429
-:1022600048737453000000003F636D644D634D6418
-:10227000000000003F636D6450726F6D000000004D
-:102280003F636D644C696E6B000000003F636D64DA
-:1022900045727200000086AC00008E5C00008E5C0F
-:1022A00000008DE400008B7800008E3000008E5C12
-:1022B00000008790000088000000899000008A6874
-:1022C00000008A3400008E5C0000887000008B24BF
-:1022D00000008E5C00008B34000087B4000088246E
-:1022E00000000000000000000000000024486561BC
-:1022F0006465723A202F70726F6A656374732F720F
-:1023000063732F73772F67652F2E2F6E69632F6688
-:1023100077322F636F6D6D6F6E2F6D636173742EE7
-:10232000632C7620312E312E322E38203139393837
-:102330002F31322F30382030323A33363A3336208C
-:10234000736875616E672045787020240000000076
-:10235000657674526E6746005165767446000000DB
-:1023600051657674505F46004D657674526E6746CF
-:10237000000000004D516576744600004D516576B1
-:10238000505F46005173436F6E495F460000000086
-:102390005173436F6E734600517250726F64460002
-:1023A0006164644D63447570000000006164644DB5
-:1023B0006346756C0000000064656C4D634E6F45AC
-:1023C00000000000000000000000000024486561DB
-:1023D0006465723A202F70726F6A656374732F722E
-:1023E00063732F73772F67652F2E2F6E69632F66A8
-:1023F00077322F636F6D6D6F6E2F646D612E632C5E
-:102400007620312E312E322E323420313939382F88
-:1024100031322F32312030303A33333A3039207371
-:102420006875616E67204578702024006576745267
-:102430006E674600516576744600000051657674FB
-:10244000505F46004D657674526E6746000000008E
-:102450004D516576744600004D516576505F4600DB
-:102460005173436F6E495F46000000005173436F24
-:102470006E734600517250726F6446007377446DFC
-:10248000614F66660000000031446D614F6E0000D0
-:102490007377446D614F6E002372446D6141544EF9
-:1024A0000000000072446D6141544E300000000095
-:1024B00072446D6141544E310000000072446D6100
-:1024C000344762002A50414E49432A002E2E2F2EB7
-:1024D0002E2F2E2E2F2E2E2F2E2E2F7372632F6E19
-:1024E00069632F6677322F636F6D6D6F6E2F646D2A
-:1024F000612E63002377446D6141544E000000005B
-:1025000077446D6141544E300000000077446D61A6
-:1025100041544E310000000077446D613447620041
-:102520000000000000000000000000002448656179
-:102530006465723A202F70726F6A656374732F72CC
-:1025400063732F73772F67652F2E2F6E69632F6646
-:1025500077322F636F6D6D6F6E2F74726163652EAE
-:10256000632C7620312E312E322E352031393938F8
-:102570002F30392F33302031383A35303A32382045
-:10258000736875616E672045787020240000000034
-:102590000000000000000000000000002448656109
-:1025A0006465723A202F70726F6A656374732F725C
-:1025B00063732F73772F67652F2E2F6E69632F66D6
-:1025C00077322F636F6D6D6F6E2F646174612E6350
-:1025D0002C7620312E312E322E31322031393939BC
-:1025E0002F30312F32302031393A34393A353120D9
-:1025F000736875616E6720457870202400000000C4
-:1026000046575F56455253494F4E3A202331204694
-:1026100072692041707220372031373A35373A35A8
-:1026200032205044542032303030000046575F434F
-:102630004F4D50494C455F54494D453A2031373A4A
-:1026400035373A353200000046575F434F4D504909
-:102650004C455F42593A206465767263730000000E
-:1026600046575F434F4D50494C455F484F53543A8E
-:1026700020636F6D707574650000000046575F43FE
-:102680004F4D50494C455F444F4D41494E3A2065AE
-:102690006E672E616374656F6E2E636F6D00000050
-:1026A00046575F434F4D50494C45523A206763634C
-:1026B0002076657273696F6E20322E372E320000DD
-:1026C00000000000120411000000000024486561B1
-:1026D0006465723A202F70726F6A656374732F722B
-:1026E00063732F73772F67652F2E2F6E69632F66A5
-:1026F00077322F636F6D6D6F6E2F6D656D2E632C4E
-:102700007620312E312E322E3520313939382F3086
-:10271000392F33302031383A35303A303820736829
-:1027200075616E672045787020240000244865613B
-:102730006465723A202F70726F6A656374732F72CA
-:1027400063732F73772F67652F2E2F6E69632F6644
-:1027500077322F636F6D6D6F6E2F73656E642E63AE
-:102760002C7620312E312E322E3434203139393826
-:102770002F31322F32312030303A33333A31382052
-:10278000736875616E672045787020240000000032
-:10279000657674526E674600516576744600000097
-:1027A00051657674505F46004D657674526E67468B
-:1027B000000000004D516576744600004D5165766D
-:1027C000505F46005173436F6E495F460000000042
-:1027D0005173436F6E734600517250726F644600BE
-:1027E00069736E745463705500000000244865617D
-:1027F0006465723A202F70726F6A656374732F720A
-:1028000063732F73772F67652F2E2F6E69632F6683
-:1028100077322F636F6D6D6F6E2F726563762E63E7
-:102820002C7620312E312E322E3533203139393964
-:102830002F30312F31362030323A35353A3433208B
-:10284000736875616E672045787020240000000071
-:10285000657674526E6746005165767446000000D6
-:1028600051657674505F46004D657674526E6746CA
-:10287000000000004D516576744600004D516576AC
-:10288000505F46005173436F6E495F460000000081
-:102890005173436F6E734600517250726F644600FD
-:1028A000724D616343686B300000000072784672BD
-:1028B0006D324C670000000072784E6F53744264B2
-:1028C0000000000072784E6F4D6942640000000005
-:1028D00072784E6F4A6D4264000000007278436B5C
-:1028E000446D614600000000727851446D457846A1
-:1028F00000000000727851446D61460072785144C6
-:102900004C42644600000000727851446D426446B7
-:1029100000000000727843726350616400000000A0
-:1029200072536D51446D614600000000244865619A
-:102930006465723A202F70726F6A656374732F72C8
-:1029400063732F73772F67652F2E2F6E69632F6642
-:1029500077322F636F6D6D6F6E2F6D61632E632CF9
-:102960007620312E312E322E323220313939382F25
-:1029700031322F30382030323A33363A3330207308
-:102980006875616E67204578702024006576745202
-:102990006E67460051657674460000005165767496
-:1029A000505F46004D657674526E67460000000029
-:1029B0004D516576744600004D516576505F460076
-:1029C0005173436F6E495F46000000005173436FBF
-:1029D0006E734600517250726F6446006D616354AD
-:1029E000687265730000000023744D616341544EAA
-:1029F0000000000023724D616341544E000000004E
-:102A000072656D4173737274000000006C696E6BC7
-:102A1000444F574E000000006C696E6B555000002B
-:102A20000000000000000000000000002448656174
-:102A30006465723A202F70726F6A656374732F72C7
-:102A400063732F73772F67652F2E2F6E69632F6641
-:102A500077322F636F6D6D6F6E2F636B73756D2E95
-:102A6000632C7620312E312E322E392031393939EE
-:102A70002F30312F31342030303A30333A3438204F
-:102A8000736875616E67204578702024000000002F
-:102A9000657674526E674600516576744600000094
-:102AA00051657674505F46004D657674526E674688
-:102AB000000000004D516576744600004D5165766A
-:102AC000505F46005173436F6E495F46000000003F
-:102AD0005173436F6E734600517250726F644600BB
-:102AE00000000000000000000000000050726F6253
-:102AF00065506879000000006C6E6B41535352546E
-:102B000000000000000109A400010A1C00010A5095
-:102B100000010A7C0001105000010AA800010B10FE
-:102B2000000111FC00010DC000010C6800010C80C7
-:102B300000010CC400010CEC00010D0C00010D346F
-:102B4000000111FC00010DC000010DF800010E1084
-:102B500000010E4000010E6800010E8800010EB059
-:102B60000000000000010FDC000110080001102C23
-:102B7000000111FC00011050000110780001110843
-:102B80000000000000000000000000000001186CC0
-:102B90000001193C00011A1400011AE400011B4055
-:102BA00000011C1C00011C4400011D2000011D48E7
-:102BB00000011EF000011F18000120C0000122B812
-:102BC0000001254C000124600001254C00012578FE
-:102BD000000120E8000122907273745F676D6969DB
-:102BE00000000000000126080001264000012728FF
-:102BF00000013374000133B4000133CC7365746C8D
-:102C00006F6F7000000000000000000000013BBC7E
-:102C100000013BFC00013C8C00013CD000013D3434
-:102C200000013DC000013DF400013E7C00013F1465
-:102C300000013FE400014024000140A8000140CC15
-:102C4000000141DC646F4261736550670000000061
-:102C500000000000000000000000000073746D61BF
-:102C6000634C4E4B000000006765746D636C6E6BC7
-:102C70000000000000014ED800014ED800014B8C2E
-:102C800000014BD800014C2400014ED87365746DCF
-:102C90006163616374000000000000000000000038
-:102CA0000000000000000000000000000000000024
-:102CB0000000000000000000000000000000000014
-:102CC0000000000000000000000000000000000103
-:102CD000000000010000000100C001FC00003FFCFA
-:102CE00000C00000416C74656F6E204163654E4901
-:102CF000432056000000000000000000000000001B
-:102D0000000000000000000000000000416C74653D
-:102D10006F6E204163654E49432056004242424255
-:102D2000000000000000000000000000001FFFFC89
-:102D3000001FFF7C000000000000000000000000F9
-:102D40000000000000000000000000000060CF0054
-:102D500000000060CF000000000000000000000044
-:102D60000000000000000000000000000000000063
-:102D70000000000000000000000000000000000053
-:102D80000000000000000000000000000000000043
-:102D90000000000000000000000000000000000033
-:102DA0000000000000000000000000030000000020
-:102DB0000000000100000000000000000000000012
-:102DC0000000000100000000000000010000000001
-:102DD00000000000000000000000000000000001F2
-:102DE00000000001000000000000000000000000E2
-:102DF00000000000000000000100000021000000B1
-:102E0000120001400000000000000000200000004F
-:102E1000120000A0000000001200006012000180FB
-:102E2000120001E0000000000000000000000000AF
-:102E30000000000100000000000000000000000091
-:102E40000000000000000000000000000000000280
-:102E5000000000000000000000030001000000016D
-:102E60000003020100000000000000000101010158
-:102E70000101010000010100010100010001000148
-:0C2E800001000101000001010000000041
-:00000001FF
-/* tg2 firmware v12.4.11 */
diff --git a/firmware/adaptec/starfire_rx.bin.ihex b/firmware/adaptec/starfire_rx.bin.ihex
deleted file mode 100644
index 6b1fae0d18eb..000000000000
--- a/firmware/adaptec/starfire_rx.bin.ihex
+++ /dev/null
@@ -1,53 +0,0 @@
-:10000000010003DC00000000040004210000008661
-:10001000800000150000180E8100001500006664C5
-:100020001A0040AB00000B06142000110000000075
-:10003000142040220000AAAA14204022000003003D
-:1000400014204022000000001A0040AB00000B14F6
-:1000500014200011000000008300001500000002C1
-:10006000040000210000000000000010000000005B
-:1000700004000421000000870000001000000000C0
-:1000800000000010000000000000801500000000CB
-:100090000000003E00000000000000100000000012
-:1000A0008200001500004000009E8050000000000B
-:1000B000030080150000000086008015000000008D
-:1000C00082000015000080000100001C00000000FC
-:1000D000000050A00000010C4E20D011000060086C
-:1000E0001420D012000040080000F09000007000C2
-:1000F0000000C8B0000030000000404000000000D8
-:10010000001080150000000000A2C1500000400057
-:1001100000A400B000000014000000200000000057
-:100120002500400D0000252500047220000031004C
-:10013000009340700000000000000020000000005C
-:1001400000924460000001842B20C01100000000D8
-:100150000000C42000000540360140180000422D78
-:100160001420001100000000009244600000018390
-:100170003200001F0000003402AC00150000000235
-:1001800000A601100000000842200011000000003D
-:1001900000924060000001030000001E000000000B
-:1001A00000000020000001000000001E0000000010
-:1001B00000924460000000860000408000000000C3
-:1001C0000092C0700000000000924060000001003A
-:1001D0000000C8900000500000A6C1100000000000
-:1001E00000B0C09000000012021C001500000000CA
-:1001F0003200001F0000003400924460000005102F
-:100200004421001100000000420000110000000025
-:1002100083000015000000400092446000000508C3
-:100220004501401800004545008080500000000056
-:10023000622080120000000082000015000008000B
-:100240001520001100000000000000100000000058
-:10025000000000100000000000000010000000007E
-:10026000000000100000000000000010000000006E
-:10027000800000150000EEA4810000150000005F62
-:1002800000000060000000000000412000000000AD
-:1002900000004A000000400000924460000001900D
-:1002A0005601401A000059561400001100000000C9
-:1002B0000093405000000018009300500000001808
-:1002C0003601403A0000002D000643A9000000005E
-:1002D0000000C420000001405601401A0000595699
-:1002E00014000011000000000000001000000000D9
-:1002F0000000001000000000000642A900000000FD
-:1003000000024420000001835601401A00005956A3
-:1003100082000015000020001520001100000000E0
-:1003200082000015000000101520001100000000E0
-:1003300082000015000000101520001100000000D0
-:00000001FF
diff --git a/firmware/adaptec/starfire_tx.bin.ihex b/firmware/adaptec/starfire_tx.bin.ihex
deleted file mode 100644
index 6b1fae0d18eb..000000000000
--- a/firmware/adaptec/starfire_tx.bin.ihex
+++ /dev/null
@@ -1,53 +0,0 @@
-:10000000010003DC00000000040004210000008661
-:10001000800000150000180E8100001500006664C5
-:100020001A0040AB00000B06142000110000000075
-:10003000142040220000AAAA14204022000003003D
-:1000400014204022000000001A0040AB00000B14F6
-:1000500014200011000000008300001500000002C1
-:10006000040000210000000000000010000000005B
-:1000700004000421000000870000001000000000C0
-:1000800000000010000000000000801500000000CB
-:100090000000003E00000000000000100000000012
-:1000A0008200001500004000009E8050000000000B
-:1000B000030080150000000086008015000000008D
-:1000C00082000015000080000100001C00000000FC
-:1000D000000050A00000010C4E20D011000060086C
-:1000E0001420D012000040080000F09000007000C2
-:1000F0000000C8B0000030000000404000000000D8
-:10010000001080150000000000A2C1500000400057
-:1001100000A400B000000014000000200000000057
-:100120002500400D0000252500047220000031004C
-:10013000009340700000000000000020000000005C
-:1001400000924460000001842B20C01100000000D8
-:100150000000C42000000540360140180000422D78
-:100160001420001100000000009244600000018390
-:100170003200001F0000003402AC00150000000235
-:1001800000A601100000000842200011000000003D
-:1001900000924060000001030000001E000000000B
-:1001A00000000020000001000000001E0000000010
-:1001B00000924460000000860000408000000000C3
-:1001C0000092C0700000000000924060000001003A
-:1001D0000000C8900000500000A6C1100000000000
-:1001E00000B0C09000000012021C001500000000CA
-:1001F0003200001F0000003400924460000005102F
-:100200004421001100000000420000110000000025
-:1002100083000015000000400092446000000508C3
-:100220004501401800004545008080500000000056
-:10023000622080120000000082000015000008000B
-:100240001520001100000000000000100000000058
-:10025000000000100000000000000010000000007E
-:10026000000000100000000000000010000000006E
-:10027000800000150000EEA4810000150000005F62
-:1002800000000060000000000000412000000000AD
-:1002900000004A000000400000924460000001900D
-:1002A0005601401A000059561400001100000000C9
-:1002B0000093405000000018009300500000001808
-:1002C0003601403A0000002D000643A9000000005E
-:1002D0000000C420000001405601401A0000595699
-:1002E00014000011000000000000001000000000D9
-:1002F0000000001000000000000642A900000000FD
-:1003000000024420000001835601401A00005956A3
-:1003100082000015000020001520001100000000E0
-:1003200082000015000000101520001100000000E0
-:1003300082000015000000101520001100000000D0
-:00000001FF
diff --git a/firmware/advansys/3550.bin.ihex b/firmware/advansys/3550.bin.ihex
deleted file mode 100644
index 6809b0d84e4f..000000000000
--- a/firmware/advansys/3550.bin.ihex
+++ /dev/null
@@ -1,317 +0,0 @@
-:10000000DD2DD504000000F200F0001618E400FC1D
-:10001000010048E4BE18188003F6020000FAFFFF52
-:10002000280E9EE7FF0082E700EA00F601E609E7F6
-:1000300055F001F601FA08000300040018F410005E
-:1000400000EC85F0BC00D5F08E0C385400E61EF0B4
-:1000500086F0B4009857D0010C1C3E1C0C00BB006D
-:10006000AA18028032F001FC880CC6120213184054
-:10007000005701EA3C006C016E0104123E570080FB
-:1000800003E6B600C00001013E01DA0F221008129B
-:10009000024AB95403581B8030E44BE4200032007C
-:1000A0003E00800024013C0168016A017001720178
-:1000B000740176017801620A920C2C102E1006133E
-:1000C0004C1CBB553C5604804AE402EE5BF0B1F098
-:1000D00003F706F703FC0F004000BE000001B00864
-:1000E00030136415321C381C4E1C10440248004C5E
-:1000F00004EA5DF004F602FC0500340036009800C6
-:10010000CC0020014E014E0B1E0E0C100A120413DF
-:100110004013301C004EBD56068300DC05F009F08C
-:1001200059F0A7F0B8F00EF70600190033009B0055
-:10013000A400B500BA00D000E100E700DE03560AD3
-:10014000140E021004100A1036100A131213521360
-:1001500010151415AC16201C341C361C08443844E9
-:1001600091440A454846014868548355B0570158A0
-:10017000835905E60BF00CF05CF04BF404F805F83D
-:1001800002FA03FA04FC05FC07000A000D001C003B
-:100190009E00A800AA00B900E00022012601790112
-:1001A0007A01C001C2017C025A03EA04E807680828
-:1001B0006908BA08E909060B3A0E00101A10ED108A
-:1001C000F11006120C1316131E1382134214D614C8
-:1001D0008A15C617D2176B18121C461C9C32004099
-:1001E0000E47484741488948804C00544455E555DE
-:1001F00014567757BF57405C0680089003A1FE9CB9
-:10020000F02902FEB80CFF100000D0FECC1800CF81
-:10021000FE8001FF030000FE9315FE0F05FF38006E
-:1002200000FE572400FE48004FFF04000010FF09A5
-:100230000000FF080101FF08FFFFFF270000FF107B
-:10024000FFFFFF0F0000FE7856FE3412FF21000072
-:10025000FE04F7CF2A670B01FECE0EFE04F7CF6730
-:100260000B3C2AFE3DF0FE0202FE20F09CFE91F0C7
-:10027000FEF001FE90F0FEF001FE8FF09C05513B78
-:1002800002FED40C01FE440DFEDD12FEFC10FE2821
-:100290001C05FEA600FED3124718FEA600B5FE48B8
-:1002A000F0FE8602FE49F0FEA002FE4AF0FEBE020B
-:1002B000FE46F0FE5002FE47F0FE5602FE43F0FE00
-:1002C0004402FE44F0FE4802FE45F0FE4C02170BCD
-:1002D000A0170618960229FE001CDEFE021CDDFE99
-:1002E0001E1CFEE91001FE2017FEE710FE06FCC7EB
-:1002F0000A6B019E0229144D379701FE640F0A6BA9
-:100300000182FEBD100A6B0182FEAD10FE161CFEBE
-:10031000581C170618962A2529FE3DF0FE020221D8
-:10032000FE9402FE5A1CEAFE141C14FE300037979D
-:1003300001FE540F1706189602D01E20071034FE37
-:10034000691017061896FE04EC20463D1220FE05A3
-:10035000F6C701FE5216094A4C35112D3C8A01E6BA
-:1003600002290A40010E07005D016FFE1810FE41D0
-:10037000580A99010EFEC85464FE0C0301E60229D6
-:100380002A46FE02E827F8FE9E43F7FE27F0FEDC31
-:1003900001FE074BFE20F09CFE401C25D2FE26F0FD
-:1003A000FE5603FEA0F0FE4403FE11F09CFEEF108B
-:1003B000FE9FF0FE6403EB0FFE1100025A2AFE4876
-:1003C0001CEB09041DFE1813231E98AC12980A405A
-:1003D000010EAC7501FEBC1511CA25D2FE01F0D28A
-:1003E000FE82F0FE9203EC11FEE40065FEA40325FC
-:1003F000321FFEB4030143FE06F0FEC4038D81FEEE
-:100400000AF0FE7A060222056B2816FEF604142C6A
-:1004100001338FFE660202D1EB2A671AFE671BF8D2
-:10042000F7FE481C70016E870A40010E070016D3C4
-:100430000ACA010E7460597627056B28FE10121443
-:100440002C01338FFE660202D1BC7DBD7F25226563
-:10045000FE3C041FFE380468FEA000FE9B57FE4EC3
-:10046000122BFF02001001081FFEE0042B01081FE1
-:1004700022302ED5FE4C44FE4C1260FE4448132C14
-:10048000FE4C5464D3467627FAEFFE621309041D2E
-:10049000FE2A132F077EA5FE2010132CFE4C546459
-:1004A000D3FAEF8609041DFE08132F077E6E090498
-:1004B0001DFE1C1214920904063B14C401338FFE66
-:1004C000700C02222B11FEE600FE1C90F903149220
-:1004D00001330229FE425B671AFE4659F8F7FE8790
-:1004E00080FE31E44F09040BFE7813FE2080071ACA
-:1004F000FE7012490406FE601305FEA2002816FED7
-:100500008005FE31E46A49040BFE4A1305FEA00093
-:1005100028FE42125E01082532F1010826FE9805E8
-:1005200011FEE3002349FE4AF0FE6A05FE49F0FE93
-:1005300064058324FE2100A124FE2200A0244CFE99
-:100540000948010826FE9805FEE2084904C53B015A
-:1005500086240612CC37FE270109041DFE2212470D
-:1005600001A714920904063B14C401338FFE700CDA
-:10057000022205FE9C0028FE3E12055028FE36137E
-:100580004701A726FE08060A06490419FE02125F63
-:1005900001FEAA141FFEFE05119A014311FEE5009B
-:1005A0000550B40C5005C628FE6212053F28FE5ABD
-:1005B0001301FE141801FE6618FE4348B719136CA8
-:1005C000FF020057488B1C3D85B7694701A726FEEF
-:1005D000720649041BDF890A4D01FED8141FFE680C
-:1005E00006119A014311FEE500053FB40C3F1706C2
-:1005F00001A7EC7270016E8711FEE200010825323E
-:10060000FE0AF0FEA6068CFE5C07FE06F0FE6407FE
-:100610008D81022209040BFE2E12151A0108150005
-:1006200001081500010815000108FE99A40108152C
-:100630000002FE320861041BFE381209041B6E150D
-:10064000FE1B000108150001081500010815000136
-:100650000815060108150002D9664CFE3A555FFEE2
-:100660009A814B1DBAFE32070A1DFE096FAFFECA02
-:1006700045FE3212622C85667B01082532FE0AF0A7
-:10068000FE32078D818CFE5C070222014302FE8A46
-:1006900006151902FE8A06FE9CF7D4FE2C90FEAECB
-:1006A0009077FECA070C541855094A6A351E200770
-:1006B00010FE0E1274FE808037206327FE0610FEA7
-:1006C00083E7C4A1FE0340094A4F3501A8ADFE1FD0
-:1006D00040125801A5FE0850FE8A50FE4451FEC645
-:1006E0005183FBFE8A900C521853FE0C90FE8E90A4
-:1006F000FE4050FEC2500C39183AFE4A1009046AF6
-:10070000FE2A12FE2C90FEAE900C54185509044F90
-:100710008501A8FE1F801258FE4490FEC6900C561C
-:100720001857FBFE8A900C521853FE4090FEC29060
-:100730000C39183A0C38184E094A19352A13FE4E4E
-:100740001165FE4808FE9EF0FE5C08B116322A7361
-:10075000DDB8FE8008B9FE9E088CFE7408FE06F027
-:10076000FE7A088D8102220143FEC9101519FEC9C7
-:1007700010610406FE101261040B4509040BFE68AB
-:1007800012FE2E1C02FE240A6104064561040BFEC3
-:100790005212FE2C1CFEAAF0FE1E09FEACF0FEBE9C
-:1007A00008FE8A10AAFEF310FEADF0FECA0802FE93
-:1007B000240AABFEE710FE2BF09DE91CFE00FEFEB6
-:1007C0001C12B5FED2F09DFE76181C1A169D05CBA4
-:1007D0001C06169DB86DB96DAAABFEB110705E2BEC
-:1007E000149201330FFE3500FE01F05A0F7C025ABD
-:1007F000FE74181CFE00F8166D671B01FE440D3BCD
-:1008000001E61E2774671A026D09040B21FE060A11
-:1008100009046AFE8212090419FE66131E58ACFC14
-:10082000FE8380FEC844FE2E13FE0491FE86916373
-:1008300027FE4059FEC15977D7055431550C7B1816
-:100840007CBE54BF5501A8AD63271258C038C14EB5
-:1008500079566857F4F5FE04FA38FE05FA4E01A5FC
-:10086000A2230C7B0C7C79566857FE1210090419E0
-:1008700016D77939683A0904FEF700350552315325
-:10088000FE1058FE9158FE1459FE9559026D090448
-:100890001916D70904FEF70035FE3A55FE19815F97
-:1008A000FE1090FE9290FED7102F079B16FEC608F2
-:1008B000119B09040BFE14130539313A77FEC60863
-:1008C000FE0C58FE8D58026D2347FE1980DE090488
-:1008D0000BFE1A12FE6C19FE1941E9B5FED1F0D9D2
-:1008E000147A01330FFE4400FE8E10FE6C19BE39DF
-:1008F000FEED19BF3AFE0C51FE8E51E91CFE00FFC1
-:1009000034FE7410B5FED2F0FEB20AFE76181C1A40
-:100910008405CB1C06FE08130FFE1600025AFED1FA
-:10092000F0FEC40A147A01330FFE1700FE4210FED7
-:10093000CEF0FECA0AFE3C10FECDF0FED60A0FFE37
-:100940002200025AFECBF0FEE20A0FFE2400025AF9
-:10095000FED0F0FEEC0A0F93DCFECFF0FEF60A0F9D
-:100960004CFE1010FECCF0D96104193B0FFE1200B2
-:100970002A13FE4E1165FE0C0BFE9EF0FE200BB1FD
-:1009800016322A73DDB822B9222AEC65FE2C0B251B
-:10099000328CFE480B8D81B8D4B9D402220143FEBB
-:1009A000DB1011FEE800AAAB70BC7DBD7FFE89F0B4
-:1009B00022302ED8BC7DBD7F01081F22302ED6B13B
-:1009C000450FFE4200025A7806FE814916FE380C99
-:1009D00009040BFE44130F004B0BFE54124BFE2870
-:1009E0000021FEA60C0A40010E07005D3EFE280015
-:1009F000FEE21001E701E80A9901FE320E59112DBD
-:100A0000016F02290FFE44004B0BDF3E0BFEB410BA
-:100A100001863E0BFEAA100186FE1982FE3446A313
-:100A20003E0B0FFE4300FE9610094A0B3501E7010D
-:100A3000E859112D016F670B593C8A02FE2A030900
-:100A4000040B843E0B0F00FE5C1061041BFE581269
-:100A500009041BFE5013FE1C1CFE9DF0FE5C0CFEE8
-:100A60001C1CFE9DF0FE620C094A1B35FEA9100FEE
-:100A7000FE1500FE04E60B5F5C0FFE1300FE101077
-:100A80000FFE4700A10FFE4100A00FFE240087AA21
-:100A9000AB70056B2821D15FFE04E61BFE9D41FE75
-:100AA0001C425901DA0229EA140B3795A914FE31C8
-:100AB00000379701FE540F02D03CFE06ECC9EE3E13
-:100AC0001DFECE45343CFE06EAC9FE474B89FE7545
-:100AD000570551FE9856FE38120A42010EFE444850
-:100AE0004609041DFE1A130A40010E47FE41580A2A
-:100AF00099010EFE49548EFE2A0D02FE2A030A5168
-:100B0000FEEE14EE3E1DFECE45343CFECE47FEAD5D
-:100B10001302291E200710FE9E1223124D1294125A
-:100B2000CE1E2D47372DB1E0FEBCF0FEEC0D1306B6
-:100B3000124D01FEE21505FE380131FE3A0177FE45
-:100B4000F00DFE02ECCE62005DFE04EC2046FE05D8
-:100B5000F6FE340101FE5216FBFE48F40DFE18139A
-:100B6000AFFE02EACE627AFEC513141B3795A95C6C
-:100B700005FE38011CFEF0FF0CFE600105FE3A0187
-:100B80000CFE62013D12202406122D112D8A13063F
-:100B90000323031E4DFEF7121E94AC1294077AFE37
-:100BA0007113FE241C141A3795A9FED910B6FE0342
-:100BB000DCFE7357FE805D03B6FE03DCFE5B57FE72
-:100BC000805D03FE0357B623FE00CC03FE0357B639
-:100BD000750309044CFE2213FE1C800706FE1A133F
-:100BE000FE1E80E1FE1D80A4FE0C90FE0E13FE0E84
-:100BF00090A3FE3C90FE30F40BFE3C50A001FE8220
-:100C0000162F072DE001FEBC1509041D4501E70163
-:100C1000E811FEE90009044CFE2C1301FE1416FE37
-:100C20001E1CFE1490FE96900CFE640118FE6601D8
-:100C300009044FFE1212FE038074FE01EC20FE80B8
-:100C4000401220632711C8591E20ED762003FE08AC
-:100C50001C05FEAC00FE065805FEAE00FE0758055A
-:100C6000FEB000FE085805FEB200FE0958FE0A1C40
-:100C7000246912C9230C500C3F1340485F171DFE16
-:100C8000904DFE915421FE080F3E10134248174C20
-:100C9000FE904DFE915421FE1E0F24101220782C40
-:100CA000461E20ED762011C8F6FED6F0FE320FEA81
-:100CB00070FE141CFE101CFE181C033CFE0C14EEEF
-:100CC000FE07E61DFECE47FEF513030186782C468F
-:100CD000FAEFFE42132F072DFE34130A42010EB025
-:100CE000FE3612F0FE454801E3FE00CCB0FEF313E1
-:100CF0003D750710A30A80010EFE805C016FFE0E99
-:100D000010077E45F6FED6F0FE6C0F03FE445874C5
-:100D1000FE01EC97FE9E40FE9DE700FE9CE71B76E1
-:100D20002701DAFEDD102ABC7DBD7F302ED5071BE2
-:100D3000FE4812070BFE5612071AFE301207C216A3
-:100D4000FE3E1107FE230016FE4A11070616FEA8F6
-:100D5000110719FE12120700162214C201339F2B2D
-:100D600001088C43032BFE62080ACA01FE320E11F1
-:100D70007E02292B2F079BFED9137939683A77FE1B
-:100D8000FC1009046AFE7212C038C14EF4F58EFEE2
-:100D9000C6101E58FE2613057B317C77FE820C0C94
-:100DA000541855230C7B0C7C01A82469731258013C
-:100DB000A5C038C14EFE0455FEA555FE04FA38FE06
-:100DC00005FA4EFE911005563157FE4056FEE1568B
-:100DD0000C56185783C038C14EF4F505523153FEF6
-:100DE0000056FEA1560C52185309046AFE1E121E2C
-:100DF00058FE1F4005543155FE2C50FEAE5005568E
-:100E00003157FE4450FEC65005523153FE0850FE85
-:100E10008A500539313AFE4050FEC250025C240629
-:100E200012CD025B2B01081F44302ED5070621444A
-:100E30002F079B215B016E1C3D164409040BE279D0
-:100E400039683AFE0A5534FE8B55BE39BF3AFE0C5E
-:100E500051FE8E51025BFE1981AFFE1941025B2BE0
-:100E6000010825321FA2302ED84B1AFEA6124B0BBA
-:100E70003B0244010825321FA2302ED6071A214416
-:100E800001081FA2302EFEE809FEC2496005FE9C43
-:100E9000002884490419349FFEBB454B00453E069B
-:100EA000783DFEDA14016E87FE4B45E22F079AE18A
-:100EB00005C62884053F28345E025BFEC05DFEF84F
-:100EC00014FE03170550B40C505E2B0108265C017C
-:100ED000FEAA14025C010825321F44302ED60706F4
-:100EE000214401FE8E13FE4258FE8214FEA4148794
-:100EF000FE4AF40B1644FE4AF406FE0C122F079A23
-:100F000085025B053FB40C3F5E2B0108265C01FEA9
-:100F1000D814025C130665FECA1226FEE01272F1B6
-:100F200001082372038FFEDC1225FEDC121FFECAAD
-:100F3000125E2B0108FED510136CFF020057488B80
-:100F40001CFEFF7FFE3056FE005C03136CFF0200A8
-:100F500057488B1C3DFE3056FE005C03136CFF02AD
-:100F60000057488B03136CFF020057488BFE0B5849
-:100F7000030A5001820A3F018203FC1C10FF030098
-:100F800054FE00F41948FE007DFE017DFE027DFE48
-:100F9000037C63270C521853BE56BF5703FE6208EA
-:100FA000FE824AFEE11AFE835A740301FE1418FE03
-:100FB00042485F608901081FFEA214302ED8010844
-:100FC0001FFEA214302EFEE80AFEC15905C628FEF7
-:100FD000CC1249041BFEC41323621BE24BC364FE04
-:100FE000E8133B130617C378DBFE7810FF02835526
-:100FF000A1FF028355621AA4BBFE30008EE4172CB9
-:101000001306FE5610620BE1BBFE64008EE40AFE7E
-:10101000640017931306FE28106206FE6013BBFEE1
-:10102000C8008EE40AFEC800174D130683BBFE906D
-:1010300001BAFE4E1489FE1210FE43F494FE56F0DF
-:10104000FE6014FE04F46CFE43F493FEF310F90109
-:10105000FE22131C3DFE1013FE0017FE4DE469BA7C
-:10106000FE9C14B769FE1C10FE0017FE4DE419BA71
-:10107000FE9C14B719836023FE4DF400DF8913062C
-:10108000FEB456FEC3580360130B03150601082671
-:10109000E5150B010826E5151A010826E572FE89FB
-:1010A000490108031506010826A6151A010826A6F7
-:1010B0001506010826A6FE8949010826A672FE89A2
-:1010C0004A01080360031ECC0706FE4413AD12CC90
-:1010D000FE49F4003B729F5EFE01ECFE2701F10128
-:1010E000082F07FEE300FE20131FFE5A152312CD22
-:1010F00001431ECD070645094A0635030A42010E83
-:10110000ED880710A40A80010E880A51019E030A87
-:1011100080010E88FE80E710071084FE455801E329
-:1011200088030A42010E880A51019E030A42010EF9
-:10113000FE8080F2FE49E410A40A80010EF20A51FA
-:1011400001820317107166FE6001FE18DFFE19DED2
-:10115000FE241CFE1DF71D90FEF61501FEFC16E098
-:10116000911D66FE2C01FE2F1903AE21FEE615FE31
-:10117000DA1017107105FE6401FE00F419FE18580C
-:1011800005FE6601FE19589119FE3C90FE30F406EA
-:10119000FE3C5066FE3800FE0F79FE1CF71990FEEB
-:1011A0004016FEB6143403AE21FE1816FE9C10172E
-:1011B0001071FE835AFE18DFFE19DEFE1DF738900F
-:1011C000FE6216FE9414FE10139138661BFEAF19D2
-:1011D000FE98E70003AE21FE5616FE6C1017107144
-:1011E000FE30BCFEB2BC91C5661BFE0F79FE1CF73B
-:1011F000C590FE9A16FE5C143403AE21FE8616FEE0
-:101200004210FE02F61071FE18FE54FE19FE55FC47
-:10121000FE1DF74F90FEC016FE3614FE1C13914FB4
-:1012200047FE8358FEAF19FE80E710FE81E71011DC
-:10123000FEDD006327036327FE124521FEB016146E
-:10124000063795A90229FE39F0FE04172303FE7E16
-:10125000181C1A5D130D037105CB1C06FEEF12FE60
-:10126000E110782C462F072DFE3C13FE8214FE421F
-:10127000133C8A0A42010EB0FE3E12F0FE454801C0
-:10128000E3FE00CCB0FEF3133D750710A30A800106
-:101290000EF2016FFE1610077E85FE4014FE24122A
-:1012A000F6FED6F0FE2417170B03FE9CE70B0FFE8D
-:1012B000150059762701DA1706033C8A094A1D35BD
-:1012C000112D016F170603FE3890FEBA9079C7689A
-:1012D000C8FE485534FEC955031E98731298030A78
-:1012E00099010EF00A40010EFE494416FEF01773F4
-:1012F00075030A42010E0710450A51019E0A40017A
-:101300000E737503FE4EE41A64FE241805FE900069
-:10131000FE3A455BFE4EE4C264FE361805FE9200BE
-:10132000FE02E61BDCFE4EE4FE0B0064FE481805E0
-:10133000FE9400FE02E619FE081005FE9600FE026D
-:10134000E62CFE4E45FE0C12AFFF046854DE1C690D
-:1013500003077AFE5AF0FE741824FE0900FE3410CA
-:10136000071BFE5AF0FE821824C3FE2610071A5DE2
-:10137000242CDC070B5D2493FE0E1007065D244D24
-:101380009FAD0314FE09000133FE04FE7D057FF9C5
-:101390000325FECA18FE14F00865FEC61803FF1ADE
-:0213A00000004B
-:00000001FF
-/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/38C0800.bin.ihex b/firmware/advansys/38C0800.bin.ihex
deleted file mode 100644
index a60b447ff74a..000000000000
--- a/firmware/advansys/38C0800.bin.ihex
+++ /dev/null
@@ -1,336 +0,0 @@
-:10000000D83F0D05000000F200F000FC001618E4D7
-:10001000010048E4188003F60200CE1900FAFFFF41
-:100020001C0F00F69EE7FF0082E700EA01FA01E6F6
-:1000300009E755F001F60300040010001EF085F0FA
-:1000400018F40800BC00385400ECD5F0820D00E62E
-:1000500086F0B1F0985701FCB400D4010C1C3E1C92
-:100060003C00BB000010BA19028032F07C0D021374
-:10007000BA131840005701EA02FC03FC3E006C0171
-:100080006E0174017601B9543E57008003E6B60054
-:10009000C00001013E017A01CA08CE1016110412F7
-:1000A0000812024ABB553C5603581B8030E44BE40F
-:1000B0005DF002FA200032004000800024013C0183
-:1000C00068016A017001720178017C01620A860D83
-:1000D00006134C1C04804AE402EE5BF003F70C00AC
-:1000E0000F004700BE00000120115C16321C381CB6
-:1000F0004E1C1044004C04EA5CF0A7F004F603FA2E
-:100100000500340036009800CC0020014E014A0B57
-:10011000420C120F0C1022110A120413301C024858
-:10012000004E42544455BD56068300DC05F009F0EC
-:1001300059F0B8F04BF406F70EF704FC05FC060086
-:10014000190033009B00A400B500BA00D000E10004
-:10015000E700E203080F021004100A100A130C1340
-:1001600012132414341404160816A417201C341C6B
-:10017000361C0844384491440A45484601486854AE
-:100180003A558355E555B0570158835905E60BF0AC
-:100190000CF004F805F807000A001C001E009E0081
-:1001A000A800AA00B900E0002201260179017E0121
-:1001B000C401C60180025E03EE049A06F8076208D5
-:1001C00068086908D608E909FA0B2E0F12101A10F0
-:1001D000ED10F1102A1106120C123E121013161314
-:1001E0001E134614761482143615CA156B18BE18E1
-:1001F000CA18E619121C461C9C3200400E47FE9C91
-:10020000F02B02FEAC0DFF100000D7FEE81900D65F
-:10021000FE8401FF030000FE9315FE0F05FF38006A
-:1002200000FE572400FE4C005BFF04000011FF0994
-:100230000000FF080101FF08FFFFFF270000FF107B
-:10024000FFFFFF110000FE7856FE3412FF21000070
-:10025000FE04F7D62C990A01FEC20FFE04F7D699C8
-:100260000A422CFE3DF0FE0602FE20F0A7FE91F0B1
-:10027000FEF401FE90F0FEF401FE8FF0A7035D4D49
-:1002800002FEC80D01FE380EFEDD12FEFC10FE2837
-:100290001C03FEA600FED3124114FEA600C2FE48B7
-:1002A000F0FE8A02FE49F0FEA402FE4AF0FEC202FF
-:1002B000FE46F0FE5402FE47F0FE5A02FE43F0FEF8
-:1002C0004802FE44F0FE4C02FE45F0FE5002180AC1
-:1002D000AA180614A1022BFE001CE7FE021CE6FE73
-:1002E0001E1CFEE91001FE1818FEE710FE06FCCEEB
-:1002F000097001A8022B155939A201FE5810097086
-:100300000187FEBD1009700187FEAD10FE161CFEB0
-:10031000581C180614A12C1C2BFE3DF0FE060223CF
-:10032000FE9802FE5A1CF8FE141C15FE300039A27D
-:1003300001FE4810180614A102D72220071135FE2D
-:100340006910180614A1FE04EC204F431320FE058B
-:10035000F6CE01FE4A1708545837122F429201FE7A
-:100360008216022B0946010E0700660173FE181063
-:10037000FE415809A4010EFEC8546BFE100301FE95
-:100380008216022B2C4FFE02E82AFEBF57FE9E4328
-:10039000FE7757FE27F0FEE001FE074BFE20F0A798
-:1003A000FE401C1CD9FE26F0FE5A03FEA0F0FE48BB
-:1003B00003FE11F0A7FEEF10FE9FF0FE6803F91098
-:1003C000FE110002652CFE481CF908051BFE1813DF
-:1003D0002122A3B713A30946010EB77801FEB41674
-:1003E00012D11CD9FE01F0D9FE82F0FE9603FA125A
-:1003F000FEE40027FEA8031C341DFEB803014BFEDB
-:1004000006F0FEC8039586FE0AF0FE8A0602240363
-:10041000702817FEFA04156D01367BFE6A0202D8B9
-:10042000F92C9919FE671BFEBF57FE7757FE481C33
-:100430007401AF8C0946010E070017DA09D1010ECD
-:100440008D5164792A037028FE1012156D01367BD8
-:10045000FE6A0202D8C781C8831C2427FE40041DFF
-:10046000FE3C043BFEA000FE9B57FE4E122DFF02F9
-:100470000010010B1DFEE4042D010B1D243331DEA1
-:10048000FE4C44FE4C1251FE44480F6FFE4C546B20
-:10049000DA4F792AFE0680FE4847FE621308051BE4
-:1004A000FE2A13320782FE5213FE20100F6FFE4CFD
-:1004B000546BDAFE0680FE4847FE401308051BFE1B
-:1004C0000813320782FE301308051BFE1C12159D0F
-:1004D0000805064D15FE0D0001367BFE640D022455
-:1004E0002D12FEE600FE1C90FE405C04159D0136B8
-:1004F000022BFE425B9919FE4659FEBF57FE775705
-:10050000FE8780FE31E45B08050AFE8413FE20802E
-:100510000719FE7C12530506FE6C1303FEA2002889
-:1005200017FE9005FE31E45A53050AFE561303FEEA
-:10053000A00028FE4E1267FF02001027FE48051C8F
-:1005400034FE8948FF02001027FE560526FEA80546
-:1005500012FEE3002153FE4AF0FE7605FE49F0FE4E
-:1005600070058825FE2100AB25FE2200AA2558FE35
-:100570000948FF02001027FE860526FEA805FEE2B8
-:10058000085305CB4D01B0250613D339FE270108CA
-:10059000051BFE22124101B2159D0805064D15FEF0
-:1005A0000D0001367BFE640D022403FE9C0028EB47
-:1005B000035C28FE36134101B226FE1806090653D5
-:1005C000051FFE02125001FE9E151DFE0E0612A50D
-:1005D000014B12FEE500035CC10C5C03CD28FE62FA
-:1005E00012034528FE5A1301FE0C1901FE7619FE6E
-:1005F0004348C4CC0F71FF02005752931E438BC473
-:100600006E4101B226FE820653051AE9910959018D
-:10061000FECC151DFE780612A5014B12FEE5000367
-:1006200045C10C45180601B2FA767401AF8C12FE72
-:10063000E20027DB1C34FE0AF0FEB60694FE6C07CF
-:10064000FE06F0FE74079586022408050AFE2E12A7
-:100650001619010B1600010B1600010B1600010BF9
-:10066000FE99A4010B160002FE420868051AFE3826
-:100670001208051AFE301316FE1B00010B160001AE
-:100680000B1600010B1600010B1606010B160002DB
-:10069000E26C58BE50FE9A81551B7AFE4207091B38
-:1006A000FE096FBAFECA45FE3212696D8B6C7F2758
-:1006B000FE54071C34FE0AF0FE4207958694FE6C39
-:1006C000070224014B02DB161F02DBFE9CF7DCFE57
-:1006D0002C90FEAE9056FEDA070C60146108545A56
-:1006E0003722200711FE0E128DFE808039206A2AE3
-:1006F000FE0610FE83E7FE4800ABFE034008545B95
-:100700003701B3B8FE1F40136201EFFE0850FE8AA6
-:1007100050FE4451FEC65188FE0890FE8A900C5E41
-:10072000145FFE0C90FE8E90FE4050FEC2500C3DB9
-:10073000143EFE4A1008055AFE2A12FE2C90FEAE08
-:10074000900C60146108055B8B01B3FE1F8013627F
-:10075000FE4490FEC6900C3F1440FE0890FE8A9026
-:100760000C5E145FFE4090FEC2900C3D143E0C2EB9
-:10077000143C210C490C6308541F372C0FFE4E11FA
-:1007800027DDFE9EF0FE7608BC17342C77E6C5FE0A
-:100790009A08C6FEB80894FE8E08FE06F0FE94087D
-:1007A00095860224014BFEC910161FFEC91068056C
-:1007B00006FE101268050A4E08050AFE9012FE2E6B
-:1007C0001C02FE180B6805064E68050AFE7A12FE2A
-:1007D0002C1CFEAAF0FED209FEACF0FE000902FEBF
-:1007E000DE09FEB7F0FEFC08FE02F61A50FE701895
-:1007F000FEF118FE4055FEE155FE1058FE9158FEE0
-:100800001459FE95591C85FE8CF0FEFC08FEACF0D8
-:10081000FEF008B5FECB10FEADF0FE0C0902FE188E
-:100820000BB6FEBF10FE2BF085F41EFE00FEFE1C74
-:1008300012C2FED2F085FE76181E19178503D21E4D
-:10084000061785C54AC64AB5B6FE891074672D15C8
-:100850009D013610FE3500FE01F06510800265FE38
-:100860009880FE19E40AFE1A1251FE1982FE6C18D5
-:10087000FE4454BEFE1981FE74188F9017FECE08F8
-:10088000024A08055AEC032E293C0C3F14409B2ECB
-:100890009C3CFE6C18FEED18FE4454FEE5543A3FB5
-:1008A0003B40034929638FFEE354FE7418FEF5189C
-:1008B0008FFEE35490C056FECE08024AFE37F0FE8B
-:1008C000DA09FE8BF0FE6009024A08050A23FEFAE7
-:1008D0000A3A493B6356FE3E0A0FFEC007419800A4
-:1008E000ADFE0159FE52F0FE0C0A8F7AFE240A3A40
-:1008F000498FFEE35457497D63FE1458FE95580214
-:100900004A3A493B63FE1459FE9559BE574957630D
-:10091000024A08055AFE821208051FFE661322626B
-:10092000B7FE03A1FE8380FEC844FE2E13FE049191
-:10093000FE86916A2AFE4059FEC15956E00360299D
-:10094000610C7F148057607D6101B3B86A2A13621D
-:100950009B2E9C3C3A3F3B4090C0FE04FA2EFE0585
-:10096000FA3C01EFFE3610210C7F0C803A3F3B40F1
-:10097000E408051F17E03A3D3B3E0805FEF7003747
-:10098000035E295FFE1058FE915857497D6302FEB1
-:10099000F40908051F17E00805FEF70037BEFE1929
-:1009A0008150FE1090FE9290FED3103207A617FEE3
-:1009B000080912A608050AFE1413033D293E56FE37
-:1009C0000809FE0C58FE8D58024A2141FE1980E7A5
-:1009D00008050AFE1A12FE6C19FE1941F4C2FED176
-:1009E000F0E2157E013610FE4400FE8E10FE6C19FA
-:1009F000573DFEED197D3EFE0C51FE8E51F41EFE5C
-:100A000000FF35FE7410C2FED2F0FEA60BFE761873
-:100A10001E198A03D21E06FE081310FE1600026578
-:100A2000FED1F0FEB80B157E013610FE1700FE4217
-:100A300010FECEF0FEBE0BFE3C10FECDF0FECA0B4B
-:100A400010FE22000265FECBF0FED60B10FE240045
-:100A50000265FED0F0FEE00B109EE5FECFF0FEEA50
-:100A60000B1058FE1010FECCF0E268051F4D10FE72
-:100A700012002C0FFE4E1127FE000CFE9EF0FE14FD
-:100A80000CBC17342C77E6C524C6242CFA27FE208C
-:100A90000C1C3494FE3C0C9586C5DCC6DC0224019B
-:100AA0004BFEDB1012FEE800B5B674C781C883FEAA
-:100AB00089F0243331E1C781C88327FE660C1D24E9
-:100AC0003331DFBC4E10FE420002657C06FE8149D8
-:100AD00017FE2C0D08050AFE44131000550AFE549B
-:100AE0001255FE280023FE9A0D0946010E070066E6
-:100AF00044FE2800FEE21001F501F609A401FE26DD
-:100B00000F64122F0173022B10FE4400550AE944B2
-:100B10000AFEB41001B0440AFEAA1001B0FE198208
-:100B2000FE3446AC440A10FE4300FE961008540AF8
-:100B30003701F501F664122F0173990A644292029B
-:100B4000FE2E0308050A8A440A1000FE5C106805A0
-:100B50001AFE581208051AFE5013FE1C1CFE9DF0CA
-:100B6000FE500DFE1C1CFE9DF0FE560D08541A375B
-:100B7000FEA91010FE1500FE04E60A50FE2E10100D
-:100B8000FE1300FE1010106FAB10FE4100AA10FE05
-:100B900024008CB5B67403702823D850FE04E61ADE
-:100BA000FE9D41FE1C426401E3022BF8150A39A0A8
-:100BB000B415FE310039A201FE481002D742FE06EC
-:100BC000ECD0FC441BFECE453542FE06EAD0FE4783
-:100BD0004B91FE7557035DFE9856FE381209480189
-:100BE0000EFE44484F08051BFE1A130946010E412C
-:100BF000FE415809A4010EFE495496FE1E0E02FE47
-:100C00002E03095DFEEE14FC441BFECE453542FE6C
-:100C1000CE47FEAD13022B22200711FE9E12211398
-:100C200059139F13D5222F41392FBCADFEBCF0FEC6
-:100C3000E00E0F06135901FEDA1603FE380129FEF5
-:100C40003A0156FEE40EFE02ECD5690066FE04ECA5
-:100C5000204FFE05F6FE340101FE4A17FE0890FE05
-:100C600048F40DFE1813BAFE02EAD5697EFEC513DC
-:100C7000151A39A0B4FE2E1003FE38011EFEF0FF37
-:100C80000CFE600103FE3A010CFE620143132025B5
-:100C900006132F122F920F060421042259FEF71279
-:100CA000229FB7139F077EFE7113FE241C1519396E
-:100CB000A0B4FED910C3FE03DCFE7357FE805D04B2
-:100CC000C3FE03DCFE5B57FE805D04FE0357C321B9
-:100CD000FE00CC04FE0357C37804080558FE221317
-:100CE000FE1C800706FE1A13FE1E80EDFE1D80AE60
-:100CF000FE0C90FE0E13FE0E90ACFE3C90FE30F407
-:100D00000AFE3C50AA01FE7A1732072FAD01FEB44D
-:100D10001608051B4E01F501F612FEE900080558FC
-:100D2000FE2C1301FE0C17FE1E1CFE1490FE969066
-:100D30000CFE640114FE660108055BFE1212FE0340
-:100D4000808DFE01EC20FE804013206A2A12CF64C1
-:100D50002220FB792004FE081C03FEAC00FE06588E
-:100D600003FEAE00FE075803FEB000FE085803FE67
-:100D7000B200FE0958FE0A1C256E13D0210C5C0C33
-:100D8000450F465250181BFE904DFE915423FEFC19
-:100D90000F44110F48521858FE904DFE915423E411
-:100DA000251113207C6F4F2220FB792012CFFE14D7
-:100DB00056FED6F0FE2610F874FE141CFE101CFE23
-:100DC000181C0442FE0C14FCFE07E61BFECE47FE78
-:100DD000F5130401B07C6F4FFE0680FE4847FE42CB
-:100DE0001332072FFE34130948010EBBFE3612FEE4
-:100DF0004148FE454801F0FE00CCBBFEF3134378AA
-:100E00000711AC0984010EFE805C0173FE0E100711
-:100E1000824EFE1456FED6F0FE601004FE44588D3D
-:100E2000FE01ECA2FE9E40FE9DE700FE9CE71A79C3
-:100E30002A01E3FEDD102CC781C8833331DE071A97
-:100E4000FE4812070AFE56120719FE301207C9178C
-:100E5000FE321207FE230017EB070617FE9C12074F
-:100E60001FFE12120700172415C90136A92D010B08
-:100E7000944B042DDD09D101FE260F1282022B2D89
-:100E80003207A6FED9133A3D3B3E56FEF011080547
-:100E90005AFE72129B2E9C3C90C096FEBA112262A2
-:100EA000FE2613037F298056FE760D0C6014612107
-:100EB0000C7F0C8001B3256E77136201EF9B2E9C93
-:100EC0003CFE0455FEA555FE04FA2EFE05FA3CFE36
-:100ED0009110033F2940FE4056FEE1560C3F14405E
-:100EE000889B2E9C3C90C0035E295FFE0056FEA1AD
-:100EF000560C5E145F08055AFE1E122262FE1F4049
-:100F000003602961FE2C50FEAE50033F2940FE4491
-:100F100050FEC650035E295FFE0850FE8A50033D16
-:100F2000293EFE4050FEC2500289250613D40272AB
-:100F30002D010B1D4C3331DE0706234C3207A6234F
-:100F40007201AF1E43174C08050AEE3A3D3B3EFEC8
-:100F50000A5535FE8B55573D7D3EFE0C51FE8E5198
-:100F60000272FE1981BAFE194102722D010B1C3466
-:100F70001DE83331E15519FEA612550A4D024C0108
-:100F80000B1C341DE83331DF0719234C010B1DE81E
-:100F90003331FEE809FEC2495103FE9C00288A5302
-:100FA000051F35A9FEBB4555004E44067C43FEDABD
-:100FB0001401AF8CFE4B45EE3207A5ED03CD288A18
-:100FC00003452835670272FEC05DFEF814FE031764
-:100FD000035CC10C5C672D010B268901FE9E150286
-:100FE00089010B1C341D4C3331DF0706234C01F102
-:100FF000FE4258F1FEA4148CFE4AF40A174CFE4A35
-:10100000F406EA3207A58B02720345C10C45672D31
-:10101000010B268901FECC1502890F0627FEBE139F
-:1010200026FED41376FE8948010B2176047BFED080
-:10103000131CFED0131DFEBE13672D010BFED51031
-:101040000F71FF02005752931EFEFF7FFE3056FEC7
-:10105000005C040F71FF02005752931E43FE30568E
-:10106000FE005C040F71FF0200575293040F71FFE2
-:101070000200575293FE0B5804095C018709450191
-:101080008704FE03A11E11FF030054FE00F41F524B
-:10109000FE007DFE017DFE027DFE037C6A2A0C5E61
-:1010A000145F573F7D4004DDFE824AFEE11AFE8355
-:1010B0005A8D0401FE0C19FE4248505191010B1D3E
-:1010C000FE96153331E1010B1DFE96153331FEE816
-:1010D0000AFEC15903CD28FECC1253051AFEC413D3
-:1010E00021691AEE55CA6BFEDC144D0F0618CA7C36
-:1010F00030FE7810FF028355ABFF0283556919AEAD
-:1011000098FE300096F2186D0F06FE5610690AED33
-:1011100098FE640096F209FE6400189E0F06FE28F1
-:10112000106906FE601398FEC80096F209FEC8001A
-:1011300018590F068898FE90017AFE421591E4FE38
-:1011400043F49FFE56F0FE5415FE04F471FE43F482
-:101150009EFEF310FE405C01FE16141E43ECFE00E2
-:1011600017FE4DE46E7AFE9015C46EFE1C10FE0054
-:1011700017FE4DE4CC7AFE9015C4CC885121FE4D6B
-:10118000F400E9910F06FEB456FEC35804510F0A4D
-:10119000041606010B26F3160A010B26F316190195
-:1011A0000B26F376FE8949010B041606010B26B1C6
-:1011B0001619010B26B11606010B26B1FE8949014D
-:1011C0000B26B176FE894A010B04510422D307068F
-:1011D000FE4813B813D3FE49F4004D76A967FE010B
-:1011E000ECFE2701FE8948FF02001027FE2E163272
-:1011F00007FEE300FE20131DFE52162113D4014BFF
-:1012000022D407064E08540637040948010EFB8E07
-:101210000711AE0984010E8E095D01A8040984013D
-:101220000E8EFE80E71107118AFE455801F08E04EC
-:101230000948010E8E095D01A8040948010EFE80CF
-:1012400080FE804CFE49E411AE0984010EFE804C04
-:10125000095D0187041811756CFE6001FE18DFFE40
-:1012600019DEFE241CFE1DF71B97FEEE1601FEF490
-:1012700017AD9A1B6CFE2C01FE2F1904B923FEDE5C
-:1012800016FEDA1018117503FE6401FE00F41FFE4D
-:10129000185803FE6601FE19589A1FFE3C90FE3056
-:1012A000F406FE3C506CFE3800FE0F79FE1CF71F62
-:1012B00097FE3817FEB6143504B923FE1017FE9CAE
-:1012C00010181175FE835AFE18DFFE19DEFE1DF799
-:1012D0002E97FE5A17FE9414EC9A2E6C1AFEAF1934
-:1012E000FE98E70004B923FE4E17FE6C1018117526
-:1012F000FE30BCFEB2BC9ACB6C1AFE0F79FE1CF716
-:10130000CB97FE9217FE5C143504B923FE7E17FEC0
-:101310004210FE02F61175FE18FE60FE19FE61FE17
-:1013200003A1FE1DF75B97FEB817FE3614FE1C13D3
-:101330009A5B41FE8358FEAF19FE80E711FE81E7FC
-:101340001112FEDD006A2A046A2AFE124523FEA855
-:1013500017150639A0B4022BFE39F0FEFC17210444
-:10136000FE7E181E19660F0D047503D21E06FEEFD1
-:1013700012FEE1107C6F4F32072FFE3C13F1FE424C
-:101380001342920948010EBBEBFE4148FE4548015D
-:10139000F0FE00CCBBFEF31343780711AC098401C7
-:1013A0000EFE804C0173FE161007828BFE4014FE69
-:1013B0002412FE1456FED6F0FE1C18180A04FE9CD9
-:1013C000E70A10FE150064792A01E3180604429228
-:1013D00008541B37122F0173180604FE3890FEBA0A
-:1013E000903ACE3BCFFE485535FEC9550422A3772F
-:1013F00013A30409A4010EFE41480946010EFE494B
-:101400004417FEE8187778040948010E07114E09C1
-:101410005D01A80946010E777804FE4EE4196BFEC3
-:101420001C1903FE9000FE3A45FE2C10FE4EE4C946
-:101430006BFE2E1903FE9200FE02E61AE5FE4EE454
-:10144000FE0B006BFE401903FE9400FE02E61FFE39
-:10145000081003FE9600FE02E66DFE4E45EABAFF56
-:10146000046854E71E6EFE081CFE6719FE0A1CFE87
-:101470001AF4FE0004EAFE48F4197AFE74190F19F2
-:1014800004077EFE5AF0FE841925FE0900FE341082
-:10149000071AFE5AF0FE921925CAFE261007196691
-:1014A000256DE5070A66259EFE0E1007066625597E
-:1014B000A9B80415FE09000136FE04FE810383FE6F
-:1014C000405C041CF7FE14F00B27FED6191CF77BBA
-:0C14D000F7FE82F0FEDA1904FFCC0000E9
-:00000001FF
-/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/38C1600.bin.ihex b/firmware/advansys/38C1600.bin.ihex
deleted file mode 100644
index 18c7c4862046..000000000000
--- a/firmware/advansys/38C1600.bin.ihex
+++ /dev/null
@@ -1,398 +0,0 @@
-:1000000077EF0406000000F2001600FC001000F07C
-:1000100018E40100041E48E403F6F7132E1E020044
-:100020000717C05F00FAFFFF040000F609E782E748
-:1000300085F086F04E109EE7FF0055F001F60300B4
-:10004000985701E600EA00EC01FA18F40800F01DE8
-:10005000385432F01000C20E1EF0D5F0BC004BE454
-:1000600000E6B1F0B40002133E1CC8473E00D801C0
-:1000700006130C1C5E1E0057C85701FCBC0EA212D2
-:10008000B9540080620A5A12C8153E1E1840BD5667
-:1000900003E601EA5CF00F0020006C016E0104121F
-:1000A0000413BB553C563E5703584AE44000B60083
-:1000B000BB00C000000101013E01580A44100A12B1
-:1000C0004C1C4E1C024A30E405E60C003C0080004B
-:1000D00024013C0168016A0170017201740176011A
-:1000E00078017C01C60E0C10AC12AE12161A321C2E
-:1000F0006E1E02483A55C95702EE5BF003F706F749
-:1001000003FC06001E00BE00E1000C12181A701A53
-:10011000301C381C1044004CB057405C4DE404EADD
-:100120005DF0A7F004F602FC05000900190032009A
-:1001300033003400360098009E00CC0020014E01B0
-:1001400079013C09680D021004103A1008120A13D4
-:100150004016501600174A19004E0054015800DC92
-:1001600005F009F059F0B8F048F40EF70A009B00CA
-:100170009C00A400B500BA00D000E700F0036908B5
-:10018000E9095C0CB612BC19D81B201C341C361CA7
-:10019000421D0844384491440A45484689486854F9
-:1001A0008355835931E402E607F008F00BF00CF0B8
-:1001B0004BF404F805F802FA03FA04FC05FC070006
-:1001C000A800AA00B900E000E500220126016001B4
-:1001D0007A018201C801CA0186026A031805B207C2
-:1001E0006808100D06100A100E1012106010ED10A5
-:1001F000F310061210121E120C130E131013FE9C95
-:10020000F03505FEEC0EFF100000E9FE341F00E89B
-:10021000FE8801FF030000FE9315FE0F05FF380066
-:1002200000FE572400FE4C0065FF0400001AFF0981
-:100230000000FF080101FF08FFFFFF270000FF107B
-:10024000FFFFFF130000FE7856FE3412FF2100006E
-:10025000FE04F7E8377D0D01FE4A11FE04F7E87D44
-:100260000D5137FE3DF0FE0C02FE20F0BCFE91F079
-:10027000FEF801FE90F0FEF801FE8FF0BC03674D22
-:1002800005FE080F01FE780FFEDD1205FE0E03FECF
-:10029000281C03FEA600FED1123E22FEA600ACFEE4
-:1002A00048F0FE9002FE49F0FEAA02FE4AF0FEC8A7
-:1002B00002FE46F0FE5A02FE47F0FE6002FE43F0E8
-:1002C000FE4E02FE44F0FE5202FE45F0FE56021CB7
-:1002D0000DA21C0722B70535FE001CFEF110FE0220
-:1002E0001CF5FE1E1CFEE910015FFEE710FE06FC79
-:1002F000DE0A8101A305351F9547B801FEE4110A06
-:1003000081015CFEBD100A81015CFEAD10FE161C71
-:10031000FE581C1C0722B7372A35FE3DF0FE0C02A2
-:100320002BFE9E02FE5A1CFE121CFE141C1FFE30E9
-:100330000047B801FED4111C0722B705E9212C099A
-:100340001A31FE69101C0722B7FE04EC2C6001FE76
-:100350001E1E202CFE05F6DE01FE621B010C614A0A
-:100360004415565101FE9E1E01FE961A05350A5788
-:1003700001180900360185FE1810FE41580ABA011D
-:1003800018FEC8547BFE1C0301FE961A0535376023
-:10039000FE02E830FEBF57FE9E43FE7757FE27F071
-:1003A000FEE401FE074BFE20F0BCFE401C2AEBFEE3
-:1003B00026F0FE6603FEA0F0FE5403FE11F0BCFE24
-:1003C000EF10FE9FF0FE7403FE461C19FE1100059F
-:1003D0007037FE481CFE461C010C0628FE1813262A
-:1003E00021B9C720B90A570118C78901FEC81A15D3
-:1003F000E12AEBFE01F0EBFE82F0FEA403FE9C324C
-:1004000015FEE4002FFEB6032A3C16FEC60301418A
-:10041000FE06F0FED603AFA0FE0AF0FEA2070529F5
-:1004200003811E1BFE24051F6301428FFE7002051F
-:10043000EAFE461C377D1DFE671BFEBF57FE775741
-:10044000FE481C7501A6860A57011809001BEC0A14
-:10045000E101187750408D3003811EF81F6301427F
-:100460008FFE700205EAD799D89C2A292FFE4E04E8
-:1004700016FE4A047EFEA000FE9B57FE541232FF79
-:10048000020010010816FE02053201081629272570
-:10049000EEFE4C44FE581250FE44481334FE4C54B9
-:1004A0007BEC608D3001FE4E1EFE4847FE7C130142
-:1004B0000C0628FE32130143099BFE6813FE26102A
-:1004C0001334FE4C547BEC01FE4E1EFE4847FE5496
-:1004D00013010C0628A50143099BFE4013010C06DD
-:1004E00028F91F7F010C06074D1FFE0D0001428FEA
-:1004F000FEA40E05293215FEE6000FFE1C9004FE38
-:100500009C933A0B0E8B021F7F01420535FE425B26
-:100510007D1DFE4659FEBF57FE77570FFE878004AC
-:10052000FE8783FEC9470B0ED065010C060DFE98B1
-:10053000130FFE208004FEA083330B0E091DFE84E2
-:100540001201380607FE701303FEA2001E1BFEDA1E
-:1005500005D0540138060DFE581303FEA0001EFE00
-:1005600050125EFF0200102FFE90052A3CCCFF02C5
-:1005700000102FFE9E0517FEF40515FEE300260170
-:1005800038FE4AF0FEC005FE49F0FEBA05712EFEA7
-:100590002100F12EFE2200A22E4AFE0948FF020091
-:1005A000102FFED00517FEF405FEE208013806FE06
-:1005B0001C004D01A72E0720E447FE2701010C0671
-:1005C00028FE24123E01841F7F010C06074D1FFEEA
-:1005D0000D0001428FFEA40E052903E61EFECA137C
-:1005E00003B61EFE401203661EFE38133E0184173A
-:1005F000FE72060A0701380624FE02124F01FE565B
-:100600001916FE68061582014115E203668A106616
-:10061000039A1EFE701203551EFE681301C60912CE
-:1006200048FE92062E1201FEAC1DFE434862801366
-:1006300058FF02005752AD233F4E62493E018417D6
-:10064000FEEA0601380612F7450A9501FE841916DE
-:10065000FEE0061582014115E203558A10551C077C
-:100660000184FEAE10036F1EFE9E133E0184039AAA
-:100670001EFE1A1201380612FC01C601FEAC1DFE58
-:1006800043486280F0450A9503B61EF801380624F7
-:1006900036FE02F60771788C004D62493E2D934E6E
-:1006A000D00D17FE9A0701FEC01916FE90072620EE
-:1006B0009E1582014115E2219E0907FB03E6FE58C3
-:1006C0005710E605FE2A06036F8A106F1C07018487
-:1006D000FE9C325F7501A68615FEE2002FED2A3CD6
-:1006E000FE0AF0FECE07AEFE9608FE06F0FE9E085D
-:1006F000AFA00529010C060DFE2E12141D010814D1
-:100700000001081400010814000108FE99A4010862
-:10071000140005FEC60901760612FE3A12010C0607
-:1007200012FE301314FE1B0001081400010814000F
-:1007300001081400010814070108140005EF7C4AA1
-:10074000784F0FFE9A8104FE9A83FECB470B0E2D45
-:100750002848FE6C080A28FE096FCAFECA45FE3208
-:100760001253634E7C972FFE7E082A3CFE0AF0FE51
-:100770006C08AFA0AEFE96080529014105ED1424D2
-:1007800005EDFE9CF79F01FEAE1EFE185801FEBE51
-:100790001EFE9958FE7818FEF9188EFE1609106A8A
-:1007A000226B010C615444212C091AF87701FE7E5A
-:1007B0001E472C7A30F0FE83E7FE3F0071FE0340B7
-:1007C000010C61654401C2C8FE1F40206E01FE6A33
-:1007D00016FE0850FE8A50FE4451FEC651FE10100F
-:1007E00001FECE1E01FEDE1E1068226901FEEE1E15
-:1007F00001FEFE1EFE4050FEC250104B224CFE8AEF
-:1008000010010C0654FE501201FEAE1E01FEBE1E6B
-:10081000106A226B010C06654E01C20FFE1F800498
-:10082000FE9F83330B0E206E0FFE449004FEC49394
-:100830003A0BFEC69004FEC693790B0E106C226D27
-:1008400001FECE1E01FEDE1E106822690FFE4090E2
-:1008500004FEC0933A0BFEC29004FEC293790B0EC5
-:10086000104B224C10642234010C6124443713FED7
-:100870004E112FFEDE09FE9EF0FEF209FE01481B1E
-:100880003C3788F5D4FE1E0AD5FE420AD2FE1E0A67
-:10089000D3FE420AAEFE120AFE06F0FE180AAFA010
-:1008A00005290141FEC1101424FEC110017606077E
-:1008B000FE14120176060D5D010C060DFE7412FE8B
-:1008C0002E1C05FE1A0C017606075D0176060D4109
-:1008D000FE2C1CFEAAF0FECE0AFEACF0FE660AFE5E
-:1008E0009210C4F6FEADF0FE720A05FE1A0CC5FEAB
-:1008F000E710FE2BF0BFFE6B1823FE00FEFE1C125D
-:10090000ACFED2F0BFFE7618231D1BBF03E3230706
-:100910001BBFD45BD55BD25BD35BC4C5FEA910758E
-:100920005E321F7F014219FE3500FE01F0701998FA
-:100930000570FE741823FE00F81B5B7D1201FE7823
-:100940000F4D01FE961A2130777D1D055B010C06C7
-:100950000D2BFEE20B010C0654FEA612010C062420
-:10096000FE8813216EC701FE1E1F0FFE838004FE4A
-:100970008383FEC9470B0EFEC844FE42130FFE04DC
-:100980009104FE8493FECA570BFE869104FE869363
-:10099000FECB570B0E7A30FE4059FEC1598E4003F4
-:1009A0006A3B6B10972298D96ADA6B01C2C87A3019
-:1009B000206EDB64DC34916C7E6DFE4455FEE555A3
-:1009C000FE04FA64FE05FA3401FE6A16A3261097A7
-:1009D0001098916C7E6DFE1410010C06241B409142
-:1009E0004B7E4C010C06FEF7004403683B69FE1089
-:1009F00058FE9158FE1459FE9559055B010C0624CA
-:100A00001B40010C06FEF700447801FE8E1E4F0FBE
-:100A1000FE109004FE90933A0BFE929004FE929387
-:100A2000790B0EFEBD10014309BB1BFE6E0A15BB00
-:100A3000010C060DFE1413034B3B4C8EFE6E0AFE9A
-:100A40000C58FE8D58055B263E0FFE198004FE995A
-:100A500083330B0EFEE510010C060DFE1A12FE6C20
-:100A600019FE1941FE6B18ACFED1F0EF1F92014246
-:100A700019FE4400FE9010FE6C19D94BFEED19DAF8
-:100A80004CFE0C51FE8E51FE6B1823FE00FF31FE12
-:100A90007610ACFED2F0FEBA0CFE7618231D5D0374
-:100AA000E32307FE081319FE16000570FED1F0FEC1
-:100AB000CC0C1F92014219FE17005CFECEF0FED254
-:100AC0000CFE3E10FECDF0FEDE0C19FE220005707D
-:100AD000FECBF0FEEA0C19FE24000570FED0F0FEFD
-:100AE000F40C1994FE1C10FECFF0FEFE0C194AF314
-:100AF000FECCF0EF017606244D19FE12003713FEEE
-:100B00004E112FFE160DFE9EF0FE2A0DFE01481B13
-:100B10003C3788F5D429D529D229D32937FE9C32F0
-:100B20002FFE3E0D2A3CAEFE620DAFA0D49FD59F96
-:100B3000D29FD39F05290141FED31015FEE800C4C2
-:100B4000C575D799D89CFE89F0292725BED799D895
-:100B50009C2FFE8C0D16292725BDFE0148A419FEE9
-:100B6000420005709007FE81491BFE640E010C06D1
-:100B70000DFE441319002D0DFE54122DFE28002BDE
-:100B8000FEDA0E0A57011809003646FE2800FEFA62
-:100B90001001FEF41C01FE001D0ABA01FE581040AF
-:100BA00015560185053519FE44002D0DF7460DFE3D
-:100BB000CC1001A7460DFEC21001A70FFE1982043A
-:100BC000FE9983FECC470B0EFE3446A5460D19FE5A
-:100BD0004300FEA210010C610D4401FEF41C01FE55
-:100BE000001D40155601857D0D405101FE9E1E05DC
-:100BF000FE3A03010C060D5D460D1900FE62100160
-:100C0000760612FE5C12010C0612FE5213FE1C1C2C
-:100C1000FE9DF0FE8E0EFE1C1CFE9DF0FE940E014D
-:100C20000C611244FE9F1019FE1500FE04E60D4FE4
-:100C3000FE2E1019FE1300FE101019FE4700F119C8
-:100C4000FE4100A219FE240086C4C57503811E2B37
-:100C5000EA4FFE04E612FE9D41FE1C424001F405EF
-:100C600035FE121C1F0D47B5C31FFE310047B801EA
-:100C7000FED41105E951FE06ECE0FE0E474628FEC3
-:100C8000CE453151FE06EAE0FE474B45FE7557035F
-:100C900067FE9856FE38120A5A0118FE4448600151
-:100CA0000C0628FE18130A5701183EFE41580ABACE
-:100CB000FEFA14FE4954B0FE5E0F05FE3A030A67C1
-:100CC000FEE014FE0E474628FECE453151FECE47CB
-:100CD000FEAD130535212C091AFE98122620962008
-:100CE000E7FE081CFE7C19FEFD19FE0A1C03E5FE4A
-:100CF0004855A53BFE6201FEC95531FE741001FE48
-:100D0000F01A03FE38013BFE3A018EFE1E10FE0271
-:100D1000ECE7530036FE04EC2C60FE05F6FE3401D1
-:100D200001FE621B01FECE1EB211FE1813CAFE02A6
-:100D3000EAE75392FEC3131F1247B5C3FE2A1003FE
-:100D4000FE380123FEF0FF10E503FE3A0110FE62BB
-:100D50000101FE1E1E202C155601FE9E1E130702C9
-:100D600026022196C720960992FE79131F1D47B5CA
-:100D7000C3FEE110CFFE03DCFE7357FE805D02CFA1
-:100D8000FE03DCFE5B57FE805D02FE0357CF26FEAE
-:100D900000CC02FE0357CF8902010C064AFE4E1317
-:100DA0000FFE1C8004FE9C83330B0E0907FE3A13D2
-:100DB0000FFE1E8004FE9E83330B0EFE2A130FFED1
-:100DC0001D8004FE9D83FEF9130EFE1C1301FEEE32
-:100DD0001EACFE141301FEFE1EFE8158FA01FE0E2B
-:100DE0001FFE30F40DFE3C50A201FE921B01430990
-:100DF00056FB01FEC81A010C0628A401FEF41C01D2
-:100E0000FE001D15FEE900010C064AFE4E1301FE10
-:100E1000221BFE1E1C0FFE149004FE94933A0BFE40
-:100E2000969004FE9693790B0E10FE640122FE66E6
-:100E300001010C0665F90FFE038004FE8383330B6A
-:100E40000E77FE01EC2CFE8040202C7A3015DF401E
-:100E5000212CFE00408D2C02FE081C03FEAC00FE7F
-:100E6000065803FEAE00FE075803FEB000FE085809
-:100E700003FEB200FE0958FE0A1C2E4920E026108F
-:100E8000661055106F1357524F1C28FE904DFE915F
-:100E9000542BFE8811461A135A521C4AFE904DFEDE
-:100EA00091542BFE9E112E1A202C903460212CFE82
-:100EB00000408D2C15DFFE1456FED6F0FEB211FE5A
-:100EC000121C75FE141CFE101CFE181C0251FE0C98
-:100ED00014FE0E47FE07E628FECE47FEF51302017C
-:100EE000A7903460FE0680FE4847FE4213FE028053
-:100EF0000956FE34130A5A0118CBFE3612FE414839
-:100F0000FE454801FEB216FE00CCCBFEF3133F892E
-:100F1000091AA50A9D0118FE805C0185F2099BA4AF
-:100F2000FE1456FED6F0FEEC1102FE445877FE0188
-:100F3000ECB8FE9E40FE9DE700FE9CE7128D30015E
-:100F4000F4FEDD1037D799D89C2725EE0912FE480C
-:100F500012090DFE5612091DFE301209DD1BFEC4DA
-:100F60001309FE23001BFED01309071BFE341409CE
-:100F700024FE121209001B291FDD0142A1320108C3
-:100F8000AE410232FE62080AE101FE5810159B05CF
-:100F90003532014309BBFED713914B7E4C8EFE8048
-:100FA00013010C0654FE7212DB64DC34FE4455FE61
-:100FB000E555B0FE4A13216EFE261303973B988E2B
-:100FC000FEB60E106A226B261097109801C22E49A9
-:100FD00088206E01FE6A16DB64DC34FE0455FEA533
-:100FE00055FE04FA64FE05FA34FE8F10036C3B6D67
-:100FF000FE4056FEE156106C226D71DB64DC34FE5F
-:101000004455FEE55503683B69FE0056FEA15610A7
-:10101000682269010C0654F9216EFE1F40036A3BE9
-:101020006BFE2C50FEAE50036C3B6DFE4450FEC672
-:101030005003683B69FE0850FE8A50034B3B4CFE50
-:101040004050FEC25005732E07209E0572320108E3
-:10105000163D2725EE09072B3D014309BB2B7201E5
-:10106000A6233F1B3D010C060DFE1E13914B7E4C2B
-:10107000FE0A5531FE8B55D94BDA4CFE0C51FE8ED3
-:1010800051057201FE8E1ECAFE1941057232010819
-:101090002A3C16C02725BE2D1DC02D0D832D7F1B7C
-:1010A000FE6615053D01082A3C16C02725BD091D11
-:1010B0002B3D010816C02725FEE809FEC249500352
-:1010C000B61E830138062431A1FEBB452D00A4467F
-:1010D00007903F01FEF81501A686FE4B45FE201342
-:1010E00001430982FE1613039A1E5D03551E315EED
-:1010F0000572FEC05D01A7FE031703668A10665ED7
-:10110000320108177301FE5619057301082A3C16AF
-:101110003D2725BD09072B3D01FEBE16FE4258FEA8
-:10112000E81401A686FE4AF40D1B3DFE4AF407FEB4
-:101130000E12014309824E057203558A10555E3224
-:101140000108177301FE8419057301082A3C163D36
-:101150002725BD09122B3D01FEE8178BFEAA14FEC0
-:10116000B61486A8B20D1B3DB207FE0E120143094C
-:10117000824E0572036F8A106F5E32010817730189
-:10118000FEC019057313072FFECC1517FEE2155F7D
-:10119000CC0108265F028FFEDE152AFEDE1516FE44
-:1011A000CC155E320108FED5101358FF02005752CD
-:1011B000AD23FEFF7FFE3056FE005C021358FF0297
-:1011C000005752AD233FFE3056FE005C021358FF1D
-:1011D00002005752AD021358FF02005752FE005E44
-:1011E000021358FF02005752ADFE0B58020A660167
-:1011F0005C0A55015C0A6F015C0201FE1E1F231A86
-:10120000FF030054FE00F424520FFE007C04FE078E
-:101210007C3A0B0EFE0071FEF918FE7A19FEFB19DE
-:10122000FE1AF700FE1BF7007A3010682269D96CAD
-:10123000DA6D02FE6208FE824AFEE11AFE835A77E8
-:101240000201C6FE42484F5045010816FEE017272E
-:1012500025BE010816FEE0172725FEE80AFEC15943
-:10126000039A1EFEDA1201380612FED0132653121C
-:1012700048FE0817D1125312FE1E132DB47BFE2612
-:10128000174D13071CB49004FE7810FF028355F12C
-:10129000FF028355531DFE1213D6FE3000B0FE80B0
-:1012A000171C631307FE5610530DFE1613D6FE646B
-:1012B00000B0FE80170AFE64001C941307FE28107D
-:1012C0005307FE6013D6FEC800B0FE80170AFEC8A2
-:1012D000001C95130771D6FE900148FE8C1745F34C
-:1012E000FE43F496FE56F0FE9E17FE04F458FE43AD
-:1012F000F494F68B01FE2416233FFCA88C4948FE8B
-:10130000DA176249FE1C10A88C8048FEDA1762804A
-:10131000715026FE4DF400F7451307FEB456FEC388
-:10132000580250130D02503E784F45010816A92768
-:1013300025BEFE03EAFE7E01010816A92725FEE967
-:101340000A010816A92725FEE90AFE05EAFE7F0123
-:10135000010816A92725FE6909FE02EAFE8001019F
-:101360000816A92725FEE80847FE810103B61E835B
-:101370000138062431A278F2530736FE34F43FA137
-:1013800078039A1E830138061231F04F45FE901003
-:10139000FE405A233FFB8C4948FEAA186249718CD3
-:1013A0008048FEAA186280FEB456FE405D01C60168
-:1013B000FEAC1DFE0217FEC845FE5AF0FEC018FE28
-:1013C00043482D9336FE34F4FE0011FE40102DB438
-:1013D00036FE34F404FE34102DFE0B00364663FE58
-:1013E0002810FEC049FF020054B2FE900148FEFAE8
-:1013F0001845FE1CF43FF3FE40F496FE56F0FE0C3A
-:1014000019FE04F458FE40F494F63E2D934ED00D90
-:1014100021FE7F01FEC846FE24138C005D2621FEBE
-:101420007E01FEC845FE141321FE8001FE4845FAE8
-:1014300021FE8101FEC8444E260213070278455062
-:10144000130D021407010817FE8219140D01081765
-:10145000FE8219141D010817FE82195FFE894901D9
-:1014600008021407010817C1141D010817C1140749
-:10147000010817C1FE8949010817C15FFE894A01A9
-:1014800008025002140701081774147F010817742A
-:10149000141201081774FE89490108177414000119
-:1014A000081774FE894A01081774FE0949010817D4
-:1014B000745FCC01080221E40907FE4C13C820E444
-:1014C000FE49F4004D5FA15EFE01ECFE2701CCFF5A
-:1014D0000200102FFE3E1A014309FEE300FE221314
-:1014E00016FE641A26209E0141219E09075D010C0B
-:1014F000610744020A5A0118FE0040AA091AFE12A6
-:10150000130A9D0118AA0A6701A3020A9D0118AADD
-:10151000FE80E71A091A5DFE455801FEB216AA02BE
-:101520000A5A0118AA0A6701A3020A5A011801FE01
-:101530007E1EFE804CFE49E41AFE12130A9D01181D
-:10154000FE804C0A67015C021C1A877CE5FE18DFEE
-:10155000FE19DEFE241CFE1DF728B1FE041B01FE51
-:101560002A1CFAB3287CFE2C01FE2F1902C92BFE7F
-:10157000F41AFEFA101C1A8703FE6401FE00F4241C
-:10158000FE185803FE6601FE1958B32401FE0E1F13
-:10159000FE30F407FE3C507CFE3800FE0F79FE1C46
-:1015A000F724B1FE501BFED4143102C92BFE261BBA
-:1015B000FEBA101C1A87FE835AFE18DFFE19DEFEE3
-:1015C0001DF754B1FE721BFEB214FCB3547C12FE24
-:1015D000AF19FE98E70002C92BFE661BFE8A101C9D
-:1015E0001A878B0FFE309004FEB0933A0BFE18580A
-:1015F000FE329004FEB2933A0BFE19580EA8B34A7D
-:101600007C12FE0F79FE1CF74AB1FEC61BFE5E146B
-:101610003102C92BFE961B5CFE02F61A87FE18FEED
-:101620006AFE19FE6B01FE1E1FFE1DF765B1FEEE80
-:101630001BFE3614FE1C13B3653EFE8358FEAF1925
-:10164000FE80E71AFE81E71A15FEDD007A30027A85
-:1016500030FE12452BFEDC1B1F0747B5C30535FEC8
-:1016600039F0752602FE7E18231D361311028703FA
-:10167000E32307FEEF12FEE110903460FE028009C2
-:1016800056FE3C13FE8214FE421351FE06830A5A94
-:101690000118CBFE3E12FE4148FE454801FEB2163F
-:1016A000FE00CCCBFEF3133F89091AA50A9D011851
-:1016B000FE804C0185FE1610099B4EFE4014FE2450
-:1016C00012FE1456FED6F0FE521C1C0D02FE9CE7C4
-:1016D0000D19FE1500408D3001F41C070251FE0665
-:1016E00083FE1880612844155601851C0702FE38C8
-:1016F00090FEBA9091DE7EDFFE485531FEC955025C
-:1017000021B98820B9020ABA0118FE41480A5701D6
-:1017100018FE49441BFE1E1D8889020A5A01180939
-:101720001AA40A6701A30A570118888902FE4EE429
-:101730001D7BFE521D03FE9000FE3A45FE2C10FE5E
-:101740004EE4DD7BFE641D03FE9200D112FE1A10F2
-:10175000FE4EE4FE0B007BFE761D03FE9400D124BA
-:10176000FE081003FE9600D163FE4E4583CAFF04B7
-:101770006854FEF1102349FE081CFE6719FE0A1C7E
-:10178000FE1AF4FE000483B21D48FEAA1D131D02BA
-:101790000992FE5AF0FEBA1D2E93FE34100912FE75
-:1017A0005AF0FEC81D2EB4FE2610091D362E63FE0B
-:1017B0001A10090D362E94F20907362E95A1C8028B
-:1017C0001F930142FE04FE99039C8B022AFE1C1EFD
-:1017D000FE14F0082FFE0C1E2AFE1C1E8FFE1C1E7F
-:1017E000FE82F0FE101E020F3F04FE8083330B0EBC
-:1017F000020FFE188004FE9883330B0E020FFE02C8
-:101800008004FE8283330B0E020FFE068004FE86E8
-:1018100083330B0E020FFE1B8004FE9B83330B0EE3
-:10182000020FFE048004FE8483330B0E020FFE8041
-:101830008004FE8083FEC9470B0E020FFE1981044F
-:10184000FE9983FECA470B0E020FFE068304FE8636
-:1018500083FECE470B0E020FFE2C9004FEAC933A93
-:101860000B0E020FFEAE9004FEAE93790B0E020F2C
-:10187000FE089004FE88933A0B0E020FFE8A900435
-:10188000FE8A93790B0E020FFE0C9004FE8C933AA5
-:101890000B0E020FFE8E9004FE8E93790B0E020F3C
-:1018A000FE3C9004FEBC933A0B0E028B0FFE0380AD
-:0E18B00004FE8383330B770EA802FF66000050
-:00000001FF
-/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/mcode.bin.ihex b/firmware/advansys/mcode.bin.ihex
deleted file mode 100644
index cd160d938667..000000000000
--- a/firmware/advansys/mcode.bin.ihex
+++ /dev/null
@@ -1,147 +0,0 @@
-:100000003F452C01010301190F0000000000000012
-:10001000000000000F0F0F0F0F0F0F0F0000000068
-:1000200000000000000000000000000000000000D0
-:1000300000000000000000000000000000000000C0
-:100040000000000000000000C3120D0501000000C8
-:1000500000FF000000000000FF80FFFF0100000023
-:10006000000000000000002300000000000700FF67
-:1000700000000000FFFFFF00000000000000E48817
-:100080000000000080734804360000A2C2008073A4
-:1000900003233640B600360005D60CD212DA00A291
-:1000A000C20092801E985000F5004898DF23366009
-:1000B000B60092804F00F5004898EF233660B600F6
-:1000C000928080629280004615EE13EA020109D800
-:1000D000CD044D0000A3D600A6977F2304618401C0
-:1000E000E684D2C18073CD044D0000A3DA01A69747
-:1000F000C681C28880738077000101A1FE004F0095
-:10010000849707A6080100330300C288030301DEB9
-:10011000C288CE006960CE0002034A6000A2780166
-:10012000806307A62401788103038063E20007A6A9
-:10013000340100330400C2880307020104CA0D23FE
-:1001400068984D04048505D80D236898CD041523BF
-:10015000F888FB23026182018063020306A3620127
-:1001600000330A00C2884E0007A36E0100330B0063
-:10017000C288CD04362D00331A00C288500488810D
-:1001800006AB820188814E0007A39201500000A3B4
-:100190003C0100057C814697020105C60423A001AD
-:1001A0001523A101BE81FD23026182010ADA4A0002
-:1001B000066100A0B4018063CD04362D00331B001E
-:1001C000C28806236898CD04E684060100A2D40103
-:1001D000576000A0DA01E6848023A001E6848073E2
-:1001E0004B00066100A2000204010CDE020103CCF8
-:1001F0004F008497FC810823024182014F006297DF
-:1002000048048480F0970046560003C00123E800AC
-:1002100081730629034206E203EE6BEB1123F88893
-:100220000498F0808073807707A42A027C9506A644
-:10023000340203A64C044682040103D8B4986A969B
-:100240004682FE95806783038063B62D02A66C020A
-:1002500007A65A0206A65E0203A66202C2887C9521
-:100260004882609648820423A0011423A1013C84A3
-:1002700004010CDCE0232561EF0014014F04A80108
-:100280006F00A5010323A40106239C01242B1C015C
-:1002900002A6AA0207A65A0206A65E0203A6200428
-:1002A00001A6B40200A6B40200331200C288000EF8
-:1002B0008063004300A08C024D0404010BDCE723A3
-:1002C00004618401103112351401EC006C38003FD8
-:1002D0000000EA821823046118A0E2020401A2C807
-:1002E00000331F00C28808310A350C390E3D7E9854
-:1002F000B62D01A6140300A6140307A60C0306A638
-:10030000100303A6200402A66C0200333300C28847
-:100310007C95EE826096EE82829880427E9864E4BC
-:1003200004012DC83105070100A2540300438701D1
-:10033000050586987E9800A6160307A64C0303A61B
-:100340003C0406A6500301A6160300332500C2880C
-:100350007C95328360963283040110CE07C8050570
-:10036000EB0400330020C020816272830001050588
-:10037000FFA27A03B1010823B2012E8305051501FE
-:1003800000A29A03EC006E0095016C38003F00005B
-:1003900001A6960300A69603108480427E9801A6CB
-:1003A000A40300A6BC031084A898804201A6A4035D
-:1003B00007A6B203D4837C95A88300332F00C2889C
-:1003C000A898804200A6BC0307A6CA03D4837C95E4
-:1003D000C08300332600C288382B80328036042345
-:1003E000A0011223A101108407F006A4F403806B7E
-:1003F000806705238303806303A60E0407A6060413
-:1004000006A60A0400331700C2887C95F483609620
-:10041000F483208407F006A42004806B8067052302
-:1004200083038063B62D03A63C0407A6340406A606
-:10043000380400333000C2887C9520846096208484
-:100440001D0106CC00330084C0200023EA00816235
-:10045000A20D806307A65A0400331800C288030364
-:100460008063A30107A46404230100A286040AA0F8
-:100470007604E00000331D00C2880BA08204E00077
-:1004800000331E00C2884223F888002322A3E6041A
-:10049000082322A3A204282322A3AE04022322A31A
-:1004A000C4044223F8884A00066100A0AE04452334
-:1004B000F888049800A2C004B49800330082C020D9
-:1004C0008162E8814723F88804010BDE0498B49820
-:1004D00000330081C0208162140100A00002432388
-:1004E000F8880423A0014423A10180734D0003A3D5
-:1004F000F40400332700C288040104DC0223A201B3
-:100500000423A001049826954B00F6004F044F00E9
-:1005100000A3220500057600066100A21C050A85DD
-:100520004697CD04248548048480020103DA8023A1
-:10053000820134850223A0014A00066100A2400521
-:100540001D0104D6FF2386414B60CB00FF238001B1
-:1005500049008101040102C830018001F704030150
-:1005600049048001C90000050001FFA0600577046F
-:100570000123EA005D00FEC700620023EA00006379
-:1005800007A4F805030302A08E05F48500332D00AF
-:10059000C28804A0B80580630023DF004A0006611A
-:1005A00000A2A4051D0106D60223024182015000CB
-:1005B00062970485042302418201048508A0BE05D8
-:1005C000F48503A0C405F48501A0CE0588008063EE
-:1005D000CC8607A0EE055F00002BDF0800A2E60531
-:1005E0008067806301A27A067C8506236898482389
-:1005F000F88807238000068780637C850023DF005E
-:1006000000634A00066100A236061D0116D4C0230D
-:1006100007418303806306A61C0600333700C288A7
-:100620001D0101D620236360830380630223DF0062
-:1006300007A67C05EF046F0000634B000641CB006A
-:100640005200066100A24E061D0103CAC0230741E5
-:1006500000631D0104CC00330083C020816280232D
-:1006600007410063806708238303806300630123DD
-:10067000DF0006A6840607A67C058067806300333A
-:100680000040C020816200630000FE958303806308
-:1006900006A6940607A67C05000001A01407002BFF
-:1006A000400E8063010006A6AA0607A67C05400E40
-:1006B0008063004300A0A20606A6BC0607A67C0530
-:1006C0008067400E806307A67C050023DF0000637F
-:1006D00007A6D60600332A00C28803038063890078
-:1006E0000A2B07A6E80600332900C288004300A2AF
-:1006F000F406C00E8063DE86C00E00330080C0208A
-:100700008162040102DA80637C85807B806306A6B7
-:100710008C0600332C00C2880CA22E07FE958303A2
-:10072000806306A62C0707A67C0500333D00C2881F
-:1007300000008067830380630CA0440707A67C0544
-:10074000BF2304618401E6840063F0040101F10029
-:100750000001F20001058001720471008101700442
-:10076000800581050063F004F20072040101F100CC
-:1007700070008101700471008101720080017104B8
-:100780007000800170040063F004F2007204000144
-:10079000F10070008001700471008001720081011D
-:1007A000710470008101700400630023B3018305AC
-:1007B000A301A201A1010123A0010001C80003A11E
-:1007C000C40700330700C28880058105040111C8F1
-:1007D0004800B001B1010823B201050148040043FB
-:1007E00000A2E4070005DA870001C800FF238001AA
-:1007F00005050063F7041A09F6086E040002804339
-:100800007608800277040063F7041A09F6086E047C
-:10081000000200A0140816880043760880027704BE
-:100820000063F3040023F40074008043F400CF401D
-:1008300000A2440874040201F7C9F6D9000101A11D
-:10084000240804982695248873040063F30475042F
-:100850005A88020104D84697049826954A8875005C
-:1008600000A3640800054E8873040063807B8063E6
-:1008700006A6760800333E00C28880678303806343
-:100880000063382B9C88382B928832093105929866
-:100890000505B209006300320036003A003E0063ED
-:1008A00080328036803A803EB43D0063382B40323F
-:1008B0004036403A403E00635A20C94000A0B40888
-:1008C0005D00FEC300638073E6200223E8008273AC
-:1008D000FFFD80731323F8886620C0200423A00145
-:1008E000A123A1018162E28880738077680000A261
-:1008F000800003C2F1C74123F8881123A10104231A
-:04090000A001E684E8
-:00000001FF
-/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/atmsar11.HEX b/firmware/atmsar11.HEX
deleted file mode 100644
index dfddc190ac24..000000000000
--- a/firmware/atmsar11.HEX
+++ /dev/null
@@ -1,204 +0,0 @@
-:04000000A0D0F0009C
-:2C008000401A680000000000335B007C13600005335B10003C1AA0C0375A018003400008000000001760FFFB335B400020
-:2C00AC00401A700013600003241B0FC0AF9B45002508000803400008420000108F810C9032220002104000033C03A0D174
-:2C00D8002463F8100060F809242100011000001AAF810C9082020011AF900C480441000A34420080967D000296020012A4
-:2C01040000000000105D00110000000004110161A66200021000000DAE62000C34848000A20200114D01FFFF000000005E
-:2C0130008F834C0000000000AF830FEC00E0F80903E03821000414000440FFF700000000AF80460C8E1000084D01FFFF36
-:2C015C00000000008F834C004900001DAF830FEC8F820CBC8F9D0C4C2442000197BE0000AF820CBC13C00009ACA200D872
-:2C018800A7A000003C0100D1003E08259422002C0411013FA4220002AC22000CAC2000108F9E0C5427BD000217BE00028C
-:2C01B4008CA200C08F9D0C508F970FC8AF9D0C4C12E20005878040023C02A0D12442F94C0040F8090000000000E0F8094A
-:2C01E00003E038214500FFDC8E11000C3C1300D1001111022C4304001060FFB900021180026298218E76003C32220008C1
-:2C020C001440FFB78E7700348E7500303C03CFB016C0000302D5102B041100BE000000001040FFA6007018264D01FFFFE5
-:2C023800000000008F824C00AF974C00AF820FECAC7600100260902132220002104000078F944A009602003A3484000492
-:2C02640014400003AF820FBC3C029000AF820FBC8E10000832943F008E11000C2694FF00128000733C1300D14901007162
-:2C0290003237000816E0006F001111022C4304001060006C0002B980000417400440003A027798211272002326D60030E0
-:2C02BC00AE56003C8E76003C8E7700348E7500303C03CFB016C0000302D5102B0411009100000000104000602E8210006B
-:2C02E80014400009007018264D01FFFF000000008F824C00AF974C00AC760010AE4200341000FFD0AF80460C00E0F8090D
-:2C03140003E038213C03CFB000701826AE4600344D01FFFF000000008F824C00AF974C00AF820FECAC7600101000FFC382
-:2C034000AF80460C02D5102B104000423C17CFB02E8210001440000602F0B8264D01FFFF00000000AEF600101000FFB8E9
-:2C036C00AF80460C00E0F80903E038214D01FFFF000000008F824C00AF864C00AEF60010AF820FEC1000FFAEAF80460C7F
-:2C0398003084FFFB8E5700383242FFC000021182A7820FB8AF970FB4865D002A865E0008A79D0FBA279D0F1833DE00604B
-:2C03C40003BEE821001EF0C203BEE8218F970C584D01FFFF000000008F834C008FA2001C12E300033C030C403C1EC0008B
-:2C03F000AF9E0FBCAC620FB48FA300182442000C14430002AF80460C8FA20014AE40003CAFA2001C8E76003C8E7700340D
-:2C041C008E7500303C03CFB016C0000302D5102B0411003C00000000007018264D01FFFF00000000ACA500E410400032D6
-:2C044800AF974C001000FF7FAC760010000417400440000726D60030AE56003C00E0F80903E03821AF80460C1000FF393E
-:2C047400AE4600348E5700383242FFC000021182A7820FB8AF970FB48F970C5800E0F80903E0382112E600033C030C4029
-:2C04A0003C02C000AF820FBC865D002A865E0008A79D0FBA279D0F1833DE006003BEE821001EF0C203BEE8218FA2001C23
-:2C04CC004D01FFFF000000008F974C00AC620FB43084FFFB8FA300182442000C14430002AF80460C8FA20014AE40003CC2
-:2C04F800AFA2001C4D01FFFF00000000ACA500E41000FF13AF974C0000E0F80903E038211000FF0F000000001040005B50
-:2C052400867E0008279D0F1833DE006003BEE821001E10C203A2E8218FB700088FA2000C8EF6000412E2002886620008BC
-:2C05500082030010000217400441001924630001106000173C02D1B0005010264D01FFFF000000008F9E4C00AC56001008
-:2C057C0026D6FFFE860200103C03CFB034632000A662002A8EE2000026F70008AE6200388FA20020AFB700082417FFFF46
-:2C05A80002C2A8214D01FFFF00000000AF9E4C0003E00008AE7500308EE2000026F70008AE6200388FA20020AFB70008DB
-:2C05D4002417FFFFA677002A02C2A8213C03CFB003E00008AE750030001E18C2006518218C6300C88FA200100000000064
-:2C0600000062B0231EC000038FA1000412C0001B0022B0232EC30041146000023C1500402416004000161E80000318829E
-:2C062C00007518254D01FFFF000000008F954C00001EB84000771821AC624D00005610211441000227830D008FA200004D
-:2C06580002E3B821AFA2001002D71821AFA3000C4D01FFFF000000008EF600041000FFB5AF954C003C16DEADAE76003C82
-:2C068400AE60003826D5FFFF0000102103E00008AE7500302C430AB2106000052C4324B21000000424020AB210000002AF
-:2C06B000240224B11060FFFD304301FF000318403C1DA0D127BDD6CC007D1821946300000002EA4200031C0027BDFFFBC1
-:2C06DC0003E0000803A3100624030FC0AF83450010000002012060213C0CCFB011E000560189602685FE00000000000089
-:2C07080013C000473C02CFB007C0002D001E1F8004610034001E1FC0046000093C02D3B000E0F80903E038214D01FFFF10
-:2C073400000000008F864C008F990FEC1000000BAF994C0001E2782600E0F80903E038214D01FFFF000000008F864C001B
-:2C076000AF994C00ADEF20103C02D3B001E278268F820FC08F830FC4AF824D008DE20004A5E00000AC6200008C62000094
-:2C078C0024020380AF824D008F824D008F820F1424630004146200022419FFFF8F830F10ACA500E4AF830FC44D01FFFF93
-:2C07B800000000008F824C801000001FADE2003C00E0F80903E038214D01FFFF00000000A5E000008F864C001580002238
-:2C07E400AF8F45401000001701E2782600E0F80903E038214D01FFFF000000008F864C00AF994C00ADEF20103C02CFB097
-:2C08100001E27826A5E000004D01FFFF00000000100000078F994C0000E0F80903E038214D01FFFF000000008F864C0015
-:2C083C008F990FEC1580000AAF8F45000000782110000014AF19001400E0F80903E038214D01FFFF000000001180FFF8C1
-:2C0868008F864C0085220000012078210440000A8D290008130B0004000C1602AF1900148D7900140160C021AF994C0084
-:2C089400AD8E40103042003F01C27021000417800440018B8F824A0030818000304200041440FF8D8D4B00001020000C47
-:2C08C00030847FFF8F820C480120F021244300348C5D000C24420004AFDD000C1462FFFC27DE0004A52100001000FF82E0
-:2C08EC00250800081160005800000000857D00088D63000C9562000A8D41000407A1002600621821A563000A00031C026D
-:2C091800041101A0000318C0001D16C00441001F27A2008000021CC00461000E0040E82127BD0080956200009563000293
-:2C0944003442000CAD22000C24020100A52200109562002CA5230014A5220012A520001634028000A5220000A57D0008D2
-:2C09700007A0000C8F820C4C8F830C502441FFE80023F02B13C000020020102124420400945E00002441FFFE17C0FFF994
-:2C099C00AD620010A44B0000142B001CAD400000AD400004254A00083142007F1440000E00041780044100038F820FE03A
-:2C09C800100000063484000134840002244200083442100038421000AF820FE0354A0100394A010039420080AF820FE4B9
-:2C09F400001D14C00441000333A2EFFF1000FF3CA562000807A0009F33A2FFFE10000021A56200088D620024001D1CC01D
-:2C0A200004610004AD42000033A3EFFF1000FF31A563000807A0000533A3FFFEA56300088D4B00001000FFAA000000001E
-:2C0A4C001000008E25080008254A00083142007F1440000E00041780044100038F820FE010000006348400013484000274
-:2C0A7800244200083442100038421000AF820FE0354A0100394A010039420080AF820FE4110000038D4B00001000FF9303
-:2C0AA4002508FFF88F820FD88F830FDC8F810FD41062001D246200084D01FFFF000000008F8C4C00847F00003C1E00D11C
-:2C0AD00033FD03FF001D5980017E5821857E0008001DE900001E0F0003E1F82507E00003AF820FDC879E0CA0278B0C986E
-:2C0AFC0007C100423C0208403C01F7B08D62002000230826AC2200008C620004946300022442FFF8004310211000004E12
-:2C0B2800AD6200208F820FD087830CA014220007278B0C98410000513C018000ACA100E08CA100C4000000001022004C4E
-:2C0B54000022E8238F9F0F0C07A10002AF810FD403E2E8232FA30041146000023C1E0040241D0040001D1E800003188256
-:2C0B8000007E18254D01FFFF000000008F8C4C00AC624CC0005D1021145F000227830CC08F820F0803A3F021AF820FD059
-:2C0BAC00AF9E0FD84D01FFFF000000001000FFC3246200088D63000C8D7D0010A563000A13A0000200031C02A7A00000F8
-:2C0BD800000318C0041100EF006818214D01FFFF000000008F820C448F830C40AD620010A5630004A563000610000021FC
-:2C0C0400AF8C4C00A57D00008C7D000494630002AC5D4C4027A20008AD62001803A3E82127BDFFF4AD7D001C27BD0004D4
-:2C0C3000AD7D002037C18001001E17C00441FFE0A56100084D01FFFF000000008F820C448F830C40AD620010A563000478
-:2C0C5C00A56300068F820FD88F830FDC4D01FFFF000000001462FF9524620008AF8C4C0087830CA0278B0C980461FE97F8
-:2C0C88000004170004400005956200001178000600000000AF0E0010A70D00043084FFF7956D00048D6E001025ADFFD075
-:2C0CB40005A1FE8FAD22000C3C0CFFB001896026000D182225AD00308D7E00188D61001C4D01FFFF00000000103E0036B9
-:2C0CE0008F9D4C003C010840AC3E4C4027DE000811A00017AD7E0018000DF600019E60254D01FFFF00000000AD8E40105F
-:2C0D0C008F8D0C40957E00068F8E0C4403CDF021A57E0006000CF782000C0E0203C1F021001E0F80000C6200000C6202C2
-:2C0D38000181602533DE003C019E60213401000110000008A5210000957E00064D01FFFF000000008F8D0C408F8E0C44CD
-:2C0D640003CDF021A57E00064D01FFFF0000000001A3F02B17C000080003F60001A36823019E6025018960264D01FFF7CF
-:2C0D9000000000001000FE58AF9D4C008D7E00188D61001C00000000143EFFCE006D18234D01FFFF000000002C61000864
-:2C0DBC001020001795610008000000000001FF8007E0000B34210002006D182100031E000183602501896026240D002CC0
-:2C0DE800A56100084D01FFFF000000001000FE40AF9D4C003C1F0C40AFFE4FA83021FFFDA56100083C0CD3CF358CE0006E
-:2C0E140010000008340300023C1F0C40AFFE4FA811A0FFF9000DF60034030003019E6025018960263484000834420002C4
-:2C0E4000AD22000C95620006A5230000AD2200384D01FFFF00000000857E00088F820FA897830FACAD22000433C17FFFA6
-:2C0E6C00AD600010A56100081060FE20AF9D4C00A57E00080003190030633FF0A56300008F820FB03C030840AC624C4007
-:2C0E980024430008AD63001897830FAE2442FFF400621821AD63001C4D01FFFF000000008F8D0C408F830C44A56D000474
-:2C0EC400A56D0006AD6300101000FE0AAF9D4C008F820FE000040FC08C4300000421001B8F9F0FE48C5D0004AC4000043A
-:2C0EF0001060000EAC400000000000009462002800000000005F10208C4100040000000010200003AC43000410000002B6
-:2C0F1C00AC230024AC43000017A3FFF48C6300248F820FE03BFF0080244200083442100038421000AF820FE0AF9F0FE46E
-:2C0F48001000FE573084FFFE1060001000000000947D00280000000003BFE8208FA10004AFA30004102000038C5E000439
-:2C0F740010000002AC230024AFA300008C61002417C3FE48AC410000AC400004AC4000001000FE443084FFFD2C6201006F
-:2C0FA0001440000E006A10213143007F01431823004318233062007FA562002800621823000319028F820FE02463FFF8BF
-:2C0FCC000062182134631000100000033863100034430100386301008C6200040000000010400003AC6B000403E000089A
-:0C0FF800AC4B002403E00008AC6B0000D0
-:02000004A0D08A
-:2CD5000000000002A0D0E00000000000000010000000000600000008000000000000000800000002A0D0D64800000000F7
-:2CD52C00000008880000000000000000000000000000000024313200243132002431320000000000244D43522420436FB2
-:2CD558007079726967687420286329204D61646765204E6574776F726B73204C746420313939352E20416C6C207269674C
-:2CD584006874732072657365727665642E004D6164676520416D6261737361646F722076312E303100000000000000012C
-:2CD5B00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000004E
-:2CD5DC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:2CD608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F6
-:0CD6340000000000FFF0400000000000BB
-:2CF000000C343E2D000000003C1CA0D1279C56383C1DA0D127BDDFD03C08A0D12508DFD0AF8780080C343C1300000000E4
-:2CF02C00240400030097000D3C08BFC0350802308D08000000000000010000080000000027BDFFD0AFBF001CAFB1001864
-:2CF05800AFB000143C11FFF0000080213C18005637183B7926190200172000020319001A0007000D2401FFFF172100056B
-:2CF08400000000003C01800017010002000000000006000D00001012001018403C05A0D124A5D6CC00A32021A4820000C5
-:2CF0B000261000012A0102001420FFEA000000003C06A0D124C6F9E43C07A0D124E7D648ACE600003C08A0D12508FB14D9
-:2CF0DC00ACE800043C09A0D12529FC94ACE900083C0AA0D1254AFCD4ACEA000C3C0BA0D1256BFBA8ACEB00103C0CA0D15C
-:2CF10800258CFBC4ACEC00143C0DA0D125ADFBE0ACED00183C0EA0D125CEFBFCACEE001C3C0FA0D125EFFC18ACEF0020AD
-:2CF134003C18A0D12718FC34ACF800243C19A0D12739FC50ACF900283C02A0D12442FC60ACE2002C3C03A0D12463FC70A6
-:2CF16000ACE300303C04A0D12484FC80ACE400343C05A0D124A5FCB4ACE500383C06A0D124C6FE08ACE6003C3C08A0D111
-:2CF18C002508FE90ACE800403C09A0D12529FA38ACE900443C0AA0D1254AFA74ACEA0048241000133C0BA0D1256BF9D8E7
-:2CF1B800001060803C0EA0D125CED64801CC6821ADAB0000261000012A0100201420FFF6000000008F988000000000006F
-:2CF1E400AF0001008F828000241903FFA4590202000080218F86800024030FFF0010204024C7038000E42821A4A30000C1
-:2CF21000261000012A0100081420FFF7000000008F89800034089C40AD2803A08F8B80003C0A00FF354AFFFFAD6A03A4FC
-:2CF23C00000080218F8F8000240C0FFF0010684025F80300030D7021A5CC0000261000012A0100081420FFF700000000AB
-:2CF268008F82800034199C40AC5903208F8480003C0300FF3463FFFFAC8303248F868000240502FFA4C502023C08A0C00C
-:2CF29400350801803C09A0D12529D5B8250A00288D0B00008D0C0004AD2B0000AD2C000425080008150AFFFA252900081B
-:2CF2C0004002600000000000AFA20028240300223C04A0E034840014AC8300008FA500280000000034A6100100C01021CB
-:2CF2EC00AFA600283C07FFBF34E7FFFF00C7382400E01021AFA7002840876000000000003C0800023508D8903C09FFFE59
-:2CF3180035290130AD2800008FAA00283C0BF000014B582501601021AFAB002801606021408C6000000000000000802141
-:2CF3440000107080022E7821ADE00000261000012A0104001420FFFA00000000241800013C19A0E8AF380000240200117C
-:2CF370003C03A0F034630017A06200003C04F0EB348400703C05FFF034A54A00ACA400003C06FCEB34C60070ACA6000027
-:2CF39C003C07FFF034E74700ACE00000000080213C08FFF035080FC03C09FFF035294500AD280000261000012A01000433
-:2CF3C8001420FFF800000000000080213C0ADEAD001059803C0100D1002B0821AC2A003C3C0100D1002B0821AC200030C1
-:2CF3F4003C0100D1002B0821AC200038240DFFFF3C0100D1002B0821AC2D0014001071003C0100D1002B0821A42E000054
-:2CF420003C0100D1002B0821A4200004241800203C0100D1002B0821A43800083C0100D1002B0821AC200010261000017F
-:2CF44C002A0104001420FFE00000000000008021001018C03C05A0D124A5E00000A32021AC8000003C07A0D124E7E000BF
-:2CF4780024E8000401033021ACC00000261000012A0100091420FFF300000000240903803C0AFFF0354A4D00AD4900005F
-:2CF4A4003C0CA080358C009CAD8000003C0DA08035AD00A0ADA000003C0E11003C0FA08035EF00A8ADEE000041010003A0
-:2CF4D000000000004100FFFF000000003C18A080371800E08F1900003C01A0D1AC39D6C80C343D43032020218FB00014DE
-:2CF4FC008FBF001C8FB1001803E0000827BD00300080B8213C1CFFF0A3800C84A3800C888F90440000002021AF800CBC7E
-:2CF52800240200A827830F002C5D004017A0000C3C1DFFB003A3E826AFB740000000000000000000000000004D01FFFFF6
-:2CF55400000000002442FFC0246300401000FFF326F700401040000D000000000002EE003C01004003A1E8253C01FFF099
-:2CF5800003A1E82603A3E826AFB740000000000000000000000000004D01FFFF000000003C05A0808F820F08000000007E
-:2CF5AC00AF820FD4AF820FD0ACA200C48F820F100000000000021D82AF830FC000031D80004310233C01A0800041102542
-:2CF5D800AF820FC4AF820F108F820F1400000000004310233C01A08000411025AF820F1424030003279D0F1824BE00C823
-:2CF6040027810D008FA2000000000000AFA20010AFC20000AFA10008AFA1000C8FA2001400000000AFA2001C27BD0024B4
-:2CF6300027DE0004242100401460FFF32463FFFF8F820F0000000000AF820FC8ACA200C0278208002403000FAC4000002C
-:2CF65C00244200041460FFFD2463FFFF8F830FC000000000AF834D008F834D008F830F148F820F102463FFFCAC40000091
-:2CF688001443FFFE2442000424020380AF824D00279D0F1827A100908FA200148FA3001800000000006218232C7F004017
-:2CF6B40017E000093C1F004037FF080003A0F0214D01FFFF00000000AFE20000244200401000FFF62463FFC01060000659
-:2CF6E00037FF080000031E0003E3F8254D01FFFF00000000AFE2000027BD002417A1FFE800000000000038218FC200145A
-:2CF70C008FC3001800000000006218232C7F004013E000043C1F004000030E001000000203E1F8252403004037FF080084
-:2CF73800241E03E7000008214D01FFFF00000000AFE20000002308214900FFFB000000008780400217C0FFF827DEFFFFCA
-:2CF7640014E0000434E7400003E7F8251000FFF0AF810C60AF810C5C3C01A0D18C22D6C8000000003C01A080AC2200E0E7
-:2CF790003C01A0808C2000E0AF800FB4A7800FB8A7800FBAA7800FBCA7800FBE27820CC0AF820FDCAF820FD83C02A0D156
-:2CF7BC002442DACCAF820C4CAF820C5024420400AF820C542402001E3C03FFF0247D0040AC7D000803A018211440FFFC55
-:2CF7E8002442FFFF3C1DFFF0AC7D00083C02C7043442DD7BAF820C583C07000024E7015808343FA9000000008E620038B9
-:2CF8140000000000144000058F830C9412A000222463000110000020AF830C94AF820FB43262FFC0000211828663002A70
-:2CF84000A7820FB83C02A000AF820FBCA7830FBA867E0008279D0F1833DE006003BEE821001EF0C203BEE8218FA2001CC6
-:2CF86C003C030C404D01FFFF000000008F974C00AC620FB48FA300182442000C14430003000000008FA2001400000000FB
-:2CF89800AFA2001C4D01FFFF00000000ACA500E4AF974C0003E00008AE60003C3C0DA0D125ADD50011A00021000000005C
-:2CF8C4008DA90000000000001120001D000000008DAA00048DAB00088DAC000C0009474005010004000000003C08A0D185
-:2CF8F0002508D638014850210009478005010007000000001180000D00000000AD400000254A00041000FFFB258CFFFC66
-:2CF91C0011800007000000008D6E0000256B0004AD4E0000254A00041000FFF9258CFFFC1000FFE125AD001003E00008B9
-:2CF94800000000003C021040AC574FF0000000000000000000000000000000004D01FFFF000000008F820FFC000000005B
-:2CF974003042001F000210803C17A0D102E2B82126F7D6488EF700000000000002E00008000000002402FFFFAF820FFCB9
-:2CF9A0008F970FC83C021040AC570FF08F820F0426F7001016E20004AF970FC88F970F0000000000AF970FC84D01FFFFA6
-:2CF9CC000000000003E00008000000003C1FA0D127FFF02C1000FFED8F970FF03C0200D132F703FF0017B98002E2B825AA
-:2CF9F800AEE0003C2402FFFFAEE20030AEE2001497830FF497820FF83C1D000027BD0698A6E30008A6E20002AF9F0FE819
-:2CFA240003A0F809A6E2002C8F9F0FE81000FFD9AEE2000C8F970FF03C0200D132F703FF0017B98002E2B82597820FF429
-:2CFA50003C03000024630698A6E20002AF9F0FE80060F809A6E2002C8F9F0FE81000FFCAAEE2000C8F970FF03C0200D174
-:2CFA7C0032F703FF0017B98002E2B82597820FF40000000096E30008A6E2000800431026304200601040FFBD8EE2003CF2
-:2CFAA800AEE0003C1040FFBA3C028800AF820FBC8EE20038AEE0003830630060279D0F1803A3E821000318C203A3E82116
-:2CFAD4008FA3001C1040FFAFAF820FB43C020C40AC430FB48FA200182463000C14430003000000008FA30014000000000E
-:2CFB0000AFA3001C4D01FFFF000000001000FFA2000000008F970FF03C0200D1A7970FB80017B98032F7FFC002E2B82140
-:2CFB2C00AEE000303C02DEAD8EE3003CAEE2003C8EE200381060FF95AEE000383C038800AF830FBC86E3000827970F1821
-:2CFB58003063006002E3B821000318C202E3B8218EE3001C1040FF8AAF820FB43C020C40AC430FB48EE200182463000C84
-:2CFB840014430003000000008EE3001400000000AEE3001C4D01FFFF000000001000FF7D000000008F820FF08F970FF4B8
-:2CFBB0009041000000000000003708251000FF76A04100008F820FF08F970FF49441000000000000003708251000FF6F9E
-:2CFBDC00A44100008F820FF08F970FF48C41000000000000003708251000FF68AC4100008F820FF08F970FF49041000040
-:2CFC080002E0B827003708241000FF61A04100008F820FF08F970FF49441000002E0B827003708241000FF5AA4410000DB
-:2CFC34008F820FF08F970FF48C41000002E0B827003708241000FF53AC4100008F820FF08F970FF41000FF4FA05700009D
-:2CFC60008F820FF08F970FF41000FF4BA45700008F820FF08F970FF41000FF47AC5700008F820FF0000000008C4200007A
-:2CFC8C001000FF42AF820FF43C01A0C28C22C00000000000AF820FF03C01A0C28C22C0041000FF3AAF820FF43C01A0D14E
-:2CFCB8008C22D5AC00000000AF820FF03C01A0D18C22D5B01000FF32AF820FF43C02A0F0AC400000905701530000000076
-:2CFCE400A3970C809057015700000000A3970C819057015B00000000A3970C879057015F00000000A3970C8690570163BA
-:2CFD10000000000032F70007A3970C859057019300000000A3970C8B9057019700000000A3970C8A9057019B00000000AE
-:2CFD3C0032F70007A3970C899057000B0000000032F700E000170942905700470000000032F700780037082590570067BE
-:2CFD68000000000032F7000F0017B9C000370825905700C70000000032F7002F0017BAC000370825905701470000000019
-:2CFD940032F7001E0017BC0000370825905701830000000032F700600017BC0000370825AF810C8C3C0218408F970FC83F
-:2CFDC000000000008F970FF000000000AC570C800000000000000000000000000000000000000000000000004D01FFFF17
-:2CFDEC00000000003C02A0D12442F998AF800C90AF800C94004000080000000087970FF03C1300D1A67700083C030000C2
-:2CFE180024630520AF9F0FE80060F809240200018F9F0FE81040FEDA97970FF027830F18007718210017B8C202E3B821FB
-:2CFE44003C028800AF820FBC8E620038A7800FB8AF820FB48EE3001C3C020C40AC430FB48EE200182463000C1443000487
-:2CFE7000AEE3001C8EE3001400000000AEE3001C4D01FFFF000000001000FFDF000000008F820C5C8F830C60AF820FF026
-:2CFE9C001000FEBEAF830FF423890800012018212402000F206C0040AC6C0008018018211440FFFC2042FFFFAC69000884
-:2CFEC800278B0C98A56000002403FFFFAD6300143402000134420020A5620008278A0E000140102100001821AC40000038
-:2CFEF400246300042C6C01001580FFFC244200043C02A0D12442E000AF820FE03C1800D1012060210000682100007821C6
-:28FF20000000582100004021400260000000000034424001408260003C020000244206F800400008000000007A
-:00000001FF
-/*
- Madge Ambassador ATM Adapter microcode.
- Copyright (C) 1995-1999 Madge Networks Ltd.
-
- This microcode data is placed under the terms of the GNU General
- Public License. The GPL is contained in /usr/doc/copyright/GPL on a
- Debian system and in the file COPYING in the Linux kernel source.
-
- We would prefer you not to distribute modified versions without
- consultation and not to ask for assembly/other microcode source.
-*/
-
-First record is start address in a __be32.
diff --git a/firmware/av7110/Boot.S b/firmware/av7110/Boot.S
deleted file mode 100644
index d562fdc2908f..000000000000
--- a/firmware/av7110/Boot.S
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- Boot.S: boot loader for Siemens DVB-S card
-
- Copyright (C) 2001 Convergence integrated media GmbH
- Written by Ralph Metzler
- Copyright (C) 2006 Matthieu CASTET <[email protected]>
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-
-*/
-
-/*
- check AV711x_3_1.pdf for some hardware infos
- build it with :
- $ cc -mbig-endian -c Boot.S
- $ ld -Ttext 0x2c000000 -EB -o Boot Boot.o
- $ objcopy -Obinary Boot
-*/
-
- .text
- .align
- .globl _start
-_start:
- b reset // reset vector
- movs pc, r14 // undefined
- subs pc, r14, #4 // SWI
- subs pc, r14, #4 // prefetch abort
- subs pc, r14, #8 // data abort
- subs pc, r14, #4 // reserved
- subs pc, r14, #4 // IRQ
- subs pc, r14, #4 // FIQ
-
- .word tbl // table needed by firmware ROM
-tbl: .word (endtbl - tbl)
- .word 0
- .word conf
-endtbl: .word 0
-conf: .word 0xa5a55a5a
- .word 0x001f1555
- .word 0x00000009
-
-reset: ldr r13, buffer
- ldr r4, flag
- mov r0, #0
- str r0, [r4]
- str r0, [r4, #4]
-
- ldr r1, wait_address
- ldr r2, flag_address
- ldr r3, sram
-
-copycode: // copy the code HW Sram
- ldmia r1!, {r5-r12}
- stmia r3!, {r5-r12}
- cmp r1, r2
- ble copycode
- ldr pc, sram // jump to the copied code
-
-wait: ldrh r1, [r4] // wait for flag!=0
- cmp r1, #0
- beq wait
-
- mov r1, r13 // buffer address
- ldr r3, [r4,#4] // destaddr
-
- ldrh r2, [r4,#2] // get segment length
- add r2, r2, #63 // round length to next 64 bytes
- movs r2, r2, lsr #6 // and divide by 64
- moveq r0, #2 // if 0, set flag to 2, else signal
- strh r0, [r4] // that buffer is accepted by setting to 0
- beq wait
-
-copyloop:
- ldmia r1!, {r5-r12}
- stmia r3!, {r5-r12}
- ldmia r1!, {r5-r12}
- stmia r3!, {r5-r12}
- subs r2, r2, #1
- bne copyloop
-
- eor r13, r13, #0x1400 // switch to other buffer
- b wait
-
-// flag is stored at 0x2c0003f8, length at 0x2c0003fa,
-// destaddr at 0x2c0003fc
-
-flag: .word 0x2c0003f8
-
-
-// buffer 1 is at 0x2c000400, buffer 2 at 0x2c001000
-
-buffer: .word 0x2c000400
-
-sram: .word 0x9e000800
-wait_address: .word wait
-flag_address: .word flag
diff --git a/firmware/av7110/bootcode.bin.ihex b/firmware/av7110/bootcode.bin.ihex
deleted file mode 100644
index 26a2993e0723..000000000000
--- a/firmware/av7110/bootcode.bin.ihex
+++ /dev/null
@@ -1,15 +0,0 @@
-:10000000EA00000EE1B0F00EE25EF004E25EF00401
-:10001000E25EF008E25EF004E25EF004E25EF0040C
-:100020002C0000240000000C000000002C00003414
-:1000300000000000A5A55A5A001F15550000000930
-:10004000E59FD07CE59F4074E3A00000E5840000BC
-:10005000E5840004E59F1070E59F2070E59F306403
-:10006000E8B11FE0E8A31FE0E1510002DAFFFFFB67
-:10007000E59FF050E1D410B0E35100000AFFFFFC0F
-:10008000E1A0100DE5943004E1D420B2E282203FDB
-:10009000E1B0232203A00002E1C400B00AFFFFF494
-:1000A000E8B11FE0E8A31FE0E8B11FE0E8A31FE00C
-:1000B000E25220011AFFFFF9E22DDB05EAFFFFEC17
-:1000C0002C0003F82C0004009E0008002C00007493
-:0400D0002C0000C040
-:00000001FF
diff --git a/firmware/bnx2/bnx2-mips-06-6.2.1.fw.ihex b/firmware/bnx2/bnx2-mips-06-6.2.1.fw.ihex
deleted file mode 100644
index 4c43b26af0a6..000000000000
--- a/firmware/bnx2/bnx2-mips-06-6.2.1.fw.ihex
+++ /dev/null
@@ -1,5818 +0,0 @@
-:10000000080001180800000000004A68000000C84D
-:1000100000000000000000000000000008004A6826
-:100020000000001400004B30080000A00800000091
-:100030000000569400004B44080058200000008443
-:100040000000A1D808005694000001580000A25CEE
-:100050000800321008000000000072D00000A3B4B5
-:10006000000000000000000000000000080072D046
-:100070000000002400011684080004900800040019
-:10008000000017D4000116A80000000000000000C6
-:100090000000000000000000000000000000000060
-:1000A000080000A80800000000003BFC00012E7CB6
-:1000B0000000000000000000000000000000000040
-:0800C000000000000000000038
-:0800C8000A00004600000000E0
-:1000D000000000000000000D636F6D362E322E31DF
-:1000E0000000000006020102000000000000000302
-:1000F000000000C800000032000000030000000003
-:1001000000000000000000000000000000000000EF
-:1001100000000010000001360000EA600000000549
-:1001200000000000000000000000000000000008C7
-:1001300000000000000000000000000000000000BF
-:1001400000000000000000000000000000000000AF
-:10015000000000000000000000000000000000009F
-:10016000000000020000000000000000000000008D
-:10017000000000000000000000000000000000007F
-:10018000000000000000000000000010000000005F
-:10019000000000000000000000000000000000005F
-:1001A000000000000000000000000000000000004F
-:1001B000000000000000000000000000000000003F
-:1001C000000000000000000000000000000000002F
-:1001D000000000000000000000000000000000001F
-:1001E0000000000010000003000000000000000DEF
-:1001F0000000000D3C02080024424AA03C03080015
-:1002000024634B9CAC4000000043202B1480FFFD76
-:10021000244200043C1D080037BD7FFC03A0F021F0
-:100220003C100800261001183C1C0800279C4AA01E
-:100230000E000168000000000000000D27470100CB
-:1002400090E3000B2402001A94E5000814620028D1
-:10025000000020218CE200003C0308008C63004475
-:1002600094E60014000211C20002104030A4000203
-:10027000005A10212463000130A50004A446008028
-:100280003C010800AC23004410A000190004202BFE
-:100290008F4202B804410008240400013C02080017
-:1002A0008C420060244200013C010800AC22006046
-:1002B00003E00008008010218CE2002094E3001687
-:1002C00000002021AF4202808CE20004A743028498
-:1002D000AF4202883C021000AF4202B83C02080064
-:1002E0008C42005C244200013C010800AC22005C0E
-:1002F00003E00008008010212747010090E3000B75
-:100300002402000394E50008146200280000202164
-:100310008CE200003C0308008C63004494E6001467
-:10032000000211C20002104030A40002005A102145
-:100330002463000130A50004A44600803C010800AD
-:10034000AC23004410A000190004202B8F4202B8F7
-:1003500004410008240400013C0208008C420060B3
-:10036000244200013C010800AC22006003E00008C8
-:10037000008010218CE2002094E300160000202170
-:10038000AF4202808CE20004A7430284AF4202889D
-:100390003C021000AF4202B83C0208008C42005CF4
-:1003A000244200013C010800AC22005C03E000088C
-:1003B000008010218F4301002402010050620003DD
-:1003C000000311C20000000D000311C20002104022
-:1003D000005A1021A440008003E000080000102112
-:1003E0009362000003E00008AF80000003E0000813
-:1003F0000000102103E00008000010212402010089
-:1004000014820008000000003C0208008C4200FC3E
-:10041000244200013C010800AC2200FC0A0000DD7F
-:1004200030A200203C0208008C42008424420001DB
-:100430003C010800AC22008430A2002010400008DB
-:1004400030A300103C0208008C4201082442000145
-:100450003C010800AC22010803E000080000000095
-:1004600010600008000000003C0208008C420104FB
-:10047000244200013C010800AC22010403E0000812
-:10048000000000003C0208008C42010024420001F0
-:100490003C010800AC22010003E00008000000005D
-:1004A00027BDFFE8AFBF0010274401009483000878
-:1004B000306200041040001B306600028F4202B818
-:1004C00004410008240500013C0208008C42006041
-:1004D000244200013C010800AC2200600A0001290E
-:1004E0008FBF00108C82002094830016000028210A
-:1004F000AF4202808C820004A7430284AF4202888C
-:100500003C021000AF4202B83C0208008C42005C82
-:10051000244200013C010800AC22005C0A000129D1
-:100520008FBF001010C00006006028218F4401001A
-:100530000E0000CD000000000A0001282405000183
-:100540008F8200088F4301045043000700002821D8
-:100550008F4401000E0000CD000000008F42010416
-:10056000AF820008000028218FBF001000A01021DA
-:1005700003E0000827BD001827BDFFE8AFBF001447
-:10058000AFB00010974201083043700024022000F1
-:100590001062000B286220011440002F000010217F
-:1005A00024024000106200250000000024026000C8
-:1005B00010620026000010210A0001658FBF0014A0
-:1005C00027500100920200091040001A2403000184
-:1005D0003C0208008C420020104000160000182148
-:1005E0000E00049300000000960300083C0608007B
-:1005F00094C64B5E8E0400188F8200209605000C76
-:1006000000031C0000661825AC440000AC45000443
-:1006100024040001AC400008AC40000CAC400010C9
-:10062000AC400014AC4000180E0004B8AC43001CF1
-:10063000000018210A000164006010210E0003254B
-:10064000000000000A000164000010210E000EE905
-:1006500000000000000010218FBF00148FB00010B8
-:1006600003E0000827BD001827BDFFE0AFB2001867
-:100670003C036010AFBF001CAFB10014AFB000105E
-:100680008C6450002402FF7F3C1A800000822024EA
-:100690003484380C24020037AC6450003C1208004B
-:1006A00026524AD8AF42000824020C80AF420024F0
-:1006B0003C1B80083C06080024C60324024010218D
-:1006C0002404001D2484FFFFAC4600000481FFFDCC
-:1006D000244200043C020800244204B03C0108000B
-:1006E000AC224AE03C020800244202303C010800EF
-:1006F000AC224AE43C020800244201743C03080096
-:100700002463032C3C040800248403D83C0508001F
-:1007100024A538F03C010800AC224B403C02080004
-:10072000244202EC3C010800AC264B243C010800AA
-:10073000AC254B343C010800AC234B3C3C01080089
-:10074000AC244B443C010800AC224B483C0108005F
-:10075000AC234ADC3C010800AC204AE83C0108001C
-:10076000AC204AEC3C010800AC204AF03C010800F7
-:10077000AC204AF43C010800AC204AF83C010800D7
-:10078000AC204AFC3C010800AC204B003C010800B6
-:10079000AC244B043C010800AC204B083C01080091
-:1007A000AC204B0C3C010800AC204B103C01080075
-:1007B000AC204B143C010800AC204B183C01080055
-:1007C000AC264B1C3C010800AC264B203C01080029
-:1007D000AC254B303C010800AC234B380E000623FF
-:1007E000000000003C028000344200708C42000097
-:1007F000AF8200143C0308008C6300208F82000449
-:10080000104300043C0280000E00045BAF83000430
-:100810003C028000344600703C0308008C6300A05A
-:100820003C0208008C4200A4104300048F84001492
-:100830003C010800AC2300A4A743009E8CCA000022
-:100840003C0308008C6300BC3C0208008C4200B8EA
-:100850000144202300641821000040210064202B63
-:1008600000481021004410213C010800AC2300BCCA
-:100870003C010800AC2200B88F5100003222000772
-:100880001040FFDCAF8A00148CC600003C05080055
-:100890008CA500BC3C0408008C8400B800CA30233E
-:1008A00000A628210000102100A6302B0082202164
-:1008B00000862021322700013C010800AC2500BC45
-:1008C0003C010800AC2400B810E0001F32220002F6
-:1008D0008F420100AF4200208F420104AF4200A8C6
-:1008E0009342010B0E0000C6305000FF2E02001E86
-:1008F00054400004001010800E0000C90A000213CA
-:1009000000000000005210218C4200000040F80955
-:1009100000000000104000053C0240008F4301042D
-:100920003C026020AC4300143C024000AF4201385E
-:100930003C0208008C420034244200013C010800C3
-:10094000AC220034322200021040000E3222000499
-:100950008F4201400E0000C6AF4200200E000295FB
-:10096000000000003C024000AF4201783C02080059
-:100970008C420038244200013C010800AC220038BF
-:10098000322200041040FF983C0280008F42018018
-:100990000E0000C6AF4200208F43018024020F00EA
-:1009A00014620005000000008F420188A742009CED
-:1009B0000A0002483C0240009362000024030050F9
-:1009C000304200FF144300083C0240000E00027B4E
-:1009D00000000000544000043C0240000E000D7571
-:1009E000000000003C024000AF4201B83C02080099
-:1009F0008C42003C244200013C010800AC22003C37
-:100A00000A0001C83C0280003C0290003442000110
-:100A100000822025AF4400208F4200200440FFFECA
-:100A20000000000003E00008000000003C0280001D
-:100A3000344200010082202503E00008AF4400207A
-:100A400027BDFFE0AFB10014AFB0001000808821D7
-:100A5000AFBF00180E00025030B000FF9362007D5F
-:100A60000220202102028025A370007D8F70007477
-:100A70003C0280000E000259020280241600000988
-:100A80008FBF00188F4201F80440FFFE24020002CD
-:100A9000AF5101C0A34201C43C021000AF4201F8B3
-:100AA0008FBF00188FB100148FB0001003E0000852
-:100AB00027BD002027BDFFE8AFBF0010974201848B
-:100AC0008F440188304202001040000500002821B8
-:100AD0000E000FAA000000000A00028D240500018C
-:100AE0003C02FF0004800005008218243C02040040
-:100AF000506200019362003E240500018FBF001088
-:100B000000A0102103E0000827BD0018A360002208
-:100B10008F4401400A00025E2405000127BDFFE862
-:100B2000AFBF0014AFB0001093620000304400FF6C
-:100B300038830020388200300003182B0002102B6D
-:100B40000062182410600003240200501482008008
-:100B50008FBF001493620005304200011040007CFA
-:100B60008FBF0014934201482443FFFF2C6200050D
-:100B7000104000788FB00010000310803C03080084
-:100B800024634A68004310218C42000000400008A2
-:100B9000000000000E0002508F4401408F70000CD6
-:100BA0008F4201441602000224020001AF62000CD1
-:100BB0000E0002598F4401408F420144145000043A
-:100BC0008FBF00148FB000100A000F2027BD00183F
-:100BD0008F62000C0A0003040000000097620010FE
-:100BE0008F4301443042FFFF1462001A00000000EE
-:100BF00024020001A76200108F4202380443001053
-:100C00008F4201403C02003F3446F0003C0560004A
-:100C10003C04FFC08CA22BBC0044182400461024C6
-:100C20000002130200031D82106200390000000060
-:100C30008F4202380440FFF7000000008F4201405D
-:100C4000AF4202003C021000AF4202380A00032209
-:100C50008FBF0014976200100A0003040000000018
-:100C60000E0002508F440140976200128F430144EE
-:100C70003050FFFF1603000224020001A762001299
-:100C80000E0002598F4401408F42014416020004B5
-:100C90008FBF00148FB000100A00029127BD00180A
-:100CA000976200120A00030400000000976200141B
-:100CB0008F4301443042FFFF14620006240200010A
-:100CC0008FBF00148FB00010A76200140A00124AF0
-:100CD00027BD0018976200141440001D8FBF001438
-:100CE0000A00031C00000000976200168F430144B5
-:100CF0003042FFFF1462000B240200018FBF00147A
-:100D00008FB00010A76200160A000B1227BD001852
-:100D10009742007824420004A76200100A000322D0
-:100D20008FBF001497620016240300013042FFFFBA
-:100D3000144300078FBF00143C0208008C4200706F
-:100D4000244200013C010800AC2200708FBF001457
-:100D50008FB0001003E0000827BD001827BDFFE892
-:100D6000AFBF0014AFB000108F50010093620000BD
-:100D700093430109304400FF2402001F106200A5C4
-:100D80002862002010400018240200382862000A5F
-:100D90001040000C2402000B286200081040002CB8
-:100DA00000000000046000E52862000214400028F2
-:100DB00024020006106200268FBF00140A00041FE0
-:100DC0008FB000101062005E2862000B144000DC3F
-:100DD0008FBF00142402000E106200738FB0001049
-:100DE0000A00041F00000000106200C028620039E1
-:100DF0001040000A2402008024020036106200CA5B
-:100E000028620037104000B424020035106200C18F
-:100E10008FBF00140A00041F8FB000101062002B57
-:100E20002862008110400006240200C82402003914
-:100E3000106200B48FBF00140A00041F8FB00010AE
-:100E4000106200998FBF00140A00041F8FB00010B9
-:100E50003C0208008C420020104000B98FBF0014F3
-:100E60000E000493000000008F4201008F830020D9
-:100E70009745010C97460108AC6200008F420104BF
-:100E80003C04080094844B5E00052C00AC62000416
-:100E90008F4201180006340000C43025AC620008FF
-:100EA0008F42011C24040001AC62000C9342010A31
-:100EB00000A22825AC650010AC600014AC600018DE
-:100EC000AC66001C0A0003F58FBF00143C0208004A
-:100ED0008C4200201040009A8FBF00140E00049333
-:100EE00000000000974401083C03080094634B5E37
-:100EF0009745010C000422029746010E8F820020C4
-:100F0000000426000083202500052C003C030080FF
-:100F100000A6282500832025AC400000AC4000043A
-:100F2000AC400008AC40000CAC450010AC400014D4
-:100F3000AC400018AC44001C0A0003F42404000177
-:100F40009742010C14400015000000009362000558
-:100F50003042001014400011000000000E0002504A
-:100F6000020020219362000502002021344200107B
-:100F70000E000259A36200059362000024030020C2
-:100F8000304200FF1043006D020020218FBF00148B
-:100F90008FB000100A000FC027BD00180000000D20
-:100FA0000A00041E8FBF00143C0208008C4200207F
-:100FB000104000638FBF00140E0004930000000077
-:100FC0008F4201048F8300209744010C3C050800E8
-:100FD00094A54B5EAC6200009762002C00042400D4
-:100FE0003042FFFF008220253C02400E00A228254F
-:100FF000AC640004AC600008AC60000CAC60001095
-:10100000AC600014AC600018AC65001C0A0003F46E
-:10101000240400010E00025002002021A7600008F5
-:101020000E00025902002021020020210E00025E63
-:10103000240500013C0208008C42002010400040C2
-:101040008FBF00140E000493000000009742010CB3
-:101050008F8300203C05080094A54B5E000214001D
-:10106000AC700000AC620004AC6000088F64004CFF
-:101070003C02401F00A22825AC64000C8F62005087
-:1010800024040001AC6200108F620054AC620014B2
-:10109000AC600018AC65001C8FBF00148FB000104E
-:1010A0000A0004B827BD0018240200205082002541
-:1010B0008FB000100E000F0A020020211040002007
-:1010C0008FBF0014020020218FB0001000002821E3
-:1010D0000A00025E27BD0018020020218FBF001405
-:1010E0008FB000100A00058027BD00189745010C3D
-:1010F000020020218FBF00148FB000100A0005A04D
-:1011000027BD0018020020218FB000100A0005C57D
-:1011100027BD00189345010D020020218FB000105B
-:101120000A00060F27BD0018020020218FBF0014FF
-:101130008FB000100A0005EB27BD00188FBF001408
-:101140008FB0001003E0000827BD00188F4202781E
-:101150000440FFFE2402000234840080AF440240B9
-:10116000A34202443C02100003E00008AF420278B0
-:101170003C04080094844B6A3C0208008C424B7487
-:101180003083FFFF000318C000431021AF42003C32
-:101190003C0208008C424B70AF4200383C020050C9
-:1011A00034420008AF4200300000000000000000A0
-:1011B000000000008F420000304200201040FFFD80
-:1011C000000000008F4204003C010800AC224B608C
-:1011D0008F4204043C010800AC224B643C02002016
-:1011E000AF420030000000003C02080094424B680F
-:1011F0003C03080094634B6C3C05080094A54B6EBF
-:1012000024840001004310213083FFFF3C010800CB
-:10121000A4224B683C010800A4244B6A1465000317
-:10122000000000003C010800A4204B6A03E0000815
-:10123000000000003C05000A27BDFFE80345282107
-:101240003C04080024844B50AFBF00100E00051D65
-:101250002406000A3C02080094424B523C0308005A
-:1012600094634B6E3042000F244200030043180485
-:1012700024027FFF0043102B10400002AF83001CAC
-:101280000000000D0E00042A000000003C020800CF
-:1012900094424B5A8FBF001027BD001803E000088E
-:1012A000A74200A23C02000A034210219443000618
-:1012B0003C02080094424B5A3C010800A4234B56C0
-:1012C000004310238F83001C00021400000214034B
-:1012D0000043102B03E000083842000127BDFFE85F
-:1012E000AFBF00103C02000A0342102194420006E6
-:1012F0003C010800A4224B560E00047700000000B9
-:101300005440FFF93C02000A8FBF001003E00008C0
-:1013100027BD001827BDFFE8AFBF00100E000477FF
-:101320000000000010400003000000000E000485D3
-:10133000000000003C0208008C424B608FBF001090
-:1013400027430400AF4200383C0208008C424B6443
-:1013500027BD0018AF830020AF42003C3C020005CF
-:10136000AF42003003E00008AF8000188F82001801
-:101370003C0300060002114000431025AF4200303C
-:101380000000000000000000000000008F4200008C
-:10139000304200101040FFFD27420400AF820020C1
-:1013A00003E00008AF8000183C0608008CC64B64C0
-:1013B0008F8500188F8300203C02080094424B5A0E
-:1013C00027BDFFE024A50001246300202442000182
-:1013D00024C70020AFB10014AFB00010AFBF001899
-:1013E000AF850018AF8300203C010800A4224B5AAF
-:1013F000309000FF3C010800AC274B6404C100089A
-:101400000000882104E00006000000003C02080003
-:101410008C424B60244200013C010800AC224B602E
-:101420003C02080094424B5A3C03080094634B680A
-:101430000010202B004310262C42000100441025F0
-:10144000144000048F830018240200101462000F5F
-:10145000000000000E0004A9241100013C03080054
-:1014600094634B5A3C02080094424B681462000398
-:10147000000000000E00042A000000001600000317
-:10148000000000000E000493000000003C03080070
-:1014900094634B5E3C02080094424B5C2463000161
-:1014A0003064FFFF3C010800A4234B5E148200035C
-:1014B000000000003C010800A4204B5E1200000662
-:1014C000000000003C02080094424B5AA74200A2D0
-:1014D0000A00050B022010210E0004770000000016
-:1014E00010400004022010210E00048500000000BE
-:1014F000022010218FBF00188FB100148FB0001090
-:1015000003E0000827BD00203084FFFF30A5FFFF67
-:101510000000182110800007000000003082000148
-:101520001040000200042042006518210A00051343
-:101530000005284003E000080060102110C00006EC
-:1015400024C6FFFF8CA2000024A50004AC8200008A
-:101550000A00051D2484000403E0000800000000C8
-:1015600010A0000824A3FFFFAC86000000000000CC
-:10157000000000002402FFFF2463FFFF1462FFFA53
-:101580002484000403E0000800000000240200019D
-:10159000AF62000CA7620010A7620012A7620014DD
-:1015A00003E00008A76200163082007F034210218A
-:1015B0003C08000E004818213C0208008C42002024
-:1015C00027BDFFD82407FF80AFB3001CAFB20018BF
-:1015D000AFB10014AFB00010AFBF00200080802179
-:1015E00030B100FF0087202430D200FF1040002FD0
-:1015F00000009821AF44002C9062000024030050AA
-:10160000304200FF1443000E000000003C020800BE
-:101610008C4200E00202102100471024AF42002C4F
-:101620003C0208008C4200E0020210213042007FA0
-:101630000342102100481021944200D43053FFFF90
-:101640000E000493000000003C02080094424B5E30
-:101650008F8300200011340000C2302500122C00BE
-:101660003C02400000C2302534A50001AC700000EF
-:101670008FBF0020AC6000048FB20018AC7300086C
-:101680008FB10014AC60000C8FB3001CAC6500106F
-:101690008FB00010AC60001424040001AC6000188E
-:1016A00027BD00280A0004B8AC66001C8FBF0020CC
-:1016B0008FB3001C8FB200188FB100148FB00010D0
-:1016C00003E0000827BD00289343010F2402001007
-:1016D0001062000E2865001110A0000724020012FD
-:1016E000240200082405003A1062000600003021A0
-:1016F00003E0000800000000240500351462FFFC30
-:10170000000030210A000538000000008F420074FC
-:1017100024420FA003E00008AF62000C27BDFFE8E1
-:10172000AFBF00100E00025E240500018FBF001045
-:1017300024020001A762001227BD00182402000144
-:1017400003E00008A360002227BDFFE0AFB1001452
-:10175000AFB00010AFBF001830B1FFFF0E00025055
-:10176000008080219362003F24030004304200FF88
-:101770001443000C02002021122000082402000A59
-:101780000E00053100000000936200052403FFFEF7
-:1017900000431024A362000524020012A362003F4C
-:1017A000020020210E000259A360008116200003D0
-:1017B000020020210E0005950000000002002021FB
-:1017C000322600FF8FBF00188FB100148FB00010B9
-:1017D000240500380A00053827BD002027BDFFE09A
-:1017E000AFBF001CAFB20018AFB10014AFB0001013
-:1017F0000E000250008080210E0005310000000024
-:101800009362003F24120018305100FF123200038F
-:101810000200202124020012A362003F936200050F
-:101820002403FFFE004310240E000259A3620005AA
-:10183000020020212405002016320007000030217C
-:101840008FBF001C8FB200188FB100148FB0001032
-:101850000A00025E27BD00208FBF001C8FB2001857
-:101860008FB100148FB00010240500390A0005382C
-:1018700027BD002027BDFFE8AFB00010AFBF0014A8
-:101880009742010C2405003600808021144000108E
-:10189000304600FF0E00025000000000240200123B
-:1018A000A362003F93620005344200100E00053130
-:1018B000A36200050E00025902002021020020212F
-:1018C0000E00025E240500200A000604000000004D
-:1018D0000E000538000000000E000250020020211A
-:1018E000936200232403FF9F020020210043102461
-:1018F0008FBF00148FB00010A36200230A000259AA
-:1019000027BD001827BDFFE0AFBF0018AFB100141E
-:10191000AFB0001030B100FF0E00025000808021F7
-:10192000240200120E000531A362003F0E0002598E
-:101930000200202102002021022030218FBF001848
-:101940008FB100148FB00010240500350A0005384F
-:1019500027BD0020A380002C03E00008A380002DF9
-:101960008F4202780440FFFE8F820034AF42024073
-:1019700024020002A34202443C02100003E00008DB
-:10198000AF4202783C0360008C6254003042000891
-:101990001440FFFD000000008C625408AF82000C70
-:1019A00024020052AC605408AC645430AC6254342D
-:1019B0002402000803E00008AC6254003C0260000E
-:1019C0008C42540030420008104000053C03600087
-:1019D0008C625400304200081440FFFD00000000FB
-:1019E0008F83000C3C02600003E00008AC43540805
-:1019F00090A3000024020005008040213063003FD6
-:101A000000004821146200050000502190A2001C33
-:101A100094A3001E304900FF306AFFFFAD00000CA8
-:101A2000AD000010AD000024950200148D05001CCF
-:101A30008D0400183042FFFF0049102300021100FE
-:101A4000000237C3004038210086202300A2102B5B
-:101A50000082202300A72823AD05001CAD04001838
-:101A6000A5090014A5090020A50A001603E0000836
-:101A7000A50A00228F4201F80440FFFE2402000262
-:101A8000AF4401C0A34201C43C02100003E00008BF
-:101A9000AF4201F83C0208008C4200B427BDFFE8C9
-:101AA000AFBF001424420001AFB000103C01080099
-:101AB000AC2200B48F4300243C02001F30AA00FF78
-:101AC0003442FF8030D800FF006280240080F8217B
-:101AD00030EF00FF1158003B01405821240CFF80DB
-:101AE0003C19000A3163007F000310C00003194055
-:101AF000006218213C0208008C4200DC25680001CD
-:101B0000310D007F03E21021004310213043007F9C
-:101B100003431821004C102400794821AF420024CF
-:101B20008D220024016C1824006C7026AD22000C5C
-:101B30008D220024310800FFAD22001095220014F0
-:101B4000952300208D27001C3042FFFF3063FFFFEC
-:101B50008D2600180043102300021100000227C345
-:101B60000040282100C4302300E2102B00C23023A3
-:101B700000E53823AD27001CAD2600189522002073
-:101B8000A522001495220022154B000AA52200165A
-:101B90008D2300248D220008254600013145008058
-:101BA0001462000430C4007F108F000238AA008045
-:101BB00000C0502151AF000131C800FF1518FFC906
-:101BC000010058218F8400343082007F03421821A5
-:101BD0003C02000A006218212402FF8000822024B7
-:101BE000AF440024A06A0079A06A00838C62005090
-:101BF0008F840034AC6200708C6500743C027FFFFF
-:101C00003442FFFF00A228240E00066BAC6500746E
-:101C1000AF5000248FBF00148FB0001003E0000805
-:101C200027BD001827BDFFC0AFBE0038AFB70034D6
-:101C3000AFB5002CAFB20020AFB1001CAFB00018A0
-:101C4000AFBF003CAFB60030AFB40028AFB3002444
-:101C50008F4500248F4600288F43002C3C02001F34
-:101C60003442FF800062182400C230240080A82182
-:101C7000AFA3001400A2F0240E00062FAFA60010A0
-:101C80003C0208008C4200E02410FF8003608821A1
-:101C900002A2102100501024AF4200243C02080090
-:101CA0008C4200E002A210213042007F0342182142
-:101CB0003C02000A00629021924200D293630084A9
-:101CC000305700FF306300FF24020001106200342F
-:101CD000036020212402000214620036000000008C
-:101CE0000E001216024028219223008392220083C4
-:101CF0003063007F3042007F000210C000031940B3
-:101D0000006218213C0208008C4200DC02A2102173
-:101D10000043382100F01024AF42002892250078BB
-:101D20009224008330E2007F034218213C02000C21
-:101D300014850007006280212402FFFFA24200F107
-:101D40002402FFFFA64200F20A0007272402FFFF39
-:101D500096020020A24200F196020022A64200F262
-:101D60008E020024AE4200F492220083A24200F0D0
-:101D70008E4200C8AE4200FC8E4200C4AE4200F863
-:101D80008E220050AE4201008E4200CCAE420104D1
-:101D9000922200853042003F0A0007823442004010
-:101DA0000E00123902402821922200850A00078283
-:101DB0003042003F936200852403FFDF3042003F42
-:101DC000A36200859362008500431024A36200850E
-:101DD0009363008393620078307400FF304200FF09
-:101DE00010540036240AFF803C0C000C3283007F24
-:101DF000000310C000031940006218213C020800D3
-:101E00008C4200DC268800013109007F02A21021EB
-:101E10000043382130E2007F0342182100EA1024F9
-:101E2000AF420028006C80218E020024028A182410
-:101E3000006A5826AE02000C8E020024310800FF12
-:101E4000AE02001096020014960300208E07001CBC
-:101E50003042FFFF3063FFFF8E060018004310235F
-:101E600000021100000227C30040282100C43023D3
-:101E700000E2102B00C2302300E53823AE07001C1F
-:101E8000AE06001896020020A60200149602002258
-:101E9000A602001692220079304200FF105400077B
-:101EA0000000000051370001316800FF92220078E5
-:101EB000304200FF1448FFCD0100A0219222008390
-:101EC000A22200798E2200500A0007E2AE220070A2
-:101ED000A22200858E22004C2405FF80AE42010C18
-:101EE0009222008534420020A2220085924200D135
-:101EF0003C0308008C6300DC305400FF3C02080007
-:101F00008C4200E400143140001420C002A31821C8
-:101F100000C4202102A210210064382100461021B3
-:101F20000045182400E52824AF450028AF43002CC5
-:101F30003042007F924400D030E3007F03422821EA
-:101F4000034318213C02000C006280213C02000E79
-:101F5000309600FF00A298211296002A000000008F
-:101F60008E02000C02002021026028211040002572
-:101F7000261000280E00064A000000009262000DA4
-:101F800026830001307400FF3042007FA262000D02
-:101F90002404FF801697FFF0267300203C020800FF
-:101FA0008C4200DC0000A02102A210210044102479
-:101FB000AF4200283C0208008C4200E43C030800C9
-:101FC0008C6300DC02A2102100441024AF42002CDC
-:101FD0003C0208008C4200E402A318213063007F19
-:101FE00002A210213042007F034220210343182126
-:101FF0003C02000C006280213C02000E0A0007A493
-:10200000008298218E4200D8AE2200508E4200D825
-:10201000AE22007092250083924600D19223008365
-:10202000924400D12402FF8000A228243063007F64
-:10203000308400FF00A628250064182A10600002E2
-:1020400030A500FF38A50080A2250083A2250079D5
-:102050000E00063D000000009222007E02A020211A
-:10206000A222007A8E2300743C027FFF3442FFFFDD
-:10207000006218240E00066BAE2300748FA20010BD
-:10208000AF5E00248FBF003CAF4200288FBE0038F7
-:102090008FA200148FB700348FB600308FB5002C9C
-:1020A0008FB400288FB300248FB200208FB1001CA2
-:1020B0008FB0001827BD004003E00008AF42002C9D
-:1020C00090A2000024420001A0A200003C030800EE
-:1020D0008C6300F4304200FF1443000F0080302175
-:1020E000A0A000003C0208008C4200E48F84003471
-:1020F000008220213082007F034218213C02000C24
-:10210000006218212402FF8000822024ACC300005A
-:1021100003E00008AF4400288C8200002442002025
-:1021200003E00008AC82000094C200003C080800F4
-:10213000950800CA30E7FFFF008048210102102106
-:10214000A4C2000094C200003042FFFF00E2102B46
-:1021500054400001A4C7000094A200003C03080002
-:102160008C6300CC24420001A4A2000094A20000D1
-:102170003042FFFF544300078F8600280107102BD1
-:10218000A4A000005440000101003821A4C70000B1
-:102190008F8600288CC4001CAF44003C94A2000031
-:1021A0008F43003C3042FFFF000210C00062182144
-:1021B000AF43003C8F42003C008220231880000483
-:1021C000000000008CC200180A00084324420001ED
-:1021D0008CC20018AF4200383C020050344200105C
-:1021E000AF420030000000000000000000000000CE
-:1021F0008F420000304200201040FFFD0000000030
-:102200008F420404AD2200048F420400AD2200007E
-:102210003C020020AF42003003E000080000000054
-:1022200027BDFFE0AFB20018AFB10014AFB000108F
-:10223000AFBF001C94C2000000C080213C12080007
-:10224000965200C624420001A60200009603000038
-:1022500094E2000000E03021144300058FB100300B
-:102260000E000818024038210A000875000000001E
-:102270008C8300048C820004244200400461000727
-:10228000AC8200048C8200040440000400000000C2
-:102290008C82000024420001AC8200009602000003
-:1022A0003042FFFF50520001A600000096220000BD
-:1022B00024420001A62200008F82002896230000FD
-:1022C00094420016144300048FBF001C2402000136
-:1022D000A62200008FBF001C8FB200188FB100141F
-:1022E0008FB0001003E0000827BD00208F89002870
-:1022F00027BDFFE0AFBF00188D220028274804004B
-:1023000030E700FFAF4200388D22002CAF8800304C
-:10231000AF42003C3C020005AF420030000000002C
-:1023200000000000000000000000000000000000AD
-:10233000000000008C82000C8C82000CAD020000BA
-:102340008C820010AD0200048C820018AD020008DF
-:102350008C82001CAD02000C8CA20014AD02001097
-:102360008C820020AD02001490820005304200FFF4
-:1023700000021200AD0200188CA20018AD02001C71
-:102380008CA2000CAD0200208CA20010AD02002433
-:102390008CA2001CAD0200288CA20020AD02002CF3
-:1023A000AD060030AD000034978300263402FFFFF5
-:1023B00014620002006020213404FFFF10E00011CD
-:1023C000AD04003895230036952400362402000120
-:1023D0003063FFFF000318C20069182190650040B8
-:1023E000308400070082100400451025A0620040E0
-:1023F0008F820028944200563042FFFF0A0008DC1A
-:10240000AD02003C952300369524003624020001DD
-:102410003063FFFF000318C2006918219065004077
-:1024200030840007008210040002102700451024A9
-:10243000A0620040AD00003C000000000000000071
-:10244000000000003C02000634420040AF42003071
-:102450000000000000000000000000008F420000AB
-:10246000304200101040FFFD8F860028AF880030FA
-:1024700024C2005624C7003C24C4002824C50032CE
-:1024800024C600360E000856AFA200108FBF0018F9
-:1024900003E0000827BD00208F8300243C060800CD
-:1024A0008CC600E88F82003430633FFF0003198040
-:1024B00000461021004310212403FF803046007F96
-:1024C00000431024AF420028034618213C02000CB0
-:1024D0000062302190C2000D30A500FF00003821BD
-:1024E00034420010A0C2000D8F8900288F8A00247A
-:1024F00095230036000A13823048000324020001AD
-:10250000A4C3000E1102000B2902000210400005B6
-:10251000240200021100000C240300010A0009201B
-:102520000000182111020006000000000A00092026
-:10253000000018218CC2002C0A000920244300014D
-:102540008CC20014244300018CC200180043102BDD
-:1025500050400009240700012402002714A20003B0
-:10256000000000000A00092C240700019522003E0B
-:1025700024420001A522003E000A138230430003DA
-:102580002C62000210400009008028211460000421
-:102590000000000094C200360A00093C3046FFFFEC
-:1025A0008CC600380A00093C008028210000302138
-:1025B0003C04080024844B780A00088900000000CD
-:1025C000274901008D22000C9523000601202021BF
-:1025D000000216023046003F3063FFFF240200274E
-:1025E00000C0282128C7002810C2000EAF83002495
-:1025F00010E00008240200312402002110C200096A
-:102600002402002510C200079382002D0A00095BF6
-:102610000000000010C200059382002D0A00095B33
-:10262000000000000A0008F4000000000A0006266E
-:102630000000000095230006912400058D25000C64
-:102640008D2600108D2700188D28001C8D29002054
-:10265000244200013C010800A4234B7E3C010800F9
-:10266000A0244B7D3C010800AC254B843C010800B4
-:10267000AC264B883C010800AC274B903C0108007D
-:10268000AC284B943C010800AC294B9803E00008AF
-:10269000A382002D8F87002827BDFFC0AFB3003471
-:1026A000AFB20030AFB1002CAFB00028AFBF0038E0
-:1026B0003C0208008C4200D094E3003030B0FFFFB1
-:1026C000005010073045FFFF3063FFFF00C0982126
-:1026D000A7A200103C110800963100C614A3000602
-:1026E0003092FFFF8CE2002424420030AF42003CD5
-:1026F0000A0009948CE2002094E200323042FFFF8D
-:1027000054A2000827A400188CE2002C24420030B8
-:10271000AF42003C8CE20028AF4200380A0009A218
-:102720008F84002827A5001027A60020022038212A
-:102730000E000818A7A000208FA200182442003025
-:10274000AF4200388FA2001CAF42003C8F840028AB
-:102750003C020005AF42003094820034274304005D
-:102760003042FFFF0202102B14400007AF830030FD
-:1027700094820054948300340202102100431023F9
-:102780000A0009B63043FFFF94830054948200345A
-:102790000223182100501023006218233063FFFF2A
-:1027A000948200163042FFFF144300030000000033
-:1027B0000A0009C424030001948200163042FFFF7E
-:1027C0000043102B104000058F82003094820016C9
-:1027D000006210233043FFFF8F820030AC530000B3
-:1027E000AC400004AC520008AC43000C3C020006B4
-:1027F00034420010AF420030000000000000000032
-:10280000000000008F420000304200101040FFFD29
-:10281000001018C2006418219065004032040007BF
-:10282000240200018FBF00388FB300348FB2003014
-:102830008FB1002C8FB000280082100400451025B5
-:1028400027BD004003E00008A062004027BDFFA8AC
-:10285000AFB60050AFB5004CAFB40048AFB30044C2
-:10286000AFB1003CAFBF0054AFB20040AFB00038D2
-:102870008C9000003C0208008C4200E88F860034F7
-:10288000960300022413FF8000C2302130633FFF13
-:102890000003198000C3382100F3102490B2000017
-:1028A000AF42002C9203000230E2007F034230214D
-:1028B0003C02000E00C28821306300C024020040A8
-:1028C0000080A82100A0B021146200260000A021F1
-:1028D0008E3400388E2200181440000224020001B9
-:1028E000AE2200189202000D304200201440001564
-:1028F0008F8200343C0308008C6300DC001238C077
-:10290000001231400043102100C730210046382119
-:1029100030E300073C02008030E6007800C230253A
-:102920000343182100F31024AF4208002463090078
-:10293000AF4608108E2200188C6300080043102157
-:10294000AE2200188E22002C8E2300182442000193
-:102950000062182B1060003D000000000A000A7899
-:1029600000000000920300022402FFC00043102474
-:10297000304200FF1440000524020001AE2200187E
-:10298000962200360A000A613054FFFF8E2200149E
-:1029900024420001AE22001892020000000216003C
-:1029A0000002160304410029000000009602000204
-:1029B00027A4001000802821A7A20016960200027A
-:1029C00024070001000030213042FFFFAF820024C5
-:1029D0000E000889AFA0001C960300023C0408000A
-:1029E0008C8400E88F82003430633FFF000319803D
-:1029F00000441021004310213043007F3C05000CAF
-:102A00000053102403431821AF4200280065182109
-:102A10009062000D001221403042007FA062000D44
-:102A20003C0308008C6300E48F82003400431021D3
-:102A30000044382130E2007F03421021004510217C
-:102A400000F31824AF430028AEA200009222000D2C
-:102A5000304200101040001302A020218F83002874
-:102A60008EA40000028030219462003E2442FFFFC9
-:102A7000A462003E948400029625000E3084FFFF7D
-:102A80000E00097330A5FFFF8F82002894430034A5
-:102A90009622000E1443000302A02021240200010C
-:102AA000A382002C02C028210E0007FE00000000B7
-:102AB0008FBF00548FB600508FB5004C8FB40048C4
-:102AC0008FB300448FB200408FB1003C8FB000380C
-:102AD00003E0000827BD00588F82002827BDFFD0E3
-:102AE000AFB40028AFB20020AFBF002CAFB30024BA
-:102AF000AFB1001CAFB00018904400D0904300D19B
-:102B00000000A021309200FFA3A30010306300FF5B
-:102B10008C5100D88C5300DC1072002B2402000171
-:102B20003C0308008C6300E493A400108F820034FF
-:102B30002406FF800004214000431021004410219E
-:102B40003043007F00461024AF4200280343182181
-:102B50003C02000C006218218C62000427A40014BF
-:102B600027A50010022280210270102304400015C6
-:102B7000AFA300149062000D00C21024304200FF89
-:102B800014400007020088219062000D344200408A
-:102B90000E0007FEA062000D0A000ABD93A20010FD
-:102BA0000E0009E1241400018F830028AC7000D8C6
-:102BB00093A20010A06200D193A200101452FFD87B
-:102BC0000000000024020001168200048FBF002CC8
-:102BD0000E000626000000008FBF002C8FB40028D6
-:102BE0008FB300248FB200208FB1001C8FB000186B
-:102BF00003E0000827BD003027BDFFD8AFB3001C9D
-:102C0000AFB20018AFB10014AFB00010AFBF0020DA
-:102C10000080982100E0802130B1FFFF0E00049376
-:102C200030D200FF000000000000000000000000A3
-:102C30008F820020AC510000AC520004AC5300085D
-:102C4000AC40000CAC400010AC400014AC4000188C
-:102C50003C03080094634B5E02038025AC50001CCB
-:102C6000000000000000000000000000240400013B
-:102C70008FBF00208FB3001C8FB200188FB10014DB
-:102C80008FB000100A0004B827BD002827BDFFE858
-:102C9000AFB00010AFBF001430A5FFFF30C600FF7B
-:102CA0000080802124020C80AF420024000000003C
-:102CB0000000000000000000000000000000000014
-:102CC0000E000ACC000000003C040800248400E050
-:102CD0008C8200002403FF808FBF001402021021A9
-:102CE00000431024AF4200248C8200003C03000A01
-:102CF000020280213210007F035010218FB000109B
-:102D00000043102127BD001803E00008AF8200280F
-:102D100027BDFFE8AFBF00108F4401403C0308000F
-:102D20008C6300E02402FF80AF840034008318210C
-:102D300000621024AF4200243C02000803424021FC
-:102D4000950500023063007F3C02000A034318210E
-:102D50000062182130A5FFFF3402FFFF0000302180
-:102D60003C07602010A20006AF8300282402FFFF6A
-:102D7000A5020002946500D40E000AF130A5FFFF01
-:102D80008FBF001024020C8027BD001803E000084C
-:102D9000AF4200243C020008034240219502000299
-:102DA0003C0A0800954A00C63046FFFF14C00007E1
-:102DB0003402FFFF8F8200288F8400343C0760209C
-:102DC000944500D40A000B5A30A5FFFF10C200241E
-:102DD0008F87002894E2005494E400163045FFFFEA
-:102DE00000A6102300A6182B3089FFFF10600004F6
-:102DF0003044FFFF00C51023012210233044FFFFA1
-:102E0000008A102B1040000C012A1023240200011C
-:102E1000A50200162402FFFFA502000294E500D4DB
-:102E20008F8400340000302130A5FFFF3C07602074
-:102E30000A000AF1000000000044102A10400008B7
-:102E4000000000009502001630420001104000040E
-:102E5000000000009742007E24420014A5020016E4
-:102E600003E00008000000008F84002827BDFFE079
-:102E7000AFBF0018948200349483003E1060001AA3
-:102E80003048FFFF9383002C2402000114620027C6
-:102E90008FBF00188F820028000818C23108000771
-:102EA000006218212447003A244900542444002099
-:102EB000244500302446003490620040304200FF38
-:102EC0000102100730420001104000168FBF0018A9
-:102ED0000E000856AFA900108F82002894420034DB
-:102EE0000A000B733048FFFF94830036948200344D
-:102EF0001043000E8FBF001894820036A482003465
-:102F000094820056A48200548C82002CAC8200244F
-:102F100094820032A48200309482003CA482003A61
-:102F20008FBF00180A000B3327BD002003E0000804
-:102F300027BD002027BDFFE8AFBF00108F4A01006A
-:102F40003C0508008CA500E03C02080090424B8440
-:102F50003C0C0800958C4B7E01452821304B003FEE
-:102F600030A2007F03424021396900323C02000A4E
-:102F70003963003F2C630001010240212D2900012B
-:102F80002402FF8000A2282401234825AF8A0034B0
-:102F900000801821AF450024000030210080282146
-:102FA00024070001AF8800283C04080024844B78E3
-:102FB000AF8C002415200007A380002D24020020E0
-:102FC0005562000F006020213402FFFF5582000C83
-:102FD000006020212402002015620005000000008E
-:102FE0008C6300142402FFFF106200070000000041
-:102FF0000E000889000000000A000BD0000000004D
-:103000000E0008F4016028210E000B68000000008B
-:103010008FBF001024020C8027BD001803E00008B9
-:10302000AF4200243C0208008C4200E027BDFFA014
-:10303000AFB1003C008210212411FF80AFBE0058C8
-:10304000AFB70054AFB20040AFB00038AFBF005CC4
-:10305000AFB60050AFB5004CAFB40048AFB30044BA
-:10306000005110248F4800248F4900288F470028E2
-:10307000AF4200243C0208008C4200E00080902116
-:1030800024060006008210213042007F03421821EE
-:103090003C02000A006280213C02001F3442FF8093
-:1030A00000E2382427A40010260500F00122F024B5
-:1030B0000102B8240E00051DAFA700308FA2001832
-:1030C000AE0200C48FA2001CAE0200C88FA2002472
-:1030D000AE0200CC93A40010920300D12402FF8022
-:1030E0000082102400431025304900FF3083007F08
-:1030F0003122007F0062102A10400004000310C03B
-:1031000001311026304900FF000310C000031940B0
-:10311000006218213C0208008C4200DC920400D2BC
-:10312000024210210043102100511024AF42002818
-:1031300093A300103063007F000310C00003194008
-:10314000006218213C0208008C4200DC024210217F
-:10315000004310213042007F034218213C02000C42
-:10316000006240218FA300142402FFFF1062003090
-:10317000309500FF93A2001195030014304400FF26
-:103180003063FFFF0064182B1060000D000000008A
-:10319000950400148D07001C8D0600183084FFFF75
-:1031A00000442023000421000000102100E4382105
-:1031B00000E4202B00C230210A000C4A00C4302158
-:1031C000950400148D07001C8D0600183084FFFF45
-:1031D000008220230004210000001021008018211B
-:1031E00000C2302300E4202B00C4302300E3382346
-:1031F000AD07001CAD06001893A20011A502001433
-:1032000097A20012A50200168FA20014AD020010B2
-:103210008FA20014AD02000C93A20011A5020020A1
-:1032200097A20012A50200228FA20014AD02002472
-:103230002406FF80024610243256007FAF4200244D
-:10324000035618213C02000A006280218E02004CC5
-:103250008FA200203124007F000428C0AE0200505D
-:103260008FA200200004214000852821AE020070BA
-:1032700093A2001001208821A202008393A20010D3
-:10328000A2020079920200853042003FA20200852E
-:103290003C0208008C4200DC024210210045102153
-:1032A00000461024AF42002C3C0208008C4200E48F
-:1032B0003C0308008C6300DC024210210044102112
-:1032C00000461024AF4200283C0208008C4200E473
-:1032D00002431821006518210242102100441021E8
-:1032E0003042007F3063007F93A50010034220210D
-:1032F000034318213C02000E006240213C02000CF6
-:1033000010B1008C008248213233007F1660001912
-:103310002404FF803C0208008C4200DC02421021A1
-:1033200000441024AF42002C3C0208008C4200E410
-:103330003C0308008C6300DC02421021004410248E
-:10334000AF4200283C0208008C4200E402431821EE
-:103350003063007F024210213042007F034220216F
-:10336000034318213C02000E006240213C02000C85
-:10337000008248219124000D2414FF8000001021B8
-:1033800000942025A124000D950400029505001449
-:103390008D07001C3084FFFF30A5FFFF8D0600184D
-:1033A000008520230004210000E4382100C23021E0
-:1033B00000E4202B00C43021AD07001CAD0600182E
-:1033C00095020002A5020014A50000168D02000857
-:1033D000AD0200108D020008AD02000C9502000243
-:1033E000A5020020A50000228D020008AD020024E5
-:1033F0009122000D30420040104000422622000180
-:103400003C0208008C4200E0A3B300283C10000AF4
-:103410000242102100541024AF4200243C02080054
-:103420008C4200E0A380002C27A4002C0242102133
-:103430003042007F03421821007018218C6200D8AE
-:103440008D26000427A50028AFA9002C00461021D6
-:10345000AC6200D80E0009E1AF83002893A30028D6
-:103460008F8200280E000626A04300D10E000B68B4
-:103470000000000002541024AF4200243C02080067
-:103480008C4200DC00132940001320C000A420213E
-:10349000024210210044102100541024AF42002C9D
-:1034A0003C0208008C4200E43C0308008C6300DC12
-:1034B00003563021024210210045102100541024EF
-:1034C000AF4200283C0208008C4200E4024318216D
-:1034D0000064182102421021004510213042007F73
-:1034E0003063007F03422021034318213C02000E79
-:1034F000006240213C02000C00D080210082482163
-:10350000262200013043007F14750005304400FF7F
-:103510002403FF800223102400431026304400FFC0
-:1035200093A2001000808821250800281444FF760B
-:103530002529002093A400108FA300142402FFFF6C
-:103540001062000A308900FF2482000124830001F8
-:103550003042007F14550005306900FF2403FF80CE
-:103560000083102400431026304900FF92020078A7
-:10357000305300FF11330032012088213C02080043
-:103580008C4200DC3225007F000520C00005294068
-:1035900000A42021024210212406FF8000441021B3
-:1035A00000461024AF42002C3C0308008C6300DC72
-:1035B0003C0208008C4200E4024318210242102120
-:1035C0000045102100641821004610243063007F5C
-:1035D000AF420028034318213C02000E0062402144
-:1035E0003C0208008C4200E48D06000C0100202102
-:1035F00002421021004510213042007F0342182171
-:103600003C02000C0062482110C0000D012028215E
-:103610000E00064A000000002402FF800222182447
-:1036200026240001006228263082007F1455000203
-:10363000308300FF30A300FF1473FFD000608821A7
-:103640008E0300743C027FFF3442FFFF00621824A7
-:10365000AE0300740E00066B02402021AF57002419
-:103660008FA20030AF5E00288FBF005C8FBE005875
-:103670008FB700548FB600508FB5004C8FB4004800
-:103680008FB300448FB200408FB1003C8FB0003840
-:1036900027BD006003E00008AF42002C27BDFFD823
-:1036A000AFB1001CAFBF0020AFB000182751018898
-:1036B000922200032408FF803C03000A3047007F69
-:1036C000A3A700108F4601803C0208008C4200E056
-:1036D000AF86003400C2282100A81024AF42002485
-:1036E0009224000030A2007F0342102100431021E9
-:1036F000AF8200283084007F24020002148200255B
-:10370000000719403C0208008C4200E400C210216E
-:103710000043282130A2007F0342182100A8102472
-:10372000AF4200283C02000C006218219062000D9C
-:10373000AFA3001400481025A062000D8FA3001451
-:103740009062000D304200405040006A8FBF002060
-:103750008F860028A380002C27A400148CC200D8D8
-:103760008C63000427A50010004310210E0009E11E
-:10377000ACC200D893A300108F8200280E0006264A
-:10378000A04300D10E000B68000000000A000E0BE1
-:103790008FBF00200E00062F00C020210E00063D26
-:1037A000000000003C020008034280219223000137
-:1037B0009202007B1443004F8FBF00209222000032
-:1037C0003044007F24020004108200172882000584
-:1037D00010400006240200052402000310820007A6
-:1037E0008FB1001C0A000E0C0000000010820012B5
-:1037F0008FBF00200A000E0C8FB1001C92050083C1
-:10380000920600788E0700748F84003430A500FF84
-:1038100000073E0230C600FF0E00067330E7007F4F
-:103820000A000E0B8FBF00200E000BD78F840034D0
-:103830000A000E0B8FBF002024020C80AF42002430
-:103840009202003E30420040104000200000000084
-:103850009202003E00021600000216030441000618
-:10386000000000008F8400340E0005A024050093A2
-:103870000A000E0B8FBF00209202003F24030018A5
-:10388000304200FF1443000C8F84003424050039BB
-:103890000E000538000030210E0002508F840034E5
-:1038A00024020012A202003F0E0002598F8400344D
-:1038B0000A000E0B8FBF0020240500360E000538CD
-:1038C000000030210A000E0B8FBF00200E000250B6
-:1038D0008F8400349202000534420020A2020005C9
-:1038E0000E0002598F8400340E000FC08F84003404
-:1038F0008FBF00208FB1001C8FB0001824020C80F5
-:1039000027BD002803E00008AF42002427BDFFE8E0
-:10391000AFB00010AFBF001427430100946200084D
-:103920000002140000021403044100020000802180
-:103930002410000194620008304200801040001AF8
-:10394000020010219462000830422000104000164E
-:10395000020010218C6300183C021C2D344219ED2A
-:10396000240600061062000F3C0760213C0208009C
-:103970008C4200D4104000078F8200288F830028DB
-:10398000906200623042000F34420040A062006248
-:103990008F8200288F840034944500D40E000AF1F1
-:1039A00030A5FFFF020010218FBF00148FB0001060
-:1039B00003E0000827BD001827BDFFE0AFB10014E9
-:1039C000AFB00010A380002CAFBF00188F450100DE
-:1039D0003C0308008C6300E02402FF80AF850034C4
-:1039E00000A318213064007F0344202100621824C2
-:1039F0003C02000A00822021AF430024275001002E
-:103A00008E0200148C8300DCAF8400280043102356
-:103A100018400004000088218E0200140E000A8461
-:103A2000AC8200DC9202000B24030002304200FF53
-:103A30001443002F0000000096020008304300FFEE
-:103A40002402008214620005240200840E00093E54
-:103A5000000000000A000E97000000001462000938
-:103A6000240200818F8200288F8400343C0760216B
-:103A7000944500D49206000530A5FFFF0A000E868B
-:103A800030C600FF14620027000000009202000A06
-:103A9000304300FF306200201040000430620040DC
-:103AA0008F8400340A000E82240600401040000477
-:103AB000000316008F8400340A000E8224060041A1
-:103AC00000021603044100178F84003424060042CC
-:103AD0008F8200283C076019944500D430A5FFFF71
-:103AE0000E000AF1000000000A000E97000000001E
-:103AF0009202000B24030016304200FF1043000620
-:103B0000000000009202000B24030017304200FF67
-:103B100014430004000000000E000E11000000001D
-:103B2000004088210E000B68000000009202000A8D
-:103B3000304200081040000624020C808F850028C7
-:103B40003C0400080E0011EE0344202124020C80E6
-:103B5000AF4200248FBF0018022010218FB0001048
-:103B60008FB1001403E0000827BD002027BDFFE847
-:103B7000AFBF0014AFB000108F5000243C0308000A
-:103B80008C6300E08F4501002402FF8000A3182110
-:103B90003064007F03442021006218243C02000AA4
-:103BA00000822021AF850034AF4300249082006260
-:103BB000AF8400283042000F34420050A0820062DF
-:103BC0003C02001F3442FF800E00062602028024C1
-:103BD000AF5000248FBF00148FB0001003E0000826
-:103BE00027BD00183C0208008C4200201040001D38
-:103BF0002745010090A300093C0200080342202150
-:103C000024020018546200033C0200080A000ED887
-:103C10002402000803422021240200161462000539
-:103C20002402001724020012A082003F0A000EE2C4
-:103C300094A700085462000694A700089362000548
-:103C40002403FFFE00431024A362000594A700088C
-:103C500090A6001B8CA4000094A500060A000ACCC4
-:103C600000073C0003E000080000000027440100BA
-:103C700094820008304500FF38A3008238A20084F7
-:103C80002C6300012C420001006218251060000620
-:103C9000240200839382002D1040000D00000000DC
-:103CA0000A000B9B0000000014A2000524A2FF8064
-:103CB0008F4301043C02602003E00008AC43001481
-:103CC000304200FF2C420002104000032402002278
-:103CD0000A000E3C0000000014A2000300000000D7
-:103CE0000A000EA9000000000A000EC70000000034
-:103CF0009363007E9362007A144300090000202140
-:103D00009362000024030050304200FF144300047B
-:103D1000240400019362007E24420001A362007E1D
-:103D200003E00008008010218F4201F80440FFFEEC
-:103D300024020002AF4401C0A34201C43C021000AF
-:103D400003E00008AF4201F827BDFFE8AFBF001055
-:103D50009362003F2403000A304200FF14430046F0
-:103D6000000000008F6300548F62004C1062007DE1
-:103D7000036030219362000024030050304200FFB2
-:103D80001443002F000000008F4401403C02080053
-:103D90008C4200E02403FF800082102100431024A5
-:103DA000AF4200243C0208008C4200E08F650054C2
-:103DB0003C03000A008220213084007F034410214C
-:103DC00000431021AC4501089762003C8F63004C12
-:103DD0003042FFFF0002104000621821AF63005C18
-:103DE0008F6300548F64004C9762003C006418237A
-:103DF0003042FFFF00031843000210400043102A26
-:103E000010400006000000008F6200548F63004CD9
-:103E1000004310230A000F58000210439762003C31
-:103E20003042FFFF00021040ACC2006424020001D7
-:103E3000A0C0007CA0C2008424020C80AF420024F9
-:103E40000E000F0A8F440140104000478FBF001042
-:103E50008F4301408F4201F80440FFFE240200021C
-:103E6000AF4301C0A34201C43C021000AF4201F8BD
-:103E70000A000FA88FBF00109362003F24030010B8
-:103E8000304200FF14430004000000008F44014052
-:103E90000A000F94000028219362003F24030016BB
-:103EA000304200FF1443000424020014A362003FC8
-:103EB0000A000FA2000000008F62004C8F630050C8
-:103EC00000431023044100288FBF0010936200813B
-:103ED00024420001A3620081936200812C4200040D
-:103EE00014400010000000009362003F240300040F
-:103EF000304200FF14430006000000008F440140E0
-:103F00008FBF0010240500930A0005A027BD0018EC
-:103F10008F440140240500938FBF00100A00060F54
-:103F200027BD00188F4401400E0002500000000021
-:103F30008F6200542442FFFFAF6200548F62005032
-:103F40002442FFFFAF6200500E0002598F4401402F
-:103F50008F4401408FBF0010240500040A00025E58
-:103F600027BD00188FBF001003E0000827BD001810
-:103F70008F4201889363007E00021402304400FFE8
-:103F8000306300FF1464000D0000000093620080A5
-:103F9000304200FF1044000900000000A3640080CC
-:103FA0009362000024030050304200FF14430004D9
-:103FB000000000000A0006D78F440180A36400803F
-:103FC00003E000080000000027BDFFE8AFB00010CC
-:103FD000AFBF00149362000524030030304200306C
-:103FE00014430089008080213C0208008C4200209C
-:103FF00010400080020020210E0004930000000009
-:104000008F850020ACB000009362003E9363003FB8
-:10401000304200FF00021200306300FF0043102511
-:10402000ACA2000493620082000216000002160394
-:1040300004410005000000003C0308008C630048B8
-:104040000A000FE6000000009362003E304200408C
-:10405000144000030000182193620081304300FFE8
-:104060009362008200031E00304200FF0002140031
-:1040700000621825ACA300088F620040ACA2000CBF
-:104080008F620048ACA200108F62004CACA20014FA
-:104090008F6200508F63004C0043102304410003E3
-:1040A000000000000A000FFA8F62004C8F6200507F
-:1040B000ACA200183C02080094424B5E3C03C00BCB
-:1040C00000002021004310250E0004B8ACA2001C03
-:1040D0008F6200548F840020AC8200008F620058F1
-:1040E000AC8200048F62005CAC8200088F620060CA
-:1040F0008F43007400431021AC82000C8F62006477
-:10410000AC820010976300689762006A00031C008D
-:104110003042FFFF00621825AC83001493620082D6
-:1041200024030080304200FF14430003000000001D
-:104130000A00102EAC8000188F63000C24020001CE
-:104140001062000E2402FFFF9362003E30420040E6
-:104150001440000A2402FFFF8F63000C8F4200749A
-:10416000006218233C020800006210241440000280
-:10417000000028210060282100051043AC820018AF
-:104180003C02080094424B5E3C03C00C000020211E
-:10419000004310258F8300200E0004B8AC62001C81
-:1041A0008F6200188F8300203C05080094A54B5EA9
-:1041B00024040001AC620000AC6000048F66006C57
-:1041C0003C02400D00A22825AC6600088F6200DC8E
-:1041D000AC62000CAC600010936200050002160097
-:1041E000AC620014AC6000180E0004B8AC65001C92
-:1041F000020020218FBF00148FB00010A3600005C3
-:104200000A00042127BD00188FBF00148FB00010D2
-:1042100003E0000827BD00189742007C30C600FF6D
-:10422000A08600843047FFFF2402000514C2000B63
-:1042300024E3465090A201122C42000710400007D0
-:1042400024E30A0090A30112240200140062100467
-:1042500000E210210A0010663047FFFF3067FFFFC1
-:1042600003E00008A4870014AC87004C8CA201086E
-:104270000080402100A0482100E2102330C600FF4A
-:104280001840000393AA001324E2FFFCACA201082B
-:1042900030C2000110400008000000008D020050F4
-:1042A00000E2102304410013240600058D0200548F
-:1042B00010E20010000000008D02005414E2001A09
-:1042C000000000003C0208008C4200D83042002070
-:1042D0001040000A2402000191030078910200833B
-:1042E000144300062402000101002021012028219E
-:1042F000240600040A00105400000000A1000084FD
-:1043000011400009A50200148F4301008F4201F8FB
-:104310000440FFFE24020002AF4301C0A34201C4D7
-:104320003C021000AF4201F803E00008000000006A
-:1043300027BDFFE88FA90028AFBF001000804021F3
-:1043400000E918231860007330C600FFA080007CCD
-:10435000A08000818CA2010800E210230440004DDF
-:10436000000000008C8200509483003C8C84006428
-:10437000004748233063FFFF012318210083202BCF
-:1043800010800004000000008D0200640A0010B7D5
-:1043900000E210219502003C3042FFFF0122102173
-:1043A00000E21021AD02005C9502003C8D03005C30
-:1043B0003042FFFF0002104000E210210043102BAA
-:1043C00010400003000000000A0010C68D02005CCF
-:1043D0009502003C3042FFFF0002104000E2102135
-:1043E000AD02005CA1000084AD07004C8CA2010866
-:1043F00000E210231840000224E2FFFCACA20108F6
-:1044000030C200011040000A000000008D02005080
-:1044100000E2102304410004010020218D02005419
-:1044200014E20003000000000A0010E82406000562
-:104430008D02005414E200478FBF00103C020800B8
-:104440008C4200D8304200201040000A24020001B3
-:1044500091030078910200831443000624020001B6
-:1044600001002021240600048FBF00100A00105410
-:1044700027BD0018A1000084A50200148F4301008D
-:104480008F4201F80440FFFE240200020A00110DD1
-:10449000000000008C82005C004910230043102BB8
-:1044A00054400001AC87005C9502003C3042FFFFA5
-:1044B0000062102B14400007240200029502003C09
-:1044C0008D03005C3042FFFF00621821AD03005CE9
-:1044D00024020002AD07004CA10200840E000F0A66
-:1044E0008F4401001040001B8FBF00108F4301005C
-:1044F0008F4201F80440FFFE24020002AF4301C0D6
-:10450000A34201C43C021000AF4201F80A0011238B
-:104510008FBF001030C200101040000E8FBF00107F
-:104520008C83005C9482003C006918233042FFFFBA
-:10453000006218213C023FFF3444FFFF0083102B30
-:10454000544000010080182101231021AD02005CBD
-:104550008FBF001003E0000827BD001827BDFFE84B
-:104560008FAA0028AFBF00100080402100EA482336
-:104570001920002130C600FF8C83005C8C8200640F
-:10458000006A18230043102B5040001000691821C6
-:1045900094A2011001221021A4A2011094A20110E2
-:1045A0003042FFFF0043102B1440000A3C023FFF43
-:1045B00094A2011000431023A4A201109482003C95
-:1045C0003042FFFF0A00114200621821A4A001102E
-:1045D0003C023FFF3444FFFF0083102B5440000196
-:1045E0000080182100671021AD02005CA100007C52
-:1045F0000A00118AA100008130C200101040003C66
-:10460000000000008C820050004A1023184000383F
-:10461000000000009082007C24420001A082007C07
-:104620009082007C3C0308008C630024304200FF31
-:104630000043102B1440005C8FBF00108CA20108B7
-:1046400000E2102318400058000000008C83005442
-:104650009482003C006A18233042FFFF0003184395
-:10466000000210400043102A104000050000000026
-:104670008C820054004A10230A001171000210437A
-:104680009482003C3042FFFF00021040AD02006403
-:104690009502003C8D0400649503003C3042FFFF0E
-:1046A00000021040008220213063FFFF00831821A8
-:1046B00001431021AD02005C8D020054ACA2010840
-:1046C00024020002A10200840E000F0A8F440100A0
-:1046D000104000358FBF00108F4301008F4201F85A
-:1046E0000440FFFE240200020A0011B30000000093
-:1046F000AD07004C8CA2010800E210231840000214
-:1047000024E2FFFCACA2010830C200011040000A04
-:10471000000000008D02005000E21023044100045C
-:10472000010020218D02005414E20003000000006B
-:104730000A0011AA240600058D02005414E2001A92
-:104740008FBF00103C0208008C4200D8304200208D
-:104750001040000A240200019103007891020083B6
-:104760001443000624020001010020212406000455
-:104770008FBF00100A00105427BD0018A10000844C
-:10478000A50200148F4301008F4201F80440FFFE90
-:1047900024020002AF4301C0A34201C43C02100046
-:1047A000AF4201F88FBF001003E0000827BD0018DA
-:1047B0008FAA00108C8200500080402130C600FF7C
-:1047C000004A102300A048211840000700E01821EB
-:1047D00024020001A0800084A0A00112A482001481
-:1047E0000A001125AFAA0010A0800081AD07004C7F
-:1047F0008CA2010800E210231840000224E2FFFC12
-:10480000ACA2010830C20001104000080000000006
-:104810008D0200500062102304410013240600059D
-:104820008D02005410620010000000008D02005440
-:1048300014620011000000003C0208008C4200D805
-:10484000304200201040000A240200019103007849
-:10485000910200831443000624020001010020217C
-:1048600001202821240600040A0010540000000042
-:10487000A1000084A502001403E00008000000006D
-:1048800027BDFFE0AFBF0018274201009046000A95
-:104890008C4800148C8B004C9082008430C900FF3F
-:1048A00001681823304A00FF1C60001A2D460006DC
-:1048B000240200010142100410C00016304300031E
-:1048C000012030210100382114600007304C000C19
-:1048D00015800009304200301440000B8FBF0018D3
-:1048E0000A001214000000000E001125AFAB0010EA
-:1048F0000A0012148FBF00180E00109AAFAB001000
-:104900000A0012148FBF0018AFAB00100E0011BACE
-:10491000AFAA00148FBF001803E0000827BD0020D5
-:1049200024020003A08200848C82005403E000086B
-:10493000ACA201083C0200080342182190620081E9
-:10494000240600433C07601924420001A062008154
-:10495000906300813C0208008C4200C0306300FF7D
-:10496000146200102403FF803C0208008C4200E027
-:104970000082102100431024AF4200243C020800B2
-:104980008C4200E03C03000A008210213042007F8C
-:104990000342102100431021944500D40A000AF17B
-:1049A00030A5FFFF03E000080000000027BDFFE086
-:1049B000AFBF0018AFB10014AFB000108F4201803C
-:1049C0000080802100A088210E00121B00402021C1
-:1049D000A20000848E0200548FBF00188FB0001018
-:1049E000AE2201088FB1001403E0000827BD0020AB
-:1049F00027BDFFE03C020008AFB00010AFBF0018B9
-:104A0000AFB10014034280218F5101409203008412
-:104A10008E0400508E02004C14820040306600FF6D
-:104A20003C0208008C4200E02403FF800222102197
-:104A300000431024AF4200243C0208008C4200E0F6
-:104A40009744007C92050081022210213042007FB1
-:104A5000034218213C02000A0062182114A0000B36
-:104A60003084FFFF2402000554C20014248205DCB8
-:104A70009062011224420001A062011224020C8003
-:104A8000AF4200240A00127324020005A060011244
-:104A90002402000514C20009248205DC9202008170
-:104AA0002C4200075040000524820A009203008136
-:104AB0002402001400621004008210213044FFFF21
-:104AC000A60400140E00121B022020219602003CB6
-:104AD0008E03004C022020213042FFFF00021040D4
-:104AE000006218210E000250AE03005C9202007DAD
-:104AF00002202021344200400E000259A202007D13
-:104B00008F4201F80440FFFE24020002AF5101C0B1
-:104B1000A34201C43C021000AF4201F88FBF00184D
-:104B20008FB100148FB0001003E0000827BD0020F3
-:104B300008000ACC08000B1408000B9808000BE4CE
-:044B400008000C203D
-:0C4B44000A000028000000000000000033
-:104B50000000000D6370362E322E31000000000080
-:104B60000602010400000000000000000000000038
-:104B70000000000000000000000000000000000035
-:104B80000000000000000000000000000000002005
-:104B90000000000000000000000000000000000015
-:104BA0000000000000000000000000000000000005
-:104BB00000000000000000000000000000000001F4
-:104BC0000000002B000000000000000400030D4066
-:104BD00000000000000000000000000000000000D5
-:104BE00000000000000000001000000300000000B2
-:104BF0000000000D0000000D3C020800244258A4F3
-:104C00003C03080024635F70AC4000000043202B8D
-:104C10001480FFFD244200043C1D080037BD7FFCCA
-:104C200003A0F0213C100800261000A03C1C080046
-:104C3000279C58A40E0001AC000000000000000DED
-:104C400027BDFFE83C096018AFBF00108D2C500055
-:104C5000240DFF7F24080031018D5824356A380C5B
-:104C600024070C003C1A8000AD2A50003C04800A46
-:104C7000AF4800083C1B8008AF4700240E00091510
-:104C8000AF8400100E0008D8000000000E000825B8
-:104C9000000000000E001252000000003C046016EC
-:104CA0008C8500003C06FFFF3C02535300A61824ED
-:104CB0001062004734867C0094C201F2A780002C69
-:104CC00010400003A78000CC38581E1EA798002C67
-:104CD00094C201F810400004978300CC38591E1E7E
-:104CE000A79900CC978300CC2C7F006753E000018C
-:104CF000240300669784002C2C82040114400002D7
-:104D000000602821240404003C0760008CE904387A
-:104D10002403103C3128FFFF1103001F30B9FFFFAF
-:104D200057200010A38000CE24020050A38200CEA2
-:104D3000939F00CE53E0000FA78500CCA78000CC46
-:104D4000978500CC8FBF0010A780002CA78000346F
-:104D5000A78000E63C010800AC25008003E00008C5
-:104D600027BD0018939F00CE57E0FFF5A78000CC29
-:104D7000A78500CC978500CC8FBF0010A784002C9E
-:104D8000A7800034A78000E63C010800AC25008025
-:104D900003E0000827BD0018A38000CE8CCB003CA8
-:104DA000316A00011140000E0000000030A7FFFF33
-:104DB00010E0FFDE240200508CCC00C831860001D8
-:104DC00014C0FFDC939F00CE0A00007A2402005139
-:104DD0008C8F00043C0E60000A00005D01EE302163
-:104DE0008CEF0808240D5708000F740211CD000441
-:104DF00030B8FFFF240500660A00007B240404008D
-:104E00001700FFCC939F00CE0A00007A24020050C6
-:104E10008F8600103089FFFF000939408CC30010D5
-:104E20003C08005000E82025AF4300388CC5001432
-:104E300027420400AF82001CAF45003CAF44003065
-:104E40000000000000000000000000000000000062
-:104E50000000000000000000000000000000000052
-:104E60008F4B0000316A00201140FFFD0000000060
-:104E700003E00008000000008F840010948A001AEC
-:104E80008C8700243149FFFF000940C000E8302131
-:104E9000AF46003C8C8500248F43003C00A31023C8
-:104EA00018400029000000008C8B002025620001C2
-:104EB0003C0D005035AC0008AF420038AF4C00301C
-:104EC00000000000000000000000000000000000E2
-:104ED00000000000000000000000000000000000D2
-:104EE0008F4F000031EE002011C0FFFD00000000D8
-:104EF0008F4A04003C080020AC8A00108F4904044B
-:104F0000AC890014AF4800300000000094860018FF
-:104F10009487001C00C71821A48300189485001AE8
-:104F200024A20001A482001A9498001A9499001EE9
-:104F3000133800030000000003E000080000000038
-:104F400003E00008A480001A8C8200200A0000DC24
-:104F50003C0D00500A0000CD000000003C0308009A
-:104F60008C6300208F82001827BDFFE810620008C4
-:104F7000AFBF00100E000104AF8300183C0308000F
-:104F80008C63002024040001106400048F89001049
-:104F90008FBF001003E0000827BD00188FBF00106E
-:104FA0003C076012A520000A9528000A34E500108D
-:104FB00027BD00183106FFFF03E00008ACA60090F3
-:104FC0003C0208008C42002027BDFFC8AFBF003460
-:104FD000AFBE0030AFB7002CAFB60028AFB500248D
-:104FE000AFB40020AFB3001CAFB20018AFB10014D3
-:104FF00010400050AFB000108F840010948600065F
-:105000009483000A00C3282330B6FFFF12C0004A71
-:105010008FBF003494890018948A000A012A402323
-:105020003102FFFF02C2382B14E0000202C020212F
-:10503000004020212C8C0005158000020080A0215A
-:10504000241400040E0000B3028020218F8700107A
-:1050500002809821AF80001494ED000A028088211C
-:105060001280004E31B2FFFF3C1770003C1540002B
-:105070003C1E60008F8F001C8DEE000001D71824AD
-:10508000507500500220202102A3802B160000350D
-:105090003C182000507800470220202124100001F5
-:1050A0008F83001414600039029158230230F823D2
-:1050B0000250C82133F1FFFF1620FFEE3332FFFF0D
-:1050C0008F8700103C110020AF510030000000001D
-:1050D00094E6000A3C1E601237D5001002662821B3
-:1050E000A4E5000A94E2000A94F2000A94F400187D
-:1050F0003057FFFF1292003BAEB700908CED0014CA
-:105100008CE400100013714001AE4021000E5FC31B
-:10511000010E502B008B4821012A1821ACE8001405
-:10512000ACE3001002D3382330F6FFFF16C0FFB9FE
-:105130008F8400108FBF00348FBE00308FB7002CDB
-:105140008FB600288FB500248FB400208FB3001CC9
-:105150008FB200188FB100148FB0001003E0000868
-:1051600027BD0038107E001B000000001477FFCC24
-:10517000241000010E00159B000000008F83001416
-:105180001060FFCB0230F823029158238F87001064
-:10519000017020210A0001973093FFFF8F830014D4
-:1051A0001460FFCB3C110020AF5100300A000163B6
-:1051B000000000000E00077D024028210A00015770
-:1051C000004080210E00033A024028210A000157C6
-:1051D000004080210E001463022020210A000157A4
-:1051E000004080210E0000CD000000000A0001797F
-:1051F00002D3382327BDFFE8AFB00010AFBF0014C3
-:105200000E00003F000000003C028000345000709F
-:105210000A0001BA8E0600008F4F000039EE00012F
-:1052200031C20001104000248F8600A88E070000C4
-:105230003C0C08008D8C003C3C0908008D2900388E
-:1052400000E66823018D28210000502100AD302B9D
-:10525000012A4021010620213C010800AC25003C28
-:10526000AF8700A83C010800AC2400380E000106FE
-:10527000000000003C0308008C6300701060FFE633
-:10528000006020213C0508008CA500683C06080051
-:105290008CC6006C0E00152A000000003C010800BE
-:1052A000AC2000708F4F000039EE000131C20001C8
-:1052B0001440FFDE8F8600A88E0A00008F8B00A8A6
-:1052C0003C0508008CA5003C3C0408008C84003898
-:1052D000014B482300A938210082182100E9402B06
-:1052E000006810213C010800AC27003C3C0108008C
-:1052F000AC2200388F5F01002419FF0024180C0035
-:1053000003F9202410980012AF840000AF4400205D
-:10531000936D0000240C002031A600FF10CC001279
-:10532000240E005010CE00043C194000AF59013843
-:105330000A0001B3000000000E0011C800000000C8
-:105340003C194000AF5901380A0001B300000000C9
-:105350000E00011F000000003C194000AF59013849
-:105360000A0001B3000000008F58010000802821CE
-:10537000330F00FF01E020210E0002F1AF8F000487
-:105380003C194000AF5901380A0001B30000000089
-:1053900000A4102B2403000110400009000030215C
-:1053A0000005284000A4102B04A0000300031840AF
-:1053B0005440FFFC000528405060000A0004182BF0
-:1053C0000085382B54E000040003184200C3302548
-:1053D00000852023000318421460FFF900052842CD
-:1053E0000004182B03E0000800C310218F4201B80D
-:1053F0000440FFFE00000000AF4401803C031000A9
-:1054000024040040AF450184A3440188A3460189D8
-:10541000A747018A03E00008AF4301B83084FFFFCB
-:105420000080382130A5FFFF000020210A00022A59
-:10543000240600803087FFFF8CA40000240600387B
-:105440000A00022A000028218F8300388F8600304E
-:105450001066000B008040213C07080024E75A1822
-:10546000000328C000A710218C4400002463000121
-:10547000108800053063000F5466FFFA000328C04F
-:1054800003E00008000010213C07080024E75A1C34
-:1054900000A7302103E000088CC200003C0390000C
-:1054A0003462000100822025AF4400208F45002097
-:1054B00004A0FFFE0000000003E000080000000060
-:1054C0003C038000346200010082202503E00008D4
-:1054D000AF44002027BDFFE0AFB100143091FFFFC3
-:1054E000AFB00010AFBF00181220001300A0802141
-:1054F0008CA2000024040002240601401040000F8A
-:10550000004028210E000C5C00000000000010216B
-:10551000AE000000022038218FBF00188FB10014A8
-:105520008FB0001000402021000028210000302111
-:105530000A00022A27BD00208CA200000220382188
-:105540008FBF00188FB100148FB0001000402021D1
-:1055500000002821000030210A00022A27BD002077
-:1055600000A010213087FFFF8CA500048C440000B0
-:105570000A00022A2406000627BDFFE0AFB0001093
-:10558000AFBF0018AFB100149363003E00808021CC
-:105590000080282130620040000020211040000FD0
-:1055A0008E1100000E000851022020219367000098
-:1055B0002404005030E500FF50A400128E0F0000BC
-:1055C000022020218FBF00188FB100148FB000106F
-:1055D000A762013C0A00091127BD00200E000287C6
-:1055E000000000000E0008510220202193670000F7
-:1055F0002404005030E500FF14A4FFF20220202113
-:105600008E0F00003C1008008E1000503C0D000C66
-:10561000240BFF8001F05021314E007F01DA602120
-:10562000018D4021014B4824AF4900280220202150
-:105630008FBF00188FB100148FB00010A50200D6E4
-:1056400027BD00200A000911AF8800D027BDFFE068
-:10565000AFBF0018AFB10014AFB0001093660001E7
-:10566000008080210E00025630D1000493640005B2
-:10567000001029C2A765000034830040A363000521
-:105680000E00025F020020210E00091302002021FB
-:1056900024020001AF62000C02002821A762001062
-:1056A00024040002A762001224060140A76200142D
-:1056B0000E000C5CA76200161620000F8FBF0018AA
-:1056C000978C00343C0B08008D6B00782588FFFF19
-:1056D0003109FFFF256A0001012A382B10E000067E
-:1056E000A78800343C0F6006240E001635ED00102C
-:1056F000ADAE00508FBF00188FB100148FB00010F6
-:1057000003E0000827BD002027BDFFE0AFB1001473
-:10571000AFBF0018AFB0001000A088211080000AB1
-:105720003C03600024020080108200120000000090
-:105730000000000D8FBF00188FB100148FB0001053
-:1057400003E0000827BD00208C682BF80500FFFE51
-:1057500000000000AC712BC08FBF00188FB1001487
-:105760008FB000103C09100027BD002003E00008A6
-:10577000AC692BF80E00025600A0202193650005AD
-:10578000022020210E00025F30B000FF2403003E03
-:105790001603FFE7000000008F4401780480FFFE3D
-:1057A000240700073C061000AF51014002202021D1
-:1057B000A34701448FBF00188FB100148FB00010B1
-:1057C000AF4601780A0002C227BD002027BDFFE8CE
-:1057D000AFBF0014AFB000108F50002000000000D9
-:1057E0000E000913AF440020AF5000208FBF0014FB
-:1057F0008FB0001003E0000827BD00183084FFFFC1
-:10580000008038212406003500A020210A00022A49
-:10581000000028213084FFFF008038212406003654
-:1058200000A020210A00022A0000282127BDFFD065
-:10583000AFB3001C3093FFFFAFB50024AFB2001828
-:10584000AFBF0028AFB40020AFB10014AFB000105C
-:1058500030B5FFFF12600027000090218F90001CE0
-:105860008E0300003C0680002402004000033E023C
-:1058700000032C0230E4007F006688241482001D9F
-:1058800030A500FF8F8300282C68000A510000100B
-:105890008F910014000358803C0C0800258C56940E
-:1058A000016C50218D49000001200008000000001B
-:1058B00002B210213045FFFF0E000236240400849E
-:1058C000162000028F90001CAF8000288F910014DA
-:1058D000260C002026430001018080213072FFFF4A
-:1058E00016200004AF8C001C0253502B1540FFDC27
-:1058F00000000000024010218FBF00288FB5002457
-:105900008FB400208FB3001C8FB200188FB1001429
-:105910008FB0001003E0000827BD0030240E0034D3
-:1059200014AE00F9000000009203000E241F168040
-:105930003C07000CA36300219202000D0347C8211D
-:105940003C066000A3620020961100123C0A7FFF13
-:10595000354CFFFFA771003C960B00102403000597
-:105960003168FFFFAF6800848E05001CAF5F002820
-:105970008F3800008CC4444803057826008F3021FE
-:10598000AF66004C8F69004C24CE00013C057F00BF
-:10599000AF6900508F740050AF740054AF66007050
-:1059A000AF6E00588F6D005824140050AF6D005C2E
-:1059B000A3600023AF6C0064A36300378E02001461
-:1059C000AF6200488F710048AF7100248E0B001841
-:1059D000AF6B006C9208000CA3680036937F003E0A
-:1059E00037F90020A379003E8F78007403058024E6
-:1059F000360F4000AF6F007493640000308900FFE1
-:105A0000513402452404FF803C04080024845A9841
-:105A10000E00028D000000003C1008008E105A9805
-:105A20000E00025602002021240600042407000173
-:105A3000A366007D020020210E00025FA36700051F
-:105A40008F5F017807E0FFFE240B0002AF5001409A
-:105A5000A34B01448F90001C3C081000AF48017814
-:105A60000A000362AF8000282CAD003751A0FF98D8
-:105A70008F9100140005A0803C180800271856BC20
-:105A8000029878218DEE000001C00008000000009F
-:105A90002418000614B80011000000003C0808009B
-:105AA0008D085A9824040005AF4800208E1F001866
-:105AB000AF7F00188F79004CAF79001C8F650050C4
-:105AC000122000C0AF6500700A000362AF84002896
-:105AD0002406000710A60083240300063C050800E6
-:105AE00024A55A980E000264240400818F90001CA3
-:105AF0000011102B0A000362AF8200282407000463
-:105B000014A7FFF6240500503C1808008F185A9877
-:105B1000AF5800208E0F0008AF6F00408E090008BC
-:105B2000AF6900448E14000CAF7400488E0E001054
-:105B3000AF6E004C8E0D0010AF6D00848E0A001405
-:105B4000AF6A00508E0C0018AF6C00548E04001C1D
-:105B5000AF64005893630000306B00FF116501D8FB
-:105B6000000000008F7400488F6900400289702394
-:105B700005C000042404008C1620FFDE240200036C
-:105B8000240400823C05080024A55A980E000287D0
-:105B9000000000008F90001C000010210A0003622A
-:105BA000AF820028240F000514AFFFCC240520008D
-:105BB0003C0708008CE75A98AF4700208E06000487
-:105BC000AF66005C9208000824100008A36800215A
-:105BD0008F9F001C93F90009A37900208F86001C79
-:105BE00090D8000A330400FF10900011000000005C
-:105BF0002885000914A0006924020002240A00205C
-:105C0000108A000B34058000288D002115A00008A3
-:105C100024054000240E0040108E00053C050001C4
-:105C200024140080109400023C050002240540006A
-:105C30008F7800743C19FF00031980240205782531
-:105C4000AF6F007490C4000BA36400818F84001CAC
-:105C50009489000C11200192000000009490000C27
-:105C60002406FFBF24050004A770003C908F000E9F
-:105C7000A36F003E8F84001C9089000FA369003F32
-:105C80008F8B001C8D6E00108F54007401D468231C
-:105C9000AF6D00608D6A0014AF6A0064956C0018E7
-:105CA000A76C00689563001AA763006A8D62001CE8
-:105CB000AF62006C9167000EA367003E9368003EE0
-:105CC0000106F8241220014BA37F003E8F90001C98
-:105CD0000A000362AF8500282407002214A7FF7F73
-:105CE000240300073C0B08008D6B5A981220000C0F
-:105CF000AF4B00200A000362AF830028240C00335E
-:105D000010AC0014240A00283C05080024A55A9869
-:105D10000E00023C240400810A0003EB8F90001C5B
-:105D20003C04080024845A980E00028D00000000F4
-:105D30009363000024110050306200FF10510135C0
-:105D4000000000008F90001C000018210A00036270
-:105D5000AF8300283C0D08008DAD5A9824040081C3
-:105D6000AF4D00203C05080024A55A980E00023CC7
-:105D7000A36A00348F90001C240200090A00036209
-:105D8000AF82002802B288213225FFFF0E000236C2
-:105D9000240400840A0003628F90001C1082FFA478
-:105DA00024050400288B000311600170240C0004FA
-:105DB000240300015483FF9E240540000A00043B95
-:105DC000240501003C04080024845A988F62004C8A
-:105DD0000E00028D8F6300508F90001C0000202168
-:105DE0000A000362AF8400288E1000042404008A95
-:105DF000AF50002093790005333800021700015F8F
-:105E0000020028219368002302002821311F00206E
-:105E100017E0015A2404008D9367003F2406001206
-:105E200030E200FF10460155240400810E000256A6
-:105E30000200202193630023240500040200202196
-:105E4000346B0042A36B00230E00025FA365007D4C
-:105E50008F4401780480FFFE240A0002AF50014005
-:105E6000A34A01448F90001C3C0C1000AF4C0178F9
-:105E70000A0003EC0011102B8E1000042404008A89
-:105E8000AF500020936E000531CD000215A0001622
-:105E900002002821936F003F2414000402002821EF
-:105EA00031E900FF11340010240400810E00025675
-:105EB000020020219362002324080012241FFFFE09
-:105EC00034460020A3660023A368003F93790005B1
-:105ED00002002021033FC0240E00025FA3780005CA
-:105EE00002002821000020210E00033400000000E1
-:105EF0000A0003EB8F90001C8E1000043C03000886
-:105F00000343A021AF500020928B000024050050D5
-:105F1000316400FF10850161240700880200202100
-:105F2000000028210E00022A2406000E928D000097
-:105F3000240EFF800200282101AE8025A2900000DF
-:105F4000240400040E000C5C240600300A0003EB5D
-:105F50008F90001C8E0800043C14080026945A9868
-:105F60003C010800AC285A98AF480020921F00035B
-:105F700033F9000413200002240200122402000658
-:105F8000A362003F920B001B2404FFC03165003F59
-:105F900000A43825A367003E9206000330C200012A
-:105FA00014400132000000008E020008AE8200089A
-:105FB0003C0208008C425AA010400131000249C244
-:105FC000A76900088E14000C240C0001240300149F
-:105FD000AF74002C8E0E0010AF6E0030960D0016C0
-:105FE000A76D0038960A0014A76A003AAF6C000C3F
-:105FF000A76C0010A76C0012A76C0014A76C001609
-:1060000012200136A3630034920F000331F0000226
-:106010002E1100018F90001C262200080A00036246
-:10602000AF8200288E0400043C0E0008034E30218D
-:10603000AF4400208E05000890CD0000240C0050D5
-:1060400031AA00FF114C00862407008824060009AD
-:106050000E00022A000000000A0003EB8F90001CD3
-:106060008E04001C0E00024100000000104000F4ED
-:10607000004050218F89001C240700890140202105
-:106080008D25001C240600010E00022A00000000DD
-:106090000A0003EB8F90001C960D00023C140800D0
-:1060A00026945A9831AA0004514000B83C10600070
-:1060B0008E0E001C3C010800AC2E5A98AF4E0020FA
-:1060C000920700102408001430E200FF144800D6A4
-:1060D00000000000960B00023163000114600165AE
-:1060E000000000008E020004AE8200083C1408008C
-:1060F0008E945AA01280015B000000008F7400741F
-:106100003C0380002404000102835825AF6B007417
-:10611000A3600005AF64000C3C0708008CE75AA0A0
-:106120008F86001CA7640010000711C2A76400122C
-:10613000A7640014A7640016A76200088CC80008B2
-:1061400024040002AF68002C8CC5000CAF65003041
-:1061500090DF0010A37F00348F99001C9330001152
-:10616000A37000358F98001C930F0012A36F0036A8
-:106170008F89001C912E0013A36E00378F90001C96
-:10618000960D0014A76D0038960A0016A76A003A0B
-:106190008E0C0018AF6C00245620FDCCAF84002874
-:1061A0003C05080024A55A980E0002640000202136
-:1061B0008F90001C0A0004A7000020218E1000040C
-:1061C00024070081AF500020936900233134001070
-:1061D000128000170000000002002021000028218A
-:1061E0002406001F0E00022A000000000A0003EB34
-:1061F0008F90001C3C05080024A55A980E000287C9
-:10620000240400828F90001C000028210A000362F1
-:10621000AF8500283C0408008C845A980E0014E8CE
-:10622000000000008F90001C0A000482000018216A
-:106230000E00025602002021937800230200202144
-:10624000370F00100E00025FA36F002300003821FB
-:1062500002002021000028210A0005A82406001FB2
-:10626000920F000C31E90001112000030000000032
-:106270009618000EA4D8002C921F000C33F90002CF
-:1062800013200005000038218E0200149608001229
-:10629000ACC2001CA4C8001A0A0005432406000969
-:1062A0003C05080024A55A980E0002872404008BA0
-:1062B0008F90001C0011282B0A000362AF85002874
-:1062C000AF6000843C0A08008D4A5A983C0D0800D3
-:1062D0008DAD0050240CFF803C02000C014D1821B4
-:1062E000006C2024AF4400288E070014306B007F20
-:1062F000017A282100A2C821AF2700D88E060014F9
-:10630000AF9900D0AF2600DC8E080010251FFFFEDD
-:106310000A000408AF3F01083C0508008CA55A9804
-:106320003C1908008F39005024CCFFFE00B9C02171
-:1063300003047824AF4F00283C1408008E945A9828
-:106340003C0908008D2900500289702131CD007F61
-:1063500001BA502101478021AE0600D8AF9000D08D
-:10636000AE0000DC0A0003B1AE0C0108548CFE3014
-:10637000240540000A00043B240510000E00032EF3
-:10638000000000000A0003EB8F90001C8E0F442CCD
-:106390003C186C62370979703C010800AC205A98AF
-:1063A00015E9000824050140979F00349786002CCA
-:1063B0000280282103E6C82B132000112404009238
-:1063C000240501400E000C7A240400023C01080060
-:1063D000AC225A98AF4200203C0508008CA55A9880
-:1063E00010A00005240400830E00084500000000F2
-:1063F00010400009240400833C05080024A55A9895
-:106400000E000264000000008F90001C0011202B81
-:106410000A000362AF8400280E0008490000000053
-:106420000A00055F8F90001C0E00084D0000000060
-:106430003C05080024A55A980A00062F2404008B66
-:10644000240400040E000C7A240500301440002AB5
-:10645000004050218F89001C240700830140202127
-:106460008D25001C0A000551240600018E04000839
-:106470000E000241000000000A00051BAE82000869
-:106480003C05080024A55A980E00023C240400870D
-:106490008F90001C0A0005360011102B8F830038E6
-:1064A0008F8600301066FE9D000038213C070800F2
-:1064B00024E75A1C000320C0008728218CAC000070
-:1064C00011900061246A00013143000F5466FFFA05
-:1064D000000320C00A0004F6000038213C05080033
-:1064E00024A55A980E000287240400828F90001C75
-:1064F0000A000536000010213C0B0008034B202148
-:106500002403005024070001AF420020A0830000B4
-:10651000A08700018F82001C90480004A08800180A
-:106520008F85001C90A60005A08600198F9F001C77
-:1065300093F90006A099001A8F90001C921800078A
-:10654000A098001B8F94001C928F0008A08F001C45
-:106550008F89001C912E0009A08E001D8F8D001CBC
-:1065600091AC000AA08C001E8F8B001C3C0C080014
-:10657000258C5A1C9163000B3C0B0800256B5A18A4
-:10658000A083001F8F87001C90E8000CA0880020CB
-:106590008F82001C9045000D24024646A0850021F4
-:1065A0008F86001C90DF000EA09F00228F99001C98
-:1065B0009330000FA09000238F98001C93140010BC
-:1065C000A09400248F8F001C91E90011A089002560
-:1065D0008F89001C8F8E00308F900038952D00140D
-:1065E000000E18C025C80001A48D002895270016AC
-:1065F000006C3021006BC821A487002A9525001863
-:106600003108000FA485002CA482002E8D3F001CB1
-:10661000ACCA0000AF88003011100006AF3F000088
-:10662000000038218D25001C014020210A00055161
-:1066300024060001250C00013184000F00003821E0
-:106640000A0006B8AF8400383C07080024E75A184F
-:106650000087302100003821ACA000000A0004F6B9
-:10666000ACC000003C05080024A55A980A00062F7B
-:10667000240400878E0400040E0002410000000084
-:106680000A00056AAE8200083084FFFF30C600FFB2
-:106690008F4201B80440FFFE00064400010430258B
-:1066A0003C07200000C720253C031000AF400180BC
-:1066B000AF450184AF44018803E00008AF4301B84F
-:1066C00027BDFFE8AFB00010AFBF00143C0760006B
-:1066D000240600021080000600A080210010102B6C
-:1066E0008FBF00148FB0001003E0000827BD001812
-:1066F0003C09600EAD2000348CE5201C8F82001C0C
-:106700002408FFFC00A81824ACE3201C0E0006D1CE
-:106710008C45000C0010102B8FBF00148FB00010A0
-:1067200003E0000827BD00183C02600E344701005A
-:1067300024090018274A040000000000000000009F
-:10674000000000003C06005034C30200AF44003893
-:10675000AF45003CAF430030014018218F4B000093
-:10676000316800201100FFFD2406007F2408FFFF90
-:106770008C6C000024C6FFFF24630004ACEC000016
-:1067800014C8FFFB24E70004000000000000000024
-:10679000000000003C0F0020AF4F00300000000060
-:1067A00024AD020001A5702B2529FFFF008E2021BA
-:1067B0001520FFE101A0282103E0000800000000EF
-:1067C00027BDFFE0AFB10014AFBF0018AFB000109D
-:1067D0003C05600E8CA20034008088211440000625
-:1067E0003C0460008C87201C2408FFFC00E8302457
-:1067F00034C30001AC83201C8F8B001C24090001D2
-:10680000ACA90034956900028D6500148D70000CF0
-:106810002D2400818D6700048D660008108000071C
-:106820008D6A00102D2C00041580000E30CE00075C
-:10683000312D000311A0000B000000002404008B88
-:10684000020028210E0006D1240600030011102B9F
-:106850008FBF00188FB100148FB0001003E0000844
-:1068600027BD002015C0FFF62404008B3C03002048
-:10687000AF4300300000000024020001AF8200148A
-:106880000000000000000000000000003C1F01505C
-:10689000013FC825253800033C0F600EAF47003884
-:1068A00000181882AF46003C35E8003CAF59003074
-:1068B000274704008F4400003086002010C0FFFDF1
-:1068C00000000000106000082466FFFF2403FFFFA3
-:1068D0008CEB000024C6FFFF24E70004AD0B000092
-:1068E00014C3FFFB250800043C08600EAD09003806
-:1068F0000000000000000000000000003C07002035
-:10690000AF470030000000000E0006F901402021D2
-:1069100002002821000020210E0006D124060003D9
-:106920000011102B8FBF00188FB100148FB0001012
-:1069300003E0000827BD002027BDFFE0AFB200182C
-:106940003092FFFFAFB10014AFBF001CAFB000101A
-:106950001640000D000088210A0007AA022010211D
-:1069600024050001508500278CE5000C0000000D77
-:10697000262300013071FFFF24E200200232382B71
-:1069800010E00019AF82001C8F8200141440001622
-:106990008F87001C3C0670003C0320008CE5000043
-:1069A00000A62024148300108F84003C00054402BC
-:1069B0003C09800000A980241480FFE9310600FF13
-:1069C0002CCA00095140FFEB262300010006688015
-:1069D0003C0E080025CE579801AE60218D8B00003B
-:1069E0000160000800000000022010218FBF001C81
-:1069F0008FB200188FB100148FB0001003E00008B0
-:106A000027BD00200E0006D1240400841600FFD804
-:106A10008F87001C0A00078BAF80003C90EF0002BC
-:106A200000002021240600090E0006D1000F2E00D0
-:106A30008F87001C0010102B0A00078BAF82003CD0
-:106A4000020028210E0006DF240400018F87001CAD
-:106A50000A00078BAF82003C020028210E0006DFEF
-:106A6000000020210A0007C38F87001C0E00071FAB
-:106A7000020020210A0007C38F87001C30B0FFFFEF
-:106A8000001019C08F5801B80700FFFE3C1F2004FA
-:106A90003C191000AF430180AF400184AF5F018813
-:106AA000AF5901B80A00078C262300013082FFFF8E
-:106AB00014400003000018210004240224030010E5
-:106AC000308500FF14A000053087000F2466000801
-:106AD0000004220230C300FF3087000F14E00005DD
-:106AE000308900032468000400042102310300FF00
-:106AF0003089000315200005388B0001246A00024C
-:106B000000042082314300FF388B00013164000112
-:106B100010800002246C0001318300FF03E00008B4
-:106B200000601021308BFFFF000B394230E600FF80
-:106B30003C09080025295998000640800109602178
-:106B40008D8700003164001F240A0001008A1804A8
-:106B500030A500FF00E3202514A000020003102749
-:106B600000E22024240F000100CF700401096821F5
-:106B7000000E282714800005ADA400008F86000CAD
-:106B800000A6102403E00008AF82000C8F88000CE0
-:106B900001C8102503E00008AF82000C3C06001F6E
-:106BA0003C0360003084FFFF34C5FF8024020020D6
-:106BB000AC602008AC60200CAC602010AC652014E8
-:106BC000AC642018AC62200000000000000000004F
-:106BD00003E000080000000027BDFFE82402FFFFDB
-:106BE000AFBF0010AF82000C000020213C0608005F
-:106BF00024C659982405FFFF248900010004408021
-:106C00003124FFFF010618212C87002014E0FFFA31
-:106C1000AC6500000E0008160000202124020001CF
-:106C20003C04600024050020AC822018AC852000C4
-:106C3000000000000000000000000000244A0001E5
-:106C40003142FFFF2C46040014C0FFF78FBF001035
-:106C500003E0000827BD00188F8300082C620400A1
-:106C600003E00008384200018F830008246200011D
-:106C700003E00008AF8200088F8300082462FFFF52
-:106C800003E00008AF82000827BDFFE0AFB10014A9
-:106C9000AFBF0018AFB000108F6B00303C06600033
-:106CA00000808821ACCB20088F6A002C3C02800039
-:106CB00024030008ACCA200C9769003A9768003892
-:106CC00000092C003107FFFF00A72025ACC42010CD
-:106CD000ACC22014ACC32000000000000000000083
-:106CE000000000003C0360008C6D200031AC000807
-:106CF0001580FFF9000000008C6E201405C00020F4
-:106D0000000000000E0007DA8F84000C00024080B3
-:106D10003C09080025295998010938218CE4000014
-:106D20000E0007DA00028140020220213090FFFFAE
-:106D3000020020210E0007F8000028213C0C8000F2
-:106D4000022C58253210FFFF3C116000240A00205D
-:106D5000AE2B2014AE302018AE2A20000000000018
-:106D60000000000000000000020010218FBF00188A
-:106D70008FB100148FB0001003E0000827BD002081
-:106D80008C6620143C02001F3443FF803C1FFFE848
-:106D900000C3C02437F9080003198021001079C20C
-:106DA0003C0C8000022C582531F0FFFF3C116000A4
-:106DB000240A0020AE2B2014AE302018AE2A20006A
-:106DC0000000000000000000000000000200102190
-:106DD0008FBF00188FB100148FB0001003E00008BF
-:106DE00027BD002027BDFFE8AFB000103402FFFF31
-:106DF0003090FFFFAFBF00141202000602002021F6
-:106E00000E00081600000000020020210E0007F806
-:106E1000240500018F8400088FBF00148FB000107C
-:106E20002483FFFF27BD001803E00008AF8300089C
-:106E3000000439C230E6003F00043B42000718401E
-:106E4000240210002CC4002024C8FFE0AF42002C14
-:106E5000246300011480000330A900FF00071840DC
-:106E6000310600FF0003608024080001019A5821C8
-:106E70003C0A000E00C82804016A382111200005D0
-:106E8000000530278CE900000125302503E00008CB
-:106E9000ACE600008CEE000001C6682403E00008A8
-:106EA000ACED000027BDFFE8AFBF0014AFB000108D
-:106EB0003C0460008C8508083403F00030A2F00028
-:106EC00050430006240200018C8708083404E000C7
-:106ED00030E6F00010C4001E24020002AF82004021
-:106EE0003C1060003C0A0200AE0A0814240910009D
-:106EF0003C08000E8E03440003482021AF49002CBB
-:106F0000240501200E000CC0000030218F830040BA
-:106F1000106000043C021691240B0001106B000E5F
-:106F20003C023D2C344F0090AE0F44088FBF00143C
-:106F30008FB000103C0C6000240E10003C0D0200CD
-:106F400027BD0018AD8E442003E00008AD8D081069
-:106F50000A0008E7AF8000403C0218DA344F009086
-:106F6000AE0F44088FBF00148FB000103C0C6000BF
-:106F7000240E10003C0D020027BD0018AD8E4420E9
-:106F800003E00008AD8D08100A0008BB24050001CD
-:106F90000A0008BB000028213C08080025085DA461
-:106FA0002404FFFF010018212402001E2442FFFFD9
-:106FB000AC6400000441FFFD246300043C070800AA
-:106FC00024E75E208CE5FFFC2404001C240600015D
-:106FD000308A001F0146480424840001000910275C
-:106FE0002C8300201460FFFA00A22824ACE5FFFCEB
-:106FF0003C05666634A4616E3C06080024C65EE06B
-:10700000AF840058AF88009C2404FFFF00C0182103
-:107010002402001F2442FFFFAC6400000441FFFD76
-:10702000246300043C0766663C05080024A55EA0B6
-:10703000AF86004834E6616EAF8600982404FFFFF7
-:1070400000A018212402000F2442FFFFAC640000BE
-:107050000441FFFD246300043C0B66663C06080007
-:1070600024C65E203568616EAF8500A4AF880070CD
-:107070002404FFFF00C018212402001F2442FFFF48
-:10708000AC6400000441FFFD246300043C0D66660F
-:107090003C0A0800254A5F6035AC616EAF860090FF
-:1070A000AF8C005C2404FFFF014018212402000380
-:1070B0002442FFFFAC6400000441FFFD2463000490
-:1070C0003C09080025295F708D27FFFC2404000679
-:1070D000240500013099001F0325C0042484000109
-:1070E000001878272C8E002015C0FFFA00EF3824F6
-:1070F000AD27FFFC3C09666624030400240403DC7E
-:1071000024050200240600663522616E3C08080052
-:1071100025085AA4AF820074AF830044AF83006C8B
-:10712000AF830050AF830084AF8A008CAF840064CB
-:10713000AF85004CAF860054AF840078AF85006007
-:10714000AF86008001001821240200022442FFFFC4
-:10715000AC6000000441FFFD24630004240400032C
-:107160002403000C3C0A0800254A5AB0AF8A006884
-:107170000A00098E2405FFFF000418802484000102
-:10718000006858212C8700C014E0FFFBAD650000AB
-:107190003C0E666635CD616E240C17A024081800DD
-:1071A000AF8D0088AF8C009403E00008AF88007CAE
-:1071B0002484007F000421C200004021000030210F
-:1071C00000003821000028210A0009A5AF8400A092
-:1071D0001060000624E7000100C4302124A500014E
-:1071E0002CC20BF51440FFFA2CA300663C090800E2
-:1071F00025295F6001201821240200032442FFFF9B
-:10720000AC6000000441FFFD2463000410E0001A9C
-:1072100024E3FFFF0003294210A0000A0000202100
-:107220002406FFFF3C03080024635F602484000100
-:107230000085502BAC660000250800011540FFFBBF
-:107240002463000430E2001F10400008000868803A
-:10725000240C0001004C38040008588001692821E2
-:1072600024E6FFFF03E00008ACA6000001A94021CE
-:107270002409FFFFAD09000003E000080000000042
-:10728000AF4400283C04000C034420210005288260
-:107290000A000CC000003021000421803C03600083
-:1072A000AC6410080000000000052980AC65100CDB
-:1072B0000000000003E000088C62100C27BDFFE80E
-:1072C0000080282124040038AFBF00140E0009D527
-:1072D000AFB0001024040E00AF4400283C10000C96
-:1072E00003502021240500100E000CC000003021A6
-:1072F00003501021AC400000AC40000424040038CE
-:107300008FBF00148FB0001024053FFF27BD001869
-:107310000A0009D58C430000000421803C03600072
-:10732000AC641008000000008C62100C03E0000840
-:107330000002118227BDFFC8AFB400208F940068FF
-:10734000AFBE0030AFB7002CAFB600280000B821A8
-:107350000080B021241E00C0AFBF0034AFB50024B0
-:10736000AFB3001CAFB20018AFB10014AFB0001043
-:107370000A000A12AFA5003C504000018F9400683B
-:1073800027DEFFFF13C00028269400048E92000021
-:107390003C03080024635DA01240FFF70283102B1A
-:1073A0003C04080024845AA4028410230002A8C0CC
-:1073B000000098210A000A212411000100118840D0
-:1073C000122000260000000002B380210251282470
-:1073D0000200202110A0FFF9267300010E0009DE33
-:1073E000000000000016684032EC000101AC2021D2
-:1073F0000E0009D5020028218F89009426F700018C
-:107400008FA6003C3AEB0001316A00012528FFFFFE
-:107410000011382702CAB021AF88009416E6FFE7B2
-:1074200002479024AE92000002E010218FBF00348A
-:107430008FBE00308FB7002C8FB600288FB5002488
-:107440008FB400208FB3001C8FB200188FB10014CE
-:107450008FB0001003E0000827BD00383C0E080084
-:1074600025CE5DA0028E102B0A000A0DAE92000000
-:1074700027BDFFD8AFB10014AFB00010AFBF0020E0
-:10748000AFB3001CAFB2001800A0882110A0001FED
-:10749000000480403C13080026735AA40A000A5ACC
-:1074A0002412000112200019261000010E0009F517
-:1074B00002002021000231422444FFA0000618806F
-:1074C0003045001F2C8217A1007318212631FFFFC1
-:1074D0001040FFF400B230048C690000020020214B
-:1074E00024053FFF012640241500FFEE0126382524
-:1074F0000E0009D5AC6700008F8A009426100001A9
-:10750000254700011620FFE9AF8700948FBF0020B8
-:107510008FB3001C8FB200188FB100148FB0001011
-:1075200003E0000827BD00288F85009C00805821BB
-:107530000000402100004821240A001F3C0C0800E4
-:10754000258C5E1C3C0D080025AD5DA48CA60000BA
-:1075500050C000140000402100AD1023000238C0CC
-:10756000240300010A000A930000202115000003F3
-:1075700000E410212448202400004821252900018E
-:10758000512B00132506DFDC106000062484000167
-:1075900000C3702415C0FFF5000318400A000A91CB
-:1075A0000000402110AC002624A300040060282124
-:1075B000254AFFFF1540FFE5AF85009C512B0004D5
-:1075C0002506DFDC0000402103E000080100102157
-:1075D0000006614230C5001F000C50803C070800C7
-:1075E00024E75DA424040001014730211120000F8D
-:1075F00000A420043C05080024A55E20148000059A
-:107600002529FFFF24C6000410C50011000000005A
-:10761000240400018CCF00000004C0270004204097
-:1076200001F868241520FFF5ACCD00008F99007893
-:1076300001001021032B482303E00008AF890078E4
-:107640003C05080024A55DA40A000A9B0000402117
-:107650003C06080024C65DA40A000AB42404000104
-:10766000308800FF240200021102000A24030003F4
-:107670001103005C8F8900A4240400041104005F3E
-:1076800024050005110500670000182103E000082B
-:10769000006010218F8900483C0C0800258C5EE0BA
-:1076A0003C04080024845F60240300201060000F65
-:1076B00000005821240D0002240E00033C0F080096
-:1076C00025EF5EE08D27000014E0000B30F9FFFF8E
-:1076D000252900040124C02B53000001018048210A
-:1076E0002463FFFF5460FFF88D270000016018211C
-:1076F00003E0000800601021132000323C0500FF69
-:1077000030E200FF004030211040004200005021D4
-:1077100024050001000020210005C84000A6C02467
-:1077200017000003332500FF14A0FFFB2484000191
-:10773000012CC023001828C000AA6021008C502111
-:107740003144001F240C0001008C18040003102792
-:1077500000E23024110D0041AD260000110E004C56
-:10776000000A1840110D00368F87006C510E00562C
-:107770008F8C0060240D0004110D005A8F8E008440
-:10778000240E0005150EFFDA01601821240B1430B9
-:1077900011400006000018218F8400A0246300011E
-:1077A000006A402B1500FFFD016458218F8A00807C
-:1077B000AF89008C016018212549FFFF0A000AEB00
-:1077C000AF89008000E52024000736021080FFD03A
-:1077D000240A001800075402314600FF0A000AF389
-:1077E000240A00103C0C0800258C5EA03C04080014
-:1077F00024845EE00A000ADA240300103C0C08002E
-:10780000258C5E203C04080024845EA00A000AD96E
-:107810008F89009000071A02306600FF0A000AF301
-:10782000240A00088F89008C3C0C0800258C5F60BE
-:107830003C04080024845F700A000ADA2403000470
-:10784000000A4080250B003024E6FFFF016018216C
-:10785000AF8900480A000AEBAF86006C000AC982B3
-:10786000001978803C07080024E75EA001E720218A
-:10787000000A18428C8F00003079001F032C380456
-:107880000007C02701F860240A000B08AC8C000038
-:10789000000331420006288000AF28213062001F1B
-:1078A0008CB8000024630001004CC804000321428E
-:1078B000001938270004108003073024004F2021CE
-:1078C0000A000B4CACA60000000A68C025AB0032D1
-:1078D000258AFFFF01601821AF8900A40A000AEB86
-:1078E000AF8A0060254B1030AF89009001601821ED
-:1078F00025C9FFFF0A000AEBAF8900843086000724
-:107900002CC2000610400014000000000006408059
-:107910003C030800246357BC010338218CE40000B9
-:1079200000800008000000002409000310A9000ED8
-:1079300000000000240A000510AA000B000000004F
-:10794000240B000110AB0008000000008F8C00A089
-:1079500010AC00050000000003E00008000010214A
-:107960000A000A7900A020210A000AC700C02021CD
-:1079700027BDFFE8308400FF240300021083000BC2
-:10798000AFBF0010240600031086003A240800044C
-:1079900010880068240E0005108E007F2CAF143074
-:1079A0008FBF001003E0000827BD00182CA2003094
-:1079B0001440FFFC8FBF001024A5FFD0000531C28A
-:1079C000000668803C07080024E75EE001A730213C
-:1079D0008CC900000005288230AC001F240B000178
-:1079E000018B50048F840048012A4025ACC8000058
-:1079F0008C83000050600001AF8600488F98006CB7
-:107A000030AE000124A6FFFF270F000115C00002C1
-:107A1000AF8F006C24A600010006414200082080C0
-:107A2000008718218C79000030C2001F2406000155
-:107A30000046F804033F382410E0FFDA8FBF00103F
-:107A40000005C182001870803C0F080025EF5EA081
-:107A500001CF48218D2B00000005684231A5001F91
-:107A600000A66004016C502527BD001803E0000843
-:107A7000AD2A00002CA7003014E0FFCA8FBF001011
-:107A800030B900071723FFC724A8FFCE00086A02F9
-:107A9000000D60803C0B0800256B5EA0018B30213F
-:107AA0008CC40000000828C230AA001F240800016E
-:107AB000014848048F8200A400891825ACC3000047
-:107AC0008C5F000053E00001AF8600A40005704009
-:107AD000000E7942000F28803C04080024845EE0F8
-:107AE00000A418218C6B000025DF000131CD001FA0
-:107AF000001F514201A86004016C4825000A108053
-:107B0000AC690000004428218CA600008F9800601A
-:107B100033F9001F8FBF00100328380400C77825F1
-:107B2000270E000127BD0018ACAF000003E00008DD
-:107B3000AF8E006024A5EFD02CB804001300FF998D
-:107B40008FBF001000053142000658803C0A080033
-:107B5000254A5E20016A30218CC4000030A3001F3A
-:107B600024090001006910048F9900900082F82513
-:107B7000ACDF00008F27000050E00001AF860090CE
-:107B80008F8D00848FBF001027BD001825AC000129
-:107B900003E00008AF8C008415E0FF828FBF001067
-:107BA0008F8600A0000610400046F821001F21002B
-:107BB00003E4C8210019384024F8143000B8402BE1
-:107BC0001100FF788FBF001024A4EBD00E00021329
-:107BD00000C0282100027942000F70803C0D08008F
-:107BE00025AD5F6001CD20218C8B0000304C001F43
-:107BF00024060001018618048F89008C016350253A
-:107C0000AC8A00008D25000050A00001AF84008CDC
-:107C10008F9800808FBF001027BD00182708000133
-:107C200003E00008AF88008030A5000724030003AC
-:107C300010A3001028A2000414400008240700022A
-:107C40002403000410A300152408000510A8000F49
-:107C50008F8500A003E000080000000014A7FFFDCE
-:107C60000080282114C3FFFB240400020A000B8BB0
-:107C700000000000240900050080282110C9FFFB36
-:107C80002404000303E000080000000014C5FFF115
-:107C9000008028210A000B8B24040005240A00011F
-:107CA0000080282110CAFFF12404000403E000082A
-:107CB0000000000027BDFFE0AFB00010000581C24A
-:107CC0002603FFD024C5003F2C6223D024C6007FAA
-:107CD000AFB20018AFB10014AFBF001C309100FF6D
-:107CE000000691C2000529820200202110400008F0
-:107CF0002403FFFF0E000A4B0000000002002021B9
-:107D0000022028210E000C390240302100001821E9
-:107D10008FBF001C8FB200188FB100148FB00010FD
-:107D20000060102103E0000827BD002027BDFFD818
-:107D300024A2007FAFB3001CAFB20018000299C2AA
-:107D4000309200FF24A3003F02402021026028213E
-:107D5000AFB10014AFB00010AFBF00200E000B6E2B
-:107D60000003898200408021004020210220282138
-:107D700014400009000018218FBF00208FB3001CA1
-:107D80008FB200188FB100148FB000100060102166
-:107D900003E0000827BD00280E0009FC00000000D9
-:107DA00000402821020020211051FFF3001019C0CB
-:107DB0000E000A4B00000000020020210240282192
-:107DC0000E000C39026030218FBF00208FB3001CE1
-:107DD0008FB200188FB100148FB00010000018216E
-:107DE0000060102103E0000827BD00283084FFFF59
-:107DF00030A5FFFF1080000700001821308200012D
-:107E00001040000200042042006518211480FFFB8E
-:107E10000005284003E000080060102110C00007A2
-:107E2000000000008CA2000024C6FFFF24A500046F
-:107E3000AC82000014C0FFFB2484000403E00008AF
-:107E40000000000010A0000824A3FFFFAC86000083
-:107E500000000000000000002402FFFF2463FFFF79
-:107E60001462FFFA2484000403E00008000000000C
-:107E700030A5FFFF8F4201B80440FFFE3C076015AC
-:107E800000A730253C031000AF440180AF400184BF
-:107E9000AF46018803E00008AF4301B88F8500D0EA
-:107EA0002C864000008018218CA700840087102BAE
-:107EB00014400010000000008CA800842D06400033
-:107EC00050C0000F240340008CAA0084008A482B75
-:107ED000512000018CA3008400035A42000B208033
-:107EE0003C05080024A558200085182103E000085F
-:107EF0008C62000014C0FFF4000000002403400066
-:107F000000035A42000B20803C05080024A558209D
-:107F10000085182103E000088C6200008F8300D0E8
-:107F2000906600D024C50001A06500D08F8500D0E8
-:107F3000906400D090A200D210440017000000000E
-:107F4000936C00788F8B00BC318A00FFA16A000C13
-:107F500025490001938700C4312200FF3048007F8B
-:107F60001107000B00026827A36200788F4E01788A
-:107F700005C0FFFE8F9900B0241800023C0F1000CE
-:107F8000AF590140A358014403E00008AF4F017806
-:107F90000A000D0931A20080A0A000D00A000CFF49
-:107FA000000000008F8700D027BDFFC8AFBF0030A2
-:107FB000AFB7002CAFB60028AFB50024AFB4002097
-:107FC000AFB3001CAFB20018AFB10014AFB00010D7
-:107FD00094E300E094E200E2104300D72405FFFFA1
-:107FE0003C047FFF3497FFFF2415FF800A000DF04B
-:107FF0003C16000E108A00D18FBF00308F9100B068
-:108000003C1808008F18005C001230C0001291402C
-:108010000311702101D57824AF4F002C94EC00E2BD
-:1080200031CD007F01BA5821318A7FFF0176482186
-:10803000000A804002091021945300003C08080007
-:108040008D0800580246C02132733FFF001319808B
-:10805000010320210224282130BF007F03FAC82118
-:1080600000B5A024AF54002C0336A0218E87001049
-:108070008E8F003003785821256D008800EF702323
-:10808000240C0002AE8E0010AF8D00ACA16C0088F5
-:10809000976A003C8E8400308F9100AC0E000CD6A5
-:1080A0003150FFFF00024B80020940253C02420094
-:1080B00001022025AE2400048E8300048F8D00ACC5
-:1080C0008E860000240E0008ADA3001CADA600188B
-:1080D000ADA0000CADA00010929F000A33F900FF84
-:1080E000A5B90014968500083C1F000CA5A5001634
-:1080F0009298000A331100FFA5B100209690000865
-:1081000024180005A5B00022ADA00024928F000B1A
-:108110002410C00031E700FFA5A70002A1AE0001B6
-:108120008E8C00308F8B00AC8F8400B0AD6C00085B
-:108130003C0A08008D4A005401444821013540247E
-:10814000AF4800283C0208008C4200540044302113
-:1081500030C3007F007AC821033F282102458821CF
-:10816000AF9100BCAF8500C0A23800008F8A00BC70
-:108170002403FFBF2418FFDF954F000201F03824CD
-:1081800000F37025A54E0002914D000231AC003F76
-:10819000358B0040A14B00028F8600BC8F8900D038
-:1081A000ACC000048D28007C3C098000ACC80008ED
-:1081B00090C4000D3082007FA0C2000D8F8500BCEE
-:1081C00090BF000D03E3C824A0B9000D8F9100BC3F
-:1081D0009233000D02789024A232000D8E9000346C
-:1081E0008F8B00BCAD7000108E87002C8E8F0030FE
-:1081F00000EF7023AD6E0014916D001831AC007F5C
-:10820000A16C00188F9F00BC8E8A00308FE8001888
-:10821000015720240109302400C41025AFE20018C2
-:108220009283000AA3E3001C969900088F8500BC86
-:108230008F9800D0A4B9001E8E9000308E8400303C
-:108240000E0002138F0500848F8500D0000291403C
-:108250000002990090AF00BC0253882100403021F9
-:1082600031E7000210E0000302118021000290803B
-:108270000212802190B900BC3327000410E00002F4
-:108280000006F880021F80218E9800308F8B00BC82
-:1082900024068000330F0003000F702331CD00034C
-:1082A000020D6021AD6C000494A400E294AA00E2E7
-:1082B00094B000E231497FFF2522000130537FFF57
-:1082C0000206182400734025A4A800E294A400E24A
-:1082D0003C1408008E94006030917FFF123400221D
-:1082E000000000000E000CF6000000008F8700D098
-:1082F0000000282194F300E094F000E21213000F34
-:108300008FBF003090E900D090E800D1313200FFFB
-:10831000310400FF0244302B14C0FF36264A00010E
-:1083200090EE00D2264B000131CD00FF008D602180
-:10833000158BFF338F9100B08FBF00308FB7002CAB
-:108340008FB600288FB500248FB400208FB3001C97
-:108350008FB200188FB100148FB0001000A0102150
-:1083600003E0000827BD003894A300E20066402423
-:10837000A4A800E290A400E290B900E2309100FFCE
-:108380000011A1C20014F827001F39C03332007F4A
-:10839000024730250A000DE8A0A600E23084FFFF66
-:1083A00030A5FFFFAF440018AF45001C03E00008F4
-:1083B0008F42001427BDFFB8AFB000208F9000D0CF
-:1083C0003084FFFFAFA40010AFBF0044AFBE004039
-:1083D000AFB7003CAFB60038AFB50034AFB4003033
-:1083E000AFB3002CAFB20028AFB10024A7A0001893
-:1083F000920600D1920500D030C400FF30A300FFE8
-:108400000064102B10400122AFA00014920900D08C
-:108410008FB50010312800FF0088382324F4FFFFB7
-:108420000014882B0015982B02339024524001260B
-:108430008FB40014961E0012961F00108FB7001004
-:1084400003DFC823001714000019C400000224032E
-:108450000018140302E2B02A52C00001004020219B
-:108460000284282B10A0000200801821028018210D
-:1084700000033C0000071C033064FFFF2C8600094A
-:1084800014C000020060B821241700088E0A0008FA
-:10849000001769808E09000C31ABFFFF3C0C001007
-:1084A000016C402527520400AF4A0038AF9200B853
-:1084B000AF49003CAF480030000000000000000061
-:1084C00000000000000000000000000000000000AC
-:1084D00000000000000000008F4F000031EE00207F
-:1084E00011C0FFFD0017982A027110240A000E83A4
-:1084F0000000B02155E001019258000131130080C5
-:10850000126001CF012020219655001232A5FFFFF5
-:108510000E000CCBA7B500188F9000D00291A023BD
-:1085200026CD00018F9100B8000DB4000016B403F1
-:108530002638004002D7582A0014882B2405000151
-:108540000300902101711024AF9800B8AFA500146A
-:10855000104001BC8F8900B03C0C08008D8C005489
-:10856000240BFF80921E00D001895021014B28244A
-:10857000921900D0AF4500288E4700103C08080033
-:108580008D0800583C1808008F18005430E33FFF56
-:108590000003218001043021012658212402FF809C
-:1085A0000162F824920C00D0AF5F002C92480000CA
-:1085B00033D100FF333500FF0309982100117140CA
-:1085C000001578C0326D007F01CF382101BA282113
-:1085D000318300FF3164007F3C0A000C00AA88212F
-:1085E0000367F02100033140009A10213108003F59
-:1085F0003C1F000E00D1C021005F982127D90088C0
-:108600002D150008AF9100C0AF9900ACAF9800BC29
-:10861000AF9300B412A0018A00008821240E00014B
-:10862000010E4004310D005D11A0FFB2310F0002B8
-:108630008E4A00283C0300803C04FFEFAE6A000035
-:108640008E450024A260000A3488FFFFAE65000456
-:108650009247002C3C1FFF9F37FEFFFFA267000CD4
-:108660008E62000C3C180040A267000B00433025CE
-:1086700000C8C824033E88240238A825AE75000C23
-:108680008E490004AE6000183C0F00FFAE69001474
-:108690008E4D002C35EEFFFF8F8B00B001AE6024B5
-:1086A000AE6C00108E470008A660000896450012C8
-:1086B000AE6700208E42000C30B03FFF00105180AA
-:1086C000AE6200248E5E0014014B182130A400011C
-:1086D000AE7E00288E590018000331C2000443808A
-:1086E000AE79002C8E51001C00C8F821A67F001C1A
-:1086F000AE710030965800028E550020A678001EFC
-:10870000AE75003492490033313000045600000544
-:10871000925000008F8C00D08D8B007CAE6B0030AF
-:10872000925000008F8F00BCA1F00000924E0033E9
-:1087300031CD000251A00007925E00018F8900BC7C
-:108740002418FF80913100000311A825A1350000F5
-:10875000925E00018F9900BC2409FFBF240BFFDF4C
-:10876000A33E00018F9500BC92B8000D3311007F2D
-:10877000A2B1000D8F8E00BC91D0000D02097824AB
-:10878000A1CF000D8F8800BC8E6D0014910A000DE2
-:108790002DAC0001000C2940014B382400E51825C0
-:1087A000A103000D964200128F8800BC8F8700D075
-:1087B000A50200028E45000490FF00BC30A4000317
-:1087C0000004302330DE000300BE102133F9000224
-:1087D00017200002244400342444003090E200BCFE
-:1087E00000A2302430DF000417E0000224830004DC
-:1087F000008018218F8F00AC24090002AD03000413
-:10880000A1E90000924E003F8F8D00ACA1AE0001A7
-:108810008F9500AC924C003F8E440004A6AC000241
-:10882000976B003C0E000CD63170FFFF00025380A6
-:10883000020A38253C05420000E51825AEA30004D5
-:108840008F8600AC8E480038ACC800188E440034C7
-:10885000ACC4001CACC0000CACC00010A4C0001420
-:10886000A4C00016A4C00020A4C00022ACC00024F4
-:108870008E6400145080000124040001ACC4000880
-:108880000E000CF6241100010A000E768F9000D025
-:10889000920F00D2920E00D08FB5001031EB00FF86
-:1088A00031CD00FF008D6023016C50212554FFFF66
-:1088B0000014882B0015982B023390241640FEDDFF
-:1088C000000000008FB400148FBF00448FBE004032
-:1088D0003A8200018FB7003C8FB600388FB5003464
-:1088E0008FB400308FB3002C8FB200288FB10024DA
-:1088F0008FB0002003E0000827BD0048331100209E
-:10890000122000EF24150001921E00BC241F00015C
-:108910000000A82133D900011320000DAFBF001CB7
-:108920008E4400148E0800840088102B144000022E
-:10893000008030218E0600848E03006400C3A82BC3
-:1089400016A0000200C020218E0400640080A8212F
-:108950008E4700148E05006400E5302B14C0000221
-:1089600000E020218E0400640095F02313C0000471
-:108970008FAC001C240A0002AFAA001C8FAC001CA4
-:10898000028C582B156000A8000018218E4F00386B
-:108990008E6D000C3C0E0080AE6F00008E4A0034DD
-:1089A0003C10FF9F01AE5825AE6A00049246003F7E
-:1089B000360CFFFF016C38243C0500203C03FFEF20
-:1089C000A266000B00E510253468FFFF8F8700B812
-:1089D0000048F8243C04000803E4C825AE79000CE4
-:1089E0008CF80014AE60001802BE7821AE78001436
-:1089F0008CF10018AE71001C8CE90008AE690024EF
-:108A00008CEE000CAE6F002CAE600028AE6E002025
-:108A1000A6600038A660003A8CED001401B58023F2
-:108A2000021E902312400011AE72001090EA003D29
-:108A30008E6500048E640000000A310000A6C82183
-:108A4000000010210326402B0082F82103E8C021FA
-:108A5000AE790004AE78000090F1003DA271000AEA
-:108A60008F8900B895320006A67200088F9800AC76
-:108A70002419000202A02021A31900009769003CDC
-:108A80008F9200AC0E000CD63131FFFF00027B80CC
-:108A90008F8500B8022F68253C0E420001AE80256C
-:108AA000AE5000048F8400AC8CAC0038AC8C001845
-:108AB0008CAB0034AC8B001CAC80000CAC80001084
-:108AC000A4800014A4800016A4800020A4800022AA
-:108AD000AC80002490A7003FA487000212A00135BB
-:108AE0002403000153C0000290A2003D90A2003E6A
-:108AF00024480001A08800018F9F00ACAFF500085A
-:108B00008F8300D024070034906600BC30C500027B
-:108B100050A00001240700308F9200B88F8A00BC5B
-:108B2000906D00BC924B00002412C00032A50003DF
-:108B3000A14B00008F8600B88F8800BC240200047F
-:108B400090C400010045182330790003A1040001FE
-:108B50008F8A00BC8F9F00B800F53821955800021D
-:108B600097E9001200F9382103128824312F3FFFC2
-:108B7000022F7025A54E00029150000231A800047A
-:108B8000320C003F358B0040A14B000212A00002C6
-:108B90008F8500BC00E838218F8E00D0ACA7000480
-:108BA000240BFFBF8DCD007C2EA400012403FFDF2A
-:108BB000ACAD000890B0000D00044140320C007FC5
-:108BC000A0AC000D8F8600BC90CA000D014B102494
-:108BD000A0C2000D8F8700BC90E5000D00A3F82413
-:108BE00003E8C825A0F9000D8F9100B88F8D00BC57
-:108BF0008E380020ADB800108E290024ADA90014D5
-:108C00008E2F0028ADAF00188E2E002C0E000CF613
-:108C1000ADAE001C8FB0001C240C0002120C00EE44
-:108C20008F9000D08FA3001C006088211460000288
-:108C30000060A8210000A02156A0FE390291A023C7
-:108C40000014882B8FA90010960700103C1E0020EE
-:108C50000136402302C750213112FFFFA60A00103F
-:108C6000AFB20010AF5E0030000000009617001099
-:108C7000961300121277008F000000008E05000C82
-:108C80008E0B00080016698000AD7021000DC7C36F
-:108C900001CDA82B0178782101F56021AE0E000CE2
-:108CA000AE0C00088FB300100013B82B02378024DD
-:108CB0001200FF048F9000D00A000E3C000000005C
-:108CC0008E4D0038A6600008240B0003AE6D000036
-:108CD0008E500034A260000A8F9800B8AE70000475
-:108CE0003C0500809311003FA26B000C8E6F000CBE
-:108CF0003C0EFF9FA271000B01E5102535CCFFFF54
-:108D00003C03FFEF8F9200B8004C30243464FFFF27
-:108D100000C4F824AE7F000C8E590014964800124F
-:108D20008F8A00B0AE7900108E490014AE60001832
-:108D3000AE600020AE690014AE6000248E470018BB
-:108D400031093FFF0009F180AE6700288E4D000811
-:108D500003CA802131180001AE6D00308E4F000C27
-:108D60008F8C00AC001089C200185B80022B282178
-:108D7000240E0002A665001CA6600036AE6F002C13
-:108D8000A18E00009763003C8F8A00AC3C04420037
-:108D90003062FFFF00443025AD4600048F9F00B8CD
-:108DA000240700012411C0008FF30038240600348A
-:108DB000AD5300188FF90034AD59001CAD40000CC4
-:108DC000AD400010A5400014A5400016A5400020AD
-:108DD000A5400022AD400024A5550002A147000196
-:108DE0008F9E00AC8F8800B88F9200BCAFD5000872
-:108DF000910D0000A24D00008F9000B88F8B00BC39
-:108E000092180001A17800018F8400BC94850002B3
-:108E100000B1782401E97025A48E0002908C000234
-:108E20003183003FA08300028F8300D08F8400BC79
-:108E3000906200BC305300025260000124060030F2
-:108E4000AC8600048C6F007C2403FFBF02A0882145
-:108E5000AC8F0008908E000D31CC007FA08C000DEF
-:108E60008F8600BC90C2000D00432024A0C4000DDA
-:108E70008F8900BC913F000D37F90020A139000D0A
-:108E80008F8800B88F9300BC8D070020AE6700105C
-:108E90008D0A0024AE6A00148D1E0028AE7E0018D4
-:108EA0008D12002C0E000CF6AE72001C0A00103D54
-:108EB0008F9000D0960E00148E03000431CCFFFF7B
-:108EC000000C10C000622021AF44003C8E1F000443
-:108ED0008F46003C03E6C8231B20003C0000000036
-:108EE0008E0F000025E200013C05001034B500089B
-:108EF000AF420038AF550030000000000000000015
-:108F00000000000000000000000000000000000061
-:108F100000000000000000008F580000330B00200C
-:108F20001160FFFD000000008F5304003C0D002085
-:108F3000AE1300088F570404AE17000CAF4D00307D
-:108F4000000000003C0608008CC600442416000106
-:108F500010D600BD00000000961F00123C0508005E
-:108F60008CA5004000BFC821A61900129609001464
-:108F700025270001A6070014960A00143144FFFFBC
-:108F80005486FF498FB30010A60000140E000E1681
-:108F900030A5FFFF3C0408008C84002496030012D7
-:108FA0000044102300623023A60600120A00105964
-:108FB0008FB30010A08300018F8200AC2404000155
-:108FC000AC4400080A000FF08F8300D08E0200002E
-:108FD0000A0010EA3C0500108F8200C08FA7001C19
-:108FE000921800D0920B00D0920E00D0331100FFE7
-:108FF000316900FF00117940000928C001E56021B6
-:1090000031C300FF036C50210003314000C2C8216E
-:10901000255F0088AF9F00ACAF9900BCA1470088D6
-:109020009768003C03C020218F9100AC0E000CD645
-:109030003110FFFF00026B80020DC0253C0442008E
-:109040008F8D00B803045825AE2B00048DA900387D
-:109050008F8B00AC0000882100118100AD690018E1
-:109060008DAF00343C087FFF3504FFFFAD6F001C5F
-:1090700091AC003E8D65001C8D660018000C190037
-:10908000000C770200A33821020E102500E3F82B14
-:1090900000C2C821033F5021AD67001CAD6A001813
-:1090A000AD60000CAD60001091B8003E24050005D5
-:1090B00003C45024A578001495A9000403C02021FE
-:1090C000A569001691AF003EA56F002095B1000480
-:1090D000A5710022AD60002491AE003FA56E000294
-:1090E00091B0003E91AC003D01901023244300015B
-:1090F000A16300018F8600AC8F9F00BCACDE00082E
-:10910000A3E500008F9000BC8F9900B82405FFBF35
-:1091100096070002973800120247782433093FFF70
-:1091200001E98825A6110002921200022418FFDF2F
-:10913000324E003F35CD0040A20D00028F8600BCAC
-:109140008F8C00D02412FFFFACC000048D8B007CFC
-:109150003C0C8000ACCB000890C2000D3043007F77
-:10916000A0C3000D8F8700BC90FF000D03E5C8244D
-:10917000A0F9000D8F9100BC9229000D01387824D0
-:10918000A22F000D8F9000BCAE120010AE1500147F
-:10919000920E00182415FF8002AE6825A20D00185B
-:1091A0008F8500BC8F8300B88CAB0018016C102435
-:1091B000004A3025ACA600189068003EA0A8001C0C
-:1091C0008F9F00B88F8700BC8F9800D097F900045C
-:1091D000A4F9001E0E0002138F0500848F8600D0B4
-:1091E000000279400002490090D200BC01E98821C8
-:1091F000004028213255000212A0000303D1202193
-:109200000002A8800095202190CD00BC31B200045E
-:109210001240000333DF0003000540800088202156
-:10922000240600048F9E00BC00DFC8233327000300
-:1092300000875021AFCA00040E000CF6A665003866
-:109240000A0010388F9000D0961E00123C080800CB
-:109250008D080024011E9021A61200120A00105948
-:109260008FB3001027BDFFE03C1808008F18005096
-:10927000AFB00010AFBF0018AFB10014AF8400B0A2
-:1092800093710074030478212410FF8031EE007F75
-:109290003225007F01F0582401DA68213C0C000AD5
-:1092A000A38500C401AC2821AF4B002494A9001071
-:1092B0009768000690A600620080382124020030E2
-:1092C0000109202330C300F0AF8500D010620019DF
-:1092D0003090FFFF90AE0062240DFFF0240A005092
-:1092E00001AE6024318B00FF116A002F00000000E6
-:1092F00016000007241F0C00AF5F00248FB100147C
-:109300008FBF00188FB0001003E0000827BD0020B9
-:109310000E000E1C02002021241F0C00AF5F002451
-:109320008FB100148FBF00188FB0001003E0000849
-:1093300027BD002094A200E094A400E290BF011396
-:10934000008218263079FFFF33E700C014E00009DF
-:109350002F31000116000038000000005620FFE603
-:10936000241F0C000E000D18000000000A0011ED73
-:10937000241F0C001620FFDE000000000E000D1858
-:10938000000000001440FFDC241F0C001600002227
-:109390008F8300D0906901133122003FA062011336
-:1093A0000A0011ED241F0C0094AF00D48F8600D466
-:1093B00000E02821240400050E000C5C31F0FFFFC2
-:1093C0001440000524030003979100E600001821D3
-:1093D0002625FFFFA78500E68F5801B80700FFFE8E
-:1093E0003C196013AF400180241F0C00AF50018472
-:1093F000007938253C101000AF4701888FB1001468
-:10940000AF5001B8AF5F00248FB000108FBF0018BD
-:1094100003E0000827BD00200E000E1C02002021E2
-:109420005040FFB5241F0C008F8300D090690113BA
-:109430000A0012163122003F0E000E1C02002021ED
-:109440001440FFAD241F0C00122000078F8300D0B2
-:10945000906801133106003F34C20040A06201133E
-:109460000A0011ED241F0C000E000D180000000072
-:109470005040FFA1241F0C008F8300D0906801137F
-:109480003106003F0A00124634C20040AF9B00C8BC
-:1094900003E00008AF8000EC3089FFFF0009404284
-:1094A0002D020041000921801440000200095040B3
-:1094B00024080040000830C0000811400046582130
-:1094C000256701A800E2C821272F007F2418FF800C
-:1094D00001F818240064302100CA702125CC00FF57
-:1094E000240DFF00018D202425650088240A0088B2
-:1094F0003C010800AC2A004C3C010800AC2500509F
-:10950000AF8400D43C010800AC2900603C01080095
-:10951000AC2800643C010800AC2700543C01080062
-:10952000AC2300583C010800AC26005C03E00008B6
-:1095300000000000308300FF30C6FFFF30E400FF72
-:109540008F4201B80440FFFE00034C00012438257F
-:109550003C08600000E820253C031000AF45018076
-:10956000AF460184AF44018803E00008AF4301B86F
-:109570008F86001C3C096012352700108CCB00043C
-:109580003C0C600E35850010316A00062D48000144
-:10959000ACE800C48CC40004ACA431808CC20008C8
-:1095A00094C30002ACA2318403E00008A78300E466
-:1095B0003C0308008C6300508F8400E88F86001CF9
-:1095C0002402FF800064C0210302C824AF59002890
-:1095D0008CCD00043305007F00BA78213C0E000CCE
-:1095E00001EE2821ACAD00588CC80008AF8500D032
-:1095F0003C076012ACA8005C8CCC001034E8001072
-:10960000ACAC000C8CCB000CACAB000894AA0014E2
-:109610003C0208008C42004425490001A4A9001422
-:1096200094A400143083FFFF106200178F8400D0D1
-:109630003C0A08008D4A0040A4AA00128CCE0018F3
-:10964000AC8E00248CCD0014AC8D00208CC700188B
-:10965000AC87002C8CCC001424060001AC8C0028B4
-:109660008D0B00BC5166001A8D0200B48D0200B84B
-:10967000A482003A948F003AA48F003C948800D4CE
-:1096800003E000083102FFFF3C0908008D29002497
-:10969000A4A000148F8400D0A4A900128CCE0018BE
-:1096A000AC8E00248CCD0014AC8D00208CC700182B
-:1096B000AC87002C8CCC001424060001AC8C002854
-:1096C0008D0B00BC5566FFEA8D0200B88D0200B418
-:1096D000A482003A948F003AA48F003C948800D46E
-:1096E00003E000083102FFFF8F86001C3C0C0800DD
-:1096F0008D8C0050240BFF808CCD00083C03000CA7
-:10970000000D51C0018A4021010B4824AF8A00E8B6
-:10971000AF49002890C700073105007F00BA10212B
-:109720000043282130E4000410800039AF8500D0C8
-:1097300090CF000731EE000811C000380000000093
-:109740008CD9000C8CC400140324C02B13000030EF
-:10975000000000008CC2000CACA200648CCD00188C
-:109760002402FFF8ACAD00688CCC0010ACAC0080DB
-:109770008CCB000CACAB00848CCA001CACAA007C67
-:1097800090A900BC01224024A0A800BC90C30007FF
-:109790003067000810E000048F8500D090AF00BC57
-:1097A00035EE0001A0AE00BC90D9000733380001AF
-:1097B000130000088F8300D08F8700D0240400346A
-:1097C00090E800BC35030002A0E300BC8F8300D00A
-:1097D000AC6400C090C900073126000210C000052B
-:1097E00000000000906A00BC35420004A06200BC8A
-:1097F0008F8300D09065011330AD003FA06D011341
-:109800008F8C00D0958B00D403E000083162FFFFFD
-:109810008CC200140A001305000000000A001306A1
-:10982000ACA0006427BDFFD8AFB000108F90001C23
-:10983000AFBF0024AFB40020AFB20018AFB1001426
-:10984000AFB3001C9613000E3C07600A3C14600680
-:109850003264FFFF369300100E00125534F40410EA
-:109860008F8400D43C11600E0E00099B363100102D
-:10987000920E00153C0708008CE700603C12601255
-:1098800031CD000FA38D00F08E0E00048E0D000868
-:1098900096080012961F00109619001A9618001EBE
-:1098A000960F001C310CFFFF33EBFFFF332AFFFF45
-:1098B0003309FFFF31E6FFFF3C010800AC2B0040FD
-:1098C0003C010800AC2C00243C010800AC2A0044F8
-:1098D000AE293178AE26317C92020015960300162F
-:1098E00036520010304400FF3065FFFF3C06080090
-:1098F0008CC60064AE243188AE4500B492080014D2
-:1099000096190018241F0001011FC004332FFFFF08
-:109910003C0508008CA50058AE5800B8AE4F00BCFE
-:10992000920C0014AF8E00D8AF8D00DC318B00FF9D
-:10993000AE4B00C0920A0015AE670048AE66004C00
-:10994000314900FFAE4900C8AE65007C3C03080009
-:109950008C6300503C0408008C84004C3C080800D8
-:109960008D0800543C0208008C42005C8FBF00242C
-:10997000AE6300808FB00010AE8300748FB3001C04
-:10998000AE22319CAE4200DCAE2731A0AE2631A41F
-:10999000AE24318CAE233190AE283194AE2531986F
-:1099A000AE870050AE860054AE8500708FB10014B3
-:1099B000AE4700E0AE4600E4AE4400CCAE4300D07B
-:1099C000AE4800D4AE4500D88FB400208FB2001846
-:1099D00003E0000827BD002827BDFFE0AFB1001459
-:1099E000AFBF0018241100010E000845AFB00010F1
-:1099F00010510005978400E6978300CC0083102B5C
-:109A0000144000088F8500D4240700028FBF00187F
-:109A10008FB100148FB0001000E0102103E00008A7
-:109A200027BD00200E000C7A24040005AF8200E858
-:109A30001040FFF6240700020E0008498F90001C1A
-:109A4000979F00E68F9900E88F8D00C827EF0001EF
-:109A5000240E0050AF590020A78F00E6A1AE0000F1
-:109A60003C0C08008D8C00648F8600C8240A80009E
-:109A7000000C5E00ACCB0074A4C0000694C9000AC0
-:109A8000241FFF803C0D000C012AC024A4D8000A2A
-:109A900090C8000A24182000011F1825A0C3000A3E
-:109AA0008F8700C8A0E000788F8500C800003821AB
-:109AB000A0A000833C0208008C4200508F8400E884
-:109AC0000044782101FFC824AF590028960B0002FA
-:109AD00031EE007F01DA6021018D3021A4CB00D46A
-:109AE000960A0002AF8600D03C0E000425492401EE
-:109AF000A4C900E68E080004ACC800048E03000868
-:109B0000ACC30000A4C00010A4C00014A0C000D0CA
-:109B10008F8500D02403FFBFA0A000D13C04080023
-:109B20008C8400648F8200D0A04400D28E1F000C71
-:109B30008F8A00D0978F00E4AD5F001C8E19001053
-:109B400024100030AD590018A5400030A551005434
-:109B5000A5510056A54F0016AD4E0068AD580080C7
-:109B6000AD580084914D006231AC000F358B001070
-:109B7000A14B00628F8600D090C900633128007F1E
-:109B8000A0C800638F8400D02406FFFF9085006387
-:109B900000A31024A08200638F9100D000E0102168
-:109BA000923F00BC37F90001A23900BC8F8A00D077
-:109BB000938F00F0AD580064AD5000C0914E00D3BB
-:109BC000000F690031CC000F018D5825A14B00D347
-:109BD0008F8500D08F8900DCACA900E88F8800D881
-:109BE0008FBF00188FB100148FB0001027BD002068
-:109BF000ACA800ECA4A600D6A4A000E0A4A000E2BB
-:109C000003E000080000000027BDFFE0AFB0001037
-:109C10008F90001CAFB10014AFBF00188E19000464
-:109C20003C1808008F180050240FFF80001989C0CD
-:109C30000238702131CD007F01CF602401BA50215C
-:109C40003C0B000CAF4C0028014B4021950900D47F
-:109C5000950400D68E0700043131FFFFAF8800D095
-:109C60000E000913000721C08E0600048F8300C870
-:109C7000000629C0AF4500209064003E30820040BD
-:109C8000144000068F8400D0341FFFFF948300D659
-:109C90003062FFFF145F000400000000948400D6CF
-:109CA0000E0008A83084FFFF8E050004022030213A
-:109CB0008FBF00188FB100148FB000102404002251
-:109CC00000003821000529C00A00127C27BD0020B1
-:109CD00027BDFFE0AFB100143091FFFFAFB000101F
-:109CE000AFBF00181220001D000080218F86001CCD
-:109CF0008CC500002403000600053F020005140285
-:109D000030E4000714830015304500FF2CA800063E
-:109D10001100004D000558803C0C0800258C57D4DC
-:109D2000016C50218D490000012000080000000056
-:109D30008F8E00EC240D000111CD005900000000B1
-:109D4000260B00013170FFFF24CA00200211202BD6
-:109D5000014030211480FFE6AF8A001C0200102170
-:109D60008FBF00188FB100148FB0001003E00008FF
-:109D700027BD0020938700CE14E00038240400148F
-:109D80000E001338000000008F86001C2402000122
-:109D90000A00147FAF8200EC8F8900EC24080002D7
-:109DA0001128003B2404001300002821000030216A
-:109DB000240700010E00127C000000000A00147F3E
-:109DC0008F86001C8F8700EC2405000214E5FFF647
-:109DD000240400120E0012E9000000008F8500E844
-:109DE00000403021240400120E00127C00003821B3
-:109DF0000A00147F8F86001C8F8300EC241F000351
-:109E0000147FFFD0260B00010E00129B0000000003
-:109E10008F8500E800403021240200022404001055
-:109E200000003821AF8200EC0E00127C0000000020
-:109E30000A00147F8F86001C8F8F00EC240600021E
-:109E400011E6000B0000000024040010000028218F
-:109E5000000030210A00149C240700010000282182
-:109E60000E00127C000030210A00147F8F86001C37
-:109E70000E0013A500000000144000128F99001C72
-:109E80008F86001C240200030A00147FAF8200ECBE
-:109E90000E001431000000000A00147F8F86001CA1
-:109EA0000E00128B000000002402000224040014A3
-:109EB0000000282100003021000038210A0014B9D8
-:109EC000AF8200EC004038212404001097380002D3
-:109ED000000028210E00127C3306FFFF0A00147FC9
-:109EE0008F86001C8F8400C83C077FFF34E6FFFF8D
-:109EF0008C8500742402000100A61824AC83007431
-:109F000003E00008A082000510A000362CA200800B
-:109F1000274A04003C0B000524090080104000077C
-:109F20002408008030A6000F00C540212D030081C9
-:109F30001460000200A0482124080080AF4B0030CC
-:109F400000000000000000000000000011000009F7
-:109F500000003821014030218C8D000024E70004EE
-:109F600000E8602BACCD0000248400041580FFFACB
-:109F700024C60004000000000000000000000000F3
-:109F80003C0E0006010E3825AF47003000000000EF
-:109F900000000000000000008F4F000031E80010BA
-:109FA0001100FFFD000000008F42003C8F43003C89
-:109FB0000049C8210323C02B130000040000000047
-:109FC0008F4C003825860001AF4600388F47003C93
-:109FD00000A9282300E96821AF4D003C14A0FFCE62
-:109FE0002CA2008003E000080000000027BDFFD085
-:109FF0003C020002AFB100143C11000CAF45003828
-:10A00000AFB3001CAF46003C00809821AF42003047
-:10A0100024050088AF44002803512021AFBF002849
-:10A02000AFB50024AFB40020AFB200180E0014F199
-:10A03000AFB000103C1F08008FFF004C3C18080018
-:10A040008F1800642410FF8003F3A82132B9007F29
-:10A0500002B078240018A0C0033A70210018914083
-:10A0600001D12021AF4F00280E0014F10254282105
-:10A070003C0D08008DAD00502405012001B358218E
-:10A08000316C007F01705024019A48210131202158
-:10A090000E0014F1AF4A00283C0808008D08005457
-:10A0A0003C0508008CA500640113382130E6007FD0
-:10A0B00000F0182400DA202100912021AF4300286D
-:10A0C0000E0014F1000529403C0208008C420058A3
-:10A0D0003C1008008E1000601200001C0053882104
-:10A0E0002415FF800A0015743C14000C3226007FF2
-:10A0F0000235182400DA202102402821AF4300282D
-:10A10000009420210E0014F12610FFC01200000F51
-:10A11000023288212E05004110A0FFF42412100005
-:10A120003226007F001091800235182400DA2021A9
-:10A1300002402821AF430028009420210E0014F192
-:10A14000000080211600FFF3023288213C0B08003A
-:10A150008D6B005C240AFF802405000201734021FE
-:10A16000010A4824AF4900283C0408009484006296
-:10A170003110007F021A88213C07000C0E000CAA47
-:10A180000227982100402821026020218FBF00284B
-:10A190008FB500248FB400208FB3001C8FB200183D
-:10A1A0008FB100148FB000100A0014F127BD0030E9
-:10A1B0008F83001C8C62000410400003000000002C
-:10A1C00003E00008000000008C6400108C650008AB
-:08A1D0000A00152A8C66000C40
-:08A1D800000000000000001B64
-:10A1E0000000000F0000000A000000080000000648
-:10A1F000000000050000000500000004000000044D
-:10A200000000000300000003000000030000000342
-:10A210000000000300000002000000020000000235
-:10A220000000000200000002000000020000000226
-:10A230000000000200000002000000020000000216
-:10A240000000000200000002000000020000000206
-:0CA25000000000010000000100000001FF
-:04A25C0008000F24C3
-:10A2600008000D6C08000FB80800106008000F4CC3
-:10A2700008000F8C0800119408000D88080011B820
-:10A2800008000DD8080015540800151C08000D889A
-:10A2900008000D8808000D880800124008001240D0
-:10A2A00008000D8808000D88080014E008000D88DB
-:10A2B00008000D8808000D8808000D88080013B4F8
-:10A2C00008000D8808000D8808000D8808000D881A
-:10A2D00008000D8808000D8808000D8808000D880A
-:10A2E00008000D8808000D8808000D8808000D88FA
-:10A2F00008000D8808000D8808000FAC08000D88C4
-:10A3000008000D880800167808000D8808000D88E0
-:10A3100008000D8808000D8808000D8808000D88C9
-:10A3200008000D8808000D8808000D8808000D88B9
-:10A3300008000D8808000D8808000D8808000D88A9
-:10A3400008000D8808000D8808000D88080014100A
-:10A3500008000D8808000D8808001334080012A4B6
-:10A3600008001E2C08001EFC08001F1408001F28EF
-:10A3700008001F3808001E2C08001E2C08001E2C88
-:10A3800008001ED808002E1408002E1C08002DE41A
-:10A3900008002DF008002DFC08002E08080052F4DB
-:10A3A000080052B40800528008005254080052308D
-:04A3B000080051EC64
-:0CA3B4000A000C84000000000000000003
-:10A3C0000000000D727870362E322E310000000031
-:10A3D0000602010300000000000000010000000070
-:10A3E000000000000000000000000000000000006D
-:10A3F000000000000000000000000000000000005D
-:10A40000000000000000000000000000000000004C
-:10A41000000000000000000000000000000000003C
-:10A42000000000000000000000000000000000002C
-:10A43000000000000000000000000000000000001C
-:10A44000000000000000000000000000000000000C
-:10A4500000000000000000000000000000000000FC
-:10A4600000000000000000000000000000000000EC
-:10A4700000000000000000000000000000000000DC
-:10A4800000000000000000000000000000000000CC
-:10A4900000000000000000000000000000000000BC
-:10A4A00000000000000000000000000000000000AC
-:10A4B000000000000000000000000000000000009C
-:10A4C000000000000000000000000000000000008C
-:10A4D000000000000000000000000000000000007C
-:10A4E000000000000000000000000000000000006C
-:10A4F000000000000000000000000000000000005C
-:10A50000000000000000000000000000000000004B
-:10A51000000000000000000000000000000000003B
-:10A52000000000000000000000000000000000002B
-:10A53000000000000000000000000000000000001B
-:10A54000000000000000000000000000000000000B
-:10A5500000000000000000000000000000000000FB
-:10A5600000000000000000000000000000000000EB
-:10A5700000000000000000000000000000000000DB
-:10A5800000000000000000000000000000000000CB
-:10A5900000000000000000000000000000000000BB
-:10A5A00000000000000000000000000000000000AB
-:10A5B000000000000000000000000000000000009B
-:10A5C000000000000000000000000000000000008B
-:10A5D000000000000000000000000000000000007B
-:10A5E000000000000000000000000000000000006B
-:10A5F000000000000000000000000000000000005B
-:10A60000000000000000000000000000000000004A
-:10A61000000000000000000000000000000000003A
-:10A62000000000000000000000000000000000002A
-:10A63000000000000000000000000000000000001A
-:10A64000000000000000000000000000000000000A
-:10A6500000000000000000000000000000000000FA
-:10A6600000000000000000000000000000000000EA
-:10A6700000000000000000000000000000000000DA
-:10A6800000000000000000000000000000000000CA
-:10A6900000000000000000000000000000000000BA
-:10A6A00000000000000000000000000000000000AA
-:10A6B000000000000000000000000000000000009A
-:10A6C000000000000000000000000000000000008A
-:10A6D000000000000000000000000000000000007A
-:10A6E000000000000000000000000000000000006A
-:10A6F000000000000000000000000000000000005A
-:10A700000000000000000000000000000000000049
-:10A710000000000000000000000000000000000039
-:10A720000000000000000000000000000000000029
-:10A730000000000000000000000000000000000019
-:10A740000000000000000000000000000000000009
-:10A7500000000000000000000000000000000000F9
-:10A7600000000000000000000000000000000000E9
-:10A7700000000000000000000000000000000000D9
-:10A7800000000000000000000000000000000000C9
-:10A7900000000000000000000000000000000000B9
-:10A7A00000000000000000000000000000000000A9
-:10A7B0000000000000000000000000000000000099
-:10A7C0000000000000000000000000000000000089
-:10A7D0000000000000000000000000000000000079
-:10A7E0000000000000000000000000000000000069
-:10A7F0000000000000000000000000000000000059
-:10A800000000000000000000000000000000000048
-:10A810000000000000000000000000000000000038
-:10A820000000000000000000000000000000000028
-:10A830000000000000000000000000000000000018
-:10A840000000000000000000000000000000000008
-:10A8500000000000000000000000000000000000F8
-:10A8600000000000000000000000000000000000E8
-:10A8700000000000000000000000000000000000D8
-:10A8800000000000000000000000000000000000C8
-:10A8900000000000000000000000000000000000B8
-:10A8A00000000000000000000000000000000000A8
-:10A8B0000000000000000000000000000000000098
-:10A8C0000000000000000000000000000000000088
-:10A8D0000000000000000000000000000000000078
-:10A8E0000000000000000000000000000000000068
-:10A8F0000000000000000000000000000000000058
-:10A900000000000000000000000000000000000047
-:10A910000000000000000000000000000000000037
-:10A920000000000000000000000000000000000027
-:10A930000000000000000000000000000000000017
-:10A940000000000000000000000000000000000007
-:10A9500000000000000000000000000000000000F7
-:10A9600000000000000000000000000000000000E7
-:10A9700000000000000000000000000000000000D7
-:10A9800000000000000000000000000000000000C7
-:10A9900000000000000000000000000000000000B7
-:10A9A00000000000000000000000000000000000A7
-:10A9B0000000000000000000000000000000000097
-:10A9C0000000000000000000000000000000000087
-:10A9D0000000000000000000000000000000000077
-:10A9E0000000000000000000000000000000000067
-:10A9F0000000000000000000000000000000000057
-:10AA00000000000000000000000000000000000046
-:10AA10000000000000000000000000000000000036
-:10AA20000000000000000000000000000000000026
-:10AA30000000000000000000000000000000000016
-:10AA40000000000000000000000000000000000006
-:10AA500000000000000000000000000000000000F6
-:10AA600000000000000000000000000000000000E6
-:10AA700000000000000000000000000000000000D6
-:10AA800000000000000000000000000000000000C6
-:10AA900000000000000000000000000000000000B6
-:10AAA00000000000000000000000000000000000A6
-:10AAB0000000000000000000000000000000000096
-:10AAC0000000000000000000000000000000000086
-:10AAD0000000000000000000000000000000000076
-:10AAE0000000000000000000000000000000000066
-:10AAF0000000000000000000000000000000000056
-:10AB00000000000000000000000000000000000045
-:10AB10000000000000000000000000000000000035
-:10AB20000000000000000000000000000000000025
-:10AB30000000000000000000000000000000000015
-:10AB40000000000000000000000000000000000005
-:10AB500000000000000000000000000000000000F5
-:10AB600000000000000000000000000000000000E5
-:10AB700000000000000000000000000000000000D5
-:10AB800000000000000000000000000000000000C5
-:10AB900000000000000000000000000000000000B5
-:10ABA00000000000000000000000000000000000A5
-:10ABB0000000000000000000000000000000000095
-:10ABC0000000000000000000000000000000000085
-:10ABD0000000000000000000000000000000000075
-:10ABE0000000000000000000000000000000000065
-:10ABF0000000000000000000000000000000000055
-:10AC00000000000000000000000000000000000044
-:10AC10000000000000000000000000000000000034
-:10AC20000000000000000000000000000000000024
-:10AC30000000000000000000000000000000000014
-:10AC40000000000000000000000000000000000004
-:10AC500000000000000000000000000000000000F4
-:10AC600000000000000000000000000000000000E4
-:10AC700000000000000000000000000000000000D4
-:10AC800000000000000000000000000000000000C4
-:10AC900000000000000000000000000000000000B4
-:10ACA00000000000000000000000000000000000A4
-:10ACB0000000000000000000000000000000000094
-:10ACC0000000000000000000000000000000000084
-:10ACD0000000000000000000000000000000000074
-:10ACE0000000000000000000000000000000000064
-:10ACF0000000000000000000000000000000000054
-:10AD00000000000000000000000000000000000043
-:10AD10000000000000000000000000000000000033
-:10AD20000000000000000000000000000000000023
-:10AD30000000000000000000000000000000000013
-:10AD40000000000000000000000000000000000003
-:10AD500000000000000000000000000000000000F3
-:10AD600000000000000000000000000000000000E3
-:10AD700000000000000000000000000000000000D3
-:10AD800000000000000000000000000000000000C3
-:10AD900000000000000000000000000000000000B3
-:10ADA00000000000000000000000000000000000A3
-:10ADB0000000000000000000000000000000000093
-:10ADC0000000000000000000000000000000000083
-:10ADD0000000000000000000000000000000000073
-:10ADE0000000000000000000000000000000000063
-:10ADF0000000000000000000000000000000000053
-:10AE00000000000000000000000000000000000042
-:10AE10000000000000000000000000000000000032
-:10AE20000000000000000000000000000000000022
-:10AE30000000000000000000000000000000000012
-:10AE40000000000000000000000000000000000002
-:10AE500000000000000000000000000000000000F2
-:10AE600000000000000000000000000000000000E2
-:10AE700000000000000000000000000000000000D2
-:10AE800000000000000000000000000000000000C2
-:10AE900000000000000000000000000000000000B2
-:10AEA00000000000000000000000000000000000A2
-:10AEB0000000000000000000000000000000000092
-:10AEC0000000000000000000000000000000000082
-:10AED0000000000000000000000000000000000072
-:10AEE0000000000000000000000000000000000062
-:10AEF0000000000000000000000000000000000052
-:10AF00000000000000000000000000000000000041
-:10AF10000000000000000000000000000000000031
-:10AF20000000000000000000000000000000000021
-:10AF30000000000000000000000000000000000011
-:10AF40000000000000000000000000000000000001
-:10AF500000000000000000000000000000000000F1
-:10AF600000000000000000000000000000000000E1
-:10AF700000000000000000000000000000000000D1
-:10AF800000000000000000000000000000000000C1
-:10AF900000000000000000000000000000000000B1
-:10AFA00000000000000000000000000000000000A1
-:10AFB0000000000000000000000000000000000091
-:10AFC0000000000000000000000000000000000081
-:10AFD0000000000000000000000000000000000071
-:10AFE0000000000000000000000000000000000061
-:10AFF0000000000000000000000000000000000051
-:10B000000000000000000000000000000000000040
-:10B010000000000000000000000000000000000030
-:10B020000000000000000000000000000000000020
-:10B030000000000000000000000000000000000010
-:10B040000000000000000000000000000000000000
-:10B0500000000000000000000000000000000000F0
-:10B0600000000000000000000000000000000000E0
-:10B0700000000000000000000000000000000000D0
-:10B0800000000000000000000000000000000000C0
-:10B0900000000000000000000000000000000000B0
-:10B0A00000000000000000000000000000000000A0
-:10B0B0000000000000000000000000000000000090
-:10B0C0000000000000000000000000000000000080
-:10B0D0000000000000000000000000000000000070
-:10B0E0000000000000000000000000000000000060
-:10B0F0000000000000000000000000000000000050
-:10B10000000000000000000000000000000000003F
-:10B11000000000000000000000000000000000002F
-:10B12000000000000000000000000000000000001F
-:10B13000000000000000000000000000000000000F
-:10B1400000000000000000000000000000000000FF
-:10B1500000000000000000000000000000000000EF
-:10B1600000000000000000000000000000000000DF
-:10B1700000000000000000000000000000000000CF
-:10B1800000000000000000000000000000000000BF
-:10B1900000000000000000000000000000000000AF
-:10B1A000000000000000000000000000000000009F
-:10B1B000000000000000000000000000000000008F
-:10B1C000000000000000000000000000000000007F
-:10B1D000000000000000000000000000000000006F
-:10B1E000000000000000000000000000000000005F
-:10B1F000000000000000000000000000000000004F
-:10B20000000000000000000000000000000000003E
-:10B21000000000000000000000000000000000002E
-:10B22000000000000000000000000000000000001E
-:10B23000000000000000000000000000000000000E
-:10B2400000000000000000000000000000000000FE
-:10B2500000000000000000000000000000000000EE
-:10B2600000000000000000000000000000000000DE
-:10B2700000000000000000000000000000000000CE
-:10B2800000000000000000000000000000000000BE
-:10B2900000000000000000000000000000000000AE
-:10B2A000000000000000000000000000000000009E
-:10B2B000000000000000000000000000000000008E
-:10B2C000000000000000000000000000000000007E
-:10B2D000000000000000000000000000000000006E
-:10B2E000000000000000000000000000000000005E
-:10B2F000000000000000000000000000000000004E
-:10B30000000000000000000000000000000000003D
-:10B31000000000000000000000000000000000002D
-:10B32000000000000000000000000000000000001D
-:10B33000000000000000000000000000000000000D
-:10B3400000000000000000000000000000000000FD
-:10B3500000000000000000000000000000000000ED
-:10B3600000000000000000000000000000000000DD
-:10B3700000000000000000000000000000000000CD
-:10B3800000000000000000000000000000000000BD
-:10B3900000000000000000000000000000000000AD
-:10B3A000000000000000000000000000000000009D
-:10B3B000000000000000000000000000000000008D
-:10B3C000000000000000000000000000000000007D
-:10B3D000000000000000000000000000000000006D
-:10B3E000000000000000000000000000000000005D
-:10B3F000000000000000000000000000000000004D
-:10B40000000000000000000000000000000000003C
-:10B41000000000000000000000000000000000002C
-:10B42000000000000000000000000000000000001C
-:10B43000000000000000000000000000000000000C
-:10B4400000000000000000000000000000000000FC
-:10B4500000000000000000000000000000000000EC
-:10B4600000000000000000000000000000000000DC
-:10B4700000000000000000000000000000000000CC
-:10B4800000000000000000000000000000000000BC
-:10B4900000000000000000000000000000000000AC
-:10B4A000000000000000000000000000000000009C
-:10B4B000000000000000000000000000000000008C
-:10B4C000000000000000000000000000000000007C
-:10B4D000000000000000000000000000000000006C
-:10B4E000000000000000000000000000000000005C
-:10B4F000000000000000000000000000000000004C
-:10B50000000000000000000000000000000000003B
-:10B51000000000000000000000000000000000002B
-:10B52000000000000000000000000000000000001B
-:10B53000000000000000000000000000000000000B
-:10B5400000000000000000000000000000000000FB
-:10B5500000000000000000000000000000000000EB
-:10B5600000000000000000000000000000000000DB
-:10B5700000000000000000000000000000000000CB
-:10B5800000000000000000000000000000000000BB
-:10B5900000000000000000000000000000000000AB
-:10B5A000000000000000000000000000000000009B
-:10B5B000000000000000000000000000000000008B
-:10B5C000000000000000000000000000000000007B
-:10B5D000000000000000000000000000000000006B
-:10B5E000000000000000000000000000000000005B
-:10B5F000000000000000000000000000000000004B
-:10B60000000000000000000000000000000000003A
-:10B61000000000000000000000000000000000002A
-:10B62000000000000000000000000000000000001A
-:10B63000000000000000000000000000000000000A
-:10B6400000000000000000000000000000000000FA
-:10B6500000000000000000000000000000000000EA
-:10B6600000000000000000000000000000000000DA
-:10B6700000000000000000000000000000000000CA
-:10B6800000000000000000000000000000000000BA
-:10B6900000000000000000000000000000000000AA
-:10B6A000000000000000000000000000000000009A
-:10B6B000000000000000000000000000000000008A
-:10B6C000000000000000000000000000000000007A
-:10B6D000000000000000000000000000000000006A
-:10B6E000000000000000000000000000000000005A
-:10B6F000000000000000000000000000000000004A
-:10B700000000000000000000000000000000000039
-:10B710000000000000000000000000000000000029
-:10B720000000000000000000000000000000000019
-:10B730000000000000000000000000000000000009
-:10B7400000000000000000000000000000000000F9
-:10B7500000000000000000000000000000000000E9
-:10B7600000000000000000000000000000000000D9
-:10B7700000000000000000000000000000000000C9
-:10B7800000000000000000000000000000000000B9
-:10B7900000000000000000000000000000000000A9
-:10B7A0000000000000000000000000000000000099
-:10B7B0000000000000000000000000000000000089
-:10B7C0000000000000000000000000000000000079
-:10B7D0000000000000000000000000000000000069
-:10B7E0000000000000000000000000000000000059
-:10B7F0000000000000000000000000000000000049
-:10B800000000000000000000000000000000000038
-:10B810000000000000000000000000000000000028
-:10B820000000000000000000000000000000000018
-:10B830000000000000000000000000000000000008
-:10B8400000000000000000000000000000000000F8
-:10B8500000000000000000000000000000000000E8
-:10B8600000000000000000000000000000000000D8
-:10B8700000000000000000000000000000000000C8
-:10B8800000000000000000000000000000000000B8
-:10B8900000000000000000000000000000000000A8
-:10B8A0000000000000000000000000000000000098
-:10B8B0000000000000000000000000000000000088
-:10B8C0000000000000000000000000000000000078
-:10B8D0000000000000000000000000000000000068
-:10B8E0000000000000000000000000000000000058
-:10B8F0000000000000000000000000000000000048
-:10B900000000000000000000000000000000000037
-:10B910000000000000000000000000000000000027
-:10B920000000000000000000000000000000000017
-:10B930000000000000000000000000000000000007
-:10B9400000000000000000000000000000000000F7
-:10B9500000000000000000000000000000000000E7
-:10B9600000000000000000000000000000000000D7
-:10B9700000000000000000000000000000000000C7
-:10B9800000000000000000000000000000000000B7
-:10B9900000000000000000000000000000000000A7
-:10B9A0000000000000000000000000000000000097
-:10B9B0000000000000000000000000000000000087
-:10B9C0000000000000000000000000000000000077
-:10B9D0000000000000000000000000000000000067
-:10B9E0000000000000000000000000000000000057
-:10B9F0000000000000000000000000000000000047
-:10BA00000000000000000000000000000000000036
-:10BA10000000000000000000000000000000000026
-:10BA20000000000000000000000000000000000016
-:10BA30000000000000000000000000000000000006
-:10BA400000000000000000000000000000000000F6
-:10BA500000000000000000000000000000000000E6
-:10BA600000000000000000000000000000000000D6
-:10BA700000000000000000000000000000000000C6
-:10BA800000000000000000000000000000000000B6
-:10BA900000000000000000000000000000000000A6
-:10BAA0000000000000000000000000000000000096
-:10BAB0000000000000000000000000000000000086
-:10BAC0000000000000000000000000000000000076
-:10BAD0000000000000000000000000000000000066
-:10BAE0000000000000000000000000000000000056
-:10BAF0000000000000000000000000000000000046
-:10BB00000000000000000000000000000000000035
-:10BB10000000000000000000000000000000000025
-:10BB20000000000000000000000000000000000015
-:10BB30000000000000000000000000000000000005
-:10BB400000000000000000000000000000000000F5
-:10BB500000000000000000000000000000000000E5
-:10BB600000000000000000000000000000000000D5
-:10BB700000000000000000000000000000000000C5
-:10BB800000000000000000000000000000000000B5
-:10BB900000000000000000000000000000000000A5
-:10BBA0000000000000000000000000000000000095
-:10BBB0000000000000000000000000000000000085
-:10BBC0000000000000000000000000000000000075
-:10BBD0000000000000000000000000000000000065
-:10BBE0000000000000000000000000000000000055
-:10BBF0000000000000000000000000000000000045
-:10BC00000000000000000000000000000000000034
-:10BC10000000000000000000000000000000000024
-:10BC20000000000000000000000000000000000014
-:10BC30000000000000000000000000000000000004
-:10BC400000000000000000000000000000000000F4
-:10BC500000000000000000000000000000000000E4
-:10BC600000000000000000000000000000000000D4
-:10BC700000000000000000000000000000000000C4
-:10BC800000000000000000000000000000000000B4
-:10BC900000000000000000000000000000000000A4
-:10BCA0000000000000000000000000000000000094
-:10BCB0000000000000000000000000000000000084
-:10BCC0000000000000000000000000000000000074
-:10BCD0000000000000000000000000000000000064
-:10BCE0000000000000000000000000000000000054
-:10BCF0000000000000000000000000000000000044
-:10BD00000000000000000000000000000000000033
-:10BD10000000000000000000000000000000000023
-:10BD20000000000000000000000000000000000013
-:10BD30000000000000000000000000000000000003
-:10BD400000000000000000000000000000000000F3
-:10BD500000000000000000000000000000000000E3
-:10BD600000000000000000000000000000000000D3
-:10BD700000000000000000000000000000000000C3
-:10BD800000000000000000000000000000000000B3
-:10BD900000000000000000000000000000000000A3
-:10BDA0000000000000000000000000000000000093
-:10BDB0000000000000000000000000000000000083
-:10BDC0000000000000000000000000000000000073
-:10BDD0000000000000000000000000000000000063
-:10BDE0000000000000000000000000000000000053
-:10BDF0000000000000000000000000000000000043
-:10BE00000000000000000000000000000000000032
-:10BE10000000000000000000000000000000000022
-:10BE20000000000000000000000000000000000012
-:10BE30000000000000000000000000000000000002
-:10BE400000000000000000000000000000000000F2
-:10BE500000000000000000000000000000000000E2
-:10BE600000000000000000000000000000000000D2
-:10BE700000000000000000000000000000000000C2
-:10BE800000000000000000000000000000000000B2
-:10BE900000000000000000000000000000000000A2
-:10BEA0000000000000000000000000000000000092
-:10BEB0000000000000000000000000000000000082
-:10BEC0000000000000000000000000000000000072
-:10BED0000000000000000000000000000000000062
-:10BEE0000000000000000000000000000000000052
-:10BEF0000000000000000000000000000000000042
-:10BF00000000000000000000000000000000000031
-:10BF10000000000000000000000000000000000021
-:10BF20000000000000000000000000000000000011
-:10BF30000000000000000000000000000000000001
-:10BF400000000000000000000000000000000000F1
-:10BF500000000000000000000000000000000000E1
-:10BF600000000000000000000000000000000000D1
-:10BF700000000000000000000000000000000000C1
-:10BF800000000000000000000000000000000000B1
-:10BF900000000000000000000000000000000000A1
-:10BFA0000000000000000000000000000000000091
-:10BFB0000000000000000000000000000000000081
-:10BFC0000000000000000000000000000000000071
-:10BFD0000000000000000000000000000000000061
-:10BFE0000000000000000000000000000000000051
-:10BFF0000000000000000000000000000000000041
-:10C000000000000000000000000000000000000030
-:10C010000000000000000000000000000000000020
-:10C020000000000000000000000000000000000010
-:10C030000000000000000000000000000000000000
-:10C0400000000000000000000000000000000000F0
-:10C0500000000000000000000000000000000000E0
-:10C0600000000000000000000000000000000000D0
-:10C0700000000000000000000000000000000000C0
-:10C0800000000000000000000000000000000000B0
-:10C0900000000000000000000000000000000000A0
-:10C0A0000000000000000000000000000000000090
-:10C0B0000000000000000000000000000000000080
-:10C0C0000000000000000000000000000000000070
-:10C0D0000000000000000000000000000000000060
-:10C0E0000000000000000000000000000000000050
-:10C0F0000000000000000000000000000000000040
-:10C10000000000000000000000000000000000002F
-:10C11000000000000000000000000000000000001F
-:10C12000000000000000000000000000000000000F
-:10C1300000000000000000000000000000000000FF
-:10C1400000000000000000000000000000000000EF
-:10C1500000000000000000000000000000000000DF
-:10C1600000000000000000000000000000000000CF
-:10C1700000000000000000000000000000000000BF
-:10C1800000000000000000000000000000000000AF
-:10C19000000000000000000000000000000000009F
-:10C1A000000000000000000000000000000000008F
-:10C1B000000000000000000000000000000000007F
-:10C1C000000000000000000000000000000000006F
-:10C1D000000000000000000000000000000000005F
-:10C1E000000000000000000000000000000000004F
-:10C1F000000000000000000000000000000000003F
-:10C20000000000000000000000000000000000002E
-:10C21000000000000000000000000000000000001E
-:10C22000000000000000000000000000000000000E
-:10C2300000000000000000000000000000000000FE
-:10C2400000000000000000000000000000000000EE
-:10C2500000000000000000000000000000000000DE
-:10C2600000000000000000000000000000000000CE
-:10C2700000000000000000000000000000000000BE
-:10C2800000000000000000000000000000000000AE
-:10C29000000000000000000000000000000000009E
-:10C2A000000000000000000000000000000000008E
-:10C2B000000000000000000000000000000000007E
-:10C2C000000000000000000000000000000000006E
-:10C2D000000000000000000000000000000000005E
-:10C2E000000000000000000000000000000000004E
-:10C2F000000000000000000000000000000000003E
-:10C30000000000000000000000000000000000002D
-:10C31000000000000000000000000000000000001D
-:10C32000000000000000000000000000000000000D
-:10C3300000000000000000000000000000000000FD
-:10C3400000000000000000000000000000000000ED
-:10C3500000000000000000000000000000000000DD
-:10C3600000000000000000000000000000000000CD
-:10C3700000000000000000000000000000000000BD
-:10C3800000000000000000000000000000000000AD
-:10C39000000000000000000000000000000000009D
-:10C3A000000000000000000000000000000000008D
-:10C3B000000000000000000000000000000000007D
-:10C3C000000000000000000000000000000000006D
-:10C3D000000000000000000000000000000000005D
-:10C3E000000000000000000000000000000000004D
-:10C3F000000000000000000000000000000000003D
-:10C40000000000000000000000000000000000002C
-:10C41000000000000000000000000000000000001C
-:10C42000000000000000000000000000000000000C
-:10C4300000000000000000000000000000000000FC
-:10C4400000000000000000000000000000000000EC
-:10C4500000000000000000000000000000000000DC
-:10C4600000000000000000000000000000000000CC
-:10C4700000000000000000000000000000000000BC
-:10C4800000000000000000000000000000000000AC
-:10C49000000000000000000000000000000000009C
-:10C4A000000000000000000000000000000000008C
-:10C4B000000000000000000000000000000000007C
-:10C4C000000000000000000000000000000000006C
-:10C4D000000000000000000000000000000000005C
-:10C4E000000000000000000000000000000000004C
-:10C4F000000000000000000000000000000000003C
-:10C50000000000000000000000000000000000002B
-:10C51000000000000000000000000000000000001B
-:10C52000000000000000000000000000000000000B
-:10C5300000000000000000000000000000000000FB
-:10C5400000000000000000000000000000000000EB
-:10C5500000000000000000000000000000000000DB
-:10C5600000000000000000000000000000000000CB
-:10C5700000000000000000000000000000000000BB
-:10C5800000000000000000000000000000000000AB
-:10C59000000000000000000000000000000000009B
-:10C5A000000000000000000000000000000000008B
-:10C5B000000000000000000000000000000000007B
-:10C5C000000000000000000000000000000000006B
-:10C5D000000000000000000000000000000000005B
-:10C5E000000000000000000000000000000000004B
-:10C5F000000000000000000000000000000000003B
-:10C60000000000000000000000000000000000002A
-:10C61000000000000000000000000000000000001A
-:10C62000000000000000000000000000000000000A
-:10C6300000000000000000000000000000000000FA
-:10C6400000000000000000000000000000000000EA
-:10C6500000000000000000000000000000000000DA
-:10C6600000000000000000000000000000000000CA
-:10C6700000000000000000000000000000000000BA
-:10C6800000000000000000000000000000000000AA
-:10C69000000000000000000000000000000000009A
-:10C6A000000000000000000000000000000000008A
-:10C6B000000000000000000000000000000000007A
-:10C6C000000000000000000000000000000000006A
-:10C6D000000000000000000000000000000000005A
-:10C6E000000000000000000000000000000000004A
-:10C6F000000000000000000000000000000000003A
-:10C700000000000000000000000000000000000029
-:10C710000000000000000000000000000000000019
-:10C720000000000000000000000000000000000009
-:10C7300000000000000000000000000000000000F9
-:10C7400000000000000000000000000000000000E9
-:10C7500000000000000000000000000000000000D9
-:10C7600000000000000000000000000000000000C9
-:10C7700000000000000000000000000000000000B9
-:10C7800000000000000000000000000000000000A9
-:10C790000000000000000000000000000000000099
-:10C7A0000000000000000000000000000000000089
-:10C7B0000000000000000000000000000000000079
-:10C7C0000000000000000000000000000000000069
-:10C7D0000000000000000000000000000000000059
-:10C7E0000000000000000000000000000000000049
-:10C7F0000000000000000000000000000000000039
-:10C800000000000000000000000000000000000028
-:10C810000000000000000000000000000000000018
-:10C820000000000000000000000000000000000008
-:10C8300000000000000000000000000000000000F8
-:10C8400000000000000000000000000000000000E8
-:10C8500000000000000000000000000000000000D8
-:10C8600000000000000000000000000000000000C8
-:10C8700000000000000000000000000000000000B8
-:10C8800000000000000000000000000000000000A8
-:10C890000000000000000000000000000000000098
-:10C8A0000000000000000000000000000000000088
-:10C8B0000000000000000000000000000000000078
-:10C8C0000000000000000000000000000000000068
-:10C8D0000000000000000000000000000000000058
-:10C8E0000000000000000000000000000000000048
-:10C8F0000000000000000000000000000000000038
-:10C900000000000000000000000000000000000027
-:10C910000000000000000000000000000000000017
-:10C920000000000000000000000000000000000007
-:10C9300000000000000000000000000000000000F7
-:10C9400000000000000000000000000000000000E7
-:10C9500000000000000000000000000000000000D7
-:10C9600000000000000000000000000000000000C7
-:10C9700000000000000000000000000000000000B7
-:10C9800000000000000000000000000000000000A7
-:10C990000000000000000000000000000000000097
-:10C9A0000000000000000000000000000000000087
-:10C9B0000000000000000000000000000000000077
-:10C9C0000000000000000000000000000000000067
-:10C9D0000000000000000000000000000000000057
-:10C9E0000000000000000000000000000000000047
-:10C9F0000000000000000000000000000000000037
-:10CA00000000000000000000000000000000000026
-:10CA10000000000000000000000000000000000016
-:10CA20000000000000000000000000000000000006
-:10CA300000000000000000000000000000000000F6
-:10CA400000000000000000000000000000000000E6
-:10CA500000000000000000000000000000000000D6
-:10CA600000000000000000000000000000000000C6
-:10CA700000000000000000000000000000000000B6
-:10CA800000000000000000000000000000000000A6
-:10CA90000000000000000000000000000000000096
-:10CAA0000000000000000000000000000000000086
-:10CAB0000000000000000000000000000000000076
-:10CAC0000000000000000000000000000000000066
-:10CAD0000000000000000000000000000000000056
-:10CAE0000000000000000000000000000000000046
-:10CAF0000000000000000000000000000000000036
-:10CB00000000000000000000000000000000000025
-:10CB10000000000000000000000000000000000015
-:10CB20000000000000000000000000000000000005
-:10CB300000000000000000000000000000000000F5
-:10CB400000000000000000000000000000000000E5
-:10CB500000000000000000000000000000000000D5
-:10CB600000000000000000000000000000000000C5
-:10CB700000000000000000000000000000000000B5
-:10CB800000000000000000000000000000000000A5
-:10CB90000000000000000000000000000000000095
-:10CBA0000000000000000000000000000000000085
-:10CBB0000000000000000000000000000000000075
-:10CBC0000000000000000000000000000000000065
-:10CBD0000000000000000000000000000000000055
-:10CBE0000000000000000000000000000000000045
-:10CBF0000000000000000000000000000000000035
-:10CC00000000000000000000000000000000000024
-:10CC10000000000000000000000000000000000014
-:10CC20000000000000000000000000000000000004
-:10CC300000000000000000000000000000000000F4
-:10CC400000000000000000000000000000000000E4
-:10CC500000000000000000000000000000000000D4
-:10CC600000000000000000000000000000000000C4
-:10CC700000000000000000000000000000000000B4
-:10CC800000000000000000000000000000000000A4
-:10CC90000000000000000000000000000000000094
-:10CCA0000000000000000000000000000000000084
-:10CCB0000000000000000000000000000000000074
-:10CCC0000000000000000000000000000000000064
-:10CCD0000000000000000000000000000000000054
-:10CCE0000000000000000000000000000000000044
-:10CCF0000000000000000000000000000000000034
-:10CD00000000000000000000000000000000000023
-:10CD10000000000000000000000000000000000013
-:10CD20000000000000000000000000000000000003
-:10CD300000000000000000000000000000000000F3
-:10CD400000000000000000000000000000000000E3
-:10CD500000000000000000000000000000000000D3
-:10CD600000000000000000000000000000000000C3
-:10CD700000000000000000000000000000000000B3
-:10CD800000000000000000000000000000000000A3
-:10CD90000000000000000000000000000000000093
-:10CDA0000000000000000000000000000000000083
-:10CDB0000000000000000000000000000000000073
-:10CDC0000000000000000000000000000000000063
-:10CDD0000000000000000000000000000000000053
-:10CDE0000000000000000000000000000000000043
-:10CDF0000000000000000000000000000000000033
-:10CE00000000000000000000000000000000000022
-:10CE10000000000000000000000000000000000012
-:10CE20000000000000000000000000000000000002
-:10CE300000000000000000000000000000000000F2
-:10CE400000000000000000000000000000000000E2
-:10CE500000000000000000000000000000000000D2
-:10CE600000000000000000000000000000000000C2
-:10CE700000000000000000000000000000000000B2
-:10CE800000000000000000000000000000000000A2
-:10CE90000000000000000000000000000000000092
-:10CEA0000000000000000000000000000000000082
-:10CEB0000000000000000000000000000000000072
-:10CEC0000000000000000000000000000000000062
-:10CED0000000000000000000000000000000000052
-:10CEE0000000000000000000000000000000000042
-:10CEF0000000000000000000000000000000000032
-:10CF00000000000000000000000000000000000021
-:10CF10000000000000000000000000000000000011
-:10CF20000000000000000000000000000000000001
-:10CF300000000000000000000000000000000000F1
-:10CF400000000000000000000000000000000000E1
-:10CF500000000000000000000000000000000000D1
-:10CF600000000000000000000000000000000000C1
-:10CF700000000000000000000000000000000000B1
-:10CF800000000000000000000000000000000000A1
-:10CF90000000000000000000000000000000000091
-:10CFA0000000000000000000000000000000000081
-:10CFB0000000000000000000000000000000000071
-:10CFC0000000000000000000000000000000000061
-:10CFD0000000000000000000000000000000000051
-:10CFE0000000000000000000000000000000000041
-:10CFF0000000000000000000000000000000000031
-:10D000000000000000000000000000000000000020
-:10D010000000000000000000000000000000000010
-:10D020000000000000000000000000000000000000
-:10D0300000000000000000000000000000000000F0
-:10D0400000000000000000000000000000000000E0
-:10D0500000000000000000000000000000000000D0
-:10D0600000000000000000000000000000000000C0
-:10D0700000000000000000000000000000000000B0
-:10D0800000000000000000000000000000000000A0
-:10D090000000000000000000000000000000000090
-:10D0A0000000000000000000000000000000000080
-:10D0B0000000000000000000000000000000000070
-:10D0C0000000000000000000000000000000000060
-:10D0D0000000000000000000000000000000000050
-:10D0E0000000000000000000000000000000000040
-:10D0F0000000000000000000000000000000000030
-:10D10000000000000000000000000000000000001F
-:10D11000000000000000000000000000000000000F
-:10D1200000000000000000000000000000000000FF
-:10D1300000000000000000000000000000000000EF
-:10D1400000000000000000000000000000000000DF
-:10D1500000000000000000000000000000000000CF
-:10D1600000000000000000000000000000000000BF
-:10D1700000000000000000000000000000000000AF
-:10D18000000000000000000000000000000000009F
-:10D19000000000000000000000000000000000008F
-:10D1A000000000000000000000000000000000007F
-:10D1B000000000000000000000000000000000006F
-:10D1C000000000000000000000000000000000005F
-:10D1D000000000000000000000000000000000004F
-:10D1E000000000000000000000000000000000003F
-:10D1F000000000000000000000000000000000002F
-:10D20000000000000000000000000000000000001E
-:10D21000000000000000000000000000000000000E
-:10D2200000000000000000000000000000000000FE
-:10D2300000000000000000000000000000000000EE
-:10D2400000000000000000000000000000000000DE
-:10D2500000000000000000000000000000000000CE
-:10D2600000000000000000000000000000000000BE
-:10D2700000000000000000000000000000000000AE
-:10D28000000000000000000000000000000000009E
-:10D29000000000000000000000000000000000008E
-:10D2A000000000000000000000000000000000007E
-:10D2B000000000000000000000000000000000006E
-:10D2C000000000000000000000000000000000005E
-:10D2D000000000000000000000000000000000004E
-:10D2E000000000000000000000000000000000003E
-:10D2F000000000000000000000000000000000002E
-:10D30000000000000000000000000000000000001D
-:10D31000000000000000000000000000000000000D
-:10D3200000000000000000000000000000000000FD
-:10D3300000000000000000000000000000000000ED
-:10D3400000000000000000000000000000000000DD
-:10D3500000000000000000000000000000000000CD
-:10D3600000000000000000000000000000000000BD
-:10D3700000000000000000000000000000000000AD
-:10D38000000000000000000000000000000000009D
-:10D39000000000000000000000000000000000008D
-:10D3A000000000000000000000000000000000007D
-:10D3B000000000000000000000000000000000006D
-:10D3C000000000000000000000000000000000005D
-:10D3D000000000000000000000000000000000004D
-:10D3E000000000000000000000000000000000003D
-:10D3F000000000000000000000000000000000002D
-:10D40000000000000000000000000000000000001C
-:10D41000000000000000000000000000000000000C
-:10D4200000000000000000000000000000000000FC
-:10D4300000000000000000000000000000000000EC
-:10D4400000000000000000000000000000000000DC
-:10D4500000000000000000000000000000000000CC
-:10D4600000000000000000000000000000000000BC
-:10D4700000000000000000000000000000000000AC
-:10D48000000000000000000000000000000000009C
-:10D49000000000000000000000000000000000008C
-:10D4A000000000000000000000000000000000007C
-:10D4B000000000000000000000000000000000006C
-:10D4C000000000000000000000000000000000005C
-:10D4D000000000000000000000000000000000004C
-:10D4E000000000000000000000000000000000003C
-:10D4F000000000000000000000000000000000002C
-:10D50000000000000000000000000000000000001B
-:10D51000000000000000000000000000000000000B
-:10D5200000000000000000000000000000000000FB
-:10D5300000000000000000000000000000000000EB
-:10D5400000000000000000000000000000000000DB
-:10D5500000000000000000000000000000000000CB
-:10D5600000000000000000000000000000000000BB
-:10D5700000000000000000000000000000000000AB
-:10D58000000000000000000000000000000000009B
-:10D59000000000000000008000000000000000000B
-:10D5A000000000000000000000000000000000007B
-:10D5B00000000000000000000000000A0000000061
-:10D5C0000000000000000000100000030000000048
-:10D5D0000000000D0000000D3C02080024427320F2
-:10D5E0003C030800246377ACAC4000000043202BD0
-:10D5F0001480FFFD244200043C1D080037BD7FFC61
-:10D6000003A0F0213C100800261032103C1C08003A
-:10D61000279C73200E0010FE000000000000000D8B
-:10D6200030A5FFFF30C600FF274301808F4201B8BD
-:10D630000440FFFE24020002AC640000A465000860
-:10D64000A066000AA062000B3C021000AC67001844
-:10D6500003E00008AF4201B83C0360008C624FF861
-:10D660000440FFFE3C020200AC644FC0AC624FC4F9
-:10D670003C02100003E00008AC624FF89482000CFA
-:10D680002486001400A0382100021302000210803A
-:10D690000082402100C8102B1040005700000000FD
-:10D6A00090C300002C6200095040005190C200015C
-:10D6B000000310803C030800246372D00043102153
-:10D6C0008C420000004000080000000090C30001F0
-:10D6D0002402000A1462003A000000000106102330
-:10D6E0002C42000A1440003624C600028CE20000DE
-:10D6F00034420100ACE2000090C2000090C300017F
-:10D7000090C4000290C5000300031C000002160034
-:10D710000043102500042200004410250045102578
-:10D7200024C60004ACE2000490C2000090C30001D3
-:10D7300090C4000290C500030002160000031C0004
-:10D740000043102500042200004410250045102548
-:10D7500024C600040A000CB8ACE2000890C3000123
-:10D76000240200041462001624C6000290C20000C5
-:10D7700090C400018CE30000000212000044102558
-:10D780003463000424C60002ACE2000C0A000CB8AA
-:10D79000ACE3000090C300012402000314620008FF
-:10D7A00024C600028CE2000090C3000024C60001E1
-:10D7B00034420008A0E300100A000CB8ACE20000FC
-:10D7C00003E000082402000190C3000124020002CB
-:10D7D0001062000224C40002010020210A000CB8DB
-:10D7E000008030210A000CB824C6000190C200015C
-:10D7F0000A000CB800C2302103E00008000010212C
-:10D8000027BDFFE8AFBF0014AFB000100E00130239
-:10D8100000808021936200052403FFFE0200202186
-:10D82000004310248FBF00148FB00010A3620005C6
-:10D830000A00130B27BD001827BDFFE8AFB000108A
-:10D84000AFBF00140E000F3C0080802193620000E7
-:10D8500024030050304200FF14430004240201005E
-:10D86000AF4201800A000D3002002021AF4001804C
-:10D87000020020218FBF00148FB000100A000FE7B4
-:10D8800027BD001827BDFF80AFBE0078AFB700747A
-:10D89000AFB20060AFBF007CAFB60070AFB5006C38
-:10D8A000AFB40068AFB30064AFB1005CAFB0005874
-:10D8B0008F5001283C0208008C4231A02403FF80D5
-:10D8C0009365003F0202102100431024AF42002460
-:10D8D0003C0208008C4231A09364000530B200FF86
-:10D8E000020210213042007F034218210004202749
-:10D8F0003C02000A0062182130840001AF8300144A
-:10D900000000F0210000B82114800053AFA00050A7
-:10D9100093430116934401128F450104306300FFC5
-:10D920003C020001308400FF00A2282403431021A0
-:10D9300003441821245640002467400014A001CD60
-:10D940002402000193620000304300FF2402002003
-:10D950001062000524020050106200060000000062
-:10D960000A000D74000000000000000D0A000D7D8B
-:10D97000AFA000303C1E080027DE736C0A000D7D4E
-:10D98000AFA000303C0208008C4200DC24420001C1
-:10D990003C010800AC2200DC0E00139F00000000D8
-:10D9A0000A000F318FBF007C8F4201043C0300202E
-:10D9B00092D3000D004310240002202B00042140CC
-:10D9C000AFA400308F4301043C02004000621824E1
-:10D9D000146000023485004000802821326200205B
-:10D9E000AFA500301440000234A6008000A0302112
-:10D9F00010C0000BAFA6003093C500088F67004C25
-:10DA00000200202100052B0034A5008130A5F08103
-:10DA10000E000C9B30C600FF0A000F2E0000000015
-:10DA20009362003E304200401040000F2402000488
-:10DA300056420007240200120200202100E02821A3
-:10DA40000E0013F702C030210A000F318FBF007C97
-:10DA500016420005000000000E000D2100002021EC
-:10DA60000A000F318FBF007C9743011A96C4000E45
-:10DA700093620035326500043075FFFF00442004D6
-:10DA8000AFA400548ED1000410A000158ED400085D
-:10DA90009362003E3042004010400007000000004A
-:10DAA0000E0013E0022020211040000D00000000B5
-:10DAB0000A000F2E000000008F6200440222102393
-:10DAC0000440016A000000008F6200480222102317
-:10DAD00004410166240400160A000E218FC20004CE
-:10DAE0008F6200480222102304400008000000005A
-:10DAF0003C0208008C423100244200013C01080035
-:10DB0000AC2231000A000F23000000008F620040A9
-:10DB100002221023184000128F8400143C020800D7
-:10DB20008C423100327300FC0000A8212442000125
-:10DB30003C010800AC2231008F6300409482011C3C
-:10DB4000022318233042FFFF0043102A50400010E8
-:10DB50002402000C8F6200400A000DF20222102302
-:10DB60009483011C9762003C0043102B1040000678
-:10DB7000000000009482011C00551023A482011CA7
-:10DB80000A000DF72402000CA480011C2402000CE2
-:10DB9000AFA200308F620040005120231880000D9A
-:10DBA00002A4102A1440012600000000149500066B
-:10DBB00002A410233A620001304200011440012007
-:10DBC0000000000002A41023022488210A000E098C
-:10DBD0003055FFFF00002021326200021040001A81
-:10DBE000326200109362003E30420040504000110B
-:10DBF0008FC200040E00130202002021240200182C
-:10DC0000A362003F936200052403FFFE020020216F
-:10DC1000004310240E00130BA362000524040039F6
-:10DC2000000028210E0013C9240600180A000F3036
-:10DC300024020001240400170040F809000000003D
-:10DC40000A000F302402000110400108000000000B
-:10DC50008F63004C8F620054028210231C4001032A
-:10DC600002831023044200010060A021AFA4001829
-:10DC7000AFB10010AFB50014934201208F65004092
-:10DC80009763003C304200FF034210210044102102
-:10DC90008FA400543063FFFF244240000083182B00
-:10DCA0008FA40030AFA20020AFA50028008320255C
-:10DCB000AFA40030AFA50024AFA0002CAFB4003457
-:10DCC0009362003E30420008504000118FC20000B5
-:10DCD00002C0202127A500380E000CB2AFA00038EA
-:10DCE0005440000B8FC200008FA200383042010068
-:10DCF000504000078FC200008FA3003C8F6200607D
-:10DD00000062102304430001AF6300608FC2000073
-:10DD10000040F80927A400108FA200303042000212
-:10DD200054400001327300FE9362003E30420040D6
-:10DD3000104000378FA200248F6200541682001A10
-:10DD40003262000124020014124200102A4200151F
-:10DD500010400006240200162402000C12420007A4
-:10DD6000326200010A000E7D000000001242000530
-:10DD7000326200010A000E7D000000000A000E78E9
-:10DD80002417000E0A000E78241700100A000E7CDB
-:10DD900024170012936200232403FFBD00431024C4
-:10DDA000A362002332620001104000198FA20024F8
-:10DDB0002402000C1242000E2A42000D1040000600
-:10DDC0002402000E2402000A124200078FA200243F
-:10DDD0000A000E9524420001124200088FA200247E
-:10DDE0000A000E95244200010A000E932417000831
-:10DDF0002402000E16E20002241700162417001059
-:10DE00008FA2002424420001AFA200248FA200248C
-:10DE10008FA300148F76004000431021AF620040B2
-:10DE20008F8200149442011C104000090000000081
-:10DE30008F6200488F6400409763003C00441023C9
-:10DE40003063FFFF0043102A104000088FA20054E7
-:10DE5000936400368F6300403402FFFC008210049C
-:10DE600000621821AF6300488FA200548FA60030D3
-:10DE70000282902130C200081040000E0000000015
-:10DE80008F6200581642000430C600FF9742011A04
-:10DE90005040000134C6001093C500088FA700341D
-:10DEA0000200202100052B0034A500800E000C9BF1
-:10DEB00030A5F0808F620040005610231840001BF0
-:10DEC0008FA200183C0208008C42319830420010AA
-:10DED0001040000D24020001976200681440000AFF
-:10DEE000240200018F8200149442011C1440000699
-:10DEF00024020001A76200689742007A244200646D
-:10DF00000A000EE9A7620012A76200120E001302B7
-:10DF1000020020219362007D2403000102002021E1
-:10DF2000344200010A000EE7AFA300501840000A77
-:10DF3000000000000E001302020020219362007D09
-:10DF40002403000102002021AFA30050344200044A
-:10DF50000E00130BA362007D9362003E304200402E
-:10DF60001440000C326200011040000A0000000062
-:10DF70008F6300408FC20004240400182463000152
-:10DF80000040F809AF6300408FA200300A000F3054
-:10DF9000304200048F620058105200100000000050
-:10DFA0008F620018022210231C4000082404000184
-:10DFB0008F62001816220009000000008F62001C0A
-:10DFC000028210230440000500000000AF720058D8
-:10DFD000AFA40050AF710018AF74001C12E0000B2A
-:10DFE0008FA200500E00130202002021A377003FF1
-:10DFF0000E00130B0200202102E030212404003720
-:10E000000E0013C9000028218FA200501040000309
-:10E01000000000000E000CA90200202112A0000543
-:10E02000000018218FA2003030420004504000113F
-:10E0300000601021240300010A000F30006010214D
-:10E040000E001302020020219362007D02002021B5
-:10E05000344200040E00130BA362007D0E000CA9D5
-:10E06000020020210A000F3024020001AF400044CA
-:10E07000240200018FBF007C8FBE00788FB7007430
-:10E080008FB600708FB5006C8FB400688FB30064DA
-:10E090008FB200608FB1005C8FB0005803E00008C1
-:10E0A00027BD00808F4201B80440FFFE2402080013
-:10E0B000AF4201B803E00008000000003C02000885
-:10E0C00003421021944200483084FFFF2484001250
-:10E0D0003045FFFF10A0001700A4102B10400016C1
-:10E0E00024020003934201202403001AA343018B5E
-:10E0F000304200FF2446FFFE8F82000000A6182B4E
-:10E100003863000100021382004310241040000510
-:10E110008F84000434820001A746019403E00008C4
-:10E12000AF8200042402FFFE0082102403E00008F6
-:10E13000AF8200042402000303E00008A342018B25
-:10E1400027BDFFE0AFB10014AFB00010AFBF0018A3
-:10E1500030B0FFFF30D1FFFF8F4201B80440FFFE17
-:10E1600000000000AF440180AF4400200E000F42C9
-:10E17000020020218F8300008F840004A750019AA1
-:10E18000A750018EA74301908F8300083082800042
-:10E19000AF4301A8A75101881040000E8F820004F0
-:10E1A00093420116304200FC24420004005A102120
-:10E1B0008C4240003042FFFF144000068F82000472
-:10E1C0003C02FFFF34427FFF00821024AF82000434
-:10E1D0008F8200042403BFFF00431024A74201A63E
-:10E1E0009743010C8F42010400031C003042FFFFE3
-:10E1F00000621825AF4301AC3C021000AF4201B8E9
-:10E200008FBF00188FB100148FB0001003E000081A
-:10E2100027BD00208F470070934201128F830000BA
-:10E2200027BDFFF0304200FF00022882306201006B
-:10E23000000030211040004324A40003306240005D
-:10E24000104000103062200000041080005A10219D
-:10E250008C43400024A4000400041080AFA30000FD
-:10E26000005A10218C424000AFA2000493420116D4
-:10E27000304200FC005A10218C4240000A000FC0BE
-:10E28000AFA200081040002F0000302100041080D1
-:10E29000005A10218C43400024A400040004108084
-:10E2A000AFA30000005A10218C424000AFA000082C
-:10E2B000AFA200048FA80008000030210000202138
-:10E2C000240A00083C0908002529010003A41021A4
-:10E2D000148A000300042A001100000A0000000054
-:10E2E00090420000248400012C83000C00A2102125
-:10E2F00000021080004910218C4200001460FFF3DE
-:10E3000000C230263C0408008C8431048F42007027
-:10E310002C83002010600009004738233C030800CC
-:10E32000246331080004108000431021248300017D
-:10E33000AC4700003C010800AC233104AF86000864
-:10E340002406000100C0102103E0000827BD0010D2
-:10E350003C0208008C42003827BDFFD0AFB5002436
-:10E36000AFB40020AFB10014AFBF0028AFB3001CA2
-:10E37000AFB20018AFB00010000088213C150800B3
-:10E3800026B50038144000022454FFFF0000A021ED
-:10E390009742010E8F8400003042FFFF308340001F
-:10E3A0001060000A245200043C0200200082102465
-:10E3B00050400007308280008F8200042403BFFF9A
-:10E3C000008318240A0010103442100030828000AC
-:10E3D0001040000A3C020020008210241040000778
-:10E3E0008F8200043C03FFFF34637FFF0083182407
-:10E3F00034428000AF820004AF8300000E000F980B
-:10E400000000000014400007000000009743011EB8
-:10E410009742011C3063FFFF0002140000621825C0
-:10E42000AF8300089742010C8F4340003045FFFF47
-:10E430003402FFFF14620003000000000A001028ED
-:10E44000241100208F42400030420100544000015E
-:10E45000241100108F8400003082100050400014FE
-:10E4600036310001308200201440000B3C021000C5
-:10E47000008210245040000E363100013C030E0093
-:10E480003C020DFF008318243442FFFF0043102B91
-:10E4900050400007363100013C0208008C42002C3D
-:10E4A000244200013C010800AC22002C363100055A
-:10E4B0003C0608008CC6003454C000238F85000041
-:10E4C0008F820004304240005440001F8F850000BE
-:10E4D0003C021F01008210243C0310005443001A28
-:10E4E0008F85000030A20200144000178F850000C5
-:10E4F0003250FFFF363100028F4201B80440FFFE68
-:10E5000000000000AF400180020020210E000F42F9
-:10E51000AF4000208F8300042402BFFFA750019A60
-:10E52000006218248F820000A750018EA751018835
-:10E53000A74301A6A74201903C021000AF4201B8D8
-:10E540000A0010F5000010213C02100000A2102467
-:10E550001040003A0000000010C0000F0000000052
-:10E5600030A201001040000C3C0302003C020F00EE
-:10E5700000A2102410430008000000008F82000851
-:10E58000005410240055102190420004244200043D
-:10E590000A00109F000221C00000000000051602C2
-:10E5A0003050000F3A0300022E4203EF38420001C0
-:10E5B0002C6300010062182414600073240200011F
-:10E5C0003C0308008C6300D02E06000C386200016A
-:10E5D0002C4200010046102414400015001021C0F8
-:10E5E0002602FFFC2C4200045440001100002021B0
-:10E5F000386200022C420001004610241040000343
-:10E60000000512420A00109F000020210010182B64
-:10E610000043102450400006001021C000002021BB
-:10E620003245FFFF0E000F633226FFFB001021C0B2
-:10E630003245FFFF0A0010F2362600028F424000EA
-:10E640003C0308008C630024304201001040004667
-:10E6500030620001322200043070000D14400002CC
-:10E660002413000424130002000512C238420001E2
-:10E670002E4303EF304200013863000100431025B0
-:10E68000104000033231FFFB2402FFFB0202802412
-:10E6900010C000183202000130A201001040001525
-:10E6A000320200013C020F0000A210243C030200D1
-:10E6B0001043000F8F8200082403FFFE0203802412
-:10E6C00000541024005510219042000402333025DC
-:10E6D0002442000412000002000221C03226FFFF83
-:10E6E0000E000F633245FFFF1200002700001021CB
-:10E6F000320200011040000D320200042402000129
-:10E7000012020002023330253226FFFF00002021D2
-:10E710000E000F633245FFFF2402FFFE0202802439
-:10E7200012000019000010213202000410400016EF
-:10E7300024020001240200041202000202333025E8
-:10E740003226FFFF3245FFFF0E000F632404010055
-:10E750002402FFFB020280241200000B00001021A3
-:10E760000A0010F5240200011040000700001021EB
-:10E770003245FFFF36260002000020210E000F6305
-:10E7800000000000000010218FBF00288FB500247A
-:10E790008FB400208FB3001C8FB200188FB100140B
-:10E7A0008FB0001003E0000827BD003027BDFFD068
-:10E7B000AFB000103C04600CAFBF002CAFB6002817
-:10E7C000AFB50024AFB40020AFB3001CAFB2001847
-:10E7D000AFB100148C8250002403FF7F3C1A8000EC
-:10E7E000004310243442380CAC8250002402000351
-:10E7F0003C106000AF4200088E0208083C1B8008F5
-:10E800003C010800AC2000203042FFF038420010EC
-:10E810002C4200010E001B85AF8200183C04FFFF54
-:10E820003C020400348308063442000CAE0219484E
-:10E83000AE03194C3C0560168E0219808CA30000B3
-:10E840003442020000641824AE0219803C02535383
-:10E850001462000334A47C008CA200040050202128
-:10E860008C82007C8C830078AF820010AF83000C18
-:10E870008F55000032A200031040FFFD32A20001BC
-:10E880001040013D32A200028F420128AF42002019
-:10E890008F4201048F430100AF8200000E000F3C45
-:10E8A000AF8300043C0208008C4200C01040000806
-:10E8B0008F8400003C0208008C4200C42442000106
-:10E8C0003C010800AC2200C40A00126900000000EC
-:10E8D0003C020010008210241440010C8F830004BD
-:10E8E0003C0208008C4200203C0308008C63003886
-:10E8F00000008821244200013C010800AC220020D5
-:10E900003C16080026D60038146000022474FFFF6D
-:10E910000000A0219742010E308340003042FFFFEB
-:10E920001060000A245200043C02002000821024DF
-:10E9300050400007308280008F8200042403BFFF14
-:10E94000008318240A0011703442100030828000C5
-:10E950001040000A3C0200200082102410400007F2
-:10E960008F8200043C03FFFF34637FFF0083182481
-:10E9700034428000AF820004AF8300000E000F9885
-:10E980000000000014400007000000009743011E33
-:10E990009742011C3063FFFF00021400006218253B
-:10E9A000AF8300089742010C8F4340003045FFFFC2
-:10E9B0003402FFFF14620003000000000A00118807
-:10E9C000241100208F4240003042010054400001D9
-:10E9D000241100108F840000308210005040001479
-:10E9E00036310001308200201440000B3C02100040
-:10E9F000008210245040000E363100013C030E000E
-:10EA00003C020DFF008318243442FFFF0043102B0B
-:10EA100050400007363100013C0208008C42002CB7
-:10EA2000244200013C010800AC22002C36310005D4
-:10EA30003C0608008CC6003454C000238F850000BB
-:10EA40008F820004304240005440001F8F85000038
-:10EA50003C021F01008210243C0310005443001AA2
-:10EA60008F85000030A20200144000178F8500003F
-:10EA70003250FFFF363100028F4201B80440FFFEE2
-:10EA800000000000AF400180020020210E000F4274
-:10EA9000AF4000208F8300042402BFFFA750019ADB
-:10EAA000006218248F820000A750018EA7510188B0
-:10EAB000A74301A6A74201903C021000AF4201B853
-:10EAC0000A001267000010213C02100000A210246E
-:10EAD0001040003A0000000010C0000F00000000CD
-:10EAE00030A201001040000C3C0302003C020F0069
-:10EAF00000A2102410430008000000008F820008CC
-:10EB000000541024005610219042000424420004B6
-:10EB10000A0011FF000221C00000000000051602DB
-:10EB20003050000F3A0300022E4203EF384200013A
-:10EB30002C63000100621824146000852402000187
-:10EB40003C0308008C6300D02E06000C38620001E4
-:10EB50002C4200010046102414400015001021C072
-:10EB60002602FFFC2C42000454400011000020212A
-:10EB7000386200022C42000100461024504000037D
-:10EB8000000512420A0011FF000020210010182B7E
-:10EB90000043102450400006001021C00000202136
-:10EBA0003245FFFF0E000F633226FFFB001021C02D
-:10EBB0003245FFFF0A001252362600028F42400003
-:10EBC0003C0308008C6300243042010010400046E2
-:10EBD00030620001322200043070000D1440000247
-:10EBE0002413000424130002000512C2384200015D
-:10EBF0002E4303EF3042000138630001004310252B
-:10EC0000104000033231FFFB2402FFFB020280248C
-:10EC100010C000183202000130A20100104000159F
-:10EC2000320200013C020F0000A210243C0302004B
-:10EC30001043000F8F8200082403FFFE020380248C
-:10EC40000054102400561021904200040233302555
-:10EC50002442000412000002000221C03226FFFFFD
-:10EC60000E000F633245FFFF120000390000102133
-:10EC7000320200011040000D3202000424020001A3
-:10EC800012020002023330253226FFFF000020214D
-:10EC90000E000F633245FFFF2402FFFE02028024B4
-:10ECA0001200002B00001021320200041040002846
-:10ECB0002402000124020004120200020233302563
-:10ECC0003226FFFF3245FFFF0E000F6324040100D0
-:10ECD0002402FFFB020280241200001D000010210C
-:10ECE0000A001267240200015040001900001021A0
-:10ECF0003245FFFF36260002000020210E000F6380
-:10ED0000000000000A001267000010212402BFFF6B
-:10ED1000006210241040000800000000240287FF59
-:10ED200000621024144000083C020060008210249D
-:10ED300010400005000000000E000D34000000002F
-:10ED40000A001267000000000E0012C70000000059
-:10ED5000104000063C0240008F4301243C0260202A
-:10ED6000AC430014000000003C024000AF420138F8
-:10ED70000000000032A200021040FEBD00000000B2
-:10ED80008F4201403C044000AF4200208F430148C5
-:10ED90003C02700000621824106400420000000071
-:10EDA0000083102B144000063C0260003C0220004F
-:10EDB000106200073C0240000A0012C3000000007D
-:10EDC0001062003C3C0240000A0012C30000000038
-:10EDD0008F4501408F4601448F42014800021402D2
-:10EDE000304300FF240200041462000A274401801B
-:10EDF0008F4201B80440FFFE2402001CAC850000D5
-:10EE0000A082000B3C021000AF4201B80A0012C3FE
-:10EE10003C0240002402000914620012000616029F
-:10EE2000000229C0AF4500208F4201B80440FFFE18
-:10EE30002402000124030003AF450180A343018B9A
-:10EE4000A740018EA740019AA7400190AF4001A8BA
-:10EE5000A7420188A74201A6AF4001AC3C021000C6
-:10EE6000AF4201B88F4201B80440FFFE000000002D
-:10EE7000AC8500008F42014800021402A482000801
-:10EE800024020002A082000B8F420148A4820010DD
-:10EE90003C021000AC860024AF4201B80A0012C345
-:10EEA0003C0240000E001310000000000A0012C3D4
-:10EEB0003C0240000E001BBA000000003C02400073
-:10EEC000AF420178000000000A00112F000000008E
-:10EED0008F4201003042003E144000112402000124
-:10EEE000AF4000488F420100304207C0104000058B
-:10EEF00000000000AF40004CAF40005003E00008AD
-:10EF000024020001AF400054AF4000408F42010096
-:10EF10003042380054400001AF4000442402000158
-:10EF200003E00008000000008F4201B80440FFFE2B
-:10EF300024020001AF440180AF400184A74501884D
-:10EF4000A342018A24020002A342018B9742014A94
-:10EF500014C00004A7420190AF4001A40A0012EFC0
-:10EF60003C0210008F420144AF4201A43C02100059
-:10EF7000AF4001A803E00008AF4201B88F4201B8DA
-:10EF80000440FFFE24020002AF440180AF4401842C
-:10EF9000A7450188A342018AA342018B9742014AF7
-:10EFA000A7420190AF4001A48F420144AF4201A8A3
-:10EFB0003C02100003E00008AF4201B83C029000A0
-:10EFC0003442000100822025AF4400208F420020FF
-:10EFD0000440FFFE0000000003E000080000000005
-:10EFE0003C028000344200010082202503E000083A
-:10EFF000AF44002027BDFFE8AFBF0014AFB0001042
-:10F000008F50014093430149934201489344014882
-:10F01000306300FF304200FF00021200006228252A
-:10F020002402001910620076308400802862001AE1
-:10F030001040001C24020020240200081062007707
-:10F04000286200091040000E2402000B2402000177
-:10F0500010620034286200025040000524020006BD
-:10F0600050600034020020210A00139A00000000C2
-:10F0700010620030020020210A00139A00000000F4
-:10F080001062003B2862000C504000022402000E77
-:10F090002402000910620056020020210A00139A7F
-:10F0A0000000000010620056286200211040000F8E
-:10F0B000240200382402001C106200582862001D3F
-:10F0C000104000062402001F2402001B1062004CA6
-:10F0D000000000000A00139A000000001062004ABD
-:10F0E000020020210A00139A00000000106200456F
-:10F0F0002862003910400007240200802462FFCB00
-:10F100002C42000210400045020020210A00139604
-:10F110000000302110620009000000000A00139A6C
-:10F12000000000001480003D020020210A0013901E
-:10F130008FBF00140A001396240600018F4201B805
-:10F140000440FFFE24020002A342018BA745018870
-:10F150009742014AA74201908F420144A74201927F
-:10F160003C021000AF4201B80A00139C8FBF00148C
-:10F170009742014A144000290000000093620005F4
-:10F180003042000414400025000000000E0013026D
-:10F190000200202193620005020020213442000475
-:10F1A0000E00130BA36200059362000530420004B9
-:10F1B00014400002000000000000000D93620000F7
-:10F1C00024030020304200FF14430014000000001C
-:10F1D0008F4201B80440FFFE24020005AF500180B9
-:10F1E000A342018B3C0210000A00139AAF4201B8FF
-:10F1F0008FBF00148FB000100A0012F227BD001854
-:10F200000000000D02002021000030218FBF0014FB
-:10F210008FB000100A0012DD27BD00180000000D9D
-:10F220008FBF00148FB0001003E0000827BD001846
-:10F2300027BDFFE8AFBF00100E000F3C000000002C
-:10F24000AF4001808FBF0010000020210A000FE7AF
-:10F2500027BD00183084FFFF30A5FFFF00001821F4
-:10F260001080000700000000308200011040000202
-:10F2700000042042006518210A0013AB0005284055
-:10F2800003E000080060102110C0000624C6FFFF44
-:10F290008CA2000024A50004AC8200000A0013B573
-:10F2A0002484000403E000080000000010A000080F
-:10F2B00024A3FFFFAC860000000000000000000057
-:10F2C0002402FFFF2463FFFF1462FFFA248400047A
-:10F2D00003E0000800000000308300FF30A500FFBD
-:10F2E00030C600FF274701808F4201B80440FFFE6F
-:10F2F000000000008F42012834634000ACE20000AF
-:10F3000024020001ACE00004A4E30008A0E2000A2B
-:10F3100024020002A0E2000B3C021000A4E5001051
-:10F32000ACE00024ACE00028A4E6001203E00008F2
-:10F33000AF4201B827BDFFE8AFBF00109362003FA6
-:10F3400024030012304200FF1043000D00803021E2
-:10F350008F620044008210230440000A8FBF001017
-:10F360008F620048240400390000282100C21023C5
-:10F3700004410004240600120E0013C9000000001E
-:10F380008FBF00102402000103E0000827BD001811
-:10F3900027BDFFC8AFB20030AFB1002CAFBF003403
-:10F3A000AFB0002890C5000D0080902130A400105F
-:10F3B0001080000B00C088218CC300088F620054AD
-:10F3C0001062000730A20005144000B524040001BB
-:10F3D0000E000D21000020210A0014BB0040202156
-:10F3E00030A200051040000930A30012108000ACCC
-:10F3F000240400018E2300088F620054146200A9C7
-:10F400008FBF00340A00142C240400382402001298
-:10F41000146200A3240400010220202127A500106B
-:10F420000E000CB2AFA000101040001102402021CD
-:10F430008E220008AF620084AF6000400E0013020D
-:10F44000000000009362007D024020213442002031
-:10F450000E00130BA362007D0E000CA902402021B8
-:10F46000240400382405008D0A0014B82406001274
-:10F470009362003E304200081040000F8FA200103F
-:10F4800030420100104000078FA300148F6200601B
-:10F490000062102304430008AF6300600A001441B7
-:10F4A00000000000AF6000609362003E2403FFF79D
-:10F4B00000431024A362003E9362003E30420008E5
-:10F4C000144000022406000300003021936200343F
-:10F4D000936300378F640084304200FF306300FF85
-:10F4E00000661821000318800043282100A4202B67
-:10F4F0001080000B000000009763003C8F620084C6
-:10F500003063FFFF004510230062182B14600004D5
-:10F51000000000008F6200840A00145D0045802313
-:10F520009762003C3050FFFF8FA300103062000450
-:10F5300010400004000628808FA2001C0A001465F9
-:10F540000202102B2E02021850400003240202185F
-:10F550000A00146E020510233063000410600003DB
-:10F56000004510238FA2001C00451023004080217D
-:10F570002C42008054400001241000800E00130231
-:10F580000240202124020001AF62000C9362003E81
-:10F59000001020403042007FA362003E8E22000413
-:10F5A00024420001AF620040A770003C8F6200500F
-:10F5B0009623000E00431021AF6200588F62005066
-:10F5C00000441021AF62005C8E220004AF6200187C
-:10F5D0008E220008AF62001C8FA20010304200088B
-:10F5E0005440000A93A20020A360003693620036C4
-:10F5F0002403FFDFA36200359362003E0043102422
-:10F60000A362003E0A0014988E220008A36200350F
-:10F610008E220008AF62004C8F6200248F6300408E
-:10F6200000431021AF6200489362000024030050A1
-:10F63000304200FF144300122403FF803C02080004
-:10F640008C4231A00242102100431024AF42002816
-:10F650003C0208008C4231A08E2400083C03000CC0
-:10F66000024210213042007F03421021004310214A
-:10F67000AC4400D88E230008AF820014AC4300DCF9
-:10F680000E00130B02402021240400380000282122
-:10F690002406000A0E0013C9000000002404000123
-:10F6A0008FBF00348FB200308FB1002C8FB0002894
-:10F6B0000080102103E0000827BD003827BDFFF8B7
-:10F6C00027420180AFA20000308A00FF8F4201B8BC
-:10F6D0000440FFFE000000008F4601283C020800A5
-:10F6E0008C4231A02403FF80AF86004800C2102165
-:10F6F00000431024AF4200243C0208008C4231A099
-:10F700008FA900008FA8000000C210213042007FA6
-:10F71000034218213C02000A00621821946400D4BC
-:10F720008FA700008FA5000024020002AF83001401
-:10F73000A0A2000B8FA30000354260003084FFFFC1
-:10F74000A4E200083C021000AD260000AD04000455
-:10F75000AC60002427BD0008AF4201B803E00008F8
-:10F76000240200018F88003C938200288F830014BC
-:10F770003C07080024E7777800481023304200FF58
-:10F78000304900FC246500888F860040304A000321
-:10F790001120000900002021248200048CA3000015
-:10F7A000304400FF0089102AACE3000024A50004C7
-:10F7B0001440FFF924E70004114000090000202153
-:10F7C0002482000190A30000304400FF008A102B27
-:10F7D000A0E3000024A500011440FFF924E7000184
-:10F7E00030C20003144000048F85003C3102000346
-:10F7F0001040000D0000000010A0000900002021B2
-:10F800002482000190C30000304400FF0085102BCB
-:10F81000A0E3000024C600011440FFF924E7000122
-:10F8200003E00008000000001100FFFD000020219F
-:10F83000248200048CC30000304400FF0088102B99
-:10F84000ACE3000024C600041440FFF924E70004E0
-:10F8500003E00008000000008F83003C9382002832
-:10F8600030C600FF30A500FF00431023304300FFE7
-:10F870008F820014008038210043102114C0000240
-:10F88000244800880083382130E20003144000053A
-:10F8900030A2000314400003306200031040000D4A
-:10F8A0000000000010A000090000202124820001B7
-:10F8B00090E30000304400FF0085102BA1030000FE
-:10F8C00024E700011440FFF92508000103E00008C7
-:10F8D0000000000010A0FFFD000020212482000491
-:10F8E0008CE30000304400FF0085102BAD030000C6
-:10F8F00024E700041440FFF92508000403E0000891
-:10F90000000000000080482130AAFFFF30C600FF41
-:10F9100030E7FFFF274801808F4201B80440FFFE17
-:10F920008F820048AD0200008F420124AD02000426
-:10F930008D220020A5070008A102000A240200165B
-:10F94000A102000B934301208D2200088D240004A6
-:10F95000306300FF004310219783003A00441021D8
-:10F960008D250024004310233C0308008C6331A044
-:10F970008F840014A502000C246300E82402FFFF1A
-:10F98000A50A000EA5030010A5060012AD0500187B
-:10F99000AD020024948201142403FFF73042FFFFDC
-:10F9A000AD0200288C820118AD02002C3C02100030
-:10F9B000AD000030AF4201B88D220020004310247A
-:10F9C00003E00008AD2200208F82001430E7FFFF23
-:10F9D00000804821904200D330A5FFFF30C600FFD1
-:10F9E0000002110030420F0000E238252748018054
-:10F9F0008F4201B80440FFFE8F820048AD02000034
-:10FA00008F420124AD0200048D220020A5070008CA
-:10FA1000A102000A24020017A102000B9343012057
-:10FA20008D2200088D240004306300FF0043102164
-:10FA30009783003A004410218F8400140043102360
-:10FA40003C0308008C6331A0A502000CA505000E44
-:10FA5000246300E8A5030010A5060012AD00001401
-:10FA60008D220024AD0200188C82005CAD02001CC7
-:10FA70008C820058AD0200202402FFFFAD0200245A
-:10FA8000948200E63042FFFFAD02002894820060BD
-:10FA9000948300BE30427FFF3063FFFF00021200FC
-:10FAA00000431021AD02002C3C021000AD000030DC
-:10FAB000AF4201B8948200BE2403FFF700A21021D8
-:10FAC000A48200BE8D2200200043102403E0000821
-:10FAD000AD220020274301808F4201B80440FFFE81
-:10FAE0008F8200249442001C3042FFFF000211C0AC
-:10FAF000AC62000024020019A062000B3C0210005E
-:10FB0000AC60003003E00008AF4201B88F87002CE2
-:10FB100030C300FF8F4201B80440FFFE8F820048CF
-:10FB200034636000ACA2000093820044A0A20005F0
-:10FB30008CE20010A4A20006A4A300088C8200207E
-:10FB40002403FFF7A0A2000A24020002A0A2000BD7
-:10FB50008CE20000ACA200108CE20004ACA2001405
-:10FB60008CE2001CACA200248CE20020ACA2002895
-:10FB70008CE2002CACA2002C8C820024ACA20018D9
-:10FB80003C021000AF4201B88C82002000431024D8
-:10FB900003E00008AC8200208F86001427BDFFE838
-:10FBA000AFBF0014AFB0001090C20063304200201D
-:10FBB0001040000830A500FF8CC2007C2403FFDF4A
-:10FBC00024420001ACC2007C90C2006300431024B8
-:10FBD000A0C2006310A000238F830014275001806F
-:10FBE000020028210E0015D6240600828F82001400
-:10FBF000904200633042004050400019A38000440E
-:10FC00008F83002C8F4201B80440FFFE8F82004892
-:10FC1000AE02000024026082A60200082402000254
-:10FC2000A202000B8C620008AE0200108C62000C75
-:10FC3000AE0200148C620014AE0200188C62001830
-:10FC4000AE0200248C620024AE0200288C620028E0
-:10FC5000AE02002C3C021000AF4201B8A380004469
-:10FC60008F8300148FBF00148FB000109062006368
-:10FC700027BD00183042007FA06200639782003ADF
-:10FC80008F86003C8F850014938300280046102344
-:10FC9000A782003AA4A000E490A400638F820040F1
-:10FCA000AF83003C2403FFBF0046102100832024C3
-:10FCB000AF820040A0A400638F820014A04000BD6A
-:10FCC0008F82001403E00008A44000BE8F8A001455
-:10FCD00027BDFFE0AFB10014AFB000108F88003C2B
-:10FCE000AFBF00189389001C954200E430D100FF9B
-:10FCF0000109182B0080802130AC00FF3047FFFF46
-:10FD00000000582114600003310600FF012030215B
-:10FD1000010958239783003A0068102B1440003CD7
-:10FD20000000000014680007240200018E02002079
-:10FD30002403FFFB34E7800000431024AE020020C0
-:10FD40002402000134E70880158200053165FFFFB9
-:10FD50000E001554020020210A00169102002021F5
-:10FD60000E001585020020218F8400482743018062
-:10FD70008F4201B80440FFFE24020018AC6400006A
-:10FD8000A062000B8F840014948200E6A46200102D
-:10FD90003C021000AC600030AF4201B894820060B9
-:10FDA00024420001A4820060948200603C030800A9
-:10FDB0008C63318830427FFF5443000F02002021C2
-:10FDC000948200602403800000431024A482006019
-:10FDD0009082006090830060304200FF000211C2F8
-:10FDE00000021027000211C03063007F0062182556
-:10FDF000A083006002002021022028218FBF00186C
-:10FE00008FB100148FB000100A0015F927BD002033
-:10FE1000914200632403FF8000431025A142006348
-:10FE20009782003A3048FFFF110000209383001CA6
-:10FE30008F840014004B1023304600FF948300E4AD
-:10FE40002402EFFF0168282B00621824A48300E439
-:10FE500014A000038E020020010058210000302170
-:10FE60002403FFFB34E7800000431024AE0200208F
-:10FE700024020001158200053165FFFF0E001554B4
-:10FE8000020020210A0016B99783003A0E0015855A
-:10FE9000020020219783003A8F82003CA780003A1D
-:10FEA00000431023AF82003C9383001C8F82001418
-:10FEB0008FBF00188FB100148FB0001027BD002035
-:10FEC00003E00008A04300BD938200442403000126
-:10FED00027BDFFE8004330042C420020AFB00010E3
-:10FEE000AFBF00142410FFFE10400005274501801D
-:10FEF0003C0208008C4231900A0016D600461024BD
-:10FF00003C0208008C423194004610241440000743
-:10FF1000240600848F8300142410FFFF9062006287
-:10FF20003042000F34420040A06200620E0015D63D
-:10FF300000000000020010218FBF00148FB00010DD
-:10FF400003E0000827BD00188F83002427BDFFE0D1
-:10FF5000AFB20018AFB10014AFB00010AFBF001CBB
-:10FF60009062000D00A0902130D100FF3042007F50
-:10FF7000A062000D8F8500148E4300180080802140
-:10FF80008CA2007C146200052402000E90A2006383
-:10FF9000344200200A0016FFA0A200630E0016C51E
-:10FFA000A38200442403FFFF104300472404FFFF03
-:10FFB00052200045000020218E4300003C0200102A
-:10FFC00000621024504000043C020008020020217E
-:10FFD0000A00170E24020015006210245040000988
-:10FFE0008E45000002002021240200140E0016C5D8
-:10FFF000A38200442403FFFF104300332404FFFFC7
-:020000040001F9
-:100000008E4500003C02000200A2102410400016A1
-:100010003C0200048F8600248CC200148CC30010A4
-:100020008CC40014004310230044102B50400005E2
-:10003000020020218E43002C8CC2001010620003AD
-:10004000020020210A00173F240200123C02000493
-:1000500000A210245040001C00002021020020219A
-:100060000A00173F2402001300A2102410400006CB
-:100070008F8300248C620010504000130000202168
-:100080000A001739020020218C6200105040000441
-:100090008E42002C020020210A00173F240200118A
-:1000A00050400009000020210200202124020017F6
-:1000B0000E0016C5A38200442403FFFF1043000274
-:1000C0002404FFFF000020218FBF001C8FB2001806
-:1000D0008FB100148FB000100080102103E00008E1
-:1000E00027BD00208F83001427BDFFD8AFB40020A8
-:1000F000AFB3001CAFB20018AFB10014AFB0001026
-:10010000AFBF0024906200638F91002C2412FFFF88
-:100110003442004092250000A06200638E2200104D
-:100120000080982130B0003F105200060360A021EB
-:100130002402000D0E0016C5A38200441052005484
-:100140002404FFFF8F8300148E2200188C63007C30
-:1001500010430007026020212402000E0E0016C585
-:10016000A38200442403FFFF104300492404FFFF3F
-:1001700024040020120400048F83001490620063A2
-:1001800034420020A06200638F85003410A000205C
-:1001900000000000560400048F8200140260202139
-:1001A0000A0017902402000A9683000A9442006015
-:1001B0003042FFFF144300048F8200202404FFFD1F
-:1001C0000A0017B7AF82003C3C0208008C42318C19
-:1001D0000045102B14400006026020210000282159
-:1001E0000E001646240600010A0017B70000202161
-:1001F0002402002D0E0016C5A38200442403FFFF35
-:10020000104300232404FFFF0A0017B70000202139
-:10021000160400058F8400148E2300142402FFFFAF
-:100220005062001802602021948200602442000184
-:10023000A4820060948200603C0308008C633188D3
-:1002400030427FFF5443000F0260202194820060FF
-:100250002403800000431024A48200609082006088
-:1002600090830060304200FF000211C2000210279C
-:10027000000211C03063007F00621825A083006077
-:10028000026020210E0015F9240500010000202144
-:100290008FBF00248FB400208FB3001C8FB20018D2
-:1002A0008FB100148FB000100080102103E000080F
-:1002B00027BD00288F83001427BDFFE8AFB00010D2
-:1002C000AFBF0014906200638F87002C00808021F4
-:1002D000344200408CE60010A06200633C0308003A
-:1002E0008C6331B030C23FFF0043102B1040004EF2
-:1002F0008F8500302402FF8090A3000D004310245E
-:10030000304200FF504000490200202100061382C5
-:10031000304800032402000255020044020020215C
-:1003200094A2001C8F85001424030023A4A20114AE
-:100330008CE60000000616023042003F1043001019
-:100340003C0300838CE300188CA2007C1062000642
-:100350002402000E0E0016C5A38200442403FFFFF2
-:10036000104300382404FFFF8F8300149062006361
-:1003700034420020A06200630A0017FC8F8300242F
-:1003800000C31024144300078F83002490A200624E
-:100390003042000F34420020A0A20062A38800383F
-:1003A0008F8300249062000D3042007FA062000D18
-:1003B0008F83003410600018020020218F840030E9
-:1003C0008C8200100043102B1040000924020018FA
-:1003D000020020210E0016C5A38200442403FFFF63
-:1003E000104300182404FFFF0A00182400002021F5
-:1003F0008C820010240500010200202100431023FC
-:100400008F830024240600010E001646AC62001003
-:100410000A001824000020210E0015F9240500010F
-:100420000A00182400002021020020212402000DCF
-:100430008FBF00148FB0001027BD00180A0016C52A
-:10044000A38200448FBF00148FB0001000801021E1
-:1004500003E0000827BD001827BDFFC8AFB2002089
-:10046000AFBF0034AFB60030AFB5002CAFB400283A
-:10047000AFB30024AFB1001CAFB000188F46012805
-:100480003C0308008C6331A02402FF80AF86004843
-:1004900000C318213065007F03452821006218241D
-:1004A0003C02000AAF43002400A2282190A200626F
-:1004B00000809021AF850014304200FF000211023D
-:1004C000A382003890A200BC304200021440000217
-:1004D00024030034240300308F820014A3830028F7
-:1004E000938300388C4200C0A3800044AF82003C5C
-:1004F00024020004106203148F84003C8E44000424
-:10050000508003118F84003C8E4200103083FFFF27
-:10051000A784003A106002F7AF8200408F84001475
-:100520002403FF809082006300621024304200FFA9
-:10053000144002C79785003A9383003824020002D2
-:1005400030B6FFFF14620005000088219382002866
-:100550002403FFFD0A001B11AF82003C8F82003C88
-:1005600002C2102B144002998F8400400E0014EC3C
-:1005700000000000938300283C040800248477785E
-:10058000240200341462002EAF84002C3C0A0800C0
-:100590008D4A77A82402FFFFAFA200100080382107
-:1005A0002405002F3C09080025297378240800FF42
-:1005B0002406FFFF90E2000024A3FFFF00062202B2
-:1005C00000C21026304200FF0002108000491021B6
-:1005D0008C420000306500FF24E7000114A8FFF5FD
-:1005E0000082302600061027AFA20014AFA2001030
-:1005F0000000282127A7001027A6001400C51023FB
-:100600009044000324A2000100A71821304500FFF8
-:100610002CA200041440FFF9A06400008FA2001077
-:100620001142000724020005024020210E0016C5D9
-:10063000A38200442403FFFF104300642404FFFF4F
-:100640003C0208009042777C104000098F82001421
-:10065000024020212402000C0E0016C5A382004493
-:100660002403FFFF104300592404FFFF8F8200146E
-:10067000A380001C3C0308008C63777C8C440080C2
-:100680003C0200FF3442FFFF006218240083202B4D
-:1006900010800008AF83003402402021240200199A
-:1006A0000E0016C5A38200442403FFFF1043004739
-:1006B0002404FFFF8F87003C9782003A8F85003427
-:1006C000AF8700200047202310A0003BA784003AFA
-:1006D0008F86001430A200030002102390C300BCD8
-:1006E0003050000300B0282100031882307300014D
-:1006F0000013108000A228213C0308008C6331A065
-:100700008F8200483084FFFF0085202B004310219A
-:1007100010800011244200888F84002C1082000E6B
-:100720003C033F013C0208008C42777800431024D0
-:100730003C0325001443000630E500FF8C820000D6
-:10074000ACC200888C8200100A0018E9ACC2009884
-:100750000E001529000030219382001C8F850014A3
-:100760008F830040020238218F82003CA387001C47
-:1007700094A400E4006218218F82003434841000B5
-:10078000AF83004000503021A4A400E41260000EAA
-:10079000AF86003C24E20004A382001C94A200E483
-:1007A00024C30004AF83003C34422000A4A200E430
-:1007B0000A001906000020218F820040AF80003C13
-:1007C00000471021AF820040000020212414FFFFC9
-:1007D000109402092403FFFF3C0808008D08778865
-:1007E0003C0208008C4231B03C03080090637778EB
-:1007F00031043FFF0082102B1040001B3067003F88
-:100800003C0208008C4231A88F83004800042180FC
-:1008100000621821006418213062007F0342282101
-:100820003C02000C00A228213C020080344200015E
-:100830003066007800C230252402FF800062102458
-:10084000AF42002830640007AF4208048F820014D2
-:100850000344202124840940AF460814AF850024B6
-:10086000AF840030AC4301189383003824020003A6
-:10087000146201C7240200012402002610E201C90B
-:1008800028E2002710400013240200322402002234
-:1008900010E201C428E200231040000824020024D2
-:1008A0002402002010E201B02402002110E2013FE6
-:1008B000024020210A001AF32402000B10E201B9C1
-:1008C0002402002510E20010024020210A001AF341
-:1008D0002402000B10E201A628E2003310400006BB
-:1008E0002402003F2402003110E200920240202145
-:1008F0000A001AF32402000B10E2019D024020219D
-:100900000A001AF32402000B8F90002C3C0308000D
-:100910008C6331B08F8500308E0400100000A82158
-:100920008CB3001430823FFF0043102B8CB10020A9
-:10093000504001870240202190A3000D2402FF8037
-:1009400000431024304200FF50400181024020212A
-:1009500000041382304200031440017D0240202134
-:1009600094A3001C8F8200148E040028A443011459
-:100970008CA20010026218231064000302402021A0
-:100980000A00197C2402001F8F82003400621021AB
-:100990000262102B104000088F83002402402021A7
-:1009A000240200180E0016C5A38200441054016CE6
-:1009B0002404FFFF8F8300248F8400348C62001096
-:1009C0000224882100441023AC6200108F8200149E
-:1009D000AC7100208C4200680051102B10400009BF
-:1009E0008F830030024020212402001D0E0016C516
-:1009F000A38200442403FFFF104301592404FFFF96
-:100A00008F8300308E0200248C6300241043000783
-:100A1000024020212402001C0E0016C5A3820044BF
-:100A20002403FFFF1043014E2404FFFF8F840024A2
-:100A30008C82002424420001AC8200241233000482
-:100A40008F8200148C4200685622000E8E02000035
-:100A50008E0200003C030080004310241440000D6F
-:100A60002402001A024020210E0016C5A382004471
-:100A70002403FFFF1043013A2404FFFF0A0019BAC0
-:100A80008E0200143C0300800043102450400003F9
-:100A90008E020014AC8000208E0200142411FFFF8F
-:100AA000105100062402001B024020210E0016C532
-:100AB000A38200441051012A2404FFFF8E0300008A
-:100AC0003C02000100621024104000123C02008031
-:100AD0000062102414400008024020212402001A61
-:100AE0000E0016C5A38200442403FFFF1043011C1F
-:100AF0002404FFFF02402021020028210E0016E5F9
-:100B0000240600012403FFFF104301152404FFFF06
-:100B1000241500018F83002402A0302102402021EF
-:100B20009462003624050001244200010A001AD70D
-:100B3000A46200368F90002C3C0308008C6331B017
-:100B40008E13001032623FFF0043102B10400089CB
-:100B50008F8400302402FF809083000D0043102416
-:100B6000304200FF104000842402000D0013138265
-:100B700030420003240300011443007F2402000DCF
-:100B80009082000D30420008544000048F820034EF
-:100B9000024020210A001A082402002450400004C8
-:100BA0008E03000C024020210A001A0824020027AC
-:100BB0008C82002054620006024020218E0300082F
-:100BC0008C820024506200098E0200140240202111
-:100BD000240200200E0016C5A382004410540071A8
-:100BE0002403FFFF0A001A3D8F8400242411FFFF15
-:100BF000145100048F860014024020210A001A3884
-:100C0000240200258E0300188CC2007C10620003B1
-:100C10002402000E0A001A38024020218E0300240C
-:100C20008C82002810620003240200210A001A3876
-:100C3000024020218E0500288C82002C10A2000387
-:100C40002402001F0A001A38024020218E03002CC3
-:100C500014600003240200230A001A3802402021F5
-:100C60008CC200680043102B1040000324020026B1
-:100C70000A001A38024020218C82001400651821D5
-:100C80000043102B104000088F84002402402021D4
-:100C9000240200220E0016C5A38200441051004118
-:100CA0002403FFFF8F8400242403FFF79082000DAC
-:100CB00000431024A082000D8F8600143C0308001E
-:100CC0008C6331AC8F82004894C400E08F8500248F
-:100CD0000043102130847FFF000420400044102195
-:100CE0003043007F034320213C03000E008320217A
-:100CF0002403FF8000431024AF42002CA493000083
-:100D00008CA2002824420001ACA200288CA2002C56
-:100D10008E03002C00431021ACA2002C8E02002C6C
-:100D2000ACA200308E020014ACA2003494A2003AAF
-:100D300024420001A4A2003A94C600E03C0208004C
-:100D40008C4231B024C4000130837FFF1462000F55
-:100D500000803021240280000082302430C2FFFF56
-:100D6000000213C2304200FF000210270A001A7668
-:100D7000000233C02402000D024020210E0016C5DF
-:100D8000A38200440A001A7C004018218F820014BC
-:100D900002402021240500010E0015F9A44600E0C0
-:100DA000000018210A001B0E006088218F90002C83
-:100DB0003C0308008C6331B08E05001030A23FFF69
-:100DC0000043102B104000612402FF808F8400300C
-:100DD0009083000D00431024304200FF5040005C1F
-:100DE000024020218F8200341040000B0005138246
-:100DF0008F8200149763000A944200603042FFFF24
-:100E000014430005000513828F8200202404FFFD97
-:100E10000A001AEBAF82003C304200031440000E7F
-:100E20000000000092020002104000058E03002422
-:100E300050600015920300030A001AA70240202107
-:100E40008C82002450620010920300030240202193
-:100E50000A001AAF2402000F9082000D30420008F1
-:100E60005440000992030003024020212402001094
-:100E70000E0016C5A38200442403FFFF1043003870
-:100E80002404FFFF92030003240200025462000CBA
-:100E9000920200038F820034544000099202000342
-:100EA000024020212402002C0E0016C5A38200441B
-:100EB0002403FFFF1043002A2404FFFF92020003D3
-:100EC0000200282102402021384600102CC60001D3
-:100ED0002C4200010E0016E5004630252410FFFFCD
-:100EE0001050001F2404FFFF8F8300341060001394
-:100EF000024020213C0208008C42318C0043102B20
-:100F00001440000700000000000028212406000112
-:100F10000E001646000000000A001AEB0000202117
-:100F20002402002D0E0016C5A38200441050000CB0
-:100F30002404FFFF0A001AEB000020210E0015F91F
-:100F4000240500010A001AEB0000202102402021A4
-:100F50002402000D0E0016C5A3820044004020218B
-:100F60000A001B0E008088211514000E00000000EE
-:100F70000E00174C024020210A001B0E0040882161
-:100F80000E0016C5A38200440A001B0E00408821F3
-:100F900014620017022018212402002314E2000525
-:100FA0002402000B0E0017C0024020210A001B0E75
-:100FB0000040882102402021A38200440E0016C573
-:100FC0002411FFFF0A001B0F0220182130A500FF8B
-:100FD0000E001529240600019783003A8F82003CF9
-:100FE000A780003A00431023AF82003C0220182162
-:100FF0001220003E9782003A2402FFFD5462003E18
-:101000008E4300208E4200048F830014005610236C
-:10101000AE420004906200633042007FA062006331
-:101020008E4200208F840014A780003A34420002D0
-:10103000AE420020A48000E4908200632403FFBF3E
-:1010400000431024A08200630A001B518E4300203D
-:101050009082006300621024304200FF10400023A1
-:101060009782003A90820088908300BD2485008892
-:101070003042003F2444FFE02C820020A383001C68
-:1010800010400019AF85002C2402000100821804D2
-:10109000306200191440000C3C028000344200020F
-:1010A000006210241440000B306200201040000F3A
-:1010B0009782003A90A600010240202124050001F9
-:1010C0000A001B4B30C60001024020210A001B4AC7
-:1010D00024050001024020210000282124060001EF
-:1010E0000E001646000000009782003A1440FD0CE6
-:1010F0008F8400148E4300203062000410400012E0
-:101100008F84003C2402FFFB00621024AE420020CA
-:10111000274301808F4201B80440FFFE8F820048C0
-:10112000AC6200008F420124AC62000424026083A0
-:10113000A462000824020002A062000B3C0210001E
-:10114000AF4201B88F84003C8F8300148FBF0034FE
-:101150008FB600308FB5002C8FB400288FB30024D9
-:101160008FB200208FB1001C8FB000182402000144
-:1011700027BD003803E00008AC6400C030A500FFC4
-:101180002403000124A900010069102B1040000C69
-:1011900000004021240A000100A31023004A380463
-:1011A00024630001308200010069302B10400002EE
-:1011B000000420420107402554C0FFF800A310237B
-:1011C00003E00008010010213C020800244260A452
-:1011D0003C010800AC22736C3C0208002442530816
-:1011E0003C010800AC2273702402000627BDFFE01A
-:1011F0003C010800A02273743C021EDCAFB2001850
-:10120000AFB10014AFBF001CAFB0001034526F413B
-:1012100000008821240500080E001B7202202021F6
-:10122000001180803C07080024E773780002160054
-:1012300002071821AC6200000000282124A200014E
-:101240003045FFFF8C6200002CA60008044100021C
-:10125000000220400092202614C0FFF8AC64000079
-:10126000020780218E0400000E001B72240500205E
-:10127000262300013071FFFF2E2301001460FFE5DB
-:10128000AE0200008FBF001C8FB200188FB1001497
-:101290008FB0001003E0000827BD002027BDFFD855
-:1012A000AFB3001CAFB20018AFBF0020AFB1001445
-:1012B000AFB000108F5101408F48014800089402E0
-:1012C000324300FF311300FF8F4201B80440FFFE9C
-:1012D00027500180AE1100008F420144AE0200048D
-:1012E00024020002A6120008A202000B240200142D
-:1012F000AE1300241062002528620015104000087B
-:101300002402001524020010106200302402001292
-:10131000106200098FBF00200A001CAD8FB3001CB3
-:101320001062007024020022106200378FBF00207C
-:101330000A001CAD8FB3001C3C0208008C4231A097
-:101340002403FF800222102100431024AF42002416
-:101350003C0208008C4231A0022210213042007F62
-:10136000034218213C02000A00621821166000BCEA
-:10137000AF830014906200623042000F34420030AC
-:10138000A06200620A001CAC8FBF00203C04600019
-:101390008C832C083C02F0033442FFFF00621824C7
-:1013A000AC832C083C0208008C4231A08C832C08B2
-:1013B000244200740002108200021480006218258A
-:1013C000AC832C080A001CAC8FBF00203C02080034
-:1013D0008C4231A02403FF800222102100431024FC
-:1013E000AF4200243C0208008C4231A03C03000ABA
-:1013F000022210213042007F0342102100431021BD
-:101400000A001CABAF8200143C0208008C4231A0E1
-:101410002405FF800222102100451024AF42002441
-:101420003C0208008C4231A0022210213042007F91
-:10143000034218213C02000A0062182190620063F6
-:1014400000A21024304200FF10400085AF8300143A
-:1014500024620088944300123C0208008C4231A8A8
-:1014600030633FFF00031980022210210043102146
-:101470003043007F03432021004510243C03000C2F
-:1014800000832021AF4200289082000D00A210248A
-:10149000304200FF10400072AF8400249082000DA3
-:1014A000304200101440006F8FBF00200E0015C89E
-:1014B000000000008F4201B80440FFFE0000000061
-:1014C000AE1100008F420144AE020004240200026B
-:1014D000A6120008A202000BAE1300240A001CACE6
-:1014E0008FBF00202406FF8002261024AF42002078
-:1014F0003C0208008C4231A031043FFF00042180EF
-:101500000222102100461024AF4200243C030800B0
-:101510008C6331A83C0208008C4231A03227007F46
-:101520000223182102221021006418213042007F7A
-:101530003064007F034228213C02000A0066182420
-:1015400000A22821034420213C02000C008220211B
-:10155000AF4300283C020008034718210062902195
-:10156000AF850014AF8400240E0015C8010080214F
-:101570008F4201B80440FFFE8F8200248F84001444
-:10158000274501809042000DACB10000A4B00006D8
-:10159000000216000002160300021027000237C2E4
-:1015A00014C00016248200889442001232033FFFC8
-:1015B00030423FFF14430012240260829083006394
-:1015C0002402FF8000431024304200FF5040000CF2
-:1015D00024026082908200623042000F3442004058
-:1015E000A082006224026084A4A200082402000DEC
-:1015F000A0A200050A001C963C022700240260827B
-:10160000A4A20008A0A000053C02270000061C00C0
-:101610000062182524020002A0A2000BACA3001057
-:10162000ACA00014ACA00024ACA00028ACA0002CFE
-:101630008E42004C8F840024ACA200189083000DD1
-:101640002402FF8000431024304200FF10400005B8
-:101650008FBF00209082000D3042007FA082000DDD
-:101660008FBF00208FB3001C8FB200188FB1001401
-:101670008FB000103C02100027BD002803E00008D6
-:04168000AF4201B8BC
-:0C1684000800343008003430080033A89F
-:10169000080033E0080034140800343808003438F7
-:0816A00008003438080033187B
-:0816A8000A000124000000000B
-:1016B000000000000000000D747061362E322E31E3
-:1016C0000000000006020101000000000000000010
-:1016D000000000000000000000000000000000000A
-:1016E00000000000000000000000000000000000FA
-:1016F00000000000000000000000000000000000EA
-:1017000000000000000000000000000000000000D9
-:1017100000000000000000000000000000000000C9
-:1017200000000000000000000000000000000000B9
-:101730000000000000000000000000001000000396
-:10174000000000000000000D0000000D3C02080039
-:1017500024421C003C03080024632094AC40000099
-:101760000043202B1480FFFD244200043C1D080090
-:1017700037BD2FFC03A0F0213C1008002610049078
-:101780003C1C0800279C1C000E00015C00000000AF
-:101790000000000D3084FFFF308200078F850018A5
-:1017A00010400002248300073064FFF800853021D8
-:1017B00030C41FFF03441821247B4000AF85001C68
-:1017C000AF84001803E00008AF4400843084FFFFBA
-:1017D000308200078F8500208F860028104000028D
-:1017E000248300073064FFF8008520210086182B31
-:1017F00014600002AF8500240086202303442821C2
-:1018000034068000AF840020AF44008000A6202171
-:1018100003E00008AF84003827BDFFD8AFB3001C39
-:10182000AFB20018AFB00010AFBF0024AFB40020BB
-:10183000AFB100143C0860088D1450002418FF7FDD
-:101840003C1A8000029898243672380CAD12500071
-:101850008F5100083C07601C3C08600036300001D6
-:10186000AF500008AF800018AF400080AF40008448
-:101870008CE600088D0F08083C0760168CEC000011
-:1018800031EEFFF039CA00103C0DFFFF340B800031
-:101890003C030080034B48212D440001018D282486
-:1018A0003C0253533C010800AC230420AF890038AC
-:1018B000AF860028AF840010275B400014A200030D
-:1018C00034E37C008CF90004032818218C7F007C11
-:1018D0008C6500783C0280003C0B08008D6B048C0A
-:1018E0003C0A08008D4A048834520070AF85003CE1
-:1018F000AF9F00403C13080026731C440240A02107
-:101900008E4800008F46000038C30001306400019B
-:1019100010800017AF880034028048218D2F00000E
-:101920003C0508008CA5045C3C1808008F1804587E
-:1019300001E8102300A280210000C8210202402BF0
-:1019400003198821022838213C010800AC30045CCE
-:101950003C010800AC2704588F4E000039CD00012F
-:1019600031AC00011580FFED01E04021AF8F003464
-:101970008E5100003C0708008CE7045C3C0D080019
-:101980008DAD04580228802300F0602100007021F2
-:101990000190302B01AE1821006620213C01080087
-:1019A000AC2C045C3C010800AC2404588F460108B0
-:1019B0008F47010030C92000AF860000AF87000CC0
-:1019C0001120000A00C040213C1808008F18042C88
-:1019D000270800013C010800AC28042C3C184000FA
-:1019E000AF5801380A000196000000009749010431
-:1019F00000002821014550213122FFFF01625821BA
-:101A00000162F82B015F502130D902003C0108002F
-:101A1000AC2B048C3C010800AC2A0488172000156C
-:101A200024040F0010E400130000000024080D003F
-:101A300010E8023B30CD000611A0FFE93C18400041
-:101A4000936E00002409001031C400F01089027167
-:101A500024020070108202E58F880014250F000117
-:101A6000AF8F00143C184000AF5801380A000196AF
-:101A700000000000974C01041180FFD93C18400081
-:101A800030C34000146000A1000000008F460178C0
-:101A900004C0FFFE8F87003824100800240F0008C0
-:101AA0008CE30008AF500178A74F0140A7400142E6
-:101AB000974E01048F86000031C9FFFF30CD000131
-:101AC00011A002E1012040212531FFFE241800026F
-:101AD000A75801463228FFFFA75101483C190800CA
-:101AE0008F39043C172002D08F8C000C30DF00208F
-:101AF00017E00002240400092404000130C20C0095
-:101B0000240504005045000134840004A744014A20
-:101B10003C1108008E3104203C1800483C100001A4
-:101B20000238182530CF00020070282511E000048B
-:101B3000000018213C19010000B9282524030001E8
-:101B400030DF000453E00005AF8300083C060010BE
-:101B500000A6282524030001AF830008AF4510002C
-:101B60000000000000000000000000000000000075
-:101B70008F83000810600023000000008F451000D4
-:101B800004A1FFFE000000001060001E0000000025
-:101B90008F4410003C0C0020008C102410400019D1
-:101BA0008F8E000031CD000211A000160000000051
-:101BB000974F101415E0001300000000975910080B
-:101BC0003338FFFF27110006001118820003308010
-:101BD00000C7282132300001322300031200032CF9
-:101BE0008CA200000000000D00C7F821AFE2000049
-:101BF0003C0508008CA5043024A600013C01080027
-:101C0000AC2604308F6D00003402FFFFAF8D00045E
-:101C10008CEC0000118202A6000020218CED000057
-:101C200031AC01001180028A000000003C02080073
-:101C30008C4204743C0308008C63044C3C1F080075
-:101C40008FFF04703C1808008F18044800483821A2
-:101C50000068802100E8282B03E430210208402B93
-:101C60000304882100C57021022878213C01080066
-:101C7000AC30044C3C010800AC2F04483C01080087
-:101C8000AC2704743C010800AC2E04708F8400184B
-:101C90000120302131290007249F000833F91FFF5C
-:101CA00003594021AF84001CAF990018251B400048
-:101CB000AF590084112000038F83002024C2000745
-:101CC0003046FFF88F84002800C3282100A4302B61
-:101CD00014C00002AF83002400A428230345602120
-:101CE000340D8000018D10213C0F1000AF850020C5
-:101CF000AF820038AF450080AF4F01788F88001465
-:101D0000250F00010A0001EFAF8F00148F62000859
-:101D10008F670000240500300007760231C300F011
-:101D2000106500A7240F0040546FFF4C8F880014EB
-:101D30008F4B01780560FFFE0000000030CA0200F2
-:101D400015400003000612820000000D00061282FA
-:101D5000304D0003000D4900012D18210003808043
-:101D6000020D402100086080019380218E1F000039
-:101D700017E00002000000000000000D8F6E00045C
-:101D800005C202BD92070006920E000592020004F1
-:101D90003C090001000E18800070F8218FED00183A
-:101DA000277100082448000501A96021000830823D
-:101DB000AFEC0018022020210E00059E260500141D
-:101DC000920A00068F7900043C0B7FFF000A2080F6
-:101DD000009178218DF800043566FFFF0326282442
-:101DE00003053821ADE70004920E0005920D0004B2
-:101DF000960C0008000E10800051C8218F230000AF
-:101E0000974901043C07FFFF006758243128FFFF72
-:101E1000010DF82103EC50233144FFFF016430250C
-:101E2000AF26000092030007241800011078027505
-:101E3000240F0003106F0285000000008E050010C3
-:101E40002419000AA7590140A7450142921800042D
-:101E50008F860000240F0001A7580144A7400146C7
-:101E60009747010430D100023C050041A7470148D3
-:101E700000001821A74F014A1220000330CB0004B4
-:101E80003C0501412403000151600005AF830008B7
-:101E90003C06001000A6282524030001AF8300089B
-:101EA000AF4510000000000000000000000000002E
-:101EB000000000008F8A00081140000400000000AC
-:101EC0008F4410000481FFFE000000008F6B0000B3
-:101ED000920800043C1108008E310444AF8B0004CA
-:101EE00097590104311800FF3C0E08008DCE0440C4
-:101EF0003325FFFF03053821022760210000102150
-:101F0000250F000A31E8FFFF0187482B01C2682135
-:101F100001A9F821311000073C010800AC2C044451
-:101F20003C010800AC3F0440120000038F8C0018F5
-:101F30002506000730C8FFF8010C682131BF1FFFDC
-:101F4000AF8C001CAF9F0018AF5F00849744010462
-:101F5000035F80213084FFFF308A000711400003B7
-:101F6000261B4000248900073124FFF88F820020BF
-:101F70008F850028008220210085702B15C000026B
-:101F8000AF820024008520233C0B08008D6B048C5D
-:101F90003C0A08008D4A04880344882134038000E9
-:101FA000022310213C0F1000AF840020AF820038C4
-:101FB000AF440080AF4F01780A0002968F8800146A
-:101FC0008F5001780600FFFE30D10200162000037A
-:101FD000000612820000000D00061282305F00032E
-:101FE000001F1900007F302100062080009FC821BB
-:101FF00000194880013380218E1800001300000270
-:10200000000000000000000D8F6C000C058001FB3B
-:102010008F870038240E0001AE0E00008CE300080C
-:10202000A20000078F65000400055402314D00FF37
-:1020300025A80005000830822CCB00411560000265
-:10204000A20A00040000000D8F7800043C03FFFF8B
-:1020500000E02821330BFFFF256C000B000C1082E1
-:1020600000022080008748218D3F000026040014D4
-:10207000A618000803E3C8240E00059EAD39000031
-:102080008F4F01083C11100001F1382410E001AB22
-:1020900000000000974D01049208000725AAFFECFC
-:1020A000350600023144FFFFA2060007960600082D
-:1020B0002CC7001354E0000592030007921100079B
-:1020C000362F0001A20F0007920300072418000119
-:1020D000107801C224090003106901D58F880038E7
-:1020E00030CBFFFF257100020011788331E400FF3F
-:1020F00000042880A20F000500A848218D2D0000B3
-:10210000974A01043C0EFFFF01AEF8243143FFFF64
-:10211000006B1023244CFFFE03ECC825AD390000F2
-:10212000920600053C03FFF63462FFFF30D800FF43
-:102130000018388000F08821922F00143C04FF7FA3
-:102140003487FFFF31EE000F01C65821316500FFD3
-:1021500000055080015068218DAC00200148F82115
-:10216000A20B00060182C824AE0C000CAFF9000CD3
-:10217000920900068E11000C032778240009C08004
-:102180000310702195C60026030828210227202469
-:10219000AE04000CADCF0020ADC60024ACA60010EC
-:1021A0008F8800003C0B08008D6B048C3C0A0800F3
-:1021B0008D4A0488241F001024190002A75F0140E3
-:1021C000A7400142A7400144A7590146974901048D
-:1021D00024070001310600022538FFFEA7580148F8
-:1021E0003C050009A747014A10C000030000182160
-:1021F0003C05010924030001310C00045180000555
-:10220000AF8300083C08001000A828252403000123
-:10221000AF830008AF451000000000000000000080
-:1022200000000000000000009205000424AE00023F
-:1022300031CD0007000D182330620007AE020010F8
-:102240008F90000812000004000000008F4F100063
-:1022500005E1FFFE000000008F7100008F8E001866
-:102260003C0308008C630444AF91000497450104CB
-:1022700025CF001031E61FFF30A2FFFFAF8E001CFC
-:10228000AF860018AF4600842449FFFE3C0C0800CE
-:102290008D8C0440974D010401208021000947C323
-:1022A0000070C02131A9FFFF0310F82B0188C8215D
-:1022B000033F202103463821313100073C0108004B
-:1022C000AC3804443C010800AC2404401220000354
-:1022D00024FB40002527000730E9FFF88F86002007
-:1022E0008F8400280126382100E4C02B170000024B
-:1022F000AF86002400E438230347202134198000EE
-:10230000009910213C0F1000AF870020AF820038E9
-:10231000AF470080AF4F01780A0002968F88001403
-:102320009747010410E0FDAE3C1840008F5801783B
-:102330000700FFFE30C5400010A000033C1F00084E
-:102340000000000D3C1F0008AF5F01402410080092
-:102350008F860000AF5001789744010430D9000106
-:10236000132000ED3086FFFF24CCFFFE240D000279
-:10237000A74D0146A74C01488F9100182408000D75
-:10238000A748014A8F630000262F000831E21FFF93
-:102390000342702130C90007AF830004AF91001CD5
-:1023A000AF82001800C03821AF4200841120000322
-:1023B00025DB400024D800073307FFF88F85002075
-:1023C0008F84002800E5302100C4382B14E000027F
-:1023D000AF85002400C430238F8400140346F82105
-:1023E000340C8000AF86002003EC8021AF460080D3
-:1023F000249900013C0610003C184000AF460178CB
-:10240000AF900038AF990014AF5801380A00019618
-:10241000000000008F630000975101043067FFFF48
-:102420003228FFFF8F4F017805E0FFFE30EC0007F8
-:10243000000CF82333F0000724F9FFFE2404000AFF
-:10244000A7440140A7500142A7590144A7400146B3
-:10245000A74801488F45010830B800201700000246
-:10246000240300092403000130CD0002A743014AE0
-:102470003C04004111A00003000018213C0401416C
-:102480002403000130C9000451200005AF83000877
-:102490003C0600100086202524030001AF830008BD
-:1024A000AF44100000000000000000000000000029
-:1024B000000000008F8E000811C000040000000022
-:1024C0008F4210000441FFFE000000008F7F0000DB
-:1024D000276400088F91003CAF9F0004948500089A
-:1024E0009490000A9499000C30AFFFFF0010C400D4
-:1024F0003323FFFF11F100A6030320253C0E080043
-:102500008DCE04443C0C08008D8C044000E88821EA
-:102510002626FFFE01C628210000682100A6F82B10
-:10252000018D2021009F80213C010800AC2504443E
-:102530003C010800AC30044024E200083042FFFFB8
-:102540003047000710E000038F830018244F000776
-:1025500031E2FFF83106FFFF30C800070043802159
-:1025600032191FFF0359C021AF83001CAF99001817
-:10257000271B4000AF590084110000038F8C0020FE
-:1025800024C5000730A6FFF88F84002800CC28213E
-:1025900000A4F82B17E00002AF8C002400A428232D
-:1025A000AF850020AF4500803C0408008C840434D3
-:1025B00003454821340E8000012E6821108000055B
-:1025C000AF8D0038939100172406000E12260011DB
-:1025D0002407043F3C021000AF4201788F880014AA
-:1025E000250F00010A0001EFAF8F00140E0005C493
-:1025F00000E020218F8800143C0B08008D6B048CB8
-:102600003C0A08008D4A0488250F00010A0001EFEA
-:10261000AF8F00143C021000A7470148AF42017879
-:102620000A0004CE8F88001424040F001184003D9A
-:1026300030CE002015C0000224030009240300014D
-:102640000A00021AA743014A0A00020DA7400146E8
-:1026500094EF000894F1000A94F0000C8F8C003C79
-:10266000001174003207FFFF31EDFFFF11AC00379E
-:1026700001C720253C1808008F1804443C0F0800AF
-:102680008DEF0440000080210308682101A8382B49
-:1026900001F0702101C760213C010800AC2D044409
-:1026A0003C010800AC2C04400A00027A8F84001818
-:1026B0003C0208008C42047C3C0308008C630454F8
-:1026C0003C1F08008FFF04783C1808008F18045046
-:1026D000004838210068802100E8282B03E43021DD
-:1026E0000208402B0304882100C5702102287821AC
-:1026F0003C010800AC3004543C010800AC2F0450ED
-:102700003C010800AC27047C3C010800AC2E047896
-:102710000A00027A8F840018A74001460A00043597
-:102720008F91001830CD002015A0FFC52403000DA7
-:10273000240300050A00021AA743014A974E010428
-:1027400025C5FFF00A00038130A4FFFF8F980040E9
-:102750001498FFC8000010213C0508008CA5046CEB
-:102760003C1F08008FFF046800A8C8210328302BF5
-:1027700003E22021008640213C010800AC39046CB2
-:102780003C010800AC2804680A00027A8F84001813
-:102790008F8C0040148CFF5900E8C8213C180800B9
-:1027A0008F18046C3C1108008E3104682723FFFE4B
-:1027B00003034821000010210123302B0222702145
-:1027C00001C668213C010800AC29046C3C010800EA
-:1027D000AC2D04680A0004A524E200088F880038A4
-:1027E0003C03FFFF8D02000C0043F82403E4C825DE
-:1027F000AD19000C0A00038F30CBFFFF0A0003C3A2
-:10280000AE000000974A0104920400048E26000CDA
-:10281000014458212579FFF200C7C0243325FFFF6A
-:1028200003053825AE27000C0A0002E68E050010CD
-:102830003C0DFFFF8D0A0010014D582401646025F6
-:10284000AD0C00100A00038F30CBFFFF974301044B
-:10285000920E00048E290010006E1021244DFFEE10
-:102860000127602431A8FFFF0188F825AE3F001042
-:102870000A0002E68E0500108E0F000CAE0000006C
-:1028800000078880023028210A0002B8ACAF00207F
-:102890001460000D3058FFFF3C04FFFF0044682423
-:1028A00001A47026000E602B000D102B004CF824A4
-:1028B00013E00002000000000000000D8CAF0000DB
-:1028C0000A00025001E410253B03FFFF0003882BA0
-:1028D0000018802B0211202410800002000000004C
-:1028E0000000000D8CB900000A0002503722FFFFE3
-:1028F0003084FFFF30A5FFFF108000070000182183
-:1029000030820001104000020004204200651821BE
-:102910001480FFFB0005284003E000080060102140
-:1029200010C00007000000008CA2000024C6FFFFBA
-:1029300024A50004AC82000014C0FFFB2484000422
-:1029400003E000080000000010A0000824A3FFFF1F
-:10295000AC86000000000000000000002402FFFF21
-:102960002463FFFF1462FFFA2484000403E00008DC
-:1029700000000000308EFFFF30D8FFFF00057C0014
-:1029800001F8602539CDFFFF01AC5021014C582BD7
-:10299000014B4821000944023127FFFF00E83021A4
-:1029A0000006240230C5FFFF00A418213862FFFF93
-:1029B00003E000083042FFFF3C0C08008D8C0484CB
-:1029C000240BFF8027BDFFD001845021014B4824F8
-:1029D000AF4900203C0808008D080484AFB20020F5
-:1029E000AFB00018AFBF0028AFB30024AFB1001CD8
-:1029F000936600040104382130E4007F009A10211E
-:102A00003C0300080043902130C500200360802172
-:102A10003C080111277B000814A000022646007024
-:102A20002646006C9213000497510104920F000493
-:102A30003267000F322EFFFF31ED004001C728231F
-:102A400011A0000500004821925900BC3338000451
-:102A50001700009000000000924300BC307F00048B
-:102A600013E0000F0000000010A0000D00000000A7
-:102A7000960E0002240AFF8000A7602125CDFFFEEC
-:102A8000A74D1016920B0004014B2024308200FF4A
-:102A900010400085010C40253C0F0400010F40252B
-:102AA0008F5301780660FFFE2404000AA74401400A
-:102AB000960D00022404000931AC0007000C5823D5
-:102AC000316A0007A74A0142960200022443FFFE32
-:102AD000A7430144A7400146975F0104A75F01484F
-:102AE0008F590108333800205300000124040001ED
-:102AF000920F000431EE001015C000023483001064
-:102B000000801821A743014A0000000000000000D7
-:102B10000000000000000000AF48100000000000AE
-:102B20000000000000000000000000008F511000B5
-:102B30000621FFFE3113FFFF1260000300000000BA
-:102B40008F481018ACC8000096030006307FFFFFC6
-:102B500027F900020019988200138880023B302177
-:102B60008CD800001520005700183402920300048E
-:102B70002405FF8000A3F82433F100FF1220002C6D
-:102B800000000000924700BC30F200021240002812
-:102B900000000000974B100C2562FFFEA7421016A4
-:102BA000000000003C0A040035490030AF49100025
-:102BB0000000000000000000000000000000000015
-:102BC0008F4C10000581FFFE000000009749100C9B
-:102BD0008F51101C00C020213127FFFF24F200304C
-:102BE000001218820003288000BBF8213226FFFF64
-:102BF000AFF100000E0005B300112C020013C880D5
-:102C0000033B98218E78000000027400AFB80010DA
-:102C10008FA80010310FFFFFAFAF00108FA400107E
-:102C200001C46825AFAD00108FA60010AE6600008D
-:102C300097730008976D000A9766000C8F8A003C16
-:102C4000000D5C0030CCFFFF3262FFFF104A0036FF
-:102C5000016C2025960600023C10100024D30008C9
-:102C60000E00013B3264FFFF974C01040E00014946
-:102C70003184FFFFAF5001788FBF00288FB300244D
-:102C80008FB200208FB1001C8FB0001803E0000845
-:102C900027BD003010A0FF700000000024A5FFFC3D
-:102CA0000A0005EC240900048CD10000AF51101873
-:102CB0008F5301780660FF7A2404000A0A00060197
-:102CC0000000000000A7C8218F8800388F4E101C1C
-:102CD0000019C0820018788001E82021AC8E000025
-:102CE000000E2C0200C020210E0005B331C6FFFFEC
-:102CF000023B28218CAD000000025400004030212E
-:102D0000AFAD00108FAC0010318BFFFFAFAB0010E8
-:102D10008FA2001001424825AFA900108FA7001014
-:102D20000A000631ACA700008F8F0040148FFFC946
-:102D30000000000097420104960B00023C050800C9
-:102D40008CA5046C3049FFFF316AFFFF3C1108007D
-:102D50008E310468012A382124F2FFFE00B240219E
-:102D60000012FFC30112C82B023FC021031920210A
-:102D70003C010800AC28046C3C010800AC24046849
-:102D80000A00066B0000000000A4102B1040000990
-:102D9000240300010005284000A4102B04A0000318
-:102DA000000318405440FFFC000528401060000755
-:102DB000000000000085302B14C000020003184200
-:102DC000008520231460FFFB0005284203E0000873
-:102DD000008010218F85002C27BDFFE800053027DB
-:102DE0002CC300012CA40002008310251040000316
-:102DF000AFBF00102405007FAF85002C00052827F9
-:102E000030A5FFFF0E000592240426F58F830030C5
-:102E1000240402BD004030210083382B10E000095B
-:102E200024050001000420400083102B04800003CF
-:102E3000000528405440FFFC0004204010A000087A
-:102E400000C350210064402B1500000200052842F9
-:102E50000064182314A0FFFB0004204200C350218B
-:102E60008FBF0010000A4C02312200FF27BD00185E
-:0C2E7000AF8A002C03E00008AF8900309E
-:042E7C000A00002A1E
-:102E800000000000000000000000000D74787036A3
-:102E90002E322E310000000006020100000000006A
-:102EA000000001360000EA600000000000000000A1
-:102EB0000000000000000000000000000000000012
-:102EC0000000000000000000000000000000000002
-:102ED00000000000000000000000000000000016DC
-:102EE00000000000000000000000000000000000E2
-:102EF00000000000000000000000000000000000D2
-:102F000000000000000000000000000000000000C1
-:102F1000000000000000138800000000000005DC35
-:102F2000000000000000000010000003000000008E
-:102F30000000000D0000000D3C02080024423C206F
-:102F40003C03080024633DD4AC4000000043202B28
-:102F50001480FFFD244200043C1D080037BD7FFCA7
-:102F600003A0F0213C100800261000A83C1C08001B
-:102F7000279C3C200E0002BA000000000000000D5B
-:102F80008F8300383C088000350700708CE5000016
-:102F9000008330253C02900000C22025AF85003020
-:102FA000AF4400208F4900200520FFFE3C03800035
-:102FB000346200708C4500008F8600303C19080098
-:102FC0008F39007C3C0E08008DCE007800A62023AF
-:102FD00003245821000078210164682B01CF60216F
-:102FE000018D50213C010800AC2B007C3C01080005
-:102FF000AC2A007803E00008000000000A0000414D
-:10300000240400018F8400383C05800034A20001B4
-:103010000082182503E00008AF43002003E0000809
-:10302000000010213084FFFF30A5FFFF1080000753
-:1030300000001821308200011040000200042042EC
-:10304000006518211480FFFB0005284003E00008FC
-:103050000060102110C00007000000008CA20000DA
-:1030600024C6FFFF24A50004AC82000014C0FFFBAF
-:103070002484000403E000080000000010A0000801
-:1030800024A3FFFFAC860000000000000000000049
-:103090002402FFFF2463FFFF1462FFFA248400046C
-:1030A00003E0000800000000308AFFFF93A800132F
-:1030B000A74A014497490E1630C600FF3C02100093
-:1030C000A7490146AF450148A3460152A748015A06
-:1030D000AF4701608FA400188FA30014A7440158C4
-:1030E000AF43015403E00008AF42017803E0000859
-:1030F000000000003C038000346200708C49000036
-:103100008F8800002484000727BDFFF83084FFF873
-:10311000AF890030974D008A31ACFFFFAFAC0000A3
-:103120008FAB0000016850232547FFFF30E61FFFEB
-:1031300000C4282B14A0FFF73C0C8000358B0070D6
-:103140008D6A00003C0708008CE700843C060800FC
-:103150008CC6008000081082014918230002788084
-:1031600000E370210000202101C3C82B00C4C0214E
-:1031700001FA4021031948212502400027BD00081B
-:103180003C010800AC2E00843C010800AC29008002
-:1031900003E00008000000008F8200002486000782
-:1031A00030C5FFF800A2182130641FFF03E00008BB
-:1031B000AF8400008F8700388F8A004027BDFFB89A
-:1031C0008F860044AFB60040AFBF0044AFB5003CAF
-:1031D000AFB40038AFB30034AFB20030AFB1002CA1
-:1031E000AFB000288F4501048D4900ACAF47008087
-:1031F0008CC8002000A938230000B021AF480E1071
-:103200008F440E1000004821AF440E148CC20024DD
-:10321000AF420E188F430E18AF430E1C10E001256D
-:103220002D230001936B0008116000D40000000002
-:10323000976E001031CDFFFF00ED602B158000CFA1
-:103240000000000097700010320FFFFFAF4F0E001C
-:103250008F520000325100081220FFFD00000000D4
-:1032600097540E088F460E043285FFFF30B30001DD
-:1032700012600132000000000000000D30B8A040D4
-:1032800024150040131500C030A9A0001120012D05
-:1032900000000000937F000813E000080000000019
-:1032A00097630010306BFFFF00CB402B1100000331
-:1032B00030AC00401180012300000000A785003CD5
-:1032C000AF8600349366000800E02821AFA70020F5
-:1032D00014C0012427B30020AF60000C9782003C8B
-:1032E0003047400014E00002240300162403000EBF
-:1032F00024194007A363000AAF790014938A003EA3
-:103300008F740014315800070018AA4002959025C8
-:10331000AF7200149784003C8F700014309100103D
-:1033200002117825AF6F0014978E003C31CD000854
-:1033300011A00147000028218F6700143C021000F3
-:103340003C0C810000E22825AF65001497460E0A68
-:103350002408000E3405FFFC30C3FFFF006C582525
-:10336000AF6B0004A3680002937F000A27E9000402
-:10337000A369000A9786003C9363000A30CC1F00C3
-:10338000000C598301634021251F0028A37F0009F9
-:1033900097490E0CA769001093790009272A0002AB
-:1033A000315800070018A82332B10007A371000BA1
-:1033B00093740009976400108F910034978F003C3C
-:1033C000329200FF024480210205702131ED00405D
-:1033D00011A0000531C4FFFF0091282B3C12800092
-:1033E00010A000140000A0210224382B14E0011BBF
-:1033F0008FA500208F4D0E14AF4D0E108F420E1C66
-:10340000AF420E18AF440E008F4F000031EE00089F
-:1034100011C0FFFD0000000097540E0800808821B5
-:1034200000009021A794003C8F500E04241400014A
-:10343000AF900034976400103095FFFF8E68000055
-:103440000111F82317E00009AE7F00008F6500141A
-:103450008F8B004434A60040AF6600148F4C0E10D2
-:10346000AD6C00208F430E18AD63002493670008F5
-:1034700014E000D2000000000E00009E24040010A2
-:103480008F8900483C08320000402821312600FF87
-:103490000006FC0003E8502525390001AF990048DB
-:1034A000AC4A0000937800099370000A330400FFCF
-:1034B00000047400320F00FF01CF6825AC4D0004FA
-:1034C0008F820048064000EAACA20008ACA0000CC5
-:1034D0009783003C306B0008156000022628000628
-:1034E00026280002974E0E148F450E1C8F6700048D
-:1034F000936D000231C4FFFF31A200FFAFA20010A4
-:103500008F6C0014AFA800180E00008BAFAC001435
-:10351000240400100E0000C7000000008E7200009E
-:1035200016400005000000008F6400142405FFBF52
-:1035300000859824AF7300148F79000C033538216F
-:10354000AF67000C9375000816A00008000000008B
-:1035500012800006000000008F7F00143C0BEFFF7C
-:103560003568FFFE03E84824AF690014A37400081F
-:103570008FA500200A00024602202021AF470E003E
-:103580000A0000F5000000008F5901780720FFFEB7
-:10359000241F08008F840000AF5F0178974B008ADA
-:1035A000316AFFFF014448232528FFFF31021FFF36
-:1035B0002C4300081460FFF9000000008F8E0048C3
-:1035C0008F8D003800C048210344202125C600010A
-:1035D000240C0F00AF86004800E938232486400001
-:1035E00031CA00FF11AC0005240800019391003E90
-:1035F0003230000700107A4035E80001000AAC00C4
-:103600003C18010002B8A025AC9440008F930048FC
-:1036100030B2003630A40008ACD30004108000970C
-:1036200001123025974E0E0A8F8D00003C0281005A
-:1036300031CCFFFF25AB0008018240253C03100080
-:1036400031651FFF25390006241F000EAF480160B9
-:1036500000C33025A75F015AAF850000A759015864
-:1036600014E0000A8F93003824120F0052720002F7
-:103670002416000134C600408F580E108F94004469
-:10368000AE9800208F550E18AE9500248F450E146D
-:10369000AF4501448F590E1CAF590148A34A01524E
-:1036A0003C0A1000AF460154AF4A017814E0FEDD39
-:1036B0002D2300010076A025128000178FBF004443
-:1036C0008F84003824160F0010960084000000003C
-:1036D0008F45017804A0FFFE24150F001095006EA1
-:1036E000000000008F470E14240202403C1F10000F
-:1036F000AF4701448F440E1CAF440148A340015220
-:10370000A740015AAF400160A7400158AF420154A1
-:10371000AF5F01788FBF00448FB600408FB5003C8B
-:103720008FB400388FB300348FB200308FB1002CCB
-:103730008FB0002803E0000827BD004814C0FED069
-:1037400030B8A0408F420E148F84004400004821FE
-:10375000AC8200208F510E1CAC9100240A00020E96
-:103760002D2300018F910034978A003C3C12800089
-:103770000220A821315800401700FF300000A0218E
-:10378000976900108F9200343139FFFF13320035F2
-:1037900000002021008048211480FEA000A03821D4
-:1037A0008F420E148F840044AC8200208F510E1C77
-:1037B000AC9100240A00020E2D230001936A000937
-:1037C0009378000B315000FF330F00FF020F702180
-:1037D00025C2000A3050FFFF0E00009E020020218B
-:1037E0008F8600483C1F410024CD0001AF8D00486A
-:1037F000936C000930C600FF00064400318300FFCF
-:10380000246B0002010B4825013FC825AC5900007C
-:103810008F67000C97440E1400F22825AC45000475
-:103820008F450E1C8F670004936A00023084FFFFEF
-:10383000315800FFAFB800108F6F0014AFB10018FF
-:103840000E00008BAFAF00140A0001A60200202179
-:10385000AF6000040A00013EA36000020A000246B5
-:1038600000002021000090210A00017024140001B2
-:103870003C1280000A000195ACB2000C8F91000050
-:1038800025240002A744015826300008320F1FFFEC
-:103890000A0001F9AF8F0000AF40014C1120002C4D
-:1038A000000000008F590E10AF5901448F430E18CD
-:1038B000240200403C1F1000AF430148A3400152C6
-:1038C000A740015AAF400160A7400158AF420154E0
-:1038D000AF5F01780A0002278FBF00441120000665
-:1038E0000000000097460E0830CC00401580000212
-:1038F000000000000000000D8F4D017805A0FFFEC4
-:103900000000000097530E103C120500240E20000A
-:10391000326AFFFF0152C025AF58014C8F4F0E1481
-:103920003C021000AF4F01448F500E1CAF500148B5
-:10393000A34001528F840038A740015AAF40016074
-:10394000A7400158AF4E01540A000215AF4201785A
-:103950008F490E14AF4901448F430E1C0A00028E9A
-:10396000240200403C0E20FF27BDFFE03C1A8000EF
-:103970003C0F800835CDFFFDAFBF001CAFB2001873
-:10398000AFB10014AFB00010AF8F0040AF4D0E00CC
-:103990000000000000000000000000000000000027
-:1039A000000000003C0C00FF358BFFFDAF4B0E000C
-:1039B0003C0660048CC95000240AFF7F3C11600063
-:1039C000012A40243507380CACC750008E24043837
-:1039D00024050009AF4500083083FFFF38622F71CE
-:1039E0002450C0B3AF8000480E000068AF800000D4
-:1039F00052000001AE20442C0E0004353C11800022
-:103A00000E000ED9363000708F8A00403C1208003C
-:103A100026523C88020088218E0800008F5F00003B
-:103A20003BF900013338000113000017AF88003064
-:103A3000022048218D2700003C0F08008DEF006C0C
-:103A40003C0C08008D8C006800E8C02301F8282198
-:103A50000000682100B8302B018D582101664021FB
-:103A60003C010800AC25006C3C010800AC28006853
-:103A70008F44000038830001306200011440FFEDE4
-:103A800000E04021AF8700308E0C00003C050800AC
-:103A90008CA5006C3C0408008C84006801883023ED
-:103AA00000A638210000102100E6402B00821821DA
-:103AB0000068F8213C010800AC27006C3C010800BC
-:103AC000AC3F00688F49010025590088AF99004438
-:103AD000AF890038AF4900208E070000AF87003063
-:103AE0008F4D017805A0FFFE000000008E0600004B
-:103AF0003C0B08008D6B00743C0408008C84007043
-:103B000000C728230165F8210000102103E5402BA0
-:103B10000082382100E8C821240908003C0108007F
-:103B2000AC3F00743C010800AC390070AF4901782B
-:103B300093580108A398003E938F003E31EE000198
-:103B400015C000158F830038240E0D00106E00196B
-:103B5000240F0F00106F001D00000000915900009D
-:103B600024180050332900FF113800043C1F400086
-:103B7000AF5F01380A0002E7000000000E00090EE6
-:103B8000000000008F8A00403C1F4000AF5F0138FA
-:103B90000A0002E700000000938D003E31AC0006F1
-:103BA000000C51000E0000CE0152D8210A00034340
-:103BB0008F8A00403C1B0800277B3D080E0000CE8A
-:103BC000000000000A0003438F8A00403C1B0800ED
-:103BD000277B3D280E0000CE000000000A000343B2
-:103BE0008F8A004090AA00018FAB00108CAC0010AF
-:103BF0003C0300FF8D680004AD6C00208CAD001408
-:103C000000E060213462FFFFAD6D00248CA7001836
-:103C10003C09FF000109C024AD6700288CAE001CE0
-:103C20000182C82403197825AD6F0004AD6E002C05
-:103C30008CAD0008314A00FFAD6D001C94A9000254
-:103C40003128FFFFAD68001090A70000A5600002BA
-:103C5000A1600004A167000090A30002306200FF91
-:103C60000002198210600005240500011065000E95
-:103C70000000000003E00008A16A00018CD80028C1
-:103C8000354A0080AD7800188CCF0014AD6F001459
-:103C90008CCE0030AD6E00088CC4002CA16A0001EF
-:103CA00003E00008AD64000C8CCD001CAD6D001865
-:103CB0008CC90014AD6900148CC80024AD680008DC
-:103CC0008CC70020AD67000C8CC200148C8300648C
-:103CD0000043C82B13200007000000008CC2001412
-:103CE000144CFFE400000000354A008003E00008A7
-:103CF000A16A00018C8200640A00039900000000A0
-:103D000090AA000027BDFFF88FA9001CA3AA0000FD
-:103D10008FAE00003C0FFF808FA8001835E2FFFF38
-:103D20008CCD002C01C26024AFAC0000A1200004A7
-:103D300000E06021A7A000028FB800008D270004DA
-:103D40000188182100A0582100C05021006D2826AC
-:103D50003C06FF7F3C0F00FF2CAD000135EEFFFF5E
-:103D600034D9FFFF3C02FF0003193024000D1DC0B1
-:103D7000010EC82400E2C02400C370250319782571
-:103D8000AD2E0000AD2F00048D450024AFAE000025
-:103D9000AD2500088D4D00202405FFFFAD2D000C42
-:103DA000956800023107FFFFAD27001091660018EB
-:103DB00030C200FF000219C2506000018D4500347E
-:103DC000AD2500148D67000827BD0008AD27001C35
-:103DD0008C8B00CCAD2C0028AD20002CAD2B00240A
-:103DE000AD20001803E00008AD20002027BDFFE053
-:103DF000AFB20018AFB10014AFB00010AFBF001CDD
-:103E00009098000000C088213C0D00FF330F007F18
-:103E1000A0CF0000908E000135ACFFFF3C0AFF00F0
-:103E2000A0CE000194A6001EA22000048CAB0014BA
-:103E30008E29000400A08021016C2824012A40243E
-:103E40000080902101052025A6260002AE24000452
-:103E500026050020262400080E0000762406000215
-:103E600092470000260500282624001400071E00A3
-:103E70000003160324060004044000032403FFFF8C
-:103E8000965900023323FFFF0E000076AE23001088
-:103E9000262400248FBF001C8FB200188FB100149D
-:103EA0008FB0001024050003000030210A000080BC
-:103EB00027BD002027BDFFD8AFB1001CAFB0001850
-:103EC000AFBF002090A80000240200018FB0003C8A
-:103ED0003103003F00808821106200148FAA00384F
-:103EE000240B0005506B0016AFAA001000A0202183
-:103EF00000C028210E0003DC02003021922400BC07
-:103F0000308300021060000326060030ACC00000C1
-:103F100024C600048FBF00208FB1001C8FB0001892
-:103F200000C0102103E0000827BD0028014038210F
-:103F30000E00035AAFB000100A0004200000000079
-:103F40000E0003A1AFB000140A000420000000001E
-:103F50003C02000A034218213C04080024843D6C02
-:103F60002405001A000030210A000080AF830054AD
-:103F70003C038000346200708C48000000A058218F
-:103F800000C04821308A00FFAF8800308F4401789C
-:103F90000480FFFE3C0C8000358600708CC500005C
-:103FA0003C0308008C6300743C1808008F180070F4
-:103FB00000A82023006468210000C82101A4782BF8
-:103FC0000319702101CF60213C010800AC2D007461
-:103FD0003C010800AC2C00708F480E14AF4801441F
-:103FE000AF47014CA34A0152A74B01589346010821
-:103FF00030C5000854A0000135291000934B09007A
-:1040000024070050316A00FF11470007000000003C
-:104010008F450E1CAF450148AF4901543C091000C3
-:1040200003E00008AF490178934D010831A800086A
-:104030001100001000000000934F010831EE001045
-:1040400051C00001352900083C04080090843DD08F
-:10405000A34401508F4309A4AF4301488F4209A0F4
-:10406000AF420144AF4901543C09100003E000088D
-:10407000AF4901783C1908008F393D8C333800086E
-:104080005700FFF1352900080A0004730000000002
-:1040900024070040AF470814AF4008108F4209447E
-:1040A0008F4309508F4409548F45095C8F46094C52
-:1040B000AF820064AF830050AF84004CAF85005CDA
-:1040C00003E00008AF8600609346010930C5007F19
-:1040D000000518C0000521400083102103E00008FE
-:1040E000244200883C09080091293D9124A800023F
-:1040F0003C05110000093C0000E8302500C51825EA
-:1041000024820008AC83000003E00008AC800004B7
-:104110009347010B8F4A002C974F09083C18000E5B
-:104120000358482131EEFFFF000E41C0AF48002C7C
-:1041300097430908952C001A0080402124030001B0
-:10414000318BFFFFAC8B00008D2D001C00A058218F
-:1041500000C06021AC8D00048D24002030E70040B9
-:10416000AD04000891220019304400031083004878
-:104170002885000214A00062240600021086005662
-:1041800024190003109900660000000010E0003AB6
-:10419000000000003C07080094E73D8624E200018F
-:1041A000934F0934934709219525002A31EE00FFEA
-:1041B000000E488230ED00FF978700580009360056
-:1041C000000D1C003044FFFF00C310250044C02533
-:1041D00000A778213C19400003197025000F4C00FE
-:1041E000AD090004AD0E0000934D09203C0300060C
-:1041F00025090014000D360000C32025AD04000879
-:104200008F59092C24E5000130A27FFFAD19000C65
-:104210008F580930A782005825020028AD180010D9
-:104220008F4F0938AD0F0014AD2B00048F4E09409D
-:10423000AD2E0008934D09373C05080090A53D9030
-:104240008F4409488F46094031A700FF00EC182130
-:10425000008678230003C7000005CC000319602501
-:1042600031E8FFFC01885825AD2B000CAD20001073
-:1042700003E00008AF4A002C3C0D080095AD3D86D8
-:104280003C0E080095CE3D800A0004C901AE102105
-:104290003C05080094A53D8A3C06080094C63D8074
-:1042A0003C18080097183D7C952E002400A6782124
-:1042B00001F86823000E240025A2FFF200821825D1
-:1042C00024190800AD03000CAD190014AD00001056
-:1042D0000A0004C425080018952600249525002806
-:1042E0000006C40000057C00370E810035ED080093
-:1042F000AD0E000CAD0D00100A0004C4250800141A
-:104300001480FFA200000000952400240004140083
-:1043100034430800AD03000C0A0004C42508001053
-:104320003C03080094633D8A3C05080094A53D8049
-:104330003C06080094C63D7C953900249538002839
-:10434000006520210086782300196C000018740095
-:1043500025E2FFEE01C2202535A3810024190800C3
-:10436000AD03000CAD040010AD190018AD00001431
-:104370000A0004C42508001C03E00008240201F41C
-:1043800027BDFFE8AFB00010AFBF00140E00006003
-:104390000080802124050040AF4508148F83005021
-:1043A0008F84004C8F85005C0070182100641023FE
-:1043B00018400004AF830050AF6300548F66005470
-:1043C000AF86004C1200000C000000008F44007407
-:1043D000936800813409FA002D07000710E00005FA
-:1043E00000891021936C0081240B01F4018B50048F
-:1043F00001441021AF62000C8F4E095C01C5682397
-:1044000019A000048FBF00148F4F095CAF8F005CB0
-:104410008FBF00148FB000100A00006227BD001883
-:104420008F8400648F8300508F82004CAF640044FF
-:10443000AF63005003E00008AF6200543C0380000B
-:10444000346200708C43000027BDFFF8308700FF06
-:1044500030A900FF30C800FFAF8300308F440178DF
-:104460000480FFFE3C028000345900708F38000049
-:10447000A3A700033C0708008CE700748FAC000082
-:104480003C0608008CC60070030378233C0E7FFFB7
-:1044900000EFC82135CDFFFF00005021018D2824F9
-:1044A00000CA1821000847C0032F202B00A81025A0
-:1044B0000064C021AFA200003C010800AC390074C8
-:1044C0003C010800AC380070934F010AA3A0000221
-:1044D0003C0E80FFA3AF00018FAC0000312B007FAA
-:1044E00035CDFFFF018D4824000B5600012A4025E1
-:1044F000240730002406FF803C05100027BD00087B
-:10450000AF48014CAF470154A7400158A3460152A0
-:1045100003E00008AF45017827BDFFE8AFBF0014F6
-:10452000AFB000108F6500743C068000309000FF33
-:1045300000A620250E000060AF64007493630005A0
-:10454000346200080E000062A36200050200202110
-:104550008FBF00148FB00010240500052406000151
-:104560000A00057027BD001827BDFFE03C0380004E
-:10457000AFB00010AFBF0018AFB1001434620070CC
-:104580008C470000309000FF30A800FFAF8700305C
-:104590008F4401780480FFFE3C18800037110070C2
-:1045A0008E2F00003C0D08008DAD00743C0A080001
-:1045B0008D4A007001E7702301AE282100005821C8
-:1045C00000AE302B014B4821012638213C01080068
-:1045D000AC250074000088213C010800AC27007065
-:1045E0001100000F000000008F6200742619FFFF09
-:1045F0003208007F0002FE0233E5007F150000064E
-:10460000332200FF2407FF800207202624A3FFFF98
-:1046100000838025320200FF004080212411100811
-:104620000E000060000000008F49081831250004CA
-:1046300014A0FFFD3218007F001878C000187140E8
-:1046400001CF682125AC0088AF4C0818274A0980A3
-:104650008D4B0020AF4B01448D460024AF460148EE
-:10466000A35001500E000062A74001580220102103
-:104670008FBF00188FB100148FB0001003E0000846
-:1046800027BD002027BDFFE8308400FFAFBF00102A
-:104690000E0005BB30A500FF8F8300508FBF0010B8
-:1046A000344500402404FF903C02100027BD001850
-:1046B000AF43014CA3440152AF45015403E000084D
-:1046C000AF4201789343093E306200081040000D6C
-:1046D0003C0901013528080AAC8800008F470074A6
-:1046E000AC8700043C06080090C63D9030C5001021
-:1046F00050A00006AC8000088F6A0060AC8A0008F9
-:104700002484000C03E00008008010210A00062227
-:104710002484000C27BDFFE8AFBF0014AFB0001029
-:104720009346093F00A050210005288000853823CA
-:1047300030C200FF240300063C09080095293D868D
-:1047400024E8FFD8240500041043003724060002A3
-:104750009750093C3C0F020400063400320EFFFF64
-:1047600001CF6825AC8D0000934C093E318B0020B1
-:104770001160000800000000934309363C02010369
-:10478000345F0300307900FF033FC0252405000893
-:10479000AC98000493430934935909210005F88229
-:1047A000306200FF0002C082332F00FF00186E004D
-:1047B000000F740001AE6025018920253C094000EE
-:1047C00000898025ACF0FFD8934309378F4F094803
-:1047D0008F580940306200FF004AC821033F702112
-:1047E00001F86023000E6F0001A650253185FFFC03
-:1047F000001F58800145482501683821AD09002077
-:104800000E00006024F00028240400040E00006262
-:10481000A364003F020010218FBF00148FB000106E
-:1048200003E0000827BD00180A0006352406001220
-:1048300027BDFFD024090010AFB60028AFB5002473
-:10484000AFB40020AFB10014AFB000103C010800BD
-:10485000A0293D90AFBF002CAFB3001CAFB2001831
-:1048600097480908309400FF3C02000E3107FFFF13
-:10487000000731C0AF46002C974409089344010B50
-:1048800030B500FF03428021308300300000B021AA
-:104890001060012500008821240C00043C01080060
-:1048A000A02C3D90934B093E000B5600000A2E03AE
-:1048B00004A0016000000000AF400048934F010BCE
-:1048C00031EE002011C00006000000009358093EA0
-:1048D00000189E00001396030640018900000000A6
-:1048E0009344010B30830040106000038F9300500D
-:1048F0008F8200502453FFFF9347093E30E60008A3
-:1049000014C0000224120003000090219619002C0C
-:1049100093580934934F0937A7990058330C00FF77
-:1049200031EE00FF024E6821000D5880016C5021CD
-:10493000015140213C010800A4283D869205001841
-:1049400030A900FF010918213C010800A4233D887B
-:104950009211001816200002000000000000000D57
-:104960003C010800A4233D8A3C010800A4203D80AE
-:104970003C010800A4203D7C935F010B3063FFFFE6
-:1049800033F00040120000022464000A2464000B8B
-:104990003091FFFF0E00009E022020219358010B52
-:1049A0003C08080095083D8A0040202100185982E3
-:1049B000316700010E00049A01072821934C010B76
-:1049C0008F4B002C974E09083C0F000E034F4021DF
-:1049D00031CDFFFF000D51C0AF4A002C97430908AD
-:1049E0009505001A004038212404000130A9FFFF7A
-:1049F000AC4900008D06001C00404821318A00406F
-:104A0000AC4600048D020020ACE2000891030019BE
-:104A100030630003106400EC2879000217200118AD
-:104A2000241000021070010C241F0003107F011ECF
-:104A300000000000114000DE000000003C090800FA
-:104A400095293D8625220001935F0934934E092163
-:104A50009504002A33F900FF0019C08231CF00FF0E
-:104A6000978E005800184600000F6C00010D80253D
-:104A70003045FFFF02051025008E50213C03400009
-:104A800000433025000A6400ACEC0004ACE60000F2
-:104A9000935F09203C19000624EC0014001FC60097
-:104AA00003197825ACEF00088F48092C25CD0001AB
-:104AB00031A57FFFACE8000C8F500930A785005866
-:104AC00024E80028ACF000108F4409380100802150
-:104AD000ACE40014AD9300048F530940AD9300087B
-:104AE000934A09373C19080093393D908F43094890
-:104AF0008F460940314200FF0052F82100667023C2
-:104B0000001F7F000019C40001F8282531CDFFFCEB
-:104B100000AD2025AD84000CAD800010AF4B002C03
-:104B2000934B093E317300081260000D3C060101F1
-:104B300034CC080AACEC00288F530074AD13000489
-:104B40003C0B0800916B3D903167001050E0000372
-:104B5000AD0000088F6A0060AD0A00082510000C47
-:104B600012C0003D000000009343093F24160006D8
-:104B700024060004306200FF105600C9240700021A
-:104B80009758093C3C0F0204330DFFFF01AF40254D
-:104B9000AE0800009345093E30A4002010800008B4
-:104BA00000000000935309363C0B0103357F0300DE
-:104BB000327900FF033F7025AE0E00042406000882
-:104BC000934F093493480921312AFFFF31ED00FF4B
-:104BD000000D1082310300FF0002B60000032C001C
-:104BE00002C56025018A9825001220803C094000FA
-:104BF0000204502302695825AD4BFFD8935F093753
-:104C00008F4F09488F58094033F900FF0332702154
-:104C10000006B08201D668210007440001F828236D
-:104C2000000D1F000068302530A2FFFC2547FFD88B
-:104C300000C260250016808002074821ACEC0020ED
-:104C4000253000280E00006024120004A372003FEB
-:104C50000E000062000000009347010B30F200409C
-:104C6000124000053C1900FF8E180000372EFFFF90
-:104C7000030E3024AE0600000E0000C702202021E3
-:104C80003C10080092103D90321100031220000FDA
-:104C900002A028218F89005025330001AF930050D6
-:104CA000AF7300508F6B00540173F8231BE00002B8
-:104CB000026020218F640054AF6400548F4C007454
-:104CC000258401F4AF64000C02A028210280202179
-:104CD000A76000680E0005BB3C1410008F850050D3
-:104CE00034550006AF45014C8F8A00488FBF002C19
-:104CF0008FB3001C25560001AF9600488FB20018F4
-:104D0000A34A01528FB60028AF5501548FB1001449
-:104D1000AF5401788FB500248FB400208FB00010FD
-:104D200003E0000827BD00309358093E00189E009C
-:104D3000001396030642003624110002934409230F
-:104D4000308300021060FEDD8F8600608F8200508D
-:104D500014C2FEDA000000000E0000600000000037
-:104D60009369003F24070016312800FF1107000C4B
-:104D7000240500083C0C0800918C3D90358B000107
-:104D80003C010800A02B3D90936A003F314300FF97
-:104D900010650065240D000A106D005E2402000CF1
-:104DA0000E000062000000000A00069000000000F3
-:104DB0003C09080095293D863C0A0800954A3D803B
-:104DC0000A0006F3012A10213C09080095293D8AB2
-:104DD0003C04080094843D803C06080094C63D7C59
-:104DE00095030024012410210046F8230003CC0081
-:104DF00027F0FFF20330C025240F0800ACF8000CA8
-:104E0000ACEF0014ACE000100A0006EE24E7001836
-:104E10003C010800A0313D90935F093E241600013B
-:104E200033F900201720FEA5241100080A0006907F
-:104E3000241100048F6E00848F4D094011A0FE9E46
-:104E4000AF8E0050240F00143C010800A02F3D90AD
-:104E50000A00068F00000000950E0024950D002822
-:104E6000000E6400000D2C003589810034A6080076
-:104E7000ACE9000CACE600100A0006EE24E70014D2
-:104E80001460FEEC000000009502002400021C00EB
-:104E900034640800ACE4000C0A0006EE24E70010BD
-:104EA0000A000741240700123C02080094423D8A90
-:104EB0003C06080094C63D803C03080094633D7C9A
-:104EC00095100024951900280046F82103E3C0231B
-:104ED00000106C0000197400270FFFEE01CF282589
-:104EE00035AC8100ACEC000CACE5001024070800E8
-:104EF000AD2700182527001C0A0006EEAD2000147F
-:104F00008F7F004CAF7F00548F7900540A000699C0
-:104F1000AF790050A362003F0E0000620000000065
-:104F20000A00069000000000240200140A0008276E
-:104F3000A362003F27BDFFE8308400FFAFBF001031
-:104F40000E0005BB30A500FF9378007E9379007FAB
-:104F5000936E00809368007A332F00FF001866007C
-:104F6000000F6C0031CB00FF018D4825000B520073
-:104F70008FBF0010012A3825310600FF344470002D
-:104F800000E628252402FF813C03100027BD0018FD
-:104F9000AF45014CAF440154A342015203E0000865
-:104FA000AF43017827BDFFD8AFB20018AFB10014EE
-:104FB000AFB00010AFBF0020AFB3001C9342010997
-:104FC000308600FF30B000FF000618C23204000235
-:104FD0003071000114800005305200FF9367000516
-:104FE00030E5000810A0000D30C80010024020215C
-:104FF0000E0005A702202821240400018FBF0020F5
-:105000008FB3001C8FB200188FB100148FB0001046
-:105010000080102103E0000827BD002815000032A1
-:105020000000000093430109000028213062007F46
-:10503000000220C00002F94003E49821267900888C
-:10504000033B98218E7800248E6F0008130F0046D2
-:10505000000000008F640084241800020004FD8218
-:1050600033F900031338007C0000000093660083CE
-:10507000934A0109514600043205007C10A00060EB
-:10508000000000003205007C14A0005302402021E3
-:1050900016200006320400018E7F00248F5901047F
-:1050A00017F9FFD600002021320400011080000A09
-:1050B000024020218F4209408F9300641053000664
-:1050C000000000000E00066D022028218F430940D9
-:1050D000AF630044024020210E0006020220282176
-:1050E0000A000860240400013C0908008D290064BE
-:1050F000252600013C010800AC26006416000012C1
-:10510000000000008F6D00843C0E00C001AE6024E2
-:1051100015800005024020210E00082E02202821C3
-:105120000A00086024040001240500040E00057034
-:1051300024060001024020210E00082E0220282112
-:105140000A000860240400010E000041240400014C
-:10515000936B007D020B50250E000062A36A007D58
-:105160000A0008A38F6D00848F6600748F480104C5
-:105170008E67002400064E021507FFB63126007F19
-:10518000936B008326440001308A007F1146004360
-:10519000316300FF5464FFB08F6400842645000132
-:1051A00030B1007F30A200FF122600042405000168
-:1051B000004090210A00087624110001240FFF808E
-:1051C000024F702401CF9026324200FF0040902110
-:1051D0000A000876241100010E00066D0220282125
-:1051E000321800301300FFAA321000820240202142
-:1051F0000E0005A7022028210A00086024040001EF
-:105200008F6E00743C0F80002405000301CF9025B1
-:10521000AF72007493710083240600010E000570C4
-:10522000322400FF0E00004124040001936D007D34
-:10523000020D60250E000062A36C007D3C0B08008F
-:105240008D6B0054257000013C010800AC30005407
-:105250000A000860240400018F6800743C09800083
-:105260002405000401093825AF67007493630083A7
-:10527000240600010E000570306400FF0E0000419E
-:10528000240400019362007D020298250E00006252
-:10529000A373007D0A00086024040001324D0080E1
-:1052A00039AC0080546CFF6C8F6400840A0008C91C
-:1052B0002645000127BDFFC83C0A0008AFBF0030EB
-:1052C000AFB5002CAFB40028AFB30024AFB20020BC
-:1052D000AFB1001CAFB00018034AD8212409004028
-:1052E000AF490814AF4008108F4209448F4309505A
-:1052F0008F4609548F47095C8F48094C9344010835
-:105300009345010BAF820064308400FF30A500FF9D
-:10531000AF830050AF86004CAF87005C0E00084A98
-:10532000AF8800601440017D8FBF0030A760006827
-:10533000934D0900240B00503C15080026B53D484C
-:1053400031AC00FF3C12080026523D58118B00037F
-:10535000000000000000A8210000902193510109E5
-:105360008F9F005024040010322E007F000E68C072
-:10537000000E6140018D282124B40088AF54081824
-:105380008F4901048F4A09A43C0B000E034BC02136
-:10539000012A10233C010800AC223D6C8F430958C0
-:1053A0003C010800A0243D9097470908007F302366
-:1053B0003C010800AC263D7030E8FFFF0008C9C082
-:1053C0003C010800AC3F3D94AF59002C97420908BE
-:1053D0009710002C8EB10000930F001803749821D1
-:1053E000A7900058AF9300440220F80931F000FF65
-:1053F000304E000215C001B2304F000111E0014FE4
-:10540000000000009343093E3066000814C000020B
-:10541000241400030000A0218F5809A424130001C4
-:105420003C010800AC383D98934F0934935109373B
-:1054300031EC00FF322E00FF028E6821000D288023
-:1054400000AC5021015058213C010800A42B3D889C
-:105450003C010800A42A3D8693490934312200FF0B
-:1054600002022021249000103C010800A4303D8459
-:10547000240700068F9F00503C010800AC273D8C9C
-:105480008F88005C8F59095800008021011F282354
-:1054900004A00149033F20230480014700A4302BCE
-:1054A00010C00149000000003C010800AC253D701F
-:1054B0008E4200000040F809000000003043000266
-:1054C000146000F80040882130440001548000102E
-:1054D0008E4200043C0908008D293D743C0AC0003E
-:1054E000012A8025AF500E008F45000030AB000828
-:1054F0001160FFFD00000000974D0E082410000110
-:10550000A78D003C8F4C0E04AF8C00348E420004FB
-:105510000040F8090000000002228825322E000217
-:1055200015C00180000000003C09080095293D7C61
-:105530003C06080094C63D883C0A0800954A3D7E1A
-:105540003C1908008F393D74012660213C18080081
-:105550008F183D983C03080094633D92018A2021F6
-:105560008F4E09400329F821248F000203E32821EC
-:10557000031968213C010800A42C3D8AAF8E006409
-:105580003C010800AC2D3D983C010800A4253D805D
-:105590000E00009E31E4FFFF8F870048004020216D
-:1055A0003C010800A0273D918E42000824E800013C
-:1055B000AF8800480040F809000000009344010B48
-:1055C0008F4C002C974A09083C0B000E034B4021DE
-:1055D0003149FFFF000919C08F8B0050AF43002CE9
-:1055E000974309089506001A00403821308A004088
-:1055F00030DFFFFFAC5F00008D19001C0040482128
-:10560000AC5900048D180020AC580008910F001907
-:1056100031E30003107300F0000000002862000274
-:105620001440010924050002106500FD240D00034B
-:10563000106D010D00000000114000D900000000B5
-:105640003C0A0800954A3D8625420001934D0934E5
-:1056500093580921950E002A31A300FF00032082F0
-:10566000331F00FF9798005800047E00001FCC00F5
-:1056700001F940253049FFFF0109102501D83021EB
-:105680003C0540000045502500066C00ACED0004D0
-:10569000ACEA0000934309203C04000624ED00140A
-:1056A0000003FE0003E4C825ACF900088F49092C6B
-:1056B000270F000131EE7FFFACE9000C8F48093065
-:1056C000A78E005824E90028ACE800108F4509385F
-:1056D00001204021ACE50014ADAB00048F4209402D
-:1056E000ADA20008934B09373C1F080093FF3D9083
-:1056F0008F4309488F4A0940316600FF00D42021BA
-:10570000006A78230004C700001FCC000319282575
-:1057100031EEFFFC00AE1025ADA2000CADA00010D4
-:10572000AF4C002C934C093E318B00085160000FA8
-:105730008E58000C3C06010134CA080AACEA002865
-:105740008F4B0074AD2B00043C0C0800918C3D90F5
-:105750003187001050E00003AD2000088F62006028
-:10576000AD2200082528000C8E58000C0300F80913
-:10577000010020213C19080097393D8A3C1F080090
-:1057800097FF3D7E033F782125E900020E0000C708
-:105790003124FFFF3C0E08008DCE3D6C3C08080014
-:1057A0008D083D7401C828233C010800AC253D6CE0
-:1057B00014A00006000000003C0308008C633D8C30
-:1057C000346400403C010800AC243D8C12000070A1
-:1057D0008F8C00448F470E108F900044AE0700203E
-:1057E0008F4D0E18AE0D00243C10080096103D8021
-:1057F0000E0000600000000024020040AF420814C8
-:105800008F8600508F8A004C00D01821006A5823E0
-:1058100019600004AF830050AF6300548F650054DB
-:10582000AF85004C1200000C000000008F44007493
-:10583000936800813409FA002D0E000711C000059D
-:1058400000891821937F0081241901F403F9780459
-:1058500001E41821AF63000C8F44095C8F83005C66
-:105860000083C0231B000003000000008F50095C70
-:10587000AF90005C0E000062000000008F8C0050B2
-:105880008E4700103C010800AC2C3D9400E0F80964
-:10589000000000003C0D08008DAD3D6C55A0FEF5EC
-:1058A000240700068F450024975909088F8B006450
-:1058B0008F9400503C0F001F978200588F86005431
-:1058C0008F93004C3328FFFF35E9FF8000A9502457
-:1058D000000871C032320100AF4E0024A4C2002C77
-:1058E000AF4A0024AF6B0044AF740050AF73005454
-:1058F0001640008032380010570000868EA4000445
-:10590000322300405460001B8EB100088EB0000CA2
-:105910000200F809000000008FBF00308FB5002C96
-:105920008FB400288FB300248FB200208FB1001CE9
-:105930008FB0001803E0000827BD00389347010925
-:105940008F8800380007FE0003E8C825AF590080A3
-:105950008F5809A08F5309A4AFB80010AF580E1488
-:105960008FB40010AF540E10AF530E1C0A00096222
-:10597000AF530E180220F809000000008EB0000C92
-:105980000200F809000000000A000AA88FBF0030DA
-:10599000A5800020A59300220A000A5BAD93002495
-:1059A0003C09080095293D863C06080094C63D80C8
-:1059B0000A0009F4012610213C010800AC203D70CA
-:1059C0000A00098E8E4200003C010800AC243D70A4
-:1059D0000A00098E8E4200003C03080094633D8A51
-:1059E0003C04080094843D803C1F080097FF3D7CE8
-:1059F000951800240064C821033F782300186C0028
-:105A000025EEFFF201AE2825AC45000C240208006B
-:105A1000ACE20014ACE000100A0009EF24E7001823
-:105A200095060024950900280006240000091C00A2
-:105A3000349F810034790800ACFF000CACF90010F1
-:105A40000A0009EF24E700141460FEFB00000000C8
-:105A50009518002400187C0035EE0800ACEE000C10
-:105A60000A0009EF24E700103C07080094E73D8096
-:105A70003C04080094843D8A3C03080094633D7C08
-:105A800095190024951800280087F82103E378234E
-:105A90002407080000192C0000186C0025EEFFEE0A
-:105AA00001AE302534A28100AD2700182527001C47
-:105AB000AD22000CAD2600100A0009EFAD20001445
-:105AC00093520109000028210E000602324400FF13
-:105AD0008FBF00308FB5002C8FB400288FB3002407
-:105AE0008FB200208FB1001C8FB0001803E00008B7
-:105AF00027BD0038935F010933E400FF0E00066DF7
-:105B000000002821323800105300FF7E322300406D
-:105B10008EA400040080F809000000000A000AA218
-:105B2000322300401200FF5F000000008F540E146B
-:105B30008F920044AE5400208F530E1C0A000A8A34
-:105B4000AE5300248F82001C008040213C040100E1
-:105B50009047008530E3002010600009000000003D
-:105B60003C0708008CE73D948F83001800E3202356
-:105B7000048000089389000414E30003010020213D
-:105B800003E00008008010213C04010003E000084D
-:105B9000008010211120000B006738238F8C00201B
-:105BA00024090034918B00BC316A0002514000018D
-:105BB0002409003000E9682B15A0FFF10100202125
-:105BC00000E938232419FFFC00B9C02400F9782427
-:105BD00000F8702B15C0FFEA01E8202130C2000355
-:105BE0000002182314C000123069000300003021A5
-:105BF00000A9702101C6682100ED602B1180FFE033
-:105C00003C0401002D2F00010006482B010538211E
-:105C100001E9302414C0FFDA24E4FFFC2419FFFC5E
-:105C200000B9C0240308202103E0000800801021EF
-:105C30008F8B002024060004916A00BC31440004CC
-:105C40001480FFEC00A970210A000B5E00003021D7
-:105C500027BDFFE8AFBF00108F460100934A01093E
-:105C60003C1F08008FFF00902407FF80314F00FF8A
-:105C700031E8007F0008614003E6C821032CC02101
-:105C800027090120012770243C010800A02F3DD0E6
-:105C9000AF4E080C3C0D08008DAD00903C04008018
-:105CA0003482000301A65821016C182124650120CB
-:105CB00030AA007801424025AF48081C3C1F08006C
-:105CC0008FFF00908F88004003E6C0213319000742
-:105CD00003074824033A7821AF49002825E909C081
-:105CE000952E00023C0D08008DAD008C3C0A08008A
-:105CF0008D4A009031CC3FFF01A61821000C59803D
-:105D0000006B282100A72024AF44002C952200021C
-:105D10003C1F08008FFF008C9107008530593FFF22
-:105D200003E678210019C1800146702101F868213D
-:105D300031CC007F31AB007F019A2821017A5021BC
-:105D40003C03000C3C04000E00A328210144102158
-:105D500030E6002027470980AF82002CAF88001C66
-:105D6000AF890024AF85002010C00006AF8700284F
-:105D70008D0200508CA4010C0044302318C0007721
-:105D800000000000910C0085240DFFDF018D3824F8
-:105D9000A10700858F8B001C8F8900248F87002826
-:105DA0008D65004CAF850018912F000D31EE00205D
-:105DB00011C000170000000024090001A38900049D
-:105DC000AF80000C8CE400248F85000C240A0008AE
-:105DD000AF800008AF8000103C010800A42A3D7E7F
-:105DE0003C010800A4203D920E000B32000030213F
-:105DF0008F8500248FBF0010AF82001490A8000D83
-:105E000027BD00180008394203E0000830E2000115
-:105E1000913F00022418000133F900FF001921828C
-:105E200010980039240800021088005B8F86002C2F
-:105E30008CE5002414A0001B8F9F002091220000FD
-:105E4000240A00053046003F10CA00472404000120
-:105E50008F860008A3840004AF860010AF86000C74
-:105E60008CE400248F85000C240A00083C01080003
-:105E7000A42A3D7E3C010800A4203D920E000B3276
-:105E8000000000008F8500248FBF0010AF82001437
-:105E900090A8000D27BD00180008394203E0000853
-:105EA00030E200018CF800088CF900248FEE00C469
-:105EB000A38000048CE40024AF8E000C8F85000CBE
-:105EC0008F86000803197823240A0008AF8F00107A
-:105ED0003C010800A42A3D7E3C010800A4203D921C
-:105EE0000E000B32000000008F8500248FBF0010D1
-:105EF000AF82001490A8000D27BD00180008394299
-:105F000003E0000830E20001912300003062003F0E
-:105F1000104400278F8500208CE400241480002189
-:105F2000000000008D2E00183C187FFF8F85002098
-:105F3000370FFFFF01CF1824AF8300088F9F0008A1
-:105F40008CA8008403E8C82B1720000203E020215E
-:105F50008CA400840A000BEDAF8400088CA3010C14
-:105F60000A000BCBAF8300188D2C00188F86000819
-:105F70003C0D7FFF8F89002035A3FFFF018358244C
-:105F800024040001AF8B0010AD2000CCA3840004DA
-:105F90000A000BF9AF86000C8CCA00140A000BED46
-:105FA000AF8A00088CA300C80A000C30AF83000839
-:105FB0008F84002C8CAC00648C8D0014018D582BC8
-:105FC00011600004000000008CA200640A000C3084
-:105FD000AF8200088C8200140A000C30AF820008E7
-:105FE0008F85000C27BDFFE0AFBF0018AFB10014D4
-:105FF00014A00007AFB000108F8600242402000513
-:1060000090C400003083003F106200B68F840020EF
-:106010008F91000800A080218F8C00283C0508008B
-:106020008CA53D708D8B000431663FFF00C5502B61
-:106030005540000100C02821938D000411A0007379
-:1060400000B0F82B8F98002024040034930F00BC7C
-:1060500031EE000251C000012404003000A4C82B1E
-:10606000172000D10000000000A4282300B0F82B66
-:106070003C010800A4243D7C17E0006802002021B8
-:106080003C0308008C633D6C0083102B54400001DE
-:10609000008018218F8800243C010800AC233D7447
-:1060A000000048219104000D308300205060000161
-:1060B0008F490E188F8300140123382B10E00059EC
-:1060C000000000003C0408008C843D7400895821C5
-:1060D000006B502B114000560090602B006930235C
-:1060E00000C020213C010800AC263D7412000003D2
-:1060F000241FFFFC1090008A32270003009FC82451
-:106100003C010800AC393D743C010800A4203D92DC
-:106110008F84000C120400078F830020AF910008C9
-:10612000020020218C7100CCAF90000C26300001C1
-:10613000AC7000CC3C0208008C423D748F8A001089
-:10614000240700180082202301422823AF84000C7A
-:1061500010800002AF850010240700108F86001CFD
-:106160003C010800A0273D902407004090CC00850A
-:10617000318B00C0116700408F8D001414A00015F2
-:1061800000002021934A01098F420974314500FF24
-:106190000002260224A300013090007F3071007FAE
-:1061A0001230007A2407FF80A0C300833C09080056
-:1061B0008D293D8C8F880024240D0002352C000889
-:1061C0003C010800A02D3DD13C010800AC2C3D8CC9
-:1061D00024040010910E000D31C6002010C00005EF
-:1061E00000801821240800013C010800AC283D74FF
-:1061F000348300018FBF00188FB100148FB00010DE
-:106200000060102103E0000827BD00203C010800C9
-:10621000A4203D7C13E0FF9A020020210A000C819B
-:1062200000A020213C0408008C843D740090602B69
-:106230001180FFAE000000003C0F080095EF3D7C90
-:1062400001E4702101C6682B11A000072C82000414
-:106250003C1F60008FF954043338003F1700FFE5FE
-:10626000240300422C8200041040FFA024030042BB
-:106270000A000CDF8FBF0018152DFFC000000000C2
-:106280008CDF00743C0380002405FF8003E3C825F5
-:10629000ACD9007490D80085240E000424040010AA
-:1062A000330F003F01E54025A0C800858F880024FA
-:1062B0003C010800A02E3DD1240300019106000DF1
-:1062C00030C9002015200003000000003C03080036
-:1062D0008C633D743C010800AC233D6C0A000CD675
-:1062E000000000008F8700108C88008400E8282BB5
-:1062F00014A0000200E088218C9100842409000190
-:10630000A38900048F440E18022028210E000B32AE
-:1063100002203021022080210A000C67AF82001485
-:1063200000071823306600033C010800A4263D92B4
-:10633000122000058F8C0020918B00BC316A000474
-:106340001540001524CD00043C0F080095EF3D9248
-:1063500001E4702100AE302B50C0FF6E8F84000C22
-:106360002C85000514A0FFA32403004230980003ED
-:1063700017000002009818232483FFFC3C0108004A
-:10638000AC233D740A000CA30000000000A75824B1
-:106390000A000CCB016718263C010800A42D3D9291
-:1063A0000A000D33000000003C010800AC203D74E1
-:1063B0000A000CDE240300428F83001014600007E3
-:1063C000000010218F88002424050005910600009C
-:1063D00030C400FF108500030000000003E0000847
-:1063E00000000000910A0018314900FF000939C27D
-:1063F00014E0FFFA8F85001C3C04080094843D7C67
-:106400003C0308008C633D943C1908008F393D74AF
-:106410003C0F080095EF3D920064C0218CAD005404
-:106420000319702101CF6021018D58231960001DCF
-:1064300000000000910E001C8F8C002C974B0E105A
-:1064400031CD00FF8D850004016D30238D88000063
-:1064500030CEFFFF000E510000AAC82100003821F5
-:1064600001072021032A182B0083C021AD990004C5
-:10647000AD980000918F000A01CF6821A18D000A1C
-:106480008F88002C974B0E12A50B0008950A003838
-:1064900025490001A50900389107000D34E60008E0
-:1064A000A106000D03E000080000000027BDFFE08A
-:1064B000938700048F8F00248FAD00143C0E7FFF64
-:1064C0008F89000C35C8FFFFAFBF001CAFB00018AC
-:1064D00001A8182491EA000D000717C03C1FBFFF58
-:1064E000006258252D2E00018F90001837F9FFFF0C
-:1064F0003C1808008F183D943C0F080095EF3D8A2A
-:1065000001796824000E47803C07EFFF3C05F0FF4F
-:1065100001A818253149002034E2FFFF34ACFFFF09
-:106520000310582327A500102406000225EA0002C4
-:106530000062182400808021152000020000402104
-:106540008F480E1CA7AA0012056000372407000020
-:1065500030FF00FF001FCF008F8B001C0079382513
-:10656000AFA70014916F00853C08080091083D9189
-:106570003C18DFFF31EE00C0370AFFFF000E182B7A
-:106580003C1F080097FF3D8400EA6824A3A800117F
-:106590000003174001A248258FB90010AFA90014CD
-:1065A0003C0A0800914A3D93A7BF00168FA800142B
-:1065B000032CC0243C0B01003C0F0FFF030B1825DC
-:1065C0003147000335EEFFFF010C68240007160079
-:1065D000006EF8243C09700001A2C82503E9582583
-:1065E000AFB90014AFAB00100E000076A3A00015E9
-:1065F0008F8C0024260200089186000D30C40020F4
-:10660000108000068FBF001C3C05080094A53D804B
-:1066100024B0FFFF3C010800A4303D808FB000187B
-:1066200003E0000827BD00208F9800140118502BAC
-:106630005540FFC7240700010A000DB630FF00FFD8
-:106640009382000427BDFFE0AFBF00181040000F89
-:10665000008050218F880024240B00058F890008BA
-:10666000910700008F8400200100282130E3003FC3
-:106670008F86002C106B000800003821AFA9001095
-:106680000E00040EAFAA0014A38000048FBF0018F0
-:1066900003E0000827BD00208D1900183C0F0800FA
-:1066A0008DEF3D748F9800103C027FFF8D08001421
-:1066B000345FFFFF033F682401F8702101AE6023BF
-:1066C00001883821AFA900100E00040EAFAA0014F3
-:1066D0000A000E04A38000048F8700243C050800F4
-:1066E00094A53D923C0208008C423D8C90E6000D42
-:1066F0000005240030C300201060002C0044402519
-:106700008F85001C00006021240B000190A30085F0
-:1067100000004821240A00013C0F800035EE007083
-:106720008DC70000AF8700308F5801780700FFFE4B
-:106730003C038000347900708F3800003C0508006D
-:106740008CA500743C0D08008DAD00700307782304
-:1067500000AF38210000102100EF302B01A22021D2
-:10676000008618213C010800AC2700743C01080099
-:10677000AC230070AF4B01483C1908008F393D94A1
-:10678000A7490144A74A0146AF59014C3C0B0800F8
-:10679000916B3D91A34B0152AF4801543C0810004E
-:1067A000A74C015803E00008AF4801788F4B0E1C3E
-:1067B0003C0A08008D4A3D7497490E16974D0E14F9
-:1067C00001456021312AFFFF0A000E2731A9FFFF92
-:1067D0008F8300249064000D308200201040002937
-:1067E000000000000000482100005021000040216E
-:1067F0003C07800034EB00708D670000AF870030ED
-:106800008F4C01780580FFFE3C0D800035AC007098
-:106810008D8B00003C0508008CA500743C0408002A
-:106820008C8400700167302300A6782100001021BD
-:1068300001E6C82B0082C021031970213C01080029
-:10684000AC2F00743C010800AC2E0070AF49014829
-:106850003C0D08008DAD3D94A7480144240900403B
-:10686000A74A01463C081000240AFF91AF4D014C95
-:10687000A34A0152AF490154A740015803E0000860
-:10688000AF4801788F490E1897460E1297450E10A3
-:1068900030CAFFFF0A000E5D30A8FFFF8F8300247F
-:1068A00027BDFFF89064000D308200201040003AB0
-:1068B00000000000240B000100004821240A000110
-:1068C0003C088000350700708CE30000AF83003087
-:1068D0008F4C01780580FFFE3C0E80003C040800D0
-:1068E00090843DD035C700708CEC00003C0508005A
-:1068F0008CA50074A3A400033C1908008F39007014
-:106900008FAD00000183302300A638210000102144
-:106910000322782100E6C02B01F8602101AE40255A
-:10692000AFA800003C010800AC2700743C0108003F
-:10693000AC2C00709346010A3C04080090843DD1C1
-:10694000A3A00002A3A600018FA300003C0580FFC6
-:106950003099007F34A2FFFF006278240019C6003E
-:1069600001F87025240D3000AF4E014C27BD000802
-:10697000AF4D0154A7400158AF4B0148A74901440E
-:10698000A74A01463C091000240AFF80A34A01528D
-:1069900003E00008AF4901788F4B0E1897460E129E
-:1069A00097450E1030CAFFFF0A000E9130A9FFFF75
-:1069B0008F85001C2402008090A40085308300C0D5
-:1069C000106200058F8600208F8800088F87000CDA
-:1069D000ACC800C8ACC700C403E000080000000059
-:1069E0003C0A0800254A39543C09080025293A2068
-:1069F0003C08080025082DD43C07080024E73B3458
-:106A00003C06080024C637C43C05080024A5353CD4
-:106A10003C040800248431643C0308002463385C8F
-:106A20003C020800244236303C010800AC2A3D50AC
-:106A30003C010800AC293D4C3C010800AC283D4815
-:106A40003C010800AC273D543C010800AC263D64E5
-:106A50003C010800AC253D5C3C010800AC243D58DD
-:106A60003C010800AC233D683C010800AC223D60BD
-:086A700003E000080000000033
-:00000001FF
-/*
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
diff --git a/firmware/bnx2/bnx2-mips-09-6.2.1a.fw.ihex b/firmware/bnx2/bnx2-mips-09-6.2.1a.fw.ihex
deleted file mode 100644
index 05e710248d2c..000000000000
--- a/firmware/bnx2/bnx2-mips-09-6.2.1a.fw.ihex
+++ /dev/null
@@ -1,6512 +0,0 @@
-:10000000080001180800000000005594000000C816
-:1000100000000000000000000000000008005594EF
-:10002000000000380000565C080000A00800000036
-:100030000000574400005694080059200000008436
-:100040000000ADD808005744000001C00000AE5CBD
-:100050000800321008000000000092340000B01CBC
-:1000600000000000000000000000000008009234C2
-:100070000000033C00014250080004900800040006
-:10008000000012FC0001458C000000000000000090
-:1000900000000000080016FC000000040001588861
-:1000A000080000A80800000000003D000001588C76
-:1000B00000000000000000000000000008003D00FB
-:0800C000000000300001958CE6
-:0800C8000A00004600000000E0
-:1000D000000000000000000D636F6D362E322E31DF
-:1000E00061000000060201020000000000000003A1
-:1000F000000000C800000032000000030000000003
-:1001000000000000000000000000000000000000EF
-:1001100000000010000001360000EA600000000549
-:1001200000000000000000000000000000000008C7
-:1001300000000000000000000000000000000000BF
-:1001400000000000000000000000000000000000AF
-:10015000000000000000000000000000000000009F
-:10016000000000020000000000000000000000008D
-:10017000000000000000000000000000000000007F
-:10018000000000000000000000000010000000005F
-:10019000000000000000000000000000000000005F
-:1001A000000000000000000000000000000000004F
-:1001B000000000000000000000000000000000003F
-:1001C000000000000000000000000000000000002F
-:1001D000000000000000000000000000000000001F
-:1001E0000000000010000003000000000000000DEF
-:1001F0000000000D3C020800244256083C030800A1
-:1002000024635754AC4000000043202B1480FFFDB2
-:10021000244200043C1D080037BD9FFC03A0F021D0
-:100220003C100800261001183C1C0800279C5608AA
-:100230000E000256000000000000000D27BDFFB4B4
-:10024000AFA10000AFA20004AFA30008AFA4000C50
-:10025000AFA50010AFA60014AFA70018AFA8001CF0
-:10026000AFA90020AFAA0024AFAB0028AFAC002C90
-:10027000AFAD0030AFAE0034AFAF0038AFB8003C28
-:10028000AFB90040AFBC0044AFBF00480E001544FA
-:10029000000000008FBF00488FBC00448FB90040B1
-:1002A0008FB8003C8FAF00388FAE00348FAD003078
-:1002B0008FAC002C8FAB00288FAA00248FA90020C0
-:1002C0008FA8001C8FA700188FA600148FA5001000
-:1002D0008FA4000C8FA300088FA200048FA1000040
-:1002E00027BD004C3C1B60108F7A5030377B502864
-:1002F00003400008AF7A00008F82002427BDFFE092
-:10030000AFB00010AFBF0018AFB100148C42000CAA
-:100310003C1080008E110100104000348FBF001887
-:100320000E000D84000000008F85002024047FFF54
-:100330000091202BACB100008E030104960201084D
-:1003400000031C003042FFFF00621825ACA300042C
-:100350009202010A96030114304200FF3063FFFF4E
-:100360000002140000431025ACA200089603010C03
-:100370009602010E00031C003042FFFF00621825A8
-:10038000ACA3000C960301109602011200031C009E
-:100390003042FFFF00621825ACA300108E02011846
-:1003A000ACA200148E02011CACA20018148000083C
-:1003B0008F820024978200003C0420050044182509
-:1003C00024420001ACA3001C0A0000C6A782000062
-:1003D0003C0340189442001E00431025ACA2001CB0
-:1003E0000E000DB8240400018FBF00188FB1001457
-:1003F0008FB000100000102103E0000827BD00208E
-:100400003C0780008CE202B834E50100044100089A
-:10041000240300013C0208008C42006024420001D9
-:100420003C010800AC22006003E0000800601021DD
-:100430003C0208008C42005C8CA4002094A30016AF
-:100440008CA6000494A5000E24420001ACE40280B6
-:100450002463FFFC3C010800AC22005C3C0210005D
-:10046000A4E30284A4E5028600001821ACE6028819
-:10047000ACE202B803E000080060102127BDFFE0F5
-:100480003C028000AFB0001034420100AFBF001C3E
-:10049000AFB20018AFB100148C43000094450008BF
-:1004A0002462FE002C42038110400003000381C23D
-:1004B0000A00010226100004240201001462000553
-:1004C0003C1180003C02800890420004305000FF44
-:1004D0003C11800036320100964300143202000FB6
-:1004E00000021500004310253C0308008C63004403
-:1004F00030A40004AE220080246300013C01080007
-:10050000AC2300441080000730A200028FBF001C03
-:100510008FB200188FB100148FB000100A0000CE07
-:1005200027BD00201040002D0000182130A20080BF
-:1005300010400005362200708E44001C0E000C672F
-:10054000240500A0362200708C4400008F82000C2D
-:10055000008210232C43012C10600004AF82001095
-:10056000240300010A000145AF84000C8E42000400
-:100570003C036020AF84000CAC6200143C02080015
-:100580008C42005850400015000018218C62000475
-:10059000240301FE304203FF144300100000182121
-:1005A0002E020004104000032E0200080A00014041
-:1005B0000000802114400003000000000A000140F8
-:1005C0002610FFF90000000D2402000202021004B0
-:1005D0003C036000AC626914000018218FBF001C4E
-:1005E0008FB200188FB100148FB00010006010217E
-:1005F00003E0000827BD00203C0480008C8301003C
-:1006000024020100506200033C0280080000000D3B
-:100610003C02800890430004000010213063000F6A
-:1006200000031D0003E00008AC8300800004188074
-:100630002782FF9C00621821000410C00044102390
-:100640008C640000000210C03C030800246356E4E0
-:10065000004310213C038000AC64009003E00008DC
-:10066000AF8200243C0208008C42011410400019A3
-:100670003084400030A2007F000231C03C02020002
-:100680001080001400A218253C026020AC43001426
-:100690003C0408008C8456B83C0308008C630110AD
-:1006A0003C02800024050900AC4500200086202182
-:1006B000246300013C028008AC4400643C01080053
-:1006C000AC2301103C010800AC2456B803E000083C
-:1006D000000000003C02602003E00008AC4500146C
-:1006E00003E000080000102103E0000800001021D2
-:1006F00030A2000810400008240201003C0208005B
-:100700008C42010C244200013C010800AC22010C87
-:1007100003E0000800000000148200080000000050
-:100720003C0208008C4200FC244200013C0108000D
-:10073000AC2200FC0A0001A330A200203C02080009
-:100740008C420084244200013C010800AC22008459
-:1007500030A200201040000830A200103C02080027
-:100760008C420108244200013C010800AC2201082F
-:1007700003E0000800000000104000080000000036
-:100780003C0208008C420104244200013C010800A4
-:10079000AC22010403E00008000000003C02080055
-:1007A0008C420100244200013C010800AC220100FF
-:1007B00003E000080000000027BDFFE0AFB1001417
-:1007C0003C118000AFB20018AFBF001CAFB00010EA
-:1007D0003632010096500008320200041040000733
-:1007E000320300028FBF001C8FB200188FB10014BB
-:1007F0008FB000100A0000CE27BD00201060000B53
-:10080000020028218E2401000E00018A0000000051
-:100810003202008010400003240500A10E000C6786
-:100820008E44001C0A0001E3240200018E2301040F
-:100830008F82000810430006020028218E24010048
-:100840000E00018A000000008E220104AF82000821
-:10085000000010218FBF001C8FB200188FB1001450
-:100860008FB0001003E0000827BD00202C82000498
-:1008700014400002000018212483FFFD240200021E
-:10088000006210043C03600003E00008AC626914DD
-:1008900027BDFFE0AFBF001CAFB20018AFB100141E
-:1008A000AFB000103C048000948201083043700017
-:1008B000240220001062000A2862200154400052E5
-:1008C0008FBF001C24024000106200482402600018
-:1008D0001062004A8FBF001C0A0002518FB200183C
-:1008E00034820100904300098C5000189451000C90
-:1008F000240200091062001C0000902128620009F7
-:10090000144000218F8200242402000A5062001249
-:10091000323100FF2402000B1062000F00000000C3
-:100920002402000C146200188F8200243C0208008C
-:100930008C4256B824030900AC83002000501021DB
-:100940003C038008AC6200643C010800AC2256B84D
-:100950000A0002508FBF001C0E0001E900102602A1
-:100960000A0002308F8200240E0001E900102602E6
-:100970003C0380089462001A8C72000C3042FFFF26
-:10098000020280258F8200248C42000C5040001E01
-:100990008FBF001C0E000D84000000003C02800090
-:1009A00034420100944300088F82002400031C009D
-:1009B0009444001E8F82002000641825AC50000073
-:1009C00024040001AC510004AC520008AC40000CFF
-:1009D000AC400010AC400014AC4000180E000DB844
-:1009E000AC43001C0A0002508FBF001C0E000440E4
-:1009F000000000000A0002508FBF001C0E000C9F78
-:100A0000000000008FBF001C8FB200188FB10014CF
-:100A10008FB000100000102103E0000827BD002067
-:100A200027BDFFD8AFB400203C036010AFBF002447
-:100A3000AFB3001CAFB20018AFB10014AFB00010DC
-:100A40008C6450002402FF7F3C1408002694563822
-:100A5000008220243484380CAC6450003C028000B6
-:100A6000240300370E0014B0AC4300083C07080014
-:100A700024E70618028010212404001D2484FFFFAF
-:100A8000AC4700000481FFFD244200043C02080042
-:100A9000244207C83C010800AC2256403C02080032
-:100AA000244202303C030800246306203C04080072
-:100AB000248403B43C05080024A506F03C06080085
-:100AC00024C62C9C3C010800AC2256803C02080045
-:100AD000244205303C010800AC2756843C01080044
-:100AE000AC2656943C010800AC23569C3C010800FF
-:100AF000AC2456A03C010800AC2556A43C010800DB
-:100B0000AC2256A83C010800AC23563C3C0108002E
-:100B1000AC2456443C010800AC2056603C0108005F
-:100B2000AC2556643C010800AC2056703C0108001E
-:100B3000AC27567C3C010800AC2656903C010800CE
-:100B4000AC2356980E00056E00000000AF80000C2C
-:100B50003C0280008C5300008F8300043C0208009C
-:100B60008C420020106200213262000700008821C0
-:100B70002792FF9C3C100800261056E43C02080017
-:100B80008C42002024050001022518040043202483
-:100B90008F820004004310245044000C26310001D1
-:100BA00010800008AF9000248E4300003C028000BB
-:100BB000AC4300900E000D4BAE05000C0A0002C1C4
-:100BC00026310001AE00000C263100012E22000269
-:100BD000261000381440FFE9265200043C020800A9
-:100BE0008C420020AF820004326200071040FFD91F
-:100BF0003C028000326200011040002D326200028F
-:100C00003C0580008CA2010000002021ACA2002045
-:100C10008CA301042C42078110400008ACA300A85B
-:100C200094A2010824032000304270001443000302
-:100C30003C02800890420005304400FF0E0001593C
-:100C4000000000003C0280009042010B304300FF96
-:100C50002C62001E54400004000310800E00018628
-:100C60000A0002EC00000000005410218C42000039
-:100C70000040F80900000000104000043C02800021
-:100C80008C4301043C026020AC4300143C02080089
-:100C90008C4200343C0440003C03800024420001AC
-:100CA000AC6401383C010800AC220034326200021E
-:100CB00010400010326200043C1080008E0201409F
-:100CC000000020210E000159AE0200200E00038317
-:100CD000000000003C024000AE0201783C02080027
-:100CE0008C420038244200013C010800AC2200384C
-:100CF000326200041040FF973C0280003C108000EC
-:100D00008E020180000020210E000159AE02002059
-:100D10008E03018024020F00546200073C02800809
-:100D20008E0201883C0300E03042FFFF00431025A3
-:100D30000A000328AE020080344200809042000086
-:100D400024030050304200FF14430007000000005D
-:100D50000E000362000000001440000300000000C9
-:100D60000E000971000000003C0208008C42003CAB
-:100D70003C0440003C03800024420001AC6401B804
-:100D80003C010800AC22003C0A0002A33C028000A7
-:100D90003C02900034420001008220253C02800089
-:100DA000AC4400203C0380008C6200200440FFFE25
-:100DB0000000000003E00008000000003C0280008A
-:100DC000344300010083202503E00008AC440020E8
-:100DD00027BDFFE0AFB10014AFB000100080882144
-:100DE000AFBF00180E00033230B000FF8F83FF94B6
-:100DF000022020219062002502028025A07000259B
-:100E00008C7000183C0280000E00033D020280241A
-:100E10001600000B8FBF00183C0480008C8201F884
-:100E20000440FFFE348201C024030002AC510000E4
-:100E3000A04300043C021000AC8201F88FBF0018F0
-:100E40008FB100148FB0001003E0000827BD002010
-:100E500027BDFFE83C028000AFBF00103442018094
-:100E6000944300048C4400083063020010600005C5
-:100E7000000028210E00100C000000000A0003787A
-:100E8000240500013C02FF000480000700821824B2
-:100E90003C02040014620004240500018F82FF94C8
-:100EA00090420008240500018FBF001000A010210F
-:100EB00003E0000827BD00188F82FF982405000179
-:100EC000A040001A3C028000344201400A00034264
-:100ED0008C4400008F85FF9427BDFFE0AFBF001C4E
-:100EE000AFB20018AFB10014AFB0001090A2000074
-:100EF000304400FF38830020388200300003182B74
-:100F00000002102B0062182410600003240200501D
-:100F1000148200A88FBF001C90A20005304200017F
-:100F2000104000A48FBF001C3C02800034420140EE
-:100F3000904200082443FFFF2C6200051040009EF1
-:100F40008FB20018000310803C030800246355ACE6
-:100F5000004310218C420000004000080000000007
-:100F60003C028000345101400E0003328E24000008
-:100F70008F92FF948E2200048E50000C1602000205
-:100F800024020001AE42000C0E00033D8E2400003E
-:100F90008E220004145000068FBF001C8FB2001870
-:100FA0008FB100148FB000100A000F7827BD002009
-:100FB0008E42000C0A000419000000003C0480006E
-:100FC0003482014094A300108C4200043063FFFF80
-:100FD0001443001C0000000024020001A4A2001021
-:100FE0008C8202380441000F3C0380003C02003F29
-:100FF0003448F0003C0760003C06FFC08CE22BBC8C
-:1010000000461824004810240002130200031D8229
-:10101000106200583C0280008C8202380440FFF7C6
-:101020003C038000346201408C44000034620200C2
-:10103000AC4400003C021000AC6202380A00043BE1
-:101040008FBF001C94A200100A00041900000000C9
-:10105000240200201482000F3C0280003C03800028
-:1010600094A20012346301408C6300043042FFFFFD
-:10107000146200050000000024020001A4A2001276
-:101080000A0004028FBF001C94A200120A00041977
-:1010900000000000345101400E0003328E24000095
-:1010A0008F92FF948E230004964200123050FFFF6F
-:1010B0001603000224020001A64200120E00033DA6
-:1010C0008E2400008E220004160200068FBF001C32
-:1010D0008FB200188FB100148FB000100A00037C8B
-:1010E00027BD0020964200120A00041900000000EB
-:1010F0003C03800094A20014346301408C6300041C
-:101100003042FFFF14620008240200018FBF001C60
-:101110008FB200188FB100148FB00010A4A2001479
-:101120000A00146327BD002094A20014144000217B
-:101130008FBF001C0A000435000000003C03800043
-:1011400094A20016346301408C6300043042FFFF18
-:101150001462000D240200018FBF001C8FB2001822
-:101160008FB100148FB00010A4A200160A000B1457
-:1011700027BD00209442007824420004A4A200105D
-:101180000A00043B8FBF001C94A200162403000138
-:101190003042FFFF144300078FBF001C3C020800D1
-:1011A0008C420070244200013C010800AC22007017
-:1011B0008FBF001C8FB200188FB100148FB00010C9
-:1011C00003E0000827BD002027BDFFD8AFB20018FC
-:1011D0008F92FF94AFB10014AFBF0020AFB3001CDB
-:1011E000AFB000103C028000345101008C5001006F
-:1011F0009242000092230009304400FF2402001FA5
-:10120000106200AB28620020104000192402003850
-:101210002862000A1040000D2402000B286200081A
-:101220001040002E8F820024046001042862000216
-:101230001440002A8F820024240200061062002637
-:101240008FBF00200A00055F8FB3001C1062006092
-:101250002862000B144000FA8FBF00202402000E09
-:10126000106200788F8200240A00055F8FB3001C93
-:10127000106200D2286200391040000A2402008067
-:1012800024020036106200E528620037104000C3D7
-:1012900024020035106200D98FBF00200A00055FCC
-:1012A0008FB3001C1062002D2862008110400006E0
-:1012B000240200C824020039106200C98FBF002038
-:1012C0000A00055F8FB3001C106200A28FBF0020D0
-:1012D0000A00055F8FB3001C8F8200248C42000C33
-:1012E000104000D78FBF00200E000D8400000000CA
-:1012F0003C038000346301008C6200008F85002075
-:10130000946700089466000CACA200008C64000492
-:101310008F82002400063400ACA400049448001E10
-:101320008C62001800073C0000E83825ACA20008D9
-:101330008C62001C24040001ACA2000C9062000A24
-:1013400000C23025ACA60010ACA00014ACA0001860
-:10135000ACA7001C0A00051D8FBF00208F8200244F
-:101360008C42000C104000B68FBF00200E000D8490
-:10137000000000008F820024962400089625000CAF
-:101380009443001E000422029626000E8F82002045
-:10139000000426000083202500052C003C0300806B
-:1013A00000A6282500832025AC400000AC400004A6
-:1013B000AC400008AC40000CAC450010AC40001440
-:1013C000AC400018AC44001C0A00051C24040001B9
-:1013D0009622000C14400018000000009242000504
-:1013E0003042001014400014000000000E000332D0
-:1013F0000200202192420005020020213442001008
-:101400000E00033DA242000592420000240300208A
-:10141000304200FF10430089020020218FBF0020CE
-:101420008FB3001C8FB200188FB100148FB0001062
-:101430000A00107527BD00280000000D0A00055E97
-:101440008FBF00208C42000C1040007D8FBF002019
-:101450000E000D84000000008E2200048F84002006
-:101460009623000CAC8200003C0280089445002CBE
-:101470008F82002400031C0030A5FFFF9446001E4D
-:101480003C02400E0065182500C23025AC830004E4
-:10149000AC800008AC80000CAC800010AC80001464
-:1014A000AC800018AC86001C0A00051C2404000156
-:1014B0000E000332020020218F93FF9802002021AA
-:1014C0000E00033DA660000C020020210E00034226
-:1014D000240500018F8200248C42000C104000582B
-:1014E0008FBF00200E000D84000000009622000C2B
-:1014F0008F83002000021400AC700000AC62000476
-:10150000AC6000088E4400388F820024AC64000C6C
-:101510008E46003C9445001E3C02401FAC66001005
-:1015200000A228258E62000424040001AC6200148D
-:10153000AC600018AC65001C8FBF00208FB3001C8E
-:101540008FB200188FB100148FB000100A000DB8D0
-:1015500027BD0028240200201082003A8FB3001C0F
-:101560000E000F5E00000000104000358FBF00200D
-:101570003C0480008C8201F80440FFFE348201C0EC
-:1015800024030002AC500000A04300043C02100001
-:10159000AC8201F80A00055E8FBF00200200202106
-:1015A0008FBF00208FB3001C8FB200188FB10014C2
-:1015B0008FB000100A000EA727BD00289625000C4A
-:1015C000020020218FBF00208FB3001C8FB20018B3
-:1015D0008FB100148FB000100A000ECC27BD002878
-:1015E000020020218FB3001C8FB200188FB10014AD
-:1015F0008FB000100A000EF727BD00289225000DBD
-:10160000020020218FB3001C8FB200188FB100148C
-:101610008FB000100A000F4827BD002802002021CB
-:101620008FBF00208FB3001C8FB200188FB1001441
-:101630008FB000100A000F1F27BD00288FBF0020A9
-:101640008FB3001C8FB200188FB100148FB0001040
-:1016500003E0000827BD00283C0580008CA202782A
-:101660000440FFFE34A2024024030002AC44000008
-:10167000A04300043C02100003E00008ACA2027882
-:10168000A380001803E00008A38000193C03800039
-:101690008C6202780440FFFE8F82001CAC62024024
-:1016A00024020002A06202443C02100003E0000891
-:1016B000AC6202783C02600003E000088C425404F3
-:1016C0009083003024020005008040213063003FF9
-:1016D0000000482114620005000050219082004C57
-:1016E0009483004E304900FF306AFFFFAD00000CCC
-:1016F000AD000010AD000024950200148D05001C03
-:101700008D0400183042FFFF004910230002110031
-:10171000000237C3004038210086202300A2102B8E
-:101720000082202300A72823AD05001CAD0400186B
-:10173000A5090014A5090020A50A001603E0000869
-:10174000A50A002203E000080000000027BDFFD822
-:10175000AFB200183C128008AFB40020AFB3001C39
-:10176000AFB10014AFBF0024AFB00010365101007C
-:101770003C0260008C4254049222000C3C1408008D
-:10178000929400F7304300FF2402000110620032FF
-:101790000080982124020002146200353650008037
-:1017A0000E00143D000000009202004C2403FF8054
-:1017B0003C0480003042007F000211C024420240FD
-:1017C0000262102100431824AC8300949245000863
-:1017D0009204004C3042007F3C03800614850007D1
-:1017E000004380212402FFFFA22200112402FFFFF8
-:1017F000A62200120A0005D22402FFFF9602002052
-:10180000A222001196020022A62200128E020024BB
-:101810003C048008AE2200143485008090A2004C65
-:1018200034830100A06200108CA2003CAC6200185E
-:101830008C820068AC6200F48C820064AC6200F0C0
-:101840008C82006CAC6200F824020001A0A2006847
-:101850000A0005EE3C0480080E001456000000004B
-:1018600036420080A04000680A0005EE3C04800873
-:10187000A2000068A20000690A0006293C02800854
-:10188000348300808C62003834850100AC62006CC7
-:1018900024020001A062006990A200D59083000894
-:1018A000305100FF3072007F12320019001111C058
-:1018B00024420240026210212403FF8000431824C6
-:1018C0003C048000AC8300943042007F3C038006DF
-:1018D000004380218E02000C1040000D02002021E8
-:1018E0000E00057E0000000026220001305100FF9E
-:1018F0009203003C023410260002102B0002102339
-:101900003063007F022288240A0005F8A203003C0D
-:101910003C088008350401008C8200E03507008017
-:10192000ACE2003C8C8200E0AD02000090E5004C8F
-:10193000908600D590E3004C908400D52402FF806F
-:1019400000A228243063007F308400FF00A62825F1
-:101950000064182A1060000230A500FF38A500803E
-:10196000A0E5004CA10500093C0280089043000E50
-:10197000344400803C058000A043000A8C8300189A
-:101980003C027FFF3442FFFF00621824AC83001842
-:101990008CA201F80440FFFE00000000ACB301C0BF
-:1019A0008FBF00248FB400208FB3001C8FB20018AB
-:1019B0008FB100148FB0001024020002A0A201C455
-:1019C00027BD00283C02100003E00008ACA201F88B
-:1019D00090A2000024420001A0A200003C030800E5
-:1019E0008C6300F4304200FF144300020080302179
-:1019F000A0A0000090A200008F84001C000211C073
-:101A00002442024024830040008220212402FF80DF
-:101A1000008220243063007F3C02800A006218218B
-:101A20003C028000AC44002403E00008ACC300008A
-:101A300094820006908300058C85000C8C86001033
-:101A40008C8700188C88001C8C8400203C010800C6
-:101A5000A42256C63C010800A02356C53C0108003C
-:101A6000AC2556CC3C010800AC2656D03C01080001
-:101A7000AC2756D83C010800AC2856DC3C010800D5
-:101A8000AC2456E003E00008000000003C0280089F
-:101A9000344201008C4400343C038000346504006F
-:101AA000AC6400388C420038AF850028AC62003C42
-:101AB0003C020005AC6200300000000000000000A5
-:101AC00003E00008000000003C020006308400FF34
-:101AD000008220253C028000AC4400300000000061
-:101AE00000000000000000003C0380008C62000049
-:101AF000304200101040FFFD3462040003E0000893
-:101B0000AF82002894C200003C080800950800CA73
-:101B100030E7FFFF0080482101021021A4C200002D
-:101B200094C200003042FFFF00E2102B544000013D
-:101B3000A4C7000094A200003C0308008C6300CC02
-:101B400024420001A4A2000094A200003042FFFF42
-:101B5000144300073C0280080107102BA4A00000DA
-:101B60005440000101003821A4C700003C02800855
-:101B7000344601008CC3002894A200003C0480007D
-:101B80003042FFFE000210C000621021AC82003C17
-:101B90008C82003C006218231860000400000000E2
-:101BA0008CC200240A0006BA244200018CC2002420
-:101BB000AC8200383C020050344200103C038000EC
-:101BC000AC620030000000000000000000000000D7
-:101BD0008C620000304200201040FFFD0000000039
-:101BE00094A200003C04800030420001000210C0BA
-:101BF000004410218C430400AD2300008C420404F7
-:101C0000AD2200043C02002003E00008AC8200305A
-:101C100027BDFFE0AFB20018AFB10014AFB00010A5
-:101C2000AFBF001C94C2000000C080213C1208001D
-:101C3000965200C624420001A6020000960300004E
-:101C400094E2000000E03021144300058FB1003021
-:101C50000E00068F024038210A0006F10000000045
-:101C60008C8300048C82000424420040046100073D
-:101C7000AC8200048C8200040440000400000000D8
-:101C80008C82000024420001AC8200009602000019
-:101C90003042FFFF50520001A600000096220000D3
-:101CA00024420001A62200003C02800834420100C8
-:101CB000962300009442003C144300048FBF001C94
-:101CC00024020001A62200008FBF001C8FB2001862
-:101CD0008FB100148FB0001003E0000827BD002072
-:101CE00027BDFFE03C028008AFBF0018344201006E
-:101CF0008C4800343C03800034690400AC68003830
-:101D00008C42003830E700FFAF890028AC62003C0D
-:101D10003C020005AC620030000000000000000042
-:101D200000000000000000000000000000000000B3
-:101D30008C82000C8C82000C97830016AD22000070
-:101D40008C82001000604021AD2200048C820018BB
-:101D5000AD2200088C82001CAD22000C8CA2001465
-:101D6000AD2200108C820020AD220014908200056C
-:101D7000304200FF00021200AD2200188CA20018B1
-:101D8000AD22001C8CA2000CAD2200208CA2001001
-:101D9000AD2200248CA2001CAD2200288CA20020C1
-:101DA000AD22002C3402FFFFAD260030AD20003400
-:101DB000506200013408FFFFAD28003850E00011E8
-:101DC0003C0280083C048008348401009482005066
-:101DD0003042FFFFAD22003C9483004494850044D0
-:101DE000240200013063FFFF000318C200641821C1
-:101DF0009064006430A5000700A210040A00075C8C
-:101E00000044102534420100AD20003C94430044BE
-:101E1000944400443063FFFF000318C2006218219D
-:101E200030840007906500642402000100821004E1
-:101E30000002102700451024A0620064000000008A
-:101E400000000000000000003C0200063442004098
-:101E50003C038000AC620030000000000000000085
-:101E6000000000008C620000304200101040FFFDB6
-:101E70003C06800834C201503463040034C7014A70
-:101E800034C4013434C5014034C60144AFA200104B
-:101E90000E0006D2AF8300288FBF001803E00008B1
-:101EA00027BD00208F8300143C0608008CC600E884
-:101EB0008F82001C30633FFF000319800046102111
-:101EC000004310212403FF80004318243C068000B7
-:101ED000ACC300283042007F3C03800C004330211B
-:101EE00090C2000D30A500FF0000382134420010E0
-:101EF000A0C2000D8F8900143C028008344201000A
-:101F00009443004400091382304800032402000176
-:101F1000A4C3000E1102000B2902000210400005AC
-:101F2000240200021100000C240300010A0007A48F
-:101F30000000182111020006000000000A0007A49A
-:101F4000000018218CC2002C0A0007A424430001C1
-:101F50008CC20014244300018CC200180043102BD3
-:101F60005040000A240700012402002714A20003A5
-:101F70003C0380080A0007B1240700013463010014
-:101F80009462004C24420001A462004C00091382B8
-:101F9000304300032C620002104000090080282119
-:101FA000146000040000000094C200340A0007C15D
-:101FB0003046FFFF8CC600380A0007C10080282188
-:101FC000000030213C040800248456C00A000706A3
-:101FD0000000000027BDFF90AFB60068AFB50064F9
-:101FE000AFB40060AFB3005CAFB20058AFB1005403
-:101FF000AFBF006CAFB000508C9000000080B021EB
-:102000003C0208008C4200E8960400328F83001CDA
-:102010002414FF8030843FFF0062182100042180D7
-:1020200000641821007410243C13800000A090214B
-:1020300090A50000AE620028920400323C02800CA1
-:102040003063007F00628821308400C02402004099
-:10205000148200320000A8218E3500388E2200182C
-:102060001440000224020001AE2200189202003C3B
-:10207000304200201440000E8F83001C000511C068
-:102080002442024000621821306400783C02008043
-:102090000082202500741824AE630800AE64081086
-:1020A0008E2200188E03000800431021AE22001873
-:1020B0008E22002C8E230018244200010062182B6F
-:1020C0001060004300000000924200002442000122
-:1020D000A24200003C0308008C6300F4304200FF81
-:1020E00050430001A2400000924200008F84001C77
-:1020F000000211C024420240248300403063007F6C
-:10210000008220213C02800A0094202400621821D1
-:10211000AE6400240A0008D2AEC30000920300326D
-:102120002402FFC000431024304200FF1440000589
-:1021300024020001AE220018962200340A00084250
-:102140003055FFFF8E22001424420001AE220018F9
-:102150009202003000021600000216030441001C27
-:10216000000000009602003227A400100080282101
-:10217000A7A20016960200320000302124070001B9
-:102180003042FFFFAF8200140E000706AFA0001C14
-:10219000960200328F83001C3C0408008C8400E807
-:1021A00030423FFF000211800064182100621821B4
-:1021B00000741024AE62002C3063007F3C02800E5D
-:1021C000006218219062000D3042007FA062000D75
-:1021D0009222000D304200105040007892420000E0
-:1021E0003C028008344401009482004C8EC30000FD
-:1021F0003C130800967300C62442FFFFA482004CE3
-:10220000946200329623000E3054FFFF3070FFFFBF
-:102210003C0308008C6300D000701807A7A30038A7
-:102220009482003E3063FFFF3042FFFF14620007DC
-:10223000000000008C8200303C038000244200300B
-:10224000AC62003C0A00086A8C82002C9482004038
-:102250003042FFFF5462000927A400408C820038FE
-:102260003C03800024420030AC62003C8C8200348D
-:10227000AC6200380A0008793C03800027A50038CA
-:1022800027A60048026038210E00068FA7A000484C
-:102290008FA300403C02800024630030AC43003830
-:1022A0008FA30044AC43003C3C0380003C0200058B
-:1022B000AC6200303C028008344401009482004249
-:1022C000346304003042FFFF0202102B1440000769
-:1022D000AF8300289482004E9483004202021021B2
-:1022E000004310230A00088F3043FFFF9483004E01
-:1022F00094820042026318210050102300621823C8
-:102300003063FFFF3C028008344401009482003CAB
-:102310003042FFFF14430003000000000A00089F42
-:10232000240300019482003C3042FFFF0062102B26
-:10233000144000058F8200289482003C0062102324
-:102340003043FFFF8F820028AC550000AC400004F2
-:10235000AC540008AC43000C3C02000634420010B0
-:102360003C038000AC620030000000000000000070
-:10237000000000008C620000304200101040FFFDA1
-:102380003C04800834840100001018C20064182145
-:102390009065006432020007240600010046100424
-:1023A00000451025A0620064948300429622000E2E
-:1023B00050430001A386001892420000244200010D
-:1023C000A24200003C0308008C6300F4304200FF8E
-:1023D00050430001A2400000924200008F84001C84
-:1023E000000211C0244202402483004000822021C8
-:1023F0002402FF80008220243063007F3C02800A98
-:10240000006218213C028000AC440024AEC30000EE
-:102410008FBF006C8FB600688FB500648FB400600A
-:102420008FB3005C8FB200588FB100548FB0005052
-:1024300003E0000827BD007027BDFFD8AFB3001C24
-:10244000AFB20018AFB10014AFB00010AFBF0020A2
-:102450000080982100E0802130B1FFFF0E000D8444
-:1024600030D200FF0000000000000000000000006B
-:102470008F8200208F830024AC510000AC520004F6
-:10248000AC530008AC40000CAC400010AC40001451
-:10249000AC4000189463001E02038025AC50001C61
-:1024A0000000000000000000000000002404000103
-:1024B0008FBF00208FB3001C8FB200188FB10014A3
-:1024C0008FB000100A000DB827BD002830A5FFFF0F
-:1024D0000A0008DC30C600FF3C02800834430100DB
-:1024E0009462000E3C080800950800C63046FFFFC5
-:1024F00014C000043402FFFF946500EA0A000929B1
-:102500008F84001C10C20027000000009462004E5F
-:102510009464003C3045FFFF00A6102300A6182B52
-:102520003087FFFF106000043044FFFF00C5102318
-:1025300000E210233044FFFF0088102B1040000EF3
-:1025400000E810233C028008344401002403000109
-:1025500034420080A44300162402FFFFA482000E30
-:10256000948500EA8F84001C0000302130A5FFFF15
-:102570000A0009013C0760200044102A10400009AD
-:102580003C0280083443008094620016304200010F
-:10259000104000043C0280009442007E244200145B
-:1025A000A462001603E000080000000027BDFFE061
-:1025B0003C028008AFBF001CAFB0001834420100DD
-:1025C000944300429442004C104000193068FFFFD1
-:1025D0009383001824020001146200298FBF001C9D
-:1025E0003C06800834D00100000810C200501021C1
-:1025F000904200643103000734C70148304200FFB5
-:10260000006210073042000134C9014E34C4012C6D
-:1026100034C5013E1040001634C601420E0006D2F9
-:10262000AFA90010960200420A0009463048FFFF99
-:102630003C028008344401009483004494820042A8
-:102640001043000F8FBF001C94820044A4820042FC
-:1026500094820050A482004E8C820038AC820030FC
-:1026600094820040A482003E9482004AA4820048E2
-:102670008FBF001C8FB000180A00090427BD00207E
-:102680008FB0001803E0000827BD002027BDFFA081
-:10269000AFB1004C3C118000AFBF0058AFB3005445
-:1026A000AFB20050AFB000483626018890C2000398
-:1026B0003044007FA3A400108E32018090C200003D
-:1026C0003043007F240200031062003BAF92001CE5
-:1026D00028620004104000062402000424020002C4
-:1026E000106200098FBF00580A000B0F8FB300540F
-:1026F0001062004D240200051062014E8FBF005889
-:102700000A000B0F8FB30054000411C002421021C5
-:102710002404FF8024420240004410242643004049
-:10272000AE2200243063007F3C02800A0062182140
-:102730009062003CAFA3003C00441025A062003C26
-:102740008FA3003C9062003C304200401040016C7E
-:102750008FBF00583C108008A3800018361001007D
-:102760008E0200E08C63003427A4003C27A50010F3
-:10277000004310210E0007C3AE0200E093A2001038
-:102780003C038000A20200D58C6202780440FFFE68
-:102790008F82001CAC62024024020002A06202444C
-:1027A0003C021000AC6202780E0009390000000003
-:1027B0000A000B0E8FBF00583C05800890C3000133
-:1027C00090A2000B1443014E8FBF005834A4008028
-:1027D0008C8200189082004C90A200083C0260009D
-:1027E0008C4254048C8300183C027FFF3442FFFF6C
-:1027F000006218243C0208008C4200B4AC8300182C
-:102800003C038000244200013C010800AC2200B4DB
-:102810008C6201F80440FFFE8F82001CAC6201C094
-:102820000A000AD6240200023C10800890C300016E
-:102830009202000B144301328FBF005827A40018E6
-:1028400036050110240600033C0260008C4254044B
-:102850000E000E470000000027A40028360501F0F6
-:102860000E000E47240600038FA200283603010045
-:10287000AE0200648FA2002CAE0200688FA200306E
-:10288000AE02006C93A40018906300D52402FF8070
-:102890000082102400431025304900FF3084007F5F
-:1028A0003122007F0082102A544000013929008023
-:1028B000000411C0244202402403FF800242102180
-:1028C00000431024AE220094264200403042007F94
-:1028D0003C038006004340218FA3001C2402FFFF1D
-:1028E000AFA800403C130800927300F71062003359
-:1028F00093A2001995030014304400FF3063FFFFDA
-:102900000064182B106000100000000095040014F3
-:102910008D07001C8D0600183084FFFF0044202323
-:102920000004210000E438210000102100E4202BE5
-:1029300000C2302100C43021AD07001CAD060018D4
-:102940000A000A2F93A20019950400148D07001C99
-:102950008D0600183084FFFF008220230004210030
-:10296000000010210080182100C2302300E4202B39
-:1029700000C4302300E33823AD07001CAD06001867
-:1029800093A200198FA30040A462001497A2001A1A
-:10299000A46200168FA2001CAC6200108FA2001C63
-:1029A000AC62000C93A20019A462002097A2001A46
-:1029B000A46200228FA2001CAC6200243C048008A8
-:1029C000348300808C6200388FA20020012088218F
-:1029D000AC62003C8FA20020AC82000093A20018E1
-:1029E000A062004C93A20018A0820009A0600068B9
-:1029F00093A20018105100512407FF803229007F54
-:102A0000000911C024420240024210213046007FDA
-:102A10003C03800000471024AC6200943C02800616
-:102A200000C2302190C2003CAFA60040000020212F
-:102A300000471025A0C2003C8FA80040950200026C
-:102A4000950300148D07001C3042FFFF3063FFFF29
-:102A50008D060018004310230002110000E2382107
-:102A600000E2102B00C4302100C23021AD07001C51
-:102A7000AD06001895020002A5020014A50000167C
-:102A80008D020008AD0200108D020008AD02000C9E
-:102A900095020002A5020020A50000228D02000878
-:102AA000AD0200249102003C304200401040001A68
-:102AB000262200013C108008A3A90038A38000183A
-:102AC000361001008E0200E08D03003427A4004080
-:102AD00027A50038004310210E0007C3AE0200E016
-:102AE00093A200383C038000A20200D58C620278D9
-:102AF0000440FFFE8F82001CAC62024024020002F0
-:102B0000A06202443C021000AC6202780E00093957
-:102B100000000000262200013043007F14730004EF
-:102B2000004020212403FF8002231024004320269C
-:102B300093A200180A000A4B309100FF93A40018DA
-:102B40008FA3001C2402FFFF1062000A308900FFDF
-:102B500024820001248300013042007F14530005C9
-:102B6000306900FF2403FF800083102400431026F7
-:102B7000304900FF3C028008904200080120882173
-:102B8000305000FF123000193222007F000211C0C5
-:102B900002421021244202402403FF8000431824F3
-:102BA0003C048000AC8300943042007F3C038006EC
-:102BB000004310218C43000C004020211060000BCA
-:102BC000AFA200400E00057E000000002623000199
-:102BD0002405FF803062007F145300020225202468
-:102BE000008518260A000AAF307100FF3C048008F7
-:102BF000348400808C8300183C027FFF3442FFFF46
-:102C000000621824AC8300183C0380008C6201F839
-:102C10000440FFFE00000000AC7201C0240200026C
-:102C2000A06201C43C021000AC6201F80A000B0E65
-:102C30008FBF00583C04800890C300019082000BB5
-:102C40001443002F8FBF0058349000809202000878
-:102C500030420040104000200000000092020008B6
-:102C60000002160000021603044100050240202164
-:102C70000E000ECC240500930A000B0E8FBF0058E7
-:102C80009202000924030018304200FF1443000D93
-:102C900002402021240500390E000E64000030217E
-:102CA0000E0003328F84001C8F82FF9424030012D5
-:102CB000A04300090E00033D8F84001C0A000B0E88
-:102CC0008FBF0058240500360E000E64000030212E
-:102CD0000A000B0E8FBF00580E0003320240202165
-:102CE000920200058F84001C344200200E00033D38
-:102CF000A20200050E0010758F84001C8FBF0058C3
-:102D00008FB300548FB200508FB1004C8FB0004889
-:102D100003E0000827BD00603C0280083445010044
-:102D20003C0280008C42014094A3000E0000302140
-:102D300000402021AF82001C3063FFFF3402FFFF00
-:102D4000106200063C0760202402FFFFA4A2000ED0
-:102D500094A500EA0A00090130A5FFFF03E000087E
-:102D60000000000027BDFFC83C0280003C06800830
-:102D7000AFB5002CAFB1001CAFBF0030AFB400281E
-:102D8000AFB30024AFB20020AFB00018345101003F
-:102D900034C501008C4301008E2200148CA400E491
-:102DA0000000A821AF83001C0044102318400052EB
-:102DB000A38000188E22001400005021ACA200E471
-:102DC00090C3000890A200D53073007FA3A200102A
-:102DD0008CB200E08CB400E4304200FF1053003BA2
-:102DE00093A200108F83001C2407FF80000211C0F3
-:102DF0000062102124420240246300400047102456
-:102E00003063007F3C0980003C08800A006818217C
-:102E1000AD2200248C62003427A4001427A50010E2
-:102E2000024280210290102304400028AFA3001426
-:102E30009062003C00E21024304200FF1440001970
-:102E4000020090219062003C34420040A062003CAD
-:102E50008F86001C93A3001024C200403042007FE4
-:102E6000004828213C0208008C4200F42463000141
-:102E7000306400FF14820002A3A30010A3A000107E
-:102E800093A20010AFA50014000211C0244202401A
-:102E900000C2102100471024AD2200240A000B4577
-:102EA00093A200100E0007C3000000003C0280083F
-:102EB00034420100AC5000E093A30010240A00014A
-:102EC000A04300D50A000B4593A200102402000184
-:102ED000154200093C0380008C6202780440FFFE2A
-:102EE0008F82001CAC62024024020002A0620244F5
-:102EF0003C021000AC6202789222000B2403000214
-:102F0000304200FF144300720000000096220008C7
-:102F1000304300FF24020082146200402402008437
-:102F20003C028000344901008D22000C95230006EC
-:102F3000000216023063FFFF3045003F24020027E5
-:102F400010A2000FAF83001428A200281040000830
-:102F5000240200312402002110A2000924020025CD
-:102F600010A20007938200190A000BBD00000000A8
-:102F700010A20007938200190A000BBD0000000098
-:102F80000E000777012020210A000C3D0000000000
-:102F90003C0380008C6202780440FFFE8F82001C9C
-:102FA000AC62024024020002A06202443C02100013
-:102FB000AC6202780A000C3D000000009523000678
-:102FC000912400058D25000C8D2600108D270018FA
-:102FD0008D28001C8D290020244200013C0108009E
-:102FE000A42356C63C010800A02456C53C01080095
-:102FF000AC2556CC3C010800AC2656D03C0108005C
-:10300000AC2756D83C010800AC2856DC3C0108002F
-:10301000AC2956E00A000C3DA38200191462000A94
-:10302000240200813C02800834420100944500EAF9
-:10303000922600058F84001C30A5FFFF30C600FFDC
-:103040000A000BFE3C0760211462005C00000000D7
-:103050009222000A304300FF306200201040000737
-:10306000306200403C02800834420100944500EA8E
-:103070008F84001C0A000BFC24060040104000074F
-:10308000000316003C02800834420100944500EA27
-:103090008F84001C0A000BFC24060041000216036A
-:1030A000044100463C02800834420100944500EA95
-:1030B0008F84001C2406004230A5FFFF3C076019E6
-:1030C0000E000901000000000A000C3D0000000095
-:1030D0009222000B24040016304200FF1044000628
-:1030E0003C0680009222000B24030017304200FFB0
-:1030F000144300320000000034C5010090A2000B10
-:10310000304200FF1444000B000080218CA20020FC
-:103110008CA400202403FF800043102400021140EF
-:103120003084007F004410253C032000004310251C
-:10313000ACC2083094A2000800021400000214037C
-:10314000044200012410000194A2000830420080D3
-:103150005040001A0200A82194A20008304220002A
-:10316000504000160200A8218CA300183C021C2D20
-:10317000344219ED106200110200A8213C0208003F
-:103180008C4200D4104000053C0280082403000457
-:1031900034420100A04300FC3C028008344201009C
-:1031A000944500EA8F84001C2406000630A5FFFF2A
-:1031B0000E0009013C0760210200A8210E00093918
-:1031C000000000009222000A304200081040000473
-:1031D00002A010210E0013790000000002A01021AF
-:1031E0008FBF00308FB5002C8FB400288FB3002420
-:1031F0008FB200208FB1001C8FB0001803E00008D0
-:1032000027BD00382402FF80008220243C02900069
-:1032100034420007008220253C028000AC4400209C
-:103220003C0380008C6200200440FFFE0000000090
-:1032300003E00008000000003C0380002402FF803F
-:10324000008220243462000700822025AC64002024
-:103250008C6200200440FFFE0000000003E0000834
-:103260000000000027BDFFD8AFB3001CAFB10014B1
-:10327000AFB00010AFBF0020AFB200183C1180000B
-:103280003C0280088E32002034530100AE2400201E
-:10329000966300EA000514003C074000004738250B
-:1032A00000A08021000030210E0009013065FFFFE1
-:1032B000240200A1160200022402FFFFA2620009FC
-:1032C000AE3200208FBF00208FB3001C8FB20018D9
-:1032D0008FB100148FB0001003E0000827BD002854
-:1032E0003C0280082403000527BDFFE834420100AA
-:1032F000A04300FCAFBF00103C0280008C420100E4
-:10330000240500A1004020210E000C67AF82001CA4
-:103310003C0380008C6202780440FFFE8F82001C18
-:103320008FBF001027BD0018AC62024024020002CB
-:10333000A06202443C021000AC62027803E0000884
-:103340000000000027BDFFE83C068000AFBF001072
-:1033500034C7010094E20008304400FF3883008243
-:10336000388200842C6300012C4200010062182581
-:103370001060002D24020083938200195040003B0E
-:103380008FBF00103C020800904256CC8CC4010054
-:103390003C06080094C656C63045003F38A30032AC
-:1033A00038A2003F2C6300012C4200010062182566
-:1033B000AF84001CAF860014A380001914600007BE
-:1033C00000E020212402002014A2001200000000CE
-:1033D0003402FFFF14C2000F00000000240200208E
-:1033E00014A2000500E028218CE300142402FFFF52
-:1033F0005062000B8FBF00103C040800248456C0AC
-:10340000000030210E000706240700010A000CD638
-:103410008FBF00100E000777000000008FBF001064
-:103420000A00093927BD001814820004240200850F
-:103430008CC501040A000CE1000020211482000662
-:103440002482FF808CC50104240440008FBF00103B
-:103450000A00016727BD0018304200FF2C4200021D
-:1034600010400004240200228FBF00100A000B2726
-:1034700027BD0018148200048F8200248FBF001023
-:103480000A000C8627BD00188C42000C1040001E5C
-:1034900000E0282190E300092402001814620003D0
-:1034A000240200160A000CFC240300081462000722
-:1034B00024020017240300123C02800834420080DA
-:1034C000A04300090A000D0994A7000854620007F0
-:1034D00094A700088F82FF942404FFFE9043000508
-:1034E00000641824A043000594A7000890A6001BC0
-:1034F0008CA4000094A500068FBF001000073C00BC
-:103500000A0008DC27BD00188FBF001003E0000888
-:1035100027BD00188F8500243C04800094A2002A57
-:103520008CA30034000230C02402FFF000C210243B
-:1035300000621821AC83003C8CA200303C03800068
-:10354000AC8200383C02005034420010AC620030C3
-:103550000000000000000000000000008C6200007D
-:10356000304200201040FFFD30C20008104000062D
-:103570003C0280008C620408ACA200208C62040C27
-:103580000A000D34ACA200248C430400ACA300203C
-:103590008C420404ACA200243C0300203C028000C6
-:1035A000AC4300303C0480008C8200300043102487
-:1035B0001440FFFD8F8600243C020040AC820030A6
-:1035C00094C3002A94C2002894C4002C94C5002EF1
-:1035D00024630001004410213064FFFFA4C20028CE
-:1035E00014850002A4C3002AA4C0002A03E0000836
-:1035F000000000008F84002427BDFFE83C05800404
-:1036000024840010AFBF00100E000E472406000AED
-:103610008F840024948200129483002E3042000F85
-:10362000244200030043180424027FFF0043102BB0
-:1036300010400002AC8300000000000D0E000D13CE
-:10364000000000008F8300248FBF001027BD0018EA
-:10365000946200149463001A3042000F00021500B7
-:10366000006218253C02800003E00008AC4300A083
-:103670008F8300243C028004944400069462001A64
-:103680008C650000A4640016004410233042FFFF44
-:103690000045102B03E00008384200018F8400240D
-:1036A0003C0780049486001A8C85000094E2000692
-:1036B000A482001694E3000600C310233042FFFFEB
-:1036C0000045102B384200011440FFF8A483001677
-:1036D00003E00008000000008F8400243C02800406
-:1036E000944200069483001A8C850000A482001680
-:1036F000006210233042FFFF0045102B38420001CA
-:103700005040000D8F850024006030213C0780046C
-:1037100094E20006A482001694E3000600C310237E
-:103720003042FFFF0045102B384200011440FFF8E3
-:10373000A48300168F8500243C03800034620400BB
-:103740008CA40020AF820020AC6400388CA200243E
-:10375000AC62003C3C020005AC62003003E00008B3
-:10376000ACA000048F8400243C0300068C8200047B
-:1037700000021140004310253C038000AC62003081
-:103780000000000000000000000000008C6200004B
-:10379000304200101040FFFD34620400AC80000491
-:1037A00003E00008AF8200208F86002427BDFFE0E1
-:1037B000AFB10014AFB00010AFBF00188CC300044D
-:1037C0008CC500248F820020309000FF94C4001A22
-:1037D00024630001244200202484000124A7002047
-:1037E000ACC30004AF820020A4C4001AACC70024FC
-:1037F00004A100060000882104E2000594C2001A1A
-:103800008CC2002024420001ACC2002094C2001AE5
-:1038100094C300282E040001004310262C4200010E
-:10382000004410245040000594C2001A24020001F4
-:10383000ACC2000894C2001A94C300280010202BC8
-:10384000004310262C4200010044102514400007BC
-:10385000000000008CC20008144000042402001084
-:103860008CC300041462000F8F8500240E000DA786
-:10387000241100018F820024944300289442001AEE
-:1038800014430003000000000E000D1300000000B0
-:10389000160000048F8500240E000D840000000037
-:1038A0008F85002494A2001E94A4001C24420001D1
-:1038B0003043FFFF14640002A4A2001EA4A0001E57
-:1038C0001200000A3C02800494A2001494A3001A7F
-:1038D0003042000F00021500006218253C028000F3
-:1038E000AC4300A00A000E1EACA0000894420006E3
-:1038F00094A3001A8CA40000A4A200160062102356
-:103900003042FFFF0044102B384200011040000DF0
-:1039100002201021006030213C07800494E2000660
-:10392000A4A2001694E3000600C310233042FFFF58
-:103930000044102B384200011440FFF8A4A30016E5
-:10394000022010218FBF00188FB100148FB000101B
-:1039500003E0000827BD002003E00008000000008D
-:103960008F82002C3C03000600021140004310250A
-:103970003C038000AC62003000000000000000004A
-:10398000000000008C620000304200101040FFFD7B
-:1039900034620400AF82002803E00008AF80002CEE
-:1039A00003E000080000102103E000080000000010
-:1039B0003084FFFF30A5FFFF0000182110800007B2
-:1039C000000000003082000110400002000420428C
-:1039D000006518210A000E3D0005284003E000089C
-:1039E0000060102110C0000624C6FFFF8CA200005A
-:1039F00024A50004AC8200000A000E4724840004C1
-:103A000003E000080000000010A0000824A3FFFF4E
-:103A1000AC86000000000000000000002402FFFF50
-:103A20002463FFFF1462FFFA2484000403E000080B
-:103A3000000000003C0280083442008024030001A2
-:103A4000AC43000CA4430010A4430012A443001490
-:103A500003E00008A44300168F82002427BDFFD88E
-:103A6000AFB3001CAFB20018AFB10014AFB000107C
-:103A7000AFBF00208C47000C248200802409FF8007
-:103A80003C08800E3043007F008080213C0A80008B
-:103A9000004920240068182130B100FF30D200FF17
-:103AA00010E000290000982126020100AD44002CFE
-:103AB000004928243042007F004820219062000005
-:103AC00024030050304200FF1443000400000000B3
-:103AD000AD45002C948200EA3053FFFF0E000D84A8
-:103AE000000000008F8200248F83002000112C0032
-:103AF0009442001E001224003484000100A22825F4
-:103B00003C02400000A22825AC7000008FBF0020BE
-:103B1000AC6000048FB20018AC7300088FB10014C1
-:103B2000AC60000C8FB3001CAC6400108FB00010B0
-:103B3000AC60001424040001AC60001827BD00280C
-:103B40000A000DB8AC65001C8FBF00208FB3001CAD
-:103B50008FB200188FB100148FB0001003E000087E
-:103B600027BD00283C06800034C201009043000FAE
-:103B7000240200101062000E2865001110A000073A
-:103B800024020012240200082405003A10620006F4
-:103B90000000302103E0000800000000240500358B
-:103BA0001462FFFC000030210A000E6400000000D7
-:103BB0008CC200748F83FF9424420FA003E000089E
-:103BC000AC62000C27BDFFE8AFBF00100E0003423F
-:103BD000240500013C0480088FBF0010240200016E
-:103BE00034830080A462001227BD00182402000163
-:103BF00003E00008A080001A27BDFFE0AFB2001864
-:103C0000AFB10014AFB00010AFBF001C30B2FFFF67
-:103C10000E000332008088213C028008345000806E
-:103C20009202000924030004304200FF1443000CF8
-:103C30003C028008124000082402000A0E000E5BBD
-:103C400000000000920200052403FFFE0043102440
-:103C5000A202000524020012A20200093C02800810
-:103C600034420080022020210E00033DA0400027A6
-:103C700016400003022020210E000EBF00000000AD
-:103C800002202021324600FF8FBF001C8FB2001897
-:103C90008FB100148FB00010240500380A000E64A4
-:103CA00027BD002027BDFFE0AFBF001CAFB200184A
-:103CB000AFB10014AFB000100E00033200808021BD
-:103CC0000E000E5B000000003C02800834450080BE
-:103CD00090A2000924120018305100FF1232000394
-:103CE0000200202124020012A0A2000990A20005D7
-:103CF0002403FFFE004310240E00033DA0A2000594
-:103D00000200202124050020163200070000302187
-:103D10008FBF001C8FB200188FB100148FB000103D
-:103D20000A00034227BD00208FBF001C8FB200187D
-:103D30008FB100148FB00010240500390A000E6402
-:103D400027BD002027BDFFE83C028000AFB0001077
-:103D5000AFBF0014344201009442000C2405003629
-:103D60000080802114400012304600FF0E00033214
-:103D7000000000003C02800834420080240300124E
-:103D8000A043000990430005346300100E000E5B51
-:103D9000A04300050E00033D020020210200202167
-:103DA0000E000342240500200A000F3C0000000022
-:103DB0000E000E64000000000E00033202002021FD
-:103DC0003C0280089043001B2405FF9F0200202135
-:103DD000006518248FBF00148FB00010A043001B93
-:103DE0000A00033D27BD001827BDFFE0AFBF001844
-:103DF000AFB10014AFB0001030B100FF0E000332BD
-:103E0000008080213C02800824030012344200809C
-:103E10000E000E5BA04300090E00033D02002021AE
-:103E200002002021022030218FBF00188FB1001422
-:103E30008FB00010240500350A000E6427BD002055
-:103E40003C0480089083000E9082000A1443000B0B
-:103E5000000028218F82FF942403005024050001D4
-:103E600090420000304200FF1443000400000000B4
-:103E70009082000E24420001A082000E03E00008A0
-:103E800000A010213C0380008C6201F80440FFFE7A
-:103E900024020002AC6401C0A06201C43C02100014
-:103EA00003E00008AC6201F827BDFFE0AFB20018E4
-:103EB0003C128008AFB10014AFBF001CAFB00010BF
-:103EC00036510080922200092403000A304200FF8C
-:103ED0001443003E000000008E4300048E22003890
-:103EE000506200808FBF001C92220000240300500B
-:103EF000304200FF144300253C0280008C42014008
-:103F00008E4300043642010002202821AC43001CED
-:103F10009622005C8E2300383042FFFF00021040E2
-:103F200000621821AE23001C8E4300048E2400384A
-:103F30009622005C006418233042FFFF0003184300
-:103F4000000210400043102A10400006000000004C
-:103F50008E4200048E230038004310230A000FAA6B
-:103F6000000220439622005C3042FFFF0002204006
-:103F70003C0280083443010034420080ACA4002C91
-:103F8000A040002424020001A062000C0E000F5E7D
-:103F900000000000104000538FBF001C3C02800056
-:103FA0008C4401403C0380008C6201F80440FFFE19
-:103FB00024020002AC6401C0A06201C43C021000F3
-:103FC000AC6201F80A0010078FBF001C92220009A2
-:103FD00024030010304200FF144300043C02800020
-:103FE0008C4401400A000FEE0000282192220009B3
-:103FF00024030016304200FF14430006240200147C
-:10400000A22200093C0280008C4401400A001001F9
-:104010008FBF001C8E2200388E23003C00431023EB
-:10402000044100308FBF001C92220027244200016F
-:10403000A2220027922200272C42000414400016DE
-:104040003C1080009222000924030004304200FF4B
-:10405000144300093C0280008C4401408FBF001CC7
-:104060008FB200188FB100148FB000102405009398
-:104070000A000ECC27BD00208C440140240500938B
-:104080008FBF001C8FB200188FB100148FB00010CA
-:104090000A000F4827BD00208E0401400E000332A5
-:1040A000000000008E4200042442FFFFAE420004E4
-:1040B0008E22003C2442FFFFAE22003C0E00033D56
-:1040C0008E0401408E0401408FBF001C8FB2001887
-:1040D0008FB100148FB00010240500040A000342C1
-:1040E00027BD00208FB200188FB100148FB00010D0
-:1040F00003E0000827BD00203C0680008CC2018838
-:104100003C038008346500809063000E00021402B6
-:10411000304400FF306300FF1464000E3C0280084E
-:1041200090A20026304200FF104400098F82FF94C5
-:10413000A0A400262403005090420000304200FF5B
-:1041400014430006000000000A0005A18CC4018091
-:104150003C02800834420080A044002603E00008AE
-:104160000000000027BDFFE030E700FFAFB20018FD
-:10417000AFBF001CAFB10014AFB0001000809021A1
-:1041800014E0000630C600FF000000000000000D33
-:10419000000000000A001060240001163C038008A3
-:1041A0009062000E304200FF14460023346200800B
-:1041B00090420026304200FF1446001F000000001D
-:1041C0009062000F304200FF1446001B0000000008
-:1041D0009062000A304200FF144600038F90FF9463
-:1041E0000000000D8F90FF948F82FF983C1180009B
-:1041F000AE05003CAC450000A066000A0E0003328C
-:104200008E240100A20000240E00033D8E24010034
-:104210003C0380008C6201F80440FFFE240200028F
-:10422000AC7201C0A06201C43C021000AC6201F893
-:104230000A0010618FBF001C000000000000000D8C
-:10424000000000002400013F8FBF001C8FB2001847
-:104250008FB100148FB0001003E0000827BD0020CC
-:104260008F83FF943C0280008C44010034420100A3
-:104270008C65003C9046001B0A00102724070001B3
-:104280003C0280089043000E9042000A0043102632
-:10429000304200FF03E000080002102B27BDFFE0C2
-:1042A0003C028008AFB10014AFB00010AFBF0018DF
-:1042B0003450008092020005240300303042003068
-:1042C00014430085008088218F8200248C42000CDA
-:1042D000104000828FBF00180E000D840000000007
-:1042E0008F860020ACD100009202000892030009E2
-:1042F000304200FF00021200306300FF004310252F
-:10430000ACC200049202004D000216000002160327
-:1043100004410005000000003C0308008C630048D5
-:104320000A00109F3C1080089202000830420040B2
-:10433000144000030000182192020027304300FFC0
-:104340003C108008361100809222004D00031E00B0
-:10435000304200FF0002140000621825ACC30008C0
-:104360008E2400308F820024ACC4000C8E250034D3
-:104370009443001E3C02C00BACC50010006218251F
-:104380008E22003800002021ACC200148E22003C96
-:10439000ACC200180E000DB8ACC3001C8E020004A5
-:1043A0008F8400203C058000AC8200008E2200201B
-:1043B000AC8200048E22001CAC8200088E220058C1
-:1043C0008CA3007400431021AC82000C8E22002CC0
-:1043D000AC8200108E2200408E23004400021400A4
-:1043E00000431025AC8200149222004D240300806B
-:1043F000304200FF1443000400000000AC800018AD
-:104400000A0010E38F8200248E23000C2402000196
-:104410001062000E2402FFFF92220008304200408A
-:104420001440000A2402FFFF8E23000C8CA20074AB
-:10443000006218233C0208000062102414400002AD
-:10444000000028210060282100051043AC820018DC
-:104450008F820024000020219443001E3C02C00CE7
-:10446000006218258F8200200E000DB8AC43001C9E
-:104470003C038008346201008C4200008F850020DC
-:10448000346300808FBF0018ACA20000ACA0000411
-:104490008C6400488F8200248FB10014ACA4000803
-:1044A000ACA0000CACA00010906300059446001E68
-:1044B0003C02400D00031E0000C23025ACA30014D6
-:1044C0008FB00010ACA0001824040001ACA6001CA2
-:1044D0000A000DB827BD00208FBF00188FB100144F
-:1044E0008FB0001003E0000827BD00203C028000D0
-:1044F0009443007C3C02800834460100308400FF75
-:104500003065FFFF2402000524A34650A0C4000C20
-:104510005482000C3065FFFF90C2000D2C42000752
-:104520001040000724A30A0090C3000D24020014C9
-:104530000062100400A210210A00111F3045FFFF85
-:104540003065FFFF3C0280083442008003E0000831
-:10455000A44500143C03800834680080AD05003891
-:10456000346701008CE2001C308400FF00A210239D
-:104570001840000330C600FF24A2FFFCACE2001C80
-:1045800030820001504000083C0380088D02003C4E
-:1045900000A2102304410012240400058C620004D0
-:1045A00010A2000F3C0380088C62000414A2001EBD
-:1045B000000000003C0208008C4200D8304200207D
-:1045C000104000093C0280083462008090630008BB
-:1045D0009042004C144300043C0280082404000470
-:1045E0000A00110900000000344300803442010039
-:1045F000A040000C24020001A462001410C0000AB4
-:104600003C0280008C4401003C0380008C6201F875
-:104610000440FFFE24020002AC6401C0A06201C499
-:104620003C021000AC6201F803E00008000000004A
-:1046300027BDFFE800A61823AFBF00101860008058
-:10464000308800FF3C02800834470080A0E000244E
-:1046500034440100A0E000278C82001C00A210233B
-:1046600004400056000000008CE2003C94E3005C33
-:104670008CE4002C004530233063FFFF00C3182179
-:104680000083202B1080000400E018218CE2002C15
-:104690000A00117800A2102194E2005C3042FFFF72
-:1046A00000C2102100A21021AC62001C3C02800854
-:1046B000344400809482005C8C83001C3042FFFFF5
-:1046C0000002104000A210210043102B10400004F3
-:1046D000000000008C82001C0A00118B3C06800840
-:1046E0009482005C3042FFFF0002104000A21021C3
-:1046F0003C06800834C3010034C70080AC82001C33
-:10470000A060000CACE500388C62001C00A21023F5
-:104710001840000224A2FFFCAC62001C3102000120
-:10472000104000083C0380088CE2003C00A21023EB
-:1047300004410012240400058CC2000410A20010E1
-:104740008FBF00108C62000414A2004F8FBF0010B6
-:104750003C0208008C4200D8304200201040000A81
-:104760003C02800834620080906300089042004C54
-:10477000144300053C028008240400048FBF00108D
-:104780000A00110927BD001834430080344201009B
-:10479000A040000C24020001A46200143C0280002E
-:1047A0008C4401003C0380008C6201F80440FFFE51
-:1047B000240200020A0011D8000000008CE2001C54
-:1047C000004610230043102B54400001ACE5001CB0
-:1047D00094E2005C3042FFFF0062102B144000079F
-:1047E0002402000294E2005C8CE3001C3042FFFFD4
-:1047F00000621821ACE3001C24020002ACE5003882
-:104800000E000F5EA082000C1040001F8FBF001032
-:104810003C0280008C4401003C0380008C6201F863
-:104820000440FFFE24020002AC6401C0A06201C487
-:104830003C021000AC6201F80A0011F08FBF0010BA
-:1048400031020010104000108FBF00103C028008A1
-:10485000344500808CA3001C94A2005C00661823E1
-:104860003042FFFF006218213C023FFF3444FFFF4B
-:104870000083102B544000010080182100C3102138
-:10488000ACA2001C8FBF001003E0000827BD001879
-:1048900027BDFFE800C0402100A63023AFBF0010B5
-:1048A00018C00026308A00FF3C028008344900808E
-:1048B0008D24001C8D23002C008820230064182BDD
-:1048C0001060000F344701008CE2002000461021E8
-:1048D000ACE200208CE200200044102B1440000BBE
-:1048E0003C023FFF8CE2002000441023ACE2002099
-:1048F0009522005C3042FFFF0A0012100082202146
-:10490000ACE00020008620213C023FFF3443FFFF43
-:104910000064102B54400001006020213C028008FC
-:104920003442008000851821AC43001CA0400024C4
-:10493000A04000270A0012623C03800831420010A8
-:10494000104000433C0380083C06800834C40080CB
-:104950008C82003C004810235840003E34660080A2
-:104960009082002424420001A0820024908200242E
-:104970003C0308008C630024304200FF0043102BEE
-:10498000144000688FBF001034C201008C42001C2C
-:1049900000A2102318400063000000008CC3000434
-:1049A0009482005C006818233042FFFF0003184324
-:1049B000000210400043102A1040000500000000D3
-:1049C0008CC20004004810230A0012450002104364
-:1049D0009482005C3042FFFF000210403C068008D9
-:1049E000AC82002C34C5008094A2005C8CA4002C06
-:1049F00094A3005C3042FFFF00021040008220219F
-:104A00003063FFFF0083202101041021ACA2001CB1
-:104A10008CC2000434C60100ACC2001C2402000297
-:104A20000E000F5EA0C2000C1040003E8FBF0010B1
-:104A30003C0280008C4401003C0380008C6201F841
-:104A40000440FFFE240200020A001292000000004F
-:104A500034660080ACC50038346401008C82001CD0
-:104A600000A210231840000224A2FFFCAC82001C0C
-:104A7000314200015040000A3C0380088CC2003CD7
-:104A800000A2102304430014240400058C620004D7
-:104A900014A200033C0380080A00128424040005C9
-:104AA0008C62000414A2001F8FBF00103C0208009B
-:104AB0008C4200D8304200201040000A3C0280089E
-:104AC00034620080906300089042004C144300055B
-:104AD0003C028008240400048FBF00100A00110962
-:104AE00027BD00183443008034420100A040000C70
-:104AF00024020001A46200143C0280008C440100E6
-:104B00003C0380008C6201F80440FFFE2402000296
-:104B1000AC6401C0A06201C43C021000AC6201F8A8
-:104B20008FBF001003E0000827BD001827BDFFE875
-:104B30003C0A8008AFBF0010354900808D22003C40
-:104B400000C04021308400FF004610231840009D23
-:104B500030E700FF354701002402000100A63023A2
-:104B6000A0E0000CA0E0000DA522001418C0002455
-:104B7000308200108D23001C8D22002C0068182329
-:104B80000043102B1040000F000000008CE20020BA
-:104B900000461021ACE200208CE200200043102BE4
-:104BA0001440000B3C023FFF8CE200200043102326
-:104BB000ACE200209522005C3042FFFF0A0012C1E7
-:104BC00000621821ACE00020006618213C023FFF83
-:104BD0003446FFFF00C3102B5440000100C01821D1
-:104BE0003C0280083442008000651821AC43001C60
-:104BF000A0400024A04000270A00130F3C038008B7
-:104C0000104000403C0380088D22003C00481023E7
-:104C10005840003D34670080912200242442000166
-:104C2000A1220024912200243C0308008C6300246C
-:104C3000304200FF0043102B1440009A8FBF001039
-:104C40008CE2001C00A21023184000960000000017
-:104C50008D4300049522005C006818233042FFFF5A
-:104C600000031843000210400043102A10400005C2
-:104C7000012020218D420004004810230A0012F276
-:104C8000000210439522005C3042FFFF00021040FA
-:104C90003C068008AC82002C34C5008094A2005CE5
-:104CA0008CA4002C94A3005C3042FFFF0002104053
-:104CB000008220213063FFFF0083182101031021AF
-:104CC000ACA2001C8CC2000434C60100ACC2001CA3
-:104CD000240200020E000F5EA0C2000C1040007102
-:104CE0008FBF00103C0280008C4401003C03800018
-:104CF0008C6201F80440FFFE240200020A0013390E
-:104D00000000000034670080ACE500383466010024
-:104D10008CC2001C00A210231840000224A2FFFC39
-:104D2000ACC2001C30820001504000083C038008E7
-:104D30008CE2003C00A2102304430051240400052F
-:104D40008C62000410A2003E3C0380088C620004C8
-:104D500054A200548FBF00103C0208008C4200D8BF
-:104D600030420020104000063C028008346200807F
-:104D7000906300089042004C104300403C028008C1
-:104D80003443008034420100A040000C24020001A2
-:104D9000A46200143C0280008C4401003C038000AB
-:104DA0008C6201F80440FFFE24020002AC6401C0E2
-:104DB000A06201C43C021000AC6201F80A00137743
-:104DC0008FBF001024020005A120002714E2000A72
-:104DD0003C038008354301009062000D2C42000620
-:104DE000504000053C0380089062000D2442000101
-:104DF000A062000D3C03800834670080ACE50038F9
-:104E0000346601008CC2001C00A21023184000026E
-:104E100024A2FFFCACC2001C308200015040000AFA
-:104E20003C0380088CE2003C00A2102304410014E3
-:104E3000240400058C62000414A200033C038008D3
-:104E40000A00136E240400058C62000414A20015ED
-:104E50008FBF00103C0208008C4200D83042002076
-:104E60001040000A3C028008346200809063000811
-:104E70009042004C144300053C02800824040004C6
-:104E80008FBF00100A00110927BD001834430080AD
-:104E900034420100A040000C24020001A46200146E
-:104EA0008FBF001003E0000827BD00183C0B8008EE
-:104EB00027BDFFE83C028000AFBF00103442010074
-:104EC000356A00809044000A356901008C45001461
-:104ED0008D4800389123000C308400FF0105102319
-:104EE0001C4000B3306700FF2CE20006504000B1C8
-:104EF0008FBF00102402000100E2300430C2000322
-:104F00005440000800A8302330C2000C144000A117
-:104F100030C20030144000A38FBF00100A00143BC1
-:104F20000000000018C00024308200108D43001CD7
-:104F30008D42002C006818230043102B1040000FF6
-:104F4000000000008D22002000461021AD2200202C
-:104F50008D2200200043102B1440000B3C023FFF29
-:104F60008D22002000431023AD2200209542005CDA
-:104F70003042FFFF0A0013AF00621821AD2000206D
-:104F8000006618213C023FFF3446FFFF00C3102B90
-:104F90005440000100C018213C02800834420080C7
-:104FA00000651821AC43001CA0400024A04000274D
-:104FB0000A0013FD3C038008104000403C038008B9
-:104FC0008D42003C004810231840003D34670080AB
-:104FD0009142002424420001A14200249142002475
-:104FE0003C0308008C630024304200FF0043102B78
-:104FF000144000708FBF00108D22001C00A21023EF
-:105000001840006C000000008D6300049542005CB5
-:10501000006818233042FFFF0003184300021040CD
-:105020000043102A10400005014020218D62000439
-:10503000004810230A0013E0000210439542005C70
-:105040003042FFFF000210403C068008AC82002C7A
-:1050500034C5008094A2005C8CA4002C94A3005C56
-:105060003042FFFF00021040008220213063FFFF2A
-:105070000083182101031021ACA2001C8CC2000483
-:1050800034C60100ACC2001C240200020E000F5EF8
-:10509000A0C2000C104000478FBF00103C028000EF
-:1050A0008C4401003C0380008C6201F80440FFFE48
-:1050B000240200020A00142D000000003467008062
-:1050C000ACE50038346601008CC2001C00A210233D
-:1050D0001840000224A2FFFCACC2001C3082000178
-:1050E0005040000A3C0380088CE2003C00A21023E0
-:1050F00004430014240400058C62000414A200037D
-:105100003C0380080A00141F240400058C6200047C
-:1051100014A200288FBF00103C0208008C4200D867
-:10512000304200201040000A3C02800834620080B7
-:10513000906300089042004C144300053C02800834
-:10514000240400048FBF00100A00110927BD0018B5
-:105150003443008034420100A040000C24020001CE
-:10516000A46200143C0280008C4401003C038000D7
-:105170008C6201F80440FFFE24020002AC6401C00E
-:10518000A06201C43C021000AC6201F80A00143BAA
-:105190008FBF00108FBF0010010030210A00115A8C
-:1051A00027BD0018010030210A00129927BD001800
-:1051B0008FBF001003E0000827BD00183C038008E3
-:1051C0003464010024020003A082000C8C620004FD
-:1051D00003E00008AC82001C3C05800834A300807A
-:1051E0009062002734A501002406004324420001F8
-:1051F000A0620027906300273C0208008C42004810
-:10520000306300FF146200043C07602194A500EAAB
-:105210000A00090130A5FFFF03E0000800000000BC
-:1052200027BDFFE8AFBF00103C0280000E00144411
-:105230008C4401803C02800834430100A060000CD3
-:105240008C4200048FBF001027BD001803E0000847
-:10525000AC62001C27BDFFE03C028008AFBF001815
-:10526000AFB10014AFB000103445008034460100E7
-:105270003C0880008D09014090C3000C8CA4003CC8
-:105280008CA200381482003B306700FF9502007C3E
-:1052900090A30027146000093045FFFF2402000599
-:1052A00054E200083C04800890C2000D2442000132
-:1052B000A0C2000D0A00147F3C048008A0C0000DAD
-:1052C0003C048008348201009042000C2403000555
-:1052D000304200FF1443000A24A205DC348300801E
-:1052E000906200272C4200075040000524A20A00CB
-:1052F00090630027240200140062100400A2102111
-:105300003C108008361000803045FFFF012020212E
-:105310000E001444A60500149602005C8E030038AB
-:105320003C1180003042FFFF000210400062182153
-:10533000AE03001C0E0003328E24014092020025B1
-:1053400034420040A20200250E00033D8E2401409D
-:105350008E2401403C0380008C6201F80440FFFE73
-:1053600024020002AC6401C0A06201C43C0210002F
-:10537000AC6201F88FBF00188FB100148FB000101D
-:1053800003E0000827BD00203C0360103C02080039
-:1053900024420174AC62502C8C6250003C048000AA
-:1053A00034420080AC6250003C0208002442547C2D
-:1053B0003C010800AC2256003C020800244254384C
-:1053C0003C010800AC2256043C020002AC840008F8
-:1053D000AC82000C03E000082402000100A0302190
-:1053E0003C1C0800279C56083C0200023C050400B7
-:1053F00000852826008220260004102B2CA5000101
-:105400002C840001000210803C0308002463560035
-:105410000085202500431821108000030000102182
-:10542000AC6600002402000103E000080000000058
-:105430003C1C0800279C56083C0200023C05040066
-:1054400000852826008220260004102B2CA50001B0
-:105450002C840001000210803C03080024635600E5
-:105460000085202500431821108000050000102130
-:105470003C02080024425438AC62000024020001BF
-:1054800003E00008000000003C0200023C030400AE
-:1054900000821026008318262C4200012C63000194
-:1054A000004310251040000B000028213C1C080080
-:1054B000279C56083C0380008C62000824050001EC
-:1054C00000431025AC6200088C62000C00441025DB
-:1054D000AC62000C03E0000800A010213C1C080096
-:1054E000279C56083C0580008CA3000C0004202754
-:1054F000240200010064182403E00008ACA3000C9F
-:105500003C020002148200063C0560008CA208D018
-:105510002403FFFE0043102403E00008ACA208D0DF
-:105520003C02040014820005000000008CA208D098
-:105530002403FFFD00431024ACA208D003E00008C0
-:10554000000000003C02601A344200108C430080CE
-:1055500027BDFFF88C440084AFA3000093A3000094
-:10556000240200041462001AAFA4000493A20001F4
-:105570001040000797A300023062FFFC3C0380004C
-:10558000004310218C4200000A001536AFA200042F
-:105590003062FFFC3C03800000431021AC4400005B
-:1055A000A3A000003C0560008CA208D02403FFFEED
-:1055B0003C04601A00431024ACA208D08FA300045E
-:1055C0008FA2000034840010AC830084AC82008081
-:1055D00003E0000827BD000827BDFFE8AFBF0010AB
-:1055E0003C1C0800279C56083C0280008C43000CA1
-:1055F0008C420004004318243C0200021060001496
-:10560000006228243C0204003C04000210A00005B3
-:10561000006210243C0208008C4256000A00155B10
-:1056200000000000104000073C0404003C02080099
-:105630008C4256040040F809000000000A00156082
-:10564000000000000000000D3C1C0800279C5608CC
-:0C5650008FBF001003E0000827BD001809
-:04565C008008024080
-:1056600080080100800800808008000000000C8095
-:105670000000320008000E9808000EF408000F88A1
-:1056800008001028080010748008010080080080BD
-:04569000800800008E
-:0C5694000A0000280000000000000000D8
-:1056A0000000000D6370362E322E316100000000C4
-:1056B00006020104000000000000000000000000DD
-:1056C000000000000000000038003C000000000066
-:1056D00000000000000000000000000000000020AA
-:1056E00000000000000000000000000000000000BA
-:1056F00000000000000000000000000000000000AA
-:10570000000000000000000021003800000000013F
-:105710000000002B000000000000000400030D400A
-:105720000000000000000000000000000000000079
-:105730000000000000000000100000030000000056
-:105740000000000D0000000D3C020800244259AC8E
-:105750003C03080024635BF4AC4000000043202BB2
-:105760001480FFFD244200043C1D080037BD9FFC4F
-:1057700003A0F0213C100800261000A03C1C0800EB
-:10578000279C59AC0E0002F6000000000000000D3E
-:1057900027BDFFB4AFA10000AFA20004AFA3000873
-:1057A000AFA4000CAFA50010AFA60014AFA700185F
-:1057B000AFA8001CAFA90020AFAA0024AFAB0028FF
-:1057C000AFAC002CAFAD0030AFAE0034AFAF00389F
-:1057D000AFB8003CAFB90040AFBC0044AFBF004819
-:1057E0000E000820000000008FBF00488FBC00445E
-:1057F0008FB900408FB8003C8FAF00388FAE0034B7
-:105800008FAD00308FAC002C8FAB00288FAA002406
-:105810008FA900208FA8001C8FA700188FA6001446
-:105820008FA500108FA4000C8FA300088FA2000486
-:105830008FA1000027BD004C3C1B60188F7A5030B0
-:10584000377B502803400008AF7A000000A01821E1
-:1058500000801021008028213C0460003C0760008B
-:105860002406000810600006348420788C42000072
-:10587000ACE220088C63000003E00008ACE3200CDD
-:105880000A000F8100000000240300403C02600079
-:1058900003E00008AC4320003C0760008F86000452
-:1058A0008CE520740086102100A2182B14600007DC
-:1058B000000028218F8AFDA024050001A1440013C7
-:1058C0008F89000401244021AF88000403E0000810
-:1058D00000A010218F84FDA08F8500049086001306
-:1058E00030C300FF00A31023AF82000403E00008D0
-:1058F000A08000138F84FDA027BDFFE8AFB000108B
-:10590000AFBF001490890011908700112402002875
-:10591000312800FF3906002830E300FF2485002CE1
-:105920002CD00001106200162484001C0E00006EB2
-:10593000000000008F8FFDA03C05600024020204DF
-:1059400095EE003E95ED003C000E5C0031ACFFFF93
-:10595000016C5025ACAA2010520000012402000462
-:10596000ACA22000000000000000000000000000C9
-:105970008FBF00148FB0001003E0000827BD00188F
-:105980000A0000A6000028218F85FDA027BDFFD8B2
-:10599000AFBF0020AFB3001CAFB20018AFB100140E
-:1059A000AFB000100080982190A4001124B0001C1A
-:1059B00024B1002C308300FF386200280E000090D4
-:1059C0002C5200010E00009800000000020020216F
-:1059D0001240000202202821000028210E00006E43
-:1059E000000000008F8DFDA03C0880003C05600099
-:1059F00095AC003E95AB003C02683025000C4C0095
-:105A0000316AFFFF012A3825ACA7201024020202C8
-:105A1000ACA6201452400001240200028FBF0020D7
-:105A20008FB3001C8FB200188FB100148FB000101C
-:105A300027BD002803E00008ACA2200027BDFFE03E
-:105A4000AFB20018AFB10014AFB00010AFBF001C70
-:105A50003C1160008E2320748F82000430D0FFFF41
-:105A600030F2FFFF1062000C2406008F0E00006E63
-:105A7000000000003C06801F0010440034C5FF00F9
-:105A80000112382524040002AE2720100000302126
-:105A9000AE252014AE2420008FBF001C8FB200184A
-:105AA0008FB100148FB0001000C0102103E0000877
-:105AB00027BD002027BDFFE0AFB0001030D0FFFFB2
-:105AC000AFBF0018AFB100140E00006E30F1FFFF41
-:105AD00000102400009180253C036000AC70201071
-:105AE0008FBF00188FB100148FB000102402000483
-:105AF000AC62200027BD002003E000080000102158
-:105B000027BDFFE03C046018AFBF0018AFB1001420
-:105B1000AFB000108C8850002403FF7F34028071E6
-:105B20000103382434E5380C241F00313C1980006F
-:105B3000AC8550003C11800AAC8253BCAF3F0008DA
-:105B40000E00054CAF9100400E00050A3C116000AC
-:105B50000E00007D000000008E3008083C0F570941
-:105B60002418FFF00218602435EEE00035EDF00057
-:105B7000018E5026018D58262D4600012D69000109
-:105B8000AF86004C0E000D09AF8900503C06601630
-:105B90008CC700003C0860148D0500A03C03FFFF8B
-:105BA00000E320243C02535300052FC2108200550D
-:105BB00034D07C00960201F2A780006C10400003F4
-:105BC000A780007C384B1E1EA78B006C960201F844
-:105BD000104000048F8D0050384C1E1EA78C007C96
-:105BE0008F8D005011A000058F83004C240E0020E3
-:105BF000A78E007CA78E006C8F83004C1060000580
-:105C00009785007C240F0020A78F007CA78F006C55
-:105C10009785007C2CB8008153000001240500808A
-:105C20009784006C2C91040152200001240404008C
-:105C30001060000B3C0260008FBF00188FB1001491
-:105C40008FB0001027BD0020A784006CA785007CC2
-:105C5000A380007EA780007403E00008A780009264
-:105C60008C4704382419103C30FFFFFF13F9000360
-:105C700030A8FFFF1100004624030050A380007EDF
-:105C80009386007E50C00024A785007CA780007CFE
-:105C90009798007CA780006CA7800074A780009272
-:105CA0003C010800AC3800800E00078700000000AF
-:105CB0003C0F60008DED0808240EFFF03C0B600ED9
-:105CC000260C0388356A00100000482100002821B6
-:105CD00001AE20243C105709AF8C0010AF8A004859
-:105CE000AF89001810900023AF8500148FBF0018F3
-:105CF0008FB100148FB0001027BD002003E0000812
-:105D0000AF80005400055080014648218D260004D4
-:105D10000A00014800D180219798007CA784006C7C
-:105D2000A7800074A78000923C010800AC38008076
-:105D30000E000787000000003C0F60008DED080892
-:105D4000240EFFF03C0B600E260C0388356A001011
-:105D5000000048210000282101AE20243C105709F2
-:105D6000AF8C0010AF8A0048AF8900181490FFDF95
-:105D7000AF85001424110001AF9100548FBF0018AB
-:105D80008FB100148FB0001003E0000827BD002081
-:105D90000A00017BA383007E3083FFFF8F880040D1
-:105DA0008F87003C000321403C0580003C020050EE
-:105DB000008248253C0660003C0A010034AC040027
-:105DC0008CCD08E001AA58241160000500000000F5
-:105DD0008CCF08E024E7000101EA7025ACCE08E092
-:105DE0008D19001001805821ACB900388D180014AD
-:105DF000ACB8003CACA9003000000000000000007E
-:105E00000000000000000000000000000000000092
-:105E100000000000000000003C0380008C640000D3
-:105E2000308200201040FFFD3C0F60008DED08E047
-:105E30003C0E010001AE18241460FFE100000000D8
-:105E4000AF87003C03E00008AF8B00588F8500400F
-:105E5000240BFFF03C06800094A7001A8CA90024B4
-:105E600030ECFFFF000C38C000EB5024012A402129
-:105E7000ACC8003C8CA400248CC3003C00831023DD
-:105E800018400033000000008CAD002025A2000166
-:105E90003C0F0050ACC2003835EE00103C068000CC
-:105EA000ACCE003000000000000000000000000048
-:105EB00000000000000000000000000000000000E2
-:105EC000000000003C0480008C9900003338002062
-:105ED0001300FFFD30E20008104000173C0980006D
-:105EE0008C880408ACA800108C83040CACA30014AC
-:105EF0003C1900203C188000AF19003094AE001807
-:105F000094AF001C01CF3021A4A6001894AD001A54
-:105F100025A70001A4A7001A94AB001A94AC001E98
-:105F2000118B00030000000003E0000800000000E7
-:105F300003E00008A4A0001A8D2A0400ACAA0010F7
-:105F40008D240404ACA400140A0002183C1900209B
-:105F50008CA200200A0002003C0F00500A0001EE53
-:105F60000000000027BDFFE8AFBF00100E000232A6
-:105F7000000000008F8900408FBF00103C038000AC
-:105F8000A520000A9528000A9527000427BD0018BF
-:105F90003105FFFF30E6000F0006150000A22025A6
-:105FA00003E00008AC6400803C0508008CA50020DC
-:105FB0008F83000C27BDFFE8AFB00010AFBF001407
-:105FC00010A300100000802124040001020430040A
-:105FD00000A6202400C3102450440006261000010F
-:105FE000001018802787FDA41480000A006718217C
-:105FF000261000012E0900025520FFF38F83000CAC
-:10600000AF85000C8FBF00148FB0001003E00008B4
-:1060100027BD00188C6800003C058000ACA8002457
-:106020000E000234261000013C0508008CA500205B
-:106030000A0002592E0900022405000100851804F7
-:106040003C0408008C84002027BDFFC8AFBF00348B
-:1060500000831024AFBE0030AFB7002CAFB60028CD
-:10606000AFB50024AFB40020AFB3001CAFB200182E
-:10607000AFB1001410400051AFB000108F84004049
-:10608000948700069488000A00E8302330D5FFFF8B
-:1060900012A0004B8FBF0034948B0018948C000A20
-:1060A000016C50233142FFFF02A2482B1520000251
-:1060B00002A02021004020212C8F000515E00002C5
-:1060C00000809821241300040E0001C102602021E9
-:1060D0008F87004002609021AF80004494F4000A52
-:1060E000026080211260004E3291FFFF3C1670006A
-:1060F0003C1440003C1E20003C1760008F99005863
-:106100008F380000031618241074004F0283F82BF8
-:1061100017E0003600000000107E00478F86004424
-:1061200014C0003A2403000102031023022320219B
-:106130003050FFFF1600FFF13091FFFF8F870040C6
-:106140003C1100203C108000AE11003094EB000A9E
-:106150003C178000024B5021A4EA000A94E9000A8F
-:1061600094E800043123FFFF3106000F00062D00E4
-:106170000065F025AEFE008094F3000A94F6001846
-:1061800012D30036001221408CFF00148CF4001052
-:1061900003E468210000C02101A4782B029870213B
-:1061A00001CF6021ACED0014ACEC001002B238233A
-:1061B00030F5FFFF16A0FFB88F8400408FBF00347A
-:1061C0008FBE00308FB7002C8FB600288FB500240B
-:1061D0008FB400208FB3001C8FB200188FB1001451
-:1061E0008FB0001003E0000827BD00381477FFCC03
-:1061F0008F8600440E000EE202002021004018218C
-:106200008F86004410C0FFC9020310230270702360
-:106210008F87004001C368210A0002E431B2FFFF0A
-:106220008F86004414C0FFC93C1100203C10800040
-:106230000A0002AEAE1100300E00046602002021FA
-:106240000A0002DB00401821020020210E0009395B
-:10625000022028210A0002DB004018210E0001EE76
-:10626000000000000A0002C702B2382327BDFFC8A1
-:10627000AFB7002CAFB60028AFB50024AFB40020F4
-:10628000AFB3001CAFB20018AFB10014AFB0001034
-:10629000AFBF00300E00011B241300013C047FFF40
-:1062A0003C0380083C0220003C010800AC20007048
-:1062B0003496FFFF34770080345200033C1512C03F
-:1062C000241400013C1080002411FF800E000245C0
-:1062D000000000008F8700488F8B00188F89001402
-:1062E0008CEA00EC8CE800E8014B302B01092823F4
-:1062F00000A6102314400006014B18231440000E82
-:106300003C05800002A3602B1180000B0000000000
-:106310003C0560008CEE00EC8CED00E88CA4180CC1
-:10632000AF8E001804800053AF8D00148F8F0010C3
-:10633000ADF400003C0580008CBF00003BF900017B
-:10634000333800011700FFE13C0380008C6201003C
-:1063500024060C0010460009000000008C680100B3
-:106360002D043080548000103C0480008C690100B2
-:106370002D2331811060000C3C0480008CAA0100A8
-:1063800011460004000020218CA6010024C5FF81D5
-:1063900030A400FF8E0B01000E000269AE0B00243A
-:1063A0000A00034F3C0480008C8D01002DAC3300AB
-:1063B00011800022000000003C0708008CE70098D4
-:1063C00024EE00013C010800AC2E00983C04800043
-:1063D0008C8201001440000300000000566000148D
-:1063E0003C0440008C9F01008C9801000000982123
-:1063F00003F1C82400193940330F007F00EF7025E6
-:1064000001D26825AC8D08308C8C01008C85010090
-:10641000258B0100017130240006514030A3007F1C
-:106420000143482501324025AC8808303C04400037
-:10643000AE0401380A00030E000000008C99010030
-:10644000240F0020AC99002092F80000330300FFD5
-:10645000106F000C241F0050547FFFDD3C048000AF
-:106460008C8401000E00154E000000000A00034F4E
-:106470003C04800000963824ACA7180C0A000327BF
-:106480008F8F00108C8501000E0008F72404008017
-:106490000A00034F3C04800000A4102B24030001D9
-:1064A00010400009000030210005284000A4102BF6
-:1064B00004A00003000318405440FFFC00052840DE
-:1064C0005060000A0004182B0085382B54E00004AB
-:1064D0000003184200C33025008520230003184222
-:1064E0001460FFF9000528420004182B03E000089F
-:1064F00000C310213084FFFF30C600FF3C0780003E
-:106500008CE201B80440FFFE00064C000124302557
-:106510003C08200000C820253C031000ACE00180AE
-:10652000ACE50184ACE4018803E00008ACE301B809
-:106530003C0660008CC5201C2402FFF03083020062
-:10654000308601001060000E00A2282434A500014E
-:106550003087300010E0000530830C0034A50004C3
-:106560003C04600003E00008AC85201C1060FFFDC7
-:106570003C04600034A5000803E00008AC85201C42
-:1065800054C0FFF334A500020A0003B03087300086
-:1065900027BDFFE8AFB00010AFBF00143C0760009C
-:1065A000240600021080001100A080218F83005873
-:1065B0000E0003A78C6400188F8200580000202171
-:1065C000240600018C45000C0E000398000000001A
-:1065D0001600000224020003000010218FBF0014E7
-:1065E0008FB0001003E0000827BD00188CE8201CC5
-:1065F0002409FFF001092824ACE5201C8F870058EE
-:106600000A0003CD8CE5000C3C02600E00804021A6
-:1066100034460100240900180000000000000000BA
-:10662000000000003C0A00503C0380003547020097
-:10663000AC68003834640400AC65003CAC670030E2
-:106640008C6C0000318B00201160FFFD2407FFFFE0
-:106650002403007F8C8D00002463FFFF248400044A
-:10666000ACCD00001467FFFB24C60004000000004E
-:10667000000000000000000024A402000085282B78
-:106680003C0300203C0E80002529FFFF010540212E
-:10669000ADC300301520FFE00080282103E0000892
-:1066A000000000008F82005827BDFFD8AFB3001C48
-:1066B000AFBF0020AFB20018AFB10014AFB00010F0
-:1066C00094460002008098218C5200182CC300814F
-:1066D0008C4800048C4700088C51000C8C49001039
-:1066E000106000078C4A00142CC4000414800013AE
-:1066F00030EB000730C5000310A0001000000000C0
-:106700002410008B02002021022028210E00039873
-:10671000240600031660000224020003000010217A
-:106720008FBF00208FB3001C8FB200188FB10014F0
-:106730008FB0001003E0000827BD00281560FFF1AE
-:106740002410008B3C0C80003C030020241F00011F
-:10675000AD830030AF9F0044000000000000000047
-:10676000000000002419FFF024D8000F031978243A
-:106770003C1000D0AD88003801F0702524CD000316
-:106780003C08600EAD87003C35850400AD8E0030BE
-:10679000000D38823504003C3C0380008C6B000007
-:1067A000316200201040FFFD0000000010E00008F2
-:1067B00024E3FFFF2407FFFF8CA800002463FFFFF2
-:1067C00024A50004AC8800001467FFFB24840004A7
-:1067D0003C05600EACA60038000000000000000080
-:1067E000000000008F8600543C0400203C0780001D
-:1067F000ACE4003054C000060120202102402021DA
-:106800000E0003A7000080210A00041D02002021C1
-:106810000E0003DD01402821024020210E0003A7C5
-:10682000000080210A00041D0200202127BDFFE096
-:10683000AFB200183092FFFFAFB10014AFBF001C21
-:10684000AFB000101640000D000088210A0004932C
-:106850000220102124050003508500278CE5000C40
-:106860000000000D262800013111FFFF24E2002066
-:106870000232802B12000019AF8200588F82004430
-:10688000144000168F8700583C0670003C0320001F
-:106890008CE5000000A62024148300108F84006083
-:1068A000000544023C09800000A980241480FFE90F
-:1068B000310600FF2CCA000B5140FFEB26280001D7
-:1068C000000668803C0E080025CE575801AE6021B6
-:1068D0008D8B0000016000080000000002201021E4
-:1068E0008FBF001C8FB200188FB100148FB0001042
-:1068F00003E0000827BD00200E0003982404008454
-:106900001600FFD88F8700580A000474AF8000601B
-:10691000020028210E0003BF240400018F870058C5
-:106920000A000474AF820060020028210E0003BF39
-:10693000000020210A0004A38F8700580E000404E1
-:10694000020020218F8700580A000474AF82006083
-:1069500030AFFFFF000F19C03C0480008C9001B8DD
-:106960000600FFFE3C1920043C181000AC83018097
-:10697000AC800184AC990188AC9801B80A00047518
-:106980002628000190E2000390E30002000020218D
-:106990000002FE0000033A0000FF2825240600083C
-:1069A0000E000398000000001600FFDC2402000324
-:1069B0008F870058000010210A000474AF82006025
-:1069C00090E8000200002021240600090A0004C308
-:1069D00000082E0090E4000C240900FF308500FF21
-:1069E00010A900150000302190F9000290F8000372
-:1069F000308F00FF94EB000400196E000018740043
-:106A0000000F62000186202501AE5025014B28258C
-:106A10003084FF8B0A0004C32406000A90E30002BE
-:106A200090FF0004000020210003360000DF28252D
-:106A30000A0004C32406000B0A0004D52406008BB8
-:106A4000000449C23127003F000443423C02800059
-:106A500000082040240316802CE60020AC43002CC4
-:106A600024EAFFE02482000114C0000330A900FFE3
-:106A700000801021314700FF000260803C0D800043
-:106A8000240A0001018D20213C0B000E00EA28049D
-:106A9000008B302111200005000538278CCE000026
-:106AA00001C5382503E00008ACC700008CD8000001
-:106AB0000307782403E00008ACCF000027BDFFE007
-:106AC000AFB10014AFB00010AFBF00183C076000BA
-:106AD0008CE408083402F0003C1160003083F000C0
-:106AE000240501C03C04800E000030211062000625
-:106AF000241000018CEA08083149F0003928E00030
-:106B00000008382B000780403C0D0200AE2D081411
-:106B1000240C16803C0B80008E2744000E000F8B47
-:106B2000AD6C002C120000043C02169124050001FB
-:106B3000120500103C023D2C345800E0AE384408E9
-:106B40003C1108008E31007C8FBF00183C066000AD
-:106B500000118540360F16808FB100148FB00010E1
-:106B60003C0E020027BD0020ACCF442003E000080B
-:106B7000ACCE08103C0218DA345800E0AE384408B5
-:106B80003C1108008E31007C8FBF00183C0660006D
-:106B900000118540360F16808FB100148FB00010A1
-:106BA0003C0E020027BD0020ACCF442003E00008CB
-:106BB000ACCE08100A0004EB240500010A0004EB27
-:106BC0000000282124020400A7820024A780001CC2
-:106BD000000020213C06080024C65A582405FFFF67
-:106BE00024890001000440803124FFFF01061821A0
-:106BF0002C87002014E0FFFAAC6500002404040098
-:106C0000A7840026A780001E000020213C06080063
-:106C100024C65AD82405FFFF248D0001000460809B
-:106C200031A4FFFF018658212C8A00201540FFFA6D
-:106C3000AD650000A7800028A7800020A780002263
-:106C4000000020213C06080024C65B582405FFFFF5
-:106C5000249900010004C0803324FFFF030678213B
-:106C60002C8E000415C0FFFAADE500003C05600065
-:106C70008CA73D002403E08F00E31024344601403C
-:106C800003E00008ACA63D002487007F000731C266
-:106C900024C5FFFF000518C2246400013082FFFFF5
-:106CA000000238C0A78400303C010800AC27003047
-:106CB000AF80002C0000282100002021000030219E
-:106CC0002489000100A728213124FFFF2CA81701E7
-:106CD000110000032C8300801460FFF924C600011A
-:106CE00000C02821AF86002C10C0001DA786002AF6
-:106CF00024CAFFFF000A11423C08080025085B581F
-:106D00001040000A00002021004030212407FFFF2E
-:106D1000248E00010004688031C4FFFF01A86021B7
-:106D20000086582B1560FFFAAD87000030A2001FC7
-:106D30005040000800043080240300010043C804D0
-:106D400000041080004878212738FFFF03E0000886
-:106D5000ADF8000000C820212405FFFFAC8500002D
-:106D600003E000080000000030A5FFFF30C6FFFF71
-:106D700030A8001F0080602130E700FF0005294295
-:106D80000000502110C0001D24090001240B000147
-:106D900025180001010B2004330800FF0126782686
-:106DA000390E00202DED00012DC2000101A2182591
-:106DB0001060000D014450250005C880032C4021BF
-:106DC0000100182110E0000F000A20278D040000A8
-:106DD000008A1825AD03000024AD00010000402109
-:106DE0000000502131A5FFFF252E000131C9FFFF12
-:106DF00000C9102B1040FFE72518000103E0000830
-:106E0000000000008D0A0000014440240A0005D162
-:106E1000AC68000027BDFFE830A5FFFF30C6FFFFCC
-:106E2000AFB00010AFBF001430E7FFFF00005021EB
-:106E30003410FFFF0000602124AF001F00C0482174
-:106E4000241800012419002005E0001601E010219B
-:106E50000002F943019F682A0009702B01AE40240B
-:106E600011000017000C18800064102110E00005CC
-:106E70008C4B000000F840040008382301675824B8
-:106E800000003821154000410000402155600016E7
-:106E90003169FFFF258B0001316CFFFF05E1FFEC3D
-:106EA00001E0102124A2003E0002F943019F682A5C
-:106EB0000009702B01AE40241500FFEB000C188078
-:106EC000154600053402FFFF020028210E0005B51B
-:106ED00000003821020010218FBF00148FB0001075
-:106EE00003E0000827BD00181520000301601821E9
-:106EF000000B1C0224080010306A00FF154000053A
-:106F0000306E000F250D000800031A0231A800FFA3
-:106F1000306E000F15C00005307F000325100004FF
-:106F200000031902320800FF307F000317E000055C
-:106F3000386900012502000200031882304800FF72
-:106F4000386900013123000110600004310300FFA3
-:106F5000250A0001314800FF310300FF000C6940A1
-:106F600001A34021240A000110CAFFD53110FFFF00
-:106F7000246E000131C800FF1119FFC638C9000195
-:106F80002D1F002053E0001C258B0001240D000163
-:106F90000A000648240E002051460017258B0001E8
-:106FA00025090001312800FF2D0900205120001281
-:106FB000258B000125430001010D5004014B1024D5
-:106FC000250900011440FFF4306AFFFF3127FFFF5D
-:106FD00010EE000C2582FFFF304CFFFF0000502117
-:106FE0003410FFFF312800FF2D0900205520FFF24B
-:106FF00025430001258B0001014648260A000602B0
-:10700000316CFFFF00003821000050210A000654B7
-:107010003410FFFF27BDFFD8AFB0001030F0FFFFE6
-:10702000AFB10014001039423211FFE000071080A8
-:10703000AFB3001C00B1282330D3FFFFAFB200185C
-:1070400030A5FFFF00809021026030210044202104
-:10705000AFBF00200E0005E03207001F022288218A
-:107060003403FFFF0240202102002821026030216A
-:1070700000003821104300093231FFFF02201021A7
-:107080008FBF00208FB3001C8FB200188FB1001487
-:107090008FB0001003E0000827BD00280E0005E0B7
-:1070A0000000000000408821022010218FBF002036
-:1070B0008FB3001C8FB200188FB100148FB0001076
-:1070C00003E0000827BD0028000424003C03600002
-:1070D000AC603D0810A00002348210063482101605
-:1070E00003E00008AC623D0427BDFFE0AFB0001034
-:1070F000309000FF2E020006AFBF001810400008BD
-:10710000AFB10014001030803C03080024635784A2
-:1071100000C328218CA400000080000800000000AB
-:10712000000020218FBF00188FB100148FB0001015
-:107130000080102103E0000827BD00209791002A5D
-:1071400016200051000020213C020800904200332C
-:107150000A0006BB00000000978D002615A0003134
-:10716000000020210A0006BB2402000897870024A3
-:1071700014E0001A00001821006020212402000100
-:107180001080FFE98FBF0018000429C2004530219C
-:1071900000A6582B1160FFE43C0880003C0720004B
-:1071A000000569C001A76025AD0C00203C038008E4
-:1071B0002402001F2442FFFFAC6000000441FFFDD9
-:1071C0002463000424A5000100A6702B15C0FFF560
-:1071D000000569C00A0006A58FBF00189787001C2C
-:1071E0003C04080024845A58240504000E0006605C
-:1071F00024060001978B002424440001308AFFFFFD
-:107200002569FFFF2D48040000402821150000409B
-:10721000A789002424AC3800000C19C00A0006B964
-:10722000A780001C9787001E3C04080024845AD8BD
-:10723000240504000E00066024060001979900262C
-:10724000244400013098FFFF272FFFFF2F0E04007A
-:107250000040882115C0002CA78F0026A780001EA3
-:107260003A020003262401003084FFFF0E00068D41
-:107270002C4500010011F8C027F00100001021C0CA
-:107280000A0006BB240200089785002E978700227B
-:107290003C04080024845B580E00066024060001AC
-:1072A0009787002A8F89002C2445000130A8FFFF12
-:1072B00024E3FFFF0109302B0040802114C0001897
-:1072C000A783002AA7800022978500300E000F7543
-:1072D00002002021244A05003144FFFF0E00068DE4
-:1072E000240500013C05080094A500320E000F752E
-:1072F00002002021244521003C0208009042003376
-:107300000A0006BB000521C00A0006F3A784001E80
-:1073100024AC3800000C19C00A0006B9A784001C70
-:107320000A00070DA7850022308400FF27BDFFE873
-:107330002C820006AFBF0014AFB000101040001543
-:1073400000A03821000440803C0308002463579CBF
-:10735000010328218CA40000008000080000000028
-:1073600024CC007F000751C2000C59C23170FFFFCE
-:107370002547C40030E5FFFF2784001C02003021B0
-:107380000E0005B52407000197860028020620217B
-:10739000A78400288FBF00148FB0001003E00008FE
-:1073A00027BD00183C0508008CA50030000779C2F5
-:1073B0000E00038125E4DF003045FFFF3C04080098
-:1073C00024845B58240600010E0005B52407000143
-:1073D000978E002A8FBF00148FB0001025CD0001BA
-:1073E00027BD001803E00008A78D002A0007C9C2C6
-:1073F0002738FF00001878C231F0FFFF3C04080076
-:1074000024845AD802002821240600010E0005B564
-:1074100024070001978D0026260E0100000E84002F
-:1074200025AC00013C0B6000A78C0026AD603D0838
-:1074300036040006000030213C0760008CE23D0469
-:10744000305F000617E0FFFD24C9000100061B00A5
-:10745000312600FF006440252CC50004ACE83D0443
-:1074600014A0FFF68FBF00148FB0001003E00008D7
-:1074700027BD0018000751C22549C8002406000195
-:10748000240700013C04080024845A580E0005B566
-:107490003125FFFF978700248FBF00148FB00010A5
-:1074A00024E6000127BD001803E00008A786002499
-:1074B0003C0660183C090800252900FCACC9502C8A
-:1074C0008CC850003C0580003C020002350700805B
-:1074D000ACC750003C04080024841FE03C030800B3
-:1074E00024631F98ACA50008ACA2000C3C01080066
-:1074F000AC2459A43C010800AC2359A803E00008BF
-:107500002402000100A030213C1C0800279C59AC3B
-:107510003C0C04003C0B0002008B3826008C4026FB
-:107520002CE200010007502B2D050001000A4880C5
-:107530003C030800246359A4004520250123182199
-:107540001080000300001021AC660000240200013E
-:1075500003E00008000000003C1C0800279C59AC18
-:107560003C0B04003C0A0002008A3026008B3826BF
-:107570002CC200010006482B2CE5000100094080C8
-:107580003C030800246359A4004520250103182169
-:1075900010800005000010213C0C0800258C1F986D
-:1075A000AC6C00002402000103E0000800000000B1
-:1075B0003C0900023C080400008830260089382677
-:1075C0002CC30001008028212CE400010083102539
-:1075D0001040000B000030213C1C0800279C59ACD7
-:1075E0003C0A80008D4E00082406000101CA68256F
-:1075F000AD4D00088D4C000C01855825AD4B000C9D
-:1076000003E0000800C010213C1C0800279C59AC76
-:107610003C0580008CA6000C0004202724020001F9
-:1076200000C4182403E00008ACA3000C3C020002D4
-:107630001082000B3C0560003C070400108700032B
-:107640000000000003E00008000000008CA908D042
-:10765000240AFFFD012A402403E00008ACA808D05A
-:107660008CA408D02406FFFE0086182403E000083E
-:10767000ACA308D03C05601A34A600108CC300806F
-:1076800027BDFFF88CC50084AFA3000093A40000C1
-:107690002402001010820003AFA5000403E00008DC
-:1076A00027BD000893A7000114E0001497AC000266
-:1076B00097B800023C0F8000330EFFFC01CF682119
-:1076C000ADA50000A3A000003C0660008CC708D058
-:1076D0002408FFFE3C04601A00E82824ACC508D04A
-:1076E0008FA300048FA200003499001027BD00086A
-:1076F000AF22008003E00008AF2300843C0B800031
-:10770000318AFFFC014B48218D2800000A00080C3B
-:10771000AFA8000427BDFFE8AFBF00103C1C080065
-:10772000279C59AC3C0580008CA4000C8CA2000462
-:107730003C0300020044282410A0000A00A31824DF
-:107740003C0604003C0400021460000900A610245A
-:107750001440000F3C0404000000000D3C1C080015
-:10776000279C59AC8FBF001003E0000827BD00180C
-:107770003C0208008C4259A40040F80900000000B7
-:107780003C1C0800279C59AC0A0008358FBF00102C
-:107790003C0208008C4259A80040F8090000000093
-:1077A0000A00083B000000003C0880008D0201B880
-:1077B0000440FFFE35090180AD2400003C031000A9
-:1077C00024040040AD250004A1240008A1260009DE
-:1077D000A527000A03E00008AD0301B83084FFFFCD
-:1077E0000080382130A5FFFF000020210A00084555
-:1077F000240600803087FFFF8CA400002406003898
-:107800000A000845000028218F8300788F860070C9
-:107810001066000B008040213C07080024E75B68ED
-:10782000000328C000A710218C440000246300013D
-:10783000108800053063000F5466FFFA000328C06B
-:1078400003E00008000010213C07080024E75B6CFF
-:1078500000A7302103E000088CC200003C03900028
-:1078600034620001008220253C038000AC640020CB
-:107870008C65002004A0FFFE0000000003E000086B
-:10788000000000003C0280003443000100832025FA
-:1078900003E00008AC44002027BDFFE0AFB10014B6
-:1078A0003091FFFFAFB00010AFBF001812200013DF
-:1078B00000A080218CA20000240400022406020003
-:1078C0001040000F004028210E0007250000000096
-:1078D00000001021AE000000022038218FBF0018E8
-:1078E0008FB100148FB0001000402021000028212B
-:1078F000000030210A00084527BD00208CA20000AE
-:10790000022038218FBF00188FB100148FB00010F3
-:107910000040202100002821000030210A000845F5
-:1079200027BD002000A010213087FFFF8CA5000498
-:107930008C4400000A000845240600068F83FD9C45
-:1079400027BDFFE8AFBF0014AFB00010906700087C
-:10795000008010210080282130E600400000202116
-:1079600010C000088C5000000E0000BD0200202155
-:10797000020020218FBF00148FB000100A000548BC
-:1079800027BD00180E0008A4000000000E0000BD76
-:1079900002002021020020218FBF00148FB00010B0
-:1079A0000A00054827BD001827BDFFE0AFB0001052
-:1079B0008F90FD9CAFBF001CAFB20018AFB1001498
-:1079C00092060001008088210E00087230D2000467
-:1079D00092040005001129C2A6050000348300406E
-:1079E000A20300050E00087C022020210E00054A9B
-:1079F0000220202124020001AE02000C02202821D6
-:107A0000A602001024040002A602001224060200AE
-:107A1000A60200140E000725A60200161640000F4D
-:107A20008FBF001C978C00743C0B08008D6B007896
-:107A30002588FFFF3109FFFF256A0001012A382B45
-:107A400010E00006A78800743C0F6006240E0016A4
-:107A500035ED0010ADAE00508FBF001C8FB2001886
-:107A60008FB100148FB0001003E0000827BD002084
-:107A700027BDFFE0AFB10014AFBF0018AFB00010DA
-:107A80001080000400A088212402008010820007DA
-:107A9000000000000000000D8FBF00188FB100141F
-:107AA0008FB0001003E0000827BD00200E00087210
-:107AB00000A020218F86FD9C0220202190C500057A
-:107AC0000E00087C30B000FF2403003E1603FFF1D7
-:107AD0003C0680008CC401780480FFFE34C801405D
-:107AE000240900073C071000AD11000002202021EE
-:107AF000A10900048FBF00188FB100148FB00010CF
-:107B0000ACC701780A0008C527BD002027BDFFE0EB
-:107B1000AFB00010AFBF0018AFB100143C10800030
-:107B20008E110020000000000E00054AAE04002067
-:107B3000AE1100208FBF00188FB100148FB000105D
-:107B400003E0000827BD00203084FFFF00803821BB
-:107B50002406003500A020210A0008450000282145
-:107B60003084FFFF008038212406003600A0202149
-:107B70000A0008450000282127BDFFD0AFB500242A
-:107B80003095FFFFAFB60028AFB40020AFBF002C88
-:107B9000AFB3001CAFB20018AFB10014AFB000100B
-:107BA00030B6FFFF12A000270000A0218F920058DE
-:107BB0008E4300003C0680002402004000033E0289
-:107BC00000032C0230E4007F006698241482001D1C
-:107BD00030A500FF8F8300682C68000A1100001098
-:107BE0008F8D0044000358803C0C0800258C57B84A
-:107BF000016C50218D4900000120000800000000A8
-:107C000002D4302130C5FFFF0E0008522404008446
-:107C1000166000028F920058AF8000688F8D00447C
-:107C20002659002026980001032090213314FFFFDD
-:107C300015A00004AF9900580295202B1480FFDC9A
-:107C400000000000028010218FBF002C8FB600289A
-:107C50008FB500248FB400208FB3001C8FB20018A2
-:107C60008FB100148FB0001003E0000827BD003072
-:107C70002407003414A70149000000009247000EB9
-:107C80008F9FFDA08F90FD9C24181600A3E700197C
-:107C90009242000D3C0880003C07800CA3E20018D3
-:107CA000964A00123C0D60003C117FFFA60A005C62
-:107CB000964400103623FFFF240200053099FFFF91
-:107CC000AE1900548E46001CAD1800288CEF000041
-:107CD0008DAE444801E6482601C93021AE06003881
-:107CE0008E05003824CB00013C0E7F00AE05003C21
-:107CF0008E0C003CAFEC0004AE0B00208E13002075
-:107D0000AE13001CA3E0001BAE03002CA3E2001284
-:107D10008E4A001424130050AE0A00348E0400343E
-:107D2000AFE400148E590018AE1900489258000CA8
-:107D3000A218004E920D000835AF0020A20F0008D7
-:107D40008E090018012E282434AC4000AE0C001817
-:107D5000920B0000317200FF1253027F2403FF8058
-:107D60003C04080024845BE80E0008AA0000000020
-:107D70003C1108008E315BE80E00087202202021C1
-:107D80002405000424080001A2050025022020216A
-:107D90000E00087CA20800053C0580008CB001782C
-:107DA0000600FFFE8F92005834AE0140240F0002FF
-:107DB0003C091000ADD10000A1CF0004ACA90178AE
-:107DC0000A000962AF8000682CAD003751A0FF9413
-:107DD0008F8D0044000580803C110800263157E05B
-:107DE000021178218DEE000001C0000800000000A3
-:107DF0002411000414B1008C3C0780003C080800EA
-:107E00008D085BE88F86FD9CACE800208E4500085D
-:107E10008F99FDA0240D0050ACC500308E4C000899
-:107E2000ACCC00508E4B000CACCB00348E43001019
-:107E3000ACC300388E4A0010ACCA00548E42001405
-:107E4000ACC2003C8E5F0018AF3F00048E50001C97
-:107E5000ACD0002090C40000309800FF130D024AFF
-:107E6000000000008CC400348CD00030009030231F
-:107E700004C000F12404008C126000EE2402000310
-:107E80000A000962AF8200682419000514B900666F
-:107E90003C0580003C0808008D085BE88F86FD9C4F
-:107EA000ACA800208E4C00048F8AFDA0240720007F
-:107EB000ACCC001C924B000824120008A14B001906
-:107EC0008F82005890430009A14300188F85005805
-:107ED00090BF000A33E400FF1092001028890009C7
-:107EE000152000BA240E0002240D0020108D000B76
-:107EF000340780002898002117000008240740005C
-:107F000024100040109000053C0700012419008057
-:107F1000109900023C070002240740008CC20018A0
-:107F20003C03FF00004350240147F825ACDF001854
-:107F300090B2000BA0D200278F8300589464000CED
-:107F4000108001FE000000009467000C3C1F8000C0
-:107F50002405FFBFA4C7005C9063000E2407000443
-:107F6000A0C300088F820058904A000FA0CA0009E1
-:107F70008F8900588D3200108FE400740244C823AA
-:107F8000ACD900588D300014ACD0002C95380018B6
-:107F9000330DFFFFACCD00409531001A322FFFFFAB
-:107FA000ACCF00448D2E001CACCE00489128000EB2
-:107FB000A0C8000890CC000801855824126001B6C2
-:107FC000A0CB00088F9200580A000962AF870068B2
-:107FD0002406000614A600143C0E80003C0F080086
-:107FE0008DEF5BE88F85FD98ADCF00208E4900189E
-:107FF0008F86FD9C8F8BFDA0ACA900008CC800383B
-:1080000024040005ACA800048CCC003C1260008164
-:10801000AD6C00000A000962AF84006824110007FB
-:1080200010B1004B240400063C05080024A55BE8C1
-:108030000E000881240400818F9200580013102B39
-:108040000A000962AF820068241F002314BFFFF6F4
-:108050003C0C80003C0508008CA55BE88F8BFDA0E4
-:10806000AD8500208F91FD9C8E4600042564002084
-:1080700026450014AE260028240600030E000F81BA
-:10808000257000308F87005802002021240600034D
-:108090000E000F8124E500083C04080024845BE8FE
-:1080A0000E0008AA0000000092230000240A0050DD
-:1080B000306200FF544AFFE18F9200580E000F6CAF
-:1080C000000000000A000A6A8F920058240800335A
-:1080D00014A800323C0380003C1108008E315BE89C
-:1080E0008F8FFDA0AC7100208E420008240D002867
-:1080F0008F89FD9CADE200308E4A000C24060009F9
-:10810000ADEA00348E5F0010ADFF00388E440014DD
-:10811000ADE400208E590018ADF900248E58001CE3
-:10812000ADF80028A1ED00118E4E00041260003160
-:10813000AD2E00288F9200580A000962AF860068B1
-:10814000240D002214ADFFB8000000002404000735
-:108150003C1008008E105BE83C188000AF10002037
-:108160005660FEAEAF8400683C04080024845BE8DF
-:108170000E0008AA241300508F84FD9C90920000EA
-:10818000325900FF1333014B000000008F9200585A
-:10819000000020210A000962AF8400683C05080045
-:1081A00024A55BE80E000858240400810A000A6A2E
-:1081B0008F92005802D498213265FFFF0E000852BA
-:1081C000240400840A0009628F920058108EFF5325
-:1081D000240704002887000310E00179241100041B
-:1081E000240F0001548FFF4D240740000A000A228B
-:1081F000240701003C05080024A55BE80E0008A444
-:10820000240400828F920058000030210A00096285
-:10821000AF8600683C04080024845BE88CC2003808
-:108220000E0008AA8CC3003C8F9200580A000AC0B6
-:1082300000002021240400823C05080024A55BE8FE
-:108240000E0008A4000000008F92005800001021CA
-:108250000A000962AF8200688E5000048F91FD9C75
-:108260003C078000ACF00020922C00050200282181
-:10827000318B0002156001562404008A8F92FDA004
-:108280002404008D9245001B30A6002014C001502C
-:1082900002002821922E00092408001231C900FF93
-:1082A0001128014B240400810E00087202002021D5
-:1082B0009258001B240F000402002021370D0042B9
-:1082C000A24D001B0E00087CA22F00253C0580005B
-:1082D0008CA401780480FFFE34B90140241F000201
-:1082E000AF300000A33F00048F9200583C101000F4
-:1082F000ACB001780A000A6B0013102B8E500004FA
-:108300008F91FD9C3C038000AC700020922A0005F8
-:108310000200282131420002144000172404008A80
-:10832000922C00092412000402002821318B00FF46
-:1083300011720011240400810E0008720200202135
-:108340008F89FDA0240800122405FFFE912F001B39
-:108350000200202135EE0020A12E001BA2280009DA
-:108360009226000500C538240E00087CA2270005CF
-:1083700002002821000020210E0009330000000027
-:108380000A000A6A8F9200588E4C00043C07800055
-:108390003C10080026105BE8ACEC00203C01080013
-:1083A000AC2C5BE8924B0003317100041220013BBE
-:1083B0008F84FD9C24020006A0820009924F001BBE
-:1083C000240EFFC031E9003F012E4025A08800089F
-:1083D0009245000330A6000114C0013200000000E5
-:1083E0008E420008AE0200083C0208008C425BF09E
-:1083F000104001318F90FDA0000219C28F8DFD9CAD
-:10840000A603000C8E4A000C24180001240400145A
-:10841000AE0A002C8E420010AE02001C965F0016C1
-:10842000A61F003C96590014A619003EADB8000CDA
-:10843000A5B80010A5B80012A5B80014A5B800167C
-:1084400012600144A2040011925100033232000272
-:108450002E5300018F920058266200080A0009621C
-:10846000AF8200688E4400043C1980003C068008FE
-:10847000AF2400208E45000890D80000240D005045
-:10848000331100FF122D009C2407008824060009E8
-:108490000E000845000000000A000A6A8F9200588A
-:1084A0008E5000043C0980003C118008AD30002053
-:1084B0009228000024050050310400FF10850110AF
-:1084C0002407008802002021000028210E00084512
-:1084D0002406000E922D00002418FF80020028219F
-:1084E00001B8802524040004240600300E0007256E
-:1084F000A23000000A000A6A8F9200588E500004D1
-:108500008F91FDA03C028000AC500020923F001BE8
-:1085100033F900101320006C240700810200202191
-:10852000000028212406001F0E000845000000005E
-:108530000A000A6A8F9200588E44001C0E00085DE3
-:1085400000000000104000E3004048218F880058E0
-:1085500024070089012020218D05001C240600012C
-:108560000E000845000000000A000A6A8F920058B9
-:10857000964900023C10080026105BE831280004F0
-:10858000110000973C0460008E4E001C3C0F8000E0
-:10859000ADEE00203C010800AC2E5BE896470002DF
-:1085A00030E40001148000E6000000008E42000468
-:1085B000AE0200083C1008008E105BF0120000ECC8
-:1085C0003C0F80008F92FD9C241000018E4E0018FD
-:1085D0008F8DFDA08F9FFD9801CF4825AE490018D3
-:1085E000A2400005AE50000C3C0808008D085BF06E
-:1085F0008F840058A6500010000839C2A6500012FF
-:10860000A6500014A6500016A5A7000C8C8C0008DC
-:108610008F8B00588F8A0058ADAC002C8D63000CF6
-:1086200024070002ADA3001C91460010A1A6001172
-:108630008F82005890450011A3E500088F990058DB
-:1086400093380012A258004E8F910058922F0013B9
-:10865000A1AF00128F920058964E0014A5AE003CB8
-:1086600096490016A5A9003E8E480018ADA8001432
-:108670005660FD6AAF8700683C05080024A55BE8EA
-:108680000E000881000020218F9200580000382140
-:108690000A000962AF8700683C05080024A55BE872
-:1086A0000E0008A4240400828F9200580A000A4D8C
-:1086B000000038210E000F6C000000008F9200585F
-:1086C0000A000AC0000020210E00087202002021CA
-:1086D0009223001B02002021346A00100E00087C47
-:1086E000A22A001B000038210200202100002821BE
-:1086F0000A000BA52406001F9242000C305F000107
-:1087000013E0000300000000964A000EA4CA002CEB
-:10871000924B000C316300025060000600003821CB
-:108720008E470014964C0012ACC7001CA4CC001A53
-:10873000000038210A000B7F240600093C050800D0
-:1087400024A55BE80E0008A42404008B8F92005837
-:108750000A000A4D0013382B3C0C08008D8C5BE896
-:1087600024DFFFFE25930100326B007F016790211B
-:1087700002638824AD110028AE4600E0AE4000E45C
-:108780000A0009B3AE5F001CACC000543C0D0800E9
-:108790008DAD5BE83C18800C37090100ACED00287A
-:1087A0008E510014AD3100E08E4F0014AD2F00E467
-:1087B0008E4E001025C7FFFE0A0009F4AD27001CED
-:1087C0005491FDD6240740000A000A222407100015
-:1087D0000E00092D000000000A000A6A8F9200585E
-:1087E0008C83442C3C12DEAD3651BEEF3C010800B8
-:1087F000AC205BE810710062000000003C196C6264
-:1088000037387970147800082404000297850074C2
-:108810009782006C2404009200A2F82B13E0001948
-:1088200002002821240400020E00069524050200FF
-:108830003C068000ACC200203C010800AC225BE892
-:108840001040000D8F8C0058240A002824040003D7
-:10885000918B0010316300FF546A00012404000171
-:108860000E0000810000000010400004240400837A
-:108870000A000BC28F920058240400833C050800B4
-:1088800024A55BE80E000881000000008F920058CC
-:108890000013382B0A000962AF8700680A000B49F1
-:1088A000240200128E4400080E00085D0000000043
-:1088B0000A000B55AE0200083C05080024A55BE841
-:1088C0000E000858240400878F9200580A000B728B
-:1088D0000013102B240400040E000695240500301C
-:1088E0001440002A004048218F8800582407008344
-:1088F000012020218D05001C0A000BB32406000175
-:108900008F8300788F8600701066FEEE000038219D
-:108910003C07080024E75B6C000320C00087282187
-:108920008CAE000011D0005D246F000131E3000F18
-:108930005466FFFA000320C00A000B8C00003821A7
-:108940008E4400040E00085D000000000A000BC801
-:10895000AE0200083C05080024A55BE80E0008A450
-:10896000240400828F9200580A000B72000010212C
-:108970003C05080024A55BE80A000C7C2404008761
-:108980008C83442C0A000C5B3C196C628F88005865
-:108990003C0780083C0C8000240B0050240A000196
-:1089A000AD820020A0EB0000A0EA000191030004CA
-:1089B000A0E3001891040005A0E400199106000648
-:1089C0003C04080024845B6CA0E6001A91020007B6
-:1089D0003C06080024C65B68A0E2001B9105000865
-:1089E000A0E5001C911F0009A0FF001D9119000ABD
-:1089F000A0F9001E9118000BA0F8001F9112000CA6
-:108A0000A0F200209111000DA0F100219110000EA4
-:108A1000A0F00022910F000FA0EF0023910E001094
-:108A2000A0EE0024910D0011A0ED0025950C00147E
-:108A3000A4EC0028950B00168F8A00708F920078A6
-:108A4000A4EB002A95030018000A10C02545000178
-:108A5000A4E3002C8D1F001C0044C0210046C82147
-:108A600030A5000FAF3F0000AF09000010B20006B4
-:108A7000AF850070000038218D05001C01202021E9
-:108A80000A000BB32406000124AD000131A7000F3A
-:108A9000AF8700780A000CF9000038213C06080076
-:108AA00024C65B680086902100003821ACA000003D
-:108AB0000A000B8CAE4000003C0482013C036000C5
-:108AC00034820E02AC603D68AF80009803E000087D
-:108AD000AC623D6C27BDFFE8AFB000103090FFFFE7
-:108AE000001018422C620041AFBF00141440000275
-:108AF00024040080240300403C010800AC300060E6
-:108B00003C010800AC2300640E000F7500602821B2
-:108B1000244802BF2409FF8001092824001039805D
-:108B2000001030408FBF00148FB0001000A720212C
-:108B300000861821AF8300803C010800AC25005856
-:108B40003C010800AC24005C03E0000827BD0018CD
-:108B5000308300FF30C6FFFF30E400FF3C08800098
-:108B60008D0201B80440FFFE000354000144382583
-:108B70003C09600000E920253C031000AD050180A0
-:108B8000AD060184AD04018803E00008AD0301B81F
-:108B90008F8500583C0A6012354800108CAC0004E8
-:108BA0003C0D600E35A60010318B00062D690001CA
-:108BB000AD0900C48CA70004ACC731808CA20008AA
-:108BC00094A40002ACC231848CA3001C0460000396
-:108BD000A784009003E00008000000008CAF00189C
-:108BE000ACCF31D08CAE001C03E00008ACCE31D449
-:108BF0008F8500588F87FF288F86FF308CAE00044A
-:108C00003C0F601235E80010ACEE00788CAD000827
-:108C1000ACED007C8CAC0010ACCC004C8CAB000CF0
-:108C2000ACCB004894CA00543C0208008C4200447B
-:108C300025490001A4C9005494C400543083FFFFA7
-:108C400010620017000000003C0208008C42004047
-:108C5000A4C200528CA30018ACE300308CA2001414
-:108C6000ACE2002C8CB90018ACF900388CB80014B8
-:108C700024050001ACF800348D0600BC50C5001975
-:108C80008D0200B48D0200B8A4E2004894E40048CC
-:108C9000A4E4004A94E800EA03E000083102FFFF80
-:108CA0003C0208008C420024A4C00054A4C200521C
-:108CB0008CA30018ACE300308CA20014ACE2002CB2
-:108CC0008CB90018ACF900388CB8001424050001E8
-:108CD000ACF800348D0600BC54C5FFEB8D0200B823
-:108CE0008D0200B4A4E2004894E40048A4E4004AE1
-:108CF00094E800EA03E000083102FFFF8F86005885
-:108D00003C0480008CC900088CC80008000929C0F8
-:108D1000000839C0AC87002090C30007306200040F
-:108D20001040003EAF85009490CB0007316A0008E8
-:108D30001140003D8F87FF2C8CCD000C8CCE001491
-:108D400001AE602B11800036000000008CC2000CC8
-:108D5000ACE200708CCB00188F85FF288F88FF3025
-:108D6000ACEB00748CCA00102402FFF8ACAA00D847
-:108D70008CC9000CAD0900608CC4001CACA400D0F0
-:108D800090E3007C0062C824A0F9007C90D8000722
-:108D9000330F000811E000040000000090ED007C9B
-:108DA00035AC0001A0EC007C90CF000731EE000153
-:108DB00011C000060000000090E3007C241800347D
-:108DC00034790002A0F9007CACB800DC90C2000746
-:108DD0003046000210C000040000000090E8007C53
-:108DE00035040004A0E4007C90ED007D3C0B600E97
-:108DF000356A001031AC003FA0EC007D8D4931D4C4
-:108E00003127000110E00002240E0001A0AE00098D
-:108E100094AF00EA03E0000831E2FFFF8F87FF2CE8
-:108E20000A000DAF8CC200140A000DB0ACE0007057
-:108E30008F8C005827BDFFD8AFB3001CAFB200180D
-:108E4000AFB00010AFBF0020AFB10014918F00157C
-:108E50003C13600E3673001031EB000FA38B009CA7
-:108E60008D8F00048D8B0008959F0012959900103E
-:108E70009584001A9598001E958E001C33EDFFFF17
-:108E8000332AFFFF3089FFFF3308FFFF31C7FFFFA1
-:108E90003C010800AC2D00243C010800AC29004432
-:108EA0003C010800AC2A0040AE683178AE67317CE6
-:108EB00091850015959100163C12601236520010F3
-:108EC00030A200FF3230FFFFAE623188AE5000B4F6
-:108ED00091830014959F0018240600010066C804C1
-:108EE00033F8FFFFAE5900B8AE5800BC918E0014A5
-:108EF000AF8F00843C08600631CD00FFAE4D00C04E
-:108F0000918A00159584000E3C07600A314900FFE4
-:108F1000AF8B00883084FFFFAE4900C835110010C8
-:108F20000E000D1034F004103C0208008C4200606A
-:108F30003C0308008C6300643C0608008CC60058A3
-:108F40003C0508008CA5005C8F8400808FBF00204A
-:108F5000AE23004CAE65319CAE030054AE4500DC40
-:108F6000AE6231A0AE6331A4AE663198AE22004845
-:108F70008FB3001CAE0200508FB10014AE4200E06F
-:108F8000AE4300E4AE4600D88FB000108FB2001898
-:108F90000A00057D27BD0028978500929783007CF5
-:108FA00027BDFFE8AFB0001000A3102BAFBF001427
-:108FB000240400058F900058104000552409000239
-:108FC0000E0006958F850080AF8200942404000374
-:108FD0001040004F240900023C0680000E00008172
-:108FE000ACC2002024070001240820001040004DDE
-:108FF00024040005978E00928F8AFF2C24090050CC
-:1090000025C50001A7850092A14900003C0D08007C
-:109010008DAD0064240380008F84FF28000D66005E
-:10902000AD4C0018A5400006954B000A8F85FF3017
-:109030002402FF8001633024A546000A915F000AE4
-:109040000000482103E2C825A159000AA0A0000899
-:10905000A140004CA08000D5961800029783009094
-:109060003C020004A49800EA960F00022418FFBFF7
-:1090700025EE2401A48E00BE8E0D0004ACAD00448C
-:109080008E0C0008ACAC0040A4A00050A4A000547A
-:109090008E0B000C240C0030AC8B00288E060010C8
-:1090A000AC860024A480003EA487004EA487005014
-:1090B000A483003CAD420074AC8800D8ACA800602A
-:1090C000A08700FC909F00D433F9007FA09900D4C2
-:1090D000909000D402187824A08F00D4914E007C88
-:1090E00035CD0001A14D007C938B009CAD480070F4
-:1090F000AC8C00DCA08B00D68F8800888F87008422
-:10910000AC8800C4AC8700C8A5400078A540007AB0
-:109110008FBF00148FB000100120102103E0000861
-:1091200027BD00188F8500940E0007258F860080CC
-:109130000A000E9F2409000227BDFFE0AFB0001017
-:109140008F900058AFB10014AFBF00188E09000413
-:109150000E00054A000921C08E0800048F84FF28F4
-:109160008F82FF30000839C03C068000ACC7002069
-:10917000948500EA904300131460001C30B1FFFF97
-:109180008F8CFF2C918B0008316A00401540000B3A
-:10919000000000008E0D0004022030218FBF001857
-:1091A0008FB100148FB00010240400220000382179
-:1091B000000D29C00A000D2F27BD00200E000098C9
-:1091C000000000008E0D0004022030218FBF001827
-:1091D0008FB100148FB00010240400220000382149
-:1091E000000D29C00A000D2F27BD00200E000090A1
-:1091F000000000008E0D0004022030218FBF0018F7
-:109200008FB100148FB00010240400220000382118
-:10921000000D29C00A000D2F27BD002027BDFFE04B
-:10922000AFB200183092FFFFAFB00010AFBF001C0C
-:10923000AFB100141240001E000080218F8600583C
-:109240008CC500002403000600053F02000514023F
-:1092500030E4000714830016304500FF2CA80006F8
-:1092600011000040000558803C0C0800258C58BCBB
-:10927000016C50218D490000012000080000000011
-:109280008F8E0098240D000111CD005024020002A1
-:10929000AF820098260900013130FFFF24C800206A
-:1092A0000212202B010030211480FFE5AF88005806
-:1092B000020010218FBF001C8FB200188FB1001464
-:1092C0008FB0001003E0000827BD00209387007EC8
-:1092D00054E00034000030210E000DE700000000D3
-:1092E0008F8600580A000EFF240200018F87009825
-:1092F0002405000210E50031240400130000282199
-:1093000000003021240700010E000D2F0000000096
-:109310000A000F008F8600588F83009824020002F5
-:109320001462FFF6240400120E000D9A00000000E3
-:109330008F85009400403021240400120E000D2F70
-:10934000000038210A000F008F8600588F83009894
-:109350002411000310710029241F0002107FFFCE8A
-:1093600026090001240400100000282100003021FB
-:109370000A000F1D240700018F91009824060002A7
-:109380001626FFF9240400100E000E410000000014
-:10939000144000238F9800588F8600580A000EFF53
-:1093A00024020003240400140E000D2F00002821C5
-:1093B0008F8600580A000EFF240200020E000EA93C
-:1093C000000000000A000F008F8600580E000D3FBD
-:1093D00000000000241900022404001400002821C9
-:1093E0000000302100003821AF9900980E000D2FA9
-:1093F000000000000A000F008F8600580E000D5775
-:10940000000000008F8500942419000200403021E4
-:1094100024040010000038210A000F56AF9900986C
-:109420000040382124040010970F0002000028217A
-:109430000E000D2F31E6FFFF8F8600580A000F0047
-:10944000AF9100988F84FF2C3C077FFF34E6FFFF2D
-:109450008C8500182402000100A61824AC83001893
-:1094600003E00008A08200053084FFFF30A5FFFF65
-:109470001080000700001821308200011040000217
-:1094800000042042006518211480FFFB00052840DD
-:1094900003E000080060102110C000070000000079
-:1094A0008CA2000024C6FFFF24A50004AC820000AB
-:1094B00014C0FFFB2484000403E000080000000047
-:1094C00010A0000824A3FFFFAC86000000000000ED
-:1094D000000000002402FFFF2463FFFF1462FFFA74
-:1094E0002484000403E0000800000000000411C010
-:1094F00003E000082442024027BDFFE8AFB000109F
-:1095000000808021AFBF00140E000F9600A0202124
-:1095100000504821240AFF808FBF00148FB0001034
-:10952000012A30243127007F3C08800A3C042100B6
-:1095300000E8102100C428253C03800027BD001846
-:10954000AC650024AF820038AC400000AC6500245C
-:1095500003E00008AC4000403C0D08008DAD005811
-:1095600000056180240AFF8001A45821016C482174
-:10957000012A30243127007F3C08800C3C04210064
-:1095800000E8102100C428253C038000AC650028B9
-:10959000AF82003403E00008AC40002430A5FFFF98
-:1095A0003C0680008CC201B80440FFFE3C086015F8
-:1095B00000A838253C031000ACC40180ACC0018475
-:1095C000ACC7018803E00008ACC301B83C0D08003B
-:1095D0008DAD005800056180240AFF8001A4582148
-:1095E000016C4021010A4824000931403107007F05
-:1095F00000C728253C04200000A418253C02800058
-:10960000AC43083003E00008AF80003427BDFFE81A
-:10961000AFB0001000808021AFBF00140E000F9685
-:1096200000A0202100504821240BFF80012B502452
-:10963000000A39403128007F3C0620008FBF00140B
-:109640008FB0001000E8282534C2000100A21825C0
-:109650003C04800027BD0018AC83083003E00008FC
-:10966000AF8000383C0580088CA700603C0680086D
-:109670000087102B144000112C8340008CA8006040
-:109680002D0340001060000F240340008CC90060CF
-:109690000089282B14A00002008018218CC30060D0
-:1096A00000035A42000B30803C0A0800254A59202A
-:1096B00000CA202103E000088C8200001460FFF340
-:1096C0002403400000035A42000B30803C0A08008B
-:1096D000254A592000CA202103E000088C8200009E
-:1096E0003C05800890A60008938400AB24C20001CA
-:1096F000304200FF3043007F1064000C0002382726
-:10970000A0A200083C0480008C85017804A0FFFE24
-:109710008F8A00A0240900023C081000AC8A014096
-:10972000A089014403E00008AC8801780A00101BFE
-:1097300030E2008027BDFFD8AFB200188F9200A49E
-:10974000AFBF0020AFB3001CAFB00010AFB100142A
-:109750008F9300348E5900283C1000803C0EFFEFA0
-:10976000AE7900008E580024A260000A35CDFFFFBC
-:10977000AE7800049251002C3C0BFF9F356AFFFF2E
-:10978000A271000C8E6F000C3C080040A271000B0F
-:1097900001F06025018D4824012A382400E8302595
-:1097A000AE66000C8E450004AE6000183C0400FF5D
-:1097B000AE6500148E43002C3482FFFFA6600008C3
-:1097C0000062F824AE7F00108E5900088F9000A030
-:1097D000964E0012AE7900208E51000C31D83FFF1A
-:1097E00000187980AE7100248E4D001401F06021C4
-:1097F00031CB0001AE6D00288E4A0018000C41C22A
-:10980000000B4B80AE6A002C8E46001C01093821EB
-:10981000A667001CAE660030964500028E4400200C
-:10982000A665001EAE64003492430033306200042B
-:1098300054400006924700003C0280083443010077
-:109840008C7F00D0AE7F0030924700008F860038BA
-:10985000A0C700309245003330A4000250800007BA
-:10986000925100018F880038240BFF80910A00304C
-:10987000014B4825A1090030925100018F9000381A
-:10988000240CFFBF2404FFDFA21100318F8D0038AC
-:109890003C1880083711008091AF003C31EE007F0A
-:1098A000A1AE003C8F890038912B003C016C502404
-:1098B000A12A003C8F9F00388E68001493E6003C7C
-:1098C0002D0700010007114000C4282400A218251C
-:1098D000A3E3003C8F87003896590012A4F90032A8
-:1098E0008E450004922E007C30B0000300107823D7
-:1098F00031ED000300AD102131CC000215800002D3
-:1099000024460034244600303C0280083443008062
-:10991000907F007C00BFC824333800041700000289
-:1099200024C2000400C010218F98003824190002BE
-:10993000ACE20034A3190000924F003F8F8E003834
-:109940003C0C8008358B0080A1CF00018F9100383E
-:10995000924D003F8E440004A62D0002956A005CE3
-:109960000E000FF43150FFFF00024B800209382532
-:109970003C08420000E82825AE2500048E4400384B
-:109980008F850038ACA400188E460034ACA6001CAD
-:10999000ACA0000CACA00010A4A00014A4A0001661
-:1099A000A4A00020A4A00022ACA000248E62001479
-:1099B00050400001240200018FBF00208FB3001C23
-:1099C0008FB200188FB100148FB00010ACA2000845
-:1099D0000A00101327BD002827BDFFC83C058008DA
-:1099E00034A40080AFBF0034AFBE0030AFB7002C4E
-:1099F000AFB60028AFB50024AFB40020AFB3001C51
-:109A0000AFB20018AFB10014AFB00010948300786B
-:109A10009482007A104300512405FFFF0080F0215A
-:109A20000A0011230080B821108B004D8FBF003435
-:109A30008F8600A03C1808008F18005C2411FF805E
-:109A40003C1680000306782101F18024AED0002C62
-:109A500096EE007A31EC007F3C0D800E31CB7FFF1B
-:109A6000018D5021000B4840012AA82196A4000036
-:109A70003C0808008D0800582405FF8030953FFF02
-:109A800001061821001539800067C8210325F82434
-:109A90003C02010003E290253338007F3C11800C2A
-:109AA000AED20028031190219250000D320F000415
-:109AB00011E0003702E0982196E3007A96E8007AF8
-:109AC00096E5007A2404800031077FFF24E300013B
-:109AD00030627FFF00A4F82403E2C825A6F9007ACB
-:109AE00096E6007A3C1408008E94006030D67FFF22
-:109AF00012D400C1000000008E5800188F8400A00E
-:109B000002A028212713FFFF0E000FCEAE53002C1A
-:109B100097D5007897D4007A12950010000028217C
-:109B20003C098008352401003C0A8008914800085F
-:109B3000908700D53114007F30E400FF0284302B81
-:109B400014C0FFB9268B0001938E00AB268C000158
-:109B5000008E682115ACFFB78F8600A08FBF003440
-:109B60008FBE00308FB7002C8FB600288FB5002431
-:109B70008FB400208FB3001C8FB200188FB1001477
-:109B80008FB0001000A0102103E0000827BD0038AE
-:109B900000C020210E000F99028028218E4B00105A
-:109BA0008E4C00308F84003824090002016C502351
-:109BB000AE4A0010A089000096E3005C8E4400309D
-:109BC0008F9100380E000FF43070FFFF00024380C9
-:109BD000020838253C02420000E22825AE25000498
-:109BE0008E5F00048F8A00388E590000240B000815
-:109BF000AD5F001CAD590018AD40000CAD40001029
-:109C00009246000A240400052408C00030D000FF5A
-:109C1000A550001496580008A55800169251000A45
-:109C20003C188008322F00FFA54F0020964E0008F8
-:109C300037110100A54E0022AD400024924D000BCB
-:109C400031AC00FFA54C0002A14B00018E49003051
-:109C50008F830038240BFFBFAC690008A06400307C
-:109C60008F9000382403FFDF9607003200E8282495
-:109C700000B51025A6020032921F003233F9003FD2
-:109C800037260040A20600328F8C0038AD800034A9
-:109C90008E2F00D0AD8F0038918E003C3C0F7FFF9F
-:109CA00031CD007FA18D003C8F84003835EEFFFF61
-:109CB000908A003C014B4824A089003C8F850038E5
-:109CC00090A8003C01033824A0A7003C8E42003439
-:109CD0008F9100383C038008AE2200408E59002C42
-:109CE0008E5F0030033F3023AE26004492300048A0
-:109CF0003218007FA23800488F8800388E4D00301F
-:109D00008D0C004801AE582401965024014B482583
-:109D1000AD0900489244000AA104004C964700088F
-:109D20008F850038A4A7004E8E5000308E4400303E
-:109D30000E0003818C65006092F9007C0002F940FE
-:109D4000004028210002110003E2302133360002D6
-:109D500012C00003020680210005B0800216802197
-:109D6000926D007C31B30004126000020005708027
-:109D7000020E80218E4B00308F8800382405800031
-:109D8000316A0003000A4823312400030204182129
-:109D9000AD03003496E4007A96F0007A96F1007AEA
-:109DA00032027FFF2447000130FF7FFF0225C824D5
-:109DB000033F3025A6E6007A96F8007A3C120800A8
-:109DC0008E520060330F7FFF11F200180000000078
-:109DD0008F8400A00E000FCE02A028218F8400A047
-:109DE0000E000FDE028028210E001013000000007C
-:109DF0000A00111F0000000096F1007A022480245E
-:109E0000A6F0007A92EF007A92EB007A31EE00FF32
-:109E1000000E69C2000D6027000C51C03169007F3F
-:109E2000012A20250A001119A2E4007A96E6007A98
-:109E300000C5C024A6F8007A92EF007A92F3007A67
-:109E400031F200FF001271C2000E6827000DB1C090
-:109E5000326C007F01962825A2E5007A0A0011D015
-:109E60008F8400A03C0380003084FFFF30A5FFFFFB
-:109E7000AC640018AC65001C03E000088C620014A0
-:109E800027BDFFA03C068008AFBF005CAFBE0058F6
-:109E9000AFB70054AFB60050AFB5004CAFB40048F8
-:109EA000AFB30044AFB20040AFB1003CAFB0003838
-:109EB00034C80100910500D590C700083084FFFF29
-:109EC00030A500FF30E2007F0045182AAFA4001043
-:109ED000A7A00018A7A0002610600055AFA000148E
-:109EE00090CA00083149007F00A9302324D3FFFF26
-:109EF0000013802B8FB400100014902B02128824C2
-:109F0000522000888FB300143C03800894790052DB
-:109F1000947E00508FB60010033EC0230018BC0092
-:109F2000001714030016FC0002C2A82A16A00002A3
-:109F3000001F2C030040282100133C0000072403CD
-:109F400000A4102A5440000100A020212885000907
-:109F500014A000020080A021241400083C0C8008FA
-:109F60008D860048001459808D88004C3C03800089
-:109F70003169FFFF3C0A0010012A202534710400DA
-:109F8000AC660038AF9100A4AC68003CAC64003013
-:109F900000000000000000000000000000000000C1
-:109FA00000000000000000000000000000000000B1
-:109FB0008C6E000031CD002011A0FFFD0014782A26
-:109FC00001F01024104000390000A8213C16800840
-:109FD00092D700083C1280008E44010032F6007FC8
-:109FE0000E000F9902C028218E3900108E44010006
-:109FF0000000902133373FFF0E000FB102E028210F
-:10A00000923800003302003F2C500008520000102C
-:10A0100000008821000210803C030800246358E4FB
-:10A020000043F8218FFE000003C00008000000007C
-:10A0300090CF0008938C00AB31EE007F00AE682318
-:10A04000018D58210A0012172573FFFF0000882197
-:10A050003C1E80008FC401000E000FCE02E02821BC
-:10A060008FC401000E000FDE02C028211220000F55
-:10A070000013802B8F8B00A426A400010004AC00E9
-:10A08000027298230015AC032578004002B4B02A70
-:10A090000013802B241700010300882102D0102414
-:10A0A000AF9800A41440FFC9AFB700143C07800864
-:10A0B00094E200508FAE00103C05800002A288217F
-:10A0C0003C060020A4F10050ACA6003094F40050EF
-:10A0D00094EF005201D51823306CFFFF11F4001EDD
-:10A0E000AFAC00108CEF004C001561808CF500487F
-:10A0F00001EC28210000202100AC582B02A4C02133
-:10A10000030BB021ACE5004CACF600488FB4001056
-:10A110000014902B021288241620FF7C3C03800838
-:10A120008FB300148FBF005C8FBE00583A620001ED
-:10A130008FB700548FB600508FB5004C8FB40048D5
-:10A140008FB300448FB200408FB1003C8FB0003815
-:10A1500003E0000827BD006094FE00548CF2004428
-:10A1600033C9FFFE0009C8C00259F821ACBF003C4A
-:10A170008CE800448CAD003C010D50231940003B9D
-:10A18000000000008CF7004026E20001ACA200387D
-:10A190003C05005034A700103C038000AC67003041
-:10A1A00000000000000000000000000000000000AF
-:10A1B000000000000000000000000000000000009F
-:10A1C0008C7800003316002012C0FFFD3C1180087F
-:10A1D000962200543C1580003C068008304E000159
-:10A1E000000E18C0007578218DEC04003C070800B3
-:10A1F0008CE700443C040020ACCC00488DF40404FF
-:10A20000240B0001ACD4004C10EB0260AEA4003073
-:10A21000963900523C0508008CA5004000B99021F9
-:10A22000A6320052963F005427ED0001A62D00549F
-:10A230009626005430C4FFFF5487FF2F8FB40010C0
-:10A2400030A5FFFF0E0011F4A62000543C070800C3
-:10A250008CE70024963E00520047B82303D74823DA
-:10A26000A62900520A0012198FB400108CE2004097
-:10A270000A0012BE00000000922400012407000121
-:10A280003085007F14A7001C97AD00268E2B00148C
-:10A29000240CC000316A3FFF01AC48243C06080092
-:10A2A0008CC60060012A402531043FFF0086882BC0
-:10A2B00012200011A7A800263C0508008CA5005814
-:10A2C0008F9100A0000439802402FF8000B1182182
-:10A2D0000067F82103E2F02433F8007F3C1280008D
-:10A2E0003C19800EAE5E002C0319702191D0000D38
-:10A2F000360F0004A1CF000D0E001028241200011B
-:10A30000241100013C1E80008FC401000E000FCEFE
-:10A3100002E028218FC401000E000FDE02C02821B8
-:10A320001620FF558F8B00A40A0012860013802B85
-:10A330008F8600A490C80001310400201080019194
-:10A34000241000013C048008348B0080916A007C5A
-:10A350008F9E0034AFA0002C314900011120000F66
-:10A36000AFB000288CCD00148C8E006001AE602B45
-:10A370001580000201A038218C8700603C188008FD
-:10A38000370300808C70007000F0782B15E000021D
-:10A3900000E020218C640070AFA4002C3C028008F7
-:10A3A000344500808CD200148CBF0070025FC82B33
-:10A3B00017200002024020218CA400708FA7002CDF
-:10A3C0000087182310600003AFA3003024050002AB
-:10A3D000AFA500288FA400280264882B162000BA9D
-:10A3E000000018218CD000388FCE000C3C0F00806C
-:10A3F000AFD000008CCD00343C0CFF9F01CF58251E
-:10A40000AFCD000490CA003F3586FFFF01662024CF
-:10A410003C0900203C08FFEFA3CA000B0089382547
-:10A420003511FFFF00F118243C0500088F8700A4B8
-:10A430000065C825AFD9000C8CE20014AFC000182D
-:10A440008FA60030AFC200148CF800188FB0002C1B
-:10A450003C1FFFFBAFD8001C8CEF000837F2FFFF5A
-:10A4600003326824AFCF00248CEC000C020670216C
-:10A47000AFCD000CA7C00038A7C0003AAFCE002C6B
-:10A48000AFCC0020AFC000288CEA00148FAB002CAA
-:10A49000014B48230126402311000011AFC80010D2
-:10A4A00090EB003D8FC900048FC80000000B5100E5
-:10A4B000012A28210000102100AA882B010218215E
-:10A4C0000071F821AFC50004AFDF000090F2003D3D
-:10A4D000A3D2000A8F9900A497380006A7D80008D5
-:10A4E0008F910038240800023C038008A228000055
-:10A4F0003465008094BF005C8FA4002C33F0FFFF14
-:10A500000E000FF48F9200380002CB808F8500A4DC
-:10A51000021978253C18420001F87025AE4E00045F
-:10A520008F8400388CAD0038AC8D00188CAC0034B2
-:10A53000AC8C001CAC80000CAC800010A48000141B
-:10A54000A4800016A4800020A4800022AC800024F7
-:10A5500090A6003F8FA7002CA486000250E0019235
-:10A56000240700018FA200305040000290A2003D5D
-:10A5700090A2003E244A0001A08A00018F84003886
-:10A580008FA9002CAC8900083C128008364D008051
-:10A5900091AC007C3186000214C000022407003414
-:10A5A000240700308F8500A43C198008373F0080C5
-:10A5B00090B0000093F9007C240E0004A0900030BD
-:10A5C0008F8F00A48FB8002C8F8D003891F200017E
-:10A5D0003304000301C46023A1B200318F8E003820
-:10A5E0008F8600A42402C00095CA003294C90012CC
-:10A5F0008FAB002C0142402431233FFF010388250B
-:10A60000A5D1003291D000323185000300EBF82152
-:10A610003218003F370F0040A1CF00328FA4002C2A
-:10A6200003E5382133280004108000028F850038AC
-:10A6300000E838213C0A8008ACA700343549010005
-:10A640008D2800D08FA3002C2419FFBFACA80038A0
-:10A6500090B1003C2C640001240FFFDF3227007F03
-:10A66000A0A7003C8F98003800049140931F003C45
-:10A6700003F98024A310003C8F8C0038918E003C9D
-:10A6800001CF682401B23025A186003C8F8900A447
-:10A690008F8800388D2B0020AD0B00408D220024C8
-:10A6A000AD0200448D2A0028AD0A00488D23002CFD
-:10A6B0000E001013AD03004C8FB1002824070002D8
-:10A6C000122700118FA300280003282B00058023E8
-:10A6D0000270982400608021006090210A00126FAF
-:10A6E0000010882B962900128F8400A00000902172
-:10A6F0003125FFFFA7A900180E000FC22411000189
-:10A700000A00131D3C1E80003C0B80003C12800898
-:10A710008D640100924900088F92FF340E000F995A
-:10A720003125007F8F9900388FA700288FA4003033
-:10A73000A3270000965F005C33F0FFFF0E000FF4CC
-:10A740008F91003800026B80020D80253C0842008A
-:10A750008F8D00A402085025AE2A00048DA5003874
-:10A760008F8A003800007821000F1100AD450018D5
-:10A770008DB800343C047FFF3488FFFFAD58001CC7
-:10A7800091A6003E8D4C001C8D4900180006190052
-:10A79000000677020183C821004E58250323882B29
-:10A7A000012B382100F1F821AD59001CAD5F0018D4
-:10A7B000AD40000CAD40001091B0003E8FA40030C1
-:10A7C00024090005A550001495A500042419C00013
-:10A7D00000884024A545001691B8003EA5580020E9
-:10A7E00095AF0004A54F0022AD40002491AE003F7C
-:10A7F000A54E000291A6003E91AC003D01861023BB
-:10A80000244B0001A14B00018F9100388FA3003031
-:10A810003C028008344B0100AE230008A22900301E
-:10A820008F8C00388F8700A4959F003294F000121F
-:10A830002407FFBF033FC02432053FFF03057825EF
-:10A84000A58F0032918E00322418FFDF31CD003FFA
-:10A8500035A60040A18600328F910038240DFFFFFD
-:10A86000240CFF80AE2000348D6A00D0AE2A003860
-:10A870009223003C3069007FA229003C8F90003871
-:10A880003C0380009219003C0327F824A21F003CDF
-:10A890008F8E003891C5003C00B87824A1CF003CD1
-:10A8A0008F8A00383C0E8008AD4D00408FA6002CEA
-:10A8B000AD46004491420048004C5825A14B004849
-:10A8C0008F9000388F9900A48E09004801238824B6
-:10A8D00002283825AE070048933F003EA21F004CD7
-:10A8E0008F9800A48F8F003897050004A5E5004ECF
-:10A8F0000E0003818DC500609246007C8FAC003055
-:10A9000000026940000291000040282130CB000283
-:10A9100001B21021156000AA018230213C0E80088E
-:10A9200035C20080904C007C31830004106000032D
-:10A930008FB900300005788000CF3021241F00043B
-:10A940008F910038332D000303ED8023320800037C
-:10A9500000C85021AE2A00343C188000A7C500383A
-:10A960003C0680088F04010090DE00080E000FDE18
-:10A9700033C5007F0E001013000000000A00140D04
-:10A980008FA300288F9800348CC90038241F00033F
-:10A99000A7000008AF0900008CC50034A300000A1E
-:10A9A0008F9900A4AF0500043C080080932D003F60
-:10A9B000A31F000C8F0A000C3C02FF9FA30D000B8D
-:10A9C0000148F0253451FFFF3C12FFEF8F9900A49E
-:10A9D00003D170243646FFFF01C61824AF03000CD4
-:10A9E0008F2C0014972900128F8400A0AF0C001048
-:10A9F0008F2F0014AF000018AF000020AF0F00141D
-:10AA0000AF0000248F270018312F3FFF000F59801F
-:10AA1000AF0700288F2500080164F821312D0001BF
-:10AA2000AF0500308F31000C8F920038001F51C2EB
-:10AA3000000D438001481021241E00023C068008BE
-:10AA4000A702001CA7000034AF11002CA25E00007A
-:10AA500034D20080964E005C8F9900383C0342004F
-:10AA600031CCFFFF01833825AF2700048F8B00A472
-:10AA7000240500012402C0008D640038240700343E
-:10AA8000AF2400188D690034AF29001CAF20000CE2
-:10AA9000AF200010A7200014A7200016A720002038
-:10AAA000A7200022AF200024A7300002A325000128
-:10AAB0008F8800388F9F00A4AD10000893ED000030
-:10AAC000A10D00308F8A00A48F98003891510001A9
-:10AAD000A31100318F8B0038957E003203C27024A1
-:10AAE00001CF6025A56C0032916300323064003FD5
-:10AAF000A16400329249007C3125000214A00002BA
-:10AB00008F840038240700303C198008AC8700345B
-:10AB1000373201008E5F00D0240AFFBF020090216F
-:10AB2000AC9F0038908D003C31A8007FA088003C8D
-:10AB30008F9E003893C2003C004A8824A3D1003C79
-:10AB40008F8300380010882B9066003C34CE0020A4
-:10AB5000A06E003C8F8400A48F9800388C8C00205D
-:10AB6000AF0C00408C8F0024AF0F00448C8700286E
-:10AB7000AF0700488C8B002CAF0B004C0E0010135D
-:10AB80003C1E80000A0012700000000094C80052B1
-:10AB90003C0A08008D4A002401488821A4D10052B3
-:10ABA0000A0012198FB40010A08700018F840038AA
-:10ABB000240B0001AC8B00080A0013BE3C12800875
-:10ABC000000520800A0014A200C4302127BDFFE048
-:10ABD0003C0D8008AFB20018AFB00010AFBF001C32
-:10ABE000AFB1001435B200808E4C001835A80100BA
-:10ABF000964B000695A70050910900FC000C5602E8
-:10AC0000016728233143007F312600FF240200031F
-:10AC1000AF8300A8AF8400A010C2001B30B0FFFFBC
-:10AC2000910600FC2412000530C200FF10520033D0
-:10AC300000000000160000098FBF001C8FB2001832
-:10AC40008FB100148FB00010240D0C003C0C80005C
-:10AC500027BD002003E00008AD8D00240E0011FB8D
-:10AC6000020020218FBF001C8FB200188FB100148A
-:10AC70008FB00010240D0C003C0C800027BD00207C
-:10AC800003E00008AD8D0024965800789651007AB4
-:10AC9000924E007D0238782631E8FFFF31C400C0B3
-:10ACA000148000092D11000116000037000000007B
-:10ACB0005620FFE28FBF001C0E0010D100000000E4
-:10ACC0000A00156A8FBF001C1620FFDA0000000082
-:10ACD0000E0010D1000000001440FFD88FBF001CF0
-:10ACE0001600002200000000925F007D33E2003F6A
-:10ACF000A242007D0A00156A8FBF001C950900EA78
-:10AD00008F86008000802821240400050E0007257E
-:10AD10003130FFFF978300923C0480002465FFFFE1
-:10AD2000A78500928C8A01B80540FFFE0000000054
-:10AD3000AC8001808FBF001CAC9001848FB20018E2
-:10AD40008FB100148FB000103C0760133C0B100053
-:10AD5000240D0C003C0C800027BD0020AC8701882E
-:10AD6000AC8B01B803E00008AD8D00240E0011FB90
-:10AD7000020020215040FFB18FBF001C925F007D78
-:10AD80000A00159733E2003F0E0011FB020020215C
-:10AD90001440FFAA8FBF001C122000070000000013
-:10ADA0009259007D3330003F36020040A242007DC0
-:10ADB0000A00156A8FBF001C0E0010D100000000B1
-:10ADC0005040FF9E8FBF001C9259007D3330003FE2
-:08ADD0000A0015C6360200401E
-:08ADD800000000000000001B58
-:10ADE0000000000F0000000A00000008000000063C
-:10ADF0000000000500000005000000040000000441
-:10AE00000000000300000003000000030000000336
-:10AE10000000000300000002000000020000000229
-:10AE2000000000020000000200000002000000021A
-:10AE3000000000020000000200000002000000020A
-:10AE400000000002000000020000000200000002FA
-:0CAE5000000000010000000100000001F3
-:04AE5C008008010069
-:10AE6000800800808008000000000C000000308096
-:10AE7000080011D00800127C08001294080012A8E3
-:10AE8000080012BC080011D0080011D0080012F010
-:10AE90000800132C080013400800138808001A8CBF
-:10AEA00008001A8C08001AC408001AC408001AD82E
-:10AEB00008001AA808001D0008001CCC08001D5836
-:10AEC00008001D5808001DE008001D108008024001
-:10AED000080027340800256C0800275C080027F4C8
-:10AEE0000800293C0800298808002AAC080029B479
-:10AEF00008002A38080025DC08002EDC08002EA4F3
-:10AF000008002588080025880800258808002B20CF
-:10AF100008002B20080025880800258808002DD06F
-:10AF2000080025880800258808002588080025884D
-:10AF300008002E0C080025880800258808002588B0
-:10AF4000080025880800258808002588080025882D
-:10AF5000080025880800258808002588080025881D
-:10AF6000080025880800258808002588080029A8E9
-:10AF7000080025880800258808002E680800258814
-:10AF800008002588080025880800258808002588ED
-:10AF900008002588080025880800258808002588DD
-:10AFA00008002588080025880800258808002588CD
-:10AFB00008002588080025880800258808002588BD
-:10AFC00008002CF4080025880800258808002C6853
-:10AFD00008002BC408003CE408003CB808003C848E
-:10AFE00008003C5808003C3808003BEC8008010091
-:10AFF00080080080800800008008008008004C6401
-:10B0000008004C9C08004BE408004C6408004C64A9
-:0CB01000080049B808004C6408005050CB
-:04B01C000A000C8496
-:10B0200000000000000000000000000D7278703683
-:10B030002E322E31610000000602010300000000E4
-:10B0400000000001000000000000000000000000FF
-:10B0500000000000000000000000000000000000F0
-:10B0600000000000000000000000000000000000E0
-:10B0700000000000000000000000000000000000D0
-:10B0800000000000000000000000000000000000C0
-:10B0900000000000000000000000000000000000B0
-:10B0A00000000000000000000000000000000000A0
-:10B0B0000000000000000000000000000000000090
-:10B0C0000000000000000000000000000000000080
-:10B0D0000000000000000000000000000000000070
-:10B0E0000000000000000000000000000000000060
-:10B0F0000000000000000000000000000000000050
-:10B10000000000000000000000000000000000003F
-:10B11000000000000000000000000000000000002F
-:10B12000000000000000000000000000000000001F
-:10B13000000000000000000000000000000000000F
-:10B1400000000000000000000000000000000000FF
-:10B1500000000000000000000000000000000000EF
-:10B1600000000000000000000000000000000000DF
-:10B1700000000000000000000000000000000000CF
-:10B1800000000000000000000000000000000000BF
-:10B1900000000000000000000000000000000000AF
-:10B1A000000000000000000000000000000000009F
-:10B1B000000000000000000000000000000000008F
-:10B1C000000000000000000000000000000000007F
-:10B1D000000000000000000000000000000000006F
-:10B1E000000000000000000000000000000000005F
-:10B1F000000000000000000000000000000000004F
-:10B20000000000000000000000000000000000003E
-:10B21000000000000000000000000000000000002E
-:10B22000000000000000000000000000000000001E
-:10B23000000000000000000000000000000000000E
-:10B2400000000000000000000000000000000000FE
-:10B2500000000000000000000000000000000000EE
-:10B2600000000000000000000000000000000000DE
-:10B2700000000000000000000000000000000000CE
-:10B2800000000000000000000000000000000000BE
-:10B2900000000000000000000000000000000000AE
-:10B2A000000000000000000000000000000000009E
-:10B2B000000000000000000000000000000000008E
-:10B2C000000000000000000000000000000000007E
-:10B2D000000000000000000000000000000000006E
-:10B2E000000000000000000000000000000000005E
-:10B2F000000000000000000000000000000000004E
-:10B30000000000000000000000000000000000003D
-:10B31000000000000000000000000000000000002D
-:10B32000000000000000000000000000000000001D
-:10B33000000000000000000000000000000000000D
-:10B3400000000000000000000000000000000000FD
-:10B3500000000000000000000000000000000000ED
-:10B3600000000000000000000000000000000000DD
-:10B3700000000000000000000000000000000000CD
-:10B3800000000000000000000000000000000000BD
-:10B3900000000000000000000000000000000000AD
-:10B3A000000000000000000000000000000000009D
-:10B3B000000000000000000000000000000000008D
-:10B3C000000000000000000000000000000000007D
-:10B3D000000000000000000000000000000000006D
-:10B3E000000000000000000000000000000000005D
-:10B3F000000000000000000000000000000000004D
-:10B40000000000000000000000000000000000003C
-:10B41000000000000000000000000000000000002C
-:10B42000000000000000000000000000000000001C
-:10B43000000000000000000000000000000000000C
-:10B4400000000000000000000000000000000000FC
-:10B4500000000000000000000000000000000000EC
-:10B4600000000000000000000000000000000000DC
-:10B4700000000000000000000000000000000000CC
-:10B4800000000000000000000000000000000000BC
-:10B4900000000000000000000000000000000000AC
-:10B4A000000000000000000000000000000000009C
-:10B4B000000000000000000000000000000000008C
-:10B4C000000000000000000000000000000000007C
-:10B4D000000000000000000000000000000000006C
-:10B4E000000000000000000000000000000000005C
-:10B4F000000000000000000000000000000000004C
-:10B50000000000000000000000000000000000003B
-:10B51000000000000000000000000000000000002B
-:10B52000000000000000000000000000000000001B
-:10B53000000000000000000000000000000000000B
-:10B5400000000000000000000000000000000000FB
-:10B5500000000000000000000000000000000000EB
-:10B5600000000000000000000000000000000000DB
-:10B5700000000000000000000000000000000000CB
-:10B5800000000000000000000000000000000000BB
-:10B5900000000000000000000000000000000000AB
-:10B5A000000000000000000000000000000000009B
-:10B5B000000000000000000000000000000000008B
-:10B5C000000000000000000000000000000000007B
-:10B5D000000000000000000000000000000000006B
-:10B5E000000000000000000000000000000000005B
-:10B5F000000000000000000000000000000000004B
-:10B60000000000000000000000000000000000003A
-:10B61000000000000000000000000000000000002A
-:10B62000000000000000000000000000000000001A
-:10B63000000000000000000000000000000000000A
-:10B6400000000000000000000000000000000000FA
-:10B6500000000000000000000000000000000000EA
-:10B6600000000000000000000000000000000000DA
-:10B6700000000000000000000000000000000000CA
-:10B6800000000000000000000000000000000000BA
-:10B6900000000000000000000000000000000000AA
-:10B6A000000000000000000000000000000000009A
-:10B6B000000000000000000000000000000000008A
-:10B6C000000000000000000000000000000000007A
-:10B6D000000000000000000000000000000000006A
-:10B6E000000000000000000000000000000000005A
-:10B6F000000000000000000000000000000000004A
-:10B700000000000000000000000000000000000039
-:10B710000000000000000000000000000000000029
-:10B720000000000000000000000000000000000019
-:10B730000000000000000000000000000000000009
-:10B7400000000000000000000000000000000000F9
-:10B7500000000000000000000000000000000000E9
-:10B7600000000000000000000000000000000000D9
-:10B7700000000000000000000000000000000000C9
-:10B7800000000000000000000000000000000000B9
-:10B7900000000000000000000000000000000000A9
-:10B7A0000000000000000000000000000000000099
-:10B7B0000000000000000000000000000000000089
-:10B7C0000000000000000000000000000000000079
-:10B7D0000000000000000000000000000000000069
-:10B7E0000000000000000000000000000000000059
-:10B7F0000000000000000000000000000000000049
-:10B800000000000000000000000000000000000038
-:10B810000000000000000000000000000000000028
-:10B820000000000000000000000000000000000018
-:10B830000000000000000000000000000000000008
-:10B8400000000000000000000000000000000000F8
-:10B8500000000000000000000000000000000000E8
-:10B8600000000000000000000000000000000000D8
-:10B8700000000000000000000000000000000000C8
-:10B8800000000000000000000000000000000000B8
-:10B8900000000000000000000000000000000000A8
-:10B8A0000000000000000000000000000000000098
-:10B8B0000000000000000000000000000000000088
-:10B8C0000000000000000000000000000000000078
-:10B8D0000000000000000000000000000000000068
-:10B8E0000000000000000000000000000000000058
-:10B8F0000000000000000000000000000000000048
-:10B900000000000000000000000000000000000037
-:10B910000000000000000000000000000000000027
-:10B920000000000000000000000000000000000017
-:10B930000000000000000000000000000000000007
-:10B9400000000000000000000000000000000000F7
-:10B9500000000000000000000000000000000000E7
-:10B9600000000000000000000000000000000000D7
-:10B9700000000000000000000000000000000000C7
-:10B9800000000000000000000000000000000000B7
-:10B9900000000000000000000000000000000000A7
-:10B9A0000000000000000000000000000000000097
-:10B9B0000000000000000000000000000000000087
-:10B9C0000000000000000000000000000000000077
-:10B9D0000000000000000000000000000000000067
-:10B9E0000000000000000000000000000000000057
-:10B9F0000000000000000000000000000000000047
-:10BA00000000000000000000000000000000000036
-:10BA10000000000000000000000000000000000026
-:10BA20000000000000000000000000000000000016
-:10BA30000000000000000000000000000000000006
-:10BA400000000000000000000000000000000000F6
-:10BA500000000000000000000000000000000000E6
-:10BA600000000000000000000000000000000000D6
-:10BA700000000000000000000000000000000000C6
-:10BA800000000000000000000000000000000000B6
-:10BA900000000000000000000000000000000000A6
-:10BAA0000000000000000000000000000000000096
-:10BAB0000000000000000000000000000000000086
-:10BAC0000000000000000000000000000000000076
-:10BAD0000000000000000000000000000000000066
-:10BAE0000000000000000000000000000000000056
-:10BAF0000000000000000000000000000000000046
-:10BB00000000000000000000000000000000000035
-:10BB10000000000000000000000000000000000025
-:10BB20000000000000000000000000000000000015
-:10BB30000000000000000000000000000000000005
-:10BB400000000000000000000000000000000000F5
-:10BB500000000000000000000000000000000000E5
-:10BB600000000000000000000000000000000000D5
-:10BB700000000000000000000000000000000000C5
-:10BB800000000000000000000000000000000000B5
-:10BB900000000000000000000000000000000000A5
-:10BBA0000000000000000000000000000000000095
-:10BBB0000000000000000000000000000000000085
-:10BBC0000000000000000000000000000000000075
-:10BBD0000000000000000000000000000000000065
-:10BBE0000000000000000000000000000000000055
-:10BBF0000000000000000000000000000000000045
-:10BC00000000000000000000000000000000000034
-:10BC10000000000000000000000000000000000024
-:10BC20000000000000000000000000000000000014
-:10BC30000000000000000000000000000000000004
-:10BC400000000000000000000000000000000000F4
-:10BC500000000000000000000000000000000000E4
-:10BC600000000000000000000000000000000000D4
-:10BC700000000000000000000000000000000000C4
-:10BC800000000000000000000000000000000000B4
-:10BC900000000000000000000000000000000000A4
-:10BCA0000000000000000000000000000000000094
-:10BCB0000000000000000000000000000000000084
-:10BCC0000000000000000000000000000000000074
-:10BCD0000000000000000000000000000000000064
-:10BCE0000000000000000000000000000000000054
-:10BCF0000000000000000000000000000000000044
-:10BD00000000000000000000000000000000000033
-:10BD10000000000000000000000000000000000023
-:10BD20000000000000000000000000000000000013
-:10BD30000000000000000000000000000000000003
-:10BD400000000000000000000000000000000000F3
-:10BD500000000000000000000000000000000000E3
-:10BD600000000000000000000000000000000000D3
-:10BD700000000000000000000000000000000000C3
-:10BD800000000000000000000000000000000000B3
-:10BD900000000000000000000000000000000000A3
-:10BDA0000000000000000000000000000000000093
-:10BDB0000000000000000000000000000000000083
-:10BDC0000000000000000000000000000000000073
-:10BDD0000000000000000000000000000000000063
-:10BDE0000000000000000000000000000000000053
-:10BDF0000000000000000000000000000000000043
-:10BE00000000000000000000000000000000000032
-:10BE10000000000000000000000000000000000022
-:10BE20000000000000000000000000000000000012
-:10BE30000000000000000000000000000000000002
-:10BE400000000000000000000000000000000000F2
-:10BE500000000000000000000000000000000000E2
-:10BE600000000000000000000000000000000000D2
-:10BE700000000000000000000000000000000000C2
-:10BE800000000000000000000000000000000000B2
-:10BE900000000000000000000000000000000000A2
-:10BEA0000000000000000000000000000000000092
-:10BEB0000000000000000000000000000000000082
-:10BEC0000000000000000000000000000000000072
-:10BED0000000000000000000000000000000000062
-:10BEE0000000000000000000000000000000000052
-:10BEF0000000000000000000000000000000000042
-:10BF00000000000000000000000000000000000031
-:10BF10000000000000000000000000000000000021
-:10BF20000000000000000000000000000000000011
-:10BF30000000000000000000000000000000000001
-:10BF400000000000000000000000000000000000F1
-:10BF500000000000000000000000000000000000E1
-:10BF600000000000000000000000000000000000D1
-:10BF700000000000000000000000000000000000C1
-:10BF800000000000000000000000000000000000B1
-:10BF900000000000000000000000000000000000A1
-:10BFA0000000000000000000000000000000000091
-:10BFB0000000000000000000000000000000000081
-:10BFC0000000000000000000000000000000000071
-:10BFD0000000000000000000000000000000000061
-:10BFE0000000000000000000000000000000000051
-:10BFF0000000000000000000000000000000000041
-:10C000000000000000000000000000000000000030
-:10C010000000000000000000000000000000000020
-:10C020000000000000000000000000000000000010
-:10C030000000000000000000000000000000000000
-:10C0400000000000000000000000000000000000F0
-:10C0500000000000000000000000000000000000E0
-:10C0600000000000000000000000000000000000D0
-:10C0700000000000000000000000000000000000C0
-:10C0800000000000000000000000000000000000B0
-:10C0900000000000000000000000000000000000A0
-:10C0A0000000000000000000000000000000000090
-:10C0B0000000000000000000000000000000000080
-:10C0C0000000000000000000000000000000000070
-:10C0D0000000000000000000000000000000000060
-:10C0E0000000000000000000000000000000000050
-:10C0F0000000000000000000000000000000000040
-:10C10000000000000000000000000000000000002F
-:10C11000000000000000000000000000000000001F
-:10C12000000000000000000000000000000000000F
-:10C1300000000000000000000000000000000000FF
-:10C1400000000000000000000000000000000000EF
-:10C1500000000000000000000000000000000000DF
-:10C1600000000000000000000000000000000000CF
-:10C1700000000000000000000000000000000000BF
-:10C1800000000000000000000000000000000000AF
-:10C19000000000000000000000000000000000009F
-:10C1A000000000000000000000000000000000008F
-:10C1B000000000000000000000000000000000007F
-:10C1C000000000000000000000000000000000006F
-:10C1D000000000000000000000000000000000005F
-:10C1E000000000000000000000000000000000004F
-:10C1F000000000000000000000000000000000003F
-:10C20000000000000000000000000000000000002E
-:10C21000000000000000000000000000000000001E
-:10C22000000000000000000000000000000000000E
-:10C2300000000000000000000000000000000000FE
-:10C2400000000000000000000000000000000000EE
-:10C2500000000000000000000000000000000000DE
-:10C2600000000000000000000000000000000000CE
-:10C2700000000000000000000000000000000000BE
-:10C2800000000000000000000000000000000000AE
-:10C29000000000000000000000000000000000009E
-:10C2A000000000000000000000000000000000008E
-:10C2B000000000000000000000000000000000007E
-:10C2C000000000000000000000000000000000006E
-:10C2D000000000000000000000000000000000005E
-:10C2E000000000000000000000000000000000004E
-:10C2F000000000000000000000000000000000003E
-:10C30000000000000000000000000000000000002D
-:10C31000000000000000000000000000000000001D
-:10C32000000000000000000000000000000000000D
-:10C3300000000000000000000000000000000000FD
-:10C3400000000000000000000000000000000000ED
-:10C3500000000000000000000000000000000000DD
-:10C3600000000000000000000000000000000000CD
-:10C3700000000000000000000000000000000000BD
-:10C3800000000000000000000000000000000000AD
-:10C39000000000000000000000000000000000009D
-:10C3A000000000000000000000000000000000008D
-:10C3B000000000000000000000000000000000007D
-:10C3C000000000000000000000000000000000006D
-:10C3D000000000000000000000000000000000005D
-:10C3E000000000000000000000000000000000004D
-:10C3F000000000000000000000000000000000003D
-:10C40000000000000000000000000000000000002C
-:10C41000000000000000000000000000000000001C
-:10C42000000000000000000000000000000000000C
-:10C4300000000000000000000000000000000000FC
-:10C4400000000000000000000000000000000000EC
-:10C4500000000000000000000000000000000000DC
-:10C4600000000000000000000000000000000000CC
-:10C4700000000000000000000000000000000000BC
-:10C4800000000000000000000000000000000000AC
-:10C49000000000000000000000000000000000009C
-:10C4A000000000000000000000000000000000008C
-:10C4B000000000000000000000000000000000007C
-:10C4C000000000000000000000000000000000006C
-:10C4D000000000000000000000000000000000005C
-:10C4E000000000000000000000000000000000004C
-:10C4F000000000000000000000000000000000003C
-:10C50000000000000000000000000000000000002B
-:10C51000000000000000000000000000000000001B
-:10C52000000000000000000000000000000000000B
-:10C5300000000000000000000000000000000000FB
-:10C5400000000000000000000000000000000000EB
-:10C5500000000000000000000000000000000000DB
-:10C5600000000000000000000000000000000000CB
-:10C5700000000000000000000000000000000000BB
-:10C5800000000000000000000000000000000000AB
-:10C59000000000000000000000000000000000009B
-:10C5A000000000000000000000000000000000008B
-:10C5B000000000000000000000000000000000007B
-:10C5C000000000000000000000000000000000006B
-:10C5D000000000000000000000000000000000005B
-:10C5E000000000000000000000000000000000004B
-:10C5F000000000000000000000000000000000003B
-:10C60000000000000000000000000000000000002A
-:10C61000000000000000000000000000000000001A
-:10C62000000000000000000000000000000000000A
-:10C6300000000000000000000000000000000000FA
-:10C6400000000000000000000000000000000000EA
-:10C6500000000000000000000000000000000000DA
-:10C6600000000000000000000000000000000000CA
-:10C6700000000000000000000000000000000000BA
-:10C6800000000000000000000000000000000000AA
-:10C69000000000000000000000000000000000009A
-:10C6A000000000000000000000000000000000008A
-:10C6B000000000000000000000000000000000007A
-:10C6C000000000000000000000000000000000006A
-:10C6D000000000000000000000000000000000005A
-:10C6E000000000000000000000000000000000004A
-:10C6F000000000000000000000000000000000003A
-:10C700000000000000000000000000000000000029
-:10C710000000000000000000000000000000000019
-:10C720000000000000000000000000000000000009
-:10C7300000000000000000000000000000000000F9
-:10C7400000000000000000000000000000000000E9
-:10C7500000000000000000000000000000000000D9
-:10C7600000000000000000000000000000000000C9
-:10C7700000000000000000000000000000000000B9
-:10C7800000000000000000000000000000000000A9
-:10C790000000000000000000000000000000000099
-:10C7A0000000000000000000000000000000000089
-:10C7B0000000000000000000000000000000000079
-:10C7C0000000000000000000000000000000000069
-:10C7D0000000000000000000000000000000000059
-:10C7E0000000000000000000000000000000000049
-:10C7F0000000000000000000000000000000000039
-:10C800000000000000000000000000000000000028
-:10C810000000000000000000000000000000000018
-:10C820000000000000000000000000000000000008
-:10C8300000000000000000000000000000000000F8
-:10C8400000000000000000000000000000000000E8
-:10C8500000000000000000000000000000000000D8
-:10C8600000000000000000000000000000000000C8
-:10C8700000000000000000000000000000000000B8
-:10C8800000000000000000000000000000000000A8
-:10C890000000000000000000000000000000000098
-:10C8A0000000000000000000000000000000000088
-:10C8B0000000000000000000000000000000000078
-:10C8C0000000000000000000000000000000000068
-:10C8D0000000000000000000000000000000000058
-:10C8E0000000000000000000000000000000000048
-:10C8F0000000000000000000000000000000000038
-:10C900000000000000000000000000000000000027
-:10C910000000000000000000000000000000000017
-:10C920000000000000000000000000000000000007
-:10C9300000000000000000000000000000000000F7
-:10C9400000000000000000000000000000000000E7
-:10C9500000000000000000000000000000000000D7
-:10C9600000000000000000000000000000000000C7
-:10C9700000000000000000000000000000000000B7
-:10C9800000000000000000000000000000000000A7
-:10C990000000000000000000000000000000000097
-:10C9A0000000000000000000000000000000000087
-:10C9B0000000000000000000000000000000000077
-:10C9C0000000000000000000000000000000000067
-:10C9D0000000000000000000000000000000000057
-:10C9E0000000000000000000000000000000000047
-:10C9F0000000000000000000000000000000000037
-:10CA00000000000000000000000000000000000026
-:10CA10000000000000000000000000000000000016
-:10CA20000000000000000000000000000000000006
-:10CA300000000000000000000000000000000000F6
-:10CA400000000000000000000000000000000000E6
-:10CA500000000000000000000000000000000000D6
-:10CA600000000000000000000000000000000000C6
-:10CA700000000000000000000000000000000000B6
-:10CA800000000000000000000000000000000000A6
-:10CA90000000000000000000000000000000000096
-:10CAA0000000000000000000000000000000000086
-:10CAB0000000000000000000000000000000000076
-:10CAC0000000000000000000000000000000000066
-:10CAD0000000000000000000000000000000000056
-:10CAE0000000000000000000000000000000000046
-:10CAF0000000000000000000000000000000000036
-:10CB00000000000000000000000000000000000025
-:10CB10000000000000000000000000000000000015
-:10CB20000000000000000000000000000000000005
-:10CB300000000000000000000000000000000000F5
-:10CB400000000000000000000000000000000000E5
-:10CB500000000000000000000000000000000000D5
-:10CB600000000000000000000000000000000000C5
-:10CB700000000000000000000000000000000000B5
-:10CB800000000000000000000000000000000000A5
-:10CB90000000000000000000000000000000000095
-:10CBA0000000000000000000000000000000000085
-:10CBB0000000000000000000000000000000000075
-:10CBC0000000000000000000000000000000000065
-:10CBD0000000000000000000000000000000000055
-:10CBE0000000000000000000000000000000000045
-:10CBF0000000000000000000000000000000000035
-:10CC00000000000000000000000000000000000024
-:10CC10000000000000000000000000000000000014
-:10CC20000000000000000000000000000000000004
-:10CC300000000000000000000000000000000000F4
-:10CC400000000000000000000000000000000000E4
-:10CC500000000000000000000000000000000000D4
-:10CC600000000000000000000000000000000000C4
-:10CC700000000000000000000000000000000000B4
-:10CC800000000000000000000000000000000000A4
-:10CC90000000000000000000000000000000000094
-:10CCA0000000000000000000000000000000000084
-:10CCB0000000000000000000000000000000000074
-:10CCC0000000000000000000000000000000000064
-:10CCD0000000000000000000000000000000000054
-:10CCE0000000000000000000000000000000000044
-:10CCF0000000000000000000000000000000000034
-:10CD00000000000000000000000000000000000023
-:10CD10000000000000000000000000000000000013
-:10CD20000000000000000000000000000000000003
-:10CD300000000000000000000000000000000000F3
-:10CD400000000000000000000000000000000000E3
-:10CD500000000000000000000000000000000000D3
-:10CD600000000000000000000000000000000000C3
-:10CD700000000000000000000000000000000000B3
-:10CD800000000000000000000000000000000000A3
-:10CD90000000000000000000000000000000000093
-:10CDA0000000000000000000000000000000000083
-:10CDB0000000000000000000000000000000000073
-:10CDC0000000000000000000000000000000000063
-:10CDD0000000000000000000000000000000000053
-:10CDE0000000000000000000000000000000000043
-:10CDF0000000000000000000000000000000000033
-:10CE00000000000000000000000000000000000022
-:10CE10000000000000000000000000000000000012
-:10CE20000000000000000000000000000000000002
-:10CE300000000000000000000000000000000000F2
-:10CE400000000000000000000000000000000000E2
-:10CE500000000000000000000000000000000000D2
-:10CE600000000000000000000000000000000000C2
-:10CE700000000000000000000000000000000000B2
-:10CE800000000000000000000000000000000000A2
-:10CE90000000000000000000000000000000000092
-:10CEA0000000000000000000000000000000000082
-:10CEB0000000000000000000000000000000000072
-:10CEC0000000000000000000000000000000000062
-:10CED0000000000000000000000000000000000052
-:10CEE0000000000000000000000000000000000042
-:10CEF0000000000000000000000000000000000032
-:10CF00000000000000000000000000000000000021
-:10CF10000000000000000000000000000000000011
-:10CF20000000000000000000000000000000000001
-:10CF300000000000000000000000000000000000F1
-:10CF400000000000000000000000000000000000E1
-:10CF500000000000000000000000000000000000D1
-:10CF600000000000000000000000000000000000C1
-:10CF700000000000000000000000000000000000B1
-:10CF800000000000000000000000000000000000A1
-:10CF90000000000000000000000000000000000091
-:10CFA0000000000000000000000000000000000081
-:10CFB0000000000000000000000000000000000071
-:10CFC0000000000000000000000000000000000061
-:10CFD0000000000000000000000000000000000051
-:10CFE0000000000000000000000000000000000041
-:10CFF0000000000000000000000000000000000031
-:10D000000000000000000000000000000000000020
-:10D010000000000000000000000000000000000010
-:10D020000000000000000000000000000000000000
-:10D0300000000000000000000000000000000000F0
-:10D0400000000000000000000000000000000000E0
-:10D0500000000000000000000000000000000000D0
-:10D0600000000000000000000000000000000000C0
-:10D0700000000000000000000000000000000000B0
-:10D0800000000000000000000000000000000000A0
-:10D090000000000000000000000000000000000090
-:10D0A0000000000000000000000000000000000080
-:10D0B0000000000000000000000000000000000070
-:10D0C0000000000000000000000000000000000060
-:10D0D0000000000000000000000000000000000050
-:10D0E0000000000000000000000000000000000040
-:10D0F0000000000000000000000000000000000030
-:10D10000000000000000000000000000000000001F
-:10D11000000000000000000000000000000000000F
-:10D1200000000000000000000000000000000000FF
-:10D1300000000000000000000000000000000000EF
-:10D1400000000000000000000000000000000000DF
-:10D1500000000000000000000000000000000000CF
-:10D1600000000000000000000000000000000000BF
-:10D1700000000000000000000000000000000000AF
-:10D18000000000000000000000000000000000009F
-:10D19000000000000000000000000000000000008F
-:10D1A000000000000000000000000000000000007F
-:10D1B000000000000000000000000000000000006F
-:10D1C000000000000000000000000000000000005F
-:10D1D000000000000000000000000000000000004F
-:10D1E000000000000000000000000000000000003F
-:10D1F000000000000000000000000000000000002F
-:10D20000000000000000000000000000000000001E
-:10D21000000000000000000000000000000000000E
-:10D2200000000000000000000000000000000000FE
-:10D2300000000000000000000000000000000000EE
-:10D2400000000000000000000000000000000000DE
-:10D2500000000000000000000000000000000000CE
-:10D2600000000000000000000000000000000000BE
-:10D2700000000000000000000000000000000000AE
-:10D28000000000000000000000000000000000009E
-:10D29000000000000000000000000000000000008E
-:10D2A000000000000000000000000000000000007E
-:10D2B000000000000000000000000000000000006E
-:10D2C000000000000000000000000000000000005E
-:10D2D000000000000000000000000000000000004E
-:10D2E000000000000000000000000000000000003E
-:10D2F000000000000000000000000000000000002E
-:10D30000000000000000000000000000000000001D
-:10D31000000000000000000000000000000000000D
-:10D3200000000000000000000000000000000000FD
-:10D3300000000000000000000000000000000000ED
-:10D3400000000000000000000000000000000000DD
-:10D3500000000000000000000000000000000000CD
-:10D3600000000000000000000000000000000000BD
-:10D3700000000000000000000000000000000000AD
-:10D38000000000000000000000000000000000009D
-:10D39000000000000000000000000000000000008D
-:10D3A000000000000000000000000000000000007D
-:10D3B000000000000000000000000000000000006D
-:10D3C000000000000000000000000000000000005D
-:10D3D000000000000000000000000000000000004D
-:10D3E000000000000000000000000000000000003D
-:10D3F000000000000000000000000000000000002D
-:10D40000000000000000000000000000000000001C
-:10D41000000000000000000000000000000000000C
-:10D4200000000000000000000000000000000000FC
-:10D4300000000000000000000000000000000000EC
-:10D4400000000000000000000000000000000000DC
-:10D4500000000000000000000000000000000000CC
-:10D4600000000000000000000000000000000000BC
-:10D4700000000000000000000000000000000000AC
-:10D48000000000000000000000000000000000009C
-:10D49000000000000000000000000000000000008C
-:10D4A000000000000000000000000000000000007C
-:10D4B000000000000000000000000000000000006C
-:10D4C000000000000000000000000000000000005C
-:10D4D000000000000000000000000000000000004C
-:10D4E000000000000000000000000000000000003C
-:10D4F000000000000000000000000000000000002C
-:10D50000000000000000000000000000000000001B
-:10D51000000000000000000000000000000000000B
-:10D5200000000000000000000000000000000000FB
-:10D5300000000000000000000000000000000000EB
-:10D5400000000000000000000000000000000000DB
-:10D5500000000000000000000000000000000000CB
-:10D5600000000000000000000000000000000000BB
-:10D5700000000000000000000000000000000000AB
-:10D58000000000000000000000000000000000009B
-:10D59000000000000000000000000000000000008B
-:10D5A000000000000000000000000000000000007B
-:10D5B000000000000000000000000000000000006B
-:10D5C000000000000000000000000000000000005B
-:10D5D000000000000000000000000000000000004B
-:10D5E000000000000000000000000000000000003B
-:10D5F000000000000000000000000000000000002B
-:10D60000000000000000000000000000000000001A
-:10D61000000000000000000000000000000000000A
-:10D6200000000000000000000000000000000000FA
-:10D6300000000000000000000000000000000000EA
-:10D6400000000000000000000000000000000000DA
-:10D6500000000000000000000000000000000000CA
-:10D6600000000000000000000000000000000000BA
-:10D6700000000000000000000000000000000000AA
-:10D68000000000000000000000000000000000009A
-:10D69000000000000000000000000000000000008A
-:10D6A000000000000000000000000000000000007A
-:10D6B000000000000000000000000000000000006A
-:10D6C000000000000000000000000000000000005A
-:10D6D000000000000000000000000000000000004A
-:10D6E000000000000000000000000000000000003A
-:10D6F000000000000000000000000000000000002A
-:10D700000000000000000000000000000000000019
-:10D710000000000000000000000000000000000009
-:10D7200000000000000000000000000000000000F9
-:10D7300000000000000000000000000000000000E9
-:10D7400000000000000000000000000000000000D9
-:10D7500000000000000000000000000000000000C9
-:10D7600000000000000000000000000000000000B9
-:10D7700000000000000000000000000000000000A9
-:10D780000000000000000000000000000000000099
-:10D790000000000000000000000000000000000089
-:10D7A0000000000000000000000000000000000079
-:10D7B0000000000000000000000000000000000069
-:10D7C0000000000000000000000000000000000059
-:10D7D0000000000000000000000000000000000049
-:10D7E0000000000000000000000000000000000039
-:10D7F0000000000000000000000000000000000029
-:10D800000000000000000000000000000000000018
-:10D810000000000000000000000000000000000008
-:10D8200000000000000000000000000000000000F8
-:10D8300000000000000000000000000000000000E8
-:10D8400000000000000000000000000000000000D8
-:10D8500000000000000000000000000000000000C8
-:10D8600000000000000000000000000000000000B8
-:10D8700000000000000000000000000000000000A8
-:10D880000000000000000000000000000000000098
-:10D890000000000000000000000000000000000088
-:10D8A0000000000000000000000000000000000078
-:10D8B0000000000000000000000000000000000068
-:10D8C0000000000000000000000000000000000058
-:10D8D0000000000000000000000000000000000048
-:10D8E0000000000000000000000000000000000038
-:10D8F0000000000000000000000000000000000028
-:10D900000000000000000000000000000000000017
-:10D910000000000000000000000000000000000007
-:10D9200000000000000000000000000000000000F7
-:10D9300000000000000000000000000000000000E7
-:10D9400000000000000000000000000000000000D7
-:10D9500000000000000000000000000000000000C7
-:10D9600000000000000000000000000000000000B7
-:10D9700000000000000000000000000000000000A7
-:10D980000000000000000000000000000000000097
-:10D990000000000000000000000000000000000087
-:10D9A0000000000000000000000000000000000077
-:10D9B0000000000000000000000000000000000067
-:10D9C0000000000000000000000000000000000057
-:10D9D0000000000000000000000000000000000047
-:10D9E0000000000000000000000000000000000037
-:10D9F0000000000000000000000000000000000027
-:10DA00000000000000000000000000000000000016
-:10DA10000000000000000000000000000000000006
-:10DA200000000000000000000000000000000000F6
-:10DA300000000000000000000000000000000000E6
-:10DA400000000000000000000000000000000000D6
-:10DA500000000000000000000000000000000000C6
-:10DA600000000000000000000000000000000000B6
-:10DA700000000000000000000000000000000000A6
-:10DA80000000000000000000000000000000000096
-:10DA90000000000000000000000000000000000086
-:10DAA0000000000000000000000000000000000076
-:10DAB0000000000000000000000000000000000066
-:10DAC0000000000000000000000000000000000056
-:10DAD0000000000000000000000000000000000046
-:10DAE0000000000000000000000000000000000036
-:10DAF0000000000000000000000000000000000026
-:10DB00000000000000000000000000000000000015
-:10DB10000000000000000000000000000000000005
-:10DB200000000000000000000000000000000000F5
-:10DB300000000000000000000000000000000000E5
-:10DB400000000000000000000000000000000000D5
-:10DB500000000000000000000000000000000000C5
-:10DB600000000000000000000000000000000000B5
-:10DB700000000000000000000000000000000000A5
-:10DB80000000000000000000000000000000000095
-:10DB90000000000000000000000000000000000085
-:10DBA0000000000000000000000000000000000075
-:10DBB0000000000000000000000000000000000065
-:10DBC0000000000000000000000000000000000055
-:10DBD0000000000000000000000000000000000045
-:10DBE0000000000000000000000000000000000035
-:10DBF0000000000000000000000000000000000025
-:10DC00000000000000000000000000000000000014
-:10DC10000000000000000000000000000000000004
-:10DC200000000000000000000000000000000000F4
-:10DC300000000000000000000000000000000000E4
-:10DC400000000000000000000000000000000000D4
-:10DC500000000000000000000000000000000000C4
-:10DC600000000000000000000000000000000000B4
-:10DC700000000000000000000000000000000000A4
-:10DC80000000000000000000000000000000000094
-:10DC90000000000000000000000000000000000084
-:10DCA0000000000000000000000000000000000074
-:10DCB0000000000000000000000000000000000064
-:10DCC0000000000000000000000000000000000054
-:10DCD0000000000000000000000000000000000044
-:10DCE0000000000000000000000000000000000034
-:10DCF0000000000000000000000000000000000024
-:10DD00000000000000000000000000000000000013
-:10DD10000000000000000000000000000000000003
-:10DD200000000000000000000000000000000000F3
-:10DD300000000000000000000000000000000000E3
-:10DD400000000000000000000000000000000000D3
-:10DD500000000000000000000000000000000000C3
-:10DD600000000000000000000000000000000000B3
-:10DD700000000000000000000000000000000000A3
-:10DD80000000000000000000000000000000000093
-:10DD90000000000000000000000000000000000083
-:10DDA0000000000000000000000000000000000073
-:10DDB0000000000000000000000000000000000063
-:10DDC0000000000000000000000000000000000053
-:10DDD0000000000000000000000000000000000043
-:10DDE0000000000000000000000000000000000033
-:10DDF0000000000000000000000000000000000023
-:10DE00000000000000000000000000000000000012
-:10DE10000000000000000000000000000000000002
-:10DE200000000000000000000000000000000000F2
-:10DE300000000000000000000000000000000000E2
-:10DE400000000000000000000000000000000000D2
-:10DE500000000000000000000000000000000000C2
-:10DE600000000000000000000000000000000000B2
-:10DE700000000000000000000000000000000000A2
-:10DE80000000000000000000000000000000000092
-:10DE90000000000000000000000000000000000082
-:10DEA0000000000000000000000000000000000072
-:10DEB0000000000000000000000000000000000062
-:10DEC0000000000000000000000000000000000052
-:10DED0000000000000000000000000000000000042
-:10DEE0000000000000000000000000000000000032
-:10DEF0000000000000000000000000000000000022
-:10DF00000000000000000000000000000000000011
-:10DF10000000000000000000000000000000000001
-:10DF200000000000000000000000000000000000F1
-:10DF300000000000000000000000000000000000E1
-:10DF400000000000000000000000000000000000D1
-:10DF500000000000000000000000000000000000C1
-:10DF600000000000000000000000000000000000B1
-:10DF700000000000000000000000000000000000A1
-:10DF80000000000000000000000000000000000091
-:10DF90000000000000000000000000000000000081
-:10DFA0000000000000000000000000000000000071
-:10DFB0000000000000000000000000000000000061
-:10DFC0000000000000000000000000000000000051
-:10DFD0000000000000000000000000000000000041
-:10DFE0000000000000000000000000000000000031
-:10DFF0000000000000000000000000000000000021
-:10E000000000000000000000000000000000000010
-:10E010000000000000000000000000000000000000
-:10E0200000000000000000000000000000000000F0
-:10E0300000000000000000000000000000000000E0
-:10E0400000000000000000000000000000000000D0
-:10E0500000000000000000000000000000000000C0
-:10E0600000000000000000000000000000000000B0
-:10E0700000000000000000000000000000000000A0
-:10E080000000000000000000000000000000000090
-:10E090000000000000000000000000000000000080
-:10E0A0000000000000000000000000000000000070
-:10E0B0000000000000000000000000000000000060
-:10E0C0000000000000000000000000000000000050
-:10E0D0000000000000000000000000000000000040
-:10E0E0000000000000000000000000000000000030
-:10E0F0000000000000000000000000000000000020
-:10E10000000000000000000000000000000000000F
-:10E1100000000000000000000000000000000000FF
-:10E1200000000000000000000000000000000000EF
-:10E1300000000000000000000000000000000000DF
-:10E1400000000000000000000000000000000000CF
-:10E1500000000000000000000000000000000000BF
-:10E1600000000000000000000000000000000000AF
-:10E17000000000000000000000000000000000009F
-:10E18000000000000000000000000000000000008F
-:10E19000000000000000000000000000000000007F
-:10E1A000000000000000000000000000000000006F
-:10E1B000000000000000000000000000000000005F
-:10E1C000000000000000000000000000000000004F
-:10E1D000000000000000000000000000000000003F
-:10E1E000000000000000000000000000000000002F
-:10E1F000000000000000000000000000000000809F
-:10E20000000000000000000000000000000000000E
-:10E2100000000000000000000000000000000000FE
-:10E220000000000A000000000000000000000000E4
-:10E2300010000003000000000000000D0000000DB1
-:10E240003C020801244295A03C030801246397DCAA
-:10E25000AC4000000043202B1480FFFD244200044A
-:10E260003C1D080037BD9FFC03A0F0213C100800B6
-:10E27000261032103C1C0801279C95A00E0012BEEF
-:10E28000000000000000000D3C02800030A5FFFFF0
-:10E2900030C600FF344301803C0880008D0901B87E
-:10E2A0000520FFFE00000000AC6400002404000212
-:10E2B000A4650008A066000AA064000BAC67001803
-:10E2C0003C03100003E00008AD0301B83C0560000A
-:10E2D0008CA24FF80440FFFE00000000ACA44FC029
-:10E2E0003C0310003C040200ACA44FC403E000084F
-:10E2F000ACA34FF89486000C00A050212488001491
-:10E3000000062B0200051080004448210109182B4B
-:10E310001060001100000000910300002C6400094F
-:10E320005080000991190001000360803C0D080134
-:10E3300025AD9234018D58218D67000000E0000862
-:10E340000000000091190001011940210109302B42
-:10E3500054C0FFF29103000003E000080000102108
-:10E360000A000CCC25080001910F0001240E000AC0
-:10E3700015EE00400128C8232F38000A1700003D81
-:10E38000250D00028D580000250F0006370E0100F4
-:10E39000AD4E0000910C000291AB000191A400026F
-:10E3A00091A60003000C2E00000B3C0000A71025D6
-:10E3B00000041A000043C8250326C025AD580004F8
-:10E3C000910E000691ED000191E7000291E5000336
-:10E3D000000E5E00000D6400016C30250007220075
-:10E3E00000C41025004518252508000A0A000CCC99
-:10E3F000AD430008910F000125040002240800022B
-:10E4000055E80001012020210A000CCC00804021A9
-:10E41000910C0001240B0003158B00160000000076
-:10E420008D580000910E000225080003370D0008EA
-:10E43000A14E00100A000CCCAD4D00009119000156
-:10E44000240F0004172F000B0000000091070002AA
-:10E45000910400038D43000000072A0000A410254A
-:10E460003466000425080004AD42000C0A000CCC00
-:10E47000AD46000003E000082402000127BDFFE8CC
-:10E48000AFBF0014AFB000100E00164E0080802108
-:10E490003C0480083485008090A600052403FFFE1C
-:10E4A0000200202100C310248FBF00148FB0001081
-:10E4B000A0A200050A00165827BD001827BDFFE8D6
-:10E4C000AFB00010AFBF00140E000FD40080802149
-:10E4D0003C06800834C5008090A40000240200504F
-:10E4E000308300FF106200073C09800002002021F9
-:10E4F0008FBF00148FB00010AD2001800A00108F74
-:10E5000027BD0018240801003C07800002002021DC
-:10E510008FBF00148FB00010ACE801800A00108F8C
-:10E5200027BD001827BDFF783C058008AFBE0080DE
-:10E53000AFB7007CAFB3006CAFB10064AFBF008475
-:10E54000AFB60078AFB50074AFB40070AFB200687A
-:10E55000AFB0006034A600803C0580008CB201287A
-:10E5600090C400098CA701043C020001309100FF17
-:10E5700000E218240000B8210000F021106000071C
-:10E58000000098213C0908008D2931F02413000176
-:10E59000252800013C010800AC2831F0ACA0008423
-:10E5A00090CC0005000C5827316A0001154000721C
-:10E5B000AFA0005090CD00002406002031A400FF41
-:10E5C00010860018240E0050108E009300000000EA
-:10E5D0003C1008008E1000DC260F00013C010800F2
-:10E5E000AC2F00DC0E0016C7000000000040182110
-:10E5F0008FBF00848FBE00808FB7007C8FB60078FD
-:10E600008FB500748FB400708FB3006C8FB2006848
-:10E610008FB100648FB000600060102103E000083B
-:10E6200027BD00880000000D3C1F8000AFA0003017
-:10E6300097E501168FE201043C04002030B9FFFF8A
-:10E64000004438240007182B00033140AFA60030E7
-:10E650008FF5010437F80C003C1600400338802188
-:10E6600002B6A02434C40040128000479215000D69
-:10E6700032A800201500000234860080008030217E
-:10E6800014C0009FAFA600303C0D800835A6008066
-:10E6900090CC0008318B0040516000063C06800899
-:10E6A000240E0004122E00A8240F0012122F003294
-:10E6B0003C06800834C401003C0280009447011AE3
-:10E6C0009619000E909F00088E18000830E3FFFF97
-:10E6D00003F9B00432B40004AFB6005CAFA3005835
-:10E6E0008E1600041280002EAFB8005434C3008090
-:10E6F000906800083105004014A0002500000000CB
-:10E700008C70005002D090230640000500000000ED
-:10E710008C71003402D1A82306A201678EE20008A2
-:10E72000126000063C1280003C1508008EB531F4E2
-:10E7300026B600013C010800AC3631F4AE4000447E
-:10E74000240300018FBF00848FBE00808FB7007C40
-:10E750008FB600788FB500748FB400708FB3006CE3
-:10E760008FB200688FB100648FB00060006010212C
-:10E7700003E0000827BD00880E000D2800002021BE
-:10E780000A000D75004018210A000D9500C02021D7
-:10E790000E00171702C020211440FFE10000000006
-:10E7A0003C0B8008356400808C8A003402CA482300
-:10E7B0000520001D000000003C1E08008FDE310017
-:10E7C00027D700013C010800AC3731001260000679
-:10E7D000024020213C1408008E9431F42690000160
-:10E7E0003C010800AC3031F40E00164E3C1E80088F
-:10E7F00037CD008091B700250240202136EE00047D
-:10E800000E001658A1AE00250E000CAC02402021CF
-:10E810000A000DCA240300013C17080126F796A040
-:10E820000A000D843C1F80008C86003002C66023E5
-:10E830001980000C2419000C908F004F3C14080024
-:10E840008E94310032B500FC35ED0001268E0001BA
-:10E850003C010800AC2E3100A08D004FAFA0005845
-:10E860002419000CAFB900308C9800300316A02397
-:10E870001A80010B8FA300580074F82A17E0FFD309
-:10E88000000000001074002A8FA5005802D4B021A7
-:10E8900000B410233044FFFFAFA4005832A8000298
-:10E8A0001100002E32AB00103C15800836B00080FD
-:10E8B0009216000832D30040526000FB8EE200083E
-:10E8C0000E00164E02402021240A0018A20A000958
-:10E8D000921100052409FFFE024020210229902404
-:10E8E0000E001658A2120005240400390000282149
-:10E8F0000E0016F2240600180A000DCA24030001B7
-:10E9000092FE000C3C0A800835490080001EBB00C6
-:10E910008D27003836F10081024020213225F08118
-:10E920000E000C9B30C600FF0A000DC10000000065
-:10E930003AA7000130E300011460FFA402D4B02123
-:10E940000A000E1D00000000024020210E001734B6
-:10E95000020028210A000D75004018211160FF7087
-:10E960003C0F80083C0D800835EE00808DC40038D7
-:10E970008FA300548DA60004006660231D80FF68ED
-:10E98000000000000064C02307020001AFA400548F
-:10E990003C1F08008FFF31E433F9000113200015FC
-:10E9A0008FAC00583C07800094E3011A10600012FD
-:10E9B0003C0680080E002161024020213C03080132
-:10E9C000906396D13064000214800145000000007D
-:10E9D000306C0004118000078FAC0058306600FBDB
-:10E9E0003C010801A02696D132B500FCAFA000582A
-:10E9F0008FAC00583C06800834D30080AFB40018B8
-:10EA0000AFB60010AFAC00143C088000950B01209D
-:10EA10008E6F0030966A005C8FA3005C8FBF003061
-:10EA20003169FFFF3144FFFF8FAE005401341021E4
-:10EA3000350540000064382B0045C82103E7C02598
-:10EA4000AFB90020AFAF0028AFB80030AFAF00249F
-:10EA5000AFA0002CAFAE0034926D000831B40008B6
-:10EA6000168000BB020020218EE200040040F8095D
-:10EA700027A400108FAF003031F300025660000170
-:10EA800032B500FE3C048008349F008093F90008F2
-:10EA900033380040530000138FA400248C850004F9
-:10EAA0008FA7005410A700D52404001432B0000131
-:10EAB0001200000C8FA400242414000C1234011A3C
-:10EAC0002A2D000D11A001022413000E240E000AAD
-:10EAD000522E0001241E00088FAF002425E40001FF
-:10EAE000AFA400248FAA00143C0B80083565008079
-:10EAF000008A48218CB10030ACA9003090A4004EAF
-:10EB00008CA700303408FFFF0088180400E3F821C8
-:10EB1000ACBF00348FA600308FB900548FB8005CB2
-:10EB200030C200081040000B033898218CAC002044
-:10EB3000119300D330C600FF92EE000C8FA7003473
-:10EB400002402021000E6B0035B400800E000C9BAB
-:10EB50003285F0803C028008345000808E0F0030F7
-:10EB600001F1302318C00097264800803C070800B8
-:10EB70008CE731E42404FF80010418243118007F5D
-:10EB80003C1F80003C19800430F10001AFE300908D
-:10EB900012200006031928213C030801906396D136
-:10EBA00030690008152000C6306A00F73C10800864
-:10EBB00036040080908C004F318B000115600042BC
-:10EBC000000000003C0608008CC6319830CE0010D2
-:10EBD00051C0004230F9000190AF006B55E0003F9A
-:10EBE00030F9000124180001A0B8006B3C1180002E
-:10EBF0009622007A24470064A48700123C0D800806
-:10EC000035A5008090B40008329000401600000442
-:10EC10003C03800832AE000115C0008B00000000EC
-:10EC2000346400808C86002010D3000A3463010015
-:10EC30008C67000002C7782319E000978FBF00544B
-:10EC4000AC93002024130001AC760000AFB3005059
-:10EC5000AC7F000417C0004E000000008FA90050D8
-:10EC60001520000B000000003C030801906396D1C2
-:10EC7000306A00011140002E8FAB0058306400FE56
-:10EC80003C010801A02496D10A000D75000018214E
-:10EC90000E000CAC024020210A000F1300000000FF
-:10ECA0000A000E200000A0210040F80924040017EB
-:10ECB0000A000DCA240300010040F80924040016CC
-:10ECC0000A000DCA240300019094004F240DFFFE9A
-:10ECD000028D2824A085004F30F900011320000682
-:10ECE0003C0480083C030801906396D1307F0010FB
-:10ECF00017E00051306800EF34900080240A0001D2
-:10ED0000024020210E00164EA60A00129203002592
-:10ED100024090001AFA90050346200010240202103
-:10ED20000E001658A20200250A000EF93C0D8008BC
-:10ED30001160FE83000018218FA5003030AC000464
-:10ED40001180FE2C8FBF00840A000DCB240300012C
-:10ED500027A500380E000CB6AFA000385440FF4382
-:10ED60008EE200048FB40038329001005200FF3F61
-:10ED70008EE200048FA3003C8E6E0058006E682364
-:10ED800005A3FF39AE6300580A000E948EE200041A
-:10ED90000E00164E024020213C038008346800809B
-:10EDA000024020210E001658A11E000903C0302188
-:10EDB000240400370E0016F2000028210A000F116B
-:10EDC0008FA900508FAB00185960FF8D3C0D800853
-:10EDD0000E00164E02402021920C00252405000151
-:10EDE000AFA5005035820004024020210E001658C5
-:10EDF000A20200250A000EF93C0D800812240059D9
-:10EE00002A2300151060004D240900162408000C68
-:10EE10005628FF2732B000013C0A8008914C001BA5
-:10EE20002406FFBD241E000E01865824A14B001BA2
-:10EE30000A000EA532B000013C010801A02896D1BD
-:10EE40000A000EF93C0D80088CB500308EFE0008DB
-:10EE50002404001826B6000103C0F809ACB600303F
-:10EE60003C030801906396D13077000116E0FF81E2
-:10EE7000306A00018FB200300A000D753243000481
-:10EE80003C1080009605011A50A0FF2B34C60010DC
-:10EE90000A000EC892EE000C8C6200001456FF6D42
-:10EEA000000000008C7800048FB9005403388823D8
-:10EEB0000621FF638FBF00540A000F0E0000000000
-:10EEC0003C010801A02A96D10A000F3030F9000158
-:10EED0001633FF028FAF00240A000EB0241E00106C
-:10EEE0000E00164E024020213C0B80083568008041
-:10EEF00091090025240A0001AFAA0050353300040F
-:10EF0000024020210E001658A11300253C050801DF
-:10EF100090A596D130A200FD3C010801A02296D117
-:10EF20000A000E6D004018212411000E53D1FEEA94
-:10EF3000241E00100A000EAF241E00165629FEDC07
-:10EF400032B000013C0A8008914C001B2406FFBD32
-:10EF5000241E001001865824A14B001B0A000EA598
-:10EF600032B000010A000EA4241E00123C038000EF
-:10EF70008C6201B80440FFFE24040800AC6401B8B0
-:10EF800003E000080000000030A5FFFF30C6FFFFCF
-:10EF90003C0780008CE201B80440FFFE34EA0180A7
-:10EFA000AD440000ACE400203C0480089483004899
-:10EFB0003068FFFF11000016AF88000824AB001274
-:10EFC000010B482B512000133C04800034EF01005A
-:10EFD00095EE00208F890000240D001A31CCFFFF30
-:10EFE00031274000A14D000B10E000362583FFFEC5
-:10EFF0000103C02B170000348F9900048F88000490
-:10F00000A5430014350700010A001003AF87000470
-:10F010003C04800024030003348201808F890000B7
-:10F020008F870004A043000B3C088000350C018052
-:10F03000A585000EA585001A8F85000C30EB800099
-:10F04000A5890010AD850028A58600081160000F75
-:10F050008F85001435190100972A00163158FFFCDE
-:10F06000270F000401E870218DCD400031A6FFFF7D
-:10F0700014C000072403BFFF3C02FFFF34487FFF9A
-:10F0800000E83824AF8700048F8500142403BFFFF5
-:10F090003C04800000E3582434830180A46B0026E4
-:10F0A000AC69002C10A0000300054C02A465001000
-:10F0B000A46900263C071000AC8701B803E00008F3
-:10F0C000000000008F990004240AFFFE032A382460
-:10F0D0000A001003AF87000427BDFFE88FA20028B5
-:10F0E00030A5FFFF30C6FFFFAFBF0010AF87000C99
-:10F0F000AF820014AF8000040E000FDBAF80000071
-:10F100008FBF001027BD001803E00008AF80001477
-:10F110003C06800034C4007034C701008C8A0000B3
-:10F1200090E500128F84000027BDFFF030A300FFA0
-:10F13000000318823082400010400037246500032D
-:10F140000005C8800326C0218F0E4000246F0004F4
-:10F15000000F6880AFAE000001A660218D8B4000DB
-:10F16000AFAB000494E900163128FFFC01063821FA
-:10F170008CE64000AFA600088FA9000800003021EF
-:10F18000000028213C07080024E701000A0010675E
-:10F19000240800089059000024A500012CAC000CA4
-:10F1A0000079C0210018788001E770218DCD000022
-:10F1B0001180000600CD302603A5102114A8FFF50C
-:10F1C00000051A005520FFF4905900003C0480000F
-:10F1D000348700703C0508008CA531048CE30000E6
-:10F1E0002CA2002010400009006A38230005488046
-:10F1F0003C0B0800256B3108012B402124AA00019B
-:10F20000AD0700003C010800AC2A310400C0102109
-:10F2100003E0000827BD0010308220001040000BE2
-:10F2200000055880016648218D24400024680004B0
-:10F2300000083880AFA4000000E618218C6540006B
-:10F24000AFA000080A001057AFA500040000000D91
-:10F250000A0010588FA9000827BDFFE03C07800076
-:10F2600034E60100AFBF001CAFB20018AFB100140C
-:10F27000AFB0001094C5000E8F87000030A4FFFFD0
-:10F280002483000430E2400010400010AF830028C7
-:10F290003C09002000E940241100000D30EC800002
-:10F2A0008F8A0004240BBFFF00EB38243543100085
-:10F2B000AF87000030F220001640000B3C1900041C
-:10F2C000241FFFBF0A0010B7007F102430EC80001D
-:10F2D000158000423C0E002030F220001240FFF862
-:10F2E0008F8300043C19000400F9C0241300FFF5CB
-:10F2F000241FFFBF34620040AF82000430E20100EF
-:10F300001040001130F010008F83002C10600006B8
-:10F310003C0F80003C05002000E52024148000C044
-:10F320003C0800043C0F800035EE010095CD001E26
-:10F3300095CC001C31AAFFFF000C5C00014B482556
-:10F34000AF89000C30F010001200000824110001F9
-:10F3500030F100201620008B3C18100000F890249B
-:10F36000164000823C040C002411000130E801002A
-:10F370001500000B3C0900018F85000430A94000F6
-:10F38000152000073C0900013C0C1F0100EC58242B
-:10F390003C0A1000116A01183C1080003C09000171
-:10F3A00000E9302410C000173C0B10003C18080086
-:10F3B0008F1800243307000214E0014024030001E9
-:10F3C0008FBF001C8FB200188FB100148FB00010D7
-:10F3D0000060102103E0000827BD002000EE682433
-:10F3E00011A0FFBE30F220008F8F00043C11FFFF00
-:10F3F00036307FFF00F0382435E380000A0010A685
-:10F40000AF87000000EB102450400065AF8000245F
-:10F410008F8C002C3C0D0F0000ED18241580008807
-:10F42000AF83001030E8010011000086938F0010B8
-:10F430003C0A0200106A00833C1280003650010032
-:10F44000920500139789002A3626000230AF00FF8C
-:10F4500025EE0004000E19C03C0480008C9801B811
-:10F460000700FFFE34880180AD0300003C198008CE
-:10F47000AC830020973100483225FFFF10A0015CCB
-:10F48000AF8500082523001200A3F82B53E0015993
-:10F490008F850004348D010095AC00202402001AF1
-:10F4A00030E44000318BFFFFA102000B108001927D
-:10F4B0002563FFFE00A3502B154001908F8F0004A1
-:10F4C000A50300148F88000435050001AF850004F2
-:10F4D0003C08800035190180A729000EA729001AD1
-:10F4E0008F89000C30B18000A7270010AF290028B9
-:10F4F000A72600081220000E3C04800035020100FF
-:10F50000944C0016318BFFFC256400040088182100
-:10F510008C7F400033E6FFFF14C000053C048000F0
-:10F520003C0AFFFF354D7FFF00AD2824AF85000466
-:10F53000240EBFFF00AE402434850180A4A800261D
-:10F54000ACA7002C3C071000AC8701B800001821C4
-:10F550008FBF001C8FB200188FB100148FB0001045
-:10F560000060102103E0000827BD00203C020BFFD3
-:10F5700000E41824345FFFFF03E3C82B5320FF7B14
-:10F58000241100013C0608008CC6002C24C5000193
-:10F590003C010800AC25002C0A0010D42411000501
-:10F5A0008F85002410A0002FAF80001090A30000D2
-:10F5B000146000792419000310A0002A30E601002D
-:10F5C00010C000CC8F860010241F000210DF00C97D
-:10F5D0008F8B000C3C0708008CE7003824E4FFFF09
-:10F5E00014E0000201641824000018213C0D0800FA
-:10F5F00025AD0038006D1021904C00048F85002847
-:10F6000025830004000321C030A5FFFF3626000239
-:10F610000E000FDB000000000A00114D0000182151
-:10F6200000E8302414C0FF403C0F80000E00103D65
-:10F63000000000008F8700000A0010CAAF82000C93
-:10F64000938F00103C18080127189620000F90C0D7
-:10F6500002588021AF9000248F85002414A0FFD38E
-:10F66000AF8F00103C0480008C86400030C5010044
-:10F6700010A000BC322300043C0C08008D8C002438
-:10F6800024120004106000C23190000D3C04800080
-:10F690008C8D40003402FFFF11A201003231FFFBCC
-:10F6A0008C884000310A01005540000124110010EF
-:10F6B00030EE080011C000BE2419FFFB8F9800280F
-:10F6C0002F0F03EF51E000010219802430E90100FF
-:10F6D00011200014320800018F87002C14E000FB79
-:10F6E0008F8C000C3C05800034AB0100917F00132F
-:10F6F00033E300FF246A00042403FFFE0203802496
-:10F70000000A21C012000002023230253226FFFF1B
-:10F710000E000FDB9785002A1200FF290000182138
-:10F72000320800011100000D32180004240E0001FF
-:10F73000120E0002023230253226FFFF9785002A82
-:10F740000E000FDB00002021240FFFFE020F80249B
-:10F750001200FF1B00001821321800045300FF188C
-:10F760002403000102323025241200045612000145
-:10F770003226FFFF9785002A0E000FDB24040100CC
-:10F780002419FFFB021988241220FF0D0000182104
-:10F790000A0010E9240300011079009C00003021C8
-:10F7A00090AD00012402000211A200BE30EA004028
-:10F7B00090B90001241800011338007F30E900409F
-:10F7C0008CA600049785002A00C020210E000FDBC4
-:10F7D0003626000200004021010018218FBF001CC6
-:10F7E0008FB200188FB100148FB00010006010218C
-:10F7F00003E0000827BD0020360F010095EE000C45
-:10F8000031CD020015A0FEE63C0900013C1880083D
-:10F81000971200489789002A362600023248FFFFD7
-:10F82000AF8800083C0380008C7101B80620FFFE01
-:10F83000346A0180AD4000001100008E3C0F800052
-:10F84000253F0012011FC82B1320008B240E00033C
-:10F85000346C0100958B00202402001A30E4400033
-:10F860003163FFFFA142000B108000A72463FFFE5D
-:10F870000103682B15A000A52408FFFE34A5000194
-:10F88000A5430014AF8500043C0480002412BFFF90
-:10F8900000B2802434850180A4A9000EA4A9001A16
-:10F8A000A4A60008A4B00026A4A700103C071000DE
-:10F8B000AC8701B80A00114D000018213C038000FC
-:10F8C00034640100949F000E3C1908008F3900D861
-:10F8D0002404008033E5FFFF273100013C010800CC
-:10F8E000AC3100D80E000FDB240600030A00114DD6
-:10F8F00000001821240A000210CA00598F85002830
-:10F900003C0308008C6300D0240E0001106E005EE2
-:10F910002CCF000C24D2FFFC2E5000041600002136
-:10F9200000002021241800021078001B2CD9000CA4
-:10F9300024DFFFF82FE900041520FF330000202109
-:10F9400030EB020051600004000621C054C00022C8
-:10F9500030A5FFFF000621C030A5FFFF0A00117D82
-:10F96000362600023C0908008D29002431300001B0
-:10F970005200FEF7000018219785002A3626000263
-:10F980000E000FDB000020210A00114D000018219D
-:10F990000A00119C241200021320FFE624DFFFF866
-:10F9A0000000202130A5FFFF0A00117D362600024D
-:10F9B0000A0011AC021980245120FF828CA6000499
-:10F9C0003C05080190A5962110A0FF7E24080001A7
-:10F9D0000A0011F0010018210E000FDB3226000191
-:10F9E0008F8600108F8500280A00124F000621C064
-:10F9F0008F8500043C18800024120003371001801A
-:10FA0000A212000B0A00112E3C08800090A30001F6
-:10FA1000241100011071FF70240800012409000264
-:10FA20005069000430E60040240800010A0011F08B
-:10FA30000100182150C0FFFD240800013C0C80008B
-:10FA4000358B01009563001094A40002307FFFFF06
-:10FA5000509FFF62010018210A001284240800014F
-:10FA60002CA803EF1100FE56240300010A001239EE
-:10FA700000000000240E000335EA0180A14E000BB7
-:10FA80000A00121C3C04800011E0FFA2000621C005
-:10FA900030A5FFFF0A00117D362600020A0011A5DD
-:10FAA000241100201140FFC63C1280003650010096
-:10FAB000960F001094AE000231E80FFF15C8FFC08A
-:10FAC000000000000A0011E690B900013C060800A1
-:10FAD0008CC6003824C4FFFF14C00002018418241F
-:10FAE000000018213C0D080025AD0038006D1021E4
-:10FAF0000A0011B6904300048F8F0004240EFFFE0D
-:10FB00000A00112C01EE28242408FFFE0A00121A14
-:10FB100000A8282427BDFFC8AFB00010AFBF003435
-:10FB20003C10600CAFBE0030AFB7002CAFB6002861
-:10FB3000AFB50024AFB40020AFB3001CAFB20018C3
-:10FB4000AFB100148E0E5000240FFF7F3C068000E2
-:10FB500001CF682435AC380C240B0003AE0C5000E8
-:10FB6000ACCB00083C010800AC2000200E001819A6
-:10FB7000000000003C0A0010354980513C06601628
-:10FB8000AE09537C8CC700003C0860148D0500A0B2
-:10FB90003C03FFFF00E320243C02535300051FC237
-:10FBA0001482000634C57C000003A08002869821E0
-:10FBB0008E7200043C116000025128218CBF007C31
-:10FBC0008CA200783C1E600037C420203C05080150
-:10FBD00024A59264AF820018AF9F001C0E0016DDB2
-:10FBE0002406000A3C190001273996203C01080030
-:10FBF000AC3931DC0E0020D4AF8000148FD7080858
-:10FC00002418FFF03C15570902F8B02412D502F56C
-:10FC100024040001AF80002C3C1480003697018042
-:10FC20003C1E080127DE9624369301008E900000CA
-:10FC30003205000310A0FFFD3207000110E000882C
-:10FC4000320600028E7100283C048000AE91002034
-:10FC50008E6500048E66000000A0382100C040219F
-:10FC60008C8301B80460FFFE3C0B0010240A0800DE
-:10FC700000AB4824AC8A01B8552000E0240BBFFF3C
-:10FC80009675000E3C1208008E52002030AC4000E9
-:10FC900032AFFFFF264E000125ED00043C010800B5
-:10FCA000AC2E0020118000E8AF8D00283C18002009
-:10FCB00000B8B02412C000E530B980002408BFFFAE
-:10FCC00000A8382434C81000AF87000030E62000B8
-:10FCD00010C000E92409FFBF3C03000400E328240E
-:10FCE00010A00002010910243502004030EA010092
-:10FCF00011400010AF8200048F8B002C11600007B0
-:10FD00003C0D002000ED6024118000043C0F000435
-:10FD100000EF702411C00239000000009668001E38
-:10FD20009678001C3115FFFF0018B40002B690252C
-:10FD3000AF92000C30F910001320001324150001BD
-:10FD400030FF002017E0000A3C04100000E41024FB
-:10FD50001040000D3C0A0C003C090BFF00EA18247F
-:10FD60003525FFFF00A3302B10C0000830ED010047
-:10FD70003C0C08008D8C002C24150005258B0001FF
-:10FD80003C010800AC2B002C30ED010015A0000B4D
-:10FD90003C0500018F85000430AE400055C00007CF
-:10FDA0003C0500013C161F0100F690243C0F10009A
-:10FDB000124F01CE000000003C05000100E5302498
-:10FDC00010C000AF3C0C10003C1F08008FFF002447
-:10FDD00033E90002152000712403000100601021A6
-:10FDE000104000083C0680003C08800035180100E7
-:10FDF0008F0F00243C056020ACAF00140000000011
-:10FE00003C0680003C194000ACD9013800000000DD
-:10FE10005220001332060002262B0140262C0080BF
-:10FE2000240EFF80016E2024018E6824000D1940ED
-:10FE3000318A007F0004A9403172007F3C16200007
-:10FE400036C20002006A482502B2382500E2882541
-:10FE50000122F825ACDF0830ACD1083032060002B0
-:10FE600010C0FF723C188000370501408CA80000CC
-:10FE700024100040AF08002090AF000831E300706C
-:10FE8000107000D428790041532000082405006038
-:10FE9000241100201071000E3C0A40003C09800033
-:10FEA000AD2A01780A001304000000001465FFFB6E
-:10FEB0003C0A40000E001FF1000000003C0A400018
-:10FEC0003C098000AD2A01780A00130400000000FC
-:10FED00090A90009241F00048CA70000312800FF0E
-:10FEE000111F01B22503FFFA2C7200061240001404
-:10FEF0003C0680008CA9000494A4000A310500FF90
-:10FF000000095E022D6A00083086FFFF15400002DE
-:10FF10002567000424070003240C000910AC01FA33
-:10FF200028AD000A11A001DE2410000A240E0008EA
-:10FF300010AE0028000731C000C038213C06800008
-:10FF40008CD501B806A0FFFE34D20180AE47000078
-:10FF500034CB0140916E0008240300023C0A4000AB
-:10FF600031C400FF00046A0001A86025A64C000807
-:10FF7000A243000B9562000A3C0810003C09800077
-:10FF8000A64200108D670004AE470024ACC801B83B
-:10FF9000AD2A01780A001304000000003C0A80002A
-:10FFA000354401009483000E3C0208008C4200D8C6
-:10FFB000240400803065FFFF245500013C01080047
-:10FFC000AC3500D80E000FDB240600030A001370C6
-:10FFD000000018210009320230D900FF2418000166
-:10FFE0001738FFD5000731C08F910020262200016D
-:10FFF000AF8200200A0013C800C0382100CB2024A3
-:020000040001F9
-:10000000AF85000010800008AF860004240D87FF34
-:1000100000CD6024158000083C0E006000AE302446
-:1000200010C00005000000000E000D42000000009E
-:100030000A001371000000000E0016050000000009
-:100040000A0013710000000030B980005320FF1F28
-:10005000AF8500003C02002000A2F82453E0FF1B03
-:10006000AF8500003C07FFFF34E47FFF00A4382485
-:100070000A00132B34C880000A001334010910242D
-:1000800000EC58245160005AAF8000248F8D002C62
-:100090003C0E0F0000EE182415A00075AF83001071
-:1000A00030EF010011E00073939800103C12020041
-:1000B000107200703C06800034D9010093280013B0
-:1000C0009789002A36A60002311800FF271600047F
-:1000D000001619C03C0480008C8501B804A0FFFE06
-:1000E00034880180AD0300003C158008AC830020FB
-:1000F00096BF004833E5FFFF10A001BCAF850008A4
-:100100002523001200A3102B504001B98F85000455
-:10011000348D010095AC0020240B001A30E440001F
-:10012000318AFFFFA10B000B108001BA2543FFFEAF
-:1001300000A3702B15C001B88F9600048F8F0004A8
-:10014000A503001435E50001AF8500043C088000DC
-:1001500035150180A6A9000EA6A9001A8F89000CEA
-:1001600030BF8000A6A70010AEA90028A6A60008F0
-:1001700013E0000F3C0F8000350C0100958B00163A
-:10018000316AFFFC25440004008818218C6240007D
-:100190003046FFFF14C000072416BFFF3C0EFFFFD0
-:1001A00035CD7FFF00AD2824AF8500043C0F8000D3
-:1001B0002416BFFF00B6902435E50180A4B20026C6
-:1001C000ACA7002C3C071000ADE701B80A00137083
-:1001D000000018210E00165D000000003C0A4000DF
-:1001E0003C098000AD2A01780A00130400000000D9
-:1001F0008F85002410A00027AF80001090A300007E
-:10020000106000742409000310690101000030210E
-:1002100090AE0001240D000211CD014230EF0040EC
-:1002200090A90001241F0001113F000930E20040A5
-:100230008CA600049785002A00C020210E000FDB49
-:1002400036A60002000040210A00137001001821A8
-:100250005040FFF88CA600043C07080190E7962167
-:1002600010E0FFF4240800010A00137001001821B7
-:10027000939800103C1F080127FF96200018C8C063
-:10028000033F4021AF8800248F85002414A0FFDBAA
-:10029000AF9800103C0480008C86400030C50100FF
-:1002A00010A0008732AB00043C0C08008D8C0024A9
-:1002B00024160004156000033192000D241600027C
-:1002C0003C0480008C8E4000340DFFFF11CD0113E3
-:1002D00032B5FFFB8C984000330F010055E0000160
-:1002E0002415001030E80800110000382409FFFB35
-:1002F0008F9F00282FF903EF53200001024990241B
-:1003000030E2010010400014325F00018F87002CA2
-:1003100014E0010E8F8C000C3C0480003486010038
-:1003200090C5001330AA00FF25430004000321C03C
-:100330002419FFFE025990241240000202B6302513
-:1003400032A6FFFF0E000FDB9785002A1240FEA3A6
-:1003500000001821325F000113E0000D3247000455
-:10036000240900011249000202B6302532A6FFFF1F
-:100370009785002A0E000FDB000020212402FFFEDB
-:10038000024290241240FE950000182132470004DA
-:1003900050E0FE922403000102B63025241600042A
-:1003A0005656000132A6FFFF9785002A0E000FDB8C
-:1003B000240401002403FFFB0243A82412A0FE87AB
-:1003C000000018210A001370240300010A0014B968
-:1003D0000249902410A0FFAF30E5010010A00017E3
-:1003E0008F8600102403000210C300148F84000CB9
-:1003F0003C0608008CC6003824CAFFFF14C0000267
-:10040000008A1024000010213C0E080025CE003880
-:10041000004E682191AC00048F850028258B0004D4
-:10042000000B21C030A5FFFF36A600020E000FDB37
-:10043000000000000A00137000001821240F0002C1
-:1004400010CF0088241600013C0308008C6300D004
-:100450001076008D8F85002824D9FFFC2F280004FA
-:100460001500006300002021241F0002107F005DA2
-:100470002CC9000C24C3FFF82C6200041440FFE9CF
-:100480000000202130EA020051400004000621C093
-:1004900054C0000530A5FFFF000621C030A5FFFFB6
-:1004A0000A00150436A600020E000FDB32A600017A
-:1004B0008F8600108F8500280A001520000621C0B5
-:1004C0003C0A08008D4A0024315200015240FE438C
-:1004D000000018219785002A36A600020E000FDBC7
-:1004E000000020210A001370000018219668000CFB
-:1004F000311802005700FE313C0500013C1F800806
-:1005000097F900489789002A36A600023328FFFF92
-:10051000AF8800083C0380008C7501B806A0FFFE80
-:100520003C04800034820180AC400000110000B621
-:1005300024180003252A0012010A182B106000B2AB
-:1005400000000000966F00203C0E8000240D001A71
-:1005500031ECFFFF35CA018030EB4000A14D000BAC
-:10056000116000B02583FFFE0103902B164000AE02
-:100570002416FFFE34A50001A5430014AF85000436
-:100580002419BFFF00B94024A6E9000EA6E9001A0D
-:10059000A6E60008A6E80026A6E700103C07100023
-:1005A000AE8701B80A001370000018213C048000D7
-:1005B0008C8201B80440FFFE349601802415001C93
-:1005C000AEC70000A2D5000B3C071000AC8701B8F5
-:1005D0003C0A40003C098000AD2A01780A0013045F
-:1005E000000000005120FFA424C3FFF800002021D8
-:1005F00030A5FFFF0A00150436A600020E00103DCC
-:10060000000000008F8700000A001346AF82000C34
-:1006100090A30001241500011075FF0B24080001B0
-:10062000240600021066000430E2004024080001A5
-:100630000A001370010018215040FFFD240800013A
-:100640003C0C8000358B0100956A001094A40002D8
-:100650003143FFFF5083FDE1010018210A00158599
-:10066000240800018F8500282CB203EF1240FDDB27
-:10067000240300013C0308008C6300D02416000111
-:100680001476FF7624D9FFFC2CD8000C1300FF72DF
-:10069000000621C030A5FFFF0A00150436A600029F
-:1006A00010B00037240F000B14AFFE23000731C039
-:1006B000312600FF00065600000A4E0305220047BF
-:1006C00030C6007F0006F8C03C16080126D69620EA
-:1006D00003F68021A2000001A20000003C0F600090
-:1006E0008DF918202405000100C588040011302769
-:1006F0000326C024000731C000C03821ADF81820FF
-:100700000A0013C8A60000028F850020000731C030
-:1007100024A2FFFF0A0013F6AF8200200A0014B2E1
-:100720002415002011E0FECC3C1980003728010080
-:100730009518001094B6000233120FFF16D2FEC6B1
-:10074000000000000A00148290A900013C0B080080
-:100750008D6B0038256DFFFF15600002018D1024A0
-:10076000000010213C080800250800380048C0217E
-:10077000930F000425EE00040A0014C5000E21C0EA
-:1007800000065202241F00FF115FFDEB000731C07D
-:10079000000A20C03C0E080125CE9620008EA8211C
-:1007A000009E602100095C02240D00013C076000EE
-:1007B000A2AD0000AD860000A2AB00018CF21820B3
-:1007C00024030001014310040242B025ACF61820B6
-:1007D00000C038210A0013C8A6A900020A0015AA01
-:1007E000AF8000200A0012FFAF84002C8F85000428
-:1007F0003C1980002408000337380180A308000B4F
-:100800000A00144D3C088000A2F8000B0A00155A9B
-:100810002419BFFF8F9600042412FFFE0A00144B18
-:1008200002D228242416FFFE0A00155800B62824F8
-:100830003C038000346401008C85000030A2003E3F
-:100840001440000800000000AC6000488C870000E5
-:1008500030E607C010C0000500000000AC60004C8E
-:10086000AC60005003E0000824020001AC600054BA
-:10087000AC6000408C880000310438001080FFF923
-:10088000000000002402000103E00008AC60004406
-:100890003C0380008C6201B80440FFFE3467018095
-:1008A000ACE4000024080001ACE00004A4E500086A
-:1008B00024050002A0E8000A34640140A0E5000B12
-:1008C0009483000A14C00008A4E30010ACE00024E4
-:1008D0003C07800034E901803C041000AD20002872
-:1008E00003E00008ACE401B88C8600043C0410006E
-:1008F000ACE600243C07800034E90180AD200028EC
-:1009000003E00008ACE401B83C0680008CC201B8EA
-:100910000440FFFE34C7018024090002ACE400005B
-:10092000ACE40004A4E50008A0E9000A34C50140D5
-:10093000A0E9000B94A8000A3C041000A4E80010F1
-:10094000ACE000248CA30004ACE3002803E0000822
-:10095000ACC401B83C039000346200010082202541
-:100960003C038000AC6400208C65002004A0FFFEE6
-:100970000000000003E00008000000003C028000CE
-:10098000344300010083202503E00008AC4400202C
-:1009900027BDFFE03C098000AFBF0018AFB10014D5
-:1009A000AFB00010352801408D10000091040009FF
-:1009B0009107000891050008308400FF30E600FF31
-:1009C00000061A002C820081008330251040002A86
-:1009D00030A50080000460803C0D080125AD928C9C
-:1009E000018D58218D6A00000140000800000000C0
-:1009F0003C038000346201409445000A14A0001EAC
-:100A00008F91FCBC9227000530E6000414C0001A48
-:100A1000000000000E00164E02002021922A000560
-:100A200002002021354900040E001658A2290005B5
-:100A30009228000531040004148000020000000028
-:100A40000000000D922D0000240B002031AC00FFAF
-:100A5000158B00093C0580008CAE01B805C0FFFE77
-:100A600034B10180AE3000003C0F100024100005AE
-:100A7000A230000BACAF01B80000000D8FBF001812
-:100A80008FB100148FB0001003E0000827BD0020D4
-:100A90000200202100C028218FBF00188FB1001450
-:100AA0008FB00010240600010A00161D27BD00208B
-:100AB0000000000D0200202100C028218FBF001877
-:100AC0008FB100148FB00010000030210A00161DF5
-:100AD00027BD002014A0FFE8000000000200202134
-:100AE0008FBF00188FB100148FB0001000C02821F4
-:100AF0000A00163B27BD00203C0780008CEE01B8A1
-:100B000005C0FFFE34F00180241F0002A21F000B6D
-:100B100034F80140A60600089719000A3C0F10009F
-:100B2000A61900108F110004A6110012ACEF01B835
-:100B30000A0016998FBF001827BDFFE8AFBF00104D
-:100B40000E000FD4000000003C0280008FBF001098
-:100B500000002021AC4001800A00108F27BD001842
-:100B60003084FFFF30A5FFFF108000070000182130
-:100B7000308200011040000200042042006518216C
-:100B80001480FFFB0005284003E0000800601021EE
-:100B900010C00007000000008CA2000024C6FFFF68
-:100BA00024A50004AC82000014C0FFFB24840004D0
-:100BB00003E000080000000010A0000824A3FFFFCD
-:100BC000AC86000000000000000000002402FFFFCF
-:100BD0002463FFFF1462FFFA2484000403E000088A
-:100BE000000000003C03800027BDFFF83462018054
-:100BF000AFA20000308C00FF30AD00FF30CE00FF10
-:100C00003C0B80008D6401B80480FFFE00000000F2
-:100C10008FA900008D6801288FAA00008FA700000F
-:100C20008FA400002405000124020002A085000A10
-:100C30008FA30000359940003C051000A062000B16
-:100C40008FB800008FAC00008FA600008FAF0000AF
-:100C500027BD0008AD280000AD400004AD80002491
-:100C6000ACC00028A4F90008A70D0010A5EE0012E2
-:100C700003E00008AD6501B83C06800827BDFFE829
-:100C800034C50080AFBF001090A7000924020012F5
-:100C900030E300FF1062000B008030218CA8005070
-:100CA00000882023048000088FBF00108CAA003425
-:100CB000240400390000282100CA4823052000052B
-:100CC000240600128FBF00102402000103E0000878
-:100CD00027BD00180E0016F2000000008FBF0010A4
-:100CE0002402000103E0000827BD001827BDFFC84B
-:100CF000AFB20030AFB00028AFBF0034AFB1002CAE
-:100D000000A0802190A5000D30A6001010C000109A
-:100D1000008090213C0280088C4400048E0300086F
-:100D20001064000C30A7000530A6000510C0009329
-:100D3000240400018FBF00348FB200308FB1002C2B
-:100D40008FB000280080102103E0000827BD003884
-:100D500030A7000510E0000F30AB001210C00006F5
-:100D6000240400013C0980088E0800088D25000439
-:100D70005105009C240400388FBF00348FB200302E
-:100D80008FB1002C8FB000280080102103E00008F4
-:100D900027BD0038240A0012156AFFE6240400016A
-:100DA0000200202127A500100E000CB6AFA00010F5
-:100DB0001440007C3C19800837240080909800087B
-:100DC000331100081220000A8FA7001030FF010025
-:100DD00013E000A48FA300148C8600580066102333
-:100DE000044000043C0A8008AC8300588FA7001020
-:100DF0003C0A800835480080910900083124000829
-:100E00001480000224080003000040213C1F8008D9
-:100E100093F1001193F9001237E600808CCC005456
-:100E2000333800FF03087821322D00FF000F708057
-:100E300001AE282100AC582B1160006F00000000AB
-:100E400094CA005C8CC900543144FFFF0125102373
-:100E50000082182B14600068000000008CCB005446
-:100E60000165182330EC00041180006C000830800C
-:100E70008FA8001C0068102B1040006230ED0004A9
-:100E8000006610232C46008010C00002004088211C
-:100E9000241100800E00164E024020213C0D8008D7
-:100EA00035A6008024070001ACC7000C90C80008DC
-:100EB0000011484035A70100310C007FA0CC00088C
-:100EC0008E05000424AB0001ACCB0030A4D1005C43
-:100ED0008CCA003C9602000E01422021ACC40020C6
-:100EE0008CC3003C0069F821ACDF001C8E190004A3
-:100EF000ACF900008E180008ACF800048FB10010A7
-:100F0000322F000855E0004793A60020A0C0004EF5
-:100F100090D8004E2411FFDFA0F8000890CF000801
-:100F200001F17024A0CE00088E0500083C0B80085B
-:100F300035690080AD2500388D6A00148D2200309F
-:100F40002419005001422021AD24003491230000D7
-:100F5000307F00FF13F90036264F01000E001658AF
-:100F60000240202124040038000028210E0016F23F
-:100F70002406000A0A001757240400010E000D2859
-:100F8000000020218FBF00348FB200308FB1002CC1
-:100F90008FB00028004020210080102103E00008CD
-:100FA00027BD00388E0E00083C0F800835F0008009
-:100FB000AE0E005402402021AE0000300E00164E4E
-:100FC00000000000920D00250240202135AC0020D9
-:100FD0000E001658A20C00250E000CAC0240202179
-:100FE000240400382405008D0E0016F22406001299
-:100FF0000A0017572404000194C5005C0A001792E8
-:1010000030A3FFFF2407021811A0FF9E00E6102363
-:101010008FAE001C0A00179A01C610230A0017970A
-:101020002C620218A0E600080A0017C48E0500080A
-:101030002406FF8001E6C0243C118000AE38002861
-:101040008E0D000831E7007F3C0E800C00EE602121
-:10105000AD8D00E08E080008AF8C00380A0017D074
-:10106000AD8800E4AC800058908500082403FFF7A9
-:1010700000A33824A08700080A0017758FA7001066
-:101080003C05080024A560A83C04080024846FF4F3
-:101090003C020800244260B0240300063C01080121
-:1010A000AC2596A03C010801AC2496A43C010801A3
-:1010B000AC2296A83C010801A02396AC03E00008EE
-:1010C0000000000003E00008240200013C02800050
-:1010D000308800FF344701803C0680008CC301B893
-:1010E0000460FFFE000000008CC501282418FF806A
-:1010F0003C0D800A24AF010001F8702431EC007F20
-:10110000ACCE0024018D2021ACE50000948B00EAD8
-:101110003509600024080002316AFFFFACEA0004D0
-:1011200024020001A4E90008A0E8000BACE00024C0
-:101130003C071000ACC701B8AF84003803E00008DA
-:10114000AF85006C938800488F8900608F820038DB
-:1011500030C600FF0109382330E900FF01221821C1
-:1011600030A500FF2468008810C000020124382147
-:101170000080382130E400031480000330AA00030B
-:101180001140000D312B000310A0000900001021B8
-:1011900090ED0000244E000131C200FF0045602B9D
-:1011A000A10D000024E700011580FFF925080001CA
-:1011B00003E00008000000001560FFF300000000DD
-:1011C00010A0FFFB000010218CF80000245900043F
-:1011D000332200FF0045782BAD18000024E70004FF
-:1011E00015E0FFF92508000403E0000800000000F6
-:1011F00093850048938800588F8700600004320070
-:101200003103007F00E5102B30C47F001040000F39
-:10121000006428258F8400383C0980008C8A00EC0B
-:10122000AD2A00A43C03800000A35825AC6B00A0AD
-:101230008C6C00A00580FFFE000000008C6D00ACEF
-:10124000AC8D00EC03E000088C6200A80A00188254
-:101250008F840038938800593C0280000080502120
-:10126000310300FEA383005930ABFFFF30CC00FFF9
-:1012700030E7FFFF344801803C0980008D2401B82D
-:101280000480FFFE8F8D006C24180016AD0D000049
-:101290008D2201248F8D0038AD0200048D5900206D
-:1012A000A5070008240201C4A119000AA118000B17
-:1012B000952F01208D4E00088D4700049783005C18
-:1012C0008D59002401CF302100C7282100A32023FD
-:1012D0002418FFFFA504000CA50B000EA5020010AA
-:1012E000A50C0012AD190018AD18002495AF00E848
-:1012F0003C0B10002407FFF731EEFFFFAD0E002876
-:101300008DAC0084AD0C002CAD2B01B88D460020B7
-:1013100000C7282403E00008AD4500208F8800386E
-:101320000080582130E7FFFF910900D63C02800081
-:1013300030A5FFFF312400FF00041A00006750258C
-:1013400030C600FF344701803C0980008D2C01B875
-:101350000580FFFE8F82006C240F0017ACE20000B6
-:101360008D390124ACF900048D780020A4EA00082E
-:10137000241901C4A0F8000AA0EF000B9523012056
-:101380008D6E00088D6D00049784005C01C35021B0
-:10139000014D602101841023A4E2000CA4E5000E9D
-:1013A000A4F90010A4E60012ACE000148D7800242B
-:1013B000240DFFFFACF800188D0F007CACEF001C73
-:1013C0008D0E00783C0F1000ACEE0020ACED002438
-:1013D000950A00BE240DFFF73146FFFFACE600285A
-:1013E000950C00809504008231837FFF0003CA00C2
-:1013F0003082FFFF0322C021ACF8002CAD2F01B8D2
-:10140000950E00828D6A002000AE3021014D282407
-:10141000A506008203E00008AD6500203C028000C4
-:10142000344501803C0480008C8301B80460FFFED9
-:101430008F8A0044240600199549001C3128FFFFBB
-:10144000000839C0ACA70000A0A6000B3C051000A6
-:1014500003E00008AC8501B88F87004C0080402174
-:1014600030C400FF3C0680008CC201B80440FFFE7F
-:101470008F89006C9383006834996000ACA90000E8
-:10148000A0A300058CE20010240F00022403FFF744
-:10149000A4A20006A4B900088D180020A0B8000A74
-:1014A000A0AF000B8CEE0000ACAE00108CED000481
-:1014B000ACAD00148CEC001CACAC00248CEB002018
-:1014C000ACAB00288CEA002C3C071000ACAA002C26
-:1014D0008D090024ACA90018ACC701B88D05002007
-:1014E00000A3202403E00008AD0400208F8600380C
-:1014F00027BDFFE0AFB10014AFBF0018AFB00010C0
-:1015000090C300D430A500FF3062002010400008D6
-:10151000008088218CCB00D02409FFDF256A0001E0
-:10152000ACCA00D090C800D401093824A0C700D4A8
-:1015300014A000403C0C80008F840038908700D4B9
-:101540002418FFBF2406FFEF30E3007FA08300D400
-:10155000979F005C8F8200608F8D003803E2C82364
-:10156000A799005CA5A000BC91AF00D401F870243D
-:10157000A1AE00D48F8C0038A18000D78F8A0038AC
-:10158000A5400082AD4000EC914500D400A658244F
-:10159000A14B00D48F9000348F8400609786005C4C
-:1015A0000204282110C0000FAF850034A38000582A
-:1015B0003C0780008E2C000894ED01208E2B000447
-:1015C000018D5021014B8021020620233086FFFF30
-:1015D00030C8000F3909000131310001162000091F
-:1015E000A3880058938600488FBF00188FB100145D
-:1015F0008FB0001027BD0020AF85006403E0000815
-:10160000AF86006000C870238FBF00189386004823
-:101610008FB100148FB0001034EF0C00010F28219F
-:1016200027BD0020ACEE0084AF85006403E0000815
-:10163000AF86006035900180020028210E00190F4E
-:10164000240600828F840038908600D430C5004084
-:1016500050A0FFBAA38000688F85004C3C06800034
-:101660008CCD01B805A0FFFE8F89006C2408608234
-:1016700024070002AE090000A6080008A207000B1C
-:101680008CA300083C0E1000AE0300108CA2000CCE
-:10169000AE0200148CBF0014AE1F00188CB90018E5
-:1016A000AE1900248CB80024AE1800288CAF002896
-:1016B000AE0F002CACCE01B80A001948A380006818
-:1016C0008F8A003827BDFFE0AFB10014AFB0001023
-:1016D0008F880060AFBF00189389003C954200BC22
-:1016E00030D100FF0109182B0080802130AC00FFB1
-:1016F0003047FFFF0000582114600003310600FF4F
-:1017000001203021010958239783005C0068202BB9
-:101710001480002700000000106800562419000102
-:101720001199006334E708803165FFFF0E0018C08F
-:10173000020020218F83006C3C07800034E601808A
-:101740003C0580008CAB01B80560FFFE240A001840
-:101750008F840038ACC30000A0CA000B948900BE7F
-:101760003C081000A4C90010ACC00030ACA801B8FF
-:101770009482008024430001A4830080949F008011
-:101780003C0608008CC6318833EC7FFF1186005E72
-:101790000000000002002021022028218FBF001835
-:1017A0008FB100148FB000100A00193427BD00203B
-:1017B000914400D42403FF8000838825A15100D4E4
-:1017C0009784005C3088FFFF51000023938C003C1D
-:1017D0008F8500382402EFFF008B782394AE00BC85
-:1017E0000168502B31E900FF01C26824A4AD00BCA0
-:1017F00051400039010058213C1F800037E60100AC
-:101800008CD800043C190001031940245500000144
-:1018100034E740008E0A00202403FFFB241100015E
-:1018200001432024AE0400201191002D34E78000F4
-:1018300002002021012030210E0018C03165FFFF79
-:101840009787005C8F890060A780005C0127802358
-:10185000AF900060938C003C8F8B00388FBF0018D6
-:101860008FB100148FB0001027BD002003E00008E6
-:10187000A16C00D73C0D800035AA01008D48000402
-:101880003C0900010109282454A0000134E740006C
-:101890008E0F00202418FFFB34E7800001F870242D
-:1018A00024190001AE0E00201599FF9F34E708802F
-:1018B000020020210E00188E3165FFFF020020215A
-:1018C000022028218FBF00188FB100148FB00010A4
-:1018D0000A00193427BD00200A0019F7000048212A
-:1018E00002002021012030210E00188E3165FFFFFB
-:1018F0009787005C8F890060A780005C01278023A8
-:101900000A001A0EAF900060948C0080241F8000A3
-:10191000019F3024A4860080908B0080908F0080EF
-:10192000316700FF0007C9C20019C027001871C045
-:1019300031ED007F01AE2825A08500800A0019DF67
-:1019400002002021938500682403000127BDFFE8E1
-:1019500000A330042CA20020AFB00010AFBF0014D1
-:1019600000C01821104000132410FFFE3C0708009F
-:101970008CE7319000E610243C088000350501809A
-:1019800014400005240600848F890038240A0004CE
-:101990002410FFFFA12A00FC0E00190F0000000018
-:1019A000020010218FBF00148FB0001003E0000868
-:1019B00027BD00183C0608008CC631940A001A574F
-:1019C00000C310248F87004427BDFFE0AFB200188A
-:1019D000AFB10014AFB00010AFBF001C30D000FF9B
-:1019E00090E6000D00A088210080902130C5007F86
-:1019F000A0E5000D8F8500388E2300188CA200D042
-:101A00001062002E240A000E0E001A4AA38A0068F3
-:101A10002409FFFF104900222404FFFF5200002088
-:101A2000000020218E2600003C0C001000CC582421
-:101A3000156000393C0E000800CE682455A0003F18
-:101A4000024020213C18000200D880241200001F10
-:101A50003C0A00048F8700448CE200148CE30010E1
-:101A60008CE500140043F82303E5C82B1320000580
-:101A7000024020218E24002C8CF1001010910031A6
-:101A80000240202124020012A38200680E001A4A9C
-:101A90002412FFFF105200022404FFFF0000202147
-:101AA0008FBF001C8FB200188FB100148FB00010D0
-:101AB0000080102103E0000827BD002090A800D47A
-:101AC000350400200A001A80A0A400D400CA4824CB
-:101AD0001520000B8F8B00448F8D00448DAC0010BF
-:101AE0001580000B024020218E2E002C51C0FFECEF
-:101AF00000002021024020210A001A9B2402001726
-:101B00008D66001050C0FFE6000020210240202119
-:101B10000A001A9B24020011024020212402001511
-:101B20000E001A4AA3820068240FFFFF104FFFDC4B
-:101B30002404FFFF0A001A8A8E2600000A001AC138
-:101B4000240200143C08000400C8382450E0FFD4EC
-:101B500000002021024020210A001A9B24020013C9
-:101B60008F85003827BDFFD8AFB3001CAFB2001877
-:101B7000AFB10014AFB00010AFBF002090A700D4E9
-:101B80008F90004C2412FFFF34E2004092060000C8
-:101B9000A0A200D48E0300100080982110720006CD
-:101BA00030D1003F2408000D0E001A4AA3880068B7
-:101BB000105200252404FFFF8F8A00388E09001878
-:101BC0008D4400D01124000702602021240C000E57
-:101BD0000E001A4AA38C0068240BFFFF104B001A5A
-:101BE0002404FFFF24040020122400048F8D0038F9
-:101BF00091AF00D435EE0020A1AE00D48F85005403
-:101C000010A00019000000001224004A8F9800382C
-:101C10008F92FCBC971000809651000A5230004809
-:101C20008F9300403C1F08008FFF318C03E5C82BC9
-:101C30001720001E02602021000028210E0019A993
-:101C400024060001000020218FBF00208FB3001C5C
-:101C50008FB200188FB100148FB0001000801021D7
-:101C600003E0000827BD00285224002A8E05001436
-:101C70008F840038948A008025490001A48900805F
-:101C8000948800803C0208008C42318831077FFF35
-:101C900010E2000E00000000026020210E00193446
-:101CA000240500010A001B0B000020212402002D46
-:101CB0000E001A4AA38200682403FFFF1443FFE1C9
-:101CC0002404FFFF0A001B0C8FBF002094990080A2
-:101CD000241F800024050001033FC024A498008035
-:101CE00090920080908E0080325100FF001181C2DE
-:101CF00000107827000F69C031CC007F018D582576
-:101D0000A08B00800E001934026020210A001B0BFA
-:101D1000000020212406FFFF54A6FFD68F84003840
-:101D2000026020210E001934240500010A001B0B5B
-:101D300000002021026020210A001B252402000A45
-:101D40002404FFFD0A001B0BAF9300608F8800384E
-:101D500027BDFFE8AFB00010AFBF0014910A00D458
-:101D60008F87004C00808021354900408CE60010B0
-:101D7000A10900D43C0208008C4231B030C53FFFBD
-:101D800000A2182B106000078F850050240DFF80E3
-:101D900090AE000D01AE6024318B00FF156000088D
-:101DA0000006C382020020212403000D8FBF00140F
-:101DB0008FB0001027BD00180A001A4AA3830068DC
-:101DC00033060003240F000254CFFFF70200202146
-:101DD00094A2001C8F85003824190023A4A200E8D7
-:101DE0008CE8000000081E02307F003F13F9003528
-:101DF0003C0A00838CE800188CA600D0110600086D
-:101E0000000000002405000E0E001A4AA385006899
-:101E10002407FFFF104700182404FFFF8F850038B8
-:101E200090A900D435240020A0A400D48F8C0044B5
-:101E3000918E000D31CD007FA18D000D8F83005458
-:101E40001060001C020020218F8400508C9800102C
-:101E50000303782B11E0000D241900180200202143
-:101E6000A39900680E001A4A2410FFFF10500002C8
-:101E70002404FFFF000020218FBF00148FB000104A
-:101E80000080102103E0000827BD00188C86001098
-:101E90008F9F00440200202100C31023AFE20010F6
-:101EA000240500010E0019A9240600010A001B9751
-:101EB000000020210E001934240500010A001B97A0
-:101EC00000002021010A5824156AFFD98F8C004494
-:101ED000A0A600FC0A001B84A386005A30A500FFC0
-:101EE0002406000124A9000100C9102B1040000C99
-:101EF00000004021240A000100A61823308B0001B5
-:101F000024C60001006A3804000420421160000267
-:101F100000C9182B010740251460FFF800A61823FC
-:101F200003E000080100102127BDFFD8AFB0001862
-:101F30008F90004CAFB1001CAFBF00202403FFFF07
-:101F40002411002FAFA30010920600002405000802
-:101F500026100001006620260E001BB0308400FF12
-:101F600000021E003C021EDC34466F410A001BD8F2
-:101F70000000102110A00009008018212445000154
-:101F800030A2FFFF2C4500080461FFFA0003204047
-:101F90000086202614A0FFF9008018210E001BB037
-:101FA000240500208FA300102629FFFF313100FFF8
-:101FB00000034202240700FF1627FFE20102182651
-:101FC00000035027AFAA0014AFAA00100000302170
-:101FD00027A8001027A7001400E6782391ED00033E
-:101FE00024CE000100C8602131C600FF2CCB0004C4
-:101FF0001560FFF9A18D00008FA200108FBF002097
-:102000008FB1001C8FB0001803E0000827BD002826
-:1020100027BDFFD0AFB3001CAFB00010AFBF00288A
-:10202000AFB50024AFB40020AFB20018AFB10014B8
-:102030003C0C80008D880128240FFF803C06800A1C
-:1020400025100100250B0080020F68243205007F57
-:10205000016F7024AD8E009000A62821AD8D002464
-:1020600090A600FC3169007F3C0A8004012A1821F7
-:10207000A386005A9067007C00809821AF830030CF
-:1020800030E20002AF88006CAF85003800A0182154
-:10209000144000022404003424040030A3840048C7
-:1020A0008C7200DC30D100FF24040004AF92006089
-:1020B00012240004A38000688E7400041680001EA1
-:1020C0003C0880009386005930C7000150E0000FA3
-:1020D0008F8600608CA400848CA800842413FF8069
-:1020E00000936024000C49403110007F01307825B6
-:1020F0003C19200001F9682530DF00FE3C03800018
-:10210000AC6D0830A39F00598F8600608FBF0028F8
-:102110008FB500248FB400208FB3001C8FB200183D
-:102120008FB100148FB000102402000127BD0030D1
-:1021300003E00008ACA600DC8E7F000895020120B9
-:102140008E67001003E2C8213326FFFF30D8000F4E
-:1021500033150001AF87003416A00058A39800582B
-:1021600035090C000309382100D81823AD03008479
-:10217000AF8700648E6A00043148FFFF1100007EC3
-:10218000A78A005C90AC00D42407FF8000EC3024C8
-:1021900030CB00FF1560004B9786005C938E005A91
-:1021A000240D000230D5FFFF11CD02A20000A021B6
-:1021B0008F85006002A5802B160000BC9388004824
-:1021C0003C11800096240120310400FF1485008812
-:1021D0008F8400648F9800343312000356400085CA
-:1021E00030A500FF8F900064310C00FF24060034FE
-:1021F00011860095AF90004C9204000414800119E0
-:102200008F8E0038A380003C8E0D00048DC800D84E
-:102210003C0600FF34CCFFFF01AC30240106182B34
-:1022200014600121AF8600548F8700609798005C8E
-:10223000AF8700400307402310C000C7A788005C99
-:102240008F91003030C3000300035823922A007C92
-:102250003171000302261021000A20823092000111
-:102260000012488000492821311FFFFF03E5C82BD9
-:10227000132001208F8800388F8500348F880064F8
-:102280001105025A3C0E3F018E0600003C0C250051
-:1022900000CE682411AC01638F84004C30E500FF50
-:1022A0000E00184A000030218F8800388F870060A8
-:1022B0008F8500340A001DB78F8600540A001C5613
-:1022C000AF87006490AC00D400EC2024309000FF75
-:1022D000120000169386005990B5008890B400D77C
-:1022E00024A8008832A2003F2446FFE02CD1002021
-:1022F000A394003C1220000CAF88004C240E000177
-:1023000000CE2004308A00191540012B3C068000C5
-:1023100034D80002009858241560022E3092002014
-:1023200016400234000000009386005930CE0001B0
-:1023300011C0000F9788005C8CA900848CAF0084CA
-:102340002410FF800130C8240019194031ED007FAE
-:10235000006D38253C1F200000FF902530CB00FE8B
-:102360003C188000AF120830A38B00599788005C9E
-:102370001500FF84000000008E630020306C000414
-:102380001180FF51938600592404FFFB0064302420
-:102390003C038000AE660020346601808C7301B877
-:1023A0000660FFFE8F8E006C346A01003C15000150
-:1023B000ACCE00008C62012424076085ACC200040E
-:1023C0008D54000402958824522000012407608364
-:1023D000241200023C1810003C0B8000A4C7000827
-:1023E000A0D2000BAD7801B80A001C2B93860059CF
-:1023F00030A500FF0E00184A240600018F88006CEB
-:102400003C05800034A90900250201889388004812
-:10241000304A0007304B00783C0340802407FF809F
-:102420000163C825014980210047F824310C00FFD1
-:1024300024060034ACBF0800AF90004CACB90810C3
-:102440005586FF6E920400048F8400388E11003090
-:10245000908E00D431CD001015A000108F83006045
-:102460002C6F000515E000E400000000909800D4F7
-:102470002465FFFC331200101640000830A400FF52
-:102480008F9F00648F99003413F90004388700018E
-:1024900030E20001144001C8000000000E001BC320
-:1024A000000000000A001DF8000000008F84006496
-:1024B00030C500FF0E00184A24060001938E004824
-:1024C000240A003411CA00A08F8500388F8600606E
-:1024D0009783005C3062FFFF00C28823AF910060E9
-:1024E000A780005C1280FF90028018212414FFFD59
-:1024F0005474FFA28E6300208E6900042403FFBF82
-:10250000240BFFEF0135C823AE79000490AF00D44F
-:1025100031ED007FA0AD00D48E6600208F9800388A
-:10252000A780005C34DF0002AE7F0020A70000BC63
-:10253000931200D402434024A30800D48F9500389E
-:10254000AEA000EC92AE00D401CB5024A2AA00D4DD
-:102550000A001CD78F8500388F910034AF8000604F
-:1025600002275821AF8B0034000020212403FFFFF5
-:10257000108301B48F8500388E0C00103C0D0800CC
-:102580008DAD31B09208000031843FFF008D802B6B
-:1025900012000023310D003F3C1908008F3931A88B
-:1025A0008F9F006C000479802408FF80033F202166
-:1025B000008FC821938500590328F8243C06008029
-:1025C0003C0F800034D80001001F91403331007F60
-:1025D0008F8600380251502535EE0940332B0078A4
-:1025E000333000073C0310003C02800C017890253A
-:1025F000020E48210143C0250222382134AE0001D9
-:10260000ADFF0804AF890050ADF20814AF87004455
-:10261000ADFF0028ACD90084ADF80830A38E005976
-:102620009383005A240700035067002825A3FFE086
-:10263000240C0001146CFFAB8F850038241100239B
-:1026400011B10084000000002402000B0260202170
-:102650000E001A4AA38200680040A0210A001D3221
-:102660008F85003802602021240B000C0E001A4ACE
-:10267000A38B0068240AFFFF104AFFBC2404FFFF5D
-:102680008F8E0038A380003C8E0D00048DC800D8CA
-:102690003C0600FF34CCFFFF01AC30240106182BB0
-:1026A0001060FEE1AF860054026020212412001960
-:1026B0000E001A4AA3920068240FFFFF104FFFABD1
-:1026C0002404FFFF0A001C838F8600542C74002012
-:1026D0001280FFDE2402000B000328803C11080159
-:1026E0002631949000B148218D2D000001A00008F2
-:1026F000000000008F85003400A710219385003C66
-:10270000AF82003402251821A383003C951F00BC32
-:102710000226282137F91000A51900BC5240FF926B
-:10272000AF850060246A0004A38A003C950900BCC0
-:1027300024A40004AF84006035322000A51200BC40
-:102740000A001D54000020218F8600602CCB00055C
-:102750001560FF609783005C3072FFFF00D240235A
-:102760002D18000513000003306400FF24DFFFFC78
-:1027700033E400FF8F8500648F86003410A60004C8
-:10278000388F000131ED000115A001380000000074
-:102790008F840038908C00D435870010A08700D437
-:1027A0008F8500388F8600609783005CACA000ECBA
-:1027B0000A001D2F3062FFFF8CAA00848CB50084B4
-:1027C0003C041000014710240002894032B4007F0D
-:1027D0000234302500C460253C0880002405000137
-:1027E00002602021240600010E0019A9AD0C08305A
-:1027F0000A001CC38F8500388C8200EC1222FE7EFA
-:102800000260202124090005A38900680E001A4AED
-:102810002411FFFF1451FE782404FFFF0A001D5508
-:102820002403FFFF8F8F004C8F8800388DF8000045
-:10283000AD1800888DE70010AD0700988F87006005
-:102840000A001DB78F8600542407FFFF118700057B
-:10285000000000000E001B4C026020210A001D90A9
-:102860000040A0210E001AD1026020210A001D9014
-:102870000040A0218F90004C3C0908008D2931B008
-:102880008E11001032323FFF0249682B11A0000C5C
-:10289000240AFF808F85005090AE000D014E102459
-:1028A000304C00FF11800007026020210011C3821C
-:1028B00033030003240B0001106B0105000000002E
-:1028C000026020212418000D0E001A4AA398006807
-:1028D000004020218F8500380A001D320080A02191
-:1028E0008F90004C3C0A08008D4A31B08F85005013
-:1028F0008E0400100000A0218CB1001430823FFF34
-:10290000004A602B8CB200205180FFEE0260202133
-:1029100090B8000D240BFF800178702431C300FFB4
-:102920005060FFE80260202100044382310600036A
-:1029300014C0FFE40260202194BF001C8F9900386E
-:102940008E060028A73F00E88CAF0010022F20233E
-:1029500014C40139026020218F83005400C3682110
-:10296000022D382B14E00135240200188F8A004410
-:102970008F820030024390218D4B00100163702341
-:10298000AD4E0010AD5200208C4C00740192282BEB
-:1029900014A00156026020218F8400508E0800246C
-:1029A0008C86002411060007026020212419001CD7
-:1029B0000E001A4AA3990068240FFFFF104FFFC5AD
-:1029C0002404FFFF8F8400448C87002424FF00012F
-:1029D000AC9F0024125101338F8D00308DB10074F3
-:1029E000123201303C0B00808E0E000001CB5024CF
-:1029F00015400075000000008E0300142411FFFF35
-:102A000010710006026020212418001B0E001A4AD3
-:102A1000A39800681051FFAF2404FFFF8E0300004D
-:102A20003C0800010068302410C000133C04008002
-:102A30000064A024168000090200282102602021E1
-:102A40002419001A0E001A4AA3990068240FFFFFE8
-:102A5000104FFFA02404FFFF020028210260202164
-:102A60000E001A6A240600012410FFFF1050FF997F
-:102A70002404FFFF241400018F9F004402602021E2
-:102A80000280302197F1003424050001262700013F
-:102A9000A7E700340E0019A9000000000000202163
-:102AA0008F8500380A001D320080A0218F90004CD5
-:102AB0003C1408008E9431B08E07001030E83FFFC0
-:102AC0000114302B10C000618F860050241FFF803E
-:102AD00090C5000D03E52024309200FF5240005CB9
-:102AE000026020218F8D005411A0000700078B8207
-:102AF0008F8500388F89FCBC94AF00809539000A1F
-:102B0000132F00F68F870040322C000315800063DE
-:102B10000000000092020002104000D700000000F8
-:102B20008E0A0024154000D8026020219204000380
-:102B300024060002308800FF15060005308500FFDE
-:102B40008F940054528000F202602021308500FFF3
-:102B500038AD00102DA400012CBF000103E4302586
-:102B6000020028210E001A6A026020212410FFFFB3
-:102B7000105000BE8F8500388F830054106000C451
-:102B8000240500013C1908008F39318C0323782B70
-:102B900015E000B12409002D026020210000282149
-:102BA0000E0019A9240600018F85003800001821A5
-:102BB0000A001D320060A0210E0018750000000000
-:102BC0000A001DF800000000AC8000200A001E78FA
-:102BD0008E03001400002821026020210E0019A994
-:102BE000240600010A001CC38F8500380A001DB7A7
-:102BF0008F8800388CB000848CB900843C031000AE
-:102C00000207482400096940332F007F01AFF825EF
-:102C100003E32825ACC50830910700012405000115
-:102C2000026020210E0019A930E600010A001CC331
-:102C30008F850038938F00482403FFFD0A001D3460
-:102C4000AF8F00600A001D342403FFFF02602021C3
-:102C50002410000D0E001A4AA390006800401821AD
-:102C60008F8500380A001D320060A0210E00187503
-:102C7000000000009783005C8F8600603070FFFFCB
-:102C800000D048232D3900051320FE128F8500380F
-:102C9000ACA200EC0A001D2F3062FFFF90C3000DB4
-:102CA000307800085700FFA2920400030260202140
-:102CB000240200100E001A4AA38200682403FFFFBA
-:102CC0005443FF9B920400030A001F128F850038B3
-:102CD00090A8000D3106000810C000958F94005494
-:102CE0001680009E026020218E0F000C8CA4002014
-:102CF00055E40005026020218E1F00088CB90024D5
-:102D000013F9003A02602021240200200E001A4A22
-:102D1000A38200682405FFFF1045FEEE2404FFFF98
-:102D20008F8F0044240CFFF72403FF8091E9000DEE
-:102D30003C14800E3C0B8000012CC824A1F9000D2E
-:102D40008F8F00303C0708008CE731AC8F8D006C12
-:102D500095E500788F99004400ED902130BF7FFF0A
-:102D6000001F20400244302130C8007F00C3C0242F
-:102D700001147021AD78002CA5D100008F2A002805
-:102D800025420001AF2200288F29002C8E0C002C38
-:102D9000012C6821AF2D002C8E07002CAF270030AE
-:102DA0008E050014AF250034973F003A27E4000158
-:102DB000A724003A95F200783C1008008E1031B03C
-:102DC0002643000130717FFF1230005C006030212B
-:102DD0008F83003002602021240500010E00193489
-:102DE000A46600780A001EA1000020218E070014AE
-:102DF0002412FFFF10F200638F8C00388E09001838
-:102E00008D8D00D0152D005D026020218E0A0024DA
-:102E10008CA2002811420053240200210E001A4AFD
-:102E2000A38200681452FFBE2404FFFF8F85003880
-:102E30000A001D320080A0212402001F0E001A4A41
-:102E4000A38200682409FFFF1049FEA22404FFFFAB
-:102E50000A001E548F830054026020210E001A4A7B
-:102E6000A38900681450FF518F8500382403FFFFA9
-:102E70000A001D320060A0218CCE00248E0B00249D
-:102E8000116EFF2A026020210A001F262402000F73
-:102E90000E001934026020218F8500380A001EE5DB
-:102EA000000018218E0900003C05008001259024B7
-:102EB0001640FF452402001A026020210E001A4A23
-:102EC000A3820068240CFFFF144CFECB2404FFFFF8
-:102ED0008F8500380A001D320080A0212403FFFDE9
-:102EE0000060A0210A001D32AF8700602418001D79
-:102EF0000E001A4AA39800682403FFFF1443FEA69D
-:102F00002404FFFF8F8500380A001D320080A021B5
-:102F10002412002C0E001A4AA39200682403FFFF1B
-:102F20001043FF508F8500380A001ECC9204000326
-:102F3000026020210A001F3C24020024240B800090
-:102F4000006B702431CAFFFF000A13C2305100FF2A
-:102F5000001180270A001F6D001033C00A001F3CBB
-:102F6000240200278E0600288CAE002C10CE00080C
-:102F7000026020210A001F802402001F0A001F8017
-:102F80002402000E026020210A001F802402002576
-:102F90008E04002C1080000D8F8300308C7800741C
-:102FA0000304582B5560000C026020218CA80014EB
-:102FB0000086A0210114302B10C0FF5A8F8F0044CF
-:102FC000026020210A001F802402002202602021CA
-:102FD0000A001F80240200230A001F80240200260A
-:102FE00027BDFFD8AFB3001CAFB10014AFBF0020A6
-:102FF000AFB20018AFB000103C0280008C5201400C
-:103000008C4B01483C048000000B8C02322300FFF3
-:10301000317300FF8C8501B804A0FFFE349001805D
-:10302000AE1200008C8701442464FFF024060002E5
-:103030002C830013AE070004A6110008A206000BA3
-:10304000AE1300241060004F8FBF002000044880A2
-:103050003C0A0801254A9510012A40218D040000F0
-:1030600000800008000000003C0308008C6331A8C9
-:1030700031693FFF0009998000728021021370219D
-:103080002405FF80264D0100264C00803C02800074
-:1030900031B1007F3198007F31CA007F3C1F800A28
-:1030A0003C1980043C0F800C01C5202401A530246C
-:1030B00001853824014F1821AC460024023F4021ED
-:1030C00003194821AC470090AC440028AF8300446A
-:1030D000AF880038AF8900300E00190001608021F0
-:1030E0003C0380008C6B01B80560FFFE8F870044B5
-:1030F0008F8600383465018090E8000DACB2000086
-:10310000A4B0000600082600000416030002902761
-:10311000001227C21080008124C20088241F608210
-:10312000A4BF0008A0A0000524020002A0A2000B7A
-:103130008F8B0030000424003C0827000088902575
-:10314000ACB20010ACA00014ACA00024ACA00028CD
-:10315000ACA0002C8D6900382413FF80ACA90018A6
-:1031600090E3000D02638024320500FF10A00005EB
-:103170008FBF002090ED000D31AC007FA0EC000D62
-:103180008FBF00208FB3001C8FB200188FB10014C6
-:103190008FB000103C0A10003C0E800027BD0028B4
-:1031A00003E00008ADCA01B8265F01002405FF80D6
-:1031B00033F8007F3C06800003E578243C19800A40
-:1031C00003192021ACCF0024908E00D400AE6824D7
-:1031D00031AC00FF11800024AF840038248E0088B9
-:1031E00095CD00123C0C08008D8C31A831AB3FFF0F
-:1031F00001924821000B5180012A40210105202421
-:10320000ACC400283107007F3C06800C00E620217A
-:103210009083000D00A31024304500FF10A0FFD8BC
-:10322000AF8400449098000D330F001015E0FFD5D7
-:103230008FBF00200E001900000000003C0380003A
-:103240008C7901B80720FFFE00000000AE120000DC
-:103250008C7F0144AE1F0004A61100082411000257
-:10326000A211000BAE1300243C130801927396D0F8
-:10327000327000015200FFC38FBF00200E00213DBD
-:10328000024020210A00205A8FBF00203C1260001B
-:103290008E452C083C03F0033462FFFF00A2F824A3
-:1032A000AE5F2C088E582C083C1901C003199825D4
-:1032B000AE532C080A00205A8FBF0020264D010073
-:1032C00031AF007F3C10800A240EFF8001F02821DE
-:1032D00001AE60243C0B8000AD6C00241660FFA89A
-:1032E000AF85003824110003A0B100FC0A00205A69
-:1032F0008FBF002026480100310A007F3C0B800A66
-:103300002409FF80014B3021010920243C07800063
-:10331000ACE400240A002059AF860038944E001215
-:10332000320C3FFF31CD3FFF15ACFF7D241F608283
-:1033300090D900D42418FF800319782431EA00FFC3
-:103340001140FF770000000024070004A0C700FC24
-:103350008F870044241160842406000DA4B1000866
-:10336000A0A600050A002044240200023C0400013B
-:10337000248496BC24030014240200FE3C010800AF
-:10338000AC2431EC3C010800AC2331E83C010801DD
-:10339000A42296D83C040801248496D80000182161
-:1033A00000643021A0C30004246300012C6500FFE9
-:1033B00054A0FFFC006430213C07080024E7010012
-:1033C00003E00008AF87007800A058210080482162
-:1033D0000000102114A00012000050210A00213921
-:1033E000000000003C010801A42096D83C0508011B
-:1033F00094A596D88F8200783C0C0801258C96D82D
-:1034000000E2182100AC2021014B302BA0890004E0
-:1034100000001021A460000810C0003901004821FC
-:103420008F8600780009384000E940210008388084
-:1034300000E6282190A8000B90B9000A000820405F
-:1034400000881021000218800066C021A319000A1C
-:103450008F85007800E5782191EE000A91E6000B57
-:10346000000E684001AE6021000C20800085102114
-:10347000A046000B3C030801906396D21060002226
-:103480002462FFFF8F8300383C010801A02296D2FE
-:10349000906C00FF1180000400000000906E00FF9F
-:1034A00025CDFFFFA06D00FF3C190801973996D884
-:1034B000272300013078FFFF2F0F00FF11E0FFC925
-:1034C000254A00013C010801A42396D83C050801C7
-:1034D00094A596D88F8200783C0C0801258C96D84C
-:1034E00000E2182100AC2021014B302BA089000400
-:1034F00000001021A460000814C0FFC90100482189
-:1035000003E000080000000003E0000824020002BD
-:1035100027BDFFE0248501002407FF80AFB0001025
-:10352000AFBF0018AFB1001400A718243C108000F2
-:1035300030A4007F3C06800A008628218E110024DA
-:10354000AE03002490A200FF14400008AF850038AD
-:10355000A0A000098FBF0018AE1100248FB1001485
-:103560008FB0001003E0000827BD002090A900FDE7
-:1035700090A800FF312400FF0E0020EB310500FF72
-:103580008F8500388FBF0018A0A00009AE1100245D
-:103590008FB100148FB0001003E0000827BD002099
-:1035A00027BDFFD0AFB20020AFB1001CAFB00018F4
-:1035B000AFBF002CAFB40028AFB300243C0980009B
-:1035C0009533011635320C00952F011A3271FFFF29
-:1035D000023280218E08000431EEFFFF248B0100AF
-:1035E000010E6821240CFF8025A5FFFF016C5024EB
-:1035F0003166007F3C07800AAD2A002400C73021D5
-:10360000AF850074AF8800703C010801A02096D1FE
-:1036100090C300090200D02100809821306300FF90
-:103620002862000510400048AF8600382864000278
-:103630001480008E24140001240D00053C010801B3
-:10364000A02D96B590CC00FD3C010801A02096B6B7
-:103650003C010801A02096B790CB000A240AFF8005
-:10366000318500FF014B4824312700FF10E0000C9A
-:10367000000058213C128008365100808E2F003007
-:103680008CD0005C01F0702305C0018E8F87007024
-:1036900090D4000A3284007FA0C4000A8F860038CC
-:1036A0003C118008363000808E0F00308F8700700C
-:1036B00000EF702319C000EE0000000090D4000954
-:1036C00024120002328400FF109202470000000022
-:1036D0008CC2005800E2F82327F9FFFF1B200130BD
-:1036E0000000000090C500092408000430A300FF7A
-:1036F00010680057240A00013C010801A02A96B571
-:1037000090C900FF252700013C010801A02796B4BD
-:103710003C030801906396B5240600051066006A14
-:103720002C780005130000C4000090210003F880ED
-:103730003C0408012484955C03E4C8218F25000023
-:1037400000A0000800000000241800FF1078005CB2
-:103750000000000090CC000A90CA00093C08080153
-:10376000910896D13187008000EA48253C01080184
-:10377000A02996BC90C500FD3C140801929496D2F5
-:10378000311100013C010801A02596BD90DF00FE2B
-:103790003C010801A03F96BE90D200FF3C01080109
-:1037A000A03296BF8CD900543C010801AC3996C0B8
-:1037B0008CD000583C010801AC3096C48CC3005C2E
-:1037C0003C010801AC3496CC3C010801AC2396C8FE
-:1037D000162000088FBF002C8FB400288FB3002460
-:1037E0008FB200208FB1001C8FB0001803E00008DA
-:1037F00027BD00303C1180009624010E0E000FD42E
-:103800003094FFFF3C0B08018D6B96D40260382189
-:1038100002802821AE2B01803C1308018E7396B4E0
-:1038200001602021240600830E00102FAFB300108A
-:103830008FBF002C8FB400288FB300248FB20020DC
-:103840008FB1001C8FB0001803E0000827BD0030C6
-:103850003C1808008F1831FC270F00013C010800BC
-:10386000AC2F31FC0A0021CE000000001474FFB917
-:1038700000000000A0C000FF3C0508008CA531E45A
-:103880003C0308008C6331E03C0208008C423204A7
-:103890008F99003834A80001241F00023C01080160
-:1038A000AC2396D43C010801A02896D03C01080125
-:1038B000A02296D3A33F00090A0021878F860038F3
-:1038C0000E00213D000000000A0021CE8F86003846
-:1038D0003C1F080193FF96B42419000113F9022933
-:1038E0008F8700703C100801921096B83C060801C2
-:1038F00090C696B610C000050200A0213C04080145
-:10390000908496B9109001E48F8700780010884069
-:103910008F9F0078023048210009C880033F702142
-:1039200095D80008270F0001A5CF00083C04080126
-:10393000908496B93C05080190A596B60E0020EB40
-:10394000000000008F8700780230202100043080C2
-:1039500000C720218C8500048F82007400A24023C0
-:1039600005020006AC8200048C8A00008F83007080
-:10397000014310235C400001AC8300008F860038B7
-:1039800090CB00FF2D6C00025580002D2414000107
-:103990000230F821001F40800107282190B9000B58
-:1039A0008CAE00040019C04003197821000F188064
-:1039B000006710218C4D000001AE88232630FFFFE8
-:1039C0005E00001F241400018C4400048CAA000037
-:1039D000008A482319200019240E00043C01080124
-:1039E000A02E96B590AD000B8CAB0004000D884066
-:1039F000022D802100101080004710218C4400040B
-:103A000001646023058202009443000890DF00FEF9
-:103A100090B9000B33E500FF54B900040107A02161
-:103A2000A0D400FE8F8700780107A0219284000BAC
-:103A30000E0020EB240500018F86003824140001BD
-:103A4000125400962E500001160000423C08FFFF61
-:103A5000241900021659FF3F00000000A0C000FF1B
-:103A60008F860038A0D200090A0021CE8F86003848
-:103A700090C700092404000230E300FF1064016FC6
-:103A800024090004106901528F8800748CCE005400
-:103A9000010E682325B100010620017524180004D9
-:103AA0003C010801A03896B53C010801A02096B45D
-:103AB00090D400FD90D200FF2E4F000215E0FF14BD
-:103AC000328400FF000438408F89007890DF00FFC7
-:103AD00000E41021000220800089C8212FE50002A7
-:103AE0009324000B14A0FF0A2407000200041840CE
-:103AF0000064802100105880016928218CAC0004EA
-:103B0000010C50230540FF02000000003C030801A7
-:103B1000906396B614600005246F00013C01080113
-:103B2000A02496B93C010801A02796B73C010801E2
-:103B3000A02F96B690CE00FF24E7000131CD00FF04
-:103B400001A7882B1220FFE990A4000B0A0021BDD9
-:103B5000000000003C0508018CA596B43C1200044E
-:103B600000A8F82413F20006240200053C0908010D
-:103B7000912996B5152000022402000324020005B5
-:103B80003C010801A02296D190C700FF14E001205B
-:103B900024020002A0C200090A0021CE8F8600384C
-:103BA00090CC00FF1180FEDA240A00018F8C007493
-:103BB0008F890078240F0003018068211160001EA6
-:103BC000240E0002000540400105A02100142080C1
-:103BD000008990218E510004019180230600FECCC3
-:103BE000000000003C020801904296B61440000517
-:103BF000245800013C010801A02A96B73C010801A5
-:103C0000A02596B93C010801A03896B690DF00FFC8
-:103C1000010510210002C88033E500FF254A00019C
-:103C20000329202100AA402B1500FEB99085000B26
-:103C30001560FFE5000540400005404001051821E2
-:103C4000000310803C010801A02A96B43C01080141
-:103C5000A02596B8004918218C64000400E4F823DC
-:103C600027F9FFFF1F20FFE9000000008C63000020
-:103C700000E358230560013A01A3882310E30117EC
-:103C80000184C0231B00FEA2000000003C010801CB
-:103C9000A02E96B50A0022FC240B0001240E00047D
-:103CA000A0CE00093C0D08008DAD31F88F8600389C
-:103CB00025A200013C010800AC2231F80A0021CE07
-:103CC000000000008CD9005C00F9C0231F00FE7BBF
-:103CD000000000008CDF005C10FFFF658F84007423
-:103CE0008CC3005C00834023250200011C40FF6060
-:103CF000000000008CC9005C2487000100E9282B2B
-:103D000010A0FE943C0D80008DAB01043C0C000122
-:103D1000016C50241140FE8F240200103C01080168
-:103D2000A02296D10A0021CE000000008F910074DD
-:103D30008F86003826220001ACC2005C0A0022896E
-:103D4000241400018F8700382404FF80000088219C
-:103D500090E9000A2414000101243025A0E6000A9D
-:103D60003C05080190A596B63C040801908496B9DC
-:103D70000E0020EB000000008F8600388F85007851
-:103D800090C800FD310700FF000740400107F821FF
-:103D9000001FC0800305C8219323000BA0C300FDB2
-:103DA0008F8500788F86003803056021918F000B86
-:103DB000000F704001CF6821000D808002051021A6
-:103DC0008C4B0000ACCB00548D8400048F830074B6
-:103DD0000064502319400002248200012462000183
-:103DE00001074821ACC2005C0009308000C54021B9
-:103DF00000E02021240500010E0020EB9110000BB3
-:103E00008F86003890C500FF10A0FF0C0010704096
-:103E10008F85007801D06821000D10800045582161
-:103E20008D6400008F8C00740184502325470001AD
-:103E300004E0FF02263100013C030801906396B6BE
-:103E40002E2F0002247800013C010801A03896B60C
-:103E50003C010801A03496B711E0FEF802003821B9
-:103E60000A00235C000740408F8400388F83007471
-:103E70008C85005800A340230502FE9AAC830058AD
-:103E80000A002232000000003C07080190E796D2A9
-:103E9000240200FF10E200BE8F8600383C110801AA
-:103EA000963196DA3C030801246396D82625000152
-:103EB0003230FFFF30ABFFFF020360212D6A00FFAD
-:103EC0001540008D918700043C010801A42096DA7A
-:103ED0008F8800380007484001272821911800FFEB
-:103EE000000530802405000127140001A11400FF03
-:103EF0003C120801925296D28F8800788F8E007003
-:103F0000264F000100C820213C010801A02F96D2B5
-:103F1000AC8E00008F8D0074A4850008AC8D000469
-:103F20003C030801906396B4146000770000902170
-:103F30003C010801A02596B4A087000B8F8C007867
-:103F400000CC5021A147000A8F820038A04700FD15
-:103F50008F840038A08700FE8F8600388F9F007006
-:103F6000ACDF00548F990074ACD900588F8D007865
-:103F70000127C02100185880016DA021928F000AEE
-:103F8000000F704001CF182100038880022D80218E
-:103F9000A207000B8F86007801666021918A000BD2
-:103FA000000A1040004A20210004288000A6402179
-:103FB000A107000A3C07800834E900808D22003008
-:103FC0008F860038ACC2005C0A00228924140001EC
-:103FD00090CA00FF1540FEAD8F880074A0C4000990
-:103FE0000A0021CE8F860038A0C000FD8F980038CF
-:103FF00024060001A30000FE3C010801A02696B59E
-:104000003C010801A02096B40A0021BD0000000078
-:1040100090CB00FF3C040801908496D3316C00FFE4
-:104020000184502B1540000F2402000324020004D9
-:10403000A0C200090A0021CE8F86003890C3000A72
-:104040002410FF8002035824316C00FF1180FDC151
-:10405000000000003C010801A02096B50A0021BD27
-:1040600000000000A0C200090A0021CE8F8600389F
-:1040700090D4000A2412FF8002544824312800FF03
-:104080001500FFF4240200083C010801A02296D18B
-:104090000A0021CE00000000001088408F8B0070C5
-:1040A000023018210003688001A72021AC8B00009A
-:1040B0008F8A0074240C0001A48C0008AC8A0004D0
-:1040C0003C05080190A596B62402000110A2FE1E30
-:1040D00024A5FFFF0A0022489084000B0184A0233E
-:1040E0001A80FD8B000000003C010801A02E96B54F
-:1040F0000A0022FC240B00013C010801A42596DAE9
-:104100000A0023AE8F880038240B0001106B0022B8
-:104110008F9800388F85003890BF00FF33F900FF7B
-:104120001079002B000000003C1F080193FF96B897
-:10413000001FC840033FC0210018A08002887821DA
-:1041400091EE000AA08E000A8F8D00783C030801D2
-:10415000906396B800CD88210A0023D4A223000BD7
-:10416000263000010600003101A490230640002BF8
-:10417000240200033C010801A02F96B50A0022FC8E
-:10418000240B00018F8900380A002232AD27005429
-:104190000A00228824120001931400FDA094000B51
-:1041A0008F8800388F8F0078910E00FE00CF682135
-:1041B000A1AE000A8F910038A22700FD8F83007006
-:1041C0008F900038AE0300540A0023D58F8D0078FD
-:1041D00090B000FEA090000A8F8B00388F8C007882
-:1041E000916A00FD00CC1021A04A000B8F8400389A
-:1041F000A08700FE8F8600748F850038ACA600581B
-:104200000A0023D58F8D007894B80008ACA4000470
-:10421000030378210A00227CA4AF00083C010801B6
-:10422000A02296B50A0021BD0000000090CF000931
-:10423000240D000431EE00FF11CDFD8524020001A4
-:104240003C010801A02296B50A0021BD0000000033
-:10425000080033440800334408003420080033F4D5
-:10426000080033D808003328080033280800332812
-:104270000800334C8008010080080080800800009E
-:104280005F865437E4AC62CC50103A4536621985EB
-:10429000BF14C0E81BC27A1E84F4B556094EA6FEB0
-:1042A0007DDA01E7C04D748108005A7408005AB8DD
-:1042B00008005A5C08005A5C08005A5C08005A5C06
-:1042C00008005A7408005A5C08005A5C08005AC07A
-:1042D00008005A5C080059D408005A5C08005A5C6F
-:1042E00008005AC008005A5C08005A5C08005A5C72
-:1042F00008005A5C08005A5C08005A5C08005A5CC6
-:1043000008005A5C08005A5C08005A5C08005A947D
-:1043100008005A5C08005A9408005A5C08005A5C6D
-:1043200008005A5C08005A9808005A9408005A5C21
-:1043300008005A5C08005A5C08005A5C08005A5C85
-:1043400008005A5C08005A5C08005A5C08005A5C75
-:1043500008005A5C08005A5C08005A5C08005A5C65
-:1043600008005A5C08005A5C08005A5C08005A5C55
-:1043700008005A5C08005A5C08005A5C08005A9809
-:1043800008005A9808005A5C08005A9808005A5CBD
-:1043900008005A5C08005A5C08005A5C08005A5C25
-:1043A00008005A5C08005A5C08005A5C08005A5C15
-:1043B00008005A5C08005A5C08005A5C08005A5C05
-:1043C00008005A5C08005A5C08005A5C08005A5CF5
-:1043D00008005A5C08005A5C08005A5C08005A5CE5
-:1043E00008005A5C08005A5C08005A5C08005A5CD5
-:1043F00008005A5C08005A5C08005A5C08005A5CC5
-:1044000008005A5C08005A5C08005A5C08005A5CB4
-:1044100008005A5C08005A5C08005A5C08005A5CA4
-:1044200008005A5C08005A5C08005A5C08005A5C94
-:1044300008005A5C08005A5C08005A5C08005A5C84
-:1044400008005A5C08005A5C08005A5C08005A5C74
-:1044500008005A5C08005A5C08005A5C08005A5C64
-:1044600008005A5C08005A5C08005A5C08005A5C54
-:1044700008005A5C08005A5C08005A5C08005A5C44
-:1044800008005A5C08005A5C08005A5C08005A5C34
-:1044900008005A5C08005A5C08005A5C08005A5C24
-:1044A00008005A5C08005A5C08005ADC0800782CA6
-:1044B00008007A90080078380800762C08007838D0
-:1044C000080078C4080078380800762C0800762C9C
-:1044D0000800762C0800762C0800762C0800762C34
-:1044E0000800762C0800762C0800762C0800762C24
-:1044F00008007858080078480800762C0800762CC8
-:104500000800762C0800762C0800762C0800762C03
-:104510000800762C0800762C0800762C0800762CF3
-:104520000800762C0800762C08007848080082D80D
-:1045300008008164080082A008008164080082707D
-:104540000800804C080081640800816408008164D0
-:1045500008008164080081640800816408008164A7
-:104560000800816408008164080081640800816497
-:10457000080081640800818C08008D1008008E6C92
-:0C45800008008E4C080088B408008D284C
-:04458C000A000124FC
-:1045900000000000000000000000000D7470613693
-:1045A0002E322E31610000000602010100000000E1
-:1045B00000000000000000000000000000000000FB
-:1045C00000000000000000000000000000000000EB
-:1045D00000000000000000000000000000000000DB
-:1045E00000000000000000000000000000000000CB
-:1045F00000000000000000000000000000000000BB
-:1046000000000000000000000000000000000000AA
-:10461000000000000000000000000000000000009A
-:1046200010000003000000000000000D0000000D5D
-:104630003C020800244217203C03080024632A108F
-:10464000AC4000000043202B1480FFFD24420004F6
-:104650003C1D080037BD2FFC03A0F0213C100800D2
-:10466000261004903C1C0800279C17200E000262B4
-:10467000000000000000000D2402FF8027BDFFE0C5
-:1046800000821024AFB00010AF420020AFBF00186E
-:10469000AFB10014936500043084007F03441821F7
-:1046A0003C0200080062182130A500200360802130
-:1046B0003C080111277B000814A000022466005C5E
-:1046C00024660058920200049743010492040004F7
-:1046D0003047000F3063FFFF30840040006728231D
-:1046E00010800009000048219202000530420004B9
-:1046F000104000050000000010A0000300000000B2
-:1047000024A5FFFC240900049202000530420004A5
-:10471000104000120000000010A000100000000077
-:104720009602000200A72021010440252442FFFE3A
-:10473000A7421016920300042402FF8000431024B5
-:10474000304200FF104000033C0204000A000174E4
-:10475000010240258CC20000AF4210188F42017840
-:104760000440FFFE2402000AA74201409602000214
-:1047700024040009304200070002102330420007E1
-:10478000A7420142960200022442FFFEA7420144D2
-:10479000A740014697420104A74201488F42010801
-:1047A0003042002050400001240400019202000425
-:1047B00030420010144000023483001000801821A1
-:1047C000A743014A000000000000000000000000B4
-:1047D00000000000AF4810000000000000000000D2
-:1047E00000000000000000008F4210000441FFFEA6
-:1047F0003102FFFF10400007000000009202000499
-:104800003042004014400003000000008F421018A6
-:10481000ACC20000960200063042FFFF24420002B4
-:10482000000210430002104003628821962200001B
-:104830001120000D3044FFFF00A710218F830038A6
-:104840008F45101C000210820002108000431021CE
-:10485000AC45000030A6FFFF0E00058D00052C02C0
-:1048600000402021A6220000920300042402FF80C1
-:1048700000431024304200FF1040001F00000000E1
-:1048800092020005304200021040001B00000000B0
-:104890009742100C2442FFFEA742101600000000B1
-:1048A0003C02040034420030AF421000000000001F
-:1048B0000000000000000000000000008F42100017
-:1048C0000441FFFE000000009742100C8F45101CB1
-:1048D0003042FFFF244200300002108200021080AC
-:1048E000005B1021AC45000030A6FFFF0E00058DD7
-:1048F00000052C02A6220000960400022484000871
-:104900000E0001E93084FFFF974401040E0001F717
-:104910003084FFFF8FBF00188FB100148FB00010DC
-:104920003C02100027BD002003E00008AF420178E0
-:104930003084FFFF308200078F8500241040000282
-:10494000248300073064FFF800A4102130421FFFC9
-:1049500003421821247B4000AF850028AF82002449
-:1049600003E00008AF4200843084FFFF3082000F74
-:104970008F85002C8F860034104000022483000FA6
-:104980003064FFF000A410210046182BAF850030E2
-:104990000046202314600002AF82002CAF84002C5C
-:1049A0008F82002C340480000342182100641821F7
-:1049B000AF83003803E00008AF4200808F8200140C
-:1049C000104000088F8200048F82FFDC1440000535
-:1049D0008F8200043C02FFBF3442FFFF008220248C
-:1049E0008F82000430430006240200021062000F90
-:1049F0003C0201012C620003504000052402000427
-:104A00001060000F3C0200010A00023000000000AC
-:104A100010620005240200061462000C3C02011121
-:104A20000A000229008210253C0200110082102594
-:104A3000AF421000240200010A000230AF82000CD5
-:104A400000821025AF421000AF80000C0000000073
-:104A5000000000000000000003E00008000000006B
-:104A60008F82000C10400004000000008F421000F4
-:104A70000441FFFE0000000003E000080000000009
-:104A80008F8200102443F800000231C224C2FFF0DC
-:104A90002C63030110600003000210420A00025759
-:104AA000AC8200008F85001800C5102B1440000B4D
-:104AB0000000182100C51023244700018F82001C2C
-:104AC00000A210212442FFFF0046102B5440000496
-:104AD0002402FFFF0A000257AC8700002402FFFFF8
-:104AE0000A000260AC8200008C82000000021940C3
-:104AF000006218210003188000621821000318804A
-:104B00003C0208002442175C0062182103E0000800
-:104B10000060102127BDFFD8AFBF0020AFB1001C3F
-:104B2000AFB000183C0460088C8250002403FF7F63
-:104B30003C066000004310243442380CAC82500024
-:104B40008CC24C1C3C1A8000000216023042000F3E
-:104B500010400007AF82001C8CC34C1C3C02001F9D
-:104B60003442FC0000621824000319C2AF8300180D
-:104B70008F420008275B400034420001AF4200082A
-:104B8000AF8000243C02601CAF400080AF40008436
-:104B90008C4500088CC308083402800003422021A1
-:104BA0002402FFF0006218243C0200803C0108004F
-:104BB000AC2204203C025709AF8400381462000480
-:104BC000AF850034240200010A000292AF82001473
-:104BD000AF8000148F4200003842000130420001D3
-:104BE0001440FFFC8F8200141040001600000000EB
-:104BF00097420104104000058F83000014600007F5
-:104C00002462FFFF0A0002A72C62000A2C62001037
-:104C1000504000048F83000024620001AF82000036
-:104C20008F8300002C62000A144000032C620007EE
-:104C30000A0002AEAF80FFDC104000022402000137
-:104C4000AF82FFDC8F4301088F44010030622000F7
-:104C5000AF83000410400008AF8400103C0208003D
-:104C60008C42042C244200013C010800AC22042C9C
-:104C70000A00058A3C0240003065020014A00003CF
-:104C800024020F001482026024020D0097420104E6
-:104C9000104002C83C02400030624000144000ADA9
-:104CA0008F8200388C4400088F4201780440FFFE58
-:104CB00024020800AF42017824020008A742014004
-:104CC000A7400142974201048F8400043051FFFF46
-:104CD0003082000110400007022080212623FFFEC1
-:104CE000240200023070FFFFA74201460A0002DBE7
-:104CF000A7430148A74001463C0208008C42043CFF
-:104D00001440000D8F8300103082002014400002F8
-:104D10002403000924030001006020218F83001078
-:104D2000240209005062000134840004A744014AAF
-:104D30000A0002F60000000024020F0014620005C1
-:104D400030820020144000062403000D0A0002F502
-:104D50002403000514400002240300092403000179
-:104D6000A743014A3C0208008C4204203C0400484E
-:104D70000E00020C004420250E0002350000000049
-:104D80008F82000C1040003E000000008F42100097
-:104D90003C03002000431024104000398F8200049F
-:104DA000304200021040003600000000974210140C
-:104DB0001440003300000000974210088F8800382C
-:104DC0003042FFFF244200060002188200033880B0
-:104DD00000E83021304300018CC400001060000462
-:104DE000304200030000000D0A00033700E81021E4
-:104DF000544000103084FFFF3C05FFFF0085202455
-:104E0000008518260003182B0004102B00431024E3
-:104E10001040000500000000000000000000000D30
-:104E200000000000240002228CC200000A000336A9
-:104E3000004520253883FFFF0003182B0004102BAA
-:104E40000043102410400005000000000000000096
-:104E50000000000D000000002400022B8CC20000A6
-:104E60003444FFFF00E81021AC4400003C0208007D
-:104E70008C420430244200013C010800AC22043082
-:104E80008F6200008F840038AF8200088C8300009E
-:104E90003402FFFF1462000F000010213C050800DF
-:104EA0008CA504543C0408008C84045000B02821D4
-:104EB00000B0302B00822021008620213C01080018
-:104EC000AC2504543C010800AC2404500A000580C1
-:104ED000240400088C820000304201001040000FC2
-:104EE000000010213C0508008CA5044C3C0408007F
-:104EF0008C84044800B0282100B0302B008220218F
-:104F0000008620213C010800AC25044C3C0108002F
-:104F1000AC2404480A000580240400083C0508006D
-:104F20008CA504443C0408008C84044000B0282173
-:104F300000B0302B00822021008620213C01080097
-:104F4000AC2504443C010800AC2404400A00058060
-:104F5000240400088F6200088F620000000216021D
-:104F6000304300F0240200301062000524020040AB
-:104F7000106200E08F8200200A00058824420001B0
-:104F800014A0000500000000000000000000000D5B
-:104F900000000000240002568F4201780440FFFE0A
-:104FA000000000000E00023D27A400101440000580
-:104FB00000408021000000000000000D0000000003
-:104FC0002400025D8E020000104000050000000079
-:104FD000000000000000000D00000000240002603E
-:104FE0008F62000C04430003240200010A00042E17
-:104FF000AE000000AE0200008F8200388C4800082E
-:10500000A20000078F65000C8F64000430A3FFFF2F
-:105010000004240200852023308200FF0043102179
-:1050200024420005000230832CC20081A605000A3C
-:1050300014400005A2040004000000000000000D60
-:1050400000000000240002788F8500380E0005ABB8
-:10505000260400148F6200048F430108A602000892
-:105060003C021000006218241060000800000000DC
-:1050700097420104920300072442FFEC34630002CC
-:105080003045FFFF0A0003C3A20300079742010453
-:105090002442FFF03045FFFF960600082CC20013A3
-:1050A00054400005920300079202000734420001B9
-:1050B000A20200079203000724020001106200050B
-:1050C000240200031062000B8F8200380A0003E004
-:1050D00030C6FFFF8F8200383C04FFFF8C43000C7A
-:1050E0000064182400651825AC43000C0A0003E096
-:1050F00030C6FFFF3C04FFFF8C43001000641824FF
-:1051000000651825AC43001030C6FFFF24C2000222
-:1051100000021083A20200058F830038304200FF96
-:1051200000021080004328218CA800008CA20000FF
-:1051300024030004000217021443001200000000C0
-:10514000974201043C03FFFF010318243042FFFF94
-:10515000004610232442FFFE00624025ACA8000058
-:1051600092030005306200FF000210800050102101
-:10517000904200143042000F004310210A00041531
-:10518000A20200068CA40004974201049603000AC0
-:105190003088FFFF3042FFFF004610232442FFD635
-:1051A0000002140001024025ACA80004920200078E
-:1051B000920400052463002800031883006418216A
-:1051C00034420004A2030006A20200078F820004FA
-:1051D0002403FFFB3442000200431024AF8200048A
-:1051E000920300068F87003800031880007010219A
-:1051F0008C4400203C02FFF63442FFFF0082402432
-:1052000000671821AE04000CAC68000C9205000683
-:105210003C03FF7F8E02000C0005288000B0202197
-:105220003463FFFF010330249488002600A728215F
-:1052300000431024AE02000CAC860020AC88002491
-:10524000ACA8001024020010A74201402402000272
-:10525000A7400142A7400144A742014697420104EA
-:105260003C0400082442FFFEA7420148240200013A
-:105270000E00020CA742014A9603000A92020004A3
-:105280000043102124420002304200070002102394
-:10529000304200070E000235AE0200108F6200009F
-:1052A0003C0308008C63044424040010AF8200080F
-:1052B000974201043042FFFF2442FFFE00403821A4
-:1052C000000237C33C0208008C42044000671821EA
-:1052D0000067282B00461021004510213C010800E2
-:1052E000AC2304443C010800AC2204400A0005152C
-:1052F0000000000014A000050000000000000000F5
-:105300000000000D000000002400030A8F42017815
-:105310000440FFFE000000000E00023D27A4001420
-:105320001440000500408021000000000000000D36
-:1053300000000000240003118E020000544000060B
-:1053400092020007000000000000000D00000000B5
-:105350002400031C920200073042000410400005A4
-:105360008F8200042403FFFB344200020043102418
-:10537000AF8200048F620004044300089202000719
-:10538000920200068E03000CAE00000000021080A6
-:1053900000501021AC43002092020007304200046C
-:1053A000544000099602000A920200053C030001E5
-:1053B00000021080005010218C46001800C33021DC
-:1053C000AC4600189602000A9206000427710008F5
-:1053D0000220202100C2302124C600052605001429
-:1053E0000E0005AB00063082920400068F650004B3
-:1053F0003C027FFF00042080009120218C83000468
-:105400003442FFFF00A2282400651821AC83000469
-:105410009202000792040005920300043042000447
-:105420001040001496070008308400FF000420801C
-:10543000009120218C860004974201049605000A01
-:10544000306300FF3042FFFF004310210045102170
-:1054500030E3FFFF004310232442FFD830C6FFFF94
-:105460000002140000C23025AC8600040A0004C902
-:1054700092030007308500FF0005288000B1282135
-:105480008CA4000097420104306300FF3042FFFF0C
-:1054900000431021004710233C03FFFF008320241A
-:1054A0003042FFFF00822025ACA4000092030007D9
-:1054B0002402000110620006000000002402000324
-:1054C00010620011000000000A0004EC8E030010BE
-:1054D00097420104920300049605000A8E24000CF2
-:1054E00000431021004510212442FFF23C03FFFF3E
-:1054F000008320243042FFFF00822025AE24000CD0
-:105500000A0004EC8E030010974201049203000489
-:105510009605000A8E24001000431021004510213A
-:105520002442FFEE3C03FFFF008320243042FFFFB4
-:1055300000822025AE2400108E0300102402000AF1
-:10554000A7420140A74301429603000A92020004C9
-:105550003C04004000431021A7420144A7400146FB
-:1055600097420104A7420148240200010E00020CE8
-:10557000A742014A0E000235000000008F620000C1
-:105580009203000400002021AF820008974201042A
-:105590009606000A3042FFFF0062182100602821B1
-:1055A0003C0308008C6304443C0208008C42044025
-:1055B00000651821004410210065382B0047102198
-:1055C0003C010800AC2304443C010800AC22044028
-:1055D00092040004008620212484000A3084FFFF06
-:1055E0000E0001E900000000974401043084FFFF31
-:1055F0000E0001F7000000003C021000AF420178ED
-:105600000A0005878F82002014820027306200067E
-:1056100097420104104000673C02400030624000A5
-:105620001040000500000000000000000000000D18
-:1056300000000000240004208F4201780440FFFE97
-:1056400024020800AF42017824020008A74201406A
-:10565000A74001428F8200049743010430420001B9
-:10566000104000073070FFFF2603FFFE24020002F7
-:10567000A7420146A74301480A00053F2402000D46
-:10568000A74001462402000DA742014A8F62000094
-:1056900024040008AF8200080E0001E900000000A9
-:1056A0000A00051902002021104000423C0240007F
-:1056B00093620000304300F02402001010620005E5
-:1056C00024020070106200358F8200200A000588D5
-:1056D000244200018F620000974301043050FFFF15
-:1056E0003071FFFF8F4201780440FFFE3202000755
-:1056F00000021023304200072403000A2604FFFEA4
-:10570000A7430140A7420142A7440144A7400146E4
-:10571000A75101488F420108304200201440000286
-:105720002403000924030001A743014A0E00020CD0
-:105730003C0400400E000235000000003C07080059
-:105740008CE70444021110212442FFFE3C060800AD
-:105750008CC604400040182100E3382100001021CD
-:105760008F65000000E3402B00C2302126040008B2
-:1057700000C830213084FFFFAF8500083C010800DD
-:10578000AC2704443C010800AC2604400E0001E9AB
-:10579000000000000A000519022020210E00013B34
-:1057A000000000008F82002024420001AF82002010
-:1057B0003C024000AF4201380A00029200000000A3
-:1057C0003084FFFF30C6FFFF00052C0000A628250F
-:1057D0003882FFFF004510210045282B004510218D
-:1057E00000021C023042FFFF0043102100021C0295
-:1057F0003042FFFF004310213842FFFF03E0000862
-:105800003042FFFF3084FFFF30A5FFFF000018216A
-:1058100010800007000000003082000110400002EC
-:1058200000042042006518210A0005A10005284057
-:1058300003E000080060102110C0000624C6FFFF2E
-:105840008CA2000024A50004AC8200000A0005AB75
-:105850002484000403E000080000000010A00008F9
-:1058600024A3FFFFAC860000000000000000000041
-:105870002402FFFF2463FFFF1462FFFA2484000464
-:0858800003E000080000000035
-:04588800000000011B
-:04588C000A00002AE4
-:1058900000000000000000000000000D7478703669
-:1058A0002E322E31610000000602010000000000CF
-:1058B000000001360000EA60000000000000000067
-:1058C00000000000000000000000000000000000D8
-:1058D00000000000000000000000000000000000C8
-:1058E00000000000000000000000000000000016A2
-:1058F00000000000000000000000000000000000A8
-:105900000000000000000000000000000000000097
-:105910000000000000000000000000000000000087
-:10592000000000000000138800000000000005DCFB
-:105930000000000000000000100000030000000054
-:105940000000000D0000000D3C02080024423D68EC
-:105950003C0308002463401CAC4000000043202BA3
-:105960001480FFFD244200043C1D080037BD7FFC6D
-:1059700003A0F0213C100800261000A83C1C0800E1
-:10598000279C3D680E00044E000000000000000D42
-:1059900027BDFFB4AFA10000AFA20004AFA3000871
-:1059A000AFA4000CAFA50010AFA60014AFA700185D
-:1059B000AFA8001CAFA90020AFAA0024AFAB0028FD
-:1059C000AFAC002CAFAD0030AFAE0034AFAF00389D
-:1059D000AFB8003CAFB90040AFBC0044AFBF004817
-:1059E0000E000591000000008FBF00488FBC0044EE
-:1059F0008FB900408FB8003C8FAF00388FAE0034B5
-:105A00008FAD00308FAC002C8FAB00288FAA002404
-:105A10008FA900208FA8001C8FA700188FA6001444
-:105A20008FA500108FA4000C8FA300088FA2000484
-:105A30008FA1000027BD004C3C1B60048F7A5030C2
-:105A4000377B502803400008AF7A00008F86003C67
-:105A50003C0390003C0280000086282500A32025FE
-:105A6000AC4400203C0380008C67002004E0FFFE73
-:105A70000000000003E00008000000000A000070C1
-:105A8000240400018F85003C3C0480003483000125
-:105A900000A3102503E00008AC82002003E000080A
-:105AA000000010213084FFFF30A5FFFF10800007A9
-:105AB0000000182130820001104000020004204242
-:105AC000006518211480FFFB0005284003E0000852
-:105AD0000060102110C00007000000008CA2000030
-:105AE00024C6FFFF24A50004AC82000014C0FFFB05
-:105AF0002484000403E000080000000010A0000857
-:105B000024A3FFFFAC86000000000000000000009E
-:105B10002402FFFF2463FFFF1462FFFA24840004C1
-:105B200003E000080000000090AA00318FAB0010D5
-:105B30008CAC00403C0300FF8D680004AD6C00207D
-:105B40008CAD004400E060213462FFFFAD6D0024A5
-:105B50008CA700483C09FF000109C024AD6700285C
-:105B60008CAE004C0182C82403197825AD6F000467
-:105B7000AD6E002C8CAD0038314A00FFAD6D001CBD
-:105B800094A900323128FFFFAD68001090A70030C3
-:105B9000A5600002A1600004A167000090A300328C
-:105BA000306200FF00021982106000052405000128
-:105BB0001065000E0000000003E00008A16A00016B
-:105BC0008CD80028354A0080AD7800188CCF00149E
-:105BD000AD6F00148CCE0030AD6E00088CC4002C6C
-:105BE000A16A000103E00008AD64000C8CCD001C2C
-:105BF000AD6D00188CC90014AD6900148CC8002468
-:105C0000AD6800088CC70020AD67000C8CC2001482
-:105C10008C8300700043C82B132000070000000095
-:105C20008CC20014144CFFE400000000354A0080D0
-:105C300003E00008A16A00018C8200700A0000E6FF
-:105C4000000000009089003027BDFFF88FA8001CDD
-:105C5000A3A900008FA300003C0DFF8035A2FFFF29
-:105C60008CAC002C00625824AFAB0000A1000004F3
-:105C700000C05821A7A000028D06000400A0482102
-:105C80000167C8218FA50000008050213C18FF7FCC
-:105C9000032C20263C0E00FF2C8C0001370FFFFF49
-:105CA00035CDFFFF3C02FF0000AFC82400EDC0244B
-:105CB00000C27824000C1DC00323682501F870255C
-:105CC000AD0D0000AD0E00048D240024AFAD00002A
-:105CD000AD0400088D2C00202404FFFFAD0C000C47
-:105CE0009547003230E6FFFFAD06001091450048B1
-:105CF00030A200FF000219C2506000018D24003460
-:105D0000AD0400148D4700388FAA001827BD000885
-:105D1000AD0B0028AD0A0024AD07001CAD00002C1F
-:105D2000AD00001803E00008AD00002027BDFFE033
-:105D3000AFB20018AFB10014AFB00010AFBF001C7D
-:105D40009098003000C088213C0D00FF330F007F89
-:105D5000A0CF0000908E003135ACFFFF3C0AFF0061
-:105D6000A0CE000194A6001EA22000048CAB00145B
-:105D70008E29000400A08021016C2824012A4024DF
-:105D80000080902101052025A6260002AE240004F3
-:105D900026050020262400080E000092240600029A
-:105DA00092470030260500282624001400071E0014
-:105DB0000003160324060004044000032403FFFF2D
-:105DC000965900323323FFFF0E000092AE230010DD
-:105DD000262400248FBF001C8FB200188FB100143E
-:105DE0008FB0001024050003000030210A00009C41
-:105DF00027BD002027BDFFD8AFB1001CAFB00018F1
-:105E0000AFBF002090A900302402000100E0502123
-:105E10003123003F00A040218FB000400080882146
-:105E200000C04821106200148FA70038240B000521
-:105E300000A0202100C02821106B00130200302197
-:105E40000E000128000000009225007C30A4000212
-:105E50001080000326030030AE000030260300341B
-:105E60008FBF00208FB1001C8FB000180060102180
-:105E700003E0000827BD00280E0000A7AFB0001007
-:105E80000A00016F000000008FA3003C01002021E8
-:105E90000120282101403021AFA300100E0000EEA8
-:105EA000AFB000140A00016F000000003C06800043
-:105EB00034C20E008C4400108F850044ACA4002036
-:105EC0008C43001803E00008ACA300243C068000CB
-:105ED00034C20E008C4400148F850044ACA4002012
-:105EE0008C43001C03E00008ACA300249382000C48
-:105EF0001040001B2483000F2404FFF000643824AA
-:105F000010E00019978B00109784000E9389000D04
-:105F10003C0A601C0A0001AC0164402301037021AB
-:105F2000006428231126000231C2FFFF30A2FFFFC8
-:105F30000047302B50C0000E00E448218D4D000C6E
-:105F400031A3FFFF00036400000C2C0304A1FFF346
-:105F50000000302130637FFF0A0001A42406000105
-:105F600003E00008000000009784000E00E44821D0
-:105F70003123FFFF3168FFFF0068382B54E0FFF842
-:105F8000A783000E938A000D11400005240F000125
-:105F9000006BC023A380000D03E00008A798000E4B
-:105FA000006BC023A38F000D03E00008A798000E2C
-:105FB00003E000080000000027BDFFE8AFB00010BC
-:105FC0003C10800036030140308BFFFF93AA002B6A
-:105FD000AFBF0014A46B000436040E0094880016B2
-:105FE00030C600FF8FA90030A4680006AC65000829
-:105FF000A0660012A46A001AAC6700208FA5002CCE
-:10600000A4690018012020210E000198AC6500143D
-:106010003C021000AE0201788FBF00148FB0001058
-:1060200003E0000827BD00188F85000024840007C6
-:1060300027BDFFF83084FFF83C06800094CB008A2F
-:10604000316AFFFFAFAA00008FA90000012540239D
-:106050002507FFFF30E31FFF0064102B1440FFF7FC
-:1060600000056882000D288034CC400000AC10216F
-:1060700003E0000827BD00088F8200002486000787
-:1060800030C5FFF800A2182130641FFF03E00008AC
-:10609000AF8400008F87003C8F84004427BDFFB091
-:1060A000AFB70044AFB40038AFB1002CAFBF004869
-:1060B000AFB60040AFB5003CAFB30034AFB2003074
-:1060C000AFB000283C0B80008C860024AD670080B8
-:1060D0008C8A002035670E0035690100ACEA00109B
-:1060E0008C8800248D2500040000B821ACE800183D
-:1060F0008CE3001000A688230000A021ACE300146C
-:106100008CE20018ACE2001C122000FE00E0B0217E
-:10611000936C0008118000F400000000976F0010DD
-:1061200031EEFFFF022E682B15A000EF00000000EB
-:10613000977200103250FFFFAED000003C03800089
-:106140008C740000329300081260FFFD0000000014
-:1061500096D800088EC700043305FFFF30B5000154
-:1061600012A000E4000000000000000D30BFA040BD
-:106170002419004013F9011B30B4A000128000DF85
-:106180000000000093730008126000080000000087
-:10619000976D001031ACFFFF00EC202B1080000346
-:1061A00030AE004011C000D500000000A7850040BF
-:1061B000AF8700389363000802202821AFB1002088
-:1061C000146000F527B40020AF60000C978F0040EA
-:1061D00031F1400016200002240300162403000EB3
-:1061E00024054007A363000AAF650014938A0042A8
-:1061F0008F7000143155000100151240020248252D
-:10620000AF690014979F00408F78001433F9001095
-:1062100003194025AF6800149792004032470008E8
-:1062200010E0016E000000008F6700143C121000A7
-:106230003C11800000F27825AF6F001436230E0069
-:10624000946E000A3C0D81002406000E31CCFFFF45
-:10625000018D2025AF640004A36600029373000A39
-:106260003406FFFC266B0004A36B000A97980040DD
-:10627000330820001100015F000000003C05800091
-:1062800034A90E00979900409538000C978700407C
-:10629000001940423312C0003103000300127B0397
-:1062A00030F11000006F68250011720301AE602507
-:1062B000000C20C0A764001297930040936A000A64
-:1062C000001359823175003C02AA10212450003C71
-:1062D000A3700009953F000C33F93FFFA779001028
-:1062E00097700012936900090130F82127E5000238
-:1062F00030B900070019C02333080007A368000B5A
-:106300009371000997720012976F0010322700FFF7
-:106310008F910038978D004000F21821006F702196
-:1063200001C6602131A6004010C000053185FFFF85
-:1063300000B1102B3C128000104000170000982183
-:106340000225A82B56A0013E8FA500203C0480000A
-:10635000348A0E008D5300143C068000AD530010AB
-:106360008D4B001CAD4B0018AD4500008CCD0000DE
-:1063700031AC00081180FFFD34CE0E0095C300083B
-:1063800000A0882100009021A78300408DC6000452
-:1063900024130001AF860038976F001031F5FFFF1E
-:1063A0008E9F000003F1282310A0011FAE8500007E
-:1063B00093620008144000DD000000000E0001E7B9
-:1063C000240400108F900048004028213C02320035
-:1063D000320600FF000654000142F825260900019C
-:1063E000AF890048ACBF000093790009977800128C
-:1063F000936F000A332800FF3303FFFF01033821A6
-:1064000000076C0031EE00FF01AE6025ACAC00046B
-:106410008F840048978B0040316A20001140010AA8
-:10642000ACA4000897640012308BFFFF06400108FF
-:10643000ACAB000C978E004031C5000814A00002E0
-:1064400026280006262800023C1F800037E70E00A1
-:1064500094F900148CE5001C8F6700049378000207
-:106460003324FFFF330300FFAFA300108F6F00142E
-:10647000AFA800180E0001CBAFAF00142404001029
-:106480000E0001FB000000008E9200001640000587
-:10649000000000008F7800142403FFBF0303A02432
-:1064A000AF7400148F67000C00F5C821AF79000CA1
-:1064B0009375000816A00008000000001260000696
-:1064C000000000008F6800143C0AEFFF3549FFFE12
-:1064D0000109F824AF7F0014A37300088FA50020E2
-:1064E0000A00034F02202021AED100000A00022D35
-:1064F0003C03800014E0FF1E30BFA0400E0001905E
-:106500000000A0212E9100010237B02512C0001812
-:106510008FBF00488F87003C24170F0010F700D46E
-:106520003C0680008CD901780720FFFE241F0F0055
-:1065300010FF00F634CA0E008D56001434C7014017
-:1065400024080240ACF600048D49001C3C141000E5
-:10655000ACE90008A0E00012A4E0001AACE00020C2
-:10656000A4E00018ACE80014ACD401788FBF004858
-:106570008FB700448FB600408FB5003C8FB4003811
-:106580008FB300348FB200308FB1002C8FB0002851
-:1065900003E0000827BD00508F9100389788004025
-:1065A0003C1280000220A8213107004014E0FF7C4B
-:1065B00000009821977900108F9200383338FFFF40
-:1065C000131200A8000020210080A021108000F3F9
-:1065D00000A088211620FECE000000000A00031F44
-:1065E0002E9100013C0380008C6201780440FFFE84
-:1065F000240808008F860000AC6801783C03800006
-:10660000946D008A31ACFFFF01865823256AFFFF95
-:1066100031441FFF2C8900081520FFF900000000FD
-:106620008F8F0048347040008F83003C00E0A02131
-:10663000240E0F0025E70001AF87004800D030216D
-:10664000023488233C08800031F500FF106E0005FD
-:106650002407000193980042331300010013924075
-:1066600036470001001524003C0A0100008A482535
-:10667000ACC900008F82004830BF003630B9000836
-:10668000ACC200041320009900FF982535120E00BB
-:106690009650000A8F8700003C0F81003203FFFFF5
-:1066A00024ED000835060140006F60253C0E100007
-:1066B00031AB1FFF269200062405000EACCC002053
-:1066C000026E9825A4C5001AAF8B0000A4D2001852
-:1066D000162000083C1080008F89003C24020F0027
-:1066E0005122000224170001367300400E00018879
-:1066F0003C10800036060E008CCB0014360A014098
-:1067000002402021AD4B00048CC5001CAD450008A3
-:10671000A1550012AD5300140E0001983C15100055
-:10672000AE1501780A00035200000000936F0009C3
-:10673000976E0012936D000B31E500FF00AE202133
-:1067400031AC00FF008C80212602000A3050FFFF90
-:106750000E0001E7020020218F8600483C03410023
-:106760003C05800024CB0001AF8B0048936A0009F0
-:106770009769001230C600FF315F00FF3128FFFF2C
-:1067800003E8382124F900020006C4000319782523
-:1067900001E37025AC4E00008F6D000C34A40E0098
-:1067A000948B001401B26025AC4C00048C85001C55
-:1067B0008F670004936A00023164FFFF314900FFD4
-:1067C000AFA900108F680014AFB100180E0001CB04
-:1067D000AFA800140A0002FD02002021AF600004EF
-:1067E000A360000297980040330820001500FEA324
-:1067F00000003021A760001297840040936B000ACC
-:106800003C10800030931F0000135183014BA821DE
-:1068100026A20028A362000936090E00953F000C4D
-:106820000A000295A77F00108F70001436090040FF
-:106830000E000188AF6900140A0002C900000000C0
-:106840000A00034F000020210641FEFAACA0000C14
-:106850008CAC000C3C0D8000018D90250A0002EAF2
-:10686000ACB2000C000090210A0002C52413000104
-:10687000128000073C028000344B0E009566000831
-:1068800030D3004012600049000000003C06800048
-:106890008CD001780600FFFE34C50E0094B50010C0
-:1068A0003C03050034CC014032B8FFFF03039025C0
-:1068B000AD92000C8CAF0014240D20003C0410009D
-:1068C000AD8F00048CAE001CAD8E0008A1800012BC
-:1068D000A580001AAD800020A5800018AD8D0014A1
-:1068E000ACC401780A0003263C0680008F9F00009C
-:1068F000351801402692000227F9000833281FFFAF
-:10690000A71200180A000391AF8800003C02800023
-:1069100034450140ACA0000C1280001B34530E0023
-:1069200034510E008E370010ACB700048E240018CE
-:106930003C0B8000ACA400083570014024040040EA
-:10694000A20000128FBF0048A600001A8FB70044B3
-:10695000AE0000208FB60040A60000188FB5003CA6
-:10696000AE0400148FB400388FB300348FB20030FF
-:106970008FB1002C8FB000283C02100027BD0050C2
-:1069800003E00008AD6201788E660014ACA6000436
-:106990008E64001C0A00042A3C0B80000E0001904B
-:1069A0002E9100010A0003200237B02500000000EC
-:1069B0000000000D00000000240003690A0004012B
-:1069C0003C06800027BDFFD8AFBF00203C098000F7
-:1069D0003C1F20FFAFB200183C07600035320E00AC
-:1069E0002402001037F9FFFDACE23008AFB3001C01
-:1069F000AFB10014AFB00010AE59000000000000AD
-:106A00000000000000000000000000000000000086
-:106A10003C1800FF3713FFFDAE5300003C0B600431
-:106A20008D7050002411FF7F3C0E0002021178246B
-:106A300035EC380C35CD0109ACED4C18240A0009B1
-:106A4000AD6C50008CE80438AD2A0008AD2000146D
-:106A50008CE54C1C3106FFFF38C42F7100051E0267
-:106A60003062000F2486C0B310400007AF820008D8
-:106A70008CE54C1C3C09001F3528FC0000A818249C
-:106A8000000321C2AF8400048CF108083C0F5709B1
-:106A90002412F0000232702435F0001001D060267C
-:106AA00001CF68262DAA00012D8B0001014B38254E
-:106AB00050E00009A380000C3C1F601C8FF8000808
-:106AC00024190001A399000C33137C00A793001034
-:106AD000A780000EA380000DAF80004814C0000303
-:106AE000AF8000003C066000ACC0442C0E0005B92D
-:106AF0003C1080000E000F1A361101003C120800F5
-:106B000026523DD03C13080026733E508E030000F1
-:106B100038640001308200011440FFFC3C0B800A05
-:106B20008E2600002407FF8024C90240312A007FFE
-:106B3000014B402101272824AE060020AF880044E5
-:106B4000AE0500243C048000AF86003C8C8C0178AC
-:106B50000580FFFE24180800922F0008AC980178E9
-:106B6000A38F0042938E004231CD000111A0000F8F
-:106B700024050D0024DFF8002FF903011320001C69
-:106B8000000629C224A4FFF0000410420002314094
-:106B90000E00020200D2D8213C0240003C068000D8
-:106BA000ACC201380A0004A00000000010C5002398
-:106BB000240D0F0010CD00273C1F800837F90080FE
-:106BC00093380000240E0050330F00FF15EEFFF342
-:106BD0003C0240000E000A36000000003C0240006B
-:106BE0003C068000ACC201380A0004A0000000008E
-:106BF0008F83000400A3402B1500000B8F8B00082F
-:106C0000006B50212547FFFF00E5482B15200006AB
-:106C100000A36023000C19400E0002020073D8216B
-:106C20000A0004C43C0240000000000D0E000202F5
-:106C3000000000000A0004C43C0240003C1B0800A5
-:106C4000277B3F500E000202000000000A0004C42F
-:106C50003C0240003C1B0800277B3F700E000202F4
-:106C6000000000000A0004C43C0240003C0660042E
-:106C70003C09080025290104ACC9502C8CC85000DF
-:106C80003C0580003C02000235070080ACC7500084
-:106C90003C040800248415A43C0308002463155C0C
-:106CA000ACA50008ACA2000C3C010800AC243D607F
-:106CB0003C010800AC233D6403E00008240200010D
-:106CC00000A030213C1C0800279C3D683C0C0400BF
-:106CD0003C0B0002008B3826008C40262CE2000181
-:106CE0000007502B2D050001000A48803C030800D6
-:106CF00024633D60004520250123182110800003F6
-:106D000000001021AC6600002402000103E000082E
-:106D1000000000003C1C0800279C3D683C0B040060
-:106D20003C0A0002008A3026008B38262CC2000163
-:106D30000006482B2CE50001000940803C030800B8
-:106D400024633D60004520250103182110800005C3
-:106D5000000010213C0C0800258C155CAC6C000078
-:106D60002402000103E00008000000003C090002CA
-:106D70003C08040000883026008938262CC3000116
-:106D8000008028212CE40001008310251040000B16
-:106D9000000030213C1C0800279C3D683C0A800014
-:106DA0008D4E00082406000101CA6825AD4D00087B
-:106DB0008D4C000C01855825AD4B000C03E00008FC
-:106DC00000C010213C1C0800279C3D683C05800049
-:106DD0008CA6000C000420272402000100C4182403
-:106DE00003E00008ACA3000C3C0200021082000B80
-:106DF0003C0560003C070400108700030000000011
-:106E000003E00008000000008CA908D0240AFFFD60
-:106E1000012A402403E00008ACA808D08CA408D0C4
-:106E20002406FFFE0086182403E00008ACA308D067
-:106E30003C05601A34A600108CC3008027BDFFF803
-:106E40008CC50084AFA3000093A4000024020001BD
-:106E500010820003AFA5000403E0000827BD00086E
-:106E600093A7000114E0001497AC000297B8000249
-:106E70003C0F8000330EFFFC01CF6821ADA5000060
-:106E8000A3A000003C0660008CC708D02408FFFEC9
-:106E90003C04601A00E82824ACC508D08FA3000485
-:106EA0008FA200003499001027BD0008AF22008097
-:106EB00003E00008AF2300843C0B8000318AFFFC14
-:106EC000014B48218D2800000A00057DAFA8000471
-:106ED00027BDFFE8AFBF00103C1C0800279C3D68A1
-:106EE0003C0580008CA4000C8CA200043C03000232
-:106EF0000044282410A0000A00A318243C06040023
-:106F00003C0400021460000900A610241440000F85
-:106F10003C0404000000000D3C1C0800279C3D6858
-:106F20008FBF001003E0000827BD00183C020800D6
-:106F30008C423D600040F809000000003C1C080045
-:106F4000279C3D680A0005A68FBF00103C02080080
-:106F50008C423D640040F809000000000A0005ACC6
-:106F600000000000000411C003E0000824420240B9
-:106F70003C04080024843FB42405001A0A00009C45
-:106F80000000302127BDFFE0AFB000103C108000B2
-:106F9000AFBF0018AFB100143611010092220009F2
-:106FA0000E0005B63044007F8E3F00008F89003C04
-:106FB0003C0F008003E26021258800400049F82151
-:106FC000240DFF80310E00783198007835F90001EA
-:106FD00035F100020319382501D14825010D30246F
-:106FE00003ED5824018D2824240A00402404008045
-:106FF000240300C0AE0B0024AE000810AE0A081433
-:10700000AE040818AE03081CAE050804AE0708203D
-:10701000AE060808AE090824360909009539000CA7
-:107020003605098033ED007F3338FFFF001889C033
-:10703000AE110800AE0F0828952C000C8FBF001869
-:107040008FB10014318BFFFF000B51C0AE0A002C32
-:107050008CA400508FB000108CA3003C8D2700043E
-:107060008CA8001C8CA600383C0E800A01AE1021B2
-:1070700027BD0020AF820044AF840050AF8300548E
-:10708000AF87004CAF88005C03E00008AF8600606B
-:107090003C09080091293FD924A800023C051100B1
-:1070A00000093C0000E8302500C5182524820008AE
-:1070B000AC83000003E00008AC8000043C098000C1
-:1070C000352309009128010B906A00112402002841
-:1070D00000804821314700FF00A0702100C06821D6
-:1070E0003108004010E20002340C86DD240C080058
-:1070F0003C0A800035420A9A94470000354B0A9CAE
-:1071000035460AA030F9FFFFAD3900008D78000048
-:10711000354B0A8024040001AD3800048CCF0000F8
-:10712000AD2F00089165001930A300031064009092
-:1071300028640002148000AF240500021065009E40
-:10714000240F0003106F00B435450AA4240A080078
-:10715000118A0048000000005100003D3C0B8000F7
-:107160003C048000348309009067001230E200FF85
-:10717000004D7821000FC880272400013C0A8000C0
-:10718000354F090091E50019354C09808D8700289D
-:1071900030A300FF00031500004758250004C40079
-:1071A0003C19600001793025370806FFAD26000044
-:1071B000AD2800048DEA002C25280028AD2A0008FF
-:1071C0008DEC0030AD2C000C8DE50034AD250010A9
-:1071D0008DE400383C05800034AC093CAD2400143B
-:1071E0008DE3001CAD2300188DE70020AD27001CA7
-:1071F0008DE20024AD2200208DF9002834A2010088
-:10720000AD3900248D830000AD0E000434B90900AF
-:10721000AD0300008C47000C25020014AD070008E8
-:10722000932B00123C04080090843FD8AD0000105E
-:10723000317800FF030D302100064F0000047C0070
-:10724000012F702535CDFFFC03E00008AD0D000CCB
-:1072500035780900930600123C05080094A53FC844
-:1072600030C800FF010D5021000A60800A00063C72
-:10727000018520211500005B000000003C0808008B
-:1072800095083FCE3C06080094C63FC80106102171
-:107290003C0B80003579090093380011932A0019BE
-:1072A00035660A80330800FF94CF002A0008608208
-:1072B000314500FF978A0058000C1E00000524008D
-:1072C0003047FFFF006410250047C02501EA302148
-:1072D0003C0B4000030B402500066400AD28000075
-:1072E000AD2C0004932500183C030006252800144B
-:1072F00000053E0000E31025AD2200088F24002C7D
-:107300003C05800034AC093CAD24000C8F38001CD7
-:1073100034A20100254F0001AD3800108D8300001C
-:10732000AD0E000431EB7FFFAD0300008C47000C75
-:1073300034B90900A78B0058AD070008932B001241
-:107340003C04080090843FD825020014317800FFE7
-:10735000030D302100064F0000047C00012F702532
-:1073600035CDFFFCAD00001003E00008AD0D000CB2
-:107370003C02080094423FD23C05080094A53FC857
-:1073800035440AA43C07080094E73FC4948B0000EE
-:107390000045C8210327C023000B1C002706FFF26D
-:1073A00000665025AD2A000CAD200010AD2C001455
-:1073B0000A00063025290018354F0AA495E500007B
-:1073C000956400280005140000043C003459810035
-:1073D00000EC5825AD39000CAD2B00100A0006302A
-:1073E000252900143C0C0800958C3FCE0A0006812C
-:1073F000258200015460FF56240A080035580AA46B
-:107400009706000000061C00006C5025AD2A000CF9
-:107410000A000630252900103C03080094633FD27F
-:107420003C07080094E73FC83C0F080095EF3FC4B5
-:1074300094A400009579002800671021004F58237C
-:1074400000041C00001934002578FFEE00D87825D0
-:10745000346A8100AD2A000CAD2F0010AD2000145D
-:10746000AD2C00180A0006302529001C03E0000896
-:10747000240207D027BDFFE0AFB20018AFB100145F
-:10748000AFB00010AFBF001C0E00007C0080882150
-:107490008F8800548F87004C3C05800834B20080F0
-:1074A000011128213C10800024020080240300C028
-:1074B00000A72023AE0208183C068008AE03081C73
-:1074C00018800004AF850054ACC500048CC90004CA
-:1074D000AF89004C12200009360409800E0006F81E
-:1074E00000000000924C00278E0B007401825004B3
-:1074F000014B3021AE46000C360409808C8E001CF6
-:107500008F8F005C01CF682319A000048FBF001C7F
-:107510008C90001CAF90005C8FBF001C8FB20018D5
-:107520008FB100148FB000100A00007E27BD00202C
-:107530008F8600508F8300548F82004C3C0580085A
-:1075400034A40080AC860050AC83003C03E000080B
-:10755000ACA200043C0308008C63005427BDFFF874
-:10756000308400FF2462000130A500FF3C010800C8
-:10757000AC22005430C600FF3C0780008CE8017844
-:107580000500FFFE3C0C7FFFA3A400038FAA0000B0
-:10759000358BFFFF014B4824000627C001244025FE
-:1075A000AFA8000034E201009043000AA3A000024B
-:1075B0003C1980FFA3A300018FAF000030AE007F15
-:1075C0003738FFFF01F86024000E6E003C0A0020EF
-:1075D00034E50140018D5825354920002406FF80FF
-:1075E0003C04100027BD0008ACAB000CACA9001493
-:1075F000A4A00018A0A6001203E00008ACE40178E3
-:10760000308800FF30A700FF3C0380008C620178C7
-:107610000440FFFE3C0C8000358A0A008D4B0020A0
-:107620003584014035850980AC8B00048D490024E8
-:107630000007302B00061540AC890008A088001018
-:1076400090A3004CA083002D03E00008A480001844
-:1076500027BDFFE8308400FFAFBF00100E00075DBC
-:1076600030A500FF8F8300548FBF00103C068000C0
-:1076700034C50140344700402404FF903C02100010
-:1076800027BD0018ACA3000CA0A40012ACA70014E6
-:1076900003E00008ACC2017827BDFFE03C08800889
-:1076A000AFBF001CAFB20018AFB10014AFB00010F4
-:1076B000351000808E0600183C078000309200FFD5
-:1076C00000C72025AE0400180E00007C30B100FF7A
-:1076D00092030005346200080E00007EA20200053D
-:1076E000024020210E0007710220282102402021A3
-:1076F0008FBF001C8FB200188FB100148FB0001024
-:1077000024050005240600010A00073227BD0020D9
-:107710003C05800034A309809066000830C2000850
-:107720001040000F3C0A01013549080AAC890000ED
-:107730008CA80074AC8800043C07080090E73FD890
-:1077400030E5001050A00008AC8000083C0D800817
-:1077500035AC00808D8B0058AC8B00082484000C65
-:1077600003E00008008010210A0007B52484000C03
-:1077700027BDFFE83C098000AFB00010AFBF001488
-:107780003526098090C800092402000600A058216F
-:10779000310300FF35270900008080212405000403
-:1077A0001062007B2408000294CF005C3C0E0204AF
-:1077B00031EDFFFF01AE6025AE0C000090CA00085D
-:1077C00031440020108000080000000090C2004EEC
-:1077D0003C1F010337F90300305800FF031930251F
-:1077E00024050008AE06000490F9001190E600128E
-:1077F00090E40011333800FF0018708230CF00FF92
-:1078000001CF5021014B6821308900FF31AAFFFFD1
-:1078100039230028000A60801460002C020C4823E1
-:1078200090E400123C198000372F0100308C00FFDB
-:10783000018B1821000310800045F821001F8400EF
-:10784000360706FFAD270004373F090093EC00110F
-:1078500093EE0012372609800005C0828DE4000CEB
-:107860008CC5003431CD00FF01AB10210058182128
-:1078700000A4F8230008840000033F0000F0302536
-:1078800033F9FFFF318F00FC00D97025015820210A
-:1078900001E9682100045080ADAE000C0E00007CB0
-:1078A000012A80213C088008240B00043505008053
-:1078B0000E00007EA0AB0009020010218FBF001453
-:1078C0008FB0001003E0000827BD001890EC0011F5
-:1078D00090E300193C18080097183FCE318200FF52
-:1078E0000002F882307000FF001FCE0000103C0044
-:1078F0000327302500D870253C0F400001CF6825B4
-:107900003C198000AD2D0000373F090093EC0011B9
-:1079100093EE0012372F0100372609800005C08240
-:107920008DE4000C8CC5003431CD00FF01AB10217B
-:107930000058182100A4F8230008840000033F0029
-:1079400000F0302533F9FFFF318F00FC00D970259E
-:107950000158202101E9682100045080ADAE000CDF
-:107960000E00007C012A80213C088008240B0004C2
-:10797000350500800E00007EA0AB0009020010213A
-:107980008FBF00148FB0001003E0000827BD00185F
-:107990000A0007C72408001227BDFFD03C0380005F
-:1079A000AFB60028AFB50024AFB40020AFB10014CB
-:1079B000AFBF002CAFB3001CAFB20018AFB00010C7
-:1079C0003467010090E6000B309400FF30B500FFF3
-:1079D00030C200300000B021104000990000882122
-:1079E000346409809088000800082E0000051E03FA
-:1079F000046000C0240400048F8600543C01080089
-:107A0000A0243FD83C0C8000AD8000483C0480009E
-:107A1000348E010091CD000B31A5002010A000078D
-:107A20003C0780003493098092720008001286009F
-:107A300000107E0305E000C43C1F800834EC010008
-:107A4000918A000B34EB09809169000831440040B1
-:107A50000004402B3123000800C898231460000262
-:107A600024120003000090213C10800036180A8088
-:107A700036040900970E002C9083001190890012A3
-:107A800093050018307F00FF312800FF02481021C5
-:107A90000002C880930D0018033F782101F13021C6
-:107AA00030B100FF00D11821A78E00583C0108001A
-:107AB000A4263FCE3C010800A4233FD015A000021D
-:107AC000000000000000000D920B010B3065FFFF6D
-:107AD0003C010800A4233FD2316A00403C01080069
-:107AE000A4203FC83C010800A4203FC4114000026C
-:107AF00024A4000A24A4000B3091FFFF0E0001E72C
-:107B0000022020219206010B3C0C0800958C3FD2EC
-:107B1000004020210006698231A700010E00060105
-:107B20000187282100402021026028210E00060C38
-:107B3000024030210E0007A10040202116C000693C
-:107B4000004020219212010B3256004012C0000565
-:107B50003C0500FF8C93000034AEFFFF026E8024D2
-:107B6000AC9000000E0001FB022020213C0F080019
-:107B700091EF3FD831F10003122000163C1380082A
-:107B80008F8200543C09800835280080245F000162
-:107B9000AD1F003C3C0580088CB9000403E02021A7
-:107BA000033FC0231B000002AF9F00548CA40004BD
-:107BB0000E0006F8ACA400043C0780008CEB0074B7
-:107BC0003C04800834830080004B5021AC6A000CD8
-:107BD0003C138008367000800280202102A02821FA
-:107BE000A200006B0E00075D3C1480008F920054D1
-:107BF000368C0140AD92000C8F8600483C15100079
-:107C0000344D000624D60001AF9600488FBF002CEB
-:107C1000A18600128FB60028AD8D00148FB3001C12
-:107C2000AE9501788FB200188FB500248FB4002074
-:107C30008FB100148FB0001003E0000827BD0030A2
-:107C400034640980908F0008000F7600000E6E03E8
-:107C500005A00033347F090093F8001B241900109D
-:107C60003C010800A0393FD8331300021260FF67BF
-:107C70008F8600548F8200601446FF653C048000AC
-:107C80000E00007C000000003C0480083485008069
-:107C900090A8000924060016310300FF1066000DAD
-:107CA0000000000090AB00093C07080090E73FD8B7
-:107CB00024090008316400FF34EA00013C01080097
-:107CC000A02A3FD81089002F240C000A108C00280D
-:107CD0002402000C0E00007E000000000A00086074
-:107CE0008F8600540E0007B9024028210A0008AE12
-:107CF000004020213C0B8008356A00808D460054EE
-:107D00008CE9000C1120FF3DAF86005424070014BD
-:107D10003C010800A0273FD80A00085F3C0C800007
-:107D200090910008241200023C010800A0323FD8C4
-:107D3000323000201200000B241600018F86005400
-:107D40000A0008602411000837F800808F0200380C
-:107D5000AFE200048FF90004AF19003C0A00086C80
-:107D60003C0780008F8600540A000860241100043C
-:107D7000A0A200090E00007E000000000A000860BA
-:107D80008F860054240200140A00093AA0A20009B8
-:107D900027BDFFE8AFB000103C108000AFBF00145B
-:107DA00036020100904400090E00075D2405000121
-:107DB0003C0480089099000E34830080909F000F4F
-:107DC000906F00269089000A33F800FF00196E00BA
-:107DD0000018740031EC00FF01AE5025000C5A0071
-:107DE000014B3825312800FF36030140344560003F
-:107DF00000E830252402FF813C041000AC66000C32
-:107E00008FBF0014AC650014A0620012AE040178AC
-:107E10008FB0001003E0000827BD001827BDFFE861
-:107E2000308400FFAFBF00100E00075D30A500FFDB
-:107E30003C05800034A40140344700402406FF92F2
-:107E4000AC870014A08600128F8300548FBF0010EF
-:107E50003C02100027BD0018AC83000C03E00008B2
-:107E6000ACA2017827BDFFD8AFB00010308400FF6E
-:107E700030B000FF3C058000AFB10014AFBF002060
-:107E8000AFB3001CAFB20018000410C234A601004A
-:107E900032030002305100011460000790D2000943
-:107EA0003C098008353300809268000531070008DE
-:107EB00010E0000C308A0010024020210E000783E1
-:107EC00002202821240200018FBF00208FB3001C54
-:107ED0008FB200188FB100148FB0001003E00008BB
-:107EE00027BD00281540003434A50A008CB80024B2
-:107EF0008CAF0008130F004B000038213C0D8008A8
-:107F000035B30080926C006824060002318B00FFBC
-:107F1000116600843C06800034C201009263004C6C
-:107F200090590009307F00FF53F900043213007CA0
-:107F300010E00069000000003213007C5660005C15
-:107F40000240202116200009320D00013C0C800067
-:107F500035840100358B0A008D6500248C86000471
-:107F600014A6FFD900001021320D000111A0000E4F
-:107F7000024020213C188000371001008E0F000CB9
-:107F80008F8E005011EE0008000000000E00084324
-:107F9000022028218E19000C3C1F800837F0008039
-:107FA000AE190050024020210E0007710220282146
-:107FB0000A00098F240200013C0508008CA500641A
-:107FC00024A400013C010800AC2400641600000D4C
-:107FD00000000000022028210E000771024020212D
-:107FE000926E0068240C000231CD00FF11AC00221B
-:107FF000024020210E000941000000000A00098F04
-:10800000240200010E00007024040001926B002580
-:10801000020B30250E00007EA26600250A0009D35F
-:10802000022028218E6200188CDF00048CB9002405
-:1080300000021E0217F9FFB13065007F9268004C04
-:10804000264400013093007F12650040310300FF99
-:108050001464FFAB3C0D80082647000130F1007F1F
-:1080600030E200FF1225000B2407000100409021A0
-:108070000A00099C24110001240500040E000732A7
-:10808000240600010E000941000000000A00098FCB
-:10809000240200012405FF8002452024008590264B
-:1080A000324200FF004090210A00099C2411000187
-:1080B0000E000843022028213207003010E0FFA103
-:1080C00032100082024020210E0007830220282166
-:1080D0000A00098F240200018E6900180240202145
-:1080E00002202821012640250E000964AE680018F0
-:1080F0009264004C24050003240600010E000732A0
-:10810000308400FF0E0000702404000192710025ED
-:10811000021150250E00007EA26A00250A00098F78
-:10812000240200018E6F00183C18800002402021BC
-:1081300001F87025022028210E000771AE6E00188C
-:108140009264004C0A000A1B24050004324A008095
-:10815000394900801469FF6A3C0D80080A0009F45F
-:108160002647000127BDFFC0AFB000183C108000BB
-:10817000AFBF0038AFB70034AFB60030AFB5002C9A
-:10818000AFB40028AFB30024AFB200200E0005BE8C
-:10819000AFB1001C360201009045000B0E000976BD
-:1081A00090440008144000E78FBF00383C08800866
-:1081B00035070080A0E0006B3606098090C50000FE
-:1081C000240300503C17080026F73F9030A400FF1E
-:1081D0003C13080026733FA0108300033C1080006E
-:1081E0000000B82100009821241F00103611010062
-:1081F00036120A00361509808E5800248E34000489
-:108200008EAF00208F8C00543C010800A03F3FD867
-:1082100036190A80972B002C8EF60000932A00183E
-:108220000298702301EC68233C010800AC2E3FB497
-:108230003C010800AC2D3FB83C010800AC2C3FDCF1
-:10824000A78B005802C0F809315400FF30490002E2
-:10825000152000E930420001504000C49227000977
-:1082600092A9000831280008150000022415000317
-:108270000000A8213C0A80003543090035440A006B
-:108280008C8D00249072001190700012907F00116C
-:10829000325900FF321100FF02B110210002C080EC
-:1082A00033EF00FF0319B021028F702102D4602147
-:1082B00025CB00103C010800A4363FCE3C0108004D
-:1082C000AC2D3FE03C010800A42C3FD03C0108004D
-:1082D000A42B3FCC355601003554098035510E0092
-:1082E0008F8700548F89005C8E850020240800064B
-:1082F000012730233C010800AC283FD400A72823E5
-:1083000004C000B50000902104A000B300C5502BAC
-:10831000114000B5000000003C010800AC263FB849
-:108320008E6200000040F8090000000030460002A4
-:1083300014C0007400408021304B000155600011D2
-:108340008E6200043C0D08008DAD3FBC3C0EC000A9
-:108350003C04800001AE6025AE2C00008C9800002B
-:10836000330F000811E0FFFD00000000963F0008F9
-:1083700024120001A79F00408E390004AF990038F5
-:108380008E6200040040F80900000000020280250F
-:1083900032030002146000B3000000003C09080032
-:1083A00095293FC43C06080094C63FD03C0A08000B
-:1083B000954A3FC63C0708008CE73FBC0126702168
-:1083C0003C0308008C633FE03C08080095083FDA56
-:1083D00001CA20218ED9000C00E92821249F000227
-:1083E00000A878210067C02133E4FFFFAF99005057
-:1083F0003C010800AC383FE03C010800A42F3FC816
-:108400003C010800A42E3FD20E0001E7000000004E
-:108410008F8D0048004020213C010800A02D3FD94D
-:108420008E62000825AC0001AF8C00480040F809BE
-:10843000000000008F85005402A030210E00060CC1
-:10844000004020210E0007A1004020218E6B000C6F
-:108450000160F809004020213C0A0800954A3FD2FB
-:108460003C06080094C63FC6014648212528000264
-:108470000E0001FB3104FFFF3C0508008CA53FB452
-:108480003C0708008CE73FBC00A720233C01080004
-:10849000AC243FB414800006000000003C02080039
-:1084A0008C423FD4344B00403C010800AC2B3FD4FD
-:1084B000124000438F8E00448E2D00108F92004496
-:1084C000AE4D00208E2C0018AE4C00243C04080059
-:1084D00094843FC80E0006FA000000008F9F0054ED
-:1084E0008E6700103C010800AC3F3FDC00E0F8095B
-:1084F000000000003C1908008F393FB41720FF79B5
-:108500008F870054979300583C11800E321601005B
-:108510000E000729A633002C16C0004532030010B8
-:108520005460004C8EE50004320800405500001DE8
-:108530008EF000088EE4000C0080F80900000000B6
-:108540008FBF00388FB700348FB600308FB5002C46
-:108550008FB400288FB300248FB200208FB1001C8D
-:108560008FB0001803E0000827BD00408F86003C54
-:1085700036110E0000072E0000A62025AE04008054
-:108580008E4300208E500024AFA30010AE230014B1
-:108590008FB20010AE320010AE30001C0A000A7517
-:1085A000AE3000180200F809000000008EE4000C54
-:1085B0000080F809000000000A000B2E8FBF003871
-:1085C00024180001240F0001A5C00020A5D8002216
-:1085D0000A000B10ADCF00243C010800AC203FB8CE
-:1085E0000A000AA68E6200003C010800AC253FB8D4
-:1085F0000A000AA68E620000922400090E0007718C
-:10860000000028218FBF00388FB700348FB60030AC
-:108610008FB5002C8FB400288FB300248FB20020B8
-:108620008FB1001C8FB0001803E0000827BD004088
-:108630003C14800092950109000028210E00084397
-:1086400032A400FF320300105060FFB8320800402F
-:108650008EE5000400A0F809000000000A000B28C5
-:10866000320800405240FFA8979300588E340014FF
-:108670008F930044AE7400208E35001CAE7500242C
-:108680000A000B1F979300588F820014000421806A
-:1086900003E00008008210213C07800834E20080DB
-:1086A0009043006900804021106000093C040100F3
-:1086B0003C0708008CE73FDC8F83003000E3202379
-:1086C000048000089389001C14E3000301002021AA
-:1086D00003E00008008010213C04010003E00008D2
-:1086E000008010211120000B006738233C0D800012
-:1086F00035AC0980918B007C316A0002114000206A
-:108700002409003400E9702B15C0FFF1010020217D
-:1087100000E938232403FFFC00A3C82400E3C0249D
-:1087200000F9782B15E0FFEA0308202130C400038C
-:108730000004102314C0001430490003000030214D
-:1087400000A9782101E6702100EE682B11A0FFE05E
-:108750003C0401002D3800010006C82B010548210A
-:108760000319382414E0FFDA2524FFFC2402FFFC5F
-:1087700000A218240068202103E0000800801021D6
-:108780000A000B9E240900303C0C800035860980CD
-:1087900090CB007C316A00041540FFE924060004F8
-:1087A0000A000BAD000030213C0308008C63005C24
-:1087B0008F82001827BDFFE0AFBF0018AFB10014D3
-:1087C00010620005AFB00010000329C024A402808D
-:1087D000AF840014AF8300183C10800036020A00FA
-:1087E00094450032361101000E000B7F30A43FFF8C
-:1087F0008E240000241FFF803C1100800082C021D5
-:10880000031F60243309007F000CC9400329402561
-:10881000330E0078362F00033C0D1000010D50255B
-:1088200001CF5825AE0C002836080980AE0C080C84
-:10883000AE0B082CAE0A0830910300693C06800C90
-:108840000126382110600006AF8700348D09003CF6
-:108850008D03006C0123382318E000820000000023
-:108860003C0B8008356A00803C108000A140006904
-:10887000360609808CC200383C06800034C50A00E8
-:1088800090A8003C310C00201180001AAF8200300B
-:10889000240D00013C0E800035D10A00A38D001C80
-:1088A000AF8000248E2400248F850024240D00082E
-:1088B000AF800020AF8000283C010800A42D3FC6F7
-:1088C0003C010800A4203FDA0E000B830000302199
-:1088D0009228003C8FBF00188FB100148FB0001099
-:1088E00000086142AF82002C27BD002003E0000891
-:1088F0003182000190B80032240E0001330F00FFD6
-:10890000000F2182108E004124190002109900648A
-:1089100034C40AC03C03800034640A008C8F0024F5
-:1089200015E0001E34660900909F003024180005F1
-:1089300033F9003F1338004E240300018F860020D6
-:10894000A383001CAF860028AF8600243C0E800065
-:1089500035D10A008E2400248F850024240D0008C0
-:108960003C010800A42D3FC63C010800A4203FDACA
-:108970000E000B83000000009228003C8FBF0018FF
-:108980008FB100148FB0001000086142AF82002C3C
-:1089900027BD002003E00008318200018C8A000816
-:1089A0008C8B00248CD000643C0E800035D10A00F2
-:1089B000014B2823AF900024A380001CAF85002822
-:1089C0008E2400248F8600208F850024240D00082B
-:1089D0003C010800A42D3FC63C010800A4203FDA5A
-:1089E0000E000B83000000009228003C8FBF00188F
-:1089F0008FB100148FB0001000086142AF82002CCC
-:108A000027BD002003E000083182000190A2003061
-:108A10003051003F5224002834C50AC08CB00024D5
-:108A20001600002234CB09008CA600483C0A7FFFC8
-:108A30003545FFFF00C510243C0E8000AF820020AA
-:108A400035C509008F8800208CAD0060010D602BBA
-:108A500015800002010020218CA400600A000C2275
-:108A6000AF8400208D02006C0A000BFC3C068000E5
-:108A70008C8200488F8600203C097FFF3527FFFF4E
-:108A8000004788243C04800824030001AF9100289B
-:108A9000AC80006CA383001C0A000C30AF8600245D
-:108AA0008C9F00140A000C22AF9F00208D6200688A
-:108AB0000A000C6C3C0E800034C409808C89007064
-:108AC0008CA300140123382B10E0000400000000E8
-:108AD0008C8200700A000C6C3C0E80008CA200148A
-:108AE0000A000C6C3C0E80008F85002427BDFFE03F
-:108AF000AFBF0018AFB1001414A00008AFB0001051
-:108B00003C04800034870A0090E60030240200050F
-:108B100030C3003F106200B9348409008F910020F7
-:108B200000A080213C048000348E0A008DCD00041A
-:108B30003C0608008CC63FB831A73FFF00E6602B1B
-:108B40005580000100E03021938F001C11E0007877
-:108B500000D0282B349F098093F9007C3338000221
-:108B6000130000792403003400C3102B144000D9F3
-:108B70000000000000C3302300D0282B3C01080077
-:108B8000A4233FC414A0006E020018213C04080076
-:108B90008C843FB40064402B55000001006020210C
-:108BA0003C05800034A90A00912A003C3C010800E1
-:108BB000AC243FBC31430020146000030000482176
-:108BC00034AB0E008D6900188F88002C0128202BF3
-:108BD0001080005F000000003C0508008CA53FBC31
-:108BE00000A96821010D602B1180005C00B0702B82
-:108BF0000109382300E028213C010800AC273FBCD4
-:108C000012000003240AFFFC10B0008D3224000380
-:108C100000AA18243C010800A4203FDA3C01080007
-:108C2000AC233FBC006028218F840024120400067E
-:108C30003C0B80088D6C006C02002021AF9100205D
-:108C400025900001AD70006C8F8D00280085882371
-:108C5000AF91002401A52023AF8400281220000238
-:108C600024070018240700103C18800837060080ED
-:108C700090CF00683C010800A0273FD824070001DE
-:108C800031EE00FF11C700470000000014800018FB
-:108C9000000028213C06800034D1098034CD010039
-:108CA00091A600098E2C001824C40001000C860235
-:108CB0003205007F308B007F1165007F2407FF8025
-:108CC0003C19800837290080A124004C3C0808008A
-:108CD0008D083FD4241800023C010800A038401938
-:108CE000350F00083C010800AC2F3FD424050010CC
-:108CF0003C02800034440A009083003C307F002016
-:108D000013E0000500A02021240A00013C01080016
-:108D1000AC2A3FBC34A400018FBF00188FB10014EF
-:108D20008FB000100080102103E0000827BD002054
-:108D30003C010800A4203FC410A0FF9402001821A9
-:108D40000A000CC000C018210A000CB72403003030
-:108D50003C0508008CA53FBC00B0702B11C0FFA8DB
-:108D6000000000003C19080097393FC40325C021CA
-:108D70000307782B11E000072CAA00043C036000D5
-:108D80008C625404305F003F17E0FFE3240400428C
-:108D90002CAA00041140FF9A240400420A000D246A
-:108DA0008FBF00181528FFB9000000008CCA0018FA
-:108DB0003C1F800024020002015F1825ACC300188C
-:108DC00037F90A00A0C200689329003C240400047B
-:108DD00000A01021312800203C010800A0244019E7
-:108DE0001100000224050010240200013C010800CB
-:108DF000AC223FB40A000D1A3C0280008F88002884
-:108E00008C8900600109282B14A000020100882130
-:108E10008C9100603C048000348B0E008D6400183F
-:108E2000240A00010220282102203021A38A001CEC
-:108E30000E000B83022080210A000CA6AF82002CBA
-:108E40000004582312200007316400033C0E800008
-:108E500035C7098090ED007C31AC00041580001905
-:108E6000248F00043C010800A4243FDA3C1F0800C2
-:108E700097FF3FDA03E5C82100D9C02B1300FF6B31
-:108E80008F8400242CA6000514C0FFA324040042F4
-:108E900030A200031440000200A2182324A3FFFC08
-:108EA0003C010800AC233FBC3C010800A4203FDA91
-:108EB0000A000CE70060282100C770240A000D0D8D
-:108EC00001C720263C010800A42F3FDA0A000D78D4
-:108ED000000000003C010800AC203FBC0A000D234C
-:108EE000240400428F8300283C05800034AA0A0035
-:108EF0001460000600001021914700302406000590
-:108F000030E400FF108600030000000003E00008CA
-:108F100000000000914B0048316900FF000941C288
-:108F20001500FFFA3C0680083C04080094843FC406
-:108F30003C0308008C633FDC3C1908008F393FBCC0
-:108F40003C0F080095EF3FDA0064C0218CCD00048F
-:108F50000319702101CF602134AB0E00018D28234D
-:108F600018A0001D00000000914F004C8F8C0034B1
-:108F7000956D001031EE00FF8D89000401AE3023A5
-:108F80008D8A000030CEFFFF000E29000125C82188
-:108F900000003821014720210325182B0083C02120
-:108FA000AD990004AD980000918F000A01CF6821AF
-:108FB000A18D000A956500128F8A0034A54500082E
-:108FC000954B003825690001A54900389148000DEE
-:108FD00035070008A147000D03E00008000000006D
-:108FE00027BDFFD8AFB000189388001C8FB00014C5
-:108FF0003C0A80003C197FFF8F8700243738FFFF31
-:10900000AFBF0020AFB1001C355F0A000218182462
-:1090100093EB003C00087FC03C02BFFF006F60255F
-:109020002CF000013449FFFF3C1F08008FFF3FDC9C
-:109030008F9900303C18080097183FD20189782496
-:10904000001047803C07EFFF3C05F0FF01E81825C2
-:109050003C1180003169002034E2FFFF34ADFFFF96
-:10906000362E098027A500102406000203F960238C
-:10907000270B0002354A0E00006218240080802170
-:1090800015200002000040218D48001CA7AB0012F3
-:10909000058000392407000030E800FF00083F0089
-:1090A000006758253C028008AFAB0014344F0080A5
-:1090B00091EA00683C08080091083FD93C09DFFFAD
-:1090C000352CFFFF000AF82B3C02080094423FCCED
-:1090D000A3A80011016CC024001FCF40031918255C
-:1090E0008FA70010AFA300143C0C0800918C3FDB4D
-:1090F000A7A200168FAB001400ED48243C0F01001E
-:109100003C0A0FFF012FC82531980003355FFFFF90
-:10911000016D40243C027000033F382400181E00FB
-:1091200000E2482501037825AFAF0014AFA9001075
-:1091300091CC007C0E000092A3AC0015362D0A00E5
-:1091400091A6003C30C400201080000626020008D2
-:109150003C11080096313FC8262EFFFF3C01080055
-:10916000A42E3FC88FBF00208FB1001C8FB0001805
-:1091700003E0000827BD00288F8B002C010B502B2B
-:109180005540FFC5240700010A000E0430E800FF27
-:109190009383001C3C02800027BDFFD834480A009E
-:1091A00000805021AFBF002034460AC001002821B2
-:1091B0001060000E3444098091070030240B000534
-:1091C0008F89002030EC003F118B000B000038210C
-:1091D000AFA900103C0B80088D69006CAFAA001885
-:1091E0000E00015AAFA90014A380001C8FBF0020FD
-:1091F00003E0000827BD00288D1F00483C18080028
-:109200008F183FBC8F9900283C027FFF8D080044D7
-:109210003443FFFFAFA900103C0B80088D69006C40
-:1092200003E370240319782101CF682301A83821B2
-:10923000AFAA00180E00015AAFA900140A000E5878
-:10924000A380001C3C05800034A60A0090C7003CA7
-:109250003C06080094C63FDA3C0208008C423FD42A
-:1092600030E30020000624001060001E0044382572
-:109270003C0880083505008090A300680000482164
-:109280002408000100002821240400013C0680007D
-:109290008CCD017805A0FFFE34CF0140ADE8000879
-:1092A0003C0208008C423FDCA5E50004A5E4000672
-:1092B000ADE2000C3C04080090843FD93C038008D8
-:1092C00034790080A1E40012ADE70014A5E900188C
-:1092D0009338004C3C0E1000A1F8002D03E000086C
-:1092E000ACCE017834A90E008D28001C3C0C08007F
-:1092F0008D8C3FBC952B0016952A001401864821C1
-:109300003164FFFF0A000E803145FFFF3C048000FE
-:1093100034830A009065003C30A200201040001900
-:1093200034870E0000004021000038210000202179
-:109330003C0680008CC901780520FFFE34CA01403C
-:1093400034CF010091EB0009AD4800083C0E080045
-:109350008DCE3FDC240DFF91240C00403C08100012
-:10936000A5440004A5470006AD4E000CA14D001217
-:10937000AD4C0014A5400018A14B002D03E00008DF
-:10938000ACC801788CE8001894E6001294E4001050
-:1093900030C7FFFF0A000EA93084FFFF3C048000A5
-:1093A00034830A009065003C30A200201040002762
-:1093B00027BDFFF82409000100003821240800011E
-:1093C0003C0680008CCA01780540FFFE3C0280FF0D
-:1093D00034C40100908D00093C0C0800918C4019A8
-:1093E000A3AD00038FAB00003185007F3459FFFF30
-:1093F00001665025AFAA00009083000AA3A00002D6
-:1094000000057E00A3A300018FB8000034CB01400B
-:10941000240C30000319702401CF6825AD6D000CB9
-:1094200027BD0008AD6C0014A5600018AD690008E8
-:10943000A56700042409FF80A56800063C08100009
-:10944000A169001203E00008ACC8017834870E005F
-:109450008CE9001894E6001294E4001030C8FFFF75
-:109460000A000ECD3087FFFF27BDFFE0AFB100142B
-:109470003C118000AFB00010AFBF001836380A00B2
-:10948000970F0032363001000E000B7F31E43FFFB2
-:109490008E0E0000240DFF803C04200001C25821E4
-:1094A000016D6024000C4940316A007F012A40258B
-:1094B000010438253C048008AE270830348600803B
-:1094C00090C500682403000230A200FF104300048E
-:1094D0008F9F00208F990024AC9F0068AC99006496
-:1094E0008FBF00188FB100148FB0001003E0000888
-:1094F00027BD00203C0A0800254A3A803C090800A4
-:1095000025293B103C08080025082F1C3C070800B3
-:1095100024E73BDC3C06080024C639043C0508006F
-:1095200024A536583C0408002484325C3C0308001F
-:10953000246339B83C020800244237543C01080037
-:10954000AC2A3F983C010800AC293F943C0108003C
-:10955000AC283F903C010800AC273F9C3C01080030
-:10956000AC263FAC3C010800AC253FA43C01080000
-:10957000AC243FA03C010800AC233FB03C010800F4
-:0C958000AC223FA803E00008000000003F
-:04958C008000094012
-:109590008000090080080100800800808008000029
-:1095A000800E0000800800808008000080000A8093
-:0C95B00080000A00800009808000090093
-:00000001FF
-/*
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
diff --git a/firmware/bnx2/bnx2-rv2p-06-6.0.15.fw.ihex b/firmware/bnx2/bnx2-rv2p-06-6.0.15.fw.ihex
deleted file mode 100644
index dcc443e210f5..000000000000
--- a/firmware/bnx2/bnx2-rv2p-06-6.0.15.fw.ihex
+++ /dev/null
@@ -1,366 +0,0 @@
-:1000000000000000000008F800000058000000098F
-:1000100000000000000000000000000000000000E0
-:1000200000000000000000000000000000000000D0
-:1000300000000CF000000950000000050000000066
-:1000400000000000000000000000000000000000B0
-:080050000000000000000000A8
-:0800580000000010B180000659
-:100060000000001F0106000F000000080500FFFF50
-:10007000000000180002000000000008050000FF5A
-:10008000000000180002000000000008AC000001A1
-:1000900000000008078000000000000C2F80000115
-:1000A000000000002B000000000000002B8000007A
-:1000B0000000001091E1000200000008AC00000107
-:1000C00000000010203F003B00000010213F000313
-:1000D0000000001020BF0015000000188000FFFD88
-:1000E0000000000C1F800002000000188000FFF9D3
-:1000F00000000008B1000001000000082C8000B0E2
-:10010000000000082D000008000000082D800001FC
-:10011000000000188000003C0000000B2FDF0002F0
-:100120000000000C1F800002000000002C070000EF
-:100130000000001091DE0000000000188000FFEFBA
-:100140000000000B2FDF00020000000C1F800000E9
-:10015000000000002C0700000000001091DE0000ED
-:10016000000000188000FFEA0000000C1F80000261
-:10017000000000188000FFE80000000802240025AD
-:1001800000000018000400000000001880000000BB
-:10019000000000188000001B0000001880000042D2
-:1001A000000000188000000000000018800000001F
-:1001B000000000188000000000000018800000000F
-:1001C00000000018800000000000001880000000FF
-:1001D00000000018800000000000001880000000EF
-:1001E00000000018800000000000001880000000DF
-:1001F000000000188000008E000000188000000041
-:1002000000000018800000000000001880000000BE
-:1002100000000018800000000000001880000000AE
-:10022000000000188000000000000018800000009E
-:10023000000000188000008D00000018800000B74A
-:10024000000000188000008400000018800000DA20
-:10025000000000188000002B000000188000000043
-:10026000000000188000006B0000001091D4000016
-:100270000000000C298000010000000C1F8000011C
-:10028000000000082A0000020000000807800000AB
-:10029000000000188000FFC4000000080380010077
-:1002A00000000010B73C0E000000001880000000A5
-:1002B000000000180002000000000000068200009C
-:1002C00000000010B18F000400000010B18F140373
-:1002D000000000082A0000010000001091D4000076
-:1002E000000000000780140000000018000D00004E
-:1002F00000000000050200000000001091DE000078
-:1003000000000018000A0000000000000682000043
-:100310000000001091DE0000000000090561FFFFF1
-:1003200000000010918A00020000000830E1FFFF89
-:10033000000000188000FFA9000000010561140002
-:1003400000000010918A000200000008B0E10001E6
-:1003500000000018000D00000000000006820000F0
-:100360000000001091DE0000000000090562FFFFA0
-:1003700000000010918A0002000000083162FFFFB7
-:10038000000000188000FF9F0000000105621400BB
-:1003900000000010918A000200000008B162000114
-:1003A00000000018000D000000000010B1A0B01304
-:1003B0000000000B2FDF0002000000002C200000D6
-:1003C000000000082C800000000000082D00000044
-:1003D0000000001091D40000000000080500005546
-:1003E000000000188000FFDB000000082D80011CC9
-:1003F00000000010001F0000000000188000FFE255
-:100400000000000F476000080000000F060E00010A
-:10041000000000000F580000000000000A64000007
-:10042000000000000AE50000000000090B66FFFF65
-:10043000000000000D6100000000001880000015A1
-:100440000000000F476000080000000B2FDF0002D3
-:10045000000000082C800000000000082D000000B3
-:100460000000001091D40000000000082D80011C45
-:100470000000000F060E000100000010001F000029
-:10048000000000000F580000000000188000FFD09E
-:10049000000000000A640000000000000AE50000FF
-:1004A000000000090B66FFFF000000000D61000066
-:1004B00000000000026200000000000002E00000F6
-:1004C0000000000B2FDF00020000000030050000DC
-:1004D000000000003104000000000000309A00001D
-:1004E000000000100060000A00000008051600016E
-:1004F00000000010BA9A140300000000030000007E
-:100500000000001880000006000000188000FF6C4A
-:1005100000000010B60614040000000803060001E5
-:10052000000000082A000001000000188000FF7190
-:10053000000000000C961800000000090C99FFFF55
-:1005400000000004CC99340000000010BA992C027D
-:10055000000000080F8000000000000C298000014E
-:100560000000000C295200010000000C295200007C
-:100570000000000822800002000000080200000EB7
-:10058000000000080280001A00000010B1C40A0236
-:1005900000000008020000030000000C1F800001A2
-:1005A000000000002ADF0000000000002A00080010
-:1005B000000000188000FF600000000B2FDF000229
-:1005C0000000001091D40000000000082A00000183
-:1005D000000000002C2000000000001091D400005A
-:1005E000000000082C800000000000082D00000022
-:1005F000000000082D80011C000000188000FF9FF3
-:10060000000000082C800006000000082D000006F5
-:1006100000000000308000000000000031000000F9
-:10062000000000082D8000060000000C2980000159
-:100630000000000C1F8000010000001091DE00008F
-:10064000000000002ADF0000000000082A0000105F
-:100650000000000807800000000000188000FF4B29
-:100660000000001091D4000000000008050000AA5E
-:10067000000000188000FF890000000C29800001A4
-:100680000000000C1F800001000000082A00000983
-:10069000000000188000FF440000001091D400000A
-:1006A0000000000805000055000000188000FF82CF
-:1006B0000000001091A0B00200000010B1E6620737
-:1006C0000000000B2FDF0002000000002C310000B2
-:1006D000000000092CB1007F000000082CD90000A8
-:1006E000000000082D000000000000082D80010D12
-:1006F00000000010B1A8000600000010205F0000FC
-:10070000000000002C200000000000002CA70000CA
-:10071000000000082D000010000000082D800108D6
-:10072000000000188000FF7A00000010B1A6001041
-:1007300000000010001F00000000000F0F30000735
-:10074000000000000A600000000000000AE1000054
-:100750000000000F4B620008000000090B1600FFAC
-:10076000000000000D620000000000090D1A00FFEB
-:1007700000000010073000030000000C0D1A0008F4
-:100780000000000C0B1600080000000F4CE30018DE
-:10079000000000000C992C0000000004CC993400EB
-:1007A000000000080F8000000000000C29800001FC
-:1007B0000000000033310000000000082200001695
-:1007C000000000002ADF0000000000082A00000CE2
-:1007D00000000010009F0000000000002C2000001E
-:1007E0000000000C1F800001000000188000FF19AD
-:1007F0000000001091D4000000000008050000AACD
-:10080000000000188000FF570000000F472200087A
-:1008100000000009070E000F00000008070E000886
-:1008200000000008028000010000000702851C0093
-:1008300000000008828500010000000002854C00D5
-:100840000000000742851C0000000003C3AA5200FC
-:100850000000000003B10E00000000074B071C0061
-:100860000000000F0F3000070000000F0A96000381
-:10087000000000000A955C00000000004A005A00D9
-:10088000000000000C960A00000000090C99FFFF10
-:10089000000000080D00FFFF00000010BA992C02B4
-:1008A000000000080F80000500000010B1A800083B
-:1008B00000000010205F00000000000B2FDF00028E
-:1008C000000000002C200000000000002CA7000009
-:1008D000000000082D000010000000082D80010815
-:1008E000000000188000FF420000000C2980000179
-:1008F00000000010001F00000000000C1F8000011D
-:10090000000000002ADF0000000000082A00000D9F
-:10091000000000188000FEF40000001091D40000D8
-:100920000000000805000055000000188000FF329C
-:100930000000000C298000010000000C1F80000155
-:10094000000000082A000007000000188000FEEDEB
-:1009500000000010B18000040000001F0106000F1D
-:1009600000000008050000FF000000180002000061
-:10097000000000002A00000000000010B1D40000B8
-:100980000000001091DE0000000000102053000065
-:1009900000000010001F0000000000002F80AA00CF
-:1009A0000000000C29800001000000080254000E25
-:1009B000000000002C400000000000000F4000007C
-:1009C0000000001800040000000000188000001162
-:1009D000000000188000001200000018800000389D
-:1009E00000000018800000DF00000018800000DE1A
-:1009F00000000018800000DD00000018800000DD0D
-:100A0000000000188000000000000018800000F6C0
-:100A100000000018800000D90000001880000000CD
-:100A200000000018800000FA000000188000014853
-:100A3000000000188000005A00000018800000C468
-:100A400000000018800000C500000018800000D2DF
-:100A5000000000002A000000000000188000FFE4F1
-:100A6000000000002A0000000000000C29800000A7
-:100A7000000000188000FFE10000001800020000E4
-:100A8000000000000502000000000010B99A2C21AF
-:100A900000000010205F0000000000002C1E00007D
-:100AA000000000082C800006000000082D00000651
-:100AB000000000082D80010200000000000000007E
-:100AC0000000001091DE0000000000000D61000039
-:100AD00000000018000A00000000000005020000ED
-:100AE00000000010B99A2C1600000010205F0000D2
-:100AF0000000000009D80000000000002C1E0000CB
-:100B0000000000082C8000B2000000082D00000A40
-:100B1000000000082D80010200000000000000001D
-:100B20000000001091DE0000000000000D620000D7
-:100B3000000000002C13000000000018000A000054
-:100B4000000000000502000000000010B99A2C0906
-:100B500000000010205F0000000000002C1E0000BC
-:100B6000000000082C800006000000082D00006A2C
-:100B7000000000082D8001020000000000000000BD
-:100B80000000001091DE0000000000000D7A00005F
-:100B900000000018000A0000000000002A00000009
-:100BA0000000000822000001000000000D610000AC
-:100BB0000000001021C2002400000010B1C6000295
-:100BC00000000010234200A2000000090B66FFFF96
-:100BD00000000010BA9A2C20000000000A640000F7
-:100BE000000000000AE50000000000000C0000000A
-:100BF000000000000B800000000000080CC600127E
-:100C0000000000188000FFD0000000080F800003E3
-:100C1000000000000000000000000010009F000025
-:100C2000000000082711001200000000669000007C
-:100C300000000010B198000300000010001F000029
-:100C4000000000080F8000040000000822000003DC
-:100C5000000000082C80000C000000082D00000C93
-:100C600000000010009F00000000001091C6000569
-:100C700000000010001F000000000010BA9A2C03B2
-:100C8000000000080F800004000000188000FFFD35
-:100C900000000000259600000000000C29800000E4
-:100CA0000000000032140000000000003295000037
-:100CB0000000000573662C000000000031E32E00E8
-:100CC000000000082D800010000000188000FF9632
-:100CD00000000000230000000000000925E6FFFFDF
-:100CE000000000082200000B0000000C6952000008
-:100CF0000000000C29800000000000188000FF9018
-:100D0000000000002A000000000000082C800040C5
-:100D1000000000082D000020000000082D80011CAC
-:100D200000000008220000010000001091DE000019
-:100D30000000000F42EA001000000010004F000405
-:100D400000000010B746920000000008024900129F
-:100D500000000010B5840A00000000000D610000D2
-:100D600000000010BA663457000000088305001226
-:100D700000000010004F00020000000003490000C6
-:100D80000000000183068C000000000083C60C00F8
-:100D900000000010B1870013000000000B6E00007F
-:100DA000000000090569FFFF00000010918A0002A1
-:100DB0000000000834E9FFFF000000188000FF7504
-:100DC000000000010569140000000010918A000273
-:100DD00000000008B4E9000100000010BAE92C4846
-:100DE0000000000086692C000000000002000000E6
-:100DF0000000000902EAFFFF00000010000C0002E2
-:100E00000000000002040A000000000F460C000170
-:100E10000000000F0285000100000010918C01FC11
-:100E200000000010B7040E3F000000000D6100003C
-:100E3000000000000A640000000000000AE5000055
-:100E4000000000090B66FFFF000000000C0000001E
-:100E5000000000000B800000000000080C8600125B
-:100E6000000000080F8000030000000C2952000061
-:100E700000000010009F0000000000082711001271
-:100E80000000000066900000000000002306000043
-:100E900000000010B198000500000010001F0000C5
-:100EA000000000080F8000040000000000000000A7
-:100EB00000000010001F00000000000032140000BD
-:100EC00000000000329500000000000031E32E0019
-:100ED0000000000573662C0000000000259600004D
-:100EE00000000010B18700160000000C29800000EF
-:100EF0000000000F0F6B0007000000000D690000EC
-:100F0000000000000A6C0000000000000AED000074
-:100F1000000000000B6E0000000000000B800000CD
-:100F2000000000000C870000000000080F80000394
-:100F300000000010205300000000000C6952000166
-:100F400000000010001F00000000000022C58C00FF
-:100F500000000000231B000000000000271100001B
-:100F6000000000002690000000000010B8170E03DB
-:100F70000000000C29800000000000188000FFF62F
-:100F800000000010B1980002000000080F8000046B
-:100F9000000000082200001A000000082C80000C4D
-:100FA000000000082D00000C000000082D8000103B
-:100FB00000000010001F0000000000000D6E000087
-:100FC00000000003E7CF34000000000C298000007F
-:100FD0000000001091DE000000000010B187000743
-:100FE00000000000361400000000000036950000EC
-:100FF0000000000037160000000000082C800050A0
-:10100000000000082D000030000000082D80000CBA
-:10101000000000188000FF2D0000000023000000E9
-:101020000000000925E6FFFF000000000B6E000035
-:1010300000000003E7CF2C00000000082200001B86
-:101040000000000C695200000000000C2980000024
-:10105000000000188000FF25000000002A000000AA
-:10106000000000188000FF23000000002A0000009C
-:101070000000000C298000000000001091DE00003C
-:10108000000000082C80001A000000082D00001A43
-:101090000000000573660000000000082D800002BB
-:1010A00000000000318000000000001091DE000010
-:1010B000000000082C80000C000000082D00000C2F
-:1010C000000000082D800004000000188000FF16BA
-:1010D0000000001880000000000000188000FF14CD
-:1010E000000000002A00000000000010001F0000A7
-:1010F000000000000F008000000000080F800007C3
-:10110000000000188000001B00000000280A0000FA
-:101110000000000005020000000000082200000995
-:1011200000000000290000000000000F65680010AA
-:1011300000000000248A000000000003F66C940008
-:1011400000000010B972A0040000000C73E7001941
-:101150000000000C21420004000000003CF80000E8
-:101160000000000C29800000000000102053000047
-:1011700000000008220000080000000C614200048A
-:1011800000000018000A0000000000000502000036
-:101190000000000C6142000000000010014200034A
-:1011A0000000000C33E7001D0000000C614200024B
-:1011B00000000018000A0000000000002A000000E3
-:1011C00000000010001F00000000000F0F47000784
-:1011D000000000080F8000080000000C29800000BB
-:1011E00000000010009F0000000000188000FEF2C8
-:1011F0000000000033510000000000002A00000041
-:1012000000000010B1C600230000000F0F500007BF
-:10121000000000000A600000000000000AE1000079
-:101220000000000F4B620008000000090B1600FFD1
-:101230000000000F4C620010000000000D62000072
-:10124000000000090D1A00FF000000100750000305
-:101250000000000C0D1A00080000000C0B1600081E
-:10126000000000000CC60000000000000B80000021
-:101270000000000006980000000000080F80000336
-:101280000000001006C200040000000C290000024B
-:1012900000000010264200020000000C295200034A
-:1012A000000000082200000100000010009F000064
-:1012B00000000000231B00000000000027111A009E
-:1012C00000000000669000000000000C29520000A1
-:1012D00000000010B19732090000000C29800000C6
-:1012E00000000000069800000000001020530000DD
-:1012F0000000000C295200030000000022C58C00F1
-:1013000000000010001F0000000000080F80000314
-:10131000000000188000FFF300000010B1C80013A7
-:1013200000000010B1C600030000000C298000007E
-:1013300000000010205300000000000C29520000A3
-:101340000000000C295200030000001006C2000239
-:101350000000000C295200020000000022C58C0091
-:1013600000000000276500000000000026E40000E7
-:10137000000000082200001600000010B1C60003A3
-:10138000000000002348000000000010B1800005AC
-:1013900000000000234800000000000C298000002D
-:1013A0000000000F0F50000700000018800000121E
-:1013B00000000008220000160000000C2980000038
-:1013C0000000000030140000000000003095000014
-:1013D0000000001007500003000000090B1600FF7A
-:1013E000000000090D1A00FF0000000F3116000870
-:1013F000000000003162340000000003F1623000A0
-:1014000000000010205F0000000000002C510000D0
-:10141000000000092CD1007F000000082CD900003A
-:10142000000000082D000000000000082D80000CC6
-:1014300000000000000000000000001091DE00002D
-:101440000000001005C20004000000080F80000723
-:10145000000000003300000000000010009F0000AA
-:10146000000000188000FEA3000000002A00000019
-:101470000000000F0F50000700000010B1C6002D43
-:101480000000000F4742000800000009070E000F8F
-:1014900000000008070E000800000010001F0000F8
-:1014A00000000008090000010000000709121C00EC
-:1014B00000000003CBCA9200000000000B97A200BE
-:1014C0000000000742171C00000000000B04000091
-:1014D0000000000F0A840003000000000A959C0031
-:1014E000000000004A009A0000000008821200017B
-:1014F000000000010C170800000000000C978C0091
-:101500000000000002180000000000080D00FFFFAE
-:10151000000000080F8000060000000C29000000F9
-:101520000000001006C200040000000C2952000256
-:1015300000000010264200020000000C29520003A7
-:10154000000000082200000100000010009F0000C1
-:1015500000000010B197320C00000000231B0000B7
-:101560000000000027110800000000006690000045
-:101570000000000C2980000000000000021800009C
-:1015800000000010205300000000000C295200034E
-:101590000000000022C5360000000010001F0000FF
-:1015A000000000080F800006000000188000FFF413
-:1015B00000000000231B00000000000027110800AD
-:1015C000000000006690000000000010B1C8000B91
-:1015D0000000000C298000000000001020530000D3
-:1015E0000000000C295200000000000C29520003EA
-:1015F0000000001006C200020000000C2952000288
-:101600000000000022C58C000000000027650000DB
-:101610000000000026E40000000000002348000055
-:1016200000000008220000170000000C29800000C4
-:1016300000000010001F0000000000188000FE687D
-:00000001FF
-/*
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
diff --git a/firmware/bnx2/bnx2-rv2p-09-6.0.17.fw.ihex b/firmware/bnx2/bnx2-rv2p-09-6.0.17.fw.ihex
deleted file mode 100644
index 435203d64305..000000000000
--- a/firmware/bnx2/bnx2-rv2p-09-6.0.17.fw.ihex
+++ /dev/null
@@ -1,392 +0,0 @@
-:1000000000000000000008F800000058000000098F
-:1000100000000000000000000000000000000000E0
-:1000200000000000000000000000000000000000D0
-:1000300000000E88000009500000000500000000CC
-:1000400000000000000000000000000000000000B0
-:080050000000000000000000A8
-:0800580000000010B180000659
-:100060000000001F05060011000000080500FFFF4A
-:10007000000000180002000000000008050000FF5A
-:10008000000000180002000000000008AC000001A1
-:1000900000000008078000000000000C2F80000115
-:1000A000000000002B000000000000002B8000007A
-:1000B0000000001091E1000200000008AC00000107
-:1000C00000000010203F003B00000010213F000313
-:1000D0000000001020BF0015000000188000FFFD88
-:1000E0000000000C1F800002000000188000FFF9D3
-:1000F00000000008B1000001000000082C80010C85
-:10010000000000082D000008000000082D800001FC
-:10011000000000188000003C0000000B2FDF0002F0
-:100120000000000C1F800002000000002C070000EF
-:100130000000001091DE0000000000188000FFEFBA
-:100140000000000B2FDF00020000000C1F800000E9
-:10015000000000002C0700000000001091DE0000ED
-:10016000000000188000FFEA0000000C1F80000261
-:10017000000000188000FFE80000000802240025AD
-:1001800000000018000400000000001880000000BB
-:10019000000000188000001B0000001880000042D2
-:1001A000000000188000000000000018800000001F
-:1001B000000000188000000000000018800000000F
-:1001C00000000018800000000000001880000000FF
-:1001D00000000018800000000000001880000000EF
-:1001E00000000018800000000000001880000000DF
-:1001F000000000188000008E000000188000000041
-:1002000000000018800000000000001880000000BE
-:1002100000000018800000000000001880000000AE
-:10022000000000188000000000000018800000009E
-:10023000000000188000008D00000018800000B74A
-:10024000000000188000008400000018800000DA20
-:10025000000000188000002B000000188000000043
-:10026000000000188000006B0000001091D4000016
-:100270000000000C298000010000000C1F8000011C
-:10028000000000082A0000020000000807800000AB
-:10029000000000188000FFC4000000080380010077
-:1002A00000000010B73C0E000000001880000000A5
-:1002B000000000180002000000000000068200009C
-:1002C00000000010B18F000400000010B18F140373
-:1002D000000000082A0000010000001091D4000076
-:1002E000000000000780140000000018000D00004E
-:1002F00000000000050200000000001091DE000078
-:1003000000000018000A0000000000000682000043
-:100310000000001091DE0000000000090561FFFFF1
-:1003200000000010918A00020000000830E1FFFF89
-:10033000000000188000FFA9000000010561140002
-:1003400000000010918A000200000008B0E10001E6
-:1003500000000018000D00000000000006820000F0
-:100360000000001091DE0000000000090562FFFFA0
-:1003700000000010918A0002000000083162FFFFB7
-:10038000000000188000FF9F0000000105621400BB
-:1003900000000010918A000200000008B162000114
-:1003A00000000018000D000000000010B1A0B01304
-:1003B0000000000B2FDF0002000000002C200000D6
-:1003C000000000082C800000000000082D00000044
-:1003D0000000001091D40000000000080500005546
-:1003E000000000188000FFDB000000082D80011CC9
-:1003F00000000010001F0000000000188000FFE255
-:100400000000000F476000080000000F060E00010A
-:10041000000000000F580000000000000A64000007
-:10042000000000000AE50000000000090B66FFFF65
-:10043000000000000D6100000000001880000015A1
-:100440000000000F476000080000000B2FDF0002D3
-:10045000000000082C800000000000082D000000B3
-:100460000000001091D40000000000082D80011C45
-:100470000000000F060E000100000010001F000029
-:10048000000000000F580000000000188000FFD09E
-:10049000000000000A640000000000000AE50000FF
-:1004A000000000090B66FFFF000000000D61000066
-:1004B00000000000026200000000000002E00000F6
-:1004C0000000000B2FDF00020000000030050000DC
-:1004D000000000003104000000000000309A00001D
-:1004E000000000100060000A00000008051600016E
-:1004F00000000010BA9A140300000000030000007E
-:100500000000001880000006000000188000FF6C4A
-:1005100000000010B60614040000000803060001E5
-:10052000000000082A000001000000188000FF7190
-:10053000000000000C961800000000090C99FFFF55
-:1005400000000004CC99340000000010BA992C027D
-:10055000000000080F8000000000000C298000014E
-:100560000000000C295200010000000C295200007C
-:100570000000000822800002000000080200000EB7
-:10058000000000080280001A00000010B1C40A0236
-:1005900000000008020000030000000C1F800001A2
-:1005A000000000002ADF0000000000002A00080010
-:1005B000000000188000FF600000000B2FDF000229
-:1005C0000000001091D40000000000082A00000183
-:1005D000000000002C2000000000001091D400005A
-:1005E000000000082C800000000000082D00000022
-:1005F000000000082D80011C000000188000FF9FF3
-:10060000000000082C800006000000082D000006F5
-:1006100000000000308000000000000031000000F9
-:10062000000000082D8000060000000C2980000159
-:100630000000000C1F8000010000001091DE00008F
-:10064000000000002ADF0000000000082A0000105F
-:100650000000000807800000000000188000FF4B29
-:100660000000001091D4000000000008050000AA5E
-:10067000000000188000FF890000000C29800001A4
-:100680000000000C1F800001000000082A00000983
-:10069000000000188000FF440000001091D400000A
-:1006A0000000000805000055000000188000FF82CF
-:1006B0000000001091A0B00200000010B1E6620737
-:1006C0000000000B2FDF0002000000002C310000B2
-:1006D000000000092CB1007F000000082CD90000A8
-:1006E000000000082D000000000000082D80010D12
-:1006F00000000010B1A8000600000010205F0000FC
-:10070000000000002C200000000000002CA70000CA
-:10071000000000082D000010000000082D800108D6
-:10072000000000188000FF7A00000010B1A6001041
-:1007300000000010001F00000000000F0F30000735
-:10074000000000000A600000000000000AE1000054
-:100750000000000F4B620008000000090B1600FFAC
-:10076000000000000D620000000000090D1A00FFEB
-:1007700000000010073000030000000C0D1A0008F4
-:100780000000000C0B1600080000000F4CE30018DE
-:10079000000000000C992C0000000004CC993400EB
-:1007A000000000080F8000000000000C29800001FC
-:1007B0000000000033310000000000082200001695
-:1007C000000000002ADF0000000000082A00000CE2
-:1007D00000000010009F0000000000002C2000001E
-:1007E0000000000C1F800001000000188000FF19AD
-:1007F0000000001091D4000000000008050000AACD
-:10080000000000188000FF570000000F472200087A
-:1008100000000009070E000F00000008070E000886
-:1008200000000008028000010000000702851C0093
-:1008300000000008828500010000000002854C00D5
-:100840000000000742851C0000000003C3AA5200FC
-:100850000000000003B10E00000000074B071C0061
-:100860000000000F0F3000070000000F0A96000381
-:10087000000000000A955C00000000004A005A00D9
-:10088000000000000C960A00000000090C99FFFF10
-:10089000000000080D00FFFF00000010BA992C02B4
-:1008A000000000080F80000500000010B1A800083B
-:1008B00000000010205F00000000000B2FDF00028E
-:1008C000000000002C200000000000002CA7000009
-:1008D000000000082D000010000000082D80010815
-:1008E000000000188000FF420000000C2980000179
-:1008F00000000010001F00000000000C1F8000011D
-:10090000000000002ADF0000000000082A00000D9F
-:10091000000000188000FEF40000001091D40000D8
-:100920000000000805000055000000188000FF329C
-:100930000000000C298000010000000C1F80000155
-:10094000000000082A000007000000188000FEEDEB
-:1009500000000010B18000040000001F0506001117
-:1009600000000008050000FF000000180002000061
-:10097000000000002A00000000000010B1D40000B8
-:100980000000001091DE0000000000102053000065
-:1009900000000010001F0000000000002F80AA00CF
-:1009A0000000000C29800001000000080254000F24
-:1009B000000000002C400000000000000F4000007C
-:1009C000000000092952003F000000180004000048
-:1009D00000000018800000110000001880000012C4
-:1009E000000000188000003800000018800001118D
-:1009F0000000001880000110000000188000010FA6
-:100A0000000000188000010F0000001880000000A6
-:100A10000000001880000128000000188000010B71
-:100A20000000001880000000000000188000012C69
-:100A3000000000188000017A000000188000005AB1
-:100A400000000018800000C400000018800000C5ED
-:100A50000000001880000104000000002A000000CF
-:100A6000000000188000FFE3000000002A000000E2
-:100A70000000000C29800000000000188000FFE04A
-:100A80000000001800020000000000000502000045
-:100A900000000010B99A2C2100000010205F000017
-:100AA000000000002C1E0000000000082C80000642
-:100AB000000000082D000006000000082D80010243
-:100AC00000000000000000000000001091DE0000A7
-:100AD000000000000D61000000000018000A000086
-:100AE000000000000502000000000010B99A2C165A
-:100AF00000000010205F00000000000009D8000086
-:100B0000000000002C1E0000000000082C80010ED8
-:100B1000000000082D00000A000000082D800102DE
-:100B200000000000000000000000001091DE000046
-:100B3000000000000D620000000000002C13000007
-:100B400000000018000A000000000000050200007C
-:100B500000000010B99A2C0900000010205F00006E
-:100B6000000000002C1E0000000000082C80000681
-:100B7000000000082D00006A000000082D8001021E
-:100B800000000000000000000000001091DE0000E6
-:100B9000000000000D7A000000000018000A0000AC
-:100BA000000000002A0000000000000822000001F0
-:100BB000000000000D6100000000001021C20024B0
-:100BC00000000010B1C6000200000010234200A285
-:100BD000000000090B66FFFF00000010BA9A2C20ED
-:100BE000000000000A640000000000000AE50000A8
-:100BF000000000000C000000000000000B8000005E
-:100C0000000000080CC60012000000188000FFD091
-:100C1000000000080F80000300000000000000003A
-:100C200000000010009F00000000000827110012C3
-:100C3000000000006690000000000010B198000362
-:100C400000000010001F0000000000080F800004DA
-:100C50000000000822000003000000082C80000CA7
-:100C6000000000082D00000C00000010009F000094
-:100C70000000001091C6000500000010001F0000D9
-:100C800000000010BA9A2C03000000080F80000436
-:100C9000000000188000FFFD000000002596000005
-:100CA0000000000C29800000000000003214000049
-:100CB00000000000329500000000000573662C0063
-:100CC0000000000031E32E00000000082D8000101D
-:100CD000000000188000FF950000000023000000C5
-:100CE0000000000925E6FFFF000000082200000BBD
-:100CF0000000000C695200000000000C2980000078
-:100D0000000000188000FF8F000000002A00000093
-:100D1000000000082C800040000000082D0000208A
-:100D2000000000082D80011C0000000822000001C6
-:100D30000000001091DE00000000000F42EA0010E9
-:100D400000000010004F000400000010B7469200A1
-:100D5000000000080249001200000010B5840A00DB
-:100D6000000000000D61000000000010BA6634575A
-:100D7000000000088305001200000010004F000270
-:100D800000000000034900000000000183068C0001
-:100D90000000000083C60C0000000010B1870013A3
-:100DA000000000000B6E0000000000090569FFFF55
-:100DB00000000010918A00020000000834E9FFFFE3
-:100DC000000000188000FF74000000010569140095
-:100DD00000000010918A000200000008B4E9000140
-:100DE00000000010BAE92C480000000086692C00C1
-:100DF00000000000020000000000000902EAFFFFFE
-:100E000000000010000C00020000000002040A00B4
-:100E10000000000F460C00010000000F02850001D9
-:100E200000000010918C01FC00000010B7040E3F80
-:100E3000000000000D610000000000000A640000D6
-:100E4000000000000AE50000000000090B66FFFF3B
-:100E5000000000000C000000000000000B800000FB
-:100E6000000000080C860012000000080F8000033C
-:100E70000000000C2952000000000010009F00003C
-:100E8000000000082711001200000000669000001A
-:100E9000000000002306000000000010B1980005CB
-:100EA00000000010001F0000000000080F80000478
-:100EB000000000000000000000000010001F000003
-:100EC0000000000032140000000000003295000015
-:100ED0000000000031E32E000000000573662C00C6
-:100EE000000000002596000000000010B1870016E9
-:100EF0000000000C298000000000000F0F6B0007AD
-:100F0000000000000D690000000000000A6C0000F5
-:100F1000000000000AED0000000000000B6E000061
-:100F2000000000000B800000000000000C870000A3
-:100F3000000000080F800003000000102053000094
-:100F40000000000C6952000100000010001F0000AA
-:100F50000000000022C58C0000000000231B0000E0
-:100F60000000000027110000000000002690000093
-:100F700000000010B8170E030000000C29800000CC
-:100F8000000000188000FFF600000010B198000279
-:100F9000000000080F800004000000082200001A72
-:100FA000000000082C80000C000000082D00000C40
-:100FB000000000082D80001000000010001F00003D
-:100FC000000000000D6E000000000003E7CF3400B9
-:100FD0000000000C298000000000001091DE0000DD
-:100FE00000000010B1870007000000003614000068
-:100FF00000000000369500000000000037160000D9
-:10100000000000082C800050000000082D00003077
-:10101000000000082D80000C000000188000FF2C4C
-:1010200000000000230000000000000925E6FFFF8B
-:10103000000000000B6E000000000003E7CF2C0052
-:10104000000000082200001B0000000C6952000094
-:101050000000000C29800000000000188000FF2420
-:10106000000000002A000000000000188000FF229D
-:10107000000000002A0000000000000C2980000091
-:101080000000001091DE0000000000082C80001A13
-:10109000000000082D00001A000000057366000023
-:1010A000000000082D8000020000000031800000D8
-:1010B0000000001091DE0000000000082C80000CF1
-:1010C000000000082D00000C000000082D80000426
-:1010D000000000188000FF150000000806660001EF
-:1010E00000000010BA9A197F000000000A64000096
-:1010F000000000000AE50000000000090B66FFFF89
-:10110000000000000C000000000000000B80000048
-:10111000000000080CC60012000000188000FF2E1E
-:10112000000000080F800003000000000000000025
-:1011300000000010009F00000000000827110012AE
-:10114000000000006690000000000010919B32003B
-:10115000000000100293000000000010B19800038E
-:1011600000000010001F0000000000080F800004B5
-:101170000000000C2980000000000010001F00008B
-:1011800000000010BA9A2C000000000031E32E008D
-:10119000000000000B800000000000008CCC8C00E0
-:1011A00000000010B5CC8C02000000080C8000018B
-:1011B000000000188000FF1B000000080F800003E3
-:1011C00000000010205300000000000C69520001D4
-:1011D0000000000022C58C0000000010009F0000ED
-:1011E0000000000027110000000000002690000011
-:1011F00000000000231B000000000010B198000355
-:1012000000000010001F0000000000080F80000414
-:101210000000000822000003000000082C80000CE1
-:10122000000000082D00000C00000010009F0000CE
-:1012300000000000259600000000000C298000003E
-:101240000000000032140000000000003295000091
-:101250000000000573662C000000000031E32E0042
-:10126000000000082D800010000000188000FEE241
-:10127000000000188000FEE1000000002A000000CD
-:1012800000000010001F0000000000000F008000A0
-:10129000000000080F800007000000188000001BFD
-:1012A00000000000280A0000000000000502000005
-:1012B00000000008220000090000000029000000D2
-:1012C0000000000F6568001000000000248A000084
-:1012D00000000003F66C940000000010B972A00436
-:1012E0000000000C73E700190000000C214200040C
-:1012F000000000003CF800000000000C2980000005
-:101300000000001020530000000000082200000828
-:101310000000000C6142000400000018000A0000F8
-:1013200000000000050200000000000C6142000007
-:1013300000000010014200030000000C33E7001D14
-:101340000000000C6142000200000018000A0000CA
-:10135000000000002A00000000000010001F000034
-:101360000000000F0F470007000000080F80000872
-:101370000000000C2980000000000010009F000009
-:10138000000000188000FEBF000000003351000084
-:10139000000000002A00000000000010B1C6002379
-:1013A0000000000F0F500007000000000A6000005E
-:1013B000000000000AE100000000000F4B6200087E
-:1013C000000000090B1600FF0000000F4C62001027
-:1013D000000000000D620000000000090D1A00FF6F
-:1013E00000000010075000030000000C0D1A000858
-:1013F0000000000C0B160008000000000CC60000E6
-:10140000000000000B8000000000000006980000B3
-:10141000000000080F8000030000001006C2000456
-:101420000000000C2900000200000010264200020B
-:101430000000000C295200030000000822000001F7
-:1014400000000010009F000000000000231B0000AF
-:101450000000000027111A00000000006690000044
-:101460000000000C2952000000000010B197320962
-:101470000000000C29800000000000000698000019
-:1014800000000010205300000000000C295200034F
-:101490000000000022C58C0000000010001F0000AA
-:1014A000000000080F800003000000188000FFF318
-:1014B00000000010B1C8001300000010B1C6000306
-:1014C0000000000C298000000000001020530000E4
-:1014D0000000000C295200000000000C29520003FB
-:1014E0000000001006C200020000000C2952000299
-:1014F0000000000022C58C000000000027650000ED
-:101500000000000026E40000000000082200001691
-:1015100000000010B1C600030000000023480000D6
-:1015200000000010B180000500000000234800000A
-:101530000000000C298000000000000F0F50000781
-:1015400000000018800000120000000822000016B1
-:101550000000000C29800000000000003014000092
-:10156000000000003095000000000010075000034C
-:10157000000000090B1600FF000000090D1A00FF13
-:101580000000000F31160008000000003162340036
-:1015900000000003F162300000000010205F000036
-:1015A000000000002C510000000000092CD1007F39
-:1015B000000000082CD90000000000082D000000E9
-:1015C000000000082D80000C00000000000000005A
-:1015D0000000001091DE00000000001005C20004B1
-:1015E000000000080F80000700000000330000002A
-:1015F00000000010009F0000000000188000FE7036
-:10160000000000002A0000000000000F0F5000073B
-:1016100000000010B1C6002D0000000F4742000876
-:1016200000000009070E000F00000008070E000868
-:1016300000000010001F0000000000080900000169
-:101640000000000709121C0000000003CBCA920032
-:10165000000000000B97A2000000000742171C00CA
-:10166000000000000B0400000000000F0A840003CB
-:10167000000000000A959C00000000004A009A004B
-:101680000000000882120001000000010C17080091
-:10169000000000000C978C00000000000218000001
-:1016A000000000080D00FFFF000000080F8000068A
-:1016B0000000000C290000000000001006C2000419
-:1016C0000000000C29520002000000102642000217
-:1016D0000000000C29520003000000082200000155
-:1016E00000000010009F000000000010B197320CB5
-:1016F00000000000231B000000000000271108006C
-:1017000000000000669000000000000C298000002E
-:10171000000000000218000000000010205300002C
-:101720000000000C295200030000000022C5360012
-:1017300000000010001F0000000000080F800006DD
-:10174000000000188000FFF400000000231B0000D0
-:101750000000000027110800000000006690000053
-:1017600000000010B1C8000B0000000C2980000030
-:1017700000000010205300000000000C295200005F
-:101780000000000C295200030000001006C20002F5
-:101790000000000C295200020000000022C58C004D
-:1017A00000000000276500000000000026E40000A3
-:1017B000000000002348000000000008220000177D
-:1017C0000000000C2980000000000010001F000035
-:0817D000000000188000FE3546
-:00000001FF
-/*
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
diff --git a/firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw.ihex b/firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw.ihex
deleted file mode 100644
index d2f275788f16..000000000000
--- a/firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw.ihex
+++ /dev/null
@@ -1,425 +0,0 @@
-:100000000000000000000970000000580000000916
-:1000100000000000000000000000000000000000E0
-:1000200000000000000000000000000000000000D0
-:1000300000001010000009C80000000500000000CA
-:1000400000000000000000000000000000000000B0
-:080050000000000000000000A8
-:0800580000000010B180000659
-:100060000000001F03060011000000080500FFFF4C
-:10007000000000180002000000000008050000FF5A
-:10008000000000180002000000000008AC000001A1
-:1000900000000008078000000000000C2F80000115
-:1000A000000000002B000000000000002B8000007A
-:1000B0000000001091E1000200000008AC00000107
-:1000C00000000010203F003B00000010213F000313
-:1000D0000000001020BF0015000000188000FFFD88
-:1000E0000000000C1F800002000000188000FFF9D3
-:1000F00000000008B1000001000000082C80010C85
-:10010000000000082D000008000000082D800001FC
-:10011000000000188000004F0000000B2FDF0002DD
-:100120000000000C1F800002000000002C070000EF
-:100130000000001091DE0000000000188000FFEFBA
-:100140000000000B2FDF00020000000C1F800000E9
-:10015000000000002C0700000000001091DE0000ED
-:10016000000000188000FFEA0000000C1F80000261
-:10017000000000188000FFE80000000802240025AD
-:1001800000000018000400000000001880000000BB
-:10019000000000188000001B0000001880000055BF
-:1001A000000000188000000000000018800000001F
-:1001B000000000188000000000000018800000000F
-:1001C00000000018800000000000001880000000FF
-:1001D00000000018800000000000001880000000EF
-:1001E00000000018800000000000001880000000DF
-:1001F000000000188000009D000000188000000032
-:1002000000000018800000000000001880000000BE
-:1002100000000018800000000000001880000000AE
-:10022000000000188000000000000018800000009E
-:10023000000000188000009C00000018800000C62C
-:10024000000000188000009300000018800000E902
-:10025000000000188000003E000000188000000030
-:10026000000000188000007A0000001091D4000007
-:100270000000000C298000010000000C1F8000011C
-:10028000000000082A0000020000000807800000AB
-:10029000000000188000FFC4000000080380010077
-:1002A00000000010B73C0E000000001880000000A5
-:1002B000000000000202000000000000029A00009E
-:1002C00000000000060C2C0000000004C60C3400E6
-:1002D00000000010001F000000000010BA8C2C0C61
-:1002E000000000080696000400000009068DFFFCCF
-:1002F00000000004CD051A0000000004CC9A18008C
-:100300000000001020D700000000000C2B56000059
-:1003100000000000000000000000000000000000DD
-:100320000000001020D70000000000080F8000012E
-:1003300000000010B18001F400000010001F000058
-:100340000000000C6B5600000000001800040000C4
-:10035000000000000682000000000010B18F0004C1
-:1003600000000010B18F1403000000082A000001F3
-:100370000000001091D4000000000000078014006D
-:1003800000000018000D0000000000000502000041
-:100390000000001091DE000000000018000A0000BC
-:1003A00000000000068200000000001091DE000046
-:1003B000000000090561FFFF00000010918A0002A3
-:1003C0000000000830E1FFFF000000188000FF96E9
-:1003D000000000010561140000000010918A000275
-:1003E00000000008B0E1000100000018000D00004E
-:1003F00000000000068200000000001091DE0000F6
-:10040000000000090562FFFF00000010918A000251
-:10041000000000083162FFFF000000188000FF8C20
-:10042000000000010562140000000010918A000223
-:1004300000000008B162000100000018000D00007B
-:1004400000000010B1A0B0130000000B2FDF00026D
-:10045000000000002C200000000000082C8000009C
-:10046000000000082D0000000000001091D40000E2
-:100470000000000805000055000000188000FFDBA8
-:10048000000000082D80011C00000010001F00006B
-:10049000000000188000FFE20000000F4760000825
-:1004A0000000000F060E0001000000000F580000C1
-:1004B000000000000A640000000000000AE50000DF
-:1004C000000000090B66FFFF000000000D61000046
-:1004D00000000018800000150000000F47600008B1
-:1004E0000000000B2FDF0002000000082C8000003D
-:1004F000000000082D0000000000001091D4000052
-:10050000000000082D80011C0000000F060E0001F5
-:1005100000000010001F0000000000000F58000045
-:10052000000000188000FFD0000000000A640000F6
-:10053000000000000AE50000000000090B66FFFF54
-:10054000000000000D6100000000000002620000D9
-:100550000000000002E000000000000B2FDF00029E
-:100560000000000030050000000000003104000021
-:1005700000000000309A0000000000100060000A37
-:10058000000000080516000100000010BA9A1403CC
-:1005900000000000030000000000001880000006BA
-:1005A000000000188000FF5900000010B606140477
-:1005B0000000000803060001000000082A000001F6
-:1005C000000000188000FF5E000000188000FF9D02
-:1005D0000000000C298000010000000C29520001DD
-:1005E0000000000C295200000000000822800002D8
-:1005F000000000080200000E000000080280001A3F
-:1006000000000010B1C40A0200000008020000034C
-:100610000000000C1F800001000000002ADF000025
-:10062000000000002A000800000000188000FF51B0
-:100630000000000B2FDF00020000001091D400002A
-:10064000000000082A000001000000002C2000002B
-:100650000000001091D40000000000082C80000071
-:10066000000000082D000000000000082D80011C83
-:10067000000000188000FFA3000000082C80000686
-:10068000000000082D00000600000000308000007F
-:100690000000000031000000000000082D8000066E
-:1006A0000000000C298000010000000C1F800001E8
-:1006B0000000001091DE0000000000002ADF0000B2
-:1006C000000000082A000010000000080780000059
-:1006D000000000188000FF3C0000001091D40000D2
-:1006E00000000008050000AA000000188000FF8D2F
-:1006F0000000000C298000010000000C1F80000198
-:10070000000000082A000009000000188000FF35E2
-:100710000000001091D40000000000080500005502
-:10072000000000188000FF860000001091A0B002B9
-:1007300000000010B1E662070000000B2FDF00028E
-:10074000000000002C310000000000092CB1007FE7
-:10075000000000082CD90000000000082D00000057
-:10076000000000082D80010D00000010B1A8000657
-:1007700000000010205F0000000000002C2000009E
-:10078000000000002CA70000000000082D00001051
-:10079000000000082D800108000000188000FF7E86
-:1007A00000000010B1A6001000000010001F0000A3
-:1007B0000000000F0F300007000000000A6000007A
-:1007C000000000000AE100000000000F4B6200087A
-:1007D000000000090B1600FF000000000D62000081
-:1007E000000000090D1A00FF000000100730000390
-:1007F0000000000C0D1A00080000000C0B16000889
-:100800000000000F4CE30018000000000C992C00C1
-:1008100000000004CC993400000000080F800000A4
-:100820000000000C298000010000000033310000AE
-:100830000000000822000016000000002ADF00006F
-:10084000000000082A00000C00000010009F0000BB
-:10085000000000002C2000000000000C1F800001A0
-:10086000000000188000FF0A0000001091D4000072
-:1008700000000008050000AA000000188000FF5BCF
-:100880000000000F4722000800000009070E000FBB
-:1008900000000008070E00080000000802800001A8
-:1008A0000000000702851C0000000008828500018E
-:1008B0000000000002854C000000000742851C007B
-:1008C00000000003C3AA52000000000003B10E00A4
-:1008D000000000074B071C000000000F0F3000074E
-:1008E0000000000F0A960003000000000A955C005B
-:1008F000000000004A005A00000000000C960A00A8
-:10090000000000090C99FFFF000000080D00FFFF28
-:1009100000000010BA992C02000000080F800005AA
-:1009200000000010B1A8000800000010205F0000C7
-:100930000000000B2FDF0002000000002C20000050
-:10094000000000002CA70000000000082D0000108F
-:10095000000000082D800108000000188000FF46FC
-:100960000000000C2980000100000010001F0000A2
-:100970000000000C1F800001000000002ADF0000C2
-:10098000000000082A00000D000000188000FEE5AD
-:100990000000001091D40000000000080500005580
-:1009A000000000188000FF360000000C29800001C4
-:1009B0000000000C1F800001000000082A00000752
-:0809C000000000188000FEDEBB
-:0809C80000000010B1800004E2
-:1009D0000000001F0306001100000008050000FFD2
-:1009E0000000001800020000000000002A000000C3
-:1009F00000000010B1D400000000001091DE0000E3
-:100A0000000000102053000000000010001F000034
-:100A10000000000C6BD70001000000002F80AA002E
-:100A20000000000C298000010000000802540010A2
-:100A3000000000002C400000000000000F400000FB
-:100A4000000000092952003F0000001800040000C7
-:100A50000000001880000011000000188000001243
-:100A600000000018800000470000001880000137D7
-:100A700000000018800001360000001880000135D9
-:100A80000000001880000135000000188000000000
-:100A9000000000188000014F0000001880000131A4
-:100AA00000000018800000000000001880000155C0
-:100AB00000000018800001A6000000188000006DF2
-:100AC00000000018800000E400000018800000E52D
-:100AD000000000188000012A000000002A00000029
-:100AE000000000188000FFE2000000002A00000063
-:100AF0000000000C29800000000000188000FFDFCB
-:100B00000000000003820000000000188000FFDAEF
-:100B1000000000010C161400000000008C181400E6
-:100B20000000001091980003000000080C960002DD
-:100B300000000010B1800003000000080C960001C6
-:100B4000000000000C000000000000000D19000073
-:100B5000000000080F8000010000000000000000FD
-:100B600000000010001F00000000000C6BD7000107
-:100B700000000010011301F300000018000700003E
-:100B8000000000000502000000000010B99A2C21AE
-:100B900000000010205F0000000000002C1E00007C
-:100BA000000000082C800006000000082D00000650
-:100BB000000000082D80010200000000000000007D
-:100BC0000000001091DE0000000000000D61000038
-:100BD00000000018000A00000000000005020000EC
-:100BE00000000010B99A2C1600000010205F0000D1
-:100BF0000000000009D80000000000002C1E0000CA
-:100C0000000000082C80010E000000082D00000AE2
-:100C1000000000082D80010200000000000000001C
-:100C20000000001091DE0000000000000D620000D6
-:100C3000000000002C13000000000018000A000053
-:100C4000000000000502000000000010B99A2C0905
-:100C500000000010205F0000000000002C1E0000BB
-:100C6000000000082C800006000000082D00006A2B
-:100C7000000000082D8001020000000000000000BC
-:100C80000000001091DE0000000000000D7A00005E
-:100C900000000018000A0000000000002A00000008
-:100CA0000000000822000001000000000D610000AB
-:100CB0000000001021C2002800000010B1C6000290
-:100CC00000000010234200B3000000090B66FFFF84
-:100CD00000000010BA9A2C24000000000A640000F2
-:100CE000000000000AE50000000000000C00000009
-:100CF000000000000B800000000000080CC600127D
-:100D0000000000188000FFD0000000080F800003E2
-:100D1000000000000000000000000010001F0000A4
-:100D20000000000C6BD70001000000082711001222
-:100D3000000000006690000000000010B198000460
-:100D400000000010001F00000000000C6BD7000125
-:100D5000000000080F8000040000000822000003CB
-:100D6000000000082C80000C000000082D00000C82
-:100D700000000010001F00000000000C6BD70001F5
-:100D80000000001091C6000600000010001F0000C7
-:100D90000000000C6BD7000100000010BA9A2C0371
-:100DA000000000080F800004000000188000FFFC15
-:100DB00000000000259600000000000C29800000C3
-:100DC0000000000032140000000000003295000016
-:100DD0000000000573662C000000000031E32E00C7
-:100DE000000000082D800010000000188000FF8126
-:100DF00000000000230000000000000925E6FFFFBE
-:100E0000000000082200000B0000000C69520000E6
-:100E10000000000C29800000000000188000FF7B0B
-:100E2000000000002A000000000000082C800040A4
-:100E3000000000082D000020000000082D80011C8B
-:100E400000000008220000010000001091DE0000F8
-:100E50000000000F42EA001000000010004F0004E4
-:100E600000000010B746920000000008024900127E
-:100E700000000010B5840A00000000000D610000B1
-:100E800000000010BA6634640000000883050012F8
-:100E900000000010004F00020000000003490000A5
-:100EA0000000000183068C000000000083C60C00D7
-:100EB00000000010B1870013000000000B6E00005E
-:100EC000000000090569FFFF00000010918A000280
-:100ED0000000000834E9FFFF000000188000FF60F8
-:100EE000000000010569140000000010918A000252
-:100EF00000000008B4E9000100000010BAE92C5518
-:100F00000000000086692C000000000002000000C4
-:100F10000000000902EAFFFF00000010000C0002C0
-:100F20000000000002040A000000000F460C00014F
-:100F30000000000F0285000100000010918C01FCF0
-:100F400000000010B7040E4C000000000D6100000E
-:100F5000000000000A640000000000000AE5000034
-:100F6000000000090B66FFFF000000000C000000FD
-:100F7000000000000B800000000000080C8600123A
-:100F8000000000080F8000030000000C2952000040
-:100F900000000010001F00000000000C6BD70001D3
-:100FA00000000008271100120000000066900000F9
-:100FB000000000002306000000000010B1980007A8
-:100FC00000000010001F00000000000C6BD70001A3
-:100FD000000000080F800004000000000000000076
-:100FE00000000010001F00000000000C6BD7000183
-:100FF00000000000321400000000000032950000E4
-:101000000000000031E32E000000000573662C0094
-:10101000000000002596000000000010B187001FAE
-:101020000000000C298000000000000F0F6B00077B
-:10103000000000000D690000000000000A6C0000C4
-:10104000000000000AED0000000000000B6E000030
-:10105000000000000B800000000000000C87000072
-:10106000000000188000FF2F000000010C16140083
-:10107000000000008C181400000000080C9600010D
-:101080000000001091980002000000080C99000177
-:10109000000000000D190000000000000C0000001E
-:1010A000000000080F800001000000102053000025
-:1010B0000000000C6952000100000010001F000039
-:1010C0000000000C6BD700010000000022C58C005E
-:1010D00000000000231200000000000027110000A3
-:1010E000000000002690000000000010B8170E035A
-:1010F0000000000C29800000000000188000FFEDB7
-:101100000000000082970E0000000000A3120A00F9
-:10111000000000082200001A000000082C80000CCB
-:10112000000000082D00000C000000082D800010B9
-:1011300000000010001F00000000000C6BD7000131
-:10114000000000000D6E000000000003E7CF340037
-:101150000000000C298000000000001091DE00005B
-:1011600000000010B18700070000000036140000E6
-:101170000000000036950000000000003716000057
-:10118000000000082C800050000000082D000030F6
-:10119000000000082D80000C000000188000FF0BEC
-:1011A00000000000230000000000000925E6FFFF0A
-:1011B000000000000B6E000000000003E7CF2C00D1
-:1011C000000000082200001B0000000C6952000013
-:1011D0000000000C29800000000000188000FF03C0
-:1011E000000000002A000000000000188000FF013D
-:1011F000000000002A0000000000000C2980000010
-:101200000000001091DE0000000000082C80001A91
-:10121000000000082D00001A0000000573660000A1
-:10122000000000082D800002000000003180000056
-:101230000000001091DE0000000000082C80000C6F
-:10124000000000082D00000C000000082D800004A4
-:10125000000000188000FEF400000008066600018F
-:1012600000000010BA9A1972000000000A64000021
-:10127000000000000AE50000000000090B66FFFF07
-:10128000000000000C000000000000000B800000C7
-:10129000000000080CC60012000000188000FF1DAE
-:1012A000000000080F8000030000000000000000A4
-:1012B00000000010001F00000000000C6BD70001B0
-:1012C00000000008271100120000000066900000D6
-:1012D00000000010919B32000000001002930000FB
-:1012E00000000010B198000300000010001F000073
-:1012F0000000000C6BD70001000000080F80000404
-:101300000000000C2980000000000010001F0000F9
-:101310000000000C6BD7000100000010BA9A2C00EE
-:101320000000000031E32E00000000000B800000F0
-:10133000000000008CCC8C0000000010B5CC8C02AA
-:10134000000000080C800001000000188000FF076A
-:10135000000000080F800003000000102053000070
-:101360000000000C695200010000000022C58C0042
-:1013700000000010001F00000000000C6BD70001EF
-:10138000000000002711000000000000269000006F
-:1013900000000000231B000000000010B1980003B3
-:1013A00000000010001F00000000000C6BD70001BF
-:1013B000000000080F800004000000082200000365
-:1013C000000000082C80000C000000082D00000C1C
-:1013D00000000010001F00000000000C6BD700018F
-:1013E00000000000259600000000000C298000008D
-:1013F00000000000321400000000000032950000E0
-:101400000000000573662C000000000031E32E0090
-:10141000000000082D800010000000188000FEBBB6
-:10142000000000188000FEBA000000002A00000042
-:1014300000000010001F00000000000C6BD700012E
-:10144000000000000F008000000000080F8000076F
-:10145000000000188000001C00000000280A0000A6
-:101460000000000005020000000000082200000942
-:1014700000000000290000000000000F6568001057
-:1014800000000000248A000000000003F66C9400B5
-:1014900000000010B972A0040000000C73E70019EE
-:1014A0000000000C21420004000000003CF8000095
-:1014B0000000000C298000000000001020530000F4
-:1014C00000000008220000080000000C6142000437
-:1014D00000000018000A00000000000005020000E3
-:1014E0000000000C614200000000001001420003F7
-:1014F0000000000C33E7001D0000000C61420002F8
-:1015000000000018000A0000000000002A0000008F
-:1015100000000010001F00000000000C6BD700014D
-:101520000000000F0F470007000000080F800008B0
-:101530000000000C2980000000000010001F0000C7
-:101540000000000C6BD70001000000188000FE9521
-:101550000000000033510000000000002A000000DD
-:1015600000000010B1C600250000000F0F5000075A
-:10157000000000000A600000000000000AE1000016
-:101580000000000F4B620008000000090B1600FF6E
-:101590000000000F4C620010000000000D6200000F
-:1015A000000000090D1A00FF0000001007500003A2
-:1015B0000000000C0D1A00080000000C0B160008BB
-:1015C000000000000CC60000000000000B800000BE
-:1015D0000000000006980000000000080F800003D3
-:1015E0000000001006C200040000000C29000002E8
-:1015F00000000010264200020000000C29520003E7
-:10160000000000082200000100000010001F000080
-:101610000000000C6BD7000100000000231B00003D
-:101620000000000027111A00000000006690000072
-:101630000000000C2952000000000010B197320A8F
-:101640000000000C29800000000000000698000047
-:1016500000000010205300000000000C295200037D
-:101660000000000022C58C0000000010001F0000D8
-:101670000000000C6BD70001000000080F80000381
-:10168000000000188000FFF100000010B1C8001336
-:1016900000000010B1C600030000000C298000000B
-:1016A00000000010205300000000000C2952000030
-:1016B0000000000C295200030000001006C20002C6
-:1016C0000000000C295200020000000022C58C001E
-:1016D00000000000276500000000000026E4000074
-:1016E000000000082200001600000010B1C6000330
-:1016F000000000002348000000000010B180000539
-:1017000000000000234800000000000C29800000B9
-:101710000000000F0F5000070000001880000012AA
-:1017200000000008220000160000000C29800000C4
-:1017300000000000301400000000000030950000A0
-:101740000000001007500003000000090B1600FF06
-:10175000000000090D1A00FF0000000F31160008FC
-:10176000000000003162340000000003F16230002C
-:1017700000000010205F0000000000002C5100005D
-:10178000000000092CD1007F000000082CD90000C7
-:10179000000000082D000000000000082D80000C53
-:1017A00000000000000000000000001091DE0000BA
-:1017B0000000001005C20005000000080F800007AF
-:1017C000000000003300000000000010001F0000B7
-:1017D0000000000C6BD70001000000188000FE43E1
-:1017E000000000002A0000000000000F0F5000075A
-:1017F00000000010B1C600300000000F4742000892
-:1018000000000009070E000F00000008070E000886
-:1018100000000010001F00000000000C6BD700014A
-:1018200000000008090000010000000709121C0068
-:1018300000000003CBCA9200000000000B97A2003A
-:101840000000000742171C00000000000B0400000D
-:101850000000000F0A840003000000000A959C00AD
-:10186000000000004A009A000000000882120001F7
-:10187000000000010C170800000000000C978C000D
-:101880000000000002180000000000080D00FFFF2B
-:10189000000000080F8000060000000C2900000076
-:1018A0000000001006C200040000000C29520002D3
-:1018B00000000010264200020000000C2952000324
-:1018C000000000082200000100000010001F0000BE
-:1018D0000000000C6BD7000100000010B197320D22
-:1018E00000000000231B000000000000271108007A
-:1018F00000000000669000000000000C298000003D
-:10190000000000000218000000000010205300003A
-:101910000000000C295200030000000022C5360020
-:1019200000000010001F00000000000C6BD7000139
-:10193000000000080F800006000000188000FFF281
-:1019400000000000231B0000000000002711080019
-:10195000000000006690000000000010B1C8000BFD
-:101960000000000C2980000000000010205300003F
-:101970000000000C295200000000000C2952000356
-:101980000000001006C200020000000C29520002F4
-:101990000000000022C58C00000000002765000048
-:1019A0000000000026E400000000000023480000C2
-:1019B00000000008220000170000000C2980000031
-:1019C00000000010001F00000000000C6BD7000199
-:0819D000000000188000FE0475
-:00000001FF
-/*
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
diff --git a/firmware/bnx2x/bnx2x-e1-6.2.9.0.fw.ihex b/firmware/bnx2x/bnx2x-e1-6.2.9.0.fw.ihex
deleted file mode 100644
index 0ed7f5891184..000000000000
--- a/firmware/bnx2x/bnx2x-e1-6.2.9.0.fw.ihex
+++ /dev/null
@@ -1,9484 +0,0 @@
-:1000000000003BB0000000680000070C00003C202E
-:1000100000001AF8000043300000007C00005E3051
-:1000200000007A2C00005EB0000000B00000D8E0B4
-:10003000000080200000D99800000088000159C00D
-:100040000000398800015A5000000090000193E040
-:100050000000AC040001947800000FFC0002408016
-:100060000000000400025080020400480000000F5D
-:100070000204005400000045020400580000000083
-:100080000204005C0000000602040070000000048E
-:1000900002040078000000000204007C1217000037
-:1000A00002040080221700000204008432170000BE
-:1000B00006040088000000050204009C12150000E0
-:1000C000020400A022150000020400A43215000062
-:1000D000060400A800000004020400B8021000009A
-:1000E000020400BC00100000020400C01010000058
-:1000F000020400C420100000020400C830100000F8
-:10010000060400CC00000004020400DC0010000023
-:10011000020400E012140000020400E422140000B3
-:10012000020400E832140000060400EC00000004A1
-:100130000104012400000000010401280000000067
-:100140000104012C00000000010401300000000047
-:1001500002040004000000FF02040008000000FF89
-:100160000204000C000000FF02040010000000FF69
-:1001700002040014000000FF02040018000000FF49
-:100180000204001C000000FF02040020000000FF29
-:10019000020400240000003E0204002800000000C9
-:1001A0000204002C0000003F020400300000003F69
-:1001B000020400340000003F020400380000000088
-:1001C0000204003C0000003F020400400000003F29
-:1001D000020400440000003F020420080000021155
-:1001E0000204200C0000020002042010000002049F
-:1001F00002042014000002190204201C0000FFFF6A
-:10020000020420200000FFFF020420240000FFFF62
-:10021000020420280000FFFF0604203800000080B0
-:100220000204223807FFFFFF0204223C0000003FC7
-:100230000204224007FFFFFF020422440000000FD7
-:1002400001042248000000000104224C00000000CC
-:1002500001042250000000000104225400000000AC
-:1002600001042258000000000104225C000000008C
-:10027000010422600000000001042264000000006C
-:1002800001042268000000000104226C000000004C
-:10029000010422700000000001042274000000002C
-:1002A00001042278000000000104227C000000000C
-:1002B000020424BC000000010C042000000003E83C
-:1002C0000A042000000000010B0420000000000AC6
-:1002D0000605400000000D0002050044000000205B
-:1002E00002050048000000320205009002150020BF
-:1002F000020500940215002002050098000000305D
-:100300000205009C08100000020500A00000003358
-:10031000020500A400000030020500A80000003122
-:10032000020500AC00000002020500B0000000055C
-:10033000020500B400000006020500B8000000023B
-:10034000020500BC00000002020500C00000000021
-:10035000020500C400000005020500C800000002FC
-:10036000020500CC00000002020500D000000002DF
-:10037000020500D400000001020501140000000184
-:100380000205011C0000000102050120000000021E
-:1003900002050204000000010205020C00000040FA
-:1003A00002050210000000400205021C00000020AF
-:1003B00002050220000000130205022400000020B4
-:1003C000060502400000000A04050280002000002B
-:1003D000020500500000000702050054000000075D
-:1003E00002050058000000000205005C0000000843
-:1003F0000605006000000004020500D800000006A9
-:10040000020500E00000000D020500E40000002DE0
-:10041000020500E800000000020500EC00000020DA
-:10042000020500F000000000020500F400000020BA
-:10043000020500F800000000020500FC000000209A
-:100440000205000400000001020500080000000190
-:100450000205000C00000001020500100000000170
-:100460000205001400000001020500180000000150
-:100470000205001C00000001020500200000000130
-:100480000205002400000001020500280000000110
-:100490000205002C000000010205003000000001F0
-:1004A00002050034000000010205003800000001D0
-:1004B0000205003C000000010205004000000001B0
-:1004C0000406100002000020020600DC000000010B
-:1004D000010600D80000000004060200000302200C
-:1004E000020600DC0000000002060068000000B800
-:1004F0000206007800000114010600B800000000A8
-:10050000010600C8000000000206006C000000B8F0
-:100510000206007C00000114010600BC000000007F
-:10052000010600CC0000000007180400007B00005A
-:100530000818076000140223071C00002A040000AA
-:10054000071C800032110A82071D00001E0C1707CD
-:10055000081D4550575602250118000000000000F4
-:10056000011800040000000001180008000000004D
-:100570000118000C0000000001180010000000002D
-:100580000118001400000000021800200000000103
-:1005900002180024000000020218002800000003D6
-:1005A0000218002C000000000218003000000004B7
-:1005B000021800340000000102180038000000009A
-:1005C0000218003C00000001021800400000000476
-:1005D000021800440000000002180048000000015A
-:1005E0000218004C00000003021800500000000038
-:1005F0000218005400000001021800580000000416
-:100600000218005C000000000218006000000001F9
-:1006100002180064000000030218006800000000D7
-:100620000218006C000000010218007000000004B5
-:100630000218007400000000021800780000000496
-:100640000218007C00000003061800800000000271
-:10065000021800A400003FFF021800A8000003FFDA
-:1006600002180224000000000218023400000000FA
-:100670000218024C00000000021802E4000000FF13
-:100680000618100000000400021B8BC000000001CF
-:10069000021B800000000034021B80400000001894
-:1006A000021B80800000000C021B80C000000020A4
-:1006B0000C1B83000007A1200A1B830000000138E7
-:1006C0000B1B8300000013880A1B834000000000FE
-:1006D0000C1B8340000001F40B1B8340000000054D
-:1006E000021B83800007A120021B83C0000001F4CD
-:1006F000061A100000000273041A19CC0001022728
-:10070000061A2008000000C8061A20000000000297
-:10071000041A499800040228061A2E280000000234
-:10072000061A2E2000000002061A0800000000022F
-:10073000061A080800000004061A08180000000243
-:10074000041A08B00002022C061A2FD0000000067E
-:10075000041A2FE80002022E041A2FC000040230EF
-:10076000041A300000010234061A300400000003AD
-:10077000041A301000010235061A3014000000037C
-:10078000041A302000010236061A3024000000034B
-:10079000041A303000010237061A3034000000031A
-:1007A000041A304000010238061A304400000003E9
-:1007B000041A305000010239061A305400000003B8
-:1007C000041A30600001023A061A30640000000387
-:1007D000041A30700001023B061A30740000000356
-:1007E000041A30800001023C061A30840000000325
-:1007F000041A30900001023D061A309400000003F4
-:10080000041A30A00001023E061A30A400000003C2
-:10081000041A30B00001023F061A30B40000000391
-:10082000041A30C000010240061A30C40000000360
-:10083000041A30D000010241061A30D4000000032F
-:10084000041A30E000010242061A30E400000003FE
-:10085000041A30F000010243061A30F400000003CD
-:10086000041A310000010244061A3104000000039A
-:10087000041A311000010245061A31140000000369
-:10088000041A312000010246061A31240000000338
-:10089000041A313000010247061A31340000000307
-:1008A000041A314000010248061A314400000003D6
-:1008B000041A315000010249061A315400000003A5
-:1008C000041A31600001024A061A31640000000374
-:1008D000041A31700001024B061A31740000000343
-:1008E000041A31800001024C061A31840000000312
-:1008F000041A31900001024D061A319400000003E1
-:10090000041A31A00001024E061A31A400000003AF
-:10091000041A31B00001024F061A31B4000000037E
-:10092000041A31C000010250061A31C4000000034D
-:10093000041A31D000010251061A31D4000000031C
-:10094000041A31E000010252061A31E400000003EB
-:10095000041A31F000010253061A31F400000003BA
-:10096000041A320000010254061A32040000000387
-:10097000041A321000010255061A32140000000356
-:10098000041A322000010256061A32240000000325
-:10099000041A323000010257061A323400000003F4
-:1009A000041A324000010258061A324400000003C3
-:1009B000041A325000010259061A32540000000392
-:1009C000041A32600001025A061A32640000000361
-:1009D000041A32700001025B061A32740000000330
-:1009E000041A32800001025C061A328400000003FF
-:1009F000041A32900001025D061A329400000003CE
-:100A0000041A32A00001025E061A32A4000000039C
-:100A1000041A32B00001025F061A32B4000000036B
-:100A2000041A32C000010260061A32C4000000033A
-:100A3000041A32D000010261061A32D40000000309
-:100A4000041A32E000010262061A32E400000003D8
-:100A5000041A32F000010263061A32F400000003A7
-:100A6000041A330000010264061A33040000000374
-:100A7000041A331000010265061A33140000000343
-:100A8000041A332000010266061A33240000000312
-:100A9000041A333000010267061A333400000003E1
-:100AA000041A334000010268061A334400000003B0
-:100AB000041A335000010269061A3354000000037F
-:100AC000041A33600001026A061A3364000000034E
-:100AD000041A33700001026B061A3374000000031D
-:100AE000041A33800001026C061A338400000003EC
-:100AF000041A33900001026D061A339400000003BB
-:100B0000041A33A00001026E061A33A40000000389
-:100B1000041A33B00001026F061A33B40000000358
-:100B2000041A33C000010270061A33C40000000327
-:100B3000041A33D000010271061A33D400000003F6
-:100B4000041A33E000010272061A33E400000003C5
-:100B5000041A33F000010273061A33F40000000394
-:100B6000041A340000010274061A34040000000361
-:100B7000041A341000010275061A34140000000330
-:100B8000041A342000010276061A342400000003FF
-:100B9000041A343000010277061A343400000003CE
-:100BA000041A344000010278061A3444000000039D
-:100BB000041A345000010279061A3454000000036C
-:100BC000041A34600001027A061A3464000000033B
-:100BD000041A34700001027B061A3474000000030A
-:100BE000041A34800001027C061A348400000003D9
-:100BF000041A34900001027D061A349400000003A8
-:100C0000041A34A00001027E061A34A40000000376
-:100C1000041A34B00001027F061A34B40000000345
-:100C2000041A34C000010280061A34C40000000314
-:100C3000041A34D000010281061A34D400000003E3
-:100C4000041A34E000010282061A34E400000003B2
-:100C5000041A34F000010283061A34F40000000381
-:100C6000041A350000010284061A3504000000034E
-:100C7000041A351000010285061A3514000000031D
-:100C8000041A352000010286061A352400000003EC
-:100C9000041A353000010287061A353400000003BB
-:100CA000041A354000010288061A3544000000038A
-:100CB000041A355000010289061A35540000000359
-:100CC000041A35600001028A061A35640000000328
-:100CD000041A35700001028B061A357400000003F7
-:100CE000041A35800001028C061A358400000003C6
-:100CF000041A35900001028D061A35940000000395
-:100D0000041A35A00001028E061A35A40000000363
-:100D1000041A35B00001028F061A35B40000000332
-:100D2000041A35C000010290061A35C40000000301
-:100D3000041A35D000010291061A35D400000003D0
-:100D4000041A35E000010292061A35E4000000039F
-:100D5000041A35F000010293061A35F4000000036E
-:100D6000041A360000010294061A3604000000033B
-:100D7000041A361000010295061A3614000000030A
-:100D8000041A362000010296061A362400000003D9
-:100D9000041A363000010297061A363400000003A8
-:100DA000041A364000010298061A36440000000377
-:100DB000041A365000010299061A36540000000346
-:100DC000041A36600001029A061A36640000000315
-:100DD000041A36700001029B061A367400000003E4
-:100DE000041A36800001029C061A368400000003B3
-:100DF000041A36900001029D061A36940000000382
-:100E0000041A36A00001029E061A36A40000000350
-:100E1000041A36B00001029F061A36B4000000031F
-:100E2000041A36C0000102A0061A36C400000003EE
-:100E3000041A36D0000102A1061A36D400000003BD
-:100E4000041A36E0000102A2061A36E4000000038C
-:100E5000041A36F0000102A3061A36F4000000035B
-:100E6000041A3700000102A4061A37040000000328
-:100E7000041A3710000102A5061A371400000003F7
-:100E8000041A3720000102A6061A372400000003C6
-:100E9000041A3730000102A7061A37340000000395
-:100EA000041A3740000102A8061A37440000000364
-:100EB000041A3750000102A9061A37540000000333
-:100EC000041A3760000102AA061A37640000000302
-:100ED000041A3770000102AB061A377400000003D1
-:100EE000041A3780000102AC061A378400000003A0
-:100EF000041A3790000102AD061A3794000000036F
-:100F0000041A37A0000102AE061A37A4000000033D
-:100F1000041A37B0000102AF061A37B4000000030C
-:100F2000041A37C0000102B0061A37C400000003DB
-:100F3000041A37D0000102B1061A37D400000003AA
-:100F4000041A37E0000102B2061A37E40000000379
-:100F5000041A37F0000102B3061A37F40000000348
-:100F6000041A3800000102B4061A38040000000315
-:100F7000041A3810000102B5061A381400000003E4
-:100F8000041A3820000102B6061A382400000003B3
-:100F9000041A3830000102B7061A38340000000382
-:100FA000041A3840000102B8061A38440000000351
-:100FB000041A3850000102B9061A38540000000320
-:100FC000041A3860000102BA061A386400000003EF
-:100FD000041A3870000102BB061A387400000003BE
-:100FE000041A3880000102BC061A3884000000038D
-:100FF000041A3890000102BD061A3894000000035C
-:10100000041A38A0000102BE061A38A4000000032A
-:10101000041A38B0000102BF061A38B400000003F9
-:10102000041A38C0000102C0061A38C400000003C8
-:10103000041A38D0000102C1061A38D40000000397
-:10104000041A38E0000102C2061A38E40000000366
-:10105000041A38F0000102C3061A38F40000000335
-:10106000041A3900000102C4061A39040000000302
-:10107000041A3910000102C5061A391400000003D1
-:10108000041A3920000102C6061A392400000003A0
-:10109000041A3930000102C7061A3934000000036F
-:1010A000041A3940000102C8061A3944000000033E
-:1010B000041A3950000102C9061A3954000000030D
-:1010C000041A3960000102CA061A396400000003DC
-:1010D000041A3970000102CB061A397400000003AB
-:1010E000041A3980000102CC061A3984000000037A
-:1010F000041A3990000102CD061A39940000000349
-:10110000041A39A0000102CE061A39A40000000317
-:10111000041A39B0000102CF061A39B400000003E6
-:10112000041A39C0000102D0061A39C400000003B5
-:10113000041A39D0000102D1061A39D40000000384
-:10114000041A39E0000102D2061A39E40000000353
-:10115000041A39F0000102D3061A39F40000000322
-:10116000041A3A00000102D4061A3A0400000003EF
-:10117000041A3A10000102D5061A3A1400000003BE
-:10118000041A3A20000102D6061A3A24000000038D
-:10119000041A3A30000102D7061A3A34000000035C
-:1011A000041A3A40000102D8061A3A44000000032B
-:1011B000041A3A50000102D9061A3A5400000003FA
-:1011C000041A3A60000102DA061A3A6400000003C9
-:1011D000041A3A70000102DB061A3A740000000398
-:1011E000041A3A80000102DC061A3A840000000367
-:1011F000041A3A90000102DD061A3A940000000336
-:10120000041A3AA0000102DE061A3AA40000000304
-:10121000041A3AB0000102DF061A3AB400000003D3
-:10122000041A3AC0000102E0061A3AC400000003A2
-:10123000041A3AD0000102E1061A3AD40000000371
-:10124000041A3AE0000102E2061A3AE40000000340
-:10125000041A3AF0000102E3061A3AF4000000030F
-:10126000041A3B00000102E4061A3B0400000003DC
-:10127000041A3B10000102E5061A3B1400000003AB
-:10128000041A3B20000102E6061A3B24000000037A
-:10129000041A3B30000102E7061A3B340000000349
-:1012A000041A3B40000102E8061A3B440000000318
-:1012B000041A3B50000102E9061A3B5400000003E7
-:1012C000041A3B60000102EA061A3B6400000003B6
-:1012D000041A3B70000102EB061A3B740000000385
-:1012E000041A3B80000102EC061A3B840000000354
-:1012F000041A3B90000102ED061A3B940000000323
-:10130000041A3BA0000102EE061A3BA400000003F1
-:10131000041A3BB0000102EF061A3BB400000003C0
-:10132000041A3BC0000102F0061A3BC4000000038F
-:10133000041A3BD0000102F1061A3BD4000000035E
-:10134000041A3BE0000102F2061A3BE4000000032D
-:10135000041A3BF0000102F3061A3BF400000003FC
-:10136000041A3C00000102F4061A3C0400000003C9
-:10137000041A3C10000102F5061A3C140000000398
-:10138000041A3C20000102F6061A3C240000000367
-:10139000041A3C30000102F7061A3C340000000336
-:1013A000041A3C40000102F8061A3C440000000305
-:1013B000041A3C50000102F9061A3C5400000003D4
-:1013C000041A3C60000102FA061A3C6400000003A3
-:1013D000041A3C70000102FB061A3C740000000372
-:1013E000041A3C80000102FC061A3C840000000341
-:1013F000041A3C90000102FD061A3C940000000310
-:10140000041A3CA0000102FE061A3CA400000003DE
-:10141000041A3CB0000102FF061A3CB400000003AD
-:10142000041A3CC000010300061A3CC4000000037B
-:10143000041A3CD000010301061A3CD4000000034A
-:10144000041A3CE000010302061A3CE40000000319
-:10145000041A3CF000010303061A3CF400000003E8
-:10146000041A3D0000010304061A3D0400000003B5
-:10147000041A3D1000010305061A3D140000000384
-:10148000041A3D2000010306061A3D240000000353
-:10149000041A3D3000010307061A3D340000000322
-:1014A000041A3D4000010308061A3D4400000003F1
-:1014B000041A3D5000010309061A3D5400000003C0
-:1014C000041A3D600001030A061A3D64000000038F
-:1014D000041A3D700001030B061A3D74000000035E
-:1014E000041A3D800001030C061A3D84000000032D
-:1014F000041A3D900001030D061A3D9400000003FC
-:10150000041A3DA00001030E061A3DA400000003CA
-:10151000041A3DB00001030F061A3DB40000000399
-:10152000041A3DC000010310061A3DC40000000368
-:10153000041A3DD000010311061A3DD40000000337
-:10154000041A3DE000010312061A3DE40000000306
-:10155000041A3DF000010313061A3DF400000003D5
-:10156000041A3E0000010314061A3E0400000003A2
-:10157000041A3E1000010315061A3E140000000371
-:10158000041A3E2000010316061A3E240000000340
-:10159000041A3E3000010317061A3E34000000030F
-:1015A000041A3E4000010318061A3E4400000003DE
-:1015B000041A3E5000010319061A3E5400000003AD
-:1015C000041A3E600001031A061A3E64000000037C
-:1015D000041A3E700001031B061A3E74000000034B
-:1015E000041A3E800001031C061A3E84000000031A
-:1015F000041A3E900001031D061A3E9400000003E9
-:10160000041A3EA00001031E061A3EA400000003B7
-:10161000041A3EB00001031F061A3EB40000000386
-:10162000041A3EC000010320061A3EC40000000355
-:10163000041A3ED000010321061A3ED40000000324
-:10164000041A3EE000010322061A3EE400000003F3
-:10165000041A3EF000010323061A3EF400000003C2
-:10166000041A3F0000010324061A3F04000000038F
-:10167000041A3F1000010325061A3F14000000035E
-:10168000041A3F2000010326061A3F24000000032D
-:10169000041A3F3000010327061A3F3400000003FC
-:1016A000041A3F4000010328061A3F4400000003CB
-:1016B000041A3F5000010329061A3F54000000039A
-:1016C000041A3F600001032A061A3F640000000369
-:1016D000041A3F700001032B061A3F740000000338
-:1016E000041A3F800001032C061A3F840000000307
-:1016F000041A3F900001032D061A3F9400000003D6
-:10170000041A3FA00001032E061A3FA400000003A4
-:10171000041A3FB00001032F061A3FB40000000373
-:10172000041A3FC000010330061A3FC40000000342
-:10173000041A3FD000010331061A3FD40000000311
-:10174000041A3FE000010332061A3FE400000007DC
-:10175000041A4CB000080333061A400000000124AC
-:10176000021A492000000000061A2500000000109F
-:10177000061A258000000012061A09C00000004861
-:10178000061A080000000002061A082000000012D5
-:10179000041A2FB00002033B041A4CF00002033D70
-:1017A000061A500000000004061A449000000124AC
-:1017B000021A492400000000061A2540000000100B
-:1017C000061A25C800000012061A0AE000000048A8
-:1017D000061A081000000002061A0868000000122D
-:1017E000041A2FB80002033F041A4CF80002034108
-:1017F000061A5010000000040200A468000AFFDC72
-:101800000200A280000000010200A294071D29111D
-:101810000200A298000000000200A29C009C042488
-:101820000200A2A0000000000200A2A40000020921
-:101830000200A4FCFF000000020100B4000000014F
-:10184000020100B800000001020100DC00000001FC
-:10185000020101000000000102010104000000017A
-:101860000201007C0030000002010084000000281A
-:101870000201008C000000000201013000000004A1
-:101880000201025C000000010201032800000000C8
-:101890000201055400000030020100C400000001F4
-:1018A000020100CC00000001020100F8000000016C
-:1018B000020100F000000001020100800030000081
-:1018C00002010088000000280201009000000000D2
-:1018D0000201013400000004020102DC00000001EA
-:1018E0000201032C0000000002010564000000302A
-:1018F000020100C800000001020100D00000000148
-:10190000020100FC00000001020100F400000001DF
-:10191000020C100000000028020C200800000A1130
-:10192000020C200C00000A00020C201000000A0427
-:10193000020C201C0000FFFF020C20200000FFFF13
-:10194000020C20240000FFFF020C20280000FFFFF3
-:10195000020C203800000020020C203C0000002176
-:10196000020C204000000022020C20440000002352
-:10197000020C204800000024020C204C000000252E
-:10198000020C205000000026020C2054000000270A
-:10199000020C205800000028020C205C00000029E6
-:1019A000020C20600000002A020C20640000002BC2
-:1019B000020C20680000002C020C206C0000002D9E
-:1019C000020C20700000002E020C20740000002F7A
-:1019D000020C207800000010060C207C0000004F54
-:1019E000020C21B800000001020C21BC0000000123
-:1019F000020C21C000000001020C21C40000000103
-:101A0000020C21C800000001020C21CC00000001E2
-:101A1000020C21D000000001020C21D400000001C2
-:101A2000020C21D800000001020C21DC00000001A2
-:101A3000020C21E000000001020C21E40000000182
-:101A4000020C21E800000001020C21EC0000000162
-:101A5000020C21F000000001020C21F40000000142
-:101A6000020C21F800000001060C21FC0000000F10
-:101A7000020C223807FFFFFF020C223C0000003F4F
-:101A8000020C224007FFFFFF020C22440000000F5F
-:101A9000010C224800000000010C224C0000000054
-:101AA000010C225000000000010C22540000000034
-:101AB000010C225800000000010C225C0000000014
-:101AC000010C226000000000010C226400000000F4
-:101AD000010C226800000000010C226C00000000D4
-:101AE000010C227000000000010C227400000000B4
-:101AF000010C227800000000010C227C0000000094
-:101B0000020C24BC000000010C0C2000000003E8C3
-:101B10000A0C2000000000010B0C20000000000A4D
-:101B2000020C400800000562020C400C0000055148
-:101B3000020C401000000555020C40140000057214
-:101B4000020C401C0000FFFF020C40200000FFFFC1
-:101B5000020C40240000FFFF020C40280000FFFFA1
-:101B6000020C403800000046020C403C0000000C13
-:101B7000060C40400000005E020C41B8000000016D
-:101B8000060C41BC0000001F020C423807FFFFFF9B
-:101B9000020C423C0000003F020C424007FFFFFFE6
-:101BA000020C42440000000F010C424800000000FB
-:101BB000010C424C00000000010C425000000000EB
-:101BC000010C425400000000010C425800000000CB
-:101BD000010C425C00000000010C426000000000AB
-:101BE000010C426400000000010C4268000000008B
-:101BF000010C426C00000000010C4270000000006B
-:101C0000010C427400000000010C4278000000004A
-:101C1000010C427C00000000010C4280000000002A
-:101C2000020C44C0000000010C0C4000000003E85E
-:101C30000A0C4000000000010B0C40000000000AEC
-:101C4000060D400000000A00020D004400000032B2
-:101C5000020D008C02150020020D009002150020DC
-:101C6000020D009408100000020D009800000033DF
-:101C7000020D009C00000002020D00A00000000008
-:101C8000020D00A400000005020D00A800000005E0
-:101C9000060D00AC00000002020D00B400000002BE
-:101CA000020D00B800000003020D00BC000000029D
-:101CB000020D00C000000001020D00C8000000027B
-:101CC000020D00CC00000002020D015C00000001CA
-:101CD000020D016400000001020D01680000000215
-:101CE000020D020400000001020D020C00000020A1
-:101CF000020D021000000040020D0214000000401E
-:101D0000020D022000000003020D02240000001852
-:101D1000060D028000000012040D030000180343AA
-:101D2000060D03600000000C020D004C00000001D5
-:101D3000020D005000000002020D005400000000DF
-:101D4000020D005800000008060D005C00000004B1
-:101D5000020D00C400000004020D0114000000097F
-:101D6000020D011800000029020D011C0000000AEC
-:101D7000020D01200000002A020D012400000000D5
-:101D8000020D012800000020020D012C00000000BF
-:101D9000020D013000000020020D0134000000009F
-:101DA000020D013800000020020D013C000000007F
-:101DB000020D014000000020020D0144000000005F
-:101DC000020D014800000020020D00040000000187
-:101DD000020D000800000001020D000C00000001CF
-:101DE000020D001000000001020D001400000001AF
-:101DF000020D001800000001020D001C000000018F
-:101E0000020D002000000001020D0024000000016E
-:101E1000020D002800000001020D002C000000014E
-:101E2000020D003000000001020D0034000000012E
-:101E3000020D003800000001020D003C000000010E
-:101E4000060E200000000800020E004C00000032C8
-:101E5000020E009402150020020E009802150020C8
-:101E6000020E009C00000030020E00A008100000CE
-:101E7000020E00A400000033020E00A80000003093
-:101E8000020E00AC00000031020E00B000000002A3
-:101E9000020E00B400000004020E00B800000000B2
-:101EA000020E00BC00000002020E00C00000000292
-:101EB000020E00C400000000020E00C80000000274
-:101EC000020E00CC00000007020E00D0000000024D
-:101ED000020E00D400000002020E00D80000000133
-:101EE000020E014400000001020E014C000000013E
-:101EF000020E015000000002020E02040000000168
-:101F0000020E020C00000040020E02100000004011
-:101F1000020E021C00000004020E0220000000203D
-:101F2000020E02240000000E020E02280000001B18
-:101F3000060E030000000012040E0280001B035B6B
-:101F4000060E02EC00000005020E00540000000C1A
-:101F5000020E00580000000C020E005C00000000A1
-:101F6000020E006000000010060E00640000000475
-:101F7000020E00DC00000003020E01100000000F42
-:101F8000020E01140000002F020E011800000000D4
-:101F9000020E011C00000020020E000400000001DF
-:101FA000020E000800000001020E000C00000001FB
-:101FB000020E001000000001020E001400000001DB
-:101FC000020E001800000001020E001C00000001BB
-:101FD000020E002000000001020E0024000000019B
-:101FE000020E002800000001020E002C000000017B
-:101FF000020E003000000001020E0034000000015B
-:10200000020E003800000001020E003C000000013A
-:10201000020E004000000001020E0044000000011A
-:102020000730040000AF0000083007680013037693
-:10203000073400003305000007348000327F0CC2F3
-:10204000073500001A951962083539E058C403783D
-:10205000013000000000000001300004000000001A
-:1020600001300008000000000130000C00000000FA
-:1020700001300010000000000130001400000000DA
-:1020800002300020000000010230002400000002A5
-:1020900002300028000000030230002C0000000085
-:1020A0000230003000000004023000340000000163
-:1020B00002300038000000000230003C0000000147
-:1020C0000230004000000004023000440000000024
-:1020D00002300048000000010230004C0000000304
-:1020E00002300050000000000230005400000001E7
-:1020F00002300058000000040230005C00000000C4
-:1021000002300060000000010230006400000003A3
-:1021100002300068000000000230006C0000000186
-:102120000230007000000004023000740000000063
-:1021300002300078000000040230007C0000000340
-:102140000630008000000002023000A400003FFFC3
-:10215000023000A8000003FF02300224000000004B
-:1021600002300234000000000230024C0000000087
-:10217000023002E40000FFFF0630200000000800EB
-:1021800002338BC000000001023380000000001AFF
-:10219000023380400000004E0233808000000010B7
-:1021A000023380C0000000200C3383000007A12010
-:1021B0000A338300000001380B33830000001388CA
-:1021C0000A338340000000000C338340000001F418
-:1021D0000B33834000000005023383800007A120F9
-:1021E000023383C0000001F406322A88000000C2D6
-:1021F00006322008000000C806322000000000025D
-:10220000063223E80000004004322E580004037A0E
-:10221000063250A000000004063250B80000000250
-:102220000632508000000006043250980002037EFF
-:10223000063250000000002006323000000004008A
-:1022400006321C0000000004043218300002038033
-:10225000063224E8000000B402322DB00000000075
-:1022600006324000000000B40632300000000020BA
-:10227000063231000000002006323200000000204B
-:102280000632330000000020063234000000002037
-:102290000632350000000020063236000000002023
-:1022A000063237000000002006323800000000200F
-:1022B000063239000000002006323A0000000020FB
-:1022C00006323B000000002006323C0000000020E7
-:1022D00006323D000000002006323E0000000020D3
-:1022E00006323F000000002006321C1000000002F1
-:1022F000063245A000000024063227B8000000B4D2
-:1023000002322DB400000000063242D0000000B4BA
-:1023100006323080000000200632318000000020AC
-:102320000632328000000020063233800000002098
-:102330000632348000000020063235800000002084
-:102340000632368000000020063237800000002070
-:10235000063238800000002006323980000000205C
-:1023600006323A800000002006323B800000002048
-:1023700006323C800000002006323D800000002034
-:1023800006323E800000002006323F800000002020
-:1023900006321C20000000020632463000000024F5
-:1023A0000720040000870000082007800010038237
-:1023B000072400003165000007248000081D0C5A26
-:1023C00008248EB06C9003840120000000000000FF
-:1023D00001200004000000000120000800000000AF
-:1023E0000120000C0000000001200010000000008F
-:1023F0000120001400000000022000200000000165
-:102400000220002400000002022000280000000337
-:102410000220002C00000000022000300000000418
-:1024200002200034000000010220003800000000FB
-:102430000220003C000000010220004000000004D7
-:1024400002200044000000000220004800000001BB
-:102450000220004C00000003022000500000000099
-:102460000220005400000001022000580000000477
-:102470000220005C0000000002200060000000015B
-:102480000220006400000003022000680000000039
-:102490000220006C00000001022000700000000417
-:1024A00002200074000000000220007800000004F8
-:1024B0000220007C000000030620008000000002D3
-:1024C000022000A400003FFF022000A8000003FF3C
-:1024D000022002240000000002200234000000005C
-:1024E0000220024C00000000022002E40000FFFF76
-:1024F000062020000000080002238BC0000000011D
-:10250000022380000000001002238040000000121F
-:102510000223808000000030022380C00000000EF3
-:102520000C2383000007A1200A2383000000013848
-:102530000B238300000013880A238340000000005F
-:102540000C238340000001F40B23834000000005AE
-:10255000022383800007A120022383C0000001F42E
-:10256000062250000000004206222008000000C899
-:10257000062220000000000206224000000000C6E3
-:1025800004224318000503860622432C0000000B9A
-:10259000042243580005038B0622436C0000000B05
-:1025A0000422439800050390062243AC0000000B70
-:1025B000042243D800050395062243EC0000000BDB
-:1025C000042244180005039A0622442C0000000B44
-:1025D000042244580005039F0622446C0000000BAF
-:1025E00004224498000503A4062244AC0000000B1A
-:1025F000042244D8000503A9062244EC0000000B85
-:1026000004224518000503AE0622452C0000000BED
-:1026100004224558000503B30622456C0000000B58
-:1026200004224598000503B8062245AC0000000BC3
-:10263000042245D8000503BD062245EC0000000B2E
-:1026400004224618000503C20622462C0000000B97
-:1026500004224658000503C70622466C0000000B02
-:1026600004224698000503CC062246AC0000000B6D
-:10267000042246D8000503D1062246EC0000000BD8
-:1026800004224718000503D60622472C0000000B41
-:1026900004224758000503DB0622476C0000000BAC
-:1026A00004224798000503E0062247AC0000000B17
-:1026B000042247D8000503E5062247EC0000000B82
-:1026C00004224818000503EA0622482C0000000BEB
-:1026D00004224858000503EF0622486C0000000B56
-:1026E00004224898000503F4062248AC0000000BC1
-:1026F000042248D8000503F9062248EC0000000B2C
-:1027000004224918000503FE0622492C0000000B94
-:1027100004224958000504030622496C0000000BFE
-:102720000422499800050408062249AC0000000B69
-:10273000042249D80005040D062249EC0000000BD4
-:1027400004224A180005041206224A2C0000000B3D
-:1027500004224A580005041706224A6C0000000BA8
-:1027600004224A980005041C06224AAC0000000B13
-:1027700004224AD80005042106224AEC0000000584
-:1027800006224B000000001704224B5C00010426C7
-:1027900006224B600000000304224B6C000104275A
-:1027A000062238000000004006223000000002002F
-:1027B000042251C00004042806221000000000C0BA
-:1027C000062215C00000024004221EC80008042C86
-:1027D0000622390000000008022251180000000003
-:1027E000062251D00000000606221300000000025D
-:1027F00006221410000000300622392000000008D4
-:102800000222511C00000000062251E800000006D0
-:102810000622130800000002062214D00000003037
-:102820000216100000000028021700080000000235
-:102830000217002C000000030217003C00000004F7
-:1028400002170044000000000217004800000002C8
-:102850000217004C0000009002170050000000908A
-:102860000217005400800090021700580810000062
-:10287000021700600000008A021700640000008058
-:1028800002170068000000810217006C0000008041
-:10289000021700700000000602170078000007D041
-:1028A0000217007C0000076C02170038007C10043F
-:1028B000021700040000000F06164024000000026A
-:1028C000021640700000001C0216420800000001C1
-:1028D0000216421000000001021642200000000112
-:1028E00002164228000000010216423000000001DA
-:1028F000021642380000000102164260000000018A
-:102900000C16401C0003D0900A16401C0000009CCE
-:102910000B16401C000009C40216403000000008DD
-:10292000021640340000000C02164038000000106F
-:102930000216404400000020021640000000000182
-:10294000021640D8000000010216400800000001F5
-:102950000216400C000000010216401000000001A9
-:10296000021642400000000002164248000000002B
-:1029700006164270000000020216425000000000DD
-:1029800002164258000000000616428000000002B5
-:1029900002166008000006140216600C0000060013
-:1029A00002166010000006040216601C0000FFFF03
-:1029B000021660200000FFFF021660240000FFFFE7
-:1029C000021660280000FFFF021660380000002099
-:1029D0000216603C00000020061660400000000265
-:1029E00002166048000000230216604C000000241C
-:1029F00002166050000000250216605400000026F8
-:102A000002166058000000270216605C00000029D2
-:102A1000021660600000002A021660640000002BAD
-:102A2000021660680000002C0216606C0000002D89
-:102A30000616607000000012021660B80000000167
-:102A4000021660BC00000001061660C00000003ED7
-:102A5000021661B800000001061661BC0000001FEC
-:102A60000216623807FFFFFF0216623C0000003FBB
-:102A70000216624007FFFFFF021662440000000FCB
-:102A800001166248000000000116624C00000000C0
-:102A900001166250000000000116625400000000A0
-:102AA00001166258000000000116625C0000000080
-:102AB0000116626000000000011662640000000060
-:102AC00001166268000000000116626C0000000040
-:102AD0000116627000000000011662740000000020
-:102AE00001166278000000000116627C0000000000
-:102AF000021664BC000000010C166000000003E830
-:102B00000A166000000000010B1660000000000AB9
-:102B100002168040000000060216804400000005F6
-:102B2000021680480000000A0216804C00000005D2
-:102B30000216805400000002021680CC000000043F
-:102B4000021680D000000004021680D400000004A9
-:102B5000021680D800000004021680DC0000000489
-:102B6000021680E000000004021680E40000000469
-:102B7000021680E800000004021688040000000429
-:102B8000021680300000007C021680340000003DF8
-:102B9000021680380000003F0216803C0000009CB6
-:102BA000021680F000000007061680F40000000501
-:102BB0000216880C010101010216810800000000C4
-:102BC0000216810C000000040216811000000004AF
-:102BD0000216811400000002021688100801200469
-:102BE00002168118000000050216811C0000000575
-:102BF0000216812000000005021681240000000555
-:102C00000216882C200810010216812800000008F6
-:102C10000216812C00000006021681300000000719
-:102C200002168134000000000216883001010120E4
-:102C300006168138000000040216883401010101E3
-:102C400006168148000000040216883801010101BF
-:102C500006168158000000040216883C010101019B
-:102C6000061681680000000302168174000000014E
-:102C7000021688400101010102168178000000015E
-:102C80000216817C00000001021681800000000114
-:102C9000021681840000000102168844010101012E
-:102CA00002168188000000010216818C00000004D9
-:102CB00002168190000000040216819400000002B8
-:102CC00002168848080120040216819800000005B9
-:102CD0000216819C00000005021681A0000000057C
-:102CE000021681A4000000050216881420081001B5
-:102CF000021681A800000008021681AC0000000640
-:102D0000021681B000000007021681B40000000125
-:102D10000216881801010120021681B80000000186
-:102D2000021681BC00000001021681C000000001F3
-:102D3000021681C4000000010216881C0101010175
-:102D4000021681C800000001021681CC00000001BB
-:102D5000021681D000000001021681D4000000019B
-:102D60000216882001010101021681D8000000012D
-:102D7000021681DC00000001021681E00000000163
-:102D8000021681E4000000010216882401010101FD
-:102D9000021681E800000001021681EC000000012B
-:102DA000021681F0000000010216882801010101CD
-:102DB00002168240FFFF003F061682440000000218
-:102DC0000216824CFFFF003F0216825000000100F5
-:102DD000021682540000010006168258000000020C
-:102DE00002168260000000C002168264000000C06B
-:102DF0000216826800001E000216826C00001E008F
-:102E0000021682700000400002168274000040002A
-:102E100002168278000080000216827C000080008A
-:102E2000021682800000200002168284000020002A
-:102E30000616828800000007021682A40000000126
-:102E4000061682A80000000A021681F400000C0891
-:102E5000021681F800000040021681FC000001000B
-:102E600002168200000000200216820400000017F3
-:102E700002168208000000800216820C0000020088
-:102E8000021682100000000002168218FFFF01FFE8
-:102E900002168214FFFF01FF0216823C000000139D
-:102EA000021680900000013F021680600000014081
-:102EB00002168064000001400616806800000002CF
-:102EC00002168070000000C0061680740000000723
-:102ED0000216809C00000048021680A000000048F6
-:102EE000061680A400000002021680AC0000004814
-:102EF000061680B00000000702168238000080002D
-:102F000002168234000025E40216809400007FFF40
-:102F100002168220000000070216821C0000000733
-:102F2000021682280000000002168224FFFFFFFF25
-:102F300002168230000000000216822CFFFFFFFF05
-:102F4000021680EC000000FF0214000000000001E7
-:102F50000214000C000000010214004000000001F7
-:102F60000214004400007FFF0214000C0000000067
-:102F700002140000000000000214006C00000000B9
-:102F800002140004000000010214003000000001DF
-:102F900002140004000000000214005C00000000A5
-:102FA00002140008000000010214003400000001B7
-:102FB000021400080000000002140060000000007D
-:102FC00006028000000020000202005800000032CB
-:102FD000020200A003150020020200A40315002035
-:102FE000020200A801000030020200AC081000003C
-:102FF000020200B000000033020200B40000003002
-:10300000020200B800000031020200BC0000000310
-:10301000020200C000000006020200C4000000031B
-:10302000020200C800000003020200CC00000002FF
-:10303000020200D000000000020200D400000002E2
-:10304000020200DC00000000020200E000000006B6
-:10305000020200E400000004020200E80000000296
-:10306000020200EC00000002020200F00000000179
-:10307000020200FC00000006020201200000000025
-:103080000202013400000002020201B0000000014F
-:103090000202020C00000001020202140000000102
-:1030A00002020218000000020202040400000001F3
-:1030B0000202040C00000040020204100000004064
-:1030C0000202041C00000004020204200000002090
-:1030D0000202042400000002020204280000001F73
-:1030E00006020500000000120402048000200434DF
-:1030F000020200600000000F0202006400000007EE
-:1031000002020068000000000202006C0000000ED5
-:103110000602007000000004020200F40000000437
-:103120000202000400000001020200080000000189
-:103130000202000C00000001020200100000000169
-:103140000202001400000001020200180000000149
-:103150000202001C00000001020200200000000129
-:103160000202002400000001020200280000000109
-:103170000202002C000000010202003000000001E9
-:1031800002020034000000010202003800000001C9
-:103190000202003C000000010202004000000001A9
-:1031A0000202004400000001020200480000000189
-:1031B0000202004C00000001020200500000000169
-:1031C00002020108000000C802020118000000020B
-:1031D000020201C400000000020201CC0000000055
-:1031E000020201D400000002020201DC0000000221
-:1031F000020201E4000000FF020201EC000000FFF7
-:103200000202010C000000C80202011C00000002C2
-:10321000020201C800000000020201D0000000000C
-:10322000020201D800000002020201E000000002D8
-:10323000020201E8000000FF020201F0000000FFAE
-:1032400007280400008E00000828076800130454B3
-:10325000072C000033C80000072C800038050CF351
-:10326000072D000038B61AF5072D800007762923B0
-:10327000082D8CB04E6A04560128000000000000A2
-:1032800001280004000000000128000800000000E0
-:103290000128000C000000000128001000000000C0
-:1032A0000128001400000000022800200000000196
-:1032B0000228002400000002022800280000000369
-:1032C0000228002C0000000002280030000000044A
-:1032D000022800340000000102280038000000002D
-:1032E0000228003C00000001022800400000000409
-:1032F00002280044000000000228004800000001ED
-:103300000228004C000000030228005000000000CA
-:1033100002280054000000010228005800000004A8
-:103320000228005C0000000002280060000000018C
-:10333000022800640000000302280068000000006A
-:103340000228006C00000001022800700000000448
-:103350000228007400000000022800780000000429
-:103360000228007C00000003062800800000000204
-:10337000022800A400003FFF022800A8000003FF6D
-:10338000022802240000000002280234000000008D
-:103390000228024C00000000022802E40000FFFFA7
-:1033A0000628200000000800022B8BC0000000014E
-:1033B000022B800000000000022B8040000000185B
-:1033C000022B80800000000C022B80C000000066F1
-:1033D0000C2B83000007A1200A2B8300000001387A
-:1033E0000B2B8300000013880A2B83400000000091
-:1033F0000C2B8340000001F40B2B834000000005E0
-:10340000022B83800007A120022B83C0000001F45F
-:10341000062A3D4800000004042A3D5800020458D2
-:10342000062A3D6000000006062A30000000004821
-:10343000062A2008000000C8062A2000000000021A
-:10344000062A31280000008E062A33680000000397
-:10345000042A33740001045A062A3A780000000254
-:10346000042A3A800002045B042A3A700002045DD8
-:10347000042A3E280002045F042A3EB000040461CE
-:10348000042A250000020465062A25080000010020
-:10349000062A297000000004042A29600004046739
-:1034A000042A2F480002046B062A3378000000D853
-:1034B000022A3A3800000000062A3A88000000324A
-:1034C000042A3D880010046D062A502000000002E6
-:1034D000062A503000000002062A500000000002B8
-:1034E000062A501000000002022A50B80000000115
-:1034F000062A50480000000E042A3D780002047D90
-:10350000062A3C1800000026022A50400000000055
-:10351000062A36D8000000D8022A3A3C00000000F3
-:10352000062A3B5000000032042A3DC80010047FE8
-:10353000062A502800000002062A50380000000227
-:10354000062A500800000002062A50180000000257
-:10355000022A50BC00000001062A50800000000E24
-:10356000042A3D800002048F062A3CB00000002699
-:10357000022A504400000000021010080000000160
-:103580000210101000000264021010000003D000AE
-:10359000021010040000003D091018000200049100
-:1035A00009101100001006910610114000000008DB
-:1035B00009101160000806A1061011800000000229
-:1035C00009101188000606A9061011A000000018B5
-:1035D000021010100000000006102400000000E09F
-:1035E0000210201C0000000002102020000000013A
-:1035F000021020C0000000010210200400000001A1
-:10360000021020080000000109103C00000506AF70
-:1036100009103C20000506B409103800000506B961
-:1036200002104028000000100210404400003FFF3C
-:103630000210405800280000021040840084924A82
-:1036400006104C000000010002104058000000006D
-:103650000610806800000004021080000000108046
-:1036600006108028000000020210803800000010C0
-:10367000021080400000FFFF021080440000FFFFA6
-:1036800002108050000000000210810000000000C5
-:10369000061081200000000202108008000002B520
-:1036A0000210801000000000061082000000004A96
-:1036B000021081080001FFFF061081400000000297
-:1036C0000210800000001A80061090000000002404
-:1036D000061091200000004A061093700000004A76
-:1036E000061095C00000004A0210800400001080FF
-:1036F00006108030000000020210803C0000001024
-:10370000021080480000FFFF0210804C0000FFFF05
-:10371000021080540000000002108104000000002C
-:1037200006108128000000020210800C000002B583
-:103730000210801400000000061084000000004AFF
-:103740000210810C0001FFFF0610814800000002FA
-:103750000210800400001A800610909000000024DF
-:10376000061092480000004A061094980000004A93
-:10377000061096E80000004A0212049000E383401D
-:103780000212051400003C10021205200000000285
-:1037900002120494FFFFFFFF02120498FFFFFFFFD5
-:1037A0000212049CFFFFFFFF021204A0FFFFFFFFB5
-:1037B000021204A4FFFFFFFF021204A8FFFFFFFF95
-:1037C000021204ACFFFFFFFF021204B0FFFFFFFF75
-:1037D000021204B8FFFFFFFF021204BCFFFFFFFF4D
-:1037E000021204C0FFFFFFFF021204C4FFFFFFFF2D
-:1037F000021204C8FFFFFFFF021204CCFFFFFFFF0D
-:10380000021204D0FFFFFFFF021204DCFFFFFFFFE4
-:10381000021204E0FFFFFFFF021204E4FFFFFFFFBC
-:10382000021204E8FFFFFFFF021204ECFFFFFFFF9C
-:10383000021204F0FFFFFFFF021204F4FFFFFFFF7C
-:10384000021204F8FFFFFFFF021204FCFFFFFFFF5C
-:1038500002120500FFFFFFFF02120504FFFFFFFF3A
-:1038600002120508FFFFFFFF0212050CFFFFFFFF1A
-:1038700002120510FFFFFFFF021204D4FFFF3330D6
-:10388000021204D8FFFF3340021204B4F0003000EB
-:1038900002120390000000080212039C00000008BE
-:1038A000061203A000000002021203BC0000000484
-:1038B000021203C400000004021203D00000000042
-:1038C000021203DC000000000212036C0000000181
-:1038D000021203680000003F021201BC0000004019
-:1038E000021201C000001808021201C400000803FF
-:1038F000021201C800000803021201CC00000040BF
-:10390000021201D000000003021201D400000803DB
-:10391000021201D800000803021201DC00000803B3
-:10392000021201E000010003021201E4000008039A
-:10393000021201E800000803021201EC000000037B
-:10394000021201F000000003021201F40000000363
-:10395000021201F800000003021201FC0000000343
-:103960000212020000000003021202040000000321
-:1039700002120208000000030212020C0000000301
-:1039800002120210000000030212021400000003E1
-:1039900002120218000000030212021C00000003C1
-:1039A00002120220000000030212022400000003A1
-:1039B00002120228000024030212022C0000002F31
-:1039C0000212023000000009021202340000001945
-:1039D00002120238000001840212023C000001833E
-:1039E0000212024000000306021202440000001905
-:1039F00002120248000000060212024C00000306F8
-:103A000002120250000003060212025400000306D4
-:103A10000212025800000C860212025C000003062B
-:103A20000212026000000306021202640000000697
-:103A300002120268000000060212026C000000067A
-:103A4000021202700000000602120274000000065A
-:103A500002120278000000060212027C000000063A
-:103A6000021202800000000602120284000000061A
-:103A700002120288000000060212028C00000006FA
-:103A800002120290000000060212029400000006DA
-:103A900002120298000000060212029C00000006BA
-:103AA000021202A000000306021202A4000000138A
-:103AB000021202A800000006021202B00000100468
-:103AC000021202B400001004021203240010644029
-:103AD0000212032800106440021201B0000000012D
-:103AE0000600A000000000160200A06CBF5C0000F1
-:103AF0000200A070FFF51FEF0200A0740000FFFF9E
-:103B00000200A078F00003E00200A07C00000000AA
-:103B10000200A0800000A0000600A08400000005B4
-:103B20000200A0980FE000000600A09C0000001416
-:103B30000200A0EC555400000200A0F05555555568
-:103B40000200A0F4000055550200A0F8F0000000AB
-:103B50000200A0FC555400000200A1005555555527
-:103B60000200A104000055550200A108F000000069
-:103B70000600A22C000000040200A0600000030761
-:103B80000200A10CBF5C00000200A110FFF51FEFB6
-:103B90000200A1140000FFFF0200A118F00003E0E2
-:103BA0000200A11C000000000200A1200000A000F3
-:103BB0000600A124000000050200A1380FE000006B
-:103BC0000600A13C000000140200A18C5554000026
-:103BD0000200A190555555550200A194000055557D
-:103BE0000200A198F00000000200A19C55540000C2
-:103BF0000200A1A0555555550200A1A4000055553D
-:103C00000200A1A8F00000000600A23C0000000491
-:103C10000200A06400000307000000000000000094
-:103C20000000002E00000000000000000000000066
-:103C30000000000000000000000000000000000084
-:103C40000000000000000000000000000000000074
-:103C50000000000000000000000000000000000064
-:103C60000000000000000000000000000000000054
-:103C70000000000000000000002E004D00000000C9
-:103C80000000000000000000000000000000000034
-:103C90000000000000000000000000000000000024
-:103CA00000000000004D008B00000000000000003C
-:103CB0000000000000000000000000000000000004
-:103CC00000000000000000000000000000000000F4
-:103CD000008B009000900094009400980000000079
-:103CE00000000000000000000000000000000000D4
-:103CF000000000000000000000000000009802DE4C
-:103D000002DE02E802E802F200000000000000000B
-:103D100000000000000000000000000000000000A3
-:103D20000000000000000000000000000000000093
-:103D30000000000000000000000000000000000083
-:103D40000000000000000000000000000000000073
-:103D50000000000000000000000000000000000063
-:103D60000000000000000000000000000000000053
-:103D70000000000000000000000000000000000043
-:103D80000000000000000000000000000000000033
-:103D90000000000000000000000000000000000023
-:103DA0000000000000000000000000000000000013
-:103DB0000000000000000000000000000000000003
-:103DC00000000000000000000000000000000000F3
-:103DD000000000000000000002F202FA00000000F3
-:103DE00000000000000000000000000000000000D3
-:103DF00000000000000000000000000000000000C3
-:103E000000000000000000000000000000000000B2
-:103E100000000000000000000000000000000000A2
-:103E20000000000000000000000000000000000092
-:103E300002FA02FF02FF030A030A03150000000052
-:103E40000000000000000000000000000000000072
-:103E50000000000000000000000000000000000062
-:103E60000000000000000000000000000000000052
-:103E70000000000000000000000000000000000042
-:103E80000000000000000000031503160000000001
-:103E90000000000000000000000000000000000022
-:103EA0000000000000000000000000000000000012
-:103EB000000000000316035700000000000000008F
-:103EC00000000000000000000000000000000000F2
-:103ED00000000000000000000000000000000000E2
-:103EE0000357037B000000000000000000000000FA
-:103EF00000000000000000000000000000000000C2
-:103F0000000000000000000000000000037B03BB75
-:103F100000000000000000000000000000000000A1
-:103F20000000000000000000000000000000000091
-:103F3000000000000000000003BB03F700000000C9
-:103F40000000000000000000000000000000000071
-:103F50000000000000000000000000000000000061
-:103F60000000000003F7043D043D045204520467BE
-:103F70000000000000000000000000000000000041
-:103F80000000000000000000000000000000000031
-:103F9000046704ED04ED04F204F204F700000000ED
-:103FA0000000000000000000000000000000000011
-:103FB00000000000000000000000000004F704F80A
-:103FC00000000000000000000000000000000000F1
-:103FD00000000000000000000000000000000000E1
-:103FE000000000000000000004F8050A00000000C6
-:103FF00000000000000000000000000000000000C1
-:1040000000000000000000000000000000000000B0
-:1040100000000000050A051F051F052205220525D1
-:104020000000000000000000000000000000000090
-:104030000000000000000000000000000000000080
-:1040400005250555000000000000000000000000EC
-:104050000000000000000000000000000000000060
-:10406000000000000000000000000000055505DC15
-:104070000000000000000000000000000000000040
-:104080000000000000000000000000000000000030
-:10409000000000000000000005DC05E305E305E783
-:1040A00005E705EB00000000000000000000000034
-:1040B0000000000000000000000000000000000000
-:1040C0000000000005EB062B062B06330633063BEB
-:1040D00000000000000000000000000000000000E0
-:1040E00000000000000000000000000000000000D0
-:1040F000063B068806880695069506A20000000085
-:1041000000000000000000000000000000000000AF
-:1041100000000000000000000000000006A206AE43
-:10412000000000000000000000000000000000008F
-:10413000000000000000000000000000000000007F
-:10414000000000000000000006AE06B40000000001
-:10415000000000000000000000000000000000005F
-:10416000000000000000000000000000000000004F
-:104170000000000006B406B70000000000000000C8
-:10418000000000000000000000000000000000002F
-:10419000000000000000000000000000000000001F
-:1041A00006B706BD0000000000000000000000008F
-:1041B00000000000000000000000000000000000FF
-:1041C00000000000000000000000000006BD06BE68
-:1041D00006BE06D006D006E2000000000000000087
-:1041E00000000000000000000000000000000000CF
-:1041F000000000000000000006E2074F0000000081
-:1042000000000000000000000000000000000000AE
-:10421000000000000000000000000000000000009E
-:1042200000000000074F0750075007630763077639
-:10423000000000000000000000000000000000007E
-:10424000000000000000000000000000000000006E
-:10425000000000000000000000000000000000005E
-:10426000000000000000000000000000000000004E
-:10427000000000000000000000000000000000003E
-:10428000000000000000000000000000000000002E
-:10429000000000000000000000000000000000001E
-:1042A000000000000000000000000000000000000E
-:1042B00000000000000000000000000000000000FE
-:1042C00000000000000000000000000000000000EE
-:1042D00000000000000000000000000000000000DE
-:1042E00000000000000000000000000000000000CE
-:1042F00000000000000000000000000000000000BE
-:1043000000000000000000000000000000000000AD
-:10431000000000000000000000000000000000009D
-:10432000000000000000000000000000000000008D
-:1043300000010000000204C00003098000040E40D8
-:1043400000051300000617C000071C80000821406C
-:1043500000092600000A2AC0000B2F80000C344000
-:10436000000D3900000E3DC0000F42800010474094
-:1043700000114C00001250C00013558000145A4028
-:1043800000155F00001663C00017688000186D40BC
-:1043900000197200001A76C0001B7B80001C804050
-:1043A000001D8500001E89C0001F8E800000934004
-:1043B00000002000000040000000600000008000BD
-:1043C0000000A0000000C0000000E00000010000AC
-:1043D0000001200000014000000160000001800099
-:1043E0000001A0000001C0000001E0000002000088
-:1043F0000002200000024000000260000002800075
-:104400000002A0000002C0000002E0000003000063
-:104410000003200000034000000360000003800050
-:104420000003A0000003C0000003E000000400003F
-:10443000000420000004400000046000000480002C
-:104440000004A0000004C0000004E000000500001B
-:104450000005200000054000000560000005800008
-:104460000005A0000005C0000005E00000060000F7
-:1044700000062000000640000006600000068000E4
-:104480000006A0000006C0000006E00000070000D3
-:1044900000072000000740000007600000078000C0
-:1044A0000007A0000007C0000007E00000080000AF
-:1044B000000820000008400000086000000880009C
-:1044C0000008A0000008C0000008E000000900008B
-:1044D0000009200000094000000960000009800078
-:1044E0000009A0000009C0000009E000000A000067
-:1044F000000A2000000A4000000A6000000A800054
-:10450000000AA000000AC000000AE000000B000042
-:10451000000B2000000B4000000B6000000B80002F
-:10452000000BA000000BC000000BE000000C00001E
-:10453000000C2000000C4000000C6000000C80000B
-:10454000000CA000000CC000000CE000000D0000FA
-:10455000000D2000000D4000000D6000000D8000E7
-:10456000000DA000000DC000000DE000000E0000D6
-:10457000000E2000000E4000000E6000000E8000C3
-:10458000000EA000000EC000000EE000000F0000B2
-:10459000000F2000000F4000000F6000000F80009F
-:1045A000000FA000000FC000000FE000001000008E
-:1045B000001020000010400000106000001080007B
-:1045C0000010A0000010C0000010E000001100006A
-:1045D0000011200000114000001160000011800057
-:1045E0000011A0000011C0000011E0000012000046
-:1045F0000012200000124000001260000012800033
-:104600000012A0000012C0000012E0000013000021
-:10461000001320000013400000136000001380000E
-:104620000013A0000013C0000013E00000140000FD
-:1046300000142000001440000014600000148000EA
-:104640000014A0000014C0000014E00000150000D9
-:1046500000152000001540000015600000158000C6
-:104660000015A0000015C0000015E00000160000B5
-:1046700000162000001640000016600000168000A2
-:104680000016A0000016C0000016E0000017000091
-:10469000001720000017400000176000001780007E
-:1046A0000017A0000017C0000017E000001800006D
-:1046B000001820000018400000186000001880005A
-:1046C0000018A0000018C0000018E0000019000049
-:1046D0000019200000194000001960000019800036
-:1046E0000019A0000019C0000019E000001A000025
-:1046F000001A2000001A4000001A6000001A800012
-:10470000001AA000001AC000001AE000001B000000
-:10471000001B2000001B4000001B6000001B8000ED
-:10472000001BA000001BC000001BE000001C0000DC
-:10473000001C2000001C4000001C6000001C8000C9
-:10474000001CA000001CC000001CE000001D0000B8
-:10475000001D2000001D4000001D6000001D8000A5
-:10476000001DA000001DC000001DE000001E000094
-:10477000001E2000001E4000001E6000001E800081
-:10478000001EA000001EC000001EE000001F000070
-:10479000001F2000001F4000001F6000001F80005D
-:1047A000001FA000001FC000001FE000002000004C
-:1047B0000020200000204000002060000020800039
-:1047C0000020A0000020C0000020E0000021000028
-:1047D0000021200000214000002160000021800015
-:1047E0000021A0000021C0000021E0000022000004
-:1047F00000222000002240000022600000228000F1
-:104800000022A0000022C0000022E00000230000DF
-:1048100000232000002340000023600000238000CC
-:104820000023A0000023C0000023E00000240000BB
-:1048300000242000002440000024600000248000A8
-:104840000024A0000024C0000024E0000025000097
-:104850000025200000254000002560000025800084
-:104860000025A0000025C0000025E0000026000073
-:104870000026200000264000002660000026800060
-:104880000026A0000026C0000026E000002700004F
-:10489000002720000027400000276000002780003C
-:1048A0000027A0000027C0000027E000002800002B
-:1048B0000028200000284000002860000028800018
-:1048C0000028A0000028C0000028E0000029000007
-:1048D00000292000002940000029600000298000F4
-:1048E0000029A0000029C0000029E000002A0000E3
-:1048F000002A2000002A4000002A6000002A8000D0
-:10490000002AA000002AC000002AE000002B0000BE
-:10491000002B2000002B4000002B6000002B8000AB
-:10492000002BA000002BC000002BE000002C00009A
-:10493000002C2000002C4000002C6000002C800087
-:10494000002CA000002CC000002CE000002D000076
-:10495000002D2000002D4000002D6000002D800063
-:10496000002DA000002DC000002DE000002E000052
-:10497000002E2000002E4000002E6000002E80003F
-:10498000002EA000002EC000002EE000002F00002E
-:10499000002F2000002F4000002F6000002F80001B
-:1049A000002FA000002FC000002FE000003000000A
-:1049B00000302000003040000030600000308000F7
-:1049C0000030A0000030C0000030E00000310000E6
-:1049D00000312000003140000031600000318000D3
-:1049E0000031A0000031C0000031E00000320000C2
-:1049F00000322000003240000032600000328000AF
-:104A00000032A0000032C0000032E000003300009D
-:104A1000003320000033400000336000003380008A
-:104A20000033A0000033C0000033E0000034000079
-:104A30000034200000344000003460000034800066
-:104A40000034A0000034C0000034E0000035000055
-:104A50000035200000354000003560000035800042
-:104A60000035A0000035C0000035E0000036000031
-:104A7000003620000036400000366000003680001E
-:104A80000036A0000036C0000036E000003700000D
-:104A900000372000003740000037600000378000FA
-:104AA0000037A0000037C0000037E00000380000E9
-:104AB00000382000003840000038600000388000D6
-:104AC0000038A0000038C0000038E00000390000C5
-:104AD00000392000003940000039600000398000B2
-:104AE0000039A0000039C0000039E000003A0000A1
-:104AF000003A2000003A4000003A6000003A80008E
-:104B0000003AA000003AC000003AE000003B00007C
-:104B1000003B2000003B4000003B6000003B800069
-:104B2000003BA000003BC000003BE000003C000058
-:104B3000003C2000003C4000003C6000003C800045
-:104B4000003CA000003CC000003CE000003D000034
-:104B5000003D2000003D4000003D6000003D800021
-:104B6000003DA000003DC000003DE000003E000010
-:104B7000003E2000003E4000003E6000003E8000FD
-:104B8000003EA000003EC000003EE000003F0000EC
-:104B9000003F2000003F4000003F6000003F8000D9
-:104BA000003FA000003FC000003FE000003FE001E8
-:104BB00000000000000001FF0000020000007FF87C
-:104BC00000007FF80000016A0000150000000001ED
-:104BD0000000FF00000000000000FF0000000000D7
-:104BE00000000000140AFF000000000100000000A7
-:104BF00000201001000000000100860000000100FC
-:104C00000000860200008604000086060000860878
-:104C10000000860A0000860C0000860E0000861048
-:104C20000000861200008614000086160000861818
-:104C30000000861A0000861C0000861E00008620E8
-:104C400000008622000086240000862600008628B8
-:104C50000000862A0000862C0000862E0000863088
-:104C60000000863200008634000086360000863858
-:104C70000000863A0000863C0000863E0000864028
-:104C800000008642000086440000864600008648F8
-:104C90000000864A0000864C0000864E00008650C8
-:104CA0000000865200008654000086560000865898
-:104CB0000000865A0000865C0000865E0000866068
-:104CC0000000866200008664000086660000866838
-:104CD0000000866A0000866C0000866E0000867008
-:104CE00000008672000086740000867600008678D8
-:104CF0000000867A0000867C0000867E00008680A8
-:104D00000000868200008684000086860000868877
-:104D10000000868A0000868C0000868E0000869047
-:104D20000000869200008694000086960000869817
-:104D30000000869A0000869C0000869E000086A0E7
-:104D4000000086A2000086A4000086A6000086A8B7
-:104D5000000086AA000086AC000086AE000086B087
-:104D6000000086B2000086B4000086B6000086B857
-:104D7000000086BA000086BC000086BE000086C027
-:104D8000000086C2000086C4000086C6000086C8F7
-:104D9000000086CA000086CC000086CE000086D0C7
-:104DA000000086D2000086D4000086D6000086D897
-:104DB000000086DA000086DC000086DE000086E067
-:104DC000000086E2000086E4000086E6000086E837
-:104DD000000086EA000086EC000086EE000086F007
-:104DE000000086F2000086F4000086F6000086F8D7
-:104DF000000086FA000086FC000086FE00008700A6
-:104E00000000870200008704000087060000870872
-:104E10000000870A0000870C0000870E0000871042
-:104E20000000871200008714000087160000871812
-:104E30000000871A0000871C0000871E00008720E2
-:104E400000008722000087240000872600008728B2
-:104E50000000872A0000872C0000872E0000873082
-:104E60000000873200008734000087360000873852
-:104E70000000873A0000873C0000873E0000874022
-:104E800000008742000087440000874600008748F2
-:104E90000000874A0000874C0000874E00008750C2
-:104EA0000000875200008754000087560000875892
-:104EB0000000875A0000875C0000875E0000876062
-:104EC0000000876200008764000087660000876832
-:104ED0000000876A0000876C0000876E0000877002
-:104EE00000008772000087740000877600008778D2
-:104EF0000000877A0000877C0000877E00008780A2
-:104F00000000878200008784000087860000878871
-:104F10000000878A0000878C0000878E0000879041
-:104F20000000879200008794000087960000879811
-:104F30000000879A0000879C0000879E000087A0E1
-:104F4000000087A2000087A4000087A6000087A8B1
-:104F5000000087AA000087AC000087AE000087B081
-:104F6000000087B2000087B4000087B6000087B851
-:104F7000000087BA000087BC000087BE000087C021
-:104F8000000087C2000087C4000087C6000087C8F1
-:104F9000000087CA000087CC000087CE000087D0C1
-:104FA000000087D2000087D4000087D6000087D891
-:104FB000000087DA000087DC000087DE000087E061
-:104FC000000087E2000087E4000087E6000087E831
-:104FD000000087EA000087EC000087EE000087F001
-:104FE000000087F2000087F4000087F6000087F8D1
-:104FF000000087FA000087FC000087FEFFFFFFFF2C
-:10500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
-:10501000FFFFFFFFFFFFFFFFFFFFFFFF0000000399
-:1050200000BEBC20000000000000000500000003DE
-:1050300000BEBC20000000000000000500002000B1
-:10504000000040C000006180000082400000A3001A
-:105050000000C3C00000E4800001054000012600FC
-:10506000000146C000016780000188400001A900DE
-:105070000001C9C00001EA8000020B4000022C00C0
-:1050800000024CC000026D8000028E400002AF00A2
-:105090000002CFC00002F08000001140000080003C
-:1050A000000103800001870000020A8000028E00D8
-:1050B00000031180000395000004188000049C0088
-:1050C00000051F800005A300000626800006AA0038
-:1050D00000072D800007B100000834800008B800E8
-:1050E00000093B800009BF00000A4280000AC60098
-:1050F000000B4980000BCD00000C5080000CD40048
-:10510000000D578000005B0000007FF800007FF872
-:1051100000000166000015000000FF000000000014
-:105120000000FF0000000000000019000000000067
-:1051300000000000FFFFFFFF00007FF800007FF885
-:1051400000000361000015000000FF000FFFFFFFDB
-:105150000000FF000FFFFFFF000000FF0000FF0046
-:105160000FFFFFFF0000FF000FFFFFFF000000FF29
-:105170000000FF000FFFFFFF0000FF000FFFFFFF19
-:10518000000000FF0000FF000FFFFFFF0000FF0016
-:105190000FFFFFFF000000FF0000FF000FFFFFFFF9
-:1051A0000000FF000FFFFFFF000000FF0000FF00F6
-:1051B0000FFFFFFF0000FF000FFFFFFF000000FFD9
-:1051C0000000FF000FFFFFFF0000FF000FFFFFFFC9
-:1051D000000000FF0000FF000FFFFFFF0000FF00C6
-:1051E0000FFFFFFF000000FF0000FF000FFFFFFFA9
-:1051F0000000FF000FFFFFFF000000FF0000FF00A6
-:105200000FFFFFFF0000FF000FFFFFFF000000FF88
-:105210000000FF000FFFFFFF0000FF000FFFFFFF78
-:10522000000000FF0000FF000FFFFFFF0000FF0075
-:105230000FFFFFFF000000FF0000FF000FFFFFFF58
-:105240000000FF000FFFFFFF000000FF0000FF0055
-:105250000FFFFFFF0000FF000FFFFFFF000000FF38
-:105260000000FF000FFFFFFF0000FF000FFFFFFF28
-:10527000000000FF0000FF000FFFFFFF0000FF0025
-:105280000FFFFFFF000000FF0000FF000FFFFFFF08
-:105290000000FF000FFFFFFF000000FF0000FF0005
-:1052A0000FFFFFFF0000FF000FFFFFFF000000FFE8
-:1052B0000000FF000FFFFFFF0000FF000FFFFFFFD8
-:1052C000000000FF0000FF000FFFFFFF0000FF00D5
-:1052D0000FFFFFFF000000FF0000FF000FFFFFFFB8
-:1052E0000000FF000FFFFFFF000000FF0000FF00B5
-:1052F0000FFFFFFF0000FF000FFFFFFF000000FF98
-:105300000000FF000FFFFFFF0000FF000FFFFFFF87
-:10531000000000FF0000FF000FFFFFFF0000FF0084
-:105320000FFFFFFF000000FF0000FF000FFFFFFF67
-:105330000000FF000FFFFFFF000000FF0000FF0064
-:105340000FFFFFFF0000FF000FFFFFFF000000FF47
-:105350000000FF000FFFFFFF0000FF000FFFFFFF37
-:10536000000000FF0000FF000FFFFFFF0000FF0034
-:105370000FFFFFFF000000FF0000FF000FFFFFFF17
-:105380000000FF000FFFFFFF000000FF0000FF0014
-:105390000FFFFFFF0000FF000FFFFFFF000000FFF7
-:1053A0000000FF000FFFFFFF0000FF000FFFFFFFE7
-:1053B000000000FF0000FF000FFFFFFF0000FF00E4
-:1053C0000FFFFFFF000000FF000000FF000000FFD4
-:1053D0000000FF00000000000000FF0000000000CF
-:1053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
-:1053F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
-:1054000000001000000020800000310000004180FA
-:1054100000005200000062800000730000008380E2
-:10542000000094000000A4800000B5000000C580CA
-:105430000000D6000000E6800000F70000010780B1
-:105440000001180000012880000139000001498096
-:1054500000015A0000016A8000017B0000018B807E
-:1054600000019C000001AC800001BD000001CD8066
-:105470000001DE000001EE8000000F0000000000CF
-:1054800000007FF800007FF80000021D00001500FA
-:1054900010000000000028AD00010001FFFFFFFF29
-:1054A000FFFFFFFF00090206CCCCCCC17058103CB6
-:1054B000000000000000FF00000000000000FF00EE
-:1054C000000000000000000000000001CCCC020140
-:1054D000CCCCCCCCCCCC0201CCCCCCCC00000000D1
-:1054E000FFFFFFFF0000FFFF000000000000FFFFC4
-:1054F000000000000000FFFF000000000000FFFFB0
-:10550000000000000000FFFF000000000000FFFF9F
-:10551000000000000000FFFF000000000000FFFF8F
-:1055200000000000000E0000011600D60000FFFF82
-:10553000000000000000FFFF000000000000FFFF6F
-:10554000000000000000FFFF000000000000FFFF5F
-:10555000000000000000FFFF000000000000FFFF4F
-:10556000000000000000FFFF0000000000720000CB
-:10557000012300F3FFFFFFF3318FFFFF0C30C30C5B
-:10558000C30C30C3CF3CF300F3CF3CF30000CF3C5F
-:10559000CDCDCDCDFFFFFFF130EFFFFF0C30C30CC1
-:1055A000C30C30C3CF3CF300F3CF3CF30001CF3C3E
-:1055B000CDCDCDCDFFFFFFF6305FFFFF0C30C30C2C
-:1055C000C30C30C3CF3CF300F3CF3CF30002CF3C1D
-:1055D000CDCDCDCDFFFFF4061CBFFFFF0C30C305C2
-:1055E000C30C30C3CF300014F3CF3CF30004CF3CE6
-:1055F000CDCDCDCDFFFFFFF2304FFFFF0C30C30C00
-:10560000C30C30C3CF3CF300F3CF3CF30008CF3CD6
-:10561000CDCDCDCDFFFFFFFA302FFFFF0C30C30CF7
-:10562000C30C30C3CF3CF300F3CF3CF30010CF3CAE
-:10563000CDCDCDCDFFFFFFF731EFFFFF0C30C30C19
-:10564000C30C30C3CF3CF300F3CF3CF30020CF3C7E
-:10565000CDCDCDCDFFFFFFF5302FFFFF0C30C30CBC
-:10566000C30C30C3CF3CF300F3CF3CF30040CF3C3E
-:10567000CDCDCDCDFFFFFFF3318FFFFF0C30C30C3D
-:10568000C30C30C3CF3CF300F3CF3CF30000CF3C5E
-:10569000CDCDCDCDFFFFFFF1310FFFFF0C30C30C9F
-:1056A000C30C30C3CF3CF300F3CF3CF30001CF3C3D
-:1056B000CDCDCDCDFFFFFFF6305FFFFF0C30C30C2B
-:1056C000C30C30C3CF3CF300F3CF3CF30002CF3C1C
-:1056D000CDCDCDCDFFFFF4061CBFFFFF0C30C305C1
-:1056E000C30C30C3CF300014F3CF3CF30004CF3CE5
-:1056F000CDCDCDCDFFFFFFF2304FFFFF0C30C30CFF
-:10570000C30C30C3CF3CF300F3CF3CF30008CF3CD5
-:10571000CDCDCDCDFFFFFFFA302FFFFF0C30C30CF6
-:10572000C30C30C3CF3CF300F3CF3CF30010CF3CAD
-:10573000CDCDCDCDFFFFFFF730EFFFFF0C30C30C19
-:10574000C30C30C3CF3CF300F3CF3CF30020CF3C7D
-:10575000CDCDCDCDFFFFFFF5304FFFFF0C30C30C9B
-:10576000C30C30C3CF3CF300F3CF3CF30040CF3C3D
-:10577000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CF1
-:10578000C30C30C3CF3CF3CCF3CF3CF30000CF3C91
-:10579000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CD1
-:1057A000C30C30C3CF3CF3CCF3CF3CF30001CF3C70
-:1057B000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CB1
-:1057C000C30C30C3CF3CF3CCF3CF3CF30002CF3C4F
-:1057D000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C91
-:1057E000C30C30C3CF3CF3CCF3CF3CF30004CF3C2D
-:1057F000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C71
-:10580000C30C30C3CF3CF3CCF3CF3CF30008CF3C08
-:10581000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C50
-:10582000C30C30C3CF3CF3CCF3CF3CF30010CF3CE0
-:10583000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C30
-:10584000C30C30C3CF3CF3CCF3CF3CF30020CF3CB0
-:10585000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C10
-:10586000C30C30C3CF3CF3CCF3CF3CF30040CF3C70
-:10587000CDCDCDCDFFFFFFF3320FFFFF0C30C30CBA
-:10588000C30C30C3CF3CF300F3CF3CF30000CF3C5C
-:10589000CDCDCDCDFFFFFFF1310FFFFF0C30C30C9D
-:1058A000C30C30C3CF3CF300F3CF3CF30001CF3C3B
-:1058B000CDCDCDCDFFFFFFF6305FFFFF0C30C30C29
-:1058C000C30C30C3CF3CF300F3CF3CF30002CF3C1A
-:1058D000CDCDCDCDFFFFF4061CBFFFFF0C30C305BF
-:1058E000C30C30C3CF300014F3CF3CF30004CF3CE3
-:1058F000CDCDCDCDFFFFFFF2304FFFFF0C30C30CFD
-:10590000C30C30C3CF3CF300F3CF3CF30008CF3CD3
-:10591000CDCDCDCDFFFFFF8A042FFFFF0C30C30C90
-:10592000C30C30C3CF3CC000F3CF3CF30010CF3CDE
-:10593000CDCDCDCDFFFFFF9705CFFFFF0C30C30CC2
-:10594000C30C30C3CF3CC000F3CF3CF30020CF3CAE
-:10595000CDCDCDCDFFFFFFF5310FFFFF0C30C30CD8
-:10596000C30C30C3CF3CF300F3CF3CF30040CF3C3B
-:10597000CDCDCDCDFFFFFFF3300FFFFF0C30C30CBB
-:10598000C30C30C3CF3CF300F3CF3CF30000CF3C5B
-:10599000CDCDCDCDFFFFFFF1300FFFFF0C30C30C9D
-:1059A000C30C30C3CF3CF300F3CF3CF30001CF3C3A
-:1059B000CDCDCDCDFFFFFFF6305FFFFF0C30C30C28
-:1059C000C30C30C3CF3CF300F3CF3CF30002CF3C19
-:1059D000CDCDCDCDFFFFF4061CBFFFFF0C30C305BE
-:1059E000C30C30C3CF300014F3CF3CF30004CF3CE2
-:1059F000CDCDCDCDFFFFFFF2304FFFFF0C30C30CFC
-:105A0000C30C30C3CF3CF300F3CF3CF30008CF3CD2
-:105A1000CDCDCDCDFFFFFFFA302FFFFF0C30C30CF3
-:105A2000C30C30C3CF3CF300F3CF3CF30010CF3CAA
-:105A3000CDCDCDCDFFFFFF97040FFFFF0C30C30C82
-:105A4000C30C30C3CF3CC000F3CF3CF30020CF3CAD
-:105A5000CDCDCDCDFFFFFFF5300FFFFF0C30C30CD8
-:105A6000C30C30C3CF3CF300F3CF3CF30040CF3C3A
-:105A7000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CEE
-:105A8000C30C30C3CF3CF3CCF3CF3CF30000CF3C8E
-:105A9000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CCE
-:105AA000C30C30C3CF3CF3CCF3CF3CF30001CF3C6D
-:105AB000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CAE
-:105AC000C30C30C3CF3CF3CCF3CF3CF30002CF3C4C
-:105AD000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C8E
-:105AE000C30C30C3CF3CF3CCF3CF3CF30004CF3C2A
-:105AF000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C6E
-:105B0000C30C30C3CF3CF3CCF3CF3CF30008CF3C05
-:105B1000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C4D
-:105B2000C30C30C3CF3CF3CCF3CF3CF30010CF3CDD
-:105B3000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C2D
-:105B4000C30C30C3CF3CF3CCF3CF3CF30020CF3CAD
-:105B5000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C0D
-:105B6000C30C30C3CF3CF3CCF3CF3CF30040CF3C6D
-:105B7000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CED
-:105B8000C30C30C3CF3CF3CCF3CF3CF30000CF3C8D
-:105B9000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CCD
-:105BA000C30C30C3CF3CF3CCF3CF3CF30001CF3C6C
-:105BB000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CAD
-:105BC000C30C30C3CF3CF3CCF3CF3CF30002CF3C4B
-:105BD000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C8D
-:105BE000C30C30C3CF3CF3CCF3CF3CF30004CF3C29
-:105BF000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C6D
-:105C0000C30C30C3CF3CF3CCF3CF3CF30008CF3C04
-:105C1000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C4C
-:105C2000C30C30C3CF3CF3CCF3CF3CF30010CF3CDC
-:105C3000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C2C
-:105C4000C30C30C3CF3CF3CCF3CF3CF30020CF3CAC
-:105C5000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C0C
-:105C6000C30C30C3CF3CF3CCF3CF3CF30040CF3C6C
-:105C7000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CEC
-:105C8000C30C30C3CF3CF3CCF3CF3CF30000CF3C8C
-:105C9000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CCC
-:105CA000C30C30C3CF3CF3CCF3CF3CF30001CF3C6B
-:105CB000CDCDCDCDFFFFFFFF30CFFFFF0C30C30CAC
-:105CC000C30C30C3CF3CF3CCF3CF3CF30002CF3C4A
-:105CD000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C8C
-:105CE000C30C30C3CF3CF3CCF3CF3CF30004CF3C28
-:105CF000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C6C
-:105D0000C30C30C3CF3CF3CCF3CF3CF30008CF3C03
-:105D1000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C4B
-:105D2000C30C30C3CF3CF3CCF3CF3CF30010CF3CDB
-:105D3000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C2B
-:105D4000C30C30C3CF3CF3CCF3CF3CF30020CF3CAB
-:105D5000CDCDCDCDFFFFFFFF30CFFFFF0C30C30C0B
-:105D6000C30C30C3CF3CF3CCF3CF3CF30040CF3C6B
-:105D7000CDCDCDCD000C0000000700C00002813069
-:105D8000000B81580002021000010230000F024097
-:105D900000010330000C0000000800C00002814038
-:105DA000000B81680002022000010240000702503F
-:105DB000000202C000100000000801000002818003
-:105DC000000B81A80002026000018280000E829810
-:105DD0000008038000028000000B8028000200E021
-:105DE000000101000000811000000118CCCCCCCCD7
-:105DF000CCCCCCCCCCCCCCCCCCCCCCCC00002000F3
-:105E0000CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD2
-:105E100000002000CCCCCCCCCCCCCCCCCCCCCCCCD2
-:105E2000CCCCCCCC00002000000000000000000022
-:105E30001F8B080000000000000BFB51CFC0F003D7
-:105E40008ABB5819180238107C7AE0A58C94E9DFD7
-:105E5000C8CCC0B00388AF02F17E66D2F5B34A2346
-:105E6000D8F7241818182419184E893130EC9244A8
-:105E700088E702D5084A3130DC858A0500D967A554
-:105E8000E81B4EA39836F8BB3A2AFF912A84CE87A6
-:105E900089A3C93F86CA6F5480D03FD5B19BBB0947
-:105EA0002A0F00FE694F6760030000000000000039
-:105EB0001F8B080000000000000BED7D0B7854D50F
-:105EC000B9E8DACFD933994C7642422610700703ED
-:105ED000040D30208FA85427E1D1E0E5E8F0462EEC
-:105EE000CA80AF0892448D356D39373B6412020287
-:105EF0008ECAA1B4A53A207AA247DBD4464B7BF5E3
-:105F0000DC206A73DAD37B9152A52DB6413D281669
-:105F100068F49403BDD796BBFE7FAD3DD97B672661
-:105F20000F5FDF395F1B3EDD597BAFBDD6BFFEF78C
-:105F3000FAFF7FEDA8A297A8971072117EAE256494
-:105F40009D4008C9EBBD5AF78916AD26B9845405A2
-:105F500055632B7DB65E0A1B8DD3E8FD4BC4D01371
-:105F600004EE8F9B432611A2C07B05844C85FF4D18
-:105F70002744CE691D1EF5D37BD2AA2CB85AE3590B
-:105F8000D72A99107D2A3CDF362ED5F3E4FC09A5EB
-:105F9000A75B23F873710C21F5C76F9CFF8AD5A608
-:105FA000FF8D2499B9272FA7BFCC24332F4A847C97
-:105FB00054B828ABD3483FDE070D5DBA3C9690F34A
-:105FC0000D2BE6BF32B6EFF3F512A96D2FED7BFF77
-:105FD0002AA2215E8866AA9189BDEB5E4F48A72759
-:105FE0008790CD859BD87A7329B2AEA4F7DBFE45A6
-:105FF000974B7AE15C2FD37E53FBAE871013C7B566
-:10600000C649BE9FE872BCEF7E2F391E7F9FC8F441
-:10601000DF0C42B00B5DFF74217A2DDCF7142E32B9
-:1060200047D0F6FA67CA49B4343DFC497A7D42F854
-:10603000ADF7D2D291F7FB687F530BA1EF9D54E3EC
-:10604000D75F45F9E8BDEF4BA14DC0477BC6CF21D7
-:10605000017A9F303EB2E8746A7FD3F054FC918E8F
-:106060004E7F4FBCC87F167F5589ABB23AC927E730
-:10607000AF3B80BF326CFCD5BEB8DFF13E297FC597
-:10608000DCFCC5F171BA9DAD9FEC1EC6E8C2E9E526
-:10609000A64F5ABA7CD2F7FAF2D316C0ABA77DB19D
-:1060A0003982A4E0270EAF45AF4F0BEF407C444848
-:1060B0001CE94C484482F97BEFB36B469921009F61
-:1060C000D1E6615847904D4582B7B6DC2D52380372
-:1060D00024D13AAE88B6BBD72C00B803C7E79F02DD
-:1060E00079680E5568B3E97AF569C643F3E835A3D4
-:1060F0005417603D5B89084A808E576D969702BDA4
-:1061000008B69F366F099B80071226643821F7F185
-:106110003511221A326DABF0EB9854EB504927C37E
-:106120008770D1D3F7FD74EB577BDF23178BE0FF2C
-:10613000F71058DF40EF91287BCFA4FF00DF39AE86
-:1061400071F439B46DE3FB00B1B5E9F3A3F00BE2F0
-:10615000FBEE2F64BE6CB24F33A87E504B443D0122
-:10616000FD89912DD37646255544F03C480E528A40
-:106170000C489766422ADB811F493B5938B117BE4C
-:106180005344C0F514DCBE734D0B555DE7CAFC21CA
-:10619000E0F3A04EC8B09CBEEBD9D6401979BCAD97
-:1061A0001D7A0EF93F46F9680C7DDF0C317BB8B5DE
-:1061B000E4653D6A93EF0C41E07CE9E60F62C83389
-:1061C00040CC8055E8B5440C7B039F9E3F64171E6E
-:1061D00007CB1FFEA88D3E64E8F40A72BF61B0FCD5
-:1061E000F169E7B3E8DA57AE1A2DBA6A84D2614B87
-:1061F000F1A294FE477ABAEE23D03FA384841329F8
-:10620000DE1B25085C0E4C87BEC12BA58F9424EFA6
-:10621000BD0E7A49F93356ECED071F52AE131FD667
-:10622000B8DE7AC97897AA4422EB228CA7C2789468
-:106230004FB7041F3609958773C0DB141F527C4A81
-:1062400027B44931413EA43F9D026D7B83E1C45692
-:10625000E48304D2C582CF63880EFCCAB93E479B53
-:10626000AC30053BFCDE7A15E150D147A0E3E87481
-:10627000408A0AD94F3A816F2D7E0536B87829B405
-:10628000BFEEE08356632A4945078B5F01AD8C5F03
-:10629000BF3E38FDE29E6F8913DE41BFE7978D93C5
-:1062A000363B94FE3D999CB4E84391580503D8F8D9
-:1062B00060B3420E089309692A5C46A2F4EE667840
-:1062C00044ED580B5C0BC03F9C8A7A81B40932C004
-:1062D00069D95512CCC17ED30503C713B55AD42B47
-:1062E000923FCCEC2B7F9E1E2E36FF70231ED629AC
-:1062F0007EF3493C2C52FA505D19EA24A037C304BE
-:10630000F88084185F48DC4FB7DE8F717EF692A369
-:10631000F83ED5AEA68EF6CC29C77325FA908EB37B
-:10632000A584243C48A7B8066DB94426B02FA0FA2E
-:10633000C95F40FB6759EC2F2D0801FC59DCBE9268
-:10634000599CBF05AACF289EFDD39CF2ED73C9BF0F
-:10635000CCED711F7D96663F615DDDFEDB6302F76C
-:10636000DF32881FE9CDDF27FED4FEAAE5B75978D2
-:10637000CD1309E293FC54493C51C4D746DBF7BC2A
-:10638000959D80759B159135CD140FE6DB42A809CC
-:10639000E829877BB2E8F3934F4AB85FCA5B567F20
-:1063A00009CCB7BDC11C5B6CF307B7CBB51AE09B3A
-:1063B000F28566B7173790E80B826DFFE509B68C5A
-:1063C0002D1E86FCF7767709980A01F9CFEB8F0529
-:1063D0005F05B9E4F793F8B1B7A5BEEDDC7CC2ED7B
-:1063E000E50DE5613A6F2BE8AE11F8D814283CAD05
-:1063F00005ACFD93C6E1E5603F5B3359FBA3C6776F
-:10640000C28DC817512D42EFD5138E972E8A17A42F
-:10641000BF916FB7AFEEAB7BFD3B64DD077CB6D7BA
-:106420009F735D09D8CF32310468DF1B3BA2AFB147
-:10643000E1E39B9E8A37001F2349422040BF582E2C
-:10644000CA8FE5CF01E341BB80CB5321398CFD4698
-:10645000477ACA15B8B5427F19AE2DC1E7B2519E31
-:10646000C81CFD24CABF245CBC7CF0F29E6EBD013A
-:10647000814452F9F3F74B392857816974DD0EBD19
-:106480005EA8233FF271BF063402FD914D619A0C64
-:106490007A24BE229262BC9F0822F6D3C01E5C41C1
-:1064A000D150B8ACECDFE87A352D3CE5550A97279A
-:1064B000D71F32116C66270C2E039E78A306F82591
-:1064C000472502F2AF158623B7019F924858A0F7DF
-:1064D000B56038B4D5E8BB3E9530FB9043AF179913
-:1064E0007C13E87F4F9E8EFD09D80B6B5D63002EF9
-:1064F00015E1FA0CE89D2B4E1F98CE23487B3918E6
-:10650000B374F4FEACE99CEE7D377D030293AFFBE0
-:106510009BCE874D2A4F2DC7055102A5182F46BA8D
-:10652000689C2EE795A8067EE396AF8A641F6D3FB0
-:106530005ADFBF9F12033FC563B39B3AA3DFC8BBBB
-:10654000F4A9C042E9DEDB7597589948C14F9522FE
-:10655000D3FB5BEE7A383E16E8F98A73BFA7AC0A24
-:10656000A35F4AF77D95400FEB3D6F31B34F643F1A
-:106570005D0FEDAF707FE47CDEA22C92621EEBBA61
-:10658000C7057F21C5732AB9B94FE2FED54E36BE85
-:10659000E5EF9C2FE87F7C0B3F172A4572B814C9A2
-:1065A000EA23A57C3114EF8549BF3B0FDB1EFE2893
-:1065B000512BFA08D8BDC2CE72B82AA4A711F8741C
-:1065C0009748AA52C1B7561211BEC230DD7A50BDEB
-:1065D0005F688AA099C8BD9281F7F357D51E5428E9
-:1065E0005D5A47911098994B603CD0AB07BD683F0E
-:1065F000D55C92F0523DFD5AD1574CB0CB7A21096F
-:10660000032C7A2DEC39E97FD4BE1AF4B9B2316A81
-:10661000225CC108EE110E152D437AB750FFCEC390
-:1066200016E2E0A71653EC04BE8DD3F1C11F8C1BFC
-:106630001528AFE782D4F2C3CFC7147E6BBF712990
-:10664000C485282901CE0932C2494762F4D4195EB3
-:1066500046EE9E453AA9DD69CDDE85F2605E495081
-:106660005E6572D814C0CEC80953A4F0C6AA983E7D
-:106670005072E382DD8EED21D107ED7C23EB9DE8A6
-:10668000FFB5FE595A910AAFD522D36FF7717D78C5
-:106690005E699F8FFE4633958FA2BEFDC39C0EDFC1
-:1066A0008E2D7A703CEA336697ACE75D82E18863B1
-:1066B0008EBCA0E27ADC7ECD3CEED7B41452BF068D
-:1066C000E59D2C003F2683F3470B608F3EF76493D4
-:1066D0008449E1C8007F86FA25A494F9251AFD07AC
-:1066E000FA2F7F85D39FF1B8FC9674FECCD784C86F
-:1066F0000F50DF515505F0EF16E2F3C701BE0BE86E
-:106700007ED2E8BBEE2EBE9F9C2B6D2B6AA1703D06
-:10671000962B3AF861349797C78879E2227D1E2F2D
-:10672000140D803B5E2FE23ACE19CC6F27EF7A1D15
-:1067300076A2D95CA4119BFED9C1E5695B83E69082
-:106740005BF7D5AFC6A391147A4BE7F4C99815C689
-:10675000F8873F9440FAC33A53F9E90F945668FD1D
-:10676000E93FB9445D83F82BAC3825C3B5CCBD5F98
-:106770004A3DAEFB4AEC7EA694BEDF60AF5B289E2E
-:10678000DE561CFE78A704FB2E93A0FFE70D5153A5
-:106790001580AB3E1CE0F786A8B8C1B5BBBC12EEB5
-:1067A0001BB3221AC891659FBDA1C856B89FF52595
-:1067B000790BD0CB5B2E8A12A59F269B24C7263748
-:1067C00053E1A68DBF33A9BAB4E3438B7EA512FC77
-:1067D00054522892B1148ECD1F3768763A75D16D18
-:1067E00008DBB73AF9265EDFBF9EFDB47CF173D1BA
-:1067F0008A8738E9853FF67808A77392FE7DE21A0A
-:10680000FF39E8AD71FA19947E9B0CA027D3177459
-:10681000E385FE435C33C3D08E1B8668DAF4D8C7A9
-:10682000620EE241BE20A35EDABDA6250CF4D2E9D9
-:1068300018405A7A0DA7B2DB5D828A7245F5C655BB
-:10684000D27454C802C43FE74A1B91DE8F517A8349
-:106850001E7B8CD4765DCCED957F2DAAA21FDFD553
-:10686000689637160F456F52F8A85F47F630FFE578
-:1068700012CB7FF97BCA2783F057CE53A3C1EDB16A
-:1068800017F84AEEA62C4DE12ADCC8EC26F86A3946
-:10689000B46D50BBD729F4F2A387CFA394260E8FF3
-:1068A000477A3BEDD363852F0B1EB06FC5CCBEA9D5
-:1068B000666718F44CA098DA2782F66735E06744DB
-:1068C00049BC1CDA2377CFC3757C1BFC503FD8171B
-:1068D00082F8F8A698683429CD7CE148A728C1FE43
-:1068E00099E0FECEA29F7B5E6AF5909EBE6C712FF2
-:1068F000D029507B189669B77BD5525EAF3D1C51AD
-:10690000D289EAD6ED2FA4F513FE2CF1FDD8CCC622
-:10691000306D8F825FA93FB9537CBC11F663114F74
-:10692000B81EE9EEDA4724E3503CDEBDB6CC122AAD
-:1069300063F96FE83C7776291400027E80648F0348
-:10694000DD097689EA9BB5DCAEDD4A2201787886DE
-:1069500088185F3B438E04AEB0F1E14E4965F3B455
-:106960002A6F43FCDE8AEFDE16676D4BFFDCB1DB7E
-:10697000D9BE9D2C1A0EF1DBDB772AB8FE3B5DFBFE
-:10698000D698A4E3B87790DA16C043B342D04F58F4
-:10699000AB1319E2B11B7EF89D19B04FF836B72B37
-:1069A0001F50FE326CFA679D3FA1C27EF69D8E2B72
-:1069B000965D4DE0FD44CB08D89767939476F496A6
-:1069C00056277C03C1EF8697904DFDC221B7092958
-:1069D000E3874F4982236E58AF052641D0E4BC9728
-:1069E0005DCD0AA63FCCDF7A134DE0274A06EF5F64
-:1069F0003B99E5396A67C275A0F77EC6FDD1A1BE95
-:106A00007738CD7B1BB46E15F8BF46362B05B137F2
-:106A10005EA529B5E19120C707CA3B471247BFD6FB
-:106A200041F6AB14FBE9E786F794AE99E2E4BE7059
-:106A3000DF40A26F81DC9D17A3D51827E0707B0093
-:106A4000CF125C65A427C64F8A605E7FAB9005714C
-:106A5000940EF44FBC86ECA0778DA507A85E82B893
-:106A60004F4689F3B93BAED293A46B27CA1786442D
-:106A7000E992029ABF53027FB14C3E9DEC4FE7ABC7
-:106A800086754DC64EA85FEAB87EA926C683B3A612
-:106A9000A17C61BCAE6EFE1813E0A8CB3342A60108
-:106AA0006A3414C6315C7C5573412009DBFEBB4659
-:106AB000EE51418E6AA8FEB6DFBF27C8E2C9E9F4ED
-:106AC000B64234C35F027EAD88789274DAB6ADFB0D
-:106AD000A3B850D9CEF655594BFAD917DF1364F144
-:106AE000E2B55BC666B1B88B535F9DE5F6E127CF93
-:106AF0003CAE76839E79FAC4F5B0CEF5FF53221AE8
-:106B00009DF7EC3399A413ED464205BBB1AE434A61
-:106B1000690F096962F9F3EF6522BDD63DE7492C9B
-:106B2000A0EFAF7BE19D4984C2777653CF6B23C141
-:106B30009F7E5A607171B37BD2627A7F9D4C56A75B
-:106B40008AB34C90D93EE4F48F325680FC0A6D072C
-:106B50006FC671DB972B6057AD7E86AC20BFD27EAF
-:106B600068B7CDA784C45821157C2C1F71FA2981E0
-:106B7000C17740C1FDDFBAB6BD6A94C251D3F621D8
-:106B8000EA8BD9DF7B360078A8392039FCB89A36F1
-:106B9000A9D33309AF27E00A71566106F009E797D8
-:106BA0008E0D185FAD6E7FE0432900EF3BF516C5F3
-:106BB0004BA813F0FAA6145A00ED1FFC63C0A0A85E
-:106BC000FAE0F01301C02B1D778D9A05717C277FA9
-:106BD000C3F81772FA8E47391DF3BD35ED5BD87CCB
-:106BE0002EBDF801FC52D0370E1B919D7974D23620
-:106BF000B83CEFFA67CF3D6AD2F94E3FF7FB474DFD
-:106C00000AF75D7FF9F747BF0E72F9CF5E1DF47A80
-:106C1000CDD3BF0C101B1FAE9359FCE0EC28BA85F6
-:106C2000A2FDCEFECA930087E0EC4BEF8D36E87AEA
-:106C3000CF7EFF4FC30DDABFEEA5B9F9B0FEBAE7BC
-:106C400067E7F7E7C7009F263C76B81238BE714069
-:106C500060CEC28BFCEAA2CBA18E43A301CE33C788
-:106C60003CB83FABA1F7EAA7029D36A09D85F6464A
-:106C70008ADFEA67367F08FAA12F9ECD912206BFF0
-:106C8000A81A0C029DDF9987F4223D681FDDFD6B79
-:106C90008E523A4E4E4FB773E46315F45CCD335BBE
-:106CA000D87C2EBA9D815FAEEC4BB7CD2EBA9D231A
-:106CB000773D560089D78E618E3C8275ED8D9F475A
-:106CC000B222FDE8074BFE07C22BE659285C4BE5D4
-:106CD000F0376490A3E73292745D00747DF6DC684F
-:106CE00042F9E27DA5E766B0073D2F79F47DF4FE19
-:106CF000BA97DE44B93AFBFCEBAA81768CF805EA38
-:106D0000579E25C99FC3E06756339F93D4ECCFECC1
-:106D1000F4047AE9539D58586904F0FE09BC9F6059
-:106D2000FC5E9D38B8444841AFD7E5314CFF27F2AF
-:106D3000102F1BF6FF46257E271D8532A0E389799B
-:106D4000703F1D1DADF5EBB0FE99367AEE6772EA25
-:106D5000EE5F4DE511EC5D92AE09E14D92422ECF12
-:106D6000EEF5C860EFCE825F95326FCAFC99A1E65E
-:106D7000577E263BEBAF92F9158E87F4FCC1E47B7E
-:106D8000A0F50D157F3F920D1CD78DC7D31FA7D639
-:106D9000F7EF717D514DCCCA1197F6F5436412316E
-:106DA0004716F5C27B1A36A894FF4E3F2D613CA8CA
-:106DB000A5FD10EA6DB79EA84E13DFBC20333FA19E
-:106DC000FAC0C149A0CF4EBFFC23E4CFEA674EA86A
-:106DD000102F7EADED076A7769AF3C803D48D8EC57
-:106DE000C1E9EF1E9CC4F4001D3F059D14858D5F15
-:106DF000F3A273FC9A673E748CBFDE6C47FF60A001
-:106E0000793E90C3CB61BD1F1C5608E8D10FDAA5AF
-:106E1000CA547EED07DC1E5A786A797DDE6F200F3A
-:106E200036ED88CF00BBD9B1299CBF1DFCB5230A24
-:106E300001BD4DE4F0EF3DB4DDF1BACF80FC74C785
-:106E400091659261DB87FED085CF9947CDD9997442
-:106E5000BC99DD9169E0A2BAF546D971BAAFB2F139
-:106E600041DDEB95F9A0EF611F6A8C87F94241D8AB
-:106E7000E74A8179952C7F2DEADE94F69A8DA7F862
-:106E80002318AF5274311923837147924423C45796
-:106E900089DFEFCE4F44347B1E6AC5E183B0C5CC99
-:106EA0005DFC62018C132031FD24FA9F2474B11F14
-:106EB000FFCB9D8FB0F09994BF34F9890CFDE6E0CB
-:106EC00041D277BCBE7998A806F1ED16FFDAD6223A
-:106ED0005B1EA625D8270F3357A178681548CA78B6
-:106EE000ED78A562BE9287BBE368AAE737294CAE6E
-:106EF000AE25DDF7AE0138232C9F33CB85AF2F7144
-:106F00007CFDF364BA70AA42CBC1B3A2F89DBD2444
-:106F10001C53E8FDB9AB7A2E7F19BBF37C8E395E2A
-:106F2000BC983178FC0D356F17F12CBA5D1944DE31
-:106F30002E5DFEB8170E93EFC7731C798C436FDD7F
-:106F4000AF75639EA1B6B5C816F71BDEE92561CC07
-:106F5000E319E81F0EEFBCF39BB741DC39B730E40F
-:106F6000257DC7912F5C8D71232B9F2F17863B2189
-:106F7000DE2FEB46B984F32C0F437E61B3C1F205DB
-:106F80009B83FDC7F56628D16605E351D7E0B8A21B
-:106F9000C6EB0F06B9CE6F2C0E209E0314CF20EF48
-:106FA000B8FF81F51D1778DEBCDB94207F78221BAB
-:106FB000F305019994403CE0BCE00B6DC27C823348
-:106FC0006F9E8E7FB7CB26E6CD5B8D3E79F3EF28A3
-:106FD000B67C8396266FAEF99760DE5C23367FB76A
-:106FE000A8B75FAFDCB9F2E63016C665B6CF86B893
-:106FF0004C733671E4CD9B41F0AF22E439E5EAD918
-:107000005877E6E5CFCD59B3C3F63639FE32B679B7
-:10701000FCE98FCDE73641FFDC91A416EBD4E40800
-:10702000596AD383EF292C4EBB4109FF50B1D71DBC
-:10703000717EB0F23F87DE7A0FF90AAE63285E9B5D
-:10704000295F7990AF4E11BB5EB5AE16FF341BFDC4
-:10705000F3857A610AC6CD92EDA0897C110846C3FA
-:10706000E114EF4DF230B9B7E60D94513D4AE54DCC
-:107070003122988F5275BAE135060F7F3AB82C3E0F
-:107080006D36C6B03A289D60FD5EFA754C63714C52
-:10709000887051B876DD787BA83F3FC75AE70C254A
-:1070A0007CD28EF7DC4B52D7EF56AB6CDDCD9155D1
-:1070B0002CBF5EE5CCA742FADA1E679D2E44FF5D29
-:1070C000C13821CBA78A5A84E7474C2B3E1E4CC6B9
-:1070D000C30DA833BCCB047DA8AC6A3705B8E6B2B3
-:1070E0007C4AAE16FD58B1D90759EF6672EBCA0F4C
-:1070F000CE954E0F09BF565DDCD6061DFDF42D0D55
-:10710000416C6F6E30F0DAD210C6FB6E3A361B2F30
-:10711000076FC1BA341FC665D38DFF604308C789A6
-:107120003594B1F178DE9C90CC26E02B55B4E46523
-:1071300018B6FD127F6E163481FC6D17D8F36B5AAA
-:107140002E4579B3F86787D17F5C5A4ACC403E1808
-:10715000EAF87DF9F527B8CEE6597ED4AF03C951D8
-:1071600056279B77B0F328497BC1E6D9314BC379C9
-:1071700076E40E304F9CCD3330FC0C5FDB0E9EC2AC
-:107180003A0485F203A828450FA7AED3E3F2D677D9
-:107190001C0FEAF9E620AB0B538BFD6150FECD06C8
-:1071A000CF3716B27CA35A32BC02EEABA1CBB04EA5
-:1071B0005C2DF5633E4F2D1E7E0BB4B71DDCA25730
-:1071C00080FD2814435E03EC76379173516C307E5A
-:1071D000AB1697DC06FD7590630AC7280FDB6FA915
-:1071E000C557DD01EF1F9CF29AD144FB3717FA42D5
-:1071F0001E90B76ED9C1FF83D61385CE3C1A91A9D4
-:10720000BEA0FA6BDB94DB4B503E355B9D648A7A03
-:10721000419BDED8A0DAF4864AE6988087747A87A4
-:10722000DADFFBD4BCBEE358EF6F5022F52AEA85C3
-:107230000871D6BBA7CE675BF400370BF2917230B2
-:1072400059A7B7A060786F7EDBAAD373E7B5E3F4E4
-:107250005FAABCB6BBFEFCB3AAD3DBA926EBF446FF
-:10726000419DDE8F1512EA84BCFC2FA5D03EA32FD2
-:10727000DFB9C7739FB7A0FE8F06FB9C7472F9330A
-:10728000D5993F2D88BAE87EABD731DF2B202FA5CB
-:1072900003EB979155CE7146D53AEB6A2FA9CF7182
-:1072A000B48BCC118EFE97B68E713C1F1BBFCCF1F8
-:1072B0007CFCEEA98EF684C4558EFE97B75538DA5D
-:1072C00013DBAF73F49F7C6091A33DA573A5A3FF6F
-:1072D000155D6B1DCFA71F5EE7783EF3D83D8EF698
-:1072E00095DD5F73F4AFA7EE900A729BCBEB9073C2
-:1072F000F3457B9EB6358FDA25BACFDF9147190665
-:10730000E3DFACAE4B658F937943F77BB2A1867513
-:10731000CCFB8F9B035722D7A13D958DE11506DE4F
-:107320009F310FAE649AB3BE5635587D32ECE39C64
-:10733000F502CE3A6355DA86793ACFF12F77099381
-:10734000FAD2552D74CAC160EB9415C3F5DE10E571
-:10735000E2BC2517A3A85C60FCED6309CFB5CCC9DE
-:1073600044FFC2B69F423C5AFBA96B34120317D3A9
-:10737000928BF2553D235FC56ED63ECA230EA52ED5
-:10738000CE92BF804DEFC37EC5D233CD6583D3AFE0
-:1073900052E20A873FE9BE3605D6A5D38F051E9B6C
-:1073A0007FEFD68F339448213CD7E4B0496CF11A73
-:1073B00052AB38E01E2C9C9FD40EDC45198EA4D015
-:1073C000E32AA9C5BAAB9615610C02903AE2E0D364
-:1073D0009D8BFF47198C4BFDC219CE7532BFD0ED86
-:1073E0004F53FD86FEF40EEA4FA3BD73E947AAA7EB
-:1073F0004C5EFF65303F82E943F73A3F2F3FFADFAB
-:10740000C059ED875E81A25025EE0FF34402FBC305
-:10741000E6599120C4E7ACBA79EBBD56CFA5384EFA
-:107420002C5715217E19EB9A8BF1FA262DAAB13C27
-:107430007114C769CA16F5547562751E962FD6EA7F
-:107440001F18BBBF9FB88BA69268AA78DA4E0FCBE5
-:1074500007C5F4B55D604733F35403F6DCAD074F61
-:1074600045208E2497C93AECD70905E61D5B7E8F2F
-:107470009028C699B4A0887657ABDF81F30F04EF4C
-:10748000CD1E819FFBD8D22FBC5E3575DC251DBC7F
-:107490005B00DE6903C3EB05788B60FE6D387F8D82
-:1074A000C748897F85842B6703DD4E7C3982E95686
-:1074B000CA36201F3BCAD8BE9C1A02077F5BFB1C42
-:1074C000CADF0F7BF2B07E15F9DA3AE770A347C73F
-:1074D000792CBA92C21C8C6B04A2B1B1C594DF3274
-:1074E000A36C3FDFAB9F181F652A6102F12CD92FD7
-:1074F000627E50E5F110ABDF1F383E9B667523BD01
-:10750000365F29934D426F9D75AC90AE6B72EFBAAA
-:10751000FE8F279BF1279FD7479664615D8AF44CC5
-:10752000B03FBDEDE3F872EBEFEF79B8FE2E20052A
-:107530004C7F972E877C77BA71DC7E4C3D8FF30EA3
-:10754000BDBE9E9F2FF0DFD30571262BCE4782D381
-:1075500052C6E57BF1CAF295BDF45D6E7452FAC96C
-:10756000D3A7629EDC3AAF40D599B35E98D3D7A239
-:10757000AB15472741163FB2E8EC4DE2734FBFF819
-:10758000F482BC5CD1179FBFF2F07CC37F317CBE1C
-:10759000023E0DBD6666B2F3E9E4D05709E6A50ADE
-:1075A0009D7268BD67F1BB7BFD7FFA2FCA4FD6FA8B
-:1075B0002D7E48DFDF4CB9AFB1F2AB999CDF343898
-:1075C000654515CFAB656FB75E0AFBD7A01FF77D8A
-:1075D0009965313CDFAB105307BD9069ED6BF879CD
-:1075E00023AB5EC957EAF4CB34D7FE45E575517D30
-:1075F000CEDB72FFCD7D8E2A895F17BD266B69F2C7
-:1076000063833C7FB48BE7EB0AEAE28DB01F2EB8B0
-:1076100095D5FBEF51C86AA8AF1C51658ABE5CC8FE
-:10762000DF147D3F83AEBFE0C5871A4702496E3540
-:107630008AC0CD7846331C76B8E0AE78B98F3D9FCE
-:1076400002E33CA531BD5B5019C773CE4DCF8FCF40
-:10765000023FE195B796EB101FF828B718F74F6770
-:107660005EF08441FF9FC921555817F6C2CCD7C0A0
-:107670008FFF7D43578E6CE39333DF7D7D86428998
-:1076800074E6B9D767C848AC8463FE0D177F310331
-:10769000E0362B48492DE4EF7495C0B8351ACB97E6
-:1076A00059F53EBB86AB2D70FDA9379BC513F3C5BD
-:1076B0001DD0AE878018F80D3C9E7FF5696339D4E4
-:1076C0005F66772902D4E33D2498A69F5ECF9F781A
-:1076D00048003F4BEDAC85300BBD1F3A042837C73F
-:1076E000B27DC9F922525244F5BEEF70ED78F4A78D
-:1076F0005DF54E16FFCBB309E6FB7A6ED41260AF90
-:10770000B7CBC6375681FD5E25633DCE76F930CACC
-:10771000859B8EC7BD639CF5B93C1E7DE8AD3BE201
-:10772000E5F4FD7BA688C8AFFE1353B2480AF9DD25
-:10773000DE5086F3070ADEAE2C07B03EA67767F46C
-:10774000EE93FC3231B3A889548A4453A178F1975F
-:1077500011F2B68DEF5A4412D6E9F3171A088ED3F8
-:10776000D1A0E1B5AD411F5B4C3706DF6A08E27579
-:10777000678381D7871B4AF0F9830D2187DCC37C9F
-:107780006F97F0760A7FE5F3BA3ED040E7B5C1B116
-:107790006B22957A4AAF5D3C1FF540E9D4ACB5FD4C
-:1077A000C4C1F634740D9B3396230BEA4DEBF4BD44
-:1077B0005BFB817F4FA3B07A11F83577CB917DA821
-:1077C0001FA3058B6CFA91FA6D0584B2E2BD2D23DF
-:1077D000E6CC29407944799976388AFE7841302E72
-:1077E000401CB1E028BB6F9DB7407A5141FB61EE70
-:1077F0001C4101BD594ADA012CB5344A2A68FF9967
-:10780000794BCAE13E99E8BC3F4365F20DE356D09F
-:10781000EB6C2DF2236D3A7CA763B7F92C5DCF1F7B
-:107820003B3C06E4791E7CF94F2AEC0B62BF5235D3
-:10783000F0630A5E3C81750F31A15B85CAD8E35ABB
-:10784000F51C99EA19DC0C627C952A16CA2731D0FE
-:10785000B118FFEC89CDF1C37997E8297BFF5DBEB4
-:10786000E8DDFCE448580B523E4AE62FD6C7C27406
-:10787000D3F902CF5F1CD7D6C5CC4268D3FE53588C
-:107880003B46DF7F213B3A52CC86A28BAA58D79742
-:10789000A06DF5AF8A41BDED9B5CEF107FB408E4AD
-:1078A0002DD9D6693BD3D696599B68EC6AAD77C380
-:1078B000A13FBD067AAEFA45A11D40A37A8FE1FF34
-:1078C000C0435877DBD6D0A5C7144E7F8B0E542407
-:1078D000270409D6D3A909213186EA8F09FCFB14B4
-:1078E00005D3C24623E8D7841202BD19F231BF7115
-:1078F00042828E6393AB0969BE8382795FA0E336CF
-:107900005637ECE6AF67BD2C3F504FCCAD90072308
-:10791000CF283AE623799CF2B465E7F87EF52E2F5E
-:107920006B2A9B4CDF65A07FD6C818075B5F142FBE
-:1079300057E93CEB7F5414A29615F24A58D7B03E53
-:10794000BB7DF854969772B41FE275B4C16C331BBB
-:10795000CE0F541F786834D4055493F8CD5F037864
-:10796000FF95E51F4F1DBC32EB6ADADE40DB107F6E
-:10797000DDD0F1BA1AA5FD8671B8AB3BA65C07EB6A
-:10798000ABDE2612B188C967783CC573387E994C46
-:10799000F9E49AAD23E77A299D9F1A13D645CA07C1
-:1079A0002B7DE39A3568ABFA04909B95BE89CDC0D8
-:1079B00057EB27F2EF359089AF86655E2F45F96268
-:1079C000D8968618D427EC5F59791D98D9E122936F
-:1079D0005BCA88983F94B26398B7F843333BEF0291
-:1079E00029FD8D940EC532E992E97597CAE867B60C
-:1079F000C8182FA6F75B95A940977818CF57B432CF
-:107A0000BD3FF6450FC69D8B6BC377A25FA097E283
-:107A10003E653449FE605EFA12F88D8E335E27E5CE
-:107A2000700EE1C75E162F2C5EB16C3DBC27652E33
-:107A3000F1E1BE5C62E7A0C8B7599C7A979868D715
-:107A400040CE03C548DF5D01C617E6C3A5C817FBD6
-:107A5000C58ACBEE86B8A4B066EBBF005DB38B09D8
-:107A6000D015EEDF43EFEFE7F494B2433AD06F3F27
-:107A7000A7672C219A501F63DD7F41587B27C8DB05
-:107A80003AEFF373348AD7E19E707C18A5C39DDE6C
-:107A9000E763C102A4C3188DE2FDCE2D1D316D1424
-:107AA0001DA7313C42B7B5C7FF997A23989FEC4098
-:107AB0007996B31F5E07F24E9FBFA2D1753E95C364
-:107AC000F5057F5E3C26A93FC284DA1AA9B1579F0B
-:107AD00068D43E14DBFACFA1FAE0C947591DFBF583
-:107AE000743E9077BA0ECCFFF64C9013509FE5A3EE
-:107AF000B080DFE29B3806EBF3E8BA09F8253D13C6
-:107B000065B4B3561CDB3341C4F812F4077EF08D24
-:107B100062FDA9A044406FCA8532EE5765694F786F
-:107B20008201E16396D715F485786ED55B62CBE36D
-:107B300092DE3A606C17E1676E1CEDB19EEE029129
-:107B4000FA95B9C7170AA3E9787778B9BF9D4BFDB5
-:107B50006D7A7FBD97E9A5FB23E69721C4418CEEA2
-:107B600002D44F243215AEF93715E747FBB14B7DF0
-:107B7000FDEA6EF41F76F8539FD39CEE63FBF92663
-:107B8000FF111DF8AD9E50F907B9D019BF59FAC3BE
-:107B90003A9FE0AE27B6F48992CDD65837BF221F60
-:107BA000F480CCEB93643DA4437D6579E634F4FB2B
-:107BB0009EF432BD271DBCF20638A7A1FE2BCB0BCD
-:107BC000EDF146319ED45340DA815FE56098D8F3F9
-:107BD000BF963E6869D0F0FAC4D4711520274F4C87
-:107BE0001D5EA153193834E9C75D90673AB787C95C
-:107BF000EFB9C3B7E1F9C773268B37015B615CB29C
-:107C0000F3113CAFFBB81C7910EB6AA13E8282B441
-:107C10002DDB59BF55CCF16272FDD4ACB0E79B1B94
-:107C200058FC58BD7039C6B554AEC73DD15BF1DCC8
-:107C30008687DA32385FA911D364DF3B6078D00AD7
-:107C40009DDFC3502F4CC2F74D2F8B1F59F522EEED
-:107C5000BA100B9E191C9EBEE7329CF4B0F65F165C
-:107C60001DACF7EB8470BEDE0FDFD45C9048C2160B
-:107C7000FFE8ADEF56F1FE59A88BCF823A9E68FC23
-:107C8000EA22908304EE8FBCFE3A42F8F795904FBB
-:107C900083728FBD0E3DC35517DF475E0C67DB5DFA
-:107CA00017B11E9883D7F1613DAB4CBE29507A9F26
-:107CB000C9F8ED0CF06B6BA87AD02040249B3ACC2D
-:107CC0007F96FBFBF28B7787471A363E170CC73E31
-:107CD000A1FAC0428C23D4ECF763BD7F35E8BFC95D
-:107CE000706EC0ECF238CE0B843BA13E4F39C0C65B
-:107CF0007B12E0A1F7FFA85715C0BA8FC3FE270F6C
-:107D0000EC495462875E0E231E62DEF031A2337DA1
-:107D100026539E88655BFAAC3A061B865D2A71F88D
-:107D20004BBB7CBCEDAB8EC54A7BEB3F8E6BFF0F34
-:107D3000F59B55DF715CFB0FF48776A9F14ED07788
-:107D4000E60B1E03EC177D1FCFEF9A2B4BD00EC412
-:107D50008AC808C0C32BD92AEAB9D8F39E7DA0E708
-:107D6000666BD13735DBBEE14CF61BA361FF956234
-:107D70003CD331DEA8A18D47E7EF00BC5ACF5FC9E5
-:107D8000DE85E716E97B06E60D0B0F8F5E43DBC34E
-:107D90005FF0E0B9216BBFE9E6CB7C2E5F2DAEF33F
-:107DA000802AC89B1FF46D2DCA9927E8CC8359728D
-:107DB000A75E98E0C8073C097696D24F95A310A21B
-:107DC000A4CF4BF1B9C9F9AC85D723A49F2727CD00
-:107DD0003C57A03CA79F67069777C2E558D693DF2C
-:107DE00085E9E7DCA03B4FE2D653D6D5D253DFE29C
-:107DF000FC2993E8153E3ACFBA44FB3C1FBE1D9DBB
-:107E0000047EF0071A3B0755D2F6D0CB609EBFE93F
-:107E100009DFEF9D8EE7BEFEC99B37747958E923D1
-:107E2000BC2EB38F1E62FED5ADCC5FAD9B3F15FD62
-:107E3000BBBAED6374FB3945F7B5EA4286430F0DD3
-:107E4000F31AFC7B7B26EAA3AA0B017CFED9CDE7C3
-:107E5000759C5FE93B9F1F9F5BF3DDE5D2B38726EF
-:107E6000FD74179C73AFFBBE227A6CF3D47D9FD751
-:107E7000FF7BA9DE75CA7B18E45D2E22C9FA2ED0DD
-:107E80000FDB54AB1D6E9E330BFC5A9B7E2803FF09
-:107E9000ABF77DF8CEDD361FEF6F56A6EE9FE1EA19
-:107EA0003FC61A7F21F677C393D43FB01FA3FDE5E9
-:107EB0003F7B2CF8507F3D24BAC6CBB1E6BF11C73B
-:107EC000B3FCEE8BDADA574D19F8345E0EFBA79E41
-:107ED000DB8801DF9F785C0EF94276BED518BF566D
-:107EE0005DB8D441EF5EBC8F73DC7FAF21E8A8D7CB
-:107EF000BD235A8775DA1779FCA98A7AE6F8DE9EDF
-:107F0000918E3ADDBFC1F149E1B83A0D1CD77CC171
-:107F1000701439E4B3178E62C7FD4F0AC7428DE96A
-:107F2000AFE5FC3A5767E766E71A42A889DE9A4B45
-:107F3000EF7B29AF7F995E357A9D2B13D38FDF4579
-:107F40004DB0FEB40DFBFB1BFE7CEFBBD762A22A3B
-:107F5000E8A82B90789DB75BEFC0396F56EFA63934
-:107F6000BE0F675D7D12ABD774DFFFD0C7F0F28D17
-:107F7000CBAB09F8D3D4574F796E6D975FE0DFFB39
-:107F80000C8A8E38376F5B75BE9F155C72069BEF4F
-:107F90001B975F4F20AE2BE7A6FEBEDD413F83BFA0
-:107FA000450B639D784CEFFFBB349F149EE14978ED
-:107FB000AE413C4969F0546BC1A3B3BC604BF0F3D4
-:107FC00081A724C3A25BFFF8D9CAE126172E413E40
-:107FD00092389D5A60FF96A2BF95FF68D13E5FF828
-:107FE000C383A4EF73195F0C7D170D92BEC55C0EA1
-:107FF0005AF4CF179E5B0709CF7516BF05C348AF6C
-:10800000CF0B9EAF0C129E6316BD8CCF173FAD49B0
-:10801000FEEF1F9EBF70B8F333581CA4A5849D27A4
-:10802000F14991078B8481E5C257ECDC676B853E93
-:10803000679DCDBBCEBAAF74EBFC355F673A795A1A
-:10804000A924F2807EC71A583CE00DBE3FF9755551
-:108050005326C6E75DF3B404F765F617B7F9EF5595
-:10806000CE73B903C9F1A40C96FFB931EA7C6FF95C
-:108070008A0C571D9989FD2CFCA51BEFAF056F617C
-:1080800048620E026F145F5945FDEC1B3E6B7CA5E8
-:1080900093BBA1E22BA60F0D5F03C9FB5786882F68
-:1080A0004B5EFF5AF1950FF89AFE37FE1A2CBE165A
-:1080B000FD4D1E8784AF5B872A8FDCAFFD6BC5D774
-:1080C00060E5D1BD6FA3FBBB507FDF17F8ACF1E7D4
-:1080D0009EFFD3E2D11A6F659A7D5E3A7C0E0487CB
-:1080E00075FDD03748BCBAF79F5F345E5DF37F6A99
-:1080F000BCF2F1868CD701E0B0AEF220E5DBF2EB0A
-:10810000DAD4D4DF111D97C9BEE3365EA83D321F15
-:10811000F2C77F27617EFAC89E391BECF540E33237
-:1081200099BF7DA472F606889F9E8B6460EDD9513D
-:1081300031F4F36990575EC4DE738F7F84E3CB9391
-:10814000996DC57FF380AE47238BFB954752695BE2
-:1081500017E68D6CF495FAE2FB0831B64F833CC408
-:1081600082D47058744E37EF50E97B34F2F890F4B3
-:10817000CF40EBFD0FFF9841EA9F04F6CB25C9BF26
-:10818000BB7319E0B34D64F570C7E156017CD78D20
-:1081900060A7E52BF2F7029DEECE64F9C30ED5D8A9
-:1081A00000F913CFE2050F6452BA1D5D9A2DD8CFA6
-:1081B0005FCEC964FBAF19AB52EFBB16723EE87DD0
-:1081C0005F20E353F07798F75BBA8A7D7F8CC8E134
-:1081D000518B6CE74ED7BB9EF7A1476600E1389AFA
-:1081E000E6DCFF02FEFEF225FDBF4F6AD9F77D28CF
-:1081F000DF8DB29F7B4DF219978F33FEE8D24C7A18
-:108200007D43887EE73EE0A3097E766E4826455092
-:108210007F658D932B934E95E2FD5DC5180579CD55
-:1082200014E3DC9C393DFD38E9F06AADC79A074498
-:1082300011BED333576371C46961426641FCD013E8
-:10824000BA9BE50F191FE4F03AC499B5198946D8CD
-:10825000F7CA749D36783BFEEFECFF06CF3B8E8865
-:108260003A9E6F77E16120FDD094C9F2C9B952748A
-:108270009317F226AB8594DFB1DB98C9FEDED1A45B
-:10828000CC64BD14CE336E675481EF5F2C9359FEDE
-:108290008B90E8A885B6F927717E73BF972BB17ACA
-:1082A00023F22693E7B67DEB46A5929F5F70399D3A
-:1082B0009459E2A8735C12B95B01F95CB260A162E7
-:1082C000F8E1B981E32FE570B4A9D15153FCBD7831
-:1082D0004AAB87387E3A8E459BE0BB1FABEB05ACC3
-:1082E0001328DDC8F86EF5C683E2067ADDCBE56FAC
-:1082F00021D0C036DE77395DDBF6F94603FC6DC967
-:10830000FC0D1D98C271F36E82F99027B79F6E81A4
-:108310007C48B74078FEE4C64AA86BE8E6F56D2FC6
-:10832000D3E78D80BF397928DFE3367E5807FAB965
-:108330004325785EE6775B3C09384F60F14B524F3E
-:108340006C3CDF00F5C38FA89D13816FF29A6AEF32
-:108350004B953F7D89D3E18FFE48562A3FD0BA5ACC
-:10836000FADCEAB748369454FD1757BAEC1A877B03
-:1083700098A7F30C4991C74CF261A27F3FED975C3F
-:108380008FFFC295E75D722C759CF1579C7FDB12C5
-:1083900015EBD16E991E3C8762C163E12BD76478DF
-:1083A0005AB64472E8DBD50B325C7E0FC3EB0D1E70
-:1083B000E35158C723FB7E3A11CF51B9EC834F8A62
-:1083C000AAF0FC0ED2A9809E785F32F0FA4683F3C1
-:1083D000EFBCBC41A2DBA783FDAC9752CAD51F39C5
-:1083E000FFBCB1E296A5087F4CD201FE13AB865DBF
-:1083F0005F06FA65851282EFA69F88DD9B799B6DEB
-:10840000FD49BFC605D7AFAB6EE9D76E2D5FE1A4BE
-:108410005B9BCAFC02F33A268777521E9D85FCD5EA
-:10842000BD7D269DFF482267CA56D69DC0DF995A5A
-:10843000CC7F7F5F8CEE9849F5CD2991E549CCAF93
-:1084400030BDB16467A41952A7A7EAAF78A99BF61B
-:10845000F30618DFFDB6BE7FFBE8E6A7713B9DFE85
-:10846000DE8C634485F7A375A9EDC1B7F50CFEF763
-:10847000C442A341BFDCB43175BFFF05CC4CE13928
-:10848000F517A92A557CF22A9DC1BB3A92FAFDAB99
-:10849000F44CF61CEC520A3C9F0B64703DA78F060F
-:1084A0003DBD3A0DBC1F060208EF3BCDF7DF04755A
-:1084B00020EFBBBE03FF4E80F1C5C100E3EF53FBCD
-:1084C000562A7940A71641077E783B3B3401F86D68
-:1084D0004DEC049E7739C0F1FCA62F3225301DE407
-:1084E00065D1DC3C4A978E55242418E9F5FF9501A7
-:1084F000E637E4F2782DB57FEF82FDA3AFBE8BFEA9
-:10850000871C1E7DE34456020575E0A744731DD603
-:1085100019EEF3B1BA52129A6EF7E3BFCCE138B557
-:108520007F68F45E1A71F9417DFCBF7835CEBB3FA0
-:108530004387BA94239552E7B514C893FB33F0FBF5
-:10854000B86EB94837FF50FDC053FB87E6070EB43D
-:10855000EE0D81A241F981E72A1FD9310DE4488D42
-:108560004F4AA57F2D3D7D94C7DFDDFC635DBFCA0B
-:10857000F9E8FD44FF70DDB1DB09CF4DB54E782C35
-:1085800079793FD1E45B0378229D13ED7E299933FD
-:108590007D003BCBF253E9E0DCEED213C07940879B
-:1085A0003BB9BEF96DFD23013B1DDCEB3F25F2FD20
-:1085B000C1A3AC2E776C644D459ED1CB9FDFFA9C56
-:1085C000F8D2B233EE71FEB3F3A165E706E2C3DC85
-:1085D00034799C4970D099BEBF46D655C8D74F0A4A
-:1085E00018AC4DF47970548B94F1BA51628C86F3C7
-:1085F0005FA7F6F9F0EF43995B3D89B15404DEDFE4
-:1086000077F504FB7A7EC5F974F5926CFCFCC4FB2B
-:1086100062687E3ED69D49F81DB7378EE5CC83F65D
-:10862000238745D0D0E4A6BA3512ACEF8D00DB77B6
-:10863000AEDEF83AFA8343E5F3D5B54EFB7F155F1E
-:1086400047D2CF927BA601FFA4C3C36B1C0F4B2361
-:108650000BE7827EBE65A380FAF627300E5DC82D3B
-:108660007218F5368931FB48348A0F6A424EC022AF
-:10867000001FFFC0BF5B254754FB39B9DBB6DD3FA8
-:1086800017FC43B7BCACC8627C5C91C5ECC29BBE16
-:10869000E81F40DF5BFAF96DA1F6603EEDB231A054
-:1086A0005BDF094639B5D6B391C345FDB467F1FB2D
-:1086B000C57C7DA4C7C56F62BCFAC780FF0A0DFDEB
-:1086C000029F87EA7DA88B7EDC877554965C59FEF5
-:1086D0008EFBFD6572D4E13766661539FC77B71FEE
-:1086E000F2377B91BAFF15595FACBDB836EBB3B129
-:1086F00017C3389FB9ED4652AE5BD8799013C73E89
-:108700009A9B4AAE239F100EB73CBFBFCFC7BE9BFC
-:108710007C4D26EA9DDEFD547E02F6CB6EB980FDCF
-:10872000147CF7E3917D3F9B0875BD27B6DF7F532F
-:108730002A7ACED299DF44BAF31DF1BCB50182F595
-:10874000DF84CEF7846D7CEBBDA4BC0C10BF5CB69F
-:10875000F24ADC4FBEB1F2EAD16B4AFBEE2BFAF4DF
-:1087600017A2FFB014E66DE4FBE91D9EAA7DA9F6F1
-:10877000811CAF7DE3C44EFF7EE9C6F266D8526F1E
-:10878000CAB8E64BD114F327F7351B53C7E31EE4F1
-:108790007A2AB9AF31E9BE86E2A37B9514289BD62D
-:1087A000BBAFE9363F9F7DCDEF48CFCF67A2FCA797
-:1087B00086EF7B167FA9D11D5752F84ED1FD8F0948
-:1087C000F223D2F7805FBE957ABFF6387FEF771B32
-:1087D00087A8AF8E39F733E9E4EF7B9F91FCB5A909
-:1087E0003DA3400FFC6EEFC76FDD0FEBD9EB437C71
-:1087F000BBC789E812DF5FF8906F2DFBDCA132FD6B
-:10880000FFBBBF1B817F37DB2D1F84C4AFBF8A3EF8
-:108810003FBE4F9C02DF596CDB9751956A9FB35E58
-:1088200017787CC919EF21DCBF5BCAF94DDFF774FB
-:10883000AD3D1EFD26D757561CE07F67313BBB641C
-:10884000C14215E23DB725E34D04372BFA65857B20
-:10885000E1FB17BFE4E7B9CCB59929CFC7FD86E3A3
-:1088600077A038C48A55CE38C19205FDDB9B938929
-:10887000D47559163FA79B6FA8F6A52D31B4BCD867
-:1088800040EB1CA10FCEBE2C25B55F8278C73212FB
-:1088900052E0BA84D44EFC3145E5C9DD8B119E5FB0
-:1088A0005A7FFFF8E37B27DAFD98FF0F11FE85A1C1
-:1088B00000800000000000001F8B08000000000086
-:1088C000000BDD7D0B7854459670DDBEFD4AD24924
-:1088D0003A9DEEBC091D020818620742001FD02114
-:1088E0004482B2DA810041519A87184948A2E2CA0B
-:1088F000FEBA438720467466C2AA8CBFE3B80D82D5
-:10890000EB286AA2D1418CD8A0F8D8D59DA0AE8B17
-:10891000B3E846C7415E4322A32BB3CB0CFF39A774
-:10892000AAD2F7DE744370C7FDF6FBE338D7BAB7B7
-:108930009EE77D4E9DAAB63915C63C8C7D5B73FBC8
-:108940005F4D628CFDABB579BCD3C1D859FC9B1E81
-:108950007DFECB3AC6221731F6E13A3B8BD8A01CFC
-:1089600036558563D4FB53AA8931E8E85FE1C14AF3
-:10897000190B2D50C33B94C1F5B2705CACB7785E57
-:108980006A30463FF2B9A04665113BA3BFB3F06F12
-:10899000CD9C245DF922A753F4D39A182C62EC885D
-:1089A0001CF7513EEE91307F2FFBBB488C7B247C23
-:1089B000EE716F7E04C61D131DE78666FDB8BD2CE3
-:1089C000B48AB9619C70A2734701C3FF8CD8264456
-:1089D000DBEF759A08AEEC48A689653076876C1B8C
-:1089E00067BC0F057C8DF56BCC7E8B161FB7A77A05
-:1089F00069FEB25C33473F4F6F8A938FCB9CF981FE
-:108A000064C68E6E4BF4133CA6258747C13C2BED04
-:108A10002CE480793EF8E4C59FB1118C2D13F8AF9A
-:108A2000097C6D41781C35F5DF938CEBFAC0E4DCF2
-:108A30000143951DF45BB4F0BB2B85C3EFE8F673DF
-:108A4000C3EFAE143ECF7955FAF9CD3F98A82B1B52
-:108A5000D7FBEF7F7BEF04ECF7DFFFF63B8BB6FF36
-:108A600005A77359243D5A5E52ABF8C34583C77DB1
-:108A700029D53A24B8BF6480E392D3F9D4BF5B65AB
-:108A8000CD1D31D655EEB453FDF981728B07E0B997
-:108A9000FC6EC5A74017339CBC9FE566E6EF80F9E6
-:108AA00030B337BF1AE0EE696DBE2310A39FFF23DA
-:108AB000E0FD8D23901A8BCFE4F363410FB2DE0209
-:108AC00073D012ABFEC25A3D7C7B19AB8A35FF1FB7
-:108AD0003B395F0E951EE5F8C6FA439DC7DD820E51
-:108AE000D36D91DF33155E9C807ECA2E605C437D22
-:108AF000E3B8F73BF5F8338E7FF4CF6A5D2C38BCD2
-:108B000026F83F1800FA89F93D99BE7FC0DA1B7735
-:108B1000137F27F9762018B62FFF09A09DAD9C7D05
-:108B2000C75BF09A25A614D0FA16070E5412BB9D07
-:108B300079B018F1FE6DD5833F2985A91DB5065B77
-:108B400093A1C1D1F58A2FE41D3CCE07B84E90A366
-:108B50001FA13CBD08FB639C6E67C2FF65333646B0
-:108B6000F5D7A3506177D9BC3B347CEB5EFBDD3A93
-:108B700056CCD853D6C0FA64783FFAEEAFD73094CB
-:108B8000792C4CF3FEC2E2BB85E0CD18F1FDA16D5E
-:108B90008EAD9BA05E6A0A97938CF9F203E335725F
-:108BA000C2ECA4F250F1F3611CFC5CA89C92EB8C2B
-:108BB000370E409EE6377786A34D4965ACCBEABDBC
-:108BC00009D7D33F3BC1B90D5038D7EABF1AE1F3FB
-:108BD000C10193A9A580BA35239DCEE343B0826B32
-:108BE0000AEE1F578AF2C7E24F80A954431B36157D
-:108BF000E868862384FD957E38E719C4CF83B536AF
-:108C0000AF8AFD4DF37EAA4279EE5536EF7AE8AF92
-:108C1000AC67C45E37F43F7F8EE264D07EE6EC51F1
-:108C20009E5E585FD25AE8270747B8B7AAC2CCD889
-:108C3000D3F89F97323E6180C55C45965F6C9B0977
-:108C4000F2609CA7CBE40050AF4C7BB1CD0EFDDEB3
-:108C5000D312C872A6C1D236DFD7661FC658468661
-:108C6000BF67BA8FB1D99BEFAFB25F01EB7C54B451
-:108C70000F3DD0E6CF63EC5553B04081EFCD9B77ED
-:108C80005499015EEE4239FE2B6DFECB613D57DDFE
-:108C9000B2630DF4BF25ED9FAACC38EFC572FC9EE0
-:108CA000AA8A9130FFCB65F95FEC385F77926C0F41
-:108CB000F39DC298654474FEE62C18DF25CB9F54C3
-:108CC000CD84F13F2E6FAE30C3F8C7D2FEBDAD6884
-:108CD0002C6393E7943BFD50EEDBFC1F5549809FCE
-:108CE0002E06740AE53F6C3E4DF377AB26DE7FE837
-:108CF0008F34BFB2C5A171F85D617F6AAB8275AF79
-:108D0000B6F7BE85E4DAB43664CF4091A4703AB1C8
-:108D10005B9AFDB9003BCBAEF2482E4DA79DD36BBD
-:108D20005E643CEAB181F218288FD794B378B96BAE
-:108D30003D5B124BDE76BAB81EEE4A8CFDBD228D2D
-:108D4000CB03801BE993D483CCBF33865E1997E6AF
-:108D5000A07EF627B290DD15E5B76B8187A7005F8F
-:108D6000323B9FA7EC6790FE48E3729F85AE75216A
-:108D7000DFCCC12E60E9853E258474CD9A93C2A3D1
-:108D8000907658C43C0FF5876AA2F97A5465493544
-:108D9000F49791C8829DF0F4A4332A437B7FA723E4
-:108DA000DADF7B82EE2B0B03DBB1BFCACCEC92D6B1
-:108DB00082683F30EF0DF609BA799BA7B8F0FBDC6B
-:108DC000925B8B34F02CE2EB003AA07630CC33D3BC
-:108DD000810FBA7AC68DD804F3FB06E5AE27BAAE8A
-:108DE000B29EB91606F5B6B8843CF1F2F69E0A2E8C
-:108DF0007FFA6F4D0A6F43FEB4FB4A104FB2DD0D90
-:108E000002EE15F7CEF919D66BE8B1301BD45BD35F
-:108E1000599EC9CEA1171B4E5FC6C213356573C4D8
-:108E20008A72A7E1F4347A5F71EF7B56E453ECC7A2
-:108E30000BEB5A93E0CFF421DC5A63E39FB1169A0F
-:108E400047C3E934169AA87DCFE114EDDF4DDFCF9B
-:108E5000B7AE687F2A0BA79FAB3F2B7D1F80BB5906
-:108E6000C0DD1A7B9E1B04FD20BC4D1AFA9A2FE828
-:108E70000DA49F1FE5E1A16B8AB6A1BC8F8EBB9E9E
-:108E8000FAEF32031ED10EEC49F4A25D5C66E6F205
-:108E9000B3ACC7E50C2951FA907421F1DAE56A2EDA
-:108EA000A7F5562BCE6D0583E775BF9C97D0A79984
-:108EB0008B83EA52CDFC243F40FF5DA2FFD229C440
-:108EC0003FBFE0F4027C7303F22FDA2DB80E5F642B
-:108ED000FCDCE4C1F33F0DE4854FC02387FF5F391D
-:108EE000C2A80724DC06C33FF73CF8CCA7EF653DDA
-:108EF000FBACB8CE86387CFB802B85DA651E8CA453
-:108F000078A1DE19617774754C4CB80CF9628E89C2
-:108F1000A108C375A3BD5A36206FAF7C7706C8DBA6
-:108F2000CC8132C85B2FE26140FE46ECF668FD1F43
-:108F3000B9AE9CBD01E4B5DB06F82F223BD4CE349C
-:108F4000FEC4EE346EBF4D09B29876CBDFB9927590
-:108F500072ECFFAEAD60BF85F599D3B8DE9FD21B32
-:108F600052102F92AF8D72EA13C18F1F8BE7FFBC97
-:108F70009C52CE23A7AA859CE2EFF783998FF53206
-:108F80003222E315D089CBDE9D380AFD99DBB2543D
-:108F9000EF97C057F314DFB067A1DF1ABBF79E64E9
-:108FA0006F944E6A98DDEB40B883D17416F5FE9C41
-:108FB000042AE31FDA25A7DA154E87CC9B5A333EE5
-:108FC000BE1C92F3B82DCB4AE32DBB6F546A503BC5
-:108FD0003FA127AEB5459E658583F95C9661FEABE2
-:108FE0004DAAE6BB83EBB3B1C9FE6FD2D00E555884
-:108FF0002DCDC7602F3904DF19EDA587B16F0FFDA7
-:109000002F62233E3691739AD9660B33DE24847E19
-:109010006A660713FC1A313568E8C0EECAA3792CDA
-:109020005E081F2F01A6B4BF71C9971A3E7A07E7E1
-:10903000437A213209F934C1C57476DE623590A7CE
-:10904000A0DD9A69F3A19C013C111CF62730730244
-:109050008CFB363C116F95EAAD7B2D6EA403C5D712
-:109060004AD0DF2AFC5616417D73EDF424B25BD959
-:1090700099DB4756033C3C499C6EA11FBBE8C74E99
-:109080007422E4DEAFF3C76E43FD24E5A7C4033BBF
-:10909000A3527FF2FB7EA53ACF09E5FD9E8B4A5A8B
-:1090A00015BDFD83F650D47E4ABF6F16F0E3E4AAE7
-:1090B0008E880958A825E4997D27D4AF4CE26B1E11
-:1090C000E9E27A707F41484DC1FE46C13AE0D55B86
-:1090D00089C1A26647141F60E304117F1956783ACC
-:1090E000387FE0739F8BF3D99C748E942DE9BC9CE0
-:1090F00091C2EB1BE9ED49F17D95C2F1BBA99CCB77
-:109100000963BDE92EDEDF6A7BA82A6384D6BE0A26
-:1091100030A44333E37696DF25E8A482C3ABE2DED6
-:10912000C5A9A837BFED999FCA8AA272F41E25E887
-:10913000F441FD7B2C819F52BCE35F5486FE883551
-:109140002DE87441BDF4A4D8FEF24D621EE9E84F4B
-:1091500043BD9F087FC772FA62F2B317BAB83C4B9F
-:10916000C9AA21798E30F4A29FC2FA434E0DFE5255
-:10917000A798747E83E57431B5BF70BBA1248EDDE2
-:1091800050AAB31BE4B846FBE1D37559347FD9FE2E
-:1091900086AC8F2A99A6FE8DACF71EECEFC635B9CA
-:1091A000BA38513CBBE32E011FB4134231E765D5F9
-:1091B000BDFF14FCC49076FC237CFCE8B849C06871
-:1091C000D171FD2EFFDD2EE2A7CB9D872F864702B2
-:1091D000BC5749DF90DC07BDE4DFEA207D5485F20F
-:1091E0005AFA47C8F7CE54A4F1F20DAE491AFD2839
-:1091F000DA19E5D09F453CE3CF4E6EFFA51E94F6ED
-:1092000062A25751A2FA66B0BE127AC62017CF6783
-:109210005F03BD86B4FADFD8EF53AEEF6B5716C6C7
-:10922000A18FD1FF237665D9E541753CCACD2A854A
-:109230008D82C7E4997A3DDFEDE2FE47B72B49A75F
-:10924000E7E72ED6D78B60BD49F84C1A92BFA2D55E
-:10925000438A8AF28EF7D728E8A1E0D807562FC8AC
-:10926000DFFF1276D017E9FEB791AE3624A614A31D
-:109270007ED8FAA78A315B61DEFDEF5B7CDBB0BB99
-:109280005D9C3ECA17AD6935C37B4B87E2B4318D17
-:10929000DE5ADB79C90A58EF0792FEDD7C1D0DEE20
-:1092A0008875248C9BD3C0C7CFEBD8AB9835F22DF3
-:1092B000AF8ED73BE4B2E8F45EAF287F26FD0F16F1
-:1092C0006EA92CC5FA7EF326107D391D0AC583735D
-:1092D0009A01004007393EDEBFC31756961745D79F
-:1092E000D966AA2E42BDD09691E443BD30D61D3C2E
-:1092F0008CF4DF70281241304D3ED46346FBAEC281
-:10930000EDFF0ADFCB757A55670ECAD5A4437C7E84
-:10931000ED067A070B59D0F9362E6F55F60E437CC1
-:10932000A0EC80F132D68F21BD24EB67B8849EC8B3
-:1093300060C117C8AE626D8CF0C5681D19EB47930C
-:109340007D2FF119B5A3C64E403BAAF0818879194B
-:10935000B4DBFD58ECF8BC45E81158074BF744D78F
-:10936000118F2FA41E93F52C71FC6849EF4955B15C
-:10937000ED53D000F4BD7C91FB3A5C77C3062BB370
-:109380002951F857B803E9389F9C8EAD0AC246D2DE
-:10939000D706D7D34A2EACEFF65B985365F1E7DBDF
-:1093A000B0F6C54B5668FC2DE89FF0B1D5CAEAB4BB
-:1093B000FA54FA1317A773FD73A73B3002C76DDC8D
-:1093C000B5D98AF8BD65FBE7566DBC7BD03A8608F7
-:1093D0002FA58EFB290DB5F630AEB37C9199F057D1
-:1093E000BFC11A4679D4B0B33362427BFA6EE6430A
-:1093F0007E6FE8E87C2B07E092DBE09FA47AA3FD78
-:10940000E53684159C4F0610610FF979112BEA6738
-:10941000235DA33D8C76C95B099CDF4F943B420AD8
-:10942000C0EF8425D880F54E6427F942055178BFF6
-:10943000DD39EB1D05583AF9055B049F6DA66D59A2
-:1094400076A8D736CEEA433AAA700767A5037C5CB4
-:10945000E64017B64F7327FB5AA0ADD7C626907EBD
-:109460001E221C261BE861F2DD9C4FFE263D45DADC
-:109470007B13500E2D4D4F96F612C9A7B72C7C1DAD
-:109480001B189FEF3E977F01D1ABD345E3E63444F1
-:1094900014B4F78DE346E9C9BFF842E81BEC3C2B56
-:1094A000CAF57A2167CA176D577EABA1837A3064FB
-:1094B000905E72766E55D00F84EF2D956EAACF6CAC
-:1094C000286776F2FD887AF87E9346AEC875C49018
-:1094D0002FB7217C1D877ADEE4F22542F427E76B63
-:1094E000C4E78FD2B91D77259805F4DE1A1AE385F3
-:1094F000FEDE1A9148FD497E37F2E78F049DE7D4DE
-:109500006E57306EE04EE276A39C9FACF745FA8C26
-:10951000F5389FC9553D0487D5B566C29B9C4FA5BC
-:10952000353012FDAF76D1DFBE859F597BA1FCD0CF
-:10953000AF0E103DAE6E57FCE417B41FB0CEC7F8A7
-:109540005CE8972AC663AFE62609DBF2D201D22394
-:109550005777F138C1EAAE4EF37247944E0B8EED59
-:10956000BB11E96C75878D2528883FBE5E239D82DF
-:109570007C21BA67212BED67817C0C913C65C1028F
-:10958000F447A4FCDD27EC4BE6E0EF9F10F396FDDB
-:1095900046E56602D17BC1B109FBEC00CFD53EC5E3
-:1095A00007A612D8DBBC1EF41F21F9CBD808F4CBD8
-:1095B00064FF46F8FD5AC8D518787E3E3D861E9158
-:1095C0007AB5E0F1190C9F127F660177D9EF9E748E
-:1095D000BE9FB527DD4CFD6F28E7F1EB0D16AE3FC2
-:1095E00036B4D8C3C8D76FA75DF98E520C707259C4
-:1095F00023F8DC6F5AD680DFF7E7F079B499D68F7D
-:1096000069E6FAEBF574C25F0AE3F289CBA3875EE1
-:10961000E4F2A421E4203FB12158B382F61FDC0913
-:109620003EB4F759F04DEBFCE4283D18F1EB7D61B9
-:10963000AFD50BDFAFEEE07C10855B5847B720E776
-:1096400008EFFB5C723F2258807005FFBD05E30CFC
-:10965000D27F4F591C08257B07F36BBAF0DF27092F
-:10966000FFDD32C5FE17F5DFEBD7FE5336965765A3
-:10967000BD4B4FC92FE027EAF8EA84F0DB0E08BCA7
-:10968000FF41D04B7D6907F143FD97CDC4478E2A3A
-:109690002E4F1C87F47290B11F8BF53F40FD54266E
-:1096A000755CA9A23FFCF78AB395C59FF7CD4AF335
-:1096B0003F4F45BC74AAB42FC5CE80555F06704D90
-:1096C000103010F52C6E1EF73EF1142002F9D2DC9A
-:1096D0006C3D97FD7BBE7E59E42305F15D2F607DD7
-:1096E0006267C5D4DF613CF1A954DF2858FAF19DC7
-:1096F000F3FEE677D0FEC4F6E93ED4D3EED600D131
-:109700004FBF27C1877143B70A962DD0434BC71B64
-:109710002997E1BED833974C40B999E7E67C79ECBC
-:1097200045752DC267FD3F3C3F0DBFD7879574B48B
-:109730001B4F3CF5F77F46BD58B7BD093D0DD6FA26
-:10974000CCEB64879BC25BF9FBA752C9BE3CFAC451
-:10975000E66908F7D68E56FA7EEC89AD54DEF70F2F
-:10976000CFEFF94FB43702293EAC77ECC5CD3FFAC5
-:109770004FA4F39A141FAEA32168E6FBB692BE8DE8
-:1097800072AB732FF1A9A497AB51EF229C6AB9FC7D
-:1097900091F4FC85D8575A56E1684379F6C5A6E49A
-:1097A000BA58F144BF582FC65C488ED52A144F6B67
-:1097B00003AAC1B8465B229B82CFA4A2883517C6F4
-:1097C00059B8B8731AD93DA1CF5762FD79BB12D8E9
-:1097D000268ABF61F016EC7F2275C6C683183C0C42
-:1097E0007E32F4BEFD2CD8D71F5B309643FDE9ECEA
-:1097F000FF796DEFFE11E5688DBD77AFC71B7DDF8B
-:1098000026E234509FF44ED99AD8F1D02AB743D0EB
-:109810002DD79B395DD5795E921336DF288D5D3A61
-:10982000EC60F32610432CA7AEE74A5CC75563965D
-:109830004E24BAC0381FEA9F9083FA5F8D714AE0C8
-:10984000B3456ECE4F194EE6BE14C6AF3433B703E0
-:109850009F8C7D642139B283FA05FB83EC2AEFEB00
-:109860000B77A03DB2C512CC9E84FDB409BDB59D59
-:10987000CF1BDA3B71BF14FA735E3A81FAE9B1B8D3
-:10988000A87D88B79FB5BD4589CE1728351FF51629
-:10989000F657EA403D13AA25FC78ADB4AE635825CF
-:1098A0009BD65D7CC3F828FF1AE33B28CF701FF8D6
-:1098B0004E77F96DEE49D1A78CFB18E1F9327E871E
-:1098C000757FEBF6D3933D95AED32BF1EC957D0BE5
-:1098D0004F72FDFBEAE7246F1A918E71FCE0973A14
-:1098E000FDBB5CD2F12B9F131D2FDFC5F56FE3AEDF
-:1098F000122BD2EDF1757EF65B30401BC53EEB16A8
-:10990000A57725C5795E497062FCEEA4D037F50FC6
-:109910007C7E18F74747ECCA26BFFEE42B09B5D872
-:10992000CF7E9389E0B97FDBC55B5B15ED3CB93F2A
-:10993000007630916A23D8A9DC0E5EB119FDB3D54B
-:1099400075CC87FCDF68A09FC65D07885EA41D5CA0
-:10995000F0F8DC15DCFE4CF025A0FF3693DBA30C01
-:10996000EC51AC9F3633DC6225FA2A2943FADAB788
-:1099700070CF46D4E38D339913FBDF32CCFF4A2EF0
-:10998000AD476198CFB2C5D23EC30CEDB7547A9DB6
-:10999000004980DB76B27BD918ABD0732BC85E6EE2
-:1099A000CCBADE477C669407AFB490DDD5E84DA411
-:1099B000F95CBD4BB98DDB230EC6E7AF107D5E1D94
-:1099C000BE2C8CFBCABF17F093703C69E9B911E15A
-:1099D00071F2252044F87EF54C4EAF69333B488E3A
-:1099E000BCFDCA2CD2E3922E935FB6913E77999D2F
-:1099F0008A8FF4DA3C9B16AFED16AE97D2849E297F
-:109A00007C80E33722F82922F440C46DD5C75B9CE3
-:109A1000A162D4BBBF17F8273182F25DC893D52B62
-:109A200022C44F0D3B797F6E9BBFE4760DFDBA2BB0
-:109A3000B85E94717FDC07A88E212F7EE7E6FAB12D
-:109A4000E0F1659BD15EBE0AF08E2A25678C90A35B
-:109A5000401708B79CBA00D1C155EE9B7D6A01ED55
-:109A60001F909FD8DF6265B1E23C47851CF5A407D3
-:109A70004A31DEECC94C263BC7A3969B12B05D89E8
-:109A8000E2DBE6A5FD4DB2F3FA3DD9BE6D3A7E0F9D
-:109A9000949AA0DE918C648EE7F0AFCD73C7231F3C
-:109AA0007AA59FAEB3FB06FBDBDC6E9CD31E2A4679
-:109AB0003F44EE5F4838845B126BB5F2B34FC02170
-:109AC0003C96C7F3C1BE7750FCDA09E3A05FBFED57
-:109AD000B227B85FDF4AE31F74F3784625AC0FED79
-:109AE000364F61600DD7A7C9BE58F0B853E079DF93
-:109AF000C21B4BD0AF6CAC71F890DF1E7A55594643
-:109B0000F48CC141F4B7832B080F0CF080FCC082A9
-:109B1000DC2F6D6C0E8463D37B35F15F23F29F42A3
-:109B2000F44EF176A0F730A777AEFFA4DF8FF2B145
-:109B30003AC67EA8942F8DD6DED148C7921F1AA7A9
-:109B4000F58E46B80D559E9CB400FF23FF001C9077
-:109B50007F24BF24EFE67CB2A9C55B8EDF37553288
-:109B600067AB461F19FD259C27FA9D52AE8F7507DE
-:109B70000A3D1807304536621E8594C38DBBEF1B26
-:109B80001D2BCF4DCA61BB99CB377B3829DCAAA1ED
-:109B90002FDCDB4B9E404FCADB495A1B3B2E52E663
-:109BA000718878FDD0F222325097A3BCD996144622
-:109BB0007925E344C67EC778145D3C46FA2DB8BFCC
-:109BC00080F5E77A38BD547AB89CB85E3CE5FC2550
-:109BD000FD7B4DC1CF319F289EFE92EDFE52712B31
-:109BE000398ED4A346FCCBFD115C4F7551FC7AED48
-:109BF0007BB97C32D2E372C1275E5C2BD47B4EEC06
-:109C0000670DC62FEF87D59A75F96F6DA6CEBA5836
-:109C1000F12FB9BFC11E320F29BF6EEF3A9E47F533
-:109C20009CC8A7658BCDBA7C2A87CFDB82F1D3197C
-:109C3000F6821295C6E571ACE469EC6BD4C3C5BB82
-:109C4000DAC7609E9227A0DF1FC9AC4DD4ED3F64F8
-:109C5000075DBA726E5D8EAEFEB0E611BAEFC3D785
-:109C60008ED37D2F084DD0950BDB2ED5D51FD53E3D
-:109C7000439F8FFBC855BAFA63C37375E54D2D1D1D
-:109C8000B588978B9FBA4ED76E86D9692E01B88E4C
-:109C9000EF58A6CF1333C033F5CF6A4C3A7CD2537A
-:109CA00040789D61D6E70B5FB24B0F0F4C8BC3FE24
-:109CB0008A99E86FDA9109E7CA632D66E66F7A65DB
-:109CC000FB82C1F4C0ECBDBE400C3F53D2B92C1B8B
-:109CD000F7B1A4FCB850FA8B374F497FF1BEC78368
-:109CE000DBBB1EB90FC3E16219804BADEF5C70B1F5
-:109CF0009C0F2E0CE092FCFDE162EC6F7D5223E59F
-:109D0000037F84058D7DDC2BF84896178452B91E9D
-:109D10000ACC3B8F1DCDE3C0411BDF9F347EB7676C
-:109D200070B9361AE640F019225F7F26F070281EBF
-:109D30005FAFFD7A7F26CAEF2A467EB3B3B9E56BE3
-:109D4000D45B4BCC1186F4FF9058CF169117FAC80C
-:109D50003A27F5F3A8D87F7C6C9D97DE3FBE6E0C4A
-:109D60003DC3EB7CF47EDBBA29F4DC0EF61C3E9F8F
-:109D70005C5745CFA7D605A8DED3EB6AE9B9735D7A
-:109D800090CF6B10BE5819D93981F498F1D2A52122
-:109D9000754878626A5E4C7D19B71F75F139F3C852
-:109DA000D71E5A34FB4D0DFF666524BB0F630EE3CF
-:109DB000643619F733CFD7FEBB75B5B3DF1C3574E6
-:109DC0003E92F4C4CEA48F8EC5D741913FF9BB8794
-:109DD000CF6E0A15C5875794CE62C3A9C67E3207D7
-:109DE0009DF562B41934ED0F1AF8B826981AD36E9F
-:109DF000A811F4596BE3FBEF8B0CFCFD92F8FE52BB
-:109E000006D7779FC49133576798A43F6FA1FDC0D1
-:109E1000417CF7932B62C1777F8657C7C78B820639
-:109E2000BC1AFAF9C4D23ECC1783CFCED78F5C9F31
-:109E3000B1DDC3195C6EBDF8FF297F7E725332F924
-:109E40000F08378F66FD9FDC94541B2B2EF35A06A8
-:109E5000DF0705EB9C15B8C8D40F59D1561CC3BCFD
-:109E60007C9F77A413E343320F203EBD9A298E4492
-:109E7000305407C315F0E1B51642FFE68171226642
-:109E80001CC7678AEA59CCA9619A731EEA607A8076
-:109E9000F6212BE5EFF4E6D0BEFF05D213531F1BCE
-:109EA00075AE7DBA41ED2F50CEECF881E58CE473B0
-:109EB00076E6C151B1F4642D8E7D29AC63CBD4FB21
-:109EC00049CE9CA7DF0B855FADDA4BFBD64386DF1F
-:109ED0002EF790E2526BED29C50CFCBAEF12F83365
-:109EE0003483F1F3589F2584D1CE3F20E6098EFFBD
-:109EF00025DCAF6E9E8CCF7FCE0A7C9801ED975902
-:109F0000B99F383EC3FF119613C53EB035D3BA1181
-:109F10009FCCC9D7718958C74693371FD7F1A5E29F
-:109F20001B8B7E8AD314F6E1338545C6F3BCBB7028
-:109F300010FDB3F48B13BDE8DF268E66AC87E2E13B
-:109F4000BE048C9B5993FAFF7124F2FBEB268C30F4
-:109F5000B2E79D7CBECF3F924BFB2AE801A17C2853
-:109F6000C6F730F54D688743FB6B59F018CEEFA864
-:109F7000D31E32C1BC8A677FE1C27CA8E7BB67D031
-:109F80003E42E4293564C5730B3D27FEEE6AE8EFD7
-:109F9000921E0BC59B2F612AC9F37A337B00F926E9
-:109FA0001E3C8FFF75ECFCAE2B32B9DC93795BC69F
-:109FB000EF79E2FBF13879C48E4CAE17647E8C45A4
-:109FC000E6C778FCE7CC8FB118F2632CE600C37DBE
-:109FD00060CB407ECC6246F931D08F363FE6F88CBC
-:109FE000D8F3708B79584E27C5E93785DE1F1F716E
-:109FF000EE755A4E27E8F2ACA3ED1DF43E5E7ECE20
-:10A000007831FEF138F9496307FACF66A1746D3BE8
-:10A010002F9FF7C03879F4DD62C8F3897EE7F93DF8
-:10A020001BD2389DECCD72BA9742D74B59AF05E998
-:10A030007489C36DC1F85180F93AE9DC8ED9D2DF59
-:10A040002BF96E04D6337F8176B609242DDAD94BED
-:10A05000D65ABEE8D5C8A96ABFBECCB0BE46EE6E21
-:10A06000CA6234DFC4716328AFEF14F3A63ACF217C
-:10A070003717DB55BB59B3DE4371EC865B05FC0E2D
-:10A0800065C786DF7599DCEE88771EE2D6CC14DDD5
-:10A0900039BDDB9DE7969708DF60BAB67F231EDCEB
-:10A0A000F4FD7C70F6E0E61AC6D1CA159EBFFF1714
-:10A0B00087779A3857C5CF05580C79E89BB2B8FC1A
-:10A0C0008BCE9BE7A17FE40CDC9E8972D1EC1DADA9
-:10A0D0003D07D065F6274D80E72121778C70D99D0B
-:10A0E000C9ED37E3BABB443E7DA2CA9A3B35F0378F
-:10A0F000AEF73941E7B2FE060BDFBF82BF801DF02D
-:10A100007203E372EFE1CC11222F3CCD8CF270315F
-:10A11000EF82DDE07C8BF693249C07C14FC0DD0805
-:10A12000C700F3DE8879DBE783674796FF6184CB5E
-:10A13000D203895694FF37DAFBF7A38FDADB63FA91
-:10A1400078243C3F778C3CBC9DE1FEDB9897F7C1BF
-:10A1500033658A8FE751B09964EF28A15CF5ECC5AF
-:10A1600043B77736A604C7207F7C29F2AEA53EDA36
-:10A1700098736C34E6CF7B5DE5ABB23C1477F7A700
-:10A18000231DBD66E374F408F404E5A63D63B7A29D
-:10A190009E79302B5887F5641E1FF3F78FC63C84D9
-:10A1A0000B8513FC59908ECE07A7273219E1E75093
-:10A1B0004A6C3AF94D1C3A31F2079D2F2BFDE1F81C
-:10A1C00043C253EE5BC8F9D565713A944F093763C2
-:10A1D000FE505D9649D4E3F9880F660508CE7DC32D
-:10A1E000BE3E9C00733F64C8F792CF93421E9D6FA2
-:10A1F000FD12DE3F941C3E94187B7EA6ACA1E1E7E5
-:10A20000879A5FBD9C5F71ECF965660D0D7E01D686
-:10A21000FF59DA0FA0C700CFF58867B6A19FE4E326
-:10A220002157EC79960D799E41CB0FA16F257DB317
-:10A23000D0D23ADAAFCF4A8CB95FBF00FC27F47FA7
-:10A240008CFBF6727F1EE407ADB7C6DE7F633AE291
-:10A250007DA65877068BA4E17EE61E1BC5FF8DEB1D
-:10A26000BF42D011C0AB82E035A79FE2188746C736
-:10A27000960B15C6FA6D7C9C78E70BAECE528674B1
-:10A28000BE80950629FE576E774454C0C36D021FE9
-:10A29000D6DC553EB40FCBB3DE3B88EB04F89F18F9
-:10A2A00080A7269FEFD8BA779C232DF1E576BDFADB
-:10A2B0004259738CF5043DC11BB3347E50FD53EFFE
-:10A2C0003A476AF0359EF59AF8F9E87E93CE2FCE9C
-:10A2D0006417E41757639F988FE00A903E40FD8013
-:10A2E0007A67E3EEA925884CB433309FA73F3991B4
-:10A2F000E4686BCEA563BC1A7886B2A47DA9C6B10A
-:10A300001BFF7BF9FF51BB49D1D9AFD1FECDF45E24
-:10A31000E2A7DCF18F31F111F4F8EF213DE6F26FA5
-:10A32000C4A7117EA17B2F4FA3F30508BFE9D1FE7F
-:10A3300006F01F07CF1D1E7F3BF6D720CED1283257
-:10A340008F6F205E61761EB647E13D54BC248A784B
-:10A350001AD80D8F211D586D821F9983CE874BBB54
-:10A360008519EC1B3686FBB73764BDF7478CF76C55
-:10A370004CE12CBBF14709E4072E519C565C37D8C1
-:10A380001F9FFE1CEA0759E4D3BBC83F9476469250
-:10A390007A3669E8F394FEF2F9F2A9F7A13D06F3E3
-:10A3A000996172D0FEE63E585F36C88D1956FE2C74
-:10A3B0009F055405FDCD50F3BA7B615EDFB2338952
-:10A3C00057C0F3A78CC361CD81DFB9D01F9D61B6A3
-:10A3D0001CD3CA2D63BCE38DAC6437E151C43BBED2
-:10A3E00065737E7D31C2E57217C1A5F8959999DA3A
-:10A3F00078CB40BC43AC635E682997A7063927E554
-:10A4000099C9CEEF11617EE6756650DC88C33DA424
-:10A41000303394AF90657452A07CB9409282ED6164
-:10A42000DD5788275B16CC423983693C381E787F1C
-:10A4300059F86C9DEAF3E273BA1230F3798479DE4D
-:10A44000216BCEC3FA267BAFCACFE7C10C32B0BDB9
-:10A450001C8F9793457943CDA91B6FF20E8E633005
-:10A460004732D9BD5631AFA34E47C804EF6D8EC8F1
-:10A4700051CA4F154F63BCE33B532884F9D977AADF
-:10A48000619A6F128B447A303E61071098288EF0E3
-:10A4900007E403F06E1A719E09CE5391BB18E6399A
-:10A4A000FA152CA71BF491C7B186F29E3D01B3416A
-:10A4B0000F0515E49BCC5AE37BBD7EB2B343741EFB
-:10A4C000488904B2CEA69F3F5E638CD35866701451
-:10A4D000F7DFC2EDDE8F13793B4917E9D95CFF3610
-:10A4E000BAAC8CF25D32EC76B4DB4F261FC12397F9
-:10A4F000A837DA506FD82D7E8287D41FABBB6E652C
-:10A50000889FC65DD50CE5E86F14BEFF19BA41A15E
-:10A510003C05796F436D117B1F5AB2A6EC1134CE06
-:10A52000FC7782373440B9E63D363E02F54AA6074D
-:10A530002AF17E96D6F1CCB71ECAAD09C1675FC2BB
-:10A54000F51C50A99F26712E963167FD4EE87FEBD2
-:10A5500075C37C9B704915FD1B310FA8FF3EE6C4F7
-:10A56000BC9141747A06D607F87F02CB30EFA6156E
-:10A57000C15FDC01F5B3DF633EAA23BEA32F82785F
-:10A5800053043DE0FBE9F0BE49D04D61B7C2F7EF9F
-:10A59000DD36CA9F600733895FE6DBF9384DDDE5BC
-:10A5A000D74E827915F64C24321E09F531BF093396
-:10A5B0000C787E1D237FD9587F24D6F752B48AE7C2
-:10A5C000D5E458E9FE2326E4DC6403BF5D16A57FCD
-:10A5D000FA5E22CA4D421FE9F804FB01FFDC5FC6A8
-:10A5E000B7F3A99D9BF3838FC93FCEB797B2E81FFE
-:10A5F000F65B111D87E4EF4CF16DFFA2D994D73DB6
-:10A60000D91CD98B7C7D9978968827F2B51DE0B846
-:10A61000D0DCBCDF03EB495BCB7C2D38CA626F2BEF
-:10A62000F657CA022AC2B9CC795F2BCE6FEAE20391
-:10A63000E9485F4F6617123D5D6EF715260089B435
-:10A640004EF1F99CF0AA76B14270995F6B0F63FEF0
-:10A65000DAFC81FB7A82050B806F160615718E3E3F
-:10A6600058B058138F95797D0B6CE047C7DA77CED9
-:10A67000E67A5CB66F12E74EE4F76DD90E9E5F99ED
-:10A680007D655336E557F07C67E0FBDBB22745E597
-:10A69000088C4BF928F398DF82EB9A27F856F2FDE5
-:10A6A0007CFFED64B7CE0FE8EDCFDF281CDFA145BE
-:10A6B0000AD9830B6BCF6D9FB664CBFDDE3C27C5FB
-:10A6C000B799D4479CAEA4DC9E8B7A1CE56D15E847
-:10A6D0006D8D7DBCF8CE3369D42EF3C9D56787471D
-:10A6E000CFB93419CEB9348A732E4DBB5A2C1948C0
-:10A6F000EFE29C4B53F7E71BB5F97D124E83CFB9C0
-:10A70000F4535EE3026B782F9EFF59B00AD608F52A
-:10A71000DF10E722DEC4731113A274947C5D4284BF
-:10A72000E7CDF9297F2FCF99E4C37C9336D304CAB0
-:10A73000176A4B49F669F37336B53457623D99276A
-:10A7400024CFB52C88B31FFC9C906B5B149EAF1577
-:10A750005A6427787B5476507B4EDF5318A03CB95F
-:10A76000A66C2F8DB345C41130AF74223CC3608EEC
-:10A77000717CF1F646F900FD6DC0FE2A0A7D941F3A
-:10A780005391CAF3CC3CE98192DB8AA2FDD674F3E3
-:10A79000BCBC9AC0D76FF1FCDAEA5284A7519E4B39
-:10A7A000FA32CA75A0BF7D488FDF99B8DE89CAF733
-:10A7B000C0A29BA0BFBEF7AD943FC7EEF62B1668B4
-:10A7C000F7E2BB4E1F9EA7DB501EA8AEA4EF663A71
-:10A7D000EF9751CB2236F85EFA9E751BE6EDD5B1A8
-:10A7E000762BF65767D05BAB1C6F5A913F576DB70E
-:10A7F00044E99161BEA1AF10055DC3CE41710F92D6
-:10A800003F522E19E9988DD4CB9F12296F412E709B
-:10A810007DB598EB39F6A482F19FBEE423AAF09FA0
-:10A8200049DE4D9242CA20E72775BF4DF6CA3490E3
-:10A830000FE89F29582EA6FA5406F93906F3472F38
-:10A840006389445F83EC0431AFD28179737B48CA5A
-:10A85000C5F2298CE17D06122F300ED1B3DCAF9BFF
-:10A8600084F7F0C0F33231EE9D267F5144413CB174
-:10A87000B0A910ED8820D93B46FBA7CCDE9C6487AD
-:10A88000F54D61ED241727EF7F93E424E0F92CCAFE
-:10A8900099D798C4B3CF8E72A61213FF547CEAF1F5
-:10A8A00034CBF19019E1342BCB888F9019E13ADB4E
-:10A8B0003B084F744EC01F074F7E2947985E8E1489
-:10A8C000B033FC5CF27D6FDD817EEFF9EC900F3DE3
-:10A8D000C1AC1C929F7A7B245E5E5D418EE382F266
-:10A8E000EAFA2CDC4FB894F5AEDCA90CA68B93FBEE
-:10A8F000D7AA591AFA9174B95BE4D92BAF8BBCDD96
-:10A90000D264D27351BDC8F15F264A97225D69F0C7
-:10A910007FC5AE84880AF45622DA5F8AF43021AA11
-:10A9200017232687D70AE36E547C6D6A0CBC67B880
-:10A93000BCA4FF269AFC2AD953CC978E7806BC4F2C
-:10A9400043784DB177B49A619E87ADBE9FA3BF5245
-:10A95000CEBC84F772837EA970D498913F2BEC46CD
-:10A96000FCFA09EF95CE41EF4DDF07EFC311EF522F
-:10A970007F0CC1FE04BC2FCC89B15F180FEFC1EF73
-:10A98000897723BE25DF7726382B1C18D7ADE3F94E
-:10A99000C413DF1FD98AE58CD50574CEA533CDF756
-:10A9A000067D6FE6DF4B7BFC2ADE9F58B806BE4370
-:10A9B000B9B3205081E5A6B50AC9CB491F055BB1E3
-:10A9C0003CF26EFEBD647DF31B780F595388B7DFF0
-:10A9D0007D7423DD2711DE28DA97B75760B9A98D7A
-:10A9E000B7FF2AD91E42FFBAEC60B815DF8F7D8011
-:10A9F000CF43DA75D3059D752A2FBC41EDDA79BBBB
-:10AA00009BDFB227927C1276DA34B1CEE98FF175F2
-:10AA1000BA7F7B559517E8F0A6FE9005E9E0B0A94E
-:10AA2000A18CE4651C7FAB5C69CFC3E72C900B8CD9
-:10AA3000F00DF43982E79B6E83211ECBE17686CC44
-:10AA4000D3C47CF16A0DBE1ECBE17127592FC3C55B
-:10AA5000785EF1A3C964B7CA3CD2C8CF98827100AE
-:10AA60005C23E9D73879A5B30A9B495FCE1A2EF348
-:10AA7000497BCDCB60DC92B37FB832967FFD8418E2
-:10AA8000F788C87F97EFEBC20526F43F3A9178E844
-:10AA90001EB3DAF7D12EE94C63BA7B423A0B78B990
-:10AAA000F3D19A1FB7E5017C4DCDE6100AFD7C85F8
-:10AAB000EE3DB9A68745525306CF7F96994578DE7D
-:10AAC000039FFFCA56EBB64D1A3B7DBE141B978FF2
-:10AAD000223D5223F024E5C57C812FE0EFDDC8DF65
-:10AAE0000BECCD64172E12F2FD1616A638C52D06F6
-:10AAF000FEAE777CF399C984F1303D1FAF86E970D3
-:10AB0000BDD0FFF82700FFBA47929DA8E75777E826
-:10AB1000EBD53DF2FE416E5FE9F9BC4EF27958CFBC
-:10AB2000E76038703EFFD938DA7F91E7FA12ECFD22
-:10AB30009F855874BD03FADDC07F0978CE6F0CFA8B
-:10AB40002D269E5F28CA72DC53ED5C0F87400F0BE9
-:10AB50003F8744EDA943B3C3480F25827F251F9744
-:10AB6000087D3E485F5719FD9887883F268A928462
-:10AB7000BBD4CFD00FE967796E10F4F2FB7EF2EF11
-:10AB8000C1FFC4798ED3F3CB2605E47341D45F01B2
-:10AB9000BC7D8D7803796CE7718A7686F22CAEDD08
-:10ABA000EF5813D3EE074947FB0083EDFD88CE8EA7
-:10ABB00037E22B9E5D3F80AF04B09792D08F67C481
-:10ABC0001FFF88CF21E475809C76E4C690D3D67DA4
-:10ABD000BC5EFFD6048A17C8F8B8E437258FDBD5EA
-:10ABE000EF66F95DB9B8FF20FA3F74EB2CDAAFFEDF
-:10ABF00086F969BF1AF38D7263E44BE07EF5064D6A
-:10AC00009CF4505AECB8F5F05CCEEF4B72F9BAC632
-:10AC10007BFC5E1CEF8895C7C58F248A670ADF57C7
-:10AC2000B83897C7B9978867B9781E1179D8475C43
-:10AC3000FA78BAAC5721C6F9729DDDBE412357BCE4
-:10AC40003FB335A3BEF2148ABCF5359C5EFB5E496A
-:10AC5000DBAABDAFED9ADCF22508474FA1DF9A8D44
-:10AC6000719657B85E6834F75A31BFE41A77702A84
-:10AC70007E6FF432FF0BD88FB7D73A0FE0DC27F6A0
-:10AC8000E9FB2CDCDFE84BE04F39AF6B72AB97E0B0
-:10AC90007AFB6EED25F93050AEEE25FEBF2637402B
-:10ACA000E3F6CD97DF45F9C7BCCC847F582EF882F8
-:10ACB000E2BC31E2BA83E3B8FAFB679AACB1F7972A
-:10ACC000595EB22E3E7B43378F1BDE68671B73E1F4
-:10ACD000FB92EE4CF21FEA5242A39D14C7FBEFC554
-:10ACE0005DFB86F5D0BA3695F7E73F5A4AFBB814B4
-:10ACF000F759DDFD36C9B9D5924FBAF47C522FF021
-:10AD00007BBEFD0F635C7C08FCB32616FFBC8CFA8F
-:10AD1000C91285FF6D220FA9526DA8C0B8D0A91520
-:10AD20008CCEBFDEF6AE4AF474DBB30ADD0721ED4C
-:10AD3000B3D502BEF1D683E707BC1AF981E707BC99
-:10AD40001AFF0CCF0F68CB787E405B1FCF0F68BF18
-:10AD5000E3F901ED773C3FA02D97B0E5AD18676BA7
-:10AD60006A63CEB0979F27D0B6C7F304DA329E2726
-:10AD7000D0B6C7F304DAF229C6E178EA3195E2F4F5
-:10AD800078AE40DBFEE677276621DD7425F03C32A5
-:10AD900016F2F714015C5608B8E079036D7FC753CB
-:10ADA000AE7C8701DDADE85939079F97EC5AA5EBDA
-:10ADB000AF5E6D203A64ED5CEE36C33F243FD52292
-:10ADC00015E7F1ED2E85A517E0FDE106FDD9BD796A
-:10ADD000238A9E5BC2FAF7F54C13AF2D181C977FA0
-:10ADE0003957E421E6B01C6D9C264A070E5F04D754
-:10ADF000FF91EA8B450725ECA2548ACFBCA362ECF5
-:10AE0000817DC59AB75CAE68E2F70678D8B2F4F4F3
-:10AE100090E0D5D343D2183D3D24FBF4F4903A455D
-:10AE20004F0F69FE71E7846F7A959E3E8CF09D020C
-:10AE3000FF207C27E0CD9018578275629CF72F0584
-:10AE4000DF2F72C5BE8780EFB7ECF20A87973ED737
-:10AE5000D8CBA2F649E93BCDB4496B8C7B4A384A42
-:10AE60003B41C62F2731EEA7DBF1BC6521DA01DCBF
-:10AE70007F43FD8F7C7ED8CAFD36A420949337B1E2
-:10AE800020C9A39B0CFAFF66C74356D4FF83D60B99
-:10AE90001617DE1B685C2FDA514C134F32EA7FA580
-:10AEA0005B892417E372BBA55C0E9E2563C7AF0CBC
-:10AEB000455EFCDEE1B7E579681C662FD3C57B6390
-:10AEC000DA73721E122E727C1B6B56B3909EC718DB
-:10AED000ED2FBDBF2CFD6BEA54138F96FEB1F44FDE
-:10AEE0008C7056871790DD35D129FDE29EEBF1BDC0
-:10AEF000F4878D7EE8F9F6A5E68594DE9F1744ED8C
-:10AF0000C92BC4739E8817C1B27EFB6FD0F872C57F
-:10AF10003B0CC79BBBFB220FD2CB46A59919E6770A
-:10AF2000F055E84735F5A7F3F84B50B75FF5B6D2C3
-:10AF30004BF35EC0FCF7E0B351C4D31ABBDEA67D71
-:10AF4000D4C62E1E2F60BBF47831DAFBAB5887B520
-:10AF500040196CEF37B01EEACF68DF0FA293F3E819
-:10AF6000F18E3C79DF16CF1760422ED50978C5F3F4
-:10AF70000BCC08E0A9D1FB3B811FE6E54D8AE6D169
-:10AF800066B8C08F51310FC36B8D9527C5F0721510
-:10AF9000B049973B6A484E2C6F1B1497B0123FB5CF
-:10AFA0009F7B7DD20EB81F7C377C96E67979DC20BA
-:10AFB00071CE3B7EFC5CDA93AF3DFFD164E5E70EDA
-:10AFC00059B3FE7CFEDA3C933C3FA50E65FD83E160
-:10AFD000FAFDF2F265FE01C0EF2E2DFCE43E825C2C
-:10AFE000CFEF27F53C89F1433579A61DFD5AAF2BEC
-:10AFF000D882F5871DEC3DACA03C7378293FE4E492
-:10B00000AEA31FA3FF2ED7C758EF16BCDFB66E97AF
-:10B010004AFE60DDAE37C82E8AEFEFB50FDCA32005
-:10B02000F6377E126B5E32AFB9522D4AEDD5D8E9B4
-:10B030004B851F307978E0216C57FA615E0ACED7D4
-:10B0400032A283EEC5EABF83DBC16E95CD44F881A1
-:10B05000DEE37ADF61A67D077752484D413B6E29DA
-:10B06000E3F7D0F99A7D482AEAB0228AD366DCA1B8
-:10B0700006D0FEFE74CDF2343CAF9C91BC22AD10E4
-:10B080009ED36DFC5E9A0CC514E0E74E97A5E13D9A
-:10B090002037D8F8BE7CC15F27450A81DF5EB7F252
-:10B0A000FB46DD4941BABFA03F4DA5F91C5B074BEC
-:10B0B0001B85FB1EDF4CC47B0772CE3826E07CB2BA
-:10B0C000C5BD163FCAE3F7DC1C7FF6BB89E8AFAA13
-:10B0D000671D74BE5DD29FBB30B6BFB242C0A3D164
-:10B0E000C3F3DE4F0AFBF190D86F9579F06BC43E45
-:10B0F000E0A1D103F78379302FA431C19FBA10E3C7
-:10B10000110754CA6BFFC6E94F4D23BB99E7B3AF94
-:10B1100011F6C34991F7B966F68C4CF42FE2E54B72
-:10B120001FC8E376EF0F755FA5CC3F8D0B873433D7
-:10B13000335F42F72E05CE55EFD53FAB31E1795A5B
-:10B140007C8F9737DF97A7E8F2E21B312F1E5EADA9
-:10B1500079A53C939D235FBA11EF23D7E4D7A09F35
-:10B1600086EB6BC4FBC8E99ED213744F07F683F7D6
-:10B17000869DEFDEC815621E8D984F9EAE7DCFF97D
-:10B1800039DABF9BBE3F2DE0F6F43BA6AA6D31E64F
-:10B1900099378CCBA7711E7300F7252F8EF07B3F5C
-:10B1A000E3D593E7B8E3CDAB6B46EF8D386FCCCFEB
-:10B1B0008C355ECA304E2772BE5DAEDE9501BE9FF5
-:10B1C00037BA3A595376F6E7CFD5C8D7D9023F5D9B
-:10B1D00057F5E6D37D00B3B9FF1A0FCF65E66605D4
-:10B1E000E190E00A06D11E91F715E37DC63CCF231E
-:10B1F000744E7C47E1ACEACE1F0C86B395BECBFE05
-:10B20000A4DC39FA884A72E7E807821F99DFA19423
-:10B21000A1BEE27C7594F1B8EED176FEFB1FCB8225
-:10B22000A02B407E2CDD5E3F070F1FAFDC3171236A
-:10B230008A7F7C7F37C89FA5598C4D83E7B20DFA72
-:10B24000FDB16FD903A4E7563C60D467012BCAD97E
-:10B25000950FE9EBD7B107BE46FBA0CE60F76608B5
-:10B26000BD6BB47F670C13F66F192BBB90734E8FB9
-:10B2700030FFEC61A4FFF97EDB24B19F6EACFFBC14
-:10B2800097D3C36D3BFE60C59F048AD7EF319017FB
-:10B2900023A1DF13EB9CF45C32CC5F330CDA350D69
-:10B2A0000B2EC471FA0E70389F6A38B592E2D2B58F
-:10B2B000DC0EB0E1252BF09FB6EBEDE447DF8BF71A
-:10B2C0008C019C6D366E5F48BB4A556F57F1275B0A
-:10B2D000A6FE6E451AAECFFDCCAC2AF43F3CCF247F
-:10B2E000F9111F9BCAFD2528BF37553B689F78ABD6
-:10B2F00089DF4368B7F1FDB9F0D353F7613878645B
-:10B30000C7E619E86738BBF746302ED166E2FBAFD7
-:10B310006DD398B8C79A8FD7D45DDD89F3CAAF01D2
-:10B32000790FFD6D2AF0973835FD33612F350A5CB2
-:10B33000F4BD76D14FF1DEAB9FBF43E62AAC730478
-:10B34000C5BFC6314E3732BF847E1B43132F3A012F
-:10B35000FA8769CE3F8FEB50229614BA5F8FE2D8FE
-:10B360000DEB2319D7A3FEFC25DFAF95F373BF9E2A
-:10B370003D03E3FD529F5E8FF96D18071676EF22AD
-:10B3800026FFF87E41ADA0EB45C2DEBD3E89C37904
-:10B3900019F3D1F9ABEBEC2C05E3CBD757744CA2E6
-:10B3A000FBAFEB2D6968AFC8B8773CBCC78BCF3417
-:10B3B0003E99CCEFCB51FA476327C73006521ACDDE
-:10B3C000B737F6B36398E0E7D1C24E1BC9FCB8CFDC
-:10B3D000D2B8E722CAC7B725F27D35906F76C4EBA5
-:10B3E0007ED4E7B0EE5B5E4D88F07DE3B0B81787A2
-:10B3F00085683F664F26ED2BB80BFDB4EF7ED2D2A9
-:10B400009B4FF200E49702BA73CFB04FAE31E3FD29
-:10B410002039604741F9F82F0E5F83BFCFD238A2A1
-:10B420007725DE179EFEF8595E1ED77B18CBC31E0C
-:10B430004FBC96CA137A57AA509EF278D6B5D41E3E
-:10B440001D2820ACCAC7875F8BE7FC8E89F825F3DF
-:10B45000F5D23D418DBB2F3269E38325F95C4E1F48
-:10B460004BE0F58E15B0257311DE637A476B7F379D
-:10B47000C1932FED526E97C975CA762C2B76FFEFCC
-:10B480000B3D708BB8DF677A126B4BE0FB1521B474
-:10B49000AFDEECBE88E0F2C2309780572FDDDB28AC
-:10B4A000FB319EEF97E3AE42BD8D72DDA23F4FF4BC
-:10B4B0001BA12F609C0D344E91BF04EFE5699C9B4E
-:10B4C000578278037C9905BECCDC0FDC4A78C67EB7
-:10B4D000D38A498F4CC43CB137CF40FD82E8BC8D44
-:10B4E000F471588C734B2BDF67EA4F2B243A9A9EEA
-:10B4F000C4ED3F560AF003393645C0AD245F9CE3E6
-:10B5000019C043A642FDB70AF8E5F1FA17BADED32F
-:10B510003FD07A3578F263DEF19BBBC6129EA60C53
-:10B52000D0C1665D3FC75A0CEDA6F0BC94465721CA
-:10B53000B5BB57DCB32FEF2DC67605D06E7A45FF2D
-:10B5400044E407796F1B0B4D2367BD41488B817B1A
-:10B55000D83A787E0A1BE9E7F711CD9D532AD6E742
-:10B5600014EB736AEFA51BE0C38FFAF36B34F75249
-:10B57000CBF703701FE8AF6882E84FC7CFB1FA433B
-:10B58000BE88878F71F97F617CC8791AE0390067BE
-:10B59000C3FC243C918FA95D919E9FE43C87E59B71
-:10B5A00084BF6DE0E782EF399EC8EF5FFD37221F51
-:10B5B000D2ABA7E7D55D0526DC3F95EDDA3A5A0216
-:10B5C00028E765BCDBD6551D42FDD7D45D4E799B7F
-:10B5D000AB7FF5ECCB2168BFEAF987533099F6A829
-:10B5E000B93D03EDDC861DF7A4F871BFC41C4A41C8
-:10B5F000F97934AC56C53A0F181278907654A3D026
-:10B6000037C79EBEFF1A84C77FECB038518F363DD6
-:10B61000658BD8280E720BD95150FE9C97EFFD1AFE
-:10B62000FDD2A65D7A3B69D53F3C9CE1257A0AE5CF
-:10B630009AF08C0B8BE43278366EB7F8226E1E4F80
-:10B6400084615813EBDF88F333B6C7799C06BC37A7
-:10B6500075A84BF13CAFF13B4812B2C39ABAEE2742
-:10B66000BBAB491B67003CD4C5B1BB6ECDD7E75B14
-:10B670004BB8B0B087EC9AD65FFEACF87307DEA784
-:10B68000F94F294A91565FAE27389DEA58FEF7BB1D
-:10B69000BDF1F5EA49B40B6CDA761CAFDE5D0AED5C
-:10B6A00049B06EFE6CB04452D0CF6FD86AF181E6DB
-:10B6B000650DCF3EF124EE87B04F6C74FF41FDB3B2
-:10B6C000FB3FBE14CAF59D16F71C3E7D879211C53F
-:10B6D0004F9397DB27121FAB5EDC4FF70CE27BB476
-:10B6E0006B255EEA3BF75AD9F8C1F0ABE8D82B7E60
-:10B6F00077C1809F8ECFAFA4FB3C7FF99D15E9FAFF
-:10B70000E81E8565160C6E5FB7757F0AD21FC209E9
-:10B71000FD4B89A701BC0DC257E49ADDA5548FE209
-:10B720001AF1F036379FF178D0AF9E7D0E7F07B0CB
-:10B73000EE37361FAEBFEEB9DB53701D5F999B39F4
-:10B740007DFFE29E0C3F8C5B67096538E9C9DFD756
-:10B750003D7E07D1DDCD07EEC8E0BFA7E1CF364D76
-:10B76000A17566E3FA6E7A6C3EAD6F250B12DDD5DE
-:10B77000FD82C727BE15BFC760C4E769C11F5F6DE3
-:10B78000B3E18F64B0AF30111DF3083F50459EEF19
-:10B79000AD4C7B8F0558DC54FE56C407DE1FD0032A
-:10B7A000CCCE3471D9A6EDF7F6207E8E0DF367E28C
-:10B7B000BE1AC02124E0A5E0FDBAEA81CA4C8E1F62
-:10B7C000E635CBB832D8DF15F81EEBF758FC09C5C3
-:10B7D000BA7662BF9E8F2FE31330EF44DCF7FB2A6B
-:10B7E00023F6B9ADD1C31521DF580FD3D2573C7E14
-:10B7F000DF7E1FD1D5371F71BE690C5757D1F71E99
-:10B800004B048F163786F7D628240F6CBAFB9F0699
-:10B81000E862BB45F0B3FE3BCCD3AC68E1BB87E745
-:10B82000D5AE7CC8A6BB0F214A37D6E8FB82287F5D
-:10B830004A3FEA66C1FFC6F51AE5C11F0CF2803D1A
-:10B84000E619D2BD320D96F0938F22FF02BFA29F60
-:10B85000D9F0AC85FCFCE33BDFF8F83AA0F3E31D3C
-:10B86000926FF572D5C8B7752F4C62B1F8F6B8C3B0
-:10B87000C762F22DBC8FC9B78EE83E8D97FD7072FE
-:10B88000F5E63872356FB8F11C4B512AE6BA1F7BCA
-:10B89000BA7E38C5050C7095FEAC515EBE9CEF8D2E
-:10B8A000292F195E41A581A3849FA4C755CFACA6BB
-:10B8B0007106E856D2A5A4DB01BA1C945FA983A344
-:10B8C000F1FB17288F2645F16E590F7E0ADAB1AFCA
-:10B8D000A9F43B287D30978D00F7BE9D05B40F7A03
-:10B8E0008FB0F3FB9CFD2918D7BB47F815FD184F07
-:10B8F0004C8DBEEF4F10790381FE94348D5DF47949
-:10B90000B79A82765C6F38F6EFC9CA7B2A7BE3FC74
-:10B91000DEAC3CBF54A93AF2D7629CB69DEF4FAE65
-:10B9200068599882F18CBEEE42FA3DA19BDE057FFC
-:10B9300017E6DB27E39A21BF39BB2C7ABFE9111642
-:10B94000A2FDCAE5DDF5B45F688C83AC74D4A4E2D3
-:10B950007EA0310E7233E641611EF263FAF7AB301E
-:10B960003E827832D05310E9297B303DAD1C2EF653
-:10B970005F4B58896EFF55C8B54AB5E8A7689FF474
-:10B9800081DF8EF120A616FD1AF5E9B7E8C723037B
-:10B99000843C44A7F5C12332CF8AE85AD29DD17F97
-:10B9A000373E4FBCF469199E076A78F9DF8A7F0E2B
-:10B9B000CF132F7F32FA552CFFEA5FF3FF8D0DAEC8
-:10B9C0005FB1E78FE4AFF4EDB1D17CFAF6BC9D7FB7
-:10B9D000179677DB7C38DFBEF536FE7BD07B92E9AD
-:10B9E000DEE9BE613CCED6FADA77C5BDA4A7361033
-:10B9F000DEFE6E38BF2FF654F77F7D86F7AB9EEAEA
-:10BA0000B67931EED0B42789FCF0A6DD09744F7CFD
-:10BA1000DF6BDF9569E345FFDDF5348AF3167DC9F9
-:10BA2000AC16F35BFAD2B8BFD6F4EAD4275A0AD0E0
-:10BA30002EDD4BF71657BCFEA762943F7D2F70BBDF
-:10BA400002FCF3C77113F117C3BB7F6A998AE78DB4
-:10BA500018F9D553BD7FBA36E48805170E873E80A6
-:10BA600003AE0BE042F775C78347D7707E0FFFFF29
-:10BA70003E787C4DFE4243F764E2A3285C14FEFB53
-:10BA800023DDC961BB42EBE7EFF77C578C76D2F13F
-:10BA90008E16D2FBE75BF787FF6BE9E0FBAE5B89B5
-:10BAA0000C65DDA7FED7AE9BD3FFDAE15C3F19F949
-:10BAB00060309DFFEAAFA9FC5CB28FE66BE0FFFF50
-:10BAC00007ABA359F3008000000000001F8B0800A3
-:10BAD00000000000000BCD3C0B7814D5B9FFECCC76
-:10BAE0003E926CC22604084260F2244A1E0B791072
-:10BAF0001EA99B842008E206A4A2222EF8E015923B
-:10BB000008B6C66ACD622202F5B6516CAF6DD16F30
-:10BB10004141DADA6B8A41B1025D10115AAAAB8257
-:10BB2000A246BA52AB50031B41052ABDDEFFFFCF30
-:10BB30004CB233243CFCAEDFD7E423C733E7CC3927
-:10BB4000FFFB75CE18498599ADB9004DDB4EE587F1
-:10BB5000B1056806280648526D00FD004E6CFDFADE
-:10BB600090944CAD5D853480BAED710045D8FE31BE
-:10BB70002600124064DBA9129F13E01BFAB912A041
-:10BB8000A3119718D6DD37B71D9B3F2CB917A7D443
-:10BB9000BCF041FEAFB1ED78E1BDEC97A9FFE2BB8F
-:10BBA000433EC0B6D606BE565C2F120F3337213C3B
-:10BBB0009144F000EE5FF7F2E8A796E1FE8BDB3EE2
-:10BBC0009F4DFBD76C1D0532F62BFFF4EFFC30CDFB
-:10BBD000DF2479C4F3F88003E1AADC7E463CDF7EF3
-:10BBE0002A1FB0FD6C93149413B0FF807D7E80D625
-:10BBF000ED05EF118477F17F22DE3B6CB7E278C36D
-:10BC00005095E1EBC67B870DF208DFBDB3697E641A
-:10BC10007BBCCB9E46F0FD7B0844E17F21BCBDFF91
-:10BC2000B1FC3E3FDE007E86DB2A7B1DE908DFC3D8
-:10BC3000100CA9D83E0830B1D5792E3C3FA6C16280
-:10BC40007A0F42D01F4006F123272F9C0209D4AE61
-:10BC5000FA5CCEA7F7A74D4C4338FCAAC5BD5EA53C
-:10BC60001916A6C38AC1EEC02A840B14EFFCB5D8FE
-:10BC7000B70EAD71AFE215EE042801F881435BAF5A
-:10BC8000FF948912AED7B40CE1C2759AFA595C4D93
-:10BC9000B88EA25A82F67C6E3FA2F6A1FE57EFA1A3
-:10BCA0007D15A70D82DABBDFE03F27603F47EBE35E
-:10BCB0007EB199517DFC17033B5D0AEE1FE35620D0
-:10BCC0008028D921EA7D9C7F93EA62BAC442C0EF02
-:10BCD000725E3A9D7E4F83FD7AA793993E3ADDCE00
-:10BCE000A1138083DE57E8BF08FFE45521D2430546
-:10BCF000147F58E0237D23113DDD290E5CCFDAE768
-:10BD00000EF72A899FAB4A89F69E85FE2C31D01703
-:10BD1000E9E789C9EFA673D47A8CBF99CE974A5FB9
-:10BD20009D2F31308DF91C33D8E90E20FC0FAA82EB
-:10BD3000EE0F22DD25A99BBE3ADDCC7CF093EC14FE
-:10BD400077D3BFBB1DE7FA64383312BE41E2FA2B4A
-:10BD500020A71ED7A992C785FDB8FE89D238B79D06
-:10BD6000F44582A03412DBF2FE15807874A4DA1454
-:10BD70006ACB3A11A72878AF3CED00250ABF72487C
-:10BD800034F43B52B3F9FD4AC740C37B1D034B1D3E
-:10BD9000F4BCCA956698FF464C423E14D07B1326ED
-:10BDA000D2F85529971BDE9B7AB863CD1C6CAF95F2
-:10BDB000C245241C1D7B675510BD26A9230CF3B674
-:10BDC000A059217DEEAC9203EB901ED552B07F3E80
-:10BDD000D26D72CE68237C128C273C6B2C285A388B
-:10BDE000EF1A77B961FCDAD2498675AB3DD5867E0C
-:10BDF0004DC357A0F40518DB70169442B4E3C15646
-:10BE0000C3FB857BB618E627EC03391EDB11FBD597
-:10BE1000266A0BDB434924BEB6BE0EBFA50F8A704F
-:10BE2000D85B89E840C991FA57A86D70203DF0F9B8
-:10BE3000A918D122BF58CEFD8762024D08EF294BC9
-:10BE4000C04774B85B0EE4501B3BE88E7C48073853
-:10BE50009AF2B0DC87E0075FA78A7230FA8B401352
-:10BE6000F5AF3CDB2AFBC80E6F94FDB602E2FB94F3
-:10BE7000B8BF92DD6D9580F85EE3B47802E4B792C6
-:10BE80005AF39746C9D7673F845BBCB9E7EAEB8BA7
-:10BE900059E596345CBF39C5D3B283EC66C587B328
-:10BEA000E5F473E7814BE90CEB7449A7F7BC4583D4
-:10BEB000511EE5F8F10EB2EBB19532E30557590387
-:10BEC000EB719DE516778CA6FCEC5F5D13AC6B49BE
-:10BED000AFD7A409FB10FB175025843FB6AF4FCE58
-:10BEE000A3F77E26C17AE8DEEFD652603CB2D22CB0
-:10BEF000420F1457BF9BF3E8FD787EBFA454D011C6
-:10BF0000A6580259B864C241F76E2BF657E7EC7792
-:10BF10009119689B72D82F235DDA0E86CA24D4A5A6
-:10BF2000010F979FCC14F3210BFB6D39E3E3F2D89B
-:10BF30008FE558C8CE2C41B347766647D93339E4EC
-:10BF400027965C7EC500E8C1BEE96DC26909D4C20E
-:10BF5000EEFE9A3495E14A50C2407A9D705AE171E2
-:10BF600068C8B690FDD1D74F98A5BEBB94E0D86302
-:10BF7000852CDA5EF12C223C565DD1AEAE623C04DB
-:10BF8000DE00E1142FA2FA4FF4932A315609A7DC00
-:10BF90001C7F2E1CFFDC589CA8221E7DCBDD896EE9
-:10BFA0006A7F8F441FC374F7131D7E4A7F2EA3DE62
-:10BFB000DAD0781CDF4836518C0701E57A954D1BA5
-:10BFC000279382FDBE9236EE5FEB1D4F7C958DF37D
-:10BFD0000BD2BBE67B1C29DDEB7BD7AE0D35F748DA
-:10BFE0004F3BFBE55513AC01BB7431748DBB005D59
-:10BFF00013045DCFA2F5C77DEE72887D3E96D421F5
-:10C00000246FAB2D68053200F6BB7CD7935CC7CAA2
-:10C01000C13C7A3E37C133A00CE5AFCDE619720FB3
-:10C02000D9956D31EE75F85EF59D9F3DDE407A3D08
-:10C03000F59F39CD24378A276E24EE53E7FA8AED2F
-:10C0400041959CDB87E29D2E3A923CE39E3FB5747E
-:10C05000F7C93E2474D3D59389E3ABA2E8EC709082
-:10C06000FD12FD47D3DABC4CA7DB1C4CA7A59A4EAA
-:10C070003527428B05F5E1A46BC3F7491E4E6EB41C
-:10C0800002C54D6D3448FE32C7C17A05C9E1946AD4
-:10C09000D483BC372D5E8ACBDA513E3C241FF5D9C0
-:10C0A00086F54E8E7B37290FDF3B99AC24117D1628
-:10C0B000866D4CB79B1508DAD15EB625DF5659CE92
-:10C0C000FAA1F278ABB6CE6B599EFBD2D8EF8C7743
-:10C0D0007D8278499E31F237C37BE71779D04F7460
-:10C0E000FB8874AE2334937A9783E6724780E2CC60
-:10C0F000BAD265B9E41F9624660F00C4A36EBCC40F
-:10C10000FEB6AEE10BA6BBBEBE725A06B56F777F18
-:10C110007C86CAF640513C2C0FCA691B8FD7349CD1
-:10C12000643B8EE0A491DE742C13F6AEC50AB754BE
-:10C13000635BF3BFF22DD538BF06430CF617B0D3BF
-:10C14000B624CA1E42EBE75D76BF0079B77ACA5BB8
-:10C15000B16467AB25D70C401C8EA6BBAA95D1D87D
-:10C160008F71CD90B0DFB6EE8C97FBA9AE1916ECAF
-:10C17000EF4ABB498C0F74FDDCE206F87CDD5DA262
-:10C180009FE63A40FD0FD31EA95606623F5EC8C126
-:10C190006FD26AABFDB9245F4EA6CB891571AC1F77
-:10C1A000BDD1795EC3CB06BA9C332E4BB778C96E2E
-:10C1B000CC1476F1D8CA416B391ECA0C65D39E5B8C
-:10C1C000D344FCDA1F79538AFF5E45BD77201D9268
-:10C1D00033C063C1F9C92FA23FA2F91F878610FDA2
-:10C1E000E6BD181394901F8B9F78C546FE68AEACD1
-:10C1F00066935EBD3FCCB793E4E3787C88FBF31A8B
-:10C20000B6335C29592E61A75D9DB95E94CFF9D0F4
-:10C2100062A3F1F9A01C26BF614161A6B866A173B3
-:10C22000978DE2B2854F5B0F87A3FCEA22081F229D
-:10C230003DAD79D67A381CE57F81DE8F92AFC3168B
-:10C240000187A2D163AE1C9A6D13701D20B816270A
-:10C25000617C2F93BB08F5F7715C5493C379494A0D
-:10C260002C90DC2DBFECFD7C5F0F7EB0B511FD3E48
-:10C27000AADCA6C62DDCAEC135C9EE0C50C23637DD
-:10C28000AE53ABD9E592D0611B44BD7F42A36B9FF7
-:10C290002D128FEBF6A27B3C5ED025D733C2827085
-:10C2A0002C9EB66F1CF145E7E79571D01A93C47CBC
-:10C2B000716B7C71135F74FA233D0B157C6FD7593A
-:10C2C0007C2FAD27B9D0E92FE06D8B15F6A27373E3
-:10C2D0000CC74D66F8E3D205BC3A1E43D3CF0FFF1F
-:10C2E000D0F4EF06FEA1E9428FCD78E87AAC3FD7D3
-:10C2F000F5D88CB70EF7A5CB59C8763172A6DB9965
-:10C300005AF0E5D0FABA5DD1E9ACC3A9D3AB8DF24E
-:10C31000A11EE0541A5E32E0A3842A28898071E9C4
-:10C32000E9C28EB54E02E283D2B095E75D2A3EBAED
-:10C33000BDED0D2FDDCE9AF1D3EDAD8EA76E7775E5
-:10C340007CCBD090B03DC4349EF2AC2B4FFB0C7133
-:10C3500070392C30C4C9958E3B0DFD2AD73D86F926
-:10C3600057A52C338C4F52571AC627E73C62E85F1B
-:10C37000E3FEA5298E5F6B8AE37F63181F170E719A
-:10C38000DCFD7AE344509047DF3BD2C9F177B0D16E
-:10C39000C5FD9D8D29DCEE6A5459BF7737E670BB29
-:10C3A000A7D1CDCFFFDC58CAEDBE460FB7A1462FAF
-:10C3B000B766BB30F5F9EB15CA574A432D9564CAE9
-:10C3C0007764F87E928EF47BC312688A473A8D6A4E
-:10C3D00017F139CC37FBE35387EE25BFEEB2B9C96D
-:10C3E0001F36EF182DA93DC47309E8EF3C51F292B6
-:10C3F00030250C1E8A7BD03DF7245F2DE916964729
-:10C4000032FB807A37D301D664D4B79933257713BA
-:10C41000F0733F24711BF4E1F85405FCE4FFAB9D7D
-:10C420004AD09EC0A0791D08E70C0126D8699CFC63
-:10C4300077725F85E2D6EBE821C22B7B64F81E3E63
-:10C440009F51FA97339437DFE86CB5929CDCB0E7E4
-:10C450008163F7E23834FB8B493FBAE206FFFB9673
-:10C460004B891B5A28AE443A462477C843F14EA262
-:10C47000E28ECE07F4F6B674910F4C6DF2CB0948FC
-:10C48000CFCE3781E3385D1F11BF1504BFAE17D57E
-:10C490002E25382C81FCFD239534BF66BFCA74D18C
-:10C4A000F542D7033D0FD4F5A04A7EB689E69F3802
-:10C4B000089C4F8FEAF01D799EF034C59DA59D2DF7
-:10C4C0009594975D286F1C73BAF5159AB7BDD1C7BF
-:10C4D00072B4B57126B7C1C6F99A7CD6737F57631B
-:10C4E00003F77737FAB9DDD3B84293CF161EDFD7FB
-:10C4F000F838F75F6F0C6872BA919F8FCF10FEF714
-:10C500008B50E50092BF17D3451D071CE59C478063
-:10C5100022DA8B95939A9497453C65920FB35CE829
-:10C52000F200683724A4D78DE867C93FDC04FEBC5D
-:10C5300039D8CE9CD7621D2B7D7BB958E86CE6F8C4
-:10C54000C36C0F174090EDDDB9F65DC4FF17B2EF75
-:10C5500032E6ABE4AF74FBB718C2BC9E5DBED34DF0
-:10C56000F594EFCEAFB834BF0273687E57DE1DDBA3
-:10C570003E5BB65C38EF2E1A2CF8AAE7DD183F02B6
-:10C58000F9E54840E6B87A7E5A4B02E7DDA59D09F9
-:10C5900014072CD826333F30CF540622DFE6697CBF
-:10C5A000EB80E03BC49779E3E6715D6EFE1A233EB3
-:10C5B0000B9DD7F509AA3DC6693DE2590B0F7F4E89
-:10C5C000F5B95A8D5EFC1CE16968BF61D2AEA879ED
-:10C5D0003119F1C99FC49142C128A207C2EF0E923E
-:10C5E0009EED9759CF7A938BE3989F909C9F6A9C7E
-:10C5F000396917CAFDF1B38D9C7F25653CF2887FB0
-:10C60000DC77C7AFB559DEA1199C0F856DA43F3A01
-:10C61000FF96938D44B8975738029468478A5D0A0D
-:10C62000ED1F913C723CF1E323702F43FA956F7D2F
-:10C63000ED20E947B9C3C9E708884447343F47EFCD
-:10C64000F7353971DEA87D1E99C2F7E25DE1269AC1
-:10C65000A6FB1BDDFF8CEDE8947D5C17C8643D02F2
-:10C66000CC25BEC9B8783D32E79B4D946FA2413AC4
-:10C67000E99CC0F09E0C829B9E77D7B544BD69ECC7
-:10C68000598F9C80F02DD7F2C3D11F7B198E6A87FA
-:10C69000CA7268D7F2497B8A053C517474D97C1BF5
-:10C6A000A9FE097F8CE13AAF19BEC919C28EAB4908
-:10C6B000DEC94C5FA79A4D794395DCB1E1D7240FD1
-:10C6C0006D716E3BBE67B6B7BA7DEB2D6EAF739DD5
-:10C6D000EC318ED4DB3A8B38371859A91652FE4705
-:10C6E000F125E5857A9E689EEFCBAA989DD18FEBC8
-:10C6F000AB210FC1E5B29C574EEB1A3E3F6F9EA691
-:10C70000EF5FB7ADD83537AA0EB226433F5F505C16
-:10C710009F38BAF976B1FC2DEB9C69F03FFFE9F147
-:10C72000DA540C7324D4A13C2920E20810F1C42C63
-:10C7300008713B1B3AB9F5A124513B17DCDCDE063E
-:10C740005E6EBFCEF4AD26B989583BFB931E1F7BAE
-:10C75000E1EB5C928B63DF1BEB4A53BBFDABEE6FEF
-:10C760002FD5AFC6D2F9520FF2B041935BDD6EF711
-:10C77000CA1F93DD8E8C40FB807046368B73B148A8
-:10C780007C6C80CE0174FB007E63BCA8DB8BC2593D
-:10C79000EE37B85EB84FE6BAA5D97E5429228F0786
-:10C7A000C59D43F5517DFF260BCC2739DB88ED1F56
-:10C7B000108F3EB3C28A1A85CF760D8FF21BC60347
-:10C7C000E52F535D223FAC724032E57370F664EEA4
-:10C7D0000C340453291E45791E95E4F913D1DBFF6F
-:10C7E000D0B8443E7F20FB3314F9F79138B7810568
-:10C7F00052200BE9B1A54DF4F36E4F64FC6E82201C
-:10C80000F3F166085B09FF5B00D8EECE0195DB5BB8
-:10C81000C1C3FCC495E3F2D10EDDDEA68C5C857845
-:10C82000162475A6937EE68D7E2F4942B8F229FE26
-:10C8300075726D6605C5293A1E964C81C765999E2D
-:10C84000B709BE82A4D0AAD514176EB600C5859FBD
-:10C850008EBEE70E88F2AB2559150769DE73923854
-:10C860002FF46FB38BBA1A74F6F746C5E35F6756B9
-:10C870001E22BDFF07C1C6F9EF2A3E47AA7609DA94
-:10C88000C3F87E4C037C6F8837AF27FDF4B37D2C53
-:10C89000205A8A3AA11F4A795FEE7FF5D417D5CD89
-:10C8A000021F3FC5632559BE08ED5760435348F04A
-:10C8B0003F610FACE3B8A97E08D52FE63D69B7907C
-:10C8C0001F7F0FED309D9B7ED0E8E0F643CC6FA834
-:10C8D000FD1BE637D47E84F90DB57FC7FC86DADB15
-:10C8E0004F8F402102F861A6E77F33CE8347EF7672
-:10C8F00046E0119160664FE77DA73244FE91DFF676
-:10C90000F1037124075B6437C969DE6685EB10C7E4
-:10C91000B78E0AC869D174F5C565221CF95BDE7E45
-:10C92000746C11BDA7B8249C7F7CCBC9FE9C379941
-:10C93000E0EBA2C7369BA08706EF7389A155F4FEF2
-:10C94000739BD30942B42320E490F8D9431D0D60B2
-:10C9500019F3F1F50C113F5D6BEF2C8A3EDF040AF1
-:10C9600019A85EA9F9992AF96C423857ABDB8E26D3
-:10C97000B9CE7C83F6F3EF117A887C35D4252A353D
-:10C9800039D4DBBC6D362FE9D373DBDE993619E978
-:10C990003075CCA46259ED9E5F98D98FF7CD1B7D81
-:10C9A000E657AB93793E9F5BDC006BAB5C38EF26C0
-:10C9B000C78E57890437BB3EAA4AC4FE2D29D26EC2
-:10C9C0006AE7A8691392C80E4080F7B935A77C378B
-:10C9D00089D81477B58DFC7239295594DDAD74C4AE
-:10C9E000D1496A57BFCAD5D7D0BF2A659061FE2406
-:10C9F00035C3303E3967B8615CDF778ABBD0308F92
-:10CA0000F495E266C483F90EEB653E97C9DBFCC57D
-:10CA1000FB8B18FF1B8A08FF08D2CF8681C591D2F5
-:10CA200095BF584D6663F3CE043EA735C5A735DBE9
-:10CA30009EDAED517B8F4FBF84AD3DC675B5BDC449
-:10CA400075171B9FA2FD7894EC47C10BD7F1B9FB7A
-:10CA500073A3CF5CA6225EBE4C8C5BC9EE99E2D676
-:10CA60008816B79AE5A74B4E2555C8CD5E19280EF6
-:10CA7000D2E357B3FC003CA0F97FD15EAA9E4F7D64
-:10CA80004BF8AB7F90BEF78D966BAD35D5230A6C16
-:10CA9000E857A84EF85719D6D183B308874EFF8CB4
-:10CAA0006EB987DBD6BE3AB0889FFBE371CB5AAD37
-:10CAB0003EF1AB4CED9CBF66C7AB0393BBC7E1AE89
-:10CAC0008F0CF3E13E69B7A1DF9C66EC3F5CBE3B97
-:10CAD000FAFDDEECD0BC3577DA7C54977E4CD42955
-:10CAE000CDE33A3C553B633C642F95AD76CE876AE7
-:10CAF0005D1EAE9F28BDD44F74BB70830CF53DD92D
-:10CB0000B7F5DABA5376C680FC2DD67D0F6585E081
-:10CB1000F1BF28FCCC7B7D3CE08DDAA73553C47D8A
-:10CB2000C7125B7EFC15CE3BF612B889F4C712859E
-:10CB3000BDCD6FFBD462213F112BE425DF15B62458
-:10CB4000D17D97F9717E3A4FAE5B10EFA773A38248
-:10CB5000F4CE771CC8FA2D4FFB1E75A0DCBD6FB15B
-:10CB600018FC4E846C1DF67764FAA691DF99BC33ED
-:10CB70002668F916F8ECC804E1D72A84BECF26B996
-:10CB8000D1CFC5D0D4D43D08867332C29FFA679EF8
-:10CB9000BEF5ADC728EEDD2BF41F879DE67CF4A61D
-:10CBA000A87C14D608FD75E02FC5390B77B5D828B9
-:10CBB0004FFAAEF4BE3DD3D9ADDFC3CED5675DDF4E
-:10CBC000EB0E087D3FB1F5CBB7C8AE9F407F17ADE8
-:10CBD000EF5D7E51D3F3BAC765D647FDF9F1ADF2EB
-:10CBE000C4400FF47D4D930370651BCECD96949D8C
-:10CBF0009A467E6DC93685CF037BF3D7752B8CE7BC
-:10CC000064CF6DB7CF17E7C8028F88EE4FB77D9915
-:10CC1000549E2BDA657C5EDBA2D91D11C7A01FB51F
-:10CC200026931FAD96B8FE7660DB00BE9F714082F2
-:10CC3000A03A9297B8CE817C9B2E96A3E74E8AC7E6
-:10CC4000202547A17DA669FC9CAED585666C9B918D
-:10CC500045FC7AA76DEE010FA19795C1F2733DF8DF
-:10CC6000391E3C90E84DA57B0A539B847C1F48EC01
-:10CC7000ECA03AD281B23889CEA370FDE6E878EF15
-:10CC800080D59B5ACF78E9E79357C8DFC45D421E31
-:10CC9000ACD943E4A75F12F91CCBBF32F06196AB6D
-:10CCA0000510D8EDC17D6BDD418E4B1781C8EBCDF2
-:10CCB000F17CEDB8CF6CE417CCF967F9961D07E964
-:10CCC000DCE39C3A84495E2F547730E7BDBDD50F35
-:10CCD0004625790BB3A2EA7EE6F8BC2B0ED5E3A875
-:10CCE000F5717C2EF44AD97F1F5F84FDBBD6C7B98E
-:10CCF00028CF3EFAA4DD4F76F9E83A7B40C2F1A393
-:10CD0000499DED94771CDD94E7C615609E45FDDDD9
-:10CD1000B3E4D77F6B65B90030DE6B58527637DFEE
-:10CD2000FF5BB23E5EA27B389022C6F59C4F7E260A
-:10CD30009EE38205CF0FE4734EDDBF907ED0B9F441
-:10CD40009127623C14E41FDD33BD0FD5FB3A2C7FE5
-:10CD5000E0F37C90EF3B44E7F58B36C48FA4F801F9
-:10CD60007281F9367FDDE57CBEF973C53783F0AF9C
-:10CD70007CE69A0174AF6CC1DBFD80F0896C7D9E0E
-:10CD8000CFFFBAE3F49EE3BB135B33FA406E379DEB
-:10CD9000F43AE08AA7977989EFC5922ACE69A0DE96
-:10CDA0003388E4624B35D0BA2365716FB473651C68
-:10CDB000C7A566B9ABC91271608D5E6FE80B8E14A2
-:10CDC000D21F1F301D222B87AFA3F3B0E6AC24CDBA
-:10CDD0004F77664F8BBA975825B7D7BE4CF2B9C676
-:10CDE000CE75908E989ECFC11AB21279FE3C87F113
-:10CDF000DCBCB6E18CB19F8BF91DBE3FB2492DBCA6
-:10CE000013DBA51AFD57A77AEFCDC2F717B63EF28E
-:10CE1000C23EA6CB9A1FBE4FFBEE718AFACB3E41B3
-:10CE20003F73FC3FCF21EA1C006B797FFDF9A74FD0
-:10CE3000BCCBE7AB9F6E1E9E2DCE8D439FFC3A8DE3
-:10CE4000CF8B0FDD8BEDA63D6F315FCCF09E73EE87
-:10CE500027498C6F0DE1D197CE77BD8F109CC80804
-:10CE6000CEDBE6AECA63FAE9E76F91A33DE7273A66
-:10CE70009CFAFA3A7CFAFAFABC27B3441E335BCB2D
-:10CE80000F8ED942C7F91CFD85E112D5F7BA9E274E
-:10CE900085F213A3E4E5BBAAA7DFA8D5430E5A96F3
-:10CEA000FDC046F7E45A575B7DD176EF12EBE85DA3
-:10CEB00071A00754577FE14AD86F21724A7F3AEF39
-:10CEC000D3FAA40CD81FA78127113C746F506B6153
-:10CED000A12F85EBE4B49E4CD71003DC6F2A77AB0F
-:10CEE000D45E29791571EF2BC0F23F01EA07131EBA
-:10CEF000164798CFC5F47B2E3312975F9386FB3588
-:10CF0000F783E514C7345B855EF8E7C471FEA6D3EA
-:10CF100049F733E0CA35F8976617A80AAE3353814C
-:10CF200015D624316F28D2F9C09EB9AF529CF0AE0D
-:10CF300052DF8FF67DCFF9589E64A1F82E104F393D
-:10CF4000E2FB6FFDB6F8AF38F703F09439517EAECF
-:10CF50007BCDC176DF5C8FB81D7CDC9F0761EB1752
-:10CF6000F8DEDF46FF6BFD4EE8C6EB6F63BEDA4CC2
-:10CF7000F9C14D890F14D3FBFA3D4CF37DBFA32EAD
-:10CF800027DF0B34DFFBBB167C9F91DD3A65F1D5C3
-:10CF90008AFA47FD28F2BF91441B48383FD24FA37D
-:10CFA000C731607A44ACDAFB9FABDC2FAA1CC9F511
-:10CFB0004838A5B23D1E6BF23745C32D220FFB4604
-:10CFC000CC2FEB540CFEA6A840ABDB7CAD725C7A98
-:10CFD000E569E5BCFEE8A16C61CF8AFA5AEA7B8A72
-:10CFE0000FD56CA13F4D1094053E224E18DB2557FE
-:10CFF0001E99F857ABF56BC99FA13C45121C7EBA30
-:10D00000E83876AB90AFB14A7007B5685DA181E2B0
-:10D010008A2DE8EF7438E88C306538CBC1185D3E56
-:10D0200071AD59386FB954CF798B83E2196C574978
-:10D030002186E37BD0C9AD47F3E315E0E6763C7883
-:10D04000B945F9E47622B4707B35B4723B0542C22F
-:10D05000EF5F116C627F06F7B9F8DC62D23C0BC55A
-:10D060001B45D7F79C2F546874EA9D0EA87025972E
-:10D070004E8709807A97D1033D06E7B0FD30D3C3D0
-:10D08000AC9F651096593FC93064509D40653DADD9
-:10D09000040FF7AB2E920EA5619FC2751A333D2A7D
-:10D0A0007B968BC91A3DFE950D2C1F3A9FEECF56ED
-:10D0B000F9B9CE2FD4AB14927F331FF5E745711524
-:10D0C00027E96AFA1DD9C3A7D3BDAAA2C28AA5645B
-:10D0D00092EFDE30663ADDAB2A1A5BF13C1D79DE59
-:10D0E000933D4EF40B2A0AAD6ECC5AA4B2E9E3711B
-:10D0F000BE4FBB970C33457C7D9716B7F896FDC0A5
-:10D10000ED423DF1A53ADD849F03837BAA7FCA19D6
-:10D11000E27C70C8C4E04E2BCE3BA4F8E664537C9E
-:10D12000E00826A848F7BB9655F1BDB5876C62BEEE
-:10D13000DD2EEAB03A5EF8DC1F83FD4D9B862F950D
-:10D14000D27BDF1FD7ADA5757DCBB2FCA4AFBECD22
-:10D15000925B70B262C04CD4CF8E9015A81EAAEF1D
-:10D16000939DEA5B9ACDE7BAD95C271BA4C5331D12
-:10D170009B860F27BEDC9FADDDC34A4E2B24BA2D04
-:10D180004BF5DE4FF323F142BEEED7F8D05BBB2167
-:10D19000DB735F76F1B9CF23FF4000F0FD9F65FBA5
-:10D1A0001EA0F5EAE2CEB27F3F3EE2EDE5E1B46ECD
-:10D1B00039959049B310EF260F046CEC07B4FBEAE5
-:10D1C000DA7955E4765C07E950E4F53591491B3589
-:10D1D000ABB384EC27AEFB5FBCAE2D3C6404BEF762
-:10D1E000D8F44336216783859C697668DBF6BDF702
-:10D1F0000E125D2F44E955DDF6335F7D80F4AB3BC5
-:10D20000E174D3F46E7DFAE552CE27C169B01BBA42
-:10D210009E8DD962E7B87AECD6CB6FA779656FB7E8
-:10D2200067105E57B687F91C2CB2EDDD41020E3D4A
-:10D23000DF38257D1BBF4BE7B49CC76D16E7B44BA9
-:10D24000A4FA57E2A9FF7BC9ED47F83FD5FC869EBB
-:10D2500017CFD7F05ABC77FD72AA8BCC5F73EB1453
-:10D26000BEC7131079838ABFA4FF5FC23E3E1F5F13
-:10D27000B4D19C4F74DA88FF8B5B4DF781281FA6D1
-:10D280007B0FD1F6BD877C787BB6764E9B0AA98C46
-:10D29000873CAB8FAF077B67CE771F07CFAB2C9F49
-:10D2A000E09569FF62A5E77AC273DDDFD3B03ECCBB
-:10D2B000D3F6263A3939DFB589FBC24F2C75BBA8A6
-:10D2C000AFE9E75A9495528AA33B7FC9F2AFBFA753
-:10D2D000EBEB8215E25E36ACE9CB3257B0C1EE2102
-:10D2E000BE166C18C0F905E6411CF7ADDD605F4164
-:10D2F000FDA60763FD7201D5933B2FA3BA4A538C59
-:10D30000F8CE89DC23DD132D4817758E33BA5DD72F
-:10D31000FCBA7EDFB62BFF89CFE67BCD5DE361C52E
-:10D32000906F3469F17311C1477160BD55E44F319D
-:10D3300002FE1D6F7E3F8EE2D8CD8A378EEAD2275D
-:10D34000F6A7F7811EE8A6B7C5E85EE03CE78CC506
-:10D35000EF4EC9381FBF8A1ED7EEA76BF2F9C7463A
-:10D360000FFCDDDACD0F1DAF2AF9D94A1BD5396E76
-:10D370000317D53D96EC7DAA89BEB759B212B8A263
-:10D380007082FE50BE70C4C2E7E063F616A6903C01
-:10D39000B669F68ECE85D528B92AA1A210CE2F1E49
-:10D3A0000C01FAFE28468D05352A2F8ECB4932F422
-:10D3B000E3DD9719DEEF539A6E1807BF27945BD20F
-:10D3C0001DBF267AAE30CC7F2861027F8F5316BAFC
-:10D3D00083EB4A7D278E348CDB51AEE99E037C21A2
-:10D3E000E29F52FC65BF0AF532C139360CF02B942E
-:10D3F000BB311DC6F8A834DCC27960CC7EC590D79D
-:10D40000DB2F5067BA7C98A6578361B0B00F667A5D
-:10D410001BEF432CD92B731CB7241503CFB4DEE9C3
-:10D42000ADEB9F4EF77E5E23DD07CC34D279A0CFE3
-:10D4300048E741F38D744EAD37D279688391AE6978
-:10D440007E231D33568C31CCCF6AA930F4873D7EC4
-:10D45000B561FEE5816986FEF08D371AE6E7B5CE47
-:10D46000358C176C59785EBE8F082E318C9BF95E17
-:10D47000B8E74726395498CEC5DAF7593AFFFDF890
-:10D480004BFC1F0BDE3E4189CA81FE26D2C7FF2F0F
-:10D49000FE2F18A69D23E8FCBF48BB7A95E687CDF2
-:10D4A000DF794D8D13F6E6F53D27F67BB0FF865A02
-:10D4B000684DA1B8498B0FBCFA798429EFD3F39456
-:10D4C0006B4B25D3397D8CE19CFE42F7DA8A4341D0
-:10D4D000437FC47EF17DD4C883EE57A82DFED823A8
-:10D4E000477F0F35FA0B76CBE7E49DFAFD383D6FA9
-:10D4F00082E627390F9DA5C34F4A50726E7D51CFEA
-:10D500004FCD79AB9EAF9EFBBD95884BEE967BCB06
-:10D510006345FEAAE7ADDF070F7F5776D560DFDAF8
-:10D520006168FF654B675F1AD7F359222C9D1B4733
-:10D5300088B0FCDDCC3BD33DB9FC3D2AD7BD174AB2
-:10D540006F4FA77BFE08BE2B5C22CA3FF4F3D2309C
-:10D55000DFEF68BDC3926B7921BEFBFA98CF86D00E
-:10D560007AFF334CC46F76192984FE67C02C0FD024
-:10D57000F351499EE768BEF97EB6B935DF1B6A6B89
-:10D580000C72ABB8DC7C6FC75C1F0C5B548E3BFD30
-:10D590003F92F89ECE6704DCE8EE78E5C40A2BC71C
-:10D5A0002BA0E5E3376BF4D7EB16B3347C0EE31214
-:10D5B000F3D1FFDEBCE535E6CBA2940EADDE51CF54
-:10D5C000F1F5AD839D23F91E9AA7D02DEA5C7A1D53
-:10D5D00063D0257D5F7221FC17A51C35D491E0D95D
-:10D5E000BE1775BEDD8DB758FFF04A518F3CBC3277
-:10D5F00095EBDFDDEB1FE77AD2CDF56F1AF4E296FB
-:10D6000086F70C7A30C7FF91613C9CDC69A5FA6112
-:10D61000F88581136E42FA1DDB6CE7EFA1510E3ADB
-:10D6200088AFFAFAE195C3C7F3779517C4F3338649
-:10D63000A3BD31C4FCD5F13CD47890FBE1C630B732
-:10D64000663CF53A85DEDA76420EDDCFEF9462DD98
-:10D65000541736D72FEEB6A89F901E3C9493AEC5B4
-:10D660006BF5055EE69FA857B46BDF97B66BDF9747
-:10D67000B66BDF8BB66BDF87B66BDF8146ACCE1542
-:10D6800054D76897C4BD9F5992E7C939B85FDA602B
-:10D690009F3387E2FE859DF90AEE5357109E2D2198
-:10D6A0009FF3FAF9FAD07309D38581FC3D919FEF7E
-:10D6B000871DB1F8F3E9FB9BC91BB3AEA33CF0484F
-:10D6C000ACFF384522953969D751DE77C426F4700E
-:10D6D000FAC6D8EB48EF3EC6C5083FFF4B92A82BD1
-:10D6E00039C336FA7E6A6AB26F504EB1B8F7C5DFF9
-:10D6F000CDE073924BBDCE19B18A3830A2C583E913
-:10D7000039E21C302347C4AD7A5B463CC7E7D3A956
-:10D7100065FD7C389BBF375963078A5F717FFEBE0A
-:10D7200046BF6762FEFE66E49FECFC9D845E0F2DA3
-:10D73000C949E375E8BB1CD2CBE49FC4B1DD82705C
-:10D7400068087DC7D305EF7EF15DE531AA2347D593
-:10D750009F4B72441D066E03C377408BF71E3E44F9
-:10D7600079D6FBC37C6388AE732D6A09F17571C2EB
-:10D770000EAE774DC951795F8497F145FBD34C7C50
-:10D780005AEC08737DEC42F5F0DEF03F767BE8174B
-:10D79000B95CFF55F3F93B3C6D5F84630AD15FC709
-:10D7A0005B87A37B9DF3CBBF5ED7D5FB9F3EF1503C
-:10D7B000B65697BFC5DB833FBD55A34BBBB5E73A14
-:10D7C000FAFD1A7FCFE1CF3000AADBDB63D14760DF
-:10D7D0005BAFD1E9D80D880FD7273C2388BF8BA733
-:10D7E00039F9FB737D7D5CC7F787F3ECB33AD5BBA2
-:10D7F00090F05F582FEAEEFA7844127CF5AF14757A
-:10D80000D0C5DBDF3B44FF1F8405CFE415727EAF3C
-:10D81000BD6FA633D297BF8B9A2B8B732BA4EFDDF2
-:10D82000C46773BDFDDBD235922ACE57236BCF0C74
-:10D83000A17B648BE9DE1A7D1FA6D5AFA0CD5897DA
-:10D84000427AF9A95E71EE7914F0B9965DF3237608
-:10D85000FDFDC18AE1FD634EEF4F893E2F687603DF
-:10D86000E7072CB87F9B9E279BEA286D2151EF6C20
-:10D870004BB1719C4CF10EF9273DDEB9EB4D51EFE8
-:10D88000BC2B4DC4D1041FF1573AB89BE3842EFF43
-:10D890002FB955A29FD3EA0BD0FEE05BCAFE4B1E08
-:10D8A0008AFCA5F38B3F5FADD503843F2CD6FC5F8C
-:10D8B00031AD43014E6E1FF68B45DABE183F72DD67
-:10D8C0006D34F89A04305ADD6CE56E431DE1FF00BB
-:10D8D00090CECABD504500000000000000000000CE
-:10D8E0001F8B080000000000000BFB51CFC0F003AD
-:10D8F0000917B1A1F26FA0F1B33851F9BF5951F92D
-:10D9000097D0F884B02E1303C30A46D2F420E39DC7
-:10D9100040FD0780F838109F6322DF1C103E210C69
-:10D92000F48F1803C34220DD0DA4AF00F11F207E49
-:10D9300004E44B8B30306801F1325106864420BD3F
-:10D940000688CB4520FA4E02E96651F2ECD4E3A1F9
-:10D95000CCCDA39832BC411A955FA3C2C0B05695F6
-:10D9600081E1931A84BF02499E5D9D81A15605C243
-:10D9700036956360E807AA59208DDD5C33A0FC046E
-:10D98000A0BCB83A840F00134DDDCB680300000043
-:10D9900000000000000000001F8B080000000000D5
-:10D9A000000BCD3D097855D599FF5DDEBEE42679A3
-:10D9B000819705B8090183067C09612DE24D8C1819
-:10D9C0006C8A2F88364E197DA0D56859223235B61B
-:10D9D000DABC4012C2A6416D8741A52F5A2D525A7A
-:10D9E000A3624B67D4792C1DD1B1355AAA76A49D78
-:10D9F000C8388E5A65E242AB558739FF7FCE4DEE6F
-:10DA0000BD7909A89DF98ACBE1DC7B96FFFCE7DFB5
-:10DA1000CF7FEE73CB3E80090027F1CFB900574B83
-:10DA2000009037548237D608118026CDAD6F2A0674
-:10DA3000F886123BAC57B1E763E5D8FD3A3E9F5CF0
-:10DA40000B610005DBE703C4F07FACDFFAE0BA311D
-:10DA500089207BA62CCDC2D21CDF2C9B5400AD129A
-:10DA6000DF6F999CE9BD5942CA35D0EF05FA73B210
-:10DA700004A0E5E86FA71E32EBECBF0208455E0F7D
-:10DA8000B0BFCC8259271580F7828BB3D230F278A1
-:10DA90006FB5769FA54E02F853EBCB530F4D1AFE90
-:10DAA000FE1B0A34F7960F7F3E0BD8A433101F4994
-:10DAB000777CEAD0BA07D71964489AC3FA03A43D21
-:10DAC00039ACDCB5ED2CB56C084EE73A00921CBFC2
-:10DAD0009FB39F2752932E60B50A29318FE052D908
-:10DAE0003F3301A829DB97EB763500C1E580B723EA
-:10DAF000F2978177C4FD12EDDE0BAEEB04D66FBD5D
-:10DB00008BD34B7B9E1C5B07C3E9C5DC0F138FA730
-:10DB1000BB1F37818FE631E9A8495E3AEABE9F8A8A
-:10DB20008EAE443A3AEBFF9E8E927FBD74D441E3B1
-:10DB3000FC95D1114037C717F4AB38FFD0735E4660
-:10DB400096F64A4867ACDA87708FE353C1B896CE31
-:10DB5000EBE5694C4C41ECE93398DC1AD7BFAC1EBD
-:10DB6000E11E7B74E19B58762EA9A93B9FAD2FBF88
-:10DB7000B1F7F90B581989A7A404DBAF3B4046A1C4
-:10DB8000C2C65B91AC66EB6BC7C1E6023C905C66BB
-:10DB90002471BD60008C01F83BB126005957593DF6
-:10DBA000447FCDB40E37A4393EA4939EE1FD475A7D
-:10DBB0007F08FB996D8AF1FF6B00D777AA7EB0963C
-:10DBC000CF9764FF20BE0B87E6A771F29B2C7540B0
-:10DBD000FCD8DFF7E15F08BFD7FFBFCC5700953E09
-:10DBE000940FA17A594B617BE8CD56593DB24285DD
-:10DBF0003493110555DD924B3FF5BE7402D4F5F216
-:10DC0000FD911A4243F0FD2748443FE3BFF55ACF48
-:10DC100006467227960663441F1A406ECEF0F57CC6
-:10DC2000B71509D9525F52232568BED8D3A5AC7F5A
-:10DC30007209D77B77D42FCEB6CA2B8F2409BC3973
-:10DC4000E903747526B215A70FB55E367CD3BE38CE
-:10DC50007DA89F933EF2D65AFAC167DFAF88691755
-:10DC60009C267D7CD1F9CC7D1DCE576D625F4B7DAE
-:10DC7000C0F8F6F6BAC519ED8C91F7B592F83D5299
-:10DC80000F462A43BFFCC1FD4C0E2FD9FE2883DB73
-:10DC90007B836DBF94B1331B7B46C18712B1AFD775
-:10DCA0001CD7D7A2E8AFE5B2AAAAC9389E1BC763A2
-:10DCB00074B6317A7B12183F9C40DA66F850BA2B62
-:10DCC000D258875288DD2F209059DD1735529B8816
-:10DCD0000E52B42F267C1E5DB6E15F8DF86D75681F
-:10DCE0004C4A56F87D2D6E82C38DF3317A57343607
-:10DCF0002043851A84B42F8C2D38FC4806272762D0
-:10DD0000FDDB363AE8D22B21D33E98F48A68E5F45D
-:10DD1000FAEDD3932FCEF996D8E13DED7E41557FB4
-:10DD2000DDA28746EEA7C2EBE6FE30245E8503CC7B
-:10DD300018DAA70D2ED8279DCDF475D1A590604F88
-:10DD400037E0AB3944A764CF6C28AAD490AE609773
-:10DD5000A4229CA61E85680EB5AB90741A47F636B1
-:10DD600003B653820695E6FB91E112F49734F697D9
-:10DD7000B271BF22F6F72B42AF4195EBB57E136E21
-:10DD8000D2B3EA509DADE39D9BD8FF189D242BA4F0
-:10DD9000D4FDD2F0F7F5A817995CAAC7E716B9B277
-:10DDA0007D900FA2B45FF5E2DDC1C75E9A3C9DD1C4
-:10DDB000475F4C01145BEB1EF318B56CFCE7CF9189
-:10DDC000521E49C0CBE05C24E07CD6C81D8774DAC3
-:10DDD00057EB213A5E74C19F2248C6C7F7FD5ACD62
-:10DDE000442F8BE6B986E060FFADB6AE8FFDF7C37A
-:10DDF000C17D29A2794CB856562A0447DF3C2985B3
-:10DE0000F31CFADD7FDDFA2506E7B35552CCA313E8
-:10DE1000BC2160F3F519EF4746F53BCCF975D010FE
-:10DE20009FCEF9CDFD081702E115FE9DE195CD9736
-:10DE3000AC19E85F8F783E26C5D6B3F9B2E6B74C89
-:10DE4000C0798A6599E0DD38CF2B2B8C7EE0E531F7
-:10DE500032E23328F83CCBDDED9DC8E0EC9C24C3D6
-:10DE6000BDECD1C6D2D1E559BB439EA95ADC90582E
-:10DE70007F3DA9552AA3F045CA90EB32C9BB672460
-:10DE8000AE273B928BB5525CDE21BB1D887A296E92
-:10DE9000D1ABCC5E7C4662EB7745381D67D7C6B9FF
-:10DEA0009DD83786E45740EC47D6B4C55990C10E8B
-:10DEB0001E711D6CA24C7673B6CCE183A37C7CD51D
-:10DEC0001C3F67F4F13788F13F6C92A00FE153E3F8
-:10DED0005EDC7F302A889EFD823E616D0ED54DB995
-:10DEE000EB298B7715B37DF44465D0755C5F92F6B2
-:10DEF0007933DBE322068ABF96BD674D377FAA9050
-:10DF00005D922D9F4826191C9BF75F0B3AB353FD7A
-:10DF1000D114507DEAD55EC4CF66A614F8FCBD804E
-:10DF2000F30718D9A27C0D30F9AAA37CD57BD33294
-:10DF3000ABAB751033D8AB901693FC8C640E444B8E
-:10DF4000DA54F6BC7D2910FD025A1116FCB6475F63
-:10DF5000301406576723905DD319A9A1F5B597D75B
-:10DF6000788BD1DEA957E9397CC2F061DA214C1EE9
-:10DF7000FACBC0C0F936E7432A88BC549B47F4E883
-:10DF8000D6F8FAF5EDA5909ECEDE67CFDC8FF327AD
-:10DF90006F81D8243E25C935D5A40B359194D0BFC7
-:10DFA0006BD1629B32D0DD764864C9336C744A7A97
-:10DFB000D789B72C375C88F8EDAC60F45F3C7C9C6B
-:10DFC00022E41F466FA9D8E28B4A32CC532CEB4493
-:10DFD0001F665DFFD04DF08FD47EA81DB3337371E3
-:10DFE000684342BC406D84D69703837F0CACE78ABC
-:10DFF000F58E81666A179DDDBD1FF9ACC0E8AD46A0
-:10E000005C7C3774E9F3B46F70B786F108066DE98C
-:10E01000C9DC21396104B99C782F26937C0CC9692D
-:10E02000CD6003847C7D5152D63A901F91855D1856
-:10E03000C09B5ABBA7A27F19869884EF43313569EC
-:10E04000953F59C0EA36FB0F8E94CE24D2E27C0174
-:10E05000DA7E6419ADACF90C1CEF0E06908FF9C98D
-:10E060005B4209D2177FF285A7E1647F92E3596989
-:10E07000DEBF0CEDEE1B157F6C13D2438CEB072F2C
-:10E08000FB07E55FD66CD5268FB30D7B3DD7A13757
-:10E090001628415A6FF65740E803A37ED29821F81C
-:10E0A00018640D4837DB6A55C0F982410E9709673D
-:10E0B000AEF2495A0682E318C2C1D0437084CB80C5
-:10E0C000FC3D06CF31073CC71CF01CB3C2D3E2E5D0
-:10E0D000EB75FAFDCB65E1F733BF17F5E00978DBA7
-:10E0E000A8438231C6915E096BBC6DD0DB47469573
-:10E0F000061AEDBFD3EF67FBF39E4D3FCC16759D1F
-:10E10000D9F525049FFD3D14119D505D8141FF759A
-:10E11000F96C133FFA575F617C77ED6117205F312F
-:10E12000FE55F0BD4BBCBD56F8B1CB51FF33BD7DA4
-:10E1300015C4C308DF3B2093BDFC0EBC109E6E913E
-:10E140008B77C86EA1C7D9865AF9176251F4ABD53F
-:10E1500060679F1226349874269DA47D8B01F9DD9B
-:10E16000414E6F49F0B6917DD1C5F5A3E9F77DBD6C
-:10E17000DBAEAFAFD96EAF5F0D8BC7207D5D7DA7E6
-:10E180000B526CDC6BADF607DB9F6FC91AC1770DC4
-:10E1900034776A41B2B31A711DCB3550D14F5BF958
-:10E1A000B37B662E63EBD921F4E85B4CAEEB16BD76
-:10E1B000715D24E536CA87AF6FBD145BF42569E451
-:10E1C000F56D70F52D42FB20B9D5457E1D38FDB5A6
-:10E1D000BD0AF96B967E04EF955DF6F59D6AFDCE5E
-:10E1E000F5328F85D67BDDAE65A437475A8F7B9796
-:10E1F00064A432E8B7874D7D28E48B49DF265F278A
-:10E200006B80DB7BBFF7A5D6B3F97E83F291F6BFB7
-:10E21000F96C1E47699E85E5A9FAFDDBE7ECF7EF8F
-:10E220009FB3DF6B428E3BFBADF4F6BB713F57AB48
-:10E23000C93A491EB2A3BDAE66A390A1C2B5AF3A1A
-:10E240008DA698A55DD769B63B2C959C56BB3A79AF
-:10E2500094F18E0B3BE3A93DF7B9FB91FF76BFBA72
-:10E2600008F5FB37FE49012F5BD7F13D2148237D9F
-:10E27000AA2937DA2BD731BA4A513D3DF3628B5D7B
-:10E28000C52896C6FFC64321B20FAE7BC493AA67CA
-:10E29000FDAFFBE97F4C038687E3EB06FEA510E9A3
-:10E2A00075B7C4FDBF64FFB48BD9F3EB54B8229E9D
-:10E2B000814E6485F3CBDB3F0F34A2DD27EDDA7F9F
-:10E2C000398DDBFB5517CA65B3DD47B28BE665EDCB
-:10E2D0000C7C9F7C504A4D92387C0D5387FBDD6F40
-:10E2E0003F2871F8F6B9523E846F578F3BC1DAADC3
-:10E2F000DEF52ED1ED790FFD388C7858BD4FB1F990
-:10E30000BBAB772969CF342A5FC51235A3C4F86D3A
-:10E3100095E0D7557B57921E58D5BBF95DE4D7D50C
-:10E32000FB5C36B9CEF0124B235E5F5262F5587F2C
-:10E33000F487619DA1EAADE8EEB0564EE32E73334B
-:10E34000BABA68B6BD1F8EFF61CEF0F1000628AEE6
-:10E35000B9BA77239F0FB8BE31F9F42DFC4BFE708C
-:10E36000BD3145B19F3B9C806767521C72576E461A
-:10E370003FCED41726BF7EE3C7277626D9BC6F3F92
-:10E38000F2879D4906FF8AFF797FE7B7D9BAE0494E
-:10E390009F867268F5EEDF84C182F75A85FB61C7FC
-:10E3A0001FFCE1033B18BF1CFFAD87ECBAE34FFC39
-:10E3B000D7789DADFBF8C31F8D41BB73ED13E78F7D
-:10E3C00045FA5AFBD879636114FF01E935E5B1EEEE
-:10E3D0006B8AF655DF27611006E071513AF6E7E0E7
-:10E3E0005E258DA1DB775EF6A43C0C3FABD9B396DE
-:10E3F0004ADCAF95A487B07E33C3F3AA3D1BDE553C
-:10E40000A665C277B2508E62C9D8268AFB7DF145D7
-:10E41000E75461E98AE9481F3040F2DFD96FF5110E
-:10E42000B6AF678FBC8F27E01337E27FF59E8D7CF8
-:10E430005EC73EBE837F999341FF0FDBC715DFDFC9
-:10E44000812FF7E6D2BE8FB48F2B1FBB6454FFCC55
-:10E450009407A7C26F93C4E13A5B31D628C8578F9F
-:10E46000FCE8811D11BEBFF50C21C77F7C623C0614
-:10E4700097DF700D5C8E7272E0098F762FEB73DD83
-:10E48000132F119F1D7FEC79B74E72128212D37B2E
-:10E49000C761F04F1FEAC15512AFACFE4128ED092C
-:10E4A0000FEDD3AA54439D1EA6E7AFD2F314A7FFE6
-:10E4B00055A9FD4BA40CFBB65B29E1723995477851
-:10E4C00059A9F7B9B5A07D3FA5D9B88FAF2E40BAED
-:10E4D0001B691FCDF56BB8FE5996FDFC01E7DB917A
-:10E4E000F8F3788F4795B286F6F7B8B00F56A7A421
-:10E4F000972003DF02ACE3F08E70FE68964E7AF848
-:10E5000081831ECCFEE6BA4FC5D7A75ECF67C3D7BF
-:10E510009D8A6EA31B136F6F7F9259DEA7859C584F
-:10E5200005C9BA8289C3F5950AF16461F110BC9DF1
-:10E53000BD0AC9F1B7772964A73BE5C2AA11FCF16E
-:10E540005F29DCFE58B56FFF34945F6F1FF8B9A0E8
-:10E55000434EE7ABF6BCEA4E0AF99FB2CA7F1C2FC6
-:10E56000C37EBC2CE05EFD78E6F156EF7937E378A8
-:10E570006FA9C65711FEB7FA5C906443BCD5AB6473
-:10E580008C6F1C505CB6386E6768E6CB5918DF0C90
-:10E59000FB755CF7FA75C64B49B4435E7001D981CF
-:10E5A0006AEC0D0F7BBF3EE4A773EFF5E1AB41B71B
-:10E5B000E8E976079ED4689CFC603512AFE2B1D7DB
-:10E5C00094CD1F7569B20D6E509345184FF955F1F2
-:10E5D0007FA938EE7368FF9D31D4FE39153A72D9A0
-:10E5E00078CF1952AC0D32C4A71CE3C7E729A05B52
-:10E5F000E9CC2893ADF1D5F0819B282ED102CD69CD
-:10E600008C134111F4DE6F19F7EE560DD26C7EA813
-:10E610002B93ADF1554F73B3E1617014ADD54AD072
-:10E62000341B69FE71CDB23DAE2DE65F23E209B029
-:10E630006BF7EEDD6CDC3A7C57827E0C8F573177BE
-:10E640008AEC98F3841CFC6761071F90E287D0CFA7
-:10E6500032F46D2ACA39A9749B8AF6C4C24FBAD55E
-:10E66000E5167A5C58DA5684F472F853A531135DD6
-:10E670002D51395DB5156F28C2FE877D371671277C
-:10E68000344AEB2C10EB3C34EE9A603F1B777FF161
-:10E69000355B2633B8EAA20A60BCA52EB26C4B05E6
-:10E6A0005B7FC11125E663F582A6A49A983A7C9E09
-:10E6B0009D28EF19FEEE453C32F87FD01AA5FA03EB
-:10E6C000AD3A95BB5ACBA8DCDD1AA3F77B5A67534A
-:10E6D000BDB7B58ECA475AE3F43CFC2D7F02E977FB
-:10E6E0006F6B233DFF696B82CA1A95F3DB42810F82
-:10E6F000CBBAE91C6C497B781DC6514CFC39F15DE5
-:10E70000CB282E87CE0D241DF13D56E572C589D745
-:10E71000969620D9A53B25B0E173A6CAEDC8B8806E
-:10E72000E3903771A1CACAF7EA4ACBC9EE81780CE7
-:10E73000E5F44E297E5B05E397A7C6CD8A5AE56EC0
-:10E74000249888AB7943F5F15D3C3E334BE5F2A963
-:10E750000EDA0E6531F88C4F40473A33D779A05A1C
-:10E760002F42B978A08DC1538EEF6528B3D0993967
-:10E77000DE5C011F0433CBE921BAE5FC1F9D5BB6CB
-:10E780000DE3C4CCF18C4DD2C9EAB6F5DBA69A7183
-:10E790006F9DE8D8A413C63F4F8D8BD030DC5F6CE3
-:10E7A0002AE6EF7D9CCE5BFADFA5F856740CD8E222
-:10E7B0008D1D4D32F9393B8EF2B8F489A6926D93D6
-:10E7C00059FB6A8637F4DB73169666252C74BD45B3
-:10E7D000D0D30E6F3C4B1B457F758A7666FD155F67
-:10E7E000E23B88E7BF9FF0937CA4E71DAED4652889
-:10E7F0001F5B8E7AF475129E37C493B86FF122F6C0
-:10E800009C8174A26EAD879616E4E70F2D37EBDB83
-:10E81000CEB0F0792866E7EB9D2DA3C7A54DB8775C
-:10E8200022DCA3C4654DB8CDFD3851B764E01A1899
-:10E830008E07E7B8390B978C3AFFDDC8771EC2C345
-:10E840004ED5229F8A9A353A6730FB9BEB75F67757
-:10E85000AE77285FE1F4CE677A5D908BFBF9F0C765
-:10E86000E31F7D0E70CBE30ACAB12BD4442FEECB4D
-:10E870004C68A63AA803F9C82FBFF373FADFD1F9A1
-:10E88000403EF1919A2A46BD70BAF375403C5E8DC8
-:10E890007A2B26C7ACF2DC2C7FA19A718234C58F0B
-:10E8A000E888994D29076E8E66C2F3E0F845EADBE9
-:10E8B000D6F3A42D00DC4F4F7BE99C0303221AAB57
-:10E8C000171F86CA4D6CBCDD429E54ABDC2F9C7E6C
-:10E8D00058EF5178FC48690859F028E2A9661CAB4A
-:10E8E000036E068D7575AB15FBB1B9C9870DEEC406
-:10E8F0008B882F7754A7F3775724417C0522FE3D60
-:10E900004EC4E9CF1771C6FB5B789CB105E2179E38
-:10E91000817C7D4401F28F13136DFCEB5CE77E413B
-:10E9200057FF24F4DFCF85DC2E55F74B596CFCD014
-:10E930001BE9036156FE4CC8F1C7841C3FB0ED5F74
-:10E940008A319FA023E18E214EC355FEB4C4ECD082
-:10E950005B67BEA15FCBDA77744F6E47FC6C58CB18
-:10E96000E3F28FA2DC67FD1E16723FDCDC793D9D71
-:10E97000DB09F95264E60B08795224E4C9C16D2F12
-:10E980002EDB80EB4B78699E16483F8D717D582BAE
-:10E99000939D12EEFDDE0D38CE43AD061FB77BF71B
-:10E9A000DFA17D7F8F375DF9AF18FF9FE78E25517F
-:10E9B0004EA526D9E454B877DF8DD82EDCFBCC4D9C
-:10E9C000940F23F0E0799CAD9735C9BAFD703AC435
-:10E9D000DA15F6A7D1EC66FBDAB3700A1BAFB45EAA
-:10E9E000A670F51E297E5E08E9A1819F4367552C1C
-:10E9F00069C3F6DD2B5E4862FF31CF364BB8ED3987
-:10EA00007F776F35E2EFFEA2D79EAE66E5645731A1
-:10EA1000D141F0A89EFF43C0F1E3D16BF591E9F03D
-:10EA2000E08A358072CC73A74CE7F4F7DFB906AE05
-:10EA3000B1E65DAC5033C6C726BB3CFC3CEBCEC553
-:10EA40007D2867CDF3ABC295B55EE2FF67C1763E28
-:10EA50006B9E6399FD2BA4C464571E9D57F0732DC4
-:10EA6000D1BF40411B8F556F90391FC4D33E6BBE41
-:10EA700049F07A399E099E592E95E0698FD5EEFAB4
-:10EA800017369F3AEB52D2CBD06D87C3D98FC131A5
-:10EA90008BC3C1E133E118C74C82209BFFF6852F61
-:10EAA000E6237C1FD60DEA1B3FFAFF1DDF95D3132B
-:10EAB000D8FE6C6D97E9FCFE40D5012FE2714B55F5
-:10EAC0008D9FDB3F9CEE72041FFDA04E26BE3D5184
-:10EAD000C5CFFBE19393741EE612EF73F20E78E953
-:10EAE0000C236904AB6762FA81F9C7925FC0705367
-:10EAF00099F4DBE4A7DC9263CB371807058EBC954D
-:10EB000092A1F6E87FD71D91502F85C47974A97919
-:10EB1000BEAD1C8DE1FAEF32F562AB97CA9EE603FB
-:10EB20003E9DC1F58B664627B42E7B5E8AA7096899
-:10EB30005D05CDFC9C6D8BD6B7DFCDEA45DF65A8C2
-:10EB4000D7D19EEB25F902DD3C5FC03CEF98B4C203
-:10EB50009EB752E4C8B719969FF519FDCCEB5DF648
-:10EB60007CC313B0650AD1435F896D5F7AE630B725
-:10EB7000E6ECE1FEE6E0B8C29F82289773393E3E9C
-:10EB8000C7ADDF529AD05E0A5F58996D3D1FED7494
-:10EB9000713BE9D0EF3C80F1F80DB55E8AE398E770
-:10EBA000E8E67E6FC5A42BCC77687FC087F4B223DC
-:10EBB0005242E5C1B9CFF8FA890E793E8047AC6977
-:10EBC000DDDC67163631BCDE9327938EE9287A2187
-:10EBD0001FCF176FAFF5D2797F38D0DF7B90D58309
-:10EBE0007FEF8EE1F9F6FDD5E946ABFFFA908BDBBE
-:10EBF0005BDB5D425F6DB19F3F333ED88E7CE009A9
-:10EC0000C6E9FC52F68ABC09879F63E2237C205F39
-:10EC10002E9ECACB92A943F6F9DD826E760879BFA3
-:10EC200045C87BE738C54DDA0137DAFD2BB44A25F4
-:10EC3000035F4E68B1DB09E39AED7935854D76BA0D
-:10EC40000FC50A1C76459AF498A98F37F88213915C
-:10EC5000EE2B99BEE4F681265BCFDB9DFA78B76A8E
-:10EC6000EC7391BD7B7A764238106F467C3BEDDCCD
-:10EC70004302DF1F2BC601C46F408D1F72511E68F7
-:10EC80009CE48CD36E1806273038A78E0AE72F5DD8
-:10EC90009FC17E3AD5F9C09FE4F8F6E718C8F3B3F0
-:10ECA00040E45D84480E7784B8BFD2E1E27EC27B47
-:10ECB000625DFFE15268DC01415FF303D09C399F44
-:10ECC0008CC78B3E40C304DB8DCD9CBF8B160BBD28
-:10ECD0002FCCFCFE03173F679B3F61F479FE88F35E
-:10ECE000B0F257AAF1AECB728EF384CB78DF658990
-:10ECF000537CE8D2383F98FB21F2734DFB699F6A41
-:10ED00007C64ED6F96390B553ACF3D01FE98C2F009
-:10ED1000F3643EEC0526479E94043E7FE7A33C2027
-:10ED200013DF83F635CA0FD4034703298CA798FB5A
-:10ED3000609EC30CCA11D1FE4C3797278C6E026EB1
-:10ED40009A3FCECF0B214DF2A140D0CD0EDFD2DBCA
-:10ED50006A5979EBDCB75EC67C85771EF3E908D784
-:10ED6000D6AA6361ABDC84263BFD98CF5D1F16D22B
-:10ED700039FD37A544BEDBE247BA22036EECFFA49F
-:10ED8000A4933F97FC8D42F6C893526A0A192A2A27
-:10ED9000D079C693D746539B2CE71D4E3B3FC7D730
-:10EDA0007FD76A5C7713B39760F8BE9976FAA0DDD7
-:10EDB00011B5F78FBB41D8D96CB98CAF2BC4BA63EE
-:10EDC000AAA1201C332041E52CD0A964FE40A59BBC
-:10EDD000B59F0E03F9C847EB02E3BFC4ED8CFF33C8
-:10EDE000BC197F8D781BA25BBBDE36CF1DF2041EE3
-:10EDF00042D04CE7EFBF685CBE71129BCF5D14241C
-:10EE00007B38AFB1FD7A398CD97E7D1AFA9B79E2D5
-:10EE10003C1C9670FD6C9E4FE7D4DBF5B9537F7BAD
-:10EE200084BDE11941AF3BE5E6487A7D85DBAED78D
-:10EE300007E3C723C83F67FCF8D4F24FBFADB6184D
-:10EE4000F3348C976AD1AE9BA752BC333C11AE8889
-:10EE50005BE8E1F76E223A56F2BC994D8C5F53673E
-:10EE6000703E07F413024C01E179C2383985F93656
-:10EE70001B92A93ACC3FDBA04ED2ACFB583D8EDBB7
-:10EE8000B35B6BFC4D56BBF60F7E178DFFCD40F587
-:10EE90003348C7E5C1540DB97B067304C7F0BC4BBA
-:10EEA000DCB7B334E8C773580F70BDCD38C2CBF5AB
-:10EEB0004AADF63AE56726E0646034BD60CFC7DC52
-:10EEC000ADA6D6F9111F111E7F096D97283947E9A4
-:10EED00035D298CB5515587CB79BEBAF329C67FF6A
-:10EEE0004C66EEB2F67FDCEF263BA73754A8A23D76
-:10EEF000F9A4BCFCFB68070EFCD603789ED2FBE9A4
-:10EF00009974AFA137F4A5054807BD1230CF96AD6F
-:10EF10009FF10F4FFE8100C6EDC3E7198071CB81D1
-:10EF20005F40EC5E36BF2BFA689CF276C108C8B32E
-:10EF3000593F1F7461FE4AECCFFEF7CF6574F74866
-:10EF4000B0F28EB361280E60FAFFB5FEC4A3086765
-:10EF5000C7987F6B423EEB62702A6487195184BB6D
-:10EF6000324F26FE83BC606A127B5E7D38528BF97D
-:10EF700068D56A054A1A0607DFEF577C892710FF14
-:10EF8000B55A436D366B5F7544277B6541F4FA4390
-:10EF9000589F7994D73BDC40F620F22F58F8AFFA0F
-:10EFA000C3F1B4BEC3428EB7478D3E431A653F34AA
-:10EFB000D5719FC39EC762A5036DA68D0E122E2B21
-:10EFC0001DCC667430D54A0786F459E8E07B42DEF2
-:10EFD0009E9A5F389FDCA870BE194EF7CDDE9CF27A
-:10EFE000E1FC61CEBBA92A2782E7AB261F68B36E7E
-:10EFF000D6B0EE59E68E23DF997C61F283E21BE402
-:10F000008B8B7C6C7F9704F5F333F105FA7156FA1C
-:10F01000BF78043E5904038730E77E910AC92C2645
-:10F02000427E35E78DD2F116BA77E269D13C098E7E
-:10F0300059E4D1C993BC6EC1A3369807AD9C3EBEBE
-:10F040005F50F58E8885EF3A99FD8C4661971C8359
-:10F05000BC62E4BBE541CF0CBCDFF07094E2FB9EE8
-:10F060007813E5ADCD7A3B7035A3C33F8E91755CC7
-:10F070007C87BEFC21E2DF97038076DBD699D74DF3
-:10F0800040FFE48FD72626609C7323C3FF31326E86
-:10F09000526365CA85EA1FCBCFCBF4282F1351FEEC
-:10F0A0001CC4FB94A81BA25D3FB563FB6C9387DB7C
-:10F0B000BD5C0E6EF7723B70A3BBDB8BFC3550EC76
-:10F0C000A5F354E7FACFF5707E38D70355B108CDD4
-:10F0D00046F1960EAF52D7C3E350E973D9F37327C5
-:10F0E00096DD6BD58F66BF3B5A53F1D726E17A7612
-:10F0F00051995B9F023C37F09725758CDB7BD7419C
-:10F1000022937DB8C3CBE304DE03FF40E74DB9A5EE
-:10F1100031F24F23F56C3CCBBE2E6228CC62728656
-:10F120002DCB407AEFD0FD64AF2D8AD4BCA94E1B05
-:10F130004E07F8E798653FBDFFA3247AB91F477EC5
-:10F14000C85AE1F7D59678897F3A5ADC3D184FBB0B
-:10F15000CC934DF8FA2052336A9E2DFA5749460F48
-:10F1600029E65F6189E720C933F83908D6F11C0424
-:10F170004B3C07C112CF41F03D9E8360FD27AD0699
-:10F18000D5F13C04EB781E82753C07C13A9E836042
-:10F19000B9AFB589CA7F6C6DA6F78FB7B6509DED34
-:10F1A00013D9E350968C2E6678EEBAC96DE0F976E5
-:10F1B000B7D88F8346492EEEA32FC2FD53DFB3B7D6
-:10F1C00003AEC717E571A5CEE8ED70252BBB6684AD
-:10F1D000BA30E0E57D2848A54FBD0330BEB0534AA4
-:10F1E000366124EFC60DFBCE53991E2F8D5E5F93C3
-:10F1F000C3EAB76C78723DE6F74CD6DB62CBB5A1BB
-:10F20000BA1EAABCEE614B7D42798FEA67EDD779D1
-:10F21000F6AF477E4638D0C8DBB2E1E0796DA58C09
-:10F22000984A80EE790C14BB53488F57E17E4D42CB
-:10F23000F8B9FDFF65581F457F7A82EEAE443E6205
-:10F24000EDD39C7E4FAF7D371E66CD18DE6FB47652
-:10F2500072D569B5036594F1F0BD34CA381DB05E4E
-:10F26000C33B679B91E731EFC817207FAECBC5F951
-:10F27000B7CBC7CBFF167C7BC85B13F7B232EEE58A
-:10F28000FBDAE58BD7613C7460AA4C71855E171B75
-:10F290000293775B8A7F5DC2E6FDE6332A607CFAE3
-:10F2A000871ECEFF932684B85EFDB697F4EA051359
-:10F2B0007EDC9EC3EA93EE8BC5504F6E86981FE9A5
-:10F2C00024B985F3FB8FAA26E634B0E667CD782C07
-:10F2D00007E30DAA802385F79258BDADE3EA09182C
-:10F2E0000FF9E3F35C7EFD54CCD3E3EA6BA6FD9CFF
-:10F2F0001124FB82618CEC87B6A84AE7F7723E2F97
-:10F30000DD2EED6FB09D9B29E82483C7FDE92C2FEE
-:10F31000F9E91F7AC47DB63EB22BDCBE8496CD9E41
-:10F32000772765E2F7F59A3F8529FB9B839574BFA4
-:10F330003659AE527EF6E6721EC70B842E4DA13DA5
-:10F3400071DB7E1F970F412FE569A5CAF71EAE89B5
-:10F3500060296BC8EF2963711DE15D9335CAF762BF
-:10F360007FA3F74D11CAE7DE0C625F9A64F2173B88
-:10F37000C6FCF95FCFC673F1AF6B3171C788F22558
-:10F38000C90492F1BEEFC08100C2F3B7E6FDA4FE4E
-:10F390007501D6BE7DB916C37D98A6D5D4611CB1C2
-:10F3A00043ABF1225F05A6D67A97911C1ACC67A6CB
-:10F3B0007B70EDE5DCAEC5F7C897D00E87F0DE4B6D
-:10F3C000A1906581EC4A09EDA18E7A0A2F61BEAF4A
-:10F3D0002D3FB33DE742CA7F5716E5109C1D60786C
-:10F3E000B17DB25E25FD5518F4A6D1DE2B34E38B3A
-:10F3F000989A6CF1377257D8F39BF39B54DBFD8FCF
-:10F40000B1097B3D4FF80F798E3C68C96B9E23DABA
-:10F41000F1E45C6F6EE4DE6C8437172F34EBC3D7F6
-:10F420007347A4B201D759A8F909EEA8B6AE1AE5F8
-:10F43000D758686E43BAFBCCF03AE09C56DEDE87C4
-:10F44000FB3E4D57E9BEC3D930B00EC7DD2CE8BC3A
-:10F45000ABD8AE4F7FE851C43970CD1CE4478C87E0
-:10F46000252DF31727FD90B4CC37B12BC7569FD469
-:10F470005D606B7FC6F612DBFB29A9336DEFCFDA37
-:10F480005569AB4FED9D6B6B7FF6BE1A5BBD227D60
-:10F49000A1ADFDF4C38B6DF5197D7F636B3FEBE58B
-:10F4A000E5B6F773FAAFB3BDFFD21B6B6CF573060D
-:10F4B000BE656B6FDAD74EBD38DDFBF9EC6A0FDE47
-:10F4C00007B3C50FED76BBD3EEF6FECF7A7D1DCA2E
-:10F4D000B5B09BE85B453DCEEA6B6EE27E8F777EF2
-:10F4E0004C47B93245D063246818B86FD5612FE90D
-:10F4F0000335C8DBA9C10564778CDFCEE4D174B4D1
-:10F500001661F07D00E5726B325EEA1A82DBA77548
-:10F51000D3DD86EA701DC5DFCDFEAA66402284F3E6
-:10F52000E93CFF887995D8CEA7B3FE96753C29CBE8
-:10F5300074157C80F967F75AFCB391FC31A7FF750D
-:10F54000BAFED67819FC58F648F1662CCB9B9FAFD3
-:10F55000C1343CE6875DE565FBB3D51D6FEA61E329
-:10F560006E2DF1F3F332E1877515F7125F0C14ABD2
-:10F57000A45F40D5CB175BE260B709BB32E0BD8B1F
-:10F58000FC40B564F6611DF1DEA6527C62B3C4E3B3
-:10F590002849B60FA8D776CE7DE3DD5BD8736F8997
-:10F5A000B7D0CBE451ECA0DBC073D23B045E4BB4CC
-:10F5B0008A1A667131FBA2E1009693756667B0B254
-:10F5C000AC6CDB012CDBBC2534DF99B1876B50962A
-:10F5D00078E773FB4F99E64EADC3FDD3381C23D1BA
-:10F5E000999AB39D9F6795AAAF23BDA1557E521EE0
-:10F5F000A2031FD2814425D18F2F1224BDE1C30362
-:10F600001FACAB522AC0DE474A0D09F333AAC3DB55
-:10F61000E97CCE97B6DBABCC2FBD0DF11AA9B7EFC5
-:10F6200077C0BB93E06B97789CB62B5B7FB686C1A7
-:10F63000DF9557928331168C633458E4CD76A14F11
-:10F64000AFF0C9A6FE2779E343DEC81BB27718FDE9
-:10F650006F9727227CDD8072CB77733720BDFB3418
-:10F66000B69B686F7F2749F46FDABB3708DEAA2D97
-:10F6700069A473B1F7239564DFFA5A7E92117FBEB5
-:10F680007E058CE923E3353C7907E97B2871EB683B
-:10F6900057B4E86EA327D339A047F81F981F82F00C
-:10F6A00088FC902E810FF35CEE7D336F4A9C07DF60
-:10F6B000900DB6F3C11BF22AC78E668FFB987F9818
-:10F6C000B0C0BB91CD8378E9F8A4A12E4EE784C0E9
-:10F6D000EFB37D5ADE43F7863F59AFE339E62C811D
-:10F6E000EF733D1CBFE3DD407EC27918E7988E5E64
-:10F6F000E997EB902FCDB8C89BDE1CC27F2C094A3E
-:10F7000033D92B2E536FC927CF269875B719CF241D
-:10F710009397EB35F6EF7EBC7F31B1CB7EAF69526C
-:10F72000B7BD7EC6767B7D4ACA5E6756F311B40BC1
-:10F730001A80E3E7AC5DF6F70D663CB096DFC7F0E4
-:10F74000B2994F72FD6BBBFF0A42FF9B71D771BD2F
-:10F75000E96A14AF456BED7AB540E8F90287FEAC73
-:10F760000C29140FA83E1C3984F6A319A779C5A744
-:10F77000DBE29F66BCC529CFFD47B7017B437E75A1
-:10F78000C2C3E31009E6DFB41489F8C6385EBA14C0
-:10F79000FDB9A564A7359F81F2E99037F1B197E2F1
-:10F7A000CEF6FB12EFD5A9BF90743E4FC232CF8D7B
-:10F7B00065C90BF8F253947F62C63B4C7F5E091A11
-:10F7C000711C6F73EC85E683186FFAAD07709CF3BC
-:10F7D00095670FB7B2FA9A712AE54B6AB3567CDF88
-:10F7E0008FF1427CCFEAD5C5FA58A2FFA75DE4D7D6
-:10F7F0006F10F46CDEE331E323519FD03F3ED32EF4
-:10F800004AFA453EAC1FEDDCB37631D96CD3733C7C
-:10F81000EE66C6D7A6F6DADFF78294ABB1FD3BBB46
-:10F82000312573BBCA08565BE2EF678AFD9AB6348E
-:10F830007DFB5256DF03A94AFCAE4485A08BD8213C
-:10F84000FBBDB13120D1FD82314794588AB59FF676
-:10F85000B8FD7DB9E35ED999CE7B668E787048811C
-:10F860007797B1F9B6E8CD12CACF2D4B99CCC2F932
-:10F870007D22CF78324C46FA3B5F09C6D288DFDF63
-:10F8800028A4373CAF9EF1D232D4E7CFF33C166DBB
-:10F89000A2BEAD96D5B57F55483F6901A8A8080E10
-:10F8A000C58FBF773206EDAEA178D46EB6AFA59303
-:10F8B000D0BFF602EA959FB0FDC57A2FF3C7B1FE1F
-:10F8C00008F3C7B1DCCBFC717CFE53E68F637D1F70
-:10F8D000F3C7B1FC47E68FE3F3C7993F8EF56F0698
-:10F8E000AA1738E359D6F8DE503CAB5F32E359280B
-:10F8F0004A3E70EBB4EF8371AD048F6B9D7A1CC3ED
-:10F900001C87E286C3C611F1C3776EFAB707F09E73
-:10F91000F5CA19EBBAF0BEACD765C6CF789E84990C
-:10F92000FF6CF2DFCABDD7D3B9B13BFF4833EEC796
-:10F93000DEAA207D8BC8ED4A68281F9DFE97E977D7
-:10F9400039ED5FB374EA233FDA01D3D14EEAA6B8AA
-:10F95000CF261794D1FD59C91F43BE70C62B4D3E0B
-:10F960007ED15792F1BED4601EAD88CF7820E5C518
-:10F97000B89A5B12EB14799E24C2D8109B919F2DEC
-:10F9800079C9C1F234C539824183EC2F89D96564C4
-:10F99000A7698928C6A13A47C89BBD4FF0675BBEDF
-:10F9A0009BBE37D199CFF3046A8B6251ECBF3E7F87
-:10F9B00066D49A476BE6F91E0ACDF4F65BC65B1374
-:10F9C0002A19554F294CAFEAA3E855C5C3F3DCD734
-:10F9D0001F98E3C5FCE54DC1E57D685F6D8A46E88B
-:10F9E0009EFBFEFC99647F0CB68FCEA63C6725C8B3
-:10F9F000ED5625EA25BB55C5F5970FB537DBB5FAAA
-:10FA0000385D31F6A3F85C20D84BED3C6A9CE21FD0
-:10FA10009E08D0B996C7CBF30A82CCBFF6DAE2AB28
-:10FA20007CDE1611F7DDA427E2D86F5354D5511CA4
-:10FA30006D2AAB243CAF17785E9F67EAFD18D91B8F
-:10FA40003F137836C7592FFCF5F54D6EB2BBE22D4A
-:10FA5000D9466D2EE56DEEF1E1F8C17BBD9807EF5B
-:10FA6000CEAF1A75DC0338EE8CD1C67DB5A6763ADA
-:10FA70008DFB331CD71D5AAEE1B8AE11F2F39F13C4
-:10FA8000707E5EFB92614EA3733130F56D2A6A3D44
-:10FA90004F76967EB413A70FEFB752EF5F80F9C190
-:10FAA0002A24EBFCCAF0FB0DABF6F1EF556D55FBCC
-:10FAB000C8DED9FA8994F19EC418BF24CE6B07FD25
-:10FAC000709BBD5228F8A950BCD7D15E2946BFD241
-:10FAD0006E5F4C3F6CAFCFE8B3D767BDECB4578CCB
-:10FAE000DFA0BDB244C8BB3E269F7972C5808A7232
-:10FAF000209E4C5523DC0DD0DB86E7992E85E7113F
-:10FB00002C11FAEA22A1CF82FE6C82BFB0C96FF33A
-:10FB100013CDEF6E1489F1C7D51EBABE1D856BDCFF
-:10FB2000B47F74F22FC72D7CA49AC4A4C30E6A308C
-:10FB3000ECF7562F72D8394E7BA85AEDA1BCCC02F7
-:10FB400047FCC13CCFC475E2FD5DE7FC9F755E7369
-:10FB5000BC1D4C6FA1BD627ECF80BEF7C5FA8F532E
-:10FB6000D3522C48795E940F58B8168C9E0C747C36
-:10FB70008ED8F761784B9E4B783B4F3C2B08F2EFC9
-:10FB8000A514D42A29BD98E789A13C59BC82AD8728
-:10FB9000ECE593745E6DB6CFC9EEA5BCB21DF5124F
-:10FBA000F71F93407688B9CF3B82FC9E4DC33952F4
-:10FBB0004AC6FECD25343FC15532B4BF0C4FC738BD
-:10FBC0009E781EDAC575F6FB400D0E7BC3A4878BAD
-:10FBD0001CCFFB7DDC2F32F9E09D392F4F1ECFE08B
-:10FBE000582925EB02CAE9EB490B7FB84E221FE2E8
-:10FBF000DFC7D052883F0E781FD5288F20BBFF2E3D
-:10FC00006024D9E08764ED3C807FF60F9C25B17AB3
-:10FC1000E3A6B33BBAC6E1B5C6811FA151E6D950F0
-:10FC2000757EDD394375FF2683EA11310F732D92FE
-:10FC30007CBF2DDF3760F0EEC43C02B44B0DD8A67C
-:10FC4000600EA6AC6D8B150FF5CBC17ED228FDE200
-:10FC5000B04DCDD02F68F663E8EA34BF0752822555
-:10FC60007F2F0B78ACF3AB88374D0FD27D9F05AA61
-:10FC700086E73F5F148E31A75A7702B6B9260EEF9A
-:10FC8000C7C06E33E19733C39FC2F7D6F95DA3C0F7
-:10FC9000FF97C6C7A9C6738BF79F193ED67CDD9820
-:10FCA00091D78B70B9E8BB1A7A50B68C73DBFE8F94
-:10FCB000287EAD5E06749F4775195A8CD179B97646
-:10FCC00027F9E16A76AD8676C04656473B60636F9A
-:10FCD00037C5A9CB4B6FEF42A22F4FFB01E5C154B3
-:10FCE000D0B2F7B071A76A2A66EC807ACE2119E308
-:10FCF000DEF015A0FB2459FBFDFCFB17C573EF4399
-:10FD0000FF283BDB4B71A040F6CCFBB8B1CBE3C185
-:10FD100026FC81EA23351827571B2086ACA84A29E0
-:10FD2000A846269B02740EE137F6DE88F73299E288
-:10FD300023FD44DF8440BD2AE2E26339C940975B7A
-:10FD40006B403F21F98C4AF1F7B17864C188B2BCAD
-:10FD50003C671BC2539E600348083F8F6B4D4DC8E4
-:10FD6000B1341BBFF25DDE0F7EC9EF11305FA2F12F
-:10FD7000B1E0105E4DB93256C4CBA34BEDF164181F
-:10FD8000606B66FD2B7FB9F87E8C278C1926BFB976
-:10FD90007F6D7E6F27EB5D883F46E79A76BDE11762
-:10FDA000DFB5F03BBE97303968BFBF37CC6FF84E38
-:10FDB0009CF48007625E37D9174BC96E30FD911DE8
-:10FDC000D810E3FFE3807FFFCAD97F26EF0F51EE03
-:10FDD0009F78FCCCCCAB64EFAFF31B9417E4617558
-:10FDE0008647C90DDE7CF6BC40E67191360954ACFD
-:10FDF0000FCD97A6F3FC0D52AC2B260DF9BFEBB53A
-:10FE000018E519C0DA1C9BBD6CE6ABAEB9B6786CD0
-:10FE10000E2BB386EE0D69488F6BF24AC97E0EE752
-:10FE2000F67F0DE5EB47FE5BCFF7A23CC53C87B9FB
-:10FE30004C286FEEEA483279EBF9B010748B5DE62E
-:10FE4000519B290EE6F970BCED79BAD57ECFD0086A
-:10FE5000CAB5384F514027BC5683D68EFDAAC17E05
-:10FE60009FD0F361BECD4E1F1ABFC8F63CCDEC1932
-:10FE7000EB772C461E3F007A9975FC89238C3FD97D
-:10FE800031BE9671FCA171736DE376A83C3E9A8CED
-:10FE9000F869DF9DF64055A0A63890374AFC3EC071
-:10FEA000E3F71BA2CD14BFAF01C6F08C4ECEFDE42C
-:10FEB00098C2EFBD01D96D50648FDFD708FA95194C
-:10FEC0004520FD9EABDABF1F361F9CDF13B3DB431B
-:10FED0002F21A3B079E550551FC5F13F0AEAE87F0D
-:10FEE0008D642FF7B502C58FE707FA6FC073EAFA82
-:10FEF000C0F75D1DB3459E6C01C0DF04F69E8FF711
-:10FF000003FBC4BDBE8E884C7889D78CA57B3AE6AE
-:10FF10003871374C42791897797E02FD61F3F7E525
-:10FF200015D8F21CCCD2790FB4C190E2A516BAE96B
-:10FF300093195EADF39D57D8A358D611F7C00C9A0C
-:10FF40004FD8B983F38DF97CF33D2FE24EE67C0D5B
-:10FF50000BECEB6B706BB4BE06C1BFE67CCFE3FA73
-:10FF600032E0F794F3C99C6E06E7BBC0BEBE068FB5
-:10FF700046EB6B10DF031E9C6FCCE79B6F83AB39A6
-:10FF80008176DB3689F3FF77373FDE81FBFA7EFD32
-:10FF90009A28E90361175F841D58BB8B543EDFA28A
-:10FFA000226FAACD32DF0E26070C910F6F78307FBB
-:10FFB00043A37AAA354AE5BDCCCE36287FA38CDE92
-:10FFC0003FD01AA3FAAED6D9549AE394CDE6DFA770
-:10FFD00099324FCA686FFF32C0FDC66DF9DA6557B6
-:10FFE000A15EAAF6F37B93B3BF0486C5FE6506F156
-:10FFF000011F9EBF5C0A15A8DB266FE770476AC722
-:020000021000EC
-:10000000A470FFFC1587FA5A59DDE372E9A84F196D
-:100010002FC433F9A98703DC0FF7B8B9BC87B9FC43
-:100020007B878B845E01A55E72213E2ECAA6F3FEFD
-:10003000C54B8C90C6F0B644927E532AF414DE6F02
-:10004000B9446C95D3CE8FA0C660E3460C2585DFFE
-:1000500031BAA4E87023EAE578E862F20FE2AC6313
-:100060000E1BE712A127AB5FF500E63BC0F96E82DD
-:1000700063C912BB3DBFCD97D6D03ED9561101DC26
-:100080009FC5F5F6F71E37E7C3B8E3FB068B4EF1C5
-:10009000BD03FAE656867C53677CF24040E4AB8AA7
-:1000A00038E40928BFAD165F164546FDDEC14D0197
-:1000B0002E9F4CFD369C8E393C7F10726C47EB3E78
-:1000C0008A8799F015A82909E57561D33E5B5E130F
-:1000D000432C19C3661C1E943D15E88738D7B343DB
-:1000E000DA933FDAF74D0A407DBDBF4C7CFF531ACF
-:1000F000BEEE5703F6F8EB0998F75C2964E21F1E81
-:10010000775D745889B5E9437831F1F0FFCD475BED
-:100110001166563E77DE0755DC7F2BB27D67D3FC38
-:100120007EF0C5837515540B3D5F749D9BEC1930B3
-:1001300006CA91EE8E9C13E0DF7B33ED97F46F657A
-:10014000B45FBEF8F8C6385B7EA71877A4FD72E6E8
-:100150001B5AEE8B0EE5C3637E89C4CFB10A30CF44
-:100160002DCC9F1FB3DB99B63CB7F5FB1F9430CE67
-:100170007717E6E359CEAD0B993F8FF1AEA215F696
-:10018000BC3A275C665ED5E07DDB794BB43D3A7DB9
-:100190005FB11B3F58D3B53D19074B1EA5798FD0D2
-:1001A000F4A79DF7079520FFCE5E54DCCB70C68385
-:1001B0006F94935AB18479AB296F352BA7E72466E6
-:1001C000E195F61B95641D3E57C6CE6D423C2C6DE5
-:1001D000F9760CE3775A6EE6B8F452A1BF6B829CB5
-:1001E0006E8EBAD2E3308E7D4D4E4D4D302F43FB97
-:1001F00096EFD078F347F86EFDD7823C6E7297D0B9
-:10020000E7CEF74BC4FBAFAE94E93B183E08A5A47C
-:10021000623C37EE9E4DF7F656ED8865BA1FF75CE7
-:100220003871B1151E5F29BFA70DD03B07F1B5F19D
-:10023000E3BB7B1F62A8CCF93848723447E1E35A2C
-:10024000FA7F2D386378FF273F7A91EE373F89F7A1
-:1002500059E6E2F6DDB300E3DF5BCD3A86E4B19E1A
-:100260006DD6BFCDDF0FD6672CA866FDB7220D3245
-:1002700022FBFD960B3A51CF6E95407C87BC6E01F8
-:10028000FA875B5DBCFD3F89F7F32F7CFBBEDB503B
-:10029000DECF74931FB855D823267CFD417E1FA95D
-:1002A000FF14F8BC45EC5B10F119F94CF8BC2513B0
-:1002B0003EFB738CEF209E7C9849C140F07DEC5D45
-:1002C0008BF9C6FFD00AB1ABD81AEE8AED7DF036B5
-:1002D000A0FE1D99F019CF313AF17970E5315A5FDE
-:1002E000A83488EE0D6C9C05344E06386E1D6D5F8B
-:1002F0009FCAE272EC93102F7384FDA778FAA2785C
-:10030000FEAF557DEF068DC991CEE2EEC64CF47D71
-:100310007788DBE5D923C4AB1F15F8FDBD16DF894F
-:1003200070B76BB7D37758DD12B71B36CEEE07C95F
-:10033000D2EF85106FCFE07E00E176CFE1DF470D91
-:1003400031BC638259A88AC3BF513F0298FF1D8AFE
-:100350001EA1BCD050553FF13B5D6928E07485FE7D
-:100360009A57D8678F6E59BA00E54C8E62D2E1F188
-:100370004EA41B65A84E74D493C3FBBFBCF578276D
-:10038000FA733B99FD82DFEB4816F0BC11E7FA9E49
-:1003900014F0DE13367E8EEB1B864F4FFF7DB7B118
-:1003A000FE5B27F17B39F3E5BEC62B912E2F0C9215
-:1003B000FDC59E375ABF93F307416F7F0872FB69F3
-:1003C000EB475E7AEFDC8F91E8F5D702DF9F835E23
-:1003D0007F9D89DE18BD1E71D0EB0790995E5FC9C5
-:1003E00044678C5E8F66C28BB3AE80B11DCF67D57C
-:1003F0003F2FD885E3A95F9EB7FD21562A7FBE39DE
-:1004000049BB19936CF750CD792AA4C45B418B7C0E
-:1004100037BFE34D391099C69D35733BCAB1D31828
-:10042000F704C2ED1CF7208E3B03E54B3091E9FB4E
-:1004300046DF0FF1BCF107C5BA46E29BE74EC13774
-:100440003F0D713A607CE30A9D06DFBC2EDAB37D76
-:1004500008854E8B6FEEA4D257CAF986AE2BCF1DFE
-:10046000CE3700AF74A23CEE2CE67C313EF44667FA
-:10047000B2C8C247F011BD5786EA24BF4D3E7A3B51
-:10048000F411F191B37F7884EF594D1A5C47BC1495
-:10049000D76D9CA5B5F3FB38FDA4B77B6060BF8723
-:1004A000F26C795EAB3F9934B8D9D007F87DC4A916
-:1004B000821F77A20F867ECE4C116752FB60716857
-:1004C000383F87AAD255D6EF0D1C12F37F1A8A57F0
-:1004D000E1FC3DD03F05EDAF91F6698E98EF7BD9F9
-:1004E000C69C50063A3F951EBA3CC4F3372F17F30B
-:1004F000E67CEC6D46FBD3C9EFF357FDE39B0F8C15
-:1005000032CED744FF8B439F9BFF2F0E65E6FF251E
-:10051000213BFF57E1773A33F0FFD74299F97F69E2
-:1005200026BC7C017E6F0A65E0CBEAD3C4F78F045A
-:10053000BE7FF405F1BD51F46FFBFCF86E1B01DFCB
-:10054000EB108FA781EF8D23E07B5388EC95470854
-:10055000FE901EA43876D72CD82B956484E376EBD6
-:10056000385E9D8FC3F0FE81C4E87EFE9FBB62991A
-:10057000BE4FC3FAFD83157EB3DF9C90B8270DFAFA
-:10058000F5E89FDFF5E520C5FB997EBC27F497953C
-:10059000FB0F8632C8FDF93297431F6FD9DB89FA0A
-:1005A000FE0B8CFF58263A5B2DE03E955D7058D0CF
-:1005B000075BF7E3A1BCE1F2AF47FC9ECA3DE1C493
-:1005C000C110F957FD0B515EEDFC568E84F1A82247
-:1005D000232DA19FF073A1C72A433ABFCF20FAED84
-:1005E00054D312E6B3EC6CD624BC6F6419EF97A118
-:1005F00019238FE78483C1D7172279673C8FFDE6E3
-:100600000CD9819FC94E6ACC367E1B22BB2DFE0AB7
-:10061000C9ED33EC72DB5C871CEFA6BC17DFECCCBA
-:10062000BFF7F2F3A02AECBFF86B56F97F34A409A8
-:100630003F948FF759F50F83EF9D10D72BFF8DA5B2
-:10064000133E275E4E056711EA793EDE4799F49422
-:10065000733CD36F35F7C98D3AC912D7718707ED4F
-:100660005E5718E549874CF790160979B26876B657
-:10067000B0DB353F8E7F978893DFB5E2F66A3CEFBB
-:10068000EEB959AB4014143471BDA7AF184FF14FF8
-:100690002D2CD9CE93CD72B0BFBB770A7E9F9CCD57
-:1006A0001BC179CF9D0769F41BB3D06EA078844637
-:1006B000BFF795E3E98E62FC74A3D4DDB81CF5EABC
-:1006C000C220BF57125D728AEFBCF1F893B96E88F1
-:1006D000569DA27D1BB5D702DDF49D8CD36EEFE94C
-:1006E0006ECC945F32232C9B788D8D8AD76884E200
-:1006F0005A267E87CFC3F7AF3ADE2C21BE435592F0
-:100700008657AF428C4ED05E924BFB289FE92B550B
-:100710009C5E80F925A37F67A3D3B4D7CE0BE77D7A
-:1007200071B8CC7623CF27DA39EE2BE0B917C5673D
-:10073000835C8E5143567FEF706EC6B8BF596E68AA
-:10074000D58A549775FC148F430EE64FC7A2686F85
-:10075000B500A747887AC90EA3EFB95BF6F39A30C4
-:10076000CF73DE99155F1E26F862F4FD42D0B4D334
-:100770005A0FEB772DEE2BA8AC5FE8F4FB8D5C9A5B
-:10078000BF7317D3E396EFA599FC3A369104FC1E8C
-:100790008DBF1C3489ED7F24649E13723AB8336890
-:1007A000D69374481E2FEDE679F9BA49275CAE68F6
-:1007B000815E43AE00D81EAEBF203A858D579A8821
-:1007C000E2A7F759FD2995E42FAF03D43F7588F4CC
-:1007D0008576A614637A4AAD7BEAF038E057A5C85F
-:1007E000CFAD7B8AE4DD601DD298CFDCE31FAC1B6C
-:1007F000DE28AB970CD69358DF29F4E4F670DD536E
-:10080000EDC4FFF13BACFC512DE8F02F4D7F3D7A5C
-:10081000BB86F70C925195ECAA8D0E7AF8E7B09B47
-:10082000F05FA525EE477A5874F3808A5757BCC508
-:100830009110F2C384E80749FCCEDE8479224DB5DD
-:10084000947FCFA127BA96F8B207F705785A02C667
-:100850002787F62795797FCA52B43F7E9DBF97B10F
-:100860004EFE368FBF05CA383F6B1E1EDFDB27E406
-:10087000C9536145945CBE6645DBC99FF2D6C91475
-:100880003FCEAA936D7A837E298FDAAB367AEBCF8F
-:10089000491C0C5BE523A4E3656C1DFE29911C3CFF
-:1008A0007FA92E53D7A2BFFD7D61FFB17DBA97E42A
-:1008B0004545C49FE0FBF64CC67D137839D5BEBDD7
-:1008C000D89A88D5BA46DEB74B2FE3F9F4CEE7BF06
-:1008D000137838DEF89FDF437659E91DA0EF7E7765
-:1008E00095B6511CD68CBB7AF656A70BF5A17CC0E9
-:1008F0007581F03C2C9DF3BEF8C9DF6B744FE42387
-:100900004FC6F324258BE3F9486B23F5631B4CBFDB
-:10091000D372052E85E7B1D9EEF199F7112E074E66
-:100920000C4BE2CBBE82726879A342DF77B802EC4F
-:10093000F914979B795F2D667E1CCFFB4A40F60227
-:1009400064C36549C7EF4C406C01DEB71FF6FB136B
-:10095000E27CEBEB8EBC89AF362E8BD58A76EFD35B
-:10096000FF5384BF253A97BF4B62FC3B3F97C42F90
-:100970008BD55ACEA35FFA54C99837191FC4473C88
-:10098000563B69383E96C725B7A69F1A2FA78B8777
-:10099000656AC5823C7D381E9CEB6718DB8A78FE51
-:1009A0003AC333DA9D23E183B5A3FD78E932857E2E
-:1009B00077668152EFC273902B1B243A6362F80D65
-:1009C0008BBCB8FAF32DF03AF1E8C4D7954F00DDAF
-:1009D0001BB8F2BB218AB7BD60E2277D2E9D5F98D0
-:1009E000E72796751EE3F95B1AAD73F1EC8A5FE0B9
-:1009F000F71512ED4CDAF2F5DACE019733CCE3BD00
-:100A000005B6EE6323ECBBED3CD0099F137E9FD06F
-:100A10002BCE733150D3E5A807CFCF12E763D32095
-:100A200026CEC7B2281DB734B3BC757E97CEA4B30B
-:100A30002B5A1A06E7C5F125480CD635BCAFF5B4DC
-:100A4000B2F512F6F73551FEFB87F1CB723BF0DDC4
-:100A500022307F97C8A0F3A62B04FE1A98C787BF41
-:100A600099762E134E78AEB7C8F0E941CB3ADFEB5A
-:100A700096EAC43DAAAC2553B15F72BF326D38BC53
-:100A80006BA2FC770E191D7E60A543DF24FEFD5985
-:100A9000275E4C7C350DE165DA67C1CBEF5171E61D
-:100AA000D1790DD9B9039297EEC39BE738ECAF49E2
-:100AB00037139DB764150B3B80AFDBFCCE1740337B
-:100AC000D9F74BC57DACA32E687C38C8CF752A2DCD
-:100AD00072EB3B39D5B76459FC63F35CC7FCAE9449
-:100AE00049CF977B836985D3A1EDBB5143794C09ED
-:100AF000CA6352B256E8888F2E7C3587EC9EAE2CA6
-:100B0000F49F03FCBCCAF7F4A35D97E843FBB7E985
-:100B1000AAC7BA67B0BAFFEBBF4ED2A07A0EE12DDA
-:100B200024F6AD5AEC9B099FBF9C3FB7EC1F8F9FEB
-:100B30009589F899D8C791F484B98FE6BEA11D852F
-:100B4000F4EB2B53FF9CE9F7FAE050D500F2692251
-:100B5000AA520E5D427AAD83BEC705FA4E3C7FBFF6
-:100B6000A2C565FB9DA604DED3C7F61B7DC22F89F7
-:100B700051FFE5F9BC3F9471BB7190EE93ACBF257A
-:100B80000F08BCE131B86FFDAC2FE689B1F1C6A00A
-:100B9000BE872ECB3C25C3E71D713C473F65F0DC8B
-:100BA00024168B59E4F5BE2C6EDFBE17ADEA9533E3
-:100BB000C45FCC72B937B748B5E4871DCBF736664A
-:100BC000FA7EA939DEE0F7E506EDC481A70ECD1B5C
-:100BD000B2133777BC65B713936F7D213BB1FFB676
-:100BE000B79E6A67FDFFF43B0FE9ABF7EAFCB40F71
-:100BF000B92DE7C17FE07D5B157F0390EC7BFA3E6A
-:100C00008EB7A590D623A90C73F83B627A4C427C30
-:100C1000BF891FF3C5B88A0EE910032E578D498886
-:100C2000AFDB853FCAE86C8AF53BAE6F66713BC3AC
-:100C30009CC7E38524DE3336C76574D04679A5F5B5
-:100C4000407AC43C8735F9D91CE74496DD0F3E0D48
-:100C5000FE3D91897F9F959BFFFD16B45F9F5128B4
-:100C60001FF46FA337D1F34B5BAEA4F2B2966BF9CE
-:100C7000BC62BE6F4A8993384E5FE3AFFFF64646CB
-:100C8000AFABF77AE85ED9CA6FBE792BF2A7B7850A
-:100C9000ED3B6BFFBFCC8E383800800000000000B9
-:100CA0001F8B080000000000000BE57D0B7C54C585
-:100CB000B9F89C3DFB4AB2BBD9DDBC96BC38E11902
-:100CC00025C44D801010EB86575109049F51026CCA
-:100CD0000884008104A4BAAD1436246040ACF155F8
-:100CE000F1AA7451ACB657BD4169E5B6D16E442D39
-:100CF000540AB1BED00A06A516154DE45156ABE50F
-:100D0000CEF7CD4C72CEC92E84DAFBFBF7FEFEF196
-:100D1000D77ECC9939F3F8DEF3CD37676F5C587521
-:100D2000FF986442CC430D4E8910D29C45CA5B6D3E
-:100D3000B4DC209501DCA898A7EDA4B0CE5132D246
-:100D4000398690B3F0773994276399781C0652441A
-:100D5000C84A2BFDB742C89943B77BE6D3FEE26D84
-:100D6000362F7D42FBC9B9CB40CB64AF4C1EA740A8
-:100D70004E20F3CAF228B43038D069242405A001EB
-:100D8000611A40DAAF3542679304EDBCDE7A3ABEB1
-:100D9000D518244E8011233E374B747E79BDF31154
-:100DA00050F4678DC8848C82F1F4EF9BF139AC0B61
-:100DB000DE9793D83CC4FBB9F0FE1880621E096C24
-:100DC0001E49FA7E1CECB94CEA014FFA7934254EE3
-:100DD000CA73A6009E7C230112D2692AB31332D7AC
-:100DE000F68783523E85565B58A690044CC73B73EA
-:100DF00009FE9D1D04FF5FE1FC78042112E994CEF9
-:100E0000D2A1677C23850752FCC595C8A17539140A
-:100E10004ACED2D1A369B3129317F0D93124D93E67
-:100E20004835FEE540453AEFD78D4E3BCCB36C8A52
-:100E30005C16CAC3EE53AE857EA654156D62C359C7
-:100E4000492A21F3D8BFC9EBCAF6E641B43E1834AB
-:100E50007987523ACEB3064330BF79C418ECB462F6
-:100E600013E9AC84503116F1F7E87CE74D967D71BB
-:100E70000E4D3B7296CE9334919787D0FEE74A7C15
-:100E800080202DD3F70EF3E207934F5E07CBE824C3
-:100E90004EF320DA7E6E67E574928F5536E0A785B3
-:100EA000BCDDBC80E9684FBFF47F95416D797E71F0
-:100EB000C1AB940C142FA169A381CF2E32209F5572
-:100EC000356BDB2D7CFF8A4F8803FA351EEDC13769
-:100ED000CC93DCCDF8654AA353A1781AED54B03C0D
-:100EE00063F24793092DCF24E43AE877E664D919F1
-:100EF000A6AD37070CC44727BEDF278724BAB6FD47
-:100F0000B99D7B2F07BC159B94C761ADB9E4CE6B2F
-:100F100092A17E9413F05C06CF06607B42A09DC731
-:100F20001A1A4A9F75F83EB255A9F86E7FF1471715
-:100F3000F929BDB61A484D347E22A401E9FAF28F90
-:100F4000E2B19F0FEE9342163AFF29F2377F1C4B16
-:100F5000E753F56393D7A2E0B20C40D7E95E268F42
-:100F600084F86C53283EE71256FE88941585E9F8FC
-:100F70005505874A2CB49FAAF512CAA9C03FC5F7E8
-:100F8000876ABCF9EBCB12C30AE25DF39C76660676
-:100F90007EA678FE30069E3F54E339F0FEBB235F09
-:100FA00056B5BBDB694F063E2785A4F02C45CD69BD
-:100FB00032217114E9BB6E01CFAC3D38F2E5A1845A
-:100FC000DC477C5B50EF904E63D9484A2723F145BC
-:100FD000D303A50E260753E4E3489F13C5B202F8D6
-:100FE000DA1FF8D446398CECFF469E0678263E4A36
-:100FF000EC71BDEF3DE334E37B5BCDC40778DE9A53
-:101000006E0D35D0AEDA7F74715A27D247796002FF
-:10101000D0F10F26F2B8127BBEF6804C8650C62C5B
-:101020000D480805FD0606E28871944A5F91E8F3D1
-:10103000FF1DC8319D5ACA6A6250E8B8AE20F185DA
-:10104000A2F08568B7CCDA3DD548B07DD845E7B782
-:101050005C318424BADE0289F1B3D554EFCBA04DC4
-:101060008D6DB3821904E621E33C143A3F239D5F62
-:101070004E2001CB8302490807075C08870432B081
-:101080007E686030C261811C7C3E3C3002CBB981FD
-:1010900051082F0A1420BC387029C2118149D82E5A
-:1010A0002F50827064E02A7C9E1FB806E12581598A
-:1010B00008BD81D9585F10A8425818A8C4E7A302F8
-:1010C0004BB13C3A703396C70456202C0ADC86702C
-:1010D0006CA0116171A001DB8D0BDC81E5F1817BDE
-:1010E000115E1AB81BE184C043580F0A08F010CFF4
-:1010F000E5F10E6581934A0A70B8027C1C4BEEFE46
-:10110000C1ED52B5D3F731F09D68673610BFBABD57
-:1011100068F735B71B2EA06B94FE4E73FDFC85F768
-:10112000C39F0E27BD746BF6349411B9975E969DDC
-:1011300025E10CFACFE5BB6611D00B243759C3A7C4
-:101140007DF5035BDF5FB8FEDA6AECF0C9C0BFF57E
-:10115000C41BA48F4A47BF2E413FDB14E3B4501495
-:101160007ECB7799705EA39D7E938BC2849CA32FC8
-:10117000833E991974FE7122F04B5EF21F26D2FE57
-:101180000636196004AA4A9CED13A9DE512613D431
-:101190008BDB084179DA16AFB5A7C35C0C1F84B4AA
-:1011A000EE1984F234A490D99FCE2B40BECC3F1AC6
-:1011B0004436E580BC852523ED2FB89290C785CDB8
-:1011C00080F61BE6FF1CEA7BFB33337FA199BC64EE
-:1011D000A513C9695126C65138788BEFA538FACACC
-:1011E000D0907F623C2D0F7F32F812C08B5A431390
-:1011F00013281CB12BFC1235A76464B873A28D961A
-:101200002FD94376035A0B3A9449765A1E75D0B7B4
-:101210009BB20119D3E99FE450603EA146079DCFE0
-:10122000D6C3C4DB40CBC5C75BE444A2A2BF99F8D8
-:1012300077A8E8621FDD313989FE337395B34086A4
-:10124000F78D9D71AEBCBEF4D906EB8675523BF2AC
-:10125000385D57A62F2C39557C72B54B1274280275
-:101260003ACC58DD6D84756E6B72DB917EF1CE12D7
-:1012700018B27B0A713EAA001F1B114FE6F583507E
-:10128000DE05DF51FC5E34CBAEC69B24F45A4D6BB9
-:101290005E6CFC5EFD6F86DF23C06D6362E3D70A80
-:1012A000BC32EEFC725CE5EA91E379AE31B1DB353C
-:1012B000BB983ED5E3799B81ECA1B68A8E4BF9941D
-:1012C000C91509D2A68D9CBFCF87D71FBB985DF9E2
-:1012D00077C1EB4D2EA62762E19528C9A82729BF23
-:1012E0005E4406C7D637D05F34FB758FAB8F9E3315
-:1012F00083BFD8ECA47A6E706C3D37D7C5E81D5318
-:101300007F713D63E67A5C8CF7334EB7038EB2474C
-:1013100080BEB6F58620C85909B1A35C104F32E7EC
-:1013200013673CF0C974D95902FA860C27E847279D
-:10133000E48582B04F1918540A6568064A19F09876
-:101340009E1BDA44BBCEA17E8691D29F761506689D
-:10135000559C86F974DD8942DE9C951EB5BC097BDF
-:10136000DF2B8F822FDCDB36E5307E9D45FD97C37A
-:101370007CDEBDFD48D86EC30FD3B76D52E9C16D99
-:101380001E0F9645FB58FCFB8DE0DFA675C40FF2DF
-:101390003121BADF70D02573BEEDF6019F07BF473C
-:1013A0009CE0CFB89A3E44FDE4A2FA4942FDC4C68F
-:1013B000CF0CC4FF3C48CBEFB852B17FC0E3F5F689
-:1013C000FF77FCFC948B30799AE06C9769FD406A5A
-:1013D000871490D30974EEA3015F66A4BB42181D65
-:1013E000950924047E2FC55BD800FAD7600F819D34
-:1013F000319B5B7C20CFC4ECC2F51F70F83F769D1B
-:1014000043DF3813940220EA99BBFF3ECD46F96FC3
-:10141000438E331ECAA76879B3878EEBEE24BCDCFB
-:101420006C43F9A17FE948C530DD1B807D14659FC1
-:1014300015DA0FEA2907A1BC157C92F1B47FD7D742
-:101440007B9A2862CA5DBED3301FCAD76700FA866E
-:10145000D30DEAE05E7E3E9F3F20E4B3579E9C059D
-:10146000429E2AF3501F4AEE94DEFE62F937BFE532
-:10147000FAD3ED6630967F23F8FE82FD1B3E5FE2D5
-:1014800056CEE9BFC4ED7D63CB765A5EE99195A354
-:10149000D4BFB3A7BFDD61A4652BF5373FA2658339
-:1014A000B5C308ED4AA984DA28BE7DD4C983FD8777
-:1014B00075342BC31FEC3F4EB448D398BE5612AFC1
-:1014C0001D792E3C86703D2B3D661C2F6EE89044A6
-:1014D000902B07E72B62944260C71DC54EE37CEC5E
-:1014E000AF935C4DFBBBC4CDEC82906BD05BCFE681
-:1014F000815E721B61BF6EB192A0DDDDDB3F941394
-:101500000B7BF513E1FBB89BF99EA9659D3771082C
-:10151000C8E97E16476959C3E4B2349384D6819EE4
-:10152000F011C549DBC711F1470597964DBC34FD55
-:101530006B89F8E8FCF77D2D23948690B09DEEF73B
-:101540004ABD5218F68166833504B6B424DD4ACC10
-:101550005076184216908F0F255CA7B9302104CA27
-:101560006F727A7162275DC7C97DBB6DFE28F4BFBB
-:10157000C15FE99D3C2A361E7BDACD79C509787CAE
-:10158000486972821F19F41831EEB0119AAAF4FA60
-:101590005C37F347A83F540E7C3A6341779319E8D0
-:1015A0009D938CFE1019E246BE1DE0D9B9B1044CE2
-:1015B000562DF34FD349A841ED5709FEEA74FBE7D6
-:1015C000BBE93C1EE276848A65C73088575D94EC9F
-:1015D00006BFB4A42EBD0DFCDD07D712EF0213EA3F
-:1015E00083EB605C5F526B01F0EF43DE9DBFB80B95
-:1015F000F069A1FB62D0E3A30ED9144AAF8A31BBD4
-:1016000053603D7FD4CD5FC08AC01AC48B7E1FBC9F
-:10161000D2CDF7C1F9241FF6C127BDD7248691B7D3
-:1016200092A2CA7745E036EC47EC87DF3785B39C5A
-:1016300051E5508B6F317E85C4F6B5C42431FDC7AA
-:10164000ED28D52F4DA8074204EDA6CF223D0AF67E
-:10165000E6A4779417EC762C7D23E643F138B4CCDE
-:101660001EA55E2265D1F4C45637F30F2A4C74BF11
-:1016700040EBA51563EA615E15769B047C27DA6D65
-:10168000E2ED043F8B78959CF8CD18A03FC407A3EA
-:10169000AD7F1E319E52C7A33681ACA5307C79A3A5
-:1016A000F82BB1F075D0D4520AF33AB850260DB4E5
-:1016B0009F93FEB16924CAFB02BE077C43E9B22AAC
-:1016C000898DD743CF21D1F177706D8D77B2A997EE
-:1016D0009E7DEA2BE3CAC17E97031E55E31E70333D
-:1016E0003B7F8C4362F12B4E5A6F9E7FBF938C04DD
-:1016F0003D756A4CD00E71B1EE5F3500BD7F6CC791
-:10170000784579E5E9310D2355F82C266824E7ED75
-:101710007ED0A9D0E7E5439B5282B6D8783C0678C4
-:10172000A478BA031E8CC378CC1FDC17108F2179E4
-:101730006EE437B23BCE1B8678E45BB217FC06182A
-:10174000D78FFA93C5935739D9BCE2747E5E79601E
-:10175000B946BF244424124A52958DAD189F4D8836
-:1017600018F1B95EDE9ED2C99BC07F2C7A0AFCEBD1
-:101770009FFF9EF3E5C1CAC50AC40DCDF1D1FDE0BE
-:10178000EC2449C3576FAFF56BC67BE75B59B35F7A
-:1017900016F0EFBCFF93FE716910AF2A370787F68A
-:1017A00047CE057EDEFEE60127F41BF79525AAFC51
-:1017B0009DE2F689DAD3E6EB14953DBD516E02BC8D
-:1017C0002718B97ED3C99D0FEC2AC5E7E56057E914
-:1017D0001413CE6357E791603BC491F5E30B7BAAEA
-:1017E000E72F615FF574137CE049A2F44BE8A59FF5
-:1017F000881BC6922F21579D5CFEF5F8D7C31BCCE2
-:101800005ABF47C0CFB99C9DF4C79120D58F379759
-:10181000C82122217FA07D3C78BF84FE66B8D28299
-:1018200076B9AA320EE3B3550532D657DD29A3FDAA
-:101830000C53FD504BE7F347AE27F4F1D912227950
-:1018400027ABD63D63749CA67CE3C27BFFB816E24F
-:10185000CBC52605C6DBAFB07873D027A3FF4AFB04
-:10186000F086213E7DDF655EB067821FF6FB6494E3
-:10187000B7E09BB21786EDE0F1E8FDCD052119E850
-:101880002CF97BC6510643FF550AD0E15DCF1627E0
-:10189000E8BBB86F1F282BC3FDA35F2940BB499D40
-:1018A000553AEF382EA793D28BAF073BFEC1661394
-:1018B00081B8D107AB4FA23C77AEADF74E1EDA1B15
-:1018C0005F16F1617D9C591F5FEE1357D6C59305D6
-:1018D0003FE8F9A422067F087D158B3FA81EAB4A7E
-:1018E0004AB9703D26F4C77B7C9D93D2B7DCD940C2
-:1018F000F190B040463C08BE7CF79BDB1F013D1CCD
-:1019000047F9631DF0F3B74FBC02FB10B2588A1AB7
-:1019100047DEDE63F7285D727BE972A37F714F19A2
-:10192000C47F76CD8A9E32AC5F6F5762EBB573EBA6
-:10193000AD61492C5EA1B73B7A79F857DB9DF2CABD
-:10194000FB73E1FDF2CA8521801BD3AD35A07FF585
-:101950007A426F27C47CF4F34C88C824344A3D6F24
-:1019600005DBF5DA0933D607AC8E7C70D6CFC431EF
-:1019700018042710FCD2C371A1461CAFFE92329C02
-:101980007FFD588001E2ED0CC2FA3CF1183F68C9B6
-:1019900064EDE52BE2993F3EDA8DEB9485437ECAF8
-:1019A00085E546BE86516EFF734914BF8D3E431CCC
-:1019B0009C2B4CB21BF742C8A565A28158482F9EAC
-:1019C00084FF4E203240D78B7512EC3B0BACE6C146
-:1019D000E89FFE16FA216BE8BE90F2FBBE7DF2CEC8
-:1019E0006D7489FBBCA312A3F9E702CEF1FC10F5DC
-:1019F000C2F5812A84877EF04E36C8EB2D92FF55C2
-:101A000090838EF2AA3BE15CB86E978CE74A736EC6
-:101A1000797718DBA769CF2765873517E2288D52BC
-:101A2000BC17F488C063BBDD8CFAA5F110D3838D9D
-:101A300047245E66FB889779FDC9F7EDB8CF10782B
-:101A4000A7EB790BC6F7DDEBC2F5887DC677584F5B
-:101A500027E027F67A329DA82F80AFE4DEF9CB7617
-:101A600023AEAB8BC47B61FE011E0F22EFC7A1DF4B
-:101A70002CE85BC7F94FD07739A76F57DBE99F5C3C
-:101A80004ADBB7F8DC78CA2067115C6FD7FB09C85E
-:101A90001F62BD940F4EC1FC76B7313BD172D8CED8
-:101AA000F0652FCA85F909FFDA99C4FC64FDBA2BE9
-:101AB000C43E9DFB19E0DF429C62917BE2D9A431D8
-:101AC00051DA73BF96E2D9904CEB4B9CE45488F406
-:101AD000E2598C23C615EF3992B57E4C058F2BBC8D
-:101AE0006F22E5104F84710B55F35BE32E7124A731
-:101AF000F41DF73BD07140F239F9524BC73AA3AD10
-:101B0000594A243DFB620CA5297DE55C2F67525B99
-:101B1000FB57703EAF97FF33867A22D17E6F95FDDB
-:101B200007DD1436FA49A765705F79389F1EA1F466
-:101B30002E484EE9AB4FFA4BE709C952CF3E86D348
-:101B400079427214BD27F03DDC5DF63DA887F5674C
-:101B500014E23ECF0774073D611E84E3215F76BB2C
-:101B600048E851DA2889C751C47C202E1147DF9BF1
-:101B7000999C83E34A461234D17252AE5702BDDFBC
-:101B80000F3E98F92FE6839B92CF29CF61F44B96B5
-:101B9000717A2F1379163BCF9D67D10FBAD5C03A12
-:101BA000CE18BCDDFE9C0BA7DBCDC97DE4F3E6E4DB
-:101BB00073C8E770B7FF1618AFD14C4EA11F5E5C1B
-:101BC000E981F10E387C9F24D2E72F36707D924355
-:101BD000E946EB5F4996515FDD432E463DFC3D8370
-:101BE00001E7DF45F5EFA339D1F83E6874D3F7CFAD
-:101BF0005C4DF03C8EAE6F3DE3CBA004CF6F9D47B4
-:101C00000CF0DCA33410C305E8A196BEFCD9722EFB
-:101C1000FEA47AE85EA8A7FCB80AF8D1AA388DE736
-:101C2000D2433F4BD6DAF97EF0DFCFD478FE17F0FF
-:101C3000DF2FCFCD7F17CC57CF45D307828FC5BEBF
-:101C40002056BE10954792E1EE3B2E215E3C0F2BB5
-:101C5000715899DDDD21A19D6D3C52E0C7B2DD8A4E
-:101C60004A41D8E1133B59BD3C31BA3FD896EC66A6
-:101C70007906AD2BBC464D1E48109FDFE53BE11CAD
-:101C800042F5E254D986EB4B2A65F143B17EAA674F
-:101C9000A74F49E57153BA9EA42C868724EA0FC04A
-:101CA000399A83EF0F128B8D1ABF5FE0ED56B94C56
-:101CB00082B8B72B9940DA0DF5EB570F87F37B9776
-:101CC0004FDB3E856CFE52C64108CA839BDA6F88A3
-:101CD00063254DD3B5837D483EB4573DCFE9BB9FC7
-:101CE000F83899EF27CCC4037685C815E7E41BD5EF
-:101CF0007EE2F3E47EC4454E261BF8798AD67EB593
-:101D0000C691A871818614BE2F38E542FF57E6764A
-:101D10006B72670EE6A7ACB42B182F9065AF757A7F
-:101D20004EDFF75D3E035154EB4B9A164F14D5FE30
-:101D300021A5CCAD29A795A76BDA0FF00FD2D467F8
-:101D4000D45CACA9CFAA2FD4940706C66BDAE750AF
-:101D500001509707375FA9693FB4E56A4D79F89656
-:101D60009B34ED2F0ACDD7D48F787289A67E64EB91
-:101D70004A4DF9925D3FD2B46FE4715F3D5E2673C8
-:101D8000BC361A99DE69B015623CB2D1A68D4766A1
-:101D9000F37625891372210EDEF861412EE0FB6592
-:101DA000C7788C8BC7E20BBD1E8BA53FF5CF2F4BA1
-:101DB00061FAEE8B97CC069083E5BBA9BC5E42CB63
-:101DC000B6F736C09A9AF3D879AA91B0FC1E71BEC4
-:101DD00022DEEF395F317A597CD561239BA2F04531
-:101DE000768A1235FE29F82816DE1AFA89B7297C78
-:101DF0001DDF156FEF4B2C3F55ADFF774499D79AF8
-:101E00001416DFA2F6655E0AF37746C7A327EE44F1
-:101E100079BC50FD2FE641F5FF9214F443DF98732F
-:101E20002BE8FF9D162FECC9BE287FA3FA0105DA27
-:101E300057B3F6066F2ED02556FC7B4D4A9FF87798
-:101E40000D8B7FC76BF0562BE45D17876B747C8D11
-:101E5000F1EF46B337B73FF1EF5AD031294007C60B
-:101E60001F3DF4E5F1F358FBA000217B25D8F7D8FE
-:101E70008C0A9C739D6F5F4BF7B3B9709EDA02FBBF
-:101E800026D53E87EE6FF9FE260EED02B57BF7A64E
-:101E9000A0DE237B15FAFC0CDDF76E52A028EC9F28
-:101EA0004FE3975B88D76A96919E0FA6E07E97AC2A
-:101EB0008A93215E16DE3721E73BD9F3ED291760BF
-:101EC000CFC9F9CFE5D0EE94D2F5AF8BE277E9CF69
-:101ED000E17AFC6FF0D3243C8F433CADA77611CE62
-:101EE000E3DA53987D5E7F88ED93D71F99E541B97A
-:101EF00049293AE7395C7FF5CDAB297DFCD25753B0
-:101F0000CEE1978AF5AFE4FBDE29725E2BC41B4F4E
-:101F100044CC883799B0FCC8BA3D2612427AB23C0C
-:101F200063414753644307D86713D1E7152B89B042
-:101F30006ED31E19F5134966F541626D003F27B156
-:101F4000586BB75C3EADDD4A9AE6D6D931ADDD4A75
-:101F50002BD7DAAD017EADDDCAA829D4D931ADDDEC
-:101F60001A1898A8B3635ABB35B8F96A9D1DD3DA1D
-:101F7000ADE15BB476EBA290D66E8D7872A5CE8E75
-:101F800069EDD625BBD669EA0BC29B34F5A3F6DC16
-:101F9000A3298FE9F80F4DFB457B9FC3FC9BB1073D
-:101FA0001FD5B41BD7F94B4D3B8AF00EC8D35E80CA
-:101FB0002421E4D263CF6AEA17703FEDB2EEDF6806
-:101FC000FA212D2CDF3A48FF037AFD95F8CDE09CED
-:101FD0001849F7AB1994AECB4392374C9B2DDEB525
-:101FE000A308E6F1D9E12BF6403F8BB668F3B417AE
-:101FF00087B4E53A322811F4431DE58B10E593A52B
-:1020000090BFADD26B4B49BD03F321FAC9678BF684
-:102010005E4330EF33E8EB80FC74B14EC16F3ECECF
-:102020006F627E62BD4BA9DF17567AD7E9A3FFB175
-:102030007D64A719F8B67A9744FE43EABB9E9AB628
-:10204000BB37644459977E1D7ABF734CAA368E3DC8
-:1020500045B6615CFFC49BB297C507B572B8722FD5
-:102060008BE7AF7C5AC2F89A1E1FC22F8D85173995
-:10207000C8F60975C9241452C99FC2F161F168E517
-:10208000EF04FC03E6F3B01C82BCA038255ECF6FE2
-:102090004561D217CF09B95A39D5E3D9EE4D8FCA68
-:1020A000570AFD0FE6514DD8B9949EAFF4785FBE44
-:1020B000EB6E33E8C50BC5FB8254EDF9A0383F2821
-:1020C000A1AB3547C9831378A5FBF225A929B1F740
-:1020D000ADB7A45EF0BEF596D47FEDBEB521F51C7C
-:1020E000F1B32E889751BF521F2FEB1B1FDBFD95BD
-:1020F000E4C038348B7FF9BD5696AFA2B393B91EB6
-:102100008D9DECD9F77E28851A69E7F50E5F0BAC3B
-:102110006F85C37737C0990EDF3DA92AFC3452BCC6
-:10212000E0FD1C6AA77644F10FF7A50ABFA80CE3EF
-:1021300022EB4B587B7DBB5FA7B2FB40ED29451ED0
-:10214000F43B8F1430FB692F3AA7DF79173FCFB9E3
-:1021500003CE0B87F6E6F1DCC9CF55A8D8F9806E1F
-:10216000EB4D651E759EEF83A92E1CCF31EED90E67
-:10217000C8776E741A9C9202FEB301CF459B7CB661
-:10218000693BF3D87BC99AF7D8BD2319F00DFEBC83
-:10219000CDF8B59A6FF7515C42BFB1D6B92F95F91A
-:1021A000BB26E2B382DE15E7B9A60F0BACA06F8D9C
-:1021B00092D7192D8FD3C4F3A426F2F35CD9C9CEDC
-:1021C000777BE4FC3C7952373BFCAFA9F9549CEB9C
-:1021D000CE76F8F6C1F380316801FF32608DBEFF24
-:1021E000FD13A7E35DB03EA4A70DF908C797FB1543
-:1021F0003FF9732AC6E58298AF78ABEC3D06F1B99A
-:10220000FEC6AB3E4EED13AFFA58CD877AF9A3FE6A
-:10221000E72789908797986EC4ED84D19B0BFCDFEC
-:102220000CFF1E87F1D5CF61DD7DF24F1537CFA7AB
-:1022300055CE994F2BFA2977F94EA5B2BCBFBFA551
-:10224000B2BCBF2659D58FE33CFD503CE5D6DBFA46
-:10225000853F396D0CC6358FB160C285C5351D69A6
-:102260007DFC4747DA39FCC733878627C279B288B5
-:102270005BE9DB59034999EAFB31CD2EEDF81B0AE6
-:102280005979001F777922E3FB91698C8E220F50D8
-:10229000C4ADADD3890FEE3BDCC3F3B3453F23D3CD
-:1022A000ECD83ED53D71645A0A9CA749B8AFDCE032
-:1022B0009234FBCB4F524B46C27A86F3FE47A6318F
-:1022C0003EDD3688C567F479902778FB13A9131192
-:1022D00052825D04F834CB72543C16A6B1F97F9259
-:1022E000C8E45BC4CFAAEE67F7BB44DC4CC4010969
-:1022F000F1BE9D40F5CA479B4D04E25A0B65DB06D3
-:10230000E0C39EFB73FC5CDD49FF037B5999578654
-:10231000F947DFF5FE16E033C1DDD75E5E99D6E3FF
-:10232000A7782FF01ED7ACB40B386FEF8C677CDB2F
-:102330006DB7613C5BDF6E29E787CD3C4E01FA1A31
-:10234000EC865B26F5D1ECC7528EF733872C3EF432
-:1023500063A6C5633E8738FF3052FE4C74631A781B
-:1023600010A035909109F7897ACE3F1482EF25D9D4
-:102370006CF89E5121613B5C09357A25C82FEB34FE
-:1023800077AE4F83F95E2679E1FE405A85B33D2D45
-:1023900019EE112A28661B7288A318EA0B0C58EF55
-:1023A000BAD6B9C10479D70A81936C62A2E3D8E99D
-:1023B00038F7A6E5B07505AF694FA3ED12956E32FB
-:1023C000280FF48873AA07E4B89CE5AFEBD7D7C40D
-:1023D000F9D5B69EEE1B001F4AF43CF0A63483C824
-:1023E0009B6F047E2D51C84E762F8AE5A1429A3507
-:1023F000E60B7A59BE7402E41B0D667A06EA7FEAA0
-:102400009AB411DE13F225737C03DFABF3E1EFE541
-:10241000E324E9E453E0930ED000F910C6E904F98F
-:102420007A6645F4F93EC3E9BCCA51F620F0CFCC38
-:10243000090D98E74EBE397B562E02A797C9097D34
-:102440009F401C222E99E9DF3845417D4C9C12E6C5
-:10245000995A156F0D94E36CE39D32D83D0B3F2FD5
-:102460005C6020462A6F93783FBE72227D9CCBE24F
-:10247000AC4CBF1AC9C7422E648E9C22B09FEC8F11
-:10248000FA459B13E87A26D9F6E13962DC90FA1214
-:10249000B857F0CA3CD6C73D31F2F63FE17ACC2DB1
-:1024A000FB3D06F0E9837F79EDE50948E78BE1869E
-:1024B000E61DA6CED7F65CC6E3E7982FDEF99A2F85
-:1024C000EF9FCF2F7F2DADF3B5A6BCEFC2FF5E0906
-:1024D000F4F82794B160DE7AFE17FAECA0EC3F78AE
-:1024E0001BC5FF7594A90285008DA402E9CDF28772
-:1024F000AEE5780E7E4DF16CEDC5F3756D7B117F09
-:10250000074D74DE747CD344866AD38F12793E46BD
-:1025100008C7BDDEDA3205FC9B2E73773E8CDBF5F7
-:10252000C23B5941AA4F0EFDF8A49D50FEFBC0D8F6
-:102530006D87E7C756BF61F751BC1F5A2DE3FD37C2
-:10254000BC97ACCA07FA9CCBCB959EB2A3C057F3FD
-:10255000D67E5BA4F6B3492005EDEEE2900C777CC5
-:102560007BF4DFD2271338D3B1F2B2D6244D59D839
-:10257000E36596E8F7C40779985C2C7E6A9B19F2AC
-:10258000E1AFF4F8FF06E31FE3F906C776DA717FDF
-:1025900025E633FFA90233EC273F68B39030F0BD46
-:1025A000B1C344304EE59B2E51BEF5733ED4CFF3FC
-:1025B000D51713B0BF85F7CB1847AAA46305285ECB
-:1025C000FD6D8BD9FE56B78E858794A9A0AF166E88
-:1025D00094485061ED5753BAF903B7E3F98A7E9DE9
-:1025E0007AFB729AAC36831ED1DB9705C4DB3C01C3
-:1025F000EC568BF6F9A2B63BB0DF45E7398FF178A0
-:10260000F8FEAC888C3D3B18E2CC83305F3096BD41
-:1026100039B69609E5A76BAD088FAF75223C0ACA9B
-:1026200094E279E9AEF6573350AC3B8AC00EC5ED63
-:102630009D64BD89F4FACFC66DD7841F52802FB533
-:10264000F990151CCFC27F5EC4EF199CCF7FAE807E
-:10265000759E231FB2A29FF99027F68CB2C2F3F1A8
-:10266000021F63293ED0FEE61D50C8F9ED6F2CBC59
-:10267000C47A6F197CE7200A9E85DC1CE5FA7DC1CF
-:10268000F6591BD2E9041A5FF86B7627F2258B43C3
-:1026900088732AD9B3A103D62F135DFC2F48DE24FB
-:1026A0002AFED5F3E722E26576C7C6DEB3F2B84468
-:1026B0000F5FB6DD8978157C04370A0C1E80618FA8
-:1026C000A1B8EF7703FA7C1FA0455BFEC2D4990D39
-:1026D0007A63912E5EF085147DFF35DD3388AD5F22
-:1026E000F14D85BC8885A46C038BABB7A09E3A6680
-:1026F0006C79F53690E7ED4C9E963DFFF4AF414F77
-:102700002DF9AFFB1DA0A73E31B6A4C278B58FAF9F
-:1027100077805E3F660C3AE0FD4F4272D4FBBA4FC1
-:10272000787ACE056C9017B61C590C042C3803F43B
-:10273000E4DF1E3739218E5AF7A4256CA1F858BE64
-:1027400093E191968FB0F2ED88AFBA5D5A395CF2A1
-:10275000C4FDA90AEEE783191C7F19A0AA976F3759
-:1027600061FEE8F237652F0C5347BA717DFAF761C5
-:102770001E114AB7BA56B9D29CD8B79E7A3C669019
-:10278000B3BA9D8C4E753A3FB386EB653DBF3FE0D3
-:10279000E17E26E7738A178C87897C561262FAB924
-:1027A000F1170FE41FA1F33ABEFD358794D7CBEFA5
-:1027B00004B22EC12F6FAD9A077906B1F8FC0B2E2B
-:1027C000173D7A9FDB1965179D18F8FE6D0CD69A98
-:1027D000C28E4B293E6AB799BC41FAB8F669D967EF
-:1027E000033FE95D0B7EDF61E9D3AFBC3D9ECE6F59
-:1027F000E90E53F274B60C1BE86741A73AE0EFC24A
-:102800005EBA2C79EE1533E441C2F3D5EE5EFA2CB4
-:10281000DDD16E86BC4A3D1E27B5B69B997CE9E8A2
-:10282000D47A642AD8E5C65F9C31031F7CF2A244A7
-:10283000C085D4BF5FB3ED1507E80FC013D80F41B3
-:10284000AF1EFAF5A15B78C66F46633B279CD3C4E5
-:10285000A25F00E63206F9FB99DFD0F16BDEB378B8
-:1028600061FD35CFDCEC8075FCD558CFF8FC91F5D7
-:10287000A9608F6B4CC1542742F6BC66EB0F90FFEA
-:1028800016BDFE8354827AD33700E497AE7300AC52
-:102890006FE1C3D7E1FAAA891FF9AFE611B90CFCC1
-:1028A000C4D346322D9A9FAF0C60FAE9AF8F5A70AD
-:1028B00053F0573361DFE1F893CCF2F8C80AF443E0
-:1028C0007EC0D74A3531964F5B199D4E79C4FD7550
-:1028D000A6C7EA78ABBAEDB7A31EFB34CB9706F2D6
-:1028E0004EF1A08DA7BE3E258DEB3FFC5E0ABE4794
-:1028F000F96E123C87F61D265F5CBEE63D9ED7CA88
-:10290000C65FC5C7A7F38E87B8DC5F53B5FB570119
-:10291000670C107A807410357FC592FBED1B91AF68
-:102920004EBDC9F4CAF2D0AC6958DF610AA7417D37
-:10293000A8FD5A09F502F52FA2C9F57613976B6D1C
-:102940003D9DA75152E3F745762FAEFA3EDA4EE5AC
-:1029500087F4F28DB9F7794EAF7C8AFC8A453AFF4D
-:102960004C40BD5E481FA0B57FE27DF2704AD47B2B
-:1029700058BDFA20887C516B0AFDFC3F408EDFB5C4
-:10298000E03DC3DAA74DF8BD9CCF9EDAFDF64D942D
-:10299000DF3F6B15F2ABD5B37AF9AD79F63A124D4C
-:1029A0007E3F4B2E2351E5973E8F2ABFC92C7FFFD8
-:1029B0007F5BCF2E8AA167270FD0EA59EA4F245EAA
-:1029C0004A8B9FFE72E940DC67E9F02AF0A9D79BA9
-:1029D000873C0AE257AF37E9DF9B448547813FC117
-:1029E000974BFE73198ED3C3BF823F05FFF6F0A746
-:1029F0007EBD5A3CEAEBE3E0CE514A2FDD4DEBE8D9
-:102A0000FE1ACE5D5F90F1DCB54BE976B8212ECB96
-:102A1000F36EBA9CBCEC62E5EE14F306D01FE279CB
-:102A2000771CCB43E82AEB76B8547EFD9136D9016A
-:102A300079F59DA1E8F91298499102B74463D53719
-:102A4000F0EFD6D8B203B02F6B61E73D0B1A6E7072
-:102A5000803FDDD536786639F8F17B65F4A9BAE2B6
-:102A6000797E55D0671C40F15AC5964C8E91E04F47
-:102A7000C1CFAE6A5B3A1D368D0B366BF1516DBB23
-:102A800016CFB3AAEF33F5F205017F2764063FABFB
-:102A9000E661EDF325905705F4D1F1911FF828CAAE
-:102AA0003D8C3B051F159002B64FE6E7555CAF4DD8
-:102AB00091F3669643FEE21E764FE2449B4C36C08D
-:102AC0007A9FE2E757C114E4CFE5948FD571CEE346
-:102AD000C067C363DBEFE3BF3A54741B6D52FBEB7B
-:102AE0003FE73F44E1F15FBF3BECB7507EFE9DEC1A
-:102AF0003F93BEED27BDF8D55CCCA37CD142605F8F
-:102B0000D4F5E2EFB36F83F26F2C5E9867D73AB6D5
-:102B10003F0EBE6847BBDE95C5FCBFC617CEE47747
-:102B2000A27D6A427AED1AC0EEA99E68FBFB61099C
-:102B3000F2E9DAE8AAC0EEF27D57DD6FE2707FDDE0
-:102B4000F5C219CDBEF2BBAE6739BFAFD46527E57C
-:102B500070BFB8CBC5EE77D6FD76DC63705F71D9F8
-:102B6000CE767315AD9FF4BB6FF341DF743DCBFCA4
-:102B700009EADF6E05977AF780039B4D14CF5F80DB
-:102B8000CF974EF71FE989A5700FA32F5E181EBAC5
-:102B9000281E605D142F35A02763E1E3BD01ECFE24
-:102BA000C8BF1F3EBE9C0BE3D7B68D25104FEFC5A7
-:102BB0008BE463CFED987741D7CF9EBF78261FFC7B
-:102BC000A3F3AD37F2FFD97A53D3FF5DD7CBF87DAE
-:102BD000EB00667FF47CDF97AF9FBF05CBCFD8BDFE
-:102BE00038DF7ECA7B51FABFABBCFFEFD0FBDAFF08
-:102BF000B3F4DECBE96D77C2794AD70BDF66930B6E
-:102C000058F7CDFF47D7DDE3E718BCD6D1747EEF88
-:102C100091D0752552EC3CCE50BA761F3183FB1112
-:102C20003392ABD17F98E163F1954652B807EEA994
-:102C3000057D329E3B60320DC543C7B50521CCDB17
-:102C4000320687FE14F2B8AE5FE665DFF9D2EEAF6A
-:102C500066A44E9B06FEDBFE063A2FDA6EBFDDE071
-:102C60006CA44B98E993D1DFA310FDBCB7265E8519
-:102C70007921338BB5FB8C9B74FB861BCAB5F5D7CA
-:102C800093475320FFEEFA1A13E60B5DA76BBF269E
-:102C9000DD89EBBC81D4AF67F1990BC353473ADBB5
-:102CA0004FF6C5C3B9F1D6074F7C3F89B93C4A5F9F
-:102CB000BC59FC6C7F69A115DCDFE279722BFB85C6
-:102CC0004FC2F79D163EB4C0AFC5C7BED7A9EA171D
-:102CD000F122F07EA1F81674D2E35DE057E04D4F8B
-:102CE00087C7E04C42E58FF7429147E227EA7CCB69
-:102CF000193D7EA30DF178603BBBAF70A0B86A733D
-:102D000001949F92D05F3B3D6114B1D2F5EE3791B3
-:102D10005DECFE974F7116F5E6B348C5BFC7730566
-:102D2000C82754EF4B219F50BD2EC8275497219F91
-:102D300050DD1EF209D5F5904FA8AE877C4275197B
-:102D4000F209D5ED219F505D867C42757BC82754E2
-:102D500097219F50DD1EF209D5F5904FA8AE877CD4
-:102D6000427519F209D5ED219F505D0FF984EA7A79
-:102D7000C8275497219F50DD1EF208D5F59047A82B
-:102D8000AE87BC417519F205D5ED2F8FBCA42997EC
-:102D900090D734ED2759DFD094A738FFAC69FF7D79
-:102DA000CF479AFA2B94CF34F582FE57E59ED43C58
-:102DB00087338B6011EC63D85FA9F7EF9A7E8CA400
-:102DC0000CE3CC66528FD00AF15B0AE3492B421B1D
-:102DD000157380570EF35F9C01FCBA35B801986BF0
-:102DE000FFB833D9A0FF0F4CB886C51FF839C14CC6
-:102DF000F8A7429938E19B4CD8D78A734F474426AD
-:102E0000E151940F2312426724818493281F46E2E4
-:102E100010BA2349F83C29E242981CC9C0E729911D
-:102E2000010853238311A64572107A2223100E88BD
-:102E30005C84303D320ADFCB881420CC8C5C8ACF96
-:102E4000B322E310664726E1F3819112844AE42A13
-:102E50008439912B100E8A5C83ED064766211C1283
-:102E6000998DCF87466E44382C52857078A41261B4
-:102E70006E6429C28B228B115E1CB919DF1B11599C
-:102E800081302F721B3E1F19F921C2FC4823C24B0F
-:102E9000220D08BD913BB05D416423C2C2C8BDF89C
-:102EA0007C54E46E84A3230FE1F33191071116459E
-:102EB0001E433836B20D6171E43F118E8BFC02E186
-:102EC000F8C873F8DEA5911D0827447E8BCF2F8BA1
-:102ED000FC37C2EF4576E3F3CB23ED087D91D7F0C5
-:102EE0007949642FC2899137F0F9A4C8EB082747C4
-:102EF000FE8CCFA744DE453835F211C2EF478E2055
-:102F00009C16F90CE115914F105E193989EF5D158A
-:102F1000F912E1F4C8DFF17969E42B843DFBFD0986
-:102F2000B1EE25FA0D6721AE6573F7EB3B5F846C5C
-:102F3000D19C4B3D90E0403D397335CB23D9507245
-:102F40007232FAB52B2C0AFFBEA64EAF7E6303FF8A
-:102F5000613DD40C607D401EE01CCEBF078A77A780
-:102F600080BFB4A1B0B316E22177E6745600BC2F3F
-:102F700083F90D776430BB784F068B97560E73B28A
-:102F80007B062B86E2F91549EEDF3ADEE4F659B40A
-:102F9000BF398B976DDDD9782FA09FFDF4B7DDF990
-:102FA000F2A37E98E17F2203FD22FDFDBC7EBFFFE0
-:102FB0005FA827FEF9F79F3FD7FB1F707AA564969D
-:102FC000FD16E769F4E543FDC47503E464DA4FE5F3
-:102FD00066C90976B2AAA9602AD0AF90F8309E38A7
-:102FE00027465E5727A7DFFC7A1381B8E27C85600D
-:102FF0003C77FE4E96E70B71D052CA17359C2F9640
-:103000006DDC610617B4A67E11CB3F0AB1389395EB
-:10301000FE07FCBC64F32CCC3F5AFAA436FE540BDA
-:10302000711D19CE91B5CFEB789CA9CFB9822EBE78
-:10303000F46E068F2F7959DE11913371BDA7E97AAD
-:10304000219FC37F8BDD0AFA9FE201CF49C4FA4575
-:10305000BC52E081F4BDCF8079A127F60CC53CB508
-:10306000138A9206EDFC549C3A6C90FFE01F0BCF44
-:1030700029FE309FA4BB2101F3918E507DAE40E22A
-:1030800093D33F16BE9FD6F95E16E1DF6FD49E1B29
-:10309000583763FE75A5890E4CDB553E9E84F71F9D
-:1030A000697FF9BB201EF9B809F3818264A58714F2
-:1030B000F73D57285B6F42FE98BFCBC5F2C382BE77
-:1030C00037215F5FD0E348D3E0A9905734BF39A7D9
-:1030D00000C36EBB4CE8E789F35241A7BE79D165C6
-:1030E00089F07DC425CDAF233D29BD34F5B59BBF07
-:1030F000C4FB03945E4763D0EBE8B9E89598A9A5B3
-:1031000017C4956F80CAD54928A715EBC243EB5564
-:10311000FCA88FD3934C1BDE7714F9C4D3D2193D8E
-:1031200088D19B0A743DB9790CD24B4FA769FFA88F
-:10313000427A90F7ECF8BDDD3983C9BCABE9F3798D
-:103140003C6E39A7F10AF49F7333991E3BB0167297
-:103150002D09797DAD95F8A8F3FCC65A2796DF5A5C
-:10316000EBC1F23B6B1584EFAECD4578D4CCF27950
-:10317000843C5106C0BCBAFC4C2647F999625FB545
-:10318000CA0371E969FF78638C0155A367C6942C63
-:10319000F4BB35791AE5D76AF3303A4D3CCF6BA3CF
-:1031A000E485EFA8CC2FBB54D39EE48EEA2D83FD9B
-:1031B000E07923F39B5DF8FDB61BA72769DA5FDF93
-:1031C0009CA1294FCD5410BFB3A60DD63CBFA96218
-:1031D00084A65CC97F378158E30DEAF329EA19B167
-:1031E0003C6F276B7BAA7E6CDAAD74FC53FB4C58AA
-:1031F000AFA7C7517310F7E3C1472D5EB043C7E0D7
-:103200001E192D1F7B4B467D77CC44824EAABA8F68
-:1032100049A409203132793A7D90C9D3B47FC804DA
-:10322000F6E1E497163CBFABDA229120DCA1EAA6D6
-:1032300098A7E3AEFA8505D7BD608B4CFC785F4953
-:10324000698573EB558F0FF7C2B9E59CC1E12CB8C6
-:10325000B7D7FDAB38EFA3B4B6AA93BD7F8CEEAF62
-:103260005D90972415E2F9C1E7A52DD506C83790E2
-:10327000F7A5809C7EFEAC8CF194C52BDE2A728271
-:103280005E7BB5F5ED623ACED11619C7FDEC49CBA0
-:103290003619E5DD9706DF75ED5D7708E30CAF794C
-:1032A000CAEA32291F7C5A1DCA47BDB39AC5B7FB6B
-:1032B000E287AE17E80DFCAAD263BD768B9D9351D1
-:1032C000E53300F44395C98BE7A647379BF03C8F65
-:1032D000EA7F3CFF3FDA926460FAE759E4BBF946C3
-:1032E000C5AC1E77FE66D9C77E174231C37CC9DDE7
-:1032F000B29F8C8532CB5708364B7E765EA3A5EF06
-:10330000CD2BC6E2FD627DFE94805F5099F2ABCE7C
-:103310008196BCC0CE67C9E84EA33A7F5CC457888B
-:1033200087F52FBEE3533BE8819F4CA0F0848F7D4F
-:1033300072F0F4763BEAC7E386978A6EA5F0B3D2C3
-:10334000E0C7464A977AD9FF5026E4EF18366F95C2
-:10335000F05CE4A39FC079FCA74F9BBC28863C5F30
-:103360006BC92F170F3C577E10CC809D2F8753259C
-:103370000F7C959760FEC66CD2CAE3032176FE0FE0
-:1033800093A0F871D6B273AC8FC6D837C13DDC2A92
-:10339000DDBDDD8FF8BD856732258D7D3ECECB55F9
-:1033A00006269FE445F6FD45C87B19A2B2A7429FB9
-:1033B000BE90C9F2497AEC2A6945BD52CDBF0F5C77
-:1033C000FBA485DDD3518813E47131230FF90AE49E
-:1033D00099CE7789F9E99F023B2F221D68E73E3598
-:1033E00085AA3B72E0FD6D4D6E7CDFE40D81FC72C1
-:1033F0003B60A58A03F4C722C2E6B7AC450A8555EF
-:10340000710AF17B1C04EC824ADFF4B5075A3BB029
-:1034100090DBBB854497EFD3A2B54B6509765CD7AB
-:1034200092169EF7DC332F999CA538ABF6875E9DEC
-:1034300081F396BCA128F35844BAC3F01DE0654F50
-:10344000B1FB40FA79E9D7D1DF79567B674D86EF3A
-:1034500009F78CAB9BB7C037810B4A2A3A08BC5797
-:1034600007193EABDB24A4D75FB85F25EED909BAB4
-:103470002F22653340AF2DBA8FEE0B737AF9A0C7B8
-:103480005EEF08A1BFF4196971D828FFD76ED97112
-:10349000FD3878EFE1D7CDC0DF15EEF050838BEE2D
-:1034A00017833FFEC9B4AC28F65D67CFFF55F821FE
-:1034B0003CCE84EF517C2CDC2E635E83AA1D3FDF63
-:1034C0000F327E0E12CC23AA7953F636D2A735F0EE
-:1034D000733E85173E5F819FFFED79EBFD98DC2CF5
-:1034E0009E6F10C38FD1EB973E7E8CCE7EC2BD09FE
-:1034F000B097DD292C0FFC94D197E846BDACD3BB27
-:103500002985F8DD51A177ABB9DD13E32C047B47A6
-:10351000CB1F6F79CE01F187BFDCF75C2AE65180C3
-:103520007DC9EBB52FB754B1F16E793E0EF3963EDF
-:103530002FEDC807BFAFE291DF3BD4DF35ADF3F825
-:10354000A766C17CB93D5C266FCB76823D0C44CF2B
-:10355000ABE8B3FF8AB54EFB79D669D7AE733EAC04
-:1035600053751FA48AAFF3C366B6BE8F36B3F52E6C
-:10357000E8B3CE209E83DCF298C51B443F238C76B3
-:10358000FCD80E99C0FDB31E3F4367F74F9396AD2D
-:10359000808F652BDF396CA47CB17818C50FE5836B
-:1035A0008ABB2D68E717FF8A9D7F7E2A95A4E101DB
-:1035B000FCCB61C70FE9F325D43F00FFA2771E3D86
-:1035C000767F7996DAEEF7137FCB791C6A79DBEF99
-:1035D000F1F7A2241FCB875C2EBE03B34BF71D1857
-:1035E000057400BB276F053A651285ED13B5F1D45C
-:1035F000BF0DFD72EE4AE4FFEE61EAEFF5D6C58736
-:103600004D90EFDBBD4342BF68D9AA12470981FC48
-:10361000561607BB238BD92FC9E7C3BC170BA56B65
-:103620003C1DEF27590A7BAE38595EF7C304BF3BF8
-:1036300023E6AB7F0EF1712BD83F9B01ED9F7EFD02
-:103640002FF07196C906F4A76BCDCCAFEEE2DF7D0B
-:1036500078288BF9D30F6531FF7A1B8F0F74811F88
-:1036600009E7D39759F0F77A08998C71722361FCB6
-:10367000671478731ABFE8916FF497BB33014F73E7
-:10368000498709E839A3789602F7060EA75AF13B55
-:103690004AF4AF0CFA99CDFBD96F62F7040EC31848
-:1036A000745DB3793CF9307C06948E7F788019FD87
-:1036B000D8E00B16F4136E8F67F13E929C68043EBF
-:1036C000BF89EBA939132C3E381F983DE1F63280B3
-:1036D000B4BF20A1F8AAB076AF2FA0E33418989D0C
-:1036E0006F7013BC2F499A3AC700FE2EA16E31E4C9
-:1036F000C9D3D5EF3C9B742E3ED2DE53A885B8C209
-:1037000078C218AC18F1AB29D79A59FD1B8F1C99B8
-:10371000715F26217F826C26B0338023E08BCA4400
-:10372000DCE7CE843C7E374023F2DBD546123430D2
-:10373000D86CC3EF10B1BC7E710E725D310927D217
-:10374000F585F76AEF51DC10368487C3F98E31DCDA
-:103750000EF833581593938E53364D2A04BCD7AECA
-:10376000EBDF7C3F7EE4F88CFB26D0327CEF0AE670
-:10377000F94309F3796653A1073E9D6B242FCB854E
-:103780008C7EC087756E2588ED56303E17F737045E
-:103790005D0A68F76AFCCEE6F3A3FD343BE07D7377
-:1037A000F4B8C9892CB1CF637EDA522EB74B05DF4E
-:1037B0003DA595D7E46C2E37E00F52BCCDE6301610
-:1037C000DFBBB2995CB8B2599EF5B71738DE320B41
-:1037D00009E3BA5FB0201DC5B833394CCC1E84FD57
-:1037E000897908FEAD26F5987F53CDE33106AA49C5
-:1037F000304FB7E531CCEFD7E709510709F3CE9643
-:103800006CD73F57C573648D5EC238A764EE5E0007
-:10381000F393BE17E7057E9F6D6EC57880BE9DA9A8
-:103820004542393735537F4AE2E75BB46CD92CE126
-:10383000EF3BCCCEEC1E89DF2BE77E7535A72BD571
-:10384000DE53E11E5035F85378FEC5BF13B585F938
-:103850009146EEFFCEDFACF5336637A9FC4C06345B
-:10386000F7EA2DBAFC7013F7373E30778F047DAF3F
-:10387000BF67FF8181CD3F984A303F52DCB337723A
-:103880007F52F093926DD29C8B89FB9C15A0A7D898
-:10389000F70E74F95436FCEE4A85C4BF57C9E38A63
-:1038A00027A8BF89DF95391487764BC419BB4AEC2A
-:1038B0004143227CCE9295E724DE3203FCCC0A877A
-:1038C000D908F08CA113C7B955EEB0E7E4F4C6717E
-:1038D00037948CDA027943D7678F9869CDC2530E3B
-:1038E0007EBFC87B00F2D6AFFD86CE1FCB05337DF1
-:1038F000747FD4F54AF75C2B55D1B55B0B661AA9DA
-:103900003DEFBABF7B2B94D76C1D3FD348ED60D7FA
-:103910009DDDD9F00DE135D997B3FA06D1DFE53356
-:10392000213FB8EB41569E4DEB83E0E7F27B40151B
-:10393000E325D4B36BB8FD11F1A30AC34B0C4E645D
-:10394000BFF371BE76B76797AD01FB2CDB8FE2EF5B
-:1039500009DCADF8D680DFD394E9AFCEA670C92CD0
-:103960002968867BF16F868671FB15F5772FD66403
-:1039700031B9DC3890F527F045FBA9FB67FA49839C
-:103980007E5234FD04FE997E8EF6EDA7E19FE9E7B5
-:10399000FB8AB61FE19F89EFCCFD31C7F708F4BB66
-:1039A000740DDB0F93A336CDFDFF93F5CF0F03BB53
-:1039B0007FF2294B12F0E1D267FE3BBB1AFC3FEECF
-:1039C0000F7DD6FEAE19F2BE9747D87771EA22EC8A
-:1039D0003B39CB77B69BA7E6411E6BBB79926A7EDB
-:1039E000B5BDBF7365BC5AE5C73C9A2DF2B5D9EF9A
-:1039F0003A2E7DE613FC9EE05243EBC790E74BC6A0
-:103A0000B3389A7E9D9BF87B87E1DC3F4ABCE0C9D6
-:103A10006CA66FFF31D8F74436851BB309F62FC764
-:103A2000F86ED797BCBF8A78A6C7AB8AEC5685E2FA
-:103A30007BCC9BFE46C83BAD7E38A750A6F37822D0
-:103A400073E20EE82F767CB39BC537DB587CB3C29C
-:103A5000DDB18A1A29723C7BDE5DD6CB08B9EA015A
-:103A6000D273DF0FE286D32CA27CCBCCC91358BC17
-:103A70000CCA07B6D6DD05F2B387FF3EDB9CB12347
-:103A8000E341CE3B73120C4E2AFFBB322A8FC33C5C
-:103A9000E68CBD6C2A3C2FB1D88755B2F838F2C7F6
-:103AA000AE8CB2DF037DA13DC43DFCE670CA0D744F
-:103AB0001DFE3FC89837EDCF4FF047BBA7F20AB7BE
-:103AC00057C7B3999FB6C740E759D83B0F313E75EA
-:103AD000CC567540DC6ADD8002F0A353324B3ECBFE
-:103AE0001ED33B7E4AA6FF2094C5F874B9F9F0BCFA
-:103AF000BFF3788BD3E333A01B85651364F8524280
-:103B00008F5EBF7A7282A67CEDF424E253C74DAF7C
-:103B1000CDD094CB2B066BDADFB46084A6BED4D2B2
-:103B200031BAFE02FCFD3AFB9398DF7BA8EDF4DB93
-:103B3000B3C18FDD2E7B25BA9EC52F3CFE36E45FD8
-:103B40009F809F2029647131F6BD467E1E63F41963
-:103B500035E7317B9F3383DFAE8AF3EBEEE5EDC3D0
-:103B600038BEFE3C46E48BFFB3E7310903F5BFE7FF
-:103B700079FC55BA323269573BD2A7712FCB636EAD
-:103B8000A47E0B7C4FECFB3B2D21F886FBE7FF7DF1
-:103B9000C4ACA8CE65EA220DF8BBBA93761DC173FA
-:103BA0009BA7B89FB4BCED4B33DC93FA7EDB0A9441
-:103BB000E7A9547F2552BEE968272377423C39C7DD
-:103BC0008E79384B9BAFC03875626436C2DA962B5B
-:103BD000B0BF65916BB0BC9CFF9EEF9EF88EA96054
-:103BE00087F7FCDA85FBC1037278D843D08FC58E86
-:103BF000FAA13463CE3AF013F6C407F36EA6E39548
-:103C0000FED7F7310F7DF94E09E3A6A532D923413E
-:103C1000FE7D240EFB2B95FF347A057D7ED5246630
-:103C2000574BC1C7A1F572917D137E4F3AC6EFA4E1
-:103C30008D1DC8FC3A53279BF794C82CEC4FD45FDA
-:103C4000367090E6BB7CA694EDC6F9B6DEF5983AE0
-:103C5000258457464620ACDB39CB08F9E77FC87D81
-:103C60002C19F044DBE3F7C1FAEAE3B189248ADED8
-:103C700012D0C2F5F06CD0C370FE9EE3BB66600A42
-:103C8000FC1E61A7D10A7AD4667582FF32A3B840C0
-:103C9000A956AD4B7EE946BC076149EE3681FD9ED3
-:103CA0004DA15A6FCF8B61676E1C28F47603426179
-:103CB0008F48E407EC3BA83C3E20E469EA4083E6F9
-:103CC0007B3A1D12938BE0AFD8B940698E7FE940F3
-:103CD000DA4F4709297F16F5684736DC47FF57CD8D
-:103CE0009FD2D70AF477183B09C431EAF97C843CA7
-:103CF0009F6FFE7379FB033209005F1CB8FCF20E64
-:103D00001F9D57FB6DA346815D10E3350C6479A6BA
-:103D1000C4D9FD0DE61BBE98A0405CBF14CE3C4646
-:103D2000F7FAF3908F08F1C3BA172D8FC20752EB41
-:103D30001C747F6F83BCC0B830F06DFBEFE28C6009
-:103D40003F0A87F81B002F937E377C327CC7C7D78A
-:103D5000663112F4837CEBE079ACF99E4F7F0979F0
-:103D6000D4F399BF99C99F9FCB6125E7DBF95C0E1E
-:103D70002B8DDE44388F99B74FC67B91F3574B2379
-:103D800077427C40B1E33D7D218742DE4CC097A362
-:103D9000803F195FD6465C5CBE7378BF4C0E4A65A7
-:103DA000966F573AC285FBE7E591246C27E455C826
-:103DB000E91D39FE1DC0D7A58D54BEE938FE750337
-:103DC0004683BCF4F289D909FC44F9C453ADE283BB
-:103DD000C6F6AF8CC027A60912F28985C2492A3ED1
-:103DE0002AEBF14F9C5353E93C6634E5E0F79445E8
-:103DF000FDAF7BF8A57FFCFE18978FF9B6F050F069
-:103E00006B4DF5715EF88EFC896405F5D8CA8D128C
-:103E1000FE38E14A53D924F02F563E28617C0FFC2E
-:103E20000ED03F4507EBCDEA73901B23F9785E7DFA
-:103E30004D6408C22732FD2F03FD2B23D7733CE6C8
-:103E4000473DEF3B557F3BC6D54E852C5EF69D31F9
-:103E50006DFC6E8CCF8BE77FA67D26B24D81B89B23
-:103E60005FC6F3BD2CE2BC5762F13B88E789F89B43
-:103E700038A71371380B7C0F5765474F1B5BB26136
-:103E80001FD2271E57C2ECFEF1ED26766FABFD4F19
-:103E900045065AFF698E0FE372AF79FC87613D4B8F
-:103EA000AE0E3D63A2E5A5773EE78078B9C067AB6B
-:103EB000313C14F64BAD148F101F6CDD2C4F0B31C1
-:103EC0007F2761962ABF22165F2F890C46FC087B4C
-:103ED00023F4F7F36B3DB829157AFC7C7648F0F7AC
-:103EE000322E07CB400E88DADECC2A83DF3523B9A9
-:103EF00012DE73EDB5374C1E849EA6FC8E72533ACB
-:103F0000380BE3EA426FEBEDD16EB9F5DEF1C03765
-:103F10008ADFA950FCFC0F4D62B3890080000000CD
-:103F20001F8B080000000000000BB55B0B7854D518
-:103F3000B55E67CE9C994932AF3C0986C43393077E
-:103F4000700D383C22E1E1C78140002138C15B455A
-:103F50004D65402411131250AE51B8DF9C90808003
-:103F6000D486EA55DA824E28285AB551B0C68A302E
-:103F70003CB4A15A1DABADF456E8A014791BB15660
-:103F8000FCA472D7DAFB9CCC9C4982526F874F37D6
-:103F9000EBECB5F75E7BAD7FADBDD63E8789BFFC50
-:103FA0007AFBFF0240ED8B4F4F820C8009570920AE
-:103FB0000A00339747CD36A4C16E736FF5205D3A82
-:103FC0004C5E500C70917EE301C4BD5F49F210005D
-:103FD000EBF24A50EC00B7625B668FF54B004A3B50
-:103FE000D20051F32C47EC79A66CC2FFD1F32680A6
-:103FF000129C57E73BBF14E01A80DBDCC07F8DC802
-:10400000D41FD7217EE49B6A85397E5C1FCC91BC8E
-:10401000F8F92A3C1307CAC85A2C0B6CDEFF2FB9DB
-:104020002B44B00969004E7314D28A697E5D6E9587
-:10403000AFF32D725FA1F1BF2342633B8E7F67FC1C
-:10404000F8888272ED5936628428C7D61B2F5B1818
-:104050005F453A8E1D09D0F59A35B419E5069C4F97
-:1040600040FE4F5F1B1C5A8B5B3B0C5D17C83EEA42
-:10407000CE1499F655BF2B85F1D727BB4202F6D750
-:104080003BBB8AFC284FD9EEA4300CC57576279926
-:1040900001D7FD26FFF6F1A49FB2DD0327094E14D8
-:1040A0007AA7D50CC8F7409EA2D0F3BEE4D7E54B63
-:1040B0006CF5FD97570AAACB0530BDCCA19AB05D2F
-:1040C000783E1F6004C05DABA7B1F6E560362A19E3
-:1040D00060F2F94A00DC5BDDF91BD8F345E75318C1
-:1040E0003DFDC14839ED075E16602BCA5F91F3C3F1
-:1040F0001580F27526C3901DB8AF4E6FAEAF9970A4
-:10410000D93A8DF157FC6ACA54DAD7A21DC84CE3DC
-:104110000609A142D2D351BB09B200EEB671F13FFC
-:104120006FF860A48CE33F1FE91806C8BA4F6C7F94
-:10413000788CC0ECD949F69CA8E15D3A2F8282F2D6
-:1041400058CF0BACFD400E2C964B181F401AF9436C
-:10415000FF9101FB77C1D32B928C78946A3F93082F
-:104160004F566CCBE2FAE7683849D4E37F5DA61F6F
-:10417000CCFF8E785A43782AF9B7E2690DE9A9177E
-:104180003CADFD3E78BA841D7DE089E16CFA9B1C54
-:104190001F90EFF06D0586172677A72537D48C7C06
-:1041A000B7925D095F17A181F43987EC9B1EC3EBC1
-:1041B0000E4FE0F9783B7726ABC58B8BBF8B9D6F9D
-:1041C000068A1BB766348082CFE7601B1F37AC645A
-:1041D000BFE29EFBDB7E99766EFB8E76DEAFD91951
-:1041E000DC68C791CC7E32D935D1EE6457B27BFD05
-:1041F0002EEBE64BD9757841E09DDEEC0AEE6413B8
-:10420000C919B38BF506C2CDE76133907FF56557C9
-:104210006903D7BB4EAF0C9BA786D87900E99543BD
-:10422000185E22DF072F1565ED7FB7A5029C0DDD17
-:10423000ED378F06B8B114BBAEA0EE7B5A95028A5B
-:104240002FF8F7316C46056C4C9F9C56974626E13B
-:104250007EA73FDCDDAF52FFE4712E3E1EF9715B9D
-:10426000DDFC67424B22EB98DCAD5CDF81A8D93FD7
-:10427000248E1E89B4238E2E4DA037727E3A47DCE1
-:104280006C9E10F74F9C5F184EB43E9FE607D055CA
-:104290009E8AF69BB94370AF457BDF32EE530BD954
-:1042A000A7A22CFA460EEE57685BEEB70FC6E714CE
-:1042B0000751DED4B69656B5401B8FFE53ABA9D13D
-:1042C000DA2E2822DAA9B65408793D3DF598EA316C
-:1042D0009E67F4331BC78365E4E58D273BB2F15E2F
-:1042E000363E6CBD8CF56F1A074AA8973879A587BA
-:1042F0009FFF7001697D7ED4DD0DB8BF502FFE3663
-:10430000509B376232D501EAEBEAB60DADB65CB42C
-:104310002F707C0C6B7BCCAF721C8292B0DF4BC9D0
-:104320009BA9CB11B75FD9383E7C297DE5F4D097A6
-:10433000868F1A235E5C66FFFECF510E5786E056CD
-:10434000D1FE8BFC49EBC045F6D7F1BDD9AF0CC00F
-:10435000FD2541375E8DF8FE859FF0BD0874FEADEA
-:10436000AD742EF94DDDFC1CEF3B85EEF183D0954D
-:104370005DC0C74F6FDBD2AA16337BB07E469B2F42
-:1043800081F7F6047A5C827F68F866FE49711BF556
-:1043900053D84BDCA8D1F47B4680D914F72213798B
-:1043A000BE17F1F276B587E7770D1A5FA36EE7E4E3
-:1043B000383D0C88D9197F611864D837D3D3CD190B
-:1043C000FABEF7FB67A0DF44D26088803859E10964
-:1043D000B7B6C4E1A4C5B39FE12436DFDE08C5FD4E
-:1043E0009B353DADF6EC8B683812C8EFEA1820100B
-:1043F000073B0455C47DD6110E7AD9E7AC9E3852DE
-:1044000013C62BD225C6CFEE395E49180F52C6E52A
-:104410008CD7EC3423C18E5313EC382981AED2E90A
-:1044200090219EE9716E5EC7FA955928C75DDB043D
-:104430003A26285E5B8461009BDA7EEFB7F727BCE3
-:10444000CA520EC6FCB6B6772236C47225C533866C
-:10445000DF48AB8278BB81FC9DD1EFFA1517E1A74D
-:10446000616536F23FD5F687561BB2DED2B25EA248
-:104470009CE6976DEFB79A71DE9B47FEEA0D9ACFE7
-:10448000DCF4A7C80CCF25F0DA9AB08F8D09B49A66
-:10449000C0FFC8B7C4F79684F1CB13FAD725D01B59
-:1044A00012E8D5C6F173E70BCC4FE6A2FD4871DFE9
-:1044B000E6377B347B76FB3FEE40B0B33CC980FBF4
-:1044C000E9CD9C7EB3EDA87FB53D8EF61CF393BF7E
-:1044D000EB389680FF6ECD0095CE0FA98F78F64A07
-:1044E0005F381A9478DEF1FEBFD25FFB53DE098697
-:1044F00073799F68A4F788BADC7F8FDC63A7873A5B
-:10450000FDB99FF2F1E98F19F78575A1467FE69F06
-:1045100084FE3FFDC71AAD76F995B87DEAFCE5FF4C
-:10452000BC28D27A473C5DFE2DB8EFAA89E1C206CD
-:10453000E4AB4AE32D9E33229D63F536EE4FE5AFA3
-:10454000897E3A67AA92C3854B8AE3F609ED45B4A2
-:10455000CF3DCB44661FB599D723F3C067012C85A7
-:10456000F6B85C8D4F22FFBE6562239D6B871BD31F
-:10457000B348FEE15E5EEFED735D997507D27B5245
-:10458000E65864E4DBF3C064D6EE1595555D88E328
-:104590008B6D17D939BF27C5C5F4F3B5E76B7F130A
-:1045A000C6AB6F3C325B3F90E6CEEAA07C75AD04B3
-:1045B0005B6592C7F738C3CD8FACC3D6A21C739B83
-:1045C000AECAA2FC6DDEFF5496F747BE792B259F3D
-:1045D000C0F86028C91D583BD942FDF35BB4569D15
-:1045E000C2DADDDF6C7F7328F277AD117D9B9179A4
-:1045F000D779AF731ECAF571128FC31F9D2E7092AB
-:104600009C8F7A03C95EC2ABD3912CD0E1E1969D19
-:10461000B370DE87F395146F668C7FF737E21CCAA0
-:10462000375F3D3D2F2B8074A697E366D7F9795904
-:10463000F3E2CEFB0567CC4CCFBB2DF23D945FEE91
-:104640004ECE155481E939BD12FD65BE965F235EDD
-:104650001AB7F772EE9BBC22D3EB516B237C8C20F4
-:10466000DEF360E63892531F57F27EA0D941781EE0
-:10467000200F8FCFA3B3F2267A48DE18CEB2DE2504
-:10468000DCB03C1AE9E2CD69EB553A0BF761FE4F1D
-:10469000726428E5D40FCB9101F34EC86E2F8ABF08
-:1046A0008F88E5A92BB478C0F90EA90E56B71E7AEB
-:1046B000362944F5CC21F52F0EB0C7F3733FA97608
-:1046C0003A543A8C3F7138CCA4D7C3E6E0B1FB70C2
-:1046D000DC824D128BA30B36652EEFA27880F62C70
-:1046E000849EEBAEF44A6C9E3EFD44CDAF34F80997
-:1046F000E457D2B9D6979F946FF6566EB1F7ED276F
-:10470000D55ADE5EBE49F213CEAB4B1C66B81AEB2F
-:10471000EC4DAF6F253C562F4E1A6E45C1AB375945
-:10472000997DA30E87EAC6FE80D3614EC5F6560D6D
-:104730000FD1A62456A788591616F7C4552532E975
-:10474000A74C04B30DCF15D1E993FD9C6E7163DDC9
-:10475000B6D2512A937D577865B6DFEE7ED7ECEB63
-:1047600004AC6BCEE13ED271DC89C6871F1D85F299
-:104770009D84D08DA350EFE7C8D0B8CEB91D624854
-:10478000A573C2AC982B30EED500F7F7BA03DB2D3A
-:1047900013F0AF350DD533A83EBA33247D14D56A56
-:1047A0009F8BF8DF17F09685F2DBBBB6199FA3C786
-:1047B00058C8AFEADA8DCFEB61DD67E2506ACD1FF2
-:1047C000450769CF71DDC60FFF3C647F1CDFDD5EEE
-:1047D00047C6312CC161380C47CDE23AC5AE9B08C3
-:1047E000768D2293575C9114223D8A79FC7C980245
-:1047F00042288900E1C67DE3BA5F060F0ED98F809B
-:1048000010EF1FC1F4723488781A88FA70DA18BF72
-:1048100078BF18B2E2BA65E9A0A4923E1FAD047059
-:10482000307DAA6EA4A7643498293E7579B83EE716
-:104830000AE06F677EEFCBA3FA78C1A62466BFEAD1
-:10484000C7EFFCD34F4792BD2A32E2FDE821C25D9B
-:10485000099B0F6C69B1793E69FAEF3C92A7EC09AC
-:10486000AC2BA9DE14038FDECCE2658A8FC52D77D1
-:10487000F447A308274D29C3D602E1A47F9EB73889
-:1048800036BE7AC5B2223E1EEB5527C5AB24B69F75
-:10489000DA1D568693B96B44859D8FB916763E7E98
-:1048A000D492C4E8DA01A5CCCFE69A2040FBC05CE4
-:1048B000309BC575AE72A8B583B2DD4E717E5D4486
-:1048C0007432FBA89ADD2C649FA7BDE96CFD39A466
-:1048D000633CB70E68389B6BE2F8815D42682B8BB6
-:1048E0004F0D32F97F954960712ED11F7F434918D2
-:1048F000C5C93CDF6D34AEEE21AB6F8587CB20EAB6
-:10490000F2209EEA4C91053FA7797F6D65F71AF575
-:10491000B88F2427AB2F941751FE7A33982D742F1C
-:1049200025F378A6CB532F574E219C62FF4133F6D7
-:10493000D739783CAE4BE5F73DE0B085B6C6AF471A
-:1049400032E7F371B293FC6C34C30BF9BD09FB3F42
-:1049500005DE5FE62C95A3F8BCD304ABE99E84E4A6
-:10496000193C346E5DA4FB0F253C2E367B1D6487FD
-:10497000F41B67D37ACF892C2EA1333D544AF9DF3B
-:1049800073E208AA63E7AED957BE81E81786B94932
-:1049900084B9CFBFC7CEA7BB349C4529EFA7F30A84
-:1049A000E917B0FDC8CBF3FB80C8EF713EF2F2FC13
-:1049B0005FD7ABDE5FB74662F6A85BC9F150D7F4AC
-:1049C000019BB7CE11C9227BD4BD245D43B83EA55F
-:1049D000C93DAF2977DC41C4C73CC9E516F051ADEC
-:1049E0005A6121BAB65560B4BE5EDD9A3F66998AB7
-:1049F000F97CD45A351CC5E6CDCCA3F3ECD4B3E98D
-:104A00007973E3EC7EAAE565A76C27BF0917BAE9BD
-:104A10001E6671926F33F3536E8F532D859BE99E03
-:104A200066BE3BE210B07FFE3DF96974CE1D76870D
-:104A30002DD47FB8DD63225A71BBC711AD98AF6624
-:104A4000F4290CE1EDC51A78D14E8B048E9BDA6700
-:104A5000F759BCB89E3B9FEBE7CC73EF15D17D4176
-:104A60005D5EA488CE5FC455510ED9E51981E50974
-:104A70008B9E1595A4A1315C2D225CA1FF2FD470D3
-:104A8000B568C7CBF7929F2E223C0DEF894BAC2B1C
-:104A9000F7B3E72FB695031FBF9F70A79FF748B7DF
-:104AA0004874AF66D1685C87E8D47C99F901F64F09
-:104AB000E2FD6A313B47206AA17CB85EE47902FAE4
-:104AC0005336E511F51D92DA1D2F695DEA2F8EF53B
-:104AD000F7859BE1F926CDCE56761E0DD7F4125DF3
-:104AE000F392937071E6B97D6F8CA1FAEA45C14DDE
-:104AF000F1BE871F6A7AAB273D39D93E595E544FC4
-:104B00007A71C6F4D4ED6F1A2EEA81EB41D74BBD12
-:104B100059D393DEAF8D1FA1E9A11634BDEE18C89D
-:104B2000FD5DF36FFD1CD1F71748E3E3757CCDD72E
-:104B3000F637219F9F9BB5881B5F31C39762B946AB
-:104B4000ABFBB1EBCC0B6DECDE48B7A72EF7F27CDC
-:104B5000EE0718A795D4B4989DA326A8E9ED9EFA70
-:104B6000264D7F929DC795234D39B735A2FE163E3F
-:104B70002BFA98F2A8E68A5BD76A8A3A585E7ABF1F
-:104B8000E8A67D95FDB2F23ADAB78E3B699B60EEFE
-:104B9000184975462AD3BF2E5F593FFF75A91C7768
-:104BA00061924797F3881066F6525F10DC3CCF8D18
-:104BB0005AE8FE50F7D34479E76BF28A4E618C7065
-:104BC00035C9E393C9BF01CF41268FFDE032B69EC0
-:104BD0007A689967686C9DC3AAC34C7C8781C701BA
-:104BE0001D9747B4FB88232B5F6679B0BECEFD3D91
-:104BF000D7093466F45C47E75F92CFCF01DD2F3AE7
-:104C0000D338FECB5A3E607C7A9CA51FDDC3E9FAFF
-:104C1000D4F516E79706FDE8FEA5FB936ED77FD582
-:104C2000AF607926CB571FD0F6CD7C242B762E1083
-:104C30003EE9BCB35A109776C3B9C9F29A29033E2C
-:104C4000B3047A79AEEB29F179AC9E72E791FEA7B5
-:104C5000D8B34D9407404BF6FE82B8BCEC63BAEF74
-:104C6000A2789A09FC7D06A057C69DE77ABEA69F4A
-:104C7000D7F85BD78D4B1C5F9FA19CA0FE9A918BB0
-:104C80008B288FF847BE97E9EF24B45B26E07CB50C
-:104C9000C723E54E3956AF5CFBF7B0E8A2FBC01D59
-:104CA0001E43BD507B7A3FF3EF3A88ACA2FA76EE12
-:104CB0009AF72A4691DD9FC67C1CF9E6B77AD8B9E7
-:104CC0007762CBED23A8949DBBB290D1776EBD8364
-:104CD000D36B783E377765C993741FFF7192524E3C
-:104CE000F8EE5A2FB8A9DE1ABBB564F92DD83FD615
-:104CF00071652AC97D68CBC71563A86E681499BF12
-:104D0000285B1EBE91FA950ED1475B9D0FEEE5B76D
-:104D100010BECD2EE66F87B573A259E2387B578B54
-:104D20001307BA5B8EC3B2E6E62213ADDB86E71348
-:104D3000EEBFCA22B787A9EE7BAD9F6F33E90BCBDD
-:104D4000D46CC4D17181E7DF3516B011AE0E489135
-:104D5000A524FF81A58E614D248078E11AF20B45D0
-:104D6000ABB3B06E62EBEAFAD2D78F68FEA2CFA3E4
-:104D70008FEBA47C8ACE0F4DDE132D4FDF4879C216
-:104D8000896D856910A7F713B42FD4F79D18175FA5
-:104D9000ECA5FE3B94AFDF4784585BA3DD1B1E9060
-:104DA0005A07D0FB5BCCE38FC6E7E59FB425D90853
-:104DB0008F98C71B9F4BFC3CC13CDEF01CFDE6A856
-:104DC00031DFD7EA3BB1CA15E8250EE96D629EDFF7
-:104DD000956FCF387615F4C8F375BF4B1CAFE7F568
-:104DE000DDF72C1FDA13DEC78C72C125D63F1D44B8
-:104DF000C360EDB78D7C17E59D94F2CFED11AA2726
-:104E00005BAD6E2BEAF728F915BD077C49E479A262
-:104E10000D7C61C4C5D13F8EF0911F2EF890FBDD53
-:104E200082762144AFD8F7AF7F4024FE3B360AD0CC
-:104E30004F88ABB31E597F23B9DD395F60557FE4DE
-:104E40003FB74DF0A94C42C59E505FBDD15FEEBB50
-:104E5000BEFABE75957ECF94A8F72B0BB4FACA079D
-:104E60003EA3DE797DBE1BE1533ABCA7DE4F0703AC
-:104E7000AC8E3A1BAC61EDE8F6B6B21C94FF53E180
-:104E8000C84363C97F1C2E764F723AD8C05E029E1B
-:104E9000ED18716126EAE755BBCB4D71E36CB0911B
-:104EA0003DEFC68B86CF6B77EC117380F1EF1C8BD7
-:104EB000FCBBEC2E7AADD1CBFB366E5F8064FE7E00
-:104EC00054ABB7EF5E3CAA1F3DD7F77BF23E6E674F
-:104ED0005DFE93DB6E77527EBAE7E7E93B47937D51
-:104EE000535C6E8251F506110223008E6DE071E86D
-:104EF000B8CDF524DD971EDF784316D58377485D5E
-:104F0000161FCEEB7BADD249F7027F33479D6E6A09
-:104F1000913F4C72984322C5BF315381BD071C138A
-:104F20003683EC61AFE8194E469F3687C2489FA290
-:104F3000F783746E5F48E6EFE9B5F77E77BCC2EFA2
-:104F4000D3BAEF4FB47B84B1DA7E9715A4E9EF7B37
-:104F5000D8F3B252FEFC938DDB67D27C27B6486E45
-:104F600092F7EC1689CDBF10EB7813E2F038E28DA2
-:104F7000E2D7C2F7451F41FAC4365E272F44DCD280
-:104F80007D71DD6249B1B87AE2B14CE7DB29B0FA54
-:104F90005AC7E5422554CEF4AEE1D3867F2EE29186
-:104FA000910AEDAB481F8938FD57EBFE2584CBDE17
-:104FB000E241020E747DE97888E113182E75BBA7D3
-:104FC000B50F9B90C306A82C5EA8136110E505CD14
-:104FD000161864261C98927DE4E78D36E750BA6770
-:104FE000FA3289B7F79ADCAF53BDFCA54996046C39
-:104FF000FF56E061E3EF157D93899632A2EC7E4087
-:105000002C3329263AEF9AAD2C5E24C69B870A786A
-:105010007EEA25B061FB4C819BE78FD0C0F207BDD3
-:10502000C50DE6527E529992F6858C2C3F2F983111
-:105030008BDEE3568E4D5B9A8F99E52F0A66CD3253
-:1050400023AE2B47A4BDE4457AEB163FA7AF4E2B0A
-:1050500091906E126E983509F9F716283F2D288920
-:10506000ADA3CF8BCF37D2F3B7FA059EA0B6DE62E1
-:105070005F4DF1FE53A16B91498CF1BF2BC0E157FD
-:1050800085181D95208FF2E967E89D6A49DFEDD903
-:1050900002655B412FCFE701AC243DCE537F7B906F
-:1050A000F235FCF96D88B7EB35BCCDB3D9C3840BB1
-:1050B000582D9DEEC68597E292CB4CFE3D5333F7BB
-:1050C000F5E6F01E1A3F185ADCC76C2C15DC783157
-:1050D000BDEF388F8E09C7F4F9707F9F4AB85FB46F
-:1050E000ABA0A0ADD1A504547215C63761E76FBF60
-:1050F000A2799B558826313B54B9097F02044C178D
-:10510000B1AD4B413CA09E96BC74663FC1FF4E3D85
-:105110009FCAE6DF672CD5F0787D4479AC0D85FA1F
-:105120002408190568EB33B0F7AC19D73D610ABC08
-:105130005D807AAC35BD95B74426BF6D7652FE7260
-:10514000E679D13703C7D56A793B5C10C3E3F179BF
-:10515000A767F0E6B57138FA40C3CF694F386F19C9
-:10516000C50F0FAF3BE1C2BEBC65C83FD53BAD84A8
-:10517000CEA54740F97301B3377FDF30D3DCFBF7AF
-:10518000177FB882E73BB0859FAF5633A88E34D6E1
-:105190008213F5310D6529455A425A64EFE3438C79
-:1051A0009FF89C94A7C8B767F3F735E0277FD4ED45
-:1051B000A8DBA787DD5064CACF4D3690C85F06C311
-:1051C00046379D3BBAFD268B76166F96BCC4EFE33F
-:1051D0009608D19674A29FC3F392F4A5F965CF7394
-:1051E00073AB854C51B3F176169FF4B824E31FC21C
-:1051F000CFBFEB5ED252A89D9BC36018E1EADBF201
-:105200001D3D2EA17D1C8571EF7FBFD53EA422DC04
-:105210006FB5B6F664B14A36935E326D3E8ACB4BBB
-:1052200036E5F7E3F1F82710CF071BD3193E57797E
-:105230004466C78A8E1C90F1D19D1D02C878CECDE0
-:10524000E84867B4F37C7F46573CD56F22E5FFDD25
-:10525000EF2D9F1AC8E8134FBE3932C0EF576C3498
-:10526000BF1F74398ADB291F3A674739D00E7EFB8E
-:105270006A765FE887EE3A46B828108D28217F527B
-:105280002495DBC5D6C4FC5ADBD71237B7E39203AB
-:10529000FCDC5D3281BFDF33AB835D8407A95384BF
-:1052A00010D23F3820968491B5598BCBD66C13C859
-:1052B00071F6489293418EABDF4055225427CDD6EC
-:1052C00070923228CDD0FF80109048AED9F6050CF0
-:1052D000370EDF1586F92279E59D4C1F019EDFEA26
-:1052E0007802F1B499E4FC629C00E9888B1FCCC67B
-:1052F000FEB879A5719F4D12586BCC8B512F472F5B
-:105300008527BF8EA7C13098E129413FE81F2CFFB8
-:105310003C87E738A54D985D3C360EE91B3B2508D8
-:10532000C92CDF64FE734E4961F7F72B353DE9B8B0
-:10533000F30F048782F3BA4A8D7A4B558C7A4B9FD0
-:105340006AD453A6DFA8977EB3BD86FEFE81FF30E8
-:10535000F4E7D40C37D0B90D630CFC57364E34D07B
-:105360001EF53A037FFEEA5906BAB0F51603FFC0F0
-:105370000DF30CFD83430B0DFD576D5B62A087B4ED
-:10538000DF6FE0BFBA6385A17F5878ADA17F44E7A6
-:105390004F0C7449E46706FE5107371BFA47479FD5
-:1053A00031F48F3DFEA281BEB6EB3706FEF1E7F782
-:1053B0001AE809F0A681BFCCF69E819EECFE8B8197
-:1053C0007F4AF6C786FE69F22943FFF4419F1BE836
-:1053D0000ADFD706FEB62B024F1462C89F6D5A77BC
-:1053E00048058ACFF28FC7219E6FCA30FBC2C474B2
-:1053F0009975DB53855A9EA6E1F60BB0DF66F27E07
-:105400007B1C5C47794126E17A06D07DEFB9768135
-:10541000E1BAAFF3D985F9AE396E1FA98A0D0BF049
-:10542000189D3ED56DA033FDD906FE7EB365437F42
-:10543000FFC020437F4E8DCF40E736941AF8AF6C03
-:10544000540CB4479D6AE0CF5FED37D085ADB30D06
-:10545000FC0337040CFD83433586FEABB63518E8F4
-:1054600021ED8D06FEAB3B5443FFB0F06A43FF884D
-:10547000CE56035D12D960E01F753064E81F1DDD54
-:1054800066E81F7BBCDD405FDBD561E01F7F3E6CC3
-:10549000A027C001037F99ED5D033DD9FD6703FFA0
-:1054A00094EC2386FE69F209437FED29841FE5CF42
-:1054B000AF0AECFDD7F4419F19FAA50CCCD3E97ED5
-:1054C0001A927DF41D7E629EAEE76F15BEAF0CEBA7
-:1054D000DC6B6A60DFC57D69E2799DA3C8CBCE37FE
-:1054E000CCDF6D361667F1841AC2AE5A9A283F7522
-:1054F000A902C31DA51A55ECBE3083BD576047A352
-:105500004CDFA1617E83449AC9E3A1FA21259687E5
-:105510000EB838E2BBE7A13945C0F07F5D51C05DF0
-:105520005442F5D80BE5549FDC09EA2A9203CF5781
-:1055300017BD677A3BC9786FA4B7D36CA8BFB8F51D
-:105540000E24B50E187E09BF9D663BCDF8BBE7D58E
-:10555000EE9504DCDF92B8F91FC2BAC98C25646BE2
-:1055600010FD0BFDF4274137A31F096633FAD1A0C4
-:10557000CCDA0DC141ACFD59D0C7FA37064B19FD45
-:1055800078506174283895B59B837EF67C4B7036D5
-:10559000A39F0C0658BB2D58C3DA67820DACFFD908
-:1055A0006023A39F0FAAAC6D0FAE66CF5F0CB6321F
-:1055B0007A477003A37F1D0CB1B623B88DB5BF0920
-:1055C000B6B3FE9DC10E46EF0A86191D0E76327ADD
-:1055D0006F30C2E8FDC1838C7E2318656D67F0389B
-:1055E0006B7F17EC62FD6F05CF33FAB476DF3FB502
-:1055F00088E75FBA5E741A6012C3839ED7CEA4BADE
-:1056000085C0512A9D35D42D09F543A23D4E6AEB44
-:105610004813F1D8A63CE78AA2CDCD71F9FE7F16DA
-:10562000F17BC10792414DC2F8D744C53C42B12934
-:105630000D42CDECFD2ACFBBAB355C4206CFB71790
-:105640006872556BFE5042F81CC4F0F9D6E5D44997
-:105650007A9DDC322030BF08DB85B92695DD13D872
-:10566000434594F73F3520504DB83DD770C71B6C6C
-:105670003DB7AF8816A9B086336FA2FB9F0322BB4C
-:105680002FED6BBD7AEDDF2FF4D9BFEBC4003A8765
-:10569000A67E23B2FBF4B725C76CBA1FB94FD3CB94
-:1056A0007D4526433B34D7DF48727E52D8F0E4DD97
-:1056B000C852B5B8D04579EBF5545AA3DF57822CC0
-:1056C000B1EF6341799D3E99FC01267644DF042ABF
-:1056D0006B3B72024D34FE662C20880E8CB1E6F5D1
-:1056E000B69F44791ED470F16091C9D04ECFF5AF0A
-:1056F00025FD1C2D540CF2A8B9B2F6BD7BD7E324CE
-:10570000D73F5EFBEC98901FD3B77E2FB16A82F62D
-:10571000FDD462417F4FCDF3411BE8F920EBAF5A36
-:10572000CAEF677E887519BDAFFC508B87E71A24D6
-:10573000162FAB84641FE5D3E71A960EA4FD24C68A
-:10574000CD2A1C67C27155C0BF87A8FA3085E10B0E
-:10575000E7037AEF5685993BD57F77E7EAF71E5145
-:105760007B269747A1F7B073765ADBA84E459C3C41
-:10577000CDE2D86851B5609DFCB6295424880C1F31
-:105780001601E5ADCE407CF49217E83858A4FDFB35
-:1057900018FD39E26B3BCD77F6955183D87B935D4D
-:1057A000A365D25FB309ED41F735BF13F9771274E2
-:1057B000C54EDF71B88ADBD877FE944490BD463B76
-:1057C000D8FB903D2234BED04BFC7C5FB3DBDBD9F1
-:1057D000D2D4109BD7F89EEFF71AAE7EAFE1AD6240
-:1057E000EF81DC7B71DE459D12AB776064B4D8DF5E
-:1057F000CBF74DF58D6FF62F88DB477DC711FE5D2A
-:1058000014448BE3BF873AADCDABE349B438026DA6
-:10581000F678F9388E10D7EF911E10D7C728AF9FB2
-:1058200069955D37E1D028AA268C6DE00937FBAE7B
-:105830004EFFBE6E3EF8595B8D70201CFBD5F5AC5B
-:10584000FE5D08EDECF9A2D2DBF388AE87AE49D954
-:1058500054BFAC6E7A3D1BA5BBA175FD64BA7F9E9B
-:10586000159AFB3AB5955B84635477A35F1C25BFFB
-:10587000880A0D2BA924BDE5D9092BE99E77A6C876
-:10588000ED006F723B208E1431ADE7FED00F4ED18C
-:1058900078F40326BFEE07552B387EF47F8FD1EDC9
-:1058A00017A577FD3587DE7D98BBD87721F5BBAC92
-:1058B0006984AF8554798AF179A17E3EF3BCE02EEC
-:1058C000CC0B88EFA4C4ED7FF25012FB772F270595
-:1058D000C4C7F09EB8D7F3CC2F4DFCDEED5E11B7F8
-:1058E0002852BDFC30D3538D2D3494F484E7B33467
-:1058F0009070FD71FBAA6174DF37319447F9AAF407
-:105900008CD5D7EC31C479B89812BBC77B48E2F785
-:105910006A89F2F6C85B4ADFF88AF209AB05547A65
-:105920009F84FECFFDFE3097FF4B5320FB1A91E77B
-:105930002BAC8E1EE067F53F64D97C6B859EEBB780
-:1059400068EB76FE93D7D36A2EB0EF7112E510DCC8
-:105950007CDD4479ACC95C0EFDDCE9290FB7832EF0
-:10596000CF90811E7E2EE6296CDF4DA65416BF3ED9
-:105970001503C5A437FD7E4CAF633B3D9FB0B80E09
-:10598000179A07F0EF7BC37D9DA7A7BBEB676FEC72
-:10599000BCD3EF99605CEFF7827E9B5B22BBCD02AC
-:1059A0001F8BFB83E1435D3F867BC2FF035073AFD8
-:1059B00086E0390000000000000000000000000048
-:1059C0001F8B080000000000000B7BC4CEC0F0A3BA
-:1059D0001E822538106C62711D0B03C30756D2F569
-:1059E000C17025507F0910E703711610A7027102DC
-:1059F000104703711810BF069AFD0C881F02F11D95
-:105A000020BE0EC49780F82C109F40B277191B035C
-:105A1000C35A36D2EDFF83E4E78940763910CF24AC
-:105A2000231C46F1F0C0F23C0C0CDABC08FE3E5ED2
-:105A30005479051E047BB92065766D03EA0700E9F9
-:105A4000CD424A800300000000000000000000007A
-:105A50001F8B080000000000000BD57D0B7854D58B
-:105A6000B5F03E8F79253393C9839040C493970452
-:105A700009382421F2AA1E0842A4D406F42A5AAEF8
-:105A80000EC823869044B02DB7729B21092F411B6D
-:105A9000152D5AB483458B0A36F268D106EEF028EC
-:105AA000C65BB4D1A282D536D45B450B4944116F95
-:105AB000B5BF77ADB5F7C9CC393349406BFF7BC370
-:105AC000C7B7B3CFD967EFB5D75E6BEDF5DA3B76E5
-:105AD000D9C5E42B19FB027FA09CA330C60644CA9B
-:105AE00051775EBB687B09FCFE99DDFFB8166967DC
-:105AF00094173389B1D1F09E653056CAD8954EF8C7
-:105B000015DA95BD70EA0F97A531B69F29CC018FA4
-:105B1000C26A59EAB7A09FFD9F333FBE975F706787
-:105B200075B8F1BB2063E98C5DC1F877E16C2DCBD2
-:105B300057881526E373DD49BF433FB99BEAE0FB75
-:105B4000B39FBAE97B2B1C46C93E9759587CF34555
-:105B50000EF6AB7EDC5120EAD90C066702DE2C1A69
-:105B6000D780F7D0DBEF11BC075480578B33BE13BF
-:105B7000E04F8BC0BF9F5D9BC40A39FC7A6904FE6D
-:105B80000B8587E60F786EACD7BE9997CFD8BA7AD7
-:105B900046E5DA7A2795ABEB7DDFCCB331B6B23E82
-:105BA00083CA46153E01381AB7B0501050EF2E8404
-:105BB000F646FFF03F21CF69AA3BB37CA6BA3D0D64
-:105BC000FA2988D455B766AA37BA2739036E1C1F3D
-:105BD000E6EEC0F19D5402984733001F978A79BAC8
-:105BE000B4E02C06EB91E7B66B2180E352F782E933
-:105BF0006C24B6CB27BCD9055E9764367420BC1FD5
-:105C0000433B06F31DE69EF23EF332F69FD94FF07A
-:105C1000796C606C203C5FFDEF751D12F4B732D3D8
-:105C2000AE35407F4FC0F86B1C5178DCAAFEB9033B
-:105C3000FA74C23FC4E3D08DBC1E9937D4A3E631B9
-:105C40008C45BDCF8EF473A1FDE6379BEBD67EF37A
-:105C5000347D12D2ABD16F3EAB68F0B9FFF7F67B63
-:105C600029E03C3525D2AF314EBFFD023954C0B7D3
-:105C7000F91B59289C1D3B4E9EE62F0FC2FBBC8D85
-:105C80002A0B65F3E769C01779FC57D6E49B94109B
-:105C9000288C8587458F93135997BC34FB1C19E8D2
-:105CA000292FE3FA4512D25573D4FAE63066F0CDC7
-:105CB0008FEA7D4C1FCAD8DDF505546EA9F7E9C8F7
-:105CC0002777FF5D99D55218CB8F7F11F2EA1E1B03
-:105CD00023FA0B3ECE428F4BD85FC5AC39505F3FA5
-:105CE0002ABDE82E8D885C4679E61274BC5ED26EC1
-:105CF000C8C1F6AF280CE5A0951FEEB6E9D3B0BF3A
-:105D0000B5A364A901F19CC7F921CF1676E662BF5D
-:105D1000CD39A382D88FFF55E287BCFC4B3405C632
-:105D20001D9627F861F4834E94873DF35F96AEE7A6
-:105D300015339664A103DF79D2816F42DF74F07569
-:105D4000F1C3D7475FCD7DD2D77AFF7DEF3BE0FD32
-:105D5000963CBBA664C7C295797138A3C21D4B6F30
-:105D6000797982CEFC7DD399B57CB03EC4DE011A30
-:105D7000BABF3E83E8EEDE7A8DCAB5488730EF07BA
-:105D8000B0E958A8231DE2B8D71551BDD77D8BAD1A
-:105D900020BA4C9FD5CC50FEDE8FF4390E875BA91C
-:105DA000EB1360AE79A20E5BA40C7BC0BDF87E1035
-:105DB000D575DCCAEE928CF6CF0675C0778A683F3F
-:105DC00075C5B3C146F8FD7E17AF5FBDA2530F6620
-:105DD000457D1F5CA7EB5991F6500F4F52A3FAC3B4
-:105DE000FE0BA3E13948ED8DFEE6AF38A10701BEF9
-:105DF0007B5DBCBFB52B8EFD53FA5F2B053240B5E2
-:105E000060AB2CFDACEDA9DFAB231E8C7172A45FDF
-:105E1000E8C1E8F7C16774DD1D797FB9746F10DFE1
-:105E20006F64157912AC43E6F48A0C06EB6FAF6829
-:105E30000EE296DB039FC077647E0F12BCAE0CFEB1
-:105E40007EC48ADFEB8D51EB3369C5CB4184D7D05B
-:105E5000731441AFF20B594B8F00BD2A49763FE9CD
-:105E60001BD701D364C278B32A980670C969150C90
-:105E7000E58192A6BE1BCD0706FD019C6309CEC934
-:105E800015B37A8133180DA701477F701B70F44E4C
-:105E9000A77C7C2B3D4DBA66CCEF26C0FE6D6FB75C
-:105EA000F9515D48453C4157ECF35B8336789E3AA7
-:105EB0001370ADD1BACD62B9B1FDA64D1FC4425128
-:105EC000FBF73F7A5DF3B0CEF116885E5FA8CF9501
-:105ED0000644F03856B4B3D29F313F5BCCFCAE35AC
-:105EE000CD8FA9818C0A4FFFF3BBD7E59F55E18E7B
-:105EF0006DF75B49A2F1274D19F36DC6C7630E908C
-:105F00005FC9385E5164BCE469301E76A636C71D91
-:105F10002F65328CE7FCFAF069E547035E7B0CBC29
-:105F2000B79AE05D6B03BE8DB3FE5F37BCE7CB7FF6
-:105F30002E90BFC47F797DF3DF3FBABF64FC153E6E
-:105F4000F94865E12B015F775CE524FDDE9073FF86
-:105F50006C7CA5E2A7B07E77BC547CE24A192B404A
-:105F6000D72322E3D74A1AED57BDD1776FF3810DBE
-:105F7000D6D4CFFFAFF9F486D7AF5B0E9DAF7C6D63
-:105F8000783D81213FAD2C642107F4B1B2ED2AB2F6
-:105F900037571E291BC8A05FDB9AE14C8749256350
-:105FA000FFD0DF4A43CF985CD24FFF5CCF00FB4E5F
-:105FB0006F02A56BB7B782F4A29512A3EFD783DE69
-:105FC00016023DA6E4950DCE3958F7EF70CEC1719B
-:105FD0006D8CF4E992570EF9CA80CE5D23524629A2
-:105FE00040022B5DC6F3A3E5A8E7DE55289E7B782B
-:105FF0007FF0BC02DB2788F6BDC1959007F044AD69
-:106000007FA2BD395011477FD76599F0F390D0BB7F
-:10601000EE46BD0B047262424B00F56A57BA5D7BD7
-:106020004C8AFDEE265912F306BD0DEDEC115332EC
-:1060300051CF3A30E389157684AF90915C77E5854E
-:106040007419EAEE02CEDB0F59F67D37AE21E95D19
-:106050009952994ADF99EA77F7E831D913516FF3EA
-:1060600016F0F7650D574C6C8C7ECFFC1371FF3525
-:10607000DE071A4AE97DA6B3E2D804183F13E468A4
-:1060800023E02B536D96EA685DD3E2EA8F1BE63B73
-:10609000678500860D331ECC9E1F673F81D534F186
-:1060A000E9A079663E7B48E0EF6E81CF4CE4F5D104
-:1060B000820E41BEB978D31EF9E61ACAE55B4241A9
-:1060C000F30AC4F7A079CC8FFAF686194F90DE6AEE
-:1060D0008CE32A30CBB94CD53CAFAF6B3E1B99FE5D
-:1060E0001D7974EFFD5BF96C230BDC8AED33C57E03
-:1060F0009E5010920285FDCFDF3ADFDEE6FD2DC413
-:10610000271FA74E1E103BCE3F0B2F996E18A7E4FA
-:106110001F3F4EC23CB3BC3C5FBCC33E20E88C2951
-:10612000B81F58EDAB84129FC464AAB6A31D4EF2EB
-:106130001BE0F6B0E6F24B80DE522B56DD2E83DDFF
-:10614000EC79EBEAF7D1CE4EED9843F676536151F8
-:10615000DB246897E4F7CD984274CA08CF6BB1335B
-:10616000E2BBAA1513615E8D8CF3DD66F996895C3E
-:106170003FD069BDBF2B70062BAEA950477665395D
-:10618000F1E66167613E6FE90B47ECF7BDCDDF16C5
-:10619000F94EF8FF9690DFB4BFEFD8743BF9118346
-:1061A000F00FEDD2644B3F49BA3DE2676488A7A87F
-:1061B0003ABCFF6D0F5FDFFE4F19CFC7EE736A4029
-:1061C0000AB63CD987F67A12F325AB2867278342B3
-:1061D00000A2D897D61D94B5FED7A589B1F29642F4
-:1061E0004E7733A2F4DC0E99EBC969332767AF848D
-:1061F0007ECF9670BF70AA0FFE17C5CE671DEC6BE1
-:10620000E1283FC7BAC2C7887F1B819E72802F8258
-:106210008532F9B7D7E6EDF045F3B5AC18FE6D2B36
-:106220007D304D2D15FA1FE047C99375D7C8AF4E85
-:106230001FCA97A48FC4E951DFB10B5FAF24E5C239
-:10624000E8E3AB8E67AC6B2C5F71FD246DE63C27F9
-:10625000EA3BAB326626C593B3BDAFEB7DB4AEA8C7
-:106260004F84E2F49FA64871FD39567D9EB1A5A6E4
-:10627000F5520696CEDADCD7BAA599F161F4EB5A5D
-:10628000A668FF85C24BF5915FDC29FA5BABDD1791
-:10629000C4FDF32CEEED800FA5795418F53D96C79B
-:1062A000FC8FF326A487B8343D443A24CADDD208D3
-:1062B0007CF62CD9349E9A9660C2379B05DA761408
-:1062C000FCAE657682C389E3C1388A0F3A94D0FF69
-:1062D000CFC22E2FF548FDE1505FE462FD4E131D45
-:1062E000ACCE2A8ABBDFA9625DD16CE5F47AE7F90E
-:1062F000C917EB78D799E13DEFEFDCAAF66E1CFFEA
-:1063000071EC772A7BD7C01720F1961E7AE7EBB4A1
-:10631000CAC6F64849200F32AE67010DEAF80A36C0
-:10632000EB35588E453A2CF2915EB05552114E62C3
-:10633000690DFF737DBE10955BE84F7606084F8AA6
-:106340005B67D45E3B3F7DFF9CD0AFD3843E6FBC88
-:10635000FFA162A77E5556C1D06E3EF7F6D40CEA77
-:10636000578747A51138ACFD162A811F2A0390ECE8
-:10637000383CF801FA09584701F9B5F305CECE3D8E
-:10638000303389F5C15F0F59F8EB2189C3C92ACE93
-:10639000CFCE380763B6637B359040F1B29305C426
-:1063A00007B962FC27D6CF4DC0F19FD8D8379F1BC5
-:1063B00070FCB4DEC9C2A0A786EA7D541AEF43C2BE
-:1063C000DFBF59D831C6F3738A4C70EC137CFF845D
-:1063D000B32281FCE7076F9C360CF82BE7A8E24755
-:1063E0001D4F5BCB52FA1A3F3B68E637A6CCEE1343
-:1063F000DE656F4D9C71288A1F7FA178D2DE1D0E4D
-:10640000BF5CCE2E47FAEBEFFB73F5FA8C43F95FD6
-:106410001D2F9B85FD79AEF1772B48CF095F49FC95
-:106420009923E448CE3C2E0F72AB594843FEFDFC45
-:106430000B164D1F6099109E32AB558DFC4D4C775D
-:10644000CF81F743C5DB4C65BA8C5BF850D4BF50A5
-:106450008E6CE2FE73C3CF0FEB7E17CAB9CDAF29A6
-:10646000640BE7556A0DB8DE39EBCDFEFDC12CCAD1
-:10647000EF8EFE7AA1D7655AFCF85F751D3A701D44
-:1064800012FFF9EB105219D19D51D72456116FFF0D
-:10649000FB44D0A9B6E210B743C0F87B272A1E01FF
-:1064A000EB99829BC04F83F74D44BB35B886F9F317
-:1064B000E3C84B9B9A48746F637A7828FA0FE65CBE
-:1064C000DFB117E5D50466925F71E4864DC5EFD262
-:1064D000B8DC080567F2F27385E265F9EB5908E369
-:1064E0005B9337D4ED47BF5E6635B79B33D7042542
-:1064F0003BD473EA981F87C9AD64BCFD6C16D27992
-:10650000BCE66806D0CD104137430C7A5966A69791
-:10651000C17596B8D01A737D20D2057C37D0422F32
-:10652000D67E723446F1B8BCF5328F17CD32C77DB6
-:10653000F259F7FB3F0778F30FB9FD61161B6FB2F5
-:10654000F6AFB24001E265F70FDDFF590013FCD949
-:10655000FA49A98817902749244F2AE2DB3D31F4F4
-:106560006AE81BBDB48FC84FDEAEB7F7ABF2D39766
-:10657000CE0538D67A7446E307B349AE2B225E794E
-:1065800030F37A6707FA6DDC4524DFF7631DFD3CC5
-:1065900019970C8C96F78AF02319F546E147B28ECD
-:1065A0003755E57AF07B4C9F8A7818E50864605C83
-:1065B000CF9691BE730E8C67F381BE15E7BBB16AAF
-:1065C000029FAFA6FE2D1AFFB071FB481E32BE1F00
-:1065D0003377CA79E1A3440DDCA442199C04660414
-:1065E000D27F0E0B35E2FAD635F3FD2DD2EE16D161
-:1065F0002E8879053DED02D06E84A9DD3C9C0FB458
-:10660000D34DED2A62DADD26FA63A671F598716B37
-:10661000447FA4CFF5B4F3C7F4B754B4233DB0A777
-:106620009D16D3DF3231AE6E6AE78B69F7EF067CD9
-:10663000A6719979DC9EF7A576E33DF9630FE44FE7
-:10664000217A39943FA57C2E8CB3F4451B97115BBE
-:10665000793E874157FB45BB26A4AB42CC5B6163C7
-:10666000AA294F85E7AD34BA673A0351CF7BE8CA10
-:106670003DD317FFF95C537B758D8BE9C5F49CDA2C
-:1066800037FD5D11F1AA1F4C427FEBEA3459F8DB6C
-:10669000AE69D05590630354537D4D86786FBBA689
-:1066A000810262223E02B2F29B8551FCDD33FE3F45
-:1066B0000B7EE13F8EC03FDB02FF6C33FCA2EECCD1
-:1066C000E4EFD595B327E17C0CFFF2D9A6E50D41A7
-:1066D000F7FFE6F95559E65765995F95697EF69596
-:1066E00055938279FF97E6B7CC32BF6596F92D3383
-:1066F000CDCFB972D905AD9FB5DDDDB66692B76B6A
-:10670000F35F27FD7FAD88E326ACD41B56E07BE02A
-:10671000ED76EA4F23F93E8AE99FA33CE8EFBB47B9
-:10672000548DE482D323935C60F9F6507E36876BF8
-:1067300026C885E7541F97DF02CED72CF50F2D759D
-:10674000F8E56FB86FFA9861475AE47C3FFBDACA04
-:106750004CBE9FACF2F8E5E87D4D15B83938A094F1
-:10676000E44FA38FCB9FFD03843C4A837D8DFC4483
-:106770001924AF6C425EDD57CFF3D89A457E506343
-:106780005A11E1A759D80B2C9465DA370F4C9CD2DB
-:10679000867EAB334779DEE23A1BD7C756D6339DA8
-:1067A000E8ABDE49F945FBA0DF003468057D0FCB7F
-:1067B000E741DFC3724F7D0695BFACD7A8DC01E38C
-:1067C00062F94CBD9F0560FC6DF563A8FC31EA8B56
-:1067D000503E20F4C52BD264F2576CAE872D339F08
-:1067E000F4482A1FA9F78D5561BC9FD46750FD233B
-:1067F00069E6581BD9AD1D8D4900E7EE57F3285FB8
-:1068000069429A4AFB2F53C34A5249E4B981D78F50
-:10681000A44957E077E33264DECE196AF4C66F57B5
-:1068200086EDC664A8040F7307156F5ADC76E5364B
-:10683000C04BA95BF4E70B347AE2F7F72D6C57E411
-:1068400016FDA5698DEEF8FDCDC47147FA381E58C6
-:1068500046474362FC763760BB429F986F56584E5E
-:106860008C3FEE6C1C3725A53980F1AD2B6733D2F8
-:10687000476D69DA66292A3E141A50C164A0F39460
-:10688000D4E63A6CF78D809FE5C0F89AD7CF64A024
-:10689000679B1BDE17624E138F478DBF0EDEA33E34
-:1068A0008CEF4744BDC7EFA11C3B4B7C9F647EDF50
-:1068B000A397AF613D793C98BC646B32D79365CEAA
-:1068C0009FCB571E98847C9F6CE7EF7F8A75D4B767
-:1068D0009633431EF1F609FCFD8F8CF65EFEFE1723
-:1068E000A27D4A0A9FB76B8A338471B147BE7B4948
-:1068F000E6DCC2C87C2FFA5EC1B0B951F37BE47B01
-:10690000E332E7BA23F3B9E8FB1386CDEDC3EE49D2
-:106910002D977B7264516E25371792FC1CE5A820D9
-:10692000B9336A60A98EFCACACE770FD87EDAE862A
-:10693000863C822B88F2C680EB278BCD700DAE3162
-:10694000C3F5931A335C836BFB866B9D8DCBB5DEF1
-:10695000E083F1F5E8F11FFD37F3F8437E601EFF99
-:10696000D11F98C71F72E7571E3F1CBD2E9B6E3765
-:106970008F9FB5C43CFEA625E6F1B3967EB5F1FF28
-:1069800051FA78922D70C426F45D255AEFAC0B981D
-:10699000F45368F78A681754A2F5D840C0A49F4200
-:1069A000BBD76D42DF35B5AB8869F707D11F338D93
-:1069B000ABC78CDB21FA0BCBD1FDF963FAFB8B68FB
-:1069C0001794A3FBD362FAFBC080CFD4CE17D3AE0B
-:1069D0004BB463A67199795CF82950A19FEFB30479
-:1069E0003FFA47964D5E4371AF812C20A1BFCF97F0
-:1069F000CA461D82EF592ECFBF4F9EB2EC62B43B08
-:106A0000D7249BFD5CE9766E9FD9EC0A95BE44566F
-:106A100047F900CE60E68CA87C8B6A3BDFCF7ADE3C
-:106A2000BB8399D746BD1F28BE5F23E2D469F6D247
-:106A300046942BBEC1D03E8EBF22538C6BBC67697F
-:106A4000FE761DE0DDF8AF3347A3BF2832AE8DB729
-:106A5000BB588C9B151FAE35D97CDC45386E213E6A
-:106A600037F48B6026E1D7C74BE3F9839EEF49FFEC
-:106A70000578593DD9292B49F07E3DF76F1A7EF6EE
-:106A8000647B9D13F3761B2F92D963D82EAB6F3F97
-:106A90004E53BDD9DFA9FA2A74B4F70655FA8A1401
-:106AA000D6FB770F97CBE5F1E20DA3C5BC9A2A2759
-:106AB00035E7C1F8EC90D96F0B84CDA2F3610A954C
-:106AC000C0687B3CBF6D538129AF3E7950DF7EDBD0
-:106AD00046A15FF4CC033A8AB77E370AF8D8C602DB
-:106AE000939E959C3293F4ABE486AB9DBE38DFADAC
-:106AF000B5F4EF6233756C9798D6CC64EE5C34E9EC
-:106B0000614DBEC7F83E94093209E33F693BC2C8F4
-:106B10003F674BF8790A3523149428CEC1E7896A78
-:106B200025FE24AAE1A00CED076D54593895B1FB60
-:106B3000E5C08D881F575E33F9C7549F2E219ECE26
-:106B4000D94257D379025017E3E57FCCB3733FF0B6
-:106B5000C3DACCDF65C759C7DBEC9A492F1DF4A90E
-:106B60009D858B7B6F1F69C7E1EAA1D30CA04FE421
-:106B70006F8DD3E9ED8ABED84EFA5A968FFC8E8679
-:106B80007C35F85FC4B7E78E61E247BBE10F308F19
-:106B9000DBDA6C3CBFEF73681D15F7B94DF8BFE643
-:106BA0008A78F73C56E1C597A7995C8E7C759ABDAB
-:106BB000EA2D8E5AAFB5763B1F678D8DFC5B463C48
-:106BC000777EB3CDE4EF5AB8D15C5FC066A6A35C14
-:106BD0005AB0C1C6F07CC76D167FD8BFE17C615E3C
-:106BE0000B59DD2AD4D38DFCA0B93EA662FEF7E294
-:106BF0005F3D528A7943CD769EAFF301D08B16C5A7
-:106C00005755EE901DEDF97776155F3F9EE1F7A1A0
-:106C10005583509E26B3B8E78C6E5D6386AF3FF810
-:106C2000ADF032D640F0F60687BA558AEBBF7AD47B
-:106C30002E99E244CB9CDE910CE4CC39172F7BFCDF
-:106C4000297F74917CDF27E80836C0CBB89CAFBBA6
-:106C50001CCBFEBE3BD8CB778B9D1D76E48F5AB5FF
-:106C6000AE5C92237126872DA00F86EF6C7B268663
-:106C7000073353BB35E7D9AE4DCA39AF76E5721F3E
-:106C8000FD750A79F9C2B69FD9D1BF78FAA913D791
-:106C9000201F2EFAB5C29CD0AE739B8785715F50C2
-:106CA0004376942755BB94B871598AFCC3FC17FDF1
-:106CB000C24372A26A8723341DBEAFFAE53B231993
-:106CC000E0A1B3A1FBF060DC479F92787C34D8311F
-:106CD00012F7AD2A95DD122F4FEC84A0BB53CF25C0
-:106CE000CEC27595B6EEBF99FA6DB9C1E688920F1E
-:106CF000C7C4BE04EDB87FED4929941F477E18F143
-:106D0000AC534F4A1CBE3DB6900BE1DBBAD91E0016
-:106D1000386AB77E487454F68BED5EC443ED1EC5E9
-:106D2000E4F7ADDDAA841D23A93C8125C65124E0EA
-:106D3000EB1AC6E563CDAEC5E40FAF6959F7A1E222
-:106D4000C5EFCDF40C78F18711AF6F28FEE958DF5D
-:106D5000F973AF06A8FAA0FD712FE215FA9D634FF3
-:106D6000C278AED98F8DFD7F9A12DB1F63DD76A4CA
-:106D7000AFDA96B57C3C0BBF7C80BF64C6C64F9C27
-:106D80000E4B1C6B6BEA79E9898BB69F7D3408E367
-:106D90009DDAF1D74783B87FFFBF8F1EBD13F59AE9
-:106DA0007D2E1FF27BED53AF7959D43E98E3E07C02
-:106DB000D7F9E4CF9F7818F8A4F3B8838EEE75EE78
-:106DC0007D6F8806F3ED7CF6BFD335687FC7DEABF9
-:106DD000C8EEBF6377D9C0BEF643A4D350F43917C9
-:106DE00091C7A4ED9150D902435E94967539B84B82
-:106DF000612E80F3F4314708F39A6BE1D9B2225C3B
-:106E0000A7C5247FB1BE1CF05BB36DF587CAC878F7
-:106E1000780E0E9631C79E01BB64E03A5FFBED6FC2
-:106E2000946069A338492DEB26F969FDAEF628ACCC
-:106E3000E765BDAFDF59F6B91D8378B5DBD6F271D2
-:106E40002DEB771A7F191BBB7EBA65FDCEB2EA9F88
-:106E50003E8C2F77A5C68DE71AF1AFC5BBFFA54FB6
-:106E6000BDC99003FDE1B752E270791C7A8503F940
-:106E700069C7D34F3C9CC6D7773A20A473FBD9216E
-:106E80000CE8E3A4ADFB66948FDD7B1D3EDCCFAB4D
-:106E9000F6BE41FCD5B9FB15BB46F291B925D0131E
-:106EA0003A59CF4F3BEA0D3512AFD46EF1841DDE57
-:106EB000C83AD58466946B5E7A7E829E8738DDD729
-:106EC00084F65F27C559B7D58E1C2E8F433C696F5A
-:106ED000F1963FD899DBBC9ED2185CC71353F0796A
-:106EE0006FEB68CCDF87F3BF3C6A3DB7707EED8DFA
-:106EF0002F3B373B54CC4730D6B7D3C6F5FDDA909D
-:106F0000F4068BC3AFC6FE76A1F1D00687251E2AF4
-:106F1000E6DB1F3FF73F8F0BC3D3124CAA1C1D8B20
-:106F2000AF539FC797EF8F382401475DF9A0DCD896
-:106F3000FD496515C1C1D911784F8973B3A79E5218
-:106F4000424178BEAAE520C969AB5CA8E9454F7EFD
-:106F5000C6186FCFFE9128BF4E1D788EE8B066DB55
-:106F6000093BDA4787B7EEB4771446E81EE57F742D
-:106F70005EE4A967F68F24398DFDC7599F5F0B79B1
-:106F800057DB6AEEBF76DB87A6FE17055BECE417DE
-:106F9000ED679C0F54FD069CEF07ED368679F71FD1
-:106FA000B428E5F1F49B90C366CA835AE5293D866F
-:106FB0007E4525C5AEA1BC6B5AA1BF11A4738F3607
-:106FC0007EEE51D58F39802F1B93ED1ADAAB4D9E93
-:106FD000EB991625B79B2DF8F4A5F926625CCD3701
-:106FE000B9A224DA7E32E04FD66513FC7778CA075F
-:106FF000E27909B4C3344C3250FDE45756BC53CA4D
-:10700000713E8A4FF6B9E2EECFBC3FF4B721FDDB0B
-:107010007C32D3A2E86B54D9F5C3D1D5A632CD9436
-:10702000BF7AEF641EC735E67FEF456C1303B97B6B
-:10703000AFD4DD86F9ECC1AB795E201376BA17EDDB
-:10704000F4EC587D8EE9BA86F287C40F6FCF7423B3
-:107050007F147EBE0FE0C898BF23FB4999FFBEA2F4
-:10706000533E8F1DC7CD45FB2944CF135998EA8A5B
-:1070700093CB1F0FABA3E749ACA319CF30BDEDA84D
-:10708000F8D401CFEF2B4F9138DC61CAD74816E313
-:10709000C88959997DF13F9BAC9E8AF6FB38D8266A
-:1070A000B24BD0EDF8456A040F463E9CD1EFBDAE21
-:1070B0000912EE3738BFC178AE479C9FF7F5CC5721
-:1070C000A7FA00A36E19075BFA4AC5164BAC1890D5
-:1070D00054056F0D68263FC720D64265166BA73250
-:1070E000C5E9935482EF2DF24BC9ECCFEC8B440BE6
-:1070F0007CE7A18F9F93F5E301281B6DE2F9DB9EEE
-:10710000D0E350DF90CC4CE783739D9CBF2F77CAB0
-:10711000865F26106D7735B26A9ABB2B8D1F63315F
-:10712000BEBBDE1918EE8CA227C5DDCEF3BE84FDF2
-:107130006BD8EB5729CB29FEBE3A83DBD5BDADCF4B
-:10714000CAFA0A935D6D2D9B0738E76C66043FF71A
-:1071500053494E7E7E59679A2F9AFE605C67697428
-:107160003EA3AE937D2FDEDB607AF8D28178546245
-:10717000E96F06D2DF68A4BF0ED14937F9296E57EF
-:107180000257E37C33F2EA24FE3C2071BF97AEE065
-:107190007CD345FF72627566A08F79B259401F514A
-:1071A000792D1B84FDA8AA4C4D284278368975B7E5
-:1071B000D2A5393FD5D0D7DCA2E6107972BF2979A4
-:1071C00095CEA3A8696ECA4F719734DD8EE77C55C2
-:1071D00056E743F9E936F24FFC3C9FD0B08B5D0592
-:1071E000E63C4E87256FD526ECEF983C6EB1EFDE7E
-:1071F000830FE2E8C3D67DF77667FC3C2436267E13
-:10720000BEA0A1879D2FDD5BEDC86A67FB611ADC1C
-:10721000A7539EA52AFC0D13AFF3911FBC6B9BC413
-:10722000CFAD59E8A86B47D2489487C8BF78CF45FF
-:10723000A2782E6DDBBF1FF5A6262FD3935348CE21
-:10724000694A2E9E971AE594A05CBCEBC3977F8D8C
-:10725000FEF55685E1D6DCE536E2937A322E5622EB
-:107260005B6F5ADF0B9D4F6C5C91F3DB129FC16F1C
-:107270006EFAFECC3689CE4F296CF88FF1FC436D47
-:107280009B8D85E0FD19C6FB3FB389EB030B5F8443
-:1072900051F03CA8181FF7A5E8FD23B53C8169D142
-:1072A000793C41BD1DCFFFCF13F8185091627AFF92
-:1072B000D7B9E56DE49F09F07B0006CE1A64EA6F4A
-:1072C00091B27C2825E1093F8606FF90FE8CF99F4C
-:1072D000930376BE4F542485499F01FB17ED86909A
-:1072E00044F94A567F47CD1E89F6A7DB607FC2F37B
-:1072F00038B7852CF6A3258FCEC0B7952E0F3985CC
-:107300007DE066EE5EF0EA0F97507C94F86AC98BD8
-:107310003C2F6CC976294479CC1D439318E159213F
-:10732000BFD17BACEE41D83922F46BC19B23C38C17
-:10733000679766C673628119AF1EBF198F563C27C7
-:107340008DC931B55FA454DB89C8049E0BE01FE2F0
-:1073500019E420CDA306E611D662F159D97AEF2AB5
-:10736000F46FF48B470BFE4E59F07796B5EEE76F4E
-:107370005985339D589BE69DA986897FACFC66E0C4
-:1073800029CBD73E919EF93DE42FCE109D48F3F8CE
-:1073900077839C2D9C798AFCC46F467E7062CF7E79
-:1073A000F90EFB02CAA5330E9D98CB62F96B1396BA
-:1073B000C0D72DF54EDFBC7C8C4F33DF3C1BC6ABFA
-:1073C0007D54C6D947A97FA047DA0FEEC1B8641A29
-:1073D000F2B54AF12B5CAAE9504F6CB5F9D06F7940
-:1073E0004F51F735A8B7D7CEE7798E372770FFEB27
-:1073F0009204BEBFDA12785EF35D1532D3D1BE6F50
-:10740000554212FA8B7CFA8B57A2DED56AD3685F9D
-:10741000F375BFFC1D7A5FECC3F86EA6DC3C0AE195
-:1074200080F6E46FEF6A7DC77B6B94BED3B9E7FE4D
-:1074300061B8EF3C24B3CA787A7CBE8BC3D159F0D3
-:10744000E77424C7C5CE6EB2A35777D455E0BC0C01
-:107450003BC2BE8BFBB76AF6CC207DF2D0027E1E0B
-:1074600073F7297E1E738A32FB9B23A03EF6359567
-:10747000CB4DA64F9F93CE5328701D3760BE24F28C
-:10748000C17FC9A106C24FF3EF314ED5F81795A1C0
-:10749000FE5852B780F69F5F7BA7B46159AAB71414
-:1074A000235F4F6E4D9E88E7646ADFE27995A3DB28
-:1074B000CDFE1CA6541F443FD8D9637C5BBEFC980C
-:1074C0006AB5BB14DC8FC776989F8FEF876ECB5C55
-:1074D000623FF2B2F40BC98BFD91AC4F73917F9474
-:1074E0009FE3F2ABF1EDA74713B87D037891504EBF
-:1074F0007575337F03E0A96BDE209A6FD7C7FC6AEE
-:10750000A6AECF95F278F6D12D2E4E2F0FD979DC7D
-:10751000F6A105EED00A98C781055517A35DF4C9F9
-:10752000BF052E8E17A788D8072C49A63D4F4F625E
-:1075300063902F9AF8F932D69C19EFFCBCC10F0664
-:107540007F187C91B9202110CF7FF98E8BCF6FD21D
-:107550008202CA83EDDC27518CA7B301E0EA038FD6
-:1075600041D63018E1A9DDF311F9179CADF1FDD03A
-:10757000F5784803E9B621B8623CE0EB7BC0D44122
-:10758000E4077B7376BCFE836C03F99B16B834E288
-:10759000B74E27B7A399DA9C39D3837C5276F52A64
-:1075A00080F361E03F24F9876C7E823BB89831F22A
-:1075B000AFAA9CFFB3AE619BEF8AB2B7D6BA263EA4
-:1075C000E082FE1E70F178476AC02F21DCFEBF9F6B
-:1075D000F362FF5D9F3A68FD06093F8FF15D8BC046
-:1075E0004F5982FE23FC9E55A69130F407BCBE790C
-:1075F000B0FF5FB607F01D27BFCBD077520220FB4C
-:10760000009E14B74CE756D0DE427BA296193F414C
-:10761000523E0DFEC34366783ECB90B752AB14F694
-:1076200080DC2C71BAC3E84F49A98479633C8A395C
-:10763000797FED667D14252FCA5D94013C599EDB50
-:107640003B861C36E477533297834DF7AAA146094F
-:10765000D3DF3B5CE83FCED6B549985A95A26A94F1
-:10766000E7705125F3075148E63E92DCA3F78C679B
-:10767000ECD9BF2B71FD1B275DDC1E294B08FC0AD2
-:10768000F135B2ADFB00AA4F7E174BC5F59E22F433
-:107690009BB1A7B93C32F2FA6B85BD619547CF012A
-:1076A0009DA3C018FB0DBEEF8D3DEDF623FDF4C884
-:1076B000A10553681F2D6A2D3E88F939456F717EEB
-:1076C0006442FE80F54678296D0B2A880FABDCE911
-:1076D0004FDE18F2C4BACEA05CF7D4B30029C56D52
-:1076E000C06751FBB7554E1D7389FD55C8A9B36CD2
-:1076F000C2C0ABB4083D152DF31F7444D18F21A730
-:1077000022F414223AB48E2331674FDD978BF2E5D1
-:1077100088827E90AE893C3EB942F051F2C7A1AB5F
-:1077200071FE1B5AA7BA90EE77B4953991AD966465
-:10773000F0735EEAFEEB824C904F745CD7C69C1AE5
-:107740009E291F0F2B8FF8507C508F9AD79966492E
-:107750009C73D492AE8B733F82512EC9E0E7B8760A
-:10776000B4E524713B334CEBDE43F7C20F61F08587
-:1077700041EF56FA36F8A19171BF84A13F28528B90
-:10778000B00BCD7E8146C3CF1174519CF80EA10F72
-:1077900036BA2F5937017E6D0A4FF2615CE20E4F07
-:1077A0000EE533DF3180E3CD8A07A3ACFD14F4C3CB
-:1077B000A8BCF35AB59BFC5AB59FDA4DCF0DBCF669
-:1077C000860F03AFE310AFD297C7EBA7B8BEA36392
-:1077D000F1FB65E79DB5644CDCF372FF57E63D9E17
-:1077E000057EDD4176173FB761D097212F4A976E0E
-:1077F000CC24E26837DFEB65C891317BEA0EA28AC0
-:1078000068951397B5B26B114F63C32AC3A32EFDBE
-:10781000C98D8FF1974C3A7F716302F0DFA817662C
-:107820002DDA068F466A2C753A0035B25D2539C6C9
-:10783000DACF2F0ED512FE381DFD8B865E1A8357C8
-:10784000A1971AFB8B11075A9710A8C4F1A53DC048
-:10785000375ECC3FE5F6EE5A57605102B44F0498BC
-:107860001330D7AE209CCDED53335FF6C687891613
-:107870003E6B01BCD03904D8E7F2A558388CF1F33F
-:107880001292399C406DA8BF6495323E580DBFCF0F
-:107890002E6B240BE03E8CC736719E6B85FE759770
-:1078A000A55CEBAA68C079D9541674147D79B80D1B
-:1078B000BFE0BA043D88F87096EB348FC13EE647CE
-:1078C000BD7EB0DA22F9018E946A4DEA71D618FBBA
-:1078D000379EFB99AE4D44BA189CC7E83CEC60D487
-:1078E00083E2ACCFA6041EAF5DECEC388C21F3DA5A
-:1078F000E975E5DE3EE2D3917B06FCC24F65CEC35F
-:10790000E8DAFBC64518977CFBDF3FF260DCE94F05
-:107910006AB707E13CB9FCF71EBCBFE5EDE5DCCE7C
-:10792000B8D9A2CFEC14F84B4EAC780AF1774BFDE6
-:10793000DF4BA3F99D2DE37194DB420A1A9D3DF4C0
-:10794000BD686B22F9E68CFAE2965453DDA0D3C5EC
-:107950000E9E27659DFFFBC28EBA6DDB66FB600D38
-:10796000C70FB422BE4F0A7DEDE42E0FF9330C7819
-:10797000E66E1B65473CFCA9D521E2F0ED368E7F13
-:107980007D3AC6CF026229AC701EDE9748FDCD7FDE
-:107990004021FD620E8CB50CE83BD07A1BD9D9D6BC
-:1079A00079CC7F5B9B3210D66FFE5A89F4526CBF44
-:1079B0001CE821B06C35C5D9ACF39C13B4C6339721
-:1079C000939D6ECDF398C7B47513B2E3E47BB4F224
-:1079D00038F9C27EEC9A3F26087DA1945D8EF9E8C5
-:1079E0006759E18F0AB5FEED9A93F58C92B43EA8E3
-:1079F000775279AADE47E553091A8F67EFD97F9846
-:107A0000E84B6D2F457EDFD1F64EE24D5A446E5F56
-:107A1000B1F9A3833F817A31E3FE1BC33F3E5BE0B4
-:107A2000FB4A21BF170A7DA0F8D3BEE5F76C9CEF97
-:107A3000C858780DB93D1BEF958DC28321C7ADF8AD
-:107A400038D3969B887421255AE3C05F0D2FBD7DE6
-:107A5000B758899F3768F0CF53C21F306FCB8C5512
-:107A60008360FCC6BDEF0DE1F702B3A3281F0CFA3B
-:107A7000B4D21F637576E4E71E3A6BBD9BF063D00A
-:107A800005F05186883F66A0DD67A5B7FEF2893A0A
-:107A90006D1D43500E58E9AB536271EF154D4DE427
-:107AA000FEF2799A3E05ED50D85E56F1381D973FAB
-:107AB00027D5E6C377227F6EE1FCB1F857DB7F89DB
-:107AC00072A7EA170F7851EEBCAF36A7E378D58FCF
-:107AD000AFF4629CFBA41AF4E2F7EF8794B87985BF
-:107AE0000B1325E10F37E72BB035C16B906F3F7952
-:107AF000DCE6433F43ED56078F83EFE278833A8F0E
-:107B00007FEF8A9FAF50F5F307D2359EC76ACE5BF1
-:107B1000D862A3FC13F497E130BDC5717BE2C22D9E
-:107B20007DC7B76B77AD8B9B7762E40758E9F606A4
-:107B30000BBD025EC88E09023CE4161771EBC62726
-:107B40007F3CF204C0756ACB6FBD5261B4DF9CC745
-:107B5000C7CFB4DCFA530CF1F446AF9D82BE237A52
-:107B600043286E1E43B52DEC453BBC7AB38DECBA71
-:107B7000EAED0A73623ECB7107EDDB8BB6FFE6F5EB
-:107B80007100DFA2676D69D3F934285FC158A79EE1
-:107B90003C12B12E553B7FC3E3BD9AC82711EBB30E
-:107BA000E8D9FD76CC8BB1E2B1AC65BFBDC3928F95
-:107BB00040EBD472620A9DCB7BF29C1DF7D3F7F7A2
-:107BC0004974BFB2F5FBCACDBFF1A27C403C515C09
-:107BD0005EAC57EFF942E16B9E2FA176E487EB6D27
-:107BE000FDC6E0DE3A9AE8FB99E761FCCA371D94CE
-:107BF000AF54F9CC52CAEF794FADE374FEC8CA74E2
-:107C0000DC5F2B6DC1741F95FC79E5A3DF25FA5B62
-:107C1000F8CA77D3F9791E3D93FB6D829938BFF985
-:107C20009BFE85E6B7800588FE2A1F512AD05F7229
-:107C30005665E5CFC6E1933F093E79EF310706511E
-:107C4000D97BC26F197C5511F7FE5AE349FCBE95EA
-:107C5000B3C28EDE95281BF71439A3EDAADA2DAB3B
-:107C6000DB717D3EB8481FE8A3B8BE1A14F89248ED
-:107C70001F7FE5AA81428ED13D31869E5386CFB1CA
-:107C80007DBB8DEE8B89FACE74DFCB1D627C803B91
-:107C900041BA0CCAF4F8FE4C8F5B32E0E3F92F06D0
-:107CA0007DF5C6F75B783EC9C747B95CC1BC187A99
-:107CB000DF6E0B0F34E5C3384CF78944F23D6C821C
-:107CC000AFCDEF014ECA57E9C1EF3E89E2AC0B36AA
-:107CD00038CC79703D7463BDE7C69CBFB2D0A26F4B
-:107CE00019A5552EBC69910B6CD3F9E5AF54DB4255
-:107CF0009477547DDC41F643F5765B05E2E3AFDB38
-:107D00000EBE7E13D0F95F5B0CBE35CB572BDF5612
-:107D1000EE18CDE2F1ED5FDD7E16976FE1795CBE86
-:107D20007547E2111AFBFAE4EBC25EE4ABE28ED1D6
-:107D30000792302FF783A7165D4C7E060B5E0DB9B8
-:107D40006A95978F246AFCFE8298BC3ABE9F47F2E0
-:107D50001D39FE0C7AAC7A7A318DD343B7065D1AA1
-:107D600074DB4B9E96158FD6F72FA23C1A10EBCFE3
-:107D7000084E620578AF5EA39D15A0FF392827F84D
-:107D80001FCF8E93D7C1EA86A29ED1E8CE8E9B9F4D
-:107D9000EB77FBD08CC573654ABC78B7BF4C8EAB14
-:107DA000C797B8B95CD98BB40065B59BE3AD49C43E
-:107DB00057C012A4BC7FF429123F257B899F6CF029
-:107DC0009CD1B94A3F9DDBF627CA1F69A08255B8EE
-:107DD000B5292AFA538BE5A5B9505FE82EE6F5F1EF
-:107DE000F2CE1CA8DFE62EE1F5CBE4621B90E61391
-:107DF0006CF494C950AF31E6392FC9E4DF50E51374
-:107E00000F62DC457D9EDF17B70EF8DA591489F74B
-:107E1000263A58D05584F7344209F555D9BF5F85C5
-:107E200046E00647E01A37C9A3491AE2F594CF495C
-:107E3000F932773C7715E56756BBB9DF78F8CEF1B4
-:107E400074FFEED730FECDEE01BD8FDF64E3FD9C05
-:107E5000DA31BC0CF13AFC62467E0803FF45AA46C3
-:107E6000CF5D2D78F494F83F03CF7F3426DBA99FB4
-:107E7000EA9EF53ABFB251E43528899C0E9424B9A4
-:107E8000EE5928978AF5BF43E0037FD05EEEDA3BD8
-:107E9000F0317EDF53F7105C5F4539F347D41BBBED
-:107EA000FF35D18FE757DE4CE0F8BA2169BDED52BE
-:107EB000A81739872C45A27E53DAF65D2CBFED0951
-:107EC000FC90E39F85B1BF9B6E56787FEE3A0FDE44
-:107ED0009F26E95C8F96806866031E1A75A6D97383
-:107EE0009145CDF9168A52D41DA6713DA671591639
-:107EF000EC83B04E378CE5EB0438A57DF18D31BCB9
-:107F00003E2B94D3D8A1111CF7201CA31CA18BD00D
-:107F1000FEB909D4224ED766FBDB88D3D7FE4526AF
-:107F20003BB356D21ADD50DFF91623B9DC99E015C0
-:107F3000F907FCDE19C32F31F6A5B965B864257BB6
-:107F400016F13C0EE18732E2E86759AB829389F182
-:107F5000535BE4E178B69EE4647FF1B19FBB457C5E
-:107F60006C101B7481F1B167DCE7111FBBC86DE8B1
-:107F7000F322DE2EF6FF334772285F485531278FF4
-:107F800031BBA6508A88F1DD2E8BFC35E878C451D0
-:107F9000DFAD88971147D92DDC5EEA253FE224A3A7
-:107FA000BCE6511D05941F61B3E6471C9329E1A966
-:107FB000F4C5620DF1D924E2C6171AB737E2FEC53F
-:107FC000FC514C1CFF796F39C5418B7DF1E3F8E31F
-:107FD00094D914776047F8FA19717CA6142A08E737
-:107FE000D930D86008E751F3DF01B93C2DA8505AC9
-:107FF000CD5BE6E7E32C74605DEFBF58D7FB7CF305
-:1080000020DEE7F7AA8D6223290FC226F2207EC95F
-:1080100002F747E7411878EC2FCFC49A5762CD2377
-:10802000C90C98F134B8F252D3FB8BEA8A4CF58B29
-:10803000978D33B5CF868D30BA9EBB669AA97D7E6B
-:10804000F34C537DE8C69B4CED8785E69ADE0FDF47
-:108050005AD5E7BA8F6859627AAFC8A162BC0FD20D
-:1080600058F7CBF6FC202E5D18EB6EE46961BA116F
-:10807000E27734ACFBC3D9E43F2A93B4D8F5F78751
-:1080800083B42F5FE8FAE77B843E7481FC3E0A8963
-:108090000DE3443AD713BB6CEE35A81727036C28C1
-:1080A0006FADFA4572EB0BFF2D79E3E55B682B9022
-:1080B0008EBEAFE86371BF1F20F2239B64719E7474
-:1080C0009293F4817B64F996E87BE4AFF0703972A7
-:1080D0008587FB557E02FB26EE9383135990F64F5E
-:1080E00071BE9CA1430AE6EB4D65E2FCF963AB2649
-:1080F0004FC078664781968C2205EADF88C8FD9BD1
-:108100001C5A23C60346295C8E837C9FE6198DFB8F
-:10811000CE721BD77F8236C4F360270B7A8B68DF61
-:10812000A3B866324B939614A2E9D5B3BF685F003B
-:10813000311CAC1A9E8476D0CB383406699D09B4C4
-:10814000FFDF68C8BDCA6124F7CEB87BEEB5A0F3E7
-:108150008E67E6E5D2F3E33703D701FF1CB79BED4B
-:10816000A2FEFC53959BEFF7A0FFFF780133E519C2
-:10817000547BB81D55ED5178BC3CF49774444BD7F3
-:10818000FCCF2E41A06BA5F65528A2576FBCBD822F
-:10819000F27677CD08A2FFCFF03B1BFDD4B64E643C
-:1081A0003DF707433F37BCC1FD5F377C66F6E7DE2E
-:1081B000E9E179D7778AF1AE87C20778BB1EEFF481
-:1081C000C6F2850953901FE0795882FAB7DB40F573
-:1081D00003BA9F11C8B6213CBF67FED7764B98AF54
-:1081E000ADD1F7D7B10A1BC2F5FACD8B3DD8AEA7FA
-:1081F0003FA39FC178A613F6E9E4A02D1DE8A7FBD5
-:108200001B12EDEB309E139F57CC1EBC12B70E63B2
-:10821000BCD759E0F46BB0DE33999FFA35FA672C7E
-:10822000C1240777542EFA536A0ECA3F99FC1F4B9C
-:10823000F63A48FE75559DDBFE20BCBF6570C7450C
-:10824000A85FBC59F5D92588971B372A4C83F50FB1
-:108250002504EEF344E1EDF8BC8F3CF81EF484C72E
-:108260001FC44DFE69079DF37AB3EAE94BA2F5EA14
-:108270004D9E893FF6E03E39E6FCE23D654F0D2319
-:108280007BDBA0AFDB047D2D797228E9834B3CE6D4
-:108290007B53963C9E4BE7894A2516D78EC47B3F7D
-:1082A000302F7D07D0159E23DCF729CF1FDF7924DF
-:1082B000A598CEA3B2C07684CF68BFF3E59B865362
-:1082C0005EE7B1B4F3BB1719E00BA27EC5389C2F53
-:1082D00009FE98D59A5A2CF4BBE7106F37FDFAC9FE
-:1082E000D37F40FCEC7DFAF13BB14DC9F9E18389C4
-:1082F0007DCC2FF000FB18D93F5D2CC1EF8863FFC8
-:108300003C2BF4AFEFCB3AD925E7E40A91BFCEED91
-:108310001045F667601E774BAB928878F3A2C16276
-:10832000C817D009BD78FFA2B83FDD09F6D9702182
-:108330007FDA3D1F4F69E27108935E5772A8CAA4A5
-:10834000CF55C03F94F7976F0A34E23D8DBDEA7573
-:108350006199ECE12FABDFBDF325E57DA787F37FC6
-:108360004B0197DF2DE18410B71B5831EA7BCFE03A
-:108370005CE0FDB464BE2FD8A5CE0227FC7EC6F318
-:10838000C9AA3559B0DC791C1F58C7BFD3C3DA3826
-:108390009DF6E87F872EE57F674E9C032E11E7A2AE
-:1083A00063EC49E02BBEC92698F4C7F0E1BFD13990
-:1083B00097ED29DAEFC6A33E0F7A0AF2BD4BEDB076
-:1083C00027C799DF2F517E027D8FF572FBC4B987D5
-:1083D000C7E19C9A4EF79EB97CBE51682F19ED4FAC
-:1083E00089FD66F1E13787D8619D4ECB47BC1847C0
-:1083F000A8DEBDC38B66F2658981242FC64B8EBF74
-:108400005AEAA37CABCD43D0AE6D09F3F8C408950E
-:1084100005D538F735D76E2CA64BBF6B36A652392B
-:108420000CFD09F0A836CCE7D9B9A731259EBD5D72
-:10843000FB1F7B07E1BA3D3D809F971AD15ABC10C4
-:10844000E51FC2620339F7D4A7C3A9BF4BBCD93417
-:108450003F185FC5E7209164BCEFE86961AF757EA6
-:10846000AA503BA3DF117B262A3E58CBC270F301F2
-:10847000B20F5B1D1AAEB36B0BBF0FCED5EA22B99C
-:1084800057BB6F2AB7E39279DC737B42F71FC5397C
-:1084900036FABB042E5F334B81FEB7DBF9FE380C96
-:1084A0001860873BF2DC18CFD5FA634A6A77E6F1A9
-:1084B0007BF55C6A33FB863B1AEF1EC2FB542FA789
-:1084C000ABED096119F376BA81261F23B822703209
-:1084D0001AD7807318E9F3DBEDDDEFE2F94B3A5F71
-:1084E000A7211C1C4ED63A5443BDC2E5E3F15B976D
-:1084F0004FF307A558B86A47829E0BFC764F038B53
-:10850000FC7D04CC634B88D49DC013DB739890072B
-:10851000C3564FCE8AAE83401A13F97EF63DC35739
-:10852000374D203B27A8A05D0FA52705E7C9F737E2
-:10853000BCBF604011C703FA89139DFC7D4F7B27A8
-:10854000BFB24475F376FE245FE23489F5DC676AD6
-:10855000F89DEE90C2EF5E89FEADF081911AC05297
-:10856000FDC2F344B78BE4D6074768782E31B000DC
-:10857000E9F5576FC90CEF47FAE049179D432E788C
-:108580006E33F9ABADFDAD3ED6701FE665773D2786
-:10859000699807DA65EBA6B8514DEB7B745E71EA1A
-:1085A0009E13746E4B490AD47947635EC48A32C401
-:1085B000DF58D6DC88FE3D908714A76FC9E0F2E350
-:1085C000CCD14B1E5B1185EF07BDC2BFDB1DB818B8
-:1085D000F9A655F0E73ED46FA0DC2DF4ACDDFB6FBF
-:1085E000CC8D3E87156407C81FD6C00E517EA1F101
-:1085F000BC2BA4D239B0E1AF3B6FD1A3E8AD59F0A9
-:108600007BB3182F3F29B08AF876FF9FED5E0DF3FC
-:10861000585B86A0DC6D013DACAF7CC65A0BDFF425
-:10862000E4B79CE4F771C3BA3625C13A3DFDFA9E22
-:108630004BF1EF8B00FC8CEEAB3AEE20B9B93B9BD3
-:10864000F3DF8AD73E198972EB93BD8B2E467C2DC2
-:10865000F3DA0C3A9F9480FCF42C233966F0632102
-:10866000F2A384F742713F4A21D239F29FBD7D1AAD
-:10867000F1DF6E7E2F04D039D13DD0B90FF58B429A
-:108680001FD03D7D3F94F8797BBBCCCF81831CCF3D
-:10869000A7FA24CA57D9DE3ED947FC2C036A8B902F
-:1086A0002FC307A89F16FADB75ACC4729FEB294C49
-:1086B000D21810918F7FF3703E6D29D092FC309FBD
-:1086C000444531F141D43EC9EB621F957F74D3EA32
-:1086D0000DF8F7C3DAC5BE20F4AE7D42CF65C7B84A
-:1086E000BC5F2AF6B225BF19F7ED6D30DF252F29C3
-:1086F0005CFE0B3A3920F4E043F51954C7FD428380
-:10870000751A0D25DE0754AAD7E19F2F6163CA9B16
-:108710000F6239AEA2A50C8F4C4D98D57E909F610B
-:10872000D38723FDED3A70F570CADF3DEE6098A265
-:10873000B8EB6FDD7F7C0AF351F701FEE3EC4BE809
-:108740009F6514BFA9207AEC8D6EBAA48E6BC6FB10
-:10875000410FBCA77AAA0A1B7D0D1206E0E3F57B48
-:10876000AA56E3BD803725E9C7911E97FB02C79142
-:108770008FBA5EF95B3ACAF4DD47FFEC4579BFCBAF
-:10878000AE0F473ADB9503F6401CFA3C2CE8A7A451
-:1087900097BC8ACFBCDC5EBA24C8D621FDD4EC528B
-:1087A000E8EF169CDEA5E8780EFB5D3D908E7ACE54
-:1087B0004916BC7E3CEEEFC2AE9DCFD1CEE6A3DE25
-:1087C0003292EECB30D9994C592ED33DEFAD12F900
-:1087D000272A2D7A48356B5E3518F78DD6CD769CD5
-:1087E00047D516F3F7D5A8BF8CC4B26F7BF533AF6E
-:1087F000D05F72592EEA2F403FE49FE87E4DF13F53
-:10880000C628BFA70DF37B9E96397E405E121F1AC5
-:108810007ACC569F7E1AF5CAD3824EB70B7BB47BB7
-:10882000BB44F9FDC3B6F2BCEB7127B5CD8CCF9F2D
-:10883000F2C22A851C1CA7F2F8C5B8A3B9140F1DF3
-:10884000A333F2872C68954288C74A43AF13E729C0
-:1088500060DB25BD6E2C0B35E2FD720BB74A740E42
-:1088600063D156B3FFBE7AE32B87D13C5CDC62391F
-:108870001F2FF0628D6FECC05FE2C4372E4E12FEE8
-:108880009C216C88E9BC55DBF99DB7FAAB387FFDBC
-:10889000AAE8DF68372189D34D8D986F754809891B
-:1088A000BF4FE9C6FCDB5B057DDC2AE8A39685EDBE
-:1088B00098BFBF78039F2F5B6F33DD5BBC60D7ED44
-:1088C000741EC14A4795DB78DC0D1048F19DCA4DF6
-:1088D000E6F755021F55167CD404240B5C5CDF8E32
-:1088E00085ABE57A5CDFC5DB6CF4F739AC709D6570
-:1088F000B3298FE81F0D9F759DAE33D6E95276A937
-:10890000699DCAFBBE9F2062DF98F5DF670F5F4A53
-:10891000F92E67DA72C87F60D087B59F29427F9EA3
-:10892000BA91EB99A7F794258E40BBE888EA97A007
-:108930009FE2973EF6E2798FA2BD0AC3B860576BFB
-:10894000F13A3CA7BDB32DEF5ABC8FA2E82595F6AE
-:108950008DE2978AE85E90A2978A1273298F424B24
-:10896000457C403FB4EF761DC9FB7D21CACFB6C917
-:108970002588E615478A12513FD8C9B83F427AA9DF
-:1089800024B5236A1F599CC4FD03AB32DEB907F539
-:10899000F7A9CFDAE8BCC9545BF7CB987FB0B34DE9
-:1089A000F5AF807AF54B731BF09E8AEA27253FAA24
-:1089B000D987DB97A47D07E9ACD5E67310BCDF3D12
-:1089C00080EF83DB247F3EB4AFDD7BD5F0ED98E70D
-:1089D000BDB9D81F7D2EBB2859BB1FF32A5966226B
-:1089E000D9DF532FB2D17E7A6A50E2CFE83E167DAE
-:1089F000F31494B3A79EDF69A77383DB2596011355
-:108A0000399C71F019BADFE397AF50BE42D9AE5727
-:108A1000283FA137797F3AA4B030D9DDCD742FCC6F
-:108A2000E2CD46BD83CE415408BDA966CB09AA5705
-:108A3000A1FE0FE3556D52421AFC7A70EFAF28BFCA
-:108A4000A1661BCF6F80F7247FAA307EAA45E87C01
-:108A50002EE3743057C89F458CDF33B4A8999FA389
-:108A600033EE4532E87CFEB639948716936F86F66E
-:108A700025C5219A89BE63EF1BE2F46DBD77C84A14
-:108A8000DF2D067D0F63C390BE3F99C8F3C33E79C7
-:108A90002521B110E6F3C98B0AE5DDF741E7B49F64
-:108AA0001E11FBFF99B04CFB93D1AE73CF47B48F2F
-:108AB000D41E3963477D754AEB87B40ED35BF74FFD
-:108AC000463C7F8B05AA116FDF6A4DF4219F4FEF63
-:108AD000E0726B5AAB23847EEA6FB196265CDFAE00
-:108AE0007D3F6F4A417A7982D38B21CF160A7C2E43
-:108AF00014F85CA8F2FB9EAA0AF73F88F9D0D318B5
-:108B00009737D35A84BCD964C66F97AD4525BA1937
-:108B100021B1E6ECD8FD6E11EBA0738F5D99C3E92E
-:108B2000EF4906C15E453DAC7A9B350ECEEDFA1A93
-:108B3000CB7E7A30C9F6A5EEC178C7B22ED3BBF989
-:108B40007E360DE809E3216DE18642947B067EAC1A
-:108B5000EBD2A6E526F575DEF965A1B71BF56F8B9F
-:108B60007B265A7CCDEE683BBCDCC7F5F0AAB14A47
-:108B700010D7B5C75EC93B38529323F60AD8299F50
-:108B8000250DE076CB28E8FA852C85A5A545EC9542
-:108B9000D519F74F2F4AC3FB23B8BCE81C03FD616E
-:108BA000BE80CA484ED56E7384D0CEF81F85B75AA2
-:108BB0003D008000000000001F8B08000000000046
-:108BC000000B8D576D6C53E7153EF7C31F8913FBE0
-:108BD0009A78662C34BB31F9202584DB109A40D773
-:108BE000F626A51D83141C58296AABE2B65BD90A88
-:108BF0004E5085281295B889A9D6956942DA7E54D7
-:108C0000EA56DD226D621BAB4C096A9892C8A1A19D
-:108C100025E990A0401BD0D659FC60EB9490C0345D
-:108C2000D24D95D873DE7B8D1D12B43A528EDFAFD4
-:108C3000F39EF39CE77DDED75D7DFFF29AF544DF7E
-:108C4000EDBFEECDC2C6FBA54709B63A94F069DF89
-:108C500020EA20F2449A60FB242343B0ABAF7B139D
-:108C6000254423558B4209CCBBA1EAF335B46FF1FF
-:108C7000E7E1BCEDFA52212A23EA84D5CBF2FD9D2F
-:108C80006AD6CBF33BFB25D386ED3DF99F8ACA52CA
-:108C9000A2C981E98AE760576832FE71FFF796A89A
-:108CA000D877EA928F6295D8D8322FD0FD442F9290
-:108CB000F3D9A611ED9987F6F04BEDD4800E697FBC
-:108CC00039B5C0AF878C0CD6755E540C4B47FF0985
-:108CD0000F513351F7277F1A9E1721BAF6AE64F869
-:108CE0007467FDAB8D683F6FEF9F87F9377F27195A
-:108CF00016A6BFF84DA287D0BFED4DCF95ACDFD9FA
-:108D0000EB96F89FBEB217F39247FCFA1B687553B7
-:108D10004F39616E0FED1736493FBBAE04E1AF2FFF
-:108D2000E5655CC82E581F23DA7E78A6BF24A9F912
-:108D300036F2DBF397D68EE182F1355A69E46A00A8
-:108D40005FEAA8EE96C2F1171F90B0FFE488A2F97F
-:108D50002481DBDBDF2AC4E734C058C0FD4526216F
-:108D6000CFC973257611E6FD731FC66A89C6F7C1A0
-:108D7000B90F7E5A148187BCD2B14B06DF8F713D8B
-:108D800019FFC452A23F0CBE7F2FF30109883A6C31
-:108D90003F8C798B0BE24E23A88238119791C17ECC
-:108DA0005D9F2A06DC735C35DE483EAEE36A3668BA
-:108DB00014F0637A9FD9315C8D72492745BD64698F
-:108DC00058D8DBBC39A1C4EDFA7C1BF96C35B1FE77
-:108DD000299717A44E45E388F3590D45043FBBFB83
-:108DE0009DFACA038EC5FE9B8971419BF79F35DEB4
-:108DF00066EDE0F19B9501B218B72FAD766EEF8E60
-:108E000029F406DABB3F79A9960AF6278E13F5ED09
-:108E1000F24C4599B75DE764115FD7B91BD12AB40D
-:108E2000D7D23BAB35B4D7517A3F8F7F180BFC8834
-:108E3000796DF1BEF3F37EBE0829225EE27CE1CFBC
-:108E4000A25F3A7EDD7C7B68A3C0A1C7E5D50B217C
-:108E500059CC7F554BBCC2E770F2DC7FA3489B8E98
-:108E60005FB812E47AE5EA7DE7B9BB1D3776E0F535
-:108E7000375BF5F34F83078D23AA15429EC7C68A39
-:108E8000EC76C66560DBDFF672DD2EFB88CFC3EEC5
-:108E9000C16DB5C47E138965719CC39B833F5EC65B
-:108EA0003890D423E2B2383EC435D17731AAA33FFB
-:108EB000397031CAE3C9E32B7E6161FEF2338DEB79
-:108EC000B8FFD86955F0AFF14C93E0DFB13F37956B
-:108ED0002DE2C0C908B0DFE4881A677C92234D1FD9
-:108EE000B7635EF24C5B93C4DB9C692A63FD592E29
-:108EF000513C8D7169A44AB473F9FC5C73F09B1CFE
-:108F0000021FD02F51CCE10F55CDE0CF8EDE535E46
-:108F1000CE63479F6216F228B7EE90A60A3FBF6560
-:108F2000FE804FDD69C914FC38EAD81D7DC7447E38
-:108F3000DB3D6951EFEE231E67FC8F8E253A28D664
-:108F40005934CF623C3EE62ED461ADD75E480871FD
-:108F5000B492B6A4E7D0C39AB024D68D5E4A7C9B67
-:108F6000F932DA9AA8D5EA67CFB3A84DE443928BD9
-:108F700077AF678D3D87BF2AF6873C8265B4353E63
-:108F8000C77838ECF067AD971273C5F379EE3C11F2
-:108F90001D90C18BF3ED1E8DF94F64962C80CEAEE3
-:108FA000777576D3E31ED3BB0CE3A49D2AC2F8FAEF
-:108FB0009CDEB640CFA00B71FCB1BEC5DF8C873202
-:108FC00080B4C39CA9731B29EEA145F0B36666FF6C
-:108FD00013AC970D6C55E1E76E3AF829EBE0127C83
-:108FE000A9A11AD641524A021278F3EFD31E4D11AD
-:108FF000F1DA55AC0777E697D3990FA17F3AF4EFF2
-:1090000034F48F6D77DD670D59E0313A74E9DDB0E6
-:10901000D0CF228A3101BF8277E49DD4DCBDEFF04E
-:10902000D77DFB7C7E7F06DF72F5998064A7EB67B6
-:10903000D7E786E6D421E91FF782ACD4453B5F979A
-:109040009147BDE2F0CFE74998E5C8C3D3D79A2945
-:10905000673DAD838A22BF8947259B751E7156F8EF
-:109060000A747E628124C6776F966C0B5F87EA3E36
-:1090700013F7763273D6CB7CAAE97DEE35716E2D6F
-:10908000BA40D17C1D37F89DFBF276FD72F9F2A053
-:10909000CEF981CF428F23C2F27CBE1FD7BBF7E14E
-:1090A000869699F5ABA5B38F95238E274DC9B0E76A
-:1090B000AAFB96FB4EB1DC7DDDBA2F09272261E0C9
-:1090C0003179F6C6E6A5F0375AF7F70ABE473BEF07
-:1090D000C2DF0A97DF5D81600385A02EB57A2A0B77
-:1090E0003CDE2B4DDC13669D90BF0ADE4BBC3EFB85
-:1090F000F6CB12D78304DE773B2F55AEBFAAB0E67E
-:10910000E874849633AF7EAF69CEB9F5D80B590FAA
-:10911000A81E8F9995FF5F77BB4F7CD4C075B93679
-:1091200034D2E02DA8DFF8CB38F77C8F0C7C10D53B
-:109130004B0AF925BBFC528595A48DEEFD38936F43
-:10914000E3CC37AEF7D10FD63FCD3CE9DD1491F437
-:1091500082FBF3F8F9607581DF897E45CC27355BAA
-:10916000F34469619CAF893827D28E3FA26CCDA6AB
-:10917000A585E32997B759C1DB9F2CDE19E7739CBE
-:10918000E3AD4A0E6F3BFB3A48DC476EDE692FBE0B
-:10919000202E6BD067FF06E3939EA98A70C1B9F8B1
-:1091A000A18B737346127C5C4996C27E9BE1F119D8
-:1091B0006EAB9451611FA08CE8275A48CCE3FB5D4D
-:1091C0001E37AB9921A941CCB354F072159D15F30C
-:1091D0001EA229614D82C0C3B691216C8B3FB38E14
-:1091E000E5A33E9D56984F99A81ABE0A3EB294CC6C
-:1091F00055BF7CFE2A5DCDF11393F1B8D91A9F4378
-:10920000AF0FBAE7DCE0B71AD77982EC43E87A907F
-:10921000B20A6FF2804A6B14E4F3A04AFE62C47B88
-:10922000745816E77730ABDBAC5F4699BBEE0BACFE
-:1092300043BBD974CE295F35CF34E6F3BD138755D0
-:10924000F017E2792ABDEE113866C47E0F73E0C8CC
-:10925000BB957495DBA970A5C3679A7A96F779A434
-:10926000DF27DE39B2DF1278FC34ECD433003C83E4
-:10927000F0B3EAA04463D8D758E4E49BF3BF0AAF45
-:10928000BE5023CF77EE31B4690CFD01BFB38E68B9
-:10929000B5C6784999A87C2BF0F5719D8C92883BD6
-:1092A000F8C2D4B5BDE2DDE6D30E2124A3FFA3317D
-:1092B00009EF69C934690FC7E32FC9F0FB1AEC182D
-:1092C0002F7C57FF3AFCFC5B7CDE255D13785182D6
-:1092D000747E67CCA75F697C6FC83CAFCC81EF1F01
-:1092E000C0EF4957EF2E173BBA71D8DEA8CBA8C7FD
-:1092F0009688DFE07A34FA2B9613FC6E284D08BF6F
-:1093000097A523D5C2896AAF60BF399E07C86C6133
-:109310009C25B75E7BFC8EBFE922C7F299643E07AD
-:1093200020E77EC47500E7C28FB6D5E6D4DBFABC71
-:10933000C84E61BF69392EC8F88A62F805DF6389B3
-:10934000B16658B5CDD47796F0931D7904F279A41F
-:10935000781FDCC7F4033C1041865D9A934FAA4402
-:109360005ECCBF9752546CE07144BB4A1D9EEDFA2F
-:109370006B914D95B3E33BE94B9CE4FCA665636CB4
-:1093800054DCA33B9B59EF18A7EFE47092F3386DC0
-:10939000B163A9AC2E7019619DBECF67DF93C1BACE
-:1093A000A77C7635C79FC303051224D55C9C73F850
-:1093B000685C3FE6B189FAE5EA1FCBE374A0D8C147
-:1093C000073FDF1C1C74D471E9ECFCFF0753B7A7FF
-:1093D000EBB00E00000000000000000000000000E4
-:1093E0001F8B080000000000000BFBC6C7C0F0A3E5
-:1093F0001E81C3D1F8E878022F7E7952B10C038226
-:109400005DC1C5C010CBC1C01007C42780F82410AF
-:109410006B70323024027112102F00F21702712586
-:10942000101700D5363333301C6663603805C41717
-:1094300081F8061BE9F66B483030EC9241F0396454
-:109440001918D8E4A9EBC7513C78F15A0354FE5BD4
-:109450004D54FE576D06063D4304FF9D2669E627E1
-:1094600001F526033100FBB288BA68030000000052
-:1094700000000000000000001F8B0800000000003A
-:10948000000BED7D0B7854D5B9E8DA8FD9F39EEC5B
-:109490004942184248765E1030E01042048A9E49E4
-:1094A0000A8896D2889E165BAB4340823C035A4C96
-:1094B0008F78B2212104083050AC91224E10305ADE
-:1094C00068A3A2D216DB8094A2F5F4466BABB53E3E
-:1094D00002521E3E68EAA38EF7D4C359FFBFD6CE10
-:1094E000EC3D9909D89E7BEEFDBE7BD2AF2ED65EB9
-:1094F000EF7FFDEFF5AF358AE824F23F117211FEE0
-:10950000683A4C24840C8AA784C85A8F0352A25FFD
-:109510002CB4E4C945E972F27F1B61CDEBBCDF7F5F
-:1095200021248B90EFF032FA1782FC149E31E6630F
-:10953000A424A890AE92783F5308CB6BA2402E0A89
-:10954000F0D55A6E8C53EFF08D2169847CEA64A9C2
-:109550005E458BCA69FA9633DA984F88430817B28A
-:10956000F9D45D593D1AD3AB206D14C8EC4E4F921F
-:10957000799035848CA7C9FE2122A988CF3FB19E5E
-:1095800091363510D2658FE765998492F55B41E796
-:109590000FFD9E13C215381F0F91011E0A87878D7C
-:1095A0000409A1EB3AE29F169843E7DF3A5909DA3A
-:1095B000A160FB10684C7C061C67E761DEC1F39577
-:1095C00044E3F0EE6A29A4ED9C41916CA0B9A6FC9D
-:1095D0002A07292564F3C4BF06C2743E4E3942549B
-:1095E000483DC9E7379388BC9F7BC9E5AC3B713FD9
-:1095F00064D8A3F19815615DC67CB7D8E8BC32E9A0
-:109600007E8C17C95E9ADF543E2B0DE663ACCB917E
-:10961000629C6680EB0842363638306D9A302B8D6E
-:10962000403BD23B1BF677F3C42C718310AF7F64B1
-:10963000E271470F5D6F236FD7AA1D75407D639F51
-:1096400013E1B699C32744049CF7C6D1AED9D1D251
-:10965000FEF308111F966F76D246B00E2F89EECD1D
-:10966000871E7ADAE6D2BC6F825AB641EB8F2F534F
-:1096700046CBC12E3A4F8FC713B4D3724F80B57704
-:10968000BC2144356C1FF20CA1F55DC6FE4F10E302
-:10969000F0A4FFF7916A42283DFA727A5F8371EC79
-:1096A0006FD88321FADDFDD947AFCDA5FD92934256
-:1096B000702F8C4B965BF68BEC6170B5A9F4DFB420
-:1096C000DC3579FE0C5882FBF327AB016EEB8B5631
-:1096D000B856C35E95B0FD53E9FF2E16D0FE35C5D2
-:1096E00032BECDBCBFF9809AD6BCBB78D6D70AB5FE
-:1096F000D4F8E1EEF191AE0C5A59BA05F73B55BDDD
-:10970000FA37C65E73CC346E1BF1669E71D37F5CF4
-:1097100045AE423ABF44FB4F1B82D71CB3E1BA456A
-:1097200033BF49557F2DC78F3E3CCBA7F8518AFBED
-:1097300019B86174FCFB4B8017400F7A25F231A4F5
-:1097400045BADEE6AB49AF44F7A3A958D1D65038A5
-:10975000D855A54BF0B1317B01BFE01FB4A9BDA81E
-:10976000B95B180399EF58F860CBE07F0D760D30A8
-:10977000BFC47DF8A2F0EB02F85D11879F9D54A74E
-:1097800075C17E5707103E5E3E8F7557AFD4BAE85D
-:109790007AD6657F3F749298E07815A3B3BEF9E45A
-:1097A0004489797C83BEAE14422F027C2425F85A6A
-:1097B00098C2834C52827B93AC4B16185F89C3D9F5
-:1097C0002113034E80BF87F5C00D5E9C52B5C304C4
-:1097D000677BE0F867003F399374B9C7E0F7263933
-:1097E0009DF2AF4CA2BBD3B01719F29F917CA44F4E
-:1097F0005A3E452903BE302D18A6E334DBF878EA3B
-:109800006ACBBE7EC6F7355EAE07FED9526EC3FE8A
-:109810009ABD9C6FA88D38BF7EEDFDAC7DE27AFFCE
-:10982000027C743CD45339FE340640DE3886344F13
-:109830003F02701F51D73917D6A8128483C1FFA9E0
-:109840000024508FCA87CFA09D43AB46B8DB73423C
-:10985000248C70B3CAD3947C39418EF6C32795E625
-:109860008D3E0AE0BF392AD21B4994DF3C0D0DBB67
-:109870002C39D8984057B4ABA47266B4C0F82DD137
-:109880003371FDB281075C3FB019E0D8CEE859E5ED
-:10989000E32A301FCA0F9D248A9DBB29A643DE4BB5
-:1098A000EA30FF49A8AC4B00BC91C97AE073F6904E
-:1098B00048F4FCFEE36FE6F224D53A364F4C2E070F
-:1098C00086094C0E489E3ABE1FB7A84067821E26E6
-:1098D0001781DE4884CBBF20EEF7BA867AF20E5DA0
-:1098E0008CEBE87544A3F823E7D48542B49D04B417
-:1098F000485934F194B3540E6A66FCEADB47B21A55
-:10990000FBB351B0C03A6D1EC71C320652F5064C6F
-:109910004B46DD0EF4614B9B560FAA1CC59B4A01BA
-:10992000C67724C72BE2A1443A11F35A75D2F1F855
-:109930007EF37A29F1AB0F3F8CF56A4AB5B73FDE6B
-:10994000B8CA5501488166BB613E83F96C06879BA6
-:10995000978B6360DF22D387D3FD19DC3307E59350
-:10996000F78DEBCEC3BAD696969D00152E2DA8DEA8
-:10997000308DEEA7AB840800EFF5D0D924E8E18460
-:109980005E09721DFE994DC8B7856743BA87A18FDE
-:1099900055DF1435D9E027E280FA8B70D1DEBF7D28
-:1099A0004AFE4C4CF483727CC5E5E94BB7B0F174C8
-:1099B000FA3FA03B7F823C4D0B99FA25001FEB3804
-:1099C000EB006F10BECBFF5BC653C93687067A47E4
-:1099D00091A846E9D86944F5535E4C5C536402F2A1
-:1099E00044CDE9D5617B2FB52F6B09998E7C94D23C
-:1099F000AD19CF77723E10A869CA6FA6FD7E52EEF0
-:109A000009021F184CD966467AFFF56C4CD0B33763
-:109A100096EE46FED848F1A800F4FD5211F5A1F5E6
-:109A2000454FA86679F57383DFF4C30FA2C915C843
-:109A30003A08A1F0918AC49073CC3F8E1F897AD2E4
-:109A4000E5E287FB16EB7E7CD1FDFA759FFE7D7902
-:109A5000F8F18F8E67EC6B2ABE45F715F5EF166DA2
-:109A6000D680FA4BFF7DDD86FBEA2A22A1647CB812
-:109A70005B10ACF2C99C9AE507B9D3B25FB6C2AF2E
-:109A800007760F000F5B49829CE4FD3AEB25ED342D
-:109A9000E8B1B28AF2C8B01FD66BDB74D0E73FC919
-:109AA000214CDF8B2CEF12400F2A22A807410722FE
-:109AB000CD3BB5507483C0F01FF6C5D06F6C541DFC
-:109AC00033C357525D963C99AD0BE6F93BEB159CC1
-:109AD0008703C603BAF4D00E69BF520EE972A2FE24
-:109AE000C9E60F43313BFE9ECBC203035F01AC0CC2
-:109AF0005FADED9A036524D9FEF51BEF26EB7C5391
-:109B0000F2A5C4761E593B63D24752B793C9199345
-:109B10005E33B4CF7FA11BFADC2181EA858D81AF52
-:109B2000EB386FF80F95AF2D905279260DA9226171
-:109B30000DE4A4C6E8444B67F2B743B0D8E1C6F7DA
-:109B4000D4F360E3C56EA7B8087C4DD62CFA7262D8
-:109B5000DAD810F8924C91D25DFFF024791C55624E
-:109B600057876657D3FAEB1B3A26C177A3DE54D149
-:109B7000B0BFA9D834E9C732A1F51CF8955C1C0721
-:109B80001F55A299E4BB83746239FDCAF78FE03E8A
-:109B9000A05E45BBAC1335EC572187B01E7404F5AD
-:109BA00028179F2497B0EE20BFD1160AE1BCE488A5
-:109BB0006305A5BB8D4E9ED778DECFF32ACFE7F3A2
-:109BC0003C951390772B344F53A72DA262DEC5F33B
-:109BD000F93C9FCEF37E9E2FE079611BE6372AACDD
-:109BE000BF0D7294F5EFE2798DE7D3795EE5F90266
-:109BF0009E27BBD9F8769677D9A2AC7F37CFE7F30B
-:109C00007C06CFFB79BE90E785DD984FB57FAEA28D
-:109C10000E06A73EBED019CFA3F0E070EDCB77259E
-:109C2000E419BE64080C0F635F35F02688FC917858
-:109C30007291DE86F0368DF3CAD877EE47317D3FDC
-:109C4000A15139F749584439996ABEDFE7FC743BA2
-:109C5000E8B934DDDAA062BAA521807AEFA6068DD4
-:109C6000FB554AF0FBFA8620E6D7354CC0746D43AD
-:109C700008BF37364CC7FC630DD598EF68988DE95F
-:109C8000BE8630A67B1A1660BABBA10ED328D57744
-:109C900021DDD5A063BAB3A105D31D0D114CDBE6C0
-:109CA000953D5F04F35F40E73F007F183CDBEA0728
-:109CB00019546DE58BE953D22DE5EAE46CABDFA4D2
-:109CC000BCC092F7948EB2E45D456596FE1C399354
-:109CD0002CE54A6695252F7BAEB7E4AFE89865C9B9
-:109CE0008F8C7ED3D2DF88B61A4B797164A1A5BC64
-:109CF000B06585259FAFFF8BA57E5EFD1A4B799BD6
-:109D000033FCAC48F9D5B0BA0D967A43176CB3CA98
-:109D1000AB199997C5B7C8C77A96D99F91C8EFA5CF
-:109D20005C120AA1DC62F2A511F016FC5EC3487455
-:109D3000AF00FEAB6B4F80DD612F6272A79F7D99F4
-:109D4000D09FE2D9F79A4EC7A9F49D08F498E88C01
-:109D5000044CED28DF3F2532BB79C3BDCCAE6EBDD0
-:109D600037B97D8D9C9DAEA3F5F3E4FEDB1E51E279
-:109D70007A906EB1535AEF15B0FE3FDABF519ED8BC
-:109D80006F7C3C8A7315663D246AF845899E15B739
-:109D9000776D3DFEB960F71876AEE460DF2B4B823D
-:109DA000279B28BCD7AA04FD866B3D5504F48A4F37
-:109DB000544637644F2EDAE346FDFEF333E915C807
-:109DC0007F5C563FAD6716FA3DD7660EAC972931DA
-:109DD00009FD77524C205D54EE2872F5F47C4ABFA1
-:109DE000CA2B52703541F993D4BE27641BC2414A35
-:109DF000D06F9AE625F0BD29C370DD36BE8EC6CC85
-:109E00002AFCDEA40E3C2F3BCC0BE6C3E7658BB9E6
-:109E10003195624E9CEFC45806E627C4FC985E1547
-:109E20001B8A69456C08A6E363859896C7F2311DC5
-:109E300017BB02DB95C546623A36360EBF07636331
-:109E400031BD32F625FC3E263611D3D1B12FE3F7D2
-:109E5000D25825A657C4BE82DF47C5AEC37464EC92
-:109E600046FC5E12BB01D311B16F613A3C7633A65A
-:109E7000C5B1B99816C5E6605A185B84ED0A6277D9
-:109E8000609A1FBB13BF6BB1E598E6C5EEC13437CE
-:109E9000F65D4C87C51A31CD89ADC674686C23B6A2
-:109EA000CB8EADC77448EC7BF83D10DB8A6956EC6D
-:109EB000014CFDB187B15C8DB5639A16FB217EF72D
-:109EC000C51EC5D41B7B12BF7B628F63EA8EFD0C5F
-:109ED000BFBB623FC1D4197B0EBF3B624730BDD4CC
-:109EE0003E2939563E2E65BA2CF909A7D32DF851D3
-:109EF000F186958F97BF5260292F7BD1CAC783C740
-:109F0000CA2CF931872759EA971EACB2E447EDB75E
-:109F1000F2F1923D563E3E7CA7958F176DB7F2F158
-:109F200082562B1FD79AAC7C3C7795958FE7DC65E2
-:109F3000E5E3D98BADFC3B30CFCABFB3C80EABFD58
-:109F40003D65B755AE4D7ECCD29FA7FC09ABBDC0D9
-:109F5000F98CABF4A796768EA2A349ED9A447F398B
-:109F60008044A6F47D377105CDE72A469ACEF941A3
-:109F700006D01D4D3339DD0D02BAA369FA5716E339
-:109F800039D3A75F6DF95513ED2C7D28617E017DD6
-:109F90005B15F8BD9A87F03CFD22D07ACDC308FA54
-:109FA0000988FE6E2596E7B3FC0FA433953AF3DFDC
-:109FB000B2727281953B59FEB1C67F5B0DE5E969CE
-:109FC000A1EC20ED678F2D391F7F4262E76D17C42A
-:109FD00050BB44D7FBE7CA9E95E047B33BC27B2505
-:109FE000FA7DB1239C07AEE90F6CE14764E08B2456
-:109FF000B40FBEA791D02312F26BAB5FB415146EF1
-:10A00000DACFC762F57E28CF98D9817691B1EE6616
-:10A01000EFC0F3894A4C2E35FB09DA8DFAA30ACA40
-:10A0200053FC33E4059583F7BB7D2128DFF5A8B207
-:10A03000DBCECB2D72A33E0BE586ADA37939B824D8
-:10A04000EDB09F5232BF680FE6D340E32F04FBBE52
-:10A050003757A6E9527B5733C8F5BFFABBDF122446
-:10A0600084C7AF003E2BAF0F63FD35EE9913603D03
-:10A07000141E27E03B85C7F3D2A0D4F02070B24075
-:10A08000E71F30B068BF60F13F9E13C2BF954C7EA2
-:10A09000CC403888703B20A9080F037EF4EFAE74E3
-:10A0A000C31FC3DAFD11C74DE84FE6E762BF95F85D
-:10A0B000F85C1E1A789C21927032F81BE73EA423AC
-:10A0C000F70BF9B39D8A98741C9B5C8DE7A9FDF88A
-:10A0D0005E66825D9F1986B35E2A3FA9BC4C32AF93
-:10A0E000690AF74FC97997757E15E5FA3DD99FFB47
-:10A0F00085CEBBC0D083FA438D7D3A968BF951BC97
-:10A10000FD50D0EB283E3DF7A6FDE812CA07765178
-:10A110009E614FE20FD8D521E2F9FA503F45385AF7
-:10A120005ECFF5006A13A13E688C2B2FB6FA8F2202
-:10A13000360EC7C356380EA588FD536A72134F1EDC
-:10A140009B1F3FB734FA69EF9BBF751EBBF52031EB
-:10A15000DBDDF9ABA322E83572079DC798FEE31358
-:10A160007EBE60D091ECE17E13350FFB35C64D1CF1
-:10A17000874833F03C29157CFB8DF305CFEB2AE4AF
-:10A18000E4E79D747F104E4529F43CE3BCCEC83F04
-:10A19000F7662D9E7F37476A50BF6B0EF073F6BF90
-:10A1A000D15EA11F921C4FF6727C7A889F8BECDDEA
-:10A1B0005EE5C0769979967D2ABEEF265798E967C5
-:10A1C000E990EE6B63F5863F308F7FAFC1EF0FAD47
-:10A1D00062DFF3EEFDD8C9BE7FE88734AAB3EFDAB9
-:10A1E0006A99D717B13EA9A77FA673A0E16AB508FF
-:10A1F000FAEEF0ED2404DFF2D45E01FCC89A4A4482
-:10A20000DD04D7ECED472BAFA3E5D991EA59D7C1CF
-:10A21000797898048B35F8FEF2EA91B88FC401FB87
-:10A22000BD83AF3B2712DE3012EACDA6F548BCBC99
-:10A230008D8F3B2C12DE761DF8EF4A583F46F9F71A
-:10A24000797B97511EB2B68FF0F2DC55A7BA46D093
-:10A2500076B991DE97AE857A1DD67A9B79BD51503D
-:10A260000EF3085AC769E5F390F4DD04D0438A90F1
-:10A27000F4E9D08F6AED678381BF505E8EFFC6F22E
-:10A28000870DBE90C0478C762D29F6DFE0273BC1B5
-:10A290004F3002FD5598E6B426F7BF96717E65E013
-:10A2A000572A3C270B448B7D47C22E6B7EB649FF55
-:10A2B000837C28DB5A3EA1C05A1E1C65CD97945959
-:10A2C000F3DA244BFED33E3F4BD409F460F8590C2B
-:10A2D000DFCC0E95D149DC8FD7ED34DB2539BCDEE0
-:10A2E0008375CC1FD3E8E1F4C4FD322E4E97CD2503
-:10A2F000CC6E31D6FD24E75711EEF7D8D5D0C6FC89
-:10A300003063438E7CBA9F2DBF938203F9A11FE770
-:10A31000FBF1634E8F07B8FFE6877C5F1EE5FE9B6F
-:10A3200047C07F03F40AFE1B3BEC3FF3DFB473FF2F
-:10A33000CD43E0BFC17DADE67E98D958DE06FE9BD9
-:10A3400011E0275A80E916EEBFD9C4FD371BC17F43
-:10A350003302FC422D980EB231BB7CEBD45036F860
-:10A36000CBF64C4D6E170FB231BCC8074586A6B967
-:10A3700024F46517E02F456C3897293F167ACE4DA7
-:10A38000F323A20CAEE50743CF4179711BCB17F243
-:10A3900071409E807CA1FF60713639541B32E1EF21
-:10A3A000B817A3640EDDB7B7657E0EA051D5232B79
-:10A3B000EE2F8572D8A73785508F3C1EFA25CC8F9B
-:10A3C0001F0E0B401E83EFEAD5155A4F5DDC1D8230
-:10A3D00036BE96CE2EB0B335BD0BDB6DAD0CA29F55
-:10A3E000CDD8273ABA051FE8DC902F0EE3FB4F26A5
-:10A3F0005BF12137B60BF5E1E6BA596988771A198E
-:10A40000D05E2FD969D517866FB7DA49CD77CD1AC7
-:10A41000D0BF9CE82F53275BFD65CD2503B7F7958B
-:10A420005BC7F79426B4F70CDCDE199B39A03D78A6
-:10A43000855893611B14CF17C6AEC1FA89FA9F0CD9
-:10A44000F16F54AF93A72821380796A7A8187A254B
-:10A450004FD1781AE4DF433C5FCDF22A8B93A0FA08
-:10A46000623E8C43F727E1FC3B44E07C7AEB48C238
-:10A47000ED91DA35A11C9AFF6782F6C449F9CE2A1C
-:10A480009DE677CC7088D295806F2CDE41E1FB95FC
-:10A49000A144D723DD6E15C96E9ADF131998EFF525
-:10A4A0008B83F084D07F3374B15A260D40F7DB17CD
-:10A4B0008BD3A349FABD86D315394612F5EA6B6CE6
-:10A4C000F4FBDAC5B354E0FFF24D41B41F88C6E691
-:10A4D0006FF0B98CF481F76F57C27C7353F87556DF
-:10A4E000DB38BD9530FE68E07FC64A86E7A9FA5F93
-:10A4F000C7F959AC53B0F87F06DD545D69CB447B96
-:10A5000028E8013EFAB9C4FC688759FC9A414F8D8E
-:10A51000252F23FF36C6CFCEE902B38D341F99C84D
-:10A52000E22A287CD15E3C42F97829F27B02F55D73
-:10A530000B7A2A991F3D8AF10FAEBAA00E79C9C3D2
-:10A54000F005EC515E1FE7B3E1AE5921D8A7C61C58
-:10A5500012E420C6751A78D018103134E29312A68E
-:10A56000F7CA2AE51330FF9132CE9FEA59172F1A06
-:10A57000F68B04E789BACEEC37167765C4E30D6D28
-:10A580001B83F8DFEC5D89E785FA58A60748A49B92
-:10A5900088F9381F5D2C077FBF1A04596FCBD4058B
-:10A5A00033BE7D4D08DF0BFB1EC7AF4E8C4731E03D
-:10A5B0009708FF6F71BE9A4792DB1F83B97D93A105
-:10A5C000745E077CB7E5518AE749E266FCBCDE0FA2
-:10A5D0003A66A5012919746B941F90341CC7C80FE3
-:10A5E0008D292CFEAFCB6AA7FCFFAEEF1FB459E359
-:10A5F000F3FE47DFFF1F7DFFFF117D9FCBC7A96BD8
-:10A6000060236C1E962F6F9EBA46C7F559ED7649AA
-:10A610000E5AFC1FBD40FF26392F7BAC7AC9E5F3EB
-:10A620000D19F527121C66E1BF19D903CB19C3CF49
-:10A63000F1E930439F0F215D90A21262D6D79A8034
-:10A64000CF5338EEA470E47187384E365F97ABA7CE
-:10A650005A17317EC2CAB7772E38EA1C81FC5FC612
-:10A66000769E406708E4AD43EB46FE6BF069CA9FF7
-:10A67000C72A8380CF5720FF739544307E6D2DD736
-:10A680004313E10AFC305006E325F021A2A53BA0CC
-:10A69000FCBB0C0764F0E3819FB27E603FCBE5C654
-:10A6A0007D187118B9F40FF8D04699CD8F1CB2C639
-:10A6B000B1537C7458E275CF3D8CF2D4E8C7D077A3
-:10A6C00012DB35A9556A32BEF8A610FEBA32009EDA
-:10A6D00024FAB548021FA71C54007D6EE88CE9E8F7
-:10A6E000AFEAF36FC956BE2E078CB898FF5EFE5EC8
-:10A6F000A7FC9DF1EB5FD0FFB78B9FEF27D2716274
-:10A700003FA24EC49E24E3E7EB62C2B9B355EF17F4
-:10A71000648DDD13AAB39ED3C89EECE4E7093CCE5A
-:10A72000B366421FFE7EE38F147FEF3861633C8C7B
-:10A73000CB25C3BF7B07C47BD2FDA981F84F2ABFBD
-:10A74000E7916A1F147E40448C2BFB80BCEC1B6796
-:10A75000DAA77D0AF3E79316DB29B86F64C435DE08
-:10A760001E6179633EB56DD6FC7C322B0BCE35E68F
-:10A770006FB7118863BC83C8A77A8CF9533DE7FB98
-:10A780000A8BD3AE2575CDC0CFD672FF7D8D4A64BE
-:10A7900088435CF2CC8315606F1E50981EF52E85A1
-:10A7A000BF668A575BE8892A703EF1CEC1715FFFB0
-:10A7B0001281F6D1E66C8847A47A2DD8BD89709FA6
-:10A7C000DB629DDFA5E69F385FE37E52AA79C81D54
-:10A7D0004228991DF133C51A3777A97B536F8391AE
-:10A7E0008CE720D67B53976A775AD148B2FB5697AD
-:10A7F0006A77FEEF1CEF428AF196387A14E003CBB9
-:10A80000E4F074A1201EF7A5D8AA43432928E44305
-:10A8100063BBC0176EAAD77299F54E80017219F505
-:10A82000A68B03F47781D3F1AFF63FAC007D7EF0C9
-:10A83000D8C99970EEB3E8671271C0BAF67B4917B0
-:10A84000B34F1490630B0F4AE88F237257C58DA640
-:10A85000385A8CB8A5EB5FF4632FC6692C7CC21EF6
-:10A860009D41DB2F7CFA9D3184C2E1C29ADEE34335
-:10A87000C1CE784C6071897ACF981BE9F78532B9DF
-:10A88000AD3A091FF4D8199EBFFF13F76CC023A17E
-:10A89000E3C8ADD86FE7376C76D3B9A064B7E1B839
-:10A8A000B45E889D6709D16281CDCF7CDFC2880705
-:10A8B0007DFF5181CDEF902DEA84F975B42B615A5B
-:10A8C0006F59C75F106FBFFCE3033E80C3B2439272
-:10A8D00085BF2CEB90BAEC63303D69C7FB34218F08
-:10A8E00040F9C8526431343DB804E3C797766EFC32
-:10A8F0008BE483F656FAA1700976015C5F9582338A
-:10A9000020FFE4233EB01BDFEDDEEB03B8D27EE791
-:10A910002814AFAEF9D8446784F51F4BEFDF1FD57D
-:10A920007414C0AF659DEBD97809F4F92EFC634827
-:10A930007FB930CE6E950B9F90172BD05EEFC84835
-:10A940001A6FDF271738BD2E3AF0C92E9D8EFBFEF9
-:10A9500013EFEDD2E9FC17FFC747BBEE01BDECE7F3
-:10A960004E15F8CCB2C77EE72326B8CFB433BFC1AB
-:10A9700085471FD9B783D2CB853FD8D1AEBDF0EC88
-:10A98000D95C8DAEFBC2E39F6569B4FE5DCF4E1D01
-:10A990000C70B8EBA92F0F1EC84F00F81AB59BF723
-:10A9A000358AFD6B870416DC7F98A709FBF3DCC1B1
-:10A9B000E772619E1FBC66C7FB8CCBE8B7FA32D842
-:10A9C000AF25C8F721BF8AC279E9FE757F91C624F9
-:10A9D00083B73E54C4C3454A3601D8EF1BBF7675D2
-:10A9E00039A4B6A006FD915EE4DB89ED96BD42F781
-:10A9F000F5CAD4FBF809F99B02F05FB67F3D1B371F
-:10AA0000611F3F807F4CECBF8F8BFBEDE3E287D073
-:10AA1000E638989134FECAD8C7254FFDF3807A8076
-:10AA2000C10F2E05DF053C8E70A23DB4CA0E74F531
-:10AA3000845B0FB0FD8DCEA065170E7C924B287EF7
-:10AA40009CB3F5DE0A7CB2F759BBBA9B7E5FF8EC8B
-:10AA5000AB4867179E7A49D1904F128F40F5840B0F
-:10AA6000A4EFAF1BF486A5FCCC79D91E6F97DD1738
-:10AA7000DFA7A5D11BA66B3EFC7E12BF4719FE2F98
-:10AA80008D1EB94948B26F4FDB0B183F8F0E42B88D
-:10AA90002C21DD8A5A6ADD4F6102ECE3C9698077B7
-:10AAA000A9F6D158BF0AEBBFCAB49F7B18DD26D6E2
-:10AAB0005F4AE913FC887DFB1A155E2549E8F442DC
-:10AAC000BB5D8678E10BB64BDC03FE82FA5FA73DE7
-:10AAD000857DCFE170293ABFD4FABE28FC76817318
-:10AAE0007B507F38BEFFB7E4FCFF45CE379692F02F
-:10AAF000F46CA9BFFC9248481F9A1F9F6F73A784EC
-:10AB00007CFDFD0E290A4D13F9C4D2147EA7D7EDA2
-:10AB10004C1F597AE8C818E067EF1FFD09C74B863C
-:10AB2000F74BF79F54742E0FA2667990C23F799A23
-:10AB3000CF7BD9E1E4FD2DDBFF97A4FDBD2B87BEC4
-:10AB400001F37FB7DB4674DAC5BB9D52523FEC6F11
-:10AB5000EC364B5C61B3B7E2B534DA4EF2B9341877
-:10AB6000BA714DE8551DF492976D78DE41E4E039F5
-:10AB70003BF813BD2E6D038557A36F3EFA2B8DFE58
-:10AB80009A12E02407AA75B04BE5CCEA72A62347D7
-:10AB90002D76B14D152DF3A6723607E4D05B63CF49
-:10ABA000DA609D6F27E8836FCBA47930EDEF6D5DA0
-:10ABB00008AED692E1B7B5FFF02A896866F967EF6B
-:10ABC0007D0BE6437EE12410A722FDDCA9033F595B
-:10ABD000B6CB1985B880E79EFA741FC0EDC24376E4
-:10ABE0001E27C0E2CE6B55D6C7D9A73EDDF5EFB420
-:10ABF000FC2C34A6E3D7EEA2F5410FDFEFC6E0FF51
-:10AC00003F3F91368650FE5CFB8B7B66027FA90539
-:10AC10009E4AEBD7FE7830EA756706B1FC9903C30C
-:10AC2000A2B02F8B9F7C7629C891453F7213701973
-:10AC30003CF7D4ABB742FEC22FBC182779E11767A7
-:10AC4000AF013AA0FAB36696E37798DF2BA0FD2E0A
-:10AC5000823C2B172E9AE26F16414AF9C6A243692D
-:10AC6000780FC8540FDB2DB3F7AE0CA23F59CF16A7
-:10AC7000D1C6E9CA063A5CD4611D6FA483F949972D
-:10AC800029BDF359FD4836A3D76E6C57E1E078CA69
-:10AC9000CB13DB1BF5CB1D05967A46FBA5765297A9
-:10ACA0000CFF2B79BF8B3A3E1F61ED8FE16BFF717B
-:10ACB000D8F7EF08EC9E0A79DC89E76D8B95AEE159
-:10ACC000E9945E9F56C802A0DBC5BEAEE17E3ADEC7
-:10ACD000CF389F5CECA279FA3D9BCF03EA439E38C4
-:10ACE0007A7E04FBBBE41927017C5FF20B2F9ECF19
-:10ACF0002C79FAD3333FA0DFDF7FCA8D7E9325BF47
-:10AD0000B81BF77B89BDEB56F0FBF53E6E477FF332
-:10AD1000FB8F3F9F0B7AC8FBB6AEDCF401ECF3254A
-:10AD20009D76EE8CB0AE83DA052575743EFA561624
-:10AD3000C7564F5CC1D5109F028E03C0E3379C2CD1
-:10AD4000DE8A9FEFAEE0FEA00FE7696938FF52E6AA
-:10AD5000DF5AC1FD072BBEAA0DF69BE60171A66462
-:10AD60001C21772B752380CF4AB1AF108DE6E558B3
-:10AD700021A6463D490DE2F98394C9CECF6D994194
-:10AD8000525B0AED585C12F15CDF4767FF8B6EF196
-:10AD90008A07B4C1D0DF4207D3A7DB9CA1BB1D68E3
-:10ADA000CF78F07E29AE933204FD29B6AE4F05B6BA
-:10ADB000AEC4F97E6AD3EDC0CFE3E7DEEC9CA55EBE
-:10ADC000D65E85F34C7282F3A57EEB6774F6A19A8A
-:10ADD0008E7466AC6363838AFC647D4300D3750D17
-:10ADE0002544C3FB0141CC4B1C1EF6529D4870DF2D
-:10ADF000566373B57BAA43707E017DE2B986278CCA
-:10AE0000F8650FD4A1EDEFF010B44F258F4E6A3DD9
-:10AE1000E80F4338C1B90CC049E179B96D06C29554
-:10AE2000B6C7EF2B9DE15D001747CE280B9F52322E
-:10AE3000CB2CF97E7033F0E2C07F37FC08C26B7D0B
-:10AE4000830353B85F017083FB1590FFBF00BFE31E
-:10AE50008EF1ECBE8366A21FB8EFA059E82905FC6D
-:10AE60001EA0F0CB8CD355221CEA797C9B414FA9C4
-:10AE7000E817EEA7C0E5836D0D6D981ADFD353C8B0
-:10AE8000F5E14E81C7058457DBB87F1CF7215327B6
-:10AE900039267F1209E8782F0AEF5743B987F9114D
-:10AEA0008DFD9554F98C95FF69AFC27AEE7EC1266F
-:10AEB00002BF92EA1F26EF6498E87846B5534338FC
-:10AEC00007D17FDBC8E5EBDABEFDB4D2C7C6060DFD
-:10AED000D34D9C4EB6703AD90AFB0EFEB9A0887BC2
-:10AEE000DA3A9DA0FCBC8FE6997DDF45CC7E6D7F74
-:10AEF000B0B3CB46F71F7992866917F2AFD7ECD182
-:10AF000062DACE5D4A42802FFED7BE1BC5B592CE17
-:10AF100000F843FD1C7EE47081FF66F69E828DC9B9
-:10AF20002922B1346203FB2911BE8DC1A30EB0BB2F
-:10AF300053CD272BA8DB73E978596FD8917F67DE53
-:10AF4000D2F95A0D5D87A7D58DF6645690E1A327F7
-:10AF500018166A4DFB979542EFDBE7BC2ED349E903
-:10AF60007810C4F3D2745B5BA113E0BBD1D6190097
-:10AF70003EB8D1CFE48C369B8E7695A93DE78FBE47
-:10AF8000722BFD1BFC589D5C66C16383DFA64FB12D
-:10AF9000E2BBC16FCF3B983ED7E6AC1EEE8478DEB5
-:10AFA000D84EA4C744FC6FB429BA40F59446D025C6
-:10AFB00041BF3B29B0B894FE7C00E3563EECC9DFAC
-:10AFC0000DEF0EACE1F1D43AA517943BDCFF699C80
-:10AFD000CB1F20D52DF00E4C0BC52302EFD550FC16
-:10AFE000017AD84CF107D208C51F4627133035F037
-:10AFF0007326384FCCE7BF45C745769F4304994336
-:10B00000646A077AC0CF7464A203F442D9C6E259D5
-:10B010007ABD6227C4B3ACF5CC7284C0AFE32FC74E
-:10B020007DFFABB7266FA07315785104F046F50489
-:10B03000C9A9D2F8BD5F492D23604F1EF074E3F912
-:10B04000DED54ED132AF3667F846A7C9CF3F1A4694
-:10B05000E7FBF64FB8FEE4F7876F73723F658E4EDD
-:10B060008A4CF46DC499124D2725263A5F533C8DC6
-:10B07000C039687FFA4EC1C7F6FED7F0B1C6BC280A
-:10B08000EE9B2D916F6452FEEEC154175538DF3B95
-:10B09000D4F42D3FE2D95D000FE2D9DDA7BFFC5308
-:10B0A00041FF7926F2ADB83CD2D05F45E5D1FD1322
-:10B0B000800FA6904747DE1CF1358596BFF3BC2470
-:10B0C00098FD750B62EB511ED4C626128DCEB7A625
-:10B0D000ED7B98CE6F6B47BC3F175DEBC3389A167C
-:10B0E00066CF9D8BDAA2523EE2ED4509FCFA84F56B
-:10B0F0007F6E6723D623E07D318D7B6E276B4FCA31
-:10B1000035D4A73FE46BACD9620FC139CDB936DA7B
-:10B110006E0078D6803194443FC5F704E0EE00A974
-:10B120001B017CCEA0F7BB15CA97000E6FD993FA0E
-:10B13000D9573AA7EE00BA5EE90CB533B8A75FD687
-:10B14000BB16EF8854EF4578877D3758FCACCC8F21
-:10B15000F90ED78B892345B98FB75793972F697D00
-:10B16000EFF8BD34D75C1AAE2626FB5A22CCBE5E61
-:10B170007AA892BF2FC2E693043F993EDB6A473E0E
-:10B18000348FFB830C7C8DE34BD8C7EF975AF0E9E3
-:10B190008ED856DC6F61E3E8FB2752F87D44F10856
-:10B1A000FC72C2C6AB07031DADDEF0A52DB7D0FE05
-:10B1B0003F7E51C2EF0B624EAC7FFEDEE0FDB780FA
-:10B1C000BEFE6F36027CE4E31353F13CF6BCCDEADD
-:10B1D0004758E462F2FA1CA7E3F9B18D16FD787EB8
-:10B1E000CB5C05FC8FF3639BF1FB7C3894C17B2027
-:10B1F0007F3E5629C3790DC1F3D173CEF7A7AC01B9
-:10B20000381C2E433F56ED267BD27B29E79C9AE5DE
-:10B21000DCB9B6A715FB25543FCACCE2FD99F84727
-:10B220006D0C2EB1C0FEE804EE2DCCE77CA46F7E41
-:10B230003B6D163E72DE99DC4F12E37AC9FCD8975B
-:10B24000908EFAAFEF1A465FC6B83D8CEEE2EBB9CE
-:10B250007F62B2F5C4D73119EB9FF7271F3F8FC329
-:10B26000F94CC30212A27CA8C64EEB7960FC3B9B52
-:10B2700027809DBDD39F2E98D655DBB688844CEB96
-:10B28000AADD3947A931F51BDF07E72FCDFB90B7C2
-:10B29000419EBAC60372BBDAEDA270AED978F598BA
-:10B2A00030DAD98C9FBC630BE6025F3DDB766752D8
-:10B2B000FACE736916B950DBC6F787EABDE5A6FD7D
-:10B2C00031F625B1FD99376BFF7A2FF8011E604AE0
-:10B2D0004D2A78F5DBB7FCE4709BE862787986CA82
-:10B2E000D930C24D7BFA35C0EB4D6E8CF74C0DBF9B
-:10B2F0002B487820F8A5D05FA9BE53E61A0FE312B9
-:10B3000084436D1BC3834BC12D3E2EC783CAE4EB20
-:10B31000A9EDC3837AA253823DA55C0A0FEE21BA40
-:10B32000638075F4E1C1680B1ED4BA8AA7023D9E02
-:10B33000033D6544FFFD3FA5E8BE49700EB441C220
-:10B3400073A6532E3DEB9B2C3F16F8F3295F64E662
-:10B35000A4F278FE8EBDC5BE39A671CFB6DCE94B2E
-:10B36000E667AD4D853F453A29ADF83F873FEFA4ED
-:10B37000B8C7B5D259B908F6934492FB738DD4E09F
-:10B38000DF529AA7CFEE04797ACA53F0D7282D3D21
-:10B39000E40CAF047ABA5BD4C6CC11E2F6673FFD89
-:10B3A000B361FAD5A78BC15F587DF5691BEA43D815
-:10B3B0001F01BD329FC745A07F6308CA83C4F3D273
-:10B3C0001FB8F2939E8FAE6DA81B07FD12874E54D7
-:10B3D000739C1C617AD4FF86F1F3E3EB516C613509
-:10B3E00008F6A540AA01CF6D72B805EE03DB0299FD
-:10B3F0006375135C1F7031FF97F3D8B1967CDADE6A
-:10B40000F9A7175582F7CC74F4AF3972E40FCDFE6B
-:10B41000695B268B5F2445A6EF0510874CF3163B2E
-:10B420009FCE77003BF567028383EEB5F37B75BA59
-:10B430000472EF662731FE50FFFE8311072237B1F9
-:10B4400072BF51DCC4CAB9FF72590DF34F26EEEB3F
-:10B45000CD87D775833E73F3E12173C18F75B367D1
-:10B46000C49FE07CE167E0C3077CF733B99CD8EE6A
-:10B4700030A7D36FB58BBA8DEECB315BEF5137CCA4
-:10B48000F73BEC1DC76FFEEE98CD4DD3D75F396506
-:10B4900083773B6E83001DBAAE39445398121CC5A6
-:10B4A000F67349A797E53B07CDF29AFBA3A62AF4CA
-:10B4B000B79C9DF37EF377AF4C05F14FFB5B0BE937
-:10B4C0006D2F1205FA9F73506B66D7F8787F8769E6
-:10B4D0007F62BCBF381C1566E7C80E844B1C4E0E3D
-:10B4E000849B012778E606CBE370467DC380731FFB
-:10B4F000DCD2665F4FC6A4A6979B3DC3FF44C6C47B
-:10B50000E79508E78FA188D2DB7157E88F403707AE
-:10B510005CA137205DECE8CD950BF01E630FE4973E
-:10B520004AE1BC2C8A671F0C0B8F1804715CDDC9C3
-:10B53000CF5713E9F42DA01788FFE67198B7F2F5FD
-:10B540003DF7DDB35E8CB37CEAD55C4897483D9B04
-:10B55000BE01F4F66B09F5EF0F0F8E18302EED2DAE
-:10B56000EEEFF8D425F2F303B6BEDBB81E77DB416D
-:10B570007714DEE3BCAD5EB2E8BFB7D5B3380E22B8
-:10B58000778FB9C9A24736A5EC07ECCEC47E8CF5FF
-:10B590001DCDCDBE02ECC387C62B1AF81F8EBCF89A
-:10B5A000E11F6A69DE35CC81E7B29BFC1C7F2B452D
-:10B5B000DCF787FC21F768F03B6D480FEA749D1BB0
-:10B5C0007E493A450A9FA3235746ABE8789BAF16BE
-:10B5D000D167B525F670A40ADA95B2778F54AE8F8D
-:10B5E0006EE93ED506F878F6353BFAFBD3BD12CEB0
-:10B5F0006383AD3A17F4F73FB52B49DFD97378650C
-:10B60000ACD72EF460BCDB5C127100DF38D83D6B28
-:10B6100030CCC717242AA0FFD99D92C8F464C3CFA9
-:10B62000D125333FBB2EB37C88A7AAD3FCDEDDFA3D
-:10B63000E953309E625EEB4B184FEC2B4F7ECF6987
-:10B64000829BDDD7F576A7635CB4778A886F24790F
-:10B6500083BD02B4CBEBAE52B07D4418B07DDE2A80
-:10B66000F53A802BB407FE9F7799ED836E05E1B024
-:10B6700095DBC9EDB660F314DA4FFB26BF00FB6122
-:10B68000D4BBCECDF499B3530CFF4D04FD37B9456F
-:10B69000AA13DE5BC90D2171136F79C401F0DA0DB5
-:10B6A000F5987F13E1D03EF2E92E383FDE00B2017B
-:10B6B000F6D9C6F069C32601FD99147ED9202FFE64
-:10B6C000749FFD2BB08EBC164105DB9BA649E7BDE0
-:10B6D000DAE360F2A6F57EB403C13D0AFDE6EEFCB6
-:10B6E0002DCECB9B62BD3FF430FCF8D325F023C7B1
-:10B6F000CDFC36B9F5DDDC4EEAC2F716230027C8CB
-:10B7000087CAD93B87724833C7A1C4E987D9617416
-:10B710009D18075A334189821F406C69C77785E7B6
-:10B7200046ECE45ABABE56A13B04F4A28F17F97B4B
-:10B730005EA1B7004E9BB70EC678B675622817FD9E
-:10B740003BFFAAE0F9D8D1D0870FC0BBBCBB2628ED
-:10B7500048174743EC9EEC43AB0ADAC10EF7D657C5
-:10B76000E17BC1515541CED2584E5E8078D2C6554C
-:10B77000A22AD0FA916AE33E82EA02BC182B7D74B9
-:10B780005D099C9F0D11C19744CE0AEC9D91B5AB0C
-:10B79000AA54D8D7B56AA660B65B748E077FF457F3
-:10B7A000EB6EBABEC0BDDB548801DF12CBB802FC21
-:10B7B000857A8BA2B1778BD9FB24197C5F32BAC50D
-:10B7C000AEF93ECC7B16501379CB64E6A7FCDEF5D0
-:10B7D00061E65F8433C90AF42FF2BF00EE6B26CF17
-:10B7E0006D18E5C2CCF635F3B13EF49345FBC9289C
-:10B7F00017BB2A68BFBBFDA15D284FA63A104E4477
-:10B80000EE69033845A76607E1DDE46D1387BF04E1
-:10B810004F54659CE89D0572343ACCF57A3BF0A90B
-:10B82000B58A06749EB1EACC2DF0DD1FFCFE9D901A
-:10B830006634FDFE1E9007FE9EBF34E0F7E98AC520
-:10B84000BF97F1C6F9CFA13CA35AB1F8093FF3570E
-:10B850003FECA6F0D9551A89D468EC7B282BBE8E14
-:10B8600003ABBBA7C3FBD9676F1083BB7939AE6B42
-:10B87000BB1ADDC0E0560E72CD80DB3A51EB84F787
-:10B880009DF5990EC48F22D28DFC6A089C2217C6A2
-:10B89000F725E38DF5CB214E22713ECFB885BE77DB
-:10B8A00061E09D4A8CD7A7724C1932C50578FD78A6
-:10B8B000597700F4F84DFEE4F1099F7A587B7B8AB2
-:10B8C000FBEE1F79183E004B6C2BC334341A520F19
-:10B8D000D1D320CD7184203EF67151FB23E2F9369D
-:10B8E0004983FD81FA36BA7F475E7817FD83472288
-:10B8F000BFC5F4654F097BD78F125C16BCB35B7E66
-:10B900000ACF4736AB0C476A5B18BFA80DF438E086
-:10B91000BCA2B694A8BB39BEE9069CC1DFC5E555FB
-:10B92000CD4D0CAE99A504CF5BC12706EF9E6541B6
-:10B930003D0ABFCC96D5CB711F49B75E48EB6D86EB
-:10B940007E617F9AD8FD14427A1C48BF1109CF1B33
-:10B9500029BDFF06CE136B5A07E3793B5C7787FE60
-:10B96000D2F9B8E9BCBF76DA0FF8FFCEB648643733
-:10B97000F2B76E78639868AB282E237EF65696D081
-:10B980007EB57255DD60E081C1C72869CCA3F202A3
-:10B99000E0364FD79703FE9D72A82FC03CDCDBED4D
-:10B9A0001AAC7FDEF667EE06BDC51DE86901FE50E4
-:10B9B0003B81CD37BD957E47FD46FB0DD4AF6DB5C0
-:10B9C0006B6C3C0EBF728E671C0EB7F379DFBE93B3
-:10B9D000CDDB352C1A01FCAC5D45E10A656186F7CB
-:10B9E000E0D2BC28225D9D80F57BF52CEC77D0EC75
-:10B9F00004BA48C03F635D357C5D35ABD8BA08A753
-:10BA0000273AAD2EE8B7A69CAD731E61ED45F84E02
-:10BA1000FBBF9DAFA7467F1AD3DB5BEC96FE779505
-:10BA2000ECE986F9E4972A9A807066EF6DE6F27584
-:10BA3000E536B1F1724B9F4678917AD37CD12F6A6B
-:10BA4000CA53BA3AFB3C252C78CC22D781C874EA79
-:10BA5000BB0A9EA3146DB7AEEBECFA110FB782FFD1
-:10BA6000F33E05CF2B1E17836FE5A11DAA688CFF3F
-:10BA7000047F3B03F8F4ED4D78BFEA402583FFD9FE
-:10BA8000AF9228E043F189EA748077F189304FEB77
-:10BA9000F01C9B0244E8E37B747ED4746A11805FDF
-:10BAA000C60A7FB800F800DD67D0078799E74DE741
-:10BAB00097D192550571489913D2AB147C4238A1A5
-:10BAC000FCC48E59F01E6EE6B11D77C238438869FA
-:10BAD0003DB4FC4A6F21BB9F758C9642BDFA33F78B
-:10BAE000C27EB4F277ED8B6166E9981E833483D20F
-:10BAF000F7C67498A74CA694C5F9C1DEFB2AC60206
-:10BB00005FC1BB2565987691B2FE7CC3547F24AF9C
-:10BB1000AF0B49EA5578358B5DBEF7BE6923C17E10
-:10BB2000DF0C7A621ABC0BA87E04F1317A5044B85B
-:10BB30006FB675394A33E1DD719180FEB2A5E4F745
-:10BB400022D0DDE6832408F89151FD1F76F33ED61E
-:10BB500079FCB86E59211B81FE8F8E3C331DF6296E
-:10BB60007A84EA9DB47ED5AF3C3BE03E71FB1F5822
-:10BB7000FC49FBF37528BF57E62A49DF7D2697D09D
-:10BB80001313EBA717CF423F5EDEF6ADF8BE6CEDA8
-:10BB90007439782DAD9DB9BDB212F418AD9A62D743
-:10BBA000603AEF9D635703116A33D87995369D7DCE
-:10BBB000D7A6B07463C3827160B7473A6467119DBA
-:10BBC000EFA8F5ECFDBE8DA51F3AC2542F2DAF7C1A
-:10BBD000C2F155FAFD74399582F4FBE9C91F3AE1C7
-:10BBE0007CE6A1F2AA0C80E7C116AB5E47E0713695
-:10BBF0006A078DB647425E3AAFD6DF1184A764EF7D
-:10BC00006AABA179E9190F6838FDEC9BF5ADEDB38E
-:10BC1000014FE795607872FF7DE7F2626E7DEFF489
-:10BC200002A05B9DB073D4C8FDC8946FE72C235F5E
-:10BC3000EF46A6E3DDCEEC93881C3A0E7C39521A0F
-:10BC400056A089C1CF5A8B6BF6013F53B8DE4FEA3D
-:10BC500016E0FD48A47F09F4A1DECA6476D3B7DDFF
-:10BC60002EC4ABB33B6F7C15FCD3F3EA99BE9FB7F0
-:10BC7000F32301F783EA7D4368FF79E5F8E425992A
-:10BC8000B72AE2180DFB5324124D83F97412B01336
-:10BC90002254FE98E160F4FBF7B6DFE1B1E33ABE6F
-:10BCA0000DC6F3F8F87A3C7C3DB9C1DECA64F1B345
-:10BCB000DFE2E37EE7C18F8E4C04F8AF6226525E6E
-:10BCC000E4A4E030CD234FBFBC79DC02FDD1793C48
-:10BCD000E961F7A7BDE53D78EF2891BF833A0F747E
-:10BCE000BBCB7D612CB3EFADFCB45F9EE355E2F7B7
-:10BCF000DC047E35DADE793DEEEF01F6BE3A2194C2
-:10BD00006E1DF8ACA8C6DE9D8D1AEFA0D741BD51BF
-:10BD10005E8F0A78D03AF2F765009F4D5C5FB8BD40
-:10BD200094A0BD7A7B4E37EA0B739BB8BE20079B6D
-:10BD300081C9BA77FAC90693FE802E2C702D357111
-:10BD40007DC190FF5C6ED706BA5B50AE827E60927A
-:10BD5000AB353A93AB790126D76B5BE8381A47E6E7
-:10BD60000AB35EC2E4B8B69DEB0F5C0E67F07133A8
-:10BD70005B98BCCA003DC207E1073ACA653CCBCB21
-:10BD80008AEB2D834A99BCCC687D1CE5DA1FC0E99B
-:10BD90003208F8069397C35E7A45073005E8E73620
-:10BDA000CAA78FF1F2804AF5B3F4B87EB64EE4E745
-:10BDB0004C84E987185B4FE77998D737BEEFE1F3FA
-:10BDC0007BFC58FA5780BFEE8D148C954C748B5EBB
-:10BDD0004F9ACF2D67E7F4B9F5EC9CDA1B9CBF4F67
-:10BDE000329D3F6CF5707BD3C0ABFAAE00F48BF79D
-:10BDF0001D918FB3F7AAD6537D09FD4FDCBE9AEB98
-:10BE0000E67E0D8E3FA9E489C187BC24E42BA5F012
-:10BE10003D1DDD87FC5AA7F612ACED74A4317B21E1
-:10BE2000D07BE4867298FFE6897FC5B88BBC14F698
-:10BE3000A2C3EB30E0F085F8BA77FA2BCC0EED1602
-:10BE400093DE9399CAFD0F9D3271033C9D11F6DE7E
-:10BE5000A1738292B4FE042FE39B195E768F68F380
-:10BE6000C47D78BF31A57C96892E2591A786BC6DAF
-:10BE7000857D9E44C8CCD65B9B75B4D3A3D512F206
-:10BE800057760F30C27F77462F51D06FD86A8B38E4
-:10BE9000603FB694F37D551DED703FFD0BEF0B85B4
-:10BEA00007ECF3FA901815F2619FA3EA68E6D7C190
-:10BEB000DFED394BED77F339C52CAFC8E1A489101C
-:10BEC0009F98D7C2F06BF34405E7B1616C56BB9401
-:10BED0006FE6BF02E79F0C4E1B261E47FCBADCF93B
-:10BEE000CDAFBF67D269D339E299071E290038C7A1
-:10BEF000DF6F090D787F617EFD4B93F624391FE8D3
-:10BF00002B073BCA037660F49BE67396855E6667F3
-:10BF10002DF11AEF3333FE06FCD586C645341BFCE3
-:10BF20004B07AE8EFAD07FBF989DD7DEC1CF6BDFB7
-:10BF3000DD7323BEBF301AEED426D9F7F30DD6F742
-:10BF400017CEEF7D249BF935A216FDEA8E7D3F19B1
-:10BF5000C5DE9FD1F9EF72102DB382BDA38D72FAA9
-:10BF60007850B74BF1F7D114F85D0CF0B703051713
-:10BF7000C22BA09D987A807E0BE1F7857A315541DE
-:10BF80001C15829D14C4349354639A45EA300D9075
-:10BF900008A6D9A413D31CB0730B412EF462AA11C6
-:10BFA000552426BE5F4082982F22D598CAB06F19BB
-:10BFB000F17309B9C381F117707E01746F9C531836
-:10BFC000E7FB377B6B1EF02639AFB8C71BDAC1BE63
-:10BFD0007721DF9ECB59F8891F8DEA84FB3D2B36F4
-:10BFE000B1FB25065F47BB86F6FFC3742607F46DD9
-:10BFF00002F2AF35EE99D7201C5B6DEF9BCF1B880B
-:10C00000C35104BF3F63F43B97FB17E672F907EE99
-:10C010006D76FF2E88F77FE6829FC1544EFACAD90B
-:10C02000FD6BA31FD13D79F840E77BA6F6188F5C26
-:10C0300093A0FF5F526E27E4E725B6FF1B9D505685
-:10C04000DC0FF7C36BB45C76CEC4E43645240DDB5D
-:10C05000B5D84FA21D16991A32C3E5258EFF863C2E
-:10C060009997E0D74F4CE7C99C2E12FAA192CF0FB7
-:10C07000F766F00D14135D1BEFE81ABFD375472860
-:10C08000AC0C61CD02B08F2A9F7784ECAC1A42D3FE
-:10C09000739037F9F37FE70BBFED35D1891AAA13F7
-:10C0A000CDEF34CDE77438556AAD04FE76364C8258
-:10C0B000603FDC41EA36833E465E9190BFC13D6CF5
-:10C0C000F8FDA06170A0918E795DA1E9070DEC5E8D
-:10C0D000CE1978476904BC7FCDDE517A0FDE4DA2C0
-:10C0E000E9E8B6BB67021EBC0BEF27C1FD5B4EFF44
-:10C0F000C6B8A33BDD7340EE8FEEBCBA16EA8DEEF8
-:10C10000B0E3EF45951C5C5F0D7E2178CFC545C738
-:10C11000C9A1E339D2818F1094B7EFB5BAA26BE809
-:10C120003CDF6B93902F7F522AE2BB23F06CA6C4B6
-:10C13000E797960EFDFCFBADA087BCCBF988F17E9E
-:10C14000E47B951ADAC7BF3CB04E807B09EFCDD1B6
-:10C1500070DDEF0DE9CC4D07B9E463F1E545FBED8A
-:10C160005D05741E0B1FFB43410DF0BF82C8C26406
-:10C17000E7CCB93E264FDE7B8A603CDC7B4EFEFB83
-:10C18000488E4E9FD9CF1AF00916BEF59E97FFCE66
-:10C1900052CE25EAF1F872E2E9F431BAEFF4C1794E
-:10C1A000D4FDEE1FE1FDB5334FB1738A5F3E509B66
-:10C1B0000BFEA8229FC6CEBD0F3C8971E3B00EB026
-:10C1C000A3E9FC3498DFFDEEB7DE05FF036D87F7CA
-:10C1D000338C76670ED4B2FA6DB4BE0FE14E7C6537
-:10C1E000800F0CEE643FE31386FEB8289A85BFDF0C
-:10C1F000102F17B11CA6E8A4F01FBDFF063CD7AA5C
-:10C20000F0A5337C563B47CDC2F94772611D07AE9E
-:10C210000EE7821FEF8CF17B52722417E070B33768
-:10C220005CE133ADFFFCC96790BF9788756FDF0B8A
-:10C2300078F904FB3D93BBDFD82A9AF9C7541FD382
-:10C240007BEE772FF5C179D499BE7775222CDEE786
-:10C25000307BD77511A7BD33EDD47EA2F038BFFF78
-:10C260007B587EA6EFDD9B4E8C273BBFFFB9744801
-:10C270006B783C3F89DE88F445E1D2E24822AFFA90
-:10C28000EE4545D97DB70B027FCFF441036E75CAE9
-:10C290002CCB7915A3EF9C9DF9C7505F8E26BF2745
-:10C2A0009728EF13DFA7BDD43DE0539C4E4FF377A3
-:10C2B0004DEEF1866B7C49E448CDC625B900E71AFE
-:10C2C000B85387710E95D782BD8DF74DD8FBB45DFD
-:10C2D0000827E3FD59FDAA6B21CEF18C9FE5BFBB7A
-:10C2E000B97A9DCEE1C8EA4F63EDF359F97D504E1E
-:10C2F000EBFFDE5BBD9C8D4F04F6FB48363FFCCE6A
-:10C3000085C1FF52AFDFFA3B171DC093C7637FF7AC
-:10C31000607F32ED6FF43FDE9FC16FFEE17E1CFF58
-:10C32000B5FD187C18E81242F6483038EABF027EA4
-:10C330007F6F7B323BCFC2CF3F7DA0B019CE813E15
-:10C3400009B077A2ECADAB09C8A5DBB76F4DFA3BDE
-:10C35000797D791E4FA214523A33D1F3F39CAF3E4C
-:10C36000EF8B9F07C0F9CC7042F87B175455C9C2B8
-:10C37000901BB4FF46F077E34B4804F5AB51A41390
-:10C38000D352D28DE918D28B291E931682AB2F88F7
-:10C39000E99F2B7B2A60F18B1DE1872054D7EE08A3
-:10C3A0001F077CFA6058F8117807788D7BE924988C
-:10C3B000FFAF7DAAF17BA224E1F7D9E2BF2BA281D6
-:10C3C0005E332330905E4354F9FDBEF88D027C4706
-:10C3D000F8651FAE2FD5EFCD25FC8E25BF476CC06D
-:10C3E0006109E9C438885FEE5CF102BCEBB370BF51
-:10C3F00017E5C1F09D4DF87B620B497716DC2F1DC8
-:10C40000CEDF93206DEC1D0FE39D88916D76CB3BC5
-:10C41000164B127ECF6811FFFDB14589BFEFC5EF06
-:10C420006F6E840F49E20812EF7FF6FA52BCE75AAA
-:10C430009AFC776512EF7FEEEF1431BE6705C40BEF
-:10C440000971BE37724F9DDD8A5F9DD71499DE83D7
-:10C450006A1482CC9EF6BA427B85FEE38C53197E29
-:10C460001D1084A47164DF4C33EC9B26723DEDA754
-:10C4700071B1AC82BDD91875E13968A3CAECC2A10B
-:10C48000DE2A07D8E9C42FAA703F659A3419E3CB96
-:10C490009525F23838F73CB67B6137DC5F680CC80D
-:10C4A000E8A71DEA67E7A0648888EF0334A94FF87E
-:10C4B000E7C23E79D839E33095E0EFA11E695F29E4
-:10C4C00042BE919A2D83611C21DC8DF76E86C88453
-:10C4D0009FBFCE189B85EF98F138A556BC7F3C6571
-:10C4E000C96927C8F53CBEEF5569F9B84E99EFE721
-:10C4F000AEFA537EC0D3E7DB9B5F9E46FBB3456538
-:10C500008C6B2DF9BCF1F56974BCDE768598DFE3A0
-:10C51000CC5D255BEECFE6DC65CD2B09F788656247
-:10C520002AA7F972181FE148F544735C55668839EB
-:10C530000B550FDE0F0EA5094C2FE6F90AC85390D4
-:10C5400074D822552E3ACF8E3705F43B1C6D9F9F31
-:10C550008771FA3F09E7017E1BF890B87F4A9A6617
-:10C56000BCEFE1E4F7839D705897883F4D0DA41808
-:10C57000FCD18EE831D715B08F276CF89ED45AAE17
-:10C580007FCB1E16FF6EE04B62BA3601EFD67E7E81
-:10C5900023E25D2FC5BBDD03E09DAC6AA827D872FE
-:10C5A0004810C8C396D99DADD276573CA3043D141C
-:10C5B00064D37E5C9A06FACC15CFDDCCDEF5A3F011
-:10C5C000C27721EB9562B0FBEDF599C57206D4F305
-:10C5D000203E7EE861E73F72BD3B08E58DED150129
-:10C5E000CD84D7CD0D6AB15C0CEFE3388AE1779644
-:10C5F0009A53FCDEF330BF580DFE2585DBFF77A68E
-:10C60000B1F9DE99E6C674451AF35B3C28EBB360DA
-:10C61000FE0F52FC817881237731FC5D31C481F7B4
-:10C620009E573C5F3878A038A07D0D816280DBCEBC
-:10C63000BB6AD0EF51B9FC9813DE055BE175A880A9
-:10C640008F926FF8FD9301DF5FB0E1BDAF466F855C
-:10C6500036D7D49FE49B807E2549D4B3C1286AD9BC
-:10C66000F2D6B5F244C0177D0748A248DAF16B65EF
-:10C67000CA5F3ABC7AB640CBDBD25E60E583F41D7C
-:10C68000022D8FA6FD86E587E9D9F04B221D692F83
-:10C69000B37CB1BE03F29D69BF67ED41B7A07ACC10
-:10C6A000A1B4D7AF053DA7D1169C0DFE9D1FD1F9B2
-:10C6B00097D2F977F2F4A71C4E46F913F09DC2FB0E
-:10C6C000204F13CB9FE6ED0EA528FF292F3F9CA2FC
-:10C6D000FF9FF3765D29DA1FE5ED8EA5687F9CB795
-:10C6E0003B91A2FC055EFE628AFE7FC3DB75A768F4
-:10C6F000FF326FF74A8AF6BFE7ED5E4B51FE3A2FE5
-:10C700007F23A1FFB778FD1EFE3DC7DBF23ABC1BBD
-:10C7100096D3CE5E022DF1B6A0FEBEB3AE1CF1BF25
-:10C72000713CD3330C7CCF81784D9ABF52657ECD5E
-:10C730002B55C6E75FE1785DB9BC680BE0DD8A7F09
-:10C7400093509E523982BFE7AB2F67712F2B9E67A4
-:10C75000F741562C97F1F7800C7C34DA1BF3DFC5D8
-:10C76000E7D764C031AD809FB7048A6798E33D5531
-:10C770006BDE41E90942769A32997C29595EE518C7
-:10C7800001F283CA17E09B6B3D4A17DCA35FABCA7B
-:10C7900058DE9459A542B9AECA287FD6665639E606
-:10C7A000A23F271DFD13793C6EAF4995F11EBFECEA
-:10C7B0009F82E5D37E3C43053EDA447AFD95B0BEC8
-:10C7C00055329ED71EA9ABC2EF79FE8FFDC09F7F69
-:10C7D000E367703FE63DEE84775FE5EF88282F86BC
-:10C7E00003FCE8B805ABC4A846AB1C535788907F40
-:10C7F000B889C92BFAE71D6B7A77B16365C50B1051
-:10C80000BFD3B8490EC2790EFCC9267950C47FF750
-:10C810005453D32DF2EA41EEC7D5030E8CC32B92AD
-:10C8200049C0FC7B989A2AF17729D83B668511ABE1
-:10C830007CCA6FB1BE63F39FD7EF7F0B008000000F
-:10C84000000000001F8B080000000000000BDD7DD1
-:10C850000D7854C5B9F09CB3677FB309BBC96EB2FC
-:10C860009BDF4D801024C006420C88BA090122A229
-:10C870002E880ADAE286DF00493670A962C5B22145
-:10C880001103450DB71181825DA85AB462438B1222
-:10C8900031E88A88F8157B43AFF6A2F67A17A48AA6
-:10C8A00080B06A45FB63F9E67D6766B3E7245168AB
-:10C8B000FBDC7ECF870F1EE69C397366DEFFBF99D7
-:10C8C000CD23CA89A889E09F8BF984289A764EA344
-:10C8D00069B052C4DBF4AFD16553B52DB664C787D8
-:10C8E00049F41F5EE2BDA82364D9EE65932DB439E7
-:10C8F000E917C503A2C584AC30A58C2003685FF896
-:10C90000732D21CDAB3AAE19A42764EB2A3A2EBD84
-:10C91000367F3D7A26292524966CF1ED900859B38F
-:10C920008A8E3FB8A7FF681BBD3986906D4A683A6A
-:10C9300071D06B58214D745EAF2C9709B497B94DE7
-:10C940006123EDB2EC8DFFBC6E08B497CA5EE2E9DC
-:10C95000795F7B7D72956B307CFF2D3A2718571FCE
-:10C9600090069F1C4DFFAD045CFE644206B625ACEC
-:10C970009FFECD6FA5ED84F5EAF57E9BCD4A48DE9E
-:10C98000B7C04DEF7CCB1E2886F1151C5F3B8F6F27
-:10C9900083EB1AA9B1880CA4573A57804FC829874E
-:10C9A0009FA0EBCC5E71EFB8936984641DB2B400B4
-:10C9B0005C49DBA384A413A2836FD3752B92CF436E
-:10C9C000281E5AF24BBC12BD1E7ED6C2E0946345AF
-:10C9D0003819246FC6F5F46A94FD36189FFEF1C12C
-:10C9E000F80FE458B6AFCB8766C00470C8DE4907BD
-:10C9F000CC84F6C0B53E85E289829B8CA37F43BF81
-:10CA00006BF5D175ED94E2ED6A6877840DBC3F89D2
-:10CA1000C0FF76CB127B4EC7575C84EC9224F63C69
-:10CA2000E4ADAECAA6FD15DB30C54B48D056DAAA38
-:10CA3000CF81E7B278DF47CAE9FAE07BBC0D70F935
-:10CA4000F941F1BCB2B56A101DDF40C4F821E8BF5E
-:10CA50005B9679FBAA56187F57A5787FF05A5F3608
-:10CA6000CEE77A9D9D90FBDA26B65ADD3DF37D68D0
-:10CA7000C3F5AD4D747D9F78A2297419A47EFBC9BE
-:10CA80007442875A3333E007380261FB8713724AD6
-:10CA9000F220BD08FCE9F75484B2E8ADF387FE9CB0
-:10CAA000524CAF415DF45012855F7D67C0A42FA04A
-:10CAB00070D6FB4259F93DEFD5EF994602946E824C
-:10CAC0005D2578EDE3BDC38AFC77BD67325CC2F7B4
-:10CAD0003E89FCB6E119FAA85E1768B50EC4FE845B
-:10CAE000E1BFEFF589F73F79E6B7B7C2F7CE79A294
-:10CAF000E953802E23142E7DBC27FA37745610A0DC
-:10CB00007B29C9B7DEE624641E853971027F357A38
-:10CB1000A17F87A9CDE6A5CFCDFA36BF97F6A7A806
-:10CB20000CCBE53DD7876D83703CED7D2DFF749870
-:10CB300048DA544AD7A13AC5FB0481762869046DC6
-:10CB4000AFAF574637D129AD2EF9DDA862683F67F0
-:10CB50002546DA6EAE3BE82A063EF21A08152F6427
-:10CB6000FDD80E37F0714BBD61E6E340BF9165AE75
-:10CB7000F9C53DE33F64D7E33CD6BE46F96C24BD1E
-:10CB8000EA3BEC12BC3F5821C087663BC5336D9B26
-:10CB9000DDA924940FFDACEB811FD7EA03D595D016
-:10CBA000CF2D9327E877CD83675457D279B89CB2BD
-:10CBB000A4C379541D5B409F37DB0C20D9C87BF69A
-:10CBC00039CF019C7EAE781B810F7F6EB5DA42F4BF
-:10CBD00001958D3EE05B65B0230C6DA38E3476D05D
-:10CBE000F96595107F87B5679EEF71F9F89ECD8046
-:10CBF000705E6FEE985641C7B12C936D21FABDB5AA
-:10CC0000F51BBB27D1EFFCB8FEF9A34DF4FEBA74B7
-:10CC100085C03CAC0E256248A1747C039D239DF722
-:10CC2000AE26BF0DE467CCA9901DF4B9659081785C
-:10CC300012E4A0B598B613E4539A43F199E9FB7F47
-:10CC4000B2078EC0FC47BFF99609DE778D9165600B
-:10CC50009B0E85E139A5543D8E6DBC7A9CD42AF596
-:10CC600073C754F5F3F419EAE7AEEFA8DB99F3D4F0
-:10CC7000ED5B80DEC640473AE732BA0EF68858A22E
-:10CC80009FAE2229089F7700FE9642D90BF031D73C
-:10CC90003F7E6A017D9E05F284CE9F8C20E127288D
-:10CCA0003E0FE47EDF13A57036A6367AECC5BDE1F3
-:10CCB000919563BA1EF0651DA4D808ED6FFDFDC700
-:10CCC0005FC3F85692D02F1FE0E3FBC43686B55DF4
-:10CCD000743EC9F00F0FC0BBF17FEE03BD7754E780
-:10CCE000057867D52BF8FD076778C2BA7CD69DD04A
-:10CCF000FE29BC7F8A697DB76E04BDFE7EED525D64
-:10CD00004A6FB8A6934609F892D207EA0B524350ED
-:10CD10005F3C20935AA01BCAAE04C6B3C10B54CECD
-:10CD2000F8530D0827C5CEE887FE4B86E7E936366F
-:10CD3000A6C13DCF0CFC7CFF2146FFF71BD838F184
-:10CD4000F13CF851544120276D765935CE461BEF02
-:10CD5000C3DB4E3B6BEF3E987A3DF0E5C619A9A3C5
-:10CD6000804E8C3209C07803B24DBEA1747DE63787
-:10CD70000C21890E3A402107F5A9B4BF85DCE9A74B
-:10CD8000F3D87CD812D2D1FBE6F9FF6EA34026255A
-:10CD90007CDEBB577BFF13E440AC4641389A9D6D67
-:10CDA000B651C56C0D213ABF54F807958F1583DB3A
-:10CDB0006D804F73451BEA6F73495B1BC069F35469
-:10CDC00019ED89D47932D2B339A7E3E8207A5F3FED
-:10CDD0005FB6C178A954B11BE8203FCA6EF3FB616E
-:10CDE0005C0A73B98C910A8C8B2BA4DF49E37075B4
-:10CDF00038F6DC2DD171D260BC11AC3FC0C9CEE198
-:10CE000034D6EE413E75F071D306D1FE23D8382DCD
-:10CE1000653DE3083C6EAE2661989FF8AE18273E4C
-:10CE20003EF1492057F5BFA670A37892724D38B9EC
-:10CE3000FB1793B0311FE0E36FDC8E7C6D253B80E8
-:10CE40005F1CD99540479987B74C9747C07B16FC24
-:10CE50008E7E3E09031D672AC4744D2AD82F7E8416
-:10CE6000A3965FDD07DB6EA63C12C78B967FDD0ABB
-:10CE700069D5A5F6E663B7C3515938A20F7ED6F03F
-:10CE80008BFB70EC7B40F45ABE7E2CE95C09C085BC
-:10CE900024F6D77D7B5BA7EB383A09909541F504E2
-:10CEA000057DAEE67B84FCCD086D89C89E8B034171
-:10CEB000EEDB391D537D459975F728DB042BF0E92E
-:10CEC0005282F455B977FDEDBFA6E35D186CB081D1
-:10CED0005EC939DCD60DFA91740686001EB62A8129
-:10CEE0009F24D1E75B8F651090DB6BCD6426D0B7B4
-:10CEF000C2E95CAB5F1E02BE71226B8465D7DF7F27
-:10CF000015F660C7A0F461361B8CFBFA6193F37FC2
-:10CF1000D1CE0A0D433B2BFB60779315BE6F9BDC94
-:10CF20006AA2F035BFC9FA3F48DBA14100BFBA3C55
-:10CF3000E0C303390B104ECABB4602743A5CE70BE0
-:10CF4000439BBC6726207F773EF79D5A0FC89FF40E
-:10CF5000291E90433F017EA7EBD9C6F95EBB7EC573
-:10CF6000E00B803DA1BDFF685C2EF94FD5503C0E13
-:10CF7000FFA981ACA30F8BE439ADF9C0176BA9FCF5
-:10CF8000A54FE7E83C0D3F947AF0D369AED86587AA
-:10CF9000EFAD32918091AEEB2B89042873E6387E99
-:10CFA0005B01F227974424D0B3B98DD4E005BA5A77
-:10CFB0006E2181047ACFFE4AC1FE9D66DF2E3B972B
-:10CFC000FF262A07F4EC9FE4E7A97E52E360320AC9
-:10CFD000EC17FD3396E3203788A3CA17F7370A808A
-:10CFE0007EA9DEA7DFDBC7D7ADA76A423F8AFEB5C1
-:10CFF000CA11E388DEFD5FE6FD14933502F252B1FB
-:10D000001E3986F2C5A69C4DEC670A337D43EA487B
-:10D0100078B0C4E082ED7FB3613B8BCA5FE328B494
-:10D02000FB434698670AF33F88CFE771A403BF101C
-:10D030000472B689B49A683FA476CA6F6ED26D4600
-:10D04000BBF920F1003F5088D9C13F845B00D7ADC8
-:10D05000845427F281B88EB4313E5056E8D05F1A1E
-:10D06000F6AA19E7A36F246133D84330370A6F65F6
-:10D0700039092BE06FAD3060BF91360FBE67208D50
-:10D0800068CFEEFAFAFD4C90D39643D41E1B097874
-:10D0900096514E592C6AFE23A409E1F409E7BF6DAD
-:10D0A000AB6C88E7B87F16788BE339DA04FA22771D
-:10D0B00079AA0ABFA25FF6575924303A71DC308E44
-:10D0C0009B3DE8A0448AE1792E3EDFB6CAF32DE30A
-:10D0D00017F433BE1BE9A8FFF1B3F1F9B6C85BF64C
-:10D0E0001B2928B6C60EDAFD9E1EFB5A0BE7ECE59F
-:10D0F0006AB93CB253DD167031EB7D8E6914E6E6F9
-:10D10000EFC9DEED74BC2B8FA9FB55E7BF8DFE6D1B
-:10D110004FFF88E366E84FFDEFED201D4EA9FBFBB6
-:10D120002B5EB3031FF7F467F3BBF62B753F2D7E21
-:10D13000B4F3A5F372DE9230AF0926A3EAF9CC9AD4
-:10D140005EF372DE9630AFC92E75FF4053DFF3BA3F
-:10D15000BEC8F88DF312FD6E2ABFB47EDA75DC5CB2
-:10D160006DEC07EEACFF6D332F6DDC3B6ABFB9DFB2
-:10D170009D2BB4DF0921BD5F2FF97CA9F43A076E1E
-:10D1800081BD68B5A0DDABA5975D5C7E4E067B8E4C
-:10D19000F69F95EC9B9C4ADB1305DF3DF5BBDB411D
-:10D1A000BE1C7EF68A0C90EB59A0E7109E2CAEB008
-:10D1B000BBCE857185EFF2FE549FB480BCD8BD9381
-:10D1C000BE97C2E695683FA5D531BFC24662C8CFBB
-:10D1D000C25E4A253689F9E3CCDEE9EF3BDAF1D7C6
-:10D1E00071FF73EE8A09E403CA87CF1B6C150AF836
-:10D1F000678F49680FCCADF2E992297D8C6B953031
-:10D200006E34F79E7F1B0D7265EC494F6794DE9F6D
-:10D210001BB67BE1B30DDDC417A67495A15B5A72F2
-:10D220001FBD3E7280DA3FBCBD14E8CDEAF380BF7B
-:10D23000510333A2E39CD53796D8406E7ED7EA03DC
-:10D24000B95933C3F70EAEF7AFD42AA1FDE6B3A5A3
-:10D2500093BDEDD30C1E6A67D47CC7530E764F4D39
-:10D2600087D9875713512C741D35D41E836B868143
-:10D270002866B85A8809AE65AB99FD9552EE37D449
-:10D28000D0EFD774FDEC0B786FA1127985D993613B
-:10D29000C45B4DD71B7F027B6DBECF6F0079316CB5
-:10D2A000A781D9A49C1E8677A8DB200F12DB25114D
-:10D2B000757BF46175FBC35406DF7D527818E06717
-:10D2C0001F5570E017877619515F1CD86F44FC2CEE
-:10D2D0003963D90EF1A7094BAC28D7CF3C6DC6787E
-:10D2E000D43EB9E35968879E4D42BFFA9577F795CA
-:10D2F00049B4BDF817C9323C7FF16B1DC21996A322
-:10D30000A7F7973C3B74FB3A7A7FC9E88E321BBD86
-:10D31000FFFC158474C373253C02D6F7FCDF743818
-:10D320007EEC29637807A587332FFCECD97BE9F7DE
-:10D33000CF3C95952A51BC5C05FA80F61BF75393B8
-:10D3400005FC8C71679E1908F262C94EA36A5D4F95
-:10D35000A7327B83223305E8ADBF78E289B53FC3AE
-:10D36000F78B4E1D437ADBA70FC91658FF5A465F4D
-:10D37000DAFEBB5399BE11F380F7F2297ECE7F6CA3
-:10D38000B913E2684336A9E13B34AC6EBF90CAF4EE
-:10D39000FB1C92703F1FC62B58E3023B753B417B41
-:10D3A000A6E8D4EF6FCF073BDAC8EC07ED3C0EA43C
-:10D3B00032BE7EFA693A0E930F3A663FD315537E1A
-:10D3C0005CC2E9F84589D9AFF4CFF22C4AB74B409B
-:10D3D000F117F4DC5FA2998718FF077C9D0EEE57CA
-:10D3E000C7DED4213E4EAFAA1D7D7270EFF97CB826
-:10D3F000AA716895BEA7BD60D3D2436EFA5EDD6E9A
-:10D4000027FA89E27EDD53AFA6DF41EF9FDDA978E1
-:10D41000C174AD9BF5E443E3A0DF53BA0E982F3CF3
-:10D42000F7D1F59EED782D05FA2DD86A1FA54BC0D2
-:10D43000C3C24DDF1B5A95200F2F971F04FFD671D3
-:10D44000FF766F79F7A42CA0EF4D9217BA2DE9B8AB
-:10D45000E5E61BC056D9AAF30EA6CFCB14E2D78DB2
-:10D4600042D77B065CEB763F7728933E0FEE1F5347
-:10D4700006EB5A27FBAF1F0EF4FF981EE3585AB86D
-:10D48000FC85E39BBE1F91E9FBEB6EB5D686AD38FC
-:10D49000EE41681F28DAA183387BCA292A9FD8FD6C
-:10D4A0006332E5C9535DF78F8078E23EBDB515E87C
-:10D4B0007C5F32C34368970EE53C89B0758CE3719D
-:10D4C000E325FFDD6E50E8F5D4A9D529158C8F50E2
-:10D4D000BE805076D0F5D5FE7438F2DDC24D6A3E7E
-:10D4E00011FDC47C1785D5CFB5F4919526E20DA426
-:10D4F0002891CEB4FDD2A6860CC057752BA83C4E01
-:10D50000B07FEA4EB619C06ED27E072C4022F0AA38
-:10D5100043FA241E5CAF99AD979AAC26BADED3F0DD
-:10D520002F16F796C02F5F2CE112C9922B489587D2
-:10D53000C273C974520DD77D52E4211D9767187FBD
-:10D54000DF9584F2ECAC2DFAE48F81FE9EC9F18662
-:10D55000E8A34C1E973BEB89A4A4D2EB79E00BA087
-:10D560003F1B6B2FEEA2F29CF2F7994F0C28D79B32
-:10D570003A5E4D017C9D7DD62CCB142F6776A75546
-:10D58000423CE76CC7AF53605DA73BD22A212ED740
-:10D590009FBCD1CA29A1CF8FC33FC7526598E6BBB4
-:10D5A0002A0DE4564B1A18E32423ADB1A4B10FFEA3
-:10D5B00017EF390C8D251E901BDFB57A77303811A7
-:10D5C0001F6D7F76386D07E05BC8A91A898D2FDE45
-:10D5D000BF318EC76F968FD5EB86621EE833E21996
-:10D5E00000F27A1A287AFADEE1570A0780BD20EEA7
-:10D5F000373AFD33D2E87D5765B74F0771C429C468
-:10D60000DB4CBB7EA0F3DE65A3F89A47A8FE826BD5
-:10D6100069C08071971627AE6FAE42220AA5F7B98E
-:10D62000A05F47601BF13577AB146EA6EB99B75E30
-:10D630000DAF05EDC61E3AA17F17112A608111B703
-:10D6400026F4A3E32F023D4AF1B0D844224974DC0A
-:10D65000C58FABDF5B4222389FBA672E1AFBC2C769
-:10D66000171C1F8D4E5F7D9A4A0EEA510E2E21FE29
-:10D670006BE0BB4B84BE7E8BE12B78CF3D43E75103
-:10D68000FBE3FC8A7B87CE4B837822F1811D41DA54
-:10D6900093918E975491480E9DD7922E29323CA596
-:10D6A000675CF24B89F96744C1F57FF116C3DFED82
-:10D6B000DCEE994F6F831D7115F8EF80EFCD12CE20
-:10D6C00063DC33522899FA49F34DD4C503F9C4D722
-:10D6D0000BFD07D0F6421242F83C9C968F785B44D3
-:10D6E000BA0D8C7FC2CDE9F4BB0DA7A84C2297429E
-:10D6F000076311DF9F132FE2FBDFE3745086F421F1
-:10D70000EE53FB8698537BBF0F78F325C0B976ABF9
-:10D71000BA4D1E4F6817005E683B015F0D7B2E1AE5
-:10D720007D7DE0E991B87E0B0F9D363C913F98FDE1
-:10D73000FC3EC7E323B72C70833C7A18ECC94C3EFF
-:10D740004039C86F22E22311131DDF329AA8E22567
-:10D75000D44EC3F62FD2FEEBBA4DD9846CD4073029
-:10D76000EF3057E73F0429B281E9815F01DDCF95B2
-:10D770007DB90AC2D557887EF30A460F8F8E6A1C80
-:10D78000DAD887BF2CE6BF51EA88C8209F5E60F6D2
-:10D790004672694C1F48E0F737D3981D33E040F4D8
-:10D7A0005016D0DF7312C6F7374BA445A2707651DE
-:10D7B0003C835EDA2C1D3F047A6CF3751ED24C9FBD
-:10D7C00097EE99B6F435F4B92D5EC897D4EFA9D089
-:10D7D000D55B71FDCCEE4D6ADC2ED3E71977168D43
-:10D7E000023EA3EBBE733ABDFFDB340FC2CD6D65C5
-:10D7F000F4E35A1DCA5F06F1DD03FEA5AF01DD0D9E
-:10D80000B7601C2D83C22A3915AFAD60CFBA4893DB
-:10D8100004FDD63825C4C79A1A32F397C548CDCA35
-:10D820008054763D46AF92425A202E9CA150FB98E0
-:10D83000DD6F81EF3C92C2E6E59475774E03FB7C89
-:10D84000146BA7AE947C3B508F6D403864184935FB
-:10D85000AC1BEE833D4FA7E1DB8DCFC338EF8C09C6
-:10D860008D25308F8C81ECEA3044B2619C23824E4E
-:10D87000BADC32E88DE55CFF2FDF5D91914ADF3F36
-:10D8800072D6A4803C3FE212F668C40AF628195406
-:10D89000C4FA733DBBBC64420630B52357DDEFBC10
-:10D8A000DE376034E8ABA33ACC1BFDD1EA1B60A79E
-:10D8B000FDAE32B07568F1AF7330BC06BF92483828
-:10D8C00021FE109C7901EDFCE0578AEAFED955262D
-:10D8D000124E883FD4D51E9804FDEA49F71AA0C716
-:10D8E000FA8E24124EE08FAB2C7D7F57F045F02B43
-:10D8F0001D098D46B2CF8638E9117D6CCD7CA0C361
-:10D90000FD12C6B382D4AF0F25CEEBAB34124AEB77
-:10D910006B9EE9EAFB743DAA76E797D88F9447534C
-:10D92000E03BE76CD1143B5F1FF413FAF77C580E11
-:10D93000E947629E92E96188335999FE9A06F85543
-:10D940006229D3937BC615CF61BCD484759E9B6935
-:10D950002011C44B0CBF0B700B0D21644BD7A706D5
-:10D960000FD8235DAF20DC04BD24C22F9498B76A82
-:10D97000EE8EC854565CDD9EB3AED84C517580CB4C
-:10D980008550DE3ADF78FA5C27ABE44452695C6E7E
-:10D99000A0987A04B2681857F5AC83386BBCCDFBFD
-:10D9A000C7DF0FE54FA9A2E39516B3F727B717FC1A
-:10D9B0009FD5A003491BD3CF4A2CD79F9CD0366953
-:10D9C000DA56DA1E9ED0B6699E3B34CF5D9A763623
-:10D9D000EB7F363992ABF31232BDBD708A42E5D689
-:10D9E00059776436F5A8C97ADDD02955B45D5FCA88
-:10D9F000F47A4397E44535C5E1D7E06576ABD51BAE
-:10DA000035CC2D0638741F02B952D729D924CA073C
-:10DA1000D68EDD116CC37B9E84F73A247CAFAEE3D7
-:10DA200038BED7EFF84532F2F9BAA213AC5FC74758
-:10DA3000683FAC69A9C1FCBEC85FEB88DF9725F5DC
-:10DA4000E4AF857C3DE7F6BD2A33BAB625FA7341CB
-:10DA50001837216E24FABF37BCEB6D304F92967F9A
-:10DA6000DA04F6F47FD77F3406ECCBF7B81ED9285A
-:10DA70008587C277B790C050D0A3DFAD1FFC8A4C1A
-:10DA8000FBBDAF8F6E831CDD86F66B107EEF2747E4
-:10DA900073242A637EE4B88EB59DD16D00CF8F1DAF
-:10DAA00053A628749CF773A239326D3FDABE9CB539
-:10DAB0000747B741FB654780F51F1ECDD1D9C0553B
-:10DAC000AB9952459F3F61EB9B9F5BB91C11F333B0
-:10DAD0000FF4353BC07EAC63FA671BB57F4D545ED7
-:10DAE000CE5E7C7AD713140EB3BF9F8472EC89B3D9
-:10DAF000374F61FE41C8AF9441FC97FD41FD8872EC
-:10DB00005E41FBC20D3A31B5071FC9B9DD1ED41FF6
-:10DB10005734EE06BB25637631EA8FB169BED3F088
-:10DB20005D71FD4526BB9E76D8985CD6C9980FCF0F
-:10DB3000B83719EDBA87CD6C3D946F10BF568E8FF4
-:10DB40006D0E66976E7330FF7649DAC4D30E7A7D18
-:10DB500057F26D3651B8BFAB272133C8D94516B43B
-:10DB600097EED84EE50695DBED7CDEED1BDC61C85B
-:10DB7000E7DF21113FC815213FDAED3E776A825F6A
-:10DB8000D45E42DBD61E3FB87D9ACF6D71C0355D45
-:10DB900086BC8F904BEDF9EC3DA18F329AD977324C
-:10DBA0001E1EBA03D691A4B0F8D5FC99853B9AD035
-:10DBB0001E988EF3253E9F1BE220271715C810D70D
-:10DBC00012F8B962A06F2FC0E5769E17107812F890
-:10DBD0003CCDD73D5747ED09BADEBF380308476A49
-:10DBE0005F8CE0F133B42F4E836E4F802F51A263D0
-:10DBF000E0FEFF4770FA3D3CFF47E154BF82CA0B8D
-:10DC0000F912E40587DF4629A2CF60F202FD79B858
-:10DC10000F7AA7332D1083F1C5F767DF5B8FF6A46A
-:10DC20009857D2DD7BAB6F23BDF94C6BEFFD19F03C
-:10DC3000E5ECB14BBD220ECABFF3FEBB26CC7BBCCC
-:10DC40006FE840B9F93EF5A39A40BEF0BC7DD9F724
-:10DC5000971C017F548C1B70EA70BCB592CF0DEB02
-:10DC60005B4BF16E82F94F33A0BF21F46ABB3DBC20
-:10DC700019EA26DA6FC9C6BA89F384D5A78456246F
-:10DC800061BFABE41304E2AAB1B136CC9B533AC1F5
-:10DC9000E7EDB30AB17E85D243C80CCF293D419D43
-:10DCA0005F7B095D108C37EB0A7C0EFE3AFAD9B324
-:10DCB0004C385E1F74C2E2D443587D467B3EA7C3F6
-:10DCC00045054887E9CD2C1E4A14DF8869097A7E0C
-:10DCD000BC93E139A934FADC7F01CDAF37A33D0B0A
-:10DCE0003A16734A6D19381EC5FF60278B4B209D6D
-:10DCF000CD7B2899D7C379CB00AE0F2433BADC6A29
-:10DD000066F9AEADD47E46B9C8E957D4E105B89DF1
-:10DD100017AD9553C05E18ED8CC73B7C107FC07863
-:10DD20003B7D3E272A1D07BF6F4E481731425CB826
-:10DD300075A22F9AE0BFC01FC817DEC9E52AD944D3
-:10DD4000D0BFBA13DE4B81F12D29901FBD13DE0722
-:10DD5000FF71E544551E7022C8F0313DF3D3CAFD72
-:10DD6000894E1EDF6C7BD497F81D31BE763CEAC726
-:10DD70004E723A11CE9101E04734E9108FDA7946BC
-:10DD800037B1B87974531ED29D18AFBF79FE8F2E6C
-:10DD9000F63D89EAC10513987F2FFC9EF9DCFF262A
-:10DDA0002BD57E1DC479E26D5DEFB6D64F84FCBEE7
-:10DDB000BA3FB35B928A6306CCFB7824D5FC05BCE2
-:10DDC000FA83439DC0E725C24DE8BD47CD549E521E
-:10DDD0007AD904759094BE36DD93847ACC61080FAD
-:10DDE00005BADA02F535A84F99FFFEF91175FC4521
-:10DDF0008BBF1FC4E9EAF2FCEE26C0B9B3B7DF1D42
-:10DE0000B4C41E03F8072D8C2FCFED4F46BE2283DE
-:10DE1000A2B3A1EEEDFC3E23017E6890A2852027EF
-:10DE2000CE49BE1AECD794E401FEFC406671812015
-:10DE30006084AE3318FA0BD65B053BD57EF839FA11
-:10DE4000B796F2CF39395A06E308F902F204EDAC7D
-:10DE50005A96876A904908FCB4ABE4398BD09E98F7
-:10DE6000954976E0FDE385E09709BD41FB1D94529D
-:10DE7000191902FFD5717C34C827B05F1DD44D013C
-:10DE80005EC05F83781F3C4C885337AC3F83755B23
-:10DE90000D7BD47453D74357D24509DE4BA033943E
-:10DEA0000B218423DAED2047AA581E3D99B793AA87
-:10DEB000BBB18E2BC8E32FCE03D149209F924B3BA1
-:10DEC000C81C7A0D9E6276CBB8AEEDAF825F6EAFA6
-:10DED000EECE01760AF278A7A01B31CFB15D1B749C
-:10DEE000E0370A7B27C16F1D3A5D15B7588DEF816A
-:10DEF0001F0CDF8BC22D379015D3931BB99E4C029C
-:10DF0000871AF469DB10D4A7A0EF40CE093F1AE4CA
-:10DF10001ED0D5C0F4CA23C0F72FA657BEEE74B2E8
-:10DF2000EFA17F00CED7D8FEE94EC047F4037FFAB9
-:10DF30009BE3905C7E13167F5CF686F31BE9FFFD86
-:10DF40004BA6FFA11940E7CB244F06D0F9F138FDCD
-:10DF50001762BE52DCFF5017C038A388772D82F8B5
-:10DF60001EBDD67139B480C7C71688B8D826755E6D
-:10DF700015E2D189EDC5224EB6D3D8536F04F2A372
-:10DF80008A4492E978F51067836B87FABD061263BD
-:10DF90007CD479D1A8CADBB63338DEC9E9C95E15AD
-:10DFA000D681FCDA6C66F13221D7C6ADDC8E7432D4
-:10DFB00060942FFF7EE09B37F4186FF903A70301ED
-:10DFC000974667E551C0A745C7E381F71B519E9F60
-:10DFD000A476C26E1EE7990EFEF1AAC050A897273C
-:10DFE0008A2D37D17F16D775FBCCB5687FA7CB2A92
-:10DFF0007A7DDEC9EA9B30FE85FA2209FD012ADE20
-:10E000004600BD9615087D4D4640DCEDB89EC5CD59
-:10E010001B6EB50660BCA8CCE4A13B9DE929773A0C
-:10E02000AB5714EDB8FFC9E951E443210E95988F21
-:10E03000F0C4FB6FE075C804D7BB7111AF778FF3E5
-:10E04000858CF22DA9D88F7AE12AB912E55BEC63B1
-:10E05000AB07E0527DA66E11ACE3B399160279C905
-:10E06000793C1EEE4DB7E3B8228E7DB9F1F0D1E9CF
-:10E07000717A54C5C3F771B9B88FB0F9865A8C2C30
-:10E080008FC1E7BFEFD41561CE1F21909BB1DD6634
-:10E09000A68FA99D0CF27ADF9E216158CF713DB306
-:10E0A0006742FB93F9FB81CD10A7D9F74BA717EA7D
-:10E0B000A0828B4F8F00FB76DFA9A77FF51BB8BF2F
-:10E0C000DFE8057F741FCF63D419228568CFF3FA88
-:10E0D000CFBA944821C4A55EE4F8AAB3D036BD7F78
-:10E0E00083293035DDD9936F84F7E0FE8930F31B47
-:10E0F0004E104607A1F52C2F4CE1EB8679C4D6666D
-:10E1000060BE12D60578F860FF709CF7463DEFFFC1
-:10E1100020B32F4FF0F689174AB01EF2BCDF80F50E
-:10E12000CBC187993D3B57F63CB60264EF4B49188B
-:10E13000079DDF7E14F347C187164E85E7C1C52BC7
-:10E140006F24DF9057013D9518C73F4762B9E8A794
-:10E15000D7167444E877CF750DF5B2F4A80B937118
-:10E160000DBC4EF624852FCC3BB65F8FF0BFD4F1AB
-:10E1700031A059C6F4257C279898BF42FDA2CE67EE
-:10E180007D5BFB9C3E5A780FFDFEDAD4C00FD213A4
-:10E19000ECD8E04B6E94A31F3CF8652EDA3B6D2C57
-:10E1A0006F7252EF9B0D7C62AF8A18E624C8D78D40
-:10E1B0009C8FE71AB95D4BE56022DF8BE765956AB6
-:10E1C0003E13D747D2995C4EE6F512BD9F8B7ABCC1
-:10E1D0009B8DA08F59C80BC6F5E0FD3C9EC71C77F0
-:10E1E0002AF60AD49DD57594609E346F6504F99221
-:10E1F000C23B02FEC9C9CDC94C9ED065C2380BCA0C
-:10E2000009DAD50B74ACFE638191DAE9CC2EC0FE3D
-:10E210001F6ECE403894AD66F669EC3909E5A2C8A8
-:10E22000E7D610F6FEDE96E3211DED5FB3532AA17B
-:10E23000A295D4B454607DC8E2ADF988FF715CFE4C
-:10E24000CE35FA0A3703BDED4D467AA3DF437FA0F2
-:10E250000E6AE046A15C32807EADDD29617E44AC71
-:10E260005F9B3F256175DE695C0793DFA03748A29D
-:10E27000DDC9F510E80BA2B16FD57411BA247DAADF
-:10E28000D50787E372F2F2F4E9AF417E8DE9AD4F35
-:10E29000A9BF70249DD10993FFBB59BEA99E34B27A
-:10E2A0007C1BD767F175717DF8A18EE9DF05C60D7E
-:10E2B000783D9E9E8FF35A4CA23CEF1433C0FCFA7B
-:10E2C000A3AFE3FDD097A0AB139CCEEA4E91C8D587
-:10E2D000F47B752B49A47E04BB268F40FDCEF4BC95
-:10E2E00089E979B85A2E41DF6BF5BC56AF6BF579E9
-:10E2F0008681E96D414F89F907B093C6AD0CEB58A3
-:10E300009C39DB86FBEB387E97A4F92E668EE9B14B
-:10E310000383C74C26CF4868FB498115E26715EB9C
-:10E32000B2212F40F500F06F1285D376888B71FFF4
-:10E33000E3EE6CB67E17AF93D22B7E5262053C752E
-:10E3400063BC20E624E8BF0BF86E4BA6EF8D82F786
-:10E35000185FC7DF3791164BC2FB95FBCCA8972EF1
-:10E36000BC908C753D54CFE4D9E978E9EF51BF8179
-:10E37000B6CFED4B463BE11CD71B0E1197216B101E
-:10E38000BFCE0C86E710A9CC82F83691A66481A88E
-:10E3900015F66CBDBDBF7C047F9EDF7D2BA33323B0
-:10E3A000EAEB0BF6E85DD0A6F3C13AECE40C36EFED
-:10E3B000E09E0925F742FD85DFEA65500D9480FD5A
-:10E3C00061D42DBF15E25E93742B63F7D075D4E74B
-:10E3D00058B1BEBB2AEFF7BF9B45DB1FEFD113231C
-:10E3E000E0FD899B0744E035C5E7EA8B4F1685F5CC
-:10E3F000AAFD834B76AADBF51DEA769024EC2FA4C8
-:10E400002058F1FB926B0E26D0495946B2E3C36106
-:10E41000C096C40BF5E944F79D01813EE4AEB87E99
-:10E42000B9CA7BCD413DD6F75D9DC1F8D900F6D183
-:10E430001CA0873EDEFB23E77BA3B1F114EC133075
-:10E44000BE68F436D1B7CC198149F07E831C3B04F9
-:10E45000F834E69D1D01FAB432EFAF9827BC701F67
-:10E46000F1027C2E982BD04EBAB0D9EC017FB13D91
-:10E47000D7CAE2322F496189F91553C750F95A8B2F
-:10E4800053A1EBDD74DDC76C530B31C9885FEA55CE
-:10E49000B9405EF9D0CFFB709AC5B69ABE57BB891A
-:10E4A000E9ED3AD29D0272E087803FA06BDD330632
-:10E4B00013FD677E8B6F68139DEF12BF05F733293D
-:10E4C0005F2B7EA0AF0760C804BF644E069307F5BC
-:10E4D000A6A8A102BEFFD779D5CE829E389E41CF95
-:10E4E000E2784A6749248BBEBA70C55CF4BFE2F992
-:10E4F000FACDAC8E6CE13D3578FFD5CD465CDF873B
-:10E50000FB25A4F30FB7B1F52FDC64F640BDFBB5D6
-:10E5100076E6BF2FA4EFF5BDFEC91FC3BA3EDA7A77
-:10E52000B717F2101F11F69D908DC5DB3EB2B1BA40
-:10E5300002E80BE37CB46720DA43B59B164DC5FABD
-:10E54000BE6D3A2FD823647F32C6B1166EFBDE6FE4
-:10E55000C6429C6CFAEDA500876BEDCBD3212E440F
-:10E56000FBF9C3CCBE6675D3A9E54F021F5EFBF570
-:10E5700084EE6BC1EEDA46F9249FED4B007BFFE0A1
-:10E58000B6C968DF2E9C66B1C3BA3C5B9F98047A1B
-:10E59000E8A3699932AE6797446C0007FB8A74B8A8
-:10E5A000BF5052FC7DD1537E860EE15A9167F546ED
-:10E5B000E0BDB775482794AF6E053D5CBF4D8FF643
-:10E5C000F3C1E9EFFE6E96A387AF16EADA6E1D97E8
-:10E5D000603F05B7DE20E88444CAC02F6330D1F223
-:10E5E00097316F6521CC47CB670B573716B2BCDC30
-:10E5F000E5F11BD9CAF8EDF10C89C56F2E9DDF7EC0
-:10E600007E39FC46B25355FAB7B75C0B613F91D7E0
-:10E61000307989EF092BE6AF7D1295BB6F6528F83D
-:10E62000FCAD0CBE8FEB4FCB76BE49E1332B23B054
-:10E630003F03EC28E22B013AF2C46C95B047CBCAF9
-:10E64000ED41B295D9DFE02700BE373AC993EB120E
-:10E65000E221DD196C1F21E5FF4330CEB977FE7A48
-:10E6600008F0D3907B7604CBEBFE11F3A0D62E9668
-:10E670003FB77A635857A077F891FE845C0F7A9978
-:10E68000DED1AE2BC3C5FCC2A02386E37CE6627C50
-:10E6900028F20A5B5658301EBCC51136B37847883D
-:10E6A000805E9A5AAE63F93F6EAFDDC0E3ACA6D28E
-:10E6B0005709E4FDC878566FF766E9AB4A1A6DFF53
-:10E6C000A67CA217F73996FEB4B500D63D5ECF9F63
-:10E6D0000F0CC1BAFFC35781CF97B9741EE0EBA9E5
-:10E6E000A5AC6E94D4A6601CE7CDD20F1CF312E645
-:10E6F000EF27268F95D2C974EA2C25D639DE38DE6D
-:10E70000ECB126D0D7676D5235B39B3D03660C67DD
-:10E71000711AD4C3A56A782C7319F0BB2FA6577C45
-:10E720000A70BEF61A868FD3BB8C61907FA7F9BEA4
-:10E73000A15E74E1E2F4F39D22551D82C3D0910BDA
-:10E74000FAF18CA47E6F71AB0EEB0016B54A244C27
-:10E75000BF77FAA9BDB920C73F7E626FEE9C84F9EE
-:10E7600068DF13578BF81E8F776AE3D7FDC5AD4579
-:10E77000BFF39B48C034B0A7FFF9DA3F63DC7A4EA1
-:10E78000178F7BFB7C831CE04FF1FEDAF146BB194F
-:10E790007D489D12C64D44DCF6C4E19F4286288E1A
-:10E7A0003F7357BE9C58272AAEE338DE6E06BCD1B5
-:10E7B000A5985B59BB3F7CF5C78FFFC1F58FC0DBC8
-:10E7C00089D68103008E8606AB42D8FEBD22B0F703
-:10E7D000B7118B17F8C990E9B282FC12E71F7C6968
-:10E7E000665787855EA9BD96935984EFDD2DFBB1F1
-:10E7F0001EF14BB90DF76FDEAD6BC43AF73217FB64
-:10E800005EB6CDBF7B01FA391D58F74E5AD5F04D93
-:10E810000728809EAA31A09E1270BE6ACE5DE8EFE6
-:10E82000F6819F4D403799E5EC5ED095CFEDE52818
-:10E83000E643CCE5C4067181E6B1219C8FC04F90C0
-:10E8400075275297847632D4EF24A562DE37C4AFA1
-:10E85000C49A4AE2799024EE1F134DDE838AAD10EC
-:10E86000F413F304310675400FDB3BDA0A59DE1866
-:10E87000ED4F1817EECF2956306F00FD0CA3BE9D4B
-:10E88000DEE274C9EB3BA78AFBB5963EF32C5361DD
-:10E890009F14ED9F43F520D87FC4AB57ED93DA4A20
-:10E8A000ED66F0EB441E5B277794B8D00FE98E42FB
-:10E8B0009CC55066F2805E4DD2751401DEB4796D50
-:10E8C000DA2F9FD55364DB41AF887D500D2B26F89E
-:10E8D000619F41DCCED8CFFCA3867B2AF0FE842E3C
-:10E8E000962708B61A711F67B053C2BC5C83DF104D
-:10E8F00036613CC4D304F80A513B0CFCCF763BABE9
-:10E90000036BBFCEE60D91C4B87AF4B17B31AE6E25
-:10E91000C57CE4DF9BA73D9F4C013032210F37C0FF
-:10E92000C4EB0D59DC3D9DD393C0BFE06791D74D3B
-:10E930002EF6E783C5FDE5C6D0AF2DCECBA87F214F
-:10E94000B73DF88DF52FE4A31BA0FEC504D63C7F90
-:10E950000ED3A27A33BEAFD1ECC1FC5DFC399C472B
-:10E9600061EA94F8FBED374C1C8475BBBC9E66D6FF
-:10E970007AA8C37FD84C54DF4B9C9FA2195F4FC726
-:10E98000B77A44FF7BAF9FA8601E9BB7DFFD21D401
-:10E99000FB3CAC578F872428F6619A7ABEB72E6B62
-:10E9A000C883EBC7F7E86FAACFF7BAC6F4E8F10758
-:10E9B000DE9DDA36D203FCF539D6410B7D1C74B0EE
-:10E9C0007A18ADDC3AE09284FD3B0954EC9A993513
-:10E9D000787E433C8FDD35CD07E758883C7670A5BF
-:10E9E0001FEBA141FFBB50FF9FFDF01580D2F4D378
-:10E9F00068FF07BF52585C89DA1112A543535705C7
-:10EA0000C64FA13C17F4A6C0FF62AE97C05607FAE6
-:10EA10000E6EBDED091D7D9EEBF6FD078ECBFD4014
-:10EA2000ED7C4FB9D8BE816051E5669007E47189ED
-:10EA300080DE5E57F419DA190D2F4C1C9358CFBFA6
-:10EA4000A8F311560FBE53DFE7FA4FB9983DDAF03D
-:10EA5000C27318173D1D66DB886A95F0DA71109F46
-:10EA6000A995C1D222A5E19A59A8FF67D275D075A0
-:10EA7000FD86DB25C19D3787607F4190FE05906D47
-:10EA8000F12F407B7FCB4C9315F248C1A2394B91BB
-:10EA90001F6C161FAC5F3BCF781EFC1E0BC62DD71C
-:10EAA00075EAABC16E2AA376D2AFE87C7352A75445
-:10EAB0007BA95CCAD2ED2EF9372BD40FF4AD87D7E2
-:10EAC00067323DDC22F943379562BD2749AC47CA1E
-:10EAD000EB64F6D84597411587BFE86276E2F850B7
-:10EAE000F704A0B997946812D8C541E2FB14FC5C06
-:10EAF000E2B77A601C380103EC2CC72A0FC6854D9B
-:10EB00008EE80F47A2DDA4A09F21FC88732FB038A8
-:10EB1000DA5277C0EA86F88E2EFAA39B006E3F6425
-:10EB2000FBAB89C2E44DEECDD65110F7323BA23F8C
-:10EB3000AAF6601D11C61F065CDD827878C9416C9B
-:10EB4000009F09A11A454AD033426E4C88EF637288
-:10EB500060BCB5928B97C1145B1F9A90445B2EA644
-:10EB6000F5D80587FF3A43819BC25E904D01F4675B
-:10EB7000AA6652FF10E8724DEC900CF17D4737DA2F
-:10EB80008BF51D127EA7BEE89758E7B784D793C5CB
-:10EB9000EBBA9428D6B915BA93785CAC85D103E961
-:10EBA00046FF973CC3E04FF526D6BFF5D8ED4DACF8
-:10EBB000EE888F67E079897A1EAFA180C2E7256E63
-:10EBC000116F5BCDF5AFA8D763DF258AA72C31BEC7
-:10EBD000B0711AD524382F4F0ACCB7D3EC1FE7A653
-:10EBE000EF9FA895595CBC35290C9B72374ADD3ED6
-:10EBF000885F864AFADE7F7413FFEE8003B149987E
-:10EC00003778A1BF7A6056FFBB79CC1558875FDA99
-:10EC1000F9E924A00F524D901FA9BCB8A47AE019BD
-:10EC2000800FE7FF43F5C05EC9B7835EE7BBEDEA3F
-:10EC30007A602FC397C8AB6AEB80CFB9230AABDBEE
-:10EC40008B3EF604E8DD4E23D6034EED7CFD18C462
-:10EC50002FA79A4807E69935F6C3C9B49B1B004F06
-:10EC6000E73FF9F0B1FB09D4913FEF65F5856A7B89
-:10EC7000A03FFB1F7323097E6248D0CD3FC9FE171A
-:10EC8000F23AC8FDA93352ECA14258DF7E9DADAFE8
-:10EC9000FD480FBA45DEB59F7A96AEBEEB5944DC0F
-:10ECA000B93A9AAFCA733D1AE783CBCB9B6D819C6F
-:10ECB000761F793385D7A92912131D24C7A0CA9BB3
-:10ECC00029F6C2FEF266117CFEDC107CFE40AFBC71
-:10ECD00019AB7768D99FE101FBBECE197BF2490FD2
-:10ECE0008C67C0715A5E480A433D7F0B877FDDA564
-:10ECF000E7CD7EE5EE236FB69DDB6F1F14C91103D0
-:10ED000085EB76C2E61FEA12F93319FDD8D88339AC
-:10ED100062FEF8FCFC83C3305E3457E4C55E62716A
-:10ED2000B4B93CFFF5C1F442AC67EB0FCE735BD5D1
-:10ED3000F985D7389C2F982B301E7FD7BF4FC3F84B
-:10ED4000D40288E30F84B8561B8FCBB3789EA79567
-:10ED50009D2BE0D929853D2C3F6392D136B4C970F3
-:10ED60007F0915A35B40F48628D55C496F4B146A74
-:10ED7000F4B9A785B6A9D1AFAC55422EDA6FFBB175
-:10ED8000248C9F3DE0F0E07C1F686179EAD07A290D
-:10ED90003C988D8BE7B5855A641F8CF30737D3F306
-:10EDA0005FBB0D7D9E0FD1A2E7F910FEBD26224765
-:10EDB000E02A4BECFA804DA9EECB7E10E3B5E81BC0
-:10EDC0004D1500EF1C762ECC05836F26C697530B8E
-:10EDD000F1FCA796E4C6D66AF61C79F68239E6C736
-:10EDE000E7572BCC20259E5498EF7B6E9E5FD3C0B7
-:10EDF000797E9BBAADCD1369F7BBCD258121EE811C
-:10EE0000BDF783BDC7F5DF8575F91C2F5ECC97B4C0
-:10EE1000E83DBFCD077A5FCBCE776ACA6670937341
-:10EE2000D8B5C05E85E7F0113BB7E3089B7FC1D53D
-:10EE30000E09F8A1C5CEE8F61F9DB776BEFACC4202
-:10EE4000065F3BE3D796B55298C18BCDFB52E322C8
-:10EE50000333FFB972F103C9FB64241FDF43B91008
-:10EE60007A508F7C778284B3587DA80DE5E61CEE3E
-:10EE7000E716677AF0FB5B6A0B52209F3AF7D41AC9
-:10EE80003CA769C2CD569C7FC34B66F4E3EA574664
-:10EE900073819EB57084D92A429ED2E7731C849DEB
-:10EEA000EFD3AACE0F6AF3BE6B53FDE3201FD450FD
-:10EEB000192D84BCD123F207BB5F67720DF56AC3BD
-:10EEC000CAD8931067FE6E6AA002FA9DBDE7DD49BD
-:10EED00092075F47F9767EFF10DCD739A745BDBFA3
-:10EEE0008DAC57E71F496B2AC6D549BBFA3EECC328
-:10EEF00052BDD72B1FC9EC9A8D86C050B03BAFBD19
-:10EF000086D55B7CB2482680CF4FCC84E7F9859CC0
-:10EF1000F51626EA81D9FDE295F60338F3FA57D1C2
-:10EF2000BF1EF04AF159C7F1FAC9735716025ECFF6
-:10EF3000EEBEB210F0BA51DFE603BE18981E980379
-:10EF4000F03839D18F76A1A8F7BD547A5B9AC9F50C
-:10EF5000E0BF480FFF407CFF32F530FC498C97BC86
-:10EF6000F45756971BEA62FB827BE274A7F17CB3ED
-:10EF7000F35FC912C8E1FEC6B371FBCE652221B0B2
-:10EF8000BFCA2AA3F85ED99F650276A0B07FB5F309
-:10EF9000DFC0F1BA23D377C105F8E571DD5A3EB67B
-:10EFA00029FC39B3B31F97306E6BF28452C6A15F50
-:10EFB000357FB40EE5CAAF70BF07E9926CE09F2CB5
-:10EFC0007ABC099F9FEB9C8BCF655324027E583DF2
-:10EFD0007D0EED35E3D5F5DBFA3D259144BF97CEA7
-:10EFE000E333F04B931C3103D06703D8D5748A0DFB
-:10EFF0000A8B6F373808C6554A3BD57EA2C8DB6EF0
-:10F00000F1B3F373B67449788E56BA21909F0D7898
-:10F01000D5E46F7F91E93B96E9ECC9BF373A7DBBF8
-:10F02000810E1D06928BF57A7AB11F51BD8FB3BF49
-:10F030003AB897057F7CABFD340BEDA42F881FED0C
-:10F04000A403107BC0BCFDAD685789FBBDEBE0C2DB
-:10F05000AA7CFD02BEDF7601DF6F0BF23EA291F7C4
-:10F0600089EDBA843AB8485FF50C09757089EF25C7
-:10F07000D6C1455472B28DEF07598679F220E59BCF
-:10F0800015A37AE8BA8EF03F9B621FE07EA09D46F2
-:10F090008CCFD5F1FADC60ED09F47B82B0BF88F14A
-:10F0A00037AB63E7E755D4517F12EB943BD475BC83
-:10F0B000E7FFC9FA45F4EB2FEEFE670D7F8B7589EC
-:10F0C00075D475498C1F35F3D4FAD1DAF8B9F083C9
-:10F0D0002F55CEA564FD6BE55C5696A0EF7F4CCE18
-:10F0E000F5CA430C8AA578FF0979888F3D6DE91030
-:10F0F0009A6C9518BD4ED2597D2CCFA9637510DA44
-:10F10000FCAF6712E63545DCD7F4BC2EBC3A1FFBDA
-:10F11000635EB77E7F32D625D47A6AD16ED7E63B5E
-:10F120001793DD9300055F9023B88FED1FAD2FA8D7
-:10F13000CC8AD717E45F667DC175599791EF7CD56E
-:10F14000FA795A20814E2A8BA90350DC7F1DD96D94
-:10F150009CEE92781D8A4909117BC2FBFDBD776741
-:10F16000168B1FBECAEB9F1E4E4EC2F3175C06B62F
-:10F170006FC325B33AAD5CB7BF266B0CE81586C7E5
-:10F180009FBC701B81BAC79FE83BF03C8450BDD543
-:10F190000BFA50C4ADC4F8BFE2F1D44BE59FBBFEFF
-:10F1A000C9FCF36D722324BE77A9F9BA4D14060980
-:10F1B0007CA5E583FEDEEB4FAE6CC8F2AFCF42B963
-:10F1C000E51B81798F4B944749A5545E83BEDF636D
-:10F1D000F480FF61E2FB8BC87AB7CA7F9FFB700E99
-:10F1E000EAC34FCCCC1F11FBA0C4FA1FEF17DE7F80
-:10F1F0009FBDF817A7FF4958CFC90A1FEE7B78209B
-:10F2000099E995D853ACCE48BB1F48AB4FC47E1686
-:10F21000F1BD4E21CFFE45F2F4B57F923CA5FA1523
-:10F22000ED8D7EF3BABDDE0FE177CB2ABB7D3CDFEF
-:10F2300085FB39C4BC82DDAC3EEF6D8E3F71FF595A
-:10F24000AE7733B37DBF033C9C7DC764823C6A6963
-:10F2500029939F0D7E2BE6211A3A585D4EC34A82B0
-:10F260007103B1EF775646200A72EA8177AD787E56
-:10F270006C43E7F6D602AC5708A09D78EE1D76DF0A
-:10F280009C113809E307574655F98EB28B9FAFA9F9
-:10F290002EC5F9A2DFEF30AAF75319B2993F2FAE6E
-:10F2A000BA6CA1B7A99F43DF3B5BCBEACA830E9F31
-:10F2B000AD02EB14583C3DC9D38D71F0863DA824B6
-:10F2C0000816B9C2F37BB3916E1AF65494E0F90BA9
-:10F2D0001DE6123C47E83D2BFA6B67EFC90C433C37
-:10F2E0007BA93BF017986F7269F83AB057F3E8774B
-:10F2F000209E7E76F77525185FD4F09DE0B7F83E26
-:10F30000DA3B4CE166A9871F37EA997E147AED0C47
-:10F3100018C74ECC7BB03AC3AE6964BEB5A76D7555
-:10F32000A8EB2F77644E3C03703E93A5F03C39CB9D
-:10F33000CBE79BA8375BD09B0EF3795E7E1AAFA715
-:10F340002021534F1D45C1B7E7E5C5FC445BE4E50B
-:10F3500093BE62767381CD807491DCCAE406A17499
-:10F3600001F6FAF858F704D8BF36A83D321EE0354A
-:10F3700000C00F312E12FDE148C87FA429E321FF10
-:10F38000F1D88A51074C0E8847755F0DA8F1B4D9A2
-:10F390002AC1559D95E12F82FA4AA2341601FD57E4
-:10F3A000BEAD67758F6B9350DFB7E7D661DDE3B90C
-:10F3B000778DAA7D46BDE43459ED82B85341EB7F89
-:10F3C00062FE21798FD4673DEB427022C6B0FE10F9
-:10F3D000C74A6EED0E95435CE641899DC149672F92
-:10F3E000B9209EA0C86077CCED64FBDFE7B6D92BCF
-:10F3F0004D284F2596BF19EF4039A9ACBD5E067F59
-:10F400004F692278DEDDEC6C76DEEDE0769B0C78E1
-:10F410007FF96B5D9F79B91BB27BEAE8005CF5C6AA
-:10F42000D821281D10F944513F27FCABB87CE5E7F3
-:10F43000C20B7DA4B5637BD9AF5C1FC5ED780D1DF4
-:10F44000F7F79EA06F41CF2FEB09DA612F4B26DC37
-:10F45000C726E8BA45EC2BF89AC585F3787DCE89A6
-:10F46000757F19C1CE8114F99830ABABD247D76400
-:10F4700021BCA2D78460DD7BEC724331C6D31A7005
-:10F480009CB5ECDCBABCD681ABCB4BE16A230082E5
-:10F4900013FB96E4015F86281D0CEE830E8AB35998
-:10F4A0001D94B23609F1A66CC013BA89624F47BCED
-:10F4B000298F30FC1466333A17F96011F7CCCC0E63
-:10F4C000ACCC1E93B0FF6C8585ED3FE3FBA4935756
-:10F4D000BCBB0BF6753DC6E3CF075E1A86BF9F71B6
-:10F4E00061AD22411CEA82BD260FFCBD07385E9348
-:10F4F000956E62B326D2E701ACBF2DD8CFEA0815CE
-:10F500007E0E96B2D6B11DE039362D8075C657B73E
-:10F5100044F0A7275EB29DC43C1FB58B70DFF8E9AD
-:10F5200017246117A9F4A1F0D7B47ED88FB3FF7761
-:10F53000FDAB27E372FA32FD2BA2F633E3FD85DF44
-:10F54000A8F52334EFF767FF105F485567F302C74C
-:10F55000BBD0EF995C368AFA9BF8BE6F1236C3FEB9
-:10F560008CC9504BCBD68375489B248B17EC246DEC
-:10F57000FD51BC2E88340E6175298D23D9791E8DDD
-:10F5800057C255D42799A13E25B10E3699D5179962
-:10F59000A13E85DE6FEE779FB8A709BEDF7E9F4D47
-:10F5A000EC136771FB6AC2F3163B701F79EC966C23
-:10F5B000DCF733A19AC50353FD0619E8F2F9BFE958
-:10F5C0007C207763946FC1BE4A1DE47383BD65A63A
-:10F5D000CFA1EE25BE4FBC86F4B94F5CD447897CE1
-:10F5E00071E6908D12E89F78DD4AB067FF387CB7EE
-:10F5F0007DA907E3CDF13AAAEF125C67A590332607
-:10F6000035FE527CAC5FCA4C03DA19E972E029CCB2
-:10F610000B6EE936037FEECE2E40BC359787F11C8A
-:10F62000E4D4E2368CE786D37CE7B29D3DF423E652
-:10F630004736B1F59F87FD6752CF77CF2FFA732EEC
-:10F64000D853955D4646879A796C899F5343BF434B
-:10F65000AFBA1C867FAFC6BE15575D8EA4AAE31352
-:10F66000DFEF6F9D821EBFCD6ED7D257A892E3E722
-:10F670007D7398D53FA9E9EBC0AAEAD127A92C3917
-:10F68000B8CA8FD7F366A94307754AE6D86C90804D
-:10F690006FE6B4DD08E7999C4F8EE5C2F9276FE766
-:10F6A000DE7513B69DB1F7A17D2AE769D61E1C7BD6
-:10F6B0000CCE43F95BCE889BE0BC93F3F0AD4C429B
-:10F6C000B2B615DC142A867D26D135DDA09F4A35D9
-:10F6D000F52E9A731BA02E13CF99B0327C66F0BA28
-:10F6E0005852C5ED77C854D176B3BBC40BF50C5650
-:10F6F000E2D9D30DCFB38DEC7C07C2EAB09A07E70D
-:10F70000B3BA094EEF249BC7B3493404F4DB9C6FB2
-:10F71000C7F7E3F27A8F91E7B1D8F78F3EC7F6BD0E
-:10F72000897A5F426C3960F7583D44D516E79E10E0
-:10F73000C59603E71C348B78216FFFC112B83A27B6
-:10F7400041FF1E9D787731FE8ECBF3F70E82F54E8A
-:10F7500036A8CFC116D79772197D9CE7E7456EB3DF
-:10F760000426C138C792664F82237867A65518ECE5
-:10F7700068A73DA50379E4E474619FC1E667AFF231
-:10F780004BF0FB29E2BC466740C1780009B4EB406E
-:10F790007F3A4FFAB1AEB0CE14CB55287D194D81CA
-:10F7A000E9399057AC397E17E615338FBE0F7520B7
-:10F7B00047F56D1352405FE4F3F333A8E317A2ED6E
-:10F7C000435979E8F7C5CF771D2CA17C983A83ED92
-:10F7D000A79D423A148CBFD8D8FEAE49A5F9DE6683
-:10F7E000FABDA9BC8E64D2317F0AC40126DD16554C
-:10F7F00058FE26A624D66D882B71E93D897C709D24
-:10F8000027A14DE05C6875FB06AFBA7D53F9D7437D
-:10F8100012DB0388AF1EE0F8A214C5FDD6A1B1C467
-:10F82000C6D6C5EA139FE67EDB301731E541FDA45D
-:10F83000430A815F306C6F26E665F696136CA7EF7E
-:10F8400034ED3025AE7F83CCF2BE3C6E2E7EFF09B8
-:10F850009E815E7DFE9D748457BA5546790A117566
-:10F86000A0B7B22C9305E4BB8ECB79B13F7D628A01
-:10F8700009CFED6D5ECA7E37427B6E69B3DEF60A54
-:10F88000E0B1F96338928AFAD9C986889C02F8A255
-:10F89000BE8FA3471E0BFA81F1AE01BA1FC37E9F34
-:10F8A0008B52F9A0C473E39B9D6CAECDF7293CDF6E
-:10F8B000C77E27A428FEBB2194ED687FB02909F2FA
-:10F8C00009CBB7E5887512C507FDDD44B4D97EAF15
-:10F8D00074DE16E7A51252A1E0F94492E8D784ED50
-:10F8E00047793FA9EBF53F017D0C4AA1EBA1D7D7A2
-:10F8F000723C48DC3F958F6E423AB1063C4027DEB1
-:10F90000A4BEF71F75E4303B62624AB90BE2EBCD4F
-:10F910006EAF0BEC2A011F715F8C2B9E8BEF79D39E
-:10F92000FA1EF7352EAF3BF83E68EDF3977364F59A
-:10F9300077F5745CEB377CD7A9FE6EFCBD9CBEDF0F
-:10F9400013F7457FFC59AF32E03306B729BC6E96FA
-:10F9500014A9EB5D48B9D7C4E4BDBABE65B2B4D250
-:10F960000DFC799DA9BE2B4ADF7F9DD3C96439F078
-:10F9700047C837BC3EBBF020F06735FC30011DE7BF
-:10F980007A125903C472BE22F013FB409417C78049
-:10F990008F1A748121A9B4FD89BE6DD0D27CE4AFE9
-:10F9A0007772C6F49E9FA0C3F83C29FD01DE05FDD9
-:10F9B00069E72DE880DCD8810582DB4804AF2EC2E0
-:10F9C000EAB2A9FE62F5D79E9C9E7551E29C646ADC
-:10F9D0001C04FAFDF5A610CA9FC9F61F611DDAF9CD
-:10F9E000BCC03998D7CC919FE2F942C45583F61632
-:10F9F0009DEFF97FE57CA18208EE0B3B50D87BBDE3
-:10FA0000EA913F36A8EA91C5FCB47C2CE61124ECBF
-:10FA1000DCA8095DDBD1BE0BCEB07A61DF4810EA0D
-:10FA20006C4B319F8675CBFBB85F169258FD702FDB
-:10FA30007BB1FFBA65764E41BD8D9D1F24CEA1FAE4
-:10FA40005E81385F88CD9BCA2F7EBE10B6DB6B3CD3
-:10FA5000E8FFC5EDC6F9CC0EBDB6D0D202E735F64B
-:10FA60003E6788C5F7C85EA387DB89A8BFDB93D94B
-:10FA7000773E31B33AF904394EA4F49EF3CF36EA17
-:10FA8000993DE8CDCD677941D95B06F8D802792B4D
-:10FA90005DEF38E4C0F4C0E85CDA6F7EB12F177E0A
-:10FAA0009A65AE81C519295D6DED26506ED7F8387F
-:10FAB0009C0B7A1D697C4B1E88743516FACF1CF698
-:10FAC000293B2FB487AEC6E53A99DC0421F86D7C5A
-:10FAD0007A322D3001C669B777BCD7500A794B23EB
-:10FAE000C25FD4336AF937613E27F56C3E0E381F8A
-:10FAF00099CEE7FABEE67329F49D48471984D1717F
-:10FB00007F740EFB069247F5D0F90012B81DBE1B9C
-:10FB1000A7F735DE56DDC03EE6ADB322DE6F9DC5EC
-:10FB2000F231C12466A7425EC69D0EF127F6FD5B49
-:10FB3000D732FAB8D56C447A99D6558FF91752C591
-:10FB4000F2295EFA1FCC6726F14D849F58B9D93649
-:10FB50000DF781CE98AACEB7CC344DC6FCCE2D84FD
-:10FB6000C5D36E9DA157FD7EA480C34CB2FE53A8A1
-:10FB70000F99A9F9DD482D5CB4F91A018FE6F26FEF
-:10FB8000E6FBFB72E3799D219799D769C945F97422
-:10FB900069799D83FA189E23F09A73E1D6A5942F74
-:10FBA00086FCB818CF5B9F98BEE8F10DB4FDB32D6D
-:10FBB0005760FBB5F43B961F85E78F1562BB4AFE85
-:10FBC0007436F04151D9AC29704EFD41331BC765E5
-:10FBD00009B4C3EF8EB846148C0297ACCA10C37E2A
-:10FBE000D78FAC1F0D75355516D63E52F25FA3B0B8
-:10FBF0005DC0DBA35EBC02DA07A54F67F795171A55
-:10FC0000562445E0F7C5AA5259FFA9A39ECA8438D5
-:10FC10004155256B0FF356AC1D08CFE5CF66F7A510
-:10FC20008F7FC9ED63616FF939BFEFF51D6F81FDFE
-:10FC3000667EABE4857D06FEF2E3EC5C3113AB4BF4
-:10FC4000F0FB4A143877B2D2C7E27B13AC4D6E900A
-:10FC50007F37060CA510C7B559F35BE07CE701E5DB
-:10FC6000156300DF13A81906FA8FF2D5F3C0CF335E
-:10FC7000AFFC343705ED10355F09BA9D26F8A94A67
-:10FC8000CD37541E74313CAAF9818EFB0A8E7B95C8
-:10FC90005A2FC5E5BB866FB5F4D8AFDE276A391891
-:10FCA000D74F6B3A902EB309DB4FB40DE894F1EFC8
-:10FCB0006F617E06B9DB03F7F324EF1558A8D18FE7
-:10FCC000FD20E607660F19D57B5EF04711F6229BF3
-:10FCD00081CD960EDF65CFE97B3EF83138312FFAC2
-:10FCE000FD13089F356C3EDBA446FEFB22CC2E178D
-:10FCF0007E6F83586FA77ABD6516B62FDE45A8DCE8
-:10FD0000C1D87DC915DF34EF20D7B3334CFE078D42
-:10FD100032FC4EE15CC4F36D24F41CD837EF58027A
-:10FD20007F84F9E8E4D0FEA804BF0FE2C37C32C5AB
-:10FD3000E3174CAE33BC887969E1D1D08F5CD5CE66
-:10FD40005B0B871EFC74A37DE6E6BF23185F9766F6
-:10FD50003DCDFC770462254655DDE9911A56572BB7
-:10FD6000E675442245A827250BE651E37127AD7CB3
-:10FD7000EB677F9CD0CF629E77F3FD595FCA4CEE54
-:10FD8000DDAD8BE03CF3AABBCD00C7F2BC02763EF2
-:10FD9000109F7F737908FB1964A9CF3C71799E2C61
-:10FDA000F260A4CF73DC3CF956E08B3B4DFCDC3AAF
-:10FDB0000D5D104DFEAC3F3A11F1BB4AEEB7C4F3F6
-:10FDC000A99A73E2E698FACE9B4914BE59A9BDF1EF
-:10FDD00020F2693768E374D7B1F8D50D3C4E37A1EE
-:10FDE0009AE127754532FA75A9A5471532BCE73C5B
-:10FDF0006B81AF0B8E40551EE635A263208EF0E678
-:10FE0000989F611E499C1BA9859F3F4F16F1C64BC9
-:10FE1000E297FEE6FF078B7F3A7CF713A91BCF839F
-:10FE20001BEDE6E79192403EF093DD965F01F1070E
-:10FE30002A772F5E0467141E51FCEE74066E87F756
-:10FE40006E23FE8950EB9D5A1DD0B3F83DC1F8F1E9
-:10FE500032EE474EE4FAFFB367D87EFD2ADFD04783
-:10FE6000C7837D7A584FC21EA81B67F0F96CAB0E92
-:10FE7000F5FEC23746BBC07EFF80D3E3904DB2EAA9
-:10FE8000770887862DAA733D86ED4C55B587776434
-:10FE9000AAFA8FEC2C503D2F895CA17A3EFAF0280B
-:10FEA000557B4CF73855FF2B8F55AADA63A3535473
-:10FEB000FDAF3A355DD5BE3A76BBFA5C9290AFBBEA
-:10FEC000281D7E3F81C1E3DAAFE6A8FA9F49997405
-:10FED00018F872DE7A56275E4196A8DE5FA2ABC3A1
-:10FEE000FA6BD2C6EC9C46FA1FDF17AF607D1AB5DD
-:10FEF000EFE1A701166E52DB41B55D1BD6802CEEFB
-:10FF0000751E86C6DED1DA37431C35706C3679240F
-:10FF10008FFFAEF895E44AFEBB345ABCE2F9029F6B
-:10FF2000BDA5433F63D91BCCFE5FB68BD5DF1592D1
-:10FF3000C10370DFD9611D094B70CE42E3C6F15297
-:10FF40008F9DA3858BD1A5C6B3D9A3C67352911A31
-:10FF5000CFC95E359E0794ABF16CF7A9F19C56AD05
-:10FF6000C6B3D3AFC673C64C359EDD01359EB36AAA
-:10FF7000D578CE6954E3396F851AAFF9A1C5AAE7E0
-:10FF800042AE0E6C5DA6BADF2C759451494AE6F973
-:10FF90006BF17C89C16DDFEF933E04FE43F43FC6F5
-:10FFA000CF8D58CFBF80E21FEAF9BF20EB0F414A47
-:10FFB000564B070D9D1B30EF76B974F0761EB75F78
-:10FFC00005FE2FD17EA5FAF2BDBC3168E7BC0FF269
-:10FFD00061E610EE97F8FBB67384DC4AB42B12FD91
-:10FFE000EEFEE4592F3DCAFDF07EF5A8C60F7F074F
-:10FFF000AA9FD05E5F8F71AF599CAE3F875B632134
-:020000022000DC
-:10000000EEFA2CDA07EFD08994D379BD03F31E0101
-:1000100076C2308C93DC41227A3C3F1C2A4675A87C
-:10002000BFB04EB386DAED709DCBED87F93C8E62A2
-:10003000340588C789F193BC74F86E7637EE33FBCC
-:10004000BF17F44F2B008000000000001F8B08003A
-:1000500000000000000BE57D097C94D5B5F8FDE6B5
-:100060009B2DC92499241012026126210B908449EA
-:100070005804451C9660D4806193C58833498090AC
-:100080008504D0D7B4A5CD40C2A28536B4A8A8A80F
-:100090000302050B345804D4688745A44F5B636B97
-:1000A000AD4BCB4B0045F618B4D23EDFF37FCEB953
-:1000B000F766E6FB480AF6BDF7FBF5F7FBE3EBBB9B
-:1000C000B9DFDDCF76CF3DE7DC3BECED38C612196A
-:1000D000FB06FFDD717DCA988FB1DE8CFD01FF84C8
-:1000E0007A231C455607E4275A1D0F3D069F8E189C
-:1000F0005879B30DFE28847E46436A2CCA9E96DD4D
-:100100005D3F2BA13163AF2A1E0F1B0EBD265A5D2A
-:10011000DB15C68624316B622C1427F853A64532B2
-:10012000D6C761A07AF04F61F18C0DB6D2DF6C4F6B
-:10013000DFE6A531A9F8973FB628FBDB8F9BEA7075
-:10014000273B4604EBDF68BD6673F3129C6747B537
-:10015000CDB5D5C9D87B5804ED9EBFCF1250A3189A
-:10016000BB62B2AD55A219FB2062DEF1DE0EC69E67
-:1001700009F764215C66CFBA6B35E69523718EA5CD
-:1001800030BF2BDEB6910CE66DB17A5C585E65F53A
-:100190000C8887255EEAEFC98856A1CF220E7FF82A
-:1001A00023BBA8DBF9F3F94C50F8F89F847B46E3B6
-:1001B0003A8E185A935D080F63EB486CC76CBDA963
-:1001C0009F4B660E979EE0303EA27F31AEABCC6275
-:1001D00071A9D0E77885E3F54CDC83F36AE0CFF9C9
-:1001E00086A2F880AA99F79D346FBB7740620AF423
-:1001F0006F12F3B6F6167077641545F63CEF06EC11
-:10020000BF17E47EA0F8B73B392E317FD017E37FCC
-:1002100014F216C3D5F7A643BE23DBE0DA0A459BEA
-:10022000C3A1EB3CC6DE11F07EC604F958FABE1637
-:10023000BF2784F3F6098F1BFC0DD0BE68FCCB846E
-:10024000A7E717DB683D5EE63033985F29739B7143
-:10025000FE9F8CFBCFD7DA001FF31D1E0FC2EDC12E
-:100260003843F27B340FCF90A9306F36E6E6E89F33
-:10027000B175063692B16976BE84F9026ED399DB08
-:1002800084E3CC641E138EFBFBCB663703FAF83D88
-:10029000E098C17C67311F7D9FC3FC94DECF025480
-:1002A000FF01D646F9772372FAD7C1FCA63E919199
-:1002B000C60C1AB8FF1BCE17E8E5C15E9C5ECEF6F1
-:1002C00041B86FEC7D53F43B55D00BF0EB0FB11FF1
-:1002D000E0D7E1B929217C3391D30B33DAD3FE1176
-:1002E000DFB47646E5B0A19877DB1261FD770A149A
-:1002F000DEE9AE2CC475E6AB36D60BE0DFEA50FD86
-:100300001618B3609CB72FAE0BFE45FA004F53DCB6
-:100310002A433CBFB902BE40BD3773553FD2C49497
-:100320004D93CE61FBC271D31BA361FD93BE6E1BC7
-:100330001E80B4A09FE9545B261FE31BF8DF976C77
-:10034000F3C41848EF4ED8676430FFBB076ACB0B85
-:10035000B3206F0DE6A73063B01CC63D8C7000FA69
-:10036000A9FB73EED86321ED186B52916FB63A2258
-:100370007B7D3A04B283D9E06F70DE6A71B4A71B4B
-:10038000FE91E957F5AEB1C78026EF51DCBB1C44A6
-:10039000170E33D27F8991B9BBE3BB8B698AA01F4B
-:1003A000C02EC8B37BC55C3B0BAF9AAFC07ADB1CD9
-:1003B0009EFDD8CFD2C99FCCC3F53123FBED308051
-:1003C000DBE2DF01DCA0FC543D403E03F8B3DECAB3
-:1003D000DC16C63EADB753FEB3FA044ACFD73B286E
-:1003E000BD589F49E597EB5D9467CEA2D7B0DF92E9
-:1003F000B59F1B3D598CAD099378E4F35826E878F6
-:100400004DFF917F72C1786BDE3651BEBCB9695227
-:1004100004A4CBFA9F5A1901DF97ED525CF8BDB2E4
-:10042000C56DB6211F1DF3AC46F259F876DB1414E6
-:100430003BD5D714E601169A3DB0E82D1C6FC41FBA
-:10044000CFC423FCCED68FA2F99CAB77D37CDC2D16
-:10045000EDC7E3A0FD85FA02CA273A8BDE45BA74E0
-:10046000B3CFCD587FF2EE76631294E7BB1537F227
-:10047000F75837F3FB017F9B4C7CBFD804FB05F298
-:10048000FBB8EC69CF3CC4509E7B3EC6F166C69675
-:10049000E6C7C1F729A3BC46AC37EB6BC6302FE9E2
-:1004A000FBC67CCDE1512DF072E97585E074E9C0A1
-:1004B000907B6F83FE5E3FA13215E6D579CD40F388
-:1004C000EAFC20DC0F3B5357BDA52FA5F661364C47
-:1004D00087F46159B83EE804D69DA9180D75C0FF90
-:1004E00017F67C2701E12FC7BD10DBFCD78F50DE4C
-:1004F000FD85CB3BC69A3F7D0AE561BF04D7A3903B
-:10050000BB6C62B3893F596D04EE878BCDCCC3F3CE
-:100510009E2198BF10CE1E2C82FCC8BD49E3917F5E
-:10052000703C4746509EA5EF7D22E5FB8EE0783B70
-:10053000F63CD9F98A03CBFDC4CFBBF63ED3F769AD
-:10054000C855ED5B158EF37A15D6320AF8E3D50D52
-:100550001124B75E35B94ED6A1BC7EC6E6DA0EF5DB
-:100560007EFEE3EF9E3A84E9FAEABCEF421AE38C9E
-:10057000A57ECA7EBA6830B687FD9B25C23A7F71D8
-:10058000500984E53096BDF1F0CA44186FE8E6766C
-:10059000435F4873B7290D980EE95F7002F7CD3EAF
-:1005A0004E07C17DD86EA79A846CD7D7FFD11DB4F2
-:1005B000AF6BF7FBAC8D9F8FEFCB82FBFE60A5F995
-:1005C000FC0A27D2EBFB791E824713CDE3A596E9FF
-:1005D0007FB89FE13A40A3C0797BCD2EDA6760B93E
-:1005E00026C85FDA9FBAE55158E301836F0BED43EC
-:1005F000255CEFB854E47B12E9A51AEAFB205F9D65
-:10060000EB8BBA15CAABFF32D00594C1FA3F7B67BA
-:1006100001C263F1FEC726F5857A97C6309702536B
-:100620002F7FE9EA246CC7FA3386AC7D697F43FCEF
-:100630005C68F7A3ACF123904E8AD4661A87D5F094
-:10064000719E10FB176B03E0C40B92837A3F82CF3D
-:10065000F83DB625E670120BE2A7A66585D308ED36
-:10066000877BAC2E15E9DFE94BACB505F743D8C75E
-:10067000463B91B4CDA25FFBF4E4A26FB18F99C564
-:10068000BE24FB7BC2CC7C61D04F7FF8AEE03E6BDA
-:10069000E6FBEF76900F48BF72FF8571EF728EA078
-:1006A000F66E94A749B0D9E6C23C939EB0903CBF89
-:1006B000D9F1A5DE5413CEE591D43F66C735BCD63B
-:1006C00006EB3D1EEE9989E3CC17FB3733BA1C28A5
-:1006D000A7F784BBEF73D27ED8918C6B80FD712E0F
-:1006E000E617ABA04FA586E853D69BDB1F3F0C77E0
-:1006F0007BB0FDCDD6D7CBCD655F1A582ED0C1B219
-:10070000C72C7E06F36E40F90AEB6A881C694539EE
-:10071000C08E19AA8EC37E793B6FD9D5DFB2C83C93
-:1007200092130D8C750BAFD7819F3D203F0220EFB8
-:100730003DC0D763AF75A89CDE5B8F460F4779C974
-:10074000DC91403F775C33304FC87EA6EF07F05511
-:100750008FEB1BC7229827647F74B31833F22DB335
-:10076000C5FE73EB16F31F23F037A6F38308947FBF
-:10077000CBBECC2339D8D3BA5E13EBFA35AE0BD24D
-:100780004FD28A36201DDFFE85DD88EBBBDD383594
-:1007900019F51398F71338EFB15F18B4F3FE3A5C0C
-:1007A00093BFD9F93FAC309F01F9F173B31FF9B191
-:1007B00005B7398063CBA22C3FF2FD0133CFFBA2FA
-:1007C000CCA49FB644321FCA9196A9F17E9F13E52F
-:1007D00021E3FA6B6FC6CBC344FB39F1D4BEAF053E
-:1007E000408AF2E0FE70D17FED5BD958BE2289E4E9
-:1007F0004883C9BF3605FBFF81EADA0E78FBC06F7C
-:10080000F099804E36C604EE57A1DF8D9FC7331C8A
-:10081000E7031648AAC171CAC349EEDE66303C3808
-:10082000D586F5DC89B100EF03FFAD92DCDF980BD4
-:10083000791BC9EDD9CDF07DE354776238F63335B5
-:10084000DE40F351592D7D77F2761F9978BDB902BC
-:100850005F1F0AFC005F13DF7BA64418916E4F3ABE
-:100860004BDE7512BEDD890ACCF7A9B234867273ED
-:100870006EC55D4EA297A627487ECD163890FD61C5
-:1008800003EB48D47FF9BF39F3B787213E679687DA
-:10089000B5C30EC93E285F19E980F6333D6AC00230
-:1008A000F294CDC87777E9672938AE9BC6AD6E1E46
-:1008B000947A26849E4B2C2027A0FF43619E0F88AC
-:1008C0004F0FE552F921504EBE017E3A5596B617AC
-:1008D000F98A95C9F35FA014F1F07A8795F4CD9E5B
-:1008E000E8A101E13F54D029E26539C73BE85D94B6
-:1008F0006F983D98CE25CF9938DDF8F685115E0BBF
-:10090000A65909CF9DB3C3B758A0FC4121B71A66B9
-:1009100087BB15A8D7F092C56F70D27987EAF95EC8
-:100920008BA47EABCC3C5FF5621AD1D301B37FD7E9
-:100930000E2C7F3D8CE8A12A8A8F5BF54A92A03766
-:10094000B773158EFB9A85E8A02ADC114DE5FF1ED2
-:10095000477432D9EAF91BC20BE8AE16F5822A7346
-:10096000203D06E07B52D0D5496883F8F3D546D2C6
-:10097000BC89E521EF69E8BF15F1E931F372F63D75
-:1009800095CA4FDAF9F827D7F1F18B7F52F9360380
-:10099000BC9D2C9A94381FE671B23682F4BF3FD7C3
-:1009A000A90173149E5F3A1E4F877A97979F1EB9CD
-:1009B00009E6DFB6F2E364A48FE295D585D8AEB838
-:1009C00062F914DC377BE2CBE22A60FE103E4E492E
-:1009D00071C7A4C07AC6A6787A615A93D5B600F5D5
-:1009E000E0CBE6D667F11C9114E7E983DFAFBC7C6E
-:1009F0007607D78F3BD2713F586CE4F421F7D51AB4
-:100A0000417FC7533CFD53709F080FCCC3FD232289
-:100A1000AB95CBBBE53727E7CFB76C3FA0C0389588
-:100A2000E12D8B2955FD39D8CF052510A5A412FC41
-:100A30003CC84F17ED812884BBC7C0F5B3CA9DDA07
-:100A400075E13F23CCAB12FF807695CDAA3B0C71AC
-:100A5000CDFC669C7F253307EB3B8378827E084F75
-:100A6000CCF6E779DF07F857EC1A9487E780CA9845
-:100A7000433FBE8DEA413BC927EAF579B99EEBE7D2
-:100A8000C3D77751D0FF4549FFB3CDF25C4EE35F4A
-:100A90007EB90F8D7F61AA3F1DE17F5911F576590F
-:100AA000783DA00623CEF3979C9E1E37F90CE17487
-:100AB000BE6744CF9571CD23112E520EC11C7C060A
-:100AC000A87F616F12D597728B153186ED2AF726B4
-:100AD0006EE5FA993897E244A17EC52F78FF9847D2
-:100AE0003E3CFF4292188FEBC77AFCE9D75B9C62D1
-:100AF000A0F53E2EE577A4E47357C254807FC62646
-:100B0000B3A6FEE548F3836EE877905FFB5DF65F82
-:100B10009EA2907E364087B7BE6AC7610BF2D3F3C0
-:100B20008CF8553FAF9A147EFE7BE1852E3CA91CC4
-:100B30006FA0064AFA70703DDC8470FEB00B1F0F88
-:100B400025815CAD4418A404E17320D79384F2FF9F
-:100B500032E6715F88817C16EA411CDE322FE1ACFF
-:100B6000A7B3951F2E486A83F64F09F80042FB2071
-:100B70003D76E92F26385F64E1B9B27CD899343CE0
-:100B80006FD60E82ADA06B3D0B36E55A919F166E67
-:100B9000CEB59684E0A161E7B0130E80F3C59D4603
-:100BA000178AE506A3FFC7A84F37EC549B7D8CCA74
-:100BB000AD08DF8BB623BFC37A0B36C7E4A1BE2CCA
-:100BC000DB2FDCF4F0A0B210B80FD9A9C54376B37F
-:100BD000363FF49036BF0D6543EF6FDF2E37A0CD63
-:100BE0000F3BA1CDB30EC016E041B5723C1D1CE514
-:100BF0003AE1003C0DF0AB2EFC34C0366DFA64D403
-:100C00002F36ABAE34281FB0BCE89E6CC87FB679D7
-:100C1000BE0BD15CAEFA167F1F7058FEF1A413B85C
-:100C20001F5E60CDEF4F063C2C68D960363A70DD10
-:100C30005ABA3D6010F4FA02B7972DF26BCBAFE7CA
-:100C4000EB15D25E9A194A4F7ABCC3B8F7B9614224
-:100C50005575CB869D812DB3BC10081D6036BA79C1
-:100C60008319F5B61B8FE3E3F462733B101EDE516C
-:100C7000BCECD6BA09ECF430F863DDBB9370DEDE71
-:100C80001F29A437787F95710CF781F67D73EEA646
-:100C9000F4BE025ABFB4CB2D6C51029190B78F7243
-:100CA0001C6A8376F3FD8A0BE75DD26809CA33F8C4
-:100CB0005FD93ADD3C368694C3FC171E3AFC3705F3
-:100CC000FA2FDFAC6DB708E42CCAAF8A6DDF58424B
-:100CD000BFCB73E3AD2D5B545CF77C397FDF588667
-:100CE000EBBA955765BD847E730633B06FD4F62E8C
-:100CF0003A8BFBCAAD1B793B10975E5C6FB5CDECB0
-:100D0000C0F5565B592002E67122D2ECB6C3F7ABB0
-:100D10009B22C91EB6C002FA641EA52C2C0FDBB99B
-:100D2000A2B1DDA7EF70BB58751CC777F5730A9D9C
-:100D3000A3AAD18889F9E7797E110BD03A904EDCCD
-:100D4000A1EBF36BF3AC899FBFAA8C81C3088F0A18
-:100D5000D6C6CF4F8047B7841FC0AB0AD6F9412C07
-:100D6000EA5BBAF6CCE5C1716B6C5C7FAA39F48D95
-:100D700025B45C9E03E53955DA699F4B2F0AC7718C
-:100D80005629EE27AD30CF5542BFF66D0823FA9DA8
-:100D9000BB85EF37A0C7A6235C366E4874A19E3191
-:100DA00017F4F230E49B45E1540FF45DB2AF748068
-:100DB0005E8DF6F68D31CD01DC37363EE6243D1AE8
-:100DC000F45F824BC7FA30FF5605F560AEC76CDCA6
-:100DD00090417AF8AB729F5ACFF5AE6EF4622A67F3
-:100DE0007DB81EFF112E25440F4E8DF7A4A586ACAD
-:100DF000AB6CA53B11F79DB2696603DA9D58F9CD3E
-:100E0000F90DB60B3DB203D68FEB38A3141D378412
-:100E1000E8A32353F93E3272BC7B87A847FE853294
-:100E2000C3D447EFC0F11E373870BC2E78BBDDE964
-:100E3000388F331BC2F290CE468EE7F69F93B95C93
-:100E4000BE470C676E3FA477887EEF483568D28432
-:100E500070A03FE8E74C3EB73B470E2F227B1BECD0
-:100E6000D524E7F5EBB847F453662EFAF7DBBB99C8
-:100E70008F840F9BC8F585334B94AD7C5E805FC833
-:100E80008FFC6918D9E9CE88FD47C219E86604D9F4
-:100E9000DB85BCDA20E8658389D3816F113F3F058C
-:100EA000E985113D6C14E7ACB902BF6C3DD76B818D
-:100EB0005E389CD7270A7A61ECEF480FF90EAE67CF
-:100EC000DFE47909F05E9ADAFBFA7393C43733FAF8
-:100ED00047FC23FF46F5C13D077CB07F56FCF2B1CD
-:100EE0002806F5CE199BE25DD0BE6AFBAA2837A47E
-:100EF0009F197D517618FF9C5F2DF077036FBF809F
-:100F000037DAD715903F8BF14F07EA3B3F9A82EBD8
-:100F1000FBEB76931D4542CD4E0B9D9F16EF5F4434
-:100F20007A36E4DB797ECDE72AE60F69EDE0153FFE
-:100F30007F2CDE41F0F6251912300D243148176F51
-:100F400033B902685F7E4F75C130A03777ACC6F900
-:100F5000E9DBE33CAE01BE6B9A55AF39FAFAF21AFF
-:100F6000215F6AF6FFE873B4EBD5E8ECEEE5C2FF6B
-:100F7000A0B7BB37A546F6FA140DCCB7B05B500F3F
-:100F800002B8B802C8B7309F3422136EB76DD8F5D7
-:100F9000444E3BEA0BDBDE8A52B2827677E997E871
-:100FA0006C2E7D0EED9A3DF1E36561870DE28BCBF2
-:100FB0002DC7210565001CD0795A650A44DD06F06D
-:100FC000A8DA62223953B5E7F91D4F219D7D68A14A
-:100FD000FDBC72CF1BEFDF8AFAEE3E53AF42BE0C70
-:100FE0009B121FC4538D83DBC9245E2A7EF586D9EC
-:100FF00091CDBF2F8F0DE2A772DF6133CBBE1E8E66
-:10100000139A0F9BDB6CDDE0A9B97D12D989767D3F
-:1010100065463E38F7BAC2FA38AF6F5FBEE58D2835
-:10102000D4C7104EB82F497C75E14F571FFA9FF275
-:10103000CA70AA67C773454FF85B827B07D17724D4
-:101040008B81F1CB3FB2F80B11AF7B9745E13ACEE4
-:101050001A6B399D3FB32A1EF5BA72932FDE4E29C3
-:10106000FF5EFEECC3447F0B95DA787B16D177A246
-:101070008174065F22AE6FFEE699B4BE05CC43F4E0
-:1010800057FE8C5AE487F44B232BD8D70D9FF41DC1
-:10109000C8F9E4EC56402AACEF2CDA6D506EFC5ED9
-:1010A00015E7DC25B47F3F2CD6CAD852CA7F29F475
-:1010B000B64BA95D7E656BE879B166DB9A56C4CF05
-:1010C000F9FEEE3E384F80834FC04BF906FA55DFEC
-:1010D000CDEFC3F1C31CC691A21DECA313F03BD608
-:1010E0006F35B9D1EE1DD24E9CE7F8F80F89F1614A
-:1010F000DEE1785E3D1BCFF576FDFA0A062AD2DEE8
-:10110000D6CA42E9AB27BEDFF608D1D517EF71B9D1
-:10111000B2D83FB580CA5B4D813E58EE3F3C43217B
-:10112000B9606181EEF87A9B49F0B5B61CE6695466
-:1011300042E1FB3AD7431780DE1508E1E320DD9852
-:1011400083DF69DD3F15EB6823BF98F4A72D14F208
-:1011500040BF6EBD7CE83550F8E3847C90EDD9E665
-:10116000EEFD3941B9E0A371AB603F413DA3EA43D5
-:101170000BED1B557B4C45089F0BBB8FBE3F17CF1C
-:10118000A1CD928FB5F256CFC7E52F8EE8968F2F5F
-:10119000ACCBED9E8FE17BB77CBC4E21F9F63F9541
-:1011A000B7B0D391DDA0277E5DD883BC1D3B502B0B
-:1011B0006FBF6459D1B761A1DD3B80F0A383AB84DD
-:1011C000A75E7EBE9FEA20F8EAE527C3D0881038E4
-:1011D0004AF849FA64CC43E374D1B1A45349C75DDA
-:1011E00074AA5FAF168EFA72C34046F3297AD9C447
-:1011F000ED672D0AE9DBD0EE78D270E253376D7FD0
-:10120000ACE97852AFD0BC5F976FD6D577EBF2459B
-:10121000BAFA1E5DBE5653BFEAD051333F1F0434A5
-:10122000F52C75F7D039E37A3DC2CFFD3EFB3F3751
-:10123000FB902EFA7598512E9A56325F24EABBAF76
-:10124000A9A4EF5E717444A15EB22A8CEB6D57ECD9
-:10125000221FC3F31DBDCDAB512ECAEF1D61DC4E65
-:1012600072A5A8232A26E49CDEDEA246A13DB6CDC7
-:10127000CF0ABA8F136920B8B6B19ECAB9FE96AF2D
-:10128000DA92EBD01EDAA4BA804C58D98A5951149C
-:10129000BFD0927AEF6CF83EFF372A85015C09E7F0
-:1012A0007605E6731B317EA094A3907DC67C8F8F5C
-:1012B000817595B6F03882B2755AFC2EB0CD880E85
-:1012C0003850EE68FDFD0BF15C978AE73DEDF70ABB
-:1012D000B68EE8AD42C7171E61A7D5F3C516C9176C
-:1012E000B92C57D863C8CFB154C8EB7C35EBDED9E5
-:1012F00000FF2B275466817C678BCA56E37A772BD5
-:10130000E4EF418700F2DB62E04B9C8F84CF45E441
-:101310009B8C9EF5928B2FFD65E4F7914E0E7C9C85
-:10132000837ED88B073E4C7F15F307FF94FC31BBBF
-:10133000BEFE84D7FF360FE5F095D72D0CE9FBCA2A
-:10134000EB6F26A35DF0CA2B163A2F5F5969E1F6C1
-:10135000E6D723FDE88FBCD29FEBB90DAF7D95D3C7
-:1013600046FB6E23E1EBED8166AE37B5FCE749B491
-:101370005777B6C0AA509F783D82F8A7E69530F21D
-:101380006B5F79EDAB91A1F10FFFD3F548FFF595B8
-:101390004836FB45A45BA1D7D7BC3AFA79F4E756A7
-:1013A000EF3F6C2E85F209BFFEAF1C949F575EE4A1
-:1013B0007AD26553DBB3686BFCD3C0393F3525A2C5
-:1013C0007D0E3AEB0BDC96F6E434E493EBE1C2E1FC
-:1013D0007005E080EB02B894A3DCEF091E97FF656F
-:1013E000E1F1F93C2ECF6E61E8FF0DC245E17E844C
-:1013F0009648BF55A1F5F3EFAF7F9583F2E646EB34
-:10140000B5A59989AFFF7F59EFE0B47F55FC727A9B
-:101410007F71A083C7F5E9E8FE7ABA3EF86F94DFE2
-:101420001BE9A2F9DE24BFDFFD2FBBFEFF1B7C976B
-:10143000FFCBAEF746F8FE8DC077A41DFD8A575E40
-:10144000FBAF64F62DD6BDE65F96AFFFF1BAA5BE41
-:101450003E5E759DC885FA6FB1E6F75C4ED23EBA26
-:10146000D53BF6A7493B093F1F4D607C9F9E60AD71
-:10147000247D7342BFF5A41737B03CF243F8FAA9B4
-:10148000E48FA1E00B80C39B09B97EF2271903FD0D
-:1014900096417E7C5235C55BE9CF8D13C22717A0DC
-:1014A0003E7A7405CC0BFA391A69B0A3AF78623F63
-:1014B0003560C9A1B41DD3E3C9F79C40BD65A24DF9
-:1014C0007B7EBA47771EBACBA12D2F602FF642FF45
-:1014D00059419689F9613E93B07EC8B9F1A7697602
-:1014E00082CB5DACA9D16EFBF6703A23E0743D1C53
-:1014F000FE31DCAE839338271B457D3DDC8CB6473F
-:101500005BB19D91C1B997AF97CECBF2DC7B2378CD
-:1015100032719E368AA1257C8DFDB89F34A45F82EE
-:101520008B84FBB785B7C4931EEE12BE126E7A3C55
-:101530001C446354EF20FCFB19738DC877B70B3D37
-:101540007EA23186E7FBB5AA45C48F7E82FB842F3D
-:101550005C46D44FC6D96228EE9239FAC7E07916B4
-:1015600055CC6F92182B1915335281F5261999CF46
-:1015700002E74DF4A1911DF511A37FA513C7E1F674
-:10158000DAFE466E9706EEF685E7517DB719F2DE74
-:101590009F2D646EA8EF4D622E85D767D1B1148E52
-:1015A000C6548CCB8214DB79A379BFDE3ECCBF92CC
-:1015B000E393F082C726B45F40BF6E432C6F1F9544
-:1015C00047ED7D06DEDE6D8474402AB7AF77ACB29E
-:1015D000D0F9C3BBA67F3ACA8FC2F15ABB71713A28
-:1015E000B7ABC8F4CD74CEEFAAC195807A7149E348
-:1015F000203A0FA9E145D52FA1BD7F6F04D1A37774
-:10160000F5039347E0FCF6C6B9707AE7A7EC1BC96F
-:10161000EBCF79F88FF0DDB3338CBE5F48F7F44938
-:10162000877ECF2B8E792FC187929947CD09308441
-:10163000A779EA25B4FF4DF1EDFB1DFA19A7CC50AF
-:10164000A9FE14C6E32B596304F9A327FB3E3726F2
-:10165000407F93E1B081E5ED61F6E425307FAFB0E6
-:10166000F7A6A673BB8B1ACE3C2FDA705EFDD35360
-:10167000E0FB64D67D3CAF57D61FAF6C46FFD080F1
-:1016800009DC1E2FEB633FD8EFC274EE5FCD117003
-:101690009179802BD52F5B6B694FC573CF5A53203F
-:1016A00003D26732C7E7A54379610A9BB409E1FE1B
-:1016B0005D956DA5F97678C9CE1D99E9403C788095
-:1016C000A429BEB0C9E940BB57FBB8E600FA07DA67
-:1016D0009F74BA1A1C84658AC791E7ACF671818140
-:1016E0006897EFC8E57E8693F6B6483C1F96DAAC5D
-:1016F000149F23E37AE6DB399F0F68685B7F0B9EBC
-:101700003B1F535D5B213FFF31EE77F9C466F52B3C
-:10171000785EDBC8F994ADD3C6F130BB8BEC3DA548
-:101720004DE3CC78BE2CB3B9CDB8CE8A0C4F11AEF8
-:101730008B7D0DF01B89719C8C98C1DBE4A538135F
-:10174000350AF80EF9C4E888C273AF3E0EA846C445
-:10175000FDC8FCA130CF1CECAF24DAB117E9E55489
-:101760005D2AD93D3709BA2BC43846F44F18DB122D
-:10177000713EE1F81DE05F186B4FB7113D87318472
-:1017800043BBC99E8EF4DDBE2ACC807EB6C2959C3A
-:10179000AE81CFAC4668FF889185A3DF2043B42F8C
-:1017A0005E612CDA02F97E56668C8C45BACA25BA7F
-:1017B0006ECBF4E4207D7EF603360AE9A174DD06E3
-:1017C000F2AF48BA60C6D6897130CE67DB9D792802
-:1017D00037251DB5658EAF4D0FA587190AD101A418
-:1017E0008753891EA63D8CFD168E0F0C5C9A85E7EB
-:1017F000D12AE6C6FD3D81B9504FE8641DE47FEC77
-:10180000B4991D68E792F244CA0DC0ABDB1A1FA45D
-:10181000831DB0DF1B4D8CEDACB752FA42BD9D1954
-:1018200041C6EDAE4FA0FCDE7A07A5CDF599F4FDDB
-:10183000C57A17E5F7D78FA2FC817A37E50FD51760
-:1018400050FA4A7D117D977209E0427248CA152903
-:101850008F4A6DE676F4474AB9A4A79B7900DEB1BA
-:1018600079D49EE49E9477B80E435E501E49FCA640
-:101870002845BE0427CAB1B63988FF7CF5E29E83AD
-:10188000782E2FB7B9E89CCEB8DCEB047A45B824A3
-:101890009BD921B4BB362C71B7AF7106E17F7FB9FC
-:1018A000C28C2174F5406D183386EC1B0FD6C568C9
-:1018B000F2C5757F78A30FF45FD1CBB30BF176F24D
-:1018C000879F3EF327F8FEDC0FCFA721BE611EDB0A
-:1018D0009FC071978777CD2316F38D26F2470D9021
-:1018E0007610F8877829619CDF9EFBE1DF89BFDBFA
-:1018F000EB2C0ED4873F423C015CFF2CF054526726
-:1019000021F879579DDE7310F97CB999E45C49A3FD
-:10191000E0C3B500CF10FFEEA94446F608D0A659A3
-:101920001DC0EDD40FCC8108E8FF94C2F95701A582
-:10193000A018E3FED6BEF901F2BF527782FCE71E83
-:10194000AB8DEE35319FE962687F4ADD71AAC7DA57
-:10195000FAC5A0BD84F6B13BD0EFE8363B60DD4868
-:10196000D388B792CC232C11FD264D8A1DFD266508
-:10197000E27BD95A85FC9318773303F4BE77D355AD
-:10198000C26364BA91D2CA7426F4BA26DA9F24BD1F
-:1019900096AD8376C8174DB9E6052172B8447C2F01
-:1019A000CD34502ABFB78B7EFBAECD9D8DFA445F00
-:1019B0002CCFC2346F36C2B7AF6D925109C1FFC789
-:1019C00038FE089C071FBF12910AFFF768668A79E4
-:1019D0007E16E287EF5F729C92CCBCD518C759B2D5
-:1019E0006E1C4A5FD6607225F4827A67BAFAE17A91
-:1019F0001BB3F278E5AA1EF60F693FFB0CFF1C4DE6
-:101A0000EB26BB6EC5DE5FEC7D057AAEF8D842F8FA
-:101A1000AD182AE2A7B2FC23A793A1516BAF9EF8A1
-:101A20008BBF4491FF613F8FAB8494DB53979773D7
-:101A3000FBAB0BF8AA1BFFCFB1BD1F47756BA7DE31
-:101A4000AFDE949DBA46F93A0AF507B99EFCD7BEB7
-:101A50008CA77928D7C8FF53F3DAAAF8EEEECFE8BF
-:101A6000EDD55DF66C61B7D397EBED757D32747E85
-:101A70000123A3FB58D25EC7D4AC68B4EF7F29EE34
-:101A80006BF474AE91F6ED9A4DD0491CF0A7D111CC
-:101A90008DFEAA2B3DE8D30F66F0FDFE92B0875F66
-:101AA000D9ADD239E7CAEE48E2A7C5BB7F761CFDA7
-:101AB000878BB729348D6AD64A700378326BE83E3B
-:101AC00086F16671D7CFBBD39F168DFB48E52F22D9
-:101AD0006B91CE16352BEEED309F4EAB23BA77C807
-:101AE0007C6ECBE0745669691E497016F3CFCD70D9
-:101AF000D077596F51CBCFC87E0CF52E931EF4CB07
-:101B000008F4F523BC7F87F3BCB079980BFD7E8B7E
-:101B10009AF72D263D6277841D8F0CE7459CB0EC2B
-:101B2000E7CE0CCE9F776670BDE582F0075DD8AB3F
-:101B3000923CC379227F9D57B4F1789345BBC9028B
-:101B40006E9F0BFE92F51735B7470D84FA670FFDB0
-:101B500081D259625D8B6CAD39B8FF9EDD1F41FEAD
-:101B6000ACB3FB9F9EF42A8C77A9795C2FE407D94C
-:101B7000FFFC0C13D5BFB4592D4078313F8F7BA9A2
-:101B800046F80E0B9D67DC169F3394EF78DCCF850B
-:101B9000FDBF8A326405F1596DF558F15E63CD7E63
-:101BA0006F11CA8DCF140E4FD3FE713EBC8F54D32C
-:101BB00092CB909E89EF12A9FE5A43483DB3C94586
-:101BC00042D17868AA3B89E02CEE13897879BC1F52
-:101BD00087F267E9542BF927E60D75CCBA1FE5E4C7
-:101BE0005B268E977E8E27507F9BF74E1CC54D2D12
-:101BF000753A66E1FC97BDAB52BCEFBC61420E2466
-:101C0000B48DC0B8C5AAB50A73C33ADB9D5C6FA892
-:101C1000F2ABCC03F9BE400F3E00C5FA8C14214F45
-:101C200003E978AFEFA97283DB0CFBDF4933F3A93B
-:101C300068377A91C73357A5F0B8E1A790EE21AD88
-:101C40008A0DA4C7417F17053EABA605D2314EA22F
-:101C5000EAC5448A93B868E67E4BFC8E7ED2AA3CE5
-:101C6000680FF57A8978586C1F13423F55252E0767
-:101C7000D653635D8E5C1BCED77E99F4D89722191C
-:101C8000EAB18683913CCEE9E7615B2D2178DA9257
-:101C9000C1F5E55E028F6C2E8F877C5CC4633FBE0E
-:101CA0003DD18FE73759FF7193670EC201D781FA93
-:101CB000FB2273533AEAB772BE8BA29A689E17054D
-:101CC0007D2F0A6FE2F1D2E29E2CD6C77CBB8951F0
-:101CD0001C77C72E0BC5939C4F6C3D80E39FDF356F
-:101CE00088E1FADB9DFE0587A81CF447C05BC50BA5
-:101CF0009600AEE7DC2E6E6F3E67E2FAD8B9A9090E
-:101D00000EC45BC1B44DF3C81EB3CDA220DECF29F3
-:101D1000CC9C80E5DB7BBB7CD8BEBE8EE2A42B4096
-:101D20004CE07D1C480BF05ECDB9ED83283EECDC29
-:101D30006F54BC1185DFD7E2770F6B9AF73D84C7EC
-:101D40004E7E7E3AFFC27F0E0ABD5726D38A6DDAD9
-:101D500038384927B2FC4806B70F1C11703E9EC1A7
-:101D6000F7ADEA88E6C753689D1CEE80273AF7C1B5
-:101D7000C61FF9F4708C834853506E3C0574F534DB
-:101D8000DA1576F2F3D5F9DD268A0BAF3818E9A615
-:101D9000B8B335B718280E42E57A788501C047A94F
-:101DA00042FD564CCBA47BBB006F3AC7766C57C53F
-:101DB000388CD970DD3B789C6F21EA8A549E4DE5C2
-:101DC000E744FEDC816CD2EBA07F37DE57AAF8DE59
-:101DD000F7391CA797BFCDC88E6125F95AD5E5C73D
-:101DE00019138DFB5DF59ADBA2F13E1F7B4765A8B9
-:101DF0009FE8E174D5E8EA8372B577A690B3079EB1
-:101E000031A33CA814F7432A5F50B83F19F80CEFF0
-:101E10003B56AEBEED09A2CFDF99581AACE762F38C
-:101E2000CFA234F81072B0ABBED945F52BA13EF667
-:101E300053B9FAAD289ACF0E13C5995CB75FDD6C24
-:101E4000FB17D49B6ADF451FCDDC8E72DDFA59EBA0
-:101E5000BF7D0CFD7FB13BCCE5A3AFCD74AFEC8271
-:101E6000A97901AEFFC29E3092471762B87C380B49
-:101E7000F2D39781F3B8E7271497F5FBE9741F6E47
-:101E8000A15FDBAF1CD79869E27416E78AC6B8BEBB
-:101E9000EA77B87C03BCDC4BEDDF31517BFD3A4E79
-:101EA00067F0765DFCB92782E8E1425F8E970B7B95
-:101EB00033683F6A8FE1740EF34DC6FB7317F66407
-:101EC000E4D2BD34546E801E2AC4F9F6424C73B27B
-:101ED0003DA4BCDD24CE6901A88974836D40EFABBD
-:101EE000A8E37A55A5751DC587605CEDC83C4A031B
-:101EF00096D8EBE363815EE9FC787FA6B053E27885
-:101F0000F1227E9BF49D6633CA6F8FD00BAB76EBCC
-:101F1000E36B79F9AD998A8C0371F492F1BC48872F
-:101F20003E85E24C2A1B972C423AAFACDD703FF263
-:101F3000999C7FA59115E039AC5D51691EED61EC6E
-:101F4000C169B86F848E13AAB7C979E254E3495FB7
-:101F5000A57DECAE4CBEAF61BE09FAAB6A54D6D1DA
-:101F6000384E799EE5EB927002709831AEAF7D9C51
-:101F700028EF61DD729EFA75CBF93C90C9E551BB43
-:101F8000D3F1933188E7DFAA743FF6EAD7C3A2639F
-:101F9000BBD1CB82FBBA3918DF8AF1BE487BD04F68
-:101FA0004E26976B95183F0BF34CDFAC8DEBCEDCD8
-:101FB000A6CD0FDEADCD67EDD7E6735AB479D73134
-:101FC0006D7E1A8EDB9B9FB3F13E2E9EB331C5739F
-:101FD000B6C3C2CFD998C77336A678CEC6EF78CE2F
-:101FE000C63C9EB3318FE76CCC4B78E3791BF3781A
-:101FF000DEC6F2A7059CAA449C24E201E99DBD1C13
-:10200000A6B9EF73E5357E8F03E880F3CD1C33F17D
-:10201000CD535883CE1DDCAED477BAD581F1BE8FB7
-:10202000C47A5665A25F54695D9D887833B651DCE9
-:1020300069CD2B3CEEB42A2FCC86F68DB65567576A
-:102040006338E703B19E47B1FE1553C70E846F7521
-:10205000DD51BABFDEB6C2F1CE1D1C7F646761E5FB
-:10206000B1A43779719F8BED198FFAB86FB64E1BFB
-:10207000E7AD8FFBD6C77BEBE940EA7BCF993A12FD
-:1020800051AE9FDE655D87F33F1D26EE9FCCB6EA1D
-:10209000FCFD424F5BAF6CC5FDFA1799B1DCAF7226
-:1020A00002F4F36EF65999965E1B467A78577E9D38
-:1020B00062A07B7109F1B40F2D13734A563ADAD737
-:1020C000A09C5B64A07DF32AE86538DED5F754D286
-:1020D0001F32361934EB19E40FD7D0D7909DB1BA1F
-:1020E0007B0D7D35F5871E4AD1DD6B18AC8DA39F26
-:1020F000B1E2309EEFA7AF1BA6A95756749B0E8E78
-:1021000062DE427F2D83FDC30DEB7B6AF9A664C4BA
-:10211000EFB2459DED6B503F7D298CEE8595E3FF39
-:1021200003B9580E7DE27DC6F2FDE23E709D761F3A
-:102130002E15FB50B991F9ECB1413A2CB733770C1D
-:10214000B45F34B8352780E78ADFFC61A43D05CF52
-:1021500015E3FAA03C4A36B9290EB66A5F5ACC0A92
-:10216000E8F758AAE7A34CC0CB99A6A33F2EC6FD1B
-:10217000701F3FEF9D5EF7AB288A1313F4966CB285
-:102180008723DEB734F1F838B48FA9B141BAD8D279
-:1021900014173ED0165C6F900EBE263C017EB81D13
-:1021A000A7FC08F93D3A9BC57AC7293ED4A7E5FAB2
-:1021B000968A7D850DE4FD3C24F267C4F942AEF3B6
-:1021C000E2A0C3390EBC7F517F285945796ED8BD36
-:1021D0002311D2D116CF97B89EF22D697F1A03E34F
-:1021E00054FC91AFE7938D13A246A3FEB9C7E42A2E
-:1021F00084FC9AA6E7CD78CEAE30FACD145FB96BE9
-:102200008B19E38BEFDCB985BE2FD8E9A578CA8599
-:10221000AC96CE9F9FC97704043CCAC72B9BED3078
-:10222000EFB983B8FC280FE7FE3BD08FDEC0F73B49
-:10223000AEEE5472318E6746D13EB317BE470D12D3
-:10224000F783747CD2F9F6F4FCDE040F7E5FE38F33
-:102250000C4EF1A9D7F3C5F46B4EE28B19D786D09B
-:10226000B96C6660103FFF66E9CEBF6FABDC5ED72E
-:10227000C2F9A0DC1CE8351DF9E47513E9B9D5B045
-:10228000DF8CCAC37335EC8D90168D5135F45A33FB
-:10229000314243CFB359ACE6DECB7D183412929F66
-:1022A0005198AAA93F6BC6101DFDE705CB498EDCEE
-:1022B000AAB95F57BDDCE75048CF1CAFFDCE789C74
-:1022C0002063776BDA57B369C17A48DFDBB81E5CED
-:1022D000BD3F662BDAFBCA0DFCFC34DBC3BF2F3ECF
-:1022E000C4BFB3D94CC38703525D7FE2FBA289FC14
-:1022F00002D29E3E1BFFEE06FE8C8577DD0FC77B6C
-:10230000F1688FD0DC9F16FE409C37E2A15AD88D31
-:10231000AA33B9DDA8DAD76AC6770700FEC6B8586F
-:10232000AA678DC3F8C82685EC8A982EA778496DD0
-:102330001C16F687718C8B4FA85EE4137D7939BE2D
-:10234000DF83F87D85C7952EDCA48F835C47FEC8AC
-:10235000C5680F0AC1DB53831C425FF1AFEE8BF0FF
-:102360002B5472E95EE4EEC3668CB39B31232617CF
-:10237000F9464F5F52AE033FD3F9BBF3EDA3445F81
-:102380009DE546A2DF1BC161B19BDB51F574B780AF
-:10239000B59AF19EF882FD8A0BCFA3580FE1D117B1
-:1023A000E951078FB8D8EBE120E1D305AFFDFA384A
-:1023B000370EA78587147FA01B38E9E7DD13DCE41F
-:1023C0007A16783C93502EC8752DC4F963FF307F80
-:1023D000EC5FFA21D8283D7FA6927D6A71118F8F1C
-:1023E000D5D3C3B46BDCEE72DF3523A5330AB5FC5D
-:1023F00088ED902F665E8BA7F26F4B2F8B619EFC52
-:10240000FED3CDD1895C8794BB417EE0F7066EF4A4
-:10241000BE8FDEEEB8639088131CC14668E29185DA
-:102420005CD5B7D7C7234B3D40BFBF78230D1437CA
-:10243000D9694B21FD42CA598FD83F3CABBEA47A23
-:102440001EA8C76713AFD96F3CC2FEB7343285DE12
-:1024500063485E11178F78F286D929FEDEBB42A54C
-:10246000B8672FD47384E827AB1B539371BF38F53B
-:1024700048C6B33ED0DB4F7DB757FC2818E7F42A97
-:10248000532FAB2358EFD4AAFC648CD338BDC13290
-:10249000DBDF0DBC5AC5FE50FDC30F683FBB64783F
-:1024A0003B6A36B4AF5AF5521486F957AEE2FB7860
-:1024B00079AAE79D41BD713FDFB2C38EF0B36FC90A
-:1024C00041BBEF49D80EB0BDD41F2A56E5F741FDF8
-:1024D000A2EABF8F3E6BC77BD62B4CF1A87F9E7BB9
-:1024E0000FF64385F633D21B3E0B832EC89F164949
-:1024F0007684CF14E646BFD245C3E1BFAEC1736157
-:102500006E737A00D2EF593C2771DCCA55CF93DE47
-:1025100052F1E88A7455C57ED3A2BBB39BC87487B9
-:10252000D8B7517FC714F5778C9341FD1DF3A8BF31
-:10253000638AFA3B7EAFD9A4D5FF2EA7713925ED6A
-:10254000C9031A3A72D17FE71BCF326B69BFB565F9
-:10255000A2BEBE4C0977A13C5A86BA12E6FF1246CB
-:10256000E758B62D91EFB702CF7556EE37FA4ADC31
-:10257000CFBDBD0374B210FABCE39A9585DE9B1DF6
-:10258000C76234F909D6444DFD7CBB53537E67C204
-:10259000204DF95D8E5C4DFE9ECCD19AFA935DE3A1
-:1025A00034F97B47DDA5A93FD53D55939F5E304764
-:1025B000537F669157533E6BF6224DF91CCF124D57
-:1025C000FEFEF2EF6AEA3F50BB4253FE95014EA475
-:1025D000402F2D78EEB2E0FB29564ABFA3DA8D28B2
-:1025E0003796FD36CD86F81E33C150DB9D7D3F63A7
-:1025F00030D787CA86B85306F7E6EFE0203DF617D6
-:10260000EFDC8C18CCF199C480AAE8BCDB9A88F482
-:10261000ABAFA72F1F1371E4AA0370F893C14367F0
-:102620001A410E8DB9E5C8B054C89F18BC60A611F8
-:10263000E4C698DB8EFC2A05F2AD837FC1CB871EF2
-:10264000B98AE5B38654F2F2E98C548F3FBFD07754
-:10265000A60FE77F47CA3A17B793747BCF5CA608EB
-:1026600007BCAF8D70C03400F48BE911A05F4C8FB4
-:1026700001FD96817C3A0EF48BE909387FE2F77F01
-:1026800087F327A66FC3F913D3DFC1B913D3563825
-:102690007762FAFBFAD994BE57EFA176EFD797533A
-:1026A000FA417D2D7DFFA8BE8ED23FD7FBE8FBD43B
-:1026B000C1D28E11609AFB01E867447FE221D3C545
-:1026C000503FB0F4574AFF64432D6B8B4079D1667D
-:1026D0008CF9D41AF43BF66C0730B24F43F4B1686E
-:1026E000E62E1E4CFA423F3BC96FF1DDE4F0781153
-:1026F000CF7F744E4F1BA6E2BE55FB06BA65FF683E
-:10270000E8FEDDC411823E460D712F20FA10FE75E1
-:10271000E9DFEE8A9B09F1BF1B42E275E85F48DC06
-:102720008DF483CB389FDBADFC9EB1F473CB781E68
-:10273000D95FFE178CE4C3D8B546D25F228D2C80BA
-:10274000FDCBB89DB1D6E65C8C63185B65A37BB509
-:102750007DE0BB398FEAB95548B7FD0DEAE704FDC6
-:10276000EA7DC4FCA19CE69FFF8587ECB063455CD5
-:1027700001B6B7F2721FB61F8BB685E194927C7AD0
-:1027800006EFEDE605FDFC583F82D70F607F03FFA3
-:102790000EE34505F9A67F6C732ECAEBFE8B6D74B4
-:1027A0002F74F3B800BD6745462780CB74797EB29D
-:1027B0008ABCF4E7EDEC4376A40982D7BFEFF06C56
-:1027C00042F81759EC7F89203E4BED8FF6C9A9429C
-:1027D0007FFE07787B06E940C253E245E251E223DF
-:1027E000247E8AF0D0135EF5F8D4E351E22FFF8BFC
-:1027F000205E10AED7E32D8857B4E7FEABE06DB88E
-:1028000091BF5F66A9B2D2BB6837C2E3831D6C5229
-:102810003456717A46207EBCD71CC7315FCAC64D7C
-:1028200042D4CAF2B1583EE2FA72CF171DA6E810A0
-:102830007CDF2EF03DBF87FE643DF91E83ECBFB107
-:1028400087FA6F85C9B80BB72D776430FE71593E92
-:10285000877F815325F84FC85A487A32B3713DD3E8
-:1028600001FFA15C9AF47511BD4FF925DB8D9E5BCC
-:1028700036A997563F2DD0F9ADEF167AE9DD3ABD6E
-:1028800054AF577E3E58F8B39DCCF92DDF9DBCC6A2
-:10289000E5DACDBE3BC9DF2D9D28F82C49D059AAD9
-:1028A000436563908E9887F6C963F86E690EBEEF34
-:1028B000E9A3FC5DCC4FE93D2C40FBEB6410C498D0
-:1028C000BF174428E68F464C29C6BB7113864D18A6
-:1028D00088DF43DE658B1CD29BDE65FB0F7BC8BBAC
-:1028E0006C47263AE87EE5116B2AE95FC887A61097
-:1028F0007BE06F607F1A08FBC751D8BF307D03F6BD
-:10290000AF81B0DE3761FFC2FCDD992B18B69BE4C6
-:10291000D0C6EDC8F6F7D827C0C1A467F8DD93F399
-:10292000723F84EF5B311913D17EFE56CC2D1371AB
-:10293000BD6FC5F431F0D462A634FBE0C0EEF443C1
-:10294000C907C1F126D1787AF84A78EAE128E1FB93
-:102950004FC0F396EEE0396230E3F649EB1FA21266
-:1029600052D07F1725DEA3FC6D8E0AF97338B5446B
-:102970008C57BD8DE639B66E34330E23BF4D16C26B
-:10298000B5CACAE1A5B75BB16D7D0CA1F1BB57CD4E
-:102990009E8221B0EEB39B55BA377EE9C530B2476F
-:1029A0007DE6E7F6B67B14CF649C5F95EA5887EF27
-:1029B00088B2B7F83B67ECEBA3C9D322BF059D6E85
-:1029C000E3F7EDABAC93BAC5A33C4F4D71BA47707A
-:1029D000FAE7EF454ABDA29F85BF4B20DF2FEC49A8
-:1029E000CF1819CEE5603F0B97DB12AFD08EF249BE
-:1029F000D0CF489073493F09A7F3C5CEDEEEF9B8B2
-:102A00003E6947E8EC17E147793B363084DEE52A3A
-:102A100038A1523CF11111DF75E7905A5B0AE0A929
-:102A200029CD5383ED98FAB58A72E66D58671CDAA2
-:102A30001F4E0CB3D1F9F15B9E43BF3344C88B1CCE
-:102A400096A3B9AF26E94EB551FC4EE77BFC3EDEBE
-:102A5000D2DFF0B8CDA5BD558AFFD7C7C58D65E9D2
-:102A60003F417BE3845E2697DF11942FF21D204BBC
-:102A700082813942F4EC3047387384CC27223356B4
-:102A8000938F74F5D5D48F1E95A2298F710FD6948C
-:102A9000C715E469F2BD8B6ED5D4EF337BBC269F9E
-:102AA000E8B95B533FA97C9A368F7C0770EF5F3B98
-:102AB00057D36E405D89A69ED357A129673E776B99
-:102AC000663CCA71FE2F75ED524DF9D351053C7E1F
-:102AD000DCB680EE29A6357D4FD39FC46F521CC74C
-:102AE0002F73F0FDC107FF91DF42E0393F41BB6F1B
-:102AF0004CB08F3B66A7546BD748BA411CD4A17F1A
-:102B0000960EAA99960E7AF1389EFCDF0C73A01EE1
-:102B1000A3C73FFA2342D789FE8850B8A03F22348A
-:102B20008FFE88D0FAE88F082D477F4468F9B013EC
-:102B30005AFC8F68D5E2FF960FC6FF433C8D6ED3DB
-:102B4000D2831E4FB77DA6A58FB19E7082CB04D0D5
-:102B5000C790DE259E66C37FB4CFB3A268B41BDCEA
-:102B6000C1DC742FE07F0B5F9775F8FA92AD1B8183
-:102B7000EF5C5EF17239DED33E7F6580FB0B94BB68
-:102B80002942CEEBED00329ED4379EE3D377328CD0
-:102B9000E4D55786B648DC3FBEA3B6915D3E91753D
-:102BA000BC81EFCF0CE9E56159BDF1CA36703F94A5
-:102BB0003FB5E8BE5CDCE7E6FDDA928C7ACDBC017D
-:102BC000FC3D4196D546EFB4C8F9CC4BE2F147D66F
-:102BD0002C21A75D3C0E29228BDB7F225D768A8328
-:102BE000F6663111E7C992E765231DBE1D96817413
-:102BF000B691DBB9DA4C0E8A6BF1013DA29F12F55A
-:102C00006DD487FB0B7DB4E143AB95D31DD3ECEFC3
-:102C100083FC564D1CEE909D764D3EBB3941537F53
-:102C2000E82187A63C3790A9291F76C2A5C98F68DD
-:102C30001DA5A97FCB076E4D7E745B81A6FE6D9F9F
-:102C40001569F249ACE34984E7F8AC141EDFAF081C
-:102C50003B8083E365DE77E2E93E8D3C47C8B86C94
-:102C60008FA063FD796480D94371DE0D89CC45F76F
-:102C700041ACE23CC8B4E7148F88AB96FA3CF369E8
-:102C8000E3AA653C75D779469C5FE47922249EDAF5
-:102C90008DF397F1D45D7817EF4BEAE9F35E817716
-:102CA000FD3A0698F9FDAF86EF9AE91E8B9C9F7E50
-:102CB0005E9B443CE0766BF7EF0F3D20E8AC2DA522
-:102CC000686616D47B16B62782E775E3B9DA7C000E
-:102CD000DF861F985D2B1D371E6FDE50BE9E627C07
-:102CE00057358BDEE9A47B6B72DC6A31EEF41CA5F0
-:102CF000DBF5CD8BE6F15D2CDA4CF72E7A1E8FC317
-:102D000035C1CC1AE99D24710FE18175CDEB3154A9
-:102D1000B3D8DC64E2EFE3FB4D68272A1C0F7A602E
-:102D20002EDA0DDFDF68037DEDD93A23D97D1EDA77
-:102D30003DE63ED020BBEE950C80731AD24921E2CD
-:102D40001FFA3D97CDE39D1FCBE2F2215FFDBAEB69
-:102D50003E804523E7F9F9AF1BBA237A94EBF8BF1D
-:102D6000BA1F20E9570F2779BE6662FF1A28E625A9
-:102D7000E1D7653F11F093F7331C4B4C455B6D7405
-:102D8000CFA300E3CA24FEBECEE674F96616C737A9
-:102D9000D64379D453BD7C352B1AEDE09DCC116D13
-:102DA000BF813DF8FFE8DE04C1BFA7FB5E3DC989D6
-:102DB000EBE4430FF7BF7AA24FFAF72DEE8185C8F7
-:102DC000091EEF23F0E11F6820BFFA9A482D1FFF6C
-:102DD000358BDB5D9E96FB850FCEDD5A39C1D0AEBB
-:102DE000DFB04A15726241D7EF48E0F7F9AB4CA467
-:102DF0005F3356F438C6197CB2D14471B163DD8CAF
-:102E0000F49892CD8A7F8B82FBE898049CBFD7A769
-:102E1000DD8FEF60AED5E8FF285DABFDBED0C67F8D
-:102E20006F62BEFEDD14715E5F7883F3FAD92CE128
-:102E300007723117E95DC2FF5F2EDAE8F5AE4E3F4B
-:102E4000F79BE1795BE576278A1B93FBBB03FD3794
-:102E500021EF81003CC333711F6F34761BCFD70540
-:102E6000CF1EE2152EDA44BC828DC76774EE0FE3E5
-:102E7000FE4DE95712F52FFAAE5239D6C7DE2EE5D0
-:102E8000F2B80BE94FD2FBAB3A6D06F2B774EE8F96
-:102E900024FF3CFA71A2810ECE1BF6C58F7206E7A5
-:102EA000E76953357E107DEA59F1129D17CB533DEA
-:102EB00031D918876D74595D907FC47684DE8F2A6E
-:102EC00014762FFD7CBBCE5D63F8FB2E9D3EAECF0E
-:102ED0007616F07738402E32E42319873095C129D1
-:102EE00015526F6034CDE7DBFA73A65FCBE57ECC7D
-:102EF0006BB7517BCFDAD1941FD0B87E09DE8399AE
-:102F0000D9B0D0842EECB62797E78743D3B6FEFE20
-:102F100095E188B7714AB776F9BC6C85F8A14D1771
-:102F20005F2FD3ADD99C5F7E9D2DE5B888435AA114
-:102F3000101F2C55988C4B22392EF3579B443E9FE3
-:102F4000E797ADE2F936F1BEFE0E6147C175638ABF
-:102F5000EBC673FF6E6167C175638AEBC6EF28B776
-:102F6000308F720BF328B7308F720B53945BF8BD20
-:102F7000841525E7AADC0F353194EFAE59D9C4107A
-:102F80007E413F54681EFD50A1F5D10F155A8E7E2B
-:102F9000A8D072F44385E6D10F155A1FFD50A179D0
-:102FA00036EAAE601EE59C7BAA263F1DF4FC892113
-:102FB000FC8D7EA8D0FED10FA5E9CFB344D3FE7E11
-:102FC00056A7698F7EA8D0FA0FD6291A3FD583E27B
-:102FD0009DD3D24D71443FF31D4535D980DFFF8825
-:102FE000F8EF874D2988E79645FC5C16EEE2786E8F
-:102FF0002AE07837308EE78E3984E7E5669ECFE7A2
-:10300000F1C97AFA417FCF4413F7F7608AFE1E4C6C
-:10301000D1DF8329FA7B26A6717F0FA6E8EFC1EFE7
-:10302000E8EFC114FD3D98A2BF0753F4F7608AFE94
-:103030001E4CD1DF83EDD0DF8329FA7BF03BFA7B96
-:1030400030457F0F7E3F897E2753705EA8C70FD41F
-:103050009C1F810E35E747BB268F7A7C687DD4E3C1
-:1030600043CB518F0F2D473D3E348F7A7C687DD402
-:10307000E343F3BFCC72109FA13E1FDA0EF5F9D0E7
-:103080007C7693EF0DB49D4DDE7CF918A66D91CA48
-:10309000B30A888CE6ECF7EE433F5D5B98921C0325
-:1030A00092D3B4E2C3FB2682BEE611F17F39ACC3F2
-:1030B00080F8F688F7D43D0146F196D97F4BA4F20B
-:1030C000CB78AF5FC4DB22DE73F733FA5D12E92FF2
-:1030D00096ED5DCCAE622AEB07F3DDD7D38F2FEBF5
-:1030E00091FC0C9907DE00C67895DCE5B63C8CF7C0
-:1030F000DC6150284E62C74A1E27ACA7AB33424F53
-:10310000DA61D87704EF81747815BA0F9C6E642762
-:103110004C7908A7DA3CDC7FDFCE8E11EBAABD1517
-:10312000EF9BC8794BFB26C809BA3F37A6A3754267
-:1031300034F4E3F18DA3DF49293473BD01DBE17978
-:1031400072884F716F0DA1EFF785DCF4F8F8F83F46
-:103150007F6E0A6F17CEDBFDFCB92882E3944685AB
-:10316000E2A5C6EC666EBC9FFB1F429E0ED91D50A9
-:10317000713C6F231F4FF6EBDD9C4CF716BDAC6D19
-:103180006202F9481486725BC20DD6770CD707C766
-:103190008613689FBED97B3FB70F8FC9C7383AD611
-:1031A000C2E81DCBC9C3DFD5AC97D03E92FAA57D4E
-:1031B0002DC3A7D07BC1537C2B56E2B63ED9B7E4D2
-:1031C0008DDE587F1B73391DB415D1BD58399FC191
-:1031D000EE7D06D81659166B358429886F76342E05
-:1031E000847E80F36720BE735D267ABF77AAD16E96
-:1031F000A2F7237A883FB96A93F1273A7D4117678E
-:10320000D2B0FC8364B4272F8D3490FD77E94BFC5A
-:10321000F7003C9B14926B520FF28A38B5AB8D6F5E
-:10322000F49E8570DF67A2FE64FC4975AA3FD980D1
-:1032300071F57DB7E4C4AAA407C4E6A01EE0FBD5DF
-:103240007DA3B0DE2AFE8EE5D5C699D101EA89FBC1
-:103250006BCA04BCCA441C93171FF45683BF8B254A
-:10326000EF77B026AEEF497B8EF7B7C38E237EBDD6
-:10327000CF8877A5D77AE95EB63E8E6851A389E2FA
-:103280008E16E9F4C24AA11756DE402F1C9CA3D328
-:103290000BE5EFA588364CEDF73EC6EDC97B89C539
-:1032A00026CEFFC5FB18D9618B574C30D03BC82FB9
-:1032B00071BA295EC1F59BE297DD74BF50EA8BEFCE
-:1032C000083D66DAB52482FB1F84DE3213E32B014E
-:1032D000BE856D61220E2B91D259D778BCE5341B87
-:1032E00097036DAFF177203A7D16AE4F1D63FC1D3D
-:1032F000331D5D4E35FA0D78E1CE3506E812F293B6
-:10330000510F82FE66A35E148774EECCA7F8BD024F
-:1033100085EEBDE8E9BCD054FB06C687166E672E65
-:103320001F0BA573A05FECCFA7D0FB001E71AE955D
-:10333000F4ABA7F77911C21E65E3F6A62EBB04EA2B
-:10334000A8F44877CE2CD41BE7A16FAF2F27188C99
-:103350003B8BCCE2E5653939B31AF190D3839D42BA
-:10336000FD9E99E0E191EF20F46037407B01CAC9EE
-:10337000071ECA359784C8C9E1AEF18D434704F1F1
-:103380005DD275DF2F8BDE055DFA481AFD1E4E4FAC
-:10339000FA7029C015F9625E74DBC3F80B6B0D3946
-:1033A000CC3D31017F2750AE8F05308E70AEC837CF
-:1033B000EFBDEF4F6B6D0417CAD7E78C998571216C
-:1033C000D5D6B649487635599E02BCC718944F45A4
-:1033D000EE2405E5536E00CF849BE4FD649D3DA281
-:1033E0003987D7D7DB254AB3B8DC96BF8B72EA9111
-:1033F000837B71BF92F33FD5C3EF30ECCCE1F2F7A2
-:103400007FEB1E84FEFEC32FFB7A9ECC81753C6E43
-:10341000E0F7F9FBAA4D4CD887C82F2CE50513EF30
-:103420006004F1EEA677741B1E51ECA1F629CF5A69
-:1034300085DFA3EFC18EC3323B9EDC0EEDE6D59B4C
-:10344000E9F7F89E4BE7F4F31CD00FFD5E8AB9F55F
-:103450000DAB3308C78FEB7E6AA2DFA56181347C98
-:103460007F676E6D980BE5F17057D12F71DE1159A2
-:103470002E92438D18430EF9BB7A15BD88DFABD76A
-:103480001D7E16DF13A86971D2EF95780FE5AEC6E1
-:10349000774E86BB3C07B1DC6BB3D37B1A8B1B63C7
-:1034A00068FF9AD747DC0B651DE46793F07F47D828
-:1034B000AFD6BA38FD5E11E70E14905335F5BAB7A2
-:1034C000E3493BA1DECEA07F5FA227FB82B427A009
-:1034D000FDC01C626794F60953E6A939A837149B0E
-:1034E000B5F71265CA86F27D5F9E03E777ED5B59FB
-:1034F00093FAA07EBC41B1D37B9336C7ACD1902F59
-:103500003B61C2C84E5618EB30E3FB031D805F8C55
-:103510008F2E017E4539532CE2B4CA368D267E2B80
-:10352000F343DACD3B9C32BD7FC3D1FE2F23FD0494
-:10353000DCE4B72CB3BBCDB1217C5FDAA468DE1D1F
-:1035400090F98E1C95F311A8E308BF071E729AF13B
-:103550006D9F62502330FE8F0D7568FCC7508FE25F
-:10356000410A53D871FE0E3CCCDBC9C7CB0BE9BF77
-:10357000A489DF9B9679A84FFACFDF732209AE5E4C
-:103580003BACDB89A99DE60970203875AC87FE1C31
-:10359000340EE1A334E037E179BB18E350203FD784
-:1035A000EE37E138258DFC1D13CF3A3E8E676D8CCA
-:1035B000391BF523A3DDDC1FE1277E6F15E6477A73
-:1035C0006419C005EF63E17D37DC5BF4F0F18AF943
-:1035D0009635C5D03B0AC1EF1B4C888F393DBC8B5B
-:1035E000903594D36D49E338BABF5E6674D33D0716
-:1035F0008F80EF274BC21E45FFC09C8D4F989C903B
-:10360000EF3794D36FD6504E5F852981347AAF68F7
-:1036100049980BE739C7DE44EBEB82EF63000F05F7
-:10362000DFB92922F8025DF8306EAF6CA3169FC196
-:10363000F970F8966DF412BF2D307ACCF6D0796C13
-:103640003A9C86F7AAE6007FE3BB12CCEEA1FB9280
-:103650009F3E362B99D609F344B846BA1C93F0FD29
-:1036600021A0137E0F46AC47DEEB96E34D1CCAEF5C
-:103670009D4E1CCAE567CF7CE926BDA601F08B767E
-:10368000EF9EF8D28C821BC63597F1DF91D0F3A95B
-:10369000E44FC997924F25FF3E6B2A0A24284139EF
-:1036A00003FB6CED8BDDC0A951CC77AEC02BC0F510
-:1036B00058E83DAF6A81D7E2142DBF637FD8EF1C75
-:1036C000C1EFC5E30369F82E93AC2FC72D8EE5ED4E
-:1036D00090EE91DEE688F1B0FE52AAAFBDA752DAB5
-:1036E000252F76AF8A4779B14FE17ED0F547FB7F32
-:1036F00007F5D73D5C7FBD50B57D31EE97CCE84FE7
-:103700000E7DDF7F3EE83928271688FDB92CD0BD15
-:10371000BCB890EEA9181AC2CF653FDB93EEE1F278
-:103720002680F2E6CF7B5EFDE3AD8EE07E2AD753A6
-:10373000B2F65D93D7160A3FBEFE47333BE93E5EC5
-:10374000A9CDECC078E7D2462FC95F96007AA112C6
-:10375000127FA6A30B6FA342F7C84AEB46FAD5FF28
-:1037600045395DBA6E2ABD7B20F126DF6791FBAB40
-:103770009CFF7A31FF2621DFE60AFA9E5B3ECE9C53
-:10378000D88BF46E0CB36473C4F73965DAEF5D78E7
-:10379000EBF25F67AD467EC1FB45743E5967E2F6CA
-:1037A000BEDDDCFE7861E9C1DFDD07F5CE3FBE2579
-:1037B00099A95ABCA19EBA40E8AB0B85FDAF1BBCD2
-:1037C0006D19DA3B985FF81CC75BE9DEDFFE05DFA9
-:1037D000132B4E11F26E3D7F07A0A4791FE171CE2D
-:1037E000DA0D2627D4DB37D44970EA92FFB5B976D3
-:1037F000B42BCF5DBBC58472629F84838E1F8A45C4
-:103800009CB08433EE4B4A887F43D647F988EFDF7C
-:103810003FB4242C0AE379E4381F093A2FAD8D898F
-:10382000C5F14A6BBD3FC6F390DC0FF4EB3C1DC6FF
-:10383000F9A504FA43BE3D3DCE95BC342BA8CFEA92
-:10384000EBBF2BF0F8B489FF4E4D5244F32E8A6B38
-:10385000A80977A1FC1838B0CD8FE3227DE3BCCD59
-:1038600006FEBB3603ABDA3EC77980AA4D713598A8
-:10387000E2FB58A87AC7437EAB81DFDF4A5179FA71
-:103880009590D7501EC072D6AB8D7E5F23246E56A6
-:1038900043BF66B68D7E3FD1DC8BD1FB66925E6501
-:1038A0003F925E253DF7B4BE2B42AEDC687DA79DFE
-:1038B0001C9E66F1BB2937BD3E0BFF1D5DB92E393D
-:1038C0003FD0E1DDF4BEC7F7B3C9DE737A852B19AB
-:1038D000E3267B5EEFC6FCF86ED6AB5FA7E41B1950
-:1038E0000BDFE5CF6AE27E87D30AEC6FD0EEF4926D
-:1038F000308A6F93EBD2DBC3FF1FB640B5F6008072
-:10390000000000001F8B080000000000000BCD56D7
-:103910007D6C5355143FF7BE7EAFDDDEBAB1751B2B
-:10392000DBBA8D8F46BAF1CA80F891681D8CF0C75A
-:10393000A2DD14DD0C6C25B031C68A9360A8C6B830
-:10394000B2229211E24C3618044C876C7F18205D2D
-:10395000208AB19A8689468311E11F1292A60B38FC
-:10396000D16856310A44649E73DF2B9D08897FFA23
-:1039700092E6F4DE7B3E7FE7E3DE0F7A658085002A
-:10398000C77B1D00468093BD4E41A3BD2EB19FA7AE
-:10399000D801E6007E495B930D60AD05DA7C565C8C
-:1039A000C6F1970F9008568DF4B3CC7E831DDA9A3A
-:1039B0009026E4A4CDEEC67DBBBA7FADC7DC0F393F
-:1039C000002D90DCE7588AB2C12A1845538981AB93
-:1039D000368E7C579F463E77466EBB3EB51E88CFDF
-:1039E00066708E5600646DFFAEBE10EDB50F567852
-:1039F00018CAAD0BD6268278BE6E57A102B86EB734
-:103A00003A773BE83C54A1F4E13A6BD033358CE78C
-:103A1000EDBB1629C4BF9D812F4A7E0F1C002800D4
-:103A2000E8807B9FD7B41C6013FD43BE4D56C32472
-:103A3000ABC1F3E0C43C19E53B14B387A1FD4DC312
-:103A40002C6EC4FD060E7BD81280F2B06F5511DAD1
-:103A50004B1D64CA51923D5CEF4D9A5485339500DD
-:103A60005D0B7D35CA325CDC99999941FD8F20460A
-:103A700020515C512FC501434C1E05F2DB67207CB1
-:103A80004E2C760A9C13839336A75BC5BB11F106B7
-:103A900047010794DF6652FD2B37A426DF46BF524D
-:103AA00036AE1CC575BDE4FED649717E2581D1496F
-:103AB000721ABFACF1BFF9A8C98FFAB6D92A0B01A7
-:103AC000E9C66174A216CF9A4D9C70E8D47C6E1F33
-:103AD00079AE00D08F763C77E2F921DA7C0C60F782
-:103AE000E08A8224C9BD5BBF3F540D50A6E1784DEA
-:103AF000976CA4FC5C1F29B4EFC4D83606C20B0037
-:103B0000CF378EBC5D46F4FA88B939827C2BE5C686
-:103B100095B9186FC7E15C8F84FECCD0F714E64DE1
-:103B20004121C4A72BB0A21010AFEEBB13EFC955B3
-:103B3000681FB126DC7F8F664542C8D2DD7BA64C6C
-:103B4000E2E88AD1DF4C786EE1B1171E433D3FB108
-:103B5000C85891E07716CAD68CDEFBE9542FC28094
-:103B6000F51C78F3B2D0F30B3FFF4C0BCA77074E2E
-:103B700065939E2D439796CBB8DF59E5DFA8CC21FE
-:103B8000BD2363324204C323353E8CA35D01E1674C
-:103B900083DDF7420BE1FE9524707F98BDCE334C58
-:103BA000E07B2FCE488E8170F7C7C1201395C140AE
-:103BB000F57D5D8260146943A5DA2FE9FD20E1827D
-:103BC0007E5CCF1928A3BAD83C76A0CC89F4479B59
-:103BD000BA5E3BF6E2D7908DFCC78C06CA975F07AA
-:103BE0000605E5368498374275D389FD5A94B1DFCE
-:103BF000A764097D9B87D1A9BCCC3E4044C4F5A3F2
-:103C00000E56931FE5E194E715A45774F176CAEBBD
-:103C1000951EB312AAA03C3905DF95016915ED8701
-:103C2000B091E6335A9FB2CD43FBAD39D043F2B6E3
-:103C3000A5D138C73C074EE72E91D49212F5B55561
-:103C40005617F5927555099E6F1B6732D5E9B68FE9
-:103C5000CFAD02750DC01E8E67D7AD27C039CBEF33
-:103C6000AED3E306EA8FEEE3182FDAEF8E8E7F51A4
-:103C70008C7AB69E595FABDA1D00AAFF80D6CF5B67
-:103C80004FABB8044E4F1A36B8337AD6BBECBB4BA9
-:103C900030B7A34AEB8B43C8BA9EF2F63840EC64C7
-:103CA00063F3CE79486B641137E852653EECC37E0E
-:103CB000D74503F5516097A6CF757177A588B731C1
-:103CC0000F66D5C398A217726979C443C8C5039615
-:103CD0003DB01887CD56AB8E683860CD267AB88750
-:103CE000BB7488AB97591409F10E9AB26B684EDE1B
-:103CF00034AB346651E90EEE1BEF40176FF20B66E2
-:103D0000C0BADF210D30A24FB97B18220D8BF2FD16
-:103D100031AA5F0744190820E28CFC9EFEF4875A02
-:103D2000B2FF6479F2374097F43BDB9A57627D7CAF
-:103D3000AE68F1B993B554E773CEAA73FA881EF64C
-:103D4000989750DC3E68AA262DF89FF27E9B476824
-:103D50000EC758FC7DD29F8EF796D6C73EA3750F2F
-:103D6000433F1B9CFE6FC88F6799BEDAC32907D2F9
-:103D70007CD23FAD57CF71FE7A4D581775DAF02DD2
-:103D8000E510022C5943B1C34A75CDBC5E08A2FDB3
-:103D90003EF7D90D541F7B532630A2DDB086475D18
-:103DA000CA32C990AFB47835079CC7CC994F770C0D
-:103DB0009C75F39011FDDC0BA608F18309E7B12B8C
-:103DC000338F0DDCEC15FCB12F6FD37C2F917E9DD2
-:103DD000C841FE921D4C09234FEB8DA923DF225DC4
-:103DE0000B110FE1DA95EF9FA2381237564FFA31D7
-:103DF000BF7BE5A84971ABFA66FB1F7BED76B69DEC
-:103E000067FC9A4E4D9DF868295193B877EA629203
-:103E1000B837EEF767DAE1D4911DE48B73E2B7F2BD
-:103E20000863C43F7199FCAB3359E35236C9E97F4B
-:103E30009E7DAFC085D2DCA945E22A8199129CF60D
-:103E400061356F4F6A7D98CE8B85C05F4654CD4FEC
-:103E50001A3FE1FCACFBE433EBD83AAA9F74BFBE37
-:103E6000ACEDDFB8559943F3E546AC2A07DC0FEF1C
-:103E7000CF4B385FE99D70B8C26BF72CCBDCA76BDA
-:103E8000D2B7AB76DF4A9ADE351A4E6BAC5CC5E52D
-:103E9000F9FB70D1EA245D0769BFD3794EE70F5E65
-:103EA000BF702EA742E4ADFA1D10F99A4BF613B776
-:103EB000CFBF856D05C59277D25FF17FCC57DCBC53
-:103EC00090DE0D435CBC1B4A09F825827A39C6078F
-:103ED0002E10F3A055B228FD0F98077E9A078B6924
-:103EE0001E0C883EBFC953E738A379D023D60E48AD
-:103EF000EDD4E13AC19336F23769C6AA47EAF754DE
-:103F00008A7BA0843ABA4ACD13F5F591D76C47E97C
-:103F1000FD1666DE8326940FEBB57EDF6C8D8CE29A
-:103F2000FE748487F4686F303772B003F707D7CC1C
-:103F3000554288D334687C9D1631179EE05CAC53A3
-:103F40002D0591A315C48F7D8D710EB63C22EEF127
-:103F50000FEF4AE2BD989A0FEAB907160CD379A37E
-:103F60004BE8FB243D67F6D984BEC1466F91459C62
-:103F70001770928FE4F95FA2FC164B2A1F3E0404CF
-:103F8000DFA143DE22CAC7A12683E0DBCF7C2DED73
-:103F9000A4A7DAAAD0FB32D9623939A6A623CE96D5
-:103FA000D27B558D375DBFC30B64814B7968F2209E
-:103FB000BD434275E0EAA1F72BD5E1E24C7E9817AC
-:103FC0007361CFE4295D8F213DE62B5FCD571FFB49
-:103FD00077BEF2B57CB120D66D36E52D2AF0BFC98B
-:103FE000D53CEC9020998531495C711891FE91EF98
-:103FF0007F558DF342119DB71A93CB06E85DCCA196
-:1040000033FA803E0C519F8BF739DEA258E76D5A88
-:104010009DB7A5EBF18DFBEA313937772A4BAB47DA
-:1040200094FFDEE2EB237BBFB04BCB69F3FC5F5226
-:10403000F383ECECD5E6C89F467FBFE8F36385FFCA
-:1040400078679EF7FC504AF70CDC99984BF7CE99AD
-:104050003CDF3EE233CF4B19FC8467514A4FF124D9
-:104060005A7E2AA5F74C5BF04BD137FFD5CFB41F52
-:104070007F03DC4DE081B00C000000000000000078
-:1040800000000018000000000000000000000040D8
-:1040900000000000000000000000002800000000F8
-:1040A0000000000000000010000000000000000000
-:1040B00000000020000000000000000000000010D0
-:1040C00000000000000000000000000800000000E8
-:1040D00000000000000000000000000000000000E0
-:1040E00000000000000000000000000000000000D0
-:1040F00000000000000000000000000000000000C0
-:1041000000000000000000000000000000000000AF
-:10411000000000000000000000000000000000009F
-:10412000000000000000000000000000000000008F
-:10413000000000000000000000000000000000007F
-:10414000000000000000000000000000000000006F
-:10415000000000000000000000000000000000005F
-:10416000000000000000000000000000000000004F
-:10417000000000000000000000000000000000003F
-:10418000000000000000000000000000000000002F
-:10419000000000000000000000000000000000001F
-:1041A000000000000000000000000000000000000F
-:1041B00000000000000000000000000000000000FF
-:1041C00000000000000000000000000000000000EF
-:1041D00000000000000000000000000000000000DF
-:1041E0000000000000000000000033280010000064
-:1041F0000000000800003330001000000000000242
-:1042000000003328001000000000001000003A7881
-:104210000000000000000008800000000000000016
-:10422000000000008000000000000000000000000E
-:1042300080000000000000000000000000003120AD
-:1042400000000000000000080000336000010004CE
-:1042500000000001000033680000000000000002C0
-:1042600000003370000000000000000800003374FC
-:10427000000000000000000200003A700000000092
-:104280000000000800003A4000080000000000089C
-:1042900000003D88004000000000004000003A504F
-:1042A000000800000000000800003A60000800005C
-:1042B0000000000800003A8800C8000000000098D4
-:1042C00000003C18009800000000002800003C5846
-:1042D00000980000000000280000337803600030E0
-:1042E0000000036000003EB0000800000000000174
-:1042F00000003EB10008000000000001000020089E
-:10430000001000000000001000002000000000006D
-:104310000000000880000000000000000000000015
-:10432000800000000000000000000000000000000D
-:10433000000000000000000000000000000000007D
-:10434000000000000000000000000000000000006D
-:10435000800000000000000000000000800000005D
-:1043600000000000000000008000000000000000CD
-:1043700000000000800000000000000000000000BD
-:10438000800000000000000000000000800000002D
-:10439000000000000000000080000000000000009D
-:1043A000000000008000000000000000000000008D
-:1043B00080000000000000000000000080000000FD
-:1043C000000000000000000080000000000000006D
-:1043D000000000008000000000000000000000005D
-:1043E000800000000000000000000000000000004D
-:1043F00000000000000000000000000000000000BD
-:1044000000000000000000000000000000000000AC
-:10441000000000000000000000000000000000009C
-:10442000000000000000000080000000000000000C
-:1044300000000000800000000000000000000000FC
-:1044400080000000000000000000000000000000EC
-:1044500000000000000000008000000000000000DC
-:1044600000000000800000000000000000000000CC
-:1044700080000000000000000000000000000000BC
-:10448000000000000000000000000000000000002C
-:10449000000000000000000000000000000000001C
-:1044A000000000000000000000000000000000000C
-:1044B00000000000000000000000000000000000FC
-:1044C00000000000000012C8008000000000008012
-:1044D000000000010000000000000000000040009B
-:1044E0000490000000000490000019C800000000C3
-:1044F0000000000800004948000800000000000813
-:1045000000004928000800000000000800004938A9
-:104510000008000000000008000020080010000053
-:104520000000001000002000000000000000000853
-:104530000000401004900040000000400000499836
-:104540000008000000000001000049990008000078
-:1045500000000001800000000000000000000000DA
-:10456000800000000000000000000000800000004B
-:1045700000000000000000008000000000000000BB
-:1045800000000000800000000000000000000000AB
-:10459000800000000000000000000000800000001B
-:1045A000000000000000000080000000000000008B
-:1045B000000000008000000000000000000000007B
-:1045C00080000000000000000000000080000000EB
-:1045D000000000000000000080000000000000005B
-:1045E000000000008000000000000000000000004B
-:1045F00000000000000000000000000000000000BB
-:1046000000000000000000000000000000000000AA
-:10461000000000000000000000000000000000009A
-:10462000000000000000000000000000800000000A
-:1046300000000000000000008000000000000000FA
-:10464000000000000000000000000000000000006A
-:10465000800000000000000000000000800000005A
-:1046600000000000000000008000000000000000CA
-:1046700000000000800000000000000000000000BA
-:104680000000400000180000000000180000430077
-:104690000040000000000040000043000040000215
-:1046A0000000000100004301004000020000000083
-:1046B00000003000004000000000004080000000CA
-:1046C0000000000000000000000030000008004072
-:1046D0000000000400003004000800400000000456
-:1046E00000004B00002800000000002800004B5094
-:1046F00000100000000000100000380000800000E2
-:104700000000008000003800000800800000000267
-:1047100000003900002000000000002000002008F8
-:104720000010000000000010000020000000000049
-:104730000000000800005108000800000000000808
-:104740000000512000080000000000080000513067
-:104750000008000000000008000051C00008000030
-:1047600000000001000051C100080000000000012D
-:10477000000039400010000400000004000051D087
-:104780000030001800000010000051D80030001860
-:104790000000000280000000000000000000000097
-:1047A0008000000000000000000000008000000009
-:1047B0000000000000000000800000000000000079
-:1047C0000000000080000000000000000000000069
-:1047D00080000000000000000000000080000000D9
-:1047E0000000000000000000800000000000000049
-:1047F0000000000080000000000000000000000039
-:1048000000000000000000000000000000000000A8
-:104810000000000000000000000000000000000098
-:104820000000000000000000000000000000000088
-:104830008000000000000000000000008000000078
-:104840000000000000000000000000000000000068
-:1048500000000000000023E800800000000000804D
-:10486000000000010000000000000000000020081F
-:1048700000100000000000100000200000000000F8
-:104880000000000800002DA0000800000000000843
-:1048900000002DB80008000000000008000024E817
-:1048A00002D00028000002D000002E5800080000AE
-:1048B0000000000100002E59000800000000000167
-:1048C00000002D900008000000000008800000009B
-:1048D0000000000000000000800000000000000058
-:1048E0000000000080000000000000000000000048
-:1048F00080000000000000000000000080000000B8
-:104900000000000000000000800000000000000027
-:104910000000000080000000000000000000000017
-:104920000000000000000000000000000000000087
-:104930000000000000000000000000000000000077
-:104940000000000000000000000000000000000067
-:104950008000000000000000000000008000000057
-:104960000000000000000000000000000000000047
-:1049700000000000800000000000000000000000B7
-:104980008000000000000000000000008000000027
-:104990000000000000000000800000000000000097
-:1049A000000000000000250000400000000000089A
-:1049B000000025080040000000000028000009C099
-:1049C000012000100000000880000000000000002E
-:1049D0000000000080000000000000000000000057
-:1049E0000000402002D00028000000080000300035
-:1049F00000000000000010000000509900000000BE
-:104A000000000001000050B00000000000000002A3
-:104A1000000045A000900008000000088000000091
-:104A200000000000000000000000296000080000F5
-:104A300000000001000029610008000000000001E2
-:104A4000000029700008000400000002000029781E
-:104A5000000800040000000400002FB0000800005F
-:104A60000000000400002FB4000800000000000453
-:104A700000002FC0000000000000000800002FC848
-:104A800000000000000000080000300000000000EE
-:104A90000000001000005040000100010000000173
-:104AA0000000500000000000000000200000080886
-:104AB00000100000000000040000080C00100000BE
-:104AC00000000001000008B7000000000000000125
-:104AD000000008B600000000000000010000100007
-:104AE000003000180000000400001004003000181E
-:104AF0000000000400001008003000180000000250
-:104B00000000100A00300018000000020000100C25
-:104B100000300018000000010000100D00300018E7
-:104B2000000000010000100E00300018000000011D
-:104B300000001010003000180000000400001014E5
-:104B40000030001800000004000030000100008068
-:104B50000008000400003004010000800008000488
-:104B60000000000A000000000000000000003068A3
-:104B70000100008000000001000030690100008099
-:104B8000000000010000306C010000800000000205
-:104B90000000306E01000080000000020000307054
-:104BA000010000800000000400003074010000805B
-:104BB00000000004000030660100008000000002D8
-:104BC000000030640100008000000001000030603F
-:104BD000010000800000000200003062010000803F
-:104BE00000000002000030500100008000000004BE
-:104BF0000000305401000080000000040000305824
-:104C000001000080000000040000305C0100008012
-:104C1000000000040000307C010000800000000162
-:104C20000000307D010000800000000100001C1821
-:104C3000001000000000000400001C300010000004
-:104C40000000000400001C380010000000000004F8
-:104C50008000000000000000000000008000000054
-:104C600000000000000000008000000000000000C4
-:104C700000000000800000000000000000000000B4
-:104C800000004C10000800000000000200004C1260
-:104C9000000800000000000200004C1400080000A2
-:104CA0000000000400004C20000800000000000884
-:104CB00000004C30004000080000000800004C00DC
-:104CC000000800000000000200004C020008000084
-:104CD0000000000100004C04000800000000000279
-:104CE00000004CD0000800000000000800004CE06C
-:104CF000000800000000000400004CE40008000070
-:104D00000000000100004CF000080000000000025C
-:104D100000004CF4000800000000000200004D00FC
-:104D20000008000000000004000050000010000017
-:104D30000000000400005004001000000000000407
-:104D400000005008001000000000000400001400E3
-:104D5000000800000000000200001402000800002B
-:104D60000000000100001404000800000000000220
-:104D700000001410000800000000000200001414DD
-:104D800000080000000000020000141600080000E7
-:104D900000000002000019B8000800000000000830
-:104DA000000014200008000000000002000014248D
-:104DB0000008000000000002000019C80008000000
-:104DC0000000000800002C10000800000000000196
-:104DD00000002C11000800000000000100002C124F
-:104DE000000800000000000100002C130008000073
-:104DF0000000000100002C0000080000000000027C
-:104E000000002C02000800000000000100002C043B
-:104E1000000800000000000200002C300008000024
-:104E20000000000200002C32000800000000000218
-:104E300000002C34000800000000000200002C20BC
-:104E4000000800000000000100002C210008000004
-:104E50000000000100002C220008000000000001FA
-:104E600000002C23000800000000000100002C249A
-:104E7000000800000000000100002C2500080000D0
-:104E80000000000100002C260008000000000001C6
-:104E900000001400000800000000000200001402DE
-:104EA00000080000000000010000140400080000D9
-:104EB000000000020000141200C0001800000002F0
-:104EC0000000141000C00018000000020000141CB4
-:104ED00000C00018000000080000141400C00018F2
-:104EE000000000080000142700C0001800000001A6
-:104EF0000000142400C00018000000020000142666
-:104F000000C000180000000100001590000800001B
-:104F100000000008000015A00008000000000008C4
-:104F2000000015B00008000000000008800000002C
-:104F300000000000000000008000000000000000F1
-:104F400000000000800000000000000000000000E1
-:104F50008000000000000000000000008000000051
-:104F600000000000000000008000000000000000C1
-:104F700000000000800000000000000000000000B1
-:104F80008000000000000000000000008000000021
-:104F90000000000000000000800000000000000091
-:104FA0000000000080000000000000000000000081
-:104FB00080000000000000000000000080000000F1
-:104FC0000000000000000000800000000000000061
-:104FD0000000000080000000000000000000000051
-:104FE00080000000000000000000000080000000C1
-:104FF0000000000000000000800000000000000031
-:105000000000000080000000000000000000000020
-:105010008000000000000000000000008000000090
-:105020000000000000000000800000000000000000
-:1050300000000000800000000000000000000000F0
-:105040008000000000000000000000008000000060
-:1050500000000000000000008000000000000000D0
-:105060000000000000000000000000000000000040
-:1050700080000000000000000000000000000000B0
-:08508000060209000000000017
-:00000001FF
diff --git a/firmware/bnx2x/bnx2x-e1h-6.2.9.0.fw.ihex b/firmware/bnx2x/bnx2x-e1h-6.2.9.0.fw.ihex
deleted file mode 100644
index ba1ce53df1d8..000000000000
--- a/firmware/bnx2x/bnx2x-e1h-6.2.9.0.fw.ihex
+++ /dev/null
@@ -1,13192 +0,0 @@
-:1000000000004F48000000680000070C00004FB8D7
-:1000100000001ED4000056C800000094000075A027
-:1000200000009F4C00007638000000CC00011588CD
-:100030000000DC5800011658000000940001F2B8DE
-:100040000000400C0001F350000000A400023360E7
-:100050000000F4240002340800000FFC00032830E4
-:100060000000000400033830020400480000000FC4
-:1000700002040054000000450204005C0000000679
-:100080000204007000000004020400780000000078
-:100090000204007C121700000204008022170000F6
-:1000A00002040084321700000604008800000005E6
-:1000B0000204009C12150000020400A0221500009A
-:1000C000020400A432150000060400A80000000489
-:1000D000020400B802100000020400BC001000007E
-:1000E000020400C010100000020400C42010000030
-:1000F000020400C830100000020400CC40100000D0
-:10010000060400D000000003020400DC0010000020
-:10011000020400E012140000020400E422140000B3
-:10012000020400E832140000020400EC4214000053
-:10013000060400F000000003010401240000000098
-:1001400001040128000000000104012C000000004F
-:100150000104013000000000020401D00000890603
-:1001600002040004000000FF02040008000000FF79
-:100170000204000C000000FF02040010000000FF59
-:10018000020400140000007F02040018000000FFB9
-:100190000204001C000000FF02040020000000FF19
-:1001A000020400240000003E0204002800000000B9
-:1001B0000204002C0000003F020400300000003F59
-:1001C000020400340000003F020400380000003F39
-:1001D0000204003C0000003F020400400000003F19
-:1001E000020400440000003F020404CC00000001AF
-:1001F00002042008000002110204200C000002008A
-:10020000020420100000020402042014000002195D
-:100210000204201C0000FFFF020420200000FFFF5A
-:10022000020420240000FFFF020420280000FFFF3A
-:1002300002042038000000200604203C0000001FBB
-:10024000020420B800000001060420BC0000005F8A
-:100250000204223807FFFFFF0204223C0000003F97
-:100260000204224007FFFFFF020422440000000FA7
-:1002700001042248000000000104224C000000009C
-:10028000010422500000000001042254000000007C
-:1002900001042258000000000104225C000000005C
-:1002A000010422600000000001042264000000003C
-:1002B00001042268000000000104226C000000001C
-:1002C00001042270000000000104227400000000FC
-:1002D00001042278000000000104227C00000000DC
-:1002E0000C042000000003E80A04200000000001C4
-:1002F0000B0420000000000A0605400000000D006D
-:100300000205004400000020020500480000003201
-:10031000020500900215002002050094021500203D
-:1003200002050098000000300205009C0810000043
-:10033000020500A000000033020500A40000003008
-:10034000020500A800000031020500AC0000000218
-:10035000020500B000000005020500B40000000620
-:10036000020500B800000002020500BC0000000207
-:10037000020500C000000000020500C400000005E6
-:10038000020500C800000002020500CC00000002C7
-:10039000020500D000000002020500D400000001A8
-:1003A00002050114000000010205011C000000010B
-:1003B0000205012000000002020502040000000105
-:1003C0000205020C0000004002050210000000407F
-:1003D0000205021C0000002002050220000000139C
-:1003E0000205022400000020060502400000000A69
-:1003F00004050280002000000205005000000007F4
-:10040000020500540000000702050058000000002B
-:100410000205005C00000008020500600000000109
-:100420000605006400000003020500D80000000675
-:1004300002050004000000010205000800000001A0
-:100440000205000C00000001020500100000000180
-:100450000205001400000001020500180000000160
-:100460000205001C00000001020500200000000140
-:100470000205002400000001020500280000000120
-:100480000205002C00000001020500300000000100
-:1004900002050034000000010205003800000001E0
-:1004A0000205003C000000010205004000000001C0
-:1004B000020500E00000000D020500E80000000059
-:1004C000020500F000000000020500F80000000036
-:1004D000020500E40000002D020500EC00000020F1
-:1004E000020500F400000020020500FC00000020CE
-:1004F000020500E00000001D020500E800000010F9
-:10050000020500F000000010020500F800000010D5
-:10051000020500E40000003D020500EC0000003090
-:10052000020500F400000030020500FC000000306D
-:10053000020500E00000004D020500E80000004058
-:10054000020500F000000040020500F80000004035
-:10055000020500E40000006D020500EC00000060F0
-:10056000020500F400000060020500FC00000060CD
-:10057000020500E00000005D020500E800000050F8
-:10058000020500F000000050020500F800000050D5
-:10059000020500E40000007D020500EC0000007090
-:1005A000020500F400000070020500FC000000706D
-:1005B0000406100002000020020600DC000000011A
-:1005C000010600D80000000004060200000302201B
-:1005D000020600DC00000000010600B80000000078
-:1005E000010600C8000000000206016C00000000C7
-:1005F000010600BC00000000010600CC0000000065
-:1006000002060170000000000718040000910000BD
-:10061000081807D800050223071C00002BF700006C
-:10062000071C80002DD10AFE071D00002F461673FF
-:10063000071D800016342245081DB13049DA022515
-:100640000118000000000000011800040000000074
-:1006500001180008000000000118000C0000000054
-:100660000118001000000000011800140000000034
-:1006700002180020000000010218002400000002FF
-:1006800002180028000000030218002C00000000DF
-:1006900002180030000000040218003400000001BD
-:1006A00002180038000000000218003C00000001A1
-:1006B000021800400000000402180044000000007E
-:1006C00002180048000000010218004C000000035E
-:1006D0000218005000000000021800540000000141
-:1006E00002180058000000040218005C000000001E
-:1006F00002180060000000010218006400000003FE
-:1007000002180068000000000218006C00000001E0
-:1007100002180070000000040218007400000000BD
-:1007200002180078000000040218007C000000039A
-:100730000618008000000002021800A400003FFF1D
-:10074000021800A8000003FF0218022400000000A5
-:1007500002180234000000000218024C00000000E1
-:10076000021802E4000000FF061810000000040058
-:10077000021B8BC000000001021B8000000000343F
-:10078000021B804000000018021B80800000000C4B
-:10079000021B80C0000000200C1B83000007A1206A
-:1007A0000A1B8300000001380B1B83000000138824
-:1007B0000A1B8340000000000C1B8340000001F472
-:1007C0000B1B834000000005021B83800007A12053
-:1007D000021B83C0000001F4021B14800000000112
-:1007E0000A1B148000000000061A1000000003B36A
-:1007F000041A1ECC00010227061A1ED000000008B1
-:10080000061A2008000000C8061A20000000000296
-:10081000041AAF4000100228061A3718000000041E
-:10082000061A371000000002061A500000000002ED
-:10083000061A500800000004061A501800000004B0
-:10084000061A502800000004061A50380000000460
-:10085000061A504800000004061A50580000000410
-:10086000061A506800000004061A507800000002C2
-:10087000041A52C000020238061A40500000000656
-:10088000041A40680002023A041A40400004023C84
-:10089000041A800000010240061A800400000003D0
-:1008A000041A801000010241061A8014000000039F
-:1008B000041A802000010242061A8024000000036E
-:1008C000041A803000010243061A8034000000033D
-:1008D000041A804000010244061A8044000000030C
-:1008E000041A805000010245061A805400000003DB
-:1008F000041A806000010246061A806400000003AA
-:10090000041A807000010247061A80740000000378
-:10091000041A808000010248061A80840000000347
-:10092000041A809000010249061A80940000000316
-:10093000041A80A00001024A061A80A400000003E5
-:10094000041A80B00001024B061A80B400000003B4
-:10095000041A80C00001024C061A80C40000000383
-:10096000041A80D00001024D061A80D40000000352
-:10097000041A80E00001024E061A80E40000000321
-:10098000041A80F00001024F061A80F400000003F0
-:10099000041A810000010250061A810400000003BD
-:1009A000041A811000010251061A8114000000038C
-:1009B000041A812000010252061A8124000000035B
-:1009C000041A813000010253061A8134000000032A
-:1009D000041A814000010254061A814400000003F9
-:1009E000041A815000010255061A815400000003C8
-:1009F000041A816000010256061A81640000000397
-:100A0000041A817000010257061A81740000000365
-:100A1000041A818000010258061A81840000000334
-:100A2000041A819000010259061A81940000000303
-:100A3000041A81A00001025A061A81A400000003D2
-:100A4000041A81B00001025B061A81B400000003A1
-:100A5000041A81C00001025C061A81C40000000370
-:100A6000041A81D00001025D061A81D4000000033F
-:100A7000041A81E00001025E061A81E4000000030E
-:100A8000041A81F00001025F061A81F400000003DD
-:100A9000041A820000010260061A820400000003AA
-:100AA000041A821000010261061A82140000000379
-:100AB000041A822000010262061A82240000000348
-:100AC000041A823000010263061A82340000000317
-:100AD000041A824000010264061A824400000003E6
-:100AE000041A825000010265061A825400000003B5
-:100AF000041A826000010266061A82640000000384
-:100B0000041A827000010267061A82740000000352
-:100B1000041A828000010268061A82840000000321
-:100B2000041A829000010269061A829400000003F0
-:100B3000041A82A00001026A061A82A400000003BF
-:100B4000041A82B00001026B061A82B4000000038E
-:100B5000041A82C00001026C061A82C4000000035D
-:100B6000041A82D00001026D061A82D4000000032C
-:100B7000041A82E00001026E061A82E400000003FB
-:100B8000041A82F00001026F061A82F400000003CA
-:100B9000041A830000010270061A83040000000397
-:100BA000041A831000010271061A83140000000366
-:100BB000041A832000010272061A83240000000335
-:100BC000041A833000010273061A83340000000304
-:100BD000041A834000010274061A834400000003D3
-:100BE000041A835000010275061A835400000003A2
-:100BF000041A836000010276061A83640000000371
-:100C0000041A837000010277061A8374000000033F
-:100C1000041A838000010278061A8384000000030E
-:100C2000041A839000010279061A839400000003DD
-:100C3000041A83A00001027A061A83A400000003AC
-:100C4000041A83B00001027B061A83B4000000037B
-:100C5000041A83C00001027C061A83C4000000034A
-:100C6000041A83D00001027D061A83D40000000319
-:100C7000041A83E00001027E061A83E400000003E8
-:100C8000041A83F00001027F061A83F400000003B7
-:100C9000041A840000010280061A84040000000384
-:100CA000041A841000010281061A84140000000353
-:100CB000041A842000010282061A84240000000322
-:100CC000041A843000010283061A843400000003F1
-:100CD000041A844000010284061A844400000003C0
-:100CE000041A845000010285061A8454000000038F
-:100CF000041A846000010286061A8464000000035E
-:100D0000041A847000010287061A8474000000032C
-:100D1000041A848000010288061A848400000003FB
-:100D2000041A849000010289061A849400000003CA
-:100D3000041A84A00001028A061A84A40000000399
-:100D4000041A84B00001028B061A84B40000000368
-:100D5000041A84C00001028C061A84C40000000337
-:100D6000041A84D00001028D061A84D40000000306
-:100D7000041A84E00001028E061A84E400000003D5
-:100D8000041A84F00001028F061A84F400000003A4
-:100D9000041A850000010290061A85040000000371
-:100DA000041A851000010291061A85140000000340
-:100DB000041A852000010292061A8524000000030F
-:100DC000041A853000010293061A853400000003DE
-:100DD000041A854000010294061A854400000003AD
-:100DE000041A855000010295061A8554000000037C
-:100DF000041A856000010296061A8564000000034B
-:100E0000041A857000010297061A85740000000319
-:100E1000041A858000010298061A858400000003E8
-:100E2000041A859000010299061A859400000003B7
-:100E3000041A85A00001029A061A85A40000000386
-:100E4000041A85B00001029B061A85B40000000355
-:100E5000041A85C00001029C061A85C40000000324
-:100E6000041A85D00001029D061A85D400000003F3
-:100E7000041A85E00001029E061A85E400000003C2
-:100E8000041A85F00001029F061A85F40000000391
-:100E9000041A8600000102A0061A8604000000035E
-:100EA000041A8610000102A1061A8614000000032D
-:100EB000041A8620000102A2061A862400000003FC
-:100EC000041A8630000102A3061A863400000003CB
-:100ED000041A8640000102A4061A8644000000039A
-:100EE000041A8650000102A5061A86540000000369
-:100EF000041A8660000102A6061A86640000000338
-:100F0000041A8670000102A7061A86740000000306
-:100F1000041A8680000102A8061A868400000003D5
-:100F2000041A8690000102A9061A869400000003A4
-:100F3000041A86A0000102AA061A86A40000000373
-:100F4000041A86B0000102AB061A86B40000000342
-:100F5000041A86C0000102AC061A86C40000000311
-:100F6000041A86D0000102AD061A86D400000003E0
-:100F7000041A86E0000102AE061A86E400000003AF
-:100F8000041A86F0000102AF061A86F4000000037E
-:100F9000041A8700000102B0061A8704000000034B
-:100FA000041A8710000102B1061A8714000000031A
-:100FB000041A8720000102B2061A872400000003E9
-:100FC000041A8730000102B3061A873400000003B8
-:100FD000041A8740000102B4061A87440000000387
-:100FE000041A8750000102B5061A87540000000356
-:100FF000041A8760000102B6061A87640000000325
-:10100000041A8770000102B7061A877400000003F3
-:10101000041A8780000102B8061A878400000003C2
-:10102000041A8790000102B9061A87940000000391
-:10103000041A87A0000102BA061A87A40000000360
-:10104000041A87B0000102BB061A87B4000000032F
-:10105000041A87C0000102BC061A87C400000003FE
-:10106000041A87D0000102BD061A87D400000003CD
-:10107000041A87E0000102BE061A87E4000000039C
-:10108000041A87F0000102BF061A87F4000000036B
-:10109000041A8800000102C0061A88040000000338
-:1010A000041A8810000102C1061A88140000000307
-:1010B000041A8820000102C2061A882400000003D6
-:1010C000041A8830000102C3061A883400000003A5
-:1010D000041A8840000102C4061A88440000000374
-:1010E000041A8850000102C5061A88540000000343
-:1010F000041A8860000102C6061A88640000000312
-:10110000041A8870000102C7061A887400000003E0
-:10111000041A8880000102C8061A888400000003AF
-:10112000041A8890000102C9061A8894000000037E
-:10113000041A88A0000102CA061A88A4000000034D
-:10114000041A88B0000102CB061A88B4000000031C
-:10115000041A88C0000102CC061A88C400000003EB
-:10116000041A88D0000102CD061A88D400000003BA
-:10117000041A88E0000102CE061A88E40000000389
-:10118000041A88F0000102CF061A88F40000000358
-:10119000041A8900000102D0061A89040000000325
-:1011A000041A8910000102D1061A891400000003F4
-:1011B000041A8920000102D2061A892400000003C3
-:1011C000041A8930000102D3061A89340000000392
-:1011D000041A8940000102D4061A89440000000361
-:1011E000041A8950000102D5061A89540000000330
-:1011F000041A8960000102D6061A896400000003FF
-:10120000041A8970000102D7061A897400000003CD
-:10121000041A8980000102D8061A8984000000039C
-:10122000041A8990000102D9061A8994000000036B
-:10123000041A89A0000102DA061A89A4000000033A
-:10124000041A89B0000102DB061A89B40000000309
-:10125000041A89C0000102DC061A89C400000003D8
-:10126000041A89D0000102DD061A89D400000003A7
-:10127000041A89E0000102DE061A89E40000000376
-:10128000041A89F0000102DF061A89F40000000345
-:10129000041A8A00000102E0061A8A040000000312
-:1012A000041A8A10000102E1061A8A1400000003E1
-:1012B000041A8A20000102E2061A8A2400000003B0
-:1012C000041A8A30000102E3061A8A34000000037F
-:1012D000041A8A40000102E4061A8A44000000034E
-:1012E000041A8A50000102E5061A8A54000000031D
-:1012F000041A8A60000102E6061A8A6400000003EC
-:10130000041A8A70000102E7061A8A7400000003BA
-:10131000041A8A80000102E8061A8A840000000389
-:10132000041A8A90000102E9061A8A940000000358
-:10133000041A8AA0000102EA061A8AA40000000327
-:10134000041A8AB0000102EB061A8AB400000003F6
-:10135000041A8AC0000102EC061A8AC400000003C5
-:10136000041A8AD0000102ED061A8AD40000000394
-:10137000041A8AE0000102EE061A8AE40000000363
-:10138000041A8AF0000102EF061A8AF40000000332
-:10139000041A8B00000102F0061A8B0400000003FF
-:1013A000041A8B10000102F1061A8B1400000003CE
-:1013B000041A8B20000102F2061A8B24000000039D
-:1013C000041A8B30000102F3061A8B34000000036C
-:1013D000041A8B40000102F4061A8B44000000033B
-:1013E000041A8B50000102F5061A8B54000000030A
-:1013F000041A8B60000102F6061A8B6400000003D9
-:10140000041A8B70000102F7061A8B7400000003A7
-:10141000041A8B80000102F8061A8B840000000376
-:10142000041A8B90000102F9061A8B940000000345
-:10143000041A8BA0000102FA061A8BA40000000314
-:10144000041A8BB0000102FB061A8BB400000003E3
-:10145000041A8BC0000102FC061A8BC400000003B2
-:10146000041A8BD0000102FD061A8BD40000000381
-:10147000041A8BE0000102FE061A8BE40000000350
-:10148000041A8BF0000102FF061A8BF4000000031F
-:10149000041A8C0000010300061A8C0400000003EB
-:1014A000041A8C1000010301061A8C1400000003BA
-:1014B000041A8C2000010302061A8C240000000389
-:1014C000041A8C3000010303061A8C340000000358
-:1014D000041A8C4000010304061A8C440000000327
-:1014E000041A8C5000010305061A8C5400000003F6
-:1014F000041A8C6000010306061A8C6400000003C5
-:10150000041A8C7000010307061A8C740000000393
-:10151000041A8C8000010308061A8C840000000362
-:10152000041A8C9000010309061A8C940000000331
-:10153000041A8CA00001030A061A8CA40000000300
-:10154000041A8CB00001030B061A8CB400000003CF
-:10155000041A8CC00001030C061A8CC4000000039E
-:10156000041A8CD00001030D061A8CD4000000036D
-:10157000041A8CE00001030E061A8CE4000000033C
-:10158000041A8CF00001030F061A8CF4000000030B
-:10159000041A8D0000010310061A8D0400000003D8
-:1015A000041A8D1000010311061A8D1400000003A7
-:1015B000041A8D2000010312061A8D240000000376
-:1015C000041A8D3000010313061A8D340000000345
-:1015D000041A8D4000010314061A8D440000000314
-:1015E000041A8D5000010315061A8D5400000003E3
-:1015F000041A8D6000010316061A8D6400000003B2
-:10160000041A8D7000010317061A8D740000000380
-:10161000041A8D8000010318061A8D84000000034F
-:10162000041A8D9000010319061A8D94000000031E
-:10163000041A8DA00001031A061A8DA400000003ED
-:10164000041A8DB00001031B061A8DB400000003BC
-:10165000041A8DC00001031C061A8DC4000000038B
-:10166000041A8DD00001031D061A8DD4000000035A
-:10167000041A8DE00001031E061A8DE40000000329
-:10168000041A8DF00001031F061A8DF400000003F8
-:10169000041A8E0000010320061A8E0400000003C5
-:1016A000041A8E1000010321061A8E140000000394
-:1016B000041A8E2000010322061A8E240000000363
-:1016C000041A8E3000010323061A8E340000000332
-:1016D000041A8E4000010324061A8E440000000301
-:1016E000041A8E5000010325061A8E5400000003D0
-:1016F000041A8E6000010326061A8E64000000039F
-:10170000041A8E7000010327061A8E74000000036D
-:10171000041A8E8000010328061A8E84000000033C
-:10172000041A8E9000010329061A8E94000000030B
-:10173000041A8EA00001032A061A8EA400000003DA
-:10174000041A8EB00001032B061A8EB400000003A9
-:10175000041A8EC00001032C061A8EC40000000378
-:10176000041A8ED00001032D061A8ED40000000347
-:10177000041A8EE00001032E061A8EE40000000316
-:10178000041A8EF00001032F061A8EF400000003E5
-:10179000041A8F0000010330061A8F0400000003B2
-:1017A000041A8F1000010331061A8F140000000381
-:1017B000041A8F2000010332061A8F240000000350
-:1017C000041A8F3000010333061A8F34000000031F
-:1017D000041A8F4000010334061A8F4400000003EE
-:1017E000041A8F5000010335061A8F5400000003BD
-:1017F000041A8F6000010336061A8F64000000038C
-:10180000041A8F7000010337061A8F74000000035A
-:10181000041A8F8000010338061A8F840000000329
-:10182000041A8F9000010339061A8F9400000003F8
-:10183000041A8FA00001033A061A8FA400000003C7
-:10184000041A8FB00001033B061A8FB40000000396
-:10185000041A8FC00001033C061A8FC40000000365
-:10186000041A8FD00001033D061A8FD40000000334
-:10187000041A8FE00001033E061A8FE400000007FF
-:10188000041A62C00020033F061AD0000000007254
-:10189000061AD24800000010061AD6B00000002038
-:1018A000061AD47000000090061AD46800000002E6
-:1018B000061AA000000001C4061A30000000001043
-:1018C000061A308000000010061A310000000010D7
-:1018D000061A318000000010061A330000000012C2
-:1018E000061A339000000070061AD4580000000257
-:1018F000061AD34800000002061AD3580000002040
-:10190000061AA710000001C4061A3040000000109B
-:10191000061A30C000000010061A31400000001006
-:10192000061A31C000000010061A334800000012E9
-:10193000061A355000000070061AD460000000023C
-:10194000061AD35000000002061AD3D80000002067
-:10195000021AAE2000000000061A5000000000022B
-:10196000061A508000000012041A40000002035FB3
-:10197000041A63C000020361061A7000000000042C
-:10198000061A320000000008021AAE24000000000F
-:10199000061A501000000002061A50C8000000127B
-:1019A000041A400800020363041A63C800020365B6
-:1019B000061A701000000004061A32200000000809
-:1019C000021AAE2800000000061A50200000000293
-:1019D000061A511000000012041A4010000203679A
-:1019E000041A63D000020369061A70200000000484
-:1019F000061A324000000008021AAE2C0000000057
-:101A0000061A503000000002061A51580000001259
-:101A1000041A40180002036B041A63D80002036D15
-:101A2000061A703000000004061A32600000000838
-:101A3000021AAE3000000000061A504000000002FA
-:101A4000061A51A000000012041A40200002036F81
-:101A5000041A63E000020371061A704000000004DB
-:101A6000061A328000000008021AAE34000000009E
-:101A7000061A505000000002061A51E80000001239
-:101A8000041A402800020373041A63E80002037575
-:101A9000061A705000000004061A32A00000000868
-:101AA000021AAE3800000000061A50600000000262
-:101AB000061A523000000012041A40300002037768
-:101AC000041A63F000020379061A70600000000433
-:101AD000061A32C000000008021AAE3C00000000E6
-:101AE000061A507000000002061A52780000001218
-:101AF000041A40380002037B041A63F80002037DD5
-:101B0000061A707000000004061A32E00000000897
-:101B10000200A468000B01C80200A294071D29114D
-:101B20000200A298000000000200A29C009C042475
-:101B30000200A2A0000000000200A2A4000002090E
-:101B40000200A270000000000200A2740000000069
-:101B50000200A270000000000200A2740000000059
-:101B60000200A270000000000200A2740000000049
-:101B70000200A270000000000200A2740000000039
-:101B8000020160A000000001020160A400000262E6
-:101B9000020160A800000002020160AC0000001811
-:101BA0000201620400000001020100B40000000113
-:101BB000020100B800000001020100DC0000000189
-:101BC0000201010000000001020101040000000107
-:101BD0000201007C003000000201008400000028A7
-:101BE0000201008C0000000002010130000000042E
-:101BF0000201025C00000001020103280000000055
-:101C0000020160580000FFFF020160700000000741
-:101C10000201608000000001020105540000003054
-:101C2000020100C400000001020100CC000000011C
-:101C3000020100F800000001020100F000000001B4
-:101C4000020100800030000002010088000000282E
-:101C500002010090000000000201013400000004B5
-:101C6000020102DC000000010201032C0000000060
-:101C70000201605C0000FFFF0201607400000007C9
-:101C800002016084000000010201056400000030D0
-:101C9000020100C800000001020100D000000001A4
-:101CA000020100FC00000001020100F4000000013C
-:101CB000020C100000000028020C20080000021195
-:101CC000020C200C00000200020C20100000020494
-:101CD000020C201C0000FFFF020C20200000FFFF70
-:101CE000020C20240000FFFF020C20280000FFFF50
-:101CF000020C203800000020020C203C00000021D3
-:101D0000020C204000000022020C204400000023AE
-:101D1000020C204800000024020C204C000000258A
-:101D2000020C205000000026020C20540000002766
-:101D3000020C205800000028020C205C0000002942
-:101D4000020C20600000002A020C20640000002B1E
-:101D5000020C20680000002C020C206C0000002DFA
-:101D6000020C20700000002E020C20740000002FD6
-:101D7000020C207800000010060C207C00000007F8
-:101D8000020C209800000011020C209C00000012A0
-:101D9000020C20A000000013060C20A40000001D6F
-:101DA000020C211800000001020C211C000000019F
-:101DB000020C212000000001060C21240000001D5F
-:101DC000020C219800000001060C219C0000000775
-:101DD000020C21B800000001020C21BC000000012F
-:101DE000020C21C000000001020C21C4000000010F
-:101DF000020C21C800000001020C21CC00000001EF
-:101E0000020C21D000000001020C21D400000001CE
-:101E1000020C21D800000001020C21DC00000001AE
-:101E2000020C21E000000001020C21E4000000018E
-:101E3000020C21E800000001020C21EC000000016E
-:101E4000020C21F000000001020C21F4000000014E
-:101E5000020C21F800000001060C21FC0000000724
-:101E6000020C221800000001060C221C00000007D2
-:101E7000020C223807FFFFFF020C223C0000003F4B
-:101E8000020C224007FFFFFF020C22440000000F5B
-:101E9000010C224800000000010C224C0000000050
-:101EA000010C225000000000010C22540000000030
-:101EB000010C225800000000010C225C0000000010
-:101EC000010C226000000000010C226400000000F0
-:101ED000010C226800000000010C226C00000000D0
-:101EE000010C227000000000010C227400000000B0
-:101EF000010C227800000000010C227C0000000090
-:101F00000C0C2000000003E80A0C20000000000177
-:101F10000B0C20000000000A020C40080000101109
-:101F2000020C400C00001000020C401000001004D5
-:101F3000020C401400001021020C401C0000FFFFA6
-:101F4000020C40200000FFFF020C40240000FFFFB5
-:101F5000020C40280000FFFF020C40380000004641
-:101F6000020C403C00000010060C40400000000243
-:101F7000020C404800000018020C404C000000F029
-:101F8000060C40500000001F020C40CC0000000175
-:101F9000060C40D00000003A020C41B800000001DD
-:101FA000060C41BC00000003020C41C80000000107
-:101FB000020C41CC00000001060C41D00000001AC8
-:101FC000020C423807FFFFFF020C423C0000003FBA
-:101FD000020C424007FFFFFF020C42440000000FCA
-:101FE000010C424800000000010C424C00000000BF
-:101FF000010C425000000000010C4254000000009F
-:10200000010C425800000000010C425C000000007E
-:10201000010C426000000000010C4264000000005E
-:10202000010C426800000000010C426C000000003E
-:10203000010C427000000000010C4274000000001E
-:10204000010C427800000000010C427C00000000FE
-:10205000010C4280000000000C0C4000000003E86E
-:102060000A0C4000000000010B0C40000000000AB8
-:10207000060D400000000A00020D0044000000327E
-:10208000020D008C02150020020D009002150020A8
-:10209000020D009408100000020D009800000033AB
-:1020A000020D009C00000002020D00A000000000D4
-:1020B000020D00A400000005020D00A800000005AC
-:1020C000060D00AC00000002020D00B4000000028A
-:1020D000020D00B800000003020D00BC0000000269
-:1020E000020D00C000000001020D00C80000000247
-:1020F000020D00CC00000002020D015C0000000196
-:10210000020D016400000001020D016800000002E0
-:10211000020D020400000001020D020C000000206C
-:10212000020D021000000040020D021400000040E9
-:10213000020D022000000003020D0224000000181E
-:10214000060D028000000012040D03000018037F3A
-:10215000060D03600000000C020D004C00000001A1
-:10216000020D005000000002020D005400000000AB
-:10217000020D005800000008060D005C000000047D
-:10218000020D00C400000004020D00040000000164
-:10219000020D000800000001020D000C000000010B
-:1021A000020D001000000001020D001400000001EB
-:1021B000020D001800000001020D001C00000001CB
-:1021C000020D002000000001020D002400000001AB
-:1021D000020D002800000001020D002C000000018B
-:1021E000020D003000000001020D0034000000016B
-:1021F000020D003800000001020D003C000000014B
-:10220000020D011400000009020D011C0000000A6B
-:10221000020D012400000000020D012C000000004E
-:10222000020D013400000000020D013C0000000B13
-:10223000020D014400000000020D011800000029F9
-:10224000020D01200000002A020D012800000020DC
-:10225000020D013000000020020D013800000020B6
-:10226000020D01400000002B020D0148000000207B
-:10227000020D011400000019020D011C0000001ADB
-:10228000020D012400000010020D012C00000010BE
-:10229000020D013400000010020D013C0000001B83
-:1022A000020D014400000010020D01180000003969
-:1022B000020D01200000003A020D0128000000304C
-:1022C000020D013000000030020D01380000003026
-:1022D000020D01400000003B020D014800000030EB
-:1022E000020D011400000049020D011C0000004A0B
-:1022F000020D012400000040020D012C00000040EE
-:10230000020D013400000040020D013C0000004BB2
-:10231000020D014400000040020D01180000006998
-:10232000020D01200000006A020D0128000000607B
-:10233000020D013000000060020D01380000006055
-:10234000020D01400000006B020D0148000000601A
-:10235000020D011400000059020D011C0000005A7A
-:10236000020D012400000050020D012C000000505D
-:10237000020D013400000050020D013C0000005B22
-:10238000020D014400000050020D01180000007908
-:10239000020D01200000007A020D012800000070EB
-:1023A000020D013000000070020D013800000070C5
-:1023B000020D01400000007B020D0148000000708A
-:1023C000060E200000000800020E004C0000003243
-:1023D000020E009402150020020E00980215002043
-:1023E000020E009C00000030020E00A00810000049
-:1023F000020E00A400000033020E00A8000000300E
-:10240000020E00AC00000031020E00B0000000021D
-:10241000020E00B400000004020E00B8000000002C
-:10242000020E00BC00000002020E00C0000000020C
-:10243000020E00C400000000020E00C800000002EE
-:10244000020E00CC00000007020E00D000000002C7
-:10245000020E00D400000002020E00D800000001AD
-:10246000020E014400000001020E014C00000001B8
-:10247000020E015000000002020E020400000001E2
-:10248000020E020C00000040020E0210000000408C
-:10249000020E021C00000004020E022000000020B8
-:1024A000020E02240000000E020E02280000001B93
-:1024B000060E030000000012040E0280001B0397AA
-:1024C000060E02EC00000005020E00540000000C95
-:1024D000020E00580000000C020E005C000000001C
-:1024E000020E006000000010020E006400000010E8
-:1024F000060E006800000003020E00DC000000036E
-:10250000020E000400000001020E0008000000019D
-:10251000020E000C00000001020E0010000000017D
-:10252000020E001400000001020E0018000000015D
-:10253000020E001C00000001020E0020000000013D
-:10254000020E002400000001020E0028000000011D
-:10255000020E002C00000001020E003000000001FD
-:10256000020E003400000001020E003800000001DD
-:10257000020E003C00000001020E004000000001BD
-:10258000020E004400000001020E01100000000FC6
-:10259000020E011800000000020E012000000000E1
-:1025A000020E012800000000020E01140000002F9E
-:1025B000020E011C00000020020E01240000000099
-:1025C000020E012C00000000020E01100000001F8E
-:1025D000020E011800000010020E01200000000091
-:1025E000020E012800000000020E01140000003F4E
-:1025F000020E011C00000030020E01240000000049
-:10260000020E012C00000000020E01100000004F1D
-:10261000020E011800000040020E01200000000020
-:10262000020E012800000000020E01140000006FDD
-:10263000020E011C00000060020E012400000000D8
-:10264000020E012C00000000020E01100000005FCD
-:10265000020E011800000050020E012000000000D0
-:10266000020E012800000000020E01140000007F8D
-:10267000020E011C00000070020E01240000000088
-:10268000020E012C000000000730040000C9000009
-:10269000083007D8000503B207340000332B0000D0
-:1026A0000734800030A40CCB07350000351A18F52C
-:1026B000073580002A8A263C0736000018D830DF0C
-:1026C00008364630373A03B40130000000000000FD
-:1026D000013000040000000001300008000000008C
-:1026E0000130000C0000000001300010000000006C
-:1026F0000130001400000000023000200000000142
-:102700000230002400000002023000280000000314
-:102710000230002C000000000230003000000004F5
-:1027200002300034000000010230003800000000D8
-:102730000230003C000000010230004000000004B4
-:102740000230004400000000023000480000000198
-:102750000230004C00000003023000500000000076
-:102760000230005400000001023000580000000454
-:102770000230005C00000000023000600000000138
-:102780000230006400000003023000680000000016
-:102790000230006C000000010230007000000004F4
-:1027A00002300074000000000230007800000004D5
-:1027B0000230007C000000030630008000000002B0
-:1027C000023000A400003FFF023000A8000003FF19
-:1027D0000230022400000000023002340000000039
-:1027E0000230024C00000000023002E40000FFFF53
-:1027F000063020000000080002338BC000000001FA
-:10280000023380000000001A023380400000004EB6
-:102810000233808000000010023380C000000020DE
-:102820000C3383000007A1200A3383000000013825
-:102830000B338300000013880A338340000000003C
-:102840000C338340000001F40B338340000000058B
-:10285000023383800007A120023383C0000001F40B
-:1028600002331480000000010A33148000000000CD
-:10287000063280000000010206322008000000C875
-:10288000063220000000000204328EA0001003B6C1
-:1028900006323EB00000000606323ED800000002BC
-:1028A00006323E800000000A04323EA8000203C641
-:1028B00006323E00000000200632500000000400F6
-:1028C0000632400000000004043274C0000203C855
-:1028D00006324110000000020632D0000000003035
-:1028E0000632DD40000000440632DA00000000D06D
-:1028F0000632DEA0000000020632E0000000080000
-:1029000006328450000001180632100000000188D1
-:102910000632500000000020063251000000002066
-:102920000632520000000020063253000000002052
-:10293000063254000000002006325500000000203E
-:10294000063256000000002006325700000000202A
-:102950000632580000000020063259000000002016
-:1029600006325A000000002006325B000000002002
-:1029700006325C000000002006325D0000000020EE
-:1029800006325E000000002006325F0000000020DA
-:1029900006328DF00000000204328E00000203CAED
-:1029A00006328E08000000020632DE9000000002AF
-:1029B00006321C4000000038063288B000000118C2
-:1029C00006321620000001880632508000000020E8
-:1029D00006325180000000200632528000000020A4
-:1029E0000632538000000020063254800000002090
-:1029F000063255800000002006325680000000207C
-:102A00000632578000000020063258800000002067
-:102A1000063259800000002006325A800000002053
-:102A200006325B800000002006325C80000000203F
-:102A300006325D800000002006325E80000000202B
-:102A400006325F800000002006328DF80000000290
-:102A500004328E10000203CC06328E1800000002F1
-:102A60000632DE980000000206321D200000003809
-:102A700002328D50000000000632401000000002BB
-:102A800002328D5400000000063240200000000297
-:102A900002328D5800000000063240300000000273
-:102AA00002328D5C0000000006324040000000024F
-:102AB00002328D600000000006324050000000022B
-:102AC00002328D6400000000063240600000000207
-:102AD00002328D68000000000632407000000002E3
-:102AE00002328D6C000000000632408000000002BF
-:102AF000072004000091000008200780001003CE8A
-:102B0000072400002AFF00000724800015090AC0DE
-:102B10000824A9F0692803D001200000000000006B
-:102B20000120000400000000012000080000000057
-:102B30000120000C00000000012000100000000037
-:102B4000012000140000000002200020000000010D
-:102B500002200024000000020220002800000003E0
-:102B60000220002C000000000220003000000004C1
-:102B700002200034000000010220003800000000A4
-:102B80000220003C00000001022000400000000480
-:102B90000220004400000000022000480000000164
-:102BA0000220004C00000003022000500000000042
-:102BB0000220005400000001022000580000000420
-:102BC0000220005C00000000022000600000000104
-:102BD00002200064000000030220006800000000E2
-:102BE0000220006C000000010220007000000004C0
-:102BF00002200074000000000220007800000004A1
-:102C00000220007C0000000306200080000000027B
-:102C1000022000A400003FFF022000A8000003FFE4
-:102C20000220022400000000022002340000000004
-:102C30000220024C00000000022002E40000FFFF1E
-:102C4000062020000000080002238BC000000001C5
-:102C500002238000000000100223804000000012C8
-:102C60000223808000000030022380C00000000E9C
-:102C70000C2383000007A1200A23830000000138F1
-:102C80000B238300000013880A2383400000000008
-:102C90000C238340000001F40B2383400000000557
-:102CA000022383800007A120022383C0000001F4D7
-:102CB00002231480000000010A2314800000000099
-:102CC000062210000000004206222008000000C872
-:102CD00006222000000000020622B000000000C60C
-:102CE0000422B318000503D20622B32C0000000B07
-:102CF0000422B358000503D70622B36C0000000B72
-:102D00000422B398000503DC0622B3AC0000000BDC
-:102D10000422B3D8000503E10622B3EC0000000B47
-:102D20000422B418000503E60622B42C0000000BB0
-:102D30000422B458000503EB0622B46C0000000B1B
-:102D40000422B498000503F00622B4AC0000000B86
-:102D50000422B4D8000503F50622B4EC0000000BF1
-:102D60000422B518000503FA0622B52C0000000B5A
-:102D70000422B558000503FF0622B56C0000000BC5
-:102D80000422B598000504040622B5AC0000000B2F
-:102D90000422B5D8000504090622B5EC0000000B9A
-:102DA0000422B6180005040E0622B62C0000000B03
-:102DB0000422B658000504130622B66C0000000B6E
-:102DC0000422B698000504180622B6AC0000000BD9
-:102DD0000422B6D80005041D0622B6EC0000000B44
-:102DE0000422B718000504220622B72C0000000BAD
-:102DF0000422B758000504270622B76C0000000B18
-:102E00000422B7980005042C0622B7AC0000000B82
-:102E10000422B7D8000504310622B7EC0000000BED
-:102E20000422B818000504360622B82C0000000B56
-:102E30000422B8580005043B0622B86C0000000BC1
-:102E40000422B898000504400622B8AC0000000B2C
-:102E50000422B8D8000504450622B8EC0000000B97
-:102E60000422B9180005044A0622B92C0000000B00
-:102E70000422B9580005044F0622B96C0000000B6B
-:102E80000422B998000504540622B9AC0000000BD6
-:102E90000422B9D8000504590622B9EC0000000B41
-:102EA0000422BA180005045E0622BA2C0000000BAA
-:102EB0000422BA58000504630622BA6C0000000B15
-:102EC0000422BA98000504680622BAAC0000000B80
-:102ED0000422BAD80005046D0622BAEC00000005F1
-:102EE0000622BB00000000530422BC4C0001047207
-:102EF0000622BC50000000030422BC5C00010473E5
-:102F00000622BC60000000030422BC6C00010474B3
-:102F10000622BC70000000030422BC7C0001047582
-:102F20000622BC80000000030422BC8C0001047651
-:102F30000622BC90000000030422BC9C0001047720
-:102F40000622BCA0000000030422BCAC00010478EF
-:102F50000622BCB0000000030422BCBC00010479BE
-:102F60000622880000000100062280000000020006
-:102F7000042212700010047A06223000000000C003
-:102F800006226700000001000622900000000400F5
-:102F900004226B080020048A022212C0FFFFFFFFF8
-:102FA000062211E800000002062212C800000009F3
-:102FB000062212EC0000000906228C000000000826
-:102FC0000222114800000000062213200000000623
-:102FD000062233000000000206226040000000309C
-:102FE00006228C20000000080222114C0000000084
-:102FF00006221338000000060622330800000002F3
-:10300000062261000000003006228C40000000080B
-:10301000022211500000000006221350000000069A
-:103020000622331000000002062261C000000030BA
-:1030300006228C60000000080222115400000000EB
-:103040000622136800000006062233180000000262
-:10305000062262800000003006228C8000000008FA
-:103060000222115800000000062213800000000612
-:1030700006223320000000020622634000000030D8
-:1030800006228CA0000000080222115C0000000053
-:1030900006221398000000060622332800000002D2
-:1030A000062264000000003006228CC000000008E8
-:1030B0000222116000000000062213B0000000068A
-:1030C0000622333000000002062264C000000030F7
-:1030D00006228CE0000000080222116400000000BB
-:1030E000062213C800000006062233380000000242
-:1030F0000622658000000030021610000000002843
-:1031000002170008000000020217002C0000000354
-:103110000217003C000000040217004800000002F3
-:103120000217004C000000900217005000000090B1
-:103130000217005400800090021700580810000089
-:10314000021700600000008A02170064000000807F
-:1031500002170068000000810217006C0000008068
-:10316000021700700000000602170078000007D068
-:103170000217007C0000076C02170038007C100466
-:10318000021700040000000F061640240000000291
-:10319000021640700000001C0216420800000001E8
-:1031A0000216421000000001021642200000000139
-:1031B0000216422800000001021642300000000101
-:1031C00002164238000000010216426000000002B0
-:1031D0000C16401C0003D0900A16401C0000009CF6
-:1031E0000B16401C000009C4021640300000000805
-:1031F000021640340000000C021640380000001097
-:1032000002164044000000200216400000000001A9
-:10321000021640D80000000102164008000000011C
-:103220000216400C000000010216401000000001D0
-:103230000216424000000000021642480000000052
-:103240000616427000000002021642500000000004
-:1032500002164258000000000616428000000002DC
-:1032600002166008000012240216600C0000121002
-:1032700002166010000012140216601C0000FFFF0E
-:10328000021660200000FFFF021660240000FFFF0E
-:10329000021660280000FFFF0216603800000020C0
-:1032A0000216603C0000002006166040000000028C
-:1032B00002166048000000230216604C0000002443
-:1032C000021660500000002502166054000000261F
-:1032D00002166058000000270216605C00000029FA
-:1032E000021660600000002A021660640000002BD5
-:1032F000021660680000002C0216606C0000002DB1
-:1033000002166070000000EC0216607400000011EC
-:1033100002166078000000120616607C0000000FA4
-:10332000021660B800000001021660BC0000000137
-:10333000061660C00000000C021660F000000001DC
-:10334000061660F400000031021661B800000001AA
-:10335000061661BC0000000D021661F000000001BD
-:10336000061661F4000000110216623807FFFFFF25
-:103370000216623C0000003F0216624007FFFFFF9A
-:10338000021662440000000F0116624800000000AF
-:103390000116624C0000000001166250000000009F
-:1033A000011662540000000001166258000000007F
-:1033B0000116625C0000000001166260000000005F
-:1033C000011662640000000001166268000000003F
-:1033D0000116626C0000000001166270000000001F
-:1033E00001166274000000000116627800000000FF
-:1033F0000116627C000000000C166000000003E86B
-:103400000A166000000000010B1660000000000AB0
-:1034100002168040000000060216804400000005ED
-:10342000021680480000000A0216804C00000005C9
-:103430000216805400000002021680CC0000000436
-:10344000021680D000000004021680D400000004A0
-:10345000021680D800000004021680DC0000000480
-:10346000021680E000000004021680E40000000460
-:10347000021680E800000004021688040000000420
-:10348000021680300000007C021680340000003DEF
-:10349000021680380000003F0216803C0000009CAD
-:1034A000021680F000000007061680F400000005F8
-:1034B0000216880C010101010216810800000000BB
-:1034C0000216810C000000040216811000000004A6
-:1034D0000216811400000002021688100801200460
-:1034E00002168118000000050216811C000000056C
-:1034F000021681200000000502168124000000054C
-:103500000216882C200810010216812800000008ED
-:103510000216812C00000006021681300000000710
-:1035200002168134000000000216883001010120DB
-:1035300006168138000000040216883401010101DA
-:1035400002168148000000000216814C00000004B1
-:10355000021681500000000402168154000000028F
-:103560000216883808012004021681580000000560
-:103570000216815C00000005021681600000000553
-:1035800002168164000000050216883C2008100124
-:1035900002168168000000080216816C0000000617
-:1035A00002168170000000070216817400000001FD
-:1035B00002168840010101200216817800000001F6
-:1035C0000216817C000000010216818000000001CB
-:1035D00002168184000000010216884401010101E5
-:1035E00002168188000000010216818C0000000490
-:1035F000021681900000000402168194000000026F
-:10360000021688480801200402168198000000056F
-:103610000216819C00000005021681A00000000532
-:10362000021681A40000000502168814200810016B
-:10363000021681A800000008021681AC00000006F6
-:10364000021681B000000007021681B400000001DC
-:103650000216881801010120021681B8000000013D
-:10366000021681BC00000001021681C000000001AA
-:10367000021681C4000000010216881C010101012C
-:10368000021681C800000001021681CC000000046F
-:10369000021681D000000004021681D4000000024E
-:1036A0000216882008012004021681D800000005B7
-:1036B000021681DC00000005021681E00000000512
-:1036C000021681E40000000502168824200810017B
-:1036D000021681E800000008021681EC00000006D6
-:1036E000021681F0000000070216E40C0000000042
-:1036F00002168828010101200616E41000000004CB
-:103700000216E000010101010216E42000000000A1
-:103710000216E424000000040216E428000000045D
-:103720000216E42C000000020216E0040801200446
-:103730000216E430000000050216E4340000000523
-:103740000216E438000000050216E43C0000000503
-:103750000216E008200810010216E44000000008EC
-:103760000216E444000000060216E44800000007C8
-:103770000216E44C000000000216E00C01010120DA
-:103780000616E450000000040216E01001010101D9
-:103790000216E460000000000216E4640000000469
-:1037A0000216E468000000040216E46C0000000247
-:1037B0000216E014080120040216E470000000055F
-:1037C0000216E474000000050216E478000000050B
-:1037D0000216E47C000000050216E0182008100123
-:1037E0000216E480000000080216E48400000006CF
-:1037F0000216E488000000070216E48C00000001B5
-:103800000216E01C010101200216E49000000001F4
-:103810000216E494000000010216E4980000000182
-:103820000216E49C000000010216E02001010101E3
-:103830000216E4A0000000010216E4A40000000447
-:103840000216E4A8000000040216E4AC0000000226
-:103850000216E024080120040216E4B0000000056E
-:103860000216E4B4000000050216E4B800000005EA
-:103870000216E4BC000000050216E0282008100132
-:103880000216E4C0000000080216E4C400000006AE
-:103890000216E4C8000000070216E4CC0000000194
-:1038A0000216E02C010101200216E4D00000000104
-:1038B0000216E4D4000000010216E4D80000000162
-:1038C0000216E4DC000000010216E03001010101F3
-:1038D0000216E4E0000000010216E4E40000000427
-:1038E0000216E4E8000000040216E4EC0000000206
-:1038F0000216E034080120040216E4F0000000057E
-:103900000216E4F4000000050216E4F800000005C9
-:103910000216E4FC000000050216E0382008100141
-:103920000216E500000000080216E504000000068B
-:103930000216E508000000070216E03C0101012024
-:1039400002168240003F003F021682440000000041
-:103950000216E524003F003F0216E52800000000A3
-:1039600002168248000000000216824C003F003F11
-:103970000216E52C000000000216E530003F003F73
-:10398000021682500100010002168254010001005B
-:103990000216E534010001000216E53801000100BD
-:1039A00006168258000000020216E53C00000000E6
-:1039B0000216E540000000000216826000C000C050
-:1039C0000216826400C000C00216E54400C000C0B8
-:1039D0000216E54800C000C0021682681E001E00E4
-:1039E0000216826C1E001E000216E54C1E001E0010
-:1039F0000216E5501E001E000216827040004000B4
-:103A000002168274400040000216E5544000400057
-:103A10000216E558400040000216827880008000BF
-:103A20000216827C800080000216E55C8000800027
-:103A30000216E560800080000216828020002000CF
-:103A400002168284200020000216E5642000200077
-:103A50000216E56820002000061682880000000299
-:103A60000216E56C000000000216E5700000000080
-:103A700002168290000000000216829400000000EE
-:103A80000216E574000000000216E5780000000050
-:103A900002168298000000000216829C00000000BE
-:103AA0000216E57C000000000216E5800000000020
-:103AB000021682A000000000021682A4000000018D
-:103AC000061682A80000000A021681F400000C0805
-:103AD000021681F800000040021681FC000001007F
-:103AE0000216820000000020021682040000001767
-:103AF00002168208000000800216820C00000200FC
-:103B000002168210000000000216821801FF01FF59
-:103B10000216821401FF01FF0216E51001FF01FFEA
-:103B20000216E50C01FF01FF0216823C00000013A3
-:103B3000021680900000013F0216806000000140E4
-:103B40000216806400000140061680680000000232
-:103B500002168070000000C0061680740000000786
-:103B60000216809C00000048021680A00000004859
-:103B7000061680A400000002021680AC0000004877
-:103B8000061680B000000007021682380000800090
-:103B900002168234000025E40216809400007FFFA4
-:103BA00002168220000F000F0216821C000F000F69
-:103BB0000216E518000F000F0216E514000F000FA3
-:103BC000021682280000000002168224FFFFFFFF79
-:103BD0000216E520000000000216E51CFFFFFFFFB3
-:103BE0000216E6BC000000000216E6C0000000025B
-:103BF0000216E6C4000000010216E6C80000000339
-:103C00000216E6CC000000040216E6D00000000612
-:103C10000216E6D4000000050216E6D800000007F0
-:103C2000021680EC000000FF0214000000000001FA
-:103C30000214000C0000000102140040000000010A
-:103C40000214004400007FFF0214000C000000007A
-:103C500002140000000000000214006C00000000CC
-:103C600002140004000000010214003000000001F2
-:103C700002140004000000000214005C00000000B8
-:103C800002140008000000010214003400000001CA
-:103C90000214000800000000021400600000000090
-:103CA00006028000000020000202005800000032DE
-:103CB000020200A003150020020200A40315002048
-:103CC000020200A801000030020200AC081000004F
-:103CD000020200B000000033020200B40000003015
-:103CE000020200B800000031020200BC0000000324
-:103CF000020200C000000006020200C4000000032F
-:103D0000020200C800000003020200CC0000000212
-:103D1000020200D000000000020200D400000002F5
-:103D2000020200DC00000000020200E000000006C9
-:103D3000020200E400000004020200E800000002A9
-:103D4000020200EC00000002020200F0000000018C
-:103D5000020200FC00000006020201200000000038
-:103D60000202013400000002020201B00000000162
-:103D70000202020C00000001020202140000000115
-:103D80000202021800000002020204040000000106
-:103D90000202040C00000040020204100000004077
-:103DA0000202041C000000040202042000000020A3
-:103DB0000202042400000002020204280000002085
-:103DC000060205000000001204020480002004AA7C
-:103DD000020200600000000F020200640000000701
-:103DE00002020068000000000202006C0000000EE9
-:103DF000020200700000000E0602007400000003C2
-:103E0000020200F4000000040202000400000001AD
-:103E100002020008000000010202000C0000000184
-:103E20000202001000000001020200140000000164
-:103E300002020018000000010202001C0000000144
-:103E40000202002000000001020200240000000124
-:103E500002020028000000010202002C0000000104
-:103E600002020030000000010202003400000001E4
-:103E700002020038000000010202003C00000001C4
-:103E800002020040000000010202004400000001A4
-:103E900002020048000000010202004C0000000184
-:103EA000020200500000000102020108000000C8E8
-:103EB0000202011800000002020201C4000000001A
-:103EC000020201CC00000000020201D40000000246
-:103ED000020201DC00000002020201E4000000FF17
-:103EE000020201EC000000FF0202010000000000DD
-:103EF0000202010C000000C80202011C00000002C6
-:103F0000020201C800000000020201D0000000000F
-:103F1000020201D800000002020201E000000002DB
-:103F2000020201E8000000FF020201F0000000FFB1
-:103F3000020201040000000002020108000000C8A3
-:103F40000202011800000002020201C40000000089
-:103F5000020201CC00000000020201D400000002B5
-:103F6000020201DC00000002020201E4000000FF86
-:103F7000020201EC000000FF02020100000000004C
-:103F80000202010C000000C80202011C0000000235
-:103F9000020201C800000000020201D0000000007F
-:103FA000020201D800000002020201E0000000024B
-:103FB000020201E8000000FF020201F0000000FF21
-:103FC000020201040000000002020108000000C813
-:103FD0000202011800000002020201C400000000F9
-:103FE000020201CC00000000020201D40000000225
-:103FF000020201DC00000002020201E4000000FFF6
-:10400000020201EC000000FF0202010000000000BB
-:104010000202010C000000C80202011C00000002A4
-:10402000020201C800000000020201D000000000EE
-:10403000020201D800000002020201E000000002BA
-:10404000020201E8000000FF020201F0000000FF90
-:10405000020201040000000002020108000000C882
-:104060000202011800000002020201C40000000068
-:10407000020201CC00000000020201D40000000294
-:10408000020201DC00000002020201E4000000FF65
-:10409000020201EC000000FF02020100000000002B
-:1040A0000202010C000000C80202011C0000000214
-:1040B000020201C800000000020201D0000000005E
-:1040C000020201D800000002020201E0000000022A
-:1040D000020201E8000000FF020201F0000000FF00
-:1040E00002020104000000000728040000A30000F1
-:1040F000082807B8000904CA072C000034F10000A2
-:10410000072C800038A60D3D072D000037B61B6731
-:10411000072D800032632955072E00001C6835EEFC
-:10412000082E48B036EA04CC012800000000000048
-:104130000128000400000000012800080000000021
-:104140000128000C00000000012800100000000001
-:1041500001280014000000000228002000000001D7
-:1041600002280024000000020228002800000003AA
-:104170000228002C0000000002280030000000048B
-:10418000022800340000000102280038000000006E
-:104190000228003C0000000102280040000000044A
-:1041A000022800440000000002280048000000012E
-:1041B0000228004C0000000302280050000000000C
-:1041C00002280054000000010228005800000004EA
-:1041D0000228005C000000000228006000000001CE
-:1041E00002280064000000030228006800000000AC
-:1041F0000228006C0000000102280070000000048A
-:10420000022800740000000002280078000000046A
-:104210000228007C00000003062800800000000245
-:10422000022800A400003FFF022800A8000003FFAE
-:1042300002280224000000000228023400000000CE
-:104240000228024C00000000022802E40000FFFFE8
-:104250000628200000000800022B8BC0000000018F
-:10426000022B800000000000022B8040000000189C
-:10427000022B80800000000C022B80C00000006632
-:104280000C2B83000007A1200A2B830000000138BB
-:104290000B2B8300000013880A2B834000000000D2
-:1042A0000C2B8340000001F40B2B83400000000521
-:1042B000022B83800007A120022B83C0000001F4A1
-:1042C000022B1480000000010A2B14800000000063
-:1042D000062A9AF800000004042A9B08000204CE73
-:1042E000062A9B1000000006062A90800000004865
-:1042F000062A2008000000C8062A2000000000024C
-:10430000062A91A800000086062A900000000020DE
-:10431000062A93C800000003042A93D4000104D0A5
-:10432000062A9DA800000002042A9498000404D1E3
-:10433000042A9D58000104D5062A9D5C0000001146
-:10434000042ACB20001004D6042A3000000204E620
-:10435000062A300800000100062A40400000001034
-:10436000042A4000001004E8042A8408000204F82B
-:10437000062A9DA000000002062AB000000000509E
-:10438000062ABB7000000070062AB150000000022F
-:10439000062ABB6000000004062AD00000000800C6
-:1043A000062AC00000000150062A94A8000000322E
-:1043B000062A502000000002062A503000000002A9
-:1043C000062A500000000002062A501000000002D9
-:1043D000022A520800000001042A9B28000204FA65
-:1043E000062A963800000022042A96C0000104FC28
-:1043F000062A96C400000003062A976800000022DF
-:10440000042A97F0000104FD062A97F40000000337
-:10441000062A989800000022042A9920000104FE30
-:10442000062A992400000003062A99C800000022E9
-:10443000042A9A50000104FF062A9A54000000033F
-:10444000062AB14000000002062AC54000000150C3
-:10445000062A957000000032062A5028000000024B
-:10446000062A503800000002062A50080000000208
-:10447000062A501800000002022A520C0000000117
-:10448000042A9B3000020500062A96D00000002274
-:10449000042A975800010502062A975C00000003D1
-:1044A000062A980000000022042A988800010503CB
-:1044B000062A988C00000003062A9930000000228A
-:1044C000042A99B800010504062A99BC00000003DB
-:1044D000062A9A6000000022042A9AE800010505D5
-:1044E000062A9AEC00000003062AB14800000002E8
-:1044F000022ACA8000000000042A9B38001005062A
-:10450000062A50480000000E022ACA84000000005B
-:10451000042A9B7800100516062A50800000000E21
-:10452000022ACA8800000000042A9BB80010052651
-:10453000062A50B80000000E022ACA8C00000000B3
-:10454000042A9BF800100536062A50F00000000EE1
-:10455000022ACA9000000000042A9C380010054678
-:10456000062A51280000000E022ACA94000000000A
-:10457000042A9C7800100556062A51600000000E9F
-:10458000022ACA9800000000042A9CB800100566A0
-:10459000062A51980000000E022ACA9C0000000062
-:1045A000042A9CF800100576062A51D00000000E5F
-:1045B000021010080000000102101050000000015D
-:1045C000021010000003D000021010040000003D93
-:1045D0000910180002000586091011000010078656
-:1045E0000610114000000008091011600010079625
-:1045F000061011A00000001806102400000000E0C2
-:104600000210201C00000000021020200000000109
-:10461000021020C00000000202102004000000016F
-:10462000021020080000000109103C00000507A648
-:1046300009103800000507AB09103820000507B045
-:1046400006104C000000010002104028000000107D
-:104650000210404400003FFF0210405800280000B4
-:10466000021040840084924A02104058000000006A
-:104670000210800000001080021080AC00000000DA
-:1046800002108038000000100210810000000000BD
-:10469000061081200000000202108008000002B510
-:1046A0000210801000000000061082000000004A86
-:1046B000021081080001FFFF061081400000000287
-:1046C0000210800000001A800610900000000024F4
-:1046D000061091200000004A061093700000004A66
-:1046E000061095C00000004A0210800400001080EF
-:1046F000021080B0000000010210803C0000001099
-:104700000210810400000000061081280000000251
-:104710000210800C000002B502108014000000009E
-:10472000061084000000004A0210810C0001FFFF07
-:1047300006108148000000020210800400001A8068
-:104740000610909000000024061092480000004AD5
-:10475000061094980000004A061096E80000004AEF
-:104760000210800000001080021080AC00000002E7
-:1047700002108038000000100210810000000000CC
-:10478000061081200000000202108008000002B51F
-:104790000210801000000000061082000000004A95
-:1047A000021081080001FFFF061081400000000296
-:1047B0000210800000001A80061090000000002403
-:1047C000061091200000004A061093700000004A75
-:1047D000061095C00000004A0210800400001080FE
-:1047E000021080B0000000030210803C00000010A6
-:1047F0000210810400000000061081280000000261
-:104800000210800C000002B50210801400000000AD
-:10481000061084000000004A0210810C0001FFFF16
-:1048200006108148000000020210800400001A8077
-:104830000610909000000024061092480000004AE4
-:10484000061094980000004A061096E80000004AFE
-:104850000210800000001080021080AC00000004F4
-:1048600002108038000000100210810000000000DB
-:10487000061081200000000202108008000002B52E
-:104880000210801000000000061082000000004AA4
-:10489000021081080001FFFF0610814000000002A5
-:1048A0000210800000001A80061090000000002412
-:1048B000061091200000004A061093700000004A84
-:1048C000061095C00000004A02108004000010800D
-:1048D000021080B0000000050210803C00000010B3
-:1048E0000210810400000000061081280000000270
-:1048F0000210800C000002B50210801400000000BD
-:10490000061084000000004A0210810C0001FFFF25
-:1049100006108148000000020210800400001A8086
-:104920000610909000000024061092480000004AF3
-:10493000061094980000004A061096E80000004A0D
-:104940000210800000001080021080AC0000000601
-:1049500002108038000000100210810000000000EA
-:10496000061081200000000202108008000002B53D
-:104970000210801000000000061082000000004AB3
-:10498000021081080001FFFF0610814000000002B4
-:104990000210800000001A80061090000000002421
-:1049A000061091200000004A061093700000004A93
-:1049B000061095C00000004A02108004000010801C
-:1049C000021080B0000000070210803C00000010C0
-:1049D000021081040000000006108128000000027F
-:1049E0000210800C000002B50210801400000000CC
-:1049F000061084000000004A0210810C0001FFFF35
-:104A000006108148000000020210800400001A8095
-:104A10000610909000000024061092480000004A02
-:104A2000061094980000004A061096E80000004A1C
-:104A3000021205B0000000010212049000E383405E
-:104A40000212051400003C100212066C0000000166
-:104A5000021206700000000002120494FFFFFFFF24
-:104A600002120498FFFFFFFF0212049CFFFFFFFFEA
-:104A7000021204A0FFFFFFFF021204A4FFFFFFFFCA
-:104A8000021204A8FFFFFFFF021204ACFFFFFFFFAA
-:104A9000021204B0FFFFFFFF021204BCFFFFFFFF82
-:104AA000021204C0FFFFFFFF021204C4FFFFFFFF5A
-:104AB000021204C8FFFFFFFF021204CCFFFFFFFF3A
-:104AC000021204D0FFFFFFFF021204D8FFFFFFFF16
-:104AD000021204DCFFFFFFFF021204E0FFFFFFFFF2
-:104AE000021204E4FFFFFFFF021204E8FFFFFFFFD2
-:104AF000021204ECFFFFFFFF021204F0FFFFFFFFB2
-:104B0000021204F4FFFFFFFF021204F8FFFFFFFF91
-:104B1000021204FCFFFFFFFF02120500FFFFFFFF70
-:104B200002120504FFFFFFFF02120508FFFFFFFF4F
-:104B30000212050CFFFFFFFF02120510FFFFFFFF2F
-:104B4000021204D4FF809000021204B4F00050005E
-:104B5000021204B8F00010000212039000000008D6
-:104B60000212039C00000008021203A000000008CB
-:104B7000021203A400000002021203BC00000004A1
-:104B8000021203C000000005021203C4000000046A
-:104B9000021203D0000000000212036C00000001AA
-:104BA000021203680000003F021201BC0000004036
-:104BB000021201C000001808021201C4000008031C
-:104BC000021201C800000803021201CC00000040DC
-:104BD000021201D000000003021201D400000803F9
-:104BE000021201D800000803021201DC00000803D1
-:104BF000021201E000010003021201E400000803B8
-:104C0000021201E800000803021201EC0000000398
-:104C1000021201F000000003021201F40000000380
-:104C2000021201F800000003021201FC0000000360
-:104C3000021202000000000302120204000000033E
-:104C400002120208000000030212020C000000031E
-:104C500002120210000000030212021400000003FE
-:104C600002120218000000030212021C00000003DE
-:104C700002120220000000030212022400000003BE
-:104C800002120228000024030212022C0000002F4E
-:104C90000212023000000009021202340000001962
-:104CA00002120238000001840212023C000001835B
-:104CB0000212024000000306021202440000001922
-:104CC00002120248000000060212024C0000030615
-:104CD00002120250000003060212025400000306F2
-:104CE0000212025800000C860212025C0000030649
-:104CF00002120260000003060212026400000006B5
-:104D000002120268000000060212026C0000000697
-:104D10000212027000000006021202740000000677
-:104D200002120278000000060212027C0000000657
-:104D30000212028000000006021202840000000637
-:104D400002120288000000060212028C0000000617
-:104D500002120290000000060212029400000006F7
-:104D600002120298000000060212029C00000006D7
-:104D7000021202A000000306021202A400000013A7
-:104D8000021202A800000006021202B00000100485
-:104D9000021202B400001004021203240010644046
-:104DA0000212032800106440021205B40000000142
-:104DB000021201B0000000010600A0000000000C7B
-:104DC0000200A050000000000200A05400000000FB
-:104DD0000200A0EC555400000200A0F055555555B6
-:104DE0000200A0F4000055550200A0F8F0000000F9
-:104DF0000200A0FC555400000200A1005555555575
-:104E00000200A104000055550200A108F0000000B6
-:104E10000200A18C555400000200A1905555555533
-:104E20000200A194000055550200A198F000000076
-:104E30000200A19C000000000200A1A000010000EF
-:104E40000200A1A4000050140200A1A8000000006C
-:104E50000200A45C00000C000200A61C000000037D
-:104E60000200A06CFF5C00000200A070FFF55FFF75
-:104E70000200A0740000FFFF0200A078F00003E031
-:104E80000200A07C000000000200A0800000A00042
-:104E90000600A084000000050200A0980FE00000BA
-:104EA0000600A09C000000070200A0B8000004005B
-:104EB0000600A0BC000000030200A0C80000100013
-:104EC0000600A0CC000000030200A0D800004000B3
-:104ED0000600A0DC000000030200A0E800010000C2
-:104EE0000600A22C000000040200A10CFF5C0000E0
-:104EF0000200A110FFF55FFF0200A1140000FFFFF8
-:104F00000200A118F00003E00200A11C0000000054
-:104F10000200A1200000A0000600A124000000055E
-:104F20000200A1380FE000000600A13C00000007CD
-:104F30000200A158000008000600A15C0000000368
-:104F40000200A168000020000600A16C0000000320
-:104F50000200A178000080000600A17C0000000390
-:104F60000200A188000200000600A23C000000042C
-:104F70000200A030000000000200A0340000000089
-:104F80000200A038000000000200A03C0000000069
-:104F90000200A040000000000200A0440000000049
-:104FA0000200A048000000000200A04C0000000029
-:104FB00000000000000000000000003000000000C1
-:104FC00000000000000000000000000000000000E1
-:104FD00000000000000000000000000000000000D1
-:104FE0000000000000300031000000000000000060
-:104FF00000000000000000000000000000000000B1
-:1050000000000000000000000000000000000000A0
-:10501000003100520000000000000000000000000D
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000052008995
-:1050400000000000000000000089008D008D00912C
-:1050500000910095009500990099009D009D00A188
-:1050600000A100A500A500A900A900AE00AE00B1F6
-:1050700000B100B4000000000000000000000000CB
-:105080000000000000000000000000000000000020
-:105090000000000000B40309030903130313031DF8
-:1050A000031D03240324032B032B03320332033990
-:1050B00003390340034003470347034E034E0355A0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:105170000355035B0000000000000000035B035CBC
-:10518000035C035D035D035E035E035F035F036017
-:1051900003600361036103620362036300000000B4
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000363036D036D037B1B
-:1051D000037B0389000000000000000000000000C5
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:105220000389038A00000000000000000000000065
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000038A03D6F8
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000003D604010000000050
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000040104330000000000000000C2
-:1052B0000433043A043A0441044104480448044FC6
-:1052C000044F04560456045D045D04640464046BD6
-:1052D000046B04A4000000000000000004A404A863
-:1052E00004A804AC04AC04B004B004B404B404B81E
-:1052F00004B804BC04BC04C004C004C404C4051342
-:105300000513052A052A05410541054305430545C1
-:1053100005450547054705490549054B054B054D1D
-:10532000054D054F054F0551055105E805E805E90F
-:1053300005E905EA05EA05EF05EF05F405F405F9C9
-:1053400005F905FE05FE0603060306080608060D18
-:10535000060D0612061206130000000000000000F1
-:10536000000000000000000000000000000000003D
-:10537000000000000000000000000000000000002D
-:1053800006130624000000000000000000000000DA
-:10539000000000000000000000000000000000000D
-:1053A0000000000000000000000000000624063994
-:1053B0000639063C063C063F0000000000000000E5
-:1053C00000000000000000000000000000000000DD
-:1053D0000000000000000000063F0675000000000D
-:1053E00000000000000000000000000000000000BD
-:1053F00000000000000000000000000000000000AD
-:1054000000000000067507780000000000000000A2
-:10541000000000000000000000000000000000008C
-:10542000000000000000000000000000000000007C
-:105430000778077F077F078307830787000000003F
-:10544000000000000000000000000000000000005C
-:10545000000000000000000000000000078707C8EF
-:10546000000000000000000007C807D107D107DADC
-:1054700007DA07E307E307EC07EC07F507F507FE94
-:1054800007FE080708070810081008670867087C67
-:10549000087C089108910894089408970897089A3E
-:1054A000089A089D089D08A008A008A308A308A6BC
-:1054B00008A608A908A908B2000000000000000022
-:1054C00000000000000000000000000000000000DC
-:1054D00000000000000000000000000000000000CC
-:1054E00008B208B800000000000000000000000042
-:1054F00000000000000000000000000000000000AC
-:1055000000000000000000000000000008B808BB18
-:10551000000000000000000000000000000000008B
-:10552000000000000000000000000000000000007B
-:10553000000000000000000008BB08C100000000DF
-:10554000000000000000000000000000000000005B
-:10555000000000000000000000000000000000004B
-:10556000000000000000000000000000000000003B
-:1055700008C108D008D008DF08DF08EE08EE08FDF3
-:1055800008FD090C090C091B091B092A092A0939FC
-:10559000093909AA00000000000000000000000016
-:1055A00000000000000000000000000000000000FB
-:1055B00000000000000000000000000009AA09BF70
-:1055C00009BF09D009D009E109E109E209E209E3CB
-:1055D00009E309E409E409E509E509E609E609E75B
-:1055E00009E709E809E809E90000000000000000F7
-:1055F00000000000000000000000000000000000AB
-:10560000000000000000000000000000000000009A
-:10561000000000000000000000000000000000008A
-:10562000000000000000000000000000000000007A
-:10563000000000000000000000000000000000006A
-:10564000000000000000000000000000000000005A
-:10565000000000000000000000000000000000004A
-:10566000000000000000000000000000000000003A
-:10567000000000000000000000000000000000002A
-:10568000000000000000000000000000000000001A
-:10569000000000000000000000000000000000000A
-:1056A00000000000000000000000000000000000FA
-:1056B00000000000000000000000000000000000EA
-:1056C000000000000000000000010000000204C013
-:1056D0000003098000040E4000051300000617C0F7
-:1056E00000071C800008214000092600000A2AC08B
-:1056F000000B2F80000C3440000D3900000E3DC01F
-:10570000000F42800010474000114C00001250C0B2
-:105710000013558000145A4000155F00001663C046
-:105720000017688000186D4000197200001A76C0DA
-:10573000001B7B80001C8040001D8500001E89C06E
-:10574000001F8E80000093400000200000004000F9
-:1057500000006000000080000000A0000000C00009
-:105760000000E000000100000001200000014000F6
-:1057700000016000000180000001A0000001C000E5
-:105780000001E000000200000002200000024000D2
-:1057900000026000000280000002A0000002C000C1
-:1057A0000002E000000300000003200000034000AE
-:1057B00000036000000380000003A0000003C0009D
-:1057C0000003E0000004000000042000000440008A
-:1057D00000046000000480000004A0000004C00079
-:1057E0000004E00000050000000520000005400066
-:1057F00000056000000580000005A0000005C00055
-:105800000005E00000060000000620000006400041
-:1058100000066000000680000006A0000006C00030
-:105820000006E0000007000000072000000740001D
-:1058300000076000000780000007A0000007C0000C
-:105840000007E000000800000008200000084000F9
-:1058500000086000000880000008A0000008C000E8
-:105860000008E000000900000009200000094000D5
-:1058700000096000000980000009A0000009C000C4
-:105880000009E000000A0000000A2000000A4000B1
-:10589000000A6000000A8000000AA000000AC000A0
-:1058A000000AE000000B0000000B2000000B40008D
-:1058B000000B6000000B8000000BA000000BC0007C
-:1058C000000BE000000C0000000C2000000C400069
-:1058D000000C6000000C8000000CA000000CC00058
-:1058E000000CE000000D0000000D2000000D400045
-:1058F000000D6000000D8000000DA000000DC00034
-:10590000000DE000000E0000000E2000000E400020
-:10591000000E6000000E8000000EA000000EC0000F
-:10592000000EE000000F0000000F2000000F4000FC
-:10593000000F6000000F8000000FA000000FC000EB
-:10594000000FE000001000000010200000104000D8
-:1059500000106000001080000010A0000010C000C7
-:105960000010E000001100000011200000114000B4
-:1059700000116000001180000011A0000011C000A3
-:105980000011E00000120000001220000012400090
-:1059900000126000001280000012A0000012C0007F
-:1059A0000012E0000013000000132000001340006C
-:1059B00000136000001380000013A0000013C0005B
-:1059C0000013E00000140000001420000014400048
-:1059D00000146000001480000014A0000014C00037
-:1059E0000014E00000150000001520000015400024
-:1059F00000156000001580000015A0000015C00013
-:105A00000015E000001600000016200000164000FF
-:105A100000166000001680000016A0000016C000EE
-:105A20000016E000001700000017200000174000DB
-:105A300000176000001780000017A0000017C000CA
-:105A40000017E000001800000018200000184000B7
-:105A500000186000001880000018A0000018C000A6
-:105A60000018E00000190000001920000019400093
-:105A700000196000001980000019A0000019C00082
-:105A80000019E000001A0000001A2000001A40006F
-:105A9000001A6000001A8000001AA000001AC0005E
-:105AA000001AE000001B0000001B2000001B40004B
-:105AB000001B6000001B8000001BA000001BC0003A
-:105AC000001BE000001C0000001C2000001C400027
-:105AD000001C6000001C8000001CA000001CC00016
-:105AE000001CE000001D0000001D2000001D400003
-:105AF000001D6000001D8000001DA000001DC000F2
-:105B0000001DE000001E0000001E2000001E4000DE
-:105B1000001E6000001E8000001EA000001EC000CD
-:105B2000001EE000001F0000001F2000001F4000BA
-:105B3000001F6000001F8000001FA000001FC000A9
-:105B4000001FE00000200000002020000020400096
-:105B500000206000002080000020A0000020C00085
-:105B60000020E00000210000002120000021400072
-:105B700000216000002180000021A0000021C00061
-:105B80000021E0000022000000222000002240004E
-:105B900000226000002280000022A0000022C0003D
-:105BA0000022E0000023000000232000002340002A
-:105BB00000236000002380000023A0000023C00019
-:105BC0000023E00000240000002420000024400006
-:105BD00000246000002480000024A0000024C000F5
-:105BE0000024E000002500000025200000254000E2
-:105BF00000256000002580000025A0000025C000D1
-:105C00000025E000002600000026200000264000BD
-:105C100000266000002680000026A0000026C000AC
-:105C20000026E00000270000002720000027400099
-:105C300000276000002780000027A0000027C00088
-:105C40000027E00000280000002820000028400075
-:105C500000286000002880000028A0000028C00064
-:105C60000028E00000290000002920000029400051
-:105C700000296000002980000029A0000029C00040
-:105C80000029E000002A0000002A2000002A40002D
-:105C9000002A6000002A8000002AA000002AC0001C
-:105CA000002AE000002B0000002B2000002B400009
-:105CB000002B6000002B8000002BA000002BC000F8
-:105CC000002BE000002C0000002C2000002C4000E5
-:105CD000002C6000002C8000002CA000002CC000D4
-:105CE000002CE000002D0000002D2000002D4000C1
-:105CF000002D6000002D8000002DA000002DC000B0
-:105D0000002DE000002E0000002E2000002E40009C
-:105D1000002E6000002E8000002EA000002EC0008B
-:105D2000002EE000002F0000002F2000002F400078
-:105D3000002F6000002F8000002FA000002FC00067
-:105D4000002FE00000300000003020000030400054
-:105D500000306000003080000030A0000030C00043
-:105D60000030E00000310000003120000031400030
-:105D700000316000003180000031A0000031C0001F
-:105D80000031E0000032000000322000003240000C
-:105D900000326000003280000032A0000032C000FB
-:105DA0000032E000003300000033200000334000E8
-:105DB00000336000003380000033A0000033C000D7
-:105DC0000033E000003400000034200000344000C4
-:105DD00000346000003480000034A0000034C000B3
-:105DE0000034E000003500000035200000354000A0
-:105DF00000356000003580000035A0000035C0008F
-:105E00000035E0000036000000362000003640007B
-:105E100000366000003680000036A0000036C0006A
-:105E20000036E00000370000003720000037400057
-:105E300000376000003780000037A0000037C00046
-:105E40000037E00000380000003820000038400033
-:105E500000386000003880000038A0000038C00022
-:105E60000038E0000039000000392000003940000F
-:105E700000396000003980000039A0000039C000FE
-:105E80000039E000003A0000003A2000003A4000EB
-:105E9000003A6000003A8000003AA000003AC000DA
-:105EA000003AE000003B0000003B2000003B4000C7
-:105EB000003B6000003B8000003BA000003BC000B6
-:105EC000003BE000003C0000003C2000003C4000A3
-:105ED000003C6000003C8000003CA000003CC00092
-:105EE000003CE000003D0000003D2000003D40007F
-:105EF000003D6000003D8000003DA000003DC0006E
-:105F0000003DE000003E0000003E2000003E40005A
-:105F1000003E6000003E8000003EA000003EC00049
-:105F2000003EE000003F0000003F2000003F400036
-:105F3000003F6000003F8000003FA000003FC00025
-:105F4000003FE000003FE00100000000000001FF12
-:105F50000000020000007FF800007FF80000014010
-:105F600000003500000000010000FF0000000000FC
-:105F70000000FF00000000000000FF000000000023
-:105F80000000FF00000000000000FF000000000013
-:105F90000000FF00000000000000FF000000000003
-:105FA0000000FF000000000000000000140AFF00D5
-:105FB00000000001000000000020100100000000AF
-:105FC0000100900000000100000090020000900419
-:105FD00000009006000090080000900A0000900C5D
-:105FE0000000900E0000901000009012000090142D
-:105FF00000009016000090180000901A0000901CFD
-:106000000000901E000090200000902200009024CC
-:1060100000009026000090280000902A0000902C9C
-:106020000000902E0000903000009032000090346C
-:1060300000009036000090380000903A0000903C3C
-:106040000000903E0000904000009042000090440C
-:1060500000009046000090480000904A0000904CDC
-:106060000000904E000090500000905200009054AC
-:1060700000009056000090580000905A0000905C7C
-:106080000000905E0000906000009062000090644C
-:1060900000009066000090680000906A0000906C1C
-:1060A0000000906E000090700000907200009074EC
-:1060B00000009076000090780000907A0000907CBC
-:1060C0000000907E0000908000009082000090848C
-:1060D00000009086000090880000908A0000908C5C
-:1060E0000000908E0000909000009092000090942C
-:1060F00000009096000090980000909A0000909CFC
-:106100000000909E000090A0000090A2000090A4CB
-:10611000000090A6000090A8000090AA000090AC9B
-:10612000000090AE000090B0000090B2000090B46B
-:10613000000090B6000090B8000090BA000090BC3B
-:10614000000090BE000090C0000090C2000090C40B
-:10615000000090C6000090C8000090CA000090CCDB
-:10616000000090CE000090D0000090D2000090D4AB
-:10617000000090D6000090D8000090DA000090DC7B
-:10618000000090DE000090E0000090E2000090E44B
-:10619000000090E6000090E8000090EA000090EC1B
-:1061A000000090EE000090F0000090F2000090F4EB
-:1061B000000090F6000090F8000090FA000090FCBB
-:1061C000000090FE00009100000091020000910488
-:1061D00000009106000091080000910A0000910C57
-:1061E0000000910E00009110000091120000911427
-:1061F00000009116000091180000911A0000911CF7
-:106200000000911E000091200000912200009124C6
-:1062100000009126000091280000912A0000912C96
-:106220000000912E00009130000091320000913466
-:1062300000009136000091380000913A0000913C36
-:106240000000913E00009140000091420000914406
-:1062500000009146000091480000914A0000914CD6
-:106260000000914E000091500000915200009154A6
-:1062700000009156000091580000915A0000915C76
-:106280000000915E00009160000091620000916446
-:1062900000009166000091680000916A0000916C16
-:1062A0000000916E000091700000917200009174E6
-:1062B00000009176000091780000917A0000917CB6
-:1062C0000000917E00009180000091820000918486
-:1062D00000009186000091880000918A0000918C56
-:1062E0000000918E00009190000091920000919426
-:1062F00000009196000091980000919A0000919CF6
-:106300000000919E000091A0000091A2000091A4C5
-:10631000000091A6000091A8000091AA000091AC95
-:10632000000091AE000091B0000091B2000091B465
-:10633000000091B6000091B8000091BA000091BC35
-:10634000000091BE000091C0000091C2000091C405
-:10635000000091C6000091C8000091CA000091CCD5
-:10636000000091CE000091D0000091D2000091D4A5
-:10637000000091D6000091D8000091DA000091DC75
-:10638000000091DE000091E0000091E2000091E445
-:10639000000091E6000091E8000091EA000091EC15
-:1063A000000091EE000091F0000091F2000091F4E5
-:1063B000000091F6000091F8000091FA000091FCB5
-:1063C000000091FEFFFFFFFFFFFFFFFFFFFFFFFF4A
-:1063D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
-:1063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
-:1063F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
-:10640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
-:10641000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C
-:10642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C
-:10643000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C
-:10644000FFFFFFFF0000000300BEBC2000000000B3
-:10645000000000050000000300BEBC20000000009A
-:10646000000000050000000300BEBC20000000008A
-:10647000000000050000000300BEBC20000000007A
-:10648000000000050000000300BEBC20000000006A
-:10649000000000050000000300BEBC20000000005A
-:1064A000000000050000000300BEBC20000000004A
-:1064B000000000050000000300BEBC20000000003A
-:1064C0000000000500002000000040C000006180C6
-:1064D000000082400000A3000000C3C00000E48070
-:1064E0000001054000012600000146C00001678050
-:1064F000000188400001A9000001C9C00001EA8034
-:1065000000020B4000022C0000024CC000026D8013
-:1065100000028E400002AF000002CFC00002F080F7
-:10652000000011400000800000010380000187008E
-:1065300000020A8000028E00000311800003950013
-:106540000004188000049C0000051F800005A300C3
-:10655000000626800006AA0000072D800007B10073
-:10656000000834800008B80000093B800009BF0023
-:10657000000A4280000AC600000B4980000BCD00D3
-:10658000000C5080000CD400000D578000005B0010
-:1065900000007FF800007FF8000000D50000150023
-:1065A0000000FF00000000000000FF0000000000ED
-:1065B0000000FF00000000000000FF0000000000DD
-:1065C0000000FF00000000000000FF0000000000CD
-:1065D0000000FF00000000000000FF0000000000BD
-:1065E000000019000000000000000000FFFFFFFF96
-:1065F0000000000003938700000000000393870061
-:1066000000007FF800007FF80000068E00003500D3
-:106610000000FF000FFFFFFF0000FF000FFFFFFF64
-:10662000000000FF0000FF000FFFFFFF0000FF0061
-:106630000FFFFFFF000000FF0000FF000FFFFFFF44
-:106640000000FF000FFFFFFF000000FF0000FF0041
-:106650000FFFFFFF0000FF000FFFFFFF000000FF24
-:106660000000FF000FFFFFFF0000FF000FFFFFFF14
-:10667000000000FF0000FF000FFFFFFF0000FF0011
-:106680000FFFFFFF000000FF0000FF000FFFFFFFF4
-:106690000000FF000FFFFFFF000000FF0000FF00F1
-:1066A0000FFFFFFF0000FF000FFFFFFF000000FFD4
-:1066B0000000FF000FFFFFFF0000FF000FFFFFFFC4
-:1066C000000000FF0000FF000FFFFFFF0000FF00C1
-:1066D0000FFFFFFF000000FF0000FF000FFFFFFFA4
-:1066E0000000FF000FFFFFFF000000FF0000FF00A1
-:1066F0000FFFFFFF0000FF000FFFFFFF000000FF84
-:106700000000FF000FFFFFFF0000FF000FFFFFFF73
-:10671000000000FF0000FF000FFFFFFF0000FF0070
-:106720000FFFFFFF000000FF0000FF000FFFFFFF53
-:106730000000FF000FFFFFFF000000FF0000FF0050
-:106740000FFFFFFF0000FF000FFFFFFF000000FF33
-:106750000000FF000FFFFFFF0000FF000FFFFFFF23
-:10676000000000FF0000FF000FFFFFFF0000FF0020
-:106770000FFFFFFF000000FF0000FF000FFFFFFF03
-:106780000000FF000FFFFFFF000000FF0000FF0000
-:106790000FFFFFFF0000FF000FFFFFFF000000FFE3
-:1067A0000000FF000FFFFFFF0000FF000FFFFFFFD3
-:1067B000000000FF0000FF000FFFFFFF0000FF00D0
-:1067C0000FFFFFFF000000FF0000FF000FFFFFFFB3
-:1067D0000000FF000FFFFFFF000000FF0000FF00B0
-:1067E0000FFFFFFF0000FF000FFFFFFF000000FF93
-:1067F0000000FF000FFFFFFF0000FF000FFFFFFF83
-:10680000000000FF0000FF000FFFFFFF0000FF007F
-:106810000FFFFFFF000000FF0000FF000FFFFFFF62
-:106820000000FF000FFFFFFF000000FF0000FF005F
-:106830000FFFFFFF0000FF000FFFFFFF000000FF42
-:106840000000FF000FFFFFFF0000FF000FFFFFFF32
-:10685000000000FF0000FF000FFFFFFF0000FF002F
-:106860000FFFFFFF000000FF0000FF000FFFFFFF12
-:106870000000FF000FFFFFFF000000FF0000FF000F
-:106880000FFFFFFF0000FF000FFFFFFF000000FFF2
-:10689000000000FF000000FF000000FF000000FFFC
-:1068A000000000FF000000FF000000FF000000FFEC
-:1068B0000000FF00000000000000FF0000000000DA
-:1068C0000000FF00000000000000FF0000000000CA
-:1068D0000000FF00000000000000FF0000000000BA
-:1068E0000000FF00000000000000FF0000000000AA
-:1068F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
-:10690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
-:10691000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
-:10692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
-:10693000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
-:10694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57
-:10695000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47
-:10696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37
-:106970000000100000002080000031000000418075
-:10698000000052000000628000007300000083805D
-:10699000000094000000A4800000B5000000C58045
-:1069A0000000D6000000E6800000F700000107802C
-:1069B0000001180000012880000139000001498011
-:1069C00000015A0000016A8000017B0000018B80F9
-:1069D00000019C000001AC800001BD000001CD80E1
-:1069E0000001DE000001EE800001FF0000000F80CA
-:1069F00000007FF800007FF800000344000035002D
-:106A000010000000000028AD00010001000902068E
-:106A1000CCCCCCC5FFFFFFFFFFFFFFFF7058103C41
-:106A20000000FF00000000000000FF000000000068
-:106A30000000FF00000000000000FF000000000058
-:106A40000000FF00000000000000FF000000000048
-:106A50000000FF00000000000000FF000000000038
-:106A60000000000000000001CCCC0201CCCCCCCC5A
-:106A7000CCCC0201CCCCCCCCCCCC0201CCCCCCCC80
-:106A8000CCCC0201CCCCCCCCCCCC0201CCCCCCCC70
-:106A9000CCCC0201CCCCCCCCCCCC0201CCCCCCCC60
-:106AA000CCCC0201CCCCCCCC00000000FFFFFFFF1F
-:106AB000000E0000011600D6002625A0002625A005
-:106AC000002625A0002625A000720000012300F367
-:106AD000002625A0002625A0002625A0002625A00A
-:106AE0000000FFFF000000000000FFFF00000000AA
-:106AF0000000FFFF000000000000FFFF000000009A
-:106B00000000FFFF000000000000FFFF0000000089
-:106B10000000FFFF000000000000FFFF0000000079
-:106B20000000FFFF000000000000FFFF0000000069
-:106B30000000FFFF000000000000FFFF0000000059
-:106B40000000FFFF000000000000FFFF0000000049
-:106B50000000FFFF000000000000FFFF0000000039
-:106B60000000FFFF000000000000FFFF0000000029
-:106B70000000FFFF000000000000FFFF0000000019
-:106B80000000FFFF000000000000FFFF0000000009
-:106B90000000FFFF000000000000FFFF00000000F9
-:106BA0000000FFFF000000000000FFFF00000000E9
-:106BB0000000FFFF000000000000FFFF00000000D9
-:106BC0000000FFFF000000000000FFFF00000000C9
-:106BD0000000FFFF000000000000FFFF00000000B9
-:106BE0000000FFFF000000000000FFFF00000000A9
-:106BF0000000FFFF000000000000FFFF0000000099
-:106C00000000FFFF000000000000FFFF0000000088
-:106C10000000FFFF000000000000FFFF0000000078
-:106C20000000FFFF000000000000FFFF0000000068
-:106C30000000FFFF000000000000FFFF0000000058
-:106C40000000FFFF000000000000FFFF0000000048
-:106C50000000FFFF000000000000FFFF0000000038
-:106C60000000FFFF000000000000FFFF0000000028
-:106C70000000FFFF000000000000FFFF0000000018
-:106C80000000FFFF000000000000FFFF0000000008
-:106C90000000FFFF000000000000FFFF00000000F8
-:106CA0000000FFFF000000000000FFFF00000000E8
-:106CB0000000FFFF000000000000FFFF00000000D8
-:106CC0000000FFFF000000000000FFFF00000000C8
-:106CD0000000FFFF000000000000FFFF00000000B8
-:106CE000FFFFFFF3318FFFFF0C30C30CC30C30C329
-:106CF000CF3CF300F3CF3CF30000CF3CCDCDCDCD66
-:106D0000FFFFFFF130EFFFFF0C30C30CC30C30C3AB
-:106D1000CF3CF300F3CF3CF30001CF3CCDCDCDCD44
-:106D2000FFFFFFF6305FFFFF0C30C30CC30C30C316
-:106D3000CF3CF300F3CF3CF30002CF3CCDCDCDCD23
-:106D4000FFFFF4061CBFFFFF0C30C305C30C30C3AC
-:106D5000CF300014F3CF3CF30004CF3CCDCDCDCDEC
-:106D6000FFFFFFF2304FFFFF0C30C30CC30C30C3EA
-:106D7000CF3CF300F3CF3CF30008CF3CCDCDCDCDDD
-:106D8000FFFFFFFA302FFFFF0C30C30CC30C30C3E2
-:106D9000CF3CF300F3CF3CF30010CF3CCDCDCDCDB5
-:106DA000FFFFFFF731EFFFFF0C30C30CC30C30C304
-:106DB000CF3CF300F3CF3CF30020CF3CCDCDCDCD85
-:106DC000FFFFFFF5302FFFFF0C30C30CC30C30C3A7
-:106DD000CF3CF300F3CF3CF30040CF3CCDCDCDCD45
-:106DE000FFFFFFF3318FFFFF0C30C30CC30C30C328
-:106DF000CF3CF300F3CF3CF30000CF3CCDCDCDCD65
-:106E0000FFFFFFF1310FFFFF0C30C30CC30C30C389
-:106E1000CF3CF300F3CF3CF30001CF3CCDCDCDCD43
-:106E2000FFFFFFF6305FFFFF0C30C30CC30C30C315
-:106E3000CF3CF300F3CF3CF30002CF3CCDCDCDCD22
-:106E4000FFFFF4061CBFFFFF0C30C305C30C30C3AB
-:106E5000CF300014F3CF3CF30004CF3CCDCDCDCDEB
-:106E6000FFFFFFF2304FFFFF0C30C30CC30C30C3E9
-:106E7000CF3CF300F3CF3CF30008CF3CCDCDCDCDDC
-:106E8000FFFFFFFA302FFFFF0C30C30CC30C30C3E1
-:106E9000CF3CF300F3CF3CF30010CF3CCDCDCDCDB4
-:106EA000FFFFFFF730EFFFFF0C30C30CC30C30C304
-:106EB000CF3CF300F3CF3CF30020CF3CCDCDCDCD84
-:106EC000FFFFFFF5304FFFFF0C30C30CC30C30C386
-:106ED000CF3CF300F3CF3CF30040CF3CCDCDCDCD44
-:106EE000FFFFFFFF30CFFFFF0C30C30CC30C30C3DC
-:106EF000CF3CF3CCF3CF3CF30000CF3CCDCDCDCD98
-:106F0000FFFFFFFF30CFFFFF0C30C30CC30C30C3BB
-:106F1000CF3CF3CCF3CF3CF30001CF3CCDCDCDCD76
-:106F2000FFFFFFFF30CFFFFF0C30C30CC30C30C39B
-:106F3000CF3CF3CCF3CF3CF30002CF3CCDCDCDCD55
-:106F4000FFFFFFFF30CFFFFF0C30C30CC30C30C37B
-:106F5000CF3CF3CCF3CF3CF30004CF3CCDCDCDCD33
-:106F6000FFFFFFFF30CFFFFF0C30C30CC30C30C35B
-:106F7000CF3CF3CCF3CF3CF30008CF3CCDCDCDCD0F
-:106F8000FFFFFFFF30CFFFFF0C30C30CC30C30C33B
-:106F9000CF3CF3CCF3CF3CF30010CF3CCDCDCDCDE7
-:106FA000FFFFFFFF30CFFFFF0C30C30CC30C30C31B
-:106FB000CF3CF3CCF3CF3CF30020CF3CCDCDCDCDB7
-:106FC000FFFFFFFF30CFFFFF0C30C30CC30C30C3FB
-:106FD000CF3CF3CCF3CF3CF30040CF3CCDCDCDCD77
-:106FE000FFFFFFF3320FFFFF0C30C30CC30C30C3A5
-:106FF000CF3CF300F3CF3CF30000CF3CCDCDCDCD63
-:10700000FFFFFFF1310FFFFF0C30C30CC30C30C387
-:10701000CF3CF300F3CF3CF30001CF3CCDCDCDCD41
-:10702000FFFFFFF6305FFFFF0C30C30CC30C30C313
-:10703000CF3CF300F3CF3CF30002CF3CCDCDCDCD20
-:10704000FFFFF4061CBFFFFF0C30C305C30C30C3A9
-:10705000CF300014F3CF3CF30004CF3CCDCDCDCDE9
-:10706000FFFFFFF2304FFFFF0C30C30CC30C30C3E7
-:10707000CF3CF300F3CF3CF30008CF3CCDCDCDCDDA
-:10708000FFFFFF8A042FFFFF0C30C30CC30C30C37B
-:10709000CF3CC000F3CF3CF30010CF3CCDCDCDCDE5
-:1070A000FFFFFF9705CFFFFF0C30C30CC30C30C3AD
-:1070B000CF3CC000F3CF3CF30020CF3CCDCDCDCDB5
-:1070C000FFFFFFF5310FFFFF0C30C30CC30C30C3C3
-:1070D000CF3CF300F3CF3CF30040CF3CCDCDCDCD42
-:1070E000FFFFFFF3320FFFFF0C30C30CC30C30C3A4
-:1070F000CF3CF300F3CF3CF30000CF3CCDCDCDCD62
-:10710000FFFFFFF1302FFFFF0C30C30CC30C30C367
-:10711000CF3CF300F3CF3CF30001CF3CCDCDCDCD40
-:10712000FFFFFFF6305FFFFF0C30C30CC30C30C312
-:10713000CF3CF300F3CF3CF30002CF3CCDCDCDCD1F
-:10714000FFFFFF061CBFFFFF0C30C30CC30C30C396
-:10715000CF3CC014F3CF3CF30004CF3CCDCDCDCD1C
-:10716000FFFFFFF2304FFFFF0C30C30CC30C30C3E6
-:10717000CF3CF300F3CF3CF30008CF3CCDCDCDCDD9
-:10718000FFFFFFFA302FFFFF0C30C30CC30C30C3DE
-:10719000CF3CF300F3CF3CF30010CF3CCDCDCDCDB1
-:1071A000FFFFFFF731CFFFFF0C30C30CC30C30C320
-:1071B000CF3CF300F3CF3CF30020CF3CCDCDCDCD81
-:1071C000FFFFFFFF30CFFFFF0C30C30CC30C30C3F9
-:1071D000CF3CF3CCF3CF3CF30040CF3CCDCDCDCD75
-:1071E000FFFFFFFF30CFFFFF0C30C30CC30C30C3D9
-:1071F000CF3CF3CCF3CF3CF30000CF3CCDCDCDCD95
-:10720000FFFFFFFF30CFFFFF0C30C30CC30C30C3B8
-:10721000CF3CF3CCF3CF3CF30001CF3CCDCDCDCD73
-:10722000FFFFFFFF30CFFFFF0C30C30CC30C30C398
-:10723000CF3CF3CCF3CF3CF30002CF3CCDCDCDCD52
-:10724000FFFFFFFF30CFFFFF0C30C30CC30C30C378
-:10725000CF3CF3CCF3CF3CF30004CF3CCDCDCDCD30
-:10726000FFFFFFFF30CFFFFF0C30C30CC30C30C358
-:10727000CF3CF3CCF3CF3CF30008CF3CCDCDCDCD0C
-:10728000FFFFFFFF30CFFFFF0C30C30CC30C30C338
-:10729000CF3CF3CCF3CF3CF30010CF3CCDCDCDCDE4
-:1072A000FFFFFFFF30CFFFFF0C30C30CC30C30C318
-:1072B000CF3CF3CCF3CF3CF30020CF3CCDCDCDCDB4
-:1072C000FFFFFFFF30CFFFFF0C30C30CC30C30C3F8
-:1072D000CF3CF3CCF3CF3CF30040CF3CCDCDCDCD74
-:1072E000FFFFFFFF30CFFFFF0C30C30CC30C30C3D8
-:1072F000CF3CF3CCF3CF3CF30000CF3CCDCDCDCD94
-:10730000FFFFFFFF30CFFFFF0C30C30CC30C30C3B7
-:10731000CF3CF3CCF3CF3CF30001CF3CCDCDCDCD72
-:10732000FFFFFFFF30CFFFFF0C30C30CC30C30C397
-:10733000CF3CF3CCF3CF3CF30002CF3CCDCDCDCD51
-:10734000FFFFFFFF30CFFFFF0C30C30CC30C30C377
-:10735000CF3CF3CCF3CF3CF30004CF3CCDCDCDCD2F
-:10736000FFFFFFFF30CFFFFF0C30C30CC30C30C357
-:10737000CF3CF3CCF3CF3CF30008CF3CCDCDCDCD0B
-:10738000FFFFFFFF30CFFFFF0C30C30CC30C30C337
-:10739000CF3CF3CCF3CF3CF30010CF3CCDCDCDCDE3
-:1073A000FFFFFFFF30CFFFFF0C30C30CC30C30C317
-:1073B000CF3CF3CCF3CF3CF30020CF3CCDCDCDCDB3
-:1073C000FFFFFFFF30CFFFFF0C30C30CC30C30C3F7
-:1073D000CF3CF3CCF3CF3CF30040CF3CCDCDCDCD73
-:1073E000FFFFFFFF30CFFFFF0C30C30CC30C30C3D7
-:1073F000CF3CF3CCF3CF3CF30000CF3CCDCDCDCD93
-:10740000FFFFFFFF30CFFFFF0C30C30CC30C30C3B6
-:10741000CF3CF3CCF3CF3CF30001CF3CCDCDCDCD71
-:10742000FFFFFFFF30CFFFFF0C30C30CC30C30C396
-:10743000CF3CF3CCF3CF3CF30002CF3CCDCDCDCD50
-:10744000FFFFFFFF30CFFFFF0C30C30CC30C30C376
-:10745000CF3CF3CCF3CF3CF30004CF3CCDCDCDCD2E
-:10746000FFFFFFFF30CFFFFF0C30C30CC30C30C356
-:10747000CF3CF3CCF3CF3CF30008CF3CCDCDCDCD0A
-:10748000FFFFFFFF30CFFFFF0C30C30CC30C30C336
-:10749000CF3CF3CCF3CF3CF30010CF3CCDCDCDCDE2
-:1074A000FFFFFFFF30CFFFFF0C30C30CC30C30C316
-:1074B000CF3CF3CCF3CF3CF30020CF3CCDCDCDCDB2
-:1074C000FFFFFFFF30CFFFFF0C30C30CC30C30C3F6
-:1074D000CF3CF3CCF3CF3CF30040CF3CCDCDCDCD72
-:1074E000000C0000000700C000028130000B815832
-:1074F0000002021000010230000F024000010330C0
-:10750000000C0000000800C000028140000B8168F0
-:10751000000202200001024000070250000202C0E7
-:10752000001000000008010000028180000B81A80B
-:107530000002026000018280000E82980008038031
-:107540000010000000010100000281100009013854
-:10755000000201C8000101E8000E01F8000002D895
-:10756000CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC5B
-:1075700000002000CCCCCCCCCCCCCCCCCCCCCCCC5B
-:10758000CCCCCCCC00002000CCCCCCCCCCCCCCCC4B
-:10759000CCCCCCCCCCCCCCCC040020000000000067
-:1075A0001F8B080000000000000BFB51CFC0F00350
-:1075B0008AB7B13130ECE644F0E98159181818F86F
-:1075C00099C8D7BF1168C04E20BE01C4075948D71B
-:1075D0007F551AC15E26C9C0700A8827883330B427
-:1075E0004A21C4ED651818EE01F92BA16272403DE5
-:1075F00073A4C977F3281E3CB8D014951F620CA160
-:107600005F9840E82234F950A8BCB81E842E36C5D5
-:107610006EAE841E71F6A7A9A0F2BD55F0ABCFD512
-:1076200040E5C7A2A90F81F2017EE9B234D8030078
-:1076300000000000000000001F8B08000000000098
-:10764000000BED7D0B7455D5B5E8DA9FB3CFFF6421
-:10765000278470123EEEC400C1063C4280A0A83BC5
-:10766000FC1A7DD41E1025E5A11C446B004922A6FE
-:10767000D78C96D76CC8870450E3E751BD457BA0F3
-:10768000D88B0E5BA3A68ABDB43D887AA9C3DB2242
-:107690005AA52D7A83FA2C58A0B1572ABD4FCB5B3F
-:1076A00073AEB592BD77CEC9C74F47EF788D43769D
-:1076B000D6DEEB3BFF6BCEB95634D94FF22E27E422
-:1076C0001CFCD0A7291142A6F73DC92D5932C92368
-:1076D000E41B3E823F1FF923534816210D3EF6BCA2
-:1076E0003D10D905CF2D8D84A426C2F771491221F2
-:1076F000244848899A0B2D02B1870BE15977617CA8
-:10770000323E67C23387C8848C84F218FDBD20EBFB
-:10771000FB9C42FF399AA880F114F68AA8A43C96F3
-:10772000C2F6DF226446DF3C48DD57F578B86FDEED
-:10773000EEA7A26B24C5EB9E837F94E5598950E6A2
-:10774000FA0D47A5C79FB7D51F4FC2B9382F95A8C7
-:10775000382FDE9E108BD8E7E7EEE7A346F2F8F36A
-:10776000E3FBC32DD3B8026E6D8D3E7CB636EA24A2
-:10777000E5258436333B4BE93344CC5DA5FDDBCDB9
-:107780002312871F9F0F8C63D0FAF47F42E1DE9CA7
-:107790004B9241C0214938E0D61C5AEC33D3F42730
-:1077A0009E2497C2AD84CFB9A8FF7AFD302F0A0777
-:1077B0003FCC2B0D3C97C2BCA6F79F97BFD83DAFDF
-:1077C0006A6287CF70E7159844C821C0876A128221
-:1077D00078B9CDD19FAC9B56779AFE08A70BD5E020
-:1077E000EB1B229E822572DFF8000723E0A02F6F9B
-:1077F00034C7496F6EBA067820BE3A387CE20AE395
-:1078000007AB0F8FF4199A1D93803568F110E02DA6
-:107810009F30F8E557B7DE2A4F2194D53A0F4EA096
-:10782000F0CBEF5EB99040F9E8152780DF9ACBA640
-:1078300056CEA5F5B2CB63AF2CA04D423143027AB0
-:10784000DD0A9D15407F5FB32A68B909FAA365CBAD
-:10785000BACAB4106EA6036E1472864ACB1EF8B56F
-:10786000280DFC482F1EA473DEFEED33C1CF436C00
-:10787000F8437E5EEFA0CB8C78BF91E1CBA2FF01F5
-:10788000BE46101B5FD37EB22B35075EB25CE33C75
-:107890000ABF20BC6FFD9B8C97439EF41994CE3D8C
-:1078A000A5B29EA478CA26B16CB58CE263A14A4009
-:1078B0008EE5E4EA1290C360786926A412F89F4A24
-:1078C00007B2C826E77ECEF9AB60CDEE9DAD749CC5
-:1078D00033B34331A895AFD3B94EEDBF9E3B40BE05
-:1078E000786DE5B2E74802C7EB3C5844E76595C9B7
-:1078F000B18729DD6C2D3DACDBE5E3B15EF9E2A695
-:107900000F62A833B83CA0F0514A65D31FF9ECF4DC
-:10791000A17C4AFA08DFE8C4C770F1757A98F4F1DF
-:1079200059C71378EDCF571B055E7D847EDF52B2B9
-:1079300078407DD51FAF4F92046D172A2566324DD2
-:10794000BBFFB4EB0BF7D326DFDD72541935A36A06
-:10795000E74078CB75AE57F4EB6F508C7747D0A2E9
-:10796000AAA37CD5B81E688FDE63114A776740F6FC
-:107970005078281D17A5A04C8A49EC61D64D4AA223
-:10798000657FD44C6E413A48225EC4FCBC86EC90C4
-:10799000B36AAE530E932A4BB2CFDFDFA0E13C3483
-:1079A000182F17EC02DA2105851A2229A05B41AFB6
-:1079B000A092CE9D0F65A79DD1664C25E9F0A072DF
-:1079C000BC4B92A0D76F0D4DBEB8C75BE29CEF9049
-:1079D000DB8554E33DD1268D9CEE6BA792F7047EA8
-:1079E00028102F13761DC7D3660FD92B5D48E5C12C
-:1079F000986BC152209BE1D32C6A87C0932A9FCDFC
-:107A000063A6EA4057648FA4C23C71488A4742F596
-:107A10001DD40B4A06F623FBEA90FE9490894FF1A1
-:107A20003DF3BCD8F8BD655FA206F0531DD58C2D83
-:107A3000748E6B15D3D80874318DC9A7EAE88479A0
-:107A4000A0EF3C129BD7B7A57C5C879AD39687762C
-:107A50005906FBAE5AA52A7F2A7CDF3661207E229A
-:107A6000494F4FB70D9E6E7BF06689DA835FA2BFE8
-:107A7000CC2433018E7F8A2DCE4A0D80AFF71B0FA9
-:107A8000EAEAF83E7BD0FD7DAD42EAD2C98156C913
-:107A9000C7F8D26769601F8875AF0576A720DD1625
-:107AA000DBC4D69B9B8BF05DBBE717BA6AE3BFB51F
-:107AB00054CD78A7F65F8F80B7E8A7B77DF2A0A373
-:107AC000BDBB5D6F7F425E507B18E85CD041504A81
-:107AD0006C95E87B6F6CB105EA6CED63150CFF19D2
-:107AE000E6DF8BAF4F397FD16E30BAFAD3EEA656B0
-:107AF000D04FEF691D575D4CE9E8F74F28B14DF4C1
-:107B00006BF58E89F3C05E7A8FD3B7C0D389DD4D14
-:107B100079E9E823139E7E21F9711C415FD5F2F2C9
-:107B200001E96130FA7ACA4D5F9D577F21F475C82B
-:107B30004D5F1C1E273BD9FAC9FD23185E38BEDCF9
-:107B4000F8C988974FDBAE3F3DFD5AA27CEDEDBCF6
-:107B50003A3D3DF1F90A7C7DD6F90E4647798669B2
-:107B6000EA74FC51D48E91407F9491588ACE53A7E9
-:107B70000FD45B31A6B7845C12ED4F4BCC4E53C98A
-:107B80006BD85E21294B477BDB6967CC57E84BDA22
-:107B90004F7309497A715F64FA504F95A884E93FA1
-:107BA00033943F03EC08FEA3CC8EC1BAB3C0FE07EA
-:107BB000FD359BEB5F89DA5B747DA132E7BE37E070
-:107BC000B23F14BE5FE8676F0D737FEC97F9FE3824
-:107BD0004842A88FC4FE38037FF6EE8B395C476AB3
-:107BE000C494E9BAB5839EE42609B41B41FD4C8ECA
-:107BF0004A49E62F20256037AF970A62A00FE83E7A
-:107C0000AF278B7E7FEF070AEA878668DD8A1658E2
-:107C1000F6B50D13BBE9B8F7349269C59EBEF1EE17
-:107C2000513B7C00EFF6E2F50EBBF6BB52A250B61C
-:107C3000E91D7F549B563C0D8653DFEEA6F090293C
-:107C40002081FF02A1FBA22F18003FF6BE174EF6BF
-:107C5000B2D2BF9C0B364F011653B02F6DA7B63B67
-:107C6000B9188AA3A50A4A07ED1EFEDDFA4D05ECF8
-:107C700077DBFDACBC63D3AC8D169447F2FA561596
-:107C8000FB9ECFCAB76DFA4105EC0BDAB2E99AA9AF
-:107C9000BE6EF324ABE269F8FB365976D85F4DC669
-:107CA00082F2FF43D7E1F79917BD40E1498112B352
-:107CB0000CD26B97150ABF41C7DD952500FFD7147D
-:107CC00002F4EC3762F19B0CA43FA47B7FAE19DB7E
-:107CD000424B0DF4850CF528DE1E96605FC7EC3133
-:107CE000F0E79C43FAA57C41BFAFCFD6B13ED16D42
-:107CF000F659519F3DD68B2717DEEE557BFC80B79A
-:107D0000EF8DF9F01713693FD642390664F3BD0DC4
-:107D100045D92B6D787CCC37A70AF0489A73D12EC1
-:107D20008992DE1F13CA62DF5C403A2BC0781C4385
-:107D3000251FA1743A2EDE53012830AAF4E7708F74
-:107D40004BE6E9EFA15DA548E7BE34743BCA0D07D9
-:107D5000DAE3A845543E8D90483C9DDC5DA9E6A041
-:107D60003C185149D73B809FE09B549F30FB2CE14E
-:107D700003FF56A67132CDF333C073934CC71D4D2C
-:107D80009208A7C1E09A099EADD127B3515E7FCE7C
-:107D900070CDD4DE0DCF1112E397956A39F2CB5036
-:107DA000FD3B6D7C3FD5027E38FA6CE27E38777BF6
-:107DB000BFDA416269F0EB379CFE210DF625B67201
-:107DC000BD6C307D1072FB89189EDD7A6101D70B86
-:107DD0002D51AA17983C5C087A20C8E1DF02BB7ECF
-:107DE000909F6192B4E8F720F707915226FF7DF447
-:107DF0003FE0B751554E7DA00D511FBC2BC55F9084
-:107E0000910E8904F3BB5FEAB86202D04F3EB3C75C
-:107E1000A337B445133638D4CB4CDF097D962C16E6
-:107E2000FA8C20FCCEE37348920E3FE8C307362C51
-:107E3000CE42BFDD8D41871C8AB62EC6FDAF8D9E1A
-:107E4000D12FDAC1FDA399F0A76BC9443A7958A89C
-:107E5000307918317B52E0F34342CEE32E434ED6C5
-:107E60000CFEC4B10F8B4CED39783E5DEFCE8BE448
-:107E7000D826DA4E9DADA63C14BE6AF98B55127D0C
-:107E8000EE2C64F0B76611A4D390B1E08402FA58E6
-:107E9000ED467F4DA8D2BD2FB69515E8A7E77AD459
-:107EA000DF763FF500FBB8A13E9B28BCDEB6F13F74
-:107EB000855C4AA1EB50371003EC09D5A4223102AE
-:107EC0004F3D0FE8453563217C765754C2F3BCD94A
-:107ED000F14AD9A6075433BE05EA8FF8CA7DEDB042
-:107EE0005EF526595624C6073936789B4AA1633F6A
-:107EF00097ADBBFCA589D62AD4EF8646C617F69F58
-:107F000077BDAC72B9E7A417412703C8BBCF441FA4
-:107F10006FCAC25FEDC4BF834E8AFAF02BDA85FACE
-:107F2000F9AB9CF875973F6FBCFA014F141FE751EE
-:107F30003C017D9E379BD123B547D17E7AC0D76166
-:107F400002BC1F2836644BEA6B175672989FF92CB7
-:107F5000DD6851BBE7FE95DB4D68975F4C6580841B
-:107F6000CFB4FEA37A59C376542E542ACC6E97C050
-:107F70001E9FAF6CAB82F63B295E81DF77027F43A9
-:107F80007C20A1A11CAE97DB2B36D2BE5B8F4AB200
-:107F90000246ACBE14F1EBE7FCFE912751097EC806
-:107FA0002DFF4B26BB0CD04B03FBBD9A38BE4519A9
-:107FB000FC0D609F8CA9D3A702D833B5DB5E275791
-:107FC000A65B57B5C2F07F47DDE10E344F9F77EED9
-:107FD000473CCB4DA048D897542B36FA0E97317FAB
-:107FE0000749D0F5407D4E371F150E4CAF0FBAE64E
-:107FF0003F96C753DCF55E56B8BFCE60F03244FF03
-:108000001B07EE5FC0E76C9BC2E323D40043221E34
-:1080100049ECFA5BB9F15005BCA75CB709F0B55D56
-:1080200026D5CCDF1C473D14E1E3ED2CCFC1F60B88
-:10803000552647C79AFA16C0F7D866192C05F2B824
-:1080400062E0FB51CBEBF67B281EDA0B492C64E097
-:1080500010D8EF8BE335A4CBFC5CA6C7F2EB290963
-:10806000D07AF9A52469D0F6EDFB1FA8D068394273
-:108070003754600AFBCA193E7D252406A690C72204
-:1080800029997D4F424C5229EFB140951E183F036C
-:10809000F75F77E69298D7E8931B82AEEE6CBEC787
-:1080A0000F7AE481E27BAE9800FEC65215FDE4E44F
-:1080B000630A27E14F54205E163761BCF6596CDE27
-:1080C000F40DE253D5D9FAC7DC3F1BF9A43DFC34CB
-:1080D000CEC35A4762E3B15E8C60FC860A54F05707
-:1080E0003655337BD78D8FF524F1B832DD4EAF870F
-:1080F000906EDA3F51F8BEE0C58D60E78F835F690F
-:10810000F9974D7FDC381CBB45C40F85DDB245EDCA
-:1081100044BEB728CF815E12768CBFB813C7FDBFAF
-:108120009CDE87DABFBFC4E96F75DB356E7BA65E68
-:10813000D61DF6AB7B5D1F795257C0FCB6E4537E6B
-:108140004FA3077E03FA9AB6DF115DFCAB89465F49
-:108150003F7D72C8C0EFA23CE6AC86F8197A7D2A52
-:10816000F7608F6632BE1A2BE4D037285F0D107F80
-:10817000147CF511151287804FD40EA42F6296201F
-:108180005F097E51BA3BDACFA7F460D4CBE0B906E1
-:10819000FE2239B45C48E93D65B38784BC504B3B53
-:1081A000E313A5FE74F7A021231ECF94317F7596AB
-:1081B000D56D4293606927C6F5285DFD17D095AA55
-:1081C0002725C0EB98FB17E0BA7EA93056F7AB2CF9
-:1081D0007EEC5EC7CF397C89BE1BED793F1B8EB22A
-:1081E000F87D31363F579CBDFE5703C6D9FD319708
-:1081F0009D334C3F428ECAFD08DCEF3558FBE1C68B
-:10820000D795B323903E7ACB19E4ED4D2AE78BA3A3
-:10821000BB1C70E9070F65476CA0F9F9859FFE53F9
-:10822000C60550870D010E6E385EA23AFD879F3756
-:108230001CDDF1EF97B8DC1F4C1E044D33252BE0FD
-:108240003F23CCBF1322DCBFE3A4F79DCD32DA215C
-:10825000C1B0BC134CC9ACFA6ED4C1627C4AEF55B4
-:10826000AA8DDE47971E4A413BB73ECAA4870693B4
-:10827000B7AB7CE60D2ACAADF4FBF1BE7C03CA2580
-:1082800069F20D32E2B5EEF3C937182ABC7BFD9BCB
-:108290003C7FE0867241C7C6D2DF51B8AC3EE821D0
-:1082A000E897F998AECE16575BCDF78137F07DE4AD
-:1082B0008D241E818FA7885C09FC728A1C8E4CB3AA
-:1082C000C993FB548DF14B9BE76DF0AF8A78F94D64
-:1082D0001DAC2CE673F3FDCEF2D7C9E23CF0EB7D8A
-:1082E000FD3E0FE26BB5CBBFD6AC32FD7133A96B4F
-:1082F00005BCB5784815C8B11B74A28EA0A6EBBA10
-:10830000671E9CB19296BFCBED91F7A95C366C715C
-:10831000D035A1A406F87DA76BDAB59710689F6CDD
-:108320002D807D5A36C17DAB1BCEABDA9CF31B6C26
-:10833000FEEEF952F2C2F9669A87BA474A6B4F3F8E
-:1083400022E40DC757A6BC2A914FF50B20205ADF17
-:108350009A43D8BEF3AD60B209E535CBA71AACFDA0
-:108360002F55463F9FB6FDAB83B45FE7EB5900CC7A
-:10837000D6966BC5C12F24E28235A4CE1C4D7F5505
-:10838000F72DB246135BBDE810EB150F5C2FD3BC85
-:108390004FE83E4BBEB06FFEDF9512C7D434F3BF3B
-:1083A0005D49D440FF5EC083024F15F18D7E608A27
-:1083B000DF5A35D4266541BE5317EE03FD86EAA089
-:1083C000875AF805E45A09936BC112E777B77FF82B
-:1083D0004355C4E153C87F188236C07E08A514F007
-:1083E000DF94AB277BEBD3F16A605D1742298E7275
-:1083F000A35E67F56B8871D7EC32E43F8C3FD4B74E
-:108400009F8F71F5FA9106FA77551233B10F17DD88
-:10841000D59E9548D2A60F6BD51E0DF8AC96DA45C1
-:10842000F6F7EBA38AC34FEB7E7AA8E51C2A817D81
-:1084300092CCFC483A2DDBD6FDA70E89E7AF185940
-:108440004B06F0DFAD8F327FF00DEDE3B398DFD058
-:10845000297F4F3732BFDCBF3DF67D0DFCFCA71EE8
-:108460003D7615C07BEDBF2AC407F91B8F85490AED
-:10847000EDB1A406F6D89A2EC54CA6CDAF6862F130
-:10848000CFC7C388AF354F7A930B69FB354FBF33E6
-:1084900085D0F99DDED4F3E268B09B1F95581E820B
-:1084A000D53DE56AFA7E8D4A56A4F31B4CF630F9A9
-:1084B00073F2D96015F0B7B467FFF5D86FE7528F44
-:1084C000D7B6DF2EF678906F693D66973F2225C7B5
-:1084D0004BE9E6C7F23F4E3E22B1F9EDF524FD30FF
-:1084E000BF3D3BB5049D47ED9E0F509ECC7DFC8764
-:1084F000118043ED5EC5A1076AF72829EF147C1EA1
-:108500008327C48DA41940279C5EBAD661BCA8A657
-:1085100073EB07E0C7A8DDEB946B142EB114C0F524
-:108520000D25B610CA4FFD4BC4A0A07AFFD0C311D1
-:10853000802BED77A59605FAC649DFD0FFD99CFEC2
-:10854000FD11D283F1BADACE76365ED7577E0F7A36
-:10855000A5D6253FDF875FF2FBDB33D7785CF6CC0F
-:108560009EA1C5EBD6FEF0CC43161DF7E4937F78B1
-:10857000C8A2F3BFE5AFFFF9D0B7803F7FE6D74190
-:10858000FED73EFAEB08B1D163AD87F1E3E9B1C4A0
-:10859000A27B5472FA37DE24F84B4EFFF4F7E30C5B
-:1085A000BAEED34FFC25CFA0F5EB7F3A7F14C0A1E4
-:1085B000FEC773470DB4FF067A4D7AEDF34A225E8B
-:1085C0008DBD123382F6F1A70B3F07BA0E8C83796B
-:1085D0009E3AE28D81DBB996BE6B980AF85A87FA0B
-:1085E00018CA1B289C6B1EDBFC01C889FEF0B6462E
-:1085F000CBE8AC4F8D06A77D4DD73B0B106FA40782
-:10860000F5A8BB7EED6B149F1766C6DF19F2B106A5
-:10861000F2AEF6B176365E27C55FA43FFE4EC12F9F
-:10862000B3FAE3EF0E17FECE905BBE970F798D5D28
-:10863000231C7152F1EC8B0FC6B3E203C80B210F60
-:1086400006836FB5C4E6B5CC633EE801BE7A32D886
-:108650008BDF8580DF1F9E1947287D1CF7F45C0F98
-:1086600072B3E7A75E7D177DBFE6A76F209F9DFED3
-:10867000F12B9A81F9992424E5F13C31F67308E451
-:10868000700DDBCB91DADDE19437D287A79AE4A2B3
-:108690004A2382EF8FE1FB24A3FF9AE4FE25521ABE
-:1086A000BCBDE1296276407224C265DDEEDF69CC93
-:1086B000BEECC3A7540EF83CB600DE67C2A758BF95
-:1086C0000EEB9F69C3EB6EC6B7EEFA35943F41EFF0
-:1086D000F5C36F527A039EA7777A55D07BA7C1FE68
-:1086E0000AF5C77B1FFC99FD33DCFDCA2B6EFE1615
-:1086F000F1630E87CCF461713B60E0F50D177E3FAE
-:10870000F7180E3A12703CF9717AF97F8ACB8D1AFC
-:10871000625516D8EC139F87DA27905F46E2D6E8B9
-:10872000C2BEF99E847D04A5BF938F2A18AF69ED60
-:108730003C8072DC2D2F6A48FA7DFB5F3DCC5EAC3D
-:10874000D9BB7F0AC8B593CF3D8BF459F3D8310D0F
-:10875000F62F2FEE794AEB2EEDE307D00F499B7EE3
-:1087600038F9A3FD53983C48BFFF0D6AACFFDA7D92
-:10877000CEFE6B1FFBC0D1FF5AAB5363790C038F46
-:10878000F3BE6A2E85F5BE7FC843409EBEDFA9A416
-:10879000F5BFF670FD28E0D4FACA82DF419CBFEC39
-:1087A00070C0003DDAB5C91C7507D86B873D04E47D
-:1087B0003751CD3F7869B9EB9500C633BA0E5FAB40
-:1087C0001836FFC4332E78CE7CCD9A1BA6FDCDEC97
-:1087D0008E97C116CA2D37CA8FD27DA3DD7FF54A89
-:1087E000E52890FBCD60CF4F84F16251F07F289156
-:1087F00005952C7F50D6FD69F537EBCF138A63BE04
-:10880000A047977B7DB6488F62BFC5FD4DADA1F4F3
-:10881000FEE8059AD817D0716D7290DAAA55E9F082
-:10882000364B637648A6EF976ACCDF93E97BC52089
-:10883000ED7BF99BE3470BCBF174F39EC6FB71FB19
-:108840005733C9030FEFA74C331CEB05782FB2E564
-:10885000C58F26C98D90274A4221773C3AEEB3C78F
-:10886000A3AB0EED87F873EED5FBF201FE11D2AC8F
-:10887000BF87763C899D1BC08E75C79FDD7989991E
-:10888000E2D1BE50CD9114E9DF5FFFF8BB897928B2
-:10889000CD63E6F90A6DF1F766BD5FFC7DBD46C7A5
-:1088A0006DC9808725DA9C7FD280BE649248F77DAF
-:1088B0000BA79BCB49F7532B619E3116BF9FED82CF
-:1088C000D7A51C5E3F3B9F2E9CAA9E0A62A81E0A4B
-:1088D000DFB94BCC661081F397F7ACDD0F7C26E255
-:1088E000F7D644F95C70E8F01B6E5EC42ADFE27BC9
-:1088F000B521E445103D27AD5EE89B87C5F755518E
-:10890000DC2779389F1D78F3661FC82D95242A0B24
-:1089100061BFC4E39A986F4FFBCB4BF98949E7AB32
-:10892000E906DADB79A9D50FDC0471757D0CC62365
-:1089300094B397A0FFD0DDAF128D59980F16322A4D
-:1089400014DB38ADB92C3EA3EAF1B479C3ABB4C49F
-:1089500013B05EE5EC65D8AFEC8B613D121A5ABEE0
-:10896000EC77AE8E207C7D14BE201F1164B02E9E4D
-:108970003775F7D511D433FE839E9DF0DD1F6279E4
-:1089800054B7CB8118E459B9F3A82ADE6A27D05F1F
-:10899000EB3109E328827E5B0BEBCE03393E401EB0
-:1089A000D54B9ACDAF9E298FCA1FBA11F3A8FC9F51
-:1089B000368FCA2A9807F6586B361179559644E7D0
-:1089C000D1CAF3A2FEA3F5A5B9A09F5AFDE2FBCB45
-:1089D000734D7BD95A7F00CB3CEF6AB4B7BD09EA2F
-:1089E000E78E26759DE8CF33C93536391BF1AA08C5
-:1089F000E77FD6CC7735479E7CD4115F3AF0E666A8
-:108A00001FE86FFAAC2C02F851BA02BB3D2FD54ECD
-:108A1000ECFA483C051DB5160F1CBF53CF5E847E93
-:108A20007C51F6E949D34C537FBE8FD91F827E7D9E
-:108A3000B924097AC967241EB809E83937140B32FA
-:108A4000BAC438595B08DD53FDD6D1567C03C6DB6A
-:108A5000CEE804B95ED071FFF95FC6E75F64615C80
-:108A60002244309E96791D65B88E559A19F6DAE043
-:108A7000987B5EFABCD4BBBD6C3D2DF1E52CEFAC10
-:108A8000DA198715791AA27E504A1478411EE6B287
-:108A900038ACEC63FCD6872FAA2A6CFECD26B2DC5C
-:108AA0000212509777E2D146554F62FD127FE27C69
-:108AB000AF233ED7CDE2BAAE78E27CE516C6DF83BF
-:108AC000E04F9CCBD80A71B789109F8BF2F37D06DB
-:108AD0008FD3992CAF28033DB5150F1C87EA688CFE
-:108AE00061FBBB1ACB59BE9244B85F3BD9047402F8
-:108AF0006E0946F73F6802BE092B822F7E88E53B50
-:108B00002556BEC9FBCC5CC8373CF0E61B55AB28EC
-:108B10007DB49A01E4FFC1D6A72767205E873B4E4C
-:108B2000FFF5B271DBCC10EE77075BB79E62E30E08
-:108B3000751C115FEB5B9F0FC769350619A7838D05
-:108B400033F8FC199FDCB17F35E62FF828FFFBE9ED
-:108B50007BDFEC1E9248D37F16E79F036F7A515E4E
-:108B6000B7E5B2FC284F49C8644E4067FF9ED2BCAF
-:108B70003978DEA1EC02CC9FBF637F3BCA190DC6DA
-:108B8000A1553CB1D04AD62E61C239DBC83C82F136
-:108B9000674F49DE2A78DF403AE273400F97CB2CCB
-:108BA0003FB9A4E426E8271BF892CEA3DCC7F69DC4
-:108BB0009E928B6F86FAFBA7BF9E68023895333A68
-:108BC0002007F31D706C358AC4B99D01F9DE53EEA0
-:108BD0008C5B109F33FF93A84B306E4EE54287D7D6
-:108BE000665752BD781FF23329B3C0DEDBFEB56B8A
-:108BF00063767EFE672DFE1D565FE46B093E4F9F38
-:108C000037D79A2BF2E6123EA50CCE29F5E6532F64
-:108C1000CCB7E77FF17CEA90C8A7E6F1CC0EFA5F0B
-:108C2000BAFC39F739C6CF2B9FFA292FDF0F07C9B6
-:108C300058C8A7FE8987C4529017F36B250679316F
-:108C40006EFA70F7E73E07D06B8F64E0E7F7013804
-:108C500036B9979F70E1ED463FC6E7C478CF837C75
-:108C60002A1D9C4F47573BFB195BE73C9F755E8372
-:108C7000335E55681538EA9FDF56E4F83EBEE302DE
-:108C8000C7F789F74F759427252F76D4FFD29E39E1
-:108C90008EF2E4CE2B1DF52FDCBBD851BE28B5CC0F
-:108CA000517FDAC11B1CDFA71F5AE3F83EF3C87AD5
-:108CB000477956F7371DF51BA87902F92C7040004B
-:108CC000F7ABDB46CB76FA6CCFA67A250BF3B8353B
-:108CD0009ED48FF166968BDC9767E06EA7146BA627
-:108CE0004EF9573126CCD331CFF046E423A5386F67
-:108CF0008E81EF672C00BF132963E7B444FCDA537D
-:108D00004C527EC8EF0BB9F0EB8A4B7B946D29C0B7
-:108D1000B376F4CB07A5487FBC7AA2EE7CC6A1C58A
-:108D2000B555E3B3E507E4F9385F8CA57C817EC4D3
-:108D30008F15D8B7907961B40F6CFB1B84A3D8DF73
-:108D40005CE623CD0053C11715CB7B46BF80D5C44D
-:108D5000BEC62B0F272FB9BF5EF1A2DD25E4CC6084
-:108D60007A45494E73E421B89F54FE95F9609F1EE1
-:108D70005986F2A8775FD02B1FE333E1BB478DA163
-:108D80007CEC957F7B0A1C7261A8F6995B4EDF052F
-:108D9000421FCF05A597D711C80BA372E9CEABAF81
-:108DA000C23818A9278EF3807955711FE83D6A975C
-:108DB0007DC567DB3F47CA997DF6F766A78660BD2C
-:108DC00036F927EC5501D7118575718CEB85650255
-:108DD000FBAAA6D9B128F801DBA08A6D9FF65DDF5A
-:108DE000F958BF39A4C9E02F6D3E381FE3035E7FF9
-:108DF000DC0779CE4D9E7825ACAB295BD6D3E53B1D
-:108E00006DF631FF8CD6109CB67B00FAD034BAEFE9
-:108E10004FB3DE7FF131BF4BB3BEF820E8B99CB051
-:108E20006640FE44EBFE598B305F77A1AAC3BE9625
-:108E3000D04DDC3BB6B8222171F46769B932EA45FE
-:108E4000AD2182E30F36DF5B7DCCCFE06DF00F38D4
-:108E50005FAF96DE4F9169BE9B61BEB983CFD70BE2
-:108E6000F39560FC108EBFC9C7F0E886BF87986D88
-:108E7000F368BD96635FEE28468A61F97AF72E9C07
-:108E80008A744A05B5837EC53E82D2EFC340BF6275
-:108E9000FF2ECEB3DEE263790902AFC460FE881113
-:108EA0000915F7BD3909B6FFED931F8C8E723C3161
-:108EB00082E7BFC6A8189704378DDD8FA1F8D9BE09
-:108EC000C77B690CF1D5FE15956C027A2BA6EB8158
-:108ED00073B90759DCA9DD13AB8A87FAC613EDDF36
-:108EE000E1FB40952CC9C27B529485D174F6672F63
-:108EF0009D73B8B9E5EC011FCFC3CA27F94CCE96D4
-:108F00002E85A34499FA71DB1B0DDCAF3CFCF329E1
-:108F10001D08CFF631F7A11D2DFC63245A3688BFFA
-:108F200087C54BFBF0BCD448513CAA574C45A75FC2
-:108F30007B31C7739D2B9F97E359E057F8ED493478
-:108F400017F95AE05B017802AE94D9D181F495C249
-:108F5000F9C60DCF53FF4DE17904D600743B96AEB0
-:108F60001FF8E6C01504E3602E7E14ED04DDBBD7C8
-:108F70001FF6FFF75EBFA087CCF5ADB4FB0F11D78E
-:108F80000D737AF371BDF942F9DB6D709E44CD65C6
-:108F9000FBDD7079F3AD329CC320960EFEB5B03880
-:108FA000BF53E6BC7F2450EADC7FF85CF74D78F8CD
-:108FB000FEA3DFFD2ADCCE12E7F9DDF377E36BAE2B
-:108FC0003F7D1E261993DEEFEA8EC789F886C88397
-:108FD00015710084035DBF67961C47F95746CC9D09
-:108FE00069E4D3323FD30B5DCFF9314F225CA5A1A9
-:108FF0003FB6A02C5501E5823A12033D71F1F143D1
-:1090000024413BBD20C0E47E41595202BF47C149C3
-:109010009617B89DC72B0BEA93D24ADB38969FE987
-:10902000AD8FDEBC1DE5E37363595EFA6D15CC7E32
-:109030003B14BDA1A302C62D67F9E461BA5F84BCED
-:10904000B1F0116F12EDADB26E027E54AA05AC30D4
-:10905000FD7EBC914CBD713CE47DF9F079B251C705
-:10906000E781B1DAFECB69BDF5850103FA6D290A06
-:10907000B0F3BD611FEEF7FF9CFD75F4AB9E6E8CE7
-:1090800062FDB66F9B685734EF3F817EC3A0392DD8
-:10909000C6FCA8A642CA613E874CF0731035662C08
-:1090A00086EF077E83F5142DF11B0BEC93651AEE0A
-:1090B000EF010E104F68F2B37CB9CDFEBA68363CB2
-:1090C0000BC98A4569E0BD82EB1D4A518A96D79744
-:1090D00087A495A7942CF02797914EC873F7B424D2
-:1090E0002B404F93D5BA01E38CF1252BC07F3CA6D2
-:1090F0005A8F810F5D2B67E745043E3C7E127F222D
-:1091000004F552D2AD74DC89011DC7293892C4BC64
-:10911000E58FDE9C99D6FEBFFD68057EDFD65879C7
-:10912000789E8D9F4319E2951B8BE73CE0A7E3BD3A
-:10913000EA67FC9AA95FF11C6ABFAF723A39F0E6A0
-:10914000C451605F3664C8A356748AA7114C3E812F
-:109150003F62FD78635476C8DE0F8387F2DCB30C80
-:10916000AFA58C3E9B7E3C310BFA7DFECDA53AF837
-:10917000FBFE945B8CFB86534F7B4DB05F4EE590BE
-:109180006ACCB77C7AE68BB03FFC43E3C11CD526A2
-:10919000174FFDE895191EDADFA9275F99A1227301
-:1091A000251D76ECBA73AFCE003BC19A434AEAE87C
-:1091B000B356D708F45BEB63EB107972DBF3B4566C
-:1091C000785E19CCC6F679A3E43BA1ACF85E1DF736
-:1091D000EE345C378B2BF0380E5D5F5308E95AA7ED
-:1091E0001B1088175ADE7110CF7AD38BF4F75121F8
-:1091F0002929BC10FC820AB6EB594D92904FA1A5CB
-:10920000EA803D89FFE52401BE09BEA6EF475AE387
-:10921000F7C1DDE9E7F90F3C8F70E39BB74F04F826
-:1092200008B9AECE2518CFE8F99A2F09F6E83DAA7D
-:10923000F19DE560075EA7E23C6819CF1BB9F1B369
-:109240003C58E488E3E5F0F884C06B263AD9DA4864
-:1092500062C514DE3F6BF4C560FC7D8D3A967FD20B
-:1092600018C5F2DE46039F4F3796E0B3AB3186DF79
-:10927000F73496E353E4F5E1D65E417B3A5E017A3A
-:10928000E81AE687D30DD9847C852C95F8E0BE26B4
-:10929000FDE8BF55C17E1BE44A560EF2BD04ED73D6
-:1092A000799EDFC8FC39ED15469F7C15F2B4C943A1
-:1092B000249047D62CE66708437FB47DEE1242DE49
-:1092C000B6C9F573F49FB74BF8FAE87CB24CE77770
-:1092D00077FD884A1790D3BF1D958B58EEEB373D2D
-:1092E000FC86FB047FF9DB36FADE3E9DAE9AD2D1D6
-:1092F0007689C9B13BF9F73BA6CFC8BA01CAB366B4
-:1093000064815CDF3E8B183A85E35D866C79B2FA46
-:10931000EAEF683C98376F3CD74120A7EAF59D5BA0
-:109320006CFB9831165911B7D1CB5D756AE52EB437
-:109330003312F98B2763BE31F76BEF9E678EC17EC8
-:10934000B13C21F0E23C8BEB159033979D657AA8F8
-:1093500057FF7CCCDE0BBDA771FC6F9BBD4989001C
-:109360009F803C057959962073E83C4397B2F8F703
-:10937000AC775304F2FBB4187D0FF6A8C6F24D0A81
-:10938000A24909CA3FF2C7670620EF3DE7FED42E87
-:109390008AEF0FBBBC06C41BBB9EFB0BE6672853C2
-:1093A000341FF077C1BE6398B7A4C8DD1AEC789774
-:1093B0000526CF57C19E8589607C802A6A8A6725E9
-:1093C0008FAF8F3CD5322F04E7BE1227ECF5B707DD
-:1093D00012B7B21D33317D51CA0F7ED1FE82168085
-:1093E000C7560F2B2F0B4C6AB1B04CEB67B37233DF
-:1093F0006DBF35BB332A6743D2D4C4968397425995
-:10940000D49FD862CD26E41AAE0F48285108FCDE5E
-:109410005BD669396C2BABAC4C7CEC29D6BBEEC06F
-:109420005F5E1C4DE150B34FEAC410DFBE9D12AC2D
-:10943000BB60EF4E94AF054982FBFE82A49484A3E7
-:109440009D7B1A0FEACDC2B926F04245C3A428BBC2
-:109450005F484B7A62B0BD9CC4EF0F1174F17490F9
-:10946000E9C74949DADE1E9776DD273289DF57835F
-:10947000200579B98D9D0776D37929EFAF81585BA7
-:10948000E03C2E79CCA3637C9CFBD94F0ABB89FBC3
-:10949000736EE10E3CCF262B7001C8BF952AFA816E
-:1094A000D7162637521B8AAC7DB630462D56D2E2EF
-:1094B00067F4B236BB336F2AC5674BB6B3DCC4F36F
-:1094C000E7A3D956369CD7ADD97BF738C8EFA92189
-:1094D0001DD77F13E6FB328B879FD83F2BEB125AA9
-:1094E0005EF7328B63ACEB7A4503FABE27C0F38E8E
-:1094F000BA2EBA12D657B34D267221E34B73229D72
-:10950000AED971019CAC7B7EEB5BF3FD630979A462
-:10951000C8D4E58B08E90E9E68F151FC3FA2E9939F
-:10952000803EBA833D2D405F6B67C99C9E7A5E305A
-:10953000559EFF5800E35CDE027196DDCB2AAF0436
-:10954000732B4F66FC4B0912E3DA4A76B30FECF942
-:109550003FB6C8683F838B7403857BB14A0EAAF47B
-:10956000B95DA3F8043E6B55511ED2F76D1EC44B76
-:1095700007DE3342DAD83D2DE3F77957829D5D5CF3
-:1095800067AE467B5B2F453FC038D2FB837912E73D
-:1095900011267F27EAA442A5F566050B117FC55564
-:1095A000D7AE85764A784900F83D4F495AD8FF77BB
-:1095B000991CDE2E273B7D2097234588DFED114641
-:1095C00017D63DA54817BBE53917805DD422ADDC21
-:1095D000F20BC06B76119E7B85F7EB61FD1C9F4DF6
-:1095E0007ACC07F8DBCDF1A9EC942DC8D714EFB7EE
-:1095F0004A37AC06B89ED8523FDF47E19AE735DBE1
-:1096000046503C1CDF52DF129D857828F2D1EFC70F
-:1096100003F52D3E8A97DD1BCD02DD569EF8099598
-:10962000EA48B4F52DE66CF09FDCB7069410FDFE19
-:1096300002F83F1EC9117CCFBE1717F5CA1113ECF3
-:10964000D226AB4FAEF8A85E28B6D59F47E5C20F2D
-:109650001E5210AFFF4EC7033941D76101DDF74CF1
-:1096600052D12E08D0B904683930B908F36DE9BA7F
-:109670004900EC86C92AEA7911C7D126C96837435F
-:109680007DA087407E11E6CF51791D87733E4A94B5
-:10969000C5751465874979980479FEBEA42FC2FB6D
-:1096A00048FC25B6BC0290BFAE3C04C5551EEFED8C
-:1096B000CE97A97ECD3DBA481A47F1F25E80EF8B76
-:1096C00072E93E96BE7F3FC0FC40B7C7AD2F43BE98
-:1096D0000C31BAF3593C2A3E159EA3AE2B1E359091
-:1096E000FFA5FF7E3586F6CBBD63D4B4F960FF1AC3
-:1096F00064FE41EFD862BC57A38150FE07BE08F15B
-:10970000FBF2B8FCF0707BC17D4E40C8134F365B56
-:10971000637DFBDC5139A1BE73704AC8F4813CD82B
-:10972000AF4FCD027B743C9753CDA9595F05BB4524
-:10973000E5F260879F9DCBEDC9269DBB08D8BF3160
-:1097400062CF4B10F2605BA30F9F0F5F3601E39770
-:109750000F5F963707E215072E7E1FF7BF6776303B
-:10976000FE3D73E805B84B899CB1A8B6311859A1E4
-:109770005F3E752FDE17F27D357E17E6CB43BE0EBA
-:109780009DD25DD9CE3CCC47395CCE0578DE808752
-:109790007D17F778A867BF847EE06D7C3DBEC43C32
-:1097A000DC57821B0FCE1DFB4907DEC724E0E0BE5D
-:1097B000BF433D3B85F9EB036C5F2AF297DC794AA6
-:1097C000623EFB8219EE3376E143F835041E44FB1A
-:1097D0007AC91CA50F4037B5671592B4E585F49D8D
-:1097E000DBD0F0FD6938EF9205F7AF243A2E29045B
-:1097F0003E48A29DE80F353BEE712551B5C77EBEB0
-:1098000024E83AEFE2E617B83F18F4B4660C7CAEF1
-:10981000E57DBACD1579B998A7AE9207C0AE3D15D2
-:109820007C6B06F8E36AA998005739512D3C4F7AB2
-:109830009AEF4BD47DB7E2791E313FE18F13E59A61
-:10984000BD8BD04F57BB3B84E7796A924C0EAEF389
-:109850005907BDB23DEFD64C41BEAD672FEB6F3C13
-:10986000E080D2C7877A753EAC3FD870FE4C38672F
-:109870009227D79D370EE0A3323CC07EF9C9109ED7
-:10988000D355BDB6FB53DFE2FBE365DC1E09124B8B
-:1098900006782A8158376167164D95DA474AAFDC5A
-:1098A0009BDC02FCB0DD656F6D0FB0726B70724BAC
-:1098B0007329EA67948BCB023F437BA8C52FCACF9D
-:1098C000A29CDCAEB1FB3AACA7BD06E83DDA1ECFE8
-:1098D000A75BCB4A507F2845A400E0360F1C2D2003
-:1098E000FF9EF6EE023FC38FFC896B0236B89D0ADD
-:1098F0001F1907FBCA34FD598EFEC60DAF3F3A7ED5
-:1099000017E0417C9F17B91FFBA7EDD0DF41C61CB4
-:109910007A8BDABA24EF692F9E33DCE171DADBE26D
-:10992000F920E7CB36D7BD1DBE44B3099B73C19F59
-:10993000EE7B9605BFAA672739F2A4C607593C5BA0
-:10994000554D7055D2EFA5EC7B80D1411BCFC7C9D7
-:109950003C4E4E86719C71BBFEE3CCE07282F07D82
-:10996000ACAAF7DECB3940FEAB3BBEE8966FBD4FED
-:109970002EDFF2393DC7A5C4B3415A5E93EC5C10AB
-:1099800060FC3905F87335A7D3923D773F076AFD30
-:10999000319FF967D837ACF2991704A70F9F7FBAA8
-:1099A00083623DFDE417B3CBAA999D5BDF3EED4A90
-:1099B00028D7DF51A45B69E245E2597D36E8905F24
-:1099C000F7707F51B56AA11CAB3E1BC1EF9FDF78DA
-:1099D0007EC779B6FEE385F0BB18EF16977C3E7024
-:1099E000F14BDBCB291DD73FE191BDB671EA9FE07A
-:1099F000E780FC545E3BF9DD047E570B496F9E22E5
-:109A0000C887BB3451565AC12E7AC42E1FCAC16EA4
-:109A1000EB6B0FF716DE15E0F5AD60FAFA4157FD76
-:109A200022D17F2ED677CF47C81F28839DA67EE2FE
-:109A300015F343F975B7ECEA2F478C3F06FB13F695
-:109A4000FAB703E35F843B25EECA4E568C66FE1DD3
-:109A500003EC80EFABB180FD3EAC6F737AAD3E7B23
-:109A6000BE03DF7D709FE078FFFBC6A8235FFFE6A3
-:109A7000443D9ED3F87680D16535B5E8B1DD8ED111
-:109A80008E3CFD7FCCE3D3CEE3920CF3B8EC6F3C7D
-:109A90008F42077FF6CDA3D8F1FED3CE631FF70B1D
-:109AA0003FC79FF375762FC07C4342BFF57C5AD7E2
-:109AB0004F69FDCBF4E9A3CFF92AB14278CF6D927B
-:109AC000DD6346CBE00FF8EA27B7BD7B39DE0B6DCF
-:109AD000623E8E57E4E3F0731E9BC70C7C5F91FBE4
-:109AE000EF3BB8BF0733DCD3DA1862FBEEBB2FBC09
-:109AF0008A60FE7A28817182FDF90BA260A77FE758
-:109B0000C21A7C36E7CF88823C6A0A7FDD916F4EAD
-:109B1000F70869CFC1FE91F74BCE7E59B69F47D962
-:109B20000CE751D2D41771B1CDBE3ACC03FFA2D607
-:109B3000FBE017B4DE4BC38CDE36FB1218176C8DBE
-:109B40007E31F37F26C4C6B9FBC2CB089BEF6529E3
-:109B500016F7D10CFB7960F1DC1F9E118575366517
-:109B60002F88023D3767CF70AC47C9B09E5561065C
-:109B7000A7CDFA17BB9EC39F793D0BD2E6C1AAB908
-:109B8000E9EF176B17788A2690CEBEA8759DFA1B51
-:109B9000AF6B14C7577588F90D361B8C8F824AFC42
-:109BA0005785D2E07C38D8DF1D21C5863C943CBC6B
-:109BB000DF727865E2DF659EE44898D79146B67F0C
-:109BC0007E9DDF27F5DBEAA630FAB55DE36C1EB3B8
-:109BD0002B3C909FE37F563BCFA70F26375A422C52
-:109BE0005EF3B584B3DDD2AA60DAFB4D28FCEE2A21
-:109BF0002CEC83673FFC7FCE70CB448FC3855B6BBF
-:109C00007478701B8C0FAAE1929BE983C34DD05BE3
-:109C1000A67EFE7FA1B307870E2FA4AFBF15BCFEA3
-:109C20005EE9EB1980D710F8F21FF03AC7F5E6D0DD
-:109C3000E025E4D81E8DDDBBE8EEE74498DDAF34C7
-:109C400051AA3B7C05C417BEA2A0BFF7F08E79EBEA
-:109C5000886CAFC7F4D9E1CAB9EB30DF351EC47BDD
-:109C60003C5F9363FF5E067187C5AC5DBF7972F898
-:109C7000BC14CEE67E4B6324F8115E8B5F3DE0FAA8
-:109C800048A56D5D989769BB8F4AE90FDFC3C4B8DB
-:109C9000A30CFC4D0BD3CF43E033D3B8C3C5E76B64
-:109CA000F1EF0F0B9F83ADF7D970D190E485D837D2
-:109CB000E492DEBF977101C0738FCCF2398EC2ABD4
-:109CC0007CB89F8C60A5A555A376029ECA223CEF66
-:109CD0004933D6819FCC7BF5C2AD618AB7D7AEC977
-:109CE00096BC367879230CCF3396A7B70B73233CF9
-:109CF0002FB7B7BD44E03E44773D85D7BB6639BB3F
-:109D0000978AA8E6D8C5B67375535CDFDDEDC74604
-:109D100022F8FD351E6F777FCFE2ED972E19B83D03
-:109D2000A963F7B950BA1B9BEE7E41C11F9DE14468
-:109D300034429FAF4B8907BF01743429C4E21E2A05
-:109D4000298478BDE8275725298DC2FD5D8F3116FE
-:109D5000FCB469FA291CA89F4C7015EB11E3002B89
-:109D6000C2BD2C74FF88FBC5329390D9B04FF4C6A6
-:109D70006E65870D191DE4F0FC999975C1E446B034
-:109D8000F354BA4EDB7CBBFE6BEEFF80EF5D876564
-:109D90007D53617F380C261F1670BAC955129BFC83
-:109DA000E01F5B21A5BDDFECF208FB3B251F847B98
-:109DB000E3EA38CE84FB121EB8E7E05A9EDF44483F
-:109DC00062ACFDEF8C7DC0E58ABB5DAEC2E2D1E442
-:109DD0000DC6CF7B76AD199B8E7F5EE57CFA41B8D0
-:109DE000C4919FB4247EAB07F873C9C2451E2304F7
-:109DF000DF99BCBC86CF638F96187B51A80F4E1994
-:109E0000E510874FD7914413DCEFB0A241C238521E
-:109E1000E90646772B36EC97D7D1E74ECE7F8B00FD
-:109E200007B6FE6EE578DDB32B300EE6BFA7D74F41
-:109E3000473BA6F3B8FE7E827EAFD591AB3683DF7B
-:109E4000AB5B22FCEF32FCA412F20DBA799E480BF8
-:109E5000FDBE11E63B6F24F2F7840D1FD4837CEE28
-:109E6000D2089E97FB8F762FFE7D0B412FBD72622D
-:109E7000C3478D907477AF969A0C7433B2A9EE1BDA
-:109E8000E9FCE416E7FB0F43F1AC7476AE780A798F
-:109E90002EEA2D560D4FBAFA57573AE59898F7081B
-:109EA0006FEA54BAFB1A7AE93039B0DEFB3597E332
-:109EB00002EFBDF83E927E5FB423C2E2777B9273DD
-:109EC000D6A2DEB2BC06C843311F01AF5C8BC1E92C
-:109ED000DA258A43DEAE5818749D476270FDAAD712
-:109EE0007808D671EFAE9726E3DF5174E987809248
-:109EF000D0E0FBCD24E50139715C31F0F97AA3F3B0
-:109F00005EE6D749E28EE9A03F1B94B47CF50CA72E
-:109F10009FD7AB565D83F36F567498FFB1E523AEC0
-:109F20002A07F952E5C17B828F35DF16BEC9B67E9E
-:109F3000A1EFDCF3FA6DF5AA01F5D6D22A27DEF6F9
-:109F400068CC2EB0AE647CB89ACA9BD9485FDD77E6
-:109F5000CCA4E31F4EE65CB4855527F0F71CAFE6B2
-:109F6000BF1F971377CEA4F2E684CCFC61D63F31B5
-:109F7000B9B1E4BE780BC4794F344CFB6937ADF707
-:109F8000325FDF5B0D03EB47373D4DB8CF793FE5DF
-:109F90008C234483F689FAF4FAE0FAEC2093AF6A52
-:109FA0006C1CC897EB36A4AFB709922B69BD137F21
-:109FB00055AAD3E56D7EA2333E59114FDFFE133D06
-:109FC000CCBE835E4A03E7BD59412EE7F47120A75A
-:109FD0005764986F575604EBBDD372FB7510EF3B77
-:109FE0002E3BE5F30FB278FC3C8BC9E713BB9679A7
-:109FF00046029E5A251DE8E1EDECD824A0B795CD88
-:10A00000C7D08FF02D5EFFBA50FC43D04F4B8E2C43
-:10A010009E3F92E2A56B3989494666F9FF31E79F79
-:10A020005C85DD6340F5DFBBA0FF68D377D1FE50D0
-:10A03000CD715F9BCCAE6C84BCC213B2B506F3503D
-:10A04000760558DE11894DB7DF2F13E0F338B17B69
-:10A0500078F8BE261E1CD08E3F4C3A6A70DCDD417B
-:10A060001DE28F872B95D4E57492EFED0EE23DAFA4
-:10A070006EBEC834FE70EDC013BB8767070EB6EE28
-:10A080005856E190ECC03395F7DE59067CA4754C28
-:10A0900049277F859C7E8DFBADDCF4239EB3393E42
-:10A0A0008E27079ED7CDF73BE7735D9D733E825F9A
-:10A0B0008E279B02901F4E479F6CB74BC9BCE9830C
-:10A0C000E859E6FFCD34CF389FA790134079104F61
-:10A0D0005BCDE5CD5B0DF746EC7870AFFF84CCF738
-:10A0E000070FB1BCADF1F19573461A7DF4795D1699
-:10A0F00093439F375D0A3DE3EEE7EF9D0E859E1B80
-:10A100008C0E855C70B7FF00E2FC23E1EFE3E81AF8
-:10A11000C4653E8818AC4CF40570448694F373CB48
-:10A12000C41807E76E4EEC0AE0FDF6D6166F12FE75
-:10A130006EC7F15D974CB2AF6707C7FF8A25D97824
-:10A140005DCA713976C528CC2F50F0BEAED78FE4EA
-:10A150002C80F2BD876490D0E4BAFA950AACEF8106
-:10A160002C9677BE62C32B680F0E97CE57D439F565
-:10A17000FF277C1DBD7696DA5306F493090EED5940
-:10A180003EB6CF892F9A0FF279D50609E5ED962CC8
-:10A1900003DFAF524D94DBA499E947E2A3F0A02A74
-:10A1A000E4182C02E0F1BFF9DF2953E39AFD7CD2D9
-:10A1B0004DDB6E9F0FF6A19B5F46EB8C8EE15E3010
-:10A1C000785E174A3C9935B24F3EBF2DD5ED1F45FD
-:10A1D000AB5C9EC5ED6DCEA7623D9767B1F5513B77
-:10A1E000ED87F8F799F8FA48CC456F7247CD4F00E4
-:10A1F000FE737C681704BC54EE43DEDCF7033ACBF5
-:10A200009B637C25EC1D77FB6BD584C36E3C94551A
-:10A21000E8C8C771DB21FFD017E9EBFFF96FAC2F5E
-:10A2200064FDD3E98BFF0778BAC08E008000000080
-:10A230001F8B080000000000000BDD3D0B7854D59B
-:10A2400099E7CE9DB9994966924932933738930080
-:10A250000625780321449E370991A0A803040C1A0F
-:10A260007044D4282144C54ABFD2CD0D893120DAAB
-:10A27000505DB4D67587885DB6D235586AD1D2762E
-:10A28000B0828FEA365A45DA8D1A1FA5800FA2AD2B
-:10A29000ABDB8FAD7BFEFF9C93B9F76626046DFBAD
-:10A2A000F12D7C7ED733E7FDBFFFFFFCE7B0A22591
-:10A2B00085449D04FF7C49FF3B9C1A20C44FC8F194
-:10A2C000BFCA8DBD6E428E45DA93AF81AF4D5D90B2
-:10A2D000ED2344EF94C9A3B4DD3B473EAD81F2BD0D
-:10A2E0007D36AF44CB2BD65F238769BB4C28F9A1C1
-:10A2F000DF9234287F097FE60EFFDEF0804CA2C596
-:10A30000B179AF867518CAC77A923502F3CDF14498
-:10A31000C60709D9AB109D9411F2F6E6ECC8265A8F
-:10A32000AE7112DD3D8590B9696CBDBE8D9FB77A67
-:10A3300027D3F5F4FCBA8414D2F5DD7DFB8AF0A4B2
-:10A3400038F37B6D844CA3130402369245C86D7CB0
-:10A35000EFAB528906E3133ADFA386F145BFC3ADE5
-:10A360008444CFA5F5E368BFF2583FEBF8CBAEBC11
-:10A37000702CECFBF09533C75E3329D62F111C9659
-:10A3800049E17F5E0AF3B6C92AC075D73D498D3DC4
-:10A3900071E0A673B85AE7873F76BA8F25FCFF971E
-:10A3A0006EACBCC34341B22965CEEC709CF90F93EF
-:10A3B000F0DDD3E87CFA46369F759EC57C9EC3F5DA
-:10A3C000D72E05F87FA6CB5E99C263A0414EAD8023
-:10A3D0007EF50E753C1D7F40BFD5739D619DBF4FBF
-:10A3E000009FDF375EEB898B07FEBDA2DE4C076F57
-:10A3F00093C197A7C33C3BE3AFEF16581FC5DF31AE
-:10A40000257CCF85747DC72F96559DAEE7B88DF618
-:10A41000037A7990F60B0CEF773DEFF7F6C691E9EA
-:10A420007249AD793D4B8F249BE9D2461A7BE3EC10
-:10A4300067685D6748F72B2CFCB74B191CE3A5FD3B
-:10A44000DFDE71EACDDB613F3B9211DED67132D3A4
-:10A4500065C6A7C02700AF2D499C4FBA9B9FA6FD9C
-:10A46000DEBE344FDD4486F30721DD97CDA0F5FD38
-:10A470003DB6D22DB46A574F4A6324CE7A27A7330C
-:10A480003AF0C97AF279B43D7983E103C80DF866F0
-:10A4900029A7376FCF0F5B882DD6EF0DA0832442FD
-:10A4A0007EDBEAC4EF36AF13C7A95BB84809D079A1
-:10A4B000AEB3130DE0877FE8B8DEF30A766CA153E4
-:10A4C000BD6E63657D15E53F69F87A1EE674B92BAC
-:10A4D000B27844F8D637C82678D62D34C3D74A9FE9
-:10A4E0004723B6DA78FB17F49C68BE2B1D113FE0BA
-:10A4F000E908DFEF61BEDFDF37B67BA0BD759E5D8B
-:10A50000919E11F9E0AA46335D9C6E9F6F7A830895
-:10A510008FE56173BF2BEACDFB5D4A5A66134A2A69
-:10A52000CB88EA806F1D6929799A82F2E8034B7023
-:10A530003DAF13520B729E9CBAB56451496CFC1727
-:10A54000393D7F5677EBA5202EDF505A4ABC71D695
-:10A55000F33A8793C0F7EB09E019E572F70DC033C2
-:10A56000D0EB32392E9EFF8BCFFB46C3C87CB4ACF8
-:10A570006E643C9FF07A113E6F34B427C33E8F89DE
-:10A58000791F64F3825E33E2E3C457D45B56FE1D49
-:10A5900020FA4D48C791642FE8111F9087418F74AE
-:10A5A000A4DB981C2F1E598F88EF6F855CB5B4AF64
-:10A5B000B36B0E233ECABD01849B28D72D34AFF365
-:10A5C000BD54060FCA7163431E83DCE0FA55E8BB35
-:10A5D0007B7F70FE5BA03FC7A7333CD4853E7100F4
-:10A5E0003CA87CBDC303FB7AD5E605F95A7E4473CB
-:10A5F00018E137278DB53FBE7364F8CD4963EB3C56
-:10A600009D9CB5EEF7ED6FDF3905C67DFBDB9F3B0B
-:10A610008CE32FFB229F443363E5ABEB252D1287A0
-:10A62000CF36789551C17D83058E577F3116C7F798
-:10A63000C9A4A537CEBEECE94E6CBF3454E9F05343
-:10A64000785EBB5152253A84239DC9DD6B85BCB32E
-:10A6500007C62EA270F7B7B7DC168A33CE6C0EEFA2
-:10A660003FBB4369F1F84C7C853E17ED96D9C38E0C
-:10A6700078EDAD7A7580F3B9B55DE80CE971C80E77
-:10A68000B2B41FED3AE6A6313ACC4C8A7E04F28889
-:10A690004C32DB61A79DD7D2DE3AEF651CEE89E62E
-:10A6A0001776AD757C9DC33F1CA2F413B7DE83F50E
-:10A6B000AF12A65FF5480AEAC3633BAFBD07CCB74C
-:10A6C000EB17DC7608D4E4CBA9416CD7107AA50649
-:10A6D000D9EDD4BD9301EF9FD5DE7B4F195DDA71C3
-:10A6E00025DCEEA11D8E6F92D06EB1CEF32AD72756
-:10A6F000AF813C3D17C623CC5E9D4747CBA56097F5
-:10A70000B5352054C8B79202463BD5B7E1F356326F
-:10A7100019EC87D0260FFD7DC2C64FD6835E262456
-:10A7200082FDDF75A83722BC09B373FB7BDC3BB627
-:10A73000D076AF825C80F1893A3654629013762FDE
-:10A7400096478B9FDF26C0CF99CA29B1CF44F350DB
-:10A75000C8E3FA1657B9BBA434B07702D7C17E0656
-:10A7600017B8BC3D14858B15ED1280CFABAFD86CFC
-:10A770006D411C16ED15611F072F0BDE755E19C8A4
-:10A780001F87E6A24B5904CECB85948EAADC3A8C67
-:10A7900057F6DB858F017EEEAD4F0AC830DE9CC0D8
-:10A7A0009B322D2FBE3829007E47795FE1011F1DA6
-:10A7B0007FE942C94B68FF790BC6FB07E8FE5236BA
-:10A7C000D071F26079C76AABC711F243986C066129
-:10A7D0000BA6B0582CF1B2EEDB3C8FB63FCFBFD703
-:10A7E000E6A6A09EF85DDF66271DF78EB6508E3771
-:10A7F0009DDA13E91F743967139295A5F5CD5509B4
-:10A8000071677C540BE5BD0F8AF13EEED20A08F960
-:10A81000992D1C9468FDD48CA405760A2F5F91981D
-:10A820003F6FB3368BEEE7E21B1F5D4FC75FFEDD68
-:10A83000490BECB0EE06317FE90258DFD259A25C39
-:10A84000EE82B22F85F787F55650F955185BBF3D5C
-:10A8500087CE9F21DACF58308FF63D5CD9526DA755
-:10A86000F3FFE8BBDAE649130999BEB0D2ABD1F2E7
-:10A870001319F50B52287EF6124AA7B4FC64C6954C
-:10A880000B60FD3ED9C6C7BF6A33ACBFBC413F0FAA
-:10A89000EA257DE5E65ABAEFB5CE814340AEEB3608
-:10A8A000E8CE2CFA3F2912E363A7A345CBA7B073E8
-:10A8B000ECAB8CE6E372BA19BD16444B408F0D9594
-:10A8C0008B69B9C450CE61E5BD9BC8D5F1E4ED6D8F
-:10A8D000994CEEED4D8E5FAF64307B80C20DF54933
-:10A8E000DA11A2ED8EA3573E4A77E37C079389EEF7
-:10A8F000CC88F1DBE594872B285F12275BA71867CC
-:10A9000098FEC8607287E89767803C5D0843D0ADC9
-:10A9100017A912FABBA42525321E688744ED4B40C7
-:10A920007FC8365CAF5F96AE5E44C7CB4A26E13D3A
-:10A93000F4EBCF2458A6FDB53DEED8782F71BAAF11
-:10A94000290AED84F16AB2734BDB83B171E8BA3B3B
-:10A950009C534CEBB6576440FDE2D29B2719E0397B
-:10A9600089ED83D201F6A3D33C3697F2C1DEBEF364
-:10A970000AC17EFFA945EE96F72D7610DAEECA4C95
-:10A980002E5F02ACBFBF9AC99FC19B53223DC09F9F
-:10A990004EB53464B03B031C1ED5772EBC1FDA3590
-:10A9A000F53948126DB77E4F653619412F367D3126
-:10A9B0009344A61ACAF6A80272A7E98B39F87BF568
-:10A9C0009D2F29C0A7304E80EE6BBD4BCB56016E3C
-:10A9D000EDF1F14F1D725C47D317E9449F6AFC9D6E
-:10A9E000C12936BE0FEB4FB7AFD8783289648E34A9
-:10A9F0009E82F54370B773B82BF1D7395FD02985A4
-:10AA0000B7CD405F4B39BD51E9877194FECB26F538
-:10AA100080BC8FCDBB09C7DF6BA778043BB02F3953
-:10AA2000007671B99DC9CFF2BE0CAF2EC5E843D0F8
-:10AA300085C0EBDE8C964ADCEF22C9DB131CBEAE70
-:10AA4000CBC4BAB83ECD6E08CBD718D627F8818EC6
-:10AA5000BF978F5F5681FCF32F4CFF50BE5901FC0E
-:10AA60000B760BEC438D962CF60C5FFFCFA8EC8099
-:10AA70002FC52383FFA5EE08E80101B7E1F0CF3F22
-:10AA80000D3EC7627D79DF330AECB32901DF8632E0
-:10AA900053B15FF691682AF8B5BF4C677A6D6FEFD6
-:10AAA00054D74CE08B853602220CF60DF66AB9902D
-:10AAB000B764D70B5576FAFB5099CADB00E06148C2
-:10AAC000FE469DCE58FBAACC5D0B3A689D2F89E2CD
-:10AAD0007F12DAA14E62F027BE9DC1E4584598C4AA
-:10AAE000B55B966532BB45C0FB7B1BAAC97B747FF7
-:10AAF000CFA533BEAC18D025C08BE06BAB9C7A8859
-:10AB0000E3F17BFCFB8F9753D269E4D4222EA7D8C4
-:10AB1000EF07A9990FEDB2B2A22512D589AB5E98C5
-:10AB20003A1EFC995B72E4C0FB94AF9648EA981F0A
-:10AB3000D171EB9C018C93093AA923CE801BE04E86
-:10AB40008DA62F41EF2F746119FE805DF269B7C4A5
-:10AB5000E89004D2EA4A12CB21B18E5B72149C6F4A
-:10AB6000D5E6F16961E3FAB89EB83C29FA2352347C
-:10AB70009CCF4599AE7FAD4D36D4BB993EFBD0A35B
-:10AB8000FD3483E2E15589D4E37A2CF6D26F78DC88
-:10AB9000C66A2FD5733BD20FE625F2B10D9DD3ECDB
-:10ABA000AEA408615D74F053B37B09E7D7A8ADC9C3
-:10ABB0004007BFCE286076ED15B4F202CA94CE6A83
-:10ABC000ED7D831C7B1ED6837A213A0DF8F4A50C0B
-:10ABD00062B2F31AE4508104766B76920A7286E2CE
-:10ABE00009E170D045EC2E3AEF73F40B78AB916F1E
-:10ABF0003EE0F0011D486A3B427F07F75B4914F4D1
-:10AC0000CDE57353D06E25A76E1D07F10A7F0AA309
-:10AC10005B3A8E938FE3443AE172EF376327F68015
-:10AC20007E12F253E0819C92713C517F505A54E065
-:10AC3000A5E583FE734BDB25B3FD03F650CC7E5AAE
-:10AC4000BF793EB597A6D7F6466D5E902AB72FB866
-:10AC50009DB6AFA1F6938BEEE78F194C0F1E0CEA51
-:10AC6000722A8C379EEE83FE7428393CA9C51DC319
-:10AC700007B571C280BF2C857EDD8C3FE0DB99C9B2
-:10AC80009091E163DF06FECD4A65ED87E93D5EAF59
-:10AC9000490CDE5B2A999CB0B6B3F171D73AF5DA6C
-:10ACA000AC42A37D1522408776C2EC2C19748F1F0D
-:10ACB000F519C2ABFACE8634D09B9FF52D4D239368
-:10ACC0006272D4E1FCEDD8F7A91C899225DF017EE0
-:10ACD000555E9709D8CB7738185D2AE9616F06FD74
-:10ACE00066A6C4F79B27F2F564825F4DDBDDC3FDEA
-:10ACF0001EC717E7A3BF9D9FC9E245A9397528D78D
-:10AD00000196018AF73432A87B0D784CABB099FCE0
-:10AD100007C71793B1FF99DB0FA509EC873293FDA5
-:10AD200020E6B5DA116FB6E6E0FA45FF1539AFD582
-:10AD30001043FB9564E00E186FE5FA7C53BC289134
-:10AD4000FD3137531AB217F4B8EB524CBFBF49FD6F
-:10AD500045DD38FF31367F6CDE14CA70B179E54CC1
-:10AD60004DCB44BF6F96F7E8F9F4E3A2BFCBA877C9
-:10AD700050FE53FDA4ED70A35EAA05B92DFC24E09E
-:10AD80007F6F1AF077656DA6DFA027793FAB3C3A5D
-:10AD9000C0FDEA035CDFA41D117663724092627A03
-:10ADA00067B8DEE276B1453E9ECECEA674AB1BED13
-:10ADB000806178CEFCAAF6655102FA98F00FB12FA7
-:10ADC000CB6785E512909FB512194F3FD3E799F5F0
-:10ADD000BD9EC9FC109D329CD16F59DC606ED701BD
-:10ADE000EDFCF04D1995DF62D447920C728F8DD730
-:10ADF000CCE92178E2552540E57094DB43BB7CDA51
-:10AE00005D40171DC9A993414F74248F8D405C622A
-:10AE1000C7FF5617EFA0EB1F7CD9A1F6C0B0FB18F7
-:10AE20009D542E5FDF6EA7BF3B7A256F1289ADD38D
-:10AE3000BD41D256533EBE9FCB89261FDB4F932F79
-:10AE4000AA8CA3F3E735B17514F41E90EC0679577C
-:10AE5000D0C8DAEDC87498F4CFA350A6E33C22FC26
-:10AE6000111269AB2983F69A1DCE41F27A258C0F17
-:10AE7000E7B55040507AC853D9F86E35225D3B296A
-:10AE8000B6DF2EDBA249A027BAB25254D013277DD9
-:10AE9000E1C760BF4DFDD128806B7A7F9F1DEC3DDF
-:10AEA000975FDB0DBF8B7D06646F1EC8D9947EB69D
-:10AEB000BE6E0BDD1372175F570F93BF32799E0082
-:10AEC0005E4086D0F9B23615A39E12EDB332B8DEDD
-:10AED000C822E127D0CE225D04F146701F599B267F
-:10AEE000A0BD2FF01AB3AB264E01BBAA686BD4BE2F
-:10AEF0008AF67BFAA1F8F1FA17399FD07D1C34EE5F
-:10AF000023117F08BD26DA3912F8D582EE536AE3A1
-:10AF1000DBAB5413607DE572DF95B0EFA60E8524A0
-:10AF20004931F8BBFCA12320B7F27A7748001B2BEC
-:10AF30009D7564FC50CAA7FBBCF546E29549E275D5
-:10AF4000376D90B5D5467EEE5018DD28E6F33DE12D
-:10AF5000677CC2E305B3FDA163008FE67DDB14C00F
-:10AF6000F38D3BDF51463AD7192DDCA446E6BF34BA
-:10AF7000D53B23B0DFCAE576C4E39A0E2502F2A9D9
-:10AF800069F79EA80DECEC8D4405FE6FEADD732891
-:10AF90008FC227BF499B260762E3E5374524584FF8
-:10AFA0001625C63EF4FFA20AE86D2B7D839D0CF6A4
-:10AFB000CA2117E3FF0F2BDDBA44E1F8A123DC041B
-:10AFC000ED3ECC4D51F5600CEECFED99FFBC4459F0
-:10AFD000DCF3445214BE5DB69E1C276DD7759EA24D
-:10AFE000023DB9FC618F8FC229C31EDA0BFDD37DF0
-:10AFF0001EB58DF60D249129A8AF470987E916BA29
-:10B0000098BE91F1CB5C5FAAB003A7805C3AD7E70A
-:10B01000117614CAAB430EB68F0EC2D6DB99A915B2
-:10B02000C07A883703E7CD6B8A4AE00758E78DD1AD
-:10B03000955688ED47BDCE5E05E4FC1A2E6F2A9723
-:10B04000EF94DE33D041A98F9DCFE6EDDE21817FE5
-:10B0500048EBDB6A7CD89E2481BCD9CDCE29D6D0E2
-:10B06000FAEB0CF245EC238E9CA980F5B9FBFB9E14
-:10B070006572268AF427D66BC5E73C1FB3EF2EA274
-:10B080006602FEAEE8C5013ADEA1C2641C4FF0BD07
-:10B09000954FE7F9189DE7D5EF94209EE04B61F6B8
-:10B0A000A4589F68B7CB5755EB4338F4211CD6D62C
-:10B0B000DB116F623D354A681CF865CBF878CF5CD0
-:10B0C000F1963240CBF7FDF415A4C7B5DD9286FEAC
-:10B0D00042F72BCA5288DBE9FF2E439CF61266A288
-:10B0E00090ED3F7905F5CA257B59FC60EDDE3DF614
-:10B0F0006BDD313A0D9E786625D0D9DADE24E292F6
-:10B10000007F01E4532B9D523983744F7405CFB9EE
-:10B11000A89CD451AE927010FC1421873B397F1348
-:10B1200037FBFD46BE6E316E4C7EBA90DE8327A69D
-:10B130003CE3A4F05CAB4AAA0BF891C39B8E1F457D
-:10B14000394C4821F86B627C2BFCFE99DBED71F0E9
-:10B150007C1BE0D9AA4F849E0D3E5C45E02BF06736
-:10B16000E7701FD2EF3E05D7DBE1B3333D5FC9E2A5
-:10B17000DA1D0EA6473ADA9C11E0EBE7D22F7A5E91
-:10B18000A2F2D293A144E17BD0B6AA09EA0FE6B1BC
-:10B190007574D93615B7303D76870FF1974A987C8C
-:10B1A00062F2E8BE1F3379D2A4BBD17F6C0AD7AD5F
-:10B1B000C673099F4B857309127E5659EA89D1835C
-:10B1C00015BF81270E28015A7F492FE38318DC9889
-:10B1D000BE12744BE51CE2BD33539C5F868300575F
-:10B1E000EAD7B741FC41F8F5A90D21DD1318CEAF20
-:10B1F00099DCAF9FC6FD7A4785F36FEAD7AFD9F0E8
-:10B200006BF4836ECA7901BF825FA8FF68E2AB2747
-:10B2100038BEEFF731BDFA948FD1D59AB25EE4878C
-:10B2200035EFB7201FB96B993C71F79BE52021776B
-:10B2300073FB602B8E5393D27B910C7EF2BF4ADE60
-:10B24000769278DD37482DFF097932640FCFDF38E9
-:10B2500045ADFC720A571787016FF76B1FF3B73EB6
-:10B26000DC4511017C696F5146B2874F372E89BE8C
-:10B270002601BED770587FB8BBFAC23F409C7157B9
-:10B280001AE6B37CB07BC937FF40FB7FB873AE0AC8
-:10B290007ADAD71E42FA19F4BB54882752F1592B97
-:10B2A000517A68EBFD55EA4C382F7BEC8229203728
-:10B2B000DFE57C79E2C7F20680CFA67F7B7C0ED4E7
-:10B2C000AF894899603F7EB8EB5FFF0A7AB171E7BA
-:10B2D0003ACC4B6B7FEC976897DB223BD8EFBBD225
-:10B2E000D0CE3CFEC8B63900F7F6DE76AC3FF1C8EA
-:10B2F0000E2C3FF36F8FFFE22F60778452556877F3
-:10B30000E2C7DBFEE92F40E775A92AECA3296C67A9
-:10B31000E7B982BEAD726BCF01E453412F9780DE57
-:10B320000538D533F923E8F95D7EDEB4AADADD0508
-:10B33000F2ECDD2D9EC6787146C5CFF002B11894AF
-:10B3400063F512C6D9BA28D540BCA32B9954C0378F
-:10B35000655254C9A7F35CD1B0670EDA3DFA3BD70A
-:10B3600043FB25FB5C640BC6E520A84BFD0124755F
-:10B37000424AA8183C4AFD663AFACE2F29DD1EA69D
-:10B38000F201F58EC51F58D2F5C2FF801CAD730EB9
-:10B390001C0051287EEFE2F11BDA1EF54EF9FAF897
-:10B3A00071D254BF9BD32DD39B797B171504504E7C
-:10B3B00024A9E30DF6E998232D5B203D29AFB1EFD9
-:10B3C00022D8C7C5C5D74C45BA80F81FE81FDD8D08
-:10B3D000E3AF85F825E5BF73FC3C2EE225BE19746A
-:10B3E000FE1A3BF1B9E14BC86B0E94238FE2B8D43F
-:10B3F000FE40BB2AF0CB2B1E057B64BB239C3B0D80
-:10B40000C6E9E27A6B275B37EDEF8573543A9E7796
-:10B41000C6141CA7CF9181FD75D67FFECE3629B606
-:10B420005E4AA963416FC178656ED0337A3DE227E9
-:10B43000A0E0BE4E40935CDCF7E4152531FEB5C6B6
-:10B440007D409EC1F9F06C7F65857F5AEC2BE2410F
-:10B4500056786EE4F53FF36BF825BB324D7A2591B3
-:10B46000BDF2CC151F33FDFBB37750DE34031DC393
-:10B47000FCE1F74DFAF75A41C74FBD83747CED3EAE
-:10B48000A67F9BF7952A40B71FB46AE43D6A8036D1
-:10B49000F3F3D7EDD2C0F598EFF294CB0B71BD8FDB
-:10B4A000B9BE59B3F59DA3706E5AB82F17FDFC8F26
-:10B4B0009F72D5C338076D3684E7C19EF377B44BCE
-:10B4C000C67532BF80DAC148AACDD44E6576F0EA9F
-:10B4D0006DE0A7AD6D242AF07FB3857E9AF7BD821B
-:10B4E000F422ECE0E0C38B5733FBD3A5BAC08F9BAB
-:10B4F000C7EC5142ED51689F3E2FD2A6207D959614
-:10B50000037D3D73C52F3A418F37CF235E187FFBF4
-:10B5100018EDA97CDC8F4420CF65BBA3BBCA4EFBD2
-:10B520006FAF0978292429DC76A2DD4B8A15AEE7B6
-:10B5300056A3BDDC9C73958A7C6695074FB5A1DD4B
-:10B54000D51C48C6F55CB24FBA85D9236EC2D62F3A
-:10B55000217D5E12991981F8D9471C7E028E1F3B0E
-:10B56000FA56023C3EFE0925445A7FC93C46AFE9E3
-:10B57000F37A518E3CF7D47CD4E3822E3D4F26A142
-:10B580003ECFB07B2515F5DA9224235EBB1D4C2FF0
-:10B59000A5733D53B495E1B793F353A7DFC6BF8AB4
-:10B5A00039FEE2D52783DEFD88E31FC508C8772E64
-:10B5B0004FD6AE8E223F35ED66E3F992B4D25B0DE5
-:10B5C000F4EBAB667A519C07C0F9C0A238F2E231C5
-:10B5D000BE8EE0C3ABB681BD7C31C53BA894BC62D6
-:10B5E0002E47295D00DCF21A43480717FB6E5021F5
-:10B5F0003FD59F49D05F1C6C5348BCB8CFE35C8EED
-:10B60000FA3343651087F6677BD0CEF1CB953617BA
-:10B61000F42B95D49E009E7BA29D37E8CF557B4CA2
-:10B62000FC1E2AB3D176C7B23C0CCF91DFD8179756
-:10B63000001F06D8B816BB6FB8DFCDECC685DDFAA3
-:10B6400064F043C4B9868043A42DB9DE283F7FC28D
-:10B65000E11099C8E2A9D4BE77635CDB4BE701FF38
-:10B66000BE67E623CCBF6FC7760FFB997D5443F7C7
-:10B6700007769BBF28B49EE9538F1A0F1EB3FDC2F5
-:10B680002E5F590A7E65739D5B057EBBEF67D22AEC
-:10B69000A467081682DF1D5E8D7820140FC00F246A
-:10B6A000CCFCD2E69650243EBD2F42FE6B06FE93A4
-:10B6B00090DE310E4FE93DC2E89DE93FE1FF837C1A
-:10B6C00034E61D0A3920E44BB3323001E858F04328
-:10B6D000F39C810900B7D1CA938F1D94FF817F2805
-:10B6E0001C807F04BF789E667CB2A52D5009F55B57
-:10B6F0006A88B7DDA08FACFE12AC13FC4E21D74F89
-:10B70000FA42C7FD1007B0453B21BF42C8E1E6A79A
-:10B71000374F8897FF26E4B0D3CEE49B339212696B
-:10B7200037D0179CF979A6E017F3795236C48F8F7A
-:10B730009CF2BB791C7F74F91259A0CB41DEF4A4B2
-:10B74000605EBB881759C7FDD82F99E232C26F815E
-:10B750007307689F93C5F827258BF3679688CF46B4
-:10B760004CF41FB085DF813CA344FA4BF4FB5BC56E
-:10B77000AFC43C428F5AF12FCE4D603F8B26256ED1
-:10B78000D77D80C9272B3D4EE47C72147C0FDAEE06
-:10B790003FF839D770FCB2714878A2292FAECBB6EA
-:10B7A000A7315E1C4C9C779087268E2AEFEE402BAB
-:10B7B000CBAFFA0F9E674B564F34E559B9D5401BB6
-:10B7C000C451AB9CC15219E765712CCF1CF209E83A
-:10B7D000E1C9FBBA8B217FC91F329F9764D7279B92
-:10B7E000CE2372C319A6727E639EA9FD989642531A
-:10B7F000FD391BCE33D507F529A67251D70C53FB63
-:10B80000F1DD55A6F2B90F5C6C6A3F31B2D854DE57
-:10B81000D2D65B0F78397FD795A67E5576AFBD948B
-:10B82000C2B5A47795397FCC02CFB4BFCA71E9B055
-:10B83000292B8878ADB29BF3882FD8678607A4CBD5
-:10B84000019C27133EDE9C635346CA6F9D4CEC7FE0
-:10B850001E10FD83C3E9813807D4501C3F53D0B973
-:10B86000285BCFB584FC3853FA4BB44E417F89EA4C
-:10B8700013C1ED3B9CFF055C1C4370A95747828BAD
-:10B88000E3747021142E9EAF0E17EB789B529A3101
-:10B890004FF8352818ECE38156F37D98657A1AD372
-:10B8A00043A125A7B1A3591C389CC4CE2BADF5FFED
-:10B8B000C9E1F2218509E261947CFD16C7437F222C
-:10B8C000BEDEF0C9C16C90DFB504FD666F4BDB27AF
-:10B8D000A0B7AEB64709D0FF7D7C3FDB79BEE80359
-:10B8E000AD5E1CE7417E1EF9506B007F7FB8B51836
-:10B8F000BF9156157FEF69ADC0EF4E6ACFC1F70714
-:10B90000ADB5F8DDD51AC2763F6CADC7EFEED630D7
-:10B910005BD7307C9172B473429971E3A5D7E8F29A
-:10B92000A8F044E482B8FA32E13872C388F9E51B22
-:10B93000FAA5C79F35F0EF5B591EDF51C86D9C4ECD
-:10B94000A6C3F9E6E9FA7FDE4A1E7F76FCE8F948ED
-:10B95000D013399539211E5F87795EE563DB57DDAA
-:10B96000A54F4A0CAF189DC587539DF3E33C70D695
-:10B970002783CD60E82FEE9F88725D382DAEDD9075
-:10B9800097CDF46E7D123B8F5F6EE1EF6F6533FAFA
-:10B99000FD5636D377BF4B2067D2793D5DA703CFE5
-:10B9A0000787F1DD3DB3E3C1F7AEEC80292FC57AFF
-:10B9B0006FC53ACEEF1CDD63D4387C76BA71C4FE15
-:10B9C000ACFDAEE2FBFF663661EBFF7FC69FBFBBFF
-:10B9D000CE83FE03C0CD6FD8FFEFAE4BA98F179774
-:10B9E00069CF66E7A1D43A27C10C34F575056CC55B
-:10B9F000621260E7BEE3BC101F12790189E9D58E9F
-:10BA0000712484A13C1CAE141F01A5888E6F1F9A5F
-:10BA1000276A8779545B4CCF42AE0D31DCFF9087AB
-:10BA2000D303EDAF2B98D7339007EB3B537A22F239
-:10BA300043E3473AA71BD6FF0CE5CC9AECBFAF9C7B
-:10BA4000117C4E4EDD3B3E9E9EAC87B967507BEC31
-:10BA5000FE87989C39CDB8670ABF7A7900CFAF4787
-:10BA60000DBF7DBE51C5A53E77A54E26D4AFDBE008
-:10BA700064DFDB93537BE0FBB96B6C84A4527E8163
-:10BA80007552BED5AB08BBBFF596F09B5AA683BCDA
-:10BA9000DD9E1B7A309B8EB34A61FEE29FB2B4EF0B
-:10BAA0004339999F0B27F37361255BE98432D18A6F
-:10BAB000715F17F07D75DA0263615FEF4BEA44F066
-:10BAC0005BBCB6880ADF54122D61F9799130F86BAE
-:10BAD00099E72707C0DF4D9E40481FC6C75517C4CA
-:10BAE000D19494C117C701FFFFD286F7A21FF7B206
-:10BAF000753EFE403E9EB350818FF26232FC4EB7DF
-:10BB0000B205EC72DAFFFB52F8896CBAAFE35EA7BC
-:10BB10006EA3EB9ABCF9BD8C0CFAFBE3FBABF05CBB
-:10BB200021BA4BD615B8DFD0F7E1772FA1E35DD06E
-:10BB3000E7C0F8F3054446F9BEC64EB6021F25829B
-:10BB4000EF07DF889F07E6C8914CF95DD6FAF7B991
-:10BB50001EF82041BEF16BBC5EE4CF3844FE8C5F22
-:10BB60001B317FC661C99F71D84304CE851D43F93F
-:10BB7000330D04F367E838C6FC990FAAE2AFA39F20
-:10BB8000CB73C7172909C64DC5DF3F281C799F8E87
-:10BB90002F5CA67CEC587F37FE9E287FE73301A7F9
-:10BBA00004F94B9F0CAD2F97E899C67E8CEF62F39A
-:10BBB0001460BDC3920714AB67F93F1DE98C4E0EAC
-:10BBC000E4787DD7D0A1AF2103789FF36AB7CF0186
-:10BBD000F1A41051F7E0FD1EBB637040F06121B489
-:10BBE000B3BF0B76B78D4A5EB0BBAFDEE07877C0EF
-:10BBF00020B71669E63281F60639BC1862D8741F80
-:10BC0000C9E71563FEDFA72490E61D418E3638E5AF
-:10BC100090DDB08FFE0476C4859C0EFB73E3C3AF4A
-:10BC200030C766CA631ADE9FE703F07B68B77A47BE
-:10BC3000969F00DF70A6717C2B1E7C587F3A38FBE4
-:10BC4000E1B00DE26A9512CBF3FF9BC33B9DE7BBCE
-:10BC5000B1FB030E4BBEFAE25CEBBA59BEFAFDE94A
-:10BC6000A19939D82F30C1785F60AF5D4B9942BF41
-:10BC7000FD5CEE58E1B289C3D9BAEFBD3CEF3E5945
-:10BC8000262D7B0CF0B7EEF71B398CCE45FB0E074B
-:10BC90003BCF02C1E7A4726F0561726F454E21CFA1
-:10BCA0001F4FB703BE1AD8106485F7109E2F0938AE
-:10BCB0000F831F87BB158E21125809F9DDA783E773
-:10BCC000865C6D450E9DF79A57921590FF2B9D83CC
-:10BCD00007C1671DE8B31D1E47BFEFB8C71DDD498B
-:10BCE000E03CAEF8C967E837B542657915641EDAFD
-:10BCF0003F929E2F7F79FEE8ED9FCED47031F0C742
-:10BD0000FB3C3F5BE8A5CEBC131320CFFEBD8CCA25
-:10BD100029B97E8CC36B9940473F4F6274F4001D74
-:10BD20008996D7FD6222DE87BF2A37AC423B91E776
-:10BD300047B4C109909770A670A27F1C4047A783A3
-:10BD4000D39A1CC2F831353E9DF4E4B0F8DFE9F82F
-:10BD500003EFA195FDFDF843C0539C6388F5A9B995
-:10BD60008C0EC557C0CD9A4FA4E6DA783B96AF78D3
-:10BD7000556E08E17C72CC27475D74EDFD4AFCF7F7
-:10BD80001D9E1CE5FE05BCFF5E72B83F39FEFA5EE3
-:10BD90004CC0C7FFA8F54DCDE5F43339FEFADE1EE1
-:10BDA00025FC4264F0ADF4BF831EA3789E0A78267A
-:10BDB0001D83281FFB33E2AFF3AFA35E67D8F1F713
-:10BDC000D0B782BE897E4D239EDFE724C73DBF5F8B
-:10BDD00046FD29F087ACE7F8E2BC9ECA0FDC6F9DF8
-:10BDE00073706526E07D1EDF771689A6C3F9E62FFE
-:10BDF00092F03C60989EE4FC41E195920BFA64E17C
-:10BE000020C635FA27C4970B29B98CEE86DA77B1AC
-:10BE10007912DD43C8CC9546750F819485311E5843
-:10BE2000E97447658A875B383E94FC9B54B00F2BBE
-:10BE3000735E3A02FBA4F0FF70089E86FCBE13AD51
-:10BE4000CF7BC73912CBED35F213E52D71F63321D7
-:10BE50002B3C21D7106F5CB3EB05EF3803BE4AC80B
-:10BE6000808DDDA31EB499FCE46C72467EF27E17D1
-:10BE7000E397F73242A80F403F80DEE97CFAC252D6
-:10BE80004026D81990DF33E8494639DA9E37A3387F
-:10BE90006080676DAEB02FE50476E3D7BB1F10B3AB
-:10BEA0009B2493FD1A1BDF8EBF0BFC54BA5F8C8B57
-:10BEB0008F0959DAA500CFBF646897C1D70A3FFD43
-:10BEC000CE59E978FF00E0373736DE10FE13E0F98F
-:10BED0001B595A3DC04DCD0CB0BC0191D73714BF92
-:10BEE000B07B8F3A63F01E2D5E92797C8DDA0DABBC
-:10BEF00061BD4A12E747E2C67BE4C26E2116FB86AB
-:10BF000014337F7745CE4BFF03F19FCE54C6B29DCD
-:10BF1000FFE4423FF06AC9ABC0BEA9FDF1E6F76994
-:10BF2000FB3089BEF92DF40F859D91227F9932FA5D
-:10BF3000750AFFF97479D6CF803D46D7536573E310
-:10BF400079E733747FB9546E5429EC5B399F5215ED
-:10BF50001DAF4A2ED83F40D7F51939953C9B7EBF7F
-:10BF600043181CD6BFF2870CF047ABEC8E1346B9D2
-:10BF7000658D7FDC956B8E7F7C4616FEE67C80CBE4
-:10BF8000AC0C84CBE4A7E6651BE32F43F10FBE8F17
-:10BF900025FA354C9E5AE49C906736277B6F84685F
-:10BFA00024E0CDC2381283BB2EE1FB57B345199C68
-:10BFB000145A9EC59124417FBAEFD9FC4B56857324
-:10BFC00040CE405A0FCC47BDBF1CF8B65FA806E074
-:10BFD0003B570AD9D93A222C0F91B414407B9B735A
-:10BFE0004086F945BC02579205E3887959D9C3CBFD
-:10BFF0001D759FAEBC2E303CAE41DC1EB47F15BE1D
-:10C00000BEE35EB76E33C43B92DCD1E398BFCABFD8
-:10C01000D6B8C7EDB2AE43FE7632E94579E9767F10
-:10C02000A40330BCC42B41F9FB52F8E7C017479575
-:10C030006E12A4BF9FFCF9E704DF65831B6245F025
-:10C0400035EB27BF7B3DE645FB43768B5E0A4BC055
-:10C0500047D9F5D6DFCDFACA49FAF1FE90140DE5BD
-:10C060007C9979FA784EA2388EA38AA17EF0466632
-:10C070000F1F4E66FD0F27B37E6F71BDD49CA110BC
-:10C08000CC8BC9723AC19EFFD8730CAE6C823EE96C
-:10C09000027DE274688857A157D6EEBD9900DE9AFA
-:10C0A000F72D4238FC5E62E7A4FA0A09F319C4BB13
-:10C0B0000FF593C8CBB4279991C7FC94A5CF8757A8
-:10C0C00034D172DD4BA4244ADB95CE0DD5C0FB2EB6
-:10C0D000ED2544DD44CBEDAEF08F7E02FB7885BDCF
-:10C0E00037B68EDFABA59858B39B8EBFE3CA31EA53
-:10C0F00016D852F56027E40B0D6E265EC82F194640
-:10C10000BFA7283F507A7804CA74DDEB5687FFE555
-:10C1100036DA3EF725A2621B5E0F3E0AE04FE2745C
-:10C1200001BFCFA5BFAFE37454B45F62E7FC3EF636
-:10C130000E180E0EEF7439D9FFAEDB5F79F934BA01
-:10C14000AEA2BEA948DEE3687BC883824C04D69EBB
-:10C15000D8E2B51F07ED0370AECFF043F2147C3F79
-:10C160008970F937DDC2873363FC80F5A5BCBC8ECE
-:10C17000EB2913DFC038D46FD7CAD9B13FF6F331FA
-:10C18000FE5089F8C3F8790689FD8171AB63F3A08D
-:10C190005C9EC7EB0E2E5F80F9DFD3EDD103C0EFBD
-:10C1A00033F9B7947F81DF9D148E57D85B0EFAE97F
-:10C1B0007ED23710B50D666908B4C37865242403B0
-:10C1C0009CCBBD9BDB617D1736BC9209F475735E19
-:10C1D00011D2DF2CA75AE4A224D25EA1AADE2278D3
-:10C1E0006F4C42B82CAD774620CF6DE9D07B3FE154
-:10C1F000E032CA3F5784257E0F3F1C6C30C46D452A
-:10C20000FEDFB224EA5FC791DF37E731FD2EFAAFD8
-:10C21000E3F75344FDDA3C37CBCFCCBB68461E9ED8
-:10C22000C7B0BC68CAFFB3F3A6C5E40A9D17F356AE
-:10C230009610CD01FB5AC2F957F0FF52ED56B46784
-:10C240009786CC76E9EF25866F7DB98476E215F581
-:10C2500023DBAD0BF3C4B9708117F500117A8AD1D5
-:10C260009590E78B41BF831CAEA5FADC603737DCC5
-:10C270007E2A1DFB65FF60ED97E7C4EEC3ACB3DC1F
-:10C280008769E6F761D6ED6B736401BDF3FB30EBB4
-:10C29000F6BFD369CC0314701A7E1F6610F31F9784
-:10C2A000299103704F68D94D748FB4FDAFF8FD89A3
-:10C2B00067E1FEC494181D79AE7445597E9D867958
-:10C2C0007E05DE1415F252BA6C5330AFA82BD5A3FD
-:10C2D0001AF378B6B4B5D4403B914F24EEBF2C4B43
-:10C2E000706EFCCD3C663F6F97585E97BEDC89F060
-:10C2F000F6CBE488F19EBFBF2884F97433F202388C
-:10C30000CF761E5F80FCD3A9F41BA1661AC317EB7E
-:10C310006F950F74BC0E18AFBA48C53C9AEA3496B4
-:10C320008FE6CF0C95DE3229366EDD7E96BF57172D
-:10C33000FAE410CBC35D5406F04C24D7ADFA8BD28F
-:10C34000DF3D408FC3F556B819E8CF51155A7E1D11
-:10C350001DF7E4CB0AE6DB918D9AE4A0ED7EFC822A
-:10C3600057857B781D95A14535586FC77B8259F558
-:10C37000249A44EBCB5E527A20CFAF91742B304E8F
-:10C38000A3458FDDE47E56013EBD69A72346970491
-:10C39000F213D52210784DBB87C545500E09F964BC
-:10C3A000A56732CE2C874A85DCA5F281E5F73530CA
-:10C3B000BD477E20417CE8A4E798CCFD6B947BD3FD
-:10C3C00084B0B2C8FB69FB9F437B46C0730E9517D0
-:10C3D000E0C749F0FB64EC87652A4F8B21EF742698
-:10C3E00049467A1B6647F0F5950DAD9FD94D424EF3
-:10C3F00056561002EF2358F143E7433A17E77D7092
-:10C40000B402E70833F9FC9FDBB449D120E08B4448
-:10C410006C14CE9D520BEA1D27E481D2EF16298CB5
-:10C4200072F1A7BA2E035C2F242D4B160611EF2FA5
-:10C4300001DE6739FB52000F4715D509F5359030FD
-:10C44000885F33BEE6BBEFB303BCE6E758F1A2DB7F
-:10C4500001BE0B02C3F085F70BB404F8D2845C2153
-:10C4600066B91224A7D8FDE6CD876E03FFF874F6EF
-:10C47000C9F7B2C247E3D1AFB05312E5E59DE4F28C
-:10C4800078B47979271DCCAF984106AEDF2D0DA782
-:10C49000938F0F6E90730CF424E8F4699EA72FFD20
-:10C4A00092E7FD967950FFC5F425A383725E9A0149
-:10C4B000F465A083D9FB5C5199EEB394F79F01F426
-:10C4C0003025A62FA33677402904BCAB5DB23CDCF7
-:10C4D0004ECECA0820FEA7DA34C4FF34EA8171BB0D
-:10C4E000D39D4FF75FE1EC6DB70710FFDF07FFA6A5
-:10C4F000920410FF9516BD53EDAEB3039D543BADB2
-:10C5000078D610FF35DE61BFDBBE0AFECF01FC0B23
-:10C51000BD320AFB94E27F42FE08E78D89F07F413D
-:10C52000BEFB8CF23205FEAD781772608FCB5BEDEF
-:10C5300086787023CB4B9EFAF2B8762867AD0DE271
-:10C540007D993DE9EAAFB0BE85D597F56932BCCF9C
-:10C5500058B49ED6D3F29E60A81ACAEB3648284734
-:10C56000A7BD166E87F2B88DACBE7453CBAFE09DFD
-:10C57000B3753AEBFFF4F14E7CAF22D2C9FB57768C
-:10C580005743795D17EBFF478F5307BFBCFC48A4A7
-:10C590001D7E9FB895AD43D87D7339BDED919EF852
-:10C5A00015F6EB66FD6E38E44C66FE12B3E3E6F07A
-:10C5B0007DCE7D88EDD3F7DEC5B5010AF7EB0675B4
-:10C5C00007CA0D5B5339CAD1047E5AA5D45D00DF7A
-:10C5D000F9544E10C43BA5D34296B7DA43A75893FB
-:10C5E000CFEC2691EF0979E78B0CF85A93CFFC0832
-:10C5F000D12E2B83B0FCE407D9BBB3221F357A3F81
-:10C6000091207E007B44FD9B203F757E510BEAD339
-:10C61000F9E788BCD401FB2A3A6FE9977FBA289ED4
-:10C620005F7E4B3EB3938EF13C7AF17B63246803CB
-:10C63000FF640F100FBE03147D19EC963DF0BE9100
-:10C64000E11D923D4156D6F3F7DFDD459DDC1B6CC5
-:10C650002D761D94C05809DF55B9AC8F44D352874D
-:10C66000AF7FBE9D4459FE045BFFF5ED4ACF1683B4
-:10C670001DBF54888F59E351AFD4713C09B9B194AF
-:10C68000E38BF2F9E67CBAFE65CE16B41B9713A6CF
-:10C69000D76F24118C6FDC68E1F335EE3FBF65B3D3
-:10C6A000411CCDCCCF6BE972D8F9FAE0C3BFA3F03F
-:10C6B0006F7CC0E305FDBFB6D7DCAEF181978F304C
-:10C6C000FBCBCCEF8D82DF23667EA70605E3F7FB6D
-:10C6D000CFC3731B713FD0E51C7C4B27B1FD0EE926
-:10C6E0007D0BFFB9E0BE6031F8353696A7C8CB6246
-:10C6F000DE4FBB995ED6A95EE67E108ADC4FFB2F2B
-:10C70000C17CF852A147B99C11FC5CCAF5FC303DD4
-:10C710005E6BF577EE433E99CA4B56FD2DF4B6B8E5
-:10C720008748C745FD4DF5F5CB1A5D6F9FCD1D01BF
-:10C7300078C7F47604F9688A93CA6B1BE2EF00E0CD
-:10C740006F1AC75B3BD7EB09FD03F7FAB8FE01F59B
-:10C7500037F01C61B85F1035D9FBC3CE3112D8FF5A
-:10C76000437873517B2A05FC7DC2ECE23C32AA3C43
-:10C77000112AB7DFCC1F416F2BCFB0DF0777B8305E
-:10C78000BE20E2EC82FF5E2F6076F8B65CED3D9055
-:10C79000FFFD7CBE7E3E7EFFCDF3F1FCFBCF44C3AC
-:10C7A000F36FC867CA8F937F01E7DF1D8678697FC3
-:10C7B0007AFC38F8275CFE941610FCFEC9AF7D0A9F
-:10C7C000EB3FA6B038FBB164FE4D65E714FF3BD4E8
-:10C7D0009EC98F4CFE15EF911FCB30C7E7453B3FFD
-:10C7E000FFBEDFEA0C7518E2E181FB935A408FF936
-:10C7F0008B785EFC7A46C7279F4ADF617C272E50E4
-:10C8000050595A300DDA694A2EC4679E62FAA2D98D
-:10C810003EA0C0FB3E3E7F38A5C00FF79B88F604C4
-:10C820008C1318509650789FE4E7FE27F97B402739
-:10C830005DEC2BD6152858540AFD4EDE3C80726301
-:10C84000A8BC6800E542A02084F39E5C2AEA79F93E
-:10C850006E5626DCAFACE47C8271E33871E2E171A4
-:10C8600061F37B37EB94F8E7D5A4C0638AF7AED8C1
-:10C87000CFE2902B9DA4339FD65FBD3F1BFD8DC69D
-:10C88000547D02D0C3D78DE39E1CD387FBDA523987
-:10C8900038F6C1323C17C678D1DAFDCFA1FC5B2B4C
-:10C8A000F866AF996F66178CEE3CC51A671F053F97
-:10C8B000CD2F18C10E7A12F4972386875B787E53AA
-:10C8C0008DDC540D71A54F5713BC677BCB0B32D257
-:10C8D000D52D3F92F0DD0961C7ADE5704EB42FB89C
-:10C8E000A71030C815B8A71030F875704FC158861A
-:10C8F0007B0AC6F6704FC1580FF7148CF5704FC104
-:10C90000582E25D7B6439C6E5D17F14602ECDE82A9
-:10C91000B13FDC5B3096E1DE82B13FDC5B30963FBD
-:10C92000250C6E9F3E2463FC1FEE2F18FBDFF0C228
-:10C930008FCBA3B06D17CB536B7751F8031DEA5A19
-:10C94000DF240A9FD51C3E70BFC138EE07A9173DF2
-:10C950000FF859DD77FD42F85EB0EF26D3B8A49BFF
-:10C96000C9E316FA17E0783D09A5813F37850C1E0B
-:10C9700082784773445261DE1B1E30CBEDA1F74C29
-:10C9800022E6DFD71043FC37383CEEBFA5C0E343B7
-:10C99000BACA2379C6784F8C1EDC6A14E0F09AACD0
-:10C9A000C6A38752726E1AC6799E97218641FE48A9
-:10C9B0005AB6CF920CE703167824E598E9C21530F1
-:10C9C000D3454AB1992E3CAA992ED22ACC7491AE65
-:10C9D0009D37227C336BCD74B2466E42BE1770AE6B
-:10C9E000A07F01CE53E0854A802FDD27C48BADF0B8
-:10C9F0006DDCBFAD13ECFE3385EF9316F87E466613
-:10CA000055BB03585DE72C8FD93165CFB7E021B016
-:10CA1000357E2AE028EC081107A5FA1FEDE9985F9A
-:10CA2000CFFC3D6A1F1C2CC0F303E6E7012581DC27
-:10CA3000BC8E84513E5D67B10F6E70DFA7807D3084
-:10CA40006CBFD43283F70BADFB057B8B18E25256DB
-:10CA5000FB40DA2F453D9361BBFB859C0E7F89C669
-:10CA600090268D466EF47AB4FF02B9058EA2B3DC2F
-:10CA700014378E6BF7897508B888F993488B9C0337
-:10CA8000F45C6CB5CFCCFEB5F0C745BC5DC4B585D4
-:10CA90003F2DFC182B9CE57382ED40FF53BDC28FE8
-:10CAA000EEBB0A7E17FEB3D56F1DBA170090857BCB
-:10CAB000373C4E7FA77F9593BDCBC7F84EFCDEE990
-:10CAC0005B9C36523EE61DADE67B30741BDA88F780
-:10CAD0008A00645970EE4420A842B65E7A6800DE8F
-:10CAE000DAD97AD98B83CFD2EF96921F0C6C82BAA7
-:10CAF000535FCA00D7A1783E61F78415DE4F29E85D
-:10CB0000BC19F468B26A27EF1AE8C24935D5BBC52B
-:10CB10007C5ED0133943F5BF319EEBFFA3BE775146
-:10CB2000F8BC3B7E847A456D8C67D759E1259EC35E
-:10CB3000704DBAE838D8272E62D837EA4343598E69
-:10CB4000C10B55AB8CF7A644BD06EF977CDD7D018C
-:10CB5000DEDF7518CBD157DE7718D71F617905F660
-:10CB60001081FC5BC547EB8DFA65880E2943951B48
-:10CB7000F6378A7D01D380FBC9EC1286EFBFD5BEA4
-:10CB80003A2CF88271435967F5FAF4B37C7DD1B33E
-:10CB90001CBF64D1D90D3F6DD1D90D3FFD2C5F5F16
-:10CBA000F42CC72F597C76AF4F5B7C76E3573FCB95
-:10CBB000D7173DCBF14B969CDDF0D3969CDDF0D39F
-:10CBC000CFF2F545CF6EFCEA6807BA2BA204DE97D8
-:10CBD0000874103518A0262BFD19FCF92295609ECB
-:10CBE00006E17E4921F74BB66D6DA90717EA115D85
-:10CBF00009603C88FAF739B47E2261F58F742DC63E
-:10CC0000386BDB980979F05E95BBEBA2E3707F6F20
-:10CC1000A2CEFC71EBBF1BB64833FFFB6B9757648A
-:10CC20009ACAD3FACCEF575CD55864AA5F1E3EDF90
-:10CC3000F2EFE74D35FFBB64A19996F7206E26C64B
-:10CC40007B918524AA427CA5F06E5B159C9BD9C183
-:10CC500067BE90FEB753C17E1AFD6BF45F0AA92729
-:10CC600034347E10E0A698C6775BEACFF41EEAFE65
-:10CC7000B1F1EFA112786432CEBD736B1E26B1DF25
-:10CC800088F13981AF3B37DBD0E5FD6C2BC1771ED6
-:10CC9000AB23011BBE83CEF1763E273DB1EF48ABFF
-:10CCA000F93E7AA14EAA009F451DC406F1B5E04E9B
-:10CCB000A26A04E34248278FE8F1E9E411E2AD8279
-:10CCC00077B91E8910FC77B2045DDCE908E4C1B9CC
-:10CCD000DAF95D8C1E049D04804E52212FC8FAEEB5
-:10CCE00080155F644A94AEF591AD8519C67C54B247
-:10CCF0009BC1DD49FF8E84AFE29D667C0588A1FC67
-:10CD000015F0F5E9D7C497E20B45D37C10CF240189
-:10CD1000C8933A3866820DE011EC52D1FFAFA5CD31
-:10CD200000CEC12EF69E9AC093186F6B2B89CE331E
-:10CD3000F87F4135AA019C6BE44955907FBEA30C56
-:10CD400043C6C3F0B383789321EEBDA3CB968C6F1B
-:10CD500054EFA3782921E4BF372F4B2BA6F53D4193
-:10CD6000920CEF6CF5B4D9F0DDB29EA7A47AF3BBB8
-:10CD7000CAD1245B0EEE23C956815F3BFB6AFC4B94
-:10CD8000ECAC3E2A4379ECC661EF7EC8509F5E6BE7
-:10CD9000F97703892641FBE473581E679A667ECFB4
-:10CDA000C651619607148C7D39E5106FE1F4CEDF32
-:10CDB000498DD490C826BAEE73B8DCB1D251FA1DB1
-:10CDC0008B9198DAC67C03E5594F9B82F077707996
-:10CDD000453632BAD0E95FA0A7740B1D7954331DD4
-:10CDE00039E402CCC3157C25D623E66F1B93956CE2
-:10CDF000C775D9F13D6C87554E58D6E7866020C57A
-:10CE00009DDB4722115AEFD0197F10B91F7F774C55
-:10CE1000272433F815D6F935E553E89CBF8D7CF20D
-:10CE2000F031EF9CC6F6F999CADEB5AEEE60F4EECD
-:10CE3000D9CAE81D6E74B37C2D6D61AEE15C752FAF
-:10CE4000975356B879FAB46AA0E78BE49734C88F41
-:10CE5000B8FB3546FF6D630E3F0FE5AD7733F8073E
-:10CE60005586674A2F6A942EFDEE3BDC98173CB539
-:10CE70008CE20BF0FF92599E4CEB33C3B1C82237C2
-:10CE80008209E06AE5D74470FD96806B39856BD1E5
-:10CE900099C355D1997C4E9FC5DE593C384661FFF8
-:10CEA0003EAFCEE098AEA9287F2F924F45D368BB06
-:10CEB0006D1A9537749DB51A83B7779690E36678A7
-:10CEC0000AF922E05FC8E1EF55BD2FC0BFF3E2D6FB
-:10CED000ED2420017CFF5B033BA27B9A9037830407
-:10CEE000F096A631BA1570EE9ECDE05CA871387749
-:10CEF00071B8494402385BE9D52A9FD3BE269C7796
-:10CF00009DC3E3F159A4FCABC0795B0A7B47D931DF
-:10CF10008EC1D5E11E8C829CED0ADA715F07820A10
-:10CF2000D67795B0FAFB5356E680BEEDF277E60071
-:10CF30005DB605AFCF01F9EECAE1728668EEDCF2AC
-:10CF4000D8BD831A792BBE43DA1950103F9E407C1E
-:10CF5000F995362BECC47926D9898C7078488D07E1
-:10CF6000076799629297F98D66F8A658E0EBFA9AEE
-:10CF7000F2E1B5AF291FEE216CFD778E17EF347407
-:10CF80003B513F55DC8471F34C3ED7E685DF65BFEE
-:10CF900073BD66F8BDB610E489DBAE023C13ADBBD1
-:10CFA000A795F0F75A9CFCFD16F6AECB3678D785E0
-:10CFB00096BF03EFBA2401FDB3775DB6C0BB2EF474
-:10CFC000DB05EFBA9C0BF6B4865FF9D2427C7FF0AA
-:10CFD000B35A82F1F14D297F25F1E055D465D67F12
-:10CFE000413DD9F20E9B59CF65CCCB3395BDB3CC27
-:10CFF000EFB67954F66EDBFF0164680340008000F1
-:10D00000000000001F8B080000000000000BDD7D09
-:10D010000B7854C5D9F09C3D6737BBC966B3B9924C
-:10D0200040124E42081B0861810483829E84406343
-:10D030004D71435151A88D40314248285E1A7FF509
-:10D04000C94282841834A0585A2F2C378BB56AB441
-:10D0500051A922DD2052FAD5964551F152BFF55221
-:10D060002F40258A177C3E5BFF79DF99D93DE76425
-:10D0700013C0E2FFF8FDF1C1C99C993367E6BDBF5B
-:10D08000EFBC332184906FE8BF04CF0412F410FC8E
-:10D0900081BA433D9704EDD1FA23C3EB1C6A3A21D0
-:10D0A0005677A5E139F1F7115F22562D248390546C
-:10D0B000DE365DBED71E2E26644DCDAC24520CFD4F
-:10D0C000B450266D4F80469590D5566F968F3E4F43
-:10D0D000A85954435C84AC6A2124388A90F6163BE4
-:10D0E000962B726CDE601A2177BE2C7BE3E82B3620
-:10D0F000CDA7B969FFDE9C5B09A1CFD7B80919920A
-:10D10000479FBB9711924F88423F20D1BA5233E3D9
-:10D110002352425F98B3849049D1F9ACA9B1788386
-:10D12000A584C4253BBDF07D52ACBC13A66D6EFA40
-:10D13000DF37F4FD6FE0E782681947583BAE13BE56
-:10D14000A3EAEA04BE676C6F7E537A74AFAE7DAC1F
-:10D150009A98F63E2CF61C72CE37322DE579497539
-:10D160004E5A96A71092D5FF7B5FB69047F78E4434
-:10D170008012920E653D01782A7CCCD5C9B3ECC4EF
-:10D180001985B378BECACDE01B27D1CAE4FEE3B649
-:10D19000015CE3A2758510AD1BF0915D1AB3BF2849
-:10D1A0002906082923A4B32578F03D6BF4B9730A46
-:10D1B0007DDFD9BFFF4C55C679CF55552C9D4A9080
-:10D1C000B869BF442F7D5F0717A77666DFA73FA525
-:10D1D0006974BD2E4E37E477920278B5F37A8254A3
-:10D1E00037572D037CF9081941FB956BA4AE987D48
-:10D1F0004F13EF49502AE41D41DF79AC74D3760612
-:10D20000522869BBDDD8AE6620BC705C25FABEF63C
-:10D210008D34F0BCBFAB12F0F8CEC841DA6DDE7AC7
-:10D22000E0A77ECF558B80635F1A859BCCD71B030D
-:10D230008E6DC0DF028EB293C1B14DCADB19A6FC60
-:10D2400066D55C5E8A115291A676035FB6694EE49C
-:10D25000CBB6B4EE5025AD9F28B57861A8C49195A2
-:10D26000C88F6D43F71D5E08709DB9FFC36D08350B
-:10D270002D5425E04BDB133DD5A12A9DBC11F88A26
-:10D28000E7BF778C7D20BC9296A917CF236E4A2AE0
-:10D29000CE21362253BC384656D9EB9C51FCD8E0FF
-:10D2A00017FA3C3E6DC64732E5FB78AF0E8FF0EFC4
-:10D2B0001B564778D0C5DBB26FFDB904449119E91C
-:10D2C0007700E6A3A8BEE8FCC8D9C717C94E43BE7D
-:10D2D000278A3713E4657F7AF733BEE7FD06E60B4E
-:10D2E000D66FBA5C93791585CB9A17987C241E2645
-:10D2F000176C7686CF354463EDD98A97BE41D664E4
-:10D30000AE44F9D1AECE6F07F9F979A685C8123CC3
-:10D310005F6F07F9A198E447BACF62D00743E6C42C
-:10D320001BE4FE9A825928CF069A67569DF1FD614B
-:10D33000F5C6F77396A518EAE23D6BE6452F55A5AD
-:10D3400046EBAB943A3BC8915B33D74B753AFA1E28
-:10D350005254F73AD0ABA8DB3267E27B7139A53182
-:10D36000E7B5CFA3BD0572A25D65F326EED870BE0A
-:10D370008BEBA1BBB91E3AD53A37F2FEBFE6FDEF03
-:10D380006D716319C167C13506BCACCEA2F29A8E2D
-:10D3900007B0D77FFF29B5EE73985F14CF96287C2E
-:10D3A00080698B175B805FC5386D59F90EC0DBFA59
-:10D3B000EAC1E727F4AAE867557CC44BDFB312A3A0
-:10D3C0001CB7A5590CF89890C7E5C6B66B0CDFDD05
-:10D3D0009B3C63631EA5ABF587648274F73BE3FA5D
-:10D3E000FAD3AB711DEB33D9FA07A66FD3BAA944B0
-:10D3F00088D011D6534CF5A1A6FEF9A6F6D1A6F613
-:10D4000009A6FAB9A6FE95A6FA0F4DFD6799EA5747
-:10D4100098FACF37B52F36B52F37D5FF8FB17F2983
-:10D42000C3F3F5E2D920F205F4BAB9BFA268885F68
-:10D43000A1E7237CE536F2E30F722AB43C66671855
-:10D44000F02BE8F374F1B39ACAB810F093A23A50F3
-:10D4500099962F267A7A589F998FFAA38D4E0BF5BD
-:10D4600037B75F52041D5773FB70CE12031DF5E6EC
-:10D47000143AC07E24CE34944BA7A20B89A418DBA7
-:10D48000B5A1D1F67CF8FFD9A58B53D37180EBDD24
-:10D49000C1E72DE4C023C37DD7223E02D49E1E1BCC
-:10D4A00085931AB1A7E9C728DF6D49238138AAEF10
-:10D4B000B6F82D58FF3C937E08EC952AC687237852
-:10D4C0007F42C2128C23E6D3CEE9651DC8295ADEFD
-:10D4D00001728A96B7B56462B97AAD256B218C5713
-:10D4E00063433CA58EBBD5AF4059595E04FAFBB6E9
-:10D4F000B13B340BAD279E94497022B5174AAE2834
-:10D5000087E5244C9F9FB9173EF735FDCE24E04EAA
-:10D510008246C6E62A12B08E2364ED9EAC1F7AE8DE
-:10D52000B86A81E275405BB177859286FDFCE03692
-:10D53000A84ADFFE11B43EBCC082F685B5BCAF057B
-:10D54000EC7731EFB53FA4844B3BE6557B2D7E0A4B
-:10D550008215C3EB7E05701ADE492C1AADAB7E55E1
-:10D5600002B9F6469E8AF276EB1F28438E800FF5AD
-:10D5700065819EFD62AD6D25CC73603C11D952FE74
-:10D58000ED4B310EDA9943F1B906F4AC2A484274F6
-:10D59000951F76C13C9D32AB3F9777CCB7B2385AD6
-:10D5A0007F2CEF987B256DEF9C986B8175E4A5B976
-:10D5B000B4400CBA3A0CF218D6B776D170BD1E340E
-:10D5C000976A0D1D77082D8B7909B4760EC09F9749
-:10D5D0002A7F9EC9EA0738DCD466DE9EC6CAB3FD40
-:10D5E0001DF3F8AFE5B9855D3A94FB8FC5CE8C414C
-:10D5F000EDD3C37965FDED532AE886029D6FB27ABB
-:10D60000875AE8D89BD6DA889FF2D4A61C827EA2DD
-:10D610007F8D2DB01DF84351875EAAB3BB026B32DC
-:10D62000AED0E8FB0189CCD1CBC97B399CEFCA973E
-:10D63000707ED3E5637E99D2EF263F413B6B137139
-:10D640003BC01E89E0DBFFB90FE990E3BB2ABF6A4C
-:10D650001DD02959C8F4667E549EAD50E8389B61B0
-:10D660001C5ADFDC6EC1F96DDA45F9977EEAF39B4F
-:10D67000DFB180DD3C96042DB0BE312480A5872C1F
-:10D68000B30050BAB91EDFC6F9B790F237FA3B20A3
-:10D69000FA68FBA5C3EBBE06BE48222AD655BF1BBF
-:10D6A000E9A9715772652CFBC0966FE17E26A957D8
-:10D6B00026713F87C1D9965FD61FFE56B20CE17E18
-:10D6C00093C767CF07FF6EE7C1E030DAF4C4AB461B
-:10D6D000BA05A8CCD2C99D1CFE9D24AF4F93E93852
-:10D6E0007B72EB92E1FDC6FA4FF665C0D07E3FBE7D
-:10D6F0003F39DF8DFDAE08764F8761C679C395400F
-:10D700000B63AB7BF700C98CD136839B413CE53F73
-:10D71000DF93AAC23CEA86C23885A17005908FB318
-:10D72000FE603003E773BE05E86204CC87D3472D63
-:10D73000D2978A7422F00DF4504BEB573430F850E6
-:10D740008310DB89E236CC7FCB2A4A27CEFE749247
-:10D750009ACFEC236F148EC43AB87FE5CD8F41BFCA
-:10D76000022EB37ABC560817F87EE75E053ED0CC91
-:10D7700040DF5E077DDE9E5B770EACB374A3AF1512
-:10D78000E8CFB92BE4877E024ECE29214DC27EDA46
-:10D79000B9D06FD3CD9595A817BA08FA4B427F9AA6
-:10D7A000F16F9D62B4F708E9C2F58CEC32DAE994C6
-:10D7B0008E519FF7A3E39B23741CAF8F4B08FD137F
-:10D7C000E8B4C47BC0CFA0FE078E35801C7980EB07
-:10D7D0002541D7E27901891D67B8323FE2CF66CA99
-:10D7E00083C3FBCAFC18FEAC0BF86304F2CB7CC00D
-:10D7F000879BF461FBF09B8DFCD2B8F3937DC3E86B
-:10D80000FC9DA5EA04C08FF87E03C737A5E3C54891
-:10D81000C71BFBF6815E1B7E33A3E36BC1D6488F2B
-:10D82000D2E34D1E6D297C47D099793D4BF87ADAC9
-:10D83000737DD7C278576CEC7EDE81EFF9AE473E40
-:10D84000DB180A3A4814BEC3397CE36E89E0D90D6F
-:10D85000F263568DF779D0CF3E8F7B3A9433D5BEA5
-:10D8600036302DE6D6CB06BBCF8C5F4A5FAD485F26
-:10D87000C4374D92C09AEDB6A2FE1C806EA27AD338
-:10D880002FE8FEE653C8ED3B62E1E174C73F99EB38
-:10D89000BB1BDE4FA9F611E4D3D39DD769F61371F4
-:10D8A000B3A81D1BB0EBED5841F71DEDB3D04F16DB
-:10D8B0007810CF57B5CFAACE033A772ADE58FE4F5D
-:10D8C00044DF703ABF9FD3F97A6E7F7571FBEBF638
-:10D8D0001615E57B678B07CB8E162F8F879663B95E
-:10D8E000AA45C37EF29A4F2BD07FBF99605C6B65CF
-:10D8F0004289148BAEF2FC467B7F78B311EFA9D539
-:10D9000046FF3B596F2FD37F49E5F986F644EF6810
-:10D9100043FB69C48B0F00DDDBD22A0DFD48F813F1
-:10D92000837D2BE0385D9E87F1620A4FB4AB853D65
-:10D930002BDA09A9C378AED5E467769AECD80E80C5
-:10D9400023C297C1B10BE088F02DE7F0AC667E13DF
-:10D95000F77BE285DF53B47ECE7C8C8B1094572B03
-:10D96000726CA89F3BF298BDDD8F7E3275F293F208
-:10D97000FCEA354C9F0B7BFCF99C57AAC1AEDD92AB
-:10D98000694139B9256D8F672BD6E3BD4C9FFABB32
-:10D990003C147F560F8F57538ACDA2EB4DE47CB3D6
-:10D9A000DA4A30FEDD91EEF4421C2CD1B3A806FB1E
-:10D9B00099BE4BC8CF89DEFF23EFD51BEC0EA25CCE
-:10D9C00063586764FEA536368E44241827A5D866AA
-:10D9D000C09F9DE8EA79305F5B148F79B05E8E2737
-:10D9E000939D23E214663CB96B8CFA6675117BBF7C
-:10D9F00037E701C4BB19BEAE2A23FD7670BA684B67
-:10DA0000DF827C68EE6F1E9F4C8937F87F1D9EC1B8
-:10DA1000E324C29F16FDC08F76C7E86FF6A3CF86BA
-:10DA2000BFEEC6EF19F55D0C7F7DD2085D3C49C0A5
-:10DA30003B8207115FE47E98885B8BF114C2C6C3FA
-:10DA40003AC6B7FD28FF7E99E0423FB2C0690B801D
-:10DA50002C2CA0F3003A6EFB55426025ADAF4B98DD
-:10DA6000D99744EB05DB6415DB9DBEA11067EEDDA5
-:10DA7000306368987EF71EA9EEA211BA38DCB6E4CE
-:10DA80001B32993DA0BC13F600934BE8E7FAD74D43
-:10DA90000C69608F1711EF76025E306B17F444F457
-:10DAA00075B97FFDB3114CEF66CE25CBBA63E07F2D
-:10DAB0000D6F8FCA715F3CCA6B2EC70B38BCB6772F
-:10DAC000CD8AD7CB71DDF3A4587475B6E4771BC843
-:10DAD000EF51F09D1735D4DBA584CBEF47C8F75144
-:10DAE0007E2FCBAB5B3DA22CC67E9F1246F93D51EB
-:10DAF000D5DA01EFE9E0EF015E7E4AF112631DCF56
-:10DB00008E60F6CDF7152F42AF6EEF7A9CE1A558E7
-:10DB1000E0E57612CBFFFD1EE0E569807B3FBD4A64
-:10DB2000C2B80FFB45B6F60CB43FA56ABB007F1127
-:10DB3000FC5C169B6FFEF91DE3E77EEEB7AEE7F8DF
-:10DB4000E9E2F1F1DB397E3AB9BEEEE0F869E7FAD5
-:10DB5000FA56C04FDC99F3CDF066237E52ABE34D0D
-:10DB6000F830E227A9DC889F44AF113F099ED126F7
-:10DB70007C18F1935EA022FCE2328D78EAC737A7C9
-:10DB8000F057D2609C187672765DA802F6B886CE01
-:10DB9000E9EEB5C220BEAE0A28C57AEF35F9A5A2D6
-:10DBA0004C2F6078CD9C161BEF16DE1EC8D7A40242
-:10DBB0003D9DFC20361FDB79FF63AA1667E87F5185
-:10DBC000ECFE2EDEFFF5E15AA2BE3FFDB94B1EC4AE
-:10DBD0005F30AF3F41D2D20B701DEACE30C5FDB6EB
-:10DBE000156C1F729B43ED86FD7CFF0AA777BB8AED
-:10DBF00023F9ECE01FF171883F09C7CDE59F19EECD
-:10DC0000DCFF15ECFBE52DC81E7A356DCF5B9E79E8
-:10DC1000A48E96A30B46E03CF3EBBD7B00CEB26B2B
-:10DC2000CE50B67F3CCFFDFE184A6AC154E91B7046
-:10DC3000B8DDB1F7ED4529F42995836807D2890449
-:10DC4000B6533A8D5388929802EBD5705D56B06307
-:10DC500065586F17D6E34937964E1262FBD7DC1F23
-:10DC60003DAF200FC7731337FAAB29C48BA5E06310
-:10DC70007B1A51D227E0F86D7113082AFCF3C05FBC
-:10DC800075666FEE009F46A3509884AC82F090EECC
-:10DC9000DA87EB271EA2B278DBCD6ECC4FF8335D6E
-:10DCA000DF98D35FDFE9F6FBD2E12A21498434DB38
-:10DCB00059F98B78D71628BF74E4062068A58DA87B
-:10DCC000FB31E0D55F49D0FEF0BF951068C5C92E85
-:10DCD0003B87F907A73DCEBCB334CECFCED2388D2B
-:10DCE00005E9A71EE736F87532EC63FA9643FFB6EE
-:10DCF000E44968778AD20CD77D1EED06989F627F33
-:10DD000029F7BDD4A8DDE67C5342BBAD4D0A12888D
-:10DD100053FADF96D0BE22C50C4F4E9578F2C64519
-:10DD2000C7717A970D67F12E16EF59F1F75F8C02E4
-:10DD3000FBFB970933C349F4FDAD07A99D0779346F
-:10DD4000D3BCAFD7537A4A4FB579B750FA49E57E7D
-:10DD500072DCDA4907EAE9AF9F8C62FCBDA365BFBC
-:10DD6000BB8D0AA444C57BE104FA9E93EFDF12B990
-:10DD7000260C7663E22445853D8E2239580DF32525
-:10DD80004D16027C714F83713FB7B3B008E122EAB0
-:10DD9000C3F87E2E2955FA227936D48EDF58C0F387
-:10DDA0006A5CC40576A1F26F2D2956DE8328C5FC76
-:10DDB0004AD3A8DE4A82B820E5145A96760631F98D
-:10DDC000A3D21BB4831DBB2140FC360AA707E7FB87
-:10DDD000AE81F13ACB7D0960976F3834EBA2B17414
-:10DDE000DEA1B0E205100447A5E0BA439ABC368133
-:10DDF0003EDFF9A6C50DEBDBCADFEFF449C8FFF73C
-:10DE0000CC23013F85C7D6863D7619ECDE90858C04
-:10DE1000443B973A5C93B82854215ECBF8FE965168
-:10DE2000E9F8B027B43C19E0B22EE1FC9046C7AF48
-:10DE3000AD6671E71972F6F3306EA8D386F849E73C
-:10DE4000F94712A945FB39659ECE5EA6FF123B99A4
-:10DE50005F19BA8E60DE535299D3EBA7DF7B22CCD9
-:10DE6000F68DEEA96671671709E2F767C8BB1C1645
-:10DE7000FABCA75A71033D2599EC73278C4749AE2C
-:10DE800067231BCF359E8D9768CA83B28B79B9E91A
-:10DE9000BC28FEE44405F1ECAE36E64FB94CEF3950
-:10DEA0004DDF7B59E0399B14029E4FF86E98F812B3
-:10DEB000B67AD558F9139D2D2454A5CBB7700E1002
-:10DEC0003FFCB290F909B6ACBD7698D709DF2B6953
-:10DED00010EE7AE15FFBDEBB03CA7FFF574F135D95
-:10DEE000D75FBF3ABCED518063F36D2F221D72BF27
-:10DEF0006A084C81CEE7F95A1BC2B14C63F101525A
-:10DF0000DABBD75A8AEDB8AFB5768F03DB87959326
-:10DF10008083C27398A265FD0CF835247B57A83026
-:10DF200088E6CC9A44D85615ADAFBD92120E950F27
-:10DF3000E9F334D95F0CF190174822C5F7064D522A
-:10DF400059FE9BF43CF0534E95847E58CE219F039E
-:10DF5000E8E1C46C0BE6BFACA8BDF4C29174FCFB55
-:10DF60002A148C375457555C0EEDC30E317A715D0F
-:10DF7000C7F047E114ACA2FC30E2108B279492B0BA
-:10DF80003748DB877989350DF4C73C0A60985F27ED
-:10DF9000C70F8F0F949686FC00D444AF118F6E1379
-:10DFA0001ECD78758DA47804FD52448A985FC7EC25
-:10DFB000C75ADE6743D544F45FEF5189DF3AAE3F7D
-:10DFC000BE5EA4F6A346EDBF10B51FA1FC1BB51F96
-:10DFD000A1ECA1F62394895AC545A574BEA1743A53
-:10DFE0002EF05F4DD94AD81FB86FEAD537FD93960A
-:10DFF000657C9F8D726A4A25FDCE2CE062565FAF2C
-:10E00000519BE4A552D9505F9BA6887D3C3FE8D444
-:10E01000C42C0BDFE79971A746EB9D990ADFD76304
-:10E02000F511C5C450EFA9B118EAE7EDD18D3F0550
-:10E03000F01387F5092377AEF71744DBEF28A475B3
-:10E04000DA7E80DB73B54B2DBE2D31E877D948469B
-:10E05000BFCABF895FA2F8FAAC80A09F2E5B349440
-:10E06000DFA4505141BEF6D7CB540EEAFDEB022A95
-:10E070005775F191C3853CAEEEAB60713612FDF978
-:10E080007A12CFB322F0BC330476C4ADAF5EE90D93
-:10E090009281E5AE355339A2A7938B051D8C2423BD
-:10E0A000D19F27530E54009D754D54801E4A391F31
-:10E0B000106EC761889FD2CF539FDEFD174D053F7D
-:10E0C000ADDDDD3612F37E2E1FA9CB935995BE68C8
-:10E0D00022E83391F7434895FB7DBA2EC97FA90505
-:10E0E000ECB681ED1485BCAF83476FED8C24D00373
-:10E0F0004E2EC7CDFD57B5EC7C05BEBFBAA51B4B58
-:10E10000679A0F858C5DF163FC669FA7AE11E6658B
-:10E11000CFA6ED3A396C4BA3EF19FC806C667709FA
-:10E120003CB809C683C4BEC986CE09F17114189DD6
-:10E13000545F807CDE109A8579159DDE0983C6AF19
-:10E140004EC5275BAB5E2269148E4FBE3AF32FB3E8
-:10E15000697910F88DEAC12738DFE4943FF6DAB523
-:10E16000067E396AE297A3267E397A0A7EB9E04EA6
-:10E1700068EFC9540CF51CE0175D7D6B845F583D5A
-:10E18000CA2F47915FEE79D986F58D238F1AF865EE
-:10E190004521AD67EBF865BAECDB12C30E78E53BC1
-:10E1A000E2975F9F29BFBC7166FCF2C4D9E3973F39
-:10E1B0008E4CFFEEF8C5779AFCE2EBCF2F87605EBE
-:10E1C00067CA2F9DEE20E60376CEB6540762E0FBC9
-:10E1D0007A8E6F11F72EE3718A69F3B4CBC7823D53
-:10E1E000CBF3D6443E4DE73CA6BF57D4CE407DB9D5
-:10E1F000F520D397423F97713CFE8DC731CA424C00
-:10E200006FA6974BF8FE4C4D0AA8F4D74E6A12A49D
-:10E2100082BE9E22912E1596BAAC76A414B59BE8C8
-:10E22000F7D06EBACFCBF266C92166EFD8E97F404E
-:10E230004F17975B0D7A7588D9FE32D5C53EA6D8A3
-:10E24000BFBC0FF212283CBE1EC9ED2693BE15704E
-:10E25000D870A812ED90CFB36D83EE5775F2F546E6
-:10E26000ECA9525F45AC78587DA184F0BEC9A3C526
-:10E270001796813EBE0AF5AED0E766BDDC53F59237
-:10E2800051CEF8C7A75616EBE48C7F3CEACD889CAC
-:10E29000E1F501E50C3907E546442FF37A442FF305
-:10E2A0007A442FF37A44CEC0F8D951BD3CF281F1C3
-:10E2B00077FA757A7B19D4B34FAD9717707970B62A
-:10E2C000E5CC1FB8BDFA5DE9E5CA424E2FFFB99C07
-:10E2D000A929FC0EE54C2DC899A453CB995A90332B
-:10E2E000C506397355E1B7D0CB890DBD7ED8BFBF08
-:10E2F0006200BA77707C371568D7C0F8A4E6F4F2EC
-:10E30000B6CD74D55BFBC0AA0CA0172FF3F3067A29
-:10E310003FB1F9F7AFB4E9F2A21395103B5FD1FC1E
-:10E32000243E9FDB7010E365A79A6F7D21C1D2ACBC
-:10E33000477B6BF7D9916EBD16DC13FFB6F3E89CF3
-:10E34000CDF8F28DED4FAF073EBA8FC7FDCC76AE5C
-:10E35000C0EBE9DA3FE6EF5E3F52C571CDDF3F1516
-:10E36000DD523ADD0C747A22FBBA31E0E7C98977D5
-:10E370002500BCBE07FAF0C96F43A7AF8C64F83C18
-:10E380008D750761FCEF6ADDFF017FBEFC6DD6BDB8
-:10E39000A090D1D569ACFBBFBF4B7CFF07FEC26725
-:10E3A000DF66DDCB04BE093B2FE3865F289FACFF11
-:10E3B00057E1DB10BF58FFEFD18FC13ABBBEB26F40
-:10E3C00086F805F9FA1BD9AD3F3F45D8B99944FE07
-:10E3D0005EA28F9D877157EBCE4791E879295C0F3C
-:10E3E000C63722ED07629D97FBAE4BB047DEB10EFC
-:10E3F000D26E63713BF3F3FF2E90D83936A9D60164
-:10E4000079F1BDB3F760BE41E7EC09B86F65B6536B
-:10E41000C47B3D2D1AC6933A5B7C58DEDE521D82CA
-:10E42000B8C9932FBD25413E58E94B0DA8DFD64E04
-:10E43000FAE130CCE39B5A1A0FF5DB4D768A8BDB81
-:10E4400029DE51AFDFA9F75F9EFC4D13CA4111874A
-:10E45000BA2362BFD0F7549D9F44EB400E113F0991
-:10E46000EA063F69D97AB05F7AC07EA1FDA78E5ACD
-:10E47000B63ED677D65A483DD82F6B1B2CD5B1EC7B
-:10E480009770416CFB85D671DFCD91680FACCC03E2
-:10E490007B86D4E9E36AA7B25F1E1EF5DDFA495711
-:10E4A0008C3A3B7E52846FB9DD32A4485B0821D997
-:10E4B000B32527869DA69C18D65F4EDC38EA5BF80C
-:10E4C00049E102965F2DE86BABEAC578726735C10A
-:10E4D000F8636768656A09AD3FD1602112AD5FFFDF
-:10E4E000328B0B6F2827013847BB219B603DE465C9
-:10E4F00074304376FE08E2E03D55D47F52216EF73A
-:10E50000E35A80EDBA8499B73928BDD4962B04FC20
-:10E51000A619F214FC4E4863F9A1B54EF2A338F0E7
-:10E52000ABA62A64E519C4AD13E562897224E54FF0
-:10E530003519F876A078B439FE4CE417BC802F73F7
-:10E540001CFA4CE3CFDB055D7DFBF833F2DF970F60
-:10E5500034CD8278EEA9E871C12815F599594F9903
-:10E56000F958D0D340F4E7043B69A2AECECFE186A0
-:10E57000F93EB513ECA48951BAE8AD9D94142BFF74
-:10E580004A9409CD7F78457F1E2F41E9C6F1129A42
-:10E5900077E1F3BB206F00D6A778519E3E5849E53E
-:10E5A000708CF9ED6E597608E4E7AE96662C2F5024
-:10E5B000FAE414DAFFE916FF2180DBCE96762C9F71
-:10E5C0006CE9C2F69E968D58DED112C0726DCB0EEC
-:10E5D0002C6F6BE9C6F2C17CF69D294A10C7B9E0E1
-:10E5E000241D5F474753FBE87774F83EEF43BFA114
-:10E5F0007D72B8DDD07ECEE12E43BD2CB4D1D0DF0C
-:10E600003D2560686F2AA83B067CE92ADD6178EE2B
-:10E610002CEE36BC77BA7EC1D9EE976B7F04B6C9B3
-:10E6200049329CBBA0AFC8706E88F2F190662A5E3A
-:10E6300069FDFE441EE7E866FBE49924F283740951
-:10E64000A964601FF426B23CC8D62CF67EEB8DACD4
-:10E650007E7F0EDB3F12799AB23D42D744CA88EEE4
-:10E66000E7DF9FC8CF2915B0BCC8DCE200442448CE
-:10E670002E24A8C17E4829DB2713FBDEAD3CEE70BB
-:10E68000BF95EC94A83DD9AAB0F9B76A24B082F638
-:10E690006B2D66F57BAA48C002F3D7A814CFD0ED46
-:10E6A0007337EFFB4A2A89EE9793D11AEED7C87CCD
-:10E6B0009F3DB2EFED7897E0BE3E87D7CA848F3199
-:10E6C0008F36B9B94F02FE1AD2DCD70BF3BBFF1657
-:10E6D0009B1ACB1FEABDE58B2CE09B4D377E910545
-:10E6E000CCBE29923FD3E7D0E7CFE472B86C6ACEB4
-:10E6F000C7FC854DF52E2F87B3C5D48EF90C9FD757
-:10E70000F3FB0988827ED1307714AE01913F22431A
-:10E71000DE1D5DFF88E8F9D3FF34BF6653F37296C0
-:10E720005F934D787ECD4CF427051E364139AEFF00
-:10E73000B9DEEF3ABFE6947935A63C0703FD42DD2A
-:10E740006FA66F15F112C7E95BBA99E5456499E8C0
-:10E7500046E45D08BA14F919225F43E46FD8785E85
-:10E7600007FD2CCF6B8E4D5FB63DC403E7DE644BD7
-:10E77000BC774BDEA9F3089A3DF95C392C1BC7C660
-:10E7800065F903FF334AFB85A72C3A6E9E47BB51C0
-:10E790005F17E556F875321DC21BAE027BB5A85C4B
-:10E7A0006B85F37C29A504CFE994964B58161D621E
-:10E7B000F5DB3C327EAFCDC3E24DA27EB1A63D0774
-:10E7C000EF2799DEBB38F29E15FBFDDE63E1A5C2A3
-:10E7D000E6CDF3906772FA5E3D5966F9D155129312
-:10E7E0001BB0A13A89EB430ABF8B89FB92025DDC27
-:10E7F000F5C71C5BB7B7B0FC3E910FFDB79765CC72
-:10E80000877696FBA6C1D9B3B2502808FBEBA5DBEF
-:10E81000883B4585F98535E0C7153977EF817C88D8
-:10E82000272E647BB6171F62F6C28FCBAFC6FB469E
-:10E830005C5FCB188F754F49F406E0433556A6FF51
-:10E84000453E74B9D15EA835D90B179FE2FE8F14EF
-:10E85000D2E7073DF988C7148FE5F7800C24BFA3E2
-:10E86000F78030F950CAC77496BB1D10BF2E3A64AA
-:10E87000C1E39EF2364DC6F3B19D2CCFE389906F74
-:10E88000D0F3A82F723886B89CF81BCF93ECE172B6
-:10E89000E2752E270E839CA0E52B3C4FF210CF9300
-:10E8A000349F97D8D152FD92DEDE319745927F1684
-:10E8B000E6416D56089EBF1BE0BE8FA2001DC790AB
-:10E8C000C7B802E9676FF2DD15401CEB350BDA952E
-:10E8D0005D5348562CFFAEEBC2CA41F30F3B5BE6DB
-:10E8E000BCD43688DFE8B4517F26D6FB1E71AEABB0
-:10E8F0000BCF5BA4955B08E45565D9FBD8FE43AF0D
-:10E9000003E97988D78EFBFB649E93BCABCB53B9EC
-:10E91000DDD7350BE6FFE03605CFE7887113BD7410
-:10E920003E3A3A499BB22713E6DF39359809F64C4F
-:10E93000D7F87D1B0B205FE4A04C800CCCF3B21603
-:10E94000717F96AF2B4DD1A45879EA03ADEB038FBD
-:10E9500064B867C20CFF01ED0EC80818FCBC95B383
-:10E960002846FEE269CC13EDDB6F765C3B1BCF4D96
-:10E970009EE6FD17099C0EB3161207FADD408F8341
-:10E98000E0D9650D21DED62EB454C73A5F5B54C47E
-:10E99000F0BDB6F453B48B4971EC7924959BE9959D
-:10E9A000CDE70E858E4FDFEB2A8D3DFEE51C6F9483
-:10E9B000AE5F0379D5556D41BB22092E62C0FC1CA8
-:10E9C0006A074948EF28973E2BB5313BC1242FFAFF
-:10E9D0007DBF54474FF9FDE5D0F9454E437CFF44D8
-:10E9E000F6ECA4600C3C8B52C051C8A1FE70247898
-:10E9F000FEB58BC39114C7E6EB28BE56887855DD6B
-:10EA000029CEEBCD2E2A8B714E6C003C98E9E18E1D
-:10EA1000853E5C1779EE35A282BE2CA5FCA88B43FF
-:10EA20000C043F33BC167EC7F032B7FFA888C74737
-:10EA30004E739DA7DD8FDA456E9D5D0C87A2155A3A
-:10EA40009FCAEB3FF64BE17BA85C9576FD09ED9EF6
-:10EA5000A9BCFC3194543FEE9282EFBE415F9E22EE
-:10EA6000A93980B4594F8F820819B9555A66B07FB9
-:10EA70003A24EFE167302ED4970AFDA6933A852118
-:10EA80003980EBFA93146E05857529D15641D94822
-:10EA9000BA6CF05E63CF9F0EC3771A7B1C4119825C
-:10EAA000933BADC7F471A36BF4E747F2E0168D6EAC
-:10EAB0005B1E9DCF921DC67DD20612C2F196761BBB
-:10EAC0009F9BCF8F4832050C5C4E10C97F9D82F909
-:10EAD000BDC4C1DAE3478BF3E87D85FAFBCCEA39A4
-:10EAE000BCEAEDCE20DC2F4402C6798A7B739EA758
-:10EAF00072CC3E01CFC33C0C74FC91DBEEB7507B73
-:10EB00003923A5AE11E07115516DAC647683589729
-:10EB1000B887668173B60DE0BBA0DDBC0ECD06F3F1
-:10EB2000F959D7E0EB1378FF4711C175DC5EA46299
-:10EB3000B934BE66BF06CDA5A15CFD7D104D5C3F1E
-:10EB40009065A906FE7D51D023D1E4D3597F7FB8CB
-:10EB500016609C4CC075603A35C6C976C121D77421
-:10EB600084DFCB7AF811A5AE04C615EBF96759E836
-:10EB70008120ECAB26B27BA0DE4DA97B03FAE71C1B
-:10EB80000EBF2FD1A913A75A08EBFC78E747AFC8EF
-:10EB9000F9D1F51112BE1BF2A3EB77CAEE0E58CFD6
-:10EBA000CEE70E03BD0FB42E911F4BE901E146E7FE
-:10EBB000F521E837F3BC8EDE407E0A76C974B9D8F9
-:10EBC00010477986C3F19E62DFC7F05EE94BD92E0C
-:10EBD000BC7F27BF7BDF503A8FBEEB25CCAB4D937C
-:10EBE0004915C04FE4237CEA54D0CF4E4BF0CB2ED6
-:10EBF0005AEFBB8A78B7C034BCCBBC402A724EB146
-:10EC0000B783D24DC6F5B20FE4C9DFAF5B90BC80CD
-:10EC10009619890B9347D0F28238E277D0F13224EB
-:10EC20008BAF1B8350F3932FA1F3FC491C9D27ADA1
-:10EC3000E7DD90101C41F9ED8F3662077A4D4BA845
-:10EC40005B371DBE932CE37C8E503B51A172ACE22E
-:10EC5000F2CF26DAE9F7867EED9C00F3C96A9E467C
-:10EC6000DEA5A03C5CC4F8E4E8C35F4E8473E0F228
-:10EC7000374E2F9E33E7F4973682C1C38CEFDD1CED
-:10EC80001E6FC6337FA731DD762BC4DB3FE6FE0F58
-:10EC9000D13CE82F5CC7FD8537E3991FF466A18856
-:10ECA0002F05D3F5F66DA3434BBA0C9C076A274199
-:10ECB000BEF3676E2D2919FA111FF2ED75DC6FFE98
-:10ECC00098906AA0F3EBD64C1B9242DF4F6F6570B1
-:10ECD00030CF6FEC68A69F1B4E5282D6C5CF1A94D8
-:10ECE000A00DE477C3499BE1F9DFA91DEDD79D573E
-:10ECF000FFC98787A6C3FCAE24E155D0FFCAEB123B
-:10ED000058E09EF36B0F9FC74070694C568842E1F4
-:10ED1000D12811DF60FD9EF9B71C13BEB34733FB4A
-:10ED2000257D5AECF55DC4D7376D75CD2F81CE1A90
-:10ED30004356B4E5AFFB43C590C1ECE7C693E791FA
-:10ED4000802EFED7A884111E8D27CFC7E7D3561F6C
-:10ED5000B301DDC3382A7D7E9D431B02F1DA81E0D9
-:10ED6000BC9BDB418D2793893F55FF9CF17774FC59
-:10ED7000346CFF2D87DB6FF75BAA63E577358F6611
-:10ED800070199DAEF8201F684C90689B637C57F407
-:10ED9000CB4831EE5F98E7D55319BE12E67D4E158C
-:10EDA000D1627D6F3187A3986F4F4A78910FE9B395
-:10EDB000AF10EE9988D4DD7DB9FA7B24B672FCF5EC
-:10EDC000FC309C0BE37F7C61EC733B02CF9394653A
-:10EDD000682FBF9052F734C8B77997D10AA58F2111
-:10EDE000F38216763EC53F28BEA370964960E26066
-:10EDF00070B661BB18EFA317393F523F1CF2D4AF76
-:10EE0000E2F2FFAA6D4B30EF49C8A98F36CA28A796
-:10EE10003E42DD42CB8084F6EBFC3A0A6B2A571661
-:10EE20006D9FB60FD4C15599D4064D61CF6F86B290
-:10EE3000CD6A88F78BEF2D38CCECB7859D463D57D2
-:10EE40004F3A3F01FBE0A317993CA0FC6D0379BC4E
-:10EE5000E82EE338F5DB2EFA00E6576FF2CB33B835
-:10EE60007E36DB799B47F3F8FE2432E94CFCF24610
-:10EE7000A2ED188D7AC127C33CCA14E33D5BA24CB6
-:10EE80002F61F05FBEFD84CDA50E3CEE112A470A2E
-:10EE9000E8B8C7A83F0EE51F476BBF1F4DF170FCD8
-:10EEA0002083CB81D1754FC1F78E1F64EBFFB4E196
-:10EEB000D345704F0C99C3EC8638387C407F8D9BCE
-:10EEC0006B0FB4D2F5AEA662CA01E782E2983D228A
-:10EED000EC3059BE5676D1F6C9FF58980CEB4C7BF6
-:10EEE000E807D5305EFA43091AC0ADA3421B0FF202
-:10EEF000BEA3D6E985F32A9B291996D3F7ED741C96
-:10EF0000D02781DF4EDE03DB9105DDEB2AE1DE1742
-:10EF1000F7AEDEE030BAAE760BBB27A3FD7CE26D28
-:10EF200025D1EF35EDAA7D0CE6953B9BEA0709CE8E
-:10EF3000D16BE3DDBAF109B7AF1A394E8E3F3BEA28
-:10EF40008EF3E05CC27E19CDC74F1BF2D1AF1F4DCF
-:10EF5000183D89FC7BF836D891027EC7A8BE22BA3C
-:10EF60003CB5D1DD52D04AD7B5B4E731BC8FA361EF
-:10EF70006530632EE8DB0715A647F9FCD2FE9855ED
-:10EF8000A9BAA2FA77AEE4463B52D8C99713F15317
-:10EF90008CF1C2399C0F2EE7F6F1DC0406E7F9C4C8
-:10EFA0009B0BEF5D61272E0B85D9DC69DD65CB40BE
-:10EFB000EF2EB126837D036B898577519AED20C1B1
-:10EFC000878D0F24FA21EEFAB1D45708831CB13291
-:10EFD0003EEB7B362EB025AFFF38D631CCAF6F2C51
-:10EFE000E4765D01D1E0FC40E3EE51781E2C2E9ECC
-:10EFF000E27102CA3F3BE0F579D0FF74DDD73CE314
-:10F0000008E2B930715F999BF813E9779A760FD9C6
-:10F01000027646DA086DFC723ADEC7D6702ECA0B4D
-:10F020002ADF24AA5B73C7ACB944A17CD53894DA33
-:10F030005DB47ED14377B37A7E789185D6AF7DE893
-:10F04000D14B144A9F8DA3C3EF43FD96879E66F56F
-:10F0500009E14532AD6F7C683FEB0F7BD894B0B6C9
-:10F060003F74E012F0FF8F2433FB8178C35702FD19
-:10F07000343E3DCAD2A15BEFBA314C3E1E71B07E28
-:10F0800047F2C84F6701BC3DE1C259BA7DB9EBC731
-:10F09000083B96D971629DE23D92197BFCB1639861
-:10F0A0001EBD661AEB7741026977B0F3757EB0C773
-:10F0B000F6EE1A8570491993C2E145C7298D8E2352
-:10F0C000E028C613DF5D0C7A1DE4BE95CA7D9D9CC9
-:10F0D0003997E38D7EA70DBF53AC8D877BAC1A6744
-:10F0E000658F07BC517C291C5F8A1D2F57DBCCE63E
-:10F0F00047C74D2E413D3311E2CA7BBFA6FDF3A2A7
-:10F10000F336D3C78C314C1E5DD3CACEF7F7258FAB
-:10F11000403ABA2081D98BA494C28FCAB38D1C6E99
-:10F12000EBC624333F32828721128EDFCAE197CDAE
-:10F13000FA9FE97AE7F0799CEDF5EAF0A4417C6565
-:10F14000EFCE22C4D3C6081DAC338C736485E9BDF1
-:10F1500072CA78308F9411F8DE6A07B1E373B22572
-:10F16000F25E1E7DEF82697D13811F96727B98F897
-:10F17000CFC7BC86062E2D96B6876C10975EDACD6B
-:10F18000E2E4A480AE0FE863564D295F9F9BAFCFAA
-:10F19000CDD61730D02739D4973B3BB13FDD46E081
-:10F1A0001E19AF78021FCFC0CFB1C603BE18081F0B
-:10F1B0001D671B1F629E267846E06C9A9F8027F091
-:10F1C00031BE576CE42731CF5BC644E2B1467ECEF8
-:10F1D000FB96DFAB60EF2DBD91E211EC1FD548CF60
-:10F1E0004B7BF22CF38BA3EFB577AFF0819C4F9064
-:10F1F000541607EFA9F583FE6BDA558171AAA54F66
-:10F200003DFCA49FBEBFF8D10D2E48AEFA48E9CA16
-:10F21000003BB861FB2A17DC33F7A1E27781FCFCE5
-:10F220002820C7CC5B7F9BCB01617735727D73E46F
-:10F23000B7B7CD04787CB1DD8AE70C9B76C405E3D3
-:10F24000306E720DDA63B4FE36ABAFFE04FCD8A6A6
-:10F250009D46FB69F16F3664A8484FFE6116DC04D9
-:10F260000B0E83CDB0C66D56DC4F693C247BE9673D
-:10F270004813E9BB15E6677E1FE67192E2BDA95B04
-:10F28000BE0AF2FBCCED5492A03DD6D4731BDA69D2
-:10F290004D3D177E00764593299FA27E003BECC52D
-:10F2A00031DC0EE3F7A40BF890403ADA37AD0FFEED
-:10F2B000B2E46D3AAF63DBFEE2928AF57A7325E23F
-:10F2C000E9D3EE059B9E5607D6AF1F837D10A77F1F
-:10F2D0008FE157DD29B18DA15DAC6CB0065D101FCB
-:10F2E00068D86CF5520D4C1A1EDEFAC0AFC1BF7C57
-:10F2F0002DCE0BA9A64B1E7EFE9573697DC963D6E4
-:10F30000B41A367D27EC730B3C41CE06D829022F68
-:10F310008B7FFFBC0DE290F01CEC5E819F258FF58A
-:10F32000DAE09C9F198ED3BA7B6D980F6BC653F7AA
-:10F33000DB33C004697DF04B1BD0F747BB25BCF71E
-:10F34000DEFC7EFDE6E75D40870027F04305BE2238
-:10F35000F8EB87B7E0CCA74BB11FC6434E85BFC7BC
-:10F3600001476548E78F3C0D7194D7E3BC0087FAED
-:10F3700047AE75C17A3E5096317ABF6F5506DC971D
-:10F38000576FF567B8B164CFEBEFBF1EE9F0EA83C2
-:10F39000D767B07B24B42C768FA63F0BD6F9B37B0E
-:10F3A0002FC1752E22754887F5F7B1F8C6E70AA96F
-:10F3B0007E2C06BFCC2D66FCF2C19638480E221F6B
-:10F3C000C03E02EC9BBC28E3B9FB7EF72291E558D6
-:10F3D000FF9CC717C61547EEEDB3837DD7C47B35B9
-:10F3E0006D5B1D023C1DC9D186403C9FC2C1CFE16F
-:10F3F00026C1BDEFF2C1E943189E880AFB21F81E21
-:10F40000B5C7A7C173E81FB26A8E12C37BFC7E1B0F
-:10F41000F67D11DFA0F38E87FDF40F32585E9E79E2
-:10F420007D1DC5421E9010D1D3D940FCBF6D0DD2B9
-:10F43000D7678718FF34066AABB13D640D0E81F6BD
-:10F4400040EF6C09E5439C61FF3C421FDBAC9CBF75
-:10F450008DED749E8AA487EF6E09EFD314F4B2E8A1
-:10F46000AE38C37E7D947E8CF745097E157ED6D559
-:10F470005C1E98D76D960F97169BFE8EC2BDE9A7AE
-:10F4800015FF6EB0061EF835F033E55FBF0AFC6C61
-:10F49000C5F8C0D1DF3DF7CA1594EE8F760B3E3626
-:10F4A000CA5B331FD73F5E4662F1F151A797C4E4B0
-:10F4B00063FA3C261F3BD9B9E9FF57F2F6EA01E4AB
-:10F4C000ADBFD8286F3F27C549E711D0334BF0BEF9
-:10F4D00057337C85DF6B96A399C56A4C394A7F0EFA
-:10F4E000111D3C051C057D2E7E68297E2742C782A2
-:10F4F0004E051D47E8D4BC6E233CCDED5530775DFD
-:10F50000FE837525F563C0CE7D560E6CA1533B4E30
-:10F51000E7722B85FFF1DFE561BED12AEE071C778C
-:10F52000F7B9207F6C15F73BFA202E99147DDEE7A2
-:10F5300060F6D2715F9F2B596737BDBD4B76819DB9
-:10F54000170E90EA58F1242AB1711E6132503BDB4C
-:10F55000173BCEE3A1C779BC73BAECCC6D8638708B
-:10F5600017BBD77FE18ACB5CB02F707CD7883B80FC
-:10F57000FF7EF66799DDEBE9D714C89358C0404089
-:10F580003E24FEBBA7D0752ED8B504F31BCC7194D6
-:10F5900045CE6DB8BFF039B9194B73FC6431C4590D
-:10F5A00080DEEF353DDF7511D2D762137DD5017D49
-:10F5B00065F5A7AF1704BF8E27E3F5E7CF9673B9BC
-:10F5C000375D2EBE03EC99E3D4CFC75C02B9F800D7
-:10F5D000E8DDCFC1EF07C6F0A723DD2EA9FBD0C61B
-:10F5E000EF71467A177468F6F7CDE5B127FE3EE96C
-:10F5F00026DAA5E1C9374AEEA1E5B1275F2B7C06E3
-:10F60000EA4FBD9AFB06E9DF7FDAEEAFD0BF39BE25
-:10F610003B0EE7737CF79F726F82FAD37198877500
-:10F620007C651CE645F9772706E03CDFF11C16B740
-:10F630006B7DF6CB12CCBF206D88C793C536668F25
-:10F64000ECFA9FB7207FFAD35D712AC4299A7627F6
-:10F65000A0DFDEF4B403F35E8E3FFBE5247D9CE97E
-:10F660003F5D4FA38DC5338F2792398F033D2733DD
-:10F67000FFAEE999C95B215F6E694FAF0DF607A632
-:10F68000FDF15F2520978E3FCEEC0FEACFDF0F37DD
-:10F690001DCA639BEEB652787F0C3622F5C3378DB8
-:10F6A000EDBE14FCF0FE706170384EE100EBA2700C
-:10F6B000A907793A103C868EB521FD7FFFE0F1095C
-:10F6C000FA170DBBCE413E8AC245D2D8F3C4805D45
-:10F6D000C2F5B3E7BBBF2C017BEA68F70AB40B4E57
-:10F6E000B5EEC963BFAF74F06DD72D054F67DD73FD
-:10F6F000BEB7F866F4FF16D757663EE84FE74FDD12
-:10F7000080F54712BD38DFD3E4FFE6FFDFF0FEB837
-:10F7100084FBF2A7C2FB2FFFD7E2FDCF1CEF896E5F
-:10F72000C82F3BFEECBF72896EFDA75AF793FF4BC3
-:10F73000D71DB18F649F1DAEB8EF24C1109C5F5FD1
-:10F7400035809DF2EE5849E4EFA01F22F277E4B431
-:10F75000C56867C8691D6837AC22EC1E64BF6AE1E2
-:10F76000F7B1B1BCEFF66C6F00E3A28AAF7E33ADA8
-:10F770005B8737783B7004A37F2667D454439CA5EE
-:10F7800075059D171DA735DDE26E55E19A764B3064
-:10F79000AE04CBB7A15C9DF1C3FDF05DC569BCAF04
-:10F7A000D669F237E20B6CC6BC62B2C70DFBD50E50
-:10F7B000AF0277B95353D678BF6DEF58B6AF1D4F30
-:10F7C0000298B779A6704A2D191C4E66F808B8F54C
-:10F7D0008313F747C57DFC4A5A4708F85021D49F48
-:10F7E00064EB413F14FE8E14ECD7589316793BD846
-:10F7F0007E8A1AB9C71FF220B8BF19B96756B5A0DB
-:10F800005F2AE0AC1B0FD76F86F399C257E0C54162
-:10F8100066219E1DD94E6F80CE7F95CAE0BE8AC2FA
-:10F820001DEE1717F0157033E3E17DA0519D1D1FEC
-:10F830002D8DF93AFE4AE2817D96E9F294B01FECF3
-:10F84000E5F204B4978F49242851FFED5845462529
-:10F85000F815C7726C0A9453FBE89A74F3BDE0A4E0
-:10F860003DF237F4A05E41920DF5633985F8FE3420
-:10F870007B96E1BD0390B74DFDF66359E576DC0F4D
-:10F8800075E719DE9B99E0DA02ED07208F1BBF3F79
-:10F8900003FD9B1F641619C699F9CEB17BAFA2E593
-:10F8A0004EEE57F74DB5623CFED89FE755021C2F30
-:10F8B00054C71BFA1F24EE74202ABABE2A58DF450B
-:10F8C0009EC986EF36BCBDA710E2103FF256189EC7
-:10F8D0005F5C7EA1611C9F3D1C04F2AED56A0DCF1A
-:10F8E0001B9ABF204A2A21E7357F4D9489D47C0F8B
-:10F8F000761BC699B87FA7A1BF37E49E0626E3848E
-:10F90000C3DEE7A014F9ECB654BBDF42CBB16F57AE
-:10F91000CAB0EF59F65E5D2B84A1CF3B463C400751
-:10F92000E79078DC0F1C28EFFD4B4BA00ED6F90BAF
-:10F9300039E081327ED8A21258D747999D326C4B5C
-:10F94000DF23D55D5E0276D6678156A85FF075B776
-:10F950000CFE64EB0E19CFD74D976B12FE0AF2B86E
-:10F960005BC21CFF06A705E3F04753BA4BAED5D1E7
-:10F970009DC8DB31F371D1C48A25307E5BA6D6D514
-:10F980000BF2B4F2EF57CA31CEBB12B7F15EBAA296
-:10F9900089BEDB619F5EE425C54F935972FB0FACB6
-:10F9A000182FB9D5E27570A1807AD73DC3BA19F87E
-:10F9B000DD3A8EC98DF8BF1015E241F1A975329C70
-:10F9C000B323774898D722BEB7A09CE5DBDF5E2241
-:10F9D000EE3771A7FF642CBC9FC8F205209606EF96
-:10F9E000D558D04E711DF6EE83FBC8EEF41C728321
-:10F9F00078E8A979C70FFB223D874353258A9721D1
-:10FA00009D15270A587F02F1CD1E4F55C258D46F5D
-:10FA1000E59887B39CE7CFF44EFD8D07F4C7F2A2BB
-:10FA2000D14306CB2F779D9488AACB33B08E5371E8
-:10FA30005E2E258CE7C55C27156C27E1F1CC1FE411
-:10FA4000E3BBE6A9AF5E0BF3D86FC57C67A2684B3A
-:10FA5000601D1DA3DF543B701D84FF5D9130FEDDF2
-:10FA60003CC84FC20BD19470E64F629CC33BB2A31B
-:10FA70002C19FCF2D40A2F9E1B4C7D588E9C9B05A2
-:10FA800038DC0EFFC373B597BE5A45C7DD01B2928D
-:10FA9000B50709A5EF0E9B68A7A2C6C3EF3DC4F644
-:10FAA0004B2F831843BC6CEC3F2E3FD25FB36746AD
-:10FAB000C7FF43C9A5AFB6C584671CEAEB8E1956CC
-:10FAC000CC9F38355C134E01571783EBD7542B640A
-:10FAD00044E38BEF496A2ED0DB9D705C80FAD1BF86
-:10FAE0004CAE0B96A4C3FC8363E1F97C9736642A81
-:10FAF000A5BF1E9B967B23C6491C98FF55FBF3A30D
-:10FB00001BE1C8986BE6114F1BD08DA2254C8038A5
-:10FB100095FB0B940B22CF2D0A474ACFF49BB75B82
-:10FB2000A2759013AE285C35B82BB84307673BAD80
-:10FB3000D772B8FECF23F597B5017E17DA912EAEB6
-:10FB4000E53CD5964CBA20CFEE84FB814B811E4E0E
-:10FB5000ECB062326B0F34821EF5D8D9DFF5490B59
-:10FB600067C2DF71197BD082F1BD37297D68401FE4
-:10FB7000C1F1087731DE8929AFA6C0F98913694A36
-:10FB80000AC06771D88670FB894282707F6A4FDA3B
-:10FB9000C26915C81F2AB677F371264FD4FE518269
-:10FBA0007A9D9FFFD5CE95E1BED481F065DECF87EB
-:10FBB000F8F0B92903D3415B851DEF1F6A2A5F5115
-:10FBC0000C7A62797221E663355549A8879B9A3F82
-:10FBD00043B88BF1959332517579533D104D4CD705
-:10FBE000DD237FD286ED0DCD27509ED3E9E401DFE2
-:10FBF0001CE3FB9D5D56F2D35A5A36FC5BFE69ADA1
-:10FC000013F72DDB419F34903DB6E53A7948BA3F72
-:10FC100089C8FF71147777D6BC180F72B656725F19
-:10FC200002970ECCEADE7B19ECE7D73ADC97C0FEF0
-:10FC30007F8EF71156CF715F02FBFD631F4D9A0354
-:10FC4000FBFBB559EE0DF09741AFF016CDC1F63C78
-:10FC5000F7CB509F316E06AB27323A4879347F8E0E
-:10FC60001FF5B913E1F2697B4260B07B48AE6E7E4E
-:10FC7000C600977EEDB284795198B841E9E79F6B51
-:10FC800086B17B710B4298A735721C8BAF67A4B00D
-:10FC90003FC92BF277D346100DF657D39E72B07B37
-:10FCA0005BDF0BE502FCAE7ECA1184B8E4D2FB9E9A
-:10FCB000B3813E9A2FAB85C057B3CBEAC68C2B835A
-:10FCC000F84908EB5737EFC679754C70F3FB72FBB8
-:10FCD0008A217E55CFF39EEB4DF9BF8B9D7B311E64
-:10FCE000B7789B31EEB68484DF023E6DF8DDE079B3
-:10FCF000BFEF58D83C140E8FF972E84A1B9BD7F916
-:10FD0000E3E8F797A6F462DEB1E20E65D4217C1B2E
-:10FD10003CE8AF64C6E3B99A5B87BE5E12EBBE985F
-:10FD2000EE16AAFF29CB3DDEB2134BE77882EB1922
-:10FD3000A2846D5E3A4E2397CB9342EFD8F4F983B9
-:10FD400073395C9376B2FD6F735EEC5CD05700172D
-:10FD5000BECFBC74D60B53002F029F1724906ECCDD
-:10FD60005F4D215E8E172FE045C03FBADF4CDFCBE1
-:10FD70008B451702FE84E5DBC53379D1F78403EDAB
-:10FD80002BF3FCAFE3FA57ACA39DD7079A7F3BD781
-:10FD9000B7677BFEED5CAE9BD721F8583C177C6CB7
-:10FDA0005EB798F799D359C8763A7426E44C23A9DC
-:10FDB000F3605C96CB150167314F01AF9E01F25D98
-:10FDC00095E63F18D6A3842AF1B0FC7650A420C74C
-:10FDD000BA2FC4942BA57917F63BD3F508793BD0FD
-:10FDE000BA849C35AF4FC85BB14E2177C57AA75214
-:10FDF0004182F210EE7E90C07FA833D8C3157062A6
-:10FE000041BF0F64FFB9A13EDD7DA3A1FF0F3257B3
-:10FE100018DA2F54D718DA2FF2AC33D47FE4FD95DB
-:10FE2000C9AEDF6C68AFD51E34B44F0987A681DD3B
-:10FE3000FDB7966ACCE73EFFC3BEE7A01E6C7163B8
-:10FE40007D4F4B26967B5B54E4EF7D2D1E2CF7B740
-:10FE500078F1F97FB59463F9428B8665A8C587A5CB
-:10FE6000592ECCFCFD650AD8EDE5A12EF407C68F0E
-:10FE7000AFFB0CE4E1014BA03591C2E99C37997DC1
-:10FE80004E02667DFCE55B37815E77B37BE8DA7A0C
-:10FE9000274B6A0C7BCE45F59DA6A317574D98C0FE
-:10FEA000FEB28BC4CEBBFC6A1CCBF7C17C3D4A9B27
-:10FEB00073ECEC5EDB397324CC4F9C43D879055A44
-:10FEC00006EB68FB4C85F841FFD73A15DC8F22FC26
-:10FED000FCF0256C9A70BFBA3F0EF4775A2A9E57F1
-:10FEE0009A0D0FE97C654DC6BCD64BCAFF82F980DE
-:10FEF0005738D9DFCDBA7CFFCA7FDE44DB499BBFD0
-:10FF00008C9D8710F786BC6E3913BBE12B386300DC
-:10FF100079A09297FDDD9464C5ABF70744F9D771DA
-:10FF2000CC1F98D9CACF0B1C2468C7097EA4EB6BE1
-:10FF300087F90BBEA8752BC1512ED0F7EBA641FF58
-:10FF4000FF0B270420E00080000000001F8B08004A
-:10FF500000000000000BB55A0B74146596BED5D591
-:10FF6000AF904EE88400411E76886020AF4E271D7A
-:10FF7000C26B28124054C446650714A540313C9317
-:10FF800018981547F774633308AC6737337A5C5DAC
-:10FF9000C1D3E0A0ECACE7102171339A300D2A8F69
-:10FFA0005947A3828266B141E4B126742428E270E5
-:10FFB0008E7BEFFDABE8AE4E02E859939373F35797
-:10FFC000FDF5FFFF7DDFFB552D3FE4720701A0BA71
-:10FFD0006C4D1E14209D221DB7215DBEFA3B30F7EB
-:10FFE000C3F1EA0B602E06982ABF164C2D01387F0C
-:10FFF00004DC369C3FA65D3DB3CB85FF5CFE5182A1
-:020000021000EC
-:100000000100ABECF83F8ECB3AEB2AFAE2BF45E1B8
-:100010007A30D335FCF911FF8A0F34813927361E27
-:10002000F77DFDDB346FB75F05B305A0D93F876966
-:10003000D8BF18CC2300F6FA6B78FC8E7F358FF78B
-:10004000F9034C0FF8D733FDABBF8EEFBFE77F9EB0
-:10005000C7EFFB434C5BFDDBF97A83DB09D01FE084
-:10006000426BC540350F8F46632F6E689F9CE94BEE
-:10007000416A16740E1DC883D40E968C0CA473248A
-:1000800096075E0F403AD3B08AF79767BEC5F2C0B5
-:100090001F9F1DF99D0DDA4F463F339402DC03820A
-:1000A000FFD965FF7D494AA5819A23A1BCEECDEC1D
-:1000B000031B2580FB2090BF00E99CCA3ACB7889BE
-:1000C000EE4F719E42794881CF4C3FE6A24CE867E3
-:1000D00052778A078553BADC6480A58EB556180E10
-:1000E00080523A1141F99A40821FB3009640D80AD3
-:1000F00074FF8F96139138392F03C8826C3CFF6BC5
-:10010000169EAF5F077A3E6E5DB94286B274929BCF
-:100110008BE5B60222BC9E4D7EC45DE3A0FDEAAC39
-:10012000B44EE2BE4B1DEF5871D0C3BEADFCFCB562
-:10013000F6D5F55405B080E6AFCD54EAF6E0BA2B1B
-:10014000FAB43D209B7A9087D3DC79653D94C3BF98
-:100150008C127A9553A6D85507D9A9034CA8C7681D
-:10016000480ED9709DC55975A9B42E1A662AE0F5B6
-:10017000252D32EB03CC8A7910EAAD52D35B3B8458
-:100180003F21BD544EA89C01A8BFC59B8CFC2C757B
-:100190009C64B97F0BCD3DF25B054F7F23A776E7CB
-:1001A000B76AC22DA769BD2A4D6E7C1DCFB5BA4D69
-:1001B000DAF14EDCBC95EE948C53C9E4583086E4F9
-:1001C000827CB8C3E46F8764F6B7DEECE39C1FD88B
-:1001D000DE2FFA61C73B68FFE72EE3851B009E70A8
-:1001E0004F7B3E30E197D35BBF62DF0637F913DA0E
-:1001F00009F991AEC775684380E75E576E0F0550E9
-:100200009E51AFD34CFB47A5503095F47209DC6B7F
-:1002100050DE939BF71F213F996C7784496EC84449
-:100220007BBC5E27B58BCB134F868229387F7C5BE6
-:100230004026B71D7B480D3A703CE63D05358D7173
-:10024000E61D9F4C7ADFE96F6239D4FBEB99C6FC5F
-:10025000E726F6331884D7B2AFDFCFE021BB89E2BF
-:10026000DA4AED4CC134A83361C0EA724C93539022
-:100270008FAE30B8E97AD1215790CE55DCA6C8A907
-:10028000782EEF493548E75E876A506C1427037271
-:100290005FBC6E3343D88671C4966902254EAE6347
-:1002A0002F84821407F5B8D69C24EC79D2E57A998C
-:1002B000E296D3AA6EDF82F2843793DCDB5CDDCF7B
-:1002C000FD96DBC472FF32DDF7961B29385C237D77
-:1002D000F9643FEDAFBC48F6D390ECB6E173897199
-:1002E0005A8F8BFA3ABADC7439563BBB38EE2F5F23
-:1002F000DDC5712F71DF6A13A8F528774F85ABB87C
-:1003000016D7695F03F367E1B8CE8234AFFBFC8F89
-:100310003CE5EF93BD4C9527B42A742EA7E9AA7645
-:100320005DBDFA1BDEBFD7FBDAFED52D5EE7424787
-:10033000ECBAA34812711ECCCE53F6983EAF57EFDD
-:10034000133BE718F2D6A4EF5543DE9A8C9136FEA4
-:100350007E85FD11C378AAF331C3FC5B32D718EE5A
-:10036000DFEADA60B87F7BCEEF0DE33BDC2F18E6E7
-:10037000DF59B6C5707F96F21F86FB33655024F4B3
-:10038000B97C2964213F9B0BF54CE7412BD307A097
-:1003900093A98A96447421B8993E043EA62B3CAAA0
-:1003A0005C847613B5740E20BFEF78E3EF796417A1
-:1003B0001DBF1AEFCC72C5F2B29EA77F6A3EEE63F4
-:1003C000453DF5600F038A84DDEAF1BE57FD24C484
-:1003D000FB6811C6133C67B43199E34C34A54F4810
-:1003E0009262F1042DD244F958F75B3DBE14CF73ED
-:1003F0007FB092FCE83D1946B8BAC79BA9662C0DA0
-:100400003C74DD9D737F7E6CFFA00916939D6D4744
-:10041000FA3AF2D1775EC4EC8AE3A780F8407B9B7E
-:100420003C770A44F0FA4C272821CA4376C848A2F0
-:100430005878B92B6F36068899DFA3A2D09E7F48E3
-:10044000570A49DE81A726A49DCAD5E2D28DA8BF4E
-:10045000E326E6079648A111288FA60631CE5F94C1
-:10046000C6FCDD0761D6E3FD10B110FFF301384E85
-:100470002F0017D30741617DE2CAC905189F1635C1
-:10048000983D1B91CFC2F4CEE1E49FF9638FA64B58
-:10049000782E2CED14E2A7D004EBA9BED1F9A8D593
-:1004A000F8D858A454D0F90AD35B373E83FB77368B
-:1004B0009A602BAE737AEC630F435C3EDEEE299FAD
-:1004C0004EF37648A0505E0DB4D842DBB268FFCE42
-:1004D00001940FF4792B3C15338B70DDD945C0FAAC
-:1004E00086D6BF00E9679653C81EA6F46719E07365
-:1004F000C37CF93DF967809F2B2459DE00E2421945
-:10050000EFCBE3875F7F6DCEDA3CE6274075DC7684
-:100510008F3A9FCF6FC55840E7DF6C0B6DE57AAB24
-:10052000669884E7AC7CC966A2FC7F14E333DC0CDC
-:10053000F0B9DFCEF47FFC4EA65FF833991EF7BB0F
-:10054000987EE9CF61BAE87B6400F577BA48A922C2
-:100550007E7AE3A3F73823F8884A30A7DED1FD7E00
-:10056000A5E60F050D279F4C263B6892DD64A7F991
-:100570008D689878EE73CD63427256BC5CD5C7899E
-:10058000CF82A68FFF30BE849E333B259C7FAEA9D1
-:100590006B00F96FE2F9AEC8A3C52AE4A19D7747C5
-:1005A0005AEB467A7E47E3703A21C611107648FA34
-:1005B000947AE2630DDBC9AF8A44BEBFD3D659E259
-:1005C00074C4F8032A3130CFD46A7966AA7C39958D
-:1005D000FC6216AD3B96ECFAA60F68BFC001E1873E
-:1005E000A8D7F9BE387FDAA5C941A7F92D561FF95A
-:1005F000D38E964FEEBA1DE53073DCAD5ED9159BF8
-:10060000FF3209C14BF67DE9DF9FC9E0F94EDA6A96
-:100610002E6C99EAC479F7D9F7BC4B22B8DF797C04
-:100620006A1A8EE7674AFB882E70654D4BA7380023
-:10063000217EFEC19CC9FBC8C466B86759A99E98B3
-:100640004C4E1517772BEC186F0C71BE9F617C4BCD
-:10065000E660C3FC5B5DD986FBB7E7E41AEEEBFB13
-:10066000CE70171BE691BF52BD8D7CB0DE619B1C26
-:100670001A21911D5CF86C19F33FB784F88FA2FC26
-:10068000AC58389C29DBF0DC3314361AF7A6927F7D
-:1006900026D6B5CB5B5EDEA7B87AAF6BABC0D737DB
-:1006A0002CF55ECFF6560F5E6F5D8B71E40F14472D
-:1006B0000ADFB8C719C473EC187BE90617F2F761B3
-:1006C00051CFF56E54AB7713EDE88ABD4A2E613FEA
-:1006D0000765A07A48AF7B13ED08E049AD0E10F432
-:1006E000A7FAFBCC8F44DEFA8AFCBE5FBC7D6B347C
-:1006F0005464C8338556CC2FA89FCEBFC9B0952E61
-:100700005CC673E87AC88ED93F3CB4E5DD41257CF0
-:100710003D40756D15E5055C3FD923897597EF79E7
-:10072000775046EC3EAC3A6E980F4F48FB0CE3B561
-:1007300059C6F1D393F7C53FDF5B3CAADCF488557B
-:10074000C5385DF9ACC4F92AF1BE7E9EA97B93142D
-:100750008A9BE6661BF753554E051407554D98477F
-:100760007AC8EB7A7C982B434D4F716E80B6EE8C35
-:10077000BD4920FF8C758FA2ADD07902FF25F2CD47
-:10078000D1BE0AF8E2F6C9F288FAAF23ADEE9FBEF9
-:10079000C3791D7F063789BE234DC4DD8286D326EB
-:1007A00013E5BF3EC25E0A9C11533AD2E8E2E40070
-:1007B000A03F552F4909980AF1FEF0CE4FECA8FA58
-:1007C000519E412FD8516F9F994C86FC13A5988755
-:1007D00063CFCECCB9947F6EDF9B1436FD0C7E3C8C
-:1007E0005473202D2C177EFF00D98DD84701F48F2C
-:1007F000EADF81BEAF427182F8A7F132CF90A3CF7A
-:10080000E2BAD507451CC0DB8EC47EF6BEB87E16A4
-:100810003609FFB5E32FD53B55109AE620DC208C36
-:10082000FE0FBF9CFFCFF43832B8CE213FBFB9BB1B
-:100830005FEB7E5F7D58F8FDF9E66F3FA2387F1EC3
-:10084000F35FBCDFEB72D3FDBDFA7999FD52BF7E39
-:10085000AE599E1EEA41CE65BA5F296EF6D75AA7F9
-:10086000D8B776E2C5BB28CFD5B6A086A4EEFBE804
-:10087000B47ABD0CAEB87D76ECB62D0E39627C44F0
-:10088000F5FCDAF26DFAE43C41D750FE853A2DFED4
-:1008900088BA06F3AA2583F2EA2CC9BD0DC9E196F0
-:1008A00081E524BFC312845D1E5EE21E3B9EEF6E97
-:1008B000B11C5D77507D06993966DAE72E4DAF772A
-:1008C0006BF8D2EC96D92328DE7FD2B0F0B042513B
-:1008D000CE93CDFBFD1A025C1F1E4EF30D5D89E722
-:1008E0009C1914767E38ADB39DF0A8C31393A5A0D0
-:1008F000C4EBAF8DAFFF0E5B7C436B982F0D97520F
-:1009000046CB3F26FF847E598B8BA8CF8024FA3BB1
-:10091000F603F3A0A719675802A17D0AEE5BE50E66
-:10092000739DBA0C042E9058DF574DF8DA4AF9211E
-:10093000B11F9DDCB4E78854D0038E9160B7D7C255
-:100940002D12FBE0DEF0871FD27DDB3C71F8616287
-:10095000BD7EA52ED5EBAA6DC9A1AD789EB727FEA9
-:10096000DBB965385EB52DD9497DF7D9976C018A19
-:10097000CF67B7DA4212DE3F9BDED9467DC8D99DEC
-:10098000F96E5C012A4DAEFF7C8DF2FC9F2C6C173A
-:10099000006EE11F57ECF4D16314EF6AB7A548402D
-:1009A000F5B52AEEEB3DA0FC6A0AD7094B760D0A95
-:1009B000D9A4589E21FF706169716673924245FF08
-:1009C000D90377F725FCAADDF4FA30C6C3E4278EF5
-:1009D0003D86CF2D7B25C543F504E401EB6DF1D6B3
-:1009E000515BA83E7ED1A2EE27FE2B5EBD63601652
-:1009F000ADFF717F207EA2CDBB06507D14ABDB7BAB
-:100A0000AEF7CE3767F785BC989C743C71FD1FD755
-:100A1000F848EFC9928BAF9BA146194C76D1340BA5
-:100A2000685D8F2C29E4979D1B92B94E4DB4BB6332
-:100A30001ED1A72CD7F1877E60CF24FF5181E5100E
-:100A4000DD90BB7523CAE93B4FBA96AF3B47DE95B5
-:100A50001F6F9F6D556F917D6EB2312ED29E64AC2B
-:100A60001B74FABF9E34DEA7D27EC1804354ADBE54
-:100A7000641CE761BF87CF7B82AEE24790AED4E4CF
-:100A8000DF35DAD7E1C1E797D6FFFE8DF7582E9B09
-:100A9000FEF133DAF78043E031EF09F925F60395EB
-:100AA00076817B006CE1F3EAD74F6FFEB480ECF007
-:100AB0007463EE48D2E342B9F5D48BC8E7B994D653
-:100AC000638F23DD79E023D64BE27913F19B7649DE
-:100AD000627E97131F78FD1EAF4F2EEECFEECC7DBA
-:100AE000DCC28DF92CBFA9725E5FD263F46C2FFD5E
-:100AF0008A764E7D7DFD7CFAFAFA3C67B1D0D7FB51
-:100B00001AFEDE616D3D47FAED782357227CF0CA6C
-:100B1000F5F4D682B4387BF9A570F97B357CE4888E
-:100B200069CD6FAC688FEDF5CF58D4F8B8F713F1F5
-:100B3000F82BF5A0022EE700914A386F2173661C4E
-:100B40004FD4C7E40C389EA01D4FA2F3A05F4ED433
-:100B5000282C5533196FA7F590264188C7C1C96E57
-:100B600017D149928F710FBD6F98063543880F9347
-:100B70003DC238E15AC227B16E999DB6EE8E2CDC8B
-:100B80006F6D7F5847F5CC5A8BF08BC08264EEE7CF
-:100B90007439E979069C7986FCB2D6092E33AE33D6
-:100BA000C70CEB2DE962DE8D28E7C30716BE4BB8F4
-:100BB000EBA7E69AFEB4EF51C7B3F99289EABC50AD
-:100BC0000AF58C9F7DF427EFDF70EEE7A04CA4BA06
-:100BD000E29EFD768EFB89F8C42250795C0911CB28
-:100BE000057CEE8BB13F6CDB0B31BEBE18F75D238D
-:100BF000F509F7A53DE9A5E703E5904379E96252D8
-:100C00006A01F1B3DA2EE8A37D52B7123DEB74040A
-:100C10000897BD98342C44F9F445497D80EC199F20
-:100C2000E33E36702C3944F9EE5159AD621C3ACD91
-:100C30000A12CE8FF6D7E4D2012C97A8459BFF8DE0
-:100C40008BC725151EC629E1A28BE3F2F884BC539D
-:100C5000926B12FDD98F62FEC44EB321EF94146AD9
-:100C600078CEDF5D5CA74EFADE7CD5BC74B958F453
-:100C7000BB25FD4C353DD58BCF68F783109605CE4F
-:100C800023EA85F157EC4B91498F55DAB88AF21A6D
-:100C9000DA5534D51E9091DFF1CDC2CEC69BC37B11
-:100CA00088629485D5545F3461DED3CF817105327B
-:100CB00073D91EC6E9768A6BCDC379EBA41AEE63AD
-:100CC000EC54D720DD28B5F2397E059D4C152D9FBB
-:100CD00097839BE914F031453B653A1DEA98DE069F
-:100CE000F54C6740ABC8FFA3C341CE6BF08493FBC8
-:100CF000C15B2B4D547794FCBAE7FEA1518B27BD05
-:100D0000CB011DAFF4A7CB611AA0FF65F7208F219F
-:100D1000391C4712E591E8A7132122B39F5280C8DE
-:100D200026FCC0C5FE5A010A8FA75EA71CCA22AACC
-:100D300099F19B447954F46C17BB35BBA8255BEB48
-:100D40001FD35357B18BC7BABED0BF32A90E4DD4F3
-:100D5000A37EBD24B9BCCB85A1F8B35D27E79A314A
-:100D60002F951497AFCCC6717BF1B773CD98CF4A4E
-:100D7000C697EF1A8EE373BBBE13E3C2F2628B1BFE
-:100D8000BB983517E74EC1F92AF9672151F4438A18
-:100D900067AAE88F5769758CBAE6376E27FA8B3ADF
-:100DA000D4E1263EED58EC133E2A678BF78EC3A69E
-:100DB00087F75A70DE498B7A98FC77853D9CEA422A
-:100DC000F9AF5A33752085CEA7AC62BECD26705AD6
-:100DD0009D3FBC1E48C2F1CE9DB92BA5E1D73E0771
-:100DE000AEFF25ADAFAE191120FF551B25B7D06C56
-:100DF000F9C03928C3F6560B106EAAEFF7E468F570
-:100E00000CE747979BE3F760ADCE69DF999B4B7A80
-:100E1000EA2A163818646415931C8F8FF675D1FC76
-:100E2000688AB0B72ECAE5DEDEE9E012E51B9A9FBC
-:100E3000783DFA151E009F3797A817E97E75F26571
-:100E4000CEFBE78A3E5E17C98AD9AD844A9B87FCF0
-:100E500007150859393F4C705EA95329DE2DC2751C
-:100E6000501E253E3548216ECCBCCE528AABB8AE62
-:100E7000A904F7A9B6468615E173CFDE7DCC2AEC2E
-:100E80006E88B03B2D2EB5EC3EF8F86031F4419CF5
-:100E90009F55EFBEF4DDE728BFEAF30E374D8FF91B
-:100EA000D70B2BB9DF0487218EE87E37AEC9C6F594
-:100EB000F6F8E6518B68DEC48FDBB289AF496D115D
-:100EC0007E8F166DF974B03887DE875C947E4E3E57
-:100ED0003EADE589D3769117E8BD30F77B8DE2BD55
-:100EE00070AD8673D6B648A100C71FD13F2FD6F884
-:100EF0005B71B0711FE1278B373D3883ED2824FAF1
-:100F00000A17FE525C587A44F4CDCBB61BFB8D6AAF
-:100F1000EA9B693E84AD640F2BEA13EE6FAAE0BE34
-:100F2000B93A3EFEF7D0377B4B347C6C280C65BE5B
-:100F3000E4797DD51EE261625F5C05CA8412AE7BF6
-:100F40007D32EDEF35F78C3FF42FD0DF9389FABD7A
-:100F500052DB9BE4E460B958B99FA8DDBCD2EDA494
-:100F6000B1E6B75B4CD453E3C4773E80F8E7743FF7
-:100F70005EB25EE2BE0336F5631B2C7CC5A610BFD5
-:100F800085AF0CE43E04FB25AE0FB7BC625B4FE3BC
-:100F9000E0EFFA04E442C2A13B6F201C269884F5DE
-:100FA000A6C0F341F2300EC3B8C823255ADCD7EAF5
-:100FB00000081719FAF9A096FF6B53460EC4CE39F4
-:100FC00036EFC020437F12D4EAED123A27D58DDBED
-:100FD0006F10F793041F7B3EFC8764AA7B1BCDBE7A
-:100FE00064C2B5CF1F1ACE7D4C6F72F7621A82AB06
-:100FF000BCA7F47E3A23FB6A7A2B79DE2CE4A5D9D0
-:10100000ED9B7E05BEB4C4F4A2F337557EADC24A53
-:10101000B8C843E0249CA4F6E0CB413BF5851B8097
-:101020001188F320ECF9FC1913BF772F859C7F9D65
-:101030008063EF19B33B84CF37687191DE3FBBE229
-:10104000ECCCA6E1BF49AE3EE08AEBA39373D20D90
-:10105000E314F70D86E7FA960D37DC47796FA5F5AF
-:1010600021A0B4E695C6EADE3465B4E1B9A752A77B
-:101070001D60BF6F7D9871A97ED33DC6F3C8CD3288
-:10108000C503B820EAA532FC257F1B038120E96354
-:101090005CBBB18E2A8BD471DF9874C86CC0016CB4
-:1010A000D7C0A5B6907F519C1C024344DC4894B73E
-:1010B000F1FB8BDA8332D77BB543B150CDEA49DE01
-:1010C0003719E4ADFBA32EF7FE3EA3DC07CE31CAF1
-:1010D0007B906A94F7E0C546790FAD31CAFBC6D55F
-:1010E00046B966058C72CC5E3FCE307F445DB961F7
-:1010F0007CF3F3B719E68F0ADD6518E76EBFD730CA
-:101100003FBF7EA1E17E61D3D2EBD27F51B8D63012
-:101110002F51FFC5077E7B55FD07F057E81F581F6D
-:1011200065A88FB0EBFFCF0E4EE87156B783EB8CFE
-:10113000B36F92CF329E302112203B284B663B99F1
-:10114000992CE2CEFB07CE1F5270FC81ABD892499E
-:101150007596563FF8B438A4F733897DE39D655200
-:10116000C2FBFE24C3FBFE6B7D57E76D0D1BC6451E
-:101170008780BF9BF11C71BF4DD47B5261B8ABF42B
-:101180004CCDDB44C75EE0B4DDAD5FD5BFCF4BECEB
-:10119000B760F9217EAF384F7F2F434E51DA1D9F44
-:1011A000D4FB31BDCF4DEC7FF5BEB77B9F26EA98CF
-:1011B000EEFD863BD3CC75B4CA75F57E49659C734C
-:1011C000CB2875B0D74B4D00F6C926EA93234121B1
-:1011D0004C05E83D7494FEA72224F0CCBD84C7479B
-:1011E000D380F17345AABB3790C7C777464A057CC1
-:1011F000443FC55E758417F57A4272AE2B267C6239
-:10120000DCD7C3A81EC9F18A3ACF26A3A4302F0D7C
-:101210009CA7005DFF215D19E5F5C6F092DEEC2686
-:10122000F1FBA4067F98A9D9E9E6EF9712F1C588EA
-:10123000C9C5F569E0B7127FF7F3351D6E6CAC8E4A
-:1012400039BFDEC2750C68FDFCFD9AFC75DC639E3F
-:10125000C6CF095C6231E6E5FB9BF6B35E9665B6E8
-:101260006B78490DD7E30F0E7178F87B38A5D82D30
-:1012700070321D07192CFF94BAEB5AFC2FCB3C6B34
-:10128000C0A1E0B57ED7F5BE3CC6B758FFC4068105
-:10129000679ED83094F1F3D8FAE7188FBABFE643C7
-:1012A000837FCC5F7DD4E00F0B02C70DF723199D20
-:1012B00016C21F236F0C9A761FCAAFA3D1564AFAE3
-:1012C000403B7898F4AAAF1FD9903B85F6BD369F76
-:1012D0005FF339DAFCADAC5F9DCF63FE233C8EF843
-:1012E0002309DFA7093E759C43A7D6BD9063A6F7E7
-:1012F00089521F37E1CABDE11FBA9F994A87F33A65
-:10130000174DAE530227AA1943F55FDBE401E574DC
-:10131000EEB6A156B3A023C57850995D8CA74D2792
-:101320001AB538D6132ED22689EF89E649CA4B0B57
-:1013300070DFC747A94F913F542FED2C20FFAB2EF4
-:101340008C3C20E1FA5DFDD58D241F09DB8B41E942
-:10135000CC077F7776C6142890D055F679BFBC9716
-:10136000FAC4337D02E7A842D9DD784C8CADC21FA8
-:10137000DFF71E60FF3B898B119F813F4B029F72FD
-:1013800044ACB3709D8CFEEA73B42F7D4F46EFF7EB
-:10139000E83AD9A78E97462DA24E8C6AF5E266AF41
-:1013A000A8675F4AA04D54E312FE4894E3F5D323A7
-:1013B000094F3FBFC90654DFE2FE8AA924F6FDCAE1
-:1013C00000E485EAD877ADA2CFF4FCC516A638A50F
-:1013D000E3AAAF7BB378BD8C6C819766FC33C62DD6
-:1013E000F2C348EBB0592971E73D048C6377101EB6
-:1013F0001D8763BFEE15FD3A3C24E25EC786C18CB3
-:10140000B7AF3878E218C5AF7BBC6A23C975A1C9EC
-:1014100055CADF67A5EE61DC6CBFD7C5FBE27999E1
-:101420005F8C436B494F2BEC11C6D9AE85ABF7C629
-:101430007FC7A2D6E7F21847761590DDE8FBE239C0
-:10144000F67BE3F06FFD1CB175AEEE073A3EAC8F54
-:101450004F6F7E6AA486EFCFF7F5905F8F69726950
-:10146000B3F48CC75FF28AF778DDF4733300E1FFE1
-:10147000B63E98FB917EED15FC77CC457E18DF508B
-:101480008A48BF2BEE72B849CEFAFAB88EFAFA55EE
-:10149000F6E91AEDFB8AF85F5A23F07BFD7E5412C1
-:1014A0007A0D6C1078EA8ADD478F3D8EBB2C79353A
-:1014B000BF98F281FE7CA29C51BE23F9FB3B59BC34
-:1014C000FF42F99EA7F51371FB9F2BD7E850F19EC1
-:1014D00036BAE5D230FA3E6D057D0F5740F621F061
-:1014E0002F6830E25A28AF00E11BDDDF6B01BF1F20
-:1014F000B369F9C4A63F3FC46C78BE3EC597548A11
-:10150000E77F438B1B383F64A2EFB9B5F8D4A0F551
-:10151000DD89F84B43ABC04D1B32AD5C4753FD43F7
-:10152000F7F5FA67D58702375D9525EA6C3A27E922
-:10153000593AB28FEB852BB8B884F91EE5986E55F1
-:101540008794923FA92B399FC937A29EE97DC85F36
-:101550006FD37004911FBD5A3EF4D23A74AEBCBE34
-:101560009C274BB47DB1BF60FC6E2CA85AFDA0E156
-:101570006F1BF619F087FF037A5FA88030310000F7
-:1015800000000000000000001F8B080000000000A9
-:10159000000BFB51CFC0F0030947B0A3F20FA0F13D
-:1015A00067B2A1F2B3B950F9875950F9FE68FAD180
-:1015B000713B13030323137E35F8B0083303830C08
-:1015C00010AB00B10E33F9E680B089280343A904BB
-:1015D00003030F906604D23E405C06C4FE407E27A3
-:1015E00010CF0262197106864B405A5E8C81E1A5CC
-:1015F00028449F2D90FD438C3C3BAD792973F32803
-:10160000A60C5BCAA2F285D41818BCD51918266B93
-:1016100040F80648F2AB8062C26A10F611790606FD
-:101620003D205F5D16BBB94781F2FA40F9DD1AF83B
-:10163000EDDFA183CA773543E5E7A1C937BAA0F248
-:1016400035DC50F9AAEE101A00B1C92A3BD80300C4
-:1016500000000000000000001F8B080000000000D8
-:10166000000BCD7D0B7C54D599F8B98FB9736732D7
-:1016700033B949263079C14D081030E02484808A7E
-:10168000701322449BC204698BBB6C77C4D646148A
-:1016900008EA6A7C6C33790701096A77295A3AB1FA
-:1016A000A2A0B44D5DDC3FB5D69D40DCD2D6D6A01D
-:1016B00058E9AE6D23F5DF5A57D9A052A9D2B2E747
-:1016C000FBCEB9997B6F2609E8EEFE363E6ECEBDA5
-:1016D000E7F19DEF7CEFF39D1345F4106D0921E7D1
-:1016E000E1873E5F25F4273BF924A48790F9F01C9D
-:1016F000922373E019E3EFD933B8B64F2045581C55
-:101700002495841410F653D0D4B9599C4BC8641254
-:10171000FEF1CC425A1EBABE8E0468F9F5ABFF004A
-:10172000CFCED5D5B557E984E4ACE93BB69C3E8332
-:1017300091B8102D25E4412212920BFD15C7AA7C09
-:1017400084B44367971332299663C44AA160D002D8
-:10175000217FA7F28188A8CBB4ECC75F93F3309FB9
-:1017600084282451821585F3EED1ED9DF5CDA71F78
-:10177000DA99750AE1FFB71298DF44EDC8ED6CBC49
-:1017800018FDE73CC54B5E727CEC27A7C152268052
-:101790001FFB776304EF9BFF57C6CB25E51EBD8279
-:1017A000CEB74ED4E2509FF465C8B41CBC452609A0
-:1017B000817EAFE8115CFAC4EBD249486D9F0FF10E
-:1017C0002BD4FB93F07D8E08389F2977BFD9DB158A
-:1017D00024E4CC5A5F18E94323242B73F47CBED64F
-:1017E0004C48C26D29AFAE16A2385EF8C7C5B47DAD
-:1017F0006CB518DE0BF0D4ADCA80F766BD3BF93886
-:10180000A3E983E832C5A3CCE943AE130DCFDC4F87
-:101810004F1FF227A48FECDB2DEDC8C5AF17E27D7B
-:10182000FE85D3C7A71DCF5CD7D17CD582704CB9BC
-:10183000BBD843E8FA3F50BB2A3D9AA2DED8EB5A08
-:101840008EFC1EAC23463C45BB2DB09E38CF984D38
-:10185000DEE093AE8F34B2BCB7D9D64B9A5CB9A652
-:10186000771C7C4841FB7CCD7E9526497F338B16C7
-:10187000654D84FE64DE5FA7B62E46806E81B62974
-:101880003EA49EB204A1FC414224BC974320D2B2A4
-:10189000A219F1FB0428C5715D4CF8D462D1369EC3
-:1018A0002BDF6B5B0FB2262658E1579A1484430650
-:1018B00036E1F22E82C28DC10D439C9F06E57B6C02
-:1018C000EB2FFB48C243E5EA96E272625D07934E56
-:1018D00005C1A4D37B2E4CAE38C75B6D87F382DB8A
-:1018E000F964FD77669BA2F1DAC9E477269E28F2B7
-:1018F0005E815F2CEBDEE52287844B0969CBEF8CA0
-:10190000C1DB2EF8DF65489F20B448577EB906F446
-:1019100044F60932C0E931C9239489F57A898EF4F5
-:101920001413EE20504FF245104FE6F7B1E1E27488
-:101930001733FA8B69BF9FE5DD7E96EB3352E17A70
-:1019400073C884BB08E7912CD379BC7B17FD1FA516
-:101950008F589910DF2B8CFE5E07FA90CAA33A7855
-:101960006F91276EC12ECFEAF8B723CFBC36631E26
-:10197000A5C7C1B044405CB53EE3366A68FFC7AE58
-:1019800014E26E81C34BEBAFE070BE686415007D5E
-:101990000ED6B8917E572CFF3008E47BEAD02B722C
-:1019A0002A7E5DB1C8958483FEB7C93A3FFADF2429
-:1019B0001803F9B206E9C8846B43B984700C2E127F
-:1019C000E230CEC0AF7E7FFF1514CE172B84B05B04
-:1019D0004778FD848E3768BC1F1C4F4E10737C9D6A
-:1019E00068804FE7F823EBA186D7005F36688A7ED0
-:1019F0001F1DEF66297C14F41899CCF4438336A399
-:101A000006D64712187D2C1572B05D9BAF7512AECD
-:101A1000BBB436A5BC6AA08A422B87EFDB668C0B71
-:101A200067DC353C64A1EBA6D70BEF1FB0C039478C
-:101A3000F0077F97467F594016C03ABFE75B959EF7
-:101A40002063F7F776B3DA22BB08F9B059BF7FC03D
-:101A500035FAFBCD1269EC2B1DFDFE1A41E5F88825
-:101A600029609F99F31E99A72F88F47D33885F4AD8
-:101A7000EA37EFF3B4C856F9E398C7087E3F613BF5
-:101A800035786B2C57077E8BAE14A01F99FE5399A7
-:101A9000E4C79B0FD433BE73C0DB11FCEF81772208
-:101AA0003E7ECFD7DA09F66A9B8BD14B7BB6186E98
-:101AB00025A3E9C55C0F138F17BA1EDB040FF2874D
-:101AC00049470DE2DA71D77D223ABA03E8E892FF7E
-:101AD000793A7A10E868FEFF493ADAF57F918E92FA
-:101AE000E5E5682FACE47DF50FFDF62190CFBF3022
-:101AF00024947BBF58C4E4FF2FA24C2E0E92E8F62C
-:101B0000F9A00F8E4B28A7068D363FC24B4D629829
-:101B100007FA5D94FE5E017B692695EBCD2A3EE9CE
-:101B2000EC0B56D1EFC7AEFA301FF4D731BAB6601E
-:101B30007F13326C18B4FD4B23656A8043D9C3CA46
-:101B4000C32D6763609F0F0AACFC2F2D678D188E25
-:101B5000B7AD7339C5E74AF895C2B17A9160C453FD
-:101B6000D0C54F0485E1A586D8F42A5D979F0894D7
-:101B70005ED4C866B4AB098910F40F8BA99D60B11F
-:101B80002F9A4081815CAE71A3FE73F6FF12B70BF2
-:101B90009D76DCEA45652ED017EEC86979883E57F8
-:101BA00046042C03FE350BDCA22118A007228BDC97
-:101BB0008F82FE8BC8C4A5A5E0D79586DB66779D8E
-:101BC000E67A8CE2650DF35BB482FA39C9FAA74D67
-:101BD000FDEB98CF587461CEC32C5FBBE8F4401680
-:101BE000CCBB56084F8786AA56F045BFB5FF34D305
-:101BF000BEF103DE7EB1E6DA74460751D4AB263D72
-:101C0000FDF88DAFB860FE647516D2E5EA3AC96694
-:101C10004FAEAA49B3953FBFE8DA71ED7012B5E057
-:101C2000C142F7813C82744A7E43ED144AA7B1EA6F
-:101C3000E128DA2D2705BD8D96D317374D857EEF28
-:101C40001133B1BEB0B869E610DA5BCB90FED37841
-:101C50009FE94AE3EF8B40AE4E17C9A33AD8A3E3FE
-:101C6000FB051D9CCECDB22B188D09743DF5985601
-:101C70002E8D83EFB821D6A6F21BA6896CDD3A62C1
-:101C8000ABB4620068C02E37326A1AD1FE33EB5310
-:101C90003A9E2666C3B8317C3F42C7DD745EB49D70
-:101CA00097D922247DF6AA7432CE3CDA1DEB4FC5BB
-:101CB000BF914ACEDECCE1238758FFA64C4ACFA481
-:101CC000FDA7A86F3EBB78FF67C322190438E588DB
-:101CD0008AFC50524DACFD10A30CCB0A2FBA431115
-:101CE000B590E2D35D2AC2344847E9A386AC031E0F
-:101CF00062B8DE5BE9DAE65BF872EB9F25F4F36F1E
-:101D0000168B5A406E6CEDBF89E8141FDE509C6044
-:101D100079CE8D2AE0692B75B206617CB98F001CE3
-:101D200069F9F4773A4E9A46E23AED4FD6FB122221
-:101D30002DCBB5246CD04F7E2D2C78A99C381C2A35
-:101D40006A91E9FBF6B504E52301E961A19FF6D0AC
-:101D5000CB8604F4B3868401E0F6E03A9C6767E939
-:101D6000BAEE42FAFE4C9D8CF103728EC26BFAF50C
-:101D7000D4CFF0961003C6DB9A43E23EB4830DC481
-:101D8000AFA2B1F5D3771593C43CFA3DA3B21FC6F9
-:101D90008FFD3D617C49985C93B93C2132A53F1889
-:101DA000BF490BDF9782FE5412BD499C6F59672DC6
-:101DB000827EAC136FE90AB906F0DB5E46F9208536
-:101DC000DCBB4314910EE2E1552B8B528C738FA830
-:101DD000A37C32CBFA5905E11FAB7EB29E4C12595F
-:101DE000D0B521005E482488F3CB24233F0694B36A
-:101DF000F87C279146AC175AD8D30FFC966BF45554
-:101E0000012EBEE6FFFC315C37F28806762C85B6E3
-:101E1000F87C56525E80CE81F9BD1716D1EFF08B5B
-:101E200009CDA01DF83D8321747E758271B9746857
-:101E30004201BEAF596D07BB2440C2027CF787E563
-:101E400098D5AE4F27B46C8BA790E3C59584897C59
-:101E5000FCAEF503EB68258D9702300F068C7F05ED
-:101E6000BF699B3F8A7ED8879EC05C18EC4E6FE0AE
-:101E700051787EE8991247FF2CCCFC2D95FE03F299
-:101E80002E7DA16CF36F320C7B39CBE1872D937CD7
-:101E900038CF8CCF12EE5F1975D32725E1A210D56C
-:101EA00003BDECAC9109F8FF3E1F83C7842F4BBAEA
-:101EB0007701EAC7B07C12E0A0684138CE90730980
-:101EC00058E24009C1F82985EBA403AE930EB84E41
-:101ED0005AE16A52D97C9DF662AC9A943452E07E03
-:101EE0002872FF83DA4D60379E21EF18B540389194
-:101EF0006B50CF0634D6C6A70E62B042231AD281E9
-:101F0000D36EA4EBF49ECDFF5AC8CB3A11601E14D9
-:101F10004EFB77928FF48265898CC485D72D34F17E
-:101F2000A57FE1DF29FFDD74D44580BF281F4BF07A
-:101F3000DDC5BFDEC4E3C3EBC0BFA6F8FB12890456
-:101F400000BE77898871A877C9CB81791639794A1B
-:101F5000E4F6092CB1958F493804725CF6750E4A87
-:101F6000014483496FC2795CC73093F33E467731B1
-:101F7000A2B6A03EEC66FEA7194FFD728FDD1FFED4
-:101F8000CA2E7BF946B26A12C44B6F7CC845E2B4D4
-:101F9000DF9BACFE3D5DA757450DE1FB0A69EC04F4
-:101FA000BBA4CBC5EC8D751A9121FEB9E1FF7DA3D1
-:101FB000F27A3A9F33200FE683FD4EC1B7E891F5E0
-:101FC000C1B862948E9E5F9B105E718530F6FCBA3C
-:101FD0005C832BC0FF8E6D77A19D499C71D08312CD
-:101FE000C6412DED10DE1BBAEDF39B68FECEF91253
-:101FF000F200CE77FDBEEBD13E1F6B3ECABED4F6DB
-:10200000A64F126C711F93AF4D7A77F27785A4B308
-:10201000B80E558368AFFC3A2DDE86EBDBB800D6F0
-:1020200077A2F69741FBEC4FDE7EF1A71C7FE90417
-:10203000ED37A8C3CB60BDB7047B22C09F661C6B85
-:1020400023891979F457D7739B6360BA8DD40B5DDC
-:1020500060BD7C5A4FBA807AC5E3F7778ADB253FAB
-:102060003AF02D05ECD4779F7C6305D80137FF400B
-:10207000222AA5875307FC2481F64A5C01FB663DB2
-:10208000A5BB38961395D75AEC614AD1B80E377F65
-:10209000D78F76C4FAA7DDF13ADA7EFD3FFF762EC0
-:1020A000A17838D53AFCAF7940CF4F0A2CEE1A1BF5
-:1020B0009A7B2D7DBF5E267F1B494147D74B8C9F66
-:1020C000DEF97EDA1AB013857DFD5FC47EFBBEE0CB
-:1020D000725BF4F11AC985E3D27AE847C4F60BF1D2
-:1020E000E90283CFEA0F98F1EE77F60B0CBE43AE10
-:1020F000B807E0DBD7AB4469BD4DFB4E235D2FFD38
-:10210000EEB70380874D87EC76FAA67D52C23D1765
-:102110009F6FC01334A85009F864FCBCF1E006D4EA
-:102120001B1BFBB69E067EDE74C86593FF142FE171
-:1021300004E0F535295C07E57F7A22A05354BD3DC4
-:10214000B8370078A5FD5EAF50BA5AB9D0DE0EFAA6
-:102150003F9B39BA3FEA19A2DFBCA96F0B1BEFE026
-:10216000677F0FF27613617ACAE4E7B7E1979CD1F3
-:102170007A668B648F6F9D212F56E23EE0BEAC9451
-:10218000FEB3A9574CBEBEF9DB67F6C4E8F8EF3CD6
-:10219000FD1F7B62741EB7FCE5FD3DF7D0F991E7AA
-:1021A0003D1AC8AB4D4FBE1A2016FC3F26B1FD802C
-:1021B00053FB9F787C37E59353BF74A31D78EA8760
-:1021C000BF9FA2D3F99FFADE9F26819D7AFB0FAFB6
-:1021D0009A0CF8B8FD99A593C7B3D7816EE36EEB5F
-:1021E000FAC6B17FFD90009B20843CC79F8E753A54
-:1021F00072504A4088E0DD13EEB89BE267137DD74A
-:10220000540EEBB601F51594EFA5F8DE78A0EBB40B
-:10221000343715DE637962089E893C128275BF7679
-:10222000E59515F0748575A013328C7AC2D96ED3FA
-:1022300071BABE978EBD9ED49E5000FF9B0E6C61FE
-:10224000E3F6D1F50C8C5ECF77E197CB46AFE71183
-:10225000C91E673A436EF9E66EF878300BD77FAC4B
-:10226000F5DCF0CCE7C6F5EF4CF930119E1B040607
-:10227000D70EC97845027E7CFAA9C77707D93AD725
-:1022800051C49CFAF69929B0C9FB966BF88B2027AC
-:10229000877FE8D6C0AE5EFFC3D790EF4E3D734C4C
-:1022A000D1717F9AF804AA274F91919F41D09B1B2F
-:1022B0000556D8F4983FE10E24D76B63BCBE560F89
-:1022C000E0FB37F07D9CF1C3C678FF6A21C5FAF9BF
-:1022D000E422A69FE2D988970DFAA0A2F9ECEB2A96
-:1022E0002C84F57C6319D0DF58EB69CE5F83F92F1E
-:1022F000B0ACEB638C8FC7E2D753BD6E59481FBD9E
-:10230000CEA7B85DB1292EBC966ADD096965F1BD1D
-:1023100031E2DEE6D349178A6CE773B3BD39FF8932
-:10232000F87CE2795D1CDECE707DEDC4DF3BE752C8
-:10233000EB812259E07AABA736D7A2EF3C2EAAC791
-:102340000AC1EE6C8CE51526E1EDEC9350BEBFB3EF
-:102350004F427BDF2927368EE1D787CD710EF5CF2F
-:102360000579F6CEE1EF737A64F4BEF1C01B4A8CB6
-:10237000EB85B8552F407F29D6E372DEDFA6E75202
-:10238000F7B7E9C0E994FDBD2D1B5F00F8DF1E74AF
-:102390009118EDE2ED3E29659CA45876D9ECAC4E3F
-:1023A0007FE58974DA4E0A787598775BABF15A0C41
-:1023B000EC91975D04ED4739FC969B7E6FF37B7142
-:1023C000BFA52D7023D12DFABBDD81273914413FE4
-:1023D0005A0E462AD85E68DCE6CFBA34D106379169
-:1023E00063F9B0CFF9F3C2DFCBD02FC4D3744B5C09
-:1023F000E8259974403CED254308B79014712D47AA
-:10240000FF914512D1AD74664C15ADF1C5C0E1BB6D
-:1024100030AED1441A13106F22F9A46FAFA5DF4775
-:102420009A7516778D4C15ADF13F7763A3E1A670D1
-:10243000E4DFAE1581FF36D6F8058DF67D5F73FCBF
-:102440005B793C82EC7BF2C92769792A7C13810E87
-:102450002306C2718EED2B2FE5F2F047DC7E3E2C79
-:102460009001B0C36AEF8DCA20EF84D0F518175DD4
-:10247000967FBDBCCE428FCB42A77340AF7EF3CFD9
-:10248000D29A54747A88D355CBDF3F9E03ED777B85
-:10249000BE90CF9CD908C297C7E35D03D9CB7D100E
-:1024A000DFEBBF69D98B33E87C73358940BC269755
-:1024B00054F9CA289C79C7A5B027C53A98CF3D3CA6
-:1024C000AEF768B386F2FFB1E610961FE778DDD766
-:1024D0005C82CF279BC3F8FD40F3422CF735D7E24F
-:1024E000F3E9E608BE0FDCFD6CBF0278F92AE98348
-:1024F00078CDC1E635F8FD9F9BA3F8DCCBE7B30CA4
-:10250000F0E2B3CD1FE33187DA97B4423CC6C4A3EF
-:1025100013EF4B486CC08DFBF9820E78BF4B66F20F
-:10252000C589DF29EE3E01E44BD32D04EDD73D3CB8
-:102530006E6CCEF7EB32B3370F72787EE0897E4750
-:10254000A6CFF76A8B4BD12E229130C8EF3D4224A3
-:10255000BD8C5679217B41C82A87A7FAA30765CB92
-:10256000BEC2946E16EFD92D337935553FDD9F41AC
-:10257000F1509B2FE8104E30E77BB84ACF073979EE
-:10258000581070BD6BF3255262A17BB3BF6FC82298
-:10259000DFDF482DB79374CCE441E6D57209F8B576
-:1025A0006788372C517E7F3E871C24D4FE781EE836
-:1025B00012E4C2AFD2304E6CFA37DBF87A670251C0
-:1025C00040BEC4EBFE38C89FB1FC9E4E5EFF3D0E80
-:1025D000D70639F28A8CFBCA3CFE4A1218C784948B
-:1025E00023A0C7DD9EB53B6AE8F3FECBDF3E01F1D9
-:1025F000C1779FF1E800D7F68A93012B1E4983FC2F
-:102600008E753F7E44DE9CCDC3B8D8FF27D137649A
-:10261000AB1C0A0E2BD0FE7941DF09FBD7B1572541
-:10262000E4BFE785F82C8C63C904FD82E76F0A617B
-:102630007E87D9CE1FB6F377A667E8E14D30EF0667
-:10264000251C4BC117BF49D36DFB46EE90BD7D08DD
-:1026500074E67C56D6297D96F1798765430238E683
-:1026600093283E17101D9F39AEE847308F79A42F6D
-:1026700007CAAD6953AE60FB07FF6378535DFF0780
-:10268000F166D26BE8F2128483DC2D86A7EBE84D6D
-:10269000DAE87CA54BE0F855519EE78EEC4F35FE0D
-:1026A000A82088DDB0388996867230D7C3F0D73439
-:1026B000741AE3BBA129C41677EF6810910F76BF97
-:1026C000CEF6F5CE3414ED9C41EB57117D474DE12C
-:1026D000E87998FCB15B8DA4A7DA9F329F265F98BA
-:1026E000E59D53BF48400EFDE3D42F62DE51EEEB73
-:1026F0001E1DFC8EAA5FEF6F01B9D8F106CBAFF8B3
-:102700009537BAC8353F29673A6E6A9C0A7E50C031
-:102710001F59ECA2F889E4C7AF037977A6F676379C
-:102720004EDDC7F25E9AEED577CED4C75E9F3D4DA3
-:10273000E3EFDF98F3DA03F31A67FFC29C97B95E01
-:10274000676A570FDFA8839C294E8FA66837224FF0
-:10275000AE5E3DEEF87BB85EA1F35F6BA5CF294D71
-:102760001AE6B798EDCDF93ADB3BE79BDC07BEB044
-:10277000BCA03E17C9027AFFDEC753FEE925148DBF
-:102780001109F434E5CF8D004F2569C43291FB72F5
-:10279000C0BE31E97977E7E339A817E47821E67715
-:1027A0005DE0781D2412A9027E0B8B61ABBD623EF9
-:1027B000DB46E83C81715537970362DABDA1547856
-:1027C0001EE93FDFCEFFDB0861723EA1A29C87407D
-:1027D000A146CB854749F97DB4BF06480AA5E35415
-:1027E000C92C1E32EFA8DE2BB1B8AA54EFB7E09186
-:1027F000EF3798F1DD0E722FD174F02BCAFAA1BA1F
-:10280000C9A74794E84340A74A48C77C4F57302A96
-:10281000B0FD38B63F54C2ED92ABA4B52AD8254DD1
-:1028200024A2CE06BE3D2E119687C7F8DA6DEE8340
-:10283000713E76733EA61C8CE519FCFB739CBE0EA4
-:10284000817D82F604A3A383DC3EA9191E3EE2A784
-:10285000ED4A067BAA613A4F83BDE206FB248CDF7A
-:10286000BF03F60A2D1FC9F8C76B6653BCEC33C40F
-:1028700030E0FA40B3C1F8A1B901BF37919877337E
-:10288000C8A547440DE0EC7AA4550AD0F27E55C0A5
-:10289000F8C523CD8D583F70CE9B007F73BF9A1033
-:1028A000C01E391326E118C04DDD2398D70C3E8F8A
-:1028B000AA370771BBFCF1F87BBFDD41EB3DB8D017
-:1028C0008BFB64267FCD681AD6AE01BEDA7B52DF61
-:1028D0000CF0CFBFD580FADBC245B84FF104C51765
-:1028E000ACD3BE5DEFED1AA4DF0372D766F0836749
-:1028F00016AC427B28A0FEE36D500E684FFD1D3ED6
-:10290000D5EFDF09FA7A665CB4ED9F07D49FDE0548
-:10291000DFAB87C235E9B49F59C707BBAFA6CF8EDF
-:10292000F0ED2290787AE61F705FE3B0A07DA907F2
-:10293000E26AD72B48AFC609A305D8D15561CF832A
-:10294000CC7E310A690B64F200C53B01BC1B32F43A
-:10295000FB96AB10E92C14C8A909D0F2E38F9DFCBB
-:10296000F1D5F4FB915DB7A25C743F22A33D36F331
-:102970001BB793AF58E484FB3139655EE95B2E37B2
-:10298000E3A34756F7CCD2197902FFCDDA5BA3A2B5
-:102990009C78D19EE760EE0BF792E85B2EA4676609
-:1029A0009FC81ADB47863D2FD84F240F8B8C4F22B0
-:1029B00051AF35FFB9E4EB6224559CFBAC4BC679B3
-:1029C000B5C76B4A601DE4F377E03E19E9B18F6F3C
-:1029D0008E47C73F6B956FB2C6E02A00D54FD7B37D
-:1029E0005FF9F71C80FF6CA3A9A712A8A706CAC4A9
-:1029F000C4540ADF030F897148CA3C52CBF4D6761F
-:102A000099E50B6EE7E5C7CE91B85098E4A3999C81
-:102A1000DF1E7B4464F65C9CA09E23E7CEA37DE191
-:102A2000E3DF33CB5E56717F2266F8AA2A312B9002
-:102A3000FF58E885E2E8D298D72667C5A64CDBFAAE
-:102A400017508BC59E4F5D94AC2F811C3FAE02FD8D
-:102A50009EA17E2BD0EF12BE4F5463E6614AE7E69B
-:102A6000C1FC1F36F5AC9937E3C893DEDBB8CE0B5B
-:102A7000F1C2174CFA696834D0FFD1DC389EB94FE7
-:102A800058724B2406FAD3956FCF9FAE72E4472F4E
-:102A900071942F36BE52AE38E3A8DB66211DE801E3
-:102AA0009457C51CCF7B2FA3EE7CFAE838CB48BFE8
-:102AB0003C8E407A02B87EC59C80EEBF5B6A00BF48
-:102AC00020F040798635BF60B9C2ECEE815FB9096C
-:102AD000D8F9FB6B548C679A799D2E3EEE0A45C758
-:102AE0007AFB1FBA4385F65DC1220FE0EBC8E5EB28
-:102AF000BD98FFC1F3534DB9DB7AF9FA6B6E0279D9
-:102B0000982DA2EEE9C86FCD857DF9076A54CC3FB8
-:102B10000DA40DF51DA165DF134AF851FA7D7F550F
-:102B2000628D356E7387C2F4D7750ADF07DA66CF18
-:102B3000DFA07C709D02F961BE46DCB714559EC7CC
-:102B4000EBF0EF4D7C040E5F2716FAD9B3C80FFEE9
-:102B500028A38F38A78F3DDC3F7D04E4BF1BE886A8
-:102B6000C9FF6DDC3F75F63BBD217258013BEC1689
-:102B7000AD1C4251CEF59DD66DB7270A6376393725
-:102B8000D549F78DB9B6FA790D45B6EFFEF06C87E9
-:102B90007D92607A8DB0F5E9F2F8A681DC2EA77AF5
-:102BA00097D9199A18B1EEAB38F47A83CB68562EC0
-:102BB000C2BE09A4451A617D9CF6F456BE3E7F2331
-:102BC0001B5B94F9E8BF6D8527B58F79BEBADDFE32
-:102BD000180527A170CE1917CE872E06CE89F6D9F3
-:102BE0009CFB6B774A915D2FD1E7E274960FD9E198
-:102BF00067FE7C07C45169F9594E874F2912F67F49
-:102C000088CF77711AAD9F82BFCDF8EA73907803B1
-:102C1000F526A7CEB3040B08BFE7A5FEFE9CC2F6BF
-:102C2000B3174F1D7F9CE7611CFADCE632BEAF583C
-:102C3000E278ED8AF1036B39A1B0FDE79175E17996
-:102C400094A63D7687CBE8B7D64F3EED72D3DC072E
-:102C5000C9E6EBE9278CFF5E58B36ECB74CACF4A46
-:102C6000BE0FED9FEC35ED9BC500E41F0D6AE00F34
-:102C700064F37D7CB29AC951735F3DB3CE2E579DEC
-:102C8000E7ADDC3C2FDEED3C67C3E5AB931EC7929E
-:102C9000AFBF56ECFB1A23F1EB31E8CA19BF6E82C5
-:102CA0005F999DC9EDE048FAAA3963D3E3CF9B87CA
-:102CB000B70F4C4F965F82F33329E980ED27060E5C
-:102CC000FFA16E7505ECDBB178DA607362F19BD31E
-:102CD00093F22BB228E305887B466A3250DEAC08BB
-:102CE000FD71FB00F5C7EB8DFEC56F5AE639A851A3
-:102CF00068A78DC32786EB232B7F3D2130FAE9E0BF
-:102D0000E3EDE0F874DAD15D62CC0DFD7E40860C17
-:102D100021855F6B9D773BE26DC8077436D6BCC3D7
-:102D20006EC65781858D6188D3B9CF4BC807EEA990
-:102D3000A6DD1246BB659E3B839DFBF015E13E1E62
-:102D4000F5D387FB611D7C2CBFDFD48FEF9BF15443
-:102D5000AEF76ECB60E5ADCD2C7EEC3E72D96B3A12
-:102D60006DE77FD1453CF4FD162AD7210ED84DEDF5
-:102D700078F81EA8182210476FA3F5A316BFBB2D25
-:102D80005CAD819DD05E5AAEEAF4BB34A702CB7233
-:102D900061B9564DC79CEDFEDAD26C8883178B98CB
-:102DA000575B4ACB2DD4A44B776B38BF9F97BCE9B8
-:102DB00003FB2C1D9CF3F9C9F57455440D89C2E33E
-:102DC0000A69D5908B31A2B7399DD1F78F42BCE407
-:102DD00009215AE9A6F3FF393F7FD5A53496DC0ACD
-:102DE0007E8F1C7343FCA04965FB10400FEDF392EE
-:102DF000702FE1F855F8B8237E105FCF0FE4A118CB
-:102E0000A4B67689A421D5FA5CED6672AE5D33B4C2
-:102E100071E949933FB2E54F2F62FCA404293DA517
-:102E2000883F3AE5357147EADDD9C97C25BAB01A41
-:102E3000F22961F69E79BEE74DC5F89C9BCEA3D5DD
-:102E4000C7E5587E26D2297DBFDCFB89E43E8BCFC7
-:102E50001C5E5471AC06FC924117C68B02D3C8DFCE
-:102E6000462CF2F6A81B836EF4C9ECA4FB287DC4A3
-:102E700067B2B80401BA49A38A18F6210BC4F8A3B3
-:102E800085006F6FED34DA5F973C9D5AE6C97EAAE4
-:102E90000A98FDBFBDDADB60F503DE4D63FB2F77DB
-:102EA000F9AA9E86F995FAE2D5E83E4376E62476BD
-:102EB0007E0AE8F8128D0C0922C8C108617A33AC89
-:102EC00032FD5AA3C179298144C9F9B4F1F4A3FDB3
-:102ED0005CD59372BCD50BF808B278977F9780C900
-:102EE00080529F91F08298F4AD6A77337D5102E36E
-:102EF000F4577A898FD6FF63BF82F6619F3F4F06F2
-:102F0000BC3E2FAEFB26C49F867FE9C6FCC6BE3FF3
-:102F1000CFC6FCFB3EFF15CB406EF709E42855F603
-:102F2000A4EA6C1E4F362469B0CF17586A10D8E750
-:102F3000187E8184213FD815FAE9E237E7E1C4D34E
-:102F4000C485B49D87747B68BBF047DEF79750BAA1
-:102F50007ADA57FEE0A524195731E329CBD2A20F24
-:102F600003DE3A26FD5B03F04D37855342FBD5085F
-:102F700001DCE5D922C61F49B62F3E1DE265478315
-:102F800035903F5A2597616A6C60295BEF5F79A3A2
-:102F90007B61BE355A7D0DC4D72B8EEB2867978594
-:102FA000360F40B9F27556EE5018BF40BC8858E451
-:102FB0006ED5D92938BF3E4E27ED2163D010C6E526
-:102FC0001BC7B9037BBE9C950E20CFDD42075197EE
-:102FD000950E16523A9863A50343B8183AF82A2A70
-:102FE000EB4FC23FC66B3542326E379A0F36AB9904
-:102FF000A5A3F9C584E3BE8ACC20C851932FB4059C
-:10300000F7A25C755FAF44C05F37F9C4E48F8F3DB2
-:10301000237C12017E5FEDD3AF4AC527E08758F9C4
-:10302000E1DA31F86605191E08D2462B64124BA767
-:10303000A2E4E797BD553CC5C2074EBCAD582490ED
-:10304000933679C6CA16BC6A23E71BA50BC7FFCB0C
-:10305000B2DE11B4F06127F543C058EE16C304F494
-:10306000CA02DFBA3F025DCA75DF0B813FE87247D3
-:103070001A306F76C13B693752BAFCE3245187C9D5
-:1030800077E8EBBE8BFC7C228D807DB2BD723DC6A5
-:103090007DFF7853742AE8892D14FF27512FC72705
-:1030A0008B9883393499EDB7EB21F68C86D87BC2A7
-:1030B000BFC779D9E0F586B01E5D679B7CDCE16116
-:1030C000FB5D3B3C4CDF6C517A54E0B7E142554B21
-:1030D00095EF5CA9B2FA4BDCA4221CC4D1705FB995
-:1030E00043956A7B599C2FB184BE5F32ADE451EBAE
-:1030F0007E81D9EEC1E63EB453B6341FC267565D39
-:103100009C40DE95B724A6C3FEB8FA97A5820BFAB9
-:103110009DCDF671E17D8BC54ED355C69FEA5FA468
-:1031200028F0B1DA1AD3332DF2581585682A7B7B43
-:10313000A787C569D45682DFD5C35FC77DEFACE2F0
-:10314000B0F06528B7F69030EDC79360EF83C58681
-:10315000F0254BBFC1BA3E9B3E5C41972ABD1CADDA
-:103160002C3C17D3A17B719F6C45B0FA0FF2DCD1D8
-:10317000F4063F272D7463C26FEED7DECEFDF49ABE
-:103180002215F9B4A349E9C573302AB39F3E085606
-:103190008F7BAE00F669A98587FE303C61BF36366D
-:1031A00093EDD74219F66BE109FBB5F084FD5AF8AF
-:1031B0000EFBB550FE4EB38165D8B78532ECDBC649
-:1031C00066B27D5A28C33E2D3C0F3537E0F3D9E671
-:1031D00046FCFE5C731396293DA0FD474A6221B070
-:1031E000ABBBEF520CC8C7E9E2EB7EC428CA027A37
-:1031F000F104593CC1F3E203782EDA131231BED741
-:10320000197A80DC409FDDF3FDDD101F51BFEBC359
-:10321000A7477E9080DDB64788359030211BD58A40
-:103220001A99DA13C5A1CDD59961C0DBE5ED909F60
-:1032300038436F09AFD39265DD5FBEFE7B96F2D453
-:10324000D25ED94BEBDFD5BDA81DE406C0019B6B58
-:103250006DEA929A96624AB445D4A001F957A8C47F
-:1032600081EEBF04EB351DE06776E067485B08E25E
-:103270001F5375A51CF895D64F303EB9B0FA5DAA1C
-:103280008EEF9DEDC6AB27565C503D228DD31F7C43
-:1032900017C6E9A783B4698314F6AD205BC08EF22C
-:1032A000B0FDE06E179313DD1EF6FC9DC7DC0FAF7B
-:1032B0005EEEA1CFE51EC687DD9E482D9C4B199E74
-:1032C00023621CA8CF45BB80430A4D85AFC0F9A13E
-:1032D0003B7E2213D867D8C3F976FA543FD3E7F779
-:1032E000A8A8CF974FFD767B262D4FFF56380CFAB6
-:1032F000792B097B814E62DB985C79AA625A663D24
-:10330000AD7EC9FC6732414F7DAC32BB36CEFD92FB
-:10331000968E1BA742FCEA8FC7989CFC361FA7D746
-:1033200035D888EB39DF87760D752CD06E6909C9E1
-:10333000986724E6B0A7E2D2FE0AEA29D430885181
-:1033400078943F2F50314E72D6CDEFC118447B4652
-:10335000F144B50CFABE272622BFB769DE38D8DFA4
-:103360005B7DE578FE34562AE33994ADA52CCE9AE0
-:10337000E6FF7C1CEC981DFD1E261F7C2AE699C6E4
-:103380004B0F1EAD0EC253D480DFE3C6AA5AC4BB96
-:10339000266A98AF4A7FC3EF0D413CB7B295F075EE
-:1033A0006910F1DC5DC7A48F7E7A29E4EF7C590BAC
-:1033B000F3BB09301F1C4D3311F68D860FA7013C5E
-:1033C0007F63DE6B30D49A46EBB7AFD3C2B00E73D7
-:1033D000B5EA5AC837E8D0AAD11F4A9B53A35E8FDB
-:1033E0007268E4DC06DE9FD15E2A63BE117C07BEF4
-:1033F00024ED6400CECDE771599696512E801DD6EE
-:103400005187E14038D760CB3F6FCFBC06CF2B4907
-:103410002B3211CE0E62A8503F5627A39ECCF3A9A3
-:1034200009B04BF2CCB82F1CC5B0C425B26EB19F09
-:10343000E7C869906DE7C72747EDE56C1E67C8765A
-:103440009CFB38CBE9C58927E77CB3828F6600BC3B
-:103450005970E0571F3D9F0783E5F530CF3CCD8B7A
-:103460007087B4D62A905F9349630BD0DD45C3EBD8
-:1034700080736E69FB20ACFB5C5D263A1DFF523207
-:10348000DC0AFD6EE574DE5D68D7DB7B54C9E4C7FA
-:1034900030F0E3D42691C42CE343BC3266196F5A52
-:1034A00077A6AD3CBD27D7567FE6AE22DBF759F1B4
-:1034B000D9B6EF97EC2BB795E7F45D6EAB7FE9A13A
-:1034C0006A5BB92C718DADFEBCA3AB6CE5F9837F53
-:1034D00065ABBFE0C43ADBF7CB86D6DBBE5FF1D687
-:1034E000ADB6F295C377DBEA9B76BD532FCEE6F6F9
-:1034F000CDC5DAF36EB84FC216BFB5FB0B4E7B5F7E
-:10350000FD4B9BDE0A722DA0207DCBA0C769F9D6AA
-:10351000BB98BFA52E0EEB2057742E47A9185C0050
-:10352000EB561550511FC83E564FF62D43FB63CA4C
-:103530002E2A8FE681554A46BEA7815C6E8E2D2EBF
-:10354000B6C4A53C5A0F9EE1AA0AD4E23E88D95ED1
-:10355000D60C12F5C3783AB37BA8370BF53C3A6D1D
-:103560006F99D7F3A28847A587A95FF8A8C52F1C34
-:10357000CB0F74FA7D17EAE74D118917CF1F089119
-:10358000467896361EAB86B461EAFFFDB587F2E752
-:103590007625D2D04BFBDD5EE465FBA5DCFFEB2E90
-:1035A000EC43BE182E9451BF10592FB5C6ED3AF911
-:1035B000FAA6A94FA1FF49F18EF2D6C4FB566128A5
-:1035C000DE0672E72E2FCAC329BF71BF0CFCA516F9
-:1035D000A9792A7D1F3EA218B00FF520C76B91561E
-:1035E000560DA1A7E250FD6178CED0A99D419F253F
-:1035F000253B0FA35AF314E178B3C3DFAB0659A2FE
-:103600002E66F69F3C5789B7D27E248DC291C2FFA9
-:10361000309F526017DBE728967F07F406D6FF79C4
-:103620003A85AA4C15F3423C4007023E917E3C414C
-:103630001FEA0D0F1C8285B22CC4619F10EC53D879
-:10364000AFABCADC85EB6EDAAD60CF46993FDC09E3
-:10365000780DD6D9D73B4DFD0EE2A95D60F1F1EEB4
-:103660000CFDC56A3A6E77765126C462217E526F90
-:1036700091373BB83E8D7AD9D39437B891333F69AF
-:10368000EF50FADF254E03F87A08C82DCFBD3D0470
-:10369000E8DDA3D1D544BB3EA647509F327BF73629
-:1036A0000E534DD11ACC03783F588EF6ADA7E9F9E9
-:1036B00094F8F30C49C49837365E033376A3BE27DB
-:1036C000458A0E764593AE18BD29E4C15C95FB3959
-:1036D00053CC73AF2C0FA89BE3C38C9B8EC4237970
-:1036E000DCCD8C479AFDDC965D3E793C7BDC43FD6E
-:1036F000D0A805DE2D741CC04BC7B9FA5AC4834C40
-:10370000D8B9DD3F97F6DE87FBB16D3AEC37CFE5F0
-:10371000F67225E087E27B8A42D04F580AF1952C59
-:10372000F07E3F530B7C69C663863CEC1C773846C1
-:1037300024167F73997A4B3C7F29C2AC2B661E19E5
-:103740009ABC4CAFD17FFBE17CD9B46EFBF9CDE9DB
-:103750003DF6F2CC5DF6F2ACB8BD4CADE6E36017D9
-:10376000808D86F18D7DF6EFF5E6BE410D3B6FA6AF
-:10377000D291CF33FD6BBB3F8770FD6FE6BB15F475
-:1037800025AA40BCE6DF6ED7ABB95CCFE73AF46759
-:10379000B95FC2B843D5D1E000D88F667CE8575EE8
-:1037A000DD967766C6799CF2DCFBFA4E42BFA0FF3D
-:1037B0001E75B37807C4913F2CE071957C1E579914
-:1037C000C2E32A052CAEE292F497D60A9827FA3E75
-:1037D000F20569BC94C573D8B9AFF76AE517049DC3
-:1037E0008D17B58C7767496C3943433C07EA99F1EB
-:1037F00015337E10F01BCB817FB7865F6E3C42E9AC
-:10380000A4FA976E02FD5C25BD78B419E45B818C47
-:10381000F9DDDA825BBEE98578257CA7E5EA427DA1
-:1038200032F2C18F5D1847E8E2746D9E5734E33180
-:103830009A97F181CF6BDA47312FCFDFF782BD7BCB
-:10384000C93E2AA36DFA8EC5FDCCF8DE9C3EFBF77F
-:103850003E226469901FB0262E32FBCAF05559F201
-:103860001F67F3759BBB36F1C05A5A3E40E2E570C4
-:103870002F5D19A78FF080FD9CEC2422E039A94927
-:10388000C7A5709CD69FFB9CFD7BA9E31CED6CE754
-:10389000B95AC7FE915F22A7AFA7E36DD31B05906E
-:1038A000A3DBD6525B9E966779F9BEFD0C3203E826
-:1038B000F02AC9174E007E5F95701FCCFDC6CCD78D
-:1038C000AE07BD7E8CE52769D3F49D106FD67E2AA6
-:1038D000A19ED2D24859992FB9DFF40FE7C304F65D
-:1038E0004FCCF8D793745D41AF1CA07E79B10BFC2F
-:1038F0006C0DCB7DD42F87F2D3D42F87E741EA9785
-:10390000C3FB7FA67E39940F51BF1C9ECF52BF1CB4
-:10391000DE3F47FD7228DFE5ABC278F920AD0FF43A
-:10392000E22D3BA84EAB0039ECD2803E9C72A8AA97
-:10393000EA36753525A92F743D85FB1CD557B17C1A
-:10394000EAE5F73D85FB1CD6389C354E998CC30DB6
-:1039500009661C0E42A3BFE6FB1123F1B8288BC7F2
-:103960004DDC8F61F683F1CF51FDF038E8BB77FD78
-:10397000DBE36DF4D386F90F747B8BE07C47238FF8
-:10398000FB99F933BA2D3F7FC3C116CC9F51728E7C
-:1039900037C2BA1EACF0615E89E28A6A206F9DFE72
-:1039A0009CE9C739ED69F3E9D46F7E6E5798F1D57C
-:1039B000ED2E82F9D43181DA13605F34C717BFE985
-:1039C0001A3BEE7AC25BC4F3F8EC7261E41C018F1F
-:1039D000FBB8C19AA5F354048E0F9EDF8EA2B18866
-:1039E000C5FFACF1576F711C0FAF7B7D06DA750216
-:1039F000B5F7D0FED3A22188A375C2B98114F3DB39
-:103A0000CBF9BD2547417BA33387E58BD4E48743BE
-:103A1000D0BE2DA732643D47609E7318F057AA436D
-:103A200096FE6EF5178DABFF24AAAFF571F4B5E4E1
-:103A300066E77CDA0E5FA6C2F98D6EDFBA41F0A3AD
-:103A4000BB43418CD3F7E75492214BFF5268219E30
-:103A5000F3907CCC1E96422ADAC332CCBF3459DFB5
-:103A6000ACD7C2E53E65678C2F7A7C3D58CF2D4799
-:103A7000F07E09771054267D6A6CDFCE5B2C12D560
-:103A8000222FCC71EFF63279D95D1AD520CED21D16
-:103A90009275382FD2AD97239EDB389EDB0A4C7B84
-:103AA000228C76CCF7B97C35FB69E37180B60605CC
-:103AB000EDB948538656938579BDDF017EEEF6B5A4
-:103AC000AAB07FA9E4548CDBEFC084FD964DAA997F
-:103AD00087FD7E1FFA55FCEB34E8D735C6F9A463A1
-:103AE0009C1E3EA9DDEADCEFA3D086AC792BCEA7E5
-:103AF0009FDB9FCE761B4A871458F72D8FD9CF3383
-:103B0000BB083BDFB5F1D066E4F3EDF220DA51DB20
-:103B1000CF0929CF8985D204CE6F23FEBDCD0ECA31
-:103B2000E3FC94C7BF03A981BE284BD8ED96794723
-:103B3000EDE5F983F6F282134E3BC87815ECA0D57B
-:103B40005CEE0D5279CF92668665C0472416AF02AF
-:103B5000B8EB495F0BE453B8249617B29AEBBF95C4
-:103B60005C3F06D23210FEBC06AFCDFF24FC3EC047
-:103B70007CDE7F41CDC0E67610B211D3AED2D16FDC
-:103B80002DB8FAE92A14970EFBAADEB09FF75FE979
-:103B9000B09F9C765695DC8B79BBB98EB886B9EF11
-:103BA0000BF3847B0F9CE35FECB8667F90AF05F26C
-:103BB000CDBC0F06EF1FA6ED0BE48410A678CA6DEE
-:103BC00064E775F26E27466F0A3A5EC2D77D14DE4F
-:103BD000624B106F4BF9BB5C1FBBC72BB7468AEB20
-:103BE00074FCDC863EB40756DD42E78376F879CC78
-:103BF0009731EB6766F4E1B9A5DD7502CFE325687F
-:103C0000D798EBBCDBC7CE19D65F29C44568DF580F
-:103C100084E3235C45C9F5A5783AC9F0C4F212AF34
-:103C2000ADB59F87AC77D82F263DAC74BC3FE96516
-:103C3000FBE7261FBC7BD9891953281C1B849EDAFD
-:103C4000B46917AE2F2DFCE13A0F7C08BF4F6229F3
-:103C50003298EFABFE9386E74232861E269424AF5D
-:103C60004D23B19A4584FC8B77F8128196FF6A6BDD
-:103C70005F4777011CF31E7E0A8C3C77D73357D5FC
-:103C80005E992C7BEFEBC772908F035B906CBD2D20
-:103C9000F7C350D4C5D3187C5B0DB253821C5C5162
-:103CA000DB192E4CB6CB8476C238ED2264A79CA2D9
-:103CB0009DCF6C47D1D509F73FF17979F97791C359
-:103CC000631D5F06BC69BA0FCF3B2E9335D8BFFA90
-:103CD000B4704C9A68DE51B2D3356D743B0A768B62
-:103CE00009BF981AFE387CB78EEF1A07FEFF6E7C6C
-:103CF0004CD49FC2BF5F347CB47AEBA4B1E70B70A5
-:103D0000B9F05E22DD275AFAD9D1FF278C8BCBD7A9
-:103D1000913084BC6497A1C17E5EA9F610FAF77257
-:103D2000468D0676C0165A063B604B5F0FC6BF4BEA
-:103D30008B1FE806A22F4D7809C8833944CB384041
-:103D4000FB9DA3C970028BC8570E88104F279F2573
-:103D5000985F92DEEF65F708155EFE2DF0B7323200
-:103D600054DCCF48CBA8FC16337A599CD9843FAD9C
-:103D7000EA7835C4DFE57A1216002E214EAA80C9F2
-:103D80006611DCDFF01A07EF84F3024466FA09EFEC
-:103D9000D201BDCAE3ED9319C9906E45ABC73C97FC
-:103DA0009FC818C79A0C578551A22C2DCDDC09F05D
-:103DB0009446690702C0CFE26573A2623841FB2FC7
-:103DC0003FCDDA919FB17326D43759F38C2F8957A1
-:103DD00053AE4CE671F8D05A7B9C9A0CD339D3F68B
-:103DE000E53F5BB517E2149346C96FE6B77B399C94
-:103DF000E9A74904FA0FD6D9F58697E7797B1DF72D
-:103E0000CC54F85DF6FBA19DFEC35723A807DC2424
-:103E1000AC2A685FAC45BBC1F44B764345B0C70BD9
-:103E200008BB97D7D9BE92B52721E6A7B8BD4455A0
-:103E3000CBE9F7F55E03F312DDB44CF1282844CD4D
-:103E4000A1EF7345166F6911880CE5E47809CC473A
-:103E500070AB9F6907FBE5B03A0FEF4F33FDEA36D1
-:103E60002D8CF912A4A4DA66379B7961B796154DAB
-:103E700086EFE99346E24E1AD0E5ADD9C56847070B
-:103E8000B286FE1AE4ECB9ADE9CB5490AB90AF71B9
-:103E900039E4477B3B6354E9BBCFE611DD629FB950
-:103EA000E5468CB3B9CF4EB1BD4F34DBCF5B1B3E83
-:103EB000B106C699EA637C5845B476685745ECE785
-:103EC000AADD67736CF67AB2FF7CDBFB04B56BACE2
-:103ED000F7008DDD7F1AD14BACFD4F1BA3FF198E70
-:103EE000FEB594FD27FBCDB2F5DB21B3F86B2CE8D2
-:103EF0004D792FE5025F75311C951D6B7FA0D2C7F0
-:103F0000E29A5DA146DC1FA82694F129BD2C3977E1
-:103F10005262E77D09DA6F24DFBE3F50CDE958A435
-:103F20009481E70764FBFDC68B89F3BE63BB5DF438
-:103F30004B8839507C89FE8A41DC27F8930FCF03E8
-:103F40008E65370F36138C4F2F4E1BBA0DF6C157A7
-:103F50006ED3958E10E63DA33FFF37DBE62F033B84
-:103F6000DFBC07B32328225E22D593F13C97D94FBB
-:103F70004421D3412E46449607813F74FCC1EC5C3A
-:103F80005BBE86F9749E87AF3784C5C596790D42AE
-:103F9000FEA175BCA579BD92651E1137998FE3719D
-:103FA0007B7764BC499F6CBC633C9E658E57BFCCDD
-:103FB0003EBF7A45C3F9D5733E36C73B06F34B8106
-:103FC000DF09C7E3F99523E32DB7CFAFDEADE1FC01
-:103FD000EAF97DBC23E34DFA64E399719D2EA5B106
-:103FE00011E870ACF88E19D7B9B66BBF2DAE43622D
-:103FF000FB97561513B25360F223EEABEE04BA787A
-:10400000BFEED612D42BDCBEC67B57A93E5E293349
-:104010007857E4FBE22D163CEEA672C49809E72916
-:10402000540207CFE07C8581E72D42F87C94DAEBDF
-:1040300006E69794E0F7C79BC358DED7BC109F668F
-:104040003F250BD9FD60B3160929EDF6133EE67F37
-:10405000EECCD1AEFB12E8B72A2FCB0B5E78053140
-:104060002C763435AC0F7B607FE8F3A40C74E48CC1
-:104070005D0CEE60CDA438ACBFB76C60B019E2A0A7
-:10408000B24BC7BC583DF5DF3B78C5C7FC79B79B41
-:10409000B52757B07B525770FD44A43ACC3F5AB174
-:1040A0003203F31156AD36FC1AC5DB6A4178B59878
-:1040B000EB3B381FF539BED44E7F21089A87AE57A7
-:1040C000D090E2708FDCE7F25F5C23D07E23FE6B42
-:1040D000D1CF88D08699B49FCF717D5BF5869B4008
-:1040E0003C825CA5A0FC5ABDDAEE17ECF42434B097
-:1040F00073769605490B6DB7AACEFEDDED667C158D
-:1041000071DC13B362827B63CCBC5C277E9C71D371
-:104110009FF9ECF1D133A474079E0DE3F9BBCEF601
-:10412000661CB4DDC7E45B97C2E4C3683E60F0BCC4
-:104130000B7DA3FF7702E368267CB9725C00799F50
-:10414000D770C2961F4F118B46B5B94F40A4036577
-:10415000A8871DF3D92D1CC819EFDEA85C22FF6EBD
-:10416000A884FF7D0361F4BCDF1935EF452F15935B
-:1041700054FCC3E2C12B8E4AE1163D8917130FFF91
-:10418000DB7CB4CBC7F0F9D2D20F2A981F986FFB13
-:104190003B02E639AF6B47CA32912DF4BC72BD6267
-:1041A000307F75B814E8F2F8956961F6F730B81DFC
-:1041B00094F8A50876D0A7EFDF28B0E53FF37EC7D7
-:1041C0005A2F67DEA5E55C72F29E04C87F690987F5
-:1041D000D01EC81609F0532EE4E305D8F79376BB3A
-:1041E000D5968FD7D6BF5F80B8E1C3909F68398FCF
-:1041F00097D7D02774807DD71267718804AD47E1C7
-:10420000CE6F4808EDA5C9BC2FA75CCFBFC59E2FB8
-:10421000D8B168B5764087BC9AEA1EB8206CCB2E20
-:1042200016E732EB8FC4BBF83955176924704E433B
-:10423000F2B1787388DFDF31519EEF87624C2B2C0F
-:1042400084FCDEB85A45E7BF272BBACC4FFBED0EF6
-:104250009637F6027DCA61CC075FDB744F04E284B7
-:104260005A56EA38F85A6E1FD4FB195DBDEE4A144F
-:1042700040DCFCE5ACEA7A7F768AFA4D5FC5FE1633
-:104280008F712FFD7A3F8BCF3C2CA6960737F0EF2E
-:104290005FD820E27D431EE2C773AC9EE29E85801C
-:1042A0008F8737EE0EA73A8FB9508BAEF35BF0EEE7
-:1042B0002966F70510D27719CC73CBC78FF47D9799
-:1042C000CE3BF3631FCAD94C89F56B69BFDE3A1F39
-:1042D000B3FDF37FFA059EB37F9EDFBF4EC8F4E5C2
-:1042E0001067DF3E52263138E8BC3D839763E272A7
-:1042F000F02B93E5E796554119689412DFBBFE97C2
-:104300003AE1FE9AED02E1C43AB80CEBF3FBDE7F32
-:10431000C2BF2FBEE69D6FED007D50A9A0BFB99D25
-:10432000DB3B267CFFE967793FFFC9D7652C7C6EB4
-:10433000E3DF7D80CFE045E1735B2A7C7E26686CFD
-:1043400087F71EC804A120783E566F87BCECAF37B4
-:1043500093C897E81C1E0E1FDC0F678F68FB8752FF
-:10436000B5FF4196F1353FC27312E7E72FF685019D
-:10437000155B1610EC27051CDF186F5DCB33989C7E
-:104380004B4B67CF4C6E5F4AEEC110E42F6815FFB0
-:10439000709B46E54C67E1E09A5471E2A702CCEECF
-:1043A000CF18232E7E98E3EFEACCC8B701EE76ED66
-:1043B00001F4F7148144A0FE96854344B0B47B23F6
-:1043C000C0E897C2FD0CC0AD5CC6EEB1F653BC436D
-:1043D000829CBF82C1BF453F4E204FDE1F3A8E797F
-:1043E000ADFE8A21E4771485B98CAEC01F54B9FDA7
-:1043F00076D8FF26DAF5999249777774011D4AC974
-:1044000032D2656F266BFFFBC01D5DE02FEE516859
-:104410001B9083B90ADA37CEF9FD2CC0E6A768C62F
-:10442000518077143EDD43DF827B09B64F67F7B9D1
-:104430002C1607D7DC0074798D0FED33FA7E8DF5DD
-:104440005CFE479C7F3FF233FB6AFB9F54FCEE5CB3
-:104450008FB1E8F5246FFF09E8F5642AFEA5F4FAA8
-:104460005B786FA1D70F486A7A7D7B0C7AFD0F6865
-:10447000EFC48BB32C116317EC2BCB1F2DDB07FD87
-:10448000C99F59B4EBBBF4297DB42D86AB19166CCA
-:10449000E79E93F23EFA2718D7BC7FC0FC3B46CD7F
-:1044A0004008F353F4BBA07217C8B10BE8570E6471
-:1044B0008FEEF7653F8377F135BE68AAFB14BE1314
-:1044C00090D9F9D800AB3716DFFC3AC0F253C6E2F8
-:1044D0009B17381F50BE0906E64FCC3767927C9376
-:1044E0001FB820BE79089F9E62C63738FFCB47F3BE
-:1044F0000D89ADEB02F9DA59C8F862CEFD9B902F19
-:1045000046F82816C3EF52B28CF2DBE4A38FEF8F8C
-:10451000617D67FBC018F70656707E5AA845E60114
-:10452000FE8D4BB476768E6908CFEBF692E17E373E
-:10453000E609B3BC5C6F2C6630F36090C0FDB48BB1
-:10454000381EF6808F067E50258F67C98364957F5D
-:10455000343FFB2B1215D67B605EE1E3FBD2234B8D
-:10456000018FBD646816D86763AD532D1F4FC832E5
-:104570006A0329F87F223DB421C0F4D0063E6EE6DE
-:10458000C76A23D8A74E7E5FBCF1D93F3C3E4E3F61
-:10459000EB391CEB029F585FAD0BA4D6573704ECE8
-:1045A000FAAA42284AC9FFEB0329E407E5FF9B5317
-:1045B000E1E553F0FB9D8114FC1E095C18BE9FE5EC
-:1045C000F87EF653E27B176FDF13F8C4F2B62715B7
-:1045D000BE28BE7706B22F08DFBB52AD17C5F7D78E
-:1045E00003B8FE4F23FC7EDD87F1F2EE05E420F4F4
-:1045F00093028E5E6B3FAACEFAA13CF58140E97E24
-:10460000F147DDE154F724D176FB52B5AB0D683CA0
-:104610000EAD6F06FFE1E1CFF8705F81EAC703815D
-:10462000FF5EB97F28151D2C16991CF206167581A0
-:10463000BEFF14FD0FA492FF5FE57436915DF01A82
-:10464000A70B3AEF9F029C4EF9D7CBCF312B5AF4F0
-:10465000E500E26BE86A90577BEECE1420DE956FA2
-:104660002404F0138E723D560597FDCC4FB6DB2324
-:104670002704B867674FA326C079294B7FAF07B2DD
-:10468000C7EECF090785EF3730BE2FDD188276B52C
-:104690007C7E176B271DC934DE0AA0FE89BC0D4F36
-:1046A00063A65D6E9BF310233D2CCF7661EABF734A
-:1046B00079D42F9BF2FF7DABFCFF8F11BA62FD5DB9
-:1046C000ACFEA1F09DE3F0FD25157C4EBC4C04E74B
-:1046D000250199EBDB889A9E424F39FB33FDEC9123
-:1046E00075029D6489FB64A78FE8EF603AAC478749
-:1046F00088E7A8567079B2626106B7DB352FF4FF00
-:10470000308FC33F7CCB0355B0AFDE7BAF5606285E
-:10471000C86D607A4FBF650AC657A7F27E9DF08FBD
-:10472000B457FA66C1DF8FA0E34E83792C59441247
-:10473000E037A683DD80F10A0DFFCE71A6BB27040A
-:10474000F1D92D42CF9A75A057AFF6B17331A1D5EB
-:1047500013DC9FD96AA35B12AA98A07E0BD6D7D28E
-:104760007AF09E950BAEEFEE496967D5A48B9C9EBF
-:10477000A24BC6C56B2888712F13BFA3C761EB5727
-:1047800015691400DFFE0A4183D43B3FA513B0979F
-:10479000C4E241CC9BFA6C05A31742FD92F1EF698C
-:1047A000E934E15A0578FFB47099F5C61E8FD773C6
-:1047B0009CB718F97B643E26C7B0222DBF77342BF7
-:1047C000E5BE82F9EC6AD60CB832F93D4DC7FB1B49
-:1047D000BB46F2BEC3A155FEFFF97AC979C5597C23
-:1047E000D4517FE49E92908AF61FFE9D0FEB7D3D93
-:1047F0009C2ED48C482C1DE54A18EF89A4E5565808
-:104800000FA2D2B21FCBED58D646CA9D583FC4EA7C
-:10481000134DBB20BCD376DBB11F79A49F1DD88F6D
-:104820006F64DC9D580E8E941FC4FAF9ACFE858E21
-:1048300033EA9E964109E7FF816CA4C3BEE9E79B7A
-:104840006EC0F8D2754D37E1B3BB59AB82389D7954
-:104850005FC9E7AFBB41037FFABA2F3F88FBFA6617
-:10486000FF2BC1EF00FED7E55AB097944231F29882
-:104870002FC97F4938DAB1BC4266F7FEAF5C787A5F
-:104880007BBB257EA7C2DF4F87FC1ADD725F06491E
-:10489000CAC32704E37BE91741CFA3E749C800A5B2
-:1048A000DF0F7CC5F118D273B5968A6FCCF98ED51F
-:1048B000BF39DFB1E48D8937F3FD9662FEF7761DCF
-:1048C000F14BCFF41ACCFF59297038FDFCFE485E3D
-:1048D0006F051DE7E952A40B1DE87605F7EF9CFA7A
-:1048E000C11CF709217A02E804E2C4F7968FC6EFEB
-:1048F00085E2CDEC7F723446E0FE2E6F29C17DB19A
-:10490000A0DFDC576772ED219F598E617249A4B810
-:1049100007E59C4737E51ED3935A5A9F2196513F8E
-:10492000A887D48666411E6834047FEA87968FCABA
-:10493000684FB0321DFEE800DA3FDA6CB8F1516D15
-:104940003FF7A3A35712767411F7DDCEFD08F5B734
-:1049500059860B7C4B68D93B5236D4102D178D9459
-:104960006350DEC3ED3EA1E7DC8F60CF84EAE573E0
-:1049700056795FC5E5EA44F2F4BF00B9E905CA001B
-:10498000800000001F8B080000000000000BE57D88
-:104990000B7854D5B5F03E73E695642699BC270490
-:1049A000C8090F098A38090482623BE1D558790C9D
-:1049B00015359628938447782620D5B1D2322180A8
-:1049C000A0D886AA156BC509C57B69AFB6A0B4E5AA
-:1049D0007AD17F10B4D0521A2B55B4A25150F15154
-:1049E000938294A9D572D75A7BEFCC39273321B45F
-:1049F000DEFFEFFF5DF874B3CFD967EFBD1E7BAD6F
-:104A0000B5D75A7B0F6361C6721963DE1CC6C63107
-:104A1000761EFF7CB967C944BB366DAD67C268A816
-:104A200079ADBEA11A631BF15541BC5D89C74EED3E
-:104A30001ECD0CA67BCA199BBEAACBEA8476CEE219
-:104A40001C77D0C55891F79370257C5F349E310D4B
-:104A5000BF1D9245E3B679572A769842DB08E651A6
-:104A600018BD5BE381F6396EC6DAA164D60863230C
-:104A700018BBDF25EB301F28032511D601CF533596
-:104A8000FEDE827578AE3A58D34EA8A795307F04E3
-:104A9000EA1E079B1380B2D863610CE6E5F3A834E5
-:104AA0004F1F8E06F50CEF5AA6417B6795C51F81F7
-:104AB00032034B971EFEB5E23B2B95121FD7E6043F
-:104AC00047209C6D8C55EDC479B168A004E0481D69
-:104AD0009E937537D42A4BAC2B190CF9E86A1698BB
-:104AE0006B63ACC21348C3F6AED29CD4E008AA8F65
-:104AF000F2403FAE75963003BC54327744298EE3C2
-:104B000005669E1A7027A7C7CBAB838149B6E474AC
-:104B1000BBE12635A087439653100FF0FDC7D5EFB4
-:104B20007C1FC159EAECB2B34140CF219B034C45F5
-:104B3000783482D3B97B66B410DE2FDBB39CE17C82
-:104B4000D7A4A58F473A9AC77DF9B3073D01789F4F
-:104B5000F25747606782F196083C1F5D5D4DDF416B
-:104B6000F79A358FB13908CA204604ED7062C994AE
-:104B7000F30E02EFE810787F0BE3CC302B503B8D27
-:104B8000015EEBAA55A616E377DDEDD979A8DFD251
-:104B9000513B958D844AC876129F3BE1EF79E83707
-:104BA000C832A778E0716D983FA7F6F0DF3CE69B2E
-:104BB000920BDFD56F303D7FFD9AF7593ABEB79E15
-:104BC000EC2889F77F63756D6092687786FE1F21F8
-:104BD000786669CC8F749BE54B8B8401C4EB0337FB
-:104BE000052695C4FB7BE573750EE2C58C8FFF44EB
-:104BF0007CE4223E028149437BE2A32EA0D83DDA29
-:104C000085F1D2573CD45A4BA7E46A3DF160861F28
-:104C100030762FE2791EE0F9EEE2E4F88076448FF8
-:104C2000576E827600CA1475AACD0278A89FA93063
-:104C30008742F84D6783B19D7FEA64DD7CCD78348F
-:104C4000E3ABFE19E68B42BFF50FB87DC0E1ECF790
-:104C5000123F5140DA189027BCA91ECEB771FE1E34
-:104C6000F88B707EADA2F4F91C984770ADE2631C1E
-:104C7000DEB7F5F0D5B140465421B8DF4E42F7B764
-:104C8000F5709AE7679E7F0A0A2B907FA1D78BBFAA
-:104C90007340D78E59A323029733F6538F3BE7DD3A
-:104CA000CBA03E92F9CEC3BA3ACBC6678CC2F743CB
-:104CB00012CBDB73ABB5EF1CB0E9D739E7B339A141
-:104CC00099DDE362FF0A0B76D73D80E7C04DEABD70
-:104CD000D7C3BF5F3E98BD0E9FADF0AADAC96CC4C2
-:104CE00017C04BF4F23326F98B6119DEA702FE667A
-:104CF00032A7E6827EBE0C42EA3CC032DD9FA2B9FA
-:104D000074709C6E55AA508E02F132665D1E87D774
-:104D10003CEF155E3B8D07FCF8899E1FCD7879B975
-:104D20007A7006CA9117112F69849791178397AFEC
-:104D3000E0628675E3C9665105E8DCA53823DB60CF
-:104D40004E35A13B039346215E58D80EA2F35D4F2A
-:104D5000B190D31C6E1B937F9A18CAD31A3B0B22B7
-:104D60005CAFDB58F52E1796D101653AB9F57E7622
-:104D7000E5BB28A765BD26F46DEA1F1891F850F22F
-:104D8000F32D4E5754E57CF85137DF903CABF120C2
-:104D9000DD814EEC3CC0A9662CD1106E352D7D24F2
-:104DA000CB606C033601389D9981D328FFD5B4813F
-:104DB00011E4BFD49B7EB481D3F1BEAA1B74744CA2
-:104DC00099F754983AD7B20CF84F13F4AB14F44B4C
-:104DD00029719AE9C7709D864B58E43145A000EAD5
-:104DE000A787F823B86E93E90D49CF9412EBA71D5E
-:104DF0007ABE66AD8457494776607417AED7A0D7A0
-:104E0000CAEEA6F725849FA047E2A7CB86FA644E98
-:104E1000C8765ADF4FB0606EA419BFDBE8F0E1B38B
-:104E20003A8B9687ED004F1ED4E3ACC4E7C3F5C3BD
-:104E3000C2F09DE427C42B1A13BAFE3B00868232CF
-:104E4000EC0FA4277EB74137CEA09EE376AF2B733D
-:104E5000BFA6EF5415EC07B2237C3E9F4E7E0FCECB
-:104E6000E4F6C369EFE89D9641C9F157E7CCF65BDC
-:104E7000B3E3F5B70B9CD591047A40F627F5799604
-:104E80001AF45A10B6F063070FF4473DECB9142436
-:104E900019BBC71639787000431661AC1FFE2F721C
-:104EA000D0EF22BB43D4813161FE6DA9DD75BFD344
-:104EB0000BF541DDF530D6B7C270EC4AB05B32235A
-:104EC00007D7C27CCE1D7790FE3A5D951AC1C59377
-:104ED0001D9AC84EC0BCAD60E66400AB4111C6D29D
-:104EE000192A2478142B600EF09DADF914C4F7AC88
-:104EF0004C8DE66FD558D40D93CBB6FA14C4D7F7C2
-:104F0000ECAC41C88DE13375F6CB2C01AF1CC7E189
-:104F100064E194B278BF606135A31EB14E65A457B9
-:104F2000609D93DD26D7B7EC2798C9F567F7FABCE3
-:104F3000F07A0E662658CF872D4D6F7E0BEDD95F28
-:104F4000ABEC3100E566EF1DF4FC86503D953785EE
-:104F50001652B9488CF70E0B2ECA84B2BDFAA59B27
-:104F60006F07FE6DDCEDF0A15A5E7ADBFBDF29D71F
-:104F7000104F4077FC6E5EFD03E5F0DE3ED442F656
-:104F8000EC8601AC1AF9C9DEAC907DB451B357ED93
-:104F900086F2A18CCA2D993A381ECA98447556A536
-:104FA0005990CF5738399F9F3B7E97B70EED4A9760
-:104FB0008BD68BBDB9F8BB16A8B343306F86F2838E
-:104FC000919DA13A78797726B753EF16F85E93C989
-:104FD000ED3D670C89CCF9BA09C6775AC30CED6C64
-:104FE00067CC4ACFED0ACC2F019FCAFE9C3158A452
-:104FF000A3703CF3F7767A8E70E1F76A3633D83DCA
-:10500000F7E1F7B958CA79A4F179649BFB49E7CF76
-:10501000C5FA33CFE34F9E890F227E1ECAF06FC9B7
-:10502000A475D36143797E8BEBD7C794917D91C7EB
-:105030001D0ACAE3E99F29D122C05F4AA51A595324
-:105040008C7ACD336D34F001ABB4F9109FED43721F
-:10505000DC8374E3FF44D0FF45ABC78DF30C4C06F3
-:10506000BB9AF89BE5CEC27E26D78FE1F20F0C2EBD
-:105070009D9E7D51DBBE6110CADFB08DF64B739CE7
-:10508000E108CE4F67B729E7B95CD6AC63E2F6DF3B
-:105090009C49AA3F25BDA77D07DB900364FF4959C2
-:1050A0001E863A7CF786A8BE39E9CCF5084607F398
-:1050B000D807E9ED41DC2D8D41FB86FF991332DAEB
-:1050C0007D66BBB0AEA2F4052003E02552351AF987
-:1050D0006CB885F8ACAFF632639B399D27B7787012
-:1050E0005FF528CA09A84F9F746212CA8D19605AC9
-:1050F00061BF3326A99E28B4DE14B2303F4CFC8831
-:105100005F8D2800DB91928E435F46BC55D834D228
-:105110005B25ECDEEB72F0FD280FE23920EC106825
-:10512000CFF59BD719190ACFDAFD275CF53ABE3BBC
-:1051300052716238EE5740EE3524E227C69A89AFA5
-:105140000F7C3395FA79F37E25E280F94F563FFBC9
-:10515000ED58B467BF65F3393402CB82749DEA63BE
-:1051600062E3EA774DD6D9012758600CD995A5C7D7
-:105170002B1D68BFAE53689D4AFCCF0919EDCD6069
-:1051800013D8655A4FFB143AB3233FF7D53E35DBAE
-:10519000579F650A7BB38C95E9EDAA647A4ADA5584
-:1051A00056E657B3F87AB2A2DE9D0E0F12C9819A65
-:1051B0000CBE0E26AB1F117D4E57A81AE2EB48E835
-:1051C0000317EEC78F7CA6F27DB03FD760C715648A
-:1051D00071BFC0563B1864F0DDD67ECE483374B53F
-:1051E000EF9B97E677107DB407C7231D7F6D2339AA
-:1051F0009C6CBEEE90CA8600634E0B29544AFA1589
-:1052000085529855A71F8A58E2F95F9AC5F7A1B948
-:10521000AB9845837133C3CC9F687F2CDBC1BE78CC
-:105220008A9551FB6826CC6FD9100BF1A7DC1FA71C
-:10523000D8C2FE4280DFB6777918F7C945303F9C67
-:105240008706F3437D591C4AA3FAA0503695834341
-:1052500099540E0915D2FBA1A1C1545E122AA6E7EA
-:10526000C3429751BD24348ACAE1A1522A2F0D5D51
-:1052700045E565A037B1DD885025959787AEA5E750
-:105280002343D7517945682695BED06C7A5F1AAA18
-:10529000A7B22C544BCF478516537D74E856AA9776
-:1052A000879653392674279563432D5456849AA9BB
-:1052B000DDB8D03D54BF32741F9557853653393E03
-:1052C000F430BD97764BAA588FF768733DE8EF002E
-:1052D0000ED7908F93ADBB85595C0FBC98E99F8921
-:1052E0007C27DBD92DA0C75D3DDBCD136526D235EC
-:1052F000417FC12CCE971FFBDEFEFE3016A7DB469A
-:105300006FEFFE0C56D237BF57208BCBAFADD676A2
-:10531000BF8AFCDBC47C6178346DF48B0ACA973693
-:10532000CD5A95C8BE7B28CB46E33E9A196CCA82FB
-:10533000EFD38A4F1E40793223ECF9ED04E4971144
-:1053400039BF9E00FD15ADB5D0765F639E7DE85FE9
-:10535000D32631928BD2AF04769D419F6ECE92764A
-:10536000E3CE8383683D0D29E3FAA7E31A5C5FF679
-:105370006F0EA2FDFB567B54B1A27DB38231BDFD01
-:10538000BF757DDDBFE1FB787F7C7D166D60CFA1B1
-:10539000895DDCAA4D488172F016FF7329F0C9D0EF
-:1053A0004870422AD487ED083F87E5F09D9109694E
-:1053B000505EB627FA1C6EE32E8F764C7041FD8A44
-:1053C000836C3F2EFFD2766DA21BEAA38EF9F70302
-:1053D0001BB0F28EE0C4740DE713694987F96C7D48
-:1053E000030C3DA8577CD4AAC276284E7FB0E3D0E8
-:1053F0007E9374718F6E9F940DFFECBFD253AAE21F
-:10540000F7D68E94CC113DE9D38670239CA0471E1D
-:1054100003B8FAFBA38A47C727CF08FE003AB42196
-:105420001DA45FB26D6D16F925DB523D953864D72A
-:1054300064E6D9A6211F5B094FF67583C81F27F9BB
-:105440000EF06BB067370B39B1B5DBDE4D8CDF6723
-:1054500010BFE5FF3AF89D9AC5D74332FC3A915701
-:10546000C65D781D1F117C08EBF8D788D764EDCE98
-:1054700008FC9BF1DC6661074157C1B8C0A77C5DA1
-:1054800031F4A37D2CD6FB85F07AEA5F0CAFCF0B0D
-:1054900039910CAF4CCB213909FC3A1CFD63C9E4AE
-:1054A0008D5DEC67CCEF3F17FCA69373DC6FEB01CF
-:1054B000393738B99C3B7421F925E48CDDE4DF49A8
-:1054C000CDE6E3557802CEECF2047E6A1137907E89
-:1054D000EAA9AAA712E50D1BC6C88E4E1B1109E347
-:1054E0003EA528AC95A9D80C8532E2B15F09F91F19
-:1054F0008AC1CEB002FDA1AB28964ECD63A943FF71
-:10550000BB5C6F9E5AAF7EBD497D1F5F8F922FB2ED
-:10551000DAEEE67E496D26D82FD764737E8BF7C30B
-:10552000FD20EBEFE8D776B74E0EB679BD5497ED78
-:1055300093F1EF02F1BE6DED1AC2A7737C62BB61FD
-:1055400062B62AE441971FF93CFC25E6417B2673AD
-:10555000EDDB249F32413E29249FF8F8FD43A9FF4B
-:105560001686FA84EC3C21CF3DA937B8FFDFF173F2
-:105570003EDA54A807C67BF6A918A7013DA4E13A74
-:105580001D0F731F8DF8B213DD35C6E9A88D6711A5
-:10559000B47B016F51DCB7872D6EF233D9EDAD7E50
-:1055A0005CCFCC9E49F057788233B37B91379E34E1
-:1055B000AD14895A97BDEB1A17F0DFFA624F2AD65D
-:1055C000E7407D53058C9BD5C1447DA36BDC3FEE4A
-:1055D000F7A8BBEF6787D0EFB13FCB1FCCE67C5D70
-:1055E00087A57F98C74AFEEA3EC6C1E4FA8CAF277A
-:1055F0004FA95C4FB523481E2EC17E657FC9EC9B29
-:105600004BB2B99CFB56B6C5C0D73DC76D36AFFB94
-:10561000BED93762BE8BB37B5FFF2F1FBC6FCB76CB
-:10562000A6F337F6FB7EBB55437F06F7D3589CEDB8
-:10563000D49F5BF81BFDE86F043E700EE175FC9390
-:10564000C85F9C1C8F119AAFF4334A7F62BAE02B7B
-:10565000665522A8C7D32B3CD63AEAAF837D0DFA14
-:10566000FB81C0935CD728B79E1C817229CB8AFB33
-:1056700075F427B9B3E2FD633DA32C2E9F98D8C7DC
-:10568000DD2AE6DCBAC697812EE7F011EE4769FD08
-:10569000365F97D3FAB3C81A94137EA679A07D0A11
-:1056A000937FFC067FF2D44F15E687F91FFE54A5C1
-:1056B0005219C2A26ED8EF4DF32951DC07DA2DCE74
-:1056C00008EAD2CA7E4E86F14D7BBA2582F111FBE3
-:1056D000DB0AC1692F4B8BA0F09BD4AF2203E39868
-:1056E000670EEF770513D0FFC660ADC1FF65C663D7
-:1056F00077BB9B9FF7201E1FBE409CF65076779C81
-:10570000767F36DA4373BBD6DAB5789C56C61F0B64
-:10571000BCBB3756A2CA5AC2EDD37E2CD2ACB7ABB3
-:105720007471D0DF22BF3F1C8F83B65FA28F833698
-:10573000F6DB8BF6EE43DD71D06014C7F567EF2C16
-:1057400045FE7DD8B7FBC7DF457C3A44BC62D471C7
-:1057500097867EFAF2FDB908CF6F4DF397A5F4E373
-:1057600099F7C1C7B38DF18533BEEB32A2C45BD9C3
-:1057700009D7B7F42FCAFD30FA0F3D09D7A111DFC1
-:1057800072FC1A85EF6B994DE1F24FE851902F9D15
-:105790002407228CF4A6DFA16C437D73C637CA4769
-:1057A00071CF24F246CE07F0383451FC17C64B189F
-:1057B000674DC9E17AAAC6C6FDA6CAF2F2269C5771
-:1057C0008DDBA53874FEFEB342AF9BE3426AC66729
-:1057D000E541E1F74E04BF39BE7356E80BC497DECE
-:1057E0004F7E217C1DB3B552FCF0D83C9535433F2C
-:1057F000678263F35982EF65F91AF2CD50C6DECCA9
-:10580000E1E375D33349BCE8D8EA068A339BE36900
-:10581000DDEF6B53AA517F57231E75E35E29F077A6
-:105820009D289923A879E0BDBDEE010FC3F8D7D01C
-:105830004FCAC36EF48B75FD1CE317EC5B6EF25719
-:1058400054D79E2D6FBE5C87CF0AC6E3B3FB1FF211
-:1058500068F0BC7AE8DADCB02B391ED1B78578BAAB
-:10586000071F8C237F4C79CE45F863D8081E17623A
-:10587000FB53287E9AF207D58776038ECBF500F787
-:1058800027AF147113731CAF3AB4CC205FD2620AF5
-:105890008BE8E21769D69DE49F4D8B59E9B979BD34
-:1058A000E5E774C73969BD49FC27A3A7C4BFF979E7
-:1058B000590EE7CB63B50B35F41BDA5313DBC11B71
-:1058C000453B5937E723248BBBCF17743D131C97F7
-:1058D0008FFEAA6A7B78685FD6B9C4CF85F21CE6D2
-:1058E000E4707DEEBEE92511C753D7626F52AFA6B3
-:1058F000597B8FC7FA4DF1D8B4D13DE279FF23F13E
-:10590000D8969C7F2C1E7BADE0DB0BE5A1DC6837D5
-:10591000DA3DDD7815743C134C6161908FB756AA5F
-:10592000148702FE20FD78EC0185ECCD68AD83F490
-:10593000727D6D0AF967EB4B557A5F7FAF4AFA3398
-:105940000AF26109C887DF0A3961F6CF5632C510FD
-:105950003F9F3E3AC550BF69DE7DBF5D8DFEE50AC3
-:105960009B86E31DD1B8BF39EC57C97E853E7C517B
-:10597000F44FDF7FB50FF599E487237E95D65BF86A
-:10598000A8EAC361DB853FFAC886D208E6A93025BC
-:105990001EA7D70663FFF514077ED5BB85E29C29B9
-:1059A0009F3F1808D0FE31A89592DEE4F1D314B1E0
-:1059B0004E27F6ABB801F5F89B9B6C0CFD466FAE1D
-:1059C0003A43EBB9637513E54548FFB2F40F9BFD0D
-:1059D000CC66FF720FBFB2C99F9C2C9FE15749F85C
-:1059E00043CAAB64FC0162EB484EEEC5CB31293FA4
-:1059F0005E13704EECB7E5DE66C043DA5C95F020CE
-:105A0000F9F2D5CFEE7A04E5700AF0C71A86F8FCF1
-:105A1000F7E7711FC2162A09FDC81952AE63FE448A
-:105A2000499C2E37051776D771F9CF6E586EC8FB93
-:105A300030EB95E472AD77B9B53987DB5D66BD6350
-:105A40005E0F5FB4DEA9AE7DA004BFAFAE9D17C1EF
-:105A500072633F6703CA5FB37C30EB896A939C8DA6
-:105A6000EB07954546E9E7AD51BBB89EB0D3FB7354
-:105A7000293CDF21E4E4E5EDA9E9DBB03C97C2F382
-:105A80001DC26814A29DFA465AA485F6E54D63919D
-:105A90004F42CCD7114638BDA9E44768EDCFDBA90A
-:105AA000D7A472BBFC4025C1AB4AC37C6D25AD9B1E
-:105AB0001601CBD6EC60512ECCA7C56F49C1F8C2F8
-:105AC00044B7F510BA5E5A27589883C5F115CF0B25
-:105AD000611E05BEA7770AEE3F4B9DF6C164A70E77
-:105AE000CB457EF936EC0F81EF0F1F5677B701A833
-:105AF000877DA33212D9E9B234C7918F7FE39581B4
-:105B0000B86EDF61C1B25C8A1FD7DF8BF1E1C63DA1
-:105B10002AC5976EBEEDD54BC8EE36C529D574673C
-:105B200009FA535A94541FCA1389C77D6E3BC99909
-:105B300096E369B49F68794B117537C94389F703B8
-:105B4000D0AE6034E62AB9496E4AFC035C13701E7D
-:105B5000920E952C7A787CF13F05D734C47772B8D1
-:105B6000FA7B487E209FA9713854B795E0EB64A971
-:105B70003E9C5F48F887D8EB69B4FF93746E14FCC1
-:105B800028E9BC4CD0B973EFD9EF5C05ED5BFD594A
-:105B90001475500730C243E7EB6EE21389070937EB
-:105BA000F0451DCE53C2BD7FEFA86341FC3E3D953D
-:105BB000E2F8D2EE9679073DE494D8BF2FCD55BADE
-:105BC000ED5EF45FFC3E7BC2D2DCDC04ED85BD0BF8
-:105BD000F86EC2712B3DEC93088BEFF392E537AC76
-:105BE00012FD77F773E1FC8655B989F21BFE717AD5
-:105BF000DE7531F46CB4BA362819717CCB7D332D47
-:105C000069ADE7FA37AF3F490F65EFBEBF621CDFF2
-:105C10002C176E579B9802E3ACBF9CAF4BB68A69BA
-:105C2000941F645A2F17923740FF6D085732B9D32B
-:105C300057FA3FD193FE4FF446FFEF65077E86EF9C
-:105C400071A8C232DA17EEC23ACA13FB201A8FF8D3
-:105C5000B62B93513E9BCC8F91F3917932514C5A94
-:105C6000CDD5E5E194F814D4137DE08FA87E7E5F56
-:105C7000007FFCA6773916A575BA54D07FA9CCCB86
-:105C8000D8DD7B5E461FE8F75A22FADDAEFABA820B
-:105C9000C57DA7DF3B3DE9F74EEFF40B9EC2F72D24
-:105CA00076F609D9EF15B55EE4970A8F7F16E6A15F
-:105CB0003CDB2CE44E31D00FDE3F9FA3925CFB1EF9
-:105CC000BB94E4F6972C169A6F27C8EB6D4A9FE0B9
-:105CD0008CE5D2FE2F6CCD827E6FBF8E517CCFAB18
-:105CE000352B58CFD7404F6B7D8757CDE37A5C0774
-:105CF000AF9A9740AFEBE4953D8FF3E74AE44FA7A7
-:105D0000E6B1F626AFB2F28C76421FF8312BEF8B5C
-:105D1000E5C70179BDCAAB8BE6B36138BF6472A237
-:105D2000AF79A0B04E596156CFF119F3515CAD3245
-:105D3000DDC9F5F62E45E8F1D220D5DD4E12160765
-:105D4000849E3FBD9BBF572724B62B7D7959C4CF76
-:105D50004B772E0F580DF924617AFE5DFF69CF1045
-:105D600015F3B45D044FF634EE8794F0CB3CED743C
-:105D7000014FF6000E77F6719ED72EF1952EF61B89
-:105D8000191556C33E42E2ED7635A0A01F3D33877C
-:105D9000619A04EC134628E8E7CAF41BDB4B7CE766
-:105DA000B24D7F5631E5ABCAF83E17F73323F1BD4C
-:105DB000EE7982FD2BD0A704F3C766E709FF839D28
-:105DC00079511F31B5A6573ED2ED4FEAF2FAE0679E
-:105DD00069C8B3887D8351EFED4C6109FD0C7F11DB
-:105DE000EB01EC15F237AB42CF4DEA28A67C9715B4
-:105DF0006E8DFC0FAAEA734E2DEEF97DA61F96B7A5
-:105E00000E1FD955A94CD3C19D1BC832D4F3ABFB8F
-:105E100019DA17040719DE17365C6A783FA0A9CC97
-:105E2000502F0A5D69685F0C88D5D7076FF8AAA163
-:105E3000FDD0D6AF19EAC3B67CDDD07E78A4CEF013
-:105E4000FEB21D8B0CEF2FDFB9C250BF62CF370DF2
-:105E5000ED5B841FD98C97FFCCE372BBC5CAE550BC
-:105E6000B3AB8CFC9B2D2EA37FF33E81FFCA8CF13C
-:105E700025E8576F79BBB404F17D20FD4AF2B327C2
-:105E8000E30BB35C4B264FCDCF9F14E37DFC9CDD31
-:105E9000827CBD6C3FACDB2BA0EE7A6D3DC2B47151
-:105EA000048FCFDA18CF1792F11AF97D77BCC6EAC2
-:105EB000E3FEDA7417BB3B015FDC97A725F4A74A22
-:105EC0003E4A8637C98F17C2DBD302BFFF2CDE5E86
-:105ED0005778BEAB5E1FEC4A30AF337916115F0EB8
-:105EE0001E15FA66742A59F21E5A8F17AB0FE43C3E
-:105EF000401FBC9997DB334FF7E3EA97E63FA86171
-:105F0000FBF9BCBDC557827449E64F3F23F0A6F3A9
-:105F1000A737707F7AAA016F6FC9F56EF2EBB5A44F
-:105F20007F4AFEF416BBAFA42FFEF4B7F218E1FFD0
-:105F300069A473AE8EBEC21F9F6C1F1562EC109ECB
-:105F400087602EABA6DF3725DB1F4B790EFBE312F4
-:105F50008CD3B6E2FE4B49A80753F2CB69FF4CFA4B
-:105F6000A015F4A083FC04EC9006F5DB275AD8DDDD
-:105F70005A1C6E69CF3B98CF695789AE19F83DFB23
-:105F8000365B99A27E21FBCC7EF917A1E7D985E388
-:105F90007D64A74D03F8D7E8F6D7123FE6F89EC414
-:105FA000CF341F8FDFAD03FD88F1BD7DB95C4FAFEE
-:105FB00083FD37E2D1931DF00E447B1E9E6F43722A
-:105FC000E48EA1F523F16A8EF3F555EE8CCFEF61E7
-:105FD000B78ECFEFC56E95F0AF10FBE7C9EA889D8D
-:105FE000E8C73C1DB313DE54C6F32E1B0FDA5884EA
-:105FF000E8C8F397251D6DB1F5EDA89F6DCC9CAF5A
-:10600000AC6520FCB683FC9C18CBE1EFC3CCD98CEB
-:10601000764F4685517F65FA8DFA2BBB2ACBA4CFEC
-:106020008CFA2BBFDAA8BF0A8246FD55D85066D23B
-:106030006746FD55149A60D26746FD3578C3D74C44
-:10604000FACCA8BF866D31EAAFE111A3FEBA6CC7E6
-:106050000A933E33EAAF2BF6AC31BC2F8DDE6D7860
-:106060003FEAE0F70CF5F2F61F18DA2F38F414E5E2
-:10607000F58C3DB6CDD06E5CC74F0CED00E1ED98D0
-:10608000FF3D9748C2D855A79E34BC9F2BECB5ABBB
-:10609000BB9E36F4C35A791E7718FE22BDDE6341DB
-:1060A0003B1A2956D6F54221D0755944F145A1D95C
-:1060B000C23DBBC6E03C3E7CE39A83D8CF822DC66E
-:1060C000FCEF851163BD910DCA40B9D0087C110168
-:1060D0003E598C79E13AF9B698358973817DE3B3FD
-:1060E0000587AE63944F1AF6B763DEBB8453F29B09
-:1060F0005FF09B9C9F847731D87F512D0EA71FFEA8
-:10610000F2FD66871DF976FE1E85FD40E9094FC345
-:10611000DECDEB0B13C06586C36C87FE47BED13F57
-:106120003E597551BCE0F451D5C7FD8DC675B8E236
-:10613000108F13AC7842217F9D191FD23E4D8617D8
-:1061400035CCF70D8D392C12D1AD3F4DE0C3E13583
-:10615000AEBFD3F80F9CCF0FD508E61BA568A96684
-:106160007E1B13653DF19C56625CA7663CBB7DFDC2
-:1061700012F295067F711EF3C5F943335F99F1BEA4
-:106180006CCF663BCAC38BC5FB6BF989E312A0EDEC
-:1061900046DB13E4D749BCC2BEBD03F548B2FDECF3
-:1061A00047F917BD9FFD28FF8BDDCF9EEB4DCF75C7
-:1061B000A2BF0DEC4BB39FCDAC8795BDFBFFAAA44E
-:1061C000935FBBC381EB2EE873F23C18939E2C299E
-:1061D00031E8C9EE7DEFDB0AED7B7F91E1B77B61B2
-:1061E0003EBFC9F03BBC00E72D197EA757076F0BD8
-:1061F000E085CEFD809EDA95C04E9CE495719700B7
-:10620000F94DD655F2F6E67623BCFC9CD1BEDC31C6
-:106210005EB23FDF2AF592FDE91ED3ABFDF95D11B9
-:1062200027BA07E39043E3F941F78A780D2C3B3F07
-:10623000D26D9D2DE0D5E70F67783369BCF4714FBF
-:10624000B6631E758BC7E251342C793EF75A97B569
-:106250006ABBF82EC7F01D3FCFA422BE01AF5697F0
-:10626000F5533DDF4EF232EA37199C93BC7C3F690F
-:1062700063C17BD11E92F161DBDB954E94772DCC0F
-:10628000EFE172D2E7D1E77FD8188F074F10F161A5
-:10629000F95CF5FC637958ED19C189DE047958770A
-:1062A00064F827E1F39035EC40BB33E44CBC2FFE9F
-:1062B000AA97AF139B80170C50E22B9A877AF1F1C3
-:1062C0001FB037AFC7716F57C39427D9E21E53125F
-:1062D00074F5DDCF15F4F6B08F82DE5EEC23B04F9F
-:1062E00067E179327F463F2B6D3BACBE12C4F706A7
-:1062F000FCF738F2D32EC0EF7BE4BD8A73B8B08FC1
-:10630000EB358F57F6B33FCBBFCCCBF30D9BB03FF4
-:10631000FF30CF5A55D74FFA05FA917E8E3EF8AD31
-:10632000BEED4DEC1F3D85FABDAF78DCE8EDE12F09
-:10633000DCE8EDC55F78EEF8B00C8C674B7F97B961
-:106340009D3C1729EB1B328DE3AF2FE3F5FBC5B85E
-:10635000AF887B3A7688BAD3745ED43995D13D1D27
-:10636000F29CA9EC6787D74DED9BB327ECC0F9AE43
-:106370002F56681FBA3E5331EC47EBBD953B900E4C
-:10638000DB44FF3B907F73296F94FC39E63CCC25BE
-:10639000A2FD12EF042AF15C2BCA31BBAA26C4E38A
-:1063A000135E3EFF5999BC5FE977AB7F4011FB2735
-:1063B000E3BD08B0CE5F4E03F97362938DCEBDCEC0
-:1063C000535DEB911F93DD73503B2240F94FFFEC7F
-:1063D000F931C4675A564FBDFABC37F1BD05C9E45F
-:1063E00088CE9F76D87B11794B1DA99C4FBBDC2EA4
-:1063F000F29B9BDBBD2BE8B349F83550AEA37EC9B9
-:10640000525953223DF3AEC0FB3F7EAE99DFE79178
-:10641000ED72D177E673CD1DF68E75F938DFAB15C9
-:106420001F9E5FC8AFF1ECCBCFC1738C1AF9F8D6C1
-:1064300017B3F40A7C5F6AA1F799B33CEB6D98F748
-:10644000AD31CCDC673618C70DE3A4171473B8C29E
-:10645000D7EDCB8776195A171B3482CE7B4FF1E2EA
-:10646000BAADE6F9F33DF02DE49B6B1DEC2F101F48
-:106470005AE23CF4F342BF80BCF93BF26BA5C6760E
-:10648000F373593C0F16D992F2157D3C5F3B0DF327
-:106490009D06737983EF95EC89D682DCF8FA520574
-:1064A000BECDE7B9D30BF8387D3DCF3DA326F17CB7
-:1064B000871770B88E67047270DC19E39BB93FECE4
-:1064C000B3F3E7D531681CF37502DF33F457A4E466
-:1064D00070399CA26924979947A13C57A7E66BC0E5
-:1064E0007A8AEB4A8F8A76B283C725D95C0BC3FBC5
-:1064F00055268A7EFCD54C79B784FB65B99CB5B22C
-:106500007725FFAB02396350CFF23F603F6D4A03FE
-:106510007826BA0E537C32654853259E6B787E0EE2
-:10652000EFE37B49CE0DC8F3EEDDE7FAD98F0E1B02
-:10653000CEF5AF7BE4F0C1AB75E7FAC38F1CF68FE5
-:10654000F8C7F3DBA73CF4C8E1B5AEFFB973FD5261
-:106550009E1D5383C7EE04FC5F0F4C152AC3D2CA9D
-:106560006A88DE5EC2DB2C81E7F0A78067671CCFFC
-:10657000D7EF3D44F83B668379C3F8B6091CD5B61E
-:106580006F66445A482E4668DC1B9CAD9371DFD978
-:1065900069EF1A89E3763EF3CA8030C893E3DF3AA5
-:1065A000E366C07F6F5ABBDCF8FCD4AA97DC780F97
-:1065B000C2F1552AD96B742E5A978FD420F8EA5716
-:1065C000058139C85773567F3E466F8FB3502EE909
-:1065D000DF85119552AFA4FC5BBC234D301DAF2F5E
-:1065E000DD996DA84BBDBCD491F89CFAA3059CEE37
-:1065F0000B1F6FB3176A387E70398E7F4AE4379C61
-:10660000DAEDA67D989C4FDDE3A576DC77BEB9D7A1
-:10661000C1A2E4076EB731F267F9A72A79788F1122
-:10662000FF639EE70BCFA6517FF31E50C9EF540BBB
-:10663000638500AFC1BD0BF93ED804C7BCE3DA14D3
-:106640009457F3362A2CACF1F6ABF0FE8CD05D14E7
-:106650008731C369D62F0B92DC9FB360EF3DF4FD09
-:106660005CE6BF07EDD979ADE6F7D7BC874CBEE055
-:1066700002F19CFB0B84DE19C3C69E1F4CF1A38C58
-:10668000CBB50BEB9D53ABF922FD60B593CA8F568A
-:106690007BA89C53C0F978F19E7D2F14D2326F1FD6
-:1066A000837AE9E583F5695FD7E276F798B65BF719
-:1066B0003F4C4D8DF9993502EF63455EE60271EE70
-:1066C000A1FC58EF799935888F913DE72BEDEC1AB5
-:1066D00093DF57DADD667C9C3E38310DF9E3970590
-:1066E000629F3B16F0A2FEF37849F6DD5295DF9BE0
-:1066F000667E2ED7D11CC1D773B7CF5CDF0FC66FB4
-:1067000079E6BD811DC4A7DC7F512EF055EE5ADF1E
-:106710008EF0973393DF30CC8E321D3F033FA9A814
-:1067200077CC7C2BF9891DE5DF3B855FA39B5FF769
-:10673000DE4BF8957C85271D2C68C3B1A8D7527114
-:10674000E17BAEE6B51AEB1FDB3A06A23C5960F2DC
-:10675000377CAC24DEBF1D2A1844F898ABF9A7603B
-:10676000FEC53C1658CFFDF3FC7E9C53D6D617EEE3
-:10677000C475BE9DAFB3A5BF7CE21728BF16FDEC64
-:106780008174945FEF5B5BF370BC258FAD4B4779F1
-:106790007FCA1A4EC7EFDF8FA809CF115FD24FEE25
-:1067A0009FFD2ECC535B46AC06FFCD0D4F47F9F94C
-:1067B00097C76C1EF4C336EE70441D808F65BB39DD
-:1067C0001EA1FE16AFDF45F86ADC635C978BFEFD09
-:1067D000813C8DFC01E14281BF4214E1CBB6DB2854
-:1067E000AF75D951D587C334B22E82CFFC3DCE23AD
-:1067F00006746BDCA9D6DA337ABE074BC88EEBADD4
-:106800007137A767E36E4EAF46931DDA20E4B69961
-:10681000FFF3FA097920F81EF0437E35996FCB22F9
-:106820005C7EB7FCF8C1916FC1FC3EDAFE9B7465DB
-:10683000449CFF196685023D4EEFAC9F63EFE5BEB9
-:106840009E8FC53AE9D60B420F697B6062F950DD35
-:10685000CBCB25B668FA558097256D365F181E2F6D
-:106860007942F5BBD08E7AD541F74F2C7EE2F9976D
-:10687000AF84F92DDE65CB99CAC170A1FC96F46A8C
-:10688000443E2F8BD367D153CFDB314F139FAFCA19
-:106890008AD369F1AE7D76CCFB34E373E2CE7D76AC
-:1068A000BEDE4CF4DAF9D614D4DB2D3F3E67477ECA
-:1068B00078FF5985E517F7FCBEA1EDF9749433888C
-:1068C00027D42F926EDD74EC41BFE8F4A747533B09
-:1068D0000FC6792E44C7BFE019845CE2F79F3E0DD6
-:1068E000F36878CDE1433C34FCF4D67484E73D6B27
-:1068F00013E7FB47D6E5A1DE6EB085F33C54F2E723
-:106900000D5BBF41FCB8E0C56FF0FB9C98BF00D7A2
-:1069100033C05B8070CEFBE1F504E77C16247E6C0F
-:106920007884DF6F78D6CAAA12ED07DAC4BA796F15
-:106930009B83360FEFD919BF2FE4F7AAB80F6B3935
-:10694000D92BDF10308384A6FA5927A7D7CA7EF245
-:106950009C3D976F8DA255E3F6BB48BE7D30C09F2E
-:106960008FEB1FF060F4CFBE38395FC845BAD785CA
-:10697000BE03FE9B88CFB17DBBCD9F32D2F09DC8B8
-:10698000BFE5E3AF14E3C3BC53D1CFF75E9E719F65
-:106990002BCBF66EB9C0DA999ECF92C981ED1B89D7
-:1069A000BF3E39CAE5CCB2C8CC2A7ADF6E8BE6E3AB
-:1069B000FBC8BE590AC909B04312ADF3ED36B1CEDA
-:1069C0008DEF619E56458FDF67F9F93DC92FF3EFD3
-:1069D00087F6BA751DE71F7BFC79717CBDCAFC8DFB
-:1069E00005267B4E966639F1B0494EC8EFD90F7334
-:1069F000139E8F88CB8730E16F892DF26F3FC07572
-:106A0000FDAA83CE452E79C246F7FB7CF8F8FE97A7
-:106A1000BF0EFCFFE14EB99E8DF2D7BC9E1B9EBC03
-:106A20009E255ACF1FE60458C2F50CCF13AEE71CC3
-:106A30007EDEE0FF96FC5D9044FEBED0AFA7DD7128
-:106A400015543FF8C9E222DA9F99F02BF16A96A714
-:106A500037A3B190DB539EC29FA34C874F8947C990
-:106A6000A78BFE63298DD3CDCF925F253F77F3AB04
-:106A7000196E233ECDEF37E2DEA93C4E7FDB1AD8FC
-:106A80009763BCF61995F2F33AB5AEF42C18779DDE
-:106A9000C8EFE9F4887A26AF77E5DAD7A33C91CF3F
-:106AA000BB5278BE4367A02B3D53B71F786BAF9A9C
-:106AB0008EE7013A2289F332286303FD2049F2363A
-:106AC000E4B9DFCE54EEEFEB4CE57EBEC9AA6B60B5
-:106AD00008F777AD3CBE34B7F9C674DCDF77EE1D3E
-:106AE0003CA31AF70387549E7314F65B0B00BFF5A3
-:106AF0001C74768A85BF3F1EEDF7BD8BA7623F737E
-:106B00003719F132DFB5DD8EFD9C65ABA89C7FBFE8
-:106B10002DCE27F0DF22CCD7423EFFA1E9F9DE6B74
-:106B200089AF1699F82A887C95E03C4966A158AF50
-:106B3000A5AC94EFB7457C4CC8BDC9EA8819D59877
-:106B40004F79909FF738BD5765EB11DEC745BC2CD8
-:106B50009C4BFCBA0CF85BEF37FD08F96E58723DA0
-:106B6000FFD1CF8F8FB9139A2CF9C51F473E0CE583
-:106B700047BF78F592FFC2FA2F5F19F847D6B3FDE9
-:106B8000C467FF7A0BE5753EEBA07B4D3B9FFDD5BF
-:106B9000C03BB1FEB483EE17ED5CC3F7D9E167DD0E
-:106BA000A4FF3B07707BB1E59973233B487FF17BE2
-:106BB00083C717F27B2A4EEFFDDB1B0AE6F3ED05D8
-:106BC000A8503E8AFD5BE3D329B44FEF7CE69C617D
-:106BD0007FFACFC2B34C9CBBEA74B36A3C27DD9901
-:106BE000C9CFA936FED7B81FE1B9CBA5BBF7D9EB02
-:106BF000E1FDC4FFF3F94894439D4F72BB03ECE100
-:106C0000ADCCC7D8570A37DF6B03FA7D8C3622AC80
-:106C1000998EC217A7E179929E78E178E8043C202A
-:106C20005C809706949FC9F0714B213F07F3AF87B3
-:106C30008F3FDF82E32FD93B96EE198EE345F1F3C8
-:106C4000E76ECAF700F8F9F367CF8D443BEA42F0EC
-:106C5000AEFA5F06EF0FFEC5F97D5021D74766BE3D
-:106C6000EFC9D7BFBC8DEA3F75FB68BE7D5CEF4FB7
-:106C7000FF2FA3F7B1FF6FE97D48D0DBEDC1B84C22
-:106C8000E7339F0F641701F7B97F593AF70E77B7CB
-:106C9000DD63F13947C3FC5E6391EB2B95E4F9A307
-:106CA00043FA2B721F44FB0C790FF7F49CF96447ED
-:106CB0004CF7737F4C0B2B3B88E7ECC27E95E217B9
-:106CC00094BC0378689F551AA13C316B78E8F73182
-:106CD0006FEC86A53E7E5F9971FF353DAFAA0AED48
-:106CE000B923CD302F6877C46DF1B4000833FC2A86
-:106CF000D97F5092DDF78709D7521ECA8C0AE33E2E
-:106D0000E4EBA6FDC48DD5C6F737B06DB998EF7723
-:106D100043838DF293AE37B5B7F4F7105E6E644DD2
-:106D2000EBB83FE7E2F034AB3FDF8FF5C443EF78D9
-:106D3000EB8127B1DFA4DC21AD27DE1C41BEFF744F
-:106D4000C00B616F89BCBC157DC22713FB5287182D
-:106D50005AE2D7E1E7F78EEAFA25BC48BC5F2CBEC1
-:106D6000259DCC7897F8957833D361189EF7CC8D14
-:106D7000E33F5E1AEFD566C26E9CDE6D37BA088FB0
-:106D8000BFDBCECF4BFCAEA27E5329D61FE7F7C1A7
-:106D90009F1D3F8A3901DE2336B687E2427EBFE679
-:106DA0001913CF9F512A7E45F109CC5FD4EF57319B
-:106DB0007F510F17E62FEAEB98BFA86F8FF98BFA78
-:106DC000F798BFA87F8FF98BFA3AE62FEADB63FECC
-:106DD000A2BE8EF98BFAF698BFA8AF63FEA2BE3DA5
-:106DE000E62FEADF63FEA2FE3DE62FEAEB98BFA89E
-:106DF0006F8FF98BFAF798BFA87F8FF98BFA3AE675
-:106E00002FEADB63DEA2FE3DE62DEADF639EA2BE33
-:106E10008EF989FAF65F8E3D67A857B2DF18DA4F10
-:106E200074BE64A84FF6FCD1D0FE2BDE1386F7D7D4
-:106E3000681F1ADE4BFA5F5B72C6F01C631FE131FC
-:106E4000B88FE17FA6F9FE66E8C7CA021427B5B37A
-:106E5000262A9DE8EF853295EDA4D205CB1CCBF711
-:106E600087057FDA1FF9756B783D32D79171E70698
-:106E7000A2FCFFDDF8EBB85F42C41766E03F356067
-:106E8000E2B4CFFAE33E57C64FD3632A8B8E023E5D
-:106E90008C29547A62692C9A0D7C184BA1322B965E
-:106EA0004DCFB3639954E6C40AE9796EAC80CABC8D
-:106EB000D8602AF363C5547A63975159101B4E6505
-:106EC000BFD828FAAE30564A65FFD855F47C406CDE
-:106ED0001C95036313E97951AC924A2D762D95C523
-:106EE000B16BA81C14BB8EDA0D8ECDA472486C3623
-:106EF0003D1F1ABB89CA4B62F5540E8BD5525912ED
-:106F00005B4CE5F0D8422A2F8DDD4ADF5D165B4EE3
-:106F1000E588D89DF4FCF2D81D548E8CB550794587
-:106F2000AC994A5FEC1E6A571ADB486559EC3E7A09
-:106F30003E2AB699CAD1B187E97979EC212AC7C42A
-:106F40007E44E5D8581B9515B1FFA0725CECC75480
-:106F50005E197B8ABEBB2AB68BCAF1B1FFA2E75786
-:106F6000C7FE93CA2FC5F6D3F32FC7F651E98FFD9D
-:106F7000869E57C60E513921F6123D9F187B91CA45
-:106F800049B13FD2F3C9B157A99C123B41E55762C1
-:106F90006F515915FB90CA6B62EF53F9D5D819FAA6
-:106FA000EEDAD89FA99C1AFB1B3D9F16FB2B95DDA3
-:106FB000FBFFF1497F57C0721EF7CFAEAC3EDD57E5
-:106FC000B6392D9DE4E2F4555C2E3E98F6F101921F
-:106FD00093E31C9A8384DF1643BC8B7E4402F67DC8
-:106FE000FBC6BDD71FED9DF595275EBF15F5D97280
-:106FF0000713FACC24773F73097F27C37CC49B0512
-:107000005FFFAE627F2EDA51EBCB3A96A0DFE4DE73
-:10701000E28E1A2C0B07703D9925CA8201C2CF5A05
-:10702000C2F56FCDF2A1FCF70572FA065FB5D0DBB1
-:10703000B2BD5224EAAEAE81745EAF8FFDF4B5DD11
-:1070400085F2B03EEF1FBC62406E6FE707FBDC4F7E
-:10705000C517D44FE580047961E67EDE14746F1B9A
-:1070600010988CED99D53F12DF4F5853A0E2EFAA4C
-:10707000D46E523CC82FF56B4BA7205DCB989FFC7C
-:10708000923727C9275B2CE85AD76463E89FACD3B3
-:1070900018F987EB76F33C64F4A74E037E6910FC85
-:1070A000B274E39FC9EFD4D0B480E73D45B87F4ABE
-:1070B000FE8ECDE2D6B617D0AD77961DA6FCF8C5EC
-:1070C0003B8CFEAB46E19F5ABAD3F4BCE92B09FDD9
-:1070D0009E66BFD4DC01C2DFE9E3794F4CED4F700F
-:1070E0009F05B8319F24789BDB897A03F0417118A2
-:1070F0008907E9F794F8603DCF5D50FEEAE98343E4
-:10710000294FEEB4A6E563BB603AFF3D2BC51A1CC0
-:107110008BCF018F94CFD2D59C46F9506F811ED072
-:1071200030F1CA131C8BF7C775BC368089FB2B8DD9
-:10713000F108E726CA13AF8539605E4AED63D9745A
-:107140006E13FA1BB907FD9A8FD9281F29CC5678E0
-:107150005945CF7845609D8DF8A26E4F26CF4F0BD5
-:10716000FB8FE2B9024997B7D60E9E82794D751B07
-:107170008A4BC95DB7C746F6A18CCB4A7AF5CCDFFE
-:10718000E6F9028D2CB21E5397805E2713D2AB75A1
-:107190001FD115E8763209DD4EF646B7874D7443A8
-:1071A0003FF58DF8725536ADE79A35D1A14D3AFECF
-:1071B00034FBFFD9DC2BE9DE1399FF5CD54FFECE03
-:1071C000982F0FE97B665339D1CD4CAFAABFD713A7
-:1071D0005DD86B6EBA77F8E6C16CCED7E0F91CE1EA
-:1071E000F7BCB9E51AB2BF770B39F7BBD598FBC925
-:1071F000D88BAB9DCC0FC6F74BAB3D54FFC36A2F6A
-:10720000D55F59AD51F9EAEA122A4FDA795E915CFD
-:107210005FC00894DFF7B458574F0F90FBB2955EEC
-:10722000F47357FDFDA5720B89BE37A64F1E40763D
-:10723000BB215FA47A96311FA4C326F2CD362A3E25
-:10724000BC4FA62E7095A13D2B1915AFA3FE11F9C9
-:107250002B751B32E91EBB9BA6661BDADFB0A1D0E3
-:1072600050FFFD008DE09E5935D8F0FCEB359719A5
-:10727000EAB5E2F723985641EB46C6BF407373BAAE
-:107280007878DB4F9AC6E6DF0EE37F72D846EFCD03
-:10729000F438690FD37E3EBCCDE1C3F8DE293CFF54
-:1072A00006F5537F5029BFE8948D853D20E24F2994
-:1072B0006C2D96CCCAD7D5D9637C5D55FD5D65B87C
-:1072C0008F673F71507CB07E8BC2C27837431760A6
-:1072D0001EC65DF96307C13D778BCA8274BE4ADB67
-:1072E0008971F2958F0DF3617CF4E6C1D10178DEEE
-:1072F000B0EBE7293E3CF755DFC1BF3F05FBF34C40
-:10730000CC8F52CA281EF1A769ADF32D986FA71E26
-:10731000CEC5F5FAA727F9EF9A2D5CFE87311EC07E
-:10732000F3A21776BE5C01E39C6C5569DC0F7738DD
-:10733000DA545AF7FE7CBCDF360E7784FC14D7F69D
-:107340000BFC0DE5F507F3232349FEACE2FEF19EAD
-:10735000F8017891DEC8AF3A7916D76F3CFE064245
-:10736000A800E544BDCD4771D9939B6C142F047DD3
-:1073700040F906275BB32D5C0E3D497C5767D5EC81
-:10738000FA71EB36A97EFEFB189A1DE7CB36AB41AE
-:107390003616EB3C3F22BC4109F2F88F91BEB72E66
-:1073A0001F4BE7A2CD795CB2FC18D6545017575A40
-:1073B000F40C8FFFB2D11D567D9EBBF4CFB060851B
-:1073C000E13EA325831EFCCE78284FFBF9D58B67C1
-:1073D000B7BB494E7E64796ECCED507E382DFCAE45
-:1073E00015E8F2A21A1C3610F3862C9BB62A145705
-:1073F00039F11D8CFB7FF084CD47CB50E48D2DFA05
-:10740000C9428A4F25B7179897C7AFA3798A176FD4
-:107410002766942F329BED14FE8508CF33C04900B8
-:107420007E3C4B785CEC44B9FB6E3C3F5C6F3A6F42
-:107430007C429CB3B872A062D0D7770CE472A0DE15
-:10744000C2D7277B96DF43297F2F4ECA71296FA5AC
-:10745000BCFEEA409EC722E52C633B49BECC17F731
-:10746000252FD9E1E0E78B34E6413C2EE4646277D6
-:107470000DE4EB7A91FD89EF235B2F60EDA4F73EDD
-:10748000B045E6B717E3F76D6BB3E87B9B2F82EB54
-:1074900038227F8FCE4A726401E3F35CDAAA44A2F9
-:1074A0003A7F87FC7D12867A4227777AE805933EF9
-:1074B0009827F4DF3C66CA376A35EAA9409A9BE010
-:1074C0005AD42AF2B0BBE7A5B2F318EF0A465E9889
-:1074D0004EF3567C9104F358C0BAA2782FF2D2C76B
-:1074E000F93926F3BCCC70F4759EF37D3327E1FDAA
-:1074F000CADDE39AE62DF1CDF060958E0E12EFF322
-:10750000C31C9FF3F72A44AF7784BD25CF079AE9C0
-:10751000BF8005A6A39C5B703FEC338BE3FC20F996
-:1075200060E1AE089D07FC90B5A6BB603D2CD9B2CA
-:10753000EB8671F0FD821FBE68477EAFC98A0EB52B
-:1075400064C2FE333CE9BB555727D0FB263DFF45BF
-:10755000E18909BF157D077899B75DA53C0A5D3BB8
-:10756000914710267C3584F9EF09361C557D2DF0A6
-:10757000B4017FE6A8ECE2E72BF1F63F3D6FB35D87
-:10758000F38B81BDDB356679D3C3AE31E9533CCF94
-:1075900081FAB32B97E7A77F62F56764919C36C9A0
-:1075A000E1DC32BA8F55CAE1F9420FCA71E6A1FE99
-:1075B00083FABB5B9E4A477FC63BF73F9547F91A64
-:1075C000A86F46C4F5CD6DF57CBCDB7E9942F952BF
-:1075D0007F9AD63E12EDC19A477E95AEBFEFF54F2A
-:1075E00005C1A30371BE423F2E55DB06E2EF1A4AE6
-:1075F000397BC17D5B3238DD1780D36D84B30EE1FA
-:10760000D49D53A91770BEBD81C377621387776E6F
-:107610000F38C31457B9ED470E5F98EC8E28E9F583
-:1076200053BB5486FBAC6EBBC364079C65AD5B115A
-:107630001F4B57BCF28615F862E125801FE0839A44
-:10764000CD0ED2FB0B7FCEE3A91F2895F914D03FB6
-:10765000104DBF039E2F027B01ED8DF83CBAED80EB
-:10766000CF108FDD76401FF1B74CF8B596EDFD15C4
-:10767000FD8E96E2E7F998CBE4BD367B4CF7DA68ED
-:107680002803F8397F27D2A9BFF93E2EEE9FFDCB04
-:10769000D03FDFB282F8BFEB12FD39B6C6D4A80DD9
-:1076A000F390BB762964272D5D59995EC9F07C1B48
-:1076B000F7AB151471FDA6F8FD945FE300BAA6C2FE
-:1076C00078FD8B34FE5CF3F07CF31F32BA4747CE73
-:1076D000D7FC1CFDED4ED4872E0BE94333FCD716A7
-:1076E00071BDB954B5907DBDC4CEEDEC4E717FC572
-:1076F00070318FE145FC9CC315C2AFD0897625C699
-:10770000BBAF76D0EF18313689FCEE56C6F9CF2ADA
-:10771000F1E6B17EDCBDBEC97EEEEA8F78BA85B5F2
-:10772000D3EF224EAF98A9E1798637F29C744F14BB
-:10773000FC09603FB3453F476CFCFCC21B3806C0E8
-:10774000355BF8A7DFC0EB5161FC370AEC64D786E4
-:107750009F7190DD70572AF71FB29C0C2BAE87AF3C
-:107760000B3975F378871FE5FAECF17705B084FEE5
-:10777000C20CF055E3EC5A570AE3345BB8BE6FCE47
-:1077800062DC2FB0B6A31CF1770598C998BF0FD063
-:10779000EF3E9FDD1B1F19CF4F2C413FC3958C330C
-:1077A0005805E1D7505F62E7EF6B1FDD31E3FEF173
-:1077B000B04FC0AC29D4338823E48BDA0CDAFFCE87
-:1077C000C0F30559585A89DFBE6665610B2F37B87B
-:1077D000E85E25AFE17761AFAF60D10C802F7AC84A
-:1077E00078BEE3C6A8253A0CE345D6E83EC49FC55B
-:1077F000A9D93C304EA04A2943BC2F59D3B7F9AE82
-:107800007CF4A919F7F7873ADEE785F3BC43A17C3E
-:10781000A1D9B0E8914F6FB1B2036A19A71FF26105
-:10782000639616A676CB399FCB7325922EA5D0BD35
-:107830001EBFB3C5FCA09F0DE9F8BD3DB15F252C6F
-:10784000F852DA6B8BC5BA5D2CF9EE71E37ADD265E
-:10785000D70DDA8780B7D9A24CC6F78F8A75F16841
-:1078600011DF67DE5324F7997D1B6FA9834509EE6D
-:10787000671C444739EE0C513E523488FA93F3901A
-:10788000FC3B9F35513ECF7CE1A7B18024A1FCE0B9
-:10789000D61F71BF9029EF080C25CA6F5BB4DDFCC1
-:1078A0005CE7E7510D7289FCA68ABD6B2ECE4FF9BD
-:1078B000528A0FF97DB67D27F907CCED6CF8FBA94C
-:1078C0001877DB00769522E26550776C52E8772FC7
-:1078D00066F7EFBA1CF53948EB29742E54D8DBF360
-:1078E000057D1DE27EABF9685F615C0DED2BC4D7B1
-:1078F000166E575A853D5CB7C9686FCC5EABB33B1B
-:107900007961B81FC061CA53B709BBE34D7BD7E5A6
-:1079100028F7CDF705BC69E17084F318BF573387AA
-:10792000BFB70AFB52F2D5CF8A6C86789B3C775A58
-:1079300083F28ADFDB60CAD372D1FD31350ABFBF63
-:1079400053FA215F17E569B043E9BE9CE369140768
-:1079500037FB273B2BDD618BCE4F7973C66DD3117F
-:107960003F35E9762B96AF77DF2BD641E31FF70C37
-:1079700022FB677DE5A82D989FF4DEA36766380794
-:107980005034459C9F8AFD0EF3E9677D06F050FD5B
-:10799000AF33FCB08FEA7CBEEB162788EECF8B3E70
-:1079A0009D61053DDFF940D756AC67686A80EAF70C
-:1079B000760DC43B9733220E5E6F96FD3902D85F79
-:1079C000E743BCFED1A38E4018ED5F716EA9E64A75
-:1079D00085E4AF0BD75779DCCF5463798E9713F8D2
-:1079E000EFA25CA89D570BB88ACAF13ED493F4FB72
-:1079F0000B8307F95D45807FCFC0E0392C17CD544C
-:107A0000C2763CEF7F347289D06B097F27C425D6BC
-:107A10006B617180BE977E74E88769E53DFBF96F05
-:107A20008E8B3EA000800000000000001F8B08002D
-:107A300000000000000BE57D0978545596F07DF5B7
-:107A40006A4B52498A244042162A090901031490BC
-:107A50004080A04512202C810A28A2A0168B10106D
-:107A60004840EDA65B7AAAC226E216D4B1691B9DF6
-:107A700012D1C66EB5A3B204D92A6C823A5228DA62
-:107A8000A8A041504163774418E30CB6FF39E7DE04
-:107A900097AAFBA8B0F4F4CC37DFF7878FEFE6BCEA
-:107AA0007BDF5DCE7ECEBDF7651C63AE7A1B633F88
-:107AB000E3CF0DA1D2D6D5C05821632F3ADCB6AEA4
-:107AC000504E5D9813EFC967CC9EE18972003CB7B8
-:107AD00052F199FB30C68EFA73DDB18C8DBB423FFB
-:107AE000BFC8BCA49F847FA49F8F74FDDCAEC0BBC5
-:107AF00083E03F733AF0FD3BB25DBD1D1D19BBEB4A
-:107B00005F9807FB6165430C6C0063775B19FD7C34
-:107B10005FB335D75A00E54B96449609ED5ED9968A
-:107B2000310BFA618BE1A514C6BE69FCC8EC807EFE
-:107B300016B4AACC95C85875AB42E5824D8DE611B6
-:107B4000D0AE1ACAD2B0F9CD13F365ACC93821361C
-:107B5000F4BCBF83CF97B1358CE17C5E396BF440C8
-:107B6000BBBB0CF55F3E95048F072BCEE71D97AE90
-:107B70003355BCF72963E5F5F997D60F722854FF02
-:107B8000588EAB08D7D905FA405835F0F5EADB2F07
-:107B900015FD4D8D6677B8A17EC68058AB03F05DAC
-:107BA00078D4B32C16E6316B5D663F15FAE89F5129
-:107BB0005282FDB19983257C9577612C88EB33B691
-:107BC0007462507EBFA3309EC1BCA62604EF617DC7
-:107BD00019FB8DBF7B9D752863637E0B6DBAD02B1F
-:107BE0002E06EF965B04ECBBDE5D560CF0DF558293
-:107BF0003D8EA23A1FBC7F10E703E56D037B45B3C2
-:107C0000DE80BDCC18833D9EB192F469BF41BEB801
-:107C10006DE0D011F87C982536771AE197117F94A2
-:107C2000A4BB27633DB667B00E8F39D0F166588785
-:107C3000E72DD5E98375787AC778FC11F03649E0ED
-:107C4000E1370E3B95070D30CF7EA17968E30367DE
-:107C5000DE1384FE4E2F4DE9BB1AFA7B367DD81217
-:107C6000C28B18FFD974CF9CF0F161B9BDF1F9D581
-:107C7000CE639698C71241377731F099C0F5CFF0AF
-:107C80007F42598C04DF383691B9F242F0A41B537D
-:107C90002578F2D46CA9FDAD33AF93EA2B2CC182C9
-:107CA0001A5B88BFF5F3D14A2014F16975ECC63828
-:107CB00006533CB1E3C28753404EFEB641752A30AD
-:107CC000D7393B9FFF7008B43A070B4E04BC9D7335
-:107CD0000100EB3DB749F5FB32913F5CC68A4E8C03
-:107CE000556157D07EFEA1D7CDC3E0D7AA9AD963FC
-:107CF000918E73FCA6CF9BC2E679815D34B32C9044
-:107D0000878DF2F36AF6D0776A6F840266772FE880
-:107D1000A75E575F33F22B1687ED8C9F3769EB8494
-:107D2000F1171FCF7C645FD8BA9F76C4267D791D7A
-:107D3000FCD28FF5FB59C5F19A0FC00A596943234C
-:107D4000D169D921D5892CBA2C5D610AAC73E4269E
-:107D50008B3F0A44EBDB6D27CD0EC0D70F5EC723E8
-:107D6000FB4C28FFB58C25E27B27CD4DF07CA8C3CA
-:107D700041785AB0E33B3303BA8FDCB190E47A0424
-:107D8000E8B178E09F6023EBB509FAF765C63A9F42
-:107D900087FEEF5A350A848BB1F8D62954CEAB1B37
-:107DA00045FDCD6F9D48F082D618820F46074730BB
-:107DB00098C7C12D1DD83298C7613590FB7BECC7A1
-:107DC000124B7AA222F5B6A5B8EE83D1BEFCBB61F8
-:107DD000BC8A3F8F2C47BC2ED8A4B890CF2A5476AB
-:107DE0005049C0F946517F15EA7B050BE1F998D25D
-:107DF000589F219EEA19837A7540EC6A06B06A069C
-:107E00007D11813F0F09FD626AE2F31EDE5A49FDD2
-:107E100069F5871D59B47E0D3675DC609C6E0BAD1F
-:107E2000C7D4A45039BAF53A2AAB37551A1D30CE0B
-:107E30005B79CF25219EA0BDCD13512F0F8C6711EB
-:107E4000F497565A843E9E82FA18FA3D90E5FA025B
-:107E5000E572DC9226A315F5A9CD6A7F1EF8605C59
-:107E6000515FC7ACB075A97B6E610EE0234B528B9E
-:107E7000C905FD4F81325C7FDFD18EBDF9A64D7FF4
-:107E8000D752A9D925E65CC218F0F9ED763E6F4DC0
-:107E9000AE8E89F6DAFB4185CB876FB3C5FF3CFC1C
-:107EA000FE5996E7279C6F70189BFC1AE9D3604631
-:107EB00065EC3F6FFE405F2BD23FCED8C412E07D11
-:107EC00043A6367F2ED7579A7F8B98FF61952D4614
-:107ED000BE387CC30D4117CCABF1BEFEFDD13E6870
-:107EE000E325669AA93F666FB988FC5ABD2BC6B1D7
-:107EF0001AD65701B441B865A7C5BF3E939E332536
-:107F0000094BCB7A05EAABE35A72D1FE94EE8E0AA6
-:107F100020DF36EE8E32A21D7933C79398D9119F98
-:107F2000772F5380BF5D3B2C46E48364872B29B3B6
-:107F3000B0FDF95E498F69F2A8E733CF2A2E7F1E84
-:107F40002187D304DF4E177238CDE88CFF25CCFB98
-:107F50008E7754867A7CFA12A5D7A602D469B1CE60
-:107F60009C3039D4E4CD847CD91FF993F3E5BCD699
-:107F70000E42BE3345BF5C0E2AC040237E2AAEEBC4
-:107F8000E047F95ED09A48ED3479D5E4343DDB53CF
-:107F90008AEBAE5806F20DE37896A614A0BC84F8DE
-:107FA000C46C477E023E499E15C607CB1A7F342219
-:107FB0009F988A15E2130B94A5617CE46EF353EC51
-:107FC000233AC13CC62DCF34AC66A1FA72E4978E39
-:107FD00057CFEF85A2FD745B20C700FD996AA29C74
-:107FE0004B615EE7921CA4C7163D0000A06091C9DA
-:107FF0005D8A7EC6A2DF294ED4BFE87FA0FE19703D
-:10800000ACC6EC099BDF2DADBD9903F034B1B51BB7
-:1080100095FD333C93100FD35A27093CF6A69239AD
-:108020008A0C389F7BACDCCE9CAFB9FF761CEFBCD2
-:10803000DFE2C4F1182BE2F416F32D74393BFF1282
-:10804000E7F78E893D0BEDCF44795494CB33E9CCDF
-:10805000FE384C71C65AA033F47BC6C47C76A0E7C8
-:108060004C803D087760AE0EFD50EE609D6176E578
-:1080700082B12E8365037D17FDE55323A8C239B96C
-:10808000C1DE011877EA306EFF9B3798C8FECF6BD0
-:108090007C6F8001EABFCE747566A07BC774F1D493
-:1080A000E07AE64EF0BF6202F8AE875F8F1BE4080D
-:1080B000E1B3DE18C831C2FBF580471FCCABFE210F
-:1080C000B5DCCFFD9E98CA5E57E6EBB9ADD9841FEB
-:1080D000CDDE68FA7BAB37191611D2E357B2431ADB
-:1080E0007FCF1772301FE58085DB9B4AF730E4C3F2
-:1080F0003CC599C3C2ED0D97074D4F03BF93DC54A8
-:1081000064A73B97B190DED6DBA3BD6AFDE3836134
-:10811000BDCBB33CEB510F94FCE9BF5EFF18AAE660
-:10812000BDF66219D269D8750A5395ABD1933F9ABF
-:10813000484F2EA964A427A10CD793A676FCF43F40
-:10814000645E9B9EFF57C1F7E0DF92DF887A3CBCFC
-:10815000BFCFB24AB6219D77652A5CEFFE93E6ADAC
-:10816000D7EFBBDAE4F5EAF4FB4BA2FD95F4FB1183
-:10817000D4EF8597EA7306FDA13EFFDBCE1E7ED4C9
-:10818000F79F32D0FF68DF76C4389E17FA9EEC4125
-:1081900074BCFF72FAFEB19C1947103F11F4FD7BCD
-:1081A000FF0C7DAFF1975E1EF472A0E7FB310F82EA
-:1081B000FF8574DAAA30D4AF217F8B111F1FCCE268
-:1081C0007CACC94D98FF45761EE4C19F9379A95CAC
-:1081D0007E5FF3970207C69B05B17D9912E2774D4A
-:1081E0005E347ED7DB9139591E35AB302427F35EE0
-:1081F000D3DB81F6F8699B09E357D3BCEFB81D8048
-:1082000032DC0EB4E7EF58B3AE4D0EFEE32AF92987
-:1082100035EB7F9C9F52B322F3535A56C77F9C9FE6
-:108220002E4347B2331A9F8D799BF307CBE6FE3E70
-:10823000F00BCDFBA039DDBF2C13F51ED787637E75
-:10824000663588CF3B443E41E3D711D91E17CE5344
-:10825000A333FAF7E8B75FAD5F3825A986B9E0F92F
-:108260001D5086EB0D0BD22F827F3FFC1AE9DC3FBD
-:10827000EBEAE83C49D0F99FE8174ECB8AE0173289
-:1082800017B7FF21BA582622DF7C1F303294AFF691
-:10829000E86A5ACBF1AEC12B0246CDBE26A27D05BF
-:1082A0007E99FEDFE1978AD2FAF35670FD7CEB8B64
-:1082B0002B8D83001F454CE43F86AE717543FD0254
-:1082C000BF0FA61E293F725815B0EFFA2365308FF5
-:1082D000318FB7D5FBB07E78717C5B3E054309AD2D
-:1082E000BD77FD90230FD1BCEB38BE3D4D4677AF37
-:1082F00030B800E0D830B84807AFE3EDD18ED8A948
-:108300001F3F974FE85FE987B0D69F9003D632A210
-:1083100003FA8B9B143BE6436E2DFE9B19E95351E8
-:10832000DA742015D6FBF8FAE195B61EF01CF5209C
-:10833000CCF7B9F5156B7C46F17E27CA8FD18FA596
-:108340005E71A940A779458A3F2BF3523C3E9725A1
-:10835000DB33FC31CAEF3373C1B5BD8FF24BEF672E
-:10836000D1FB01CB358C7F733173F923E8C957B545
-:10837000761701D6FA07DC4DACE771B8BEFD3621A1
-:108380006F4183613E037C35AE9FB606F365C3192A
-:10839000E78FBDEB3D95980F2342EBD67BB9F9FEF5
-:1083A000214B8EEFF0C721BF1FB81CBE5EBEE47D1F
-:1083B000C11F5532BFC41BDDFBBE8779C427297698
-:1083C000F46B17B8A31E42FFBDA254E3EFBB2A5DB6
-:1083D000C5B0BE2826E5FF42FC3DAF12F97B01D3B4
-:1083E000DA2F588376C96D686BCFF97D87D2F67E18
-:1083F0001EF00FA5E2E0FD13EBE7AFF1D9881E54A4
-:108400004F70B7CBF07BBD0E2ED6C987E06F924F71
-:10841000D4DB809F9C087AE33F059DBF55D864D488
-:108420007BC112EEEF05B378D9259BFB77866CDE16
-:108430002E3A5BD0393A0C0F69213AC34F00E388DA
-:10844000B075139E6E49D2D6FD70E55858573081ED
-:10845000F552804F92B21F58B33C8C4F3A653F5C47
-:10846000897808F5F7E011D4FBB7083C75C97EE8B8
-:10847000888FEB3305E56E3E3104F0C126C5A7C2F7
-:108480003AE7231F4458E7E94BE5C6A77BDF65BA07
-:10849000CCFB5F5FCA872EDDFBCC94742DEF0B3ACB
-:1084A0008DD5D1B15C47C7321D3C5583FD923ED37B
-:1084B000F4DCF486352B3A2561BE51413381FADA7A
-:1084C000ACF465ACCF734F56DA0621BF3A4CA9A085
-:1084D000F3FB3FB7F6881578B912F519F1EFEFD62F
-:1084E000B8801F27A2BC13FC54A5AB0FF24FCD8A56
-:1084F00064683FE8B9DFAFB142D35B97AF31A14FBA
-:1085000033F4B9A7D718817EB714FCF900F667AC2D
-:10851000FDB72363332FC3AF75BA75ACD3C13E5DCE
-:10852000FB27AEA0DF97EBDE5FA2AB7F4807AFD59E
-:10853000C1ABE4F7A7CD54484EA601FD1071579288
-:108540009B89D96D79A4367BA6D8C84F92F87ECC8A
-:10855000320EDFF6DCCB95ABF2C3E0EC3F5786F38F
-:10856000B189F19F2949CC87F6C3D48E3E1B93DD98
-:108570000E1FE5E9ED1DAFFF0C7F4DA17D16C92E45
-:10858000EF5565B851D5E6BDF3C83D367CA8C13B73
-:108590002AD11F6F77DF83BD5189FB1E631E15B083
-:1085A0006F5B25EA3D6D9D5AFB113FFDACE278778C
-:1085B000676FABDC80FB2A25811CCCD74F4DE025B3
-:1085C000D81915ED58B5C8778CD8A9BAD1CE4C8D2D
-:1085D0000EE42CCA0F5B27ABCFC57536DEA7127D24
-:1085E0007CCB783C329D39CD98AF688C8F5FFC0294
-:1085F000B4DF7B9FBA18EDDAA78B133BE1FCF7657C
-:1086000073BF6D6F7CD74E7702DC18738719F3B593
-:108610008DF70FA7728FEA5AD9027CBCE6B9836442
-:10862000E71B63E2093F0F67EFABAC05B9A8CB7658
-:10863000D0FB9E047BA706F457579B18E6ABC1916D
-:108640007A86F8E6614BDFD5308F69B5D7D1FED198
-:10865000F47FAD1C9102EDA6AF30D1BE02FCF4C692
-:10866000797B560F3763FDCCE5A2F48DA472F7DF5A
-:108670005F7FBB37B46F794075AE87C6BB5AB3E234
-:10868000A6C3BC4E45713DFC7973B7389C678F6EAD
-:108690009E75D9C8AF71B1D10A1A0FBB236E02F40F
-:1086A0009B9BE37A3ABB63A8FDEEBFABB40FB6BDAC
-:1086B000797A27CC3FFD41E8EF5DADD33B4D0FB359
-:1086C000F7B3BE35129E779B1DF7A07FB93B3A5D8D
-:1086D000C1BC0CE03911F3B633857F0DFCB2F8F55F
-:1086E0000876FF896C95F072DAB2989D02266E7C4E
-:1086F000B06331CE537B4FDB7F33A539FA85FBD195
-:108700001BBA96BC8EEB08F1D96747906FC88F06ED
-:1087100078D7739FACF1A12DDC0BFE3FCE23C9357A
-:1087200002EBD99244BE0F9A5C9F1B9E8F08F9A959
-:108730004B853EE0ED4EF862296E3DF152941FE309
-:108740009913BE4F62C3F3EF9A9CCC8E8BF5A13187
-:10875000FE2A36D68878FDD4E8FDF257B86FF8B413
-:1087600089F4E8ACA73B2E69417D00F4C47C907E7F
-:10877000DCE46E261AB7FDFDC1E6CAB2B430396139
-:10878000CD95AEFCF6E5E4D873DF546EB0B52F2777
-:10879000B385DF3EE269931BF97C7661AC11F7E9A2
-:1087A0004A9EDEFF3CF2E3EC8551FD2C30F1D94FBF
-:1087B0005B88BE4DB1B13E3BEE23C6C51A3B40F9C6
-:1087C000ADD0234DB55114A7A89DCCA4F7D4958561
-:1087D0000EC44FA9CA8C56B02B6A9CD3E1E6F07246
-:1087E000CC1BAE882D72207D3B76E3F2D0561F3F26
-:1087F00079B4D23BB46F7676F1E34F0E84F97DCD38
-:10880000FC930666FEF7F7D1AA993B1EF38FFF5340
-:10881000FB68E66EFA7DB4FCF89B91FD16AB346FF5
-:108820007569941FF1A966703B319229B48FC6EC2B
-:10883000B0FE5EA17D34F5D7FD093FA7BDC057DD71
-:10884000012F71566AAFFE5AF55B60DCD2449E6F11
-:10885000559FAC64B8AF0678F5D9011E995443FB17
-:108860006B4B859E99A630773DC9BF3303E3E4592E
-:108870004F47111D673F33E7C3DF1520DD2A92C242
-:10888000E52953F01FF4C7AC09A17EBEAAFD4D0631
-:10889000CEA7F4DF20BEC4B853F53C790BE9CD1860
-:1088A000DA6F63F6A6870722BFD4C6F4C53CF9EC9D
-:1088B000A75332B2F243EFCF5E7A5F2E7F1FE2D62C
-:1088C00038D45B51B49E799B2CC42FD31E505D6469
-:1088D00027D3CD64273F5F1E45F0BCB42292B76911
-:1088E00006BEFF063E6132E9778E7236CFC65CAFB8
-:1088F000DB50DF3F1454397D7C826E66A44F71B724
-:108900004492CB3B10C760BFA622BF75A4FE781E61
-:108910006A9742FB4D8CD538500F4C3528A4EFF4A4
-:108920007259D18DFBAFD3329CB7E37BF31FB138C3
-:108930009766F239A8DA7C206E9A6F08CEC27D481D
-:10894000B6C542F98D6A5847541C3FF7F01ACCBFA0
-:10895000DAC88C66CC4F39B85ED3E653EDA81C89D3
-:10896000FC0AF5C78C503F3F96EBE5F91D78DE8792
-:10897000C55AFDCF878F8773CEE6EF39E250DE060A
-:1089800011BFA0FC1BA0FE6F8CD797C615399AF2B9
-:1089900069FF7E15E64B703E3D7A878D0B704A6FFE
-:1089A000E4C785C6AC58A443E2A4C938DECB2AE9A3
-:1089B0002710AA478AD00F7C59ED8FF1ECB407F647
-:1089C0008E588BF0AB7DED388569AFBC4F76EA2EC3
-:1089D000C1674DE8FFA3DD02F85528EFEDC6F5832A
-:1089E00047E5F99C7BBB29D2BE9F563FFF0113D1BF
-:1089F00063FE0ACE0FF36BFF42FDCE8F0D76427AF7
-:108A0000CCDF6C1A807CFD2F62DED36BD38B8F01A1
-:108A10007F4C37C5DB157834CF576146785E9D4271
-:108A2000B036DEFC073EE864C8E7FD6169117C14DE
-:108A3000EAB76306DAB56F5E4ACC981646F76F96CA
-:108A40006F8DC37DED5351811C3BE663164639D7CC
-:108A5000939C727A7CB33C673DE66B66DA83B1B86F
-:108A60001F3EF39EEC04B4779FDA0366ACFFB43E7E
-:108A7000D380B0CB6E2F46D865EC43F037E29C0A2A
-:108A8000FD009D16289C6FE6BDB4D79C05E33D27ED
-:108A9000F8ECDB97DFCFC5BCC1FC8C602EDA61E05F
-:108AA000ABDC54A4CB1F15F21716BCA4BAA27A876C
-:108AB000F86A01F215C8FF5CC1570B366DFD25CA77
-:108AC000E902E4A77E97F225C497FBE8F96BCF8E05
-:108AD00060FCFD7DC8779ADD0778B909F36B660104
-:108AE000C338086F10FA1AEACB78BD2F9FEC096BD8
-:108AF00032A35F5CAD727F01E42919FD89EA069318
-:108B0000AF294C3F2EC0FAFC507D7B7CB3BF9BD875
-:108B10002FABB5905DDA2FF0D2F4C0E638E48B6F5E
-:108B20005FDE7B6030C659AF2976D4FB97C8A1C001
-:108B30005B35E2298ED649FE5135E2252E84A736D3
-:108B400079137C51CD381E34BC541B059EB47AF188
-:108B5000FE01C187F398C0EBA6EE5CDE857C03C7FF
-:108B6000901DD1D6E74990CF0FFC20F8FEA858E71A
-:108B70003CE01B673EF197CB3C40C4FF50F5EDABAA
-:108B8000CF52FE48A3A736EFF81C87A6A75D1D129B
-:108B900042746E32B0AA48F9EAAF85DC996C5CAFDA
-:108BA0009CAC4DBD7D31E06FEE4BAA939087B157E1
-:108BB000D8B81643532CF9A7BF56EDB8AED23F55DF
-:108BC0008EC6756B7C67DAA8181B709F907520FCA9
-:108BD0006BF32BEDEC1EDD81F35D00E7A3CDF3A479
-:108BE00012207AF95E55ECDCDF6D32631E5193532F
-:108BF000FD7C7F10F355E394C14A1F9C8FD381F213
-:108C0000CDC00ED27C6CC7EEA3F17C27EECBEC1D61
-:108C10001AE7535FAC11DB7DCAB81ED0F8F2A4C8C6
-:108C20004B9C5CB195FC616D9CD81CCE5761E37880
-:108C300016275D3A8ED6DE94C3E7A5C9C5C104CE1A
-:108C4000FFA5CBFF42ED343D8B3F988FD3F0A9E1D8
-:108C50002D4C2E25FC68F2A5C99346D77F54AED87B
-:108C6000928EE4B7DE2FD64D32D2296417903FD1D1
-:108C7000DE59CCFC1C5C98DD24BF6664DA77664F55
-:108C800084E71A9EF4CF4371953D03F13FD2964C91
-:108C9000FBE56C79F2BE6E61FED929CC7BA13E7DED
-:108CA00051F5933E65209561F65CF3DB6A178EB44F
-:108CB0000F43FE7A49A173479AFD869F87DAF8141D
-:108CC000FAAB2A58988BFEC4EA9C2C1ABF3AC97595
-:108CD00016DF9F77263822CE118A5F869E0FA8F175
-:108CE000981FDC9429C50FF39AF7919CCF67C19523
-:108CF00018EF4E7BE0FD8A8148FF174D747E616658
-:108D00005D26D9BFB31B66F4C7D076DA8A1C82E72A
-:108D10003C7F27871FE07EDDB415852F607EFE54E3
-:108D2000946B04F279CB1AC58EF1D790E70B97DCE0
-:108D30000AF54362BB76C0F99ED870AA6230C611AC
-:108D40008B55921BD786C72761BDAB4175E2126771
-:108D500032FB925B91CF8DF12477DAB9C66526CECE
-:108D60006F77E670BD715B0ED71BB709FE2D5DB640
-:108D70002C17CF15B43C0B760AF7D7CD8EFA00C668
-:108D8000813B3B3BD7C338D510B626033F9D51B836
-:108D90003F5E656656E4AF43A6E0BD38FF43F7C6C5
-:108DA000F6ADC509A81707A07CB844DC0571148D81
-:108DB000ABE14B1B7FA61857EB477BEF20FA5568BA
-:108DC00047C47CCF2E7F7112FA0B6737E624B03090
-:108DD000BC9FC57501BEE7807E7C2D423CB8304704
-:108DE000CB4FF8A9AC1279C443A6BA34DCCF05BF87
-:108DF000FE74B87FFED5B35156E44BF0EBE5E726A1
-:108E00006E57C09F979E83FC48705BBCA74E8DF742
-:108E100044D0475AA9F7F797E7D822FAFB9AFC5DA6
-:108E2000A2D7847FDF9677E9766DE7BA9ABD4018BE
-:108E300010886274CEE0FDB2989F5EC7F397B3EAE4
-:108E40002C760BE0F734CA17EE0B6E56B9BF68E507
-:108E5000F2767A675F3FE615661D67CE00C0B38E77
-:108E6000AA4E07B4DFB7E67E3ADF71E73A8575565A
-:108E7000C2E2AE27D64C42713BE7F4AC4C81F6E738
-:108E800036F2F328506DD3C55B07521CEDC75BFF6C
-:108E9000AC384BCB3FE9F1BF2907E2AD18F8C5C9A3
-:108EA0009C32FE79DCBE1BD8A8A8DFA5F86FF67A45
-:108EB00028AEFAABB78ACA41F5CF96A6C23AFEA64B
-:108EC0009C7C6408CA516C3CE54F9ABD35B439F8B6
-:108ED000D786FE17C7019EB6DBE2EDA83FFEEA5D2E
-:108EE0004CCFDBF846F0E9D04D8D6A2AA3F63B86DD
-:108EF00040FB5DB678DCEE88B00FC7E9AC3F7F730E
-:108F0000F7C2819DF1B9B6DEAF7FC5E9DD66C7372F
-:108F1000CE88437FB5F1F7893B06219D63E2EDC81A
-:108F20000AB3C5399C2FD7727D74C61AFF02E65169
-:108F3000CFAC9BD809E3C33B4D2D6627F4EBDC593E
-:108F40001987F9822F8C4D71762CA17D00E761F491
-:108F5000ABA807079733DA1F1C1C303247266DDD9C
-:108F600013FF0C6A36FA316EFE06F70DD18E5F8C58
-:108F7000E6FBF7623FF0CE6D3CCFD6965711F985F0
-:108F80002162BD1D7213B47D207A5E5AC49F7FB5E5
-:108F9000EEF571D8DFD90D263BCEF7AF1B4CD4FFD1
-:108FA0005C88EF0DC08F6736F2F3027377409C9CAC
-:108FB000897A4421FE9D0BFC6B45FE5B687299E348
-:108FC0002FE5CBD28D3CBE9E5BAF50BCADF1E75CD4
-:108FD000977F04E15DF0A915FEFD0CA6A303AB5F2E
-:108FE00089F8688F5FFFD17C803537723E40CF0FA4
-:108FF0001ADE34BE08F12923FED4E89F50DF7758EB
-:109000002ABDE0237CFA4A581EFA0BCBCC2C0FCF9A
-:1090100043F90CD14E94FB1FA2E27A631E6AB1950C
-:1090200097BF8C8E5B8FE50F51197E9CF70F06FB67
-:109030007E8CB3BCB999C4B7BF541D26057E9D98DC
-:10904000D4544666A0D4E032A01D5C66213DA2D770
-:109050004339B9220F98CBA81C96CBCF899B580DCA
-:10906000F9175A09FE403AFA2F95310917F0287975
-:10907000BF173A4FC4FDDECA2109F76683E739F806
-:1090800085F48946E0F3CAFE099BB3002ECE4DE37A
-:10909000709F844213C0B5B51913CBA0FD2DB92E16
-:1090A000676ED8385ABFF0BC3F3E1F99E219908BCB
-:1090B000F6DF6C5B8576E06F4ACB02831A6A7F44E9
-:1090C000619F6E574270938965A0BF3DAC6DFE9164
-:1090D000CB55B9AE1B72233C9FCED80ACC4B4CF774
-:1090E000BD794C217DC6DC56A0E778C17FD3ADB6F3
-:1090F00000E9B955A6E636FEC8423D156F44BA8F61
-:1091000013641F6F0C34E2FB3DD872FB9756721547
-:10911000D7FD9CD8BEFE0741655F6AFDC1FAFE66B9
-:1091200082F5025D1517D01A444C01244F057DA726
-:10913000EC78F347EC77998F3545111DA6DA910F3E
-:1091400015E631FC0CE5FC18E08B3E58023F40BBB5
-:10915000459BBFDD87623147F3B33C45E42FDE63B7
-:10916000E7EB619EC1C4AFF70A7EFDCACB6A3055FA
-:10917000343E188CC3A3B0CDE302B9A81FCA554F23
-:1091800015D2E1AB75CBD21601FF7CFB9AC539161F
-:10919000DA9FF1BF1E8776759EF0F7D945357003CB
-:1091A000D41FCCECB17E75187F2DCCE576BF39335A
-:1091B00090711FEA994C1EAFB28B7B33EE83F6E5BC
-:1091C00059A30A5713165C77E786ED4F8E33463E58
-:1091D000BF31298DFBEB6C03B7C71623F3C52650AF
-:1091E000C9E2004FA3602E45782E156095F6F3FD79
-:1091F000D41EDBC5A15FE39891CCF77B981BF59655
-:10920000465F8D6E97D013A68C7EBDC1CA4CB8DE6A
-:109210001E6C9D1DED9346D7AF843C7E65E572388C
-:109220005CB5919E5AB499E7F516295CDF2EDAA950
-:10923000F0FCE625F676F34AD4C955EB66903ED3AA
-:10924000F49803FE217FCDB5BBE3038E7FC0EEAE65
-:109250002BBD2A7DB65ED3677D595FE4BF2BF94BEA
-:109260009A1E03F2BC98DBF11AE885288375CF16A5
-:10927000731CAE4E7518112F1DAD4ED4E78B9ECECC
-:10928000263BC92EAE65E1EDD8BA44E2DF95992AB6
-:10929000D1B5A2219539E0D19C0685CEC98E6D4805
-:1092A0002438AE3585E08A3F742EC175B7ED83FE54
-:1092B000A13BC1675F78BBC0C3F33456ECDFCDB4CC
-:1092C00079E4D7A3FD39678379009EDDB65594779D
-:1092D00074B3B67848F9594118B806E5CE65F2710D
-:1092E000FA586B49FEC5BA1609B95A7488DBEB45C2
-:1092F000C3F87EA1D1D7231EE96F3AA8323FC03709
-:109300001D520B03D07499D0E79664037384D12D5A
-:10931000CA11CD1C61F4613E5710E3ADC9825FEE06
-:109320008FE27A3F262F416A37D9368BF82798315A
-:10933000E220AE37D6D945EA9779B87FACF1D5248B
-:1093400091371FC75A96A39DBC6932D487F5672A07
-:10935000FE8EEC86A958F6AB012FA72FC74FCD1A6A
-:109360003FF5603D889F74F801F9207B7FEE28BFB0
-:109370007F025EC96F8B019E74D0C4FC50BF42E077
-:1093800005FD568C7FCEB962496E34BE0BA2DD035B
-:109390003D175F24E3AD834BC65B62B98C9F8E6E35
-:1093A000191F9D276749F5299E9E527D6A553F09E1
-:1093B0004EAF192CB5EFBAB84482337DA3A5F6D9C8
-:1093C000AB2648704EDDAD52FBEE6BA74BF53DFC76
-:1093D00073A5FAEB362E92E05EF5BF96DAF7695880
-:1093E0002AD5F70DAC96EAFB1F7C4C820B834F49C4
-:1093F000ED071E5B2FD50F6AFAA3543FE4CC6B1226
-:109400003CB4E50DA9FD0DAD7B2478187B5B6A5F4C
-:109410006A7D5F8287DB3F91DA8F4C3E25D58F7264
-:109420007C23D58FC9FB5E8257083FA7C2F95FD264
-:109430007B4188D8908F73D23C43BB53DEE78C11BD
-:10944000E5EFD86D0A4BC4F8E7E0443BC9FD35C6EB
-:1094500081C3BB8B3844F0F10566BB1DCFB35F49B8
-:109460002F66A33F51887C3E96EE559DABE7F90EE3
-:10947000BD5DD7FCB97830CBC6B0713BB8AC10D06D
-:1094800087E0C472BB047774274BED3B4F7648F5F9
-:10949000299E3CA93EB5CA29C1E9354552FBAE8B90
-:1094A0005D129CE92B97DA67AF724B704EDD64A9B1
-:1094B0007DF7B51EA9BE87BF4AAABF6E638D04F7AC
-:1094C000AA5F2CB5EFD3E093EAFB065649F5FD0FF2
-:1094D000D649706170ADD47EE031BF543FA869A316
-:1094E000543FE44CBD040F6D6990DADFD01A90E070
-:1094F00061EC90D4BED47A448287DB3F92DA8F4C01
-:109500003E29D58F729C95EAE77DE30CD0BED476D8
-:109510007EDF55F3E7C6E47D27B5332581BF8FF99C
-:109520006F16EDC4F3FEEDF9F99A1F58E1FC511ADC
-:10953000F70703F7CF5FEA9E25FC7FEE272EF3B9EE
-:10954000E97C5E021E78053989F729C47F18624DCF
-:10955000A57C6412ED5B90C974E07937F083004814
-:10956000306466621C1213F263D37EEE7FF57EECEC
-:109570001B10E3A05F7DB6BBE7CF289773EB5F1DA1
-:109580008171CE1CE65B89F300BB1B8FFB58EF4655
-:10959000C9F928AD1C65053C868D7728AA2EADDF5C
-:1095A00065E47794B599DAB7F52BF2550AAC6F51AB
-:1095B00058FF8F40FC650439ADF3829C41A0FD98B3
-:1095C000D74EF013DE64829FF43AA85CEBCDA3F291
-:1095D00029AF93EAD7798B087EC6EB22D8EF2DA767
-:1095E00072BDD74DCF37782713FC82D743E5466F3E
-:1095F00015957FF4D650FD4BDEC504BFE2F55159F9
-:10960000EF5D45CF5FF3D611BCC9BB96E02D5E3F41
-:10961000950DDE8D54BEE1ADA7FA1DDE0682777989
-:10962000030407BC0709DEE30D12BCCF7B8CE0030B
-:10963000DE262A0F7ACF50F996B785EADFF1B61207
-:10964000DC2CF613BEEAAE48F7183598B132E207C3
-:10965000CDFF1D87710F324791E9AF52DCA38B3FDD
-:10966000F4F4F85A8C632A01F717FD9F2EB9EB9793
-:1096700085C505DF8BF1EE8F66BE2890875A03CF34
-:109680000BD42630BA1FC6847F3E5BF0254BE27EAA
-:10969000F92C31AFD9420E0A913FF3883FDFB996DA
-:1096A000384B8BB7ED191E350FF933DDE0A3BC83C2
-:1096B0008DDFC3EF9FE131E7811C9DABB9F3008DD6
-:1096C0006777E6E220159640C79B319F7448A53C1A
-:1096D0006C7BE3558B7B12EDD6EF3A9B86F6A8FCAC
-:1096E000EF2AE5EBDF35C54EC67C4B721EC74B72C9
-:1096F0009E412A7764B83BE33CBFCAA979E16E2555
-:1097000074FF7F3C86E620E795CC61A273B8CCB5A8
-:109710001FAFDEDC040E1FC237331F9525E91E077D
-:10972000BE7F0B0418087B065B3222AD473F9F9E2D
-:1097300079DC7FEF996790CA8F32DC3D103FA773C9
-:109740005CD27CE2BA3AC47D9C9667705EFFB1F34E
-:10975000BB2F95EC10BEB5FCC6CA61E29CD6424553
-:10976000DB07E77EA295697E22D54FBD97E77B3464
-:109770007B79BCADE4FAF05C8D89F4E65425DA8996
-:10978000FEF6B99A7BFBE07EE16D10EFE1FEA9A643
-:1097900047A7026C00782AE3E72EA61E8F253ED34A
-:1097A000EB57788FE17EDF54F03F317E54BAF27C84
-:1097B000CABBEEEF4CD82F4B6AA17BABC037A3716D
-:1097C000FD7307A9F4FD86770DFE5C45257E312BE0
-:1097D00030FFD949C02F11FC058D2F16887B39DA4F
-:1097E00073E0B71B913E7FDD36308FF669760D72E0
-:1097F000203E9719F8BD3ADF5B2A3F9781A97C3C50
-:1098000037129FFF2CDD2F40E702E9372896EE172D
-:1098100034AA6CF1AB11F4E9BD828EEF269BCAFD30
-:10982000D4AFBCAFB840D075816857B1E7503ADECD
-:109830001B5C70D04471112B68CA7747385755BDEF
-:10984000F8C15F740BE3F3EA8693FC3C166BCA0F16
-:109850003F87F5B0E06B8DBF5473ACE7595BF8FC04
-:10986000F8F8C0E7F7083EFF12FDFE711647FCCD81
-:10987000F06A13A02600A5E7DFEC749E4F3BD737B4
-:1098800093B9A99C0DE446BE76FBD6D0BDFAB9AC1F
-:109890009E9E2F289A918170356B294B86FE6E5AB9
-:1098A00055BB3F196637B16ECD70CC734FF04FDBAF
-:1098B0008F65E506E54B9F83E464058EDFA4D4AC99
-:1098C000E802E3DDFAD2B01598471EA7723AB0B7A6
-:1098D000391D809F5C6AC2A5EB03B97848C805CDE5
-:1098E0005F938BA94B994B490ADD03699393A2BB04
-:1098F0003E4BC53D16630B9D43A9DE6549C0FCC9BF
-:109900005CC6ED76280FC4EDB526075F9B38DDBF3A
-:109910007E59A17B365F2B8CBEE7D09EDFA0F99FDE
-:10992000207F5CEE3E8DE1FCAF8ABC5E8627B95F8E
-:1099300076C83E7F6DF00F88CB26FBBD11D7632A1A
-:10994000F13CD417CFEBBDA23897C15CBEEEE0CF9F
-:10995000E0E704DAEC00FB392694277CC4C4F376F4
-:109960007A7F575B477BF3B498990FF7B394A203C0
-:109970003FA21F72E97C3DC903002FCB904498970A
-:109980002C713B22CD63B918FFE04F3C1EF7A53385
-:109990003A17A4C7A762E7E3B4975FB544F3F96841
-:1099A000764A9BE7A5F3E2F47A3F2F93E8AACD0F1E
-:1099B00034459E1DC6371AA39D28AF9546CF7B8898
-:1099C0004F2DFFA6C5C50733BF227BC02E2E4BE30C
-:1099D000E78F03EDD9E1E6B6783C2B6427B53C165A
-:1099E0002B8E9C8F745BEDA4BF263027D98B1EEC89
-:1099F000B8862FCA63A9B84348795E0FADC382FA0F
-:109A00001ACA28CCA390BDF4937CC6E0BC685D4123
-:109A1000CC88B03531718487C1C718E9E9C1B8066F
-:109A200058EFCE93CC8FE7A91A2F4C2A8D85FA9D3B
-:109A3000DF1A290EFA6DCC2BA9F81D899D673F4CC2
-:109A4000C57C4FED852D040F681E7196E7CF8E4FB4
-:109A5000C1FEB69F373B2CE4072C243C6879CAED45
-:109A60008C39711FB4E8231BDD332E3C5A1F437819
-:109A70001379B562B1EEE2F33C1FB20B81411007DE
-:109A8000B4985920CC5F36D965B88885C1993824F7
-:109A9000C061798E6B8D1F637B883CC84036303C3B
-:109AA000AFC65A1322DEA7D2EF2316287CDE67F258
-:109AB000DC9D7A50FE6C82CAF1FD7715F17583CD7D
-:109AC0009F82FE6DE39C1752D0DFFD6DCCDF098FC6
-:109AD0004FFD644E41BCD60DFB0FB22375F06E10E6
-:109AE000E35FA33F8A51FE6B3EE5D76E1076F6A981
-:109AF0008B9FB364C0675D1123FBC9841DD6EAEB5D
-:109B00002E9EAB427A5E28B63A502FE48A7C68EDEE
-:109B1000F5FF99DC14868F9DE0570780C0DBC1AF4D
-:109B20000E80EFBF0DFC6A84F1DE29969BC1AFC6A3
-:109B3000D20F7E3596CF805F8DEDD0AFC6F229F083
-:109B4000ABB15C0B7E35964F825F8DED9E00BF1AE8
-:109B5000CBC7C0AFC6E77517A797D27C8E31BA5F67
-:109B6000BF3426CE80FA15E61F8D79A1C3AE7ED113
-:109B7000888FEBCF1B24FA1637474BF0E0D309212F
-:109B8000FA22FD8F7791EA071CCD92EA337D3D25BD
-:109B9000B8EBE27E128CF9A1F0F753AB4A2438C53A
-:109BA000335A6ADF79F20409EEE8BE556A9F583EDF
-:109BB0005DAA7F344E4747FF3C834C47FE7D850BB3
-:109BC000C5363A5FD91E9F3E26E8A2C18FFF4A9D47
-:109BD0001C296F7B570F83140F741173BBBB8783D2
-:109BE0009EEF3B31F0C5DC02A487816F9BBA5A62BD
-:109BF000BA015D721F37303C5748270E607E76F100
-:109C0000DEE325E762902FF75698A3903EBB5D25D3
-:109C1000D1082FAD30A784F3515DA6A71FDD53F007
-:109C2000F0F569EF3F5A32E1B2FBE88F21FF75BFD3
-:109C30004CFDE8B959280F97E09155D17E6D088FFA
-:109C400013E8FB4ECC5325CD5F2F170C37E953702B
-:109C50005CAB8C4F57D6038887A79E30D239ACB601
-:109C6000FEC4FB5A7FC3D58B314DF997CE7FB78B9E
-:109C7000B707FF370AF1026349F34B703A86217E3A
-:109C80007E27E4ED5F85BCFD56D015E35884999D91
-:109C9000BFA7D1ADAEEAB151B92837457C5EEB6FB5
-:109CA0007C4C417593C89CB5F630BC3E21E6F18CE6
-:109CB00058D73AEC17E08E37BA14C45FC662B78241
-:109CC000F2D6754913C14F09F94EAB69A1E7E9F71F
-:109CD00004A8EC5215A4FAE1EA4BB48E363C386580
-:109CE0003CEAE9E417EBD1FA0DBDFFDA21E4B70B4A
-:109CF0002E3EFF389FCD85F622CE6777F2D2214ADD
-:109D0000A713F57E9CCF25E09A7C84B78975C5F9A9
-:109D10007C04FBC5BAEAAA920EBDE0088DC71CD52B
-:109D200086707BD31E3F6D15F8DF2CF0A47F6F9BF0
-:109D3000A9A6BF3D825C69A5664F8B8E1B747A27EE
-:109D40005A92FB43F80BB7037FE981F2E873AB62E9
-:109D5000FF8AF038B12D5E9A4AFCB426E6F6B73198
-:109D6000DEBEF1A8CAB8BD1DB71FF5E5FBA32C6484
-:109D70004F1B478D4C0FE7BB06B18EAD02EF837CC6
-:109D8000AE13F740FB316E0BE5E3073257FABDD057
-:109D9000DFE8B1AA3300FD1D6DB327EE187EDE812A
-:109DA000DB9309620D7BC64E7C10C77FFF28E80558
-:109DB00047689E5AFDE6F289637A211D839C8EEDE9
-:109DC000E1E74D41AFFD625E7B05BD1A057FEF16F1
-:109DD000F664A7B027DBD19E5890CE45623DDC9E4D
-:109DE0006C16F62488F604CA77853D7907ED099448
-:109DF00005A3B2CB486FE22536B22710A0D07982F6
-:109E000005D2BAB47995A7A912BD4624C548F42A4B
-:109E1000B3254AF525C65409765DCC92E0EBCFF721
-:109E2000D4D929D9AE0C3E3D5867A74A2478C0D171
-:109E3000D1D2FB95AE8952FDF8A229527D85738659
-:109E400054CFC47E18DFA283327A9D4A71AED87790
-:109E5000D2FCA9F7CB55DAB719F481EA0C97DB42AB
-:109E6000D6B64F66C07D32705F1C46ADBF2CA99E32
-:109E7000FCA8A326772A9EDFABAD043E84B2F82867
-:109E8000F869947C04BE06BFB7D03D92FC40F097C1
-:109E9000FA131D5AF87E93B66F3548B7FF343A5F10
-:109EA000DE9F2ABCC2FE94AB673B7E59B7C4ABF2BF
-:109EB000CB40BEC8FFFA6DCCED7B916FB67D047EC2
-:109EC0002AFAB91FFD82FC2FCD6FDBFAC52FC8BF60
-:109ED000DDDA262F1E495E0A85DC6E399AD5D0045C
-:109EE000F2B63959710A5493BC1469F2D224F4665B
-:109EF00079353D1F20DEDB6A72C7A0FFB7F9D85263
-:109F0000D16F981E217F3D4C8F601CC912E4FAE48A
-:109F1000D4507D162756787BC67AEAFAEBA78307DA
-:109F2000EBDA97E8E0D1BAF61374F0ADBAF6D3A540
-:109F3000FA0658F7E5FCEDCD423F68ED0A8D6ED587
-:109F40001941DF0E382AEB57E6AE96CE3D349E9887
-:109F5000457A73CBF195028F55127DF668E31C05A7
-:109F60003CE75FFA7E89D117D31BF8A0E498D1595A
-:109F7000EB08D14FA313C37838ACBF52AB2AC95FEB
-:109F8000C3314EDFF6D6B94BE8E71DC2CEBCA1F314
-:109F9000DFD49FCEBF3F1EF8674B9381E2AB2D47C6
-:109FA0002724627FBB2FCEA4F9361C33D03DB217D5
-:109FB0007B8EBFA9B65B687EDA7C0A3F581A83FBAA
-:109FC000AC179A0CA4FF0A4DEE447B04BCEBF9AB32
-:109FD000BD7E35BE05072A11F1B21BEC109D1B1684
-:109FE000FA54C3CB9E134F12DEB71D5B948878BF23
-:109FF000A1D520E165688BECAF0F399320C1034FE9
-:10A00000727F10ECAE84DF2BCD5B2F17B83322C3E9
-:10A010005DE4F657E90F6C1774DA26E8B43DCA39E7
-:10A0200039D2BEC6B64FCD55E1DF5538D393E7DB05
-:10A03000CEF4E4F9AFCD4047D4B3174E1B48CF0E52
-:10A04000B1D7AB3511E851DC6CD0D909D96FB8D68E
-:10A0500078F5543B7AB1BDF735BD58A27D3F2578E0
-:10A0600063C4F3B1213A8873953A7C6A7EF495E92A
-:10A07000A69D47D7D1AF9DF743FDF8F4F134BB0E51
-:10A08000FB69AA247BB326E65DA1CFDF257DFEDE3A
-:10A090008F429FFFD889FCA423A33AA7A31C1D6964
-:10A0A000D3E32C365C8F6BE72183CDEFC584FBF9BE
-:10A0B0006EC18F3B5DEF8FE983F4ECA6FEAFFA3BF8
-:10A0C000EF0A7FE71DF477BAE33E10F7770EB96623
-:10A0D000707F2759A1EFC52C8DB9DEE889C0A7FF95
-:10A0E000D7FD9CF145B29F53E194FD1C6DFF60B715
-:10A0F0005DA1735863F264BF6737FE827926ABE2D5
-:10A10000C77B5CDB5D132FAB870342BE0F09FABC34
-:10A1100029F4F07E1137EC40FC135DCA055D78BE72
-:10A12000A2F8BCD3E674207DAA785C96574DF1F472
-:10A1300050CDBE7B6BA8FD910BD3CFE3FDFEDDF6CA
-:10A1400018CAB3ECC6F9C0128E983CE7F1FB15BBF8
-:10A150005D8A636984B87E488BAC07343F41E3CBAA
-:10A16000DDCD9F135FEE6ABDBC3DD5F497D6EE4DB5
-:10A17000F67A29E2E7FA66C6306EB892FED1DBC500
-:10A180002B8DA36F3FC458AF46B23BFA71DCAD01D3
-:10A1900015CF3FEF6C0926E2769D3B7048C57BE00A
-:10A1A000C52D019AEF3E97625733A95D299E8B7E9C
-:10A1B000F3E27B63F0F9AEF3468385F699EC24B7BE
-:10A1C000C5423EDFB968B03909BF2AED73045A3E73
-:10A1D0007F10E5D56755E9BEC8EE8BFD92C2F1F65A
-:10A1E000E8752AE993ED651603E697B79F378AF37A
-:10A1F000D601F21F76B466D9B0DCEE02F9217D11EA
-:10A2000024FCFFFE3A7E4E7527F4C7F58483E6A151
-:10A21000F141E0BCA13CD2F7767E2FC61B72F1B3B0
-:10A2200018C4CF81F37B62505FED6AE1E30C59D231
-:10A23000148371E6DBAD86589E57E99F84CF1B8758
-:10A24000DF6FEB87EB6A31F0FD1BE1D768E3ED2EA2
-:10A250009B4DF9FCDD2D3C0EDB7D9EE78FB6FBF9B7
-:10A26000B93526F498D67EFBF909637A61FEC06F92
-:10A27000A2F643987F651CB4DBDF71EB7574BEC634
-:10A28000378F85EBBD52BBECE794B4E8EC93671EC7
-:10A29000C981468723DF4DB8B192CED7733D39CA05
-:10A2A00028EB975DE797264DC0F16D7C7CE6E7EFE4
-:10A2B0006BF119FE18C3BEBB523BFCE68915D8DF13
-:10A2C000667ECE6C884DD6674786CDF8FD7C3CFF18
-:10A2D000BF2986ECEC765C3FF67F9451FE6C77F9F3
-:10A2E000E3A57198B76E664EEEC7C97ABDF4C2A6F3
-:10A2F000BD71D0FEBD0D0AE177649EBCDE9DAEEC63
-:10A3000087310EBED0CCF1ABE59334B9DCD39C7071
-:10A310001BE9A732781BF0F85EF9EB94C79EE39730
-:10A32000FB19B831469AF7FCA6045DFC26E7C7C1C5
-:10A33000DFD4F203B68A01A1F8ADB095E7D707FEE6
-:10A3400034A17F00E65B5CC6CFCFEBF3E2A38C16B3
-:10A35000D9CFD2E5C50BF57971BD3D17FED800B157
-:10A36000AF7189FF23EC9C966FD8660A4C715F83AE
-:10A37000FF30C808A10B9DEBF5241600FEDF10FE90
-:10A38000E52073DDDD29202A5B55DF1016E6173046
-:10A39000BB8F250D08C5B7834FCBF140D171992FE5
-:10A3A000217EFC12E3C955B8A74972E0E379D0AB2E
-:10A3B000F433D6C4F46E6802BA0E3CCAC47EC7BF7A
-:10A3C000EC45BE6AF842DBCF00D7A313EECF33F2E1
-:10A3D000B71BBF3013DF6D19CEED94E6A768FB34D1
-:10A3E00037B2A6E5A50A9ECBB6AE68027C6E3A32BD
-:10A3F0002B7501F4FFC1C7B4DDC9B6146ADFA7AF7E
-:10A4000093E2CB815A1EEAB8C1975880FEBA4592B2
-:10A410006BADBEE1F8D218FCBEC885A081F8B4F1DE
-:10A420002333C3BF0FD0B0C342FB390DC7CCB4DF59
-:10A43000B26D0797132DEFACF9F96F097D7E50F8D7
-:10A44000BD0784DFB24FF82D7B84DF12107ECB2E48
-:10A45000E1B7EC107ECB1BC26E6E3A2EE46F498CD6
-:10A460009F7FC796E765B579DED1BDE98411165C9B
-:10A47000FDF180B50186F65C9693510E594E462645
-:10A48000CBFA63B83D556A5F6ACD96EA87B1EBA413
-:10A49000FA1B5AFBE9E291C1BA78A444E78F8C9188
-:10A4A000E5F26858BC4BF1B51CEFDE141EEF6622D6
-:10A4B0009D781CB8ADE931A2E3B6D359F1E17ED95C
-:10A4C0001B426EB69DE6F6F98D33E76223F96D67A0
-:10A4D000043DBE16F468167ECA4D29AEDBF30B317F
-:10A4E000AE3867C6731FEDF1B3F6BEF6DE19FFA9ED
-:10A4F000B870FBF705058D21F8DB2D9FE452FEE4D3
-:10A500002AE563592C3FE7B65989A6FBF757BAD716
-:10A51000F29BFC2CB10F51D387EF8BD60CC4F20504
-:10A52000933B15EF3F6D56DC53508FFB7E678EF8E3
-:10A53000F72496E72B9AF037A07DE04792E1E725D4
-:10A54000C588FC1525C067996739E2C78AF13A3496
-:10A55000526D6E86EBDA64620D68E7998B39EC9D7B
-:10A5600018172118E7875E9ED5F9302F25C8F78F79
-:10A57000C1BCD2F73EF068167E770B4BDC27B35890
-:10A58000F9BD83E87C4F5D7E21FF9E6D7C3FECB77B
-:10A59000249BEFA306487F4F11FD1A6276A4933DDA
-:10A5A0006D4FAFEAE25C364FBE8FA2E79706A16718
-:10A5B000DFC8744F89F41D8C3F0AFC6CFB6A9C8ACF
-:10A5C000E31658E35CFCBB902E15EF81BDF1F5E876
-:10A5D000986911F86C7FEF697FCC0FE38382608DFF
-:10A5E0002AFE4E8541CE6F190248EF0B3633C9F56E
-:10A5F000605C70C2A5FD0D3923FB79839AE4F83FB6
-:10A60000B4BF5FA7E079B3367E428220FD8FF0EFC2
-:10A61000695C899FF4FBF6C7F3B5F3929E4FF01C7B
-:10A62000B11A6FA3F3359B8E58D7A31FA9CFF71D7F
-:10A63000FE80EB71FDFC1B3F98948AFED7E6A137A4
-:10A64000A7A21C6F41054FDFEF5938C925C1B07E65
-:10A650001BEA7B26BEB355CDEB476970CD243C3F4A
-:10A66000B365186FFF49FE9127F17B605B6E13F5B0
-:10A67000BE4778BD06B3459386216C32103CA917BE
-:10A68000B487FE7EEAE93A8EFC199DEF3A81E59F98
-:10A690005076A01CD1D3F519C2C791C760DD477BA6
-:10A6A000B84E86C3893D5CA7C2E1CD6DF6A5C5163F
-:10A6B000BE7FACF1E1E1631384DDE1741FAFC5350A
-:10A6C000C55797E7FF77C1A76F0B7D7548D88F37C0
-:10A6D00085FDD88FF683E2616E3F1AC5BEF16E61CB
-:10A6E0003F768AB8371477B9857F3159C4C33C0E99
-:10A6F0002B185ACAE35EBB96E7CF30468A87C61549
-:10A70000C87EE2D87CD9AE8CEE9628F169795AAA37
-:10A710002E4ECED6C5C9B25D2931F6D7C5C98375CF
-:10A7200071B21CF716378FD6C5C913A4F6C7F31D2F
-:10A7300044D7A2E3B7EAE2E5E952BB101DE57D9BF1
-:10A7400010BD6644A4E396E2190FFEDFA263E4FDA8
-:10A750009AFFFFE8F80FCAA3CD20EDDFE8CB77849E
-:10A76000FD7F4BD88D83C20F3820F21CFB843FB78E
-:10A7700007E9D81DFD3AA7F0EBF8390E2D0FF28648
-:10A78000C8433588731C5BC4BEDB2691875A56FCD0
-:10A790003D3FC77191093ABE1B918E154ED9CF1B13
-:10A7A0009327D371942351E7F7C97EDE70BBECE7A2
-:10A7B000955A653A0E63FD757E9F4CC7A12D253ACB
-:10A7C000BF6FB4CE4EC9E738C02F78B45721DE4BE7
-:10A7D00090CF731406E5F31C7AFBAEDD57D4FC86EC
-:10A7E000363FC12BEF336F421B8AFB452966FEBD06
-:10A7F0000DA3A70BFA1D1ABEFCBDF839C42D9FDCB2
-:10A800004EF82C447B1EC17EFFA917B7FB7FEA657B
-:10A810006FBB1F19DD0FD39B3EEEFFC48FB5F373E3
-:10A82000552C88DF9FBA8CDFF4275CAFE62F19ED3B
-:10A83000350CFD08D562F0E1F777996AA573778743
-:10A84000DBF1A34EF5CAD4BEBFAA60BF9F887E9538
-:10A85000E237F9B9BC5EAECDBDF05E4FA9B305F3EA
-:10A86000E29B3F323B6B919FA3F87750F4FED6E119
-:10A870005EB9D49F863F3CFFFF0BB48FF8A158FA16
-:10A88000DEDEE73AFB090B867E5E88E6F091974FA5
-:10A890004DF2A585ECF527BD2E903DCDB57599817E
-:10A8A000F1B2B2D697C0F72B03245F7ABFAD5DFF3C
-:10A8B00057E7A79DCC7305116FDFA35D2EA47355D9
-:10A8C0002E63BFF6DF7F21DA7D17FF1E8C4BC5712B
-:10A8D000353C69F58704DD0F8BFEDAF0A2F1157EB9
-:10A8E0009F2621EC1EAC6EFE1ABE561ED91BC42339
-:10A8F0008CD7BA1E6D1D11F8C77D05BFFB7BA2AFBB
-:10A900008E7FD858A7B8A71BD9EF33093F329CFEDA
-:10A9100083695D7E6DFD6C783FBCFFA2DD5BE7FA6D
-:10A9200050BB339360AFB367821CDD7E54A5730EBA
-:10A930004CEC831BDBE859ACA09D318E505862581B
-:10A94000DE55BF9FA8CF1FE8CF9515377791E0EB75
-:10A95000CFCBE7CA5C177B5ED6AE94D986E8EC52C3
-:10A96000A9CE6E8DD1D9B5893ABB27E7C58DCCA8C4
-:10A970007D6748ECD72B0EFCFE8E916328BC5E7C75
-:10A980000788E37B793BF2DB767EB69783F0DE26A1
-:10A990001FEB9883D3CF27DD33516D1EA2F3A303A2
-:10A9A000343BE6A4B8D71C1844DFF3343BE5BFCFF3
-:10A9B000E0F75A3F2ECBC17B368CCA67BCF68FCBF3
-:10A9C000E83E4E32954F791DF47CAD378FCA27BDD6
-:10A9D0004E7AFE84B788CAC7BC2E2AEBBCE5543E2B
-:10A9E000E47553BBD5DEC904AFF27AA8CC02F706F2
-:10A9F000FFDE40968F3961C62C7B158C1786E74C9D
-:10AA00001FCC230C8F5D17DB2538BD26596A9F5A52
-:10AA1000E590EA533C79527DE7C94E09EEE82E9263
-:10AA2000DA2796BB24B883AB5C6A1FEB744B704C7F
-:10AA3000DE64A97D94C323D5EFB97E707CD365E431
-:10AA4000B9CEEB3A817858ED759FE0782A3FC1F195
-:10AA50003399CAB9BD3B107DEDC67A17DA6D7BBE5E
-:10AA60009DE1F976B395DFFBEE60B42B1DC2FAEFE2
-:10AA7000E082FEA4F9427F523CE7E7E789F3DC2756
-:10AA8000E4794F96DE0319243BA9F931C3D5B458B4
-:10AA90008CC71E34D9FFBD3FCCE381E12AC37B2B99
-:10AAA00047CA26525E04AF6CB2087AF40BE19FC627
-:10AAB000F4B652BC38FE0985E23B584905E61167F9
-:10AAC0001DCD7686FF3D28AD3CFC1BFEBDA1983D0B
-:10AAD000DB1C98171B5F3C2D312A2CFE1B1FF8B185
-:10AAE0002C85FAEB3B200AE6317EED34F38CFCD06A
-:10AAF000FAB476B39E90FDD110FFFBADC21FA775CF
-:10AB00006AFA69B57D3D3D5F9D77F97D9BB3625DD6
-:10AB10005F097FED0BE1AF9D127EF749E1777F2A58
-:10AB2000FCEEE3C2EFFE58F8DDC784DFFDA1F0D7ED
-:10AB30008E0A7FED3DE177AF147EF7EABCF5F4773E
-:10AB4000AD2E6C54987A99F3A57337C8EBAC5A279D
-:10AB5000EF1BCE7A42F6BB673E24FB6BD397CB7ECE
-:10AB6000F71D8B657FEDB61AD95F9B5225EBC75B4E
-:10AB70003CA5127CF364392F77935BDE37D4E8343D
-:10AB8000B15CD6939664D95F6B6FBD5B03A354FC35
-:10AB90003B2448CC5361F630EC7BF0D279C702BB42
-:10ABA000AB14F76B0A997B19EEE70C3504DFC7FD90
-:10ABB00026F6A14ADF816CC0370681BC5E1830766C
-:10ABC000BC23CCEEF864BC4E3D2EE7476EBD47F685
-:10ABD000832BE7C9F18CB95CF6835D69F27EEC44A6
-:10ABE0009DDD61C21E9AF9EFACCC7D793B648899FA
-:10ABF00047F795AED51E9999FEFC18B747346E9667
-:10AC0000544FF628AA0F3F273140DC53A88D1AF87D
-:10AC10000EEEDFEDF988DF2F00B407BBC1FBD733A1
-:10AC20008E6FB375247D3F6EA789DF1BD89D62733D
-:10AC30002E85AAEB2FF2FB01ACD548E7C73C786F15
-:10AC4000240BFB95CF8F15068DD2F932B3AE3E0D96
-:10AC50006DE265E7C3CFD1FDEFCD479CE3E8C3FAD2
-:10AC6000D0F988A6C8F70DDAFC381D9F6AFAA7202C
-:10AC7000C0FDA38276FDA3A9F49D31E3878CEED9B4
-:10AC80005B0C2D679EC3FB515FF23CEC3026C76D19
-:10AC9000378E95E3B6E1F6CBC76DA31C32BF8EC9E4
-:10ACA00093F5408553D60397F8354DFC1C627B7EA7
-:10ACB000CD4D7DB2B47B3A849FA89C7D317C1F939F
-:10ACC000F3CF10B1CE47CD6EBABFB23C9D119D8679
-:10ACD000D8F979C55ADCB7C1F37F1FF07B2F46E660
-:10ACE0004EEC83E5E911E2FCE25827F5D7CCE955B3
-:10ACF00004FF7ECEBAF47CA2256894BEBB61646179
-:10AD0000F485FA39C85F1D437CF47F675EE2FB0877
-:10AD10001A9FD912AEB07FE793FC40AD1C1674A900
-:10AD2000B88EFD76BE8FBA3F5813C4EF447E9FCCD9
-:10AD3000F314F7A74D30F2EFB6B86CC3812E23C4DD
-:10AD4000FA8BC43ED9162F0BA23FB7C96BA552DBB5
-:10AD5000FF5C99BC2811EDE6960C4F2A9E0BDCD2C5
-:10AD6000B1C372067A7AB3A9435AA47B048DA68133
-:10AD70006467B734A618D10F1D66B41BE97B52690E
-:10AD8000D355CCCF8EC4FB26490833DAA7DBE40DBC
-:10AD900004CBE85CA887CE11C13A4AD18F2DB34FBE
-:10ADA000A3BFF7D8F801C88503FDE30E53F1BD7DBD
-:10ADB0001DF9F96B8B9D9F6F1D91349BE855E0E465
-:10ADC000DFEF2B48B339FDD85D32FF8E4F15FCE322
-:10ADD00074E17602E45EFABECF40160623BD74F03D
-:10ADE000D37A3DA03B97B8F298383FD71479DFE685
-:10ADF00033E1576C117987E3C2AFF858F8154784EF
-:10AE00005FB15297077A5FF815FB441EE880C8E7E8
-:10AE10001D14F9BCB7845FA19DBFD6F822791573C4
-:10AE200058E2197B771AC773CA2AC55F0EEB289DB3
-:10AE3000C9E1E4C57C7FB4ABA7CE5D5280F526E7BF
-:10AE4000485847F2E4BAE1B88E94A92D744F69B21C
-:10AE5000C7EC7029783FE929BA17A5DD0BBB93A38E
-:10AE600086DD3E7304E9DF3B3DE2DCB1DA5C48FCA1
-:10AE7000F58489BE93A47D3F6EF24CF97B4AD3756D
-:10AE8000F8BD5D079B15AE47DED1E4A23FEB1F8EF8
-:10AE9000F714D136EA4E719E172F5D459097B50293
-:10AEA000EF1A5E1AAF1F1DCBD7C1F7432DA29FA388
-:10AEB000C5B7C6623F1FA4F1FE260879D0F7B75A7E
-:10AEC000EB4FDCA78916F47FB4E7E5CF9D1EF63281
-:10AED000E99CE961419FB67E4B1E34E1F7B4270738
-:10AEE0001E48477909DDAB71C5F2FB2B63FF3D13AB
-:10AEF000E8B45ADC43D0F4EACD427EF5E37DE0BD10
-:10AF0000FCFD9D0F4AA698F07BE837057EC5FF1E25
-:10AF1000B0B12639FCBCEF07383FD095F7DF743766
-:10AF2000FD1DC96006E707CB8D16077E67B06B9ADB
-:10AF30006B05E23139CD395CE447C99EFD3FEE81B6
-:10AF4000191B0080000000001F8B0800000000009B
-:10AF5000000BED7D0B7854D5B9E8DAF34E32810958
-:10AF6000049C604227E161AC04262FF260083B108C
-:10AF7000344524131221981026099068D11BAA3D4C
-:10AF8000D27B68B321218418799C6B3D50090EF85F
-:10AF900068CFB99E1AACD7D27EEA8D8AD6DEA312CC
-:10AFA0007A430B6DC5F092F66B7B2F5ED49ED3A3D4
-:10AFB0001FF7FFFFB5D6CCDE3B93800AADF634F920
-:10AFC00074B3F65E7BAD7FFD8FF53FD78E93C18F57
-:10AFD0008F314BC25E65423263CE62858D87F6A6A5
-:10AFE0009245694333185B5EDDBC98CD64EC12FE7C
-:10AFF000CC83E7CCA60D65E24BCC724981FF8799E3
-:10B00000CF361BEFE31DC37376291DFFDFCA82898C
-:10B01000703F78CB6F719C6AD6EAEF87FBDD79EAE7
-:10B02000040F8CCFEAEC67875C8C65C2EFA58CE8D7
-:10B030003CF25ACD6CF45C8EB76431F497E3339AEA
-:10B04000CFF07C6B17F339C742E323806E22BC2F0D
-:10B050009E6DB5855D385F77F05E97EA662C23D5E7
-:10B06000D2E004782AD236AF64B06E56E9F44CC30D
-:10B07000F7030BDFCECD836BE65A1F2E0FFB354354
-:10B08000BFE33776A6F96644E1DABA8D9584609E0F
-:10B09000AD697FE75D9B88FD3E6C0B613F3BABE993
-:10B0A00083F1BBE7FF2E35DD1DED7F7056E94CFFC8
-:10B0B0000418B01CFE97C2D8744728C33F63F87ABF
-:10B0C00019D3189B80F88F670CE038D3A0849D00BB
-:10B0D000574D0FE06F0C3EBFD082F71B7A9CBE6EBF
-:10B0E0000490A9EEDB609D6BF93259C3B48EFC7EEF
-:10B0F000B8AEED01BA61FFDDF6D3882F17FC227ED2
-:10B10000D35A6DA723F8C2FE4CD7C6794C6D07CE33
-:10B1100001F0DEE24F4C7EF726F8772ECBBD64E5DA
-:10B12000F447FCD688BE710D556319D2D30BC82CD9
-:10B130001ABEAE15FF6665FDE319310CCB8FDE3FFD
-:10B14000B17A4A7C08DF43BE7109BE9A453CE97377
-:10B15000CC46FA73BEAA167C05ACF912F19566D7F7
-:10B160002270C2BAD87DF628DF6518C66308EF32B0
-:10B170007D9BDE578F4D05F8570AFE5F1968E1F891
-:10B18000BA8FF3A30B6E8A71A2FC06E3044DFC4751
-:10B19000F49A28E084716E2F2BFB1F3F059C3DBE67
-:10B1A00033E336A4D3EDDFB4322BCC5705DDB05DED
-:10B1B00055A384C3D05E16B899E461997E7CB85FCC
-:10B1C0005D6D3FABA7CF3B1BA7D038ABCAF9386C3E
-:10B1D000A36E7E826F27E133C8D8168F8EDFDE4DD7
-:10B1E000675319E0F1A53DCDFBF0FD73BB9C0CF955
-:10B1F00088E1BBB391EE1CAFC7807791FFCF6F534F
-:10B20000C20700EEB37B9C04E7BB6B943043FA3378
-:10B21000CF93FD70FF017F12CD732E2EB4EF1BF084
-:10B22000BC716B825F83F5768D6BBD2708F39E4BF7
-:10B230000AD5E3388D5B6FB268D0BF2B5E7365E0D3
-:10B24000B88D56FF019862850D703A0EAEF0EFEBA7
-:10B25000E1DAD0A5A31FFC37E85788EF975858A824
-:10B26000CF3D9C7FDCD90ACD8F0877EAE05F926101
-:10B2700021788F3FE42478C764FB689C86C2383508
-:10B280006E0CD291A9B61C8027559D8C709E55409E
-:10B290003E81DFCEDCAE68881F66E374715C3F6977
-:10B2A0003FCAD33F89759E7DB06032F2F39924FE88
-:10B2B000FCB4373E8CEB3AEDE36DCDEB0E3F81B243
-:10B2C000610B652E4BE4EB50800F1A055C8D3E8BB5
-:10B2D0001A07F46D7C68F95791CE8DDE9EF5783DA6
-:10B2E00096A8252AF0FEF93D5686F8467CB872F0FD
-:10B2F0007971333E37E3E5037F06C183F81B0F788E
-:10B300007B77777B6208D6C13C2CE49818C543C391
-:10B31000CE1FDEAFCC2479D6B8BC733951986E3FBE
-:10B3200006FE5DE17368E5300E3B3C95F876858757
-:10B33000F3ADA368CB840CDECD1DE10F1FB57B7090
-:10B340007F6F14ED06E45BC0EB0A949799888F71C8
-:10B35000B3FBE17ECD6A23DF6E49DEFC6015AC7382
-:10B360004DA19D59E1F91AAFCD2037951B8C720480
-:10B37000EB36B4C767335A77D738C19F9D9C3F815E
-:10B38000D32707B3A27CD1EBB748BEF0D947C1BFE2
-:10B3900019AF5F343C9C467E057D7326CDB7AF88E0
-:10B3A000F402F00F878B5975F2D0D0E524BE67C048
-:10B3B0001E8827E04F476556945F247E1A766F22D9
-:10B3C0007E6C107CD7D803FC3346C747267CE19AB5
-:10B3D0006D729E29513EA3E731F8EC453F875BCA69
-:10B3E0005F030BD633EB70B99657A27331D0B36FAE
-:10B3F0005D8D16C0513492E31D25C56389DF053D7F
-:10B40000B8EAA11F17D22D51D2476383B89FBBC59D
-:10B4100043CF06E54419E81BABD8671DEA40B81FC7
-:10B42000EE276DB0D27DD42F36E88FD33224F8F3D7
-:10B43000054F4F87769C68BB055DAD56770AE22BBA
-:10B440009119ED9E71CCA44FFC9CAE52CFEEB4B3DB
-:10B4500014DC8FE3C4FEDEBC708A82FD762A0AD932
-:10B46000078E32231F584D7A605AB685D62FF1C009
-:10B4700084BE75B8F87AE3522C24171FA482425573
-:10B48000A2F87088F58FEBF7F5F5C3F37AAFCB1F11
-:10B49000463E621ED20FA53053BF6EDEEAC509AC30
-:10B4A0005F47E7859EF186F62DDEEB0DFDBFE29B43
-:10B4B00062787E6BE64D86E7B7F9730D6D07D3E9C9
-:10B4C00075847388E3DD21F0AC7B2EF5F200D2B1F8
-:10B4D0004AAC638723E40DC23E5CE55D4BFA7953C9
-:10B4E000C95DDE215887D3CBE5CF81F6248C1B378D
-:10B4F0006DB587EC08A19F0BE117E9D08E83A444BA
-:10B50000F9CC61C2B359FECCF6E4DA6CB07B12A080
-:10B51000F165F665B27BDCE362DA3766FB0D7484B5
-:10B5200005F9355ED06BA1D54D7A636B35D8730ABA
-:10B53000DA974BB9BD94F95F88AE41D18F6916B2E5
-:10B540005B9789F54BFBEBAD36C6FA6F007CCCE719
-:10B5500076D6B2C20BD57ABB5C5EBB453FD98E2F87
-:10B56000DCAFAA31F4694736DF371302FCF9321732
-:10B57000B3A11E92CFB764737DBC4CE8ED2520C704
-:10B58000C8B71578D5D9ADBB049FEE8AF02B1BC880
-:10B59000D1CBE9538A0DF110279AFB596857F6046D
-:10B5A000C4B3469DACEE2023F9FE08B03B9BEC18DB
-:10B5B000FA29CD5EDDFB75F447AA13FDE85B38D5AB
-:10B5C0008627BE0DF88BAF4EF05B7C517E27BF0304
-:10B5D000DAC9999CDF6B525D7E7AACA983536747C9
-:10B5E000EDB26A61DF4D60AD2407C3FC1817E7CBED
-:10B5F00091FD18BEFFC8F99C62FF67D68D7EE2BB45
-:10B6000020DFF72DF08B7C777B8D91AF968746E717
-:10B61000B31F640BFBBA8015109F85D6115F3845A8
-:10B620009F1D93815F389E883FE2257E85BD6DB763
-:10B63000B17E1BD0E908D21F8074DB5922AE734063
-:10B640007D85E4622093D9F57C100C58D5B08E8EA0
-:10B6500003452CDE03FA65C0CED27641BF31EAF253
-:10B66000451E58DF40A933B18136D5B0C16E3F02C7
-:10B67000E39E72B311ED7DB33C4C877FA01ED89A38
-:10B68000F6AE17E1D96A67B4DF3376B106E1DA2E98
-:10B69000DBDAEF6A4AB11D27DB1FEE56A1FF93F1FB
-:10B6A000BCFD61F6A5DD5A2AD18BF82A41D0234191
-:10B6B000DAEF337478053AB89273689F7199F06D38
-:10B6C000B6EBA59E30EFC3E6797F27F70341A7913C
-:10B6D000D63D0C5E60CD2F8F2E17EFA35CB8C05FF8
-:10B6E000D6CBC5F071FAC97EAF15EBB6243C9F16D8
-:10B6F0008AE14746F0BFCEFE7BBDBF00783EA4A0E6
-:10B70000DDABC2DBB319571D308E52F8DABFA3FE92
-:10B7100057766BE3108F56E8807ADECE42048F9422
-:10B72000D738E4032BE2BD9F9E83FE1D52A6E02086
-:10B73000751EE45F05FA5F42FC5CE93E59CEF5DA1E
-:10B740000AB1FF55E094305E45172B45FF3C6E4D26
-:10B75000D3816DA8E754275A1470FF4229C207CF3E
-:10B7600055275D2FA84837E06783DE79A9E44FBFEE
-:10B77000790CDEEB1CB0FA9D306E67E0C70CEDEE85
-:10B780008B33981F17DD811D01BEFA9067A1C38717
-:10B7900072D37FBC631A63A7DAD840997D38BC03A3
-:10B7A0002FC7397CB0D8909634F35918A7ABD0E99D
-:10B7B000417BEE9D8D5607D26960738386C83891B0
-:10B7C000A2F52970BFCB1662E8DF3B36B62F44FEE8
-:10B7D0003E61D7FCE3E0DAB559BB1BFD10D5B7B825
-:10B7E0003C1DE03FD0652B0FC7D89FD7E7707FE7A0
-:10B7F000AD97EEA4F51F4971F8E360DC218C6F0072
-:10B80000FD8ED877A6F971DC4DFF2D0DC73FB266CE
-:10B81000ABFF6580EBC826277A52ECC81E570D8E09
-:10B820007B646EB377AD6E7CD7F58E56BC3F30C966
-:10B83000E19842EB792FD18BEBD9983B1E79B3334A
-:10B84000C531B9099FAF6D66B85E8777A71DD7E789
-:10B85000B2B1DDB8BF7CC97BE1CD02F4977C96D94B
-:10B86000B740FFFFEA0FDD9A83FEC986530B512FC5
-:10B8700039CA92B6E0B553C029F72B49DFA19446E7
-:10B8800017EE639DAB9B781CC66B69203AA6588265
-:10B89000B81F7506D6B8A6CFE0F79BC70CC74B27D5
-:10B8A000C65D66219C6BBD6BB3B0DF876D21E83749
-:10B8B00034D759130B8FCD395C8FB9DA9B333600EF
-:10B8C000DC9D7B5C1EC44FA712DADD0078D5D2DD8B
-:10B8D000FE277CC3DFFB81784FF207D089E4707DBF
-:10B8E000CEA43D9A0DED554E47C08BCBAED39B07F2
-:10B8F0006795AECBD1ED93C3E64DE9247DD1A97018
-:10B90000B9FE414ECE1E0DC6C9F587EECB81F98E2C
-:10B910007481ACCDA2754E467B7F24F91912CF3BC2
-:10B9200037C1BA63C8FFD06A2BBB612CBF5E07D793
-:10B93000E99BAD939518F8199ADB948171AA23F0CD
-:10B94000DC02E30CED71F12BDCCF40FE1A813FF3FA
-:10B9500072B8BECF9A19ECC6F5B2197E8AF3BD99BA
-:10B960001DECA1366BF562FB0BC0BF8F7D4EF897C7
-:10B97000B149C0AFCFCCDCA3814BCA3CE30C76EB22
-:10B9800048FB67900DD9703FDE54F2A716F407BA52
-:10B99000B31C3EA72E2E28EDE825995CBF05A79D78
-:10B9A000CD839D9B55CD584BFE0DD8CB141FF4C0B5
-:10B9B0006FACF86010E3813A7DB8C4D496F6E9BF65
-:10B9C000E608FB45D8C9A9BE9DC1F9E87FBC61F571
-:10B9D00087016F69F802B42B172B61B4D73795FC38
-:10B9E00033D9F14CD8714B049CBF6C73B1B2692C44
-:10B9F000E2CFAD10F7135A4E3D8EFE7502C63F31B1
-:10BA00005EDBE2F451FC05890FF35789F549BF8EDF
-:10BA1000EC4858CF8A16110765BBB8BEB106F29143
-:10BA20001F601D06BF24C84C7EC86ABBC19FAB35D2
-:10BA3000D90F66BFA1CA6437EC40DB09ED425B9FBA
-:10BA40000BF9E9FD193947327CF458EB97F63DF4D0
-:10BA50000B150E6E19D2ED3F8342FFFCAC4D3D81BC
-:10BA6000FA684BF03117C6E1BB6D6117EA93EEF24D
-:10BA70007B1391EFBAEBACE5C86F036DE5D4EFAD86
-:10BA8000B6205D6DB95C6F54FAD58F703F91F65951
-:10BA90005579E9890E1D5D2BD5AF9CE8D0C15F516A
-:10BAA0005869684BFEAAB0B2D6BE18FB4B5EAE8C8E
-:10BAB000BBA8CC608F5A9FF28762EC17F21ACF6C4A
-:10BAC000EFEBF1382ED768F73E3063FED8D1EC1992
-:10BAD000B94E891FB97EF97C2478FF2347FA279F46
-:10BAE0000DDECC4F08AF194E09FF48FD2B70139B9C
-:10BAF00084F076ACD066201D4385B980E7AA326514
-:10BB00000BE6657E26E2953F0B24863580E7D54C13
-:10BB10001EFF8C6FE17E657C59E542DC9F3E29BDAE
-:10BB2000EF2854483EAB034A58857FDE2CFCD55F96
-:10BB30006632CA3F80BCBE9908ED5FCCB5F338329F
-:10BB40005317DF363BEAA7C6D7F1FCC40E07F3F75D
-:10BB5000E37B37BAFD9BE1FE32297F35C63C447555
-:10BB6000B5DDB0CF5498F20EF1A67D6679AEB0BBCC
-:10BB70006703DEA744F13E92FF31129F30DB853C24
-:10BB80008C8B99F1738F093F667FA7E279937C5C78
-:10BB9000A1DF73A02BEFD564B433CA14FF34A41F04
-:10BBA0003E82F7E2D583940ED921E548F87B325FD7
-:10BBB000B5636915F97B6FA13D3096F24D93315E07
-:10BBC0002DC7977E5EAE5FFD466EFEC8700C8AF78D
-:10BBD000B656C6B61306D14E98C5AFD7C175FAD2C0
-:10BBE0000569B1EC84C1226127C073B40F06F794D4
-:10BBF000F36B91D14E60E5B997C1CB265A6FDCB497
-:10BC0000BCB1B1E46E7056E8E1DC09D17642662B36
-:10BC10002BD3E1FDABD9EA3FE27A2B451C42CE079C
-:10BC2000FAFDB0DE0E33CF7728C7C3F15C3E9EF439
-:10BC300085BC5E8E7E364F2B433E7BC0AED6A0BD0C
-:10BC4000678E27FD3097DB895D196A0B3E67EE9C96
-:10BC5000CB8CBB49C6AB33B327F2F403C57D4CFE96
-:10BC6000A0F49FF6E3C3FCA85F68F370BF303EF515
-:10BC7000C2610F3C5A971B7A1EF135F74258B380C8
-:10BC8000DC39172B643F395319D93D57EC875D6177
-:10BC9000BF2E146AE0E7AD8D3C1E5F9A6DA3767CE3
-:10BCA000C87A80F605531C275E7D8FFCB02560079F
-:10BCB00088B80DD953C7853D1564ADE4EFB9ED6182
-:10BCC00017C62BCC719B9A544BFF74D0EB3585175C
-:10BCD000AA7D33E97D43DCA7C69771788278EE812F
-:10BCE000EB92208F032DC338108E5F1DEECAC03C2F
-:10BCF0009CDFE65719F7F3D0BE58DE747FD6C3BE7B
-:10BD0000AB170792F125692F4A7B06F44BD778A42D
-:10BD1000CB02C547BEBF294E648E0BC9B88C397E95
-:10BD2000648E177D9C9B4EF490F6978CFF7C946BF1
-:10BD3000B4C3AC3037F6EB2E822D15E4BBDBCED28C
-:10BD400076CEE0F11DB4978E94FEC483F68535CF90
-:10BD500014E7BCC2FDAD13F6A133B8AFBE126747FE
-:10BD60007B3BE80D513C7189629493C9797C9FF3C8
-:10BD7000E4B9F93C228FDCD9B641BEAFA1BE09A619
-:10BD80003AC2714A741C56987F45F2949CAD4ECAD3
-:10BD9000CB277F2415AFCC0FFE4816FA231ECEDF2B
-:10BDA0008513683D4C9DC0CEE8F3C602EE081C2EFC
-:10BDB000F05BB23EF9FC2988E7FCE83C97C3DB8ED8
-:10BDC00092629703E31140632BE72B4F247E9F8100
-:10BDD000719D753EBD5D518F798B5CB43B795E433F
-:10BDE000DED7C5CF6DC8BFF1A9213518635F5D955A
-:10BDF0006731E44F23F1F74C46F922398E8D7937BC
-:10BE0000911CA0AC4A78AC31E2F402DED5420E00BF
-:10BE1000E12E27B04CD34E2BE375095C4E643EC235
-:10BE200056142C4F87F5366D53286FCCB49AC368DF
-:10BE3000DFAF11CF1D22FE66CE23AD117918665DEE
-:10BE40004776DAEA878CF9B5C61E63DB6C97CB7848
-:10BE5000BF0D8044B8DB249D40C15B47C7C37E5AF9
-:10BE6000E75F291E241F2ECEFDAA17EB5A3AE342A4
-:10BE7000BB1B30AFDDEBA27808F990282FFDF00B4B
-:10BE8000EBD9B6B7F0315CCFF63C2B977B85D7B9B1
-:10BE90001C4E79D835A4E3B7ED82CF66E5F978DC9E
-:10BEA00005F72550892C3599E448D6B51C49E1762B
-:10BEB000A523C0EDC6A7A6BEBC94E75D797D4B6601
-:10BEC000205ADF520AF8C912F8C99CB6DADF0FD738
-:10BED000AC00AF4B9AF1ACD15FBD35D36857669AD1
-:10BEE000FD5553FB405EECBA96689E4DC4DD05FCE3
-:10BEF00066B9FA5E1BCFB7FC33F8AD787DAACD43A7
-:10BF0000D7EFB779E9DAD7E6233BED99B64CBA4AD1
-:10BF1000BC3F600FD6635E4BC621657CBC3F8FFB88
-:10BF20006F2CC0E1A8106B59684D4D443C1F0D703B
-:10BF3000BB70A4FDA5AADC1807BD3D68CCEF2DAFF2
-:10BF400031E6F7EE9BA9BE9407F024CCF4DA43BAAD
-:10BF50007CD41AB1FE1D0FF37C931CFFE83739DD4A
-:10BF600065FB9C58FFCF045F24BC9C62F701B12A9B
-:10BF70001FAABC19E3F6CC937345F6E02F855C2627
-:10BF80006CF6D8312E54D9BFC281E3ACD90DE3B8D9
-:10BF9000AF7C9CAD6913D38CF985AFDD81701C8DAE
-:10BFA000E4175AEFC0FCC251915FF843DEBDDF4198
-:10BFB0003F6B569E7A1AF5862B4F3D83F8F883D057
-:10BFC0009BD03EA76FC3CFEB4913478DE3FF212FD3
-:10BFD0007F781CDFBA40698D55D7F2A19017D05BEE
-:10BFE00017711EE68AC4D13EE06DAE8FE2F2397E53
-:10BFF000DA7FC95A709CF61FB3966762D8F32C5F3C
-:10C000009171B98F490F7AA51E0C5E8A359ED5595C
-:10C010003919F17DCECEEB62CCE3C5E53B247CCE75
-:10C020007C7C3F35025F5C7E7E74BC1D808301A4F6
-:10C0300093CD9348794D7637E53F251F25D47B6E08
-:10C04000C3BA05702C19EE2F09CF796ECBC338CE49
-:10C05000CFA7F89F6023D3F5B782BFCE0BF93A87FD
-:10C06000F205727446C8D729942FB89E14F2F5EBE6
-:10C07000363FB57FD95648EDE36D2AB57FDE564E83
-:10C08000D7C1B620DDFF595B0DB53BDB42743D5A8D
-:10C09000F6D8CDB8EF7CF03D85F4F148F0DCF5B88A
-:10C0A000D5203F2D7B130CF2B6F6A1F186F6EA1EE1
-:10C0B00063FEBCB1638AA1BD6A83317FBEB2D598ED
-:10C0C0003FAF6D9963986F456881499E6F35C97B15
-:10C0D00095A1BD309FDB8955E5B586F79CDE4643CB
-:10C0E000BF84A52C148BFEB7E5F3B8C9CB25C56377
-:10C0F000874689733836DCFA36DA2791B62DC4D0F4
-:10C100009E776C5842F71F88E3FB9DF9BD26C1AFAF
-:10C110009D65AB83F319DA458BAC7ABBE79E59A1D9
-:10C12000E5F93A7FD0E1E5FED8C5A9D5562FF0D183
-:10C13000D2B2F75EBD0EF82834C0C8EF51C1DCF3AF
-:10C14000821D5CD8BA6BC175D0AED6D61BFCC7E2D7
-:10C150009683AF80F8B240D9D1F664783F3F3BD4A4
-:10C1600084E397782FBC82EFCF5F9C6D43367F20AE
-:10C1700089913D7A2ECD113E10831FEE1770CBFCB6
-:10C18000D527DDA7CD79FA8C4C568A71E48CCC0B7F
-:10C19000A5A8D7A0AD62FEEBE0ACD0FD081FDC5730
-:10C1A000514F3E90B53603F79391F2468FE41BE36F
-:10C1B0000912AE1D251C9EA322BF3064CA2FE8E2DF
-:10C1C00009EDF9A3C413CE89F786BE1D3B9E704EC0
-:10C1D000E41DCEC9BCC3C35531F30EE7168A7802FD
-:10C1E0003CC738C2B93D35FCBA70F4BC835C1FEC67
-:10C1F000477BF20D790761E78BB8F9E02C752F3E8C
-:10C20000FF6AB6DA8BD73F66A9FB108F4775F94FE7
-:10C21000CF445DFEB3EC2786FCE7A19CD093F93CAC
-:10C220006FCDD0AF6AD7D850DC14CCC706EF89C524
-:10C23000C7CFE4CBF862FF67CACFEAF2A8964B37C4
-:10C24000B12BCE035C71BF425E9762B66F121023B2
-:10C25000E3A276DFD379A19F20DE3A929EF3F1FA32
-:10C260002B4B74FF40E537823D649E4F8E87FA0A60
-:10C27000F5D620480CEE33DB932ED4A19F724CD020
-:10C28000D37C3D9E2FE8C93CC948DFA7F382BF207D
-:10C29000FDF36C9F8FEADAC4FD2B85E34947F06D0F
-:10C2A000B4633B1BADBE03DC6EA7B8C50D81A470A3
-:10C2B000B72E1F7C11F7CB7C8C3F0E4D7500BDDB7C
-:10C2C00043AFB8B11EFC9DBD36AC8861DF4DD4ECE8
-:10C2D00048FF9A4CBEBFCDF786BE34348A9C033FDC
-:10C2E0008CB778090E8BA590CFCAAF9A825773FF8F
-:10C2F00081BDEF4FF0C178DFEDE5F9AF1B7A57BB99
-:10C300001A75E3DF305BEC97C83379989F54C258B5
-:10C31000A85E1378EFCD02CCAFF82C14E77867E372
-:10C3200007C79663DC51B552DCF19D8D17A97DDC02
-:10C3300067C945F2BDE3FD7FC7B0FF0DDF5C3391F8
-:10C34000FB2D1C1FAB36E63ED99D4E7931C76C984C
-:10C35000E7B87A3171CA8C68FE6C95C282B1EC98EC
-:10C36000C9B339FF2F525BEF40B816859C0CEB9C8C
-:10C370008F376C7D1BDBDF2D557C56F4EB33F93C9E
-:10C38000357B6D544F0BF85987ED37FC090CE79D51
-:10C390001F3A68C3FE1F6629EC3AE52AE255BD380C
-:10C3A00001E5F01DE4BF18F05F94F22BE468BA0DCC
-:10C3B000E43E07F17FD8AD8F534A7ED2F2D4CCD978
-:10C3C00014F70BB504C9CE5D7A19FB7433AFD3FEF5
-:10C3D000DE051BE61EE21F6F9D84F1A561708E00D5
-:10C3E0005F91A0FB1FF3791CF3865EDB9B5F417EB0
-:10C3F000DE68A73A845979C139B3F5FED655DE37E0
-:10C4000064FDDA40213F8F00E634CD03F066DA00A8
-:10C410008E3825DEAF71B9A2F89C4BEC7FD04F1D52
-:10C420000BFD56B1BE7E8CF3319BBAD38AF1C32289
-:10C430003BF9C7CB57DA13912ED17C99DFE06F9887
-:10C44000AF67303F46751A2EBA0E809F8DF912FCE9
-:10C45000014B1C1EDA84DDEF7F449D0A722FEA4AED
-:10C46000EF3F74EB2358577ACCC2DB771DBAF5FA4D
-:10C47000CDB0A433935B8FDD0EEBEADEA5F837F980
-:10C48000F0BA7F77239EAFD8A0F8CBA16B7DFF8D4C
-:10C49000F598626CEE72928D7F7ADBFD3723BF5E7A
-:10C4A000F4320FF2F3F214CECF4D832C6C81F62DC3
-:10C4B0003DBB28EF191CB451DD9ACCCB9E4CE179E1
-:10C4C000D97F68EB27B8D1AF5D389BBBD8F833CEA6
-:10C4D0000F70601CB5CC46F9D2F1CCD389FB4BBCB4
-:10C4E0009A5ECAED698F83F23C8B19FB0EC67936D2
-:10C4F00070BFB948D445CA3C163BCBFDDB16F845A6
-:10C500007D32BEDCE81FE79BFC5FA9DFCCF916E0BB
-:10C510007F0DEF77CE4E34C4EB468ADBCBEBB360B6
-:10C5200047E0FA9E1379DC4360AF633EF3C760AF28
-:10C53000E3F579B0D7F1FE8B60AFE3B51FEC75BCC6
-:10C54000BE0CF63A5E0F83BD8ED7D7C05EC7EBEB4D
-:10C5500060AFE37BFF0BEC75BCBE01F63ADE7F7685
-:10C560002EDFFF3AA739C29B01DE4E3BFB35F29529
-:10C57000562AF2C2224FB62D693AEDEFAE8F80CB2C
-:10C58000C19E1A504277213DB43417F51B48BCF0C8
-:10C590001FFF17DBDBD2C90F6136DFA12178AFE3C4
-:10C5A0001BE9FE6E68763918E9FB53479947017B12
-:10C5B000E6FCEDCA4C8CA39EB94DE9C3F6C06D0AEA
-:10C5C000D913D351F472A2FB68F1FBBE03B89FB537
-:10C5D0002732C18F4FF6AAC07FE71136E4572DA945
-:10C5E0001EFDD2794ED91E538FCF1B3728C24F1D47
-:10C5F000B74F85356C53E4FBA9BDD8BF43BE2FDAD6
-:10C600008316F9FEBABDE8271F8BCCB7BA564D8505
-:10C6100076867CBEB60EC73F15A9AB9BB712DF1F4F
-:10C62000888C3FBB17DF3F9326C7BFB396DA76D916
-:10C63000FEA795D49EC0FBCF7AE1BA47B16EE56AFA
-:10C640008FD71EE2FB1FEC63AA3E9FB3A9D84AFB1B
-:10C650009EAE1E9CE26E32CF6F49704FBB9278A99E
-:10C660002ECF4FF15298CF8E72F6F5D2A4C9A8778B
-:10C670004FA5F963FA29E5C591FA5663FC5455783C
-:10C68000BDBD8785B03E3E5EDC8FEFE175F48E4C1C
-:10C69000DBB03AFA2B8927CABA07194FAC593D7A51
-:10C6A0003CB1A6D4184F5C259E8F144F5C658A2739
-:10C6B000AED868CA43843E593CB18EF5DBD10F63D6
-:10C6C000AA427254E7E97B7522FAFB677D144F6436
-:10C6D000BED729DE2ACF4FE0FF2DB3F1BC196F9FE3
-:10C6E000BF5BF1A25FD17DB73211AF27EF5626A114
-:10C6F0007C9DBD5BF1A0BC7D589041F8CFFF8DFFC4
-:10C70000751FEEB75E8B9FA323F802A62A82AB9318
-:10C710007CDD30CEA9BB9571F8FECAFBD21DC80FD7
-:10C7200060770A7EB4EE45FEB426288676DE64C9BC
-:10C730008FE147503EE68D176D6DF95E949F5287ED
-:10C740007C7F33B5578414D1FFEB7B51BF1C9B2FEB
-:10C75000FB4FACC3E7B74F91E31D20799C9720DBDB
-:10C76000BB49FEBA22E37DFF11ECFF0BD490D4DE6F
-:10C77000B917E5BDB452E8336D268DDF5927C7FFE1
-:10C780005A2FC6AD6A2DF2FDC524FF4D4CB6C17EB1
-:10C7900087F6AFC4FE70D70F3FAEC5B8D61DF2B94D
-:10C7A000F6F123084F9D68AF2BF897BDF8FCAF7EDC
-:10C7B0007D7FE6F9CCED956C60E1757951B930EF8C
-:10C7C0002B0D45DCDF296C3988EA8BD5B5EEB7A295
-:10C7D0003C46F36A29D541E46F9795EAE7825E7695
-:10C7E00073AC7AFE4B057C9C8D05579A5F8B3DCED2
-:10C7F000DA22BECF75CD6731FDDC83B3E66F2DC87D
-:10C800008FDA0D68223AE05A02570B5C3FCE0A3DA0
-:10C8100088CF91D618879171ED25A29E7853C9775C
-:10C8200082F3F1FC5291DD2FC2E103FA7CAF4D9C03
-:10C8300073AD9DCFEBBC42DD4EF2D7AABB441D8940
-:10C84000D54DF908DBF58EFD943713F9D410D61DBC
-:10C8500067505DD7A8E73B6CA63C6A97586F69F6AE
-:10C86000FB94A76E7A83D70BCB3C76BD80AB09F5E2
-:10C8700032C0DDB85A095BE0BD46543C98D7CD6460
-:10C88000615F7A34AFBCA2CCD6EFC07361E27C06A4
-:10C8900013F670241F5EEDEBC3FA189B1AE757716D
-:10C8A0001ED61FA4BA38CC17A5B348FE59EA91CAC0
-:10C8B000E6EBEEC63CB54E6F519E3A9E0DD31BA4DF
-:10C8C0001722754D228F1EA9CF117A40E6A71BC4EF
-:10C8D000BA9645F4C0E22568E7C63F20F2D422FFAD
-:10C8E0002CF3D495A6736D8D810563289EEBB7F963
-:10C8F000A9AC26D5789E29DE44879B8AF9B94A9946
-:10C90000A73E5A60CC373F6067A477BB328C7CB7B8
-:10C91000A098E743FCC5320E19DF1F87F6377391E5
-:10C920001FD28DF19CB1DC1FA1C35CA6B88E6D43F4
-:10C930002DC51FF1B9027CA864BEF6EFA897B15DC2
-:10C940000CFD6D78BE05E9E1B6903F2AE33F68A68D
-:10C950002CCCA138D079E467DB867A1A479E677FB2
-:10C96000323EB67C5C2C9079D63E3BF6ABF5BE767B
-:10C970001CE7FBCC7120E18745EC181FAF7F995471
-:10C98000E09376899D9FF763F6A559142FF9B800B7
-:10C99000EFCFE8F3211C725FBAA3E839DAC7AE3CE7
-:10C9A0000FCEDF5BFBA3976AB5E491F3183705223E
-:10C9B000790737A6C059B2CC3BA889D88EEA595816
-:10C9C00048A141CFD6B5FC27D0B351BB3FA30E9FA2
-:10C9D0007FD1E0077EBAA590EAA778FCED8B06FF31
-:10C9E0001BF96A3DF2E1B59EE7C5FCE03A9C67ABF6
-:10C9F000A2D6B8E95C0CF32BA3E70BEFC5FEE67CEF
-:10CA0000E1E5E2187F8B5B8C1EB7E82D34E6F53F3D
-:10CA10002F718B7F04DCE13E09F27490E429C0E5BC
-:10CA2000E9AF7DFF83F51EC1F56E55FAC2F1D6ABB5
-:10CA30001F37783A2FF46B94A3E9A9AE06B4676068
-:10CA40001E1FCA5F341E0270171AE2217B5BAE41C3
-:10CA50003C04D6F97BD27F659CAE7F05747314E1EC
-:10CA60007A546E47FC15F26506ADAF8FAFEF2F30ED
-:10CA70007F4E11EE034F717E89E287DB493AFCD489
-:10CA8000B5FC65F07333C17788C3F705A0671DD186
-:10CA9000D3CFE1BD9CFFBDBE80FB17F05E13BD97F9
-:10CAA000C7F9E05E6157835FBEE03A5FD42F4FCE97
-:10CAB000569B8BB89D7B6791A1CE54BDAB6874BF6C
-:10CAC000F99EA2D1FDE6FBF0FD2F8ADFBCBF80DB23
-:10CAD000FBD1BC4DD8C53FBED142F9E57AD1B77B79
-:10CAE00043D5A21BB1AE06F08F6D27AEC7AA5B4F30
-:10CAF0009A8DFBDBA6F36AF27B07725D366BDDD89D
-:10CB00007E5F149F6F8D6975E079A86635A913CF94
-:10CB1000DD2EE8788FEA061DAAD3877EE197BCBE9A
-:10CB20004ECCCB56A97CFD8E160F9DEF93E7DDE42E
-:10CB30003994E6FE1B5F73E0B939F05F5260FC8AFE
-:10CB400032FB69FDBA9DA6732936537BC3AFD3B7B9
-:10CB50001FD6F57FAAC8544F687DAA9CBED3D1A129
-:10CB600078449D2FD565348B313695DCB108E39739
-:10CB700060C7F9100F0B76EE1AC07C9AA3C34AB9AE
-:10CB8000F33FB6F9B61F06918AEBB552BCE1830DAF
-:10CB90000AFFDEC7629EC76F12797C668A33C87847
-:10CBA000B8C463DC83BCFEC35178AA8CCE37D6AD43
-:10CBB00019C8E7BC43F1061B878CC9EF6F540ABE46
-:10CBC000AA0FBCD781EF2DF35A0CF543E678848D7C
-:10CBD00099EBE4791DA74DE5759CB64C5E271FCFF8
-:10CBE00054FA5E47FC962AA267A5CAEB38C14812E0
-:10CBF000DFDDE274A908ACA73A1F731CC159688C29
-:10CC00004398F9D24C8F93267A3C61E3E7933A0735
-:10CC1000AD7E0D6E773EB4BA0BE3E7DA43168A6356
-:10CC20009C95F5210024C6F397B3087EC95EEE6C8F
-:10CC3000E5F502922ECB77F2BA11EA6588DBA732CE
-:10CC4000FD773C968BB8C21DAC8FCE3BAC6443766F
-:10CC5000948355184AB7623CC647D726A66D6184AF
-:10CC6000BF50573ACCF744EB783FC6B5FB27D99372
-:10CC7000DECDE47E442CFB359AAFB5B1777571FEFD
-:10CC8000BFC5B53E695CCBAAD1F952AF233C4DB9C3
-:10CC90007C5CEB88C84BC8B8D6D99DE27B1BE2BC54
-:10CCA000C580BD75F24E37F6F3919E19B377F92220
-:10CCB000E48323BD3FF188F3AF1B278EFE5D88829E
-:10CCC000E218F5A43F2F60345E67FA109DA33E6919
-:10CCD00037D6E5CAEBED0159BF19528B75F631F322
-:10CCE00044EA38E717D346C0CF6BCB38D3BADCD091
-:10CCF0002D787FEE05C10F8B95B002EBAD702BAF99
-:10CD00002ABEE8FCCC5C47FFB77C18C11D87F80140
-:10CD10003C0EC4F1BADA817456F34C0CFADC389745
-:10CD2000EBD181ECD8F493CFC13EB9BF7802F79F25
-:10CD3000C6F0B8C2EF1DA3C715BE551C23AE20E92F
-:10CD40007B709EAA71BAF3B62727D489FDDB4341D5
-:10CD5000AAD739DF63F56D42FCF7B7BE5508ED255C
-:10CD6000DFB27A301F7EADF37C930AD289AF2E9763
-:10CD7000E7FB50E0F764A4AEFB5B944FEF8EF867DF
-:10CD8000DC7EAC1DA76BC3965C3CC8FBBF585CBC8B
-:10CD90000FCFD98F646FDE1758D58BFE9CB437A1A7
-:10CDA000BD12DBF27D9084C9A5A0349B5A643EB1CC
-:10CDB00082F2F5D1F956EC43FBF8ACDD38BEB4573E
-:10CDC000078ACBF7A1BD1A8CCC5FBE0FEDD953A655
-:10CDD000FEF47D4A18EFD7C565D4BF91C9F1CBEAFF
-:10CDE000B17F24AEC8D6933F7ACC21DBF7D4A33DE4
-:10CDF000BE3D9D8F371858DFAB7D0EE1B9D6E37F7E
-:10CE0000D2FE23D9FD27EDBC7E50033BED89742C67
-:10CE1000A3ECB372E1531D78C6AE5855683FFA9340
-:10CE2000888307DD16E1E76CEC45BFA7B644F2E95D
-:10CE3000E354073212DFAD7FFE478F68FA756A3F11
-:10CE4000AA35C0ADB5529D8884FB04F68775D4DE43
-:10CE500073A717E1AC95F10DD6D98BEBEB4C92EFA4
-:10CE6000DDB40FDB23CDBBE6F99DBD88EFDAC83C0E
-:10CE7000DFA6F76BE3E578BDD48EE2F300C54BA2E5
-:10CE800070B518E07A2D70A017E10A7AC25B707F46
-:10CE9000087A19EDC777B46CA2FAEE881C693BD208
-:10CEA0004A510EBD9136C757448EEE2739BADA7013
-:10CEB000C17E9A3E07F7BF4CEE275EFD75C33E89E3
-:10CEC000EBEEE17A48F2519D478E03F8077DD2E4FC
-:10CED00093EDAFD5B7B8AFC6BCDCDF0DFE9E917D3C
-:10CEE0002BE58969AB4DF27365E3B5BBBF4675149D
-:10CEF000CDA0D763D563DF5B10D14FB7123E0BA532
-:10CF0000FFCCA4DD5181F72376872F627754CE8939
-:10CF1000617774629DD52CAAE722BDA9C213AFAE7A
-:10CF20000E68C65C9E076C177592799BD95ABDBF77
-:10CF3000FDFD79DC9F7F6A1E874B7EDFF6CC3A854C
-:10CF4000EAC4DA7BA68CC1F36EA7537DDB51AF0D2B
-:10CF5000A45BE83B0527C5F73507BEE14CBB0FEEE8
-:10CF60001F4F73F9515F1D4FDA49DF513BEDB70A8F
-:10CF7000FE3CF40EEEF3BAB8A2867A45C60DEF9EDB
-:10CF8000B3F55194A3133EDE2E9CF7E377509E59E0
-:10CF9000A6F97C6780EC18C7CDB08DE0BBE2FB9CA6
-:10CFA000C5E279E5B61F7CBB0AC710F68BD49FE6B5
-:10CFB000F39EF863D7DB5F5D566E7F79793F2F1B59
-:10CFC000DA74C982E3F2B66B84EFC2D6C8F3CB261B
-:10CFD0007BAAD2743E9989EFA04A7BBC38B9D18F25
-:10CFE0007E5CF13AA37D74BAEB959E42F46BFD56DC
-:10CFF0000F6E93B7661A9F4B3B6C51D763E48F82D9
-:10D000005D689847D6DFDECAFA3AE85CB8EFF5C348
-:10D01000D68951BFA5DD5349764A7326B4603DC712
-:10D02000FEBE34311FED831E2B7E1196D7DEEBD66C
-:10D0300001FDEC9664DAA7FD8AA2AF0BDAF228CAEA
-:10D0400045B42E88B7A3F1F8BF7FD45047C7BEB60A
-:10D05000CA10E7D46A1FA53A3E1917D3AAE9F919ED
-:10D060009B8883694D8FE27E16899369BFEA35C438
-:10D07000C9B4203D0F46F6BF5DFBB0BDCC23E0D167
-:10D080004EF622BFB5AB5C9FBC34C77D52B37DF278
-:10D09000FE209FFF730EC6B7827CBF333F2F1E0C4E
-:10D0A000B78F11761DD68B9BE57C5C80D7DF95A969
-:10D0B000D91D137C3C7EE504FAA82BAD2B316E10F4
-:10D0C000AD5729A2EFA4358D505FB224C0E5F7E833
-:10D0D0001CB7C12F37D7A934893A9591C6B9B38403
-:10D0E000E7D907144F35D7CB56867AB974D714379A
-:10D0F000E6A664BF9B4BF83EF071967A12D76F8E0E
-:10D10000A79DC5781AC9198F7B2C15BC63DBC9BFD5
-:10D11000572FBF677226C9EDDF0CF797F688784561
-:10D12000F9678B9FBD37C7784E7FA4FA87D212BEAE
-:10D130009F1589F57ED6FA8727E35515F135047DCD
-:10D14000313E38AC1E42D439C83A88B1810C5EB742
-:10D15000C1783D44BBD64AF8BBEAE75CC4FE0F7C0D
-:10D160009A1C403EADE17A44F2D94FE7F838FFFD12
-:10D17000C64FFC27F90EFA4F0AA01EA9E6FD8B7FC9
-:10D18000C3BF7B21ED8B718133BD9BA6921EF2053F
-:10D19000F4FEAF3B722E322310430F1D5DA04E0DE7
-:10D1A000E8FC23783F33901FF3FD2F13BCA6F7B3A1
-:10D1B0006606B3E8FDC8794E7566E06F7510A03D50
-:10D1C000CC75277CBF30D79D487BF0CE92DFAFC4B3
-:10D1D000BA934BF3D5651CCF1CBF11BB7288DB39EA
-:10D1E000517B3287F6C36B602F36133D453DCD35FD
-:10D1F00018FF5EFDF8D27E82FB7FA7BFFF79F3DFC9
-:10D2000000BE6E824FE44D3EC5FBFF40EF8B7CCDF0
-:10D210009F01DE30F191B0FB3F87F87CF6730EDFA3
-:10D22000EB44AFC59CDE657398DCB7FF35361F5CF9
-:10D2300031FFFF6F7A5FE4CD75E3FE5C3FDF48FEB0
-:10D2400039F4FB15E16DF130F93919D0E5E347798F
-:10D25000FF8C7E7EDDFBEFEAF9F32AC8F9053D7D00
-:10D26000AFC13EF2118D3F958FFFBBE2C83A2EE968
-:10D27000EFFF2D4E76593E9F3617F1D5CAF9E90AD0
-:10D28000ECEB9BE6F2FA96108FCF6A927F678AFBEF
-:10D2900043789E74F91C26BE8F12CCC6FB2AE3FE8F
-:10D2A0006DC41FD17AF719FD1118688641CFEFD3ED
-:10D2B000FB1BE5739FD88774B72EE0FDE7BE306E89
-:10D2C00015E2DFDC067B64DE5C635DA68AEDCB8D58
-:10D2D0008BF97F7ACF94FFD73D5F44CFA3F50B64E2
-:10D2E000BF82DDE672028D7F51674D6E8476B5F0A8
-:10D2F000DBC1FE8879AEBB3A1AE7AE9EABABC7186E
-:10D300000C5AE97C60C44E61EE4711FF113B4AFBA9
-:10D31000FE3EE3B98D8314E72A11F46D7EE1D97ADC
-:10D3200001E72AC4374B16EBB87CFF35D4DFCBFBC3
-:10D33000C7787E273D4FE57032F7EB67ADBA7C18B2
-:10D340004A9A05F3BCF82F1FC06FBF7D6E32D82BF1
-:10D350002F77293E2BB41BF74A7E7A81E44157F799
-:10D3600041F2B742F0FBD6170ED7233FAF785FC22A
-:10D37000EBE4EB8FD4311DA6F59F10F188092F4205
-:10D380007FCEBFDF24F87C1CBE6B30FE36A213E3D9
-:10D39000F8A9619A7DE2287516BB04FDE1BD9D04E4
-:10D3A000978BC3551352C85E0FAE06890638EA073D
-:10D3B00059CC38D3EEB90EB98FEDA679DDC28FF511
-:10D3C000C73E2FBB2FCA4FFBA8BF87CFE702FD8FF9
-:10D3D000ED40E8E802FC0E448DF8DE784D998DBEF4
-:10D3E000B750537861A98883507E53E6C14B1F9C88
-:10D3F0004AF9CDF8B238EE2FBA8C7FC722D8E4A410
-:10D40000EFC9C9EFD6CABA8C4A66FCBE5C8CFC96E2
-:10D4100021DE22E32291EFC95953C9BF753C2AFE90
-:10D42000FE93E9FB71F11B18C5B79C1DFC1CB839B4
-:10D430004FD5B0B1F5AD22ACFBB0D9292F6BCE677B
-:10D440009AFF1EC63C1753C7E4503DCA6B73F3A343
-:10D450007528E7F74E71A31C9AFDE7F323F9CF7BFC
-:10D460008DFEF380F49FD5ABE33F9F986BF49F1F35
-:10D47000CF0DFE8AF8CAA6D2FEF67249F1528C236D
-:10D480005C147514A71E4A5E82F128AD879F573839
-:10D490002DF2FC32DF7FAA88B93D78DDE2247C9E44
-:10D4A0005A9314C62D784C47F362FCAEA0F4A31136
-:10D4B000F318FFAA10EB34FBDBF18540CF5924664B
-:10D4C000E4679FF278282F50D125BE2F21EA05A4CA
-:10D4D0009F5D21CEF13795F173D518B1437E90DF72
-:10D4E0000FAC107EB8F4C7FB7FCA147D1DC052E696
-:10D4F00027FEAD06C6C0EB32F13DC51A0FDB8240F8
-:10D50000FD312BC44A102F7B399FB0ED36FA3B57C3
-:10D51000A77A76D1BE3AD2390677893CC7A0517E28
-:10D52000F61AF8F9490497D83FAE60BFB98EFADB16
-:10D53000B81C6FC3F3BFF9D1EF4AC873F3DB93781C
-:10D540001C654609DF6FCC57F9DD884FAA3F407F45
-:10D55000DE5082EF47FDF94C84E70AF4E74C825B2A
-:10D560007CB76232E681F8FAB34B783ED73786272C
-:10D5700071BB1CA3D70114968C92CF6597AF235033
-:10D5800063BDFFA1B0B3D7E5861696F07C3FF1AD41
-:10D5900039DF2FFB1DC3F8548CFD76838853950229
-:10D5A0008B5A72869FE7FF459B7A126DBC636DE5CF
-:10D5B000743D6ED312B17EEB2D719E1F0C2DAA67A8
-:10D5C00092755172DC9ABAD2936775FB59C5C2C77E
-:10D5D000A9CEAC3DF3C0EB0AC0795AD47B0D24FA36
-:10D5E000689FD38EF2EF4B2DABFECAC9B3BAFDC311
-:10D5F0000C2FD6456920EAEB4BF877CB5E2975F600
-:10D60000CFCBC3EF3571395CDD738ACEC3D46F687D
-:10D6100060A12CAA9BB2217DDF9EC3BFBF50516881
-:10D62000659A0EAEE46CF5AE121EF759477C12AD4A
-:10D630000BBC1BDBA576750CFEFD49199F94F98286
-:10D640009B5FFC3F94771B4862347FD0CBC29877B6
-:10D650005FA0AE770C61DEC5EBA3F8C8DA121FCD70
-:10D66000DBD8B59FE0890FBC47F0806DDD8FF58377
-:10D67000667C4BB9E814F8D6AD9BF03D92FC562C75
-:10D68000B425227EDF427A41BF07C53E70C476C111
-:10D69000ED8941F7C87B85A5067C3BBDE506BAB59B
-:10D6A000ABF78EC1F5483A378A67E7BBAC6F221DEE
-:10D6B000DF073A32A263EC3A88A348AF1B806F4C75
-:10D6C000F4AAEFE0DFBDAEEF28A5EFC5D5177EC504
-:10D6D00091427900A50FCF4B36953530B4A71D6A1E
-:10D6E000127DDF4ED26F6919D04F072FC8E3632434
-:10D6F000A7C2EEFC14F1F5FF5EA2B383AF75FC1F69
-:10D70000E6FB51490CBBFCCF957F18FE3D1FBEEFD9
-:10D710009E12FC62BECA7D77C4FA662DB8AAE55394
-:10D72000C021E506E5769382F5938A1DF92C88F2EF
-:10D730008BE7D70A7FBB05F3A1CD5ED6877BE13EA1
-:10D740009423C09BA33CDD81F2D3B8379DF802FD42
-:10D750007FC2A7D8A7DFC47D5AF8FF74BF85F3C581
-:10D760005F3AEF03F0FC1BC15327CE177CCEF25279
-:10D77000C9E541F73CC05B50DD4FFAE5A742DEE06A
-:10D78000278D7FB7E993E5418B555E3726F3A131AD
-:10D79000F29F3EE553E43FCD79D591F2A131F29F5E
-:10D7A000067B7DA4FC2733E549CDF9CF455D5328A1
-:10D7B000FFBC28D342DFA99676BFCC7BBED1F50350
-:10D7C0001B7D176986C292D287E747BF2DF431438C
-:10D7D000AB4EB7FEE369FCFBD7DD292EFABBABF8F5
-:10D7E00083F558129FA01F5C4E98B76321AFCBAC56
-:10D7F0004C7FC68C5787F04BAE08AF32BFEEE85275
-:10D80000C29B9135BC2C52FFE7D0D1D991F91CD1E4
-:10D8100091D9FADDF83DEE46FF78AA2733D3A1B8B7
-:10D820008BFF5DCA62CF6CFABB9492FEC5DEE175D8
-:10D830008336095F8CBAC13F3B3D7D9B5D19A3D008
-:10D8400053E6B147A2E3ACBCE0BDF32644BFDF24FE
-:10D85000EF1F4FE3F83D7323137FFFD4484FC0BF42
-:10D860004AE7FA33D9FECDCA707E2816F598C599D5
-:10D87000DA7AAA838F5FECC5BC5904BFA98708BFB9
-:10D88000EDADBEEDE81F1D2DB353BD4A0C7EA0BF0C
-:10D890006F7B397E1846F79E4F47BFDAA22716A442
-:10D8A000C7E08F4F4DD7CBD0D3617DAAABD0174BFC
-:10D8B0004E5FE92139F55B3D4857494F49DFE1F4B7
-:10D8C000E4FB9DA4F7DBF9EABFE07E18A5B3FA34C8
-:10D8D000D2392ABF9AA19EC5FCDD9B1F8A3A161831
-:10D8E000E7391CE710FA58143F540FE138555F8AA6
-:10D8F000FDF74E9E29E5FE4E1DEB7B7522FA7D67F6
-:10D9000099A8D7F4BFEEC338CD862931EB358F3DCA
-:10D91000A0F0BFD3E365FB2D627FB5E8FCDD535873
-:10D92000B709FEED09ACDB84EB5BF3D2F9F7E5B1A7
-:10D930007E732CD8E3A2BEB30EC7C679C09EC5BC09
-:10D940003CB385189E4B1FC0EFB3CCC2EFB36C2223
-:10D95000BD1BADC3F890F45534EEC9DB9501D97603
-:10D9600087A9EE46E63F993764CC7FCE0C1BF41DA9
-:10D970002B0C19F39FBC4E47EAB7CDEAFC10C6B595
-:10D98000A371C5721AFF649DECBF235C3A4397FFF5
-:10D99000D4AAC2AA5B9FDFBC2DACCF6F82BEA4B657
-:10D9A0008C433FD1FF6008EDFAAC99A10B48377961
-:10D9B0006E1E14908A7F87CEEAF61C403F1CFC0343
-:10D9C000A6E68F6C575FEBEBFF07133449A100808D
-:10D9D000000000001F8B080000000000000BE53C69
-:10D9E0000D705467B5DFDD7BF727C9866C42A04B0D
-:10D9F00009ED4DF879692561F909044AE06E76135D
-:10DA0000B62D9405429B0AC50B64101D5E0DB5280A
-:10DA10003EEBCB42421A420BC1E1F937AFBE2D05B6
-:10DA2000677CD631386AA1485DA0459496A63699A0
-:10DA3000521FD280790CD5AAB496577554DE39E7B7
-:10DA4000FBBEDD7B6F3685023A75DC4EE7E6BBF741
-:10DA50007CE73BE77CE7FF7E9745B315C66631F868
-:10DA6000F99386C6585F2DFC79338E83A651C2D8B0
-:10DA7000D2B1725C9934263236374F8EAB4D633655
-:10DA8000631D1E26E6B30403F8D7989BC69B8D5AE8
-:10DA900033318EB1F02255C0C708FF99E5127E4799
-:10DAA000320CF896B9C438B12469F819FB2893E30D
-:10DAB00005345E9E1EC769FC00E3EBEF4D3D6E260C
-:10DAC00060FE77A6C56F3646C0BD68B71EAFF8C703
-:10DAD000A3FF9C22E9196BE2F30F3BBD20EF9851A5
-:10DAE00085E8B9BCFF01E85D41FAB19FD3FB21A4F1
-:10DAF000EF2192E7D39CBE0F013D6D444F37D09389
-:10DB0000FFB75FEFC52A6327EECFDF808F2768DF7F
-:10DB100027723EAE02FE29E23BC4F7C1F9FCE67073
-:10DB200080317C3E8DE37BDD2DF428D164A2DE9F25
-:10DB3000755BF60DC6B37AE57A1BF4B066A57F0374
-:10DB4000D9C9B2223EFFD7A9CF9A8992CC187E06B6
-:10DB5000EEBB9CFF1B7C6E9BFF199ADFE94EC3D383
-:10DB60007A1EF15C39BC89E8CDF09B20F81E077C59
-:10DB7000A3E0AFE07047326191074B3C4AF249FBAA
-:10DB8000A5C4E3E497FA3C72BC8DEC667B29C73FE1
-:10DB9000EAF0E349A41FE47782E43D8ECBEF9F5D7A
-:10DBA0001EBF3584BE947379483DFCCE34E377A81C
-:10DBB000671F367A61FFD4F0888CFEFF1DD62BA438
-:10DBC000F5843D7DD0F9697B14719FCD4FCB77747F
-:10DBD00018EE8FAAD5E979F5DA7D919BE0CFE5CDF6
-:10DBE0004FAA26E2051856CC58BC9F2537C39A7712
-:10DBF000B0A4CA2086C543260B4CB4D835FB32D11D
-:10DC0000E1F1BBC4F8BFC8FF2D9B23F5FA5412F312
-:10DC10008B0CDDFE95B84F69BAD91336BA671FF67B
-:10DC20003F29F80E852D7672A3F1076B412E967C65
-:10DC3000283D16F259F6E057C7A01C969549BCDF5F
-:10DC400048229ED70B25DE7DB4EEB2F43ACFF171B7
-:10DC5000AE84FF29C167E8EA336D74255EA5BC4B2D
-:10DC6000D2F5CDC37DB45F9E4072CBC869706D5252
-:10DC70004209D88F8FAEDDA49A56BFC0BAF530C422
-:10DC8000B7FB597A4C7A95F103DDB4EE8DA66B7D26
-:10DC900058C847D8699ACE7E164A302B7DFBF9FECC
-:10DCA000DCE0F52D7EE121D4DB1B2FF794FB268BE6
-:10DCB000DCA51D2C0FA4EDDB603E90BB2EF1BC60FB
-:10DCC000AEF55FFFBAA0E78F5BFDC9F5F3D153470F
-:10DCD0007CBCC5F725E37F5E36EDFEE7AAE97B3223
-:10DCE0006C89E71F74FE7F87ED7666F13FDF42BEE9
-:10DCF0005BFD451ED4EF9541662481BECBF89B9B0E
-:10DD0000B98EAA55C83FA5EDB39ACF5FB2833577D8
-:10DD10004F1C0C7F53AD8BE05A9F656BBB015FD8E6
-:10DD200073B1296E814B85F9F3436185AEC0DF2164
-:10DD300092FF464EDF89B04EEB8599C60CB0A9869E
-:10DD400025634A500F5A7FCEF1B160882DCECFE0C7
-:10DD5000BB20F0C9750E2FCA6FB4F2F113B1CE8992
-:10DD600030E703E33FC9F311CE875AB02E88F8D5C8
-:10DD70003C595FFE9AE4DAEE16E3C43B14D7FAD2BC
-:10DD80007EE877A4EF4BBD522FDF23FB97F9FA3BD8
-:10DD9000E13F2513B3917EC65C53ACF37E4B7EF01E
-:10DDA0004AF3FA65BC6813FB9548EFD759A4FB4AC0
-:10DDB000F3D588D24C72F2B19402F143F50776772D
-:10DDC000022B1595C69B38FFA5C9C6AFAE060FC876
-:10DDD000E922EDCBC3F67AC4F2FCDDB0AD1EB8B8D3
-:10DDE0002E8E7860652FECDB6BCBD5E25520B7BF6C
-:10DDF000E2FE54517D10CBA65F7FCDECCB5FC3B666
-:10DE00007C3E925F0576C446B942E3F5C1F3FCB5AA
-:10DE10008AD433B14FDA93C8477BDADEF8787B21B6
-:10DE20007F9E73C4BD52D8535E2DAEF33D215F1665
-:10DE300028C6F5D8C4E329753AC45796FE192E189A
-:10DE4000AFC2BF60FDBEC85937EAC18A0EC5486679
-:10DE5000D1FB4176D221F03F96DEBF51B52308AF0A
-:10DE6000C9A68BF801BFBE8F6F22BC8D4D0AD99F0A
-:10DE7000D35EC6D672F98DAD4DCB692CD16F70BC17
-:10DE8000BE69F1F188174099774A06FF0A4177D8B1
-:10DE90001D3F7413E8417B9BA2A33F5AB9716547AC
-:10DEA000298C99E60E8D87CB049414CC6B0F96F9D0
-:10DEB000D10FBC24D6437C1ED8478C25C122826357
-:10DEC0001A5CA7C7D61FC5E97FA930AB70DDEAF899
-:10DED000CE08B235AB71DF51BCDE036E1AF3944D40
-:10DEE00073BE16AF85FDEB99E90EA1AA4176D63334
-:10DEF0000EE86A107469C6BC37D930A8A23C2C94CD
-:10DF00009A8671DD1FDA0CF71B9A3E3E9F55024C34
-:10DF1000DC3DD0EF43664C76B90CF16A03FDE55C5D
-:10DF20006697C1C72DDAE8CE8C91367CEECB3C5F8C
-:10DF3000722BF74FCB6A419E16BDFB91E0EF474233
-:10DF40009E3B80869E8984209FA1DDB0B52E94DF04
-:10DF50004A81ABA76DC95DB7017D97CA5908C75EF5
-:10DF6000E44FCDF077768CC6F963867FC148585769
-:10DF7000ECEBC916F075FF0268DB804FE047539762
-:10DF800017A42C7A7C7298C94298B79527B630D0DE
-:10DF90009388B9D3DD0F74DCDAF4F65ACCFB5698CB
-:10DFA0005E7D1E9078FFDA401DE6B54B4C2197F957
-:10DFB000EE73C8B70FFE43B978526FBEE04139CF58
-:10DFC00056D828C0BF30CA9F4BB9789976CE2A1749
-:10DFD000CD31DE78BA74FBF316F84FD5E6179FFF04
-:10DFE00008FC31954DBD0C7C82035980F45CEA50ED
-:10DFF000026A2981B918F0E9F1F17DDCDBB1FE2577
-:10E00000B4D315412DE4D2913E46F26B146BBCD7CC
-:10E01000A26F7F1E72D5C8C69D5DA877F7F7AACC00
-:10E020000B70EDCBF72226FCF9109F26F4C295F772
-:10E030009F3D1AC069FFA6325C4FCA11E41D980EBD
-:10E04000F7CFF5C17C00BDBF1AE404EBDE63787541
-:10E050001DE07267BFDD8672CA65CDA9E130BE37AB
-:10E06000E862295F862FE03B21E4E2BAACD05ABADD
-:10E0700026D775D99E935C723F17610C7D77C2E8F5
-:10E080001907708BA4DE76F0FD5C64F0FD90FBCA8E
-:10E09000A25C5FE5BEE43AF4D55BEDCEE867167DA1
-:10E0A00075EE43D2B10F7B356E27677B55CA8FCE95
-:10E0B000EE2ABEA71AE491D8E5223B863A6DBF52FC
-:10E0C000007FA414A681FCEF13F4D20FE0F63617FC
-:10E0D000263B4B33FB715FF9B13F2A958C438DCCC6
-:10E0E000F82386452C8CEF15A3FBBE9228423BFDFE
-:10E0F00028EB76A35D3FC0FADDA8FF1FC352504551
-:10E10000FF18F2E0FD465FC08372DCBBEB483EFACD
-:10E1100091D4CDEEC2F3E5642ACCEA279D5794C48E
-:10E1200079C93700A7A4FFF49941F2CB7EB8929F3A
-:10E1300036188E0BEBA23E334B1C3936D5FC31FA28
-:10E140002339D602CD0CE9D83335FE13EE77F9FC2E
-:10E15000F195C64FD17FEE9F629CC0FBDFC07C0F64
-:10E16000E2C3C5DA47A82EF94B857112EF3BFDD803
-:10E1700039F4637A461F163BF441FAB153E8C7E01D
-:10E18000D162B457901B8B5D9F1F3B2BF5E07676D9
-:10E190003BCA07F8F925F97F0DF801B99CC17D9FAD
-:10E1A000C4B0FB966245C4A61E00FA14411FDE5798
-:10E1B000C0BF2B1B7FFC4765181FCF023845EC2BD7
-:10E1C0009691751837BE1EF2F9C6A2BF304F21DFF7
-:10E1D0004EB9406076535D163C760AF5C695F7C396
-:10E1E0003166963898DED775EEB7D27CA11D4126F0
-:10E1F0008F7C28CC745D467E0240C4A8F7D38B0484
-:10E20000E941FB0285F86B2F658DE8CFDBF0D14C3F
-:10E21000D0F7054A37EAFBB722453C5F1AC7F3C27D
-:10E22000CEC26430C4FB2C04CFCA436C494506EF10
-:10E23000B7222AC14F9A66E461E082BC8FF2259929
-:10E24000AF4AB84084E795C3233CCFA8A88C1751A8
-:10E25000A02B0E91DC218F1A4E637F2AE91A29FA2E
-:10E2600022FCA7BB2C7944DFE824C33C24D7C89EFA
-:10E2700037DC1249C7F55B22C8C72E19D78D5B1151
-:10E28000FFDCE18106F4731EA07B7769265EFF60E8
-:10E29000C1175458967D24524AF45537ED6C1D0928
-:10E2A000FB1D0E8FF563DA94AA4906318FE81C0531
-:10E2B00072C8622F1B233C0E4EBB45C00979C9B8FA
-:10E2C000EF83F4DB0DEB6099EFC23CA084E7010F14
-:10E2D00044CA689ECC07003EE101B8F00493F0B454
-:10E2E0008FCFBEDE03429E99781B2A407FCD5833E4
-:10E2F000C58BB88827AFB51867064029FB5A6274EA
-:10E3000005FFDF130507774A4BE487B2C86F61DD6D
-:10E310001E1FC6EDD6F255BE7ECCFF8C08E16D5CAB
-:10E320001E3E3360F1B79D256C0CE601F736DC79B3
-:10E3300066C0626F3DF99C5E8C33096F06EF52D464
-:10E3400013A0F768D89B9A0B02CD0DB2A457A1ABCE
-:10E350005B473B88E8F43C6EAC6426D6E3D5673572
-:10E36000EA7F15B234FC26D89A483973235DF160F0
-:10E3700092E1BC5C18237C7CF6DB04BFB05A6509D3
-:10E380000B9DE07F56901E38F2A51DA86080B77DDA
-:10E39000A692DC0C781B826B28FE6C9A934BF7617B
-:10E3A000DDA417EEDF33BE89E296CCAFDAA3D1103D
-:10E3B000C5A7EBCCA78E4D8D3F84FAE809A6FDEAF0
-:10E3C000C34467C6AF6E8870BFFA19BC4AFFB1FB81
-:10E3D000E86BE43FA00621397782BCBF9B651F37FD
-:10E3E000093BE82CE47AE87CFE55A1AF7FA988B709
-:10E3F000221D06C4B4E0946BCF37DB65BE29E478F8
-:10E40000BDF201797C2962F1CB208F2F679303FC49
-:10E41000DAD05FA8D25B3CAD68A8FF3962F824333C
-:10E420009338CFC79A0948F5C719C6BBC178520CB3
-:10E43000E72D13FC7D507FFC1D486FB85F339E8E27
-:10E44000505DC8F559FA65B04B1E7FAFD16FF7BA72
-:10E45000C09F023D1D786B66E6F921B1CFCF55997B
-:10E4600087701F2794F856A2FC1F558CA05FC5BE6D
-:10E47000A7D9887E84E9536CF306AFB389F0F4958D
-:10E48000996BD1AE99BEF80AF09BC5BA824F9DF345
-:10E4900001EB7E25776C667C25BE7E10317E86F290
-:10E4A0006A35E3BF40BB7BB9DCA52714BA921D7661
-:10E4B00056E724151807A698AFF37D043F0AA83B3A
-:10E4C000CBDFA1BC68E17C85F2B4853EA8E0B2F860
-:10E4D000C9F322DE2CD4F97376DA085AFB1D855174
-:10E4E00097BDEE059530ACFD8BA86B15F6E5653C48
-:10E4F000C3BE49367BBB28EC49F5BE5D827EF5651F
-:10E500007776BFFD4EC443704A54F42544FC5BEA61
-:10E51000E5F5157B11E8B3C4D7E7AA6AFF8FE2627D
-:10E520008225144B5CEC1B7D91FC1D3DB1DC5F280A
-:10E53000FA4EACD78E47F2591465B675415F5D51FE
-:10E54000DEC750A396E74B55C6FB1E3D7679013DCD
-:10E55000BE28AFBB9B94E959E919C7A667A1E79408
-:10E560009D9EA228DF97E7AA8C22C407F17938D2B2
-:10E57000D1510BFA9745BEFB26D5DE84701A4B7439
-:10E580009495BE6FDE7A0BE291634BDEAA47EDFEF7
-:10E59000B534CAFD6B5994FC4AF6752B85DCAED7B1
-:10E5A0003F5CABDD6F73D8BBBC76F67F2FAF12E854
-:10E5B000F07A139F267B9D7875F6FDB15B7A462332
-:10E5C0009F87847EA26FC77CC3D0793EF26094EBB4
-:10E5D00071784292E09E1D22FF48C38160B02F37C0
-:10E5E000541E32F31AF390CED97D7988A7F5DDDD7C
-:10E5F0007958C73F3B509B350F3954D245743AF395
-:10E60000900343E4216BA23C5F3DFABF1ECA2B6A14
-:10E610002EF0385F73A14BD5413FD745B93F9B39A9
-:10E62000D0A39AA027359887009E03220F41F84D6A
-:10E63000A0BA9177BB54A46BE6851E9A570363CCAE
-:10E6400043660E918700152AEADDFE9ACE5771DFE8
-:10E650009CFCBE58696E885AEAADEAFE1E7A4F22CB
-:10E66000E775966FCE33699FED7A736C2AA73733BF
-:10E670008FEBBB136E28FDAA53FDE5D81FD8CA72D5
-:10E68000432887F7728655B2025ED7605EBC15419B
-:10E6900081EFADA7F39209ACAB7DFCF9677387ED11
-:10E6A000C6ABF43F3E6117EFE5DC92147590510064
-:10E6B000F33FAB1AA9B9100FB68EFB6280F3B39E7D
-:10E6C000EC6883904DED4E8DEAE93B827C1F64FE41
-:10E6D000F5D25285F24340337F01C0CF10F83DD3CD
-:10E6E000787D58AFFA096E5B39CF23EF485CA4FE02
-:10E6F000C5CC7E8FAEC37846FF1A5E2FAA3F3C9EE4
-:10E7000087F9FE4734A6C2FDA56DF156D2CFD31EC0
-:10E71000EA67C8FE42556F37C92D6FC063EB73E4DB
-:10E7200082274B59F2168F63CCD4E505D9FC90BCF7
-:10E730003AFB10FBA2A2FEAC64932E835C2EB14781
-:10E740003A9037EFF8DAA34FB1C1F3657FE1C149E1
-:10E75000C633A81FE3DCFDDF7E06E475E02D0FF570
-:10E760002D0EECDA757725F097E8D2A8AF2BEB19D0
-:10E77000905BD122AC675106D4973EB90AF5F2609E
-:10E78000BE1C834303BA0FA6DFD77F629561199F32
-:10E79000886E398771EFE00809FF269F2FC789FE31
-:10E7A00055785EE3E0283EBE14559F4AD0FEF66BD6
-:10E7B00054476FFCA53F9B7F3C5967D7D77BAAD7AF
-:10E7C000737DBDC23CF0EBAF47B3CCCB59606EABB1
-:10E7D00000791C1C70D1FB21A8B352981F3C38C98A
-:10E7E0007C03E11F3DC5E57AF0AD8702B84FDEE15D
-:10E7F000FD0F67F3F3BF11F1285DE74DE6FE83B12E
-:10E80000010DE3D68E39CF9EA884754ECE1C3F45B0
-:10E81000051640163ECC97E57C6F1DAFE332F4BD84
-:10E82000A2AE42FFF3D6B9866CF65E15357F1FB5F2
-:10E83000C1F3F7A2AD5D1AC9BFE8D8BCDD78EE27F9
-:10E8400055D3D5A3C1FE1EF88D8B619D72A042D415
-:10E85000E143D11502BA8AAE8AAE5D33B2E81BD06D
-:10E86000E5A91B3198AE97EB18C9E7C54AC387CF16
-:10E870009D7432D1C79C25FC7DCE9B5FA4BEE381F5
-:10E880007E17354F2E0DEC5651F564FFBBF354192E
-:10E8900066406CEEFCB32AAA94F9886AB3BB19A748
-:10E8A000726DE3079A87DBC6CBD68ECED821FCBF2C
-:10E8B000383AD636F6066FB78DC36CAA6DDC30FFDA
-:10E8C0000E1BBEBA40C4369E17BCDB067FA7BEC473
-:10E8D00036BEBB7C990D7E4168B5ED794D60E7167B
-:10E8E0006C1FC5274ED68633D2C7C975B00F79BD08
-:10E8F00006E9E3A3A71E0AA05EA46AE26350DFFA5A
-:10E90000F27B4AB07FFD923B7BBDF6489D2AE377C0
-:10E9100009C67B83F17A4DC287CBFA6D7DF9D57537
-:10E920003C3EAFA853B2F6099CF158C66119979DB9
-:10E93000EB3BE3AE33DE2EBC6DB78FF7FB79DC5FCC
-:10E940002AF4A0B5FC677EACD75F6AE07D84CE92E6
-:10E9500038F50DFA447C3EBAF4BE31F85E2DB7DCD2
-:10E960001CEE2DCDC4EB487992FD12FB3C81241B9B
-:10E970005B81CF936C7505F5A5B5C8447E7F82B8E1
-:10E98000BF06AF10A7EB2D7273C6DFB06FF20B0599
-:10E990002C93AF34FCC18816007D7735EDD38AE126
-:10E9A0001AF11FD6AC7EE864CDAF8A8788D39FB4B6
-:10E9B000DBC72B641F070616BF6F1C78A385F7DD26
-:10E9C0007FD0E26329E0EF744B80AE3F6F09D2FD48
-:10E9D000575A74BAB6B794D335D512A2E7AFB65426
-:10E9E000D3F5F91683AEC75A62743DDE1227B89F7D
-:10E9F000B634D2F5C51693EE6F1776FA61A1C72823
-:10EA0000977D85F8519742726DC0A3BAB32E18AAAC
-:10EA1000D5CF835CFF239B5CAF359EA46ABA47A326
-:10EA20009E41BCCA6A4FDD7532AF4FEF37D125F337
-:10EA300061AC5F504F649F0EE8FB26D2E7C5FE5CD9
-:10EA4000D1F5D37750E1741D2CE4FD1BC4B3281F0E
-:10EA5000FDF9D7E2B5E4CF474C267F1E649ADD9FCF
-:10EA6000970EF2E72BC9EED871EC93627F91DE53DB
-:10EA700038FA2005F53ACD937D90397FE07D902BD3
-:10EA8000F10F7C1F47BF25FDF6D5F2EDE4F7D85412
-:10EA9000E365C423E3F3A0F861AEA3F8512D6C96AF
-:10EAA00069EF529E9827F8D9716E7101FA172F12EB
-:10EAB000C8EB748355E33E33791E60F7DA92C17870
-:10EAC000DFA8E9A678BE2D9DE7BC4D79CCE0F865BE
-:10EAD0009703E642D6F80E7278B3AE6AB07ED6A936
-:10EAE0003FECDF0CF1F9603FE37DB269FC7D9D8C6A
-:10EAF00083072FF03EC6254D4932D8BA5AD6DC35A9
-:10EB000003AEFBBFC08AE3F8BE698C2BB41740F399
-:10EB10008E1CD07D0017EE3787E7C0F3EA540ECD88
-:10EB2000AB9D3F3989E386F8DBE49F6A357B9CC463
-:10EB30000C351D77A80956E418DF9C8157717FCBEF
-:10EB40003263C0BB6EAAA9D5035F8B2F36331DF08D
-:10EB50007B4B989BCE870C8EEFEB144B9F4D63A1A4
-:10EB60000EE443FBDC36FE5ECFA16F524EB2DF26D1
-:10EB7000EBF0279911C0F59CF8DBC47B17E7FB96F7
-:10EB8000F72ACC20C22B8163F4BE85AD65FC7C8462
-:10EB90000BEA1394DF304F726FE960BDDB3FE5CEC7
-:10EBA00031F564DF09E5C6D4ED5D0AD5EDA26E62EC
-:10EBB000FAA75CD63A46D64DCEFAE831E167655DF4
-:10EBC000F4989B51BDD5AEE486761393CD93F8FBB4
-:10EBD000B8E61978ADA9977EE90BB63AC91FA83FE8
-:10EBE0003330355B1DC7EB11777ABF4B02E7F33249
-:10EBF000FBEDF798413CDFD83E79DD5756A2BC4685
-:10EC0000F8E8FD26D3E23AFA9BC7F1443FDA7320D5
-:10EC1000C18AA767F65765DA79ECC77640F282EFCA
-:10EC200077E3F53C9F70D2E5BE46BA7023E93DB567
-:10EC3000B4771617EF25791EE913F7DB746EF70C1E
-:10EC4000FD96E53D799BDFF0052CFBF828CAD93B02
-:10EC5000F4BEAAA56D01EC6777F95D64A71DBAB68D
-:10EC6000B514C61D7E8DE729BA2B96ED7D5247BDA2
-:10EC700022F8E67405045D6A7831E53343ADD7299F
-:10EC8000F65D8E73279A06D9951E8A63BDDBEA2F3F
-:10EC900056B0CF299FAFAA57C4BE77911CB68AFC45
-:10ECA00028B7BC3BE5427D19B5662A8ACD07F9CE67
-:10ECB00079B8EF9BD84DF951FB089FED7C96BC3E8F
-:10ECC00026F06D75876254BFE7BB18D6EF5B4BB378
-:10ECD000C7C387C5FEB6EA53E2089F00B98C570642
-:10ECE000C3AD11705BDC5DC100ACBB75FCBD74DEF7
-:10ECF0006BEB1872356CF48F6F7B6A937FB07DC0BD
-:10ED000098F6CF1D60F23DBAEDDC43ABDED0B81211
-:10ED1000D6D55E6121340B6937DB313F81AB7BD4C3
-:10ED2000E246D4DF4BD5B92184AF535F4CA01CDB46
-:10ED3000438CFA165A61930FE97EB444A3730E9282
-:10ED40005EC8BB77A3FFC80FB96CF9794175AEC334
-:10ED50008FDAE981F548EF86DA5F277D94924F7963
-:10ED60001FF842B3319E05DFAB697BB7EB97FB0A17
-:10ED7000FA75257E6C71B22413278F1CFBD7D5F84A
-:10ED8000BEE371C69F3F7F6C0ED5EDCEF18DB2F321
-:10ED900056ADAB11F7A5759C87F4CF397F6B29A7CA
-:10EDA000ABB57E965837A0A0FE6FAF2ECA413FED9F
-:10EDB00047876B91EB0B95E6CFEB2D71B830DA4CB2
-:10EDC00071F8BBF58CE4E8D7E38171A017FE5E15FE
-:10EDD000740AE4EEFAF31FCEEAD72E47D66590DE2A
-:10EDE000FA59E6F76790CB30C6F5C4CF1EEBA1B851
-:10EDF000C436109C94D7F65B4F86526CE875FDD5EF
-:10EE0000F63ED307ED23FDA93EBF98E49CC37250A4
-:10EE1000CE97D8230AC5E1A841761748FB557EFE58
-:10EE2000A4580E811D1C93CA2999FE12C3F71768B6
-:10EE30005F26A33C8520478A57573AED0BCD1B2D03
-:10EE4000D0DC8C076354D47FEE772FB1B7F8FA305B
-:10EE50000DCF9F280917C5CB5B51AF01AE94997FA9
-:10EE60003C9BE55CCE9840D3BED5702D9E27FA62C0
-:10EE7000829F2BC943D2FDB7D25B19E79DFD50D9C4
-:10EE80002F7D06FBA5CA95FBA14CBB48729379ACBC
-:10EE9000B33F0A712D0FE5FEDE048D7592DC791EFD
-:10EEA00090A9D74D9FF51C9D8C97ED81C5B63EFB73
-:10EEB0000CA94B0E3EBF7785B8D8D90B7E13F3E172
-:10EEC000E066EAB3EF3FBDEA38D6E397821E9D596C
-:10EED000FC7F7BBEFD3D80C4FBF979A29F3EAA9ECC
-:10EEE000E17CADC76478FECE130C515C6855B2BFAF
-:10EEF0003F689D27F209679C70BC67F99F1C7FD211
-:10EF000053C6D2F14315FE59C657A641141D699D3B
-:10EF1000CFFDA894C77E9157761EF9049D176041D6
-:10EF20004BFFB62CCBFACEFCCF30F4C0F44C3EAA4B
-:10EF3000F4F33C54AEDF2EEAE7D6D37C3F72C5B97A
-:10EF4000A141FA5A617E7A1EF67FCA5D8E3E95DD3A
-:10EF5000DF38F35AAF8F25722DFE0FF2DA8DF328CA
-:10EF60001FB1E7A5C3638C9FEF293419F6712241C5
-:10EF700053C5BECBF4DE669501DF334EBFFF7E2C5A
-:10EF80009AC7F39CF6F25571AC7F641F79C79CBB9E
-:10EF9000C8BF421CDD3ACF52C7CA730B1FB4AF249F
-:10EFA000F575BAD847896FD0F992D91BF8FB9FD372
-:10EFB0000F9D407DDC0FFA8871BE3D3FB1AD02F37D
-:10EFC000935754B6571FDC8772F225FB49FE18D7BA
-:10EFD000534FB0FDE85C97453EFDCDAA4EF2311887
-:10EFE000BEEFD1C4FB1E67FFC8EB359A317EA76A1E
-:10EFF0008C466BFF58CA6D91D0E7376A9AE97DD489
-:10F000003343BCFF9570F89918D6D3B21F553AC94F
-:10F01000FC3EEEEBF4D87A15DD48757C3D9DA3CC23
-:10F02000FB77467520CB55927B61A923739EA53A49
-:10F03000F1F74146FD320FD689C55817F23A51D63D
-:10F040009FD24FD4A94F7794E1F98C5E8DCEDBE54A
-:10F050001DF9840FF3DE70EF6AAAD50C65691EEE08
-:10F06000A33C7F24E9BCDE3AB30AEB4CCB7B928C09
-:10F07000DF88FD02F5A0B325FE8B28E8C781168343
-:10F08000C6ED2D8D74ADD29206F253554E951B9B55
-:10F090003500CF2D7454F5C46CE31D95E619D4CB1F
-:10F0A000BCF2B8EDBE3708F82C7A0175EE3992EF54
-:10F0B000692E4FCF7C85CE152CEC675BB86DFFD3E6
-:10F0C000F8212D7663FC504EEC7DFD107F5FEAE960
-:10F0D00017EF4B1DF6B6679E4E7690B63B7C6F4A97
-:10F0E000712E41F3E9DDDF4CE067D827B9DFCA9C18
-:10F0F000CFA0EF12C3E27B693D366B0FE6B3EDAFF5
-:10F1000033F99DF01EC3F21CFE6AC2EF440E63B1D8
-:10F110000B79E6E65861137D4F2DBE87893416962C
-:10F12000F4B1CCB945A7BCB6C45CB6733161C6FBBB
-:10F1300062F2F92763A26E03765C96730FB978EEDC
-:10F14000214BFEDE24F0350B397578F8B983B98E82
-:10F15000EF3C66C6785D30D4771E9F1378AEF45DC1
-:10F16000C76201773FAE5745E722C331A4372EBEB1
-:10F17000CF1274CCEA4DB60EC32431C8B2E2B93313
-:10F18000C6CFEFA562FC3CB1276868B82F80EF6E50
-:10F19000C2D7C8CF59CAE7B32EA49F2F243D69E038
-:10F1A000CF675D30A91F24BFAFBBF3F8D83D9BC626
-:10F1B00065CED7B4633FC28FDF99F0734BBB04FDBC
-:10F1C000CEABFCCEE4DE8038A793B8758F81780C87
-:10F1D000FE5D65EDF10903098DD6FF18D127BEABA1
-:10F1E000992CF885FBAB882EC7BF0FF0C0F1E01E4D
-:10F1F000F13DCE1A9AD7CCE9CEFC7B07A13DD6EFE4
-:10F200007B261FAF6C12F0EB087E2D87CFA20F423A
-:10F210001FA7ECC15EEA55E0FB0CD1B79CD3571693
-:10F22000D3F977590EBD05B8CFD3BAE23B9FDEF8CC
-:10F230006A1FFAF3CCF7FBB7D17A5721A736C2631E
-:10F24000CAF59838CFC4ED42EABFD4876F08FDBC39
-:10F250003DA648BD7A8CE86DBA61FC7F89E8717C77
-:10F260005774253E2A2AE34FD0BC60FA5CF1D78957
-:10F27000AEEBA4477E07E6B48BEF0BFE61DDA7691A
-:10F280009D92109D2F8275BF7D23D605BCCF101E89
-:10F290005F1AEFFE58767FF381F0B292E2AB3A1F2D
-:10F2A00022C7FF0F94B0BE363046000000000000B9
-:10F2B00000000000000000001F8B0800000000009C
-:10F2C000000B93E46660F8510FC181486C62F11A3B
-:10F2D0007606866816068699AC0C0C15402CC74934
-:10F2E0009AFEE540FD8B80782E10CF00E2C940DC0D
-:10F2F00007C49D40DC02C49240F34480981F88B943
-:10F30000809815881980F8370703C3370E8439377A
-:10F3100080620F48B41B84AD7810EC3340FF6F045B
-:10F32000E2AB6484C3281E1E389D9F81A15A00C190
-:10F3300017104495CFE047B0B94429B34B1AA81F22
-:10F3400000656D40B4800300000000000000000074
-:10F350001F8B080000000000000BE57D0B7854D5E2
-:10F36000B5F03A8F79666672F2204C4280134830CD
-:10F370006A8A03840882F52420C696DA9152C5FE73
-:10F38000D60E34224A2051B1722BFD726002040164
-:10F390003BBC1414E9E00D8A8A362256ACE83F20C3
-:10F3A000B5B4B56D6CB9D55AED0DB5AD2F0C88520D
-:10F3B000FCFBEBE5EEB51F99734E661250F1B7F703
-:10F3C0000F9FEEECB35F6BAFD75E7BEDB577DCB232
-:10F3D0000FF287029CC49F8B00EE7003C0D8743A72
-:10F3E000EAB66FCC7DA49AFCFE7FDD916D7ABA9E61
-:10F3F00048878244EB01180045001779C9AFA4DEA5
-:10F40000A49F1FFED37985007B41010FF9945227F9
-:10F41000157C8DF4B3F7238860B9FCF3406957007D
-:10F42000DB99B4DD9781B54B95E9A55A156640C6C1
-:10F43000EF8697FE4EFA19BEB999B43FFE6180B6C9
-:10F4400077C22152F84886146F737218F6AB7ED0DB
-:10F4500055C9F3654006070EEF64809A34BCFB5F24
-:10F460007B83C2BB4F25F0EA19C6F712F80BD3F025
-:10F47000EF856FE4421583DFA849C37FBAF0D0F966
-:10F480000F0058DEA23F5DEE0258DD024F97570095
-:10F49000AC6CF1D2FCD2168DE6E32D619A5FAE9290
-:10F4A00026040FCBDB216992F6A16A525FF447FE76
-:10F4B0000B54796D79772169EF4DE7D540D896F7F0
-:10F4C00096EAB63C01E76098CCFB1C3E9FA52D0454
-:10F4D000071E1CDF0BC65958FE6D8A171FC75B3C01
-:10F4E00038E2CA61042F6D2F2A84D2002EDD988164
-:10F4F000F09507DC7A92B0C63981D9536124193767
-:10F50000140320F5E21B00D612B8CF0E4C790B4243
-:10F5100000F793FEDB48FF4AA8ED650F295F51E62F
-:10F52000D615C4CB76F52F5D640C2FF987783B6B2D
-:10F5300023CBA7E745F296799E0D9672D2FE977976
-:10F5400077BE2C1138E2E56EDD23A5C7E9A14B3F5C
-:10F55000FD5724EC7967FFE5BA51877C2AFAAD8024
-:10F56000E8122DF0C5EDF71C82DB82FC74BF629CB3
-:10F570007EFB25E48F92B6151B21992AEB3D4EB9EF
-:10F580001EA9374979F946159265EC7B219187725E
-:10F59000F62B2C2FADF3C7AA7AC303D67186A5E943
-:10F5A00052AEBB67CA842FCACBAF982B11BE8184E1
-:10F5B00085CEC31883A2BCFCB045A3FCB8BAA59203
-:10F5C000A6ED2D5A07959F8F95191D55BDE5F0AFF6
-:10F5D000A8A748BB3B5C40F9D0DC06C96D12F61702
-:10F5E0009D3193E4578D2A1A7DBB8EF91932EA05B5
-:10F5F000C1DFAB249DF2B749F81BF59F533E56BBC4
-:10F600008CAF607F2B46C9D212C47339E3F77257AF
-:10F61000CA3B1CFB4D0C1B65623F91DF7561BDF25F
-:10F620008A11BA42C63DBB9CF1FF2FC7DEE9453DBA
-:10F63000D833FF85451DE56300721D7CA09D221F08
-:10F640006813FBE60331CE672D0F678EBF127DF284
-:10F65000D7AAC8DAB7506FB49733BDE184AB7868E6
-:10F660002A1C0DF4E6B7F272C26748A748DF7CE6B1
-:10F670004C37B424E175C243EB5AC294EFD6B4E8D8
-:10F68000345DC9F9D0853C554CF29C0FA1B09AE687
-:10F69000B3AE57B098AE4703A6272146E05C87FC7F
-:10F6A00079017E5F6A18A5A479A5C8434A26BA7F66
-:10F6B0000D9697D0BC01A5C89FA2FC31D320EDF3D5
-:10F6C00079FD29D263669C20699D8FE5EBA56EC309
-:10F6D0002CB5B65F691813D3F5493E55576EED8FBB
-:10F6E000F45F6585E7395A5FF4D7201D324C925F8D
-:10F6F000E363FDB5492F7F2EFDDF2E25C2B8D0ACC8
-:10F7000070F473BBC89B09C3A84A8F53B6F851C3A2
-:10F71000B496C3A3B6F29AC509D32478BB0BA2C38F
-:10F720002542DFE2A9D13010FAFBA2491397DA345F
-:10F730007C0CDFE9F9DD49E1F597B3F22AE9F746F8
-:10F74000DC429F5AE93726C22FEC1B85F3ABFCF352
-:10F75000D29B5F20FCAAE4BA23D4CE282499F1647A
-:10F76000BCE931D0091C723806A80F94B0FA77AB07
-:10F770001C08FE23708EA3704E8ECEC802A769852A
-:10F7800053C0D11FDC028EEC7CCAC677F253DD6514
-:10F79000E37E3B91B0B8AFD315413BAF00F144F4E9
-:10F7A000007CB4CE7091EF05D308EE754AB71930DE
-:10F7B000BC77BF85534B206959C73F6BBA0EC7FC56
-:10F7C000588AB7EF4863D3F425F999563C8EE3F590
-:10F7D0009CFC27E6E7EE35BFEFDAE6076A221C0D50
-:10F7E000F63FBF35BEC88C68A077BD5F4ACC8EAEF1
-:10F7F0009B32EEEBC0C6030FD15F7938DEE8F478B8
-:10F80000795F21E361676A32E378F993C978DE337F
-:10F81000874FA73C0A787DBDE05D6783F776179137
-:10F82000DB0CF43FD3F09EAAFCF989FEA5F257D970
-:10F83000B7FC7DD6FDE5E1AF849FDE57217511C190
-:10F84000D7828BBD49534AEBB9CF1B5F055844E8BB
-:10F85000B7E0D7630E5D246386F0F597D2E3CF97C8
-:10F86000740A7736FECE361F80A4AD9FFF57F3C9CA
-:10F8700086D733AD874E55BF2EF9839FEEEF969610
-:10F880004312E569E9818BE93E73E90B930602E9CE
-:10F89000C7D5762E18645279DCCE588A7606F63FA4
-:10F8A000F9D4EC8CDB5BA0A395185D4F84A2D42E19
-:10F8B0005A2A016DBF8AD86D4962BF54BFD8EE9DE8
-:10F8C00019A076154D97BA80DA31D52FEED726914B
-:10F8D00029F82BF24721EF2FF589EF07EBD1CE5D09
-:10F8E000594EBE13D6581A64FD91EF51AC9F53C1C7
-:10F8F000BE67832BA792C063C1BBCF9D8C65D28F9F
-:10F900005F96658A9F4DDCEE5A8D761751C83E7F13
-:10F91000228676B5BFC8ADDF27F56E37436676FF22
-:10F92000FA8A9F98E8D25881F61B99FFBECBEF87E1
-:10F93000AE2A5C0713868CED23CC35B0C9B1DE0747
-:10F94000D086A3EB66589A44D64CBF23BF5AD4370F
-:10F95000F55AB4D74295ACBC76C985B5716B399C64
-:10F96000578BEBAE28BF66C9585A5EEC8DBE3C91F2
-:10F970008C5F4CF4679CE0A9584D48CD949E99F952
-:10F9800065FDB5DE194902C3FACBEF2CBB36039EE9
-:10F990000815299D45BEA4C12E5F9B38DE56733CD9
-:10F9A0008651C62D7ACDC7AAF6E835DF594CAFF996
-:10F9B0002B138B11CF250D10413B7B3DC15FCC320A
-:10F9C000BEAFD2AEDF8A55FBBCCED47CEE02E32ABA
-:10F9D0007940F6FE9DF27517C46662FD62BE8EFB2D
-:10F9E0002B9352ACAAFFF93BE79B6DDE5FE5F82451
-:10F9F000E3CCCF34CEE78597E20019A7FAB31FC74F
-:10FA0000DF60D793A78A77686C37705F8DA626EE84
-:10FA10009B7D303992A2FBB9DBA81FEE160E3BC4CA
-:10FA2000366968D7C40132EA33B5DC9DF6A7E1FF39
-:10FA300094AB7333D145A40B5F7D2F6FBFA57E526E
-:10FA40000E16FE3D87FC723E9C7F5249B707EEEFD3
-:10FA500053051C817CDBBC4EB41CCDDB4FF4C61AB5
-:10FA60006D1AD5C7D9C67B90E8D11491AF075ABC9F
-:10FA700034DDD6A2418AC8D9BF1379C3FC56227F90
-:10FA800098FE88EC1731BDB72542CBEF691947F3D3
-:10FA90009B5A0C9ABFABA59EA61B5AA2F4FBBA9622
-:10FAA0001934DF83CF8FC87835946501EDAAB36729
-:10FAB000244DD463B003221504BFCBF1BB05FED5A2
-:10FAC00072EDB332FA3D67F8A87F23C8E7E987A44F
-:10FAD00081FA1B0E2AB00DB2CFEB0E3EAFAF28322B
-:10FAE000F39FAA957470414FB91DA85FA5A89AAC61
-:10FAF0005B44E5E65ED89A8FFC5E54CDBE07038476
-:10FB000091C877A51A52BE101D5AC5F61A6FDF3676
-:10FB10004EA6F5566B2A6DEFE48B73A193AE33605E
-:10FB2000782308A777BCCAEA57B1753278FE3EA49D
-:10FB300020B44D94E9FAB9BA9CC1A168767E09D681
-:10FB4000DC0768EF879561741EAB2F50370D473681
-:10FB500080CE9787937E3690AD0DAE6B0F6CDEA98D
-:10FB6000CDB4D0D9AB30FBFCDCE93BA315088F4A00
-:10FB7000E49A8C5FB8D99FC47587D0434178737C71
-:10FB80006C3EE7E298048EC24590BCAF2C5D1EC867
-:10FB9000E3F3D18C5AEA9710DFB9E23957EF48C93D
-:10FBA000D86E2344EE8374B94FB433ECED7CA29D40
-:10FBB0009942DC42E12A7B3BBF6807B5B6767ED12D
-:10FBC0000ED61A74BC0469A7A7CB15DEAE47EE2B80
-:10FBD00035D92A674A409799DCD8E9948D7F34E07B
-:10FBE00074D8674A27115FD52C2F49DEB69332AE01
-:10FBF000B3763AF951CEAD7A2660C913D245517623
-:10FC000071BFC6E9953433D36B9D1AF94539CEAF30
-:10FC10004AB5CD4FD0699D97D3D1F467A4D33A8D1F
-:10FC2000D33106363A0B7AAD13F46AB4E34FD06B96
-:10FC30005D167AAD13F46ACE4CAF7559E8B54ED067
-:10FC4000ABC1DE4ED0CB490FB1EEA4E9D62C21DDFD
-:10FC5000CE143D9C7AE10559A7DFE5F6A39D680F18
-:10FC6000162D50D93EA9B21350CF43697E3F76ABD3
-:10FC7000C9ED93665A7F2DFE2AFC5F28A76E96BFBA
-:10FC8000267EA816EDF07C4994EFAB457F5812CB49
-:10FC900089FD7573FC382D7F528EC614DA5F1270A1
-:10FCA0003FE2C497279A848D04A40A357A6905FA3D
-:10FCB0002537CB11F4DF0A783C20F004FCFCE6D4B5
-:10FCC000F81F80E10BC13B39FC94E0BC45A1F84C26
-:10FCD000323C39E124FBCB8D645F3384F3F710F3BE
-:10FCE000CCC0090D6CBDE8599FB99DE482CCFD5490
-:10FCF0006E966D7C3362BDDFC637E5ABF26DE5C352
-:10FD00005A4B6C797DD1305BFD210BCEB195973686
-:10FD10008EB69597345C60CB87AFAEB3E57BF10BC5
-:10FD2000CFB72BAF2CB6F18B39A20EF76D496074AB
-:10FD3000D81E1F5187FBB6FECABF7E8B6A7809FEAC
-:10FD4000D542375D870805297E04BE723530DDE86F
-:10FD50001F280C242F21E57ECD30A93F403300F72A
-:10FD600073B216A37957D82E5F5F4301227CFAF550
-:10FD7000AD2A780BFBECDFF824FDF7372F27BF887F
-:10FD8000F55D2964EBEA06B25DC2F33593E8C76D11
-:10FD9000645C97C6D67597E01FC2CFA8573455E26A
-:10FDA000F27B7A72367CA31DDEB2843D3FB4CD6116
-:10FDB000079E227F7F5EF2DB1FFED641C4544E01B8
-:10FDC0007F1155E2E7D5A727FFA58D76FC9434B8BF
-:10FDD0001D72E2D0E79F33FE5AC57A01D13AC44B77
-:10FDE000CE7AE64341BB2B935D21F865C3F49BFCBF
-:10FDF000D6F50CACEBD4B0F43834AF64CA7FD1F88C
-:10FE0000A4AB16ED8B9C8564FE65CC8EC9387F4E05
-:10FE1000EF755365BFD50EFBA2CF3F4DE71F9C5634
-:10FE2000FB700FBCA51ADDAF89BC635FD6BBBDC933
-:10FE3000F44DCC275BF524F9A954ABD135E98F20DB
-:10FE40009F9DF08546422ED91F7A597AA6F76D0FED
-:10FE50004C67FB12F3D59C6405E293C771AC7DF54A
-:10FE60004B4984273955863BF19C79B29CAC20F9EB
-:10FE70005BFDA1FB10AE6F2AB15BD50108EF9024AA
-:10FE80009E1783AAE74D0B5AE6C9ED2231FF6CF6A7
-:10FE9000D192D69BEDEB194CAFB3F2E35DADCB69DC
-:10FEA00039B13B5A554AAF2F8A7D9415CE4DEA178A
-:10FEB000D83E12E703CEF6FF2AF6D101B57189DDEF
-:10FEC0003EDACDE8008C0E2FB4EEAE3B9572611F8A
-:10FED000F9036EBEAF77D82F95C43EC2F3A300B727
-:10FEE0005F2A93D45EF1552699FD5229EC19FB7ACD
-:10FEF00076231AA063D3F6511FFD1B9FA4FFFEE6D5
-:10FF0000956D7DF705847D9460F611C135C69928FD
-:10FF1000446DF846225FD8D7F76A5796F5FD7F8C77
-:10FF20007D94597EFBC3DF3A4830FBA81FFC4DCFC0
-:10FF300086BF7F71FB68BB0AFF9FD947D9F8E47F72
-:10FF4000B67D94A6F36763E738ED1A61479C69FBB9
-:10FF500046D827C48EA1769649EC2CB4734EC89A25
-:10FF6000EF4E32CF5B15DD877EEAB55C5E17AAD116
-:10FF7000352EBA7EEB7968676C447D3E80EB59B4D0
-:10FF800083023C3E4F8DC0B42F61FDD84697E51CDF
-:10FF90004209E8793DE7365F203C103BAF522DB473
-:10FFA000CC9FE345E061972B8FD3BBF9FC289BD70F
-:10FFB000E3140FA04BD4DE52751FA64FF3F58DAEA0
-:10FFC000C7D5567CB0BC52AF27511E48FBA75D0376
-:10FFD0006C78F1D9F042D621361E28CC9E336DF1D3
-:10FFE0006CFE6A4D42BF39C97622FFD2F3721D20E2
-:10FFF0000889FA11A4FF82D8B21B311E33F8EAA592
-:020000022000DC
-:100000006F615C6341D74C1ADFD85A35FA401DA99D
-:10001000971BD12E9FA2E3BA0AD4CFB8023BA3E725
-:10002000A110AF0DF0731C22DFBF597A9CAF9B0665
-:10003000D8ED725957853F69587679213FD2494F9B
-:10004000EFF6D9E4C365956B2A9F379D9A7C4E6580
-:10005000726D927FA82FF21CFDE41A8EF304B0E4B7
-:1000600049F9879C8F8985F2B98CA7C15AAF4EF8A0
-:10007000CD552E6B181F990B5A1EF29F7FB20A297D
-:10008000F4BF141E35D105DB1F5D5AB91F1D25F0C5
-:1000900072CB7E22E866F21A9ED55AB68CF47BBCEF
-:1000A0009AC5DF1768E4BFD1BDE7B392CB574FBE07
-:1000B000EA3E7A6E1A27FC340CF9B84AA6F70856BD
-:1000C00094333D2EEA9DE7966CF7082CFB365DAD28
-:1000D000E1F634C18F522E1B68077C5AFE503E2138
-:1000E0007FE44CB5DB05A74BAF89FC5EC5A9F2C721
-:1000F000A71D4FD0B5B75C2DE6746DF0A2DDBF2C07
-:100100003CADCF73D4DE745D4BE9EA2F072399A190
-:10011000FF5AB794317ED6B93F72DAEBCAC09A194A
-:100120005BFBA25BA1D32E63FDFA162AFA5F51791D
-:10013000A91A5D07BCBCBF15FA5A13D793E36833FD
-:10014000107C28895129D49F500EF41C111906CF18
-:100150004D7DBA41F7E17405AA49C3E72E956DE3D9
-:10016000A9857EBB5D3DC394ACF0FB16BA291C5E2D
-:100170001C0FF5B4C6CE3DD58038F774EC1F1D7644
-:10018000C3F2D2D119E30CD4CF6ABF3ADD0EEF2906
-:10019000B70BA8FADF2D7654F6762AFCDD624FAD58
-:1001A000427EB7D07F990B764B641D8E87AF8098C7
-:1001B0004EF258540CD086E978E4C3D11A5DBFB62C
-:1001C0004BF47C988AB48EFFB173A2ABDC3AED4756
-:1001D000F6C6289E948001B4BE7E6AE7482706B31F
-:1001E000B8A56112D8EA3FEC76D37215A2F43CFDB3
-:1001F000C46B978469BF06F9549386C3D9EF55EE53
-:10020000D8C36E6CA73178B001F5478C637E81B09E
-:1002100097B53B31B3EFB8818D285F6759F23C2E1B
-:100220000BDA4E2DAEEB0419B3B38AF2BF1FF7B54C
-:100230009060F6D0504EB3AD8BF2E9F7ADAD7DCB0B
-:10024000F9DD5CCEB770FBA81DED238BDCB7F3782E
-:10025000B36D12D8EE595478587CD63B5CEEB77A21
-:100260004D1FBDAFF0DC0ADF088C7739A8447C0451
-:100270000FE5D71AF9B13EF05091B0CBDBE9C67764
-:10028000BCEACE1CDF91ADBD88EBF8B478D9C6F7D7
-:1002900031159ED971BA6F495D44E5B398F34DF1BC
-:1002A0001CA076ED5013923AD6FDE82458F983FC51
-:1002B000EC433F454903190BE915930DD41F251B4A
-:1002C000DC4999CABB763BB60F1F5458AC21188144
-:1002D0009935945569FBB0F2422D8ADA706E9FC150
-:1002E0002AFBBD8BD245F6FB52258E7B1261B4EF03
-:1002F00042E877B5D42BFBF4F40879083DCEFDFC39
-:10030000E9D1AE1A7ECDD2BE5C82684786FECA3D78
-:10031000CCEE285FB39EC5813504E07531DF6148BE
-:1003200057231F17832D89FB16E3399BD9C0E26B36
-:100330000635826CE5E3319E1CDA8F0B0CF32C82C0
-:10034000B7A5DFBEA2EB19A4EB44B0E9B10CFA6388
-:100350008C87C88BAB90E98FF6C434967EA4D0F519
-:1003600023BC08924B08889363B1C52EA4FF1CA040
-:1003700071E8E186E6BD185F5DDC08111C86F015AA
-:10038000E5AFF00C481A945FE06098F0C76036154E
-:10039000188C7C81EBCF02465FC117258DF6FB36AA
-:1003A000E1067BBE88DBFD45CEFB5B8E7E8A7576E3
-:1003B0000F4A5F2403DEFB83E9F6FB3661E87AF03F
-:1003C00001846F7F2092427E351DE338FA572176F3
-:1003D0008587E0F389EF4FFDE559A4FE8F16D5150B
-:1003E000205EB67AA3B9F45E515BE6B8B35EFC2A30
-:1003F000EC8E2CF5D37AD4B4C5353BD3651545378F
-:10040000CF2270AC081A40F59A7915D5EF0A97DF1C
-:10041000E78AAFF0623CE9D2C0E85CD4B37B314FED
-:10042000D2A5E111346E57F4A3F0F85D918F737D7E
-:10043000EA1CEF160FD3A37F07E316C4C3284F2C83
-:100440008CF376858B1E9FA9D3F3422399A1DD758A
-:100450001E3FB32F75F59F56FC93055CA372087081
-:100460005AFE85599E581BF2A75947B613C8FFC3B9
-:10047000201947FA3727B8DFBDA7DE6A5ECFA47E12
-:100480004F512F9600EBBE93D45B8BF321F50C5BA1
-:10049000BD68AF7A77F17A601BD7E835EE66011F49
-:1004A00058FB8BF4EA6F2BEF8FDA833DF5F45EFD9A
-:1004B000DDCFFB336CF5B45EF51E16F0D9C605FB37
-:1004C000B83DE5E7B89371AAB7593CFDBE8A2994B7
-:1004D0005FF6574CA99F45C6B9F9172EAE23AEA1BA
-:1004E000EBB6E0ABBDBC5E2BF25515DEC385B64660
-:1004F000BC07CCEF09C703D3BC31CBF71EBE0A4CF7
-:10050000D3327F9F65ABAFB6F9C01843BFD3FAAD06
-:100510001F2BDCEF9D3719FD71CB0B65EE9FFB5B4D
-:10052000DC50891E1BA0DAF26D61563ED2FBB7B8D3
-:1005300089778AF83D18A22B9FAEB2C877CFF89F73
-:1005400017FCFC3C230DFFFB71A3DC0A3FCB0BF82F
-:1005500045DE5BCCCA47B7BD3F092F56897B00C338
-:10056000DB0A5AA9FFE20B3B3FA9D53E3F964FCF8E
-:100570008FE5C5FCAADBA4C9FF5AF3CB6DB5F31F09
-:10058000CBA7E7C7F2627E356DB9A7353F673DBCA3
-:10059000AF847A7E45C5FD615C7756E0424AFA1D1C
-:1005A000D7F6527C31C9DF3E40D8DB3AD5EFA3C045
-:1005B00038C73BB6FF76BFC2E037D2D61B64E7C16F
-:1005C00050E1E6E7C18930FA39DFF0683C8E8EC130
-:1005D000A978EDF9A1981F90CE935FFE89EB308644
-:1005E00029B2FDA443CFF7B3AE2D2D66EBC9B2609F
-:1005F00044B6AE6B220EFAB9013554FFC435A67F5E
-:10060000F60EE0FAA890AC6BCC9F47EBBBB8BE5A95
-:10061000DBC2DE0B48F0FBB0F1C2D1143F09711F01
-:10062000D69C62D36FFB6AA71C40FFD5B183EC9DBB
-:1006300088A7BC6CDD5BDA021DECDD032FBDD7FDA6
-:100640002CE937462AEC21F61EA63F25F61EA6BB4E
-:100650005BC234FD498B4ED39D645C4C1F6D894059
-:100660008C8CBFA3651C4DEFE2FBAB0D682F92F4A1
-:10067000CB8532F55B6C6D2196B20BFDBD5E9ADECB
-:10068000DBA2AD522BD0DF1BA6F963D2B4EBBC7456
-:10069000FFDA15CF25703EF1BB727A4F7C62A14A1A
-:1006A000D75F50534A6E75FABBC0EB31A9AE11DB70
-:1006B0005D1096593D6F321ECA5CEF46AC372EACCA
-:1006C000527820602AA1C28CF5BE87FC5513E0FD4C
-:1006D00069B17830737FB7617FA303BCBF423D1E11
-:1006E000C8DC9F89FD8DD4181E20DCB5242773BD7E
-:1006F000A558AF4AE3F32D4DC93999C7BD1DEBE5A8
-:10070000E727E8FD9D8BAE066A8FBA0AF5ADD46780
-:10071000C1EB25074441267C9E5F9068C67A17C6C8
-:1007200022308C8CAF872220137E7605487915DE27
-:100730002527FD9074C274528EE74258FE254B392E
-:10074000B627E9F819BC7DAEBD5C8CE76A839EFBD9
-:10075000D37869DCD56ACFE7C94C3E1F6ABB6A32E1
-:10076000CA7D1E3F7FFA35E6C9B8AE4520F411AB0D
-:10077000EF67E5CF88FA2156FE1ACFE7E7B379FB9A
-:10078000A67869BCF0BDB78C289E55959EEFE0EF2A
-:10079000559E3DCB32BF7BBF7741F1AC407A3E8363
-:1007A0006F9D78F6AC3EF63D05F572CF9B24A8B759
-:1007B000F21255547F8EF244A97D386A608D81F221
-:1007C000ACAC6270BDEB2D6B5DA252B84C7A4F930E
-:1007D000C375CF3C3B5C83E6DBE1BA67BE1DAE412F
-:1007E0004D7DC3F59497E9B56CF091F10DEBF85B95
-:1007F000FECD3EFE90EFDBC7DFF27DFBF8436EFBE4
-:10080000D4E3A7AC74D97CA37DFCD29BECE36FBE90
-:10081000C93E7EE9CD9F6EFCCFCA1EBFD01BFBA791
-:1008200097DBBB8AD5EE6C8ED9EC5352EF24AF67C1
-:100830002A563B3616B3D9A7A49EEAE3F6AEAD5EC0
-:10084000B4573D9F8FDBBBB6718D5EE386787F2901
-:10085000D9DA5FA4577F05BC9E295BFBD37BF517D4
-:10086000E6E31AB67A5AAF7A83057CB671C13E2E9A
-:10087000F038B05B791C189577527FE1D5649F5DA5
-:1008800086FBD0A884FB7DAD0046EDC7FB26C3D90F
-:10089000BB477953160EC5F55C9AB2F02C5CFFDAB3
-:1008A000F2C0B66F9BE2637E84B13E85A65A0E34D9
-:1008B00053FF9DB7B9F872CBBDD72DBC5E4F79A061
-:1008C000B9F81B96F24B78FB367E6F70B2EFB7D457
-:1008D0001ED10691FA19FC66978AFE783914463AB9
-:1008E0000D02F75D574D1B6BD5CF5B7C2E3A7F6DAC
-:1008F000281FB734335C6D656CDC7B71DC007E17C0
-:10090000F6477331C5B7C652F17D4370B6F457C48C
-:100910006ABB97AEEB6EBEAEE7B99B1F282370C4CF
-:1009200007CB80F7229697F6EDCF696DB19F2FA880
-:100930005AD4C07D5FC91C6D348A47B67677D7CB51
-:10094000F599CE1F1AF87C5AE7D425CAC9F8B0DF4A
-:10095000EEC7250C0ED6FBC857B9630DBE4C7EDC26
-:1009600056AFCDBEC92B9A960B7DCC23DE62F7E342
-:1009700012D56B64A2DB4A1F3F1F39E8B5D95B79FA
-:10098000F932DD771EAF62E7066016533F610F5EF6
-:100990004BEABCD6F15738C6F3C13403D7015CA685
-:1009A000505EDCE5EC5D157F61422BD3D17FD049F1
-:1009B000CF0381DF7713FDB686A7D1FDF8717E0FD7
-:1009C000560D276A99DF91C3A7715DC5C729D9A8BC
-:1009D00042AA808CED8AADF48DB5D2CDA4F74B4EF2
-:1009E000B89297D2F79ECA08FDA5DEF3BFD3C7FC25
-:1009F000C577EBD37E5B9681BEF7A0B3D8D26FC923
-:100A0000876E488DC95E3F5D8FC1D5C3B761C2AFE8
-:100A100028FF3AE75BB7F1235FA6780BA11FF839EF
-:100A2000F8AC71C07FF42BFF44E671FD01177B77B2
-:100A300041DCB7E1A5D773BFE92CEE776D8068087C
-:100A40000BDF05B91EE5EC5DF85D688C85FE4FFB9C
-:100A5000DC0CAE3617F5778973DF6B132E9B3FECFA
-:100A6000BA8DF6FC6C9856847A6BF67A17F5AF5D02
-:100A7000EFF0D33ECCE77B1D342F433B5EDCDB9EA7
-:100A8000A5818AEFF2CC7BF2DE1ABC1FB5CFC7EE90
-:100A9000EFBD4DF846B7C8DB0D81A41BEF01BCBE0E
-:100AA0006BCC151300DB279795A0BECD838CEFBED2
-:100AB0007DB7CD0E5F7FF03BE10558D2271CEA766B
-:100AC00029A37FABD327CE8919BDB2C57988B88B4E
-:100AD000639C8F7AFC307FCEE17E18167FD15FFB5E
-:100AE00013FDB49FE7ED72A3FC34A9CDF5929C3EB3
-:100AF0009FF2B862C620324FD7EEDAD420B0D56B61
-:100B0000EBBBDED12940F5657314F948D49B0FA4E3
-:100B10001ECAE59ECB4D5BBD72526F78F67ADD5CE6
-:100B2000AFFE7CC7BFBBD11FF9EE43872E43B99CF4
-:100B3000FBB4025E326EF78E20A4E83E36E9C6FDB5
-:100B4000DC0DBB948CE7B9346280F43FF7C741BA3F
-:100B50005EDEB0D3939C4ADADFF093D74702C143FD
-:100B6000F792A3CF0FC275F721899DAB9A5D2371D0
-:100B70005DBB4185EF4433F437C0CFF8F0F0533913
-:100B80003390CED2F6BDD7D07E3BAE74792CFA220C
-:100B9000E077897ACC1FF7A044E3A37BC3C7CEC11B
-:100BA0000E3F2831F876BB923E846FFB56778CC09F
-:100BB000D1B4FD3DCA57937EFC4808F1D0B45BB177
-:100BC000F9899BB62B29CF489A1EC214CF57A41A75
-:100BD000C427D38FF377CDA3FEF3F91D2BDF534248
-:100BE000D8DECEDF042F9114E2F525253215F38FE0
-:100BF0003F10D209AADEEEDC1642BC927E67BA73C1
-:100C0000F11CD8EEF7C6FE3FCCEFDD1FC05137F226
-:100C10005753C70A36DEAEAFBD81FAA5C921476F6B
-:100C2000E32FC5BDCF5D2EF43BCEC1B6179C927DA0
-:100C300039F791E35B4C32EEE19DEF6C3109FC8DAD
-:100C4000FFF5FE96DBD00E7AD6A7A11E687AE83FA4
-:100C500042605937AFF43379EC7EF081FBEF26F236
-:100C6000D1FD470F5D3FBA9F7963884EE6DDFDD821
-:100C7000FF29D249FD05CF5C4CFD050B9E9834B091
-:100C8000AFF513F935697D978CDF3FD77793710600
-:100C900092EC1E9E3AE8F3DC2E057C04CE775FF6DC
-:100CA000D07B524DE4DBC2D148AF79542F637E1123
-:100CB000C1F3FC1DCBDF534666C2B73948C64B07AC
-:100CC00040C4308CF4FEC6D72FACC6D445CF579A5B
-:100CD000E028D5ABCE764D07095DCFCB4EC7E3F00C
-:100CE000911BE3569A76AC60E376103A867AD3F19C
-:100CF0005DFC657C6F3A7ECF41C7E3D0F8233C1F93
-:100D0000845D0519CF85C5F9D9BC27BED9A7BD25F6
-:100D1000F4427F789E2331B8EAFCC6323FCAD7CE70
-:100D200087EFBFBB90D1792A414CF723C78700E1F9
-:100D300093375D47AF41FD78F4198F86EBFD0DCFFA
-:100D4000BC44E5ADFB8917DD3AB5BF2120117BA37B
-:100D50001B7A7E3AD1FE982FB14C537B30E509A522
-:100D6000E9353F7979BD1EA2DF0FD1EF492607F3A0
-:100D7000937BA74B19E8F7AC9FDDE786E4008A97E1
-:100D800079ED7F72D373700B5DA57148CF4353F03B
-:100D90007B367A8AF96B38FFF32D746D67F29B4DC1
-:100DA0004EBBB77A548C6B70D2B9DBC5F6094D498E
-:100DB000E9A54C7417EBE0E99EAB3EE5946F3EEF7E
-:100DC000FEE4BBFFF99C1EBEB6FB751BDF08BC1D15
-:100DD000FE28B3DE3FE897381CCDF525C37BAF83F3
-:100DE0002A44CD416569780FD3B7C948FA9042DFEC
-:100DF0003B5DD6F11CD5DF4E3D313F8B9DFD37AEBF
-:100E00009FE6EFDE3B12F5D9E17D4F517E9CBFE3BB
-:100E1000901BF737CF6F7FDCDD5595E67F5C17AC15
-:100E2000EF5B1C7E74EF48AABFB1FF0CF439C6FB20
-:100E30006FDA63EFBF69C77BB6FEE79A1D6EEA5FA4
-:100E4000ED679CB755E34A9CEFDB9D2EC07793DEA0
-:100E5000EE50EA33D9412FF175B127AE2658F3325F
-:100E6000FA27957CB78EFAAF75B1F112BE9B68BEBA
-:100E7000E862EF56AAC6CB1E229FF13CB78EFBDE7E
-:100E8000D6E015A05BF478C2814FAD50ABC5FD80B4
-:100E900036395A6DDD7F09F8F30CD906FF8260FD03
-:100EA000407CEF0AF7713ABE53A14698FF3A34A549
-:100EB0009EDE7BD464CD9771DD66FDA1DF0EF9DF88
-:100EC000A5C9A05BF86BD4A42BCE45979D0ABA6D3B
-:100ED0003FB066323B0F16F35F33183603D1C36B56
-:100EE000A4A307F09D08F352166728EC3BE0FBFE35
-:100EF00010EEFBCB7ADB7B60183AEA23AA8E7436BD
-:100F0000BE61B9E79C8EE3055D56309E39423701DC
-:100F10002AC468108617E36C87E3BEAB83A601A2E0
-:100F2000DE309D98338CF1371CA5F9B5F57FA171A2
-:100F30008F8539D1513903309F2FB179A4E83E4FC5
-:100F40005CE397734A8BFBD20730593D6CF52779E8
-:100F50006033DDCFA03BF364411A2F22DE4EF4BB99
-:100F6000C63751C2F508E73908DF69C3478E2CEF51
-:100F70007088F8C90122EF18076B6A357C09A6A2B0
-:100F800019935CC3F17C3F21E1FC4AA083A6A5D064
-:100F900049D37CAF26A914BE57A9BF4B86BFC0C991
-:100FA0001C077CA760C73BEDEF5B15FD9518A1639F
-:100FB0009CEF73EECBB3C7237D3B87E9991B73642A
-:100FC00011FF1CB3EEDBE2D04871E02B64CF93F548
-:100FD000C8414EECDA1C0B9F29814E165FE6D82FD4
-:100FE0005FAC2CA2E7FBCBC37DC7752DC5F8F0B372
-:100FF000B297270678676E050A3FF383495E16E7C6
-:101000006D80AE59F91163796AAC719386ED3D1D1F
-:1010100017F2A182783669EA43B922690EF215A166
-:10102000C34ACE8741E8E29D1CA5FE8F2DEE581CD9
-:10103000F97060794C62C1445189F9D50CC5CA0771
-:1010400072CED5C57DC56DC174C22796B899FB38DF
-:101050005D541554FF68846733A7BF933FED71B0AB
-:10106000C2AE0BF09C87C7E3FDACFA77F4FD17B571
-:101070003040E35F02D5AD37E2FBAD2A346BA857B1
-:101080000322BE25C2E216C5BEDA57698F17F538AE
-:10109000E2635D7CFFDE2B5E9CAFC777E0870C765A
-:1010A000B3733D7E3827739C138CCB1C9728ECB40C
-:1010B0004FCAFF62FFD9E8ED7C9E02A11934AE53FE
-:1010C000E57E8BDAE91AF5B71FD921B1F7361CFC9A
-:1010D000746467EE48D49728CFF87E790EFF2EED22
-:1010E000D8BB17EDABD6101879F954FFE90AC1FF48
-:1010F0003269945722E9BC5DEFFDE669F4E3EF51F4
-:1011000000DF753B42E6D889F3548D3C245A0EAC7F
-:10111000B2D1F993CEABF7392693BF9B34217F012F
-:10112000DAEED80E89BDF303E7DE85EF5D351D707D
-:101130004192941F03D6EFB1CDCC6EB8EE178FD786
-:101140001049808D1C1E5CBFACEB4C41BD1F740B65
-:101150009F84C5BA601A9DF8DE7303C7CF8068BE4E
-:10116000AD9E98DF3BB3EA0F50FF4F8CBDFF3C7044
-:101170004689AD7FE0FE119DFC43BEECE5679063C0
-:101180006EA0EB4A343745ED20B29FC6FD47528A28
-:1011900020DC4E7FCAFCDD125DCFAE27EB19BEC747
-:1011A000767DD2B11F75C45309FC3BF9560E703BD6
-:1011B0003200812C788EA4AAE9F92C95BB9B7EA1E4
-:1011C000507BECA647A4248DA7EE3A2B1728DE15FA
-:1011D000EA977A039AEF242B4C9ABF1DF8F384ED1B
-:1011E00078F7E976BCE754DAF11B8CD8F1E8C473E0
-:1011F000EEB861B6FA73954637653E8EEF4AF20F48
-:10120000F14DF4249DC77C328F94DE1B9F73F6ACA6
-:101210005986FE927EF1E8C0DF390EFC1D873D7BCA
-:10122000592944BD4596F84F3545E5CA2987024FEF
-:10123000A55A672DFD1609523F7598772235B0766D
-:1012400025DE0E2654A323540E459C724ECFBAFAC7
-:101250003A9C24E9CD97EF3F340BB2CB5D478B37F7
-:10126000D2E0C2F371883454E079B946D3CD58FF47
-:10127000BCBED65B838EE7828886E91DFCDCE44831
-:10128000157B17A923F54111DA7F778C3E7A19DA9D
-:10129000FD4DD74294BECB1464EBEF2E9E4E0EB2A2
-:1012A00038EBDBA33218E82FD8A32425F44369C612
-:1012B0002F2E42BB6D8F4BA7EB9F76F437FF8B969B
-:1012C0008FD1F01CA3584E8CC271497DEAEF3FB21A
-:1012D000E7F5D0772DF651F7EE7567E3FAB4498656
-:1012E0003999F6010D01367E77E55F8A902DE77911
-:1012F0008FD27DF9F22EBB9FCDBD8BF9E1E6EFBE1B
-:101300009CDAA3FB67B3F7389F38CCEEA54E51AEFD
-:10131000FEEA97487EFC7FF0778CC0983AB38885C8
-:1013200072203DE33E826782C7F53C7EB3E9AF326F
-:101330008DDF1C7F214828AFE3FF08111351DB3CF0
-:101340009BAE574F87A61CC074F21E89FA8F9A0E67
-:10135000B3F56D6CA7DD4F74FE64A21748FF357BB3
-:10136000987FABA68B9D0F9CFFB2BDDEF82E7B7ED7
-:10137000423FFCBB24C0D7AD10149D4E7CEE1E979F
-:10138000B122C0CED3E8BDB2889A79FFD515647674
-:1013900018C1079DFF91A3105942E671A4A1A4169C
-:1013A000EF291DF9809D371CF948A9CFB4BFDA1287
-:1013B00060FCB2C9CDCE8F37CD0E24179379EC9B4C
-:1013C0007DC350DC57FDE3DF6243B5BEEC12A222C1
-:1013D00064BA261AB9300EE5A395DD77834471A669
-:1013E000F793855C083911F2513CDB1FCBE4171DE4
-:1013F0001664FBBFBAD99512C66F773F2BD133A6BF
-:10140000EE2504AE3EF068C29241084FD3EEF7A934
-:101410009FC2BB27B3BFFBD94088CEBF7B89B978B9
-:1014200002C1D7F788709B280FEE4459A6FE4D588D
-:101430004FFD57DB028C9FBBBD6C1F0E6AA218DFED
-:101440008DE8DE3DE9D26504CEBB89FCE1FABDC979
-:1014500015A1709BF380BEFF07FC7E61E965B0F5C6
-:1014600076CB7EED40A0F620D2FB6080C51F15C470
-:101470002212C21DF9F84408FB3FF2A187D2AF84C3
-:10148000FB8B44BB23017E0E17347E43F9654E214E
-:10149000558A915828D23006E0BCDD04DF16FD9D48
-:1014A000A69B49C7C98F01BD479F1F90D97918D9FD
-:1014B000A7E1FEA309C48F49F72B42FEF0D29B6A35
-:1014C00089BB97F648A920D19FD5DE400AFD32F9A5
-:1014D00073647C8387D8A35ED65FA7DD6E450D8CD1
-:1014E000FA177500D03CDB1F097D2CF4786B1ED3F6
-:1014F0007FAD6B54AA1F37AB5D3EF44B97197A9DB5
-:101500004AC6CD57751A6F31780E93F79CE1F7E60E
-:10151000F5D84513001EFB58C9E81F392B28F015D4
-:10152000FB07E26BE481A3FBD0BC8AF8A000E93D95
-:1015300085DB3DE3DF65FA48DC3368EAB94760D70D
-:10154000479B7CDC8E81C4EFF1DCFEA9BFAAF4FED0
-:10155000408FFE993D85AEA7A0543D87FC35E157ED
-:101560007C7BC0F50FD9ED51BC9CFF422C8E7038AE
-:10157000F5CD38207A49EA5FEF38E94C8CF09E7C53
-:101580002941CA980344CE2CED9D7A6A6090AFB38E
-:101590005C4F1D8789032FD6D3FC347A61E4398FE1
-:1015A000857F849E4AF35392E2D5398E04DE9EBC39
-:1015B000361CF5CB0B0AFA518ED4B2BFF393E2720C
-:1015C00094F741F252E487F57B2EF121DFEF3C30B6
-:1015D000C98B62755398DD3B53F74E3781B38FF556
-:1015E0005CD9055E3D5089F890291E148DE42DE3E9
-:1015F0001F4B48FCDEA59E3B3DC3FBD822BD29CC3A
-:10160000EE95ED3C302C97ED475394EE3D7CCFFDAD
-:1016100017422E04BF3BF95BC8439CB4922D7684DD
-:101620002275F0FDA3DD8F10E776445CBC3F6316A6
-:1016300053FB7001B70FE381112BF1CF1CB4A6EA65
-:10164000343CF758101C46E3AB170C60F873E243C8
-:10165000A44D1F127BD11207DFA41EA5FEB1A60F59
-:10166000DDB6EF02BFD9F022F07B01E257FAE4F8D1
-:101670003D3FC8E8ECC4F3A79D7FE94DE332DEE7C8
-:10168000FB5799FF04883DDD45FDB1EC3E89E0370D
-:10169000A13F6A6E6E8BE7E8697D21EE8308BD236A
-:1016A000F4CBF98D89E77232E80FA7DE88B8B4EF82
-:1016B000AE22F88BFC2C40DFEB70EA910FF09762C2
-:1016C000EA77BB2748E07DECF9B765F49B3CF15322
-:1016D0003277521ED93B99F9053B4FEDBC4BD8AD43
-:1016E000C25E75D613F6AA5877C479D3AF83B18793
-:1016F000707C693791A710C6C7B27DF28140EC11AA
-:10170000FC9E4360F6632C6065AA8CED67EDF29A4F
-:101710004D3E731CF2D79152D93B3201F62E9413F1
-:101720000E317E4390BF2B40B80EED9AD21A6083E3
-:10173000CD67EF06948E8418AECF78BD14E7F92BF1
-:101740006E97BDC0D71B911E0844F723FC2E154C85
-:10175000CFE84F0EB7F02FFE3A68ECC3FEBCF5069B
-:101760009DC7200D2268EF0F523BA4088123BF5173
-:10177000977A9C3D625D27FD0D9AAAD7A21C0DC2E7
-:101780003B05581FEDA30CF4F97390C535CDF376E6
-:101790003D8F267CD3D4E6FA501FE7EBE9F7102201
-:1017A000DCCF658F0339F2CC4B83F1FCF3B51FBC62
-:1017B0001FC473ADFF548F0611CE3717FD3E88F757
-:1017C000215E5BC4F61FD738EC9CE31C7FD343D16A
-:1017D000C341927EA7E5E31ADB3B240BD9F9CCF594
-:1017E000490537A53DFC3E777B0EF5ED89FCBC8EA7
-:1017F000025B5EF0E93C0F8BDB72CEBF2AC4E2686D
-:10180000AEDFB1D53D48C7F163FF85E3BFC9EDB891
-:10181000377705A9FF43C0336BC72837E2E13FF7AD
-:1018200078F8B97FA78BE1DF988AE773314E0A27F2
-:101830009CCF3F9B43FBBB768342ED8E9964AC8586
-:1018400084BF637BAEA7FB70E73CAE7D4D9F3290BB
-:10185000D0EFDA1512B557B1FE22C20FB185CBE930
-:10186000399E739E334D47FC08B72B9C7126D7EDEC
-:1018700061E7EF0DA0AF9C589621EE64CFA5F4DC94
-:10188000EDBA7EF63D65216E4FD4C0F918377F1C46
-:10189000AA7E58A5F7BFEF79B3056810D9DB2D5E96
-:1018A0009A1E6ED158CAF5E7DCDD7B9FA77CA67631
-:1018B000D6A0DCEF3CF07ACEB7F4B41EFFF2D6F738
-:1018C0009FBB87E4C700F3F3087FFBD51CEF1771BC
-:1018D0007D7E1DB717C67CD8B73EBF1AF131B2372F
-:1018E000BC428F5F8D7F6FD08207A1D79DF838767D
-:1018F00060780EF2C7E490F3BCF9D3E1255BBB79C5
-:101900004AE67846214787838CAF1BDA2F5F564221
-:10191000C68F3FF3C6902EA6270EA29E107C0AD03B
-:10192000EC463976F2A3E0931EBEDBB39AE249F0AF
-:101930000791AB303FE70CE3FED0C97FFDC537759B
-:10194000BBBA86A05E70F259B7E35EB448AF083107
-:10195000FF7B836E4CC1FD2A596E96B1F340A68F72
-:10196000DE5413CFDF86F2DACEE465DE938FFC041B
-:10197000F5D00D3FDE10423DF4969A28C2F11AB719
-:101980002D0DE1B9FA9BAA19C2F66F25958CF18F3E
-:101990003B4292784FC31627016DE66528C7FFD8F2
-:1019A000E6D2F01CAC69BB879DBBEF6278237976E9
-:1019B000DEBE2B739CC40D0F6C28D259DCAD3D5E8E
-:1019C000A2DD45FD17E85FC361B29D17F79C3F7725
-:1019D000F47D9EDEB48BC7D9ECBA3463BC84884BEB
-:1019E00070F2F16607FF12FC50BF9F49E0A2EE764D
-:1019F0007E4E1E7FF0AE9187087C87DB7F1592AA12
-:101A0000ACFE78761E7FACE3BB3FF2CAD9F9B79B38
-:101A1000F37BDA9E48668C9F6874A542B8AF6ADC97
-:101A2000EAA2FBC0C64714FA5E1DFCD143D7F3B946
-:101A30008FFCEC0F1710F8E63EE62A9CCAA641E39D
-:101A40002404BD7AE258387D6E78FC67EC7C59E757
-:101A5000F12C9C4E731FDBEBC6B81C273E2775ECA0
-:101A6000757739E22028BD3A0E4DA1F7091F3CE1F8
-:101A7000C675F6AD67251858D6BBFD9CAD3F0BA1CA
-:101A8000BE403CD138004EB7EC714BA9CB7E5A4DCD
-:101A9000EB51BF5D7F745C84B23896F2FBA33F25A7
-:101AA00070CC79C543E3A7E63C7A338D337A436D36
-:101AB000667C7FEFD2225C7FE7B8CC228DA6ECFB60
-:101AC0009C2DB7507EBCEEC55B8AF87DA462E6EF24
-:101AD000318B719ED76EFE269DE76C88517E9C737C
-:101AE000AF12453FCB7115EA1FCB2037237299DC2B
-:101AF000BC719F071FD38137B89FD3FC9DC2FF5E87
-:101B0000A4F3BC8ABD1B739CEFBFFF19EA396FF4C5
-:101B10005AF7634DEDCB3B914E6F0F36066A349EFC
-:101B2000403539DEE8FBEBCA8B170FE4FA8DBE7740
-:101B300023ECA049F81DEB77BAE8BB379676B67769
-:101B40006B16F0F109DC7EE93C921665F6837E3374
-:101B5000571271F02CFE46F059363DD0CEE2593E78
-:101B600038C8F40CC6E5D0F24E576AA02D1EC763E4
-:101B70007B17251D67E2E2726E2F2770D278991EBF
-:101B8000FC3E2B25F11D64C12FB3D77BECF1793DD1
-:101B9000FCE37CB7C71E3F739DC32E1369AFF53FAF
-:101BA000D7715EB7F9D4E2671A5D491AFFD4F847D6
-:101BB0000FDD9F343EE28A225EDED9F1DC1FBE4596
-:101BC000F8FE9D0E21C776BDEB94E3393BC7422654
-:101BD000397E2710818C724CBE6794E340FA5C43D7
-:101BE0008733AF77AFCBA277BFEAC027B11B723183
-:101BF0008EF8ED87E60EA5FE0A077E85BE75EAD152
-:101C0000D7433AC573EF783FB6EEA7E331191E0507
-:101C10007FDEF0F03C3A4E0F1F0B3E157C9C256E8C
-:101C2000CC894F67792EFACEC6F6F68B9875508917
-:101C30007FA729EE06F6DE9BEC8F20FFF677DEF914
-:101C4000DBDC32F1FEDB796C5FC8CE3B23010DFF9C
-:101C50006205DE9753329DB34726C919EDFF1FE495
-:101C6000323B09DDB2983E99CBF0D7AA44B923AFF5
-:101C700083DE63A067AB08675E88CA998BC7A990AB
-:101C80009EE97DF4488EFCBE4EFAB8FB87FB2F51CF
-:101C9000D13F3B46BE7938C9EFFCE1CB97A884DE43
-:101CA0009109F2E3C3487ED70FFFC8CACF93C7B8E4
-:101CB00008AB6E375FB96432C9CFE7F39E2FFC24BF
-:101CC000AD636D7E12553E74279EE7A83F657F8FFA
-:101CD0006825917BEFE8F439738E074C1FC9E7B88C
-:101CE000494AF2CBCA7EBF0C3791BFF2C736E652E3
-:101CF0007CD5E988E7C39A97C6EF2C78EA621A4741
-:101D0000FA642EF3479FFBF804FA771DCF201C0FCF
-:101D1000E60EC80E47AB8BF57378E7B99310CFE7A3
-:101D20000E459F5A9A1EA3559D7EF711B49BCCEE8B
-:101D30000FE3FD96789E9BF6F324E7B3534D45DC05
-:101D40008B92C3F842C9959B1F23E9B39C1FFE7772
-:101D5000AE26D621BAEF3EF2CCC0FBD8BB314787C6
-:101D600020BD15E5D89FD1DE3CFAED1CFA774B5E1D
-:101D7000F133BCBDE26778BB327795EB1CF27DB4E2
-:101D800077C8CDC8F4AF483B6EC174AB16FB25A332
-:101D900007A4B0DF6F5DA3B07E03CD417C374E3228
-:101DA000981D2E1166BA9AE0236E80EE1E8E226C6C
-:101DB0008FFF5094D1475374FCA06D7C2825EB26EF
-:101DC00091F32BC7337A11DCD275F4A5712C2FE077
-:101DD0009B911C16EFD2293C7F4278467992837101
-:101DE0003FF52D625631BEB7EFEBBBFDEC7CB31B6C
-:101DF000DB8F4CC70F34FD4DA6FBD9269C03C93F92
-:101E00007E18F8DF2B64EFEB08BFC7F85FDF44FDF7
-:101E1000DFD5BBE7B23813EEEF12E7F935FBD9F99E
-:101E20009CD3BF350156517D3ADEA14727ECFE2AEF
-:101E3000D5AFFD9DCFFD43E8D5122839CDF3B98F3D
-:101E4000734FE17CEEBF013359118B00800000001D
-:101E50001F8B080000000000000BB55A0974545590
-:101E60009AFE5FBDDA92AA54AA2A450804E34B02FF
-:101E700024210B45122004D42220D0314A8016811F
-:101E8000F64881B298AD98B4DB699D438520D2DADB
-:101E9000A319756CCE69BAE785D61125E92924D135
-:101EA000E05432C52204254E9045A01D3BED74231D
-:101EB000DA64313D824BF761FEFFDEFBA82541E984
-:101EC0003E67C8E1DCBAEFDD77DF7FBFFFFBB77BA2
-:101ED000DFBA4409600CD03F1D2403D49BF1970264
-:101EE000307C3C2311F200F47A00D9096054642854
-:101EF000C1F62AFDBB0DA06D338E3385FB6F252AFD
-:101F00006C9EFC53F6FBC1462DAC86828879ED7C35
-:101F1000DEDB652B4031CE7F1154533AC0B4BEECAA
-:101F20009FCFC1BEA1DB002ABD979EA0FB6775AA0B
-:101F30001F459B71ECD74521BCB435CE560053F1FB
-:101F400095293A50CC6C5EB88AFFE3947850B2C3BE
-:101F50007D4BB633AA2FC7DB764122FEF07B7A5346
-:101F6000508E227E0B12DCE3A3E679DBB6A89BE45D
-:101F70002EB2AFAF20B9134B32A2E681E3FA4FFA8B
-:101F8000B09F8D7F573300A643656208E52F844AD2
-:101F90008F84F2BA3F027708E59F718A8FD39E73D0
-:101FA00087FCB217712CF928FA7A2944F4719EC77C
-:101FB0003EFAC27138429EE9F604D7050BFE180FAF
-:101FC000E3AFCAA3E2E80E114EA76437AA01EA8F75
-:101FD000E12017B69F810A88DB3428480486AB0CC1
-:101FE0002AF6DF04EF0B73B0BDB279C871785218CE
-:101FF0004F87271ACFA445D1788EA98CC673EC8A57
-:1020000068DCC679A3714ADD3825EAFE4D9B0AA338
-:10201000FA373F561A353EDD5F16D5CFDC5E1E35EA
-:102020007E52D3D2A87ED68E5551E373D4B551F7E4
-:10203000737757DD90FEF303F551E362F53FB5E3A7
-:102040002751F396CAF7CA9011E6811FFF880785CA
-:10205000A462D23FEA210423F53FD3E527C6FFCD92
-:10206000FA7F98F49F1BA17FF9DE44AF356C6FB106
-:10207000ADA6D79FD05AC7905E714E14EE0AE919EB
-:10208000AF0D1AACDB256C1DC89D7BF1FA63667E33
-:10209000FD5181CF95B83495D6EF081EFD5AC21672
-:1020A000D5C2ECD0FFB1456D44DE3C2A2B0DC4AB4C
-:1020B00017E54A09509E54549D2E1379A4838D012F
-:1020C000E4F7B33ADDEACA08F99EB373BFF29C5D48
-:1020D000C7DA5F18D156F1BDA916F09B0BD973B4BE
-:1020E00036FAE7015CB72D8981822F2CDF3E7F0E07
-:1020F000DE77F4652B0E0033F56F01381FCFE53D19
-:102100001FCFE55C65521AFBC87FC8EA2492A7D9A5
-:10211000EEDD69C7F79C979E30E09BC1E0F21BC8DB
-:10212000EE52CDE0B7E1FB1A0DB0BA12FB0E7049CA
-:10213000F5D826C24E3BE18B622857911487AA72CC
-:1021400013FBF0FAFB24D138B231B70E6600ACD4E1
-:10215000FCE1C61CE60F87718DBDA450BD9208D866
-:102160000E3F90C9AE9FBB0FAD10EDE99C91E3A16E
-:10217000E17051F8C9CF379B597B69B33DCA6F6E87
-:102180006C7E2141C179CE65C3A240047E5D84DFAF
-:10219000746A6586DF80FAC764826770DDB7934929
-:1021A000689FD4BBCD8A439EDAF10F95807A30B612
-:1021B0002DF1A34E60A55161E3B5797CC1B94038DA
-:1021C0001063E9FA3D1FC22692EF9E6FB18D785FD2
-:1021D0008FDDC0DED743EFC376393676C46D39EA7A
-:1021E000C541EDD1390BC82EF07A48C2FEE26E30FF
-:1021F000903D2CF1A61B489E93E03EDD8EF29CB5EF
-:102200002BECF91F42A581E43A735F6D028DBB365A
-:102210009F360F0AEBC078F2A1C36F4846BF3574F2
-:102220008BE4DEA5B0F799E97AE5BDA94F5A95F0A0
-:10223000FBCE80B7FF34EA7B29B8D9BCDAFC6879D9
-:10224000517EF18D8DD5BF4BCA207FA80333F9C3D2
-:102250004E13F3878355575A5FC2FBAB53FB6E3265
-:10226000E273E7ABBE9D4CB8ACDC218382FAFF245D
-:10227000C1FB07FBF4301EE71EF87302DD5F6552F9
-:102280005F7909ED00F698DCAF003DB7873DA78D7B
-:102290001BB0CFFD8C78072508D4ACEBDBA786FFFD
-:1022A000BCD773C612CF347E3D28F855FF5AD65896
-:1022B000E2537DC2357EF1FE2B9963895F3324CED4
-:1022C000CBD879BB905F4A16AE1B79A520AFBABEBA
-:1022D0002A4B223FB1EFB8B388E4D483F76AE4BA5B
-:1022E000F6BDBF2A97EEC359D70DC94BB6E947399A
-:1022F000EF012E678FB08F15C1A422D23BDA9DC5A6
-:1023000081E356FDC76BFDBF257C3AF7BCF2388DE3
-:1023100029BE313C34FFB4379EC7231071CE2D70D7
-:10232000C13897AD47510721DE4DF9C2F5FCD65EA5
-:10233000F20BC8AB2B3A747C99E4AF2A81FC82057E
-:10234000DC0AB5E865DE9B8D7A6C3CA083A7B16B97
-:1023500023A7A6F99F12ECCB3AEE7FB06F4EC1389F
-:1023600022FCD324C7BF2EDACAECC7635D3383B91E
-:10237000442657F1E1AA0A7A2FF4A21F47592BF1FC
-:102380008FE2C16CD874280EE59CB103F3031C37AF
-:10239000F32CBFAFF9F55921DD1A63228DFBD91754
-:1023A000B28D208A8E03B30F977F4AF3CE8688E7DB
-:1023B00046890FB31C7F5F7C98EFE0FE2190CDFD36
-:1023C0007B2014AFFAD3D9B44595F9C817278F1FCE
-:1023D0002D8839D9B1511AC836A31F5EE468DEBE14
-:1023E0007D02D26122C785FA8DF45B29623CBE96DC
-:1023F000371E9EC2FC21FC05A522BCEC42E61879E2
-:102400008AD1EE78307647E59DA123DFD8FA701D9A
-:10241000AD4EE5BF485F4398D7905F88D3F7191D4D
-:10242000A3ACEF4DF2AFC8FFE71C3A26AFB943F2B9
-:10243000A8F87EB3E20109D71067B74F93A5F0F86B
-:1024400032078F4BB547CEA719515FFDBAE3B63CB3
-:102450009CBFA6FD0D1B2E1F7E6CF3AE73E03CD51A
-:10246000E73E9841A10B199E569940386524923D4C
-:10247000E5EBC1AF2F1C29876F072E06295FB72315
-:1024800089B5391D125B9F2FC4D739D0D1E88CF4A0
-:102490001BD79EFBCFCEF1A4B73D636005F9E3FCEB
-:1024A00060D106E231C962405DBCFE552E9BEF094A
-:1024B000473ACFAFF5A0A7EB00AA6E290EDA63C0AA
-:1024C000E770DE81AF64364E9B37BF63AE6C471E4C
-:1024D000E5859A0E525E18173429A4E7B89781E370
-:1024E000128C637ED1D7B510287F1D74805BC2FB30
-:1024F000ADF1431F132F863A4DCA2E89F06B022788
-:10250000CEDF6AE4F133070DE10D6BF8BAF6BEB821
-:10251000E0CF81FC15F2C3A3D27D7D13DC628DC4B4
-:102520003D81C9FF4B07E7576B7C486725BF8F9CF0
-:10253000DCC5E40ACB09ECBD9A9C39AC0E68350EBB
-:102540005D78DCC5E4B2131F7280CB09C12CE515A0
-:102550007ADEEE61EB88B32B6EBF34522E5F01E65C
-:10256000C56877CF6E816B764E76EF8B0FF7CD68AF
-:1025700013AD1920FCC229968784FBE8B04AC2CF6C
-:10258000BFF1CF67B66F9DC3EA23BF8C7CB0609B61
-:10259000E0A47572FBC2B2C933A690E3E0469C2C5E
-:1025A000667EFFDA78E4BB95FA563ECE9D68B79416
-:1025B0004BCC6E80ECA64EF89987A4D085DB50B545
-:1025C0005F860E1628284BCDD1B7196FAB75C19712
-:1025D000F2F17E59BC3748FEF7AD8F7460C3F57FCA
-:1025E000FE5A9C5A817864EF6F4EF65847CEF7D466
-:1025F000D92DCFA792BEF74B0A228D79E1501AC987
-:102600005717FCD4E8C17661C7EF8D149F5639BDCA
-:1026100047C80E4A3A1AE6117EB3A0A9D16E657E6C
-:10262000D14B3C0DA470FF317C6AF2AE8608BC2F02
-:102630003978DE0243DE9BC96E82C23EBB28FFC1F1
-:10264000B65DE461ED0756662AF9E1E7FC703015E6
-:1026500070CE2D70389570D6AE0FAAFA45C4A7DC9F
-:1026600033E6D59E08BE5D10F67E41BCEF1F9DDEB1
-:102670008F0887EA039F186DB82EDF1F0269149F29
-:102680000298A7D9BFC32FFA62ECC6A71F32D2782F
-:10269000DF45607E04F5BA3511F5B4E74CC79435D3
-:1026A00056263F24E2BADBCF9998DF6C4FE7F6D786
-:1026B00070FA7201F9ADCB9DD537135EEF3B0C1A62
-:1026C000CFCBE2C99EF602F3639A3DE6913DA2E8C4
-:1026D00079C4F362EAE7B0F95A8DBDE5CCFEDA754C
-:1026E00040F6873C67BC479EDB29FFC8B323EFD980
-:1026F000F359CC9E5B7B31E061DF8F7E7C12EB97E0
-:102700002DA37E6BEF7C3BB3671D425B4876193A85
-:10271000C8E609604C23D549501999A796396C4CE5
-:102720005ECD3F563AB8FF0F642B896E5C8F45969D
-:10273000A3EC20225EF2BE88A72B9F37FCF4C509CC
-:10274000644D222E88BCAC4BE4C1E02D62FEFEC776
-:102750002296D5BF53BAB805D75BDF2373FF2F7816
-:102760007250E4C98737A7B03EC50B05F5341D5B31
-:102770000FFAD3199E4DF3D0C6A06451D3216A4BF2
-:102780002B03F3107198B3A2F790819B732EF1AFD6
-:10279000EDE00F72F5C4F77326884311DBBE19FA1A
-:1027A000F875C4E1912EC47F94B884CB61FC4304D6
-:1027B000181FAFC79B41A9EFAED96E4CF99F1FFB05
-:1027C000037D1CDA0F1103F1C87B7ECC4FFD28502E
-:1027D000BBD333D58938FE36C93BD589380E9EF830
-:1027E00026997C7AFBA94F6CE4EFDB8C9E5CE25966
-:1027F0005B06D60BA3F0738293F3A7D8149DA76B47
-:10280000ED5227E7FF643F3C43FCA96B93ED2AEAB6
-:10281000BBBF4DF618318FBAE0F126EB11D28BE039
-:102820005F3E9BE2BBA87FD771D8611DE52F18677B
-:10283000D6BF6888AA4B6BC4BE4616F46D4B459C48
-:102840007C2F4BACAEDD18938FD450FE5240F54533
-:10285000B391D653F572CC3C94C714D0B8EFAE7395
-:10286000973AC53E472664521E833C62F5F4D06910
-:10287000D9BD8B62A01EBA4DC8DF3D3A8E13FA4D0A
-:10288000668F5A3E637279E691DDCFD3E28AA85B08
-:10289000875A2595D9CF6EF4F3D82FBDA83403C736
-:1028A000E154CA0C5A0FE765A99E8F2F0DA633FB82
-:1028B0002BF1603D8FEB5E8FF5BC4AEBD6F23CD539
-:1028C000C0D68FE197E579B3406DB4E1B80DBB2573
-:1028D000B6EF53BDDB1095E7F9043E353B4E1CA126
-:1028E00072B23610735FE0E38BC1E70DFA316B24EF
-:1028F0004E8F3A45BE97066991F91E743B47AD0B62
-:10290000347CB43CFB4F069E5F7C20E6D7C6FD8B33
-:1029100093D7E7751E60FB4735AAACAA3C1FB4AE3F
-:1029200041BEDC2FF872BFE08B0FF8B8DADD921AE7
-:10293000A278F533AE7733FE112EEB026B16A42A84
-:1029400023795525F0D8D86260F92FC02623D9E71E
-:10295000C69D31E3042E5531B8D479A518F9783ED7
-:10296000FEB7CA576DE0FB35D5C82FBFF2FF276F02
-:10297000ACFEFE5DD3DF149812A5BF454937A4BF56
-:10298000D83C79EF9129167A7EB83B83ED4368BC39
-:10299000899D6781C8B317EEE0F9687FC73C4B3E5D
-:1029A000D553C7F56E09E729EAF95F5B3EE251D8D6
-:1029B0002943054E31182C7AC68FEBDCD73D71992F
-:1029C00082F1A1B047CFE24B514FA14A754D614F03
-:1029D000A1253381194F12D50B380F8BCF83C72711
-:1029E0009ECC233FDB3DBF98606F385E68A13C62A0
-:1029F0001FF07D0DA9A738A92F22DE743BF9BEC6B2
-:102A0000B694FF7996F2FC857B0D6ECA47161A863E
-:102A1000DE9FEDA2F7EBDD0DD8AFE959BB258EF4B3
-:102A2000FE9AE4A674FC486FBDEB47A4DFA0C16E1C
-:102A300062F23E7C90EEFB5B24F7241CEFEBBC3D86
-:102A4000B715FB85CD456E82597B5FA14379A18285
-:102A5000F2C5711656C72FBCC9C0E2EEA5F1965F4C
-:102A600053BE54E5695E40FEF8D2DBFB8CE40F06F2
-:102A70005B2548C1851C4939F41B3FAEF3D29B2727
-:102A80008C9494CF6B3B61ECFB8E7CA25F9521C450
-:102A9000EAF72623D541B5CD5ABFCF487AAA14F913
-:102AA00055DDCBBF67FD2AAA13F07D553B6555C1A7
-:102AB0009F873ADF3212DE752D128C4D8FB8FFB230
-:102AC000C4EE6BBC5F0B9C076B857FAA16FB90D591
-:102AD000B40F89D7613BF7371AEF1FD8BDE40885DB
-:102AE000EF754DD17EE841C1F30D5497B2FADB6B1F
-:102AF00024BD6ED811334EF0FCC1EFE1B93549F871
-:102B0000F31CC8219E5F9ECBE3C9E513F1963C5CA4
-:102B1000D7E563B21BE03BF9CEE2EF71912F0C8752
-:102B2000742C9E69E3063AFECCE28DEFF8B091F288
-:102B3000DB05C12F983E2A8207E613DE7782B7862F
-:102B4000F0BB3368B193FD57F4717F501E34A9B4C4
-:102B50000F7E2704B6929E07BB5EDDEA24DEFC1BD7
-:102B6000E70D087FB741E0BA41E0BA011D7E12BA15
-:102B7000D8AABC032F61BA0FE5C0FD507940F8A177
-:102B80009DD13863E4B98FF4551734C1D378FF0E63
-:102B9000E18FEE68E1FE28364ED6897D80C171B99D
-:102BA0008BD97E2BD6BB94C7D5B444E35F27F605FB
-:102BB000EA62E2F0CD497CDFEEFBEAFF583DCD8DC5
-:102BC000D153C510E74F39C53D5C7F77684B1EED8B
-:102BD000DB6978C5EAA95BC94C1CAD9ED5DAF7451F
-:102BE000DEAFF517237129DF0CD89BAC9175FCABD8
-:102BF000493CFE54CD92FDA4E76BF5CEC443058A53
-:102C00002E5CEF609DB332690CAF7BA6E1D4472701
-:102C1000C8E07285EB9DA7525EA828A47CA585FB21
-:102C20009181129C2F91F27960FECBD76252A94E0E
-:102C3000F1217F589D43BCC1B63228DD4EBCC1FA9C
-:102C4000611DCDBF84B68E1187251D3CEF5932FF23
-:102C50000BC6B76313F97A87F5CAD8D1EA09AD8EE6
-:102C6000A8FB8AE7A9DAF53AB47B1A5F1794585D96
-:102C7000DC76F0EBB474F49F839D57D2D660FBA250
-:102C800058BF96A70E619E9A21F214CA9FD77395DA
-:102C9000C1064C871F431EAE17710EA4ADCC4EEA81
-:102CA00028D925BEB54B7C1F673F5E9889FEF78308
-:102CB0007896C70C9CE1E743F4FC1398470DAC0DE4
-:102CC0001C76E2F8CBAD128B7FEB31C7BDB570A49B
-:102CD000BDD70A5E36C01651976D656D79F6DE4F29
-:102CE0001E277FD46256C8BF0E74341AD9FEB21A9A
-:102CF000F17CC6C87CA856F0B7F67BF6B55E4D12DF
-:102D00007152F012D7C1F2DBC163B2DD2431FC7E17
-:102D1000353E122791FFB41D8C637A1E3C61552904
-:102D2000CFFF5CF0EF92D8776F2891192EBA59BC7B
-:102D3000CDED7A2B83F44A7AF0D23E4AD75B533CEE
-:102D40006C9F4F65F654BD5BA6C3BEB0FC010BDBA8
-:102D50000BD5FA1ABE3E812FCA35D9E80ACBD5AEBB
-:102D6000EFB3B947B11B493AC8F4A693A2EB5CDFB5
-:102D70007EB9528DB0275CCF6AF26FFB053F403FB2
-:102D8000944C7EB9334961F23504B99E759DBCC53A
-:102D9000F72FE7FB3606F6FE11F7CBFC3574FF7212
-:102DA000BA05184FBEF25750FF910C99F9A9473E4A
-:102DB000A8CA8288F783C4EB719F612899D5C3277D
-:102DC000744C3EDF89E1E48956F283CDF3ED79E47A
-:102DD000DFB87F389261D948FCF6D37BC786E759C4
-:102DE00098C4E33CD07A53289B7991CF2BD6BB056E
-:102DF00096321CB6089E75897C14EBA633648FB19D
-:102E000075D3F5F2DD88FA8D3D7F79AE72F247C851
-:102E100083C2637A3FD5EBFBCE723FD1D0B9E17765
-:102E20005407FBCE9B80FCC4235D1BB2280E83D7C6
-:102E30003B95F2BBCB5D0F4E65FB97D21626979F55
-:102E4000E44BA1BCE97432E543B59DA793595C6F8F
-:102E50009FFE02E5499817DD41D7315F61FC2BECFD
-:102E60002966FCDB77BC3829930407B785E6AD3DBE
-:102E7000A6AF247C6A8F15BF5741F94B4F19CB93EE
-:102E8000B4BCA888EA71CA938E4D8CCA93FA057EA9
-:102E90008307E2D8FE8704199C3F30318A3F356DA5
-:102EA000EFB07CA2A643F644F2E8DA732E3DE38D40
-:102EB000C1A5B0F91A029287F1632F6F6B3AF6B190
-:102EC000F5551B024CDF0D2D067EBF95B7004DEC6E
-:102ED000793F38FD84C77B7409F5506E5427D0FEC6
-:102EE000FABBE9BCBE88D5C77617DF4F78F79CF7E9
-:102EF00066E2CBBB73BD59F651E2861FCA78DD2D61
-:102F000009BCDB0C2CAF8C1DB7CDC5F77B6C491011
-:102F100075DEA8B5F52ECE9F7223DFA78ABD7FABE5
-:102F20008BD7CDF8EF191DF2E26485C1FEB4A82756
-:102F3000C6A1BFBD4BF8DB65771A58DE71529C33D2
-:102F4000DDA5F9DD121EBFB5FDFE253BE1492CFFD5
-:102F5000E14BC863E7604B3CD17EEF6E915F2D5B28
-:102F600014735DE453777F4F3E35C325FCE16498CD
-:102F7000CCEB06AB85F645BFEC36D86526B73AB143
-:102F8000327FE43A357F73449C0F75A31FA4B621AA
-:102F9000E743B64FF5EE8173BF71303F1A07197CD6
-:102FA000DF91EDD7D75E67BFBEE19A9DFE308A778D
-:102FB0009A9EFA29CFCF1BA9A7A502EF5AF3252382
-:102FC0003BB7844DDB7572F89CD264F07A52711D68
-:102FD000868EB9213ABF6CC831B17CA9FF764925EC
-:102FE0007F8F72A69922FC7DFF389E7F3DB25C6286
-:102FF000FBC207723E6471BC36D46B245E4D6E5BBF
-:10300000F324B35F3F9CA27A49D3E762338F9FD703
-:10301000F4A8AD976E2AB43EA79FFB65176B693C79
-:10302000C5CBBB447C5C5C12ADBF2CE85D40FB2390
-:10303000F77824962F5D4FEF4B574C7B87DCDF8D65
-:10304000EAFF9F5CDE875D64EFBDC3CB697FF7DD80
-:103050009C4FD328BED65D87CF7E81AFCFC2CFC570
-:103060007C167E1EE6CE521AFB101FBDC3BBD9458F
-:10307000FB4FBABFD8A600CDD3F7AB7A89F4030CC7
-:10308000FFEBD9D13631EF36979DDB8B8B9F0FC588
-:10309000519FECD9A04E203F01793776CED7B0FFB3
-:1030A0006801E969E0C0B10263843E2FD5A33FA067
-:1030B000F8D2792859B146F24D27F8A667AD242DEC
-:1030C0001571339A7F97887FA4FFBD87EEA2BAB0AF
-:1030D000BF6D994B5222E26AFB49DBA48879FB83DE
-:1030E000321B8FF5D8E4BB1322E57C92C9D91FE0CF
-:1030F000F301F44D5E961F79BF919F1B99FB188FCA
-:103100009FCADEC4CEDD351EEB81F3B8AE6309B0D5
-:103110003825D61D30E20FAA33BA4C2A9D53D07EF3
-:10312000BB23C24E8E0A9C67627140FC9C057E994F
-:10313000E69D8933DE4B7D3D84E84C6E3684647EAB
-:10314000DE3D0188D73304AF67EA4307A402368E19
-:103150009D4B95422F1B772B0CB1D603763DB56561
-:10316000E0666D89397407B993BC40807D97144A35
-:10317000D63B2E98D951298CA6BFF0FAF57041E3C1
-:10318000290EC6A487EDE3C78E1B1676EFA6DA825A
-:10319000F4DC0F6C1FEE16E893E925B3F5B088BE9A
-:1031A00027BB450FE6789477EF611DB3E7AE3E4548
-:1031B000257FE64E12CF7D86CF617FA687DB2D85EA
-:1031C00020FA6E455B6F2C0EA5381FED0BCED46335
-:1031D000E5CB700CB1F7DD4682E3BAE782A2A7FE29
-:1031E0001F5DE9623F85D769F3449DA633FB191E35
-:1031F0007F12F191CE736C384F69930467E97C2696
-:1032000093AF579BBF14B3C1C4421ACFE31B6D8564
-:103210009F75F2731E1B3B9F9B6F27BCA450B2EEA1
-:10322000AAE5C6711D4C0626B7EDFEA181C78BC36A
-:10323000E75DEEE0D1B3F45D8EE4F1B0EF7ADC66E9
-:103240006B88F27364C7A5C8BCFBAA6BED5FC9DECF
-:1032500025C5CEF0022F28947F8C0D7FEF02579367
-:10326000C2DFD3108C1793C3E7FBDAF735BBD5A5C4
-:103270008A0EF5B2C26576935E0ACD6945540F3663
-:10328000DBBD7F75B1EF6C5A26B1C9F4EAF4CA848C
-:1032900030DF2DE02921BCB5737D49E8EF7AE7F6F0
-:1032A00064ABC4730BBA7DFA2EE819B417B373B4C8
-:1032B000EF8FF8793E5AA142DF1DC113F314FA2EA5
-:1032C000609BC3EC7E5AA2141FD76709AFAFD1CC65
-:1032D000BF276834F3EF0260EB74B67FF690388F47
-:1032E00068B4EAB2A9DE6A84783795F49ABC0F25EF
-:1032F000703E3EF4DF16763E1A2BF7D7F1DE9C3196
-:10330000D3C3F23F2ABBCF62EE1385E71C0D4F5D9E
-:1033100018CF156A46639FC2F09B46CF4F33A9373B
-:10332000D1BEC82A13FF7E49C30D15CA486D17FACE
-:10333000D0F0B393BE691D1ED4B7C6978C307ECF34
-:10334000C473DC0CF4E544267B56217F1D8BCBFF38
-:1033500001AF6B7F8EF0290000000000000000002C
-:103360001F8B080000000000000BFBCACFC0F0A3B9
-:103370001E8143D1F8E8389D0F534C941182D7B386
-:10338000E0D78B0D5B3122D8FEDC0C0CCA9C0C0CF8
-:103390002A40DC07C4FD40FC1E880DB818180C81BB
-:1033A000380DC84E07627B2076E386E86966676061
-:1033B000E806E2C9403C9B9D74FBCD251918CECA96
-:1033C00022F8B2720C0C510AA49B338A87267633FA
-:1033D00042E5C76BA3F2BB7419184E23A949D02646
-:1033E000CD7C466306062663DCF271E6A8FC504BF2
-:1033F00054FE5D3354FE4577080D00AEA32483B818
-:1034000003000000000000001F8B08000000000007
-:10341000000BC57D0D7C54C5B5F8DCBB77EF6EF6AF
-:103420002B9B0FC20642721302040CB8C480C14A1F
-:10343000BB89A0A0C85B502B585F5D02242004828A
-:103440005A492BFE73212104126041D4A0881B3EEF
-:10345000142BD8A0A0B6B576F9D0529FCF4645A57B
-:10346000ADA50115D4024DB5C8F63D7DFCE79C998C
-:103470009BBDF76637E0EBFBBF7FFAABC3DC993B44
-:1034800077E67C9F33676665318564E6117211FECD
-:10349000BE47C8040B21644CBC244155206309F984
-:1034A000919DE09FD6CF5C36D61312B511129B4B7F
-:1034B00048A78B76946AEDA49896B7DE28922C42A2
-:1034C00052E17D859026A1F6C8E05242D44122D92E
-:1034D000491FADCA999E1A72251F77371FF7B97A0F
-:1034E0003B961DF55E2C9FAFF761B9AF5E21D161B0
-:1034F00084BC585F84E5CBF57E7CFE8BFA322C5F72
-:10350000A90F60F96AFD242CA3F5412C0FD6CFC07A
-:10351000F2707D08DF7BBD7E1E9647EA6BF1F91BDA
-:10352000F57558BE59AFE2F3B7EA9BB1ECAC0F6347
-:10353000F94E7D1B9647EB23D8EFFDFA5D581EAB85
-:10354000EFC0E77FA87F19CB0FEBA358DE4ED20860
-:10355000E947C86DB79DB7CFA2EB1DF6C47DEF4C10
-:10356000CE2464FD18D10FE01AF6C4C7BE50717C9A
-:10357000DDEBBFB1CCE8480097EF1301C759EF2648
-:10358000D8BEFEC0EF893292907563BA7C2AAD4FE7
-:10359000E6DF19BEF3A87D5671BC9F799C4F8885E4
-:1035A0008D63A5EDB4DFD0CDACBFD63E19BE3326BA
-:1035B000DEFE54DB3BF6D92E7D3B7BFFE92DEFD8B9
-:1035C000017F6B63128922DE554268E950BADBFA4B
-:1035D000513CA71CB3115B3EC5BFD241BAE838EBE2
-:1035E000C63D12154B61DDB49B02EB7C9708140EAF
-:1035F000AA9B203D2830C6D5F1EF5C4D449CC7B056
-:10360000278EB2EFDC7A1ECB57FF211342DF5B77A8
-:103610009B1071D2F1D78DFFC217007A539FB10072
-:10362000BD21B92AF09F2E5F908EBD7EFCFB3E959A
-:10363000C269ED37EFCE980DF4379AF8E17B6B0F46
-:10364000FC9C28D03EB21BE1D7C0D7BD76E6AC3C8F
-:103650006F7172BAA49444C432BA5C17094412C0A0
-:10366000F75F0108143E166F04D7E4A0FD12E1E1F4
-:103670005F898CFDD6BA83EF015CD4DBACFE9D7410
-:10368000DED7F9A3E4942B3E6FA87F44EBAEBF478F
-:1036900089C50DF3FECC67A1EB7796C957A5D0D9A4
-:1036A000B8BABB8FC1FBAE6BAB02B0F675A3BB7CE7
-:1036B00055B4BFBDA813D74BFCC43F848EEB285232
-:1036C000C9EC62808305F16A9ECF6C80773FC0D3DE
-:1036D000573EC0894687EFDDFAAEBD52D7FF698DF0
-:1036E0003E04465FA4356A9FE68EB73FA1B5A7307A
-:1036F000FA217663FB66131D939C24ED560A68C479
-:103700009718D92920DCEDD347F69E776BF4B7C81C
-:10371000072E7FD41E4AB02ECA2776903BA9A5A2B9
-:103720001FE0B56E3CE597E2F83A2FC577CD1C2E29
-:103730006B4BA7BB61FC4BC9AD911D2289167199DA
-:1037400049FF7FE5CB0E3AF3787D7434DD50BFEA54
-:10375000C80043FF319D0586F6AB8F8D30B48FEBEB
-:103760002A31D4BFF3E93586FEE3BB2B0CF5EFC558
-:103770006E34F42F27B718EAD7D97F60E83FD13BE2
-:10378000DBD07E836F81A17DB272AFA17E53D10366
-:1037900086FE37FB1B0CEDFF52D662689F1678C879
-:1037A00050BF65D2E386FEB705B71BDA6F9FF1AC59
-:1037B000A17D66E80543BDC6113A0EF8F9C1BC5FAC
-:1037C0001ADEFBD7DA4386FA7B844C4A845F2230C8
-:1037D000394329C87BEA0ADE9F8A382FD01CD07172
-:1037E0003F46A745ED49E4246F7F66C73BF6B9061F
-:1037F000396965749CCDDA7745DE49FCFE20CE2719
-:10380000A4D33EDDAD6F67F3BAE21F54BE42BBA442
-:103810007E2BF9EAF6FAB1BF2657297D13720D8582
-:10382000AF3A5055F17B743C2A2F2D6CC9A48E30D1
-:103830003945C8BDF85CD3FB2487442D74DC06777A
-:103840004EFB1A80091D5BCA847AF136A88B4A8028
-:10385000742580ABC52B1BF064862F71A55362EED7
-:103860004BCEAA083F75222992E0FB82C3BF9CAED3
-:103870005722A101027D7E410CF960F24B2DEA6FC7
-:1038800042F9F1FECBC7D37F42FF13426405F657DE
-:10389000108E0D234900F4869A2D4776E6233C6D61
-:1038A000204FB4F7E803A58BCD57BD38D85067F348
-:1038B000BD64FDEB61C6BA36EE4F8CF0A47086FA9B
-:1038C0005DBCD26BDD7E394EB716E8C7EA8A289018
-:1038D0008B28078DEDDA772EA4784691548A473BE2
-:1038E0002B973A3CDBA0BC90921B211E428AC5500C
-:1038F00005C04DAD60F0518F3B230D385EEDD5C155
-:103900009100DFC4F602212B187F7C3859D4AF23F5
-:1039100019DE1AC06E1BA6A3831C3FCA71BA6AD4F3
-:103920006FE6FEB70B321BDF455145C7B711466343
-:10393000A996D0EDC218586D9048384F3F0922BE65
-:103940002611B04BED1A3CC373B1EEE276E601F7F7
-:10395000D863218AE7B501D90F63550A0AC783DF07
-:10396000077AC056269235B4B65679C70EFCD19C5C
-:103970002F67835CB749B5C44BEBB642CA0709F45D
-:10398000C8E21E39F120B91CBBD88CA722FA3A9B99
-:103990000741386AF30F0FEAB417005D8EA776313E
-:1039A0009DEAFA6BFBD62F2B397C5BC02EA6E53A3D
-:1039B000657A2A41BE253381BE9BF3B344E4530E9E
-:1039C000A71EB8E4BF6F073E5DCDDF5FEB7F07ED5D
-:1039D000F4D59A1E37C1B179F44984CF2C81E9E33B
-:1039E00096918E19910470992578B0BD19782A1393
-:1039F000ED2BC65F267AA12DBE4ADA6E57BC256B29
-:103A0000E8F813464A33812EDC6544B121FF065C99
-:103A1000D9F4FB0EDE5B524483FC706732BAB57F8B
-:103A2000284414DADFE563DFB3B9482480EF2F318F
-:103A3000E0C551169A4246513BE91F167C8FCE9144
-:103A4000D9114727233F5ABD6C9DA488E1C94BFF7C
-:103A500077B1808EA7C806BDB1BC5CF647E9779602
-:103A60007A5C484F563D5EE9779DDFBC1084F15784
-:103A7000E5DCE3584EC7BF50DEB40AD8D2F2E1E429
-:103A8000CF80EF2CE6FE83A6FF6E70023ED04A6721
-:103A90009787443360803BFBA403CF87ED6F1CD630
-:103AA000CDF315C19D89F2F56A7235CA854BBC7F8D
-:103AB000A13EF2C6E121080FF172E879A589AF9B1A
-:103AC000F235BDA5FAA6E9ECB2F302D36B442D475B
-:103AD000384B9C9F9BC6936EB05BD7E5CBCA0ADA86
-:103AE000452A93A3403AF0D74DBF0FB6190179ADDF
-:103AF0003475B2E73F32C8CDD5FDA7FAA37DC04DDE
-:103B00002A34E99B4BACBF0EE0A7EBFF31C0CF19C5
-:103B1000879F8D0453A3402FE149063F7655F9FD59
-:103B20004A94FE73D580470227880E8EDFA37CA8B7
-:103B3000E30F5B4E84E8BFAFC9C55BC44037C861C3
-:103B40008BEC4739450A64F447CCF32B1299BC89B6
-:103B5000C3D92E111D7F902911843BFD0BDAB33898
-:103B6000FCE85F8AEFF57F00FCA88E8E3A47E1F310
-:103B700046A984CE2793A8CE2BE9FB1291A03E48FC
-:103B8000CC47BEA5ED13E474E0DFEBFD20079BB846
-:103B9000DF47BCED3EBD5D3E4864788DB7477CB7DE
-:103BA00019DA99BDD3A4D9F5DEED06BAE8793F8DCF
-:103BB00024F43FFA89CCCE1E247A39FD6C47FF6D80
-:103BC00075E69418A02125FB7A7F25F0AB97201C81
-:103BD000343DA1E905AA2F0689FDE2E3C98541220A
-:103BE00060BB51FF2695D726BD9B52649403446F5A
-:103BF000CF14C07F73BC482FC4ACEF7919BCF1B2AD
-:103C0000F8AA97BE2489FDC5692293C344CDC4F5A3
-:103C10006B7C45B83D61D5E882307AF5F0EFCA306B
-:103C20009FC180E7080EEEA46E15D4DDA416EBE765
-:103C3000CB4AA200279BD4D54CB87E54F313F8513D
-:103C40003C0E936C1DEBC727D60FE5A207F16971F7
-:103C5000D59210D2F19D68070A6A885C447B30CC0B
-:103C6000F5AADF07785C555F473EA28B711C9C8CE0
-:103C7000FEB9941308807F6F0122C8A6FF7795B222
-:103C800052F22B7AFAECC123598EE3592958609DE0
-:103C900056977D16E801ABCB3B0DCBA211730528DF
-:103CA00053AFAF1391AD12D393361EA5AB79228CCF
-:103CB0009719427E96BC412C892B13ED57DA5F0988
-:103CC000269C07A703DE2F29DDF5D08D0607458644
-:103CD000F1CCF4E428A51E8988D54E986F7F8EED2F
-:103CE000FE739A960088DD24DC3C94E2AD7FD7AC6D
-:103CF00029A077DCA07FE83A5716971C01932FD5AF
-:103D0000EFDD70BD02710022001E56C360D7C0787F
-:103D10003F585E8EF10FFA37800A8B15C172E61F8D
-:103D2000044C76ABA8489A7D26F669EF08176DBD5E
-:103D3000DF4FB67E1BD1F115EAF17B2ECFBEBA93D1
-:103D40007D4FA5FF037E4C33E9D9D480511FB84D78
-:103D5000DF790E6089F05EF2BFF23D2FD96857C05F
-:103D60005E2914BD114ACBA9C49B067E946302F55B
-:103D7000EF68DD9BD3ADC2942E859795DC8F25949B
-:103D80009FF5F47F88CBD7ECAA4DB39AE8B8E74B00
-:103D90005D7EA0E7FE549C66A4F75E4F4B3D31F07C
-:103DA000734BF136A4EB06AAF00AC03F2816D15E89
-:103DB0005F5DF8BC57AFC73ED1E4502FFA208A347C
-:103DC00096FB93143E9642319032EA9FA70FB3FDC3
-:103DD00074B9F4E1BCD3888F6F8BAF2FBE257DFC07
-:103DE000B3DF5B992C3EC1E559765523F35794BE5A
-:103DF000FD83DE78DD88787550BF26917CBED08348
-:103E00004FB57769D02BC6B880F586EFCFD8D107EC
-:103E10003CAC33CCFE3F1B37A5CEA27C0CF6ADE408
-:103E200035F841AB958D2AD8F3E7C12E07FB305CFE
-:103E30008EF16152C8E2B5308048EB294A20C2FCBD
-:103E40009B08D1EB4139C71877B3643A8CFA7B866B
-:103E50002AE8E79F5227E33CECF0BD4C8CE746E0B4
-:103E6000BB162F89A6A0FDC9F0079F62F180072E1F
-:103E70008B0E347A053398D1ABF1BD553925241119
-:103E8000FE7A7DEF56E37C93CA25F37B2E4939A554
-:103E9000B35392BF2791533A7BA742DBF7E178A255
-:103EA00076DECB422A9507BEEF9310856F133465FB
-:103EB000433C94A03E6BF29578519FEF124C7EBB31
-:103EC000C2E84749C7FEA29DE94DAD9E7C3EECBBD2
-:103ED000F17D2405FDDA64FD1BEACB1E9628713ABC
-:103EE000EB0E6D92281E1B97076604D1BF3DB249A9
-:103EF0001A12EF5763D1FC76AA3EC7C6F7072442D1
-:103F0000FB21DC4472F12A78E825CA588026FBB3ED
-:103F1000934E6CA74F391E89D0E3CFD021DB609D33
-:103F2000189F3886FD60A08B186FEA6275FA22D45C
-:103F30005BAC8100CE4B0ADBEFA1F06A49E17585ED
-:103F4000D7D378DDCBEBF9BC4EF505D49D32ADD39C
-:103F500032C51AF662DDC1EBF9BC9ECEEB69BC5EE0
-:103F6000C0EBC246ACB7C86CBC3552848DEFE0756F
-:103F700085D7D379DDCBEB05BC4EB6B1EFDB58DD91
-:103F8000618DB0F19DBC9ECFEB19BC9EC6EB8379D1
-:103F90005DD886F564F8731452F81BE44367BC8E51
-:103FA0004A84C3B5A7DE656A67F49221106E87A9BB
-:103FB000D960B71D98757F36C4431F3D71B50FE8B2
-:103FC000A7E1668D9EFC283F49CE4D28C7FA737F36
-:103FD000AEE1CE1518876808C98C89787C26DE5E2C
-:103FE0007204F4F6F919A21F1ADB92F82FCF723B74
-:103FF000FE191E97799AEF57EEE4FB95DBF97E6583
-:104000003BDFAF7C92EF573EC1F72B1FE7FB959B41
-:10401000F97EE526D8AFA4FD36F0FDCAF57CBF7267
-:104020002DDFAF6C81FDCA6140EF7558AEE2FB95A4
-:104030002BF97E6503DFAF7CE4CE92DF16D2F59DCF
-:104040007789680F24C347F16EA3FC1CB1C3283FD6
-:104050008BB6A41BEA43370D30C8F7C256E3BE4502
-:1040600041E308435D595662A8E7DE778D61BC9C49
-:1040700085C67D8B01736E34D4FB05A71BFAA74F51
-:10408000B8C350F75E5B69A87B4AEF36D45DC5F7CD
-:1040900018C67314FEC450B7E7AC30F47FDC52800E
-:1040A000F42567AE31F4935C1B0DFD6A1C81CF2DA6
-:1040B00020EFA6645E967C237F57B3F4F2D2AC1F48
-:1040C0002CB92410403DC7F411C66821AE3688C50E
-:1040D000AFEC1FDE7004FC175B21D353E6789579B3
-:1040E0003CD9F5D431957EA7DC73C4D7A5A35BE298
-:1040F000D3BD47979A2A3139B9E64146DFAD0F263D
-:10410000A673D404741DADDF248E17BB258B418F9D
-:10411000687E4DEB8302F6FF67C7D7DACDE3C6BFF3
-:1041200047713D566FB744F87CA88ED0D90BD6AEF8
-:10413000B4D904F53CF3972D9CDFCB27F84F3452CC
-:1041400078AFF412BF8DD657BA2A02CC2E1115942F
-:104150000FCB6E46BF5EEBAFCDABD1359DC917A27D
-:104160008B5BA29C7218E20A2B33FBB6DFE4980546
-:10417000E37F969840A2542FC95270523EE55FF9F2
-:10418000A8C5BF9CA07E4A181F206423DB77F619C0
-:10419000E3A68D734CF28FE7655835F9965981CFB8
-:1041A0001BBD7DCFCB06F382F9F07959634E2C2DE0
-:1041B000B1149CEFB85806D6CB6269585E1D1B88B7
-:1041C000E5D8583696636283B12C8DE5637955EC5A
-:1041D0000A7CAF24361CCBD1B1ABF0B93F361ACB39
-:1041E0002B63DFC1E7A362E3B01C19BB0E9F17C7A7
-:1041F000CAB1BC2276133E1F119B8CE5F0D82DF876
-:10420000BC28360DCB61B11F6039343613CB21B1D8
-:10421000D95816C666613938B600DF2B88CDC7324B
-:104220003F762F3E57624BB0CC8B3D80656EECC71E
-:10423000580E8A356099135B8EE5C0580BBE372047
-:10424000B61ACBECD843F8DC17DB8065566C339696
-:1042500069B1EDD8EE8DB563991A7B169F7B62CF5D
-:1042600060E98EBD80CF5DB1BD583A63BFC4E78EB3
-:10427000D8CFB14C891DC2E7F6D8012C2F85A74BAA
-:10428000D9C1651F1BF79FC77E68DC7F2E3D6A94EE
-:10429000E3256F1AF79FFD878DFBCFA35E31EE3FBD
-:1042A00017EF33CAF111BB8DFBCF453B8C727CE815
-:1042B000963B8C7A6493518E17B4DE6DD4238D4671
-:1042C000399EBBEC27463D72DF0AA31E59B8C6D003
-:1042D000EE9B6394DF59E431A39F3E619B518F5C59
-:1042E000FB53C378AED2E74D7E4D04E58BA3F817A0
-:1042F00086F7EC85074D725965F2C9146F0790C0B7
-:10430000FEE652E2F0835F63C6673A970719C0770B
-:10431000B4CCE47CD70FF88E96E9372DF4013D64D8
-:104320004C2D9B0576CC85138202B132616ADD305B
-:10433000D8EF491F48583C818CB80EE2684DD95AD5
-:104340009DA8026D6F1A4430BE40D4E5150117C612
-:104350009BB1FE5BE9C10AC88B69B2F276B292B535
-:10436000A7B0FAB1C6392BA03D3DB5231B12991E4B
-:10437000B72696E75D12DBDF1B28057E27D1F5FF08
-:10438000B5BCEB7E88CBFDBB3DF4AE449F2FB4871C
-:10439000F2606BEDAC35F434A88E02217014FA8D06
-:1043A0001402EF4928B78D71D629A038E9F37C298A
-:1043B000F807E89731D527C0FA353834B9FB9ECFD6
-:1043C0005B5C3F35A511F437D5D57C3F18FE34BD75
-:1043D00041F5E1A34E0FCAFDC86A799B8DD9854688
-:1043E000FDA166CDC6786273D312D4C7805F4BA29D
-:1043F000386B17D653C1BA1C0C7181EE5C89968B51
-:104400006CD126D0275FA5751E172C088FF3B09EA0
-:10441000FB6F0C61FF15CEA965B01E0A8FAF383C4B
-:104420002EF4050FFA17F4D1F9F934AADA2D18E2AF
-:104430009AA9969060EDC7F653617C5FC88F7ED9CC
-:104440001F25166FD7E047FFEE4BD7E23804DF4B4E
-:10445000B18EE93D9E368E000003BAE67A51A3EB99
-:10446000BA247A4A8B7713F5E66FB5EF7444E67E8B
-:104470009CE93B16C98FFBB6E6F72497510E5A5DAF
-:1044800021CC8790A5C4FBBBB28DEF5B6D997A59A7
-:10449000FBDC3BB47534DE7C59FDDBB5FED43184E6
-:1044A000FE391C8E64CBCD4877055C1FE770FBEEB0
-:1044B000D09F6E58D14AF939429FD912C41122CDEA
-:1044C00022EE6BE6D45082CB8FC37BA0C2EC42EDD0
-:1044D000BB036B8D7198031A1C375D1EFCB5FCCEB7
-:1044E0001C4AF8BF28E93D0FB2632A5B8F9755A598
-:1044F0000D417B0A9D5701A3253290BA23FA38A0BB
-:10450000793E84EF5F0CE4C30D74B1FE649771DCF7
-:104510005EDFB5BC32BA2F3DD8EB3BDF723FB0CA8D
-:104520009A783F95E20BF13DD064FF69A5B61FA8CC
-:10453000D50FFDA9DA0E7677D3C24ADC6F6FF23160
-:10454000FD4DBEA6A38E8DAFDB3CCE4E0EF7EDDC4F
-:104550009FDCB9A902F31FC96E237D0E79F8564777
-:1045600088D96FE9503ED5C6FA0DDD3C873FAFC410
-:10457000E7DB5BD9F3C16B4BF9F3127CBE23CC9E16
-:10458000176E98E080784EA3B7221DE33A75F44F7A
-:1045900027EF86784322C4E386B491003C1BECF5F8
-:1045A0008B20FF0BBD012CB5790FDAB4AD7C38ED53
-:1045B0003F6861703AE4B952C2C4FC430221153A23
-:1045C000EFC7F87A73B5F690B1BD8D7F2FAFAD729E
-:1045D000F970FACFBC85A18D934BF1997F0889F7CB
-:1045E0007B848F63D7DA03C6F6306F575A4FA21811
-:1045F0005016FADF9904FD9A8DDF5BC7FBB928B32B
-:10460000C1BC0B16061CC3615E45ACDF131ADF9AF2
-:10461000E482146E249375DF6BE5F3B62C64715657
-:104620004D3E6CE37180AD10071816EFBF46EB6F7F
-:10463000DFFEC4C7548F4B0B593EA9D6DECCE7A58D
-:10464000E5E514DC678CDFFEC2CAF8B85B66F15B97
-:104650008DAE92D13799271AFC3D127218EB337444
-:104660007621D403038CED6505C676FF0863BDA8EB
-:10467000C45857AE31D42FF4C4613A53F471182D95
-:10468000A6F384B712FD9078FCAF3B459F479ECBC5
-:10469000F9EDC9BA12ECD7E0E27C64CAA769522AE4
-:1046A000ECFA7DF8BD9C8FF6413C84962F40FE3697
-:1046B0002DF78F0ED8F341BFBF67F16F23C9E1B665
-:1046C00095E3710BE7C3C7009FB46CE3F87C84C724
-:1046D00075D6F3B8CE5A1ED76981B80EC667585C36
-:1046E00067158FEBFC8CE7A1EFE1719D67795CE7C3
-:1046F000191ED7799AE7A1EFE479E8DB795CA79DE9
-:10470000C7752672F9BD7F624736C4D91E9F98D8F7
-:104710004F9E28337D168480262DAF224A8315E8CC
-:104720009AC206F6754AEA148B0DF262030CAE25A6
-:10473000F3148BCCF271F06F3AFF0EE815CC9F7931
-:1047400093E7F5E450AB4847EFA30F4709E47564DE
-:104750004DF08E8690682AA747DAE6837E5C0D903E
-:10476000ACC35E307388640978E57E303EC17EF963
-:10477000BBC307C19C1911ADAD70D2F78B5E0E564D
-:10478000504F9B0C2DF21F1414C8170A8880E7FDA8
-:10479000E5FE234A691C5F741606BAA073447D9631
-:1047A000A7E9876B8D7471556C2BDACB4D753C5F27
-:1047B0004A2109FD78ADF45E2B9AE249463FAA6989
-:1047C0009931DFC35C8ED861F4C38BB698DE57FA9B
-:1047D0007E7FE826D1145F33E61137B9A6F7191F9B
-:1047E000CF8F4DEDD35FBCC552799D3C265E77C619
-:1047F000BE8BFDCDF6A004761EB557A5A37200ECC6
-:104800005DE9A837007113E9A8C24B3F7F1EE0F5B0
-:1048100020D6A9DD1884F1295E0C76A3850A7CD800
-:104820001BD90FC21DFD908B2B02D418DA7F1B41C0
-:10483000BF224D765EA7827114988BF891397E3233
-:10484000E4DAA7210E12A911C9365A7F7C61DFF282
-:10485000AE575E852B80FB4939B5DE124B1FFCBE7F
-:10486000A9569C94689F6C31A7EB95B5D3BDA83F22
-:104870000E5F326F60B1ACCB1BE8772BCF1B38C318
-:10488000F2E20669EBBABF6F3A78D4B48EFE49EC17
-:10489000EAE735BE73B1BC138DEE330AFAA6935521
-:1048A0005C3EC62222E904792B05507EF6BB358496
-:1048B000F9F1A0A0F57CD2F4CD75C887EA83EC1C91
-:1048C0004FBF5B03449F77AFCD63504E17B875A4BD
-:1048D000E9C03896C741E10FFBD74D0708FF8E8A24
-:1048E000C2C17E1FA980EFD9492DB1437CB3CEAFA1
-:1048F000C2738B8BC10BFC55DE1FE7D5BC4CC49437
-:104900008A86092C3EAAC97F8D4E1A7C3C5E3F41A7
-:10491000C278B7E4AD8D02DE9B46133C6F43EDAE2B
-:104920008B1735FF06F2BC323BF1DFD6A26814E8E4
-:1049300092042621FCB4FCC026775639ECD3ABF3A5
-:1049400035FB82E7A14A7E3CB790D3368AC5C33295
-:10495000C3985771BF187A4EEEA7A7BB0E844F536A
-:1049600092F3056B6596F7E44B82D7F7B91CCE90AE
-:10497000A393993F4AE93F419CA093F7DBD23CFDCA
-:104980007743499C7FB5F63F4A0AB66BF59C988CF5
-:10499000F3266DDFCE0FB85EF3F74CFE9B550A1A77
-:1049A000FCB05CAB82FDB4BA9C699467973F4F89B9
-:1049B000E54316DF68C073C680BEF9A689F3CD85CE
-:1049C0004126BBA3B088ED1BF7D81D22F150B86E6D
-:1049D00035D193A647AC45DE0DC3F27BD3C5D66572
-:1049E00095AA00FB2A7E82FB426E7F4700F6055D9A
-:1049F000399172B08F291DFC15E840A38B9CB6B18C
-:104A000008EF1735BD57472A0209E6AFD975E06FA1
-:104A1000F9D2616493DF43825EF0AF7296331B720A
-:104A2000208F2B0C54FBF6FB2E77FF5ADB4FCEA5C5
-:104A30007FE0F7FC42C3F7A7A6B89597B2EC589D64
-:104A40007EFF3443B0E8E8B2C7CF37BD47FD0B6FF8
-:104A500022B92D594259361DBD98FD77B39F4D7A25
-:104A6000E5BD9512C89BB24C997404F21F7BFCED16
-:104A70002D5399FCE278B3727FB4B73F79A7BF2F6B
-:104A80007D627599F659BEA53FE9B719F34B2F3BE7
-:104A90003FF75BC6231A789E5E2FBFC3348E180E75
-:104AA0008889CE6D0C091BE12EB98C76C79556C648
-:104AB0009F839B8D71E4BCBA0189E39D3C5FADB2DD
-:104AC0004CC39372FB1F29BFCD3F62653E10F78335
-:104AD000B578D37C9E375D09796C144F7348D00349
-:104AE0008D678988F93167C93B9EAB747C536563D8
-:104AF000E7E848B3F5249CBFD0F2B3E686595D9B46
-:104B00004F759BB15E45A66741DCB56A9395403E03
-:104B1000D67C229DECD2E64FF9FDFB366607559315
-:104B2000DA26906B2B793CB1D24B24C8A7AA79E93D
-:104B300089B1709EA7C6C6E4F7E714FE8A2EEFE699
-:104B40006E574406FEFE68DF55DFFF0E81F7234DEA
-:104B500003406FA6253E0731BBD938BF4BCDDF3CA4
-:104B60005FED9C46B27948BB8484E7151FD0E25EB6
-:104B700097798E64BB8DE13FD939924BBDBF0BDE77
-:104B8000EFE31CCAA5DEDFF34FBEFFFC25E65F6343
-:104B9000EFBE1EE4C4AACCDA20C8552D9F651109CA
-:104BA0000520566379659A3A50D1F5F35D66BF1CCE
-:104BB000DACF7219FD0AFB1EEF1CD7C3BFD9BD5D4A
-:104BC00006FE3DFBD31353C12E58F04B0BB1533AA5
-:104BD00038B7DBCDCF8B4564D08F77EFB360DC8007
-:104BE00048D1B1B7E8F20531B3908EBFE0676EDC13
-:104BF0005FBEFB795B640A7DFFEE173F1A45281CF8
-:104C0000CEADE87E7D20D83D3F1558FE95DA35EAD9
-:104C100016FAFC6E89DC154CA0B73A391F9CF9B91D
-:104C20007306D099B0EBC00F71DC8EDBAD369D5EA4
-:104C3000F88DCD8AF0A7FDD879AC6784C81081CDF6
-:104C40004F9F2FAEE5BD9D794660F37BD91A498110
-:104C5000F9ED6A9743B4DFE25D7F43BABEEE677B4E
-:104C60003C0087C52F5B0CF267F12E4BD4360ACB84
-:104C7000133694F701973016E049500F2CDA57831A
-:104C800079B28B3A5AFE66F1C0FB46FEA270C17340
-:104C90001F0B3EB0F8A740FD85A73D60C77EDEB97B
-:104CA000D30370A5E3CE92295D7DF7EF3A3E246CE5
-:104CB000FC587AEFF1205203F4B5B86335FBDEBE41
-:104CC0009B4F837C5B6CE2E3CFE11FD9BDF547CC02
-:104CD000668C479E276F8E857D0AB22B23617E717D
-:104CE0008FFEE07CBD60CFF9AD709EF8CCF37FD92C
-:104CF0000A76FDC2FFFA72EB03100F7835C50BF28E
-:104D000068F14FDFF3101DFC33ECCC8E3FF7CCD3B2
-:104D10004F3D46F9E4DCEF6D68E79CFBD5E95C8527
-:104D2000AEFFDCDE7F64C1B9DBFB7E35B13FC0E3A3
-:104D3000BEFDD7F5EFCBCF00BA8DD8F4F88D207E2D
-:104D400095970596CCFC0A2F4D783AB4EF502ECCAF
-:104D5000F3EC311B9EBF594C9FD59500DE6A503F46
-:104D6000407D1985F7A2DDABFE66199508EEEA4095
-:104D7000113745A203C1C85EB4EF967F195F0AA53B
-:104D8000D5AFC078A41BE5BBF9BDC547297EAF4CA4
-:104D90008ECFF3E46B19E0BF78F76AF6DD0E8A4F29
-:104DA0004F6F7C9E857F8CEB8DCF12BB199F0B9F25
-:104DB000C4D8E8BE8C8479241A3E6BF6DFD6A7DD12
-:104DC000A0C9874BC1791ECF9BFA2F5BA0C20E7C76
-:104DD000F6BC53F5313C47A6D0B6737BCEE7124AFA
-:104DE000279F5ABB7F0872B2FB57362FF81D77FFFB
-:104DF000EA03E4BB73FBDF961576FEC42550BBE2E5
-:104E00001CE9F9EB043B6311DF335BBCC31DB579CF
-:104E1000E2F85A14993649F1E0F313F83CC2F8610C
-:104E200051E4C0AD4202FC2DB31730FD14E9877088
-:104E3000A9A19E0E9CCFD7E35528037C9EB81EE8FF
-:104E40002F193EB5F57B61FD57EBF0BA83F1B1B98F
-:104E5000FF22CAAF20877BE137227C00E5B9769B31
-:104E600004F991E7AC2CFE66C67B1CFEFCFCE4B7A3
-:104E7000B417EFB727D97FE070B814BF5F6A7DDF42
-:104E8000167E73EC0A8E6B86E399AF13EB838D5C11
-:104E90007E2C22B59306E8F499CD4AF5593ED87B8D
-:104EA0004175A0109F6F538705E5FC995D9608E852
-:104EB0000BB3BC584412EFDB45ECCC7E59F4F281C5
-:104EC0005120D7CE1CFC39A74B46F78B769F9055C7
-:104ED000AE1F227AFD90C4DFFE291F6FF12B89C718
-:104EE0005BBCFB6F09C7FB5C0ADC0EF3FFBCD34A5B
-:104EF000543AC4E71D964989ECAD4D76AB31CFD617
-:104F00003DF6582A7DCFE27128B0EE8615810F5408
-:104F1000B04BDEB1629C9648FE4F6D78DEDAA1ACF4
-:104F2000A1706BF054613C451BAFD10427C91744F5
-:104F3000BF54CA0C96329B3A62F0A7ADD4DFD5CFEE
-:104F40009BEADD1CD04BC7479FB6C23AFF6CB21F2D
-:104F5000FF2C91A6FE74BC3FAB827FB992C85F3430
-:104F60008E1F5A66218A5E1FDABA8FC37CC8AF5380
-:104F700008E4AF595E4D51419E2CDE9A12817DCDE1
-:104F800043FB2F3C05703BF7A48DEF73B23CDB6A0B
-:104F9000BEEF777AFF85ADFF49DB4FC3CBF4FBD57E
-:104FA0005B697FB0DB773B315FF3AFCFA78E2254D5
-:104FB0004E57FFFA81A9205FAAC1C7A2FDAB7FD6D9
-:104FC0003FD240C73BD58FD54FED191401BC2C7C87
-:104FD000E1578B409F2C78CE4980240FEDFFE0876E
-:104FE000503FF76B37E67B9DFBF5E9EF021F507BE7
-:104FF0005BD1EBF5F9FAF3DE74DC055067EDC245E1
-:105000002EEBC08F590025A5F7052FA7E2F9075D04
-:105010003F7C6FB1ADFB7E1688520788E8134507C9
-:10502000001F2ED865FCDE5FEDCC9E5A2C7757B161
-:10503000FEE1018C5F3BF1BDAF353AE5EDE6F7B53A
-:10504000FEFF612F308DC3DE5F6423B589E8DF96F4
-:10505000C2C65DB0EB9B61C6F118BDF6FE0E7BFECD
-:105060002381E5E793BD29B84FB0508E0E4D2FC672
-:1050700078C73CE0DB859EE8D034FABD5F7279B931
-:10508000D041EBF4F9003E0FE80F7562EF7A0EF0B5
-:105090005BF3520A017AAFF9B51BE3C9352F5E38CD
-:1050A000F5387D7E66BF13E37A35BF5E8AF8AEB110
-:1050B000457F08F1BDEEBD36B28DF63FB3F7B7B907
-:1050C000608F9CB14673D3FB880FD574D87832B803
-:1050D000711DD42F28AAA5F35137B0BC9C3AC2EE5B
-:1050E0001DA883A00ED0F18729EC1C31DF97BA8769
-:1050F000C7A3BE98A3A4E2FCAFBD893DE7F1867BC0
-:105100006E56FAA7E9E6017973E42AEA97C8B5C3AF
-:1051100040CE5A62371105F6FF6283B1D4FA59E0E6
-:10512000FE8662C8DF62FB7ED64C3FA9A6E5D2743C
-:1051300012C2F397AE1B7BF8EC7714C5F76C56FAE6
-:10514000C378FE14265F6A1C81F129980F69BC7729
-:1051500041DDCFD67581DFA7609EEF05AB6A03798D
-:105160001EDFAF6379837592F201C47DC9112E975A
-:105170007AAD9FF1D917DE74E4336D1D2DF55E9481
-:1051800027ABEB7D58AEAA2F220AE629FBB16EE1D0
-:10519000F0B015AB04EE99001E843F9B2B1880FBEA
-:1051A0002C604C88B75B5C21A42F9BAF16630576FF
-:1051B0007EFF8EC5A5926A17C467189C206E0C707E
-:1051C00092795D6A9B8270A5EFE3F3898ED09C94FF
-:1051D0003190EF3BC220A7E4CC1243BD17DC34BAB8
-:1051E000D8F3BF0D3F82F05A5D6FC772557D19C26B
-:1051F0006D657D00EBFF1FE0D7CAE0770D5174FCB1
-:1052000023675618EA49E1B799C22F33CE5766385B
-:10521000D4F1FC1C8D9F92F1EF23F504375F36D655
-:10522000B761A93D4F4FA2D7CFA6307BA48E8496FD
-:10523000E33EA897C56148A64A7274F127E253F18C
-:105240001C089E3785F69C9B307EA9E1D7E2954EDF
-:1052500019E59FF201AC67E91B5611E495A56E3B79
-:10526000F92843C7C75382290AC2D98F71E006AE15
-:105270005F57F6E0D3C81F2DF50A966B399FACE750
-:105280007CB201F00EF13DBF88386D9D44507F3EE9
-:105290004CEBCCDF8F127D3C3CCDDF11B552FCA333
-:1052A0004C52B064F7701CB34586D0F79CC52400FF
-:1052B000F49276ECC7115C2BE9C0F3D669DA3D3085
-:1052C000AF14A4CDC4FD1F62657A8A585819B682FE
-:1052D0001F65866F83FF20DE2F916C3EE5C7E70BCD
-:1052E000F0BD0B33D99E59E69D1DC7E03E0857AB74
-:1052F00013FDCA2C7F6D5E2ECA571BD2ABCB1F127B
-:10530000AA7578CC4A62FF2D734CFE23D0E38790B8
-:105310009748F1BBB16D700AC0B9C5DAE10379D81D
-:1053200092C6F48D3283424177BFD86B5C4E7A4A85
-:105330008D724093CBDE6B4B0CF4ACC9DDF40946A7
-:10534000BAD7E4EECF7AE46EF02CC8DD8CD816E440
-:105350004B331F34586555B812EFA361F1A7130200
-:10536000DB57EF2D0F70DFFD8BAEFC6D701E5BE326
-:105370001FF3FAA5E6C9F89D1E7BD09A381F60205E
-:10538000BF97A199D21BA174D44AE90C10B18ED257
-:105390001994614A678C9FCAB0D4E8780561324499
-:1053A000DD27B279F278ADB67FB2C25E12003CAEB4
-:1053B000EC603C34C8C1F7493345CC0B90A83FE9B9
-:1053C000A28FA403E3EC605F4A56B68FDFED163B75
-:1053D000601F7FA56BBA1DF24A85B452A49FAFDC53
-:1053E00095797DEDEBC0FD6B407F5E979F9C2C8E89
-:1053F0009F9BB4784B08F8A57B5C9D98DFE472888E
-:1054000086FDA71A47A8C0A1AB8F84AF73BCC3B0F9
-:105410007B929CBF1CC5D743725452A893133DF78F
-:1054200025292A29D2C98B1543AEC7FB987ACB8987
-:1054300024F270E7FF8C3C6CC88B205EAD66F9935C
-:1054400019C03BA068A9C2D50AD43A5FF983D148F4
-:10545000A7D739C00F716DEBB183BE57D07B9E6665
-:10546000F917D76B0AC6C1A85E7BB40CE46952BDBC
-:10547000567B17D271EB4005E8F8C0BA079E84FA54
-:1054800047EB6C78EF4B556C3551E87CAB63E3B080
-:105490009CD7F61096956DED94890859BEB67ADDC5
-:1054A0004CE8BFD982F19F5391ABCED5D1FAA95622
-:1054B0001BDAEFA7B6DC9B07F6DFA956A762017BD4
-:1054C0007FCB18637B33BBFFE5549B356261F47B74
-:1054D000D102FB1184CB778802E9E64B4A15B4E38D
-:1054E000BF30EDB754AEB705044F72F857B625B6C6
-:1054F00027F1FC36E45C93DA61205FCB8FFF380F35
-:10550000E84393334BD3A9DC03F81DB79144FB0266
-:10551000131D1317039E263A024B19BE2EEFDEAC65
-:105520008F446A77239E429E6986B82F8BAB7EC4D8
-:10553000ED72624FD2EEE1EF7B13B7D7B4FEE5F523
-:1055400007696D55B131AE6D8178B500FEF83496BE
-:10555000EFA0ED03F5A66B664FB7DA50AECCE1F1E4
-:10556000288DCEE37416F2F07C31031DCE8F6D4092
-:10557000B927B48C7C741C85DF9794FE803E84969A
-:10558000F1FD01BECBD77C67FD9D74FCBFBF69C137
-:10559000E7F36229D8FFB307FD8FDE09FEC2BF5BC8
-:1055A00009C89FBF1F9988FBC89F598D718C7227AE
-:1055B0009397AF72FEAF8AB518ECF3AAE6D932C45E
-:1055C00041AB62EBF079156C22611EFD1DAFC10687
-:1055D00070152CFD1A78FFF6892B509F96601CAD34
-:1055E0007AAD2D619EFFAB0EC520AFAABB5A715C90
-:1055F00042EDB3CC2C3E9E4EEE54C732903F8857BE
-:105600002590F75DC5E54FCFFCB6580DF2E7B39492
-:10561000C4719AB71C6C9D55B1EF20DFF55EDF7742
-:10562000F17995F6DD2EC6A7F1F53C3A2ED17AE256
-:10563000EBB816FB7F9696F8FBE7397C4FD5CF2366
-:10564000012ABF2A6DB49F0BBE7F6F5319F8F95B17
-:10565000D2D205DDBAAADB1690806E5DD55B66C935
-:10566000FAFB29E378B8CF8087F36B16231E9639AF
-:105670008227400F54B68C1F15423F7F35C2F92355
-:10568000AB3F17E4F1E9B67B3D89EE913C6FC64F25
-:105690001BC70FB5BB4B75F8D1F0627EFFD49FAA34
-:1056A000BF7A10E4D466B741AE98CB5E78CB4F0C8E
-:1056B000B7544E9FA7A8FE0E21DC94178F015DAF53
-:1056C00075627E5C72F85D41427DC12F89FD4CEDB3
-:1056D0002CBB730C7C97201CAADB181D5C0A6EF196
-:1056E000EF723A284FBC9EF14E8D0EEA884A19F6A9
-:1056F000A47C293A7880A8F63ED6D143076DAF95B1
-:1057000017C6E960BC333C7105EDF729D83FC37A71
-:10571000E3FFA4AC7AAE017B678D05F7BD4E3AD4AA
-:10572000AC3B587D34C8E7939EF0D46B4AE3F5F95F
-:105730003B8778F4F73A9E6EA6704800BFF1CE24FE
-:10574000F453A892E2B1FFEFE8E7A324E760263A1A
-:10575000CACB019F249C389EAC959AFCB6A4BA7A19
-:10576000FC5ED0A3275D055F4568EB3A47E86627F6
-:105770006D6F4CBB1FF5FCC99302EAE1E57F5A3A15
-:105780000CE4702FFBB73EF6D8C743306EF9F8C76C
-:1057900056B4A7705C42ED1FD003986F8E7EC04058
-:1057A0008CB324DBCFBD172EFF1D13DFD7D5F66FCB
-:1057B00057D6773E04E313BB4ABCDA797D054A66C7
-:1057C0008FFD07CC43179F97AD21AF1FFC5D810470
-:1057D00081EEAD52A819F20CADBECCD1AA0ECE4BC3
-:1057E0009C2C2F27E5F0E1E67CFA7ECADCDF7921EC
-:1057F000CE67A3DF81D29E237DA18F975B3359DED5
-:105800001729D43D2F8073C8B46E883BD0F9F6E1D8
-:1058100037FF52E8B9670DEF379EA95DF405A0A3E5
-:1058200074F37B2D7F456A64ED695A73236BE771CE
-:10583000D4C5952C4E7A68562AC24F5BD7CC5756A2
-:10584000E17D6B335FC9C6F34C335DC33E0178FE27
-:1058500012126B80EED3987E36D3C5435CFEFCA05B
-:105860005D54AD74BCC3D6EE834EE08B1F09E85780
-:10587000DFF1DE612B90FC1F8E9EB4425ED45D9002
-:105880005844D7338B283233A223F8FE6CD2E1661A
-:10589000F58E7E70FF697C3CEA32C3784BD8FEF30C
-:1058A0001DEF1D9D086A948EB712CABBDE24328C90
-:1058B0003F6B9FD2C48E43F1F15EA1E389F1F17A8F
-:1058C000E027D9111E71F8D8115EBFEF395FA2A28F
-:1058D0007DA1832FDA2B1A7C1B006E147E33536755
-:1058E000DC484625E79799AEA19F9051F1F998E1E0
-:1058F000FB7768A2FCF68433B017F8AFD119781E95
-:10590000F867A1BD3B572AC073602FC2F34596507C
-:105910005E16A5ABB38342C3FAC1BD1E9D89F7795C
-:10592000CD7C7A1CF8E54A28295FC03CF879951FA0
-:10593000F2751EFAF169379E47D9FF412E943596CC
-:10594000AEB5B703BFFD9B05EDCF2FF60DEB33AF23
-:10595000EE388FBBBCE514F9796BB6CEBBB83D779A
-:10596000D73E6704EE41BCABCED2E35F015DDF55AD
-:10597000C7F24F88D439EA56833DD9C8F7437A8FA6
-:1059800003FE82791C6D9D0773075C01FEE593633E
-:1059900064F4230EBCF9C5EFAB69DD31C88E7EC25D
-:1059A000DA344EBFE5CC6F7D322DE01C09F1AF3506
-:1059B000E97E95AE73CD6BA443A4703A38FCFE48E3
-:1059C0004529DC0B2D62EC6C7D6C7BB802DE2B660E
-:1059D000F7CE78B95DBABEF3641BD0E3E96336DC79
-:1059E00077F8CCCDCE11AEB10673C18EFFA45D4E5B
-:1059F00078FFD99FDD12CEB75DE81280CE6793B0F5
-:105A00001DE4C5BECEE9FD613E1E3FF102F99FDEF9
-:105A10006211D9FD685ABC252AB178BF2AB17A80B3
-:105A200097DE14FD7D63AB274DC03C8F39AD6F63AE
-:105A3000329EA734F13D3FA92E365F7767FA64BCEA
-:105A40007773828879D86E7FB700EFE57556C8F80E
-:105A50007E58E8F3FDBC655ECC4385F741CEE75D3B
-:105A6000E6FB3617CBD3DAC0FDEC76ABBF69021D7F
-:105A7000A77D6D9A00F8D0FA292E26574E4FD0E216
-:105A800048618C23E5167A53E01E8BDC00323771B7
-:105A90009786F1BEEF6DD08FC559110EEDC35F8CA7
-:105AA000C23EF61A88AF009EAD8C9ED6AC1530AEC5
-:105AB0004AE13700F4C4270FDB6E8275E4350B5ED4
-:105AC000F0DD699970DE33DC7646E7AD8FA25F08C2
-:105AD000615A183777CBBB382F7792F5AE70B37B0E
-:105AE000F23FB9047D7CE964F726E6D675F2FBF156
-:105AF000A2780F5E18E004F54029BBDF440A28FABB
-:105B0000FC9838FF2CE7744802B0CF56592647203E
-:105B10008E2036B7CF8075CF0EDBC80D747DAD42B9
-:105B20006700F8451D23F2FB9402C7014EEB36F4E3
-:105B3000C73CBC55622017F4B0FA7F64DCA73B1861
-:105B4000F86233DC1FBFB54C46BE381860E70D9FC6
-:105B50005C56D00EFB94EEBA8AB6D974BC88574610
-:105B6000C9D2504ADE1806FB94CB44AF40FB878372
-:105B70005ADEB6D7017431DAF2E5E422D8C7CB1683
-:105B800031A6745A60F736AC5C56E105BCAEF466DB
-:105B90000A7AFFE5764E07C7D383B7BB287C7C0F14
-:105BA0006EF452338EF267C6151047549B65453B21
-:105BB000B70BF73D6470BC64748AD12A0FD65DF3CD
-:105BC000D2E13E5D162F7DE8C6108B73C2DEE85829
-:105BD0008C73F23F1FE23593D7D68C706065D38A01
-:105BE0002AEC0FE364D171324AC5E8583AEEB6B4F4
-:105BF000C0568CDB4DB4239C88D4D506708A4C1CCF
-:105C0000E0877B6D378E1BFA369C5FC938D23D1D0D
-:105C1000F4686490E30FED20A756CA0AF079C6B283
-:105C20005377C2F334FF23F74299D1F8FE0320A73C
-:105C3000D3BAFE568FCF27C986F862C6879F7D03E9
-:105C4000ED1941D910A7FC3A3DF81380CBD6E2708C
-:105C500018EFC5048C66C5D7B16779E724B8EFF8AB
-:105C6000F434D1BF8DB7E3BA3679236B18DC4A41DF
-:105C70002F68705B252A1D5158D7543BD24721E924
-:105C80004479950DBBD983E378C9F870F512C8D76C
-:105C900030CF679D4BE8B97F03EE09045C417E8CF1
-:105CA0009CCDCE15EE2DE9F4813DBF362D717CF2F1
-:105CB0002D377BDF26B238ABB9FD0D37A30710892E
-:105CC0006D252C5F7E24942EA2A64299630F40FE80
-:105CD000F35E51F923D2F9468B02F881FE568ABF52
-:105CE000036F7C8EF1C503E177B17CC65DA4E5DD71
-:105CF00047B3E8FBEB4AD97DC7EBBC8C46AA9B991E
-:105D0000BCA8F675D961DFA4BA9878B7717A533513
-:105D10003843BC8CEBABCA5B195C338B09EEFB429E
-:105D20002C08EE9BCA827E147E99CDCB97201E490B
-:105D3000A73A98F65B07E3027E1A45C2C6EDB22386
-:105D4000FF862DB8EF49F9FD2D886B55B6F6C77D56
-:105D50007F38360CE3A5F3EFA6F3F1DAE938103F0C
-:105D60003CDD6CC17301907E03756519A565A4CFF8
-:105D7000EEF2223AAE52EAF5AED1E84093639435A2
-:105D8000E6507D01709BA3AA4B80FE4EDABD6FC02A
-:105D90003C9C9B6C0AAC7FCEA6979682FDE2F47584
-:105DA00035837CA82E63F34D6FA5CFD1CE51DE8213
-:105DB000FED5AD36857D8FC3AF94D31987C35C3EC6
-:105DC000EFB95BD8BC1D832261A0CFEA6514AED0C9
-:105DD0001662740F21D18B22F2D51158BF5BCDC250
-:105DE00071FBCD30F18589FEB47555F275552E6382
-:105DF000EB229C9FE8B4A2306E65295BE71CC2DEF3
-:105E000017E1391D7F2E5F4FA5FA2296739B6D8691
-:105E1000F1B716EDE884F9E417CB0A9E1321ECBE26
-:105E2000C35CBEAEDC46F6BDDCE217115EA44E37A5
-:105E30005F8CABEAEA94AF4EFF9632165C0A00071D
-:105E4000D8E8B8277F2CE37E4EE126E3BA4EAF1E9A
-:105E5000B6BD95B67FF4B08CFBDE7B45FFF13CF41C
-:105E6000476585C91FFFBB53404ECF6DF4831CDFD0
-:105E700053CEE07FFA6612017A187224980EF01E53
-:105E80007224C4CB5ADC4FA700117AE41E9D1F7503
-:105E9000999A059097B1C1CFCE033950C6EE231F12
-:105EA000A49F379D5F46735605E4436596A557C882
-:105EB00078B5ABA9FDC863D345683FFCD8BDF09D5C
-:105EC0006CA25B0F6D973D83D97996C3B415FAD553
-:105ED0009D7A10F0D1CACFB90E8199A5637918CAFD
-:105EE0000CCADF2DE9304F894C2889CB839D0F8F59
-:105EF0001D0D7205539E4AB08C9292DE7243D77F7D
-:105F000038EFAF0A09FAB93D8AC13FDFF9F0F5C3AE
-:105F1000C18F5F0776622ADCC7E6FD12F27454BFB8
-:105F200088705F678DDA8B697D15B51BC17E595FFF
-:105F3000F4BE087CB76E1FF1037D6404FFCBA6C7D7
-:105F4000E30D6EF6FB3C924C5A80FF0F0E3F350975
-:105F5000F0143940ED4EDABFE237AEC79C600FFD5A
-:105F60009EE5C1B4FFB616F5F7FDB972C2FB78C95C
-:105F700025EC4473FFF421D3319E97B76903DEEF1C
-:105F8000593D49F2DF407B676E2A2F073B46095295
-:105F9000EAEA4FE7BD65F4726042650ADB2F5326DB
-:105FA000B1E7CA0456B6D41F7908FCF6F02E29A52D
-:105FB00090CE77C46A76AF584BF117F610B54B4BBD
-:105FC000CB9FB7DF4C9F7F5C4AB5207DFEF1B55F6C
-:105FD000A4C0FECE93A5151900CF7DCD46BB8EC0C3
-:105FE0006557D41F1A690B07DC745EADEF1184A7E7
-:105FF000C5166DABA475CB4B2EB0707AF939AB5B7F
-:10600000DB67009DCE2992316C6F5EEFFB5C9FCC0D
-:10601000AEEB9E04F7EBE7AB84C5F7C38FA2509EAF
-:10602000CB4546BEDA8942C7BD89F9276129F03AD6
-:10603000C8E570714886573479D63AA4F22990673A
-:106040007FE2761DA99D87E7C890FF2D600F7597A9
-:1060500027F29B4A5D0EEC7F7ACB2D1F409C7A4E37
-:106060001DB3F7F3B67C29203EA8DD974DC7CF2B93
-:10607000C5AB06C99C6561FB48C04FA1481405E645
-:10608000D341C04F0853FDA3878336EE7FF7FD252C
-:106090006E1BF26129D8CEBAF5B8F87A72FD743D5C
-:1060A00009F47409FFEE8F9EF8F2C03880FF32E6E3
-:1060B00022E5854F0876DD3CF2D4CB9BC755301ED8
-:1060C000D8AF6E2F8EEB2EEDC2FB5CCCF21DCC79DF
-:1060D000E0DBADCE73A3997F6F94A7BDEA9CAECCF5
-:1060E000CF734DF26AA4ADE346C4EF1E76EF35647C
-:1060F000C442BB404485DDFB19D1EEA7AE857E23AB
-:10610000DC2E2FD041EBF0F74B003E6BB9BD30B722
-:1061100098A0BF3A37A713ED85D98DDC5E90FC4D72
-:1061200020649D5BD2C81A9DFD80A612B8D08DDC7C
-:106130005ED0F43FD7DBD5BECE66D4AB8DECBC5F72
-:106140008F9DA132BD9AE7637ABDBA997E47E1C4BB
-:106150003C566F97303DAE6CE2F603D7C319FCBBDB
-:1061600099CD4C5F65801DE181340815F532EE61F3
-:1061700065C5ED967EC54C5F66B4EE45BDD6013F64
-:106180002E3306E406D39783DE3EAA02987CF47190
-:106190001B95D38FF3769F97DA67E971FB6C95C8EF
-:1061A000F79B08B30F31E79FCEF321E8AFB31B771E
-:1061B000F0F9ED3D9C7E13C8D79DE1023C57AEF14E
-:1061C0002D463F693DB794E5AFE4D6B17D72B7BFC8
-:1061D000EA29FDF9B3796E76EFD03C8DAEEAA23EA6
-:1061E0001817EF8540392E637C7135B59730FEC4A2
-:1061F000FDAB6B5C3CAEC1E927993ED1E4909B04BA
-:106200003CC514BE1F479E4279AD527F09D6F67138
-:10621000B861C0DDC0EFE169A530FF75E3BEC2FC27
-:106220008FBC24FEE29F353FF35BCA75F7A4A3CC75
-:106230000FED14139EEFC9F1B0F84387449C00CFD3
-:106240009430BB472EA54C4ED83FD5C3ECECCF398C
-:10625000DCD68D7B0ACF6726D5CF12512D09F4A944
-:10626000A66F5B01CFD7D0FEEE379A54F4D323410B
-:106270000BCA57767E314CBAD08F548B648C1BB6C8
-:106280005AC376C0C7FA528E57AFBD1DEEB7F9D6C6
-:1062900078A1F0003CAF0E8811211FF01CF18E6434
-:1062A000711D3CB77C9AFAEFFAFD8AE11E91C34951
-:1062B000C11FE6CB6B66F4B56E9C8CF358333AABDA
-:1062C000DD92AF97BF02979FEC9CD89A71AF237D68
-:1062D0005DEEFCAAEA9EC57B3FB4E7A7363F5D00B2
-:1062E000708EDF7F11E8F33C4555DDDF36ED48B0B9
-:1062F0004FD0D30E7E940BFCC0C81D867D4D8EDF23
-:10630000091ED1107703F96A45E7223200E24B7B80
-:10631000C6473CF01E59C6F66DE7F37DDBCF77DC50
-:1063200082E7C94752B2B226C0FB67F5C6F3EA9FBF
-:10633000ED7C7A008B6B440C79C2F39FFAF908C3A9
-:10634000FE7080289963F915ACC0EFAFFB559B2513
-:106350007EFF800CBF57007176E0E0C170AB620732
-:10636000962EE05F5A7A4837965E504783C14FF2C7
-:10637000639949825866915A2C7D248CE500D2811C
-:10638000650EF8B983412F7463A910AF487472BFCA
-:1063900080F8B15E4882584A80B78CF8BE84B4CB8E
-:1063A0008EF91BB07F017C9FECDC99DF53B9C4836D
-:1063B000FC5D7B25FB1D23B65F31DD13B8C78378F9
-:1063C00088A2FC9ECD45F991E74674C0F9A37BD61F
-:1063D000B2732F9A7C47FF867EE7D974A60FD48DBF
-:1063E00002CAB115CEA9DF4578B65ACFE8F71B88A7
-:1063F000DD5E08BF0FA28D3B9BC71966733D08E1A8
-:106400006E767ED08FE7936643BC41D74E7ADAD959
-:10641000BD34DA38A2F3DAA17DEDF7E9DEC7FCE896
-:106420004A931F7049FD6DAACF31BFFF359D50566D
-:106430003C1EF7EC77955CA457AEBF294129F85E66
-:10644000B3ED04FA63E189013D5C9EE17CA0E9952E
-:1064500039A67C0F733947E2FC611A876AC0343869
-:10646000D78B774AE8F85BBB9F54BBBF677E20247D
-:1064700067B3D77C80472F9F77986CA9C8A6E5A7FC
-:1064800050D7C5F78FA6865EF2E8FC116FA056D4F0
-:10649000DF77B390F3E3444B6B39C8B9D321E207FC
-:1064A0003F623EA9F57C07E2F9472D28E706D2793D
-:1064B000CBF07B2FB0C1918E75157EEFE56C3D3B27
-:1064C00027748ADF33FC14DC4743CBBFF07B85475E
-:1064D000B62D9D0A74F039BF5FB868DFEA20C47D2D
-:1064E0004676386781DE1FD931BE1ADA47EEB2B17F
-:1064F000DFF1E172429B171C7377A4E33976D59ED6
-:106500000EF284A0DE3DDBEA88C0EFFF9CEDB0B068
-:106510007B558B45BCBF0CAE21B4F0F9A5A6C3F7E3
-:10652000FEF387608F7CCEE5C9194F1AC397A40A82
-:106530006A26A4A5103FD8351B9C8BF01C64952BB4
-:10654000F2D46399901F6EF7AFA0DF3FB0F7A55C60
-:1065500078FEA87311967FD9FC412EC8ADB3FB3FDE
-:106560009013D16D8D1495213EB5609F20C2FE49D8
-:1065700079C72C19F647AA761FC0B8728D3784EDFB
-:106580000BDBF6627DC2EEB771FF6470AA82F33A4C
-:106590009B1DC2386F619B2D0ABFC7B1A7207C77B6
-:1065A000C27DFB54A66736385FC5F11F75BEFA3A47
-:1065B000C265B30DCF7F1CD8FC1B1CF7CCFE97F82F
-:1065C0007C09E60B9E4DE938FE13D05F7BF9794CD0
-:1065D0007BA7471F0F965205837C3DEBE6FB5E3998
-:1065E00097E8C7F30589ABD3C3E452A707F6CDAA52
-:1065F0003A181CFE628DCA60472EE81014F83DBDA3
-:10660000F2DDED781E70C13E3B9E975800F000B859
-:106610005178215CDA0EE0FC0B002EFD601DEF626C
-:106620003E7EE13E0A9751F1752F7085905FB5F57A
-:106630005238B075EFB9149E42463CB5BD2D435C4F
-:1066400066E13E01E1B770379B47D53E36AF09BBE7
-:106650006721FECFEC270AC45B4EEDFDE07358CFF7
-:10666000D9FD76BCCF579B17DCB7E02901FE6174DA
-:106670004AF631B9AAD9DD35912CFCDD819EF6DDD3
-:10668000EC7749016429945E47EE9B86FB82A54026
-:10669000BCC0FFDE8E11ECF705C3B900D73DE3A304
-:1066A000B930EF33DAEF2349E15CC08BDF132A4DB9
-:1066B000D5E1E3B3132FA15E2C126BFFFC20F0F1A8
-:1066C000F3EC7738967EB841D4C3E33AF841AA3167
-:1066D00000B7B73C08B79EFB5BC22C5F8A84901F53
-:1066E000AB383F9E6DA77E275DFF676D2F60FBD99E
-:1066F0006C637ED55FDA0EA503DC2AF9790C12B93A
-:1067000005E511854BB33D819EEF39D71661E7153D
-:10671000CF09FC3ECD2734B8D5CAD30DFB7C4C1E27
-:10672000E66CC93F8C7E4624F13947B39D64BE2F89
-:1067300035593EC0492ECF3EE6F774697A77BA27BD
-:10674000342BB55FF2F3DE952D35B900EF4A381BD7
-:1067500089F79C1EB801E215786E88DD931A05F85A
-:106760009CEAB907F5A51B20CFF4541AABD7A57640
-:10677000AE02BBF69476AFAAFA1A7B3F9FB56F8242
-:1067800076DAFF394FB03695D9F702FB7D1F6B1AC9
-:10679000FC4E83A63792C3C1F83B0D4FD3B5025CC4
-:1067A000E8783FC1F1243ADEC87F7E3C4D4EFFD3EE
-:1067B000E3D8FF67C7D1F417F027A43E12BF7FC408
-:1067C000FF04FCFEBBEF93F05C035F5DD83CB809AF
-:1067D000F6D1CEFBD83D30B6D6E504F4F9DC4D1B3E
-:1067E00012FEFE5B4F9DE7E5C88329BFE9F8FA4832
-:1067F0002AB3CB8F70390D7FB0BF0577E5A05D4C14
-:10680000FF5AB3307509FDE761FC1EF3221246FB07
-:106810007404E9C0B2987462398A746389DBCC83EA
-:106820002154EAC7F2AFE55D6361F10BEDA1275397
-:1068300044CC3B780DE4D0D941A1A7E1A2B615CE56
-:1068400045D7C0FCDF48F57278450DBFB742F4BFAD
-:1068500087A1803D38C5D7973D48BCD2999EBC974B
-:1068600002BCCFF6ED545C5FB2DF515B62BAF786D3
-:106870009D0BD7E050433A308FE4B52DF7BC319CE7
-:10688000C2FFEEDD6EB493876E695C02F2FC6ED2DD
-:106890009905E78487F27B44481BBB0F47BB1F6405
-:1068A000789BCDF83BC2A6DFE359C07F3F6B81F9EF
-:1068B000F7A9F839DC167890201FC37C8EF7AFA9B2
-:1068C00089EF7D21C5897F0FC57C8E77778788F911
-:1068D00051F740DE95CEBF18BEA3D666A42FE5DFE4
-:1068E0000AADBABAE067F108B723B053E8FD9DFFDF
-:1068F0000B82D8B2B4008000000000001F8B08009B
-:1069000000000000000BDD7D0B7854D5B5F03E3360
-:10691000679E99849964924CDE131E21C86B0221F4
-:1069200045A47A122246A43A3C6AC15A9C8040800F
-:10693000BCA068B1C59F8144081425D488400107D4
-:1069400044C5FAE8A417E561B00344448BBDA15ADD
-:106950002F522F1D901F1111466DD1F66AFDD75A87
-:106960007BEF6466480AF4FADDFFFFFEF4B3877D2F
-:10697000F63EFBB1F67AAFB5F70C77288CA532F668
-:1069800082A2DCE31DC4D837F87753D773AA5DC75A
-:10699000D808067F8D6C5C31630DD5AA7D15941ADD
-:1069A00002564DEF84A75D1750F219CB4A2C33CF16
-:1069B000853273E8ECFDDC8C8DD58F3EEC86F6C617
-:1069C0001A75B809CAEDDBE67618F07B97CA4C3029
-:1069D000649603FA8532CBD005FA41B9D1FE1BC7C4
-:1069E0000C18BFC006EFA19F1C3B0BB8A1DFFD5BDD
-:1069F000EFD761B9A19EB1741C47F175B8E93B9519
-:106A00003D85D362DAF8A234C6F2F09F308ECA56C2
-:106A10007FAA4F62ACBCE6B4256C83F7E1CAF16C87
-:106A20000863A5F67C5AA7FAFEAD1F6179CBA25385
-:106A30000E1F8CF7C6D6E57F180BFD1902302FE824
-:106A4000A2F0EB86E36361BCC85623DBC6BAE090D4
-:106A5000BB583D1536D380EC1BF82F7B616CD9C831
-:106A6000A05C28CAF9388FA87A280F17E333368537
-:106A700085D2B05ECCD7A93106F364769BF3CC40C7
-:106A8000C66EB22BEC9BDE5DE511A2BCC3D05C668A
-:106A90008579EEF84FC5B314AA0F6C9D9587EBBBB3
-:106AA000B4C7976787752C32270D61BD2EDF3F83F2
-:106AB000DD2DF6CF6FD1B9F019B2305757FB01DB9E
-:106AC000EB4D3EE8A77109F39CEEC79839D06E1DD7
-:106AD00088FB78D8E081227B4861538250AFDA98F6
-:106AE000168471860B7C897F3EB4C4FDBBBE86AE26
-:106AF000711FFA7AD214DCDF48A255DBA65C3E2F68
-:106B0000F99D6A77FB717F0DD9CC9300E3199C1D29
-:106B10009976F86EE02EA3C706201BFBEB41BDC2A1
-:106B200030EEC08353993B91C30BE7AB2E327A4EC4
-:106B3000A730665AE4F4A8C3B19D8DF0F1339B31C0
-:106B40006042F82FFA7933D6376C2D71B9A3F07AF9
-:106B5000F912BB4785796E5A62F6A8B0C0E5627D2E
-:106B6000F1F3CB71E8BC01F8CEA8633EAC5F00FB4B
-:106B700080705C604FA0E77C51DEACFA27E2FC3706
-:106B800003FE2C457C5DC8F1774186398078BEE0F4
-:106B90008D3EE9AC1BBA92CFA797B83C7D611E9B96
-:106BA000164E7731F8B4747EBBE51658FF8244B3B5
-:106BB0001DF1519F54F0F868C4F7370D0CE9AA2174
-:106BC000B1C43D23AA3F7DD24817C243AFF3673219
-:106BD0003B632BECD32AD40CC417FF46E6616C4D03
-:106BE000F3CDBC9CE8CF54A0FEF1E65B7939D5BF6C
-:106BF0005181FA279ABFC7CB39FE4C1D949F699EDD
-:106C0000C0CBFDFC1BB1FCEBE6EFF3F26098432632
-:106C100063BB9AA756F861FC0683678A07C67D1195
-:106C2000E63F08E61F14CF3D76BEAFB2FE37F81E32
-:106C3000E0BD533CE3EB5F16DFEDEEA17EAFA86F46
-:106C4000EBA1FF57C577A11EBE3F20BE6BEFE1FB56
-:106C500043E2BBC33DD4BF29EA8FF4D0FFEFC57731
-:106C60001D3D7CFF07F1DD3B3D7CFFAEF8EE580F8C
-:106C7000F5C745FDFB71FD9F10EDC3E27D7662D344
-:106C8000713FE05D36F02DFC2B4C6C4A46BCDB546A
-:106C90005F4CF8DF3002F07C5017BE672BCC8BE5E1
-:106CA000210E95FA1B82FC189E6F8BFE4BE7F75D59
-:106CB0008378B7E02DBD07F1B041F11CF341FFFE31
-:106CC000F93A0FF2DD056FE8399ECF57032C8ABEE3
-:106CD000DF8E9BFF1631BF4631DFDFD97B13DDE44A
-:106CE0002D7279C64B7E89746F8F2D9B819E3418CF
-:106CF000BFD1C9E54BE1FC32737F941F205F906FD9
-:106D00003E6433864C30FE437695EA1B9D6576AC37
-:106D1000F7DB55923F0F39CBCC3390AFDA80D99562
-:106D2000C07876DE77A35DAD0820FF709453FDD860
-:106D30005F8FB7231F6D64114729AE6F31C815F8F7
-:106D40007E7F7D19BDCF73FCC581FCF968325F572A
-:106D50007BE2214B3EB453EFD391BC28B0AB24C7A8
-:106D60007A2FD605DCD0A4DDBE4087E5271BB9BC51
-:106D700082BFC42218BF2F1F9EEDB8BFE4CD42943E
-:106D8000670FAB1EB79BBF53A3E4415F94574938CD
-:106D90006E728CBCDA5CCC34ECD7EF32079E827E0C
-:106DA000FBAACC9592DC05F73C879ECB17FD780FAC
-:106DB000CAB53ECDB1F229BF294A3E319497B1F20E
-:106DC000295E5EE5D4037F8CFADEE4B2C7942D8E93
-:106DD00044924FC0633CDFC0D00B5A17DC62655D44
-:106DE000FC3A5E1E3508F920F96EC3D7C363E4830D
-:106DF000E4CBF1F2E1CAFCF5ED5BFB131E02B772C6
-:106E00005F99CFBE8D7800F867F029243F98EA7328
-:106E10007913AF0C2F83C16BB7DBAE0C3743EA3B62
-:106E2000A457187C2AF57F995CB9025C653BA3F9ED
-:106E3000C9CDA741AEFDE5FD9F14322099E5001BA9
-:106E4000DAFF545DE0295877F6A2E73663FF5987E9
-:106E5000AC8D0867A36BC6E6465C4FF3E38C013E3E
-:106E6000E9CD1C9F8C196576FC5ED569AEE43E5079
-:106E70007EF6DDBB14C0277D4ABD87C1BE1D7EF1F5
-:106E8000CDE4DB107E6F1988CE4D3AAF9DF5A1E9B8
-:106E900010BEADC8B16E5D4578EC33239CB27798D7
-:106EA000490E30FFF6951A2075036C071B85F553C4
-:106EB000566AB0EE1D4A67F9562C070346DE1E5887
-:106EC00034FE5FAB4E11F54C535DA4778AFADF5464
-:106ED000948F86F6AA7DA00A7267C1DA979A0C3958
-:106EE00058AF93DF6B6C24AC17C7136515F6E7B981
-:106EF0007651EF3FD8540E44D46A94E3333FB66FD3
-:106F0000D5E978D9DFD684FDBF5026BEF73FBD5204
-:106F1000CBA6F9DCA67740D1F17A93EDFAAEF9AEC3
-:106F20004D7EAB6929ACEF1377380996C16AB69EDE
-:106F30004E43F9BC624ABD17E18688EF0599D84BEC
-:106F4000EF263CEDDCB79D13FC59507BF1D0DF936D
-:106F50000641559D3E7C2801E057B3BBDE6C80EFB7
-:106F60004D06AF3F2BBFEBBB9A9D95A4CFD4B51573
-:106F7000D1B39BEF0EABBDFFA5EFCCC6AB18EF9323
-:106F8000D01F6A9F87AA1A7D7D934D4FED19DFFFB1
-:106F9000EED727BFFFE4F93FDC89E35D7087D3C6F6
-:106FA00041EB1521804B37DFC9F6B5BB27D0F3582D
-:106FB00082B6C601EF6703EF227EA5D67BB07DD0F7
-:106FC000DC6CF700A02D86662FCA0D007D4037B21D
-:106FD000EBF90B475F6A1FFF3E9EBE826696321E2C
-:106FE000F978B54A722A68F6270C81F26AB043969E
-:106FF000C2949615BD3B6C10965FB231B44B1AAA81
-:10700000DB5D8390AE3C4686FAEEEAEB831948E7F7
-:107010008D35C629DB117F430B5C33A3F4ADB5C9B5
-:10702000069AC7CAD780EE86C2D3107428F87D3F6F
-:10703000901B0AF2459F19ED1C4B4632F3E7633B68
-:10704000DB6AA4CF95065F4519B6CBD0917CB1F42D
-:107050009B5C5106F370A5EA143DCDA3FCD82C949B
-:107060006F76234A50762279FA6E84D373AAA71ECC
-:10707000E9F0399BCDEE870AE0911AF23FB59F33D4
-:107080008065939ED5A31CCF2A02791EA5C79E10AA
-:10709000FCF384C348FC6EB52538A114FAB12ED098
-:1070A000D9FD30DECA9A751D63619C5FD6BC7C74C5
-:1070B00029BC5F95A6329C87CDA9868C207F0CDFEA
-:1070C0008339C2BC5F58EAB5237F8DA4AA6C1BD458
-:1070D0005BFB1A993B8A5FD90641398A4FA638551E
-:1070E000CD02DF7F95ECFB77078C3BFCAD77CCF8CE
-:1070F000BD6B844E87641354F93E2715C7F6631F92
-:107100001DDB4F72796CBD737C6C7DDAE4D87AD765
-:10711000DDB1E5CC7B63CB5324BE01CFB1813CB65E
-:10712000F22A660D7FBA04E52DC0E73D84BFB54065
-:10713000E741F8586AB69F9D05F559C84FD01E1A09
-:10714000C248EE1EC8FDA91BF5025372BDDB31E833
-:10715000727864E5986FC3FDB2F555ED0CDADBDEAD
-:10716000FFE86BECDFC6A2DAE5237CB488239597B1
-:107170005D309F44FC871BE15DFFE707512E1ED564
-:107180007B10DE59352A8DFFF0647740CFF5091763
-:10719000EA3349A27D927975871EF879D2FB2BE7F5
-:1071A000A3DD1B0FD73456AF205D027E707BBB92F0
-:1071B00091FC58A1635588376823607FA41E01BFE6
-:1071C00098946224389992156137AA3AAC4F13FA11
-:1071D0009331E35E0BD2F1438738FE3F64E4FD74E4
-:1071E000F6E7A64111E519F2C994645D4C3FEBEC5A
-:1071F000A28D28A73A78B9B53DF936A4CB759393FB
-:1072000087219E98D0EE82FE7A659BB501B03ECB79
-:107210001B46BF029DF65259BB01F6B2D5CAEEF12C
-:10722000C23C361CB6FAF5F0DE32F31776D4D38AB8
-:10723000C5BC5B9779DE463E10A954098E96D4668C
-:10724000FBB0417C0D7E981FA203CAC5D27E2DA43F
-:10725000E7594A9B49BE5B8A9A9B114E1BC6EB4875
-:10726000DF48BE5747F86CC9091EED8B7E82993AFC
-:107270003BF6970C82DF089D3C9ADDEC45BF090385
-:1072800098EB4A38AA60BFB442182745C0D5E9DC5C
-:10729000F91305FA49C1FE86F0F608278780D3E87E
-:1072A0006437C1DD29FA4DE90BED87F07E1A4BBA40
-:1072B000FA91FBB8A18205707E725CD94F67FF4CD2
-:1072C0005390AF1A7E0770837D5272CD34B987E632
-:1072D00032B28F5B9779EBB7125DDBC8CF91E9CC07
-:1072E0002E433CCA3CBC71A26E087E67A5710C336C
-:1072F0005900F1385365E61B9351BFF1121CE3E9C5
-:1073000035A3BD7912EAA9725FE2E93743654DFA08
-:10731000E4CBE938C3E92C2B18D20D3DC7D14BC6BD
-:10732000E1C87D88F4F174BD25E14211C28545B7FD
-:10733000D75FB9ACD7078FA29F87A5839C00D0E702
-:10734000C68DC7D83F4C585698CEFD4D1FE4FB0E56
-:10735000E1BF017905C4DA3ACC3EC686743A9F1182
-:107360007E95ED5A7DD7EFA0BF4BFD8C76942B39DF
-:10737000879B3B503EB2DDBEFEB80F9B54DF130926
-:1073800050BFE9583A43BEBDD2C2ED3155E079BC99
-:107390007C592BE8C68D72CEF5AF3FA57E18EC9BCD
-:1073A00036D00EB4B7F617156F9853FF07F52CF6C5
-:1073B00002E959D9ED1D4B6D38FEDAC34D6680AF39
-:1073C000E52DDEBE19CA7E15E1574DFEAC0339B37B
-:1073D000084EEA7113433C1DACD70258667FB230A9
-:1073E000E4BF3B5EBABBCA8DFC276D9C1BF9D0364F
-:1073F00041EF01619FC5AF5F356A3ED427E2DF6F81
-:107400004CD689FDF49EAD847D1CFCA491AD82CA4E
-:1074100042DDF426B4EF222B81FF42ED74BDBBF6B2
-:10742000E751F6ED23D6D26032DA254BCCCC070AF1
-:1074300073F6970AF30171E638FF508AFC279785A7
-:107440001494B3B9F5A0F0225E2DB4325F14BE6778
-:107450007FA952FB47AC5A3079047F6F063E60E04B
-:10746000FF64CF257B59A593F328D45F0CCF5B4FE6
-:1074700022DF60CE72ADD31EE98DF80B721FC6DB22
-:1074800027D66D00181A86C17F365DC834E4F2F63F
-:1074900007049C54B32D84FC52B51D3946FCC5AE7F
-:1074A0009E8F6E87763731B16A467E59840B957F01
-:1074B0006CA77216F05FD330D2FBFD687FFB93B8E8
-:1074C0003DC234CDED4C437A6104E46C336B3243FE
-:1074D0003BC276A0B70CD66121BDB99DB9911ED033
-:1074E000C3762681581643B86E62AC229A0EE453D6
-:1074F000FA25D4457AB2A7061EB4D07C0CF52C60D0
-:10750000417D08E706F05617B2809ADFE5171CE2C6
-:1075100070D37746564FFAEC0B5F9FC8443E6D3DE3
-:1075200004FAD850DC671DF129AB3596FE185B4A8A
-:10753000708A08FCD8BCC44EFBDC69BFF9DE11FBC5
-:107540001C5E8AF222776172CCFECA76D95F663100
-:10755000DFF0E87E03D46F76DF7605FD32D95FE693
-:1075600052FDE625EE2BF4DFBB87FE33088F7AEE63
-:107570003F9BEA3787DE71DC0EA0D814697778DD8F
-:107580005DFA753C9CB317C6F2E5A1BB63CB122E26
-:107590001683E69C0030B7DCA7F36C85FEBE732C27
-:1075A000B65D45FE1FC9FEED6A1F724EC2F6609FB2
-:1075B0006F85B7379C8D6DEF2D7DCD8174DCD59EA9
-:1075C000CFEFA62F63DBC5EF4FFC7C615EA9DF8F99
-:1075D0009AD718B329A67E4AE565F34AFD41D4BC83
-:1075E0006E71C5B6F72DED7E5EB7159AFEE9BC64E7
-:1075F000BB3B465E5DBBF8754CAA30F50077DEFEFE
-:107600000753AEAEDF1F56FDF376F72C8A1FC74F28
-:10761000F8BE40A78D4981FAE9F80AF5459B95F433
-:10762000DECBEC2C219FC6A1E201DF7992B471F888
-:107630005D85A43BE16738FCE275E9C8D7B3841FD8
-:107640009D09BF426BB58BFC0A3ED11EE44923F273
-:107650008BD61DF05D129F57B4FE9452CDED0A3BC0
-:107660008B103D4B7D2999D9156E8F737DA7A7711E
-:10767000E2FB7F18154098EF8C4563D80740872FB1
-:107680001BEDA52ADA675B14D20766946BFA44C037
-:107690008F514D0AF995663CF0F6A3E88FB9FEB418
-:1076A0007B7718DECF08383C386C6D07D3304E90AE
-:1076B000AE9F5FF4203C1F3BC0288E86E5F9886FA3
-:1076C00036CD8DF64625CE08FA396FA82FB223DFC6
-:1076D000FC914D43BE5939597B8FD6FB156825D097
-:1076E0006E265F3ADBD532C188F18ECABBDD2351ED
-:1076F000EFA90C5A347A9A996A857554823E86CFDE
-:107700007423532DF8B432333E4B9671FD2B69A48C
-:10771000D75809E357B63DF357FC6EB61ADACFF5E2
-:10772000C900ADBBB2ED8DBFA1BE3653F31A915F58
-:107730000CDC61E43AA9C087C1C1D832F283E87297
-:107740005128B63CFC706CF9D3140EDF51C28F7512
-:10775000609F89F8F6BC8FADA47FEE05818776B275
-:10776000FF0513C98F31F36CB45F1F9FB36E45BF24
-:10777000DEFEE3566A3FF7390B6FAF0BBE8865FF3D
-:107780008B096467CF4B099624C3BC5FF95A4FF04D
-:10779000C66519B0FF17076C5D85F5C383251817FB
-:1077A0007BF93AC63AB05E0D0CC175BEFC0FEEB760
-:1077B0008E3C6B0A6C837E3FDEF3CC8B3FC3719FA4
-:1077C000CD4A56607F6E40B900ED463D69B6A2BD18
-:1077D00031EAE3E7FB20DF98B7C314B3BE175314B5
-:1077E000A13FB89310EF7AF23B9E5AF90C7D5F7877
-:1077F000F618E1DD5E835F87713CFF4A8E677B2D63
-:10780000DC4FBAD7921BC07DDA97C2E9EA06DDB633
-:107810005FD6A27EF916D7437AEABFD03563737973
-:10782000377EC6CE7A18371FF6F9E247D67BD01FCF
-:10783000D77F7DEC3E0D08C4965F4BE17AC274168B
-:10784000F53E1FE7D37BB90BE7B395D17C0ACFBEDA
-:107850007F573EEAE326AE87C48FFBFB142E3F7FA3
-:10786000F52BE887F3193DD7C3016240D7F3043DF8
-:10787000BCA2703D18FE166601FECF4305A277D765
-:10788000FB7971F390FD2F1570FADC9CB40DE5B90E
-:10789000D3C8F1FEDC92C38F621C53B63BB344D312
-:1078A000CAA3FCCAB3D6CF3F9401FB5FDD9A4A76E8
-:1078B000A67C5FFDECC1B41FC2FBF33B540FAABE14
-:1078C000D5539F7E6414B67B561FC47962BD06FDF6
-:1078D0009F0FBE9684ED666D720C437F89FC7EF629
-:1078E000FA9BB5F2287E7AADF424E9BF5AD8C7BB1B
-:1078F00046768CCD0278CF5BAF78B0D9BCE0F72765
-:107900007D0F759D4D7A0FC6374A54E6D50F23D3A8
-:107910007D323EAB5B5F3A9409F575FB4694E0BA65
-:1079200056E9BCB70D467AD962203F58FCFE189D37
-:107930001C7FE1FB900EBE5F75A7AD0AE322D06FFE
-:107940003B960F146ED3A31F3FE92CF037FEFE9831
-:107950000E78E6D9B6878680CD02786C6B42FAD86D
-:107960008B8E0B1CE7053DC90916E2EB1825FCCFF1
-:10797000F3FEB3C5A8C2F3ECD96549A59CFE689F88
-:1079800090A93B617D554F0E267A9DBD3E96BE6403
-:107990003B39DF3981D8FA78BC28704A7F052B8CB7
-:1079A000C6AFF87629E3FD46A4C7EA45C0CFA3E8F1
-:1079B000A6FA74B311F5AEF871508364725FF58462
-:1079C00097CC4DEBB5F0F582CA6B86F59EC37F71FF
-:1079D000BFB98276FD5C8596C8E65DC7CADD00CF7B
-:1079E000791359053E253F3C3F323804DBEF35849F
-:1079F0009FFE25F1C144E207E7EDA124F42B650ABF
-:107A0000BFDE79772809F9DC4511B7C37A2CCF6D31
-:107A100003790074FDF12746920B4B83079370BFE7
-:107A2000CEBF68D1E9605F3E6E4D29437FD0F9E05B
-:107A3000EF92705DE7822965E8D7EB894FC4F33791
-:107A4000A90F9CC47F5E0F7A8F531BEB44F86290A2
-:107A50002103E44D4A7D517D37742FBF731AEB8BA0
-:107A6000304F23F2239B671B8713C5F33E3B9CB229
-:107A70000DF75BF2D94A85F72FBF9FEABC3ABE5A91
-:107A8000B16A00C5993E63EE5EC8E7EF46DA80F959
-:107A90001DDE5FD00BF50DF9FEC134EF3D4EE8CF92
-:107AA00055D641F901AE71CCD3004D3FD07BEEB736
-:107AB00003FCEF6520FFF059EC3392DFA63195D639
-:107AC0003743652115F07D06CAE72154267D68C637
-:107AD0002625D000EBB977752CBC66B598BAF004B2
-:107AE000FE9BC380B122216E8A6A07FDCF41390C0B
-:107AF000FB30D7CC4209D0EFDCEDB1DFCD63219A6A
-:107B00004FF5F3DF98BADB8FBF8AFD78304D5B8489
-:107B1000FBA14C34D3BC7EFC824272D229FC9591ED
-:107B2000C77A0530AE364FCAFD77F8BED53D50A9AD
-:107B3000DD0BF87771D10CEDDE144A3DD1501F6199
-:107B40002D8984CFF3CA592807E637AF4D090D4E6A
-:107B5000EAEA8FFD46E1761EE3F1CEBFBEC3F7F140
-:107B60002EA13FCD84D7A88FDCA0E3793D910D0AEB
-:107B7000C9D751CF2BFE44E0CF33CD602A229F12CC
-:107B8000EBC6F6BDA03C9BF9094EBF74E6D3FAE6FE
-:107B9000B00E23A7A340431A8C5B7B167813BB1A45
-:107BA0007CB89EF6FD73E6A17DDF82734E457C288E
-:107BB000213C91EF414F6296E4CBBFC7FDD3A2E0D9
-:107BC0005DB529B6CCB647957BE3FE40396ADF6ADE
-:107BD000777E63D2BAD9AFC73AE55B60C084C1D1C2
-:107BE00074C2F5F013623F1FFBFEAC0CE44B6B500C
-:107BF0009FCE141D8C443ECEA49F256486FEADC34B
-:107C0000598CDF05F43D2ABFE2FCD1B8F5D98CAD23
-:107C100033F8287E3143EF3D84A1B6A274DF6F11A3
-:107C20004F66E8B45C95E0AA1590FDBD88E3C3E318
-:107C3000C3EA07D4776377CBF9AF5382211DF2A74C
-:107C40003D5C5F492C8E187C5174FF9EE0BBBD0EDD
-:107C5000840F6521DEBDA4509C6083C21A1580B3D9
-:107C60000BF619E5D306E5E42194671B6E75B306A0
-:107C7000A82FDE3961FE6B64BB5B29CFA86667A9BC
-:107C8000BEC646EBE7FA7342FD561DD4A7DF533854
-:107C90000CE90DD67DCF44787FC2E9A67965D83846
-:107CA000FEB896F9F317A09FF88077FE6B8877836C
-:107CB000ADE48F4B07582526D3B309F562175BAAAD
-:107CC00060BBE5A90ACF83A864537E3388B059ED21
-:107CD00095CC9FC7E0A9A8AC11FDCBE92AE8D9FC57
-:107CE0007D238EF358129F57AA4E7FCF04D4F3877B
-:107CF000F172F26245DB46F26C2DCD2BDDC42A70A9
-:107D0000DDF81EED029886D64AF5018253FA98FAFC
-:107D1000229C477A1FFE741A43D9D8CF914E3CF16A
-:107D2000E9507E2C147AC0C2AD65E9C8EF8F9C374C
-:107D3000ABC8D78FB8A43E1BB2A13ECBFA16F2F661
-:107D400042DE2E2C1A938E44EDCC8D6D77D1A0F5AA
-:107D50001A8E72EBA89EE24F7FB169BD1CD0EE0671
-:107D600023EB36EFAF572ADFD7BA2F151688F26309
-:107D7000D44DB944F642DD976ACCFBF34BCC2C10C2
-:107D8000E5C7A8AE3A3016DBD5B08EE5888F35C191
-:107D9000041688A28F1BACDD8F2BE9A2EE4B3DF3BE
-:107DA000773BAE31F6FD9729CC9FD25DBBB4D8F7B7
-:107DB000B08E98F2EE2F3AD781EFD9C87012FA75CB
-:107DC000C7A37C86F2C580CE6F00BE75C4C0E5EE49
-:107DD000057B38462E5F7087B95C46BF958DCBB367
-:107DE00009B8CF6A24696262D738B21EBF4F8E5A73
-:107DF000EF85294616A2FD89D03C107EFEFE8C6DD3
-:107E00006CFBD488F93AD56DFB097E126FA2E1E8CC
-:107E10008F8E8335748474C033C6A56E5F35680059
-:107E2000A0E001C91F9E5EA58D867ABD2E865F24C7
-:107E30001477F20F62578F61548EF8CD33ABD06F49
-:107E4000DB55E6EDBBBEDF310EEB8B07F1EF27A76D
-:107E50003EFBE6324A6A69E67A971AC9F5264695E4
-:107E6000CD71651B94074795ED71F5CEB87A575CD7
-:107E7000399BB73F9F18CAD57B18BB27F585712A58
-:107E8000F0CDF319A16998C7B6BAE1D7E3CA819FCB
-:107E9000D51473395FDBA678485C09F8D57AB81E2B
-:107EA0006BF3848D983F9750DC7108F94BF56EC5E4
-:107EB000AE003DD882AD212AE377EEA8EF820A7D9D
-:107EC000571D3C49DFF5D87FA18EE87D55E129DEBD
-:107ED0002EF821E9132B1AE753BE808C87EB994FBC
-:107EE000CB52BAE2E192CF5EC8D00E129FDDA7D886
-:107EF000913E3BF114FB8DF243C9F67F1ADCF64745
-:107F0000545712167EBA14F5EBFFACF97004EA9BD5
-:107F10007F12F2649D121880E36E64BE01284F7FC9
-:107F200054D36FBF0EDA9D30843763CC6F4BEA6B4E
-:107F300004BF1389E11CCC0B0C3CF6EFBC9C1ADE91
-:107F40008CF0BCF458C738CCFB3B9113CEC13CC07D
-:107F5000EDA9FFC5CBFDC29BB17CE4B133BC3C387D
-:107F60009CA387EF7BFB3F1C570EDF3F65EF9EAE68
-:107F70001F13FC44CEAFB6AFD69C8A7A5E359743CA
-:107F80009BC1463303DF9C36F7DC0B4F011CA6FD7B
-:107F90003481F8D953E7278DE3F682DFAB96A03F13
-:107FA00099FF919C247EAF929E9181B231B96B3F33
-:107FB00012733BDC2447AEAB6F45FD257DDA209282
-:107FC00023E54EED0B1C573EF767C113DA7F916A2C
-:107FD000E7FC5BAFA3F87AFACF1249CF5B63E1EB22
-:107FE00001BAA1FDB589FDF89558CFAF52B91D7AF8
-:107FF000BFF366EAE72EA1DFB7AC0C3C6B01F81FBC
-:1080000097793B6BB9BDF0C3ADC057808FB738B41B
-:108010000CE4273F147978927FE0FBE4283BA9A584
-:1080200008CAB62E7BB86582966175E2334D8771BA
-:1080300024C98F5AF2F977522EA537F071D3D70C95
-:10804000D886EB4850B93F6CE694826D4B492F9827
-:1080500048F3659A96A1407FA7E7F4D6A19F4CEE1E
-:10806000CF9ABE5A3BAD47C419E43EC9FDFC2295E8
-:10807000DBF733F4A057C03A2DE93EEA0FF48C2128
-:10808000C21F477AC617B8C751F0656A7804BEFFA9
-:10809000FF084E1F7D1B70AA5904FC427715FC4255
-:1080A000C06F9D1232A4737E41F63DBE47B9D3EE38
-:1080B000F47D9D1A95AF33ED6735A457CA7925FC39
-:1080C0006457C50FD8E57416AFF799D2F87E49FD0D
-:1080D000D423FDAA629C13C7CD144739610C12DF6B
-:1080E0003C0176D552E42F220FA0E4A7F38EA07DA9
-:1080F0002AFBAD49D373FFB4DC77C5DB3A2B1FF302
-:108100006298DF8CEB9860A47D9772B7C5C1F35C71
-:108110005A1EC8A23C978B2CCCC83F3B92117F04BF
-:108120003CA0FAC8D434A27F68EFB760FB39D751BE
-:108130007BC00B3FF187A956B2835A306E8EF55340
-:108140000B03989783763CE1DB1C1D8DDB0DBE7025
-:10815000FF777F9EF721F126AD81FB9998AA0D99B3
-:108160001025E76F4DE3FB9C501C7EE93F50AF5D4F
-:108170006D21BD16652CC5A89AD3A91FD8FF6169CA
-:10818000DC4F417876EF238922BFCE5382705D9118
-:10819000C8F1729385C7CF36811E4D7C51E0AFCCBC
-:1081A000EFF3097D2F5CA54B427D414B937633C89D
-:1081B000F512E1BF87FAE961E524DA7FD3FDFA9091
-:1081C00009FDCC4D376BE1283B06FF30FE788FE090
-:1081D000AB6C3D233BEB1EFC2E09FBB72661BCF5C7
-:1081E0001EFC1EEDC8C537C7C41527A671FA96F345
-:1081F0008BE7FB13E5BC9A1FD7A2C791FDC7F70712
-:1082000076EDA4B4548273A817EEEF523DED5FFCF7
-:108210003CC3EBB91F3EBC3E8FF04EF6D7D33CFFBC
-:10822000AC8FDCA7801C9C3586DBFBD2FE9929EC49
-:1082300071B638D6BE43BF4F67597F7939DE5EC409
-:108240007C81D8F65C6F4918143112DDBA9598F923
-:108250004B78F5048707AE116E52EE3D6E013A0081
-:108260007C598F7995805FEB1F482039E6340606EC
-:10827000205E6DC47C1D92A7DC8EFFFC48AC3F26BF
-:108280007EFF7E9E26FD6AD7667F3F8278D18DFD78
-:108290005D678D6C41F8D75919D1E7857D89448F89
-:1082A000AC6F781AE6D15DDC6B62480FB54AB80056
-:1082B000F9E00545ABA4764B13DC4897D2DFF1C15A
-:1082C000CBDCDF51873B03EBADF3FF17E571D5ED59
-:1082D0008EB5CB2FC07F5540471774E112EC4FF29B
-:1082E00017D0CB35D2B7AA787CAB56C7FC68B7DDC0
-:1082F000A09B3E87F38D4CB68DDE9F2C5810A5F7C2
-:1083000043BB762599A323D261B5D8975ADD296A54
-:10831000578DF958B83F68BFA11F102BA3FCD6B5E5
-:10832000AB3FA67CB0DA9DB1F853DD855FCA370A52
-:108330007E17856FC41FFC82BF30EE8F29E7F1F9ED
-:1083400044514EA8E8A0FCB03AE18F493D101E8B85
-:108350007C2AB138C8A6C3B3EE2CD75F46B56D3DB5
-:108360008876BAA3A22307C9AA4EF84125FEC87988
-:108370005EDFB6568F76A4D47BA2ECD8011363FCE3
-:1083800018CBE83BB48B71BC30BECA40F4E2F27249
-:108390009D9097096860A35C6DEE4F7215E51EF223
-:1083A0003B695723FF43FC2A4A2F3B8EF4FF467A52
-:1083B000D91F399F04BC453B018DB4EB7BC63F09F7
-:1083C0001FD90EEDEB7FEE9F147C9C71BFE48237CA
-:1083D00052FF291D9CEFE4AF57F44BA623BE2F504C
-:1083E000DCE988EF17057F3CBCBF80E2A0F2FD19F5
-:1083F000BD8FFC8FD2FF3507FD7EF0AC16FC689672
-:10840000F097CD927EB2F5B1F15AF4534797E74A0F
-:10841000BFD90E53571E13FAA9CA592811FAAB41F6
-:10842000BF1B3E83B1DFD5B2087D57B7FB1B534C52
-:108430003CB885C3F11E814F8EF2801EF9D8060B21
-:10844000F79F49FE366AF156C2935EC3B4FC87902B
-:108450006EDE3090FFE57F0B3C90707930ADECCF55
-:10846000B8AF56BDF00F3E6422BE7E1AF48556E1C9
-:10847000F7998876F212A6E13901A6DA73A3ED68BE
-:10848000F95CB5D75285F89899AE8BC1D7F634030D
-:1084900095C91F46722381F402607343105F4B7AC3
-:1084A0004BB9CD86A01FEEA4B0EB6BEFB4F9B0BF13
-:1084B000B08EF3C5FEE97C9FFBA7F3BC5959EEB41F
-:1084C00043053ECA382BFAA5A2E314433ADBAF15A5
-:1084D000FA2EA3F5AE9B23F2E83BE942477C2E61DE
-:1084E0009097E4C30DBA32E273918F6C6E844BC5E2
-:1084F000C7D573701D9F4DB1D279C97B859FFCC6CE
-:10850000749E8726FDDBD7EA272F4DEFC4C7183F9F
-:10851000F95EC117F7323E5FFF592BF7F7AACC8FF0
-:108520007C726F704000E75B29FC23A87F21BF8E1F
-:10853000BCC4F791A95C5FDBDB3638807474D2E091
-:10854000DB3013FD4DAD06F21B3235F0ECD3D8CF46
-:10855000AB191ECCB3BAA08B6CF93DB4DB7BF657DC
-:10856000591857DB2BE21BD5C65001E9F522AFB4F1
-:108570003A2954807EAA57C47E555BA10CEF532C38
-:10858000BEBBD253BBE28FF81DBE3F15E076C329B8
-:10859000C6F1C0BF9AC79701BE193371BE2BD3294C
-:1085A0007E89FB82FBF0C1BEC1B4AE7506D17E0FE1
-:1085B000F7732B130BA7919C59654A41F85FF41A86
-:1085C000292FBA6E0DD76B67E8DC5B1621EF7D357E
-:1085D00081D637B3E528C595EA1E994DE74DEBE600
-:1085E0002EBE9DFD93780BCAA968FFFE0516C9250E
-:1085F0007BBDAA773004F3B8D036C0C3C3A5FCFC5A
-:1086000052ADC8BF3D6D601ACE3BB2CF10E8EE5CF4
-:10861000654FFD9383B384CB4B1CA72E3AAE45F236
-:108620002536CE75A5F20543B8E001187F758A6F2F
-:1086300075BAD03B115E75AF66101FFDE0E12F7279
-:1086400049EF69E6F194D3066D1AD289A33C649C84
-:108650001EC55FB70B3A9E6112FA2DF0C168BA973A
-:10866000F52565B174269F4F0A7A4B14791897D770
-:10867000CB3CBF492694C7DCF585FDBAF9393411E6
-:10868000DF1C7536B21FF3D9AA8345143FCD5B1C9E
-:1086900022BA047887D03E39BD2191F3135826F6CB
-:1086A000336B2423FD7A969EE795CC3281BECEF5BE
-:1086B000026A7F66433AC1A16419D753232F29C4A4
-:1086C00017659CB792F1EF77359EF4EBA17DE50E2F
-:1086D000A508582BAB6C2CA5BC93B99BF269FF473E
-:1086E00009FE3BC3A4156C407CDBC5E384301ED976
-:1086F00005D5985B378CF89211E56BD50E85E22590
-:1087000072FDF1715516888D478D0A72FE8D728348
-:1087100045E993520EA1BC60717A6E2C5EF8AF4AA7
-:108720009EC6CB8377D3AF56AF8C95A7EF21FF4A78
-:10873000BD5C9E82DD701CF1B0A48CD371A495C782
-:108740009F6A583D8FC30979D6B92E210FCFE8B95A
-:10875000FC9D655A4BCF8BE93C0E359785451C2A0D
-:1087600062C4F9F5845F17D3657E7B2C7E49BC8A91
-:10877000209E417FD56759E8BB305EF56216AA1985
-:10878000C29F894348BE73396FE6721E9FD6AB9075
-:10879000F7F1723E5EAEC7CB73146728B7253E452E
-:1087A000C723504F1AB538A0E7FEE66C3BE665CA12
-:1087B000FDBDDFA939B253BBF4C0BA6366B37B28F1
-:1087C00096BDACB70DFD68A59B73A0BE4EE5E7C393
-:1087D00013004E5BE1FD666187ACCAE174E612F9F5
-:1087E0005706D5CB8A6CB84F1DE43788A432CAA788
-:1087F00097F0DD9C08DF613E420EC78FCEEFCDAC17
-:10880000D11AF57DD95E0BC9A94B7B12E91C205307
-:108810007D790EE82FED4F603F40F9C2DE44D21360
-:108820002E08B9E194FE19B69CF6A38F8BEFB39F87
-:108830009565A19F9B29E3B2189D8FE7FA6C8DA3E4
-:10884000A7F884A8CFEFB893E39989E4F52547F812
-:108850007E2CC37C28BF3BCBC5F7BD6EE798A29F9B
-:10886000615E86D7E6E150F515A1FE61D22FBCD33B
-:10887000ACC77B1216471E8075D4E4D8286FBC3C69
-:10888000EFFD77A742F9A39D063A5F3AE7A949BDF4
-:1088900042F899AAB9BAA393390143CCB9C5793B37
-:1088A00062CB35C1D8725DDC3D058BDEDFFA667BBD
-:1088B000547DB94B9CEB74330FE6BD33FDDDBD7CBD
-:1088C000DDF05DF9FC6249E0CDF67E9437789B8B54
-:1088D000D3B311F5A3E9880FDD7CA773F17D35993A
-:1088E000EACFE2F903D32B26BACF20DDE59BEC4A91
-:1088F000453B2A7208F7D394777E08CAD3B2BCAF3F
-:10890000286E78E941E641F85CB294929E746983DE
-:10891000C58D76634BAE8DF0A0E55525A070BB628A
-:10892000FC08E0AF55341558EFFA5B3FE2876598D5
-:1089300099DF7F0056950BF9954676DE990956FB2F
-:1089400032F8AE6A3D97DBD5AC2309F9C006B97F92
-:10895000FAE78D66F8677EA3366029CC779ED74A02
-:10896000E7A4D4AF55BA1F600576196597D4BB3814
-:108970003FA831878DA538FE570B2BD00528FD79F0
-:1089800026834FC3F37886DD45A12C78357BD14112
-:10899000B2BF3AE3F6FB38DF9AFDC07E7AAF4CAC4B
-:1089A000A0F59E81F5225C0E6E30D17ACFE4D8C856
-:1089B000FE3DB399DBF9B3EDC68099F4962F53F0E1
-:1089C0001CF399CD06BA3FE07278DC42E7893FDCC0
-:1089D000F43AF91B3F647C5CFF4E3DE93D1FDA230E
-:1089E000252184A3BB3E09F5E6AAF573E83CF2EC29
-:1089F000CD7A2FF2B3D99BEFFBFDF5E8279B785793
-:108A0000312EE926C7C234B7ADAB5EEABB6AF2C805
-:108A1000A7910E6FFA7A4CC74DA8776D063AC9E751
-:108A2000E71D50DF6FDF7C0BE9B7B327581DB82E69
-:108A3000F7A6A7C6A21CFA7042269D9F9EFD82C281
-:108A4000F0CA8CD98E4569F87EB6A27ABBC3A7A1BD
-:108A50002E7EEEB934CFE609E1777FD4139E005D18
-:108A6000DD8972B866B381F4E7F689C7DF9DEAEC69
-:108A7000A22B65E2FADB4761FB670CD4BE536FDAC9
-:108A8000F43D892F2C5482F619875B3C9D99F21690
-:108A900017E0BCE2E96DF6B2FA021EA7BB36BA6374
-:108AA0009B38DDFD9B4BDCFF71F574B7D7957AF5EC
-:108AB00074C7B29363E4F0E5FCCD4FF094710EB34C
-:108AC00087694FD928AEAD29C07F3FC080FE087CA2
-:108AD000F27362EADF16EC780BF1D8E53B82F3C85B
-:108AE000635A11CA4D77C45E8667C06C422F649B7F
-:108AF0004CD29E203B615D2A7B7A55945FE4CFA2E5
-:108B00003FE0037FC47E2EBCF7D521DCA7DADCF37F
-:108B100043D0BF5DF7E55F282E6A6BE371759B2735
-:108B200042F90606A797F050F2F73A0F973FF1EB9C
-:108B30002AC8E0F6619D3342FDE833DD546E1171C1
-:108B4000A48D8BACE437DEE80C58B8DFC3CF503EC1
-:108B50008D1FA9E7F140A1B77D4FF85DCDC507197D
-:108B6000C601D9689E8FF756F1413505CABF1F79F6
-:108B7000B387CE51163FD9D41BD73DDA20EAFBD0BC
-:108B80003D27FFAE9552FD0297DE8DF43DBE98E77E
-:108B9000A3B2AA24F2E7BC55FC81F3DEA8F97B99C5
-:108BA000D96D03BC9908C41A9DFF78FB688BDB164E
-:108BB000853F9F352B155C7F76F79A3C98FB6B4879
-:108BC0001E17C7C26381CB48E3BE915ECA3200CE96
-:108BD00037DDC8F7E3DC0BA600F2C173E25C523C60
-:108BE000FC7A6508FC5107C4E427388DC15C949376
-:108BF0001F2BB1DFCD6DD2537EC09C26850560BC96
-:108C000073CFEECA457EFED153BB72A747CD27FE78
-:108C10003BF9CCC888F57FC6FBB37BF263CB7617F4
-:108C2000D7339FB94F57FB8B557F273FF6F436E17B
-:108C300007D7B4BE4EB4AB44FBF8FECA057E28BBD2
-:108C400015F29F483FEEA9C34F62C4A873FF2C6D75
-:108C5000F9BAE83C52F91C25F66D12EE1B2CC5D270
-:108C6000C4CB3DED574FF47842C821B96FA79AFAAB
-:108C7000F442381A6B6D2AE3E7030B51EFDFCCACFB
-:108C80001EA4A72F443EB1D30A4FD0D38C992E1BDC
-:108C9000F233791FC34FAC49DBF0F985C837765AF8
-:108CA000E109FDE46416527F5FE8BC641FFE44DF07
-:108CB0004CE7466FC9E0704867214541563BEF6578
-:108CC00085F2E49A62E19DD6C0E548A4D248F24B11
-:108CD000C2FD86E9F7931DDCCD7EAD473CCA1CC9B9
-:108CE000DFF933F2851E1DA678896524B3A39FA002
-:108CF000E17A3FCD43EE571D6FCE943685F467CCB5
-:108D0000F34948A6B8B05F3C992D9975C6491284BD
-:108D1000DDCCE2E222E9A077633B394F2853BED095
-:108D20001A47B0B980C795492FC57EF1FDF4412A95
-:108D3000C515B09D71D895F1AF134F453EE878F950
-:108D4000BECADA6D1C663C9ECBC27D00F9887A21D2
-:108D5000F31862CE656D027D1AED3D19E7D6EB8200
-:108D6000452EB24F3AC2E887319698DD286F13F44A
-:108D7000C142DCBFF8B837B4CBE7F916D90E94334B
-:108D8000F2DC55EDA2315E8CC781FEE137E3FE4D8A
-:108D9000E0FB57FB4029BD5726162E45FCAA5BCCAD
-:108DA000E87E88316DAD940F5657C1F5B1BADD2715
-:108DB0008D0CF077BAF00B31E1174F13FB7A4AE8CC
-:108DC000DF5D71BDF016CCB76F99934DE7ACE3F35F
-:108DD00067AE35AE7B31110032342A5ED7CBCCE59D
-:108DE0008CD87F49DF327E9738C89B8F9AB861BD97
-:108DF000E98875C4B5E4C7841F2ECFFE27F931FE7C
-:108E0000FADB313FC68C5ABEA8C769801CED3C47CF
-:108E10006971537CAFB31EEFBF30EF56C47839B7DA
-:108E2000DFAC529EAF289F5A8D7EB1351616335E49
-:108E3000F4FCD4B8FE0DD0BFCD2DDBEBC6637F8F25
-:108E40000D13657FE56ACC075A6388ED8F50509EFD
-:108E5000FB34778DB7393BF8F0EAD15DF21CE4FBC7
-:108E600061941752AEAF383EBE79A81BE9EB73CAC6
-:108E70009B96F2B9CEC9F365E2F9D8DB829F835E97
-:108E80003C1645EE8A29F3E9BE88CE38775BA58685
-:108E9000FAB08C73D72DF652FE34E803FF9141FAF5
-:108EA000C0F933FB19EA9DE7C82EA8FB52E5FE2660
-:108EB000D02BF0FE1F735B29F955319DB75FD4FEAF
-:108EC000CF15720A7578A487BA4D3F784A0FF543DB
-:108ED00033B530F56BE8FEFEAFBF65703DBEAEB09A
-:108EE0006C03F203B65DA1FBB756157E467A47EDDB
-:108EF0009E9B4744E7FFCFD9FD18CF1FDF61E8767F
-:108F0000FD7FCBE07A6AED9E97C86F7A2EC08F2DD9
-:108F100055A98195A8875655E950F362C581CAA91C
-:108F2000A40F4C8175C0BAFE9CC1E153B763921F78
-:108F3000CF23D4C17F0ABCDAE89D4576C1C6296635
-:108F40001BC697EA0AA7CF27FCB75B355C7FFC3CC2
-:108F5000BBE2E9563A37BE6AB7A102F5A812D09B28
-:108F6000FE0DE69B933CAEC2037C294BDF5AF463B3
-:108F70001BE617742F97B764713DA051F1FAEF28E3
-:108F8000267F298BCE57CADBCDF5337BA631C63F72
-:108F90006FCFE4F74C8DF6778C419C7B550D27A065
-:108FA0009E5CC7B44FD1FE655E9B9BFCC48CE713EF
-:108FB0003897B8C94F6C76867F3E94F42895E2E9DD
-:108FC000D2BEB8B087FBD79665FA7232D13FA80FF0
-:108FD0003F7A07C2EDE7AAF037733E933BC9360CE0
-:108FE000FD611667F8D10A37E519915FA2D7771BA3
-:108FF000691F5E75323BC2678CBF5255A2E48CE498
-:109000001B633ACF4D39C90F5BC6D91AEB07BB7545
-:10901000C64C28DAF84D4A979E70F8ABC92ABE9420
-:10902000FA83CEEC233BA77C0AD88D8897CB238785
-:1090300074E8F7777690FE581354689C9AC2DF5014
-:109040001EE03C916FD699F7A586290FEE3B990952
-:10905000C28FD9C8F19275905DCC9EE7F007FE44AF
-:10906000F9715D7AFC526A27FB338A78458DF0E30B
-:1090700000A0A8BE2C53FAE19689A7CCE7E3E3321F
-:10908000D55D12ED775837012409CDCB9D84F37D52
-:10909000C4EABD2D13E6750AF017D779AA2981EE27
-:1090A000035BA77468E8D7F417F1BCE1783CF28958
-:1090B000717B1D888C457912D9D353DE30CF13DEF6
-:1090C00030E23ACADB2FDEFDE958C40F56C1881ED4
-:1090D0006B775F5DDEF04CB11FFFCFE40D7B146D4D
-:1090E0001B3CEFCF7470FD4AE60D7BF87EC9786BB0
-:1090F0007CBEF0858C90CAF3FAC25B9E42BB7DB702
-:1091000089F261C6EF7EFD18FA35C79B5990E2CF10
-:1091100071FA43C4396909D2C9C54FCE6C798861E7
-:10912000BEF9CB1E7E1E36561FE8C91EA098499474
-:10913000DDB83653E8E7DF923D20F9759DB0AF3ECC
-:1091400056228F14E0FAF6E9EDDD9D5FDA22C7EFD3
-:1091500029DFA5ADFB7C17E98FAE08E7C7C4BF7652
-:1091600074F6776DF1B4E7507676134F5345FE9A57
-:10917000AA70D6C11C3CBF49C6D3D4D6011427332C
-:1091800075C5D342AC9B789A2AE2532B0C5A25F929
-:1091900069F699DCDC8EF612FF6A6C4DF5207FAB28
-:1091A0009B7BEE453C7AA13AC6BAF09C5FA3807FD8
-:1091B000F5D5C7D3DA33BB89A76D157ADB0785BA36
-:1091C0009011E0BA9571FEEB6F9371351DD9B59191
-:1091D000877368DECA4433CDFB83574DDBD03F3500
-:1091E00043C6CB5EE5FEB519222EF6C1C402F23F9E
-:1091F000F504E7194DB1718777059C2F594AC94F7E
-:109200007FFF2F26907F7E16FAF7FBA07FAB59F8E1
-:10921000EBB99FCFDDC4EF3170EF50E81E59441316
-:109220001DE9A476BA4F761EB0D18DC87AFD80357F
-:10923000DF81D78A4E417DC8DD086550FAD595AAF1
-:10924000DF05EDB61E4B20BFE20AA75BE4E7F1F8AD
-:10925000B57FB512E8C7FBA5FBE3FC8D3A0DFBB962
-:1092600094C9E57C5296B1DBFB281A0D224E22C62A
-:109270005BCA60DFE1A953F87385B89F301E1EB248
-:10928000BF4643BD19FD7B911C7E0FCD25A33685BE
-:10929000FCCEC90574DF5463627D5305AF279ABDC8
-:1092A000648978A9FEBB2A5748993B99F2A83345AF
-:1092B0005E621C9C6736C796E3E347F1E7E36630DE
-:1092C0005FFF8C3E979F1F3B8FFC16FABFB42A5F4F
-:1092D000EC8B87E2288D06F71FF2290ECBEF935A0D
-:1092E0009ACDE1A6CBE1CFDE8E72BA1710E885EBFE
-:1092F000718CCFBFF7779D0AD24BA383E3ED7F77C5
-:10930000DEF1F34DCB2AE07A8D83D36BE34A25C09F
-:10931000E1C5E77DB57E92E2AC6FD74FF281E2798D
-:109320003A944FDF117FF03F6C20BADB6BE1E75ED0
-:1093300025BFA28423B43F85BD7B232AD318573D84
-:10934000BB9CEE85DA58D53B09E3AE6326D9681D90
-:10935000B5AFF273D5358BC3B988D7B565E182FA5D
-:109360006EE08A03A892BF42BBE94EC6EF176A8A35
-:109370008D23C6C78757A768E3B346A0BDF441EB6A
-:10938000EBB8DFAD1692AFB58B234FA3FFC097E2CA
-:109390009B9405F871FE81E36315377D46FAFCC5A1
-:1093A0007DFDE93CE8F4C6D873716C756C7C923530
-:1093B0002593DF9DB5C4BEC7735B31DF5D16AFE497
-:1093C000FACD3AA36F00EA9F37DDC8F3313E99A387
-:1093D00063B8AF9F58F8FEFB1F4E14FCDA53102DF4
-:1093E0000FEA7BDC5F683708F302789EAC6C5F8322
-:1093F000FB0BFB5A2DF6F79397BE5380FB7BBEF514
-:109400003B05B8BFEB0CCD1AD24751BA6F21C2E36E
-:10941000F4CD5ED20F655EF0D5E25DC3B78C77D731
-:109420002A8F9BB3FE35798C7FD17E9357BFD2FBB9
-:109430002D245FF879E22EFFDD39BA57EDE2973A35
-:1094400005F9714FFDE50B3DCF65667ED4C34ACA71
-:10945000C2F45DC9DF750CF541A907C7CFFF4931DB
-:10946000FF9D599A09E5A0F4F75689BECD81CFB981
-:10947000BEBD5D217FAED9ED4F1A45F6D5CCE17A60
-:10948000E22FFF46E742589B62473B65CEF6A55464
-:109490007F61F70CAAD7994321B4C76AA01ECB2BD2
-:1094A00046C7E6791B77F27890B47F611E7AD4D7ED
-:1094B000129C1123E2672DEAD730C55A95FBBD6B8C
-:1094C0009DCCE367A80FC7DA8B32AEBBD1CBEFEDF3
-:1094D000D9D8A6D0FD5D69465F7E36EE6B5C7C77A1
-:1094E0007F96760EF14EC6E71F4CD30E22DD3A8DE5
-:1094F0002C97F2F90CF25C5AECB9CF9EF2E48E761E
-:10950000E2C195F4A8A9A42FFD9579495F7A072FA8
-:10951000CD243DEA4ED2AFE4FBCBF3E40231F1FCC3
-:1095200059E29CEE2C714E17F97E288EEF4797ABCF
-:10953000A3F2E442DDE53B44E5C9457F179D2717CB
-:109540008AE18F9C9FA4EB17501CBD0EE866D1B03A
-:109550002EBCAE66E26F7DE4033A37B4C3447EBAF4
-:109560006A91C75B57758AEC9F3A3C87C4E95BE315
-:10957000E7E9B97E550D7625E5330763F37D95EC74
-:109580006F57FF96ED7AF2C7DBB2A59DC8E95BAED7
-:109590004BAEA3BA4DE1F41837CF787B3ADEAF2E4D
-:1095A000EDE1ABE573EE6F79DDD7CAE706C7C1E140
-:1095B0005FE57397C527FA46923CDF427CE223774A
-:1095C000731ABA28659E74D33E9E273D566FD37892
-:1095D0003C54CFF325E2E3C2EEB114F7947168F383
-:1095E000CBFAC0B27C6AEFC17CB49A7D8994BF503B
-:1095F000E5AE223D3E3E1E3A97B58EC5ADF82B3BFB
-:1096000042E7DEFEBB7908DFCF4E74129F72B3FCD7
-:109610006BCC43B83BFB1AE2A1076D9FA7F8A2F001
-:10962000A56C101804837ACE379B2BF63F41E4AB30
-:1096300098553F73447DDFD3770BB2B93FF1A0C893
-:10964000935A939840F737B88CFC9C874BC7F3B973
-:1096500086667A17E2FCCD6EBE9F4FECF901C373AC
-:109660007B4F1882749F82BFC6E641B928FD58B26D
-:10967000FF76E15FBD5A3A5AF93FCC3F1E957473AD
-:10968000B5F1BCF5008328FA8AA7879EBEEB89BF97
-:109690006CCFF63EC1F1421B427190ABE44B09C561
-:1096A000C0B751EEEF34B9D11E41BF0CC9DBD5199B
-:1096B000D29EE7F742ACC921B9F88985DB27F2DCF5
-:1096C000945CFF2EB9FE6F496FB4A47BF764437FAF
-:1096D000A74B353A27B12291CB97C8B33C1F29FE3F
-:1096E000FC50BC5C91E75FE478BFFBBFCC578F7D3B
-:1096F0004B7C15E42CE91D3DC67D2FFBDECFEFC171
-:1097000029EBD044FE0D9DFB90F3AAEBE0797C673A
-:10971000C5FCE4FB90D07306E7681F215E9D7FCFF8
-:109720006CC6B86A7131E79FB55E1BC5256A833C7C
-:109730005FA77631233F823C273CDBE5FB1CF76FBC
-:10974000C5711BDD5F5BBB7B6B536FCA67F091BE5E
-:1097500078E13DFE3EDDE5FB02DBD52D0EC7C43FC3
-:109760004ABEF97C794531CD97FC004E53ECF9ABFC
-:109770008C1CCE6FE4332D47C217EC1DF8EE7C1520
-:10978000CF3FAF736AF652CA63E0FEF5047707F97C
-:10979000956A77929060940C8BF53FCB26BCA9DD3F
-:1097A000595A44F736042D45740FD19FF8BD5DE733
-:1097B0001FC80CE8B93F3E2967049E3B09DC8A7A42
-:1097C0006B1E8C832AEEF9D65B8BC8DF1847779225
-:1097D000DE3ACFDDFED01C6850BAE8719D81CB49DE
-:1097E00029DFFE91EDE6F110A7C8476C9BC066DA51
-:1097F000BACA36676C9EE6CEAC9BFF81FBF38F6CDA
-:1098000055C4D179DC3EDF0CD66CEFCBF1305FC4B0
-:10981000ED27887C0BE63777E559F4BE72DC5ECE27
-:10982000AF93EF8BB87DC297E27722EC46C28BC430
-:1098300026CE3718E005EAEDA3231D63F0BC5BDFFD
-:1098400096D06884572F043F9EA361E19F0FC5788F
-:10985000488A3A1AE3215B160D3B80715A7565C739
-:1098600077716BDCCDF632345967BBBC37E4107FBF
-:10987000A92F44FC2FFBA381E747AE4C2079DF9250
-:109880005B4DF991178E9B62CE23C53FFD6C990B02
-:10989000FD50BD9BDEA67844E24EA5DBBCD79FE61B
-:1098A000D844FEE43217FAB5129B3AFC23D14FF3A9
-:1098B000B0C2EF0085D92B2EF427A83AD43B66EC32
-:1098C000E6E7E567343BCACCC44F151ECF19ED243B
-:1098D0003EA9AEBC4D87769FBA94D17D7BF373B819
-:1098E0005FBC5F8B5D87FBFEDBAFF5DDC6E97C39D6
-:1098F0003A19573422B86A4C914398DA29E38B32EB
-:10990000CFAEA77BECA53C8AD7672FD363853CEA13
-:10991000D4E7E3F0B8A7EF247E4B7CFEAD81911E27
-:10992000F65BC54CE7DE245E37CAF3075F733F7111
-:109930009EC8DF39B5EABF86F07B02647C26C0EFA3
-:10994000713584976711BCC237FA71DD3B1DBADAF5
-:1099500041E45FABA57E56F27BF2F29AFA2C1B59DA
-:109960008C4F3B53600AA7F6CECB43BAF4031EF4E8
-:10997000EB060F6ECAE17952EACA04DA37752DDDBB
-:1099800010CE54471AED9BFA18DF9FEB73383C65F5
-:109990007C58FA4107E7F8D6603E70E739B545567E
-:1099A0007E4E4D9CAB4E5C74FC053CFFB545F8A368
-:1099B0000FBC3A907EDFE3D24A55413DF592A39227
-:1099C0007ECF6AA3D8D744B583D96DD1F87980F218
-:1099D000747BEFE3F986AA3837AEAE746E4578969D
-:1099E0003B7D948FFCDDC610FD04C6ABF6D314F7A7
-:1099F00003BD88CE079FDBA348BD28461E4ABB2D6A
-:109A0000DE1E7B51F2CDFF213D694F279FBE463BB5
-:109A10008BC5DA9B9DEDA5FD186F4FC47DDF93FECE
-:109A2000C3347F4CDECD11B1EF52BE670ADE28F39E
-:109A3000713ACF89B38005CF714C41A21CD1959763
-:109A4000C444BED27AC5EA417DA9A7BCA4CEBC213C
-:109A5000563F94FB37EBBF834F99D724F3962C984E
-:109A6000BF927279FE8A05F35752F07750F87973F6
-:109A7000997FD26070533E8BFF4146714965620504
-:109A8000F9FF92BD46C2BF8B2CB0017F07C03FD902
-:109A900046E7EAF19C13E27D447151BF632A34D951
-:109AA0005E87ED3BEF93AC64549FDC57CB403DCCDD
-:109AB00002F578CF75E739F399FCDEFDF8FC1599CE
-:109AC0004725E3CA99FD5F56D0CF8A6104CA67F87B
-:109AD000B1F82E9FF7D3F22337F18DB4069E2715E8
-:109AE000B99ED9D1CF5F26F98F39765FD729BE7C51
-:109AF000A4CF75567ECFC266E669D243B93DA7377B
-:109B0000EDE346E6DEAF2386DD4CBFDBF1BC53D38D
-:109B1000E7A676E1939C175BCFD77D11CFAD295D8A
-:109B2000E35D9CF3F75CD4AFCADA4C1C2FE3C6DFCD
-:109B3000D879CF4DC082F2C495CBF1C113A7EFCA3B
-:109B4000A72B5789C9FB93E3F7B43E899F57D2E30C
-:109B500025FEF5846FFE32B14F271248FF90F8764C
-:109B600060C90EBA4FB27D49909E172D4A508FE7BB
-:109B7000872D9169C81973F2B2EEC07B502E26462C
-:109B800072F11E95016EB717EF51B9981A3981E538
-:109B9000EB9FF8BE97EAFB45B6E0BD2A77E41DBB14
-:109BA00083EA713F33192BDA72E40EBF0DCFA9841B
-:109BB0009777A0DC2A8ECB8B89BBFF2141FC0E540A
-:109BC000BACD48FA64BA8813B272A1D763440BCAFB
-:109BD0000D19451417B431F7CE0EACCF36F17B22F8
-:109BE00018E03FD6F7CBE7F9158CAF9B650B7F37B5
-:109BF0000BFBE9771DF31DF47D271FDF6912F12EA2
-:109C00003EFED197785C52E6093366CF417DC8E6C7
-:109C1000663165797F0A53ED39785F4283F4278A8C
-:109C2000F22B09BE49B95172F9E8CD3F1944BF2F53
-:109C3000F3F2CFFA22DFBCC5187B3FB77C26BB39D5
-:109C40009FBC28EEA1BC2FC17777EE08FC7D9969F7
-:109C500063F14AE12929A54607E96FCFEA914FA5AB
-:109C60000AFC704CE6F373947B15FC5D17790F6466
-:109C7000AA4F253F01F3B5E851AEA69EF652FE610C
-:109C8000B539928BBFBFF396D95785F3BC5479F29F
-:109C90007E8A3F661E3D81F922470DCD6392508E2C
-:109CA000E48B7B3830C00BE5435979640F76F2873B
-:109CB0007E0AC547C74FE6E771C7B1A08AFB3CD60D
-:109CC000CECF878D2DCEF734C078E345BEC9D8639B
-:109CD000DE24E46F637F1056F93D2111353ABF430E
-:109CE0003E99CBE08EA6875BDD516586F755C7961A
-:109CF000BFE7892DDF31F2EBFED1E5C18AD680EBDB
-:109D00007C4511F76D007FE1EBE2798CBF12F6DC48
-:109D1000401733E7619EA553F1A3BD30705726C5A8
-:109D20006D768D64544EDB61DE668E5EFF5A1D8F4C
-:109D30006B0BBFBAFC7D2AAC4379FBF27B6904AFA5
-:109D4000341BF05B27711FC2B703826E0F083A2DD8
-:109D5000C9325B91FF1F30B837119E279ADDE8A703
-:109D6000DA9F68A4FB7F1BE6F3DFB75092CCCC08E8
-:109D7000FDEAA7F332B4633742BDBEC44CF92907EC
-:109D800044DE77C3832AF9B9B01EEF41D43F622580
-:109D90007F797952E1DD58AF4F32D2B98BFD8925F9
-:109DA0003E311EFD2EC1F64473087F2723FE1ED6CA
-:109DB000A3382F841BCCEB293E0FA2477D8991F459
-:109DC00070793E1FFAA1789E3ED34CE31D70D8F700
-:109DD00023DE357C449A1ED48F74633E99C4EFF21F
-:109DE000A491F4BB33407D7DA3EFD9D7A779DCFCE8
-:109DF0001C30FF3D95C2CEDF578161A11DBAD51938
-:109E0000D12D8F0FE648B83355C3F6194C96F9F9A2
-:109E1000B5B4CE72A94AF72D29B2BC94CA8F8B7AF9
-:109E2000796F6C6A1EE7534ADBEB7F43BCED9B0402
-:109E300070817DF224747F7EEAB4E0EF97EF5F8952
-:109E40000BFDFE0AAE7350D7FA0F383C2E6F54B993
-:109E50009B7D0920BEC5EFCB018BC78D7EB62BF74E
-:109E6000C7E12AD7A1CFE4F0EC5C474AF7EB48CD35
-:109E7000E3EB088A73E3F1F54A9EEEDB5E67B7F821
-:109E8000F72FAF332D769DDFE23CC3CAB7304F7D4D
-:109E90002ECCCFD6353FFAF9B812E49B1CFFC68909
-:109EA0007C6956189BE7C4467ACC5C5F8CCD6BBA54
-:109EB00045D9D488F2F57111377F5DD0D5A184FFE3
-:109EC000D517F5ADD7A715B413BFEDB5B411894BB0
-:109ED000F267C9FF2F659C2CC132C88101792067C8
-:109EE000EEEF7D741A76DEEE78BC2FCA2BE09BD79E
-:109EF000E58DB87C9E927E3BE70BF48B7424E937AA
-:109F00007EFE928ED8ED414A10DDCC42F474319E33
-:109F10008F0F7A09DD73CFDC395DEB03221F6BAE47
-:109F2000E7EB58EAA779DFE27894F2106FC9F7DD22
-:109F30009407FB3D65E8A774FF147355F6273B4D66
-:109F4000D1B4FF9BF3C58C7F7C2FF5FC78BDFE4A16
-:109F500079E9729EF1FC50CE4799B883F4F83AD073
-:109F6000E379DEBA42FCBEAE4AC7F9F06E85F4FA78
-:109F70005A903328A7E4BDCC3715581BF19ECDBDB0
-:109F800006EE4FF5BF6472C7DE4B159FBF2EEC89FE
-:109F9000C54CDA0BFC7E8B1A3BBF774AC89996FBFF
-:109FA0007ACB7BA9B83C043915732F55A53BF65ED7
-:109FB000AA1EEC05B00B483F63BD74C22EE072BA16
-:109FC000E57AB7DDCFC8FFCC7F2774AA51E88300BC
-:109FD0008BB4AE7BF3C00EA0FB001BF3F2C5BD64D7
-:109FE00001FEBB2C42FF8FF74717A5FB56209ECCE6
-:109FF0001CA4E5E24F04CD30727F33E0DBA60E8671
-:10A000006998F5DBF15ED95B59FD3BBA3E846F0F71
-:10A0100013BE0DFC94DF37DB856F8FE4A572B98426
-:10A0200042E64A741C71FA1EC7715B1CC13FE13DD8
-:10A03000F81BDB4C046F99E71A4FDF51F3396DE0E1
-:10A04000F371EAF5349F27BA9BCFD5E07D345EA546
-:10A05000338EDF3DE13F9E27491CD685FF8315DF08
-:10A060008B386E271D2CE776D765F3D6DB68BFEFFC
-:10A070009CCAE3727509D24ED6C667A4A11F928FFF
-:10A080007FE74A8E177756F2BCA4096D35148763B3
-:10A09000E53CAEE681FFD1EFFC08FE36D9596440BD
-:10A0A000D4FB2BBBDB807ECEC9E363E36F53CCB71D
-:10A0B00050BCEFCEC98698DF39957098227E477DD7
-:10A0C0004ADCEF9BC6C3253E6ED7C90FC47AB3F0F6
-:10A0D000777FE099CDF8399E0CF17B7447F33AE332
-:10A0E0007BFDAF31BE772CEF1AE27BED8608DD3BBE
-:10A0F000F15AEAEC4DF3816EFAFF7210DDDB7F73EB
-:10A10000DA9CED6BA1FCCCC6EBA8FC5ADA0F171E4B
-:10A11000C5FA2D05542ED77D3A0DE9A0B064EA3872
-:10A12000FC9D83760BEFC765F5B5E0EFDFB886F4ED
-:10A130001E86F9C8E5C608B5BB6D68CD70CCAF2AE0
-:10A14000B7F2F291A2FF1846E5DEA23CEC95EBB027
-:10A15000DCAE7C3AADBBF8E0C0422584BF73579EAD
-:10A16000CCDB8F1FF66C26FA8BCACB7879A0A7744C
-:10A17000651FACD77D36AD3B7DC428EC21A95F7B44
-:10A1800005BDEFD24E36E2B944AF4DF1E0F913EF21
-:10A19000C893FC3E3A33CF53F93F722300BD008091
-:10A1A000000000001F8B080000000000000BE57D90
-:10A1B00009789445D270BFF3CE9564924C0E20215D
-:10A1C000102609840492300987288703048C0A38F2
-:10A1D0005C028AF08633E42011748DBBEC6620802B
-:10A1E000E8A28615151574404070118302A206BEC0
-:10A1F000E1505151E3B1AEE82E7FA2ACDC1283AE48
-:10A20000B8EBAE7F55757766DE37C902FBFDDFF32D
-:10A21000ECF7FCF8EC76FAEDABBAAABAAABABABA7D
-:10A22000C7EBC935CFCA626CB847F1F8211DE158B8
-:10A230009268EFC7D858CDDA4F5518733A5296390D
-:10A24000E3198B1E38AC3F7341B99D59582A6337C7
-:10A25000A468E1AE0E8C4DB9E6DBE4289531E62822
-:10A26000ECE98D849405181BC0D838FC13EA8FB331
-:10A270003B026A0EFC9D6F39D790C1E8DFCFD03E1C
-:10A280005BF1385DFD31D725E6EBDE8C61173F5F72
-:10A290004FFD76C0EF53067D9B6CC68F09BCDF0B6C
-:10A2A00016C74A253AD8FF4DA27FE661DDE33B326F
-:10A2B000A688FC4D72BC0CFD78F84F817A9D98F809
-:10A2C000BBEEAD1F15ACB7A25661690005F351BADC
-:10A2D0009ED528084CB6A2A5E3FCACA67A177EEF63
-:10A2E000A6B87B39119E816EBB37BB35DC12BEAE82
-:10A2F00026F890D71A2EFC67867C1293FF14A7B31A
-:10A30000238ECBCBA19D87C506E182F107107E5637
-:10A310007078D62B1594624306ED1688760BE47C94
-:10A32000F7EAE73B209CF9C2008E04E65EA962BB17
-:10A33000F8DC5EFF0AEEF2F0A81CD687B18976EF52
-:10A34000833698C3A4985944E7C9CCB73B06E6FFC7
-:10A3500062845680F0A826DFBE0698D41CE6B1229F
-:10A360005E808E37723A72BA48B88CF86881D388AA
-:10A370001703DC463C04E9539F886922ABA07CCBE1
-:10A38000BC0CF3A9461E047E6DCAB5F937E22066FF
-:10A39000F81FF0F3D1C274FF034A10AEA30ACB300A
-:10A3A000433D9F12EEDE9CC2D80F61307FF81E2F16
-:10A3B000F03068E62FC6B2A8D6F056DA79BD7BC277
-:10A3C000A336627A7D7AF8325334B64FF663FDF8DD
-:10A3D00070487382F0FF60629A1DE0BD47AD25FAB8
-:10A3E00075614D4BCC29413E7BD80593EE8F7C297E
-:10A3F000E7E353904E569332C3EB8039E1BFEB83D2
-:10A40000E9C32E4068078E2F3BC0354370D38C06BE
-:10A41000A55141785D290E5C2F33EC6AC096D39A22
-:10A420005F704676A0D3CCCBF00FAB799C61BBE1DB
-:10A43000765E6F26F68FF5168FF484D69B89E3E05F
-:10A44000B82BE1BB3DF85D01BC27C5B6A60FCC8F8C
-:10A45000E01F5339C27B220EF06515F4BA3792E83B
-:10A4600035E6DE61F45D199FA134C0FC4714B828BD
-:10A470008DEDF7A1996513DDA6D46605E9A876D41C
-:10A480009EC275CACC0DFDC7C1BCDFEBFF5CAE063A
-:10A49000E5C74DAC08EB19F1F75C107F57B48EDAC5
-:10A4A00083FFF508EF36E4FBF34AFD002CCCEFEC1C
-:10A4B000243A32A6A520FD629C29C36210DF3FC169
-:10A4C000B880EF8958047CB0A7A3B613E19DCCBC3B
-:10A4D00023CD30DFD802CDA239683813C2B3D0C93A
-:10A4E000E119A93A886F9BB72B7E1BD4CBF7643E4A
-:10A4F0003E18F2E5472CCC0FE5CD8CF375F33AD539
-:10A50000EF037E9AF7F6CB036005B2AF041FF75C4A
-:10A510006B622E490FF85FA63F9CB93282F9DE5B71
-:10A520006375F9ECDACEBAFA7DF6A6EACA7303BD12
-:10A5300074E57D8FE4E9F2FDEBAFD3D5BFE6B3E17F
-:10A54000BAFCB50D37E9EA0F3A355E971FD2749B16
-:10A55000AE7E7518ACAF3E886E4F7D06E065B6A046
-:10A56000D3F59766EADA9D8D1A7504D7DDEC55F3BD
-:10A5700046E3BA1BC64A74FDB01ACB97C89715F0CC
-:10A580001FD2732EF34607005F2359D39B4980BF28
-:10A59000057EC58D789BB796D793EDE6EFBD7378B2
-:10A5A0000CA67EFDF712660EE6A19FCA3F6D78E706
-:10A5B000704879BEB3D084FC77DE1519FF7504228C
-:10A5C000825DF3B3DA267DDD01A4DF27AADB069FD7
-:10A5D00016BEADD23A58F882E267D06F3AEB118DD1
-:10A5E000F9F2232AF303FD4FB28AC70643FA4395D3
-:10A5F000FF9DC33D82F8B125E8E91CE6D2D339229C
-:10A60000434FE748B79ECED103F5748EF1E8E91CBD
-:10A6100057A0A77307AF9ECE9DA6E8E99CA8E9E9DD
-:10A620009C54A4A773D70A3D9DBB55EAE999E22B38
-:10A63000D6D3CF407F299FD3562ED4D56BE1036F5D
-:10A64000D1684C7BD4FC52D76F895A6A65A6203FEB
-:10A65000F8E03FE4879E8CB90380E705408780AB34
-:10A66000351F14D5AD5E91F46FF041760AD0BF77F7
-:10A6700008FDD569D15A1BF25CA692AEA04FFBA68D
-:10A68000F4273B6800A6537A821D04728379DBB6F7
-:10A6900083A4FC0AB53BCC0382FAAA3DB9D64ACFC3
-:10A6A0008E95FAA91D3DEBEA1A94838090638CDBAA
-:10A6B000018CAD32211C53055F1F0CE77C79118B97
-:10A6C000AE857A506720C0750CE186718E85F73EA5
-:10A6D0008CEBF436566BC1FEA7B17A4AA7B3264A73
-:10A6E00035E624BB622673533A9B79297DCFAE4D64
-:10A6F0004901B9596A6F188076C95F0B3F3CAE209B
-:10A700003047E310D876F12AE5F5C7F827D47B3037
-:10A71000C5AB215EF3EDAEBB1E854F07514FA0FCCC
-:10A720001D1D47F032B3377B7C765BFD2C25F9FE8F
-:10A73000BAA26928777D8976F766985BEF24664F21
-:10A74000443D97E04F1D0FF4294FD1EB975E8227D0
-:10A750005EE85CBB10ED28C6FCB1A81FAE76DC5FDE
-:10A76000A5787E8170CBFA979BAFD55A7B27C2D94B
-:10A7700054E6706F04FEFC44D0E3D95B6D01352ACA
-:10A78000C8479F454C7FB303D0EDEE086D19F1DB50
-:10A79000E41B57605E3918E75A08F05D28047C73A3
-:10A7A000FCAFC4F252BBD6AD234CF17C57AD67343D
-:10A7B000E2DFCBF10F7F647BDB849FC33342E1E3B5
-:10A7C000BF1EA1ADC67E0E9AEA93DD880F73FD0011
-:10A7D000B24B1D1DA89FF3568E97F6F0303CA2EBAE
-:10A7E000349CD76C9BCD8DFB93E10AA7EB89B819FC
-:10A7F000D3CBE1CF39266FC780AA83FB1982DB59FF
-:10A80000D82D11F8E6BC45C06DEF20F0EECAC27538
-:10A81000D51EDCD5D83FDA89BF56FC6827D23FC8A1
-:10A82000BFE28BF13F00799BE9E22713D07EC93666
-:10A83000B93742D1BA70E81AF8FD0381EFF516C8AE
-:10A84000C7D2F795F83D219CB74F78CCE4AF86F698
-:10A85000DEE1AF129D9E5DE0A0F91432971517D985
-:10A860002C615FFF65D8DFF735003DF6A5687B7189
-:10A870001E33E24CC99F101C5A6FB477D8E02BE30B
-:10A880007FB94EC73BF914E608BC4D601E5A77935A
-:10A890009866C1713FFAC6EA41F9F991902760FFC5
-:10A8A000D3F7A9CC4FE9ED2C40F5EF600D94FF30C4
-:10A8B00022A76B25C037EEF19E3D50BE86E0FD7DA0
-:10A8C000BE5EB519F19C5F4E7642BCAFE97045FCA7
-:10A8D0003B4EF00BACD74FB11F58AFFD725343D670
-:10A8E0004D3EE7176676F6F857EBA6BE99EB0B10D0
-:10A8F0008C8E4498FF0D828437784A484FA09D156E
-:10A900000FF8AF77A96467150C6B3423FC5BBEE5C9
-:10A9100072ECAD252CD207E56F0D5319D26BECDA32
-:10A9200051A7B1DD511688EF07F5475ED20E47C338
-:10A93000FCC7827C0789CC0ABA809E08D14B372598
-:10A94000ACCE473BE2A6EEFAEF37B31A15F1373A31
-:10A950004BAF57C6A25E91F560BC038887D8D6FA84
-:10A96000E547A95F7AB15E57A35F169A3C2C95EC38
-:10A97000549715F97EA69979DA5A6F937B2AC29E6D
-:10A98000E576CB2D62ECE6D117AD1760BE0353B56B
-:10A9900008EC67E198BF4C47790CFBACF7FAA21EB4
-:10A9A0007D5F650F40F99755807150AE27AAECCCBA
-:10A9B0000306CED7554ECA9FAA4AA0F44C958BD217
-:10A9C00073551954FE4D959BF25353BDF1D8EFCCFE
-:10A9D00095DF9AD18EBA2F4CD28FC3B148F0EF7D5C
-:10A9E000617C9FB52872D1678530EE225280A0AF7E
-:10A9F0006B6B46A1D955BCB7F64D4CE1BBEAC0F232
-:10AA0000D58A1BF5D39CC3DA0A649F79471BC6A27B
-:10AA1000D8E9FF87131D116F659714A6C1523AD06C
-:10AA2000C39386E39FAC1A48709DAEF2105C9EBA49
-:10AA3000C637E3A0FDD9AA02CA2F4CF566A6764018
-:10AA400075FBAD15DB8FD9DE684E82F2911EC58392
-:10AA5000EB7BA887F9FD40BFB516AE2FD682BE406E
-:10AA6000FE19963D7EFD5D0CE5B9D617C799143BDE
-:10AA70006B641CF2D5C04233D69BFC13D85C2941D1
-:10AA8000FEBEDC3A39BF5F21FC9CDF1F43F89078A3
-:10AA90002A13F43ABFA7F72D83A0DFFD6047AA0071
-:10AAA0005FF32513C1D7FC59B81F8D0463FB85BB29
-:10AAB000D33A3107CE131ADB30DFBB13033A9C7D48
-:10AAC000E19E04A44786623655825C381B5BFBD747
-:10AAD000CF51EEFD99CB3DC66ABF7E12E562970469
-:10AAE000F70390FBC602FB34DAD75444A05E5C60E7
-:10AAF000651ACF6BBD317F369CD1FE76C08EA4E146
-:10AB0000B89E703C57CFA05C4BDFF178EAAF5CC1D8
-:10AB1000F96E79E189E6D75C58EE27BEDCB6637D35
-:10AB2000E7A72057BA737938C2F53ADA19B04E5E02
-:10AB30005F1D41F2EB758BFB7825CAEDF50EF766CC
-:10AB4000A8F7DC43F77EB917D307CBF2EE45FE48F2
-:10AB50008DA57E66FF6E7E2F6C0F7A9C25C2BC7E13
-:10AB6000FF8A120843FFCB9A034B1361BC3EEB1ADA
-:10AB70004D9D21CDDDA45463DABB6BC111D49F156B
-:10AB8000A92E6ADF777B8A8AF661AFCEFECFAF2728
-:10AB9000FDAED7FB596BBE1DDE9905F57F2FA5F6DF
-:10ABA000CC12A0EF7D5D3FCDE3FBBE1AEA6777DDF7
-:10ABB000848F6F67380FB02C10EE422BF92570BAD6
-:10ABC00016C89FDF95B601FD177B4CBE0DA48F669E
-:10ABD00072FBE3BCD7F704F24D19D4F741BE2CD772
-:10ABE00017751D9497FDB9BB1B3884757DFA8602D5
-:10ABF000C4C7825D8F8EEA0CF5CE0F666E05402FBE
-:10AC0000DA7D7114B6635DC156C67E765577BC0D8C
-:10AC1000DAFD366B787FE413AF5A4BE3B0723ECE69
-:10AC2000E3428FB1861CF20B904A817ABF85CFF840
-:10AC30003DB62EE600F76D71FA94D72D4941FF4AD3
-:10AC40003FCDEE56711DA4F8122B1C41BD08FAEC45
-:10AC500077B87E12ADA25FE78464EF55E833ABD0DE
-:10AC60004FB2BFC7ADCC1716CBED6005F5AD95EB78
-:10AC7000E1CD202F905FA51E867137A6F2F664FF06
-:10AC80002681D2CD0538931EB7F949D75FE1F84642
-:10AC9000BF99B443A6C455EF6B40FF4E84B603C7BB
-:10ACA000917E326676BBD0CE5916E1793195ECA80B
-:10ACB000A6649C03E8C997B1DE0215ECAAB410BBE8
-:10ACC000CA7E657AF2C508CFABD8FE4AEB1BE5E831
-:10ACD000A2EF4D2C17F860D1A336DA77560BFF415F
-:10ACE000B5F06755470EB0E3FA67874DA56F82FE52
-:10ACF0001CC27B68E97751641EC9876AC6DAC4DB67
-:10AD00007E58D71AC89100E8010DD6F7D04B4D2ACE
-:10AD1000E7FBFA43D1FD507E324FA40BF7F526A690
-:10AD200085E847633F40B76338CF612C8269217A59
-:10AD3000D0C362ACB87E9923F6DF9AFF60413F39F9
-:10AD40008FC1C27F37B8F9B30894838BBECF237904
-:10AD5000D8DEFCF689F9FD17CE0F526F4FEF39841C
-:10AD600073C8774E33CE7388795C32DA2D007F3327
-:10AD70007E1FFA9D490FFF4FE1BAFC95CEE36E8529
-:10AD8000F94CB83EBFB5FA717DD6017FE37AAE9B30
-:10AD90009FE54739B007D603FAF17DE3AD64B7D636
-:10ADA00009BF685D0727F98B5EB7F0BC6FAA681F03
-:10ADB000C6482FD44DED4CED3BDB2ADECDC6FEABB5
-:10ADC00023487ED659FC2B53B1FF5FC7B97D402F76
-:10ADD000D5FEECFA137D61FFE037F92CC82F96C041
-:10ADE000ED2AF6F7AD95E1786B620249E5507FCD2B
-:10ADF000FCCE54FF33308DD01F37C8649A31CE81DA
-:10AE0000E59EC458C8EFF9A74A7A604D2EE41D2488
-:10AE1000C7C9BFB7669C27313C1ED38E26824765C3
-:10AE200015F43D85B7FBDCC2EBDD26E8774CD00797
-:10AE3000D639C9016D6C8419F9F8DAB49959696485
-:10AE4000C778121580E7C9D93D18CAD1DB8A6F4C83
-:10AE500021BE117ECE298206B23F26FCA493F8675C
-:10AE60003675CEE630A4E7A4A230F2837E56B43421
-:10AE7000D205ED2769C2FF3951EF17BD36CD43E347
-:10AE800096D566A69D08E1EB9936901BD0FF43E16D
-:10AE90005ADF34E4C7BDB954BE178C959F615D7D00
-:10AEA00039BBC70EF253CC96FBC2C02CA4EBFE26D6
-:10AEB0003BC3FD467BFC508D74807EBB215DE2046C
-:10AEC000BF22FDA784F37D8B19F805F2D5B599B49F
-:10AED0006F79C6C23C0AD26BB78DE85F30DEEE21D7
-:10AEE0007FE294F00D36289F21E459F59470FA5EC4
-:10AEF000BD2FD26F52683F4479DF4E0BB52BB5FAA8
-:10AF0000B76D817E4AF76792BED96315E3BE16C15D
-:10AF1000CBA33C29CBFB617927E283D72DAE682AEE
-:10AF20007F5B65541E1E488F013CC6856913111F47
-:10AF30009D6D406707F6CBBF1F17FC751CBA45FA1D
-:10AF4000F92A22A95F5AFA90D7AABB6E447A6A56A8
-:10AF50005ECE7EA952F971A727710EE48F57241196
-:10AF60005CD26F74DC6B25BE3F5EAA90FDF3A74AEE
-:10AF700035600DF5DB8FDF7A7F3AB4FB6ABF85FC65
-:10AF800072D31E2E398ADFA72D2D23FFE2B4E2C52E
-:10AF9000742EF0CDE2AF06AC85F9342CFD22590BAE
-:10AFA000F1334F2B855621EBF937699E32E4832725
-:10AFB000D3B40A9C5F7956C35CB497BFB1D63F8DBA
-:10AFC000F67F7ABCB608BF5F78F5E4166E4737A502
-:10AFD000A39E5860E67C22F56DB9E0C35EDDB57BCB
-:10AFE000B13EE06D3AEA9588AC7A2EFF165F99FC87
-:10AFF0003F53B7798F02E39484D72DA054F5E760CF
-:10B000003F67954094924678D4705D9D7306A21078
-:10B01000FF9A89DB6D255BF5F3C27F789E55827FB1
-:10B0200040BB925AD51386EB80F9AD087F09B30671
-:10B03000EBA704E905FD10BD98E34FD37F05742805
-:10B04000DE969987FB859298BD0F0DA27AD04EAE01
-:10B0500017B5755ECEA7353C7C7EE7C43A38075FEE
-:10B060002CC82FDB6D72DF4EE37FF36A271ABFA374
-:10B070005827DF28825FB78571BE72C3BC10CE1718
-:10B08000395F3D26E5E436DE4F499CCF8472A9A4A2
-:10B09000CA497C25E512C042EBEBEC8E246A27E519
-:10B0A00018F33246F577246EE4F69BD8BF22C050E1
-:10B0B000BFF8F77C1CCCA33C3FF37C921C97EC6759
-:10B0C000A33E36CE7B7F9A89EC2DD0D39DFED5FE54
-:10B0D0002F2361D6FAD97D43E613691572C19D30DD
-:10B0E0002E1BCF0BACBA7EBF89B4CEF038F0DC405B
-:10B0F000FF5DF6F74E1ADF1F7633D0B9B3DA74C0AE
-:10B1000086EBF059467AC308C787A2DDF3CFB7D0E4
-:10B110005515FE71E692FCE4E2F63CD1EF9855D26B
-:10B12000EFAE2490C72588ABD4201EF7E46A49A867
-:10B1300037BE11E73D7B62209F85F614A78BCC4B71
-:10B140007A18F972E9B1B94978BEF4CF34EEB73361
-:10B15000E27B09E015CBAB2DB05FC9C27DEB914717
-:10B160004EF408CEE7EB2A8F6776487EEEDA5C3B3A
-:10B17000AEC779EB72ED3343E851BDB5EF1117E07F
-:10B18000FDDC56B31BC57BB5D9FF10DAE9D55BD51D
-:10B190005AE42328B723BECF390EBE8FF5E6AE8B17
-:10B1A000C9433B5CB69FB776A46776081D7A6FD516
-:10B1B000D325BB569FEFB3579FB7776734BFAB6DAF
-:10B1C000971BD0E7FB1ED1E75913506F00DA039CA1
-:10B1D0006EAF0C741F7101DDBAF955377EEAE618BF
-:10B1E0003F610CDA11EB54770F28EFB6D87B33DAD6
-:10B1F00015A7D6CD7123D98B54DF825F014D8BBE4D
-:10B20000187504F5EA5956FBE918A0CBDCBAD556F7
-:10B21000B30BE7ADE7F73D26C1BFCF737FDC7CBF43
-:10B22000BEBCB55C5822FD1819A1FC65E40318F7F3
-:10B23000560F00545AF9F12328178A4603E3A31E38
-:10B24000AF5D6D45FBEFF2E3F8B87DE9F0B8101F94
-:10B25000850379D9759523D857B0EED8AA0F472121
-:10B26000DC85BF55C8FE287CB9E761E4AFC69D53B5
-:10B270006FA2F4D6029ABFF4FBCDAB530291907744
-:10B280000E74ED6D807673FCDC7F3173992D280F81
-:10B29000199E7B19E05813520EF0CFDB7BE0473C40
-:10B2A000172E5AA76F371FE434EA9FE24D3FDB4267
-:10B2B000BFCBFDE875751B549CF71C01BFD49FCC18
-:10B2C0003794CE1DAEE34DD809FC3FD03BBFEEA86E
-:10B2D0008DEEDE3FA847AF5BC3DB83D82DC47997E3
-:10B2E00039AC2E9C77999D0522009E2391560FC65E
-:10B2F000955C5C1B497EB7B936B057F3286518B723
-:10B30000008298CEBFBEFE4025BBA72C8ED3BDECDD
-:10B310001985F66965E82CC5FCB33C3F9F05683E7E
-:10B32000C82F9ED079FAF57956C3F777A5E6C00104
-:10B33000C44B316BE0FB33A0A727E4FCBA14E6F959
-:10B34000592CDA6F86F6CCADD1B99C83DB63E57BF3
-:10B350007FB68596CB7DA6DC074B7FF033E9DE70A8
-:10B360001CC722ECE635F77BD211DEE5164F3AE238
-:10B37000C1B73A8CF6FBB76DE0FA6B4D0CD8B1F162
-:10B38000643F933D7E9BC2ED733695CBC341A69738
-:10B3900002A86F9A1E8D716F74517DD2636B1ECCA3
-:10B3A000E4F6FF3F55B2879A56F3388835B91C7FCB
-:10B3B0006B1ECCE6F6BFD47B1D18F5D7DADEF6A4FB
-:10B3C000A31F823DC2E1FA1CA714625FE776D21E7A
-:10B3D000E81E323F6997B3A22B3B9FD82CE2329AEA
-:10B3E0005687F9F17CE284E27DD31462DF3ED59D7D
-:10B3F000EB8901C33D5B443D3AC7986D1AF7C0F530
-:10B4000000D7ECC74C2EF4A7B5E0DBE34947FD7944
-:10B410006275581EF2D980E1DCBF743C97CBFD8881
-:10B420007E8CE29B36897E377537E9D28470E03FA7
-:10B43000E8E7C448EEDF8EECE725BFDE661797FB32
-:10B44000C679D48A7E665BBDEF0C69031E891796A8
-:10B45000CFED8E13772A1B395C406FC80FF85D184B
-:10B46000F9034F08BD24F10B7C43710C526EC5B437
-:10B47000F08B7F5B18F0CB6A0BE703B96F0BE1171A
-:10B4800041FFAE44DFDB047DD98361825F4CEC6F0A
-:10B4900088C7914ECE0F57B9FF027A1F417A1BF72A
-:10B4A0006192DECCECEFFFAFCE51CA5E79618F0FB7
-:10B4B000EC8CE2171F8D6250EFB4B9A6A31BDA978C
-:10B4C0006E5E1EE581F494D917E584F14FFBD50239
-:10B4D0007F1BF8B6F690FE688F430939F73CF3FC02
-:10B4E0006FC7E23CFFBAD9E2449150BED546FBB1EA
-:10B4F00005BBE693BD0EF9469EBFEF5B3C072DDF13
-:10B50000ABF7B7173FF7684717E1DB97644AC034DA
-:10B5100090C4205DB0C9D2722E0CC380FDDDB40290
-:10B52000E133B647382E01BDCB6BD5426B74EBF2DD
-:10B5300072215FCA77FDF65BF41B96EFBAF124CA5D
-:10B54000FB72839FBF489C7718FDFC7FEDAE3F47A1
-:10B5500006FC50DC800FE0EA41ECC2FDC4D5DB1EE6
-:10B56000CF6944FB61D3BB514A56D0DF2FCF419AFC
-:10B570006B673D83FED3F6D6E537C2DF1BA41B976E
-:10B580005FAEBD0A0F9AABE369A925103508F77BBA
-:10B590001B2C64FF96BEF0EC962791CF8ED948BF46
-:10B5A00097BCF0C6A7D7A1FDBCD3123F9A4FC3A149
-:10B5B00084C4D994BBB83F4ED2A7F8E537ACAE6C83
-:10B5C000FE7D716C904E253B0F5831DEC788CF1140
-:10B5D000B507AC0D8E36E855DB388AFC50DB7EB003
-:10B5E000E2FA38BD5F619D525AB72FDAF04614DA9D
-:10B5F000678827D44F926E2D7434D487FEC7BED689
-:10B600008FEA39719F72393A7E2AECACB2572259CF
-:10B610000CC051F4B9CD3F1AE9BB635114CEE7A475
-:10B62000B982F3FDFAE51DD1DE2BB2F83A3A29E5ED
-:10B63000DF8B9EBE9BF8719E52D1D19945FC9E68CE
-:10B64000225BC29788F39CB36E12CD732ED3881FF2
-:10B650008BD6AB5E3FA4DF9B59C1CE36D6CD52B15F
-:10B660006E4E6E04E2C23C4F8A782BDF47AAD84761
-:10B67000DF49FAFC6E3167C61652FE7B61CF4DEC96
-:10B68000D1729E6D0FDD87966FBAAF1EE974A6ABBF
-:10B69000A713C20978F009BC293F43BFEA87233BBF
-:10B6A000713A3117C623503BD0AB23F03BD6AFB72E
-:10B6B00078D0CF1ED24EEC13F9F87789F101EE70F5
-:10B6C000DC079FECD8763CD7CE16B9C0EA43E3B985
-:10B6D000DA95039BEE27FEFAEE132E6716F8C715D0
-:10B6E0005079BD25D009CBFD07262A24276C2CD004
-:10B6F000D63ADF6411EB5C5F0E709A9550FCEEE772
-:10B70000F6A9E497B960970542EC8420FF5883DFDF
-:10B7100069FEBF13F86EA0F33979AE374FC807E35F
-:10B72000FC8DF262718FB6E34ED8BAB6CF938272B7
-:10B73000C247E396827E477BA4F4988DEC88D217AB
-:10B740002C5EC4D3D9ED873EBD0DF7B7B5725DEB66
-:10B75000E5B0715D17BDD4BFCD757D76556EDBEB61
-:10B760001ABEB7B9AE572924EFFEBB7218341FF9C1
-:10B77000252EB77EE7B523879F33E0F57B96153DF1
-:10B78000080B9D85DD884E06FC4ABC1AE5EA1014BC
-:10B79000921D5ACB5586211A21F8947894FCCA98A8
-:10B7A00046E3B4F0B5E45BC9D72D7C6B9CB71E9F14
-:10B7B000C6F2F9487B80C7FBAA85EC85D23A1E6F9A
-:10B7C00008ED283EAE1CFDF354BBE6CDA4F8D0BC7A
-:10B7D000DF90AF35D4F718F25E437DCD90AFD0D572
-:10B7E0002FDD7BC8CAF70F015D3D5BE5CDB41F6956
-:10B7F0006D67F8F9B9D3AE6FAD3EE48F2E4D569418
-:10B800009396A5CC1709ED9BF6A964F75C703545B6
-:10B81000A1DDB23C8CDB75179C221FC3F34D1DAC20
-:10B820002B504ECAEF4D61DC0F73C1DB141513B200
-:10B830009F6FAC53A3D0FFDBE067056DC7AB54131C
-:10B840005E1B587BE5DCBEBB10CEFD0D17C2B9BF39
-:10B8500061A4EA48AE443F6C0D8F0B9CBD6472142A
-:10B86000C555D4A5DD3205BECF795BE561E03E8FDD
-:10B8700019E319667152B253CC47F181B3EA785C8F
-:10B88000C3EC557A3ACF756CA2F8B7EFD9624AE7A4
-:10B89000AED1C72314B355C46745EB0CDFEB6EA6DE
-:10B8A00075526C58279AF00F1BD789235DC43DE66B
-:10B8B000B25C5DDCA390E723D5AC5BA6003D2E1CFB
-:10B8C00051990DF2CD752A5BD18FC7B9E2F9136E8C
-:10B8D0004870FD2D80F58A7693C4D7395C473DDBEF
-:10B8E000B75FCEEDFEF3805F21DFECF92207CF8555
-:10B8F000CFED3996FE3AE65FF963F217AC75FD11AC
-:10B90000FB7F9C8E72FAC27E1B437EBFB0FFAD648C
-:10B91000F4475E78CD46FBEC0B4B6DDCCFBD3FD2E0
-:10B920008F2AE642576E1757EFFB21A781F4F232B8
-:10B93000A2DF35E9566E5FD5FDFD38FAD39BEB608B
-:10B940005628F7F747D07A2A7F2D8CFCCC17F6FDC6
-:10B950003020D43FF7DF9D8F3C4FBF10C9A6BC8479
-:10B960007C1CC3F705E5AF5FFB2C9E2F97ED3A607B
-:10B970009D05E523FEEB1F3928572FBCC4EDA96FA9
-:10B980002C0D4FA38F73F896A8472C89E8E783CE38
-:10B990003A33F6C596B1137C596DE185E3E102E0D7
-:10B9A00001E7057829427DD01E3EA6223E3AFC27BB
-:10B9B000E2E3DBE95CBE5DC3F03C3A8817C5C3BF78
-:10B9C00047FAED0ACD9F7FDFFF430ECA9FCBCDF72D
-:10B9D0009EFFCFE6FBE87FEC7C39BF774D77119C6B
-:10B9E00046BE6FCDD7AFFC82F23B22DD04EF15AE31
-:10B9F000F7DDFFB1EBFD7F86DE1FFFC7CEF772F4E8
-:10BA00007E5BD03BD289E79917F6FD23995DC5BCD3
-:10BA10009BFF97CE5BDAF1C355F7915CA8FF2EAB85
-:10BA2000FDC49D42D6489B7648B7609C1FED9F465B
-:10BA300030AEA747D84BC8FE1CD1E541B297AB59F1
-:10BA40001E9D5FF8BAA874AE4341208087B712727A
-:10BA5000E95E153307BA2C82FCF0A4328AFF32EE7D
-:10BA60002B47848F2940FBF4D012800BFA391469DC
-:10BA700072E219757E177E4F09D2464CDF4CBE9993
-:10BA8000E2F8F31DFAFDD5CD867DD28D2E7D7901AC
-:10BA90007B291ECFED0AB22C745F6214D60FD957E2
-:10BAA000FE23DD4978B991D52C733AAE1E4FB70805
-:10BAB0003CB5C6C3BFC65B2B3C897DB459D437E2C5
-:10BAC000CDEC78A01EDB9919EC8BF97C693F2DF742
-:10BAD000C597C32713FB6DB3185AE2D7DC859FCFF8
-:10BAE00086F44B789178BF5A7C4B3A19F12EF12BA2
-:10BAF000F166A4432AC6F8F50FE2BF8B39D78CEB69
-:10BB00006E88B0EBF3CD313CDFA55EF5D27AF473ED
-:10BB10003EFFCE6D46BB7E982386E2428DF71166CE
-:10BB20000E8C19A0C07C93CCCC67837D289EBD91E0
-:10BB3000DFF57EB37F690A8EC3FDBB5DCDDC7F0D73
-:10BB4000ABDB179E47F53D56C8173E328F79A07E76
-:10BB50006112732BBC3E8B8EA5F038A6C6F27B9B80
-:10BB6000D8AE309AF75BD889F997727A125DD0ED2A
-:10BB700083FE0DE8D7638AE5EDA3F2A8BDCFC4DB51
-:10BB80007BCC90764BE3710A4DCBB95FBEF0BEAE75
-:10BB9000E9283F460FD7FB99DFEAC9FDD232ED9B7A
-:10BBA000E1227CA9267702DD8F589649FB2335DCFC
-:10BBB0005BB61BFDF43B789C4EE18A3BC6F447F82C
-:10BBC00076C4B911BC3363770EE0F5A7DEFD07F844
-:10BBD000AE6D0DA3EF9333B4A53D311E40714DDF23
-:10BBE0000D1F664E3A644D8021B4DA71E7D14F38AB
-:10BBF000D6B7F37D3C9F1C3B51A5FA63198FF764C0
-:10BC0000CB601C281FE3FBD69C00FD8D814D079661
-:10BC100037863993EF04F80B857FF8215C2F086F86
-:10BC200038D35E72205C5DD353E1FB18D676BCF14D
-:10BC300051597FB8B20ECF99BA8DE0FE7B591FFBE8
-:10BC4000C17E3FEAC9FD514F8854E601AF547FF6EB
-:10BC50004A5B631AEE7F565A023D2175F41ABEBE46
-:10BC600027E06F742A1BB516F17EAFCA3612BC4DA1
-:10BC70008574AE1099E1423A68C0D274BE5293E224
-:10BC800042BF58E3B0DA009E27343E91E2AE76110F
-:10BC900095291E48EEB71A8705BAA31FBF29979F9B
-:10BCA0004B1C773644E27E7196C3CEEF498AB8A228
-:10BCB00039E25E4CB7EA8607AFC17DE8A32A9DD77B
-:10BCC000CC7994DFF7FA8BC3EE5770DFB646DCD73A
-:10BCD0005CA58F23624E37F98166D50CB3E27E7383
-:10BCE000B6C363C579FE31437B1DE725EF17F642E6
-:10BCF00022409785358514AFA246C1BAC3756276D6
-:10BD000045E13ED81887542EE28E64FEA170ED30D6
-:10BD1000F2C3CC68D70EE4972F2BD3C83FAA0ABE34
-:10BD20001B8D7195789E616E484478EEEEE922BED7
-:10BD30001C1DEB4C77103F8731C443A3C5998EFC83
-:10BD4000DDB83CCC84E772A39772BE867566374334
-:10BD5000FBFBCD2C1CCF197E27DA4F5B62F66E8081
-:10BD60007C173B3347C6225FE5125FDFD24B7B0275
-:10BD7000E777EAD76C20F2C3AC55ABE93C46F20555
-:10BD800033D7E7C7C138A736A7E4A1DC6C91D3BD90
-:10BD9000867F81ED5AF861A2427C00E98134E28716
-:10BDA000F10D38CFD1C303DD1766E17EB49479502D
-:10BDB000BF273037DA09CDAC89CE2B9B1D5617FA39
-:10BDC000BFA43C917203E8EAC17BB7920FB680BE74
-:10BDD000375B18DB5A65A7F4F92A2733F7606C7BC9
-:10BDE0005502E57754B928ADADCAA0EF2F55B92952
-:10BDF000BFAB6A20E5F7547928BFB7AA80D2D7AA8B
-:10BE0000BCF45DCA25C00BC9212957A43C9AE5B0F2
-:10BE1000D27D5F29978C7C331DD03B348FDA93DC45
-:10BE200093F20EE761CA0BCA2349DF54C5EB4B48B6
-:10BE30004139D63015E93F523DF7C22BB82F2F724A
-:10BE4000B8699FCEB8DC6B067E45BC245BD95EF436
-:10BE5000CB56DFE969BC2F2588FFDB8B14660EE12A
-:10BE6000AB3B2AC29839446FCCA88CD1E5A7557E4C
-:10BE7000FC4627E8FF9E0E5A7C06C071FC375FAF78
-:10BE8000FF237C7FE637677A20BD018ECD8FE3B834
-:10BE90008BC35BE088C5FC320B9D737513FE936EFC
-:10BEA000C27F82FF903EF27EF333BFF91BADF3C633
-:10BEB0004A9B0BEDE2CF915E80DF3F097ACDACB4B7
-:10BEC000111E0B977FF5C22BB8DE175B49DECD5CE8
-:10BED00026D6A3E15EF397898CFC126055B34AC065
-:10BEE000DF97BFB60622A0FF2F15BE8E15300EA617
-:10BEF00061FCE1CAB73E4339A0541EA1F3770DEFB0
-:10BF0000E1217C3ECB39DD3DE9CA37A91E6BE81241
-:10BF1000837E1379CF38A29FC7EA82F9236F23FD6E
-:10BF200066661C648978CE52A338D185385B7C9FC5
-:10BF3000BD92BFDB80713C13C1FE1B92A1123D2B51
-:10BF40007B9A29FD14F52DF9936B484F49BE9DBD91
-:10BF50000ADAE1FAA8C9B5CE0D91C733C5F7591968
-:10BF6000264AE5F731D82F9EFFADCC9D82764567F6
-:10BF70002CCFC2346F0AE2B7B363945909E1831B33
-:10BF800032CC020E46ED3EC54507E90319A9D63964
-:10BF90005974BF8FF4981C676646DE0A8C2F9DB9D2
-:10BFA0006A184A61566D7127C4433D6F4B3FDC7E72
-:10BFB00063761E475DDA8E1E917EB553F8E7B53481
-:10BFC0006FF2FB16EFF8FD8ED7A0E7E22F6C44DF8F
-:10BFD000E23E226E2BCB3F60023920F5FEECFCDF07
-:10BFE000FF398ACE2976F1F84E48B99F757111F75D
-:10BFF000CBBA617DB5715E7478C717516DFAB177B0
-:10C00000A957E4C72E577E8A423B42CE67E4BEEF73
-:10C010003B121CCA253A272ADFB7BC635B715E4618
-:10C020003F768BBF5BF8F5CA1717B4E9EF36FAEF26
-:10C03000966518CE0FCC8CEE8D49FF1D53B3A2F13F
-:10C040001CE07B719FA4BD7D8EF47F97AF854EE28F
-:10C0500060BD9A5DD178BE75A11DFBFA6806D7FF59
-:10C06000E785BFFCC27695F63D17B647D2BA5AB0FF
-:10C07000FD9137F1DC71C12685C02863F5843FC08E
-:10C080002BB387EA358C638B6B0D77B3BF4734EAEC
-:10C090009592DF475620BFCDAF553C9B019E66BBB6
-:10C0A0002BBA43083C5B91DF807F4A6CB50308DF05
-:10C0B00002FEA7514EF60FD69B5FF708F997A1DE57
-:10C0C000376417BD1881B10288F7F711CEB3EBFAC8
-:10C0D000BAF1BC707EEDCE0564576C8F70A25FE143
-:10C0E0008C885B96FDEC12FCBD2B83DB3167C5F9B8
-:10C0F000D1D91DFC5E3FC289EBEC8CC2FDD0B2DD14
-:10C100006B02CED732F8BEE48E0CBECE65FDF9B51B
-:10C110008D51DDA1FEC9BD1F537A58D49FEFA8CF22
-:10C12000417D7C7257049D7F9DDCF5D4A8D761BC0E
-:10C13000F3B5C3E2715DC8FE3FCAB050FDF3EBD466
-:10C1400002C417F3F3B89932C46FDF5038E336F8FE
-:10C150005242D71F8F1F3ABBEBE5285356909E657E
-:10C16000F60A7BA209D7D19D5EE4EF68641E80D7F2
-:10C17000BA6B9C0F7558795D2E43BEA6F59748F5AE
-:10C18000579A42EAD92C6E8A33B5EC2DF48837548D
-:10C19000F83D2711C73F52CDA273C5E97D5C936F6F
-:10C1A0004739F9AE85E8B130D33519E5D3C57A956D
-:10C1B000219C0B535800ED9345F7466E403D26E118
-:10C1C0009EDE97CB83D2950AF3C0FC4AFD2AD3208A
-:10C1D000ED0CF4F7213F2534F4C738C9C6146E5767
-:10C1E000C8F8D1278B4C1E2BE8C19F3262E5FB0FAC
-:10C1F0004FCCC1F3B3F119B49F3B6E653E15FD4AB8
-:10C200002FF1F8D2D2541ED7FCA488872F8D0DA40D
-:10C21000C7417FE7047D4BC707D231EEA2F4A544A6
-:10C220008ABB3867E5E79EF81DCF594BF3A0BD8365
-:10C23000DECDD064FB98107E2A9DE976613D35D62F
-:10C24000EDCA7520BCCE6FC8CEDD1DC9D0CE35BDC0
-:10C2500012C9E3A69E0BDB680BA19B3393F39F7C73
-:10C260008F83DDC6E38C1EB3F0B8D4C73627FAFD42
-:10C2700021F87ACCA24D453CE03CD0BE9F6FAD4941
-:10C2800047FB57C23B3FAA86E03C27F87D7E780DEE
-:10C290008FE716F77BB13EE61B451C7AD3361BC5EC
-:10C2A000019D49ACDF83E39FD996892FF200FCFE04
-:10C2B000B97BA91CEC4BA067F1F3B600CEE7F436CE
-:10C2C000EE8F3E6DE1F6DAE971092EA46FC1F8B583
-:10C2D000D3C95FB3C9A6A09FEFB4C2AC0958BEB919
-:10C2E00003C59F17575552FC7631880DBC3F046932
-:10C2F00001DE033ABD3993E2CD4EE33B0C0A7D5F8C
-:10C3000089DF355633FD97888FAD7C7F75E6F9BFA1
-:10C310006786C67BCBB478933EBE4EF2892CCFCDD8
-:10C32000E4F22D57E0B97F267F2FA42CA2F6B1545A
-:10C330009A27C73BD089BF5BC31A229FEA87F114B3
-:10C340003D1494234FB240FA53E877D8CAF75F6799
-:10C35000B65B286EBDF895480FC5B1DD778D89E2D3
-:10C3600029546EA7179B007D902ABFD94AF165F129
-:10C37000CF87E5D9C83E67B4CF6DDAAC8A71C026E5
-:10C38000C6796FE171C7A3D196A4F26C2A3F2DF252
-:10C39000A7F76493DD07FD7BF07E55F12F7FC5F194
-:10C3A00038A1E828B7BBEC246F4B5BCE790647A3D6
-:10C3B0001E2CBB6F5034DE3F641FA80CED16239E6D
-:10C3C0002E9ADD9D50CE2ECB147277CF7A3A9F2ACB
-:10C3D00011F7084A9E57F83934AC43BC9F59B262F2
-:10C3E000D0E3C49FEF5B580F98CFB9DA47A242E978
-:10C3F000B12093CBD396FA5637D52F81FAD84FC9AF
-:10C400008A77A3089E2D168A5731D2F18ADB3FAF77
-:10C410005E51FB16FEA8E57E9656F367F5BFF8025F
-:10C42000FAFF6E7B98DB475F6BE91EDC594BED5CD6
-:10C430009CFFD917C2486E9D8DE1F2E124C8535F7D
-:10C440004F84E3E68729BEEBA309747F6F9E5FDF0D
-:10C45000AF1C77512697E36571EE688C172CFB8033
-:10C46000CB41A0CB2DD4FE030BB537CE63BC68D730
-:10C47000B23E5F88207E38DB99D3E5EC8E9EA49F88
-:10C480001A63389F03BCC978DFEFEC0B3D73E91EDC
-:10C490001D1A3DC00FC562FF7B36A636D91952DE84
-:10C4A0006811FBB800D444BEC13620DF8B2BB9BD68
-:10C4B00055625F45F12518AF3B208FD2802DB675B0
-:10C4C000DC2DF02BED2FDFC9147E4C1CAFA388139D
-:10C4D000273BA8D68A725B13F662E97663DC2E2FBF
-:10C4E000DF26DB03B4F1324E18F9D0A7509C4AC9BD
-:10C4F000B23BE753FC7DC5EADB719D49F84BCCAC00
-:10C5000000F7698D8A4A703486B119E3D1AE0C1DEB
-:10C5100027C49EDB151C87E1FB5FA5F807ACD9BDDE
-:10C52000992EFA8EF91AE8AF7499B28AC64991FB2E
-:10C530005D3E2F8927408715E3041B8789F276E645
-:10C540002DE134CEBBC5EECAE4FEA5C614D7C38325
-:10C5500091CEEFA9749FF7E24F7DA363DBB0D38246
-:10C560007ADE1A8C9705F88F6532EA677D26B7D395
-:10C570004B301E17E04C5FA78F17CFD8A4CFF7DA48
-:10C58000AECF67EDD2E773EAF479F7617DFE8018EC
-:10C5900017F7E1787F18F7E198E23EDC65E3FB707E
-:10C5A000CCE33E1C53DC87E377DC87631EF7E1981E
-:10C5B000C77D38E625BE713F8E79DC8F6379782F91
-:10C5C0008EA752116F8974407E67AF86E9EE235DB6
-:10C5D000D8C7EF97001FF07533D54AEBE649AC4159
-:10C5E000FB11EE77EA3CC1EEC2F8E15571DA7799BA
-:10C5F000FDF11E4AFD8A44A49BB981E258CB5FE35A
-:10C6000071ACA579610EF47F342C3FB902C343B5F8
-:10C6100038ED47AC7FC1D2B405F15B567988EEDFC7
-:10C62000372C717D703DA71FF96158512CD9518568
-:10C63000A8E762DBA7A3319E9CADD2C78F1BE3C9DD
-:10C640008D71E4463E90F6DF3396A64494EB5F6D21
-:10C65000B3AF42F8BF0A13F761A6D80DF1000E92EE
-:10C66000270B1F5436A2BEEEDC8BDB51CD47C05EDC
-:10C670006F43CFCA74D6A5BE6497B7E45729268AFC
-:10C680004FD73CA4871609989295A6C6FB50CECDED
-:10C690003791DEBC08F61AD9839FA8643FE03B5966
-:10C6A000A1F3C177B242F90BDFC9D2DF97E8ACAB97
-:10C6B0008FEF64E9EF4BF4D2C7E74F5C7200F7FDF0
-:10C6C0001356F5D5D59BED1D64C0A3805BD8B3B3DD
-:10C6D000417F78D0BE5CBC3619E9BB687E73E37DD0
-:10C6E00040DF45BBC3DC585E84FF0772B108FAC463
-:10C6F0007B9745BBC4FDE54ABD1E9E25F45091992C
-:10C70000F99CB1413E2C72324F0CB49FDFAB3E0717
-:10C71000DFC39AFFF6C7039CA9B8CF18D609E55125
-:10C72000B2C54371B5A53B7BC42C817E7BF7D06E2F
-:10C73000EC05EBFA44CDA187A6A13EDCC9F77F5FEB
-:10C74000AD7A398AE2CB04BF255B9CE148F70D3511
-:10C750003CBE0EFD676A6C902F36D4C48577770493
-:10C76000E71BE4839F884E401FEEE7293A48E72203
-:10C77000CDB562BEC3141FDAD9727EF21D2DB68C00
-:10C78000F77397C89F10FB0D39CF739907725C78C8
-:10C79000AFA36A6FB28AF2DCB47D0BEE43FE69D3BD
-:10C7A00066F7EA8FF1A03DFE88EFAA15FF81CFE77B
-:10C7B0002F6B46445D8BF6E70B16F768C8DF57F31F
-:10C7C000AC15F715C566BF95E233B76DB062BCF224
-:10C7D0000D5B37D0F7B95B0B291E731EABA0FDE8CC
-:10C7E00029F9EE81C047D170659D13E07E47C88F5F
-:10C7F000A2707EBE07F6D11BF8EEC8C5AD4A2EC6A4
-:10C80000F94CF4EEB416C2F75F8B7AC675D27C741D
-:10C81000C2C80E840F7E0FE40F0C76F769ADD7C542
-:10C82000844B29B42E265EEA4DFBB449814CBE1FD1
-:10C83000CE32EC878FAADC9F57C7D7419135103F86
-:10C8400001D7C97E0BD9B96566FE6E5319FC7D1DF3
-:10C85000A4DEC1AA8E5FCBF32374FC3C85C5EAEE4F
-:10C86000D3DC8A412521F989A3D374F5274FEC6DD8
-:10C87000E0FFBC6039C991EB74F7FECA16FB5CF4AB
-:10C88000BE211BAEFFCE787C21BD086A0FFD3E3E67
-:10C89000580FF97B93C2F73DBB6236A21FB0C8C4E4
-:10C8A000F74F5334FE7DC15EFE9D4D61BA75D82DA4
-:10C8B000CDFD47AE172D746E20FDED53F0EF36F031
-:10C8C0000F9AA2E51E3BDEE347FF84EE7EB7382FCA
-:10C8D00044B8910E65C29F5496C1FD4965BE7A2B3E
-:10C8E000BE9300F837C7C5523D7B1CC655D628E419
-:10C8F0006FC47431C559EAE3B4B03F8C7F5C7044B7
-:10C900002DC475622C2FC2778790BEAFF1B8D405C5
-:10C91000E8178A6AFDDED902F413A17FCBF0BE9935
-:10C92000A3B74BF811FD2B3A231E472BB9746F7335
-:10C93000FB012BC6E74D9C18938BEBC7C86752BE13
-:10C94000C3BAA6B8C2E6A38788CF9A8BCCC4C797D0
-:10C95000C3C7020FF7B31AF96F2EABB7E2FD94B954
-:10C96000BB1437EE4BB11EE2A533F2A5012F71B116
-:10C97000ADF121F1D4823743F93CC6F1356FAFE216
-:10C9800047F9D80A4F027F46F8DBC39F9CD75C4D1E
-:10C990001B857242CE6F1ECE03C78179E038F2DC70
-:10C9A000820D34AED734F25F2DF0F2385B237F8CEA
-:10C9B000BFC4FD32B75E32533A71B47E7D623B5CD8
-:10C9C00027932E75A4F2ABE59F050027EA85ABE51A
-:10C9D0001B391F298F83EB84DF4BB8DCBB4546FF37
-:10C9E00064426FE19FECCFFAEBE29B85BC35B63732
-:10C9F000C6374BFBC0A8770A234D146FD9EC4825E6
-:10CA0000BB43CA5F4DE8156DF9F7544F837A1C1A82
-:10CA10008F4E0F69C24FB8303295DE91485E12D703
-:10CA200011E95518E6A4B8FEC2252AC55117423DA2
-:10CA30005788DDB262595A32EA912FEFEFF9B40FFD
-:10CA4000ECF92FEF8DEF3810C6F96AB925DEEE0A42
-:10CA5000D6FB72F9C8648CEFF86AB56D8ABF0D7C9D
-:10CA60000DEFCDFD0A65BFF98CF4DC79D3D1A8298F
-:10CA7000D0BE74F9EE28BC3E50B29CEBF7F7BA6B0F
-:10CA8000C37AD3B9EF862DF49EB173430EFA89BDF4
-:10CA90001CA72D7645F1F2919DD0EE28FDE7A1A7C8
-:10CAA0009D782F7C89A523DAA5A73F013DA9909EFB
-:10CAB000237BE254187441E77091F49ED92985795B
-:10CAC000F03CEA9CE9C05FEFC3FD626E6D7A40C145
-:10CAD000C353CDDB1BF7F7CB9F257BA6F88125E958
-:10CAE000F8AEA0B6A447745BFE14996E11FA1CED63
-:10CAF0007A4CD1AEC7F81AB4EB318F763DA668D721
-:10CB0000E3F7F2B57ABB706A4F2EB7A4DFB95B7555
-:10CB1000532E9EFBF986B38C0AD2C30E7A07789106
-:10CB200012EE46F9B4086D28CCFF3982FC0EEC9366
-:10CB30001B757496EF04CB7780873481AD16B24EA7
-:10CB4000AEBF6467A1F77487B1185D7E843D51570D
-:10CB50007FA43345577E4342A6AEFC4657AE2E7F98
-:10CB600073C6B5BAFA63DCC374F95B06DEA8AB3FE3
-:10CB7000CE334E979F503055577F92B750573E79DE
-:10CB8000CA7C5DF954ED4E5DFEF6A27B75F5EFA80B
-:10CB900058A22B97EF22D7E17ECC86EFBFD82995FC
-:10CBA000EF23DFA3327A5F6DF00813F733DAB83E74
-:10CBB0005AF45E0F47281F3C29F8F95296E751E4D2
-:10CBC00057F9BEA57CB7722BEAA3FE788E1950F8F0
-:10CBD0007EB83E11F9D858CF583E38E2E04517D01C
-:10CBE0003266FBA94966901783AF39D8370DF253E7
-:10CBF000B7E7DC4AF941075F4E857C61D6DDB79A1D
-:10CC0000415E0DEE73F022969FDDDE97974F6064D4
-:10CC10009A94657D3209E365075F9FBACACDFD2806
-:10CC20006DDE779729E203EF89233E300D001F6305
-:10CC30007A10F818D3C3C0C7B32D8CBD097C8CE91A
-:10CC400011D89FE2F777607F8AE951D89F62FA3E58
-:10CC5000EC4B31AD877D29A61F554DA1F4932A8D4C
-:10CC6000DA7D5A5544E9675515F4FDF3AA4A4AFF9F
-:10CC700054E5A3EF877B4BFF4340F77E687BEF844F
-:10CC8000CA734E79AE595DC11A22506E349863BE94
-:10CC9000B607CF2BDBF71398D9D721F65AB6E2F9AE
-:10CCA000A0378DDFC54971E2E2FB1D29DA2748E78D
-:10CCB0003FA44CE8D157453D56F10686DAFCC1D475
-:10CCC000F67B905B7B733BF9DD2CCF31EC6F889D5D
-:10CCD000DF4F1E62E7F78F8798EBAB91BFAA7F64A7
-:10CCE0002E8CFF3910C9DFFDA8BEDFEC473FA872CC
-:10CCF00089AFF3A1F18CF2D53F36D07DE5214E7797
-:10CD000002EA2B996F39F7C77F21713EF21C5EC68C
-:10CD1000F7E45FAA1F81F6C25087D5857224346E6E
-:10CD200000CFDB0F447E2DE161389E3CDFDFF42332
-:10CD30000B987282E7F843ECF529E837187A97DD0B
-:10CD40001D1AB724CFEB954B0D2AFA55657C921C22
-:10CD500047C21B6986FEF282F147439CB5B978DE73
-:10CD6000515DE6A0FE3AC1776B1ED5F3A8D4AE366E
-:10CD700017FD72434B1D14072BE3043A8979433D99
-:10CD80009A67FE258DE224868A3809ECC7CECB7DD2
-:10CD9000D8CFD0F84022C6810DADE0EF90AD57F866
-:10CDA000FBF3326E01EB4784AC5B8413FBEDFE3783
-:10CDB0008017ED288F87F03B41EEEB5C222FCF1DD3
-:10CDC000EDC3C9BF3542C89A8F53B4CE59786FC5E9
-:10CDD000E6FC7304ADEFB4AEE8371D27ECFA7FC173
-:10CDE0002FDDB0DD7F9F5F3C9CDEF8807F4A6BBE0D
-:10CDF000917491746E8F8F24DD43E2CC88CE2D71B7
-:10CE000063A21F237FB5C757929F86D839DD91AEA5
-:10CE100018A726F948B9C4DF751B5A6A277D27F978
-:10CE2000C8C807ADF988F365F5DD76EAAF351F05AB
-:10CE3000E98FF8F8F7F9A841C5F3ABABE59F194DB9
-:10CE40006C5434143D94AA6D45395278C9F526E6E0
-:10CE500067B161A390A564F9E358DEBF75B9F65DCB
-:10CE600093253A84CF86083EDBDF4E7FB29E7CF767
-:10CE700042F67FBC9DFAEF0ABBE1DD3019A7E271F3
-:10CE8000E40E08C68D2E1AC9F9AB204525BB6344B4
-:10CE9000167FCF9C39B89DED82FF501EDFC4B4C30E
-:10CEA000D129F8EEA897DE1B1D156F786F54D8E7CF
-:10CEB000058673FE9BB26E20FBFCA6CBBC5BBD2C33
-:10CEC0004BDCDF49612957F9AEE86FB3687F78A57D
-:10CED000EF8AF2F768F3C57A4F12FC94E652D9E074
-:10CEE000587C9F5D33A372398CEFD1E6E0BBAD3E39
-:10CEF000CADFC8FC94DECC0264478C014584F95B30
-:10CF000018A37BFB8722C64EC33B8723FA8EE88E8D
-:10CF1000DF43DED9F3237C0B54EDFF3843DED93BEE
-:10CF200098EFA2FBAB07ED696487E27AB584F84B12
-:10CF3000DF06FDDC1DE67708F437A66F80FEEE0EF7
-:10CF40007AF42DD0DF98BF296309C376A35CFAB8C1
-:10CF500027D9FE66E708D8A8B58FBF9B735EED8220
-:10CF6000F87D37A6673EF2C5BB31D7E4E37CDF8DA1
-:10CF7000E964E2A9CD4A69F62BDDDBB293E57A08D4
-:10CF80008E378AC633E257E2D3884789DF7F039F13
-:10CF9000EFB485CFADB88FC0FB21F68FA31252F14D
-:10CFA0007C93CBD9B28864F1BEE87B396A2AC6FB90
-:10CFB0000E223887565ECBCC78DE6EE7783A59C5BC
-:10CFC0007C88DFD3380574781BFC7BCC3CDC141ADE
-:10CFD00007FD8A4DFB13C271729D4AF7F5CFBF144E
-:10CFE000467EBB537EEE975C68D21AB3D06FAFBA61
-:10CFF00056B9D1DE7C57253F30FBE950F2F8C8AB7B
-:10D00000E0D74DFC9D8352FBA836E929F797CFA5C1
-:10D010007A68FD33C3EF4B74B1F1F720E4BB94970A
-:10D02000FBDD962E362EAF257DD759851D00FD0CD4
-:10D0300000399BF47038EDB7F674F4FC88F3837D07
-:10D040000CBD3FD5DC2592F4D34111173734D09B6A
-:10D05000DE5B2B10BF23F096789FFDA08897FB7BAB
-:10D06000BA66CE0678DF721DEC82FE87EB193F07A9
-:10D07000BAD1C1DFC3BFDAFDB9235BECCF7358CEA1
-:10D0800055FDEE410795EE530C65E9740E3F02E144
-:10D090004539F7F62C33EAC990DF3DA079FD6FFBE7
-:10D0A000DD03C69A549C579253614FA65CFDEF2056
-:10D0B000A8625F257F0FA18017B5FA1D84A7A20A79
-:10D0C000785CBE636E9BBF839024DEA9662EAE376C
-:10D0D000E4EF208C4CD0EB9111CE61879D94EAFD5A
-:10D0E0003C4997891F1B9D2DF4C7D5D2BF8C11FDDC
-:10D0F0005BE24CE379FCD350ADD7C3E89F1F116FBF
-:10D1000071FB5DADF9E03FED774EDAA393F1F74F98
-:10D110008C7432FE1E4A925A6AA67720059DA6C0DC
-:10D120007F48A7EBC5EF55E4E3EF55B0FF7774AB4D
-:10D1300036D0ED7BB6AA3FBE5B7AA190CBF5F6F474
-:10D14000FE0D299EFBB341FE3C2AFC47D23F22E361
-:10D15000728DBF9724FD00325ED7379CD3DB773CBE
-:10D1600082CEAFEE511B2251CF1C37F1DF471AD8C8
-:10D17000417B1CE5D38CAC0A05F191C0BC3BE702B6
-:10D18000FCD3FFCB968CF9E9DDF87B912C8BFFFE6D
-:10D190008F846F7A128FE77A265BE17E3F378FDFCD
-:10D1A000DA98CDF701916E27C599176631113FCBFB
-:10D1B00092A767237F1E0DEB89FCB786FB031BF04C
-:10D1C000BDCAF8E07B9568A7A35DDC55D8A5D5C797
-:10D1D000EC76CE874CA7FF33FD765D9C73EFAD4EAA
-:10D1E0005D3EBB364157BFCF5E97AE3C3790A12B1B
-:10D1F000EF7BC4ADCBF7AF1FA8AB7FCD671E5DFE45
-:10D20000DA86025DFD41A7BCBA7C126B7A02F17B23
-:10D210002C3B95DF9F50849FC4C5E931FD9E8E74E1
-:10D220005F49EE3F64DCBB26F8D9B8AFE966E57626
-:10D230007D7522E3FB56BBD89F32FDFE461371EB92
-:10D24000D2AE673E7DDCBA8C576FD907897D8EDC04
-:10D250004F84C4AB7B107E19AFDE4277F17EA8917C
-:10D260005FBF167437CEA39B95DFAFABBED74AF72F
-:10D2700084247C46B8D40CCEDF9BED6DBF07F55DF2
-:10D2800036B713F2BB7BCF21BF3E0DE28AF0D96ADD
-:10D290003C7703FE9E40F5AFADEEA5AECB8F37BD1C
-:10D2A0000F9FCF347C37378BDE5FA57B81725C7339
-:10D2B0000E1FF75C1FC1E786F1A647F3F838166D1D
-:10D2C000A57B2DED8FC7F19A6065CBE8DD2A71CF84
-:10D2D000E38E55B50FA20B759AB5C6C21F1EF05B43
-:10D2E000D08F367A38D889B9E85F7DF85107D86988
-:10D2F0004F579AC92F1691639FECEB1EBCB7D30D05
-:10D30000F669C827A391FED0EF923E3C3E3D0B6DDF
-:10D310009F0EE47F6FB96F61D3C97F46F2BF0DBE28
-:10D32000237E94F3F89FBA7F21F9D78827B92F6716
-:10D3300042AF75177049FCC97521F127EFBFB8EEF0
-:10D34000B478373AE81E4D01C6E549FAADE9C3FDA8
-:10D350009CD3053EB01ECAA3F6EA8D54B3A2F1BC1D
-:10D36000A099B9A29D97F19BFF0FDD4B21FCB777E8
-:10D370009FAE3D39D14A3EB473BFAE3DFEA47F5748
-:10D3800071CF2E444EF07829410F7F7713C525DCED
-:10D3900017A95FC70FE570FCE689F504FADB91ABCE
-:10D3A00097130CCF3FAA97AB424ECC6DF9FD10FC02
-:10D3B0003E67B985EC6EC6BC8F619CC65FD658E8E7
-:10D3C0009DC7A11E46F6CDCC758A7F8312FCDDAECB
-:10D3D000429FE19D16F527B20FBF5FA538F1F71FF9
-:10D3E00066ADD497CF73F0DF1D99637CAF469EC7BF
-:10D3F0005D665F5F9523F4BB9BB9C92E137114451D
-:10D40000A28ED12E6BF6F3F346DC97ABDC8F45F1A1
-:10D410007752EFBBF0BC2BE41D16C06B7806EAF127
-:10D4200065E636E3225BF0DA4EDCC7398788FB70AD
-:10D43000F03897E65D61FC7C589EC389FAE77C175B
-:10D44000A91CEB636FE77379FC8A3C7F339EEF3551
-:10D450003B4C743ED5BC2B92E21CF0DC2B1AF8E15D
-:10D460008C6967C7812941F8B40655776E644CB55D
-:10D4700025BB693FF95E776D5B0EC6E99BDD7637AC
-:10D48000E4EF771CA477BC460B3F9811DE96DFF1E2
-:10D490001BCCDFD569F6717BB7B980BF7702F291FB
-:10D4A000E17A92F11CE3185877901606AE2578AE13
-:10D4B000F6FC6BC2A55C7EFE7B6910B5D7565E4B51
-:10D4C000F96ECB1EBC13EF194DAA9E67C150808622
-:10D4D00027168F0C87A60D5DFD4BC3916EC3943646
-:10D4E000CF2FDEC9E17AA5C1706F41A6D7F5E17AE9
-:10D4F0007532C6E6F40F89E75AA2D07A58A83019D7
-:10D50000DF45F25CE62FD688FC489E5FB49CE71BA3
-:10D51000C4EF2A6C11FE169C37A6386FF40B6C17FB
-:10D52000FE189C37A6386FFC8EF20BF328BF308FA5
-:10D53000F20BF328BF3045F985DF67326F72AECA50
-:10D54000CFEDF243D6079EDBE587D847786E179A72
-:10D55000C773BBD0FA786E175A8EE776A1E5786E5E
-:10D56000179AC773BBD0FA786E179A67036F0CE6E9
-:10D5700051DE79C6E9F213C0FECF0F59DF786E177E
-:10D58000DA3F9EDBE9FAD3EED4B5BF9D55EADAE384
-:10D59000B95D68FD19958AEE5C6F86788776D6DA74
-:10D5A00038E29F7D295E5B1FA0EFFF89F8E7DD165B
-:10D5B000DC2FAA75F3F9BE2DDCCDE95C53C0E96E12
-:10D5C000E2F72C94A6A944E7C5569E1FC9E3BC8D7B
-:10D5D000FC83E762F9167E2E86299E8B618AE762BC
-:10D5E00098E2B9587E0F7E2E86299E8BE1773C17F4
-:10D5F000C314CFC530C573314CF15C0C533C17C319
-:10D6000014CFC5B01D9E8B618AE762F81DCFC5306F
-:10D61000C57331FC7E1CCFE72C41B8D09EEFAEDB4A
-:10D6200057021FEAF6954E5D1EEDF9D0FA68CF87D6
-:10D6300096A33D1F5A8EF67C681EEDF9D0FA68CF8E
-:10D6400087E647E5B8687DA15D1FDA0EEDFAD07C6C
-:10D65000768DEF0DF49D8D59F7CD614C1B2295A76A
-:10D66000151019057DFC93F1FCB2214C498E01C9BE
-:10D670006959B279723EE435114799C39A4CF4FB6B
-:10D680007BB879C4388700A3B8D5EC1F13A97CAA4E
-:10D69000BC7F87FF80EEB9BB18FD1E8D3C5F97ED08
-:10D6A000DDCCA9622AEB07F36DD7338E2FEB91FC0B
-:10D6B0000C81036F5A63BC4FEE62471EC6CD6E11DC
-:10D6C000BF8FBB65298FB736F2D562612F6D31ED03
-:10D6D0003C88F7699A0A15BA779D6E66472C798857
-:10D6E000A78A3CB42366F789117AA9E23AFC1D3176
-:10D6F00009B7F483829CA0FB89839BEA4744433F9C
-:10D700009A6F18FD3ECE682BB71FB01DEE2B7BFB2A
-:10D7100014CFC610FE5E20EC71CDC7C77FEE99B165
-:10D72000BC5D386FF7DC335184C7B1CB148A3B1B27
-:10D73000BC9D79F01EF43D429EF6DE1E5071BCC2C7
-:10D74000657C3CD96FE1BA64BA175AC81AF2F15E27
-:10D750000BEBA73094DB126F30BFC338BF74582A6D
-:10D76000E8C7BED2FB5443FAC58CC4784456C7E818
-:10D770005DD131FD3ED4CD97C83E80FA25BDD6D3CC
-:10D78000A7D03BCE637D4B96225B8CF1DDF946073B
-:10D79000ACBF89B9535CA48AE8FEB184A79767A798
-:10D7A00009D422CB62F5A63005E9CD0EC585F00F70
-:10D7B000ACFC8948EF5CB785DE551E67765AE89D5C
-:10D7C0008E76E2752E3A64BC8EC15E30C4E5542F6D
-:10D7D000FE2C19FDCD0B234DE43759B83B82EC06E6
-:10D7E0006DAD42724DDA418522DEEFE2B2373A4C3E
-:10D7F00046BCEFB4507F325EA72CCD9F6CC2FB09B4
-:10D800009D37E4C4AA64073C8FF2F0ACEFE55B07F8
-:10D8100062BDE5FC5DD18BCB76F3DF1915E73BF2FA
-:10D82000774B678BF8AFC26C6F34C6C3C8DF4793C2
-:10D83000F764E4EF924A3F4FE17B7DDF44FA16AE96
-:10D8400017EF7EAF2CA4FBEFC6B8AB1261FFCD5F24
-:10D8500066A1B8ADF906FBB044C4655DEEF74A0FAA
-:10D86000F531D887F27772441DA676F914FDC2F21D
-:10D87000DEE7340B9703D376323AAF9AB664840965
-:10D88000DFAB66BB39FF4C5BC2ED9C69AF7AE8FE4B
-:10D89000A6B41B3F10F6CCF84B4984FF8F85FD32B0
-:10D8A00009E35501CFA31BC2441C5B22A5932FF1B2
-:10D8B000F8D5F10E2E0F1AF6F177379A7D366E579E
-:10D8C0001D66FCDD38037F8E33FB4D78A1D13D18FA
-:10D8D000F813F263D01E82FEA6A07D1487FC9E3250
-:10D8E00092E2210B14BA4764E4F7D1968A3730DE0E
-:10D8F00076F466E6F6B1507E073EC6FE7C0ABDC7EA
-:10D90000A0897DAEE46323DF4F8F10FE2907F73F28
-:10D91000B5F829D056C547D47D7F9B8CF1C4D3D1AF
-:10D9200067D899A6E1C1B8BDC82C5EFE8F17FF3637
-:10D9300079196E7ADAF15BA8BFB4123E34F9EE447D
-:10D940003B7E04F41FA0BCBCE3AE5CEBCC1079F9C9
-:10D950007F018165E5A90080000000001F8B0800A1
-:10D9600000000000000BED7D0B7854D5B5F03E7340
-:10D9700066269364122621901048980422A906383E
-:10D980007941401E87C82358B40349143009C33B6A
-:10D99000A878236A0DBDB499908001C11B340AA2F6
-:10D9A000E880CAA5966AB4DE0A4ABD838855EB03AF
-:10D9B0008354EF6F1B86A7A0B546B8D6F67E5EFDF2
-:10D9C000D75A7BEFCC9C9399006AFFFF7EF76BF8E8
-:10D9D00074679FB39F6BAFF75AFBE4ADFCD28CFC2E
-:10D9E0007E0C7F2CAC3F630B5CF43B9BA2E6A50650
-:10D9F000F3185BB12E27953919FB067F26F62C17F5
-:10DA0000FEF54AE6EECB584D9FE01D8AC6D8208D24
-:10DA1000E993D3189B83838CA5A1022C97B1B9A25B
-:10DA20003E5D1BF2410B8C5713CFEB69ED8ED93E57
-:10DA3000A82F7704A7AAF0E89FF2EACA065818EBC5
-:10DA4000A3BA198375C5D8BCFAC02CC66C7BF20387
-:10DA500003E1919AEBA2E7CC1A1CE04960AC7A434F
-:10DA6000FBC6616E1C17FE57CC5895BDD5C67020FD
-:10DA7000E6B77986C3FAF298EE77627BF8AF88B1A1
-:10DA8000E3EB9E7F6ABD125AFF711B9BDD1E617F17
-:10DA900093340BCDB3B38131F730C6763538A87CDB
-:10DAA000B2C1C5DC318CED6E48A3FA530D6E2ADB92
-:10DAB0001B72E9F9B30D1AD59F6B28A1FAAF1B743D
-:10DAC000AAEF6928A3F285060F3DDF3FD05BA0C116
-:10DAD0007A1FB0E8C7EE82FDA5ABAD8C0D8135B6DF
-:10DAE0006E66780E8B700B6E829FEE18C598971F2E
-:10DAF0000B1B6CD7ED2C85B1A6758A6B35F4F33A08
-:10DB0000EDC79444285B9440CC0868E09BA207735F
-:10DB100079DB6FB2115E1C8E2CB7EBC127A05F4D75
-:10DB2000839DAD87478F5EC6741CE7D19FD8FDBE2D
-:10DB30002C84DBA1838EAC101C3FACBFD7061881B0
-:10DB4000C797E3867673EB62B5F5F0FEAD7C4F19AF
-:10DB5000AE3B3E4FB37B016E19F98CC6BFAE9FE75B
-:10DB6000871A94CB37EC7FE47D3CC77D59762FE054
-:10DB7000CFFC3DF96BD3DCD8CFEBC17EF39D2EBB40
-:10DB800007FADDD29C6477231EA4B2BAF63C9CA7A8
-:10DB90002B73564208FEB59A42EBC82AE0E37F8613
-:10DBA000E744ED5A6D330DED2CD40EE0A63BFA8719
-:10DBB000E09461653E4B01C2CBCB7484D700A621B3
-:10DBC000BC06C2F39802FE3E3639043F33DCEC005B
-:10DBD000770BBC1F08A5BD2004C70C78AFC2735BD0
-:10DBE000EEF1392C1BE1C6E67922E0CF83B87E84C2
-:10DBF000FB6C07D1D562073F4FA0ABA9A980872B4B
-:10DC000036292E4003B6C8E9BE7E0CD417BD666324
-:10DC1000ABA13E23D96D1F00F52E38DF1D505F707C
-:10DC20007BBEDD0DFBAEC2B380752CDA3286E86DAB
-:10DC3000911FCAC2E87479C3A603197B117F02BA87
-:10DC40001DE964914BB727E785D16DAB427461AE96
-:10DC5000AFD3545A77156393117ED5B767D9173868
-:10DC6000B1FE9A6D451EEE8BC341F68376016C378B
-:10DC7000239BBD8AF4D505FBDA91C5E72B081B7FF2
-:10DC8000018E1F363FB49FE781FA7D5A028D37DF40
-:10DC900005FBCEC2D245EB0438109CBA36C2786E72
-:10DCA0009A87CE6361C06FD3703D569817EA735D53
-:10DCB0007E1BCEB3A039DF8E7CCABB81CFE36D491A
-:10DCC000B20F87FA7CABCB9E81F08B0358A4D0FABD
-:10DCD000FC3BE06816015C929D380F9B37CBD91353
-:10DCE0003EF3C57A17B526D9171B9E6FB2E17900AE
-:10DCF0007FD323F18D83E2DC17344FB233EC6FD541
-:10DD0000ED1AAE47C0F7D4ADB1EB591FE8DFB6D975
-:10DD10009605F57F13F87B50C07546762047C17D88
-:10DD2000DF1AABE13AE7B85A697FDDF0BD1FE001C9
-:10DD3000CF17BB3C045FC00B1F03382C6A339E67B0
-:10DD4000683D1CBE8BDAE613BD2DB17AEDAEF075E1
-:10DD50006CD99FA3005CE6007D2B007FE6F2662273
-:10DD6000BE9CBEFFFA4CDA27AC13E19AA0B9A7A675
-:10DD700015119E101E4B7CA929E4F42BE7FBA3662A
-:10DD8000A5F9FE28F86774BAD45F4D43BA84F35DF1
-:10DD9000ED8E4E977664DC30AF7D91E26F527AD291
-:10DDA000A9A44F4997924E25FD3E62F304D29410E8
-:10DDB0009FA9E9C3EA9E8D00A78C7C7E0E73C5B92E
-:10DDC000025C5F41B8CAF7F67CCE8FAAB28DF48EA2
-:10DDD000E3E1B8E704BFAA2A0DE4DC9A176A2FE74B
-:10DDE000AD4AE6FD10EF11DFCE8973C7F62BA8BD53
-:10DDF000E063825F2CECE617BBD7F4477EF18CA280
-:10DE000021BF58B1F140C69D00B715BF8CD7100691
-:10DE10009FDCFCC42D03B251BEF9E9DCE4BA16FF65
-:10DE2000359FF8C412219F170522F38BEB73BD6A4F
-:10DE30007E71A8BEE8BE5F5EE6E5FC2680FCE60FCC
-:10DE4000BF7CF1C85877489ECAFD2C6879D736DF69
-:10DE5000190E3FBEDFF5B9E7E6E3792D74DADD2A66
-:10DE60003C5AD83C9FF82F4B635A8E123A7F335E50
-:10DE7000CC6F5674EA573FCAAF7E8F7C7AE18699A1
-:10DE80000CE5943C379898B15121F92AD77F593E37
-:10DE9000A7DB1FE4F3FE73057ECFAD9D641F908268
-:10DEA000FB9D5F886AC51CF17CCE22E3F3EE7373A1
-:10DEB00075F3F9B5482FE7DAF9B99DDB6023FE73F6
-:10DEC0006E77829FC1FE3E59F1FCDBD741BB8F1FAD
-:10DED000D89E89FA4AF8B9B1427E6E582E8573638E
-:10DEE0007D239EDBD8F0735BFA283FB7854FBDF5E5
-:10DEF000C717DCB45FCEEF36C6F8911F2F687F8658
-:10DF0000CE714ECB265B16B4BB3A3F8BCEAB9BFF9C
-:10DF1000D7E5BB18C0776ECB761BF289AB251C4CBE
-:10DF2000F400A5CEC2E80CE592921CD2C7647BE453
-:10DF30008FCFC03CB7DF1A9BC84686E6B92D9FF34A
-:10DF400085857549C938DFC2BAF9F7B01121796002
-:10DF5000DEE789584E2F0B603CA4DB1393B4CC153D
-:10DF6000849F968872F74681870F01B863011F0668
-:10DF7000C6B7FF1CE130F09FE234E41F438706FD83
-:10DF8000382FE237AEDB0EFCD301ED86DE1CFC1C25
-:10DF9000D73114300CFB6199904C25EB0FF51DB077
-:10DFA000EC1228B3555EB6E6733D09DE07F03D4B33
-:10DFB0000916E3FE257E9BF1D7CE1E6FC9463E961D
-:10DFC000C2B42677085FE538125F253E47DB5FCB9A
-:10DFD00045EEEF441687A73D0EF6977C09FB0364D8
-:10DFE0002D490EED4BAE0F7478DD82FAE33F0FDF63
-:10DFF0008EFAF389462DB3CED9DB7EDBA6F48FB043
-:10E000005FF33E25DD2C72709A06BAE98376C7B9B4
-:10E01000D6217D50EE9C5040BE41BF13B7C65A700A
-:10E02000FD725FA897B318AE9763897A391BC6F55E
-:10E0300072ACA35E8E25EAE5F43C3F99CB23164CE7
-:10E04000403D13F401CE0F029C4E3AEB87D0BEE464
-:10E0500073A91774BA8209C961FCFB649D909B2C5B
-:10E06000B811E99BD50F614FC0549DAD27122C7993
-:10E07000889F7C7DB2DFEDB62EE2872CC1EE7E025A
-:10E08000482EFEF677A7A4C27C8BDBB2F215E857C8
-:10E090005D5FD8590FEFAB9B5335E41B8B9DEEB5FD
-:10E0A000281717FBB234948BF16DF9A7B7C0FBC5E5
-:10E0B000CD5768D8FE76857990BEA49DB08475FF53
-:10E0C000909DB054F0B5A5C82F015E4BEA0F0C75BA
-:10E0D00041FF255A6C3ECAF7A55BB89D30C3C25AB2
-:10E0E0001494C34D9EA9C8C7BA1E5434D437D9C39B
-:10E0F000C05F1D21FEFA7EAEE7B7C867D857807FA4
-:10E1000030FEE5288355DC57BB8EFB60A08F3CC1F9
-:10E1100070DD1ED2EBA70ABED1D9762CC19DC7E116
-:10E120008DFA3AF3EA16E4BB2B845C1B6CEF3A766B
-:10E1300017EA3309166D07E797EFB8719FAFAB2C5D
-:10E1400086E48D682FF8E9E09F953890BFAD48C808
-:10E150004E25BD6A8B4AFC51E24FAD58F3E2EDE526
-:10E16000FD116F16C37B94775BF121B0D0B56D576D
-:10E17000F547BC5AB469CA033E906399028E27AD35
-:10E18000C199783E67B6A72637A25EB8BCE93206C9
-:10E19000EF176DBF2B13CB33DB636723BF9FEC9A65
-:10E1A000393909F6BBE4E1A47C354C6EFC45D0E37B
-:10E1B0008DCBAF4A457BE0E6AF0F3CE2023B6E31D0
-:10E1C000C01AE1FE457BBCDF074D6E6ED893A902F5
-:10E1D0008D7D1DE3FD1CE1799365DF756390FF2B59
-:10E1E000FE9D03A8BD3BD5D58B9D7D1AED50C0E7A4
-:10E1F000E53FFB80C6F9D4F2E6B573A0FFCDCB7F37
-:10E200009588E3DC74FFE1512E78FED650EF7FA3B2
-:10E210003DFFB1B27DA70B05D396ED23506E7F8DE8
-:10E22000765A31E2B5E7BA3908F7D755827BB4F9A7
-:10E230006AF728045F59AFF6F7217DD61B60761781
-:10E24000962E46FAF21995D5A33E20F51AF93CA967
-:10E2500080C3E54C9FD64CC48B653B3767A25C39C5
-:10E260009BC0EB553BAF7F03F994F7F118AEB75B5A
-:10E2700019E9C90B7D5CEF66B540AF0342F30F2C83
-:10E2800088A7F1966D2934C843D04BE8F9592B2B58
-:10E29000C3750C6EEACA47FDEB436B60319EEB879A
-:10E2A000A0D7A27DFB17C1C73E6C55A7E2731F1014
-:10E2B00012EA231FB6FE2A61A833A4C72514B507A6
-:10E2C00090CF2D7F2EA940E52845F8754BB75FC448
-:10E2D0003975600AE9632EC4D3157B0F4E65BC0EF9
-:10E2E00082303A3C6F147A5877FDB967C8AEBB7973
-:10E2F00037D7276E6E7FE6D57418E7963D429F109C
-:10E300007ACA7241CFB73CC7E1B2FCB963F685E186
-:10E31000F6486EF2DA81A0094E78F6F2D9F7BBD151
-:10E32000DE56C8AF52A965CE691C8AA5F4977491D0
-:10E330007EB83EB783ECF2E5CD62BCDC8EB5D9B4D5
-:10E34000DF997DC3F5A1890536EA27FB033CA8DFE9
-:10E3500097B1892390FF0596C7B5A05CD76F715A16
-:10E36000B16C5AEE2439FF709D25D70AF0D5953847
-:10E370000DF5B87A076F7F675CE20E2CF7C5F1FAEE
-:10E3800097B19924A7BEB4789E5902EDEE540FC5FB
-:10E39000A2FF6300EB3A60817A493FEF7505306F69
-:10E3A0002A03EA51517E04147CFFD96F3E2AC475BA
-:10E3B0004C181C3CCF6069B6C6BC3993014F6A0A41
-:10E3C000C43EF3828588EFFD5EE6FC7A9B8DB5A0A6
-:10E3D000BC63560F9B05CF03C8BFF0FCFF66F1235B
-:10E3E0003FDEA7041E0BD7BFEE1378EB8971B6286A
-:10E3F000B0CEC7B3BC4B711D3F526CC35175616E3B
-:10E400003507C7FFCCC6DF4B3DB65430E10C618FFA
-:10E41000D9D3D39CB8BF26012F45D7593DAC6375DE
-:10E42000DECB0B115FEEEE72B01898BFB42B8EF4FA
-:10E43000DA8CF432926F4D022E8A3B05650E7B39E1
-:10E44000CFE28B81F5DECD1C7E6CCF1C26FDD71272
-:10E45000AB633F65DF6FFF86FC7EA0FAF9813ED09B
-:10E460007EE09D8AD6046D6ACE9DDEF60E43FBD912
-:10E470009F8FF0BBB39FB7B100F6D779AEEC98177A
-:10E48000CEFB6E57BB43CBE3E385EF63DFCABF250B
-:10E49000265B42EBFBACEBF42F9F2FC2D24172A85C
-:10E4A000749FCAFD4DA6F57C96E6B6D23975390241
-:10E4B000166CEFB4F81505DB1FF800D757EA7006A5
-:10E4C00054D4E31DB63F85CB19762823E9F41524EF
-:10E4D0005AD837A02CF46FE2E737A18FD1BEDC59B0
-:10E4E000C0EDA49DE29C247C25DC985B67E172E68C
-:10E4F00025E7CE6AEEC7E274FC4FE2F9B9BF669336
-:10E500007E716E1FE81911F44E591E463D03F487C3
-:10E510002FB3F5A7106E52CE564AA92BE4B02AC6E7
-:10E52000AD14F0AA745A387C2A4CF0117863C60BEB
-:10E53000F3B9CBF3643F3974B04F169DE3F07F61BC
-:10E54000747E7B111F3BFFF6E61A203796AEEAC7B2
-:10E55000BC59FF13CF2F103B0CF58AFB2DA457A0FD
-:10E56000DE877AA2E41F5EE40323E939D703731937
-:10E57000F18D1A358EFC8C66BE21F985370ECA11D5
-:10E58000C8375A891FDCA9761DB428213E31B82C22
-:10E59000381CE5702798FEF83E6869A7E7DF146429
-:10E5A000137F18C40E0D203FAB35588C7AA0EA7843
-:10E5B0006CDB4910296DEB387D34D9FC0F2E41FE00
-:10E5C00050E9D450AFFBCC6FF1D9609D6D499C6F81
-:10E5D000B42D4B2779FE19137C64B69DF8C89516A7
-:10E5E0008B8FECAD39E9646F75B7CF71937FF5D739
-:10E5F0005FAB976DC1F7331D2477DB501E43BD6DB4
-:10E60000E3707AFFA2E44BCB385F6A9BA90F88C303
-:10E61000F733FB5B70BEDD29DEBFE1B9A7ABFE9F20
-:10E62000C7A23E79531C7B029EB765E90350DE3ECC
-:10E63000A078E62CC6FEC3F9BA8373E29EDAC98FCE
-:10E640002780FEA4CEFA841DE17E6FE9471FEC3BD4
-:10E65000F620C2CB57CA72519FEF44FC1C193A2FC7
-:10E66000B0CA597D72E8DC524CE726F1D56783F3D6
-:10E670004BE1E7B75A897E7E29E2FC947AC06FE2CB
-:10E68000FFFC7CEE54397F672F696E2CD5FEDED4FB
-:10E6900042585FD3AD702E2410837720BCB6AD4CAA
-:10E6A000D0711F9D1656DB1E816EB30B85DF09A549
-:10E6B00031D0C33C410FF324DEAE32E16D7050D255
-:10E6C000E97881B7D0FFC578CF509CF753E5F028A3
-:10E6D0007CF8E67FABB323CD33BC90FB0BF68356BF
-:10E6E0005A48F2B5D4A0AFBE99FF5106CA29F6D553
-:10E6F000814128775F49F18C2C04FE113BB48BFCDF
-:10E70000E69D03BA6CB8CFCE391F67A05E34AFFE6A
-:10E71000B7445F17BBCED5F135361C27A922CB16DF
-:10E720008432B522EB20E2CF91E931EE98087AC825
-:10E73000FEE9C33250FFEDA81C96817CAF030EF0BA
-:10E7400010AECFEA4E40FEC7F654131FAB147CAC9C
-:10E75000A362087F2EF866D8F38D45A8D73A2D5AC4
-:10E76000B8BE602ECF02DF0C00DFFC08EC332C4F6C
-:10E77000817D1600FDF504D867583F06F6199647C7
-:10E78000C13EC3B2A341A3F74D1543F604E19CBFBC
-:10E790006851687CF4DF46D28B6F7C5C6501091F91
-:10E7A000F8AFF6E17816C80DD597B4F535D4176DE6
-:10E7B0001868A82F681E62A84B3DD2BBEA0AC3B8EE
-:10E7C000E565858676ABE347D8F05C93CAF239DC21
-:10E7D000CBF209EE1DD74481FB35A309EE87A78F45
-:10E7E000CE40781E46B8A3FD66D512F01C24DC6727
-:10E7F00089390F9715F2E702EEA1E7E5BDCAA94FE7
-:10E8000010DE31087707951F21BC09EE1CDE2710AA
-:10E81000DE3108F75C2A8F22BC87E1B800EFA20B3B
-:10E82000C3FBE6DDAA010E373E6E8477EDC37D4D56
-:10E83000F01F6880E3A20D430C7509EF05CD467803
-:10E840007B57159ADA31B601E0508EBF001D1C2EA1
-:10E850009E467129AB83F9E281AF2421BDC1FAAD97
-:10E86000150AD78FE0A715E87016FE02F46575F259
-:10E87000F7CD73143FF225D489D0AE00B806E281FB
-:10E88000CECA5D979D42BE743D723015ED7A3F95BC
-:10E8900037B000D167350B527D1EEBCAB443798B7C
-:10E8A0001A588BFEBBB71CDE27919EFF32FDDD4E52
-:10E8B0000589529B3F0CE99C3993C9DE8C764EC08A
-:10E8C00029257F62CE51625FF05381FC1FFA75C427
-:10E8D0008FB8E30E3887CFE60747E1FC373BBC8FA4
-:10E8E000A65868BE3D38DFA736EFB0BEF0FCADE2FB
-:10E8F000D11948FFCCD3CF6027459B6F136E16E02C
-:10E9000030BF0CE0A4601C8EC3E5642587CBFE4DB0
-:10E910003176F4679C5C67237FE5E6F8CC4CC4DB7A
-:10E92000936BA66522DE356E1A9689F83EAB65DAE2
-:10E9300059E4DF53D41935144F6DE578CFD8ADA421
-:10E9400077DD21CEEEB89B6901785F393D41F3C197
-:10E950007EBCBEAC445A2FD39DF9D06EA1D8F7C26D
-:10E96000D6A533703CB9FF051B620CE7FFA3126309
-:10E97000BD92D943789685E76C0FBDC7F357ABFAC4
-:10E98000787BB1A3EBFFB0FD8D57C2C63B5E98907C
-:10E99000827A0B1BCD467FA386FA4783EB970DFE49
-:10E9A000375EC909C155E2D36F0A3D9FE0F9C063E4
-:10E9B0008AB7012D913CB8A5DBAFB52F11E1B7297E
-:10E9C000FEA57BAE44B8BCC7FD1C9BE36B887F7C77
-:10E9D000827C3B0BF9F4F519C130BE20FB07053FE3
-:10E9E0003DF2CBEB898F1CA84CA5784CC773DCBFDC
-:10E9F0007C54D07D47C5F5D57700FFECD8AD929E0D
-:10EA0000D7B1E7FC41F4D374B42B9A00B9257CDC70
-:10EA10008E3DC0CF91DF7A6CF47EFFEE5FD13ABFBE
-:10EA20002F7E5EB157F0F32D7CFEC5560FF117E631
-:10EA30009D6DD8DFDF8BAF5F889F1FB1713CED38D4
-:10EA4000A292BF8DF9F443B9FDC3F0B38CE36763C1
-:10EA5000650CE3F295F39959154007A8E733773130
-:10EA6000DA949FEC29EF47F27283ED38EAD32EF85F
-:10EA70008772DB0CC74A663D1E0CC3DF9B9F83F683
-:10EA800061EB9B85EFC3F0D98CAF2545467CFD82B9
-:10EA90007D9569CFE6EF0FF50FF13DFC09E72F9269
-:10EAA0006F49FC05BE55837C0DF8CA554580B73FBC
-:10EAB0002EC8FA4D5009E32B17C9C736C57F4D72D2
-:10EAC0007073FCD784C7872B051E839E81CF3BAE16
-:10EAD000E1FA06F3CF267A9827F5089B2701FDA4D3
-:10EAE0004756F54DC4F7C79ACB89EE243D99E73BCD
-:10EAF0002AF04FB69B67EDB26911E4A17795117FBB
-:10EB0000D8AED984EF7798F02CDAF8E6F6729E79D1
-:10EB1000A678AF799EDB8A84DED95E7D51F3211918
-:10EB200076F727FD362E84972AF2812F1382A47F51
-:10EB3000CD36E86547CB46935E76B8E27C44FDEC83
-:10EB400068C5F9B74623BD95D904BDD752FF72F108
-:10EB5000DEBC8E8F84DE704AF08F1382AEE57B754B
-:10EB6000FB9AFE7311EF57A91AF2AB23330A09CFB0
-:10EB7000CFF82B69FEA3152AF99BEE2F9A3217FDC9
-:10EB80004D723D72BEF26BCE27A03FED0B8017FA9F
-:10EB9000C7CA6D5ABF48FA85191ED1C695F803FA3F
-:10EBA000EC11DCE761E4A3F8D66B84D361EC0FEFE2
-:10EBB000676D5729DE6686D381E9C3882F1DDD2561
-:10EBC000F827C015F5F0DA878DE7BAA42DDEC46FFB
-:10EBD000FA1ADECFAAE47A99E4D7727D87570DE955
-:10EBE000179E3775A1F396E35C2CBEDC28FAA3D8F8
-:10EBF000FC86E46FB2613CB0144DF3659BDE5F6E42
-:10EC00007A5F60AC5F241E1F13F823E5CFB158ADC7
-:10EC10003A521CEFE8D531B5E1F9099D45DC7FD3C7
-:10EC20005924E2DE9728B7FFA328B2DC8ED65FF224
-:10EC3000BDA70B3D41E4772C504EF1EC8BE57361A1
-:10EC400072FE4C11D27950B1637FA957DD58C6E5E9
-:10EC5000C2E6F8A7284FE3D346AE17ED6F8C213CF0
-:10EC6000FCF335FCFD9FFFED23D2A70EECDD9C18D5
-:10EC70002EE7255E9EDD332D11FDC2272B1E4B0C8A
-:10EC8000B703E4FB8F2B1EBB672CD1B7AAF5762EFA
-:10EC9000DFD61EE8A810F680D0176EB2B6FF3FB1DF
-:10ECA00007CC76C014F5E144E47F667BE0AC5B4FB3
-:10ECB00074117C04DD09B972A380CF9F6D7A22C5DF
-:10ECC000E9761572B962C24F0987D3120E1BCA7B4F
-:10ECD000C59B53422EC8FA622B2378781D8CF465AD
-:10ECE000D6A66818FFC234951238974315F98FA13C
-:10ECF000FF4AB67FA65825FC96F31CD9A6B4A37F7D
-:10ED0000E5B7CDE5D57760BEC38C78E2ABB2FD1236
-:10ED10005FEFF2EBC8C6A46B711EEF1655C3475EDA
-:10ED2000DFB17EE1EB977A9AB9DF326BEB45D9D14F
-:10ED30005EDFF644B46F83629DC1FDB1767742CF4A
-:10ED40007E18AFC1FD2F9BA16A8DB0FE651BF8BA7E
-:10ED50002A7DAA960DF5DFB63E762DD2C1897A9B23
-:10ED600085DB072E039EBFD95AF836B63F59C6E554
-:10ED7000CAB18AAB12310FCEB7C5A6E5B87BCE5764
-:10ED800053CCF3D2CEEE89B1A0FFF46CBD8D05C893
-:10ED90007FE1217BF9C88621549E45F871FB9ACE0C
-:10EDA000FFC662EEE73AD1BAB03FA72737AD43E2DC
-:10EDB000CBB15D6A993F02BFBA519CDBA9AF9E26D9
-:10EDC0007C7B755739C9E313157C9E53ABB44484DF
-:10EDD000E7EF36A844C7277D7CFCFD7BEF4A1C0B80
-:10EDE000FB385BC1F77576CF9D6F8F817D062BA4B5
-:10EDF0003CE6724AE6F704370CA178EFA7CDDCFEBB
-:10EE000096F42EE3E157AD3C9248FDA59CDB3DDB3B
-:10EE1000B0FE8E5D27C80E3BBB0166E372CE998FB4
-:10EE2000F986BC3B5B32C378BEB32AE20DF5792D7F
-:10EE30004679D6B897F32BB39EBB7803E8C1E89721
-:10EE400032D9790B1B0B134B907E510FC63C932785
-:10EE5000CA0FA6E23EDAABA95D85889B2D6C8B318B
-:10EE6000F083CA66A35DB7C064C7F5B0EB4CF24847
-:10EE7000C2697914F924F5B90E61AF1CB579AA23DA
-:10EE8000E553B41773F9330FE8370DE3444CAFBCC7
-:10EE900052C07B3DC2C7DEF5450EE8D31DAA361E23
-:10EEA000F5EA1E7460D203CBCB8CF0659A8F95483F
-:10EEB0007F849BF4FBD3A8FFB7F41572DB0772289D
-:10EEC00001E592FE6C31CA958BF51F5CB47E5E2322
-:10EED000F4F31A837EDE814DC2FAEFAFBC9EFC5480
-:10EEE00047AEB99EF4F523DD7E2A8FC14F25F5BAD2
-:10EEF0002333CA0DFA67D8F33EBDE58B47D3378F6E
-:10EF0000213F263ECDE5D25A6147360B3BF2C80C75
-:10EF10006147A630A223AB556791F8D9A5EA6F0BDC
-:10EF20009A8D72C9BBCA683F3E3FC97B16CF252662
-:10EF3000ED72C3739BABC0E83F34E1E740C6FDE729
-:10EF400077A12F00E0DE54C9F34EF139E6BF48B98E
-:10EF5000C4A03DF28BCA0D97FBD7F3F73EB500D3A3
-:10EF6000E518AA74D4DECAEBBAC2EB3EA778AF8A22
-:10EF7000BC371BD48F6569B351EFC2BC9EF864FEE9
-:10EF80001E516420E075627248FEA15F3F9687D6ED
-:10EF90007D89D06F5045D62B48D798EF735901DA49
-:10EFA0008C3C2F2C0D5DFA05347E00F37A824D13D4
-:10EFB000C9DF5CEE48E4F179B0A37BC7BF46AED7AA
-:10EFC00095F5A5C90659F97AA2E2B36877217C0EB6
-:10EFD000D3C3068C223F9A85FC2D9BE247D8107F35
-:10EFE00067393D190807C07792AF1DBFB1131FDE07
-:10EFF0005FC9FDB01DD3476FBB1D9E8F78DA49BE38
-:10F00000F48EC5D20FDE95108EB747579DB0205FA6
-:10F01000FEFD1EA6611EE3D1DD5507DF80710EAC3B
-:10F020005AB8B118E9E84D95EC06B3FF76D2D3E3B0
-:10F03000C8FEBAEE1A95F2BB0F97A90CE5DAE10DFE
-:10F0400071063B24E4D755093FBED867A5F768EAA7
-:10F05000E462FE15FA37314FAB8C9FCB0B829FB524
-:10F060008B73FCB9D063760ABA69137473AFA09B33
-:10F070007566FFEEC39C6E0EEF01C301E4FA3B33ED
-:10F08000169692DF7A0BA33874D674757D11ECEF67
-:10F090008A18CD86F09B34239FC3B342B160FCA68F
-:10F0A000BC2CDF86F47E455FB70DF96879D94CAA90
-:10F0B0004FAEC8223B7FFF2A908F68EF2768194820
-:10F0C000974367C4042C89683716129FB8F28CC521
-:10F0D000402FF9813803DD5DFE78B2E1FDB02DE906
-:10F0E000867A3F4FB6A17DDF32233DC60D2D30F22B
-:10F0F0005DC6F54209E729EA38F2731D0DC9517A58
-:10F100002FF511E9AF93ED015A06BED622E4C808E7
-:10F11000A8633EDDBA8A2607E64D7CD16ED5F8F8A5
-:10F1200055A41F38B29E73209D606815F3AB5AA496
-:10F13000FE29FCF74C67A6756D6018673D5AC60836
-:10F140009F62873205F5AF3671DEF7897981AF4E60
-:10F15000B2919F8E9F63DF191E6AC73C46FB200D4C
-:10F16000E9AC00F184F7FFB9E8BF53E0CBD1B2C7F7
-:10F1700056C7213ECC66A46F4C516F5E8DF1C4A37F
-:10F180003318D1497BE0E5385C3F8E83F9812F4409
-:10F190001BA7E2571FDE82EBD965A771CA1F671351
-:10F1A000104F2EFFD1B18FDF46F06D711D88653D88
-:10F1B000E5F088C7750D81937B86056C540674E471
-:10F1C0003FB9670EE9180FBCFCCFBB3E7E8AE1BC9D
-:10F1D0005C2EB408FC36F3D75F3CF1EB05289F7F2B
-:10F1E000B1736BC10750FE60F583E9F550FE7CF505
-:10F1F0004D5B6F7787FCA53BAF5DBAA30DEAC37E7D
-:10F20000F8D3279F43BCBAF6A7FFE7395CEFB57F79
-:10F21000FBA313D67F59530243FA96EB33CF93C621
-:10F220005A148C8B221F25BE6CF5517DBECF68FF12
-:10F2300098E53EB6B702FCCAEB7F41F1E534D1FF59
-:10F24000F03577292ACCFBC17CCE573A1ABADA2698
-:10F25000DBA87D00DB039FA47CCD818380AD607F34
-:10F26000BB4FC1B83828481AC67B07C07BE4E7CC3F
-:10F27000ED26FD2A53E2AFE02B78CD81913FD04AB5
-:10F2800078962BE291C87F91DFBF312A9BF8F2403C
-:10F2900027D3F17CCB5EDCA0609EDAFB5EB7467ABA
-:10F2A0004103BB7F32D8C997AB3CEF22B7ECFDB925
-:10F2B000782EB055ABB72034EE2EA1D795BDE8A47B
-:10F2C000BCEDF77739B7939E7FE85A4BB87E58FA72
-:10F2D0008B3F3DFB3BC4AFF9B1845F66BDA543D016
-:10F2E0004777DDE6DE763BC0C7F71B07B7AB747721
-:10F2F00006D9E99A3B03F377BADBFD54C6D3B43F92
-:10F30000223F9F55154F7106195752CB3E5F83F42C
-:10F3100038AFA4AE18F5F7743C87BEA138F607CB1A
-:10F32000EC946FE053E2282F3D5ABCFABF843C6452
-:10F33000AC6E24AD83D58DC6F2FCECA66D767774E9
-:10F3400079D52CCE35DA7B9B9D7923C595FF6B143F
-:10F35000F72336E139D8C2CEC1F9FBB9181F8E7632
-:10F360000ECCEA2FA03C4B876328E681A48AC79B7A
-:10F37000E37FF616CAABCE235C5EA5D67FD980F4B8
-:10F3800027FD163569AC3B6EA6433F9BE8972AE202
-:10F390002C48C3A87FD78878516735A378516AFD78
-:10F3A00047FF8DF0D924C6AF798F8F6FB706F6234C
-:10F3B000BED438DD24773AFB256A78AF897DC5F362
-:10F3C00053D219C747393E13E3E3CA59D8BA53E3B6
-:10F3D000AADEA1EB101358201EF14771D0BCE9AB97
-:10F3E0006228AF55EA57A9F577DDAA8E308CA7A021
-:10F3F0005EFD7E15B7B7D1ECEC1E37CBA057919EC2
-:10F40000655E87ECD769637BD0FE0DD3B3480F638D
-:10F41000E1F30C31D4851FCD58B7A5D90D7CE2FDA1
-:10F42000AFCAFBD47139E04E19C5FD77080FA98F1B
-:10F4300049BDADC7B882DEC3F44B1FF20B9947D16B
-:10F44000AD27D586D94DD93DFBC97C35790E129EA5
-:10F45000D1FA3F3F499F329AF4AC008DE315C3586F
-:10F46000E29D99045F13BF04B6C5F3E9851E0A5AED
-:10F47000A4218F41EA95923F770ABE1BCC0A92DF06
-:10F4800050E6890F823E99D0FF86D149DD79F6A8F2
-:10F49000071D6DF88CE2EF35A887C2FCC1D59F1817
-:10F4A000EEA114954EBA81D66BCA97088BBBD27A5F
-:10F4B000BD826F4E519D94B7D2C9E234E45F9D3E48
-:10F4C000A18FFD219EF431C92FCCFCE11ACDC8FFDC
-:10F4D0007F5462E4FF33F5BE26BBD018A7AAF49888
-:10F4E000E2E1EF4D37F04DC97FEE44379F8AEE25BC
-:10F4F0000FC575DE14FCF26DA107DA591D3D77309A
-:10F500007E7F348EB553E96487A84C645D54BA9805
-:10F510008BF26B929946650AF350D99FD55199C6E3
-:10F52000783E553A6BA772103B446526EBA2D2CDCC
-:10F530005C162CB39946E550E6A1D2C35C14277F34
-:10F540002F21987118E037E37A26EEFD1EBA418725
-:10F5500073EAAC64A17BC04857539840BEB7F9FB2F
-:10F56000E9B2FECE0D3ABE9FC4DB6F7DFEBD87F0D3
-:10F570005E30F01BF1BE83BFEFAEBF7BC324EC6FE8
-:10F58000B3507DA7687FAA487F08CFFFE9D18CCE12
-:10F59000BBAC48DF36BA38543F53A83F1A5EEF3F42
-:10F5A0004ADF1E5E1F5DA83F16DE7F49A1FE44F8BC
-:10F5B000FB7DC5FABFF2BA8BF0F23D9B4EFA2EFCF2
-:10F5C000EC5246717CC39F3EAAF769C2C3DD8A151F
-:10F5D000CF3546D09B1DCF51453AD21C31587A7851
-:10F5E000DE4F30D6198CB7F462FF98E82888FC0902
-:10F5F000F070B8E2DD47F398F889E213F98329C681
-:10F60000B809E03BF95583ABB89DCE58E4F772DEFC
-:10F610000BE139D3C3FCBCD9A171A3EDC38CBF8767
-:10F62000849ED721F4BCF7441CB97BDF416BD269BF
-:10F6300047888EA3DB8756763A9C5FF6D8F79FAA59
-:10F640006D40D7C1FA1817CABBCE58F636DA69BE74
-:10F65000232A433DE352D7DB5638F50CE78B835C16
-:10F66000C867BAE7157CA6137F053DE78A3ED2BE80
-:10F67000D41C1CDEDCEE4812EB6A9A9C7C752EF9D9
-:10F68000F3B95E9F673B34731AAC337503F7AB264F
-:10F69000227D63E8ECE93FB8308ED63AC5C2904F80
-:10F6A000AD917E5E933F6ED3E415AE707FF09A44C9
-:10F6B000BF82F1CBF4402CF743A4307F2CCAD13267
-:10F6C000AD8CF2667CAAAB0CEB55ECDA5CA82F682B
-:10F6D00053DD6530EF81B65FAD403FE0A22A3BC508
-:10F6E000316CFAD4B3DCFFC7F33792059E37AF8B8A
-:10F6F000D10208C77E4EF2DBE6AD2928437BB7C9AD
-:10F70000999C8CB8985CB584FC864D4EED35BCDF79
-:10F71000E17359283F91B9744739E82BDB6FB796ED
-:10F72000211FCF78A628510D5BF789E673B1180722
-:10F7300079D465A1F78FAE2A752C71E23D46B017DA
-:10F74000A03CE03AAEA3FEBE15DAA0BFF19EDAE31C
-:10F75000AD97F5728E89657603DEC66BC67A8CC965
-:10F76000DF6833E905C34A1252E89C47B15178CEAD
-:10F77000239FFC8AECDF794E37F9D54B5B14CA8F97
-:10F7800009EED73251DF3CB17118E5BB34B718FD33
-:10F79000D1C10C9689F77DE6B72AA4AFAACD9F37D1
-:10F7A00062BFC1B9EE0138CE60AD6B802B8CFE1EFE
-:10F7B000FDE98F6351DE35E38535C223C6E342C2DE
-:10F7C0005E95F7CAE7BBCE55A3DEBFA8F55D0FC2B5
-:10F7D0003F49B710CD1CB5F9D3F0FCD74F9A45740B
-:10F7E00089F7B4508FE9A18FFE15D619763F614D88
-:10F7F0004A761CCE1BC25F3D11F77BB2B590F4A3D5
-:10F800001D2DA5741FC03CCEDD0DAC1DF5D6350DEC
-:10F810008EF648FAEFDD999E4CBCBF7D6AD3A4B545
-:10F820000CCEFFD4FE656978DF7D716B0C8B75F7AC
-:10F830006C7F72D3689A6F31DEA3C6795B67DA5149
-:10F840006E4C6B9B6447B8DDDD30FB99F0791E2A66
-:10F85000F5569700FDC5B73E4378E264011FC2F537
-:10F86000DFC7EB99A85F9CCC6111F33997962844C8
-:10F87000B7BF1BEFA1FB29A73222B7BBA984EBE7D7
-:10F88000C11237BFB76E656F2F4D217BD085F47ADB
-:10F89000A2A590E277368CBB0FC1EF567CD580F8DD
-:10F8A0007FBE6AE1074BE1FD9AE9D79DC172A4BD15
-:10F8B0008EF466F67B95E801F442BA27F69F150EA2
-:10F8C0005753581E21EA8FBAC1AFE161687FD85AF9
-:10F8D000D4801DF8BB6DDF69D2C3115FF530FCA584
-:10F8E0009F51429F17F92169A3E8DE1DFDACB9FACB
-:10F8F0003A7F00CAE32D0B1D91CE31FAFC61E3A2E1
-:10F900007E3B99E9B161F383540C905FDBCBE7EB6D
-:10F910006E27DE8319AAD3FA845E6E7EDF4D6F5B9D
-:10F920008CF4B94D9C8FD4CFA3ADF7077E63BF177E
-:10F930003038818644FBB5067AB95C6D5F817115FC
-:10F94000F63EE7FF60D7314F84385788CFC2DAFBE5
-:10F950000BF8013CD7A6CC22FB24DA3AECFE437A22
-:10F96000D68890FDF68334E3BA64BB17C4BE62FC4C
-:10F970002C604BC43240F73962A03FCAEF2FAA6E09
-:10F98000735D1D812E6469E65BF8E30E8BFF98F9C9
-:10F9900004A2C150A98F58787F3D8CCF25DCCFF5CC
-:10F9A000DF935B14D27FD76FE279145FF8A14ECA60
-:10F9B000053F27542DBE11CA8E33ECDEE192175B52
-:10F9C000EEB9DC6D80DBA2F0EF999C79F2276FE352
-:10F9D000FB8F9EFA8907977B57CAA244CEB78E2D1C
-:10F9E000C0794E5D61277F0CFE38247E40C3A5FEA2
-:10F9F00018031EAEDFFBE496052877F63A344CC7B1
-:10FA00005BBCC5F83E262D6C5F8CE397CF00A760EA
-:10FA1000F64CA0A3A33FFD57BA1F1E87FC13E97144
-:10FA2000550CDD0B33C3795C49F77746086F1784B3
-:10FA3000E250741F44D2D5F10D4DA7541867ED2A3A
-:10FA4000BB9BBEA760B2BF8EBA67EA6961F161FB7A
-:10FA50002A7E4F9385DB89D9A1FDCB718FFA163AA7
-:10FA6000DCCE9EE3F5C0BB28E3F529D5BF46BE98A2
-:10FA700056EA6163281EBD90F65DBF67D5D137A0F9
-:10FA8000CD3D715EEB987EB8FE21A314BC2F63754B
-:10FA9000D3BDC1E6664B2CF2FDD6766BEC50847775
-:10FAA000B385E47C6B7B4ADC50944B4E0BC54F51C5
-:10FAB000AEA861FEFDD16338BC42F2C39318AEFF1D
-:10FAC000C4097C3C952BF49FC95CFF519EDE477AAC
-:10FAD00047F31A1EA792FA864BE08FAB99C721A372
-:10FAE000E93FC87870DD09C58B5CC8D7D624F2EF32
-:10FAF0006F2C9AACF9F03EE7554E467263305EAA21
-:10FB0000403DCBC9FCD3601ED5C5F51B6F2B237DB3
-:10FB100026D9E9D410D4A96D7E1FAD5BE774E680C9
-:10FB20007F08CFB85C9DE1F856935E6137E90DAA76
-:10FB3000A9AE8D11792B428F6042FF96F1E0848D42
-:10FB4000BDE70149BF6EABF04F80FEE4A37B2325E8
-:10FB5000CC8F78CB74DD9DD23F6407A489EF1EA5BE
-:10FB600095B0ED4D61F127457F95FC06D22F29FD1B
-:10FB70000FD2CF31A204ECB5C4307FC44B605AAA77
-:10FB8000140F9B8E789205EC80ECC93CA6F0EB1923
-:10FB9000DF524FAFBFB8B8CF432FF3FB41CD9638FC
-:10FBA0006D4756CF76378DE3F8167700F6867AEDF7
-:10FBB000F50EBA873345DD4DF7EE371759785E33CA
-:10FBC0003BE4427D60E118CE77B34A3D0BC6503C22
-:10FBD000D593857803F0F0D9F0FE9EF0DB66DC91DA
-:10FBE0001D87FAF007034E6F42BDDCB7C642FC46E4
-:10FBF000C231ABD1722FA261587C2E602D08C5D9BD
-:10FC0000D67BCEF9F0BEF0B5E3B8DF356EE6C9FDC0
-:10FC1000E8075D37D4427EF6BB12748ADB01FD38FB
-:10FC2000541EAF7B0DE36D2DEEE464FCEECE534924
-:10FC3000FCBDFC7ED50309FDB787E797948EE3FAF8
-:10FC4000C8034A647DA5EF3885E759ED0540F621E4
-:10FC5000BF16B7C77D5F54E9CEB03AD21EF4FF1786
-:10FC60001FB7A75BF67E51E51B4A7692789F534DEE
-:10FC7000F63AFA18E1FD89BD2F55F9A0FE4856E481
-:10FC8000797F2BE67DE475EF60D467837B017FFA93
-:10FC9000443ADF00B394D0B89918970AAE8C991DF6
-:10FCA000E93B3683C6F37D6E8677317D427AECE69A
-:10FCB0002AB39EEA277E75BEF6F8414AD306FE5166
-:10FCC0000CF490C422F3CB0BEBAB5A1AEA9D4D2BEC
-:10FCD00095B5C83F9A405FC5B860AACB4EFA6A7323
-:10FCE000D28F27E1B99CAF652EBCEFBA03D43EE4B6
-:10FCF0005FE857C57BACD3EA399FF1BAB89F15ECE2
-:10FD000038CF55888F03AC848F527FB55671FE7300
-:10FD1000450CCF47EE4C7292DF34A99EE71FC7FB1C
-:10FD2000409FC5FD4DE6F9C33AFC433E24F55B67B1
-:10FD30009ED590476C37E5195B4D79C5FBC718ED2B
-:10FD40009984E2A25EF5AA97C0FEC575EE03FE8314
-:10FD50006500EC602C5F06BB1DCB57C06EC7B8C1F9
-:10FD6000AB0DB954BED6A0D1F3371A4AA89C981946
-:10FD7000A4B822F991C97FC3020AF9F1247E7D3A21
-:10FD8000A814EA4F4DE2EFFFF3853B1FF50D82F714
-:10FD900029A2BDEFEA6AC4D7EE3AABAFC6F6356921
-:10FDA000BC5E3DF6C7D5E8FFE99AA27F88F2AD9F19
-:10FDB000C5337F0DB6FD498C16C9BEAF1D2BE47946
-:10FDC00014FB9DE127128CFE9CB3637AF1E73CA003
-:10FDD000F075F4DDF7D2C348177D665A3D88C799A0
-:10FDE000D9463FFFD563395D3C3896F39FCC3780C9
-:10FDF0003E7A81BBA48F68EF9BF6020A44A02B5980
-:10FE00006E4E6013E87E76B57D76A43CA7F3827FC4
-:10FE1000441DDFC9DC312343F4D6E434D35B90E2E4
-:10FE2000BBE7EB6FDB8FF2F2BBD31B23FB3058AD8C
-:10FE300093BC0E02BD213F576B39BDA9567E3FB31F
-:10FE4000E64DEE1FD981F485F970486FF0EB341F51
-:10FE5000AFA79AE8ADC94C6F4E23BD0591DE60BCDB
-:10FE6000241FD72FE2ABDABF577A1B39F6BBD1DBA1
-:10FE7000BF8F0F525E436756DD0084CF66F13DBCF5
-:10FE80004BA5C337C7DAB93C18AE935FA0597CFFC6
-:10FE90001058CC06FCCECAB4418DD66480DF8C9459
-:10FEA0007CFA0EC16D63FB0B3A39E4447F4DE224CA
-:10FEB0007DDA58A4AFEBCED0FDC67E164EBFB5633B
-:10FEC000BBAA90FE32D674CC9C8674B75225396991
-:10FED000DED78B1338DD35297C5E38B901E171BD81
-:10FEE000B963393EBA5736290ED4C7E7332D278B6D
-:10FEF000BE2B43DFBBF997E6FF74E1B82F4EE0DF7E
-:10FF0000737137BE97E4E5FEB534B4DFE84A734158
-:10FF10004F7A849F765B7F033D2FC47D44A3E70B1C
-:10FF2000F18FE01845C085511EB057DCDF94719108
-:10FF3000A8F46CF2E346F51F0E8FFC5DCAC9E3F925
-:10FF4000BC4DC2FF6BD6F7E4FE0F4FF2FE6C2C8C5B
-:10FF5000A3385FE57EE07DCC8DEB9471B3EE3C235E
-:10FF6000A91FFA98BF09F56D2BA832FDB9BA81E334
-:10FF700075E71F093D7159A9771D8EBB9DB9F7A380
-:10FF80007C736A3C5FE1F949FA7A82E7B7D4034BA4
-:10FF90004AF57B71DC6878B56C9AFE406FEFD957F3
-:10FFA00030CAA8505C6BD24C2BE70BF58AE003CE2D
-:10FFB000B576A86F4E027EE646BD9DEFDB057CC39D
-:10FFC0004D7686D18E988ACE48E41BC84708B8FA89
-:10FFD0000CCCAB4C14E387E475F020EAA54180ED2E
-:10FFE000BDF02AD1C7E575D39B9CAFD881AF505CDB
-:10FFF000BA84DB09F25E507C9E46F697AAF76E3F04
-:020000023000CC
-:10000000584DF6FD9EB1C27E28604508B74C8BFB6B
-:10001000BE31F0BCF0C12987C7C0E3E26D8BFBA203
-:10002000381DBD7D4D397EEF6BD913A7B6A39F74E4
-:10003000CC7FC430F15D35CA33F83BCA193A97F327
-:10004000FB58B5CF8AFC2A321EAF19CFE59F8CB37F
-:10005000F682C7EF131E8B38E725E0B1F302787CF8
-:100060001CF135021E9FF88E78FC09F6BF170F01B0
-:10007000D61D3B4DFFB437BC9D3A55FFBC377E1AA9
-:10008000163FE0F943AC96EC6719BFEC015794AF0B
-:1000900039BDF8A5D6ED88457BB6A976C7EBF8DD66
-:1000A000C7A67A6E677726688E12B46FDE55E97B35
-:1000B00056D1FAA3DDED0366B96A3CCF8F3EB0326C
-:1000C000263011C6497772799BEED419E68B5B5DB9
-:1000D000419B3701F5350F43BDCD9E6261BE307F38
-:1000E000CC48DB2192CB9D20C7913E803E39BD2577
-:1000F000F171A47C9EB8F23E8CE4B0F15DC0FBC20D
-:10010000E8E4F5BD25E4874B287E6E05F653ABED9C
-:100110006EC4EF897F05B91936CF24D044C2EB579E
-:10012000390618C699E2CA32BC9F96F603C3FBABE8
-:10013000015FEC14C7E6F702A55E33DD9D6F68979B
-:1001400024E21C3FCC1D6318CFAA7E75EF68A47F04
-:10015000A1478C837FF45D5E93BE60D627CCFAC343
-:10016000E82B8DF75D4658451E9A95E7476C660E5D
-:10017000FA2E05F041FAEE414D284F80E864843DA7
-:10018000B8E36EF4ABCC71683E78D6BCF7EAB4F94C
-:100190004521FFD9E67AEEF76BDAE3D88EF4B05555
-:1001A000D0A5A4AFBC84E37318C9753B43796CA692
-:1001B0005799EF24FD05D29FA0D4723FC3D90959A6
-:1001C0003CEF48F09FCD55DCFE7D4809C42A4338FA
-:1001D0005DBA9343DFA74B638A6F3AA76F3D59948B
-:1001E000AAC8479579AF380EDAD9697C3EF61ACF9E
-:1001F0009B6CFC67ECEF62BE41C29F91911CF25375
-:10020000607EC2CDBC9F6FBAE83758E45BF6E1EB85
-:100210000F4C11F38D8052ADD3857FDA4B650CC640
-:10022000C3A1CC56B438F47F0C513D14684914F185
-:10023000F574114F8F57029C797C4B3E3212D828AF
-:10024000E625B064FE7D91D25F38994AF461DF8182
-:10025000F2E8AE63DA3BC5F0BC39E1C76F4D84E725
-:100260002DEFAA1AFA49EFCAF07D80746D0564F08B
-:10027000915FCB331FCF4DAD70B8A6413FD5B7BD11
-:1002800011E3BB23EDFEFD749EAB6388DE83D00FCC
-:10029000F1616B02D029E22B7ABA4685F281641CA7
-:1002A00023384673A01C0D623BEE6F36F83F23E403
-:1002B0009B90BFD42AEACDCE1DA4BFAF4DB1E317AA
-:1002C0005331BF27B31EF1B25F1CBF7FCB78DC6018
-:1002D00030FE12966F6F7745F66B82BE4670083619
-:1002E0002E4DEB4DEF8A1A47715A02F6C48B8FA33D
-:1002F000ACB9F13A7F206C9D72DF6B9D3B9405ECAD
-:1003000052E667C6384A2DD363474488A304FD0AE2
-:10031000AE73702D8FB30C16FEFA6F1B47A99CC0ED
-:10032000F5C74B8DA3C8FD5E237E9F01882DEE1976
-:10033000533C81CECB125A5F18FC1E277E44B82155
-:100340005004EA3F12F5B77677FCE949F8F5CD5D40
-:100350002FEFC652EA7133C5FB6B877DB90F73B7B8
-:1003600066AE5B21E258C6F8C33560D585FBF9F16E
-:100370007B01E1F599A6F5945A8D7182C94E63FB14
-:10038000A929C6F76583627A9C1BFAE569BF4ACF43
-:10039000FDDE157F0FE3DF9B0A3B07F5C27507E61D
-:1003A000CD61DCC7DD134FC2E3009EDF58597211E7
-:1003B000E28B85F4D2ADBEA5F75702FDAC0539CA74
-:1003C00079B1DB407FA1B847998EF824FDFDD1E8D3
-:1003D000E9B8339BFCFF83EBF7B74FEECBBAE300F2
-:1003E000F7C4791DE3F07B41CE730AEA2183EB5F0A
-:1003F000A1F7D7CD29EE158F72EA0FB44F0EFB8E01
-:10040000608ED56341FB39A7FE557A1E559FEFC913
-:1004100047286F2D47E085CC0BDC8A798100F79C5B
-:100420005AF17DE0B6DEF3DFA43C6C0ECBEFA364A3
-:1004300006B7C2C2C79772AF873F9D71BFAF9CAF6F
-:100440003B2FD0346FB7FC7371F9F7FC24AF36AE95
-:1004500038EC5E86B8C701FB8E98073A5AF8B37B32
-:10046000C963E37667C56B1FE0F8976C7746197729
-:10047000626630E23DA9A9C26FD5191BCC40BF41CD
-:100480006794BF9BF0D094A93F1CD78BBE8B79B3E8
-:1004900008CB68EBFCB679B37522DE24E3AD327F7E
-:1004A00056E6C55E287FF6BBFAE1570A7F40E93879
-:1004B00016310E615EEF6DC23F9E55EA598178118B
-:1004C0002DFE20DB7F30C01ED12F7E6442E4EF0E74
-:1004D000C8FC50586F4AB81D24FBC9BC7CF3786037
-:1004E00017AD1917E60FF436E690BF2FCCDE92F960
-:1004F000B0441F9B851FA29B0ECC7AA1888798F5DC
-:1005000042191F51AAB87F02E8A30DE745BD0BF3BE
-:10051000D2A59D27F34965DE28E685523CEA5BEAD1
-:1005200055DFBB3DD53885F2BA9A5CA5AF7D177B08
-:10053000EADF2718ED29AF93FB1DBC684F0DEF696B
-:100540004F15957A5F447899EDAAA33FFB84F26337
-:10055000C10EDD37EEFBE01326FFD4DC311CBFA556
-:100560009C96FEB4FD432D06BFEB5475D57ECA178D
-:10057000AFE5FE9674BD9DEC34BBD3EE467F8B7524
-:1005800032A7235B1EF3EB3CCE4BFE15995796EC3E
-:100590005C12F1BEA9B41383D24EF4F1FBA99D6F96
-:1005A000F2B86D3CFA5BB06119976BD2DF624B1108
-:1005B000FE16533E76BCC9BF62F6B79C1E27FCB63A
-:1005C000C2DFF288E2BE1B49FD575BA6FC0E41F17B
-:1005D0006F0F2F8E4753FF79FF9A1F0A7FCB834EF1
-:1005E00058DFDE0F8CFE1673FC2B42DC8B9C57838E
-:1005F000C6FF8EE26E12BE926EA53F2BBD9E7FBFE0
-:1006000069AABA5B41FEB2D9C9E1ABA23F2B25E48E
-:10061000CF529EFE53B75F8AEEE3F68893D7BD8E26
-:10062000EBB402C3591FC9BF25E06A8E4725D68B9C
-:100630007BC0DF933F2B79BC11BE050F16DE87DF31
-:10064000352EDA567E18CB51DB6FEB3B17CA92275B
-:10065000EE2BC7F22FAF07B350EF34FBB114047E7B
-:10066000714FF89AE128F1D45B2BF1D46927BAAD28
-:10067000E27034C32955E7789A03780A2A4237FE94
-:10068000752671FA4C9FACBD86FEB5C17956160928
-:100690008FADF5FC7B59128E5B051C936B97909F79
-:1006A000D08CA783DB2E0D3FC79AE0F7EC96C2BB38
-:1006B000116ECF3D5CFE3B2C7FEDBF2D1EE1B6E7FA
-:1006C000F1FB7E28E03780BEA76B82DF03F811E9DB
-:1006D0007E3DE13751E3F6F5E7A5DEB2F100DFAB91
-:1006E0008143A03F64474B81C3180732F2D3D4EF54
-:1006F000C93F15ECE6A7ECED9C4BE0A71F9BFC5314
-:10070000A93E4E37A9BE63449FE9409FB1E8AFAA16
-:10071000E57A24887D7FBC823637E7AF52AE21CBA5
-:10072000B180F0D9EAE271E7087ECA007DEFD7C454
-:1007300087D181138E772057EB107E52DE6DADE5A9
-:1007400071B4DBA678568CEF178AAB3D3F49BF6D7D
-:100750003CDD5FF8D6FEC77FC6FED2FF08784AFBB5
-:100760005701DFF1FBE657813C41FBDF5A1BB4A187
-:100770005CA9A9BF55F142D9E74A4E3FA9695E86F7
-:1007800071FE9EFEBA6002EAED138776E3C37A9C9F
-:1007900047E2C3C895E7EF433F57347C488F92AF99
-:1007A00074617C2835C8D7CDDDF850B7EEB2948B94
-:1007B000C787B809FCFB11DDF820E83FB536F82003
-:1007C000D2AF55E083D5057C0CE0A1221EE485E282
-:1007D0009E921E8222FFC00C9FA06F48943C8415FD
-:1007E0004A492FEBBBE8FC03110F6D12F1506F3D2E
-:1007F000CF97ED5C1933D5987FA0D1BAA739EB9488
-:10080000F03CFE0879B22FE3F9C938A78C6B7E5E05
-:10081000EA79059F4FCCE5E71C8C1E670AE0FD5680
-:10082000403F9709CFDF223C97F70F841E77DB14F8
-:10083000FD6D1C7784DD4F79CEA0EF1DC6765BF78A
-:100840003EC9BFB72BFC90322FEF3BFBCD12ED7EA4
-:10085000BC2F29FD669B13EC3BF0BCE7B3E014FA18
-:10086000CE2FC629D0EFB43186F21A172A6078232A
-:100870005FBCCAFBD1788AEB79281FD75BE170A1F6
-:100880009EDF9C34350DF946CD5A95E47A34FB460B
-:10089000D25B0DF01BA2B77ACE6F5201BF08DF7C8E
-:1008A0000AF19B74E0379CFFE80CF53A2BD29DB31C
-:1008B00027BFD9DC0BFC2F92EF7C83708FC077941D
-:1008C00009C506BE6399F01DF8CE4FC6336E1F8A68
-:1008D000FD633C80F68FF415BE7FB33EDBBD6F2316
-:1008E0007D49BAFB5F4067232744A6B3FC09DF8D2F
-:1008F000CEC662FF087476E504239DE913FE67D235
-:100900005905E1DB05E8ECA3F14CD8B7D71AF48A16
-:10091000CBD5F6733938FFFFE7FCED8357723BFE0A
-:1009200042F9DBF87331FE53733EF73FFCA9FF6BCE
-:10093000FDA9CF4EF81EFCA9AE716EC23FB35FF5A4
-:1009400093D1FABE09BDC495259FB64A3E0DFC1849
-:10095000796F0DF033E4CFA9555D9F3ECFED4D2D5E
-:10096000DE4DFE86D771BC74C1AFCD7C19F4CE3795
-:1009700026FC1DFD0D7F2FBFE14AE167BDD07DFB49
-:100980009502CED1EEDD3709FBBE09C6C07B7A5B8E
-:1009900057DAFDCDB0608FD0AB47D45E773512D932
-:1009A0003BCBEC71C15EEC26F977245A1BBC2F9E21
-:1009B000CC09DF1F8B28B7BAF767D293C3ED26F7B0
-:1009C00025D84D33261AF5646B2DB773AD20EF286B
-:1009D000AEAF9704905FA7FB94764C0DF6A6D42992
-:1009E0002807536B3D940F7FA9717D331E458BF310
-:1009F0007FDF717D73DEC0FF94387FD14461CF9B70
-:100A0000E2FCD2FF6A8ECB8FB0B796917CADB6E098
-:100A10005FC060CD7B3FDE71379EF71C07DDD330B2
-:100A2000E703448BDB8F48B607E3B3A3C7EFA5BF4B
-:100A3000E0115BDDEB68873FD268A1F335E70DE499
-:100A400025F0FCF1B313766DA3FC1FA90F57093EE7
-:100A500053AFD8E9BB8E557EE2335E7D5723C693F4
-:100A6000539DAC1DF5ACB8896EC23F354D273E6332
-:100A7000ADF2125EC9F8444D26BF37172BF04B1D5F
-:100A80005AF7168E9F7448D530BEBD119B02CF48D1
-:100A90004059897AC4180BE545B42975E4F76855BF
-:100AA000DCF4F73F92F25CA41F3D95A4FD7E36AEC8
-:100AB000BF1FFF3B2507A62F49433EB8B6B1310DF6
-:100AC000EF27DE3491F3877BA79FAEA6387A2EE816
-:100AD0007F0A9586BF672BCB1DBA22FEDE929FF25E
-:100AE0001161DD5BA8DF503BF9D954FD81DB900F2C
-:100AF000A8974D25BC6E555C7316E079E5D8498FF3
-:100B000069CE19357B11EC6B5D3F4F59169E6BD248
-:100B100050DA677352FF44D447D70DC8A6F95B1467
-:100B20006F5916F61B6021BA56457C7E5DCE92D772
-:100B3000F0EF8034A55B18DE3B68CB39DD82EDDA5F
-:100B4000C6F03F82635EAFEA32DE93C20F1F21FF21
-:100B500056D3785C5C157171D514572ED51599FF55
-:100B600048718758C1B76A7256CFA6EF2738ED2E65
-:100B700044B2A6846025E1C74A1BC3381DB3B61A28
-:100B8000F4B4BB1B8CDF7F71E619D7D3D27D3F2134
-:100B9000CB8B7C86FE062CDD5F48F2227E20BFE5F3
-:100BA000497FF1BC1E2BEA019BD717E17CFE51FE69
-:100BB000A3FC47192AFF2F0D22483C0080000000AB
-:100BC0001F8B080000000000000BC55B0D701CF5BA
-:100BD000757F7BBBB777279D4E7BD2C93E816C5614
-:100BE000B6446410F25AB68494D8684FDF322EBDF2
-:100BF000387C88C476CED8B8CE34932A4E49EC845B
-:100C00005667EB64C95FB2A414E44C3AD3B34932DB
-:100C10006DF08042661AF33967700821D028811080
-:100C200032930461885B529A310127A2434BDF7BE8
-:100C3000FF5DDDEDEAE4AFB81331CCDFFFDDFFFE91
-:100C40003FDEE7EFBDF73F00F0C00200D90F003AEA
-:100C5000C0A6224F122200E7AA200D95D8F74E9782
-:100C60006941800FE9AF25DB1EE807C8F8B2FD60D7
-:100C7000AD0A660DF0DF87A271CD3B6E5AF3C29FBD
-:100C800073DEE16AB5371D9C3BAF3DAED594001ACB
-:100C9000F2AE03D225AD73E6673A8E4FFE4C866AFC
-:100CA0007DEE7AEEEFEDEF3615AD2F86DAFFBFF170
-:100CB000F3D175A9E90128137D68C47353BB44744B
-:100CC00075A48302820E039D8DE90CFE73424A0CCB
-:100CD00057D2F9C21EE39B30970E762B6B73F897B1
-:100CE0009D5F16D347ECF9710BF2CE801908D12B1A
-:100CF000FC0E69AFE1B63F449628110F3F076BBE6B
-:100D000028C0B31FE2FE8E67F905DA82ECBCF2065A
-:100D100095C72F57FB5E6C5885CF5E918D6FEAD9D2
-:100D200079793F95C00B80FD5D65F6BD62ADFB91A5
-:100D3000232A64ECF1F8FF0933CC749AD8783F2465
-:100D400090BE3FDFF089E2441E39B0DB6569E7F70A
-:100D50006FE09CC07483F437F1DFA95F8C4ABCF864
-:100D600009F13CB5424BEFC7E7FBA5F4FEEB68DCAD
-:100D7000DD82BE361F0A2D3EE05FB40AE9E8B5F811
-:100D8000E4759F0BFF94054C278B38397C58C27350
-:100D900054D1B907ECF974230348A703CBEB56EC05
-:100DA000D7E9FCA3FFF26DDCC791E37BDEFA36BE28
-:100DB0000ED4D68D34E17E0A0C8F21933C7FEAC499
-:100DC0000964170CD5DE334AD36E1D954C0DDFFB3D
-:100DD000B5E03199CEE8974C9A4F39BC90CF13DDEE
-:100DE000EA948309C958504EE71B9380F85268383B
-:100DF000DFFBF49CF3E0FF4788CF2C9F39CF916E47
-:100E000048BDDEC9DAB9747FC5926705C727ED7999
-:100E1000912EE35EFD16A2F3F83E199238E5F82E06
-:100E2000548AAB007E6B4E7E7A3732FD9E412FF3A3
-:100E30006122A6A6251C3F51A4DDDE4BFD328F7139
-:100E40008C898AFFE3B946975DCBE7B2D7FB6C8B01
-:100E5000CEEB8DC51694933EE2B8F2F80D73E5CF54
-:100E6000BDFF4B95BFED668925EFA340F3C3E42D8D
-:100E70001ED227BF35E63A79B27E09ADF7731984E1
-:100E8000DCF441BC682E7D06C91E7C242B27AA25D4
-:100E9000477B23EB7F4CD3CF27CF6A7ACAACACA376
-:100EA00075A08FE8BE2CEADC9F3DEE7316BF7C690F
-:100EB000C87843D4664CA8A376CA94B03DB7E10B7A
-:100EC000DA5A7DFE757C90336F25CD077C6E2F241A
-:100ED0009858C4573387AF7B0AEBEE24BE0CDEACC8
-:100EE00002CB9F9BCE17E8AB4AE6A4142279F80800
-:100EF000CB4712E5A31AE7F1469D72187F72154C95
-:100F000007059F92FCBCDB243E255ABCB376C89FE4
-:100F1000632F41DFFD1B19E7FB6AB7AAEFC77D7E90
-:100F200035BEEDBEDB48CF5F900D89DFEB6C0FEF78
-:100F3000B1D680D109968762CBEFEC3C71EF6BCFD5
-:100F4000138FBAD5D7896EA4C7B37411F6D9F43705
-:100F500066D73BDC747A7829D221359C7FFEBB4A68
-:100F6000F5CF11FD6C3ACF37EFACFDDE7972B27D73
-:100F700065B63F529008C4F09C2341038D00BD3FED
-:100F8000C5EF6115CA65F9FCFC448AB23CBC46FF5A
-:100F9000C4713DEDA616C3BE7C02B7BE1CED6291C6
-:100FA0007ECB7A7CD511797D23D17F6BD0A3C939D3
-:100FB000FA3570D00B99201102D745B95B07D31BC6
-:100FC000D7E338A8F2B29CCB9115FC7C4B515CF175
-:100FD000607B6D6C09AF677FDF03FFA0ECC0E7CBE0
-:100FE000BDDA2B2427A988443BC2E74840DCFA5AE3
-:100FF00005CC10B65D7ACC4F7EADFB095A08A02512
-:101000003C1E21BF54F7D8918A04E975D29CAA41AD
-:10101000FE842D765DEF9B8AB7E17C032FCAC61E46
-:10102000EC8783DBD601CA91F47090EDC400DA79C5
-:101030001FF25D0976BE45CFD79C0568CF91A79674
-:10104000193FB4E7D8BD18CE9CDB6FF3973BC6774A
-:1010500068958EF732984606E9D4155DE61857D4A0
-:10106000B04AA3FDF6E82B1CCF6FAE69767C0FED7E
-:10107000CAE969ECAFC6FF88EF32883EBFAF249C57
-:1010800080FD9CEF15C8E9E3FBB5B1A2C819724A0F
-:1010900037C28DA447C8976307C8FEF4FAD96F0D0D
-:1010A00078E184540CA4FA49A827629BECEF254B05
-:1010B0005E93B14AE693147CF67D96C327A63D84E1
-:1010C000B3E031A827FBFA8F9A7ED28343AEA629DC
-:1010D000F1FB280ABA8E7C4218960CD4F37373691C
-:1010E00009F93929D983FD45382E2A44119EA37167
-:1010F0007ED8FD15310E16D1380D9215D8D70C2893
-:1011000020BE56E03C9F2DE1EF923DD677D788EF89
-:1011100092C52562FEBA7AF6A3990E6C8F82013EC3
-:10112000B63F71044D6445FAB8BD867685CF1F0081
-:10113000A39EFAD530CD760AD92F517F214C6AC2B1
-:10114000C86784DD9E56C267FCC2EEE7D397ACDE6B
-:101150002870C6E6070EBEBDC5FC12E9CDED773698
-:101160009C1777283B9F71E8ED23315DF8C39D5DA7
-:10117000AC27CACE67F9FD4BB1F81E9A8F48EFAF86
-:101180009F4BEF3A350364BF523130923845EAD174
-:10119000B5D1CDC8DFE4A37EA31AAE1C3F2E950FB8
-:1011A00069D00A88AE72DFE5F201D8CF074FF88F19
-:1011B000EE676134D94FFE097CF9F6E5F0C5CD0F35
-:1011C000B8B714A0F9C276F4EB5226202D657A98B0
-:1011D000D1FA2CFDB19F5C66D1ABC4E2872CDA8CCE
-:1011E0006C3D574AE6E70BCD575A92E5CF85F8128A
-:1011F0008DE3FBFA2C7FE43E938967FB691F9C65B6
-:101200007CBB4432985F4BE5B887FA8552C6023DF5
-:1012100069F69B21D0983F57411FB711EFF466C67E
-:10122000C33B7121C2B31FA097CD89C752C1567F5E
-:1012300025D9D71AC5F060BFB6C8134F231DAF56C6
-:101240002043E72B572049F61C9101CF9F7A14BD0C
-:1012500015FA9914BA690F7DB7CB9F4E49D9F5EBB2
-:101260002CBBFDE3A26F69D3B5593A9F26FBB55C51
-:10127000D0C3C3F6673243DF47BBC118D0E7DA33C8
-:101280001C97942D3B45ED267AD1CC744B86B02F1C
-:101290000DFFE07DC219349F82FDEFC512EF923F32
-:1012A000259C1E2C61BB345D48C07A2E2E30095718
-:1012B0006CB6D6E9BD495F1CC77D6E1EF6BD4EF308
-:1012C00041CAE7C405EEEF750972BFB7BF9B952B06
-:1012D000F7F797A907B0B3ECA27040ECE1D5C5D3FE
-:1012E0007970FB2CCE243D29CDFD4EF0498D24187C
-:1012F00077A8A42FA5179EC7EBC22FF63C5E145CFF
-:101300009AC76BE117DB4F6D83B35E65A9B54FA438
-:10131000D716B0FF224CCF4D16FD3E4DFE2A44F4A9
-:10132000C44005CFBD15E22AC9ED5F2184261CBF4C
-:1013300064DFD610E30568D7883E52E663F287D7AC
-:101340005F021D2D3A6DCABCE5D5C92EED2C823742
-:1013500072E337EBFDBB1B3E21E274BFBFCA9F1394
-:101360001F169EF8A09F8CFA9EC2BF7FB105B73EA4
-:10137000F8926CC895F45EE0E60008FF5D487A8A52
-:10138000FB2E7CE2CCFFD0F84217AEA69921675E17
-:101390004FE141C6B3852155679CED92331B47C38E
-:1013A000070207072DEAE5CC2B115EB6E31E9E5718
-:1013B0009ABBEE0D163EC757B10F2F02CFBB713A45
-:1013C000CCE273F13E1854859E609C9971C4C17A39
-:1013D0005E3DB3F76D7F57A6C62B8DDA3CDF5B7C95
-:1013E000A8A5401CEDC2C20A48EFC6FD0E0FEF884B
-:1013F00015627FAC0C748C3061A8F38B12E18DD632
-:101400008810A57093C085B404D8713CFE85FF4355
-:10141000DF5F83EFB755040DDC192C7C1B7132CED6
-:10142000737785DF30F1410AC4FB649347C4934965
-:101430007899F0E8568B3FDE2704CE64DEA01E1EAE
-:101440006C15F86AEB89CFAE23FE8E94DC6A64706B
-:10145000DC56B44FA584C746BD8CE710D73970BFA2
-:10146000AF290707E2FF771FF13AFA5E174E3CD02B
-:101470008A3810E5DBC681F7B702EB19ED8BFCC9A2
-:10148000955A078211B6A73728539E7CF9379B1FC0
-:1014900036FE7EB24CD0D9FB9EA00B06CC3BE8B901
-:1014A000EF3D118FA1010F362C20EF2FE8E76B40A5
-:1014B000FAD0D3F7843FC02F79DF26FE47FB76E3CF
-:1014C000619F0B0FBBF76BF3E1619B3E8DD048F43E
-:1014D000417CCE38C13E8FFB1C4F607CDE8E42F1DA
-:1014E00054BF9FDB4CBFC6EDD3FD516E4FF5EBD023
-:1014F0008E00ECD9FE1A6E9FEB37F8F9F3FD4DDC48
-:10150000DA74984B1F91D7BCC6DAB3523B15273F0C
-:101510007A55BB875561EC5E0FD3ED1CCA27295F56
-:10152000C8A0DC1B8EEFF6A429A4B7E39F8596BC68
-:101530005EEF3B7BD287E347CAC1D883DF2F6CDAEB
-:10154000C672B6E6AC27AB2740714E81234F10839D
-:101550005247BFCD7FB5637C87B6D4F1BE2436CD6C
-:1015600076AA2B7ABD639CCDE77FA2380BF737D6DE
-:101570007E5A23BAF6E82B1DE3947B91FF7514FF86
-:101580007CCC312FC8EB0CB2D3251B9C721872F1A6
-:1015900055DD7EFE38C8E6F3DBADCE78683EFEBA98
-:1015A000E5D5A66BC92C5D455C99A2B812E95AA293
-:1015B00009BADAE71DB1CE6BAFAB3489F35DE9F858
-:1015C0003244F16565BEF8F24D8BCE17882FBB9D76
-:1015D000F1A59BAE178A2F17B439EDCAC5D273D3C4
-:1015E0006291772B7941E6B845EEEE633F583A2594
-:1015F0001B5D64122D5C56443600C76D6A50D3845F
-:1016000033C7603A4AFEFCB0845445792BAD35CAE5
-:10161000C9CE3C14365EE925DCD823F280CFC46EF7
-:101620008F12EE18DC7D348ACE0A9ADB3C6CEF46D2
-:101630006367387FA1E8C0F90B6CCD741E7C628FA4
-:10164000B7F38D8737AA6909C71FB6F28D877B6606
-:10165000F38D5CDF986810F9C68FB6E9569E29199C
-:10166000A578E5AB1B1BCBD95929D8BF81861BAC0C
-:1016700027FB035A88E2E8D4468F46E79257DDFFFE
-:1016800005928F4352DFBE2A8ADFCA3C9C774D8584
-:101690001BCB37E3387913C218EA6F6C7C956CF674
-:1016A0004499BEAF8ABE0F5731FD0657DFEEA775CE
-:1016B00046C20B7A283F32D2E1611EC98433423CD4
-:1016C0004FCDF9E21E771D40268B4BF15BC4935141
-:1016D000C95F11FEC8C9FBDBFCDF1F56393FBBA544
-:1016E000EDC1A3C92A7ECCF66BA15D97D9D8CA7982
-:1016F000E6738427A4F9EB327BAD7CE7ACDF893A53
-:10170000F793671DC605765D82FE743B4F8B7FA9FC
-:101710005B3AD3E447C721DE4DF633193C7F1D44C5
-:10172000099EBF0E325FDD63579BC8A37E99F82EDA
-:10173000EA338E7A89D26DD545ACF8F530E5C349E8
-:101740001E5C75127B1F03D67CA9593972D54D5684
-:10175000ABD67C06E4CB5FFFA9F593FBDB44BDE68B
-:1017600052EB26DF6D03B15F2BDFEDB5F87F9D3CBB
-:10177000B983E4F1CF9DEFFE6EDB95CD77CFAD134E
-:10178000A5595FE0C4D93758AF972DB0F0CBF9EB2E
-:1017900040FB09E823FFC657202EA5FA87D54FDE68
-:1017A00020E675D78502561EE5876D4B45BC45F68C
-:1017B0008498AB188B89AE41E53B490DCF51101C85
-:1017C0008330B6BEC8E624B52D8B75AE0F8D2FF3D2
-:1017D000B0BF1A2F4A1C1DA4FD2F0BE6D58B572D29
-:1017E000FB376CD56F48803DA46F92AD1C90F02004
-:1017F0009F2640F0F9EDB6308F57B4D1A6BB506E9E
-:10180000DE247928E3F3E4ADFF9C6913F59F9CF98E
-:10181000BF41729AB226A77936E33CFF65C923908F
-:10182000E35840C18E58CFAF8F36112EF85D9B26FE
-:10183000DE2B2B0CD287F170FEF57E679D072815F5
-:10184000D398C5470B378879C02FBE3F2C9DED3DFF
-:10185000BD8AF9CAFA44FBA0F7EEFA977BFE408DE9
-:1018600033BE512B9CE33F983D87332E3A344F7D56
-:101870006C51BB90D796C542CE483EF6E4910FB767
-:10188000BEAB94F7A478AA3D6CAD27EC4E50996A94
-:10189000A57827580B06D71495937CDEF893552727
-:1018A000A657919D0F191407297E3495F5D938D183
-:1018B0007DEE0BC5798A02496FFDDC780FE7358B29
-:1018C000EB859F49E6CC774DBB901339371EACA40E
-:1018D0007044BF85EB785407A4FE2E5F6F3E3F5DDA
-:1018E000DD76FEBACE9138C61114A43E7C70DF16A8
-:1018F000ECBFAB79341F8FD1F3D67534AB3F5BD7D8
-:10190000895F5C5D67B4BDA4A7EA52EA3AF3CC3BB9
-:10191000EB8FE7D675DADBF19C6341515F99ADEB54
-:10192000DC1AB9A87C0E587EB9C4B2CB453D561C12
-:10193000B153E238E2E9867F3FB09CE4ACC1CB72A0
-:1019400000072720574FD66DD0BF564A7EE6551F59
-:10195000540BBB66D27C765C6CD34FB5E66F7DF0E2
-:101960000585C68F977B1A793EC8F83C5CEC4EAA79
-:10197000562B53BB5CCDC8C5346F095875F48C44E5
-:10198000CF6348ACDCF86064E6A76DC59427098294
-:1019900041266824A6ED2EA67F501588F04EA59E00
-:1019A000267BDBE62F74D8FF911E55D8D76A715F6E
-:1019B00066FCA4FEB5AD387E68678071D3A10A8F3E
-:1019C000D0AFA4C4F5E40ECD19F78C4F2E1178ECEE
-:1019D000A0D7A07B22C727C5F82DB1C6B4CCB8DBF1
-:1019E0001917F5E8CEB8684B79FD2B841761D0CB79
-:1019F000F978CDC2B537D738E3A4A2CABEE708A7A5
-:101A00006C1A1478786FB464C116B47FBF6AD71D9E
-:101A100071E2E6C1BBB96E34A802D7534736AAAC0F
-:101A20001F23DED78F6C61DC58C0749CD8A8962722
-:101A300072F4A5B4C367DD8B10F803E1656232CFA1
-:101A4000FBD20E617750B0D98FDBF2F2179F117481
-:101A50000E55405A271CD7B3234371E578059E09DC
-:101A6000DF0F46AB7A4ED2FA2FCB40E774CB6165DD
-:101A70004735EBE9AC3F6DF238E8E4F5C5FB687E2D
-:101A8000B81974B26BEDDDD8A73CC00615283FE04D
-:101A90008BFE2D9FB704FB01ECFBBB47930AF6FDC1
-:101AA000558995848B9FD975C7702C42FE4EE8B737
-:101AB0006FC3B6F82768FC2A2F04687FA04B51DA61
-:101AC0005F52DC6770EBC3DED4F7DB894F7B0D8997
-:101AD00059B4A967FD76BEB7142960DC34EA8D6F6E
-:101AE000667B749B5F4BB20F9CE638C2FB151F9060
-:101AF000DC4DECFA4D19E1EF1FB58BBA664077C6A5
-:101B0000D77E1865BFBDDA9CDA40DFAD6E52A9E220
-:101B1000014F379F61BE4D34F80C1FEE63A259622E
-:101B20003AFFA1C19BA6759E52A7645AF7A93FE050
-:101B3000DA95F9F43BBF5ED97AE41E3FD2B4DE4FAA
-:101B400072B117A66E25FA2467449ECA3D2EDE2187
-:101B5000FCD5DED46D350AE7B354AEB72B670DB3B1
-:101B600018670FCFC4FF9972AFC97645C449E59E87
-:101B7000A484F30DF5887B194345896192E721948C
-:101B80007B8E9322E23ED27879C4D89FB3DE78F37D
-:101B9000ED3564CF5E6C0830BE1F38F5377711BE67
-:101BA0006F95DFFEEEC3145755A8CCCF216FDFAB86
-:101BB0001407251B02BCDF538B54F0933D88DCF5E2
-:101BC00000C5D9707C03E4CAEB44B7D0D3890AA11D
-:101BD000F7D2C31B380E189764A6B359764C223C33
-:101BE000E6EBB6F34E22CF14B3CCD9C48647380FF8
-:101BF00075558FC8A3C6BAAD7C931C4CB25CDE1879
-:101C00007880F4DF54BC8EF878CD5967BC7C952B76
-:101C10005E76E7A3FEB7DDCA475879275B2E43D629
-:101C2000988926CB4EAFF2A5851CF6956BB573F55A
-:101C3000FBDF2CFC3CD5EFE77B643FEDD7B81F32D0
-:101C4000DFD95D8AF3BCDC1FE5E77FB9FAA894FB16
-:101C5000DDC8AADBFC3ADB93E928CDEBB6236EB9ED
-:101C6000D8DF5EE0F027F63E8B9A5BC5FDBBB36C18
-:101C700091614D70BA8D7D234C0573F17EA65FDCBA
-:101C8000737BDADAE729DAA78FF264627FCFF5EBAC
-:101C9000DC3EDF5FC3EDC60E10F500DB3E5C83F675
-:101CA00001E9D05E21FA640F88FF2591BB384FE629
-:101CB0008B2A1AE9BBBF623423E5D88789A2BE5FAD
-:101CC000DC4D76BF2CC8F2E83ED79A0E4FDE736D1E
-:101CD0006ADEC176E71CAE43F4473BB39DED10DAF4
-:101CE000055E77837A27EFC344BBC476A1EF6B7799
-:101CF000B05DF002C9B9DB0E9424857E277491BFD4
-:101D0000B3EF09CDDA055C278DEB3C8D769DFA4368
-:101D10006807689DA1E6D7FF9AD6FDC3FB057C2F17
-:101D20006A62E32B6C175E3C8736FB0ADA055B0FB1
-:101D30005F3B153B961BCF67F9BCFE8E13821E1AC4
-:101D400008BAF6C6F3C48997CA67302F0EC7A495A0
-:101D5000E93B45DD51653ACC5B774C7A0C4A0B0C7C
-:101D60004C2ADD56DD11A8EE68D71F73EA8E05CE2A
-:101D7000BAA39A4E31BE495B75C7DBD78ABAA35A5C
-:101D8000301DCCEEC3AE370ED2A3F26C7DFEAE8E0C
-:101D9000C4AE8E866C9D5197441DFCA598F9657A5A
-:101DA0000E9112F6FFEE3AA55D8F4478272572EA70
-:101DB0009B75F8DC5F92AD7FB9EB99F6BD8C3A75F7
-:101DC000FAD801A4CBC09D7EC60FF6FE061EFDE824
-:101DD000AB8948F63E805DEFB4EB9976DD13F73DB5
-:101DE00096BB6F7802D8EEC063FEA3E4DFDCFBFD98
-:101DF0005E2C717F47599E7D5F647D711D58F32372
-:101E0000EE227D7ECDA2A33DEE414B1F97AB22BFBC
-:101E10000D2195E39DD607832013CE2E528F915E20
-:101E20006C86E90EA2EF4058E0BCD4212FDBC9E359
-:101E30001D3AF3AF4C35F93E44D99703C66E9C2644
-:101E400075520B51FEA9A7DD3CDEC1FB18BD753DE7
-:101E5000ED03713BD9BB5F57DF17E17A3FDD7B2A8A
-:101E6000A6F8CF584C7990173AF2DF576A597C762A
-:101E70003DAF5BE4018ACF5201E339BE57FCA4C2F7
-:101E8000F3F5E014663DDF5F6A574B681E713F75DE
-:101E900020789AF9D552ED5BC179BDA2FC71E0B30F
-:101EA0001D226E5D8B73A938CF675A13DFA77D5350
-:101EB000AE34CA722CE2BB17C84E0AFB75AFA7310D
-:101EC0009B072B96132FD078382E29E41F7D96DCA4
-:101ED000D871E23BADE68BC477E48749EBDBF78052
-:101EE000ECF55FB2F890EC307F4AE35EB7D6A9D349
-:101EF0009231D2C3BA04CA83C4FAE3AAC30BB9703D
-:101F0000CBAB2D6FB375784B0E254DD46B51AE5EB8
-:101F1000E7FD3EA59FF448546F4F1C3D40DF5E66D1
-:101F2000BDFBEA36F32DDA77716BFC3F69DE5FEFBC
-:101F3000BA83EF055FEC3D8E96C57D51AAE30F0590
-:101F4000046E7E286638ECDDA24EC19F459D022FAF
-:101F50005D8F3233C5F74B0DBEF70DB09D71B46D7B
-:101F60009F46FB138FBF599DFD3ED50F93540F9A8B
-:101F70006F1FDE7D3B38AF3B50D1EA27FB83F6ADC8
-:101F800098FA43156634771FA92221E7C945226FC5
-:101F900041F9B464CE7DF2924E99CFD35601199295
-:101FA0001D5F50D4DD7CA8B83AFA1F9FD9C4F78BC7
-:101FB000F1F924A518AEEAD4455C1E31C0A478B36B
-:101FC000220EA4DF3E2DFB3DD551DB2AFAF8BEE5FB
-:101FD0007CF3C851FBFB047F7F53A7C6F3AA118F84
-:101FE000230F7021BAB9E9324874AB9E9F6EEA455F
-:101FF000D34DE89D9B5E8D16BD9E097F91CF071F37
-:10200000B4B19EF9343C27B6AB3B857D9183262441
-:102010008AC846C51141529EBD0FA80E6DD359D630
-:10202000049D65AD8FBFF3551890B881E89260BAF2
-:10203000B8E9807602C84EFCF0D12311C2A72DD892
-:102040008F0AFB013E6CBFDE21F862EBE93AF849EA
-:1020500050E4BF9DFEC26D4FEDF6212BFFEC7E2EAE
-:10206000750584FDD0C141F722EBF70BC786EB194C
-:102070001FA0FF4CD2BD98CEF2EA02EA5FE93AA275
-:10208000BB7EE8AE13BAEB8359B931FDB4CF77B557
-:10209000D3C98FE79117BB3D60E9DB60BF3FAFDE7F
-:1020A0001D407D27FE0D359B49AA1BED0D4F47595D
-:1020B0006E4EBEC5B858794136085F2A8AE073E78C
-:1020C000A269E663579309546F3AD0DFFB9DDC7930
-:1020D000BFDE9AF84A27CA49A13669D23C41C824D2
-:1020E000C9FFAC2D35FBF2E1A621CB8EBCD31ADFA4
-:1020F0004DDFD1B575E2FF9B31730FF52FD66ECD55
-:10210000A74F8A4DBB4BD6A7D3429F9A76B03E8D40
-:1021100054F431CE1AF9894C482A8B232D7D1A6943
-:102120003EC3FA6EEB55DAB63F4D422F288F40FE84
-:102130003B5461B2DDF896A54F0AEA09E993CFD284
-:10214000A790961D4FF9F136A2333E572AA6F9BB48
-:102150005093A57FA44F41BA3F0C8C038650EF28C3
-:102160002FE2D6AF962AE1379F684D3CD449F862FA
-:10217000D17ACECB0F55FCBE94F18B25FF59BC5BB9
-:10218000CFFEFCDCB0C7207DA823005D9FD503FBFC
-:10219000DCAB6764C8206BD6CC48DCDE3453C86D3A
-:1021A000CB4C805B73A694DBD84C98DBD699ABB94B
-:1021B0006D9B29E7B67D06F56025EAC34C25B79DE2
-:1021C00033D773DB35B38CDBEE99953CAE67660590
-:1021D000B76B673EC6EDCD33CD629D1A71AE3CFA4A
-:1021E0004065B02BA00F46128A480F3EF32ADB77DA
-:1021F0004DE53B4AA97023D7897CCA34EBC3B1268D
-:1022000061EFBB82824F6E7D78A735F1AB7CFA30EF
-:102210008B6F15D088FE2A587F2EFC80F8E737F4A4
-:10222000BD8D7BD5A8C97286F8E40CF1F37271C23A
-:102230002CCE5CAC321EB571E6C822C49995599C6F
-:1022400039D42CE2B2D4211FC76F5B2471BFECEAF2
-:10225000B6C47FB37E82C813256EF56B849B53E1B1
-:10226000CE6890F27A7B65A07C01E2900F789F4A5D
-:102270005CDC67BD487D7E3326ECBE3DBE0E4E7BEA
-:10228000FA2E01C7FC9AFED93CBF5D28B95C3FEB32
-:102290006D13764113762155D137CC7569975DB0B2
-:1022A000FD2CD2C3611796765976C1D2F3920AE11A
-:1022B0002F4BC82E207D9675D976C1E967151B87EF
-:1022C00074DB38C4B20BDDE23BC4ED0E3F8BECF6A1
-:1022D000430E2E46395ADE950787B03FCFF1730380
-:1022E00055D531FA2D41F82CC4483C4333FA5A23D2
-:1022F0008FDF4969F5AC07279536C8CDAF5CB29E34
-:10230000856DBF63B2DF718FB3F56DE8648F38A759
-:10231000E5874EE2F9CD1C7DEBD2843F42FF73335B
-:102320009DD3AD6F2D8BCD443CCF3E3FD925F0FEE4
-:102330008FD658B81771A511647C9F17377C92F817
-:10234000D7207EA7F118DA9F8EEE644AD159CF3F8D
-:1023500049EBAE6E9F92290F7453D3E8CB541241D0
-:102360003DFD5457C3E5EB6953AB55EFDB592A2EBE
-:102370003B5BED85E4DFC645B61EB8C73D5469F644
-:10238000E6A3C7B3163D06863D3D74E1CF968B9319
-:10239000CA52C63F79ECAD695C117B7B71F8E324CE
-:1023A000FA41E2FB79F0C7817CFC9F0F7F8C77CDEF
-:1023B000E28F31E2534BADC01FCF76C179E39BCBA7
-:1023C000C615B1D34CB7CBC5150F769D1F577CA74B
-:1023D0004BD84D459B66FB11BA4C5CE1B613881F88
-:1023E000FE95E96308BF6BFFDE842F50E6F82FB43B
-:1023F000338FD338C20D7479EC58B03529B11EC46F
-:102400009FA4E7A3E61296A32BA50F88137FD09570
-:10241000D3BF905E5CF4B8C98D9C07B4EB997F0C78
-:1024200084EA283FB2D32FDA2F15848E513BD62F62
-:10243000F2D07F0C2C4E53DE6CCC0B5C3F18940A10
-:102440008C63223FBA9C7F5F037D37527BA6CBAE65
-:10245000CBFF9DA35E1AD6B63DFE6669BEFD88FB26
-:10246000BD948AFF90EF8157689C3FB7E84169208F
-:10247000F6CFD5058CFF00614B538EDD4F75AC1345
-:102480007172A59FEB79322867281F3F4C6BF1FED4
-:102490007AB98E19B0FC212849FDE3BC5F9107B5DC
-:1024A0007FF7B76FF5FA627109793B8FB7E57F5F08
-:1024B00070D4AFD53AF4DDF1BB6E772BAF38A5B54C
-:1024C000E17EC77485EBAE078D4880EB2615227B35
-:1024D000EE5FE489A7F3E8E9B5DDB3F722785F6141
-:1024E0006B5FBE0E11AFCDB7DEFE7EE73DAB82DA8D
-:1024F000B849FEC45FD91727BAF9174524CAABCE2D
-:10250000D2BB5BB2EE69189916A4F7B0A587053562
-:1025100093190FD139BC6D25D1D65F938633344FD3
-:10252000ED24BC41FEA2D2DF9B6FDFD759FB1EF624
-:1025300026E38493862B15AE5F0E57E6F72F25DD35
-:10254000C2FEFA17EDE0F1B048E1FAB37B9CD22D60
-:10255000E4689FDAC7758CA145F7F37DB721FA21AE
-:10256000CD47D1EEFD70E681DDF8FC50FFF6C7DF08
-:10257000F4929C26B8DD77ED7E8DEE711EAAF76889
-:1025800094870BFB337EFA7D6678B5C87396B4E307
-:10259000B8DC7855AE08909D0DADC27972E2D031AD
-:1025A000D002B4EEBE906D1FA7FDC23E0A792AB2DA
-:1025B000C68EAC1275A9917576FE5FF02FFB7E7CFE
-:1025C000BBB82FA7EAC079685197E2D49E4EF7674F
-:1025D000EBC374AE324DD4A30E59F23568E5D9DDA4
-:1025E0007439B4788AFDC9A13553BDE43F429ADFFE
-:1025F000E826B93EEEDCD7DEE66907DE1869386DFD
-:10260000EDDFBD3F21F7CAD36F093B69E1FE90F1D1
-:102610007BC659F63DAEAED5420F8BAD7BF4C5916E
-:10262000B849F3EDBEF6B749AA131D2EB7EF167CD5
-:10263000DE790F03A6191787565B7539F96DBEFF52
-:102640000BB78A7B12F63D6F35A23AF202A5AEFBBC
-:102650005921571FE40DE7BDCFB6F397479F3F952C
-:10266000C3CFCF773BEF835FE8FB3FF6A79F3F8564
-:102670007E6E6CD5F9F5CFE6D3E1FE266E6D39B4EA
-:10268000E5324C47AC9FFFFBB1703C6FBDE5114B91
-:102690004FDCF2EA96D3625F9CFDFEE81AE73CF756
-:1026A000597A7E9F358FBA18CA090F8D86855E8E3E
-:1026B00006A0F7913CE77AAC5BE5F159B977E28285
-:1026C000A2CBC5052B5AADB8A284F56D6C55EB7342
-:1026D0002437EF915EE4D82777DEDCC6054A8FC049
-:1026E000A5CF845589FCBA169C66BC3CEBD72D1C43
-:1026F000E0F6EB7E6FB297F4CF5FA9DA7689ED470B
-:102700006577E01BC920FB0329D70F1ECADCC9F37C
-:10271000865D797388387F87B2B71B984E61DDB2CA
-:102720002FDD8AB887356A42EE3D9A31CFDB336FB1
-:10273000E8E2DF1FD838A292DE1F9CE2DFC7C03D6F
-:1027400090BBFEDE964DFC7B880BF1DDDE17DDCB0A
-:10275000CAD59B4BD58B976DBD084080F4E21CDC3D
-:10276000CB757418ED76F821AE282C601320FEF09E
-:10277000984AA365C7A4ACBE409755DF4E883A3D42
-:102780005198BE33ACCFCAE99604C5D790E1DF1D9E
-:10279000DAF6E51CFC92D74D3E2D49B3B8E96A0C38
-:1027A000DFE9F78C4B690B9A875AF7FE9780C1CF08
-:1027B000AB20CEEDB5D0C76D0D8C727B1D4C725B1E
-:1027C0000B53DCD6C1596E57802ED3222BC1948176
-:1027D000AF5E26B87F2324B96D86C4FB742774B01E
-:1027E0006CDB0AB257EFBBE864D3398FBE332EB42B
-:1027F000E961D3FD2132D20D17E66B2A2CEC6F5B19
-:10280000D314E3D7A2A01DFF0A39B7E7990FC7BABF
-:1028100071979F70D7CAB9727021DC65E3C4FF035A
-:1028200008E97101B048000000000000000000004D
-:102830000000001800000000000000000000004040
-:102840000000000000000000000000280000000060
-:102850000000000000000010000000000000000068
-:102860000000002000000000000000000000001038
-:102870000000000000000000000000080000000050
-:102880000000000000000000000000000000000048
-:102890000000000000000000000000000000000038
-:1028A0000000000000000000000000000000000028
-:1028B0000000000000000000000000000000000018
-:1028C0000000000000000000000000000000000008
-:1028D00000000000000000000000000000000000F8
-:1028E00000000000000000000000000000000000E8
-:1028F00000000000000000000000000000000000D8
-:1029000000000000000000000000000000000000C7
-:1029100000000000000000000000000000000000B7
-:1029200000000000000000000000000000000000A7
-:102930000000000000000000000000000000000097
-:102940000000000000000000000000000000000087
-:102950000000000000000000000000000000000077
-:102960000000000000000000000000000000000067
-:102970000000000000000000000000000000000057
-:102980000000000000000000000000000000000047
-:102990000000000000000000000090000010000097
-:1029A0000000000800009008001000000000000275
-:1029B00000009000001000000000001000009DA822
-:1029C000000000000000000880000000000000007F
-:1029D0000000000080000000000000000000000077
-:1029E000800000000000000000000000000091A036
-:1029F0000000000000000008000093C00001000477
-:102A000000000001000093C8000000000000000268
-:102A1000000093D00000000000000008000093D4E4
-:102A20000000000000000002000094980000000078
-:102A300000000008000093D8000800000000000813
-:102A400000009B3800400000000000400000941887
-:102A50000008000000000008000094580008000072
-:102A600000000008000094A800C8000000000098C2
-:102A700000009638009800000000002800009678BA
-:102A800000980000000000280000C0000540003051
-:102A9000000005400000CB200008000000000001FD
-:102AA0000000CB2100080000000000010000200809
-:102AB00000100000000000100000200000000000D6
-:102AC0000000000800009D600008000000000002F7
-:102AD00000009DA0000000000000000100000000B8
-:102AE00000000000000000000000000000000000E6
-:102AF00000000000000000000000000000000000D6
-:102B000080000000000000000000000080000000C5
-:102B10000000000000000000800000000000000035
-:102B20000000000080000000000000000000000025
-:102B30008000000000000000000000008000000095
-:102B40000000000000000000800000000000000005
-:102B500000000000800000000000000000000000F5
-:102B60008000000000000000000000008000000065
-:102B700000000000000000008000000000000000D5
-:102B800000000000800000000000000000000000C5
-:102B900080000000000000000000000000000000B5
-:102BA0000000000000000000000000000000000025
-:102BB0000000000000000000000000000000000015
-:102BC0000000000000000000000000000000000005
-:102BD0000000000000000000800000000000000075
-:102BE0000000000080000000000000000000000065
-:102BF0008000000000000000000000000000000055
-:102C00000000000000000000800000000000000044
-:102C10000000000080000000000000000000000034
-:102C20008000000000000000000000000000000024
-:102C30000000000000000000000000000000000094
-:102C40000000000000000000000000000000000084
-:102C50000000000000000000000000000000000074
-:102C60000000000000000000000000000000000064
-:102C700000000000000012C800800000000000807A
-:102C80000000000100000000000000000000A000A3
-:102C9000071000000000071000001EC80000000020
-:102CA000000000080000AEC000080000000000089E
-:102CB0000000AE4000080000000000080000AE80E8
-:102CC00000080000000000080000200800100000BC
-:102CD00000000010000020000000000000000008BC
-:102CE0000000A01007100040000000400000AF40AE
-:102CF00000080000000000010000AF4100080000D3
-:102D00000000000100001ED00000000000000001D3
-:102D100000001ED8000000000000000200001EDAC3
-:102D20000000000000000002000012B000080000D7
-:102D3000000000088000000000000000000000000B
-:102D40008000000000000000000000008000000083
-:102D500000000000000000008000000000000000F3
-:102D600000000000800000000000000000000000E3
-:102D70008000000000000000000000008000000053
-:102D800000000000000000008000000000000000C3
-:102D900000000000800000000000000000000000B3
-:102DA0000000000000000000000000000000000023
-:102DB0000000000000000000000000000000000013
-:102DC0000000000000000000000000000000000003
-:102DD0000000000000000000000000008000000073
-:102DE0000000000000000000800000000000000063
-:102DF00000000000000000000000000000000000D3
-:102E000080000000000000000000000080000000C2
-:102E10000000000000000000800000000000000032
-:102E20000000000080000000000000000000000022
-:102E30000000B00000180000000000180000B300FF
-:102E400000400000000000400000B300004000020D
-:102E5000000000010000B30100400002000000007B
-:102E600000008000004000000000004080000000E2
-:102E7000000000000000000000008000000800408A
-:102E8000000000040000800400080040000000046E
-:102E90000000BB0000280000000000280000BC402B
-:102EA00000100000000000100000880000800000FA
-:102EB0000000008000008800000800800000000280
-:102EC00000008C000020000000000020000020080E
-:102ED00000100000000000100000200000000000B2
-:102EE00000000008000011080008000000000008B1
-:102EF000000011680008000000000008000011A890
-:102F00000008000000000008000012700008000027
-:102F10000000000100001271000800000000000124
-:102F200000008D00001000040000000400001320C9
-:102F300000300018000000100000132800300018B6
-:102F400000000002800000000000000000000000FF
-:102F5000800000000000000000000000000011E8F8
-:102F600000000000000000018000000000000000E0
-:102F700000000000800000000000000000000000D1
-:102F80008000000000000000000000008000000041
-:102F900000000000000000008000000000000000B1
-:102FA00000000000800000000000000000000000A1
-:102FB0000000000000000000000000000000000011
-:102FC0000000000000000000000000000000000001
-:102FD00000000000000000000000000000000000F1
-:102FE00080000000000000000000000080000000E1
-:102FF00000000000000000000000000000000000D1
-:103000000000000000008308008000000000008035
-:103010000000000100000000000000000000200887
-:103020000010000000000010000020000000000060
-:103030000000000800008D100008000000000008DB
-:1030400000008D700008000000000008000084509F
-:10305000046000280000046000008EA0000800004A
-:103060000000000100008EA1000800000000000127
-:1030700000008408000800000000000800008448E8
-:10308000000000000000000100008DF400080000B6
-:103090000000000200008DF60008000000000002A1
-:1030A00000008E04001000000000000480000000FA
-:1030B0000000000000000000800000000000000090
-:1030C0000000000080000000000000000000000080
-:1030D00000000000000000000000000000000000F0
-:1030E00000000000000000000000000000000000E0
-:1030F00000000000000000000000000000000000D0
-:1031000080000000000000000000000080000000BF
-:1031100000000000000000000000000000000000AF
-:10312000000000008000000000000000000000001F
-:10313000800000000000000000000000800000008F
-:1031400000000000000000008000000000000000FF
-:1031500000000000000030000040000000000008F7
-:1031600000003008004000000000002800003390FC
-:1031700001C0001000000008000032000020000024
-:1031800000000020000037200000000000000008C0
-:103190000000102006200038000000080000A000F9
-:1031A000000000000000200000003EA90000000018
-:1031B0000000000100003EC8000000000000000206
-:1031C00000001C4000E00008000000088000000033
-:1031D00000000000000000000000400000080000A7
-:1031E0000000000100004001000800000000000194
-:1031F00000004040000800040000000200004060A1
-:103200000008000400000004000040000008000066
-:10321000000000040000400400080000000000045A
-:10322000000040400000000000000008000040488E
-:103230000000000000000008000080000000000006
-:1032400000000010000050400001000400000001D8
-:1032500000005000000000000000002000005008A6
-:1032600000100000000000040000500C00100000DE
-:1032700000000001000052C7000000000000000133
-:10328000000052C6000000000000000100003000F5
-:103290000030001800000004000030040030001866
-:1032A0000000000400003008003000180000000298
-:1032B0000000300A00300018000000020000300C4E
-:1032C00000300018000000010000300D0030001830
-:1032D000000000010000300E003000180000000166
-:1032E000000030100030001800000004000030140E
-:1032F00000300018000000040000500001000080B1
-:1033000000080004000050040100008000080004D0
-:103310000000000A000000000000000000005068EB
-:1033200001000080000000010000506901000080E1
-:10333000000000010000506C01000080000000024D
-:103340000000506E0100008000000002000050707C
-:1033500001000080000000040000507401000080A3
-:103360000000000400005066010000800000000220
-:103370000000506401000080000000010000506067
-:103380000100008000000002000050620100008087
-:103390000000000200005050010000800000000406
-:1033A000000050540100008000000004000050584C
-:1033B00001000080000000040000505C010000805B
-:1033C000000000040000507C0100008000000001AB
-:1033D0000000507D01000080000000010000401846
-:1033E00000100000000000040000409000100000E9
-:1033F00000000004000040980010000000000004DD
-:103400000000411000000000000000020000411216
-:103410000000000000000002000041140000000055
-:103420000000000200004116000000000000000241
-:103430000000604000080000000000020000604240
-:1034400000080000000000020000604400080000C6
-:103450000000000400006080000800000000000878
-:10346000000060C00040000800000008000060008C
-:1034700000080000000000020000600200080000D8
-:1034800000000001000060040008000000000002CD
-:103490000000634000080000000000080000638096
-:1034A0000008000000000004000063840008000021
-:1034B00000000001000063C00008000000000002DE
-:1034C000000063C400080000000000020000640067
-:1034D0000008000000000004000070000010000060
-:1034E0000000000400007004001000000000000450
-:1034F00000007008001000000000000400007000D0
-:103500000008000000000002000070020008000037
-:10351000000000010000700400080000000000022C
-:10352000000070400008000000000002000070442D
-:1035300000080000000000020000704600080000C3
-:1035400000000002000076480008000000000008AB
-:10355000000070800008000000000002000070847D
-:10356000000800000000000200007688000800004B
-:10357000000000080000804000080000000000017A
-:1035800000008041000800000000000100008042AF
-:103590000008000000000001000080430008000057
-:1035A0000000000100008000000800000000000290
-:1035B00000008002000800000000000100008004FC
-:1035C0000008000000000002000080C000080000A9
-:1035D00000000002000080C200080000000000029D
-:1035E000000080C40008000000000002000080808D
-:1035F00000080000000000010000808100080000B9
-:1036000000000001000080820008000000000001AE
-:10361000000080830008000000000001000080849A
-:103620000008000000000001000080850008000084
-:10363000000000010000808600080000000000017A
-:1036400000006000000800000000000200006002AE
-:1036500000080000000000010000600400080000F5
-:10366000000000020000604200C0001800000002DC
-:103670000000604000C00018000000020000604C24
-:1036800000C00018000000080000604400C00018DE
-:10369000000000080000605700C000180000000192
-:1036A0000000605400C000180000000200006056D6
-:1036B00000C0001800000001000066400008000083
-:1036C00000000008000066800008000000000008FC
-:1036D000000066C000080000000000080000D94299
-:1036E00000180000000000020000DE4000000000A2
-:1036F000000000000000E0000000000000000004E6
-:103700000000DD4000000000000000040000DD4477
-:1037100000000000000000040000DD480000000080
-:10372000000000040000DD4C000000000000000468
-:103730000000DD5000000000000000040000DD5427
-:1037400000000000000000040000DD580000000040
-:10375000000000040000DD40000000000000002028
-:103760000000DA0000000000000000040000DA00A1
-:1037700000000000000000680000BB6000000000C6
-:10378000000000000000D000000000000000000465
-:103790000000B0C000000000000000040000B0C441
-:1037A00000000000000000040000B0C8000000009D
-:1037B000000000040000B0C0000000000000001085
-:1037C0000000D6B000000000000000040000D6B4E5
-:1037D00000000000000000040000D6B80000000057
-:1037E000000000040000D6BC00000000000000043F
-:1037F0000000D6B000000000000000100000D34818
-:1038000000000000000000080000D3580000000085
-:103810000000008000000010000000000000000018
-:103820000000D35800000000000000080000000065
-:0838300006020900000000007F
-:00000001FF
diff --git a/firmware/bnx2x/bnx2x-e2-6.2.9.0.fw.ihex b/firmware/bnx2x/bnx2x-e2-6.2.9.0.fw.ihex
deleted file mode 100644
index 8405e719e7fb..000000000000
--- a/firmware/bnx2x/bnx2x-e2-6.2.9.0.fw.ihex
+++ /dev/null
@@ -1,15473 +0,0 @@
-:1000000000005310000000680000070C000053803F
-:100010000000318000005A90000000B000008C18F1
-:100020000000C13400008CD0000000D800014E0850
-:100030000000F26400014EE800000074000241502C
-:1000400000005250000241C8000000B40002942099
-:10005000000121EC000294D800000FFC0003B6C898
-:10006000000000040003C6C8020400480000000F9E
-:1000700002040054000000450204005C0000000679
-:100080000204007000000004020400780000000078
-:100090000204007C121700000204008022170000F6
-:1000A00002040084321700000604008800000005E6
-:1000B0000204009C12150000020400A0221500009A
-:1000C000020400A432150000060400A80000000489
-:1000D000020400B802100000020400BC001000007E
-:1000E000020400C010100000020400C42010000030
-:1000F000020400C830100000020400CC40100000D0
-:10010000060400D000000003020400DC0010000020
-:10011000020400E012140000020400E422140000B3
-:10012000020400E832140000020400EC4214000053
-:10013000060400F000000003010401240000000098
-:1001400001040128000000000104012C000000004F
-:100150000104013000000000020401D00000890603
-:1001600002040258000000360204025C000000365F
-:10017000020402600810000002040264081000007B
-:1001800002040004000000FF02040008000000FF59
-:100190000204000C000000FF02040010000000FF39
-:1001A000020400140000007F02040018000000FF99
-:1001B0000204001C000000FF02040020000000FFF9
-:1001C000020400240000003E020400280000000099
-:1001D0000204002C0000003F020400300000003F39
-:1001E000020400340000003F020400380000003F19
-:1001F0000204003C0000003F020400400000003FF9
-:10020000020400440000003F020404CC000000018E
-:1002100002042008000002110204200C0000020069
-:10022000020420100000020402042014000002193D
-:100230000204201C0000FFFF020420200000FFFF3A
-:10024000020420240000FFFF020420280000FFFF1A
-:1002500002042038000000200604203C0000000FAB
-:1002600002042078000000210604207C0000000F1A
-:10027000020420B800000001060420BC0000000FAA
-:10028000020420F800000001060420FC0000003FEA
-:10029000020421F800000001060421FC0000000F08
-:1002A0000204223807FFFFFF0204223C0000007F07
-:1002B0000204224007FFFFFF020422440000003F27
-:1002C00001042248000000000104224C000000004C
-:1002D000010422500000000001042254000000002C
-:1002E00001042258000000000104225C000000000C
-:1002F00001042260000000000104226400000000EC
-:1003000001042268000000000104226C00000000CB
-:1003100001042270000000000104227400000000AB
-:1003200001042278000000000104227C000000008B
-:10033000020422C00000FFFF020422C40000FFFFED
-:10034000020422C80000FFFF020422CC0000FFFFCD
-:100350000C042000000003E80A0420000000000153
-:100360000B042000000000030605400000000D0003
-:100370000205004400000020020500480000003291
-:1003800002050090021500200205009402150020CD
-:1003900002050098000000300205009C08100000D3
-:1003A000020500A000000036020500A40000003095
-:1003B000020500A800000031020500B000000004A2
-:1003C000020500B400000005020500C000000000A6
-:1003D000020500C400000004020500D40000000172
-:1003E00002050114000000010205011C00000001CB
-:1003F00002050120000000020205020400000001C5
-:100400000205020C0000004002050210000000403E
-:100410000205021C00000020020502200000001C52
-:100420000205022400000020060502400000000A28
-:1004300004050280002000000205005000000007B3
-:1004400002050054000000070205005800000000EB
-:100450000205005C000000080205006000000001C9
-:100460000605006400000003020500D80000000635
-:100470000205000400000001020500080000000160
-:100480000205000C00000001020500100000000140
-:100490000205001400000001020500180000000120
-:1004A0000205001C00000001020500200000000100
-:1004B00002050024000000010205002800000001E0
-:1004C0000205002C000000010205003000000001C0
-:1004D00002050034000000010205003800000001A0
-:1004E0000205003C00000001020500400000000180
-:1004F000020500E00000000D020500E80000000019
-:10050000020500F000000000020500F800000000F5
-:10051000020500E40000002D020500EC00000020B0
-:10052000020500F400000020020500FC000000208D
-:10053000020500E00000001D020500E800000010B8
-:10054000020500F000000010020500F80000001095
-:10055000020500E40000003D020500EC0000003050
-:10056000020500F400000030020500FC000000302D
-:10057000020500E00000004D020500E80000004018
-:10058000020500F000000040020500F800000040F5
-:10059000020500E40000006D020500EC00000060B0
-:1005A000020500F400000060020500FC000000608D
-:1005B000020500E00000005D020500E800000050B8
-:1005C000020500F000000050020500F80000005095
-:1005D000020500E40000007D020500EC0000007050
-:1005E000020500F400000070020500FC000000702D
-:1005F0000406100002000020020600DC00000001DA
-:100600000406020000030220020600DC00000000D5
-:100610000718040000AD0000081807D800050223E1
-:10062000071C000029920000071C8000312A0A657F
-:10063000071D000034A216B0071D80002E7A23D9B2
-:10064000071E000003502F78081E07F03F02022506
-:10065000021800BC0000003001180000000000007B
-:10066000011800040000000001180008000000004C
-:100670000118000C0000000001180010000000002C
-:100680000118001400000000021800200000000102
-:1006900002180024000000020218002800000003D5
-:1006A0000218002C000000000218003000000004B6
-:1006B0000218003400000001021800380000000099
-:1006C0000218003C00000001021800400000000475
-:1006D0000218004400000000021800480000000159
-:1006E0000218004C00000003021800500000000037
-:1006F0000218005400000001021800580000000415
-:100700000218005C000000000218006000000001F8
-:1007100002180064000000030218006800000000D6
-:100720000218006C000000010218007000000004B4
-:100730000218007400000000021800780000000495
-:100740000218007C00000003061800800000000270
-:10075000021800A400007FFF021800A8000003FF99
-:1007600002180224000000000218023400000000F9
-:100770000218024C00000000021802E4000000FF12
-:100780000618100000000400021B8BC000000001CE
-:10079000021B800000000034021B80400000001893
-:1007A000021B80800000000C021B80C000000020A3
-:1007B0000C1B8300000864700A1B830000000157B3
-:1007C0000B1B83000000055F0A1B83400000000034
-:1007D0000C1B8340000002260B1B8340000000011D
-:1007E000021B838000086470021B83C00000022685
-:1007F000021B1480000000010A1B1480000000008E
-:10080000021B944000000001061B944800000002F7
-:10081000061A1000000002B3041A1ACC00010227C5
-:10082000061A1AD000000008061A2008000000C8A6
-:10083000061A200000000002041A1BF8009002288B
-:10084000061A371800000004061A371000000002CC
-:10085000061A500000000002061A500800000004AA
-:10086000061A501800000004061A50280000000460
-:10087000061A503800000004061A50480000000410
-:10088000061A505800000004061A506800000004C0
-:10089000061A507800000002041A52C0000202B882
-:1008A000061A405000000006041A4068000202BA0E
-:1008B000041A4040000402BC041A8000000102C077
-:1008C000061A800400000003041A8010000102C10F
-:1008D000061A801400000003041A8020000102C2DE
-:1008E000061A802400000003041A8030000102C3AD
-:1008F000061A803400000003041A8040000102C47C
-:10090000061A804400000003041A8050000102C54A
-:10091000061A805400000003041A8060000102C619
-:10092000061A806400000003041A8070000102C7E8
-:10093000061A807400000003041A8080000102C8B7
-:10094000061A808400000003041A8090000102C986
-:10095000061A809400000003041A80A0000102CA55
-:10096000061A80A400000003041A80B0000102CB24
-:10097000061A80B400000003041A80C0000102CCF3
-:10098000061A80C400000003041A80D0000102CDC2
-:10099000061A80D400000003041A80E0000102CE91
-:1009A000061A80E400000003041A80F0000102CF60
-:1009B000061A80F400000003041A8100000102D02E
-:1009C000061A810400000003041A8110000102D1FC
-:1009D000061A811400000003041A8120000102D2CB
-:1009E000061A812400000003041A8130000102D39A
-:1009F000061A813400000003041A8140000102D469
-:100A0000061A814400000003041A8150000102D537
-:100A1000061A815400000003041A8160000102D606
-:100A2000061A816400000003041A8170000102D7D5
-:100A3000061A817400000003041A8180000102D8A4
-:100A4000061A818400000003041A8190000102D973
-:100A5000061A819400000003041A81A0000102DA42
-:100A6000061A81A400000003041A81B0000102DB11
-:100A7000061A81B400000003041A81C0000102DCE0
-:100A8000061A81C400000003041A81D0000102DDAF
-:100A9000061A81D400000003041A81E0000102DE7E
-:100AA000061A81E400000003041A81F0000102DF4D
-:100AB000061A81F400000003041A8200000102E01B
-:100AC000061A820400000003041A8210000102E1E9
-:100AD000061A821400000003041A8220000102E2B8
-:100AE000061A822400000003041A8230000102E387
-:100AF000061A823400000003041A8240000102E456
-:100B0000061A824400000003041A8250000102E524
-:100B1000061A825400000003041A8260000102E6F3
-:100B2000061A826400000003041A8270000102E7C2
-:100B3000061A827400000003041A8280000102E891
-:100B4000061A828400000003041A8290000102E960
-:100B5000061A829400000003041A82A0000102EA2F
-:100B6000061A82A400000003041A82B0000102EBFE
-:100B7000061A82B400000003041A82C0000102ECCD
-:100B8000061A82C400000003041A82D0000102ED9C
-:100B9000061A82D400000003041A82E0000102EE6B
-:100BA000061A82E400000003041A82F0000102EF3A
-:100BB000061A82F400000003041A8300000102F008
-:100BC000061A830400000003041A8310000102F1D6
-:100BD000061A831400000003041A8320000102F2A5
-:100BE000061A832400000003041A8330000102F374
-:100BF000061A833400000003041A8340000102F443
-:100C0000061A834400000003041A8350000102F511
-:100C1000061A835400000003041A8360000102F6E0
-:100C2000061A836400000003041A8370000102F7AF
-:100C3000061A837400000003041A8380000102F87E
-:100C4000061A838400000003041A8390000102F94D
-:100C5000061A839400000003041A83A0000102FA1C
-:100C6000061A83A400000003041A83B0000102FBEB
-:100C7000061A83B400000003041A83C0000102FCBA
-:100C8000061A83C400000003041A83D0000102FD89
-:100C9000061A83D400000003041A83E0000102FE58
-:100CA000061A83E400000003041A83F0000102FF27
-:100CB000061A83F400000003041A840000010300F4
-:100CC000061A840400000003041A841000010301C2
-:100CD000061A841400000003041A84200001030291
-:100CE000061A842400000003041A84300001030360
-:100CF000061A843400000003041A8440000103042F
-:100D0000061A844400000003041A845000010305FD
-:100D1000061A845400000003041A846000010306CC
-:100D2000061A846400000003041A8470000103079B
-:100D3000061A847400000003041A8480000103086A
-:100D4000061A848400000003041A84900001030939
-:100D5000061A849400000003041A84A00001030A08
-:100D6000061A84A400000003041A84B00001030BD7
-:100D7000061A84B400000003041A84C00001030CA6
-:100D8000061A84C400000003041A84D00001030D75
-:100D9000061A84D400000003041A84E00001030E44
-:100DA000061A84E400000003041A84F00001030F13
-:100DB000061A84F400000003041A850000010310E1
-:100DC000061A850400000003041A851000010311AF
-:100DD000061A851400000003041A8520000103127E
-:100DE000061A852400000003041A8530000103134D
-:100DF000061A853400000003041A8540000103141C
-:100E0000061A854400000003041A855000010315EA
-:100E1000061A855400000003041A856000010316B9
-:100E2000061A856400000003041A85700001031788
-:100E3000061A857400000003041A85800001031857
-:100E4000061A858400000003041A85900001031926
-:100E5000061A859400000003041A85A00001031AF5
-:100E6000061A85A400000003041A85B00001031BC4
-:100E7000061A85B400000003041A85C00001031C93
-:100E8000061A85C400000003041A85D00001031D62
-:100E9000061A85D400000003041A85E00001031E31
-:100EA000061A85E400000003041A85F00001031F00
-:100EB000061A85F400000003041A860000010320CE
-:100EC000061A860400000003041A8610000103219C
-:100ED000061A861400000003041A8620000103226B
-:100EE000061A862400000003041A8630000103233A
-:100EF000061A863400000003041A86400001032409
-:100F0000061A864400000003041A865000010325D7
-:100F1000061A865400000003041A866000010326A6
-:100F2000061A866400000003041A86700001032775
-:100F3000061A867400000003041A86800001032844
-:100F4000061A868400000003041A86900001032913
-:100F5000061A869400000003041A86A00001032AE2
-:100F6000061A86A400000003041A86B00001032BB1
-:100F7000061A86B400000003041A86C00001032C80
-:100F8000061A86C400000003041A86D00001032D4F
-:100F9000061A86D400000003041A86E00001032E1E
-:100FA000061A86E400000003041A86F00001032FED
-:100FB000061A86F400000003041A870000010330BB
-:100FC000061A870400000003041A87100001033189
-:100FD000061A871400000003041A87200001033258
-:100FE000061A872400000003041A87300001033327
-:100FF000061A873400000003041A874000010334F6
-:10100000061A874400000003041A875000010335C4
-:10101000061A875400000003041A87600001033693
-:10102000061A876400000003041A87700001033762
-:10103000061A877400000003041A87800001033831
-:10104000061A878400000003041A87900001033900
-:10105000061A879400000003041A87A00001033ACF
-:10106000061A87A400000003041A87B00001033B9E
-:10107000061A87B400000003041A87C00001033C6D
-:10108000061A87C400000003041A87D00001033D3C
-:10109000061A87D400000003041A87E00001033E0B
-:1010A000061A87E400000003041A87F00001033FDA
-:1010B000061A87F400000003041A880000010340A8
-:1010C000061A880400000003041A88100001034176
-:1010D000061A881400000003041A88200001034245
-:1010E000061A882400000003041A88300001034314
-:1010F000061A883400000003041A884000010344E3
-:10110000061A884400000003041A885000010345B1
-:10111000061A885400000003041A88600001034680
-:10112000061A886400000003041A8870000103474F
-:10113000061A887400000003041A8880000103481E
-:10114000061A888400000003041A889000010349ED
-:10115000061A889400000003041A88A00001034ABC
-:10116000061A88A400000003041A88B00001034B8B
-:10117000061A88B400000003041A88C00001034C5A
-:10118000061A88C400000003041A88D00001034D29
-:10119000061A88D400000003041A88E00001034EF8
-:1011A000061A88E400000003041A88F00001034FC7
-:1011B000061A88F400000003041A89000001035095
-:1011C000061A890400000003041A89100001035163
-:1011D000061A891400000003041A89200001035232
-:1011E000061A892400000003041A89300001035301
-:1011F000061A893400000003041A894000010354D0
-:10120000061A894400000003041A8950000103559E
-:10121000061A895400000003041A8960000103566D
-:10122000061A896400000003041A8970000103573C
-:10123000061A897400000003041A8980000103580B
-:10124000061A898400000003041A899000010359DA
-:10125000061A899400000003041A89A00001035AA9
-:10126000061A89A400000003041A89B00001035B78
-:10127000061A89B400000003041A89C00001035C47
-:10128000061A89C400000003041A89D00001035D16
-:10129000061A89D400000003041A89E00001035EE5
-:1012A000061A89E400000003041A89F00001035FB4
-:1012B000061A89F400000003041A8A000001036082
-:1012C000061A8A0400000003041A8A100001036150
-:1012D000061A8A1400000003041A8A20000103621F
-:1012E000061A8A2400000003041A8A3000010363EE
-:1012F000061A8A3400000003041A8A4000010364BD
-:10130000061A8A4400000003041A8A50000103658B
-:10131000061A8A5400000003041A8A60000103665A
-:10132000061A8A6400000003041A8A700001036729
-:10133000061A8A7400000003041A8A8000010368F8
-:10134000061A8A8400000003041A8A9000010369C7
-:10135000061A8A9400000003041A8AA00001036A96
-:10136000061A8AA400000003041A8AB00001036B65
-:10137000061A8AB400000003041A8AC00001036C34
-:10138000061A8AC400000003041A8AD00001036D03
-:10139000061A8AD400000003041A8AE00001036ED2
-:1013A000061A8AE400000003041A8AF00001036FA1
-:1013B000061A8AF400000003041A8B00000103706F
-:1013C000061A8B0400000003041A8B10000103713D
-:1013D000061A8B1400000003041A8B20000103720C
-:1013E000061A8B2400000003041A8B3000010373DB
-:1013F000061A8B3400000003041A8B4000010374AA
-:10140000061A8B4400000003041A8B500001037578
-:10141000061A8B5400000003041A8B600001037647
-:10142000061A8B6400000003041A8B700001037716
-:10143000061A8B7400000003041A8B8000010378E5
-:10144000061A8B8400000003041A8B9000010379B4
-:10145000061A8B9400000003041A8BA00001037A83
-:10146000061A8BA400000003041A8BB00001037B52
-:10147000061A8BB400000003041A8BC00001037C21
-:10148000061A8BC400000003041A8BD00001037DF0
-:10149000061A8BD400000003041A8BE00001037EBF
-:1014A000061A8BE400000003041A8BF00001037F8E
-:1014B000061A8BF400000003041A8C00000103805C
-:1014C000061A8C0400000003041A8C10000103812A
-:1014D000061A8C1400000003041A8C2000010382F9
-:1014E000061A8C2400000003041A8C3000010383C8
-:1014F000061A8C3400000003041A8C400001038497
-:10150000061A8C4400000003041A8C500001038565
-:10151000061A8C5400000003041A8C600001038634
-:10152000061A8C6400000003041A8C700001038703
-:10153000061A8C7400000003041A8C8000010388D2
-:10154000061A8C8400000003041A8C9000010389A1
-:10155000061A8C9400000003041A8CA00001038A70
-:10156000061A8CA400000003041A8CB00001038B3F
-:10157000061A8CB400000003041A8CC00001038C0E
-:10158000061A8CC400000003041A8CD00001038DDD
-:10159000061A8CD400000003041A8CE00001038EAC
-:1015A000061A8CE400000003041A8CF00001038F7B
-:1015B000061A8CF400000003041A8D000001039049
-:1015C000061A8D0400000003041A8D100001039117
-:1015D000061A8D1400000003041A8D2000010392E6
-:1015E000061A8D2400000003041A8D3000010393B5
-:1015F000061A8D3400000003041A8D400001039484
-:10160000061A8D4400000003041A8D500001039552
-:10161000061A8D5400000003041A8D600001039621
-:10162000061A8D6400000003041A8D7000010397F0
-:10163000061A8D7400000003041A8D8000010398BF
-:10164000061A8D8400000003041A8D90000103998E
-:10165000061A8D9400000003041A8DA00001039A5D
-:10166000061A8DA400000003041A8DB00001039B2C
-:10167000061A8DB400000003041A8DC00001039CFB
-:10168000061A8DC400000003041A8DD00001039DCA
-:10169000061A8DD400000003041A8DE00001039E99
-:1016A000061A8DE400000003041A8DF00001039F68
-:1016B000061A8DF400000003041A8E00000103A036
-:1016C000061A8E0400000003041A8E10000103A104
-:1016D000061A8E1400000003041A8E20000103A2D3
-:1016E000061A8E2400000003041A8E30000103A3A2
-:1016F000061A8E3400000003041A8E40000103A471
-:10170000061A8E4400000003041A8E50000103A53F
-:10171000061A8E5400000003041A8E60000103A60E
-:10172000061A8E6400000003041A8E70000103A7DD
-:10173000061A8E7400000003041A8E80000103A8AC
-:10174000061A8E8400000003041A8E90000103A97B
-:10175000061A8E9400000003041A8EA0000103AA4A
-:10176000061A8EA400000003041A8EB0000103AB19
-:10177000061A8EB400000003041A8EC0000103ACE8
-:10178000061A8EC400000003041A8ED0000103ADB7
-:10179000061A8ED400000003041A8EE0000103AE86
-:1017A000061A8EE400000003041A8EF0000103AF55
-:1017B000061A8EF400000003041A8F00000103B023
-:1017C000061A8F0400000003041A8F10000103B1F1
-:1017D000061A8F1400000003041A8F20000103B2C0
-:1017E000061A8F2400000003041A8F30000103B38F
-:1017F000061A8F3400000003041A8F40000103B45E
-:10180000061A8F4400000003041A8F50000103B52C
-:10181000061A8F5400000003041A8F60000103B6FB
-:10182000061A8F6400000003041A8F70000103B7CA
-:10183000061A8F7400000003041A8F80000103B899
-:10184000061A8F8400000003041A8F90000103B968
-:10185000061A8F9400000003041A8FA0000103BA37
-:10186000061A8FA400000003041A8FB0000103BB06
-:10187000061A8FB400000003041A8FC0000103BCD5
-:10188000061A8FC400000003041A8FD0000103BDA4
-:10189000061A8FD400000003041A8FE0000103BE73
-:1018A000061A8FE400000007041A62C0002003BF7C
-:1018B000061A1AF000000042061AAF0000000008E5
-:1018C000061AE00000000540061AD0000000007271
-:1018D000061AD24800000010061AD6B000000020F8
-:1018E000061AD47000000090061AD46800000002A6
-:1018F000061AA000000001C4061A30000000001003
-:10190000061A308000000010061A31000000001096
-:10191000061A318000000010061A33000000001281
-:10192000061A339000000070061AD4580000000216
-:10193000061AD34800000002061AD35800000020FF
-:10194000061AA710000001C4061A3040000000105B
-:10195000061A30C000000010061A314000000010C6
-:10196000061A31C000000010061A334800000012A9
-:10197000061A355000000070061AD46000000002FC
-:10198000061AD35000000002061AD3D80000002027
-:10199000021AAE2000000000061A500000000002EB
-:1019A000061A508000000012041A4000000203DFF3
-:1019B000041A63C0000203E1061A7000000000046C
-:1019C000061A320000000008021AAE2400000000CF
-:1019D000061A501000000002061A50C8000000123B
-:1019E000041A4008000203E3041A63C8000203E576
-:1019F000061A701000000004061A322000000008C9
-:101A0000021AAE2800000000061A50200000000252
-:101A1000061A511000000012041A4010000203E7D9
-:101A2000041A63D0000203E9061A702000000004C3
-:101A3000061A324000000008021AAE2C0000000016
-:101A4000061A503000000002061A51580000001219
-:101A5000041A4018000203EB041A63D8000203EDD5
-:101A6000061A703000000004061A326000000008F8
-:101A7000021AAE3000000000061A504000000002BA
-:101A8000061A51A000000012041A4020000203EFC1
-:101A9000041A63E0000203F1061A7040000000041B
-:101AA000061A328000000008021AAE34000000005E
-:101AB000061A505000000002061A51E800000012F9
-:101AC000041A4028000203F3041A63E8000203F535
-:101AD000061A705000000004061A32A00000000828
-:101AE000021AAE3800000000061A50600000000222
-:101AF000061A523000000012041A4030000203F7A8
-:101B0000041A63F0000203F9061A70600000000472
-:101B1000061A32C000000008021AAE3C00000000A5
-:101B2000061A507000000002061A527800000012D7
-:101B3000041A4038000203FB041A63F8000203FD94
-:101B4000061A707000000004061A32E00000000857
-:101B50000200A2A4000002090200A270000000001E
-:101B60000200A274000000000200A2700000000049
-:101B70000200A274000000000200A2700000000039
-:101B80000200A274000000000200A2700000000029
-:101B90000200A27400000000020100B40000000175
-:101BA000020100B800000001020100CC00000001A9
-:101BB000020100D000000001020100DC0000000171
-:101BC0000201010000000001020101040000000107
-:101BD0000201007C003000000201008400000028A7
-:101BE0000201008C0000000002010130000000042E
-:101BF0000201025C00000001020103280000000055
-:101C0000020160580000FFFF020160700000000741
-:101C10000201055400000030020100C40000000170
-:101C2000020100F800000001020100F000000001C4
-:101C3000020100800030000002010088000000283E
-:101C400002010090000000000201013400000004C5
-:101C5000020102DC000000010201032C0000000070
-:101C60000201605C0000FFFF0201607400000007D9
-:101C70000201056400000030020100C800000001FC
-:101C8000020100FC00000001020100F4000000015C
-:101C9000020C100000000028020C200800000211B5
-:101CA000020C200C00000200020C201000000204B4
-:101CB000020C201C0000FFFF020C20200000FFFF90
-:101CC000020C20240000FFFF020C20280000FFFF70
-:101CD000020C203800000000020C203C00000037FD
-:101CE000020C204000000021020C204400000020D3
-:101CF000060C20480000001D020C20BC0000000162
-:101D0000060C20C00000003F020C21BC00000001B6
-:101D1000020C21C000000001020C21C400000001DF
-:101D2000060C21C80000001C020C223807FFFFFF30
-:101D3000020C223C0000007F020C224007FFFFFF44
-:101D4000020C22440000003F010C22480000000069
-:101D5000010C224C00000000010C22500000000089
-:101D6000010C225400000000010C22580000000069
-:101D7000010C225C00000000010C22600000000049
-:101D8000010C226400000000010C22680000000029
-:101D9000010C226C00000000010C22700000000009
-:101DA000010C227400000000010C227800000000E9
-:101DB000010C227C00000000020C22D80000FFFF72
-:101DC000020C22DC0000FFFF020C22E00000FFFFFB
-:101DD000020C22E40000FFFF0C0C2000000003E8CE
-:101DE0000A0C2000000000010B0C20000000000382
-:101DF000020C400800001011020C400C0000100002
-:101E0000020C401000001004020C401400001021CD
-:101E1000020C401C0000FFFF020C40200000FFFFEE
-:101E2000020C40240000FFFF020C40280000FFFFCE
-:101E3000020C403800000046020C403C0000000C40
-:101E4000060C404000000002020C40480000001850
-:101E5000020C404C000000F0060C40500000001F37
-:101E6000020C40CC00000001060C40D00000003AFB
-:101E7000020C41B800000001060C41BC0000000348
-:101E8000020C41C800000001020C41CC000000011E
-:101E9000060C41D00000001A020C423807FFFFFF79
-:101EA000020C423C0000007F020C424007FFFFFF93
-:101EB000020C42440000003F010C424800000000B8
-:101EC000010C424C00000000010C425000000000D8
-:101ED000010C425400000000010C425800000000B8
-:101EE000010C425C00000000010C42600000000098
-:101EF000010C426400000000010C42680000000078
-:101F0000010C426C00000000010C42700000000057
-:101F1000010C427400000000010C42780000000037
-:101F2000010C427C00000000010C42800000000017
-:101F3000020C42D80000FFFF020C42DC0000FFFF51
-:101F4000020C42E00000FFFF020C42E40000FFFF31
-:101F50000C0C4000000003E80A0C400000000001E7
-:101F60000B0C400000000003060D400000000A00BA
-:101F7000020D004400000032020D008C021500200A
-:101F8000020D009002150020020D009408100000C0
-:101F9000020D009800000036020D00A000000000B5
-:101FA000020D00A400000004020D00A800000004BF
-:101FB000060D00AC00000002020D00B80000000297
-:101FC000020D00C000000001020D00C80000000268
-:101FD000020D00CC00000002020D015C00000001B7
-:101FE000020D016400000001020D01680000000202
-:101FF000020D020400000001020D020C000000208E
-:10200000020D021000000040020D0214000000400A
-:10201000020D022000000003020D0224000000183F
-:10202000060D028000000012040D0300001803FFDB
-:10203000060D03600000000C020D004C00000001C2
-:10204000020D005000000002020D005400000000CC
-:10205000020D005800000008060D005C000000049E
-:10206000020D00C400000004020D00040000000185
-:10207000020D000800000001020D000C000000012C
-:10208000020D001000000001020D0014000000010C
-:10209000020D001800000001020D001C00000001EC
-:1020A000020D002000000001020D002400000001CC
-:1020B000020D002800000001020D002C00000001AC
-:1020C000020D003000000001020D0034000000018C
-:1020D000020D003800000001020D003C000000016C
-:1020E000020D011400000009020D011C0000000A8D
-:1020F000020D012400000000020D012C0000000070
-:10210000020D013400000000020D013C0000000B34
-:10211000020D014400000000020D0118000000291A
-:10212000020D01200000002A020D012800000020FD
-:10213000020D013000000020020D013800000020D7
-:10214000020D01400000002B020D0148000000209C
-:10215000020D011400000019020D011C0000001AFC
-:10216000020D012400000010020D012C00000010DF
-:10217000020D013400000010020D013C0000001BA4
-:10218000020D014400000010020D0118000000398A
-:10219000020D01200000003A020D0128000000306D
-:1021A000020D013000000030020D01380000003047
-:1021B000020D01400000003B020D0148000000300C
-:1021C000020D011400000049020D011C0000004A2C
-:1021D000020D012400000040020D012C000000400F
-:1021E000020D013400000040020D013C0000004BD4
-:1021F000020D014400000040020D011800000069BA
-:10220000020D01200000006A020D0128000000609C
-:10221000020D013000000060020D01380000006076
-:10222000020D01400000006B020D0148000000603B
-:10223000020D011400000059020D011C0000005A9B
-:10224000020D012400000050020D012C000000507E
-:10225000020D013400000050020D013C0000005B43
-:10226000020D014400000050020D01180000007929
-:10227000020D01200000007A020D0128000000700C
-:10228000020D013000000070020D013800000070E6
-:10229000020D01400000007B020D014800000070AB
-:1022A000060E200000000800020E004C0000003264
-:1022B000020E009402150020020E00980215002064
-:1022C000020E009C00000030020E00A0081000006A
-:1022D000020E00A400000036020E00A8000000302C
-:1022E000020E00AC00000031020E00B4000000033A
-:1022F000020E00B800000000020E00C40000000042
-:10230000020E00CC00000006020E00D80000000102
-:10231000020E014400000001020E014C0000000109
-:10232000020E015000000002020E02040000000133
-:10233000020E020C00000040020E021000000040DD
-:10234000020E021C00000004020E02200000002009
-:10235000020E02240000000E020E02280000001BE4
-:10236000060E030000000012040E0280001B04177A
-:10237000060E02EC00000005020E00540000000CE6
-:10238000020E00580000000C020E005C000000006D
-:10239000020E006000000010020E00640000001039
-:1023A000060E006800000003020E00DC00000003BF
-:1023B000020E000400000001020E000800000001EF
-:1023C000020E000C00000001020E001000000001CF
-:1023D000020E001400000001020E001800000001AF
-:1023E000020E001C00000001020E0020000000018F
-:1023F000020E002400000001020E0028000000016F
-:10240000020E002C00000001020E0030000000014E
-:10241000020E003400000001020E0038000000012E
-:10242000020E003C00000001020E0040000000010E
-:10243000020E004400000001020E01100000000F17
-:10244000020E011800000000020E01200000000032
-:10245000020E012800000000020E01140000002FEF
-:10246000020E011C00000020020E012400000020CA
-:10247000020E012C00000020020E01100000001FBF
-:10248000020E011800000010020E012000000010D2
-:10249000020E012800000010020E01140000003F8F
-:1024A000020E011C00000030020E0124000000306A
-:1024B000020E012C00000030020E01100000004F3F
-:1024C000020E011800000040020E01200000004032
-:1024D000020E012800000040020E01140000006FEF
-:1024E000020E011C00000060020E012400000060CA
-:1024F000020E012C00000060020E01100000005FBF
-:10250000020E011800000050020E012000000050D1
-:10251000020E012800000050020E01140000007F8E
-:10252000020E011C00000070020E01240000007069
-:10253000020E012C000000700730040000D60000DD
-:10254000083007D80005043207340000322B0000A1
-:1025500007348000314B0C8B0735000038C518DE7E
-:10256000073580002F90271007360000268F32F5A0
-:102570000836716031D40434023000BC00000030F1
-:1025800001300000000000000130000400000000E5
-:1025900001300008000000000130000C00000000C5
-:1025A00001300010000000000130001400000000A5
-:1025B0000230002000000001023000240000000270
-:1025C00002300028000000030230002C0000000050
-:1025D000023000300000000402300034000000012E
-:1025E00002300038000000000230003C0000000112
-:1025F00002300040000000040230004400000000EF
-:1026000002300048000000010230004C00000003CE
-:1026100002300050000000000230005400000001B1
-:1026200002300058000000040230005C000000008E
-:10263000023000600000000102300064000000036E
-:1026400002300068000000000230006C0000000151
-:10265000023000700000000402300074000000002E
-:1026600002300078000000040230007C000000030B
-:102670000630008000000002023000A400007FFF4E
-:10268000023000A8000003FF023002240000000016
-:1026900002300234000000000230024C0000000052
-:1026A000023002E40000FFFF0630200000000800B6
-:1026B00002338BC000000001023380000000001ACA
-:1026C000023380400000004E023380800000001082
-:1026D000023380C0000000200C33830000086470C7
-:1026E0000A338300000001570B3383000000055FAD
-:1026F0000A338340000000000C33834000000226B0
-:102700000B338340000000010233838000086470B3
-:10271000023383C00000022602331480000000014F
-:102720000A3314800000000006328000000001021D
-:1027300006322008000000C8063220000000000217
-:1027400004328520008F04360632875C00000009C1
-:1027500006323EB00000000606323ED00000000205
-:1027600006323E800000000A04323EA8000204C582
-:1027700006323E00000000200632500000000940F2
-:102780000632400000000004043294C0000204C776
-:1027900006324110000000020632D0000000007036
-:1027A0000632DB00000000D40632DEA0000000028A
-:1027B0000632E00000000800063324000000011883
-:1027C0000632100000000188063250000000002090
-:1027D00006325100000000200632520000000020A6
-:1027E0000632530000000020063254000000002092
-:1027F000063255000000002006325600000000207E
-:102800000632570000000020063258000000002069
-:10281000063259000000002006325A000000002055
-:1028200006325B000000002006325C000000002041
-:1028300006325D000000002006325E00000000202D
-:1028400006325F0000000020063284F00000000223
-:1028500004328500000204C9063285080000000227
-:102860000632DE90000000020633286000000118E6
-:102870000632162000000188063250800000002039
-:1028800006325180000000200632528000000020F5
-:1028900006325380000000200632548000000020E1
-:1028A00006325580000000200632568000000020CD
-:1028B00006325780000000200632588000000020B9
-:1028C000063259800000002006325A8000000020A5
-:1028D00006325B800000002006325C800000002091
-:1028E00006325D800000002006325E80000000207D
-:1028F00006325F8000000020063284F800000002EB
-:1029000004328510000204CB063285180000000254
-:102910000632DE98000000020232845000000000FF
-:102920000632401000000002023284540000000011
-:1029300006324020000000020232845800000000ED
-:1029400006324030000000020232845C00000000C9
-:1029500006324040000000020232846000000000A5
-:102960000632405000000002023284640000000081
-:10297000063240600000000202328468000000005D
-:1029800006324070000000020232846C0000000039
-:10299000063240800000000207200400007300009F
-:1029A00008200780001004CD072400002AE400005E
-:1029B0000724800027670ABA0824D35063FC04CF99
-:1029C000022000BC000000300120000000000000D8
-:1029D00001200004000000000120000800000000A9
-:1029E0000120000C00000000012000100000000089
-:1029F000012000140000000002200020000000015F
-:102A00000220002400000002022000280000000331
-:102A10000220002C00000000022000300000000412
-:102A200002200034000000010220003800000000F5
-:102A30000220003C000000010220004000000004D1
-:102A400002200044000000000220004800000001B5
-:102A50000220004C00000003022000500000000093
-:102A60000220005400000001022000580000000471
-:102A70000220005C00000000022000600000000155
-:102A80000220006400000003022000680000000033
-:102A90000220006C00000001022000700000000411
-:102AA00002200074000000000220007800000004F2
-:102AB0000220007C000000030620008000000002CD
-:102AC000022000A400007FFF022000A8000003FFF6
-:102AD0000220022400000000022002340000000056
-:102AE0000220024C00000000022002E40000FFFF70
-:102AF000062020000000080002238BC00000000117
-:102B00000223800000000010022380400000001219
-:102B10000223808000000030022380C00000000EED
-:102B20000C238300000864700A238300000001570F
-:102B30000B2383000000055F0A2383400000000090
-:102B40000C238340000002260B2383400000000179
-:102B50000223838000086470022383C000000226E1
-:102B600002231480000000010A23148000000000EA
-:102B7000062210000000004206222008000000C8C3
-:102B800006222000000000020622B00000000330F0
-:102B90000622F400000000530422F54C000104D189
-:102BA0000622F550000000030422F55C000104D267
-:102BB0000622F560000000030422F56C000104D336
-:102BC0000622F570000000030422F57C000104D405
-:102BD0000622F580000000030422F58C000104D5D4
-:102BE0000622F590000000030422F59C000104D6A3
-:102BF0000622F5A0000000030422F5AC000104D772
-:102C00000622F5B0000000030422F5BC000104D840
-:102C10000622F5C0000000460622E2000000044043
-:102C200004221240009004D906223000000000C0A7
-:102C30000622670000000100062290000000040048
-:102C400004226B0800200569062211F0000000062E
-:102C50000422120800060589062212200000000244
-:102C600006224000000005C00622C0000000000649
-:102C70000422C0180006058F0622C0300000000A9A
-:102C80000422C058000605950622C0700000000A04
-:102C90000422C0980006059B0622C0B00000000A6E
-:102CA0000422C0D8000605A10622C0F00000000AD8
-:102CB0000422C118000605A70622C1300000000A40
-:102CC0000422C158000605AD0622C1700000000AAA
-:102CD0000422C198000605B30622C1B00000000A14
-:102CE0000422C1D8000605B90622C1F00000000A7E
-:102CF0000422C218000605BF0622C2300000000AE6
-:102D00000422C258000605C50622C2700000000A4F
-:102D10000422C298000605CB0622C2B00000000AB9
-:102D20000422C2D8000605D10622C2F00000000A23
-:102D30000422C318000605D70622C3300000000A8B
-:102D40000422C358000605DD0622C3700000000AF5
-:102D50000422C398000605E30622C3B00000000A5F
-:102D60000422C3D8000605E90622C3F00000000AC9
-:102D70000422C418000605EF0622C4300000000A31
-:102D80000422C458000605F50622C4700000000A9B
-:102D90000422C498000605FB0622C4B00000000A05
-:102DA0000422C4D8000606010622C4F00000000A6E
-:102DB0000422C518000606070622C5300000000AD6
-:102DC0000422C5580006060D0622C5700000000A40
-:102DD0000422C598000606130622C5B00000000AAA
-:102DE0000422C5D8000606190622C5F00000000A14
-:102DF0000422C6180006061F0622C6300000000A7C
-:102E00000422C658000606250622C6700000000AE5
-:102E10000422C6980006062B0622C6B00000000A4F
-:102E20000422C6D8000606310622C6F00000000AB9
-:102E30000422C718000606370622C7300000000A21
-:102E40000422C7580006063D0622C7700000000A8B
-:102E50000422C798000606430622C7B00000000AF5
-:102E60000422C7D8000606490622C7F00000000A5F
-:102E70000422C8180006064F0622C8300000000AC7
-:102E80000422C858000606550622C8700000000A31
-:102E90000422C8980006065B0622C8B00000000A9B
-:102EA0000422C8D8000606610622C8F00000000A05
-:102EB0000422C918000606670622C9300000000A6D
-:102EC0000422C9580006066D0622C9700000000AD7
-:102ED0000422C998000606730622C9B00000000A41
-:102EE0000422C9D8000606790622C9F00000000AAB
-:102EF0000422CA180006067F0622CA300000000A13
-:102F00000422CA58000606850622CA700000000A7C
-:102F10000422CA980006068B0622CAB00000000AE6
-:102F20000422CAD8000606910622CAF00000000A50
-:102F30000422CB18000606970622CB300000000AB8
-:102F40000422CB580006069D0622CB700000000A22
-:102F50000422CB98000606A30622CBB00000000A8C
-:102F60000422CBD8000606A90622CBF00000000AF6
-:102F70000422CC18000606AF0622CC300000000A5E
-:102F80000422CC58000606B50622CC700000000AC8
-:102F90000422CC98000606BB0622CCB00000000A32
-:102FA0000422CCD8000606C10622CCF00000000A9C
-:102FB0000422CD18000606C70622CD300000000A04
-:102FC0000422CD58000606CD0622CD700000000A6E
-:102FD0000422CD98000606D30622CDB00000000AD8
-:102FE0000422CDD8000606D90622CDF00000000A42
-:102FF0000422CE18000606DF0622CE300000000AAA
-:103000000422CE58000606E50622CE700000000A13
-:103010000422CE98000606EB0622CEB00000000A7D
-:103020000422CED8000606F10622CEF00000000AE7
-:103030000422CF18000606F70622CF300000000A4F
-:103040000422CF58000606FD0622CF700000000AB9
-:103050000422CF98000607030622CFB00000000A22
-:103060000422CFD8000607090622CFF00000000A8C
-:103070000422D0180006070F0622D0300000000AF4
-:103080000422D058000607150622D0700000000A5E
-:103090000422D0980006071B0622D0B00000000AC8
-:1030A0000422D0D8000607210622D0F00000000A32
-:1030B0000422D118000607270622D1300000000A9A
-:1030C0000422D1580006072D0622D1700000000A04
-:1030D0000422D198000607330622D1B00000000A6E
-:1030E0000422D1D8000607390622D1F00000000AD8
-:1030F0000422D2180006073F0622D2300000000A40
-:103100000422D258000607450622D2700000000AA9
-:103110000422D2980006074B0622D2B00000000A13
-:103120000422D2D8000607510622D2F00000000A7D
-:103130000422D318000607570622D3300000000AE5
-:103140000422D3580006075D0622D3700000000A4F
-:103150000422D398000607630622D3B00000000AB9
-:103160000422D3D8000607690622D3F00000000A23
-:103170000422D4180006076F0622D4300000000A8B
-:103180000422D458000607750622D4700000000AF5
-:103190000422D4980006077B0622D4B00000000A5F
-:1031A0000422D4D8000607810622D4F00000000AC9
-:1031B0000422D518000607870622D5300000000A31
-:1031C0000422D5580006078D0622D5700000000A9B
-:1031D0000422D598000607930622D5B00000000A05
-:1031E0000422D5D8000607990622D5F00000000A6F
-:1031F0000422D6180006079F0622D6300000000AD7
-:103200000422D658000607A50622D6700000000A40
-:103210000422D698000607AB0622D6B00000000AAA
-:103220000422D6D8000607B10622D6F00000000A14
-:103230000422D718000607B70622D7300000000A7C
-:103240000422D758000607BD0622D7700000000AE6
-:103250000422D798000607C30622D7B00000000A50
-:103260000422D7D8000607C90622D7F00000000ABA
-:103270000422D818000607CF0622D8300000000A22
-:103280000422D858000607D50622D8700000000A8C
-:103290000422D898000607DB0622D8B00000000AF6
-:1032A0000422D8D8000607E10622D8F00000000A60
-:1032B0000422D918000607E70622D9300000000AC8
-:1032C0000422D958000607ED0622D9700000000A32
-:1032D0000422D998000607F30622D9B00000000A9C
-:1032E0000422D9D8000607F90622D9F00000000A06
-:1032F0000422DA18000607FF0622DA300000000A6E
-:103300000422DA58000608050622DA700000000AD6
-:103310000422DA980006080B0622DAB00000000A40
-:103320000422DAD8000608110622DAF00000000AAA
-:103330000422DB18000608170622DB300000000A12
-:103340000422DB580006081D0622DB700000000A7C
-:103350000422DB98000608230622DBB00000000AE6
-:103360000422DBD8000608290622DBF00000000A50
-:103370000422DC180006082F0622DC300000000AB8
-:103380000422DC58000608350622DC700000000A22
-:103390000422DC980006083B0622DCB00000000A8C
-:1033A0000422DCD8000608410622DCF00000000AF6
-:1033B0000422DD18000608470622DD300000000A5E
-:1033C0000422DD580006084D0622DD700000000AC8
-:1033D0000422DD98000608530622DDB00000000A32
-:1033E0000422DDD8000608590622DDF00000000A9C
-:1033F0000422DE180006085F0622DE300000000A04
-:103400000422DE58000608650622DE700000000A6D
-:103410000422DE980006086B0622DEB00000000AD7
-:103420000422DED8000608710622DEF00000000A41
-:103430000422DF18000608770622DF300000000AA9
-:103440000422DF580006087D0622DF700000000A13
-:103450000422DF98000608830622DFB00000000A7D
-:103460000422DFD8000608890622DFF00000000AE7
-:103470000422E0180006088F0622E0300000000A4F
-:103480000422E058000608950622E0700000000AB9
-:103490000422E0980006089B0622E0B00000000A23
-:1034A0000422E0D8000608A10622E0F00000000A8D
-:1034B0000422E118000608A70622E1300000000AF5
-:1034C0000422E158000608AD0622E1700000000A5F
-:1034D0000422E198000608B30622E1B00000000AC9
-:1034E0000422E1D8000608B90622E1F00000000439
-:1034F0000622153800000002062211E80000000232
-:103500000622F3000000000802221148000000001B
-:1035100006225900000000060622330000000002C7
-:1035200006226040000000300622F3200000000860
-:103530000222114C0000000006225918000000066B
-:10354000062233080000000206226100000000305D
-:103550000622F34000000008022211500000000083
-:103560000622593000000006062233100000000237
-:10357000062261C0000000300622F360000000084F
-:1035800002221154000000000622594800000006E3
-:10359000062233180000000206226280000000307C
-:1035A0000622F380000000080222115800000000EB
-:1035B00006225960000000060622332000000002A7
-:1035C00006226340000000300622F3A0000000083D
-:1035D0000222115C0000000006225978000000065B
-:1035E000062233280000000206226400000000309A
-:1035F0000622F3C000000008022211600000000053
-:103600000622599000000006062233300000000216
-:10361000062264C0000000300622F3E0000000082B
-:103620000222116400000000062259A800000006D2
-:1036300006223338000000020622658000000030B8
-:103640000216100000000028021700080000000207
-:103650000217002C000000030217003C00000004C9
-:10366000021700440000000002170048000000029A
-:103670000217004C0000009002170050000000905C
-:103680000217005400800090021700580810000034
-:10369000021700700000000602170078000009FF02
-:1036A0000217007C0000076C021701C4081000001C
-:1036B0000217034400000001021704000000008A02
-:1036C00002170404000000800217040800000081B3
-:1036D0000217040C00000080021704100000008A8A
-:1036E0000217041400000080021704180000008173
-:1036F0000217041C00000080021704300000008A3A
-:103700000217043400000080021704380000008112
-:103710000217043C00000080021704400000008AE9
-:1037200002170444000000800217044800000081D2
-:103730000217044C00000080021704800000008A79
-:103740000217048400000080021704880000008132
-:103750000217048C0000008002170038007C10045F
-:10376000021700040000000F021701EC0000000225
-:10377000021701F400000002021701EC0000000231
-:10378000021701F400000002021701EC0000000221
-:10379000021701F400000002021701EC0000000211
-:1037A000021701F400000002021701EC0000000201
-:1037B000021701F400000002021701EC00000002F1
-:1037C000021701F400000002021701EC00000002E1
-:1037D000021701F400000002021701EC00000002D1
-:1037E000021701F400000002061640240000000247
-:1037F000021640700000001C021642080000000182
-:1038000002164210000000010216422000000001D2
-:10381000021642280000000102164230000000019A
-:103820000216423800000001021642600000000249
-:103830000C16401C0003D0900A16401C0000009C8F
-:103840000B16401C000002710216403000000028D8
-:10385000021640340000002C0216403800000030F0
-:103860000216404400000020021640000000000143
-:10387000021640D8000000010216400800000001B6
-:103880000216400C0000000102164010000000016A
-:1038900002164240000000000216424800000000EC
-:1038A000061642700000000202164250000000009E
-:1038B0000216425800000000061642800000000276
-:1038C00002166008000012140216600C00001200BC
-:1038D00002166010000012040216601C0000FFFFB8
-:1038E000021660200000FFFF021660240000FFFFA8
-:1038F000021660280000FFFF02166038000000205A
-:103900000216603C00000010061660400000000235
-:1039100002166048000000230216604C00000024DC
-:1039200002166050000000250216605400000026B8
-:1039300002166058000000270216605C00000011AB
-:103940000216606000000000021660640000002B98
-:10395000021660680000002C0216606C0000002D4A
-:1039600002166070000000EC021660740000000097
-:1039700002166078000000290216607C0000002A10
-:10398000021660800000002F061660840000000D03
-:10399000021660B800000001061660BC00000008B6
-:1039A000021660DC00000001061660E00000000462
-:1039B000021660F000000001061660F4000000032B
-:1039C0000216610000000001061661040000002DCF
-:1039D000021661B800000001061661BC0000000874
-:1039E000021661DC00000001061661E00000000420
-:1039F000021661F000000001061661F400000003E9
-:103A00000216620000000001061662040000000DAC
-:103A10000216623807FFFFFF0216623C0000007FBB
-:103A20000216624007FFFFFF021662440000003FDB
-:103A300001166248000000000116624C0000000000
-:103A400001166250000000000116625400000000E0
-:103A500001166258000000000116625C00000000C0
-:103A600001166260000000000116626400000000A0
-:103A700001166268000000000116626C0000000080
-:103A80000116627000000000011662740000000060
-:103A900001166278000000000116627C0000000040
-:103AA000011662D400000000021662D80000FFFF79
-:103AB000021662DC0000FFFF021662E00000FFFF5A
-:103AC000021662E40000FFFF0C166000000003E82D
-:103AD0000A166000000000010B16600000000003E1
-:103AE0000216804000000006021680440000000517
-:103AF000021680480000000A0216804C00000005F3
-:103B00000216805400000002021680CC000000045F
-:103B1000021680D000000004021680D400000004C9
-:103B2000021680D800000004021680DC00000004A9
-:103B3000021680E000000004021680E40000000489
-:103B4000021680E800000004021688040000000647
-:103B5000021680300000007C021680340000003D18
-:103B6000021680380000003F0216803C0000009CD6
-:103B70000216E6E8000060000216E6EC00006000B5
-:103B80000216E6F0000060000216E6F40000600095
-:103B900002168234000025E40216823800008000FC
-:103BA00002168094000025E3021681F400000C0840
-:103BB000021681F800000040021681FC000001009E
-:103BC0000216820000000020021682040000001786
-:103BD00002168208000000800216820C000002001B
-:103BE00002168210000000000216823C0000001342
-:103BF00002168220008F008F0216821C008F008F19
-:103C0000021680F0000000070216821801FF01FF73
-:103C10000216821401FF01FF061680F40000000264
-:103C20000216811C0000000502168120000000051C
-:103C300002168124000000050216812800000008F9
-:103C40000216812C000000060216813000000007D9
-:103C50000616813400000004021680FC00000000FB
-:103C600006168144000000020216814C0000000488
-:103C7000021681500000000102168154000000026B
-:103C800002168158000000050216815C0000000544
-:103C90000216816000000005021681640000000524
-:103CA0000216816800000008021681000000000072
-:103CB0000216816C000000060216817000000007E9
-:103CC00006168174000000060216818C00000004B4
-:103CD000021681900000000102168104000000001D
-:103CE000021681940000000202168198000000056F
-:103CF0000216819C00000005021681A0000000054C
-:103D0000021681A400000005021681A80000000828
-:103D1000021681AC00000006021681B00000000708
-:103D2000061681B40000000202168108000000009F
-:103D3000061681BC00000004021681CC00000004BD
-:103D4000021681D000000001021681D4000000029A
-:103D5000021681D800000005021681DC0000000573
-:103D6000021681E0000000050216810C000000042C
-:103D7000021681E400000005021681E80000000838
-:103D8000021681EC00000006021681F00000000718
-:103D900002168110000000010216811400000002CA
-:103DA00002168118000000050216809C0000004CDD
-:103DB000021680A00000004C061680C4000000021D
-:103DC000021680A400000000021680A80000000077
-:103DD000021680AC0000004C061680B00000000502
-:103DE0000216E6F80000020402168240003F003F7F
-:103DF00002168244003F003F061682900000000435
-:103E000002168248008000800216824C00800080EA
-:103E100002168250010001000216825401000100C6
-:103E20000616825800000002021682600040004020
-:103E30000216826400400040021682681E001E00C6
-:103E40000216826C1E001E000216827040004000A6
-:103E500002168274400040000216827880008000C2
-:103E60000216827C800080000216828020002000E2
-:103E700002168284200020000616828800000002BC
-:103E8000021680900000004B021680600000014086
-:103E900002168064000001400616808800000002BF
-:103EA00002168068000000000216806C000000000E
-:103EB00002168070000000C0061680740000000525
-:103EC0000216880C0101010102168810010120046C
-:103ED000021688142008100102168818010101201A
-:103EE0000216881C0101010102168820010120042C
-:103EF00002168824200810010216882801010120DA
-:103F00000216882C200810010216883001010120B9
-:103F100002168834010101010216883801012004CB
-:103F20000216883C20081001021688400101012079
-:103F3000021688440101010102168848010120048B
-:103F40000216E6BC000000000216E6C000000002F7
-:103F50000216E6C4000000040216E6C800000006CF
-:103F60000216E79400000001021680EC000000FF3A
-:103F700002140000000000010215C024000000002F
-:103F80000215C0EC000000010215C0F000000001A5
-:103F90000615C10000000002021400040000000128
-:103FA00002140008000000010214000C00000001CF
-:103FB000021400300000000102140034000000016F
-:103FC0000214004000000001021400440000FFFF42
-:103FD00006140004000000030214000000000000AA
-:103FE000060280000000200002020058000000329B
-:103FF000020200A003150020020200A40315002005
-:10400000020200A801000030020200AC081000000B
-:10401000020200B000000036020200B400000030CE
-:10402000020200B800000031020200BC00000002E1
-:10403000020200C000000005020200C400000002ED
-:10404000020200C800000002020200D000000007C7
-:10405000020200DC00000000020200E00000000597
-:10406000020200E400000003020200F00000000170
-:10407000020200FC00000006020201200000000015
-:104080000202013400000002020201B0000000013F
-:104090000202020C000000010202021400000001F2
-:1040A00002020218000000020202040400000001E3
-:1040B0000202040C00000040020204100000004054
-:1040C0000202041C00000004020204200000002080
-:1040D0000202042400000002020204280000002062
-:1040E000060205000000001204020480002008BF40
-:1040F000020200600000000F0202006400000007DE
-:1041000002020068000000000202006C0000000EC5
-:10411000020200700000000E06020074000000039E
-:10412000020200F40000000402020004000000018A
-:1041300002020008000000010202000C0000000161
-:104140000202001000000001020200140000000141
-:1041500002020018000000010202001C0000000121
-:104160000202002000000001020200240000000101
-:1041700002020028000000010202002C00000001E1
-:1041800002020030000000010202003400000001C1
-:1041900002020038000000010202003C00000001A1
-:1041A0000202004000000001020200440000000181
-:1041B00002020048000000010202004C0000000161
-:1041C000020200500000000102020108000000C8C5
-:1041D0000202011800000002020201C400000000F7
-:1041E000020201CC00000000020201D40000000223
-:1041F000020201DC00000002020201E4000000FFF4
-:10420000020201EC000000FF0202010000000000B9
-:104210000202010C000000C80202011C00000002A2
-:10422000020201C800000000020201D000000000EC
-:10423000020201D800000002020201E000000002B8
-:10424000020201E8000000FF020201F0000000FF8E
-:10425000020201040000002002020108000000C860
-:104260000202011800000002020201C40000000066
-:10427000020201CC00000000020201D40000000292
-:10428000020201DC00000002020201E4000000FF63
-:10429000020201EC000000FF020201000000001019
-:1042A0000202010C000000C80202011C0000000212
-:1042B000020201C800000000020201D0000000005C
-:1042C000020201D800000002020201E00000000228
-:1042D000020201E8000000FF020201F0000000FFFE
-:1042E000020201040000003002020108000000C8C0
-:1042F0000202011800000002020201C400000000D6
-:10430000020201CC00000000020201D40000000201
-:10431000020201DC00000002020201E4000000FFD2
-:10432000020201EC000000FF020201000000004058
-:104330000202010C000000C80202011C0000000281
-:10434000020201C800000000020201D000000000CB
-:10435000020201D800000002020201E00000000297
-:10436000020201E8000000FF020201F0000000FF6D
-:10437000020201040000006002020108000000C8FF
-:104380000202011800000002020201C40000000045
-:10439000020201CC00000000020201D40000000271
-:1043A000020201DC00000002020201E4000000FF42
-:1043B000020201EC000000FF0202010000000050B8
-:1043C0000202010C000000C80202011C00000002F1
-:1043D000020201C800000000020201D0000000003B
-:1043E000020201D800000002020201E00000000207
-:1043F000020201E8000000FF020201F0000000FFDD
-:1044000002020104000000700728040000B300004D
-:10441000082807B8000908DF072C000028CB000097
-:10442000072C8000365D0A33072D0000347017CB4F
-:10443000072D80003A9424E8072E000036C7338EFB
-:10444000072E80001CE94140082EC5D0274608E110
-:10445000022800BC0000003001280000000000001D
-:1044600001280004000000000128000800000000EE
-:104470000128000C000000000128001000000000CE
-:1044800001280014000000000228002000000001A4
-:104490000228002400000002022800280000000377
-:1044A0000228002C00000000022800300000000458
-:1044B000022800340000000102280038000000003B
-:1044C0000228003C00000001022800400000000417
-:1044D00002280044000000000228004800000001FB
-:1044E0000228004C000000030228005000000000D9
-:1044F00002280054000000010228005800000004B7
-:104500000228005C0000000002280060000000019A
-:104510000228006400000003022800680000000078
-:104520000228006C00000001022800700000000456
-:104530000228007400000000022800780000000437
-:104540000228007C00000003062800800000000212
-:10455000022800A400007FFF022800A8000003FF3B
-:10456000022802240000000002280234000000009B
-:104570000228024C00000000022802E40000FFFFB5
-:104580000628200000000800022B8BC0000000015C
-:10459000022B800000000000022B80400000001869
-:1045A000022B80800000000C022B80C000000066FF
-:1045B0000C2B8300000864700A2B83000000015755
-:1045C0000B2B83000000055F0A2B834000000000D6
-:1045D0000C2B8340000002260B2B834000000001BF
-:1045E000022B838000086470022B83C00000022627
-:1045F000022B1480000000010A2B14800000000030
-:10460000022B944000000001062B94480000000299
-:10461000062A9A7000000004042A9A80000408E325
-:10462000062A9A9000000002042A9A98000208E7DD
-:10463000062A900000000048062A2008000000C852
-:10464000062A200000000002062A912800000086A9
-:10465000062AC00000000120062A9348000000033B
-:10466000042A9354000108E9062A9FB000000002C2
-:10467000042A9418000208EA042A9CD0000108ECDD
-:10468000062A9CD400000011042A9D20008F08ED0A
-:10469000062A9F5C00000005042A30000002097C05
-:1046A000062A300800000100062A404000000010E1
-:1046B000042A40000010097E042A84080002098EA2
-:1046C000042ACF4000040990042ACF600002099414
-:1046D000062A9FA000000004062A60000000054092
-:1046E000062A9D1800000002062AB00000000050B3
-:1046F000062ABB7000000070062ABB68000000029A
-:10470000062AB94800000004062AD000000008006C
-:10471000062AC48000000150062A942000000032BE
-:10472000062A502000000002062A50300000000235
-:10473000062A500000000002062A50100000000265
-:10474000022A520800000001042A9AA000020996D9
-:10475000062A95B000000022042A96380001099824
-:10476000062A963C00000003062A96E0000000227C
-:10477000042A976800010999062A976C0000000333
-:10478000062A981000000022042A98980001099A2D
-:10479000062A989C00000003062A99400000002287
-:1047A000042A99C80001099B062A99CC000000033D
-:1047B000062ABB5800000002062AC9C000000150AA
-:1047C000062A94E800000032062A50280000000261
-:1047D000062A503800000002062A50080000000295
-:1047E000062A501800000002022A520C00000001A4
-:1047F000042A9AA80002099C062A96480000002272
-:10480000042A96D00001099E062A96D400000003CF
-:10481000062A977800000022042A98000001099FC8
-:10482000062A980400000003062A98A80000002227
-:10483000042A9930000109A0062A993400000003D7
-:10484000062A99D800000022042A9A60000109A1D2
-:10485000062A9A6400000003062ABB6000000002DA
-:10486000022ACF0000000000042A9AB0001009A21A
-:10487000062A50480000000E022ACF040000000063
-:10488000042A9AF0001009B2062A50800000000E97
-:10489000022ACF0800000000042A9B30001009C241
-:1048A000062A50B80000000E022ACF0C00000000BB
-:1048B000042A9B70001009D2062A50F00000000E56
-:1048C000022ACF1000000000042A9BB0001009E269
-:1048D000062A51280000000E022ACF140000000012
-:1048E000042A9BF0001009F2062A51600000000E15
-:1048F000022ACF1800000000042A9C3000100A028F
-:10490000062A51980000000E022ACF1C0000000069
-:10491000042A9C7000100A12062A51D00000000ED2
-:1049200002101008000000010210105000000001E9
-:10493000021010000003D000021010040000003D1F
-:104940000910180002000A220910110000100C22A0
-:1049500006101140000000080910116000100C3210
-:10496000061011A00000001806102400000000E04E
-:104970000210201C00000000021020200000000196
-:10498000021020C0000000020210200400000001FC
-:104990000210200800000001021030D800000001C1
-:1049A00009103C0000050C420910380000050C47B6
-:1049B0000910392000050C4C09103B0000050C5172
-:1049C000021040D400000030021040D80000003037
-:1049D00006104C00000001000210402800000010EA
-:1049E0000210404400003FFF021040580028000021
-:1049F000021040840084924A0210405800000000D7
-:104A0000021041380000000102104138000000018E
-:104A1000021041380000000102104138000000017E
-:104A2000021041380000000102104138000000016E
-:104A3000021041380000000102104138000000015E
-:104A40000212049001F680400212051400003C108E
-:104A500002120494FFFFFFFF02120498FFFFFFFF02
-:104A60000212049CFFFFFFFF021204A0FFFFFFFFE2
-:104A7000021204A4FFFFFFFF021204A8FFFFFFFFC2
-:104A8000021204ACFFFFFFFF021204B0FFFFFFFFA2
-:104A9000021204B8FFFFFFFF021204BCFFFFFFFF7A
-:104AA000021204C0FFFFFFFF021204C4FFFFFFFF5A
-:104AB000021204C8FFFFFFFF021204CCFFFFFFFF3A
-:104AC000021204D0FFFFFFFF021204D8FFFFFFFF16
-:104AD000021204DCFFFFFFFF021204E0FFFFFFFFF2
-:104AE000021204E4FFFFFFFF021204E8FFFFFFFFD2
-:104AF000021204ECFFFFFFFF021204F0FFFFFFFFB2
-:104B0000021204F4FFFFFFFF021204F8FFFFFFFF91
-:104B1000021204FCFFFFFFFF02120500FFFFFFFF70
-:104B200002120504FFFFFFFF02120508FFFFFFFF4F
-:104B30000212050CFFFFFFFF02120510FFFFFFFF2F
-:104B4000021204D4F800C000021204B4F0005000B5
-:104B500002120390000000080212039C00000008EB
-:104B6000021203A000000008021203A400000002C9
-:104B7000021203BC00000004021203C00000000582
-:104B8000021203C400000004021203D0000000005F
-:104B90000212036C00000001021201BC0000004080
-:104BA000021201C000001808021201C4000008032C
-:104BB000021201C800000803021201CC00000040EC
-:104BC000021201D000000003021201D40000080309
-:104BD000021201D800000803021201DC00000803E1
-:104BE000021201E000010003021201E400000803C8
-:104BF000021201E800000803021201EC00000003A9
-:104C0000021201F000000003021201F40000000390
-:104C1000021201F800000003021201FC0000000370
-:104C2000021202000000000302120204000000034E
-:104C300002120208000000030212020C000000032E
-:104C4000021202100000000302120214000000030E
-:104C500002120218000000030212021C00000003EE
-:104C600002120220000000030212022400000003CE
-:104C700002120228000024030212022C0000002F5E
-:104C80000212023000000009021202340000001972
-:104C900002120238000001840212023C000001836B
-:104CA0000212024000000306021202440000001932
-:104CB00002120248000000060212024C0000030625
-:104CC0000212025000000306021202540000030602
-:104CD0000212025800000C860212025C0000030659
-:104CE00002120260000003060212026400000006C5
-:104CF00002120268000000060212026C00000006A8
-:104D00000212027000000006021202740000000687
-:104D100002120278000000060212027C0000000667
-:104D20000212028000000006021202840000000647
-:104D300002120288000000060212028C0000000627
-:104D40000212029000000006021202940000000607
-:104D500002120298000000060212029C00000006E7
-:104D6000021202A000000306021202A400000013B7
-:104D7000021202A800000006021202B00000100495
-:104D8000021202B400001004021203240010644056
-:104D90000212032800106440021205B40000000152
-:104DA000021205F800000040021205FC0000001984
-:104DB00002120600000000010212066C0000000151
-:104DC000021201B000000001021207D80000000327
-:104DD000021207D800000003021207D800000003E7
-:104DE000021207D800000003021207D800000003D7
-:104DF000021207D800000003021207D800000003C7
-:104E0000021207D8000000030600A0000000000CFA
-:104E10000200A050000000000200A05400000000AA
-:104E20000200A0EC555400000200A0F05555555565
-:104E30000200A0F4000055550200A0F8F0000000A8
-:104E40000200A0FC555400000200A1005555555524
-:104E50000200A104000055550200A108F000000066
-:104E60000200A19C000000000200A1A000010000BF
-:104E70000200A1A4000050140200A1A8000000003C
-:104E80000200A6A8000000000200A6AC000000007E
-:104E90000200A6D0000000000200A45C00000C008C
-:104EA0000200A61C000000030200A070FFF55FFFD7
-:104EB0000200A0740000FFFF0200A078F00003E0F1
-:104EC0000200A07C000000000200A0800000A00002
-:104ED0000600A084000000050200A0980FE000007A
-:104EE0000600A09C000000070200A0B8000004001B
-:104EF0000600A0BC000000030200A0C800001000D3
-:104F00000600A0CC000000030200A0D80000400072
-:104F10000600A0DC000000030200A0E80001000081
-:104F20000600A22C000000040200A688000000FC7D
-:104F30000600A68C000000070200A6F40000000096
-:104F40000200A10CFF5C00000200A110FFF55FFF52
-:104F50000200A1140000FFFF0200A118F00003E00E
-:104F60000200A11C000000000200A1200000A0001F
-:104F70000600A124000000050200A1380FE0000097
-:104F80000600A13C000000070200A1580000080034
-:104F90000600A15C000000030200A16800002000E0
-:104FA0000600A16C000000030200A1780000800050
-:104FB0000600A17C000000030200A188000200009E
-:104FC0000600A23C000000040200A6B0000000FCA5
-:104FD0000600A6B4000000070200A6F800000000CA
-:104FE0000200A030000000000200A0340000000019
-:104FF0000200A038000000000200A03C00000000F9
-:105000000200A040000000000200A04400000000D8
-:105010000200A048000000000200A04C00000000B8
-:10502000020090C40000E000020090CC0000F300F9
-:10503000020090D400000003020091A000000001D3
-:105040000600917000000003020090EC0000600078
-:10505000020090F400007300020090FC00000003C6
-:10506000020091A8000000010600918800000003E2
-:10507000020091000000400002009108000053006F
-:105080000200911000000004020091AC0000000139
-:1050900006009194000000020200919C00000001B3
-:1050A000020090D800006000020090E00000730051
-:1050B000020090E800000003020091A4000000013B
-:1050C0000200917C000000010200918000000001BC
-:1050D00002009184000000000200912800000300FB
-:1050E0000200916C0003F0080200912C0000030004
-:1050F0000200913000000300020091340000030020
-:1051000002009138000003000200913C00000300FF
-:1051100002009140000003000200942C00000001F6
-:1051200002009430000000010200943400000001ED
-:105130000200942C000000010200943000000001E5
-:1051400002009434000000010200942C00000001D1
-:1051500002009430000000010200943400000001BD
-:105160000200942C000000010200943000000001B5
-:1051700002009434000000010200942C00000001A1
-:10518000020094300000000102009434000000018D
-:105190000200942C00000001020094300000000185
-:1051A00002009434000000010200942C0000000171
-:1051B000020094300000000102009434000000015D
-:1051C0000200942C00000001020094300000000155
-:1051D0000200943400000001021300780000003047
-:1051E0000213003C000061A8061301080000000340
-:1051F000021301040000000002130134000000004B
-:10520000061301080000000302130104000000005F
-:10521000021301340000000006130108000000031F
-:10522000021301040000000002130134000000001A
-:10523000061301080000000302130104000000002F
-:1052400002130134000000000613010800000003EF
-:1052500002130104000000000213013400000000EA
-:1052600006130108000000030213010400000000FF
-:1052700002130134000000000613010800000003BF
-:1052800002130104000000000213013400000000BA
-:1052900006130108000000030213010400000000CF
-:1052A0000213013400000000021100B800000001E8
-:1052B0000216E6E8000020000216E6EC00002000DE
-:1052C0000216E6F0000065550216E6F4000065558A
-:1052D00002168150000000000216817400000001D7
-:1052E00002168178000000010216817C0000000196
-:1052F0000216818000000001021681840000000176
-:105300000216818800000001021681B4000000012D
-:10531000021681B800000001021681BC00000001E5
-:10532000021681C000000001021681C400000001C5
-:10533000021681C800000001021681100000000062
-:105340000216824000BF00BF061682440000000221
-:105350000216824C00BF00BF0216E6C40000000126
-:105360000216E6C8000000030216E79400000000E1
-:10537000042ACF40000A0C56000000000000000084
-:1053800000000034000000000000000000000000E9
-:10539000000000000000000000000000000000000D
-:1053A0000000000000000000000000000034003594
-:1053B00000000000000000000000000000000000ED
-:1053C00000000000000000000000000000000000DD
-:1053D0000000000000000000003500600000000038
-:1053E00000000000000000000000000000000000BD
-:1053F00000000000000000000000000000000000AD
-:1054000000000000006000910000000000000000AB
-:1054100000910095009500990099009D009D00A1C4
-:1054200000A100A500A500A900A900AD00AD00B134
-:1054300000B100B500000000000000000000000006
-:10544000000000000000000000000000000000005C
-:1054500000000000000000000000000000B5031183
-:105460000311031B031B03250325032C032C033308
-:105470000333033A033A0341034103480348034F0C
-:10548000034F03560356035D0000000000000000B8
-:10549000000000000000000000000000000000000C
-:1054A00000000000000000000000000000000000FC
-:1054B00000000000000000000000000000000000EC
-:1054C00000000000000000000000000000000000DC
-:1054D00000000000000000000000000000000000CC
-:1054E00000000000000000000000000000000000BC
-:1054F00000000000000000000000000000000000AC
-:10550000000000000000000000000000000000009B
-:10551000000000000000000000000000000000008B
-:10552000000000000000000000000000000000007B
-:105530000000000000000000035D035E00000000AA
-:1055400000000000035E035F035F0360036003610C
-:10555000036103620362036303630364036403651B
-:10556000036503660000000000000000000000006A
-:10557000000000000000000000000000000000002B
-:10558000000000000000000000000000000000001B
-:105590000366036D036D0379037903850000000042
-:1055A00000000000000000000000000000000000FB
-:1055B00000000000000000000000000000000000EB
-:1055C00000000000000000000000000000000000DB
-:1055D00000000000000000000000000000000000CB
-:1055E00000000000000000000385038600000000AA
-:1055F00000000000000000000000000000000000AB
-:10560000000000000000000000000000000000009A
-:1056100000000000038603B100000000000000004D
-:10562000000000000000000000000000000000007A
-:10563000000000000000000000000000000000006A
-:1056400003B103E0000000000000000000000000C3
-:10565000000000000000000000000000000000004A
-:1056600000000000000000000000000003E0040F44
-:105670000000000000000000040F04160416041DC2
-:10568000041D04240424042B042B043204320439A2
-:1056900004390440044004470447047A0000000031
-:1056A00000000000047A047E047E048204820486E2
-:1056B0000486048A048A048E048E0492049204965A
-:1056C0000496049A049A04EA04EA05000500051603
-:1056D000051605180518051A051A051C051C051ED2
-:1056E000051E052005200522052205240524052682
-:1056F00005260693000000000000000006930698AF
-:105700000698069D069D06A206A206A706A706AC59
-:1057100006AC06B106B106B606B606BB06BB06BCAD
-:105720000000000000000000000000000000000079
-:105730000000000000000000000000000000000069
-:10574000000000000000000006BC06E000000000B1
-:105750000000000006E006E206E206E406E406E6D3
-:1057600006E606E806E806EA06EA06EC06EC06EEB9
-:1057700006EE06F006F00705070507080708070B01
-:105780000000000000000000000000000000000019
-:105790000000000000000000000000000000000009
-:1057A000070B074F00000000000000000000000091
-:1057B00000000000000000000000000000000000E9
-:1057C000000000000000000000000000074F07E19B
-:1057D00000000000000000000000000000000000C9
-:1057E00000000000000000000000000000000000B9
-:1057F000000000000000000007E107EF00000000CB
-:105800000000000000000000000000000000000098
-:105810000000000000000000000000000000000088
-:105820000000000007EF082C00000000000000004E
-:10583000082C08350835083E083E08470847085038
-:1058400008500859085908620862086B086B087408
-:10585000087408D508D508EA08EA08FF08FF090215
-:1058600009020905090509080908090B090B090EB0
-:10587000090E09110911091409140917091709203A
-:105880000000000000000000000000000000000018
-:105890000000000000000000000000000000000008
-:1058A00000000000000000000920092600000000A0
-:1058B00000000000000000000000000000000000E8
-:1058C00000000000000000000000000000000000D8
-:1058D000000000000926092B000000000000000065
-:1058E00000000000000000000000000000000000B8
-:1058F00000000000000000000000000000000000A8
-:10590000092B0933000000000000000009330934AE
-:10591000093409350935093609360937093709388F
-:10592000093809390939093A093A093B00000000E8
-:105930000000000000000000000000000000000067
-:105940000000000000000000000000000000000057
-:105950000000000000000000093B09AC000000004E
-:105960000000000009AC09AD09AD09AE09AE09AFF0
-:1059700009AF09B009B009B109B109B209B209B357
-:1059800009B309B409B409C809C809DB09DB09EF7F
-:1059900009EF09F009F009F109F109F209F209F337
-:1059A00009F309F409F409F509F509F609F609F707
-:1059B00009F70A1600000000000000000A160A1984
-:1059C0000A190A1C0A1C0A1F0A1F0A220A220A258F
-:1059D0000A250A280A280A2B0A2B0A2E0A2E0A3020
-:1059E00000000000000000000A300A330A330A36C3
-:1059F0000A360A390A390A3C0A3C0A3F0A3F0A4277
-:105A00000A420A450A450A480A480A4900000000B5
-:105A10000000000000000000000000000000000086
-:105A20000000000000000000000000000000000076
-:105A3000000000000A490A610000000000000000A8
-:105A40000000000000000000000000000000000056
-:105A50000000000000000000000000000000000046
-:105A60000A610A620000000000000000000000005F
-:105A70000000000000000000000000000000000026
-:105A80000000000000000000000000000000000016
-:105A9000000100000002070000030E0000041500D2
-:105AA00000051C000006230000072A000008310042
-:105AB00000093800000A3F00000B4600000C4D00B2
-:105AC000000D5400000E5B00000F62000010690022
-:105AD000001170000012770000137E000014850092
-:105AE00000158C000016930000179A000018A10002
-:105AF0000019A800001AAF00001BB600001CBD0072
-:105B0000001DC400001ECB00001FD2000000D90001
-:105B10000000200000004000000060000000800045
-:105B20000000A0000000C0000000E0000001000034
-:105B30000001200000014000000160000001800021
-:105B40000001A0000001C0000001E0000002000010
-:105B500000022000000240000002600000028000FD
-:105B60000002A0000002C0000002E00000030000EC
-:105B700000032000000340000003600000038000D9
-:105B80000003A0000003C0000003E00000040000C8
-:105B900000042000000440000004600000048000B5
-:105BA0000004A0000004C0000004E00000050000A4
-:105BB0000005200000054000000560000005800091
-:105BC0000005A0000005C0000005E0000006000080
-:105BD000000620000006400000066000000680006D
-:105BE0000006A0000006C0000006E000000700005C
-:105BF0000007200000074000000760000007800049
-:105C00000007A0000007C0000007E0000008000037
-:105C10000008200000084000000860000008800024
-:105C20000008A0000008C0000008E0000009000013
-:105C30000009200000094000000960000009800000
-:105C40000009A0000009C0000009E000000A0000EF
-:105C5000000A2000000A4000000A6000000A8000DC
-:105C6000000AA000000AC000000AE000000B0000CB
-:105C7000000B2000000B4000000B6000000B8000B8
-:105C8000000BA000000BC000000BE000000C0000A7
-:105C9000000C2000000C4000000C6000000C800094
-:105CA000000CA000000CC000000CE000000D000083
-:105CB000000D2000000D4000000D6000000D800070
-:105CC000000DA000000DC000000DE000000E00005F
-:105CD000000E2000000E4000000E6000000E80004C
-:105CE000000EA000000EC000000EE000000F00003B
-:105CF000000F2000000F4000000F6000000F800028
-:105D0000000FA000000FC000000FE0000010000016
-:105D10000010200000104000001060000010800003
-:105D20000010A0000010C0000010E00000110000F2
-:105D300000112000001140000011600000118000DF
-:105D40000011A0000011C0000011E00000120000CE
-:105D500000122000001240000012600000128000BB
-:105D60000012A0000012C0000012E00000130000AA
-:105D70000013200000134000001360000013800097
-:105D80000013A0000013C0000013E0000014000086
-:105D90000014200000144000001460000014800073
-:105DA0000014A0000014C0000014E0000015000062
-:105DB000001520000015400000156000001580004F
-:105DC0000015A0000015C0000015E000001600003E
-:105DD000001620000016400000166000001680002B
-:105DE0000016A0000016C0000016E000001700001A
-:105DF0000017200000174000001760000017800007
-:105E00000017A0000017C0000017E00000180000F5
-:105E100000182000001840000018600000188000E2
-:105E20000018A0000018C0000018E00000190000D1
-:105E300000192000001940000019600000198000BE
-:105E40000019A0000019C0000019E000001A0000AD
-:105E5000001A2000001A4000001A6000001A80009A
-:105E6000001AA000001AC000001AE000001B000089
-:105E7000001B2000001B4000001B6000001B800076
-:105E8000001BA000001BC000001BE000001C000065
-:105E9000001C2000001C4000001C6000001C800052
-:105EA000001CA000001CC000001CE000001D000041
-:105EB000001D2000001D4000001D6000001D80002E
-:105EC000001DA000001DC000001DE000001E00001D
-:105ED000001E2000001E4000001E6000001E80000A
-:105EE000001EA000001EC000001EE000001F0000F9
-:105EF000001F2000001F4000001F6000001F8000E6
-:105F0000001FA000001FC000001FE00000200000D4
-:105F100000202000002040000020600000208000C1
-:105F20000020A0000020C0000020E00000210000B0
-:105F3000002120000021400000216000002180009D
-:105F40000021A0000021C0000021E000002200008C
-:105F50000022200000224000002260000022800079
-:105F60000022A0000022C0000022E0000023000068
-:105F70000023200000234000002360000023800055
-:105F80000023A0000023C0000023E0000024000044
-:105F90000024200000244000002460000024800031
-:105FA0000024A0000024C0000024E0000025000020
-:105FB000002520000025400000256000002580000D
-:105FC0000025A0000025C0000025E00000260000FC
-:105FD00000262000002640000026600000268000E9
-:105FE0000026A0000026C0000026E00000270000D8
-:105FF00000272000002740000027600000278000C5
-:106000000027A0000027C0000027E00000280000B3
-:1060100000282000002840000028600000288000A0
-:106020000028A0000028C0000028E000002900008F
-:10603000002920000029400000296000002980007C
-:106040000029A0000029C0000029E000002A00006B
-:10605000002A2000002A4000002A6000002A800058
-:10606000002AA000002AC000002AE000002B000047
-:10607000002B2000002B4000002B6000002B800034
-:10608000002BA000002BC000002BE000002C000023
-:10609000002C2000002C4000002C6000002C800010
-:1060A000002CA000002CC000002CE000002D0000FF
-:1060B000002D2000002D4000002D6000002D8000EC
-:1060C000002DA000002DC000002DE000002E0000DB
-:1060D000002E2000002E4000002E6000002E8000C8
-:1060E000002EA000002EC000002EE000002F0000B7
-:1060F000002F2000002F4000002F6000002F8000A4
-:10610000002FA000002FC000002FE0000030000092
-:10611000003020000030400000306000003080007F
-:106120000030A0000030C0000030E000003100006E
-:10613000003120000031400000316000003180005B
-:106140000031A0000031C0000031E000003200004A
-:106150000032200000324000003260000032800037
-:106160000032A0000032C0000032E0000033000026
-:106170000033200000334000003360000033800013
-:106180000033A0000033C0000033E0000034000002
-:1061900000342000003440000034600000348000EF
-:1061A0000034A0000034C0000034E00000350000DE
-:1061B00000352000003540000035600000358000CB
-:1061C0000035A0000035C0000035E00000360000BA
-:1061D00000362000003640000036600000368000A7
-:1061E0000036A0000036C0000036E0000037000096
-:1061F0000037200000374000003760000037800083
-:106200000037A0000037C0000037E0000038000071
-:10621000003820000038400000386000003880005E
-:106220000038A0000038C0000038E000003900004D
-:10623000003920000039400000396000003980003A
-:106240000039A0000039C0000039E000003A000029
-:10625000003A2000003A4000003A6000003A800016
-:10626000003AA000003AC000003AE000003B000005
-:10627000003B2000003B4000003B6000003B8000F2
-:10628000003BA000003BC000003BE000003C0000E1
-:10629000003C2000003C4000003C6000003C8000CE
-:1062A000003CA000003CC000003CE000003D0000BD
-:1062B000003D2000003D4000003D6000003D8000AA
-:1062C000003DA000003DC000003DE000003E000099
-:1062D000003E2000003E4000003E6000003E800086
-:1062E000003EA000003EC000003EE000003F000075
-:1062F000003F2000003F4000003F6000003F800062
-:10630000003FA000003FC000003FE000003FE00170
-:1063100000000000000001FF0000020000007FF804
-:1063200000007FF800000A90000035000000000126
-:106330000000FF00000000000000FF00000000005F
-:106340000000FF00000000000000FF00000000004F
-:106350000000FF00000000000000FF00000000003F
-:106360000000FF00000000000000FF00000000002F
-:106370000000FF00000000000000FF00000000001F
-:106380000000FF00000000000000FF00000000000F
-:106390000000FF00000000000000FF0000000000FF
-:1063A0000000FF00000000000000FF0000000000EF
-:1063B0000000FF00000000000000FF0000000000DF
-:1063C0000000FF00000000000000FF0000000000CF
-:1063D0000000FF00000000000000FF0000000000BF
-:1063E0000000FF00000000000000FF0000000000AF
-:1063F0000000FF00000000000000FF00000000009F
-:106400000000FF00000000000000FF00000000008E
-:106410000000FF00000000000000FF00000000007E
-:106420000000FF00000000000000FF00000000006E
-:106430000000FF00000000000000FF00000000005E
-:106440000000FF00000000000000FF00000000004E
-:106450000000FF00000000000000FF00000000003E
-:106460000000FF00000000000000FF00000000002E
-:106470000000FF00000000000000FF00000000001E
-:106480000000FF00000000000000FF00000000000E
-:106490000000FF00000000000000FF0000000000FE
-:1064A0000000FF00000000000000FF0000000000EE
-:1064B0000000FF00000000000000FF0000000000DE
-:1064C0000000FF00000000000000FF0000000000CE
-:1064D0000000FF00000000000000FF0000000000BE
-:1064E0000000FF00000000000000FF0000000000AE
-:1064F0000000FF00000000000000FF00000000009E
-:106500000000FF00000000000000FF00000000008D
-:106510000000FF00000000000000FF00000000007D
-:106520000000FF00000000000000FF00000000006D
-:106530000000FF00000000000000FF00000000005D
-:106540000000FF00000000000000FF00000000004D
-:106550000000FF00000000000000FF00000000003D
-:106560000000FF00000000000000FF00000000002D
-:1065700000000000140AFF000000000100000000FD
-:106580000020100100000000010090000000010048
-:1065900000009002000090040000900600009008A7
-:1065A0000000900A0000900C0000900E0000901077
-:1065B0000000901200009014000090160000901847
-:1065C0000000901A0000901C0000901E0000902017
-:1065D00000009022000090240000902600009028E7
-:1065E0000000902A0000902C0000902E00009030B7
-:1065F0000000903200009034000090360000903887
-:106600000000903A0000903C0000903E0000904056
-:106610000000904200009044000090460000904826
-:106620000000904A0000904C0000904E00009050F6
-:1066300000009052000090540000905600009058C6
-:106640000000905A0000905C0000905E0000906096
-:106650000000906200009064000090660000906866
-:106660000000906A0000906C0000906E0000907036
-:106670000000907200009074000090760000907806
-:106680000000907A0000907C0000907E00009080D6
-:1066900000009082000090840000908600009088A6
-:1066A0000000908A0000908C0000908E0000909076
-:1066B0000000909200009094000090960000909846
-:1066C0000000909A0000909C0000909E000090A016
-:1066D000000090A2000090A4000090A6000090A8E6
-:1066E000000090AA000090AC000090AE000090B0B6
-:1066F000000090B2000090B4000090B6000090B886
-:10670000000090BA000090BC000090BE000090C055
-:10671000000090C2000090C4000090C6000090C825
-:10672000000090CA000090CC000090CE000090D0F5
-:10673000000090D2000090D4000090D6000090D8C5
-:10674000000090DA000090DC000090DE000090E095
-:10675000000090E2000090E4000090E6000090E865
-:10676000000090EA000090EC000090EE000090F035
-:10677000000090F2000090F4000090F6000090F805
-:10678000000090FA000090FC000090FE00009100D4
-:1067900000009102000091040000910600009108A1
-:1067A0000000910A0000910C0000910E0000911071
-:1067B0000000911200009114000091160000911841
-:1067C0000000911A0000911C0000911E0000912011
-:1067D00000009122000091240000912600009128E1
-:1067E0000000912A0000912C0000912E00009130B1
-:1067F0000000913200009134000091360000913881
-:106800000000913A0000913C0000913E0000914050
-:106810000000914200009144000091460000914820
-:106820000000914A0000914C0000914E00009150F0
-:1068300000009152000091540000915600009158C0
-:106840000000915A0000915C0000915E0000916090
-:106850000000916200009164000091660000916860
-:106860000000916A0000916C0000916E0000917030
-:106870000000917200009174000091760000917800
-:106880000000917A0000917C0000917E00009180D0
-:1068900000009182000091840000918600009188A0
-:1068A0000000918A0000918C0000918E0000919070
-:1068B0000000919200009194000091960000919840
-:1068C0000000919A0000919C0000919E000091A010
-:1068D000000091A2000091A4000091A6000091A8E0
-:1068E000000091AA000091AC000091AE000091B0B0
-:1068F000000091B2000091B4000091B6000091B880
-:10690000000091BA000091BC000091BE000091C04F
-:10691000000091C2000091C4000091C6000091C81F
-:10692000000091CA000091CC000091CE000091D0EF
-:10693000000091D2000091D4000091D6000091D8BF
-:10694000000091DA000091DC000091DE000091E08F
-:10695000000091E2000091E4000091E6000091E85F
-:10696000000091EA000091EC000091EE000091F02F
-:10697000000091F2000091F4000091F6000091F8FF
-:10698000000091FA000091FC000091FEFFFFFFFF64
-:10699000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
-:1069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
-:1069B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
-:1069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7
-:1069D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
-:1069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7
-:1069F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7
-:106A0000FFFFFFFFFFFFFFFFFFFFFFFF000000038F
-:106A100000BEBC20000000000000000500000003D4
-:106A200000BEBC20000000000000000500000003C4
-:106A300000BEBC20000000000000000500000003B4
-:106A400000BEBC20000000000000000500000003A4
-:106A500000BEBC2000000000000000050000000394
-:106A600000BEBC2000000000000000050000000384
-:106A700000BEBC2000000000000000050000000374
-:106A800000BEBC2000000000000000050000200047
-:106A9000000040C000006180000082400000A300B0
-:106AA0000000C3C00000E480000105400001260092
-:106AB000000146C000016780000188400001A90074
-:106AC0000001C9C00001EA8000020B4000022C0056
-:106AD00000024CC000026D8000028E400002AF0038
-:106AE0000002CFC00002F0800000114000008000D2
-:106AF000000103800001870000020A8000028E006E
-:106B000000031180000395000004188000049C001D
-:106B100000051F800005A300000626800006AA00CD
-:106B200000072D800007B100000834800008B8007D
-:106B300000093B800009BF00000A4280000AC6002D
-:106B4000000B4980000BCD00000C5080000CD400DD
-:106B5000000D578000005B0000007FF800007FF808
-:106B60000000022A000035000000FF0000000000C5
-:106B70000000FF00000000000000FF000000000017
-:106B80000000FF00000000000000FF000000000007
-:106B90000000FF00000000000000FF0000000000F7
-:106BA0000000FF00000000000000FF0000000000E7
-:106BB0000000FF00000000000000FF0000000000D7
-:106BC0000000FF00000000000000FF0000000000C7
-:106BD0000000FF00000000000000FF0000000000B7
-:106BE0000000FF00000000000000FF0000000000A7
-:106BF0000000FF00000000000000FF000000000097
-:106C00000000FF00000000000000FF000000000086
-:106C10000000FF00000000000000FF000000000076
-:106C20000000FF00000000000000FF000000000066
-:106C30000000FF00000000000000FF000000000056
-:106C40000000FF00000000000000FF000000000046
-:106C50000000FF00000000000000FF000000000036
-:106C60000000FF00000000000000FF000000000026
-:106C70000000FF00000000000000FF000000000016
-:106C80000000FF00000000000000FF000000000006
-:106C90000000FF00000000000000FF0000000000F6
-:106CA0000000FF00000000000000FF0000000000E6
-:106CB0000000FF00000000000000FF0000000000D6
-:106CC0000000FF00000000000000FF0000000000C6
-:106CD0000000FF00000000000000FF0000000000B6
-:106CE0000000FF00000000000000FF0000000000A6
-:106CF0000000FF00000000000000FF000000000096
-:106D00000000FF00000000000000FF000000000085
-:106D10000000FF00000000000000FF000000000075
-:106D20000000FF00000000000000FF000000000065
-:106D30000000FF00000000000000FF000000000055
-:106D40000000FF00000000000000FF000000000045
-:106D50000000FF00000000000000FF000000000035
-:106D60000000FF00000000000000FF000000000025
-:106D70000000FF00000000000000FF000000000015
-:106D80000000FF00000000000000FF000000000005
-:106D90000000FF00000000000000FF0000000000F5
-:106DA0000000FF00000019000000000000000000CB
-:106DB000FFFFFFFF000000000393870000000000BA
-:106DC0000393870000007FF800007FF800000BA30A
-:106DD00000001500000000FF000000FF000000FFA1
-:106DE000000000FF000000FF000000FF000000FFA7
-:106DF000000000FF0000FF00000000000000FF0096
-:106E0000000000000000FF00000000000000FF0084
-:106E1000000000000000FF00000000000000FF0074
-:106E2000000000000000FF00000000000000FF0064
-:106E3000000000000000FF00000000000000FF0054
-:106E4000000000000000FF00000000000000FF0044
-:106E5000000000000000FF00000000000000FF0034
-:106E6000000000000000FF00000000000000FF0024
-:106E7000000000000000FF00000000000000FF0014
-:106E8000000000000000FF00000000000000FF0004
-:106E9000000000000000FF00000000000000FF00F4
-:106EA000000000000000FF00000000000000FF00E4
-:106EB000000000000000FF00000000000000FF00D4
-:106EC000000000000000FF00000000000000FF00C4
-:106ED000000000000000FF00000000000000FF00B4
-:106EE000000000000000FF00000000000000FF00A4
-:106EF000000000000000FF00000000000000FF0094
-:106F0000000000000000FF00000000000000FF0083
-:106F1000000000000000FF00000000000000FF0073
-:106F2000000000000000FF00000000000000FF0063
-:106F3000000000000000FF00000000000000FF0053
-:106F4000000000000000FF00000000000000FF0043
-:106F5000000000000000FF00000000000000FF0033
-:106F6000000000000000FF00000000000000FF0023
-:106F7000000000000000FF00000000000000FF0013
-:106F8000000000000000FF00000000000000FF0003
-:106F9000000000000000FF00000000000000FF00F3
-:106FA000000000000000FF00000000000000FF00E3
-:106FB000000000000000FF00000000000000FF00D3
-:106FC000000000000000FF00000000000000FF00C3
-:106FD000000000000000FF00000000000000FF00B3
-:106FE000000000000000FF00000000000000FF00A3
-:106FF000000000000000FF00000000000000FF0093
-:10700000000000000000FF00000000000000FF0082
-:10701000000000000000FF00000000000000FF0072
-:10702000000000000000FF00000000000000FF0062
-:1070300000000000FFFFFFFFFFFFFFFFFFFFFFFF5C
-:10704000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
-:10705000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
-:10706000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
-:10707000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
-:10708000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
-:10709000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
-:1070A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
-:1070B000FFFFFFFF00000000000028AD00002918BE
-:1070C0000000291900000005000000070000FF0073
-:1070D0000FFFFFFF0000FF000FFFFFFF000000FF9A
-:1070E0000000FF000000FF000FFFFFFF0000FF0097
-:1070F0000FFFFFFF000000FF0000FF000000FF0087
-:107100000FFFFFFF0000FF000FFFFFFF000000FF69
-:107110000000FF000000FF000FFFFFFF0000FF0066
-:107120000FFFFFFF000000FF0000FF000000FF0056
-:107130000FFFFFFF0000FF000FFFFFFF000000FF39
-:107140000000FF000000FF000FFFFFFF0000FF0036
-:107150000FFFFFFF000000FF0000FF000000FF0026
-:107160000FFFFFFF0000FF000FFFFFFF000000FF09
-:107170000000FF000000FF000FFFFFFF0000FF0006
-:107180000FFFFFFF000000FF0000FF000000FF00F6
-:107190000FFFFFFF0000FF000FFFFFFF000000FFD9
-:1071A0000000FF000000FF000FFFFFFF0000FF00D6
-:1071B0000FFFFFFF000000FF0000FF000000FF00C6
-:1071C0000FFFFFFF0000FF000FFFFFFF000000FFA9
-:1071D0000000FF000000FF000FFFFFFF0000FF00A6
-:1071E0000FFFFFFF000000FF0000FF000000FF0096
-:1071F0000FFFFFFF0000FF000FFFFFFF000000FF79
-:107200000000FF000000FF000FFFFFFF0000FF0075
-:107210000FFFFFFF000000FF0000FF000000FF0065
-:107220000FFFFFFF0000FF000FFFFFFF000000FF48
-:107230000000FF000000FF000FFFFFFF0000FF0045
-:107240000FFFFFFF000000FF0000FF000000FF0035
-:107250000FFFFFFF0000FF000FFFFFFF000000FF18
-:107260000000FF000000FF000FFFFFFF0000FF0015
-:107270000FFFFFFF000000FF0000FF000000FF0005
-:107280000FFFFFFF0000FF000FFFFFFF000000FFE8
-:107290000000FF000000FF000FFFFFFF0000FF00E5
-:1072A0000FFFFFFF000000FF0000FF000000FF00D5
-:1072B0000FFFFFFF0000FF000FFFFFFF000000FFB8
-:1072C0000000FF000000FF000FFFFFFF0000FF00B5
-:1072D0000FFFFFFF000000FF0000FF000000FF00A5
-:1072E0000FFFFFFF0000FF000FFFFFFF000000FF88
-:1072F0000000FF000000FF000FFFFFFF0000FF0085
-:107300000FFFFFFF000000FF0000FF000000FF0074
-:107310000FFFFFFF0000FF000FFFFFFF000000FF57
-:107320000000FF000000FF000FFFFFFF0000FF0054
-:107330000FFFFFFF000000FF0000FF000000FF0044
-:107340000FFFFFFF0000FF000FFFFFFF000000FF27
-:107350000000FF000000FF000FFFFFFF0000FF0024
-:107360000FFFFFFF000000FF0000FF000000FF0014
-:107370000FFFFFFF0000FF000FFFFFFF000000FFF7
-:107380000000FF000000FF000FFFFFFF0000FF00F4
-:107390000FFFFFFF000000FF0000FF000000FF00E4
-:1073A0000FFFFFFF0000FF000FFFFFFF000000FFC7
-:1073B0000000FF000000FF000FFFFFFF0000FF00C4
-:1073C0000FFFFFFF000000FF0000FF000000FF00B4
-:1073D0000FFFFFFF0000FF000FFFFFFF000000FF97
-:1073E0000000FF000000FF000FFFFFFF0000FF0094
-:1073F0000FFFFFFF000000FF0000FF000000FF0084
-:107400000FFFFFFF0000FF000FFFFFFF000000FF66
-:107410000000FF000000FF000FFFFFFF0000FF0063
-:107420000FFFFFFF000000FF0000FF000000FF0053
-:107430000FFFFFFF0000FF000FFFFFFF000000FF36
-:107440000000FF000000FF000FFFFFFF0000FF0033
-:107450000FFFFFFF000000FF0000FF000000FF0023
-:107460000FFFFFFF0000FF000FFFFFFF000000FF06
-:107470000000FF000000FF000FFFFFFF0000FF0003
-:107480000FFFFFFF000000FF0000FF000000FF00F3
-:107490000FFFFFFF0000FF000FFFFFFF000000FFD6
-:1074A0000000FF000000FF000FFFFFFF0000FF00D3
-:1074B0000FFFFFFF000000FF0000FF000000FF00C3
-:1074C0000FFFFFFF0000FF000FFFFFFF000000FFA6
-:1074D0000000FF000000FF000FFFFFFF0000FF00A3
-:1074E0000FFFFFFF000000FF0000FF000000FF0093
-:1074F0000FFFFFFF0000FF000FFFFFFF000000FF76
-:107500000000FF000000FF000FFFFFFF0000FF0072
-:107510000FFFFFFF000000FF0000FF000000FF0062
-:107520000FFFFFFF0000FF000FFFFFFF000000FF45
-:107530000000FF000000FF000FFFFFFF0000FF0042
-:107540000FFFFFFF000000FF0000FF000000FF0032
-:107550000FFFFFFF0000FF000FFFFFFF000000FF15
-:107560000000FF000000FF000FFFFFFF0000FF0012
-:107570000FFFFFFF000000FF0000FF000000FF0002
-:107580000FFFFFFF0000FF000FFFFFFF000000FFE5
-:107590000000FF000000FF000FFFFFFF0000FF00E2
-:1075A0000FFFFFFF000000FF0000FF000000FF00D2
-:1075B0000FFFFFFF0000FF000FFFFFFF000000FFB5
-:1075C0000000FF000000FF000FFFFFFF0000FF00B2
-:1075D0000FFFFFFF000000FF0000FF000000FF00A2
-:1075E0000FFFFFFF0000FF000FFFFFFF000000FF85
-:1075F0000000FF000000FF000FFFFFFF0000FF0082
-:107600000FFFFFFF000000FF0000FF000000FF0071
-:107610000FFFFFFF0000FF000FFFFFFF000000FF54
-:107620000000FF000000FF000FFFFFFF0000FF0051
-:107630000FFFFFFF000000FF0000FF000000FF0041
-:107640000FFFFFFF0000FF000FFFFFFF000000FF24
-:107650000000FF000000FF000FFFFFFF0000FF0021
-:107660000FFFFFFF000000FF0000FF000000FF0011
-:107670000FFFFFFF0000FF000FFFFFFF000000FFF4
-:107680000000FF000000FF000FFFFFFF0000FF00F1
-:107690000FFFFFFF000000FF0000FF000000FF00E1
-:1076A0000FFFFFFF0000FF000FFFFFFF000000FFC4
-:1076B0000000FF000000FF000FFFFFFF0000FF00C1
-:1076C0000FFFFFFF000000FF0000FF000000FF00B1
-:1076D0000FFFFFFF0000FF000FFFFFFF000000FF94
-:1076E0000000FF000000FF000FFFFFFF0000FF0091
-:1076F0000FFFFFFF000000FF0000FF000000FF0081
-:107700000FFFFFFF0000FF000FFFFFFF000000FF63
-:107710000000FF000000FF000FFFFFFF0000FF0060
-:107720000FFFFFFF000000FF0000FF000000FF0050
-:107730000FFFFFFF0000FF000FFFFFFF000000FF33
-:107740000000FF000000FF000FFFFFFF0000FF0030
-:107750000FFFFFFF000000FF0000FF000000FF0020
-:107760000FFFFFFF0000FF000FFFFFFF000000FF03
-:107770000000FF000000FF000FFFFFFF0000FF0000
-:107780000FFFFFFF000000FF0000FF000000FF00F0
-:107790000FFFFFFF0000FF000FFFFFFF000000FFD3
-:1077A0000000FF000000FF000FFFFFFF0000FF00D0
-:1077B0000FFFFFFF000000FF0000FF000000FF00C0
-:1077C0000FFFFFFF0000FF000FFFFFFF000000FFA3
-:1077D0000000FF000000FF000FFFFFFF0000FF00A0
-:1077E0000FFFFFFF000000FF0000FF000000FF0090
-:1077F0000FFFFFFF0000FF000FFFFFFF000000FF73
-:107800000000FF000000FF000FFFFFFF0000FF006F
-:107810000FFFFFFF000000FF0000FF000000FF005F
-:107820000FFFFFFF0000FF000FFFFFFF000000FF42
-:107830000000FF000000FF000FFFFFFF0000FF003F
-:107840000FFFFFFF000000FF0000FF000000FF002F
-:107850000FFFFFFF0000FF000FFFFFFF000000FF12
-:107860000000FF000000FF000FFFFFFF0000FF000F
-:107870000FFFFFFF000000FF0000FF000000FF00FF
-:107880000FFFFFFF0000FF000FFFFFFF000000FFE2
-:107890000000FF000000FF000FFFFFFF0000FF00DF
-:1078A0000FFFFFFF000000FF0000FF000000FF00CF
-:1078B0000FFFFFFF0000FF000FFFFFFF000000FFB2
-:1078C0000000FF000000FF000FFFFFFF0000FF00AF
-:1078D0000FFFFFFF000000FF0000FF000000FF009F
-:1078E0000FFFFFFF0000FF000FFFFFFF000000FF82
-:1078F0000000FF000000FF000FFFFFFF0000FF007F
-:107900000FFFFFFF000000FF0000FF000000FF006E
-:107910000FFFFFFF0000FF000FFFFFFF000000FF51
-:107920000000FF000000FF000FFFFFFF0000FF004E
-:107930000FFFFFFF000000FF0000FF000000FF003E
-:107940000FFFFFFF0000FF000FFFFFFF000000FF21
-:107950000000FF000000FF000FFFFFFF0000FF001E
-:107960000FFFFFFF000000FF0000FF000000FF000E
-:107970000FFFFFFF0000FF000FFFFFFF000000FFF1
-:107980000000FF000000FF000FFFFFFF0000FF00EE
-:107990000FFFFFFF000000FF0000FF000000FF00DE
-:1079A0000FFFFFFF0000FF000FFFFFFF000000FFC1
-:1079B0000000FF000000FF000FFFFFFF0000FF00BE
-:1079C0000FFFFFFF000000FF0000FF000000FF00AE
-:1079D0000FFFFFFF0000FF000FFFFFFF000000FF91
-:1079E0000000FF000000FF000FFFFFFF0000FF008E
-:1079F0000FFFFFFF000000FF0000FF000000FF007E
-:107A00000FFFFFFF0000FF000FFFFFFF000000FF60
-:107A10000000FF000000FF000FFFFFFF0000FF005D
-:107A20000FFFFFFF000000FF0000FF000000FF004D
-:107A30000FFFFFFF0000FF000FFFFFFF000000FF30
-:107A40000000FF000000FF000FFFFFFF0000FF002D
-:107A50000FFFFFFF000000FF0000FF000000FF001D
-:107A60000FFFFFFF0000FF000FFFFFFF000000FF00
-:107A70000000FF000000FF000FFFFFFF0000FF00FD
-:107A80000FFFFFFF000000FF0000FF000000FF00ED
-:107A90000FFFFFFF0000FF000FFFFFFF000000FFD0
-:107AA0000000FF000000FF000FFFFFFF0000FF00CD
-:107AB0000FFFFFFF000000FF0000FF000000FF00BD
-:107AC0000FFFFFFF0000FF000FFFFFFF000000FFA0
-:107AD0000000FF000000FF000FFFFFFF0000FF009D
-:107AE0000FFFFFFF000000FF0000FF000000FF008D
-:107AF0000FFFFFFF0000FF000FFFFFFF000000FF70
-:107B00000000FF000000FF000FFFFFFF0000FF006C
-:107B10000FFFFFFF000000FF0000FF000000FF005C
-:107B20000FFFFFFF0000FF000FFFFFFF000000FF3F
-:107B30000000FF000000FF000FFFFFFF0000FF003C
-:107B40000FFFFFFF000000FF0000FF000000FF002C
-:107B50000FFFFFFF0000FF000FFFFFFF000000FF0F
-:107B60000000FF000000FF000FFFFFFF0000FF000C
-:107B70000FFFFFFF000000FF0000FF000000FF00FC
-:107B80000FFFFFFF0000FF000FFFFFFF000000FFDF
-:107B90000000FF000000FF000FFFFFFF0000FF00DC
-:107BA0000FFFFFFF000000FF0000FF000000FF00CC
-:107BB0000FFFFFFF0000FF000FFFFFFF000000FFAF
-:107BC0000000FF000000FF000FFFFFFF0000FF00AC
-:107BD0000FFFFFFF000000FF0000FF000000FF009C
-:107BE0000FFFFFFF0000FF000FFFFFFF000000FF7F
-:107BF0000000FF000000FF000FFFFFFF0000FF007C
-:107C00000FFFFFFF000000FF0000FF000000FF006B
-:107C10000FFFFFFF0000FF000FFFFFFF000000FF4E
-:107C20000000FF000000FF000FFFFFFF0000FF004B
-:107C30000FFFFFFF000000FF0000FF000000FF003B
-:107C40000FFFFFFF0000FF000FFFFFFF000000FF1E
-:107C50000000FF000000FF000FFFFFFF0000FF001B
-:107C60000FFFFFFF000000FF0000FF000000FF000B
-:107C70000FFFFFFF0000FF000FFFFFFF000000FFEE
-:107C80000000FF000000FF000FFFFFFF0000FF00EB
-:107C90000FFFFFFF000000FF0000FF000000FF00DB
-:107CA0000FFFFFFF0000FF000FFFFFFF000000FFBE
-:107CB0000000FF000000FF000FFFFFFF0000FF00BB
-:107CC0000FFFFFFF000000FF0000FF000000FF00AB
-:107CD0000FFFFFFF0000FF000FFFFFFF000000FF8E
-:107CE0000000FF000000FF000FFFFFFF0000FF008B
-:107CF0000FFFFFFF000000FF0000FF000000FF007B
-:107D00000FFFFFFF0000FF000FFFFFFF000000FF5D
-:107D10000000FF000000FF000FFFFFFF0000FF005A
-:107D20000FFFFFFF000000FF0000FF000000FF004A
-:107D30000FFFFFFF0000FF000FFFFFFF000000FF2D
-:107D40000000FF000000FF000FFFFFFF0000FF002A
-:107D50000FFFFFFF000000FF0000FF000000FF001A
-:107D60000FFFFFFF0000FF000FFFFFFF000000FFFD
-:107D70000000FF000000FF000FFFFFFF0000FF00FA
-:107D80000FFFFFFF000000FF0000FF0000001000D9
-:107D900000002080000031000000418000005200FF
-:107DA00000006280000073000000838000009400E7
-:107DB0000000A4800000B5000000C5800000D600CF
-:107DC0000000E6800000F7000001078000011800B5
-:107DD00000012880000139000001498000015A009B
-:107DE00000016A8000017B0000018B8000019C0083
-:107DF0000001AC800001BD000001CD800001DE006B
-:107E00000001EE800001FF0000000F8000007FF8FD
-:107E100000007FF8000005F60000350010000000AB
-:107E2000000028AD000029180000291900000005F5
-:107E3000000000060001000100090206CCCCCCC9FC
-:107E40007058103C0000FF00000000000000FF0020
-:107E5000000000000000FF00000000000000FF0024
-:107E6000000000000000FF00000000000000FF0014
-:107E7000000000000000FF00000000000000FF0004
-:107E8000000000000000FF00000000000000FF00F4
-:107E9000000000000000FF00000000000000FF00E4
-:107EA000000000000000FF00000000000000FF00D4
-:107EB000000000000000FF00000000000000FF00C4
-:107EC000000000000000FF00000000000000FF00B4
-:107ED000000000000000FF00000000000000FF00A4
-:107EE000000000000000FF00000000000000FF0094
-:107EF000000000000000FF00000000000000FF0084
-:107F0000000000000000FF00000000000000FF0073
-:107F1000000000000000FF00000000000000FF0063
-:107F2000000000000000FF00000000000000FF0053
-:107F3000000000000000FF00000000000000FF0043
-:107F4000000000000000FF00000000000000FF0033
-:107F5000000000000000FF00000000000000FF0023
-:107F6000000000000000FF00000000000000FF0013
-:107F7000000000000000FF00000000000000FF0003
-:107F8000000000000000FF00000000000000FF00F3
-:107F9000000000000000FF00000000000000FF00E3
-:107FA000000000000000FF00000000000000FF00D3
-:107FB000000000000000FF00000000000000FF00C3
-:107FC000000000000000FF00000000000000FF00B3
-:107FD000000000000000FF00000000000000FF00A3
-:107FE000000000000000FF00000000000000FF0093
-:107FF000000000000000FF00000000000000FF0083
-:10800000000000000000FF00000000000000FF0072
-:10801000000000000000FF00000000000000FF0062
-:10802000000000000000FF00000000000000FF0052
-:10803000000000000000FF00000000000000FF0042
-:10804000000000000000FF00000000000000FF0032
-:10805000000000000000FF00000000000000FF0022
-:10806000000000000000FF00000000000000FF0012
-:10807000000000000000FF00000000000000FF0002
-:108080000000000000000001CCCC0201CCCCCCCC24
-:10809000CCCC0201CCCCCCCCCCCC0201CCCCCCCC4A
-:1080A000CCCC0201CCCCCCCCCCCC0201CCCCCCCC3A
-:1080B000CCCC0201CCCCCCCCCCCC0201CCCCCCCC2A
-:1080C000CCCC0201CCCCCCCC00000000FFFFFFFFE9
-:1080D000030303031342020250505020706080508B
-:1080E0000200020006040604000E0000011600D67D
-:1080F000002625A0002625A0002625A0002625A0D4
-:1081000000720000012300F3002625A0002625A010
-:10811000002625A0002625A00000FFFF000000008B
-:108120000000FFFF000000000000FFFF0000000053
-:108130000000FFFF000000000000FFFF0000000043
-:108140000000FFFF000000000000FFFF0000000033
-:108150000000FFFF000000000000FFFF0000000023
-:108160000000FFFF000000000000FFFF0000000013
-:108170000000FFFF000000000000FFFF0000000003
-:108180000000FFFF000000000000FFFF00000000F3
-:108190000000FFFF000000000000FFFF00000000E3
-:1081A0000000FFFF000000000000FFFF00000000D3
-:1081B0000000FFFF000000000000FFFF00000000C3
-:1081C0000000FFFF000000000000FFFF00000000B3
-:1081D0000000FFFF000000000000FFFF00000000A3
-:1081E0000000FFFF000000000000FFFF0000000093
-:1081F0000000FFFF000000000000FFFF0000000083
-:108200000000FFFF000000000000FFFF0000000072
-:108210000000FFFF000000000000FFFF0000000062
-:108220000000FFFF000000000000FFFF0000000052
-:108230000000FFFF000000000000FFFF0000000042
-:108240000000FFFF000000000000FFFF0000000032
-:108250000000FFFF000000000000FFFF0000000022
-:108260000000FFFF000000000000FFFF0000000012
-:108270000000FFFF000000000000FFFF0000000002
-:108280000000FFFF000000000000FFFF00000000F2
-:108290000000FFFF000000000000FFFF00000000E2
-:1082A0000000FFFF000000000000FFFF00000000D2
-:1082B0000000FFFF000000000000FFFF00000000C2
-:1082C0000000FFFF000000000000FFFF00000000B2
-:1082D0000000FFFF000000000000FFFF00000000A2
-:1082E0000000FFFF000000000000FFFF0000000092
-:1082F0000000FFFF000000000000FFFF0000000082
-:108300000000FFFF000000000000FFFF0000000071
-:108310000000FFFF00000000FFFFFFF3318FFFFFB1
-:108320000C30C30CC30C30C3CF3CF300F3CF3CF391
-:108330000000CF3CCDCDCDCDFFFFFFF130EFFFFFF3
-:108340000C30C30CC30C30C3CF3CF300F3CF3CF371
-:108350000001CF3CCDCDCDCDFFFFFFF6305FFFFF5D
-:108360000C30C30CC30C30C3CF3CF300F3CF3CF351
-:108370000002CF3CCDCDCDCDFFFFF4061CBFFFFFEB
-:108380000C30C305C30C30C3CF300014F3CF3CF323
-:108390000004CF3CCDCDCDCDFFFFFFF2304FFFFF2E
-:1083A0000C30C30CC30C30C3CF3CF300F3CF3CF311
-:1083B0000008CF3CCDCDCDCDFFFFFFFA302FFFFF22
-:1083C0000C30C30CC30C30C3CF3CF300F3CF3CF3F1
-:1083D0000010CF3CCDCDCDCDFFFFFFF731EFFFFF3C
-:1083E0000C30C30CC30C30C3CF3CF300F3CF3CF3D1
-:1083F0000020CF3CCDCDCDCDFFFFFFF5302FFFFFCF
-:108400000C30C30CC30C30C3CF3CF300F3CF3CF3B0
-:108410000040CF3CCDCDCDCDFFFFFFF3318FFFFF2F
-:108420000C30C30CC30C30C3CF3CF300F3CF3CF390
-:108430000000CF3CCDCDCDCDFFFFFFF1310FFFFFD1
-:108440000C30C30CC30C30C3CF3CF300F3CF3CF370
-:108450000001CF3CCDCDCDCDFFFFFFF6305FFFFF5C
-:108460000C30C30CC30C30C3CF3CF300F3CF3CF350
-:108470000002CF3CCDCDCDCDFFFFF4061CBFFFFFEA
-:108480000C30C305C30C30C3CF300014F3CF3CF322
-:108490000004CF3CCDCDCDCDFFFFFFF2304FFFFF2D
-:1084A0000C30C30CC30C30C3CF3CF300F3CF3CF310
-:1084B0000008CF3CCDCDCDCDFFFFFFFA302FFFFF21
-:1084C0000C30C30CC30C30C3CF3CF300F3CF3CF3F0
-:1084D0000010CF3CCDCDCDCDFFFFFFF730EFFFFF3C
-:1084E0000C30C30CC30C30C3CF3CF300F3CF3CF3D0
-:1084F0000020CF3CCDCDCDCDFFFFFFF5304FFFFFAE
-:108500000C30C30CC30C30C3CF3CF300F3CF3CF3AF
-:108510000040CF3CCDCDCDCDFFFFFFFF30CFFFFFE3
-:108520000C30C30CC30C30C3CF3CF3CCF3CF3CF3C3
-:108530000000CF3CCDCDCDCDFFFFFFFF30CFFFFF03
-:108540000C30C30CC30C30C3CF3CF3CCF3CF3CF3A3
-:108550000001CF3CCDCDCDCDFFFFFFFF30CFFFFFE2
-:108560000C30C30CC30C30C3CF3CF3CCF3CF3CF383
-:108570000002CF3CCDCDCDCDFFFFFFFF30CFFFFFC1
-:108580000C30C30CC30C30C3CF3CF3CCF3CF3CF363
-:108590000004CF3CCDCDCDCDFFFFFFFF30CFFFFF9F
-:1085A0000C30C30CC30C30C3CF3CF3CCF3CF3CF343
-:1085B0000008CF3CCDCDCDCDFFFFFFFF30CFFFFF7B
-:1085C0000C30C30CC30C30C3CF3CF3CCF3CF3CF323
-:1085D0000010CF3CCDCDCDCDFFFFFFFF30CFFFFF53
-:1085E0000C30C30CC30C30C3CF3CF3CCF3CF3CF303
-:1085F0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF23
-:108600000C30C30CC30C30C3CF3CF3CCF3CF3CF3E2
-:108610000040CF3CCDCDCDCDFFFFFFF3320FFFFFAC
-:108620000C30C30CC30C30C3CF3CF300F3CF3CF38E
-:108630000000CF3CCDCDCDCDFFFFFFF1310FFFFFCF
-:108640000C30C30CC30C30C3CF3CF300F3CF3CF36E
-:108650000001CF3CCDCDCDCDFFFFFFF6305FFFFF5A
-:108660000C30C30CC30C30C3CF3CF300F3CF3CF34E
-:108670000002CF3CCDCDCDCDFFFFF4061CBFFFFFE8
-:108680000C30C305C30C30C3CF300014F3CF3CF320
-:108690000004CF3CCDCDCDCDFFFFFFF2304FFFFF2B
-:1086A0000C30C30CC30C30C3CF3CF300F3CF3CF30E
-:1086B0000008CF3CCDCDCDCDFFFFFF8A042FFFFFBB
-:1086C0000C30C30CC30C30C3CF3CC000F3CF3CF321
-:1086D0000010CF3CCDCDCDCDFFFFFF9705CFFFFFE5
-:1086E0000C30C30CC30C30C3CF3CC000F3CF3CF301
-:1086F0000020CF3CCDCDCDCDFFFFFFF5310FFFFFEB
-:108700000C30C30CC30C30C3CF3CF300F3CF3CF3AD
-:108710000040CF3CCDCDCDCDFFFFFFF3320FFFFFAB
-:108720000C30C30CC30C30C3CF3CF300F3CF3CF38D
-:108730000000CF3CCDCDCDCDFFFFFFF1302FFFFFAF
-:108740000C30C30CC30C30C3CF3CF300F3CF3CF36D
-:108750000001CF3CCDCDCDCDFFFFFFF6305FFFFF59
-:108760000C30C30CC30C30C3CF3CF300F3CF3CF34D
-:108770000002CF3CCDCDCDCDFFFFFF061CBFFFFFDC
-:108780000C30C30CC30C30C3CF3CC014F3CF3CF34C
-:108790000004CF3CCDCDCDCDFFFFFFF2304FFFFF2A
-:1087A0000C30C30CC30C30C3CF3CF300F3CF3CF30D
-:1087B0000008CF3CCDCDCDCDFFFFFFFA302FFFFF1E
-:1087C0000C30C30CC30C30C3CF3CF300F3CF3CF3ED
-:1087D0000010CF3CCDCDCDCDFFFFFFF731CFFFFF58
-:1087E0000C30C30CC30C30C3CF3CF300F3CF3CF3CD
-:1087F0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF21
-:108800000C30C30CC30C30C3CF3CF3CCF3CF3CF3E0
-:108810000040CF3CCDCDCDCDFFFFFFFF30CFFFFFE0
-:108820000C30C30CC30C30C3CF3CF3CCF3CF3CF3C0
-:108830000000CF3CCDCDCDCDFFFFFFFF30CFFFFF00
-:108840000C30C30CC30C30C3CF3CF3CCF3CF3CF3A0
-:108850000001CF3CCDCDCDCDFFFFFFFF30CFFFFFDF
-:108860000C30C30CC30C30C3CF3CF3CCF3CF3CF380
-:108870000002CF3CCDCDCDCDFFFFFFFF30CFFFFFBE
-:108880000C30C30CC30C30C3CF3CF3CCF3CF3CF360
-:108890000004CF3CCDCDCDCDFFFFFFFF30CFFFFF9C
-:1088A0000C30C30CC30C30C3CF3CF3CCF3CF3CF340
-:1088B0000008CF3CCDCDCDCDFFFFFFFF30CFFFFF78
-:1088C0000C30C30CC30C30C3CF3CF3CCF3CF3CF320
-:1088D0000010CF3CCDCDCDCDFFFFFFFF30CFFFFF50
-:1088E0000C30C30CC30C30C3CF3CF3CCF3CF3CF300
-:1088F0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF20
-:108900000C30C30CC30C30C3CF3CF3CCF3CF3CF3DF
-:108910000040CF3CCDCDCDCDFFFFFFFF30CFFFFFDF
-:108920000C30C30CC30C30C3CF3CF3CCF3CF3CF3BF
-:108930000000CF3CCDCDCDCDFFFFFFFF30CFFFFFFF
-:108940000C30C30CC30C30C3CF3CF3CCF3CF3CF39F
-:108950000001CF3CCDCDCDCDFFFFFFFF30CFFFFFDE
-:108960000C30C30CC30C30C3CF3CF3CCF3CF3CF37F
-:108970000002CF3CCDCDCDCDFFFFFFFF30CFFFFFBD
-:108980000C30C30CC30C30C3CF3CF3CCF3CF3CF35F
-:108990000004CF3CCDCDCDCDFFFFFFFF30CFFFFF9B
-:1089A0000C30C30CC30C30C3CF3CF3CCF3CF3CF33F
-:1089B0000008CF3CCDCDCDCDFFFFFFFF30CFFFFF77
-:1089C0000C30C30CC30C30C3CF3CF3CCF3CF3CF31F
-:1089D0000010CF3CCDCDCDCDFFFFFFFF30CFFFFF4F
-:1089E0000C30C30CC30C30C3CF3CF3CCF3CF3CF3FF
-:1089F0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF1F
-:108A00000C30C30CC30C30C3CF3CF3CCF3CF3CF3DE
-:108A10000040CF3CCDCDCDCDFFFFFFFF30CFFFFFDE
-:108A20000C30C30CC30C30C3CF3CF3CCF3CF3CF3BE
-:108A30000000CF3CCDCDCDCDFFFFFFFF30CFFFFFFE
-:108A40000C30C30CC30C30C3CF3CF3CCF3CF3CF39E
-:108A50000001CF3CCDCDCDCDFFFFFFFF30CFFFFFDD
-:108A60000C30C30CC30C30C3CF3CF3CCF3CF3CF37E
-:108A70000002CF3CCDCDCDCDFFFFFFFF30CFFFFFBC
-:108A80000C30C30CC30C30C3CF3CF3CCF3CF3CF35E
-:108A90000004CF3CCDCDCDCDFFFFFFFF30CFFFFF9A
-:108AA0000C30C30CC30C30C3CF3CF3CCF3CF3CF33E
-:108AB0000008CF3CCDCDCDCDFFFFFFFF30CFFFFF76
-:108AC0000C30C30CC30C30C3CF3CF3CCF3CF3CF31E
-:108AD0000010CF3CCDCDCDCDFFFFFFFF30CFFFFF4E
-:108AE0000C30C30CC30C30C3CF3CF3CCF3CF3CF3FE
-:108AF0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF1E
-:108B00000C30C30CC30C30C3CF3CF3CCF3CF3CF3DD
-:108B10000040CF3CCDCDCDCD000C0000000700C003
-:108B200000028130000B8158000202100001023067
-:108B3000000F024000010330000C0000000800C0DC
-:108B400000028140000B8168000202200001024007
-:108B500000070250000202C00010000000080100DF
-:108B600000028180000B81A8000202600001828067
-:108B7000000E829800080380001000000001010030
-:108B80000002811000090138000201C8000101E85B
-:108B9000000E01F8000002D8CCCCCCCCCCCCCCCC94
-:108BA000CCCCCCCCCCCCCCCC00002000CCCCCCCC15
-:108BB000CCCCCCCCCCCCCCCCCCCCCCCC0000200005
-:108BC000CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCE5
-:108BD00004002000CCCCCCCCCCCCCCCCCCCCCCCCE1
-:108BE000CCCCCCCC4100200003030303034202029F
-:108BF0005050502070608050131313131342121200
-:108C000050505020706080500301020000000000AE
-:108C100000000000000000001F8B080000000000A2
-:108C2000000BFB51CFC0F0038A0F093230688A2055
-:108C3000F8C4E05C760686751C0C0C5BB849D3075B
-:108C4000C32C0C0C0CDA4CE4E905E1FBBC0C0CAFBA
-:108C50008098850F559C871342FF015AC0C7CAC030
-:108C6000A0C1865DFF3A35043B408581A11C88D9AF
-:108C7000941818CC5411E2D2EA0C0C3380FC04A8EE
-:108C8000D81D201DAB46BE9B47F1E0C1378D51F981
-:108C90005B0DA169012A7E0B4D7E1B54BE4A074223
-:108CA000DF36C66E6EB50E71F69FB546E5AFB4C63B
-:108CB000AFFEAE3D2AFF209AFAAD503E00C5D55B0F
-:108CC000A7D8030000000000000000000000000022
-:108CD0001F8B080000000000000BED7D7F7C14D589
-:108CE000B5F8999DD9D9D9CDEE6608096C20E02454
-:108CF000861AFB82DFE577A841878034B63CDF8A9D
-:108D00005AD3D6F6BB506C551456BF3EE1F56933C5
-:108D1000F941122262049FDAD61F2B554BFB6C8956
-:108D2000942AAD3FDE024AF1F5C743AAD5D7A22F58
-:108D3000FE80AA455FC4D2D87E51DE3DE7DEC9CEB3
-:108D40004C76930DD01F7FBCF081E1CEDC1FE79EF7
-:108D500073EE39E79E73EE8DEA0BC2C7CE05388EEF
-:108D60003FECD913028059D9A771F5BCAEBE99006A
-:108D70004721D2D35D0AD0A68009AC6C1D88A41F00
-:108D800094007F6A14565E2D7F3CDE5D097067D1CA
-:108D9000D7EEC3FA6B2C0502ECD9DD0C9039837D3C
-:108DA0000F453743314011A4B6E277F6937890F53A
-:108DB00037109C9C866876FC32F0D1B80015FAA179
-:108DC00022AA07C765F6CF81E47C18072083FDB38C
-:108DD000067A593FCAF3721AC795E5C5FA8B55D979
-:108DE0007EBC4F595721A389FEF01FF9B2E26438C7
-:108DF0007FFD35072AB73E5D93AD7F06444A0FFDE0
-:108E00001DFB8F020AC123AF07C4C3D130A4E5CA3A
-:108E1000FCFD0C341B5B9FF6231EBF509C989ABF31
-:108E20009E8DA7AE668D9E1DCD3A6402000C64B384
-:108E3000B7963DC3606EAE1DDA6E0148842FCDB08B
-:108E4000089EF6B02F5D5489502701187EFD881FBB
-:108E500009DF2FD1CC1CEDED279432FCD8F36578D7
-:108E60000C02EF0FD8FC1E64FD0571FC1CF8BA085B
-:108E7000C72F63DFAB878E6FCD3CF1F1436702EC08
-:108E80000B23BE4D84017C7A0AE282DE9F9486E940
-:108E900047D05931783F23E1BDA8C6971D97FD0DF6
-:108EA0001A21179F0462256EBEF1F225E2A90CE992
-:108EB0006548AF4FC9F6AB22DD72E0EB4A81AFFEE9
-:108EC000F989A604C3C7DA66B05E73B4936360A67B
-:108ED00073E069B568678FA794B27A39FA076811A9
-:108EE000EBC772D52F14BE9B4E10BE9BFF42F0DD28
-:108EF00026F89D49287AF6CF4F129CDEFE72AD2FE0
-:108F0000B68807CB21256DF990BF4B21FE207BF859
-:108F100035BECEECEFDF073FF5B303250E1BA74DA3
-:108F2000C0D73F9FCBBFB5D3D4F46689E4910BCEB5
-:108F300087517EB1769224F0A1F502F25FD1070A43
-:108F4000C05884CF844404605D7583369CFC015D09
-:108F5000F9539FCD775543F9EEE36C18842B14CE6B
-:108F60008DA7EF0FCAD1CBACD7583F5A90BD3F1D4C
-:108F7000FB2D8D55CC069C1DFDF8C577907CF271BC
-:108F80005CB7C758BDD942CECAD43FC911A8009218
-:108F9000F7B2A84FE3B0FA01362D733A7BE2FB1A21
-:108FA000318E34B45F6FBB0128E1F811F0D8725DE7
-:108FB0008627A89F41789404E1CBFBDECFDEEBE16E
-:108FC000937F7FB265BF9167BC1E89F869A4F6AF35
-:108FD000087E19C29F79E8BA5FAC33057A4D383DF7
-:108FE000CB47367F9D281F9D349FB0E1495FE4E168
-:108FF000130B52B46E5835AB7BDAE8F925079F6442
-:109000009CF5174B63F83C9438F10B834721BED590
-:10901000393C65D34BA93F09D7F819D88328231EBB
-:10902000D87C97D9ED214EEB3584768EA33D9B1CE1
-:10903000C12BC99290FBBCDE0D629DCF6BA8E0F006
-:1090400083E8DF032FEB4F73F627438587CF39DCA7
-:109050001B242EDF58FD0CE1D33BBE2211BC322471
-:109060002C1F6BB7598CEF955FF673BBE86FBD048F
-:109070004DBD61BE9E9638F4618324E484C6D799C1
-:10908000573EF991AF669C385F152AD7174BB9F553
-:109090000EB38A621746F2EB9D629FAD0F323141EB
-:1090A000B751D1FD74A9C445F742E15D7682F04E17
-:1090B0001C0A6F417C76A6E41B959EBCE104E10B83
-:1090C0007AE03B557C3D43F059A1F0DBEB60B4F016
-:1090D000CB43F15BD03A9A3B4AF8369F207ECB7C5B
-:1090E000B69D24E0CBB36EE7097A5BC0F9436176A5
-:1090F00038EE730A85EFD191E103F804FB6BBD6A8A
-:10910000990AD96B0013009E6E79D5B2942C7C26F7
-:1091100070B93EDAF1F78C4C3F31FE5B96599D1DDC
-:10912000FFF996B75CE32B8C7F90D90A1DF7854237
-:10913000E70DEFB9E6FDBAF49E6BDC13C5FBC18207
-:10914000C7FFA36BDEEF4B7F74CF3BCCE67D7AE1AC
-:10915000E3FEFE04F9B152AC97064977E9817CF64B
-:10916000FB0C41D7BBEDFA36BC79EA9F29E06A2FA8
-:10917000B0FE44D1FFE70AACDF2BFAEFC5FA652356
-:10918000D73F5DD44F15585FF2F175984F7FCE975A
-:109190006CFC816BFFD1A6713F88D9A640F09CA1E1
-:1091A0007E13AB21F5ED3E467BAB35A0B79592DF44
-:1091B00084FC226B0012E837F92624EB7CAC1F6399
-:1091C000C74DF761BD238AA677EBC01724FB1E3C71
-:1091D00010D9DC5D991D6FB59C6C929097DAA2FA5C
-:1091E00083E45F493549EC59668575F4DB0C5425F9
-:1091F0005A9696E23C0CDD62FDFCFA8A8B76627927
-:109200009326E9322BFFCB39736FFB0C6B35F0E102
-:10921000CE974EC37AD3C655B592BC3425C44F6998
-:109220005C35E5287B5E7C71561FE03F8B1D6566D3
-:10923000077CB6E9122EFFC5F7CF27DDE54B1A2FC5
-:1092400071B5BF34E1FE9E9D0FF07DC7B9DCFF30E4
-:109250005095FA2F0ED7C72A2DEE5FA0F9EA565483
-:10926000EF66F35CFFE1B5545EDF52ABB7B2F2E7F5
-:10927000AEF4B72C65CFB004BACC9652715CA5F9A8
-:10928000029BAF5AC7768FE73CDB35DBC8BFFF2AAE
-:10929000363DF38C5F9C8593CDB3E9EADC70ABFA85
-:1092A000FB13DE60F6D2C0CEA089F084F7CAE9A035
-:1092B0004474DD3909E9621527397D40AA66CF2358
-:1092C0008D3AA07FA4A13169C8ACBC31A6C5030604
-:1092D000DAC9190DF11E411ACC65EFE3BE20DA633D
-:1092E000AAFE07EA5F17DF7BE255E3D13FF2E3E630
-:1092F000351315B6DE77345BF47CB4B98B9EDB9BFB
-:109300007B262ACC88DFD27C173DEDF9A12431ECF5
-:10931000F9C9B8AF365B91DF06FCCC34423CCEF7DE
-:10932000D1FE7603CA113FCAE1745B14DFD7C1B422
-:109330006E40B9C4E5CBC6F8B6DDF87E633D4C435C
-:10934000926D3437B745D93CAE2B87E9D8F7CE9725
-:109350001FE3DF2B607A8095773536905CED89FBD3
-:10936000D2814A82FF7CE4E79E461F3093078AEB56
-:10937000185C0EBC0662EEF2AE4626B066123ED215
-:1093800001293B7F852D33C4C746B32AE8DC57CF7C
-:10939000DAE76E7F66DA5DDE88ED87F14BCDED733F
-:1093A000D79FF392BBCC24DB2B837CC0F1F8AF3E7C
-:1093B000260F76BF3CDE67E1BC4D3E4FF6E4FEC2B1
-:1093C000982F8DC6E716813F1BBF03112E5F3636DF
-:1093D000733F603E78367EEAAAD8707E03B5B1232B
-:1093E00081FE54B5B1270167E1332D9EBD09A79FCA
-:1093F000D57EBE88C68FC35FD211DB58B2B4360BA0
-:109400008FB7FE785925793750C6BF77C45ED3979A
-:10941000D63AFB93BCDFB5CBC3CEEFDCAF32506E98
-:109420007F3FA22D0DE7683F897DCF4197A532FF91
-:10943000FEF4CB81863B901F057E77BFFC13AD1AEF
-:10944000F1FDBC0CC8671BF73590BC453E4379B1B4
-:109450008BF1455F2DD27FFD2BCE755B5CE72E3304
-:10946000BEE2FCC5FAC5A17E86F4601DFEBBF0CB52
-:10947000EE157ED93DCD317A3EDD6CD07357730D3C
-:109480007DCF34C7A9FC54731D959F6836A9FCE3B2
-:10949000E6462AEF684E50F9D1E6267A6E6F4ED234
-:1094A000734BF315F464FC4BFCBCA13925FCC06B79
-:1094B0005CFCF0F7F1808BFF3E5DE32E9F6F9C918B
-:1094C0005DD7ECEF2763EEF279FA275DE5059ABBED
-:1094D0003C1FBEE2EAEFDC0FBEEC2ACFEBEF70D50B
-:1094E0003FFB4D77796EDF439EF5E22ECFDAB7C7AB
-:1094F000B31EDDE5E2BA43AEFE023177F97E1432E7
-:109500005C4E117F74C45A4B72F2CFE0F78DA12FDD
-:10951000B9BECBD47E64FE59D65589FC93F6C52DD1
-:10952000943B26E7275BEE78F9C4A6DB48FC65C3CD
-:10953000F197E6ABFFE5A7E1F9A9607EA85772F2C3
-:109540008397EE5EFE18226704BFFC2F1FFC6DF0B0
-:1095500001CC64C42ECFAF5773D877649F061240F6
-:10956000F69D1FED34477B75722A69E6D09F57F947
-:10957000E66F95593F8152E8C0786840C9E3E795A6
-:10958000F93E25A0F1EFC16A93ECB26230A6CB633D
-:1095900000AE796C5EF932F6FEE7421F765C089603
-:1095A000C4FA1B37414DE23EA6B8DABDDF7B46E682
-:1095B000FB18FBB9E9879126FC0EA5334798378F36
-:1095C000D7C8136737FDC660CF0B666F59CBDE86F1
-:1095D000AA9319F2019596927D9A0C19D4AF5997D6
-:1095E000B67CA518478338DA8972D884241B67AE05
-:1095F000CFFC05CE9BD947FF21CFCADA3D9BC4F3F0
-:1096000047621D5EE4337F29EA3D3F5C3D7BDC1110
-:10961000E905494BE2FEA9F8830C447F69DC653F0C
-:10962000D9F353948499C8616FFC4EE04BD2E34D5B
-:10963000DC0FA202CA877CF50FCAB6FFC972ED071C
-:109640008BA13F23231C311E6F82631719174E1DF8
-:109650000A87AA2492380EC6AB37B371DAC77CC624
-:10966000483AC6F948E67E2A2966123CAACEE1515C
-:1096700095B899C8C14703021EBB1F3B6E26C5FAA9
-:10968000A12F9C856F6D30D184FB256B8C4A786A45
-:109690008FB8EDAF190AEFA75A3CDBFDB9ED438057
-:1096A00056BE1F1E57A761FF6D750D1ADAD78C1DA8
-:1096B00068BFD21E5E523C9CBDBD5ED8BFDD280F88
-:1096C00003180FD785BC8AD1B33DBCAD11D7C1D12A
-:1096D0005A8687CAFCFD44E2EEB86E514DC813C7E6
-:1096E0004D139C41A3C413EF9DE06AE71FA7F8EC5C
-:1096F000B8364823C3DF21E0B7EB752A294DCF895F
-:10970000273EBE5D0EC4DCF0FEF9F0C7DB17F97B27
-:10971000F55C709D2ABCE58BC3DA4F75AC9A4A7331
-:109720007F4ACCB90E3E2BF84B1DABA5483E69F9DC
-:10973000BE8778FB7082FC5B5A38614055361EABA1
-:10974000E17A70E0E95AD1EED78A4FACCB540CFDE8
-:109750005C92916A427ED22AD83A9286B6B39F49E9
-:10976000D1BEF3C3FFF712AD93328DD68964B075C5
-:1097700094631C4931AF56D8F31DD9BC46C1F8CC0F
-:10978000477232D77A5921E0D116270CAD8A427838
-:109790003CDFC303C73A85EB834336FC568AFC564D
-:1097A00085C2BFA640F8ED7118FCED02FEB5C3C13D
-:1097B000DF26E02901A3857C990697B300171ACE0E
-:1097C000BC8B37C4F825424E314C11DDECEFFF2540
-:1097D000FA29743E1B059C23CDE78D2C3DEEC579FF
-:1097E000B0F9DC87F3CA379F7B041C6F285CCF6815
-:1097F000898411AB22559F93AF9E1070F42B228E5B
-:10980000665D3B2ABEFAD702E7F144962E8F09BA6D
-:10981000EC186E1E8F8A79F4C830F70DF4339E2E43
-:10982000F40E2C71D1E5A8C04F4FC0A6CB752EBA4F
-:10983000FC4ECCABD0F93C53209F1DCDD2E5393145
-:109840009FFDC3CDC751FF4551FF25519FFCE74701
-:10985000952B5AAD5AFC9E38A0CCCA8EC7EABDECF7
-:10986000AC776DFB2CBBDEABC80F5223D783ACDECD
-:109870006BCE7A605DD08AF6DB5A8C897E02E081FD
-:10988000F6AF3688766F52BBC583FDBF25D607B5C8
-:109890005BD73EBFD50A53BD77F07DCB828FEC7A84
-:1098A000EFBAE15D61C37184E04D0CC2F1BEB3DE7D
-:1098B00013CAE7A9BF217947B19282EC1F7F699251
-:1098C000F2F74A20D283FEC50E2545FE640C36A071
-:1098D0001F7275204EA92A23F9A3CB2EE6ED7445FD
-:1098E000237F6A005270177BBFA154A1F8C862257C
-:1098F00019F1A31D21252D0AAE827E590BF63FD604
-:10990000A0FC2F1B9EDB8ABED845FD3078B0DF3B24
-:109910008BA23B91AF364E520DE4AB9D936E20BFB0
-:10992000F96D2D3C7FF0B6F355DA676D7A3942FA5E
-:1099300077AD12FF2CD6B74CD5403FFAEAD0472F6F
-:109940002D67E5BE96625D3A87E641705B3E48B49E
-:10995000CD74E42332B80371CAA7233FDC6D8D3C7C
-:10996000AEC37ECAB1FDEA0546BCDB40F1C5E418D2
-:10997000FBDE59A792FD7A5B45D57C1C6F539D4653
-:10998000F6C6A6C5552DE4C7AB0B91BFB2246C48F3
-:10999000E8678FCE519901CECAA5460BDA9B91D9C3
-:1099A0002140BF5349051F2F7206901FCA0F3D89E2
-:1099B0006AF68C76A990198BFD2DC97C09ED99BAB0
-:1099C00000F9E1D9C4F6D78EA39437FE23FF0C101B
-:1099D0001EFF441910EF367DA33D83ED87CD638CC8
-:1099E000A60BAC9729AC5EA44B81CC8C02EAF51493
-:1099F000582F5D60BD0CAF17800B87CDE78338CF44
-:109A000023D4D81F9EC7E8C82BACE4F6BBD36EF1B5
-:109A10007BBE8F362FF42ABFC80B9D0373785EE898
-:109A2000F0EDED7CD091E60BE0CBC2298F5C7F6D31
-:109A3000F3F07E63FFB81B62987FD959F655F1BCED
-:109A4000913FCBC5FBF2353194779DE5E27BF98DF3
-:109A50004DB9F6AF77FAB91CAE81C4B0742811F0D5
-:109A60001F62B0637E4F8DC2EA47F2D7574B7DC36A
-:109A7000E6596A8AD540EB76B18FD66D008501AE86
-:109A80009B0ABE8EFD904A54F37855B4DCB17EFC3F
-:109A9000F57B68FDFCA25C06A98EE813473C7AF9C9
-:109AA000C4CB170170942B4F9E4FB6FE99F8C4DFBC
-:109AB0002517B47EFC3D05D64B17582F53583DB59E
-:109AC0004B2A48AEA83D05D64B17582FC3EBAD9D8A
-:109AD000AB727D0E7F68C578BFFF139AABBCF613DF
-:109AE00021F7F7B3C3AE72C72C777B75B6BB7DC7C2
-:109AF0006C777B750E6F1FEC800518CF2F749D1C43
-:109B00003CC17552A30D5F3F5237C2BAD2F420B6A2
-:109B10002F510CC89492BE4A0BBD95331E7E9ACA33
-:109B2000D77F959FC7CF6F53F420EE23FFD6E72949
-:109B3000A93C9FC09EEF48F0DAF2F7B7B2B0B7F297
-:109B4000E47D438C9F7FF043288E768EB1506B78F6
-:109B500085E1D1FF2CCF7BF7F6FB8A9A9CA63AF6DB
-:109B6000C5CC3E83A4C30F737E99C2F36D181DD07C
-:109B70001E5221D158C9FA6BABF0913DA28447D057
-:109B80001B150EB995232F2FEB970213CF53D02718
-:109B90000360FE9B7CDC501C08EE08F4D166BA180A
-:109BA00053E54E07180386C493BEE212CF13ACD719
-:109BB000519E95064F75BF9751BF92791B1C2F1A66
-:109BC00045BF4A1FE5CB9CF27E478037087753BFDD
-:109BD0006C97547A7C6CB65F7F2C452F314F56764C
-:109BE000E4CBE1B908CA37F1C53394DF30214AFB31
-:109BF000B2B5A5D7B9F2C1FF59AD72F98754BDE32B
-:109C00005A09E3BA15579B7DC3F079331357E4F72C
-:109C1000AC586EF6D5E4AF3798A78FF99E39D64188
-:109C2000879A4CA3FD6E4D0EF3FDBC92227F63A775
-:109C300054321DF32DEC7A4A0593B40CAEC84CD3C4
-:109C4000C2FD5EE7585F1CED5405D6EF93CE62ED82
-:109C5000E4C571A7FFD2FB542A94B79DF3B95D65A3
-:109C60007A12E1147AB26D047E1FD1EE51E3C95C21
-:109C70007ED16FAB7C5FEB0FE5FEDE176A78409D0F
-:109C800035146F8F217E717F3B06BAA4FFC3D9873D
-:109C9000F2A52AF6BC8478585BB62836DC7CD90657
-:109CA000EAF0205D18897F16321F4179300C1C3F85
-:109CB000CC0507840BF37FEB0BE3C48783F65229B3
-:109CC00088FD98199518DF870457DE32737306CF25
-:109CD00043F897864DA49F6C6E01F457DB76936C26
-:109CE000865EF5113DEBB9FD54C3ED2193FDC179BD
-:109CF00044EB87B7AB654FF939D56D0FB535EF003C
-:109D0000679E9BF75C85FD4C871A5ECC8D8FC2F6F3
-:109D1000C3B7337EC13CFB8DCD1A22057A9A752AD2
-:109D20006F688E51797DB341CFF6E61A7ADE8C4D9D
-:109D3000E7E2F9A7545725C35B57EC81D8E5ACCAD5
-:109D4000ED283B288FEFDE05682F770F96D93690E8
-:109D5000C1DD3D09785E9F7AEB02DCE7770741F8C9
-:109D600015DA16A05D9D2DDFD1361FCBC2CF10EACC
-:109D7000BC6F01EEF76F17F90FA098DA250EBD77CB
-:109D80005AC04FFC477B576A6FB5617F414594E1EC
-:109D90009105EE3298084F50E3E505816DD43F8977
-:109DA0000036DEA7033FE0E34D11F96DB54B46C029
-:109DB00023F7EF5BAAC1FD5DB525143F52E3717433
-:109DC000BFC2ED6304DC05F6034A92EB3B718E2FB4
-:109DD000FFBA1941AF093846A23F4307F9D1EDF365
-:109DE00069CA0BB9F5F4A91EF776FFE8F0A2D6F51B
-:109DF0005B7886ED09353927C0DA47CCDE4C252B58
-:109E00004717672C5ABE058E3B3660E7392669FD39
-:109E1000DB7856746E77ACF0D0D15FCAE3754171D0
-:109E2000FEA4507893AA1847F4030F37940F67AF36
-:109E300095257C68840DCA8BB18D21E19CE1E531CB
-:109E40006689AB5C5C37C1553F12AF727DF7EB1F83
-:109E5000777D3F513A5DE299C7A784DD6897CFF5DA
-:109E6000CEB3C07E0F1627560570DD34404D8AE113
-:109E7000F5CE2F3C44F80F0DAED385ED6605E58396
-:109E80008B753D8F9775FB7B5DBB59CFCA86FD7D7A
-:109E9000062F9BF6F738AF6FD9DFA7F2EF28F759F7
-:109EA000F96B9D67B45BF81D5AC96F0B152958E211
-:109EB000A0CFD8F10DAD08DFF8CBD2318BBDEFFECE
-:109EC00050E6F2007A62CE7A776ADC0FFDCC943BE2
-:109ED00062E8AF5C77E64331207927E58C07FE3CEA
-:109EE000C0F3C5CA42899E00AD77B3BF98F1E1A126
-:109EF000876483EB21E535D4873E8BE7E3AB10DF46
-:109F000067A25D54C3FDD521F19DE85899AD3F4846
-:109F1000574FF9EF34AED77F87491B0CCEEF159B17
-:109F2000F7D0B890961AD97AAFB0A01FCF1F81B0E2
-:109F3000FB26F2A6509A48939F6F12C3A7CCBE4F40
-:109F4000BEB8BFC5CF706D5CA6FB7089542D8FFB6A
-:109F500048C00DDA9163A5E3ECF93DA417CAE39B71
-:109F60005280FA7BED990F35215E02997F0283E1E1
-:109F7000ED1F27A5C040FF6F80C315B8AC07483E52
-:109F800057F7109EBDF85A3788F7B40BEF3F0970AA
-:109F90007F7E2CC9DB0DD65358BDA943EB75077BDB
-:109FA000E6AB68BF4DE178F48EF35E4012E776DDF4
-:109FB00070D8FD7AEBDF1210716D2D4DF18D67CEEB
-:109FC000BC21867EEDCE298CFEB5F9E97F4B80E77A
-:109FD0005B19C76E22B9DB3D6923C533D7556F26A0
-:109FE0007BF228B323F0FC747765EEF69DCD3C3F01
-:109FF000E65CB8BBB18AD1A7F37999FCB4DE7ADF0D
-:10A000000954B9E28D5A857B3FC8F8AF0FE5E8489F
-:10A01000FC27471EE0EB72947C8766213FCF50D629
-:10A020008EF6805F94EF0E1C6F13FA9FE47FF9F2B7
-:10A030001E70E64BBE2FF82213E0722658C1F9A31A
-:10A04000DB6F494EFAC5D8FBF98E76F9E8968F1F7B
-:10A050001E17EBE17D25DE44CA5F49E9B9E4B3127E
-:10A06000FBF42F173ACE7BB52B694D47F86B364A78
-:10A070004EBBF61B6632A439F627A1D805BF5C8813
-:10A08000FB1F259E739FFE29D38C6A6CFC9B9B61F2
-:10A0900046359E4B50AC00D6BB59C934D2BEA2DA6D
-:10A0A00047FEF27515D7EDC53C2BABD617C76A6DC9
-:10A0B00015BB1AAB0CE4976D9467FAA6BE2486FD17
-:10A0C0000462EA8CEAB194DF9DC079876B59BF0EB8
-:10A0D0007ADBE3DE2DF8F65BBA3959E3F2E034EDD2
-:10A0E0002F200FDE87788C1B590CCF39F65743F1A0
-:10A0F000CCF3043A2B86E0798EE6E0EB00E27906B9
-:10A10000C9FB9CFE0B86E7B35D780686E7A9593C40
-:10A110007757703C77D66CEEAA72E2B966D7DE4A02
-:10A1200003C7E7787E48E3E773438867079C5E3C94
-:10A1300087255BFF7CAC1DF9D6CBF70CEF7F8FF04A
-:10A14000D8EF3F0AFC82ECE1B1E313176AE43F4920
-:10A15000D1FEE94E29AF5EBA442B402F758A757443
-:10A16000A7C03FEBFF0BD47FA9E8DFD6B7421FFEA5
-:10A1700083F66F0B501FB27ACBA89E9EA27DF06033
-:10A180003D0B86D5A3ACDD95C447614FFF268C4AB5
-:10A190001FB37EAEA37E34CFF8069C949E67FDDE8F
-:10A1A00044FD2A9E7E4FB13DC1C6E926FC81070FC2
-:10A1B0007F663B2696F4F083D2E3927B363F942F62
-:10A1C00077D7CBAFD77AB85E1B6AD710DFFEBC73E8
-:10A1D000CF6EDC27BDA99BDF46BC8E761DD876608E
-:10A1E0005928B94DE376209D83B0BE51946E636DBE
-:10A1F00095E33D511E7F77EBA3F1B63D54CDF5407D
-:10A2000070947A699FB0D73AC6301955CC9EFE44F7
-:10A21000532E3FC3339A9DB7E6B69B7F8373243F8B
-:10A220005182FC6BEDB1CFECE863B4331B7B20971C
-:10A230009C4F86923FC7F9A9BA65927A15FE917C28
-:10A24000FD9626AC9D7B6792DCEDC7BC461072186C
-:10A250004D6BF4C74519DE0E69E4C288A37FADECEF
-:10A26000626B3ECAB10AC62F587F5CD33E29992B38
-:10A270003E6EEF7F10881CFB97719F9B9DA47CB85E
-:10A28000C53347D8DFB4D8F6EB6F715E87D49E0B29
-:10A29000A638F06ED3E90E2971E179284FE7713ABB
-:10A2A000158F924E03824EB098E7A19E7BEC5C8D99
-:10A2B000FC8B115F02FDF0417F8F5EE2E0A3713EF7
-:10A2C00048F68E02FE7AE8DF7D1CF77F611FED778E
-:10A2D000BBC3CBBE83F7EF58BA1A9F6264C7ED6663
-:10A2E000FABEC4A17FBCFEAAC17DF4E2C2F265A79A
-:10A2F000587328DE9FBD3FC89D7FC018AB06F3860C
-:10A3000056CBDC7F7E67D1D7280F618D15D003A592
-:10A31000A4C7C8FE5B27F2D93A453EDB5A91CFE687
-:10A32000B7566FC5FA9B0012E8976C9997A2787F91
-:10A3300054D1F4D638C2919A837A225A6AAFCF1F89
-:10A340002FC4F53958B6BED1DEC0E61B8DD9E58DD8
-:10A3500064BFB5B77079F3D9E00B0BAD7A64C53E35
-:10A36000A2C7A6BA25C5308C3F325CEBCE9F0B55F9
-:10A37000875C65ADA2C455564B270C1BB7F819FA7C
-:10A380008966E17CFA208E70E6C9179E12E476B6E3
-:10A390002C4FEBCF60BEC1D96A7CB381E7A8DD79D1
-:10A3A0009CED416E0F3E8A0E218AE30ABEA8E3713E
-:10A3B000D5A2B955BD180782319C2F304FD0C90F97
-:10A3C000F9F8E2AF8D1F5FD1E118E65DDCD21A0526
-:10A3D000CC73B965EEAFE21903E56A5F0CF333DACB
-:10A3E00098246965DF37CCFD9591CB9F7C404B2E3F
-:10A3F0000F22FEC209B2BF223393F4FC6BCF6B2451
-:10A400007ADE19E47A6E8AA0A782F49C99A5E7BA4D
-:10A410003A46CF99D975BE4EE9D10AA1E7F9387EFF
-:10A4200019CAA1FFA67DDBCD75BE46944306F45242
-:10A43000FEED865A9F0FFBFF6BE1C5862B3C97C94B
-:10A4400047A25326817A61435CF1A11CF99BE3C3C7
-:10A450008FFAE87D017CF8C35C7CB85CD0432EDACF
-:10A46000D7942BEF6E4A5072E1653DD28BE3A591F4
-:10A47000E3C5F757C1CBA0BED0922B916FAE88A990
-:10A48000B4EF564ABA3A285EC4F41EC61B56C8A694
-:10A4900081F126F8969FDFC7847ADBA15FFE180C56
-:10A4A00072FB445EBF88E2186C6AB82F63E58F0DBB
-:10A4B0001B0F4DFBFB9DF79478F3325E0BBAE31054
-:10A4C000472A961423BDF2F5F776F35E1DCFD5DA51
-:10A4D000F919DEEF2B6448E53AB72885346167F651
-:10A4E000AA84871B99AE9D86F8F8D8423C9FD9591B
-:10A4F000D13A8EEC1871AE61C5966775C501E70A51
-:10A5000085A9BFE943E763E37705AAC91247FBF4CE
-:10A510005E577B6FBBC1FE447B66B7F9430C3E536D
-:10A5200049EDC578B37D7E43DD323F436A330FDCAE
-:10A530008C8E270577A1E7388E3CD0D681FB6DB491
-:10A54000BF3EC1F8E4B78FC8F156F6F58ABBCF58C5
-:10A5500088E75A0F01E7179B3E6F3DD0362E175FF5
-:10A56000E4A3CF79A12087E714F3D759210F7FF512
-:10A570005E549C8153CF5F8BF3F197C0CFE15E8E29
-:10A580000FB86B6C4E3AE59BCF209DEC7682CFBC2A
-:10A59000EDF3B5637C95E07C95899E5D085F097855
-:10A5A0006DFA9D2CBC23F155608D6CE079AE4A2587
-:10A5B0004172B3B3F43A4BDCEB48F99E72CFB48CE2
-:10A5C000B8D74AE4B54306ED8940A949767448DC1A
-:10A5D000CFA355BBE5A612739F9B8835253276BF66
-:10A5E000E8BF0CAC5169DCC1F8711832C12896790A
-:10A5F0009C14C51FEE2B02F04DF27BB27639FD9E06
-:10A60000F65311F96A98CB4BF7B2C1E747C86F719F
-:10A610008F13BB78F8FC1A6F7D082BC62107DEF379
-:10A62000B753E090639FB341DC2B6AE3DFDCB29465
-:10A63000F2CA83E08BD3FE20D661E1BEAF43ACE724
-:10A640004E7CCEC573BCD375DAAF55F0788B257DC3
-:10A6500099FC0CF6B9337B3CFBBC995D6F24FAAFD7
-:10A66000C6F594637DEF0A717D3AF0B5D47FE33E81
-:10A67000C4FA1318780FC5E3CD1F509CFA9CCC5B2D
-:10A6800032FAF79F098DA37ECEE9EF931738D6E50E
-:10A6900039E21C0740AF9CEB9C97DF0AEC427E78C6
-:10A6A000EA30DF8F3D75F808D9E14FFDDE9746BEF1
-:10A6B0007BEA83E1F31E1E17FB22BBDEE3BFE7F656
-:10A6C000D9E34A6F512EFB2E3B7E9AEF070FBBF961
-:10A6D00015945E19F965E0A67D32FA071E6FD6A4BF
-:10A6E000D799FC9927E679CEE13E19F74D23CD6B3A
-:10A6F000AB87BEF63CB7D6737B746BFD9110FAFF47
-:10A70000B73EC1E77BB49E9F8FCD07EFAE669EDF5D
-:10A71000B1F589DCF86898C7F7C70D7EA334A75D4B
-:10A72000EB3967B54093DDE7BB4E317CBBEBB9DD60
-:10A73000B55B89874F049EBCEBBBAEA711DD08510A
-:10A740004836CE9708BDFB5D7E92035F6FF932E617
-:10A750006B2C0D9B12EE65A12FF3249B5789A92525
-:10A76000F0DE98E2FA1E6932E677C4781EF937AF58
-:10A770007E2DF3322BDFDC5444655D379E5B84F81D
-:10A7800028D5C99F72337A5C48407F732DE627D065
-:10A790007A64E5C0CD3DE7A13F4B012E2F98C56BF4
-:10A7A00028E3E85E3F72D2E4931BEC473A1EC8B63A
-:10A7B000CB3B4F4FDE6D00960C2FC796F3FA16FB7E
-:10A7C0008372A8C49367A22F74E7A5443DFD4F454B
-:10A7D0005BB5AC80BCF2931C670C6CD30CDC67D708
-:10A7E000FAF434D607630CE60D861B9981C4E83968
-:10A7F000460709CDE591F0BE0EA091FBBF33E03CCA
-:10A80000A7D350C4E5D584AB6E97709F7134CEB892
-:10A81000621A96DFCC997FD52EE4C76059DF45F2E6
-:10A82000B4037AF7525C20E9233BFCE6DAD631CE5A
-:10A83000F64B8B24DB1F28E80F86323B4B7F363FDD
-:10A840003378D65F8EFEB1E56EBC8F962ED714712D
-:10A85000793512FD4F761C9B6E43D7478BA0DB03E7
-:10A860001417EDAE195EEE0FA5DB36D277E1DADC18
-:10A87000F9BAD715492E796C3F3548419CF1892C9E
-:10A88000EE6796C7CF6EBA7F18F9233BEF67866CE9
-:10A890003FE38C1E13E356E3A1C7C473DF8CA7E329
-:10A8A0001940FE3601ED24661E111FC99EFDDC46CF
-:10A8B000C14741789EDAB35560E9A45752A03BF2F4
-:10A8C00054CE93C371F45FACD3C3742F12CA4F9E9E
-:10A8D000BFC3F3FC8B39480CBFFD80F22D542E838F
-:10A8E000857EBF7A01AFC4F80EF3FB0FBC7500F78D
-:10A8F0002BE1996E3A29078A28AF2DE43D2772E0B3
-:10A900009A6B687FE3A1E368F3FEBF5F24ECFF224C
-:10A910000893DD24DAE7CBDFB3ED7E1BBFC6B108B9
-:10A92000E5ED741C90081F659313F7E3FE0C7E257C
-:10A9300003CFCB0413F3F656FF74167D1F1A574846
-:10A9400054225DDE3A50A4B75616922F9948B6B0FD
-:10A95000FAC68140BCD520D5E2D3908E7D12D1516C
-:10A960001AA751BED6EA7FF7DF1F18265FCB8E3FAE
-:10A970000E96158BE29B5DC674CD294FCA42C95F06
-:10A980001639E3F622AEEBF5AF07C3EDB16760F41D
-:10A99000F18FD2F120E2F29F5F84F64B17AE019E59
-:10A9A0001747797A5DE5BCFC46D1944518DFE98A02
-:10A9B000F07271F8C8792D246713E4FF5BC3180E99
-:10A9C000F1087BFDE21E4963FC85C3C80BEFFCD791
-:10A9D0002BFB284FFE9EF0FEF3CF40FAC47DE48FA0
-:10A9E000BBE7FA6DAEFB93DED41BDE2FA2F5AAB750
-:10A9F000637C7A62D2CED774C74526A0D660F39B1B
-:10AA0000C408E3677838ED626845B6A9BCACB71CEA
-:10AA1000F7C96B4BB78DE1E7FD17EA87C86E972939
-:10AA20003E9D0F5EAF9D9E6FBE76BCDDDBFEAE0829
-:10AA3000BF47D51B17F3FA831E44FC9651FE2C60CA
-:10AA4000FE6CA7BF2F673CEA8D22EED76CAF5894FF
-:10AA5000B81CE7A598730F327CDC5B1AA57D90FFCC
-:10AA6000A2DA4B7D0E7BC3CE6753C47ECE5F9A22A3
-:10AA7000B9A86866D719182F7A5EC61505153D3B2B
-:10AA800025B4E7EDFB2010AD174FE5F3C579058040
-:10AA9000DBC5785EE1B863DE1073F8C1509E88FDB7
-:10AAA000DB29A0F7B4F0ACA1F49DDFC5F3D0635768
-:10AAB000F0F34D1395DCF41E7F99EEE3F1AF534BA9
-:10AAC000E77CEDF3C53DEF8AA8B47EA6E8ABF7E2DC
-:10AAD0003D771D567112E33103FE5417CAAB0DFFCB
-:10AAE000E883CD34FFD1E937454FD03D7A15297D34
-:10AAF0003A2EEF7CEDEE48ED0A129E2D9ECFE0FD42
-:10AB00007E7998EB9B9E94EF36FC6E3E9DDAE9C70A
-:10AB10007D678CEFABED7D783294BC3CECB0CF75AB
-:10AB2000D3223E9A92BC94E4C0405961F72F0CE2C4
-:10AB30002B4F1EF31D11AE97A718AB79BF9386F765
-:10AB4000CBDA78F9A04B16BF1721134438FC8C914F
-:10AB500013B82E6EE472E2EE35BBE8BD7263DF7CA3
-:10AB6000FEBDBF05F5EA1D3EB82297DFA82DC2E362
-:10AB70004193CDCC3AD41B93533E40FBF4F688412D
-:10AB8000EFC75FC6F1D43509E238EC69D81FFBCFB7
-:10AB90009E4A95F4D2D852A0FB92C6AE01D2DB6396
-:10ABA0006B206DB072D7CEB93BD1BE55AB218EAE06
-:10ABB000EBDD953758680F6CAA0013F5B8FF46B661
-:10ABC000C0587DD5F0A53150BC29B58CEE6959CB64
-:10ABD000D6255263ADD140F6C3D1182F072AF839D4
-:10ABE00098AE331582C3BE7F9CEC4EA61FFCB5FD0C
-:10ABF000265EFD65C015D48F7F2EA7AB71573D9D96
-:10AC000053EB1AF310DD4B635D033CDE69C7A515FA
-:10AC1000C65F6C9CF62BF49CFE9523A1E4B79DFCCB
-:10AC2000C0F891E44C17E613E4C0676798E3F30EAD
-:10AC300021E706FCF0298A97B4F8E83E176FFD6516
-:10AC400002FF775B4BFEE10C23AB6FECEF078B0C45
-:10AC5000977FA3E20395E6B348BE1174A43BB39378
-:10AC6000E8FE17BC18F4745A9617943BCEB3DC1B5D
-:10AC7000EF85C98867DB2EAAE5F68C7DEE91E12190
-:10AC8000730FFBAED705E87ED1F14DB9ED23B5408A
-:10AC9000FBA8ABC8FC6918F30D443EFFD7972F21E2
-:10ACA0007D9FEFDEDABB235CCEDF2559951D489FE3
-:10ACB00049FCFE196FBD83C25E64F620F1CD268B80
-:10ACC000DFBBB5896D7D1E45BEBA9EDFF3C7DEF3DF
-:10ACD000730E06D079F1D80DCBB45CEBD51B57CEF3
-:10ACE000B7EE826A5F3257BCA556D0AD24AECFF71F
-:10ACF000F1E983E9B0478B6A81EEFFD2197DD0F686
-:10AD0000AD805E4ABADFD858528971A15B6F540D8D
-:10AD10007C7F5F65AFB510E72D41EF839823A3F4E7
-:10AD20009A781EBD223ECEE8769CF72EAE7894CE61
-:10AD3000C3DFFE54000275783FA9E7F7D938E9234D
-:10AD400067E96CEBAB7CF32BF4790BC397F3F780DB
-:10AD5000308833388F220B0CBA1FD9E8253BF4A872
-:10AD60001544DD0A467D2FD72BED2178308EF7CCA8
-:10AD7000F2F2A6F054C0FB6735A597EC754DAFA273
-:10AD8000725175A29BECF369DBF55CFAE153914AD1
-:10AD900097DF24E4895369C91B9AB89F56852939DE
-:10ADA000D6D9C12285DBD3AC29C573ADE1E5EDC9A8
-:10ADB000F2C79B42DFE8D97D32F107C92E468F707A
-:10ADC000C5A2B764C77D9C61EFF9622F3D3DE59355
-:10ADD000A5E73AA4A723BEA0D52735A49FC1EC249C
-:10ADE000B2FBEB019CF7A66FD22C7E0F8361F82C8F
-:10ADF000077ECB85DDA77CA0D079DBBB9676D0FE25
-:10AE0000632CEB03F37AD933E7BDD3078B785E78F5
-:10AE10005751624984F27281EE195E27E4C679F2D5
-:10AE2000CF8298871504A6E7908F16FBE0C11C74AB
-:10AE30002D8F703CA743E6E722B3F2CFF77129F7D5
-:10AE40007DA276FB83C20F50B81CE6F39D620ED044
-:10AE500079D2819B0AD3DF036C6EFBD02E57E25C64
-:10AE60004FF719D03E93EE7F4AA3DEDD145B4278A4
-:10AE7000BF0FF529DA56B55C4FFA53DC4F0C864408
-:10AE8000F7CA86C4BD1BF7A58E3C8B76CFD11A05B9
-:10AE90003D3E10AC485AA85F8BABFB2C09F56C69A2
-:10AEA0009AE2C74C8F598867E3AE4504B75FE96DF6
-:10AEB000417D99562084FA7C008D4966C73D127EFB
-:10AEC000A403F35DFCB5695064DCD70338EFF737B2
-:10AED000602FD9597EA687C96E52FA5A502EB5D71F
-:10AEE000EB14D739EDC63E70EEEFD8B8B7E2B81321
-:10AEF0004AD97846567F7AED8D7C7606D3B3222FD9
-:10AF0000674107EEDF6829B1F2C3E1ED1D686F7E8E
-:10AF10004B37BF4EFC93679FC1F8E29E48D9E8F9D2
-:10AF2000E2B9B09B2F06FD27C2EFBAAC4E087A30CB
-:10AF30002EFD0D83FBCABD7EC0F99F7BECBE3DF7A5
-:10AF4000307CC8A84FC972E9D9F324FBBE1CFDB000
-:10AF5000AC7CE581A92ACABD5F4D90F1EC30F25975
-:10AF600014F9E71DF0917FE81DD81F9DE180676708
-:10AF700084AF13E8F2BFD6E7F03F5EDEC3CBB6FC8A
-:10AF8000FBCA5DEEF29761C938B4BFBE7CBB1FD26D
-:10AF900012FEDE29F7BEF99108CF37FF0AA43A1056
-:10AFA000CF6BC5F9A46B1E9BAAA2FD74E50CBD1264
-:10AFB000E39F361CCF0A3DFD36E363C3210FAF0A82
-:10AFC000A755CC977A7DFB8CCF9C0DD84FBA6302E6
-:10AFD000FA0FC7404E3DFEA52E379C23CDC30BB7BD
-:10AFE0007DDE281F1CCA1629A71FECC588DB0F763B
-:10AFF000B2F7B31F45FB7856F6F7D7D9796627DB4A
-:10B00000EF9FF2F47B8D86175103AC527A1AA5AAF2
-:10B010006CDC2BE8B7CC8968FFED989FC1DC7547E5
-:10B02000BDAE02EB35FA86A937D27C5687EE8DA2EB
-:10B03000BFA84F8244AEFB77CA42C931D15943EF12
-:10B04000E101F1FB820EBD62DF63DFBF08FD7C0121
-:10B0500060FB7B7A2AC407E4FF91D05EEDC9989526
-:10B06000183F565CFC5184F11466F7AE12F6655138
-:10B070008DFBBBD71F747A94AFEB7AE823FB3FAA12
-:10B080008533329E6BAD73E73FDD59F44592BB2BA0
-:10B09000F7F9C9CE5C09C6ADF533691D921FECFA0C
-:10B0A00075A7539CF8FA32236EA15C83B8496D3DB5
-:10B0B0007CB7EA0309D20E3FC12AA55FC5F5B68A5F
-:10B0C000E90FE7FBEB62B2F1468EDFDF643FFDA0E4
-:10B0D00019E11AC4838F9FA7D559D931CF233D5287
-:10B0E000238FCB19C5170FB37FBF2EA6D238CBD66F
-:10B0F0004D29E6FE21B7DC7C57E8A99F3CFC2D9545
-:10B10000EEA3FAEEAB17201E563C2E83C6C67DF783
-:10B11000E10864487FA555D45F576D9773EA77CCF3
-:10B1200074A2BC94ADDC7F79D5B6407A316B7FD503
-:10B13000A3AF9F050CBE775BFBF74CC475F05DEECB
-:10B140005704ABEFAC8BD8FBAB14F8BFB9ECA9CF6D
-:10B1500047B9BD7DF847454DB8BEA52D3BBF48FD5D
-:10B16000F65EEA0F38E2734BA2FC7C2CABC7FDA065
-:10B17000DF91D25372C4EF6CBFFBE1EF481CBE1DE0
-:10B18000FE7410E1DB72BF9A6470ACDAF21EC993F0
-:10B19000055BBF17453CACDAE18ED3ADD8FA610749
-:10B1A000E6A1AC90A17F31F2B37C8CCA474DAD5F74
-:10B1B00026B9CFCF57AF2492B07A3FF8EDA2DFB0D7
-:10B1C000EF6FC7640832D1FBF6BE83EAE3584E86C0
-:10B1D00053B8C35DB5C32DF7566D799DF222741F28
-:10B1E000F4579C8DF9016EBEF6D667EB4745FB69B7
-:10B1F00055EFBAF7D0AE5CB5FD9D5FA3FC58E59165
-:10B200009F6FE37FCA87FAA9DBA29EFB69B61496FB
-:10B210003FB1E27B47EFB5D8B887B7FDEE5ECCB360
-:10B22000BFFAA3F7EFFD67B4179E0AEA28FF577D20
-:10B23000F7852838F8F11EB1FEDE9D045639ABF7CC
-:10B24000EE7F06D278A0F5DD277F3B19CFC9BDFB85
-:10B25000C81FC719ACFEF54F9E47F7F25FFFC30545
-:10B26000E387B3AB905FD301275C69A2ABB143E244
-:10B27000C6CB13E2E9A1C7E1470654B477FF2041EA
-:10B280003FEAB995BD1FAAB83FD963423FE267F7CD
-:10B29000F6D7F77C9595DF61F409E4A00F9BFF4496
-:10B2A0001FE96F2626D973E5F6D71721BCABA09FFF
-:10B2B000F4E9107A3ECFE839334B4FEFF7A3704CE7
-:10B2C000C57DC1AA8719FDCE423A32FA9D35947EDA
-:10B2D000EFE07FE60EA5DFE351F7BD0947E1EAFBAA
-:10B2E000CA7163BA7D6CCE3C886C9C61F87B506CF3
-:10B2F0007930127EAF90385C5D51F3A728EF0F6F65
-:10B300002B1AA4EF62A4EFF78E4E46E3ED4D7FFFBC
-:10B3100017110FFD4F0674FCFD12573DF922ADB316
-:10B32000777FF89C6A505C07A2D26C5686C19FFD5D
-:10B33000C0CA2BB90F1CAE79E0FF2FFA356B7F0D19
-:10B34000EB02F7998C6E54DEC3D61DD1217D61A32B
-:10B35000817A335D46F35E99E6EB61657AE7C578FD
-:10B360001F8517EFFE62FB3ED02C3DF1BE8395DBBF
-:10B370005F5D847C978F9EF6FC759CFF1CF6FD013B
-:10B38000F77AF5D65FC9D627E9292F7DD33B7F8190
-:10B39000CF77EF0F28783EE35D71AFAE97EE59FCA3
-:10B3A0008B73F3A38C431DF7F0C7601C4AE0293F61
-:10B3B0007FF0753ED2FC468BBF77A2868B8F6C3CAC
-:10B3C0001E3E965BFE4F2CE6726325F434A2E9EC38
-:10B3D000B55714485A132BB3F01E46FB82C17BF8B5
-:10B3E000BB32F9853A7A77931CF7CA8B9590FBF7B5
-:10B3F0006FD516737B71E58E9D67A15C3BBCEB47F7
-:10B40000C49F2B1F7E55C57DC79E2D3F50FB6AB341
-:10B41000EB01F543DA81EFC3DFDF79169707B9FD5A
-:10B420005E73C57C563DE1EE7FD5C3EFB9FA5F612F
-:10B43000F592BD30D2386F2BE6A538DFB7F7F9E9C2
-:10B440001EC2B77BE5C65C76F0E462BFCB0EEE7839
-:10B450006ED16FF03CECCCFD21BA7F717BAB39FE35
-:10B4600016B4DFF6FB457CD1FC1DDAA5DB9F0B9102
-:10B470009F67FBFECF503E90DDDF631E7CCE79DE02
-:10B480005A1061FDCDE94BCC948DA172A3EE00DB87
-:10B49000EF39F8E0FAE71AC7A3DCC7FDB181BF5F57
-:10B4A0004E89D3392C39BA88F2CC65DDA70773EA07
-:10B4B0006FDE9F3FCCF7937EC698CEFBDCCF3DF688
-:10B4C0001FB47FEF88FB72E2E13E817FFBF73FD93B
-:10B4D000EFD74B9C6FAC67793C24DFFADAD81C8B32
-:10B4E000573354DEDA5C17C7B8CFB5C5FCBE9EB182
-:10B4F0006F18129E2D99DB674CC7F917432FE0791F
-:10B50000FFDB9BF5B8333E5476D86CC17A67BF0930
-:10B5100071AC87E3E27E6DB4E35AC5FCDCF3907155
-:10B520006B7B092F858CAB9DC0B8B79E8271C327FA
-:10B53000806780CD058DEBCDB3F28EAF4EE379639E
-:10B54000DEF192B63E10F1055A7AC3F8DBFCA29FF9
-:10B55000A5C586EBF7958192A17BABB3791769A955
-:10B560007326C6EF06CF1B2734C77963F69DCE1B23
-:10B57000B7993C0F96B5A375D025FC1318CF5CE6A0
-:10B5800080F705219F0215A918DA5F9D79E211AFB6
-:10B59000083EEF8C346838999DFAF4E2BE61F48677
-:10B5A000B2E69B339CE792153D23B9E2C8E6EB7403
-:10B5B0007F56BEF6DEF8A20D7FE7CE7F82AAA9985D
-:10B5C000379B80D61C706E17EB07EB5562BD581287
-:10B5D0005A1CF5D4189FA75DEE147EA1576E7DA569
-:10B5E00093E2F679F0B443D0F30574CC97D1F64DDD
-:10B5F000C3F86F57C44772B22B98FB1EFBFF2CF6A3
-:10B60000B9E4A48AE71FC90FBB8FF68DC6B1974D69
-:10B61000BC1FE9D65A95FC6091FAFD543E6AFAC8FF
-:10B62000FACF871FFB3E83C1721EFF53BDCEE9BB1D
-:10B63000DBDC46F9B1D74D558DE1F22D426BA6C545
-:10B64000316F425B73761CCF6B876AF8EF61D8303D
-:10B650000FE26106DF863CFCF13F58523CAB0080B4
-:10B66000000000001F8B080000000000000BED7DB3
-:10B670000B5C54D79DF0B93377EE3C813B30C0F082
-:10B68000BE8310D1623A28A2363E2E0F0D3E62468E
-:10B69000C4A809D6D13C4A2218B436A11B1B2E02DD
-:10B6A00082F8C2266BCDAE4D47A22D6DD31653DA6C
-:10B6B000358FF61B4C74ED635B626CE2F6D30613B8
-:10B6C00037AB59D365B7CDD6ED9736DFF9FFCFBD90
-:10B6D000CCBDC30C68DAF4B7FB7D4B7EC9C9B9E7B2
-:10B6E000F53FFFF37F9FC77C4AE4089949C8EE2DD8
-:10B6F000840C151342F8B08DB808D95762B2433A9A
-:10B70000284F4F1AA6E987F0B7606C6A6DFEDB1907
-:10B71000553322F9CEBC442E48FBD999F73819A6E7
-:10B72000A9F5831612A0EDAD3C91FB69EA96C960BC
-:10B730009287E6E55B7C561F4D5D24C3544ADB953A
-:10B74000DFC2EDF08DED7F30E711EF5BB45DBA4CF9
-:10B750003220ED2C17324C3A787ABED04402749CD9
-:10B760008E72612DC0690D7F9E480991F2274513A5
-:10B7700021A9F47B5D8F2CC3FC08C90824C03C4977
-:10B78000468DAE5E0F47D6F4178F1DFF10E087B6CB
-:10B79000DFAD96EF9BF3CEA17B29FCA22C95986997
-:10B7A00037FB06AF92FC69341FBE2A73302F0F9906
-:10B7B0006E2763FB817A3E5A2FD11B241B00CEECEF
-:10B7C0006112A4E327160D1398BF43229249C27E4B
-:10B7D00010FEA4D92344A1F592E60E7B9569BA7EAA
-:10B7E000FE608E09A719E649D7D1D15CEA2F48211E
-:10B7F000C4D63CDF5F40D725811F2222ED2741625E
-:10B80000F88F6EF7CF490C3F1A5E7ACA6F490AC6A5
-:10B81000E87F747D5BCEA4F1165DBEBC670DE0DFF2
-:10B82000E2092A30FFC4D90C2F5A79A2344C643A69
-:10B830006E2261F324A5443E4693845285C0387439
-:10B8400048593F9F07547A7C409D0FFCC969588F27
-:10B8500010FA29415E74D57C2BE479F256112BFF46
-:10B86000D0477041DFB2A979F3D87CBCF94C94EE93
-:10B870006A21E42DDD7C6DD974FE5ABFF4DF1E0B06
-:10B88000C900FC7E54BC09DE61A407EDFB3675FEE1
-:10B8900016CF30E2670CFE8A19FE9CC50C7FCE28BD
-:10B8A000FCED55DBEFFD2F86BF513C71A63540877F
-:10B8B000D178D4EA578CC2AD205DD276847C0AF26E
-:10B8C000816AE0DF1E3BCB1F12EFAC06FE00BE9A82
-:10B8D000805F08C9A44D7AB82E28CF1545ECDF7AD1
-:10B8E0001F9507FA7C50930F6C5C97CF5F4D283DF6
-:10B8F000139F891CA328ED9AAB7861BDBA9153229E
-:10B90000FDFFA33809EB774A8289FB244DCF2C4CED
-:10B9100007B9D966EBB1C17CBB2C3DD84F5B8E49D2
-:10B92000EC8D21DF4EABF335373B671C9D111F8F2C
-:10B9300066810463F1FDDBAA7C6B1B7CEA8C99D2E7
-:10B94000072F09929DC20B4CFFB6B6BEF9B43DE974
-:10B950001FF2F9609C441CC7A5C2E52A349156DF4A
-:10B96000C4701E57E98A6FB68F0B270F70C69033CD
-:10B970001A9CED00A7273E9CCE9C0AA453BED985F5
-:10B98000E30C8A125B0F4B936D239D9FAB35496A85
-:10B99000A5E92EBEA9AB0ED2210B5168150B91CF94
-:10B9A0005450B8F969D309A1FD745C9A659B04B43D
-:10B9B000DFDC43023A391F74042F89B43F5E0C92D6
-:10B9C00020859377293280F1AC4A07DABA91A264D4
-:10B9D00042E6D0F182FC0C90A7CEA080A9D68F467B
-:10B9E000274E8B4CC462E8C7248740DF416773222F
-:10B9F000F5E6BB19DEDAE6860354F691EE129EEC0C
-:10BA0000A09FDA8B28BD24D1BC45EEAAA3F8E87E1E
-:10BA1000D5427A757CA08D9BEB66FAC74E6A93C2BD
-:10BA2000D0B7F9B037388E3EB603DE68BBE60BBE42
-:10BA3000EFBCA2E115FE15133CEF38917633809FE1
-:10BA4000DF27C5AB4DA6F8FDFCAE45FACE2B3A7903
-:10BA5000D54C98FE20444A5F312D7EBBDD2D6446D7
-:10BA6000416124BF870F213EBB5DBD5DF9749E8A95
-:10BA7000DFE42FA4EB45B24B0D788A4E096965725D
-:10BA800070CCBAAE96C2B47D779189B702BD1690DC
-:10BA90009019F092ED41BED4D635E8607463F13070
-:10BAA000396976C998DA008F20EFCC7BBCE3C96B8B
-:10BAB0001BF0490C3C16B9291E3FF1DF0F8F1E37D2
-:10BAC000C1D499509304F8232FEF22D23400C3C875
-:10BAD0007F5A3B8DDEA3E75FFDDF7CFE1A9DC4AF7E
-:10BAE000AF68F6103F48AB660549A89BC37CC0967B
-:10BAF000864D29E854A5D8C2ADA09A72EAFA334E11
-:10BB000011D0CFEDE23B36145DFE0F53C6EB9F27FD
-:10BB1000EF68F83447C6D3E3C7047AE78C25748C02
-:10BB20008BE02941FCB47790DC089E9A6C208F3A18
-:10BB30005D5BCFF84A2378EACC7E4EDCA0A3F72BDE
-:10BB40006285E2A6F8D809766D0C7972AFBBA21DAA
-:10BB5000CA05536C797E48956B5480F30BE9380B1A
-:10BB6000468C789AA7E2697EFA3B8FC134A994E4A7
-:10BB70000915C815017F15E0AD6A4D00C882085946
-:10BB80001F7C2288F45025025E3865B2E943E78DB8
-:10BB9000E32F1EBE5C1C09C482FB19B1E6881BF4AE
-:10BBA0004931C59BCEFEA08421A27CD4D6C5E5999F
-:10BBB00080AED8BABD7C31DDA4D0AA9D5E5308FC0E
-:10BBC000190B69EA02BC93736602765A5A3803CBA2
-:10BBD000ADDEFC10E8BBB4B09DC8E82788213BADC2
-:10BBE0007F70ED5D7ED443D76F23614A3728CB4009
-:10BBF0008E65CB61B0A779512A374B30CEA336F092
-:10BC00006F3ABD354984D9DB24961ED8E20EFE007A
-:10BC1000D68DBF3E1FFB33D998DCBBD1F97C69655B
-:10BC200022013BC07E810B812E3BB0727ED77029F2
-:10BC3000C8CD841E2B4DDB78250C7A4CB96097005B
-:10BC4000DF5B0B95DB4D342DFF95BD88A7DFBB383F
-:10BC5000871FF0D05548979CF6F3BBA79C2142F371
-:10BC60003B572E1F49827E8E9A25287FF2C3A64F0E
-:10BC7000823D65FB603FFA8736D53F247CD32C5844
-:10BC80003FFB479413BBF91EA4FF5D05D36D7AF902
-:10BC90009EEA080E035EB4BCDD4BE5DB0CA4A7B73F
-:10BCA00086293D99148E7C48E9D3E6DAE63D25C124
-:10BCB0007CE9778D3E7C917A11BE35E63D14D760E4
-:10BCC0006712726431D8919D206FD06E250A07EB00
-:10BCD00096C1CADF3FB06231D8A19D76AD7CE562E6
-:10BCE000599F57FE7006F3AADDEB4FF6EC82FA9EE1
-:10BCF0002CD2C4F01320AB74F64C41328FEBD6E754
-:10BD0000967FEFD6D9CD1A5D761530BA7CF9626789
-:10BD100035C8CD4E4A975609E87097C14FD6528D17
-:10BD20000E3B0B189DC5C3BBE57A0909EBEC408BB4
-:10BD3000A707E9D1E609A01D1D5D7F450AB363345D
-:10BD4000FAB77909F2834D0A3E753FF287CB0FECC3
-:10BD5000672D68221CA5138BC8FCE189E6110F3EF4
-:10BD60008DFE3B0BF215A0D7F745E227E3D4B75C75
-:10BD70002FC5F96C71CB93927578F4E451BCC798D8
-:10BD8000CF5792D97C3A027581FB69BF72BDA4205E
-:10BD9000DF7889BF1BF412257FB03BA9BDF9C9E448
-:10BDA000543D9E983DA2F5AF704D8316E0730F6D24
-:10BDB00047BFB6939714587A8B2764E0EF2FA604F9
-:10BDC00067EBFBE145E61F2E34BB4CE423E0673F05
-:10BDD000F5CBC293A99FD82262BAA7C58B69578BAE
-:10BDE0008469778B4CC256EAFE90EBE7EF053BDBAC
-:10BDF000E540F826A28B8E163FB66F6F99CDFAE11B
-:10BE0000343A9FBA0BE8C261D2F8C4BF0BE83CC910
-:10BE1000AC959761BE8763E58F242F58AC14E37C03
-:10BE200050EE754D30AE395486EB77F3FDABF25BD7
-:10BE3000C5DFFE798F54E703FDBD6126FA38C618C9
-:10BE40007A09B3F16EB4FFAE6C13CAD3FDF3769EDC
-:10BE5000F1D1BCE575DAFF78F4D8C3FA8FDB9F0621
-:10BE6000EFE02E84D74AD7DB4EFBB38A4CDEC7E324
-:10BE700087E8F9D294207F7808CAE9FD836BC9CBA3
-:10BE8000C09F7458BB087C1A9021DE25B4531CFB5C
-:10BE900041DF06C2CF80BEB571E418CD0B2ADF505A
-:10BEA000B5AFBC4CFB11641BE9A6ED06E7DD45A070
-:10BEB0005DE72B360A13A5D3947CB417EC85B5A4A3
-:10BEC0008DD6DB596D2766FA3D69FE1A02FDEDFC41
-:10BED000991DFBF79D9982FCBA4B647C34A11CF23E
-:10BEE0009A4858AFC76D8E483E1FE4E57D24300D5B
-:10BEF000F9FA693D5F533DD90BFC24902A8570A067
-:10BF0000871FF0333B4451E569E05832DA81016C18
-:10BF10001FB10B9B8808FC7ACE1CEA06BFC4DC80EC
-:10BF200046DF22F361DB30F2B5BC3CA38C10170373
-:10BF300081ECF287492EE025C34C6D31204B818482
-:10BF4000A9DEE8A1FF007CFC85AB17C8AD84A4AFD7
-:10BF5000110CF3E02F382F996E05F8587D4D0FF135
-:10BF6000171A1BA13E4F74F5D19FA94B1ACF2F8CE6
-:10BF7000B6E30793557FD0497240EFB5B79C206F69
-:10BF80005B22FDF05171252DD5ECF9875358DC6209
-:10BF9000949E2446DF2F503F1DE8B1E31766D21B65
-:10BFA00083BEAF27FB0CF66E46D014991FFDF795A4
-:10BFB0008BD68A8306FA1C7FFDB3EA8DED739A1C3B
-:10BFC000063CE635271BF23E25D3507F5257BEA1D3
-:10BFD000BCB067AAA17CF2A1E986FC94D0A70CF5BD
-:10BFE0003FD15761C84FEB5F62A8FFC91335867C0C
-:10BFF00049F86E43FD1967361ACA670E3D64289FDB
-:10C00000757EAB213F67F8AF0CF5BD41F1E409E067
-:10C010004F4A8F668AAF5D19CA21D09FC36DD48EF7
-:10C020009BCFEC63D0B7249BA8F631554C694057A1
-:10C03000ECAF1DF400C8F93D8F85BF807AD2E407CC
-:10C04000FEE50B16C91BA15DBB68225E9D1C911607
-:10C0500011F85EB1C78DDFE5D256E40F81AA0D7BE2
-:10C0600022E86DE37A10F376D20FF0BDC1E0E3452C
-:10C0700025A67C12B28DF46F25F72405C6B1FB2CE2
-:10C0800092B1FECDD2BF2F45A5FF1C4AFFE689DB4A
-:10C090006B74FF90499E9CC2FCC3AA731E83DF830E
-:10C0A000781DF57B6CA41DD8A9BC6E24EB14ABAE37
-:10C0B000FA3756D3879FB871FF269ABF684A714EE8
-:10C0C000D7C9CBE4B566DF8FD587330CF65974DA60
-:10C0D00096F810CA3B2A17CB530C72315005F31354
-:10C0E0007819E5A2F6DDD73715E57297C8EC944EBE
-:10C0F00089F2E538F88A96CB5F4E9698BF18473E8E
-:10C100000B54CE82C2DDB9F2D35D8037791B41BDBD
-:10C11000447510CAD9E8FEA95D7537C2E965F4A473
-:10C12000F9439ABF65A3F203FC2B9B44105F568A28
-:10C130002F27DA478FA27D49E721817D64F550FBE7
-:10C1400013F43DB53F99BDF9E7B52FF361DE7AFBF6
-:10C150004FD5972187DC94921ABFFF17E3EC479DD8
-:10C1600049D6FCEEFF9EF427A718F1A1D1A146679E
-:10C1700056203A3ADEFB125B77DA2291D3F62F246F
-:10C18000F84F10E9E5D4ECB34A25AC5BD0255BA9A8
-:10C190005EDD37BB06DB0993780272266178C33215
-:10C1A000D093A494C90985FE03F4E62836CA0D5B32
-:10C1B000941E15401F278ED5BB9A7CD0FCF389E4D2
-:10C1C000CBB752D438D92C324B2F5FE2F9E19A7CAD
-:10C1D000D1F0B0E0831611ED8E0F68B9664FD07EB6
-:10C1E0002C397C00E2CC829FC84762F0DFCBAA5E8C
-:10C1F000EE3B6997812E5D6B04F4B332FDE172C8AA
-:10C200006736113FE067F670980469FF3FF4B0F5B8
-:10C21000C8F48738B0CF332F873880F3A085C58521
-:10C2200032B785387DDCE89AEAC7FDEEE2A37E5896
-:10C23000F78A3C17F2E9671713A48F21EFC69E72A5
-:10C24000D857984BFCC03F2E0F4F32217FDE1A4249
-:10C2500079E21F51A8AF4392E944614DAFB490E930
-:10C26000F751FFFDDD161BA6D75A444C2BF38A0766
-:10C2700017D07A5B7D0E8C1774E43B709CCE5C010A
-:10C28000C7F98F9C87F2C02EF8758B17EB773DDED0
-:10C290005404F184CE93FF8971CD083D53AC7901EC
-:10C2A0009E30EEF710BEC90BFBBE49F20CDC27ED49
-:10C2B000B404FF7103C413D70AFE6331F837E9E50C
-:10C2C0001FA19F0CF8013CB4DB195EACCE26BF1B4E
-:10C2D000E2FD93C8FA15B1F854C513A530B340E98F
-:10C2E0003789910611E686DA1241AFFA493F059B7C
-:10C2F000583A421CEC8790074509E245D9B6D02050
-:10C300009467D78BFE36AC4F705F415B278B9D04E3
-:10C310008EBBA05E98DB42BFBFE811D9FA0D8570D5
-:10C32000DFFD37176E1FCC21F1F97B4F4BF5D92A72
-:10C330005D3CD64562EF0BFFCB6D15160FEDF77622
-:10C34000806D26ACF7AC71F5E38DF67BBB8753E3CC
-:10C350001393D3C15E6EE663DB996691AD0FC47F24
-:10C36000C08FDE5A28A5BB5DFA7E183ECC279FC73A
-:10C37000F57116B3F9B77DEF8DCD8F513AF977DAB4
-:10C3800010E255AF5CFC0CFA8FEF254BFBC1EF526E
-:10C390007E6C26B0CEEF7D7FD669589431F36E392E
-:10C3A00093CCEBE249EF7DFBD5320BEDFFBDE75EB1
-:10C3B0002DE3510885101F5A79E387AF9541FC4A58
-:10C3C00068FE4DE6650AAF52418A9A204F0D68E635
-:10C3D000876E591A1E076F07D31ED802F1C2509BF1
-:10C3E0004BE4A8BDF625E71F05A0C766809FA60FF2
-:10C3F000DB4676727489B9F4779754D1FEB6728AA7
-:10C40000E2E2006F8A15FC0A72C1EA07BAD95AC87B
-:10C41000F4E5D607C59002722CDCC4C8DDF65AE6F6
-:10C42000652A87ED3F0DC11900D2CE052A13207E63
-:10C43000378D20BDDF76AD290FF695DD44C8073A6C
-:10C44000B498CCD8CFC84567A817E56FD32C9043D4
-:10C45000AD171F9D0CEBF57B55BE6871B73453D3F8
-:10C46000813A1FC4DDFC1877DBCDF7639C3EDE7C90
-:10C470009D5EB6AFC0571235DEF5DBEE7076841EDA
-:10C4800034FE8A6EB7B785F861BC975A6C98BED0F7
-:10C4900022627AA2C58BE9F75B244C075A8A30EDF9
-:10C4A0006BF1FB0B2C00E76C4C3B2C647D40476729
-:10C4B0005FF0B0FDC87B92CABF0074FE24EDF73276
-:10C4C0006DF745DAFE32AD3FAF366C86B8CCBC11A5
-:10C4D0002A2F2528EFC2EFFB697F506F6CB9AD049E
-:10C4E000CA4BABFBC380C7D262FA9D407F7D587FA9
-:10C4F0007FCB093F2B1FAAB450FC96FE96953BE7D5
-:10C50000D27E68DEA9F643C72F61F567637F745C4E
-:10C51000CCC7E8B784C173A224163CD1F5A9956FA6
-:10C5200026548F88F0BFE0EF59240EF75138123EA1
-:10C5300006F2F882B51CF4E79E12926FA2FACD9231
-:10C540005AC041FEA966229A4BA8CACBA8D9554E1B
-:10C55000A09D8CDF95557CE8980FF513F6ABE9A705
-:10C56000E4EA30EA9D243FC937BB69CAD381A753A7
-:10C5700054DF4722E70D503EB13CAE076D2756937E
-:10C58000C8790332717DAA5FA2CA63D3DB474D210C
-:10C590003EA63FF771701EB1835F4B7DFD7E924BCF
-:10C5A000F3AA7DF645B5DEFE7965491B21BFF8810A
-:10C5B000A7200EFE1BE2E5603F7EB47D943D77B878
-:10C5C000E54C5A55A1AA1440DE6F138FE8EDDC6CE0
-:10C5D00085D2AB8E0F7A9AF8EA5E8C2F04336A7498
-:10C5E000FAADC312CCA0CC4BAE3FF18F8B413E8055
-:10C5F000BE06393D7784E9F751BDFE5B261F357BCA
-:10C600004250D76B9FBCB12D01F7D3A83E92C0AE6C
-:10C6100008920ADA3EB17CEBCBF09D9418BF270854
-:10C620008C8F32BD210EF2999EC04F3CB0DF907CC2
-:10C63000487E86CEF7B7035609E8AFEFE4DA7A888A
-:10C640001B3E4C12253BED27F3A54B02C0D1611ACE
-:10C65000168008473CCD4B786A0775089A9CA486DB
-:10C660000F5DFF8E34552E90DF7757D1FA074DC1FD
-:10C67000AB54578ED63FE8086E813CFD936D54AFA6
-:10C68000EF1D8DA36FEB96294DEC55E3E6239ECF6E
-:10C69000762BD990A7F5DD2CDF4EDBEF750F794DAA
-:10C6A000349FC86DE93E930379ADFE966E85B6BFA3
-:10C6B000EA61E700882BE803B9379A17693E41978A
-:10C6C000E7599ED858DA77F23F05D0431D6923A772
-:10C6D000B3009F3FE4FA41BE36BEFCF541C86FAEE1
-:10C6E0002712C4E7324F1CC175F8AAB97C04F0D6F2
-:10C6F000D7724644431DFEB475A176EA142FC17863
-:10C70000B210E242F960BF15F798D07EDB4E49B017
-:10C7100004F0DD9506EB5C91C6FC812921DA8F8E51
-:10C720007FA650BEB34E0775651919D6FB5BC46F63
-:10C73000027811E5F01FE57F2F01FDD4375B714CC6
-:10C74000A5E36DDAC0FB5B25D03FA15601D6FF04FF
-:10C75000877AC2772663C73768FE5A7F4A2FF81B4D
-:10C76000961D8C3E37F9FAD3A6D3B4C3CEE86293B4
-:10C770005BCDBB8DF976D59EF4BA157732FDBEF947
-:10C78000C4815C3000AF1E9B857EE4660D1E720086
-:10C79000E1B93A3827E9363ADFC69FB2B866E340D6
-:10C7A000C912987FE31E13013F6EF300A5271D7F7A
-:10C7B000ECA37C284FA6F3907BA6F2943E02070BD5
-:10C7C00096DAE9FA7E3D5F16015FF569B7EEB6517C
-:10C7D000E7E8EB823805E8A13EAD7437D0D3A6393F
-:10C7E0006F213D26A596FEA49AE2EBE8DDD54B40ED
-:10C7F000ACA599185F5282433967766F43FCFF6B93
-:10C800003919B1BA119DB8CF9907FF47E19B2CCADE
-:10C8100015505F5C465D22A053217012EC10A5C23A
-:10C820008671D20A711996E7AE21A66E0ACF112938
-:10C8300039B99536B517C826B053F2030E8C7F9AD6
-:10C8400013AA76803F7AEC1CCB47D6E912E2C55199
-:10C8500014EAB7D17E6E71F122F8226966D906EB2F
-:10C86000467979E85829F00BB303942F1663BCE797
-:10C870006022A97F8EB63B6ADAD8FD235AEF68B2F0
-:10C8800087805DD9C171EB6BF07BC5D4AD743D8EF3
-:10C89000AAEB6776FB4558AFA36E637E2FB7F141D5
-:10C8A000C0DB23A92F2E81F9A559E59E140ADFE7E5
-:10C8B000525FECF666209EF36DB4FC737FFD42B7C9
-:10C8C0008DE2FD68AB9C29EAF293FF40A536CEE3EA
-:10C8D00005E453DEFDC587808F69F98F6D54FF7EB7
-:10C8E0003D59B307587941BEC6D7D4AF9D4DE168D5
-:10C8F0001DCD2BB622D8F78AD4AFA27CFED5A7CD0A
-:10C9000044EB1FEC09C79C7E9BC38CF3200EB067E1
-:10C91000A6F168CF38DC6C5D1D53F2D14E3A6A67E0
-:10C92000F81AC93161F922F3B322C407AC53781362
-:10C930009EE5214D01D0CF7C364F58BCF7B03C4529
-:10C9400082B029DB1FE47A56A07F682FD2ED071250
-:10C95000F0638DFB877C54BED03A9C61A27AD87379
-:10C960006105974BFBFB6CAAEA2F7A4806C4631F4C
-:10C970004D6572E6D18072BB45021A1B66E75649C7
-:10C98000603AA4E9EB0AD2C73BBF32F65C4018ED2F
-:10C99000B23D2E938AB749BBC305D45E763D27824C
-:10C9A0001CA16A7EC761D06F1E1EE9A610F89FE623
-:10C9B000B7B9591CDED7B7E44BB3C13E7CB5D00440
-:10C9C000FCCF8B7E11CED99527942681DDC68FD2E0
-:10C9D000E9EB4BC240378373EE043F5000FEA59F46
-:10C9E0000FDBD9F9D0910CD20F7161DE2B13FD3E14
-:10C9F000A1C6BF3B5B6C98527FFE5DD01F5FEB22F0
-:10CA0000B84F2078039897DA09077CF1F2A7EEC6B1
-:10CA1000719FE10349EB40DE9E63763D900BC63982
-:10CA2000C24F7010E778DF16488279EF771BEDBFB1
-:10CA3000B23466C776A632F9D9D9C2E2A0C2F54FA0
-:10CA4000605CA7C3A2C923D7D2F05CB0E783788E1D
-:10CA5000D61ADC2683BCB21145117571725BB631F2
-:10CA6000DE255CBF95C58752D938D1E70D5C9CD6D1
-:10CA70007FC1EEF1FC032D8D3E9FD04C02288FC864
-:10CA8000103BF7B06D57657AB2AE9F6D9C9C2E8EB1
-:10CA9000431F0F5F379390EE9CCAC3FC8800F37965
-:10CAA000F8BA80DF897738B115F66528C175C33AC1
-:10CAB0003EFF5DD44B0ED213860373568853E8CEE7
-:10CAC00085122F3F324AFFF911FEC07D752E067F79
-:10CAD00048C67CF47EFAA3E03BD37F77387F2DC035
-:10CAE0003CDFAB242360871232BC08F8B7B1D28197
-:10CAF00071EA87498FCD06062EDF23EAE3C58D0351
-:10CB000097123794E23E960476F0C32F951BE254B9
-:10CB1000DAF9302DBFF9C4068C1F3E7CF49A30B58B
-:10CB200014C118B2507FACD1D673C69A1FA96FB783
-:10CB300004952CA0FF975AE52CFAE95B00279CABE3
-:10CB40006A9E340BFCBFDF8AF519802727AFEA8F76
-:10CB50003536D41FED76EAAF019D5E9C8CFA9416B3
-:10CB6000F3A09FB5F15778181D8EA8FE7C023533CF
-:10CB700001BF1D8EC01566B41399A7F64E47B24685
-:10CB800037CDDDA0FF0E0A11B908933DE860F9E446
-:10CB9000B4E6EE76A687B1FEC893FC6EB0873AEC99
-:10CBA0006ADE43307F50E8413F41F9BE5502380FFD
-:10CBB0003A027EF007951D5324D02755E92E9C8715
-:10CBC000E5EFACBD200F333DC1AB60B7100FB38FA5
-:10CBD000DE4BBD904B5C31FB19E16EA41FAFB11F62
-:10CBE000FB5C36FE7B9C39B0A334528FB60FE3B9A1
-:10CBF000807B6C18FFD1EA1FB618ED642D9D92C69C
-:10CC0000E20C204F80AFB5EF42F03EE45F2B69426B
-:10CC1000FEB57A8DFB451A3F0BD7A718E297DF4A7E
-:10CC2000F5E1FA687240B85E8CE59D2A9DEE847D40
-:10CC3000F471C7498E33CE0C9413F1C72953E5081C
-:10CC400051E3493C9E33D3F824BEBC30C671A3E502
-:10CC50009F966AF2EF884AC7FF600F2E4CA3FFFF32
-:10CC600050A87F91035B076F85F5F9A36AF716F566
-:10CC70001D3809E47745945B5353E13C957C1CD205
-:10CC80009BE59BFA3436DE5839C6E20FDB1E945022
-:10CC90003F3FC3FB1DFE1870D75F771AE4577EAA8B
-:10CCA00084FDD5F30ACAB1FAEB8958FED1FBB793DC
-:10CCB000D08CF1FA7761F968FFFDACFF973FF5E39F
-:10CCC00083B3A1FFE3169355E7CF6D3BBE301DE262
-:10CCD00095DBEC542E1BF95606BEE57D64D40F029D
-:10CCE0003EDFAFF945CAA2DD5573C16ED5F1F96CCF
-:10CCF000B0BF22ED79BACEFB1D5AFB3B77833D34A2
-:10CD0000A6BE33AA7EBED6FF6AEC3F1A1E4D8E40E9
-:10CD10001EEC2DFE0F560D3E9443074C51FD8DCA5F
-:10CD2000A520F6B7690EB33392FEBAFE270A0FF4B8
-:10CD3000172ACF023BEB4122C139E768BC27A9740F
-:10CD4000587F7D92615D23F8BEC5F0FD9F5BBC24DA
-:10CD5000A4E3B7CF04B72D027E4BD2D689283BB1CE
-:10CD6000DDE12C12D2F1DDFFC0F151E1B82D0E1C36
-:10CD7000F3FFC270F80C7C1981A3C0F0FDA3C2615F
-:10CD8000B65DCFBCACCB5B4492A5CF97846D599771
-:10CD90007576CB8C33A2213F73C86BA83FEBBC6484
-:10CDA000289F335C6428BFED8ADF909F3732DB50C9
-:10CDB0007FC175D9902F278B0DF52B6D2B0CF98525
-:10CDC000E25A43FD696A9CFC76EF0643BDC5D283F7
-:10CDD000867A4273CA77C07E59F0C1021BF8173BAE
-:10CDE0005DA6EA10C5CF4E3E684B8E211FCBD47E88
-:10CDF00047F59D370DDB2F149BDA411E2EA4AE7034
-:10CE00001BB5D7D2EB02EDA0F7AB45229AD16F0E3E
-:10CE1000B1F8C9072BABE0FB9D8B89D8ED8EE46F91
-:10CE2000FF2B42206FCD96F15C9BBDD884E7067640
-:10CE300017D78CBBFFB04FB5DFF744E9FB51FA3190
-:10CE4000B3F393D1DF8BD3195D1D58B08FC03E81F2
-:10CE5000CD15C27B3E8353767A21FFA505DFF6828E
-:10CE60009FD135E5112FD04F67CE570DE7F21C0546
-:10CE70006C7F26BADFBF55FB2DB8FEA80DF4E7EE98
-:10CE80006C86CFE87ADAF9F4DD361637FFB8E6B902
-:10CE9000F8639AE7E5746667EDB68530FEDF5DF40A
-:10CEA000F1C07FAF3ACE81058F1306EFE3780EB95C
-:10CEB0002B4790F47A564BE1DE28CCA7D3B7D30B9F
-:10CEC0007AB7CBF788C1FEB7C27C628C63F3323C81
-:10CED000ED163FDEF93CFE27CF6767CC7D775B9C84
-:10CEE00079156BF3F2AAF7283EA6793DF5179E5700
-:10CEF000581D2F359DD9A7BB25C64749E6C0CFF39E
-:10CF00007DF1F92F69B6F19C5282DFE807E417043E
-:10CF1000C63D7F745EC54F3C7E5D635152018ED726
-:10CF20005BD839DB7380479A9E0F4EAA80FB0AAF0D
-:10CF3000C3792D0EDAEF48186F1DD606CD063827B7
-:10CF4000920F25E9F9888FD56B8CED56059CC6F3B9
-:10CF500052EA39038AA7FD105FD6F036669DFF4C72
-:10CF6000788A476F378AA7EEA29BC3D344F49D9A71
-:10CF70002E21BD4C84278D8EE2F5F3FF2A1D2DBE98
-:10CF800071FC20FD7CDCF8F9AF463FF7A64B37C4B7
-:10CF900067FFBFE2E7F11BC4CFE8796B81D4C73AE2
-:10CFA00007D2E915900E27734D6717839FBDD88C64
-:10CFB000F1B3D70E1734927C7D3DA6075E5B36A990
-:10CFC00011CF8F553BF1ACD65953EC7E5F53F1F145
-:10CFD00090D7AD9EA7F3A782DD7BB67AE5B8F322A2
-:10CFE000CBCCC6F38BC411999F99F64BA40A8C9FA6
-:10CFF00051BC1E1B67DDB5758B37DE8DAEDBD9EA04
-:10D00000B69B5A376D3C8AA798EDEEF6E6DF10DF47
-:10D01000C309768637761EA0EF7166B7F701BE6941
-:10D02000BFBF84A20CB0FF09C6FD56AF493F02F056
-:10D03000BEE665F1F001416AC47741562EDB0DE78B
-:10D0400051CEAD727310D2D0E038A6AE67595D6C88
-:10D05000BBF339B53CD29E2393A5B1F58EA876CF0C
-:10D06000AA3A0EED07C2CB39FA773FFE21AA3CBAA5
-:10D07000FD4BDE442C3F17E73CE6B7D4F6AB6BC75D
-:10D080006F4FEA53F0DC1F21528EFE3EFA285DA955
-:10D090007CB0C21BFCBE97D67F9D0B7EF973104FF0
-:10D0A0009DE2C2F33D84273ED8F71FED8797F1BC80
-:10D0B000C6E54686F7E87E75FD85BDA9F1FB8B8741
-:10D0C0005F6D5EDA78A524807E1DA926E27E36BEDD
-:10D0D00019CE39DC59499A707C5E427852DEA4FE42
-:10D0E0009C2F421F174CD23ABC48A3F633F0FBCA20
-:10D0F000A5D0CFC05993B8C3171FEE78F2E09F5464
-:10D10000FAF198833BE05C0159CFC53CB7F72BAFF0
-:10D110001DEBEDF78EEED7E338B73C19B448B4DF1A
-:10D12000BBD4736784047356E8C6DFAFCE3BBA9DA9
-:10D13000C7CCF6C7C91B66C45F5FEF4339B1F8E7D8
-:10D1400035D55EDEEF2D32F8C7B5812D16B06B6B8D
-:10D1500097ADB0482E289718DDA970F409C19C122C
-:10D1600057044F71E58F8A9F81F3413CB7B1BE9957
-:10D17000C373C7C5DB19FDADDF3E686AA4E911952D
-:10D180000F57C03E93AE3F77069B5F5FAF2317E01C
-:10D19000EFD39FBFA0707CFA10C1B89D2DE3E93D8D
-:10D1A00010B71BE6881AE7332D87FD8661755FACE3
-:10D1B0009096B702BC55A9C8E7EBB7AF403FFF96C2
-:10D1C0006AE6E70F0804CF01BD392F2104EF1D10D7
-:10D1D0009B3CF828CDBFF58724D2ED8FD0C71342F2
-:10D1E000781AD0476A5BE073B1E2D35206E3F3DF0B
-:10D1F000BAD83E5E3CBC9C55E5A956AF86972CB18B
-:10D20000EAAFAC36CA350DFE146BF83D12239E3ED4
-:10D210004A8FA1F1F5DD2F5439FD5A94BF547B3E5E
-:10D22000B6DF3237433DA71BAAD884FA4AB14A7801
-:10D23000B65885C7A3AC467C7EB8948890BFD32AE5
-:10D240003D0DF0DD556B8E92C321EC67FD32A76179
-:10D250005E4FF4FE781ADC4BCA2F60F2F7FD2217FE
-:10D260009E137F80340970FEAB8E28F3912F896462
-:10D2700001FA3EA7E24F83EF1C91136682BC683629
-:10D28000C7E4AFBB543A3A17A85C85E7DFDBCD783B
-:10D290001EE1526DCA72887F2B018B1F8E375D6A2B
-:10D2A0005F9970BF6E5D35BDA7D935E78395E3EA19
-:10D2B000AF5501E37AF5093DB8FFA75490A66394F2
-:10D2C000CE267FF9F2DE59347F36642A61E7DCD856
-:10D2D0007CCF86B2B473F1844FA3EBAE165D350DEF
-:10D2E000637DE56FD8BCD6D58516C296D83D877AC2
-:10D2F000F6CDA2F9860CB7BAEF387F1EF0EBAF9AE5
-:10D30000C7B707A2E9E996271D867CD97922E07B79
-:10D3100014DB62EB87F7B29C6C5F87F7E7C23AAC2D
-:10D32000DB1EBB9E3BDB85F5AEFED15C1FCBEF3E2B
-:10D3300090C5D6637D3D17539E1FC84A60E50DB169
-:10D34000FB5F95E954E59D980BEBB23E0EBC2B328A
-:10D3500013118EB73B56AF83FDFB2B51F655452677
-:10D360008343CA64E72BAFF6BED09106F4B09313A3
-:10D37000E11CD95B6EFF14A0BF0DED97D0CF4F57C6
-:10D38000EB3BD2034F66D0F4EEF3CF9D82FA0375E8
-:10D39000C4CF49F1F5C0E10C4D0F68F7A2357DD837
-:10D3A00063077D04FF0BFBAB1404252919D65D79B7
-:10D3B00008CFC5F43A44760FCA3F536F577F43A551
-:10D3C000E7AB476F6EBDEFA937DA4567C1FEF3449F
-:10D3D000ECBFAB82B4B7948E7B95D25B2B9D0FF9DB
-:10D3E000E0895BF5FA46E38778E3DEA81D78F5E887
-:10D3F000CDD98113CDF36719BE1BB203DFAF7E62B7
-:10D400005FA904F3ECB93596BCD5E4F22F55B918F1
-:10D410004D2F5AFA4B55CE5F098D0FD7670E19E184
-:10D4200059D7648447E38F2BA13607BCAB45479F90
-:10D4300006EBACD9A5A46AE60DBD17120FCE5FAB03
-:10D4400074F2AB66338F72EF2887F1E95F353F9155
-:10D45000182B6E153DFFAB264A0F401F4FF3287F58
-:10D460000AEB379C4C9322F4F87F543CFCA974A837
-:10D47000C9574D9F44B7FFAF4A779A3E9B88EE3C11
-:10D4800071E28F07326C88BF0DBC28C0FED1810CC1
-:10D4900089E589B8C80BF6EB6C76EE9D4AA85C78F6
-:10D4A00057E26AAF03EF8329DDD650215DC72BBD5C
-:10D4B000B74DD1AFE3EC4CB61EEB1BDC3B61CBFAB6
-:10D4C0008AC9BF381DD6AF86BDEF71EE7CF2A2745B
-:10D4D000DAFE892113BC9045D66DDB6086F9CDCC90
-:10D4E000647A64FDF657D1EEBB59BA5EDF64D4E7C7
-:10D4F0005FCE10553DC1ECF03BA95D00E708E3E1CC
-:10D50000A13093E1E19EFAE3284FEFDDCEA13CBDCF
-:10D510002593E1E35E3E847299B433FB99D8283EAB
-:10D52000A85CBA0493007CFC35C7CE77F30141FFB9
-:10D53000FEC6FD7B562F043B309A3FBEA7E2E92B87
-:10D5400099EA3B84E9C13B33D13F0C70D0DF5B9F4C
-:10D5500067F0AEDFBE05CF275FCC50ED6B953F2F58
-:10D56000C23ACD8CCC2F459DDF05C7C836D0179465
-:10D570006F4C78BEE47533C275F5ABDF6C827AE22E
-:10D580005417DEF7423B96E6FB9627845A75F13A2C
-:10D59000CDAEC9F7337EA8E565835DD890E933D871
-:10D5A000E9D1F6C6FFE80396F6A878FA4BE983C3FB
-:10D5B000AA5DF0A7EA834754FE8FD60BA37CBC93E9
-:10D5C000F1F1A5F3FFBE10F2D17CFCADCC8FA69794
-:10D5D000A2F9F74AEFDD48D7CA1222161AFCA39C1B
-:10D5E00010F8C1A3F41FF1933838DFF644EF4FA6CB
-:10D5F000419CEBD2DED5EB628DFF4416B3B33626E9
-:10D600004A267C1FF2754667D17222BADD285FC4B4
-:10D61000892FD6D6CC41FFF05CCD6DB970EF2DDAF5
-:10D620003F18539F935357817FDCAAFAC7FBACF591
-:10D63000BD31E0F566317CE6178C9C027CBFDFC013
-:10D64000E17D62F8D3DBE9779FF7FF60581A0BEFB3
-:10D65000685EF34FB6B3F1A2C779575DB751FF4487
-:10D66000A1FE09C5F370AD3911CEB16AFEC9B0F2A1
-:10D67000E7F54FDE2423FF300BD6F9686CB81CEABF
-:10D68000FCAF08C17D73281C579798FD0AF08B8961
-:10D69000B6D3F925D1EDFEA8CEE7CDED37298FCE53
-:10D6A0001BE3C9F1F86D14AE3F91DFFA84911CE0E1
-:10D6B000FB378F7C70F15198CF1107BE3F16DDCF3D
-:10D6C000D7B2CCAA7FE0403ED0F4EF80D0B3F905CA
-:10D6D000DAEECD3B32FD3B888E2F08E50BFAFDC21A
-:10D6E0001F295FF851BE211FF7F53AEB63F9298333
-:10D6F000AA3F141DB7117BBFD1047EB14CFC167D2F
-:10D70000DCE90D75DD7FA1CAA5A22CA63FEFAA5DBD
-:10D710002140BCE8FED1781141E7429C9A7D04FC8F
-:10D72000CBD7D47B02CAC68498F1DE992A5E278AB9
-:10D730001FACA933FAF577D51AE5C73BA1FC513DDB
-:10D740005238CE7E9446BFF1C6BB51FDD117BAB94F
-:10D75000FD8089E6F7D9AC1BD31FAB48D33C8C7353
-:10D76000D0F581B496344D7B81C2F3CEA19509608A
-:10D7700047FD82906AB4E33FF8EC34BD5D1254F18A
-:10D78000FC7EED67EF00727943689A164BFF44C741
-:10D79000697E118A7D2EE32E55AEBEA1DDA7B82B82
-:10D7A000763C7F8B3AEE1B75E3F34D74DCA67699DD
-:10D7B00071DE4A16B387DEA86B7304995FCDC6FD90
-:10D7C0001B362EE82DBD5DAA64FD79F4E330C4EF6D
-:10D7D000619CED84403CA54F50A6EACF5DA5643323
-:10D7E0003CE4178DBF0FA5EDA768F5A2EDAC9F67D0
-:10D7F0004A867BB3B5CB8C70B569F62D11310E72AC
-:10D8000015F4A527A22FEFB4FA1F043A202E09CB56
-:10D810004FA878BFBBFEDF2C307F2A3F3BF01EDBDA
-:10D82000599308F2B3EC7CC8A2C7CB851BF4AB2E8E
-:10D83000A8F6C2447234BF6804E5DBFB2117DE8F13
-:10D8400078F30BBFB3C4EAB7F67A96E11CF1FA405D
-:10D85000ECB88A98258C8B6731CB88BFF5D773F1EC
-:10D860005C703CFBFF10C8AF99608F1EE9D0DBFFF6
-:10D870004F6549AAFDAFCA339ED9FDF1E2AF432AF5
-:10D880009D4D147FD5F4B3562F7AFDB5345A5F0EF3
-:10D89000ABFC1C5DEF52D68DD1DDA81D1387EEE2E7
-:10D8A0008DABF91F5ADC37BF98B68FB12F33661C8A
-:10D8B000B55EF4386F46ADCF183F224EDC2E299B63
-:10D8C000E13718276E9794CDE2766709D38B4AC863
-:10D8D000897AECCAD17BF781B9F7C0E2CF9D06F512
-:10D8E000D6A8C66BEAEA5F3D057EAAE65744ECF18E
-:10D8F000601BEC935DDDC1A1BD113D4EB45DDE0842
-:10D90000EF15822055E307456619E3D4E43176BE6E
-:10D91000DFD3BC1AED4B2D3EDD27047624D0EFB7C4
-:10D920006CFFB76DA05F353FFE2D8BFF411667661C
-:10D93000F6EE855E17DE73DD3AEAFFF931DE38CAAE
-:10D94000FF6AFC71A2F518953771D6632279132FFF
-:10D950002EA2A5A3FB2C8254F80A9C4BE512FDBD18
-:10D9600034AD11080F78A859CEA19F5923C84B3167
-:10D97000DEFCAAC90479DF72DF6E3807BFB2DA2293
-:10D98000DBA5C8FE4BE96B0D85AF807F41270C7E80
-:10D99000ECC02FA57F82FBC1AF2FB64BB03F727694
-:10D9A0009E34E8A1F9B3777022D83D558BEF374FFD
-:10D9B00083F15671F80E8DB399A8E7B56F5D5E5986
-:10D9C00040C8370044DDBD8F1A6D9F4659BB0FEE2E
-:10D9D000CD4E4D1D30B9284ABF7B78ED3E1B85AB3F
-:10D9E000A335E085FB78F76597EC83FB786969F2EE
-:10D9F000D0026A471DCC9EB11CF2037FA3F557BA33
-:10DA00000FEEDFBD680AFA385AFE83EC65CB79D891
-:10DA10008F98A48DBF1ECBEF5AF2E0B16DB4FFB763
-:10DA20000F6F590E67D7CBEAB4F11F595EC953FA8D
-:10DA30009FABE51F4B84BCC74922FB4CB309B144E3
-:10DA4000EEF7E179F781D1FB7C2DCBE1FCF8EBE53A
-:10DA50004D95708FB3ECCB1DFB8AA710326B59B973
-:10DA600028D3FCDC9C2F2F77C2FE31A1F448F3723F
-:10DA7000CE57107E8FD9A4F61FDA2767033CCA540D
-:10DA800028E79467F655BBE13EC2F06920CB879B3F
-:10DA90007B6C69867B098A0CA68970A23C9C85E018
-:10DAA000A8FBDAD9E169ECBE9D9A2F62718AD1BCDC
-:10DAB00097E50776C4BE7FF2610E935F038ED8E5CB
-:10DAC0003D2ADF6BFBAF49E789FC6C0CFEFF3CC4D1
-:10DAD000FD6746F8E914C4433CF8E45C532BECC3FF
-:10DAE000DA189CF1F671F7A9E314B426E13B45CBB3
-:10DAF0009A9CF8AECE243F9337948BF89520FFCDB7
-:10DB0000268433D5CCE17B26690E123C4ED3D41447
-:10DB1000F6BEC9328A6A787764E1A4C0513CDF9BC3
-:10DB20009E51D206E7EB5A7FCE831DA6B51F0BA7E9
-:10DB3000B805E04C35D7946C29D6E1AF98C14DD7E4
-:10DB40005D6D277F13DE7B19189A9A0F767565B67F
-:10DB50006488CB940DD558E05CEAE51C554E48AC82
-:10DB60007D6A25932B235BD4F72A6CFE12435C5FFE
-:10DB70009D7F65E7B22F41BD86210B817388DB8EC7
-:10DB800097E33BFDF1F8BF01CEBBEBF476031FC674
-:10DB900073E60D70DE7D06F4F75301CE37423FE0A9
-:10DBA0001FC0BD0EB09B52DB62AFB716576EB8EE0A
-:10DBB00026CA0CFD7786AF48FF1E2C9F685E91FE3B
-:10DBC0008CF7F8C6F6A7DEE7D3F0CEAB781762C3C2
-:10DBD000F9AA469714DF261D3DAD52E98B4A3F7CDA
-:10DBE000D7F7C2F2E25EFD7B0584EC60E73A78BAD3
-:10DBF0008E604F0E39F07DE0329EC9C7B2A16451EC
-:10DC0000E1C6D285B6AE03C94DF83ED1C80A2EE6AC
-:10DC1000EF0F9CD7E052EDA7F4BAA079830E3E8DAA
-:10DC2000FE23FD0F7D41E38F75C8B77B197C606FC4
-:10DC3000C03CFCE169FA73201AFCB753D981E7496B
-:10DC4000DB54FCDFE10AF57211BC8DC57FD604EB15
-:10DC5000998BE5654327059867431C3EFD650E3BA0
-:10DC600027927E3E9C08E703966633FD35D03FC37E
-:10DC70007E1BF0C53213E124366FB033CB34F94A42
-:10DC8000DEFB590595AFE9A3792A5F2558875179BD
-:10DC90001BB6D922F57F9AF3DEF276AA3F3C567680
-:10DCA0001F8CDA8F36A2BB8768CD61F1DBD9C1D872
-:10DCB000FBD6C3390906B9F5547325799BCE6F6538
-:10DCC00036D3E7B387157C2749E3EB68B95498C38B
-:10DCD000D6D197C3ECF18F5F2E7113C8A515AA5C3E
-:10DCE00062E5C4136880F234937A2F4164EBBEF18D
-:10DCF00047330A210EB7D56B96E09EC34ACE9FF3F9
-:10DD00002D3A4EAD4DEA489022F4514B6C920BF0F7
-:10DD10004D47807BAF35CBEC98873FB03BFEBD874E
-:10DD200063F447A4A4DA71EC5A0D9EAD5E01C7DB23
-:10DD3000B8AB3029A887930F3C8BF13DA70AA72DDC
-:10DD40004A5FF1C67C5A5AB8D164D695BB98FEEAB0
-:10DD5000F6CAE539605FAAE79BA2EDA27BB23983E0
-:10DD60001CD6ECA2DF79199F50FE45FF319DFA8F3A
-:10DD700004EE7BF407F03C183C605488F775D9FB3F
-:10DD8000C66F1D2773C14FD2FAB92BA7D8D06FDD4C
-:10DD90006ABA489FA4CC69AB942FEBE4D919F57DFE
-:10DDA0007A4A0F33815F57E710633B73201BEE9570
-:10DDB0009374AB1FE4CD29217018D757246E58DF18
-:10DDC00085E62D87912ECCC4DD86E7A48E60FBEA24
-:10DDD000BA9152B4533F308741EFFC3C3703E339EB
-:10DDE000A94E46B7A7EC4DD88E275232CA1155EE30
-:10DDF000FD3C770ABE7FA1C9CFC87D16AD1F567EF8
-:10DE00008A5B910DEFC49E4A9D5CD2C619ED1DB090
-:10DE10007F22F6D2F3FB6EA7FC38ABBA3F4C61A66B
-:10DE200052E5A5E58FD2FA5B7298FE3BE50B0CC07C
-:10DE3000B8A7DC4404F8670F079F85FC62AF13DFC7
-:10DE400071D3D623CDC47E1F264DFDFD15E01348AA
-:10DE5000C55CC66F8773D93ABEA3E6D31263FF9E33
-:10DE6000CC7FA8F57AE0FE1FADD75D1EFBDEE81E75
-:10DE7000958F1B6D3DD570955E77CF13EF2DF38495
-:10DE8000DA55B4CADE1CD60FD56788AFCACE3AFCC5
-:10DE90003DB1F78756E1BBAEA3BFF301EF54D17597
-:10DEA0000F9395FB01EFC22FCC787EB3C3C2E8522B
-:10DEB000700745B88794E28CEDEF7E578527C5CC77
-:10DEC000DEEBD6EE2F58D4FBFCC7547B2CD15B8BFA
-:10DED000721DDE58937CF02EDB08DECFD5D631FAEA
-:10DEE0003CAE45BDC77FF3F643491CFBA1D4603F60
-:10DEF00068E346DB1117E13D6E5DBC7B9DF7DC42BC
-:10DF0000A2ABFF6932DC01FD7D7A5B96212E11CF39
-:10DF1000FEF8912A6FC15E5062C22518BE5FA47ED2
-:10DF2000A0A21FFF0A1B3F32AE9328BA71F7E6C8C2
-:10DF30003FCEC1F8CD5C11DFB1B0133C0F5BA6BE84
-:10DF40005F47F513BE5748F55235C86FCD2F02BE57
-:10DF5000179380AFCBCFE6A4EAF4A4DA2E5A1EDDE5
-:10DF6000A1DA0177A8FA26E9BC66373A248E8BE855
-:10DF70009DB17A8B53EDE868F918AD178C7635A50D
-:10DF80005B456F078CE11715AF374F1F93E2D0C782
-:10DF90002D7F11FBB26C6ED03C0DE4663547601FDF
-:10DFA00064569551DF3B7299DFE1C8751ACEE1D610
-:10DFB000D419EB25423DE0AB5CE70DF9297A7DC42D
-:10DFC0009941EEB1FE36ABF4E07BF7AC00EF372EB3
-:10DFD000C965F650499E9C9A4BD3237FA8EC83DFFA
-:10DFE000A11869E549AF07DAC97DC31E98974D04AA
-:10DFF0003FB57C6D55D1115A6EF9A905DF9D2427D7
-:10E0000062FBF7AE664EBE8FF273BE2AE71A3C6C17
-:10E010005E0D9EB05040E1C86C60F064F70F72BCBA
-:10E020004EEE65D7B37AC5B91683FEF1439EC2772B
-:10E030006BAE16BF0CB5C2EFA164D7CB3CE8BBCC2E
-:10E040007E8EA8EF6EE27BA9997ED6BFCB1FE2EE53
-:10E050002D8ECCBBCBB4A218F445579AD30FFAE25D
-:10E060007379C1329877C3857018D036EBC2100F20
-:10E0700076DFFE3C79167CD7E62799C54CD81F770A
-:10E080005E60F0F544D13F21BBD575E965F0B9027A
-:10E0900025004F5AA284EF10D1BF7CD0AB69C9AA2A
-:10E0A000DE482341782F88D8683DB0831CB49EFE9B
-:10E0B000DE260994C23E412875DA74D0730B1DFE2A
-:10E0C0009336D0AFD37DD3E15DA1170EC78EA7D70E
-:10E0D000AA7A87C27FA71EFE78FC31FADEBA5ACF31
-:10E0E00012C78FD6E8DE591DDB5EA59A00CBCBD7D1
-:10E0F0007AEE86F934B40BF81B5D1ADEF7E70536C5
-:10E10000E6A6C23A1DE1805F33FBCB91AE32159E8D
-:10E11000805DD1EEC80DC13BB2EDC99F4A07FCC777
-:10E1200083BBA1D92CDFA7E7E77601D7E348D4F971
-:10E1300035CDCF782C97E9A3D37981AD30FEE613A6
-:10E1400007F09CE083472F09E3BDEB73A378E3EA74
-:10E1500099FFD2B086BD9751BE96473ADCD42EE0E7
-:10E16000BBEA0DCF1E0FE37EF17682FBA00DFDC74B
-:10E170004FC33BAD590DF24CFDEF126435B077E360
-:10E18000D212467F1F5400BD9DD9BFA201E95A2477
-:10E1900022413A0AA2DD956D63F6A886DFD34238A4
-:10E1A00017E267A74DC4DF46CBAF59942289E6AF8B
-:10E1B000F91C7E787FE1EF8FBF213D067886B81885
-:10E1C000BC7B9017FC12E0A3BB959D27EF5E48ED4A
-:10E1D0001E5A6FA1936C85FCC2361701FEB8513CE4
-:10E1E000CC8AA28B59DB199FFC283751E55782EF67
-:10E1F000291DCF4D50EDA8601DDAAF741E9D731020
-:10E200002E9C87982B7F15E9564CC671331BC29CF8
-:10E21000FEFE899646E84A7E3637F566E0ECC77D15
-:10E22000C64DAA9C295F7B947B5B47072FE69A919A
-:10E230006E329F3DC2817F48CB5B177AB03EC607E6
-:10E24000339F657ED3265A7EBF41AE6CC0F97439C8
-:10E2500098FD48E5CA4980EB94690BBEEF776A3AAE
-:10E26000C17766EFB8103E8DE25985F794C0D6931A
-:10E27000A77868A5F99FE54A38FE6921781FACFBAD
-:10E28000E94C76BFBBCBB403DF3BD5F83E9A4F7F5A
-:10E2900096CBFCC9CC3547398827789CCC9ED4E0F6
-:10E2A000D3EA95E4559C05FCCEAA1E423C34AEE16F
-:10E2B000D97D0D159E8542A000FCB461B5BF93AB1E
-:10E2C000BF6D3E44E16B2CE6909E9FFCBB57912EA8
-:10E2D0001B7B38F6BB413DAF0AAB74FED5C1EFBD29
-:10E2E0008A7A65E9008B1F340E1CE7EF7581BE3911
-:10E2F00089F4D948E9CF5E0AEBC6ECD86B96702E4C
-:10E30000E8CB68FA745633B90831D742F60E1CEEE2
-:10E31000FF86D6DAD0EED7E4AFA8C209EF08827C38
-:10E32000FD8DCAEF5AFF117FD5EE07FAF6BD3BFD12
-:10E3300024BCEBD6E8E7FC701EF93F46F50993D7FD
-:10E340005222FC7660A4FF68FCE5E631F91A438F9F
-:10E350007C184B8F687AD6F77405BE97ACAD1FAFAB
-:10E36000E27D54BFE7B1FB578979BC0A8FEC853851
-:10E37000B644F9B9BB14DEF50B144B809F54A71FAC
-:10E38000E23B7FEF7E5DDAA0C3D76981F23BCD9F90
-:10E39000CE77203C942F92F274EBD750CC7E67EA74
-:10E3A000C9EFAE40BC36C0DA51BC3604EFBB0FF14A
-:10E3B000EC25E231902F4126BF1AD6DCC5DE05D709
-:10E3C000F4DF731CE2BF4171E13BD74BFB57207D6B
-:10E3D000128FDD5FC8A15CC375D6F84CCCD5F61D95
-:10E3E000D8BB43D4AF6F857889E6D727D605940488
-:10E3F000692C9FA6A87EFD4CD5AFB7CCB6FD59FDC4
-:10E40000FA4DCD3F41FFE721EF8F30D5F884FA8DEB
-:10E41000067EBA2D8FD92D929A56E431BEDC54DA9D
-:10E420008FF4BFE97213F28FAB9AC911D705A3FC21
-:10E43000D3E260D4836374E8EC5F04FB110BBFC2CA
-:10E44000892007E2C1FD19AEE967705E851C67E7A8
-:10E4500028167CF0F344FD3BA435798CBEAFF599CA
-:10E460004918F0CD3709E3D9BFF1FACB0957CDF9F7
-:10E4700027BA7EFFD29784E782AE3DBBF2F3905776
-:10E480008E26E139929C702DD2C535CF1C3FD081AC
-:10E49000A78DE1E95A7F25D2CFBBE99209DE096B4E
-:10E4A000ED7F623EFC5E74BD0AD7BBDF3537031ECD
-:10E4B000767CED3BF3E15DC94D212E05EE9B5DEBD6
-:10E4C000FBCA1F41EFD51F7D18CF7DB57DF37FA11E
-:10E4D000DD6D0A1D61DFFB9244A877F59903F30116
-:10E4E000BF6DFD6D58FEEE3347307FF26BDF311F9D
-:10E4F0002A8DD0F1BBDF3DF2C3DF433E9088F77237
-:10E500001A824F3E0E79529BC8EE5D055F11F4BF33
-:10E51000DF75F0F820F2A146174BFB39F5DD30012D
-:10E52000CF7968F4FB56457119F01DA550BF793EAF
-:10E53000CD7727D4C78A23EE51E7DB00B408E3AEDA
-:10E54000E142C0075D82D287F25CECCF0579EE2C08
-:10E550000E0BF02EE9EABAE3F3D9CF10B662F94A0E
-:10E560001B3B2F368DF20BBC1F457B3BFA21C4F7BA
-:10E57000BA1E5C07FD1D3613D19C118177B320A113
-:10E580007FB4B986F3530E231CD9762A15F6C79AA1
-:10E59000897AAE8BD5EBA2EEA52D19F510B1D3B4C7
-:10E5A0006C5BEC38E893792E953E19BF660EACC8CB
-:10E5B00006F9413C567FA12FD25FCEF9A66E78DED8
-:10E5C0003FB37E6811CC6349D18619300F0FC4FB6D
-:10E5D00040BF282EECBF11E293949FBEAACAC73455
-:10E5E0003180EF8CD8E4402AFC269B640DE0396E24
-:10E5F000697DC0D20A72861FC95D858AF09861FF65
-:10E60000F0A025983113FAEB52F5D351063F6D8FE8
-:10E61000FD4995B207DAD3FEB13F5B9DCCE36FBEF7
-:10E62000D9D83AFCEB0F6E3F668C9787C6F45FEA49
-:10E6300002FDA2ACC17593049CEFBB5015F1ADDC9B
-:10E64000AA8F6347C77B409EC17EEFE9BCF2C1BC85
-:10E65000D448AAC581A2F1CC4BB49CF65321C998E9
-:10E6600092BE1BBB77A6C9EDCD7B54BDFBE22594C2
-:10E670003B9B833CD3BBC1CBA877FFA545266F53FB
-:10E68000C3F2E0F39790BEEF3DC1F4EEE61325022E
-:10E69000D0B3F61EF2E68A6BA87F153341BADE2CA2
-:10E6A000F49FF642FFDDC44D2D7BB279FEF02D20A4
-:10E6B000FF7EFDBC7D0DB43F653221BD9DEAFDC4EA
-:10E6C00091364E0F1FF303B8FA10F2E366D52E28E9
-:10E6D0005F7BDF01F0C71AEBD9EF116C1E50F98B8D
-:10E6E000FA6380DFCD275E45FAD1EC5EDFD3354893
-:10E6F0006F6E4A6FF8BB095543081FFDF317D2D45C
-:10E700005DC5DEC55D52545206F47672F50F778210
-:10E71000DEDE5C4544E8FF608EFC3CBEFFFB3C87D0
-:10E72000EF511EB4F454C03DC9830B2511F8637337
-:10E73000B076543FE1F9EA60ED00F28F679D1FEC7F
-:10E7400087EED620DAD5DD194EB40B0E3EDF8AFAFD
-:10E7500073B3E4F0C3EF992C3DC16DC5F68A8B30DD
-:10E76000F839B4F397866EC3735B1A3E96560DE77D
-:10E770003279C1E0FEB565E8D330EF5F7FCF0A6F35
-:10E780007E8FD2DFFF05D640AE560080000000002D
-:10E790001F8B080000000000000BDD7D0B7854D5B6
-:10E7A000B5F03A73CE3C1226939327E1E9C90308EA
-:10E7B00098841308EF872704102BB583F2B2220E3A
-:10E7C000C823424846C48AD77E37830331526F6FCD
-:10E7D000AC2FEAA576A06AD12B106DAC51030DA821
-:10E7E00014ABB5D1528A16BDA3222F918CE083DEE3
-:10E7F000D2F2AFB5F639C9CC640262EDFFF9FFE998
-:10E800005737FBECF7DAEBBDD7DE9336D9BFF18E85
-:10E8100032802BD561BAAC03A42B6DBE3B3201D242
-:10E8200000F435986FB07B9D3A9647FE430A6DCE53
-:10E83000C5EFD3C0081501E4DF23192137408A262C
-:10E840000164516A335307C008C0BF0691AA811200
-:10E850006F31C027B5067C3800F84FCB0658CEFF85
-:10E860000058B1A8D5A1617F554F89FE329D46E978
-:10E870002D989EA3BFCB305F013778B13C4B966E8D
-:10E8800098C1A98D53ABDC4A8799F3C87D64E1BD7B
-:10E890005370FEDFA9043D0987E85D88DF310F7EF4
-:10E8A000080DC0F9F7AEF4F6D5A83C73A92E633E67
-:10E8B0002B03BE4FE591350ED82C75ED7724AD6B4B
-:10E8C00004D5F39649582FAB678A1EA4A1E4725B66
-:10E8D00012B52B95F4CD1AE5AF7E14084E59BD74D0
-:10E8E000EA072064C2C15B66C37A47B353F4F5F408
-:10E8F0003DF407E56A84C7244DB5CA4BA99DE601DE
-:10E90000585FDAD96E4ABE97FB9BD233490FE23C7F
-:10E91000A737044A204FC0C1EBEE8443684DF2DCB8
-:10E9200050143CC6131CB07D6830CC6D2C22F87B93
-:10E93000ABA89F6C9B9EB11E3715DC81926B526811
-:10E940009C20C36B00CD03D329B83E3FF59BEF5D00
-:10E95000C5F0C84AD113C163CF25021EBBE76C9333
-:10E960003760BDEA2229E4C4F9DDFFE28C525A6720
-:10E97000F54CB70E98AFF6290B695C08B8E031CCBE
-:10E98000836FD1BD53305F5DE9D5D76BBCEE455485
-:10E99000DE3733495F8FE50F3E2F1994AF0EB84332
-:10E9A0004998BFB259E04375F3D3CA8D98F620BC9D
-:10E9B0007353BB40C98CE2CEF900ACE1F9544F3A35
-:10E9C000D1FF656C1F9041972762DE111EA8E3FA04
-:10E9D000AB27860712BC4E3E9F3497DABF62B30561
-:10E9E000689C57365FBA292875EDE7A4DDDB44EB58
-:10E9F0003F89EB0F60F96F9FFF7388E8612DD28329
-:10EA00009C837BB4462BA7F2F55340A57DB1F66BF2
-:10EA10008F23504878B5272F99F183E6E945381FB1
-:10EA2000A77FF602B8F5126F8D8670AEB6B5D629FF
-:10EA3000D46E4B06C018CCBF70F7409FBB2B9CB167
-:10EA40003DEF8B4B01C65F57A847281885572E17F7
-:10EA5000D2DA304E036E4C7BAC16F089EFE74ECD28
-:10EA6000CDFDAC7085F7E0CE41CDEA065736E29198
-:10EA70002F59E3EF49F680D107E7E3682E6FED8366
-:10EA8000E5D9E9F81FDAB7CD3D42B46FD9D9E07BBB
-:10EA90002641BFAB4C3CB3F6A5211D182FB33DA2B8
-:10EAA000FECF4DBAF98949975BCC348A2E62F1DEEC
-:10EAB000EDCB253E919D0CBEC604E359ED717E5C05
-:10EAC0006ECD0B5CD84F26B5D36C8CDF717417CA32
-:10EAD0002A1E4674372559DFED227A1A963B2C08F8
-:10EAE0009DE320247267A474C5035A07D10FAD8B30
-:10EAF000E8ACBB7A0DBB047F8AC7CB674C3AA9222E
-:10EB00005CC7796F93901E13EEB3E8A7DE966B7B1C
-:10EB100010E7FBA3FD32F3D9F87A56BAAB16A0750D
-:10EB20001040DEC66B53BDC5DDD7DB66D6FB71ADCD
-:10EB30008B53B7AEAD51B0FFA12D5AA90C349E3600
-:10EB400089C60BE078B4CF2913E15319E1E319DD4D
-:10EB50005078672EE179E35C5AD750256C2B25BE9F
-:10EB6000EBB5416BA1E0DFE7F0FF3DE72643ABAB40
-:10EB700033DFCB971E93EF53D93BA67E3F7F5E4C8E
-:10EB8000F925AB87C494E70686C5E4F3EBC7C6D482
-:10EB90001FD03029263F68C37762EA0F0E5D1D93B0
-:10EBA000BF74CBF763EA17372E8C299FF48FFCDDF7
-:10EBB0003F253CA7F527E073561AD17279FF8636B8
-:10EBC000C7AE3F7574ECFA158800D1FBA4E4BFEA28
-:10EBD00089E8D94A5341F92C6CB5233EE0D26C0F39
-:10EBE000E23CCAFF2C87D627988785CF567E922293
-:10EBF000C78C6BF1890BE1579EEFFCF8F263C217EB
-:10EC0000E779E6FD0F39215DAAB9820F28E0E5F525
-:10EC1000A74E9C7BDEF5DBE3D70F1AE3BD87D69FBB
-:10EC200000EFE3D79F3A3A761FACF5E7F90637874E
-:10EC3000B19FCFE74A2C5FF651D198AEFDBD1BB70F
-:10EC4000CED9AB52599F01EF3509EB77CEE34E9EFB
-:10EC5000C7F54EF02782C374130E95B982DE2F4498
-:10EC60009FEF9BF3F81FA24F4CDD6B73991E619FC2
-:10EC70001C1A805D2DAC9776F544BC48F7B9592F26
-:10EC80005BA8B44269949CBFDFA4EF074DFADE5045
-:10EC9000AB723F0FD7E670BAB156E3EF8FD416725E
-:10ECA0001AAAD5F9FBE6DAD19C3E8AFA18A58FD7C5
-:10ECB0004EE3744BAD97EB3D593B97D3A76A7DFC70
-:10ECC000DDDA9FEBCDFD016F06CBB3F8F5CC5F9598
-:10ECD000182F412EE2F6F391CEE4F3F0B52EEDE5D8
-:10ECE00079A9E7C3A3D50773B7BF1C8507D7E5A6E6
-:10ECF000641EEE81FF1805A3CEC9176EFF65ADB681
-:10ED0000FD65FB85E9C2C21738FBE18044F5AEA77B
-:10ED100031C722BFC9DDDC1070770F9F4E3C8AC31C
-:10ED2000572FE22B7E2D21D9DE8BCAC3BDA3C7F995
-:10ED300093B9CF567EE64C81AFF1FDDE6FE2DF2C5A
-:10ED4000C24F2C9F1D47AFA77385FC3C9D2BF4F44D
-:10ED5000FDDDF08B7B726DA6FC14FB3E6B9FE04BE0
-:10ED600077F6983FC197605C294F8BA1CFD9336369
-:10ED7000F771BF5DF0B7FD7F92436B12ECFF85DA50
-:10ED80005BEB896FF72773BD9FFE7F466FFBAF4D2F
-:10ED9000617D7EBFDDD72F2B6A7FF65FDB636EA2BE
-:10EDA0007DFFDF5CBBD8AF421548BE433A18A407CD
-:10EDB000E192020ED2E5A0403D4C7482C610D145CE
-:10EDC000F778A9C0618B9E64826712EBE39FCF4CFA
-:10EDD000E1FD079F6A4054FFA0A8AC976EFB2EEAA6
-:10EDE0000A349E82E3A11E0ABAAD73FFF2E8BFC9DE
-:10EDF0009DFC5AEE9EDE2E8407161F994D7CE43C46
-:10EE0000F2BA6BBB8BE32387888F5CFACDF3118B4F
-:10EE10008EE1EC8D03BC295DCB67111FE90DF0D3AA
-:10EE2000DCB7998F7C6D3859746BEA13F1FCA4DB65
-:10EE300076CD9917907F263F57FCF561C48BDBE4B4
-:10EE40009486F5D8E42EC5FF73CA07020A3C86A94A
-:10EE500073F5E9DE878673B7850AD71BC2F69D5323
-:10EE6000F1FF32CCF6A053A57A0FF5F8F7ED945FD9
-:10EE70008D1CD389E99749FD4380B640699EE03FE8
-:10EE8000B2EB4CEF4351F3B3ABD0273A5FDAEAEA87
-:10EE900073286ADF86EF5563F223DA7262EA8F3AEB
-:10EEA000A0C5948F0917C6948F3BAAC7E427444690
-:10EEB000C7D4BFEC8C11932F872B62EA57B866C476
-:10EEC000E4A7A8D7C6D4BF3C67414CF915DA4DB1C9
-:10EED000FD157887E7E1BA173ADCF5522ADA69B905
-:10EEE0004619E59393ABFD0BC84E5AE3516122D509
-:10EEF0000E85086E750E97BA1EF9D40792D11F10B1
-:10EF00004FEFB3A1D59D8FF5E530507AD0A697523B
-:10EF10009A676CF1119D6E2F4CD6681F920702B450
-:10EF2000919C52F424407EE2E811F95D01EDCB6F33
-:10EF30006CF01826DB5554F4A97E736688ECDFACC0
-:10EF400064DF15348FF5B606CF1ADA671B781FCB4E
-:10EF500064BCFAC968CC1F7E41B1119E6D6FB1DDF2
-:10EF60003316F39F61F7329637B59DF8C995981F10
-:10EF7000DA66D7A9F65090D94E5CAEC03D4A7AF712
-:10EF800078F6F10F843D15FFFD677982DF6755083C
-:10EF90003B33BEFC8E3C21DF3E76242E5F6EB6AF47
-:10EFA000B86BFA43C4D7EC6D7620BFC5AA2CA32753
-:10EFB0009C4F5F3D930FA1E15179C50BAA9BBE0FFA
-:10EFC000E4EF1577CD83B05BF4437EAC5549464FF3
-:10EFD000F23B7C3C29F13C6E31E7613FD3A39B7E41
-:10EFE0003DFCFDE3BCF3AFD37E2609421989DABBB1
-:10EFF000F97B563071FB7BCCF13F4E4F5C5EDFD12D
-:10F000007F2F086444B7137CA7739CBE5C6E3F934C
-:10F01000068184EBC8E4EF9063E410DEEC423A270B
-:10F020007E519E96ED0024F1F91079C540F8CF206D
-:10F030009300F1145C7A29F12950EC91B04517281E
-:10F040003F1680F201D90B3644C67338B51B56DB28
-:10F050003F0847D1D10C23360F543F4ADE7C427D16
-:10F06000E37A928714A612BE9F022D554D805F56FB
-:10F070003ACF257B95A8F51CEC464F6A33E178B072
-:10F080005762383E6FF2B191F320A1BED696E711D8
-:10F090007659A1DEF37C7283E0EBCB88EE377E1FDE
-:10F0A00032B9FCABC219F182E57AE4BBEE10FB2960
-:10F0B000BF71785BF8DD27062F3EC98F9F777F2EC3
-:10F0C0002FE8EB7D2B8FE58A3690E4629349BF4DA4
-:10F0D0008AD163989BF8185426827F9F7C534F8D6A
-:10F0E0005B771318390BC8AFA1D875E267C932F83E
-:10F0F0009F4E00FFF875A79AF3C6F6735BA93D789B
-:10F1000074C1E7C0EBCA463D9FFE854B280FBC6922
-:10F11000A7FEE7F93DFA7A54813ECF13FAF40208CC
-:10F12000DB890F77819F3BD34E7EDB78387A419B1A
-:10F130002FE55F189EE905C6E7041F9B4BCDDE8ACD
-:10F14000EB9C1FF000F9696E98079E629C8FEFBBE5
-:10F15000E96F185877E155434AD6527AE9F83A9957
-:10F160005B4F66BD4F0AF491CF5DFAD5F5BE3A8F7D
-:10F17000AF90E8E390A42D61384808079237BD8F1F
-:10F180000F5C1005C715FDCA7F9F9F45E7036064AC
-:10F1900090BF788793FD56B001580FADD9397813D9
-:10F1A000C9852FF27DAF51BD51934DFFAD11197837
-:10F1B00075CAC5C30BFFEC44271782976CD2FB417D
-:10F1C0004F62BC19972FF6EBABD24B66BE8043045F
-:10F1D000E1B0B9EC9BA717845F0CFF782D5FF05F5F
-:10F1E0002BB5E0366A5AAC7FF735731DAFE57B3837
-:10F1F000FD22DFCB706EEFF7E9E12492FF0E5C7F1A
-:10F2000002BCF7764337DDADBF3B7AF9A6F8F2C111
-:10F21000E4C4F35CFC2D99E71B344FE2F32589E746
-:10F22000F96F17894FB83F4B5CF9DFFC3CBFC8371B
-:10F23000DEC8A779A6279EE74F2F129EC8EC96B48A
-:10F2400062BDD9C807A9DE373D5F082C984272E835
-:10F250001A9FF0FF1723C7253E845379F4DC70D240
-:10F260006FF5751B88EFACF4E80195F9C81BF982BE
-:10F270000F8281F399394D627F52FB884F97288422
-:10F28000EFD9D09A46FC6AA793FDD9F1EB0F99EB21
-:10F29000473A799CE004D32303899F1C1C98984F1C
-:10F2A0003C1E5FBF3EC2F2697D7962FD749B49AF2F
-:10F2B0002B5C0DD3B26DD1E72BB84099B86CC0E888
-:10F2C00043F2B64C5D4BFCC4817289E0EAE833A49A
-:10F2D00027ED07E6BD12F981735E3F207918DE271E
-:10F2E0003AE097D739CEF1DABD6A81BD7B7EBE5C4C
-:10F2F0007E66A43FC17AB66ABE5DF95176E3F22D0F
-:10F30000AFAA05D1FE7108DB800547C4E6E5F341ED
-:10F31000D36FD0132ECA6F509C29E865453F2FCB81
-:10F3200007921B643FD7BD30A6943617F50F20FB1C
-:10F33000209292CCF222D87B6CA11605CF0FF32D30
-:10F34000FD53EE46AF74C47C7FB7D685266567FE55
-:10F35000FAA3FBA6903E3F1FC2EBA8FEFC553DE87A
-:10F3600008B2639D1DFD9D9162F4DBCEFE15FE5E2D
-:10F37000EE72B7CA433175FF2EE17E6CD58CA304C3
-:10F38000CFB5FD8C63B4CE78F805EE1A9FC67E0427
-:10F3900082DF655DF7BDBB7DFEAB669CA6FE5EE8C9
-:10F3A000A75A7E1D9DCFE392ADF361453DECEA8403
-:10F3B000F757DD9764D3BF88FAC4399AB701557EF1
-:10F3C0009ACF3C8BBEE3F41C2814FE803A4FDBBA84
-:10F3D0005D517478832D9225E476781D3999FE6706
-:10F3E0004712F38FF61DBFEDE7E3F3344BEFE8214F
-:10F3F0009FEBF1D5E767F917ECC989F569EB1C6359
-:10F40000B7BDA880F5123AE71D8D79495B44F6AA8D
-:10F41000A2821EC4F5955F8ED884FD4D92FBB68402
-:10F42000711D9FC3D9E40998FE2788F5AF7AF3A32D
-:10F4300074F2634E52ECC7A3F953BC1F684041AC51
-:10F440003FF914CC4B6D25B88C4F67B86C6F99940D
-:10F450004AFD943C3FB927A5BB6AEB55C5DEE90FD1
-:10F460008A9F7F793776E9B002A177BE9E6C0C2B1C
-:10F47000C0B4BC9BF58F32EB85938D5105599DFD32
-:10F4800051FD44F1106D832C3FAE80EB358105AC0E
-:10F490006FD95CC857897FA2FE2AABE4272CB03312
-:10F4A000BD1BA0A9D9EC3714FB8F7C5DC1FC0433D4
-:10F4B0002FD5BF1DA4761B6FF1F03938F83420F931
-:10F4C0008080E173813AC9CF7E0717C57D60BA5E3F
-:10F4D000D237902E26DB2219822E4222AE017C0AE0
-:10F4E000E57F2B85831427B0D6F5EF3F273FB81172
-:10F4F00054206922E615603F63E0600A9FCBF1CC9F
-:10F50000701E4E6B5E663EC5CCB7CF9A3A6D00A6B4
-:10F51000B7253FE2213C0D4BC847B19F2F93FFBD5C
-:10F5200095E9C69FACDB7B937FE93DCE4B2B937572
-:10F530002987FC4F9E42D2535743B2EEC4710C77D9
-:10F540007180C67568C0FEF86468E475B8DD9F0414
-:10F5500008282AA812DB4FC9BE65056CAF009F932F
-:10F560001F7E2F6533AD3F493DD57A077ECA0083A4
-:10F57000EB65C4C9C72CF72A89E337BC4A9C5CF405
-:10F580004904FF9E73E3BFC7CA4B171C54899F48A9
-:10F59000ADDE9C73C89FDA086E659D706B53845D09
-:10F5A00067C12D30C9FF4B826BE04EA71ACCECDE51
-:10F5B000DF86001A45FA789BBA642BD547C3096CDD
-:10F5C000D45F8E585FA0D229F641F16DA5F6EFD831
-:10F5D0007354B27B2C3C7B68A0C9AFBBF1773C5025
-:10F5E00020F4A3EAF4C3D524E70007B5F50738995A
-:10F5F000727424F10D9497F5242F93EC06C3DB92DB
-:10F600009B2B9AD600D15575F30220BEF28EE41BD7
-:10F61000F032DB23C076D99C6981576C1AF9B26647
-:10F62000AE7363FA49411EE3D7FE57A6BEC26C48CB
-:10F63000761753BBD2CBBC53B270DC6031E8776233
-:10F64000BD60926FEBB3B4AE3765FD318DE2212A18
-:10F65000E0C3E12632E1F74DB333D86F9A5911A9CF
-:10F66000A37881C8DDA0527C4F17FA388BEB1B09B9
-:10F67000F00B1E0BFB59A4B612FEF4427C93D4CEC1
-:10F68000F247A93C5FE42FC37C8DD852C86F29FF95
-:10F69000DE0882479B0C141655D322D968FCFC99CE
-:10F6A000C359AF29A0F2CCE8F2B4E54F61BE60EED9
-:10F6B000049DC849B3F97E762B95BF01BC0E30F985
-:10F6C000F7A838FA1DD749375C5EDA91F757D07C36
-:10F6D0005FB919D88EAD31E56D0CBDD162B1CC18D2
-:10F6E00049F8D7D10F503F15667E9CA2723F7DFD31
-:10F6F00060F205EFC607F89CC0A6937FB24E6A6021
-:10F70000F840C0CFFA1EC5CD10BDF49FB76BB79DB2
-:10F7100006CB1474A7EF157457065E99E03552BDF9
-:10F720003B48E3CF9997CB7C66CC5160B830E5611C
-:10F730007E429AC4FB943F209FF165BC4BAF97116A
-:10F740008F64B9343F09C79B3B4FE2F38959735D1E
-:10F750002109FF390BE983E3A1145FEE6CC4F7398B
-:10F760003E499CFB627E5E943F1EB5613E379BED39
-:10F7700004FFD309F0397F80C077AB7DCD5A478C29
-:10F780007FE792016EE1E71830F59302E6BF22AE03
-:10F79000252BD91B117CA381F9D4611BEADFA4FFBF
-:10F7A00082C1FAF63526BD5BFC6296710BDBC1B3F4
-:10F7B000BCB17AF43BB4274407D74AACE7CE997B77
-:10F7C0007E3DFB5C8164C6DDF455599E99DF35D0E2
-:10F7D000D89EBE9AF49C12FC380DF59028FD7EDE72
-:10F7E0006D67D3B87ECFC7579CBB0451A152F09729
-:10F7F0001A8427F1CBF26B15A697EAB50E8EFFAAF5
-:10F80000695E63CF267CFE21E8025FDFAFEB83F306
-:10F81000EC53658C90B528BF4D554822BACE269E34
-:10F82000C3F08F38C82F37DBA157D1BA66A7831A28
-:10F830004843BCBCF68A8DD4FF5A17A832CADBDE17
-:10F840002D6F8608AF9095EB849388391CD7D657D7
-:10F85000EDC1E70BF5B6611CB755EF49D1A3E3A4A1
-:10F86000D6AFE9C43B8AD7D29C304C35F737919D4F
-:10F87000346480E0570F4AC0F22270AD8BE19C9552
-:10F880002FE295B2527547308DF88D66D5E338BBBF
-:10F8900007EDBE5EC3310DA15A29F647B48BA7FB15
-:10F8A000AC0CB39F1E9A1444629CD9525A6623B87A
-:10F8B000B953748A4FB4FAAD4836ECC4B72A8648B7
-:10F8C00023820CCF4DCA22D24F9362F9BEDD2EF6B1
-:10F8D00005DE157C3F5E0EA21C60BE4F7EFB6019EC
-:10F8E000CBAF8A01592C0FB89FD58A4B75EAD0450A
-:10F8F0009E657A2185FC5CC31064A4AFB7E5786788
-:10F9000050FC5EE07585FD6A6573F5EB1647EDEB1F
-:10F91000E60E391099CFF1503FD4FB503CD4DAF2C7
-:10F92000CE3CC53D56428383F0BD324E3E2E73BF62
-:10F93000CC7AE4B247ED9DF80B1427AAE713FFA891
-:10F940007AAA8B3F88F954273F8BB32F417D89D604
-:10F950003302F931F121A3204566FF32CC13721432
-:10F960001E97C82F267B56D793DC6B97521AE4B2AA
-:10F970004E3E39C2DCAFBB14EF4B141F1B407DE978
-:10F980003115BACA01F0B3FE3211E526E9D152CBE6
-:10F990001C99C6DDB814FBA6F37C255C41F9DB9607
-:10F9A0008A735208DCCCE760E3024E95E8FFCBE4B3
-:10F9B000FE6BCD71FD7664D6C7D41F727F80FB428B
-:10F9C0007A8B44FC10CB7B4FC3A64807E35A8E705A
-:10F9D0007F1B33045DC4EB312FDBDC219B8DF86E84
-:10F9E00080E54E128472087E4681E0B36507049F6D
-:10F9F0007D2E801AB44CAAACFF9AE9B9AC0772F913
-:10FA0000D80870FCCC0EF0559BFACE5D034650B47E
-:10FA1000A85FF071535FB0F4B82971FB78B9FB7E31
-:10FA200085F8D6E5395DF64BA6FEA781C4FAE21546
-:10FA3000DAF9F99661F12588E54BB97096F70FEE82
-:10FA4000DE732BF90982717A50F022F5A05EB9BEFF
-:10FA50005FD0FAE2F5A1EEE2299F1A7071F194A845
-:10FA600041CC27F935D6B2B3E2F0A77ACFF1F9F756
-:10FA70004027DE75E07360D375B40E94E72AD97D14
-:10FA8000D26F1E62BA5E8BF5E4F104CD83C1FFC272
-:10FA90007CAB0DFC14AF003EF534E1A92577911342
-:10FAA000319ED42D1678374A11F9BEA8C8125E06C9
-:10FAB00047C7EBEBBE5CF2471B65C51C1F6BC9E378
-:10FAC000E13683F16404E81954CFC2939161518EF9
-:10FAD000F8F11AF19371D3105FF228CE76541FD249
-:10FAE000BBCA4163FC288F936B15EE990AD17985C7
-:10FAF0002B7EFF0D3E779C6CE2C714F5EBE1C7252A
-:10FB0000841F96DC423DF9AE38FBE2AE38FBE22BB7
-:10FB1000E0C7918BC18FC845E247BBFD87EF05CA9F
-:10FB2000D89EF5CBFDBBE287D472DB927B88DE8367
-:10FB30002940FBFE74925AE1C679D6548AB8F3E1A3
-:10FB4000BF2F08523E7B452EEB854FA7E92F71B999
-:10FB50005F9497B519720AE6F3576139E69FCEF5BF
-:10FB60005650BE66359663FD11FB7C41CA17FC50AA
-:10FB70009497DEE97F2985E47C40B47FE1589DECD1
-:10FB8000C1F2509DD9BEBCA182F235F5A2FDC803D9
-:10FB9000A120E507DF23C6B7F4CECB4CFEF9B47441
-:10FBA000EAA5DBA93FE49F9B917F8E3B61946EC3E6
-:10FBB000FC22D56623BC5D1C09D8091F0EDBAA46B2
-:10FBC00012FEC0425F0EE19993EC56B9937FD9C8FB
-:10FBD000A983ED262A76D6FB5E95FC0AD59B4624A2
-:10FBE000417276B4EE22FE4EF1C89B51DE1499F2BA
-:10FBF000C88ADFA57B0433A2F6AB68A090F356BD9C
-:10FC0000EC748117F0B0C00B2BBEB8F52190C8DFA3
-:10FC1000426B633F449778633FCBEF50BFE2618410
-:10FC2000B797539C31965F3E56C419979E3B3D351E
-:10FC3000915D347CA0B0E78F9AF722ACEF95A15C80
-:10FC40001BD1CFD3843CBD099EDA1F495F7A9AC687
-:10FC50001ACB200DC068DA47912F7FBCEF7DF57D70
-:10FC60000196DAFC0AE111F497749AFF556DFEC90A
-:10FC7000BC9E2A80EFF54AB00E53DE2F093A368B30
-:10FC80003811C17F6699FB764C9DF7CAED6C3F7BBE
-:10FC9000743B8E3369FC00A6FB9973258BEEBF3352
-:10FCA00090F4603AC1607FB68FE3DD6F8290830687
-:10FCB000B9298EEE97BB3F7B8FE4D2F22DB174BD94
-:10FCC000025A1DC2DF1C79E46DECBF72438A4AF20E
-:10FCD0006745636CBDCA0DBF3F209574E50395165B
-:10FCE0001F08C5F2015438041F7868089F7FADCC07
-:10FCF00091B54319E4FFF0B3BC4F0221EFEF52F48A
-:10FD000030D35F8B53D851A67E7E9B2CF4F32470A6
-:10FD100069EE42E2C336335E55E4ADF1212ECEE505
-:10FD200054C3CDCC6FAC78180420CBFB5381CBD51A
-:10FD3000683F5B079F8FA3F7D2969EAD74DFC0F23A
-:10FD4000B3A07EC0F6152C424E378EF910EF9BB44F
-:10FD50000CFF3F86D6E5E0753DD4A33FF3F7D548C9
-:10FD600010CE52B28B95E256EA7388A02717D111B4
-:10FD7000F1F769B1F65612083D7E789BF0E38CE806
-:10FD800094FB75B4BF4ED05D42EE3700D157B7F645
-:10FD90008A7B55427B852514F63F7B9AE0EB17B2B0
-:10FDA00057BAB3473AF63309F5364C67FA92B6D3E9
-:10FDB000BA2F3B9B9A92289E6A66B9EC25BB6CA62B
-:10FDC000DDC84A4FA0E73F60EAD91DF57D6EEE4FD2
-:10FDD000F1656CA7F825ECB795F87FDBEB8E8471A5
-:10FDE000C98AD9BF6237D444FD5F454EA9287FBB7D
-:10FDF000E2CBE67EBF017DE579DA977879E4D81D1C
-:10FE0000774E098181D171054F0F12FC6E4281F14D
-:10FE10009B81744E94D49FF99D568AF6541FCE73DD
-:10FE20007F076FBE9CE3243E03E38271126BA3FC49
-:10FE3000E707D3129F8BBC61F2D7148A7DC3F47697
-:10FE4000CDF8038D7FD421CE5D8E269BA9479C5B88
-:10FE5000BDD3515FF0C788C5276DA2FC687AEC79E5
-:10FE60008D55EF94D9EE50ADCBBB36CAFFAA3DE419
-:10FE7000F4939CCECA37EF71AC02B69FDB9F4FDB89
-:10FE800014BDAF670796A70CA2F8A27CC3D18BE084
-:10FE9000F8BC907FD54AD841FBFBF025BEA334EFD8
-:10FEA0006A0D8C67A81F2DECB8A698EC06111FD21E
-:10FEB0006E1776607B9248AD799D1D382365109D45
-:10FEC000CBDE1C66BED8919F1166BE7776A097C721
-:10FED0006D9F65959BF9FF10790D549DE65BEE32A1
-:10FEE000ED8742752DFB5D51EF23BF4DFCF901C03D
-:10FEF00078A11F9BF19E46DFBFF3395E777E7E9B24
-:10FF0000ABED95FFC2EFF34D7FB0AFF9D357EED015
-:10FF1000187F0ED3B80B4249C071DFFFA45FBFBD8D
-:10FF20005F1BAF677D79A4FFC3651C2FC07EB5152D
-:10FF30002DBF65BEBEC2A2FBA658BAEF65C2F14294
-:10FF4000E76AF1E72DDF009D0D1C9440EFFB35C9FA
-:10FF50006BC4AF29F274E66BA79A24F68768D05673
-:10FF600047705E29897D59F9EA8D150ECA2F0695CD
-:10FF7000F97C533C3FF305494F585E0F2CEF4A2163
-:10FF80003F95E05DB357261F02DFB7D1A2F824DD0D
-:10FF9000B7D1A2EC62BA6F139DA7FB36D1F5E9BECB
-:10FFA0004D7439DDB7892EA7FB36D179BA6F135D51
-:10FFB0009FEEDB44E7E9BE4D747DBA6F139DA7FB4E
-:10FFC00036D1F58F80FFC1F112C175E206826BD385
-:10FFD0001AA74A70C5ED7AAB289BC519E31FDDCB84
-:10FFE00089EE67B967AA6305C2614F8E0CD268BA01
-:10FFF00077B32CA6DFE57215FB0950ED6039E2C737
-:020000021000EC
-:10000000FF313CE522B6933F6F962003F175E986F8
-:1000100038FDA1E5DE3AD2B76F0AC57E5F0E517E8C
-:10002000F7DCAEE7404B0699F1C0BDA137E1F31410
-:10003000D9ADD33E9FDA27EB4E305D00B4CF5B8560
-:100040003FB214063D349EF7D10E218D8E4744F900
-:10005000A98D722890DB793E746AEFAF0EFBB0DE9B
-:10006000D25EB24A74E7CC89DDEF242D76BF7B14D3
-:10007000C6EE778A1EBBDFA9A363F73B1ECE694697
-:10008000ECFE833C9DE1BCBC0F9A77387EC6B45829
-:100090007CB0E03B1AFF27F05563F82E41F83E2C68
-:1000A000D1B9DA3D7BFA685DE15CDD7CAF83F4D7E2
-:1000B0008B85F37D7170FE1CC657B819B830D335E7
-:1000C000B2535F2ADBEBE72081636ADF0AF35EAF9E
-:1000D00038DF31E18AFA0BDB0B51E750F5B2CCFA8D
-:1000E000CC26A267233385F980BEA107EFD73097CE
-:1000F000E86F31F8983F2D8ED36B96BAEF77905E0C
-:1001000013BF4E9A0DF95D2A5B845E13BFDE2EFE8F
-:10011000A842B5B58FE0DB8D0FEBB4CC168B4FFB4F
-:10012000C88F91096D0ED263BAE38333728C5F93EB
-:10013000DC402E06040F610AF05F427DB2A6A35890
-:10014000F8E79D7EE1E787401ACF6314887970A3B2
-:10015000287FFF2825C47E073429D8BF64D963F1DE
-:10016000F084BED2DAB7B05FF92530E1A8CB92AD0A
-:10017000D37F8F56A041FAF5C8CF84FE34DAD51864
-:1001800054B4AEF6F927F9E639B762C67F5EE01CD3
-:1001900092E64F7E8E6BCCF8BB092DA35EA17CC787
-:1001A000B9E4CE57FBD07E8DDFF9FB0C4ADF92B469
-:1001B000C7EEC0F1AF96045EC4DB95C11DE334DA2F
-:1001C000FFCB242FFB2BA682BFAFB047423CAF89A9
-:1001D0002E1FEBB5369761E7F328D37F09109E4AAF
-:1001E0007AFA32DDC1F358AB7E3095FC31CBC1F4E5
-:1001F000C734C7EE5F177B28CE0EAAC2FDA77EE3E9
-:10020000ED9E047814170F102BEF17145AF7CA45F8
-:10021000BC8A06E2FE77A5E947AA746DF4887338B4
-:1002200094737DA18BDDA410E0C7F07985BD90EDBE
-:1002300062B407F8BC5F73248AD7033593CFD56FB8
-:1002400074CF64BE7C637D17BF0EE3F5E2860BAC12
-:10025000CBD413C6D3379CFFE1419A90FBC9D3F7A7
-:100260001A545CD6D63F5A9FAD7188FBB9E0CF884F
-:10027000B9B730B8509C7B97997A53A5CB8453611A
-:10028000A08EF4E30EBDA98BBDF8F5EEC958F12E92
-:1002900008AFA242C6E306CF9ACCCEF31D6B1D9FDA
-:1002A0008C687BBC15E125A74C76117F5CD1CF37DC
-:1002B0008CEAF73B103E4C74036E8DF5F593CDC779
-:1002C000F6CB799DEB423C7B701CADA35956C5BD66
-:1002D000F940DD38ECB7BD54E05DF7F6AF8027CECE
-:1002E000EBB2C2ACAEF3B2E2ECA7C845A9E128BDBF
-:1002F0003DC3845FFB10EF146A57F6C7BE1E9AAF6A
-:100300003DAF714F6FD28B6F157A31EE2BFB41648D
-:100310003B48A4974E91CFDE42F95339A092FD9904
-:10032000D923207B48CF5B00EC2702DDAF13AAC89E
-:10033000FD8AD84ECEBE15ED27ECF7DD5537A6D198
-:10034000FDFEEC944569F96E8A6FC2A90EC0BC64CB
-:10035000F38AFBD9CFBCF76F65543E8FFDD2D73BF4
-:10036000C53973EE0FFEB69CE900B474E7181ACFD6
-:10037000C7EF0B44D2649E5FF9B59F0D27FDAAF726
-:1003800059F730D2CF7AD1392F8274A8491F9755A7
-:100390004486FBDD9D70CACC4F6CBF649BF03898DF
-:1003A0007C72369D8758F7301EEAF1069F879F348E
-:1003B000CF4FF28C69A984E707075AE75AAD59E491
-:1003C000B2AA4E3252E7D03CDF94F97EC567AA91BB
-:1003D0009A86E527C1CBFA63A0CDCEE744ABEEAE5B
-:1003E000E899EEEE3E6E7F4DA1B06FAAE2E2A2AABE
-:1003F0009456079D6755FD9371514D6871273A0FCB
-:10040000B3D65F9DA68032145309BCE7ABF7E23F39
-:10041000E48470DC629677777FE3E7E6FAACFB1959
-:10042000D5743F033FAD7ABEBC279CC70EAD3E33AB
-:100430002EE61E04D96BB4BEEA3313F97BC55D27E3
-:100440001C84DFD40F3D8560DDCFE80ECED985C298
-:10045000DEA8A67B0D19D1DF051D77F69FC9E54FF4
-:100460009A707B72AF6DDAE604F37CBD50D8DD4341
-:10047000B214F6175CDA0AC6A604E35AF5ACF70D17
-:10048000BA9B57D3A4F07C9A37C505271A6FA709E2
-:10049000476BBE4DE9E1255E71CE3A90DE2FE8C88C
-:1004A000AB91FE5747F1D3B3A67FA0E93BE1FEFC39
-:1004B0005EC615C28EED6E9FE7F4F3A5137F18A9F3
-:1004C000B4DEFA4A269B5D407EB49EF35A6D242723
-:1004D0003BF84F37FBDD096739E61E4C57383BB810
-:1004E000BCE3FE19181E299BE410B03EF0D01F4B50
-:1004F0001C0E1CFF980D22C477A6C87DA7BE4079AC
-:10050000B41F882E8FB1ECC07483CCF7998E3D9ABE
-:10051000EF20BB6C49394464E45BC7DEEA5F477196
-:1005200097DA02D424C7A1BAB336F6FCB1128C3DD7
-:1005300029D8EEC603DED456CC2FBA27568E1D7BA3
-:10054000EBC70EB207A4856E3FC515E13CA7BE8080
-:10055000F9C5CD0EBE9FB5E4FEF8FE62F5E06C5322
-:10056000DEC6EBC39F179AFAF048184972E685DA9F
-:1005700066F17E8E791F11F53F23119E587A7028FF
-:1005800079D2DF99EF43A34C7C699C92B8FE92220A
-:10059000B10F2B1F3BEDF068DDD3D971E42705388F
-:1005A000FE895A95D3ACC1866B30F63F60B02F659B
-:1005B00030B697B548FF4FD8CF29CE4111DF385F0D
-:1005C00043F7D448DECE157A8253BEB992F5D13EB8
-:1005D000A006597FF1FBD99F6E43FD248DE2376E53
-:1005E000913DEC6F10EF078DF968511AAD37F3BFED
-:1005F000E73C4D70A53B0E40EFB0941BA5C4DFD780
-:10060000CF70F379FF265B80FBA140ADBB109EA1AC
-:1006100027C7EC26F77941E3BD93C8EE535B76B567
-:1006200092BD526FFB740FC525D44F043DC8D00E48
-:10063000F138352D339EA6F6FD67BA75BA5FBA3E1E
-:10064000D72855A3FAD720F21EE99927AB6CEC37CF
-:100650003DD5FC0B3EAF42FB2E42CAF7A9AA3CF6A1
-:100660009B59713F7CF697C06F7802E51B44DDE72C
-:100670005ED1B4C946FAF8A5B451517155D6BCAA99
-:10068000EE6CCDBE8EE4EE130ACBD1CCDF5CC1F1B3
-:1006900003B98A26113CAF9354A18F9A7AF2B560C0
-:1006A000FD35BC42FAE942D293110F3F94421CAF90
-:1006B00069839667A9FDDC1CA10F82D63882FCD71E
-:1006C000E12AF37DA2E5F634D26FAC7382EEF0A19D
-:1006D0003B3F0FF6B4E41D1CF7A404EC6FAAB14530
-:1006E000FAD3FC8EDB13CBD779834D3E30D01F621B
-:1006F000799E0EEA6334AF025F2ED165B54D5BC9BA
-:100700007EAF7D5E8E0F6997D4F498775ED4865F56
-:1007100093DE5D6353857D73C028A5F398F6194574
-:10072000FCEECB497BB83FF311E47B149775EB13D8
-:100730004D3315845B756FD4BB30BFF9895D3315BC
-:100740007A87272FBCC486F95707FF45940F091FE6
-:10075000A6FC1F9FF848940F0B2FA1FD39F9C4691F
-:100760009127030C11EC6F4FFCEFCC00AEEBB8E916
-:10077000FF043D3C9FE659FDC2205BB47FF1C86099
-:10078000C1378F27897AC773E186AB49FF280CF3FD
-:100790007D18ABDE6B83CDFB0426FEDFF462522BAB
-:1007A000C5095BED202771FF41B3DD4DE67B59485C
-:1007B0007FBFA27A2FE768E9BCCF479147115C9EC3
-:1007C0001FCCE73D370D4EE7FA049FF4A2AEE32DB0
-:1007D00023394F72C01E7BFFADC1DC2F2812FD579D
-:1007E000F756D3683FB2D3859D811B927617BF63BE
-:1007F000B0C9D4ABC4FE64CA6A695065B9339CEC15
-:10080000E697CFF62D65BBB9A29BFB9E83851CBBEB
-:100810002928C689F4D2D4CD7CEF1C0C8A4779B93B
-:10082000396973F47B29274DF81E199C26E0D7B14E
-:100830000F3D251E2768C2A52FC2BBB8137FACF69B
-:10084000175AF7F67FD1BABBEC5399989FB51E8023
-:100850007B051C707E69A8E71F5F63B61B6DCD43E7
-:10086000637AB8E9C5DB3708FEA7A5B3DD0E3F11F3
-:10087000707059E316F1F9E40A530F96036F38C804
-:10088000DE5851DFC6EFAFAD6814EF6D75D29DB184
-:100890002A9ACE32F3C53A33652333C8F488EB6322
-:1008A0007A34CC788358FCE980773C1D77E94F4B4C
-:1008B0008FED4FE3FEBADB87B08917DFD83E041314
-:1008C000C3B383BFC4C1AF831E73CD76458867654C
-:1008D0005DE9F18FDDD171EED71CCFBC77B2E27646
-:1008E000335E558BC5E3154DB9B685459DF5EF6E65
-:1008F000BCD71B1D4FEB6A5A1020F957D352CE714B
-:10090000B52B9EDBFAEB00B65FB6FD010F05531F5A
-:10091000531AB2492FAE7A6C9DC7A0731625E021F9
-:10092000BE792C244F4B747F75D41029461FABA67B
-:100930007F62FFC79FFC5BDDBFE1FCBF9050BF4201
-:10094000785737FDB58EECB73D862B4272FBA81267
-:100950009E4A72F4A6056E3FBD2F58D31CAB4F2D97
-:10096000FBE503D91A077707FAD8589F6AED43EDDC
-:10097000AA1FB5EB64BF57EF93751C066A20524758
-:10098000F38B6F5FD3F8A183E0AAA23ED8775CD740
-:1009900072E4248CF7354D3FFA54F6507AEC1D285A
-:1009A000A1FEA2FC1108F7CA6EF4B2C221B1F7028F
-:1009B0002CF840288BF59BE0130F95BC8FF33AF190
-:1009C000E86B1EA9285A5EDE29CEA91A6FFCF90B26
-:1009D0005AF772F524E907CEAE7A80D62C0925BBEA
-:1009E00045A455F6560FF905AA36D9F5007EAEDABC
-:1009F000FA8BC7E95C05DE76EA74F458B5F5B48382
-:100A0000DE3FAB928C88C47A1678A4919DFBB47CAF
-:100A1000EB47C25FD54B86E9B84FCB7EF5B9A86FDF
-:100A2000402409EB2F7FFA7DF66F55F9DC7E578263
-:100A30007DAA68DCE508BB13EC53E3FB53490F0ABE
-:100A40003EF125EFC3B19D12F4CCEDDABE72D3476F
-:100A50000EA29B13B8211969025E649FD634CA0B9B
-:100A60001CA989F6ADF52AD2FFB09CFD2017DA3F0C
-:100A7000D7101074F1DCD66D640F54BEE3D4A7D345
-:100A8000B8DB6EF100EEFF11C52FF0FD67EBB20D84
-:100A90001CB7D21EC8563915DF2B1FB995F170E966
-:100AA0009BB766B35E07462FDB685E6F2F5AE7E29F
-:100AB0008DB3789D4BC0C77858F933E1CFF85C818E
-:100AC0006989EE1B6F1F22E487136E2E21FAF81C32
-:100AD0007B223FCC11078878DEB7C43B644EB83A1E
-:100AE00035FA9DB93B8708391080D07BF4FE640D40
-:100AF000DAC5C417E4373F9F4AFDACCA55FC4E9592
-:100B0000D71F30E1259D13F11C9A62C59DE6E17E59
-:100B1000BD39A527D9C14E38E5B8BE8CDF69D0C82C
-:100B2000FF1BD58EE17664B33359423BFF4876E232
-:100B30007B84EF99EBC0BFB7200A9F6AB61C617C2B
-:100B400002B4BB527344FE61A243B48B52116E9F38
-:100B5000EDFBD0D19BFC1D99361840F36DFB88F35B
-:100B6000A0676954DFEABFA6D919F32E49CDA31FA8
-:100B7000C5D1B333EEBD133FC3B3065235D2378F61
-:100B80003822535FA471705C8AD75C72BF33E6BDB4
-:100B9000B04E7C71747ECFEDA44FCBBE5A6AD27F2B
-:100BA000FCFAE3F9C19371FC0036667DA5F79FAAB4
-:100BB000ECA1C7093E5548AF01A657417FA8A347FE
-:100BC00006203D7CFCD44BFBBF4F7EBA467BE674CF
-:100BD0001E2D96CF563E83F44BFE348477924E7C86
-:100BE000F64B07E9BD39156807E3BC3F76EB74297E
-:100BF000AD2BDDE2F78474EB063ED7FABFC55F97F5
-:100C000076C35FF7C5C1F373284AA53B0CC79F5C49
-:100C10007E09FB15E2E06BD9BBF17CB37A88C67024
-:100C20008EE79BF8B71FA2E0B8ECBF3F61BCFDA206
-:100C3000973807AB7EF4AF2CBF10AC1127E26D756F
-:100C4000E853CEAF23F9C5F95D33E9BCBAEBBA631B
-:100C5000E1195FBEC1E4471DF7DCEE8400C5DD4548
-:100C600076C8FC0E433BCEA58EF4F3A772F99C70B8
-:100C70009DA9EFB7AB110FE9E7EBD2AC3CDC40EF3D
-:100C8000C1B4074AD400B54F32E30FBC114F5A9498
-:100C90009EF47E8BEC21BD2E1C826989DF050CF24F
-:100CA0003CC2D05DF91A715F4B3EBB2D6CDAF54E3C
-:100CB0001C2FBCE6CB6D746E7E4871F1B9E5A23590
-:100CC000733C7CFFAF25FF3F092F16BF8A70247A43
-:100CD0000A188E5E08E71B0508D0FC08F079B09C66
-:100CE00052B6E745ACB704014CE724F1FE9465E049
-:100CF0004D6DCDEDEA374139E820F9BF14E511FB20
-:100D0000BD37C6962F6BF998F16C591C9EF908CF28
-:100D10007A75C5B3DC4B4DFF4A29949AE7BA6CCF7C
-:100D2000B7EF95F93CFF940B58DFA0735EDC3138C8
-:100D3000D522F3FE9C7A4A0A71BC61204BBCDF8A43
-:100D4000F84E7A968587F1F67D7C7AE2D97747D29C
-:100D50003DB1AA5FFFA5E4BF303DF1EBB707BE4848
-:100D6000F9E7FEDCFF2FD0B57EC5CEBFB21DD3BEE6
-:100D7000D3C9FED0F69DBFED4F72B9FD05A74EF861
-:100D8000DB7EA753C435EC4CE177CCDAFB09BF5DC1
-:100D900070C7972561965B6B791FA75FEAE0FD3E00
-:100DA000D5F2379623A75A9C1AADA366670FF68F24
-:100DB000D5BC901422FF40FB8E2F4746BF77F5CF5E
-:100DC000AEA7DABC4FD39E0273296EA63D4DC4591F
-:100DD000D6BC38E6176BC81E69DAE520FF7FC56F01
-:100DE000FE5E427CA9FD995D0EE25B68973E02883B
-:100DF0001F732EFDE903F65E745F0CD8DE3E7DE9BD
-:100E00003BB3E87DACAE701170684738D0BA102E95
-:100E100095A49775078FEA6F2D3C3E657BA2AA6566
-:100E200014D351275C24437C4F09B9245AFFF31E85
-:100E3000F21BB5E7A1FCD769DD5F9690FE74A17542
-:100E4000FFC7A5E27DEEFFE7D76D838B5AF753DF2F
-:100E5000DA750BFC1F76A926DEA78AA383AE78FE7F
-:100E6000DC0F38BF2D45E7F97E45FA7FFD5BBBFE01
-:100E7000AFBCEF25E4B7BDD87DFFF85BBBEE0BED53
-:100E8000FBABE6BEA7A874BFAE7DC7DFFBF37ABF9E
-:100E9000E2BA938BBEADFCEDFCEBEED08F64AF8B72
-:100EA0009ED8BA075ADB344CD775A3A78C2AB2FC5C
-:100EB00010C21E914D7D631D0C3336915D857A06FF
-:100EC000D901EB3245BE1EF50799EF0F72B00AD477
-:100ED000F7D5C5BBB68A1F54CCDBFF7C23C7B3ACA8
-:100EE000CBFE0EE495D17985F06304D7E8BE5DD8DA
-:100EF0003E9866D3823A3D57B5D2B709CBD5DEB21C
-:100F00004AF6CD3AED6A57F43B168ADB1163A7B86F
-:100F1000E3EC8DE402478C5D9204BB55F2C327E9F4
-:100F20000AC7FF3921AA3DD6CF2A12EFF42743285A
-:100F3000A0BA2F1E4E8BBE3E9C5C7CAF5235E104A6
-:100F40008641EB766A0AEB610AA0FD28D621EC4EB9
-:100F500084A316054730ED50C504B9A20D6338A22D
-:100F600001A14D1A4D70F5331C83BD6495E1DAD9AA
-:100F70001FAF3B7E1FD6699320CFD4C725FD9B872B
-:100F8000F3D822111F100F672BCDF795AF21FD77F6
-:100F9000D51A71CEF5CCEFBEC3F9263BEAC374CFA8
-:100FA00030D5B7A288FC8E5E43223A5D3543BC2F14
-:100FB0005846F7C032C9D41771B899AEBEA0B0BFB9
-:100FC00012ED0CF657AA40F69F3C091AD91FE855B6
-:100FD000E2E27A558E7B0ADE2CE29EA01034F14EBE
-:100FE0004B6CFC4F601214525CC314B9AA81E675B5
-:100FF0000A521A28EED2616FEDCFFEE17E008F918A
-:10100000BFA5FC8B8D549E8B7A3DD07D32A5F53DDE
-:101010008A6FB84D4E058EAB8AE0A728B85D76C6BC
-:10102000054A149CCB212D267FA2DFE126B213F2C4
-:10103000024E9582C72A5CBD62DA9FE87586C70BAF
-:101040003A5D2AD94753D4DC98F6B267EF7B64D770
-:10105000BC916E63BBE0F29CC131EDAFFAE0C4C657
-:101060000526CED23ABEF7AEB8A78AF6D623AF632E
-:10107000BB37EF0720BFF1155A694CBB66D3BF12CF
-:101080009962E7F766AE2C1C13336E737837C3A5ED
-:101090002A0B243A0FAEB2214960BDEFEAE531F5E3
-:1010A000BE37FA8A987E67183362F255ABBF0025C7
-:1010B0000360DCEAB340EF0796B636C6B41FBEB78E
-:1010C00039A6BEE7753485302DDDA705291D75507D
-:1010D000DC231D8EFB41E71BCDE1853AC5EB14D324
-:1010E00005D0323A16F0565018F2C8A3FE9728BD24
-:1010F00050FC3298EFB2269BE7AFEB6DA1C605B965
-:1011000014FFD3F0E35D12C743EE263C1D1D69A812
-:1011100048C5EA63CF34BE446953DBF87A7AC7B373
-:101120000AA08DE5AFDBC6E70253E4961289ED9F76
-:101130001EC39D51E72EDDBDD7F9A3D2F27D4548F0
-:10114000476B738C865DC4F727BD3B5FCEEB5A0FB0
-:101150005425128DE73F2AF51EA6384D2B4E2AB98D
-:101160004216BF4771B98893A9B3E94926F362FDD6
-:10117000409D6AE738FE65C582BF8D6CDBDCE82EDA
-:1011800023BBD3A5D1BE2667C4DEF3BE71B4B8B706
-:10119000F7459179BEA2A859D7931FBC3845B4270B
-:1011A0001F1F8D37DDC6FA94E780BEC78EF9FB0A94
-:1011B000F7A9C4CE9AA67F10E0F74D0FB44D903436
-:1011C000809EF794DAC80E87BD76FE7D99A6C2C9C7
-:1011D000A70BA87CFA5B1CC3B86BC22F0B49BEAD32
-:1011E0001C3CE4BCEF8C7ACE48A045C5412C2BD6E4
-:1011F000783E1E25CCEF1279CE285CEE99A7DBFA5B
-:10120000478DB77282D0FF560E4EDE4A78EB3960BA
-:1012100088B8A842B73680E9239CC37C4209E75CC2
-:101220009F22E2ABB4F3BCF37F7CCB88349263198A
-:10123000E57A1AF94133B6CA1DF7CE683D3FA6FFDD
-:10124000D0C13AACDF3F19E7B58562D744792BF2BC
-:101250002458EFB0CA9125613E43B2CAD7CF9E5CF5
-:10126000C4EF31C6D41F9AD751DF70E574F6AF15BD
-:10127000AFDFBFB688E037CA467125EB7F67E777F7
-:1012800006709DAC4FAC447A06E97CF0EC710178B5
-:101290007AB8FC90A4C5BD9FDB5A4CF982BEBE4112
-:1012A000C558FF92B3A9FC0EC067F5492CFF2E3933
-:1012B000FB3D7EAFB3C961F4BF9DFD37491C6F365E
-:1012C000E3E68F37AC26BABEEA7821C52858EF5737
-:1012D000D6A85F303FB0E2EC3AE187F88B78FF6345
-:1012E0005B679EF883A7139E06BDCFB53E0ABEF48A
-:1012F0009B2F334C78FA8A37CE5E8BFD6B8BA6E53D
-:10130000105D9E0637C7F59D561F9F4DF33DBDC529
-:10131000CE41B44D26BF0C149AEF11648673E85E7B
-:101320007EF19B368E473A88F860203EE4B7BE993E
-:101330005E4CED3295748A6F383DFECFFC6EC2E98B
-:101340001F0207172F0B3B185E4D998B2ACA19FFF6
-:10135000B574F23F58F06D34FB79B8D4B8B298FD4B
-:101360005CE67D1163EC45BD3FB96BC2977C2EB046
-:101370003617F5FC340A393E5347EF4BAECCB5B3C4
-:101380005C5A99F6C5D44CC2F7725784DE81A859CD
-:10139000FD19C317BBC98DBE07A69C91418B8ADF7F
-:1013A000D2868AFD571483F75F39E3E0F2AAD5A706
-:1013B000996F5BED4F98E7ABF42E23DD17AAFA8700
-:1013C000CCF746911FD64BC328DDED5819C54FA069
-:1013D000F1D30E3E3F14F7EABEE96F25939F728664
-:1013E000A4CEA2F9B56C3B339BE2056624A9B328D1
-:1013F000DEA06EDBFBB329BE60463F7516C517DC69
-:10140000573C790E97F7521FB0A1FC7AB964BEC859
-:10141000E7AA7FA2FC535BEF98C3F553C4BEDFB6C7
-:1014200075CE9C00F36337D3C1A9FA1E21E779E892
-:1014300060E9EA1721FA3DDB2EE5E6EF49C15CC120
-:10144000F73EB9BB0FBFDB09056D1C2FB6BE58F8C0
-:10145000FB3BCF5741A5F3D5CC7C30C8DF9CF95C72
-:1014600092F85DA2436DFD097E4736DEF203F2A7D6
-:10147000AE9080DFD1AF026D24D1D5425BF83D4AFA
-:101480005F1CEEBBB798F5A9368E775DBA7A27CF89
-:10149000EF53DD8C5B562345DEAFF54E04F69FF02F
-:1014A0009D88D838E30F6CDA40EA5731E1B2506ECC
-:1014B0009BEF10F37A94E6B5227D17C7392B6A5B50
-:1014C000B64FE851856C3FE524F37BD175BDDF292C
-:1014D00049F43B088DB528EF91E49EA96DE674F5BB
-:1014E00050607CEBA9841D3AF6537D40C89D916DF8
-:1014F0001F38A2E319779BF04D357FEF2A3E1E7708
-:1015000037C9A5A8B88315BD5BFB927E68ED6BE774
-:10151000BEB4F635F70568BE99192F3D45EF9D50CD
-:101520009CEB0FE93CE3B9A456F25B778F27D63EDC
-:10153000887937250BBE11793689F5A6F8751C34E4
-:10154000E76DAD2762CADFEED61131E5EBBF6A1D4C
-:101550001193BFC7AFC7A26FEBBB45DF5DDB8BF954
-:101560005F3CDE897B6D17C23B8BFF5483AF50DC41
-:101570009716FCC682B7354F0B6E4DDDC4E32AAB20
-:101580009F8F598FD236898C1E482D11EF5F298D80
-:101590005700ED87B2BA85EB75B71E39E5333EC704
-:1015A00059A6819FF4DEF875554123B7EBBAAE0812
-:1015B000F3E3159AE0C75DE3F823CC9FABD13E235C
-:1015C0007DDC5A77079FC6F5137D4F4086C37C9319
-:1015D000EE124A645FF862F4E372BA31117D6EE58F
-:1015E000BA39263F45BD3DA6FEE5396B62CAAFD08C
-:1015F000EE8E29BFB2F0DE98FC77F59FC6E9F79B27
-:10160000E2F4FB2762CAC787DB58FF7EA3761AC7BE
-:10161000A74F3C1A613DBCB556E5FCEEDA1C4E5FA7
-:10162000AED598FEF7D41672BAB756E7EFBFAB1D2A
-:10163000CDE9EBB506A76DB55E4EE3F946595BB84B
-:101640008CFCFBA33353F93C6AE350DFF525140708
-:10165000B92F5244F837F640E34B240AF2439FBEB9
-:1016600047F54EAB0E8E475CBB6BCC1F6EC17CC684
-:10167000EB322469E7D38B6430A2F0C7333D0C749E
-:10168000FEED01F13E567CFD8525424F9E0B61F13A
-:101690009EC06A3E0187B92EF5152393C54684EC9A
-:1016A000F6B9E0673DD4B65ABC5333177428237B90
-:1016B000D607FE7B381E29F67D01AF3163DDAFB062
-:1016C0007C36DD3BC5F6DF7737F2BDF267F6A64F15
-:1016D0002EC5EFD77A25FE9D8F033BEFBAD5C5F611
-:1016E000AF75FFF41DDBC5E8130B4B047DB54B7ADA
-:1016F0001BCD379026DE2F8A6F37CA5CE755C108AD
-:10170000EB1F11D43F28DECCA2CB19EA2173FD9A3E
-:101710002D750CD1C71ABEDF50D5A6E94184F798C4
-:1017200043822E46205DD0BE8D3D2AE86024D20142
-:10173000CB41D33EB4E800EDA997A8FDA983A03B17
-:10174000B17DDDC41FC9647F8DF92C14A4F4B2B33C
-:10175000915DE7B07C5C9BF8DDA40BD993965EDAD3
-:10176000523B97F16867AD8FD3D6DA4A133FFD9CA1
-:101770007FB97635E7F7D40638DD5B5B6FE2670348
-:1017800097BF5EBB81F36FD4864C3CDDC2DF3592E0
-:1017900067089FBB4B4C39ED2A37ED0A917A8D359E
-:1017A00076BEE78F9F889FCCA5B9127E544A21E26E
-:1017B000DF75E9013BE5EB92690F68D601AE7F9DCD
-:1017C0001B5A490E54E5BC28F4B0383C29CFBC86DE
-:1017D000F164A619C77A20BDEE5607E2C389C6FB9D
-:1017E000ECB1EF8D5E1C5E2C73AFE57B7DF17CF17F
-:1017F000267A8F42EECA0F0174BDAC4CDCEFA238E2
-:10180000BDAFCAEF555B9B795F4CDC7FA9EEEBE681
-:1018100038DB7F9D9C514D39030BA87E87FD9D7C55
-:10182000703EBD8FD7052E71F6F7E141627F2DFB2B
-:101830001BF54CF64BB58764B6BF2A731B3C6C7F17
-:101840008F8E78683F6FDA2103EB8B8A38EF5D4A21
-:101850001D6914D7D3BA7F1CCB99557B882F2D33A4
-:10186000CF7BE3CF6DABE9BC574A04EF30C7D52F30
-:1018700037CF7BE3D75D3DFE089FF7565FE05EE91B
-:101880007B25B1BFE7137F7FB73B7CA17882E8F768
-:101890005C4F9EAD653BEDC8B63B1E0AF4FDD7ED2F
-:1018A000DFADA5DECF4A441C35DF9BB3F6B3CEFCDB
-:1018B0005DCEBA492EBEC7D03E42E5F76FDA25F1BC
-:1018C000FE4EFB5F415FA3D1FB3AEACB24172ED338
-:1018D0001DCC574787C57B01E3E95E6282F702268C
-:1018E0001C0A0553A8DDC100FBA3C6ECF305E9DE25
-:1018F000EDA8D70D99C8ABF465AF4C7860C9274BFC
-:101900005E75D295796F8E6232F2BF3AFD698B4671
-:10191000E7907ED761B7BAA7F23B45A75B81A349A1
-:101920002DBFD8F083864CF712461CF20549DED64F
-:101930009976E6A813013915BF4FF8CCCF76D018A9
-:10194000B453E552718FDA8882AFE5D7B2F89CC5FF
-:10195000D7AC7B7BAAC3B785FCCFF04212BFFF1286
-:101960003FEF41436DD67BD6838612DF33EFE94DDF
-:1019700091CFEE3A4776419B8817B8E46CFBE3645D
-:10198000F7AC7AB607DF53BB907D50A39E4EA89F5D
-:101990005A698D4D9CA30CABD08693BD497A2BD947
-:1019A000A1965D1A5FBFAC74D2D8A15934AFF16D66
-:1019B00006E1B76A3B2F7ED7ACFEF4BC76A1357E3C
-:1019C000CD8E11EAC228BFD5EAA19219C7F2F5DE81
-:1019D000A19E10991B23C7BEED7A1FD26119E11792
-:1019E000D98624A7BE4F3B80EBB80E5A595FB9DEAB
-:1019F000FC1D8B1B001CD1F7646F0483F9C39F741B
-:101A00005F0DE1CD6288CCA77C8D14A97A1141F8D5
-:101A1000C9C4716AAED6555E5FAC7C4E36EFC1C6A6
-:101A2000C3FD4E136F2DFEDFEDFEC4F1FFF65295A0
-:101A3000EF41B73F3BCE46E738EDBF97F9FD54ACD9
-:101A4000C87C25384CDC3B1D3ECF7C8704F9CA009E
-:101A5000BD2B5F393D7ECE64F61FD1C106C59F2ADE
-:101A60007AE1F551F7CD82E6EFBA6CC194E22553E5
-:101A7000E78595E8F3B39F9AF32FBF7632903D74D4
-:101A8000952AECCE292EC84C225E78F674D12C64AF
-:101A90001057913E3B9CDF617F98E0DCF10E08F12E
-:101AA000A34B70DFDE17E77C7093C4FED2E626916D
-:101AB0002F5E9CC6EBFAAAFB883DF728C1F52F6E76
-:101AC0005286117D0F4D8FE4115D168F793B5DC2FB
-:101AD000799598F7B170DAF510F5FB56EF9AEBF8B7
-:101AE0007CA8B18DE63734BD6DFD7DA45F3E6B03F0
-:101AF000F21B1E1973FB128892CB9ED249BFA27AA9
-:101B0000DB25F39DBA1DE2F70CB04576B47FEB4FB1
-:101B10007AC5F354AFD5F433C0AAE7F91EFF0C55CC
-:101B2000EC014CCE327F4F32D23FD1EF0B59E75907
-:101B3000430996C2FFC8EF8A6D37FD936F0EFD60B3
-:101B40000EF917A1359247F3389224EE517B4A7D66
-:101B5000BF233E3394FCBCB48E9F09FFC091343F39
-:101B6000DF23791BF9339D1FFFA5D6C5E9BB681F8D
-:101B700051FA3F681F51FA3EDA47947E88F611A564
-:101B80008BCF60A7B87F3374E36DE6AFDDACA37B8A
-:101B9000FE1230F5FBC4BFD3F49609FF92A643773B
-:101BA000F6203C6896393EBAF85985F5D3932DA3B3
-:101BB000627E9714E9F530ADAFA4F98F3FA17BD6D3
-:101BC000254D8A2A69742FFB7436C71FC6CD8FE056
-:101BD00040E70D911D0EF17B4AE67CB7A7B5ADA796
-:101BE000F6DB9FCDA319D2398EC0C31DCE84BF377B
-:101BF0006CC5DB3D3154E85FDF7346CAA2CF1FE3FB
-:101C0000E3D3D80F3C86F0B9E00F344E60AF0C033D
-:101C1000182F63FD1BFD74710FC14A8B7738384E46
-:101C200079FB8EFD575F89FDFD1F8FB61B3100804C
-:101C3000000000001F8B080000000000000BCD7D9D
-:101C40000B7854D5B5F09A39F34A32934CC2000957
-:101C5000123809AF00018664121212E024048A8A45
-:101C60007482D482A28EB462541E23D29ADED23FF2
-:101C700027244012830605CA558401C1C7FDFCAE66
-:101C8000D102175BF44E50A9F6B73422E2A354C731
-:101C900047552C4A8A62EBAD2DFF5A6B9F939933BF
-:101CA0004C0222FC97F0E9CE3E7B9FFD58EFC73EE9
-:101CB0003BB3265E5E24C900A7E9670A80CBDB1729
-:101CC000A008604CE9D70FDCEFC1F2599BDB0400A0
-:101CD000F360DB3437F6BBCED1F1A21BEBD7BBDF11
-:101CE0009B968EF51B334D07A8BC49CE999E812546
-:101CF0004088DFFF515EC5810CACCDF456DB024E4F
-:101D0000800A9000F2807F4EE37F531D29008E6889
-:101D10007D9ABB8FA1FEBDCCCB0CFD2F978718DA27
-:101D2000AFCC1B6D68D7E79DE92D34F41B97D19597
-:101D30001B74D23EBEBAA71CF70326080FA37DED85
-:101D4000FEF2EDDBB19C35719E8FF67F0CDAAE1999
-:101D50008D1BFDA4A479E3FDF4B245B165F503B88C
-:101D6000857EC7F6E3103E5286ED926BF9813BF11A
-:101D7000BDDB322590BC00359BADEF4762D6B10488
-:101D8000FC6961EC77DB0EE37380882DEC03B83DD2
-:101D9000E00CB62000173D81ED0E433B8FBB78AFC2
-:101DA000CD4DED4BC0126DCF01A83D9AF3E40B3140
-:101DB000E38DCBE8BCEF7E1C6FDC9E39EE065CDF6A
-:101DC00093A55F0F90719FE55E97E723040D4C800C
-:101DD00009A711E42039CD80FD4EBD2485245CD7B0
-:101DE00034E99BD4483E3EAF423C67E17B26F90F85
-:101DF00065D8AEBE2CC14E1CE76F75F2932F5869A3
-:101E00007CB8D19F1FA50B80950C5FBD7CAB0E7F6E
-:101E10001D01F0C73A07977FAA7373F96E5D269785
-:101E2000EFD5C95C7E5097C7E5AC431068C7F1FE9B
-:101E3000FCF7F1007D681C15A06FB41C67F39A07CE
-:101E4000E03ABA7E2F85B6E37EBF289F9006B4CED7
-:101E50006F70FE620D0F4802D5448CA5F8DF8FB776
-:101E6000BD98E5E3E7AA0BA75AF27709141C77B9E6
-:101E7000D724C65DD4F1629627DA0ECBDF33F48720
-:101E800015A603867A638EB1DE5A7120F67D1D0E8B
-:101E9000F1E52D9BEFB0055C58AE372921E799EDB0
-:101EA000FA7AA6ED4F524C389E659F3D64C7FD2DD2
-:101EB000712BA0607F0B80D29E7FE67B00F50CE744
-:101EC000791204DB138C5B47E312BDEF4F02E93C50
-:101ED000C67D0B6983D6A3FE973DB413DF7B2B4DE4
-:101EE000017FCC3C2DDAF89FA5B7FDE22BECF7D9AA
-:101EF00033404FB00E73693D63777D6C3663392E86
-:101F000059D0C95877C49C81E5899A7F6C3CE261BD
-:101F100032F59B26637B6ED71107A2FCBEF6AB366B
-:101F200039106F6F9BCD00034020BE04FBE31854B3
-:101F30007FD07BD5DC46FCFDCAFD4961F379ECE737
-:101F400041E445A6A34AC1EF3710DD88791440511A
-:101F5000B37415E8F32A241F68FF547FADDDFFE654
-:101F60007AA233E8DA48F2E13840B885D7AFA4C6A0
-:101F7000F2FFD2677FC2FCB9280BF99E04E066C16C
-:101F8000BF0EFC773A97F83534DD89EBBD358CFC14
-:101F90000F179FFF9FF13AA37C3E22219F1FBA1289
-:101FA000EB4B9F91BC766C3EB96F98E0278DEF7537
-:101FB0003ED7E1B87493C47CA9D73FDF27CD08256D
-:101FC00080F7368D2E86285DB369BE65CF5AA00591
-:101FD000D7B76CD288FEB1E3C7BFB7B44902396640
-:101FE000FC279FB3D710BFC8D0D5AF1AF967DCB3B1
-:101FF000A7322AF24559CFF868D3E44DD720FF180D
-:1020000094D726FF9F7E8EF301E27127C2A7327319
-:102010006E36CD3FDB094ACB7806CB1C07CA89ABAD
-:102020000588E0EA92EBB201E1B919D12521DDCDB5
-:1020300051AA5FBF0EF1F80373E02A92F3C7BC43C5
-:1020400078FC6B5CCBAD606672CD36E17873E7D817
-:102050000B693FB31A045DBF9EDE759C9EBF3E298F
-:10206000C5D480EFBD6E8246C888EEE375AB3F9B5A
-:10207000E80D37EEFE08F163524649A7537A9617EA
-:1020800044C91FE97894A2F26F9AE454699E936E52
-:1020900033D3BD25ABD546EBBA154207149C7789DF
-:1020A000376C23F9773BB82D5462D1D54D1F447F4F
-:1020B000E5FFE8388DEF2FE9944226ECDF5ED70E7E
-:1020C00016C4EFD3757BB91CFCCDE0C6CB101ECB7C
-:1020D000C7DBBC2DA4B734FA32AB26389D405F9DD8
-:1020E000499F96683BAEBBC2E10C4BA9F4D87A3C41
-:1020F000761D8DD94ACA78DC8FBAA63C9DE99368D3
-:102100006170749FE36C004E92F33B5358CE1F7B7B
-:10211000AED84C783AF63B6BC844F52D23DEB8D3E5
-:10212000C7752079732CC36BB6517B466E48C5F6D4
-:102130005BCCA0925C86ED426E3D3FE9AE77488E67
-:102140002DDFE932D94D828E653401A447D7BEF325
-:10215000EF38CEADC8AC766F546F2C9AF2E8C62734
-:10216000900E1699DBEE29C767A7203CD68DF0FCB0
-:102170008BA97D38E9ED8F1FB287CDF4DEC323B77D
-:102180004B38FECBA98191B41FC854FAE7E0F39A0B
-:10219000437DA105DF9FFAE83F0F92DEBCF5C9BE83
-:1021A000CC5F3ADD4F233EC4F59C403EA4F59CDC59
-:1021B0003784F92E8A7F0187C5280FC8246ADEB1CB
-:1021C000CE4FF80C24CBFCDC02AA7219E17BEF4D58
-:1021D00040765381645288CEBB9A115EA633E9499A
-:1021E000196FE6F7169951BF121D06E44282C7091E
-:1021F000935CA0F105D07ADE7F6EE4F6167C7FAEAC
-:10220000D63F4A774797FC86E86EB3DD6BC7251C3F
-:102210004F32EA7DBD9C393E9DF9E516C79760298E
-:102220008C3E5F52FBB5B19E0F0AC98D8206B9F094
-:102230000E2CEFD4E07EC548FFF7C7E3FBB7B5AF80
-:10224000DBF38A4CF36EFEE9DB34EF4B4E9E175EF8
-:1022500011F03B6112FAA55BBF3AFECAE3A3E4E1C9
-:10226000F5EACF3F7EE88DB1011CFFE3DDA38703D4
-:10227000D2DD02A9F3A307115F9FBB3ADFF93996BC
-:102280004FBF74A81FC12F7EBD8B6ABF004B8C1C33
-:102290003A6E32F17E17D13EF0F96F0AFD3733BE48
-:1022A0002DA827106E0B5AC66C2779304DCA4F23C4
-:1022B000BBE9C431E3FAE2D7A98FAFAF4F1F5FEF9D
-:1022C000B78CE08F709838CE2DF4ABADF373C2EFBE
-:1022D000677B469B9015A3CF333AC7A6E747F1E447
-:1022E00057EAADD4EF1A12F5888AB90E81D7B935FD
-:1022F000A650430EF7E3F6EBF039E1BDC2D3C0F5CB
-:10230000394ED467D87F51E66F785D24E81CA8D792
-:102310007E00FA4FF5AA5F61BF3797A5B25C987B44
-:102320004B9B95ECDC6E79A6BE6D3E3DFADBCB3364
-:10233000849EECEE07CCC3A43F013767C1FA24ADFD
-:102340006E2AF963C3AF483EDF99EA95D064841AD8
-:1023500019C2C4D7272144F05E6D0AB2BDE7203D03
-:1023600080658BC99B69C1523277F5019E27C47085
-:102370009A06010BD57F6B8A3400BEB7CA539949C0
-:10238000F4FF2638FD6417FD207DF51892A395EE25
-:102390009973E9F96C35D5DD82FB6DB4CA77E793A3
-:1023A000FDF303C94B76AF0E175D7FCCB578AD0456
-:1023B000DF7E41D9AB22FD16BEA2384C0C7F874A86
-:1023C000E3BE6109F6A575BDE55C3FC664263B2DFD
-:1023D000E41A839B7DFBD07F14FD1EDFFF2328932F
-:1023E000C81E98F35B07CBF19B40667EFF11282C3B
-:1023F000C76F8600D76F8188F54B7CEFDDD2FFD9A0
-:10240000B91FA2FB7A77E257BBC9AE9F2BB5F7CDB8
-:10241000C176B512F248CFFCDAF17FB646701D4A9C
-:10242000830592D0BEFA35D129D9EF475DA19DD859
-:10243000EFAEE42DA91D588F9884FDA556069FA4E4
-:10244000FEAA19FC0D58F64D0E3C4F7CF8CB14310A
-:102450004EADC5E126F94806168DF3D13B2EA67781
-:10246000D2BB3761BD0CB145F03AD157D09BFA577A
-:1024700060B97BC2EAED5468DC53B27727BD3AD528
-:10248000CCEFC36999D75116A75F7CA3CDFC3EFC66
-:1024900043E6F72775590CFAC537CE1C7C1AF73777
-:1024A000E5EF965EF5CECD05827F7C7DCCC144F60E
-:1024B000E0FF68FC851092683D0D7B4DA116264219
-:1024C000611F94E9F40891D5446FE50041A27BD8DF
-:1024D0008B7A4C9F2797F7FFB9EA233AC476B60761
-:1024E000DB9F2739690F0A3EC1FA54DA8F23085E51
-:1024F000B2D750218305EB49F8A290BB6E203BB6C2
-:10250000A502DAA93E092212E17B0A417A08F9C341
-:1025100032D3ED5450B8AED3F1F740E5F272087102
-:1025200079258485BE07B9F1299CFFAA4F40EC6745
-:102530005498E91D1D19F747686FC0E5B798C9EEB3
-:10254000F0FD30B1BF30A840870B22C473EE709904
-:102550000E814C31BF80879D9EFBA2F070C4C123C9
-:1025600089E0E18DC203E710F03803BE023E931408
-:10257000840FCAA7C9D025D13C8A66DF548297CB85
-:102580002AF073D90B5C5EA8F79C09979248C01299
-:10259000C84F009FA989E96684069F3F1600CB2F8C
-:1025A0005DFE5C5B20F3735D0E217F66923D1A2F0A
-:1025B0009FF4E7BE94CA2F64A487AA82AC7916D48C
-:1025C00067BEC2CA3B8760FDEAA7F344BDACF257C1
-:1025D000B958FF41C128511F5759684578D59B46C6
-:1025E000CFABC2FA90806923F1E5F27AB4AB715FA8
-:1025F00081A47B8244C7A60C709BB03D505FE42D44
-:10260000C07A00E912106E7629A79EE06CFF397837
-:102610001B7015196981C905B8DEFCF99DAB053E33
-:102620002BFBCFC5FEC73BAD6CB7ACB10583842790
-:102630006477777D69747FC79FFE790D3D7F7A004F
-:10264000B849BF80472EF4BBCE5C8FD9015C5F8C4C
-:102650007283E21F38DF4C9A2F80EA49A6753D2528
-:102660008508FECBEBA7B13F7024CFFFFD82BE31C2
-:10267000E3E33EA4F134AFD073E0C92924B8958CCC
-:10268000F45F4BFD4EB850BEA651BBC0434F6563CF
-:10269000813297E68D7F6E4EF9E6862538CF52A4BB
-:1026A0001192D38B0B0237D2B84BCD914185F86C88
-:1026B00065CA3B36A60B05E993E403F12BEDB7069B
-:1026C000E991E87ABFE057E40077B7FD8AF8F5F8BA
-:1026D000BB6E58E813224EC2FF15CF0D3E8F6635F4
-:1026E0008D7F3BAD63A9D4B590E8F2F3F4D76C7F4E
-:1026F00066BE1C28E84E935B4B9FFB9AF9E7593363
-:102700000425CD3F8618BE5BFA5C9285FCC3A59F6D
-:10271000422805DF2FDBF77803F93BA5E8FF939FFD
-:10272000BC78D753CC6FFB485F22E896FEF7B3CF57
-:102730003F487C7A6512C7A126BD767408D94153FB
-:102740008E461A106D70E2D9372E13F4AFFB257F39
-:10275000339D8F1E9F26ADB887F0BD0CF16FC7F972
-:10276000969982A26E75B855967BC24FAED1F6F19E
-:1027700019746E9CCF72453D504AFBC99480E56345
-:1027800048F81332FE23FEBFFD686835AD13A46F11
-:102790006C246F4EA15F4CFBBAFDB178BFA3EB4038
-:1027A00029F9DDE417E33E17B71BDB97C6EA870478
-:1027B0007EF296022D1E960DD9B4AF5FA33FF4C1F1
-:1027C000309A777E1AD9871329AE90405EEAFE715F
-:1027D00028B9F29102B697DB25E287324BE2FE0B75
-:1027E000F3855FACDBFFCB1E92D88F5BF6509F5119
-:1027F000EC276BFC0A612FF3EF93A45788CE022FCE
-:1028000003D1C12DDA9E60731FA6B95B9B4CECC748
-:10281000D8A53BBCA4F7C73DD2FFB67F63BA4975C4
-:102820004326D527CC7DCCC3F655908435FA556C1C
-:10283000673E99DE954BF33F992E838AF3352475D5
-:10284000E5929C559F757849EFC6AFFBED02E10F0D
-:102850000C098FDF14F1083C139FE7BC54BA89F0D0
-:102860007C12F99CF0B7CC35BC3F38C96E989C19E6
-:10287000C1B241B3D3731E1B95361BE1E2A3F5C66B
-:10288000D8D51DAF5E9342F6F26E8B3FC58DFD4EDF
-:102890001ECE35F841F16551189153D84BFB1B33CF
-:1028A000870412C05D2F7D9B2C0C2F9D6E7F5DA732
-:1028B000C00756C247B9D8876A77DB7D447FA1A994
-:1028C000E44F2EBB19DC2DD87BD9CB0F3738A8DECF
-:1028D0000C4CCD27E97FD4FF137388ECF15FA68CF5
-:1028E000BDB71CEBBB8E59849FA22A87F263EC58BC
-:1028F0007BA6196403BD764A8B491E13DD23BD26D2
-:10290000C9C920C7D0634A5E86A1EEF20E30BC9FD3
-:1029100056926B684F574619DA8BA13612C0F514E0
-:10292000654AEE10AEB8CF8C0243BB1DE93A4CEBC2
-:10293000FC52D85125F84FE8DB20DB4365118007B6
-:10294000900E261E37DA59259136F637930E5B0C1A
-:102950007100FB59E250C9851A7F0D8481C45F481C
-:10296000FF5E9263270F8BB893ACC17359B6D0CF7B
-:10297000CB5E96D80E5C76CCCC7AE22478BBF14361
-:10298000F251E7BB78B8F7F51BE1DC7FAE11AE5929
-:1029900001235C2FAB31C2353B6884EBE05A235CEA
-:1029A0007354231C87344D34F41FD65669A88FD82E
-:1029B0007485A1FFC8D06C437DF463D71AFA8F6980
-:1029C0005F60681FB7F736437B3C5D8D0F2F33B4D4
-:1029D000DB538F305D1D40BA32A13E287CE9DFE237
-:1029E000E8C2C2702F1AE8F48662F0AFE23FC27FFD
-:1029F00099969798006A03F1E385C2FF1584FF94C6
-:102A000028FE75B9DA139FEAF81D42FA9AE565794E
-:102A100084F07EB22485E9E5E04B270F2B40F84F88
-:102A20008502DCEFAC29228E22C9C126A2934E700A
-:102A3000B591FDB9C61264FF4545B3702729E53845
-:102A40007FF3FB25E86FC6ACB35A49024BCC7EC777
-:102A500087DB0DF5C297F61AFA1775860DF5F18723
-:102A600041227D55F0A6F7792A8B3E5438FC55FC5F
-:102A700049F0792A4BBF0CDE45FA37DECFBD5AAD9F
-:102A800097D2C8AFFF7BFBF368D6A07F364825BF3F
-:102A9000377247AAD73400E191FC4E03F9DF807604
-:102AA000B4159511B80FB23E98EF10EFFF2D69F2F3
-:102AB0002AEA6F42FF9CF08E70C9237BAF1692BD4D
-:102AC0000417B25BC80F832B843DBFDAA4B23D9AD2
-:102AD00084F628D9230D157EB697A74370203DBFF5
-:102AE000069455C4779219ED577CFE3F23028D85DD
-:102AF0004562B1443F777D21B3FF3D85FC6906A661
-:102B000002A4F74ED0EFB43E78691EC5E34F902E75
-:102B1000C3F5B7B5BC304F253BC303EE08AE3B2031
-:102B200040069B0B03F7D0B8EF9BDCAB0BF1DD83CA
-:102B300013FF3288EC917585C2EEB34B0829A4814E
-:102B4000FEF315A0E78DD9CA7D8545D1384B4FF4EA
-:102B5000A3C733F5F8E6AEBA309716B75722BA8B4B
-:102B60008F3B46CCEEAAF1A4FF9699D8EFFC0B2D33
-:102B7000AE94E7496539EF804E7B3A2F99FDFFEB24
-:102B800035BC991D9DAB7E8EEFDD1014F6D60293F9
-:102B900097FDF5DB338F731CC52E99C047FE505A45
-:102BA000FE76117FD1E3259749DFC6CE3ADB7E6FF3
-:102BB000CF3C668857C1137D12C6D7A3E3ABACFFE9
-:102BC00062F6B9659347E835F2F3DF6FCEAE84D491
-:102BD00044F37CCEF1ABEB83AF1AF8E2C6DAB70C64
-:102BE0007C7093FA9EA13DE2E9B252BC32B2276BEF
-:102BF0003AC5D73FDB6D2F263C20FE0F16C6C4EB2F
-:102C000022CDA3AB60ECB9ECF72FBC8EA3759D8CE5
-:102C1000577DBFEFD4BDC9F5485D84CBF8FDEAF11F
-:102C200011BD4471D844F6CC5D12CA0BF277495EEF
-:102C30007862E405401ED9FF7749A3BC44EFB6FD96
-:102C4000C147A9BDABDEEEDEEEE3F808C74D6A91E1
-:102C50002EC86E00A7787F81CDC176E81D3EE12F9A
-:102C60001EADF8EA06B25F7320D58B32107FC27FAB
-:102C7000A2B8C97C531AEBFFD55907B8FE61338857
-:102C8000BC514DF821F25797A6A60ABB58C1FE5871
-:102C90003F9161E6FAA11181AF981FF3C39CDF5801
-:102CA000DA5FC4F3C01319447CF833D9FFB5E05799
-:102CB0007780DA6B32D0DF46FAFDC4AC8E35116B0B
-:102CC000ED1A70AD05F1FE49B2FA395934637CFD55
-:102CD000AE253FF3139BE0DF49BB4ECF53113E1FA0
-:102CE0009A24F6CFD5674C1CAF0167C4568D7ED8A9
-:102CF000038303561F8EDF66457BD2299ECF1E13AA
-:102D00008DCB9EB0624971D024513A7DC2EE75F9E7
-:102D1000449E532F4710CCB09CE4D3E57CEB708AE3
-:102D2000BF9DDC6C07925B38BF42FE96FAAC88E32D
-:102D3000F7CBF02F028117F71A5CAF6788FC05F11B
-:102D40009F4742BF16F721FB720CF167726053B1C7
-:102D5000FDFD3DF66D84BFEEF51E16F1B0CF9A472E
-:102D600073BC5BA713D9A7C5BD7F0C20DA2FDB4648
-:102D7000ED8B5F7EFF1D8ACFFDA63030D487ED0B33
-:102D8000CC7231C9C9C5A91D1CA72BF6C93C2FAEF1
-:102D900097F78B72AB117D7158EC88705CEF6CF11A
-:102DA000FB9EF6FFD9CD9D1BF3395E2D8F25B9A271
-:102DB000CF8BEB28A675E8FBD4D7111DA777FED1E2
-:102DC000E3D07AFDE387D60CD7F20837FA13E8E5AB
-:102DD000AB743AB6268EFBD768F88CC74FC18860B3
-:102DE00088E3796E703760FD5A0D4E9FCDC3FD703C
-:102DF0003C44194FF85D3CDBE92538EBE3F7CB8029
-:102E0000C053BDCC73C548FF1CA2BFDB82224FA0BC
-:102E1000B723FD893867730AD3EBE2E7DE7AE7E789
-:102E200038CBAD8F8E2924FDA1BF1F0F6784EF70B3
-:102E30005ACF0249E4CF10BE37D1F8F1F981F385BA
-:102E4000EB89EC4ED60B27B6FD2C44EB3B91056E7F
-:102E500013F2E3E27DBF7DD33496E8C41996B084C3
-:102E60005DC6F857BC9E7243E03A92237694236481
-:102E7000DFD8F5F7065A0CEF55672A77F9D81F55B2
-:102E8000EE2679645785BF362450C1F5E556E1AF8B
-:102E9000EDEA34CBC4DFBB2C10223DBEFCD50C9533
-:102EA000ECC7E56877B0A79317E4F54232FA41E939
-:102EB00009EC069357E6785C5A600DC14BFAD1D401
-:102EC000079FC889FAA3BABE2CD2F4BD927F6303D0
-:102ED0008DEFD3E281686772BCB314029A1DA1C55D
-:102EE000E19A0F701C4297DB3698EBA0F8CF9ABEA0
-:102EF0000B1CE41FCA382CC7D73CB3D3A0173B72B6
-:102F0000551D4ADA11D1BAB5073F5E3F1FC06BECC1
-:102F100047DB0512D6D07AD5814823FEDA3AEB7723
-:102F20005D2F60D932E691C84A6AFBE6B44476A4C4
-:102F300043B303B8E847EB14EFD906AEBEC384FA37
-:102F400033D96B81F763F4A00339FFFD3C6D5EB2AA
-:102F50000732BBDBFF4078EB691F17AB24F8BC6F6F
-:102F6000EDA5DDE6AD49240F12C28BC8C433FD18B0
-:102F7000D16332C4EC9BED9E98BA14072F89CAEE38
-:102F800076E57482FCE577DDD7AABAF0AB1F1AECC0
-:102F90008110AFDF6AF18317E9C9E6C176C3390C46
-:102FA00055CB7F220117C7ECEF1CF64576B955DBF0
-:102FB00097F522EF8BC6F5F7BBA4D7A75EE2EB0B24
-:102FC0005FE2F885EA4B1B7E4AF5A50D3FF5125FDF
-:102FD0005FF812C72FCCBEB4D7A7CCBEB4F1AB5E9E
-:102FE000E2EB0B5FE2F885AB2F6DF829575FDAF063
-:102FF000532FF1F5852F6DFCAA6C073ACB81CFCD0D
-:10300000A6379A4374CE46AA0A73DE3857058E4710
-:10301000A73603E72BB67B851FA5C7E947D2103239
-:10302000FA2D567716D9D1DB1BEFABFC318E732A04
-:1030300013174FF9FCEC230A8DB36D1A70FEC2D939
-:10304000F8D1518A7FE540D81BCEA1B89A04E11887
-:10305000BBF4FA600A8463FC896AA58FA15ED43947
-:10306000C0D0FF964D430CED37B78D36B4FFA8A9FD
-:10307000D050BF492D33F4B7434E4B1EE55D1B2D99
-:103080005ECA8359686FA567C20D76D8F83D05FF03
-:10309000911F9383167DF7B8B88F74D56618D7192A
-:1030A000D77EB67C407C3E614EB1964FE8FE7E41B5
-:1030B000BC0F6E4FC2B8A79E4FD0F139DC92C4F856
-:1030C0005AA78A7CD39A69C28F9C1A729B286FA9CF
-:1030D000E36FB44672FABEB7D519FDC9F446772539
-:1030E000FBA34DC0F9DCDC2A7348C9A138C1C04A32
-:1030F00007E239B443D04708047D841A81F385A1DF
-:10310000AADC95D47E2A047C0A46A78FD1550B678A
-:1031100052DCB53EBB5F16C51972AA043D2CDD6BAF
-:10312000A4034AE7D256D30F4BBCFEF4FA8C02CA72
-:10313000E79D819727049CF5F3E7E97170CFDB6188
-:10314000C44B3CDEBE2D5ED614C77F57F2EDF06255
-:103150009B2177A4519C540599E2322F660F373397
-:103160001C9ABC8C9F19D88DF830A70938DF134FF3
-:103170008FAD7510AE8AE1DF1C6F5821FC4C93F2C5
-:103180002B99CFF0DDFEC0A744195FDB9A44FE16F1
-:10319000CB641A1FF6CA0328AE105267F3BAB737CA
-:1031A000DB92E93CDF57F566A0F3F2DB73E40194B0
-:1031B00017DBFE8C696EECF920A40ABB3993F7612A
-:1031C0003797706911A5A2956011ED6189EA835660
-:1031D00098E3F0A94AD49E3E2339EEB962A2FE5B81
-:1031E0008A73193E694A86015FD61223BF23180FDE
-:1031F000E5A37C1C4CBFCB4457824E42AF4BA195FC
-:103200001C5FE932D510DD68E72DD257CD06CA47DD
-:10321000D567FF742ECBAF7A1BC31D5608BAD0F307
-:1032200082D6264187F1F4E3F21AE9C72A0D3489E0
-:10323000FC96E01F7D1DDB146DDE2C0954967BB6D9
-:1032400001C467D6B8F1EC243C49DE78045F3A61EA
-:1032500036D07BCE123BE7B1413ACAF8B74E00E810
-:1032600013734E217EBD675DE777A4F30FBF239DE7
-:10327000EBF267AD57933F45E25CE429A46B8A1FEC
-:103280004DADEA04FEFE0ADC26A247A4835959C5C7
-:103290007CF4817F76911CB213BCAAD3A8DDD5A99A
-:1032A0004C25FA9D2EBDA2B8709CB587059DA37EC6
-:1032B0007989EAADCD16A0732628674C3FA2794BD9
-:1032C000EDEE952479A481E369DD853E943B1447B6
-:1032D0007CC5282F8A3A8D70CB8D97EB3DC0B127E6
-:1032E0003D110F47D7040D8EC508C721DF1E8E364E
-:1032F000AFD0C3E92542CEBE98FD537ED57D589C04
-:10330000AB495780E1FA852AF4F274E97898E4CB66
-:103310003A05E50BB6CFD0DADD25429EE870CED572
-:10332000E0ACCB9375F32183F8DE4DF2C44970FD18
-:1033300088F5765B9180334084F39FA98AE09335CA
-:1033400056F0529CB6ADD4E9A57861AEA2C1B7499A
-:103350008397094C04DF78BA9421A68EEB4B8DAB92
-:103360007F5BF8964ED0F4643F283E1FF8AE4B4981
-:1033700015FC3654C0C7EA8CF0B9E6A61C8B77253D
-:10338000F275470EC21BDB9B5E17F0FEA5D67FD5FC
-:1033900018E07A53DFD5990CAF9C859944CF4DD670
-:1033A0003695F2584D3AFD69E7C25C9A9C9886FCC6
-:1033B000BD00DF5F8DF289F290A92501078DD794BA
-:1033C0006F0189F7BFD99B68FF0E9FCD20072FABF8
-:1033D00031C235250E8E49DF91FF7F3CE1BBF1FF05
-:1033E00076FA15FBAD1906D0C979C89083E0642B35
-:1033F00099984C74D4D2BA9DEB32849A7271FF0FB3
-:103400003B85FDD5D23ABBD7F351214D2E6CA97324
-:1034100070795F9D9BCBB6BA4C2EEFA993D97E698C
-:10342000ADCBE3B2A5CECB65535D0997ABEA14EE05
-:1034300027ADCDA860395C051CCF5E99F239E7DF76
-:10344000E3E7CB518D7A6C706DB201EE7D6618F5B5
-:1034500055BA62D457748E29B6DDE51D65684FC92B
-:103460002B30D493E48986FE5326047E3981E48090
-:10347000A7324E0F223F8E899EB36B6915DF4BE951
-:10348000F0D3F59353E3F33556EF00CA3B395B05B0
-:103490009F366B765E13C111CB6405F8DC8CEDB002
-:1034A000E40D01F1FF6AA6F38771EEFE488B1DD98A
-:1034B000D7286427B4C8C28EB78238F76BCBF4879D
-:1034C0006BF07912EA2FCAEBDAE6A6B05C78D8E3A3
-:1034D000F4D239DB96D6656E5E8F579CA771E3BF39
-:1034E000447980F8F3358EA1C67339D6B39C6FFC4E
-:1034F000754FF4DA9491508E9C2167BBF32FEF6BDC
-:103500007429F22FF778043CED3DC8A3D6387BD957
-:10351000A9E55F60A02F61FFA83D25F20BAD717199
-:103520007BF4C312E66FDE9A2071FF3F4F9085BF98
-:10353000660903C96B9717DF8FF53B14F17DE8B976
-:10354000CE8F3F3E4F8C7C0A2407FE3C019F2B4FC1
-:10355000083B254916DFA1D84051583E81C887D085
-:10356000591FD237A95ABEA75BCE908888A13BE7E6
-:1035700019FEAEC88BD06716443F96E8FB17C4BF50
-:10358000FDB66523F9C3C37A69A7FC5002B9E02AE6
-:10359000D1BF1F832E4F3180EEBA23FC5C2589E119
-:1035A000172678359AD6CDC8C5E7A95E8B173100A6
-:1035B0001525F25E3A5FB14A4965FDBEAA446E2701
-:1035C000FEF942717A091FADF955ACAC93867DC8FE
-:1035D000A2B7B1C4C676BA8E87246D5E444F679594
-:1035E0000E67ECEFCC9B11ADE37FCD6336725EAF1F
-:1035F000E5AA4738DFD732EB3F38DFB73A6B7A1EA0
-:10360000C9BDA492E9C7F82097861F660DD2237919
-:10361000C6FCDEE9D3A2CE70A0F8849607048F31F1
-:10362000CF6791FD86F92F349E60A0D0436051F89A
-:103630007B8333E95BF0B5DEAF673E50F5EF4E5765
-:10364000D2F9E0268F90A34DE07D3340F55724AFAB
-:103650002AD3F38237E9BCE9EA8116C6CBEACCD992
-:103660004DC28E177E53936725E76DE3F5369DD7E0
-:103670008C95DB745E3356BE37C9B37BD5CB59010D
-:10368000739CDE37BE9F1D34EA1FFDBDA4CC2B5FAB
-:10369000AB8A392FD56CF13B485EACF2DC678AD53A
-:1036A000730F2881052531E793AC99B3F83D7BB6BC
-:1036B0002FE1BAAE50948544DFB8FF5EED81F59AF4
-:1036C0005CDCA8E997B3ED7393D6FF01ADFF66D23A
-:1036D000EB23A2F8193EF4F26496CFEB441C8379F5
-:1036E00020665EA524B082D615C5AB390A17A4D3CF
-:1036F000E1F957B0DDD1B06E7632E169E7FADED795
-:10370000A3E7D5F57E7A1E353EBF6EF3980DF0DF48
-:10371000A3C985175C0B2B1F40D0EC6C13F4D4B0FD
-:103720004EE891E14F887D9C4987C6F5EE6CEBDD54
-:103730000E8AEF4F91C56E3AE17A465C7D405CFFA0
-:10374000DCB8F65171ED0571F58971FD2BE3EA578F
-:10375000C4F59F1D57BF36AEFF82B8F6DBE2DA979D
-:10376000C5D5FFCD884FDFB56989E0188F3FBDDF34
-:10377000B9E2EF5D5FC57EA2A3E13083E945A7B75B
-:1037800073C543D4DEF5339DD94A46B17CDF81F65B
-:1037900015D9433BDB2ADDE27C4760E56E8D3E4870
-:1037A0003F58368879D0CE4AE6F89CD36390236799
-:1037B000C3B709328CEDB17668EE85C7F7D9E93326
-:1037C000A4D917BDAF5BE7E32913FC27490E414895
-:1037D000F899BA5DBB4D15FCB34D5D50B99EE46DD3
-:1037E0009359C49FB5FB50E86E1D11270F684A38E6
-:1037F000C2F18426CD4F68D3E4C95A4D9EDCADF9A1
-:10380000094943839B28EE9B7C988FE740B3AFE048
-:10381000AF0B103FF797166FA3EFC7EE1E53F2F8EA
-:10382000C35877FD5D827021DAE9635B14B259DA1F
-:10383000948C243A4F946272B4939FB8AAB0CD3F4F
-:1038400014FBADDD7FACFD79C4B39C69F3A2CE0758
-:10385000D9D265227A837C2F7F9786EB54C9C6B272
-:103860009677D5253A77BAF60AB7898CB0F419B2AB
-:1038700099CE11F79910E85B8AF018DC046605EB25
-:10388000196A98CFE25C532A0BFFEA196428DE6FAD
-:103890005716C1EBAB66DB7EAAF68C0F90B438DD11
-:1038A0007995FA38698234E887E38EB245ABAB8FFD
-:1038B0006CA6F3D04E49D4A73CF3F8FC95F9D1FAA5
-:1038C00098671E1FB812DB5B0B0799489EA67B52B8
-:1038D00013DE137375A9909FDB9B170E4EE48FE9DF
-:1038E000A53C13383021E76B25D1D4042C876AA579
-:1038F000AC3DCF14F52B35B8C9B55ABB4794177AF0
-:103900009EF8F1E794BA753B7B809F8D6CC877F683
-:1039100033D88B5797F6622FA279CCF1DAAD56796E
-:10392000009D23DCDA6C03BAFF616B3688EF905799
-:10393000D9F8DC2858DC03AE7145D71D5AD56F1E67
-:10394000D14DC80486386EA6065FFB4493768EF28E
-:103950009B307DC7B755CBF36C8588DB9D1F8BE70C
-:103960005FCD27BCEA78DE57FAAFCD449F1DD90B57
-:103970002B37E27BEB1ACD1C3759D798CB744EE32B
-:10398000907D746AC52133D9ADF9D06E263B7F1482
-:103990007D793D84AE400A70D9AEC9E7FFD4FCF80A
-:1039A00061A0F0F341D0C5C0F9B438F01382CB1058
-:1039B000126D12F18FDBE4C07996EC4BAF48A4B7DF
-:1039C000EB4AF5EF7AA1C652ACF91732C3B78EF8BD
-:1039D000281EBE74429FE38E8ABF9EDA9D7B5F0DD8
-:1039E0005F86D5DD6F18E993F0363B46CF6CD4E0A7
-:1039F000E7F6FA15C2E1B5C581167A7FC9A6BF1EE2
-:103A0000207354565533BDFF14E11D9F2F0C07A79B
-:103A1000D33063BCE14AEA3FBA76DB7E8AA7E5058C
-:103A2000EFA8EC8FEB1BAE54577A888694C0FD3418
-:103A3000CED0CE48850BEBCE4DAF86B3783D6379C3
-:103A4000BC5C7D3D480FD54C476E11C7D7F04BF895
-:103A5000A773CB0B370BF8607B16EFCFE2CE8A5DF6
-:103A6000FFB669FDF8BB8578BA68D5E0F758148EC3
-:103A70006035FA358F2582A34EA73A3C6E78A26B4B
-:103A800015E53AE7873A5F2439E8DFE49EC6F2B0ED
-:103A900038F024BDEF6BF337701E7057275D47D4A5
-:103AA0000D1FA7D249D7BB603FE569C2FBD615EF12
-:103AB0005772BC782F88B8589C3ED44BAB129F6786
-:103AC00010F7E58CDB6BB493915E958D9E587A353B
-:103AD00073BE33A4E9935013D22FCDB742D06F48B1
-:103AE0005DE64E44678F687A658746B7FAF3A13D75
-:103AF0009CBB3C54DAED27664A46781EEA8DEFD32C
-:103B0000C0CBFC807C7084FA65101F607DF00A37A2
-:103B1000D3A7CE074BF6FEF500DD67E3F4C905B188
-:103B2000F7D745343C227DBE43EF2FD9D475807C36
-:103B3000C5C12B047D7E4C77871545E90CFDC7F781
-:103B4000A89F4E3FF1FB78571B4F2EF67F4C785CB9
-:103B5000B829C8E321FF1C2BE5713AC349CC724A4E
-:103B600025ED676B1BB8693FF65F1474905C3855A0
-:103B70006B62B8DE981F5E65C6F2FAA160A5EB869F
-:103B8000AA33916C72298F6BCCFF0D6B33E20FE976
-:103B9000E76F344F91276013C1EBA08DE5690F7477
-:103BA00011D57BAA0EFF157172D73CB1177A3ED79B
-:103BB00071D7162B8E8945DF621DE7D84F8F379D51
-:103BC000193F1DC5FE434BD36CFD9CF00CBA8F67AB
-:103BD0003BC54F11AEAB9A7AB7572F58FCB4F9A436
-:103BE000889FAE008E03AD4C196B4A44379740FC5A
-:103BF00074CAC444F1D3C87B063B735593900B3A07
-:103C0000FC86578D4C16792948A57C891E1FD3F751
-:103C100075B7664F3669706B21B8313C05DCDA0840
-:103C20006E0C4F1D6E33843F425F8853BCD66316C3
-:103C300079B1910B3651BEE054A6C893D767DB44E7
-:103C40007B8EC82F9C411F9931F634F2C19A667160
-:103C50009F08BECF79B517B30F3886509E33D3CCAB
-:103C600071DAED9EFB6AB6733D99F9CF0A6A5B1E65
-:103C7000CE3BFCC3B9EA027A5E62E773F27A3EA7F2
-:103C8000A5AFC8E7B8F2B47C4EDC7C76B8A9B28D9B
-:103C9000E6CB137E4B8F74ECD3F2115A1E2823DF30
-:103CA00098AF70C4E52BE2F3956B9A17ECDF2EE228
-:103CB0002B2C9F87FF7824FB63F1F3B8671AFDB7BD
-:103CC0003523753FEA1147A2EF1852AB8CF4D8A206
-:103CD000E1BBA1AFC8479C6D7C284F36F8552D79C4
-:103CE000E71647D0FB911FEA4ED03FDE0F3D1FFF86
-:103CF000D6CDE31BEF074CE0DF6E99C8F11441DF2E
-:103D00006B9AC5FEBBE3699A5FA59F3FD2C7B16AB4
-:103D10007E1CD773A2724ACF870D75DB985E876AC7
-:103D2000F74535FC7B4A68650EE5D76675513E72EE
-:103D3000E80E89F3EE439D7ECE43746C98CEF9F184
-:103D4000BEC981A727C6C49F76B87E9AC9F9022D3D
-:103D5000DECFF7E6A0DE53D715762A64EF8E04BED9
-:103D60006727392E1F107F3F4E7C7D4E99D0C39917
-:103D7000D741C27B4F3E9F28DACFF4DFAF6038A136
-:103D8000BF9B2CE4ADA2D7FFBFE4A976B61DE2EF3E
-:103D90007D4EF94093B3FF0997A29C3D5112389E86
-:103DA00050CE5ABA58CE8627289F919E5C4E177DDA
-:103DB000101E6E4C7C3F8F5C76A9E2E16981877CA6
-:103DC0001D0FF75C92F942C4437659223CA05F452F
-:103DD000F06AF32983A85D29510653D98D8F1F26D8
-:103DE000E68B5965C2EEBB58F858A7E1E35EC207FF
-:103DF000C769642D4E93C7CF9B357CAC39031FEF49
-:103E00000B7C94E8F878EEBCF09151956168779757
-:103E10001BF191EACB35D49DF9467C240F2D308CD3
-:103E2000B7BC4C16F7240D9C68E877263E8CFEC084
-:103E30009DF45E2FF6E8C04067057D4B34606E7BD5
-:103E400007C9E64C7F5B0595FA3E37C7F9737AB927
-:103E50005CC35FE6D4C4F85DA0F15BC644E526030D
-:103E60003D7C2F317FD668FD979728B794C5F2F334
-:103E70009589FB2FD1FADF3641591CDB1F7FD64BCA
-:103E800031F6784FFB0E242BCBCB78FD224FB6A317
-:103E90003E95F3663B92E476CA57ABF54EC3BD75CB
-:103EA00083E937AC67FEE89B0E95CED9D13D4168DA
-:103EB000596DBBA35FEE1A6CDA96317C25C1B1A9AE
-:103EC0006C88B8BF7591FF6DCAEF28EA09ED1CD266
-:103ED0007CBEEFC814EE63A27BB2C09D714EF92385
-:103EE0009467E25EB7C120BE238620EB41C90FE98B
-:103EF000F4DDB205FC225F4EFDC5F785BCF9140860
-:103F000073DD0511AEA7697EDE0365393C6E3AC8E4
-:103F1000260124AF89E4A8CEA70E4F90E9DF53EB2A
-:103F200036AD245FCE0250467EA073207FCF0B9526
-:103F3000A0523ECB040EB6334DEB0F7CCD793AFD4B
-:103F4000FBC397FB88EF0FCF717FE7DAAF91EEE508
-:103F5000F344EFE56BD4EC01FD5E3EB532C8DF976C
-:103F6000AB2BEDEE06CF99DF973F3A31B08BF0FDEA
-:103F7000B7A4412191640E4E98EDBAA0E3872FF2C9
-:103F8000F8AF5CE4F1DFEC6DFCBBE9D752CAEBF9AA
-:103F90008F123F37B88AD9EED4CB78BC5DA12811F7
-:103FA000EA27395E1BF0619FA83DE73C6A627FA863
-:103FB000C124CE9FA9EF99D8EE827C41074E19F219
-:103FC00072C645C7717A838345DC49C45FEAFF74D2
-:103FD000D708B2BF7F99322B9286E31D7C55D87FDC
-:103FE00096A991CD74BF73FF349B773BF2DD3DDA28
-:103FF0007AEDA513EEBD137FBD798A90172E8BF74E
-:10400000F2023EB7343342F6A3ABD82253AEC01906
-:1040100097D76CB5B42553BCB275C77D15A3B0FB5B
-:1040200063752FB91B137CEFE9D4F29A23A5C472F0
-:10403000F09F939244DCCB67BC4FD85AAE9D2B497E
-:104040008554B2232DFF52D2129D07D04B7DFE2204
-:104050004FA48ABEBF8ED0256E88E7A292EAA464E0
-:104060000F9F8BE824F8567AC30EB27F1F5F10BCF7
-:1040700035F6FBD3D61270911DEF9B22CEC36E5046
-:104080002417DDAFF160C4C2F78E3FB8E8E9E6144B
-:10409000ACEF3D6A76133C5AFDEF3993B1FE388E92
-:1040A0004BF2EEE00E71CE529D0FA16108BF56F2A9
-:1040B0002AB1BE5B11E7B2D9212BD6AEEA43F8FF95
-:1040C00075725F016F0856D3BD9DEB5226F37D9646
-:1040D000D973443C78BA74B483DE7FB0C4CEF81B85
-:1040E000A29DD331A9D57C9F65DFF9C6733A0F2E07
-:1040F000EF5409BFEE52BB5BE5F3974ED7587CDF18
-:10410000F5A8192456715D3CF974C929D6E5157EC8
-:10411000EEE37258A5FB8EFBE27BF56EBE35D170E7
-:104120001E68F726E19FA68D777A91D271BD71E75F
-:1041300085F475B5E1BAE8DE63D7508E4764CC31BB
-:10414000AE2F2DCE6F70C6D5A79677DFE3339CF0E8
-:10415000FD85FFA785AF71AB574EE47FB6D64167AB
-:1041600055CCB904670F71C09AC982AE6D592F380A
-:10417000C84EF9C27FC4433878E59F073EBC97CA52
-:104180007FFD6ED75284CFEFBF7E73C793B4BFDA83
-:10419000BB0F11BDEAFE189FC1C4F5BC586D63B8D2
-:1041A000F96768E7397D1D2F587DDCCEF9A5B5FB91
-:1041B00093B87D64398492B07DA445C9BA99E8AEBC
-:1041C00053F2D6CB3488388FA8E37FED0D7E138C65
-:1041D000213CFA25BA0F639A76BE76C3229009FF76
-:1041E000B645ED7C5EDDB75C9C57F729D5497CDE92
-:1041F000748E99CF87D4575F73F930ACEFBA5CDC1B
-:104200004F3563B9328FE75704BDA475169B9713DA
-:104210005D6689FB9AF4F3A645D0C5DF7F8CF4B6C2
-:1042200077D848DECC4700D3FA5A357C69718322AF
-:104230005FA74AF6A4CB6BC463461CDEE2F1BA4228
-:10424000C7E34818497894A12D99F4E14300ED742F
-:10425000AFC086E54FCFA3F36C5FA8690CAF9EF8A3
-:10426000F91DB4579511740F8B83CB4EB457A9DC4D
-:1042700085F62A95AE60C575CB71DD7BDE38F8D248
-:104280000F71BA594AF5957444AB48CB7B81BA7427
-:104290005025AEFF06E25E51DF4289C4777D92A1D0
-:1042A000BED66389FE3D00FCD595A5FF7D80D35B1E
-:1042B00094A108964C8B968F11F559E487C4B4EFFE
-:1042C0009E69EC5FB63F66FC81B8DEC5366E0FEDC9
-:1042D0005BBA45B5C4B43F87F572805735FBF1FA38
-:1042E0009D66FFF604F2EDDD7261475AFE052AC9AC
-:1042F000B52FD14E23FF5E322B2CDF21D72227BAD8
-:10430000570F00E561AC5F2E1BE5EBE51A5F58FC2B
-:1043100015A0E5C7E01B3DFE803F7BFE388BEF63B9
-:104320005A35C4C2F70FA13EF0F696AFB3782C9F72
-:10433000C6DEDBF5AC2EBF87C1309AFF4B28FF43AA
-:1043400005F341CCBD0DC4F76DCF5FB614E7F11D89
-:104350004DE638AAE45A9FC2F731D535B13C7F40CB
-:1043600009FCB63CE67C4963FAC242922FFA3999BD
-:10437000E8BD47D798BFCDBDF71DD50780F4C297DC
-:10438000485AF65EE8B0B16EEF115AC7EABA762E17
-:104390009D6E85858DDD12E4B8CF154AE04FB43EA1
-:1043A0007B26B6C7F089D58DEF19FC0EE37D9CB254
-:1043B0003BE224B86F28F9C049F3B71E167CBDE173
-:1043C000F0EC24E2BB56EFA124E29B2FE8E2C7EF1A
-:1043D000C0273EE5559661BBDF48BD9EE8674F4369
-:1043E0001ADB150797DF7F2DF1CF8DBFF801C3BB17
-:1043F0009B6FE0E14195CE18BE818799AEBBF9462F
-:10440000ABF7CC377F67BEDADDCD37A2EECB074303
-:10441000FDE04C63FF6EBEA0F1912F1EAFB073BBE9
-:104420007DD2C35BD418BE3A49F558BEF909F24DA6
-:1044300002B93F7D9246DF17986F522E32DF0C9DF6
-:10444000A4C9CFEFCE3763275D14BED9633A1FBE30
-:10445000B9EC4CBEA99AD4F7DBF34DAB3BCCE7E902
-:104460005AE79813FE7D900F347939757EA0B28D8E
-:10447000EC1A45DCDF374D9A99E5F3109F497487B4
-:1044800034EA4FA1CF0F5EDFFD7D06EB67FDFEF541
-:10449000F58450B293160BBAE9AC1371DF6952F987
-:1044A000B4C5A477E93B024A3553F694EC02D4FB39
-:1044B00032D985D05EE1C179365499A04DA62D0739
-:1044C000AB87F1F861B6CF8668717FA7942FBE677E
-:1044D0009A29FEEE85FE5D4CB562BC5FB6FF59ECD5
-:1044E000265C770AF931EE12F17750164D8AD7BF64
-:1044F0006887E0FA3A07DA984E362857F71A273ACB
-:10450000E35CB52F98302FF9D6249376CFBEF233E3
-:10451000A2B3DD6F6C49A673127B24E0F339F383F9
-:104520004FCD23BE73A942DEB4AEF833A52361D7C5
-:10453000B41F1AF5347C6AD4D3F0A9514F6BF51E21
-:10454000E58D7AC2A8A7B57AB79ED6EADD7A5AABCE
-:1045500047E5CDA7063DBD61D2A70679F31ED5CFAD
-:10456000414F1F9E7471F4F4A88B2C6F9EBE70F2A5
-:1045700066DFA4BE1743DE1C392F79937DA6BC39B4
-:10458000743EF2C6B5B943A5F4CCC21EF8A056C31A
-:10459000FB5B65CADB343E949C5BBC269EBE3AAA9C
-:1045A00017AEA6BF2BF3A557F87F3DBDEFAAFDD5EB
-:1045B00091C6183FDC65E914DF23D4EEE1E7B76C60
-:1045C0007E95E3B1675D2F5D105A74A65E45BBC84A
-:1045D000C1F4EB35732EFC7CD7D13A47F0DB95CF95
-:1045E000DEC1FC945C6E9C4FB77F3BAA6D669EAFAC
-:1045F00044C8E99EECA19EE6FDA05C16F7FFC5CD80
-:104600001F4FBF489FE9938B981E2D742FF8179D5D
-:10461000C07FA7EABF4E6EFCBF8A7C49E9C51193F3
-:10462000CF834EA76BF84CB06FEFC5DDF705E3CF36
-:10463000E993CFC38E3E4CFBEE9B70DFDF67385EA5
-:10464000B47D5F30FFE1E6F3C1F7BBE5DDFBE6EFEC
-:104650005132B47D6FF8E735EF515C63C3BFAE7D77
-:104660008AE21AF77D9DB78DE21AFABD726910FDD4
-:1046700091F5EF8F102E2EBFF89E24634ECC774518
-:10468000C0FE7DF4BB13B2377CDDEDFF2BF7CA9182
-:104690007DD2DBBD72AD36635C4F2FAF2A17F64A71
-:1046A000AB691DC72336A05F558F78EB9823E211C5
-:1046B000AD68A7B0DC9953D0AB7DB4AB4EE1B85335
-:1046C0006B9D9FCB7BEB6670B9EBB5256524777D41
-:1046D000AF2D62BDE7F3FAAF7B1881E4AEF8D049A5
-:1046E000CFEFF5E8FE90B05FD2C87EC1FAC393D792
-:1046F0006F8D8D0B8CFAEFE15BD481D178555B66C1
-:104700008CDD23C7FA51A012B944FD28AC1BEC9AEA
-:1047100011EC47ED26BB06EBED934718EC1A7D9E96
-:10472000B566A821BB66ED0EF38C4476CDACF2C421
-:104730007E14D6390FE27039F8FB7F49FBFB5F51DD
-:104740007EE9DDAEC99D7271ED9ADF4FBE30F18713
-:104750006E3ED6EC990714E50D4DAE7C47F9B1D10C
-:104760004CF1E36F2B3F4692FCC837C88FCFCE4742
-:104770007ECC2A771BE2A20765B5CF58B2D37798D3
-:10478000A15ED6F42FD63BD1AF31219C7E5221B110
-:104790009FB3C10BFCF7FDA64BF35F267AD8BDC8CB
-:1047A000CCDFBB3FA88873220FCD11E7A91E5E5E48
-:1047B000309B3E235A9772C3DD4914D72E17F70456
-:1047C0004C97CA39CEFDE00C61E7643BDB2FA7FDB7
-:1047D0001FACB000D1D5D9E2DC146EE778B5E6475E
-:1047E00081B499FD0ED70F2D6E3AAF1A1FBF769682
-:1047F0007CCCDFCD83F40A7FDF7DB6F8F5B78D5B27
-:104800000F98F29DE3D6CC8F35CF0DBF41759E49F1
-:104810009F4726CBE25C620F7A2C9E9F3BAAA7A7FC
-:10482000457A3917E524FB29E61E59FD7BD659E563
-:10483000621E27D94F8551BAE8A82EEEF55EDA94AC
-:10484000DA678EC4E685522CED3C5E4AED3E7EBEB4
-:104850009ECE2F90CCB27859AE3E5E89F239C178A7
-:10486000FBEA8287092EBFAEAB3D4C71EA49964EFA
-:1048700089FE9EEBDE3A95EB7BEA9AB8DC55D7C60B
-:10488000FDD6D76DE2F2BEBA103FBFB7EE31AEDF54
-:104890005DD7CEF5C773C53C132D211E6752178E09
-:1048A0001FC30F659FE03C31782E8DA886F6096FF7
-:1048B0003619DA8B3ADB0CF5BEFE4D86FE7D66843A
-:1048C0000CED6F950502538AE85CC363867ECEFCCF
-:1048D0007643FD5CFD850BDD6F654AAAE51FC8AF19
-:1048E0008302484F4867E9B5B2CA79F31AC197FD08
-:1048F0006BBD61AA6F71D998BF75BAE433CB26B18D
-:104900007E53CC3DB51D2E717EB2A1AF88A734FC7D
-:104910004CD4B76489F391C3AB447EA461A0B8972B
-:1049200044CFC36F7169F793F8C43D1A83F223FC37
-:10493000DDED20EDEFC139CB45FECC0D6ECECF378E
-:10494000D481F67D6284F31D1960F68AFBD5159932
-:10495000FF9E920542F5385F43BE5BBD85E44C3057
-:10496000D56BF6F29F960D99298F48E2899330ED29
-:104970009ADED1F2F2491F009F3BE886CFE7E27B47
-:1049800084DA2EBEB7A97F6D17E7E3B6FC42DC637D
-:10499000130FD78E5F7CC5F72A6DFDD95759C4D444
-:1049A0005BBBCFED7425C57E8FB6A52695EF5BD892
-:1049B0005A9BCBE728B6D688EF8D6510FBDDB2C8D1
-:1049C000C6E730B6D69ACD24274F2DB2305CF4F529
-:1049D000C7CFAB7FBFB94E3BD773AF76AE67AD766F
-:1049E000CEEA6EED5C4FB376CE6A8D763E76159D3F
-:1049F000EBB1133CC5B99EADB50B14ED3CAB7E2FAE
-:104A000003C35742F8F2772A56D86B1A07F4870C7B
-:104A1000196EF1DFC7665425C79DE7319EB74AF589
-:104A20000D30D49DF9C6F356C9434719CFA90E34AA
-:104A30009EEFB1798CE77A2CCE4AE3F9D058FA444C
-:104A4000609A566CAC27FC77FF7D477AD88FFF7E43
-:104A50005C37FD86F47340129D4349637ACDAC12F6
-:104A6000F499A17D0FE3864E2E53915EA874529E59
-:104A70005DA273902AD351F4FB37A5577A3ADFBF72
-:104A80000720AD4CFCF700F473087FD1ECA8A553C8
-:104A9000944FA71445E7BB7F8A723CB6AE973DC9D9
-:104AA00085FFADF2FF01C18CE32B00800000000008
-:104AB0001F8B080000000000000BB555CF4B1B41B9
-:104AC00014FEB2BBD144A35934B6865A481A520DCB
-:104AD000A4B06D37A225D2D5869283C8163C78E85B
-:104AE00021879CFAE358E86D635B904A24A9422F22
-:104AF00052C8C11E0A821EFC03621B7A8E680B52CA
-:104B000029C18AE7405B7A11D23793AC899BC47A7A
-:104B1000E940F2F266E6FDF8BEF7E6E50D68798158
-:104B200090A2DD137D40245A2A3848065468B930D3
-:104B3000305324E9A2FDB5AA94359114C0A9095CAB
-:104B40009ABA1E2F4912D9C9163BFDD4CECEEF8D8D
-:104B500031BB0126252EAF1F39000FB015B3E51666
-:104B6000FDC0C20E9DABC0EF315B0E7E96DC49A549
-:104B700032CA4D01917D69BDDE4BC02CFB49F17AF3
-:104B8000C73D0309F29F3180FC30BBF3D0CD745791
-:104B9000343BE5A33C427B4548E42F5284DC078646
-:104BA000AFAC81F6E7AFDE17258AFB6109B84CFB95
-:104BB0000BF652EC11DDDB1AEF945F28CCCFB4FD7D
-:104BC000299DCF5C1121325DB71F962855D860AB67
-:104BD0005C237EA25255A755A1CF0334E894F70C6D
-:104BE000D347EABAFB243029535ECF0FFC1B8591D3
-:104BF000BA5D805261FBB7B51ECF71376D8410AAC4
-:104C000088751C15B6EE36CB3F866FA360673821DA
-:104C100030BED43D21E7A738BD5F96BB183EB1A892
-:104C20008B25B2478C508F13CE3DDD8D73FC7D6795
-:104C3000FC7502078683CBA22173B9650C72796C6F
-:104C4000F8B83C3246B83C34142E4BC61897408A0C
-:104C5000D7B3D3061E2F63C47763C1F6F1645B59E3
-:104C60006775C78484F7ACCE432AB76BBA17253F64
-:104C70000D7C115DBC190A3D6F2799FDBB27028F82
-:104C8000B91ADDF4EAE166FBD56753E7E24E1B7320
-:104C9000BBAFECEDCF5D1D486CB6F0FBB2D6C740A4
-:104CA00096E711880B58A43CBC0EC529D3FDF4B679
-:104CB00093F7754871E49C0CDF9A0B3F4C1CD43F72
-:104CC000CB696A19829CD524997AEAD46F8F42F90C
-:104CD00034F45560FAE320AB677A223FA8138ED5EF
-:104CE0009B9FE786C92EB5232288E6BC5E6B369E65
-:104CF00097892B202982DC027F3B5C8F6BF618F2B0
-:104D0000F0B960E5DF7ADFAC3BADB4345A7BA2B4D6
-:104D1000125D898C4675D2D66D9C07A70FFC7D77F6
-:104D200040CB33BC17C80FB8433CE7238994AB9EF4
-:104D30004FBB3A997974D7FACF9B2C3B12846FF909
-:104D40001F7DD8672F3A58BD9692423CD7228FF5E7
-:104D5000DA9C5B526F39D97B44B8751EFD716B9F2D
-:104D600056F35991C83F9B4F2AF96FC1F737C67761
-:104D7000B59FF745AA6B46137CAC9FFB891B8D4200
-:104D8000F547904B116FD9A8A0E4E9FC97DAA17020
-:104D9000F796F9D0145F6DE8A36BCD73675B73551D
-:104DA000E74D1041366F7E0ECDBAF32DEA6B4A9374
-:104DB0004773EE34F358AEE24C567122DCFA3DD71D
-:104DC000EB355F1BEA488867FBE6EB797DD38E7F86
-:104DD0006B1FAC2475779EFE1FF0691FBE1B8C8F66
-:104DE000B3EFAF1D6F569E8EFF334FD6F3A23957E8
-:104DF0002E88F3A2F74CFD2FDBA790A6F00700004A
-:104E000000000000000000001F8B080000000000F0
-:104E1000000BFB51CFC0F0030977F3A0F2BFA3F161
-:104E2000D7F3A3F2CBB851F99E68FC2634FDE7D145
-:104E3000E4591820B4233BAA38B158988381410E15
-:104E400088353950C5F3A1E6D6002DE807E215AC48
-:104E500084CDFA2C05748F1C03C32920DD00C4D730
-:104E6000651918D8817C216906065F204E00E2CFC3
-:104E7000320C0CB380F43B20DE2A0DD1C707143B63
-:104E800027439EFBBB85C8D3378AA9831F28A1F27D
-:104E900067683330DCD66160D0D683F0AF20C9BB01
-:104EA00003C5666A43D831AA0C0C877419184E28BA
-:104EB00061373716287F18281FAB87DF7E572354AA
-:104EC000FE2E6B54FE4F4354FE134F547E9F372AE1
-:104ED000BFD107420300BDE0D98DD8030000000018
-:104EE00000000000000000001F8B08000000000010
-:104EF000000BCD7D0D7C15D595F8998F376FDE674A
-:104F000026C90B3C20C02404891AE8000182224EE5
-:104F100042B0C14DF181546997EA93B53622C81366
-:104F2000B1A6AE6D26DFE1AB8DE85656AD3E586DAD
-:104F3000A9D51A2D6D6957DB04D0C52D8548A9B5B3
-:104F40002DFB6F50575B16D9E816755D5AFEF79C1E
-:104F50003B93CC3C5E3EECC7CFC6ED0E77E67E9C25
-:104F60007BEE39E79EAF7B9F220640BF1CE01CFE14
-:104F7000B1E7452200CC197C462BA0542E07D8243B
-:104F8000048D70117BFE415AD91566DFC08A2F9FB0
-:104F90003ED8EE5A10A8FEF3456DF13EF6BD63EA29
-:104FA00057E350C6EA4F14A8BE53CF79DE0812402B
-:104FB000014049E76A35C1FAD934AE49C5FA1DFA4C
-:104FC000F695C0C63B53A28084E315656FDFD6001B
-:104FD000D03D0DE072D8AA16C758F998646C866C5B
-:104FE000E314D1384ED91F17A1BB14E8EF1CFBDF27
-:104FF000A62F2621C1C66D9DFAD59508B7D27D335F
-:10500000E811803BC6254167EF678248F3522A2C9E
-:10501000305959D5ADB835FDFC713A102F65D86BB4
-:10502000677C7964F0FD32072F0C1F197801B804F2
-:10503000408359DD16960340ED33FB35EDF1B5F8AD
-:10504000E8C63F7FFE7CFC19A0131E40ED8C272292
-:1050500083F06CF2F5774B0CDF5611188FB12A39BB
-:105060006C9C4A573F99E30DCC53EEF4ACFF74842B
-:10507000B380E621C8AEFE32E1996BD79BCB668E3A
-:105080004F675E390BF83823F57F25A2B800EB7720
-:10509000C6AD888B1E65CB83F7A05D5F33BDF586FB
-:1050A000C24F08F13307F163C5911E1D3A96C27ACB
-:1050B000630D9B4F8105FD522E918D096300F2F126
-:1050C0005FAC89ACE99548AF634C56977D1F1BB325
-:1050D0001A25F67EDC82B420B367041ED2DE0801F6
-:1050E0004253728E1A599CEEBB6677F431BA3D0377
-:1050F00091CECDECD92CB37E116FC723E9C71848E8
-:105100008D97A51EE963E588254353398D4B7C783F
-:10511000A77491B19991F4669BFE3B1A547AB63507
-:1051200068D0ED07686988D3F3FED097BE81FDD7BC
-:105130005B7ECDCF9E72D7ED4F61B9192081E345DB
-:1051400062BC7F9055ED310DCB6022DE2325FCF94A
-:1051500012E285C1F9558649C4CB0F6D3CE9D04DAB
-:10516000FCDA6C2CCF812CF8749EA1522F9F05F491
-:10517000206B3958F6C7F33C659F36DE531FA0906D
-:10518000F04665262AEA042E8F22722F180827C3BC
-:105190005756B960CB15499AD9DFCDE6179EA718A7
-:1051A000BB58D36D8297BFC6099C3ECA04959E31F9
-:1051B000E8DF7F0EF16288E9CD6CACE0CCE2AEEEC8
-:1051C000188EA91853D93A067D692D2F0B7F41B946
-:1051D0007CAACF81BBF8A3C78F24F5A41259C6FDC2
-:1051E000BDBD7E979F3DA222FFAB33C544BA0CE103
-:1051F000B5126CF2B05597459CF74707F7F0EB7581
-:10520000C2E6E73650A9BE8CEB553EB85E1D065B84
-:105210002FE49F72BE5E1DB2A58E66BD1E07F0E034
-:10522000253480972E8E97B28F182FCDFB5626B23D
-:10523000CCA3CD5E4F190CA394F0A0E808E7D646A6
-:105240004EB716A3DB6CF277283C4839C7E3C9B2E6
-:10525000F3F17E8DC0C75964F38983A74D865893B7
-:105260000E239E3A6B506E6D2D1145944B1F159E6B
-:105270001CB8360FC095E670957EB47049A1EE95C6
-:10528000D9F8B12D831FB720DC9CEE6A38DD891F69
-:1052900029DD397005901FF83A27F83ACB7F13EBD8
-:1052A000DC36B0CE49BECEF18F669D9DFD1C5463A9
-:1052B00025AE5B9DC6F890C1718B642937E0FE1A5C
-:1052C00012E03183D101C23F8EE999E1A697751DA5
-:1052D000E03E21C0F50D69554ED2056F9DCC749608
-:1052E00059F87EEB05C961E601695F7F9F0327E3FB
-:1052F000DFFAE38DED075C707E5188C408CE79300B
-:105300000FE17C27BC3CA71B86EEEF6483DA28FB09
-:1053100000DE6BB0DA0FF8CEFF7E8B04A96CFAE5E5
-:1053200083B65C00B54BA1F9DFCD787026E2E1824F
-:105330006A88B2F508378DC17940987D9CCFFAD93B
-:105340001D68945DF81D6A3E037875DA3175C79F54
-:10535000777EFBA1DA7D20241F11187E5B63623506
-:10536000C2A596401AD7C0BF7B59F778181ADED667
-:10537000D85F06DE21D7CDAEF74EB8A90D58BB6673
-:105380009F71506774D252201A4D300887432FCE38
-:10539000BA38781CEDBAFC6680BEB65E01A467829E
-:1053A0002ECDFCF3E9EA20D2D5C57F7DBA7AE36F32
-:1053B00097AE4E0A057FBB74A5D44BFAEBCCCE2832
-:1053C000924D2E27B5D516AD3F8ECDE492D439B38C
-:1053D0001BE525C4997DC68701919515CDE47A2FEB
-:1053E0001880FAAB5AE29593BE42AF9C8CAF34BBA7
-:1053F0009D7E37EB38AE42E3A27984E3CA61E80EC2
-:1054000044B1AC503F48CEE7A6303CC18335C5BC63
-:105410009D81ED869A8F8CEDD878A87E9C2BC276E4
-:105420007F9F93C862F70ECEDF3B4E7C452227114B
-:10543000197D7D08CBFA1B2EBC0FDD4E86371CBCB8
-:1054400030FA2F453F49C120FECDDDB791FF220044
-:10545000A241765D619B855FDBF1FFCDC77D9FF348
-:10546000757BE12C0DF52D60FB0DBEB784CF039647
-:105470003F1074E25B673C299C00A21BBBDE48EB3B
-:105480007F27F25316FE5E25727DE3BD2FA5FE1B1E
-:10549000ED416BB3A03FC6F07AB8E17D788DF1E5C0
-:1054A000EAEE0B15F47B5C2F8EA17AAB1714298BD7
-:1054B0005CFDAC066E1702F4C9CB22EE711BB91E5F
-:1054C000DA25EDC379BF5A21A571FF7BB5E27F488C
-:1054D0003F7FD594D288E4573BAECE194EEE1C6E7A
-:1054E000E0F6AC53EFB029D1FE7E58EE0B67D3E364
-:1054F00007C74FD3F8575548DE7D5AEE9371FDDF4D
-:10550000FB22F8507F3EDCA00AAF4D65C62FCE933C
-:10551000D1D1EA8A2205FD0E23CD6B89ED0773F008
-:10552000EBCCB3252CD23C5BC255E4B76AD1DE216B
-:10553000FBF10C7B8FF26028781DBF558BB63C2B9E
-:105540003E9408D7B7145F32BBBD69CFD72967FA3D
-:10555000B31CF8DAC2DC2E6A0B73B8DA62621AF98D
-:10556000BF2D9E7D5CE7D96CC3E7D46B8971BDB458
-:1055700085C993D1C02387BDF030B41D457FC94490
-:105580005BD6E4D7F6367E0EEDEC64D8940C7CD373
-:105590002B4C62E5097109366B6CDC9AAA8E6AC6DF
-:1055A0000279AB122F3230602C7456A21F70F217A2
-:1055B00037F67C8DCD6BC27CBF86EDF26A523DCF53
-:1055C000B176E399989358BBB1C7D7AD4339FB4F38
-:1055D0006827A220B66E6A443F560B0E7109C0C3FD
-:1055E000E2AA4AF4B3C9C0E502937ABA3C06FD3395
-:1055F00040CE99A1E403FB13CEF907DB0D85B788F4
-:105600002DAF68DE24AF960F2FAF36F2FE2DF61FBA
-:10561000CA9B0983E351FB71758A078F6333BE1FF1
-:10562000B0E9D20FCBFEAAE38C87E501D44F222B41
-:10563000442D8DF5A12B17FD5063D6CAD08DDFCB3D
-:105640003B1B99F81811EF4CEED570BF715258E61C
-:1056500082F79722F7334DBAEB9820A0DFD7602A64
-:10566000FD4C2CD7CFCC46A7DB6DFA1C28D7AC1647
-:1056700092345E62C954946BB522D9BDFFB46256B0
-:10568000AEBBFDFBF63883EB0FBA3C17CB7CFDE5D8
-:1056900015A21998F1A7AFBFFC21D73F7FA3E2D98C
-:1056A0004F3FECBAC8687B148CBCFE7FEE38CEBA94
-:1056B0009DCF1F5C3E4EBAAB3A80F2EFBEC4F07293
-:1056C000E5FC755B4EEB36660598E92C72252009E2
-:1056D0009E7DD579AA900283ADB3744C22F9268DB4
-:1056E0009DBB72270C3DAE145332EC37BB3FCBDC75
-:1056F0005FC2D6FF13E0FCF5CA28876A510EA15C91
-:105700002AF7BDEEF68F308C0F9619EEDFFAC2FE47
-:1057100003288F2C268FD07F9AF9BD16CB2E7AB80E
-:1057200042E2FBEFBEEFFEE202818D73C4F0EB7E3E
-:10573000F6EA90D0FB06F97D2B25DA8F113E752E07
-:10574000B607524E8E989259CDEAF7960BB48FFA5F
-:10575000E1A5EBFE91DA8728DED1BBE0B52F5FCA69
-:10576000DA7FE2321F720EC704B68FB37FA25E7378
-:10577000B6EFCB97B2FA872ECB1F56DFAAC5F9BA80
-:10578000E8E4AA67BDE555486F08FF7FBC59FB20D8
-:105790001BEF08E424FCF8ACE0F01D41F890EEFBB0
-:1057A0007EF506EA85874D81FC51472A7E16437BAC
-:1057B000BCD214485F5CBA4048FBB3CC73E982DBCF
-:1057C000264F62FD258C901660DF0F55BEBDF55249
-:1057D00006EF553F90B6E1F3F45EA920593634BC8C
-:1057E000CEFBAB4CEFFB01BD189216E21D341E97A9
-:1057F000F0C58CB89B5E07F418396166F3B7AD95B8
-:10580000B8FF51D00CD2EFE4B002388FA1EADF34F8
-:1058100004FDE6407FB7847038FAF7D9AB75B73C22
-:1058200074E050E44412C791340576A19E917B8DBB
-:10583000EE9E7F83C4E34242DC2478148DC3A3C868
-:105840008699CDDF546FC3E3F403D069B7EF87BE09
-:10585000F0207CAD81C44AF45B58B9DC7FD812F1EA
-:10586000FA03F7D8FD3CE6F4E783AC71158026EA2D
-:10587000BF6A4C858AFD3757703D490783FCE32D8D
-:10588000CC6E8461F4BAADB6BCD88CF10D3FC6398C
-:10589000343BCE11E7FA53F819F2939D2913C9AEA0
-:1058A00019AA9F88E1D54742A55E3BC6D15F027A1F
-:1058B0005E861FC8EBF7F18D914547EF437A1D09CE
-:1058C000FE013DCFAED72EA7542D2B9ED2C3EA7337
-:1058D0007F3DFCF1F6215F97960DAEBF14DE1CBA3A
-:1058E000CAEC5FC95752698ADB25E21E7DC09693D8
-:1058F0004ABE9AC27D01D4A1BE0779FB30FB8EF16E
-:105900008C7042477F8A043C2EA4221FB8F0F3B665
-:10591000DDEED3B268EBF3298A830A7A8AFC766AD1
-:1059200021E31FE1FC76CEB3CF6EDFFE87DB5F2184
-:10593000FE2850893F049DF14F96719A24F394C438
-:105940009EB74AE65BF8F4FD514A66E393FFB2E581
-:105950008A5A9BD0D5628A2B923D92094740E6FD38
-:10596000DEE4C06FA5284E395AF8DF1F25FCCE387B
-:105970000C7E592E20F87DF81C0A7EC986270FF46C
-:105980004619E59ACEE52BC032DDAD97DC28737958
-:105990009167CB2780DBE26E7BEB7ABB9FD1CE2772
-:1059A0004F1EDD7C9C71D97C26C97C3D26CBC3ACC7
-:1059B000C7441B8E1B65BEDFA9D5093DCED6257712
-:1059C00008BA5A60C39192455BAFB8ED43D1D5C5D3
-:1059D000A39CC782C1759967AF4BC570F3986BCF15
-:1059E000A35382F9AFA35E3CC5F1F72CF7ACCB1DF6
-:1059F000367E3AFDCEBA6CF0ACCB2DF6BC463B9F62
-:105A0000C5767F23CDE78EC1755966CF67F970F3F0
-:105A100071D5BFD6AEBFD2AE4F76C71D726913DA4D
-:105A2000194D5262955C30381EABF71977BDB79BA4
-:105A3000CF34DAF56EC0F7420DDFFF58BDD5EE7AF0
-:105A400060459BD03FD08AB602B3634A5A2EA9B2B2
-:105A5000DBD551BBDA81FE6FB6F983DA055A8426AD
-:105A60002B4CF5D661BDC6457F74EADDEA85F76249
-:105A700007DE0D046FF5001CB7BBEB2D9027507FA0
-:105A8000E7C51D46E90FF2C5921D18E7CF834827E9
-:105A9000E679B4C9A947300FC0B264780CF309FCA9
-:105AA00086803EB66845EA1B582FD762F635AE5B56
-:105AB00055EA292C5B22249ACB299F80F205EA65BE
-:105AC00055F31B987F61C00E56D662721AEDF356DD
-:105AD0002169E1BEF85329F96599E4ABB6AA11FB37
-:105AE000CFD7B99E0E7DB46F3970DD13BA8EF21F19
-:105AF00072195CE88F6ACD80EBFED0A41EDC6FEFDC
-:105B00002D50484F66065629CA973BA5A081FDF542
-:105B1000147C9EE0DDDEC8F31BB67FE2F304EF7D6C
-:105B20000250DCF63E1FCF6FB8C7A76A4D1AF617B2
-:105B30001DF759CA87C8D1FCE5361C08DFDF1513ED
-:105B40007CF9A055DE2890F8EA41FBB6B542217DEC
-:105B5000797B6C5625F557A1929E7A5F625623E9B0
-:105B60001D1541F2D1E7870DB25BA3F314B0B01C51
-:105B7000331A51CF8CCC0D620E0CE417022617405D
-:105B8000641AA4B1EC83CECE12F68C7630BB249F7F
-:105B9000EC26B811EDDE0A8677B4232CF328DA253B
-:105BA00061B0FFA44326CEDB374102F47B38EB1B08
-:105BB000ED1C683FACDD154D8FB25EF7E8EA453A63
-:105BC00098DD3F7B14F53A47592F3DCA7ADDBCDE9C
-:105BD00088FE0E83DB7B2AFB0FEDB640A6DD1CF6AC
-:105BE000DAC3BE8CEF99F1B8CC67663CE4A4EC8DC7
-:105BF000878CD4DE89838C345F744A0CC0298D5C19
-:105C0000DFD13787FAAE8CBF266EB2F6ADE33E1D0C
-:105C100027B9366E157F4EB4DF4F5C69973F6D979D
-:105C200057AD34B3C8F7B13E2E874BD11F329CDF3E
-:105C300001B8FEF80683FD9C80C94BC3FB4F32F5CB
-:105C4000DE4C79A7CA5615F2EBF604F76BFA9119F8
-:105C5000910F0B81FCB03E487596A09C0033BA783A
-:105C6000CC20FFF8CC174CE4E7C3E324102A687D6E
-:105C70000CF2A767D049265DF833FC397F2E9D7C56
-:105C8000CCE78DC7FEA5E844E99046C53F4AE72822
-:105C9000EBA54759AF7B74F5FC1DC2E8EA758EB2DF
-:105CA0005E7A94F5BA79BDB6F90ADFCFE17B4D662D
-:105CB0000983FB12D5536EBB24E8FD7E69D8536E71
-:105CC0009FA3D0FEEF94FD73554FB99DC979CFF7CF
-:105CD00079612A6F6AEDAE625BD9A8F9E43FFF44AF
-:105CE0003E295547F04B578819765B065FA97A0025
-:105CF000DBE7CB3A60FE547E8CEF53EC69A6B3E051
-:105D0000F7119BFF77C93C7F73BBAC07D07EFC5B70
-:105D10009F67A38FC3EBCC7724781DF9FBA664EBB8
-:105D20005B43E57D54F3BC4C1982949759526D56F0
-:105D3000994C2EC92FF2385866BFD729C9A77D2E96
-:105D40007B58D6923CBE67F7B7A44026BD44667226
-:105D50000DF51E05123545144714C9DF278747D8AE
-:105D6000370A5D72AB7818B8ED3C56FAA40354FEBE
-:105D7000968F1B3480E46B04FAC898CE41AD670A55
-:105D8000EA69BA00D4DE10B8FF7C8186FB5E2CF095
-:105D900097EE7715F52B98F7C0B9D087E857EE2323
-:105DA0007FE75FBCDF11E00D607EEFC5144288B96C
-:105DB000F37B7DF114BD84B3E7CE49738137A1BF76
-:105DC00024C5D765D1207F288C8F925DD61ADBA0A1
-:105DD000BAD7F5FF7CC51EBF89A2B5DD2644D9B36D
-:105DE00070ADD9370C9D9FC3600CFA470A6F34FB26
-:105DF00086D94F07E29918AFCFC2076D4A328DFAA4
-:105E0000BB3529CCED7939457EC676216FD6E67251
-:105E100017FD162ADD0857A4DCB4D0DE6BCF170DB2
-:105E2000D45365D8DA2BCC60EDA45A2399458F184A
-:105E30006C2F9F74CF27A678F5A9E611E8BD7504ED
-:105E4000BDC7A718C96CFED0690AB76B7DC1ECDF6E
-:105E5000EF12AB4A9439E7E38DA9F9DCBECD850E8C
-:105E6000E1639C7C28DFA1F08557100FAD0557C476
-:105E7000879B2F68DEBCCB9B4473A6323C1C73B25D
-:105E8000C131DA7C10ADDA203A1CD097629CAE5159
-:105E90004F12C660BE07FFDB56BEAB1BF3407C371C
-:105EA000F0B8AC64EE06F4533B7A9364064F88B4C2
-:105EB0009E0BB8FE54CAF52193FD87F3882E185E19
-:105EC000AF9632CACB14AF3ED4DCB017303EEFC031
-:105ED000EFF8F132E7758958756D767C8CCE1EBE71
-:105EE0008FD10B4CC378948A4881CE068DCA5F6EE1
-:105EF0008853796B834ECF9686527A6EC1A6F39102
-:105F0000CF531D450C6F1DF147E39F6555EE43D9F7
-:105F100041FBFE758B504FDE3C50666620837B3321
-:105F200006BC991E71BB72D522B4DF3707C0F62BB1
-:105F30002C5A647ACAD7345762D9F6336C6EBB9E3A
-:105F4000EADF3711EC7310A6FA49D7BEF788E223CF
-:105F5000FEC6BD85B7379BB1BF806C97E1B645DE05
-:105F60003298084F40E5E5FDCA06EA9F44001BEF62
-:105F700027CAED7CBCA9DC8F0F65CB47C023F7EBAC
-:105F800083A273F9599647F92C8A61A0FB15EECBD1
-:105F9000B5E11E6D3F7292EF77C7B2EF97837C3306
-:105FA000C2BE66C331D2FA3374D87E88245838EE24
-:105FB000CF791CF1AF3DEE7DBE0F8717A5A2DFC2E2
-:105FC000F3230B94E4F791DE23665777112B476B8D
-:105FD000BB2D62DF518E7BAFA2D9F34E12FF3B780F
-:105FE00076F48EFFF279D7D11733290F2910E6FC0A
-:105FF000375A78FB50BF9A33D80F3C51356E387DF5
-:10600000AD2021A21236202FF26B82688C0D947382
-:10601000CD3C4F39A762BCA77EC428F67CF7691730
-:1060200079BEFFA9EBF4F38C79FCBBAD373AE51FE1
-:1060300067CE7394FD3AE59EBE4562295B87976BF8
-:1060400025D2EF5EAE7DEDBED9584E4814BF3DB3AC
-:10605000B2D9878C740CCCC81CF4872525DB9F6EC5
-:106060004E447CFE1CFFC9C67B09F73D269F8ED897
-:10607000E77F989C9888E79F8E5C366F22AEEB1185
-:106080001FE76FB03A493EFDCC071E79F0335BFE47
-:1060900018ED3B9AD10F794CE065A97DC7228BE2C0
-:1060A000835BDB3ECEF496AB390A6179AD90D51EA9
-:1060B00088F815C2C7074232E267F334ABF5D61849
-:1060C000E6BFE940FAAA1F12A497D5835529A2BEBC
-:1060D000C3E88FE2DC727F6136BDE367F67EEE8750
-:1060E000AB49DF5F5E9BEB4363DE5F33D3877ED4D8
-:1060F000AB6B2A7D60EBCB9A0B3E3121D0F9A91511
-:10610000B5FE5D88D715B2E9CB16D7BA3AE1F7EC00
-:106110005333190E11FE63F6B90780FE4277BC694E
-:10612000A69FDB3BF192E1ED05076EA7BCAC76E6DE
-:10613000F38807866D3A8F026A7FE1751177BF2178
-:10614000272E1CC17E5F5EF90F7C7F6674817EC541
-:10615000174F7CCE4771D915F91EFE5B5E2D79E095
-:106160004F2C0879CAD7D45E9D33ACFE91F467C832
-:1061700033CB3E8729921CDE7C5C20F99033A93F0B
-:106180008D799AF0B2045CFF73FCAF9790FF353ABB
-:10619000A15F477D017E13D21E73C9CF169B2E8748
-:1061A0001AFF393FD76BE5BC1A8A6FBF7742D071AF
-:1061B000BE425EFD349CAFAC984D386E4B9198C694
-:1061C000B8F79DC5DB555CEF4D251F4E0FF4C57824
-:1061D000BC5FB7B459C8FE43B54B9BFC1C41E6FB02
-:1061E000B57E1E6F69B5966B25B88C07B44A9C7F47
-:1061F000A010B29E3365F4BFD68F7EFB98053CBEDF
-:106200009E20BDBA445D4D79B8F2F8E1E3B59978C6
-:1062100093ED386066BD276D7A2CA9D845FDBE7711
-:10622000E1F0FD3A7879DF10A1D7D627B0BE0A6C2D
-:106230003E0CFF5B4A791E6E4BD9338467C9AC2490
-:106240007DD6A7A54CACB7A56C35D1652BAB93CF4C
-:1062500086CEADEEA2739A5BFEC0E3134FB61F6805
-:1062600046FD614BCFCD807995C1781A507E6C99EF
-:106270007E938A78D8B213A017E958EE22A75CC89B
-:10628000F687873448334B0A426526A05CC8D3F8AA
-:1062900099CA7DF12AC075DB520E06B2667E3AD5E8
-:1062A00088A19F2D711EFF0E969A354508F73891EB
-:1062B000C4800EC90E2CB7D4CA348F368DE303EDDB
-:1062C000AE734E7E17E6C19470BBAB04FDFBAC7F92
-:1062D000E58B7CDEFA8E12F2136DC97DD9447DD731
-:1062E000FA04185381EBB5A427C88C8EB0FF7A2D21
-:1062F000EBBA6F1593DFF2BBE2F7B2A60B48A79992
-:10630000F879CF0757E2BC5B668AB02B8BBEB1D75A
-:10631000CFE3756963F955C559C679CEAF7BF204F1
-:10632000F4F715827BA8FA83F564F2EBA3E1B1845C
-:10633000CDA3A086FB4B21E31C6B0C9264DF8E0582
-:10634000AB11F9D139BF3AA13AF1CB247B4A91156F
-:10635000944F37D4795627CF7375852D9041BFF66A
-:10636000D76CBE371FF401E2EDF2B38FBC80F95257
-:10637000BE0ABF46F955D0F902E66FDEC8D4312C0B
-:10638000DF7C7CBA82F93F2F8F97303706F9278A56
-:1063900074F81688947FF6161C8DCE76D1F9297B79
-:1063A000DF41C98A72A43997CF4B0EB7F54A515CC9
-:1063B00077D9EA73F2F74861E279ED1066EF55CAD2
-:1063C0003E6A24F9D7C1F3859CFCC8CF767AF3875F
-:1063D0003EB7C35BBE09968F41BEB989297469D6A1
-:1063E000EFCDEEBC2F36FE313FD70F3E07A936DC8E
-:1063F0007FDAEDFC9875DF9FAE205DDF3C5B2BC242
-:106400007318CE3C7EEFE776E849C6A7BA8BFFD774
-:10641000C4D2949F9C39BFB7F62CEA4EB2F26BBA45
-:106420009CE276B6779EEDBEDEA598EF656DF3D95A
-:106430007A8337CF71CDEE4A13F3C518F6F47C6F2B
-:106440007B82FF1F3ABCF31D091F99F377F4C1A1AA
-:10645000E6A3EC16B2E6FB85546FBE54B3CAE38DD7
-:1064600066B30C8185E79F8FB6AA5274BED96AF2D3
-:106470006BCD318A4F52FCAF9E110EC6F7CA559DA7
-:10648000FA792F30290D740E21350FF5A33FB7DFB0
-:10649000F92AE7C3BF74BF0B8780779DDAA7207FF7
-:1064A000AE973B6B84E2C1F301019F654E60F8F645
-:1064B000EF5DD63D013CF53A4659EF201E811E4561
-:1064C000BD1A7198FE4EDBFBD6BF3DF12F0AEEDF01
-:1064D0006F3D7E6229CAB95BFE550295D53BFD44EE
-:1064E00004BA69DF492B2897D7EC9168FD41EE9EED
-:1064F0007BB527DFBE99E67FCB5311DA1FD63CE38D
-:106500004FD7B2F66BBEF7DA0C607C7BBAA9FF8579
-:106510000988BFC7059EC760F5CDB89ABD5F23C384
-:10652000F5D9F2106E50395F9DFA416825EEEFC241
-:10653000EE9EEBA8DFAE6B7D7E97FC5DA9727B9A29
-:10654000D533F1BBF54D213D55E0F065CBCB3BF5A7
-:106550004DEE4759B3D797C63CC535BB772A495648
-:106560006FFDEEB789BE173DF56414F1B07EAFF74D
-:106570003CC22D4FFDA1ED92723AEFD45F8BF24FEA
-:106580003A4BE533A6DACFF3E0B93FE656E2585688
-:10659000EF3B6F5EF16BF6FD645C82001329277B95
-:1065A000FF53F9572C27C32926CA58FFBE57DD7C55
-:1065B000B87EF76B74EE481399027B299E87C8F862
-:1065C0009E519FE9B90ACAC3F55D9BDE4679B97E43
-:1065D000CF5BBF42BA5B0FF2AB6E7E3E89FF18778E
-:1065E0007E3C6B93EAF5D39D814373C901B03B3F79
-:1065F000ABBDE8C4B31CFEBEE5C9330FA31E71EAF0
-:1066000099FF7A18EF6758FBC7FF7918F35AE147EB
-:10661000010DE5D6FAC77F1E0517FE1FB5E5C3E9D4
-:106620006F7EE3EB0F303C9CFEA59FB076FAB93746
-:1066300027E13D1DA79FFEDF31A87F6C7C6EF158DE
-:10664000A4B38DDF5D3476B873A048B769BF7B7D96
-:10665000D3FC7E83BD026E8200CFDACF8C7581437E
-:10666000FD0AEABDEF0AD0BF3997BDEFFA8382FA7F
-:10667000CB0B26F4239EF6EF79ED85BB58F92DB6AA
-:106680004EFE2CEBC4E63F41A4FD8DB10F7BDEBA7C
-:10669000E7EAAB2E2BC7A7CFC0EED7433FED1BE7F2
-:1066A000ADEF31B6BEE583EB9BF9FD0C9C5510FFB9
-:1066B000EB9F60EB3903D795ADE78CF3D7F32DFC57
-:1066C000C7FCF3D773BFEAF5C79D81B58F3C801F28
-:1066D000F7E467B56F9DF55CF7DD4F0EAB973BF2C6
-:1066E00061243CD3F95E06D75754F3672AF2ED33A1
-:1066F000DFFAFA0331BECEB50C31A79F3C33090F48
-:106700006BFCD6D77F1DE2A1FF39BF867AD49AE70A
-:106710007E417C77FABB2FD1B91EF61715D87E774C
-:106720001A06FE8E022BDF2AF0C23ABDFF8A5FB145
-:106730007ED7B12E2C83D6EF8A5F95E3FAA9FDB4FC
-:106740001EE965353ACADF7401CDFBD634E78F5BAD
-:10675000D33D2BD09F9D89F748C0C9271C5C57F4B7
-:1067600097DEBAE7C415487F43ADA7337F0DE73FF7
-:106770008F7D7FD4CBBF43F2ABBDBEA777BEA7A0B2
-:106780007ED5FDAF8A26323BFFB4AF5F198FFBCDBC
-:10679000D39286E78D33D77D10FF4D59CF1D673ECD
-:1067A00033E9C31FC81EBF76F03412BF8F3CBF0F42
-:1067B00087BF33F63E9C89C75367B3EF075302DCAC
-:1067C0009EBB153A6B50C5CCDCCF7C90B226140D25
-:1067D000C2DBD625919C3FB59BFB6932E5C5AD4335
-:1067E000D867339D71F6F6CC40B9766ADF0F6CBA84
-:1067F000E4747FEB132714CBDE1FD22EFCAE1FC236
-:10680000DF7DA9DDDFFA67B3F7B7FE89B7B3F677A7
-:106810005236AF45F84FF6FA282FE9649794D5CE53
-:106820009D1AF079F4AEB6C8DC5772583B291AA409
-:10683000BCABE626F317E827B58EFA6C3F80F15B18
-:10684000CCB76A8E04E99C7B73F426BA2FC9E9AFF2
-:1068500025034F723C41F6931C4B94F31858DA63AE
-:10686000C7F81841B8E106D92A44BDFF70D19B3260
-:10687000F67B04F548975D7F4486D6FC723C172171
-:10688000188D90C5BF91D17F628104BADB4FD83D8E
-:106890004EFC3D6BEF3F26A511B5F590EAA67301BE
-:1068A00085D0F55896FE1E6AD0C97E2E4A5C4FFEF2
-:1068B0001F7F2A65A2BE56B8512B16F5A1C79D9819
-:1068C000F2C6AFC733CAFF3D8E73D047FA20EC7EC5
-:1068D000FCF1C7C7F02D05F5F217F0C9E4DFE57547
-:1068E0007A21961FB2E7CD7880CE314EB41232CAEB
-:1068F0003921B64C46FD62712A21AF76ADE7E298A8
-:10690000301EF7D3F410F7407D3FC0F7CFC6C66BFB
-:10691000288FFDC12F8A44D70F063E5E887C7620E3
-:10692000775E18FD6B3DEBE61E9AC6E09C10960064
-:106930004DCEFDE1E1CF6D3E6CFB1776D9F70F3DF3
-:106940006AE7977FDDC6DBEE86527A3EDE60D0F7DF
-:10695000271A2AA8DCD55043CF671A12F43E7A577B
-:106960003089F4B9A76125BD9F006F0BB8FEDF6BBE
-:106970004852F9D1402EC13FF96E1093ECFD62C42C
-:10698000477870DE0E3C69DBEEFE7EE0C72DC8174F
-:106990000378CCC0F7E5D02BA8E8BF8A093AAE7BD4
-:1069A0007D40E779AE19F89DE4EF17302E577F3719
-:1069B000CF877858F09E77B8DF96FFDFB1F9F4DD26
-:1069C00068F2C9007BBE53B3A294F421D0CA906E82
-:1069D0001E1612478C22C2B3E7DCC9FABCE4770268
-:1069E0002EFFF0A40E6ED7EF08D8F26D2388486F03
-:1069F0001353A023BD39F3DE57A917A25CDC270887
-:106A0000B4DE486FA52E7A1BA0DF809D971CCFBEF9
-:106A10008F0FD22FE7FFF825A5F754235E3688E4C1
-:106A20000769C64FAE761FD874C4EC16D1427AAE51
-:106A300013C99F3BF9F8096112834FD7BE15C07B7C
-:106A4000BBE293C0F637750590BE1EACE3FEC5AF42
-:106A50001DE7E798CE6C2C5E368DD55FCAF083C1FA
-:106A6000A8BC25251EBFA5737EE16B6A22471BC605
-:106A7000BF9599F776FFE42FBD9FC3C699703CA4DC
-:106A8000E379987B26FFA84761E5F17D02F993C67B
-:106A90008753D3703D2BFFDF37C7F5B9D6E181753A
-:106AA000A9C9A837B64DFEB6807C30FEEC8F05DC58
-:106AB000474AB4E49BB83E1364FB9CB09C9A87762B
-:106AC000C1F57989DFE1FB4461FA53484F676A36C3
-:106AD000FE1BF6EFC421EBEBF5DC692EF990799EF5
-:106AE000E2A1D4F0FE4C67FE0FE1FC87A9E7CCDF02
-:106AF00059BF3335B1B5281733F199D96FDE9215E7
-:106B0000C38EFF907D8F189BBF3FE8926B85A93E97
-:106B100019DB39ED878ABB66CE77C04F34CA386D32
-:106B2000970FF2912E9EFEBF49DF3902483A0909BC
-:106B3000FD53FB02C97108CF5C4851994947CA67A8
-:106B4000377239FF3E30E6EBE388EFE47411E57D00
-:106B50008C72BC5648242A719F334423DB3E303D5F
-:106B6000C8E97E01A4C83F2A86EE1E3ECE5FE88DAE
-:106B7000F36F059A0458DDAA1DFF0059437FD841E1
-:106B800098857EC8FC20E7F74A99DB97B30FEA3B6C
-:106B900025EEB79296455CF8B3FD763EDE3583FB75
-:106BA0006ED0743CF735B34770F1EB7BA1E4C220A3
-:106BB000ABAFC4B93FD2174BD279CBC55258247F63
-:106BC0006E2797FFF590502FE47119C079EB1017DD
-:106BD00071BF7F68233FDFAE6B2182FBA1984EE53A
-:106BE0007A5B4FF9B14D473FB0E5FEF76D7AF92E6C
-:106BF000CA7DA49B3EF3400E83EB3BB6FC7FDA9646
-:106C0000FF4FD9F27FCEB13EF86639C96303F39ED8
-:106C1000BFBC3DDE84D37CB2C1A47ABB1AEAE8B91A
-:106C20003F77ACB897D57B74A3B80BF9F9516DECED
-:106C30009578DF55DA140D81357EC8DABE28CAE0B2
-:106C4000DFA90A143F7BB82145ED76AA7A938AF131
-:106C500014662D5B4806F5BD14F6A8FC6DBF56C33F
-:106C6000EA7DAD33EF4A8CC3DD5B23533B878FF462
-:106C7000391BB03944F3FC4164ABBC826E750ADA4F
-:106C8000E91B45EAE72B81CFA88BD873E2C4A3EABE
-:106C9000C7755C8C13668A7D5FC4908CF3A8E8EBA3
-:106CA000B3B05CF27A98F2B5E7BED2074FB3725137
-:106CB0005D84CA132D2F5F4CDFD367753238269E53
-:106CC000E2DFABF37E6775B1FA391BA2D45FD5EB77
-:106CD0007D02D2B3AFDC7BFE6A87EF97FB236CFCAF
-:106CE000D8A1848078DB27688B3025C4FA143F7FD5
-:106CF00033F62054E1FB787409ADC3F66011D1CFAF
-:106D0000D75A8EC66F463C6D8CB5A099B37FE3060B
-:106D10003A9FE0DFB891EB4129EEFF9E78C701E191
-:106D2000732EF950D82267F5DB6D0FFA799C64E376
-:106D30008AC4340EDE8130EA7B25DC5F59D45AEDFB
-:106D4000C96B72E2231F08C9ED41B29B789C44D6FF
-:106D500052F4FE32097545F6FA4E91EB4989DE8010
-:106D6000DB0FA3DFC1EF67CB8463575026385AACE3
-:106D7000EA3A9417DBE6287200E19866DFCF62C733
-:106D80002107F63121B9CB2DD7648DC33591A132BE
-:106D9000847077F77EAA8BF5F37ECAD9C7CC20E939
-:106DA00049F788C41F5BCBF939C0FDC63BDD78CFFE
-:106DB00085C34FAD8648FCBB5D16D202EB677B797D
-:106DC00071EE85483F31DCBD69BE2AE2B944F6F177
-:106DD0001C0E30F7A15FDC8F7E71B6DE25C743271E
-:106DE00044F2FF79F3BF8B2CEFFA8BF5DE73771348
-:106DF00099D2E3CE57064634037446FB6BF5BEFFCB
-:106E0000407E5819223A03CB8C568EC1F445FB4F75
-:106E1000AAA5F3CF2519E70C1EB0EDF787ED738413
-:106E200070F63640B9F5807DFEFA81B5625067781C
-:106E300079DE3A4AFBE6C4FAEE4A0ACC687E4F7E17
-:106E4000B5FF6EAD09F7D7A294374FA832232FA80C
-:106E5000E4CFCCB33E1EF4DAA9FB4E060DBC0F2FD7
-:106E60007D4C32509FFDF25DB349FE596BB8DE9206
-:106E7000AECB7B00CFBBE40B60E07BA75FC77E7D22
-:106E80002798477C939ECFBEE730B912E95A5287C4
-:106E9000EB05395A530CCF43DF09DFC6FEEBF8FA96
-:106EA000571602DDAF5318033AE7CC9E9B2F40FEE6
-:106EB000DF28624C1CCEA19C4739AEF6BE88EF732A
-:106EC000AF14E9FE9CA216EB429CE7BE4BC68F476F
-:106ED000FAD81AE6E75E9A851468086F01E7879D7D
-:106EE000916ECA07DD562342135214C3A581FDAC2F
-:106EF0000EEEA23C1684770ED11DE95D18A3407EEC
-:106F0000B46E08F27DE7AC7521FA95A3A1BEAEFD83
-:106F1000AC9F70BB62EC62FDECACF4DE533735C461
-:106F2000F7BB404870E2FB81107B9A5B81F216D977
-:106F30005C88BF195F5940FB8246769513DF8FEE60
-:106F40005B22164DE7CF6217FFEEB2E56CDACE5B3F
-:106F500078D8DE3F1C7DE301DB6ED86AEF1B45E687
-:106F6000554D0AD26D1DCC443C95ACED125667B31D
-:106F7000EF3BBC7235935F2667F24BCA7B4E75427E
-:106F80005DB1E77BC4B8C8F39D4231B8EE6CFF46F3
-:106F90003CB707CA24D4FB6643C274CB95A1F6FF65
-:106FA000FCA03923F421F49F68289142FD3353FF5C
-:106FB000BED45E97EB0289F9B81ED14B56521ECF54
-:106FC000BA40E252EA5F4E0B284F1760BB58567822
-:106FD00029F96B14F0567F18784136E83CD79D921A
-:106FE000739FADF73C1764DC5F9B793FEDC2FFBB3D
-:106FF0009BEEA76D1598A287E51CFB7E5A3FBF9FAD
-:10700000B635C2EDAE563B8FEA561B0FD787F87DDB
-:10701000AF6B6D3A5D18CA7EFF91E3F74AA16CC071
-:107020007A63B3DF3B861A15F6B77042F6EFA91004
-:107030008F3B2E9C3CFC381B701CD6CFDCA0B92E9D
-:10704000E4F2AFCC0E99EBDDE5DB43767E919C203C
-:10705000BDD294F97E5814343786E6B8F06B3FF30E
-:107060009694D379BE33F6793ED66E87407895B440
-:10707000D1E0DDD1FF5B05FD1E92833F677A5F960D
-:10708000F5782F18B5C49CC17894A31FED0E717BC1
-:1070900092D1DB263E8F34E5418741BF07EF8198CF
-:1070A00080F770EBE85738FEF0BFA0BCBDACB70668
-:1070B000F5A7753F94E87EBBF3F0B596D19D2B1FE5
-:1070C000C5793FFEFD0964074F9692F7875CF6F19C
-:1070D000F8BA7E05E91DE1AFE6F0F3FC69217D21F8
-:1070E000B70780E238AD37C73DF98499F6481EDE10
-:1070F0007340724521BD2E132EC79E70CA99E711A9
-:107100000EDB74847FFA18BC271CB8322B9B12F25A
-:10711000D71C48D2731EE8F464764B17CE83F19FD8
-:107120008E703685265D8AF3F82BE2ED47A1397F14
-:107130007B7873E8B82879F9001D67BBFFFAFE5029
-:1071400094E46DFDF108E9FDD17D5F20BA96185DEC
-:10715000076283F932F560E7D187A10BF5DEA264FF
-:10716000039D0B3DC3E818FB95347E8E55062D819B
-:10717000711B29C6F9C327976AA2867159CB8F79EB
-:1071800007563118286BD11FE986B73C9C7CD38DFC
-:10719000C73B8FDF43F2F6BA40F224AEE79D259657
-:1071A0001F353B971C3EE596C3028475E4BF856797
-:1071B000F97E5999D465A487458CD311EF8B214969
-:1071C000E58F8345CF2590A6E7DFE19546A4C7D993
-:1071D000E716BAAF15DDE71606F2B9CB9D7C0E1E99
-:1071E000A72AB0E9106C3BF5F995CB1B17B3F1D981
-:1071F000E29B188FFAEA4A9ECFE39F27D3F9D58204
-:10720000BE1B6A314E042BB85EE6E441E4D57AF544
-:10721000B4F3EEB73AFEBBE3D82EF39C9CA3AF6564
-:10722000EE5BCE33535FCB0B673F3F39D4BE931930
-:1072300057A8C77F72FBD5B6AB1339EE7BE3339FFC
-:10724000871BFA5B0EB8F2CC8FE0FD4659F7011EA2
-:10725000EF8DEEFB5DED8A72BA5FCEC094C9DE861B
-:10726000EE85AF4F1DB483130B729F477F74A23A14
-:107270007796C4F0BE34FE6ECB817C806566CFC24B
-:10728000D75DF3ECD518B459F48481F14CDF07EEE7
-:10729000FDF72D85CB97567BBC881D1F6B172D3FA7
-:1072A000F1ABED7FFB7D21B7D31DFB3EDB7C5B08A3
-:1072B0005F7D61A487A1E6FB0F61BE9F8E5969D0F7
-:1072C0007DF9CDF67DF9CD139DFC2D43437DF2A6CE
-:1072D000702EBFAF205C42F1D5E69EF9E44F2E3808
-:1072E000E4237FFA981549C172ED8BF73670FFEBF6
-:1072F00057987E87F9205B985E87E57D957355B436
-:10730000176E8FCCA278EDE606C3932FE23CF13ED8
-:10731000BAA4CBBFD79CA8D230DEDB523B4B45BBD7
-:1073200043FA443995E50B677556317EFECCD61984
-:107330005714605CA28CDF47763D2B3796303B3A82
-:10734000CCF7D9C3C6EB61C453555877E887D6D17B
-:10735000B72269FA502EC4B52ACC9571DE834D5FF1
-:10736000EC3DE9D76F29C99BC36CFE87ED7BB1DA91
-:107370009554E986323C17CF040EFA8955EE27441E
-:107380003A68993D08F7061BBF97D8E33281243E3F
-:10739000ED5A3F25CED7AF5D84BA6CEB737798EB8F
-:1073A000372D9AA90D4B479AFC81E7FED0F218CFF2
-:1073B000CF8F313A72F1F3F9F4CEF9A93C9C680908
-:1073C00017A05C84D214CD3F4CF287DA4983F7587A
-:1073D000C6C36607D63B9A6BEB2F853C0F9ABDDF81
-:1073E0009243F34B917C77F4C17699EB73A3D50765
-:1073F000F3966C247DF01DC65A649F7D6223C9ED0F
-:107400008D3E95EEFFDBB740A67856740A5CEFB66A
-:107410005BA4887DFF7F84FBE5F17712D2D3B8DED1
-:1074200083E73CA221A0732EFD13797E693BECAC6F
-:107430009942F04DD5DCFB59E544EE67D85615ACC2
-:1074400073FB1B16E6F278D98BB995BFC3F9978504
-:10745000D355C89A176BD087F93450C5CF8F09859B
-:10746000FC9C8D0F0C95F36BB586F7860A90A4F300
-:107470006743AE1F78EF177D5C4E3705116F31EE15
-:10748000D789EC1028694FEA32BBF1EC4E7BEEF263
-:107490001F223D32B967207FF7CC0D92BDF76E8F6A
-:1074A00042F6E7BB37C3AFD19FF4AE2F072CB654DB
-:1074B0003F12C55F3FC5E6DBCF987517E67F69FCD5
-:1074C000FBCCAD02F99B7EF4417002D2BB110511D9
-:1074D0007FCF6229D32778922084303E1B5D04DD64
-:1074E0009763FB9E30E1CF17FFC9C2D767D3FE1366
-:1074F000122BF0BC96F820CEFF9938E461FBD9FF3F
-:107500005B25A1FFCAD187BEAA258F22DEE6815561
-:10751000D7C3DA6F53387F6DCB53D218A79C552051
-:10752000921E02BE507A2AFBBEF4E0EBD598DFB97A
-:10753000B46226D6C4F169BD4BB4E4719C77B5B68C
-:10754000AC3A97D52F3FA693FCBD227EDB012CCF12
-:107550003DCECB3E3FD7E3518F719F0F58FAFE24AB
-:107560009AD79B61AECFB6C4CD5E531896AF32EEBC
-:10757000E5F59E2F70E8806DEB3AE6A5D3BF75A2C6
-:107580008BA44F1CF43F4185619F3F71E8C1143EBD
-:107590000C3DEC09F37DA11DF3CD6283F966EDB6D8
-:1075A000FE36DA7CB34C7ECA5B22D33ABCC3F42DE0
-:1075B000BCCFE37C3EB98DEEFFCCE42707CECDE512
-:1075C000793194C30EDF68F3EE26B9ECBF41A1FB1D
-:1075D0004C1D3E72F8E7D29C013EBA0FE5C58AB059
-:1075E000BE98A76898E0E693AB47E0ABA5D07F20B4
-:1075F000C6CA4B65B07298083A3CFFB725935C7CCD
-:107600009289CFA50B0478D5230779D9856F6DE0D2
-:107610001EE02C76F250EB7254E6E71E1C3EC5DFEE
-:1076200063C1F3631DA201B81FB5E7AE36226CDD5E
-:10763000E4DADCB5C80F5B84440AF92132EF54E880
-:107640002686F777C7302D12FD87FAEAA788DF5F15
-:1076500009915DB66DEE1A8A4BBD7B737232EE2FC7
-:107660009B18DE5FA5FD3C3D56A45CDBBEB13C6FC4
-:10767000428FF36732CEDF83FD3D6D974DBB5E1FBA
-:10768000D563EBEB919B3F8D723EF86994EF539B72
-:10769000944E15E9A1BF48D5B2E52BA722BCFEE563
-:1076A0007E28C7FB18D968941FD0AA4A353BC95910
-:1076B000C2E5C4E5534A77B9CF5739EDEE6DE822FC
-:1076C000BD6653C35E7AE6D7A601F3E882A5968E1F
-:1076D000FA87FAC74502EEC770118FCBE3FB4697D6
-:1076E0005EF7695BBEAB785F101B4F6DB274F7FD40
-:1076F000B4AA2864BD47E84894FB89D526A0EFEAE0
-:10770000BE7FA6FC85FC1243F82C969B3AE9F765F0
-:1077100002DDFC7DACC4146E74F51BABEDF2ECA382
-:10772000AAD82793DD540F9A8546A0DC578DFEB961
-:107730008EE5C14ECC6BCEA437FC7BD54537EA1F16
-:10774000AF26FD098E72FDB5BA58253A6FAD577652
-:10775000A2FFEFF7B12ACA67EF88089EFC02E7890B
-:10776000F177A611923FCDF2F338BC358DC7E1B168
-:107770008C71787C621C1E9F1887C7EF1887C7F230
-:10778000B71B4C2A633C1ECB188FC732C6E1B18CA5
-:10779000F1777CEE6DA8A3E70F1B52F4FDD9867A32
-:1077A0002A5F6ECB5728E5BF07D6F105C5C4FCA9F3
-:1077B0006E7B7DF69BCBEB7E86FE42881AB8AF07C8
-:1077C0000E35BDF2EF7699EEC98E17E7A3FF126270
-:1077D0002260DCA12DBE9DE9A283F30BC8F7824E87
-:1077E0007177AB0EF31EBFB1ADF70A99E91F25F112
-:1077F000DBAAF258F9C96D2FB7619EE9057AE3CA91
-:107800009DAEB21E99B5E6696DB03CB96CA71C641B
-:10781000DF9F89FCB20DE54520C6F5C367B7FD9A29
-:10782000F4C3EE62A600A1BC2B52D248EF37E23A75
-:107830004DC579F07CEEBF83E638E6F94DD6955913
-:10784000C8A7AC7E37E78F51D6C760CD9CF3DB0D60
-:10785000574F2C1F553D3AA73B643DF65D18A69F38
-:107860005668D67A19EC5B7C7C1FB60AB89FB8C301
-:10787000C7E54347803FA7E438F90D55CDD102CC89
-:10788000FBE17CDC11E0F713F44F17E9777BA05E96
-:10789000F87BECE7F3E341C3FCC859D38BF3D14E3B
-:1078A000F8854D0F532747F8FEFE8F2AEDEF1F9FF7
-:1078B000FC644B1E2B4FFD17C3C0FD7A0B1841947F
-:1078C00027D6562E4FBE553E256F19AB7EF19CEF45
-:1078D000E6A17E3CCF964F69DB8E696CBD6932DADA
-:1078E00011EFBEC4E5E31BB67CD9E9EB4DD17ACEEE
-:1078F00009D3790B804ED25F1AE332E58989E3F828
-:1079000053F1699FA6FB335B15BAAF49F9C33C95A8
-:10791000FCAEEFFBEDFB8A7B49AF5102492D97BDD1
-:10792000EFB444F253346BC134DE9BB5253C8B7EFF
-:10793000BFC12A93296EB6A58CC77F42916BE85EC2
-:10794000ACAFF404A87E6B58A57CE174D99E835536
-:10795000317C8A1AEA07697339DD636969A246795D
-:10796000C7EC5FF47D6D8CFC4174FE18BFAFE5F190
-:107970000ADFD843546EFEA446FD839DDF4F2A9A4A
-:1079800088BF2791E8F1DE4BDBFF938FA1BF640D29
-:107990003FBF32435BDEF31CFBDE62AA8962C60F87
-:1079A000ADDA3BFB42585E05144F0D4D7FBD298477
-:1079B000F56FD40C9EAFC5CF4B807D0F724BD98A2B
-:1079C0009EFFC0FE578660AA81F5AB55E4576881DB
-:1079D00017F0DEAA428288BDCF9D25A0DED65A4B85
-:1079E000D77332F8BCE70C5AF2AE54916EA4A57965
-:1079F000344E2B982AD6B76A65DA3F0BC36A37FA3A
-:107A0000170A6DFF84230FF253AEF306EC7FE3D722
-:107A1000CA9EF308636FF4960B32EEE12DB7E927A7
-:107A2000136F99F3CC8F3D938BF0E4AFA59313E7DD
-:107A3000C17F6F6CD6329CD7386D9FB0B39C4C1F02
-:107A40004DC77BC821D5E8CED7F873E19D51D6D27A
-:107A50008BF4304397416778F918F43761FF5B6C1A
-:107A6000FAEF28F2EEE3BFB0ED1FC6A76BA37330A9
-:107A7000EE2182E5EA1FE322960B9E291D799EF2F4
-:107A8000D4CEF19EFAD376147BBE5F98BEC8F3FDC8
-:107A9000E2DDB33CE5E95D9778EA7F6C6F95A73C42
-:107AA000B3FB4A4FFDD907977BCA737A3FEDA93FD5
-:107AB000EF95D59EEFF3FBD678BE5FFADB0D9EF215
-:107AC00065FD7779EA3BFA7FE6BE795394CBA30F45
-:107AD000ABF7E3EF03B9CF1D67DA15E7DDAFF3C707
-:107AE000661DE38410E5F7E9CAB8BFB3F2862F70CC
-:107AF000FB4C5D68E8286F5645B97C5D9F67DE8E5C
-:107B0000F2B532AAD23E2187793D397C05E923932B
-:107B1000763039359BECB681EF18AFEE68B016962B
-:107B2000B8FC5A01AD13304FAC325A43F70A3AED64
-:107B300065CD04CC9F5B15D5B91EC4AC5EBA2F4091
-:107B400067ED5DF36276225D31D1CFEC48D4FF075B
-:107B5000EC443987E2C3CC4E243BD20872BB11CE31
-:107B60004AF4DDF88A40F7F8333B90ECC867C2CCA2
-:107B70008E9C89765BDF169443FD3F9529DEC8FE17
-:107B8000C84E2C6776E2E65CB7BFBCAF089F69D0F1
-:107B9000C6E3B347E916C71691DDF8CF48CF9FD9A2
-:107BA000F8521DF63BBD9CDFBFD731A6368EFA7466
-:107BB000475117F1497F91CCF7213951EAF6031E5D
-:107BC000B0F7AB90FA2DB257D93A905C76D6618B6C
-:107BD000D097C67B0EAD2F04C92F3EE937FEA3C850
-:107BE0006F6AB13A01F3048DFD8A89E3DD6BE3B975
-:107BF000589B59853F0759125FB60F9F17E84C1FD6
-:107C000061CFD2D27BF6E1F37B51327AE122E3E914
-:107C10002A9431EA42EEDF966728E92601FDD20C6C
-:107C20008E2CF689F394A23BF8BD4025F21B487FC9
-:107C3000681D9C6353A8CC5329BE1C40BA10E84968
-:107C4000F4149043B4BF04F0B02A962B843486C455
-:107C5000507FC5BCD1CABC1D44078E5E8BFA6E92A4
-:107C6000DBD10790DE62B5DEF50FA9DF263CB5D883
-:107C7000E7A23B72F543556CDC8E82E23CF4EDA248
-:107C8000DF65994BFE1CB4F7DD477344474F20F97D
-:107C9000B30073190A06F522C60F3BC429086F8288
-:107CA000E2F0814312D9FD81BB3BE97758039AA5E5
-:107CB00003E9FF968EFD5617AF243FE1FFC466919E
-:107CC0001E1CA8FF5156BC05FA2430670F8DCFE863
-:107CD000050F903E0063823AEEB3F5B1A0B9338B45
-:107CE0007D5017B1ED9F498EDF3341E7625BD12FA5
-:107CF00017C6AD4D15319FE7F69F1678EC9ADB0B52
-:107D0000B81F73A8F103CC1E4DBAE0DBC4FA4539A5
-:107D1000DE7A76590DDDBB8ADB4C399E1B2DDB49A3
-:107D2000FEFCB3CD3AE67DD5D9784D61320FC3DF85
-:107D3000240516ED447992C7F42386D24ADBFFE28C
-:107D4000F86926E6F0F8BF6181C4FD773E67DF126F
-:107D5000CFE17D353AE8CA5CFB2A005281F9BEC604
-:107D6000FEAF07CF0F4EE970ED7380FB81B73C6D1E
-:107D700087B77C61DA5B665AF4CBA807AC00E0FEFB
-:107D80008FDDDEEF61307D186F19EFDCB39FE0E728
-:107D900009550601D2775957BAE76B6C7E09E73E61
-:107DA000CC8C7BF5A7EF4993FE7295FDBB1F99F72D
-:107DB000BD8FC7DF019941F3F2ECA3B37C12F92523
-:107DC000D09F64B8FC49259AEEB1AB1CBF50A65CAD
-:107DD0000F1EBF07D817B2EB937EBC37552B43FF5E
-:107DE000435BE1977E73A27CD00FD326A7DE3C4194
-:107DF0007E4EA67FC5B89F04FDD7B7FFF48EFF3E29
-:107E0000E1F267BE1B4DCE46BFC7FD93797BE75EAF
-:107E100055E7DCDF3B35F2F382CEE148BAE0B8B398
-:107E2000D4FA385757D2E3D08FE4F8611C7FC3F5FA
-:107E30007926E9E75B8CA3A9FDACDFAA5FFA01FB19
-:107E4000592C1D3AD880F26EA24C7925DABCB58F38
-:107E500004D1EF89DF59B9AA481F4BFCF1A28FFC6E
-:107E60000EED36DF3BE7571DBF4D2287F347AD6D63
-:107E70000FB09906ED731B41D4932FDECDD6D0B34E
-:107E80001F72BFA1E31F9CDEE5FD7E111E0527FFCB
-:107E9000E84ECA8332E6F33CA8312BD3FB709D3FFA
-:107EA00066AF33C6B72AE70EC659C7AE4AEF433DA1
-:107EB00074869DCF54F6E2F3F493BF20154A485FD1
-:107EC00017611E136B671C903DE746C68040F94062
-:107ED000638E49469AF533E359EFF73270958B106C
-:107EE0003E6F39337EC5D4ADB76F10F0F7535302F0
-:107EF000CAB3ADAB988DC0CAEB72EC3CA40BE002E8
-:107F0000A4DBC552D8C0FBF536FC5CA23C64FF89FB
-:107F100069BFC0382ABCC4F32EB5293C2EABFD4442
-:107F2000329804042D0433678607E35D5F3D67E004
-:107F30005DFB037EB4C7D9BAE33EF404B3FB4B7CCC
-:107F400068C76B54EE62763F969F61763F3EF7308E
-:107F5000BB1FDF7F8FD9FD58DECBEC7E7CFE90D936
-:107F6000FDF8FE5966F763F9C5DCCA2D397330BEDA
-:107F7000554AF4149CB987F21EDB559F86F4932969
-:107F8000CF2A2B6F575730FC6E0E2FA6784BD56239
-:107F90009E77BF256731D9D303FEBC0C7FE8A07F55
-:107FA000AF4F70FC7B78043A6EDBB3037ED2A44102
-:107FB000F71B8CDC8FE9F4437ED6F3FAB1FDAD6F8D
-:107FC0007DE1575F6F669FD6CDD9DE112CC6733F1A
-:107FD00029FEDDCE3FCCFCDDAD757B1A291F501983
-:107FE000772C85EBBAA73C4CFA06FE2E13CAED4C53
-:107FF0003BD1B10F33F571E799B91F66E6CB446CFD
-:10800000BD64A4FC8D6DBE14C5B7AD46265F70BFC0
-:1080100068482F7CDD77BE7F77B29697714E99E7DF
-:1080200067F90FF2BCBD0E486AEEF93BE723C8E6DC
-:108030002BE67E46B77F375892A6FB1B826193F4EE
-:108040004581E991A4576A498A17B60DF1FBDAA771
-:108050006C39D138EE1ADAEFDB5EF491BE556DE77C
-:10806000C9358F53A9DC3C6E6E9CF22B2373D5BEB1
-:108070002CFD6C88140FBBBF4A6CFFD787D9FF2536
-:108080003F3F17D6BC6FBE8AE7A73AC2AB7BD16E23
-:10809000EF88C7284ED0336EAEE77E72295E41F777
-:1080A000594861AE674B7195F46C19E75F3658DF3C
-:1080B000A9773087D30F6373F26306C29D54CF2F25
-:1080C000274CF4B7F8633C0FD9AFF1B862B0440461
-:1080D00035CB798D1EDB2FDE5196D4D0AFD31197DF
-:1080E000E9DC47873E6BA8B82CBFEF42F3FA079B49
-:1080F0006DBF43739D427A61A23E57ABCEA7730B0F
-:108100006790CF3BC24D2AC669FF3F82909C4F00CB
-:10811000800000001F8B080000000000000BCD7DD8
-:108120000B7C14D5B9F8999DD9577637996437C91E
-:10813000E6C90402060DB8818487C6380991A222D7
-:108140002E0235B4B42C0414E415D1B6ABD5B2214B
-:10815000098F2025581F282DDD50B02FBD8D96DEAC
-:1081600052ABFD6F04B9A8A8A97A15FDA146B43E8B
-:10817000EECF6A04BDC547FFFCBFEF3B33C9CE64F9
-:108180003604B5F77FB1653833E7F19DEF7CEFF347
-:108190009DB38EBCCA60CCC758CB3FC5862E2F3C42
-:1081A0008B18EB8127934219AC9C318F2C3096CDE4
-:1081B000D869FC73317CEF76ABAC129ECB1C717727
-:1081C0000963E168454EFD44C6166685990CF51CA9
-:1081D000BEC5720CDADB1953B13FBD9DFE0C627F48
-:1081E000558C89F26F6BDEF20FFEAE3FC5F41D2C8D
-:1081F0008270944A6FF7BA18B3294C386D8332F302
-:10820000CA6F9FC7E8CF6911FFEE09867DA9FBF110
-:10821000B9FEADE6AD8983DBAD2AEF75880A639BB5
-:10822000F7748419943F131482CBCE626A01CC6B2D
-:10823000F5FEEB5904E6BF55EA71C900C7D62F8495
-:1082400085E1F2C1FD2FD3F003088B219CF0C776A6
-:10825000FA7CF85B618A63126305F866243EF9775D
-:1082600018A5FB34F45F91807299060FFC7FE261E0
-:1082700063B9AAC7589E7CD458662C640F8F63ECF0
-:108280008575D0E9398CCD39F6DE3196CED8DC58FB
-:10829000E8F147038CE5ABAE705C666C1E0B3DFEEF
-:1082A0002A940B1A3C2C1182C16D6C19AE0B4CF345
-:1082B000A55280AF8111ACAC60591A63AE81FEBF8C
-:1082C0002B67123E1A7A17CD64E319FBF1CD2D8C82
-:1082D000413FB13A21BE17E09F5DBF67F62878DEC7
-:1082E0005B692BBA0F1B45EC6FE1FC5CD0D9699838
-:1082F0006FA6EDFA1123A17E789A4768817A3FBE76
-:10830000E0DCCDA550EE993E3A8478077CBDD53FA0
-:108310001FC0FFBC306FAF8FFF6CE589B9A3E0B918
-:10832000B3F2A1D9F89C935C1FFA9B35A5B3D90190
-:10833000FD5DB9529980FD85EB8DED0BAA8D6580B1
-:108340009CD609E7EBCF1A0CEF99E0318FAFF777A6
-:10835000EF3A85F0CFBE007A007C86F113B40F4B64
-:108360007D5208F09C5F2DA871A09B0255503B2DBB
-:10837000F8619B463F66FC8BB10C867C56374F8C70
-:10838000B743957C979DF09F3F53882B307EFEB27C
-:10839000BEC469287FD3658F8BF03D2BB34BC0EFF4
-:1083A000F7AE64ACA384C04BAF4D5ADF7B5D6DF676
-:1083B00062F83E2F4F6436A003563D8AC6233846E6
-:1083C000123E8E737CB8081F052B438FFF0CC6BF6F
-:1083D0007A8A5316A1FED50DFCBB0EDF5609E80CB8
-:1083E000BE6F053A8B119D49C793F133E7D8AA5563
-:1083F000488F734CEFC7CA8CE8EAEF538F8E29067B
-:10840000B856091D333C008ADBDEC4182E346010D8
-:10841000E95AE7471D4FABF635133F26F199FD3476
-:10842000F233FE3B8750437CF698EBF732CA8DBFA0
-:1084300064F6EE6440C2BF9059ACBE9AB1FF93D6C9
-:10844000779E00E5DF74346CDA74117C77F7FD9663
-:108450005530E6DCF89D19338A06CA69EDCB67CC46
-:10846000B808FBE3E3C014627CBDFBC725FAE893C0
-:10847000397C5B54B65D84B26493B7874A06DA658B
-:10848000613B61887661B65DB268E7D5DB019E36F7
-:10849000C0FAA569F34AD3BEDB347892C797106F50
-:1084A000B2E215603DA4E9928CF4F255E1C839D3EB
-:1084B000BC236CBB7DD4E0760076B30EBFCD1AFE34
-:1084C000387E4F1EDF3E04FC5F373ECED49F43FB19
-:1084D0007ED6F041F5F539A9E78B70D9515F298A2D
-:1084E000D796D4CFB6EE4F9F3A1F88579ACF426E99
-:1084F000E843B2AB7208E8BC5CBEC3859D4B99F5FE
-:108500007204F86133945578BFB9ABC3A5C0FBF2D0
-:10851000D2DB3721D19727D218CA83714CCEBC1F2A
-:10852000FA1D274B2C81AB76D1419B07CAEC0A166A
-:108530001A0DFD6674A7913CC92CB9E017028C9BFB
-:1085400099E952B1BD2773D22F18D10753A4247CC7
-:10855000786A5FA8F3205CB35908595112E2AC164F
-:10856000996C2C637BA19C79C91E560FE5097FF796
-:108570002922F2B4C4F55D3BB6473DDDCA0EA17EAB
-:10858000C9D3E4CF2687BC9DF4C7751243FDE1191A
-:10859000778780F0DC0B5D89C097E5E559B3EBA1E7
-:1085A0005C7EC41652149C4F87508CF3098AA4B782
-:1085B000747CEA7264C24709CEF463597C2FC0DF31
-:1085C0006A8F27505EC5A65E2DEF0578F29724C905
-:1085D0006BFCAB0F7080F03E7DD5DEF612A46FE928
-:1085E000ADE4FE323E8A27509EB1DA8630B60FCC1B
-:1085F000940CF23F4D936769263DD09A65273AD196
-:10860000F50153254586790BDABCD98FC2A40F9C9E
-:108610002CE47290BDB280EC1081F50AA73D307F4A
-:10862000AC887017F1790C6A3F89B767C1900BED80
-:108630001C675A5313D6878F59CD805CE1BA341525
-:10864000F5B3E060AEBC09306F1B8B74019D340B39
-:108650004CC2F2C0780986E3395D9E56B4BB1E73E6
-:10866000B5D8107F2D87417FC03C36DA19B7FFE4BB
-:10867000902B0BDA4735FB6D6DC5C85C2C67E4E8C1
-:1086800076615846BA5C9B5D9A8BF661BABFF7DBA0
-:108690002867676EFFE30C17CAD53AA87301E89DF7
-:1086A000CC8736C540EE3A4F153025C9CE734A4DBA
-:1086B0000CED29E7A962C3FBC43A98D1390365D50B
-:1086C0006BABC771D6642A84D75A26B762BB5A40AF
-:1086D0008692B42ECE53794C9968D57FA1E17D0264
-:1086E000EC24C5399CFE3D4C294BEE7F548AFEC7D5
-:1086F00098FA972DFB1FE8D76FE8B74D626447C71C
-:10870000025E5A77B35DB031B3EEC64CB4479DAC50
-:10871000A9CBC2EEDC906923BADB186CEA51A17DCB
-:108720001D03C6073AB9F88BE322237B06560AE8F5
-:1087300085154A7DFD743C12EB71FAB5C50486724D
-:10874000E962C96EE0931A662C9BEDA27361AD11CC
-:108750005F365F650FD2CFDAEC34C56901BFFEEC3E
-:1087600059C76A4A47C37CD3C2CB18F0F1CFB71FB1
-:1087700076B505A19CCEE9E481EDAFCE88C1FC7A47
-:10878000044E7F6D011BE1255C97DB2926F51B76E6
-:10879000B0D12817C348DF5E0E0F8EDF935DB8BBE4
-:1087A000DD627C10BB06FB61B62AD49426CDAB47B4
-:1087B000B383FBC79B56D0897CD03F9E9355D1781D
-:1087C00022E03F79BC9C2F37DE5F717EE503E3CD6D
-:1087D0009E6E9CDF6C874CF39BADF1AF3EDE5F710C
-:1087E0007E255F623C9C5FF278DF30CE6FB653A689
-:1087F000F9CD16397DF58F97F3E5C6EB59574676D7
-:10880000F04607C827A093B48A7DAE5130EE469754
-:108810005D16948176B5B537B8E6A2EEF54E9B9E0F
-:108820000DE3D45D0295F3B19769D36B4B19DB2E41
-:1088300070BAE8CBFCAF4DE8479E9CB9B68CF48982
-:10884000665F5F8955411F5F29717867157AE3CDAF
-:108850004978BC17E4880A70FC14F85D057EDC05D5
-:108860007C89E5F8BA203D7783BD8ECF3D002F7E11
-:10887000BF6F5D88CABF5A37859E7A3F6553B8DDA2
-:108880003EB6DADA6E3F2F8BDBEDDBF3E4F94B50CB
-:10889000AFD5A685502FB229173235D9AE664D8F88
-:1088A000B9E1FBD66FB20AD48D637670B803F5399F
-:1088B00064B7A7551CEC5907E58D925D41BDBC51CD
-:1088C0006133ACFCE631A867603CA793B7671772C9
-:1088D0003F2C10EE3D887A6F0EDAE980D7ECB9BDF7
-:1088E00007D1FFBB0AEC72D2CBEC8D83AFC2F71776
-:1088F000C0FF6BC7B2E865329467CDC9A6F1E14FFE
-:108900007A6D0EDAEFFCCF4F669E20BF22ECE67A3E
-:1089100021C0663FDE8DF0861C4A9CFA6377869103
-:108920000F54BBD24EA2206C473D9D8D7A1ABED704
-:10893000BEE1643684EF1207C9B5B9738D7EC37684
-:10894000774246FB677B45803543FF57CD347E77C2
-:108950003A39BF854D7EC32C5319AC2DAE77C50572
-:108960001968EF6FC4575307E32D7AAC79E3C1243C
-:108970003A55B27C81B73DB8106C0CCAB34F58F968
-:10898000B67AFC589845C68AB9FD3FD6C5361E044E
-:10899000D4BF80720FE5AD83CB8DC1FCC1E1A9D1FD
-:1089A000E4E3BDEB7A6ADE1A3D005FBE1417500F98
-:1089B000142C83F749F395027101FD1D26DE5F81BA
-:1089C000FE8D791EF70AF7E7318BF1F4673E93DEEF
-:1089D00046BCE052A23C37CFB766D07CAB9F2D653A
-:1089E00056FCA46C477B6ED66131D4AC0CE0439F3F
-:1089F000FFFF345FBDABE19BA90196007A7916E8D1
-:108A0000BD9DFB310CED549D5EA102D94F575E090F
-:108A1000DF912E54B508F1F9ECC8BE3DD7603B900C
-:108A20001D2DE8EFEA7650E2651BDA415FB6DF2BD9
-:108A3000AF7390BDC558BDFC76D9407FA9D607FB62
-:108A40007D3B497FF6DB89F8679226FA10C6E6502F
-:108A500090EC819BC03E467F3F5AFF9E94CEBF1F45
-:108A60004FB253F1CFF1A4FE5ABA7F2D280057E739
-:108A7000BAAE9AB7EC03E3962C936D6D68CF35C709
-:108A8000058A4324A01ED803239729B656C0FF1297
-:108A9000EC07E9D324D747B6423FC9764AF55CF9DB
-:108AA0007EA087D6F2BA8E103C37EFE0F132BD7E61
-:108AB0007FDC2C1023FFDCCE9A9800703ADC3FFA62
-:108AC000792FCC476D9198BB06CA766EEFB0577D73
-:108AD0002417446FD32FF17B3006720BE75DD7F478
-:108AE0003B2CC76C2CDC02CFBB3DBC7D5472C94E05
-:108AF00058BF76B975064E3F272F726F168CD796E2
-:108B0000934672D0F19A6F37CA2947E6846568F7B1
-:108B10002C88FE308CF148D9CF16862DE86B816603
-:108B20003FECD5E8EC983D519409704FCFABDB9BFF
-:108B30005565513FFA23EAAF46B4B6C31ED5FAD9FC
-:108B400069B3960BFF9EC5E39D57AF7AE8BDFB6006
-:108B50003E9E526F08C96DF3F96C9F601B5CBF3B72
-:108B60003BF287ACA478ABBB5496280ECABAA6A237
-:108B70003DB7F9F39F76FD0E509EF5B997E46C96DC
-:108B8000E88B0B2586F68F26CF436FFF974F5F0C40
-:108B9000E2FAFCC5CD48BFB2D8D397AA18D7D4CB38
-:108BA000F046C072A65EFEEDA5E86F0E94AFB9B4B4
-:108BB00016CB48BB409435FEE866D4CF5B05A611C2
-:108BC000F14DBCBE9DD72FD4BED75CF6FE2FB6A10B
-:108BD0003E98E4203F74AB6607E9F0A97E91F0A3CC
-:108BE000FA87C6E36B1A9E5DC3C7E36B567838906D
-:108BF000A7BE8EF875B32E01E9D8FDB9EB466C7FA0
-:108C0000CF3A165E02B0EF54F6FD7A9B42EDDFB626
-:108C10005A87F3F3D477B2088EE3BFD80670F8749E
-:108C20003826B31B53C0F1E150EBF9A71C2EE7BE69
-:108C300015E0CF2CCDDE74387A82B3E12957DE758A
-:108C4000830CF2664349578355FCF9333FF70332EF
-:108C500053C4DB037E4E7FDDB9E1D30847ABFC9004
-:108C60000BC74F135818EB6F99D2CB84A47E4301E6
-:108C70008E6780DBE987766953998A74E663BE382C
-:108C8000033AF35572F8B7045F600AB4F395C1D3A1
-:108C90008BEF7B89FFD1E5E0F400820ECA0E8D3E9A
-:108CA00002FEAD97A29D9F25EAF457D48EF4E2B060
-:108CB00069F563459761B9338B9727DD51D41E2B36
-:108CC000043DE380362817F21D64EF98E75718E05B
-:108CD000F3DB96ADE6FBB32DF0E9ECA575DA3ACE01
-:108CE000118AC1BAD6D87A1A1AF1DB655EB2D7E01A
-:108CF0007D433C69FE976BF8BADCCFEDADAD9FBA12
-:108D00001AE216EB918A4E276AEDCF824E27FA2D92
-:108D1000E803E8B412F19F44A71F336B3ABDD06F4C
-:108D200041E740A7D5F8DE8C0F735964EA8E450001
-:108D3000A0F4D9F45F6D436D7579F58EDFC1B3E6AC
-:108D400073AFE4873AE2184676A2CDC5E5FB80DC36
-:108D50008F5C86704B7213BD17BD61DAAF792E2B15
-:108D600045BF9327ED40B9358C7EE721DCE67E4B8D
-:108D7000FD8CD6A3E6326F246E81F77FFA256E1F35
-:108D80000778BD54FC322E60A3EF29F945A7FFDC1C
-:108D9000F05284E34CFC523FC02FAB86C72FFB88B8
-:108DA0005F3CE59C5F3C29F80523D1289F3794F070
-:108DB000F28FFCB9C40FFDFCC3CAE87B3FFFB0B221
-:108DC000CBB0ACF3CF658132AA6F6E9F8EF3B6C085
-:108DD0004B9B5F9F47B815D7553D4F6E15C9DEE8D1
-:108DE0006528A73A595FB713F9B05A08ED85B7B3AC
-:108DF000623DF52E05BFF7B0D9607F6CD5E87E17D0
-:108E0000C283FED0242D9E25F5B0AB7C83F9D857C4
-:108E100099288B24E17FA486C76F07C277E0F89D6D
-:108E2000AC772CDAA5A9D6E91E6DBC9B82EA3D562B
-:108E30007C7F26BDF328EA9D6C7CF27EB23E7735BE
-:108E4000A11C30F379CDEA87DFBB6F887E1ED6F098
-:108E5000F6D0D9F3FD4329F8FEF726BEAF14465AE3
-:108E6000F2FDC329F8FECF567CFF15F8FC3FACF8A5
-:108E7000BCD33F3C3CBB035CBFBBB5F5FDB2787EC9
-:108E800047C3EFEBFEB3B6035EB7C213E0B9779802
-:108E9000787EC76A9D00CFEFFA69BD6D31DC17405F
-:108EA0007E47FF7DD3E4581FEE875AC0D197DC8FF1
-:108EB0004BE1FD8069FFB100745EF3D9A650C48216
-:108EC0002FA1DD3F92E1D7DBDDE397B5B8B3723D6B
-:108ED000DAD53B2FF7F2FD846CF5732B7EF80AEBA5
-:108EE000EF0C58C8E31A1B9743DFF6BF4576DE57F1
-:108EF000E8DF6FD5FF331A7D9D49FF8F49D2FFD838
-:108F00008F59DE75321E4FD9961D290910BE7A2F52
-:108F100045F9B4EBE62C01FDBA423521A0FD9FAF27
-:108F20008D77BB5F21FAD2DBED92128284F59B64D0
-:108F3000212618FA3B6FA8FECC70007CE30324DFE7
-:108F4000D4F3F1798FA6CFCED61EBA30A84E0E70CC
-:108F5000393D15C757CF31CA697D1EB67017EB452D
-:108F6000FD02EE77DC82AEF2357D09FDD4513F9AE9
-:108F7000BCBF20206BFE29EFEF6CF50DC07739F6F2
-:108F800007FD5E61059F192F6782F3960138AF0ECA
-:108F900058E825737FBA7FADAF13E9D3A4B8CE12DA
-:108FA0008D5E80AF1A113E579B2DC60203FCABEBC2
-:108FB0006B904C69D8FF4E078FA3EE5C797B2DE652
-:108FC0001B74DE2257204AF297713DA7AC2CA6B83D
-:108FD000EA6AAD5F33FCFDED1D5D632796D3B86B88
-:108FE00071DC8BAB5902E54606DA09147F90258CBB
-:108FF0002F64393B821897DD2C74342C463D7AA9B6
-:1090000097F42D0BCEB58C4FE94F3DFEA4CF9B05B9
-:109010002BCF50BF99EACB9E8E26B493865DDFD9C5
-:10902000616957FD44B3AB607E3F1E12AFC100C5FE
-:10903000B774FC0E1E87AF5F6DB849407CA795C31F
-:1090400090C09269E10EDA6CB595C6592FDA4F657A
-:10905000402FD4DF0B9671BF81FE36E8707522FD7C
-:109060007C55B8F47AA9C7E3F570FF8CE21D5E2E3B
-:10907000B7E803944F1CF65BEE1FE8CF8DEB645509
-:1090800002FD73425632305EB851D383E09905AF8A
-:10909000F2FDEBEB0DCC23CEE39DA6FA51C6E99E83
-:1090A000055D64DF61183E996E8E6A74B02D27FCF1
-:1090B0007480E4482884740DE567495EBAA0ECA387
-:1090C000F25FA92CF7979FA7FA415E9FC9F2B0F013
-:1090D0000CED5EA176527F3FC7A8ECED1FF7351A65
-:1090E00027D05FEEA5EF85BCFE70C7495A573EFFFB
-:1090F0001E91E6FFB1A466E0FEE837A38D14279A1F
-:109100001F5D4ECF4DEBE45A8CC73DB3AEAFB515E6
-:109110009EDF9CDF28A3DD3F7FE94F68FF5EEFFF06
-:109120004AF42B90DF156906D94525B6F01EEF00ED
-:10913000BF0DC0D1AAE9FBDE7AA42397CAFADA2BC5
-:10914000A0FD948F5A5B0D794E1D943FE356A4CF3A
-:1091500092E3EABA1CFCBB433D1D383B3A36CD973F
-:10916000B18330FEC7DED2788CE8BA4EB6E2177D06
-:10917000DEA9FAD7E79D4ACEE8F8D3DF6F2E9D200F
-:10918000F3FC9FB8012FEED1F594EF73A5A0C1E9D0
-:109190007369FCC6EBCD82711E2A27FA50907E6758
-:1091A000697E9C592FE8E3FEDD1119938DEDE0CD2A
-:1091B0002D132CF03B4CBC1D5DB72C5C6F4779DC4C
-:1091C000E5A6FD7B26539C5FAFD79062FE75D95C08
-:1091D0008F30A74AF3D9726B461CED8E2D8BFE2083
-:1091E0006370C533EEE32ACCD7F4087D9F2C46F993
-:1091F00072AB8FF2311A167D52D59CD4FFC2037F19
-:109200007261BCB761DCFA6C8CBB2C64D2C7C9F943
-:109210000EE6711BA2AB896E63CD428395BF752CA0
-:1092200087F3F5424C9111A9BFE3C9FBC88B9409A0
-:109230000E8C4F2C8A19F77340433A903E1A379997
-:10924000DF27EDE788D83FA379C770330FF55E9B22
-:109250008DE86D27E00DFDC0625097F83C9693A510
-:10926000F1410FE1F35F0DCFB11C6E0F395D2CE6BC
-:10927000C91AA09BDC480743FDE4AB14687F33E0C8
-:10928000D3F323BA484FDDE1D5CBA0B700FFE1729D
-:10929000CDCE29E5DF6D5846FFC7D373D0067CDC01
-:1092A0009EFDF865C1B1D05F79246893A9FCA44400
-:1092B000F6212F33F6F89307C99E95CF1542C0FFCC
-:1092C00052F793878BC89FD7ECB1EE27C91EEB2FBF
-:1092D000B30483F974A6F597555710CA23FBCB3115
-:1092E0002CEFD2ECF8F6ECEE275BC93E09B7652708
-:1092F000E9EF5AC6E3CB5FB77EEC0C2EE9C07CA247
-:1093000058A98DFCBD34133F3E98EDA07A637223BB
-:109310007767C373D62D7D12C61B1C792F04500EA0
-:109320008C283DA18E04FA1F51CDD36458191FB764
-:10933000B3742DD90D9DDABAC0FFD6A3DE1B589F9A
-:109340001ED3FAF0F50857F6D0FAF8CA7B68BD6C60
-:1093500058A6B81FDF8FBFA292DB1BB293EF2BFC86
-:10936000269BC75DFF942D6A4FEE976694DE4EF103
-:109370001DF70C1BD5CFD09E6639FEA76CC9A05730
-:109380000EE445FE909D64B7C2FB705925CAB740F4
-:1093900016EEB3D6964A37223DFF5CF34F619DEE41
-:1093A000A0752A09A445F8BA3D62B96E65C35BB7DA
-:1093B00017D745485EA55AB76FCE17C35671B76722
-:1093C000353C7CD0F0B7BB902D57B9FA1CB80FB321
-:1093D000B974BB21AFDAB56F760273A1F5BCEAF5BB
-:1093E0009EF46A94DBE6715FFCE23F0288DF999F9E
-:1093F0003A2DE5E37F6BF2F185750DD40E16589189
-:1094000072480E309EF7D29F27269C76D2F45EC417
-:109410003CB4EF12EB333637FC06ED572F0E8A0CB7
-:10942000F7C71732635E198BEA79C13C0FF645091D
-:109430005C5340E18B31210498628BA4D9BA5C3132
-:10944000E487CD9B3BFB10EEC3376AFBF0205F0C3B
-:10945000DF979AF2C6AE6E5814AED7BE9FA4BFE394
-:1094600034AFB90AB71BE77ABDA45FE785E787EB9E
-:1094700093F6E35EFAA76899875E97A3E3251CAE8F
-:109480001F3D182F8BC3824356CE8C1F333E6A2557
-:109490008EAF451ABECCF831E3A171EE6C5A7FF362
-:1094A000FC5F7485093F2F027E305FD88C0FC62287
-:1094B0005720DDBE345F64681F4F1767DA314FA055
-:1094C00071B6C030BF68290BA5F3FC6075D625497D
-:1094D000F09AF168C657E3A32C94807E1BEFF4D179
-:1094E000FA3DA7E1474C7C48F30AC3BCDAF9BC8ECD
-:1094F000F3FC5599E675955AF17800BE475A41DA62
-:109500002A567A84CF6731CCA75D1EAC4F3E61D519
-:109510004D48274B4D790B66F8CCF0CF4439387560
-:10952000F03EFEE41C5F80CE2F8C67216D1F3F83D1
-:109530008E3584B287CC5B18E0734E5F0BA3B3FB10
-:10954000C7C37E0516E92FCB80DF994FF8B7CE83CE
-:109550007FAF0D8A0AE609CE9E3FAA0DE71F66E19E
-:109560008C4409DAFB7D76942357313063A1DDC545
-:109570003049D4B7E17A3795F57E4F747C64273D46
-:109580001E614D7B69FF5DC9983B2EB57C591B74EC
-:10959000D078663B6566C5E80C9417667CE878FA77
-:1095A000568E96DF309E8D3F1BBCF4A0EC457F1697
-:1095B000E368B08E7DCB19DB5D31B07FCC0A556E90
-:1095C0004FE630DAFF5F9D93A9D91D4D147758A05F
-:1095D000E9856376D6F0A097EF234F48928F0BF37F
-:1095E0006A57E724C5FBF47D642FEB25FC7DD7E5A6
-:1095F0004D88E389EEDEEFA70F925F7ABE6684F2B4
-:1096000035C58C950AC5C53CE9E35906D8C58CCF4C
-:109610001BFC989B7230AEE7298EA31130F3895F53
-:109620006C9AA70CACDBE6257B3B105CF7D2DFC75E
-:10963000A87385E77378B475ABD5D6ADDF8E2E836E
-:10964000F749F83DD1A1D961655A1C1FFF40F94483
-:10965000A91A1FCA7FD5D7D15D06FE87218FB08397
-:10966000F0A7AF2738117DC89791A04439C336E6DB
-:1096700022FF387213CFC758C8945D981FB4306A60
-:109680003F91DC4F244F2238229BDD5ADC2444FDDD
-:109690002CCEE3FDB032EEE7F5D37D0CDA27E53FC3
-:1096A000DA5C604A62FB4C1642FF09FACB417DCF7F
-:1096B00036258D3372F0B8A9FA33B713B5FD5BD1F7
-:1096C000190A8592E4F46F72B89E3C11ACECB28D2D
-:1096D0004C8DBFC52EBF2A25E5C51ECF733558C595
-:1096E000C5F4FE74FDDD6F27C6963F956C277A376B
-:1096F000343E75F8A2243B31D6F814C515F5F2595D
-:10970000DA89CFDFD5F8542BCCEF1FAF7E83F2C7B9
-:109710004F3481C0043CFAA3D3D89B7E940F32E926
-:10972000AFE206F0A830F95B52C622BDBBA305AA82
-:1097300094942F7B2C4721B8FDA52AED9741D32E79
-:1097400074C5FD524840BCDDAEC5CD8070C7CEF6B5
-:1097500025B7E37E883E9ED325131C0E7D3C166AFA
-:10976000A6FCFA998CF4889E07A2F3B5DECFBB392C
-:10977000C678DD30F8F9DD9CAAC1FC2C8A4DAFDF3C
-:109780008A72E22991FCB0EF046FA2F7E678C089F3
-:109790001C6E1F8E102327502EF4343CFF9D1F405B
-:1097A000BB35FB9C2154C3ABBEFFDE8FAB14C4138F
-:1097B0005FFFF94B1BEFACC2798D9664DADF28E2CC
-:1097C000711847B340FEABBBC411DE07CFB703B57A
-:1097D000237293E07A3B504FE59133385C27A0CF5A
-:1097E0007605DB6D6F207FD1C7F7BD4F280A9DEF4F
-:1097F000133D8CEC09D1C99F99B9DC2ECDCCE5780D
-:10980000766B4FD729811609E9BA09F72DA418E517
-:1098100041BB4E49F4DE210896F69ADE9FEB140810
-:1098200067C497C7DCDE41EF713ED85EF433837DB9
-:10983000938FEDABF0C9E9DD75CAC3E1F09BFB493D
-:10984000E7EF35FE33C37163CEB462C4CBDB017581
-:10985000442E8F6F7339EC7DF2A8307E38F298E792
-:10986000EB5F9127B928AE77AB101F0DF2A9BDECC5
-:10987000441BC9AD1257139E934AB29F047EEE86D5
-:109880009FAB18B04FFB2E995389D16BA6DC1B1AE6
-:109890006C6FBD5EF9C9BC3958D0CE4F7C5797BDAF
-:1098A0003128833DF79A565CA48CDC80A1FE2BAB5B
-:1098B000B97DD688F65988E496C1EE32DB675ED072
-:1098C000F773802E96062519E9C26CA7B557CE23EB
-:1098D000BBA61DEC1ACCD71E6CA77179735BD4C6DE
-:1098E00054A8F74CB5487EC63365BD4F5C8CFA6210
-:1098F0008A5D217D51D677DB1CFA3E91C6F16AFE66
-:109900001DD4E7E71D429EF86878F76CF59BDEC62C
-:10991000A4F57E66CA9B63D12FD89522BF428FD310
-:109920001CBC99E77FBD7E87107722DE6E116DD853
-:10993000EFC20A1FE5AD5E227A699CC6AD62DC49C2
-:109940003854D32FC919B01B99589DF33CE2619B41
-:109950009DE1F9C1A21B7B0D76EEC2A8D19E8B348E
-:1099600081FDA39CBD1D68B6FFCC76CCDA5CCDAE84
-:109970009BC026A0FDF2CCBAFDECCDD10376CCACD9
-:1099800014FBDFBA1D7381ADEEE65C1E17A4FD83E8
-:109990005992F5FEFE559A7FCA42DC1FBC447C9F5B
-:1099A000D6EB444852107FDE9B9EA4731DDE7F8A57
-:1099B00061ABF1B6E7727F7C978391BCDD35C14323
-:1099C00079D7DD379F9BDB4BEBA5DC5D8DEBFFA4EF
-:1099D0009DE4602AFDE68E8AAC1426E68B0AF4D458
-:1099E000D77344D4CD92F5C38814790ABB73B9DC1C
-:1099F000CEBE85D9D0CFCE8C31D5CA2FD5EB813F05
-:109A00003A1D63D4503F9109F0AD2EB551DC5FF79C
-:109A10004BDD767EDED7FEC8F531F44F47007C087B
-:109A20008702F0A11C2E897AA83C32EAA7E7A86831
-:109A3000263D4BA305F47D7474143DC7444BE8FDEB
-:109A400039D1F3A85C169D48CFB1D10A7A9E1BBDCF
-:109A5000909EE781DEC27AE5D15A7A8E8B5E4EEF18
-:109A6000C747E7D0F3FCE86C7A86A2DFA6EF15D1F2
-:109A7000467A4E882EA2F713A32BA85C19BD81CA83
-:109A800055D1EBE93929FA437A4E8EB6D0734AB4F0
-:109A900099EA4D8D6EA1F205D19FD0F3C2E8767A96
-:109AA000564777D2779D9F3D9A3DFD74708F4CF954
-:109AB000F62C518EF231151FBEA1E9856FE4AA4F35
-:109AC000A03CD5EB1DD1CE1D98EBBD9A3B74DECDED
-:109AD000D15C4E9F1F848EDF85C769F575DB1C1C2A
-:109AE0003A8EC0CA0367D8B7E2F33B9CCBDBEF9258
-:109AF0003AC8DED8D5C4281FCC57D923503E43508E
-:109B00009A61454799417EBE6B4C6EE45D9CA737D8
-:109B1000EFAD83B81F7565AC27300DE92514489B60
-:109B200006FD8D68B5917BAD3059C0B252CFE404CB
-:109B30001B88E7807D65D06BEEA04D8BFFF4CC9C3D
-:109B400088F09C5B3A81EC576D3FF9C8CD2319FA38
-:109B50001DBB1C09414279B996B1643B7CD786C5CF
-:109B6000F7259FD370071D9C8F36B1C7304E56D254
-:109B7000A1D4E179C2513BD4C730C573743C52972C
-:109B800006E5737E157B0C9F63BBE2751E789EB75E
-:109B90003FF118BA4FE312BD755E289F7F981DC034
-:109BA000F053458F32CD07E58947D503B84D52D5DF
-:109BB0001B9996AE203CF196748067D76B60684124
-:109BC00079CAFB1D22B82503EB0F76DB8349EBE254
-:109BD0002EED5145F867E18D7205CAD95D52AF3B54
-:109BE000B37CF0FA74E2BC719EA057F66AFBE8728F
-:109BF000D27A5405053D1E9817AC1A880776B63EF2
-:109C000047F1C0CE34B916435D7D973079B7827481
-:109C1000CCFD84B4B691A49F74BA03FC1AEC49B786
-:109C2000D6EFAE7E7BD31ABF55FFCBF07B50A3E7B8
-:109C300054F87D1AE79177663E9E1EE47615F07122
-:109C40005D303B75BD15412E4FCD78DE25C9E7123D
-:109C5000BEBCCC16AB1858B76B34FA3E135E23FF6C
-:109C6000CBF07A517068BCB24A3F8F336BF969A967
-:109C7000E4CD9114E744BEA7E13149CEF178A90CB7
-:109C8000726E546A39578B70650F21BF52E43BAC3A
-:109C9000D7E8BB3B3B1C0B669F39AE7F9B4DAEC5E7
-:109CA0007C97D878467E02D897AD98BF3322A64CD1
-:109CB000A06D2C14CA88C709E7919F5E02F686340E
-:109CC0008161AA63029F575466DA1697635E83C662
-:109CD0006FF2A26032BFE9FA7E801F75BAC8EAA4AB
-:109CE000731640AF984FD8ADE169A01F1E8FD87092
-:109CF000537E677B921CEC0C155059AF9F8A7E5F98
-:109D0000D7E9B7F539DAEFBFA2DA3ADFE4CF41514C
-:109D1000CB3BEA5391CE63354CA6F3CEADC7493E5B
-:109D200065827C124A787808C72F8CA6DD8771DAA5
-:109D30008783399A3F2EA77DD3F7FF8F9EB781AFD8
-:109D40004E7E66B5DC8DE72A46801E52504E560385
-:109D5000EC95A8E71CB4EE0AE3EBA854B3784220D4
-:109D6000BC25D06F8ED9F8F98C238E2E95F48E23D6
-:109D700053C6FC93EEECC813C121F842F62815B87F
-:109D8000A8AF0457CDF4E6615E8E9C86E597A07C73
-:109D9000DB14CC13EA655AF936EFD42F1F7F7865B0
-:109DA000C78A23B84F7561503D8AF0005DBF827449
-:109DB000AD9E234B141F1EE6FE93CE9F03FC24573B
-:109DC000E8FCB4A89CE4E15BC1A4FDAC54F6CD2E44
-:109DD0004D7E7E121CDABED1E9FEACED1B0DDE37E6
-:109DE00035B9948AFF673EF1FC8E3D6C20FEE7CBCF
-:109DF0007FB14752D0DE9EC6DE9C8871AF1E4EF703
-:109E00008CC7F9548CFF011DB82B5DA6B8AD30434B
-:109E10008BBB0C19AFD5E3C97ABC4F8FEBA56B7424
-:109E2000851706A01E4F9F224B8BA9BF5E7615E6B5
-:109E300037E5D90C7C8D720BF7E75D6D59D2C8F20E
-:109E4000817E196B2239D5D9C0E4F64CBEFF9A0148
-:109E5000F2A5633D233F2FF68C48FD9F546DEF61C3
-:109E6000CEF7C94A4020CA059529728E760E8188A0
-:109E70005C267A7532D685FE36FB51C8E5C038F7C8
-:109E800067025301EE239F89F49430C20D8DAE0812
-:109E90005584B0716D467508F703C537A10C70D6AF
-:109EA00067546760F9C89189216611BFBB3AB2C88F
-:109EB000105F32E3A9BFDE77DA285F61E719F63F6A
-:109EC0002FCA73E876E7E43CDCFF5CD2D7EA5006A1
-:109ED000F63FF57DBDBCD2872EC57B76F25672FB70
-:109EE000339FC59B93EDA6A4FDC5DABC2ADC4FEFDA
-:109EF000DF5FEC1993BCBFB826FF163CBA7F4FFF5B
-:109F0000FE62A412EBABFEAE0AA44F3D1FF688839F
-:109F1000EF03B0894F05140BFA5850F17836D1A3EE
-:109F2000E64F0CFAAEC5CDCC7EF09C3C631CFF64C2
-:109F3000684E46023FA688E3EBF13CDD0FC6789DF4
-:109F40006CC97746FCEBE32F10B81FCBEC02C93B82
-:109F50005D6F823C598AF88666148F569D02E56BC8
-:109F60009D0C352AE417A5902FFDFB062C31DA6AEB
-:109F70009F75819677627EFFA33CAE9716D8799C39
-:109F800052B87E6904C75D90E7129C4976D28A3C3C
-:109F9000AEC7F5FD1747FEA92AC4B3C31151ACE6FD
-:109FA0006DDE475981B66015C753C842EFA5C2D3CD
-:109FB000517B07EDCB1D5D2AD279DD9391C974EFFA
-:109FC000432AB9F00AD2CF68C6E6E5733D34B08EB5
-:109FD000D678D3F364CCFB55FDDF17B9E9FC8D3996
-:109FE0005FE6210D6F4F6978F957E7CB3CA5E1EFAC
-:109FF000692D3EA3C7B3AE4821EF2FB0D53D90C722
-:10A00000E38C43C665CED3F37D34FCB00363E95ED5
-:10A010008E2D3DF6B85B40786CB47FD9F09F620816
-:10A02000ED2FBD9DD7242FF4FC1DBDEC3925B07854
-:10A03000D23E8247EAA238A9E79444EFCDFC775B91
-:10A040005EFFFE22F19FBE2EA9D6595F17F3FBFBE0
-:10A05000B47539BAE84F413CEFB2C5CD2CF38958FD
-:10A06000BE31FE6ECE0348B5CFFD9AD6FFC9C8D427
-:10A070005C94CB0D8ED8E8E1F0BD8E9F17BFF8A39E
-:10A080000BF96CCB29E70CABF57849D34FA04F37D0
-:10A0900025EF83FAE63FDF8ABD7A24E33EA8AE4F80
-:10A0A000F57D504FA5791FCD7A1F740BB3968FA9FC
-:10A0B000F64107ED7F6AFAF6B3BC14FB9FE5439FB8
-:10A0C000673F90C78695F771B5839F9735BFEFD1EE
-:10A0D000F8EE646473D15DC057372C7252965262A9
-:10A0E0009193F8B071919BE2B28D153CDEDB78A7BD
-:10A0F000A0EDD719E3B04F83BC5809E33FABE99D0E
-:10A1000037597812DAA3B32A05C33E79B8DA6D2835
-:10A11000CF5FFA93A7F1DE8467A6D8158A3F435F25
-:10A1200031B40BAA799E2253FA6EC338B71E7FD67C
-:10A13000D7FF99EA37E91EB418D8F9A343187F1658
-:10A1400089BF9E796122BF974E18D80F57C04ED84D
-:10A1500072C128CAF778B9FC5B14E7DD8271719887
-:10A16000E9962FFE3883E80894720CF9757C561C2A
-:10A17000E563E3B80939489707C67FE6C3B8E8EB5B
-:10A18000B79CCCC675EA5DD7447907E67537C799A1
-:10A19000CDF1E5B38D2757E71BE9E169533C5997AA
-:10A1A0005766F991144FAECF1F463C59975BBA9C46
-:10A1B000D0E5D7CBE5EDAFEE867FBE1C71124CAF7C
-:10A1C00068F3EEE74B8D2E5FD6F9F00B27D9230706
-:10A1D000C63F4CF9567ABDD6BC4CA2AF6F95C7EDC1
-:10A1E000B43F8B790A6503EB323FB2BCBF8CDD7E96
-:10A1F0007BD9F506FAE8975367946343CB29573E1A
-:10A20000B7C352E56BF6A4D43FA3C94EF5FCD51EE7
-:10A2100077957C793DD4B0E80F0AB683E70E6A3FA4
-:10A22000DE11895BE827333C9E53228B4F4C7EAF77
-:10A23000F0F7FD7AC041DF6375CAFAF5016E4FB7DA
-:10A24000107FC69CB8EE52B6DA8A749097ADB6E528
-:10A2500043BBDF06D40DF949F2B4C5CEF723451B45
-:10A260008B3C688197C7F235BCB07010FB6BAB3587
-:10A270009EE7D29FBFC997B4F3189382685FB7BCBB
-:10A28000511144FE39E89B44F676AA75DBA6F31318
-:10A29000CAAFD103FEC4566DBD814555DCC76DB351
-:10A2A0008783C9F1C6ADF99CAED2A73ED48376733D
-:10A2B0008B6CA33CC11699E75FB77AA5197BB4767E
-:10A2C00001433B493F4745F765485E637EF5636858
-:10A2D000EF54A59EE763F9DC3FB4B3C41DD5C2803B
-:10A2E0005EB11FAF75D1FD0F4C95797E53C8904F6D
-:10A2F0006DD7F44B9D295F4394BF9CDF569C1DE9AD
-:10A30000C6F534FB6D8702EA63F83E2AC59C481FF8
-:10A31000519735DF1FD6D6B5459BAFF95E55D17441
-:10A32000EF8368BAF72156D7F4CB5EA4B7F54EB9E0
-:10A330002540F73CD0BD0F51BC72099EFF70F37CE5
-:10A3400016F0FF26F3F306A15E94AF2CE8A2785432
-:10A3500047A1AA164259F4D976AF87FE5AD43A15C6
-:10A360008FAE74786D9DB8CF979317790DE731CD87
-:10A370002791DEE9B82C8DF4107C777339C26461C3
-:10A3800012F98374690AFAE078BECC1E74503CABB3
-:10A3900025C27A9DA3F8F97FA4F75A9638525D82B8
-:10A3A000F6B6AB12F17424343123622127F4A77975
-:10A3B000FFFFD5EFBD544CF9AA62E4A37CDAF76F36
-:10A3C000DC8AFBFA6BF68B21DC47F8CEF75F1EC305
-:10A3D000CF1B19F799EFF6D4F4A23E8B7A1D54AF38
-:10A3E000DB37A903F1D422F83AD0DF6D79E3FA9F85
-:10A3F000231E5B9A799CDB8CE783BEEFD3FD1A2783
-:10A400006139B1BEF97E0DD6713D5F27A78BF62D60
-:10A4100061BEF6822ABE8E141F3CE6A37BA04E1EB0
-:10A4200039E045F8BEC2BC65EC37F5BC0B65D257C8
-:10A430001AFD3029BC09E7F503D1D7D11EC07BD264
-:10A4400060BD11EE47ECE4EFDFED49A7758D027CAE
-:10A45000B8AEA2AF5E4597ECC3FD22AD73546AA2BD
-:10A4600079B198C4F6E2FB473EF9F18548076A16D0
-:10A47000ED6A89454D84970F012FEB2DF002F433DF
-:10A48000A600FDE5476EA07E3A1C2E192D9B16DF17
-:10A49000243AAF3CDCFB452A0A847E7F4BBB5FA499
-:10A4A00002FB1D545FF3B3D0DFC6EFB532FB38CEED
-:10A4B00006F09E2A7F452D30DACFC3C85F510B2CA2
-:10A4C000FCBBAFB0AE97170C49CFC6756D71FDDF01
-:10A4D000E96867A9627AC85D0C655C27C43FAE1362
-:10A4E000AE9716B72115A4201DC88902A4831BD2DC
-:10A4F00043489F67921B12E3EB6E97809EC1AE7339
-:10A50000CA91A37476518BF7E8F2C4CC672D2EA3C1
-:10A51000BC6AD1EFE53B363C7905F4B202F16096B6
-:10A520005BC3A593EF0FA693EF0F45276979E12849
-:10A530007E473C154CA078C5CD583E7244DCE718E8
-:10A5400089E3F1B8595F1E937727E565E9F06CC69A
-:10A55000CD6ED2CB3C6F4A6A600CF3E0FC652141C2
-:10A560002E1F161D6DFE9AE9E88EA1E48397F5D0A3
-:10A57000798D557A7ECEBEA1F373BEAAFE81F5BC5D
-:10A580000FE169F17D9FE87383DD25F37BD4CE6E07
-:10A590005D1F2C10CCF70B3D988CB7C1EB1AD987F7
-:10A5A000EBA8164CA27B8CD8944564377567ABC773
-:10A5B000305F8C4921835C1CC43F9ADCFEC1390AA0
-:10A5C000E5ABFEA5599373CD4E19EDF1C70337FCEA
-:10A5D0000EEBDFCE9430C6436B6C6B094F1FC2FC91
-:10A5E000768748AE96E1BE4F94A585343DFA1F08A4
-:10A5F000CF0CA559C882F781058A8DAE2155B63397
-:10A600005BF9F0F1F0DC603C3C37141E400EFEA715
-:10A6100046CF37223DEBE7ED53C9C137B4FECF42F9
-:10A620000EBE91CC5F5F03FDBE3FB47EFBDAE5CD8D
-:10A63000A7389E59DE78357EFE6E8885305E3EDC1A
-:10A640007C36B03715E4AFDA7417D14FCB8302E50F
-:10A650004B811D1EA1B2CF45C2E6A0CFC1F37FF74B
-:10A66000F1EF621DC7B3194F42213F9FB5AAEBFA24
-:10A67000B064C8938AF1F39AEA09B954C4FCFE6A3B
-:10A68000A267BF66CFE879FDE99AFCEFD7F3336D97
-:10A69000349EBF88CB773FD83B681731A997A11F5D
-:10A6A000FF83029EBF0FFC40F40DA384911F32A6CE
-:10A6B00048A63C2DCE2FD912B77732034C205D83AC
-:10A6C0007962F0FE13B027F07E824CD5D8EE076990
-:10A6D000DF15506FF52EF23609740E3EDCFD33287F
-:10A6E0006761BE17F08D7F86B17E364B2A5BF8E737
-:10A6F000B13A5686798B15855ABCCDC182A41F35D7
-:10A700003F5DBF2F503C73DED7D4C261F8E9171705
-:10A71000EA79C2467DDCE56696F1B523855C1FD5F6
-:10A72000F7D6D6A15DBDD6C7C8AE5A8BBA13CB99A2
-:10A730000EBAD726D45DE9B2BAAF2253B519EEE707
-:10A74000F5CF4833DC7B9B1DCE3294731BF20DF5A5
-:10A75000F322230DDF0B969D6BF85ED434C1501E9F
-:10A7600011BDC050BF04109C5C1EB5E93243FDD141
-:10A770001D5719CAE7ECF896A1FED8F862C3F7F3A3
-:10A780007E759DE1FBB8AEB586F2F9FB6F36D46FEE
-:10A7900061D6F777766878057E2739D6ECAD6BA061
-:10A7A000DFD1901D8638FF755ABDEECC4965180F74
-:10A7B00069395E5146FE70FA0543FAC366B9984A94
-:10A7C0001E9BDF6F2EE4F2F383C7DE9EB412E91CFA
-:10A7D000853CC8A50FBCAF6CC0396D2EE77909FA6E
-:10A7E000EF6298EFE5EFDFA794549ACF822C07B37E
-:10A7F0003A1F705DA162B9BFD02A845CB857940A31
-:10A800006F478689B7EDDA3CBE2ADE8E09C638105E
-:10A81000EA93072DE07A42E32BD057BF453E047DF3
-:10A820005599461E06BFC7E16CF5890E07E8937F70
-:10A830002FCC1E9C1FFE41C3F3D7DCAD60FD6B78AF
-:10A840007D5BA80CD725D5BED21385E67DA5AA656C
-:10A8500028E716F8D284E4FB9AF76BF5F478764B88
-:10A86000FA67B4AFD4E208950D675F697F21E3F71B
-:10A87000E0E2FA6627ADAB5D0DCA96FE9DD98E610A
-:10A880004FE03D1831AF4479C366FF2EAAC96DDD94
-:10A890009F930ED692BFDFE21D49791F2DEA5AD24F
-:10A8A000971D29FC5CD097BDB83ED37C371AFCB904
-:10A8B0008178804AE3415BB29B5A92FC7F6CA7DEB1
-:10A8C000CDEFD5FE1AFCE08F0ACFC2FF5718F783F1
-:10A8D0004F328EA793AA8DEC84936027A0FC6D93D2
-:10A8E00018ED7BC72A05C5CA2FEE58AFD987EB39BB
-:10A8F000DECCFBDD663BE38AD0F584B736A0275774
-:10A9000025CE9FDBBF6D767EFFA6EC0F0751DFF6ED
-:10A91000653BD86E80F660368FCFE978F9B2F228C1
-:10A92000A76890FF93533484FF738958DE85F7B688
-:10A930009E38C5E3220A1E450CE03DE47CFDD63E70
-:10A940003127B606F55489D484F9EB225332102FFF
-:10A950006B0E8B2C2EA01C33E6E7DB59D35D188FD2
-:10A960006301FE3EC65CCD6827654C31EAB14CD52B
-:10A97000A8C7FC33B24C7ACDA8C7721B8C7A2C2F97
-:10A9800062D46305CB2698F49A518F8D88D699F4BA
-:10A990009A518F8DDA749549AF19F5D8393B8C7A75
-:10A9A0006C6CDCA8C7CEFBD55A935E33EAB1F3F7E3
-:10A9B000AF377CAF48B41BBE4F3C7CBBA15CD573AA
-:10A9C000AFA1FEE4A3BB0DDFA7F6FEC6F01D10FD90
-:10A9D0001C9E67C07B6871112F7CF721E377A63A34
-:10A9E000301F7F059ECF8475BCA8EF61437FAC8389
-:10A9F0009F5B88C17FB85EEFB008DD030072EC504A
-:10AA000001B45B1D17420986FAE9C1B771DF6679A7
-:10AA100050243F6E0D065B911EEEF7C5911EAEDD14
-:10AA2000613CFFB03C6E2CC7807E148C2B00FD2057
-:10AA30007DAD30FD6E04D883446F2B14A909ED4A17
-:10AA4000337DBDA3D3574C7D0ECF73E8F3D5E767B5
-:10AA5000D7CF9F6AF4A76AF4C7C44708EE1505224A
-:10AA6000FDFE8E3E5F15FEE3DFDF77E03C3ED92F33
-:10AA7000303FC0710D8B1D2AB098CFEAFDDB1DC899
-:10AA80009FE67999E761B653DB8A8CFB489788DEAD
-:10AA900010F1DD0B22E9239A02F2D903FCBCDEDAC5
-:10AAA00027443A17837C88FE82186B20BCAC01BC1B
-:10AAB000E0BDE1BADD7A426B77E2A7229D6F3E13DB
-:10AAC0003F2A1A3E9C41233FBA9534133D19F1EBBE
-:10AAD0002933F2E78AD72E75A0FC3A04F816A6307F
-:10AAE000E60B19F97585B892F6F9743C2BF01F8EB8
-:10AAF0002B81A98BF35E0DF34E2883F1BBEC91ED16
-:10AB00001B0A2CE8E64CF87DB0C8B8DFAEEFCFD515
-:10AB100002761C1679A53AFEBAB3D53FA27C4CE565
-:10AB20000F1F283A6B7FF840D1D7EB0F3F5334A467
-:10AB30003FDC370BFD29274B0FB55BC4FD242627CF
-:10AB4000305E6B6FE271BF81F8DDD71EE7790BE1F4
-:10AB50009464AE27DD921EE7091D8DA07D92716E73
-:10AB600008F3A2861BE7F870B01EFB70283D06F6BE
-:10AB7000C5313C4FA866E4D7DB9099A45019DDEFAE
-:10AB80008C20F03CA4FF46F806E5EB966669F9C711
-:10AB9000CA90F9C75768FBBB1706D57F221CD0DFC8
-:10ABA00069ECAFFF3EB6CA6CEA27FD0CFDC4EAB8FB
-:10ABB000BD16B3F93A5AB8BD46FB4C5F431CC35FA0
-:10ABC0008C712D2FC77F8B83C76DCF36CE565C3CE3
-:10ABD00028BE545C3C447CE91FAFE6F273AB21B065
-:10ABE0000E2A52D3B77E0E532F6FCE34FACB1B26CC
-:10ABF00070B8CE2DE6EB1ED1CEE3D668653DEF12E0
-:10AC0000F316DD13A03C939F53D2CFB5EAFDD414C5
-:10AC1000FBA8FEA7C1BA1AC4C786127EFFCE864C17
-:10AC2000E33D3C278A6A6B705E53B4FE6B8A193F22
-:10AC30003731523BB7698A177CAED5FFBCA88E9ED0
-:10AC4000788E16FD1287285AE2735AB14DBBEF86F3
-:10AC5000D173BA7E7EEE4E7EBECE7CEF02F0C98B03
-:10AC6000F8FB506FDE66277F0FF4119D9F5B5AC083
-:10AC7000CF219AEF538894C98750BC7EC2CA2DEF6A
-:10AC8000E51994E770EC26CABF7B662A9385BC332E
-:10AC9000E73D7CBBB85F5F85BEE439BAC6E261E4DC
-:10ACA0006B2DD1CED1F5A6713DD697E78AEFB6F0E0
-:10ACB000776FD5E8F236CDAFC5FD69DC27C7FBBDA0
-:10ACC000ADF6CB6F2DE6FBC3C33D577DBB231241D1
-:10ACD000BE359FAB4E759EBAD7D1DB968BF08E6595
-:10ACE00021B4DF7317C8DDB9502FAD5EA1F38F1B00
-:10ACF0004A58FA14FC5E610BE1B98ECCB9F2063BFE
-:10AD000094334B599600E5DED81C1AFFB606268B05
-:10AD100000D77DC5FC3E8485B77C44E36557C3D42A
-:10AD2000143A773E1DFDB35803A37B0BCDF3BC5BF8
-:10AD3000A35F571BBF2727A3D43A0FFFEE62DDBFE7
-:10AD40000EDF85F45B5BCAF6F1F3B3FC9C025E4B4D
-:10AD50004FF99BA134DA17BC12D68DEF9FF7D0FACA
-:10AD6000DD149CF6536CA7F39B43CB53309F27BF56
-:10AD7000AFF8ECCE93A72DB08637A1ADF735D9E16A
-:10AD8000FB918ED2CA3AF8EF977E71FAB43849FB3C
-:10AD9000694705DB4722A8FFDCA0FF047C2A329D1F
-:10ADA000A3652E81CEC3BA9426A22BF794901F7F61
-:10ADB000178D2DB131BCC7659AD65E6D6002FE9EBF
-:10ADC00004E502929C36FDBE841A6A6D86F697E011
-:10ADD000BE5908F3BE43CBB0BF7A6F9A8CF14D7762
-:10ADE00069532DAED7E30B791FB7A7382FA19FB3B7
-:10ADF0001FB87F6ACDB3867B051CCB9F35DC2BC08B
-:10AE0000963FFB55EE1578AD78F9B3FF13F70AE8D6
-:10AE1000F20DD4901DEDFAA322BF47EFC347AFB6A2
-:10AE2000E33A6CA8655D88F7D8678067D7009EED28
-:10AE300075E1C777A25DB2363DC47F4F24F61D840D
-:10AE4000F3350F93B1BD9E6F28B032D2D7731B0478
-:10AE5000B21F98D4B71ACBF31FF1C8E83F7CF8E8CB
-:10AE60004B4531A0CF576F3DE9C3FCD4D7A53E1F5A
-:10AE7000C2F5EE2DCFFBF0FEAE576F11290F85CE38
-:10AE80007D27E5890923387D2D1A113E85F4B5709B
-:10AE9000DD3F2725DB672C9A4DFA7E791C204EB6C4
-:10AEA0007B7FE531FCAEE8AA2EBFA1ACEBF9554E95
-:10AEB000EB73F35347703E5C7E7FA7A340C1F12341
-:10AEC0006923A0FEBBDA39A077F7F9C88ED7E1591C
-:10AED0007C7F8503EDE1D71F71B204C5057BECCC07
-:10AEE000CBF507E65D44F8D083E03CF4970207F227
-:10AEF000D95281F53989B9D921C4F7DF34FFCF3C64
-:10AF00008FA5AFCA0E5CDFA5B5AC0FCF9D2DBE518E
-:10AF1000D8F003A8BF38E225BFDF3C4FB3BEB91657
-:10AF2000EFB311ACEE816B3AF467E86709F483F68E
-:10AF3000E7D20EE3F713876F38B413C6DDB7DF41EE
-:10AF4000F6E2B56788F78F1FA1E9A5496CF2E951D0
-:10AF5000A4FF32C629A9ED0E5D1FBDBB8E5192CA5A
-:10AF60007FE1EFFBC2F3FD75323D4F152BB41E2B75
-:10AF7000F6771FA2DF16967A26A1BC9BF944A3E7B9
-:10AF80005B6C20AF685267CB819D5455CF574D50B5
-:10AF90007C6F8A76FFCBB5DAF98FAAA3E67CD5EE73
-:10AFA000C7FF8C761BCCFF6CEEED5930CC7B7B4E13
-:10AFB0001C9EE6413A993D42F37F26035EC4AF8E64
-:10AFC0009754ED56A5F8DD169D9F4E697A66C99E89
-:10AFD000D91BF261FC9647DF29C6F8718C71FAAE75
-:10AFE000FA29FFFD9F2A6F0ED19B0BE9330F9B9827
-:10AFF000EE7988B11759127D5FFB8887E82408F63F
-:10B0000090730ABEE1F45A85F776227DBFC0DBBBA0
-:10B0100034FF36F2C8ADBCFE9F1DB233487C19B474
-:10B02000D13311B44DB1B867CB7CBF5887B1FC8127
-:10B03000BDB718E5CAB5263FF403C13A3FAD71C4A8
-:10B0400048C2C712459D8E79004B5978038FDFF2B5
-:10B050007B7BDE953A0EFD10F97D8FC06280A7558F
-:10B060007F7CE0DF518E5DF7BB3BD3518EBD2775F2
-:10B07000E4E0782BF7B6A5A31E78578AA563FBF703
-:10B08000E25C9E0DD29723044D0EABE902C8E4D5D5
-:10B09000446AF0FF257D1B6E8671FE1BF08C7CBF21
-:10B0A0007ADFA7543EA4BAFA5810FBED9D8E702C9F
-:10B0B0005FE46D6A0EA17F69E4CFEB7E79678E4213
-:10B0C000791EB1020D7F05D86EF51E3BE5F9A21F72
-:10B0D0008FC3AC617D343F73FB355D6F3A505ECBFF
-:10B0E00036D65778E1E0EF60213990DFD6ECDBF21D
-:10B0F00091988ECFF75EC1DF835A63B24F9769F2A2
-:10B10000DB4CFF5D26BA07FC507C210670F19F6383
-:10B11000E272BCE5D7778F7F03E07B7FCF53E9F8FE
-:10B120007B133AFDEBF73C9FE86A5CE818E21EA14E
-:10B130000F343EE9D70F9A7E52F60360B9507C84F3
-:10B140003F57DA13E917C27C5776DA4348F32B1FCF
-:10B1500010552FDA552F3BC91E59F9C049A2DB956E
-:10B1600082DA27909E63E928C7F5F55AF1C0DFA679
-:10B17000A39C5E9127B299C08AD7FDFE135E1FE89B
-:10B18000DC0DF5573CF8C6F41F6219E489CB62BDAB
-:10B19000A675753B7ABD16EBD5F5C6748CCFB7FC9A
-:10B1A000FA1FB41EEFFD4560B92583DB2FEBFC1BB6
-:10B1B000C5C1DE8785F167727CA1BE59D3252E7289
-:10B1C0006458AD5F62D6C395F49DF2C2CFB48E1DB4
-:10B1D0002318D78F7F7CE0DF1E063896BDE20CCDAA
-:10B1E000C471FFED86740674F08ED4C4E9FE676DF9
-:10B1F00039A8BF97D96339323DF9FB65BBBE47F427
-:10B2000078ED5FBF97A3ED37E4D9481EC4F2709E76
-:10B210004B7F3A8FE6790D8B103D2EFB19BF67F1FE
-:10B2200013F0B3ADFC84A90AE71B27BB7EFCCD015C
-:10B23000949B78670BC0E160FCBEAEE778FEBB93E1
-:10B240005D95916CE77A146ECFC558FC35B43BD749
-:10B25000805A46B9F6FF003503B31E008000000097
-:10B260001F8B080000000000000BE5BD0B7C54C5DF
-:10B27000F5383E77EFBE425E4B5E8457B8791224B4
-:10B28000C485249040D485400C0AB8404494884B2F
-:10B29000C010202101AD60A5CD860002C53628551D
-:10B2A00014B40B8245451B31086AC08D2886EA1705
-:10B2B000438D165BA18B2008045810EAFA2DCAEFC3
-:10B2C0009C33F766EFDD243C5ABF9F4FFF9F7FFA08
-:10B2D000A9C3B93377EECC79CF9999B3E2814BF911
-:10B2E000BF8C62ECE1787DA5C9C25805D33B3D66B1
-:10B2F000867FC215814A493F189FC35F0263790761
-:10B300004675F3A4316662178CF767327611EA9FAF
-:10B31000B36ADE6357E2193BB1D1D445B819CA18F4
-:10B32000565A07EDAFE0DF6DFEB25482CEA3A9F905
-:10B330005F18F43F97BE04FD6C3991BF0EFA65B1FA
-:10B34000220B8FE5F073303E4B71486578367CAF49
-:10B35000E5A8B107D43BA3742C19C7DBFC0DC1CC05
-:10B360001A2D617BA5FF8A9D26E656C603FFAFD83E
-:10B37000F48D91613F3AE6ED35AC7D3D6395E9880A
-:10B38000870A162EAD84F284D19BFF2E7E07BEBBAA
-:10B3900019BE53B206DAA7AAFAAB3FF937968EED7B
-:10B3A0008DFEE7F1F8DFC58C65412116853B42181B
-:10B3B0009B8938CC693FFF855F553FFE81AABF0C52
-:10B3C0002934EA7830FC63081B7245F4BFCFD603FA
-:10B3D00092BAB77FFFFB2AE7E31F18F06D27E1B1B0
-:10B3E000CCE07A09F154F6A5C9EA043C96BD76C9C9
-:10B3F000A88B422A326F7257C64E6FDDF3C57D307F
-:10B400009FD37586A831F4555B9810E3C77BE9B6E6
-:10B410006FF2D7417B03E03D08E839B7FE7BA30E0E
-:10B42000DAC7E631AF09C67F3ACACED800C49BE17D
-:10B430006B8F0A6F79F0DC1342E3E8A98BC5D2DD8C
-:10B44000934139378A59DDF0FEDC16D12A21BE98A6
-:10B45000779925A4FDFB15754703E8A2AD67CC6B72
-:10B46000B4E377EB7F735E0C53E35DFFB5478577FD
-:10B4700005CF81789D8A78EDEFC7EB2596160E9F54
-:10B4800061A75E99D3C791D61EBF0A5ECF563164BD
-:10B4900072FFF33E12E159DA091FEA06750D72C90F
-:10B4A000D8174C85C7D9AF9E21FEFD67779189C01B
-:10B4B000377337FDB00CF90AD0EA3501FFCE759D20
-:10B4C0002778A9CDEC650437160AE91DCD5B8BCF33
-:10B4D000C0FA78446AB49FFE86C5CC190AFD7A7713
-:10B4E00089AE8D30B47392372C02E6B734883D6054
-:10B4F00087F29C4586BB2A307B601A8CF39C33DD37
-:10B50000E2C4F782D8E43AA0CF39BB37AC6B887F6E
-:10B51000DE471AC43009DA7B5CACA02EA43D1F3292
-:10B520005643DFF7B0CEEAAB491E4689975FF7C0B6
-:10B53000F72E38F5CC04DFF3547FFFBA07CA637ADD
-:10B54000B305F134A3FA9E30A683EF3724DE351914
-:10B55000DA3DB80FF047D3B319BB037EA7F3A9B305
-:10B560006F99F3E95C989F189AB9F75D78BF04105A
-:10B570002B02BFCE58A5C5CF6C660F77C7A3DC1AC8
-:10B58000FC7C42FF7519DDF0DE4C4748E54AF86E59
-:10B59000E97A6DFDEC86D3C45FB303F8CB81FCD5AB
-:10B5A000BD3D7FBDA2C8ED403610F96B9418A24393
-:10B5B0007E3ED724BA4CF0CE852506B60CE00B5B58
-:10B5C0000517837E2E3440238477729839A3896FC0
-:10B5D000153E57F0D68AFCD7B73D3EDBEAB71F1AB7
-:10B5E000FC1834297BEBEFE9EBA06C7DEBCB947777
-:10B5F00011DEF1D7B8BFB3F6EDF376FF3095C6B5DF
-:10B60000DBC4705CE7767F14F718C2EF98ACC8B75C
-:10B61000E7169B6C0CF5DDEE505732D6F7067E0030
-:10B62000BAD7ECFA3E1DF53D634B888E9F4B462AF8
-:10B630002F34FCEBB080F3683049388F8ADD80040A
-:10B6400078BFE29D2017C3F7777D3FD811F2F3CD85
-:10B6500067AE9139883F43D9E46DC8BF5D990DE766
-:10B6600053F16ECE8BD5F0FDF2FA46E374A8CF7B92
-:10B67000EFC774D447E7B6351A515F9D35785E60E1
-:10B6800056E4DFFB6B0D80E7B3A1D0590FC61EDD7A
-:10B69000F0BCDD19D2115E381ECE011E705E80979F
-:10B6A00052575AE7F8F8FEBF161FE7A7E2F7CB1A82
-:10B6B0008630315E8D17C1C69F87BACC02CD9F3FC1
-:10B6C000DFFD7D3A0BB9F67CA3E38D24EFFF7F9974
-:10B6D0006F46FC7F2B7D39BFBF2B4934BE40BE6F08
-:10B6E000CFD73B1E21F8F5502B8DF73AE57DE27F51
-:10B6F000EDFCFF6FE83DEFBF76BED7A2F73E99DEC7
-:10B70000A11613EAAD5D3FC6B11B9877EDFF47E781
-:10B71000DDE6FFE8ACE64C18DFDF98EBEEE10279FE
-:10B72000251DFA23BBE2B5EB8E71B25F51C3BE1E7D
-:10B73000390DBEEB047F02FDFD9A90AFF52D003769
-:10B74000839F80FE0543E704F0D05C38D0B512ED4E
-:10B75000B6BE925900367C319DE0C9C53FE833A1A1
-:10B76000FDDDE0E761FBFDD59E19D550BFBFAB4EB7
-:10B77000AA01F82EDBC4E47A802D3D440BAE636A47
-:10B780006C19664935BEBBB2B5EB91FB02D615F715
-:10B790004CD6D64F621BA3F5D0DFA4520373C194DD
-:10B7A000EE0E68BF2EDE42F8BA87552EB584DC381F
-:10B7B0009E4ECB78AA61839A24C48B4DB46E66EDFD
-:10B7C000F1C6106F8897D80CB6D28A5FF1E85B009B
-:10B7D00036C9FE15FC913CDE1D657E09F16462F3FD
-:10B7E000D923D0DF25495F89ED4D0CD68D7CDCB4A3
-:10B7F000DE0CC41B93D79F26990477D91E628867F5
-:10B800007CDE2756F33ECD3B10CF378ED7C5C94FD0
-:10B81000235E0B43AD2EE40BDB8BD17AF85E0DE09B
-:10B820005910FCF854F0148877F43969FD27E35B6C
-:10B8300029D398772AFA9D612CCCBA12FA0F33F7E4
-:10B84000627A3E0FAFA93B161686EB357104AB5BEF
-:10B8500009EB3596AD6F6D9B5702D5BB1F83F76A19
-:10B86000E6C1FB88D75E4CB213FF1759707D2330B9
-:10B8700007BB12ECF73F3FCD06FF339E4AE2DB4F9A
-:10B8800037717FF352EE9BCB0682283198B3733029
-:10B89000FAB9F29FD35384EF894C67C5F52FB3D91A
-:10B8A00024CB60EC97D1BA263C5BA759FF76B575DF
-:10B8B000D1E02DB220420347DB7B68DA779B9CA066
-:10B8C000A9EFEEB84953DFB3749006EE5D3954D357
-:10B8D000BECFC2111A38DE7987A67DE2F2091A3886
-:10B8E000B9F63E4DFBBE6B8B35F5FD5CB335F5FD12
-:10B8F000B7CCD7C003EA7EA9697FF3CEC59AFA8197
-:10B90000EE959AFA8CA627357056F3739AF6430E85
-:10B910006ED4D4E7785ED1D40FFB769B06BEC5FB10
-:10B920008EA6FD6DBEF735F070F6B1A67D9EF9339B
-:10B930000D3CCAF2774DFBDB638F06C43B2CCE87F0
-:10B9400032518D013F819C8D964E6BDA83C75C84AA
-:10B950007C6390F9E1CED4EF34F563ADFFD2F467A8
-:10B960006495400464AB5A2ABBB03A2A43583395D5
-:10B97000BF1EE0B027A05CBCE05C864CB53FE7FB97
-:10B9800038B4239FE63EE444BEBB14CB2CE24018FF
-:10B990000FF3EA91AF75C1977B395471A3309FC8FB
-:10B9A000DC19C0873E814A8B2F98B923810F7D41D6
-:10B9B0005446F822E979A4AF2B9551BE9EF43CDAA7
-:10B9C000D79DCA185F2295DD7CF154C6FAFA53D987
-:10B9D000DDD78FCA1EBE0C7AAFA76F2095BD7CC382
-:10B9E000E8796F5F0E9571BE3C7ADEC7379C4AC915
-:10B9F000772795F1BED15426F82652BB44DF782A2A
-:10BA0000937C53E879B2EF5E2A537CD3A9ECEB9B8D
-:10BA10004665AA6F0E95FD7CB3A8BCC9F710BDD7CB
-:10BA2000DF378FCA34DF63F47C80EF512AD37D3552
-:10BA300054DEECABA6D2EAFB0DB51BE85B41E5207A
-:10BA4000DF53F43CC3B79ACA4CDF3A7A9EE57B9643
-:10BA5000CAC1BE17A91CE2DB4065B6EF552A737C4C
-:10BA60002F5339D4F726BD37CCF70695B9BE77E901
-:10BA7000F92DBEB7A9BCD5B7879EDFE66BA4D2E689
-:10BA8000FB989E0FF7EDA37284EF337A9EE73B405D
-:10BA9000E548DFDFE9F928DF9754E6FB8E5279BBF2
-:10BAA000EF089505BED3548EF69DA4F20EDF77F411
-:10BAB000DE9DBEF3548EF1FD8B9E8FF5FD40655BE0
-:10BAC0003C21D710A017DBF49FEE0AC67942223A38
-:10BAD0008CB7B5BD2FEBE3D5C12F308C7B8CAB146D
-:10BAE000689DFE4CF0D90F484FE69824849762D3A6
-:10BAF000EEFC3B9618C6EEC77F488C35E69868FD8D
-:10BB0000BEFF57FCBD65C38F7EF510DAC779268668
-:10BB1000F63150FF2ADFFD347B4F34FA61CB0679D2
-:10BB2000CA30FEF244BCA708CB860481ECC59B72E8
-:10BB3000F94E828ECA3503B8FD2E9A971C4E71AA13
-:10BB4000A8EB9BD7FFA2DD8FF6B77F2189F7C34211
-:10BB5000BC71642FAEB39FEB6DB7D4FCEB3F605C60
-:10BB6000C756A36741B702ACE7F6DEF955A86B33B9
-:10BB70004CC939A2F28F18E7712E36596AA210CF3C
-:10BB8000BFFE13B65FC898DD04E51F121C9F254059
-:10BB90003FDF07C5B9C038C25FE59009A13F6BFF21
-:10BBA000FFF83FEEFF34EAB5CEFAFF87CC476312C9
-:10BBB000EDE7701C4C6F4B473A8C58DC5D8C82F77C
-:10BBC000A7AD122CC847D3970CCC47FE18C46C14F1
-:10BBD00027BD3F923D60EFC02FEB96A893FD0BC9A8
-:10BBE000780F8CE70CB81CE84F144B8CF8B2B841B6
-:10BBF0007039290E6D0B1B0BF6BB54E6DBE2E5D565
-:10BC0000C605D0AEBC3B8F9731178F9799E17F283F
-:10BC100047736A37ECA570A37899E26397D0EF0574
-:10BC2000D699B3A57D3C7601C699771A2D6837CA97
-:10BC3000EB02E2B90171B3C0789925518EC75A99C8
-:10BC400095C7B9434AFE8ADF63619218756DBC28B7
-:10BC5000F1598949DD108FA3C4B4705CC75C684A90
-:10BC60000E67584A52376CE7005A344329E81D439F
-:10BC7000F039E0D38974F55607BB36C2B88E803DE3
-:10BC8000913270408E21468C47FEAD375B2910D52E
-:10BC9000C80FABD824925FEF59FCAF6518C79E154B
-:10BCA000AFA775C0348CB9E3F8DEEEEA720AD42F80
-:10BCB000E1DDFB9A407157279B1F8B71DDC07D141E
-:10BCC000FBD2E871D948A7E55D079990564EDB177E
-:10BCD00049312AFA2CA921BC16C74672FAEC3490D5
-:10BCE0005F0BF4A946FACC72198EA9F17C895D36F6
-:10BCF000E27E4CF1F2F344AFD97E7A69DA95D73619
-:10BD0000125D814E9AE71595279438FAB1ABD12B85
-:10BD10003F805E183FBF072B1745927E285AEC4E96
-:10BD2000AE54F169E0BE44D28CA1E1769087821EC8
-:10BD30009C1E4C6F8D417A7EB72A8BE81548A782EE
-:10BD40009FA6133DD8DF42D96618CFFD89EC810943
-:10BD5000F0FC0139FE7A7FCDE8028C974F4DE4EB81
-:10BD6000934F61FD6983F5E7812A33B3816AFEACA5
-:10BD7000CA42F0E755B104FFB54AA2F2CBAA542A51
-:10BD80008F1959699D4ABE80018C38BE192857D138
-:10BD9000582AEBC3876331EE5EF0D367593A52A954
-:10BDA0006F8E1FD51BD7178004157E261706932F7D
-:10BDB000ADC01E83253F16F5C70AC1BA19E96A1F2F
-:10BDC000A669CF5233FC30DA2F3DE727E08B8DC8D0
-:10BDD0007FF78E89D4B49FB4BCA7065E9428D1F8AF
-:10BDE000C617246A9EDF57D45F034FF3C17A1E3E05
-:10BDF000952415E89CD0FFC54F0CC4CF172B877432
-:10BE00005BC061E2BB40FC1F333A298EE0DC68B2C4
-:10BE1000A2FEFB3688F3F7B79F8BAE1A5AF73A2982
-:10BE2000EE72C96C91709DF2C874671CD63F120CFB
-:10BE30002EF940C497C8307EC05E3191FE9CBE563C
-:10BE4000604E94112FA3F5F2C32F9B689E33D68AC0
-:10BE5000CC91417C1287ED1F8E96A8BFFB13A53AAB
-:10BE6000E467EF66937523D44EF7C8EF0B83681F22
-:10BE7000A47CFE5F0FEB511E529AD371AD5514EFA7
-:10BE80008E463DD8BAC940FB5EE5E286921020D1CD
-:10BE90009C27DE0CCB9148FC08BFA70E446FC0F96D
-:10BEA000FBE7EBA2B8C8377DEC1B13419F9E2A71BC
-:10BEB000A5D33A79118FC7B7C70B233DE5D4854980
-:10BEC0009B71BED31D432C696A7BC8F7FDA61BACD2
-:10BED00031D634E4FECCEEA8078EAD321460DC051A
-:10BEE000F4FE38C4D3B1DA48DD4A5A546D23FE2A31
-:10BEF000D64B46F5778B5789366A0FFA7D3CDAEBDD
-:10BF0000D5A2830D41B896FA772E171CB8EF94C4CA
-:10BF1000B2BB21DF3E346F48379CC7D44EF619CFF1
-:10BF200082CC3854FB58B3778976177E2FD3A32F52
-:10BF30001CA01E3F8F03253996F79A8F747A23C869
-:10BF4000BA5242BD9A188EEBD4932D6037E01BB3E2
-:10BF50006A1AD32560BDB28776101D4AC7D5A5B829
-:10BF6000E1F901B3E313C4E3B7DDEB9E1E8671A2D2
-:10BF70008617E39C680717F2FDB5D9AFCCEAA3F6A4
-:10BF8000E7DBFB132C56978D853B4600BC38249687
-:10BF90008FF89DC2EAE4F8858BC627A1D2057C58AC
-:10BFA000CAF8FEDB749D75EA679988FE500BD2458E
-:10BFB000E9EFA881C7B9FE21CBB362877B24713F2B
-:10BFC0006BBA8ECB1DDB2D109F02C1BE4852D9CB60
-:10BFD0000AB68AEC656C4F91E1BEDDD9C408592FD1
-:10BFE00070FB3707ED1FEE0B5B04928FB22D269787
-:10BFF0000BF82B3589CBE76CE36B4F0FC2E6F1955D
-:10C0000046FCCEAC7A813D074D4F195C25CDB82F4B
-:10C0100065D9B02482DE33585DC8A7B27E3783422B
-:10C0200040BD3013FF09F5E56B04979BF8C54E76CC
-:10C030006806C64D70FD8F7A5EA547DAE9F700BD48
-:10C04000FE200BD8D7AFD5DA177B70A819C7397B7C
-:10C050000DF76BFDE311D915C05589C3B5771C8D5C
-:10C0600057A0B848E0F767E2F870BC303EB7F5C6B5
-:10C07000C75362E5725A562BB85C1D8C4FC16B7862
-:10C080002E93D03ECFD924B8901F4745CD23FCCE68
-:10C0900006FC46225E9DF6B07B002E014672517C66
-:10C0A00085E3BF623DC73FD0F92F6ABBFB4D94D7F4
-:10C0B0008878FD06ECA713F7032BBF27BAEF05FA24
-:10C0C000A2FCCE7AC365C48DC8D3AC362C04F97EED
-:10C0D000ED81BDB82CF866CD9B31B87E2D8A7027D6
-:10C0E000EB406F45B2E8270B6EF1F35FA0BD6E67C2
-:10C0F0009703F0E36476B243EDF0645ED58CFBDE2B
-:10C10000EDE827C7C51EC47F017E1EDC24DA82D27B
-:10C1100035EDE4F3084EC25BA9D34B7E4229CCB384
-:10C12000C6824F9DF9889707AD8CF4EE8D8E3770DF
-:10C130009C4C2C22FEC4B81EFA21FFEE7803FD8F22
-:10C14000494957F73F02F548A0FFF195C1A65B8C1E
-:10C150007EDF01BE2F7E51EFEE8DF27B312AC10AC8
-:10C160002DFC7A347A5037D4F38A1E2D91ED96D275
-:10C17000EF8368AF003EBEF6CD30A4BB42FF9968A6
-:10C1800027D2FC76E291E9D03F7CEF911D41D4FFAC
-:10C1900099B160A7A0CFA2E73F0A632AFDF7781FF5
-:10C1A000C7FC24D4278A5D1337C45980BF147D7916
-:10C1B000AD7557A7F30A099857A8765EC538AF0C36
-:10C1C0007F7FD3E5797DBD9CCFE7E82A3EBF19ED9F
-:10C1D000E6C5EDFE232F9AAC4EF20BDCD12887DFAB
-:10C1E000BE21B21AA22FF71B2E99819F0662FC6610
-:10C1F00015D9F593D14CC2B84EA7F67BB589FC8210
-:10C2000059DBF97EEB29617837DAF8FFC01DF62893
-:10C21000CAF53691A11DF28FA7CD6E3F9BA4B6DB68
-:10C22000D789378CB3A23D9B0BA843BE9FDBD08D33
-:10C23000E1399755C3599D48FBF01ED263C04214A3
-:10C240009F063F5C136F3031ABD98C74EA24FEFA41
-:10C25000CFE4F353E7133EBC29887FE5FB155DDC93
-:10C26000866EE8D7BC21905F53FEF0F0B0E10CBFC2
-:10C27000C3E3663B92B89D7A07F51CCC4BB0555290
-:10C280005C0C7C1ACBEF705CEB797C98BDCFEA102C
-:10C29000BF0853FC58C7E7214816563488C7E5CD78
-:10C2A00068D7427464D702F17042FE4EB9A823FFEA
-:10C2B000B7CCC8FDE073023FFFF1916C1F3F4AE22B
-:10C2C000EBCC4F92783CE11CFA81D0EFB95B4CAEDD
-:10C2D0006A01DD563DAD93F5B92617FA337A7388B6
-:10C2E0005B4C47F4EACFB6C933E06B2A6B36203D8E
-:10C2F000C765CFDB82F339DC8359C4AE546DC77D8B
-:10C300008429A41918DB6FF8EA438C473AA1AD08D9
-:10C310006B8529D9277A63FBF508C3FC0F07D57D08
-:10C32000887196C3F17A86FB02CE5D26B2FF861134
-:10C330009EDE14A7ECC258CD408CC7EC598A7CB461
-:10C34000373632D502ED1FD077B18A5CFF8C3C8F37
-:10C35000E32D15F8FECD124F16D2E766B6C472DC97
-:10C360004C5B0BF55722AFC63F7A765CE10318535E
-:10C37000D908F8C750C6192B9BF0A98101AF045FFB
-:10C38000DEF4C88435B9B869220D403A972578F5AE
-:10C39000B89FE215987723E0E1EE6CAFDE86F4B249
-:10C3A000B1BABB807FDDFB9880DF4111C0EFDEE3D7
-:10C3B0004E18857860A9120B87FABBF412C1BD0A2A
-:10C3C000588428EF1B601CEBE03081E8A0334B065B
-:10C3D0009CB7BD401884FBA2658BAF6F9C61C9D52B
-:10C3E00034CE329D8EAF671FE5EBD929CE23A3C88B
-:10C3F0004FCA6502F26145449D81D6D1202F38FE97
-:10C4000081D08D1A7F53F41E3EBE52185F0ECA456E
-:10C4100012F1F17D9502F99315C68EE31A3D9295BE
-:10C42000759745C2F673E05FC8D7731A7624E3F7B1
-:10C4300056099C0FE6287CB6552B97B9C9ECAA7C07
-:10C440009D93CCF93A2799F37572DBF7EAC8EECEE3
-:10C4500069F8E820AE2B3BEBBFDCC4DC84975D269B
-:10C460008A1F083A6F12D1051109749882FE24B808
-:10C4700088439223B89F2EF36709FA1F8958F2B8B0
-:10C48000880E9427DAC3D2DA178D88B4C0F347E058
-:10C49000F8D039A0D99B029FABE22AA246EF50DC2C
-:10C4A00053307A67E078845B83ACA88FA718EB6879
-:10C4B0005D1ED8CE50CBFD2CC372EE67D1BE1AC024
-:10C4C000A655DCCF9CD2CB3B80919EB3E40BF1AC64
-:10C4D000CD2F2EE19F86E7651ABFD88471048C7B2F
-:10C4E000ADE5FEA05EF65F8B5769FD85294B54FED6
-:10C4F0002275EB2DC7F11A160553DCC584FE84CADC
-:10C500000FF8876EBC13F5B033414FE72F0D2CD0D9
-:10C510009FB0331ECFE4CFF5B29F383AD9A0D97F70
-:10C52000738E60A9888722D44389A86AECCB319E98
-:10C53000778185D662DC6C94B888E27F45D5FC5C57
-:10C540005A60FCEF42E587CF637BACC7E70BBAFCD0
-:10C550001487FB9BB02CB50BB782BFD1E5F0250744
-:10C56000CA07282AC3508C03EEFF06614117CE8408
-:10C570006CFCBEFB79ECDF69345B506F3D131C46ED
-:10C58000FD2C5C28507C788985CBDBA1AF4237A29B
-:10C590009E52E2BDCB8667ACC5734B359B1B27987B
-:10C5A0007BA37A60746E8939F7FEC506F329BC0C4B
-:10C5B0007243F047136CE1C0E71F7AA79A014FCF8F
-:10C5C00026374DD0839C9CFBBDF705845F4D3EC054
-:10C5D000E127BC7141086FFE9CC3D54A7F9F4FC0C5
-:10C5E000FECE3DCBE1E550EF84EF17A17EC3790F7E
-:10C5F0001568DDFF8AEC7F2BF19E22DDFBBC1CC1A0
-:10C60000DC683FAFD5AE3ED9FE0AFA3B62E8B150D6
-:10C61000F42FDEEE6B7B05EDF78E44FB53C948AF7C
-:10C6200016574C34C6B174AC19E90276CCD6D1BEDB
-:10C63000F42B493C4EF3568A9DDE57F005FDACFFC6
-:10C6400077FA1999C2C7A5EA67F3BFD34F78DF76A7
-:10C65000E3793D39FAC6FB9917D08FE2B781032CF5
-:10C66000A19EF2A6DAF6E1F8E6FCDA36A21EF5CFD4
-:10C670007E91F8F4BBCA1D2968F7BFDB6A8A44FBC8
-:10C6800037E7F5B7E34A308E20FB45A71BBF344A96
-:10C69000F0FE5C9FC86CA0A72B7C029573EB1B8DF2
-:10C6A000F96978AEB6D198A71A57993C4EE074FD57
-:10C6B00004951FB33F5927EBCDD554CE79FDA41E69
-:10C6C000E9394757771CCF1FB3A13CEE1538BF1D82
-:10C6D000B2DE3D8CE70D3A8803B4C8FAB9777FDB48
-:10C6E0006788B7B7509F030CE6CAD111BE7AA5F090
-:10C6F000711475E17A3EABC55AF219ADFBD27522C1
-:10C7000094830F561A8BE1F9C1C41187105FEDE3D2
-:10C71000905E1E876CE071C8A288E687C198B16EF2
-:10C720002F5D7CD20CEBB83B9F91E503450FF44B9A
-:10C7300081499197E0892373799C0BE1FF4D363C49
-:10C7400085E7089BBA34FFE233B40F2B42D94690F9
-:10C75000B3FB8784C66D83714C77860B603BD970C1
-:10C760005368CA3468D79A30BC5B0AE92746FE6131
-:10C770006B82FD02CED7131FAC036784398C3C9EBD
-:10C78000E5F8B348F12C477AB0C3D501BEBC323EC0
-:10C79000BBA5F0FD9D261D8C73108E839FEF85BF7A
-:10C7A000B86D186F5ADC4740BE53BE3F2671788C77
-:10C7B000FAFB6312ED624AB4BA7D38C3F6D73B0E7A
-:10C7C00096C2C71193C2E965CF05FE52E9FD092360
-:10C7D000833570E198486653AFEF0A7B6AE0C9453C
-:10C7E000899AF6F7CDE8AFA91F6B6ACEACBC017F82
-:10C7F0005F0C4B0DA7F57F165F871C6AB8F4C51454
-:10C80000F46337895601E6356BD7E62F8651EF1270
-:10C81000C5B94E3589648FC0BD35AAF74FCEB06615
-:10C820003A77ACEFBA84ECDF9C587EBE7B964BBB6C
-:10C83000FFA1C4E53BDA37417B5686E7623ADA3737
-:10C84000F1C7E3AFBA7F929D22AF8707B1417C3D2C
-:10C85000DCBA1766CAF2763612BD6AF6895664D516
-:10C860009ADE0213609CB7D79B5C4130EE336F1F9A
-:10C87000314AAAFD930A5F35062DE0BD23463C4FA1
-:10C8800075305922FACD6D386F64C017B737CC2395
-:10C89000B96E6E744445A3FD027F757B26F2575D29
-:10C8A00026DABF269DC58EFB6173968FA63873B8B6
-:10C8B0006F0A9565B5A3A9DF72DF4482E7FA8209A2
-:10C8C000FE546CAE3F80FD3C136E417B5EAE776ED6
-:10C8D00045BA944BC119B85F35B7FEC0C55FA21DFC
-:10C8E000B5F07B1D63C5BF6462FDD83E165D4D5734
-:10C8F0001C6F10F5D33CE2EF9968970A705D00CF8A
-:10C90000CBB6E53850EE87D7845A50EE453C4FD62B
-:10C91000019FCE48E1FE9EC1C3C73BCA379EFA5372
-:10C92000EA67A72450BD021BA237E9517F28F330E4
-:10C9300080C1C7F20E5F7F2A2BEAC7EBF15CFC9F38
-:10C94000535F8C423C41FB102C93460E233DF35D1C
-:10C95000E59070D681DE524A93AC87A7A01E86FE72
-:10C96000EE4DB555A11C8E5BE4D19B518F86982D61
-:10C97000B8FF312E7BA054A29A8FF8FEBDB892006A
-:10C980005FC56B40BB3D054AB5DE7EA013FBB234EC
-:10C9900045D1DBD54467C50EB12D4F325C874DE5DF
-:10C9A00067B5DAE46ABE2CD7CAFBCD02F7079CDB79
-:10C9B000795C7F7EAA632DEA91E6E16CF236D2A71C
-:10C9C000CD71E3437FBEF187E99B89CE611649872C
-:10C9D000FB0A4AFDF36DF3E0F27DAD79AC94DB7FA9
-:10C9E0002AB285C8179FDE765BB30DFA6D7C2C23C7
-:10C9F0004354D9A9D753F8F94766F15E267DB13B78
-:10CA000058423D3016F71E32FD7E3F9E87C4B84621
-:10CA1000C56ED3463C0F561106EB7CF8FEF8FE8E31
-:10CA2000D7917E8DEFE55CC47B34365C98819CDBCE
-:10CA30001A865CC473F63633681B2BFA41B63F91F5
-:10CA4000BEED64BCD7D2674923E744A13FF11D0C7A
-:10CA500009ED2DD8FDCC160EDB115F8EE55CFE1CBA
-:10CA6000B21C4E93F9B75896C3697A2E870FAC095A
-:10CA7000B760BCB378913000CFCB3129D48A2AC0BB
-:10CA8000807C9981FCC9F9B2CCD75596E778B91F5B
-:10CA9000CEFF81F239D71749ED1439FD53AAE310BF
-:10CAA000B72BCD990B615C77805CA3DE732CEE9E77
-:10CAB0008972E2E713A305F909F824B644C50735DE
-:10CAC0008D3FE8914F0CB902F18909CA3C151FD975
-:10CAD000DBFC134B7E0CFA554BE2752B99BFFEEB3A
-:10CAE00014659FFCFAF8FD53B97D7108F81114FF25
-:10CAF0000963185FBB1025519C74FE0A1824A060BE
-:10CB0000BEC19D8C7198F9F382280E56D252B92C71
-:10CB1000546A4FAF7B7DE9B4BF3CD19744E5C14433
-:10CB20008717E5659A6F928CC7F4EBDA9FCBB2F169
-:10CB3000B89BC165B26E88C7B89B43A4FDB8DECC74
-:10CB4000F214D929653F8EC7DD309E87F1BDC0FD47
-:10CB5000358CC3E17ADA14A5D3EC13B68BC70DD7A5
-:10CB6000EEA79535FE65B00EEA4FC5DB282EF74DD2
-:10CB70001F47505F98C7EC09AED70DEA7D36198F75
-:10CB8000757A7732DAD1BA4A8E9FBA556201ED379B
-:10CB900031163C5E755EF75A7C3CDB9748F851ECE9
-:10CBA0008BA2B77754D1A1CF36FD7D2DBB532EF389
-:10CBB0007B39F2BBB5BD9D51F835909F15FD6C8852
-:10CBC0006E213D7407BC82FE83A2AF0BF286E5A204
-:10CBD0009D1FF67262FD3B30FFD854470EE2E5B66A
-:10CBE000577B67AE03F80EBD4B6F09B91E7DF88306
-:10CBF00081F4E1A2F18CF421946A7D68E8C40FBF4E
-:10CC0000B5EF8DF1779ADC1EFC58EE1F82BE56F709
-:10CC1000373F75C4F8BED074525F6E277FAE717710
-:10CC2000A6C727F5BD313D9E278FFF5A7A7C565FF8
-:10CC3000AEC703F5366863D2DBE776F5A338D96172
-:10CC4000067A1EED5943B0B4395E75CEBD4BB84B74
-:10CC5000ADD77BF79F3E0BE97A1D7A7D36B6FB7721
-:10CC6000F57AFEF837C8AF823FFB5DB7C2FAE3370B
-:10CC7000B0BE43F85358DFC5B79787403908E47B07
-:10CC8000588FD41F80F1353DDD87E20E2007C4F7B1
-:10CC9000E5C0F728078ABCCCAD1F188EFB06EC1345
-:10CCA00091A1FE0F948382BC57F518A7423D8EF8E0
-:10CCB000DA03328F7A26D04EFCD8D7F12CF28F22AD
-:10CCC0000F8A1C5C9B8FDE36E0BAD450769EEB79DF
-:10CCD00028D57ABE337FE6851BE4FF55D7C93F6F61
-:10CCE000FCFCFCF3C675F2CFB6FF847F9246BE4BC8
-:10CCF000FC83FA13D76F777E6C0D5FC0F987CE2562
-:10CD0000023F6462DCB969706F2BC669EEBCC2FD7C
-:10CD10007AD0E9E4D707FAD55364FDF7801C2738A9
-:10CD2000986AFFBC2F9757F2DB8727060F447B7565
-:10CD3000BDFEDE94A84A6683E70F40A9D61326A459
-:10CD40005B07FEFADF6E90BE4DD749DFD37DFF63F0
-:10CD50003FEF52DFEBF0F3926CE68988CFEFDC7A9D
-:10CD60008678BAD67AC0B096E3B9CD5F77EB15BBBB
-:10CD700019897613F8E39FFF097F8CCDABBB68065A
-:10CD8000BA466D3116EAA1FD243C6B41F10CD31A71
-:10CD90005B12EA1BA6EC0B50BCE35351869DE69652
-:10CDA00091308E3B9F62FE7D03A81F951BDE161FF0
-:10CDB0001198BF7DE41643CB2A8A3FF0F32ACCE1D9
-:10CDC000D1F37D3219CE043854056707C0EB79FBE7
-:10CDD00030BD87F1731FF27359FF8CB3F07D01FFF3
-:10CDE0007E9E37BF2BFA7FF58205F717EECB3D67A6
-:10CDF000C478CED83CCFDE9ED02E654B7861483FBC
-:10CE0000785E2FD07807A7765BE34CA2235B363C95
-:10CE10006F5896CDF74D4C758DF9B60EF87070AA17
-:10CE2000D64EE19F3E86E263F467AA13983193F7EA
-:10CE300093107F7DEF23FDE8FD047ADF6D8ABAFE53
-:10CE4000F7EFC9653657077C345269877161A57F52
-:10CE5000A0C9C43AC1D651DC664C2A9797669DAEEC
-:10CE60009C019E0A53FBAFC1B8D728C6F96252EAAB
-:10CE70004D854E1E4762B680F95E6DBC433B98AF50
-:10CE8000A47DDF7D357CD95215B957DE97E95FAABD
-:10CE9000E59370BDFD83EF601CE1518205FDD4B9BF
-:10CEA000F6A0552C1CE92EF335CB2AB4E5C2FC8242
-:10CEB00098268ED7C6D76C70E1C834F9DE3ED567A8
-:10CEC000AF41FADB756DED399F37086DEFA7EA19B1
-:10CED0007E82DEAF4C1DB206E37E400FAA2738E902
-:10CEE0002A7C5E1700E706C805E330C925EA65C05D
-:10CEF0004F7207FBB74FC8F83D23F0F34DCD23B871
-:10CF00003FD79CC0CBADA9DC7F5B23E371BDDCBE0A
-:10CF1000B98B0A0FBDFC74863F37AE0754F3263C2D
-:10CF2000DD1BA5CC7B52E118985773041B20009F92
-:10CF3000BC943A61CD92DEFEF7B7A44E223EF1F7E3
-:10CF400057D88276FC5E194F5B53EF6EC17A3C7204
-:10CF500082F2569ECDF75F4DF5073A94B705EDF98D
-:10CF6000C789F915CA8991F03DC166C8E4FD2474EA
-:10CF7000809F5FB57FDF16F03E3344DDC8FB327D16
-:10CF8000C604D0AF20807E2303E0222DECF783A1DE
-:10CF900067F09F8A77AE5E1A83F1B32D02DDB1028E
-:10CFA000FD6C14E079E396070A43703D2A4A869E99
-:10CFB000D0F6C32DD35ACCA0BFC6A3FE227D5C4CB5
-:10CFC000FA7A22CA39C1D30B6D3723DF542E8D85EF
-:10CFD000F61F6F99B106EFBDDEB764B50191FEE9AA
-:10CFE0009692357AE8F7DECC3FEDC5FEF4D5A52D57
-:10CFF0006384ABF0696DC03CD607C0CE80F66BAEE3
-:10D00000A1CF9704BCBF28A07E5500BC36005EAE01
-:10D010007D7FDA0CBE7F390DE88788BB96BC7C9398
-:10D02000DAE617B4D92F01EDD9C75A7EBFB386C34C
-:10D0300067531F295C1EA282B72C2854F3AF41B658
-:10D040001753A2ECB68EF8F75067FC931A68D79C7A
-:10D050009A73898719D3D8DF3DA2166E1495F12EE5
-:10D060006D79384DB51FC89614E23E51E7FB158B1C
-:10D070000B71BFE2CEDF29F58B0B6DAAF929EDF319
-:10D080007FBC22E2F7F42F57176EA2FD3F79FF2EE7
-:10D090008297B75DBE128674C9C7F3A358DFC59DDA
-:10D0A0003C5F6DE7595D0ACEAFF1317EDFD05903A9
-:10D0B000F400392F6656DAFF6E0C0F5FF812B4DFFA
-:10D0C000F398B810EDD7E1859174DEA8B01FF7C7CB
-:10D0D000F684F7897910E0C6E0078C18576D7C7CE0
-:10D0E0001495EF8BB6655E407EFCCBB564C71B83A1
-:10D0F000C3092FBDFBAD2AC42D59A99F44787444A0
-:10D10000586276A21FBAD2C070FF8931EB0BC427D8
-:10D110004F98C84F9D56DD9FF67B8A7F3F3EBF3BB1
-:10D12000B42B5E6AA0F83FFCD17D0CC7CA5146AC57
-:10D130009FB1442E9DB753F9DE4F6F7E9C4EFB3A54
-:10D14000229DDBD9ED8B380E92CCBE760EA0FB0A69
-:10D1500047E5FC2A6FF773A4F583797CDD9A44F9DF
-:10D160005298450A9B807EDB4DB601FDA2FDEDDEA7
-:10D17000FB49A4FDAA775B8B63906E43FA717ED95D
-:10D18000ED2B8E2956D9F592337AC2F37B46E961AD
-:10D19000D41BEF75E92D38496EEB2231CE3A43F6B8
-:10D1A0009B814F16BED9011F26F513A9DF63A68503
-:10D1B00078169635FE263A17C7A5BC97D5E2A8C1C2
-:10D1C0007C31865ED220B57F7C6BF2883C9C879F49
-:10D1D000BFFE48FA9CFC6380C7BDFCE21A27DABC9C
-:10D1E0003DE0D7E338A26CF958AF9CC763B175290D
-:10D1F000EAB882DF0F5D2CCB3F6F77080F07C3F7CC
-:10D200000F6D0DA2735F879C7F0F55FBC78A7CCC87
-:10D210000CFBD5E1665A17874B421CF08DBEEAF82D
-:10D22000A3F05EC9F306D29B25CF472FF2623DD013
-:10D2300013B70C03BFBBA51F3F0FD0B97CD407C8E1
-:10D2400047FD55E5A3F4E5370B378574241F5531A9
-:10D25000C847F9CF1BE87C755197CA4918472CD2AB
-:10D26000DDCC6A607C239EFF450CEEB3CC7CDE44B3
-:10D2700074F584861EE7F3EA138FF36AB33FFDB8B3
-:10D28000BEF254E790BD1075E09D81FE16971968B7
-:10D290003D22C61849EF8961565EDF85C52F06BB62
-:10D2A000BC34345B42FA6E4679C8A27A09F92C2F55
-:10D2B0007CF21D78AEE5F0C244DA073B99C9F7C1AC
-:10D2C000663DFA6218FA9F871EE6E7BB6763BE1DDC
-:10D2D0005CE7FE9BFB5E1572BE9DFFAB7DAF67FA00
-:10D2E00005EE7BF173A07B16666472BC30C984784E
-:10D2F0008A1B4878B9DDCCA420C08B18C15250FFDE
-:10D3000028FB5EE22FB97E127502ADD38F55392905
-:10D310007F415E98993FFF25BFB7273E3D9ED13E96
-:10D32000585425ED8345C8789D26303BCACFD1207F
-:10D330006BDCBC34E4BF20A2E7CC17667DF16C2621
-:10D34000D26D6C94269E80FC17ED7FFF44F52D3442
-:10D35000BE1302B3A0BDCFFB43DF91489F46D1F17E
-:10D36000F4BDA4378369FF9C593C4F0C01786635A6
-:10D37000ACB319F24DF7B884347F3F33173F968230
-:10D38000F4CEFB43901BCFDFCC5812B416CF619480
-:10D3900035F07BDED3567C47E77159BCBE12E39C67
-:10D3A0005F2F09E2E7D4EB8710FF4CD3F1732E2CEB
-:10D3B000CE48F1A5B21019EE954DB0EAFE9211E9F2
-:10D3C000A1DCBFF918F50A7CFFB4820FF41B51EF02
-:10D3D0002AE7E859A584F25FA4133A3CE7F5553FE4
-:10D3E000EE9F4E8BB3D279D1F2DF9AAC8BE3399DAD
-:10D3F00045559EB9729D377F2DF6AB63D2760BAE45
-:10D400001F9A4B70BDCDEAFB521E820A3DD31B23EF
-:10D41000E0B9C4F599329E0A69FCEDC44F7A7650A2
-:10D420001F81786CFEA219F96371A8847191F2AE24
-:10D430005607F51B6AB6703B217F17C79E887CE0B4
-:10D440003346201F7C21E84C3CFF804D07F5E71850
-:10D45000AF6FFBCE921569346FB34537A23BF2DD57
-:10D46000F9FCB5F0DEED4C4AE88EF7C456444E9A0E
-:10D470008CF5AF89A49740987E9B8DFEDE6B62068B
-:10D48000AE53A7ADD843F39BF3C640BC41C0A6BD85
-:10D49000FE19D9A739327F79E4736BC500BF01A5A6
-:10D4A000FE266E271C22ABAC2358D0EC572AF5E59C
-:10D4B0002B0C448FF2A526A27379F55FA9DFF2D079
-:10D4C000E618A447F97603E5EF08BD49A2F6C5D5ED
-:10D4D000BD730FC2B88B0DE116011E9539C71A1125
-:10D4E0002EAB150856BE57BEE2F3185D1AEF0F4B70
-:10D4F000938EEFB3FAFB8D8E437B767A6B64DC34CC
-:10D5000015DD4F2FD91186FBCE4783DCC978CED7E6
-:10D510003B2FC88AE70A9578DAE925C9FC3E90A531
-:10D520003914F7AB673C9C188176EEB0C56DC4FA30
-:10D53000C375F178648ED92C965C846DFA9B093E94
-:10D540002D9F23A13FCC1F2870BE29DBBAC79800AE
-:10D55000DF1B24E3E7CC6B47F70E457C001F5950D7
-:10D56000FFC435A7A01D2ED735A7F444FABC2290DE
-:10D57000BF00EB531BE61F998B7C3508F4A1CC57F9
-:10D5800073EB772C40F92C7FEB643EE2F5CC5866C8
-:10D59000C4F858B93C7F583F7EA087F6E5DB36E4F7
-:10D5A00033FEFE07C8778ABD07788901E026238706
-:10D5B000336EE2FCD364F450DEBBA6498CD1FE99F5
-:10D5C0009E8DC47640797E0F4014E5FB6995B113BA
-:10D5D00078DE3DA7FAFCDC5CAC4FF3D777C6378525
-:10D5E000325F14579BC82E15CA78F1ACD81E867CC2
-:10D5F00071E6B53D7B87A25C6C132C4C2D0F8A1C09
-:10D60000C679793DE0EF49C4DFB6F3F998876276D1
-:10D610006BA8843454F0A4C89B82970AC6F1A0E09A
-:10D62000A5422FE349AEBF5BC64319F3527FAC75E9
-:10D6300080B419FB7FEB07DA6F3B338D09FC9C301C
-:10D64000CF8BA6CCCF11A1DDDF5F26CF6FFA4DDCEB
-:10D650006E9659B85D2C8B6252F540E2339B51C9EE
-:10D660002F094DCEBC714433FEE7653968A337CE30
-:10D6700003C6E9D1F17B8281FAEB51197F47AAA752
-:10D68000B851AFCC76423F99280F96A9B8CFC95E62
-:10D690001765FD0D32A9FA6EDEAB47880F41774959
-:10D6A00011B066316C8171A0FFD5DA9BE28579DD1E
-:10D6B0003C34EFCD632C4C07FAE488E009DD89F6B1
-:10D6C000E05191F494324E9BF363A287AD8ECB2749
-:10D6D000F20BC60715390D1CEF3279BC269DD58398
-:10D6E000E782D96281EEAF898BCF841EE4F68E2269
-:10D6F00089FEFE6FF900F7236D17C324816AAC7AA7
-:10D700006C37F7625802DAEF2372DCE1C8D21D6190
-:10D71000C52A3AACEBEC3BCB864848FFBC90838FE4
-:10D72000A11C3D759320F3BF75E442D40797C22432
-:10D730003C2FD514E14C433FAA49C796B308CE8786
-:10D74000FA183FFE405E087F502F3D65F1CBA532B1
-:10D750006EA09B1BE906ED6D5C8EACB48F31378AF1
-:10D76000EF8B5E5B9E323CA49FAA056963A6BF9DBA
-:10D77000722FEF7179DE2423317E7B80FC89F6CE17
-:10D7800024E7310ACC837A7BAFAE7188BF8A10B3AD
-:10D790000E977081F581B07F3D55A9473F9F2D8938
-:10D7A000DDABBE977634C849F7CFBCDD45B611E88E
-:10D7B000513DEF237E9EB781DFDB52EC34FCAD6A36
-:10D7C000E33F78AF34F37C3EEAD73FE698E85E5318
-:10D7D0004C7F7EDEE514AB330E47FBFF6D737E9806
-:10D7E000E45F9FDC72D12D8693BF10AF591F94B5B3
-:10D7F0007E40F25CCE9AE93EF6B4159F8D1D82F410
-:10D800007ED940E70766D4C6939D3BB9697A06CEB8
-:10D8100077DAD26482676D7E90C32B78FEC3694B42
-:10D82000B35E42FFEB68902D1FF9D9BB5AB0E0FA06
-:10D830006AD8E6AC45F741FDB0D03E5D71DC873675
-:10D840001D1D8B743FB45024FD64DBF4D424ACB7AD
-:10D85000ED14F1C618AC672C8B30AF29D3875BD0A1
-:10D860002F50CE17D618B8BE3D2FEB87936D25E706
-:10D87000D3BC9A9A14F497BC1BC01EE1BEB7D15B0F
-:10D8800042E7BB058B7523F0CBB782936066B1246A
-:10D8900054E7E07D96F5941FE75CB2C9827EF2FD05
-:10D8A000266645BFF6FEF77A0FC2A5824D5E578DFC
-:10D8B0008DE4DF55F0A57CDF2BF33D135795D0BEEB
-:10D8C00043A49480FAAD493E377E541EEFC9252FFC
-:10D8D0004F42BFE0E496E408A6C2FB49394FD32C7F
-:10D8E000D083DB3A58EFFD7893127770D1774AE511
-:10D8F00078E03E436D2FCCFB1978BFEBC486203314
-:10D90000E6E70DBCE775C2C0ED47BBFB5E3BB570FB
-:10D91000609EDBC0F12865BBFBFFFD433AF4E315D5
-:10D92000390B7CBFDD7DF2A4EB3B5F8579C9F0BE8E
-:10D9300077D34D8CC63932F8C737515F97D49A2CBC
-:10D9400078FFFE589044EB2167169336A39D314B28
-:10D95000E1B89E3FB62F83CEFF957CC548AE4AEA1C
-:10D960004517A62AFE6075DFDFE502FC60BDC18AAF
-:10D97000EF9F5CB37A1217336D9E856CC6E57326F4
-:10D98000AC93DC16FFBA2870BD347BED1B748FF0AE
-:10D99000E75A2F2971A4407CDFDA5FCE4FDAC9FD48
-:10D9A000B9F7806DB207B5C7776B9583D64567AB7E
-:10D9B0004AA9CCA9DB90D753C2FB14477E3B0CE5A8
-:10D9C00026349CE221AD5595B489777667C665BC4F
-:10D9D0001FFA6E48B805F5C5D9AA85F2E502994F38
-:10D9E00064BEBCA5BE51ECC9A87DC33068BF3B2452
-:10D9F0009CEEBA24D9B2C3D1CE2B740DBCDFACCC13
-:10DA0000EFD4A39CAECA784F6D991E867E67E3BAA9
-:10DA1000C8869C283C9E1B6E417F7BA67CFEE5F859
-:10DA20005AAE6FBE3587BF3406CFCFAC9F1883EB9D
-:10DA3000BA070D5EA315FAB5EE1A1F8671BC6FF416
-:10DA40009E30BC6FFC0DB477A39DD0BB44D4734310
-:10DA50000B18EDE30D75EB99144F5BE6C41739AD68
-:10DA60007A17D2F5B4FBE29E2BC847AD3A8A77010C
-:10DA700066F65C81F6D6D03E14277CF06DBEDE647F
-:10DA80003F76E1F501F7169FE9CFFD9613EBDF1C1A
-:10DA900047EBF34D060B8EF3ECA6CF63F01CCE6C78
-:10DAA000C6CFD77FBB45A079CC067E0C8A47FDC088
-:10DAB000E3A0B341EF9B85F67C98B7A59AF8703642
-:10DAC000F021E6F59E6DE3F99867633E6689B5CB74
-:10DAD000FFD155E6BB39C077787FF7E7CEFBF13B46
-:10DAE000850F03E45EA1BB821785FE7E3E649AFC2F
-:10DAF0008211750387F7647E7DA0DCEF607ACF2A00
-:10DB0000BCA7B1400CADC57C55FBF5957FA0BC2DE5
-:10DB10004E3DDB4CF69CA562BEBC05E24D568C0723
-:10DB2000D6182BDBF2BA607D605E173184BF3F1ED2
-:10DB3000F313C37CBBA6C5D3F72658ACA310DD8670
-:10DB4000280FC505C43C9D8DEEE5D59868DD1CA861
-:10DB500087EA64FADE95C6F5D0FFF4E7E7B5957B72
-:10DB60007F4A099AB137F2FBF8E0884B1234D9D5D5
-:10DB7000FFD0DDB84F3B7E58C42F12E1FB7B5F3DE9
-:10DB8000CAE18C88ED090037F5FFFA6EBCC731FE9B
-:10DB9000E6882C03FA01D5C7EE1E09F0F1FEB67730
-:10DBA000FBABBEA3F40BCF77E3F37FC439DEEF4FBB
-:10DBB000CFBD2548EF734218CFF796E4A538A8F2F9
-:10DBC000DE01811D7E57F0C31E038BC3BC06FF839D
-:10DBD000BA3BBAF3B27B9AED63FE7DED73A4D077C6
-:10DBE000B8CE94F77F7466C988FE9FDD6AB4F2FCF4
-:10DBF0008ACC6E06BFEA2E997F8BCD974792FDADFA
-:10DC0000645613263059AEBD8FD5CF7F6F6FFD8D13
-:10DC1000DCDB634E9E87AF46CEC3D7D93D4AA1E138
-:10DC2000A31FD0BF0CBC3F95F149F35BC827E3802D
-:10DC3000AFD05E643673F82E994FCA778CA57CCF2F
-:10DC4000F30F185CE827CC92FDB12447172641BB9F
-:10DC50004B20BFA8175AC7B953507F9CA862B5493B
-:10DC6000A0B00ACC8E4BFD014F4DF11F515EB41395
-:10DC7000EB6BC2D0EF3903EB8931D04599ECDFB3C0
-:10DC8000CBA2FB36F483E3FB6D5CA9E2B79F643E55
-:10DC90006B8D77C7E1FAC6196FE2F91A2FEFA13C35
-:10DCA000CF0509A3B3308EB4BF6A273B9AEC7FAF90
-:10DCB000B3FB284375230C69AA7DC971FA8ECF691D
-:10DCC0009C51F2696EE2F6DBA4AFA53C5A40CACA89
-:10DCD0006A82ED14578A451EC5F8B0F410C1CB66B0
-:10DCE000310BDD63F5EFD3D17D5085FE36EB959199
-:10DCF000D86E1CD01FF58DCEECD5236C2FE0E753EA
-:10DD0000FA01E1509F28F41F252EFA2DD261BE7C26
-:10DD10008F6BBE50C9618399CEB906EA478C6B16EA
-:10DD200091DE74EECD417F0CF424E55590F5A2040C
-:10DD3000FFA3BC48D91B8CD4ECDA7991F6E6FC073A
-:10DD4000FA31234D9B475CA193E25F754627454F0F
-:10DD500002BD86A5455F3FBD943C65F39FE7F1CECC
-:10DD6000F9CF4F8F1D44780389437F28ED4F44C47A
-:10DD700099F21CD8FA48E263C308BB84FA76ECCE69
-:10DD80009E4C8247B3760A74BE75CCCE4882C37C63
-:10DD9000DD795E25D9DE8FFD63B711189F3CF9D27E
-:10DDA000DF1FC6BCF7637EC3287EAC0B0EA17C13BD
-:10DDB000E208398F8318F221DE63BD20F1DFA1B0C4
-:10DDC000B376F9037444FF267E4E1656794E4E27DD
-:10DDD0007EEF6FFE3E6EE7E70FE7FB8217F00D6800
-:10DDE0007FA150A43C4DCF04A793FF5673B781EE9B
-:10DDF0004730A7ED2FB8AE9A2CF383291616962A32
-:10DE00007A054920AF2AFA3C1EF4DB0F1DD0BF076C
-:10DE1000D65D420FC682532334F57A67D037983FD8
-:10DE2000D6102B5A5C30FE506B0F4D7F76B1CC80F4
-:10DE3000F114E6E07EB4C25F4C6CD5D3BDF95C9EB4
-:10DE4000BFE2EEC9DA7B9286DCF323C9DEE46AFD29
-:10DE50006FFB35F236FD4AE1A77EAC9F9C979EECA6
-:10DE6000FF85167E3F4462F6B58ABCA0FE07EFE64A
-:10DE700019C4CFA42603734984BFD7B0FE82D364EC
-:10DE8000C178409B1F9E04EF45A19134139F635EB0
-:10DE900050F53C312FA81A2F9817540D635E50751A
-:10DEA0007BCC0BAAAEC7BCA0EA7ACC0BAA86312FDA
-:10DEB000A8BA3DE60555C3981754DD1EF382AA6142
-:10DEC000CC0BAA6E8F7941D5F59817545D8F7941A7
-:10DED000D530E60555B7C7BCA0EA7ACC0BAAAEC7C9
-:10DEE000BCA06A18F382AADB635E50753DE6055557
-:10DEF000D7635E50358C7941D5ED312FA81AC6BC59
-:10DF0000A0EAF69817540D635E50757BCC0BAAAE51
-:10DF1000C73CA0EA7ACCFBA98631EFA7BA7D335B78
-:10DF2000928C766C77BCE37FD268DFE95BE2E783B3
-:10DF3000F7033FA31C364DB450FEC21B5C277E9EE8
-:10DF400026EFF7C8FC7B89854CC573E89DBDAFF013
-:10DF5000E7EBB2BF01F66039F12F0BAD457FEE71F3
-:10DF6000BD8DEE4339EBF8FD44A6E77EC00251F6C5
-:10DF70007FE4BC100B4489FC00CC1DAC578DA7ABD3
-:10DF8000CDCCF42A3C4416583470B43D56D3BEDB95
-:10DF9000644953DFDD91AAA9EF596AD5C0BD2BB3FF
-:10DFA00035EDFB2CB469E0786781A67DE272BB0693
-:10DFB0004EAE9DAC69DF77AD4353DFCF55AAA9EFD5
-:10DFC000BFA552030FA85BA8697FF34EA7A67EA04A
-:10DFD0007BB9A63EA3A956036735AFD5B41F72D04F
-:10DFE000A5A9CFF16CD1D40FFBB64E03DFE2DDA9BA
-:10DFF000697F9BCFAD8187B37D9AF679E6031A7866
-:10E0000094E54B4DFBDB638F68EA474B2735F5659D
-:10E01000A7B97FCF6A607D8071CA109E5F63AE9B97
-:10E02000D5A17F7167EA794D7B4314AC17807FCA15
-:10E03000411FA2DFF77D9738CAC7CC2AC3AC78EF5F
-:10E04000DB39A2F20FEA7BDE63AD3F68BEFF4C70A6
-:10E05000983B88D61766B2B7230624907D6CCB27F1
-:10E06000A2DC67675E161B4521212FFA4702FEC21C
-:10E0700012C061369E171AFC20F29F2CE017A1BF38
-:10E08000D9B62ED2C5C7A35D0EF6FBC5BDAEA8F2AC
-:10E09000BC5CCB2FA66F67519EDE5103301E5EF72E
-:10E0A000463EAEB36631E732DC4F54F22CEE0FD26F
-:10E0B000C6B79472B419F0ABFADEBEA0DA5E83AED6
-:10E0C00022EFA3CDADD4BEAD5F39FE25C064E7AB72
-:10E0D000FAFF2DACFFF420D7B555207FE00F3D5956
-:10E0E0006521784D552CC14F574954AEAD4AA5F224
-:10E0F000B92A2BD5AFAFCA26F8852A1BC1AEAA0212
-:10E100002A3756D9E9F9A6AAC904BF54E5A0724B2B
-:10E11000552995AF545552FDD6AA8504BF5EE5A496
-:10E12000B2AE6A393DDF56554B707DD55A82DFAAB3
-:10E130007251B9B36A0B95EF54D5517D03F86F084E
-:10E14000EFAE7213ECAE6A22F8FDAA66823FA83ADF
-:10E1500048F0DE2A0F954D55DF52F9E72A2FD57F7B
-:10E1600052E523B855DE87583440D0DCC753603DB4
-:10E170003BC6FD3DCC5B817918B20D67AF961F376A
-:10E18000900EA7E4FE0D23C05DC238728F948D35CA
-:10E19000AA75C5F201DC5FACD6F1FC2DD53D98A582
-:10E1A00086FC761BE3E7B4B8DF3E13FF25C1D3A896
-:10E1B000AABDB8DE28A9E479CAB3901F53891F3FCE
-:10E1C000B9A1759ABC2ED891687F6600AE43425CB7
-:10E1D0005FC467FAEFD11F4C743C877C7AA1F2C10F
-:10E1E000BDD87AA6C59A821F196B724763FE2FEFBE
-:10E1F0003ED1BA51EAFC7B15F2FD874EEB779FECDE
-:10E2000085F6AAE02791E2FAFB0DA193719F7FABFF
-:10E210008C8FAD03749AB228C9FE2A8EE74472E54A
-:10E220004B0F09FEFBFB77E1121FE47B3C93280FA9
-:10E23000CE4466FB105DF0BBC11144F81EE6A4B2EB
-:10E2400035C1518FEFDF0B0B10841D434D711DCD78
-:10E2500027703CBBE5F1EC96C7A1940B92ECBB1088
-:10E260006FC7926D9AF16C95F3338C63DE17705C17
-:10E27000FFDC75FEB890E8C7775B3C8555529E8CF5
-:10E2800022C6E3298F635E8C287F5E0C65FD50B447
-:10E290008FFFCE11FDA1FD5C104FEBDBC0BC19CB95
-:10E2A00086EFE17930603D86F77F8BE6FD82F42FC3
-:10E2B000FE1E14DEDB5DD0E530E599F1CC025EEDAB
-:10E2C00049793578DE1B0720B027E5D5A07AE1260D
-:10E2D000F87F771C9739554FE3EB42F94E9E09DEE4
-:10E2E0004F796930A660EA8A798F79BC66BFFD3CB8
-:10E2F000F7BBA3BC743F7547A2E3EB013C4EFE7431
-:10E3000006C689909FF03B16179D5F037E320A80F8
-:10E31000A29951C04F1DF81B0ADFCC95EFE128CF21
-:10E32000811F5B11DF67DF1E928A7C53B13B47423E
-:10E330007CD7E8F87D3AE79FE57D41F9F710C4F016
-:10E34000B40D74EF009D71A46F4E28DD3B6814D9A5
-:10E35000C2373AD0AFA1E95CDEF7C7F27C92350153
-:10E36000FB93C6744E77633AE787B1EFEFA33C6443
-:10E37000739B78BC9A657AD2EC1D9CCBAA58F89B0B
-:10E38000A79354F3A8D879849FE7629E34F539AEF9
-:10E3900064F9FB0AFF89C650C78610F5F878FC01BE
-:10E3A000E420243D8BE4E038DEEB1E6792C2EF11DF
-:10E3B000E8F7C1CE627E19C71F2C741E503917387A
-:10E3C00083D9A99C099613F9DEEE5C4DF7E767B394
-:10E3D0003A7A3E377B7A1CC215CC3B3216D747CBF4
-:10E3E000AB3FC470D0C4DAD5A3BAC3BC26B8A67DEF
-:10E3F00088E5F84DC271A74472D43B1DF7B785CAB2
-:10E40000A53DE07BF76D1DBE14E3D6E3444E07F651
-:10E4100031A74311F0B318D17E7E203749E95C6EF5
-:10E4200068FC8ADC142D66363C7FA0DC0F6993A360
-:10E43000EC39FFE8897B38E04F22BF56EC3645D0F7
-:10E44000FA14F3CCA0BE92E567A99EFB974E4C6DE3
-:10E450004AFA93FB1B069B9CCF8B717F648E93AF14
-:10E46000C74E19B8BC9D3A14EA42FE5ED0E5F538B5
-:10E47000920F83221F3F4DA5F33D0CFC8F5BDBFB0E
-:10E480001F6D79667A31F237589C237650A2DF9E51
-:10E490009FD2B90687F1BCFCA3105F7B63F9FA79C0
-:10E4A0000EE6A1C1FAAE7609E3A5A7A2CD745F2856
-:10E4B00030CF1963569A9F419E1F8C6C32FAD32637
-:10E4C00039AE561330DFEF83E268BED27056C7D044
-:10E4D000B1D05B9CD351EE1FE2766241975F3BF077
-:10E4E000FB9E20661186D17C281EEBD4317B0D8FDC
-:10E4F000CFD2FC16EACD163C97B36C9AE811C84E01
-:10E50000C038319E1765B6F2BCAA4AFEEDC0F1DAFA
-:10E51000B4E333C7319C9F4D64DEA0617CBC383EC0
-:10E5200027D083E803F034D5F8A05F17E5FF0996FC
-:10E530002CE88735FDF8108F2F5773FF11C6BF8564
-:10E54000E8D31DC6DFF3DAE337208BC2F817A4C780
-:10E5500013DFD5E00EA28876B62BE9DF0941F64736
-:10E56000900F931C2B7BCDC7B8468EC98AF13B76A2
-:10E57000B9A617EAA91026515EAD71369E570BBA9F
-:10E580005B82FC301EF3D659C80F6855E761630102
-:10E59000F135200BC55727607C8DDF25FA00E3B3EA
-:10E5A00013E5F3CDFDD8570AFE28BE26E2F8285E13
-:10E5B000EDA0719A90B25006619C87E8E0A27904C0
-:10E5C00033B71CCF6E26FF60B5CC87430F32B21332
-:10E5D0004343B89DD87D84B9F0DC57E30F93F242F2
-:10E5E000A17EF7793DE929C013E5037CE7736E57F7
-:10E5F000769F3CDE13F703AA7FD8DB13FDC4DD064C
-:10E60000875881EFE7982C8BADFEB846C3C1101E2A
-:10E61000D791E37CB7C8F36C60CD3515509FDD5DB5
-:10E62000641807CC6A7107A33C638EDA8EF61B73FD
-:10E630002F1A35BF6B61B068E16CA682E3F1E85137
-:10E64000C0EF7FDEE03A775BBAF6F729DB7EF7B3FF
-:10E6500035EABA7EF733539EC7AA74FBBBE964D789
-:10E66000268832DE05C417E88146C4F773E546FA0A
-:10E670005D83C67263778F6A7CB5B3FE49F87DEF20
-:10E68000C77F92DD7A2F4BC98F531784CF8DCE5021
-:10E690008ABB3D77594771B775A55FD3FAA4369BFE
-:10E6A000D1EF88D55E2E263FE05201C34D24567D22
-:10E6B000EBFF9622FCBB5BCCF4BDC0F1EF027FDE2A
-:10E6C0000D847A17FC79775FC6DE067F1E61BCCFAA
-:10E6D0008AE576F0E7B174813F8FE50BE0CF633BCD
-:10E6E000F4E7B17C0EFC792CD7823F8FE5D3E0CFE5
-:10E6F00063BB35E0CF63F924F8F3F81CC69547E314
-:10E700003AC8E8DEFEE2E0B015E86748CE50F237DE
-:10E710003EB50DEAE251D9D95B2FEA3474CE6DD5FE
-:10E72000FEBECDD063119ADF3FC9FEAA87A67E70D8
-:10E730004B82A63EDEA9FD7D9B3E0BAFFEFB363D28
-:10E740004B4704FC3ECE1D01BF9FA3FD7D9B68FB94
-:10E750007D01BFBFA3FD7D9BDFC9F932153AA648F5
-:10E76000AF05215FAC2B9D10CE3AF02F94F2499962
-:10E770001E0AFCD4A3E2E48EE2C85137737BFFFE8D
-:10E7800021D3BE4D80CFF758B81DE3EEEFD974A466
-:10E79000979E5B1B4271589367E849E49FF76C4C66
-:10E7A00042FE79EEF2882E389EE140467CDEB3943C
-:10E7B000DBA73E374BC4CF3D4BBD22DE17BDEDB2CC
-:10E7C000D78AFCF85418FF9D2DE8D7B518FA7B7F3F
-:10E7D000ECE07E18C7792E04F819E5CDED0D4E0258
-:10E7E00038FC8A8EA17E045B4979FE9DCF86C8E7FE
-:10E7F00051AFD07DB870D4E9A097DE2BE5DF4FF1A3
-:10E800005C0E56FB43BFFBE95A7861C4579DD6DFC7
-:10E81000313B01C7EBC73BA84628535829FB2DE2E3
-:10E82000A38CCB4F6DA98EE4E912C813E207664DA5
-:10E830007461CD5A797F12E5434D87B2841538CF84
-:10E84000E7D6E869B76C94B875DFCDF0CABA16910F
-:10E85000B6D9258B37B823FF4E19F73A1B9F5F8433
-:10E8600095E9D0CE45003E5DB49F6DAD56FF9ED577
-:10E87000B3B27CFE5E96CF67647EC0F536C2A3C499
-:10E88000F5A353701CD95C5F033D05BC8F75690609
-:10E89000A3DF11FD7D6142978EF27CAF91C7F182BB
-:10E8A0003CAFF5D82FC93397FB5162D170EC679D0F
-:10E8B0009D911E5F67FBBA1AE376970A79BF7D16B2
-:10E8C0007904C46FAF4AAF80FDF77ED84DA54B1ECB
-:10E8D000678FD266AA57FA93AC2ECEEF655FB32648
-:10E8E000982F1EB215C95EB4527ED4757A3D433B53
-:10E8F0008CFA0CE14B663D9E91603D661D63789FEE
-:10E90000B936444FFB14EBE69E2278B585C361CE41
-:10E91000CA343C7FF1B63C9F30A7936057C07C520D
-:10E92000A407C2D5BFE71A58EE90F1BC5DC6C7DB9D
-:10E930000687EE028C63C85F45FAFD8ECEDE53EC8F
-:10E940006CF657BA00FDD34523FFF81B7BB25DF888
-:10E95000F5CDB87E76DAC92E28EBB6ED63B87D5DCD
-:10E960001D3CF5635CF717CA7CF44CF0B80FB1FEA0
-:10E97000B3D1FC77701A47DFDE5BAD2777CAE3DEE1
-:10E9800021E33DC7693BF430B41F6F37E1C8C08C49
-:10E99000D97AFF02FAB38F11AD6EA05B4B96220FAE
-:10E9A000F66094BBF7C74C6707B1FF02BEEFB4BD7A
-:10E9B00060223D9798FDCE01F0DE5F9AF5E4CFC06E
-:10E9C000F3ABCAE37E19FF9FC8E3F8B38CFF269927
-:10E9D0004FF7A21DE98B7196542ADF97ED885BB63D
-:10E9E00023BB653BD220DB91B7D18EF4C5794DA610
-:10E9F00072BB6C4732473F457ED225CC8B2BA01D86
-:10EA000099CB96C138F361FC6207F6EDAE6C31E04C
-:10EA100077B2823574BA333552038F967A06FC4E3C
-:10EA20005762C0EF78F5D7D4E79933027E076C9828
-:10EA3000A6FD6DBE1101BF23A6B523438F4DD0FAAD
-:10EA4000335FDDA7A91FDC52ACA977E23F60BE5956
-:10EA5000C718CF2F1B9CFB04F24BD671BDF2FBCC29
-:10EA6000B48FA6F85B81FE4F166BDBC7D3D13E9EF9
-:10EA7000934978AE93B6961334F5E43FB518EC3D60
-:10EA8000F1FC61F578E03B3C87D8523286D13E3CC0
-:10EA9000F02FC85396FDC457946F542CCA203FE9F9
-:10EAA000A25EB39F9613B02F661FA9DD37CBBAC6FF
-:10EAB000BED9B19B3BF91DF6D688EBF2C7409E4408
-:10EAC0001CF733C153F720DEDEFE92DBA9C62F1FF1
-:10EAD000E989CF3FC0A6D0CF8E6F1E21BF6B479B69
-:10EAE0007C3882D5FED6760FB7176FB524ECC47587
-:10EAF0004666B4407A30F3C8FC29C48F2D3AFA7DBB
-:10EB0000CE94828A60C4CBF6838B83B5F7A754FA80
-:10EB10008108A5D20F22B232FFBDBEFF07E9D10F97
-:10EB200034008000000000001F8B0800000000007F
-:10EB3000000BED7D0B7C14D5B9F8999D7D25BB812B
-:10EB40000D09B08104260960AA3C36EF4D48C22465
-:10EB5000048C1AC8427804C1304978A48A9AAAB5AC
-:10EB6000D86233211062A4121F55B08A2BADDAF699
-:10EB7000F6B65425A0A22CCFAA5058306844D4052C
-:10EB800014ADA5F7A284D6F6CFFFE73DDF77CE24FC
-:10EB90003BC32640DB7B5B7B6FF8E9E4CC3973E653
-:10EBA0009CEFFD3A134208F94AA4FF8B1F4E0269FD
-:10EBB000047FBE4A81FFA7F4B6A19F5C4D02F6F028
-:10EBC0007686A19D6F185F62685F6F183FD3D0BED5
-:10EBD000D130BE56D7BF2D3473A0E2A4BFC3CFA49B
-:10EBE0008BAF5B1A09095CD53B2EDBEC133D632F21
-:10EBF0001E97D369EA9D97FEB7F3FD25A6F3F1842E
-:10EC000074748A7E5B32BD1E5F42D42C3A4FA7C912
-:10EC10004F04BC9A08EDDFD6C5DA36A23AC6D3FE59
-:10EC20002D9D664F9B44C80EFEDE31BE85037D31AF
-:10EC3000844C329F8DF85EF982A9777F04E69B3978
-:10EC4000904418A75D77F179038D76BC6E6F74914F
-:10EC500080ADB75F8CC9EEF4D17574844C1E7A9B7D
-:10EC6000AEBF248ED07DEF762E76C0BC74BD840CF2
-:10EC700023E4DACD23AA9A461122D1759BE83EB649
-:10EC8000844CA48DEE33EB287B7F96458E734580B4
-:10EC90002B21263DFC2F9A8FFE009C9CA2BF8DC28B
-:10ECA00065D7FB73E2C6D3F95FEA1409ACC7AAD4EF
-:10ECB0003B7CE368BB8BAD4B9B77B25DD4C1A19825
-:10ECC0003874F8283C3B48D7CE3A41D7499FB74AD9
-:10ECD000157100DF4BAD939068031D0D32B487E9C9
-:10ECE000C68F9128DEC6F58D8797381EB6001EE8C0
-:10ECF000C65E8AF254F922C06BCB07D67A7FD8FD64
-:10ED0000660F054A365C4D78CD3A61F204287CCE18
-:10ED1000779A3C00BC3C57BBD810619EFC8FF4F442
-:10ED200099D319AD83171117F4CB07CB8F37ADD912
-:10ED30001336FEFB9E98F8D3D7D05F72492EEEFFB4
-:10ED400012CFFFA9515DB3C742E99892EC663A8EA3
-:10ED5000B82A0949E87B3C212B717F1A1C892B8E2C
-:10ED60006EEE72F0D48ECF5D84AF3E9EEF9D472550
-:10ED700064308527052F8C5B3BDEF7B887B6496882
-:10ED80008608EF7FD0719B18A2EB7ECC71DB6EA062
-:10ED9000CF037FB64AC0D73BFFDC9108F7F7A76FD8
-:10EDA0004D04BADF4FDF1D84FD9929D668DBAADE4A
-:10EDB000E400FA7AB3F308F28F4482374CC882B683
-:10EDC000C9D34687BD9A563990F403B7D7399DEC1D
-:10EDD000E3FCBA87F3EBAE4637E76309AFAF35A67E
-:10EDE000E1FDED8D1E6CBFDCE8C5F6B64619DB1DF6
-:10EDF0008D65783DDCE8C3FB871AABB0FDDB46854B
-:10EE0000D161DA9DA5208FCE275200D07DAD744C04
-:10EE10003747C2E775929ECFAE75EBF96C0A8573E2
-:10EE2000787BB27DB8812F5375FD93BEBC5AD75FF6
-:10EE3000783643D79EF869BE6E7C5EA844D7CEED87
-:10EE4000BA5E377E6669A5AEDF57305FBF3ED189B7
-:10EE5000F265874B40B93C3DAB4ED7BF037E0139CD
-:10EE60006C17FC6A32C0A5B25F791A00FCD8008E1C
-:10EE70008C8F7FC3F1B317F06303BC30F8BF0AF087
-:10EE8000A7ED5700DEF49ADDADEC1E28811CA8C763
-:10EE9000B6356DA0D343E1FFAA5344F9BFB5B10124
-:10EEA0009FDB7FBEB65BC4F53A24C0CB0EBE9EFD91
-:10EEB00016A55B8C87B620AD142E5E5776979EDF25
-:10EEC000C7942D44B9B9A3F3A403E8EDB52F2F4F90
-:10EED000EF69E37E432A27037D1475525D957C69B3
-:10EEE000FDA7E9AD4BCDAF8D03BD1A495F18E7BD56
-:10EEF000FE4B4524741FAF76A90FC7403BF04D5120
-:10EF0000A2ED9C2E6532E06D4F9AE012051C375938
-:10EF100086755F387203DC7F2D6436C1BA0F5C18CA
-:10EF200044601F3BA8DEB5D1716F92D4B51328BCE5
-:10EF3000035D5FEC07BE549D16CF6872F13A52D361
-:10EF400045942B5BC6DA4CC204D0776612180B7C52
-:10EF5000AE203C3BBE4C71C2754B9AC8EF0791DFA7
-:10EF6000C7A7BBF0B9572F64C443DB4482280F0204
-:10EF7000DDA6327F84FD8E87F750B9937DE143870C
-:10EF80008B8EDFD75DEB00F9F25A179B3F7B45C8AC
-:10EF90000170DAFFE52627DCDF919689F3EE1CB7D6
-:10EFA00014ED8B1DDD26A4EB1D63D73833B2709FA3
-:10EFB0001E80DD8EEEDAB5E940D75D666C4B4421EC
-:10EFC00041A0B734A667B774D79223B4FFBC47F407
-:10EFD000039D6593F67D03E0FE90355692C2E06F87
-:10EFE0001E42C8ADEC6132D9A59703255D7A7D62DA
-:10EFF0000D2D983503EC08A067DA9E668ED3F5EFE9
-:10F000007F7765FC4CC00B8537DC7BADFB8EFDE369
-:10F0100040FEF859FB0FC77F621D48AF4DE3D60C89
-:10F02000BF0DC66D71786C12F428E40BDACEED36A4
-:10F03000FBC1DEC876EAD7B1FF1B9508F72DDDCC02
-:10F04000BE3A9FC6F6B3C353471EA0CFBDCAEDAFAD
-:10F05000C9274695C3FB0E50FB09EC8A573C2FC4C9
-:10F0600065823CF38A3A7AA3F0417A39DF49701E0F
-:10F07000FA33601A8543011B42F9D0D77C3BEDDFA0
-:10F080009F6773ADA4A8DE7161D7EE3B683B374143
-:10F090002422DDC937FDFAF5E5FDD4A16BDFFAA91D
-:10F0A000DE2EB11181EB7327CA81BEF867E259AB3E
-:10F0B000EEB969669B6EDE5C12D68FF8B4F6F62761
-:10F0C0005FDA3ED9CAE59A669F6CB528F37D40D7D2
-:10F0D000C15997D0A32BB9FE6D4079B18D104F5B0C
-:10F0E0003A95EBDF1065E0C3F3C7ED08C7DCC766F0
-:10F0F0004C24A8AF9589C00F488C61F680F7F8259D
-:10F10000EC15974AE273F8AB085CCDA743747C2BEF
-:10F1100055F35F810EE7FADC386F5F7AFF41C70075
-:10F1200094FB05A54C2F3CE638887ABEE37DAAE720
-:10F1300005F68E10C5FB6CF805F4FEFB561CFFCAE5
-:10F140007502CA11CD6EA824B285AA3832DDDB6DF6
-:10F15000FE01C59FCF5E3DEE567A7DE5DD8EE1C0B6
-:10F16000BFAF807D80F2A1C1C1EC8318358E2E71B6
-:10F170007B970DF970EB5913B183DFB0DD86744ACC
-:10F18000F9F4FE71F43DDB83CC5EE838CBEDBDEDE8
-:10F190000EE4939D7F60EBE858E1607EC619AB0CEE
-:10F1A000F6F8D6153108E731524CC00CF32D67F351
-:10F1B0007771BCBECDF1BA9FEBAB37B8BEFA0DD8B4
-:10F1C00013A8BF983DB11BEC097ADDC9ED891DA0DC
-:10F1D000CFE8F5C5B3CFBF077C797E7B14DA9D639A
-:10F1E00048DA6658D776A715D76984F33C45CF0728
-:10F1F00073ABF47643F958BDDD70FDA8E1BA7659DA
-:10F2000062AAEEF9A9F1D7E8FA4B9D997A79649E42
-:10F21000A86BCB17F4764385F7063D3DC9617603AD
-:10F22000CA3BBDDF383BDC6F4C063C313F676BD7D8
-:10F230001D88C7ADC753062A6176C2360EE7ADC733
-:10F2400099FEDC16FA22468960477CCAC77DC6F162
-:10F250007186E3E33F46C8BF4B1F0CFCF20593BF2A
-:10F260007DD0B1F6BCF6DCA7FE5303C2F5FA4851D7
-:10F270004226D1DA7FE8786F0CF45F2E5F503A6D4A
-:10F280000D513C7F478C696FA38FAC31373C056DC6
-:10F2900055359367B2101C6966ECBFDA03F2B839D2
-:10F2A000A6E139E8DFD264736D8A073EFAFEAFA0AB
-:10F2B000BD9CB2828D5EFF1435C24F28AB39324CF3
-:10F2C00038FFB316DF700FE84DC137FF563A5EDDE9
-:10F2D00060F53C235DBC9ED80C4163F66DA087446D
-:10F2E000CEF77F1194D80C7A5FFE8580723A4A225D
-:10F2F000A8176CC41700FE21F5F27CE00F62A2FC97
-:10F3000043AF8D99CA50184F6422B9E83CC8DAF46B
-:10F310007D4270DF9F05BA2E0B6950611E5B3D95E3
-:10F3200030949F1F4D5746E078F34C9CFFC569848D
-:10F33000803CA3DBC176D6DDC4D5164B286B2BA64B
-:10F340002F687B3EF5F7E1FD26C732D453EFFDCEA3
-:10F35000E41723D84B3D705E6639130A8B8F18E98A
-:10F36000A783D3C5B6641FCA5FE3F3B900170AC702
-:10F37000AD1F4E1781BEB2EC0364B02BE806C51971
-:10F3800054BE6F3B79BDA326C273D767D5E4660C24
-:10F39000EE6D6705378B354EF4E745D8D716FA3B47
-:10F3A000ECEBE54E5300F07BDE694579D2D73EF2B7
-:10F3B00042FA38442ED80361FC46C80217F88B0283
-:10F3C0006917BEBA269CBEE4FBC3E9EBC58BE90B0B
-:10F3D000E1FC9DB7D210AECD02A32F95D217F4ABAE
-:10F3E000250D485FAA89F89AB390DEF0F9E566BB6F
-:10F3F000CB4625E4B28C147C4F474CF97B0109DFE6
-:10F40000973A13FDB96AEECF55A39C7FE32893F397
-:10F41000C67DED3C3A677808EC89D17387039F7706
-:10F42000800218068BCA9B27EBDA248076E0140250
-:10F43000212B80C03CB03F3BAED3DA5ED62E66E3D4
-:10F440006F79FED10D2AB46FE2FDEA6CD6AFB549F3
-:10F45000FEBC62685B4CD83E09E3E9FB1EF3C8CBF7
-:10F46000006F8FA6CBB7025DE680D142AF9F4D9073
-:10F470006F87F6B20C82FBFDDE04F95B304E6B6FDA
-:10F480001B2FDF19DEDED2E3A7B6733FF556B44B70
-:10F49000DFE89A89F6AC447C3780DE7923C8E251F4
-:10F4A0005B46F5EF071DE4F6FC01EEA7BE09F2E8A6
-:10F4B0002AD027CC4FDDCBFDD4DD5CAFECE47EEA77
-:10F4C0000EAE575EE57ED22BDC4F7A09FCD4ABC082
-:10F4D0000EA9E27112E6A7668D9E5C8A76844BF3D4
-:10F4E000534744F4532BBC7A7D33CDA3D73737A48D
-:10F4F000C519F48B5EDF4C8DD7EB9B52E73506FDCB
-:10F5000092A91B2F5FD0FBA945DD25BAF10567F451
-:10F510007E6AFE473375E39765488847EFF11B75B0
-:10F52000E3723A6B75E37AF1E6433C59D5279D6067
-:10F53000C76D1955C7F1C6EC050D6F1D97C0DB6F80
-:10F5400038DEF672BCEDE678DBC9F1B683DB03AFDB
-:10F5500072BCBDC2ED819738DEB672BC6DE1F1853B
-:10F56000831C6F0738DEDEE4FE6ED6E8DDE89F9D83
-:10F570003F4B38DE368A91F05696281AF0E030E09C
-:10F58000418FB712F370031E520C78B85AD72E3839
-:10F590009361C043BEAEED3D5E6280FFF506BBA148
-:10F5A00052D7AFE16D9A67BE81BEEA74E32E9BDF4E
-:10F5B0009CCCCEFB6BF96D1FB7E3F670BCED02BCC3
-:10F5C000619CC8C3E3115E1EF76576DCCB1C6FDB64
-:10F5D000785CA803F006F61DC75BF3A87368C79FA5
-:10F5E000BFA0E1ED6044BC5D29BF5DEBD6C785A639
-:10F5F000B8F471A1C9763DBF1513BD7D37E94B3D08
-:10F60000BF159ED5DB77133FD5F35B5E68A6AE4D85
-:10F61000ED8084CC6CD05337EA9ECB0ED6EAC6512F
-:10F620003F89F92D1EAEF7FD95A88F5AA631FD48EA
-:10F63000F910EDEF67BF4DED80F45E78BC68F09F88
-:10F640005EEC437F5F93C9F477C77BD508D76CD056
-:10F65000DF91F20B7C5C4EA60BAF363351A33370B7
-:10F66000997B86D1F5984731BBC71CB316820CF045
-:10F670001334E5F4DA49A2D347607E6A2FE5648645
-:10F68000E97DB3AB8180DD20DA1E5A00FB22A2C9DE
-:10F69000837AD7601F917A977C07DCBF6380A78D40
-:10F6A000C2E296CC585C879B6CB6809DD198294F5E
-:10F6B00002788A93193CB62451DF9DC2634B146BC8
-:10F6C000AB145ECFD0B6387001C2AF83C24B4C874B
-:10F6D000F9E3C9DD745D55995606877984E953F5D8
-:10F6E00039A65F7BF421351868FBD968D6BEF18551
-:10F6F0009FCE53137BF56F5DE64BA84FC73887D578
-:10F7000091F174DEF5EA20B033C7D2F5817C34394B
-:10F71000B62745B2BFFBB2C3568F97E7C17EBEC7BF
-:10F72000F5EB180A117346DFCF3F1BEDBB05F09BCD
-:10F7300005F0088B7BCDCC64766B15CC3318ED4B84
-:10F7400039DCBE24C14A6CB7A433FAFAF1DA99481D
-:10F750006F4E0A2F3116D6CFE037FF2E465F57BACD
-:10F760000F6DFDFDD0892FDC9E0EA393EF45A213F4
-:10F7700052EE71A3BFDE973DA7B2F53673FB51B3CE
-:10F78000936D899ADDECC7F558287BE40FC22B995D
-:10F7900042E13AC845305E53ED32F9FD14645160E0
-:10F7A000F083DC2915882B19669709C363B9142ED9
-:10F7B0007F8CF141EFF168837C1F64D0C3C374ED8B
-:10F7C000A2EE14839F7875BF7ABED439D1A09F264C
-:10F7D000EBC69725DE60F0632B0D7EAE5E4F9889F9
-:10F7E00059E5F83261DC421524730EDC27889FB09E
-:10F7F0007EF43B7BE0FC845C85FCCAFD1A23BF36AB
-:10F80000664A0867C1C5FC1A8D1FB4E735F859DD93
-:10F810000CAFEB7234FDE441BD630B7C93405C950F
-:10F82000DAD0F2E6307ADBD4687FAF7434213F69F6
-:10F8300024EF9552E4F91B5D78DDD8E8C6EB138D13
-:10F84000125E1F6F4CC371EB1B3DD87EB4D18BD7BA
-:10F85000471A65BCFF506319B6DB1B7DD85EDB58C9
-:10F8600085D7B64605EF8F322BAA9DEE6B542BF150
-:10F87000A8742BA3DBE9FBC2E096DA4AD71106F79E
-:10F8800064D5A56B8F5CEED68D4F6A9074FDC3EB8B
-:10F89000D374FD098A47D71E5AE5D58D1FEC9375A1
-:10F8A000EDB8B232DDF858D9A76BC778AA74E31D5A
-:10F8B000698AAE7F5751FEC0503F7CFC506320C820
-:10F8C000E0120C3238BD1E64F0E9C2EBE75CFE0EBC
-:10F8D0003207515E0CCA7251D2A1F8B2B3FC5A9CE5
-:10F8E000D923C486CD1F5746E74B0B5F2F9D4FE7AB
-:10F8F0009FF9915E623C41DD7D475A97EEB929A29E
-:10F90000B304F211870B448C7B1D2E888B01FBE521
-:10F910007E8B6B5A16A5C7434745CF26780E1E88A7
-:10F92000202F4F70BDE8186F47B950B14AD8242234
-:10F93000D1B2E76B3B5323C63D0FDD4BAA605F8E10
-:10F940005D2F494017150535715161FE5A45E0CFCD
-:10F95000A56EB8BF2A3D278ACE56D19A6CAD1BDB67
-:10F96000BB2F6D5CED2ABD7DD94BF77E3BEC638CE4
-:10F970007AAF1DE45B5BE2266CB7A5F59F27F98C97
-:10F98000DB619F723BEC348FC37CC4EDB093DCEF42
-:10F9900009713BEC036E871DE7F6F3316E877571D5
-:10F9A000BFE76D6E3F7772FBF908B7C3DAD29E9F4F
-:10F9B0008AF2F017021123F8A9DAF5969FEAEDB062
-:10F9C0006FFAF576D8D2F57A3B6C71BBDE0EAB6B75
-:10F9D000D5DB6135AADE0E5BB85C6F87DDD4A097FE
-:10F9E00087F3EB27EBDAF3147D9C6D6E95DE7ED604
-:10F9F000F033DBA7978B95657AFBB9AFFDBE12B8E4
-:10FA00000EF33F80C453617AAF279F0B7A85D245AE
-:10FA1000D605AA57300EEE6B86FCC9361842F56F34
-:10FA2000A129F816E47DC8DB2281B8D3AEF339E50D
-:10FA30001511E82F47D5D3CD82E3FAF8C68D77E9C3
-:10FA4000E13A6399DE2FB196E9E12A27EAFD924A6D
-:10FA5000A39EF1E9E1AA1285005D1AF58DC9B14CAA
-:10FA600002F97DA57AC74AA85E616D9DDEB1C29D8F
-:10FA7000145D3FEA9D1F64B17A831CBA0E30169A5A
-:10FA8000A2720F7828DC76BD6BC63A11BAC023A3E8
-:10FA9000A8FE2982DF29FC5EB5286A03E4D9785ED6
-:10FAA00084886776DF4EC75B87B3BC08F9D2FC1148
-:10FAB000CCAFD07F80AF1C42DB617A2E3BC8FAC34B
-:10FAC000D6ABEBF703CE06F7B71EF9C8A89CFFC963
-:10FAD000F5C4C49F06A137814CC07A83D0A0CB8ADD
-:10FAE000AF1AEF6705981D9495C8EC206FD24C9122
-:10FAF000E79F08843CBC2662C778E608E27F06E2FE
-:10FB00009CD1071CD369B319A64C003F49CFFFB362
-:10FB1000CAFBCFCF1BFDB0EBA45483DF768DC1AF02
-:10FB2000D3F3BF8D18EC971091C09E441C9874FDC0
-:10FB300008A777381D359D68990FFB7A2989E75703
-:10FB400038FD4CE4F82264F3EE1ADAEF758B04FC0E
-:10FB50000D1B51E326407D51B04186BC43AED7E634
-:10FB600042BC892B3C68979E61F8F1D27F803F2F81
-:10FB700009C317E0EFB81E7F3643FFEF393D5DBC88
-:10FB80002E4647FFB87519E8CA39E8B2EA588CF72B
-:10FB90008B83B21843D7B7D725601E756FB0215835
-:10FBA0004CDBE7DCAC6E684DE24C33AE97C803A685
-:10FBB000503C4CE5FBF5F2BC56472341BBE3C54640
-:10FBC0003B5E096910411EB5B8EF8803FDD831428C
-:10FBD000190EF5691D836357417E7E8B25363152A0
-:10FBE0005DCB4E4B2EEAD38E9D0966893E5F6C76C7
-:10FBF00099E1B9E2C45A11FCBD6BBB08DA05C589AD
-:10FC000004F3592F36060EB3F729588743F73119F5
-:10FC1000ECD35257CDE4987888CF52DB46023B377D
-:10FC200016FDD73D836D88379B6B69E9B7E8FE0EFB
-:10FC3000268844F052FC788827007A20D1E9F1C365
-:10FC4000746ECB4980733DFD0778D1F402E5F393E0
-:10FC5000E1F8C825616DCC2BE8DB23B3F5F891887A
-:10FC60008275162D5DACBE8C8422E7593EE4768306
-:10FC700016DF3FCEED86633CEE7698DB0D2D86F8E1
-:10FC8000CD5BDC6ED8C3ED867DDC6E789DDB0D6FC1
-:10FC900072BBE100B71B7AFC05A236415E711EB152
-:10FCA00087C05F3858C3E0EC5E25F8CB201FAEB4A8
-:10FCB000FB4AE87DDB2A0BCACF91896A13C4C76D62
-:10FCC00055EA14D8877B417B135C9B8ADA12E0FEED
-:10FCD0003CE5F471F0B3815EA6E5707EA7785867C5
-:10FCE00065705EBF38C6B312E85959528EE31219D7
-:10FCF000DCECF41FC03B61912A001DB8158B0EDEB1
-:10FD00003506F8CE837698FC88067AA4F09C9ECDC2
-:10FD1000EBCF32492683BB1A05708FAAE1704F8B57
-:10FD20008FC827EB39DC35B8EC2CBAD9A4D2A16F37
-:10FD300025B2BA89B70A6E361DA4EBEF9445CCBF45
-:10FD40007626F23A41FE5EE37CEF707B765D49FFFA
-:10FD5000F1BA437C5C4FBB9548B68161F394DC6F8C
-:10FD600091E8F35581FB92802FD60DD0F2C41EB4DA
-:10FD7000AFA78805BF4DA6EB0CF23A484D5ECE21E9
-:10FD80001C3686F7BDC5F7D9D77ADE2AB9C122D18C
-:10FD9000796705EE21F03E9BB9C11D5E5FDAC9D7D8
-:10FDA000B766C69D04F83238E26C3DFAF13E9B041A
-:10FDB00076F7C844CF6AA00377A262F936BD3F9DAB
-:10FDC000CA43C905CB6ADF190FE3E8338F13A09745
-:10FDD000AB37033DBC956447B9D3D77A2ED2237E87
-:10FDE00082F6485F7A84CA1FB4876CE59F1C07BF00
-:10FDF000B692347802F4B960966730F031A9B2A0B7
-:10FE00007E4EA3FFC2F36ADAB5D2A0BF1D5E4BBF20
-:10FE10007278E485C656F03BDE02FEC13C2889813B
-:10FE2000FA9C60F99D76804F4552CA2EC00F29B6C4
-:10FE300087465338AC29587D13C06B4DF952970053
-:10FE40007455988AFDC162FB69A8C8E92A5E9324AB
-:10FE500085C17BCD7DA448017827DDED5E42F79515
-:10FE600092F8C74685F24D9785F93DEF94FC3E31F7
-:10FE7000396C7C4676F1BF67435CC7CDE87C8C5516
-:10FE80004989541FACD179535134C6654ED6B07AE6
-:10FE9000057A7FF572FAA842F5559BA7978F1773DD
-:10FEA0007A8A1ADD5D0FE395FB6C12FA67E282969F
-:10FEB000E5B45D05F612D84F8F58902F357E4E6A07
-:10FEC000D0CB4DC5C0B75506BED6F8E9379AFCEC85
-:10FED000E5E318C06B540DE3276D7FC67DCDFB9223
-:10FEE000DA39718418FDBB7717A546333D1666DFF6
-:10FEF0004E40D92459E9FE66717A9AC5E98992E49F
-:10FF00004E58CFA17B52A701BED426EA07C0DA56CD
-:10FF1000587AEDDF14D82719E0A5FB9FB55C4C0794
-:10FF2000FF94DC65E9A5C714DDFBB05E604E781B6D
-:10FF3000E85595DF013B02C299F0D23F9D38BCB72E
-:10FF400099BEAF73581C69F2E07C1F31F928E17C3F
-:10FF5000870AC4015EE8FFEEE87448E193707AA571
-:10FF6000F38754D65F7D4F6A069A9BBCFDE18AC138
-:10FF70005041467CE596DEF1F0BF5233E27FF60A4F
-:10FF80006113C4FFC6889F9FDD4DC7CFAAB4799A7D
-:10FF9000E9FCB31FACB580DD5FA92A7BEBE8B84A6A
-:10FFA0004A177E17EE43C72747CCC402F31C9105BE
-:10FFB000D24EDBB366E9F9A67A85BE6DB4478EC62C
-:10FFC00028234CF4F94F041BD944AF3B372CDD08F0
-:10FFD000F37DFCA00DEB0A09BC2B07F400E1F1490D
-:10FFE00079E33DB4BF76BD8D405E641EB7F7E37222
-:10FFF00092715E9363013E5FD316837EF1E90D43F8
-:020000022000DC
-:10000000C703FE5B0735DC06F5D41FC72AD580D7AA
-:10001000DA35D798203ED21ADD3E05C67F6222AE81
-:100020004DE9B42D3D6481F57451FB00E2ADDA3A3F
-:100030006B5AC3F00FFBCA6171DCE926A26C8E60BB
-:10004000D73C9A23703D4B545BD8FA37E448787F0D
-:100050007ACAA09687E13D14FB2E0F870BEC7B0A32
-:100060008B8BB6267AAA07D3F6470271AD8C87AB85
-:10007000FC01F0A7FA031B7906D14F70BC75F8B0EC
-:10008000A7DBC2FCFF4CFEDE53B1ACFFA43BDA0F92
-:10009000FB3C29B1B6EA76FA919ECD4ADA9C18B6B5
-:1000A0001F61089C8260EB3B1A235953101F447A4E
-:1000B0009EAEABF691C710BF5B287C803FBB5C5205
-:1000C000CB4EBA8ED35459ABD0EF7E7C0AC0F3CE60
-:1000D0000C4AA80917C3A9316710AEE7F4FAE6186D
-:1000E000AC337111C53AA4171E35ED5BBF238C47A5
-:1000F0003DAF32F9C1F84F2061F29DE2777ADE0F11
-:100100002DB5B0DF28D20E7831ED59658775CEABAD
-:10011000B1607ECC497C65204F6B1E11B04D7FD6FF
-:1001200082BEA8E5FCD52A0DDA07747C12EC71F4C6
-:10013000F79ED80BF501355C7E552DD2D3E962B719
-:1001400059C72F3396EBF987EE53D7DE98C3EA3AB7
-:10015000BBBC1FC7837E6EA5DB06B87CD222F837F6
-:10016000A17CF58D08AFAF1B9363D2E2F092250C12
-:10017000FEB594FE6A416FD8497B09D83579A3A7AB
-:1001800002BD5B8F46E33A8DF0FD6787C3A924A9C2
-:100190007A305DCF294AC750FF73724333DA2FF0AC
-:1001A00023EAF8DAD502F4BD84AEF27117D2A7754E
-:1001B000C6B85E7AD1E053B33E791F8C73FF678C6B
-:1001C000449D2752E3CE5F0AF6640F1D19E0037BBE
-:1001D000366BEF49EDA533EC8F406765742CC38B0C
-:1001E0008AFC5253DA93D71BD15FFD32E23B9FE288
-:1001F000B5237D3EE4A13439B7AEE84DA483732E18
-:10020000E217995FFB36C8FD18BE3695C881BA78EB
-:10021000502654EFBAF01EFACB717CBFB1CB856388
-:10022000A599840C5A2E1E2BA537634B8301D0133E
-:100230003637D7BBDB737F3566089C6E2018A7194D
-:10024000105DEE09E06E5C09784EC1E24A00FBE702
-:100250004141A882B8FD00A2B7ABE20CF02059E6FC
-:100260008FC2EDF2682EEF974E4915D0DF29D3FBF0
-:10027000A766835DF4AB1C93E65FE055825F291CA3
-:100280005BA8FF06726A50A0BD1DE8B39ADAAD7E86
-:10029000DCBF07F33AD652813C2EF4C6AFFE51F1D3
-:1002A0008B8BE2603C7ED1571C4C8B0754B25BD4E5
-:1002B000DF51DC90F7AB74533F6700D85937BBD19F
-:1002C0006F729F46BBD4CAEDD2A8D18B5C2C7FC67F
-:1002D000F8478B0718E9CA185732F29FD12EFDCF85
-:1002E0001C6E3F5D4DAEBE92F88016C75F93C6FC94
-:1002F0009E3569B52BA17EED3CF77B5CAA09F138F0
-:1003000067968078D4ECB539DEB3B380FFB4FA8356
-:100310004BF93D6D063F24DAFBB42C47D09F8E5C31
-:1003200046478E02D63FC74ECCF6B0FC813397E9E4
-:10033000DF39540FDAE916A7F3734415449F9F1A67
-:100340009ACBE4AC76A53FC18C1C5DBDE0D0DCB09F
-:100350007CA88DE743EDBC5EB038BD7BF757705F7E
-:100360006675C036B9E6C96F533844CF8AF19890A4
-:100370007E95677E087EF22C07CADBF83409EB5EB7
-:10038000AB12ED1EA47D557E1BFC32B43325D892F2
-:100390008CF2762EE5DF80AB1F7FC7DE7FDCCCA939
-:1003A000F93B058CAE7AE24B3E26BF4DF41FD0D30D
-:1003B000EC2A3DBDCC55FAA79FDC5CFD39AE31A1DE
-:1003C0000B3BBF42BA60FCBB6E04CB479F2FA763B9
-:1003D000207FDB873DAEF9B74E0BF58B285E82F2AE
-:1003E0006EA4F7601AB184E3DB5720EAEA1B827936
-:1003F00024DA45FD9EA085243D48C70D90E75EEFB9
-:1004000002DFB7D81653837AC3AFB3EF0FD1794F5A
-:1004100038FB5E8791CEEF1BBD04E3FF0F5C4741C5
-:1004200046D77F1F249CB15E6FCB7CF0DB1E8036ED
-:10043000D6DFFDFBFC62684769ED6D3F92C3EA0DB4
-:10044000EEC90DFC482DA07E8D9DEA5B3A9F4322AC
-:1004500098A7226433CA6711E281209FC786C1171B
-:10046000FD063DBC8D76BC58C0E228A281EF8DEF21
-:10047000BD3D97F339C7535FFB363E477FAAAED6E3
-:10048000D3FF7772FBA997353EEF84FA89982BAF9B
-:100490003BA08214F3D3223179C05F262504DF27E5
-:1004A000B8185D8184013D686918E041B8D17614BF
-:1004B000E805BF438BABE2A2A300FF22E41303A82D
-:1004C000CFE95242422A8CD7EA0F14F295E3F2E5C3
-:1004D0001E95C7388F54C6F2CBEFCA2404EF1BF326
-:1004E000F87A5F0EF8EB47A99E95408FDFAC42BCCF
-:1004F000AC7B05C1FC80C3A5609BBE2AD4EC82B84E
-:10050000156B575318815EB6B9F5F5AF3B8B1E2FAF
-:10051000B6D2FE9652166F3DD418787715A5B596CB
-:10052000827C9497AB6060D87A83BBA2AC10875171
-:10053000D46FD9C16EFE708568856B70658D0A9B1E
-:100540007E3741DD2C4810775008F8F9D615CD5389
-:1005500080AFDEB5A89E414ECCAB629EB875A57A41
-:100560002BF83DB2545E964CF96853AB19CF199DE8
-:1005700028F97DA214C6879FE732BFE1E0CEA80725
-:10058000000E6B047B280AAE1665D37DF1F03EABFE
-:10059000A7892EF1DDA68793E03D6B16AFF1EC82C3
-:1005A000FE261B9C40256B36D8AB60DE35494BDC04
-:1005B0004BC2E6B50FB736C0FDE0B016AC6B51CA02
-:1005C0003CD6A858D8D7E731909F6D5D911907B4F4
-:1005D000D892601D5107E396FCE9B7B98077C984CA
-:1005E000795BABBBDD02FB1EE95654C88F9B72944E
-:1005F0000340AFF3969F98827573A5B1ABE13AF2D1
-:10060000C2EDAD00FF77793C2694508BF9DA964520
-:100610007576586F4542CACAF0784C4BC162FB18D8
-:10062000FA5C8ADB54B374C0C5F4D102F19709B007
-:100630002EBA9F7130EE8F8D0A1D174AB256453A79
-:10064000A7F509D747F6E6A529101769D96087F4F9
-:100650000C691194F5901F50939D11EBD833BC0C8D
-:10066000EED58A6B8A5542FC20BF7DBEF5D88FD46B
-:1006700051605732FCD9CDC46E09D37F19D9C567F3
-:1006800072C3FCE88BDE9BD082FAA04560FC9BE144
-:10069000FDE247502FFC7CB6AF1BE0B7A655590FC3
-:1006A000F022AA9D0C28EA9B4F42F7911184CAE3DD
-:1006B00096265B55A43AB4D022713AF009E5A0130E
-:1006C000034684C9E5957529101F09355D85DCDD74
-:1006D000337E83FD03C04368435A2CE8C350526DF8
-:1006E0004A0AD02DA74BE3FC5BB81DF062A62FDAB7
-:1006F0000B76E55896F79C91EB73629BB4BBC1CE29
-:10070000FD1AD06D2AACF71F48B7A8E73ED9FA1FEB
-:100710004857C47579F9481F0999319F5AF4178CC5
-:10072000F7B68DD3CE3FB1F8A066F7468DFE6815BB
-:10073000F8ADBE3C2DDF55B017FCF5E95A3EB59C2F
-:10074000C5075DF45FA4F8A0CF101F9C6E686BF620
-:10075000E60D5EBD7D9B28B5FB4A40EE1E103DE0D8
-:100760004F2411A65766940B7EB0B39B8AA2EDB8B6
-:10077000EE3C1EE7E4FED73CBEEE638D7602F92424
-:1007800093A36035AC7F7A3E5BBFA33E3D3B2081A7
-:100790007C67716E526F93306E02C84F203D7E9A17
-:1007A0000F26A1FB9957BF14EDFD5EF835B1F81087
-:1007B000D1FB133E62F01F16317B4CF3B7E61BEC06
-:1007C00003A3BD6F8C53F7E60536DB819EBAC7667F
-:1007D0001C4A91B05B0D68F9003A6EA1B773752899
-:1007E0004CFE7472FD70A4513EB68AEE7FB5EFC721
-:1007F00076A0D336B3DF0EFAA4ADECCE18A0BFB608
-:10080000056219F07DB0B10CC71D6CF4E1759597C8
-:10081000C9BB60B6BCC21B1677AE2C2B3EB62ABC39
-:10082000EE41BEEED8AAB0F5577867E8DA1A9D55C2
-:1008300088A4617304F9F2BC97D9ED66AAF7B1CE2A
-:1008400050FC85A7BFFA1BEAAF7687C3EF41AFDE46
-:100850009EBD7F6CC9C0FEEC166D7F1A5CB47D6BCB
-:10086000FD7DADF37B7FE33A9FF5EAEDB94BADD368
-:10087000B83E6DDD7D8DAF0061350CD659BA00EA0A
-:100880006283D94A07C8A3CA526135E44B8FF07816
-:10089000E29182183CE7BE378DF97BD1F58C6FA2CF
-:1008A0004B6760DEEF4AF17BA397D995B30A04BF8B
-:1008B0004C7F9DCACFDB1F4B63F9DCA6A29FFF16BE
-:1008C000F2D0EF145A58BC97C8D3A785E5B1D659D2
-:1008D000FD01C8271DEBA9D358B6FA6EDA8ED6E40F
-:1008E0004A953EEF306B963E7F5861C833441BE417
-:1008F000CA518D3E7228DC537BE1DE973FD1177DD4
-:1009000010F3D92CD04346F8DC66808FD17FA9D86C
-:100910006EE087CBF46336B566ED85BC9A4AEDC9C7
-:10092000D1803FE8A2CF45CBBFC634C8803C468FBC
-:10093000634267D6825EECA42A00F4CBBA9977AE04
-:1009400087F679AAF7012F7DBD47F3DF9ECF96BFCB
-:10095000F446A81FE89123601F4C80BC6064FBA094
-:1009600073D1E46911ED83997529D9B0AE197AFB79
-:10097000A07343D99399701FEC03FAD39957A7B387
-:100980000F4859E625E0C3E46ED4E8AC88757AB325
-:10099000B395C17961FB71A43590F07AC6EE1C79EC
-:1009A00008F4CFE07104ED7DD4FEDA638950BFA86E
-:1009B000BD2FD7CBEAF049591CD30FFC7A293C6AEA
-:1009C00075D4F75B64FCDE8B16F7D2C665E731FBA6
-:1009D000B03545AE877EE2CCB8C4BC4D5A9C232DC1
-:1009E0007D08AF1B96488F3FF41741C2FE08FE1EDC
-:1009F00081BC6474E2D93D2E3AE433AF929F970DE7
-:100A0000E728FC2AE4436CE502DA4BB6448276CD53
-:100A1000E5FA57973BAE158A03C0DFAA65F1F2E20B
-:100A20007433B6A3157113C8854917060A20377C9D
-:100A30008AF834AC375AFEFCD31F83BEA67A1FE275
-:100A4000303ED280E7AC9D161FC627DACAE9CCE952
-:100A50001087596949C1787AF2AF63DCF0367F2B91
-:100A6000C4CB6D1E761EAACAABAE86EF6654148E3A
-:100A70001608ED9FEE63F19B3910BF8179679DDD0C
-:100A800009F19FD95E26BFC06F03BD39B7EE3BE3C6
-:100A90001E95FE9AB88DBF352E0BE34912C60B0C7E
-:100AA000F1215BC1548C0F69752ABE0211CF779377
-:100AB00044277E87C218DF31C6738CF11E637CE742
-:100AC000EE3C5627ACD953DFCED3DB532BE00CC220
-:100AD00060B097A8A8A47CDD662149ED943E0F156F
-:100AE0007F42EEA2EB70FED00435E0749C21CE78FC
-:100AF00099722B48E5CA29D8C8EE372CE0DF2E9032
-:100B00006B30BE67A4FBC7B8FCBA2FCFA9ABEB080C
-:100B1000362EE7CF47A980E705A3ACFEA8E4DE792F
-:100B20002E973F9ECA911FCE637EC50F81CE894707
-:100B3000C1F30433725D3ABA250D83C9A9B0F88DAB
-:100B4000F1BDDA7AB4F9AF741D0F71785F2E9FACE6
-:100B50002BCAB75BE9FBCF511C8BA82FA9411D16EF
-:100B60009FD6E2E7DA73D59037C8043B52C0FC81C8
-:100B7000763F2C8E6D06BA8D4E54E448DF9B7A3B4F
-:100B8000AF276E8A794CED3D4450502ED4F17C8DC8
-:100B9000369F99B89B900F80B6B5758911E2E6C46F
-:100BA00063B75192A95D2B1288FF3889DC0EF1677B
-:100BB0006BAB05DB44ADDA0776FA22CE17D682A9F5
-:100BC000FB20AEA6F185316F631513A7C2B475ED96
-:100BD000FAFC95313F65B4A7B5F8BA99BE04D6754D
-:100BE0000EF0C1F6EB172F6FBF4FE37EBEA6FBD50D
-:100BF000E8AA3CF31637D49FB44429EB6BE8BAD487
-:100C000027ED18AF70C0DA002601FA0FE4E493DE96
-:100C10001FE379F67CF65D9A1681D5A3EC49F8635B
-:100C20007CF8F905533EA39B9FE549388EEACF0037
-:100C30009C972263E3912FB4FA934309CC0EAC281E
-:100C40005C1CB893B6FF8DD74B5E53F88C96EF1FA4
-:100C5000509C43B0F403E0B2CECAEAD20E7DC38CFE
-:100C6000F564443CB0EBCEF8DEBADD6B36EBFDCA82
-:100C70001BD2F4F6A0D1FEB31ADA43F38D75648A61
-:100C80001DEBC812781D195FBF914F7EDAC8F21AAA
-:100C90003FE775FFBFE0E72F7FC9EBF736F3F39728
-:100CA000CFF373B31ADCEFB728188F3E711DB5E987
-:100CB000627BE380EB8ABEEBC6F3FBF9CCCF9A22D2
-:100CC0003A77819EEA3D67D1FF77C22ACBF479B3A8
-:100CD000D93E7DDE6C6E953E6FF6FF32E5ECFC6C26
-:100CE000388751BF12BE5330639588F9CA752DE716
-:100CF00050CF9E2F406BFBA2F71CE6E730B4731C6D
-:100D0000DAFD6BF3D9F7911CBB122C508F3F635562
-:100D1000EC54889F1357C665D96F15107387FCCFA5
-:100D20004A9705BE0731239080F1D09AD62B9BE7D6
-:100D3000BED143304EDD13E757C7DE04F2F9B016DB
-:100D4000E727D7DC0471FEC33CCE5FF3F2B827C1BE
-:100D50003FFA599E3C17E0D1942757C1B586AF871B
-:100D6000B66FCC1FDCDBA63FAFC7EABF3F5193DFB6
-:100D70004F3C5D9C2C3444AA17B939BF27CEB5141B
-:100D8000E627F69E38D737613E626FC77376F7E67F
-:100D900033F9D47C8CD4C33CCD2F93FAE723D8DD30
-:100DA00077E50BDA7CDFC2E7DD9A7EF3DDC9E6D7B3
-:100DB000CF27DA624780DF7F82D79719E7BB37DF1B
-:100DC0008AE3E87CDFC3F9127BD6776FF8FA7ACF33
-:100DD000CFB86280691DD58AA98BD2136911B1EE93
-:100DE000C4D1E19A067549646A2AD6B11C2EADFCBD
-:100DF000A7384F73B8F4857FC9F334DBF2932FEB38
-:100E00003C8D63265122C535029C2E7715640E0C4D
-:100E1000F58327EBF2FD41B0337ADA668540DECF09
-:100E2000BAFC20DEBF3FCA551DD1BEE0F2ADA574AD
-:100E3000910F52426B92A68AE1F6CBD92CE5CDFCFC
-:100E400008E713CF8DEADE0DAA6966A96016E2D124
-:100E5000DEF608547E66AD9821BA2542BC0D0F4ED1
-:100E60001E4AFB672552FF2E6CDFF9F5BFDE4DD918
-:100E70009514941E6E8EA7E376E4286F03FD16B9D1
-:100E8000A53DD09EE54BC7BAF7FB6309DA79274643
-:100E90005BFD9B922F5EF7EF7AE5F24AF315C8E50A
-:100EA00096467DFE7B4DD29895B0FE3125240412E6
-:100EB00036C57DB618F27F19D9CAEF605D296E225A
-:100EC000DBC6E37D9984E56F8CF30E98C8F0342679
-:100ED00094F80388271FD2FCFDA22BF6F7FF180E0B
-:100EE0006FE3F584E6EFAF8EECEF9F581417391FD0
-:100EF000D052570BF98013ABF5FEFE890DEE6A3820
-:100F0000E77782FBFB27A6507F7F6CDFF9006D9FA0
-:100F1000540E3927EAF201DC6EE771EDD9D9F2C03F
-:100F200089D9E8CFBBE0DA9829C7E278D575139E56
-:100F3000472691CFC992275C32F839DAB9F65CAF0F
-:100F4000320C9ED7CECB8E01D13608F2A2AEDB2278
-:100F5000D1F368BEBEBF3E4FDA93C734E139EACB66
-:100F60008CD35FEE38C9BB99D5E398599D61544243
-:100F7000891BF253E7C7DA51BFB7C2FFC2F46A6AEE
-:100F8000BE3271E2E0F0790CDF57952EEFBD5A9D2D
-:100F90003EE82BD02F9D849481BC7920B601E31EBE
-:100FA000D771B819AFE513395E892B1EE0999AEF16
-:100FB000BB01F0415EDC2CE17760F9FDBEEAFB8D00
-:100FC000EB78D6EA7B1FCFD7978812ABCB23C81715
-:100FD00057A5B9504F6BF6D7D2894C6EDA48689452
-:100FE00095EEB359DEEDCCA4E33E7CC29C0E8F3D62
-:100FF00017432CB06E5F1A9573741F256E65647F5E
-:10100000F211BE4864F2C2352098DC788D635755E2
-:1010100080FB17F1E313DD83C11E7FEE49969FBA73
-:10102000EAC945F6DAB0F99F98C8E566225B7FB554
-:101030002CF8A56458CF59CC43CD904C1E9940DE76
-:10104000F8FCD1B91027A4F6DB686C9FC376503248
-:1010500065425EFB43F7174761FC55F72E1E82F48D
-:10106000CFE1B17045E6B368E7E728DF05FC070B81
-:10107000CEC5A48E453B7E3DD0FF4281F822D909E2
-:101080000F71BC5D2F37DC087476BD6C23706E2D3C
-:10109000586C43B83F572848E0B75600CD433CE76B
-:1010A0000933C69B293C9641FF018F03BF1B5D227C
-:1010B000FFDA0CED3F8E13C8D07EF4F115C3B5E016
-:1010C000DC60E0C70F81FE22AC7F295FBFC64F14F2
-:1010D000EE25B82E99D58BF44557DD79F2934097DC
-:1010E000AD294A3D7E17D135F3B2BE8B58F1533F3F
-:1010F000D6EED97ED2308C44A8FF3AC4F9C478FF2A
-:101100009713997D770BE78FAB9EEC3E701DF0F542
-:101110000A8B0BF0FAB33CDF66584F8FDFF57796FA
-:101120002353C40588BF60395D3B7EC781C4407BC3
-:10113000FA2833E24F2DE1DFF9B89BB89A63F12921
-:101140006CDB5708C8670E677B1518CDE6BC86A315
-:10115000B3E1B96211CFF5879D73E9B78E2CC4CF87
-:101160009FB5C0F9336ACB075789DA77B7884065EE
-:101170005BB0D4CCEDFBCF9E94E9AFCFF2FACC9329
-:10118000AF5A36421DCB51136BBFFDAA65C44AFA54
-:101190009ED008B68EB607054F9304D7A7D743FE57
-:1011A000B26EB9E029A3EDEAC03D5D10E25AF288C3
-:1011B0008D80ABF0F10F974E85FD9C7313FCBEEC58
-:1011C000DC04C6374A90F84DC9BDFEED0749C4AFEF
-:1011D000E54BE11C9D97EB9987E01C1B5DF7B5EA99
-:1011E000B7D4EF40DE94FABD10571BE461F9CCE8A8
-:1011F000A0D9E327E0EFB2FAC8961F08E421984788
-:101200005CDB0CFEB98DD7EB46CB35E83F0EA2F484
-:101210002981060D9975E7D8EA8882F41B5746396B
-:10122000231DAE7AFF38EB12E7D9E6DE343816F824
-:10123000E52F13F5E732FA8AAF6B57F8DE0DE0A71A
-:1012400083E757B751BB1DF6FB32B5DBE1BA9DDA38
-:10125000ED701FBE530D5738CF06D75DD46E872B68
-:101260009C67832B9C67832B9C6783E7E03C1B5C1C
-:10127000E13C1B9E3F2C540303013EC5D104F243C5
-:101280002D1646676A9215FD8D4021C1FC7D30C93F
-:10129000BA6925C4EB0486273596F50763949BB19C
-:1012A0009D3C96E577CD9E11708E7095305602FB71
-:1012B000A9D5AA60FDF289956602F5CBA169C2FBAA
-:1012C00090772182C92352FB66C757B721FC17CB01
-:1012D000C40475E92BE1BBA1208F3F259B587C2ED0
-:1012E00028C2F7E59A6308A7C73ABF4C65F669417B
-:1012F0006B1F52C09F9D043101A4DF030AF42F5ECF
-:101300002EF076D02F8F82BA06DEAF1E7A0AFCD777
-:10131000558676A7497B3EE52998EF68CFFB465472
-:10132000CB40EF295A7FE242689F8AD29EFF7C2100
-:101330009EE7D2D6A37E8AF38592B4F1A9D5D01FB9
-:10134000EAA9935B82EB0D0D66E3FF6D57E7D3E0EF
-:101350002FFFBDE76B56548CE3ABB3087926F662DA
-:10136000FAFA7892A88F87CA822E1EAAC5DF4D8E00
-:101370000543F1FCD90336948BA79208FA217DC569
-:1013800045C3E2F51817FDD524AD9ED910FF240AF8
-:101390008179AB201EE8C1B72AE1E7D388D040A00D
-:1013A0004EDD772646023BD29A1816BFE332A0BF25
-:1013B000786173038B0F06150B51937BEBFAAD0528
-:1013C000BCAE9FC70BB53A066BC1A3BABC81315EF8
-:1013D00048C465988FF62DD2C7032B942B8B172EFC
-:1013E0002001CB50A07F59F080FFBEC0A57C300407
-:1013F000EDFDABD9F719A5D7316EAA9D1B833BF044
-:10140000DDA92ABEE7B65B4FBC3F848EF3AF8C925A
-:10141000E030FEFC65C5F87C1EDD21C4B76A0AF128
-:10142000F02DC9FED4F3BA04F2D46DF23033CD7787
-:101430006F02D80B8B62316F72D35DE91FC03C8B9A
-:1014400055073E47ED4A4EEF2F6D047A1221701971
-:10145000D6CE1AA1D15BD546E0AF49715A3BE629F9
-:10146000E08762ABF6BC17DBF3148DFFAE790AF4AC
-:10147000C7D1128DBE0F54C3F3B3537BE643FA9E1C
-:10148000E4D0DAD317427F6BCF7C4B36C27CEFC0FF
-:10149000978DB03DF529E0E7E2195C5FA91F6D84E7
-:1014A000F95B1668F34FF0C3771EE79BB4E7A3FC24
-:1014B000B07E85686D2ACF68FB3DCEFFC70A5EA867
-:1014C000067EB9B1A7FF05DCEF02DE3E5E50F714E1
-:1014D000F4FFCBEFEF7FF87DC6F64D2438656856F4
-:1014E0002F5F18E5D56F8B981CF1D6FF1AC8952C85
-:1014F00068781ABFEF06F10096CF4A98E503796144
-:10150000173D943388CFEDC238A7719E9B0B595C71
-:10151000FD4C813E2FD662C88BF9787EAAAF798EBA
-:1015200014B1795A4B22FBB119D9257F2A80FA01CF
-:10153000725684F95C1460F07DB2964CE5FFC37D71
-:10154000CABAF8DD4D2AB23C709FFAC52AD899D3A1
-:101550002938210FDB54F438C6E9437916DDF7400A
-:10156000B43CE73AAB8CF2F1635ED731BF449E7274
-:101570000FF0FF30916CC23A0F27E61BCCC3AD4F82
-:10158000A35CE7794FED7B1CD32F712EC2782EA57B
-:101590009BC3FF5C419B05E4B34AD429A55928AFFE
-:1015A00083506F6C72ACC53CB0ADC88279042DFF1E
-:1015B000ACF0EF7F6B79DF49170632FD9EA6C5754B
-:1015C000FBCFFF2ACB77FAD03E68178949B8381F7E
-:1015D000BCD8A726413DCBF4D2183C2F5055FB0672
-:1015E000CE7F7804C1EF0447CF6AC0F341666A1F1B
-:1015F000CA00179E2FD6EA63465EB81DCF8DD66906
-:10160000F5E662F941B0536D8F513F0BD997C14553
-:10161000CB17CF30C8FBC50595A86709B5E347C709
-:10162000C27BFA3FF7FCF0A458A49B8FDA593D7FA8
-:101630006121CF97F03CF0FD1616E76B4DD1D3D565
-:10164000CF27317F65FD244677BB8A7E5E85F633E2
-:101650003179202F469E60DF8583180B9EB7327E3E
-:101660008F396D0EDA754F8CA45BA4B6B679F97B11
-:10167000185714D6B3E73E1D4F1AC06F319B599BC4
-:101680005E54C8FFE77A9599855097B5FC031CDF37
-:10169000ACB27AEFBEE237D5859ABE67F19BF9EE20
-:1016A0007D5D70AEEC6F8EE318CEBDFA24565FD22E
-:1016B000562069F946FC2E21255C0BD88BA9F9BE72
-:1016C000FA428C6F6D96601D9ABCD957741BCA275D
-:1016D0002247CE4B6B7CDF62C84BFBDCECF923AFBF
-:1016E000DD530D7F17A2AF3CC4B3C53D7983E5F848
-:1016F000FE782D6F20DF03ED5E3D4A37E4D5E9D15A
-:1017000085F5FF0BF4688FDDAE76A11DFB755B3FA1
-:10171000A5AB1710AF652C7EF6755BBF3C517E13F1
-:10172000F8F9BFFB3DE9137D5D00A7FB04B9CAC909
-:10173000927B1E419FE7FBA0B09F3CDFA5E20FFF1D
-:10174000176FE83FDE602FD2E7E1FF59E20D0E3858
-:10175000433518F928B108F8A880F1D1BFBADCA345
-:10176000FBCD2F827CBAB0D91F9DFAF7F7F753F360
-:1017700095B222D4838A6917A59FFB8AEDCC9E0976
-:1017800030F8F6C633E8FABDBA78C653F5FF0DF166
-:101790000CBADF2AC46F297FFFD71F7F77207C65B3
-:1017A000664FFC0BD2E703B8BFCD6C7FFF80F76FAD
-:1017B000447AF905A3975EF8303B290C3E0BEBFF0A
-:1017C00031F0791EE1B38DADEF6B80CFD7119E1E46
-:1017D000B6DE4BF9D7270A044D2E1FC27D66313A7B
-:1017E00038C5ED6BEA774F1E2AF5FADD4FE5C86F75
-:1017F00015313BF76891AEFE537E1BEEF7E3171FE2
-:1018000083FE087E7108EE7FDDFCE2D8429647EC4D
-:10181000CDBBF8D9776F49D5F5DFA0EFF980C21BB2
-:10182000E26D6DCB45B42FCE2712FC1E80666F840F
-:101830006259FDDEC5E7C14A099C47B4E5B1EF8CAA
-:1018400068DF07308B0B0606A48BE17A7080628517
-:101850003AAF25727A0B9C6F9DBCF6733C77659509
-:101860006DF8773547BA3D96BBC08FA67EEEB510B2
-:101870004FAD77E1393AED5C9976FE634960DE3E23
-:101880003867DB46E92181BEA7A2D472327CFF46CD
-:101890007BC36C681BFFAE69C2247DDE83C21FED73
-:1018A0009FF3EB597D5C9B99EC82FA8F3A55F437A4
-:1018B000D1F6336B05FC1EE7220A27F0F727B7277E
-:1018C000633DB935917DEF4CFBBBA7940EDAF3C0B5
-:1018D000FE3B2A12FC3B76FC3C99F69DEFA869671B
-:1018E000F17B5BA7E8FEE1FB3DDA772666703AD133
-:1018F000E019D5148770394FE142002EFCBCCDF4BD
-:10190000E52C1FDCB2607110C8BBBAE0F35591EA58
-:1019100052E6B8F5DF4B37C6338CDF1B3713DF4099
-:101920003857575150AC82BD6AE3F59AD144C6EF9F
-:101930005A9C5AFB63F65D8B528BEE3B22C6F746F0
-:101940001BE8D466883B18E9D4889772035E9E3101
-:10195000B3EF0CB6748A1E95DE6E7964512B9CCB66
-:10196000571F31B1BA7922E3779F5AA8C58BE7CFC9
-:10197000E962215E3F97C353C30B210D16E0B70503
-:10198000DA397453C36A384F3A8F9F43BF916CC69C
-:10199000730637810541DFBB1042E4227C5746B213
-:1019A00032E7C045601D7555EC3B1926D803E409A4
-:1019B0001E3121BFB6B877E1DFFD0A0CB3C49E4EDD
-:1019C00063FE44247BB627AE4021713A2C8EFF7F04
-:1019D000F1ABBF2D7E35B17010AB9B880AB8F29287
-:1019E000D9F726A09E6962A1C4CE2758941178DE4B
-:1019F00061C3272AD08176DE81FEAC18A2FF6EC2B9
-:101A0000C649FDF87F258584D54727879240AE7D5E
-:101A1000D0475DE5E1E29EBACAE72661FE9DDABFE6
-:101A20005920F798FD3B23D7F7B3496817B373CE16
-:101A30005A1CE933AFF24B185F087F3F270BCFE703
-:101A4000F8E1FC4E8553D82B48BDEF27C63AF6FF88
-:101A5000A579AB7BB8DF168C22F81DA46032A97A79
-:101A60003E023E9E29617644303D32BEB47E6A67B6
-:101A70001C9FC4FDA1018C28CE58F5F18193809F55
-:101A80003EFF0E1DC7E3E829F2478877DE7E385710
-:101A90002132D4F72ABEF701AFA7555102BD420249
-:101AA0000A7ECF6FFAF74557A4BFA7F8CF7EFD2F68
-:101AB000E87FAE8400800000000000001F8B08005B
-:101AC00000000000000BED7D0D7854D5B5E83E73A5
-:101AD000CEFC24998409061C24E849001B6DC0E152
-:101AE000279000813393842490C0F0A741221E08E0
-:101AF000D0DC5EB44111634B9B0381102222BE8B6C
-:101B0000AFBCFEE824185AEFB37DD4CB6745D48E22
-:101B1000012D5AD4E0851A2BA54110B1CF7E8F5EDE
-:101B2000E5B5CFE7FB7C6BAD7DF6CC39930920C6DC
-:101B30005EFADD3B7E7E877DF6DFDA6BAFFFBDF6BA
-:101B4000492D8B3AAFCD628C6952A0131EB53EFD74
-:101B5000E4502CB39B59E74478A88723F224C65657
-:101B6000B2D84F7540B986FEC558DB5DA77E3F14DD
-:101B7000DA4536A6A86C3A634B5607A97F11F332B3
-:101B8000199E6DD372181BC258C1B9C06115CABA6B
-:101B9000DF11906898F0778741BFF08A4CB50DC689
-:101BA00059560CAF0A183BE984E714F8DF98B64C95
-:101BB000CB87FE58BE8E3A680CCA4B065BCAD9D09A
-:101BC000F4186F5FA8FD35628C82F199D9DF6CFF44
-:101BD000AEC4DB9F0F66470C2F63B79BF550D6B1A1
-:101BE0002CFA33969E1354A07FBD24CAED9A629DB1
-:101BF000EFDA766D1A63679CF6F16BCDF16669AE2C
-:101C0000761C2F1C9BDFD5AE41F97402FC77305E49
-:101C1000BE557350FB95B1F60E5AEF594994C7EA79
-:101C2000583EEE12FDF39769B0DEED39BC3E1C1A4A
-:101C30001B31B2AF3E78BEEAF1BF303CD354A2AB09
-:101C4000C2FA5F945C0BFFAC6D6897752FD259F8A0
-:101C5000F70CE8D17844523BA14F21DB2B3399C0DC
-:101C600076C94097533489B5C15CEB4212F50F7BBE
-:101C70001D7C1EA328A2019D2D992EE8745904E70E
-:101C8000ED8FEEFEF4D29AC70CEB3A8D354B6D70AA
-:101C90001B636D702FEA82F6505E72F73FF811CE2B
-:101CA00025B9627D2511A4BF964CD1EFC38BCE7BA5
-:101CB000EAA56AA2F725B179E653FB25A962BCDB48
-:101CC000A91CC7E79D767C1A372EC3F9045CA1D006
-:101CD0009D84CFB02FB219F93DEC670103F0797BF9
-:101CE000FD0659CFB7F09151A5121FF963E5889D04
-:101CF0008F0A888F061AAE9153C23FD440CEB0BC33
-:101D0000BD6A78CC57B16E9093B86E43A2750B3A0A
-:101D1000AAF559E8DD03EB564539B0ACDE3B10F3CC
-:101D20007697D1BC1F01BE599C9F98919BC03F974D
-:101D3000375EB377B90BE15EA5495A04DA7F8EBFEF
-:101D400019F1E7E9699CDE019F2F6BF0648580CF74
-:101D5000747CCF488EEF9B107E95F0ACEA8E2E807F
-:101D6000CBA579581BE060DEE4F06FA83DDBE147CE
-:101D7000FC0300D4BEE5285390CF80B7028EA95053
-:101D800076B29ABD49E6FD69C841F3363356B117BC
-:101D9000E09BB8D1B72AEC8DD7E79671B8547CC2D6
-:101DA000B8C7D37BEF1802F3F732E6DB08E3371B43
-:101DB000C0BCF07CBF5E8A48B0E6F7B3C3738AA0AC
-:101DC000DC9DE3086C84E9BB1F708F580BED7B72C0
-:101DD000BC0184AE277347BA0FC67F3F209BF8BA79
-:101DE000E73DE4EBE3E9317E3250BF749BF83DA759
-:101DF000853A908FDF5179F967A56BDF43FE6279F1
-:101E0000CCC786021EB007F0AA236D9AC70DF3BA9D
-:101E1000668238C1BE3EA6BBA0DE8DF5B0C4798F08
-:101E2000EE7E74018E61D4BC32CAA2475D4C317A19
-:101E30003D34AFF2395790CC39293EAE6B67F3CBC6
-:101E4000CDA88FFD320B216FF9797B3FEBDDF0B927
-:101E500003C787721E43127CE97358BF6496F1F77B
-:101E6000392CD1CBC2153908571E0BA0BE9DA73BFC
-:101E7000CFC4EAF9639B32C98413E191D75714C1E7
-:101E800033B5DEDE6E761E943DF1F2AC9D7521C455
-:101E9000FB2C0DBA8D63ECC8CEBA681DC079A4D0F6
-:101EA000ED9300D3AE6CC5D67E36DBBB09F10E7662
-:101EB000C52119F0B2D49CAFD937EFF70CFAADCAEF
-:101EC0008312ACFFF87782E90559C86F72C061B61A
-:101ED00071087C306AE77470391D90A07DF37362DD
-:101EE000DFB40EE403394DB295832E513FA903F9B7
-:101EF000E2784CAE8E598EE5452305DF0CED403D72
-:101F000039234D94072D47BEED559CA63CBBBE031F
-:101F1000E559AB18CFD8457CFD3613F5691D484708
-:101F2000E198FC9BDB8EE55B7D263CC60F491E36A7
-:101F30006B5C9F4C7DE9D55EE30ADA037F16059161
-:101F40000FC35CDE25D64F391669CE30EDBAD16AA3
-:101F50005F7EDB1694898FC2DA9F65DCBFD206C034
-:101F600019EC5F498D74AC00E953612390EF5B9AE3
-:101F700080F74743F9608A4B4D47B9EE9BA925E1AD
-:101F8000DF57830E1AAF2AE8CD3AFB75683F814DC3
-:101F900040BA6B696A14FD0DDC5F7D942B9292D37D
-:101FA000FF38A74AB81CE8967C0BB97E9619EAE779
-:101FB000E02323BD452CDEEEC5122E0F5A26688B7A
-:101FC00083F09C03E297C11E6E98FE837008E63989
-:101FD00053E40CB889CFB4B790CFE69B34F4B04B40
-:101FE000630FA0DC2872FB36A2EC96F39D8D505651
-:101FF0008603BF62B982D3B70EFF7D9E8BE32A7141
-:10200000FA0738E635DAF9416116FA86FAD5C1746D
-:10201000BEFE9BD9CDB8FE079DBEA528C75A737DCD
-:10202000775BE5D9FE122EC79E36D7DB35FD9F6B59
-:10203000103F1F334700E5C79ED430C9B353198CF6
-:1020400075A0CED798EA1B8A7CCDD721E5DDCAB032
-:10205000FD8F6E80250C03381ADFED2E9D00EF7783
-:10206000F17EE7C6B20686EF155E8687618CC37681
-:1020700027A9DDD6602ECDCF1E0B783C48FBD01CA7
-:10208000F7DBCBF63AF1E9487B7E849E647FC4930C
-:10209000AD767E14C303F21268425CB7C474C7E71E
-:1020A000B87E53FE039D6E273AADE17A64CAB9F358
-:1020B000367A2B0DAAD42E91EEA0DFA3D46FA1E81F
-:1020C000C79CBAC55EDF168C443628A48F7E48EDC7
-:1020D000BCA08FB26CFAE8C7F43E411F4DAAD41ED3
-:1020E0000F16C4CBD07F3795FBF6EF0C26D167D007
-:1020F000FEA734AE47277CCD9BAC3D89E589D70B45
-:1021000079020D0B417E5C23CAE977D64FB3CA9F93
-:10211000C2C751DE2CD625B3FEEB8F237F1F0F09DC
-:1021200079736429CA93983C62358FDBE4119B7301
-:1021300027D6C7E40F5BF5188E17933F6CE6E328AC
-:102140003F82F3845E3BF3188EDF522BC6BF25120D
-:1021500044BBC421FAA744900F7526CA763BF27798
-:10216000D3FE65A9D56F62EC5F1ED32C7EC689694C
-:10217000758F931E3486B0D3820F72FBF2BB90032F
-:10218000827E847D78EAE093BA01ED5654686F59F7
-:10219000F7256667F672BB276E5F9EE7F6F7C0DB32
-:1021A0008FA769FE7C4E6F5FC1F8FFCB3ABEB0A728
-:1021B000E0FDBF59DF5F6DFE1CC0E70A21BD4FE4A3
-:1021C000F05D41FF8C10AE2FC0F5D4DF00DE6C9ABD
-:1021D000CFF403AE427C064243AE6AF84A09BE2AF7
-:1021E000BEDF2F6A313A2D4F4E07974DFF73695F5F
-:1021F0004AF9BA2DE3CEA7F755822FD4A4FE3AB4FC
-:10220000BBCDDE2ED6FF7682CB1CF722FDEFB4B716
-:102210008BF55F6EA5CF01E0F3D5D6FDFD0AE4484E
-:10222000238D3F8A8FBF328EC7EF58DFFF67DCEC0C
-:102230009274DE4EFBDEC0E9E932ECED9F60FBAD4F
-:10224000D25E3D83E24486C0FB3F23DEE17DAF0BDF
-:10225000DEBF65EEC79345E19FE17B2CFAC75BFCCF
-:10226000136309AD2FEE9FC040F9567DAFB75BF504
-:10227000FDA1505D3BC22B97F0F6FBBBDE5C86EB0D
-:102280004F2C835D7280D6930576C918B24B9EC7DA
-:10229000F2A5C605F8BBA8DFB39C6E92D4BF42740A
-:1022A000F514AF6F75713BF6EDDA8FC98ED3D6A8F2
-:1022B0000EB4E3845E3F1AE27E00D82315116F5FEF
-:1022C000BBF1684812783B4AE3EEE5F83F1696D337
-:1022D000D1DE8CD92DEC55F283E276D55DEDB88F49
-:1022E00071BBAA81CAD3CD7D3E13BA779909EF0994
-:1022F0008E07733D976EFF1EC1E1E7ED93D49FA556
-:10230000F1B2399CCC7BF80CFAAD44AFFC37CA0172
-:10231000E5556621E85C549C05764BD74E4945321D
-:1023200059B94BECF3FA769BDF68F2E162938E9534
-:1023300092E665185F58FC89E0FF437CFD313FB5AC
-:1023400099E07FC78C4F3C8CED397C9F12FC2A872B
-:10235000EF2B18DF55427619C74F0D339C689789CC
-:10236000F382C4FDCD287188FD4D2F213B99C355C3
-:10237000A34B64BF87579C7222BD2F3DC6B464F443
-:1023800031A4C425E24F43A8BFD7F46F033C2E9479
-:10239000D87E78492C5E359CE0F4F1F936148547F7
-:1023A00060FF69FAD192A17C6B3C688F864BA5488F
-:1023B0005B0EFA37DEB25228CF73B05EF2FB18DB49
-:1023C0008C715FF7F30A6B0B506B55B1C475804B82
-:1023D0007F8B7EE422739FE7B1587CC581F11A4B55
-:1023E000FC86FC4077C9FD793B558ABB50DCC6E5CD
-:1023F00097C9AF083EB482E223A9856E9F1BE7917F
-:10240000B3C9CF75FDD08C172DE4FEA503FE433B69
-:102410003AB59191FF36679B1451A1DEADD9E32FF8
-:1024200075EBCF37937FB782F934F01395427BBDBC
-:102430002BC17F6D99A087104F6777D539101FC1C9
-:102440004AEE879DDD35D28BFC97E8479F453F9A42
-:10245000A4541F3FDA7800E36B163F7AED00FAD1FF
-:102460008B4AC08F465964FAD1238BC2B7113D28DD
-:102470001AC9B7AEE953E693BFBC4D666E687F7A62
-:10248000E7C4370AA16C6C5302186E78DFA92DC51A
-:102490007A03FC69F97ADA2686F1ADB926FCA78BB6
-:1024A000CE9722FCDABDD70790DE4F3FE4263C9F53
-:1024B0005E99194983F132B6FD65530AF47F2532DE
-:1024C0001C836C31FF3AD10F672C6220DD9C6623A0
-:1024D000581BEE83E26338AED290113002717F7BDD
-:1024E0006E9ECFC0F1F4481AC37D8FBECAA4B379E3
-:1024F0008C8E1C908EE731D58985054C7322FE1792
-:10250000319DCAB701BF492371BE3C83E800F80E74
-:10251000E3774D13F4EF10BDFF88D307DBAEB4E3D0
-:1025200079C569E39174E4B33DA9F6788378B698E8
-:10253000FCE9413F7FCC80FAF90F5AE5C465C895A4
-:1025400047F87E727E7595301A07F4643DF279B7CC
-:102550001907DE9EC9E3277BCC3849E213183E0BEE
-:10256000FB7F513D01FAB29DE08DFBF11D08CF6567
-:10257000E8CB9F12DCFBF83A7721DC5CFEFCF7121B
-:102580006E07A819144F01513C89EF2FFE3E95F4B8
-:102590005FE07CDA5312ED578ACA480EB95938CA3F
-:1025A0008989E3117EEB87DAFB3D7BB17E6B827C10
-:1025B000FE3F16EA2FE0FCC5E78142A19DBB8AC71A
-:1025C000C1E77AA5972535DEEE38C6A192ECF779FA
-:1025D000538E42B3A803EC958733600FF2717F02EC
-:1025E00083505EBFDDA49D441BEE7853053D7B9474
-:1025F00006921F3DBBE4C806E8FA4613EB2E1DDD2C
-:1026000077DC9ADAE0C933167934B7EC090F08455C
-:10261000D69CD77158C278BDE656DDD0BF3B3DBCD5
-:102620001DE3F5C651997502BCB72EAC3C79C622A4
-:102630001F12C785F998012CFB61894C701F0CBAD9
-:10264000A333308E60481194072B8C534E8C572E39
-:102650006D5CC674D82757E12905EDC29AA08FDAC0
-:10266000CF2D94996181EBF149DA7B8867A08B3398
-:10267000B4BF81981DF53E96834E2DC3971F8F439F
-:102680008A7381174B9E22FBB83B93D1FC613F8B31
-:102690006C80F94BB465AE5E3C67F187296E7AB207
-:1026A00044A57957EE6C277852A7FD99E001DB39F4
-:1026B000EA18DC17DF820F8E9A786F31F1DE1F9EE9
-:1026C00095521ECF13E5B9654A3AE2F92D45A57337
-:1026D0008EFEF87B7EA97D7FDCFE0A5BB959BBD7F5
-:1026E00081F47476A71CC17D82E7EBB86F9FC0BEF2
-:1026F000B19CF838DDE9ACC6AA9FC5FECC29B5EF80
-:10270000CFD26D7C7F966E0B125E969656BA86F18E
-:1027100073B5BD40DB4C2F5CC6102F2EED9482723A
-:10272000ACBFFD027E1B568AFC6BDA8F57103FCF81
-:1027300029B5D8B55F757C1FE6BBA534899DFDB76B
-:102740003A5F10F4740CE56A7E5CAEDE56CAE5684A
-:10275000E253C8558B3D49714D0B1CCBEBAF000EBE
-:10276000C127C8A728374A7648CEDE7CDC7FE0D771
-:1027700031689F7DB819F35156F919D14356A94ACA
-:1027800074ED9A36CF85F278E5AE3F2BA8AF009F67
-:102790008B4B2D72B8A494093D544BEFEB395DFC83
-:1027A0007B9FEB003C77D3BED77238AFB673A7756B
-:1027B000D5E18DA5740E0472C98BF1789FD04323A7
-:1027C00078DCFB8B9D6FBEBFF35E8676E0BC3FA5D9
-:1027D000AB6807DE5ED4A9E5A849CF3755C976BEF8
-:1027E000591762E45730161AC62E79BE99787EDAE8
-:1027F000F7BCD378B9392B6E77279E77269E6BB2BC
-:102800007ECE3FFB9E771EAC2A02386705649FAAE6
-:10281000C6CF335DD3CE9E6063FB9E770E32F52E1E
-:1028200043ED6D596FCF08756F14F3A38679021DC0
-:10283000BC399327C5F1087AC0E38679369501FC47
-:10284000682FE7743CBA80D9F0E8223C7C413CD246
-:10285000F936E265A714D988FD950603E5F94AE63D
-:10286000537F1088EF676CBCBC751ACAE7EFD47948
-:102870009903F87F73D63D6C19B44F3D92C26468DA
-:102880007F44BD87F6FBC847E92A9EF7BAFD967DCF
-:102890003071A908F8E4BE7ED2DF601F3DC8727DAA
-:1028A000F651ED28453D7BB9FBF76451F803E4632D
-:1028B0000FE86B657CFC7DCF088ECFDE9B58A44370
-:1028C000EABB8F806F8DFCCE3CD6BE91EA1B18C64A
-:1028D0000736498CE33B812E1C69EB0D3CD7762DE6
-:1028E000F7921FD5DCD040F83E0AF8367C9CBFF04A
-:1028F0009CEA22FC25E88249432F9F2E12F7FDC84F
-:10290000CE3AD67875EF6B3FFCB9BB14ED9ECBDDAC
-:10291000D77953B59CB202EB3E6B23CB8658F9D6E0
-:10292000E07E0938C0E44F2E64AC33B3AF1D956F21
-:10293000E6A5C0785FC7F1C69431330EA88DC1F209
-:10294000821B5843B2BC976BCBB93F560B2622C5AE
-:10295000558C54CABBACF5EDF83DE5611A37A9D6E4
-:102960003CCC3ABE0476FCE1F61EAC9F0B8B756442
-:10297000D12BCACB14F80995E5D0B845AB4FBDAE05
-:10298000527580C67781F0473FB5165F523E098B7E
-:1029900074921CD0D97C90F777AC95289FB3C64829
-:1029A00063E8D7C6F32AF626E455F0F2DC6CB3DE12
-:1029B00078B1C37E8EF9DA72DB39A6D19BA0DFFE37
-:1029C00048FACF665F58F4D9072F7FB2DC50ACE7E6
-:1029D000989FD2F8276BC57CC1DDC17CEB39A66B13
-:1029E00037C223E2D4F0DB6D3DA704C8A92CE2C8AE
-:1029F000A933B53A8C87ED9BA0AFC0FD914BA406DF
-:102A0000B48F40C16812C56B7C1DE84F83FDBF12B7
-:102A1000EBFFDED70976485399E5FCE3EF0DFED3D3
-:102A200022BE6F1C5F8EF05DEDF002BE7F46F8AEF9
-:102A3000E0F8FE3B80F7605952FFE4AA81EF6D8217
-:102A40002F760EF1EF0ECF876596F38BAF7A3E6D42
-:102A5000AAF6BF71FD5FC13A1C33711D66FEC165E8
-:102A6000B4F7507BF3BC34B1BE69A6E93F98E7C424
-:102A7000EFC4CEF1AEADC3F17AE3E77A74EE153F61
-:102A800047CC1B89E78871F8F3687E718E189E79B0
-:102A9000731DE545F7738E391FEB4759FBDFB41BF8
-:102AA000F9AC2D613E9759BF6AE6448237BEDE0914
-:102AB000345F7742FB1A737D6B674EDD6D58F00112
-:102AC0009DA87D4C2E31AD0EE78B9F3B4EAFB39E44
-:102AD000DF7E6FA6B65B9CFFCF443A36CF69FFA37B
-:102AE000E363C14C1EDF11E7E5820E474ED116228B
-:102AF0009EAE367861FFEAADF4FF37986FDD4C0B80
-:102B00003F7DD1FE317E34F5BEC89F00FC1A88DFC0
-:102B1000A6723569BE84F013C3BD2C827ECB5416D9
-:102B200091F15C221CD019C641637C6D54125FBBCD
-:102B300062F723E6ED46F917BF1FD1B61BED8BB840
-:102B4000FEFE559D3DCF616E9DF57CBEFD955F8976
-:102B5000753F6AE593811EFF7BE576BCC4CA267E7D
-:102B600096DCFDDF46D8EF5F2CA679DE89DDBFA8B5
-:102B7000DB6DBFC7D0B0DB9EDFF15D3B5CACD50E3B
-:102B8000176BB1ED574679EB6E03CA2E33EFCDB517
-:102B900042EAE77EC572920BE25C17CA36B940E59D
-:102BA000EC8187EBB7828E4C3E8DC1D9273FEF9BDE
-:102BB000BBEDF9790333BF452EBC8DFC30F078E7CF
-:102BC000F73B04DEFBBBDFB15815E5C6BAFAFC2FB4
-:102BD0003F2FE6FF59E5C9975F07BF2FE24ABC2F99
-:102BE000C236D6D9E5CF65C3E72A4F2A7F2EAFFF7D
-:102BF000A0F27EE58F0FC76DF63AE83E8AEE674990
-:102C0000EFA33495F373A9187F9AF751163C9CDC17
-:102C10009FFEAEE94F8B7877D0757E85F5BC6B74DF
-:102C2000398F6FE796C7F25072697D8D1CBE00CA5E
-:102C3000433CEF610AD380A7162E18918DF035FF23
-:102C40008E8FC7FCE027A7C7C7AB36E713F3BC34AA
-:102C50002FBDC69AD730D69C27109F2F40F3ADE7E3
-:102C6000EB9007ADA67B5E31BFDAF831E1B5C5293F
-:102C7000FCEC4EE2EF78DCB883E4CE22B7A0FF276D
-:102C8000775BFD89DB7EFD14C9370C5FE0395EBCE4
-:102C90005F7BDDE5F42B2B37F5F12673BF8CD87EF7
-:102CA000CD44B82FD5DFE24747A5ACB81FBD6F8232
-:102CB0003607FB833F3DB7BCE0D2E3009E16119E72
-:102CC000D6DAFD114BFDE2725B5ED2F9D517CB4B24
-:102CD0005A61EE7B7F79492BCA6379242BCA2DE791
-:102CE0004AC17925E905182719E6487A8FE21E734B
-:102CF0005FE3F95DBFA4F5B408BE33CBDB3379FDE8
-:102D0000B77EFD6C9DC9576BCA2DE717E2BC85E500
-:102D10001F8E629CC7925FA439AC719F92534EA4E0
-:102D200087A5DBA4A4F9337DF8A5D51C7F5B6C1FB8
-:102D30009BCA797C5FC7B8E36231EE3736D0B835CD
-:102D40002BF8B8897CB3D5C4DFD6389EB6129EB4B2
-:102D500058BECD8358C69401F7F8F8F8E27E4FD0FC
-:102D6000197E01CF755A0C4945F9AA372EA3734530
-:102D700056013C09FB141C96BB0D4587986F5C05FA
-:102D80009F0FFE598AEDFCC042C630B06B2B96D126
-:102D9000B9F3248DE7AD4CAEDA200F5129AFE547EA
-:102DA000B8AEA285EDCDB8BCDB6A7F2127CB67E941
-:102DB0008EE5B3B0B7460D05FE36E1C37B216B61EE
-:102DC0009E7762F92C5565EBACF92CE12F97CF2259
-:102DD000E27F4B428057CBBE8D34D739B282E33588
-:102DE0007E0ECCE8FCF6465633EB268C2FE3BD2D49
-:102DF00078DD6DDE73BB90CD2278FEBF617A2AC587
-:102E0000F17A33199DABC28664544FC23C12FE4B1B
-:102E1000195D4A715C37AC0BD781E7B2D1AFC1F015
-:102E200072EDA068127A7E234367012FC6FD8DCD17
-:102E30000CCFD5F447E87CEE86157FAEC77997EACC
-:102E40006E15496071BDAF8CF2B856079CEB300E21
-:102E5000E9979986F1EC2AE77BFC9CC643789A5B5C
-:102E6000CACB022F6EA6BC67C58B92506E3CB16177
-:102E7000CB214B7B5734251DCF05DF2E4FB7DD2BE4
-:102E800062B297E8E082DF11C173A86E85752900F0
-:102E9000479D2ED3F97BE7B635AFE3FDB1A57E257F
-:102EA000E0807596344A94FFB5D8C7F1F49726634D
-:102EB000CB21B0615386E5D239CC059F87A2F12D95
-:102EC000B59D14B7077AE95630AFE70199E1B9B774
-:102ED000C87F9A67D28BC063CAB28F092F17F03CA4
-:102EE0001CF1529849795073001FAA8FCEF93721EF
-:102EF0009E525943F41A98F756BF83452D7168586E
-:102F0000BF2D8F0CC6A6BC3385DED8EA093FA90FBA
-:102F100094F07C34B92A8AFB7AA190EF2B94034871
-:102F2000EFAC94D3A9C07F6A029DBA13F2C312E931
-:102F3000B40FFE2BEC78EF5458208AF4764C26FB25
-:102F4000A277A7924179573B1D9477C55884EE31FB
-:102F500075B2C18136949B5189CE096E33F126F04A
-:102F6000CE58C3E6E518E76EC80860FC9F391A36EC
-:102F7000637ED4E2481AE5DFDDCEF6521ED41DE8AA
-:102F800021C3BC77329F0BCBCB59809E12CBA7FBC2
-:102F900025B7EA12F185CEA2D53701FEA2D7393383
-:102FA000AD7955FDE635C1CACF5ACE23465598F2C4
-:102FB000D2A3FB799EA76EDEFBD1283F28B3ACD409
-:102FC000A32791B7A545FAD72B0A2C7918BE064638
-:102FD000E7D345E1311543E2FD9F9AA08DC5F2E4A8
-:102FE00042ED166CBF07ED3CD0078B0E8F7D02F5CE
-:102FF00059CB046D3CD627CAABD3FDE7DF451B8117
-:10300000EE7A505E511E613EF1E140E5DF9555F4E8
-:10301000C9BF2BA7F598F977279DFC5E19E5224FCC
-:10302000657DEFA735DE46F5E27E5AE2BD34F62334
-:103030005E8605196DE3F0FE6E03AD5BE03D113F6A
-:10304000CCBC97B6C4FF4A8F347600F2D67C60DCE5
-:103050000DBB187D18FCFE72F59A9E2CCA235428CD
-:103060008FB02587DF5FDE844D30116814B7070706
-:10307000557239BE25B3C11F80FA2D4E9E0FC3F283
-:1030800074B6604C7CDC4195B238176A403A00BB9C
-:103090008FEC2561AF8A76F7997AA1B14212F7CE0B
-:1030A000EEC7F696FCEE46DA0F6F34E210E776FCD8
-:1030B00047E740C27E383EBC81F269DC5A727BA190
-:1030C000B922A6CF9B69FC9D429F6B9B70FC19D7D0
-:1030D000F816229FB94A64D6817A6CEE5D24779FF8
-:1030E000C1BC51B06926EB1B4A86C27E3F52619E2D
-:1030F00037D56722BA58B7C6F349A3C50D7ED47732
-:103100005B8625BFF77DB282DBCF13AF3F2FE3B8DD
-:103110005B9681A7320EF167501E9BB1086409943B
-:10312000C1DD3F84E7321EB4038A502FF2F6BE7A27
-:103130006803FBD865E22B7823D00FDACFA3EDF933
-:1031400048E229DA25E65B81284FC77527E6B98969
-:103150007CAB1EC5480F24817F6ED95A0FE56B6585
-:103160002FF7A09E6CD14A68BCC4BCB72DD96C04A3
-:10317000C29598D726F2A644BE9418F7B90A4E27EE
-:10318000226FCAEDE77A0B9E942713AD50CDFBBB9F
-:10319000F6FC36915F83ED29BF269BF1FC1A7F0375
-:1031A000C37E6E2863FBB0997F9698570572E8201E
-:1031B000D1411FFB88919DD15264E60D306DF332F1
-:1031C000B48FF0FC3690C4BE0281807AD005FA0933
-:1031D000EB15797505A6F27C593BAAB428DC83F07F
-:1031E000B9FC3139FB3B82372E67DF35E5EC09ABA3
-:1031F0009C75BFBAF509B4BBB7489C0EB700DE9FFB
-:103200004E421F1F98FCB6253339FD7C6ED26BCB26
-:1032100084F08738BE96C5EF777C513BB3256E6747
-:10322000723C0E909D09F8F8CC2AA7011FFF2F19B8
-:103230001EE0B709E58625CFD45959D07F9E696233
-:10324000FF2BBD277C0DC80DE43FF0077D95E40FF3
-:10325000723A16F2387EDFF6CAE4F53107C85180BB
-:10326000076D026BFBDC4A2EE7C64DD5732B492F49
-:10327000F3FBBE5B83FCBE2F8B6AA4F78FA7EB35F5
-:10328000C8A72C6FFC25E6DB60E6D3EAF56192F374
-:10329000F32FD17EA339BFB9DEBCC1A43FB64ADA51
-:1032A000AE54395EBED4FAAEABD42623FCCD7A98A8
-:1032B000BE97B025CFA11AB0B47F9AAC17E3FB2D0F
-:1032C000791B69FFDA80E024909B731CE71FCA9585
-:1032D000281FF85969103C3DE0B125A1EB59959C98
-:1032E000EEC18AA57A7642F35BE31C6B4DFD16CFE7
-:1032F0000778FA09EB3DA61595FB5618163D86F1A1
-:1033000092A793D0C5C24ACE3FB27B8D4D4F26B611
-:10331000BBB5D245ED56569AF10853EF2D72733F67
-:103320008A1D01F82C7A75DCD4D0EDB4AF063324B5
-:103330008B3E14FA8F6A2CEFDD7E7EFF841DB38FE7
-:1033400023D6799F49A7625EA0D755C81FA077BF33
-:1033500081F388FA4532E3F18E6E3BBE009ED59C28
-:10336000CED88A587E96051ECDC1C78DC1D1638740
-:10337000E33E733FC64DD5EEC371401FAFC3676BCD
-:1033800008E82D095EC71784BE8DF50A335A73739A
-:103390002E6AAF6EC076A26CB1579B2BEDF6EA2673
-:1033A0005C2FC8D1CDF87E4F6AF2797798F81AB0C1
-:1033B000EF065C269F3F88FF4CC22F6DBDFBD2C637
-:1033C000028BB9DDC6BDC497F9E32FC1579C8FEFBF
-:1033D000BCBE81F4DB0BA6FDF1829329985703BC98
-:1033E000154896EF73B452D81B91E18897E7FAB16C
-:1033F0003762EDFAC9ABFF1ADB9176257647DBB46D
-:10340000E36964777CD29186FAFDB933A1A476C7CB
-:103410000BD93B8627B33BF6F76377BC6ADAA7077D
-:10342000DF77911D517C8EDB1DC5E776C8683FBCF8
-:1034300059A9D27A8ACE74CB3AC05D8C76078CB308
-:10344000DFB43BB03DD91D9FEC9011AEA273DDD42B
-:10345000AF18CA687714F56377001432E2E1D9E255
-:10346000B67FC5FD4B5CEFBC897A8F956E0B7BBB3D
-:1034700029BE23FAB5E56D4CD369BFEDF4535AA4C8
-:10348000DAF2E20B7B39BD27B6EB8FCECAE4AAD6BF
-:103490005E58D75696BE83F2319586C7B16C180A2E
-:1034A000FF3E1E7E5F039EF7CF051832B15DC34F0E
-:1034B0007A51AF186E1F7ED7E02FA94BB99FB396F4
-:1034C000F99C53E37288960EA01921733C97C7D7D5
-:1034D0000C76D2F7D332088F8D3E11CFD951910B94
-:1034E000FDEFFFDA28BAF7137A040682F2D46332CA
-:1034F000D58BF8CFEBC318E5E703FFCEA986F127FC
-:103500009BE3839ED3EE85F68B4C3B6CA6ECA5F635
-:103510000FE6F1F6538DF3F5582EEA75A978BF8CB6
-:10352000C9EBE5BB316E8BF608B47FF0F9709907F3
-:10353000EA538F032438DE0917C52F447CA1E0D855
-:103540005EC267DA19972DAE910A122F6AB15B5CE1
-:10355000096526D70E4A269FC433310E71ED2CD350
-:103560001F1DCB6EF91CECAC0B6C7D2BAED13D3A24
-:10357000747037EBDB5FC419CE4FD446CC827D1C10
-:10358000E5D4C96FD95F01B8867DDABF73E7ECB1C6
-:1035900088F71D0AC5754F7E3B8DF6E9C0234A3B6F
-:1035A000C6934E029FF2F8ADB112E9F5403A13E727
-:1035B00040518CCB1D88DD67CE5EA959CAE35E2BD6
-:1035C0007C1FF5E08121A2FD8F79BD281BFFB4127D
-:1035D000F3360E0CE3E525AF3DD369101DF72AE461
-:1035E00057379EF626939F9366DBE9784EE11A4E95
-:1035F000C797E807F27EC6AC24FD52AAB97F75A032
-:1036000016401A8778D24B67015FEFEFB9A7750CA8
-:103610004C3571DAB7BB498E5ED3BB3699DC5F306F
-:103620008BDB53D1E208F95BE0C3737F97298730C6
-:103630007F750E53C7A35FFFF0F4E77E3316E6797C
-:10364000A368F47839095FDF3D2B97C689C37754A7
-:103650005E8E72E9A3F716269303DFAFD417DBD78C
-:10366000C3CF479B772884FF0766FFDF2730EF2112
-:103670005ABC83E277FBFFE460E8AFEC1FC3ED7E4A
-:10368000BCA187DFA51C00F8764E4E427700DF5DB7
-:10369000B30AFAC2377936E3F9A113B56F617D2217
-:1036A000BC2AC6B9015E30AF022847523EFC2FDD6E
-:1036B00018CFDCDFEBA0A0CA85331D3292605B4FD0
-:1036C0006E299AAB33AA4EC94852C5BE4736E3D1DC
-:1036D000AFBE5EB6F1DFE49E545BF98E866B6CE59F
-:1036E00025F5C3E3FCC8F01ED0485BD9EDBFD95621
-:1036F0000EB209B6F2C2AAA9B6F1CA7C25B672B951
-:103700007FB6AD7DA5BAC0569E9DB7C4D6BE3A5011
-:1037100067AB0FE78F53F00A1FD0E5F771BFD38E69
-:1037200069C4E75B7AEEF1215D448BC3E44F1F4F20
-:10373000EFCEC678F5EBFD7C57EED42CAECFEEBCC9
-:103740001E4C239493A0CF3766C6DB07737B6DF1C5
-:10375000F8C3B3B87D7A7056623CBEBF7B705C3FE5
-:103760005FEEFDB7443D3CF7A67B482EB52D942374
-:10377000789FAA39EF2D2FDE1B7B7D218F23B46527
-:10378000C33ABD948F41FC7570D16D23F05C2D352B
-:103790004FBF06E5BFD0DF257911761AEA537D11B8
-:1037A0003612EF9741B9CEBC675692CFDFDF68BEC5
-:1037B0005F854FD0DB332DF84AD4C741CFB897C1CE
-:1037C0005D60D3FFEAA3EFF72DCCE7F19ED24F2245
-:1037D000A5789F7AB6F6D2217E6D9ACB9F378AFF65
-:1037E00098D58FDE7ED3CEAF47891FF69F997F5144
-:1037F000F9FF87261E5F7FA6C9C3A2B0BE134D3E48
-:103800007AFEAEC94FEF8F36A9F46C69CAA367B4CC
-:103810002940F5FFDA5448CF434D1A3D5F69AAA00D
-:10382000E7E1A630B57BADA9869E479A747AFFF191
-:103830002CCE97570B3C5A9E8827840F3A24C2EB14
-:10384000424CD59D724E93ADF21DF0FA6932BC5ECA
-:10385000A91E8916EF1D1EE67A2A291F0D9D2DEE41
-:1038600085713B798E4E323F069F0BE37359F1F819
-:103870009C1B4D9AC104E7A0D9050307E701337EDD
-:10388000732093D53CCDFDBA4D12E91BDF382ECF06
-:103890007F100E913C1F322EB93CCFE923CF979178
-:1038A000DE6287316E8A6945288CD7E1FCC9E32145
-:1038B000C6A09C8BE281CE2B051E2CFB15B8123CBA
-:1038C00024AEBFB4489B8CE3E03D14E7E0BE7AE44D
-:1038D000C6DECF348C493D9BCFE17DF8BDF983D066
-:1038E0005E7163308AEC1570F00A71BF99698FB40C
-:1038F00077D667F71DE70FC57B49AF3F18B3739EB7
-:10390000203B26B11DFC0E111E506F59F090440E45
-:103910008493ADBF4C7EBE7723F43FD0CB285EA608
-:10392000A24D0DF03FA7F0EF341C38E7203C5FF0CC
-:1039300048241FDD0FDCEBC1D8F6B3DFE5ED8C6A60
-:1039400089EE2FA475ED57D14E0DF6EAD7E0F7C6F4
-:103950000AA3954EFC3E6868DAB8408A850E428A12
-:103960005D4FA2A51AD33B140C1B9C50BE2EDE5EED
-:10397000C6FDCF8D9773E8DEF53FCE063A9D7FBE3C
-:1039800081A9F9667C35399E564B96789BC202AD6B
-:103990009373C8EE3C741D9EDB8C661199E8CA20B7
-:1039A000FF5BC02B7BC3742F4FF8E99F4ADAFDB34E
-:1039B00093D80FAC5EA37337E670D0B95BD304BD68
-:1039C00069369DCF279CCBF85EF93F12E8B45607C5
-:1039D0008BA27D6164B8087F89FB35B9B07213AEE4
-:1039E000CBFFA5FDFA1D92F53B0137AA33C89FBA5C
-:1039F00000FE14DE436956F8FD28E3447AA4938060
-:103A0000647968B7DD2FDF1CC0FDFF7EDAF7C83FA1
-:103A10006A047F0BFDAF6DA61CBE3F35A383818278
-:103A2000DAE66CF81F58DF22B17007FA5B29D74736
-:103A300058461CAECED95C9FBBD91D8390CFBCBE6F
-:103A40009927CF4C48E6EF71FFC419DBF76C1FF9DB
-:103A50001B66D9EBD2FD98F7D8326EF52EBC8F6578
-:103A60000CF1F0F34E25ACCE03FC3C64DEAB653EBE
-:103A7000836559EEEFCB4C398BF1D9563066F07C2B
-:103A8000F79709F038AF101E174A18F447B35C11C6
-:103A9000CCAF51511E015CAD7E07F1CD2695F3FDF3
-:103AA00026AFE6F125D9B72D884777FFFB29E76CCC
-:103AB000F2611C7B87D7417CD9AA2A5B73A0DCEA20
-:103AC00055F8F75A554745B27CAD8F6673BB099AD6
-:103AD000A4507E53703ED931FDCDD366EEA728A702
-:103AE000E6EB1AF18F1A08E37A9ABD5912C63745E8
-:103AF000FDAFCDF1459C78AB6917A5E6ED8D62BCB5
-:103B0000A665D8AA09882E0FD83967E1BD277F2F6F
-:103B1000D9452D433C35C9CEBFCECFE671B6ADCE2B
-:103B20004005E2736BBA831980BFAD39C9F5608F68
-:103B3000B97FCDEAF830D12DE063B4D4B7DD6F4C56
-:103B40007DB9D9B9C38FF7D0B68EBE95F2BCB68E0B
-:103B5000E072B7F1C889CE0DF9C80FDF62FF86FCAD
-:103B600090A5D0BEA92CE041FDD5E2537CE8EF4FF3
-:103B7000CC5AE7095AE497A0FFED6887C0D3396CA7
-:103B80007E0DD2E385C2D40022BD4C3E42DF0969DE
-:103B900009803CCDC13CA4069FF5FE3FD8D37215E9
-:103BA000C0951E70D8ECED4185767F4165BA87E8F7
-:103BB0007318A7A3FEF62F111E2F4A9CF117699FB9
-:103BC000A9D724FB2EC9B82A8E574137CE4BD0CD6A
-:103BD000A5E0B7E9BBECB8BECBA91AB10ACF2F1E3E
-:103BE00062BC7EE491F39DE8AF2796BF2C7F362B15
-:103BF0003B481E378F72113D25F6DF9AC3E1F9600D
-:103C0000F647341F861570DF323D3C8EB4BD7070B0
-:103C10004A32793B6BA25E5465B18B324BF7921EF0
-:103C20001D5CC5087F5E35EC1B05E3788FC940A39A
-:103C3000806FC7677F3DA55E391E951D0D2CCCC7D3
-:103C4000233983BFCF40BE6598FA64CB0D6F30CC6B
-:103C50009FD93E5209C89487702470313BDA5B6863
-:103C60008F137DD138504D95998F92C252781E5046
-:103C70005548A1FC1B07D79F1AFC3FD4BCC22E9904
-:103C8000FB3FD43C5A52F1158F7F65D5325A4F2CE9
-:103C90001F05BF2783E3E88CEC0CBC108BEDAE5BFB
-:103CA000CDEDA86CD62BE1F9DE0D98952323BD73DD
-:103CB000F97981653B281F07A6C17C12C97090BEA7
-:103CC000FBAF379C9482F0767BD1AA71B83F89EB29
-:103CD000585365C6B362EBB8381E049C034DA74227
-:103CE0002F377BB89ED54021A7A0119C10D72C93CD
-:103CF000D7535CB3C570FB500F372BA077B3A877B1
-:103D000098E2A00971CDBFA4F0B8A7B48EF9A4229F
-:103D10008A6BE6E13E35B2D400C61D0729BA07EB2F
-:103D2000D346298CD355C3643C3F89FBDBAA97E774
-:103D3000BF35529EE0AF50AF41BBAECF2E2E8FF6B7
-:103D40005D42AFB51D1BE5A5B8B9A72E0DFDEC670B
-:103D5000FCB947D06FB9E0E1F95BA25D57C2F74CFF
-:103D60005A4C39D75365C6C753FE2263FF197E5597
-:103D7000C13CB990671CC9F76629F93940AF29DF02
-:103D80006E54DFE474B65A7C876C35C9FF77D34D27
-:103D9000FAADD79750BCD8B4E398A6A9BE4971FB39
-:103DA0004DE84BBFE233EEC271CCFCA93EEBECFA1E
-:103DB0000786DF57617E4BDC3517E71F14CB9BC3AB
-:103DC000F913EDB6FEF0D966FABDCDFE10E55D5CE7
-:103DD000409995E45C443CC1FEEC463955D06D9762
-:103DE0002F697976F9D2EA68A03C2EE366E6C33CF7
-:103DF0000F5615F05BED5FB0438F571133DBEDC904
-:103E0000FBAAB9BCEBCA54158CBF9478820CCF1BAB
-:103E1000946C9DE17EB8FC818BEEC7CFABB8DE6FB2
-:103E2000C95B1E467FE5E1E9DF24BC4CACE079A527
-:103E3000A21DE8CB0FAA2C7E8BC83BB8ECEF23F970
-:103E40001C948F78B9F1A1B6692BF9F791FCCBE9F5
-:103E5000FB48CF78F8F791BAD2F534B4BFBEE8F793
-:103E600091EEAEE6F41AF27CE3E08C5C0B9E7A7481
-:103E7000CA0771F9CFD3B9CC0C337F24310EE47665
-:103E800037D0395AB4B86189350E2CF0F77393AE38
-:103E9000FF50AC539E4F7F7FDF41B4438CE1BADCCF
-:103EA000669C734BF1B709FFF32B3229CEA49871AE
-:103EB00026D7799DF27A3B27EAD7565BF49D3BDB08
-:103EC000207D97F63DC6EFAF7FCAEFAFA76D6421A7
-:103ED000BCAF1EFA6C3C9D3F85A229C467D33F0945
-:103EE000D0F7A7CBE4A75A73A1BEEB9842DF85EFCA
-:103EF0009A9E9A857AEDE363DCBE4DEBBAE9C82D54
-:103F0000502E3E5687BE3EC81D806570DF754CFF43
-:103F1000C4F1A5FCC702F41F2DE72062DC5F361D4B
-:103F200026FAD8D7D44DCFFD4D517AB635F5D0B35A
-:103F300050D14A703D85DD7426C9A69C817A0B1C40
-:103F40008527A0BF851E864CD4B56AE2BF6E5BBBD9
-:103F5000B4BC1E5B3BF05F4BAB0B308F87E3D3856C
-:103F6000DF0D83F1E7F6B0CD92FA1F4A5EADAA1ECF
-:103F70001879F58FD505179357FC9C34D4637E27A9
-:103F80002C811F1DD52AF90D31BE34CF4B859E6E75
-:103F9000C57F823E6DCEF826976FB17C0C7EFF50B8
-:103FA0007C677EE3EB1FEDA1BCD277CC7A83FD4426
-:103FB000B3D433F6C92ABC0FF2123AAF60879E7BA6
-:103FC000BD6B15DE9BBEB52653D100BE123C58CD4D
-:103FD0008CDF7F11798A8978FB9FD59CAF8FE7FAB8
-:103FE00028BEDE92CBFF5E4162BB37ABB9BC409AC4
-:103FF000B0FE1D8FD47EEEFDBC2AC635F1D6EAE2B6
-:10400000F907FDDDEF78ACFAE2F73BFE60D65FEA38
-:104010003EC72FCD795FC4790B282F720FD285F858
-:104020003B1B51F37DECEF6BF859D2717E6ECADD0C
-:104030001BE7F8CCFDD414F33BD47B893ECCBF877F
-:1040400020EAA79C8BD5EFA3F9627FF740A7F88FF2
-:10405000B85FF7F3EADFEED960F99E574BEC3B8986
-:104060003C6FE95313FEC4A7B85F12FB1E147B6BB1
-:104070008F66F91ED44FAADF396B7EAFEA10C16795
-:10408000DEAB79348E875FD3FB84EF0374BDFEDA39
-:104090001EF33ECE6FA8BE21F1BB5BEFEDB1DEEFAC
-:1040A00079B4FAD42AB3FD515AA7F99DAE247461AC
-:1040B000D2ED993D789FF032C67B97C633BFB3B53A
-:1040C000D9E4A3FEE819DA9FA2F6B1EF0FD7795031
-:1040D000AFC4EFF1BFBBC7F6FDACFEF1F5475AB771
-:1040E0002EE665667E13E717911F26E8C23B87EF31
-:1040F000C776931FF0FE1FF55F316078F88CD69578
-:1041000070AFE852EBD837212CCF4138FCB1FC62BC
-:1041100085CA5F121E711F2C913F86CF91445EF3BA
-:10412000609A273BF61DCE6B06625E1877048D13EE
-:10413000FFBEE7F57392CB9F2F342E532F2F6F4482
-:1041400094FF3F19A999BA607100000000000000B7
-:104150001F8B080000000000000BF3176060F8518F
-:104160008FC09C687C5AE3BF4C0C0CFACC0C0C97AB
-:10417000D818189C39191884F8C833E7229ABE7BDE
-:1041800040B366F030302C636560D809C47A5CD8DF
-:10419000F5D90822D847817E5F01C417E91C06A320
-:1041A00078F0E01A11068649A208BE9E18AA7CADD6
-:1041B0000882AD2345995D4E40FD008850BECB80FE
-:1041C00003000000000000001F8B0800000000003A
-:1041D000000BD57D0F7C54C5B5F0DCDDBB77FF2728
-:1041E00037C9029B10E24DF863D04037103058D4E5
-:1041F0004D041A90D7AE69ABB1A576A14A151156F8
-:104200006B9567D5DCFCDF841002A202455954107F
-:10421000ADB6A9A2B59FE5BD0D508A7D7E9FE8533E
-:10422000AB56FB62A5B45AA5F1594AFA7D086FCE88
-:1042300099B9D97B6FEE6E962A6DBFF86B87B9F38B
-:10424000EFCCF93767CE9C99956C6E52760E21A70C
-:10425000E1EF12421EF21242C6A4D2CAEF7DF986E5
-:1042600027AAE8BFBDCED04E9A54FE626E71B4222A
-:10427000557F1611B05EED2F96FC91D07AFF4EEC73
-:104280008A937EDAE71FF486685E15EC04DA394912
-:104290004DC1BF0468F9902DD445F3C993361FA1D1
-:1042A000FD4C2776E8842844F645A6D1EFE29773C3
-:1042B00089AE7F737AF16691240B08D97F27112389
-:1042C000B45E9BFF8225033E425E6C4CFEE5C864F3
-:1042D00042C2C9A9A242FB39D07808F3FFD678F8C8
-:1042E0002F471C8444491E8E533BF72371296DB719
-:1042F000DF411AFA68BBDAB0E058AA1B2FCAE7B34D
-:10430000DFCDCBE51AD1B2DC4FCBE9F7DAC0E596C9
-:10431000E5513A23AC97C7FB191AB0433D850C7A97
-:10432000719E27EB2DE7398EB7D3F255036CBEFB98
-:10433000DE3E7119D0214972234E484F96BD05F8D3
-:10434000EE77090A29A5F81D5884F84D027E6917F1
-:1043500027DE61F8DEFF892DD444F15DEB927D21EB
-:104360009A2722A5072DAFF59130C225D294C271AC
-:104370001987FB2A9ED6438A7451902EFD2E4A1728
-:10438000DFE8F05EB2594278B579F6C33CB368A76E
-:10439000D1957EF545FCB41DB1E68391F8A1E3CD3E
-:1043A0003C733835BC46E6F6FFE5888BE0DF69FAFA
-:1043B000BFF9F2F37F39529ECA5F3274D890A71CBE
-:1043C0004D5CB329BCF04F0552F1CF035A79292B2C
-:1043D0008771E28DCA9F2751FEEB6D247F9E44F9C1
-:1043E000AFA7D185F9EE4619F35D8D41CCC745DA0B
-:1043F00084D231DE4D122A6D9F17A6F575E3E5567E
-:10440000D3763AF8FC21D990F796070DF5DD8A624C
-:10441000288F2B37DB1294EE9D15B6845D0038A8EB
-:104420008C9C0B70B830A5E0BE16A4F399C49A908A
-:10443000750EE5576500CF4B76D24CF3394AD8B6A6
-:104440008CE64B82769208D1F1730609A1FDC5EF87
-:10445000246423EDAFBB72B66D19CD77CD71CA76EA
-:10446000999004ED3FEEA4FD9C4A2A2DD0CF34292B
-:1044700004FD905EF1B7802717FDEF741921131525
-:10448000E91D5B0E21A52AFDAE9F9F530D825CE7BF
-:10449000561BBF4F5496DF4868FD8944F7BD34452D
-:1044A0004F6D5C2D6F1ECF3CCE396B4CFD9BFA2DB2
-:1044B00051066AE48A54BFE790C126D9F7CFDC6F72
-:1044C000B856003A858892A83C7B70FBD67C9C77D6
-:1044D00064660ACFDD0EA607CDF236406CA83F8891
-:1044E000388684295C8A624B74D17EBA4A6DC83F93
-:1044F0004A1B4980DE5A37E1700CF25DA592D24C1E
-:10450000F3A5E5071B84E984AC9D2023DF75ED75D9
-:1045100092E610832340F9B444E3D353033565C0D6
-:104520008702096DA4E5A5CAD126A82FBFE6511CB4
-:10453000D523E747D6B0F9639ECE7F10FE316B647A
-:10454000BFBF9C258523C0B72A4938293C9D939A33
-:10455000EB543ACE03AA48407EBAEEEC7B1DF01C29
-:104560009FCCE035CFBB449196025F13FDF874BC3D
-:10457000924957DC00F332C3A1E98BEF37CA288F89
-:104580005B1ACB317DA051EE033DB1E513BB257E17
-:104590002F13987EDEEA88D8003E758E2DB113F574
-:1045A0004F74EBF5347FFF77C7CE8075E0E6393680
-:1045B000D42F7FEE66F8BE5FE8BD8A607D49C1FA00
-:1045C00026F97F400C377F8BD6BF3F5840542ACF07
-:1045D000258EC30BCF85FED69455AAB4BFFB6FD9E9
-:1045E000F80EB42F993345B1D3F613AB8FBE4517F0
-:1045F00071B2E5D44030E2833C93EB923563FB2605
-:10460000513E19AFF4DE04E397544B4AA234C597E8
-:10461000C52484E39CD3E025497974FE2C5E9999E6
-:104620003FCF9E1EF8FBC85511C855410AEEADDCC0
-:104630003E31D37DB160437E1996AB6A26574F5EFB
-:10464000C8E8ACC9D59609BDEFE5D27CCF37189F35
-:104650009AF9BCB4FA680DD0B59BCA4F7E909042CF
-:10466000A7F2B140F33D4BB91C561F1596D3F67F08
-:104670007AD5A31090A725D6FA3A1D3FA752E3B8E2
-:104680000FDC62AB8DD07ABFBC76CA1F9D30DE12C4
-:10469000490139EB11CB717CE5BB92A2EAE859B232
-:1046A00084CA13E5AF925BB8FC98E46AB4F1E38D79
-:1046B00009F22E95A30D8D4112A6745BDFA8A07C94
-:1046C000ADE37206B62829A4792E67A47C06E6D34A
-:1046D000D99F8434A1DCB994248952FA6CA07D93CB
-:1046E00022F89E0C87E712920FBAEA42042769A3C8
-:1046F0006BFBFAE17212A64C4F7A049E57FFA88614
-:10470000E9787288E59F6BFAA3DA428570839BE5AE
-:10471000F70AE535EA5C7DFB83D8BF569FE693B583
-:104720009374FD41FF157A786C35505FEBEF8DA6E1
-:10473000A21A958EBF9EE7A5E63C963FCBFD770B70
-:104740007D41CAF464ADA99F6E81E349FD8F70D8A5
-:10475000971AE73EE1BDB06A28FF4318F0A495FF21
-:10476000A0E93F5495D6FF8844B608940E33E64539
-:104770008B08A5BBB72E49C094DA60C2776A7E2F3A
-:10478000E1FC7C152CFF60D32761C0B756FE8CE09E
-:104790006F027C03DFF8C6121244212164F3CFBB01
-:1047A000AF7F01FE5D9E4FC81C3A8ED24B14DA8754
-:1047B0006D524C807D47708978D4200F9CEF287C07
-:1047C0004F08349D3137FA35580A2DE053F5F0691A
-:1047D000E38F06AF06477AFE64E39BF9A87641F5BE
-:1047E0008B73A97C790F3B424E05E6210BA0C7F3E2
-:1047F0000128AAD7F24EED473A11B12F0876B4B985
-:10480000DFFC794524A19BE7674DCF2D9067787B2E
-:10481000454F579A7F4D8FC727A0DEAC917CA7CD1F
-:10482000CF0DF3236007D3F955E9E7F75403CC2FF5
-:104830001DDECCF35BEFEE6D8858E8DF8B6D7CBF3F
-:104840007B71F597A07F3A1E01FDE5560651FFCA20
-:10485000301EDD6AE69EDADF005BDB74E3C973E9D4
-:1048600078E5670F9FA3F1B18FEA2F85D6B3853224
-:10487000F3B1599EB5797B61DE02F011DB0F98E749
-:104880004D08E523FFFFBFF3FE5864F4BC85F6AF87
-:10489000B27931F9F807CDEBE3170A505E011E3B00
-:1048A000E3E7A0157FBD2B28867DAE99AFD3CDEB76
-:1048B0001FC5A723E79519CF675B0F65AB5F9B5FAC
-:1048C000F3201E7BAE61FB849E43F3D1EFD0F3C295
-:1048D000A5E3008E9CF8F9244CEDDF29D03FEDAF25
-:1048E00047B32F36578DD23FB32FEE6B247DAD9358
-:1048F00009793A6700F7C3144E6CBF95DA9F09AA8D
-:10490000E0AA5EBAC5BD948EB7F5BA8D6EF02BF5F0
-:10491000707BB1EAA587372CA0F81C776D7EA59D2A
-:10492000B2428F5BFBBEE7F929F4FBE66BF877EE4A
-:10493000BFA2DF5F82FA415E3F1D5C85D2403482B8
-:10494000F242E1D2E15F2B7FCAC6ECD227C1CE3A58
-:1049500017F633CCCE2AF4F42E05FAE66C959407BC
-:104960008591FDFE6FAE4FEF033B8DCE77CBB5ED5E
-:10497000456057EDDB317BBF0FE0BA86A03E3F3785
-:10498000B1ABDFA1C0F8AA00787ED241343B0BD78F
-:10499000F9A26B34BAD60B974EC276DCCE62F9EF31
-:1049A0000FAFAB5F47BBA538CAF2CF347FB7A64580
-:1049B000D495ABDFAE0917A7CA5F6CBEB106D6DDD2
-:1049C00019AEE89B7329E96650BDD742E198212AC8
-:1049D000F618F0CBE680A5BDB8FB79574382E277A5
-:1049E000F78E2913AFB55847281591CE5A7EE62188
-:1049F000A39C3D09F873021E99DDDA4DD10BF583B6
-:104A000051A505F039F31009C17E349DBE4B47C74F
-:104A1000E036A3BE9B211AE775B6E6F31191D97E65
-:104A20009BF74FD7F5976D6C3E7690A3992293FF35
-:104A30004F3B9F24E089D911BFB1EAFFEF35DF1961
-:104A40003E3A4EE0B31F27681A275DBF667DA5D6A4
-:104A50001241047F7C1109013C79F36204FCF87671
-:104A6000DFE1A04AED3D511EC0D411180CAA54EF4D
-:104A70004A41A510526771A810BED3FD11978F8EC1
-:104A800026D4ABC3F9CE26D0A3EB218FF2B716CB39
-:104A9000370EE7D761FEEE094C3ECFB1DFD30F7A78
-:104AA000B80C940D856B5DFF1B0DE0072838E00BFB
-:104AB00081A951E00B11D0C35A794FFF7B4117D820
-:104AC00071077CC44DF93D5F0E137DFBF5FD7F0D35
-:104AD000CAB4DCC7CB7D8188A17C63FFD4C22045EA
-:104AE0009187977B82512CBFBB7F4EA10276CC0170
-:104AF0009F0CDFBDC5311CF7D25FACB4A13F76B1CE
-:104B00002DE1D4E9ABF8E219A8DF9708D1A9764ADC
-:104B10008F9A5F74BBC07E881FA81807DFD1E6415B
-:104B20007F92F87F613F0AD9D36807F9E4A3E7735E
-:104B30007AD953F4E886F30AF403B3738A383FA7AB
-:104B4000506B9349185FCD6174A21C9DF23F63FBCB
-:104B500043297F35E60F1BF27E3911867DB418A0FC
-:104B6000FA81B6F786D530D05D2A6679BB2F9404DA
-:104B7000FDB1F91B2404608B149F507FFD1C9A57D4
-:104B800080FE116CDF398BE5A56054857CBC92E515
-:104B90009DC5B124E4D74E65F9CD1A9DC9A3463E03
-:104BA000207F42BA770EE7DDCD501ED7F886789B7E
-:104BB000A17CED454CCF168935FB00FF9BFB3B0BE1
-:104BC00097D3FE73811F68FFB94B42482F8D2EF794
-:104BD00029365C6F35BADCA7CCC07382CA5C8A09FF
-:104BE0009C9082F4A83CE7669B0CE71DE7DB123B38
-:104BF00005389FEA760FD07A9BCB6760798968E7A2
-:104C0000FE01E60FDFC9FD0165D4BA00BB63275F73
-:104C1000AFF7DD332517DAEDDBFABF90DE17DBF3F4
-:104C2000B0DDDA72767EF32C5DA7C14FF74CA30B93
-:104C3000D31FD1FEA2545F3FD1E8C2F4078D32A644
-:104C40008F523D0E69372D4F82DF81962769BE6FE7
-:104C5000C05607F27F4F2335CD68FBBB1B5D1F8B12
-:104C600093C15F21637E7D6310F3DFB6D5AFB133AF
-:104C70007F8AB782CEEBE99727A17F2FF4862D920A
-:104C80008079CBA4607155EABB869F6FDB6AEF0425
-:104C90007EFDE18088E31071A0EB7CEB7ACD506F54
-:104CA000FA1B22EB2F30B0F1B28065BD0EA8F7F8E9
-:104CB00011063771253D69FAEB06782BDEE6F00523
-:104CC00093F969FADB00F51E3BC2E1F325BACEB3D6
-:104CD000AE772F8C7BDEDB1CBEE2C4C645D6E37EFE
-:104CE0001FFA73E5337BE573E0CFA8C2756087A038
-:104CF00093E74D4B55C146E9EC2A188841BD6955EB
-:104D000031A18C8E1FB83A26D8A6313BC346F36E2C
-:104D1000E887A6E797D3725A6F1394FB75E5D09E88
-:104D2000A6532B5879E09BC6F261BDDD40343B357C
-:104D300009CED6E0578CF92936A61F9FB3FFB606D9
-:104D4000F87D8AC4CAFF1BF260772D36D5F7B0FC18
-:104D50006FB5FA39ACBD4D6479573E9B77CE565747
-:104D600002ECAE0DF3DB83CB7CA9F9E62D889743EB
-:104D70005E9BDF86055B83CB74F3C9FBC2B6F2652D
-:104D800015E9D715B7622361DDBA3BA5B782840B5D
-:104D9000FEF9F5CB5775EB06AC2BE3F8BA30AE9ABB
-:104DA000AD2B146F2AB35719DED65F64C45BEEC512
-:104DB00046BCADBFD888B7DC4B32E3ED977CFC74C2
-:104DC000F8A3E387F5E36F5C681C3F7F9171FC8D6E
-:104DD0008B8CE3E75FF6A9C74FEAF9A6B7C638BEE2
-:104DE0005C6B1CBFB7D638BE7CE9A71B5FA34F67BF
-:104DF000FF16E3BA5E15217AFAC5FB3B8386753D43
-:104E0000C4D675AD7C6DFF4F83B0BEBB617D07FF1F
-:104E10004C395BDF2BDFFD28087EFBF5171D0CC22C
-:104E20003E633DAD7BB822B56EECBBE856DB63B4A8
-:104E3000DFEF4C65EB4CFF45CFB840FFAF2D67EB84
-:104E40004C9C9FE77635268FAF74A4E6E58FBB7147
-:104E5000BFA7E587ED25F2BB1AE0C378B98DDB4B20
-:104E600085CD616A8BBAA68A867C67052BBFBDB5E6
-:104E7000B059055F8AA816C23AE42D277FAEB0D894
-:104E80006F69E36BF0A41F9FED8B53E34F348D3FAD
-:104E9000D130BE96774F63E5AA38A916E0D9CCF792
-:104EA000CDB788BF43FD72F6E09BD61C9EA4878FCA
-:104EB000E553F0B1BC06DF5DE2F45A75D2DF13BEF4
-:104EC0000B4CF8BBC084BF0B0CF85B23569F11FE44
-:104ED000CCF5BA4DFC790309DF268E013922686FC3
-:104EE000C644999F07B1FEAA442E5F303EC4ED2C04
-:104EF0009512934B59793D5DD796887C1FC6EBD7A9
-:104F000099F29AFD0ACBD169F4C358DBAF12617AEA
-:104F10009BDA1DA19DA8D743284FA97D07F363887D
-:104F200062241CB1D007F78AEC7C5890430D00A78F
-:104F3000E893D08F9AAE7EAF2870FB5A359CEFE491
-:104F400092C1A41DE008128C4F2227BFAC5C3E6DBD
-:104F5000241C921889C2387659220FD2715AF3AEA6
-:104F600050F4714C8F6AF004C3088F2433782431D5
-:104F700014B6F2033F2832BF85D60F8590B71F24A1
-:104F800060276AF0B5B9230D4BC19ECF93104FAD8A
-:104F90007EE379F96FF8BC5EE4696B9A733F02D1E6
-:104FA0001810BF34B61AEDD096EA5A17F0A542424F
-:104FB0002EF0D7B7FAACE389B4D46C77C6A95D0AF2
-:104FC000F9766A9742DAEA7BB20ED69DE3C0C7163D
-:104FD000E7DAC37A2E642349DDFED35BEE214983F1
-:104FE000FF348170BA957CC37767B0C8D0CE315694
-:104FF000447BBED5674B40A8D168F0B773F8B57A4B
-:105000001D62CC2567B15F76068DF09E3DFCB1F642
-:105010005E479F6C05D76785378DAFCCFD4B05523A
-:105020000CED623112D4F3BFDDC1F8542A70C5987B
-:10503000BD9EAEDCC3DAFB6839D8C5BE8802E72F57
-:1050400054E4314ECC0572A0C3CF78DEAED5C1CFCB
-:10505000A3490CFDB582126B003E72154B783E6081
-:105060006EA7A51EDEBEE393EFBC8EF231C685F2BD
-:105070002128547E2CC6795C0C8F75D074B3181E11
-:1050800007A9E3943D6A2527631C4C8E5D9188E255
-:1050900062A12696F0CFE4FDF66AF0AB313CF7CA88
-:1050A00016FEB22CE19F99827FBA6316C2FF39487F
-:1050B000D3C13F8DC3534042FDB06F0706857E09C3
-:1050C000B95CD19FCBF5F07E0B387C84DC8474D343
-:1050D000CA3B391EB29DCFDC2CE7D3939A4F1D9F5C
-:1050E000CFC24CF3F9029F4F8F83AD57AEBA8812EF
-:1050F000A47C959F862ECB79FF5B87E972D319F14B
-:10510000D557B39CC7F2D43C9672BE5A96691E51CD
-:105110000E4FAF9DCC3902F13313F97A43EA0D7487
-:10512000D9AEF19593AD1B84DC6CA0CB3DBC9F6CDC
-:10513000E7B33ACBF96C4FCDE77B9C2E77649A8F1F
-:10514000AE7E13AFDFCCE50AED96ED8EBDCD607F70
-:105150003C2E46DA1DB352E3D17A1DFA7AE3DBBA6C
-:10516000B47A6BE1BBB078B85E371F9FDB450FE1C7
-:105170007EAC0D6C0C6ADF7CB1EDC55AB0C769BB63
-:105180008DD87F84AD9BB4DDDDFAFE67B6DDDBCC68
-:10519000EBDD07F59A2E3DA5F5BF59DFFF764752A7
-:1051A00083631BC25137DCDFFDFA7ACB1D7DCDEC6A
-:1051B0009CB0583EEAD5D935C1ECCE7D1C81687CC7
-:1051C00000FC95C4DF0B7647BB18DB3E00FC408D2E
-:1051D000BC9DF4FB6DCEB020D0F5530EC71E817A76
-:1051E000F9AA53B603DD6A633F82BC6A2311888B38
-:1051F000BCCF7BD776C8AF115DB23304F696824739
-:10520000433D0111E379DA84A80AEBE20931FAACF3
-:1052100003ED1EDA251DE7B60225D12580FF96088D
-:10522000CCEE60706DF05E1D07389C142E880F6EFA
-:1052300033C145C7C37D79E718166F4344522E42E8
-:105240007F764F08FAEB1F732BC21B6F72CAD03EDA
-:105250003EF95684979645303ECF1143783B1C2E3D
-:1052600019E2F1EEF3AEDA0CF1766BD45CAC8F7030
-:10527000C0FC279621FC6E124B2E2D05F5D51BB6D2
-:10528000013C8B258C4B8E0736E2FEB66B315DE41C
-:10529000E8B85DE51B5568777CB107E3EBDCBE5EE3
-:1052A00002F15605974904E280DC815EB433F317BE
-:1052B0007958BE98E038F99F67F1B20E322097D145
-:1052C000B420CEE28EBBCAEBD5A560C754B37854E8
-:1052D000A2865F86F8B63CC2FFECC5FDD0BF63BCBA
-:1052E0009DD84329FA16F40EB7CF8D5AC8CB70BD9E
-:1052F0004496F592D9D5CB8F8BD9D5EBCDB25E2222
-:10530000CB7A4956CF492ECFB58AF718E6FB7912EA
-:10531000DA1F5A7C5B0EB5FC87ED935266B7EBED56
-:1053200015079152F60AF0997D494638D6BCD51436
-:1053300038A0B36F02923F80FB8D0BC8052897A35E
-:10534000B43FD1A8060E38469F2F485852E7271F72
-:10535000ADFE5AB0F79CE9CBBDD3AF08A23E9BF699
-:10536000359E2E616925FD5E016903CF7F8DE7972C
-:1053700034842DC6AB91981E2E27918C747073F8CF
-:105380008FC2993F6D522ED2FA16E7E35AEAABB0BC
-:1053900099EC46A3BE73896A2D9E7394B3F8412796
-:1053A0000823C84D88A07E7190A45C86E78BE19CA1
-:1053B000A56353F2E3088E45F9F93F85762254231D
-:1053C0007D428047339F98F9C267E28B4FCB2757C6
-:1053D0009D253EF1C6ED59C98FB737CB7A892CEBA5
-:1053E00025B3ABE78B0BD9D5EBCDB25E22CB7A4997
-:1053F000566FEDBF48DCDF7A590BF861BC5F74195A
-:10540000F26BBFE831967FC967C8772F34B6F72DA6
-:1054100032B6EF5E646CEFBB8CB57FAAFDAB9782B2
-:105420009F275B39F9DDDF2827E5AECCF5F3178F31
-:1054300022572E15F7936E5121C900AC5F749D124F
-:10544000300D272CECBBE7B9FCBFE0607E9CB8A810
-:10545000E2BEF69F7D9E3F9098DF489BEF68F06A22
-:10546000FAF7F7766E6F99EDAF61BFCEC9D3A76734
-:10547000831E21102C4D64854E8DEA1B0FF1842074
-:1054800054C4539EC0F36973FF5D705EC7FC2EC1A8
-:105490007A1D1CCF3B995FE5E7A5ED413CAF9DBA76
-:1054A0002B08FBF4AE0982A59FE594C4CE05CBA2E0
-:1054B0005EB4333A1417EAC3AE09EC1E5397238146
-:1054C000FEE3AE52637B17B71F4E496CBCAE3B6325
-:1054D00004ECFFB6A9BB1A605C67F25F8942E1FE8B
-:1054E000EE8418C68FB63BD93EC0195609AC0B2EB8
-:1054F00045C5F377333C712D6E882482F5BA79D790
-:105500003B19DFFC9CCE279B79BD2B49585F0E339E
-:10551000FCA5C3D7DE33C4D7B54ED6AF127423BEB5
-:105520008E57135C4F8090F6D9048FC6D9DF20D1F7
-:10553000F387793D060A337E3B8D7945BC2A233FAC
-:1055400099FD30CAB6AF65E4E70EBE9E3BC9D7B140
-:105550005FA7120B83BEF35624C832C42F0993B140
-:105560009CEF14F8BF56D546E5977241682B6575D8
-:10557000EF98CE50D2227E6998FE1592515ECE7081
-:105580003D9BE9A4EB9937B59E1D27DDE884EDB678
-:1055900091EBACF0AEAD674AE0AA8CF3EE6A647EA4
-:1055A0002B42EE207D309F57EC481F5B395137501E
-:1055B0007A392B443CE7704E4A10A0B3AB9C24DDF3
-:1055C00039E9E7F51AE73B259879DC1E8EEF6E4E38
-:1055D000A774F5BAF9B9E76B1D0FB5C0FE2D6F1EA4
-:1055E000938361BE171306FE1C92985FA3CBAD3464
-:1055F000613C4B29F38F8C983787D32C57F134F7C4
-:105600006934B9FDABA4303DE44AA0DF41932F4596
-:10561000F957D4735D139A5DC0D471E541F4131F3B
-:105620002F9708DC8331EB032DD5ECC84B48B70B23
-:10563000EE2BAD7DC51EEAB280D70D44D0F9F5CC76
-:10564000FA7A347D72DFA7D4273FD1E47EA43E41AD
-:10565000FA5CDBD1BA1FE8D3E566FEEBFC3A952C89
-:10566000D5CDB79B8FBFC4C9D7856206479743AED8
-:10567000D1D3298F7EAFD1EBCD34F44947F72B211D
-:105680001870560A0EF3FC763959BD7C18BF627447
-:105690003C8CA403C3438BD39A0F3EABF9343BB38A
-:1056A000E3E36DBCDE368E576D5EA3C989D67F1FDE
-:1056B000C757DE3C93DE175503FDED1ADEEA4CF5C5
-:1056C0005CC67A1A7E4427B357B47562B4FEDF967F
-:1056D000187F98FB4F2787BF19964315FDB2DA381C
-:1056E0004EF21CFA0F8E53BDDC5549F7A3BE418C18
-:1056F0002FA07B7D8C6F82F82FBDDE35EB2F4DFF09
-:10570000A7D347E67DCB68F5A58094D14ED2EC9A1D
-:105710007C7E6FD2C5E381370AD6E73C435C8EA816
-:1057200062CF2AAE0FC244001F2442F8FDBF707F33
-:1057300013CD8F0D494A17F83FC4F9FD3B687ECC65
-:10574000CF9CA42B042E9779FDFD94DFD6865D11A6
-:10575000281FE72A1DBEA7D53B1BFC5ACCEE22F61C
-:105760003B5E877BC063AF1409E0D549E6609CF6D9
-:10577000F13594769523E1192B12323E9FA6DC3F3A
-:1057800080E787B0A5FC8A119F64B12E0F7E6097D9
-:1057900071DDCB76DE6678D2B51B159ED43EF4085B
-:1057A0008CEF2499D7B5339DDFB05D9BE5BCB4FB8E
-:1057B00068DAF7D2213B51E07EFB9080E939435E05
-:1057C0004C4B86DC984E182A200A255AF1501EA60A
-:1057D000E387C6E3F7A2A1424C0B8726621A1C2A74
-:1057E000C5346FE87C4CE5A1A9986EE072983B3413
-:1057F00013F3DAFDB79CA14ACCFB873E8FA96F68F3
-:105800000E2BE7E7A91BEE8C12F0574BB00E51F9A7
-:10581000689BBF1CD725F3BC36B8D83ADCCEEF095D
-:10582000B79BF4761F2F7FCCC5E47E03970B22C66F
-:1058300088DE6F7E3FAFB7A12C8AF677BBB61E1607
-:105840002E37AC87E6FAED69EE273FA395737848CB
-:1058500079FD28F461E7AFCE4014EF0D101245BD7D
-:1058600044C4A841EFB66BF067798F70C3FC6790B2
-:105870008FDD549021B4D0FD856D0D0F83DE5970FE
-:10588000EB7507A8DC7DE88CDEE68271BFB002997B
-:10589000EEFBAB6E0F82DF77C3FC7BF17E1398DFEC
-:1058A00010D7DCB1E08ED8C3C87551B4B369BBBBA7
-:1058B0005CBA73D0CEE5B737ECA2FD29AD36A2E8CD
-:1058C000F8B5E40E0F51F4FAEB644121B42FBE2574
-:1058D000DFF0BD686591A19D764F22784D99A19E1C
-:1058E0003CEF3C43BD9CB9338CEDF839B9AFEA428B
-:1058F000433BA74FC32B3B47A4F437AC1F1D823556
-:105900001D632EA62FD3F1CD152EB6AEA5FACF4C22
-:10591000B774FD677B2F24C51F69E781E710B1F8D5
-:10592000E279604F39E528DE5339F3FA67771ED9FB
-:10593000D633EBAB1CD05705A04F044C7DA0AF0A6B
-:10594000408FB831D5EA9DE97DDB75A06F7C3A7D4B
-:10595000338BCABD053FF8DC99F5CDF9BC7CB29B11
-:10596000E99B759CAFCC7C13E4F5D681BEA9185D8C
-:10597000DF04DD99F54D251FEF1FAD6F3A67DC1B86
-:10598000FD16CDB92FD8D6F0104D3B2A6FC53CD5AA
-:1059900017A29B9677CCBE23F6904E8F9093FFC9AB
-:1059A000F892F3436EB5517F68FDFB43263DA2C9D3
-:1059B000C3DF28D7A738BFA6A3CF914F29D7A7CE3B
-:1059C000925C9F7275CD83F3C56CE57A64FDB33B41
-:1059D0008F6CEBA9B5247909EC4BA678122DE0BFAA
-:1059E000B4F586D8BDBC28C6ED743EEFE07E1EE659
-:1059F000FF9BE10A2F02FE99E18A2C76D3F63797B6
-:105A00002AE3609DA6F92FC2775D3E62CAD79BEA62
-:105A10007FC594BFC254BF415F1E57947170BE18BA
-:105A20003FE4C0F3C1B862ABB3E2A7856EC62F876F
-:105A30005C9128F4776EE2BC7140179A5F86FDB9DD
-:105A4000597F347F8D29BF1CC74FE5AF3395AF30E9
-:105A500095AF34E557E9EB779E9A781FBEBFF14BBF
-:105A600007D969E14F7A95EB898EC9B7479B995C55
-:105A7000DE06ED3BA6DC115B46902F08C06DF79962
-:105A8000F67F94CFF4FC7288F7F3F309B7E2BEA96E
-:105A900083EE9F308E11FC7816F8F9B59BBFC3A535
-:105AA0005C8FF71FE28537A39FA3A3B819E3148E79
-:105AB0002B129ECFC64BADDB7736323F5347B1F545
-:105AC00039C2AF210857678F9049CCFF076270DA5F
-:105AD00006EF0931FDDE56DA8EFA554A5ECFFC1B21
-:105AE0008551F46F3CC8E927F962E8577016C72C56
-:105AF000F7F51DC3F830FA35F769F8E0FB481D3EAD
-:105B0000500E9B3B3F3C00EB6BDC6D2D673F7633CB
-:105B1000397304B31B7FE4FCD9FAB01D2EB558ECE1
-:105B20006BE30E1627AF4E607E00918EA3F72B9885
-:105B3000C71B9EA7699FFD00C753DCCDE2ECB5FEF5
-:105B4000CCF03CC2EB3DE2667E056D5EA2CCC61990
-:105B5000ADFFE7E0B216F80164B31FC2A8E7EEE0BC
-:105B6000F51D0163BD74F8B973183F2C1E4BE3DFBC
-:105B7000D1F85D1BE710C085FB59EB7DB872B21AF6
-:105B8000E3378E137F6F17EC9B45F97588E3B88D6B
-:105B90006E93C0CFDF22AAE85F501522EFC4F34F07
-:105BA00076FE709BFDBC10E83B178FAB20105711A1
-:105BB000D0C525829FF35C8CB37804CAD7A84E1950
-:105BC000DE3719724F6471AB27D7603C4527DDA9DA
-:105BD000C3B827DC250978CFCA9EDB8DF6BCDD5E15
-:105BE00019B38A33153D8C6F2F39B91EF56CBBC2C2
-:105BF000EEDDB48B51577E05B8AA5594D74E257368
-:105C0000FCA2390ED2219BE30F8DF89AE661F48D48
-:105C1000F3F537EE0E35E8E393821E37960FB98D14
-:105C2000F075007C3E802B86F1A4F1629B0DF0762E
-:105C3000B6E0D3C6954A6D11C04B8044315EC515A0
-:105C400014715C9B97E137DDB844113FD0BF1F73DF
-:105C5000B6F039BCFE46193F89C483FCA4CC73D589
-:105C6000EE86FCF3CC2F6F1EE788277A8147E71773
-:105C700016E528FAB7B4FE168E6171DE6231C1FBFB
-:105C80008A1289D495D2F9B714B3771645DF2871F3
-:105C900011C5667F45BA7339763E824554446BFE22
-:105CA000C0C6F5F078013F19C060D15C50E91321FE
-:105CB0005E4011D83B102181C595CFC538F280FBDD
-:105CC000B3EE7709F62B843790D3DE33E8571C40C8
-:105CD0003FD767DEEF28F0BAC936EC1742534F17AB
-:105CE000A4FA05FD8B4EA593A74FC3B9999D687F74
-:105CF000CC0E176DEC5E1529CAC1B8C3B6C0CD2E47
-:105D00003D5D9B3C6586F55592DB6F1272E0DEE7E8
-:105D1000CAF04006BE6C0339023F62F135E181F200
-:105D2000F4F53438453A7D2B7F68BB144D3481BD82
-:105D300058E263F1AA620CCF473A84FC195D553AE8
-:105D4000FE2D96920097BF2AAC423C6347812D04FA
-:105D5000715822E93E8CEF3BD9178732C9AB582CDA
-:105D6000BEAF9FCF568F310EA465147E6FE3FA3A13
-:105D70005DB9430A45ADF4F0131EBE8E79ACCB3F3E
-:105D8000F6D63EE6B15877F6723DD5914755E9E72C
-:105D900018FB001F88C5075F073CB48D5990593F19
-:105DA000C946FDF45FDEF04F609C0C703C67050750
-:105DB00081C714B2B0FBE579188C988A070A30BE07
-:105DC000863820612C9CD2B2BF75550F26C1EE7665
-:105DD0002CF585817EF6F06E02EBA81617640F7B1A
-:105DE000DEB1213DE7B2F8A072E6670DD3FF308E39
-:105DF0006C6EE6B831BB29FF2B339D1B9FC5F72284
-:105E000034F8B53875F3BC9EF2D6BEED9965858F32
-:105E1000ECF6419B28BF10CA2F1BE9FA4E91427A3B
-:105E20001B65CCF7340631DFDDA860DADA588EE97D
-:105E30005A683A07E23F62F152D88F041F0E5E4B58
-:105E4000AB6C029A605CCB8EF9B08FEC1ACE135516
-:105E5000807325B81F4FEDD0BF7A36CEE7E76C3C94
-:105E60006EB67D3E9EA30DE7B7B4815DD8C5E368ED
-:105E7000E5B50FCE87FDE3A609DA3E39ECFAAACEE6
-:105E8000FE9AEC75B073A652AD7D4B1BF4E7167904
-:105E90009EEC996FCC9330C0E376B1FC42EFD3080F
-:105EA0000FAA003ADEE5DE6730BF6932F73B54D413
-:105EB0008F8247E6C768F728CC0EAAC8473F8514EB
-:105EC0000AC1F502B2298FC39D653FB0FFC1F5EE4F
-:105ED00015EBF5322537A3AC6B1C8ED1E84FD18181
-:105EE000F605E86115C67DD58EF270B6C7DDE438DB
-:105EF00033BC48D5832A5CFDDAE7895EE4A5EDFD75
-:105F0000E1BE6429CDE72C4EAA28BE598E5BE8E598
-:105F1000F7C9E87C41FE353C6B76C74D40C731A9D7
-:105F2000FE1C8130BE23E1E6EF09670BEF728F6C38
-:105F3000E8873C5E5B98E9DC654CC4064146C3FAE1
-:105F4000A2A0CEC38335583E2F9C6FC8E7561719C1
-:105F5000EAFB43658672877C9EA1FC6FA5D3D73D83
-:105F6000B281AF23A679CD379567DBAF7B8D5D819D
-:105F7000F7204B45CD1EDD88F7928F038E413FF60B
-:105F800056E23D5D3249BB8740C210AFE256C2C8FF
-:105F90009F1E12C2755A2A36DAA962C068A7061B6C
-:105FA000D4A4D62FC425B8D74838EEF03AE563F12B
-:105FB00020DA3919EED72782AAFBDEA152D6CE32DB
-:105FC0009E414B457E5E8677EF4B473F4F358F13A3
-:105FD000FC4AE63835737DE21395A33AF94BDF4E60
-:105FE000244775EF6AEC00DACF4AE13FBC7B29FA1F
-:105FF0003D9C84DAD114CF2DC12B4894CEB31DAA79
-:1060000050FAC521A57CDE1E9C21631CBEC2E86A35
-:10601000733139F98E5731C473D87D4C4EB47AA39D
-:10602000D1FF363B8959AD67AF7AD93EF9C45DB12E
-:106030003FC1FE527D99E03BAE7D8D43F8CE655564
-:1060400072A11DFC26AF7BC7E27CAA0E84ED97EA05
-:10605000FAA922ECBD6FFA67D7FB5335FF3039E957
-:10606000C2B8E03D491617BC27F9DFFB4F43FE904D
-:106070000DDF15DD7338B37DD5C7ED2BAD5EDF21A8
-:10608000B65FED1389373F939DC3EFBF55264D7122
-:106090008722B103FD4FDCA9D8C1DEE96B7409B0DA
-:1060A000EECFE0F3AC4A86EDB09E8E36AF7D26FA99
-:1060B0006AF384FB8730CF561FBB0FD82AD3F9224F
-:1060C0005FB3F7B2D3C13BBCEF97ADF121F9D9BBB8
-:1060D0001792232A5BCD7BB47B8A1A7CED009F004C
-:1060E0002983AB3DC0E8D01ECC4C87160E9F56AF1F
-:1060F00035C0E8D04AED836CE0117D4678A88D2745
-:10610000805DE823893A7CD34C252FC33E08558512
-:106110000278D897BC1FE0857B1760CFE75509D779
-:10612000C2BD8F28B30FFD55C9E4DE009A2711B810
-:10613000975130D09F7C9B961F6CF0E2634FF2B575
-:106140004792D08F280FA2FC74C160681F4D6C0766
-:106150007BA70DFE4955FAB8EEE002B03F44C2F409
-:10616000029538451CCBED130B79D79DEF0BA79DFE
-:10617000A976E9F066B63B9DA43EB3BEE2E7FD2AF0
-:10618000FD0FF48D6CBA1F61B673CD71F017813EAF
-:106190001F93C53D8C4F394E2E79D005EF21D8CBBA
-:1061A0006D32BCC34C557A1EDCFFF1864502718D01
-:1061B000B9BE017C3A6B34BC53FD57C7E246FB883D
-:1061C000FE1E69BD8FF98102F55582C0EE1128F0DF
-:1061D000EE66A0FE50C88A4F35FE1CCEFB9E44FDE5
-:1061E000D8461271883B51EB6CB8AE759597E5E9CE
-:1061F000F74737F904BE0FD5E84F1471768AFE745D
-:106200007E61F7F4BF1FFDF3171BF17EA674B9D3AF
-:10621000C7F4D268F4FFB4E368741B291F4D9C6E69
-:106220009B50FF754ECA4EAFA4E8F620CAABB79C90
-:10623000841316ED9A39BDCCF7F65D2446E0F728B5
-:10624000ECAF307BDA3E6E76C30E92812E23E2AC49
-:10625000583F761FF3A7AD133C21186A5D1AFFF271
-:1062600024BFC0F5FF008BE79B733008E7C7DDB3A1
-:106270008E06E19CA3E713EB73C8857E7E2E127E0B
-:1062800003F7013DB3985F10FE40EFDCC6FE49CA3C
-:10629000D4F736C33B66EBDEF21AECA1F6C6CCFEB1
-:1062A00006A9E8BA28D81927DE1114586F84A23538
-:1062B000E7025CFD7396E3BB23ED55FBF01CA63BA8
-:1062C00094992E5A9C6FBB29DE36DDB9E1092EAFB9
-:1062D00065EA0D685FF614BE8CE3ACABCA3C0EBC3D
-:1062E0009795299ED7652351F4179BCE75DFE4E37C
-:1062F000BDE9E3E7138EC8972696C2EF72A8E81FA0
-:106300001B5B1EE9B751BCD5FBA3AFF9285D7BE64B
-:10631000DC5A0870C03B317ABA07A07F0BF8C6FA86
-:106320006D06BBE94459ECBFEEAC82DFA79882EF63
-:10633000D66BF5BAD3C4B19FA7D15971E3BEA71DDF
-:10634000E2FE297CDD85D9E15FA3F325E405D7448E
-:10635000680F71BE19F8D9BCDE8F8677331E7A1CA0
-:10636000031807D52358CF67A19FC95DCF9D4976F4
-:10637000AE36E7289EABF9926F60FCC477671DC606
-:1063800073B5123FA387DF378071A539D5EC3DC0C7
-:106390007472F400A79F281BEB1171C070EEB3DD7F
-:1063A000C7CFCB0299FBD3E024AE0176DE33522E69
-:1063B00071FDD9D9FDF0417C378524F15CA1FD55F3
-:1063C0003BDC4D1DC6C308B98AB3DF85E9818DC7A3
-:1063D0008530CE5DEDE027E9D1CED92AD9BE49ACD2
-:1063E0004AE2399BCBAF18E3AF43DABB88D9CDD3B0
-:1063F000076B11F30F8BB0AE823F1EE06BADBC029A
-:10640000FD69E9E8FA1D6F74A67F8CDEAFCFF65DFB
-:10641000FF6C7C78C2A718EC43333F3AC937CE688B
-:106420005F97CEBF7C82CB67002AEAF649DFF44B48
-:10643000D6F87DFBCAD1F0FB4D6BFC5EE501784FD1
-:10644000DC63FDFB445ABAC5A4EFB668F128F0231B
-:106450002185D85FE9E516F3D6D6D5137EEDFD9EEE
-:10646000A807D68D3275AE07C6DFD5BDCC03E3EEE7
-:10647000DA9C999EDAF8DBF9F96282DF77D1CA13E8
-:106480009C2F7798F4FC2B5CAEEFE7F2B5CB15F1BF
-:10649000E0EF55ECBF6AD1548ABF32CA17E05254BC
-:1064A0003A497EA6F14B55D3BEE40CEFB5F4F84D56
-:1064B000F1BD59DED3FCB478D901FC7321E0E1DFF2
-:1064C00051EEEDC95C94A7B2958C6FCAAE194CC25F
-:1064D000BE76E2265B42C1389628E2A570A5A86088
-:1064E0004C1BBFF77A2E5FDF89FD0E5B0994C3BD9D
-:1064F0007119DC2EF2D7301E669BF1F73F76B9C2D8
-:10650000CD12D8BF718C742465DDC6DFCB184F74F3
-:10651000BF5741C72D7CEB3DFCFD9442D3EF827CFD
-:106520005ABCEFFD07E13D21128F5E1F2B028958F7
-:10653000E9FDFFE47CA9341D60EF18C47CE45DDD57
-:106540003907A55F3ED805DBD58D35804F354E42E6
-:10655000932DF4D86FFD5EED777C0EC03B0B8E6201
-:1065600076FFAC6DE915037BA9CADA7E472DB13AF7
-:106570005FA17AE1B77E5C9F985E48A8F52C3D69E3
-:10658000473E99DC4D12F03B28F336C5FA1D20EA50
-:106590002BD93BD48571559068BE8C9AAFB47B32B1
-:1065A000F13AC2EA2F218930F211792D3836F57B84
-:1065B00027250337F5C3BEF820DD17C3EFA868BF52
-:1065C00057A2F1CBF898913F26C78DF971267E31FD
-:1065D000B72F53C822187F52B78DC0BE6E4C83AE02
-:1065E0003EF44706DF7B848E3FF9003CCC48D3DE87
-:1065F000CCFD8B24EAC8A1F87CFA2EDF2FCBE9046E
-:106600001FEAAE2D00BCEC721176EF22E2C27717C2
-:1066100048C4FA3C6904DF6A767F9AFA297DC9EAA0
-:1066200069EB5EC75B027BE7A2447EA714FC9CAFCC
-:10663000B1DFAD4BBD5B7121BE5B112431663F9272
-:1066400008A6AD9C3FE54B8B4BC11F1A7FDB2BC3CC
-:10665000FD2CB9C0E84F13F3EBF03DB061BB3B9F9D
-:10666000DADDB43C9E67D4A33539CC6E0DE5B07B42
-:10667000A1B297F5435C6AA15EEF6FCA118CE53E4B
-:10668000B5F0CBBAF25ADE3ECEDF2DBF24675107FC
-:10669000D833F2785ADF823FE7F171B57212081DE4
-:1066A00086F73F367FA37E967E3DDF94C3CE77E4A8
-:1066B00073F8B8C5D670C54BD9B877F37137E518FC
-:1066C000DF8D23324BB5EFF7FA6F158E507C9F703C
-:1066D000905A88576919634BC0BB69B78DD5E2C220
-:1066E00032EB098D0EC3F896593C52D175F20CBBB2
-:1066F000851C6BE9D63AE6A7327FBF9ACFA3F5BADD
-:10670000DADE4914AEF0012677CE00B13C07A2F2E2
-:106710007D75CE2C8B75BFB50EF77127F232AFFBAE
-:10672000E67DAEC8FD8BE67A4D9C4ECA2B417C8A35
-:10673000BB35C8FC895AFF270A995FD1DCAED3D498
-:10674000BF9BD48721CE18CE57E15C559A4412499D
-:10675000DA8F27D02B972A101F705885FD91422879
-:106760001EC1CF162268D7B506D97E540CF6D6D8EE
-:10677000209E84D4C97A3BAC88FFAEA29677F8A25B
-:106780004D39680F8505C48BC8CEF34F38120B0105
-:106790009F2DA53662F54E7F770EB373B72AF52F7E
-:1067A000965AD06F438E62B09F8B8698FD9DAE7EC9
-:1067B000AA1E836F981F832ADE3F200AE3C77A7FD1
-:1067C000F89E1CABF35B4DAF703FE4B26AAE7089CC
-:1067D00072E5AFE93CAE3FE4C0D8F44B4E6E3F08E3
-:1067E000FAD74EF56F17FE8E5CEF41F0435E03F76C
-:1067F0009F68FEFAB7A64925B4FCB5223B7F743EDC
-:106800009203E37E486CE82FF990BC9C335347BF5A
-:10681000A77224B6DEC41DA847357FDCB5BD0E8344
-:106820005EFDF666637E39A91F0B7E8AE59B1C24FC
-:1068300041F17BBD49EF3E94C3CE89BE4D62EDB0C0
-:106840007EB6F1F3BF1B7F324D02B9B97EA65C6AFA
-:10685000D7DDBB7A2E87D977EF533E527472B6C21A
-:106860009790601FF7EE9E99577C9E403F89F622D5
-:10687000F0A7E559C7017E2B6E8473B47998E1D6F1
-:10688000CEF3D2C121EE162CFD42CFE708067F7C65
-:106890008B8BBD87146E1189FB6288C3A3020B70BA
-:1068A000BFE5C7F7BBD5DA18C6D5A9CD4EB9258047
-:1068B0007176184FB786120CDE1F3ACAF94F8BABB0
-:1068C000A306C505B04FBBD13520815F79B518ABA4
-:1068D000839F4ED3CE659C8E68783C85DFF16C4DEE
-:1068E000723C31D48B6759EF90509655BD3A5B8618
-:1068F000FE8E713DF98BC71F9260FDF9F0B177BE36
-:10690000087278C373760257F38E3DEE2749DC3F59
-:10691000242490F3157BEC96EF48508C61FF37FCF4
-:10692000C88F7A71C593CEC462DA7EC533EF4E2725
-:10693000549E8E350F1E1C0FF87B4C60E785EAC015
-:1069400074589F5688E49B56EF8EB97399BC7FF0BC
-:10695000536F03D04FD8DD7F35F6DB77A543FF2E8D
-:106960003EC965EB0FADC7E2261F1512932DF487C4
-:10697000B61FFAE0511657B2E2594702428257EC6D
-:10698000DE2145291CAB777F84FC72E98F9EC8010C
-:106990003CAC7ED66EB0236EF8D127ED17523ADFAD
-:1069A0006027838B418EED27317F3CEC1AB4A35CCA
-:1069B000B3F89455A80268BDA77EBFE0D7B4FCFD2C
-:1069C000A09D4088EBFB877F273D07F9A88F5A6E73
-:1069D000D0BF91AF57EF7E57C2DF31B291C1E2CF46
-:1069E000C3F987D14E32D7276450023DB5BAAFF311
-:1069F000233BE5B7D57B3E7C13F86EB5493EDE8779
-:106A00007F148EB4CF2B734DF6F9EE82ACECA31B42
-:106A10009E38FE00F8233E78F28F0FC03DDA95A72E
-:106A20003E7EE07B1017F66F6E19E47BF563AFE6F0
-:106A3000109DFEBF2C97AD9BC71E7D64D7563AFFB5
-:106A4000636F38115BC7F6FEBE04FC3FC77EFCD700
-:106A5000B1E00FBA65EF7CFCDD9A5B9EBE745CA66C
-:106A60007511F835A1FF7D457E6EA43C2B80314920
-:106A7000C8CF786AA207E91D94605DFB8B4006BB16
-:106A8000F2E8F7BE4F24B0CF0E86C920E067FF9E24
-:106A9000770FDE4EF31F52FA382DE843E73FDE86CC
-:106AA000FA998A0D4D57EDF9F2972EAA82D4817684
-:106AB000F86A32887A73045D5FA174AD4AD1D55CFF
-:106AC0007E9C9C94E0DC60F5E3948ED3819E948E52
-:106AD000D347D2F143F8C79C91745C916B8C4B3ACD
-:106AE0004E566EDF0A857B0A2CCF79B57DD68D4F49
-:106AF0007F35A3FDA4E985D1F07C9DC0E09A9D1B64
-:106B0000BE3D17E4EBC91FECDA1A60745E4C1173DA
-:106B1000EC89E32584F2C91F1C8357031E06F73A4C
-:106B20006558DF57ECFD15CADBB1A75F92148C6F77
-:106B30002139C26C9A27C37F2F139A5F25B0CC8D61
-:106B40000FFFBF056FD2F637C2431E32D20FF307D5
-:106B5000A9FC213D1297D729A077136370DEAB12F1
-:106B60004C2E5625FABF02717D66BC3F956BD3F45F
-:106B7000FF305D216E6CD59E771600FFA5A3A7366A
-:106B80007F19E67F012D7FD828B769E594D3F7D820
-:106B90008E1312D807C9E724D946EDE1638E410967
-:106BA000D7C71FDBE59DA191744FE19FC71F9DE1F2
-:106BB0003EFC876639E7F8194DCE479FD799E16DBE
-:106BC0005BAEC2F65726FC7D70D25AFF3FCFF5C6AA
-:106BD0002A12AB2B9A3872FD1249441D5F9A82F734
-:106BE00003881FA3F07EF0981DF787ED7DFB518F82
-:106BF0009BF5C5AA3476F49BB9CC1E58F56CFF748E
-:106C0000D06B1FECFB29F2E5AAC7DF91C07F737040
-:106C1000F753D240454A0E607DD0FF0ECE073FECC1
-:106C20009F0EFA6B759A38C0DFF3F9ACFE99B1FF8D
-:106C3000D58F7F64E8FF06B54F423FD928E3BC2FCC
-:106C400086AF84F9BE7FD8012718E4FD3E7B9D9571
-:106C50009DF3025F1F353CB5FB67BF9E0BE75EF9F6
-:106C6000EC1DC6D6A6F0AFF0F77B5F72F0FD6DF8B5
-:106C700075B0675AF224BC8FD0EABF02FDF55A7F87
-:106C8000BD267CCA01B906F603F2BC48957E5FA515
-:106C9000C19F17B619E0BFC55F374EF1B1FD9942EC
-:106CA000F71FFF03B64D466E008000000000000095
-:106CB0001F8B080000000000000BD57C0B7C54D516
-:106CC000B5F73A73CE3CC24C2627AFC9D37892F0C1
-:106CD00094804312DEB40E0491226A505AA9F5AB97
-:106CE00003F28821C9A4F8E25ABFCB8444F4029F7E
-:106CF0008D95166A693B70A152217690A0B10DDC8A
-:106D0000012C06056F105F78B18D5A152B24631482
-:106D1000B4575BEF5A6B9FC3CC9C4C84DEFBFBBE2D
-:106D2000DFEF0BBF76BBCFD9679FB5D7FAAFD7DE02
-:106D3000EB0C28DEDCEA5400D93D6B366461AB5ABB
-:106D4000D41409E02BFABB2AD6028400C603585D8E
-:106D5000D5E07761AB5A407300FF7D45FFA7785BB4
-:106D60007BF0F97BE5D4D6B5348FB5F157D48726BF
-:106D700005B657F2B0914A25DDBFC2BBB61860A375
-:106D8000F39F1FA7FB2B8376D58E6D73EA3DBFA5BE
-:106D9000FE0609AA65EAD3F3383E6875A8DB55BC40
-:106DA0009E0E0BC265317AF25424321BA00CE9A06E
-:106DB00016FFFC3001DF2B488266A8031C0129590D
-:106DC000A120B5C6730FAAFE62757CAC2FBBBAC1F9
-:106DD0008FF35E2DBB2CB4FE07732D217B31B537AD
-:106DE000A641D9403E18ED03ABAA213262F0FBADBB
-:106DF000D98E855B80E90E5A681D9223B49D08F1F7
-:106E000081A67A8069030DFF873C74C4D18D037C11
-:106E1000B40E45BF6FC565D14D3B04B94D213960F6
-:106E2000EB84084029D2AD96B05C52A1479F240A5A
-:106E3000D563006E4CF57F93D6993BB451A2EB1EFF
-:106E4000A8E6B612FC12DDB738EBF2FC5FB33E5891
-:106E5000A09CE919A9CB175FB1C12AF8AF28A00CF3
-:106E600029273A36ABEF8FC679E87E268D0AB21C09
-:106E7000C6557D67740BC181888FE3F32333676444
-:106E8000126E8C71CD8EA29312F2DB27A7A8294532
-:106E9000D8579033C4A753A9CCA71F4DC399F1FE6F
-:106EA0008F4FA56E95511E8F48024F41C213E10AC4
-:106EB0001A1F277CB8113F6BE9B9198DBF65BC5803
-:106EC000A0BAB952E7A487F827FE106F8CA7958A5D
-:106ED00043B57B89B73E4DA1796C105A2B11BD7E0D
-:106EE000E6A7035AB91D02616E5DD0CDED5DC4E722
-:106EF0006C928397FB69D0D33A149F9BA356D7AA71
-:106F000078FDC7B333245A9F0B549DBF8579D41F96
-:106F100094BF3391BF8E187FEDC44FE7407E3A4057
-:106F2000653EA47BC1BB761CCF0B115CC723D3216C
-:106F30002433885450112F39FA3A33C127117D84F4
-:106F40001F5A5FF602B13EF3FB72A195C7E5439865
-:106F5000DB42E8E636C3A14A0AD3734A97EF3BF017
-:106F60009533468FD1DA09C138FFB9429CBF98B931
-:106F7000ED963CB47EE3AF9A71F887CA83BE2A1CB3
-:106F8000A7F85D3E3B2EE5FF54CE201082F572053A
-:106F900048AEAE9E8573C18DC3BD36888CA4D9839F
-:106FA0004C5FCA48D137EC8B1D051531E8C7E7ACFB
-:106FB000A73E3C45CF59216E1CD121DF9A467C7FEC
-:106FC000982E4C1EC8F795A79AB29E8B9B77AB9ACA
-:106FD0009A45EB848930F12B39F63C4CCA40233377
-:106FE000F0F9CF5605B39EB3C6F8D0E2F867C6A550
-:106FF0000F019CF24DEC138EB36238465CB29D0BD0
-:10700000AEB6ABCD598C43C6E94A64901DDBCF5276
-:107010008A42BC7E689C7823DA618BC3274978BD9D
-:107020004E7587883FF5AEF02CB61326BB317DBE7A
-:107030001AC9C7717D8DE025BE6EDC73C369E26B32
-:107040009F07347BBAC0856F02D909C38E8026A3FF
-:107050007CD748E31C12B6F5ED1FBFF47B1C9FD212
-:1070600029838CF7FB70CDDDB46EC5974E4274C298
-:10707000FA04FD6E7608FD31D669D6D77F749D2857
-:10708000799E9FE52093FD5DFF2FF47C3FA4B6D24F
-:10709000F84D0ABE9AE6EFB286B6231F561C911928
-:1070A0006F2BDAA410909C152D8DFAF7BE2883C0A3
-:1070B0001FF0FD7B7F55CA789461F48FA6E1F381C0
-:1070C000CD562F5A4C48F725FAABCCD943408BC349
-:1070D00001047D2FE722BF16EBFCDAE87C780BD1A8
-:1070E000B3A949F8A7ECEA8C84F19FA55C6F5B8A91
-:1070F000F36B7948D714C24DE7F035D85F5E20AB0B
-:10710000329A889C05F989FEB1D5FA0EE99F86FF6F
-:1071100008DF86FD5A4AF68BEC907C3FFBBF73205C
-:10712000FC9F02C2FF35A0BD8AE07CCB3689E78D8B
-:10713000F96A3A1F595380ED1DA1C4EBCB4189F583
-:10714000D9CFBA47921D580943BC766920FE2DE974
-:10715000887F02890B5C420E2E2FD997FE5764AFB1
-:107160005DB082F595F84E7644EE19B1711ACE17DE
-:10717000E8B24248237989FBFD9BE550B038A61F51
-:10718000FD5D7B981FCBF2901F884F7B6E22FF53D3
-:10719000B444FE3B47667CAD3C52BD267ECA739923
-:1071A000FFC86FA0F9D32695243EAFF37B24FE13CE
-:1071B000FCF6319D4B3B24784C223EAF3F5CA00D4A
-:1071C000E46B43C72336D2FF8BF1D5CCC7D1E9BAE4
-:1071D0001DD1F9780E3A0FE8A8AC7678D894F03A39
-:1071E00014B5753AE1B410F5967062D66B837FD60C
-:1071F0002CD567C37197D1385C5FBE232C94D10B1B
-:10720000CA09C2CB2261779B551FFB23C3DE3A2FED
-:10721000D8ED77E12B6CB3E6553E4438BA534A6D4E
-:10722000952B07EAEDBA31F7B0FD2A5C8DF698FD93
-:107230006A629C165EE5F02E467A9E5C05DEC5C34A
-:10724000009E5AA5726B8EDF0C7DDF8CF19B5DF882
-:10725000679E5741FCAE55C9FE7855A2F3611BB03D
-:107260009EF69541682BBE3F1CF9D4A391BD2E8F8D
-:107270005E5F8DF145600954539CF1AF1922AE7BDE
-:10728000466F6765D8B85D5B6D011FBEA7B7530E2B
-:1072900049485FAFEA3B7215D99D4EABC6F1951ACE
-:1072A0007DE97B7CBF425D8BFCCCB3B48EA3F7E25F
-:1072B000F8D9219CB7AFF35DF7ED717EB9B7E3D193
-:1072C000511407FDCC0235E124F1D0F2740BC73123
-:1072D000BD23DFF1E0B2A1DE11B501E2E9C19EC636
-:1072E0006A8AA7EE746A4C97AD7D7AA480F1338FD9
-:1072F000E3E3E7960E61BCED3D0321D2BB59F2AD4D
-:10730000D78EC1FEE45715AF9D95CA77FDC2093CE3
-:1073100084E5BEE1CB8A4DC4BF00F273355F6C3D9E
-:1073200041F27AF6CF0A90DE55363EFDAE1FD77990
-:107330003817D1300960822F5C11C151333BD3A77C
-:10734000937E074E01EBEBF86E2501B720D71D2A7F
-:1073500020BBF286080F27BE61BA0F4199E2FFC930
-:107360003D89D7A75E04EFFF62D80D377808EF8F0D
-:10737000ADEA8077C92FEAFE331F17988C9F06BEAF
-:10738000F738673C922EE2769970EB55928F7F2703
-:1073900043C4F91BBE9425C2655F14BCAB915F7DED
-:1073A0008BF379DD7D9F524086ED97F2EC709278F9
-:1073B000EBD7E93696DFCF6C02F73F5BEA0A35E19F
-:1073C0007A0E2EADBDBC07DF77FE9FFC97AB5F1733
-:1073D00007A369B14C6279A511DFEF9CD722B11EDA
-:1073E000426B1EF1CD3CDED013436F0C7DC95B3A7E
-:1073F000C41F4AF29EE1B43EA46FC6D291928D7032
-:10740000BB5F029263EF6AA4EB6BE2C720AC2E2055
-:107410007A021D9FD8C85F3B3A255F28C9F8C3E9A7
-:107420006EE65FEFEA60D354E4D73D8BF059D20BA0
-:107430005B6B71B2F983B0A1008343684BD704EE54
-:107440001D701BE92528AD79E4B77B3BAABE4576C4
-:10745000FD31D4438A1B7E66F532DDC17A80EDC4EE
-:10746000160A3CB15F783D6C591B974776A74F3F92
-:10747000958EF39D4A5779DE4CBF5722BABD7FFBEC
-:10748000CC4DF3F77D6E67F9E5930EC7C56D9FA6EA
-:107490000BFEACC9F0BDC678A9C96263EAF5BBBDF5
-:1074A0008B2B00AEEC407EC7E13226B720AF3BC34A
-:1074B0001F647A32BA3171E2FCCBA751BC1CD08D6B
-:1074C0003344245026C4EC73A5A3305220F28770B5
-:1074D0000EF237A3E6C76CAF53D00E53280EDD89EA
-:1074E00079115B647C9E749FEC42B32AE2AC967483
-:1074F00061E75A1E5142CDF8DECD4A4FCA306C8B3F
-:107500007DDA0C45237B5FC6F3E6DE05ACDF16476C
-:1075100048223BE42CFD45FA85B86B2AC0EEBFC972
-:10752000CC7FB39C46EB7AB126C3FF05F1756C574F
-:10753000F420856FDE14C824B9CE925DBCEEC96715
-:1075400085FD31DB1B39F2AB9F91BDE9D3F3A72455
-:10755000F6E676F2AF86BD01B9EC10E167EA8B7A08
-:107560009AA9DB19CC3E980F138FFA9B5D49ECCB9F
-:1075700024A84E43165FD4BE98E588C1FE857E21BF
-:1075800032A3A20BF528EE79B33D2AC8D0FDAF6E29
-:107590008FCEC1B49CABB5185ECA577A0FD9E3F051
-:1075A00061D8A1185E428C33F37B24705CE8ABA5F4
-:1075B000643F8ECA696477A6A3DC71FE2E5D4FD24C
-:1075C0003F0D7D8BE4BFA1F39A14C2F5535D550EB8
-:1075D000529B15B9B2F6678C9F9503F383A0C385C0
-:1075E000EC9DF15E2B3834D748E28785F920ABD883
-:1075F0008F7B7F7FAB349BEC220A2D6DFE98C1ED13
-:10760000C18A5C1BBFE7A9AE9234C2910B30BF4563
-:10761000F955764A1C2798716DC67133BEC0C27980
-:107620006335C713B214D6F71D12F3D2E2E064F645
-:107630005377611E4E716B7F17FA2D6C9F423F4F3F
-:10764000714AB36B16AFDB58AF41DF5DA93372A04F
-:107650006CE0FA8D36F0B90CA1CCB8BE12B5118E23
-:10766000039FDB12AE1BFC1C8C0F063FA7103FA52F
-:10767000FF3E3FA76608B99AF9FA3F5D7FE18A4964
-:10768000906C5FE0FF97F54F05FFEF7B44BEF55A26
-:10769000AE27664F0A57CC9697211F26503CEE8D99
-:1076A000D90707FE237C8DED68657B3309ED0DC599
-:1076B00099057561B62F137345BE64B61B5776C224
-:1076C0004D641F2747302EBD04FBF129FD471EEFF7
-:1076D000E3FC3203E91EF7FC82E5BBF0D2580D3221
-:1076E000E7E27BC6762B5EF27BD09D99745FC0EC9F
-:1076F000378CB8D48847CDE38C78D4F0270D3A1F67
-:10770000FE3DC3FF64065D57D520E91BEA55F831FD
-:107710002FC35EA378A13BBD7A37DF1F190E721EFF
-:1077200050022AEDEBA0BE721C56E97045E4B1038D
-:10773000F5D369D2C330F285F609822E4B689834AE
-:10774000900E0CB78314F7E103FCFEA5BABF28C462
-:10775000312CB406E0F8BF702CF8C9EF1696638B95
-:10776000EB3CA6C7232F995AA4FB79E2AB5581A025
-:10777000BDFC1FA797482C2827FEF8FE40EB77CCCE
-:10778000F631FD052A78298E2F50C29217DF9F51BE
-:10779000A7491736910C3F8DF315CCD5D85F160C41
-:1077A000C53E8DA77827895C7A32ACBCCE7A47CFAC
-:1077B000611BF22130B771B6DB128BD3ED56BFAF30
-:1077C00080F68F3A44BC0EB4DF379EED9244EB5105
-:1077D0006608FE0454915FB94065BB59A9CBB1D28C
-:1077E0003197F777C827DA270F5CB7A4F97870FECE
-:1077F0007CD082936376D5C87F701AA0F798ED6A23
-:10780000DFBED72F0BA23EBEF5BF3F4905BCFF2709
-:10781000259A4AFC387DFF89541FF2E3ADFB45FEF3
-:10782000F27D537CA4640AB92ECEACFE82F87ADBDA
-:10783000AABF4D88B72FB0329BF5E28E904CC9F0AD
-:1078400005FD59BEC3C97BCF46BF3E9C99D037F4D6
-:10785000A0DE0E8DC9E2EA6999222FBA63D7161B02
-:10786000E5D18B33FDA999D83FADC77FA7DB53790D
-:107870003FC0A067D1AE7136E2F79F3AED106103C9
-:10788000D96D1572F65D2F4DA0CD7BF167A6F3F093
-:10789000FE021BED9F2F91202AF6B5E0F0CFB1FF3D
-:1078A0005EAE0C6BBD03D7B1E42DD56641F92C99C2
-:1078B0000ED120EAD5A2BBA435F7E2F8457E1745E4
-:1078C0007003D6B9309898E72FD3E395DB1FB29AAF
-:1078D000F2A4C6C3B45FB618E7A17C76496BE2FD9B
-:1078E000FEAE3B0FFF9CFC40878DFDC0B28BE44F8A
-:1078F000E332F57865024CFCAA94E295B21F9569D3
-:1079000083DB25235E39BD0A083CF097550E6ECF08
-:10791000AC52B9FD42B7D7CB3B0E1C665C2BDD13D6
-:10792000C8CF3ED5F5AEF3162DE637BEB9E5934385
-:107930003FC77E05ADB398EC65C44A78BC4AF71BD7
-:10794000CBF438A4E273B3DF38F087DF539E8DEBBE
-:10795000DFCE19D7A5C523B782F2693C1F0C3F6261
-:10796000E6477F57A99370323F33713FF67FCA973E
-:10797000C19EAB9711D749EC87A14F5F64087C2F5C
-:10798000DE366F4D3EBEBF79DF07453DC22EBD06D8
-:107990009E185ED1D033DE960144D7223EFD9DFF76
-:1079A0007498F87498F03689FA97F1FDDC2AC42FA0
-:1079B000EAEDB2CE0FDF84B1AC5FB9965C6A23B951
-:1079C000945F9A7168C69F196FBDD69E22B20F66EA
-:1079D0009CF54A89E76446BB34539C5F2CD67CB344
-:1079E00028DF45B7B646E5F508FB775A693DFC4305
-:1079F000D2DB6D12E787F5CFB43D4DF6A8F6B73F61
-:107A000071933DFA5069F5D0FBEAB63FE0F6915D1F
-:107A100052826E7AFEC390B04BE6F775EA7C34CEA4
-:107A2000052EF8A587A26BEE437E9C477D26FD6D53
-:107A300068FFEB9AFB28CFF039A294779E567A66BE
-:107A4000111D772C7435367929BF4D5C77EDE33FF6
-:107A5000F168BC7F1C2CD0F9C7F96AC336AB3782FA
-:107A6000F336BC227BE9350188F2FACCCF07C2EFAE
-:107A7000DAC87EAB1688164E1D781FC56823BD096F
-:107A8000B4AFFB5876532BE415203EC79D33D4E8A2
-:107A900076D88CE35D99FABE888E5FE40FEFA70677
-:107AA000912EDA3F8290B0C7CDBFD938F66DA4EFE2
-:107AB000CCB617DD5259FCB9C26A96477FF8F65F1B
-:107AC000392C83E3B757C77B2C6E09F1735A87248F
-:107AD0000E833A455B678DB8296FABDB62F506F123
-:107AE000725D9B0C0EF25F27ED1C37D4B57DC2F89A
-:107AF000AC937C51691C2FC32DC5C511CBDBDE9B1C
-:107B000045F676799E0C7351A56AF79C13E37D10B8
-:107B10004DC1F1CB77BF3DEB87D447BC3B92C8AB9F
-:107B20002A7CC026F4C624AFF0DBB3281E6EFECD3F
-:107B3000672C8F0FF74B90533CF0F99A2DEFD9C873
-:107B40009F9C41C164A60B7E91DF0884E585B6B495
-:107B500064F28B5CFFBB4ABECFFB7F1793E37A3A9C
-:107B60006B1BCF787FF2774847CD9B76EF5C7AEF3F
-:107B70009377BA0171F081D22870FF8B073CE487BC
-:107B80006BAC418FCAADB85EF3CBBB198FCB8EDF28
-:107B9000ED11F98D2F4FEC1705F3689D4B367F9B48
-:107BA000D7B914FC8CC79A5FC8D5B44F734E81D92E
-:107BB000BB93E84D659688B7ECF083B1F789F30085
-:107BC000A0FCFC037DDF34F8B2CC719B1D6E4C9B96
-:107BD00017B7FF64CF12F62A08A13FD2B96A00DDB9
-:107BE0002B9F831C3F378BE6B9AB5869A473225C8B
-:107BF0007F50E797F415EF0B80A6C4C55955C7AF62
-:107C0000CEA17D313BF4DBFE5725C7D51AC53D71AA
-:107C1000CF31DF3ED86A1F225D89AD27F9BEE9ED7D
-:107C20005986FEC3CB1087A7C08E0F184F80FE3B2E
-:107C30002D57F41F237D5CE46A4C43BE7DFACABB1A
-:107C4000363AD70AE27A8611BDDDEF711FBCD91A28
-:107C50008D37E60F74D863E781A4D7DBDE33E9758F
-:107C6000E27DF4DFCCCF00A46994B77D608BCE2297
-:107C70007F1EC4F7527DC1D20DF684F3C6185E4C48
-:107C8000E78BBA7E1AFB9CCB4CF198D19AEDC2954A
-:107C9000598976013667273D5F34E72175D6D0AF25
-:107CA000893F7527ED9CBFD4B509FDC3803A3A0CD6
-:107CB000F5E1A35D875EBB05D7F151D89A3597DF13
-:107CC00096686F6B9E42FDC5F132F23B85EDED6724
-:107CD0001C4F19FEE823175E1C93446FF17A52BDC6
-:107CE0007501DBB3FF577676D92076F6BB5903E2F0
-:107CF00084347C0DFCE589E597537C61E6AF615FD8
-:107D0000CD76F3934C2DA9DD04DDCF1B7CACDD7962
-:107D100096717B3E4F9C37356CFB2BFB31646BD4EB
-:107D20008EB86D087DCCFD07C88F71FFC07C696C73
-:107D3000B27527F2D37CFF32922DE723D1EF139F48
-:107D4000658BDB2BF6E7543ECF6F26BF49765A533F
-:107D500081E40833204C7187D4F9FC5FE97DE6BCEF
-:107D60002238034636F2B92EAC8BAFCF092B7A3DC1
-:107D70004530797D4EB32D769E4BF7073BCF7D5F27
-:107D8000B7575E97CAE508D62C4D4E5657E2ADB2AE
-:107D900024CD237E9225CE774AB3C5BA8F65097963
-:107DA000B4C8D5FA46A3C897680F95ED5FBA9BCFC4
-:107DB00083AD7A7D06CE9CCBE7074ECB27C812D881
-:107DC000BDA17A8E42FBC315963B4BB1DFB5E1F600
-:107DD000390AE2C73BD5B2A704FB2F6C582CFA57DF
-:107DE0005A2AAC08FDC7834BE6CCA47D03CBDB3F0E
-:107DF000A5F529AB15A0FA91D296F7B87F97559CB7
-:107E00005F353CBBB786DEDF20A12090FF2DEE70F2
-:107E100023D731E482BA9A368FB53D7EBABF260F9A
-:107E2000F379944724CDFFDB2CF22B8E885B2BA1BA
-:107E3000BCD2B7F17B785F79D94A3921AE53EC8354
-:107E40008FDE333597ECEEFF85F7FF5B56F6E0EFFC
-:107E50003FF3D4B50B68FC68195419E72B57B42AC3
-:107E6000EADB31BFA6BCCD9043B922F85EE6B27121
-:107E70003ED792EECB253C1D239C665F7ADBACD7C8
-:107E80000FC94E810339CDD2B81BDB5774F9BFAA95
-:107E9000F383FE685FA06F5FCE56AE5B816811C949
-:107EA0005796B7B6113FA24D0A6CA5FDD77D8FB787
-:107EB000113E5FB73978FFE8E6B4F5D62B90E4724F
-:107EC00047D19D04FE37A55D7753BB2FDBDF93259C
-:107ED000E68DD0BCB77C5F16F3BA1A53C97F820F08
-:107EE000F54AECD370FC0E7ED42BA2F920EAD538EB
-:107EF000320589754E663AE4B45D4CC7CD7641C70C
-:107F0000825049730FD231CE1EBA8CF22B7C7F94F3
-:107F1000E4700B865B84E760217491DC5EBFEDCA80
-:107F20002D627D85ACAFACFF7CFE7EE6499A2F804A
-:107F3000F3D3396A40EAE1FE1EC5A1065561DF1799
-:107F4000C6EDBB3D0BAD27CAC4FE7E33E51D53F520
-:107F5000BCD8D87F33EA0D2676F9AB5C64B0E54E29
-:107F600099ECCA398CD7C88E99F7DD269BECEFD4F3
-:107F70008E8FD82E5FEC3CD099ADDBE37CC8A77523
-:107F800084E93C90025EDD4F7AE93C3089FEC79D72
-:107F90000766660B397DED79E09DBABDD1A84E0E1E
-:107FA000D7D18F1393DCFA8F2E82F24AAE476884C2
-:107FB000F4C1FD6ABBC9FE1B381FF38A7A3BD9B3F3
-:107FC00031AFC06DB4DEABF5F393FED3C0F580E303
-:107FD0007A1C5C1F68EDB28642525C3DCA490BD7E1
-:107FE000A3F48337C4F52B41BB1A647B3996EB4F5E
-:107FF0005A4EEAE7BD7A3D438560D93F5C0F61AEDA
-:108000007F98E29E242FACE4F31990260DAC7F9864
-:1080100022DF2A935D81A3429E17EA20E43299D69B
-:10802000752E024029DA8457E2E48DFF9B9815945F
-:10803000B9FCE954E2F529265C98E57F6DB61EDFB0
-:10804000E8F21FB48EE443B1AF360EC6721D89D577
-:108050005C47F286850B366375241521D2B7094D2E
-:1080600062DFF862753CE63A1D731D4E9E3F914FEC
-:1080700005355724DCBFACB13CA17FF9CA2909E31F
-:108080008BD1A1C6F74B1F9A93307E58EB8D09FD1B
-:10809000119B6E49183F2AB428E1FEE81DB549EB53
-:1080A0005E0C9C8C09AF48B8BFD1F9E4BB84AF9695
-:1080B0003C59A578FECA8EFB4C7531D31817538CEA
-:1080C0007D785DFE465D1D9581119FC7A3FC1F2B2A
-:1080D000A6B8E9FE2A491B88036F24C87EFC1FC589
-:1080E000C17A931D30F4FF62FB373FD6FD849C526A
-:1080F00024519CE3C3B82A652AD5118B737B784B36
-:10810000D4AB7C96F2778E8B34C9ED856FD25B55FC
-:1081100089E2A07BAB348E83EE1D527480F60F7A19
-:108120007EE0F64AF903EB42CD75A0190EDF64E05C
-:10813000AD115107D982869EEC7F708683E38C87D0
-:108140002D96DBAAE3E87F225BD89F27B245BEF5D8
-:10815000735B7837D901C5016A539E789E8A1F8068
-:108160002A7B502EEE4C10F561F0C6DA9985E43F7B
-:108170007B466AE9543F8BFD6FE06525C4FEE496BB
-:108180006685F3BCD5CE27D99F942BC29F8C93854F
-:10819000DF403FD241F6F14DE97EAB88B382569283
-:1081A0004F810382EE72F6AF7C4E9C0E59D28A321A
-:1081B000AA4FBDE0B7B4AF104C876AA75A884FFDED
-:1081C0008B653E0F7E8948427AFB6B46719D73FF3B
-:1081D00085FA3F2D8DF2EBFEC58F9EBDBB32A69773
-:1081E000276DC9F3BC8BEDBBD56C793495CE514E60
-:1081F0008E8484FA8C37B3457EF866B62CEA0C423E
-:10820000EF79884D7D4BBE184E4407A4EE352E1CE9
-:10821000F2E0A61F54935C6CEDF382B4AF69ECE31B
-:108220005FC8033BA773FDB6912FDDFCBAD8D7BB5F
-:10823000F98BC47DEB8FB2C5B9C047F43E6CCBBBA4
-:10824000FCE3496E379042F0BEB27F3CC507D52AA9
-:1082500068E4F717F817DE7D14FBF3D64B1CEFD359
-:108260007D1A7F23CA90EE9F00EFAB7B91BECFB308
-:10827000053DF3A1DA4A74BEF6FDFA54C2D3EBE928
-:10828000627C54026D6BDC7C37E8F3BDFEFDE57B60
-:10829000294FA7F7D1FB891E7AFF3C154AA8FF1A80
-:1082A000F8CFBE5A3CF0BD3781CFAAD77B59C94F12
-:1082B0009642A8ED69B2AB472CDEB5C06D2493FDA4
-:1082C000929DFD525F53F4C97B90CE3FD5FE75AFB2
-:1082D000847CFDE3C2E8AF9FC6EBDFDD248386B874
-:1082E000F838C32F7BE2EAB44F2EFE2495F889F1CB
-:1082F000CAF69F92DEEDB47BA9AEE3CDDA9DC3E36F
-:10830000E3FA54CF74073D07932EED3CADEA89C9DB
-:108310008CBF15DB05FE56FC66440EE16C45EA0594
-:10832000DC89FEF6523E279D2041D2FC783FE24D8B
-:108330001BC17535A021CEF67F2EEACAF71CCDA849
-:1083400020FA14F05F16BF9E3D2FDD329AEB79DFE5
-:10835000C8BA243A496783687F6F665389F181AE52
-:10836000270B3A332BF478729487E2B9DFFFE6ECFF
-:108370007F105FF6EDDCFE43D6914BE3C3C03A5A63
-:108380007527DB27230FA3BA57CAD30E59D84F5EE0
-:108390002DDFCF7918D56970DE35A488C7A3C15108
-:1083A000ADC2BE89EF24300E6EF672BD27EBEB4AEC
-:1083B00055C42D469E245BBCB98AF8C8E0C5A93CCB
-:1083C0007F09D0FE989B122BC35E611CE1962DBAEB
-:1083D000BD029F03F3D3D1BA3D9BE5F15EDB22CE14
-:1083E0006B12E24FEC57ED4A127756E33F8E3B3764
-:1083F000FB9B53D82F6D96CB28EEF03922E4C7CDE6
-:1084000071E75458CFFB0003E2CFE7FE7249F1E772
-:10841000F73CFF3DBFB3D4A3B1FD098F14762E1CEA
-:1084200019C2790EFE55907E0DA5BD003A07CD13F9
-:10843000AD4DEA1DE940FDACF594AF7B681AC2650D
-:10844000A8E00FF551A450AA7D72E82B8A03BB1552
-:10845000965FFF73577CED772495A887E4EC23871C
-:10846000A770BD735F97D08FB60CEDDFA7529E81CA
-:1084700071E656243145E9B1A52759CFD3647F5120
-:108480001FC21E9147393AC4B9A843F301D99714C2
-:10849000551D4789B9317EB147D8DDFAC36F16D96A
-:1084A000503E672D47DD74BE52B7F729372E179A15
-:1084B00033FD0F90FE2C3FF9F20495EBDCB614511E
-:1084C000FE1D8EBC3C83E3B3D9C8DA7183AF27B0FD
-:1084D000A9823E4280864D99DC8EA27D15BC14880F
-:1084E0008875F676346724DB1F08FCDB5B0769BD03
-:1084F0003B8FA570DCB233BB9BF520380F603BF29D
-:10850000FB89CF47F37C0830A6E38A6A4D227FFFC0
-:108510000B7D3D3BF5FCB2F77399C719F38EE998D3
-:108520002EAB88ABB248EB41AEE3EAB46B24DF94E8
-:108530006D20F8D399C2756181FDD788BC335D9CED
-:1085400047B70D89FE91DE13DD67D7A84E35456D1F
-:10855000850C9CBFCD26FCEC2804FE53AED875E3F9
-:108560007D299D1BF92308C405D7E3A528ADF00D8F
-:10857000573CFF5399DEFD1E11EFB40D89585CE4A2
-:10858000273057DACA74C5E8047EAF41E7288E8BDE
-:10859000DB6CD1F769BF1DE9520917A340D0099DD3
-:1085A00023348A57525471AE9EA26ADEA03490AE34
-:1085B000C058086170000FAF860B7ACE7584436295
-:1085C0007D07EA425B891EC70417AF9B392DAE4F6A
-:1085D000866C52ECF9139E65EB5A0A695DC20F2A4C
-:1085E0004A98CFC7DD0B40A5F3EF14C5C77952CA2F
-:1085F0007CD09A505E4E878FEF7B708EA6C9DC8F41
-:1086000010FD2ADDA77D9B34D53907E94EFB328D5D
-:108610009F6BE8B672DD79DDDF6F4A2BC3F59DB144
-:108620001CBC6717B61F2D0C0FA773DA0969FEB7BC
-:10863000C81E3F736AD1BA3138FE2F6D56EF5CB257
-:108640004B3DC11FD3B97DED13568DFCE2836FF412
-:1086500047BE22F93E2BB15DECB38AFBD8D79AF026
-:108660007E43E707363AD7BAA6E36D1BED7FAFCC62
-:10867000F1BF4F7A30A9A3A98AF836195A9B699F8E
-:1086800013ED21D74B847385BDE87F65F8D6A638F6
-:108690003EBB72F47DEFA8FF72D29B4E5D3FF75355
-:1086A0007C84ED5E3D4EDB7BE0BBA55ADCF96910B6
-:1086B0000EF27EE06A788EEB3A8DEB7D216536E135
-:1086C00068F46B8EDB7C7138B3E5087DB7E9EFFBAE
-:1086D000798EFF4BD6DB03EFD8DCB8FEC09FC345D5
-:1086E000E4AFC218CF7D5D1D69C0A42F17EA8E4E7E
-:1086F00003DB919DAF7570FCBDF33E359DF41EE923
-:108700008734ECEFC5F882F4686FB1D0BBA657CFC1
-:108710008FA5FDE2F3FB965F4EFCEAF5580D7CCF8A
-:1087200018427AB41BD88E197A58467A28D1F77B2A
-:1087300062BFA78CF04D7A67EB9EC37AB7D702A4CD
-:1087400077886FC63BE25BA538A44C45BCF3F323A6
-:10875000588FDBBA5FBE82EBD991BDC3C651DFC271
-:10876000F86A8BCC0949F87CA53572909EAFC4F7A6
-:10877000376931BDAC9412EB7A167B449DAC611F16
-:108780007FA0EB6778A496E6C5F14E594EC07F9C5A
-:108790009F147DDD8FDEBBF127EB36A0BE94FA2A55
-:1087A0002C1328DE3926B31FD8AFC7C92BFE30E5FE
-:1087B000865DE23AFBCF888E8B837ADCFCDCAA5C98
-:1087C000EE935FD0502EE3B1F55550BD7763156D34
-:1087D000C54D9ADD7A88DA29D5E12A3A2E9CB6A0D1
-:1087E000FB90F8C6CD379AF0D67EF05BA3B94EFA6F
-:1087F000A41DE83BCEF6FF8CFEF1095CFF3DFB912A
-:10880000DF90342E61BCA1C766FC0D86933EA9E7BC
-:10881000FAA96897AFDBF8EB6B1574E80D04045CFC
-:10882000FF9C8DDBD605D1079EC8F15D9783F8FBD1
-:1088300022D77F5D0EF2ADEFF87F7AC89FEC7DE521
-:108840001D37F9E1769B6F34E1AABD04F3882478E3
-:108850009C926365FF5A3948BD49638EC8B7860745
-:10886000611DE1A5A15D5643E4A77DDDD793DF78C7
-:108870001F5949FBDA4BA707DD942FD5EC3DC47592
-:10888000FA463EBD04F43FF9D659C4FF73B9223FFE
-:108890005EBAC19A90DF8E80888DCE91037E576339
-:1088A000044552638A3BEEE8D8C2DF8DD46E4B7C20
-:1088B000AE8EE2148450DD45F2E3C61C7D9FA41405
-:1088C0004A294E41DCF03E49F455D9BB15B8BEAA41
-:1088D0008BEAAB765A049F9C0E6849CB88C52B2344
-:1088E000F27C4BC8DE2D31FC875EAF146D93F87BB4
-:1088F0008A513B44BE3CE5B4B685BF930AFAB84EF4
-:10890000AF860840BAA728415EFF94DC5208E2FA1D
-:1089100027A179267D59DA2985989FFA772F0AFEB3
-:1089200013FB459B65FECE6FB30499C5346F94F974
-:1089300053ABEF1F2EDF91787E51B7E9F8610A95AE
-:10894000EAC3A6F3209D3FE6F39DA7E83F929CEF84
-:10895000FC24478FE78AA028E1BBBCAE4BFB2EEF7F
-:10896000238A075C74F8080971F91E1D470DFABACD
-:10897000EB42B258378A82EAA36FD76112002FF315
-:10898000A91E71423880F542DE463D632D54DBA8B6
-:108990008EACBEBDE9309DBF2DD5E35A339E90A16C
-:1089A000CCAF657ADD50CDE6C4FBB53A5F6A4D7C4D
-:1089B00069F04B26FA44DC7DA9F4A1E5FA0EE1A0AA
-:1089C000769795EBB9CFC1AD5C7F55DFBE85E95990
-:1089D000AACB6F20BD415ECF325C0FE9D3A5D26B2D
-:1089E00096DF3103E757C01509F29B9D7949F22BB9
-:1089F000057539ADAFBF4BE4B5FD5D25BC2F61E01A
-:108A0000C5FCFC2C3D8EBE66938837CF7654392941
-:108A10001EE83BAA7825C47DC5B14FDDF4FD4DF9B4
-:108A20003E19E89CB4AFB3625D10EDE59EAEA13790
-:108A300069E807CA8F29EC372A8E9587528AA95F81
-:108A4000EE2CE53A132D93F2009C87FD70DFD1A147
-:108A500027CA384E9F5949296AD3D17227C50B7B43
-:108A600040EC6F48C72A337BE2FCCA7B3962BF61A6
-:108A70004DEEBB0F939DBA66B795F783AFB1465FD6
-:108A8000A23C6C4F97E26DC27EDDB145AB5348DE30
-:108A9000BF91BC14761FEE5E9145E735F59D56D526
-:108AA000CEF4DE7D90EE077749DE61383EB0EFEA26
-:108AB000D16DB44FB4A5C24BEC35DE579EAE3D4AE6
-:108AC000F5AE90E7E4BCFD9ACBACEC5FCFE43BFFA6
-:108AD000752EAEABD6B76516D9E133BFDBC37515BE
-:108AE0007D6D12E44AB48F7CE849AAF739F3F4713A
-:108AF0001B9D0757B51FE7BA8DC1FCC1D910E28E87
-:108B0000F3F6561BE537F55B8C7E0F7F8F52ADC7B2
-:108B1000510DDBDEE67E2DE50184C7CD7248C3FF33
-:108B20003CB4EF193E1F6ED825EA3E2EDCDF26F15D
-:108B30007D03EF8B74BBB51C34C6FB7203EF7A7DEB
-:108B40009481F7733097EBB496EF7A84F1BD44C704
-:108B5000B7B96E0A2DB0AD2C4BE82BEDB799BFFF1E
-:108B6000BB43C7F71D17C1F7A85C1DDFA36014E165
-:108B7000FBFC74514F77FEF81027CD7FFE08EFBE47
-:108B80007E1DCED9EF1ED5E382FE88C567BB323687
-:108B9000AEB7E313FE0E3170B4DF467527B33A3F2C
-:108BA0006679CCED3C3093F87D1DF8EB887FD77566
-:108BB0003A558A83E7F6087B36A7D3CEE713D74129
-:108BC000B885E4DCB7FFF1960CC2CDAF056E0C3B67
-:108BD000B74CE7EBB5653F9845F97BADEE0FFBBBB6
-:108BE000EE9CC576671C1453BC3747FFCE7B4E58AE
-:108BF000B7439B13F94EE7D424B7864E3BD79B5C13
-:108C00000B3D36F267D7EAFED3EC27FBF29C2CE74C
-:108C100020FAAB6138BE6E97A98E52E9617AFA3BB1
-:108C20006C7CDED560F2BFD372AD09F51783E1D35A
-:108C30002CAFDB72757FA2CB6B6E54D431CC7945EF
-:108C4000F6D2F94357647519C50B06DFCCF2EAD2A8
-:108C50004AD3BEEEF7125ED2E37CA37F83FEFD5BB8
-:108C6000586D75C5E7EDCFE75AF473CED04F2B7032
-:108C70009D7749D04D38C4FCE6867229697EB332AF
-:108C800017C73F5F78FBFA71F1F98D6FCB708AF7E8
-:108C90001E44BB5251C9F53BDD7C5EA8B4CEA57322
-:108CA000B0C02EAB97F29A4087CCF14060973D64FC
-:108CB000C179AF211C215DD59DD2D58423CC1B5A0F
-:108CC00072D13ECDA32D651C37AF03E3117C6EDE60
-:108CD000CC8F197F47868A75F72B5A4EB23CC2C893
-:108CE0001F1A3E17F1AA71BD01ED008D6FD0BF4B69
-:108CF0006B3FF8D7A2E2543AB7FDAC6821C5A9B9D9
-:108D0000227F31E2D528C6AB257ABC4275174B8548
-:108D1000E860E973F7D9C87E1DA61FB6A0FA49D549
-:108D2000BF86F261D50F8D3FA240436A613D6A2044
-:108D30009D221CEE95C4FECDB356AA0D81A6978741
-:108D4000705D60EF6BE21CCAACEFBD8BBAD95E9C64
-:108D50005FE86A24BC2D2FDBB206230C18BDFF751B
-:108D6000B637A37F67532D6A6C5D4DF4DD1DE7694F
-:108D70002D09F1726F47B38DF7A1E3BF1B2E1918B0
-:108D80001FD55F641FEB79935D41FA39DEED3B221D
-:108D9000ABB42F847CFC657E3CBFF478A8FD600AF0
-:108DA000FBAFBEE3AE10C5FD7FD1F17846DF976F14
-:108DB0009A24333F2C93453B7AFF3325245F9287D7
-:108DC0001FEDFDCEFDCF5CE1E37DF490A823DE91A5
-:108DD00058875D1F4EACB336F81AD0F98A740DA7C8
-:108DE000EF950DBAF62A3D6E6F123D92A4832C2F9B
-:108DF0008B9498E7069E95ABE3EB48713DB791DD08
-:108E00003B69E88B12F5901F7E2B5763DC34750AA3
-:108E1000F95AF68916DFFF1DB15F63E5F70FB83F1A
-:108E2000235847F7CF173BB9BE013E0FCEA5FE3DF5
-:108E300025E2F703EE79B97644FC3E1D48221F0F68
-:108E400058A35CEF17386E61FA02C7FB3D435D64BF
-:108E500017B7CCA43ADA6B757B71B8C45943380F95
-:108E6000D27B7362F32CC915E71B40EBCD8D7D5F80
-:108E700069AC7735DCC87C58ADE3EA3FF4BC1EF33F
-:108E8000A8F3B949F2A8C1E2DF0B74EBF1D3F9E919
-:108E9000DA89EF210ECA8F2841CAD7F7BC91122276
-:108EA000FFDFB46FD99F281F0EBC69078A43EED934
-:108EB000BF6C04D7E1FBFD57923D39BFFF8E2BB944
-:108EC0008E5112DF970689BE5C8AA75EF5509C54CE
-:108ED000BFEF55AE73ACDF3BFE518A9F305EBA9652
-:108EE000AE631CC3F82B3F56C9F8DB73B432B3949E
-:108EF0000807AF93E6AD3FA270DD63FD91CA17E7A7
-:108F0000525C736C06C74F46BC5441F938C54F4795
-:108F10008626C44FA979827F7D075278FF4382124B
-:108F2000811F189A809FBAF63F709C5187F62E1EBB
-:108F300047C673C5790ACF332C4FC74F58F2313E1D
-:108F4000768BB6AE630FAF6FB935CCF26EDA6515BE
-:108F5000F7DB446BD44907212348FC78912EA11CF0
-:108F6000E6D84285946FBE502CF20DB33C9EC813D8
-:108F7000E7852F9C14DF19BF30DD3F22D9F7C641AA
-:108F80009821F27049E777BB7576B2EF7977E4897B
-:108F9000FD097726249C4B1AEDA379425FE6D8C4DD
-:108FA0003E95F9BE3FCFF03FB08ECE634ECCB5AA12
-:108FB000C6EFB7E4A1DDBD1E8C3FEFABF3B3E89C79
-:108FC0004BE4D5003D33C91E7E9BF6F929FE9A2459
-:108FD000FCBAB1CF3F6F333C20F6F96FB5925D30EC
-:108FE000EA4BE6F9CCF157F5D534CF8DE8DF699E31
-:108FF0009B6627DEFFF645E2AE0579BA1F1F0EC35A
-:10900000455EE172923F38D76555655E476868B244
-:10901000EF0B0DFB737895383FEA42BB486DD3A840
-:10902000D779DFEA8503279F4C67BB9A0225C8E200
-:10903000ABBEFC9327D93C4D17F4757E02FE0C792C
-:109040009DA53CA06CA0BCEECCB3E8DF259DB1F1A2
-:10905000F926343E649107FF2EA969D4672DA44FE9
-:1090600067F5EF5E90BE227B9CDD3F9BF731DFBF53
-:109070006706448378FFC0283BFBBFFA99129F1F05
-:10908000D447843FAC9F2FFCE1F0F6792C97EFA0FA
-:109090005C7C5E3613AF515DAE21EFABBEEC9B69DD
-:1090A000E493748ED34438673B9DC56D7DFBDB2D07
-:1090B0007C5E897E97E2C21B2625CA6D04F81FC814
-:1090C000C6FB37CF96BCE84106C8FDE65BE7B1DCDE
-:1090D0006FD2BF8FB998DC7F9BE7FF691EE97D7770
-:1090E000FF77C6208B5E18F54111F9D7864170BD18
-:1090F00055E72F0C8D3E4DE765DE0BE7E97F7F3AA4
-:10910000FE3CBDC4E3DF924776D5F2A5FB0AA0F989
-:109110007A7EB942223901EBC5607AB5439F7F4719
-:109120009E2ADE9325CE8746E9FD17ACA142FE9E1E
-:10913000A2ECD2CE019B9E7D7E2CD9B9DE0347C620
-:10914000DAE2E47A6605DA07F237FB0EF1F78731E7
-:10915000DC5974DC29DC4AD28DBA1F4DC4E119C236
-:1091600021D9E7DD87AEA7FCF16CFB4D599216E7DC
-:1091700067F79E700F8B9BF7ACFEBB1898B70DFF7F
-:10918000766A3C9D0F309D67C3623ED4FFE1378D08
-:1091900089BFDF6C7C67C7787E7064239FD31B78A0
-:1091A0005640E0D9F83D8C0BDF55DA80BF7B0CEEE2
-:1091B000B7737D459F355A941EA72F1F1A72449886
-:1091C0001566312BB9DE75226CA8E273024CDED72E
-:1091D0004DA6CFEFC2B2A80F6DE4BAC5698DE025E8
-:1091E000DC4AB099FB13668BF3F229D02D135DDFB7
-:1091F0008428B73E50156A67508519B6931C61994B
-:10920000C2ADB6F6834EC257C4A3A4BFEF10A5A744
-:10921000C9E4175BBF02EF1B78C5C1180425FD4EDA
-:109220003F2B5FD87FAF53E863F4ACF8DD936F401A
-:109230000FD33F55E9667A53352D83CE4B763FB732
-:1092400042A6FA97FDA04549CFBC998DBCFF169D5B
-:109250000EE1ADE9B1F54EA2F5AAB1FE940560A10B
-:10926000F54AB04BACBF1132E87C6C3244F83D5744
-:1092700011C1B8DEE9A029D4B7E517EB7C16F95B7C
-:10928000959EBF591C41AEFB49CD17B8762A2139AE
-:10929000AF92B7B6C38FD0F94CA958E744BCCEE71C
-:1092A000388D82EE0BFE3A5FD8BB29106639430D2C
-:1092B000A82FF28F2BCC54895F52C463A1DF13BB5C
-:1092C00054BEF67980E977DF1EEDFD6165ECDCCBFD
-:1092D000DB99C3F5D0EB254B5426BA1C85A21E3A68
-:1092E0000261FE2E3392F87B67C5F9375E9E4F7E92
-:1092F000CF2FBEC335D775EE086DE5BA9B05416427
-:109300000FCD530870DA13AB03B09684F8BE95CE38
-:10931000D955AE33ADA07C715FB6FFF2FC6CAE37B1
-:109320001DC69329A1F1D5A931BC2365FCFB3B4E99
-:10933000486D257BD4ACD7D30655B75ECF54C4EB6C
-:10934000D0D0CEF38F4828A2AEFBDE2A517F7AEF31
-:1093500090FD5CE7DB23812A15D0F9FF7EAE03A6E2
-:109360001F86B3167CCDF97F96FEBB0F25FE3726F0
-:1093700096EA461E9F6B3E95CAF5AFCA0C9F46758E
-:10938000BCE67AF1D296F10FF5705E6AD06BAA1343
-:1093900057BC7CFF5EDDBE363BC4EF0049ABEDAA97
-:1093A000348DBE7F5FC1BF63D54CA141257DF7BE23
-:1093B000829FA73A662A02ED4DF3DF44FC32FF2E6E
-:1093C00015C2ABFF059A376D38EFF72593C73443C5
-:1093D0001E9681755228875B49BE46DDAD516F4BA5
-:1093E00080A0753B7DE277F054C409FFEE1F42C9AF
-:1093F0004EB8F4997FCF43D4FFB6E8FC47BA7670F5
-:10940000DDA7437CA76D7CCF6BE69B81DFFF02B9B4
-:10941000D77EA250530000000000000000000000B2
-:109420001F8B080000000000000B9B25C3C0F0A3A9
-:109430001E8145A551F9E8F81C9A3C0B0303C34F64
-:10944000205ECC835F1F2E1CCB82607B893330185B
-:109450008B32309800F12C209E0DC43F81D8508C67
-:1094600081C108888B81EC1220F6056247A0DA2FB3
-:109470001C0C0C13851918E600F1726154735F30EF
-:109480004268252E060653206664C66E3FA73AD072
-:109490005E5D04FF23906D6F409E5F46F1D0C35523
-:1094A0004EA8FC7C6B54FE2C5B0606666704BFC0AE
-:1094B0009A34F3ED817A1D9C71CB77BAA3F21B3DF0
-:1094C00051F97FDC50F935E1101A008D579524B819
-:1094D00003000000000000001F8B080000000000D7
-:1094E000000BED7D7D9C14D595E8A9AEEAEAEACFA4
-:1094F000A9197AA04706A8611A19E3A0050C30281B
-:1095000048CDA0384693349890D1D5BC168821090F
-:10951000CFD7F1ED2A1AC9F47CCFC0800DB2067DF9
-:10952000515B0C89262621899B3559B3698DC92346
-:10953000D96C168D9B47B2B86F243C379F9B79EE50
-:1095400043FABD90B0F79C7B6BA6ABA6BF00DDE4F1
-:109550008F37FCCCCDA9BA1FE79C7BEEB9E79C7B8B
-:10956000EAB6EAF1437C1EC059FC5B03F0A6170083
-:10957000964D95E94E33076DACFC1C98FDECD1A5DA
-:109580007AAE5362E5A2D0B84732002E8F66003C17
-:1095900000F1C38F8287D51B695461671380DFD8C0
-:1095A0005003A1A97EDD657F0F406E61E9F7F20BE4
-:1095B000A33123CCFA7B6A79B7C5FA19F9727BB764
-:1095C000D53AF5BE010765F8CD07864D3DC0E09C54
-:1095D00007C113051866632F64FF69F72521C1DAF7
-:1095E000A9B951301661BD5AAAAF3D73D4731B7B24
-:1095F0003EEC85EEC3ACD49E4DE7820CEFCB9ED300
-:1096000097C88C1EBF62797EC5607FCC934D231DA9
-:10961000B17DD4EF2946170EF576D1B314E9617404
-:10962000ACAA929E55A5E8792E9D467A2E7FD658F3
-:109630005C488FD6C8E9D11AFB689E4EC5183D4DCF
-:109640001742CF3D44CFB0A067D845CFBB043D1BE8
-:109650006D7A1A86889EA1398C1EF6C8775F1A1219
-:10966000ACBE86F484B19E939E21A4A7B5083DDAD2
-:109670001F879E0F09794B213DCB2AD393427AEA6B
-:10968000ABA02794019D3DF783641D6E9D8E975F6F
-:10969000F071D13399589AF53BFA7B99E699ADC8A8
-:1096A000D8864553F5C6055EDF691A8A8DA37C2DE1
-:1096B000783006ACBFD13912D577F7FB10A8547FAC
-:1096C00066A3D58BFDBFE34967FFA37338BE76FD64
-:1096D000DF8879FC0DC8D46E5628318AF0E882AF55
-:1096E0004112C7F166623AB66BE2ED06172CEF1E27
-:1096F0000F156BCFE919DD912679D672F710BFFEF1
-:10970000624E060C06FB9F4C02F25F8D717CECF6FC
-:109710000C2F802B90ECBB2C8BE30770119BA7F4D4
-:109720005DB9341B2F9EB9434B307E8C36F46948AB
-:10973000F788B1AF1BF5D6A9B80A7213E2559C0F92
-:10974000B65CAC81316D3E9BCFFE576473274CAF46
-:109750009746E1AA9F82959007722D407F6701E9A5
-:1097600049D2FC0F2E7890E85691AE4548570A0C26
-:10977000F6FC1B427E7CCFA401E54A33D2B1F4A2B1
-:10978000E9E38C20FF5BB1D74C6C4301FD3FB5E7AB
-:1097900097CDAB6B7E892F0F81954B235FFCCE79E4
-:1097A000B3CBEF09BE5FDE9826FE561A7F3AFD7CEA
-:1097B000FCBF0683FA012D134B84A7F019F58EF731
-:1097C000A15CB335691E62552E63E37414F0DB3D72
-:1097D000DE249D4AC621C75F137C1AF54FBC50D8C2
-:1097E0009F1B9F6F897ADF029D4A9BAECB9EE5E36C
-:1097F00054EAFF47C8E27AACEF5A574ADAC1F77B1E
-:1098000045FDCB9F73D62BC59F8F4FF2271D437904
-:10981000B4D723FE59330184C8D05F6839C025F816
-:109820007F5893DFDE367E172EADE3D1E4296CBF7F
-:109830000D92F302CD6CBD78939FC5729D62BD49B8
-:10984000FD42487FFD52217732E9013E1EEB1E5852
-:10985000FF61D19F2275013079F6B543762743ED3C
-:109860001AF9784E62FCDC0760CED20BF6F5137C59
-:109870005F5FA967D7E27E7EA5C20861E3D580EE6F
-:10988000C712EBE758BDC8B290C946021FFC594D3C
-:10989000A288DCF8DB20EDAF61E3B7AB8E75E1B7F2
-:1098A00092807A211C839C3F02A04BE128E1BF02F9
-:1098B0005670FC0D09FBAB538C5E858D23C73DE6CE
-:1098C00041F6B46615ACDC54208786C4E5B737EEA4
-:1098D000F1205D434CFFFBD8928CCC61EB1DD7434C
-:1098E0008CD91B45E47652BFE765C8CD60FDE625FF
-:1098F000C82D657008562659BB8C0F569EA471C1A1
-:109900003C5844CE364A7C5EA5F8C4D9B3641740AF
-:10991000F65AB20B32B48ED578C6C27D40B322A6B9
-:109920000FA7FDCCFD5CAF2960A19CD4C633B91A4A
-:109930007C6F5CDC84F8CE8AA7E0B5565E9E28C0BA
-:10994000570BA563643F355D2CF515EC63CF33F9F8
-:109950003951206F233BB81D30D83424F4CC8749CB
-:109960007FDAEF3F20F8A48E3364902E43CDCE975C
-:10997000A6CBF588545C4F6C16F4E2DFD5CB9DF294
-:10998000AACC14F2CA86F02940F235FC1464115FA7
-:10999000C6C9176E63F0A52F6AB093C9572B1CF583
-:1099A000A0FC5C0613549AA0CB582E0193CA3648EB
-:1099B00050F9DB0E26F7ACDC6631799F4FF2FF3EA3
-:1099C000898DFF9B39C98511F6DC1F4F5F81FB0B29
-:1099D00093FF8DF89CC98984F2546741D1FDB2563A
-:1099E000E2EB75AFA2FBB1DE5E0B483FEE97FAD318
-:1099F000B84F8C083B69C40F8E75BC47D03D22CA56
-:109A0000DA7812C6717ED9BCA05E7FBEE9765AC7ED
-:109A10003E85C3436C5E48EE56F37DCC8D8786F35E
-:109A2000B2E8FCE761E31F7F1E86A4FAA2F3308C44
-:109A3000F3B051E2FA53FD391FBF0C7DB44F6FEE06
-:109A40007D9CF8AF9E3CB7FA36FDCB5D7A7385D02E
-:109A50007357C2C45C85E9913B7C39559108EF4747
-:109A600010EF377F72F403480F8C2717E23EC5F0E2
-:109A70007E54223D9982A36C7CE515398B7E8A2722
-:109A80007883962CE3A780CEF49926F4D97CFCDF6A
-:109A900046FDF5E074FD7BF1E10F1D237B03B4E48B
-:109AA0004ED44FAB531ACA457FE3060DE568B89113
-:109AB000C128373155932E676508BA50FE6CFB6399
-:109AC00028B669A4298A768FB91CBBB5C75F1B4B22
-:109AD0008244CF93337C4DCEE73FC3F5AF2763324B
-:109AE000A34FCD5EAB219D83FA06ADD0EF5243C9A3
-:109AF00098CAE47018C7C3F1BDA9234D6DA83F6192
-:109B0000691FEA733D054B51BE639D84E7DAC68445
-:109B100086EF7DB125E03390C509B2AB86A24E7FBA
-:109B20006EB8F14EB89DEAA7E0F5D074FBDA174A9B
-:109B3000815AB04FE03872C13CFB94540EE99263F5
-:109B4000C5F5EE3F09F9F71809DA6F20F3494B63C1
-:109B500072EF1532E08DC14FA4CB0AE6295AB0EF5F
-:109B6000B0791AF29BDDC5D625DB419CFD9A1268BF
-:109B7000CBABEF776ABF15F39E5931324EF31ECE51
-:109B8000E0BCF733BD4FFBEAF170F61023A1777507
-:109B9000EA317CEF4D2BD017A56E5A709FBB5B7ED0
-:109BA0008789F2B707F9C6368EB11E8DCA9D3D3A38
-:109BB00095233D312A3F19FCC467C759BBED699F06
-:109BC000EE4339C8DCFD25EC8F79DD899DD86F9493
-:109BD000F58FFD2A9A7E484798EF3BDE382F6FF1CC
-:109BE000703ED67802846F9B87DBE10658242F19DC
-:109BF000BDBC9F5ED3EEB473C366606A3DB0FF82A6
-:109C00002D750ED86F5CE4A8EF5E2F2F79B8DEF0CB
-:109C10002A09305BB12CAEC7CF4A32D593E5C513C4
-:109C2000687F28B354B20B0625A7DE7ED4C3F7BBEA
-:109C3000273C1AD11983896F9F65FCF0EA1EB27B1D
-:109C400022B5F30FE7903FF5AAB9801511EFB85E82
-:109C500057643C882ABF1E2F58E74F4956DCF3272C
-:109C6000C0A769F4F7763AE47A9787EF7767C57A01
-:109C7000917D5637EA9918134320F9301E473E78F4
-:109C800082ABCC16C687C15AD5407F68A0D7537423
-:109C9000DF71F341AEB92586FAD1CDF76F09397A74
-:109CA0005AF07DCD99F7909ED8AD7BBAB221E4DB16
-:109CB000D12ED4F3036D1E0FCAF99F0CFF5C746C98
-:109CC0009FE4DF241DC4B78128B79BC774263FB823
-:109CD0009EA35C7E0CC875D17B93D1254DA7CBCDBF
-:109CE000BFB79B3E9BEF35B59E44B615F19B481020
-:109CF0007EAB94A2F8FD47F1DDC62B3489578EE385
-:109D000065FE69E0F594943C88EB7B8F90D73DCA63
-:109D1000B8867A216ECB4D90AFA3E97A4972C83BE1
-:109D2000EBE7F3D8CFFDD80FAB7FBF32E1E8C7AE8A
-:109D300017463EF07591E0EB42F9A3AE0B1BAF9DC9
-:109D4000026F03B25CAE5B8ACBF5DB8D97BD9FF6ED
-:109D500005AF02D437B5A104D9DFB342891CF2ABF9
-:109D6000BF5E35D0FE618E12EDD7D4D428F093EAD1
-:109D700037C6B0FE607823D9E583DE04D9E947EA27
-:109D8000BF66DDC6E8EA3F53033E93F903C1AB8EDD
-:109D900018A8178FC8E4AFF59F699E952A32CF4166
-:109DA0008C8F31FC03881FD9D5EAA4118EF8F68771
-:109DB00098E263FDBCD10A59D4A7DE901543BBBB22
-:109DC0007F9166F651AD04207FFB821F684FB64E2F
-:109DD0006F1F0C0D7D4CBE6C6A1CF6279D45DB97F2
-:109DE000EDE1E8C7137D92E37D513C2AC1DE29589D
-:109DF000A7FE196C68D8B5649D6D9EE23BA3A5458E
-:109E0000C17D130226CE7F3CD1D5F73BE4D3F76466
-:109E1000D2836EFEFCB59C0CC8CBA6606F3449F3B0
-:109E200066F7775DBD427A546984AC4FC251135DC9
-:109E300068DFF6377A28BEA68436D494B5BB1BAB50
-:109E4000B3BB41C43D6C79E8F8391F376072FD1D22
-:109E50008671C0B84A0DF0B8462D1812507B534A8F
-:109E600050B06415C553A2FEB7BADF5BA85FC9DA6C
-:109E70000B6783E7D0AFC2FA6D7E1BFAAD80AF1FD0
-:109E80003E45FD32F5103D3B63AA5F6F2C450FE167
-:109E9000CCD9B3F272E04DE82F49F2AD784C5A9F1D
-:109EA0007051C43CC48AC1E89D0E7FEABDF27C4774
-:109EB000DC54D5873E264558D9B8CD1A2FD00FEEA1
-:109EC000F9EDC681D0BF6CDC628D57A137D0EC2E86
-:109ED00016971A5293D95EDCBFE786288E084A8A05
-:109EE000E2C2C352DD12B49FED7A4AA39A43BCC2C8
-:109EF0006D561AF5C5F00C8F299BD8EFD851F40791
-:109F000040BEC14C96892F298DCA2F0BE9F9CF721B
-:109F1000384A788A38577F05791FEA297F3EA1AAF7
-:109F200066B2983F9396B9FDA2068ABFBF5AEDDC90
-:109F3000212F9BCEB70CF28E3D1FAE652EF7E55C50
-:109F40007C500E94C6EF1E433E0C35AC8B95A31788
-:109F50007466E714F845A66AED94CBE3B1A7181E22
-:109F60001062C2B3B2CC38627EF5AB4D1EEF40A595
-:109F700088E771C23E637847A4995C4FE3DFEEB691
-:109F800083398CA3796F0B59387FB2F524C8ACFEA6
-:109F90000F1B6490DA110EBCE6A1F95C6592BE6AF3
-:109FA000E1FE9DC5FE211D9155AA63DF42FD39B931
-:109FB0006F35A1FC3BE1CFC9CE78667FCFB3F0B35C
-:109FC0000553F8B34756B178B1A2761E2ECE8FBA9C
-:109FD000AAF8B19FC90B3079D9C7FC46C614C8305E
-:109FE000BF11E13DCC6F04F2270D2A077A5AA8DC95
-:109FF000854D57E2F9596AA4A909E3A59F8E7D9082
-:10A0000055D98FBA83CE55029D183FDF69C3EC89BD
-:10A0100084B03867F941FFEF3A301EB3D3CF618087
-:10A02000890ECB01CB7D18EFDF19E6ED7F26873A4D
-:10A03000F13C62BF384702C5D2DE57E0FFE7652F2B
-:10A04000D18136106FFF9B5EECCFAF08383D87F0B3
-:10A050009984191F111FBFC6E1C681B9D43FA90059
-:10A06000365E7C601E1F6F01B7EFA17543053EF69B
-:10A0700091FCDF84877048736B1D1E2A836A9A8067
-:10A08000DBCDFE5A817795FD8092E4FB9D882B9570
-:10A090005E3715F6358147A5F907F44B317EC1F4DB
-:10A0A000701AC7FDC7E2FBF45B3DEE7EEFB9F145E8
-:10A0B0006D9F482B8CC57F29277585C161EB70AEDC
-:10A0C00089C1911B72695ABE558EFB6B5917F1D02D
-:10A0D00024AD7F9BCF8ACEED8EAB5DF3E88D5A74B5
-:10A0E0002EE90FF1F5572DBE2B719C827EE0E9CE53
-:10A0F0008644B874BBFA8467CADE62FFCDE80A4CB6
-:10A10000D96BECBF5AABCE01D7B45FE4A81F36E7DA
-:10A110003BDE7BF57738DE9FEF3C5DE6A2A3D9E618
-:10A120009F80636E3AAB963BC510FB5C9ADB8F93C6
-:10A13000B0D88F2BC167163A61DEAF0F6EAEE1F675
-:10A140000DB763FE13883A6E3CCC02FD2B633D0EC7
-:10A150001B1E096CFB36D732BDFF7EED131487B38F
-:10A16000FA15F05F353D4E97EE4C519C2DDDE7D34F
-:10A17000FBA31477A338DB7666C8FB58B9CD9BDC0C
-:10A180008AF27BDA3F370B11EC37B502E3D6FDAE2E
-:10A1900078825B9EE29FBAA9E879995D8EF4F0F827
-:10A1A0009F0D6B8DC5F300EE55F879FD77BDC97B2A
-:10A1B000110FD48D40715AA075E035F8FEF87CD3AC
-:10A1C0003AF805F9FFFC7C4C85F4B166464F86F9F8
-:10A1D0006B3B0DA49BAF9391A6755A9C3DDF5BEB47
-:10A1E0001136DD04D94F998E990DB89E6A94093ABB
-:10A1F000B7AB8917C7E77EC523E6EDD6B2F4B9E75A
-:10A20000E3560CB4B2767BE7481EE2FF1C4FF61013
-:10A21000C6A31A3DB4AE775BEAE378D4BEBBADEE1D
-:10A22000268AA75BAA47263A725AB1753828ECA647
-:10A230007E113FDDD3C8FDD6E73B5ED7F0BC668F0D
-:10A24000D949F9004AE687D47E58F03BB3F804C5F3
-:10A25000C9874B9CBFF429DCCFEF0F07BAB345DFAA
-:10A2600047E87DA6A9E38587900EA67F0F917F061C
-:10A270000D5B181DBAA52F417EEF9D63797E81721B
-:10A28000B5DA437216C1B89C8CE7A24EFF79EF6A2B
-:10A290000F9DB366F49089F6FB29EB0DA08D48D194
-:10A2A0001BF07CB1E6F8953AED95CCDE6928B0F369
-:10A2B0006B56A556E07CD974F9607DD1F990E66EB5
-:10A2C0004F223FEF5E0206FA63BEB95DB94758BF41
-:10A2D000A757FA7454055787AFCE7D13E5896D2BC8
-:10A2E000E827FBA2560EED267F77100CF63E123BB8
-:10A2F0004C76941693C142BBEAFFCA345F4C671098
-:10A300005DCAFE9547D7B0F6EA6ACF2CB2CB5AF9B0
-:10A310007EA3B37FB8DF6871A75D257B73D4DFFDB3
-:10A32000E38FD3B9B2EAB2AB1428A88F76D7EA0D7F
-:10A33000EF692EA20FEC521E8FD0B92EC8B794B57C
-:10A34000B343C73FFC0F2F16F0FD84E2B2D385FD67
-:10A3500066F753CA7E3BDDB3F51F5E64B29CF4F230
-:10A3600038A8A25ABFC47579429C2FEE75E5DD244A
-:10A37000BD7CBD9C16EB186716FD6DF48F915F03D5
-:10A38000D76CE47E16980E3F86ADF7D34A819F6D59
-:10A39000EF7719ABBC3F3195D712F2C7CBE4B5AC20
-:10A3A00057928AB74C5E8BBD5E47575B1063F33B99
-:10A3B000560BD93E9CDF35166C467995C0ECD379A7
-:10A3C000FD09FB1CA509E5F01AD882EBD7504C3CDF
-:10A3D000871C6C7E3773144BE3AB449DF251691EAE
-:10A3E000B7BBE671B6D769877B2151936BC23846FC
-:10A3F000EC26C463775435713D7A3DB76CDD644C0F
-:10A400009F4758C1F586379A8362E3DAFCBCC36B79
-:10A410002DF4629C5D358F2551FE3B55F27BDDF5B9
-:10A420006FF58A3C962650D03E4BE33AC1F5DB658A
-:10A43000F1BC31494F3D6C12FA09C7B956FC4DCAFF
-:10A4400067FB940CA919AB006EF436713DD3B19142
-:10A45000DB3DD78324D762FD24ED5F0D962EB1BE80
-:10A4600061D4B6CBF4DB62EB0BF4E48D423EA7DEA5
-:10A470002763EF73BCF7723CC3C26ED637C7D62FC3
-:10A480002AD2BEB6B89EBC5EC8F58D5E614FA437B9
-:10A49000535ED0A0714B02F93CB0C632B7A0D64291
-:10A4A00019C17C941038EC6326DF37223FEDF89118
-:10A4B000A227A8B4ED8152F3EFB603BC3167DE49A1
-:10A4C000B5E7B6F1FD37951DC7BD3FDBF96DA8F9BE
-:10A4D0000AF9E4157C6815EB65CA5ECA88F56E5208
-:10A4E0003E90AC5A498C4BCA1238ECADBD425EE48A
-:10A4F000007FEFC683F9CF77E13A952316F9D7109D
-:10A500006AE3769B621AEB8BE06F9F733E21F278D1
-:10A51000E39977D3FE3756DB49FBDE805E5E7FD85A
-:10A52000FBEA1AB841C3B8DD6069FD3156A83FD4D3
-:10A53000A8C7B98E857FCFE8378AF1D9E6534CC4D6
-:10A540004BFBC31B6365E382AEF31553B51E22BEFE
-:10A5500094E6DB23E7C3B7319157B763F0E51744BF
-:10A560001E82535F2F2EA9AFBFE0D0A7425FBF8DE1
-:10A57000FC7FEEADE07FB57118FF76D9383983A93D
-:10A5800078254DF48C1AFBD2148FC1F58D7640A638
-:10A5900083F215200EA417B121EA3BBF6111DF023F
-:10A5A00022CEA4363AF719391A70C0B1EE3460BE23
-:10A5B0001AF68B74FBB7AB34AECD6F66B3503E99D1
-:10A5C0006D5FE272427FA4547E9A5DDAF11B3CC655
-:10A5D000394BFBD4C78F207F4F8580F687D2F43B61
-:10A5E000C789BD37515E3FB9EA4348315E2F722EAD
-:10A5F00038BD9D02AF17E8B5FFE3D227D693B775F4
-:10A60000931E058F89F1CBFED8464832BC8780EB7C
-:10A6100093112C57623EC9121DFDDFEF7A0DDEDE6D
-:10A62000E0FE9D4713717AA33A7FEF6EB60F15B324
-:10A630007F2E56B97D7CFA13A9DF625E427AA76449
-:10A64000E0FE76B2274FF6D3A6DC252AE6A55DA26A
-:10A65000CEA47A9BF637A96B0BD6E726E0E7FE0C73
-:10A6600011B5508FDAEB4FCDF85E403A4F64785C0D
-:10A67000E344E6DFE85CFFC401398B4C3D31726393
-:10A68000D9F57352E86DBBDEC903B285FDA547A4B9
-:10A69000EC02D6FEA462458AE60140969F070BF8BD
-:10A6A0008319D92197A7772455D433277B34E967B9
-:10A6B0006C6E6E473A19FE9B324D2AFA6495E89A01
-:10A6C000A13AE7D3A67310F3159AA6F27706A36F03
-:10A6D00010BDA7D873B94C3C69A7D01383D1E2FA57
-:10A6E0002420CE5F03DE6CF1BC0717BDC116E7BAAC
-:10A6F000B4F11B16F914C33AC76B38E6A179186E8A
-:10A700002CAFC706C43CD8F50663FCBC755049683D
-:10A71000D5E0E3D59DF8941A475B75B80BB7F91AE5
-:10A7200048767536117B5FC63802850E0DF49F9E04
-:10A73000923EC4D6CB0F6F0B59520C1F4EE4BEC9CC
-:10A74000E898C5FC1DB44F752B2BCD6DC3BC4E19BD
-:10A75000306EFCC89FBF917B15FD51E6FF205C6BFE
-:10A76000A4D65F6B601E5C52C275B51B953F75FE2B
-:10A77000AEFE8E56B1FE18FCD1A1CEB5188754207E
-:10A7800021E2191E03F3F568E97B4AEB09D49E67C1
-:10A790007D53ED4AD2E9F28B7CB0A1BCFFBD95D7C9
-:10A7A0004FB37FA87766B9FCACDA6EA7DD5DE37ABC
-:10A7B000BF57C86B29BFF2AD1A6726BCACE1B9AC74
-:10A7C000D6E6D1B3581F52B5B8DF466E5100EDF84A
-:10A7D0009986DE8B21BE4A7CDF053CCF0DBF8828E1
-:10A7E0005C7F9F51B91DDB78E7A725DC9F4EA197C1
-:10A7F000BD18E1BC594C7EDD76DF887182E2894369
-:10A8000070B4AB19EDF92D1E3A4FDADDB6AFB6B024
-:10A81000FD77C43853F30F86B29C4E65C99F57DB52
-:10A820003C16EE5BE73BFF6E3FB9D2FC376C75DA46
-:10A83000C5E73A2F2F21E2CB2ACFFF858E63CFDBEE
-:10A84000F4F5C1F566E39D2F521C67CC2CAF6FA6C3
-:10A85000CFDBCB346F9136B08AC5717E2CF6317761
-:10A860005E9F062930313FF115BEFFC8CDCB63078F
-:10A87000CBE81F39EEF23F443FF90F021CC5FD56ED
-:10A88000312A7C0F7778BFC2F6CDE0F62BF72B4B41
-:10A89000313FCBA23CAFD11E8B9E4FCEBFCF23F01A
-:10A8A00095C0B35CE81583CE3FF72B646F78E02C3E
-:10A8B000C6414007C3963BC07A5DFB158AC7182284
-:10A8C0008F80559D89ED80F4D2624CF6ACA7737AE7
-:10A8D000EA073BE271986E0EB386344F5ECB22BC22
-:10A8E000948C7627E3E72EBF800D01D70A581770A6
-:10A8F0009380611FC14195C11897F7667482030266
-:10A900006E12709D806B053C5FC0D23E8277A9BC01
-:10A91000BF9D4A96F71F10B021E03A01EB029E2F2F
-:10A920006038C8C7F77118F7438283026E12F00CC3
-:10A9300001D70AB859C0D241824BCD5F206E117F3A
-:10A94000A7E6BF8BF30D40F89B0917DC3D55BFC050
-:10A950001F1DEC31A4C2F3436F89F8D3121FD73304
-:10A96000131D09CA5362FE42FA44E1B963ACB8BC94
-:10A970005BA2DDE4B97994D52B1ABFEE2DBA2EAACD
-:10A98000C56FDD79E2F7DEFF20FC6EF6D9EB9EFBAA
-:10A99000E7131D26E1E9EECFDD0EED2D2838A70FD8
-:10A9A00028D934C66B988D44FE8E5773E6B3DEED1E
-:10A9B000E3E79CBD3E9ECFDA2FF09BE8E0E70F83F4
-:10A9C0000B02D983D2F438E35FF8783CE1FB369E82
-:10A9D000DA61F27B8279B662C90FE27ED468BCB3D9
-:10A9E00042FEBAF2FF0AFD65771CE4DFF01D1B276B
-:10A9F000102ACEA7BB27F5CD2DE913ACAEE667CF65
-:10AA0000D19FD1A3B1C6C2BC69F11E248F4CFAE517
-:10AA10000CAB67E78BC8D43F8F1737F278B12CEABD
-:10AA2000D3384DFC3B066B09EE33EC798B18479A13
-:10AA3000DEAFBB5DCE57C7E74BE063E7A7C8F01CAE
-:10AA4000F533898F92207EB99F631EB21EBAF0E75C
-:10AA5000170A7B8D12E365F8F94BA5F69F15F232C4
-:10AA60004D3E4BCCEB7FF3D976CA610BF3816C3949
-:10AA7000B2E5EB7CE5E882E50437A4B6D2729286B3
-:10AA800014AD1B055DCEC5E72E2F45E4245758BFF6
-:10AA90005EAB15E7F926C90BC34721B9D5393EF599
-:10AAA0004BA2D49F846B7C21F62060E403A3F75271
-:10AAB000AD56F081C7290278CE58D09E1147F84A8A
-:10AAC000B224F43EAFB746E3EB7C756723C71F445F
-:10AAD000FF2E7C597F5A617F3234BAE49CE3FD7EBD
-:10AAE0008DCF2FAB4FDFF94D1B5F91085F191269B6
-:10AAF0000F6BF75151DFADBFEC7287C06FD4035BB2
-:10AB0000F977920928FCAE32A879C4778F7C9DB979
-:10AB1000F59317E56AE9F9CB55B57ABD5E2BBEEF23
-:10AB2000303DDF82F1BE52FBCE316D723F6811F3D2
-:10AB3000764EF3FE6BD443CBA6E6B35A7C2F15E3D7
-:10AB40009E2BBE27A7E35B959CBD21F444B5F8ADD1
-:10AB5000394FFC5E76E1F756C9F519B11F558BFFE9
-:10AB6000FBCF531E7E309DBF55AD238F766EFCFD0F
-:10AB7000E879E2F7CF6EFC4AAC5B55E3FC4A0397F9
-:10AB80000F459CBF548B5F4F65FC44BED8BA012B68
-:10AB90004EF61AF9E3BBB5750369650A3F0BB85E5B
-:10ABA0003FD7F1EFAF7AFC770F58CAD4F88F68EF30
-:10ABB000768CAF2826095BB5E33E5AEDB8E9F73944
-:10ABC000E87E7AE47D8E71CF97EF5FAC7AFC5B1DF7
-:10ABD000743F3772AB93EE9049F9C4D58EFBCDF339
-:10ABE0005CEFBF14F80635DDB10F94B2DFCF08BBC0
-:10ABF000F6839AEE90E352F5DF10F6CABBAAAC7F5B
-:10AC000052F4DF6CE353A1FE3D02FF7BAAACFF6B65
-:10AC100081CFCA2AF1F9BE5887A5F6CF80E07B1014
-:10AC20007564815F73A1794B5B7C49C98FE79CCFC9
-:10AC3000F4D077826F289A8EF14EE802B2C7FDC732
-:10AC4000C307795E495AF8FFC9B4C4F530C5B7BC2B
-:10AC500051D3711E67FB5D8A92B08A9DB7D5FAB950
-:10AC6000FE9374B39BAF7715300FA954FDA0BF7846
-:10AC7000FCA5062628FF0462E21CE9CC8D46D173B0
-:10AC8000022541792DB2AEC24136CE40ED46A33009
-:10AC90006F396EE313B3081F55E7F8A88A6915CB1F
-:10ACA000539EE3E7F36AF763FB87526C02F83D0EAD
-:10ACB0001CBF417FA21BF3C4D3B52AF16920EC3C31
-:10ACC0001FBF49F4F34E41DF80B77C9E58E7CC7636
-:10ACD000CA57EA6FE7F94A069894DF39102A7FAF1E
-:10ACE000C1580F8FFFEF14F94F23F8FD287E4F8CCA
-:10ACF000DF8F2EC4F65FA1EFF04EB57ACADE8F1358
-:10AD0000369D71F6608BF37B1E3B2EEF379CDFF593
-:10AD1000F862CEEF7ABC3315CAEB1A08F1F3814A18
-:10AD2000F8DB79EF76BD6125A5E945F994759C0BB3
-:10AD3000F8624E7CDF3EFEF1F641EF61BD185E6FBA
-:10AD400015DF4AC51B26E9AD515359AE371CF91919
-:10AD50003D42BE7C355A0AF532D3BB25DE0778FB6F
-:10AD60005082F243B458C2A078B4D807345C0F05BF
-:10AD70007CFAA4BD2E031E3BDF98F23A24C3A2F353
-:10AD8000470DD79134BDDDE4BCDA72FFFBB5315A13
-:10AD900027F51AAD13C998A0EFBADCE32CF45BFBDE
-:10ADA000FC783EE6B71EC0D2FB0739596CBDECF506
-:10ADB000733DAADD9030B4F9E4AA92DDE3C6E34B1B
-:10ADC00062FD856CFCD316E55F548BFFA355E26FE3
-:10ADD0008FC3F0FF1CEA5986FFE7B12C85FF534271
-:10ADE0001FD581D14B7BB6C1F52CC07AA330BE1ED6
-:10ADF00008F07EEB849E02E870E4F578055DD5D21C
-:10AE0000F3ACADD72AD0638FCBE87951CCC777CAE2
-:10AE1000CDC7B7053D8100DFB7B40309832D4DB819
-:10AE2000B8C4BC9C1078CC0C88B852BAE39CE4EA55
-:10AE3000A52AE93831352FAF8A79F9E772741C17E2
-:10AE400072959161E549DC4F9BEDFC850D8E7999FA
-:10AE50002DF893F1D9F3D2E99897DA739C975F555F
-:10AE600049CFECA979392DE6255F4ECE0AEAFF5E7F
-:10AE7000D4FF83A84F76E2ECC0EF06F0BC6CA13F94
-:10AE8000E109D44FED6FAC9E1C583655EF93A347A4
-:10AE9000EC7A3EAAD735594F0B14F407E9D706F0E0
-:10AEA000FC7B507CFFF1FDD1F035A25D84DADDC082
-:10AEB000E961ED6A0AFBFFD2E82B76FF33B05EEF63
-:10AEC000DA3FD8F5A285F56607FE60D78BE173E916
-:10AED000C0647F0D85789CF0FFEB00CFD771E57BD8
-:10AEE000E9D5E53B78A349BACFA10EC2199995439C
-:10AEF0000ABF5F21CD8CEA43983FEB4BE6A00ABB2B
-:10AF0000CBA3F1763E666FE1F9F10C1D9EF71BE8CD
-:10AF100082987080BDDF1355C81FB8D39F6C0BD4C7
-:10AF2000733C290FE0556E8FF586DA441C85E3B536
-:10AF300037F88111EC4F677861FF9F0C469EC7FA86
-:10AF4000FBE6A894CFFBFC9CBBC84EDCDBAB00BE91
-:10AF5000DF7B9D4A76E203AF86691F1E54CC9B2897
-:10AF6000FFC1520DB41BEF0EFCE118E6298FF7D696
-:10AF7000E8D255440FE19FF640A29FFAE776E776C4
-:10AF8000863FE603D3D685FD76713F06449EF3DD0A
-:10AF90006B0DCA9B3180DFDF34DCAE529ED2DEC641
-:10AFA000F91D38DE03ED1AD91D0FDC30BF97F2B959
-:10AFB000DB0394FB56173224CCEF89AC50013F04DD
-:10AFC000A98B1ABD6877869707F0CE2FA86BE4E3AC
-:10AFD000851702DDF3E7854C22CECAC8884AF738C8
-:10AFE0003D70C386DC66B46BDA79FE3223ECE5F89B
-:10AFF0007280906025C83F00C4C73B9B9FE7DBF38E
-:10B000001CC94CB62F7B8E18C956592F575DBDF001
-:10B010008842F9C915EB65AAAC97ADB25E8ED7AB85
-:10B02000787E2FF22935F60FE3707E773E76A8FC06
-:10B030007771E79AAFBB37E0CCBBAED4DECED3ADF1
-:10B04000442F1E664EE22957AE6FE7D9957AEF9DE1
-:10B0500079570CBF4B1BAEBF5794F7F1B2413C6F11
-:10B06000D81EA3FB221BC4FB86FBE8FE48773F7F6C
-:10B070002BF4710B24CACE439DC0FF75863BC6B32B
-:10B080005B940AF900EE7C3F97DED3947427ADDB26
-:10B090001B787ED1E4F7938DE2BB114825E214CFF3
-:10B0A000B2228B674EAD1FEFAAEFD2FAB1BF9B64FD
-:10B0B000F3C3BF9774C9895B2E7CAEFC940B959348
-:10B0C0001FBF4D72E21D91AB5A3FDE4C95F5B25554
-:10B0D000D6CB55574F1D91AAD22B6AA6CA7AD92A28
-:10B0E000EBE578BDC195AAD8D7470731BEE5BD428B
-:10B0F00073C08357049CEFAF0C39E0A165CEF6EA2C
-:10B100007267FBA1E5CEF6EA0ADEDE0CEEBF261D75
-:10B11000AF7E9DFCAFF35C272D5AF9FAE1F60AEBFE
-:10B120004AD3FDD8BE4E3100EF1762FB5556EC5B9B
-:10B1300045E33FEB827CFD5F17D01DF7D3FDA9D31C
-:10B14000D912E4F8DAF456C2D7D6BFFF220BBBAB54
-:10B1500044DE3D7E564079D830DE80FD3D7FCFCC49
-:10B1600006B4E7F6BEB682EEEFE87F979D376352EE
-:10B170003EA472EC9764BFECDDCEEF977EB4D6ECC4
-:10B180008AA3BD12F600DACBCC8DA27B3DF6C63C7D
-:10B19000648FF45F5DFEFE924FF5F03CA187D1EF26
-:10B1A00067FAFF80B877EB4171EFD6FD3D0695BB9E
-:10B1B0007B5AA8DCD5635239DAD3CEF3197B2CF154
-:10B1C000DD5917955FEA49D0F32FF47453F9F99ECE
-:10B1D000243D7FAA672B959FED49D1F3433DDBA921
-:10B1E0007CA2274DCF1FEF19A1F2B19E0C3D1FBAD3
-:10B1F0007A03DD9371EA3E0F7D1D520AFF392967FC
-:10B20000DC61F65667DCA121E98C37CCEA76C61BF7
-:10B21000F455F31DEF236DEF70C0A1D6258EFA8192
-:10B22000F8150E586BEC74C04AE89D0ED87C6E83FE
-:10B2300003BEEC999B1D70EBD39B1CF03B3EFD11B4
-:10B2400007DCF2A93B1DF0C5FBEF75E0171FEB73A0
-:10B25000C0EB83F3F97DE0033B1DCF8DFBF639E0B6
-:10B260008FCCB41E0B623C3413E1F6EC7189F6C14D
-:10B270001973CDDBF03B29F8B14CF204519E0F3F1E
-:10B28000637EEA72BCA70C94D48A1BC395EF91B677
-:10B29000E33D72A43D89F27AFA35C9407B578A6C46
-:10B2A0005F58E8CFD9E5D65329388C71499167A604
-:10B2B0005F0496C5DA05983EA1C34548E57650DCA3
-:10B2C000D243DF5165A424E59B309BD9FC2B1DF3B1
-:10B2D000E8DDFB6F90ECF253519ECFDED1A9350D26
-:10B2E000B0FABB17A926A6784DC3D775BFDDAF82CC
-:10B2F000DC0FDEB583C72BF517FC4D1A6B1F32939D
-:10B3000033D055B5DB8572DFA3EF944286B91CFDBF
-:10B310009A503C039B43588F7FD7C7EA7F3558200C
-:10B32000BFA164CE5259FDD89664B387D5DF2DFAFC
-:10B33000DFBDECC7748F6038F713B898FC9DCFD091
-:10B34000F8E1B6A3707B18F5D338AC2BB28E77FF3B
-:10B35000BEF8F748E34199DAEFEECD82C9DA05721B
-:10B360005FA77B38ED7909B61E8524F6BB6A82BEDD
-:10B37000A1DDBD43A27E764B2FC56282CE5E179DB6
-:10B380008817D2753BEB27D49D94D6B5F2E7CDE173
-:10B39000A97EF1FD667C7F4B4AC23CF76AF8A72282
-:10B3A0009F928C7FB8DEB664A4B2FC337216F25B57
-:10B3B0008B57E2DF839C7F8C6FB7B74EE7D764FD76
-:10B3C000F45158DE5AC06FD11EF9727B11BE4EF295
-:10B3D00089B54F52FB97606988B7433E8419DD9B5E
-:10B3E0008BB5935E12E3649DE3303EDE4ECFD322F5
-:10B3F000BEC8EFF5B4F344ECFAF8D7B55CE42932F3
-:10B40000BABDE3B59BF1FBEB8ED624DD033C18F20D
-:10B41000D0FD4283A1AFE4E89E7E1DE8FB5945B113
-:10B42000FA7E14E571E83EA9D83A75FA09F8654A3A
-:10B43000E1F76403213B0FBF82BD24EE1596C5BD25
-:10B44000C2AA92E86AE2EBD9EC85A9F8EAF4F1F72E
-:10B4500011DD72CCB9FF0E6C71EE7B71FD668A63F3
-:10B46000F747ABFB6EC897E7F6A52AF0F1E683FC39
-:10B47000BEE3BC9FF0B4F233A85C93AFA5F2AAFC84
-:10B480006C7ABF3ADF40F0AA7C33C157E69BA8BC78
-:10B49000227F293D5F99BF84E0F6FC522A57E417CA
-:10B4A000D3F3E5F92B095E965F49705B7E2D954BD2
-:10B4B000F31D542EC95F4FEF17E7AF23D8CCDF48F9
-:10B4C000E525F9F554B6E4FF8CDE2FCCDF44F0C55A
-:10B4D000F9CD042FC8DF46703CFF51829BF31FA6B5
-:10B4E000727EFEBF52D994FF18BD37F21F27785ED7
-:10B4F000FE1E82E7E6FB099E93EF25B831BF8BE085
-:10B50000D9F9512A2FCA3F4065437E2FBD9F957FB1
-:10B5100088CA99F927E8796DFE712AF5FCE7C57D9F
-:10B52000D14F5119C97F95CA70FECBF43E94FF1BD1
-:10B530008283F9AF5319C87F9B4A2DFF3C9595E64E
-:10B54000A9D2F74F6B6086432E56E72F72C0574E35
-:10B5500038F7EF953F77EEDF2BC69738E065C79C4D
-:10B56000FBF7D2A39D8EF78B8FBCD3015F9273EE56
-:10B57000DF0BB3CEFD7BC1814D8EFACD998F38E0C4
-:10B58000A611E7FE3D2FEDDCBFE76CEF73DA2FA9C4
-:10B590009D0EB861AB73DF9E050FBBF2C90F3AEA8F
-:10B5A000D7589F73D40FB77FC575BE92E5FADFFCFD
-:10B5B00086D38E6979A1E8394C7CFF75F4DDFEA94C
-:10B5C000468FB86748DCDB2AEE4773CF679DD00310
-:10B5D00033F2DC7F8A8A75578FEBAE20EF89D91959
-:10B5E000AFA17EB0ED8C19F38D2FBFC8E0D373559A
-:10B5F000B397C1B69D61D7AFF8BB15AA399E6678DF
-:10B600007A8FFBE8DE3929D26D615CEDEE1312DD35
-:10B610006F57371B449EC0755D3C3E01F67D3A7402
-:10B62000BFCFF01CFBFDE66B298ED1C4E123A11D29
-:10B63000EB308E3AECB5DF7FFE5A6AEFE7F0FF0899
-:10B640006D19C2F775358763681FED2A71BEF93F22
-:10B65000432AF1B33664FD30B46CEA9EE9E3D1E4E9
-:10B66000CB21F67C9B969C875776E33DF7788FF34A
-:10B670003AC5FA11D65BAF58AF84685F70FA0FEF26
-:10B68000C7DCD765742FE04FF0BD1C7996F6A3BADE
-:10B69000EBEFA3FBAA86C30C9F50697CFE3E244FB0
-:10B6A000EE3760EF37F3299E4AF6E05013D0BD190C
-:10B6B000C3B58934DEE797FE8E06874CA43BC3935F
-:10B6C00095447EE2F025862D178EFD092091C33822
-:10B6D0007E301932D05E0BC151CABF88C004953A82
-:10B6E000E892E3BE6D9BFE399C7EBCFF3F44E7F0D1
-:10B6F000D6B3E314674D81B8BFFA4D7CCEF8723AE9
-:10B70000B4AC345FAE91EF039D8DFF28B327918ECB
-:10B710004781E33B86FEA98478A6F466EAD7798F51
-:10B720008472FCEB243776BC47915769CD488FB8BB
-:10B73000C7A18BFD43FBB03E513EDEE3BEB7E15CEB
-:10B74000E33DD1B03BDE13A2F3E453ADE5BF83B3D9
-:10B75000E33E63ADE5CF7B9F157EDFD7C479EF3342
-:10B76000E2BCF72BC2EF3B2CFCBE2FA2DFC79E3FF3
-:10B770002DFCBECFA1DFC7E027D1EF2BF8BEE4C977
-:10B7800012F7BF2CAC95849C6D27FB3E28EE2B62F4
-:10B7900023903D1F10F6FC98D93713FD8E602D6461
-:10B7A000D14FD87ADD41FA7E969162E2FD0077FCB6
-:10B7B000E2F599FF85C1F11838EE770AB4BAEE4B7D
-:10B7C000A8348E92B5B0DF20F31B326669FE9C73FD
-:10B7D000BF5A16FCE7D52FBFE7C7BEB78D71328DB4
-:10B7E000F21744BA7594ABBFA1714E897140FEC186
-:10B7F00011BACFF07205CAC9C1B471CE51FEB68478
-:10B800005DBF4FE1923FC0840D46EF3CF1BDA611F4
-:10B810004A37EF61EF9FB84F757C9FED96C7DED733
-:10B820007C14871D5CCCEFE579B17EDD45E80F7EA9
-:10B830007AEF9B4D889FFDDD52BFE98C5BCCBB0F3F
-:10B84000A4C27C9603623FE8D7CBCBB97DAF78FF2B
-:10B8500058F97A0F8A7A5F0C5A7D61D22B13741FC4
-:10B8600064FB89AE9B11DFC77668745EE36EF7C533
-:10B8700060726778D9743C0BDBA3BC9569BFAF5C81
-:10B88000FBE53FEDFA29946FFF70B8BE74FBB697E5
-:10B89000BB1EAE80FFC1E2E3A71FC376F3623CCEBE
-:10B8A000D4DB3044F3BB6B07F79F5F5CB48EEE993B
-:10B8B0001DA8E5F356A4DF2F54E04B7705BAFEAA86
-:10B8C000527BA93C5DDF2CC717C6D76315F8F29DE4
-:10B8D0000A7C3D5001FFBF2FC1D77988F73CFC7D22
-:10B8E00038D6AE770EE32BFA6FC85798BE1E8AF48F
-:10B8F0007BAC1C5E55C8EBF805CAEBCF2BF0B592BC
-:10B90000BC4E5CA0BCE64BC92BE27D01F22A47CAC3
-:10B91000F3B592BC06231726AF33CAB5AF425E67B4
-:10B9200097C3BF0A796D2E36BE0F8216DAD5A75A95
-:10B93000F939D9D60E7E3F99B785EFC3C1E39F256C
-:10B940007B6980ED5733DA71DF3EF1E01D6D53FB0B
-:10B95000B47B1F72F7E7DE47EFF8DF9FA17D342449
-:10B96000F67D1B1FBFE1EEA7FCFD16E73A6E007FD8
-:10B9700097A9E0F72E1A926FF578CE7D3E60F2F12E
-:10B98000818DBF96CE159FA673C59AF60B1DB77C09
-:10B99000FD59DD1766177C28E2B40B666FFFEA637A
-:10B9A000741F89E867B662D1EFF8297035BFFF646C
-:10B9B0001BCF1F92B77FF9B1934B0BEE9982C35205
-:10B9C00061BE90BCEDF063270BF0CA63FC87C79B98
-:10B9D000298F31AE5F11A07BEBC6CA9F67FC40EC9C
-:10B9E000E3DF17E71947C479C677855DFBA2B06B23
-:10B9F0005F10766D4ED8B57F2BECDAE7845DFB0DDA
-:10BA0000719EF1A0388FC8F41C20784F4F56FC4E21
-:10BA1000C993E2774A0E8B7CC967F9B9454F8EDB33
-:10BA2000C78F7FAD19F93145873B8EC5E9B0EF4728
-:10BA300077D3F12ED379DFC6F52D41C7BC5D6738CA
-:10BA4000E322D7C6663BEA5FA3373BDEAFD52E7550
-:10BA5000BCEF80A5CE384BFE0A679C65C21917B9AA
-:10BA6000F2E7CE738D95E3CEB8C88A63373BE32CFB
-:10BA7000479DE71A4B8F38E3228B73773AE0CB9FD1
-:10BA8000BDD7517FD161E7B9C6A54F3AE322B3BA1A
-:10BA9000F739E05AEB61E777F5EDCEB848D874C6D0
-:10BAA00045822D5F71C0EF61FB3DEA4FBFE18C8B9A
-:10BAB000F862CEB8C84F43FC1CD0F6B359BBBF8B5D
-:10BAC00090BF19CA5DC9E4FD8928BFE7FD09485246
-:10BAD0009E2CC09F93DFA04CFA0D16AD7B59E81D3C
-:10BAE000B5E1E48FD1AF517673BFE70E69454E2BB8
-:10BAF000F47BBCFF2215CA87ACBBFD870AFD7B4DDA
-:10BB0000F277940A7EC9F47EB9BE9ABAE7BC2D8D4D
-:10BB1000F954CAA45F72BDCB2FD996A1DFB39A5155
-:10BB2000DE2F9936CE39EA9FD391127E49CC43FC61
-:10BB30003314EE97EC32855F02FC7B29BB3F5BFF41
-:10BB4000A80DE5F5887D5F8BBA88FB0D4AA8F879CA
-:10BB5000B67DDFA4BAB87C7FB65FF37711714F5C16
-:10BB60000D88B8FEFF978FB7523EAEAC29113779DA
-:10BB70009BE5A354BD73950F057506E5837C70188E
-:10BB8000F3417C2E581370CDFDDBD6E1F74DDB8100
-:10BB90009FEFC02BFCDED552FDDBF95DF155B7966A
-:10BBA000CD83B0E3AC522D3FFF8CB7DF4AF993A7AA
-:10BBB000D818E5EED576E75BC8D114FEE81E7ECF37
-:10BBC0005EF4DCE79FEA785C28DEFD81B2F68AFB52
-:10BBD00077C1E256F97B764705FEDF7E7516D9A957
-:10BBE000BBB6717DAC747FF37994C74FA33C9A14B4
-:10BBF00057D12E41BAB62974AF5AC8008A0FCE0D5C
-:10BC000041B6B709F96AA6F13E2FF647E7CB93F2A2
-:10BC1000B9CD79BFC9EF74BE9EE389F27CADF8BBA4
-:10BC2000062B0F77D0774206A4F45A5A3FF07A9445
-:10BC3000F023391D6E37F9EFDF317C747D7A7B3765
-:10BC40005EEEF5A96CB98AE24AB3257B7D064DCC40
-:10BC5000D739150A95BDEF6D5ABFE7B81EBF306DD5
-:10BC60003DDED0F78F38EE9888236D677F05E79D1E
-:10BC7000EEFEECF568C3DF7EF56EFABE6578EC4E3D
-:10BC80007E6F71A3B81F6C8CEBC752781D1272B413
-:10BC90005BD88587F677F6217F07D8BA29D4470B7A
-:10BCA000FEF2BD81243F5FACC3F23307F877DB17A8
-:10BCB0003FB4453CDF44CF1744F9FD470B983C6146
-:10BCC000CC3BBCEC158DBF7F59A7FAD1F1117C7F1D
-:10BCD000B178BFA7BDCDC2DFAA8CD4CEEFC4521EAF
-:10BCE0003B4A7A97CDB9B5C0C07115FA1D9DB923ED
-:10BCF000F038D231772CB1E13AF40FD2C07FAF2DBA
-:10BD00009ADC89F21AC900F597060E1BDB759ABFFB
-:10BD1000F858721FD56FE5F5D97B82E7A6F8FBE0EE
-:10BD200018C317C733D97B03DF73FC1BB7E814AF05
-:10BD30000B8D1D4DAC257FC46ECFE1865B787B6596
-:10BD40008CD183ED6376FBF10CBE9F15E5EDD5310B
-:10BD5000BE3FEE69DF44F7EAB1F1E9DE29AF78FED4
-:10BD600084E07FBCFB5F336BA35379196966FFAE38
-:10BD70002FB29EED756FFF0E60BFF80E49D3663F80
-:10BD800072B2E05E06FB77430363CEFDF94C0D5FB4
-:10BD900097FF1DF5CCB2CAF7B3FD3B5950D3F30062
-:10BDA000800000001F8B080000000000000BC57D14
-:10BDB0000B7854D5B5F03E67CEBC3293E4E43D79C0
-:10BDC0004D4E2040944007081810DB495444458DDF
-:10BDD00068DBE0B53A04E419202296A0D89C9004D0
-:10BDE000F20206EB2F111126281A2BE86041B15AF6
-:10BDF000EF80B9147B6D9B5A2FA2A28DA05114B86D
-:10BE00002915C9DF5FAFFF5A6B9F43E64C2609EA4D
-:10BE1000EDBDF93ED8D967BFD77BAFBDF60E6B102D
-:10BE200059C8C6E8E79B61F09F1A63CC5725B2500A
-:10BE30007E58BE32C3989F3BCC58FFF64B8D79D7C6
-:10BE400078633E798AA1FDF91B18EB744246F2D85B
-:10BE500018A4D2D1DB6CA56318AB4D5E4EF9DEBBE6
-:10BE6000F4726F0CE6F3E418912533B6AD400C3450
-:10BE7000E532F644D5F2C3C320BF3659A43ED7BA43
-:10BE800066C6FBA0DE37F8F3A3FE69433563212BBA
-:10BE900063DBABFD946EAB6EA5B43E79F0767BB5FB
-:10BEA00076CF57DB58681463C16A99F2CF56BB2826
-:10BEB000BFAB5AA1F457D5F9F4BDBDDA43F927ABAE
-:10BEC0008B287DA2DA4BDFDBAAA7537E6B7529E5B1
-:10BED000B7549751BEB5DA47E9C3D50B28F5575784
-:10BEE00052BAA1BA8AEAB554AB94365537D0F7C0E6
-:10BEF000B860596941FF79D6CA00871428BFDA9320
-:10BF0000510AEB79FC6A56168C5A4FA07A1B6500D1
-:10BF1000DA44C6DCCCCF1C85F07B2B633B15C6EC2A
-:10BF20009D7ED50970BD74177CC37CC8AF3A209F35
-:10BF3000FF04CF6FD2C6A962CCCBB05D150BEC0469
-:10BF40007CD8143F9B0DE379B35576732C63376926
-:10BF5000E3E07784AF9AAB32C4EF098BB7544EC19C
-:10BF60007EF8F8313E9F00CB63692B588D05D28453
-:10BF70008A2E668771E21F0A796D900E6BE864BEA7
-:10BF800002C4AF586282799CF38B011374AD4C6587
-:10BF9000A208E337BB383D44AED3DDBB8D852640D8
-:10BFA000BDE42E3B8EBBAE6A663C8B020F3D1DDDB1
-:10BFB0002EF6D127FCBB2410C60FF06F9D7FF0F644
-:10BFC0006965C6F609DE88F605D01EE0102806FC75
-:10BFD00045A1B7F82263FB584F447BD7E0E3C7F491
-:10BFE000DEC8424903D3F3294B790DC25DCF8FECF4
-:10BFF000FD21D57FD729131E12AF5FED4238C3CF85
-:10C00000550867298B059A04CC7AD902C89BE1B7F9
-:10C010002699E76D90374990F7403D55F1B2B198B8
-:10C020007ABC2C0E532FE50F997D1BE589982FE5DF
-:10C03000DF651FD141E012E82203E58DD2E0CD8219
-:10C04000FC8FE1F7298CDD2C8F9EAE42FEBCD927F8
-:10C050005641FFCDD9626007E075A57B7C0CAEFB35
-:10C06000F196C1F9B416F974545FDEE4F43201FAC2
-:10C07000C9AC90C79BD8C0ED1EAA10A707A2F4BBFD
-:10C080005BA3DFFA8A99F2085C7507CA30C6AC4E2A
-:10C090001695DE60BDBB71BDE664BECE945B4B29D8
-:10C0A000CDDB35D9560AFC703E7670FC3546CCDFC8
-:10C0B0000E4306A3E1519B57DE1B2F91BC3C3F86EC
-:10C0C000D3D540FD366BF2AB3720B24EC4AF544AE5
-:10C0D000F235E5561FCB83F5AC4B17034E58CFBA5C
-:10C0E000AF6F69C8057E5237892407F4F9478E6B14
-:10C0F0002AE8124C50BEEEC042A6C0F8665729533B
-:10C100000B30AFCBEB20C3FE1DCE90175390980C95
-:10C11000D7EFA8F2A998B7B854E2E775E917EADBB8
-:10C12000102ECD7E91E4FBDA2C31C0044A9913E63F
-:10C13000736E35A37C4EFA838C24FD57309F49D013
-:10C140000FFE6E42783355C475E4325A471E3BCC1D
-:10C150004CD0CE3686799AA04A7C1E3B80EDD6A57F
-:10C160007F79C08AEBBB97794628D8D847F2080870
-:10C1700094A11C595B2953FDCCD6B1C417FABA7FE0
-:10C1800062F17D1ACE3716179767EBBE364595AF2D
-:10C190008735F9183300FEE21378F97973F05A9471
-:10C1A0009FCD90DF11859EEC5ABD47E5997FCA5718
-:10C1B000FAF8532F7FD7A910DFEAF9CC5E0BCD3BFD
-:10C1C000EFD69FC5E3BA06A287B51A9DF9E3B9FC7D
-:10C1D000CD9B7A8517E17E0EE68AFC1E597F51BC05
-:10C1E00042F3D0F392D328A72E7E7E12C9E3BC532C
-:10C1F000AB383F640F4EB7FA3CCF671BED04316F8D
-:10C20000818A7C5DAF007E15B417D63091EC02E6D2
-:10C21000615C45B138C83FB15A935FF95DF64B2078
-:10C220006F7BCBC410BFDBAA4A4415E09E932B055D
-:10C230004C00F7F82CBF97813DE2286002CE1FF03A
-:10C240003D322105E96012C1337B754810A1D31E30
-:10C25000947D29B4EC3AD7243E0EFE077C3F26019C
-:10C26000D6E9DD2570F9E0E2F2C10CD3B191FCAC66
-:10C27000624118CFF19689BE033F841E807C8C2CCE
-:10C280007A509EB678D6A4221F3A1218E9B505D77F
-:10C29000EE20B905F2D6B30556B4F46477EA32C895
-:10C2A000E7B9F87A74F8C414580CFA61C871A4801C
-:10C2B00017FB7508CCE3F70CA247BE6DBFB600B301
-:10C2C0007FA77E4191A4129F683FEDAA80E3E0BA68
-:10C2D000A15F2B7B99C639A78DC34C6F1C467E8905
-:10C2E000F981C44C51F865C0714CB70FAA37AA8EBA
-:10C2F0002DFC5347183DDF95109BDC3D1A7EB98C11
-:10C300005DF60D2A0E13103CCE03EC4E13AD9FAD1F
-:10C31000413CE7C8DCEE509CEAF00D50FEF86A0B99
-:10C32000C90FBDDFF3D50BFED401486C29E072BF05
-:10C33000E6436B09F6533F4E0C58A15D47CAB48CD7
-:10C340002EF8FEC4A62F73717EBA7D5AEB31F245EA
-:10C35000CE6A4E977ABE55E38B5A79707DB241EF23
-:10C36000AF65F07A0F6BF59E75786B918E81D20573
-:10C37000E4CFA2E3D36FC3F96E7FC0C64C51E4C2D1
-:10C38000B30E5F73C2C4FEF30C6F8FF43648FB5FCD
-:10C390000ED67ED2BBD3DF6583B77F342165E0F64E
-:10C3A000856F4EDF32C4FC1F8F3EBEBA1DDBE5B881
-:10C3B0002C0CF15B93BE96F0DBFC80C563057EEF31
-:10C3C0001833CD8578AB4BE0788BD2EFB383CD0BB0
-:10C3D000E05236C4BA5E18AABD30F8BA5E1D02AE8D
-:10C3E000478780CBA1C1DA035C5B8798FF1FA3CF8F
-:10C3F0005FCDC179E7645948CFD464035C518E2383
-:10C400005C597F7E88D2EF3B43C065287AFDF07B84
-:10C41000D2EBC9C1C6BF087AFDDBF7A4D7FF3B103A
-:10C42000BDE2BCBF07BD4A89DF8F5E9D8983C375AE
-:10C43000287A4D1EACFD45D06BD660F3BF087ACD8F
-:10C440008B36BE9539BC2ADA45055C9F2F281649E4
-:10C45000BF9BF3B91E761C7BCA8BEBAA037D955458
-:10C46000847AFBF8C34B0BFBF474A41E8AEC2F52A6
-:10C470008F2EFDDB93A4479D9ADED7E7635722FBFF
-:10C48000F99741EDBB6F3B6E8C8B85EC63FBDAA7B4
-:10C49000FBFEBBC733EAF9180F1F9FC1F85716A15F
-:10C4A0007EDDE541BA8C2FFABEE30E5E3FADECFBBC
-:10C4B000D9050B12C12E70F4D9059955BFDEFE5176
-:10C4C000525F3F999297C9403712BB8AEC3756C1E9
-:10C4D0003C3BB1B86ACFF68F26F4D903007F01FD4B
-:10C4E00023FA38A68AE0F68FC2E6D53B9769FBB4FB
-:10C4F0004ADA17E5C95362908ED7B50C6E2FBFA1EB
-:10C50000E9F1DF6B7EAAC39A9FEA10FAA920ED40F9
-:10C510003F15A407D14F05E521F45341FE55CD4FFA
-:10C52000F58AE6A7FA8DE6A77A58F393F9D14F4634
-:10C53000FEA880E68F6AD7FC51414A1BAAF753BA7E
-:10C54000B63A44F5DADB5E188EF0E85B07B7DBF34A
-:10C5500064DDBFC7D7C158298B86AF1B3C26C3FEFD
-:10C56000E2FA7C87016FD72A4986FC35AE4C43FD41
-:10C57000ABE5E186F22B6DA30DE5C56C8221FFA32F
-:10C58000DE2986FA57F49418F2977F7A9DA1FEE48B
-:10C59000AE9986FC65476F33D49FD8596E289F703B
-:10C5A0007891A17C5C68B921FF83FDF719EA8F09B6
-:10C5B000AE31948F6E6F3294A7953D18E167DA62C1
-:10C5C000A81F5FB423C28FF42B43B923FF7943FE26
-:10C5D00026D0F728FFECCA6F0CEDACAE8386FCBF0B
-:10C5E000C531DAFFD89D41AF378A3DF9553CDFAF01
-:10C5F00082DD5E4CF632C8B1A671D8BAD28FFBF19B
-:10C600004CF81DED63C0AEC08643EA31CA1D5385A8
-:10C61000C538FE10FC8C1E00ACEF861FE4C7AFF4DB
-:10C62000FD6CBB5DFD218E9FC7E5B02AABE47F8822
-:10C630006CAFFB8BF2DA67C563799D5C2247930789
-:10C64000272CBE93E1FA2172FF9BE78D655E1CAF3C
-:10C6500042F797717967E25558E6B16B0E0BE8FF28
-:10C660002A7B3501D7A3FB79D6697C5AAFF991AD06
-:10C67000EC72F2639CD3E43F334DF50C269F22E12C
-:10C68000F56DE5999814B9CF9911FA18C7AF9002D2
-:10C69000D1F4A49EEA722CEFAD3B07C58F0E5F1D4F
-:10C6A0008F2639E845BD6A532A59B9B33F9C4C5986
-:10C6B000400F71FFFC75E72619E5F839F64AB177A6
-:10C6C000D845ACB7EC0E5A878ECFC87AFA7EAB0548
-:10C6D000F14AF291CBDF5A0DBF6291770DC2370E4E
-:10C6E000F6D1B8FF133D21D6F51DFCC08EFC4443A6
-:10C6F0005E726618EA9B3D952C88FE5B1887113D9B
-:10C70000FA18FA73F11FFA4B4C3287F3C07C773971
-:10C71000F909CE45D82103F11F0EF1CDF0A1F9F5AD
-:10C72000BBF277C7DC54EAFFBE78A6F95F549EAA35
-:10C73000EC4DA49FF2228D8098F2D3F760DE0B0FB0
-:10C740009B49CEFCE8ABED871E03BE341559E526A8
-:10C75000F20CF90FFD16CAE77A6DA5985F786C8C1C
-:10C76000C50DE5473280085C585E1A8772E03413C5
-:10C77000A7A3DFEE347B336E42989CBB27C942F2FD
-:10C780008535988F77D9707895CEB1EEF2F3BCBE2F
-:10C79000AEF9ADC6FC3C3633558271E63D646601A8
-:10C7A00000D642261DEFD2E10074302789FBDFE777
-:10C7B000B3CAB5328C5B6FE6E7364B5E1C63413C17
-:10C7C0002C9C20E79AC6F5CDE3FE2491EA7F06F47F
-:10C7D000A658FBBE2F72062C28974FEC9DF093CBEA
-:10C7E00019F613589B81FECE04B04394FEF09DD3FE
-:10C7F000609CE750EB889C37BA41069B87D42E7823
-:10C80000A3F9D51B9304031E6B6DBFD8DE05F3F4AB
-:10C81000D64ACCFE43C84BFC5C493D161BD889F276
-:10C82000BBA4F2A92E8083BAC62AD742BAD9F18B0B
-:10C83000E7B07E15200CFDB9CF2729348FF376772A
-:10C8400000CF1940DF5C3633F6FBF7FBE23FA9DF90
-:10C8500057B0DF94FEFD2EB17559D09FB84CAA9CFD
-:10C860002E88E857E4F5AC669F3713FD89FBC78532
-:10C87000321543BD868BAC7758187651F5A68B835D
-:10C88000F47746936FBFDBF5B805E5D6E95F7D78B1
-:10C8900023EE8716BF6C6236A87766572C0B91BDC6
-:10C8A00017B0A0DDBA68AFC91BA07C68D22DB1E17A
-:10C8B0007C5D4BFD2F7E2E96F6538B9EB706664011
-:10C8C000FB452F9C18CB401E9C59D3732813E1F7CE
-:10C8D0002B81EC67A6768DBD05BE2F92D89DD1CE5B
-:10C8E0003DFF9AC4ED8E532F39CA90DE84F603774C
-:10C8F00050BFC19F9AAD617AEC489299F009F5C892
-:10C90000DFAD3E2D0446087C7E378F099F5F0DAF5B
-:10C91000F734F7E72EDA6F0ED8717EED6D161FD45F
-:10C920005BD6FE37A2EF2B9FDB1D877058B6DF6802
-:10C93000AF2E7EEEEBB55300CF8B4DAC6706E9F121
-:10C94000AF287FCE6BEB31911CF2C60920B79692CF
-:10C95000C8827ABFFE64DA7B50FE99CBC4EC200A11
-:10C960003EEBFCD8F232E67DCE4AF4682FDB6FE472
-:10C97000C365ED272C382F59643D59C0E83FFC2290
-:10C980008C2F59FFFAB00FB6A09C5D166CFC9B096A
-:10C99000E86DD9DED3EF22DD2D8BE0E7CFF097F401
-:10C9A000FEFAD29A1CA92FDF9884FE72D60E9B9FA6
-:10C9B000C903EB4B9DBF17EF3EB74D85F14F3DFFD0
-:10C9C000F93615505EF15F7FDF763FEE8F5EB5CBB7
-:10C9D000289796FDEA3FE25818FC872573F970E620
-:10C9E000E9A79EDC027038F38E95A076E6B79FB873
-:10C9F0001580FB993DFF3715CF9D56FCF6EA34A410
-:10CA0000B315FBAE4C1B6C5F84741BB086E33740E0
-:10CA1000F855F6C33869907D454B23F0726ACF799B
-:10CA20000B9E0B7D29B01E94BF4B835F5BD03E3BBA
-:10CA3000E4653D08A7D7F69E38741FE44F039EAC0B
-:10CA400051F004EBCF1449AF843251BF2CDD7BCBC6
-:10CA50004D5714626AF6288827D643F2BE1F7EDF40
-:10CA600002FC16F6E137B2FC1CFBCA82F05FB60B83
-:10CA7000F03916F10AF81CDB1F9FA7F197C9FDF1E9
-:10CA8000599C6CB4FBCEB18AED5BB0706F12E17F44
-:10CA9000207C2ED9F7E341ED2C5D3E0C05E7050225
-:10CAA0009F576CB2F7E664E4DBE71DAA8BE33930ED
-:10CAB00003CACEEC3EE76640279F9A7BEE4038F4EF
-:10CAC000FCD62AEF80EF8B7EFB36F1DD997D7FB6B9
-:10CAD00020FEE1274E98047976E1E74D06F9A5DCC2
-:10CAE00006674B58CFB4770B31653DAA87F047F9FD
-:10CAF00043C087848FC0CDD31594BF81145AF7D219
-:10CB000000E78FA58103B70A63FBC3BD3959D4F58C
-:10CB1000D605BC0A4588CF0FA721FD0D844F7DFDAA
-:10CB200032AEFF32287FC2C8BF91F59702BFE2FE46
-:10CB3000A81F7E0307FE88E99936AB24802D740672
-:10CB4000ED04677FBCF7C19FEBE76F6B1FD747F022
-:10CB5000BBDE5E87D350FC3ED4FABE2DFCEE4956B8
-:10CB60000C74A4C3F1D457D1F5411BCA8F8908C7EF
-:10CB7000CAE919C3FBEB33132B553385BEF9AE0D50
-:10CB80009A48CE9F6A07BB5CE82F2F96E2396E94D5
-:10CB9000719ED3E4D4D2FD07C6A25C3B75F0258D0F
-:10CBA0002E39DD2FDDF5A145D5F443205C3E0F7015
-:10CBB0002EFC9236EF65AF44EF6FD9AEBF45EDEF77
-:10CBC00033C9FB539CFF679D66A642179F054D51D5
-:10CBD000E3191E4FE6FAEFC2BA63271D8DC77D41E8
-:10CBE0005C8C82EBAE5DE37D1BCF45D537CD74FE0B
-:10CBF000CF24CFA75628AF8D8D51D08F571B378F9D
-:10CC000029617ABC2E024E92AB94CEEFA4E4D242BC
-:10CC1000BEA70B18CE7FCD4010E1F306BD9B857AF1
-:10CC2000E983719F98719D7F8DB023FF2AB1B5690B
-:10CC3000D0DF5F55C153A344DB1F18FBF7AD36317E
-:10CC400025ACFFA5D69E0F703EEC5FED0CED32D308
-:10CC5000AB7601E5C9B26D66DA7F2D836D15C2ED45
-:10CC600093C7EC0115F29B7F5D7D07EAA5FFDC66AB
-:10CC700065781EF1DABE95DDAB502E3D2A30F4A367
-:10CC8000FFE74BD55FA25E5EB8155607F264BEA300
-:10CC9000E7496C3FFFB94C560BED3F178293703359
-:10CCA000DB9D129A84FB90EEDDE91E95FA797129DD
-:10CCB000F67BE63907F57BE65FDFA671CEFC6B2CD1
-:10CCC000E9357DFE606F2BE17A1CEC6DE5021F906B
-:10CCD000BD1D96877116639ED717BED1641ECABF4D
-:10CCE000C59802DD2FDE1FEF45FF4A583DEA6799E0
-:10CCF000B5E7E71EDA7FAB1922ED9D4219C88F8B8D
-:10CD0000DB8DE37FA3C9BB65969E79BCBE3F83F3F1
-:10CD10006D27B573A668F4AA9547B6D7EBC7A40CE0
-:10CD20008BE887B75F6A6595D1F8204DEB7771FB8B
-:10CD3000D7A38CFD71BAED3F0EFF7EAFC0E340D8A4
-:10CD40001E3BC5A35558422313816F5FB0B005C881
-:10CD5000BF1571A1910930DECB9ADCAC88813C7C97
-:10CD6000CFD0E681F531CF6C5D6710AF4B5EB4D3A9
-:10CD700079CA9217DEFE12F1790A610C183B95D23E
-:10CD8000F9E5FD4007A71E333115ECB525D690FB1C
-:10CD900051D4537BAC6C07F2F7ABAF93DE3AFDBCDA
-:10CDA000551CEC9C7A4910A8C1D67F1D6A09CBAFEF
-:10CDB00074621C8E576CC37DC36153A006C6AE92CD
-:10CDC000BC6B9EC3F51D36D33EE3EC5C968FFBCA6D
-:10CDD000B32CC3A312FE95B725285FF97BB3102DA2
-:10CDE0003EC9DC0B427D02F041EFF54C8154EA1D57
-:10CDF0004EE94A4BE52894BB26191657407E02B2ED
-:10CE0000DBCDC91E361FD29589CC87F063CEEB2EC1
-:10CE1000F0D79F00A5CB1F51D2B0DD8F52CC34EF9D
-:10CE200045A9DEEB53483F3A65B22F343A55F7F146
-:10CE3000799E17623C35189FD37BDF9D08DFE51F85
-:10CE40000A4A783C43643C6895A4BCAD14D27A4944
-:10CE50001EE5C9310CE17A563B773F3B57894F08B5
-:10CE600093CBCDD532C98FC66A17A5EBAAF39942E9
-:10CE7000FE350FE54DDAFAAD052AC507214FE38FE0
-:10CE8000D559EA453B0FE784714126A78FE8C8EAE8
-:10CE9000AA24DF94CDC9681F6B72AA6C3EA46627D2
-:10CEA000878FC9594AF0B16879A97506C113DAD3D9
-:10CEB000F7AB537D77233C6C59971AE4922579BCE4
-:10CEC00021DF0F5E3AFE77FF4FC18D119C1AAB6DCB
-:10CED00094AEAB2E2278D5577B29FFBF00B7D694EE
-:10CEE0008908B7294CB185C3ADC4901F106E8F005F
-:10CEF000DF2487F30DC011F986C5787646597F6423
-:10CF00008AF11028A81FAC6EA554FF9E3880DE3E23
-:10CF10009F2268F1B0BE1A338E23737F0B4B565994
-:10CF2000D6A43EFF2673A94CC13CF22AE2E5680C68
-:10CF3000C16EF9FB76F21B9B64A93B5CAE2DBF4131
-:10CF40004943F965AA7A9C9D088B4733CD28B52BB8
-:10CF500004570F9D53D66A7AB3FE02FE8C7CD05CD8
-:10CF6000AD50BA5EE3878D1A3F6C423C631C8987E3
-:10CF70009F6BB64C67A417FF0FE4F93E3EC4C2E3B3
-:10CF800046123CC19019F04D3252A13444F1BF47D2
-:10CF9000AD8111B9143FE545FA4838BA8AFCC78C0F
-:10CFA000055DE84F4BD0E0C65E1996302B9696672C
-:10CFB000E67A879978EA37A33D1E09D75ACF411BF5
-:10CFC000EEAF079A4FF1070B051CEFFC2C42134BF9
-:10CFD000BE3D78B41CCF4F5B1CA457533D9539E838
-:10CFE000DF63C7AC449F4E8F4F981F86BFD401ECC0
-:10CFF000BA55A9D77E8C7CDB8DB20CE8F0C1D6E1A6
-:10D00000768473B339E84279D79CC0F587520650CD
-:10D01000B8ACAFDD9F3439185768E4775DBECA53AA
-:10D02000C71BE85797AB895719E95C97AB2FA570D9
-:10D030007B6D516AE9799C4F52EF56E2C348BACFF3
-:10D0400093A794F992510F304F13DA6B6833A21DF6
-:10D05000F7A110E0F4CEFD5367BB7277A09D03BB30
-:10D0600002922B2AF203E1A9E7B56F9231DE95CB4C
-:10D070008735B699365C6F03D0111B85FE6C850031
-:10D08000BC01E887D179A047E38F224A75FA74A7DB
-:10D09000E61AE2044D798744C4573DD811144F0C69
-:10D0A000FB3B278C271D986C437B4F327B0EA39C48
-:10D0B000EA891583A837EB9D336D5EF4DF241412E3
-:10D0C000DEBF8C2DCF192C6E09EC16F2DBCA4E0F89
-:10D0D0003B8EE330467E5B933C9EE13E71B7B333BB
-:10D0E00006F72DB1A9A2615E8B527DC353C3F263D3
-:10D0F00070740D5FD8ED6EAD9FC8F17E90AAF92DCA
-:10D10000B354E60D3BB7A8D2E95B51D95561FCBDDC
-:10D1100066C434867117917C3DA0DCDAF9FDE456D3
-:10D120006D4E80F0658E9417C920C79D94AAA28C7D
-:10D13000F3569AFF2581E8EA4A840373EEB86087C4
-:10D14000FC685814FA3A7A691AC56B5ED033B06B32
-:10D150002E203DB3B988DB239A9EE1FAE96C8B83DC
-:10D16000F4D3D9B995144775B6254D41BA3BB0E112
-:10D17000F2B1088F79BD8D4C81F9CDEF9D4CE982DC
-:10D18000D65F525ADEDA0644CE58CDFAF91B664114
-:10D19000BB138F98282EA83B30E14C15E4BB5BAC49
-:10D1A0000CE38EBBB7DE93837EF16E1807EDABEE1A
-:10D1B000AD2388BEBA016E946F30D6C7786113E094
-:10D1C000A59C313D68D38BF5E7BD6E6A8B662795CC
-:10D1D0006FB47AA39DEF5C286F8D6EB7D5E2AFE98F
-:10D1E000F85FE5288457F107AB7270BD3AFFAF4C8A
-:10D1F000047984F0FAC0CAA2F9E3AF4EBDBA227531
-:10D2000022A6DE159832676254FF5A1FFDF3714F54
-:10D210008860DF125E7C71371BFCACDC8F7942B317
-:10D220007F996D80F238ADBD1CBD7C49CBE7871E70
-:10D2300060787FA1B214895EDF4F9B18ECA705DCF4
-:10D24000FFDE4CF1D0FA7CC04E253A66800F942F59
-:10D2500073357F0FC0FD260B7C3FF1BA4940FAE8D9
-:10D26000A3275F1CDA2D42F30D6B7643F9DF0FF332
-:10D27000FDD9C2DE4D24EF84E6319B27C3F77B5EE8
-:10D2800037939CAF69BA7CE3ED80DF2FDE30517EAF
-:10D2900041AF9DEA9D7CC0B3F976A8D7F30733D997
-:10D2A000E15F1CBE9AE21E4F9A8D7E82A9699C8F17
-:10D2B0005FD2F8795E6F33D91F7AF9BC863916854B
-:10D2C000E874037D9F878736785F8195FD7B711EAB
-:10D2D0009EE730BAAFF0D2C3B75EBF86F4DA78B259
-:10D2E000F7E7AFB77AA2C54FBF94AA18E4CFFCAE58
-:10D2F00016EA97815D949CAAF5172647E6F7261152
-:10D300001F30596518673C4F932717E6B7D56C90C7
-:10D310002727EDD1FD20AFA7F27DD4BCDECB89BF9E
-:10D32000FAAFEF87F47D9E3E6E17E7C7BEF56C9EA1
-:10D330001C6D3D7DEB984AF54F26441FBF471BBF30
-:10D34000BB7A01F3825C2AB7423D278E7FCFDAA2F7
-:10D35000425C4742A210B6AEF9AD8B99376C5DF3D3
-:10D36000B7CEB69487F5DB8787E5FF5E2CF5E1A1A4
-:10D37000277509E161556AE931E49BF2E62BC62283
-:10D380003DCE6F6D24389F307BDC285F3F69BD2721
-:10D39000CE17759E8AC18F30BF55C30FD8BB85612C
-:10D3A000F8D1F112D9BEFBFDF95F3E80F2E7116EB4
-:10D3B000DC0C04AF7E78CB8D0EB7188D3EBB41DF01
-:10D3C000FA086ECA0B4791AED73B3C48D703C36FF0
-:10D3D00034F30D06BF01EC57B0774C69785F017DDF
-:10D3E000B4780ED9CAE96028B8F58DABD14171F493
-:10D3F000F514A5E97450C55460D8E396A1E8E07E21
-:10D40000A6DA0659C7053A78D84007459BD7131DB9
-:10D410007C8AF6CAA8FEF83F6E51E3A6E0B94F93A6
-:10D4200089CE958EC7A8A9B7F1FC3894C7C7E3FC8D
-:10D4300037E2398D9E5FB87344DCECB0713F690010
-:10D440003844815F51DA00F493A7B28249FF3CFA75
-:10D4500039618E7EBFEFEAD4E2A969A83FFCD1FD15
-:10D46000B57AAACB6B53BCF3C23E13F5E771E7B0B4
-:10D470002F0350DA9CEA9B8E745197F0F33B511EB8
-:10D480001C3F2E90BEAD797FE528D46B917602ECDF
-:10D490003F1BF0DC73A529D64F76A854B99DCE4129
-:10D4A0005589ED2CC47D4AE5968F46A0DFB08A529F
-:10D4B000A6D9A12B4D977A9AC82F5BF9149E930297
-:10D4C00091C8585F6295746E0A82B014F39B1DFC7C
-:10D4D000DCB54AB2C9D6B0B884E51ABFD45797FEB6
-:10D4E000F223F443DB5426A7627B2E3725C6EDAF2B
-:10D4F0007FE03CC3F4BDC5EC933DB80F155829F24D
-:10D500008559F2D1FD27B32B799C1A8687CA347EC0
-:10D51000DE6EEFE868C885F6F6BBFE20A31EB4C237
-:10D5200038E867B3654967C3FDD5E6E420DD6F627F
-:10D530007961DFC1AE721640DEE00780F90E621736
-:10D54000BE2C785C5F223DD67078142188207D67E0
-:10D55000EEF03694CB45529D09E38E66DD3582F2BE
-:10D560009BE77C33B22B0A3DCC7A655D27DA33B377
-:10D570005E499F83E707B39C233FC614B60BB618DA
-:10D5800068FF9AC0824D905E657B9CE2195FD3FC78
-:10D59000631D980FD38B1D1ABD819D337D0FA4B3DE
-:10D5A0006C7EF3DD057DFEB4C871376B7CDF610EE8
-:10D5B000A65C8A7400E3E03A7EF64AE0C7A0FAD996
-:10D5C000EDC1C00D63003F77B01E33C2D1C7643ACE
-:10D5D000F7D0FDBAE5CCA3E519ED4FDFAB30EF4056
-:10D5E0003A89ECEFF610EFEF671DD01FA4771CEE21
-:10D5F000F93754CBBEA03CCDC1C2FADBEF39E460B1
-:10D60000FDFB8B84B347B299D430B8028AC470B89A
-:10D61000F7836F7CD9756CECC07CD6076F3E8F4862
-:10D620007C7C8145C0A76D69DE5F23BFA969DEBD33
-:10D63000C8BF15B61EB70474732CD9B71FBF2F35DA
-:10D64000F97252011EA7B37DA352102E9DD1CF5F58
-:10D6500023F93BAFECF463C83777D4480CF1BC76C0
-:10D66000DF278F215F9E36031FC17EE0B5559FC423
-:10D6700022DD2C01060C97271F548D20FBE9ECDEE0
-:10D680005183DE1FF940F397746A7CA2AFF34E64B6
-:10D690004018EFCEBD0EDACFDC5965BAB0CF427A72
-:10D6A000BFB38AC78730A973ECAD06BBB36EC07E2B
-:10D6B000701F11D94F77B56F3BF1BDE49B8476F7AE
-:10D6C00089EA05DB51BE44CE73A4CB77228DF4DB0F
-:10D6D0006C43BCEDDC9685DBC3F950AF5F3B807CCF
-:10D6E000F58CD2CE016D7C3CA6FCA0D83989EE6BBE
-:10D6F000D28F3D64FB5008A387A1C6637957792F69
-:10D70000C805DC7FF944E64CEDDF5F643DBD7F5723
-:10D71000D595ECC4045C9FF7FFA5A50C3D7F8B8BD2
-:10D72000CFDFAEB5D3BFDB7D7E8676A1FDAB78B211
-:10D73000133CA3B8FFE11F9A5DC09CB05E6430FF4C
-:10D7400066EFFFC67A61608A17B66FB5468D2BCA41
-:10D7500074491C2FC143C5B628F3EBD75F48621745
-:10D7600053CF338AAF1FDD64E4EF1A1943FB9AF2FB
-:10D77000AA5ADA673782FC407D10399FE34D8F2A21
-:10D78000A807EC16BF827ED1C691A9B96BA01D482F
-:10D7900035F2FBD863FC8A14FE5DF307D9D7F81580
-:10D7A000DCDF368EC8A0EF7A7F8D0297B33A5F3404
-:10D7B000C2BEEF79F28B795C3331AEF4ADC0F45870
-:10D7C00068B7632D0B99DC8C1D74678CC67DAEBF6A
-:10D7D000DE42E77B8DF962FA5CC8C765DBC83FD6DD
-:10D7E00096109A85F76B554122FDEA4F50AE8D4554
-:10D7F000FFEE9AB44E947F07EFB6D07A9B27F3FBE7
-:10D800006AD6291FF9AFC4FE57300FEAD51DBDBF38
-:10D810006EC57702D4A3B09F45BF21760AF268C7D0
-:10D82000F4B376DCCFB930AE0EF0B1D51CA4796D6F
-:10D83000A9B152BF5BDA2C65D1F0F779BA44EB0A93
-:10D84000085D141F9CC4827684EB83D3676ECE83FD
-:10D8500076B9794CC6FD7C73C1596DBFE935F1F3DA
-:10D8600028DD8FC8ECDA79964D3BA7B285C7173E05
-:10D87000EADF4BFE43C78C204FA78BE47F8E9CC70B
-:10D880000A17A77BC7D4CEE9A8271C852213D0BFCF
-:10D8900099C7045C973C7D075DD2C8CD6703B43758
-:10D8A000517BD90BED0B797BF409C917D9BEC2C5E1
-:10D8B000E30CD7A31F0ACA03668F702DCC23708395
-:10D8C0002CA84A5FBD7A17D7AFDBA1FF10C9D100E2
-:10D8D000ADCB9D1F0C21BDB92B44C2D3FAA2E3747A
-:10D8E0002EF060A1EE47F5D03CB6D61C3980F6D7B5
-:10D8F000D67B19D9495B518642BBAD37B0003F4F4B
-:10D90000621928DFB62CB45C4FE7F905007F81D29D
-:10D91000A8F39E9D6E237CBB573F18C2FBFB311EB4
-:10D9200020D45C4AA3D66F4CE770DA620EA4A37FC2
-:10D930006420BA287371BFAABB4AB3AB98DF85785D
-:10D94000DDA0C187DD3A9EFB1724AF121EC7D5A705
-:10D950004FB81F03D64771AD497516D247E28CD038
-:10D960002C5C5762BE855D938BFCC5E1A68E117958
-:10D97000DC190BB4227FB65D924AF1A4EBC4800B94
-:10D98000FDCD6A8985CE930F1689B3F05D848D75C0
-:10D9900016F243409EF8C5EF1DD686FCE6985A5213
-:10D9A000B6A010DFB9B0C808DFDA02D98E745CEB1C
-:10D9B000156501F21B4AF5FB118CDE37186732D969
-:10D9C000F3A17C7BBA883E5AB65D1088DFEBBD259B
-:10D9D000FEE1F0BD5E4E16C2FD002FBBB8DD7B77C9
-:10D9E0004EE9CB2E4803DE07FDC3158E4B6912E3CB
-:10D9F000572CE02796851660CC4D5BFD934771BD93
-:10DA0000EBC7D9E8FE6CF60A7F19CE37F6128B8287
-:10DA100078DDD19B349AD6576751909F3709816B37
-:10DA200091EFB7DE7D4845BFBAFD6327C60E336769
-:10DA3000D7DFAA317ECC59688938C76222CA717D86
-:10DA40005CE75B21A2A72EC1F79758F2FF1434E5DB
-:10DA500027533CF32484E78629EFE6CF8B4217D087
-:10DA6000DE993A1EED653134692CCA29AEC7982477
-:10DA7000A787E3775376C63BE867DA560CF3C7F11E
-:10DA8000AABA6FA779798FDC8F7695F3D8C9AFA33F
-:10DA9000CFF34DD223B1C71C21712CA64B66907DCC
-:10DAA000165E0FE4FEC61CEFC72EA09BDD355CEEB4
-:10DAB000B7DCC5E83D0AFCC90F836F4B014869FE1E
-:10DAC000048D42F50A64F2A3AF13956008E139D6DC
-:10DAD00046F494C67C24D722D7EB38D67837C61DB7
-:10DAE000393CC679F66AFC8D3F522A9D57A025CA5B
-:10DAF0002CE973ED28FFF68C57D271BFFD6042749C
-:10DB00003DFF5E3A6FBF5B886E9F9F4BB7737D0989
-:10DB1000B232348950C528AE0FF2622A9DDB909351
-:10DB2000DB2A72B9C0AE63A4F7E2C675D93D61E3E2
-:10DB3000ED49EF9B27C61FC46BED98DC13AA81F556
-:10DB4000B701D5E27DEEB86C0E47A7DA0747AC2FD8
-:10DB50006BEB023EA81955884094A93E2BB5D0B96D
-:10DB6000084843F51BB10F0EB15AFD2D459280EFC9
-:10DB7000900C036008503F61BAC5708E22D71D51CA
-:10DB8000B1FC7E1353128BFAC67F6C1C0BAC81F177
-:10DB9000E3BD4678C7AE786125DAE591748033B885
-:10DBA000D02F868ACF35B64BBDBD1F1F103C699E56
-:10DBB000009A96B7D80E0B00A5A55DD2E36349FE87
-:10DBC0004E3475AAE80FC580A47D30FF4B9F7ECBF5
-:10DBD000BB0BF22D3ECE67B1F92FAC44BA4CC8E076
-:10DBE000787A077DCB00E74799FC778CDB51AB4413
-:10DBF00005F1B12D348CF47823934A114F8D95475C
-:10DC00004494EBCD7B99471090FEFFCB1A3EBFDBCF
-:10DC1000D2F9390D9314927F929BDF1B6D2E101D4C
-:10DC2000285F0FDEFD02E9BDC70E880CF9BFE4775F
-:10DC3000C71EC1F7815ADEB152BEE5F54A921B3FBD
-:10DC400087766A14FFF9507A39B27EDE921D029E01
-:10DC50004FE42C08BE3E12E5B35FF25C83F858D067
-:10DC600049EF872885FC9CCD392344EF8728A8D528
-:10DC7000C02655FC5ADAC2CBD9AD89B48F1A63EDF0
-:10DC80006AB80EE6F7E8D312437D69B206D3E743DC
-:10DC9000BFA6179DA809FAED8F1E9D114A47391E90
-:10DCA000534961D0FDE677229DCB59F70CE5F72368
-:10DCB000A1DF84A91C96767FDA0194976833E3BDCF
-:10DCC0000A87CAF5DC0629E0C538EF0D2B7C161C47
-:10DCD0009F69FB97C625E54F229C4F6A7A8F552E88
-:10DCE000A0774CDC1ABF38AA5871B47D56AB2B868E
-:10DCF000C7B73C201E40FE707B19E90FB92A181ADD
-:10DD0000A5E9659CB8BCFAF946D42FCE0A91D6B1E4
-:10DD100041EAACC1772536AC60728DD2BFBFEFDA75
-:10DD2000BE2ADD4AF36F451CA7F4AD835C7220DF89
-:10DD3000DC0BA2AFE3611C7762DF3A62F475E47733
-:10DD4000515E9FC7766FF0A2E6B1595BC7A6749982
-:10DD5000524701681A677F79BFC6F101BD2B1300D6
-:10DD60005BDD44F7D182D7615E794E64FCBE96914B
-:10DD7000BFFBE535BA8AFCAEB0B0717291EE389E49
-:10DD800081EE34FB09F8CE86224054BE213F869FA7
-:10DD9000D61F498FFF74B9183E6FE83FB68109144A
-:10DDA0001757C19492F4FE72916972D1C6D410CA09
-:10DDB000BFFF69B9087290E4620BAC3409762AB1EE
-:10DDC0001D4D77A31ED7E5E144C4C914645FDB0D84
-:10DDD000254EDA1751FEB247FED082F191EB44EDA9
-:10DDE000BC4B830BBAA1102E5FBB14833E7D187F02
-:10DDF0008175ECE948BCBE00C6DB5C366C1CEE2FBE
-:10DE0000ECFE17C93E7017F0F81577153F3F77E421
-:10DE1000CD7B32FC5E5C653AB7D32B75FAABF2BBB7
-:10DE2000709C0DD82FCAE73C0BE9CB475990EB43C8
-:10DE3000CD3EDDE6D2FC241A5D45F249A47C9AF081
-:10DE400087E41294EFE98255C6FD1CEAE783A946F0
-:10DE50007D8DF4A2EBEBD6CE3509E80FCBD5FCFDDA
-:10DE6000B936639CC365195C9E99D3F93CD68995F4
-:10DE7000B4DF544B44DAC7E9F477418F47C031121D
-:10DE80007E48A86B27517C0CE5E38A7B18F2EF36BD
-:10DE900020597CE32D2E5DD1E2A6658273DBCFC4D1
-:10DEA000F1282FF77494DBD1BF2EB86DD7E2FE7046
-:10DEB000A3C04228373716BF4971254D55D0332CA2
-:10DEC000CA992FCEB68CED8F67E063DAAF3A546B08
-:10DED00027FAB582A11D14B7D01438348B713B9644
-:10DEE000615C4A53FE9A8C4528DFF34B0B11BF6DE2
-:10DEF000F5168A9B91F359543FC2E7B88F213AF93E
-:10DF0000767ACCA1EF2F2BA2EF2B4B33F8FE3628DD
-:10DF100081A882F964E58B1EE4FFAC3A4BD4795CAE
-:10DF2000A9E1293383DF0F6BAB3F944EEF668995F0
-:10DF3000013618BE60FA6B52C3F03179007CB874B8
-:10DF40007C483A3E1266131F76758A5CDE925EDB71
-:10DF5000C0E4DB503FAA9516B2631BCD7C5FBEA325
-:10DF600040E30BD9D686C4F66DE93A6E8948F7705E
-:10DF7000B28B44DA273A2A9EA7B8A64759CFEB2896
-:10DF8000EFD4027E7F3EB2FD1D19DC7F159414C1D3
-:10DF900043FB698E47C02BCD67EB88D4B6703E6DCE
-:10DFA000D5ECE8561787E3D6FA87894F2F769EBAC5
-:10DFB000DCAED5ECE8855E9F05D5812A944E4B47B3
-:10DFC000FDF9047F878A999C64977F8A4DC2FCB2D1
-:10DFD000ABB27C951961E743B2B752C47A57E3BB41
-:10DFE00042D0FE9320BF0FFA49F0D7C5F40E978FA9
-:10DFF00011332F649D023139C8D09D907749412A51
-:10E00000772D80B924D0ED48CADB6CA0176142A7F8
-:10E01000ABF9FD8B6E7C5F92DE9FE4EF4B7EAEBD75
-:10E020002739A6755DC9A3389E22F950667C86EF14
-:10E030004BE2FDE7A277292EFA14C8DAA6048C87F2
-:10E04000E1F7B7E5FB982C4EC6FCFA128C7BBEE7D5
-:10E0500055AB764FB2730DDE7B795C8475439B665E
-:10E0600009F4FD702C6A102AC3E878F7159D7178C1
-:10E07000CE773A78CBA0FE63BC3F48F3CDE078DAA8
-:10E08000E4584AF7CBE639436E6C7F60CF534F6E4E
-:10E0900081F13EDF67A3F74C363B96BAB1FCF347FC
-:10E0A000DE76A3BE38BDEF6D4BB4F3C92552701AAE
-:10E0B000DE23AB50E3D91A987F7170B685E24F76B4
-:10E0C0001DA0FB694B649F05FBAF68DD43F9AB7690
-:10E0D000FDD98DE5EF67703D713ADDE746BF445EDF
-:10E0E000AB352482FED93DCCBF28EA397B86A8CD4A
-:10E0F000FB55EA7FB3E3D5438897D38F58C9EF76B2
-:10E10000E091DF51BFA7F6BD48F3FD7CF7DB77A0B8
-:10E110003D5DC19807E5F969BBE6D7B375C685EFE4
-:10E120006F5FD5E0A1E74FC76AFBE0AC21EA69E782
-:10E1300031CC09F0A7FB039D7178BFF073B3CF8298
-:10E14000F0588CF080B418E080727F7150A0792E66
-:10E150006E6DA3FB568BF772FFE0628017C1A5F5C9
-:10E1600000CDFF5806971BA7F6FDC54DEF52ECB545
-:10E17000D2FE595FF762A7CF8DF0D1D70B70E0EBDD
-:10E18000DE7D71789AA7E3A9F5CF34AF8ABD7C5EB6
-:10E1900015BBF83CE6ED053C39114FB309FFA7F676
-:10E1A0003105EFC174EF79FB33B4674EEFB32968E3
-:10E1B00057E8F3CA02711B371EF988EB63B6572084
-:10E1C0007DCCA44E3ACF5922CB32BE4F70A13C60D9
-:10E1D000097079DA599209E5CF3C24D2FB964C0EAE
-:10E1E0005E8AFED53319FAF946A71BFD62BBAFF074
-:10E1F000137D9E8CD5E02D75BA317E6673A6EF4CEB
-:10E2000038BF9FFEF0C54B71DD2B4D95BFCBC6715E
-:10E210009EE2F1A1E78755FEF5019AF770C3796395
-:10E22000640A708BC3F3EF7C91F9E85EF2DED7628B
-:10E23000C2CFA14D99DCEFB6D9F101DD473C8DEF9E
-:10E240003CD27C8214A735D25BEEC673BE93CCE978
-:10E25000C373D9CF9F788DE26DBAD375FF5327D59D
-:10E260003BB5F7B5444CCBB5787816B885E418C003
-:10E27000B1C1363E9A7CD4EE1705F8BDB133020821
-:10E280004CD4138FE970AEB4CC349CEB70399AB592
-:10E2900035B783FC2D81E8F7CD22E56FDE4393E9A6
-:10E2A0005CF91C8B7EAECCB438B995A6188ABFD960
-:10E2B000ECF805DDBFAD52AD32DE5F39AEC9C58FBA
-:10E2C000B4F716CEC7C4A922D0CD4B99BEE199139D
-:10E2D000FBDFC32D6F5EE246F896E3B9076D6A7601
-:10E2E000DC807189140F3A85B46D88E067D6CB5B0A
-:10E2F000797902CF4FC9DCB31EDFC344F8723BF516
-:10E30000495E9ECBCB7FA295CFCF281D9F49FA8532
-:10E31000D13B4560912574DBB80A8F068F3EB84823
-:10E32000AC5BB7ABA1F2C24CC6E336324AA7E27A85
-:10E33000A058E07CFFFDFA03BCABB6C4FF867E6C40
-:10E34000FF5DFD04492F893E7CE30ABE79B8FE7B60
-:10E35000BC84C94D09DFBFFFEFDA7EA5C92B9E44FF
-:10E360003A8C1789EE75BEEE7E64D438DCFF5B1AFA
-:10E37000EE0EA1DAEC8E2DB1A4C3F7730A3F3FB9BC
-:10E38000EBA14D86F755F534F21D5BFD1CCF32DC59
-:10E39000783EDB92C9E5514B669FFF0DCFE546E223
-:10E3A0002F0ACFB7A452280CB7D359A588F187F903
-:10E3B0001D367AC7F712068202E63F9A8544D4DFFB
-:10E3C000635817E57F802080FC38A698303F81F5A0
-:10E3D000B8A5E178FE1C5A8B76DAB1645F13D2D906
-:10E3E000978F747E2040F9CF337CBFE982EFEB3307
-:10E3F000F93EC8096621D2B38C29D0A1E898E18AF8
-:10E4000026F72FC053964E859FB7DD2C791F223AF1
-:10E41000665972B7A30FCEBA3C58A4BDBBA4B7FFD0
-:10E42000ECE9A786D17B437DEF850F7A1F785ED517
-:10E43000C2879E983048B9266777D7046E0BD7F706
-:10E44000ED1A9C9FC9D4F5805FD70764C7FDEA66C3
-:10E450006E3FEDBEC2BBE67194B7AD26DA4F9F6C3E
-:10E46000FD0BBDFB78AE94915D37D0B82723F07ECD
-:10E4700072E75319FCBC2360D0EF0B9F7CE9D2F00C
-:10E48000784B00B3923C89BFC341783FE451AD263D
-:10E49000A4D252F2C75858258F53C1F90EC777B886
-:10E4A00082943A5927A571AC875299C9E49F4E646A
-:10E4B0001E4A935929A5A9AC52E0F69D9FD20C168D
-:10E4C000A4340BED53F4F7B01E4A15BCF11916BF76
-:10E4D000310C4F4C87E37BBCA5FC7B447C9084785B
-:10E4E0009C10459E47C40549ED5524CF312E684404
-:10E4F00072FFF71474F9BD39B3E43D94A72F657A20
-:10E500008F617AF8D9DFF3FB15EB05B2AF4FD8670F
-:10E51000581440DD33895E7A07441559E94ED0EF2F
-:10E520007375FF3FFEE871C208CC16F3A9F0F81D21
-:10E530006673E6E379F11CADEA1CED1C648EE60718
-:10E54000C1F7CDF83D3D0FDDB79FA39D3FCC89F0CE
-:10E55000BF30BFD5E04751F11758C71CBF40E70691
-:10E56000736266BCDAC506A693B0FEE8DE5F798406
-:10E570001F6A487F56447E6E647B9BC06CA9F89DE1
-:10E58000D3D3333F54C8AED3FD5940700AB56BB0F6
-:10E590007E487E21FFD5DE70382565F17DABDD7FBD
-:10E5A0004D5CB47797F4742ED867E6C4FEED6147EE
-:10E5B00098807CAFCB619DCE7371638B7C946F0927
-:10E5C0000C1697AABF77DDF4809FE1BCEDA155F44E
-:10E5D0004EF5BDD92AF96A6D0501BA1F10931F7057
-:10E5E000A951E6D784EF3A037F35C51ACF4D966718
-:10E5F00071FE5F9EC5CFB50F5D925A82E7D9EB14CD
-:10E6000091EE0DAF53F8DF2D589735D43BE536C367
-:10E610003DF9B549DBE81D20FB57DB19DA93762974
-:10E62000FABD94DBB4F13769F537276D233F49C351
-:10E63000087EBE1F59FFC08887E9DDC7C65CD8EFDA
-:10E6400062FA804AFDD78F78B80CDBDB428D86FBFF
-:10E65000BCB3B3F8BEDAB697D3A329CF121886F4A9
-:10E6600020F929BE40AFD738C079D28D595C2E36FB
-:10E670009903744FA649B3879667C56D407B675D64
-:10E68000D68EA3C8AFE7F2189D37DA434FD339824D
-:10E690002DDFC2EC82F6770230BEA32048F8416736
-:10E6A00053C840B7317DEF6C98FAF75FF78DDF857F
-:10E6B000EB6BCCF5D3F843ADF74A8D4E1B35FDDA45
-:10E6C00068379EA35568F0BE5E5B97ED1546F26411
-:10E6D00010B890BD77E3D61137A27FCAB67F48380D
-:10E6E0001AEAE7B2B2F868FC1229FF9D0562C43B42
-:10E6F0004A02CDEBDC5E417B6F91BF63D1670704BB
-:10E700002DD8EFBF6D2D3F782DCC6791CFE9C5F89F
-:10E71000C9A7B6EEA07BFA8B5F34537CC2C8AED9D2
-:10E720005C0EB6F27712F5F78D2E69B51ADE9B5A9C
-:10E73000C2C2DE5184F1161F3B798CD13D63E37771
-:10E74000FDDD8066FC10254E2DF2DD8187B222DFD3
-:10E7500023D3DE1D2888EEA7897C7760575024BD1F
-:10E76000B11CE358691FB0AD04F73D55C704F21B57
-:10E77000F4E743E5B13C73585EF0103DAAB131DED9
-:10E780009D51F8E9BD6C4E2FBBF1508DECFEEA0DAA
-:10E79000A12C4CEB189E37D5AE90643CD7AE0DC47F
-:10E7A000D0FD925A590C60DC48766C890DFD8F2C97
-:10E7B0004194F11EDA34D354BAF764B9579A40EF52
-:10E7C000B3EE58D489F7EA6A5D12433ECE4EE0714B
-:10E7D000042C5DA4F769EAE43713E6E03ECEC9EF06
-:10E7E000E9E5C82CA00868D779199E2FC366A53221
-:10E7F00004A657B6E00DE17B576CB255DEC9DF9930
-:10E80000B971DC24F203D3CF81B669A1DFE2385EAF
-:10E810005B29E2FFAA7B93C91E0CB84C0CE3003FB6
-:10E82000CDE2E78296D892D0FB38BF590EF2ED06C2
-:10E83000543111F1F07ADBDA99D7C0777340A278BE
-:10E8400087FCAF6B6FBB06DAF7B459E8BE850E27BD
-:10E85000A54E32BCDFE05E6DCC5B22DEAB9058583B
-:10E8600039E4DFC179905D55C642E171BCC95E7E75
-:10E87000E82E3B894EBA813FE9FC43CBBF8779A0A4
-:10E88000D776B39FF0DEFEBE40FED5836DF37248AF
-:10E890005E3A966EC7BF635275949F630E249F9F26
-:10E8A000CE52F47712ECDA3B1576F47B45D2535D09
-:10E8B00035F3609CA12DD011331AF17BD8ECC1B097
-:10E8C000E67A4D3E4A4E2EC775BA894CEB23E8AF27
-:10E8D000DEECC9F743FDFAAF4DDABEF1F48D485FC7
-:10E8E00092ACD0BEDA9CC53C680E9B933B336498D7
-:10E8F000C7E8172D1EFC7B07D39E2B8847393FFAAC
-:10E90000B55924DF104E882FA9CAE2413BD95A9548
-:10E91000EC9126603D27D1E559A785EC21A9CAE1F4
-:10E9200027FBAB6D924B09937B6BAB658F64C6BFC6
-:10E930008F63A374ED00F23E27412C45BFAB45B376
-:10E9400097D3B475A5653B284DCDE6F273BBA4CE35
-:10E95000A4F77B816E30EEE6C06A4EDFCBD36DA4A8
-:10E960003797BF3E3C6D30FFE093D52E4F1E0076AB
-:10E97000DBEA72F2DB16AFFAA811E96E79AC4D460C
-:10E980003A34C58DDC3C15E9FEF766BAE7591B3B06
-:10E99000499913D69F29AEC885F030896A06D2738B
-:10E9A000C163C11BA5C94827EA16BCCF5F98DD7AB1
-:10E9B000A304F2A53D56CDC0F3B2A9D95B793E457B
-:10E9C000DD22209F6407783E5BCD10213F23FB09A9
-:10E9D0009E1FA16EC1FCADD9ED3C3F86EBA3DBB31E
-:10E9E00077DD88FAA8D6EC2943FFF4B330FF821113
-:10E9F000F87783787A870617BDFC79FC6EC6BF333B
-:10EA0000C4D3C8F217B476FB0728FF8D56FECA00A0
-:10EA1000FDBFAAB50B0DD0FEA0D6AE6380F687B4BD
-:10EA200076870728FFBD56FEC600FDFF516BD7391C
-:10EA300040FB37B5766F0DD0FE88D6EEE800E5EFE7
-:10EA40006AE5C722FAFF40ABDFA57D77C736BC8BEE
-:10EA5000F69A1BE415CA93FCD806F2776DAB2A240C
-:10EA6000FAAF9DC8F5BF4EEF6EED5EC0916C7E6E45
-:10EA700073249BDB01551A9D17AFCADB3815E9F0EB
-:10EA80000FFC9E22E88FA3780F575D25927F6FF9C8
-:10EA9000EBFC5D99E5AB243ADFB8A0F7B4F6FAFCDD
-:10EAA00003DA3CEBB4B4329BBF9791ABBA3C33C2B0
-:10EAB000F4A35936E66DC04F18FF5F97CCF54CFEB6
-:10EAC000AA92063C37A9053D83EBAB775A42E8FF93
-:10EAD000AA97252AAF4B2EF1E379BF2A4BA487EAE8
-:10EAE000931343F84E735D5DA1E1BDCF3A59A2F790
-:10EAF00063A484AB6C739C283766C8283FEB989C52
-:10EB0000584CE76AB04F437D525522A3DCC94D48AB
-:10EB10004E44B93C3787AFAB23B6DB8EF728A4074A
-:10EB2000447A2B60A42C11BFE7D5890105E6D121D9
-:10EB30002F27FFEBCE16ED4C91F1F3445DCEB7FFDE
-:10EB4000621AE9B15AD0630AE931163F2EB5EFFED9
-:10EB5000A6746CB405F5969C61626690CBBFCB4EF3
-:10EB6000A471773EC4F5D608D05BF8CEDAF642C67B
-:10EB7000DF7973D9C8AF5B2E315752981FF377D91D
-:10EB8000DC8E67A6191EDC678FC0F710C3E03BDC84
-:10EB90006FD45BB943E8AD9C2A909761F5AD2ED94F
-:10EBA000900F666BEF2A799807ED9B69CF6D257DF5
-:10EBB0007216F50943FDF2C798D1A85F408F5859E6
-:10EBC0007F39A8CB63DD6ED1E574ADA6376A23F437
-:10EBD000C6D072F7EFAF8F22FA140DEFD00C247F5E
-:10EBE000AB304E00E8DFEC1348AF30C947F7FB8786
-:10EBF000829BD95C2ACBCEA1E1674EF92201E5B414
-:10EC0000D927793E8A724F6A28F8EAF52CB6CCC724
-:10EC100050AF7D716C653EFABDD69A3B67EF42BA44
-:10EC200015E2E97E87A2F91DB655EF672746603CDD
-:10EC3000FC7B5BEB26E0FD71AF4CFE92F41205DB32
-:10EC4000D9619F9E44761CDF6F32D9E75F84F6FC62
-:10EC50008B1605CF050E3FABBDDF90ED2478DEB3FC
-:10EC60006705B5330B952E7EDECF08DEEB3212F949
-:10EC7000DF0969B76976E3998DDE3CE857EC1250FD
-:10EC8000FFFC474EDB461BEA0F6D3FC058DB4DB81B
-:10EC9000FF09062C5A7DBCE8CED81E51D0FDCF5EB0
-:10ECA000C9156E875A6EBA2A0BCF43E5D112F49775
-:10ECB000B1CDBED17C05968B7A7B2F5E1E42F1A52D
-:10ECC000E725C0C3331D5AB99AB6F12A98CF1E8BD7
-:10ECD0003E3E18D445389EA8D193BC11FBDF5DA2FF
-:10ECE000B7EFD9E89D4AF3B9DE047BB07C77E646FE
-:10ECF000677ADF7C87E7E46EAC81B59F56BAE27035
-:10ED00001BB7A4EDA354D4DBEBCAF8FD616400F497
-:10ED10008FE8F7882FE06DEFCD2ABA62FFF3D03F7E
-:10ED2000E20AA06899A9EB9003E0B6647FA5CD2C18
-:10ED3000E2FB5DA52ABEDFA5B75BB27736D939CB3A
-:10ED40005E194769947687F1FECC776867B35CC437
-:10ED500078A7436F2EDDA5E0BD99CA06A789EA33DF
-:10ED6000EEFF8ABE3EBDFDE95D6FFE04C73BA374A6
-:10ED7000A55E07B5D785002E51DAE9F5F5FBD55329
-:10ED80005CDECBDCC07FFF70733E6452A507EB07EF
-:10ED90006D7EBAC76637FB4B519F002A0318A7A0A8
-:10EDA000A753DC79FC5DEC88EF91FC15B4B1A41994
-:10EDB000282F574874EE1EB4A98EB1906F817D4AFA
-:10EDC0000D4C69CDB823E3315EA0659F93E47AEDE5
-:10EDD0008A0E5701F295C7C2D0EE6DB9A2331DDF7E
-:10EDE000BFAFBBD752F604D26F68B9EBAE303B6C05
-:10EDF000780E8FABCF4EF097213FDA811F511F372E
-:10EE00009A7D367C37454D1729AEDA0EE56F50797D
-:10EE1000B656EE997E0DEDCB4419E7559F37777ABC
-:10EE200009EA355722FFFB8423AE2A9B0FE501D95F
-:10EE3000222379DD9D53EE43383D23792A91FF9EAD
-:10EE4000713A658CC7025949FA401A914CF15956EA
-:10EE5000EDBE53F638AEE7F57936B9B9FDD0E4B674
-:10EE6000101E5A623B6F2E867631F789B20AFD3743
-:10EE7000DEFB7029C6273E76EF913F637C6B53AA79
-:10EE800044EF0CECAE0979B15E8FC03A77801DB9C2
-:10EE9000BE6A6627EE47D73345417B7DB730D38FB7
-:10EEA000FAB92745623BA07E4C9E315ED559608CF5
-:10EEB00097CAAA30E637E6F8EEC7754DF8436131D8
-:10EEC0008E9322280A3E1D5CD8C9283E3F352F4F1D
-:10EED000C6B8EEB8C28838D8A9C67E12AF32962717
-:10EEE000CF8888DBBAD558EEBADD98CF986BCC7F47
-:10EEF000AED3A38B9F3FE87FE7E1B17B9F64A8A7D8
-:10EF00001BBF8AA778568423DAED3123250F9E8B09
-:10EF1000645B3A67611C1CBB3486ECA583EE18A6C3
-:10EF200040DEBA94913CB526060FE07ED52ACAA5EC
-:10EF30002A69A8E081F7A1DC01FB5594BF91F0CBD1
-:10EF4000CEE6FE416725FF7B7141294476847D55DD
-:10EF5000BC5CE3C1AD63841FB6222CCFE3BD1F7739
-:10EF6000F3F338BA774F477284575819E26D320B72
-:10EF7000E03B94D9F77EA486601EEB95BC4AB4337F
-:10EF8000D6895D348E5AEEF4E1BE3B05E3BC4D18E4
-:10EF9000EFAD521A898FE7DDDC4E52D85C3FE2D1EB
-:10EFA000355BA4F891FA43317578F852AFBDD7A01C
-:10EFB000C7B1E974F9B29BFBE7F67488A217FDE0CC
-:10EFC000B7E7ED407CEBF9565F721BC5F58FABECF4
-:10EFD00042BA6437703B14F400DDCBD6E3C4F4B816
-:10EFE000C2EE1C1EBF763A47BC80BF901E47141667
-:10EFF000074E4777263CBAF0CB78DE933DAE5446B9
-:10F0000039F34BFDFE05E3FDE2F385746E3043F406
-:10F010005EA2F9D3D1AE4BD2C64B4A96BCF4BE3BEE
-:10F02000CC4984FA0F315E3F296FEF4ABC77B507B0
-:10F030000907F9E72E0EE748BA4DEFF0978E4178B1
-:10F0400009A00FB3FAD3B1E06EA5F3C0FAFB58A242
-:10F05000755C7FBA9E68E2F64FCF4285E22C87A2AC
-:10F06000F393EE04EEC74ED922A37D9B91F7500D8A
-:10F07000DD83B98FC9A8EF323A3A6F46BF57243FB4
-:10F08000041C71E3799CDCB7F3C39B4C9C3F589AFA
-:10F0900044788B8C2F8D8C271D9E93A0F929400FCF
-:10F0A000C4E27D00F94A8C13EC59C5E89D809217A3
-:10F0B0005B6EFB77E8EFCB111619E575CE5BBEA74B
-:10F0C0001C30AF2F5FF2E5A09CDE2675D913C2FC81
-:10F0D0009E92C8EF9F45CAEBE139A246AFA0375CCC
-:10F0E000DF3DCD46FA06E20AE6A58E968108876FD7
-:10F0F000DFF4275BCAFFA0DDA2DAFCF8F746DD1DCE
-:10F100007A3E8BECB09CB778BE685BD6465542B869
-:10F110005590BFE860F63CF21749EF727FD1189323
-:10F12000378079F69E9DE2EEDAF7DDBE00E3D5EAA0
-:10F1300053AF53503F176AFB9FF139425478491639
-:10F14000AF0FF926F27B81065FC64A3F9D0DF81B83
-:10F15000F3B885E2EEF2C5F2865CE4874613E1B3CC
-:10F16000DCA42C6D0EDBA735A71697E44CA47D011B
-:10F17000F3C18641E915980FDF614A3E5E8CF49A2F
-:10F18000036C86F22547E506644E550CF385D1A93C
-:10F19000D22B51FDE6546F498E26F7F0DCC7ACB197
-:10F1A000F43389A56C36EA65F8867AD7BC2B869F3E
-:10F1B000F7241BEF479A4C3C5EE4266DDD663CD796
-:10F1C000198FEFBD8921EBD8FEF56FD5EA49366777
-:10F1D000C8148F7EB2378ED2BDCB887360DCDF520D
-:10F1E0005C4E05233F28C285F2F7C8FCDDEE2A1EDF
-:10F1F0000F50BB9A09781650ABDD5351EFE07F8F6B
-:10F200009879BD0ABEAF425B4C05FF0B11FFBA6C8B
-:10F210002C11EBA7B34E8A63641D4CE1F112C67347
-:10F22000A76D03BC03A5FB01A42A13ED5346BF66DB
-:10F23000E77F17AA8AD13BE1F46613EE7F57B380CC
-:10F2400024F4F9E18E642BD44E3F8FDDFDF50719D0
-:10F250002897F3C51DBE37C86E889577A07E8C3180
-:10F26000F2A17E7FAD56A3936DD532E15B2F77ABD4
-:10F27000C729DE3E87F5D4E03E2BA72AD180E70BD5
-:10F280007ED9DE4CE69B10DE6F80BFAB9B27D13B67
-:10F290005D4AAF9BCAB7552B43F43F6C80FED389C0
-:10F2A0009E06EE3F8BCAB787BE48B81140B1ADE7A6
-:10F2B000A38452A5CF6E8D84B37BB5517EFF607F52
-:10F2C000643C39878BDDEC4DBE19E0667F40F4B4B9
-:10F2D00031FC7B3CC67AD373CF25F0F372BD7E2818
-:10F2E000F916AC0FFBDE3605FFBE8FB17E69F1C7A4
-:10F2F00009FCDC5DAFCFE7F7A35E63BD48FC44CEFD
-:10F3000017E695F2E3B0795D69B31ACACB66F79B4D
-:10F3100057CA4FC3E6758DCB58DF57137D5ED7E7CD
-:10F320005B079D975EEFA6A28BAB17B98E5BA65BC2
-:10F3300007803BAFFFD3B28BEBF75F160C5EEFCECF
-:10F34000AAC871542E272CDE2328E7CA99B216DFEB
-:10F350000967CE98A871C1259A1D7316FD14180F60
-:10F3600097E97D1FE55A4F368F4B39FCEC223F9EC3
-:10F37000C32CDF6751F0BC235BF35B83E0598CFC4B
-:10F38000BBC72627603CA0CDAD68FBABCE5C8CE74D
-:10F39000DBD37EE436927BCC68CFC07EAD18F535EA
-:10F3A0008830BA97F126B64B098FA3F092FD572FFC
-:10F3B0007AFE42FBAA9FF07D951EBF1F6E67B14982
-:10F3C0007D76961EBFBD491BE7BF7286D17CC0CE3D
-:10F3D000A7BF7B9B9A27517CF32F6D9D9BF0FED19D
-:10F3E0002F939313703F73589BB76E37EAF71AD277
-:10F3F00066E78D334581D7FF0791B1925A008000AF
-:10F40000000000001F8B080000000000000BDD7DE5
-:10F410000B7C54D599F8B973EFBC9299C99D64F2ED
-:10F42000E211EEE4C5044298608801AD4C12A0A838
-:10F430002C3BC147412D0E893C227921A8A1B2F570
-:10F44000864484F8206840A0A043148A56ED6011D9
-:10F4500001C11DA2A6764B6DECF661A94B47602950
-:10F4600002C2A8BB487F7F2D7BBEEFDC9B99B99978
-:10F470005150B6DDDF9FFEECCDB9E79ED777BEF7E2
-:10F48000F79D33172FD27F93087928892C0C1413FA
-:10F49000FCC7951162CFCFEFE9741232BCD42B8E2A
-:10F4A000A3EFDFC9D111329E9087E983D07AB9509A
-:10F4B000F06FE3E8DF22212BCBE9F7D030979027DC
-:10F4C000C57EBB40EB9F7408A2CC413B09DBED7CC1
-:10F4D0004BA7F3380879EA8EFC1EDE19296FF03944
-:10F4E000B64279B88EF80216E8445C44E8FB9D26E3
-:10F4F000D1DE594A8B42BFB3C64ACB3B7E7F1B67E6
-:10F500002364C40882FDD5B55693635711B2DB104E
-:10F510007EF322CC673DE7DF46FB79ADBB74AA40A2
-:10F52000DBCF3B4988997E5AB7ECA6278FA71132CB
-:10F53000E1B85809EFEB36DBDD3C7DDFD4DF321577
-:10F54000C6212DC45DE0262493AFE4ADB49FCC4723
-:10F55000DE73B7D329AFEB95F6846839BC9573F7A2
-:10F560004850BFB87431C0C7E2912C74BD7361AA12
-:10F57000F8DE3E550FED6E32B83B683F67F4641617
-:10F58000C0F1A20257F539F70EA982D0F9CF0D2CA0
-:10F590009B8BE38A1464D9B46C12711E26494C6D9E
-:10F5A000A3E5CC2462328F23A47C85D8F7008C5F3E
-:10F5B0006F157B288C6D1562DF8F605D2D3922EF12
-:10F5C00086C1FD0807B5FF791EAF81D07147EF30C6
-:10F5D000D0CED83E5EA4FF8D09C496C7EE892D9784
-:10F5E0000663CB57BD135B7E5562F09E681ABAE581
-:10F5F000388577EF012381F92E3A9DE4375278EF71
-:10F60000D31302EB975F32223E542FB278003F4E65
-:10F610009F4ADA6AA4E5838793F0FBBB7F6266DFCB
-:10F62000EB022F43597E3999C0F78BD202E5A974BA
-:10F63000DEAF7FC9DFE92D66CBD243FF2F176DED1B
-:10F6400084FAAB02E5227DBF7B1421FD502FF84BDD
-:10F65000609DBBFFC663BFE1E78DFE1EDAEFE9BD2B
-:10F660003F7E19E075FAF9A1A91C9DF335BA9EAB4E
-:10F670003AA1BECD2AF5D0F7134FBF98E78BDA97A2
-:10F68000453B8C31EB5C2C71B8CE56C1B3E259D8F6
-:10F690009F437AC4A725F3FC7541DA7E0997E39668
-:10F6A000A11F03C5D36228BB33ED145F27DA18DE30
-:10F6B0002E31D3729C7D579FB51B78E2BB2A523EF8
-:10F6C000BAFAC7381FD7C9F711AFF7E9655D12C09D
-:10F6D0007135E7DE46E7BFCF6C2B2129F0CCF10373
-:10F6E000DEC81225BC745CD78F9A002F7EC5BB7B09
-:10F6F00048E2F15C597FDA3CF9AAAFA8A7E33A4B9C
-:10F700000839F751D29D1E3A8F911B62F7BDC81F71
-:10F710005B5EA5C0A79644BD77C27C725766219DEB
-:10F72000109C8FEBE407B739E97C8718490BC0457B
-:10F730003BEE5A651D2FBC40FB716137FC459EF5C1
-:10F740002765D07D51E8EA758ED111FDB77428A5E3
-:10F75000B7451CE32FEAFB459A79A8FD4F94189F03
-:10F760007218DC6B42B8FF4611F6FFD483D39E3C7F
-:10F77000AE1F3C9F130F7A3C93A3DECFDFB0B82FB0
-:10F780009BB66BD8993E8E8F826FC3F36F66DC4E4B
-:10F79000DF9FD921B8810536CCDEFEF844F8EE793A
-:10F7A0003E00F3857A0F5DEF99C0DB36F86EFE669A
-:10F7B000FB385E8AB45FB0618A67B22B02CFCBA5FB
-:10F7C000D3D72A189F5B14D0FB4D401781DF4D1D06
-:10F7D0000A78BA817317D071CA051F0F74672DF3A9
-:10F7E000E8E509844CFAE25FFB86D0FAE603E3CB56
-:10F7F0003B697DA7CE7BD33F01DD3DCDBBB7015D2E
-:10F80000FFF69E0C5FD4FEBC03FB4BF7A5F3D606B8
-:10F81000EC47A6B85140997AAFABB61ACA138B0918
-:10F8200067A4FCD8769278FC16188FBCAF4B25E401
-:10F83000E4FE874A041DF2A3DB814E4E139B1BE8B6
-:10F840006E9FB5E5DF71BC97F438DEA4600A07FC53
-:10F8500077DF739CBB93003C62E9EFE4C915B64ABD
-:10F8600046D7777A510EE88883F6B7F0D931C807C2
-:10F87000D4F7DAFDABF7C7F6A3C58B8F9475016A91
-:10F8800046E397F6BBB4E9B201E8B1A195CA8B286B
-:10F89000BA6938DE652096C1E3103280BF04F09764
-:10F8A000E2259170BD66E41BF41F67A2787B0AFE17
-:10F8B000CA636542C7BF9BC3A59145A30285C0E744
-:10F8C0003841ACEAC88EF05752E1473E7F86FED9F8
-:10F8D000E906BE103802F40EB2741BC817317876F0
-:10F8E00013D4CB233CC08F860092D227F96932F221
-:10F8F000DF3352683BB67F718C5BA6AFCF01BD583A
-:10F90000B09D2D358A3FB505DEB48568F9F4CEB4D7
-:10F910002ADE0678FB4B1BACF35420ADCA604BCCFF
-:10F9200037B47C93CE0CE1FB21FC49F14E747A9202
-:10F930009D00EF0E2A74419EA5B594B6C4D937B583
-:10F940009DC3D0522A01FFF8BEC5DDC3E0463CB4DA
-:10F95000FCE93B693DB0EFD7E8742817E672AC7F4D
-:10F96000B57D913311BF9666071D117EFD84228FF0
-:10F97000557EFD8495C1E372F9B5F639ADB328051E
-:10F98000E0F7299152403EA59AEA9E013D43AD7FA2
-:10F9900022811E50EA64FCE99D838529214BA4FD48
-:10F9A0009FF3BC6500B7ACAA7E0F4FE79F7503714C
-:10F9B000B7D3651DE3DDF789147FEE2254BEC3B3D0
-:10F9C000CC67003E483AD211BE84B8A7C2FE2F9839
-:10F9D0004EF1A59495411ED77B0DEE4EAA37D40962
-:10F9E0000C3FEA7670FE760AB2BB1E8DDDBFF9DDF4
-:10F9F000C6081EC3FF6D8EAAA7E3D40BFE95206731
-:10FA000087514D29AD82E2EF73B1DF2F22419C5720
-:10FA1000C38B178DF1F0E2BF15BCF8739E6706AC7F
-:10FA20008F9B69C2F92C7989437DC06108A0FE13C0
-:10FA30005E4CE5079D2FF92DC39BFFE4BDB8EEE6B4
-:10FA400065733D77D17D38D75AE7B98B56216B80E6
-:10FA5000FD0E307D6FD1E4401FF24122BE727B1655
-:10FA6000F4E74578501889DB101E028EF7DFBF657A
-:10FA7000F8749BA2375EA39B89EB0AD713B187F278
-:10FA8000B9892F1EC432FDD772FB4478B07EE6B729
-:10FA90001011E0BA80C8064269ED01A713F7AF9EC6
-:10FAA000F41B185DFBDB3368BB26AA6F025F8BA3D8
-:10FAB0003F7C3F1A1F0F6BF0F1F015C3C709884F49
-:10FAC0009F1137E2D36D1A7C3C9C001FDB07F0B11D
-:10FAD0001CF1596D4FF550624E1DFC3DE08B276ABD
-:10FAE0009F176E8E2D93E7A2CAB98017B41C852F7D
-:10FAF0004DBB2E1A3D71F064DD80BCF717D58C89A3
-:10FB0000E6136D38BF230A1EADBB657E36F0E935BE
-:10FB100060700C513AA800F946FFC27D234113EDF5
-:10FB20003FE9AA8132D697AF6065FFD65F7B375C2D
-:10FB30004BC87ABD2F5BA4F0AAE3BD7D3A902FF9A4
-:10FB4000BEE79C6057E83C3902EEABA7D03B0636D7
-:10FB500094E1E353E35A8A5AE2C04F9DFF7A2E1094
-:10FB6000D4019FDECBF4376B59581F2D5FDF703205
-:10FB70003994D21B427C0DBFCA11B02B36726BB3C5
-:10FB800001CF36664B5C3B5D53D9AEB64AC45FCA03
-:10FB9000EB0B28DE35EEFAB06F282D974DEB07F40E
-:10FBA000A3EBF62E7E1BF8E5F824669724B76CD5F8
-:10FBB000D1FE32EF748D6BA7F8F6A653C27192AEE8
-:10FBC000EA3A08FD84174B620FED276B85ECBCA762
-:10FBD00018C66F6943BCAF21F83EFD7BCBDBE0BBB1
-:10FBE000478690541EBE236D1C7CB7329DC3FD58C2
-:10FBF0003997CC7AA518A84844BD7ED82C916B9B28
-:10FC000000E5964AA41749B4FF321BA9AC2385DA54
-:10FC10002DEB6C04F975BA8EBFB3863ED78D63E5C4
-:10FC2000D4E59CA70789772DCE2FD348A671A9ECE0
-:10FC3000BDBF18598E6727D6FB71BF33AB5B4A61D6
-:10FC40001E9979ECE930F874F974FC43EFE9FD2B67
-:10FC5000E83A0F29F8B2746B5566B45C3B74C6245D
-:10FC6000E8A8DE7C284BB5178216B0179696566723
-:10FC700002F3C8CD9F9602FBEAC889AD3FA7F7A45F
-:10FC80005C05F2FB3D9EC0FEFD97C59302F4798DA5
-:10FC900081CD5FBBEF9F29FBD97C8123FE28BA6C05
-:10FCA0009E751EEDB0E60B42CCFB330F9A08A810F0
-:10FCB000037AC5C2DEA9F05D23E95F0978D8184848
-:10FCC00026FE28BAB82629FEB82A3D345FE0891CF2
-:10FCD000775C43ECFB0B69444E8BF75D46EC7BBADB
-:10FCE0008E98F29ECF07D601EF4945C8E6A576F873
-:10FCF00074D05368F99C5F27EBC7029B63FCEBACA5
-:10FD000018B201FFA2FA480BECCB592984FAC63984
-:10FD1000CA9AA01EE4780DECAF10B6CDB446C65119
-:10FD2000EBA17DF43E9E9D652041DC9F30CE03E03B
-:10FD3000278F2464D3FE4F0C12E869FB0F22FC547A
-:10FD40007C8986A31CC56F32DAFB833A4A5725B9F2
-:10FD5000196B8B8BE896F5AA7C216BAD87F2810C31
-:10FD60005E17C32792CB06F806B2A9753A5EE13357
-:10FD7000D96B275F1B5D66DF47DA0FA981FAB26294
-:10FD8000D6BE2277E87B2B40F6922E9C1F5D470E55
-:10FD9000C06FA06CD2942DB43C26AA2C6AEA1D9A9E
-:10FDA000FA2C4D7918FBFE8C359803FE81EADC11A4
-:10FDB0003502A5D333D9C1391C2D3FDAEEAC994CAD
-:10FDC000E9B4B18CE9174DFB39374722F06B723338
-:10FDD000BDDEE20E19EA8A010EFD7DC0571AF670EB
-:10FDE0002247E9C112D819C432B493A2DA05386C9B
-:10FDF000D710F810DB25ECDFA5433AEF741D65DF63
-:10FE000005FE827ACCC31D8BBDC0D8FAF48C6F512D
-:10FE100029E7194A1B36EDA9213E4B84BF9ECDF63A
-:10FE2000BC89FCF50027027D0EE029F46B89D085A2
-:10FE3000FAFD9FC6ECFF1DA849C94B3F6913E8F7BF
-:10FE4000FFD1F897F1A077FF499123EB397F118C0F
-:10FE5000BB89F88A408E7FBFB1E0A08E7E77441FB9
-:10FE6000DA02BCB73DF76A84DF116B683847F59258
-:10FE70008772AB6A040ABF23E9A12D00CFFFC8AD8A
-:10FE800066E5E1A1E13A5A5EDDD3C4CA05A12D5071
-:10FE90007EA567362B8F090DE769FB3CF93684FF99
-:10FEA00036313E5D2FCB65FAAC3ABF87CA3C4B7307
-:10FEB000418F6E60F267CEDD876703BF9DA323226B
-:10FEC000A17C7ADB99632F6DA3F0D8D69A4C7A186F
-:10FED0003A7A056A6F6432D4A772A20BF97AD8C94C
-:10FEE000F41BCAED42E0D74B1E6F923A9D917D51B3
-:10FEF000C7CF1CD5B213FACF9C538C72C4ECF41C40
-:10FF000081F1D5E7F451EC79245764FC9BD779F063
-:10FF1000FB07AC7EF87E8D99AD8BD20FEEB345D941
-:10FF20009735CABAD6E4323D63BA73CA91DCF1A000
-:10FF30009F28F6CEAA40FA283AAF6E8E04C06EA46F
-:10FF40007A8A6C063E5C9F84F64C37CC1DEAD766F5
-:10FF5000FB653ACEED1CF1027F51F949B7DD939D67
-:10FF60001A65377697D2B225E227E8AEF1642739D1
-:10FF7000E099A1031B4AE54FDD4ED64E954F99ED12
-:10FF80006C9CCC35453DB09E6481A0BC9B37ABB02A
-:10FF9000A70DF58399386FE2F16473B4BFE3F5B947
-:10FFA0003A80A3BA5FDBCB3C2FE0BA78E6F750F794
-:10FFB0004D85EF915CE6F7A8E3A97E41F1EEF17C77
-:10FFC0001FF647F58D1214EC8ABE710490767C04FE
-:10FFD000CE44088D87F7FF1FC2AB1FF0E9DBC2AB31
-:10FFE000B195F211DD25F011058EEBB9A03E93F12C
-:10FFF00011F44BC07B9047CF3B7DC773A3E861CE24
-:020000023000CC
-:10000000038DA867AAF34ABEFFB569DF234087A71F
-:1000100090EEE6FC2019FD085A3D50B503557D359C
-:10002000911DF8A9420F6ED5EFADCC23B938F4D2AB
-:1000300063145EA9C42A021F3D62088D71D3F6477E
-:1000400074BE675F83790FE145CA4306F5F7421E28
-:100050008FE39B553C2161DB2847044F56533C31CD
-:1000600041FB1A03DA25DD76FFC6F98027B70C734A
-:10007000CB12CA61A467B93519EBAFD11D25E0C712
-:100080000F4F1045D033295E617DF7EC42BFCCFCA9
-:1000900031B219FDD349FE1EC0BB520A00E86FF60B
-:1000A00028AC077F08FA91669BD87883F18AF92DEE
-:1000B000461256EF54F0B63E17F136A39D303F90EE
-:1000C000E029A989D217BE9FC7F022B92CF4EA1FF4
-:1000D00040FF7CD4EC2E20CC6405FF12E9CAC4FE9C
-:1000E00028BE8CC81BCFE438F47BD7E3D6AD8CEFA9
-:1000F000B9CB01CE0F5BBBC832F40FEA71FE9BCDCA
-:1001000041D4C37526C90E7EF8393C595F08FDB548
-:10011000EB45C0132DBC2BF312F91F42F746FB8BA6
-:10012000E71865630ED43F6846BB40B5FBE6A430D4
-:10013000BA52ED3ED5CFA11D47B5FBEED4D873031F
-:10014000F59D7F2DA8A5FDFD59C13377EF8582B9B7
-:1001500016B66EF03FD5C25F74DCDAE5E60FC1CFAC
-:100160005C2BEB83461BF091299E50949D4636B044
-:1001700075F87EA5F7039C5A05B27E3BEC8FCCD672
-:100180004FEDD8FAE8756D32B075C93FB0C6AC6BAB
-:10019000938DC591BEFDBA3E1A1FBBAE93E3957514
-:1001A0001153066DA7C8B93B5BAD1F7225F409EB6F
-:1001B000A24FB29CAECB1559D7B23CC64FE7287CB4
-:1001C0006C90DCCD637A7C1CBBFDFFC67ABB9EF2D3
-:1001D000C45BAF769D7FCEF3FC202F1DE9262896C9
-:1001E00045F0DAB791AEAB0CF635DDDF86FBCAF031
-:1001F00093109B1BF8D89279745DF06CCB447FE12F
-:100200001CA3B407FCE6E44729CA3A09F281251B7E
-:1002100087235D52BC6574FB14F3BF2C317BD17F07
-:10022000B364B1E8964558FF2B680787297F45BD21
-:10023000A43596AF7F3D1CCC39B5C5D17030E5CC27
-:100240002D8EB3EFB211F139D1BEFF990FDFCBE59F
-:1002500025F69790E5B17E0AF0E70E94F9C165ADF9
-:10026000DF8390BF1963BF9713E051E8FBD1787427
-:1002700044AFE0D13233CA1F158F8E5815BF900698
-:100280008F08D5A2818ED5756BE13807E018C72F8E
-:1002900044F1A900E07844B1CF283E15001C553A3E
-:1002A000B8B395F1032DDCFE9498AF7DBB7568F073
-:1002B000F8DBAE43AD4FB40E55BFDDC02DDE08F800
-:1002C000B9219B88EDA80787C6809DE430F88B6034
-:1002D0005E9B0C947E91AF303FE1678762FDCEDA82
-:1002E000F95CB8647EC1FA4DC42712E1E5E5FAF97C
-:1002F0006A35703BAAC06910BEE733B9A9F5F3357A
-:10030000DBC24F83DED49CC4E4F7D90356A47392B6
-:100310001F9A03F6C2B97D4602F2A0890B15C27777
-:100320006739CF5CFCAE2D590239AEFA738FED669A
-:10033000FE5C99507B9D961B7CCC1FDD2CFF7225AB
-:10034000C0E5629ED002F672F39E587F20DD0F1B3F
-:10035000ECCF591DE987EF9B787F3D98D8EB0D4C8A
-:100360007F59AF23018067C48F70B410ED9A6C91F0
-:1003700080FFAA49F761E13D517E8726A5BE298706
-:10038000F9D3203F01E32E309473305C9A1E3DFD7B
-:1003900025C4579B7669E93B96FE1B2265EE220732
-:1003A000FD45D53B23F48FFE03C08BC9C45FC081DC
-:1003B0001F909593A7F5FB21CFA159F13FA7F78691
-:1003C000A6827E632D0B10E0FBCD2799DD3471FFF3
-:1003D000D637C13F689FD63F1C54A866251EA5B5D9
-:1003E000D726EC5FCB833F4BB5B7A2FC67453363A1
-:1003F000FCA72BB01DF8E360BC10BC82B881C0F430
-:10040000F2F58A5E4EF577E4F3F3BA46A2FE0EFAF1
-:1004100035E849AA3F0FF426D09F77E757CDC8A704
-:10042000EB9C5D50757DFE78361EFA29C04934215B
-:1004300031DEAAF051BF03BFDE57C78514FD8FB070
-:1004400078D03DBF48FF4ABA5C949F307E7F7BB432
-:10045000FF7D9FC6FFBEEFCAC5833281AEEEE1A429
-:100460004CA0AB891AF9B62F811DB0247F201E94B1
-:100470000974ADB63FC1FB30FEA1C61DEA21CE8294
-:100480007226887189BB5B88BB13F3407C2BA1DC8F
-:10049000B890889D14DF1B26FB58FCA38588374E37
-:1004A000607156298ADE208E195D263B6839460E1A
-:1004B000F6631CA489F6B0C90D7E9AD8EF9B89BF5C
-:1004C0005A003CDE73D118D34F37DBD73B15FCDE27
-:1004D0006866F18389CBB7F224CA8F9332CEE37C6E
-:1004E00008E8F7177AF45FFFA7828F2A3CFE9C5733
-:1004F0007513E05512F8D5E0BB878CA8C71CD791BF
-:100500008580DF6BECE4CE99F479F641E2C9D7033C
-:100510001E8B39D1FE44F5D9B9CFBC10E8E219855C
-:10052000EFA9EF2BA051BA120F40FD3F19F3472856
-:10053000FB2F01BA29CF55ED0E520271880F157E9F
-:10054000DA74ABC507FD85748CAFBF98CFE4C08B60
-:10055000F906DC3FB53CE08F53E8828E83FD255DD4
-:100560004562E2D73F53F055F58713254EB7BE3E9F
-:1005700089D92903F4A943FE9B5CEC35F890FF551B
-:1005800021FF0D7F6491002ED34E37D4C33A3E9D98
-:10059000954420DFE62E254EFA6EBE1DFB55E38BFB
-:1005A000FF40BA8889935E2A5DFC3E421731715242
-:1005B0000AD764900BFB74CCAEDD47110BFD8201B2
-:1005C00025EE2E100FC8AD7DBB46A21D3357F15747
-:1005D00053BE81F66B98CA37B6DFBE8DF3E0BB40E1
-:1005E00001E6237CA8F73FBF1DF49903CC4E53F7D7
-:1005F00063DFBEA17EE03B134F7F9103F0DF77F214
-:1006000085A190E7B14F89AB37188285E84F31302B
-:10061000F9DE600B1602FC5E57F0A6218996E9FB15
-:10062000BC745F18F05ACD8B8176765C8F64037F43
-:10063000CE31C54E3F4AED769817A5967E88F7D302
-:10064000FDCE8672787526D3A7E9BC002F8E1D18C3
-:1006500083EB5BAF67782CEFE5D0FF73541F3ED17F
-:100660004ABF3F9A7D156913413E5FD8DE07FD3FC3
-:10067000CD13A30879479F9FDF43BF3F378417C13E
-:100680002F59A7F34ECD067EB19BF943B4FB00F280
-:100690003A3AAE7B968473D06FBA303700F87376EF
-:1006A0007F11E6D3118748645A6EDECBEC476D7E2E
-:1006B000C4717D2CFE6BFB857581FFB219FE067D32
-:1006C00024BA7D9CFEBEAE7C561F2A5C46E13145B5
-:1006D000F24905517E80E637B2518E1C7BEC73DC0B
-:1006E0004FD2C5E2E8C7F59E39303FFBE4A0A13602
-:1006F0000A1FAF2E50FC5046A65F50FE6B88E637AF
-:100700006A7D7915899B9F525EC0E8DCDACFE4F4FC
-:10071000E07A86E7F7926779E0175743320FED6F7B
-:10072000849267732FF9ECA011F4A94029E6F18CAB
-:10073000581E443E40E78BF8797C630AF247F22862
-:10074000C3D7F93F3222FF984FE507F367B0BC42A9
-:10075000F228CB1F3AF19013F1B97C45B01CE9C1E6
-:100760004EDCA047BDD6F1A1CCD3FAB93BB852C8F4
-:100770009B9CDBE1443BF0EE5D4EDCDF890A5FAF22
-:10078000337A304F923CC3E29C773D518FE334265D
-:10079000133B8FFAB5DF007AC4C21D1CC6C32706FF
-:1007A00018FF6F108207414FD7E6FD107F6CBE0126
-:1007B000C82312A5C783FC211ABB2B76DFE54BD2D9
-:1007C00017B472667141427DE1EFA4C77F337D614A
-:1007D0005981AAC7C7EA0B60FF17303C64726D27C6
-:1007E000C7F89CA22F3482BE00BAB022A75539BFE9
-:1007F0004091F32778A667CC37AEC5E79A0296E713
-:1008000070370929790E6103E87F89F0788D322FDE
-:10081000158FBB008FC747F0B8E164B0CF887E0763
-:10082000F76EC8D368584E82566AB7CF175A509E93
-:100830000D118988F9AFD53E9C57E6126AAF51BCBD
-:100840009C0FB1FC7197AFC70CD25B34FA8A3A6F38
-:1008500015AFB5FAF5C4E57E1EE28BBE9104DFABA1
-:100860004F91044A61BE352666DFD4982C411EFCA8
-:100870000F93F567A2EDCF1AC1F322E33BC3EC2738
-:1008800046234B23D0EF74A7E737A3D2237A7B729A
-:100890005978E563B43F3D29D1015F57C7373B2BFA
-:1008A0003F298638AFD08FF62BC962F92C478A19B9
-:1008B0005C93E93E6CA570D50B32C24F6F12ED6DA3
-:1008C00076D8FF7E8CD385D309FA6DD5FDDA622503
-:1008D00032E4151F2966787FA458C4276D8FF9006C
-:1008E0007A176D4FFBAFDA67463E727EAFD50FFACF
-:1008F00004959323ECB43EE34FD40EA4E5B3FBACD4
-:10090000A8579D55E49B43F5DF9395B8FFEF2A78F0
-:100910002393AAA160EF11EE86A174EE44B5431AA9
-:10092000ED89E2DA4ABDB3FF5686BF46D46FCEDB0F
-:1009300043F74199CE0773E0FA14BC6ADE555DFABD
-:1009400000C81BAFC5CDA0EE2B057DCDC82FBDD5F2
-:1009500044813D955F1E5E06783FDC221A6993C98B
-:10096000233EF8FD6C5AFE68979E18017FB6DD9411
-:100970001284668227CB3B66F07CEAFDFAA3A128AD
-:10098000BEB368476CB931105B6E26C2D15094BCBF
-:100990006AFDA0FED76F45E1DBB902AB03F08048EA
-:1009A000C47D91D2D3F107F7906320BBF93B52800D
-:1009B0009FDF45D9563C7AFFFCC185BF7E8B7E27E1
-:1009C00018AA3E2F40FD5232007DD5523D279E9DF4
-:1009D000BF4DE16B4663CBC9AD143EC6D78DEE3635
-:1009E000DAAAB7C0470AD3C13E0EF7C1BE1A479C68
-:1009F0002981F846D5882F30BFE4FCBF1037C0E905
-:100A0000BCB912F1E9FC46B3047E80EE1C0BF3CBBB
-:100A1000BFC1F9396617CE184FEDE9853815E0BB2F
-:100A2000E1951B41AE4C308A2B445CAE4987FB4DAF
-:100A3000AD63FAEC36C82BC1CFDE4D0DF43637D896
-:100A4000D1FD362086A98512CB9FE05F3498E89FC0
-:100A5000CE0E4F511BFD6E91378940DEACF0A5E004
-:100A6000053C7B18BA8AB22B8715323ED3680A1927
-:100A70002AE977CD5F2C9D96AE8BC47D8C7A9F67DB
-:100A8000289DB77E4F6970287DB5A0B51AED672AFD
-:100A90001F185F3CC0F8E2826595F89E9B390DD720
-:100AA0007B82AE17E0F2E64623AEF7C4700BFA3352
-:100AB0004E6CE1B0BC403460DE2DD5A7D22A1DF0CB
-:100AC0005E2F1AC96078346F7878E5465AFF6E3623
-:100AD0004F388AFF7FD9FC738C4FFD85B0F1E55DFF
-:100AE0003CEA697F11C3E54180A7D4628BB6D71772
-:100AF0006CE1BDC02F176CB9F7DD0900B799B79548
-:100B0000013C26D99766489648BDAA9F0AA915DBDD
-:100B1000812E277D59DD3F09F4C42D946EE8BC0574
-:100B20001DF181BDF4D696EFA27DB0A026C90EEBD3
-:100B300093366F9B0AF2F82F354374B8AE9738227C
-:100B4000023CECAD19F07E012778E3E1D5E1021E0D
-:100B5000F1AA7284C50DF271C1EF78C4174A67B764
-:100B6000425CA9718B1EED8FB7661EFEFD6C47843B
-:100B7000CEB8991B664C84EF7FACC7EF07F4BFCDAE
-:100B80001F7F007E17F84735119043083F2DDD1970
-:100B9000472C2F847969E96FC18A964296EF717963
-:100BA000744836333AF41572C8A7BF011D2E2CBC09
-:100BB0000C3A24C35263F48EC17C4F46BC55E3E526
-:100BC0002637F16CB3607E9487A3FC7A6DA180F523
-:100BD0006B0B999D29FCF59E1DBFA2704A2BF4FD5D
-:100BE000A010E42BF194827C96C26215B8E62D8A9F
-:100BF0009E4B36B3F318600FC1FEAF4F27DB3BA30C
-:100C0000FC5F8F417FE9C817DAA19FB37FFCA20F79
-:100C1000F6AB29E74C09D801CD17FE0BF36C2CFB82
-:100C2000597E96C51DC6BC35BDC38BF8A8F2FD66BE
-:100C3000379343DA755D28D4333EED08633F635C38
-:100C40008C3ED5F8F4A6D6248C136E72F8CDCC8FDA
-:100C500045F553DAFFF4321EF98CA9AC9D801C23B4
-:100C6000153CC6F7267DF16B02F1D077AFAD7683E8
-:100C70001E6C297B5348837556E895FA9FAECAA52A
-:100C8000F5BFBE760ADA73F764F112E853D3CBF2FC
-:100C900064949F1E96273FE98B14A4C319F5335023
-:100CA0000F56E7EB2526C942F1642625D6E8F30462
-:100CB00033AE354B9628FCFAB48B9BC6EC0029E585
-:100CC000E631CCEF162866F23C1A0EF7641970FC78
-:100CD000D905952F01BE4CBA8EEDC3A9978CFE1590
-:100CE00074DC53E6F8FADDFE42E647C815AE47BEAF
-:100CF000B4F42523E66B9CE6E27F7FF72A1EF3CC53
-:100D0000EA5771C44FC73BF5FC6B39C0D73FDAF6E1
-:100D10005A4E6DD47C12B5FF6361227F76F0AE68C7
-:100D2000FFC074038B139171C6187FFF749B721EF2
-:100D3000E612E35FFF9430EEF38B6130DF5F0DC4AA
-:100D40007DDE19161DFF1A8863BA59DC471BBFCC1C
-:100D5000AFF83765BEECFC41ABA0CCD76D6471AC8D
-:100D6000792C4F62C98134C4BBE986F0E318DF7C7B
-:100D70008317953897C784EDB3587D8275118F27F7
-:100D8000DF518EFE319C0FB7870B5A6DDF627D8479
-:100D9000C5B5B4EBABDDCFC78DD336BB585E48725B
-:100DA0007118EDC0A3EF3C0B991803F86EDEEFD479
-:100DB000459F5B19D06715FCBE09F09BAECFBC8A7E
-:100DC0009513E175227EF5A822B755FC3EBA2A2F6D
-:100DD00005F0ED215353A88FC2CFC3A710F3105ACB
-:100DE00056F241E40FACC88778052E4491835B3EF0
-:100DF000B0A27DD6AE6F7906CED9C96D02D946DFD5
-:100E00003B929AFC6DB42CE9AD9847777FD28CADBC
-:100E1000608786A882CBD1F2E74947B6829E404CD4
-:100E200029444FC791AB94F60693D84EF58BA79201
-:100E30006DC85F5AEF2228BF334990E32840DC2376
-:100E400073991F7CD16E0EF3E729C583DEE7CE8B45
-:100E5000AF8F168C64FCFB8F905045D7EBAE8EFFA6
-:100E60009D7BA4EAF7137CA128BBF461CE2D29F960
-:100E7000E404F265F5A47F36F265AAC7FF9ACA8337
-:100E8000A1FC2BE8FF3EF6A0EF9978E792D4E75D4E
-:100E9000D5F1FD0A1394715D5D9C5F6F43FAD56DCA
-:100EA0008DA15F25AE6BCD70530903F17C16B7CDD4
-:100EB00027EAF9940D10171952C1E668F38408E87F
-:100EC00017595DD7135F1AD0D3C44C906F4BE6C54A
-:100ED000DAB959B5ABB2D10F597BDF0C90DF1BF4F7
-:100EE00096555C0A3C63FD871B34FEC3AFE30B5988
-:100EF00009E9664216F8633644E2C1883FED73455E
-:100F00003FCFE12A48749E4346BBD4E7033DA8D2B5
-:100F1000E4EE710FA61F52E1CE8275BDA8EE9B4292
-:100F2000CFCD0A6A72FB39B44B07F343059E8DC3DC
-:100F3000109EE6AEFBD16E4A2E657EF7E4FA5A1F8C
-:100F4000F09F64CA7FC08E33185A38DCFF89CC6E9C
-:100F50005BC2B1F2924A5194E9F7069B923F7D033E
-:100F6000ADB7039C7CBE68BFC335BA7B2AA3F3B47C
-:100F70004542DB031F9EC5C69B6E5ACEF2C47D540C
-:100F800047CA8EC0B14A81637E45123B6771AF0983
-:100F9000FD719BCD5D385F9DC4ECECDA4E33F2BB46
-:100FA000A1BC0BE352BD7A861FB2D584F4EAEE7D74
-:100FB0001FF305875E9D25F1CE28FC59CAEA55BC72
-:100FC000209A3C138341EA037F239D881BF2949669
-:100FD00070525F15AE4B0CCB6E58B7C2974B9298C0
-:100FE0001CA1E66616832B8B3B6AF68BE20D8B0306
-:100FF0008CB1303F17F149A87769D63B186FF6BA24
-:1010000080DFF60EE0CD1E573C7EBBC62EF5F544C4
-:10101000E30B9156821FF8111D0977C6C31F77ACE9
-:101020009DAFCD9BD4DAFB4DADD55EC5FE904DB8DE
-:101030009F06B43F9A96557A99FDE16A037F59F36A
-:10104000722AA9689BEAFD9C09FA6B9E6543FBBB6B
-:1010500079CF4ECCA7689A46DC308D5AC59FADAE8D
-:10106000F3A89EC549A9CC0A403E47B73DF4349C3D
-:1010700083EDAE57F3BA589E93BC8753F2BAD43C73
-:10108000C0F011F0D7767312FA6D07CED3D2FD6798
-:10109000F95C979717682DF63AC112FF69C17FFC7A
-:1010A0002629FD32F2AAE582755F9D579D742BD4E7
-:1010B0009B602F947A4003AA2FAB658F59827CAE38
-:1010C00048BD40ED4ED31E8EB597D7DC3245C07378
-:1010D000704AF9F327E1BCEB1A3389192F7A7E8223
-:1010E000A67F302D2D92FAFD1F664EC9C73C48657C
-:1010F000FE154F7A86D1FEF4B1FD21CA28EDA1A0DC
-:101100008EF7C2E863DD8F0E8BE8ED548FFF6CE441
-:10111000F888FEFEF0E1E95D63E958C9E26778EE20
-:1011200050D5C39B1D2CCF5A8BE77F53E414B58752
-:10113000A7826AFDF0ACC55EE877200F72FF5C0FF6
-:10114000D8C16A1E64F3722F9E3FA47ABFCE057980
-:10115000D57F3C73E220013BF314FA039A2F08CCAD
-:101160004F4EED078EE28B69FF5AC41FB243EF0763
-:10117000D74EB75D26808FDD07B8F1805F84B4E479
-:10118000DC42617F9BCB9384FD25C83FC873313F10
-:1011900077B3AB6A6321C0FA398E803EDEE9FA1478
-:1011A000ED8AA6BD53C6479F97ADDFB38E9DBBDCCE
-:1011B000A18FBBEE3C17CB776CDAFB2AC67B4EF9CE
-:1011C00039A4B985827F35D89B0B17EAC0B2226556
-:1011D000FEB998374D661908CCDFACD821CD3B6EEF
-:1011E00092E1FC6E33FD8F9200D9E49D8FFAF6A652
-:1011F00059260BE40934BB6A1723BF13933C60CA1A
-:1012000069E739900FB92C09F3AA3AF7E8A7819D4D
-:10121000544EE9E26716E0ABEF39B702FF4C1BC74B
-:10122000B78B90771A5FFF2E1AC5E45007E795FF3A
-:10123000B90CE338243ABF7DC41E667F4D74196231
-:10124000FD932E66175E2BF75703AEBD218492C126
-:101250001E6E269E4FC0EF45BC1609E3582480FE43
-:1012600040C78312DA4D2647E891B1507FAD8076B2
-:1012700093EA4738BB3713F5B1975DBEEFC23E9690
-:10128000F3A127FF19E0F688A0C4C3185FC9B9C944
-:10129000320EEC2BBD83E93366AACFC0B9A1EB5661
-:1012A0001FFF6535F0568717F50842851CDCEF50A7
-:1012B0006DE2583C48A33713D13D19DA4F55FCD2A3
-:1012C0000574B74E9810353B2EA6813FC32103BC51
-:1012D000DFA10B48A3F55388A783ED0BDBBFF50611
-:1012E000A6AFAFD799505F57F5E164473FDA898DD4
-:1012F000010EC76974BD82E7471629E71406CE0BB5
-:1013000008213C3F51EB4A56E2B01D0C3F493FFAE1
-:10131000C3C88B6C1FA8E689E72A54B8ABE70CD486
-:10132000FE0C4A7CB751F1E75280317A74A9F1DDA5
-:1013300015CA533D07C2C62582541EED775C5F4334
-:10134000483FCE4BB2C17C1FC9F0DEE7A2DF1FA52C
-:10135000780C78767455B29F708047FD1E88D3C88C
-:10136000A52CFEA2C5A7475C9C72CE2C3C15F3F0C1
-:10137000F6263867B627F69C19E50F8BDFA6E394AF
-:10138000951D76037EAFB12BEDAF2778BE407BCEA7
-:10139000AC4BD987FF73E7CCDC9CA7873EB7BAEC90
-:1013A000B1E7CCDC6CBFD43C19EDF9B2B3D94181C3
-:1013B0009D07093DBD0DE5A511EDC2D73FEEEB0040
-:1013C0003FF3B952831BCED564DCF64E07E62B7192
-:1013D000420BC44FB5FAC0EF9CD53F01FA5977CB09
-:1013E0006E37E68F6BF481447E008CED46F9890EF2
-:1013F000B8AEAC1FC0DCF5B90DF0ED34177E1CF2B1
-:101400009AE5037CDCBCE60F5C89E2629E59D1FA66
-:1014100069879AFF674F8AC987ED4890FF9748EF21
-:101420001712E6FD5D8FFA5BC740DEDF34557F8B18
-:10143000CD6B1693BED25E56C79F1672C6E4117C62
-:1014400072C9EB54EC9804EB4B64B75D6E5E841686
-:101450000E1D09E4E85F5D03F13F4D5E8447843C67
-:10146000820EC823A04F812332FACF760EE44504C2
-:10147000D15FFCEA48F47B1913E645B0FC3EE1C0BD
-:101480004809BE7B58EFF5803D23EFD42B72C0FF97
-:101490003CF84D3A0E64A39F8DB84225C01F05FB52
-:1014A000D42CD0AB3A14FC6CB8F4BC88B4A2387914
-:1014B000115BFDE31ECF65F6737F32D5CBB61226E6
-:1014C000A7E4FDCCAF49E78D7EBDF063C3515FE576
-:1014D000669A701DC7DE30F618510F77639E436D14
-:1014E000162F827CE9AE293F01F2EB18555C818E04
-:1014F000EBEE5E8EF66BA2FDA95B151B7756DF5FE8
-:10150000EA3E8D2B62FB7414EC7B14B432FA8B1719
-:10151000AEE20E62FEB626EE5D56441439119BC74C
-:1015200070DE5C89F1D8FB9EA8C138EC7CD282CFFA
-:1015300085A44B89CBB2788BB44A403921EDE0FCCD
-:10154000929391890E6D7B5187F7F550F1B609445E
-:10155000A24CA9E66AFA9AD371A0A74A1DB49C4985
-:10156000D7B55A90B3E8775BDF4F46FFEBC30E4920
-:101570003957C3EC2FF9510EF53FDA2FDACF720746
-:10158000C51BDACFCD452C2ED050C4FCC91445FC68
-:10159000381FE5D9A1E47DA8E3B5115D109E3A8E10
-:1015A0003D1F168569F1F43BB5BF0E7D8B09E22D19
-:1015B000E1E13A8C679E377866613C30B59080BD3A
-:1015C000D8616D59358DD5230F3D6F0E7BB1FE3B34
-:1015D00002331488940AF3BD41D90FEDBECEEB8AD5
-:1015E0002D6BF313B4F77ED411DFC8ECBCC1F760E8
-:1015F000DC50C4E4E1F94EA7B22F6E8C9777E8A5D2
-:10160000DF38413EAE16500EB70D6370D30D67CF75
-:101610005CFBE4592887ED543FC5F9B2F9E77EC772
-:10162000C101FD75D8197E7DDB796BE7BBB4A810CD
-:10163000F7AD038C063A5EC76ACECFE0C5E67DA95A
-:10164000FEEA278AAEAC9C3AC6B9B70701CF2CFE9A
-:101650001F81DFAFAECD28023F3BCD29F4BF9A47B3
-:101660007EB669612A968FAE2A403FD000DD9E5C2F
-:10167000B918EE33B9D47C8AE714BC7857E387AB4A
-:10168000ADE0DE837EB47007841254F9439B56DFCD
-:10169000543C15F863938E4899A00FACD2E4B3681C
-:1016A000E8798AE47BA508EC0F437F1FE353A1424E
-:1016B00001F56FB31BE0B64E776CE7CF015F769A0A
-:1016C000313FB26979783BF82B3325DF5E68776666
-:1016D000D9E1A99C84DDA19E74EEC048BC1FA7B6C9
-:1016E00043738FC7A3B1793464552ACBFBE88E7D51
-:1016F0000FF737C4B41B945FC3F4D6F5065F11D857
-:101700001793AE6379891FD7EB08E0C5C766863F9C
-:10171000F2635645CEB80BA3F5DADF6BF1E3313354
-:10172000E2479D72EE4DBB1F8D801F74DF1A14FCC3
-:10173000F8F8D5AB0B013FCEECBCBA10F063BDBEE0
-:10174000CB03F4B53BDF7718E0717C8AB74FC7F85D
-:1017500052E1E5E0ED4757186F2F55BF328D4A141F
-:101760006F91EE888EB7F4EA999F4C36C79E1BEBBB
-:10177000BD4CBF6A62FF58517EAC7FCC951F57BFEE
-:101780003299BF52BFBAFC75103C37A8C6617AAD1A
-:10179000E1C7B747C16B8999E5A32C291245B91454
-:1017A000D6579B87E710FF6872F77057749D317E9C
-:1017B000C037BEC85BD905F3F030BFE51B82D477D4
-:1017C0000D1DF70DC2FC96DA75DFA8C46154BB5B32
-:1017D000B503B5E3978C627AE6A4519E52B00B260E
-:1017E0007D7111FD0827E11E2C3AAEC9FF33B4E725
-:1017F000C87E4EC4738C128B8336ED9DF72CF85D3A
-:10180000EBFD4AFC721787F67AFD739F60FDD93DA8
-:1018100075586FD9CF05210EDA3C4C87725BCD7FAE
-:1018200050FD3FCDFB4BD1EFA3FA7FE83CC6805D76
-:1018300099EC081B906F817D49DB35092CBEDBE4F8
-:10184000206E1958ED9E58BF899A1FB5C96B407A12
-:10185000DFB49FF3833D9E61F03987213C87892760
-:1018600092237C63FA28CF4AC87352F3EEE0FE9FBE
-:1018700051E3D10F9A83E710F4EA7D2FB1F7F324F7
-:10188000C2E70509E986CC89C6B790260E11BA626F
-:1018900079CCB351DFFE6FE2457DDBA7C1B75002C3
-:1018A000F9D23C4ACD63BE15F57DB5FDE0FC7E3F27
-:1018B000CBEF1FC8CF6379FC0DD309E9B4B332DC99
-:1018C000EBD408F73AB999BC0F6AE47D7419F2E1D8
-:1018D00082517CBE41E8C77302EA3D4E901F17FD5E
-:1018E0007D139CDBC963797231FD28FC3F93BF07F0
-:1018F000E35571E2C47744DB4B8754BBB0543D17CA
-:101900001636803F6A499B230C718F4356E5BCBA5B
-:1019100092AFBCC41C3E06FE9A25CF67E279A201B5
-:101920007BE425A3E2EF6774DAC0FE24CD0B8FA21F
-:101930005FA219EEA5E022FB363DA11DF98B7C8844
-:101940001F1D1AB023DFC987F363AA5C687033FEDA
-:10195000D6B08763E70803B1E7C85E1E7565E58406
-:10196000FA5DA2F6874625B24BBF0ECE0CDF0F25DF
-:101970003A7FA7F075158E5ABCBF5CF8A9F503F045
-:10198000A37C08E583067E5ABF9FEABF231D22FA87
-:10199000F7A80E1580FC53D57F77A9F2FB43054EBF
-:1019A0007F6FF94D4627E243DF6E7F12F1A3CBDD57
-:1019B0009741F21BF6A724B1FCCEAFF83765DEDA0B
-:1019C000BC0965DE9ABC8943FAF00C760F0B858F53
-:1019D0007370DE4442FCFB9ABC896FB04E4DDEC48E
-:1019E00057AF539B37F1CC81A76C105A84F38BE02F
-:1019F00027E9DDA6C77C81A9BCC5C3F2D97896FFCB
-:101A00004A3C785F6FB3C98CFE106DBE1FE5542B46
-:101A10005B401FAEA0760A9C97DAD28E7A4463367A
-:101A20008FBE55C86F14A538F9A4424D4A501A9C70
-:101A3000D706E70BF05E8BCBCC6BBB66B4D581F2DF
-:101A40005722CE6F985F5A3D1AFD0F5F9DD7F65C07
-:101A500001C3FF372D9FA545DFA75B552C13885386
-:101A6000253A0751339A1BC85BC6F38A824CA2E51C
-:101A700071A276B34733FBEC4D43F8FD00E881B427
-:101A80001B88D36619A8F55F16B9AFE13697F7F64C
-:101A9000D1E9A83FE1FE9EDDFB078C4F3C934D440E
-:101AA0003897F08C5EC67D96D309E2B59A7FA18EF9
-:101AB000734E89A35D2AFF593CFAEF2B171EFFBF17
-:101AC000CE7706E569317AFC06FC06E96F809FE86F
-:101AD00059FC4ABDAFE56BE5DC95E6339AFC9244D0
-:101AE000EB6A065AA4F8F3CA68EF8B8C8E3CE817B1
-:101AF000BD5CF9975C46F52180C72EA304A466520D
-:101B0000EE65218F66AB7E5C769FE79AE1A82F7F1A
-:101B10006C66F355EF9B51D7F3B6163FBFA5DDFDBD
-:101B200078BEF7E7405FC72B3D780EFC612BD3DB17
-:101B3000C2CFB33C7DEDFD29946ED87D32CABDE0A5
-:101B4000DA7B20FE38FA1F23BF2F8CFEDFD1AFFED9
-:101B500051F2FBF2D7116B7F1FB2B23CC888FDFD7A
-:101B6000BFB6AECB92D76A5E747955BF129FE008BC
-:101B7000C427D4719AFBD9B9A2A1CA7916F5FD8DF3
-:101B80008A5E7867B167189C9F292B0B3E0DE76B27
-:101B90009A880D7FD7A02970FF8E5F39D8F9662CFF
-:101BA000BB587C95782D785E3FADD057588CF41B90
-:101BB0005A09F439C241CA21CED1E99A49EA2C988E
-:101BC00037310AEA472C0F3DFDAB32CC1B6B017A53
-:101BD00055F3A6CB2F7EB6725A19CE17FDD50E63DC
-:101BE000ECBD333716337B507D4E53E64FB73D1B6C
-:101BF000E67366213BEFDBECF088E0F756E3F4C9CF
-:101C0000523FE63934ED62465139D88A50FFC03030
-:101C1000A4AFA65D95A510BF25017329DE07FE2799
-:101C2000760FFF996543D03FFAB2CB5709F3B696CA
-:101C3000F9AF07BB7F041D07E2BC67765E5FEA8BE6
-:101C4000C33733F95419E2E0993C093C2946F816A8
-:101C5000B5F767A37F7B6518FD6EA5C5EC7DB383E3
-:101C6000C9F5E6FD35649E2552B63862CF8B4D1A14
-:101C700035A514E6515A2C2879A42C6FD549D530B6
-:101C8000F0736AF1C9A9E4ADD62879D9443645F292
-:101C9000B173BF3E6F559D9F5A56F356932F30BF79
-:101CA00043AE68C03C17EB2AC657C97282718E6B6F
-:101CB000C3FDD529144EF9DDC16B014E290076BC58
-:101CC0006F39F4C858FADE91265C0BFE9BA75BC700
-:101CD000F582FE2BACEEFF0E6C89D42556814B3479
-:101CE000ADD0DB887824B4B8802F55FD4ECFCE55CB
-:101CF000AD4E46BDB23BA701CF559D3D6C8C7B2FB1
-:101D000085FA94C98A2C8893E4AEFA77CC63B0EE56
-:101D1000E2E29EBF7BB7D8A29CBB5A91057117EB3C
-:101D2000AA7EB982F69FFB184714333A9BCB027FF9
-:101D3000B6A003F95AB787DDCF58D765AF32A1BC3B
-:101D400061FE2572AD03E588B0FA461DF009A18D4C
-:101D50006AB1749D6F17B3787A41B7A80339F5AFAC
-:101D60005FF271E35E4F1447CEE700B81A8DE1BE13
-:101D70002C67242F493D97A3FAA706E4CFAEB9E814
-:101D80009FBAFC3CF4F0ED98E7F86506C683A6DB45
-:101D9000983D420591723F516CFB41F713297A8BB4
-:101DA0006A176BE9409BD79D5F3104E982F2D1C08D
-:101DB000263186EFC5CDEF6E1598DE4DD7615802FE
-:101DC000F3A8CC72833FF152F3E9B5F6F4809EA3F9
-:101DD000E825EABCBF69FEB95ADF0079E771FC1F4C
-:101DE000AA5ED3A19E33FF92DD1F3742B1278E76C4
-:101DF000FEBF12764FA79AE7E267E754F4947F227A
-:101E0000FE84AE93010F76D9754DC5180F6BC27E57
-:101E100056B3DFFF18B12A6F4545193C45C25178CA
-:101E20001FDDB76804C69B295D14C4A18BC5C5EC32
-:101E3000FE06617532E2B1B09660D6A660CF403C36
-:101E400016D6317C5DA4D0BD9A67A7C62DEF2CF6BF
-:101E50001D2B4E8FBAA7A53589DDD3A2E4AB5B5B02
-:101E60000FBF04F79F3CADC4AD7BDF183D13E38982
-:101E7000AB050EECC3F3F6B923C07F7756E1DF560E
-:101E8000A19F8896687AEDC5F38EB907D8392D41A0
-:101E9000C9AB15563BB6027E9A9D3E3CD7F99D8E46
-:101EA000208F795BE2F127A7496077840D906777EF
-:101EB000AA4D08AFB0A3FE14E327D3FABD8810C023
-:101EC0003C22DD982BAB47A9DF256A2F8D49A83F1F
-:101ED0007DABF322E46BFC53DF16AF13F9A72E7F23
-:101EE0001DDA7322CC3E216FB07CAC38EB8AF15FF7
-:101EF0005EF175A97E4B6D7EDD203A66FE0FD51E24
-:101F000052E325C423C7E4BFF7EAC520E83D904F5C
-:101F1000FCAA1BF4EA1F9BA3F3DFAE1FA38BBDB784
-:101F200092F8CD701F429D723E9A08EE5510B7BDD3
-:101F30009FB776817DD70EE71240BF04F87251E754
-:101F4000333EB0629E46ABC0CE6F10999DFF5832B3
-:101F5000AFE5C7D07E495BA608F097AB5A7E8AE70B
-:101F60003B74C4DB4E9F9F2BBF87A3CE473DAF90F2
-:101F7000487E0E3AAFF035E72DB2139CB758A0E07B
-:101F8000BDEB2E82E72DC82ACF569857779B40206D
-:101F90003E9D3A8D95470826FC7D2633E47DA7E1DA
-:101FA000F958CCCF0E5378429EB919F2BED3E03C1B
-:101FB0000CBBA7939B390DF12F95C207F482763D98
-:101FC000BB9753BEC582F8543D8DC55B53BD06E437
-:101FD0003FE7881BCF09C8707F9F03F06C05E2675D
-:101FE000D89A81F1E2D47CA6479ABD069DC9897929
-:101FF000DD88AF614ECDEB667CAF7BAE84F9F60336
-:10200000F774CE23B83FAB0BA666C3EF920CB9C9E9
-:10201000C0417C499533550A7E746F55DA37B2F664
-:10202000708F27CC8F2C61ED07EEF1FC3EAB6F1566
-:102030004278AF14D561947B2459FD92D919483F59
-:10204000BC722E97DCA69C2BE0D83D644B660F61DA
-:10205000F536C607C9DD498A3C57DADF9BEA57E205
-:1020600005EC7C40BD4EB9EFA08B44C79F553AD3D9
-:10207000FE3E4784CED8F9922722E704909EDBAF3C
-:1020800017310F52BD87B4CA6260E7CE4CB17435C8
-:10209000694C2AC3FB0AB709C65DEBF4FC644C5CCF
-:1020A0003F8D7F6E345F19A2F295BB0D1ABB2C9346
-:1020B000C1D5167E9A9D4F335E965D96380EFA7C9A
-:1020C000766C1C744776741C54DDDFAA8506E42BFD
-:1020D000DD76E92DC897DA44410BF73A6AD7BD6936
-:1020E000E07E76BF19F452AD3D7828415ED4E931E7
-:1020F0004C3F7427F0439C1E93C8CF9520AE5C6A7A
-:10210000FC5F8A8F33FEDB9BE03CE200BC54BDC920
-:10211000A48D7BC897E5F7E935FD10F9A0A75D20F0
-:10212000E6EB6859737E8EF241E48BF20AA3D8EE97
-:10213000003EFA43E48BADD4723546F1456A8E5EBB
-:102140000DFCB8F74117FEDED55B0FBAF179CECCA6
-:1021500005F8B1F00CCF018DE993970DDF83FBCD2E
-:10216000CF59C33970BF794A207516DC577E2E3D92
-:102170007C04CAB69FDEC1CA05E1A7E1BEF3FC9F9D
-:10218000FEF27B58061A1B42975B12FC9E5C0CF712
-:10219000EE8756F6837E5FA63977A0B97F19CEC742
-:1021A000C27A322D068C53672AE792C964C53F0470
-:1021B00099694077D9A598576821D2AE7EA81FC6E5
-:1021C000E42EAD6F83FB7DDB0B9C2C6E4E181F2025
-:1021D000C394BC131292C11FD5EEB463FB01FD6E14
-:1021E0009751C95B63E3BFF72ABB37493D6F4D8801
-:1021F000381CEC468B4462CAEA7DE6441087C3FD76
-:10220000C3ED6ABC5A291FC8F48D2A89B25FDE9BD0
-:10221000727F31ACF3E3DD0FE4833EF55DE577E2F9
-:10222000B478F5D7B14C8EAC48FEDB1CE0E3EFF39D
-:102230003637F80F9666FACAA0BF798EB6F1768A5D
-:102240003F93C54AFC3DAA89F26C0EF88AFD6636BA
-:102250003FFB642F37AF38F23B55E93E01FDF4C434
-:10226000D7CD83BE9D7EDC2B027C1A4CE11C81F60F
-:10227000F381C33709FA3D3FF7C3FB308F70C87B4A
-:1022800047E05ED4F7F45DD536C027A7720F36114C
-:10229000F01C50DFD0113DCAEF6DB1F340059C1228
-:1022A000870D4E06B9700361780B65A8BF51B987D9
-:1022B0006EAAC8EE8D9D5AE6C4DF4F9C41C202E073
-:1022C000C3D4F7BD3602F471B3AF2CDE3D1BEA93E5
-:1022D00064E9A568FAB95E8A2A13C8B7882DFF9306
-:1022E0003BB6FCCF155F8E8C2ED7089E3B60DDAFD2
-:1022F000734CFEC81398FC11496005C8C7175AC42F
-:102300007118577770329447BF3604F3A84816CB3C
-:10231000BF1865CBF53338E46D867585A99CEF71E0
-:10232000C0EFB0B1FBC532DE376C85FB2088246D71
-:10233000063ADCAD77619E6986A5F6676DA8CF5831
-:102340004901F2296933E2B5D524C1EF961CB4B234
-:10235000FC89F6B53A8C37713693CE43BFE37B04E4
-:1023600026FFAD0BABA19E2FA71B426575AF9DFD50
-:10237000AE5BFB78A25F510AFBE67E1FF522AB093C
-:10238000CF274CB6B9EE807ADE66C0FB2B0E5ACB57
-:102390007DCA7804FA7FCEBA10DB038FD653FAEDEC
-:1023A0003533FF3A4FEDE3156C7CFCFD46FE1EA273
-:1023B0008C6F220628D7123C6FD06B17D97CEFD5D3
-:1023C000613C04EAAFC3F999B05EBDCF3272BEB7CB
-:1023D00052C0DF21E088121F6BC3F2530A1F6CD773
-:1023E0008B07014FE58F0881FD986CBB8074C0EBB3
-:1023F0006C6EBC1FC843F21D1984F92CE8F77C866B
-:102400001884FC7BFE1E1BDACDA0F940FD50F813AA
-:10241000E95AF09072C53583E3798E021E8FE08809
-:1024200017F6E354492EF2A36775EF6DC0FC0A8BD3
-:10243000D7E8A6E3186E23B8BFEEE4F8E77AF7967C
-:10244000303A1DBC7FE55990C7C1D92A2478B65BC4
-:102450002B2438A7D46B776779A3CA71F6C50F7898
-:1024600013D91753505702FBE19640BFF8FAFE68A4
-:10247000BD05D623E1BCF8216E09ECD07C1BED87AD
-:10248000F27D775AFC759C52D61150EE2DD4D6FFB2
-:10249000BE4477A5D7A9C1BF6FB9CE8CD8755EC130
-:1024A0007986B82B304F3E87CECF12991FFD13EFA0
-:1024B00051BBC1A243FCBA41BD1FCA157B4E447B30
-:1024C0002E8490E51B81CF7C57C977AD4AFE17F467
-:1024D000E35F4FF57C906B7DC93FCC877CD3A92906
-:1024E0006D1D8C385ACECC037E6CE290EFDC4882B6
-:1024F0002BE1FDB94ADF33F63CE4FB7F2B190FF7E4
-:10250000E9FA46A6D2F2C7FAAEFCC54EE48B1781B3
-:102510002F5A4818E9EE06F8BD46A0BBE9FE0E2882
-:10252000D3315AF09E304A8740B72A1D0E9E3FA5F0
-:102530004BFAFDD0161B9EDFDA428278002F8B7497
-:1025400071CCDFD282728B48C323EBA4443BD5D439
-:1025500082EBF8799B8CF2E1BBF6270528DF5CEA79
-:10256000738CA5F39A35F613FCBD0792357724D802
-:102570009D74BEE963FF81F31D7CAEFEABF3C8FE24
-:102580005EF6E884B1B1F6A823E96F9807277136A3
-:1025900037A1FAE3807DAA37615E42E41C72B80E6F
-:1025A000CF3B73295E9067EA39642DDF9D741DE38C
-:1025B000BB1F2FB6B957E03D923BD02E6DBED9A2BE
-:1025C0009E5346FDAB79A14E39A7CCA15C6922266A
-:1025D000BC2769E0F72CE93F2E23F2BB34FBE0BCBB
-:1025E00072D9579D5796F03CB4BC9CC5E907ECBB2B
-:1025F0004691D9AFEAEF9BDC9BABFE0E05D3531699
-:10260000934BB26FE39C6346BD91A4E814FB95E93C
-:102610000BDD13245126185F657AF86C03D6AF4F93
-:10262000F2E3EF05D5F15D88240D63EDCAFD0F7E61
-:1026300033FEAE98C15D087C428DB3EECEF7358F88
-:10264000A5FB34AFD893C3D1A5D41958FC94D2C1FB
-:10265000E67EDA6A1A69790E7E6FEE7AD2F25B5DF7
-:102660001ED2C1BDF0FDACD19FB0DFA18BD0C17D2A
-:10267000400726C2FC01372871A2D73FDEDE01FBEE
-:102680007E8E23EC3C9A4B7B1ECDFBC3B12C9EA5CA
-:10269000FC9E542CDF899AC7713D9B8783E7711E8E
-:1026A0002BE3CD63101D123F8E4FF7B705CFCB6BD9
-:1026B000F0483B1F6EFFFD789E6FF3ED44E42780EA
-:1026C0001CEF37033C870146E4C13A7DEB609DD99E
-:1026D0009062099354ECEA41F3E62DB8AFB7CE1EF1
-:1026E000C8D399915D0E712236EE53C94DEBC0EF00
-:1026F000D17CBB1EF97BCDFE31A8A7F5C94611924E
-:1027000020C964965FE3A6FF8379CD229E2976DAFD
-:10271000CF4D620DDE0B77F3746D5E8EFC500B6D4A
-:102720007F8B92E773EBCDFAA3D1FAE639FDA37A5A
-:1027300080835C6769E127427F42A4BD73305C06F9
-:10274000DD4BD5C1F813A17A0EF4DF5E1140FE9483
-:10275000884FED1D3B709FDCC86F98EF73702CE2C3
-:10276000ED57E7FB6C57EEB17A4B1FC6FB51DF4EBE
-:102770005FB079315DE7C81F15E3EF1B4FC9A87F34
-:102780006E2D2DFF78D3282CBF9D71FBD2F7A0FEB4
-:10279000E9422C4FD67D3207E8C1553EFB06F85D75
-:1027A000E8B7CCAC9FAC245F770DFD2EAB24771C33
-:1027B0005C6033D910C6EF6E1CDB7815F8632627F2
-:1027C000B1F2A1D23F8CC372AE521EF7FA2828BFD5
-:1027D000C57D32271E5F1CEDE2824554DE4E4E65FC
-:1027E000DF4F1FF7FC10B0E32757B1F26877E5EA37
-:1027F0003CA8D77D3A279EBE7456E1AB93BE38D72E
-:1028000091E680B030FBBDE2D73C1FE2EFCB78A968
-:10281000BC85FB06BC152C0EE7F5940AF07B6655CB
-:102820001E56AEB6B465031F9CE1339441DC55B42B
-:10283000383B44DA2EA5A2723CEC7B3555B721CE4D
-:1028400049E9EB53A4AFAB3FC9B1A15EAAD297A8A7
-:10285000477A4F7CAFE4E76CDF62E981F6F705CA9F
-:10286000CF6B62E5E7207AD5E0E1FF008B7F42C5C0
-:1028700000800000000000001F8B08000000000026
-:10288000000BED7D0B785445D2769F3973CB7D429A
-:102890004248088409F74BC01912205C1D02645994
-:1028A000050C171514E1041002B98DE0EEA2EB9AA5
-:1028B0000901441777E38ACA2AE88080A0C80E0A73
-:1028C000C86A644764237EBA1AAFEBED631345E52B
-:1028D0004E0CA2B89FFFFAD75B7D0E99338405BFDB
-:1028E000CBF3ECF7FC3F3E3E9D3ADDE77475557542
-:1028F00055757575CF55CE4EE15FE60921FC891EF1
-:10290000473E95BD6D271A7B0BFEF74357592A6941
-:10291000427410FABF9521457413A2930870B95EF2
-:10292000D42A421562B2558BF70C12C26E6970E35D
-:102930007917C5D3D745CF45BEC759D41F2F764A7F
-:10294000FEA29F4053F1C395429CB67D922D5285C5
-:1029500008D00375383DF489EEA9D48F82A66ED9CC
-:102960009595E04CA35FA1B85C69E857D62B757FBD
-:10297000E5F7D739E8FD0CEEBF93A73DF093F8AC2F
-:1029800057FC5CBA84F6B8A0F155A40BD73D5EBCE9
-:10299000DCB8324CEFA5D388EFF110B8D73CDE9A03
-:1029A0007CCFA264F5427C2DCEE65961FACE3491FB
-:1029B000E851E9FDF79616B5F712B2D709BF0DE356
-:1029C0007D282E31904CCF2BE724041DF47C670723
-:1029D0006D00E8A15A022F36127CB3F0D9D16EB245
-:1029E000D577059EC70BF9BD0AFADE3D289D448FB9
-:1029F0003C898723A30D7A44E1193DFE56BE346419
-:102A0000A0CC107E86D3856795DAC67884D57F778B
-:102A100023BDFF0B35A1F61E2A1FB2FA2C1BA8FFFF
-:102A2000C0EBB6E06685C72380CFD24F12363AB2EC
-:102A3000A9B40A8685C7C1F54B6E26FCE9BD254AB7
-:102A4000962740CF6B12FC8FE17BCDD556B1311567
-:102A5000DFF76D00FC7A757781F1458F27BDF6A70A
-:102A6000424BA17AC5FF04DA05AA1DAECDD4EEDB38
-:102A7000D87FCCDDC874482AB265111C3369432362
-:102A8000C18ADDE9528869E973D2595ED7DE427C9A
-:102A900020FE050A42DDE603EF475551E38AA40311
-:102AA0006192DD2A9FEB3D44B4F69063831E0105DD
-:102AB0007269B728B38BE28926F877656BB9DE6354
-:102AC0001182F8D43DBFA30FE35EE2151EC80FD1FB
-:102AD0004101DDC55E45A703C913EA15973FE0BA7A
-:102AE000904F4B1BB36F45FD7E0BE14B6501F12B06
-:102AF00005EFC7A9F27DC5D32199FA2F4812FE1020
-:102B0000954B62DCB746D275B8C532BB28477ECF3D
-:102B100049F49BADCF0603CF396B55A1E50A31C609
-:102B200039F7B1C3B9C0775887A28488FA7BFAE431
-:102B3000CCA1F75FB689E9F8BE677FEF9CE21C1E67
-:102B4000872F94C37C5C1102FEA3D33D010FF06B71
-:102B50005EE1017EAA68DEEC011E014716F089C91C
-:102B6000F40404F0AC15B7E545E01F43F803BF3BA0
-:102B7000C6F922C76DE07D313CA3E97D313C2139A6
-:102B8000CEC154AFCBCD1C675C933200A51A7690B2
-:102B9000888A55D4AF33525F45C9B90830DF272E34
-:102BA0001D537498E42DD54E8F20A7B725043712F6
-:102BB000FE136F1BCDCF9529E7589EDBD17C745057
-:102BC0003966BC5B69243CDAE5BD6515FD21A78447
-:102BD00017F0B1360E9A4CF43DD6557B12FAC6C0AA
-:102BE000FF2F839EF06A547FC8224A4239178E6FA6
-:102BF000B72E4F2ED16887DC5538E3C3EA800BE54A
-:102C0000E562F8BFD8A1E839E88D934AC36054560D
-:102C1000F676F17321B46C7C2FD9953D3A197AE29E
-:102C20007BEA6F30F414FDA379D0B7BBF627BC77ED
-:102C3000BD281A67A5F1B61BAFD9341AD738359E0F
-:102C4000E773CB7685F5D5585F8C0574A93C680B86
-:102C500006095EFCAACA745ABC5E0D62D2B608CFE1
-:102C60005ACCC39680C305B97C286EC06F4750F913
-:102C7000D97A9BC7817E03BEB77B53BFF3743EF501
-:102C80005A6B116E832FF47F9F60AC70F76E85FBDB
-:102C90006D6D6782FB873A9ADA5FB1B7ABA9DE1B2D
-:102CA000EE6BAACF3D38D0040F6A18666A3FE48302
-:102CB00002133CB4F12A53FBE147A698E091CD37CB
-:102CC00098DA5F796E8EA9BE34B1B07E298DB73E99
-:102CD0005D150AD9C9D1A2D4D4BE542DB30B62B1AB
-:102CE000A8B57D0A79F4D37FCC4F75A615743EBB89
-:102CF000571129A48F16AC95F5C67B2575F7AD84C1
-:102D00008D5B18343F2F15D65618FAF793856F1E32
-:102D100088E8AF576AB12599CABF7B1252212F624A
-:102D20008818F283CA7CF540DFB4BCAB7A1C42370A
-:102D3000A5042F7E5A09DE437CEC297A3C04BE119F
-:102D40009F45D00DBECAFA96756A3040FD7C5B5532
-:102D5000F2E6011BC10773D7422F2F20BD0CBDE542
-:102D60004837F333C66DE6675C6F333F133C667ECE
-:102D700026E59BF999EC33F33365BC999FED8BCC39
-:102D8000FCEC30DDCCCF0CCDCCCFCC12333F3BFBB9
-:102D9000CDFCECB2D4CCCFECC022537DB4FC765B3E
-:102DA000B5D854FF50DCBE2F34A2436A47D5E5A006
-:102DB000A9D7A3F676D3F7843AC1BE82E8559AA97B
-:102DC0000AD5D52A0701FA4FCE6B3FCFAFF92407BA
-:102DD0000F131FCE8AD5F599EE0BE5A162EF7D7634
-:102DE000CCCF1F2B0FC3BD663920B94BD2DAB06BE5
-:102DF0004669F099FC91D15ED20FD3BCDA582FE925
-:102E000093E9BDBECAB292DE1045C5BD60472EC76C
-:102E10004FB10EFE117ECAA410DBE38BFA29EECE71
-:102E2000ADFA8F9DBF80057AF9C3793696DF65715B
-:102E300003B6432E3FA8917279064D860A71830826
-:102E4000B11FF661EC239DD15F01115C198ACADACA
-:102E50009B80FF4CE04FF6EC26D168C3C7C98EDAE1
-:102E600051160B37977375FFEC66115E89C17C9222
-:102E7000AACD075D2A54AD4B1AE8D1A9218BFDD804
-:102E8000D75380F445E96AE8EB77F027B57BC45B5C
-:102E90005481EF8C71BA6F7DC00D3F80EC03F1451A
-:102EA0004C4861BC85B5A8FF94FE6D7D6719DB8B2E
-:102EB00017144D03BD03194E0FECAD480F3DA3D0C1
-:102EC000F8FAB6730FBC27B9B5FDAFBC867D21C734
-:102ED00086DA3FB92B96E9D5AFC3867618D78FED42
-:102EE000F76EAF6F39F036DA5F6ABC76BB67D1CF69
-:102EF000A8DF6645F8371212EFEA7CC974483F3103
-:102F0000534DF4D4806F71B3EADB131D6EEDA0FD59
-:102F10000EDF9F7EFD4F570256F6A7B817137EA708
-:102F20008B1B07035FA2FF83A82F7312FD6968271D
-:102F30003B6BBD9220144592FEF447FFA236F197F9
-:102F4000F81CD0E9FF6207ED31C8F57E4B439607C8
-:102F50007CB4360C663EBAE4B84EDA255D2E468760
-:102F600082B8CE3341FF790E8747257A1628F2BB07
-:102F7000879366CFAA24BC6FB614A5855513DE4F80
-:102F8000A3BFB2F8E22E19C0DBA6E3ED6CAFD3DD30
-:102F90009D13E99F45E35D83EFC31FFE15F997D9A4
-:102FA000781EDE06F839E1E2F58BC322ED7273B5C7
-:102FB00012DC48F56FEA745E6FA37698974ED1AE37
-:102FC0009AF0BB66E48A0D68F76BCDC9786F169EE0
-:102FD000BE6BB2C10FC1FA3EF32E2558930DBFCA86
-:102FE000C3723F4F1465EDA276AF79B57AE0FFB7B3
-:102FF000B87F0CCAB6F0341EF42E7D67CFB20E9E99
-:103000007B008DB83CF9EF4D9A03FD4F9928EDCE2A
-:10301000CD3ADDA689229EA7C6BA8926FCC90A6ACE
-:10302000379DFEE2F59870F7077E33007B5BE7F58E
-:103030004CD1C0E52CE1E2F5D4DBD51D7E761BB585
-:10304000996269CEB2AB98A7346FB399FEFF0EB9FF
-:10305000F966DC5B8714D0FD0ED263E0F79AF69731
-:1030600025C79315494F9AB79FEBF3360F53EBFCE7
-:10307000FC19DB5ECA9FD5D5E39FCD1F528C891901
-:10308000E4AFFF44AA42F1D09944914AE36CE8AA24
-:1030900006B19E1AA7DE61DD45E36C207FC2817117
-:1030A000FB8A3B9EA6FAF1646FEF91FA352140F05E
-:1030B000249F2AEE6139685CBE909EBF9E4FF5D476
-:1030C000FE956A919047F02B5E9BA786E470DC39F1
-:1030D000ED4012959348EF87A9F555E9F78D857F67
-:1030E00030BE13D991083B715577334C13A113F8B7
-:1030F00074B54EEF093966BB330976C768DF86DDE4
-:1031000021FDAA82BE710375FBD357F485FD79B901
-:103110006AAFF88CEC8B6187C608B9DEB8981DB22F
-:10312000DA0B5206B23FEBB6637ECCC1FA04F476FA
-:10313000691D2747CC97D2210AF3C94D86C742E3C0
-:103140007FF3A01A047DACBEF070D06FF18B0ACB78
-:10315000E9D503B5AC81C48753B6C6F9909B8611F7
-:10316000B94982FAFFB48A10E945F3B7CA297C3419
-:1031700017BEA872317CA42A9DCB63556E2E4F5486
-:10318000F5E6FA53551E86CB0716F5027E73567D7B
-:1031900065859FEF167EF68F96D07A17FC5A92B00F
-:1031A00058C236A70B4AF8AECEF5963882EF0A2AF7
-:1031B0001ED8C585BB822BE308AFD23A9F3D9EE067
-:1031C000259DDB8D8947FB071496FAF907FDF51855
-:1031D000EEA9773FBD6EA2681D6FF93985D7C9EF9B
-:1031E0000FF20D46FF5F56E5335E47AB7C8C97AF21
-:1031F000AEA93E85BE77BC6A3CC3770D2C1A81719F
-:10320000FBC457EC474CDCDE64859F31CEA7F8C089
-:10321000E7513E110C12BDD6DAA45D594B76057A02
-:103220006074FF29EB6F15D0FB5A21DEBFB6DDDCE1
-:1032300071F05727E517B3FF7AFDF782FD5743FE7C
-:103240002F358FDCA2E15426F5773220E9D3B2EB9B
-:103250001D865BAC441F1AF1BE5DA5A582FC83965A
-:10326000736FCBE7D48EFDD4DDB2DD629B6CB77893
-:10327000F7AFDBF9002BA25944ACB78E131F85239F
-:10328000027EFA17E95A847C1D6F17FAE623E8C913
-:103290007FB77836B29C6A9F3D0F3DBADCC57AE6AF
-:1032A000942DF4C5C3D0B39DC9AE72BD3F6E0AC99B
-:1032B00059855D682C7742EB07F878ACE0F800FAA6
-:1032C00073F792CF218F3D773CD4F597EED6FEB6BB
-:1032D0003CFDFB96E7DDA80FF2FCDFB6637DC74738
-:1032E000082ADBB92216787D76EF7399185F2F557F
-:1032F000F8559A67737FF3C7CC3F52FF4F906E41EA
-:103300001CE3059BE7D45EE0B39EF0A1EF3C716F38
-:10331000F940E8B779BF5BD817EF07065A98AE4F68
-:103320003DB793ED3FC998670CE9A9FE6B5E5A96CD
-:1033300041EDAF58D764E948A577935283B274FB47
-:10334000CEB7ABA9BF5C97C50F7F74C54037BF3FF1
-:1033500030B461A302BDFEFDE31D31CF72D67C55B2
-:10336000D0515CDC6F782AEB8396621E572D8F6BF1
-:1033700077DDD4776E14F04BC82301BEC5760FDB22
-:10338000291AB60DFCDED56D03DEDF6309B0FD0939
-:10339000CC917ECBC9A2C0EF31FE726A1F20B8DC8F
-:1033A000DBD0741BD597277715883B1C092E998194
-:1033B0007A9ADE2ED0A762D703851D093E3942785E
-:1033C00014EABF64F79942B66F9DC9F7C6F776D580
-:1033D000A4DD00FB96533048A5FA2235C4FD894A86
-:1033E000D95F65DD4EA7E0F5BC68A792224CAE1B05
-:1033F000FD7266047F2C8DBFC9B6D2F7DA937D04C7
-:10340000BE6BB30319FEF8567BFA9AB7680BEB2331
-:10341000D7FDC5F8CEE78417FCADCBB57F768B7FA3
-:1034200021E3932E5C81A1ADDFED6C092FC43848F8
-:10343000DA5D01FACE6657C30C6E47F06FB95F6D67
-:103440000FE65FA64A544F95F6BA06FDBAA6668106
-:103450005F97DBFF4371FF60BFABD292E871E4B5C9
-:10346000FA2DD3536A5E6C247E6DE8A0EDC7F88C0C
-:10347000B8A4B07ADCD0E3810EBE97F1BCCC49761B
-:10348000D5C2F6F415C0861F7CDE0F735E9E3DDD4F
-:10349000D9C1F717A6E365B677EB7186F37AF5EC39
-:1034A00040935EAD49B00B2F3DAF59E3E0B884388F
-:1034B0006029ABA7F5C7487CC2D2FABD2509033BFA
-:1034C00040DFD708D126BDF6D17CD688B661B203DD
-:1034D0001ACDEB51E79A558DE77DC3CB4979D09F43
-:1034E000C297E0461CC022B4087B17FD1DE2D70935
-:1034F000F06BB488135A84DDF489643BE6AD886FC1
-:103500007799E30E3F6EB627FB1F8F1CF788960F47
-:10351000E2E052113D3AA0BCD8B85ED4C7F5278C82
-:103520008BCA79438AFE01FC467EEDB2627C23ADF4
-:1035300093B3BC5D196F6B2EF53BEA6B8B19EFEF04
-:10354000634DF0E5E2FF3385166A90E3AFEC1C179C
-:10355000AC83EDA771D42DCC0962BEEFB18B801383
-:10356000EB982976F66BEB1202097D51AFB84288D1
-:1035700027BD606B9821D739C2B5D90BF97DE3110E
-:10358000C8FF0D2D7605F1A98E0EF105FC25A126AB
-:1035900089CDA911DF6FEFE2B885EACC5C8FB86204
-:1035A000DD50FDF90C3B3FAFB109B67B8119B18C01
-:1035B000D79A64FF6BFDA97E4DB58C677E2082ABE8
-:1035C000BAA2FE0E95EDC070CBC6CD0F621D333989
-:1035D0009DEDC69AE4706625DA2FECEB09903CEC81
-:1035E000F987CAF6608DD797D12E1E7A50C605D7B7
-:1035F0004CF665C4A6A24CB360BC1D49CFF3F36C76
-:103600006A47E54736D9EE439D6F44E90CE8DB870E
-:10361000E7F510D03F57E7168CCC65FF47C63BAFA8
-:10362000952C10336E7E80E3AD0F6B6A50CD065D36
-:103630007E736F4F826F98A3BA1077BBB62486E370
-:10364000A1D76A7A3C749A390E7B75AE6F642EF1FD
-:10365000BF3CD4A7DBE108399E71738F9F433F7C49
-:103660002A645CFAD769DA38B4137BBDDC6E2F3973
-:103670002B3FC04E38DD03D87F9E67AC1BC3734120
-:10368000DF7DCD4EF64B2F260F42789C7DE9FB0F58
-:103690005A4408F2DC05FC4961B90DC06F0B846225
-:1036A000580EC64F71727CBD25DEC2FB0C8F11BF58
-:1036B00060DF02BBE53E03294AE6DF83FB3AB35DE8
-:1036C0009AADEBB19AE9B1FC5ECD4E5BD0023E2BD8
-:1036D000C16D5BF0DE8B316C3FCBF4386FD9F3FDFD
-:1036E000580EF6D87DD92BD0EF3E07F3B92CD19DDB
-:1036F000C4F5FF962250FF821E772E8B0DF7443CB7
-:10370000BB5B7B6D3EE84172C771F932BB7C7E28A2
-:1037100058C0FB1A82FC95B851040B1FEF4F04C828
-:10372000AFD9EC91FC035E5A4DE78DC057233CC0E6
-:103730006771BB8C971FA2B98CF11DF27766BC94A0
-:1037400029E3336EA6FACF16C7711CF55051FD5907
-:10375000F80187D2559EF7A4A1EE1D42F564731BB4
-:10376000EE21B872E1A76F0CA1A715351F66ED75A4
-:10377000B7D27DE6B2F20982E460E6A23B2689C4B4
-:103780008BCFD799650EAC115BE7B7B063B12661FB
-:10379000D2EB6B727D3590C350AEB612E3AFCC2145
-:1037A000FF99E4E894BDE151C4498EBAB5BB517F9D
-:1037B000FA8F5F6EC173616DEEC9F2E16C2C449CAF
-:1037C000A5CC22E344A3F3B4DFE6B29D4D64FE55DD
-:1037D000861CCCBFB89C06A917EFB83C7B70AC6EBA
-:1037E000F31E85FA298DADABE0520D0E80BD3AAEC9
-:1037F0008413956E4C5F0DF3EA842B9C08FE6816CB
-:10380000E9BF956E8D1EA7DC4F2CC51FBCEE0CD9F1
-:1038100087135E8B48F53EECC2737B6BFBEC563E28
-:10382000D277988F22FE9359BF44FB6D7D06DE430D
-:10383000742F4DDEFB9BE1D917D22F1A36C67321A8
-:103840003EFA3C290A27629E1C57E43C3921A4FE1B
-:103850000A6C8DD1D7FF128F537FECC078A4E9F3A7
-:10386000E894A2B7DBE690ED48F6E0CF94FE41CABB
-:10387000DD8336CF5AB9AF66657D599A22E152474A
-:10388000BA0BFE5647356089855C56099E2F841B0E
-:10389000CFCBE33B32F97D43AF892221A0D74A77D2
-:1038A000646C947E9DBE0EC600A8FDA2A7647F80B6
-:1038B000A1FF8F3D99A9F72FE753345FA3E9F07E6D
-:1038C000AE8C5BD5240CEEF0CFE295BDD33F5E0706
-:1038D00015F4A04DCEEB4082B423E4B7A44FEE8F95
-:1038E000FD06BBE9BBA712ECB37DF1D877303F37BB
-:1038F000BEF769AE5C477689E27B47B5F925F84BA0
-:10390000E271C17A221A8FA3788FF07DF2C9F37C1D
-:103910005625DF49900CF97233FD840DFCF9D06E09
-:10392000F0F1D64CD2EBA5A055D7563AEEF16A99F4
-:10393000B023A7F47DA33DC904E7C0DF92F6C3809E
-:103940000D7E44CBE9B20FE767629F2A2D4FAE0F81
-:103950006A6212078824945941E8816AA22BEAC955
-:103960000EF27EDCB1AAF1F71FB6B58EE78B2A9F67
-:103970008F4CD07978FE5AAF13F373C13AAF734EC0
-:10398000043F6AB6E61E7413DD4F6CB562274BD454
-:103990005883BF19968AE76A2820B8DE097A9F887B
-:1039A000DFFF06DACD5F973C508DD04F0BD68EF3FC
-:1039B000CD8BE043BFAD66BEF40F99E12BF69A6163
-:1039C000377832E8C7BFE70D9BE1DC8366F8B9FCC6
-:1039D00066F507D8A7784BD0A9A06C517F807E0FE1
-:1039E000AA41AC33BADC51347522C147D6CDF5803B
-:1039F000CD0BDE5B3618FC3BB9FBAE3DE5F4DE914A
-:103A000076160FD657C745E8FD89C48FF975F7D9E3
-:103A1000AD6E8CD72CE77B2CBADC3E29E37A0B8386
-:103A2000E6FA0BF543B51E4712BD23E52A9AFFD4EB
-:103A3000EF753E42AC6CE9D4FBE1FF944C2081274A
-:103A4000FC8686EEB38BF8CBE927C072634D14E198
-:103A500074C2AFE9AE048EA70C5B3A467C46DF2BFE
-:103A6000B7BA0663BF7D8E5371617FDB889337EDF4
-:103A7000CCA8803DDDECB278904CE1CAF7D767E680
-:103A8000613D21422E0FE2F477AEC43ABEC49FC816
-:103A9000F45928821C679FB3DCD1AA1FE9FF79ABD8
-:103AA000A3F05913514FE32859676EBF68D30F8EA7
-:103AB00048D858970EABDBA062BC37EB78AB0199C6
-:103AC00037304C8F3F1C4653B2377FEB56549C87A0
-:103AD000F66B46CB7AAB53B7B33E5EE795C7DBDDFB
-:103AE000ACCFAC6FADE4FD1A9A87B00F0713E6FFB9
-:103AF0001CFAEE8C53B81C9C47A231FC458A5C171B
-:103B0000F23E04B53FB34E61BB5E9E22E1F2C79523
-:103B10002062BAE508C2027E42C65DCB747A404E8E
-:103B20007C11E301BF2261516BC4BBC3BCFEADF08D
-:103B30000B0FFC00417CF499F6BDC3F623B0B30132
-:103B400025F4B017FE9EF93B957B7F7044C2E7E3F6
-:103B5000C5C4BA6AFE7E90E9A8DA850F7A5CBD33E7
-:103B600096FD763200B1B0EF36DDBF16AB82ED6167
-:103B7000AFD6C05E51B942F7C303F7497BB526D92A
-:103B8000D7D385FAFB323CA0C30D8ABEBE855F9FAA
-:103B90000CFF7A3FF7DBACB85C1B93D15E0462523A
-:103BA000D9BF96EB847FA86CEF9AC97FC7FEFC1A39
-:103BB0006F280C7CD63C90CDFEFA0B86DDBB3746D9
-:103BC000FAF317FADDEC5F89FBA5FFF891E0BEC5BB
-:103BD0009EEEDA863C92F3B96A116F2ECD5BE6CB8E
-:103BE000C077E74DB15BC00F517279FB1C9BF53C70
-:103BF00098661A2FE2EF8795A27A4B841FFC4C9EA1
-:103C0000B40F830B7C5BF4761EB49B67798BE93031
-:103C1000CF225C58CF6F3EA70A2BC19B6B1DC1659D
-:103C2000F4CABCAEBE9E8B73F09E8C371DF24A7DEB
-:103C30001F97277C41E87FFDBB2FE4594CA5182B2B
-:103C4000E32C8763A41CCE1445851CEF770B53FE31
-:103C50008551BE9227EDDE3C7B83199F4F5E66BE89
-:103C600090CD732D837C8F957EC7E15B14B6E734CE
-:103C70009E9E2E8207FF2E86E38587757B64D097F4
-:103C8000E487F3220CBD95ACCBCB9ABB83DB628877
-:103C9000DEF7D9486EC037921BE4F910DFD92F5CEC
-:103CA00033238DF97E83CE57716F02F36DB8C52231
-:103CB000E97C6F06D399DA8BBFE3BD716EE9CF5F04
-:103CC000E63A8CF8FE37F03D7A3D66F05B58838328
-:103CD000FED97E4CF9734FEF0990FC2FFAC303898C
-:103CE00082DA1DB5D6A679E8FDB2CD2B127D541E21
-:103CF000B106125DD4FFD1A03A3ED806BD3B0F52AB
-:103D0000F4F5902F11797415BA1E3FF6E47FACBC20
-:103D10009DF0FC4611CDD08F15BBBE5B793B8DAFBE
-:103D2000DEE76C863E3D626D2C84DE5D581CEFAF95
-:103D3000F660FE9AE3F28B9E7820CDCDF40E645AA5
-:103D4000D279FE67E2BD8A4D360FD67515EFAA1EF1
-:103D500037E6BD685E09FCA2DFAF0C7D6607FD5D3E
-:103D600016D1DC69781BF5A291F57CE5AE5F7FA5E5
-:103D700026A23CFA11D6179551FB0125FA7E49F48B
-:103D8000BE40C2A084D42F10F0D6F7A3893E9C97E2
-:103D90001020BC7AB0B8C83872CDB6870634C16F6F
-:103DA000D8F45AA292D3BA1F60ECA3B484E63E863C
-:103DB000B8EAC5E6E5A9A838B0A1C7DC7B1599B477
-:103DC0005827CB325B3811FE7ED9061BEB91B2A788
-:103DD0001FDFF230E4ED4387A7871BF0193BF44166
-:103DE00099E26B5658BF8B4465702BBF4A9FFEBC4F
-:103DF000F011F8D719AA9840FC5AF4EC59D9DE27EB
-:103E00009A63A87DE9CEA642AC0FCAB478BFB30DC1
-:103E10007E8D09BD646F8C6F835FA1A6428E536D4A
-:103E2000FB96F971749F223A645FF87EC986CFEDE4
-:103E300042AE0F9A539225BD60EF2A436AB13DE925
-:103E4000C2F6F4FD49CFE771BD0BEB954BF1F124C0
-:103E500068C1F29E2090C758F291233801FCDDB171
-:103E60002411F94F5F5AFD52EED7AF48839F576236
-:103E70000BA4B9B894CF4B1EFD19CBE302C59FE646
-:103E8000E2BC2DD2AFF93CDE0C8CF3E675D7F238EC
-:103E9000E70B8DE5B164BD5A14A4F2AC558CDFD9A3
-:103EA000C6BC796890D4770E71CB00CC93B3F4255F
-:103EB000D8F12FF5757DE06DB99E7688294991FB83
-:103EC000432583A45E0C88E021D881CA061BC7293C
-:103ED000D4B7CE16E23BB7665BFDC8DFA0F107742E
-:103EE0007A293FC8F58B1B790C95F88BECE998B7CC
-:103EF000C67568CCC1F75BEC3751BF5F639DE83195
-:103F0000BDC774FB72A32356B982CAB4B6F3BEEA26
-:103F1000CFCF7FF1B68890A7CAAD5FB23C89745508
-:103F200024A54B18FB11AE39F1FE24A2DBD7EF7E9E
-:103F30006647FC3B906A113D806FC3E70C0B4F7BDB
-:103F400037DA1BDFAFDCEB10E1C879BBE9F3A87906
-:103F50006DAE17C2CFF4AC14496ED8EF2FEDCD85FE
-:103F60002FA01FEA7733F5339FFCAFB0C9BF6A2E8D
-:103F70007C04FA64AFDDC5F107F23FC31172737EB2
-:103F8000BF53DFE75BA0EB83683A44EB87FBA2F407
-:103F900083F1BE58D7F6FE52AB5E08303DCB6C22A3
-:103FA000003FA3EC4307DB8FB2A7E57C14A44F7B53
-:103FB000D0FC38BEFDE5F76FC07A36644B9DC0BDBE
-:103FC0009AF56FC9339FF3B8E612FD633CD0BFDFAB
-:103FD000DAB1FE4D1F239A1D84FFF1D55E3BE4FE4E
-:103FE00082794CCFDB9CC7AB15D66FFF55BD4BF428
-:103FF000E6FCC04BCDD70517D1BB7551743D2B7274
-:1040000092905E2D5CC55D78FF208ABE065DA3F5AB
-:10401000E8B441EE36F528FD7B5F44D051884696E2
-:10402000E36F482F625FAD62D3776CD788ACCDC8A1
-:1040300027AF087EC5F00AD835865F9A8678E58571
-:10404000E336D333BAFE4EC818FD5FF4471BFB05B9
-:104050006575326F91DEE3754725E2F5DCBAB63E51
-:104060003335120E46C1A1A8F6BE28B828AABD163F
-:1040700005FB4DEDCBF6BECCEB2CC2DBD4CEB1F4C0
-:104080006A5E875CE85704791C95BBBEB207201FA7
-:104090009D9AEDD08BB665229040EF37BFA8B2DF76
-:1040A0007BDADD9C083F65458CF4E34EBB7438D960
-:1040B00080C5EC62C2E37460800B7902CD3132DEE0
-:1040C00072BAA839313962DDDE54A726BAA97D63F8
-:1040D000508C6F3BCFA586E753A3B858BDF4E7C615
-:1040E000A9DFEF90F99F5681FCD8C6EA6F77209E32
-:1040F0007498D64FF05FE6555F9F88FD97D375DDC6
-:10410000AE998E75E0ABAA9069D63E3BF220E64AA6
-:10411000568A2322F0E0081A9F9A9057FF02D6573A
-:104120002428D8FF9CB73ACABF11454961ACA7D72C
-:1041300044E72B04EDF06F16909D853E2A5967AE3B
-:104140005F54779CE7CBA2A8F9A2E971E3E8F9D222
-:1041500075B09EB7E0155E3D7F92F3F44E1F545943
-:10416000BE5A96DBC4CA5499278BFC92963A997F23
-:10417000D3B257C222A0E7F5E8F3D6A0DB09CCA75B
-:104180005E17F75B4EECFEF7C1BF84FCECF97800DC
-:10419000F6894FECF9B0E70B809FFB6BD6C7E2C204
-:1041A000F663F67D378BF1DAE710C0EBF4BE57B259
-:1041B000E06F9C7EDEC1F905A79739D85F0FEC4B05
-:1041C000E0B8C5E9CED21FAE79F1DB018D6C8F97D7
-:1041D000331F270EB64BBFAAEE3FD83EB6D439DC0C
-:1041E0001847E5BE389E5795CFC7F0BEDAE917BF2E
-:1041F0001D1C198FFBAF8EC7D8573F9D20A63F03CC
-:10420000F9D5FDFFCA17863E5E8DF5F2AE97EC73C9
-:104210009127F2A7FF3300FAF5F4332FB1FE3D6585
-:104220006B7C14B1CDE97B321EB10D455C8F3ED65F
-:104230005188AFF6CCB811F3E742BA483A9C263A17
-:10424000605C449712F8E517A347E5BF2C3DBE9A82
-:1042500025F5DC10817D9F56BA283EF93C81E35557
-:10426000347EF97CDFB703A0872E35DE7BFF1F1B72
-:10427000EF53186FFB7FC5F14A79CF1DEC66FCA2A6
-:10428000E5FE42B97EEEE70CEF48F030BE9739DF2D
-:104290005FFB971DFFFF0CBF8FFECB8EF752FC7E9E
-:1042A00055E777820BFBA0A75FFC3F59E2478CDB09
-:1042B00039E45F755EFFF3711BFE7C81EA39E8A586
-:1042C000F6AF89D0BB9E6CF64ADAF447060D518CE6
-:1042D000B838AFA7C6E02F37DA0F5C8E734C01F207
-:1042E00027B08EA9891F78E02D825F213F41E57DAF
-:1042F00059194F7A25DD1B94F15DBF403CABE0AF0F
-:1043000073197EDDFB9303C82B2954653CE6E56AEF
-:10431000CFA6061AC7CBC91637CE958DED34F7F068
-:104320004EAA7775545D589FD574CA75BA23F01B91
-:104330001B6F5E675D1DB54EFAA9DB5C3F5E3C936B
-:104340008AFDBAF1393681F33685681FB1AE4C1952
-:1043500022CFF7FC54D42E77C5FF783ACDD5E94467
-:1043600074E17D9B402755CF7333D34D806EA9A058
-:104370004B2EFBEF01E139F016C156DDBF12FAFEFC
-:1043800063A133610BD6D10E51100E127CD66DE5B0
-:10439000F3935641EB61394E5E4747D34DE8EB6AE4
-:1043A000ABCE82B19DC68441673CEF926E7A9FC7C7
-:1043B0001D4DE71F4FD7FD9D9680AEE9099E20E475
-:1043C000A2D3B3A988B3D6109D15A5959E069DA22C
-:1043D000E99E8FCDF541ADF4EE64F55A31CF46EA52
-:1043E000FEFC586BB2843B35A8F25C5E90DB8FF923
-:1043F000DA63853F323A3E99F343857E6E42D5F7C4
-:10440000C39161C778D0FA1479B693ADDA92219C42
-:104410005FEF120558B7168810E2B74ADD2BDF614F
-:104420007D84F32245BCAF59FF01E05E382F86FC46
-:104430008E75D613A6F36E51E72526E5EF1C0D7E8B
-:10444000CD594ACF10C772B9EB311F8BEF77B8C186
-:10445000BF4ED606AEA7B596AB7A2876AB430CC74F
-:10446000CE234F3F03ED5E19CDED970897928C74E4
-:10447000BB109F778C77C97C355ABC7E03D8BE3C75
-:10448000C15D23E32602F2D41D65577C5FB64F1F42
-:104490004BDF43BE9BD0D85F8EEDCE9120D1552906
-:1044A000E2FDF72EDD645E44F30A07AF778AEFEA98
-:1044B000DC137A694281396EFDC510B9AF69945336
-:1044C000F3DD729FC2E249C777E62CEFC3EB2F35CD
-:1044D000B6A87C37E8B8238EE5BC78E54D1307D144
-:1044E000F78B77A47880E6B1493B07CBF6337EF6AD
-:1044F0001E3DD7B6C6F0F39FE76B8F0F419E81E25A
-:104500009EB59B1ECCB9F6657B3A75A185269F4466
-:10451000DC715260E71BD8E79C344DE5F69384CC00
-:104520002B15CBE378DF7C62E02B6B3A7D6F222D7D
-:104530006A50DF14E3CABA85F02FD6E3CD7FD0E707
-:10454000A11A2BB467E28157E79E5DE9F94421F394
-:104550009BA3E7ED71BD7D97311E772AE8A3C4B810
-:10456000701ED6688FEFE0BB5FE9F4785E2F0D9880
-:10457000E8CA71F179AB1C4DDD1251DAC2BDA8EC6D
-:1045800033AC601FE46D425751B816DFBD4D151BAB
-:1045900019DFE6628EB327F476830F9AD0CF77AE19
-:1045A000E9C1FB394DA305CB4FD37DD906BF393FB8
-:1045B000C958CF358DF6D4237FAB79B4D3B3D1832B
-:1045C000FC9650187194436BE57E4D979A7077E88E
-:1045D000D966AFDC07F97C69AE1B7272F303531323
-:1045E000A13FE7AE51C30EC8FB6A73DE9270793803
-:1045F0000F7C6EED683BD6AFF3E27D768CEB4CBE64
-:10460000F611F8659C73EC0B9C708EA7B6F875AC30
-:10461000FBD4449ACF987F567722D6D5D1794F953F
-:104620007A7E9301FF3A4DFB0CDF9B93E4DE01F9A8
-:10463000F87469378EAB76CBD7CF575AC3DD419F1D
-:1046400047692E607E3E3844CADF8476AE9EF12CE8
-:10465000BF3102E36AB2B97A429E9B56C45840A762
-:1046600009CBA41CDF6D95F32BE8735B02F4FEB35A
-:10467000789FBE3BB3DA5AB481FAE9E414D6847663
-:10468000B4CE1DA63D0FFE4C0C541FC2FA7AAE6E7E
-:10469000AFE6AE96E7C1BA8C917C15D686B129F407
-:1046A000FCC8E6EC81C87337E466FEB082BF0F89B0
-:1046B000E0FF84025F617BFACE048BBB057A78DE73
-:1046C00034E5A56E520E7E18C2EBF93A9EE72DA492
-:1046D000271CC93807D82061E4AB426FD43EE4738D
-:1046E00046ACDBED6217D7DBE7C97CD42EF670351C
-:1046F000E75FDD225CCB08DE427E84D526C4D62A65
-:1047000027974F5691BEEB21C4F6AA74867754B909
-:10471000B90C55F5E6E7CF547918DE5595CFF09EE4
-:104720002A1FC37BABC673F97C55113F8FD63F73ED
-:10473000E3E7B33E71F5245E0FBD506E66B9092FF5
-:10474000E81FA770DD85F34742EABBE4DE52FF08AD
-:104750005D1F75ED23EF03E8962FF9615B35DAC233
-:10476000E737AD8D1990BB71EA89A79F43BCA3249D
-:104770009EF3B25A4423CF931661E173D9D03F0E12
-:1047800092BB2E778ECF8ECC3BBFB14411D608F9A9
-:10479000BAC91F23AC11F669F6D264133C73E93B26
-:1047A0007FEE40DFBFB1AB96974F781CBAF38BF525
-:1047B0007FA5E78FDD79AC873CA7FBFD86C8B84BAA
-:1047C0008B6896B0D5C9FBF18FDD9E9196A2DFD3A1
-:1047D000007E19E7A4BBD89B8F3E8179B842F52CA7
-:1047E00023F823F087E8F989CE9FE215DD56FE0213
-:1047F000F3DAE7F428F49D43B7F72BCCA7F68FE95B
-:10480000FB51179CAB4E97F6EB53D8AF6469CF0AB8
-:10481000A047C3D26E7DFAABB4C05DA8BF25D183DB
-:10482000130DDAAA0E810504AFF6DA3D2AE27A7595
-:1048300082EF5D201A4BBF226033DBB1C64EC988C0
-:104840005B1AE79EE3F2824E3E77451D613F664E5E
-:10485000EFFD22037AA9567161BF06E7349DEDA0F2
-:10486000DF14DE1F451ED034B29737E5AB3C3F7FE7
-:104870003FC4CAE559D873A26B8CF0707C66DE6ABF
-:104880006A0FFD58EBB5CF8FD0BF73F4E7737B5B36
-:10489000B8349E97E17BD83F5CE59D0EF9E888FA35
-:1048A0001C9403A703BF8EF185562562FF777EBE59
-:1048B00055EF5FF67B169392E07B7A77B5DF9CC36A
-:1048C000E7ADD86E19FDCCE93D706557D8EBD5A39F
-:1048D000411D5163F3A4A752BBCAF3DF71497FC4E2
-:1048E00029F3B3CB2E62378C38DD11FC29CF3DF292
-:1048F0007817ED786A07CE3D2CFAD8C1F66BD11542
-:10490000D22E899CE0E0A91CD034C7C5C73E75B241
-:10491000FE2EC2E724CE2521DEBFEB333BF24369F6
-:10492000DAF8933200AB4DC8338D8ECF1ED8F171BB
-:10493000629B71F15DEAE5C5C595EF1361178CF1D6
-:104940008C7BF16C1AFCAC4AE51CEF3355BEB822E7
-:10495000ADADFCB0E8B8F8F9F8B958FD15CED757A9
-:10496000DE71A4CDF879741CF0F1FCE8FD88F80242
-:10497000E889B307D520F6D35B823D92441BFD1B2B
-:10498000F1F3CAB5F4520AE6A53B09FB61A72FE291
-:10499000971FC997F6FDA41E6F3FBD5DE5F5D2E9EF
-:1049A000ED0941F8A715DBEFAFC73E65C52685DDEC
-:1049B000F372D1C0F4223A0A67A41D43BE5B0A9C7D
-:1049C0006B7712F495815FE953097EC8D5C290E2F6
-:1049D000DB4C78B438DD49ED23F03800B96A8F3C00
-:1049E000C0D060A6AB8EF7F3BA1E34DA2DACBB9FF5
-:1049F000E3D2D4EE14FB3B7F88139C27289ADF0078
-:104A00007EC7D7E57AB0AFB830B4B382F33BB6C750
-:104A1000B9108738A6E7391BDF69D0FB6BC897FE52
-:104A2000C9717DFFEEF80E79DE1C78623E1D53CC15
-:104A3000F982EFEBEFBD9F2FF7CFEEC05EE2A0D67D
-:104A4000F60B434D89DDA9FD977BDFE1B2516FBFC6
-:104A500030BE6100ECEE97BBE2783FFECB5D8F1479
-:104A600022CE7C32343A15F26F7CFF54BE8DDB9F30
-:104A70005CA78E07BD4450E6D99483AEB99178A661
-:104A80006C086447CE33996F747CD7B389969C5673
-:104A90003E963BFD4E9CF7ACDC754B11E4B8DE2630
-:104AA000E969DF35398063CC95755E01F9E5799662
-:104AB000C1ED575922DA396C1EF68B6D7B8B7D6800
-:104AC0006FC4A117EFB6F179C15957B8AFBF11F351
-:104AD000F0351BF361711FF7F59C8FD4A072FEF2C5
-:104AE000E26C1186FFB1E4B6840DD80F33F09D95CA
-:104AF0002BE77BD92A45F8685C6541790F4747E287
-:104B00007B00394AE98D83903FD9941DBCBB672A4D
-:104B10009FDF0DE3FE1623CF94E6714F9C73EC30BC
-:104B2000B41D8FFBC119856CEF0ED945007A21F0B9
-:104B30008CCCC329EB2AF3A31F86DCA3BF76E19EAE
-:104B40002934DE133A5FCBA6847B222FA3EC990C89
-:104B5000CECB386197FBA5788EFDE2B281F47E3C26
-:104B6000DFCFA119EF2747C851D91C8F1BEDD47691
-:104B70001EB7371EF8BA4EB1DFBA3B41C06FB53C25
-:104B800097A0E757C5701EB9F15EBFA152EE8C7BAE
-:104B90003FC40D321FF3419BCC577D707306DF7706
-:104BA00061B47FD0A6CD80FF8471C05F5F68AFED38
-:104BB000897D1703DF8589B58CE7095DCE17C6D6D9
-:104BC000CABC70FD1C31DA036ED2F3D89BB73938FA
-:104BD0007FE55846C337C0F7D8B63EC88101BDE768
-:104BE000EFE57AF21F899F8B9E7484517F749B8CB2
-:104BF0005B1FB505BF811E3EBA3E85CF471D6D1FA9
-:104C00001CCCF9018ACB02FFECA8A2C33617FB9596
-:104C10005DEC0453FBD4586141FECEF8296B67214B
-:104C2000BFA1659303E2298E6D79288DD735C29D8A
-:104C3000C47936075501BE1D7BF23FFA44FA2F4670
-:104C4000B9689339EFAE295B98EEC9B97AA89C97F9
-:104C500057EBF4BD66A8B453E571A107BBF2F82485
-:104C6000BD893FBCBEA3199AC0F9134FF750A037B6
-:104C70001E16C19F7F9CC7AB6C37F2E6CB9ED9F660
-:104C800006F66B8F594403FC0FE5CEAD3FC77D1B85
-:104C9000A9BF49623B24C4261EDF51973CA74A1393
-:104CA00096C7BFB08384174DDDDA13703DD91C85DC
-:104CB000E6D7228BC2FD2FDAD39FF3ED881F16DED5
-:104CC00027DBA9EAF8904F09FA6D91F9CA13DA05C2
-:104CD000B7C0DF6B5EDF4DE0FCFA3875DD00F0EF4A
-:104CE000CCA6380BE4A9FCAEE149C341B737550166
-:104CF000FFE38CD5D321328E104DAFE83CF0E0506D
-:104D0000A99FCA700F0ECDABD23DEBF9BE9052C831
-:104D100025E8F2A4C2FBD8A52B873FC472FA864DC2
-:104D2000F4A07E4F84EE4F8CE4CF3D43A55F70FE30
-:104D30003B760FB72FA5F6F2FDD71219CF2D36CE41
-:104D40006B89E6EB65BFFFA47A59EF9F1F7F88FC54
-:104D5000820117D2E18C68F8F9C7F4FDAFB7C7F04C
-:104D60007A9056007C8EEDB82D341FE33EFE740C15
-:104D7000EBAFE3C9524F7C49FA34D00B785CFD5B52
-:104D800096D3B7A7F279BF0541F3778D7E7F3B5469
-:104D9000EAF1F2144F12D69DE56F4A7D48FCBA86BF
-:104DA000DF7FD3C6EF478FA3427FEFFC3C7D3A8E77
-:104DB000E5E27847C98FE33B7AB17D6A4A76099686
-:104DC0009B6D36596F0B65C10F3EFE742F6F4DC43E
-:104DD000778F2787B25C11CF9B6CC19543A43E6D42
-:104DE000C6BA588449D50E467E91603D6FBC57EADD
-:104DF0005CDD003F05F9BD8307721976B4BB304F07
-:104E000077423BB99EFC529F779CB39AA6E793B337
-:104E1000DF13B2438F6BBA7F58B63D3ACF57D6D720
-:104E20001BEFD3BC4B35F28A2DC037644FE7788334
-:104E3000703F43F8962EBF6521F2C74BFDF7DD08A2
-:104E4000FFA9D42AC6DB09AF2645653C9A62C4ECAB
-:104E500029F02323FB89F0DFDE6AED47E0DEB6327E
-:104E6000FC41F3E0BDA16E293FB0A4F4BDB2E5CA98
-:104E70006A7CDFD02F1C284C6BA513F25A91DFD32C
-:104E8000345AAFBFC8B89B6CB23E7ADC063E478747
-:104E9000CABCA0A66CF76F47802F7F51F97CD799C9
-:104EA000EF7393DAB5E1A7B5DA7B7B6B9E2DE1FF5B
-:104EB0000D7C6BFACEF3BABE2B25FC8067CF75E66E
-:104EC000BCF2DE9BCC70DFED66386797191E506729
-:104ED000863D07CCF021BD5FACB3710E19EB6C942D
-:104EE0005867BB1D729D0D18EB6C945867E339D65B
-:104EF000D980B1CE068C75366083DE586F03C67AD2
-:104F00001BF5BD86497D2E7CE134E46B5658649ECA
-:104F10002FF1C3C7E79866D84DE7524EBF28CFA5FB
-:104F2000903C487DBF309EE7C9C36831147649CEB6
-:104F3000A7D4E71DC165F4DE38B7963C0C7662ED68
-:104F400057F32177155D1B39EFB569C52B3DEFA7E9
-:104F5000768D4A82805F51B1F6AB59F0A33AB8B56D
-:104F60000EC3089FCAD8869543386E1F66FDD15878
-:104F7000ED7EF34AC9478EBF14ABB8F982EA4BDA2B
-:104F8000B5993F149D772E569BF3CC2F95771E2D08
-:104F900007861FF898AD39C3C5EBF4118F22CEBB3D
-:104FA000584970619DFE598C5886FB8002AFCA3CFF
-:104FB000B59683369937B05AD92822FC93413ABD29
-:104FC0000D78EEB95CF6C7CFC3AB158BB84288EE4F
-:104FD0005A7313D6D7674A2CEC779F2929286C0F70
-:104FE000FF8FD6659813B86F2B125FDCB715293F7A
-:104FF000B86FCB7C6EA2A3A93DEEDB329F9BE86B22
-:10500000AA9FBA3AD7543FAF68B8A9BEBB90F82D53
-:105010005928F19B47F6C197027819E72D2E01EF29
-:10502000C84FC952022B592F6F50F8DCB87BE9AA40
-:1050300042D0E5048933E20886DCCCD5ED8BB0069E
-:10504000EC90BBB3A9B2FEA8D2F0C55DF4DE496F07
-:10505000ED165C8572D2B2EEC1116EE4D76FC872E4
-:10506000D13CBC5509A541F5140CD234C8D9616BAB
-:10507000E364DE4FDCD9BE5D35FCCE8383DEC847FA
-:105080007FDB55CE9B30E425CB26E3741B689D0166
-:10509000FF6A43ADCCE7DD509B12DB3D62FFC518D4
-:1050A000670BF820502E4B4BE5B89068C038C86F9E
-:1050B0005F06BFEDCC41E9B71BE3E9BE3CDC690903
-:1050C000D5DFBA3386E973585F379CE8F3D20037EF
-:1050D000CE6F54EDCD52E10F58B66FC13A22215533
-:1050E0005B0AB92FD9D0E3AFB8AF6BD17BAAC07937
-:1050F0009ACFD78C491C4ADF39F6B4CD3381E0BB57
-:105100006A1FB7639DBCC81AB4731EE6B60D76E479
-:1051100025FF64EB067E3E7F6B31E75D2E107E5EE1
-:10512000471ED1CF6519E32E2950D6B948BE3E1A85
-:1051300026F56349ACDCCF2379FE33C67566ABE256
-:1051400085FF38AD68A7BD989EDFA7B7734F9F3E18
-:105150000EF2D71292F76DB4BCAECA7BC4A6A932C8
-:105160002FE622F7F34C3D97CDF23DED5C3F5E67B5
-:105170005D1BEE23D7B139527FB4D4A9BC1FD7F23F
-:10518000FACBA953F1BD3A1BEFDE95D81BE4F97FAA
-:105190008BF0E31C817B7A8394AB6CE187FFB7E4EF
-:1051A0002FEFD463DE2DC976BA311F8A46A826F9BF
-:1051B000AC1C1B6792DFE9A29DE91CCD75482A89CA
-:1051C00080A74DE8666A7FFDB47E51FA60606B3D52
-:1051D000EB836151E7000B4C70399577403F89AB09
-:1051E0004CEF958B29ADEDB01EDE24FDD6F25DC9E6
-:1051F0001BB12F5E6291EBA1E99A7C5EB1573E171D
-:1052000022F6FCB9749CC7477CC0746E5BDFE74331
-:10521000BF1C0FECD6C0719DE60CD29744D1F2DED4
-:105220008D76C4D3C85D6E469CB43C4030FAF58997
-:10523000E61A9C1FB14AFAC67B5C5D9765B4CA4505
-:10524000C52E73BE55C5C177B89D91CF185D4F9ED1
-:10525000EFCA8EC07B82E2E57393DB9BEC88074D3F
-:10526000D33AF1BD14D1F79F95859A18CF6BF7A665
-:10527000B9B06F5B1175EF59A7E16E699FF4F83F04
-:10528000EE0D927E42835DC66DE3F75B78FEC97BCF
-:1052900076CECB658945DE1710459709DEF7B8BF96
-:1052A0008E19320F0D74B146D0255A8E40276B04EB
-:1052B0009DE60B49A7F9A44D820477849C45D2E76B
-:1052C00047D26B01FEA0FA057B9520F2DFA2E933FD
-:1052D0005F6B64FACDD7E2FD41D785E3A9B8E383DC
-:1052E0007AE8A71D19F29EC268FA2D100D2BB1EEB7
-:1052F0005D4076239CCC726177F23A4DF1C06EBB73
-:10530000F31BED36A9CF38CEDBF2FA3B3CEF5A3C2B
-:1053100034AB211782EAA97DBCCFDDBCAC8D3CDF6C
-:1053200029E764FCE4BA73562EA74D30CFBB6BCF90
-:10533000A5F1F31F4B970AD019728EB85E621BF766
-:10534000E621CE9778E1788DFD10430FB7FA75E628
-:10535000BCE58BF97FD171C2DEC3F538E12031C8DD
-:1053600094B77C11BF233A6FD9B0E32DF1D24E8EA2
-:105370005373DEC4D9C6E257555EA7BBA78FB7F0FB
-:10538000F9F157E57D77DA8AB34D904F2DC1C27A96
-:1053900070714257BED742D3E376463F59D529694B
-:1053A00088FF15C7B8381FBFB85A2D82FD2AA676C8
-:1053B000EE88762B9777CB825DF8F4EE5E8F0668E9
-:1053C000BE7C7A5B6A1AE2FE9FADB0A592E63CDF36
-:1053D000EED315E3B2909FF1D97D8EE9C136E85343
-:1053E000345CDA81F23B3F60BB75D2F27AE2747AC8
-:1053F000BF6CC5EE4484EA4A57BC33D8452EC5E19C
-:105400003CED9AE1BCBFBA610BDF07EDDAC0F709EA
-:1054100068484A6E8F7D8815CCF7458ADCAFBE554B
-:10542000097F7125B53B11735FE2F46CDC6E2A389D
-:105430004FE3ECA604FD3C5A35E70D9D88257F809F
-:10544000DA1F8991F43CB233C1C37762780259BC48
-:105450007E6B2FF7774A2D75D7019F6B52356DF80C
-:1054600020E011DC92AE723B3EB7AE55F7486A2B96
-:10547000FE61945B743B0D7F1B25FC6DE4CBC0DFAC
-:10548000060C7F1B25FC6D3CAF5C6BF6DF6ED7F71F
-:10549000FB8C7870979A662FFCDD4081E8ED673BC6
-:1054A0003BA1E0F7B05BAF4A7F6189E259D5C8FE06
-:1054B00052422DD69D3556E967073E91E7A22082DC
-:1054C000D04FBF50FB7AB09FFF50DC9D8FA1FD52A3
-:1054D000EC0FE5E11E53F2BD22E4F5CA734E1179DB
-:1054E000EE7634396191F0186786A9FD3857B6A970
-:1054F000FE27E97D4CF53F757B4DF0D5BD879ADAE7
-:105500004FF48C36C1D7E4FFD4D47EB26FB2099E7B
-:105510003A7E86A9FDB545C5A6FAEBA72F34D5CFAF
-:10552000D06E31C13796DC666A7F93BFDA542F8420
-:10553000FF09D0C71790F7AAD561FDE4C0FD2F4E33
-:105540002EA9FE0FC8631E4D22CDF7AEFCE5677C89
-:105550008FF57EE435D38C1B31C6E26F2B8EFF07AF
-:105560005DFE6347FAB60DE7756E03DF8B89D82DB4
-:10557000E46E1FECD4A0D6E79DAC46DCAA2143DE46
-:10558000876E6E7FB17623E2F69F7193C8F5AC3BD0
-:10559000739395F4D78821FB73BB21EF79C4E0594D
-:1055A00056D2372386EF7FB62BC1FEBA3B6771FD1B
-:1055B00015FBCFA0FE1F75C3243C55B06B72FB8852
-:1055C000BFDD84FC941157765DED91719136CFB7B4
-:1055D0001B25E88473E1A013CA30C93DCAFD24F736
-:1055E000280F90DCCF23BD564F728FF220AD33F1E0
-:1055F000FCDF689D89F2755A67A27C83D697281BC9
-:10560000687D89F2EDAAE95CBE5BA5F17BEF579559
-:1056100070F941959F9F7F54B594CB4FAA02FCFC33
-:10562000C3E1328E108F7B9313FEC9BDC97E17DF95
-:105630007F50A3DB2D51A7E7D5ECA7F52BE8D96860
-:105640004DFEC2D9BABF78F1F5BE557C11E1B74D18
-:10565000B6FA3E97FCEDE462BDAF3F2FF56AC7A0F6
-:105660004FDECB9EDA235785BDF3FF3989EADEB3DF
-:10567000B47D9FE43E5D5E3E1EE13B8DEF8D741E6A
-:10568000E2FD74770679ABC31956C07F65A08C5FC5
-:105690008EB436D4A0BEE63BE1C6BAF9A584F7794C
-:1056A0001FBC86DC659C3F56CEC9F5CA287DFFBE6F
-:1056B000E63BB97F3F0AB853FD4897ACAFB9992C88
-:1056C0009D17F521FEFE289C7696E7DB4C793B631F
-:1056D000CF358CE1FA78BB1BF9A6A39C61F93DA7F5
-:1056E0007021BEFC52C21ED9FF38D9FFA6EFC2FC02
-:1056F0007DAC3E91973DD2D98ACF32C6AF41DE37DD
-:105700009723DBD7E8ED4769D47F32F0F34BFC8A6F
-:10571000A9BDC49FF5DC287C3319AB6D591F9B2EA6
-:10572000CF278F3DA7D77BE4783B58258C3325A81E
-:10573000CF4CD1848FFACBCC141EC4DF46A536647F
-:10574000707B3D9F21C12ABF97E491F77175FFBB24
-:1057500026F7038800C0DFC84B32E66DE776E10C20
-:10576000F8799D17DBF97B99EA4E2FF4F5A75EAD2A
-:10577000EF08AAB73A2D3CBE1A9F3C2FFFD68BEEFE
-:10578000CEB85F74B2EEAFFF13FE5F81F7473AF712
-:1057900049FEE392B7CC5658994FFF0F6D93FF9295
-:1057A0005E242F183FF19FF9017EEAFC570CFAE8BE
-:1057B000FC3FCFAF6591F5BA7C5CC8FF90E4B72E93
-:1057C0004FA39C326F02EDC1FF9156290F35313244
-:1057D000DFE3A584C287714F16D1A608F1F991863F
-:1057E000BCF8E5F9E1FFADFCCFB3CA7BE41C654E24
-:1057F000BEA7EE52F230BB5914E2DECD8D03B57D6B
-:1058000098D7C5E7DCF580E78AD18570CF8DFAA7F8
-:105810002E52AF7DDD6C036C3C7F1BED06B5D65B75
-:105820009D6FC741EF19DF31DA7DA57FAFB5DD4050
-:10583000FE9D8D25E342EB60BFC6575B396E4D9EE2
-:1058400009C307C99EC97C4E5FA2372D32FFD373AF
-:1058500060711EEE0B95E7B744BCF4ABDDF41FF4AA
-:105860006AE1F745CBD19F50B75BB1EE388B7C5ADC
-:10587000FA4E61AAD93F1F1FB5BF7E55CE97EC8F58
-:105880005F75897BAB7F3742F7A7B345F67FF2DEC2
-:10589000D08747B07EBEBC7B437B8B3A9683B1C535
-:1058A000329F8BC66F1988B88D4FF801170ABF1544
-:1058B00072305ED45AE5BAD277A2228F57ED4C9F50
-:1058C000AB45989F4F24830263720D890FE097E3E5
-:1058D00026CDC47DC06372C774C7F388FBF3FE0096
-:1058E000FC2A54ED6FAE88FBF3F68F95F36DF1B59E
-:1058F00032DEB4DFD9AD4D3FF455B2B7DD7B802E3B
-:1059000082CB3F933DEE4EE37E85EC31E0AB7A57A0
-:105910000BBC57E836E71D19EF5FED1A23AC2917CA
-:10592000B777570FF86327D0F9B5E45E63C1AFD7F7
-:1059300092878C453CFEB5E40E16593AEC5CF67F36
-:10594000AE7B5BF819F3A3B5BF42EECFB8FF776C1F
-:105950007B79FF6F345DAF1221137D27E8F4FD11D1
-:1059600074FD087A349AAEFBF475C57EE73B7B8CF8
-:10597000BC29C493BB2F6F60F8569B9C07E5CF4DA5
-:105980002C405EF4E2F7647EC751A002BBBB7438C2
-:10599000E33F6AE95061CDE5FDA800E85DE6947457
-:1059A0003C19786900EE29AF4FD18E83AF5FAE53BB
-:1059B000F9BCFDC96762381E7724F86C22E869C813
-:1059C0007199EA5ECDBFA7F19A2AEF59FAFEE52C4C
-:1059D000DC2B7A31B92679FE7AC4A036E4399EE40C
-:1059E000B9FF85F22C36C97B0CCA9C856DF2D9585B
-:1059F00077BE30D0C7FAC225C2B740FE2B845C1FE9
-:105A000055385F97F754128C73AFD17ED5E0586A42
-:105A10004FF576A7CC1736F89DE990F75866C6097A
-:105A200017E22042CBED0B7CFB76F7C58DE4FCC280
-:105A30009CED91796BA3C2FD78DF79FC4195F3DD94
-:105A40005F8995F7B837123F14F24F7FD2CF1FDF2F
-:105A500095F8983C444B1B8971A9DFABE8F7F51E1C
-:105A60008A48E1F8796E3CAFB37FE47A3D6BA4AE2F
-:105A70005F068801FFF4F711DACB7B8417BF9A1B0E
-:105A800004DE8BABC9AAA5F2EF5CF03D7135589FDF
-:105A900067B7EA9D51A227FFFEC598541BE799FFFF
-:105AA0006FFB7D844CA1F1FCFBCFFE4EC278F9E880
-:105AB00082DF49C84C5C75404B6DFD9D8CE8DF4929
-:105AC000C8D4EFA7166E693F8CDF47B852F8382F5D
-:105AD0007F5CBAD9AE8C718D3EE0E2D21CEFC9BCBE
-:105AE000443ED74D23F5739D97E27BB9D0F92ECF75
-:105AF00075420EF4DF3B09423E8DDF3B31F86EFC10
-:105B0000EE494D7BF9BB27FF6ABF7312CD9FE8DFDB
-:105B10003D89E64FF4EFA08CD262994E63CAE259F8
-:105B2000AE0D3E4DA7FFD81FC0B95CE5BF9F5FF724
-:105B300047CDD3B362F520DC537ABA58EAF58BD956
-:105B4000FF695EDFEFA16FB6E97ABFC629E321BE28
-:105B50001AAB881925703F21E7CBFEA246DE03551C
-:105B60006395F18000F115F7E27D1BFB0F799F2310
-:105B7000F947B68E88CBF8F9FD80DDE9AAF144FC3F
-:105B80000ED652791EF89045FE9ED4EC1CBF82FDC5
-:105B9000CB4E5DB5A7A0AFD245D1CEF91C97F70F7C
-:105BA000817E9FF5274716EA677591F7478A1CF9AA
-:105BB000BB4106FEB332655ED6B323753DEE9179E7
-:105BC000587B46CAFDC0048F8BCF3514E7083DBF14
-:105BD0005564CDEA0F39FE84FDF816B7F4AB1B6DA2
-:105BE000F21ECBC0AB329F679DFF6DF6FB37935F14
-:105BF000AB4AFF66EDBD1C674814D8C77D2CA6399B
-:105C000019F8F75A2B4CFE429FA0D39497DC6FAB48
-:105C1000CB04F70FA59BDA5FB1D76DAAF7867B9B04
-:105C2000EA730F7A4CF0A0867C53FB211FF84CF0EE
-:105C3000D0C6F1A6F6C38F1499E05323BB4A3A416C
-:105C400026693CB396B882F25E7C1927E96297FE1A
-:105C500054CD6D723D61E4AF6BFA3C88CE5FEF6C62
-:105C600095F9EB76BFB46B5ABC5CDFBADA0997CA18
-:105C7000E7621A18C6DD109C371E30E7997772CAA2
-:105C8000F59565AC5C7FD8F53CF3D8DEF2DC8B9102
-:105C9000574EEB0A1FE8DD5D34CEE0DF2FD0EF1367
-:105CA0008D96E7BF8FD4EF738AC2BB8B5D9EA7AB87
-:105CB000B9CDCEFBE75ABCBD4949BC109F6E7A7E78
-:105CC000E46667DBF73E39474939BB21AF488CA210
-:105CD000768F92D962FFEB82FE3C8DD07735BFB2D2
-:105CE00073DEF8A5FA9B75851CCF4C8B65F6E41C1A
-:105CF0005E0FF23940A3DF74F44BEDFAF874398F7C
-:105D0000EA6F565233DFBB2692EC6EC8AF16BF92D5
-:105D10006157AC4856DBA07BEBB90C99A77FD3EA5F
-:105D2000D0BDBD08CF99F65A9BBC702068833C4C0F
-:105D300028203FD28BF8EB43EBE3891F8FE207EC7F
-:105D4000C8CFE8B2AFDDEC4077F899CD2C0F4844CE
-:105D5000C17E22FC4F75602BDE6BAE9479DFBE51A5
-:105D6000C2B8FF80F16AD1E3232D2274FEFC44A067
-:105D70000D79D3E2EBF91C826BB194A7CE11E7AC9D
-:105D8000B0FEFC9F3A2F21B0434AFDD86A853CE71C
-:105D90007809FA19E754DCB7D88A36C6E3BC881804
-:105DA000AF44D0E1892BA55C2E061DDACB76D04717
-:105DB000176B477E5F12F6175A843BC97589B8FA8C
-:105DC000FFC4F833AD32CE90E594E7453A5B35D663
-:105DD00017F6DEFA3D7717C8BBAE37F4385927AB54
-:105DE0009CF79D3C725E5FA8170EF0F7ED9ABC37EA
-:105DF0002D9ABEFC2F22AE629C5F891D2BF588A1D7
-:105E000017CE9F43E921D7A1365D3F04BB5B38EF36
-:105E1000E0AE04F33C7E7C94A46FA13E8FC9CE27F4
-:105E20007A079BF484C0BE5ECD0A95F504E9C97A71
-:105E30008DF02CC6BD2CAED6DF7BBBF90169C74601
-:105E4000F98A1EC4BEC99C3536B181F715E4FDB090
-:105E50000BF438797120EA7E16DD1F3FBB5A71E1E1
-:105E60007720E6AE32D72F88FFE213AC1F6F8EBECD
-:105E7000A7C6D8AFBB441CE0FE51BAFDF7088F9E01
-:105E80007FBF0CF89D0DCA7BAFCF9F57D2E33F2D4C
-:105E9000C167257C87E07851B45F60C06EEC9345A4
-:105EA000DCC342F48DED0DFBBEDCDA667EA341DF80
-:105EB000F3791EFA3E1D95CB56F07A46E637903EB2
-:105EC000E07DB913540F3FF044E00CB73FB12B868F
-:105ED000F34A4E7A1B0660FFD6D8A7EBAEC97DAC5D
-:105EE000965D0932BF21DE22E1ADF21EFB457F0F38
-:105EF0000EC03AB631F0ACE99C83D668DEE78B2E53
-:105F0000B5EADDBCDE3C9CA7D58D427EBDD5E3F471
-:105F1000107C77FC7EBEA76B02AD1FA1D79097B215
-:105F20002255E2CFFA2B7046D2CF2FE9770D397A7E
-:105F30009C9F27487B228E2968554B65717828F7EE
-:105F4000FF63F7C1A69EF3CAFDDF73C3F97D6DD56C
-:105F500050867B079B477F40FD5EA7C5BB1147BAB4
-:105F6000B6E617E362E9D38DBF8F5FC16567F3F9CA
-:105F700001A3FC58B7238DB6B6EB27E8FA67E19585
-:105F800086BE96F2BEB85AE17DB5C59071C0F7CA1B
-:105F9000FB390DF84CAD0E8F93F092151286698285
-:105FA0001F3C47FFDDB32D7AFC05E34789F1232E23
-:105FB000B05D8FCF60FC28317E3C87BE020C7D0532
-:105FC00018FA0A30F4154AE82B3CFF3C790CEF6BC9
-:105FD00063DF6E6CC47CC2BEDDD888F9817DBB48AE
-:105FE00018FB7691EDB16F17598F7DBBC87AECDB4A
-:105FF00045C2D8B78B6C8F7DBB4858E4FFB415867B
-:106000005EF34D36C153693D3036623E63DF2EF29A
-:10601000FBD8B7337D4FBBC5F4FE8D62A9E97DEC9B
-:10602000DB45B69FBD5431EDEB09D1CC767DEEDA80
-:106030001496A3D7BC451957B6E7DFA9FA99AD2B3B
-:10604000EB078E632C2E8FF5487ED78E97FCB7C852
-:10605000F3114A33FFBEC0993BEC121E67CEDF3608
-:106060004AEC7B8DB5C97D2F94D8F742897D2F945A
-:10607000D8F71ADB43EE7BA1C4BE179E63DF0B2566
-:10608000F6BD5062DF0B25F6BD5062DF0B25F6BD75
-:10609000F01EF6BD5062DF0BCFB1EF8512FB5E78CC
-:1060A0007E88F09817A1C7E0AF7737AD33490E4D22
-:1060B000EB4C970986BF1ED91EFE7A643DFCF5C8DD
-:1060C0007AF8EB9130FCF5C8F6F0D723E11B46B91E
-:1060D000799EC16F8F7C0F7E7B24DCBF36F067C456
-:1060E000D626AE3B7500656382F228CE1BDE70E5D6
-:1060F000B6D9D8BF6C8C51B29249A7DBAA77CC1E17
-:106100000B7BABE73F0E10CD16E81F0D8BC93C3E55
-:1061100067C879A5FDBFCBE0FADBF5FB11F81FF1ED
-:10612000DDBB4BF0EFCE18FBEDC6FB1E32DB288D3E
-:10613000F6AD70DBEDA2FB37DA716E55041E38D177
-:106140008CBC19EF1DF103B10ED9A2FF8EF096653C
-:10615000322F3A5AAE7EABEBA72D969DFB710EA661
-:10616000B958F1E0DC47F75A8DCF99F59F292CAA51
-:10617000B7753CBD1E4BE4BCDA5F5C29ED9181BF75
-:10618000111F257DC1E7074734378C49A2F65A60B5
-:1061900034FF0ECE04BBD07F2FD83F0CEBC97E015D
-:1061A000C5B73142CEABF5EF690189C7138F4D9268
-:1061B000EFC5CAF79E782C91FB9FB45CE13CB3110C
-:1061C000DB850FE794EFD1F1EFB73DACA2BFE2E57D
-:1061D000B23FE3BBC5EBB2EC38CF6DD0AB58348ED9
-:1061E000C57DD2224FC19DB2A2A75563BFB4C34C97
-:1061F00097057ED0E59E831A99973C0E7988A24E2A
-:10620000F0BDA113F3DE328D97C93518BF6B2A7824
-:106210006DA8056EB1A0DF49448014C49309C67807
-:10622000344DF8B389BED74D2F667AF79E2914D026
-:10623000BBCFCC0D96547AAF9FF69205FE5AFFDA8B
-:10624000462E8D71784624AB8027D85CE380FF848E
-:10625000710AEB8FE83C1EF8070C2FB7B13D37FCF5
-:1062600087C509E7F37CFE8A3C9F33076D9CE77383
-:1062700066F959AE2FDE1DC3793DDA5A85F59AE1EC
-:106280003718793B65B7BC3718F439961DDC92DCBA
-:106290008DEDFC1FAF441E4BD79D89381A7762F9EC
-:1062A000EEEBE0529E59BE5BFEFEACBEBF63FC8EC1
-:1062B000A9C8F1713E98E1070AB5CE1EB98F63FCFB
-:1062C0001E1AE94F6E7766AFDDC5BF47A7FF7EA9EF
-:1062D00011F729FE4B6E3DE85ABC5EFE9ED99C55D7
-:1062E000F7154E2778BECF19C6EFA147E7632D8C6F
-:1062F000F2032FF5FBA5C267F6FF2EE6EFFCFFF2D7
-:10630000BFB7FCBF73A5703700800000000000001D
-:106310001F8B080000000000000BED7D0B58556539
-:10632000BAF0B7F6DA37606F5C080AA8E002454DAC
-:10633000C936225EBA2EB9282AE206C4B441DC204E
-:106340002676AC21B3911ACA8D7B4348D6C04469E6
-:106350008ED5D6D433534DD1654A27EB6CB59A2EE2
-:106360009A263975A682ED25B53BE9F1D49CC799EB
-:10637000CEFBBEDF5AB2D776836633E73FFFFFFC22
-:106380007B9E66F1ADEFFE7EEFFD7DBF25136D06B2
-:10639000369EB1337B459F98C258C5BE3DA52C8E15
-:1063A000B1533526C6A05C562F322CB367992F4DBA
-:1063B000C0728E2102CA657F501C82CCD877ABAAEE
-:1063C000F7BF064DF7AF823616C68ABF1FCC5826D8
-:1063D000631DAB642A977E3F86B158C60A0211F44A
-:1063E0007EEEF789F4BCFEFBCBE87DB10DFAC1FC73
-:1063F000811DCCB71AE63BE5B650F9D44EE6C3F999
-:10640000F1173781B111F8070C99C1A43C368CB152
-:10641000D18AB007BAB359DF5F45E3CDFB3E83C6EF
-:10642000BB667C45C300E80FBD1D69D07ED6F8F77A
-:1064300072FAC17A5DEE295922948B8DFE39387E2D
-:10644000B1C3C4DC29F8FE564302D417325613EB0D
-:1064500080F650C6FDBA5CAC468861ECCE89D06946
-:10646000009459CDEB03100E5B98632BBC9AE7AAFE
-:10647000C8C67663CA9820C2D4E551ACA61DF7629F
-:106480000B64155DCED80FF8BB0EDEE322AFC4C59A
-:1064900027BA14A82FEF077F0EA26D29CCCA983D0A
-:1064A0009DD75FA924BABCC3E1EF96758A7520CE4B
-:1064B000C77F43CDD00EE611EF34FB5603FC5D36AB
-:1064C000EB61612C54B8F394C028DEE68754C6868D
-:1064D0004D823FB2E05C0C86854E9867C18A0C7392
-:1064E000657ACF3ACCD9D9F3A6C03EF2F0BC61BCF4
-:1064F000E56B4C3E4B0A3ED3E299ADA75DE87311C4
-:10650000C0578EC575076E17003EF314A6E4C25C33
-:10651000F399B62FE667B08E1BD4B2D7AF049A6C4E
-:10652000040F2ACFF18F70B9611D375B03530193BC
-:10653000D8CFD36BF2130D8CBD61E270B5985CCAF5
-:10654000605887697B867FB08CFB90E83D330612EC
-:106550009D76D8C7DAF6FB46C27BAF22F3FD995B86
-:106560004C0C07623E9313E0BC289D293E84BB91EE
-:10657000E3D191352F3DDD2CF4ACFF8889CD6B0F35
-:10658000B3BF3AC540F36C03BC954732F6DB5556B2
-:106590007A3EB14A6232A0E053AB12A8FC34E0313B
-:1065A0003EDB578DA2F7CFAD7250F9855593A8FC0D
-:1065B000E22A85CADB57E5D3F38FAB9CF4BE60B407
-:1065C000EB1605D6FB9041397C0FEC6F90D8C210CA
-:1065D0006FF1DCAD137ACE37A2E5BB0A3C8F2A9B64
-:1065E00059C6755701685CB08F4AC5EAA8075000C4
-:1065F0006C1B13A05C2EB2EE6647B873E7707C6C20
-:10660000FE7F2D3540BBC7EE8A24BAD5E057663EE3
-:10661000F0BA35A5077E1FD5FEDAC40C746C69325A
-:10662000CC7B434D84A33905F1C3E9C1F546A53BB5
-:10663000CC2E80D7BC298CC6BD32D5D988EF6F5EF1
-:10664000BBEBD10FF0FC76A6985D709E15DB331A7C
-:106650001364ECE7BA5781761536C98C78778B3797
-:10666000C62CE3F9C7033D206EB3EEE4627B0FDC7A
-:10667000B728028D7B7D361FFF1B3C1F6AD7622A1D
-:10668000D2B5E3E7733E3D1C9882F0F200FB581D43
-:1066900083F4F0E2143C77E94EA091C9B01EF63EB7
-:1066A000D59B1398E489391F5E83D90101EB13014F
-:1066B00096EEC93DF06B1E55497CCE043428C604C5
-:1066C000C38F113D85E2CFFBB80F804BE50A6175A2
-:1066D00003CC5FD526FA0401E9ABE00DA2AF564129
-:1066E00026FA7A70983991E84D90907F15F497A723
-:1066F000C643FBEEFB0469B38CF40A738DEB19B748
-:106700006AFD64A2B72A1F3C337BA7CB9FB5EE4935
-:10671000DA21E3312A665C6795A498FB07D1FBA2D6
-:106720001681E822B4FC9A22723A626F9A106E6562
-:10673000C365C19381FBE1F8B160458AB9D286F5A2
-:10674000CC6F807515A4B237B05D772BAC3785CF91
-:10675000332E68DC4A1C37685E68BFD009E57715C0
-:106760003BC1B54292CD8928572489D657B9629743
-:1067700009E1B308E02C64203C1C661B8EBF14C6E4
-:1067800007F8DD20F9F3B0FE867499D5C339547A41
-:1067900033CCC89F5C6BF93CAEA618F3E550AE3025
-:1067A0004AE624289745323A37589F0FFB57013C59
-:1067B000FADB705CB610654B285C2AD4F556B5C47C
-:1067C0009817EBDEB79AE474E26B4A387E214EE10B
-:1067D000785BE92D4A5E87E7EDB64B44B746C5ECDA
-:1067E000C075A9F09DDFB6CE9412D4FF5B158FC59E
-:1067F000291CCF0A52FD6902EEF7D60807AE77BE14
-:10680000D46242789E83F3831C0E8B257F1A8EBF41
-:10681000D8CAE1700E3FDAF4E7DAB33E0EEFAAB65B
-:106820000AA2BF1B8DCEE475D0FF4658A71B9EF36E
-:10683000D7EF4A13F009F42E207F905CC9CE207A5E
-:106840003BFEE0F5C9B47F583FC2DBEE90A722DFE4
-:1068500001BC21B9ABE14F7926A76BADDFE029463A
-:106860009A77F0944BA3D7AAB5EF51FD22A0579485
-:10687000B766F68280F5666084E1E837094786F6F8
-:1068800036C01F77620FFDCE6781F9C85F17AD2D47
-:1068900062AE20FE03F2B6E6B930F09A87EBCD2265
-:1068A000B945E70D74F81AEBDF539FAD9E7759AAEF
-:1068B0009EFE713C1CD7A1D567FBD36E4DEF69AF2F
-:1068C000CD5BD69FF7437A403C74A8F0C1F6CBA9C4
-:1068D0003D2F833C5EDD80FCE13ED16711F0F9780D
-:1068E000C3402C3F0BD216B6F6C5F297DE9D0BCFF8
-:1068F000CF1FDA548EFBD3D6B118F41DE41337AA98
-:10690000F2B9CA1F9E5FFC6292EBBA295941F8F3B3
-:10691000C0EF4720FFFEE2E977D210CE1FDB39BF80
-:10692000FBD9EF1F37B1D49EF55736BD67AAB00526
-:10693000C38BF3BBE65107E9FC168DE2FD1679BF68
-:1069400025F9C5407EA5A59C7FFE15DE6779FB5A1B
-:1069500007B577D9FECCCF7F1093C4C40B9FB77611
-:10696000BEA1E7FEA8C9E94F407D34B54547FFA168
-:10697000FBAF50D75D3585F3B71B543CBEA1BA952C
-:10698000FA5536553C8E7AEF7C8D7EABF4EFB5F33D
-:1069900039B5D644E7736A6D5A23EA8BA7DAF9F959
-:1069A000FC8BD83E7625B4FB62D9D65B1253492FB7
-:1069B0004946BD04CF07F5D21B55FD74099C0FEA6B
-:1069C000A761CEE736D4CBB4F292C7F8F92C7A7A25
-:1069D000DF277F9409FFF8FEEEB3F890FF56B63F2D
-:1069E0007BE84A783FBFA9D59402ED3C5352083E5C
-:1069F000E7F87C4D86C4A2617F4D9B4CC8073CDA0A
-:106A0000BE43F05C832B33723EF328E8F0CD315C5B
-:106A10001E09FD7BDACF674A3CF211E61EC2B6C6FC
-:106A20009DBFFEA7553A2A48759849AE3544B1CD69
-:106A300012AEA3E27E36B677F9753482D305485D8F
-:106A400005E9F3E8144732D285A6BF86B6DFAAD29D
-:106A5000D7E0A8F6F9B8DEC1B120DF01C4BF895480
-:106A6000B251EFF9CD9556C9E3C0FE2E19EB2D5664
-:106A700026A17CDF6C90C7117E827E7F4F22C232BE
-:106A800090857C6FF8B2C0B7B83E44A78871FC69A6
-:106A9000877DBFA3C20B55F181FCBD1F9F49C67600
-:106AA000E25391B51CFF42F50CAD5FA87E11AA57C9
-:106AB000F4B6BF3D17B9BFA3292E1FC98908266D9B
-:106AC0008EA1FD2DC7F2B9FD8D628A01FA97FFF202
-:106AD000F24DA84F1EAD57769BA1FEE81D36EAFF8A
-:106AE0008FDA6FE83EE75755E8F6798E6E5A44B272
-:106AF000334EB56426935D07360F83FAA3B7461865
-:106B000010FE4753B8BE0016A01DF5C46DAA1D891E
-:106B1000FA383E511F6723B93E8EE5A755BB12F5E3
-:106B2000717C7F5CC5BFB248251AE57277BD5DDA1E
-:106B30008CF0F073BAE9AC1D4670003D81F36355EB
-:106B40002FE89402F6FE417C1AE4C77D28EF58ED49
-:106B50003086F65D67CB51BB211DF192AF4F6BBF05
-:106B6000C2D4C2EEC0760F0BBEAD306ED48AF7F23F
-:106B7000E2514EB7A56408D06F41ED69E2870B6C16
-:106B800003658672DCE66A9C88F5EB53A4D5D02DAC
-:106B9000AA2DA3B316FA2FF68E24FB798520937EB7
-:106BA000CFEA05B22B996A1F2CC1BFA0BCC4F6C6A0
-:106BB00070955F1A905F2EBAFF8EC644281F36B0BC
-:106BC0006E11405360289A8AE5820D310E0FCA5B20
-:106BD0000FDF0FDB087CD4DAC3474F4F72B26CA4CF
-:106BE000F7B3806F30FE68581BDA512B4CED0AAEBC
-:106BF0009F81DEB195E17A9DA4C7AF52F1A2B3EDBA
-:106C0000B05D56CF07F5F3E1AEEEC3F7E0B9DA0CAD
-:106C10008E6619E5BBBC5F46B8BF2532D4678733A3
-:106C20005EBFDCCEEBE149FAF1F24DA28F917E5CC2
-:106C3000363080FAD77A91F8E2E24D250351DF58D9
-:106C40000C65945F1B702AC0A7C6B61CDEAE35EF7C
-:106C50002137F0D3648139911F1D33068A101E2716
-:106C600037C5F7AF477DEF66CF0806F5559BEE4970
-:106C7000C6E7C94D11F3908FE74A45B931A8FF6CBB
-:106C80008CC940BB5FA3B3F46C2E0F6EBA39271EBC
-:106C9000E5DDB2BFEF795402B9BA187054423F48EB
-:106CA0007B94CF0D4D96ADDA9E2C026AD9E35C231E
-:106CB000116EFF62D8397732CA61C1B72D91DACB34
-:106CC000F1521F76F371B42B014F6FBEFB431AE7ED
-:106CD0002BC3DEC2F9D07FD9CDCF47E338FFF260B6
-:106CE000C70409DE1F1BEFCAC4F13F17366D93D0EE
-:106CF000AE5DBF692CCA8FF1AA7D54D0DF39773ED3
-:106D000087AF63B3DCFB7CD5DB0582A7565EE0EB87
-:106D10006766A897FA9959C2A7C4480F3E29B25A84
-:106D200094EF9A5EA2BD9F96CDF9CFC97E2DC9780A
-:106D3000FE4BB7AD4B46F9F1999D975D5BFEB4F8FC
-:106D40004E5887ABCD2031C03B979191DEBBC8CD6B
-:106D5000F569560DCC24B167FEA2EC2882F3D2F57A
-:106D6000993AB9878E197CFF9991E5E33A867ABA08
-:106D700033507FFAC8E85F8CE7FA11E8A7E8974933
-:106D8000CFE6F8F7518B3815DFBB57080CFD4F1FC6
-:106D9000B53C6F1FCEFD28E4C7602F9B7C5BA1BD77
-:106DA0007D7CBB1FF9DECD2FC48C4330E689E9F131
-:106DB000883FCB7798A60EE6FA145AD36C99D16F18
-:106DC0000E776E37A97AD4B9F20BCF9A11EF973DAF
-:106DD000D54A7E0550537CA8DF2C6B7FF68D413061
-:106DE000DE2DDB2B32711EADFD2D2F703844B080AF
-:106DF000B92448AFAE18D5BF7130F0C8E5D9F9AEA7
-:106E000007511FC273BA12D424655245BD119F1297
-:106E1000ED9319BB491F07FD8AECEB9BBD7CBC9B26
-:106E2000471D6C4CA57D15C5B2A0F3BF2DDB44E713
-:106E3000A5F5877D533F8FF5EEC702B05EC563644D
-:106E400011D742D9C83EDE86F063D1D256DC879195
-:106E50001D7B039E2BC57EAC199E1B6B96FF2BB52D
-:106E6000AFB748223C3D37D73D1380F964913919BB
-:106E7000F47767D7D0786E33973FEBA29E7EF846C3
-:106E800028D7CEB13900BDA11C4DF0D9F90B03F1C3
-:106E9000F944D6BDC700CF78065404001A92EA6AB6
-:106EA00021BEC3383F5E799BEC437E0C1C5C403CAA
-:106EB000FFE6951399B8EE6B87064E235E99EAA715
-:106EC00057E402FDAFCF56E1921EC8C4760376ABFD
-:106ED0007CCD7880E4A32941EE8FFA8A1FC7C2F5E2
-:106EE000FDD54078B053F03F8EF36A70DAA7D2FB3D
-:106EF0007319AE4DD9F05404D3ED7E683F5B8876AC
-:106F0000E07E0FF417D3C60D433FC4C72938AE1B2C
-:106F1000D0561CDCA3C766AB4B370F9AB41EE132C8
-:106F20000500CAAE065B26BD3F3342F95E66E8B691
-:106F3000C03AB2BBFFB2A91ECAD2AFFB3111449511
-:106F400027229965C3F8C26ED828EC6777FAEE4518
-:106F5000B8CE7BBBAD0CE1C4AC7A3DD76C48F4FF36
-:106F600012F1B926DAC112500EB567203F62B7D8C8
-:106F7000C83FB3E06C20EDE72897FEBA97F4F49F82
-:106F8000A5BA5E46B80E1295C32EA8BF57F20FFBE6
-:106F9000158E5F1BE5A8E7728405AF7FE71D7F8D27
-:106FA0008E857EDF748F303E03EDBE51AC0EF4E76C
-:106FB00075DE39E6B5ABA07CB52A4F42D7F54D82D8
-:106FC0006C44BBE39B6EAB1FF5906F6C06F2736471
-:106FD000EFDCF321FA21B3AD36BF188DFD4C5F060F
-:106FE000CB1B762029E6F8181231EC0780E74055D4
-:106FF0002E5DDB4F6F3F7666733BA853E53F46D966
-:1070000041703EE536B266C44306659CD768959AE2
-:10701000617DAFDAB62D40FFD5A9EF53FBA1DC3877
-:10702000B573583F96DE3B5FEC407D02F484884C9C
-:10703000E5533C7F4DBE96AA708968B9DE84F0F0B6
-:10704000003CD0BF566A33F82DE85F9DA38703ABA1
-:10705000ED2E47BC61866807D20D9E2F9EBF2C186F
-:10706000BAD955E79FF7756725FF2FA1BC00CE134E
-:10707000E15A7EEAF8E5BF62746EDFE23AE01C1B7B
-:10708000AE603DE7F7BFEDBC98D1D184E7B052B414
-:10709000B7E039788C5CDF73036E6D8DA16EDBF029
-:1070A0005C567A86D3390DF4009F403B0598DAE6AA
-:1070B00038E42B07A9FD56CD9F36AA86F84CB9C7F0
-:1070C0002221FCBE8B8CA6FE0CCED534281C9FE161
-:1070D0007CA5B68A115F59985E23E0B927E00CB011
-:1070E0009F4E43C08EFB0C44801609CF6B725255E5
-:1070F000FD1B3882EA67C5FE8FDC61DF8CFC46B47D
-:107100000E7EE4188822D6D41D3D1AD6D526B07638
-:10711000DA9749E51F4B6DA4CFB5C5F888BFB59583
-:107120000E71E05EBF616A7D7524F197AB0C062A93
-:1071300077CF1F48F6585B0CB0561C6FFE68D21B09
-:107140005EFC3B8F9774A7315E9FC146ACC7FAA225
-:107150005134DECB1ABFBACF4EE3B515298991540D
-:107160003FD080FD5B535C137388AE793B503CA8E5
-:10717000DD860D4A229EE7866233B57B4870CE5F7E
-:107180008CE35C6E23BD31303FF2E96DFC38FDE8E5
-:107190005FEAACE5FBD6E840F3AB0F751F7E18F94C
-:1071A000873B1B4E04ED43EBD70B10AF1531DA01D3
-:1071B000287CDE397F770ECF59370097C545769208
-:1071C000BD2EA73104369C9FC4B2114FF6003CA1DE
-:1071D000BDDB04E71CC7CF79751C9E73E1A6E07385
-:1071E00086F1DC2BE1BDB03CDA214CA2731E85E3B5
-:1071F000D7B24807DAD7E7CEEF555F063E4583237F
-:10720000C102B0F83CD5353F27AB478E3CF209ECC4
-:107210000FE0526E0964B5A07E6E60D5ED61F8C0D6
-:10722000A21C6E1F48ACDB84F275A186FF7521F8A5
-:107230001F1812733C4AC57FE8F74ABC73319EC3DE
-:107240005742C7047CB9F76FE2BC70E3DF9CC3F917
-:10725000D68138E7325CDF70E3EE21B7A1BE7187DB
-:1072600085F45F7676CF109CF77729CE9FE378116F
-:10727000C3BBC9BFDE99D86DC2FD75CEFF3C09F511
-:10728000AC85B57F22FABCD8F5AD8E1A6B42B91920
-:10729000939F610A40FFF8FC8CD7F15C0ECEB2C818
-:1072A00096307E905DB32626A13ED4317D6212F2E7
-:1072B000CB8E245833C953871DF9A869FBE5765C4A
-:1072C00067477E26956526ABE5923EF9EB17C05FD2
-:1072D000FDA0087C06F61A3E4F80BDE6077EFB291E
-:1072E000D86BF83C0AF61ABE3F0CF61A3EBB56396C
-:1072F000E87D47FEB0ED8817675AB81F6591D11138
-:10730000562F5BF694C8FC1A7F83FF6EDA12A52B0A
-:10731000576F8CD5956F6C030CB2F694ABD60ED329
-:107320009535FDB3D23B46F7DE5597A92BFF3F03BA
-:10733000DF260E5FF497FF6F822FFED682BC2BC133
-:107340003F00BFF7654D233EDA21B09A5878C64812
-:107350009CFF199D02F9DDF0D70272BB18FF00BA3D
-:1073600031DAE406ACF742FB5F435BB47DD1FE60EB
-:10737000CC61AA80F7A5F91112CAF3B9AC86E86C02
-:107380001E6BA1E70DAC9D9E65EC003DCB19A7C31C
-:107390006F2A0213F0F9719CEB53A4D36556D7639F
-:1073A0007168B725B946C6223FB2F527BBB4B7739B
-:1073B000420D9BA97AAE6D82BA2FF8CDC1B543BFFD
-:1073C0008351636FBF5DEE99471B1FE63B8D7CE3E6
-:1073D0002B139F675FD6C424E40FCC3940674FF569
-:1073E000365FAB2A272BF2399CD0678BE563A50269
-:1073F000C58B77B55ACCE85F38B6C6A4EAEB77936D
-:107400009D7BF810F7CB1C6B98968CF857DF3A32BF
-:1074100019F1FC98496EA805F81F9B0CFCDB417E16
-:107420001C07CA8723F976EA0F92223A03CE6D91A0
-:10743000BABF23B2C37C07B42F4D1499DB81F1F49A
-:1074400094685CBFB6EFD07557AEB5E8F060F6242F
-:107450007DB994997BF02D05CFDBDC538F7A925860
-:10746000D6CFD587DD5DFBF1D2FDAF05E16B72AE06
-:107470003D0EF51A36914DFC41ECE9DF1B7CB57CE5
-:10748000060DBE1A5E7D9FE31C999B45AF29DE86E3
-:10749000717494C71DDB391C5BA3AEBDEF2A80431A
-:1074A000F1FB22E3702E777F84F8BC83FBF543E782
-:1074B00009205D8F447AE5745DE17D8FECB78575B9
-:1074C00045265C5FB1AD3B09FD4EBBEE1A9984E7E2
-:1074D0007270D6C824E41B7BA68F7C64058CDB55B8
-:1074E000203A2C804FBB0A4EDF87E58E3A51C27995
-:1074F000BBB69F56F94BF7BE89B0BEAFF34D24879C
-:10750000BAB6FF73F84CF10EE03330FF191FE733C2
-:107510004B8C4ED608F32E01B8A01DFFCFE63717CF
-:10752000E233074DCE3CCCDBE8AA171CE87FAB9FCB
-:107530006E21FDE120D08785E353C30AE49393C015
-:10754000FE9510DF9C596853766C1F3600E1C5DC50
-:10755000CAC151137AF07D51DD9202F4AFB3B5A6E2
-:1075600023A877A33304E57331331E0904E1A9EBA3
-:1075700005534F99F0DA78241084D7A1787A1BE26A
-:1075800069540F9E9E616793CDA9BCFEC0C01EBE0C
-:1075900087BF60FE728BE86FC478BF86B7FF39FD86
-:1075A000BD72541280AFDC9D0BF8FB8B7129AF04C8
-:1075B0008420BE72917CAC35EAEF24F7D645FD9D60
-:1075C000E4DEA1E95CEEED9A7EFDEEBF20DEDFC5D4
-:1075D000F1BEA37422E1658709E419C0EB605D6622
-:1075E00034968FAE2D213AD3E827749E2E15FFB521
-:1075F000760B8DDD264718FC74D589BAF34C7B6178
-:10760000413FE7E5BDAF5F1B576BA78DBB3024AE95
-:107610001B3AEE13B9DC0E4DDB52D6E7F86000F6EC
-:10762000F4A33C94C81E7C15510FB89EB9013E5D71
-:10763000F91C3E5D05D7133D1ECAD7E8D2C5301EE2
-:107640007B708EE843FDB52BFF34D1E919A0531AA6
-:10765000A397794FAAF4795CA5CF632A7D6AF5E2F6
-:10766000D607E7DE80E3D689C4A70FCEC91C80F316
-:107670007DB6258DE685F550DED15BAF2DACAC1F18
-:107680004EFCC18EFCEB10C001ED8492D212B2A769
-:107690004B4C8E01E1F484D07D878EB76B9685F2DA
-:1076A000C8603CE277C57795B046E40B0007C4CFCD
-:1076B00043D81EEA8BB7723FF01E6C1F170CA791C0
-:1076C000A4AF1CFAADE040D161DAFE373B9EC35255
-:1076D0009F9E5F2C591FA53BB7C52DB1BA72F1749F
-:1076E000BE8F4375C30684CB6BBAD0F969FD2FF604
-:1076F000FC6F52FBE39A7F203DA5BF6E3C04927E57
-:10770000BED490FAD121F5E374E50BE1E361152FC6
-:1077100034397238425E102EBED45568A90ECED3CD
-:1077200088CEE3764B749E1AB7FF917235224FCF05
-:10773000AF2ED45FE34F9FE738A53C94A3FE12CA57
-:10774000DFBA587E14248713F270BD01C18CFD5B33
-:1077500055395BDDCEF16E5DD4FD947FF395AAA71C
-:10776000035E12BFFF5AE5F75FFF412DFF5E20BCAD
-:10777000DCB3636534EAED27B68F8C463BEC48BB3F
-:10778000271AF9BECCDCD157023E7EE904F909D3B1
-:107790009D6CEF5B7E7EA6F29D13780E2437253A12
-:1077A0008FA3AAFC3C8CF293E4FD287A1E44F909CD
-:1077B000F5739E55F5F4DF0A44FF4B8D2DE1FDD3A3
-:1077C0005BF4FCAA7A6354889CD4CBCDAAB58375AC
-:1077D000E54AEF305DD955A7979B796219F1F5130A
-:1077E0003E0EC792FC4C5DFB13B21C2D117C381C65
-:1077F000BE36C9D18867477CB1D1C1F4A2F1DF831D
-:10780000217038867040FCF496F4892747D5FE5ADB
-:1078100019EC4213CE5B6275BC1E877E84B5820371
-:10782000E35498EF3709CEF1C09C8CC79B83F48C4E
-:10783000F7F344C297C3DE3DE5987775060C30F444
-:10784000F3FEA96E4F32FA572B9E8A22BD2974DEB1
-:10785000AA023D9FF9B2A128FB23E857F2BEE8B384
-:10786000223C0A62887FCD7956F48950EEAACB89F2
-:107870000EDEC709950E35B9B3C45813F61CAB37E5
-:10788000EACFB1A4A09EC6E978506817FAC173D7B1
-:107890006490A4E7F72B31F2FD2F794A24FFEE1212
-:1078A000EFB7FB30AEB804F4405413FED4E42944DF
-:1078B000BC3EEC3419889FB6C716227CDC7344CAE0
-:1078C00083DDDB348CF0FC4853CE409CAF4985D33C
-:1078D00089ED168370053C9D26E6277BD54FE7F999
-:1078E000A5B784E4C609840BEA414689E8E2813CF5
-:1078F000EE973F0CE360BD01E804F5E12E9F98EFA1
-:107900000B431F0FA8F31C3DFB2BC29F377C7BA2B0
-:1079100051AF38DCCEC73F5A2745637CEA1D6FA6BE
-:107920009DD65700E3A2DEBBE37A929327BC1C1FCF
-:10793000719D641F3671F9D1E15D74FF6480C75792
-:107940006B45D23BBF6A2A299C8CE7BDD644E59C97
-:10795000A2528A6F74F8B87C39E43B5A8EE777C23A
-:107960000BA70FE5FA1D13F78D8FC37336113E5425
-:107970003DA53F97D2B57AFA825F74C604CACFA4F8
-:10798000B82CA81353D14EAA4C00F909947BB8A087
-:1079900084F22A8BDD7A7964614526C43BD42FB109
-:1079A0005DE52325597EA43FB740F272E10B3CEF21
-:1079B000DAB4E56A9277152D16DDBCC5757AFBA899
-:1079C00032C41E0AB5977EB4BC30D5948793171D78
-:1079D0009A5C60D25484FB1130AC9B33E0FD0B22E7
-:1079E000E5239FF14610FFAC5878EA1A552FBD16D3
-:1079F000F18039DC6C9266A707D159A5570CD1D319
-:107A0000F5F005FDF938EAC74DB1AA1C759790BF8E
-:107A1000EEF31CE510F1FB8BB5BF2F5ABF2D57F5C8
-:107A2000DB72D26F3B4A2D94AF79109B04F5DF5582
-:107A30007A3DF9750ECDBA9EF4DC43E7FC3A4ED59B
-:107A4000AF730D9DDBA102C067921B0EADDCA71EBC
-:107A5000A1F18B4FD57338AAF2C9C32A9FEC52ED1E
-:107A6000AD46555E78557971A840B5B7E218C90B97
-:107A7000A3516117C3676E6C8B0A910FB12176D445
-:107A8000E090F3D1CB8B6545AEC8A940F79684D181
-:107A9000BAF726699CAE9CB66527F98FCFC83C9F84
-:107AA000E81EC4098C9794F2FC2C666D27FF71A91F
-:107AB00043A6FAC1182784F66852611E89869FDAA8
-:107AC0007B298EBFD7CAFD61D7F5D82EA59DCA9E4A
-:107AD00052C6300F66B8360E80A31EF484C1E8C7C4
-:107AE000867912C040C3F61ABE0F99D34AEDB2ABE5
-:107AF000992440BBF4A929C4CF129842FC65E03216
-:107B0000A660BE0BF33D4FED1EBF1BF601781FF0C4
-:107B10005C47767989359AC7BB413EF68D67F53C5F
-:107B20007E991F4B7ACB102347CD5EF1566D77219E
-:107B3000BC0DD283264F25FA34903FA2356AAC099A
-:107B4000F1B4D8E624BF01E0F582DBD15FF98A9970
-:107B5000FB094AB97FF2E0F4898FA0BD3BF6191BFF
-:107B6000F9920F2E067C26FEDECDED84BA1237CABE
-:107B7000BD3FE7733937E6992FE97E44D776E6C0F3
-:107B8000F29EBAE74FBD8DF43247203BA3A32E8768
-:107B9000F365C69C98BFD9919FB39ACA93C030CE63
-:107BA000407A50561B711D00D766AA5F745FD67865
-:107BB000BA6F42F89BA0E6194978AE893DE5384591
-:107BC0002DB3ED544E28E0F9817F54F58376F53CD2
-:107BD0007FA7DA41DB54BA6953E9E6D72ADDAC095D
-:107BE000F5876EE47433C2E8B82F0ACA23DC7692B4
-:107BF00033FB0B8ED2BA81FE258CE7A64C179BC7B0
-:107C000003DCC65802C4A74B40ECAD86FD4C29A846
-:107C1000A7FCC51217A37845F19C7A5A5F00634B05
-:107C200057A1DE542F886A3DF2C731B17E6A5F6C7E
-:107C30006512F62FC97F7617E6E196BA003450CE6A
-:107C40009D532F107C2A603C68BFABEE011AEF50A9
-:107C5000355FC7413BEFDF51C1243794D358FEEE67
-:107C6000157C9D4E8C871EAA7B7E17C17B0E87F7E5
-:107C700055270D3A7ACCF047EAE87AF496FEBAFA3C
-:107C800091EB07E9CA039CA9BAF6B1F97A7A8F1C7D
-:107C90003E4E57DF915F6240397B668E96DFC3FDB3
-:107CA000629A5D37E5199B01E1317796A8F9710D6C
-:107CB0006C205A5D8CFCBE4DAA9EC85A8631CCDF22
-:107CC00078FC4E03E507AC99E3B162DEC3997623F5
-:107CD0009D178C4B7CE4D04E238D6B4DF10AE8C789
-:107CE000BC17E02C06E97F4D9A7C53FDEAB81E6371
-:107CF000D07AFACB0C33C6CEB56F53F1E901751DBE
-:107D0000C0B7A798705E27C793D802663041FF01BD
-:107D100073B89C0EA5CB76B5FFEFD4FEDB547CEC9C
-:107D2000CA7F7C7524C2651E237D244F5CB63A024F
-:107D3000D751C0881EDBFDBB2383F5C73FF636CE87
-:107D40009CCC3C1AC7CDF9E8E8D9822702CF7563ED
-:107D5000E0F377E1F9F2578DABA361BD4F08AC1D9D
-:107D6000294AE39F9AFE7DD5D74D543F7A1C9868E7
-:107D700050FFF2D7CDBCFD0426A3BFEB8FAADC6970
-:107D800052E9276D4B3AF917CFAC3793DDB3AD709D
-:107D9000C9E63658EFC899773DF102E24BE15D7FC5
-:107DA0007941EED1F34B0A133B317F7FC42A3B4329
-:107DB000FEA0CD9BB6E5CB6C5AB7646488A74F6E26
-:107DC0007DB112C7FBDDB6488302E33FB9D948FC59
-:107DD000E5B27B1FD9BC9E9DEF8F29C9D7DBF9BFC8
-:107DE0005BB3EE89EDF8BEF6F9C78E05E5E974CC14
-:107DF000BA2709FDA6075755B7E5A6F5CE3F4BCCE8
-:107E0000CC85F1BBFC97BF7CEE1D98FF03D765E3E3
-:107E100082ED80CFA7727DE7E0AADAB65CB0534767
-:107E20008BEAFD15A37B35C263F44B0365D4DF8079
-:107E3000148C2E8065FE8C088302FBFBC067DC443B
-:107E40007C60C69A343CCFEC270B769FC4733EA46B
-:107E5000E27B2FFAC841F59CCE954D32C1DDFD8AFB
-:107E600095DB378A9C44F6B1434E2A0ED2E70EDEEC
-:107E7000A5C5971C9F201F2F2E8BA2B8B216771175
-:107E8000F3BF6D403EBF70524D9644EBD7C7F1072C
-:107E900021FC3231CECBE3F56EB791515E106C0D03
-:107EA000E964A5389AF24D3E5CFA0B8AD7BBEB2DFC
-:107EB000525A1CC50D9EC1722DF01DCB788AE3FA73
-:107EC0005068274DE37E84D3F33C8F98E5DEE1EFE5
-:107ED000BDC0F998D4F3097D9F348D9F8B07CF25C2
-:107EE0004D772EBBF19ED479E7126D25FCD2CE459D
-:107EF0008C6EA2736156DB28CCFB88E72885FBD902
-:107F00008772A8F310F7977D50765BFD4A289F3A59
-:107F1000DB8F215D687195F2049E7F4047027CCB28
-:107F2000A4F68F57F56EE463A87797AB7197CE05EB
-:107F30008CE22EDA78676AFB497CBC5B486F2EAF17
-:107F400001FA475912F52AE9170DC3787E44B9ADF5
-:107F50007B01E5AB0A0607C6CDE343F47A37ABA154
-:107F6000F5C6BF2F923FDF10B596FAC70378F0FE33
-:107F70002166E8B260BF1218AD984F42570DE52058
-:107F80003D4BCDD78DAF7D89EB4739D03351379FEE
-:107F9000F003ADDFF3A9887CA0D62223DFC3DC2C5D
-:107FA000E4DB04BF14C4A375D45FBA8949788F8316
-:107FB000294CC67B9A823A5FE8FA613CAE17827E12
-:107FC00086FB15EAF8FC1B67F27B206C279383ED98
-:107FD0001616BC9E61BAB2EA27D3974D09669D9CDE
-:107FE000FAE06C49BF9A3EFC35A1FD0DB2B36FBFFC
-:107FF0006F7590DD95DAD35ECB13D3E03CA8D672D3
-:108000005888EEBDDFB222E5E7D3804E6DCC99FDF6
-:1080100036C0C3F5BE48F2CE10B597E01188E0F047
-:1080200039A7CFCEE3FA2E68E7F5946F0DF20ECFA5
-:108030000FF3B44700BE33B73E4F409B578B2F75AD
-:10804000AAFC38901258E00C038F46A4DF2CE4E71A
-:10805000DF50BCBB1CF55BC0E5C0EA2F74F73F4E98
-:10806000164D69C47587E621687AA976AFB4D3CD79
-:10807000E56CA73B93F8CE19666F21FD3F94DF189E
-:1080800019E57DAC14231DCDE4B7BB9BF2466ADD38
-:1080900016C902CF590EBD3F66F624BD3C28526278
-:1080A00043E485DEDF55EAD4C78986B7DD41FCEBC2
-:1080B0000CEA4DC4EFF87A8C6A5E9909EF978868EC
-:1080C000AFBBE9B957E5CFEFAA7A6604F257781F3C
-:1080D0008589E5808F7616A0723F44F96198D22E8B
-:1080E00053BE632C53A83C80B9A8ACE54126321F8F
-:1080F0003DB5FC962416A0F250D487442429999EBD
-:10810000C3D00E19867A9EE35CBC87F22673522890
-:108110005E50C4944FB05D41E65724F70AAE67EA5B
-:108120003DDC138B14287796B29E7BB9986792C773
-:1081300054E4FC7411DE3FEE9CAE958FF3F214DE36
-:10814000FECD3F7DF138DED305FEA5D67FC6EBCF51
-:10815000954F2E9A82659381CAEF637B280FC8538F
-:10816000DE9A06E7FFC9344678E4C955DE092E0FCA
-:10817000CF55F621DE68E5095395FDC1E59539CA6D
-:108180007BC1E5C773948EE0FE5D79CA215ECFF3B3
-:1081900097DE37294968EFC2EFB7C2048E87F87BB4
-:1081A000C3E4FA04DB294F09042F0BF0ED66E2DB90
-:1081B0004E86740A6463C53C22E033E6DBA19E8DE3
-:1081C0003353BE9F21CA96DC973F3294BE0226B637
-:1081D0001DFD744546D717440F217C4F70FFE9AF52
-:1081E00098C703F4908D7A7E408D8704EAB83F40AB
-:1081F000A313ED7DE87C17C27BA604F979537BC6F7
-:10820000ED6DFDA1787C40D5F70EAAFADEFBAA5FE2
-:10821000FADC7E03C698E3D61EFAEE9D7F1AD9F1EA
-:1082200020FE79FE7E8F2E3071F921A1BCE88C08EA
-:108230007F0FBBB7F5EDCF991A974FF95E43248AAC
-:1082400033308DEF737ED3897F021F1CD34FB35F12
-:108250001D5684431A4B98310AE66DCD67A4BF7A48
-:10826000727717D3F70DCA4082C1BA8EAE38861422
-:10827000C78467B83DD192C468BDF6142902F5A53C
-:1082800006956F5A58CCF4E1B8FE214692B7A1EB9F
-:108290006E88F60918571CE48FE0FE8D38E68B8057
-:1082A0007106E53BF2296FC52D4AF9582E6385A367
-:1082B000A05CD926CAF930CE9EB6125605E3564DBB
-:1082C000023E4719E93C9FA2BF8AC7632C8CF22D5E
-:1082D000D60DB051BCDABB66E4AEC5C837134596BF
-:1082E00006EDD31BC6E5A3DFD363EBDF9F624EEA47
-:1082F0007A3C36C79B780FC32D19F83D1249B162FD
-:108300001EFAA615C67CE4E749CF8E8F1683E07F60
-:10831000D47B2A02F3DB1F930C54FF585DB6F5465D
-:108320001BDE23F42B9467201D516C30EF0668137D
-:108330000FE3DD5F7DA46504EB1D1FA2F3CD3A3C86
-:108340008D729843FCA07ABFA529443F28C957F3F2
-:108350003426B00978CE573C71D6847AEE429B4CD5
-:108360007EF4EC2681F25302BB1CC9784E47EF1B0A
-:10837000497E736F93A8FAAD1DE4B70E24B164BCB7
-:108380005F53D122905E2C7ABFADC77E4347C98927
-:1083900038CED0F1DD89C1FEB2C7EEFA4504F25104
-:1083A0006F9941F573331A4796156B0AECFF53AF7B
-:1083B000C0F3274C9280F798ED0F8A11B8AE2E13B8
-:1083C000F75334033FC5FBB9CD538AFBA443D3F71E
-:1083D000B0CE20BBA5212E3512E7EDC15F85FCEBA9
-:1083E000C75A32293EB2B9299BF24142C7B9771523
-:1083F0006B47FBA46195959EE7D5273B931DD0FF66
-:10840000D3D6298D20A4D8A7BB9626E0FDA0C52DE4
-:10841000161611068F8FB54EA4F916E33D669CB76C
-:10842000A5C88C72645ADB1433C2EDDE55CAB3C1E1
-:10843000F31416BBD6205D46B53C4B7862637E379D
-:10844000C2F3DFAE519251BF3896C6C2E6493E90A4
-:10845000CFED8477AE71D27D924F93C2B75B97CF49
-:10846000F335A3A7CBFCFEB891BDBB04E05C01F4DF
-:10847000540FAF8E36654623DE9AD83262521F946F
-:1084800095B8D19E3B8D7A3BF0F3C6BBE6AEAF828A
-:10849000760D778FD88FECE30A33D79BD99F45A20F
-:1084A0000BD00B2B903EFF638E55F204F15FD41F6F
-:1084B000155D7E1A971BA626D16F067E6EDA79FCB3
-:1084C0006F68EF20DE2A41784CBF09AA5DA0E66BF9
-:1084D000244C206D9C7E0D33E6FAFC0CE32E8BAC15
-:1084E000789EA17AFA797872DE3A82C6473D37974C
-:1084F000291141EB0096E0277FB98BCF7BAE9D5AC7
-:108500006F0406F34390FE1E5AAFED63E47A3DBD5F
-:10851000BE93CFF542806F9FF1BACB7CFA7E9FE588
-:10852000333AB7D1A2B2FB38CAD97522E5558F5973
-:10853000C7E3FF678630F213F5369EC67FF1671CEE
-:10854000A8C211E0DA18574CE7D95B3FB3EF80922D
-:1085500032B6C73EBC2C41BF2EADDD67E7F6751BBA
-:108560008BE4FA603BDA67161FF0BDB1F83CA0A0BF
-:10857000FC1EB56985D4D7BE43F919FE6458EF6275
-:10858000F5C864C035E40F9FAE17543D84250C9F99
-:1085900040571749FE607F2588FF015FE1797B3EE8
-:1085A00081E0D3DC7A74F3BDE487B13B782B7E5E47
-:1085B00063992607791E90764F9061686A604F7CB8
-:1085C0004A83E3C9DFAE7EFA097875E2A9E55FE385
-:1085D000D332A0321AE1794FDC9C6B13A1DD58B382
-:1085E0002F01F9E9129FE53CBCB36AF89282F7F3D8
-:1085F000F4F59684A0F5C37FCD3B9E585F89726ADF
-:1086000087D581A9E1885F6E1D7C02A9F85D9CAECB
-:10861000BBFE95EEE7474AA716507E7B9D85EE751B
-:1086200085C27789CA07987A5F43A3A78896910C79
-:10863000FD8B4754BBE9C85AB053A1DC586796F18B
-:10864000BB065D8E222521CC78E63A33FF6E4EB014
-:108650009D98DAB34F6DFC2E37F74336C2F84218B7
-:108660007FDF85C6DB53A48C990EF8BFB7C879F9B4
-:10867000F42CCC6F5A44FBADDD5ED7F536B4B97738
-:10868000A02B03EB8FAC1D36414047A451A6FB7EC7
-:108690005EEF73244F5AF03B3E60CFB7B41B2350BC
-:1086A000FF707B0D14BF6D698F8B1C8E72CA6608BC
-:1086B0001B675D349DC3AB479E38A383F5A1E65C81
-:1086C000AE0F09CF94DD9F0AF0F21EE2798A9AFE7E
-:1086D00021A97833C622117F96BC3CCFAD471FE25B
-:1086E0007AF519D4AB515FCAAA9282E5534334FF9D
-:1086F0000E4655AEC38DF730736C8CE4C750BCACDE
-:10870000807E0B1BF34D4BC1EF643818E6E7F6078C
-:10871000FD4706CC8E6FE3FA4EA4CDE650108F15C0
-:108720004E5756F81FC2337294C2701E63887E6122
-:108730000ED11FC490F282E97A7D42668E6884B3BE
-:10874000FDBEBEF338347F2EE84D74CFCCCD00FE95
-:1087500088A756379D4F34181244CF8A22C70DEC94
-:10876000D1FBF13E1BF7AF48142F129446F2DB6F9A
-:10877000CCE4FE8D44C6E35E83146ECF8F9DE4A6E9
-:1087800032D80F148762AFB248E4CBCB8A5CB723F0
-:108790007EA4001B40FBAF7F3A1388DC2F512F676C
-:1087A000B5171757FACD6EEEFFF31A221D9BC3E0E3
-:1087B000FDAF0BB81F2E720FEC0DF5DBEBAD74BFE8
-:1087C000254F7CAA89F069BC81FCDA5E7640427E46
-:1087D000F2ABE95CDE1F2A72DE3F9DE2B2CE14846A
-:1087E0007F82112C2A5076CDAA1F37E9F6D448D4BF
-:1087F0008B3F4C7C91E0E106D8A5C17F9B6AE3FAF0
-:108800008F82F78FD6AE26B8CA03B89F4CBB771EAF
-:108810002BF1FBFDCDCE536EBCDFBBA22095AFAFDD
-:10882000C8382315CA43EB0202D2DD3D76651EEA45
-:10883000254DF273741E2919B201FD65838DEC4D2F
-:10884000CB38C69E8EE1F5DAF7A31EB20FDC149C7E
-:108850004F52ADEEFB2121BCBE725501DF67E70E22
-:1088600000643FB48F996A7FDB16933D7EAE0C7037
-:1088700043B8B8B9FDFCC274DB62F770B28B78BD47
-:10888000FB2ADE1EE3A5502FBDFD7E15DAE38FA681
-:10889000849FF74B75DE47DFEA7E04E358FF59CF2C
-:1088A000E358BD9FB39F1980B76CB0B3647605F0F1
-:1088B000B9A5E679E1BE2373CD2CCE473A6DED0420
-:1088C0002F06F23CFA2ABA471FAAAF5A918E4E4B96
-:1088D0009BEB27CA9C8F644DA0ABFD1CF742C6BD25
-:1088E000B0DEEA4840FDD3B3B4BB01F98767D7D205
-:1088F0000FF15E7A799999F4D67263CDBFA31D64A6
-:10890000DCCBF35FF01B13880783801FE17DD36905
-:10891000D5FCFC164ADC5F2B3CF3B13307FDB18973
-:1089200046C24B4D8F1D6351DCE897DDA0E6B7339F
-:1089300071483DDEF7320E16C9EF1B55077A2DEE52
-:108940002F97E7EB2AF03FE4439A9E6B4B37EAF20E
-:108950007ACD2179BDC6903CE0AFA7AB79722A1FD2
-:10896000B2678DEF539F7A15EC605CE74EE043F8F9
-:10897000F4833D8CCFDD60AFE3F335B0D7D10FFE8C
-:10898000C6AA51F47C739583DEBFBD6A123DAF4B1E
-:108990000E98109FC91FCDBF33E717C8AFA7E19945
-:1089A00098966DC3EF76F0FA21331BFFD57D35D451
-:1089B000C7A9EDDDAEC5F49D3AADCCD62ECE4E277F
-:1089C0003F38959B67342F46BFCFE652C53A03F038
-:1089D0006480C15981DF7960775A286E11BA9F0788
-:1089E0006768723CBC1DCFF013067A3FCEC0197D7C
-:1089F000F8711E12F83AAEDAFBFE16A48F7E4546D9
-:108A000027E27172AA3E7EB07206D7F35E579FC905
-:108A10006FBB86F6755F5FA38FDEEA3D3B0005FA0C
-:108A2000F55EEFB5B36BB1DE13139EAE06AA74D537
-:108A3000EBF8366E4FB219406F83B11C6A1F0628DF
-:108A4000BFE4746D8E9FC8ED27D35B7712D25B575E
-:108A50008CAF1EEDC4AE5D4BD7E3774244A4372400
-:108A60000BA4378C7F68F456CBCF6321D21BFC3923
-:108A7000ADEE3D670ED26302A72FE1999DCB291F72
-:108A8000E32E9E47A3D15B8C9A2F1F25B593BD483B
-:108A90001FE6C07E407B1B04BCC773FC634AFE100C
-:108AA0000B1CAE7074F723E9AD6CC64FA3B77FBB48
-:108AB0002640F9139D294A02EA335EF5FB813F9671
-:108AC0000ECFCC3073B970B92F11C7D9A08E336DCA
-:108AD000C861F2FF15581D22CAB37C99C3356F7C5B
-:108AE000267D6FC8A7F6DBED5456CC80E780B9270A
-:108AF000C9CF3BC0C0E9F7C1B7CD8B11EF931A0EB8
-:108B0000164D437CB943247D3B745F1F14AA713317
-:108B100081CF0B9A5762701CF11E952EE53B3A38B7
-:108B20009F8F61521AAC27C12D15E7635CE86A0379
-:108B30007D4FA45FD1C11894CFDA78707009986F17
-:108B400082AAAF75DCF9F408BF76D3401D3DB7E0CB
-:108B50003E7AA3E70BF10FFB0C41E31394EFEB52CA
-:108B6000EF49FE58BF6DAF7EC4CBC3FB25AB66712A
-:108B7000BEE131F1FC0F682DE177019A8A5C4FE28A
-:108B80007ECED3FF764A7E17EE637934F995138C47
-:108B90005CDFC36F24F2EFE5B809CE5AFC4DD31762
-:108BA0006585E7172517BBFE80E36E62F22E94679A
-:108BB00036079B47F13590678817CB8A9417675023
-:108BC000FCE5D2F4C02F8B9457895FF7824F03AE38
-:108BD0005776F7856F538AFE63CF0F48FF65DC5FDA
-:108BE000BAB0AC8672B306819D84EB9DAAE6677825
-:108BF00086F07ACDBFEA1DA0C54F9542CC9F8C561A
-:108C0000E135C6E26415D0BF0BE530DEDFDB1BF0DB
-:108C1000E3BD600BDE2393D08FCAA87F4CADE093F9
-:108C2000B1BFF8E5EB182F32E5D0E744189BC4ED4F
-:108C300001EDFE8D94FBE3FC8D87353E318E8D4733
-:108C4000F8241BE40726C3FBCC87F33AF078B21E66
-:108C5000591C8BE272E2A68612FCDED6D2AD9F6E64
-:108C6000427FE8E47FB7303C0FD01FFDC6B0F95C0F
-:108C7000FF303942743570563CD71353C2E3E9E3F1
-:108C8000B354FD13F1344E87A76C66783C25FDE79D
-:108C900027E069E44C3D9E1684E06914CD7BE978B9
-:108CA0001A3B13F0F4559083B8AF17E72A0366F622
-:108CB0008197DF952A897DD507C507C8EE1BC12698
-:108CC0005983BF7BA83D5B515EF6919FD07FCD114C
-:108CD000CA8FF3D49EA63CE52EDB917D6807FD4745
-:108CE000AD450EF66781FEAED3D75B40AEB8C19EF0
-:108CF000DC304B247EB2E70E8BFF3AD46BEBF87D71
-:108D000084F2BA4D02E67B0FAAAE115CC0DFE21519
-:108D1000301DA17F8C62E8F19FC07F57980E903E76
-:108D2000BB0EE4B19BD817BF97A6C9FF31969AB77F
-:108D3000D04EF5FCCDE8588DE7CCA45DC88FA603D6
-:108D40003D617CF39A6E906F41E3BDB56312F9D536
-:108D5000AEFB1EE45F901F670A8C185CCEB126EA5A
-:108D6000FAE54929BAFA690997E9EA35BAEF8C5167
-:108D7000E32A595B72117FC40A9EA7305DCED0B53D
-:108D80005F57964DDF03B86232BF7F3773D464DD1F
-:108D9000F8A17AC1D5F03FA47731440F08D513422A
-:108DA000F5828533F5F740D71803D9C49F18CFABA8
-:108DB0001B7AF6DF880ED6C91CCFBD65A7281FC356
-:108DC00003F63FFA9B0607E597225D8C3507C83FFF
-:108DD000B761BE95CE63C38E27E8BB119AFF0BE83F
-:108DE00086E8686CB64479AEE9F65F537FB694CBFB
-:108DF000D950BA14EA5E22FD6FE36CD81B7E6F6D0A
-:108E0000760A977B3B03E48760779A19CA4DAF6473
-:108E1000A0BCB1DF08FE086118D2AF42F28925304C
-:108E2000C94BF992EFF1EF2932E6589388A6BF4279
-:108E3000798D80F6DD6FA979B488B711F9CCB17A54
-:108E4000327EEF97D377FFF1FC7C6C0E5E96AEE638
-:108E500065CDDE8E49602D98173B18C783B671B576
-:108E60004CF2905FC34FF543F2D9010FCDCFFBC752
-:108E70005731671394C51A45F537BBD4F87A37C50F
-:108E8000BD53054724FA3786894E8A7B473389E2EA
-:108E9000E283580D3DA3043F671E97C847AE00000C
-:108EA000A0BC603799E9FB19D94FDA187DDF68A9B2
-:108EB0007933E5650564F223DE7388DFC3DB60FF89
-:108EC00005C5099AF6F1FB04F724B93FC478E6A07A
-:108ED0003A81BE132E56F33882F8A6E89806F5625A
-:108EE0005D2B7D072EBEDA407EAD2BCC35BBE81C5A
-:108EF000EEB6D0F7E3BAA03FFAB9D6D90D8CE81593
-:108F000098C7397F2AFCBAAE7152DCA2EB6FFD48DC
-:108F1000DEB1103FA7C7C5F56F4F9C99E397EDD41D
-:108F200027C8B71BE322E97EDCBC6B6BF6211FD997
-:108F3000F09EE858ADFA9FD1FF3F14FFC0FC03B389
-:108F40003305F54E7375783FA59939F767A1BFF4DE
-:108F5000AE25097DE951BDC6456C06BF39FAE2E38D
-:108F6000220DE53C0EA2AD53DB67A36DB95029E39A
-:108F70005F3F312E52D64B5C24502320BF1F8AF511
-:108F800063113EDC6F7DA971919AC24B8B8B68FB9C
-:108F90009EA5FE5D0088ADE677505C80CECDD0B357
-:108FA000BE20386EC1F595E35F327F8F7186D96A36
-:108FB00079DF5307BF44BFFEDEDFEE7E0A9FD79DF9
-:108FC0007DAC6C39E045D1243BF97BF7FF32E641BB
-:108FD0003E9C3E7E30CB61D1F9EFF187F849EB1032
-:108FE000F8BDFCE0FAA29075651BF5F1805C9BBEB4
-:108FF000FDD4387D7DFE107DD9CC6A084F43F7BB88
-:109000003AEA6ECA936BBC8D39788678D079881726
-:109010002E9B8798C3EE4BC337E64821BA5FF73ED5
-:10902000A77BE72B2BDE5A4976AC81EECF9F9ED7EC
-:1090300070CF3B32E28799B9699C7C05F1E8BBDFD0
-:10904000A7BF4B311DC9E5BE11DA57E6F0EF459DCC
-:10905000174F50FDF9436B77B5E706C57BEF1DE869
-:10906000721400DE0CB59D12500F195AFB1AD5CFA1
-:109070009D9FD5271EA5D5EE69CF0DFAAE5F9AD17B
-:1090800069403F465AED1BF4BE37BDC720BB79FE91
-:109090005E9959267B4BCD534B53F126AD8CFB5B30
-:1090A000A5542E6F3698B87C7343B57815FC5F5B7A
-:1090B00068BE1BE7EB6726F17B1D0CB810F22B6D29
-:1090C000BC5079A6C9019BC2F5C8B4B287B85CD1BF
-:1090D000F205DB42F3E25C73113E427523B5DB9887
-:1090E000A3B6DBC9F5533683492897619F61F344E2
-:1090F00017A87EDADEF2D398663FCE79F343CCCF61
-:10910000FBD1F6632FE35E971C087BDFF636D56E46
-:10911000ED8C082439B81F38ACFE3EA374EAAD05C7
-:109120007DE8AF98578B30EDD55EB8C4BCDA8D6A58
-:10913000BC488B976AF9B5CCE81B87DFF91C65FB47
-:10914000F30D1407ED25AFF61EBB2380F7DCBD152C
-:10915000118ECDECD2FDEB5BA7737E5A5DC0E81992
-:109160001A5F085DF78602DEFE5091F3E1823EE26F
-:109170000A5AFB0F13C3FBE3BE2DE4FB3F775F29C5
-:109180009FEB7D8A4961E1F240B57CF7D0F7600F33
-:109190003D89EBD0CAAEFA34F2DB794C1C6FDD327C
-:1091A000FF9EA0A63FDA507F243DAA85EAA3ABB973
-:1091B0003EA9E959921AD708A527A08F3FE23C8221
-:1091C0008DD3ADA6279EA38FB9401F409743188F1C
-:1091D0002B19D4BCD121569E827EA97AD4F9F6D31C
-:1091E000F7F64BB29FEAB74690FD54BDF92DD4ABCC
-:1091F000D6D5723F61A7BDE62DFCFE81FB3D91F403
-:10920000A6DEFA6B76D447857A3B0AE38A888FF12B
-:10921000369F205F8E7654C0E482F595A31D65C30A
-:10922000BC555700E1166A4F75DDFD05E5BB82BDF3
-:1092300079B820EB1FC01F42FC4B8DD3393EEF1A8B
-:109240007E8AFC26622DB7F7C45A1E0F3596F1B8F8
-:109250008551E17E1433C82374056A7E940D0EBDDA
-:109260001FA52B89FB51E2736BFCA8079A26592492
-:1092700085E423F7AB6879ED632CBEB7F03E862713
-:10928000C3C8300F1D1455B2032D6A7C03FF410B78
-:1092900094579ADF24346FDA16E22709F5A358674A
-:1092A000E9FD268F0AF2BD93619EE7D7E7BD83688B
-:1092B000FB878D8BA3D06FF292AF61A6EA37791846
-:1092C000D7B3E343EE37E9DAC1ED22172A305785E9
-:1092D000C3BFF3E254E407B966DFE12AF483687E92
-:1092E000A8F86A151E6ADC07E18BF014F3393C63B9
-:1092F00042E0E91DA2C58554780EE0F02D2F709252
-:10930000DF4942784A3DF0D4FC54DEBDEDF47D6D7A
-:10931000CB1D16D94DF0FC92EC5513C213E1FF138F
-:10932000FD50E342E039EEE1CC07F03BC1E31F29F9
-:10933000E9C0E7844DB7C5DE00CF495B1F28C127D0
-:109340007B93C709FE7316E75798D91D4C8F636747
-:10935000C8BA3883064F0D0F7BFC778CFCB1E51241
-:10936000F7E797AB789886700BF6E739F470DBA0D7
-:10937000E64B1A736BDC68EF0E0D819B86871E84AB
-:109380001BF2BB18B3EC26FF5D9D80F6506F78385A
-:10939000B4EDC7E1E1FC59AA3DAFC2EDB9F599F7CB
-:1093A00022BC5ED858F20E3E5FF4DD1685F0DABEC0
-:1093B000E58199BDC02D3198CFEF991E1E6E5B8B54
-:1093C0005DD5B3E0FD750E9F91F82CE01BDABD9BD7
-:1093D0009BC659F5F1198D3FE65BC3C98F0BFB970F
-:1093E00096535EA1A76C39F1C7AE73FCB1DB8E79E1
-:1093F0008817CB1F2D85FCBE7D79ED77AF5F077099
-:10940000CDA93D4CF46704FAA373AB3B6C50F33128
-:109410005804C88BF832E6C7F8F12066F545099480
-:109420009F407CD38B79CEF881D2503F85F4C65FC4
-:1094300005220E261812808F63EED4152407EF9FA5
-:109440001586CFAE2B3390FF67B3EA1F944B9D2D4B
-:10945000D84E8B6F2D2B525A67FD347FE1C3D85FF6
-:10946000F31776C6B073FE35FC3E784EED2601F359
-:109470005006D5DD4AF221BE4C61281FB266CAFCF7
-:109480007BB3B912EDF77C7F5B770EDA099D78A389
-:109490003D83F0E077384F67EDE38407572CE5FE16
-:1094A00091CEDAD3B1E1F1A036E2D2FC8C9B757299
-:1094B000D25BCBBF63D26957DE4CFB11783042C51B
-:1094C000034D4EA2BC417C3296051E463FF620C09D
-:1094D00087881494979C1F8BA0FF44C17EC45EFCB8
-:1094E0008F1A3D74C1DA2CFDF09E70683E400DADC0
-:1094F000FB7459B67F621FEBBBE83C00352EE95187
-:10950000E3920B6B79FE6AE71DDFE5E17A4F978105
-:109510007D0070D95CE660787ED340B10AD882E7DE
-:10952000392F6F358074ACC521B578FED662E7114E
-:109530003CD7EB00A712FA635EAF1AEF19A27E07C1
-:109540003A04FF01CF3FC77130DE837240F3A3338B
-:10955000D41BED88DFCA17583FD65C9328117EBB19
-:10956000BA71FC753BEEA4FC851EFF20CF87FBC9BA
-:10957000FEAD6833E5576AFE2DAF9DFBB72A5880D4
-:10958000FE9D3C8A2320DF6EB5D0F71AAA04D98C41
-:10959000EFF717BB8C85A4F738291FD635C72A915A
-:1095A0001F6CE9B644E417E58D22C9EBDEEC92F3BB
-:1095B000E9EC47F21995EE2E81CF0C2EBC383E9384
-:1095C00054A8E733C9853F217EB67E969EBFA0DEB4
-:1095D000590FF3E4A8F4746EDF6A1C1FE3571119E6
-:1095E00041FAA8BADF503A3A4F2FFDBF8FAE66223C
-:1095F0009CC3D0D5ACC21F4757A58503FAA4ABB90D
-:10960000857ABAFA1996FF17D2D5CF691F17A02B02
-:109610006321D3E749C7F2EF3C8F8935F03CCBFF9C
-:10962000C379D25FCDE4FE8BD03C69C66AA85C00EA
-:109630006743E7A3960BC73319E34C964DAFAD1DB7
-:109640002DF3F182FD9D2CC4CFC942FC9AA1FA5D95
-:10965000183FA8CEEFB9F789BFEC1D0D7F3EF9F496
-:109660007F915EBB6FAA40F7C90B477EB71375D0D9
-:10967000A23595EA3C7DFB3DFFD97E4EFC05FB55AE
-:1096800043F7D51875B77A6FE0C7F93999E356FAF9
-:10969000BEF9BA1AE640B85FC8EFB9AE8EE74D6BB7
-:1096A00079CDCE57AA1E2C1DCFF3E9D0EF19EAEFE2
-:1096B000D4F2953DB64AD2F38F2856EE8F0DF1774E
-:1096C00056C6CAB7D03DC6F3FD9DEF16FE03FC9DFE
-:1096D000930A64FE5DC610BF677CBEF261611F7EA7
-:1096E000B3CE1807437E9763F30918AF656733C994
-:1096F000AF33C816A0EF6B95D74E213DF06491EBC8
-:10970000535CA731B7FBAB97C653BE8103870AE50D
-:10971000CBA0671E2FFC27FA09FE597E3E5F01F79A
-:10972000735DECFD791FC23BAB8F7BF472E0912837
-:1097300078FF68BD9DBEAFB552D5A33B4DDD492D29
-:1097400050BFFFAE13BBD13FE16B3330BCDF76B10E
-:10975000FEA3860BE8C5E610FB68C339BDD8F7D673
-:10976000C420BDB86155FE8E6361C6D1F4E29B662C
-:10977000EBF5E2721BD78BCB6DDD26B40FCAE3BECF
-:109780007F1DF34E8DD5AC1DE5E220A586F4E17872
-:1097900089513EF1FF8FCBB37F685CBE78B63E2E19
-:1097A0003F56CD47411E8FDFFFE9D2FCA893B8DEBC
-:1097B000B0C6C8ED15AF02EFC2C4D143E3F243CF48
-:1097C0003E4371F975DBAD748F6FC38E663EDE1458
-:1097D00026619E792253F5B502EE2F0DD53F1E3539
-:1097E00029D694F188EF06BA4F88F704C92FB2DD65
-:1097F000BA09FD4DE9769ECF6DDEFFF256B73148CE
-:109800003F043D94F4E2B2007D97A95C7230E23BE4
-:109810007193FC141FAF1308BF46CCE6F4B330D7E6
-:1098200047FAE1A03249E0F7C4DCDC8E4FE671E78D
-:1098300048C42F682A8EE2715FE980E8C0B8F37DE2
-:10984000D87432DE5F65FC7B15930DF4EF50AC13DA
-:10985000BA13902FB70A4A223E4167A27B8F4FC7A7
-:109860002803F1DF93F22419E8DF93DA93D7988085
-:10987000EB6BAA6F4D40BD70CD6C1E4769CD3B4E62
-:10988000F90FA674D00753E819F6DF1D9DEB14D429
-:10989000BCC0F604FA1E026BF990F06A9499F17F4D
-:1098A000E7C7E15F84F474CC46FAC2AF041FBF2758
-:1098B00064B7D27DBC96CBCC8955B09E66BB99B4BB
-:1098C00009EF65530FA4C0FBE6015234C601BC2961
-:1098D000A912FA8FBC318D6FA21FA439259561BEE4
-:1098E0007F53D9048A9F379D0506033D3DA347EC6E
-:1098F000CF82F76B84007D37C83DD9C0309FB0ED73
-:10990000B2A989C1F7324529544E3A482E88B2810E
-:10991000EEF9896A3C5B3C2F9EAD8F4F7F3F9BEFFA
-:109920005B662DF3E81E689C59C2FD965F56FC21CC
-:10993000DD738B33535E50B989F1EF7E5CC6E85C12
-:1099400042E1E759A58F2B186DFAF5ADC1C034E59A
-:10995000619F5D82F8D18030A53CEEAF96205F6AB2
-:1099600038577F92D747F0F2CED94797A01C941969
-:10997000FFF7491A46F1BCCBF201C5C487CB4D8134
-:10998000B0DFF9BDD07A64E653D4F1D8FFE4786B48
-:109990002E33CFF3A55F78BC9E7301F5F912C6D5BF
-:1099A000DA858E1BDAEF7FAA7D6FFBFC68F6B9FBC8
-:1099B000719407412AA27A9F0DF564A3CA0F3DD97D
-:1099C000137C7E19F9819BD3458C419767FBDFA6F9
-:1099D000F2D6B800800000001F8B080000000000D5
-:1099E000000BCD3B0D545CD599DF9BF7E6CD10669F
-:1099F000E00D0CC910093E082831045F1288A04907
-:109A000079046240A94EF809B825E944A346DBB3BE
-:109A10009DBAD6923DD932094320989009A9256E66
-:109A20006D8BA9D9B5B547A9DBEDAA47BB9398F5CE
-:109A3000F81FDA5AAB7B3C16539BDDF6B83DF42792
-:109A4000969ED336FB7DDF7D0F6626432069F69C0C
-:109A50009D1C72E7BE77EF77EFFDFE7FEE9C3B87A4
-:109A60009F5A8073562B6B2A9865C09F73607DD672
-:109A7000E0736AF93FD0FD0B0114FAE6C047DD4DF3
-:109A8000F1A24AF1BC25404370BE1B4003889F935E
-:109A9000F0A9050F5FBD74AE182014C4877902AC1D
-:109AA000B67006EE4FBB56C7EFF4039C4538B9C6F7
-:109AB0000C1CDE47113040B0C763FF5A35FCEE9DE9
-:109AC000B4EE35601CD367C62BD6BA571F51216E32
-:109AD000CFC7BFCF5AEBFEB4AB353BE499396F6AC1
-:109AE000BB6C3479DE8774065C27E283D163F83D72
-:109AF000FA6E4CE24D3C837FB8DFE84A6D74109FEC
-:109B00003F688FF3E2B822315FC7FD66C0CC47598A
-:109B1000C878B05E428903E7EFBBBAE2519AFFF022
-:109B2000E3C3DFFA363E3EF29D3DBFA4764149C510
-:109B30005035C2CB341C86403B044A900E4EFA8608
-:109B400078F47CEAC814A21FFBC978DA5B7E678CC4
-:109B5000C99748471C7FC77EC9D4703D97C77354C7
-:109B6000A6FDB92593F62B1F5EC4FB0F6C4FA6FB19
-:109B70008864BE1DC0F19103121CC37E8691B00E95
-:109B8000FEA905C9E39B09BF55D44B18871B3F2885
-:109B900041E7581A7C3F1874303D886E9184FD1F50
-:109BA00072EAB7105E0FED932182200FED74012C45
-:109BB00006F846F0DFEFDE5D02F0853E27E37D64C8
-:109BC0009D3A2AE1FB11AFB6B993FA4B1CC6511D61
-:109BD0000463E2B90EAEB88ACF65AF3778ABCEEB8F
-:109BE000C5D6A9F9E0A1719381A097F9E88D2AE281
-:109BF000A3B765E6A3D4FDA7F2DD5C7C5618CCB113
-:109C0000F0300AC115C89EB279E20CEE0FAE763084
-:109C1000FF2CBFDAC1FB3B5B8003A4D9F9B0AF07CF
-:109C200017B87A866F548BEE7BFD2DA708FC6CF37A
-:109C3000D4D171B3A882D685F05839F27320797FD8
-:109C4000F6B8926979F83B5850C9723726E3595DE6
-:109C5000A371132AA81D37256CCB1EBD5FBB90BC1A
-:109C6000B820017E11C1053E7FAAFC3A21C448DC20
-:109C70009359781B9DBF6FA30AB29406DF73F40F4C
-:109C8000EDBCDB24FA473E0F4629EA096720992FED
-:109C9000832F9430FFC80332B8A444FE6A34895E2F
-:109CA0005FBAD539AD7FDCB61E23BA1B45E0C07D57
-:109CB0001D7E4B66BE391CDCFB0B99E4BB51D525E0
-:109CC000DC7F46ECEE87DAF1FDA1D765631087777C
-:109CD0003FB3EB67AF627BBABA788D544C44322302
-:109CE000DB71FCE9F56E63D010F2378D97626E4C34
-:109CF000F79A99F50E5517F37A515C4FBA001F2861
-:109D00008DEA0744875478D3FABAFBF858C3EA04BB
-:109D1000B95A187A2188E71BF2E0263CF4FE24BFEA
-:109D2000874AE4CBFCD9D7418C325E7E465F71DC3A
-:109D30005F5ACD9304A7A9B42A9249E7826C207C8C
-:109D40007CE8356EF4E190F79D86DB289F99DF1B58
-:109D50007342BC9CF080EB62DB0C135B5A88EF4BC8
-:109D60009CAC3F64FF4A7EBEDD1B541CB8AFFF0CA9
-:109D700016F37AF6FC26F8B2721FBEBFD639DA4067
-:109D8000FC11DD0E5A04A76CF3C614EA6FA00DE2B5
-:109D9000C21BF53A7711C26D7C9E1602A8F50DFB29
-:109DA000C90E553C77A42044EB47CC1F95219E7DDE
-:109DB0000255B0DC351EACC7F9BD6FC8C61E7EA209
-:109DC0001D0FE17C252003D1497A6A6D6002F7A35B
-:109DD00078CEBC075900EB26011A12F8A976CA0DF5
-:109DE0000D097AAE0E2127F6EBDDF949E337684518
-:109DF00049EF65308D38D277636059D2386F55A5F9
-:109E000046FB6DD257263DBFB9AC26693E3428A724
-:109E100027B0BF16FF11DD65107D5BAE3CE5D84F66
-:109E200098AF40421FDFFF25E8F59FC9C4CE75708B
-:109E30001DC94F33189D241F68BC8D63889785CF3B
-:109E4000B92732C9909826DB75C9E2CFAA4D454C97
-:109E50001FC973C641F87F0461C8C81715DA848327
-:109E6000E804DA98C4CF516F0C22B2038AC9E3D058
-:109E7000C069511C77056A6F0DFBDE00C4A8BF04E2
-:109E8000623C1E3FB1C335C8166E313FAB058C83B3
-:109E9000F83EB33C2249D8CF69044346781E635C40
-:109EA000A27D6A385F5E492C19E77E41238CF73228
-:109EB0007C730FCDCFEF06AD2F9FF997DF8F7641E3
-:109EC00084F6F32818E092091FA890969216097359
-:109ED0007B25E839A487BE09C62AEA97C204EB2588
-:109EE00034EF12F517C19826947D9CF5374C28BEA7
-:109EF000336EA1FFD3C9CD8CFC2870C6A60B0EBE55
-:109F0000FF56B37C13EAC1CDB7555DD0DF50BA5FC1
-:109F10004C92DFBB37E98C77A57B23CB8BD2FD122C
-:109F2000BF1FD814BC6E133E2755E05E75F1F8AF25
-:109F300050053EA31218E8CB40F4D99B02DBC85F62
-:109F400079D66D94B2C8233E892FAADD93AFD48809
-:109F5000F9440F3FD283F09D530E12E16009D10105
-:109F60009FAB48877D4CC718C32D0C83B1DB5A9734
-:109F7000FAF94807A2CB28680B08AF72F8E2E8C0EC
-:109F80001F84B3E81937FB470AD165E965A1CBA760
-:109F9000098F174B97547AC0AE5C809AB9F5E95790
-:109FA000A57886B494C882F4C1F348481FC26700FC
-:109FB000043DD0AE1B84A774F8A77E4625E87BB885
-:109FC0002FC6133D233533FC9F8DFC2FFA42BE7CF8
-:109FD0004807D11774F293BC603F101CE3F939DBDA
-:109FE0002178209FE86132F26CBBEC8249F66B8BE2
-:109FF0002583E9B55446070DFB9952DC727E46D99C
-:10A00000AE6781C6F4590C616EFDCEC9E3E7485FC7
-:10A010007B1CA391226A9FAEA3757A9B51C390CA01
-:10A02000F70ED7315FDE035A29F25DA16AB2FE2E28
-:10A03000BC4631227A22BEF608BF49378F90BD292F
-:10A04000747861B07266DDA8D308C4905EA7BC675F
-:10A050004E84F0F9827CB4EFC60C9E4F3BC5F908E4
-:10A06000A67C05C983908F4035EEC577BE7E0B2850
-:10A07000826F3D3B107F888FADF402F1240DFC1BF5
-:10A080003F7FA45EE8BBCF6E0A3D4EFC42FA89F1E9
-:10A09000678246FA493380F5A6438FB09F7076C039
-:10A0A000A5139F426CC424BF629BB5CEB601D707EF
-:10A0B0005256C239A3AE243BEED083D9CCCF86040E
-:10A0C000E41FCC77DEA5F23F74E7CDCB0FA87B6A07
-:10A0D0006DF644F9ECE354928FDCC479824EAA3FCA
-:10A0E000C47E874A72923B371C678AFF62C371063F
-:10A0F000820CC769FB2F64B7909E77A1DD1A447C60
-:10A100007FDA448788F972F23FC89EDF1ECE62BFB5
-:10A110008B5184E3EE8849A383C88F774258253E4C
-:10A1200095A02442F4DB1A91D87F2BDEB73D8BFD3E
-:10A130000568D0083F52FC06F9DCF28BC0A385A766
-:10A14000ADF15F3A752FE1D50B3F4F88B7ECF7BF04
-:10A15000EB5A7AAA4A27A5ED2923FA665AF445B59F
-:10A160001D790DF7E9FC53360C6AE4177FE98D5A27
-:10A17000DC5FDF8F6583E2B34C10F1D50210763CD3
-:10A1800093E47429F1CB58FC33C46FDDD91A9DD701
-:10A190001E07D6B80884D83FCE443D40701D99FBB9
-:10A1A000993F33B354DDF6B721F11C6E89FD608F02
-:10A1B000A572F3D4789CE42B0FFDD8DDC9F02511EE
-:10A1C000CF03C7437C0EE9FCF55758FE3ABEAA3BC5
-:10A1D000370FFF3ED57F87C47890C663DC194FC028
-:10A1E000EBB4BC587266EFDBE35193E525659E4DF9
-:10A1F0008F72A7E08FC5187FEDC6FD0E0C1CAD2336
-:10A200007D3392073A469AD0BFF59F248AB3D693FE
-:10A210002E26FBD300A3144778401F2CC3BEB3C027
-:10A22000C3FCB3E8BF83F1CF209CBBAB5D9A8E38F3
-:10A2300059FC91A9D5E1FBBB0ADC8689F48D5AE370
-:10A24000230DE86789E5DF26BFF44E6BBF4C0B9406
-:10A2500043B3A588F95DF1B5ED7D8DE2DEC532C869
-:10A26000A4D7E42E83ECD39D1830E4A2EB0E5F76E6
-:10A27000B2DF87FE1D9FC7D590ECF7DDF58833A9C7
-:10A28000EF4CF1136B5B92FDC0A616E075693FB908
-:10A29000ABFE7AF8E0F1B3FE5CA18C3BB43476D52A
-:10A2A000C6BFF49487F1FF421EE295F32441F37395
-:10A2B000D877211E895F11235955882793BEEAE478
-:10A2C000277FEF3E1AEF3A8BFC4BE3654FC3E788DD
-:10A2D0000E57587802B12F13FFD1BE53FD61578A34
-:10A2E0003F9CBA6F9B0E77D8F859036B083FE89FE5
-:10A2F000B37F609F2BF53CCF637CDE80BCF4831E74
-:10A3000037B7F11E8DDB133D016E4FF6E8D0808E1E
-:10A31000D54B3D65DCBEDC63F0F3577BAAB9B5F1E4
-:10A32000319BBEF1E639D85F38B4CBC17902A55C68
-:10A330007BE56AE2DBB764561F1AE819CA52B643D6
-:10A34000A0E0B82B1B955193CE62C53F8B2C3E5B92
-:10A35000EE9A3CEEC279B17C30F6D044B4DBDB2B14
-:10A3600067E29F75938E1939018A771624E50BEA07
-:10A370002037A95FEFBE2269FC066D69D27B9BBEC8
-:10A38000DFA81372B331B03C69FCA186F5F1BBC9FB
-:10A39000AFAF7169946F68D25727BDBFB9EC8624FF
-:10A3A0007820371BA4A773BA12E8C6E74FA6ABBA4A
-:10A3B000E3C271904DE7D11439988DBEA97C6BE34F
-:10A3C00035671AAF22AE8C525CA9D3B9CBA56D0804
-:10A3D0006A68DA2F3181F24BF6BA4A35C69715977B
-:10A3E0003FBECCA2F8B2285D7CF921E76DE68C2F48
-:10A3F0001B93E3CBAC14BCCD155FBE7A89F8DC5A55
-:10A4000028F26E39AFCBEC07CA8D61B67FB9E3B2E3
-:10A41000B191424FCB1FF392CCE3B8AD552AFB97D5
-:10A420008760220022AF984FF630B7DCC8277DF353
-:10A43000A4CF5C781BC5F94D0EE3284E79B1EE2B05
-:10A4400001F23BF6ED7E34804609FEA7C5C1FA2E27
-:10A450005677660BC995A2A31F27716B8EA6F14F85
-:10A46000ECF176BEF1E016916F3C68E51B0F5AEBFC
-:10A470002042D8DE8E54897CE3AF5B742BFF17E15A
-:10A48000FCE2E12D6BAC7C23F657D07083EDF8A095
-:10A49000D730EF20FEF9850722F8E880A4654964EB
-:10A4A0002FB63834CA1F8F34AE7A97F249FB3CAAD4
-:10A4B00041021FF5ADC927FE92B7A2DB83FDE1C6BD
-:10A4C000E19769BE52EAE07E74CB559C171CC9D354
-:10A4D0009A8A29CEDB504C9806F9993FF5505E23B5
-:10A4E000EA3B13A0F9BDD78BF9B3D12735FF2F93E2
-:10A4F00026A6F8ADC41157118EFCFC993F13BCF38E
-:10A50000F2F3297EC5A04FE5BC6DFE8FF77E2B527E
-:10A5100042AADCE47CF308CA3CE169EB96966C8ABB
-:10A52000A7B63A27F2D2D90B3BFF39ED6FFA93FD6C
-:10A530008454F8FCB1F36B0ED1D5EDBC2D7EA2B7DF
-:10A54000DC381A27BC41ACB198E25E8FB0CBB3E1E6
-:10A5500041F15CB80E22776798190978B0EB1DD7E6
-:10A56000B68A3CB8D1AADB79C6A47A89D2E8E07968
-:10A57000B67EB0F3E3A975127B1F35AD224F7BFD8C
-:10A580000CBCA4BA89BC56B5E0191C17A7E6B3E702
-:10A59000AAA3CC95CF6EB6CE73B175937B5B81E7E2
-:10A5A000FD7FCD7FDFDBFA7F93FF3EBF5E34CAF2D3
-:10A5B00003CF4CFE9CE43BBA6CA13E28EA4349F52C
-:10A5C0009CD43ACE60868033BC52F8A9C3563FB2C1
-:10A5D00042C04DADEF6458799548EB521187812107
-:10A5E00088AC9885C4171EE5BB110DF96181E71091
-:10A5F000F8B075F9B745A8AD2DD487AA715FC3CB64
-:10A600001C6CC786BDA147FB480F2DF3A4958F8313
-:10A61000AD422F0E10DF72FC04A683E44EB2850417
-:10A62000420EA4D708733EC0D1569FC86769B1EAED
-:10A63000DB118F5F25BEC8E3F3F0FC54F85F3B1FCE
-:10A64000FE63C4AF510B38C1D98670BED93A5D479D
-:10A650008CD07BB7B59E5B8F5593BFF058AB26F47B
-:10A66000B0B2D2A0F30FFBD2AFF798B59EE9084B7A
-:10A67000346E5197980F6E31EFA034D9795AD09338
-:10A68000E589D6A7F79946B27E48859B5176E17A4F
-:10A69000D9D3D3FB4F8E870E48E9F7F9634B0E6B86
-:10A6A0000B81ED11F1C59E347C912AEF2AE53F1113
-:10A6B000EE098B0EB6DEF128E3EB332BC9BE83D156
-:10A6C000CB883DCEE7DD93790BC7C97D378B3C87BF
-:10A6D000AA08BD5DD089606AA8BED210E1BAE1FDCA
-:10A6E000A0B97CE7E3E162E33DB2379184F93FB181
-:10A6F000F823B52E18A3BA20F9B15417A4FE4E576B
-:10A70000673ABBFD6E8BD3B2BFE9EB3B47A8BE8374
-:10A71000F38F545BF59DA0A8EFD43DF508ECC4F78A
-:10A72000BF331DECB74ED7771A8AD7480E9623A0B1
-:10A73000FAF47CEB3BB18679D67782175DDFF9635B
-:10A740002BE2E79047D459A6EB3B6DFE79E5757493
-:10A7500088C5BB49AF7401E3C1DB340C3B299F10B2
-:10A760001071C6892A97E0AF9D92159F4103D87A50
-:10A770000A3FCD5DFAC3B9645FDE714129BE5FFF58
-:10A78000C4EB0AF587F31D6B287EBE569D78F05A00
-:10A790007ABFC6C9FAA30E29194FE28FB8CBC145BB
-:10A7A000F0886AB5B268E312B5F5EECC247DBD4100
-:10A7B0004B8E3F86A64EC8D9C49F1A1812E279A8BC
-:10A7C000CE30B349F71813BDF47C68836E0CEAE40D
-:10A7D0000F27C729434DAAD0A745C2EE0C1FD71F8C
-:10A7E00026FFAABF3B83FDCF03050E71EE1218258D
-:10A7F0007E68D293E39AE1B1E27D2524673127E7B1
-:10A80000CBBF3326C66FDFBD7294E252CDF257B78D
-:10A81000E7AF673F14FAC4B89BCB96A79C7F5C2335
-:10A82000BE88ED7402E1BFBFE0F601CA877E1075F5
-:10A83000AE2671196AD3997F6DBA6DEBBB93EB4469
-:10A840007D2A70DD74688BCAFC3F94F7C1913B4848
-:10A850004FE72D603C8F6C51F34309F270A2CDC5D8
-:10A86000F41ED922FC8B3C0784C6D2BC3FD126F40F
-:10A87000D027EF013E4F16DA651D1FE94A38EE2258
-:10A880007C1400FC231D27F0E1437CFE460794E284
-:10A890001687FD5DECBFA5F2D9785B69525CEBAA27
-:10A8A0007624E1D1E90A8639CF7D33E8A4AF1A1ABC
-:10A8B000B14FF17D970AC46FAEC0FD7CCE1CEC6732
-:10A8C00060DFDD188B28D87797845693DFFAE2CEC5
-:10A8D0008E01CAB3B8FC0E8DF8CDD57557B095C6AC
-:10A8E000573A2103DFF7812E05689F1109485FEB76
-:10A8F000106A247F7D38E0D0286FD31C6DDF41EBD8
-:10A9000037FB1700D1796B9383D73B6BAA9CB4CAF2
-:10A91000234783F25F0B3D6C77DF77861FEEC0F134
-:10A92000EF23BD223073AE5D6DC54CA70C3D397E63
-:10A9300076438CEDF05A73BC8BD6595BAD52450310
-:10A940004ED49C3942FEFA4895CB70E1BE466A244B
-:10A95000C6F7C755CE51BAE7F003755CA6757FF010
-:10A9600031F246513AF9BDB0DCA48E1FAA6E7113C4
-:10A970003FEC458A107E22530EB65FA9E3FE6CD1F0
-:10A980007F2FE285F01CC1FD96525C34897285D020
-:10A990007D53C1C7EFC076559BC2E3BE90EF885090
-:10A9A0005DA8BF496539E9F78606E8FE4F3FF23BEF
-:10A9B000C743FE10F3F370BE9FE5D05E67B86673C1
-:10A9C00019F1CB1B5519ECB757B535DE4B7EFB7A29
-:10A9D000F9A37F798AE2A70295E9D9EF0CC65F2532
-:10A9E000BE6E12FEE2C9250FB0DCF575DD0E8437B0
-:10A9F0008884DFA1BA555F650DC3B7F30DC34B441F
-:10AA00003EA9CF7F5F84F21BF16A915F30F38E72B3
-:10AA10003ECFCE2BD5597A6CB92BFC4A29CDBB47FA
-:10AA2000117561B9204AFAC04579259AA724E7BB78
-:10AA3000D64D26C7C18B53E2E0D43C13B8C74B5A5E
-:10AA4000D19E3ED986F1F17298CE2BD111588E2B22
-:10AA50005D1C2F8E548B3828E60CE76BE5E7CBF1B5
-:10AA60009B961F3CDEE3460E00F8518FC6FD2CF38B
-:10AA700037BB7311D45B3D017E7EEBDA47A5C47909
-:10AA80004395ED6E9DF5C64480E0A6EA8B543E5892
-:10AA9000DBB6C0B20F26107D872681F1EBAD5915CC
-:10AAA000273E3DFB7BE038F4130DE31E283E7F7EFE
-:10AAB0009CF6E9A2FC97D8E749DAA78BF25F627FA0
-:10AAC0002FF7E8DCBEDA53C6ED827610797E5B1F85
-:10AAD0005C89FA00F1D65020FA24FF648773FCB732
-:10AAE0000789BF5C014523F97617C4E252823E18FC
-:10AAF000F186DF25BBDC9FE761FE4BDDD7AFDA1CBB
-:10AB0000D6B9C2B711DC21844B787F71E77F3DB4A1
-:10AB100094D6794B66BECAE9DABC83F50EEA850C99
-:10AB2000F637843E8CE57938EF30B2B354A2FB504F
-:10AB30005B770B47774EB9C7754671DE09D4D7D41A
-:10AB4000EF4739A7F3F4D77CF0195AE7E33F2EE03B
-:10AB5000FB4D235BDE66B97F030390DCCB28F7B6A1
-:10AB60009CC5DE5AFC6D117F073B9E11E7673D389F
-:10AB7000E21D8FD1F9FB7F22433ABC5D2A5DC19C67
-:10AB80009F1F32AA4C1E3FE74F53373445DDB07745
-:10AB9000EC7BDC8F34039462FFEB4ED34D7CF0F5FD
-:10ABA000DD8E0BD60DBFBEFBC275C3D12F3BC0A53A
-:10ABB000CDECE30A98E03C2B85F05407ECA357D882
-:10ABC00066B787AE6E673F52D415F51ACA39505F23
-:10ABD0005B40FEF3C026B38CDFFB73D8EE0794B165
-:10ABE00038D9F500D5CB75BABF10E1BA27E567E9CA
-:10ABF000FE42EAF97B9D13EBF97C3884EA95A9F5CE
-:10AC000049C9F37D51DF5F2AEA90767DB2429D38D3
-:10AC1000FA20E1E93637E3A1F7D9EBDFA1FA975D36
-:10AC2000C70F5875606D0768BBC539CC76F2FB9FBE
-:10AC300017F550B81ECFB192169928DEB482EB9B5F
-:10AC40001BE81C73ED7FBE75C3664BBF2173F33DDC
-:10AC5000C89F59F8B4C7FD4DBB90C76B5591B786D7
-:10AC60002C95F5FCFA273C2093BFEC558F929C6CF9
-:10AC700083890D244FBD3EE1B7450F39D96FFB5491
-:10AC8000BBCE74CD534DBEBF90F7F719C66E0413FB
-:10AC90003DAE65511EE92FADE6A7DA791FB1B616B4
-:10ACA000DAC780CCFAEEFDD20D7C8FA949CA66794D
-:10ACB0005434B330515FEE6A4F7F1FA9B670B2852E
-:10ACC000D7F73A80E2AD6886F1B24EF87E4161B8BE
-:10ACD0004D20EE2BC1764D1AC073F67A4E337D6A45
-:10ACE0004B5D2B493FED6A17715BD49B3EAE7BA059
-:10ACF0005DC49F852DA12F101D6E82C97AD26F2849
-:10AD0000DA4684EFB588786D17E94B11EFEE72AC37
-:10AD100099C96BBDE40CEDA2F39ADF11FE842B20E0
-:10AD2000FC7A8CD4381F74ACC5FC0782DB4C7C5E8B
-:10AD3000C98A0A8EAD3C7F1F519B2EED662FC13B09
-:10AD40006CE9E70ACDE4BA6B05388C5E7F425D5D45
-:10AD50009F5F5D5DD2BE2FEAE937083E86E723821A
-:10AD60000FD78346F284FC7798D6B3EF97543CB75D
-:10AD7000A388EB2E9758DF3ED5627E95E0BDB829BB
-:10AD8000F8353AF7FB3B3B80E1CDF3BE466D6138C9
-:10AD900010443AF56708BFF9C93AA3339890FF7990
-:10ADA000D3A2D79B165D97233B8D8B7B6F6CC7AF70
-:10ADB000826A37D12B157E5F0F8C511D68B6F5D591
-:10ADC0007DF7B9294FDC5BB0DE4DF7D1A29EF5D9F6
-:10ADD000D4EF2F3003B47E5F4FE3B31F96121F09E9
-:10ADE000BE8F2C11F98818EAE748429EF4C576997F
-:10ADF000F7555F0071CAA7BB3CC22F7261BCA8AFF8
-:10AE000020BFB99AED393E1FA3D4C16B963CC9A6A9
-:10AE10000126DD172C0089F0853A727A3E99BCFA3A
-:10AE20008230D0BE66832337E07C8A470B34F643FA
-:10AE30007EDDAE313E7DA663268E87F9E3EBD01C26
-:10AE4000F8CA99035FD37C6DC95D2A9ECE109E8897
-:10AE50004F7C0FF0B9E04FF52C672E547854CFFF9C
-:10AE6000C8C68BC7849097C37F89F013A50B36E5BE
-:10AE700033F8455F91F12B6B619EE72A3020B48255
-:10AE8000F0A149848FD4F3573CF77803E1ED956D39
-:10AE900042AFD62A96FE08E359903F6FB2D605CB53
-:10AEA0002E356508BBD30C3FF488BCB6E0D30A74DA
-:10AEB000C7DD39E7EB57BB7D72967BD74F6ECE105F
-:10AEC000FE903EC6FABDB751C0F77A851F7A74600E
-:10AED00015FB0F37E6972E48D48F97BB4E985A171D
-:10AEE0009CAB0E38C337A69BF6F93BEDBE085D95CB
-:10AEF0009B8D3F1E24FE7192DCB8B93DEF7D613021
-:10AF000060905C2D31238074DBEB0B07887FFA8E19
-:10AF1000EF7C87EA24CAEBB241FEA6A20481C6DD1B
-:10AF2000981766F9D8586002D5951EEC31BF9B087A
-:10AF3000F7969650F966A45BA63666121C0FC423DA
-:10AF4000648F6ECA35C3C13474A8DE2CF4C7B196C1
-:10AF5000E02A9A574BBA7315C0C39BCCD5D49FAF88
-:10AF6000BE3A5F9E1ADDA4F72F5D9E5ADC74BEFECA
-:10AF70008220DFD3EAFFA14C1ED6F4B87E4B9EFAA6
-:10AF8000973C00A104B90A6E4ED13B7E4BEFF84DC1
-:10AF9000968BCD9B752B0F1C64F970923C9527E81E
-:10AFA00019BFAD674C9647C56FCB93257F244F1EC5
-:10AFB000BA1F3C594F7E4A1F887B8CA9F2156E0937
-:10AFC0006DD94C762CEFB7AD45FACCFD4F5D17F23D
-:10AFD000D45F60F1FB92A799FFCF22FFD365E15EBA
-:10AFE0004F7112BFDBEDDA2919E2488A755312B7A7
-:10AFF0009F98CAE4B6762A835B732A97DBBA291F27
-:10B00000B7EBA7AEE0B67E2A9FDB8629E4FBD5C866
-:10B01000FF5345DCDE38B59CDB8D53CBB86D9C5AB5
-:10B02000CDE39AA656727BD3D40DDCDE3C5523D6F5
-:10B03000A19A504E5AFEA772D665E07F2342F5D101
-:10B04000BEE3F7BC43F8716A2AE751A2BE355CEF54
-:10B05000712A61E6FFA30542BF6FF408FAA4F2FF6C
-:10B06000B196D0FE74FC0F4E716F4BA17B5B95ECDB
-:10B07000E70C337F9FE7EFBEF447CA83A2FF7198C6
-:10B08000DF5FA2FD9FF62B1726FB95FD79C97E6534
-:10B09000DF12DBAF748D521D6CBBA4F33DB1532D99
-:10B0A000A17FE6F521B88DDE87DADC1AF95351DF8E
-:10B0B0008D010FF6B7EE9581F27DE85F7C8BF80C81
-:10B0C000503F90DD98AFBC3EBCC9D2EFD6F80A38ED
-:10B0D000ED085F847FF23E7DAD395FEE679B67CB05
-:10B0E000FD55509691CECEE638EB85DC6B42EEA353
-:10B0F00005C101CAB74453E4DEB6A3888724B93F2B
-:10B1000065CBBD25C7397E71EF2387E41EF9EA2799
-:10B110009BC579D1DF4EB2A38A35DED928EA5BF52B
-:10B120007EA1579546A12F142DD98E22DFBC4B74DA
-:10B130004995F78822FCE3A6D27F9DB667645773D2
-:10B14000FC3E291B97D67E3F11A13CD6716529CBC9
-:10B1500077AA1C45B555CCE7C7957A4827FFF396E3
-:10B16000239F6D474CB623A9E36C79EA3BDEC47894
-:10B17000B1EDCA713CB799604F366A020F684F3E15
-:10B1800026FE4A95A7DA4233144CB34FB543F8A5CF
-:10B19000AFAD0B0A7F11FD44F253A2CEF47E80DAEC
-:10B1A00021FC9F9C46EBF7153A8473510F3636C647
-:10B1B000EBA98681F2AC7620BC75E6442FC960AF5E
-:10B1C00067D84FFB47F97475FC15F2F9D126E117E2
-:10B1D00042772EFB2D763B17DFDBFE8ECDFFA9E3FA
-:10B1E0009E2C323BD3E1E5F3165E8E0E3C9DC41FD0
-:10B1F00043CAD29B0C3DAD5E358DCBA257E7E757D6
-:10B200001C473BC77A7576BFE2BA8E347C309B5FB1
-:10B21000F1890E91CF45BF621DCDAB2D177EC5E7DD
-:10B220003BE0F2FA0B35F731BE2ED55FD86CF1DF7B
-:10B230006CFE425787AD37C2AC375C96DEB8587F9C
-:10B24000218D7F703BF32F4CCA54FF43541B221FA8
-:10B2500022F408EA99BBE83DC6F1EC2F1CF5087E04
-:10B26000312D3D736D7B7007E175A85AF80B974B34
-:10B270000ED0EFBBAF236FFEF230DF71A58FAD1D97
-:10B2800098203F07BC31BA37DD4BF795287E7CCF3D
-:10B290002BEE11009451DEFF8BF23506D9B991CC1B
-:10B2A0002F7D83C6774714A07B83433D22FFF7C5DC
-:10B2B000055947017967C8197E6AC2CFBF770D1E4D
-:10B2C000C5F60F1985A39070EFF6B0256F2ED8C282
-:10B2D000F774B3B45B9EFD3037DDFEC4FD5CBABAD3
-:10B2E000728E7FD751A0F13D320B3F596A10227EFA
-:10B2F000922307D747D0DB83EA84BC475F4D5727AB
-:10B30000C7C1F922EF25837286F2EF03B49638178E
-:10B310009FB37FB1FB513A970E218677D0EFE0BC07
-:10B320007BFF5A11EFF47BC26E2D8DDED8D7937C54
-:10B33000FF28B595973D16A33BC287038A4169CF85
-:10B34000C1B2CA26CA4F4635AE0083EA7304D3D5CC
-:10B35000A7C72DF9D4C1607BAC7CB2253B9DBDB0A5
-:10B36000DB010BFF76DF5D326612DFA94566907F59
-:10B3700087E3F34B9184BCF11316FCBD9211AF45EA
-:10B3800064EDF50AFDEFD66326FDDEB82FEF2EAE95
-:10B3900033BAF5089CA1E72531F839E9A77C77E7AE
-:10B3A000689A7DBCD521E294BDCE10AFB7375FE17E
-:10B3B000FAE3DEA2F4F9ACE73B441E49F5AD0F72A7
-:10B3C0005EDFA7709D3875DC53169FF4AB6640E3D3
-:10B3D000B8FA81323A577409708E72EC9D379FD853
-:10B3E0008DFDFD3D41CE7B0C51FE0385B5BFF05E6A
-:10B3F000C6FBFE6B1C1A9D6383FC11DF47385C0D96
-:10B4000006E98FEC6A1C9710471E86D101BA0F77A8
-:10B41000782D70BED46B0493DEF723038E93FFA5C3
-:10B420004CB03E734237D7010EF855BEA73354795E
-:10B430009AFD231DC6394F315429E865D793FC1670
-:10B440003FFAFD773527CAC1018B6E0F52DE9CEFA4
-:10B45000318D41A2FF75A0709CEDF38175E39D5481
-:10B4600017CCF2BB0D0A45F6D70481E474A8CA9143
-:10B47000F67ED450D569DE67EA7E9C277EC9FA2F16
-:10B480004B99E0FC4456D96FD9AE3C64ED63E35A66
-:10B49000E0CD66570B3D9BDD1606FA7D58DE5BF26C
-:10B4A000A88EFDDD85BF8A38493E6E0358A4D37E41
-:10B4B0002778BF879B9F8EF3FEACFBBA203FCFF768
-:10B4C000712128E4D7BE77BDB04D4D8ADFB352EE6F
-:10B4D0004565A6F441EEBAE07DB2EEF7EE3975327D
-:10B4E00001DEA2CEE4FBD973CDFF43CF8E5327916B
-:10B4F0005F0E575E58BE0E59758D584F35D3C9E64D
-:10B50000339BEFB2E88839B3CF1FF28D75A6B3C372
-:10B510001D9D420E52F93195FF34D718DBF143EBF4
-:10B5200092E1DCD029E4F8060B4E4EA19E4FEFEDE0
-:10B530007B4C747FEAE934EB7EBA53E5F1337C6DE2
-:10B54000DBF9772ECDCE2F6B1176DEBF2A83EC3C54
-:10B55000E2F365BAC7F67B940F4890EB3E6FB29F5B
-:10B5600069DBF9C73B457CF062DE5512D9E91CCF97
-:10B5700004FBBF59D5C97980543BAD3A431C37AA67
-:10B58000F9AAAD6FB89EF55AC7FB4F4410CEFEF82E
-:10B590003EAE0F6522FF66484CA7483A3A4179F221
-:10B5A000BD9AF24E10BF63D3855EC85AAB70BD63BF
-:10B5B000C8F15EF587D82AB130042DB883CCB7FB2B
-:10B5C000C7F97E8EC5F773D1933E7F5A63FD2E85F2
-:10B5D000EA88F56F56A78B2BEC96EE4F25DF77BFE9
-:10B5E00038B9F8FB4EABBE9C0119422E9A1D7D6402
-:10B5F000EF9B1D7C2F85AEEF2A6BACD201D5F56990
-:10B6000067F8DE4FF77F24AB5EB474465EE0567198
-:10B61000AFE5EC0E714F867F47B8947EF739C1BF16
-:10B620000FBC926EB1CAEC07B3DC9C850207D583D0
-:10B6300023272469DA0FBA82AE341A0E9A570241D0
-:10B640006E53F77D1584F97919C4B8BD06C6B82DB7
-:10B6500087716E2B60925B9326E07E8D93A2AEB1D4
-:10B660000A0C999E574290DB3510E6B61A62DC7ED2
-:10B67000A5FE6F7F733B4EF9DA797811784D23DFA1
-:10B6800071043A7D7E1BCFAD9D3AF3C95CF4EEF3B5
-:10B690004DB01F5F5F3DCE7EA8D71364FE76FA05DE
-:10B6A0007FDB709CB3E4836D3F49253F69751AFECB
-:10B6B0009DC34F4AFD1DC9FF0229F7D0B3D04500F5
-:10B6C0000000000000000000000000180000000062
-:10B6D000000000000000004000000000000000002A
-:10B6E0000000002800000000000000000000001022
-:10B6F000000000000000000000000020000000002A
-:10B700000000000000000010000000000000000029
-:10B710000000000800000000000000000000000021
-:10B7200000000000000000000000003900000000E0
-:10B7300000000000000000380000000000000000D1
-:10B7400000000000000000000000000000000008F1
-:10B7500000000000000000000000000000000000E9
-:10B76000000000000000000C0000000000000000CD
-:10B770000000000E000000000000000000000004B7
-:10B7800000000000000000000000001800000000A1
-:10B79000000000000000001C00000000000000008D
-:10B7A0000000001C0000000000000000000000136A
-:10B7B00000000000000000000000003A000000004F
-:10B7C0000000000000000001000000000000000078
-:10B7D0000000000200000000000000000000000166
-:10B7E0000000000000000000000000100000000049
-:10B7F00000000000000000500000000000000000F9
-:10B800000000000000000000000000000000000335
-:10B810000000000000000000000000AB000000007D
-:10B820000000000000000008000000000000000010
-:10B830000000C00000100000000000080000C00868
-:10B8400000100000000000020000C0000010000016
-:10B850000000001000009FB0000000000000000881
-:10B860000000C08000100000000000040000C0883C
-:10B8700000100000000000020000C0800010000066
-:10B8800000000010000091200000000000000008EF
-:10B8900000009340000100040000000100009348F4
-:10B8A00000000000000000020000935000000000B3
-:10B8B0000000000800009354000000000000000297
-:10B8C00000009418000000000000000800009358D9
-:10B8D000000800000000000800009AB000400000CE
-:10B8E00000000040000093980008000000000008DD
-:10B8F000000093D800080000000000080000942019
-:10B9000000C8000000000098000095B000980000FA
-:10B9100000000028000095F00098000000000028BA
-:10B920000000C480054000300000054000009D205C
-:10B93000000800000000000100009D210008000038
-:10B9400000000001000020080010000000000010AE
-:10B9500000002000000000000000000800009CD84B
-:10B96000000800000000000200009D180000000018
-:10B9700000000001000000010000000000000000C5
-:10B9800000000009000000000000000000000002AC
-:10B9900000000000000000000000CF2000000000B8
-:10B9A000000000200000CF46000000000000000161
-:10B9B0000000600000200000000000200000730074
-:10B9C000000800000000000800009FA00000000028
-:10B9D0000000000100009FA800000000000000011E
-:10B9E00000009F60000000000000001000009F6346
-:10B9F000000000000000000100009F610000000046
-:10BA00000000000100009F6600000000000000012F
-:10BA100000009F67000000000000000000009F6819
-:10BA2000000000000000000400009F6C0000000007
-:10BA300000000004000000520000000000000000B0
-:10BA400000000003000000000000000000000003F0
-:10BA500000000000000000000000000500000000E1
-:10BA600000000000000000020000000000000000D4
-:10BA700000060000000000000000002000009F7091
-:10BA8000000000000000000100009F900000000086
-:10BA9000000000080000005300000000000000004B
-:10BAA00000009F98000000000000000200009F9C22
-:10BAB000000000000000000100009F9D0000000049
-:10BAC000000000010000000900000000000000006C
-:10BAD0000000000100000000000000000000004421
-:10BAE0000000000000000000000000010000000055
-:10BAF00000000000000000500000000000000000F6
-:10BB0000000000890000000000000000000012C8D2
-:10BB10000080000000000080000000010000000024
-:10BB2000000000000000A000071000000000071047
-:10BB300000001AC800000000000000080000AEC0AD
-:10BB400000080000000000080000AE4000080000EF
-:10BB5000000000080000AE8000080000000000089F
-:10BB6000000020080010000000000010000020006D
-:10BB700000000000000000080000A01007100040B6
-:10BB80000000004000001BF8000800000000000159
-:10BB900000001BF9000800000000000100001AD09E
-:10BBA000000000000000000100001AD800000000A2
-:10BBB0000000000200001ADA00000000000000028D
-:10BBC0008000000000000000000000000000AF0046
-:10BBD000000000000000002000001B78002800008A
-:10BBE000000000040000E000002000000000002031
-:10BBF0000000F300000800000000000800001AF038
-:10BC0000000000000000010800001B3700000000D9
-:10BC10000000000100001B0F0000000000000001F8
-:10BC200000001B70000000000000000400001B74F6
-:10BC300000000000000000040000005000000000B0
-:10BC400000000000000000030000000000000000F1
-:10BC500000000005000000000000000000000006D9
-:10BC600000000000000000000000000700000000CD
-:10BC70000000000000001BC80000000000000001E0
-:10BC800000001BE800000000000000080000005158
-:10BC9000000000000000000000001BD000000000B9
-:10BCA0000000000400001BD400000000000000049D
-:10BCB00000001BD8000000000000000400001BDC96
-:10BCC00000000000000000080000B00000180000A4
-:10BCD000000000180000C00000400000000000400C
-:10BCE0000000C00000400002000000010000C00190
-:10BCF00000400002000000000000E2000020000000
-:10BD0000000000200000E204000200080020000201
-:10BD10008000000000000000000000000000E200C1
-:10BD200000080020000000040000F40000280000CB
-:10BD3000000000280000F540001000000000001086
-:10BD40000000F5C000200000000000200000F5C049
-:10BD500000020020000000020000F30000200000AC
-:10BD6000000000200000200800100000000000106B
-:10BD70000000200000000000000000080000110882
-:10BD80000008000000000008000011680008000022
-:10BD900000000008000011A80008000000000008D2
-:10BDA00000001240000800000000000100001241E5
-:10BDB0000008000000000001000040000020000416
-:10BDC00000000010000059000030001800000010B2
-:10BDD0000000590800300018000000020000570061
-:10BDE00000080000000000010000570100080000EA
-:10BDF00000000001000011E8000000000000000148
-:10BE0000000011F00000000000000001000011F827
-:10BE100000000000000000100000124400080000B4
-:10BE2000000000040000400000200000000000208E
-:10BE30000000530000100000000000100000153842
-:10BE400000000000000000010000000300000000EE
-:10BE500000000000000000000000000000000000E2
-:10BE600000000001000000000000000000000004CD
-:10BE700000000000000000000000150800000000A5
-:10BE8000000000010000152800000000000000086C
-:10BE900000000050000000000000000000008308C7
-:10BEA0000080000000000080000000010000000091
-:10BEB000000000000000200800100000000000103A
-:10BEC00000002000000000000000000800008410B6
-:10BED0000008000000000008000084700008000056
-:10BEE0000000000800060000046000280000046054
-:10BEF00000008520000800000000000100008521EE
-:10BF000000080000000000018000000000000000A8
-:10BF10000000000000008408000000000000000194
-:10BF2000000084F40008000000000002000084F615
-:10BF3000000800000000000200008504001000005E
-:10BF400000000004000087600000000000000020E6
-:10BF500000006000002000000000002000007300CE
-:10BF600000080000000000080000000300000000BE
-:10BF700000000000000000050000000000000000BC
-:10BF800000000006000000000000000000000007A4
-:10BF90000000000000000000000088080000000011
-:10BFA00000000001000088280000000000000008D8
-:10BFB0000000005000000000000000000000881099
-:10BFC00000000000000000040000881400000000D1
-:10BFD00000000004000088180000000000000004B9
-:10BFE0000000881C00000000000000080000300075
-:10BFF0000040000000000008000030080040000081
-:10C00000000000280000339001C00010000000086C
-:10C010000000320000200000000000200000372057
-:10C02000000000000000000800001020062000387A
-:10C03000000000080000A000000000000000200038
-:10C0400000003EA9000000000000000100003EC802
-:10C05000000000000000000280000000000000005E
-:10C060000000000000006000002000000000000848
-:10C070000000400000080000000000010000400136
-:10C08000000800000000000100004040000800041B
-:10C0900000000002000040600008000400000004EE
-:10C0A0000000400000080000000000040000400400
-:10C0B00000080000000000040000404000000000F4
-:10C0C00000000008000040480000000000000008D8
-:10C0D0000000800000000000000000100000504040
-:10C0E00000010004000000010000500000000000FA
-:10C0F00000000020000050080010000000000004B4
-:10C100000000500C0010000000000001000052C7A9
-:10C110000000000000000001000052C60000000006
-:10C120000000000100003000003000180000000492
-:10C130000000300400300018000000040000300847
-:10C1400000300018000000020000300A0030001823
-:10C15000000000020000300C003000180000000158
-:10C160000000300D00300018000000010000300E0B
-:10C1700000300018000000010000301000300018EE
-:10C18000000000040000301400300018000000041B
-:10C19000000050000100008000080004000050046E
-:10C1A00001000080000800040000000A00000000F8
-:10C1B0000000000000005068010000800000000145
-:10C1C0000000506901000080000000010000506C78
-:10C1D00001000080000000020000506E010000809D
-:10C1E0000000000200005070010000800000000408
-:10C1F0000000507401000080000000040000506640
-:10C200000100008000000002000050640100008076
-:10C2100000000001000050600100008000000002EA
-:10C220000000506201000080000000020000505039
-:10C230000100008000000004000050540100008054
-:10C2400000000004000050580100008000000004BD
-:10C250000000505C01000080000000040000507CE1
-:10C2600001000080000000010000507D01000080FE
-:10C270000000000100004018001000000000000451
-:10C2800000004090001000000000000400004098F2
-:10C290000010000000000004000041100000000039
-:10C2A0000000000200004112000000000000000237
-:10C2B00000004114000000000000000200004116D0
-:10C2C00000000000000000020000604000080000C4
-:10C2D00000000002000060420008000000000002B0
-:10C2E00000006044000800000000000400006080BE
-:10C2F0000008000000000008000060C000400008C6
-:10C3000000000008000060000008000000000002BB
-:10C31000000060020008000000000001000060044E
-:10C320000008000000000002000063400008000058
-:10C330000000000800006380000800000000000406
-:10C34000000063840008000000000001000063C0DA
-:10C350000008000000000002000063C400080000A4
-:10C36000000000020000640000080000000000045B
-:10C3700000007000001000000000000400007004C5
-:10C380000010000000000004000070080010000011
-:10C3900000000004000090000008000000000002FF
-:10C3A000000090020008000000000001000090045E
-:10C3B000000800000000000200009040000800009B
-:10C3C000000000020000904400080000000000028D
-:10C3D000000090460008000000000002000096489F
-:10C3E0000008000000000008000090800008000025
-:10C3F000000000020000908400080000000000021D
-:10C40000000096880008000000000008000080403E
-:10C41000000800000000000100008041000800004A
-:10C420000000000100008042000800000000000140
-:10C4300000008043000800000000000100008000B0
-:10C440000008000000000002000080020008000058
-:10C45000000000010000800400080000000000024D
-:10C46000000080C00008000000000002000080C240
-:10C470000008000000000002000080C40008000066
-:10C4800000000002000080800008000000000001A1
-:10C490000000808100080000000000010000808290
-:10C4A0000008000000000001000080830008000078
-:10C4B000000000010000808400080000000000016E
-:10C4C0000000808500080000000000010000808658
-:10C4D00000080000000000010000600000080000EB
-:10C4E00000000002000060020008000000000001DF
-:10C4F000000060040008000000000002000060422C
-:10C5000000C00018000000020000604000C00018D9
-:10C51000000000020000604C00C00018000000088D
-:10C520000000604400C000180000000800006057D0
-:10C5300000C00018000000010000605400C0001896
-:10C54000000000020000605600C00018000000015A
-:10C55000000066400008000000000008000066803F
-:10C560000008000000000008000066C0000800008D
-:10C57000000000080000DA4200180000000000027D
-:10C580000000DE4000000000000000000000E000AD
-:10C5900000000000000000040000D0C00000000007
-:10C5A000000000040000D0C40000000000000004EF
-:10C5B0000000D0C800000000000000040000D0CC43
-:10C5C00000000000000000040000D0D000000000C7
-:10C5D000000000040000D0D40000000000000004AF
-:10C5E0000000D0D800000000000000040000D0C00F
-:10C5F00000000000000000200000DB000000000040
-:10C60000000000040000DB000000000000000068E3
-:10C610000000B94800000000000000000000D00049
-:10C6200000000000000000040000B0C00000000096
-:10C63000000000040000B0C400000000000000047E
-:10C640000000B0C800000000000000040000B0C0FE
-:10C6500000000000000000100000D6B00000000044
-:10C66000000000040000D6B4000000000000000438
-:10C670000000D6B800000000000000040000D6BC96
-:10C6800000000000000000040000D6B00000000020
-:10C69000000000100000D348000000000000000867
-:10C6A0000000D358000000000000008000000010CF
-:10C6B00000000000000000000000D358000000004F
-:10C6C0000000000800000000060209000000000051
-:00000001FF
diff --git a/firmware/cis/.gitignore b/firmware/cis/.gitignore
deleted file mode 100644
index 1de39847f261..000000000000
--- a/firmware/cis/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.cis
diff --git a/firmware/cis/3CCFEM556.cis.ihex b/firmware/cis/3CCFEM556.cis.ihex
deleted file mode 100644
index e4d92b173e17..000000000000
--- a/firmware/cis/3CCFEM556.cis.ihex
+++ /dev/null
@@ -1,13 +0,0 @@
-:1000000001030000FF152D050033436F6D004D65A2
-:100010006761686572747A2033434346454D3535D0
-:1000200036004C414E202B2035366B204D6F6465D9
-:100030006D0000FF20040101560521020000060B9F
-:1000400002004D000000006B000000FF001303439E
-:100050004953210206001A060507001067021B0912
-:1000600087011901556430FFFFFF00130343495313
-:10007000210202001A060527001177021B09A701B9
-:090080001901552330FFFFFF00B8
-:00000001FF
-#
-# This card is MFC-compliant, but identifies itself as single function
-#
diff --git a/firmware/cis/3CXEM556.cis.ihex b/firmware/cis/3CXEM556.cis.ihex
deleted file mode 100644
index 895010b230ff..000000000000
--- a/firmware/cis/3CXEM556.cis.ihex
+++ /dev/null
@@ -1,13 +0,0 @@
-:1000000001030000FF152C050033436F6D004D65A3
-:100010006761686572747A20334358454D353536CB
-:10002000004C414E202B2035366B204D6F64656DA2
-:100030000000FF20040101350021020000060B0230
-:10004000004C0000000069000000FF00130343495A
-:1000500053210206001A0501070008631B098701E6
-:100060001901556430FFFFFF001303434953210278
-:1000700002001A0501270009631B09A70119015590
-:060080002330FFFFFF002A
-:00000001FF
-#
-# This card is MFC-compliant, but identifies itself as single function
-#
diff --git a/firmware/cis/COMpad2.cis.ihex b/firmware/cis/COMpad2.cis.ihex
deleted file mode 100644
index 1671c5e48caa..000000000000
--- a/firmware/cis/COMpad2.cis.ihex
+++ /dev/null
@@ -1,11 +0,0 @@
-:1000000001030000FF151F0401414456414E5445B1
-:10001000434800434F4D7061642D33322F38350013
-:10002000312E300000FF210202011A0501050001F6
-:10003000031B0EC18118AA61E80207E8030730B864
-:100040009E1B08820108AA6030030F1B0883010869
-:10005000AA6040030F1B08840108AA6050030F1B0D
-:0D00600008850108AA6060030F1400FF006E
-:00000001FF
-#
-# Replacement CIS for Advantech COMpad-32/85
-#
diff --git a/firmware/cis/COMpad4.cis.ihex b/firmware/cis/COMpad4.cis.ihex
deleted file mode 100644
index 27bbec1921b3..000000000000
--- a/firmware/cis/COMpad4.cis.ihex
+++ /dev/null
@@ -1,9 +0,0 @@
-:1000000001030000FF151F0401414456414E5445B1
-:10001000434800434F4D7061642D33322F383542D1
-:100020002D34000000FF210202011A050102000127
-:10003000011B0BC18118AA6040021F30B89E1B082B
-:0C004000820108AA6040031F1400FF00AA
-:00000001FF
-#
-# Replacement CIS for Advantech COMpad-32/85B-4
-#
diff --git a/firmware/cis/DP83903.cis.ihex b/firmware/cis/DP83903.cis.ihex
deleted file mode 100644
index 6d73ea3cf1b8..000000000000
--- a/firmware/cis/DP83903.cis.ihex
+++ /dev/null
@@ -1,14 +0,0 @@
-:1000000001030000FF152904014D756C74696675C4
-:100010006E6374696F6E20436172640000004E531A
-:1000200043204D46204C414E2F4D6F64656D00FFBF
-:1000300020047501000021020000060B02004900A7
-:100040000000006A000000FF00130343495321022F
-:1000500006001A060517201077021B0C970179017C
-:10006000556530FFFF284000FF001303434953212B
-:100070000202001A060507401077021B09870119C2
-:0800800001552330FFFFFF00D2
-:00000001FF
-#
-# This CIS is for cards based on the National Semiconductor
-# DP83903 Multiple Function Interface Chip
-#
diff --git a/firmware/cis/LA-PCM.cis.ihex b/firmware/cis/LA-PCM.cis.ihex
deleted file mode 100644
index a0ff0c7b393d..000000000000
--- a/firmware/cis/LA-PCM.cis.ihex
+++ /dev/null
@@ -1,20 +0,0 @@
-:100000000105D4F953E9FF17035338FF20040FC04B
-:1000100002002102060315390401416C6C69656414
-:100020002054656C657369732C4B2E4B00457468C6
-:1000300065726E6574204C414E20436172640043CA
-:10004000656E747265434F4D004C412D50434D0019
-:10005000FF1A0602100000020B1B08810108E06075
-:1000600000021F1B08820108E06020021F1B08839A
-:100070000108E06040021F1B08840108E060600284
-:100080001F1B08850108E06080021F1B088601080D
-:10009000E060A0021F1B08870108E060C0021F1B70
-:1000A00008880108E060E0021F1B08890108E06081
-:1000B00000031F1B088A0108E06020031F1B088B38
-:1000C0000108E06040031F1B088C0108E06060032A
-:1000D0001F1B088D0108E06080031F1B088E0108AC
-:1000E000E060A0031F1B088F0108E060C0031F1B16
-:0D00F00008900108E060E0031F1400FF000D
-:00000001FF
-#
-# Replacement CIS for Allied Telesis LA-PCM
-#
diff --git a/firmware/cis/MT5634ZLX.cis.ihex b/firmware/cis/MT5634ZLX.cis.ihex
deleted file mode 100644
index 72500b9d95d8..000000000000
--- a/firmware/cis/MT5634ZLX.cis.ihex
+++ /dev/null
@@ -1,11 +0,0 @@
-:100000000101FF152204014D756C74695465636824
-:100010000050434D4349412035364B2044617461C3
-:10002000466178000000FF20040002010021020266
-:10003000001A05012780FF671B0FCF418B01550177
-:10004000550155AA60F80307281B08970108AA6004
-:10005000F802071B089F0108AA60E803071B08A70E
-:0B0060000108AA60E802071400FF007E
-:00000001FF
-#
-# Replacement CIS for Multitech MT5634ZLX modems
-#
diff --git a/firmware/cis/NE2K.cis.ihex b/firmware/cis/NE2K.cis.ihex
deleted file mode 100644
index 1bb40fc4759f..000000000000
--- a/firmware/cis/NE2K.cis.ihex
+++ /dev/null
@@ -1,8 +0,0 @@
-:1000000001030000FF1515040150434D4349410011
-:1000100045746865726E6574000000FF2102060079
-:100020001A050120F803031B09E001190155653089
-:06003000FFFF1400FF00B9
-:00000001FF
-#
-# Replacement CIS for various busted NE2000-compatible cards
-#
diff --git a/firmware/cis/PCMLM28.cis.ihex b/firmware/cis/PCMLM28.cis.ihex
deleted file mode 100644
index ffdfe8522ef5..000000000000
--- a/firmware/cis/PCMLM28.cis.ihex
+++ /dev/null
@@ -1,18 +0,0 @@
-:1000000001030000FF151504014C494E4B53595391
-:100010000050434D4C4D3238000000FF2004430196
-:10002000ABC0210200001A05012FF803031B10E4E6
-:1000300001190155E06100031FF8020730FFFF1BA3
-:100040000BA50108E06120031FF802071B0BA601A6
-:1000500008E06140031FF802071B0BA70108E061DD
-:1000600060031FF802071B0BA80108E06100031FD3
-:10007000E803071B0BA90108E06120031FE8030741
-:100080001B0BAA0108E06140031FE803071B0BAB31
-:100090000108E06160031FE803071B0BAC0108E0E7
-:1000A0006100031FE802071B0BAD0108E06120039C
-:1000B0001FE802071B0BAE0108E06140031FE802C6
-:1000C000071B0BAF0108E06160031FE80207140083
-:0200D000FF002F
-:00000001FF
-#
-# The on-card CIS says it is MFC-compliant, but it is not
-#
diff --git a/firmware/cis/PE-200.cis.ihex b/firmware/cis/PE-200.cis.ihex
deleted file mode 100644
index e6dbdab6eb79..000000000000
--- a/firmware/cis/PE-200.cis.ihex
+++ /dev/null
@@ -1,9 +0,0 @@
-:1000000001030000FF151E0401504D582020200060
-:1000100050452D3230300045544845524E4554002D
-:1000200052303100FF210206031A050101000101CF
-:100030001B0EC181190155E051000F100F30FFFF59
-:040040001400FF00A9
-:00000001FF
-#
-# Replacement CIS for PE-200 ethernet card
-#
diff --git a/firmware/cis/PE520.cis.ihex b/firmware/cis/PE520.cis.ihex
deleted file mode 100644
index 97a745b5496e..000000000000
--- a/firmware/cis/PE520.cis.ihex
+++ /dev/null
@@ -1,9 +0,0 @@
-:1000000001030000FF152304014B544900504535FE
-:10001000323020504C55530050434D434941204508
-:10002000746865726E65740000FF20046101100041
-:10003000210206001A050101D00F0B1B09C101198D
-:0A00400001556530FFFF1400FF00BA
-:00000001FF
-#
-# Replacement CIS for PE520 ethernet card
-#
diff --git a/firmware/cis/RS-COM-2P.cis.ihex b/firmware/cis/RS-COM-2P.cis.ihex
deleted file mode 100644
index 0801ca5da80a..000000000000
--- a/firmware/cis/RS-COM-2P.cis.ihex
+++ /dev/null
@@ -1,10 +0,0 @@
-:1000000001030000FF1516040150434D4349410010
-:1000100052532D434F4D203250000000FF21020269
-:10002000011A0501030001011B0EC18118AA61E834
-:100030000307E8020730B89E1B0B820108AA615033
-:1000400002075802071B0B830108AA6160020768B8
-:0600500002071400FF008E
-:00000001FF
-#
-# Replacement CIS for dual-serial-port IO card
-#
diff --git a/firmware/cis/SW_555_SER.cis.ihex b/firmware/cis/SW_555_SER.cis.ihex
deleted file mode 100644
index 9b9348acee7b..000000000000
--- a/firmware/cis/SW_555_SER.cis.ihex
+++ /dev/null
@@ -1,12 +0,0 @@
-:100000000101FF17034100FF20043F0110072102F7
-:100010000200152A070053696572726120576972E0
-:10002000656C657373004169724361726420353594
-:1000300035004135353500526576203100FF1A050F
-:1000400001030007731B0BE00118A360F8030730DE
-:10005000BC3F1B08A10108A360F802071B08A2010E
-:1000600008A360E803071B08A30108A360E80207D0
-:0A0070001B04A40108231400FF0084
-:00000001FF
-#
-# Replacement CIS for AC555 provided by Sierra Wireless
-#
diff --git a/firmware/cis/SW_7xx_SER.cis.ihex b/firmware/cis/SW_7xx_SER.cis.ihex
deleted file mode 100644
index 11e44ad86437..000000000000
--- a/firmware/cis/SW_7xx_SER.cis.ihex
+++ /dev/null
@@ -1,13 +0,0 @@
-:100000000101FF17034100FF2004920110072102A4
-:1000100002001537070053696572726120576972D3
-:10002000656C6573730041433731302F4143373579
-:10003000300047505253204E6574776F726B2041E9
-:1000400064617074657200523100FF1A050103008B
-:1000500007731B10E00119784D555D25A360F80367
-:100060000730BC861B08A10108A360F802071B0823
-:10007000A20108A360E803071B08A30108A360E826
-:0C00800002071B04A40108231400FF0069
-:00000001FF
-#
-# Replacement CIS for AC7xx provided by Sierra Wireless
-#
diff --git a/firmware/cis/SW_8xx_SER.cis.ihex b/firmware/cis/SW_8xx_SER.cis.ihex
deleted file mode 100644
index bbcfe6348328..000000000000
--- a/firmware/cis/SW_8xx_SER.cis.ihex
+++ /dev/null
@@ -1,13 +0,0 @@
-:100000000101FF17034100FF2004920110072102A4
-:100010000200152F070053696572726120576972DB
-:10002000656C657373004143383530003347204EAB
-:100030006574776F726B20416461707465720052F1
-:100040003100FF1A0501030007731B10E001197846
-:100050004D555D25A360F8480730BC861B08A101FB
-:1000600008A360F847071B08A20108A360E8480737
-:100070001B08A30108A360E847071B04A401082389
-:040080001400FF0069
-:00000001FF
-#
-# Replacement CIS for AC8xx provided by Sierra Wireless
-#
diff --git a/firmware/cis/tamarack.cis.ihex b/firmware/cis/tamarack.cis.ihex
deleted file mode 100644
index 1e86547fb361..000000000000
--- a/firmware/cis/tamarack.cis.ihex
+++ /dev/null
@@ -1,10 +0,0 @@
-:100000000103D400FF17034100FF152404015441EC
-:100010004D415241434B0045746865726E657400F2
-:10002000410030303437343331313830303100FF33
-:10003000210206001A050120F803031B14E08119B0
-:100040003F554D5D06864626E551000F100F30FFE7
-:05005000FF1400FF0099
-:00000001FF
-#
-# Replacement CIS for Surecom, Tamarack NE2000 cards
-#
diff --git a/firmware/cpia2/stv0672_vp4.bin.ihex b/firmware/cpia2/stv0672_vp4.bin.ihex
deleted file mode 100644
index bd0b9cf65640..000000000000
--- a/firmware/cpia2/stv0672_vp4.bin.ihex
+++ /dev/null
@@ -1,73 +0,0 @@
-:1000000001BCE302E303E304E305E306E3079344EF
-:1000100056D4934E5651934E51D6934E4F54934EC1
-:10002000924F92A4930592F4931B929291E692368A
-:100030009274924A928C928EC8D00B4202A0CA92BD
-:100040000902C9100A0A0A81E3B8E3B0E3A8E3A0F1
-:10005000E398E390E100CFD70A12CC9508B20A18D2
-:10006000E10001EE0C084A12C818F09AC022F31CF5
-:100070004A13F314C8A0F214F21CEB13D3A26316B4
-:10008000489EF018A403F393C058F713519CE9203D
-:10009000CFEF63F9922ED35F63FA922ED36763FB9F
-:1000A000922ED36FE91A631648A7F020A406F394A2
-:1000B000C027F714F513519DF6136318C420CBEF36
-:1000C00063FC922ED37763FD922ED37F63FE922E34
-:1000D000D38763FF922ED38F6438922ED3976439DF
-:1000E000922ED39FE100F53AF43BF7BFF2BCF23D0C
-:1000F000E1008087908051D5022202324BD3F71164
-:100100000BDAE1000E0202400DB5E3024855E5129C
-:10011000A401E81BE390F018A401E8BF8DB84BD10F
-:100120004BD80BCB0BC2E100E302E30352D360597F
-:10013000E6930D2252D4E6930D2AE398E390E10072
-:10014000025D0263E302C81202CAC85202C2826898
-:10015000E302C81402CAC89002C20AD0C9930ADADC
-:10016000CCD20AE2631202DA0A980AA00AA8E39043
-:10017000E100E3020AD0C9930ADACCD20AE26312A0
-:1001800002DA0A980AA00AA84991E56AA404C812EA
-:1001900002CAC8528289C81402CAC89002C2E39037
-:1001A000E1000860E1004853E897085AE100E302E3
-:1001B000E30354D36059E6930D52E398E390E100D2
-:1001C000029CE3025513931755139317E390E10034
-:1001D0007530E302E30355556059E6930DB2E39899
-:1001E000E390E10002AEE792E918EA9AE898E81095
-:1001F000E811E851D2DAD2F3E813D2FAE850D2EAA1
-:10020000E8D0E8D1D30A03094823E52CA003482409
-:10021000EA1C0308D2E3D303D313E10002CB059316
-:100220005793F09AAC0BE30792EAE29FE506E3B03E
-:10023000A002EB1E82D7EA1EE23B859BE91EC89016
-:10024000859402DE05805793F0BAAC0692EAE2BFCD
-:10025000E506A001EBBF8588E93EC8908581E93EAF
-:10026000F0BAF339F03A6017F03AC090F0BAE10012
-:10027000003FE302E30358106059E6930DA25812C1
-:10028000E6930DAAE398E390E1000301E100030384
-:100290009B7D8B8BE302E30358566059E6930DBABE
-:1002A000E398E390E100030F9311E100E3024A11A8
-:1002B0000B4291AFE390E100F291F091A3FEE100D7
-:1002C0006092C05FF013F013595BE213F0115A19FA
-:1002D000E213E10000000327686176616E610006A9
-:1002E000032CE302E303E9385915595AF29ABC0B7F
-:1002F000A40A591EF311F01AE2BB5915F011192A7C
-:10030000E502A401EBBFE398E390E1000342192862
-:10031000E100E9306079E100E303E3076079934E9F
-:10032000E3B8E398E100E91AF01FE233F091E292BA
-:08033000E032F031E1000000B1
-:00000001FF
-
- Copyright 2001, STMicrolectronics, Inc.
-
- Description:
- This file contains patch data for the CPiA2 (stv0672) VP4.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
diff --git a/firmware/cxgb3/ael2005_opt_edc.bin.ihex b/firmware/cxgb3/ael2005_opt_edc.bin.ihex
deleted file mode 100644
index c1d6e5d3bea7..000000000000
--- a/firmware/cxgb3/ael2005_opt_edc.bin.ihex
+++ /dev/null
@@ -1,69 +0,0 @@
-:10000000CC002FF4CC013CD4CC022015CC0331051C
-:10001000CC046524CC0527FFCC06300FCC072C8BF5
-:10002000CC08300BCC094009CC0A400ECC0B2F7207
-:10003000CC0C3002CC0D1002CC0E2172CC0F301241
-:10004000CC101002CC1125D2CC123012CC131002DD
-:10005000CC14D01ECC1527D2CC163012CC171002DF
-:10006000CC182004CC193C84CC1A6436CC1B200755
-:10007000CC1C3F87CC1D8676CC1E40B7CC1FA74634
-:10008000CC204047CC215673CC222982CC2330028D
-:10009000CC2413D2CC258BBDCC262862CC273012A1
-:1000A000CC281002CC292092CC2A3012CC2B100262
-:1000B000CC2C5CC3CC2D0314CC2E2942CC2F300287
-:1000C000CC301002CC31D019CC322032CC333012AB
-:1000D000CC341002CC352A04CC363C74CC37643591
-:1000E000CC382FA4CC393CD4CC3A6624CC3B5563D5
-:1000F000CC3C2D42CC3D3002CC3E13D2CC3F464DC1
-:10010000CC402862CC413012CC421002CC43203289
-:10011000CC443012CC451002CC462FB4CC473CD452
-:10012000CC486624CC495563CC4A2D42CC4B300296
-:10013000CC4C13D2CC4D2ED2CC4E3002CC4F100230
-:10014000CC502FD2CC513002CC521002CC530004F0
-:10015000CC542942CC553002CC561002CC572092B8
-:10016000CC583012CC591002CC5A5CC3CC5B03176C
-:10017000CC5C2F72CC5D3002CC5E1002CC5F294289
-:10018000CC603002CC611002CC6222CDCC63301D39
-:10019000CC642862CC653012CC661002CC672ED2BB
-:1001A000CC683002CC691002CC6A2D72CC6B300264
-:1001B000CC6C1002CC6D628FCC6E2112CC6F3012E1
-:1001C000CC701002CC715AA3CC722DC2CC73300209
-:1001D000CC741312CC756F72CC761002CC772807D2
-:1001E000CC7831A7CC7920C4CC7A3C24CC7B672452
-:1001F000CC7C1002CC7D2807CC7E3187CC7F20C4FC
-:10020000CC803C24CC816724CC821002CC83251482
-:10021000CC843C64CC856436CC86DFF4CC876436F1
-:10022000CC881002CC8940A4CC8A643CCC8B40168C
-:10023000CC8C8C6CCC8D2B24CC8E3C24CC8F643518
-:10024000CC901002CC912B24CC923C24CC93643AD9
-:10025000CC944025CC958A5ACC961002CC97273165
-:10026000CC983011CC991001CC9AC7A0CC9B01003E
-:10027000CC9CC502CC9D53ACCC9EC503CC9FD5D5A0
-:10028000CCA0C600CCA12A6DCCA2C601CCA32A4C1E
-:10029000CCA4C602CCA50111CCA6C60CCCA7590093
-:1002A000CCA8C710CCA90700CCAAC718CCAB0700B4
-:1002B000CCACC720CCAD4700CCAEC801CCAF7F5092
-:1002C000CCB0C802CCB17760CCB2C803CCB37FCE7F
-:1002D000CCB4C804CCB55700CCB6C805CCB75F11B8
-:1002E000CCB8C806CCB94751CCBAC807CCBB57E18B
-:1002F000CCBCC808CCBD2700CCBEC809CCBF000010
-:10030000CCC0C821CCC10002CCC2C822CCC30014CE
-:10031000CCC4C832CCC51186CCC6C847CCC71E02D7
-:10032000CCC8C013CCC9F341CCCAC01ACCCB04464C
-:10033000CCCCC024CCCD1000CCCEC025CCCF0A0074
-:10034000CCD0C026CCD10C0CCCD2C027CCD30C0C3A
-:10035000CCD4C029CCD500A0CCD6C030CCD70A0094
-:10036000CCD8C03CCCD9001CCCDAC005CCDB7A069A
-:10037000CCDC0000CCDD2731CCDE3011CCDF10012D
-:10038000CCE0C620CCE10000CCE2C621CCE3003FAB
-:10039000CCE4C622CCE50000CCE6C623CCE70000C6
-:1003A000CCE8C624CCE90000CCEAC625CCEB0000A2
-:1003B000CCECC627CCED0000CCEEC628CCEF00007C
-:1003C000CCF0C62CCCF10000CCF20000CCF3280617
-:1003D000CCF43CB6CCF5C161CCF66134CCF76135D8
-:1003E000CCF85443CCF90303CCFA6524CCFB000BC6
-:1003F000CCFC1002CCFD2104CCFE3C24CCFF21051A
-:10040000CD003805CD016524CD02DFF4CD034005D4
-:10041000CD046524CD051002CD065DD3CD070306BE
-:10042000CD082FF7CD0938F7CD0A60B7CD0BDFFD2A
-:10043000CD0C000ACD0D1002CD0E00007CC7AE59C8
-:00000001FF
diff --git a/firmware/cxgb3/ael2005_twx_edc.bin.ihex b/firmware/cxgb3/ael2005_twx_edc.bin.ihex
deleted file mode 100644
index 9b5e9e51fcb7..000000000000
--- a/firmware/cxgb3/ael2005_twx_edc.bin.ihex
+++ /dev/null
@@ -1,93 +0,0 @@
-:10000000CC004009CC0127FFCC02300FCC0340AA22
-:10001000CC04401CCC05401ECC062FF4CC073CD4AD
-:10002000CC082035CC093145CC0A6524CC0B26A25E
-:10003000CC0C3012CC0D1002CC0E29C2CC0F3002E9
-:10004000CC101002CC112072CC123012CC13100242
-:10005000CC1422CDCC15301DCC162E52CC1730121C
-:10006000CC181002CC1928E2CC1A3002CC1B10029A
-:10007000CC1C628FCC1D2AC2CC1E3012CC1F1002A9
-:10008000CC205553CC212AE2CC223002CC231302BF
-:10009000CC24401ECC252BE2CC263012CC271002DB
-:1000A000CC282DA2CC293012CC2A1002CC2B2BA28A
-:1000B000CC2C3002CC2D1002CC2E5EE3CC2F0305CD
-:1000C000CC30400ECC312BC2CC323002CC331002BB
-:1000D000CC342B82CC353012CC361002CC37566360
-:1000E000CC380302CC39401ECC3A6F72CC3B1002A4
-:1000F000CC3C628FCC3D2BE2CC3E3012CC3F100288
-:10010000CC4022CDCC41301DCC422E52CC433012BB
-:10011000CC441002CC452522CC463012CC471002EC
-:10012000CC482DA2CC493012CC4A1002CC4B2CA288
-:10013000CC4C3012CC4D1002CC4E2FA4CC4F3CD422
-:10014000CC506624CC51410BCC5256B3CC5303C493
-:10015000CC542FB2CC553002CC561002CC57220BC7
-:10016000CC58303BCC5956B3CC5A03C3CC5B866BCE
-:10017000CC5C400CCC5D23A2CC5E3012CC5F100274
-:10018000CC602DA2CC613012CC621002CC632CA2C8
-:10019000CC643012CC651002CC662FB4CC673CD452
-:1001A000CC686624CC6956B3CC6A03C3CC6B866B2F
-:1001B000CC6C401CCC6D2205CC6E3035CC6F5B53C3
-:1001C000CC702C52CC713002CC7213C2CC735CC395
-:1001D000CC740317CC752522CC763012CC77100264
-:1001E000CC782DA2CC793012CC7A1002CC7B2B8229
-:1001F000CC7C3012CC7D1002CC7E5663CC7F0303C6
-:10020000CC80401ECC810004CC822C42CC833012A6
-:10021000CC841002CC856F72CC861002CC87628FA2
-:10022000CC882304CC893C84CC8A6436CC8BDFF424
-:10023000CC8C6436CC8D2FF5CC8E3005CC8F865689
-:10024000CC90DFBACC9156A3CC92D05ACC9321C299
-:10025000CC943012CC951392CC96D05ACC9756A30E
-:10026000CC98DFBACC990383CC9A6F72CC9B1002E6
-:10027000CC9C28C5CC9D3005CC9E4178CC9F565354
-:10028000CCA00384CCA122B2CCA23012CCA3100209
-:10029000CCA42BE5CCA53005CCA641E8CCA7565381
-:1002A000CCA80382CCA90002CCAA4258CCAB2474BF
-:1002B000CCAC3C84CCAD6437CCAEDFF4CCAF64378F
-:1002C000CCB02FF5CCB13C05CCB28757CCB3B888B5
-:1002D000CCB49787CCB5DFF4CCB66724CCB7866AAC
-:1002E000CCB86F72CCB91002CCBA2D01CCBB301196
-:1002F000CCBC1001CCBDC620CCBE14E5CCBFC62101
-:10030000CCC0C53DCCC1C622CCC23CBECCC3C623EA
-:10031000CCC44452CCC5C624CCC6C5C5CCC7C625A2
-:10032000CCC8E01ECCC9C627CCCA0000CCCBC6289E
-:10033000CCCC0000CCCDC62BCCCE0000CCCFC62C74
-:10034000CCD00000CCD10000CCD22D01CCD33011C8
-:10035000CCD41001CCD5C620CCD60000CCD7C62139
-:10036000CCD80000CCD9C622CCDA00CECCDBC62358
-:10037000CCDC007FCCDDC624CCDE0032CCDFC62551
-:10038000CCE00000CCE1C627CCE20000CCE3C628DC
-:10039000CCE40000CCE5C62BCCE60000CCE7C62CB4
-:1003A000CCE80000CCE90000CCEA2D01CCEB301108
-:1003B000CCEC1001CCEDC502CCEE609FCCEFC600BA
-:1003C000CCF02A6ECCF1C601CCF22A2CCCF3C60CB0
-:1003D000CCF45400CCF5C710CCF60700CCF7C71806
-:1003E000CCF80700CCF9C720CCFA4700CCFBC728D3
-:1003F000CCFC0700CCFDC729CCFE1207CCFFC801FE
-:10040000CD007F50CD01C802CD027760CD03C80377
-:10041000CD047FCECD05C804CD06520ECD07C8054C
-:10042000CD085C11CD09C806CD0A3C51CD0BC807DB
-:10043000CD0C4061CD0DC808CD0E49C1CD0FC80906
-:10044000CD103840CD11C80ACD120000CD13C821FF
-:10045000CD140002CD15C822CD160046CD17C844D4
-:10046000CD18182FCD19C013CD1AF341CD1BC01ACA
-:10047000CD1C0446CD1DC024CD1E1000CD1FC025AF
-:10048000CD200A00CD21C026CD220C0CCD23C027C3
-:10049000CD240C0CCD25C029CD2600A0CD27C03001
-:1004A000CD280A00CD29C03CCD2A001CCD2B000050
-:1004B000CD2C2B84CD2D3C74CD2E6435CD2FDFF487
-:1004C000CD306435CD312806CD323006CD3385654B
-:1004D000CD342B24CD353C24CD366436CD371002B7
-:1004E000CD382B24CD393C24CD3A6436CD3B404524
-:1004F000CD3C8656CD3D1002CD3E2807CD3F31A7DD
-:10050000CD4020C4CD413C24CD426724CD431002D0
-:10051000CD442807CD453187CD4620C4CD473C2466
-:10052000CD486724CD491002CD4A2514CD4B3C64FB
-:10053000CD4C6436CD4DDFF4CD4E6436CD4F100238
-:10054000CD502806CD513CB6CD52C161CD5361345A
-:10055000CD546135CD555443CD560303CD57652455
-:10056000CD58000BCD591002CD5AD019CD5B2104C6
-:10057000CD5C3C24CD5D2105CD5E3805CD5F652485
-:10058000CD60DFF4CD614005CD626524CD632E8D55
-:10059000CD64303DCD655DD3CD660306CD672FF7C5
-:1005A000CD6838F7CD6960B7CD6ADFFDCD6B000A45
-:0C05B000CD6C1002CD6D000052A76B0E48
-:00000001FF
diff --git a/firmware/cxgb3/ael2020_twx_edc.bin.ihex b/firmware/cxgb3/ael2020_twx_edc.bin.ihex
deleted file mode 100644
index 8b1337f4c329..000000000000
--- a/firmware/cxgb3/ael2020_twx_edc.bin.ihex
+++ /dev/null
@@ -1,100 +0,0 @@
-:10000000D8004009D8012FFFD802300FD80340AAEA
-:10001000D804401CD805401ED8062FF4D8073DC48C
-:10002000D8082035D8093035D80A6524D80B2CB229
-:10003000D80C3012D80D1002D80E26E2D80F30227C
-:10004000D8101002D81127D2D8123022D81310029B
-:10005000D8142822D8153012D8161002D817249296
-:10006000D8183022D8191002D81A2772D81B30128B
-:10007000D81C1002D81D23D2D81E3022D81F10023F
-:10008000D82022CDD821301DD82227F2D8233022E3
-:10009000D8241002D8255553D8260307D82725225F
-:1000A000D8283022D8291002D82A2142D82B301241
-:1000B000D82C1002D82D4016D82E5E63D82F0344BA
-:1000C000D8302142D8313012D8321002D833400E05
-:1000D000D8342522D8353022D8361002D8372B52C2
-:1000E000D8383012D8391002D83A2742D83B3022BB
-:1000F000D83C1002D83D25E2D83E3022D83F10022D
-:10010000D8402FA4D8413DC4D8426624D843414B9F
-:10011000D84456B3D84503C6D846866BD847400C5A
-:10012000D8482712D8493012D84A1002D84B2C4B45
-:10013000D84C309BD84D56B3D84E03C3D84F866B9E
-:10014000D850400CD8512272D8523022D8531002C5
-:10015000D8542742D8553022D8561002D85725E215
-:10016000D8583022D8591002D85A2FB4D85B3DC481
-:10017000D85C6624D85D56B3D85E03C3D85F866B5F
-:10018000D860401CD8612C45D8623095D8635B5349
-:10019000D8642372D8653012D86613C2D8675CC39E
-:1001A000D8682712D8693012D86A1312D86B2B522C
-:1001B000D86C3012D86D1002D86E2742D86F30221A
-:1001C000D8701002D8712582D8723022D8731002EC
-:1001D000D8742142D8753012D8761002D877628F41
-:1001E000D8782985D87933A5D87A25E2D87B3022EA
-:1001F000D87C1002D87D5653D87E03D2D87F401EBB
-:10020000D8806F72D8811002D882628FD88323047D
-:10021000D8843C84D8856436D886DFF4D8876436A1
-:10022000D8882FF5D8893005D88A8656D88BDFBA7A
-:10023000D88C56A3D88DD05AD88E2972D88F301228
-:10024000D8901392D891D05AD89256A3D893DFBAA7
-:10025000D8940383D8956F72D8961002D8972B45FF
-:10026000D8983005D8994178D89A5653D89B0384AA
-:10027000D89C2A62D89D3012D89E1002D89F2F0594
-:10028000D8A03005D8A141C8D8A25653D8A303821C
-:10029000D8A40002D8A54218D8A62474D8A73C84B4
-:1002A000D8A86437D8A9DFF4D8AA6437D8AB2FF51B
-:1002B000D8AC3C05D8AD8757D8AEB888D8AF9787AB
-:1002C000D8B0DFF4D8B16724D8B2866AD8B36F72D9
-:1002D000D8B41002D8B52641D8B63021D8B710010D
-:1002E000D8B8C620D8B90000D8BAC621D8BB0000FB
-:1002F000D8BCC622D8BD00CED8BEC623D8BF007F8A
-:10030000D8C0C624D8C10032D8C2C625D8C3000080
-:10031000D8C4C627D8C50000D8C6C628D8C700008C
-:10032000D8C8C62CD8C90000D8CA0000D8CB2641EE
-:10033000D8CC3021D8CD1001D8CEC502D8CF53ACFF
-:10034000D8D0C503D8D12CD3D8D2C600D8D32A6EE2
-:10035000D8D4C601D8D52A2CD8D6C605D8D7555753
-:10036000D8D8C60CD8D95400D8DAC710D8DB0700C3
-:10037000D8DCC711D8DD0F06D8DEC718D8DF0700D4
-:10038000D8E0C719D8E10F06D8E2C720D8E3470064
-:10039000D8E4C721D8E50F06D8E6C728D8E7070074
-:1003A000D8E8C729D8E91207D8EAC801D8EB7F50A6
-:1003B000D8ECC802D8ED7760D8EEC803D8EF7FCE6E
-:1003C000D8F0C804D8F1520ED8F2C805D8F35C11A1
-:1003D000D8F4C806D8F53C51D8F6C807D8F740611C
-:1003E000D8F8C808D8F949C1D8FAC809D8FB3840A4
-:1003F000D8FCC80AD8FD0000D8FEC821D8FF0002EA
-:10040000D900C822D9010046D902C844D903182FFF
-:10041000D904C013D905F341D906C084D9070030E7
-:10042000D908C904D9091401D90ACB0CD90B000485
-:10043000D90CCB0ED90DA00AD90ECB0FD90FC0C045
-:10044000D910CB10D911C0C0D912CB11D91300A02B
-:10045000D914CB12D9150007D916C241D917A0005B
-:10046000D918C243D9197FE0D91AC604D91B000E86
-:10047000D91CC609D91D00F5D91EC611D91F000EF9
-:10048000D920C660D9219600D922C687D923000475
-:10049000D924C60AD92504F5D9260000D927264132
-:1004A000D9283021D9291001D92AC620D92B14E501
-:1004B000D92CC621D92DC53DD92EC622D92F3CBE57
-:1004C000D930C623D9314452D932C624D933C5C50F
-:1004D000D934C625D935E01ED936C627D93700000C
-:1004E000D938C628D9390000D93AC62CD93B0000E2
-:1004F000D93C0000D93D2B84D93E3C74D93F6435AA
-:10050000D940DFF4D9416435D9422806D9433006B1
-:10051000D9448565D9452B24D9463C24D94764362E
-:10052000D9481002D9492B24D94A3C24D94B6436E6
-:10053000D94C4045D94D8656D94E5663D94F030202
-:10054000D950401ED9511002D9522807D95331A78A
-:10055000D95420C4D9553C24D9566724D957100200
-:10056000D9582807D9593187D95A20C4D95B3C2496
-:10057000D95C6724D95D1002D95E24F4D95F3C644C
-:10058000D9606436D961DFF4D9626436D963100268
-:10059000D9642006D9653D76D966C161D9676134D1
-:1005A000D9686135D9695443D96A0303D96B652485
-:1005B000D96C00FBD96D1002D96E20D4D96F3C24C0
-:1005C000D9702025D9713005D9726524D9731002EC
-:1005D000D974D019D9752104D9763C24D97721054D
-:1005E000D9783805D9796524D97ADFF4D97B4005E3
-:1005F000D97C6524D97D2E8DD97E303DD97F2408C4
-:10060000D98035D8D9815DD3D9820307D98388872A
-:10061000D98463A7D9858887D98663A7D987DFFD61
-:10062000D98800F9D9891002D98A0000878C30D97D
-:00000001FF
diff --git a/firmware/cxgb3/t3b_psram-1.1.0.bin.ihex b/firmware/cxgb3/t3b_psram-1.1.0.bin.ihex
deleted file mode 100644
index 140893005171..000000000000
--- a/firmware/cxgb3/t3b_psram-1.1.0.bin.ihex
+++ /dev/null
@@ -1,162 +0,0 @@
-:10000000FFFFFFFC000000000000000300000000F4
-:1000100000010100FFFFFFFC0000000000000003E2
-:100020000000000000000000FFFFFFFC00000000D7
-:10003000000000030000000000000000FFFFFFFCC4
-:1000400000000000000000030000000000000000AD
-:10005000FFFFFFFC000000000000000300000000A4
-:1000600000000000FFFFFFFC000000000000000394
-:100070000000000000000000FFFFFFFC0000000087
-:10008000000000030000000000000000FFFFFFFC74
-:10009000000000000000000300000000000000005D
-:1000A000FFFFFFFC00000000000000030000000054
-:1000B00000000000FFFFFFFC000000000000000344
-:1000C0000000000000000000FFFFFFFC0000000037
-:1000D000000000030000000000000000FFFFFFFC24
-:1000E000000000000000000300000000000000000D
-:1000F000FFFFFFFC00000000000000030000000004
-:1001000000000000FFFFFFFC0000000000000003F3
-:100110000000000000000000FFFFFFFBD03403E6FA
-:1001200080262A430000000000000000FFFFFFF8C7
-:10013000007000000000000200000081C604000002
-:10014000FFFFFFFC000000000000000300000000B3
-:1001500000000000FFFFFFFC0000000000000003A3
-:100160000000000000000000FFFFFFFC0000000096
-:10017000000000030000000000000000FFFFFFFC83
-:10018000000000000000000300000000000000006C
-:10019000FFFFFFFC00000000000000030000000063
-:1001A00000000000FFFFFFFC000000000000000353
-:1001B0000000000000000000FFFFFFFBD03403E25E
-:1001C000802829230000000000000000FFFFFFF846
-:1001D0000600023701C5C00013940481C6057000F3
-:1001E000FFFFFFF88200020637030803000000004B
-:1001F00000000000FFFFFFFC000000000000000204
-:10020000208000818DF40000FFFFFFFC0000000053
-:10021000000000030000000000000000FFFFFFFCE2
-:1002200000000000000000030000000000000000CB
-:10023000FFFFFFFC000000000000000300000000C2
-:1002400000000000FFFFFFFC0000000000000003B2
-:100250000000000000000000FFFFFFF9C4310000B3
-:1002600000282C830000000000000000FFFFFFF0CA
-:100270004E70021D00C5C00000000001C118000042
-:10028000FFFFFFFC00000000000000030000000072
-:1002900000000000FFFFFFFC000000000000000362
-:1002A0000000000000000000FFFFFFFC0000000055
-:1002B000000000030000000000000000FFFFFFFC42
-:1002C000000000000000000300000000000000002B
-:1002D000FFFFFFFC00000000000000030000000022
-:1002E00000000000FFFFFFFC000000000000000312
-:1002F0000000000000000000FFFFFFF1C00003E667
-:10030000802828230000000000000000FFFFFFFC01
-:1003100000000000000000021394040000017000BF
-:10032000FFFFFFFC000000000000000300000000D1
-:1003300000000000FFFFFFFC0000000000000003C1
-:100340000000000000000000FFFFFFFC00000000B4
-:10035000000000030000000000000000FFFFFFFCA1
-:10036000000000000000000300000000000000008A
-:10037000FFFFFFFC00000000000000030000000081
-:1003800000000000FFFFFFFC000000000000000371
-:100390000000000000000000FFFFFFFA103400041E
-:1003A000000001030000000000000000FFFFFFF05C
-:1003B0006000000620030802700000F080259A907B
-:1003C000FFFFFFFC00000000000000030000000031
-:1003D00000000000FFFFFFFC000000000000000321
-:1003E0000000000000000000FFFFFFFC0000000014
-:1003F000000000030000000000000000FFFFFFFC01
-:1004000000000000000000030000000000000000E9
-:10041000FFFFFFF1C83102060A000242000000811E
-:1004200080000000FFFFFFF9C83103C60A962A4288
-:100430000000008180000000FFFFFFF00431000495
-:10044000000004030000000000000000FFFFFFF0B8
-:1004500020B000000000000213940401C1197000D4
-:10046000FFFFFFFC00000000000000000000000192
-:1004700000001000FFFFFFFC000000000000000370
-:100480000000000000000000FFFFFFFC0000000073
-:10049000000000030000000000000000FFFFFFFC60
-:1004A0000000000000000003000000000000000049
-:1004B000FFFFFFF00000000400004000680C200176
-:1004C00000001090FFFFFFF9C031C3E600266A402C
-:1004D0000000000100001000FFFFFFFA10F4000010
-:1004E000000002430000000000000000FFFFFFF8D2
-:1004F0006050080000000000700C20F080259A90E9
-:10050000FFFFFFF0060000000100400000000001B6
-:1005100000001000FFFFFFFC0000000000000002D0
-:10052000288C108085C01000FFFFFFFC0000000039
-:10053000000000030000000000000000FFFFFFFCBF
-:1005400000000000000000030000000000000000A8
-:10055000FFFFFFFC0000000000000003000000009F
-:1005600000000000FFFFFFFC00000000000000038F
-:100570000000000000000000FFFFFFF04E00000040
-:10058000000000030000000000000000FFFFFFF17A
-:10059000C00002DE00061A40000000829035C00054
-:1005A000FFFFFFFC0000000000000003000000004F
-:1005B00000000000FFFFFFFC00000000000000033F
-:1005C0000000000000000000FFFFFFFC0000000032
-:1005D000000000030000000000000000FFFFFFFC1F
-:1005E0000000000000000003000000000000000008
-:1005F000FFFFFFFC000000000000000300000000FF
-:1006000000000000FFFFFFF1CA31C3C20A966A432F
-:100610000000000000000000FFFFFFF84E501439FA
-:100620001CC5C0030000000000000000FFFFFFF039
-:100630000000000000000002288C108085C010001F
-:10064000FFFFFFFC000000000000000300000000AE
-:1006500000000000FFFFFFFC00000000000000039E
-:100660000000000000000000FFFFFFFC0000000091
-:10067000000000030000000000000000FFFFFFFC7E
-:100680000000000000000003000000000000000067
-:10069000FFFFFFFC0000000000000003000000005E
-:1006A00000000000FFFFFFF3CA3323D60E966A4313
-:1006B0000000000000000000FFFFFFF8000004063B
-:1006C00020D002430000000000000000FFFFFFF800
-:1006D00000D0000000000000000000839031C00046
-:1006E000FFFFFFFC0000000000000003000000000E
-:1006F00000000000FFFFFFFC0000000000000003FE
-:100700000000000000000000FFFFFFFC00000000F0
-:10071000000000030000000000000000FFFFFFFCDD
-:1007200000000000000000030000000000000000C6
-:10073000FFFFFFFC000000000000000300000000BD
-:1007400000000000FFFFFFF3CA33E3D60E966A43B2
-:100750000000000000000000FFFFFFF000501A1032
-:10076000003002430000000000000000FFFFFFF81F
-:100770000000020620030800700000F990118A9022
-:10078000FFFFFFFC0000000000000003000000006D
-:1007900000000000FFFFFFFC00000000000000035D
-:1007A0000000000000000000FFFFFFFC0000000050
-:1007B000000000030000000000000000FFFFFFFC3D
-:1007C0000000000000000003000000000000000026
-:1007D000FFFFFFFC0000000000000003000000001D
-:1007E00000000000FFFFFFFC00000000000000030D
-:1007F0000000000000000000FFFFFFF9C0501BA632
-:1008000000D202430000000000000000FFFFFFF0E4
-:100810004000020700100002700000E890344A9087
-:10082000FFFFFFFC000000000000000300000000CC
-:1008300000000000FFFFFFFC0000000000000003BC
-:100840000000000000000000FFFFFFFC00000000AF
-:10085000000000030000000000000000FFFFFFFC9C
-:100860000000000000000003000000000000000085
-:10087000FFFFFFFC0000000000000003000000007C
-:1008800000000000FFFFFFFC00000000000000036C
-:100890000000000000000000FFFFFFFA10F4020853
-:1008A00000C002430000000000000000FFFFFFF056
-:1008B0000000000000000000728CC8D893891090DE
-:1008C000FFFFFFF082900000030000030000000023
-:1008D00000000000FFFFFFFC00000000000000031C
-:1008E0000000000000000000FFFFFFFC000000000F
-:1008F000000000030000000000000000FFFFFFFCFC
-:1009000000000000000000030000000000000000E4
-:10091000FFFFFFFC000000000000000300000000DB
-:1009200000000000FFFFFFFC0000000000000003CB
-:100930000000000000000000FFFFFFF000000000CA
-:10094000000000030000000000000000FFFFFFF2B5
-:1009500000000320002612430000000000000000F9
-:10096000FFFFFFF040000203101000030000000032
-:1009700000000000FFFFFFFC00000000000000037B
-:100980000000000000000000FFFFFFFC000000006E
-:10099000000000030000000000000000FFFFFFFC5B
-:1009A0000000000000000003000000000000000044
-:1009B000FFFFFFFC0000000000000003000000003B
-:1009C00000000000FFFFFFFC00000000000000032B
-:1009D0000000000000000000FFFFFFF1D03403E63C
-:1009E00080262A430000000000000000FFFFFFF205
-:1009F0000834023000C005030000000000000000C1
-:040A000070EAA57F74
-:00000001FF
diff --git a/firmware/cxgb3/t3c_psram-1.1.0.bin.ihex b/firmware/cxgb3/t3c_psram-1.1.0.bin.ihex
deleted file mode 100644
index c6504803852f..000000000000
--- a/firmware/cxgb3/t3c_psram-1.1.0.bin.ihex
+++ /dev/null
@@ -1,162 +0,0 @@
-:10000000FFFFFFF4000000040000000100000001F9
-:1000100000010100FFFFFFF40000000400000001E8
-:100020000000000100000000FFFFFFF400000004DA
-:10003000000000010000000100000000FFFFFFF4CD
-:1000400000000004000000010000000100000000AA
-:10005000FFFFFFF4000000040000000100000001A9
-:1000600000000000FFFFFFF400000004000000019A
-:100070000000000100000000FFFFFFF4000000048A
-:10008000000000010000000100000000FFFFFFF47D
-:10009000000000040000000100000001000000005A
-:1000A000FFFFFFF400000004000000010000000159
-:1000B00000000000FFFFFFF400000004000000014A
-:1000C0000000000100000000FFFFFFF4000000043A
-:1000D000000000010000000100000000FFFFFFF42D
-:1000E000000000040000000100000001000000000A
-:1000F000FFFFFFF400000004000000010000000109
-:1001000000000000FFFFFFF40000000400000001F9
-:100110000000000100000000FFFFFFF3D03403E205
-:1001200080262A410000000100000000FFFFFFF8C8
-:10013000007000000000000000000080C604000005
-:10014000FFFFFFF4000000040000000100000001B8
-:1001500000000000FFFFFFF40000000400000001A9
-:100160000000000100000000FFFFFFF40000000499
-:10017000000000010000000100000000FFFFFFF48C
-:100180000000000400000001000000010000000069
-:10019000FFFFFFF400000004000000010000000168
-:1001A00000000000FFFFFFF4000000040000000159
-:1001B0000000000100000000FFFFFFFBD03403E25D
-:1001C000802829210000000100000000FFFFFFF847
-:1001D0000600023701C5C00213940480C6057000F2
-:1001E000FFFFFFF88200020637030801000000014C
-:1001F00000000000FFFFFFF400000004000000000A
-:10020000208000808DF40000FFFFFFF40000000458
-:10021000000000010000000100000000FFFFFFF4EB
-:1002200000000004000000010000000100000000C8
-:10023000FFFFFFF4000000040000000100000001C7
-:1002400000000000FFFFFFF40000000400000001B8
-:100250000000000100000000FFFFFFF9C4310000B2
-:1002600000282C810000000100000000FFFFFFF0CB
-:100270004E70021D00C5C00200000000C118000041
-:10028000FFFFFFF400000004000000010000000177
-:1002900000000000FFFFFFF4000000040000000168
-:1002A0000000000100000000FFFFFFF40000000458
-:1002B000000000010000000100000000FFFFFFF44B
-:1002C0000000000400000001000000010000000028
-:1002D000FFFFFFF400000004000000010000000127
-:1002E00000000000FFFFFFF4000000040000000118
-:1002F0000000000100000000FFFFFFF1C00003E666
-:10030000802828210000000100000000FFFFFFF40A
-:1003100000000004000000021394040000017000BB
-:10032000FFFFFFF4000000040000000100000001D6
-:1003300000000000FFFFFFF40000000400000001C7
-:100340000000000100000000FFFFFFF400000004B7
-:10035000000000010000000100000000FFFFFFF4AA
-:100360000000000400000001000000010000000087
-:10037000FFFFFFF400000004000000010000000186
-:1003800000000000FFFFFFF4000000040000000177
-:100390000000000100000000FFFFFFFA103400041D
-:1003A000000001010000000100000000FFFFFFF05D
-:1003B0006000000620030802700000F080259A907B
-:1003C000FFFFFFF400000004000000010000000136
-:1003D00000000000FFFFFFF4000000040000000127
-:1003E0000000000100000000FFFFFFF40000000417
-:1003F000000000010000000100000000FFFFFFF40A
-:1004000000000004000000010000000100000000E6
-:10041000FFFFFFF9C83102020A000242000000811A
-:1004200080000000FFFFFFF1C83103C20A962A4294
-:100430000000008180000000FFFFFFF00431000495
-:10044000000004010000000100000000FFFFFFF8B1
-:1004500020B000040000000013940400C1197000D3
-:10046000FFFFFFF400000004000000020000000095
-:1004700000001000FFFFFFF4000000040000000176
-:100480000000000100000000FFFFFFF40000000476
-:10049000000000010000000100000000FFFFFFF469
-:1004A0000000000400000001000000010000000046
-:1004B000FFFFFFF80000000000004000680C200172
-:1004C00000001090FFFFFFF9C031C3E600266A422A
-:1004D0000000000000001000FFFFFFF210F4000415
-:1004E000000002410000000100000000FFFFFFF0DB
-:1004F0006050080400000002700C20F180259A90E2
-:10050000FFFFFFF8060000040100400200000000A9
-:1005100000001000FFFFFFF40000000400000002D4
-:10052000288C108085C01000FFFFFFF4000000043D
-:10053000000000010000000100000000FFFFFFF4C8
-:1005400000000004000000010000000100000000A5
-:10055000FFFFFFF4000000040000000100000001A4
-:1005600000000000FFFFFFF4000000040000000195
-:100570000000000100000000FFFFFFF04E0000003F
-:10058000000000010000000100000000FFFFFFF973
-:10059000C00002DA00061A42000000839035C00055
-:1005A000FFFFFFF400000004000000010000000154
-:1005B00000000000FFFFFFF4000000040000000145
-:1005C0000000000100000000FFFFFFF40000000435
-:1005D000000000010000000100000000FFFFFFF428
-:1005E0000000000400000001000000010000000005
-:1005F000FFFFFFF400000004000000010000000104
-:1006000000000000FFFFFFF9CA31C3C60A966A4125
-:100610000000000100000000FFFFFFF84E501439F9
-:100620001CC5C0010000000100000000FFFFFFF03A
-:100630000000000000000002288C108085C010001F
-:10064000FFFFFFF4000000040000000100000001B3
-:1006500000000000FFFFFFF40000000400000001A4
-:100660000000000100000000FFFFFFF40000000494
-:10067000000000010000000100000000FFFFFFF487
-:100680000000000400000001000000010000000064
-:10069000FFFFFFF400000004000000010000000163
-:1006A00000000000FFFFFFF3CA3323D60E966A4115
-:1006B0000000000100000000FFFFFFF8000004063A
-:1006C00020D002410000000100000000FFFFFFF801
-:1006D00000D0000000000000000000839031C00046
-:1006E000FFFFFFF400000004000000010000000113
-:1006F00000000000FFFFFFF4000000040000000104
-:100700000000000100000000FFFFFFF400000004F3
-:10071000000000010000000100000000FFFFFFF4E6
-:1007200000000004000000010000000100000000C3
-:10073000FFFFFFF4000000040000000100000001C2
-:1007400000000000FFFFFFFBCA33E3D20E966A41B0
-:100750000000000100000000FFFFFFF000501A1031
-:10076000003002410000000100000000FFFFFFF028
-:100770000000020220030800700000F990118A9026
-:10078000FFFFFFF400000004000000010000000172
-:1007900000000000FFFFFFF4000000040000000163
-:1007A0000000000100000000FFFFFFF40000000453
-:1007B000000000010000000100000000FFFFFFF446
-:1007C0000000000400000001000000010000000023
-:1007D000FFFFFFF400000004000000010000000122
-:1007E00000000000FFFFFFF4000000040000000113
-:1007F0000000000100000000FFFFFFF1C0501BA23D
-:1008000000D202410000000100000000FFFFFFF8DD
-:100810004000020300100002700000E890344A908B
-:10082000FFFFFFF4000000040000000100000001D1
-:1008300000000000FFFFFFF40000000400000001C2
-:100840000000000100000000FFFFFFF400000004B2
-:10085000000000010000000100000000FFFFFFF4A5
-:100860000000000400000001000000010000000082
-:10087000FFFFFFF400000004000000010000000181
-:1008800000000000FFFFFFF4000000040000000172
-:100890000000000100000000FFFFFFFA10F4020852
-:1008A00000C002410000000100000000FFFFFFF057
-:1008B0000000000000000002728CC8D993891090DB
-:1008C000FFFFFFF082900000030000010000000124
-:1008D00000000000FFFFFFF4000000040000000122
-:1008E0000000000100000000FFFFFFF40000000412
-:1008F000000000010000000100000000FFFFFFF405
-:1009000000000004000000010000000100000000E1
-:10091000FFFFFFF4000000040000000100000001E0
-:1009200000000000FFFFFFF40000000400000001D1
-:100930000000000100000000FFFFFFF000000000C9
-:10094000000000010000000100000000FFFFFFF2B6
-:1009500000000320002612410000000100000000FA
-:10096000FFFFFFF040000203101000010000000133
-:1009700000000000FFFFFFF4000000040000000181
-:100980000000000100000000FFFFFFF40000000471
-:10099000000000010000000100000000FFFFFFF464
-:1009A0000000000400000001000000010000000041
-:1009B000FFFFFFF400000004000000010000000140
-:1009C00000000000FFFFFFF4000000040000000131
-:1009D0000000000100000000FFFFFFF9D03403E237
-:1009E00080262A410000000100000000FFFFFFF206
-:1009F0000834023000C005010000000100000000C2
-:040A000070EAA741B0
-:00000001FF
diff --git a/firmware/dsp56k/bootstrap.asm b/firmware/dsp56k/bootstrap.asm
deleted file mode 100644
index a411047e6db3..000000000000
--- a/firmware/dsp56k/bootstrap.asm
+++ /dev/null
@@ -1,98 +0,0 @@
-; Author: Frederik Noring <[email protected]>
-;
-; This file is subject to the terms and conditions of the GNU General Public
-; License. See the file COPYING in the main directory of this archive
-; for more details.
-
-; DSP56k loader
-
-; Host Interface
-M_BCR EQU $FFFE ; Port A Bus Control Register
-M_PBC EQU $FFE0 ; Port B Control Register
-M_PBDDR EQU $FFE2 ; Port B Data Direction Register
-M_PBD EQU $FFE4 ; Port B Data Register
-M_PCC EQU $FFE1 ; Port C Control Register
-M_PCDDR EQU $FFE3 ; Port C Data Direction Register
-M_PCD EQU $FFE5 ; Port C Data Register
-
-M_HCR EQU $FFE8 ; Host Control Register
-M_HSR EQU $FFE9 ; Host Status Register
-M_HRX EQU $FFEB ; Host Receive Data Register
-M_HTX EQU $FFEB ; Host Transmit Data Register
-
-; SSI, Synchronous Serial Interface
-M_RX EQU $FFEF ; Serial Receive Data Register
-M_TX EQU $FFEF ; Serial Transmit Data Register
-M_CRA EQU $FFEC ; SSI Control Register A
-M_CRB EQU $FFED ; SSI Control Register B
-M_SR EQU $FFEE ; SSI Status Register
-M_TSR EQU $FFEE ; SSI Time Slot Register
-
-; Exception Processing
-M_IPR EQU $FFFF ; Interrupt Priority Register
-
- org P:$0
-start jmp <$40
-
- org P:$40
-; ; Zero 16384 DSP X and Y words
-; clr A #0,r0
-; clr B #0,r4
-; do #64,<_block1
-; rep #256
-; move A,X:(r0)+ B,Y:(r4)+
-;_block1 ; Zero (32768-512) Program words
-; clr A #512,r0
-; do #126,<_block2
-; rep #256
-; move A,P:(r0)+
-;_block2
-
- ; Copy DSP program control
- move #real,r0
- move #upload,r1
- do #upload_end-upload,_copy
- movem P:(r0)+,x0
- movem x0,P:(r1)+
-_copy movep #4,X:<<M_HCR
- movep #$c00,X:<<M_IPR
- and #<$fe,mr
- jmp upload
-
-real
- org P:$7ea9
-upload
- movep #1,X:<<M_PBC
- movep #0,X:<<M_BCR
-
-next jclr #0,X:<<M_HSR,*
- movep X:<<M_HRX,A
- move #>3,x0
- cmp x0,A #>1,x0
- jeq <$0
-_get_address
- jclr #0,X:<<M_HSR,_get_address
- movep X:<<M_HRX,r0
-_get_length
- jclr #0,X:<<M_HSR,_get_length
- movep X:<<M_HRX,y0
- cmp x0,A #>2,x0
- jeq load_X
- cmp x0,A
- jeq load_Y
-
-load_P do y0,_load_P
- jclr #0,X:<<M_HSR,*
- movep X:<<M_HRX,P:(r0)+
-_load_P jmp next
-load_X do y0,_load_X
- jclr #0,X:<<M_HSR,*
- movep X:<<M_HRX,X:(r0)+
-_load_X jmp next
-load_Y do y0,_load_Y
- jclr #0,X:<<M_HSR,*
- movep X:<<M_HRX,Y:(r0)+
-_load_Y jmp next
-
-upload_end
- end
diff --git a/firmware/dsp56k/bootstrap.bin.ihex b/firmware/dsp56k/bootstrap.bin.ihex
deleted file mode 100644
index 233f21fe72b0..000000000000
--- a/firmware/dsp56k/bootstrap.bin.ihex
+++ /dev/null
@@ -1,26 +0,0 @@
-:100000000C004000000000000000000000000000A4
-:1000100000000000000000000000000000000000E0
-:1000200000000000000000000000000000000000D0
-:1000300000000000000000000000000000000000C0
-:1000400000000000000000000000000000000000B0
-:1000500000000000000000000000000000000000A0
-:100060000000000000000000000000000000000090
-:100070000000000000000000000000000000000080
-:100080000000000000000000000000000000000070
-:100090000000000000000000000000000000000060
-:1000A0000000000000000000000000000000000050
-:1000B0000000000000000000000000000000000040
-:1000C00060F40000004F61F400007EA9062E80005D
-:1000D000004707D88407598408F4A800000408F4EE
-:1000E000BF000C0000FEB80AF080007EA908F4A052
-:1000F00000000108F4BE0000000AA980007EAD08DF
-:100100004E2B44F40000000344F4450000010EA00F
-:10011000000AA980007EB508502B0AA980007EB88D
-:1001200008462B44F4450000020AF0AA007EC920CC
-:1001300000450AF0AA007ED006C600007EC60AA9C5
-:1001400080007EC408586B0AF080007EAD06C600B1
-:10015000007ECD0AA980007ECB0858AB0AF0800053
-:100160007EAD06C600007ED40AA980007ED2085863
-:07017000EB0AF080007EADF8
-:00000001FF
-/* DSP56001 bootstrap code */
diff --git a/firmware/e100/d101m_ucode.bin.ihex b/firmware/e100/d101m_ucode.bin.ihex
deleted file mode 100644
index 12971ed458a6..000000000000
--- a/firmware/e100/d101m_ucode.bin.ihex
+++ /dev/null
@@ -1,38 +0,0 @@
-:10000000150255003704FFFFFFFFFFFF8907A70612
-:10001000FFFFFFFFFFFF580501000C001213100047
-:1000200008000C00160238009C001000564020000A
-:10003000CC802300560038009C0010000B4C24009C
-:1000400000080000184812003804380000000000C2
-:1000500000001400550538000080300062061000D2
-:100060006105100008040E006148130002000C0036
-:10007000933010000080300024061000610510004D
-:1000800008040E00610810007E000C00212C2200E4
-:1000900002000C00933010007A0C380000000800B9
-:1000A000903010007A0C38000000000000000000C2
-:1000B00000000000000000009C0010002D4C2400F7
-:1000C000040001000010040037043A00104004004E
-:1000D0008A07380000000000990010007A6C2000A8
-:1000E0009C001000484C24002408130001000C0060
-:1000F00013121000750C260000100400040001000B
-:100100002608130006000C00A806220026C91300CA
-:1001100013131000A80638000000000000000000C3
-:1001200000000000000000000000000000000000CF
-:10013000000000000000000000060800101B100076
-:10014000040005002608100010121000340C3800BE
-:1001500000000000000000005B1521009900100065
-:10016000596520009C0010005945240036081300F2
-:1001700000000C00620C220001000C00131B100098
-:100180000E9C22000E0C21000E6C22000E6C210031
-:100190000EFC22000E5C21000E4C2100550538009B
-:1001A0000400010000100400678C27000008040010
-:1001B0000081010037043A002608130001000C00FA
-:1001C00059052200131310005905380000000000E3
-:1001D000000000000000000000000000000000001F
-:1001E00000000000000000000000000031081300C3
-:1001F0000B0910001348120080FF0C00AB0626000C
-:100200000010040004000100A806380000000000EF
-:0B02100000000000000000004E417ED6
-:00000001FF
-/********************************************************/
-/* Micro code for 8086:1229 Rev 8 */
-/********************************************************/
diff --git a/firmware/e100/d101s_ucode.bin.ihex b/firmware/e100/d101s_ucode.bin.ihex
deleted file mode 100644
index 102c7feb666e..000000000000
--- a/firmware/e100/d101s_ucode.bin.ihex
+++ /dev/null
@@ -1,38 +0,0 @@
-:10000000420255007E04FFFFFFFFFFFF1808FF06B6
-:10001000FFFFFFFFFFFFA60501000C0012131000F9
-:1000200008000C00430238009C00100056402000DD
-:10003000D0802300560038009C0010008B4F240015
-:1000400000080000184812007F043800000000007B
-:1000500000001400A30538000080300010061000D6
-:100060006105100008040E006148130002000C0036
-:10007000933010000080300024061000610510004D
-:1000800008040E00610810007E000C00A12F220061
-:1000900002000C0093301000900F380000000800A0
-:1000A00090301000900F38000000000000000000A9
-:1000B00000000000000000009C001000AD4F240074
-:1000C00004000100001004007E043A001040040007
-:1000D000190838000000000099001000FD6F200092
-:1000E0009A001000FDAF20009C001000C84F2400B3
-:1000F0002408130001000C0013121000F70F260053
-:1001000000100400040001002608130006000C0083
-:100110000007220026C9130013131000000738003F
-:1001200000000000000000000000000000000000CF
-:10013000000000000000000000060800101B100076
-:10014000040005002608100010121000B60F380039
-:100150000000000000000000A91521009900100017
-:10016000A76520009A001000A7A520009C001000A1
-:10017000A74524003608130000000C00E40F2200FD
-:1001800001000C00131B10008E9F22008E0F210017
-:100190008E6F22008E6F21008EFF22008E5F210065
-:1001A0008E4F2100A3053800040001000010040058
-:1001B000E98F270000080400008101007E043A0056
-:1001C0002608130001000C00A705220013131000DD
-:1001D000A70538000000000000000000000000003B
-:1001E000000000000000000000000000000000000F
-:1001F00000000000310813000B0910001348120022
-:1002000080FF0C000307260000100400040001001A
-:0B02100000073800000000004E438093
-:00000001FF
-/********************************************************/
-/* Micro code for 8086:1229 Rev 9 */
-/********************************************************/
diff --git a/firmware/e100/d102e_ucode.bin.ihex b/firmware/e100/d102e_ucode.bin.ihex
deleted file mode 100644
index 9e806da854de..000000000000
--- a/firmware/e100/d102e_ucode.bin.ihex
+++ /dev/null
@@ -1,38 +0,0 @@
-:100000008F027D00F904420E850CED14E914FA14F8
-:10001000360EF70EFF1FFF1FB914E00000000000AE
-:100020000000000000000000BD14E000000000001F
-:100030000000000000000000D514E00000000000F7
-:1000400000000000000000000000000000000000B0
-:100050000000000000000000C114E00000000000EB
-:100060000000000000000000000000000000000090
-:100070000000000000000000000000000000000080
-:100080000000000000000000000000000000000070
-:100090000000000000000000C814E00000000000A4
-:1000A000000000000000000000062000EE14E00048
-:1000B000000000000000000080FF3000460E9400A9
-:1000C0000082030000201000430EE000000000004A
-:1000D000000000000000000006003000FB14E000FB
-:1000E0000000000000000000000000000000000010
-:1000F0000000000000000000000000000000000000
-:1001000000000000000000000000000000000000EF
-:100110000000000000000000416E90003C0E8000D6
-:10012000390EE00000000000FD6E9000FD0E900012
-:10013000F80EE000000000000000000000000000D9
-:1001400000000000000000000000000000000000AF
-:10015000000000000000000000000000000000009F
-:10016000000000000000000000000000000000008F
-:10017000000000000000000000000000000000007F
-:10018000000000000000000000000000000000006F
-:10019000000000000000000000000000000000005F
-:1001A000000000000000000000000000000000004F
-:1001B000000000000000000000000000000000003F
-:1001C000000000000000000000000000000000002F
-:1001D000000000000000000000000000000000001F
-:1001E000000000000000000000000000000000000F
-:1001F00000000000000000000000000000000000FF
-:1002000000000000000000000000000000000000EE
-:0B02100000000000000000002A362E55
-:00000001FF
-/********************************************************/
-/* Micro code for the 8086:1229 Rev F/10 */
-/********************************************************/
diff --git a/firmware/edgeport/boot.H16 b/firmware/edgeport/boot.H16
deleted file mode 100644
index 4bf8e91a975a..000000000000
--- a/firmware/edgeport/boot.H16
+++ /dev/null
@@ -1,29 +0,0 @@
-:0004000000010C0002ED
-:000200000400FFFB
-:000600000002008002000373
-:0003000B0002000BE5
-:00030013000201B82F
-:0003001B0002001BC5
-:0003002300020023B5
-:0003002B0002002BA5
-:000300330002003395
-:0003003B0002003B85
-:00030043000201BDFA
-:0003004B000201D0DF
-:000300530002012186
-:0003007B0002007B05
-:01660080007EB0007AB33FF27EF800237E00017E100012075F6920000ABE240000780575900D800375901DD2B57E0000A5D8FD75A80075B100A9D587CA291209CC1209A0F5097AA1201201E6DA29A9D0C77E00057A01F175E110A9D7F4A9D7E4A5D8F175F10075E13F75A20375A30075C00075C100A9D1B1A9D0B1A9D5D3D2AFE47E0428008DEF1B0478FA04A934D30330E0EEBE240000780563903080E3B29580DFBEB00222C0D0A920DF0FA931DF030201B575080112083380FE7508FE12083375A8007EB33FF230E04B300146C2927E2480007E1109740819B20010740E19B200042E240100A5D9ED7E2480007E1109E4D5E0FD09B2000820E00A09B2000009B2001880EB2E240100A5D9E4439030D2AA8005D2AA439034D2AFA9D1870000000000A911DF03A9D2DF7508FF120833C0D1CA02FFCA06830032D0D032C28BC2AA32750808120833A9C0B1A9C5D3A9C6D3A9D2B132CAB8750802120833E5C0540368051201EE80F5DAB832AE
-:00011BCA00001A
-:064D01E600E47AB33FF1020263CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEBC0F17EB3012BB400028019B4011630C00875F10012024D801F30C11C75F1001202DE801430C10875F1001202DE800930C00675F10012024DD0F1DAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B22C2C07EB3012BB4020712026F02026322B401FC0202A97E00007A03012B7A03012C227EB3012354606005B4401580137EB30124B4050C7508711208337EB30126F58F2275F60022BE57012928047E5701297A0F012E7A5701320202A97EEF012E7EF701327E0701324D0068217E00007EEBB0F5F3A3A5081BF46804A5B808F07AEF012E7AF701327508061208337A01F622C2C1750803120833A936E216E5F554C06807A9D7F4A927F4FC53E13F43F2880203557EB3012CB4020FA9D4E47EB0007AB3012C7AB3012B22B401397E21E67C327E13012D2C217A23012D7E00002E040134E5E37A09B00B04A5DBF6A9D4E47508701208337EB3012D7EA3012ABCAB78031203EC22020755E5E6B40865A9C4E27E01E37E11E37E31E37E21E37E51E37E41E37E71E37E61E37A0F01237A1F01277508041208337A01081208337A11081208337A21081208337A31081208337A41081208337A51081208337A61081208337A7108120833A9D4E4A9D7F4A9C6E21203C0226D007E1401027A0701327A03012D7EB3012320E70F7A23012C7A33012BBE0701296809227A33012C7A23012B7EB3012354E3232330E002D2E530E702D2E430E50630E403020755543EF5F003541FC325F09004187584FF7302056C0204600206090206240205050204C602063D02063D0206400206400206400206400206400206400206400206400206460206FA0206430206430206430206430206430206437EB30124B4062A7EB3012560567C0B7E1301267E1701277508721208337A01081208337A110812083312075F4035020294B408107508741208337EB33FF1F5F375F60122B4001C7508751208337EB33FF230E00575F302800375F30075F30075F602220207557EB30124B400357508761208337EB30128540FF5F17EB3012820E709E5E130E70D7401800BE5E130E60474018002740053F180F5F375F30075F60222020755C0F17EB30128540F42F17EB30126B400457EB30124B401247508771208337EB30128540F780553E13F80377EB3012820E70553E17F802B53E1BF8026B403177508781208337EB3012820E70543E180801143E140800C43E1C0D0F175080712083322D0F10202907EB30124B409237508791208337EB30126BEB33FF16811CAB8C0F112011DD0F1DAB850767AB33FF1806DB4050875087A1208338062B4031975087B1208337EB30126B401557EB33FF244017AB33FF28046B4011975087C1208337EB30126B401397EB33FF254FE7AB33FF2802AB4072A7EB3012560247C0B7E1301267E1701277508731208337A01081208337A110812083312078B40030202900207557EB30124B40BF675087D1208337EB301267EA301284CAB78E480DF7EB30124B40ADB75087E1208337EB3012670CFF5F375F601220207550207550207557EB30124B404207508C31208337E0400017E1701257E1801347A1C00007E47012912083F0206F4B4063A7508C11208337E5800007A5C00FE7DCA7ED701257E7801347A7C00007E7701297508C1120833C0A8C087C2AFA9D5871208D6D087D0A8404F804AB4001CC2AFA9D587120290E48DEF8DEF8DEFD5E0F7C0D1CA02FFCA06000032B409127E5701254D556805A9D2B18003A9C2B18016B40716C2AF7E0701277E170125C0D1CA18CA38CA28320202900207557EB30124B403157508C21208337E0400017E1701257E570129020294B405397508C0120833C0A8C087C2AFA9D5877E0801347A0C00007E2400FE7E3701257E47012912083FD087D0A87E0801347A0C00007E57012902029402075575080712083343E1C022C0A8C087C2AFA9D5871207CA40197E0801347A0C0000CA0BCA4912083FDA59DA0BD087D0A8C322D087D0A822C0A8C087C2AFA9D5871207CA402B7E5800007A5C00FE7F617E7801347A7C00007E770129BD7478117508C11208331208D64006D087D0A8C322D087D0A8D3227E2400FE7E347FCA0B1A50C5F07D627D757D877E347F037E1BB0BC0B50493E003E000A502D750B3A3069530002BD3850022D38BC1B50303E103E100A512D35694100020B1A30BD3850022D38BE44FFFF78057E1B900A494D44680CBE4400FF28047E4400FFC322D32234
-:00407FC00040010200CA1B010C0200007C0000010000000000000000000000000000000000000000000000000000000000000000000000000000000000F17F0000000000005D
-:1397083300CA087E01087A033FF0DA082280500B1A600B350B1A700B350B1A800B350B1A900B350B1AA00B350B1AB00B350B1AC00B350B1AD00B351B0A600B151B0A700B151B0A800B151B0A900B151B0AA00B151B0AB00B151B0AC00B151B0AD00B159E44001050AA2E440010680E7E1BC07A0BC00B140B341B4478F2227F6F7FF01BFC7C547D328008CA1BCA1BCA1BCA1B9E44001050F22E4400106806CA481B4478FA7FF689E4CA6B5ED4003F68207E8400409D8DDA6BBD873816CA797D78120900DA7940089D7868028005C2D722DA6B43903074AA39B55555745539B52AAA74A039B555557E0400409D7050062D707D076D777C317E7B007A6B000B7C0B6CA5D9F37F161B1C7E5427107E1B10BC1068061B5478F5802C6D007C207F169F107F279F207E2B007E1B10BC0178160B2C0B1CA5DBEF7CB620E0036390304D777893C2D722D2D7220004000400000604020400020104010200000000000000000202020202040008100210040208000101087E187FBD7A1C00FF0B1A00BE1014381A0A51237E1809767A1C00FF2D350B1A506008A5B802034EA0082280FE7EE87FBF7AEC00FFE0F52254C068167EE87FBE7AEC00FFE0600C1209A0F5097AA120020F0A22C295D2941219FB5390CF1219FB80F10D0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0D0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A45646765706F72742F34202D20486172647761726520446961676E6F73746963732C2052657620312E30303B20436F70797269676874203139393820496E73696465204F7574204E6574776F726B730D0A0050617373004641494C202121005061737320202020004641494C20212120000D0A4465746563742052616D3A2020202020202020202020202020202020202020000D0A52616D20546573743A20202020202020202020202020202020202020202020000D0A416464726573732062697420302D313420746573743A202020202020202020000D0A57726F746520416464726573733A2030303A0020207769746820646174613A20002C20616E6420726561643A20000D0A4F6E65206F7220626F7468206F662074686520666F6C6C6F77696E6720416464726573732062697473206C6973746564206172652073686F727465640D0A746F20736F6D657468696E673A200020616E6420000D0A44657465637420556172743A20202020202020202020202020202020202020000D0A53637261746368205061642C4669466F20456E61626C652026205253543A20000D0A0A202020556172742054657374732020202020202020202020202020202020202020506F727431202020506F727432202020506F727433202020506F7274340D0A2020202020202020202020202020202020202020202020202020202020202020202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D000D0A506F7274204465636F6465723A2020202020202020202020202020202020202020000D0A4469676974616C204C6F6F706261636B3A20202020202020202020202020202020000D0A416E616C6F67204C6F6F706261636B3A2020202020202020202020202020202020000D0A5258442C54584420746F205254532C4354532C52492053686F72743A2020202020000D0A5258442C54584420746F204454522C4453522C43442053686F72743A2020202020000D0A5254535B4354532C52495D20746F204454522C4453522C43442053686F72743A20000D0A5254535B4354532C43445D20746F204453522C52492053686F72743A2020202020000D0A4454525B4453522C43445D20746F205254532C4354532C52492053686F72743A20000D0A44545220746F204354532C43442053686F72743A20202020202020202020202020000D0A52545320746F204354532C5249204C6F6F706261636B3A20202020202020202020000D0A52545320746F204354532C4344204C6F6F706261636B3A20202020202020202020000D0A44545220746F204453522C4344204C6F6F706261636B3A20202020202020202020000D0A0A2020204520522052204F2052202121212C204520522052204F205220212121202C204520522052204F2052202121210D0A0A446961676E6F7374696373206E6F772077696C6C20656E7465722061206465627567206C6F6F70206F6620746865206669727374206465746563746564206572726F722E000D0A0A4E6F204861726477617265206572726F72732064657465637465642E0D0A00436F7079696E6720636F64652066726F6D204D617374657220746F20536C617665277320454570726F6D202E2E2E00446F6E650D0A0A2D3E205475726E20756E6974206F66662C20646973636F6E6E656374206361626C6520616E642072756E207374616E64616C6F6E6520646961676E6F73746963732E00C2AFC209C20A75900D201702D2B54390306C007E1003120F387E680A017A6C00FF121A930B0030B4028024021B3C20091DC294D2951219FB5390CF1219FBC295D2941219FBA5D9E64390301219FB227E680A947A6C00FF121A937EE410007E40557AE9400BE47E50AA7AE9501BE4BEE94068197E680A7A7A6C00FF121A93121A083009137AE9407EE91080F87E680A757A6C00FF121A930B007E680AD87A6C00FF121A937E7800007E700E7EA4FFFF7EB4BFFF7DCB0EC47DDC5DDB6CBB7DFA5EF47FFF7A7BB00BB07DFB5EF47FFF7A7BB00BB07DFC5EF47FFF7A7BB00BB07DFD5EF47FFF7A7BB06CBB7DFA5EF47FFFBE7BB078410BB07DFB5EF47FFFBE7BB078340BB07DFC5EF47FFFBE7BB078270BB07DFD5EF47FFFBE7BB0781A0BB0BEC4FFFE78920EB4A5DF8B7E680A827A6C00FF121A938077CA5BCA6B7E680A8B7A6C00FF121A937E680B2A7A6C00FF121A930A47121AC97E680B797A6C00FF121A936C77DA6BCA6B0B700EC4BEC4FFFF78F61B700A47121AC9121A08300930DA6BDA5B6CBB7E7800007DFA5EF47FFF7A7BB07DFB5EF47FFF7A7BB07DFC5EF47FFF7A7BB07DFD5EF47FFF7A7BB080D47E680AB67A6C00FF121A9330170E7E7804207A7C00007E447BE0800C7E7800007A7C00017E4480000B007E403A7C547F577D846C667A5B500B5C0B50A5DE020B501B8478F07C547F577D846C66BE5B50781A0B5C0B50A5DE020B501B8478EE7E680A757A6C00FF121A93804B7F457E680A7A7A6C00FF121A937E680AFA7A6C00FF121A937D4B121AC97E680B0F7A6C00FF121A936C887C95121AC97E680B1D7A6C00FF121A937E4B90121AC9121A083009057E4B9080FB7E680B7F7A6C00FF121A930B00D2927E24800009B20008BEB001780B09B20014BEB060780280177E680A7A7A6C00FF121A93121A0830091109B2000880FA7E680A757A6C00FF121A937E680BA17A6C00FF121A930B00C2921219EE7E2480007EA05519A2001C7EB00119B2000809B2001CBCAB783709B200085EB0C0BEB0C0782B7EA0AA19A2001C6CBB19B2000809B2001CBCAB781609B200085EB0C0780D7E680A757A6C00FF121A93801B7E680A7A7A6C00FF121A93121A0830090A19A2001C09B2001C80F67E680BC37A6C00FF121A937E680C457A6C00FF121A937E2480007E11097EB00119B2001C2E2401000BB0A5D9F37E2480007E11097EB0010B0009A2001CBCAB78167E680A827A6C00FF121A932E2401000BB0A5D9E280257E680A8B7A6C00FF121A93121A083009E47E2480007E110909A2001C2E240100A5D9F580EC7E680C697A6C00FF121A9312138A7E2480007E11090B00741019B200101213032E240100A5D9EE7E680C8D7A6C00FF121A937E2480007E11090B00E419B200101213032E240100A5D9EF3000030218B70213BB740719B200081219FB09B2000009B2001409B2000009B2001409B2000009B2001409B2000009B20014C20B7EB0551213647EB0AA1213647EB0001213647EB0FF121364300B0F7E680A8B7A6C00FF121A93121A08227E680A827A6C00FF121A932219B200001219EE09A20000BCAB780122200903D20B22121A0819B200001219EE09A2000080F3D2921219EEC2921219EE7E2480007E1109748019B2000C7E54000219A2000419B20000740319B2000C2E240100A5D9E1227E680CB17A6C00FF121A937E2480007E11090B001219EE09B200187EA05519A200001219EE09B200185EB005780D7E680A827A6C00FF121A93801A7E680A8B7A6C00FF121A93121A0830090919A200001219EE80F72E240100A5D9B67E680CD57A6C00FF121A937E2480007E11090B001219EE09B200187EA05519A200001219EE09B200185EB00A780D7E680A827A6C00FF121A93801A7E680A8B7A6C00FF121A93121A0830090919A200001219EE80F72E240100A5D9B630040302168C7E680CF97A6C00FF121A937E2480007E11090B006CAA19A200101219EE09B200187EA00219A200106CAA19A200101219EE09B200185EB00A783C7EA00119A200101219EE09B200187EA00319A200107EA00119A200101219EE09B200185EB00A78147E680A827A6C00FF121A932E240100A5D99E80207E680A8B7A6C00FF121A93121A083009E67EA00219A200106CAA19A2001080F17E680D417A6C00FF121A937E2480007E11090B006CAA19A200101219EE09B200187EA00119A200106CAA19A200101219EE09B200185EB005783C7EA00219A200101219EE09B200187EA00319A200107EA00219A200101219EE09B200185EB00578147E680A827A6C00FF121A932E240100A5D99E80207E680A8B7A6C00FF121A93121A083009E67EA00119A200106CAA19A2001080F17E680D897A6C00FF121A937E2480007E11090B007EA00219A200101219EE09B200185EB050BEB050781F6CAA19A200101219EE09B200185EB050780D7E680A827A6C00FF121A9380207E680A8B7A6C00FF121A93121A0830090F7EA00219A200106CAA19A2001080F12E240100A5D9A27E680DD17A6C00FF121A937E2480007E11090B0009B200187EA00119A200101219EE09B200185EB0A0BEB0A0781F6CAA19A200101219EE09B200185EB0A0780D7E680A827A6C00FF121A9380207E680A8B7A6C00FF121A93121A0830090F7EA00119A200106CAA19A2001080F12E240100A5D99E02182B7E680D1D7A6C00FF121A937E2480007E11090B006CAA19A200101219EE09B200187EA00219A200106CAA19A200101219EE09B200185EB006783C7EA00119A200101219EE09B200187EA00319A200107EA00119A200101219EE09B200185EB00678147E680A827A6C00FF121A932E240100A5D99E80207E680A8B7A6C00FF121A93121A083009E67EA00219A200106CAA19A2001080F17E680D657A6C00FF121A937E2480007E11090B006CAA19A200101219EE09B200187EA00119A200106CAA19A200101219EE09B200185EB009783C7EA00219A200101219EE09B200187EA00319A200107EA00219A200101219EE09B200185EB00978147E680A827A6C00FF121A932E240100A5D99E80207E680A8B7A6C00FF121A93121A083009E67EA00119A200106CAA19A2001080F17E680DAD7A6C00FF121A937E2480007E11090B007EA00219A200101219EE09B200185EB090BEB090781F6CAA19A200101219EE09B200185EB090780D7E680A827A6C00FF121A9380207E680A8B7A6C00FF121A93121A0830090F7EA00219A200106CAA19A2001080F12E240100A5D9A20218B730170302193BC28A1219227E2480007E11096CAA19A200041219EE0B007EA00819A200101219EE208B3E20893B7EA00819A2000409A200104EA00219A200101219EE308B2330892009A200105EA0FD19A200101219EE7EA00019A200041219EE208B05208902801A121A083009147EA00219A2001000005EA0FD19A20010000080EC2E240100A5D98902193B2017FA12138A1219227E2480007E11090B002089267EA0FF19A200041219EE7EB05519B200001219EE30890F7EA00019A200041219EE2089028026121A083009207EA0FF19A200041219EE7EB05519B200001219EE7EA00019A200041219EE80E02E240100A5D9A802193B7E2480007E11097EA00819A200101219EE2E240100A5D9EF22300A197E680DF57A6C00FF121A93D2091219EE1219EE1219EE020F1030171C7E680E6F7A6C00FF121A937E680E917A6C00FF121A93121B3C0219E60B007E7819A07A7C00FF7F677A6C00007E703E7E7BB07A6BB00B7C0B6CA5DFF37E7819A07A7C000089787E7800007A7C00FE7E687FBF7A6C00FE74AA39B75555745539B72AAA74A039B755556C997A6B907E5427107E6B80BC8968081B5478F58AFF19DE8AFF19E6121A087E6B8080FB7E10FF121A8580F8CAF97EF400FF1BF478FCDAF922CAF97EF400001BF478FCDAF922200919D20A1219FBC295D2941219FB1219FB1219FB1219FB43903022CA0B7E10037C306C220B209E300A50F92E300B1B2068181219FB1219FB5390CF1219FB1219FB1219FB439030A5DAE81219FB1219FB1B3068191219FB1219FBC295D2941219FB1219FB1219FB439030A5DBE77E200A1219FBA5DAFAA5D9A7DA0B2220090A1219FBB2941219FBB2942230173220092FCA2BCA7B7E7880007A7C00FE121B1C7E6BA05CAA681029B70014546068F839A700000B6C80E91219EED2B5DA7BDA2B22121AD47E68000B121A9322CA59CA5B7EB4000B7CB8C4121B047CB8121B047CB9C4121B047CB9121B047EB0687AB9B00BB46CBB7AB9B0DA59DA5B225EB00F7CAB9EA00A40052EB03780032EB0307AB9B00BB422C2B5C2921219EE748039B7000C7E54000639A7000439B70000740339B7000C227E7800007A7C00FF7E5800007A5C00017F657E7420001208D640547E787C007A7C00FF7E5800007A5C00017E687C007A6C00017E7404001208D640337480121BB1402C5390CFD2087E0400087E14000084A5DBFCA5DAF9A5D9F67440121BB1400E7E680EC07A6C00FF121A930219E6C295D29480FEF50A7E78000A7A7C00007E687FBF7A6C00017E7400010208D6D2
-:0000000001FF
-//**************************************************************
-//* Edgeport/4 Binary Image
-//* Generated by HEX2C v1.06
-//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
-//* This program is free software; you can redistribute it and/or modify
-//* it under the terms of the GNU General Public License as published by
-//* the Free Software Foundation; either version 2 of the License, or
-//* (at your option) any later version.
-//**************************************************************
diff --git a/firmware/edgeport/boot2.H16 b/firmware/edgeport/boot2.H16
deleted file mode 100644
index 8b14295e1f3e..000000000000
--- a/firmware/edgeport/boot2.H16
+++ /dev/null
@@ -1,28 +0,0 @@
-:000400000002000003F7
-:000200000400FFFB
-:000600000002008002000373
-:0003000B0002000BE5
-:000300130002025690
-:0003001B0002001BC5
-:0003002300020023B5
-:0003002B0002002BA5
-:000300330002003395
-:0003003B0002003B85
-:000300430002004375
-:0003004B0002004B65
-:00030053000201F5B2
-:0003007B0002007B05
-:02160080007EB3910120E30C7EB33FF254FE7AB33FF2800A7EB33FF244017AB33FF274007AB3910074017AB391127EF800247E00017E10001209D06920000A5E401FBE24000078097E00037A03900080077E00027A03900075B0DF7E00017A0394007A0301247E00017A0393007E0000A5D8FD75A80075B100CA29120C66120C37F5217AA120200908200A0A7EB00C80087EB00080037EB0087AB39200120296DA2974107AB391017E20047CB2C2D7131313137AB3910074007AB3911074607AB3911C74027AB39112A5DADF74007AB3910074607AB3911C74107AB3910674107AB3910774347AB39113743F7AB3911474027AB3910674017AB3910774037AB3910674447AB3910774EF7AB3910474077AB391067EB391077AB10A750901D2AAD2AFE47E60024D2278037E60037C767E0428008DEF1B0478FA047E20077A2391067E2391077E310ABC3268227A210A7E21096817CAB874037AB391067EB3910744027AB39107DAB875090030E0C16C677A63900080B9BEB00222C0D07508FE120AC074027AB3910674007AB3910774037AB3910674007AB3910774027AB391047EB33FF230E00874187AB39101800674107AB3910174107AB391040202367508FF120AC074017AB3910474037AB391067EB3910754FC7AB3910732CAB8750802120AC07EB3910320E50830E02B12029E80F17EB3910430E005DAB802023930E105DAB80201F530E60512040380D530E205DAB802008080CBDAB8326D
-:082A029600E47AB33FF1020341CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEB74007AB391007EB3012EB40002801CB401197EB391145414680512030580237EB3911430E51C12044380177EB3911430E505120443800B7EB3911454146803120305DAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B2220E41975080A120AC07EB3012D700A7EB3012EB4011F02039D02098B75080B120AC074147AB391147EB3012EB4020C12034D02034174047AB39114227E00007A03012E7A03012F227EB3012554606005B4401E801C7EB30126B40515750871120AC07EB301287EA0017AA391067AB391072274007AB3910074107AB3911222BE57012B28047E57012B7A0F01317A57013574107AB391122274007AB391007EB3911A70537EB3911420E44C7EEF01317EF701357E0701354D0068217E0000E07AB39117A3A5081BF46806A5B810F080197EB0007AB3012EBE0010680D7EB0007AB3012E74807AB3911E7AEF01317AF70135750806120AC074047AB3911422CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEB750803120AC074007AB3012D74007AB3910074017AB391121204B2DAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B22750803120AC07EB3012FB4021174007AB3012F7AB3012E74207AB3911422B401467EB3910420E6427E23911A7C327E1301302C217A2301307E00002E0401377EB391167A09B00B04A5DBF474207AB39114750870120AC07EB301307EA3012CBCAB78031205522202098BDA5902041574E07AB391007E0391107E1391117E3391127E2391137E5391147E4391157E7391167E6391177A0F01257A1F0129750804120AC07A0108120AC07A1108120AC07A2108120AC07A3108120AC07A4108120AC07A5108120AC07A6108120AC07A7108120AC074007AB3910074407AB39104120526226D007E1401027A0701357A0301307EB3012520E70F7A23012F7A33012EBE07012B6809227A33012F7A23012E7EB3012554E3232330E002D2E530E702D2E430E50630E40302098B543EF5F003541FC325F090057E7584FF730207390205C60207D20207ED0206D002065B02081E02081E0208210208210208210208210208210208210208210208210208270208F902082402082402082402082402082402082474007AB3910074607AB3911C7EB30126B4062A7EB3012760797C0B7E1301287E170129750872120AC07A0108120AC07A1108120AC01209D04058020384B4081C750874120AC07EB33FF17E0801377A0C00007A0BB07E540001020384B40033750875120AC07E0801377A0C0000CA0B7EB33FF230E00774027A0BB0800574007A0BB00B1474007A0BB07E540002DA0B02038402098B74007AB3910074607AB3911C7EB30126B4005F750876120AC07EB3012A540FB402057EB0608017B400057EB000800F7EB3012A20E7057EB04080037EB0207AB391007EB3911130E0047401800274007E0801377A0C0000CA0B7A0BB00B1474007A0BB074007AB391007E540002DA0B02038402098B7EB3012A540FB402057EB0608017B400057EB000800F7EB3012A20E7057EB04080037EB0207AB391007EB30128B400267EB30126B4010E750877120AC074017AB39112801BB4030E750878120AC074017AB39111800A74007AB3910012098B2274007AB391000203777EB30126B4091F750879120AC07EB30128BEB33FF1680DCAB81201F1DAB850767AB33FF1806DB4050875087A120AC08062B4031975087B120AC07EB30128B401557EB33FF244017AB33FF28046B4011975087C120AC07EB30128B401397EB33FF254FE7AB33FF2802AB4072A7EB3012760247C0B7E1301287E170129750873120AC07A0108120AC07A1108120AC0120A0A400302037702098B7EB30126B40BF675087D120AC07EB301287EA3012A4CAB78E480DF74007AB3910074607AB3911C7EB30126B40ACF75087E120AC07EB3012870C37E0801377A0C00007A0BB07E54000102038402098B02098B02098B7EB30126B404207508C3120AC07E0400017E1701277E1801377A1C00007E47012B120ACC0208F3B406427508C1120AC07E5800007A5C00FE7DCA7ED701277E7801377A7C00007E77012B7508C1120AC0C0A8C2AF7E40017A439400120B637E4301247A439400D0A840658060B40024C2AF7EB0017AB394007AB30124120377E48DEF8DEF8DEFD5E0F7C0D1CA02FFCA06000032B4092074037AB391067E2391077E5701274D5568054E200280035E20FD7A2391078016B40716C2AF7E0701297E170127C0D1CA18CA38CA283202037702098B74007AB3910074607AB3911C7EB30126B403157508C2120AC07E0400017E1701277E57012B020384B405417508C0120AC0C0A8C2AF7E40017A4394007E0801377A0C00007E2400FE7E3701277E47012B120ACC7E4301247A439400D0A87E0801377A0C00007E57012B020384B401207E00007E1001750872120AC07A0108120AC07A1108120AC01209D0400302038402098B750807120AC07EB0027AB3900074007AB3910074407AB3911574017AB391117EB391155460BEB040680874207AB3911580ED74017AB3911274047AB3911474FF7AB3012D22C0A8C2AF7E40017A439400120A57401F7E0801377A0C0000CA0BCA49120ACCDA59DA0B7E4301247A439400D0A8C3227E4301247A439400D0A822C0A8C2AF7E40017A439400120A5740317E5800007A5C00FE7F617E7801377A7C00007E77012BBD7478177508C1120AC0120B63400C7E4301247A439400D0A8C3227E4301247A439400D0A8D3227E2400FE7E347FCA0B1A50C5F07D627D757D877E347F037E1BB0BC0B50493E003E000A502D750B3A3069530002BD3850022D38BC1B50303E103E100A512D35694100020B1A30BD3850022D38BE44FFFF78057E1B900A494D44680CBE4400FF28047E4400FFC322D32248
-:00407FC00040010200D73102000300007C0000010000000000000000000000000000000000000000000000000000000000000000000000000000000000F17F00000000000044
-:10430AC000CA087E01087A033FF0DA082280500B1A600B350B1A700B350B1A800B350B1A900B350B1AA00B350B1AB00B350B1AC00B350B1AD00B351B0A600B151B0A700B151B0A800B151B0A900B151B0AA00B151B0AB00B151B0AC00B151B0AD00B159E44001050AA2E440010680E7E1BC07A0BC00B140B341B4478F2227F6F7FF01BFC7C547D328008CA1BCA1BCA1BCA1B9E44001050F22E4400106806CA481B4478FA7FF689E4CA6B5ED4003F68207E8400409D8DDA6BBD873816CA797D78120B8DDA7940089D7868028005C2D722DA6B7EC0037ED0007AD3900074AA39B55555745539B52AAA74A039B555557E0400409D7050062D707D076D777C317E7B007A6B000B7C0B6CA5D9F37F161B1C7E5427107E1B10BC1068061B5478F5802F6D007C207F169F107F279F207E2B007E1B10BC0178190B2C0B1CA5DBEF7CB620E0066CDC7AD390004D777890C2D722D2D7220004000400000604020400020104010200000000000000000202020202040008100210040208000101087E187FBD7A1C00FF0B1A005E101FBE1014381A0A51237E180C0D7A1C00FF2D350B1A506008A5B802034EA0082280FE7EE87FBF7AEC00FFE0F52354C068387EE87FBE7AEC00FFE0602E120C37F5217AA12020090C200A127EB00E7AB3920080107EB0027AB3920080077EB00A7AB392007AB10D020CC4227EB0027AB3900012190C7EB0037AB3900012190C80EAC2AFC211C21275B0DF7E00017A0393007E00007A0390006C007E1003120CF57E682C667A6C00FF1219C40B008032021A6E20112B7EB0017AB3900012190C7EB0037AB3900012190C7EB0027AB3900012190CA5D9DC7EB0007AB3900012190C227E682CF97A6C00FF1219C47EE410007E40557AE9400BE47E50AA7AE9501BE4BEE94068197E682CDF7A6C00FF1219C41219193011137AE9407EE91080F87E682CDA7A6C00FF1219C40B007E682D3D7A6C00FF1219C47E7800007E700E7EA4FFFF7EB4BFFF7DCB0EC47DDC5DDB6CBB7DFA5EF47FFF7A7BB00BB07DFB5EF47FFF7A7BB00BB07DFC5EF47FFF7A7BB00BB07DFD5EF47FFF7A7BB06CBB7DFA5EF47FFFBE7BB078410BB07DFB5EF47FFFBE7BB078340BB07DFC5EF47FFFBE7BB078270BB07DFD5EF47FFFBE7BB0781A0BB0BEC4FFFE78920EB4A5DF8B7E682CE77A6C00FF1219C48077CA5BCA6B7E682CF07A6C00FF1219C47E682D8F7A6C00FF1219C40A471219FA7E682DDE7A6C00FF1219C46C77DA6BCA6B0B700EC4BEC4FFFF78F61B700A471219FA121919301130DA6BDA5B6CBB7E7800007DFA5EF47FFF7A7BB07DFB5EF47FFF7A7BB07DFC5EF47FFF7A7BB07DFD5EF47FFF7A7BB080D47E682D1B7A6C00FF1219C4301F0E7E7804207A7C00007E447BE0800C7E7800007A7C00017E4480000B007E403A7C547F577D846C667A5B500B5C0B50A5DE020B501B8478F07C547F577D846C66BE5B50781A0B5C0B50A5DE020B501B8478EE7E682CDA7A6C00FF1219C4804B7F457E682CDF7A6C00FF1219C47E682D5F7A6C00FF1219C47D4B1219FA7E682D747A6C00FF1219C46C887C951219FA7E682D827A6C00FF1219C47E4B901219FA1219193011057E4B9080FB7E682E287A6C00FF1219C40B007EB0807AB391007EA0557AA391107EB391077EB39110BCAB78207EA0AA7AA391107EB391077EB39110BCAB780D7E682CDA7A6C00FF1219C4801B7E682CDF7A6C00FF1219C412191930110A7AA391107EB3911080F67E682E4A7A6C00FF1219C41212310B007EE410007EA0A5CAA87AE9A07EB0307AB395007EE9A07EB0007AB3950012190C0BE57EB0207AB395007EE9B07EB0007AB395007EE9B0DAA8BCAB780D7E682CDA7A6C00FF1219C4801D7E682CDF7A6C00FF1219C412191930110C7EB0387AB395007EE9B080FB80007E682DE47A6C00FF1219C40B0075B0DF7E24800009B20008BEB001780B09B20014BEB060780280177E682CDF7A6C00FF1219C412191930111109B2000880FA7E682CDA7A6C00FF1219C47E682E067A6C00FF1219C40B0075B0EF1218FF7E2480007EA05519A2001C7EB00119B2000809B2001CBCAB783709B200085EB0C0BEB0C0782B7EA0AA19A2001C6CBB19B2000809B2001CBCAB781609B200085EB0C0780D7E682CDA7A6C00FF1219C4801B7E682CDF7A6C00FF1219C412191930110A19A2001C09B2001C80F67E682E6C7A6C00FF1219C47E682EEE7A6C00FF1219C47E2480007E11217EB00119B2001C2E2401000BB0A5D9F37E2480007E11217EB0010B0009A2001CBCAB78167E682CE77A6C00FF1219C42E2401000BB0A5D9E280257E682CF07A6C00FF1219C41219193011E47E2480007E112109A2001C2E240100A5D9F580EC7E682F127A6C00FF1219C41212317E2480007E11210B00741019B200101211AA2E240100A5D9EE7E682F367A6C00FF1219C47E2480007E11210B00E419B200101211AA2E240100A5D9EF30000302173B02126A740719B2000812190C09B2000009B2001409B2000009B2001409B2000009B2001409B2000009B20014C2137EB05512120B7EB0AA12120B7EB00012120B7EB0FF12120B30130F7E682CF07A6C00FF1219C4121919227E682CE77A6C00FF1219C42219B200001218FF09A20000BCAB780122201103D2132212191919B200001218FF09A2000080F375B0DF1218FF75B0EF1218FF7E2480007E1121748019B2000C7E54000219A2000419B20000740319B2000C740619B200082E240100A5D9DB227E682F5A7A6C00FF1219C47E2480007E11210B001218FF09B200187EA05519A200001218FF09B200185EB005780D7E682CE77A6C00FF1219C4801A7E682CF07A6C00FF1219C412191930110919A200001218FF80F72E240100A5D9B67E682F7E7A6C00FF1219C47E2480007E11210B001218FF09B200187EA05519A200001218FF09B200185EB00A780D7E682CE77A6C00FF1219C4801A7E682CF07A6C00FF1219C412191930110919A200001218FF80F72E240100A5D9B630040302159F7E682FA27A6C00FF1219C47E2480007E11210B006CAA19A200101218FF09B200187EA00219A200106CAA19A200101218FF09B200185EB00A783C7EA00119A200101218FF09B200187EA00319A200107EA00119A200101218FF09B200185EB00A78147E682CE77A6C00FF1219C42E240100A5D99E80207E682CF07A6C00FF1219C41219193011E67EA00219A200106CAA19A2001080F17E682FEA7A6C00FF1219C47E2480007E11210B006CAA19A200101218FF09B200187EA00119A200106CAA19A200101218FF09B200185EB005783C7EA00219A200101218FF09B200187EA00319A200107EA00219A200101218FF09B200185EB00578147E682CE77A6C00FF1219C42E240100A5D99E80207E682CF07A6C00FF1219C41219193011E67EA00119A200106CAA19A2001080F17E6830327A6C00FF1219C47E2480007E11210B007EA00219A200101218FF09B200185EB050BEB050781F6CAA19A200101218FF09B200185EB050780D7E682CE77A6C00FF1219C480207E682CF07A6C00FF1219C412191930110F7EA00219A200106CAA19A2001080F12E240100A5D9A27E68307A7A6C00FF1219C47E2480007E11210B0009B200187EA00119A200101218FF09B200185EB0A0BEB0A0781F6CAA19A200101218FF09B200185EB0A0780D7E682CE77A6C00FF1219C480207E682CF07A6C00FF1219C412191930110F7EA00119A200106CAA19A2001080F12E240100A5D99E7E68309E7A6C00FF1219C47E2480007E11210B0020B1267EA00219A200101218FF30B1196CAA19A200101218FF20B10D7E682CE77A6C00FF1219C480207E682CF07A6C00FF1219C412191930110F7EA00219A200106CAA19A2001080F12E240100A5D9AE02173B7E682FC67A6C00FF1219C47E2480007E11210B006CAA19A200101218FF09B200187EA00219A200106CAA19A200101218FF09B200185EB006783C7EA00119A200101218FF09B200187EA00319A200107EA00119A200101218FF09B200185EB00678147E682CE77A6C00FF1219C42E240100A5D99E80207E682CF07A6C00FF1219C41219193011E67EA00219A200106CAA19A2001080F17E68300E7A6C00FF1219C47E2480007E11210B006CAA19A200101218FF09B200187EA00119A200106CAA19A200101218FF09B200185EB009783C7EA00219A200101218FF09B200187EA00319A200107EA00219A200101218FF09B200185EB00978147E682CE77A6C00FF1219C42E240100A5D99E80207E682CF07A6C00FF1219C41219193011E67EA00119A200106CAA19A2001080F17E6830567A6C00FF1219C47E2480007E11210B007EA00219A200101218FF09B200185EB090BEB090781F6CAA19A200101218FF09B200185EB090780D7E682CE77A6C00FF1219C480207E682CF07A6C00FF1219C412191930110F7EA00219A200106CAA19A2001080F12E240100A5D9A2201F681212311217A97E2480007E11210B002089267EA0FF19A200041218FF7EB05519B200001218FF30890F7EA00019A200041218FF20890280261219193011207EA0FF19A200041218FF7EB05519B200001218FF7EA00019A200041218FF80E02E240100A5D9A80217C202184C7E2480007E11217EA00819A200101218FF2E240100A5D9EF22301F0302184CC28A1217A90B00121816208B2474037AB3910674027AB39107740C7AB3910674007AB3910712190C308B06121816308BAD1219193011A712181674037AB3910674027AB3910712190C12181680E97EA00074027AB391067AA3910774037AB391067AA391071218FF74EF7AB3910474807AB39103740C7AB3910674087AB3910712190C223012197E6830C27A6C00FF1219C4D2111218FF1218FF1218FF020CCA301F1C7E68313C7A6C00FF1219C47E68315E7A6C00FF1219C4121A6E0218F70B007E7818B17A7C00FF7F677A6C00007E703E7E7BB07A6BB00B7C0B6CA5DFF37E7818B17A7C000089787E7800007A7C00FE7E687FBF7A6C00FE74AA39B75555745539B72AAA74A039B755556C997A6B907E5427107E6B80BC8968081B5478F58AFF18EF8AFF18F71219197E6B8080FB7E10FF1219AC80F8CAF97EF400FF1BF478FCDAF922CAF97EF400001BF478FCDAF922201120D21212190C7EB0027AB3900012190C12190C12190C12190C7EB0007AB3900022CA0B7E10037C306C220B209E300A50F92E300B1B20682012190C12190C7EB0037AB3900012190C12190C12190C7EB0007AB39000A5DAE012190C12190C1B30682012190C12190C7EB0027AB3900012190C12190C12190C7EB0007AB39000A5DBE07E200A12190CA5DAFAA5D998DA0B2220111412190C7EB0017AB3900012190C7EB0007AB3900022301F3220112FCA2BCA7B7E7880007A7C00FE121A4D7E6BA05CAA681029B70014546068F839A700000B6C80E91218FFD2B5DA7BDA2B22121A057E68000C1219C422CA59CA5B7EB4000C7CB8C4121A357CB8121A357CB9C4121A357CB9121A357EB0687AB9B00BB46CBB7AB9B0DA59DA5B225EB00F7CAB9EA00A40052EB03780032EB0307AB9B00BB422C2B575B0EF1218FF748039B7000C7E54000639A7000439B70000740339B7000C227E7800007A7C00FF7E5800007A5C00017F657E742000120B6340587E787C007A7C00FF7E5800007A5C00017E687C007A6C00017E740400120B6340377480121AEA40307E00037A039000D2107E0400087E14000084A5DBFCA5DAF9A5D9F67440121AEA400E7E68318D7A6C00FF1219C40218F77EB0027AB3900080FEF50B7E78000B7A7C00007E687FBF7A6C00017E740001020B6374
-:0000000001FF
-//**************************************************************
-//* Edgeport/4 Binary Image
-//* Generated by HEX2C v1.06
-//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
-//* This program is free software; you can redistribute it and/or modify
-//* it under the terms of the GNU General Public License as published by
-//* the Free Software Foundation; either version 2 of the License, or
-//* (at your option) any later version.
-//**************************************************************
diff --git a/firmware/edgeport/down.H16 b/firmware/edgeport/down.H16
deleted file mode 100644
index 7e36fe1f2182..000000000000
--- a/firmware/edgeport/down.H16
+++ /dev/null
@@ -1,29 +0,0 @@
-:000400000001100004E7
-:000200000400FFFB
-:00060000000200800244B082
-:0003000B000244723A
-:0003001300020013D5
-:0003001B0002001BC5
-:0003002300020023B5
-:0003002B0002002BA5
-:000300330002003395
-:0003003B0002003B85
-:000300430002004375
-:0003004B00026EC47E
-:000300530002758DA6
-:0003007B0002007B05
-:00070080007E14000002405154
-:088230000012372812303E1230541230E51231681235201238581231151231401230A080E0E52360197E14000009B101CFB4000280051419B101CFA50BBE312F78EB22C2AF7EB33FF1B4010AC0F175F1021270EFD0F1D2AF22C2AFE52260437E0701E1BE04038038397E0480007E200013502109A000044EA00519A000040A320953678E5E5127680B09A000104EA00119A000102E040100A50ABE212F78D1752200D2AF22C2AF7E20007E30017CB2230A2B4932018FBE34000068127EB121A54B7AB121CA19492230D59924DA193E30A50ABE212F78D6D2AF22460F49674CBF5017536F56C75A1F5D77C2AFE53260147E2000135007CAB8123102DAB8A50ABE212F78EFD2AF22CA281267ABDA2840090A2209B2678EF4523222C2AFE53460147E2000135007CAB8123132DAB8A50ABE212F78EFD2AF22CA280A220942003E1269C2DA2822C2AFE53560147E2000135007CAB812315DDAB8A50ABE212F78EFD2AF22CA287E4000126C5BDA2822C2AFE52360147E2000135007CAB8123185DAB8A50ABE212F78EFD2AF227CB2230A2B49223190892431A03210328032F0336033D0344034B07E27018FBE24000078247E24800009B20014CAB85EB01EDAB8680BCA197D121249307D21DA1930E6187E6000801EBE27019F680D7A27019F7E609C7A6301CF802E7E6301CFA5BE00267E60017EB0007EA0C81262B640187531B3127C15C2186C007A0301CFC0F175F101126FD9D0F1227E270191BE24000078247E24810009B20014CAB85EB01EDAB8680BCA197D12124C887D21DA1930E6187E6000801EBE2701A1680D7A2701A17E609C7A6301D0802E7E6301D0A5BE00267E60017EB0007EA0C81262B640187531B3127C15C2196C007A0301D0C0F175F101126FD9D0F1227E270193BE24000078247E24820009B20014CAB85EB01EDAB8680BCA197D12124FE07D21DA1930E6187E6000801EBE2701A3680D7A2701A37E609C7A6301D1802E7E6301D1A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21A6C007A0301D1C0F175F101126FD9D0F1227E270195BE24000078247E24830009B20014CAB85EB01EDAB8680BCA197D121253387D21DA1930E6187E6000801EBE2701A5680D7A2701A57E609C7A6301D2802E7E6301D2A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21B6C007A0301D2C0F175F101126FD9D0F1227E270197BE24000078247E24840009B20014CAB85EB01EDAB8680BCA197D121256907D21DA1930E6187E6000801EBE2701A7680D7A2701A77E609C7A6301D3802E7E6301D3A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21C6C007A0301D3C0F175F101126FD9D0F1227E270199BE24000078247E24850009B20014CAB85EB01EDAB8680BCA197D121259E87D21DA1930E6187E6000801EBE2701A9680D7A2701A97E609C7A6301D4802E7E6301D4A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21D6C007A0301D4C0F175F101126FD9D0F1227E27019BBE24000078247E24860009B20014CAB85EB01EDAB8680BCA197D12125D407D21DA1930E6187E6000801EBE2701AB680D7A2701AB7E609C7A6301D5802E7E6301D5A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21E6C007A0301D5C0F175F101126FD9D0F1227E27019DBE24000078247E24870009B20014CAB85EB01EDAB8680BCA197D121260987D21DA1930E6187E6000801EBE2701AD680D7A2701AD7E609C7A6301D6802E7E6301D6A5BE00267E60017EB0007EA0C81262B640187531B3127C15C21F6C007A0301D6C0F175F101126FD9D0F122C2AFE52460147E2000135007CAB812353DDAB8A50ABE212F78EFD2AF227CB2230A2B4922354889243558359235CC36063640367A36B436EE7E24800009B20014CAB85EB01EDAB8680BCA197D121249307D21DA195EB0017EA09012629340127531B8127C15C220C0F175F101126FD9D0F1227E24810009B20014CAB85EB01EDAB8680BCA197D12124C887D21DA195EB0017EA09012629340127531B8127C15C221C0F175F101126FD9D0F1227E24820009B20014CAB85EB01EDAB8680BCA197D12124FE07D21DA195EB0017EA09012629340127531B8127C15C222C0F175F101126FD9D0F1227E24830009B20014CAB85EB01EDAB8680BCA197D121253387D21DA195EB0017EA09012629340127531B8127C15C223C0F175F101126FD9D0F1227E24840009B20014CAB85EB01EDAB8680BCA197D121256907D21DA195EB0017EA09012629340127531B8127C15C224C0F175F101126FD9D0F1227E24850009B20014CAB85EB01EDAB8680BCA197D121259E87D21DA195EB0017EA09012629340127531B8127C15C225C0F175F101126FD9D0F1227E24860009B20014CAB85EB01EDAB8680BCA197D12125D407D21DA195EB0017EA09012629340127531B8127C15C226C0F175F101126FD9D0F1227E24870009B20014CAB85EB01EDAB8680BCA197D121260987D21DA195EB0017EA09012629340127531B8127C15C227C0F175F101126FD9D0F122C2AFE53360147E2000135007CAB8123745DAB8A50ABE212F78EFD2AF227CB2230A2B4922375089243760377F379E37BD37DC37FB381A38397E248000CA197D1212481BDA19100402800CD201C0F175F101126FD9D0F1227E248100CA197D12124B73DA19100402800CD201C0F175F101126FD9D0F1227E248200CA197D12124ECBDA19100402800CD201C0F175F101126FD9D0F1227E248300CA197D12125223DA19100402800CD201C0F175F101126FD9D0F1227E248400CA197D1212557BDA19100402800CD201C0F175F101126FD9D0F1227E248500CA197D121258D3DA19100402800CD201C0F175F101126FD9D0F1227E248600CA197D12125C2BDA19100402800CD201C0F175F101126FD9D0F1227E248700CA197D12125F83DA19100402800CD201C0F175F101126FD9D0F122C2AFC0F175F101A932F21A7E0701E1BE0400007810E5F53382E74009853131127C1575F600D0F1D2AF2247
-:3C154000007E0400017E147FF87E2400FE7D310B1A501B0A507E14401B02406A7EF8006FD204C294D2957EF4402C02407C127D30F52F7AA1307A116E1275CA1240DC7EB33FF160031243D475F10012766FD2AF0230007E0400FF7E18405F7A1C00018918A9258703A9D587D29389087E0400FF7E1840787A1C00018918C29389087E0800207E4404007E40007EE4408E027C307E08016F7E44287C7E40007EE440A0027C307E08006F7E4401007E40537EE440B2027C30756D20756C307E040008756A58756B08756708756901758901758A01758C00D28C7E0400027A055889F475B77F75B87F75B30775B207D2A922D292E4D5E0FDC2927E2480007E112F7EA00819A200102E240100A5D9F27E200012417E0B20BE212F78F6227E0480004C0274BF19B0000C741019B00008748019B0000C7E54000219A0000419B00000740319B0000C7407A920300BA9353005BE20012802740F19B00004A933301874BF19B0000C7428A9203002742019B00004740319B0000C74A719B00008740C19B00010227E0480004C02E419B0000409B00010540819B0001074A719B00008227CB2230A2B492241A5892441B541D441F3421242314250426F428EC210C218C220C2087E0409E37A07016F7A07017F6D007A07018F7A07019F22C211C219C221C2097E040DE37A0701717A0701816D007A0701917A0701A122C212C21AC222C20A7E0411E37A0701737A0701836D007A0701937A0701A322C213C21BC223C20B7E0415E37A0701757A0701856D007A0701957A0701A522C214C21CC224C20C7E0419E37A0701777A0701876D007A0701977A0701A722C215C21DC225C20D7E041DE37A0701797A0701896D007A0701997A0701A922C216C21EC226C20E7E0421E37A07017B7A07018B6D007A07019B7A0701AB22C217C21FC227C20F7E0425E37A07017D7A07018D6D007A07019D7A0701AD227CB2230A2B492242B8892442C842E9430A432B434C436D438E43AF305007206804C2288016304007206004C228800C304807205804C2288002D22822305107206904C2298016304107206104C229800C304907205904C2298002D22922305207206A04C22A8016304207206204C22A800C304A07205A04C22A8002D22A22305307206B04C22B8016304307206304C22B800C304B07205B04C22B8002D22B22305407206C04C22C8016304407206404C22C800C304C07205C04C22C8002D22C22305507206D04C22D8016304507206504C22D800C304D07205D04C22D8002D22D22305607206E04C22E8016304607206604C22E800C304E07205E04C22E8002D22E22305707206F04C22F8016304707206704C22F800C304F07205F04C22F8002D22F22443843E5BEB002400122230A5B495543D09954D322A9C5871244437E0405E37A0701D77A0701D97E0401E37A0701DD7A0701DF7E0474AD7A056175F10175E11F75E40475F40475F10275E10375E40475F40443A21C1240EB7E200012419A0B20BE212F78F6D2A822A9D587124443D292C2A82275A30053A20375C10053C0037E00057A01F143F48043E480E5F2547F4408F5F2E5E2547F4408F5E275E110A5D8E122CA09123020100112D5671E6369017E006A2E0169A5E6F567801220021E756900856A67D2027400800D30020FC2027E006C2E0169A5E65390CF4290DA0932C0D0C0D1C0E0C0F0CA0BCA1BCA2BD201753189127C157E14800009B1000820E00302454F20785AA50A09B1000820E00302456720794BA50A09B1000820E00302457FA50A09B1000820E003024597207A30A50A09B1000820E0030245AFA50A09B1000820E0030245C7A50A09B1000820E0030245DFA50A09B1000820E0030245F730040CC204C0F175F101126FD9D0F1DA2BDA1BDA0BD0F0D0E0D0D1D0D032753180127C15543E0A5B7E4400FF6952632BCA06C6448954753181127C15543E0A5B7E4400FF6952636BCA06C6448954753182127C15543E0A5B7E4400FF695263ABCA06C6448954753183127C15543E0A5B7E4400FF695263EBCA06C6448954753184127C15543E0A5B7E4400FF6952642BCA06C6448954753185127C15543E0A5B7E4400FF6952646BCA06C6448954753186127C15543E0A5B7E4400FF695264ABCA06C6448954753187127C15543E0A5B7E4400FF695264EBCA06C644895410080122202803D208227531A0127C157E1480008006202803D2082209B10014CAB85EB01EDAB8680312493020E603D20822303049D2707E37018F7E2701AF9D3240317D022E05487A05487A37018F7E37016F7D432D42BE440DE238687A47016F753194127C157A5131127C1512652B1070C422C2702D2368786D33801A7E27018FBE240000686ABE2701AF28047E2701AF7E37018F9D327D022E05487A05487A37018F7E37016F7D432D42BE440DE238137A47016F753194127C157A5131127C1502652B753194127C157A5131127C159E440DE39D2412652B7E3409E37D242D437A47016F12652BBE2520780302467F22D2087E0409E37A07016F7A07017F753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701BF2E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2400002E2701BF1B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B1000430380A09B1001054FE19B10010D21022807D7A5131127C159E4405E39D247E6400002E6701BF9E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344007A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E70247E3753199127C1509B1000454FA19B1000430380A09B1001054FE19B10010D21022DAB830E0D8BD326807CAB81247E3DAB802493009B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D2688002C268A5FD5E50206804D2608002C260A5FD5E50806804D2588002C2581242C8026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22024835753195127C1522753196127C152210090122202903D209227531A1127C157E1481008006202903D2092209B10014CAB85EB01EDAB86803124C8820E603D20922303149D2717E3701917E2701B19D3240317D022E054A7A054A7A3701917E3701717D432D42BE4411E238687A470171753194127C157A5131127C1512652B1071C422C2712D2368786D33801A7E270191BE240000686ABE2701B128047E2701B17E3701919D327D022E054A7A054A7A3701917E3701717D432D42BE4411E238137A470171753194127C157A5131127C1502652B753194127C157A5131127C159E4411E39D2412652B7E340DE37D242D437A47017112652BBE252078030249D722D2097E040DE37A0701717A070181753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701C12E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2401002E2701C11B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B1000430390A09B1001054FE19B10010D21122807D7A5131127C159E4405E39D247E6401002E6701C19E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344017A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7024B3B753199127C1509B1000454FA19B1000430390A09B1001054FE19B10010D21122DAB830E0D8BD326807CAB8124B3BDAB8024C8809B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D2698002C269A5FD5E50206804D2618002C261A5FD5E50806804D2598002C2591242E9026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22024B8D753195127C1522753196127C1522100A0122202A03D20A227531A2127C157E1482008006202A03D20A2209B10014CAB85EB01EDAB86803124FE020E603D20A22303249D2727E3701937E2701B39D3240317D022E054C7A054C7A3701937E3701737D432D42BE4415E238687A470173753194127C157A5131127C1512652B1072C422C2722D2368786D33801A7E270193BE240000686ABE2701B328047E2701B37E3701939D327D022E054C7A054C7A3701937E3701737D432D42BE4415E238137A470173753194127C157A5131127C1502652B753194127C157A5131127C159E4415E39D2412652B7E3411E37D242D437A47017312652BBE25207803024D2F22D20A7E0411E37A0701737A070183753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701C32E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2402002E2701C31B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303A0A09B1001054FE19B10010D21222807D7A5131127C159E4405E39D247E6402002E6701C39E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344027A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7024E93753199127C1509B1000454FA19B10004303A0A09B1001054FE19B10010D21222DAB830E0D8BD326807CAB8124E93DAB8024FE009B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26A8002C26AA5FD5E50206804D2628002C262A5FD5E50806804D25A8002C25A12430A026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22024EE5753195127C1522753196127C1522100B0122202B03D20B227531A3127C157E1483008006202B03D20B2209B10014CAB85EB01EDAB8680312533820E603D20B22303349D2737E3701957E2701B59D3240317D022E054E7A054E7A3701957E3701757D432D42BE4419E238687A470175753194127C157A5131127C1512652B1073C422C2732D2368786D33801A7E270195BE240000686ABE2701B528047E2701B57E3701959D327D022E054E7A054E7A3701957E3701757D432D42BE4419E238137A470175753194127C157A5131127C1502652B753194127C157A5131127C159E4419E39D2412652B7E3415E37D242D437A47017512652BBE2520780302508722D20B7E0415E37A0701757A070185753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701C52E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2403002E2701C51B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303B0A09B1001054FE19B10010D21322807D7A5131127C159E4405E39D247E6403002E6701C59E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344037A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E70251EB753199127C1509B1000454FA19B10004303B0A09B1001054FE19B10010D21322DAB830E0D8BD326807CAB81251EBDAB802533809B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26B8002C26BA5FD5E50206804D2638002C263A5FD5E50806804D25B8002C25B12432B026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB2202523D753195127C1522753196127C1522100C0122202C03D20C227531A4127C157E1484008006202C03D20C2209B10014CAB85EB01EDAB8680312569020E603D20C22303449D2747E3701977E2701B79D3240317D022E05507A05507A3701977E3701777D432D42BE441DE238687A470177753194127C157A5131127C1512652B1074C422C2742D2368786D33801A7E270197BE240000686ABE2701B728047E2701B77E3701979D327D022E05507A05507A3701977E3701777D432D42BE441DE238137A470177753194127C157A5131127C1502652B753194127C157A5131127C159E441DE39D2412652B7E3419E37D242D437A47017712652BBE252078030253DF22D20C7E0419E37A0701777A070187753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701C72E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2404002E2701C71B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303C0A09B1001054FE19B10010D21422807D7A5131127C159E4405E39D247E6404002E6701C79E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344047A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7025543753199127C1509B1000454FA19B10004303C0A09B1001054FE19B10010D21422DAB830E0D8BD326807CAB8125543DAB802569009B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26C8002C26CA5FD5E50206804D2648002C264A5FD5E50806804D25C8002C25C12434C026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22025595753195127C1522753196127C1522100D0122202D03D20D227531A5127C157E1485008006202D03D20D2209B10014CAB85EB01EDAB868031259E820E603D20D22303549D2757E3701997E2701B99D3240317D022E05527A05527A3701997E3701797D432D42BE4421E238687A470179753194127C157A5131127C1512652B1075C422C2752D2368786D33801A7E270199BE240000686ABE2701B928047E2701B97E3701999D327D022E05527A05527A3701997E3701797D432D42BE4421E238137A470179753194127C157A5131127C1502652B753194127C157A5131127C159E4421E39D2412652B7E341DE37D242D437A47017912652BBE2520780302573722D20D7E041DE37A0701797A070189753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701C92E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2405002E2701C91B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303D0A09B1001054FE19B10010D21522807D7A5131127C159E4405E39D247E6405002E6701C99E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344057A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E702589B753199127C1509B1000454FA19B10004303D0A09B1001054FE19B10010D21522DAB830E0D8BD326807CAB812589BDAB80259E809B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26D8002C26DA5FD5E50206804D2658002C265A5FD5E50806804D25D8002C25D12436D026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB220258ED753195127C1522753196127C1522100E0122202E03D20E227531A6127C157E1486008006202E03D20E2209B10014CAB85EB01EDAB86803125D4020E603D20E22303649D2767E37019B7E2701BB9D3240317D022E05547A05547A37019B7E37017B7D432D42BE4425E238687A47017B753194127C157A5131127C1512652B1076C422C2762D2368786D33801A7E27019BBE240000686ABE2701BB28047E2701BB7E37019B9D327D022E05547A05547A37019B7E37017B7D432D42BE4425E238137A47017B753194127C157A5131127C1502652B753194127C157A5131127C159E4425E39D2412652B7E3421E37D242D437A47017B12652BBE25207803025A8F22D20E7E0421E37A07017B7A07018B753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701CB2E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2406002E2701CB1B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303E0A09B1001054FE19B10010D21622807D7A5131127C159E4405E39D247E6406002E6701CB9E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344067A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7025BF3753199127C1509B1000454FA19B10004303E0A09B1001054FE19B10010D21622DAB830E0D8BD326807CAB8125BF3DAB8025D4009B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26E8002C26EA5FD5E50206804D2668002C266A5FD5E50806804D25E8002C25E12438E026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22025C45753195127C1522753196127C1522100F0122202F03D20F227531A7127C157E1487008006202F03D20F2209B10014CAB85EB01EDAB8680312609820E603D20F22303749D2777E37019D7E2701BD9D3240317D022E05567A05567A37019D7E37017D7D432D42BE4429E238687A47017D753194127C157A5131127C1512652B1077C422C2772D2368786D33801A7E27019DBE240000686ABE2701BD28047E2701BD7E37019D9D327D022E05567A05567A37019D7E37017D7D432D42BE4429E238137A47017D753194127C157A5131127C1502652B753194127C157A5131127C159E4429E39D2412652B7E3425E37D242D437A47017D12652BBE25207803025DE722D20F7E0425E37A07017D7A07018D753194127C15753100127C1522753192127C15D20409B10014CAB85482DAB878707E3701E17E2701CD2E2400022D32BE340400383C7D022E05467A05467A3701E17E3701DF7D432D42BE4405E238447A4701DF7E2407002E2701CD1B38200B357A5131127C15BE503878030266160265FB753199127C1509B1000454FA19B10004303F0A09B1001054FE19B10010D21722807D7A5131127C159E4405E39D247E6407002E6701CD9E24000240171B38600B351265FB7E3401E37D242D437A4701DF0265FB7A39C07E3401E37A39D00B341B4480E59D327CB6540F23232344077A69B07A79700B35753193127C157A7131127C15BD0468297A0701DF7E4701E12D437A4701E12E35467A35462209B1001420E013227E0401E3802A7E0401E3802C7E0401E380D1D2047E0701E17E2403FE9D2028407E0701DF7E4405E37D600B04BD0468D07D700B04BD0468CE7D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7025F4B753199127C1509B1000454FA19B10004303F0A09B1001054FE19B10010D21722DAB830E0D8BD326807CAB8125F4BDAB802609809B100187EA088753190127C15F531127C15A5FC5EB0F0A5FD09B100184C4B5EB0F0BCB578F15E400F4C547CB55E500B682AA5FD5E50106804D26F8002C26FA5FD5E50206804D2678002C267A5FD5E50806804D25F8002C25F1243AF026293753191127C1509B100147AB131127C1520E008D2047EA080026293D20430E1067EA080126293CAB85EB01CDAB868127EA0C0096100001262B609B1001420E0DB22025F9D753195127C1522753196127C15227C027E1480004C2009B10018A5FD5E50106804D2688002C268A5FD5E50206804D2608002C260A5FD5E50806804D2588002C25802627F7C027E1480004C2009B10018A5FD5E50106804D2698002C269A5FD5E50206804D2618002C261A5FD5E50806804D2598002C25902627F7C027E1480004C2009B10018A5FD5E50106804D26A8002C26AA5FD5E50206804D2628002C262A5FD5E50806804D25A8002C25A02627F7C027E1480004C2009B10018A5FD5E50106804D26B8002C26BA5FD5E50206804D2638002C263A5FD5E50806804D25B8002C25B02627F7C027E1480004C2009B10018A5FD5E50106804D26C8002C26CA5FD5E50206804D2648002C264A5FD5E50806804D25C8002C25C02627F7C027E1480004C2009B10018A5FD5E50106804D26D8002C26DA5FD5E50206804D2658002C265A5FD5E50806804D25D8002C25D02627F7C027E1480004C2009B10018A5FD5E50106804D26E8002C26EA5FD5E50206804D2668002C266A5FD5E50806804D25E8002C25E02627F7C027E1480004C2009B10018A5FD5E50106804D26F8002C26FA5FD5E50206804D2678002C267A5FD5E50806804D25F8002C25F02627F54F0C4A5FFC4A54F753190127C15F531127C1522CA195E20074CA27E7429E3CA797A79A00B747A79B00B74DA797E30027E6400020262DECA195E20074CA27E7429E3CA797A79A00B747A79B00B747A79600B74DA797E30037E6400030262DED2047E2701E12D26BE240400382E7E0701DF7E4405E37E79A07A09A00B040B74BD046823A5DBEF7A2701E17E25462D267A25467A0701DFDA19C2D72275319A127C15DA19D2D7227E0401E380D748B64625471C491544C644C6481B44C6495944C644C644C644C644C644C644C6496044C644C644C644C644C644C644C644C644C644C644C644C644C644C644C64C0E497D4A744C6D44C644C64B7344C64CB144C644C644C644C644C644C644C64CB844C644C644C644C644C644C644C644C644C644C644C644C644C644C644C64F664CD54DCC4FC544C644C64ECB44C6500944C644C644C644C644C644C644C6501044C644C644C644C644C644C644C644C644C644C644C644C644C644C644C652BE502D5124531D44C644C6522344C6536144C644C644C644C644C644C644C6536844C644C644C644C644C644C644C644C644C644C644C644C644C644C644C656165385547C567544C644C6557B44C656B944C644C644C644C644C644C644C656C044C644C644C644C644C644C644C644C644C644C644C644C644C644C644C6596E56DD57D459CD44C644C658D344C65A1144C644C644C644C644C644C644C65A1844C644C644C644C644C644C644C644C644C644C644C644C644C644C644C65CC65A355B2C5D2544C644C65C2B44C65D6944C644C644C644C644C644C644C65D7044C644C644C644C644C644C644C644C644C644C644C644C644C644C644C6601E5D8D5E84607D44C644C65F8344C660C144C644C644C644C644C644C644C660C844C644C644C644C644C644C644C644C644C644C644C644C644C644C644C6CA291E50400D7E540B109CB5A42E54654889547E39007A19000B3480E90B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B350B38007A19007A19100B35DA29221E50400D7E540B1C9CB5A42E54661689547E19007A39000B3480E97E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B357E19007E19101B38000B352267966963697B6A496AE46B8E6BA96C3B6BC46C05699669AA7CB3BEB00B2814753109127C15756D10C0F175F10143E1C0D0F122C0A8C2AF236CAA2E54674B0B5850895401020408102040807531B0127C150A3209B3678E423219430036D0A8227CB2230A3B493367CB0A220932003609B2678EA5BB0005F4523380024233893467DB680968376865689368C168EF691D1241B5D228D208C240C248C238C2306D007A0301CF7E0400207A0701AF7E0400387A0701BF1241161260CF02694B1241D4D229D209C241C249C239C2316D007A0301D07E0400207A0701B17E0400387A0701C112411612610502694B1241F3D22AD20AC242C24AC23AC2326D007A0301D17E0400207A0701B37E0400387A0701C312411612613B02694B124212D22BD20BC243C24BC23BC2336D007A0301D27E0400207A0701B57E0400387A0701C512411612617102694B124231D22CD20CC244C24CC23CC2346D007A0301D37E0400207A0701B77E0400387A0701C71241161261A702694B124250D22DD20DC245C24DC23DC2356D007A0301D47E0400207A0701B97E0400387A0701C91241161261DD02694B12426FD22ED20EC246C24EC23EC2366D007A0301D57E0400207A0701BB7E0400387A0701CB12411612621302694B12428ED22FD20FC247C24FC23FC2376D007A0301D67E0400207A0701BD7E0400387A0701CD12411612624902694B7EA0D07E600F1262B6400CC0F175F101126FD9D0F1C2D7227531B1127C150A52236D005905004812417E12419AD0A8227531B2127C150A2209B2678E42237EB09C19B201CF123185D0A8227531B7127C150A2209B2678E422412353DD0A8227531B9127C150A3209B3678E42341943003E1269C2D0A8227CB2230A0B7CB420E0046D3380044930018F7EA0D8A5EFCA0BCA291262B6DA29DA0B40627531BA127C157CB430E01E6D335930018F7E3409E30A827E940400AD892D395930016F5930017F7CB430E1107E0480004C0209B00008440419B000080A0209B0678E4221F452347CB2230A0BCA19490030D59904DA19C0F175F101126FD9D0F1C2D7227E0480004C020930000C74BF19B0000C09B000081930000C7C745E700168124440CAB809B00010440219B00010DAB8800254BF7C745E700868044408800254F70930000CCAB874BF19B0000CDAB819B000081930000C0A6209B6678E3E200A627C745E700268204227CAB8746119B000087E440010594601BF09B00010440119B00010DAB88011F4522774A119B000087E440038594601BFD0A8227C747E0480004C020A6209B6678EA5FDF4A5FECA283E200A62A5EE52267E440020594601AFDA280930000C74BF19B0000C09B000087C745E7001680C4480CAB8A5ED422ADAB8800A547FCAB8A5EE522ADAB87C745E700868044402800254FD19B000081930000C7C745E70026810A5ED422842267E440008594601AF8004A5EE52287C745E70046810A5ED422942267E440008594601AF800BA5EE52297C745E700278001242ADD0A8227E0480004C020930000C74BF19B0000C194000101930000CD0A8227E0480004C020930000C74BF19B0000C194000181930000CD0A8227531B5127C157E0480004C0209B0000C444019B0000CE56EB4072309B000104EB00219B000100930000C74BF19B0000C09B0000454F719B000041930000CD0A8227531B6127C157E0480004C02E56EB407180930000C74BF19B0000C09B00004440819B000041930000C09B0000C54BF19B0000CD0A8227531B4127C157A2131127C157A4131127C150A3209B3678E4235126C5BD0A8227EB0017EA0C87C641262B640130A3209B3678EF45235C0F175F101126FD9D0F1226C8C6CD36D1A6D616DA86DEF6E366E7D753155127C15753100127C157A6131127C157A7131127C157E17017F7E27018F2D237E09B00B047A19B00B14BE140DE2380F1B3478EC7A17017F7A27018F02460F7E1409E380EB753155127C15753101127C157A6131127C157A7131127C157E1701817E2701912D237E09B00B047A19B00B14BE1411E2380F1B3478EC7A1701817A2701910249677E140DE380EB753155127C15753102127C157A6131127C157A7131127C157E1701837E2701932D237E09B00B047A19B00B14BE1415E2380F1B3478EC7A1701837A270193024CBF7E1411E380EB753155127C15753103127C157A6131127C157A7131127C157E1701857E2701952D237E09B00B047A19B00B14BE1419E2380F1B3478EC7A1701857A2701950250177E1415E380EB753155127C15753104127C157A6131127C157A7131127C157E1701877E2701972D237E09B00B047A19B00B14BE141DE2380F1B3478EC7A1701877A27019702536F7E1419E380EB753155127C15753105127C157A6131127C157A7131127C157E1701897E2701992D237E09B00B047A19B00B14BE1421E2380F1B3478EC7A1701897A2701990256C77E141DE380EB753155127C15753106127C157A6131127C157A7131127C157E17018B7E27019B2D237E09B00B047A19B00B14BE1425E2380F1B3478EC7A17018B7A27019B025A1F7E1421E380EB753155127C15753107127C157A6131127C157A7131127C157E17018D7E27019D2D237E09B00B047A19B00B14BE1429E2380F1B3478EC7A17018D7A27019D025D777E1425E380EBCAB8C0F1753102127C15E5C0540368051275CD80F530C20875F101126FD9801430C30875F101126EFD800930C40675F1021270E9D0F1DAB832753110127C15CA0BCA39CA59C2C3A921E25CE5E554C0684FE5E66CAA7E3701DB2D35BE340400384A7A3701DB7E3701D97D432D45BE4409E238407A4701D9753111127C157AB131127C151271B8A921E51FA9D4E4A924E4FCC2C3A921E23BE5E554C078B412745ADA59DA39DA0B2280298058753116127C1580ED753112127C157AB131127C159E4409E39D541271B87E3405E37D542D4380A1E5E554037812753113127C157E0F29FF0B0C7A0F29FF80A7753114127C157E0F2A030B0C7A0F2A03A9D7E4A927E4FC809D753115127C157E0F2A070B0C7A0F2A0780E5753118127C15CA09CA39CA2BC2C2A921F252E5F53382E740447E3701E17E5400409D3540437A3701E17E3701DD7D432D45BE4405E238527A4701DD7D45127316A920F522753119127C157A9131127C157A81F77A91F6E5F53382E750BCDA2BDA39DA0922804180642D536D3370B77E0401E37A0701DF7A0701DDA932F2DF853031127C1575F60080D4CA599E4405E39D541273167E3401E37D542D437A4701DD127316DA498099E5F55403781F7E0F29EF0B0C7A0F29EF809D7E0F29F70B0C7A0F29F7A9D7F4A927F4FC808A7E0F29F30B0C7A0F29F380EBE5F55403781F7E2F2A0F0B2C7A2F2A0F80347E2F2A170B2C7A2F2A17A9D7F4A927F4FC80217E2F2A130B2C7A2F2A1380EBDA2BDA1BDA0B22753128127C15CA0BCA1BCA2BC2C4A921F2B6E5F53372E740E07E0D467E1D4A7E2D4E7E3D527E85567D904D914D924D934D944D954D964D974D9868727A11F37A01F37A31F37A21F37A51F37A41F37A71F37A61F37A91F37A81F3307B1A7AB1F37AA1F37AD1F37AC1F37AF1F37AE1F37D787AF1F37AE1F3A930F5030270D6753129127C15207B0B75310A127C1575F60A8009753112127C1575F6126D007D107A0D467A0D4A7A0D4E7A0D527A0556DA2BDA1BDA0B221EB0400C7EA00AA47E0472FB9D0589047EA1E37A39A00B3480EAB440E37EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B357EA1E3E5E31B38500B35221EB0400C7EA00AA47E0474599D0589047E39A07AA1F30B3480EAB440E30B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B350B38507AA1F3F5F30B3522C2AF7E3701DB4D33683B7E0701D77E5409E39D50BD3540027D35CA397E65619964DA397E0701DB9D037A0701DB2E3701D77A3701D7BE3409E228C77E3405E37A3701D780BDD2AF22753153127C157E15638011753151127C150B08100B059E340002284D7CB220E7275407230A2B49226C7C7CB254780303037C2B9D13401A68127A15637A25657E6475377A656189240275457E6474AD80F22D139D31CA397D312D10CA19CA299924DA29DA09DA3980A27A15637E6475234D3378097CB220E72A7E6474A27A656122753152127C157E21637E09300B041B34788980D4753154127C157E15637E256580905E200754787E4475C130E6164D3368261B347E09400B047E44676320E3047E4475C9CA09CA399944DA39DA097E6474AD4D3368A689647A1563F5657E64758680997E1563E56580C4C0D0C0D1C0E0CA19A920DF12A921DF1B753101127C1553DFF71240DC800D7531FE127C157E140053024051DA19D0E0D0D1D0D03203A5CB19B180002222027642CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEBC0F17EB32A33B400028019B4011630C00875F10012762C801F30C11C75F1001276BD801430C10875F1001276BD800930C00675F10012762CD0F1DAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B22C2C07EB32A33B4020712764E02764222B401FC0276887E00007A032A337A032A34227EB32A2B54606005B4401580137EB32A2CB4050C753171127C157EB32A2EF58F2275F60022BE572A3128047E572A317A0F2A367A572A3A0276887EEF2A367EF72A3A7E072A3A4D0068217E00007EEBB0F5F3A3A5081BF46804A5B808F07AEF2A367AF72A3A753106127C157A01F622C2C1753103127C15A936E216E5F554C06807A9D7F4A927F4FC53E13F43F2880277297EB32A34B40204A9D4E422B401397E21E67C327E132A352C217A232A357E00002E042A3CE5E37A09B00B04A5DBF6A9D4E4753170127C157EB32A357EA32A32BCAB78031277C022027B29E5E6B40865A9C4E27E01E37E11E37E31E37E21E37E51E37E41E37E71E37E61E37A0F2A2B7A1F2A2F753104127C157A0131127C157A1131127C157A2131127C157A3131127C157A4131127C157A5131127C157A6131127C157A7131127C15A9D4E4A9D7F4A9C6E2127794226D007E1401027A072A3A7A032A357EB32A2B20E70F7A232A347A332A33BE072A316809227A332A347A232A337EB32A2B54E3232330E002D2E530E702D2E430E50630E403027B29543EF5F003541FC325F09077EC7584FF730279400278340279DD0279F80278D902789A027A11027A11027A14027A14027A14027A14027A14027A14027A14027A14027A1A027ACE027A17027A17027A17027A17027A17027A177EB32A2CB4062A7EB32A2D60567C0B7E132A2E7E172A2F753172127C157A0131127C157A1131127C15127B334035027673B40810753174127C157EB33FF1F5F375F60122B4001C753175127C157EB33FF230E00575F302800375F30075F30075F60222027B297EB32A2CB40035753176127C157EB32A30540FF5F17EB32A3020E709E5E130E70D7401800BE5E130E60474018002740053F180F5F375F30075F60222027B29C0F17EB32A30540F42F17EB32A2EB400457EB32A2CB40124753177127C157EB32A30540F780553E13F80377EB32A3020E70553E17F802B53E1BF8026B40317753178127C157EB32A3020E70543E180801143E140800C43E1C0D0F1753107127C1522D0F102766F7EB32A2CB40923753179127C157EB32A2EBEB33FF16811CAB8C0F11243D4D0F1DAB850767AB33FF1806DB4050875317A127C158062B4031975317B127C157EB32A2EB401557EB33FF244017AB33FF28046B4011975317C127C157EB32A2EB401397EB33FF254FE7AB33FF2802AB4072A7EB32A2D60247C0B7E132A2E7E172A2F753173127C157A0131127C157A1131127C15127B5F400302766F027B297EB32A2CB40BF675317D127C157EB32A2E7EA32A304CAB78E480DF7EB32A2CB40ADB75317E127C157EB32A2E70CFF5F375F60122027B29027B29027B297EB32A2CB404207531C3127C157E0400017E172A2D7E182A3C7A1C00007E472A31127C21027AC8B4063A7531C1127C157E5800007A5C00FE7DCA7ED72A2D7E782A3C7A7C00007E772A317531C1127C15C0A8C087C2AFA9D587127C5AD087D0A8404F804AB4001CC2AFA9D58712766FE48DEF8DEF8DEFD5E0F7C0D1CA02FFCA06000032B409127E572A2D4D556805A9D2B18003A9C2B18016B40716C2AF7E072A2F7E172A2DC0D1CA18CA38CA283202766F027B297EB32A2CB403157531C2127C157E0400017E172A2D7E572A31027673B405397531C0127C15C0A8C087C2AFA9D5877E082A3C7A0C00007E2400FE7E372A2D7E472A31127C21D087D0A87E082A3C7A0C00007E572A31027673027B29753107127C1543E1C022C0A8C087C2AFA9D587127B9E40197E082A3C7A0C0000CA0BCA49127C21DA59DA0BD087D0A8C322D087D0A822C0A8C087C2AFA9D587127B9E402B7E5800007A5C00FE7F617E782A3C7A7C00007E772A31BD7478117531C1127C15127C5A4006D087D0A8C322D087D0A8D3227E2400FE7E347FCA0B1A50C5F07D627D757D877E347FC27E1BB07E347F03B401047E347FCC7E1BB0BC0B50493E003E000A502D750B3A3069530002BD3850022D38BC1B50303E103E100A512D35694100020B1A30BD3850022D38BE44FFFF78057E1B900A494D44680CBE4400FF28047E4400FFC322D322FA
-:00047FC60001100400A2
-:014A7C1500CA087E01317A033FF0DA08227E1BC07A0BC00B140B341B4478F2227F6F7FF01BFC7C547D328008CA1BCA1BCA1BCA1B9E44001050F22E4400106806CA481B4478FA7FF689E4CA6B5ED4003F68207E8400409D8DDA6BBD873816CA797D78127C84DA7940089D7868028005C2D722DA6B43903074AA39B55555745539B52AAA74A039B555557E0400409D7050062D707D076D777C317E7B007A6B000B7C0B6CA5D9F37F161B1C7E5427107E1B10BC1068061B5478F5802C6D007C207F169F107F279F207E2B007E1B10BC0178160B2C0B1CA5DBEF7CB620E0036390304D777893C2D722D2D7220004000442080604020400020104010282080000000000000202020202040208100210040208000101080001000200020208020420047E187FBD7A1C00FE0B1A005E101FBE101A381A0A51237E187CFA7A1C00FF2D350B1A506008A5B802034EA0082280FE73
-:0000000001FF
-//**************************************************************
-//* Edgeport/4 Binary Image
-//* Generated by HEX2C v1.06
-//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
-//* This program is free software; you can redistribute it and/or modify
-//* it under the terms of the GNU General Public License as published by
-//* the Free Software Foundation; either version 2 of the License, or
-//* (at your option) any later version.
-//**************************************************************
diff --git a/firmware/edgeport/down2.H16 b/firmware/edgeport/down2.H16
deleted file mode 100644
index 2f4b4ff3ab7b..000000000000
--- a/firmware/edgeport/down2.H16
+++ /dev/null
@@ -1,29 +0,0 @@
-:000400000002000003F7
-:000200000400FFFB
-:00060000000200800245141D
-:0003000B000244A507
-:00030013000263ABDA
-:0003001B0002001BC5
-:0003002300020023B5
-:0003002B0002002BA5
-:000300330002003395
-:0003003B0002003B85
-:000300430002004375
-:0003004B0002004B65
-:000300530002675FE2
-:0003007B0002007B05
-:00070080007E14000002405253
-:0B663000001230641230FF12312F1230B080F2E52360197E14000009B101B9B4000280051419B101B9A50ABE212E78EB22C2AF7EB33FF1B40103126567D2AF22C2AF7EB33FF1B4011D74407AB391007EB3911A6CAA600FCA0BCA39CA59126424DA59DA39DA0BD2AF22C2AFE52260437E0701CBBE04038038397E0480007E200013502109A000044EA00519A000040A32095335335E5127680B09A000104EA00119A000102E040100A50ABE212E78D1752200D2AF22C2AFE52660367E20007E3001E526A55B68217CB2230A2B49320179BE34000068127EB121A54B7AB121CA19492230EF9924DA193E30A50ABE212E78D0D2AF22464F497C4CA94FD653035630595D5C8AC2AFE52460147E2000135007CAB812311CDAB8A50ABE212E78EFD2AF22CA2812354CDA2840090A2209B23533F4522422C2AFE52360147E2000135007CAB812314CDAB8A50ABE212E78EFD2AF227CB2230A2B492231578924316731D0323932A2330B337433DD34467E270179BE24000078247E24800009B20014CAB85EB01EDAB8680BCA197D121249457D21DA1930E6187E6000801EBE270189680D7A2701897E609C7A6301B980277E6301B9A5BE001F7E60017EB0007EA0C81261364011752FB3127335C2186C007A0301B9126486227E27017BBE24000078247E24810009B20014CAB85EB01EDAB8680BCA197D12124C727D21DA1930E6187E6000801EBE27018B680D7A27018B7E609C7A6301BA80277E6301BAA5BE001F7E60017EB0007EA0C81261364011752FB3127335C2196C007A0301BA126486227E27017DBE24000078247E24820009B20014CAB85EB01EDAB8680BCA197D12124F9F7D21DA1930E6187E6000801EBE27018D680D7A27018D7E609C7A6301BB80277E6301BBA5BE001F7E60017EB0007EA0C81261364011752FB3127335C21A6C007A0301BB126486227E27017FBE24000078247E24830009B20014CAB85EB01EDAB8680BCA197D121252CC7D21DA1930E6187E6000801EBE27018F680D7A27018F7E609C7A6301BC80277E6301BCA5BE001F7E60017EB0007EA0C81261364011752FB3127335C21B6C007A0301BC126486227E270181BE24000078247E24840009B20014CAB85EB01EDAB8680BCA197D121255F97D21DA1930E6187E6000801EBE270191680D7A2701917E609C7A6301BD80277E6301BDA5BE001F7E60017EB0007EA0C81261364011752FB3127335C21C6C007A0301BD126486227E270183BE24000078247E24850009B20014CAB85EB01EDAB8680BCA197D121259267D21DA1930E6187E6000801EBE270193680D7A2701937E609C7A6301BE80277E6301BEA5BE001F7E60017EB0007EA0C81261364011752FB3127335C21D6C007A0301BE126486227E270185BE24000078247E24860009B20014CAB85EB01EDAB8680BCA197D12125C537D21DA1930E6187E6000801EBE270195680D7A2701957E609C7A6301BF80277E6301BFA5BE001F7E60017EB0007EA0C81261364011752FB3127335C21E6C007A0301BF126486227E270187BE24000078247E24870009B20014CAB85EB01EDAB8680BCA197D12125F807D21DA1930E6187E6000801EBE270197680D7A2701977E609C7A6301C080277E6301C0A5BE001F7E60017EB0007EA0C81261364011752FB3127335C21F6C007A0301C012648622C2AF7E0701CBBE040000782874207AB391007EB3911530E51B7EB3911ABEB03F380C85312F12733574807AB3911E74207AB39115D2AF22353B36E83700371B37B6384E386938FB388438C57CB3BEB0092822752F0912733575570274207AB3910074017AB3911174407AB3910074017AB3911122C0A8C2AF236CAA2E5434E60B585089540102040810204080752FB01273350A2209B235334224D0A8227CB2230A3B4933355789343567359535C335F1361F364D367B36A91241BAD228D208C240C248C238C2306D007A0301B97E0400207A0701997E0400387A0701A9124127125FB70236D71241D7D229D209C241C249C239C2316D007A0301BA7E0400207A07019B7E0400387A0701AB124127125FE00236D71241F4D22AD20AC242C24AC23AC2326D007A0301BB7E0400207A07019D7E0400387A0701AD1241271260090236D7124211D22BD20BC243C24BC23BC2336D007A0301BC7E0400207A07019F7E0400387A0701AF1241271260320236D712422ED22CD20CC244C24CC23CC2346D007A0301BD7E0400207A0701A17E0400387A0701B112412712605B0236D712424BD22DD20DC245C24DC23DC2356D007A0301BE7E0400207A0701A37E0400387A0701B31241271260840236D7124268D22ED20EC246C24EC23EC2366D007A0301BF7E0400207A0701A57E0400387A0701B51241271260AD0236D7124285D22FD20FC247C24FC23FC2376D007A0301C07E0400207A0701A77E0400387A0701B71241271260D60236D77EA0D07E600F1261364005126486C2D722752FB11273350A52236D005905003212418312419FD0A822752FB21273350A2209B2353342237EB09C19B201B912314CD0A8227E0480004C020930000C74BF19B0000C09B000081930000C7C745E700168124440CAB809B00010440219B00010DAB8800254BF7C745E700868044408800254F70930000CCAB874BF19B0000CDAB819B000081930000C0A6209B635333E200A627C745E700268204227CAB8746119B000087E440010594601A909B00010440119B00010DAB88011F4522774A119B000087E440038594601A9D0A8227C747E0480004C020930000C74BF19B0000C09B000087C745E7001680444808002547F7C745E700868044402800254FD19B000081930000C0A6209B63533A5FDF4A5FECA283E200A62DA287C745E70026810A5ED422842267E440008594601998004A5EE52287C745E70046810A5ED422942267E440008594601998015A5EE52297C745E7002780A52267E440020594601991242A2D0A8227E0480004C020930000C74BF19B0000C194000101930000CD0A8227E0480004C020930000C74BF19B0000C194000181930000CD0A822752FB51273357E0480004C0209B0000C444019B0000CE558B4072309B000104EB00219B000100930000C74BF19B0000C09B0000454F719B000041930000CD0A822752FB61273357E0480004C02E558B407180930000C74BF19B0000C09B00004440819B000041930000C09B0000C54BF19B0000CD0A822752FB41273357A212F1273357A412F1273357EB0017EA0C87C64126136126486D0A822392E397539BC3A033A4A3A913AD83B1F752F55127335752F001273357A612F1273357A712F1273357E1701697E2701792D237E09B00B047A19B00B14BE14082C380F1B3478EC7A1701697A27017902464F7E14042D80EB752F55127335752F011273357A612F1273357A712F1273357E17016B7E27017B2D237E09B00B047A19B00B14BE140C2C380F1B3478EC7A17016B7A27017B02497C7E14082D80EB752F55127335752F021273357A612F1273357A712F1273357E17016D7E27017D2D237E09B00B047A19B00B14BE14102C380F1B3478EC7A17016D7A27017D024CA97E140C2D80EB752F55127335752F031273357A612F1273357A712F1273357E17016F7E27017F2D237E09B00B047A19B00B14BE14142C380F1B3478EC7A17016F7A27017F024FD67E14102D80EB752F55127335752F041273357A612F1273357A712F1273357E1701717E2701812D237E09B00B047A19B00B14BE14182C380F1B3478EC7A1701717A2701810253037E14142D80EB752F55127335752F051273357A612F1273357A712F1273357E1701737E2701832D237E09B00B047A19B00B14BE141C2C380F1B3478EC7A1701737A2701830256307E14182D80EB752F55127335752F061273357A612F1273357A712F1273357E1701757E2701852D237E09B00B047A19B00B14BE14202C380F1B3478EC7A1701757A27018502595D7E141C2D80EB752F55127335752F071273357A612F1273357A712F1273357E1701777E2701872D237E09B00B047A19B00B14BE14242C380F1B3478EC7A1701777A270187025C8A7E14202D80EB64
-:33354000007E0400017E147FF87E2400FE7D310B1A501B0A507E14401B0240747EF8005975B0DF7EB0017AB390007EF4403002408B12744EF52E7AA12D7A1158126B021240EB7EB33FF16003124379126BDED2AF0230007E0400FF7E1840607A1C000189187EB0017AB394007AB32C357EB0017AB3930089087E0400FF7E1840827A1C000189187EB0007AB3930089087E0800207E4404007E40007EE4409D0273507E0801597E442ADD7E40007EE440AF0273507E0800597E4401007E40537EE440C10273507557017556007E040008755458755508755108755301758901758A01758C00D28C7E0400027A054289F475B77F75B87F75B30175B201D2A92275B0DFE4D5E0FD75B0EF7E2480007E112E7EA00819A200102E240100A5D9F27E20001241830B20BE212E78F6227E0480004C0274BF19B0000C741019B00008748019B0000C7E54000219A0000419B00000740319B0000C7407206802740F19B00004306B1774BF19B0000C7428206802742019B00004740319B0000C74A719B00008740C19B00010227E0480004C02E419B0000409B00010540819B0001074A719B00008227CB2230A2B492241AA892441BA41D741F44211422E424B42684285C210C218C2087E04042D7A0701597A0701696D007A0701797A07018922C211C219C2097E04082D7A07015B7A07016B6D007A07017B7A07018B22C212C21AC20A7E040C2D7A07015D7A07016D6D007A07017D7A07018D22C213C21BC20B7E04102D7A07015F7A07016F6D007A07017F7A07018F22C214C21CC20C7E04142D7A0701617A0701716D007A0701817A07019122C215C21DC20D7E04182D7A0701637A0701736D007A0701837A07019322C216C21EC20E7E041C2D7A0701657A0701756D007A0701857A07019522C217C21FC20F7E04202D7A0701677A0701776D007A0701877A070197227CB2230A2B492242AD892442BD42D442EB4302431943304347435E304007205804C228800C304807205004C2288002D22822304107205904C229800C304907205104C2298002D22922304207205A04C22A800C304A07205204C22A8002D22A22304307205B04C22B800C304B07205304C22B8002D22B22304407205C04C22C800C304C07205404C22C8002D22C22304507205D04C22D800C304D07205504C22D8002D22D22304607205E04C22E800C304E07205604C22E8002D22E22304707205F04C22F800C304F07205704C22F8002D22F224466438ABEB002400122230A5B495543759954D3227EB0007AB394007AB32C3512447A7E04282D7A0701C17A0701C37E04242D7A0701C77A0701C97E04667F7A054B74207AB3910074607AB3911C74127AB3910674407AB39107741E7AB3911074487AB3911274107AB39113743F7AB3911474407AB3910074607AB3911C74147AB3910674407AB3910774167AB3911074087AB3911174207AB39113743F7AB3911474607AB3910074607AB3911C74167AB3910674207AB39107742F7AB3911074487AB3911274107AB39113743F7AB3911474027AB39106740F7AB391071240FA7E200012419F0B20BE212E78F6D2A8227EB0017AB394007AB32C3512447A75B0DFC2A82274027AB3910674017AB391077E20047CB2C2D7131313137AB3910074607AB3911C74027AB39112A5DAE522CA0912300E100134D5514074007AB3910074027AB391067EB3910774037AB391067EB391077EB391147EB391046353017E00542E0153A5E6F551801220021D755300855451D2027403800D30020EC2027E00562E0153A5E67AB39000DA0932456F458B45A745C345DF45FB46174633C0D0C0D1C0E0C0F0CA0BCA1BCA2BD201752F891273357EB3900060287E1480007E0000135013CA0BCA597CB0230A2B492245049924DA59DA0BA50AA508BE012E78E180D2300405C204126486DA2BDA1BDA0BD0F0D0E0D0D1D0D03209B1000820E014752F80127335543E0A5B7E4400FF695261AB89542209B1000820E014752F81127335543E0A5B7E4400FF695261EB89542209B1000820E014752F82127335543E0A5B7E4400FF6952622B89542209B1000820E014752F83127335543E0A5B7E4400FF6952626B89542209B1000820E014752F84127335543E0A5B7E4400FF695262AB89542209B1000820E014752F85127335543E0A5B7E4400FF695262EB89542209B1000820E014752F86127335543E0A5B7E4400FF6952632B89542209B1000820E014752F87127335543E0A5B7E4400FF6952636B89542210080122202803D20822752FA01273357E1480008006202803D2082209B10014CAB85EB01EDAB8680312494530300620E64FD2082230E602D2607E3701797E2701999D3240317D022E05327A05327A3701797E3701597D432D42BE44082C38687A470159752F941273357A512F1273351269F01060C422C2602D2368786D33801A7E270179BE240000686ABE27019928047E2701997E3701799D327D022E05327A05327A3701797E3701597D432D42BE44082C38137A470159752F941273357A512F1273350269F0752F941273357A512F1273359E44082D9D241269F07E34042D7D242D437A4701591269F0BE252078030246C222D2087E04042D7A0701597A070169752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701A92E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2400002E2701A91B38200B357A512F127335026A63752F9912733509B1000454FA19B1000430380A09B1001054FE19B10010D21022807F7A512F1273359E44282D9D247E6400002E6701A99E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344007A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E702481E752F9912733509B1000454FA19B1000430380A09B1001054FE19B10010D21022DAB830E0D8BD326807CAB812481EDAB802494509B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D2588002C258A5FD5E50806804D2508002C2501242BD026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22024872752F9512733522752F961273352210090122202903D20922752FA11273357E1481008006202903D2092209B10014CAB85EB01EDAB86803124C7230310620E64FD2092230E602D2617E37017B7E27019B9D3240317D022E05347A05347A37017B7E37015B7D432D42BE440C2C38687A47015B752F941273357A512F1273351269F01061C422C2612D2368786D33801A7E27017BBE240000686ABE27019B28047E27019B7E37017B9D327D022E05347A05347A37017B7E37015B7D432D42BE440C2C38137A47015B752F941273357A512F1273350269F0752F941273357A512F1273359E440C2D9D241269F07E34082D7D242D437A47015B1269F0BE252078030249EF22D2097E04082D7A07015B7A07016B752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701AB2E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2401002E2701AB1B38200B357A512F127335026A63752F9912733509B1000454FA19B1000430390A09B1001054FE19B10010D21122807F7A512F1273359E44282D9D247E6401002E6701AB9E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344017A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7024B4B752F9912733509B1000454FA19B1000430390A09B1001054FE19B10010D21122DAB830E0D8BD326807CAB8124B4BDAB8024C7209B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D2598002C259A5FD5E50806804D2518002C2511242D4026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22024B9F752F9512733522752F9612733522100A0122202A03D20A22752FA21273357E1482008006202A03D20A2209B10014CAB85EB01EDAB86803124F9F30320620E64FD20A2230E602D2627E37017D7E27019D9D3240317D022E05367A05367A37017D7E37015D7D432D42BE44102C38687A47015D752F941273357A512F1273351269F01062C422C2622D2368786D33801A7E27017DBE240000686ABE27019D28047E27019D7E37017D9D327D022E05367A05367A37017D7E37015D7D432D42BE44102C38137A47015D752F941273357A512F1273350269F0752F941273357A512F1273359E44102D9D241269F07E340C2D7D242D437A47015D1269F0BE25207803024D1C22D20A7E040C2D7A07015D7A07016D752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701AD2E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2402002E2701AD1B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303A0A09B1001054FE19B10010D21222807F7A512F1273359E44282D9D247E6402002E6701AD9E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344027A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7024E78752F9912733509B1000454FA19B10004303A0A09B1001054FE19B10010D21222DAB830E0D8BD326807CAB8124E78DAB8024F9F09B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25A8002C25AA5FD5E50806804D2528002C2521242EB026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22024ECC752F9512733522752F9612733522100B0122202B03D20B22752FA31273357E1483008006202B03D20B2209B10014CAB85EB01EDAB868031252CC30330620E64FD20B2230E602D2637E37017F7E27019F9D3240317D022E05387A05387A37017F7E37015F7D432D42BE44142C38687A47015F752F941273357A512F1273351269F01063C422C2632D2368786D33801A7E27017FBE240000686ABE27019F28047E27019F7E37017F9D327D022E05387A05387A37017F7E37015F7D432D42BE44142C38137A47015F752F941273357A512F1273350269F0752F941273357A512F1273359E44142D9D241269F07E34102D7D242D437A47015F1269F0BE2520780302504922D20B7E04102D7A07015F7A07016F752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701AF2E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2403002E2701AF1B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303B0A09B1001054FE19B10010D21322807F7A512F1273359E44282D9D247E6403002E6701AF9E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344037A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E70251A5752F9912733509B1000454FA19B10004303B0A09B1001054FE19B10010D21322DAB830E0D8BD326807CAB81251A5DAB80252CC09B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25B8002C25BA5FD5E50806804D2538002C253124302026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB220251F9752F9512733522752F9612733522100C0122202C03D20C22752FA41273357E1484008006202C03D20C2209B10014CAB85EB01EDAB868031255F930340620E64FD20C2230E602D2647E3701817E2701A19D3240317D022E053A7A053A7A3701817E3701617D432D42BE44182C38687A470161752F941273357A512F1273351269F01064C422C2642D2368786D33801A7E270181BE240000686ABE2701A128047E2701A17E3701819D327D022E053A7A053A7A3701817E3701617D432D42BE44182C38137A470161752F941273357A512F1273350269F0752F941273357A512F1273359E44182D9D241269F07E34142D7D242D437A4701611269F0BE2520780302537622D20C7E04142D7A0701617A070171752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701B12E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2404002E2701B11B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303C0A09B1001054FE19B10010D21422807F7A512F1273359E44282D9D247E6404002E6701B19E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344047A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E70254D2752F9912733509B1000454FA19B10004303C0A09B1001054FE19B10010D21422DAB830E0D8BD326807CAB81254D2DAB80255F909B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25C8002C25CA5FD5E50806804D2548002C254124319026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22025526752F9512733522752F9612733522100D0122202D03D20D22752FA51273357E1485008006202D03D20D2209B10014CAB85EB01EDAB8680312592630350620E64FD20D2230E602D2657E3701837E2701A39D3240317D022E053C7A053C7A3701837E3701637D432D42BE441C2C38687A470163752F941273357A512F1273351269F01065C422C2652D2368786D33801A7E270183BE240000686ABE2701A328047E2701A37E3701839D327D022E053C7A053C7A3701837E3701637D432D42BE441C2C38137A470163752F941273357A512F1273350269F0752F941273357A512F1273359E441C2D9D241269F07E34182D7D242D437A4701631269F0BE252078030256A322D20D7E04182D7A0701637A070173752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701B32E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2405002E2701B31B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303D0A09B1001054FE19B10010D21522807F7A512F1273359E44282D9D247E6405002E6701B39E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344057A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E70257FF752F9912733509B1000454FA19B10004303D0A09B1001054FE19B10010D21522DAB830E0D8BD326807CAB81257FFDAB802592609B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25D8002C25DA5FD5E50806804D2558002C255124330026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22025853752F9512733522752F9612733522100E0122202E03D20E22752FA61273357E1486008006202E03D20E2209B10014CAB85EB01EDAB86803125C5330360620E64FD20E2230E602D2667E3701857E2701A59D3240317D022E053E7A053E7A3701857E3701657D432D42BE44202C38687A470165752F941273357A512F1273351269F01066C422C2662D2368786D33801A7E270185BE240000686ABE2701A528047E2701A57E3701859D327D022E053E7A053E7A3701857E3701657D432D42BE44202C38137A470165752F941273357A512F1273350269F0752F941273357A512F1273359E44202D9D241269F07E341C2D7D242D437A4701651269F0BE252078030259D022D20E7E041C2D7A0701657A070175752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701B52E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2406002E2701B51B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303E0A09B1001054FE19B10010D21622807F7A512F1273359E44282D9D247E6406002E6701B59E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344067A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7025B2C752F9912733509B1000454FA19B10004303E0A09B1001054FE19B10010D21622DAB830E0D8BD326807CAB8125B2CDAB8025C5309B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25E8002C25EA5FD5E50806804D2568002C256124347026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22025B80752F9512733522752F9612733522100F0122202F03D20F22752FA71273357E1487008006202F03D20F2209B10014CAB85EB01EDAB86803125F8030370620E64FD20F2230E602D2677E3701877E2701A79D3240317D022E05407A05407A3701877E3701677D432D42BE44242C38687A470167752F941273357A512F1273351269F01067C422C2672D2368786D33801A7E270187BE240000686ABE2701A728047E2701A77E3701879D327D022E05407A05407A3701877E3701677D432D42BE44242C38137A470167752F941273357A512F1273350269F0752F941273357A512F1273359E44242D9D241269F07E34202D7D242D437A4701671269F0BE25207803025CFD22D20F7E04202D7A0701677A070177752F94127335752F0012733522752F92127335D20409B10014CAB85482DAB878687E3701CB7E2701B72E2400022D32BE34040038347D022E05307A05307A3701CB7E3701C97D432D42BE44282C383C7A4701C97E2407002E2701B71B38200B357A512F127335026A63752F9912733509B1000454FA19B10004303F0A09B1001054FE19B10010D21722807F7A512F1273359E44282D9D247E6407002E6701B79E24000240171B38600B35126A637E34242D7D242D437A4701C9026A637A39C07E34242D7A39D00B341B4480E59D327CB6540F23232344077A69B07A79700B35752F931273357A712F127335BD04682B7A0701C97E4701CB2D437A4701CB2E35307A353022D20409B1001420E013227E04242D80287E04242D802A7E04242D80CF7E0701CB7E2403FE9D2028407E0701C97E44282D7D600B04BD0468D27D700B04BD0468D07D549D50BD2540027D257D3209B10014CAB8541FB40131DAB87E19B07A09B00B041B2478E7025E59752F9912733509B1000454FA19B10004303F0A09B1001054FE19B10010D21722DAB830E0D8BD326807CAB8125E59DAB8025F8009B100187EA088752F90127335F52F127335A5FD5E500A681DA5FD5E50206804D25F8002C25FA5FD5E50806804D2578002C25712435E026113752F9112733509B100147AB12F12733520E008D2047EA080026113D20430E1067EA080126113CAB85EB01CDAB868127EA0C00961000012613609B1001420E0DB22025EAD752F9512733522752F96127335227C027E1480004C2009B10018A5FD5E50206804D2588002C258A5FD5E50806804D2508002C2500260FF7C027E1480004C2009B10018A5FD5E50206804D2598002C259A5FD5E50806804D2518002C2510260FF7C027E1480004C2009B10018A5FD5E50206804D25A8002C25AA5FD5E50806804D2528002C2520260FF7C027E1480004C2009B10018A5FD5E50206804D25B8002C25BA5FD5E50806804D2538002C2530260FF7C027E1480004C2009B10018A5FD5E50206804D25C8002C25CA5FD5E50806804D2548002C2540260FF7C027E1480004C2009B10018A5FD5E50206804D25D8002C25DA5FD5E50806804D2558002C2550260FF7C027E1480004C2009B10018A5FD5E50206804D25E8002C25EA5FD5E50806804D2568002C2560260FF7C027E1480004C2009B10018A5FD5E50206804D25F8002C25FA5FD5E50806804D2578002C2570260FF54F0C4A5FFC4A54F752F90127335F52F12733522CA195E20074CA27E742C2DCA797A79A00B747A79B00B74DA797E30027E64000202615ECA195E20074CA27E742C2DCA797A79A00B747A79B00B747A79600B74DA797E30037E64000302615ED2047E2701CB2D26BE240400382E7E0701C97E44282D7E79A07A09A00B040B74BD046823A5DBEF7A2701CB7E25302D267A25307A0701C9DA19C2D722752F9A127335DA19D2D7227E04242D80D748F14665475F492A452A452A4856452A496E452A452A452A452A452A452A452A4975452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A4C1E49924A8C4C57452A452A4B83452A4C9B452A452A452A452A452A452A452A4CA2452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A4F4B4CBF4DB94F84452A452A4EB0452A4FC8452A452A452A452A452A452A452A4FCF452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A52784FEC50E652B1452A452A51DD452A52F5452A452A452A452A452A452A452A52FC452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A55A55319541355DE452A452A550A452A5622452A452A452A452A452A452A452A5629452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A58D256465740590B452A452A5837452A594F452A452A452A452A452A452A452A5956452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A5BFF59735A6D5C38452A452A5B64452A5C7C452A452A452A452A452A452A452A5C83452A452A452A452A452A452A452A452A452A452A452A452A452A452A452A5F2C5CA05D9A5F65452A452A5E91452A5FA9452A452A452A452A452A452A452A5FB0452A452A452A452A452A452A452A452A452A452A452A452A452A452A452ACAB8752F021273357EB3910320E52030E005126B05803030E105126486802830E2051263F5802030E31D12656180187EB3910430E10302675F30E605126C6A800620E203020080DAB832752F10127335CA0BCA39CA5974407AB391007EB3911A6CAABEB040280A126424DA59DA39DA0B2274207AB3911480F17E3701C52D35BE340400382F7A3701C57E3701C37D432D45BE442C2C38257A4701C3752F111273357AB12F12733512679F74207AB3911412663022752F1612733580F4752F121273357AB12F1273359E442C2D9D5412679F7E34282D7D542D4380BC752F18127335CA09CA39CA2B74207AB391007E63911A74107AB391147EB0809CB660386CAA7E3701CB9D3540377A3701CB7E3701C77D432D45BE44282C383B7A4701C77D451268D47EB3911E20E513752F191273357A912F127335DA2BDA39DA092280342D536D33600280C17E04242D7A0701C97A0701C780E1CA599E44282D9D541268D47E34242D7D542D437A4701C71268D4DA4980B07E0F2C3E0B0C7A0F2C3E74207AB3911E74607AB3911C74027AB3911280A57E2F2C5E0B2C7A2F2C5E74207AB3911E74607AB3911C74027AB39112801FDA2BDA1BDA0B22752F28127335CA0BCA1BCA2B74607AB3910074107AB391147EB3911A70DB7E0D307E1D347E2D387E3D3C7E85407D904D914D924D934D944D954D964D974D9868B87A1391177A0391177A3391177A2391177A5391177A4391177A7391177A6391177A9391177A8391173073227AB391177AA391177AD391177AC391177AF391177AE391177D787AF391177AE391177EB3911E30E50302653C752F29127335207308752F0A1273358006752F1212733574807AB3911E6D007D107A0D307A0D347A0D387A0D3C7A0540DA2BDA1BDA0B227E3701C54D33683B7E0701C17E542C2D9D50BD3540027D35CA397E654B9964DA397E0701C59D037A0701C52E3701C17A3701C1BE342C2C28C77E34282D7A3701C180BD22752F531273357E154D8011752F511273350B08100B059E340002284D7CB220E7275407230A2B4922391E7CB254780303037C2B9D13401A68127A154D7A254F7E6467097A654B89240267177E64667F80F22D139D31CA397D312D10CA19CA299924DA29DA09DA3980A27A154D7E6466F54D3378097CB220E72A7E6466747A654B22752F521273357E214D7E09300B041B34788980D4752F541273357E154D7E254F80905E200754787E44677D30E6164D3368261B347E09400B047E4434FA20E3047E446785CA09CA399944DA39DA097E64667F4D3368A689647A154DF54F7E64675880997E154DE54F80C4C0D0C0D1C0E0CA19752FFE1273357E140053024052DA19D0E0D0D1D0D03203A5CB19B1800022227E2400007FE17EA002A47E0468B19D057EB0287AB395008904CA29B480E27E2400007FE17E00287A039500E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A37E00007A039500DA29227E2400007FE17EA002A47E0469E69D057EB0387AB395008904CA29B480E27E2400007FE17E00387A039500E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A37E00007A039500DA2922CA29CA19CA587E2400007FE1DA587E5402209CB5A47E50305E20072C527A5395002E546A178954E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A37E00007A039500DA19DA2922CA19CA587E2400007FE1DA587E5402389CB5A47E50205E20072C527A5395002E546A888954E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A3E0A37E00007A039500DA1922026BA8CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEB74007AB391007EB32C7FB40002801CB401197EB3911454146805126B6C80237EB3911430E51C126CAA80177EB3911430E505126CAA800B7EB3911454146803126B6CDAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B2220E419752F0A1273357EB32C7E700A7EB32C7FB4011F026C040271F2752F0B12733574147AB391147EB32C7FB4020C126BB4026BA874047AB39114227E00007A032C7F7A032C80227EB32C7654606005B4401E801C7EB32C77B40515752F711273357EB32C797EA0017AA391067AB391072274007AB3910074107AB3911222BE572C7C28047E572C7C7A0F2C827A572C8674107AB391122274007AB391007EB3911A70537EB3911420E44C7EEF2C827EF72C867E072C864D0068217E0000E07AB39117A3A5081BF46806A5B810F080197EB0007AB32C7FBE0010680D7EB0007AB32C7F74807AB3911E7AEF2C827AF72C86752F0612733574047AB3911422CA0BCA1BCA2BCA3BCA4BCA5BCA6BCA7BCAEB752F0312733574007AB32C7E74007AB3910074017AB39112126D19DAEBDA7BDA6BDA5BDA4BDA3BDA2BDA1BDA0B22752F031273357EB32C80B4021174007AB32C807AB32C7F74207AB3911422B401467EB3910420E6427E23911A7C327E132C812C217A232C817E00002E042C887EB391167A09B00B04A5DBF474207AB39114752F701273357EB32C817EA32C7DBCAB7803126DB9220271F2DA59026C7C74E07AB391007E0391107E1391117E3391127E2391137E5391147E4391157E7391167E6391177A0F2C767A1F2C7A752F041273357A012F1273357A112F1273357A212F1273357A312F1273357A412F1273357A512F1273357A612F1273357A712F12733574007AB3910074407AB39104126D8D226D007E1401027A072C867A032C817EB32C7620E70F7A232C807A332C7FBE072C7C6809227A332C807A232C7F7EB32C7654E3232330E002D2E530E702D2E430E50630E4030271F2543EF5F003541FC325F0906DE57584FF73026FA0026E2D027039027054026F37026EC202708502708502708802708802708802708802708802708802708802708802708E02716002708B02708B02708B02708B02708B02708B74007AB3910074607AB3911C7EB32C77B4062A7EB32C7860797C0B7E132C797E172C7A752F721273357A012F1273357A112F1273351272374058026BEBB4081C752F741273357EB33FF17E082C887A0C00007A0BB07E540001026BEBB40033752F751273357E082C887A0C0000CA0B7EB33FF230E00774027A0BB0800574007A0BB00B1474007A0BB07E540002DA0B026BEB0271F274007AB3910074607AB3911C7EB32C77B4005F752F761273357EB32C7B540FB402057EB0608017B400057EB000800F7EB32C7B20E7057EB04080037EB0207AB391007EB3911130E0047401800274007E082C887A0C0000CA0B7A0BB00B1474007A0BB074007AB391007E540002DA0B026BEB0271F27EB32C7B540FB402057EB0608017B400057EB000800F7EB32C7B20E7057EB04080037EB0207AB391007EB32C79B400267EB32C77B4010E752F7712733574017AB39112801BB4030E752F7812733574017AB39111800A74007AB391001271F22274007AB39100026BDE7EB32C77B4091F752F791273357EB32C79BEB33FF1680DCAB8124379DAB850767AB33FF1806DB40508752F7A1273358062B40319752F7B1273357EB32C79B401557EB33FF244017AB33FF28046B40119752F7C1273357EB32C79B401397EB33FF254FE7AB33FF2802AB4072A7EB32C7860247C0B7E132C797E172C7A752F731273357A012F1273357A112F1273351272714003026BDE0271F27EB32C77B40BF6752F7D1273357EB32C797EA32C7B4CAB78E480DF74007AB3910074607AB3911C7EB32C77B40ACF752F7E1273357EB32C7970C37E082C887A0C00007A0BB07E540001026BEB0271F20271F20271F27EB32C77B40420752FC31273357E0400017E172C787E182C887A1C00007E472C7C12734102715AB40642752FC11273357E5800007A5C00FE7DCA7ED72C787E782C887A7C00007E772C7C752FC1127335C0A8C2AF7E40017A43940012737A7E432C357A439400D0A840658060B40024C2AF7EB0017AB394007AB32C35126BDEE48DEF8DEF8DEFD5E0F7C0D1CA02FFCA06000032B4092074037AB391067E2391077E572C784D5568054E200280035E20FD7A2391078016B40716C2AF7E072C7A7E172C78C0D1CA18CA38CA2832026BDE0271F274007AB3910074607AB3911C7EB32C77B40315752FC21273357E0400017E172C787E572C7C026BEBB40541752FC0127335C0A8C2AF7E40017A4394007E082C887A0C00007E2400FE7E372C787E472C7C1273417E432C357A439400D0A87E082C887A0C00007E572C7C026BEBB401207E00007E1001752F721273357A012F1273357A112F1273351272374003026BEB0271F2752F071273357EB0027AB3900074007AB3910074407AB3911574017AB391117EB391155460BEB040680874207AB3911580ED74017AB3911274047AB3911474FF7AB32C7E22C0A8C2AF7E40017A4394001272BE401F7E082C887A0C0000CA0BCA49127341DA59DA0B7E432C357A439400D0A8C3227E432C357A439400D0A822C0A8C2AF7E40017A4394001272BE40317E5800007A5C00FE7F617E782C887A7C00007E772C7CBD747817752FC112733512737A400C7E432C357A439400D0A8C3227E432C357A439400D0A8D3227E2400FE7E347FCA0B1A50C5F07D627D757D877E347FC27E1BB07E347F03B401047E347FCC7E1BB0BC0B50493E003E000A502D750B3A3069530002BD3850022D38BC1B50303E103E100A512D35694100020B1A30BD3850022D38BE44FFFF78057E1B900A494D44680CBE4400FF28047E4400FFC322D32274
-:00047FC60002000300B2
-:0148733500CA087E012F7A033FF0DA08227E1BC07A0BC00B140B341B4478F2227F6F7FF01BFC7C547D328008CA1BCA1BCA1BCA1B9E44001050F22E4400106806CA481B4478FA7FF689E4CA6B5ED4003F68207E8400409D8DDA6BBD873816CA797D781273A4DA7940089D7868028005C2D722DA6B7EC0037ED0007AD3900074AA39B55555745539B52AAA74A039B555557E0400409D7050062D707D076D777C317E7B007A6B000B7C0B6CA5D9F37F161B1C7E5427107E1B10BC1068061B5478F5802F6D007C207F169F107F279F207E2B007E1B10BC0178190B2C0B1CA5DBEF7CB620E0066CDC7AD390004D777890C2D722D2D7220004000400000604020400020104010200000000000000000202020202040008100210040208000101087E187FBD7A1C00FE0B1A005E101FBE1014381A0A51237E1874247A1C00FF2D350B1A506008A5B802034EA0082280FECB
-:0000000001FF
-//**************************************************************
-//* Edgeport/4 Binary Image
-//* Generated by HEX2C v1.06
-//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
-//* This program is free software; you can redistribute it and/or modify
-//* it under the terms of the GNU General Public License as published by
-//* the Free Software Foundation; either version 2 of the License, or
-//* (at your option) any later version.
-//**************************************************************
diff --git a/firmware/edgeport/down3.bin.ihex b/firmware/edgeport/down3.bin.ihex
deleted file mode 100644
index 7935e520878a..000000000000
--- a/firmware/edgeport/down3.bin.ihex
+++ /dev/null
@@ -1,815 +0,0 @@
-:100000000450000087329A0227BF0221B20000008C
-:10001000000002001E0000000000000000000000C0
-:10002000000002011A853F8C85408AC0E0C0D0C024
-:10003000F0C082C083C000C001C002C003C004C0C1
-:1000400005C006C007E53E2408F8E6602BE53E241F
-:1000500010F8A681E53E75F021A42405F582E4346C
-:10006000F8F583788CE58104C398F9942240030263
-:1000700011DCE6F008A3D9FA7408253EF8053E081D
-:10008000E65480700CE53EB407F37808753E0080B6
-:10009000EFE53E2410F88681E53E75F021A42405A5
-:1000A000F582E434F8F583788CE58104C398F9E0AF
-:1000B000F608A3D9FAD007D006D005D004D003D0D3
-:1000C00002D001D000D083D082D0F0D0D0D0E032A6
-:1000D00030014D30B44810004590FF08E05420F83E
-:1000E00090FF48E05420F990FF10E05420FA90FF70
-:1000F00050E05420FB7400F58274F8F583E0C8F0FA
-:100100006860027E04A3E0C9F06960027E04A3E097
-:10011000CAF06A60027E04A3E0CBF06B60027E044A
-:1001200022C0E0C0D0C0F0C082C083C000C001C007
-:1001300002C003C004C005C006C0077415F5827470
-:10014000F9F583E060237466F58274F9F583E014B1
-:10015000F0701674FFF0741CF58274F9F583E0609A
-:100160000414F07004C29080FC90FF937481F0E559
-:100170008194FD40030211DC85418D85428B74B270
-:10018000F58274FAF583E0B4011BC082C08390FF4E
-:100190004AE030E72C90FF4EE030E725D083D08254
-:1001A0007402F08020B4021DC082C08390FF7AE008
-:1001B00030E70512284E8009D083D0827403F08086
-:1001C00004D083D082A3E0B4011BC082C08390FF1F
-:1001D00052E030E72C90FF56E030E725D083D08204
-:1001E0007402F08025B40222C082C08390FF7AE0BE
-:1001F00030E70512284E8009D083D0827403F08046
-:1002000009D083D08280030202907416F58274F9BB
-:10021000F583E02004F12002033001EB7419F5822C
-:1002200074F9F583E014FCF0A3E0FDA3E0FE6404A0
-:10023000700FEC70627E011200C97C0A7DFA020226
-:10024000611200C9EE6404601DEC704B7C0AED1471
-:10025000FD7015EE640260077E027D320202617E4F
-:10026000017DFA0202617C0A7419F58274F9F58342
-:10027000ECF0A3EDF0A3EEF014601820E10F2001E4
-:1002800006D2B1C2B08010C2B1D2B0800AC2B1C22F
-:10029000B08004D2B0D2B1781979097A07E7700436
-:1002A000A600800BE6600816E67004E74480F708B5
-:1002B00009DAEAE53D601314F53D700EE53E2408C9
-:1002C000F87600121157D28CD28DD007D006D00507
-:1002D000D004D003D002D001D000D083D082D0F09F
-:1002E000D0D0D0E03290FF04E090FAB9F090FF0651
-:1002F000E0FCA3E0FAECFFEAFEEFC39408EE940101
-:10030000500280047E017F088E3B8F3C90FF02E00C
-:10031000FCA3E0FAECFFEA90FABDF0EFA3F0121CA8
-:10032000E0E4F54DE54DC39402500F121CC1E412F8
-:100330001AE8054D04121CB280EA121CE090FF007E
-:10034000E0FF546024C070030208F32440600302FD
-:100350000F6E90FAB9E0FE540FF54DEE30E703D37F
-:100360008001C3920A90FF01E0121BFC0384000489
-:100370005701056A0306310506730607D508081DEF
-:100380000908790A08B90B00000F6EE53520E7036C
-:10039000020F6E90FABDE07002A3E06003020F6EE0
-:1003A000E53C6402453B6003020F6EEF541F14608E
-:1003B0002B14604724026003020F6EEE6003020FED
-:1003C0006E121CC17401121AE87867E630E0081258
-:1003D0001CC17402121AE87F0202326EE53520E178
-:1003E0000990FAB9E06003020F6E90FAB9E0D39475
-:1003F000014003020F6E7F0202326EE53520E10EEE
-:1004000090FAB9E0FF600764806003020F6E120F7C
-:10041000FA4003020F6EE54D7019300A0B90FF8011
-:10042000121CBE121AE8802490FF82121CBE121AFF
-:10043000E88019154D300A0B121D55121CBC121AFA
-:10044000E88009121D63121CBC121AE8121CC112AA
-:100450001AA260057401121AE87F0202326EE535B5
-:1004600030E703020F6EE53C453B6003020F6E125E
-:100470001D7914602D14605924026003020F6E90E0
-:10048000FABDE07004A3E064016003020F6E90FA0D
-:10049000B9E06003020F6E7867E654FEF6E4FF02EF
-:1004A000326EE53520E10620E003020F6EE53530BF
-:1004B000E00990FAB9E06003020F6EE53530E10C17
-:1004C00090FAB9E0D394014003020F6EE4FF0232C8
-:1004D0006E90FABDE07002A3E06003020F6E120F8F
-:1004E000FA4003020F6EE53520E10620E003020F1B
-:1004F0006EE53530E007E54D6003020F6EE54D70A7
-:100500000F90FF82E054F7F090FF80E054F7F02264
-:10051000E54D24FE602024FB603424067035300A4B
-:100520000CA20AE433FD7F03122E798026E4FD7FBE
-:1005300003122E79801D300A0CA20AE433FD7F04D9
-:10054000122E79800EE4FD7F04122E7980057F87BC
-:100550001231EF154D300A0B121D55F583E054F79B
-:10056000F08009121D63F583E054F7F0E4FF0232D6
-:100570006EE53530E703020F6EE53C453B60030254
-:100580000F6E121D7914602D146055240260030251
-:100590000F6E90FABDE07004A3E064016003020FE7
-:1005A0006E90FAB9E06003020F6E7867E64401F6D8
-:1005B000E4FF02326EE53520E10620E003020F6E13
-:1005C000E53530E007E54D6003020F6EE53530E1BB
-:1005D0000AE54DD394014003020F6EE4FF02326E30
-:1005E00090FABDE07002A3E06003020F6E90FAB9CA
-:1005F000E0FF12323F4003020F6EE53520E1062096
-:10060000E003020F6EE54D7009300A03021E14026A
-:100610001DDFE53520E103020F6E154D300A0B1288
-:100620001D55F583E04408F08009121D63F583E051
-:100630004408F0E4FF02326EE53530E703020F6E46
-:10064000E53C453B6003020F6E90FAB9E06003029F
-:100650000F6E121D796003020F6EE53530E1030263
-:100660000F6E90FABEE090FFFFF0E06005433501A9
-:1006700080035335FEE4FF02326EE53520E70302C6
-:100680000F6EE53C453B7003020F6E121D7960034F
-:10069000020F6E90FABDE0FCA3E0FDEC24FE603A90
-:1006A00014607524026003020F6EED6003020F6E8A
-:1006B000121CE0121E0D7D03120FB56003020F6EB7
-:1006C000120F7290FAB6E0FDA3121D2B120FD1503B
-:1006D000028004AE3BAF3C021002121CE090F916FF
-:1006E000E030E40D121E0D7D14120FB56010020FE4
-:1006F0006E121E0D7D041210096003020F6E120FA0
-:100700007290FAB6E0FDA3121D2B120FD150028099
-:1007100004AE3BAF3C021002121E0D7D0512100903
-:100720006003020F6E7B017AFA79B6121D287D01F3
-:1007300012269890FAB7E475F003121B1C90FABECB
-:10074000E090FAB5F0E4F54C90FAB5E0FFE54CC363
-:100750009F5024121D22121014FFFD90FAB7E48D51
-:10076000F0121B1C90FAB6E0C39FF0D39400500324
-:10077000020F6E054C80D1121D2212101424FEFFB0
-:1007800090FAB6F0FDA3E475F002121B1C7AF97919
-:10079000727B018B368A378938E92402F9E43AFA08
-:1007A000121D281226988F4C054C054C121CC1E5D1
-:1007B0004C121AE8121CC19000017403121AFAAF0D
-:1007C0004C7E00C3EF953CEE953B50028004AE3B5F
-:1007D000AF3C8E398F3A022CD8020F6EE53520E7F8
-:1007E00003020F6EE53C6401453B6003020F6E900F
-:1007F000FAB9E06003020F6E90FABDE07002A3E068
-:100800006003020F6E121D796003020F6EE5352042
-:10081000E00620E103020F6E75360075370075386B
-:1008200032020FF1E53530E703020F6EE53C453B40
-:100830006003020F6E90FAB9E06003020F6ED3906E
-:10084000FABEE0940190FABDE094004003020F6EFE
-:10085000121D796003020F6EE53520E00620E103EA
-:10086000020F6E90FABEE0F532E5327008433501B2
-:100870005335FD80065335FE433502E4FF02326EE8
-:10088000E53520E703020F6EE53C6401453B60035C
-:10089000020F6E90FAB9E06003020F6E90FABDE0AD
-:1008A0007002A3E06003020F6E121D796401600301
-:1008B000020F6EE53520E103020F6E7F0102326EFA
-:1008C000E53530E703020F6EE53C453B6003020F60
-:1008D0006ED390FABEE0940090FABDE0940040031D
-:1008E000020F6E121D7964016003020F6EE5352060
-:1008F000E103020F6EE4FF02326E90FF01121E242C
-:10090000EF121AE890FAB9121E24900001EF121AA1
-:10091000FA900002E4121AFA7403121CB290FABDA3
-:10092000E0FFA3E0853882853783CFF0A3EFF09016
-:10093000FF01E0121BFC097B02099D0409BF0509A8
-:10094000EB060A09070A27080A45090A630B0B1870
-:10095000800DB7810DE8820B5F830BA8840BC785E0
-:100960000C0C860C57870CE8880D73890A81920A53
-:1009700081930DA0B00E9BC00EC7C10ED8C200005F
-:100980000F5DE53520E7057F050231A9121D716075
-:1009900003047009EFFD7C007F0702115EE4FD7F18
-:1009A00007022FB4E53520E7057F050231A9121DA6
-:1009B000716003047009EFFD7C007F0C02115EE49E
-:1009C000FD7F07022FB4E53530E703020F71121ED9
-:1009D000425006E53C453B70057F020231A990FA82
-:1009E000B9E024FE24FD5002800302322C7F07026E
-:1009F00031A9E53530E703020F71121D7160030460
-:100A00007009EFFD7C007F0802115E7F070231A9AB
-:100A1000E53530E703020F71121D716003047009A0
-:100A2000EFFD7C007F0902115E7F070231A9E535E9
-:100A300030E703020F71121D716003047009EFFDAE
-:100A40007C007F0A02115E7F070231A9E53530E79D
-:100A500003020F71121D716003047009EFFD7C0029
-:100A60007F0B02115E7F070231A9E53530E70302F3
-:100A70000F71121D716003047009EFFD7C007F0E81
-:100A800002115E7F070231A9E53530E756121D7964
-:100A9000704A90FF02E0F54CE54CB48205754C615C
-:100AA0008012E54CB48305754C628008E54CC45453
-:100AB000F004F54C121C22121E3B1225FA121D895D
-:100AC000121ABB600512327A800685333985343AB2
-:100AD0007536017537F9753875022CD8E4FD7F0538
-:100AE000022FB4121D7960057F050231A9121E4242
-:100AF00040057F030231A990FF02E0F54CE54CB4BC
-:100B00008205754C618012E54CB48305754C62809A
-:100B100008E54CC454F004F54C121C2202322C128D
-:100B20001E4C122AC7121D33E0547FF0000000E073
-:100B300090FABAF07868121BD8900002121ABB30F3
-:100B4000E7F2900002E4121AFA90FABAE04480FF49
-:100B5000F0787CE6FC08E68C83121D3BEFF0123245
-:100B600084E4FF0231A990FAB9E06401701F90FAA1
-:100B7000BDE0FF7E007006A3E0F590802DC2AFEFD0
-:100B8000F4529090FABEE04290D2AF801D90FABD30
-:100B9000E0FF7E007006A3E0F5B0800EC2AFEFF478
-:100BA00052B090FABEE042B0D2AFE4FF0231A912D7
-:100BB0001CE090FAB9E0B4010A121CC1E590121AC7
-:100BC000E88008121CC1E5B0121AE8020FF190FA91
-:100BD000B9E0FF2413121CF120E133121D80EF2431
-:100BE000FC601804702890FABAE0600990FFA4E055
-:100BF0004410F08019121E56F0801390FABAE0608B
-:100C00000990FFB4E04410F08004121E5DF0E4FF90
-:100C10000231A990FAB9E0FF2413121CF120E13946
-:100C2000121D80EF24FC601B04702E90FABAE06065
-:100C30000990FFA4E04420F0801F90FFA4E054DF5F
-:100C4000F0801690FABAE0600990FFB4E04420F01A
-:100C5000800790FFB4E054DFF0E4FF0231A9121DD9
-:100C600080121D71604D046003020CE390FABAE03B
-:100C7000600F90FFA4121CEA30E16F121E2C020CD0
-:100C8000E390FFA4E054FB121CEDFE30E15C30E287
-:100C90001130B405121E2C805190FFA4E054FDF0D9
-:100CA0008048309505121E2C804090FFA4E054FD32
-:100CB000F0803790FABAE0601290FFB4121CEA306C
-:100CC000E12890FFB4E04402F0801F90FFB4E054AC
-:100CD000FB121CED30E11330930990FFB4E04402A5
-:100CE000F0800790FFB4E054FDF0E4FF0231A91258
-:100CF0001D8090FAB9E024FC604004707890FABA44
-:100D0000E0601D90FFA2E04440F0A3E0FF30E76503
-:100D1000D203A3E054DFF090FFA3EF547FF080559F
-:100D200030030E90FFA3E04480F0C203A3E0442010
-:100D3000F090FFA2E054BFF0803B90FABAE0601D53
-:100D400090FFB2E04440F0A3E0FF30E728D204A3D4
-:100D5000E054DFF090FFB3EF547FF0801830040EC2
-:100D600090FFB3E04480F0C204A3E04420F090FF81
-:100D7000B2E054BFF0E4FF0231A9121CE090FAB9CE
-:100D8000E024FC600F04701690FFA6E0121CC11254
-:100D90001AE8800A90FFB6E0121CC1121AE87539F1
-:100DA00000753A01022CD890F9157401F090F91CE5
-:100DB0007419F090F96674FFF0E4FF0231A9E4FFC2
-:100DC0001231A9121DE77F0312126190F916E0306B
-:100DD000E40890FF937480F0801090FFFCE0547F53
-:100DE000F07FFF7E001230D3C290C2AF0080FDE4DE
-:100DF000F54EF54F90FABF743EF0A3E4F090FAB7C9
-:100E0000F0A37415F0E0543FFFC374409F90FABC08
-:100E1000F0D39400E4943E400890FAC0E090FABC0D
-:100E2000F0120F98E53145307073121CFA90FABF3A
-:100E3000121E066027D3EF9440EE9400400890FA0B
-:100E4000BC7440F0800890FAC0E090FABCF0120F39
-:100E500098E53145307046121CFA80D1754C0290ED
-:100E6000FABFE4F0A304F090FAB7E4F0A3740FF033
-:100E70007B007A00794C90FAC0E0F54A7D0F7C0047
-:100E80001229607530008F317B007A00794CE4F5CF
-:100E90002DF52E7D01122698E4F530F531AF3102A3
-:100EA00031A9121D8030E710E0540F90F967F0D39C
-:100EB00094004015C295801190FABAE0540F90F951
-:100EC00065F0D394004002C294E4FF0231A9121EDF
-:100ED0004CBF0104D2938002C293E4FF0231A912F5
-:100EE0001D80540314600A14600F146008240370FA
-:100EF0002BD2918027C2918023121E56120FC06000
-:100F000004D291801790FFA4E04410120FC0FFBFDD
-:100F1000A004C2918002D291121E56F090FABAE05B
-:100F2000540CFF1313543F14600A14600F1460082C
-:100F30002403702BD2928027C2928023121E5D124E
-:100F40000FE06004D292801790FFB4E04410120FBB
-:100F5000E0FFBFA004C2928002D292121E5DF0E4B4
-:100F6000FF0231A9E53530E707E4FD7F05022FB424
-:100F70007F050231A912327A227B017AFA79B69082
-:100F8000FAB7E0F52DA3E0F52E7D0112269890FA30
-:100F9000B7E475F003121B1CAB36AA37A93822AA96
-:100FA0004EA94F7BFF90FAB7E0FCA3E0FD90FABC9E
-:100FB000E0F54A1229607530008F31221223617EDC
-:100FC000008E308F31EF22F07F0112126190FFA668
-:100FD000E090FABBF054A0221226988F4C7E00C3FA
-:100FE000EF953CEE953B22F07F0112126190FFB627
-:100FF000E090FABBF054A022753900753A01022C3A
-:10100000D890FAB9E0FF02323F8E398F3A022CD8DD
-:101010001223617E008E308F31EF227D01122698DF
-:1010200090FAB4E022EF90F804F022C0A8C2AFEE2C
-:10103000600AC0057D7FDDFEDEFAD005EFC39415A2
-:101040005003D0A822137003D0A822FFD507FDD0EB
-:10105000A822C000C001C002C004C005E53E2408AB
-:10106000F8860553057F7CFF1210C07F007E00E5E7
-:10107000436046FC90F91DE0547F6D700FC083C043
-:1010800082A3E0FEA3E0FFA315438007A3A3A3DC94
-:10109000E68026DC06D082D083801EE0F8A3E0F94B
-:1010A000A3E0FAD082D083E8F0A3E9F0A3EAF0A3AA
-:1010B000C083C082A3A3A380DA121157D005D00445
-:1010C000D002D001D0002285A84475A888EC700217
-:1010D0007C3F8C3D22E53E2408F876001211AE805C
-:1010E000FBC000C001C002C004C0067CFF1210C0DB
-:1010F000E5436042FE90F91DE0547F6F700BC083A2
-:10110000C082A3A3A315438007A3A3A3DEEA80267E
-:10111000DE06D082D08380D8E0F8A3E0F9A3E0FA1D
-:10112000D082D083E8F0A3E9F0A3EAF0A3C083C0A3
-:1011300082A3A3A380DA7808087918097C01E65411
-:101140007F6F700676007700800608090CBC08EEF9
-:10115000121157D006D004D002D001D00022753D24
-:10116000008544A822C0F0C082C083C3E54324E8C0
-:1011700050051211AE80F4EF6031903111E493C349
-:101180009F402FC0047CFF1210C0D004430780E5AD
-:101190004375F003A4241DF582E434F9F583EFF0E0
-:1011A000ECA3F0EDA3F00543121157D083D082D009
-:1011B000F0220211DCC0047C20D28CD28DD504FD3B
-:1011C000D0042275A80075880075B80075F0007508
-:1011D000D000E4F890F804F0900000F608B800FBA6
-:1011E000020000C2AFE490FF48F090FF50F090FF83
-:1011F00008F090FF10F090FF80F0A3A3F0D2B1C2EE
-:10120000B07EFF7FFF1210247EFF7FFF1210247E2E
-:10121000FF7FFF121024D2B0D2B17EFF7FFF1210E9
-:10122000247EFF7FFF1210247EFF7FFF1210248098
-:10123000CCC3EE940250047E037FE8EFF4FFEEF49B
-:10124000FE0FBF00010E8F428E4122C3EF94BCEE11
-:10125000940250047E077FD0EFF4FFEEF4FE0FBF40
-:1012600000010E8F408E3F22EF700122C000C0A807
-:10127000C2AFE53E2418F8A607E53E2408F8C65498
-:101280007FF6D0A8E630E703D000221211AE80F43A
-:10129000C0007F01EF2408F8E660090FBF08F512CF
-:1012A00011AE80EED00022C0F0C082C083C000C06A
-:1012B00006C004ED2410F8769AED75F021A42405FB
-:1012C000F582E434F8F583C082C083A3A3E4780DEB
-:1012D000F0A3D8FCEF547F75F002A424F3F582E567
-:1012E000F03430F583E493FE740193FCD083D08214
-:1012F000ECF0A3EEF0ED2408F8EF4480F6D004D033
-:1013000006D000D083D082D0F022753E0075430015
-:101310007A0879187808760077000809DAF890F8E2
-:1013200004E0FC903111E493C39C5005E490F80470
-:10133000F078087480447FF674014410F58975B81C
-:1013400000D2ABD2A92275818BD28ED28CD2AFE5DE
-:10135000436036FF90F91DE05480602878087908D2
-:10136000E0547FFA7B00E6547FB502027BFF08D988
-:10137000F5EB7010EAF0C007121289AD07AF021248
-:1013800012A0D007A3A3A3DFCE1211AE80C18F2479
-:10139000122AC71222B5A3A3E0A330E728787E1251
-:1013A0002299E04401F01222FA12229DE020E0F698
-:1013B0001223507402F01222DAE0A330E507122360
-:1013C00050E04401F07880E6FE08E6FF8E832408B2
-:1013D0001222A1E0FD1223398A83240A1222A1EDF0
-:1013E000F012230624071222A1E0FF12235A240937
-:1013F0001222A1EFF090F916E030E420081222B793
-:10140000C083C082A3E025E0FF0582D58202158358
-:101410001582E033D082D083F0A3EFF01222B5E042
-:10142000FCA3E0FDECFF1223398A8324081222A1D9
-:10143000EFF0ED12235A24071222A1EDF01222A997
-:10144000E030E60A12234124091222A1E4F012221C
-:10145000A9E0FF30E71B12231E24091222A1E0603D
-:10146000091222A9EF4402F080071222A9EF54FDCD
-:10147000F0787E1222B7A3A3E0FF5307C708E6FC6B
-:1014800008E6FD1222E0A3E030E3128D828C83E5B2
-:101490008224051222A1E09032519342075307FBA8
-:1014A00012231E24061222A1E060034307045307FF
-:1014B000FC788012232924041222A1E0420743076A
-:1014C00080122339F5828A83A3A3EFF012235A24D2
-:1014D000041222A1E0FF8D828C83A3A3E0FCA3E091
-:1014E000FD30E1055307DF8003430720EC30E405BE
-:1014F0005307EF80034307101222A9E0FE54036054
-:10150000735307DFEE30E16912231E24091222A172
-:10151000E0121BFC152C0015600115650315600514
-:1015200015650715600915650B15600D15650F002C
-:1015300000156DE5246403702190F916E030E20D8A
-:1015400030B405430702802C5307FD8027309505F2
-:10155000430702801F5307FD801A3093054307029B
-:1015600080125307FD800D43070280085307FD805A
-:10157000035307FD12232724041222A1EFF08D82CA
-:101580008C83A3A3A3E0FF1222A9E0FE54037003FF
-:10159000021660EE20E10302165D081223202409E2
-:1015A0001222A1E0121BFC15BF0015F50115F50371
-:1015B000162905162907160F09160F0B16430D16C7
-:1015C000430F00001660E5246403702390F916E0D1
-:1015D00030E20F30B10653077F02166043078002E6
-:1015E000166030940553077F807D430780807830F4
-:1015F000920553077F8070430780806BE524B40316
-:101600000990FF9EE054EFF0800790FF9EE054DFCA
-:10161000F053077F8051E524B4030990FF9EE04416
-:1016200010F0800790FF9EE04420F053077F803742
-:10163000E524B4030990FF9EE054EFF0800790FF8B
-:101640009EE054DFF0430780801DE524B403099039
-:10165000FF9EE04410F0800790FF9EE04420F0439E
-:101660000780800353077F1222DAE0FCA3E0FD30FD
-:10167000E00543072080035307DFEC30E305430711
-:101680004080035307BFEC30E0054307108003534D
-:1016900007EFED30E40543070880035307F7ED300B
-:1016A000E50543070480035307FBED30E6054307D8
-:1016B0000180035307FEED30E70543070280035323
-:1016C00007FD787E1222DCA3EFF01232847F002225
-:1016D00090FFFA7408F0A37416F090FFF97402F00A
-:1016E0007B017AFA79CFE4FD12236190FACFE47599
-:1016F000F003121B1C121992E52330E702D2027B81
-:10170000007A00792490FACFE0F52DA3E0F52E7D44
-:101710000112269890FACFE4F0A3740BF07B007AC4
-:10172000007923752D00F52E7D01122698E52324DE
-:101730008090FFF8F0E5236407601EE523640660EF
-:1017400018E52364146012E5236441600CE523640A
-:101750001A7046E52464027040E523B40716D2945B
-:10176000D295D292D29390F916E04402F0A3E044CD
-:1017700002F0801EE523B4411290F916E04406F011
-:10178000A3E04406F0D2B1D2B4800790F916E04449
-:1017900001F090F917E04401F0E5236442600CE5A4
-:1017A0002364436006E5236444702E90F916E0FF3D
-:1017B000E523B444047E4080027E00EE24804F90F6
-:1017C000F916F0A3E0FFE523B444047E4080027ED6
-:1017D00000EE24804F90F917F090FACFE4F0A37454
-:1017E0000DF012199290FFF5E523F0E4F535F5338D
-:1017F000F534F532121E34121CE0121E3B90F96AC9
-:10180000121BF390F96F121BF390FFFFE4F090FFAF
-:1018100083E0E4F090FF817480F0A37484F090FF83
-:1018200080F0E4F523E523121D57F583E4F0E5236A
-:10183000121D65F583E4F00523E523B407E7787A04
-:1018400076FE0876F090320AE493FF7878F6FDADE4
-:1018500007903217E493FF08F6FFED540FFD121DB9
-:10186000477484F0ED75F008A42447F582E434FF52
-:10187000F583EFF0C374F09F787BF674FE94001844
-:10188000121CD8CEC313CE13D8F9FFED121DA8EF4A
-:10189000F0ED121DCEE4F523E52390320493FF789A
-:1018A00078F6FDE52325E0240BF582E43432F58358
-:1018B000E49308F6ED30E75318E6540FF9121D478C
-:1018C000121DB62447F582E434FF121CC8CEC313A0
-:1018D000CE13D8F9FFE9121DA8EFF0121CCFCEC32A
-:1018E00013CE13D8F9121DBB2445F582E434FFF55D
-:1018F00083EFF0E9121DCEE975F008A42446F582C5
-:10190000E434FFF5837480F00219677878E6540FA9
-:10191000F9121D9A121DB62407F582E434FF121C39
-:10192000C8CEC313CE13D8F9121DBB2401F582E42F
-:1019300034FFF583EFF0121CCFCEC313CE13D8F9CA
-:10194000121DBB2405F582E434FFF583EFF0E97541
-:10195000F008A42402F582E434FFF583E4F0E9758D
-:10196000F008A42406F582E434FFF583E4F00523AF
-:10197000E52364046003021891903209E493FF7830
-:1019800078F6121D98E4F090320893FFF6121D4588
-:10199000E4F090FFFD7405F0227B007A007923903B
-:1019A000FACFE475F001121B3285F02EF52D7D0182
-:1019B000022698E709F608DFFA8046E709F208DF11
-:1019C000FA803E88828C83E709F0A3DFFA8032E355
-:1019D00009F608DFFA8078E309F208DFFA807088F8
-:1019E000828C83E309F0A3DFFA806489828A83E032
-:1019F000A3F608DFFA805889828A83E0A3F208DF21
-:101A0000FA804C80D280FA80C680D4806980F280CF
-:101A100033801080A680EA809A80A880DA80E280F5
-:101A2000CA803389828A83ECFAE493A3C8C582C84A
-:101A3000CCC583CCF0A3C8C582C8CCC583CCDFE9B4
-:101A4000DEE7800D89828A83E493A3F608DFF9EC50
-:101A5000FAA9F0EDFB2289828A83ECFAE0A3C8C5DB
-:101A600082C8CCC583CCF0A3C8C582C8CCC583CC02
-:101A7000DFEADEE880DB89828A83E493A3F208DF71
-:101A8000F980CC88F0EF60010E4E60C388F0ED2441
-:101A900002B4040050B9F582EB2402B4040050AF44
-:101AA00023234582239019FC73BB010689828A8314
-:101AB000E0225002E722BBFE02E32289828A83E40D
-:101AC0009322BB010CE58229F582E5833AF583E098
-:101AD000225006E92582F8E622BBFE06E92582F8B7
-:101AE000E222E58229F582E5833AF583E49322BB7D
-:101AF000010689828A83F0225002F722BBFE01F39D
-:101B000022F8BB010DE58229F582E5833AF583E8E9
-:101B1000F0225006E92582C8F622BBFE05E925829F
-:101B2000C8F222C5F0F8A3E028F0C5F0F8E5821568
-:101B30008270021583E038F022A3F8E0C5F025F0AA
-:101B4000F0E582158270021583E0C838F0E822BB08
-:101B50000110E58229F582E5833AF583E0F5F0A3EB
-:101B6000E0225009E92582F886F008E622BBFE0A49
-:101B7000E92582F8E2F5F008E222E5832AF583E917
-:101B800093F5F0A3E99322BB010A89828A83F0E5E9
-:101B9000F0A3F0225006F709A7F01922BBFE06F3C6
-:101BA000E5F009F31922F8BB0111E58229F582E578
-:101BB000833AF583E8F0E5F0A3F0225009E92582A5
-:101BC000C8F608A6F022BBFE09E92582C8F2E5F0B6
-:101BD00008F222A42582F582E5F03583F58322E61A
-:101BE000FB08E6FA08E6F922EBF608EAF608E9F659
-:101BF00022E0FBA3E0FAA3E0F922EBF0A3EAF0A3D2
-:101C0000E9F022D083D082F8E493701274019370CB
-:101C10000DA3A393F8740193F5828883E47374028F
-:101C2000936860EFA3A3A380DFAB36AA37A938E59A
-:101C30004C121AE874012538F538E43537F537AB1E
-:101C400036FAA9387411121AE874012538F538E407
-:101C50003537F53790FF06E0AB36AA37A938121AA8
-:101C6000E874012538F538E43537F537AB36FAA98D
-:101C700038E4121AE8042538F538E43537F537AB7F
-:101C800036FAA938E4121AE8042538F538E435376D
-:101C9000F53790FF04E0AB36AA37A938121AE8747A
-:101CA000012538F538E43537F53790FF05E0AB36D8
-:101CB000AA37A938121AE874012538F538E43537FF
-:101CC000F53722F583E05408AB36AA37A93822F558
-:101CD00083EFF0FD7C00C3787BE69DF618E69CF66A
-:101CE000E6FE08E67803227536017537F975387215
-:101CF00022E04404F074132FF582E434F9F583E014
-:101D00002290FABCE0FF7E00C390FAC0E09FF09002
-:101D1000FABFE09EF090FAB7EE8FF0121B1CEF2591
-:101D20004FF54FEE354EF54E227B017AFA79B4909D
-:101D3000FAB7E0F52DA3E0F52E22787CE6FE08E662
-:101D40008E832404F582E43583F58322540F75F0E5
-:101D500008A42440F582E434FFF58322E54D75F0B4
-:101D600008A42448F582E434FF22E54D75F008A468
-:101D70002408F582E434FF2290FAB9E0FF24FC2223
-:101D800090FF00E0541F2290FABEE090FABAF022D1
-:101D90007533008F3490F96F121BEA9000022254C1
-:101DA0000F75F008A42400F582E434FFF583227552
-:101DB000F008A42441F582E434FFF583227480F016
-:101DC00008E6FFE975F008A42274B22522F582E442
-:101DD00034FAF5832275F008A42442F582E434FF36
-:101DE000F5837480F02290FF82E04408F02290FF97
-:101DF000FEE04403F090FFFCE054FDF0227867E63B
-:101E000054FDF690FFFD7465F022121BCCE0FEA39A
-:101E1000E0FF4E227B017AFA79B72290FF80E044FE
-:101E200008F02290FF83E0547FF022E0FF90F96AEF
-:101E3000021BEA90FFA4E04402F022753901753AD2
-:101E400009227B017AF9797222D3E53C9408E53BBB
-:101E500094012290FABEE0FF90FABAF02290FFA41B
-:101E6000E054EF2290FFB4E054EF2212104B788838
-:101E7000EFF6122AC71222FA8E8324091222A1E059
-:101E8000FD1222E890000A122302240A1222A1E085
-:101E900090000B121AFA1222FAF5828E83A3A3A3E2
-:101EA000E0F55312230624041222A1E0F5548F8298
-:101EB0008E83A3A3E0F555E553C41313135401789F
-:101EC00088F6D394004006E55430E101067888E6B0
-:101ED0001222E790000CEF121AFA1222B5A3A3E027
-:101EE000FEA3E0FF53070C5306E6E55330E503433A
-:101EF0000701E55420E50EE553547F7008E55320B3
-:101F0000E703430702E55330E303430710E553308B
-:101F1000E203430720E55354036003430740E553BE
-:101F200030E103430780E55330E403430601E55302
-:101F300030E603430608E55420E40EE553547F7071
-:101F400008E55320E7034306105307FB5306799037
-:101F50000005EE8FF0121B9FE55530E3125430FF61
-:101F6000C4540F1222E7900008EF121AFA800A12E6
-:101F700022E8900008E4121AFAE55554031222E709
-:101F8000900007EF121AFAE5555404FFC3139000AE
-:101F900009121AFA900007121ABB70131222E8E90C
-:101FA0002409F9E43AFA121AA2FFC313121AE8122A
-:101FB000232724081222A1E0FE8D828C83E582244F
-:101FC000071222A1E0FDEEED1222E7900003EE8F52
-:101FD000F0121B9F1232847D0AE4FF122FB402100C
-:101FE000CE90FAE6E0B403067E007F4080047E00D7
-:101FF0007F0890FADAEEF0A3EFF0900005121ABB1A
-:10200000FF7E0090FAD6EEF0A3EFF070037F082277
-:10201000900008121B48FF90FAD8E5F0F0A3EFF00B
-:10202000AE02AF018E508F51740A2551F551E4353F
-:1020300050F55090FADBE0FF14FE90FAD9E05EFE16
-:10204000C3EF9EFF90FADDF0C390FAD7E09F90FABD
-:10205000D6E094005006A3E090FADDF01220A960CB
-:1020600003E0FF22122E2B90FAD6E0FEA3E0FF4EF3
-:10207000602B90FADAE0FCA3E0FDD3EF9DEE9C40EC
-:1020800007E090FADDF0800890FAD7E090FADDF0F2
-:102090001220A96003E0FF22122E2B80CA7B007A57
-:1020A000007952E4F52DF52E7D011226987F00224D
-:1020B000AA50A9517B0190FAD8E0FCA3E0FD90FA68
-:1020C000DDE0F54A12296090FADCEFF022EF24AE51
-:1020D000605224FE602E24FE7003022169240660F3
-:1020E000030221B17871E654FBF690FFA5E0F522DA
-:1020F000440FF0743390FA94F0E522A3F090FAB212
-:102100007401F0227872E654FBF690FFB5E0F522F8
-:10211000440FF0744390FA96F0E522A3F090FAB3DE
-:102120007401F02290FAA0E0A320E5030221B1900F
-:10213000FFA6E090FACDF0A3F090FACDE0FF540FA7
-:10214000FE601090FFA612230D90FFA6E090FACD3E
-:10215000F080E690FACEE0FF7434FE122D85EF7029
-:102160005790FACEE0FF743490FA98F0EFA3F02283
-:1021700090FAAAE0A330E54090FFB6E090FACDF0E7
-:10218000A3F090FACDE0FF540FFE601090FFB6125E
-:10219000230D90FFB6E090FACDF080E690FACEE005
-:1021A000FF7444FE122D85EF700E90FACEE0FF749E
-:1021B0004490FA9AF0EFA3F022C0E0C0F0C083C0D0
-:1021C00082C0D075D000C000C001C002C003C004EE
-:1021D000C005C006C00790FF92E0FF90FACCF090D7
-:1021E000FF92E4F0EF121BFC22692622692E220CDA
-:1021F00030220C32221A38222C3A225E3E224944E6
-:10220000223E462254502254522254542254560004
-:1022100000226E90FACCE0FD7C007F0112115E80FE
-:10222000627C007D017F0312115E90FFFEE044207E
-:10223000F080507C007D017F0212115E90FFFEE075
-:102240004440F0803E7C007D017F0512115E8033AA
-:102250007C007D017F0612115E802890FACCE0FFA1
-:102260001220C6801E7C007D017F0412115E801347
-:1022700012284E800E90FACCE02400FFE434FFFEDA
-:10228000122D85D007D006D005D004D003D002D0BF
-:1022900001D000D0D0D082D083D0F0D0E032787C92
-:1022A000E6FE08E624048E83F582E43583F5832276
-:1022B00074132524F582E434F9F583227880E6FE50
-:1022C00008E6F5828E83227880E6FE08E6AA06F804
-:1022D000AC027D017BFF7A3279567E007F0A021ABA
-:1022E0007C7880E6FC08E6F5828C83A3A322FF902D
-:1022F000F96F021BEA90F96A121BEA900004021AB5
-:10230000BB787EE6FE08E6FF22ED121AFA8F828E77
-:1023100083E58222EFF090FACEE0540F4EFEF0EF0C
-:1023200054F04EF0227880E6FC08E68C8322787E1A
-:10233000E6FC08E6FD8C8322A607E6246EF8E6227A
-:10234000787EE6FA08E6FB2208E6FE08E68E83229F
-:1023500026F618EE36F622EF240BF582E43EF583DE
-:10236000228B828A83E582228B258A2689278D28E3
-:1023700090FAD2E4F0A37402F07B017AFA79D1905A
-:10238000FAD2E0F52DA3E0F52E7D0112269890FA01
-:10239000D1E065286046A3E0FFA3E0A3CFF0A3EF60
-:1023A000F01223F090FAD1E0FF90FAD4E48FF0120B
-:1023B0001B1C1223F090FAD4E0FFA3E090FAD2CFD6
-:1023C000F0A3EFF090FAD1E0A375F000121B1C907F
-:1023D000FAD2E475F004121B1C02237290FAD3E0C7
-:1023E0002401FF90FAD2E03400AB25AA26A9278F5A
-:1023F000F0121B807F00227B017AFA79D190FAD209
-:10240000E475F001121B1C85F02EF52D7D010226CE
-:10241000988F62122AC71222FA8E83240B1222A1ED
-:10242000E054FBF04402F0081222DCE0A330E50C9B
-:10243000122306240B1222A1E04401F0787CE6FE70
-:1024400008E6FFF5828E83E054B8FDF0E56224FED5
-:102450004420FC4DF0E58224041222A1E054B8F09F
-:102460004CF08F828E83A37403F018E6FE08E6FF1B
-:102470008E8324051222A1C083C082E0FD749925B9
-:1024800062F582E434FAF583E054FC4403FCED4C3D
-:10249000D082D083F08F828E83E04480F0E5822466
-:1024A000041222A1E04480F0123284746E2562F896
-:1024B000740446F67F002212104B7F0212126178DC
-:1024C00067E64402F6D2B0D2B190F916E030E707E1
-:1024D00090FF9EE4F08036D2B390FFA4E090FA7EA5
-:1024E000F090FFB4E090FA7FF090FFA2E090FA7CC9
-:1024F000F090FFB2E090FA7DF090FFA47430F0907D
-:10250000FFB4F090FFA27440F090FFB2F090FAE7B1
-:10251000E5A8F075A88190FF92E06004E4F080F6F1
-:1025200090FFFD743AF043870100000090FA7EE0CE
-:1025300090FFA4F090FA7FE090FFB4F090FA7CE076
-:1025400090FFA2F090FA7DE090FFB2F090F918E0D1
-:102550006002C2B390FAE7E0F5A80210CE8B5C8A65
-:102560005D895E122E0D90FAC3121BF3AA5DA95E5F
-:1025700090FAC6121BF390FAC7E475F00A121B1CFE
-:1025800090FAC6121BEAE92401F9E43AFA90FAC972
-:10259000121BF3AB5CAA5DA95E122E19E0FFC313F8
-:1025A000F0E47882F690FAC1E0FF7882E6C39F50AB
-:1025B0004A90FAC3122DEEFF7883F690FAC6122DD8
-:1025C000EEFEF45FFF7883F6122DEB5E4FFF78830B
-:1025D000F6122DF475F002121B1C90FAC7E475F088
-:1025E00002121B1CAB5CAA5DA95E900004121ABB10
-:1025F00030E403122E0378820680AAE490FAC2F037
-:10260000228B568A57895890FAC27406F0E490FAE1
-:10261000C1F0121AA2246E6026147070122DDA60B6
-:1026200009243070121225568062122E24121FDAED
-:1026300090FAC2EFF0805590FAC27481F0804D128A
-:102640002DDA60092430703E122D30803FE5582489
-:1026500003F9E43557FA7B01C003C002C001122E12
-:1026600024900005121ABBFD900008121B48F52E9D
-:1026700085F02DD001D002D00312269890FAC1EF38
-:10268000F0E4A3F0800690FAC27481F090FAC2E000
-:10269000122E24900002121AFA90FAC1E0FF228B47
-:1026A000298A2A892B8D2CE52C7003AF2C22122E1F
-:1026B000537016122E72E52D90FFF1F01231D850A2
-:1026C000F2122725400B7F0022122E72122725506E
-:1026D000F890FFF374A1F0E52CB4010790FFF0E04F
-:1026E0004402F090FFF1E4F0F52FE52C14FFE52F04
-:1026F000C39F502A1231C14003AF2F22C3E52C954E
-:102700002FFFBF020790FFF0E04402F0122E650594
-:102710002F7401252BF52BE4352AF52A80CC1231B4
-:10272000C140037F1822122E65AF2C2290FFF1E5E5
-:102730002EF00231D812104B788412233130E10888
-:102740007F131231A90227BC7884E6F924131222E0
-:10275000ADE0FF30E7405403601EE9B4030D90FF85
-:102760009EE054FEF0E04404F0804690FF9EE0546A
-:10277000FDF0E04408F08039E9B4030D90FF9EE0DD
-:1027800054FBF0E04401F0802890FF9EE054F7F005
-:10279000E04402F0801BEF54036014E9B403099095
-:1027A000FFA4E054DFF0800790FFB4E054DFF0C2F4
-:1027B000B390F918E004F0AF011222EEFD122FE5FC
-:1027C0001231A90210CE75A840787FE4F6D8FD75C5
-:1027D000818B02280902318CE493A3F8E493A3408F
-:1027E00003F68001F208DFF48029E493A3F854078C
-:1027F000240CC8C333C4540F4420C8834004F45687
-:10280000800146F6DFE4800B0102040810204080BE
-:10281000902BA9E47E019360BCA3FF543F30E509EF
-:10282000541FFEE493A360010ECF54C025E060A8BE
-:1028300040B8E493A3FAE493A3F8E493A3C8C58251
-:10284000C8CAC583CAF0A3C8C582C8CAC583CADFBF
-:10285000E9DEE780BEE4F522121DC2E0B4040DE516
-:10286000222403FF123013121DC2E4F00522E522D8
-:10287000C3940240E3E4F52275F002E52290FA9455
-:10288000121E03602C122D85EF605275F002E522B6
-:1028900090FA94121BCCE4F0A3F075F00AE52290B4
-:1028A000FAA0121BCCE0A330E633121DC27404F070
-:1028B0002275F002E52290FA98121E036016122D7E
-:1028C00085EF601975F002E52290FA98121BCCE4AE
-:1028D000F0A3F0220522E522C39402409B22E4FFEC
-:1028E00090FF83E0540FFEEFC39E501774F02FF556
-:1028F00082E434FEF583E0121CC1121AE80F121CA8
-:10290000B080DDEFFDC3E53A9DF53AE5399400F579
-:1029100039D3E53A9400E53994004006E490FF830A
-:10292000F022121DDF121E34121E26121AA2246E6D
-:10293000601E14601B248E702D900001121ABBFFC4
-:1029400024FC600304701FEFFD7C007F0D02115E0C
-:10295000121E3B1225FA121D89121ABB60030232A5
-:102960007AE4FF12326E228B458A4689478C488D65
-:1029700049D200122E537016122E72E54890FFF1C4
-:10298000F01231D850F21229D5400B7F1822122EA6
-:10299000721229D550F8E4F54BE54A14FFE54BC314
-:1029A0009F50171229C540037F1822054B7401253B
-:1029B00047F547E43546F54680DF90FFF0E04401F7
-:1029C000F01229C540037F18227F0022AB45AA469A
-:1029D000A947121AA290FFF1F00231D890FFF1E559
-:1029E00049F00231D87B017AFA79CFE4FD122361F4
-:1029F00090FACFE475F009121B1C7B007A00792352
-:102A000090FACFE475F001121B3285F02EF52D7D82
-:102A10000112269890FFF7E523122A3990FFF6E578
-:102A200023F090FACFE4F0A37406122A39E523309C
-:102A3000E00790FFFC7494F02290FFFC7490F02269
-:102A4000F07B007A00792390FACFE475F001121B35
-:102A50003285F02EF52D7D0102269890FF9374812A
-:102A6000F090FFFFE0600690FFFC7410F090FF9183
-:102A7000E04490F0E490F916F0A3F0122B3912160E
-:102A8000C91230697E077FD012122A7E0F7FA012F2
-:102A90001244E47877F67877E6FFC39406500B7417
-:102AA0006E2FF8E4F678770680EC7F031230B29050
-:102AB000F916E020E4057F041230B290FF9BE4F0A9
-:102AC00090FF9AF090FFE8E0541FF0D2A82215651D
-:102AD000A865A6073008051211AE80F8D208A865CF
-:102AE000E6FFB4030F787C76FF0876E00876FF08EF
-:102AF00076A0800D787C76FF0876E20876FF08766F
-:102B0000B0788076FA08769EEF24FD75F00AA4AEC0
-:102B1000F01223497B017AFF79487868121BE1A8FB
-:102B200065E624FD75F008A4FFAEF0786A1223492B
-:102B30007908786B121BE1786DEF12234905652245
-:102B400090FFF0E054ABF0E04420F090FAE674021D
-:102B5000F07B017AFA79CFE4F52DF52E7D0112266E
-:102B6000987E0090FAE4EEF0A3EFF064017010900C
-:102B7000FACFE0B4520990F916E054EFF0802990B2
-:102B8000FAE4E07004A3E06401701090FACFE0B4BE
-:102B9000100990F916E04410F0800D90FAE67403E5
-:102BA000F090F916E054EFF090FFF0E04420F022AE
-:102BB000036801FF48036B01FF080266000044FA46
-:102BC000980000000044FA940000000042FAB200AD
-:102BD0000042FA7E000042FA7C000042F96DFFFFDD
-:102BE00042FA7A000041F966FF41F91C1941F915D2
-:102BF0000043F9190A320241F9682041F96920417C
-:102C0000F9650041F9670044F8000000000042F94E
-:102C100016000041F9180001200041F804000012DC
-:102C2000104B788AEFF6122AC71222EE30E029788C
-:102C30007C1222B7E0547FF0786B121BD890000210
-:102C4000121ABB30E709900002E4121AFA80E97800
-:102C50007C1222B7E04480F01222EE30E11E1222F4
-:102C600097E0547FF01232197868121BD890000256
-:102C70007480121AFA122297E04480F0123284E42F
-:102C8000FF1231A90210CE12104B7885EFF61231E7
-:102C9000501231A97885E6FF24131222ADE0FE30F0
-:102CA000E716EFB4030990FF9EE054FAF0802290FB
-:102CB000FF9EE054F5F08019EE54036014EFB40366
-:102CC0000990FFA4E04420F0800790FFB4E0442086
-:102CD000F090F918E014F0E07002D2B30210CE12B6
-:102CE0001E1CE53A64097004E53964016048C3E5D7
-:102CF0003A9408E539940040117F08EFE53A9408CA
-:102D0000F53AE5399400F5398005AF3A121E34E4FE
-:102D1000FEEEC39F5019121CC1121AA2FD74F82EA8
-:102D2000F582E434FEF583EDF00E121CB080E2EF84
-:102D3000547F90FF81F0228B598A5A895B122E1999
-:102D40007005A37408F022AB59AA5AA95B122E0D84
-:102D500090FAC9121BF3E55B2403F9E4355AFA90A3
-:102D6000FAC3121BF3E490FAC2F0788BF690FAC122
-:102D7000E0FF788BE6C39F5012122DEBFF122DF46B
-:102D8000122E07788B06122E0380E222AD07AC06C6
-:102D900090320AE493FF7874F6540F121DA8E008ED
-:102DA000760008F618121CD9C333CE33CED8F9FFFB
-:102DB0007875EEF608EFF6EE44F818F6EF08F690A0
-:102DC000FF7AE020E7037F00227875E6FE08E6F54B
-:102DD000828E83ECF0A3EDF090FF7A7402F07F0115
-:102DE00022AB56AA57A958900003121ABB54F024DC
-:102DF000A02290FAC9121BEA021AA290FAC3121B6F
-:102E0000EAEF121AE890FACAE42290FAC4E475F0E4
-:102E100001021B1C900008121B48AAF0F97B01223A
-:102E2000900005121ABB90FAC1F022AB56AA57A91E
-:102E3000582290FADDE0FF7E00C390FAD7E09FF0C1
-:102E400090FAD6E09EF090FAD8EE8FF0121B1CEFAD
-:102E50002551F551EE3550F5502290FFF0E054FE2B
-:102E6000F0E054FDF090FAE6E064032290FFF2E017
-:102E7000AB29AA2AA92B021AE890FFF374A0F0222A
-:102E80008F64ED700FE564B403057F010231EF7FBD
-:102E9000020231EFAF64122AC7746E2564F8E6307F
-:102EA000E20BD209121D33E0547FF08002C209E523
-:102EB00064B403077F811231EF80057F821231EF06
-:102EC000300907121D33E04480F0123284221210C0
-:102ED0004B90FFFDE04460F0D20190FFFCE0440223
-:102EE000F090FF00E030E71390FF83E04480F04370
-:102EF000358090FFFCE04401F0800D121DDF53355A
-:102F00007F90FFFCE054FEF090FF81E04480F012DF
-:102F100002DE121DE70210CE12104B7889EFF6D2B6
-:102F200000122AC790F96A121BEAE92403F9E43A6D
-:102F3000FAC0027880E6FE08E6AA06F8AC027D0137
-:102F4000D0021222D31232847889E6FF121387123C
-:102F500031A90210CE8F63122AC7787C1222B7E003
-:102F6000543FF0E58224041222A1E0543FF01223E2
-:102F700041240B1222A1E054F8F0123284746E2521
-:102F800063F874FB56F67F002212104B122AC71208
-:102F900022FA240612229FE0FD1222E8900003127A
-:102FA000230224051222A1E0900004121AFA123220
-:102FB000847D02E4FF122FB40210CEAE05121D8EE6
-:102FC000EF121AFA0E0E0EEED3953CE4953B40023A
-:102FD000AE3CEED3940874809481400A7E03900046
-:102FE000027402121AFAAF0612326E22AE07ED54C4
-:102FF00003640160037F1022ED547CC394045003EA
-:103000007F0B22746E2EF8740246F674992EF582A8
-:10301000E434FAF583EDF07F0022BF03067CFF7DE8
-:10302000E080047CFF7DE28D828C83E04480F0E5CB
-:103030008224041222A1E04480F0746E2FF87404FC
-:1030400046F67F002212104BE53A64097004E53918
-:103050006401601690FF83E0540FFFC3E53A9FE5DB
-:1030600039940040051228D7800312327A0210CE1C
-:1030700090FFFCE020E71FC2AF7DFFAC051DEC60B8
-:10308000157E047F00EF1FAA0670011E4A60EC90B7
-:10309000FF92E4F080EF2212104B7866E6FE08E61D
-:1030A000FF30E01230E10F90FFFCE04420F07F049D
-:1030B000121261121DF60210CE8F23C208122AC707
-:1030C0001222C0787E122342240B1222A1E054F86F
-:1030D000F0123284AF23121387228E5F8F60E56077
-:1030E0001560AE5F7002155FD39400EE9400400946
-:1030F0007E077FD012102480E52211DC2EC724B079
-:1031000032603090303E316F2F82272E2C8031126A
-:1031100031311E642F112C180E12104B7886122399
-:103120003120E1077F121231A9800A7886E6FF126A
-:10313000240A1231A90210CE12104B7887122331C3
-:1031400020E2077F111231A9800A7887E6FF122F4B
-:103150004E1231A90210CE8F61122F4EAF61122A8A
-:10316000C71222C0123284746E2561F874FD56F6BF
-:10317000AF611213872212104BE53A64097004E51F
-:103180003964016005122CD88006121E14121E1C10
-:103190000210CE122A5412130390F804E0FF6005C7
-:1031A0007D011212A01229DE12133F1211BC80E31E
-:1031B000121D8EEF121AFAE4F533F534EF600302B4
-:1031C000327AE4FF12326E2290FFF0E0FF54A060EA
-:1031D000F7EF30E50890FFF04420F0C322D32290AF
-:1031E000FFF0E0FF542860F7EF30E50890FFF0446F
-:1031F00020F0C322D322EF30E708121D45E054DF50
-:10320000F022EF121D98E054DFF022810182028348
-:10321000038740004000400040004000400008009C
-:10322000787E1222B7A3A3E0FF30E706547FF04474
-:1032300080F022853B39853C3A90FF82E054F7F0DC
-:10324000A3E0547FF022E4FEEE90320493B507022F
-:10325000D3220EBE07F2C32200081828380181903D
-:103260000A02000011130012104B7F021210DA1232
-:103270001DF60210CE7539008F3A121CE0122CD8C0
-:0E32800022121E1C121DDF121E1422C2082272
-:00000001FF
-//**************************************************************
-//* Edgeport Binary Image (for TI based products)
-//* Generated by TIBin2C v2.00 (watchport)
-//* Copyright (C) 2001 Inside Out Networks, All rights reserved.
-//**************************************************************
diff --git a/firmware/emi26/bitstream.HEX b/firmware/emi26/bitstream.HEX
deleted file mode 100644
index 044d3f664385..000000000000
--- a/firmware/emi26/bitstream.HEX
+++ /dev/null
@@ -1,4391 +0,0 @@
-:10801000FFFFFFFFAA9955663000800100000007AE
-:10802000300160010000000B3001200100803F2D75
-:108030003000C00100000000300080010000000995
-:10804000300020010000000030008001000000012D
-:108050003000400050003E040812100000000000F4
-:108060000000000000000000000000000000000010
-:1080700000000000000000000000000000004004BC
-:10808000800000000000000000121000000000004E
-:1080900000000000000000000000000000000000E0
-:1080A000000000000000000000000000000040840C
-:1080B000800000000000000000020000000000003E
-:1080C00000000000000000000000000000000000B0
-:1080D0000000000000000000000000000000080098
-:1080E000C0000000000000000002000000000000CE
-:1080F0000000000000000000000000000000000080
-:10810000000000000000000000000000000000006F
-:1081100080000000000000000012000000000000CD
-:10812000000000000000000000000000000000004F
-:10813000000000000000000000000000000000043B
-:108140008000000000000000081300000000000094
-:10815000000000000000000000000000000000001F
-:10816000000000000000000000000000000000000F
-:10817000900000000000000000120000000000005D
-:1081800000000000000000000000000000000000EF
-:10819000000000000000000000000000000000845B
-:1081A0009000000000000000F710011400250005F9
-:1081B0004001500094001500074001D000940025B4
-:1081C00080016002D800F6002F8002E004D8374416
-:1081D0009000000000000000C005F200CC903920A3
-:1081E0000D9803D200E78037040EF1837E00DF9004
-:1081F00031E48F79037C20DF2233C00CF022300081
-:108200007000000000000000801062008024222026
-:10821000089812E2008B8120940874022E008A01D3
-:1082200022C80892023D808B60228008B0022004A0
-:1082300030000000000000008805C800A0002000F9
-:108240000B1002C000A10024094A32024800B1000C
-:1082500062C009A046CC2493492A8048302262019A
-:108260007000000000000000C015A812A800220045
-:10827000089002E0008980224408B012A800A940BA
-:1082800022C0089082AC009B042AC408B00270048B
-:10829000600000000000000000148400E980B26467
-:1082A0004DA003EA20E9C036400EB0034400FB9025
-:1082B000B2880DBC03EC085B0038602CB06340044E
-:1082C0007000000000000000E001B426DD9037409F
-:1082D0004FE013F280FD003DA00D700375005E00BD
-:1082E0003FA40DF9035C10EB0037200F3003B800FA
-:1082F00060000000000000004010AC00E980324047
-:108300000CA183E800E90032420EB003AC48E9005A
-:108310003A800EA403EC00EB00B2030EB00B100485
-:108320002000000000000000C8052E8089D12040F8
-:1083300008A002C0008180225808F5022F408B005F
-:1083400020C00830437C008700224008F002320041
-:108350004000000000000000E00542019A4428A20D
-:10836000081802C080A180A0000830028E00AB0077
-:108370002C400A30020C00A30020440A30023800CE
-:1083800050000000000000006001320096822BA225
-:10839000885A02F200058029A0087842BE008E8427
-:1083A0002F610AD8024E10A78020280878021800F2
-:1083B000400000000000000048080800F224388057
-:1083C0002C1A03C400E058A0802E30038841E30239
-:1083D0003C400620038C00E30010000E31431202E3
-:1083E0000000000000000000401D9800EE013784EE
-:1083F0009FD903F048FD1037C007B0035C00F610AA
-:1084000033C00DE103ED20DF103F480FF023D0060D
-:108410006000000000000000A805E402CB8030C02E
-:108420000CA003E202C9003A400DB6036400EB0061
-:108430003EC00FB003ED00FB013EE00CB002EA00CD
-:10844000700000000000000048119400870021C067
-:10845000286002D00085002D8048F0821C00B70003
-:108460002D000B5002DC00B7A02F80287A02D20426
-:108470006000000000000000C100BE00878021E015
-:10848000286802D70084802DE04979065309B58019
-:108490002DE20B7802DE80B7902DB0087902F00053
-:1084A00020000000000000004814CC10830128C800
-:1084B000082002C20681002CC88830620E21B3A0B9
-:1084C0002CC10BB602CC00B3002CE0083002D20461
-:1084D0003000000000000000E815A800CA40B0808D
-:1084E0000C2C02F800C6203F900DA0037B01EEE0AB
-:1084F0003FB40FEC03E800FA003FA00CA003FA041D
-:1085000060000000000000004800E300F8092600B9
-:108510000FC183E010F8403C000F8003E001F80039
-:108520003E000F8103E004F8003E100F8003D200EC
-:1085300030000000000000000810E402C9003E40C6
-:108540004F906326843902B2400C91032400F90055
-:108550003E400F90032400F1003A440F9003C20400
-:1085600030000000000000008004450089402E40DB
-:1085700008920A2400B931226088948A2420B90024
-:108580002E400B90022400B90022680B9002E000FC
-:108590001000000000000000180524A08D842F406A
-:1085A0000BD1022400B900224A0810022C40B90065
-:1085B0002E400B90022400B9002A400B9002C60006
-:1085C00040000000000000000804140085802D40D9
-:1085D000085002040CB900A0500814220400B10095
-:1085E0002C400B10020400B128204A0B1302C201D8
-:1085F0000000000000000000B80D6000C0503E8088
-:108600000FC0432000F80030002C80232000F851D8
-:108610003E148F850B2140F8703A080F8483EE03D7
-:108620005000000000000000981DC400F9043E4006
-:108630000F9023D400FD003F500F9403F404FD007D
-:108640003F418FD043E50CF9023F4A0F9203E60207
-:1086500070000000000000008805D401FD003D40CE
-:108660000CD013F400D500336A1CDC833400D10431
-:108670003E500C9103E6C0DDB0336A2C9C83E600CB
-:1086800070000000000000003810E009F8802E00A3
-:10869000888000E800BA0022B0088E02280088A86E
-:1086A0002628088A22E20088E42230088C02CE04C0
-:1086B00030000000000000000805C400B1282E4072
-:1086C000081002C400990020424810026401918001
-:1086D0002C48081002C4C08140204A081202C2017E
-:1086E00070000000000000001815A494A9022E409C
-:1086F0000A90026400B90082600890026600891046
-:108700002462089002E40089022240189002C60404
-:108710006000000000000000A015E600B9043E4023
-:108720000C9013E400D1C012502890034400D900EB
-:108730003E40289203E402D90032428C9012E804B1
-:1087400070000000000000002801A620F9003E4152
-:108750002D9003E400F9203E404F9001A400F90061
-:1087600036408F9207E400F100BE400F9003CA002C
-:1087700060000000000000002810A000C8003E209B
-:108780000C8003E040F80036122C0003E0C0F80033
-:1087900032100D8403A000F8023E080F8000CA04C6
-:1087A000200000000000000028053A908E002DA057
-:1087B00080E802FA00BE40238008E802FA008A003E
-:1087C000368008A002E800BA002F800BA0038A00C0
-:1087D00040000000000000002805460283002C80B5
-:1087E000082242C680B1602EF4083822CE00A300D1
-:1087F00020C0083002AC00B1002E400B3002CA008D
-:108800005000000000000000A0011E0285012DC2E2
-:10881000A84402D400BD0129401868D2DC008F8032
-:1088200025CC287342DC80B5302DC01B7202E800D5
-:108830004000000000000000A8081E04C6823DE0C1
-:108840000C4812D610F5803CA00C7003DE00E790B7
-:1088500023EA047A039E00F5803DE00F7A03EA02E2
-:108860000000000000000000080DAC009C003EC0AD
-:108870000F8003E410F90036010FA003C000EB00E5
-:108880003ED84EB083EC00F9003EC00FB4438206E0
-:108890006000000000000000C005DE00CF8431E071
-:1088A0000EC843D600CD8033E0CDD9033A00FF880F
-:1088B00033E00FF913FE24FD803F200CF6831000F7
-:1088C0007000000000000000A8119C00850021C479
-:1088D000284082D000D500238048C9021C00B70080
-:1088E00021C00B7102DE80B5102DC028F0022A04D1
-:1088F000600000000000000010009C00960021C0F5
-:108900000A4102F5408D0021400952029820B7002B
-:1089100021C00B7006DC80B5002DC0087002040079
-:1089200020000000000000006014CC10980000C07F
-:10893000880482C000910420030900028A00B30A5F
-:1089400020C48B3402CC00B9002CC00030021804C3
-:108950003000000000000000F815AC00DB00B0C0E3
-:108960000E9C02C500C110B2C00DB00BA708FF00DD
-:10897000B3C00FFA03FC00FD003ED40CF00B2E0434
-:1089800060000000000000008000EC04ED003E40AC
-:108990000F8403E540F9403E60CEB4436400FB80A1
-:1089A0003EC20FB013EC00F9023EC04FB003E1002D
-:1089B00030000000000000009010FF00CE0033C027
-:1089C0000EC0077404EC0011800CCA03FE60FF00A7
-:1089D0003FC00FF0833C00DD00B3502CF0032004B7
-:1089E000300000000000000081004C048B0B22705E
-:1089F00008080367208A88A200288402E700BB00D9
-:108A00003EC00BB0022C00B900226108B0036040E8
-:108A1000100000000000000080052C008B2022E2E6
-:108A20000A8C022600A9802AC008B442ED00BB00CF
-:108A30002EC00B30022C00B90020800830026000EC
-:108A4000400000000000000008040E018100A0C0EA
-:108A5000088102440081002881083202CC00B30062
-:108A600028C00B30020C80B10020C0083012420137
-:108A70000000000000000000800D6C00C20132C048
-:108A80002E80162C08E9003A400C8003EC00F70019
-:108A90002FC00FF00B2C00D90030400CF003600306
-:108AA0005000000000000000A00DF808FF003FC0CB
-:108AB0000FC217FC00F70037000F8403FC00FF0013
-:108AC0003FC00FF003ED00FD003F400FF003E8064C
-:108AD0007000000000000000C005FC00CF30174807
-:108AE0000C5903B900DF2835240D82A37C80FF00D8
-:108AF0003FC80FF203E4A0EF803FE18CD843300081
-:108B000070000000000000008010ED488934A37060
-:108B100028B02360008BC0224008B4822F40BFD110
-:108B20006FF48EBD02E700BB803AE008980A280483
-:108B300030000000000000008805C4B09100A8507B
-:108B400008B202C884930024490B02024C00B3040B
-:108B50002CC00B30428400B3002E000AB012220158
-:108B60007000000000000000C011AC0299182A44F7
-:108B700008B882A201BB0028600AA0126C00BB00EA
-:108B80006EC00AB002E400BB002A002AB00238041A
-:108B900060000000000000004011E408DAC03A6004
-:108BA0000C180AEB04DB0036E00785836C00FB0041
-:108BB0002EC00FB043E400EB003E880E18031004F3
-:108BC0007000000000000000E0419C10E9003760E8
-:108BD00087F0177000CF0137C04C9803BC00FB0032
-:108BE0003FC20FF003E400FF403FE40DD903F00063
-:108BF00060000000000000004010A400F4003040BD
-:108C00000FB4039900FB003EC00D04232C08FB8821
-:108C100032C00FB003E600DB103E020FB083D00479
-:108C20002000000000000000C8052C00B950A24838
-:108C30008BB0032000D7802ED80080023C00BF807C
-:108C400023E88BF002F4408B400C4203B602F200A2
-:108C50004000000000000000E0054C00B24400C8E5
-:108C60000B30128C00A38024C80B000ACC00B34444
-:108C700004C01B3602C501830C2CA00B3002F80087
-:108C8000500000000000000020011E08B790216481
-:108C90000BF8024A0497812FE40A78029E00B780FD
-:108CA00021E08B7882D68687842DA00B7802C000C5
-:108CB000400000000000000048080400F20030C03E
-:108CC0000F30038C00E30A3CC00F18038C00F30242
-:108CD00030C01F3001C680C3003CC00F1203DA024F
-:108CE0000000000000000000400DBC00FF003F41FC
-:108CF0000FF003B808FF083FC00DF0033C20FF0849
-:108D00003BD20FF003F440EF003FC40FD003D00676
-:108D10006000000000000000A805E400FE0032C270
-:108D20000C300B2600FB8036C00DA003EC00FBE0EE
-:108D300032D00FB8436444DB043E800FB003E2003E
-:108D4000700000000000000048119C00B700A1C0A6
-:108D50008870031000B72021C0087002DC80B33097
-:108D600031C80B7402140087402DC04B7002D20032
-:108D70006000000000000000C0009620B68020E0E7
-:108D800028F8029410B78127E2097802DE00B7A024
-:108D9000A9E80B3802760087802DA00B5802F0005E
-:108DA00020000000000000004814CE10B30020C4D2
-:108DB0000820028010B30022C808B002CC11B30210
-:108DC00028C00B3002040093802CD20B1002D20476
-:108DD0003000000000000000E815A800FE4032A0AE
-:108DE0000CE4039880FA0037A00DE083E800FE0051
-:108DF0003A800BA0036800D8A03F900FA003FA04AC
-:108E000060000000000000004800E008F8083E0094
-:108E10000F80032000F8403E000F8003E000F804BC
-:108E200030100F8003E002E8003E000F8003D20004
-:108E300030000000000000000810E400F1003240A3
-:108E40000E9083A400C9803E400E9003A400F90058
-:108E50003E400C9003E400C8003E408F90030204A3
-:108E6000300000000000000080046400B940A062EF
-:108E7000081002241089002E400890022400B90036
-:108E80002E52089402C40089402E400B100360103B
-:108E9000100000000000000018052400B91822444A
-:108EA0000A9002AC0089102EC00A9002A400B9807A
-:108EB0002E60089802E60289082E400B90020600F8
-:108EC000400000000000000008040480B120A04819
-:108ED000089002240881232C500810020480B1203D
-:108EE0002C48281202E48081202C400B9802420575
-:108EF0000000000000000000B80D6140F850320092
-:108F00000E8503A1E0CA003E000E8503A000F80014
-:108F10002E009CA003E000C8283E000F80032E0115
-:108F20005000000000000000981DF440F5103F4480
-:108F30000FD003F400F1103D408FD403E450F9103A
-:108F40003E450F9103D440FC003FC08FD023E60480
-:108F500070000000000000001805E620CDA8334096
-:108F60008DD0032680CD003D500C9A036400F9A0FB
-:108F70007A6A0F9A63E680C9803E400F900306002C
-:108F800070000000000000003810E10088E03600AA
-:108F900008800A2142C8002E290CA4422000B840B3
-:108FA0002E000B8102E10088023A010BC0020E0480
-:108FB00030000000000000000805C40281082440C1
-:108FC000091002040091002C404B14024400B5101B
-:108FD00029400B5002F500B5002D400BD0020201D4
-:108FE00070000000000000001811A6018900264052
-:108FF000089402240189002E401A90026C00BF02DE
-:109000002F400BD002F402BD802B408BD83A0604CF
-:109010006000000000000000A015E400C905364112
-:109020000D1C032400D9003E422F94036400F90074
-:109030003A400F9003C400F9003E700F100328045B
-:10904000700000000000000028018408F9243E4060
-:109050000F9103E400F9003E410D1003A400F90054
-:109060003E400F9003E400C9003E640F9003CA0025
-:1090700060000000000000002810A008C880320234
-:109080000F80030000C8083A10CE8403E000FC0003
-:109090003F008FC003F080FC003F180FC043CA049C
-:1090A0002000000000000000280528008E00A1809C
-:1090B0000BE0022800DEC2239000A002E800BA0004
-:1090C0002E800BA002E800FA002E800BA002CA003E
-:1090D000400000000000000028054C00998160C09D
-:1090E0000B10020C0090102AFC0B3002CC00B300D5
-:1090F0002CC00B3002CC00B3002CC00B3002CA00D5
-:109100005000000000000000A0011C82954021C01A
-:109110000B50021C8090802301097212DC00B60003
-:109120002D000B4002D000B4092D004B4082E80016
-:109130004000000000000000A8083E80DD80B1E093
-:109140000FDA030F80D48039E00B7A03DE00F5805C
-:109150003D200F4803D610F6813DE08F6803EA02F8
-:109160000000000000000000081DAC00ED003E0003
-:109170000F910BEC10F8003E000EB003EC00F8006D
-:109180003EC04FB003E800E9013E000F9003C20665
-:1091900060000000000000000005FE20BF8133A435
-:1091A0008C19033E00CD803FE00FF8833E00EF8036
-:1091B0003FE00FF913FA10FD803FA40FD803C00061
-:1091C0007000000000000000A8119C00BF2031C208
-:1091D000085A023C0287002D940B700A1C4086102E
-:1091E0002D000B4002D400F6002D404B6002EA0433
-:1091F000600000000000000000009C00B701238018
-:109200002850021C0084002DC00B30021C00B50049
-:109210002D000B4006D040B4082D800B4802C00042
-:1092200020000000000000002014CC00B308A020A3
-:1092300008118A0E0080002C900B37020C00900061
-:109240002CC00B3042CC04A3802C500B3002C8043D
-:109250003000000000000000A815BC00F98032605A
-:109260000CD4033C8088003ED00FF8032800FA009D
-:109270003EC00FB007EC01BB803E540FB006EA04BD
-:1092800060000000000000008000EE08F9803AC095
-:109290000F9003EC00F8403E580FB043E900EB4458
-:1092A0003E000F8003E00DF8003E800F8003E000D9
-:1092B00030000000000000000110DC00CF0033404F
-:1092C0000CD0033C30CC003BC02DF003D802CC00C6
-:1092D0003D000CC003F400EE0237400CE003C04434
-:1092E000300000000000000081046C18838420001E
-:1092F0004A10020C00A8482E6008B002E90089401C
-:109300002EC008B002E810B10120800A9003A040EE
-:10931000100000000000000080052C008B82220855
-:109320000890022C1488042C0808B012E8008A0067
-:109330002EC00AB002E801B9002604089002E0003D
-:10934000400000000000000008040C008380A2C060
-:109350000A92022C00A2002C00083402C8008300EC
-:109360002C00280002C401BA0022C0022006C2015B
-:109370000000000000000000000D6C00CA00B200F8
-:109380000C920B2C04C8043A000CB403E800C8008B
-:109390002E000C8033E140E80036000C8003C0034F
-:1093A0005000000000000000A01DFC00FF003D0078
-:1093B0000FD10BFC01FC003F000FF003D800FD00B3
-:1093C0003FC00FF003FC80FF003FC00FF007A8066E
-:1093D0007000000000000000C015F300CF80356071
-:1093E0004E68435C00E78039C00CC1037E00CF3477
-:1093F00035E14DF2037C00DF383FC80FF803F00081
-:109400007000000000000000C018C800DB8422606B
-:1094100008AC0A2C008B8022300891222C90276106
-:1094200022CA88FC22BF008B622FD009B803B00487
-:109430003000000000000000C805E280A9022440BE
-:109440008234420400A90028C54832024C208330EF
-:1094500020C00831020D00B3202CC40B3002F201F1
-:109460007000000000000000C005AA02B9042260DC
-:1094700028B2022600898802C0083112EC008B0055
-:109480002AD008B002AC002B002EC00BB002B004F2
-:109490006000000000000000C005E200E30036208C
-:1094A0000EA4636E00E1C01AC10C80036870CB008B
-:1094B00036800DB0034C00FB043EC10FB003D00456
-:1094C0007000000000000000E001B804DF003F0071
-:1094D0000FE803FC00FD003F002B98033A007700E3
-:1094E00027E40FF003FC00DF003EC00DF043F8005E
-:1094F00060000000000000005000A468CB203A90FB
-:109500000F24A3AC00E9503AC00EB4832C08EB0042
-:109510003A900EB08BEC80FB003EC00EB00390047E
-:109520002000000000000000C8010A008BA020807D
-:109530000DA8022C04894028E808B2022C00AF00D4
-:109540000280087C033D803F002FC008B002360037
-:109550004000000000000000E0054900034028C072
-:109560002B284A2800A10068D20A2042A401A300A7
-:1095700002400A34020D0033002CC00A3000B8004B
-:109580005000000000000000B8011A00879021E49C
-:109590002BC8123A0085C02B21286802B600A78488
-:1095A00023600838801E00B7802DE00878022E0066
-:1095B000400000000000000048080800C1003854C6
-:1095C0000F26838000E03428C80E2C0B8C00E300AB
-:1095D00078450E30038E80F3003CC80E30039202B3
-:1095E0000000000000000000401DB800F5023F44EC
-:1095F0000D9003F800BD141FC00FE1235C449F428F
-:109600003FC00FF4827D40FF103FC04F7007D0066F
-:109610006000000000000000A805E802CB0038C090
-:109620003CA003EC00E9003EC00CB0032004FB2189
-:109630003E804FB403CF00CB003ECC4FB043EA0096
-:109640007000000000000000C8919800870021C051
-:10965000084002DC04B5002D002D70021C1CB7026E
-:109660002DC00B7202DC0087402DCA8B7002F20401
-:1096700060000000000000008000BA0087882BE036
-:10968000187822D611A4822FE00878021200B7942D
-:109690006D604B7A02DE40B7A02DE00B7806E0004B
-:1096A00020000000000000004814C912838228D462
-:1096B000980006EF05B1902CC109B4020C04B30167
-:1096C0006CF00B3002CC00BB002EC00B3002D20479
-:1096D0003000000000000000E815B840CA803BA040
-:1096E0004CE502F880EE003D802CE00F3880FA0057
-:1096F0003FA90FA003E800BA023E808BA003FA0442
-:1097000060000000000000004800E010F8002602A1
-:109710000F8403E024F8003E004F80A3E030F800FF
-:1097200036020F8023E00408003E000F8003D200C1
-:1097300030000000000000000810E400D900B6412D
-:109740004E990BA40069103E400C9003A410C90070
-:109750003E400D9203E600F9003A400E9003C20429
-:1097600030000000000000008004640081002042FE
-:1097700008149A240089006E500090022410D90227
-:109780006E400B9403A700B9002240089003E0004C
-:109790001000000000000000180506009900A64116
-:1097A0000A90062C00A9096E5008910284048900D1
-:1097B0000E400B9402E549B9000A400A9002C60027
-:1097C0004000000000000000080406008100224064
-:1097D0000812220481A1002C4008160204009120E6
-:1097E0002C400B12428489B1202048081002C2018B
-:1097F0000000000000000000B80D6140D8003600F5
-:109800000A8003A140E8002E000C0023A140C850AC
-:109810002E140D8003E000F8503A000E8003EE0392
-:109820005000000000000000881DD400F500BF407B
-:109830000FD103F444DD023D502BD123F400F91085
-:109840003F400D9103A448F9123E4E1F9003A6021B
-:1098500070000000000000001815F400C5043B4033
-:109860000FD803A780FD00B3680DD843A510C9A089
-:1098700032514F5A433600C9A07A680BD003C60153
-:1098800070000000000000007818CA8888020200FA
-:109890008D84222342F8002204288AA2AA9488E90F
-:1098A00020A80A800A214080E22E280B8002CE04E4
-:1098B00030000000000000004805C420A104A8C03A
-:1098C0000B1C2A2400390420402A1E02E480B11017
-:1098D0002A48091446040081382C5B0B1002D20080
-:1098E00030000000000000001805A412A924224046
-:1098F000299002240039000258081810E601B90026
-:10990000AA44089002240089000E410B9002C6046C
-:109910006000000000000000A005E400E1012A64EE
-:109920002F94132402716012604D9000C502F9005B
-:109930003A400F90232402C9023A400F9002E804F3
-:1099400050000000000000006801A400D9003E6043
-:10995000AF90836488F9203E62039083A400C9001D
-:1099600036600F1003C400F9007E400F9003DA0048
-:1099700060000000000000002800A100C882320042
-:109980006F0003A000D84030000E80036004F8018F
-:109990003E104F808B2200F80032010E8003CA0473
-:1099A0002000000000000000280138000E00A990EF
-:1099B0002FE62088009E8023800AE8032800BA0052
-:1099C00018800DEC023880BA00A28008A0038A003B
-:1099D000400000000000000028056C02838020C8C1
-:1099E0000B20020C01921068C03A3C02CC103B02E2
-:1099F0000CC0283C024E00B30028C0283002CA0028
-:109A00005000000000000000A001140087422BC09D
-:109A10002970229C00B6002BC20A60861C00B72168
-:109A200029C00074025C00379101E0087402A800AC
-:109A30004000000000000000A8081E00C78021E0D0
-:109A40002F78029E00968039E02EF803DE30F7D0A2
-:109A50002DF20078035200F7A23BE00E7807EA02ED
-:109A60000000000000000000081DB400FB000CC056
-:109A70000F3003EC10D300B4C02F80036C48FB0000
-:109A80003EC84D9003A400FB201EC00FB003C206C9
-:109A900060000000000000000005FE00CC802B2CC0
-:109AA0002FF8037E006E803BA10DD8433E00FF904F
-:109AB00033E00FE933FE00CFC03FE20FD803C00010
-:109AC0007000000000000000A811B44087002104CD
-:109AD0000878021C00860021C0289002DC00B71024
-:109AE00021C00F7302CC0087002DC00B5002EA008A
-:109AF000600000000000000000009D00A400294854
-:109B00006AF0824C00AE00A1C42974025C40A3102C
-:109B100061C20B6006C80087002DC00B5002C00454
-:109B200020000000000000002014E601A3022040F5
-:109B3000283C020C00834220C8081002CD00B3006C
-:109B400028F00B3002CC0183042CC0831002C8041F
-:109B50003000000000000000A815AA80EB0038C00B
-:109B60000A90037C22A24032480DB00B3E00FF0059
-:109B700033F40F9003EC008F023FC00F9003EA0410
-:109B800060000000000000008000E000D9023EC03C
-:109B90000EB603EC00FA203EC04F2423AC60FB005D
-:109BA000A6C00E9003E400FB003CC10F9003E00050
-:109BB00030000000000000000110F802CF0033E088
-:109BC0002CF013BC002E10B1642EF0023C00FF02FA
-:109BD0003FC14DEC63FE00B7003BC00CD803C0444E
-:109BE000300000000000000080046C28818122E029
-:109BF0000A38023C04BAC932E02084022C00BB00BF
-:109C00002EC00B9C02E781BB0422C00A9902E0002F
-:109C10001000000000000000800528408880228895
-:109C200028BC42AC00BA002A80088402AC00BB0009
-:109C30002EC00BB082E890AB0062C008B012E0000A
-:109C400040000000000000000804000089002A8095
-:109C500028B2020C00BA0020C00800028C00B30039
-:109C60002CC00B30204C14B30020C0083002C201BD
-:109C70000000000000000000000D6800C800B2C035
-:109C80002CB203AC00FA003AC04EA503BC00FF00A2
-:109C90003FC009A003E904EF00BAC00CB001C00145
-:109CA0001000000000000000A019FC00F50035C005
-:109CB000AF3403FC00F40039C00FC2037C00FF0185
-:109CC0003FC00FF003FCA0FF003FC00FF003E8050A
-:109CD0006000000000000000C005FC00FF293D20DE
-:109CE0008EC1033248DC8023250EF2033CC0DF84A2
-:109CF00033C90FF203FC00CF8033400CF203300075
-:109D000070000000000000008010ECC0BB602E0856
-:109D100008810220048820204808F1822DC0830099
-:109D200022D409F502FC088B01224028B402200449
-:109D300030000000000000008805CC20B3092C8210
-:109D4000081016A010900828480A32020C00BB0028
-:109D50002CC00B3002CC02930120008A3122E20198
-:109D60007000000000000000C015AC04BB002C8097
-:109D7000088602A020A0002A600AB0102C00AB0CBC
-:109D80006EC009B002CC009B0022600AB002F00451
-:109D900060000000000000000015EC00BB003E3435
-:109DA00008A00B8300D9023AE02EB00B2C00F880FB
-:109DB0003EC04FB003EC00CA40B2720EB00BC004FC
-:109DC0007000000000000000E001BC10FB003F003C
-:109DD0000DF8137048DD4037C28DF003DC00DDC89C
-:109DE00013C00FF003FC00EE407F400D70033800FD
-:109DF00060000000000000004010AC00FB0132C019
-:109E00000410032040E8103AC00DB003AC08F8403D
-:109E1000B2C02CB033A482DA40BA400FB003D004F1
-:109E20002000000000000000C8053C08BF8022C8D8
-:109E300008B700234488D022D0087082FC00B2E02A
-:109E400003F408F50237048BD122604BFD02F200C7
-:109E50004000000000000000E0054C00B310A440EA
-:109E60000800024800A0422AD00130028C00B380D2
-:109E70002CC0093102CC00890022E8033802F80026
-:109E8000500000000000000060011E00B780276441
-:109E9000684A0252008C8021E0087802DE00B78018
-:109EA0002DE21939025E30859821E40B7902D80041
-:109EB000400000000000000048080C00F3203400BF
-:109EC0000CB8034880E22238C00D30038C00F30048
-:109ED0003EC00D3103EC00CB0038060F3083D202B8
-:109EE0000000000000000000401DBC00FF003B011E
-:109EF0000FD0039000F6003FC00FF401FC00FF01FB
-:109F000033C20EF513BC00ED003FC40FF003D006C2
-:109F10006000000000000000A805EC00FB003CC051
-:109F20000EA0016401D80032E02CB5032C00F20031
-:109F30007AC00DB4032D80C90232C00CB0032A00D0
-:109F4000700000000000000048119C80B7002DC088
-:109F50000D6002D001840021C00830021D00B7004E
-:109F600021C80BF4031EC0860021C0087C035204E4
-:109F70006000000000000000C0009EC0B7902DE00F
-:109F8000087806D601B48221E008780A1E00B5C020
-:109F900029E809780236C1978028B00A7A02300091
-:109FA00020000000000000004814CC00BB002CE0A2
-:109FB000093582C0C1A05120E40830028C00BBC426
-:109FC00020C00B300206009318AAB02A300A5204AF
-:109FD0003000000000000000E815A800FA013DACC8
-:109FE0004CEC137810F680B3900CA0032800FE0010
-:109FF0003A810DA00F2A80DE043BA00EA0033A0494
-:10A0000060000000000000004800E000F8003E0092
-:10A010000D8002E100D8483E120F80136000F86006
-:10A020003E00078003A002E8042608058003920092
-:10A0300030000000000000000810E400F9043A407D
-:10A040000C12032482C90036440F10032400F900C7
-:10A0500036400490030400C90012400C900302042F
-:10A06000300000000000000080046400B98122403C
-:10A0700008901A2400890022680B99022400B90074
-:10A08000224068900A24008900A24008900A20001B
-:10A09000100000000000000018052400B91022E0A4
-:10A0A00008940004048B0826C00B90022404B90C09
-:10A0B00024400A1002240023022A40A810020600AD
-:10A0C000400000000000000008040490B12022407D
-:10A0D0000812020C108102A0500B12020480B1057C
-:10A0E00000480A100204A0A100284A081200020138
-:10A0F0000000000000000000B80D6140F850BA14E4
-:10A100000C85030142C85034000F85032140F8003C
-:10A1100036000E80132080E0001A080C00032E0386
-:10A120005000000000000000981DE444F9103F407A
-:10A130002FD113F404F5003F400F910BE440FF28AA
-:10A14000BE4E0D9683D4A2DD28374A0F9383E606D0
-:10A1500070000000000000009805E410CD003F40B2
-:10A160000FD00335025D0131440FD0032400F90004
-:10A1700032600C9883E640D900366A0C9E83260133
-:10A1800060000000000000003810E00088002E0091
-:10A190000B804202808A0022208880032008B88237
-:10A1A0002221088882E24288A8222008CE020E04DA
-:10A1B00030000000000000000805C4028100684073
-:10A1C0000B10028401B900204049100A0400B508B0
-:10A1D0002146085002D4008D20254A0B500242012E
-:10A1E00030000000000000001811A40089046E5423
-:10A1F0000B1012A401A900A2401890162400B90067
-:10A20000234018D002F4008D40214A0BD0024604AE
-:10A210006000000000000000A015E400C9003A50F2
-:10A220008F960B8402F10130488D90032410F900C1
-:10A23000B2402C9003E640D1C036502F900B6804FA
-:10A2400070000000000000002801A400F9003E603A
-:10A250000F99C36400D9283E400D9003A400F94033
-:10A260003E400F9003E420F9403E400C90038A00EA
-:10A2700060000000000000002810A000F801360077
-:10A280008F8003E002F80432000D80432002CC00EE
-:10A290003F000FC0139002DC403F104CC0230A0463
-:10A2A000200000000000000028052800BA002280DD
-:10A2B0000BE820F8004EC023A008A00368008A0025
-:10A2C0002E801FA0022A068A002EA00260030A0028
-:10A2D000400000000000000028056C00B30020C012
-:10A2E0000B3D02C003230020E001B0064C008B00B0
-:10A2F0002EC04B30028E0883802CC400348E4A005E
-:10A300005000000000000000A0011C80B58061C06A
-:10A310000B4002D400840823C20850025EC08401AE
-:10A320002D008A0802102484086D000A03122800F8
-:10A330004000000000000000A8081E00F582216017
-:10A340000F7803D604AE8031E00D58237E00C6801E
-:10A350002DE00B78038E00D7823DF00C7A036A0261
-:10A360000000000000000000081DAC00F100BAD899
-:10A370000F8003E412F800BE800E1003EC00F90019
-:10A380003E005F8003E008F8043C000F8003C20633
-:10A3900060000000000000004005FE20FF803FF04C
-:10A3A0000FF803D200EF84B3610CB903FE00FF8005
-:10A3B00033E00CF8132211CD903F600CE80310003D
-:10A3C0007000000000000000A8119C00F5002DC0E6
-:10A3D0000B0002D40484202340085A02DC00B4009D
-:10A3E000210028C2021E0486042D8808D0022A04F7
-:10A3F000600000000000000010009C00B5002D402F
-:10A400000B7002F420A70421C00A5002DC00BE0039
-:10A4100021C0087012000085002D4088680A0400E1
-:10A4200020000000000000006014CC00A1002EC03D
-:10A430001B0806C420800020981A1002CC00B10826
-:10A4400020000800020C0182C02CAC2890221804C5
-:10A450003000000000000000A815BC00B3003E4022
-:10A460000FBA03E502E9043290AEB003FC10FB40E2
-:10A47000B2000C800B2C0282183FA00CD0032E04DB
-:10A4800060000000000000009000EC04FB013E4072
-:10A490000FB643E400F8003E80019003EC00F88121
-:10A4A0003ED00DB453E000F9403E400FA003E00061
-:10A4B00030000000000000008010DC02CD8033601E
-:10A4C0002CDA03FC00EC0033400FF2037C04FE00A6
-:10A4D00032000CC8033C00CE0031800CD1032404B0
-:10A4E000300000000000000091046C0009002A64A4
-:10A4F000088E02C210A0103E100B9802EC00B900AA
-:10A5000002D808BE2220008900225008A002204064
-:10A51000100000000000000080052C000B202240ED
-:10A5200008A002E542AB0422180BB0026C00B30095
-:10A5300020040801020004A8402210088002200024
-:10A54000400000000000000008040C0883002840C0
-:10A55000080402C402A8002C000B1202CC00B000B8
-:10A5600020C04030020C008B00A8C008300202114D
-:10A570000000000000000000800D6C00C9003340A6
-:10A580000CB003EC02EB0032400FB0036C00FA0099
-:10A5900032000C80032080C80030000C80032003B0
-:10A5A0005000000000000000A019FC00FD003F402A
-:10A5B0000FC213F000F4003F004FD403FC00F5007D
-:10A5C0003FC08FF003FC40FF0037C02FF003E806C8
-:10A5D0007000000000000000C005F000CC00330057
-:10A5E0000ED00B3300CC0033E00FC0837C00CF20B3
-:10A5F0007B098CF803FE50CF383FE10DC203F00019
-:10A6000070000000000000008010E2009808208028
-:10A61000089802200088D022E00EB4227D199F699C
-:10A620002E900830922881DB642EE18816A2E00487
-:10A6300030000000000000008805C80090242001C0
-:10A640000810160082830128C10B02820CE0A310BF
-:10A65000280E1B9202848493202EC0083102E2014E
-:10A660007000000000000000C015A81098002280B3
-:10A6700008900200608A102AC00A20026C18BB00F1
-:10A680006E602B900246208B002EC208B182F0042F
-:10A6900060000000000000004011E402CB00B24066
-:10A6A0002C920327008800BAC00F88032C00EB040B
-:10A6B0003AA0CF2CA3ED009B003CF02D8C33D004AE
-:10A6C0007000000000000000E001B404EF003FC093
-:10A6D0000D5103F000F18137C00EF4039C10CF0040
-:10A6E0003D800CEC07B808FF021FC40FC803F80038
-:10A6F000600000000000000040109E00C3003840D1
-:10A700000C9203A480FB203AC00D94032C40FB0064
-:10A710003E010F8003E500EB003AC00D840B1004EE
-:10A720002000000000000000C8052C088B0222C099
-:10A7300008920321008B4822C00BB7023D403F0125
-:10A7400022740B90022804BF00B2C00B85023200B5
-:10A750004000000000000000E005400180002800EB
-:10A76000082C128840B04008C00B18020E00B3003D
-:10A7700028201130020C00B3002400090006380024
-:10A78000500000000000000020011200848021A081
-:10A790002868123A00848025E08B58021E40B78258
-:10A7A00021A60B78021A00B78021200B580208005E
-:10A7B000400000000000000048080800C8213809D7
-:10A7C0000C28038001F10038C00D85020C00FB004D
-:10A7D00038850F10038C00EB103CC80D30031202BB
-:10A7E0000000000000000000401D9800FC013F80B8
-:10A7F0000F6803D040FC003BC00DC003FC20FF00ED
-:10A800003BC50FF00BB440FF183F000FF103D0061B
-:10A810006000000000000000A805E400EB00B0416B
-:10A820000CA003E004CA04B0E00EB003EC80CB201F
-:10A8300032810CA003EE00DB003E000EB0032A00C4
-:10A84000700000000000000048119404870021C03F
-:10A85000486002F000870021C0087002FCA0832835
-:10A86000A380086002DC0087202DC00B7002120458
-:10A870006000000000000000C0009C02A380216076
-:10A88000086802D200878021E0297802DE80879064
-:10A8900021A0194802FE0097802DE00A388230007E
-:10A8A00020000000000000004814CC01838020C07C
-:10A8B000082042C0308370A0C0893402CC028300DB
-:10A8C00060C0290002CE0083002CC80BBC02120419
-:10A8D0003000000000000000E815A900EAE2329014
-:10A8E0002CE003FB02CEC032800FE403E8008A00B4
-:10A8F00033880D64C3FA00DA003D900EE00B3A0491
-:10A9000060000000000000004800C024F8083E126B
-:10A910000FC003E048F0003E000E8093C000F80036
-:10A920007E010E80C2E040F8007E008F8403D200DA
-:10A9300030000000000000000810E500C1013248AE
-:10A940000C9803E640C90032400F90036600C9002E
-:10A9500018610C90036420F9053E400C90830204BA
-:10A9600030000000000000008004662089002052B2
-:10A970002810C22602A90022400B900A2700A90035
-:10A9800022700890022408B9002E400A900A200084
-:10A990001000000000000000180524028D00234074
-:10A9A00008D1028420890022600B11F224B08100BA
-:10A9B0002A460890426408B9002E40089202060018
-:10A9C0004000000000000000080414808520234897
-:10A9D0000852028408810020400B12020480A1204A
-:10A9E0002849289002040031202E4008320202013A
-:10A9F0000000000000000000B80D6000C850B21454
-:10AA00000CC003A140C800B2000785032140C85014
-:10AA10003A150C85036140F8513E002C85032E0346
-:10AA20005000000000000000981DC448F9103E448A
-:10AA30004F91037400F5443E400FD103E440F910F8
-:10AA400037440FD003D400F9103FC00FD103E606FE
-:10AA500070000000000000001815F6A0DD8C3378AF
-:10AA60000EDA033500CDA033400DF80B3681E980B6
-:10AA700033700C9103E440F9C03EC00FDC03C60004
-:10AA800070000000000000003810E104B840203CD5
-:10AA90000C850202848A402200088F822300B8E8D5
-:10AAA0002220088802E200B8D02E000B8C02CE04CF
-:10AAB00030000000000000000805C400910060485C
-:10AAC0004B1002048A814060404910028DA0A141D0
-:10AAD0002050091222C480B1202C404B3E02C201FA
-:10AAE00070000000000000001815A408B904A04080
-:10AAF00048B0022400890082400890A6A400B9044E
-:10AB00002254299502E540B9006E400B9202C6041A
-:10AB10006000000000000000A005E4009100324049
-:10AB20000F90092400899032400D9403A400E9029B
-:10AB300072600D9403E401F9013E600F9003E80494
-:10AB400070000000000000002801A440F9003E4011
-:10AB50004F9003E710F9803E400F10136400F1009E
-:10AB6000BE400E9003E608F9013E640F9003CA0050
-:10AB700060000000000000002800A000F80032087B
-:10AB80000C010B2040C84032000E84832000F804E2
-:10AB90003E040F80032100E8003E100F8803CA0422
-:10ABA0002000000000000000280538003E0423803B
-:10ABB00008EC123944A600288108E0003808BA00E1
-:10ABC0003F800BA002A8008A022E800BE002CA0080
-:10ABD000400000000000000028054800310024D09B
-:10ABE000083E12AE0881A02CC00A38004C00B30009
-:10ABF0006EC00A30020C00A3006CC00B3002CA0009
-:10AC00005000000000000000A0011800B51025C091
-:10AC10002860129010A5082DC20864225818B700A9
-:10AC20002D800B7902BEC087016DC00B6002E80069
-:10AC30004000000000000000A8081E00F584352038
-:10AC40008C18029210C5803D600EC80B5A0877F32D
-:10AC50003DA00FF8031EB0E7853DE00F7803EA0240
-:10AC60000000000000000000081DAC00F104BA0163
-:10AC70000FA0436009E10038400EA003A814FB2098
-:10AC80003A800FB41B4C80FB293EC00FB023C20694
-:10AC900060000000000000000005FA00CD803BE0ED
-:10ACA0004EF803F202D4813BE08E98073E44EF91C8
-:10ACB0003FE04FFC07EED0CF9833E40FF803C0001D
-:10ACC0007000000000000000A801980085102DC44D
-:10ACD0000D1102F000852031C40B7B003840D710E5
-:10ACE0002D800B7062FEE1871439C00B6002EA040C
-:10ACF00060000000000000000010BC40A5002940DA
-:10AD00000B5082DC4084042DC00B10065844A71061
-:10AD10002D800B7102DC00870421C20B5002C01091
-:10AD200020000000000000002014CC0AA1012C40EB
-:10AD3000891802C100A10820C00B34064000930509
-:10AD40002C140B3C86CE10830128F10B1402C8048E
-:10AD50003000000000000000A815A000ED003AC07F
-:10AD600007BC63ED0081403EC00E88036400EF0025
-:10AD70007E500FF002FD42CF0072C01FB403EA0400
-:10AD800060000000000000008000E80099003EE044
-:10AD90004FB483ED9009403EC00FA183A801EB01A1
-:10ADA0003E000FB113EC0CFB003AC05F2023E00023
-:10ADB00030000000000000000110F800FD043FB06A
-:10ADC0000D60033E00CD0033F00FF201F000FF03F1
-:10ADD0003F030FF001FC00FB0233C20FF0E300441D
-:10ADE000300000000000000081046A00B9022EA0BB
-:10ADF0004AAC020E80F9C036E10BA0022A08BB0063
-:10AE00002E200EB002EC00EB0022C08BB0022040DE
-:10AE1000100000000000000080012300A90028C0ED
-:10AE200009B2226C4089892AC00B14062600AB02A5
-:10AE30006EE009B0066C00B30222C00BB002200025
-:10AE4000400000000000000008040800B1002CC011
-:10AE50000A30022C00BB0064C00B320A0800330029
-:10AE60006C80023046CC18A30020C00B28020211CF
-:10AE7000000000000000000000056800E90038C183
-:10AE80000DB10B2C0089003AC00B90036000FF024B
-:10AE90003E800FF003FC80FF0032C08F800B000368
-:10AEA0005000000000000000A011D800FD043FC0C9
-:10AEB0002FF203FC11EF003FC00FF4437000FF00BE
-:10AEC0003F0046F003FD00EF003FC00FC003E8065F
-:10AED0007000000000000000C005FE00FF803DE0A3
-:10AEE0000CF913DE007F80B3E00FFC03BE40CF807F
-:10AEF00033F00FF8037C04CC8033A00CF00B30014E
-:10AF000070000000000000008010E02088002E206B
-:10AF1000088212E080A88122020B80022080A88093
-:10AF200022080B80022C028804AA2008B002200408
-:10AF300020000000000000008805EC00A3082C8021
-:10AF4000083202C420A30028400B92028400A90109
-:10AF500028C81B1282CC40A80024E00A30422201FB
-:10AF60003000000000000000C011A880A8022E40A0
-:10AF7000688010C800B8402A900BA0002800AA08DA
-:10AF80002A020320028C00A8882E200AB002300476
-:10AF900060000000000000004015E804FA003C409A
-:10AFA0000CA003E800EB003AC00F2053A800E340D8
-:10AFB0002A400FA0036C00A88034201EB0031004A8
-:10AFC0007000000000000000E001B4009D913F808F
-:10AFD0000FDA23F400CC20370007D0137400BC0034
-:10AFE000B7800BD0437C00DC043B006DF003F8001D
-:10AFF00060000000000000004010A800FA803A0045
-:10B000002CA00B2002CB623E500E88032000D910EA
-:10B010003E708C8033EC80D8403A020DB0031004AF
-:10B020002000000000000000C8010C00398022C090
-:10B030000C9D822C10D0402EA008B8034E028A40EE
-:10B040000EA00DB0033D00D09036100BF002B20000
-:10B050004000000000000000E0054C00B10060C0AE
-:10B060008A18028C0880400CA0023002CE00824870
-:10B070002C802B30068C008102209009B002380011
-:10B08000500000000000000020011200B690A33024
-:10B0900008E822B21487802D600849121261959049
-:10B0A0002D610A48161E80958025200B78028800A5
-:10B0B000400000000000000048080C00F100288C4F
-:10B0C0008E1003848080002C020A9A02E400D000D3
-:10B0D0003E800B91038E80C20838800DB0031202AF
-:10B0E0000000000000000000401DB000F6003F44DA
-:10B0F0000F21137800FF003DC00FE0037800EF043C
-:10B100003F408DE803DC04F6003F000FF083D006DB
-:10B110006000000000000000A805E800E880324060
-:10B120000F880B280078023E800E28032800CA8072
-:10B1300032000FA003EC00C98032800FB0032A0058
-:10B14000700000000000000048118C008F00A180FA
-:10B150000B70421400B7002D410B50421400A500A3
-:10B16000A1C00B5002FC80A50021000BF2021204CA
-:10B170006000000000000000C000BA00A480293078
-:10B180004B48065208B4802D200B48423200848080
-:10B1900021200B4812DE40868129A00B780A30005E
-:10B1A00020000000000000004814CC00830520E0CF
-:10B1B0000B34026C10B3002CC00B364A0D0DA300EB
-:10B1C00020C00B3482CC02A20028000B30021204F3
-:10B1D0003000000000000000E815A920EA4030A07F
-:10B1E00007A0436940FA003C800FA0030840CA0052
-:10B1F00030A00FA403E800CE003B980FA0033A0450
-:10B2000060000000000000004800D200FC083F0081
-:10B210000BC203B000FC003F000FC003F000FC00B5
-:10B220003F040FC003E000F800B6020F8003D20015
-:10B2300030000000000000000810E400D9003E6863
-:10B240004C9101E408C9003E402C9203E402C9A0DD
-:10B250003E700E9003C642C9003E400F1003020428
-:10B2600030000000000000008004640089860E6049
-:10B27000089802E40889102E60089002E400890C06
-:10B280002E60089002E68889002E400B9002A000F4
-:10B290001000000000000000180524009D102F4041
-:10B2A00028D006F402AD002F6008D002F4008D0013
-:10B2B0002F400AD002E40089002E600B90020600A5
-:10B2C00040000000000000000804340085002D400C
-:10B2D000085802D400A5022D40085000D400850073
-:10B2E0002D40085402C48081002C600B140282019E
-:10B2F0000000000000000000B80D6140D8523E0080
-:10B300000C0503E140E8043E140C8503E140C8004D
-:10B310003E140EC003E000C0023E004F80232E0307
-:10B320005000000000000000981DF400F9013E40AC
-:10B330004F9013E400D9001E400F9003C410F10099
-:10B340001E400F9003E4E0FD283F400F9403E60603
-:10B3500070000000000000001805A400FD003F4040
-:10B360004D5002E4009504334028D003F400FD0062
-:10B3700033400F91033400CD4033400F98810600D5
-:10B3800070000000000000003810E010B8002E002F
-:10B390000B8002E010B8002200088002E000B80034
-:10B3A00022000B8803C280888022000B8C020E04CE
-:10B3B00030000000000000000804C400B1002CC0F0
-:10B3C0000B1002C400BB002240081002C401B900E7
-:10B3D00020401B90020422890020600B128202018F
-:10B3E00070000000000000001815A444B9002EC031
-:10B3F0004B9002E410B9020240089142E400B98087
-:10B4000022400B9202C400994022404B9012060445
-:10B410006000000000000000A015E600B9013E58E1
-:10B420000D9003E600D10032600C9802E640F9006E
-:10B43000B2400F18032400C98032500F9023280413
-:10B4400070000000000000002801A400F9003E4246
-:10B450000B9003E708F900BE480F9003E400F900E1
-:10B460003E400F9803A400E9A0BE400F100B4A0015
-:10B4700060000000000000002810A000D8013E007D
-:10B480000F808B2000F8203E010F8103E000F808B8
-:10B490003A000C8003E000D84032000F80130A0409
-:10B4A0002000000000000000280528008A802F915D
-:10B4B0000BEE022801BE0020800BA002EA80B648F5
-:10B4C00022800DA002FA028641A3A60BA0030A0067
-:10B4D000400000000000000028054C0093802CC0B4
-:10B4E0000B30020C10B30028C00B3802CC00B300A4
-:10B4F00028C0093002C601836020700B300A4A0060
-:10B500005000000000000000A0012E8885082D805A
-:10B510004BF8061C80B70021C00B5002D400B600C7
-:10B520002960097002D0A08D0021400B3202280052
-:10B530004000000000000000A8081E00D5803DE08B
-:10B540008F78031E84B7823D600F5903DE00F780B9
-:10B550002960157803DE00C78031600F7C036A0222
-:10B560000000000000000000081DAC40E9003E8023
-:10B570000FA003ED30FB0036C10F9603E400B300CB
-:10B5800034400FB783EC4021003E400FB003C206A9
-:10B5900060000000000000000005FE00FF8133E0B5
-:10B5A0000FF903DE20CF813FE00778033E00FF80E4
-:10B5B0003FE004F813FE02DE8033600FF803000062
-:10B5C0007000000000000000A8119C00B70021C41A
-:10B5D0000B5A02DC4886502DC00B31029460B4181F
-:10B5E0002D40487002E800A51021400B71022A048A
-:10B5F000600000000000000000009C00BD0021422F
-:10B600000B7002FC02850025400B50029C00B70025
-:10B610002F40287102DC00A60021C00B7002000040
-:10B62000200000000000000020146D80B120A05018
-:10B630000BB206CE00A0342EF00B18028520B34AC0
-:10B640002C54883802CC10A10020B00B3002080422
-:10B650003000000000000000A815BE80F308105460
-:10B660000B8813FF00C0803E640FB4830700F9C04D
-:10B670003EF00CFC13F400EA0032700FF00B2A04C9
-:10B6800060000000000000008000EC00F9003E10A7
-:10B69000079103ECC058003E440F9203E400F90008
-:10B6A0003EC08FB303E000BB00BE440FB003E00018
-:10B6B00030000000000000000110FC02CD0433E067
-:10B6C0000CC0033C08FE0033602CD002B480CF00D5
-:10B6D0003F5207F013FC00CE1033420CB003C044BD
-:10B6E000300000000000000081046C0089002AB0D6
-:10B6F0000888022C00BA0036440890002600DBC0FF
-:10B700002E400BB002EC0083C028400AB002E0409B
-:10B71000100000000000000080052C008B002208B3
-:10B720001AA2022C10B92022400830022C04AA547C
-:10B730002EC00BB012CC008B08224008B002E000F3
-:10B74000400000000000000008040C0083042A00F0
-:10B750000A08820C00B8006440083002A400B0005F
-:10B760002CC08B3010C8028B002A400A3002C20164
-:10B770000000000000000000000D6C00C900320055
-:10B780001A82033C00F90032400CD103AC00EB00FC
-:10B790003E400FF003ED00C30032C08CB003C00385
-:10B7A0005000000000000000A019FC00F5003F0060
-:10B7B0000D804BFC007C003F400FD20B7400DF007B
-:10B7C0001D408FF003FCA0FF003F800FF003E80650
-:10B7D0007000000000000000C005FC00DF843BE0BA
-:10B7E0000FF80B3E00EC8033E10C30033C80CF4877
-:10B7F00037C00E4003E0C0C791B3040CF003300023
-:10B8000070000000000000008010EF048B802241D7
-:10B810000BB0822E008880A2E00AA292AD808742FF
-:10B8200023D88AAD02E0C08B00204C48A40220043B
-:10B8300030000000000000008805CC58BB002880C4
-:10B840000BB2422400A8002AC00A10020460A32000
-:10B8500024D20800428C839B0120490833C2220174
-:10B860007000000000000000C015AC00AB8822A0F2
-:10B870000BB802260CA8002AC00A9202A400AB064C
-:10B8800022C00AB002E8009B00024008A042300437
-:10B8900060000000000000004015EC00D3803AE09A
-:10B8A0000F18010600E83038660EB8032A40EB0096
-:10B8B00036C10E9603E280DA0832802CBB031004F6
-:10B8C0007000000000000000E0019C00DF003FC0AD
-:10B8D0000FD003F400DC8037600FE803FA00DF01CB
-:10B8E0003FC00FC043E64CEFA03F440FA003F80059
-:10B8F00060000000000000004010AC40DB0036801B
-:10B900000C98032600F8003EC00E18038402E301E1
-:10B9100038C10EB403AC80CA183AD02C30031004DE
-:10B920002000000000000000C8053F40B9882E80BC
-:10B9300008BC02A300B0000EC008B00620008F04AF
-:10B9400023C108B9122F008380364008AD023200AF
-:10B950004000000000000000E0054C00B2002CC0D8
-:10B96000093202840033002CB20A36128C08930587
-:10B9700020C00B1802ED0091806A00081002380008
-:10B98000500000000000000020011E00B7802DE0E4
-:10B990000978029740B4802FA008E8020E409782F1
-:10B9A00021E09868821A189D902DA118580208006D
-:10B9B000400000000000000048080CC0F3003EC03A
-:10B9C0000DB0438440F0003C820E38128C44F330BA
-:10B9D000BAC11E10478E22D11038180C30831202C3
-:10B9E0000000000000000000401DBC40FF003FC000
-:10B9F0000EE003F440FC003DC40FD001F441EF1809
-:10BA00003FC41FF003F848EF1433800FC103D00682
-:10BA10006000000000000000A805FC40FB003EC0E4
-:10BA20000F98032400CB003E400FB003A800DB2892
-:10BA30003EC41F9023EC00CA0032E00C9003EA00E1
-:10BA4000700000000000000048119C80B7002DC06D
-:10BA50004B50521400D4012D800B6002D800A72057
-:10BA60002DC50B4016DC00840023C0084002D20420
-:10BA70006000000000000000C0009E80B7802DE044
-:10BA80000B780A960094802D601B7806D200A78060
-:10BA90002DE00B7822DE00878221E0085802F000BA
-:10BAA00020000000000000004814CC00B3E42CC0CB
-:10BAB0001B2102810090002CC80B3902CE00A3008C
-:10BAC0002CC00B3002CD008B2020F008B202D20433
-:10BAD0003000000000000000E815A800FEA03F8232
-:10BAE0000FE8039830D6003FA00FE003BAC0FA0079
-:10BAF0003E800FEC33F802CE00B3B82CEC83FA048E
-:10BB000060000000000000004800E018F8403E001F
-:10BB10000F80026084F8052E048F8041E0007802D7
-:10BB20003E000F8183E020F800BE020F8003D200A8
-:10BB300030000000000000000810E618F9203E4028
-:10BB40000F9C03E440C90032610C9013C408C90182
-:10BB50003E410F18032400C9A032400F984302044D
-:10BB6000300000000000000080046500B1C02240E9
-:10BB70000B9C02E71089002844089422E4108900F5
-:10BB80002E400B9F222660898022400B910A2000C4
-:10BB9000100000000000000018052480B9002EC02D
-:10BBA0004BB402E42089202240089402EC00890072
-:10BBB0002E410B90020400894022400B90020600A7
-:10BBC000400000000000000008040400B104204010
-:10BBD0008B1002E40581002840281212C4828120C3
-:10BBE0002C480B120A0482810020480B1202020129
-:10BBF0000000000000000000B80D68A0FA023E142A
-:10BC00000F8503E000C80032000C8503C140C85313
-:10BC10003E140F80030148C050B2140F85032E0359
-:10BC20005000000000000000981DE400FD00BF402F
-:10BC30000F5013D402FD002FC00FD103F440F910B0
-:10BC40003E440FD103F440FF00BF440FD103E6068A
-:10BC500070000000000000001805E6A0FD013E4451
-:10BC60000FD103D400C50033410FDB032720D9E0F7
-:10BC7000B2700DDA83F640CF1032782DDA03060069
-:10BC800070000000000000003810E100B8002E280D
-:10BC90000B8842E010D80022000B8C0A230088C0D9
-:10BCA0002228088402C28080A0223048AA820E0482
-:10BCB00030000000000000000805C400B1002C4066
-:10BCC0008B1202C400990228408B160284819130A5
-:10BCD0002058091002C5008100644D083402020199
-:10BCE00070000000000000001815AC0CB9042E48CC
-:10BCF0000B9406E4009940AA400B9222A40089000C
-:10BD00006040089402E4008980A65008920206046C
-:10BD10006000000000000000A015E400F9983E4813
-:10BD20000F9803E520D9003A640F9483A4C0D90288
-:10BD300072404D9042E482C94036400C900B28047A
-:10BD400070000000000000002801AC28F9883E4087
-:10BD50000F9913E700F9C036600F90036600F100F9
-:10BD60007E400F9907E460F90038400F9803CA003D
-:10BD700060000000000000002810A000F810320051
-:10BD80000F820B2100E80036040C8603E100D80086
-:10BD900032000F80036100C80032000F00030A0464
-:10BDA000200000000000000028052820BE0022809E
-:10BDB00028EC021904820003800DE482E8008A0165
-:10BDC000AA808BED823B808E9036800BE0034A0088
-:10BDD000400000000000000028054200B38020C0A1
-:10BDE0006B341640C08310247288B002EC008300CC
-:10BDF00024C00B04026F099B0024C00B30020A0010
-:10BE00005000000000000000A0011400B78023E4EF
-:10BE100028788274148F0061E0095012DC048722B4
-:10BE200025C81B780214009440A5C00B602268004E
-:10BE30004000000000000000A8081220B780B1E018
-:10BE40008FF8031202E78035E00C6806CFC2CFB04E
-:10BE500025F40F58035A02D58075FA4FF8032A02C9
-:10BE60000000000000000000081DA590F3003DC088
-:10BE70004FB013A804FB003CC00F8043EC80EB6084
-:10BE80003AC90F3003EC00E9003EC80FA003C20618
-:10BE900060000000000000000005F600EE803FE0BA
-:10BEA0000D8903D240E58139E03CF907FE00CF88D7
-:10BEB0003FE00FE803F208CE8033E00CF803000007
-:10BEC0007000000000000000A8119444C6002FC0BC
-:10BED000085802D0C485242190085412DC8207003F
-:10BEE0002DC00B7006D4008E4821C00A60022A04BF
-:10BEF000600000000000000000009C00A7402DC072
-:10BF0000084202D000AD0029C0087022DC2887005A
-:10BF10002DC00B400298009700A0C40870020000DA
-:10BF200020000000000000002014CC0893002CE04A
-:10BF3000083C22C10081002080881502CE30830099
-:10BF40002CC00B3C02CC0493C020F44A0C820804A1
-:10BF50003000000000000000A815A000E3C01FE0B2
-:10BF60006C1083E004EB003A524CB403FE02CF00A5
-:10BF70003FC00F8443E102D8C233C00C840B2A04B3
-:10BF800060000000000000008000E900EB103EC4EB
-:10BF90000E9403E400FB183EC20FB603EC00FB0155
-:10BFA0003EC00F3503C428EA423EC00F8103E000C3
-:10BFB00030000000000000000110FC40FF0033C012
-:10BFC0000CC0A33028CDA033C00CE8030C00EF0553
-:10BFD0003DC00CCA833C00CD083FC20CA003C04446
-:10BFE000300000000000000081046700BB8020C01A
-:10BFF00008AA020800A10134D108A4122C008B0069
-:10C000006EC088B2022C0889802EC00AA803A04006
-:10C01000100000000000000080052C00BA80A2C0C3
-:10C0200008A80AA0008B00A2C0481102AC048B0033
-:10C030002EC00080122A088B142CC0088802E00051
-:10C04000400000000000000008040C00B20022C004
-:10C0500008B2128000AB0124C00800020C04830067
-:10C060002CC00830020700820024C00808028201A8
-:10C070000000000000000000000D6C00FB0032C05A
-:10C080000CA203A000C90032C02494033C02CF00DC
-:10C090002FC004800B0902CB013FC02CA003C003BA
-:10C0A0005000000000000000A019DC00FD023FC0AD
-:10C0B0004FE4137000FD003FC00FC283FC00FF007F
-:10C0C0003FC00FF003FC00FF003FC00FC003A806F5
-:10C0D0007000000000000000C005FC20EF303F04AD
-:10C0E0006C88033A42E4913F0D0D48033CC0FF02C7
-:10C0F00033440CF403FC82DF3033600DF103300075
-:10C100007000000000000000A010ED008B702E18E1
-:10C1100088224A2C82EA262E0C0BB8423D80BF9022
-:10C120002A5428B402CD00DB402A4A483002A00439
-:10C1300030000000000000008805CCB0A3006C10A7
-:10C140000900822082A0202C884B80000C40B30183
-:10C1500020480B36028CE0836424402832022201FE
-:10C160007000000000000000E011AC008B002E0009
-:10C17000098080A600BA112E880BB0002C00BB02EB
-:10C18000024009B002EC008B002CC808B882B00451
-:10C1900060000000000000004015EC00EB003E9243
-:10C1A0000D80030A20E9003E504580012C04F30075
-:10C1B000906009B003EC008B0226508DBC03100484
-:10C1C0007000000000000000C001BC00FF023F80C2
-:10C1D0000EF9027C22AF003F6003C00BFC10FF0091
-:10C1E0003F4A4EF003FC00F7002B600F7003F8008D
-:10C1F00060000000000000004010AC00FB00B00038
-:10C200000F820BA900C90032D20FA083AC00CB1063
-:10C210003E400CB003EC00DB0032502C95031004C0
-:10C220002000000000000000C8053C04BF0222807E
-:10C230000B98002900CB4022C00B24023C088F50F1
-:10C240002E500DF002FD428F5822E048B502320018
-:10C250004000000000000000E0056C00B300244036
-:10C260004B940049009080043009000E4C008380FC
-:10C270002CC00930226E42838020480838023800E2
-:10C28000500000000000000020011E00B780652063
-:10C290000B78827A088CC025A34B78025E048784D1
-:10C2A0002D61897802DE048780E96208780208003F
-:10C2B000400000000000000048080C00FB0034486B
-:10C2C0000F3B034800934834500D00036C00C3102B
-:10C2D0001CC2053003CC40CB0032400C20031202BC
-:10C2E0000000000000000000401DBC20FF010340D2
-:10C2F0000FF0231C00FF003B800FB0233C02FF50D7
-:10C300003DC40FF103EC00EF00B7C00FE103D0060E
-:10C3100060000000000000008805EC00FB023EE029
-:10C320000C80034802C88132000F9042ECA0FB1041
-:10C330003EE00CB103EC40FB1032401FF0032A003A
-:10C34000700000000000000048119C00B7242D8000
-:10C35000087042D8108C0221400B5002DD00E7200B
-:10C360002F40087002DC05B70021C00BF002120458
-:10C370006000000000000000C0009E00B7902F4049
-:10C380000A68027A00978021E00B7802DE00B7800D
-:10C390002DE0087806DE00B7A021600B784230005F
-:10C3A00020000000000000004814CC00B3002CC0A6
-:10C3B0000A3402C800834A20F80B3102CC00A300E3
-:10C3C0002CC0083002CC00B30020B20B2042120473
-:10C3D0003000000000000000E815A800BA003F8807
-:10C3E0002EE0435988DE0033B00F6C03E800FA00FA
-:10C3F0003E802CA003E804FA0023B80FE08B3A0437
-:10C4000060000000000000004800E004F8013E0069
-:10C41000098221E000F840BE140F8481E000E800AA
-:10C420003E001F8003E000F800BE000F8803D2002A
-:10C4300030000000000000000810E400E10032407D
-:10C440000C9043E420D9003C440890032400F901F7
-:10C450003E480F10432500C900B2400C900302046F
-:10C46000300000000000000080046400B900A0401B
-:10C47000089802E608A9602E490894022400B90031
-:10C480002E700B900226028900A0400A900A20001C
-:10C49000100000000000000018052400B900224030
-:10C4A000089804E60099802E400AB1022400B900E1
-:10C4B0000E400B900A0400810122C0081002060001
-:10C4C000400000000000000008040480B120224861
-:10C4D000081806C400A1002C482A30020480B122AA
-:10C4E0002C480B12020580816022500A14020201BE
-:10C4F0000000000000000000B80D6140F850321448
-:10C500000C8503E140D8503E140E800B2140FA0008
-:10C510003E940F85032000C00032000C80032E03E0
-:10C520005000000000000000981DE441F9103D4556
-:10C530000FD003F400FF003F450DD003E440F91095
-:10C540003F440F9103E442F9103F400FD403E60645
-:10C5500070000000000000001805E400F9003E40F3
-:10C560000CD003F4088D023F400FD003E400CD004F
-:10C5700033400C90032400F90032404C982306000D
-:10C5800070000000000000003810E000E8002E00FD
-:10C59000488002E800D0002E800B8012E002880064
-:10C5A000A2000A80122200B881222808CF020E04BD
-:10C5B00030000000000000000805C400B1002C405D
-:10C5C000281002C40081002C400B1002C40091000E
-:10C5D000264009100254A0B52CA542085082020141
-:10C5E00070000000000000001815A400A9002E50E3
-:10C5F000589002E4809B002E458B9202E400990043
-:10C6000026440B90026408B500254A08510206042E
-:10C610006000000000000000A015E400F9003E5496
-:10C620000C9043C400C9903E700F9803E400D900F9
-:10C6300034604D900A6400F90036402C9E032804B3
-:10C6400070000000000000002801A400F9003C4038
-:10C650000F9C03E630F9003E620F9003E400E9000E
-:10C660003A404E9003A400790C3A400F901BCA0048
-:10C6700060000000000000002810A000F8003E004C
-:10C680000C8113E108C84832003C8003C000F01060
-:10C690003E060C8003F008CC0033040CC0030A04EF
-:10C6A000200000000000000028052800BA002E80AD
-:10C6B00008EC42FA208E0023A008E842E800BE8081
-:10C6C0002F8008A002E800DA00228048E0020A0079
-:10C6D000400000000000000028054C00B3002CC002
-:10C6E000093482C900838020F0083082CC00B380F6
-:10C6F0002CF008B002C1208000A0320800020A001D
-:10C700005000000000000000A0011CC0B7012FC8AD
-:10C71000895002D80287C421E2487082DC00B70049
-:10C720002C40087202CE00970823C008700228002F
-:10C730004000000000000000A8081E00F7E13DE8EE
-:10C740002D6803F200C780B0E0086803DF80F68040
-:10C750003DE08C7E03DA00CC8031200CC80B2A022D
-:10C760000000000000000000081DAC08FB003CC0F9
-:10C770000E8003E008F9003E400FB002EC00FA0022
-:10C780003E402FB003E400FB003CC02FB003C206C4
-:10C7900060000000000000000005FE00FF927FEA3C
-:10C7A0000CF803FE00CCA03F200DF9033E00CF8023
-:10C7B00033600FF803F600EF8433E02CC803000069
-:10C7C0007000000000000000A8119C00B7002FC8F6
-:10C7D000085402D800D6042D010869021C00850007
-:10C7E00021430B70039AC08C00A30208F1022A04B3
-:10C7F000600000000000000000009C00B7012DCC8C
-:10C80000087002D40094282DC208C2025C00860081
-:10C8100021800B7102DC00A71021C00848024000F3
-:10C8200020000000000000002014CC08B3002CF011
-:10C83000080502C02090802E000800824C02800073
-:10C84000A0610B3002A0008000A03088B10A48042B
-:10C850003000000000000000A815BC00FF002DC83B
-:10C860000C3D03E400DB023EF02C904B7C00C10049
-:10C8700032204FF013E000E80132008CAC036A0470
-:10C8800060000000000000008000EC00FB043EC2DD
-:10C890004FB003E004FA403EC24E9823AC10F800BB
-:10C8A0003E5007B013AC00FB003EC20F9203A00045
-:10C8B00030000000000000000110DC00CF003FC08D
-:10C8C0000CC8233682CF803F800CE003EC00F920B7
-:10C8D00033C00EF003F810DC0033004CE8210044B4
-:10C8E000300000000000000081046C00AB002EC08E
-:10C8F0004A8D4221008B422ED208B003EC00B8884A
-:10C9000034620DB002E4008B0022C008900A20407F
-:10C91000100000000000000080052C008B002EC0DD
-:10C9200008A0020D0089102E08289202EC04BB001A
-:10C9300022A008B0026402B30220C008A202A00034
-:10C94000400000000000000008040C00A3002EC0FE
-:10C950000A90220C1080002C00180282CC00B0003B
-:10C960002640093002C820800020000810068201FD
-:10C970000000000000000000000D6C00CB002EC085
-:10C980000CA102240088003C000C8003EC00FB009A
-:10C9900032800EB003CC80DB0032C00CA0038003D9
-:10C9A0005000000000000000A01DFC00FF003FC080
-:10C9B0004FC213D410FC003F000F0003BC00FC006A
-:10C9C0003F400FF023E012FC01BF000FD0036802CC
-:10C9D0007000000000000000C005FC00C78033C0EC
-:10C9E0008BB403B0C0CF2E1F0C4FC3033080FF01A8
-:10C9F0003F080FF0007C00FF2133E40CE00330001F
-:10CA000070000000000000008010EE008B8223F018
-:10CA10000BB5120D8888C00E980B86022100BBC092
-:10CA20002EE44BF7832F44BF9022C848A6822004EF
-:10CA300030000000000000008805CC098A0020506A
-:10CA40004BB20A80CC83010C8C0B230A0460B31414
-:10CA500024404B3002CC10B30020C8E9110662011B
-:10CA60007000000000000000C015AC018A80A244E4
-:10CA70000BB002A10488402EA00B20022820BB404E
-:10CA80002E400BB0022C08BB0022C009B00270047B
-:10CA900060000000000000004015EC00C38332E09D
-:10CAA0008F0003A002CBC43E28078B032100F9C0EE
-:10CAB0003E100FB003EC007B0032C00DA003500409
-:10CAC0007000000000000000E0019C02FF003FE059
-:10CAD0000FF4435E80FC943F000FC02BF250FD2109
-:10CAE0007E848FF0036C0CFF003FC00E6203B80021
-:10CAF00060000000000000004010AC00EB0032407D
-:10CB00002C80036900CB30B2004FB343E500CB402B
-:10CB100072182CB003EC28C3213AC10F94031004FF
-:10CB20002000000000000000C8053C008B202250BF
-:10CB300008B002280088C02A008BB402E800DB009D
-:10CB4000623008F002FC008F8022C00B9547320053
-:10CB50004000000000000000E0054C00B10020C2D1
-:10CB60004830024980834260120B3002C8008202C2
-:10CB70002C3009B002CF0183502AC00B2002B8002C
-:10CB8000500000000000000020011E009D80A0E079
-:10CB90000879225E60879029A00B7802C6009281F6
-:10CBA00005E0097802DE40878021E00B29020800B9
-:10CBB000400000000000000048080C40F20030C0B7
-:10CBC000083A034404C31430C00F2203CC80C200CF
-:10CBD000A4D20D3013CC20C30038C44F044312023A
-:10CBE0000000000000000000401D9C00EE003FE03F
-:10CBF0000F7003B402F4103FC08FA003FC007E004E
-:10CC00003BC00EF083EC00F7003FC00FC003D0061E
-:10CC10006000000000000000A805FC00F9003EC014
-:10CC20000FA003AA12CB0132800FB0132814F98091
-:10CC30003A4003B403EC42CB183EC00FB0032A00C5
-:10CC4000700000000000000048119D00B5002DC4D8
-:10CC50000B704B7C00840021800B70029410B2009A
-:10CC600029C00B7282DC0087202DC10E70021204D5
-:10CC70006000000000000000C0009E00B7802DE0B2
-:10CC80000B68029E00838021E05B38021E00B4C066
-:10CC900025E0097832CE0097802DE00B5C4E300005
-:10CCA00020000000000000004814CC00B3442CC059
-:10CCB0000B3C02CC40930820E00B30028C10B3C038
-:10CCC00028D81B3002CC0893016CC00AB882120429
-:10CCD0003000000000000000E815A800F6103E80BB
-:10CCE0004BED83B800CEE4B3A30FE0033800FE00A1
-:10CCF0003B800DA002E800DA003E800FE8023A0413
-:10CD000060000000000000004800E010F8403E0015
-:10CD10000F80136000E0003E00430803E000F808C5
-:10CD20003A000F8003E000E8403E000E8023D2006E
-:10CD300030000000000000000810C400D9C0BE4050
-:10CD40000F9003E600F9003240019A032400F90035
-:10CD50003E400F9003C44009100E400F9A03020496
-:10CD60003000000000000000800464048904A26018
-:10CD70008B9D80A600B98022404898022400B9000B
-:10CD80002E408B9002E49489602E400B940B20007F
-:10CD90001000000000000000180524009908AE48AB
-:10CDA0004B1002E581B91020441B94022410B900F5
-:10CDB0006E600B9002E40089002E400B9402060086
-:10CDC0004000000000000000080404808900A06802
-:10CDD0000B12028489B12020481A12120480B12259
-:10CDE0000C480B1202C481A1202C400B120202013C
-:10CDF0000000000000000000B80D6000D800BE0078
-:10CE00000F050BE140F80032140F85032140F800B4
-:10CE10002E800F8513E002C8003E140F05012E037B
-:10CE20005000000000000000981DE440FD00BF44D9
-:10CE30000FD103F4407D10BF4445F12BF440FD10A9
-:10CE40003F440F9103E440D9103E400FD103A606A2
-:10CE500070000000000000001805F600FD001F62D1
-:10CE60000FD8823600BDA03B680CDC8326C8D9A051
-:10CE700033600D99835620D5A82E440CD8838604A0
-:10CE800070000000000000003810E148B8002E00DB
-:10CE90000B0A822220B85022BA088A2222808800F7
-:10CEA0002201080C02200088002E28888802CE0467
-:10CEB00030000000000000000805C400B1002C4054
-:10CEC0001B100A8440B10028580A3202050099401C
-:10CED0002065091042C40091002C400A3082C20132
-:10CEE00070000000000000001811A400B9002E40DE
-:10CEF0001B9002A580B910224808104204100900B6
-:10CF00002240089002E4009B002C400A9422C604B0
-:10CF10006000000000000000A015E400F9203E4081
-:10CF20000F9013A710F960BA502E9C0A2584D1F0F7
-:10CF3000B2600D9003E400D9003E400E9003A800BB
-:10CF400070000000000000002801A40CF9903E6A67
-:10CF50008F90236600F1083C400F9C43E440F98029
-:10CF60003A440F90032404E9023E402D9113CA0075
-:10CF700060000000000000002810A000E8203E0132
-:10CF80000C0003A120E85032102C8C032100E80093
-:10CF900032020F00132088C80832000F8C03CA0029
-:10CFA0002000000000000000280528208EE32F90BC
-:10CFB0000AE0063B00EE04239008E00228088A02FB
-:10CFC00075908BA04158908E802A810BE0038A10C7
-:10CFD000400000000000000028054E00A3006C6027
-:10CFE00008381A8E40A08020CC0930020C05A3041A
-:10CFF00028C40B30020D0183C020C00B3002CA00D0
-:10D000005000000000000000A0011E0887002D62F3
-:10D010000B70921C08A00061C00960061C80A7006C
-:10D0200021C00B72025801878829C00B6012A8002A
-:10D030004000000000000000A8081E00E6803D60DF
-:10D040000C78429600E480A3600D78033F00E380F3
-:10D0500021E00F7B031608C78031E24F7843EA02D4
-:10D060000000000000000000081D8C01F8003C409A
-:10D070000EB002EC00F8013E404E3033ED20DB01F3
-:10D08000BEC00FB403EC00FB003ED80FA003C206E5
-:10D0900060000000000000000005FE00C78423605F
-:10D0A0000C780BBE00FD803FE00FEB033E00CF800D
-:10D0B0003B250CF8837E40CD8033E20BF903000062
-:10D0C0007000000000000000A8119C0287001548B5
-:10D0D0000870021420B600359A49C8039C84A70042
-:10D0E00039D00A70021A08A40021C00961422A043A
-:10D0F000600000000000000000009C00870021404C
-:10D100000871029400B5002D400BF1225C02070863
-:10D110002C50087002500087002DC40B50420000B4
-:10D1200020000000000000002014CC0083022440F6
-:10D13000183D0A0100B05824200930028F4083E0D6
-:10D140002CC10A30420800B3016CC009081608045B
-:10D150003000000000000000A8158C008B00324059
-:10D160000C2503A848F8813E800F80637C00CB80AB
-:10D170003AC00CF0036C00CA02BFC00F988B2A049F
-:10D1800060000000000000008000EC00F9003E504C
-:10D190002FA40BC800F0403ED00FA033EC20FB04BE
-:10D1A0007AE00FB003ED08E90332C00D9003E00010
-:10D1B00030000000000000000110EC40EE003EC016
-:10D1C0000CDA037004CC02B1A00EF023EC00FF00D7
-:10D1D0003720CDB073EC88FB803FC00F3003004494
-:10D1E000300000000000000081046E0088802CE107
-:10D1F00008940AA902884022D008B942EC04BB0076
-:10D200002CD40DB002ED20BBD02EC00BB002A0403C
-:10D21000100000000000000080052400AB802EF00C
-:10D2200029A0826D0088082204089042EC00BB000F
-:10D230002A8108B002E409BA042EC14B988220006A
-:10D2400040000000000000000804040083002CC01F
-:10D250000A210284108200E000180A12CC00B300F8
-:10D260000CC0093002CC90B0002CC00B100282011F
-:10D270000000000000000000000D6400EB003E0014
-:10D280002CB40364088800B2000CB243FC00FB001D
-:10D2900056000CF001E400FB003FC00F800B0003C0
-:10D2A0005000000000000000A01DF400FF003F40FF
-:10D2B0002DF061F000F40027010DB111FC00FF0218
-:10D2C00007C00FF003EC40FF003FC00FC00368062B
-:10D2D0007000000000000000C005F600EF903D4C1B
-:10D2E0002CC013F408FD20374C8E82837484DCC27A
-:10D2F0003FD80DF203ECC0FF813F000CF803F000B3
-:10D3000070000000000000008010E6008B242E5CFE
-:10D31000088D02FF48B9902F540B84823E40A080B4
-:10D320002EC40AFC42ED80B9802E600A9812E004F7
-:10D3300030000000000000008805E401A300284838
-:10D340000A0042C400B1002C490B0A4204A29121F8
-:10D350002CC90831028CC1A3002C40081802A2017C
-:10D360007000000000000000C015A0208B822E4439
-:10D37000588002E400BB102E400BA1120C01891052
-:10D380002EC00AB002EC01B8802EE20AA102F0041D
-:10D3900060000000000000004015EB40EB403E60E4
-:10D3A0000E8733E400B9A136C00EA80B2600DAC000
-:10D3B0003EC08DB003EC00FB853EE108B80390054C
-:10D3C0002000000000000000E001B800FF022F6014
-:10D3D00003E883FC10FD801F401FD013BE40EE0405
-:10D3E0003FC00FF043FC08FD003CC00FD011F80017
-:10D3F00060000000000000004010A400DB00B2400C
-:10D400000E94032400D900BAC00C2003E490FB0062
-:10D410003AC00CB003EC01FA003ED02C9803900403
-:10D420002000000000000000C80503008B00224817
-:10D430000884222C00B90022C008A002ED008BA0B5
-:10D4400021C008F002FC00B9802EC008A002320002
-:10D450004000000000000000E0054520930022F895
-:10D460000B300A8440B2002040081002C4008080C3
-:10D4700028C02839024C00B1002CC0083002B80086
-:10D480005000000000000000200136009F80216055
-:10D490000938029E00B2C02060484812D6C686D025
-:10D4A00021E0087800DE80B7822DE008F80208004D
-:10D4B000400000000000000048080C20D31030C8D5
-:10D4C0000F30038400F1003040241903E4C0E04031
-:10D4D0003AC00C3203CE80B1283CC00C301392020B
-:10D4E0000000000000000000401D9C00E6007FC01E
-:10D4F0000EF0237440FF103F404FD003FCD2CE0407
-:10D500003FC00FF403FC00FE003FC00F7103D012B8
-:10D510006000000000000000A805EE00CB0016C06F
-:10D520000D80032720CB003EC20AB053E428C181FE
-:10D5300032C10EB9032C00F18035E00CB8032A0487
-:10D54000700000000000000048119C0287102D4070
-:10D550000870035C00A7002D40287002D4048704E3
-:10D56000A1D00B72021D00F70021C00D5002120461
-:10D570006000000000000000C0009E00858025E0E3
-:10D58000097802370387802FE0087812C6108D8053
-:10D5900025E80B38021E80BC8425E0085802700084
-:10D5A00020000000000000004814CD8083882CC0BB
-:10D5B000083C024E01A3D22EC408B102CC008380E5
-:10D5C00024C10B30020C00B340A0D209301252002B
-:10D5D0003000000000000000E815BA00CAC0368024
-:10D5E0000D67132800CE003EA00CED03E800CEE04E
-:10D5F00036801EA00B2804FE00B7B20CE00B7A00A8
-:10D6000060000000000000004800E040F8102E100C
-:10D610000F8003E001D80A3E000F8003C002F80823
-:10D620003A000F8003E010E820BE000F8013920044
-:10D6300020000000000000000810E500FB003E4054
-:10D640000C91032600618032400C90032400C90035
-:10D650001E400C9C03E401F9003E400F9003C20001
-:10D66000300000000000000080046700B9002C407A
-:10D67000009C02A600790022402890022400890024
-:10D680002C44089802E400B9802E400B9002E0017F
-:10D69000000000000000000018012400BB0026501C
-:10D6A00028908224849920224049900224008900F5
-:10D6B0002E40089002E400B9602E400B9002C60490
-:10D6C000400000000000000008040600B1002E48E1
-:10D6D0000812028480B120A04809120A0480810047
-:10D6E0002C48281242C48831002C400B1802C20179
-:10D6F0000000000000000000B80D6000F850361473
-:10D700000C80032000E80032140C85032140C8502F
-:10D710003E140C8003E14038003E008F8003EE038E
-:10D720005000000000000000981DD400FB043D44A0
-:10D730000F5123D448ED103D444ED123F442FD0057
-:10D740003E448F9103E458FD003F500F5003E6061E
-:10D7500070000000000000001805F400F9003D40D2
-:10D760000CD003F400DD023E400C9003E440C910ED
-:10D77000374007D0072400E5002F6A0F700306002A
-:10D7800070000000000000003810E000B8003A000F
-:10D79000808002E00088002E000A8053A2802CA026
-:10D7A00022000B800A2000B8002E100980030E040E
-:10D7B00030000000000000000805C400B1006C400B
-:10D7C0002A1002840181802E40091002F4008D0489
-:10D7D00020400B10028400B1002C400B9802420143
-:10D7E00070000000000000001811A420B9002A40B9
-:10D7F00088B402E601A9202E480A9000A440AD405A
-:10D8000022400B9012A404B9012E410B9002060491
-:10D810006000000000000000A015E400F9C03E60B8
-:10D820000C9413A602D9421C600C9E01C604C100D0
-:10D83000B2401F9002A400E9083E684F980B6804AC
-:10D8400070000000000000002801A640F920387098
-:10D850000F9103E400D9803E400F9C13A400F9000F
-:10D860003E400F10036410F90A3E500D9A03CA009F
-:10D8700060000000000000002810A100D8043E0055
-:10D880000C8113C002D8203E002D8403E000CC0898
-:10D890003A000F8043E000F841320007818B0A0410
-:10D8A000200000000000000028053A608A002FA830
-:10D8B0000AE022E8027E482E8008A042E8048E009A
-:10D8C00023A80BA882E800EE00A2804B60020A00A9
-:10D8D000400000000000000028054C0093006CC0D0
-:10D8E000083002CC0013812CC0083002CE408240A8
-:10D8F00028E00B3802CC00B31024C08B38020A0099
-:10D900005000000000000000A0011E0087202FC072
-:10D910000A7002DC0AB6002CC8887206D80086009D
-:10D9200021C00B7002DC84AF80A5C00BD0022800A0
-:10D930004000000000000000A8081E00D7803DA0A5
-:10D940001C7813D602D7803DEC087E23FE00CE80E3
-:10D9500039600F7803DF00F68075E00F78032A0244
-:10D960000000000000000000081D8C00FB103E803D
-:10D970001FA021CC00FA003EC00EB003E802FA005E
-:10D980003E400FB013EC00EA013AC00F9003C2060C
-:10D9900060000000000000000005FC00FF803F6008
-:10D9A0000899077E00DD803FE20CF803F602DF8075
-:10D9B000B3E00CF8033E41CC8033E40FF803C00021
-:10D9C0007000000000000000A8119C40B7002DC0AE
-:10D9D0000D5A22DC8075002DC0087102F0208700EE
-:10D9E00021C00A70021C00D42821C00B7202EA0474
-:10D9F000600000000000000000009C40B7002D0007
-:10DA0000087222F40087002DC2087002D4008780BB
-:10DA100025400930025C01AD0029D04B7002C000E6
-:10DA200020000000000000002014CC00BBC82CA087
-:10DA3000092002CE00A3002CE0A83D42C2008B804A
-:10DA400024400B300A6C08A340A8E00B3402C80441
-:10DA50003000000000000000A815AD00FF483C2881
-:10DA60000CA9236C808B003FC00CFC03EC00D88019
-:10DA700034400D30037C02A34038680F2403EA04CD
-:10DA800060000000000000008000ED88FB003E50B8
-:10DA90000FA103EC043AC03EC00FB083E802F810B7
-:10DAA0003A410E9003AC009B08B6400F8103E000A2
-:10DAB00030000000000000000110FC00FF00B32057
-:10DAC0000C50131C09CD8333C08370003C00DC1064
-:10DAD00032600EF1432C00CE043B700CF083004406
-:10DAE000300000000000000081046780BB0162215B
-:10DAF0008A89202C0080E022C00BB003D8108C044F
-:10DB00002240059002AC00D88036400A90022040A6
-:10DB1000100000000000000080052600BB00220667
-:10DB20000880022E00882022C009B002A4009900BB
-:10DB300062C408B0062C008880224108A0022000A0
-:10DB4000400000000000000008040C00B30020406A
-:10DB50000A00820C00800020C00B3022A00081004F
-:10DB6000A0C00930028C00900024400A2802020163
-:10DB70000000000000000000000D6000FB0220001B
-:10DB80002C92032C02880031C00BB502A400D104F2
-:10DB900032400E90032C40C9003A408CA003000391
-:10DBA0005000000000000000A01DF400FF002F0046
-:10DBB0000FC003DC00FC003FC10FF043F000FD008C
-:10DBC0003F404FD003FC00F5003F400FE003E80664
-:10DBD0007000000000000000C005D880CC00B70431
-:10DBE0004EE1033C20DF10318006F0037F00FFC0D0
-:10DBF0003BC00EF2035E00EF1033D02CF203300076
-:10DC00007000000000000000C010E90088C6205C21
-:10DC100008A45765008F522AF009FC020400BB00DB
-:10DC20002DD90974836428834422848806823004B1
-:10DC30003000000000000000C805C9008010200866
-:10DC400008311204B2A30020841B34020C80B320DC
-:10DC50002CC70936028C809340ACC80831283201A9
-:10DC60007000000000000000C015A9008800A2504C
-:10DC700008350224008B042EC109B0022494BB0095
-:10DC80002EC00BB002CC608B002E800880003004C8
-:10DC900060000000000000000015E702CB18B28011
-:10DCA0002CAC0A2E08EB0032124EB0032B80FB0086
-:10DCB0003AC00AB003AB08EB042E480CB88300044A
-:10DCC0007000000000000000E001B680FF8039CA4B
-:10DCD0000DE803D640E7043B664E7003B800FF0131
-:10DCE0003FC06CF0037006E70031040FC143F80039
-:10DCF000600000000000000040108500CB40329022
-:10DD00002FB00B6480FB08BA100DB0A72D00FB04E8
-:10DD10003EC08EB0036D00DB0132408C33039004B3
-:10DD20002000000000000000C005240083E0A2D015
-:10DD300040B0022504BF80A05008F80220008B02EA
-:10DD40002FD008F00224008F80360108844236006C
-:10DD50004000000000000000E8054400834820C4A3
-:10DD60000900024600B301A8901930128C00A304E8
-:10DD70002EE20AB0020C00834928C0093C02380098
-:10DD80005000000000000000F0013604838021E113
-:10DD90000838121E28B39821A0193882960087836C
-:10DDA0002DE2087822368C87802DE00979023E002A
-:10DDB000400000000000000048080400C33030C8E4
-:10DDC0004D000B4C80F31238C00D3A028C80F300EA
-:10DDD0003CC00E300B0E00C30C3AC00D30031202D3
-:10DDE0000000000000000000401DB406FF103FC00E
-:10DDF0000FB013BC00FF107FC00EF1A37C00FF1218
-:10DE00003FC20FF523BC41EF183780AEC003500668
-:10DE10006000000000000000A805E400DB003EDA1E
-:10DE20000C800366108B0032808CB6034A004B8056
-:10DE300032C80CB4030A10DB003EC10CB0432A0008
-:10DE40007000000000000000C811B40087042CC05E
-:10DE50000D70031C08874820810D72825C00D7007A
-:10DE600021CC28F0021C1087202C0008400A320424
-:10DE7000600000000000000080009600B7812DE0E7
-:10DE80000848020E04878021E00878023E0187805E
-:10DE900021E01879023A0197A02D6008380220008D
-:10DEA00020000000000000004814C600A3C62CC0DB
-:10DEB0000930020C01830020E00930024E0093007B
-:10DEC00020C04930220F6483026CD428300212042F
-:10DED0003000000000000000E811AB80FAE03C8850
-:10DEE0000CE0022802CA00B3A90CA0033B10CA0030
-:10DEF000A2800CA00B3800DA003FB00CE6033A0415
-:10DF000060000000000000004800C02098083E00AB
-:10DF10000F800BE100F8013C104F0003A040F80017
-:10DF20003E100E8003E000F8003C022F0493D20064
-:10DF300030000000000000000810E400C1C13240C1
-:10DF40000C98032640F90032400C98032424F90071
-:10DF50003C600C1003A400F98232400C90030204D0
-:10DF6000300000000000000080046400890022509E
-:10DF70000D98022580B90022520D9C022400B900A0
-:10DF80002E600890422400B940364008900A2000D4
-:10DF90001000000000000000180524008D00234040
-:10DFA0000812022400A110A26008928A2400B9017C
-:10DFB0002E46089002A400B150224028908206000C
-:10DFC0004000000000000000080404848520A1D85F
-:10DFD0000910020480B32020402912060400B10178
-:10DFE0002C482812020400B1202448081202020121
-:10DFF0000000000000000000B80D61428A00B3007C
-:10E000000C05032140E050B2002C80022140F0506A
-:10E010003C140C8513A150F85032140C85232E03A8
-:10E020005000000000000000981DF440F9103E442C
-:10E030000FD40BF444F9103F504F1103F400F900D2
-:10E040003E440F9153F414F9103F440FD103E602FC
-:10E0500070000000000000009805E6A0DD88B366AF
-:10E060000CDC833688BDA0376A0CDA0B2502C94068
-:10E070003F784F98B3E504CDA072780CD88B261466
-:10E0800070000000000000003810E30088422231D8
-:10E09000080A0222A0B8F922100D84126A80888032
-:10E0A0002E200B0802E280A8A8A23848A8020E0081
-:10E0B00030000000000000004805C4A28100204894
-:10E0C0000812424500B100244009140224008120B6
-:10E0D0002C580B1082C4049140646C0830821205E5
-:10E0E00070000000000000001815A4008900224103
-:10E0F00008908A6480B9002250099006640899004B
-:10E100002E400B9006C401B90226618890020604D5
-:10E110006000000000000000A015E400C9002240DB
-:10E120002C94236400B90036400990130500C900FF
-:10E130003E404F9013E5C0D90026402C94032800A0
-:10E1400070000000000000006801A402E9083C40E3
-:10E150000F900BA400F1003E410F9043A488E90406
-:10E160003E400F9003E600E1003A409F9263DA00E0
-:10E17000600000000000000028108010E001320064
-:10E180008F80032000D80830018C0003E102C8040E
-:10E190003E000C800B2100C80078000F86030A00A7
-:10E1A0002000000000000000280528008E402B827F
-:10E1B0000BA0023A008E80238208E20228108A0017
-:10E1C0002F9828A01228008E202E804BE4020A00EF
-:10E1D000400000000000000028054C02A240208002
-:10E1E0000BB0024E4093C0A0200836028C00930072
-:10E1F0002CE20830064C12930828C00BB0020A002B
-:10E200005000000000000000A0011C0882402940CE
-:10E210000B70025E08840823400870061C8087008B
-:10E220002D200879125C0094002DC00B304228008C
-:10E230004000000000000000A8083E00E48031A17A
-:10E240000F58137600D08031C00C3803BE80D781C0
-:10E250003F208C79037F01D68039E84F68032A007C
-:10E260000000000000000000081DBE00FA003E0093
-:10E270008F960BA400EA003CC00F9003AC20FB403B
-:10E280002E000FB203ADA0EA003EC00FA01BC204D7
-:10E2900060000000000000004005FE08DE8133A49D
-:10E2A0000EFC133E00FC8013200C68033E20FFC8C8
-:10E2B0003F601DF8037E00C78033E20CD8031000D6
-:10E2C0007000000000000000A8119C00864131C4CD
-:10E2D0000879429C00BC1021408535035C00B700E2
-:10E2E0002DC00872022C00A70137C00851422A0035
-:10E2F000600000000000000010008C4082002481BB
-:10E3000008D8021420B50020400960021C40B70064
-:10E310002C400B3022DC00970021C408400244004E
-:10E3200020000000000000006014EC009206209025
-:10E330003815028600B80060500930024E01BB005B
-:10E340002E400B3002CE20B30024F048020A5804BD
-:10E350003000000000000000A815BC00CA00A69410
-:10E360002C90032E00FB05B2850D90033F90FF001B
-:10E370007E801FF043FC219A0033C83CB2036A043C
-:10E3800060000000000000009000EC02EA403D80C8
-:10E390000F1093ED00FB403E908F3003EC80FB00AC
-:10E3A0003E911CB0032C10E8003EC81F9003A5103E
-:10E3B00030000000000000008010FC02E40073A0A8
-:10E3C0000CFC037C02FF1013C41CC0033C00FF00C4
-:10E3D00037E00DF003FC00ED8031C00C3263200407
-:10E3E000300000000000000084006C008AC022B1F0
-:10E3F0008AB8434A10DB2020F00A94036C00BB0764
-:10E4000022B808B002EC11E8C0B2C02A921A20006B
-:10E41000100000000000000080012C00AA8022985B
-:10E420000890022F03BB012A8308B24E2C04AB02D2
-:10E4300022C428B022EC09B35062C008B002200008
-:10E44000400000000000000008040C018300608010
-:10E4500008120A440093002A804A30020C00B300DC
-:10E4600060C0083002CC00B30260C0080046020160
-:10E470000000000000000000800D6C00E802228017
-:10E480002CF2432C00FB00BAC008A5023C00EF00B0
-:10E4900036C04DF013FD51FB0032C00CB00320011B
-:10E4A0005000000000000000A01DFC007E043F8022
-:10E4B0000F3143F002FF0037C00FF003FC08FF00EC
-:10E4C0003FC00FF003FC00EF003BC00FC003E81695
-:10E4D0007000000000000000C005F240FC803F24F6
-:10E4E0000DD853D604DF323FCC4CC043FC00DF6074
-:10E4F00037C00FC4037CD0DF2033D80DF843F000C1
-:10E5000070000000000000008018E880B0012E08B4
-:10E51000889002EC208B702FCC08B382FDE0BF40C6
-:10E5200022D80B9302FDC0AF1028F008BC12F004F3
-:10E5300030000000000000008805C400B0002E017B
-:10E540000A1282EC80B3002CC80A00328C00A3307F
-:10E5500020D20900028C80830028D80B3412F201EB
-:10E560007000000000000000C005AC01B8022E00E1
-:10E570000A9012EC108B002EC00AB000EC00B30021
-:10E5800022C10B9202CC01AB002AC002B002F004FF
-:10E5900060000000000000004015E000FA0C3EC0E2
-:10E5A0000FA013EE20DB003EC02E8853EC00FB00D2
-:10E5B000B2C08FAC83AC08DB001AC04FB003C004FC
-:10E5C0007000000000000000E001B800FE003FC045
-:10E5D0002DE003FE807F003FC00DD203FC00BF0191
-:10E5E0003EC00DC803FC0CFF003FC009F023F8003B
-:10E5F00060000000000000004010A400FA4032C19A
-:10E600000FA0032908DB003EC00E8503EC20CB00E1
-:10E610003AC00EA403EC00FB003AC20EB003100493
-:10E620002000000000000000C8052C00BA6020C0D7
-:10E630000BA0020800AF002FD00BB502FE028F0026
-:10E640002FC00D800A3C00B70023C205F02236001F
-:10E650004000000000000000C0044000B18820001D
-:10E660000B10020C0083002EC80B08064D408300DF
-:10E6700020C00830060C0893200AE04A3002380017
-:10E68000500000000000000020105A00B59021202A
-:10E690000B58423E00A7802DE00B6902DE408792B6
-:10E6A0002DE00918029E01B78029E00370023E00A8
-:10E6B000400000000000000048084400F101300064
-:10E6C0005F18030C1083003CC40E0403EC008300AD
-:10E6D00030C40C31038C00F30038C80E3103120231
-:10E6E00000000000000000004015BC00FD04BF0455
-:10E6F0004F5803F808EF083FC00FF001FC00FF4C33
-:10E700003FC10FD0033C00F70037C20D7203D006A3
-:10E7100060000000000000000805E200DB0032C0DD
-:10E720004DA8032C08FB007EC88FB00B6F45EBC2D1
-:10E7300036C007A003EF20CB50B2C00C79032A00EB
-:10E740007000000000000000481998008F0021C0F0
-:10E750000B60035C0037002DD20B30020CA887241D
-:10E7600021D0097002DD88872A23E808700232046C
-:10E7700060000000000000002000B600978021E04B
-:10E780000B68021E00B7802DE88B48821E80A38490
-:10E7900025E80B6802CE02878021E0087A0220007B
-:10E7A00020000000000000006804CC08838220E004
-:10E7B0008B2A024840B3002CC00B30820C0083002F
-:10E7C00000C1093102CC00830020C008300A1204C5
-:10E7D0003000000000000000E815E800DAA032A8D0
-:10E7E0008DA8033B00FA003E800FE4036800EA02B4
-:10E7F00036800FE403E800CA0032802CA0033A04FC
-:10E8000060000000000000004801A010F800BE20D9
-:10E810008FC103E024F8003E100F8403E000F801EC
-:10E820003E000F8003E000F801BE100F8003D2000D
-:10E8300030000000000000000810A400F940324041
-:10E84000CF9003E400C9000E500F1A032600F90010
-:10E850003E400F9081E400F98032400C9003C204E6
-:10E86000300000000000000080046404B104224075
-:10E870000B9002E400A9002E530B920A2648B9041B
-:10E880002E400B9002E400B9800250089002E00094
-:10E89000100000000000000038052400BD002340E7
-:10E8A0000BD012C40089022E400B90222400B90024
-:10E8B0002E400B9002E400B1202040689022C60058
-:10E8C000400000000000000028141400BF12A14006
-:10E8D0000B5002C400A1202C480B12020410B111ED
-:10E8E0002C480B1322C400B140205A081002C20168
-:10E8F0000000000000000000B80D6140F840321434
-:10E900000F4503E140C8503E158F850321E8F868A4
-:10E910003E140F8403E1E0F02832A8CC8023EE03FC
-:10E9200050000000000000009815C410F9203E407F
-:10E930000F9003F400F9103E440FD103E400F920D6
-:10E940003E440FD303E400F900BE400F9403E606F3
-:10E9500070000000000000001815E400FD103340B6
-:10E960000CD0032400D9003F404CD003F600FD90AA
-:10E970003A400C9003E6A0FDA837680CD883260027
-:10E9800070000000000000003810E008C8A022005D
-:10E99000088002200088002E000C8012E000B88061
-:10E9A00022000D0A02E380B0C020340884034E0424
-:10E9B000300000000000000048008409A100204150
-:10E9C000089002240091002C40081002C500B1609C
-:10E9D00020400810A2C420B128244A081002520185
-:10E9E00070000000000000001814A4018100A24083
-:10E9F000A89000254089012C40089402E400B90049
-:10EA00002A40099002E401B90422414890024604D8
-:10EA10006000000000000000A014A520E9003240C2
-:10EA20004C100B2600D9003E402C9803E400F9005E
-:10EA3000B2400C9003E400F90036402C90036804C7
-:10EA400070000000000000004801A400E9003E4002
-:10EA50000F9003E600F9003E400E9A03E400F9002F
-:10EA600036400F9003E400F9003C400F9003DA00B9
-:10EA700060000000000000000810A100F800320053
-:10EA80000F8013A000C80032048C8003A0C0F800DF
-:10EA90003A000F80032000C00932004C80010A04B4
-:10EAA000200000000000000028052800BE00208093
-:10EAB0000BE0028800AA0003A00AE602FA008A001E
-:10EAC00032800BA00228008E80A3802820028A00BA
-:10EAD000400000000000000028056C00B348204002
-:10EAE0000B10020C00830020C00834828E049900B1
-:10EAF0000AC01B30020C02905020600830020A004D
-:10EB0000500000000000000080111C80BD0A214858
-:10EB10000B52029C40A3A020800A6002CE008520F8
-:10EB200021C40B7A061E80952021900870022800CF
-:10EB3000400000000000000088081E80F780B179C6
-:10EB40000FDB023E20C7A0B160CC78139600F1F035
-:10EB500039E20F7B130F00D4A031602C70032A021E
-:10EB600000000000000000000815AC00F7003E4067
-:10EB70000F9003ED80FB103E400BB023EC00F9201A
-:10EB80003AD80FB00BED81ED103E800F3003C20676
-:10EB900060000000000000000004BE20EE80336032
-:10EBA0000CD8831E006F8033E00FB8113204F5805B
-:10EBB00033E00FF8832F40FE80B3E00CF803100021
-:10EBC0007000000000000000A8189C00BC00A144D8
-:10EBD0000810035C008F0021800BEA221C80B50125
-:10EBE00021C00BF0021E80BE0023802A70022A047E
-:10EBF000600000000000000000009C20A7002340EF
-:10EC00000B500A3C00A70025C00A43021000B500C3
-:10EC100021C00B70821C80B40021C0087002040067
-:10EC2000200000000000000020048E04B3002240F9
-:10EC30000914024C00830020C00B24820400B100A0
-:10EC400020C08B3A022C01B00020800A30021A0446
-:10EC50003000000000000000A8159E00EB043340C7
-:10EC60002DDC031D60EF003200CF9A032800FD0069
-:10EC700033C18BFC0B3C00FC0032800C90032A0457
-:10EC800060000000000000008000AC10F8003E4072
-:10EC90000E9823AC04FB003C000F8420ED00F9002B
-:10ECA0003EC04FB003EC00FD003E800F9003E40037
-:10ECB00030000000000000002110FC00CF80334035
-:10ECC0000CD083FC00EF003F400CF1413010CD0030
-:10ECD0003FC00070133C00E400B1D00C10032004CE
-:10ECE0003000000000000000A1042C008AE42A404B
-:10ECF000289002EC008B003E020A80022C828904DC
-:10ED00002EC10AB00A2C00890222F22A98022000A1
-:10ED1000100000000000000080052C0280142A4032
-:10ED2000089002EC08AB042E84081082801089033E
-:10ED30002CC04AB0222C00AA002280089102200098
-:10ED4000400000000000000008142C008000284053
-:10ED5000081102EC0083002C810A005A880001008F
-:10ED60002CC00A30020C00820020800A100202012E
-:10ED70000000000000000000000D6C00C9003A40D7
-:10ED80000CD403FC00EB003E400C9203A0004D00AD
-:10ED90003FC00EF0333C80E80032C00C90032003EB
-:10EDA0005000000000000000A011FC00FC003D40ED
-:10EDB0000F5003FC023F043B014FC4137000FD00E1
-:10EDC0003FC01FF001FC40FC003FC00FD013E8061D
-:10EDD0007000000000000000C005F8E0FF803DC0AA
-:10EDE0000DF382F080FF4031CB0CF303FD04EFC143
-:10EDF00033E00F7903FE00CF4233F04CF8033000CC
-:10EE00007000000000000000E010E908B9812FF058
-:10EE100008F452E920BF4023F00AF302FD088B00FA
-:10EE200036E00B8022E8808F4022C008B082300498
-:10EE30003000000000000000C805CC00B1802CC5E7
-:10EE4000093242C8C0B33120C1083202CCD4BB2041
-:10EE500068C00B3002CC2093602088083202320157
-:10EE60007000000000000000E015A000BB802EC074
-:10EE700008B002EA00BB0062C10AB002CC00AB00DD
-:10EE80002EC00BA000E800830022C108300230042D
-:10EE900060000000000000000015E890FB803EC00C
-:10EEA0000DB003E210FB0032C04CB013EC00E9548B
-:10EEB0003AC00FB003E600CB00B2400CB00304042C
-:10EEC0007000000000000000E001B800FF003FC03B
-:10EED0008FF003F000F702BFC10FF023FC00DF0644
-:10EEE00037C08FC907FA92FF043F502FF003F80094
-:10EEF00060000000000000005010AC00C9003EC2DD
-:10EF00000EB023E400EB003AC80EB003EC00F900A9
-:10EF10003EC00FB403A400FB003E800FB083D004BA
-:10EF20002000000000000000C80528008B742DC0E0
-:10EF300008F002E4008F0021F008F002FC10D3007A
-:10EF40002EC00B90122C00EF002EC00BB602F60064
-:10EF50004000000000000000E8054800A3002CC4A9
-:10EF60000A3002C000A30068F00A3012CC04A200EC
-:10EF70002CC00B3002EC00B3012EC00B3402F800A1
-:10EF80005000000000000000B0010C0087802DE858
-:10EF9000087842DA00878025E0087902CE00968062
-:10EFA0002DE00BD902DE00A7802DE00B7802FC00DB
-:10EFB000400000000000000048080C40E3103CC086
-:10EFC0000A3803E800EB0038C20A3003CC00E34003
-:10EFD0003CC00F3403CD00F3203C880F3003D20235
-:10EFE0000000000000000000401DB480FF043FC886
-:10EFF0000FF083F840FF183BC00FF483FC00EE02D3
-:10F000003FC00FF0033C00EF083F800FF013D00625
-:10F0100060000000000000008805E800CB003EF220
-:10F020004DB213E804CB0132F84DB2136D20F80055
-:10F030003EC00F30032400FB003E408FB8032A007F
-:10F040007000000000000000C8118C0086002CC079
-:10F05000087302D812873020CB08F2021D05B500D4
-:10F060002DC00B60035010B7092DC00BF002320405
-:10F07000600000000000000080009E0087802DE4FA
-:10F08000097A02CE01878021EC0978025E80B7C040
-:10F090002DE00BF8021E00B7A02D600B78022000B7
-:10F0A00020000000000000004814EE0082802CC008
-:10F0B000083002EC008300A0C00830020C00B380CE
-:10F0C0002CC10B30024E00B3002CF10B300A12049D
-:10F0D0003000000000000000E815BA80C6003E8045
-:10F0E0000DA003F840CA0032800DA0136800FE0294
-:10F0F0007E800FED833910FA003F8C0FA0033A0495
-:10F1000060000000000000004800E012F8903E009F
-:10F110000F8003E000F8053E000E0003E000F880D9
-:10F120003E000F8003E060F8007E000F8003D200F5
-:10F1300030000000000000000810E400C9803264C4
-:10F140000F9043E406C1043A400F9003E400E90045
-:10F1500032400F90032400C10132400C9003C204DE
-:10F1600030000000000000008004640089C02240DC
-:10F170000B90022400890022501B90222400810061
-:10F1800022400B90222408C9002040089402E0008D
-:10F190001000000000000000180524009920224003
-:10F1A0000B1002A40089002A580B90028400A900C9
-:10F1B00022400B100A0400990222C1089082C60066
-:10F1C0004000000000000000080404009102A0C8F4
-:10F1D0000B12020480812220489B120204908901B4
-:10F1E00020400B1002040281222240081002C201BA
-:10F1F0000000000000000000B80D6142DA01320199
-:10F200000F8503A140C0503A018B8523A144E850EB
-:10F21000B2000F85032148D85132142C8503EE0328
-:10F220005000000000000000981DF500ED023E4473
-:10F230000F9103F440F9103E440F9103E440FD00A8
-:10F240003E400FD003F400E910BF400F9003660664
-:10F2500070000000000000001805E621C5003368BA
-:10F260000F9A036F88C9C033680C9E032780D9406A
-:10F270003E400F9003C510D9E836500CD003E6008D
-:10F2800070000000000000003810E10888008200D3
-:10F290000B8E82EBC888E02200288842A2808A80F8
-:10F2A00022000BAA02E20088C022A9088A038E0469
-:10F2B00030000000000000004805C400810020D09C
-:10F2C0000B1132848481606050081606050091207D
-:10F2D00020400B1082E409912024400810C2D20182
-:10F2E00070000000000000001815A40489042240EA
-:10F2F0000B9002C400A9002241009002A4008100EA
-:10F3000022400B9222E58099012261089002860436
-:10F310006000000000000000A014A582819032402F
-:10F320000F90136702C90032400C90232404D9C007
-:10F33000B2400F9C03E600D90036500C9003E8045D
-:10F3400070000000000000006800A680F9003E4048
-:10F350000F9003E700D900BC420F9053E404F9106A
-:10F360003E400F9803E604E1003E402F9003DA0090
-:10F3700060000000000000002810811048103208D2
-:10F380000C800F2102C8003A040F80076000F8408B
-:10F39000B2000F840B2000D80036100C8003CA0482
-:10F3A0002000000000000000280428048E80238034
-:10F3B00008A04228008A0023A04BA002E800BA005F
-:10F3C00076800BA00208008A00328008E003CA00A1
-:10F3D000400000000000000028054C00820020D002
-:10F3E0000830020C009B0028C01AB0026C00B30267
-:10F3F00020C00B30020C00A30022C0283482CA00B7
-:10F40000500000000000000020011C00870020E0E8
-:10F410000878020C00972025C00B7102DC81B72010
-:10F4200021C00B7A423C80872021C0087002E8008E
-:10F43000400000000000000028080E82C780B1E0F4
-:10F440002CFA061E08D3B139604E78125EA0FFF088
-:10F4500021E00FF8031F08E3A033E00C6803EA0281
-:10F460000000000000000000081DAC40FB003EC092
-:10F470000FB203EDA8EB103A800FB0C3EC40FB00D5
-:10F480003EC00FB083EC80EB70BEC40FB0038206A9
-:10F4900060000000000000004005FE00CE80B36068
-:10F4A0000FFC837E20EFB03BE00FB8033E00CF811E
-:10F4B0003FE08FF883EF40FFC233E10CF803D00048
-:10F4C0007000000000000000A8119C8287182180B5
-:10F4D0000B30021C60D71021D00B7B023C00D70000
-:10F4E0002DC00B7002DE00BF00A3C4087003AA0485
-:10F4F00060000000000000000000BC11870021C077
-:10F500000B30021C00932069C00B70021C008700A6
-:10F510002DC00B7102DC20B71021C00860028400EE
-:10F5200020000000000000006014CD00834020C0D7
-:10F530004B30020C01830020C00B30020C00938082
-:10F540002CC00B3002CC01B30020C008302298043C
-:10F550003000000000000000A815BF20CAC03280A3
-:10F560000FF0033E009F003A800FF00B3C00CF9855
-:10F570003EC00FF603FF00FF0031E02CB003AE04E5
-:10F5800060000000000000008000CC80FB003E50C6
-:10F590000FB003AC02FB007E500FB003EC00FB0089
-:10F5A0003EC00FB203EC20F3003EC60F9003A00054
-:10F5B00030000000000000000110FC02CF9873C86A
-:10F5C0000F70033C00FF0033280FB0021C004F00F7
-:10F5D0003FC00FF003FC00FF0133C00CE403E40460
-:10F5E000300000000000000080046C008380A2F85E
-:10F5F0000BB0422C00BB0032100FB0036C04AB0008
-:10F600002EC00BB012EC04EB0022C04A9482E00042
-:10F61000100000000000000080056C008A0022003D
-:10F620000BB0022C00B300A2C00B3002AC00AB0444
-:10F630002EC00BB042EC00BB0022C008B022E0009C
-:10F64000400000000000000008000C008B012000BA
-:10F650000B30060C00B30020C00A320ACC00A30015
-:10F660002CC00B3002CC00A30022C04A0012C20101
-:10F67000000000000000000000086C008B0422C0A5
-:10F680000FF1031C00FF0432C00BF203BC00EF00BB
-:10F690003EC007F003FC80FF00B2C00CA003E003F3
-:10F6A0005000000000000000A019DC00F5003FC081
-:10F6B0000FF003FC01FF023BC00FF1037C00FF00D1
-:10F6C0003FC00FF013FC40EF003FC00FC003E8063F
-:10F6D0007000000000000000C015F240CC80372010
-:10F6E0000CD803B044FC083F0E0FC103FC00CC94BF
-:10F6F0003F0A2EC4037D80CF103FC00FC08330006F
-:10F7000070000000000000008008E0908802228164
-:10F71000089213A4403B6022180B8102FCD48100A4
-:10F720003AB00A94023D40AF632FDF0B98002004EB
-:10F7300030000000000000008805E0008800204044
-:10F74000883082C000B00828800A1002CC208001D6
-:10F750002C401B06028C90936068C04A0042220134
-:10F760007000000000000000C005A002880022C058
-:10F7700008B002E420BB8826980B8042CC188A008F
-:10F780002EC21B9802AC00AB002EC00B9882300436
-:10F7900060000000000000000011E3C0CB02320056
-:10F7A0002C8003AE08B9003E700FB903EC02484844
-:10F7B0003CC00F8C93EC00DB001AC00EAC031004AD
-:10F7C0007000000000000000E001B200FF00BB80FC
-:10F7D0000FC043B640BD003B600FE803FC00FF9440
-:10F7E0003BE40E600F6C08EF013FC00F6003F800B0
-:10F7F00060000000000000004010A100FB003E601F
-:10F800000FA003ED00F9403A000F9003EC02C90489
-:10F8100032D00F90032C08DB00B6C00DB403D00427
-:10F820002000000000000000C8050000B3892EE0A1
-:10F830000BA403A401B9002E010B9042FC108950C7
-:10F84000A2C08DB4023C448F0023C008B002F20075
-:10F850004000000000000000C0040C00B0802E003A
-:10F860000B1202C800BA002CC00B2002CC00A20070
-:10F8700020002B2D9A2E42830028C0082002F80079
-:10F88000500000000000000020001E04B4802DA0E5
-:10F890000B58029200B6802DE00B6802DE40A68075
-:10F8A00021242948021E80878069E0086102C8007F
-:10F8B000400000000000000048180C00F0303C4CF4
-:10F8C0000F3203C880B20038800F1B03EC00E03019
-:10F8D00030040FB1030E85CB003AC00C3103D202C5
-:10F8E0000000000000000000401CBC00FC113FC4F0
-:10F8F0000FB813B004FE023F800FC003FD00DF12FB
-:10F900001D040FD043BC01EF1033C40EF303D00627
-:10F9100060000000000000000805EE00CB003E0083
-:10F920000F80032800F8003E403DB003EF08C900F7
-:10F930003A000CA003EC98FB2032D20CA8032A0258
-:10F94000700000000000000048119C0087012D801D
-:10F950000B40421C043700A140086002CC808700A5
-:10F960002D802E7002DCA9B72821D0087002120069
-:10F9700060000000000000002000BE0287802D60B3
-:10F980004BE8025A01B48828E08878C2DE5286C06B
-:10F990002960086802DE40B392E1E828280270007E
-:10F9A00020000000000000006814CC008B802EC0F6
-:10F9B0000B20024D809B2020E0083802CC00838081
-:10F9C0002CC00AB002CC08B30020C0083102520497
-:10F9D0003000000000000000E805A800CAE03E80FA
-:10F9E0001FA40B7900FE003F821DE003E800CE401B
-:10F9F0003B882CE403E801FA0032800CE8037A0427
-:10FA000060000000000000004811A000F8093E005E
-:10FA10008FC083A018F8003C200F8803E000F8088E
-:10FA20003E200E8083E101F0003C000F800B92002D
-:10FA300030000000000000000810A400F94232402D
-:10FA40004C98030400C9003A400F90232400B98168
-:10FA50003C400C92032400F90532406C90C3C20470
-:10FA6000300000000000000080042414B900A254FB
-:10FA7000089B1A240289002240289002A400B99011
-:10FA80002E40289C822504B9002240089812E000EC
-:10FA9000100000000000000018052400AD00234005
-:10FAA000085002640089002A400810026400B9006E
-:10FAB0006E400890022500A9002240089106C60069
-:10FAC000400000000000000008041400B510A1442C
-:10FAD0002850024480813020480812028440B180BE
-:10FAE0006CC80812020480B1342048081202C20116
-:10FAF0000000000000000000B80D6140E8403290B6
-:10FB00000CC5036140C0403A140F850321B0F85082
-:10FB10003E000C85032140F840B0140C8003EE0138
-:10FB20005000000000000000B81DC404F9220E4877
-:10FB30000F1013B440FD303F444FD100E484FF0167
-:10FB40003D440FD10BE440F9303E440FD103E604AD
-:10FB500070000000000000003805E400DD403F5068
-:10FB60000CD0032C00C90036400F90132704F50178
-:10FB700037400CF003F620F9A832680CD003C60019
-:10FB800070000000000000001800E00088A02E288F
-:10FB9000288002200088A022000B800A6280B80022
-:10FBA0002200088002E100B8E0223A08A002CE0458
-:10FBB00030000000000000004800840281002E4058
-:10FBC00008100A4402810824400A10024580B90046
-:10FBD0002440291002C400B1082444081002C201C4
-:10FBE00070000000000000001814A40489012E50C9
-:10FBF00048B2026400910022460B90026400B901F1
-:10FC000026C009B012E400B1002640089002C604E4
-:10FC10006000000000000000A004E400C9003C40B7
-:10FC20000C90036400C90236500E93032400F9902F
-:10FC300036480D9483E408F900B6400C9403E804B8
-:10FC400070000000000000006810A400E9003E40C1
-:10FC50000F9013A400E9022E61059003A400F9009F
-:10FC60003A400E9043E410F90038402F9003CA0048
-:10FC700060000000000000002810A000D80132043D
-:10FC80000F8043C001C800B2010C80032000C840AF
-:10FC900030008C8483E000C80032006C8403CA0406
-:10FCA000200000000000000008042800BA002380A3
-:10FCB0000BEA02E800AA00228008A00228008620A1
-:10FCC00037A08DE402F800DA00228008A002CA0002
-:10FCD000400000000000000008056C00B30020C0D8
-:10FCE0000BB8024C04830020C008B0020C02830051
-:10FCF0002040283402CE908300A0C0083002CA0001
-:10FD0000500000000000000020011CC0B588214008
-:10FD10000B7002DC80A32021E04832420E908E015D
-:10FD20006550097002DE20932121C0087002E800AE
-:10FD3000400000000000000028181E00FF80B1A055
-:10FD40000F48027E0087A033E0287A0B1F00C48092
-:10FD500031608C5803FE00C7C833E80C5803EA0230
-:10FD60000000000000000000081DAC00FF003E0085
-:10FD70000F9023ECA0FB403EC08FB503ED80F80050
-:10FD80003C400FB003E800FB023ED00F9003C206D8
-:10FD900060000000000000006004BE00FF803FE043
-:10FDA0000FD903FE20CFC833EA8FFC033F00FD804C
-:10FDB0003F600EE803F200CF802FFE0C78030000B6
-:10FDC0007000000000000000A8009C00B5022DC0DB
-:10FDD0000B5842DC80CF0021C10B30121C40B40212
-:10FDE0002D46087112C800E7002DC40870036A048C
-:10FDF000600000000000000000009C00B7002D0221
-:10FE00000B4602DC08970021C90A30221C00B4000E
-:10FE10002D400A5082C400B7002CC8285002401060
-:10FE2000200000000000000040148C18B3002E20B9
-:10FE30000B1802CF4A83C220C10B34220C04B858DD
-:10FE40002C400B2802C800A3002CC0081402480450
-:10FE50003000000000000000A805BC00FB003E8050
-:10FE60000FA002FC00DFA0B3C00EF00B3C00FBC0F3
-:10FE70003CA00EBD03EC00FF003FC00C30036A0441
-:10FE80006000000000000000A010EC00F9003E013E
-:10FE90008FB143EC00F3003EC04FB013EC00FB0009
-:10FEA0003E800C8403E10073003EC10FB243E000CA
-:10FEB00030000000000000000150FC10FF8037C03F
-:10FEC0000CE003FC20FF0833C00FF083BC00FF00F0
-:10FED00033C02E40031C01CF0011C04CD00300449E
-:10FEE000300000000000000081046C04B3022272A4
-:10FEF00008A116EC00BB0422C00BB042EC00BA19FA
-:10FF0000B6D0089C4A2680DB0022C00890036040DF
-:10FF1000100000000000000080052C00B9106220D5
-:10FF200048A002EC00BB0022C00BB002EC10BB00EA
-:10FF300066080AA81226109B002AC028B0262000B6
-:10FF4000400000000000000008000C00B900200084
-:10FF5000083202CC04B30020C04B3002CC00B30006
-:10FF600020000800020100930028C008300642115A
-:10FF70000000000000000000001C6C00F900B2400E
-:10FF80000C8202DC01FF00B2C00BF103BC00F900DF
-:10FF900026402E80032104CF00BBC00C9003000339
-:10FFA0005000000000000000A01DFC00FD003F40CC
-:10FFB0000F8103FC00FF003FC00FF023FC00FC009A
-:10FFC0002D402FC003F088FF0037C08FD003E80218
-:10FFD0007000000000000000C005FE40FF8033C23A
-:10FFE0000CF8037CA0FF903FC42CB403BC80CF402E
-:10FFF00037E00FF1936E44BF303F202CF863F004DC
-:1080100070000000000000008010EC00EB2023F056
-:1080200008B8523D00B3002EDC08F4421C428B40DD
-:1080300022C80BF6036C88BB302E0008B202E004A5
-:1080400030000000000000008805CC00BB0820C004
-:108050000830024CA0B3202680883602CCA0936062
-:10806000A4C20A32424C90B3202C0B883082E20129
-:108070007000000000000000C015AC08BB22A2C0C8
-:1080800008B0022C00BB002E9008B002EC009B0050
-:1080900022C00BB0026C00BB022E2008B002F00020
-:1080A00060000000000000004015EC00B18332C009
-:1080B0000C1A036C10FB0034C00CB003EC08DA009F
-:1080C00036C00EB00B6C00FB003E280CB002D00096
-:1080D0007000000000000000E001BC00ED803FC027
-:1080E0000FD403EC00FF003FC80FB0033C00EE408C
-:1080F0003FC00F7003FC00FF003F800FF003F8004B
-:1081000060000000000000004010AC00FB20B0C088
-:108110000FB403AC02CB0032900EB0036C00EB0046
-:108120003AC00CB002EC00FB003E910FB00390008F
-:108130002000000000000000C8052C00BB8023D7F1
-:108140000B90023C148B006A0828F000BC008300EE
-:10815000BEC088F0132C00EF002E800BB007B200D9
-:108160004000000000000000E0054C00B34020D0BB
-:108170000B28028C00830120C01AB8006C10A100EB
-:1081800068C02A30028C00B3022E004B3002F80483
-:10819000500000000000000020011E00B7A021E0F8
-:1081A0000BECC21E04878029E40879829E40AF90C0
-:1081B00029E00A38001E00A7902D240B78028800C1
-:1081C000400000000000000048080C50FB0930C0CF
-:1081D0000F20028C40C30020C00A38034C44E10049
-:1081E000AAC00E31438E00F3003C000F3003D202D0
-:1081F0000000000000000000404DBC00FF203FD008
-:108200004F7003FC00FF003DC00FF343FC40D7005C
-:10821000BFC00DF4C3FC40FF003F400FF003D00689
-:108220006000000000000000A805EC00FB0032D058
-:108230000D9001EDC0FB003EC01FBA03ACC0C800EA
-:1082400032E08DB443EC00FB0036A00CB0036A00B2
-:10825000700000000000000048119C00B70021C819
-:10826000086002DC20B7002DC00F74A21C28D600C5
-:1082700035C00872025C08B744A180487002120041
-:108280006000000000000000C0009E00B78020E4F5
-:10829000097826DE00B7802DE20A70128C88818072
-:1082A00021E0097802DE00B3A025A028780270043E
-:1082B00020000000000000004814CC01BB8020C05A
-:1082C000083042EC00B3002CC00A30220C009300AE
-:1082D00024C1083002CC00B30020E008B002120430
-:1082E0003000000000000000E815A800FA08B28085
-:1082F0000DE203E800FA003F800AA003A800CE5078
-:10830000328005A003E800FA0037A80CA0037A0425
-:10831000600000000000000048006008F8003C0019
-:108320000F8801E000F8043C004F0013C000F80083
-:108330003E000F80036000F8023E010F8003D20070
-:1083400030000000000000000810E400F990124026
-:108350000C9003A400C9003E700E94332408C90099
-:108360002A400B9003E400F9003A400F9003020406
-:10837000300000000000000080046400B942226068
-:10838000081002240089032E40089002A4018104F1
-:108390003E400B9002E400B90222400E9002200001
-:1083A000100000000000000018052400B9402A4A0F
-:1083B000089102A40089002E401A900A2404890022
-:1083C0002A400B9002E400B1002A400B9002060004
-:1083D000400000000000000008040400B101A848AB
-:1083E000889002048081402C5018140A841089401F
-:1083F0002C400B1002C400312020400A100A020158
-:108400000000000000000000B80D6140F0503A008C
-:108410002CA002A142C8003E00DE002321428800B9
-:1084200038140F8503E140F85038140F05032E016E
-:108430005000000000000000981DE408FD003644D4
-:108440000FD0036440F9003D500F9403E5007D40D8
-:108450003E400F9403E400F9103F400E9003E60401
-:1084600070000000000000001805E400FD403368C3
-:108470000CD003E781F90033780DD81326A0CDA0E6
-:1084800032400D9B032400F9A03C442C9007860049
-:1084900070000000000000003810E000B8A0A2103A
-:1084A0001880038284B880362C2E0F02A3A0D8E057
-:1084B00036228B080342A0F8E02E28088802CE045A
-:1084C00030000000000000000805C400B100A0500A
-:1084D000283002C580B10820400910A24408814814
-:1084E00020400B14020480B1382C4808128282010B
-:1084F00070000000000000001811A400B10022402C
-:10850000089202E400B90226584A9002E408994011
-:1085100026400B90026408B9012C48089012C6044A
-:108520006000000000000000A015E400F980324067
-:10853000089883E404B90130400D900B6402C9002F
-:1085400032400F90032400F9001E580C9003A80439
-:1085500070000000000000002801A400F9203C4049
-:108560000F9803A400B9003E428E104B8404F9001A
-:108570003E408F9003E400E9003E400F9003CA00A4
-:1085800060000000000000002810A000D8003208A1
-:108590000F8483A004C8043E008380012000C00033
-:1085A00032000F0003A000C80032104E8013CA042E
-:1085B0002000000000000000280528008E90A38005
-:1085C0000BE4022800CA002F804AA013A800AA00CA
-:1085D00036810BA00228008A00228008A0038A00AE
-:1085E000400000000000000028054C0093C020D08F
-:1085F0000B34028C008B002CF08B18024C00830093
-:1086000060C00B30028C02830028C10A3002CA000D
-:108610005000000000000000A0011E00B40B69C063
-:108620000958061E8097102FC24870829C80A708A8
-:1086300025CC0B70021E8187A2ABC4087302E80030
-:108640004000000000000000A8083E10DC8421E08B
-:108650000F78429F02C7883DE02F71034E00CF8004
-:1086600021E20F78839E49CFD039E80E7803EA02E1
-:108670000000000000000000084DAC40CA003600B9
-:108680008F3023ECA8EB403CC00F9643ED80FB00FD
-:108690003ED88FB143ED80FB2036CA0FB0A38206CF
-:1086A00060000000000000000005FE80FC8031E05A
-:1086B00005AA10FE44FF903FE1CFF9173F20D78075
-:1086C0008BE40FF8033E30FF8037E00FF8004000E6
-:1086D0007000000000000000A8119C00BD1021C027
-:1086E000084A02DCC0B7002DC20CD3021C808700F0
-:1086F00029C04B72021C00B70121C00BF0122A04E2
-:10870000600000000000000000009C903400218008
-:108710000970005C0CB7002DC408501A0C009700BB
-:1087200021C04B30021C00B70025C00B7002400076
-:1087300020000000000000002014CC00B000600009
-:10874000083E02CC00B3020CE02BB0020C009300F8
-:1087500028C00BB0022C10B30020D603300208044E
-:108760003000000000000000A815BC00FB00B200B3
-:1087700005BE037C00FF003E200CB0033C00D98006
-:1087800033C08BF0033C00FF0037E00FF0036A04B6
-:1087900060000000000000008000EC00FB043E00D0
-:1087A0000FA423CC00FB003E81089003EC00E914E9
-:1087B0003EC00FB003EC10FB003EC00FB003E00062
-:1087C00030000000000000000110FC00FF003780B6
-:1087D0000FFA03FC00CF003F9006DC233C00FD10A5
-:1087E00033C00FF00B3C00430033C00FF003C04414
-:1087F000300000000000000081006C09BB1922322B
-:108800000BBE036C008B002C900DB802AC00B100C5
-:10881000F2C00BB012AC008B0022C00BB003A04022
-:10882000100000000000000080052C10B30026207E
-:108830000B9012EC018B002AC20A90022C00BB00A4
-:10884000A2C00BB0022C00AB002AC00BB002E000AB
-:10885000400000000000000008040C01B3002000EC
-:108860000B00028C0083002EC00B34028C00BB0076
-:1088700020C00B30020D00A300A0C00B300282010B
-:108880000000000000000000000D6C00BB043680FA
-:108890000FB202FC02CF0238C00EF0033C00FB0016
-:1088A00023C00FF0033D02EF0033C00FF043C003BD
-:1088B0005000000000000000A01DFC00FF003F0071
-:1088C0000FF4237C00FF003FC00DD003FC00FF002D
-:1088D0003BC00FF003FC88DF003FC00FF003A80689
-:1088E0007000000000000000C005F050CE1233D030
-:1088F0004C868330805F6833C40FF3833CC0CC3830
-:10890000B3080CC603F1A0FF0033240CC203F0002F
-:1089100070000000000000008010EC80D22023D8FE
-:108920000D96028860AF4023DC0BF6023CC28860E3
-:108930002252089122E100B724A2488A848260046E
-:1089400030000000000000008805C4008100E0C481
-:108950000A00020480A320A8C01B300A0C00A0005B
-:10896000280C090202C480B31C2208190302E21178
-:108970007000000000000000C015A400998062C0D3
-:108980000BA032A451AB002AC08BB0000C00A9C0D0
-:108990002A2108B822E200BB0022841BA8427004EE
-:1089A00060000000000000004015E200CBC932C0AA
-:1089B0000E8B132210DB0132C00FB00B2C0068812C
-:1089C0003A222C8823E300FB0030308D9C83D004B6
-:1089D0007000000000000000E001BA40F7043EC251
-:1089E0000DD823D8007B0037C00F7033FC10D200A5
-:1089F00035C08FC003F400F7023FE00E8003F8009B
-:108A0000600000000000000040108120C80830C055
-:108A10000C00832440C3893AC00EB00B2C08C9480F
-:108A200072540F9103ED02EB8A3A628C800B1004B2
-:108A30002000000000000000C8052B048840A3C2ED
-:108A400002AE1227428F4423C20BF4023D000A40BB
-:108A500022E00BB502EC208F44A2408DBD233200F2
-:108A60004000000000000000E0054940838124C16F
-:108A700008280201009300A0E80A30828F60B390BA
-:108A800060B80B28124A0093002090092002780059
-:108A9000500000000000000020011E0287A825E011
-:108AA0000A7B021A04878021E40B78828E02969159
-:108AB00021210B6940DB40979223A089588208004E
-:108AC000400000000000000048082582C30034C0B8
-:108AD0000C9B4308D0D32038C00EB0038C00B300E9
-:108AE0002080071003E000D31038180D3003520225
-:108AF0000000000000000000401DB4007F201BD0DB
-:108B00000FF103F840EF003FC00FB4037C20CF0407
-:108B1000BF400FF003E410EF183DC00FE003D00694
-:108B20006000000000000000A805E800E300B2C4F7
-:108B30000CA0032400DB6832C80CB403EC80C880AE
-:108B4000B6E00CA0032E00CBE0B2600CB80B2A00FC
-:108B5000700000000000000048119C028700A1C8BE
-:108B60000870021C08970221D4087402DCC00700B8
-:108B700021C08870021800830821C0085002120426
-:108B80006000000000000000C0009E20AD8029E0D1
-:108B90000858021E0097B021E8087802DE10158000
-:108BA00021A10848025E0087A465A0087802300071
-:108BB00020000000000000004814CF108170A8C001
-:108BC00038300A0D009300A0C1283002CC028388FF
-:108BD00020E038340A4D72830024E82834821204DD
-:108BE0003000000000000000E815BA40EEC0BA8076
-:108BF0000CE0033910DA0032800CA003E800DEC874
-:108C000033A00CE0037B00CA0037B10CE4233A0424
-:108C100060000000000000004800C100F8003600BD
-:108C20000F8003C02038003E000F0003E000F80270
-:108C30003A240F8083A001F8043A040D8013D20077
-:108C400030000000000000000810E444C100324081
-:108C50000C9032240CC10638400D90090400D90054
-:108C60003E400F18032400F9013E400F9003C20458
-:108C700030000000000000008004640689002A50D3
-:108C800008940A2400894222500A90122500890083
-:108C90002E500B9C0A2510B9002E500B9002E000BC
-:108CA0001000000000000000180524208900204268
-:108CB0000810C2AC1089082A4209900224209900A9
-:108CC0002E420AB1822C20B9006E420B9002C600DF
-:108CD0004000000000000000080404008300284851
-:108CE0000812628C80810020400210028480812062
-:108CF0002C490B12060484B3026C400B1202C20111
-:108D00000000000000000000B80D41E0C8783014F9
-:108D10004C0513A142C078381E0D87830140D05006
-:108D20003C140E05030140F8783C140F0503EE03D4
-:108D30005000000000000000981DFC00FF000E44E1
-:108D40002FF1037440F9003E400D90036440FD1084
-:108D50003F440FD101F440F9013FC00FD103E606B3
-:108D600070000000000000001805E622E988B2400B
-:108D70000F90032416C98C367B8F9C83A790C90063
-:108D80003E500494132450C9E03E500F9003060057
-:108D900070000000000000003810E28088A0222847
-:108DA0000B8A022A8088A42230088E0A220288A018
-:108DB0002E2888AA12229088F42E200BC8020E04B6
-:108DC00030000000000000000805D420A508214262
-:108DD0000B50821431850825400A502294408508A2
-:108DE0006D40085002540295002D480B50824201FC
-:108DF0007000000000000000181584008D10234052
-:108E00000BD00034018D00234158D00234008D086E
-:108E10002F5008D20274809D002F480BDC024604BC
-:108E20006000000000000000A015E740E9C03240EB
-:108E30000F90092600C90436401F9023A408C9409A
-:108E40003E400C940B6420D9023E410F9403680409
-:108E500070000000000000002801A400F9803E40DE
-:108E60000F1403C508F9003E401F9023E400F900E9
-:108E70003C40AF98038600E9003E400F100B8A008B
-:108E800060000000000000002810B000DC40B300CB
-:108E90000FC0033102C404B1003C40031000FC4089
-:108EA00033000CC403B100CC00B3000CC403CA04EB
-:108EB0002000000000000000280528008A8022A071
-:108EC0000BA0022A008A8422A108A0022808BA0165
-:108ED000228008A02B28008A802A8008E002CA008D
-:108EE000400000000000000028054C029B8120E0AB
-:108EF0008B3806CE00938020C00838020C00B38067
-:108F00006CE00AB0024C00930020E0083002CA0076
-:108F10005000000000000000A001100480082102A1
-:108F20004B4406D020900821028044021000B4C0B7
-:108F30002D10484002000094892930084002E800C2
-:108F40004000000000000000A8083200D68031A0D8
-:108F50000FE80BCA00D68023A004F80B1A00FF808C
-:108F6000BFA02EC813DA025E8073A02C7803EA0239
-:108F70000000000000000000081DAC00F9003E40A9
-:108F80000F90032400E9003E400E8003E400F80047
-:108F900032400FB003E401E90436400F8003C206FB
-:108FA00060000000000000000005FE00CD8033607E
-:108FB0000CD8433600CD8033600CD923BE004D80E1
-:108FC000336008F80B3E00FD843F600FF903C000DA
-:108FD0007000000000000000A8119004DE00238053
-:108FE000086002B8208E04238008680210008E20DA
-:108FF00023820840021200F6002D800B41A0EA04F3
-:1090000060000000000000000000900084002100CB
-:109010000841025040940021000A5202D800850203
-:1090200025040840221808B4002D100B7840C00019
-:1090300020000000000000002014EE22930020C059
-:10904000083802EC00930020C12A2002640282103A
-:1090500024F00A3C422428B3002CE00B8882C80488
-:109060003000000000000000A815AD00CB00B2C029
-:10907000ACBE036E02DB00B2C01EA003E400CA1146
-:10908000B6D0ACBC032400FB003EC0CF8403EA048E
-:1090900060000000000000008000E040F8003C009C
-:1090A0002F8203A000E8003E001D9013A800F900E5
-:1090B0003A00818343E800E8033E040FB003E00078
-:1090C00030000000000000000110E000D6003780F2
-:1090D0000CA003F800CE0033800DA0132008CE00B2
-:1090E00033820C40733018CE001F804FC1430044C0
-:1090F000300000000000000081047C008D0023404F
-:109100000AD002F4008D00234008D4803E428D40F6
-:10911000234008F0023E408D000F400BF402204037
-:10912000100000000000000080052C009900A640FF
-:10913000089006E400910020408800022408804046
-:1091400020400AB002240089000E400B8402200057
-:1091500040000000000000000804000082002080A1
-:109160000A2106C801820020800832820808830094
-:1091700060800A0012088082002C800B300A0201F5
-:109180000000000000000000000D6000D800360064
-:109190000C8423E000C80032000D820B2002C800BE
-:1091A00032000E00032002C8003E000F80030003BF
-:1091B0005000000000000000A01DFC00BF003FC0E8
-:1091C0000FF003FC00FF00BFC08FB003FC08FF02DC
-:1091D0003FC00DF003ED00FF023FC00FF003E806B3
-:1091E0007000000000000000C001F08CFF003D6036
-:1091F0002CB2837C90DF3831E00FF8033C00FF2075
-:109200003FC40EF4037C00F48033000DF803F0003B
-:1092100070000000000000008010E120BB622E42C0
-:1092200028F4423E408F4422E00BB0837F44BFC10C
-:109230002DDC2AF6023F45B880226188B802E0049E
-:1092400030000000000000008805C580B2182EC85C
-:109250002930320C08B32020C04B92020C00B340DE
-:109260002CC08934124C00B00024C1493002E20104
-:109270007000000000000000C011A400BA0C2EE035
-:10928000A9B0062C008B00A2C00B90006C00BB00A4
-:109290002EC00B30026C00BA8026F008B002F00439
-:1092A00060000000000000004011EE00FBC43E78AA
-:1092B0002DB0036C08FB0032C08B24832C00FB0014
-:1092C0003EC08FB00B6C08B2E016608DB023D004A6
-:1092D0007000000000000000E001BE98FF403FC0A9
-:1092E0000E7003DC00FF003FC00FE003FC00FF0036
-:1092F0003FC00EF003AC00FE00B9C00FF003F80051
-:1093000060000000000000004010AD00FA403ED0B8
-:109310000EB203EC00C3003EC00CA0032C01FB0006
-:109320003CC00EB803EC00DA003AD04FB023D004B2
-:109330002000000000000000C8052C00BA002CC06E
-:1093400008F407BC14DF003EC01AA052BC00BF04E2
-:109350003FC08AF003BC00FA0022C80FB003F2003D
-:109360004000000000000000E0054801B1006CC2B0
-:109370000A3042CC0083052CC00830028C01B304B3
-:109380002CC00A30228C00808028C00B3022F800CC
-:10939000500000000000000020011E08B7806FE0B0
-:1093A0001878028E40B7802DE00A78029E00B780C0
-:1093B00029E10A78029E01BC8029E40B7802C800EA
-:1093C000400000000000000048080940F1203CC4B3
-:1093D0000E3902CC00C3002CC40892038C88B31051
-:1093E0002CC40EB0078C00C20838C00F3043D20224
-:1093F0000000000000000000401DBC10FC007FC009
-:109400000FF083FC21DF083BC08F9001FC21FF0C93
-:109410003FC20FF103EC00EF0077C01EF00390068F
-:109420006000000000000000A805E801F90032C05B
-:109430000FB203EE90DBE13AC04D38132D30FB0044
-:109440003EE04FBA432C40FA003FC08CB003EA0024
-:10945000700000000000000048119C00B10021C015
-:109460000B7102CC20A72821C00B70135C08B71029
-:109470002DC44B34831CC1B7022DC01A7002D20414
-:109480006000000000000000C0009A20B4C425A2C3
-:109490000B7806DE00838029E01BF8025E80A7A01F
-:1094A0002DC80A72021E00A68028E0087802F0008B
-:1094B00020000000000000004814ED00B34024C369
-:1094C0000B3042CC00A30020C01B34024C00B30080
-:1094D0002CC04B30020C00B3882CD40A3002D204CA
-:1094E0003000000000000000E815B800FE40B7A002
-:1094F0000FA003E800DA003A800FE2036800FA00E8
-:109500003E800FA00B2800EEE03FB004A003FA0459
-:1095100060000000000000004800E004F0083A107D
-:109520000F8403E010F8003E004F8083E000F80055
-:109530003C000F80038000F8403E090F8003D200FA
-:1095400030000000000000000810E420E900324470
-:109550000C90032400F9003E400F9013E400B90082
-:109560001E400C10032400C9A03C640C900382042C
-:1095700030000000000000008004640089002268C0
-:109580000813022408F9002E481B9002E400B900D9
-:109590003E400C90022408F9402E600A9006E0003C
-:1095A000100000000000000018012400A900204065
-:1095B0000890022400B9012E400B9002E400B9008B
-:1095C0002E40089222240089002E40089002C600F6
-:1095D0004000000000000000080404808121E050E9
-:1095E00028160A0480A1402C404B1422C400B1006C
-:1095F0002C500914020404B1002C400A1002C201CC
-:109600000000000000000000B80D6140E85032008A
-:109610008C80022000B8003E000B8033E010F80080
-:109620003E000C80032008CA003E000C8003AE03FD
-:109630005000000000000000981DFC40FD102F416C
-:109640004F9103E440F9403E404FD063E500F940BC
-:109650003A502E94036500ED003F500F9003E6064C
-:1096600070000000000000001815E600F9E033501B
-:109670000CDA03A600D9803F400F9103A600F988B9
-:109680003E680CDE036600ED003B690C9003C600EB
-:1096900070000000000000003810E108B8E0202051
-:1096A000188E26E10080A02E004B8842E150B84081
-:1096B0002E2A0D0A022008B8002E140D8002CE04B6
-:1096C00030000000000000000805C500B160204027
-:1096D0000831A2C50091482C401B12028400B10041
-:1096E0002C500916020500A3042840081002C201EC
-:1096F00070000000000000001805A400B9082070E8
-:10970000289002E40089002E400B9002E408B9037F
-:109710002C402990026400B9002E62099002C60410
-:109720006000000000000000A005E500F9D0B27064
-:10973000089003E400D9043E400F9003A410F902FE
-:109740003E400D902B6400E98D3A600C9003E804D4
-:1097500070000000000000002801A400F9803E42D3
-:109760000F9003E400F9003E400F9A03E400F90073
-:109770003E402F1003A400F9223C404F9003CA0042
-:1097800060000000000000002800A000F04032004F
-:109790000C8003C000F80032201F8003E000C800E6
-:1097A00032000C80022000C8C03E000C8003CA04B6
-:1097B000200000000000000028152810BA0023A097
-:1097C0000AE402E800BA002BA10BA002E800AA00FC
-:1097D0002A810AA003E808DE002E800AA002CA003F
-:1097E000400000000000000028054C00B304A0B1B8
-:1097F000083622CC00B30020E40B3002CC008300FA
-:1098000020C00818020C0091012CC0083006CA00C4
-:109810005000000000000000A0011CC8B32121C2BC
-:109820002A7002DC00B7A029C00B7202CE00A7810B
-:1098300029C04A7402FE0097012CC00A7012E80089
-:109840004000000000000000A8081E80F7C031E0C2
-:109850000C4803DE11F78021E00B7A03DE00C380A1
-:1098600033D86C78033E00D6803DE00C7803EA02E2
-:109870000000000000000000080DAC08FB803EC0A6
-:109880000FD003EC04FB3C3EC00FB6076C01FB009D
-:109890003ED00F9407EC01EA003EC00FB003C206B1
-:1098A00060000000000000000001FE00CFA43B604B
-:1098B00008D9037E00CF803F254FFC87BE00CF80B4
-:1098C0007FFC0CFC037C00F69033E00FF803C00033
-:1098D0007000000000000000A8119C088F282140A3
-:1098E00008D0021C40A72031041B7802DC80D7007E
-:1098F0002FC41AD0021E48B60061C00B7006EA04DD
-:10990000600000000000000000008C008730694407
-:109910000850220C0087012D448B70068C108700A4
-:1099200029C90850021C44A60061C00B7002C00087
-:1099300020000000000000002014CD00838860405B
-:109940000010024C002B002C411B3002CC00930075
-:109950002CC00A30420C00B24020F10B3002C80487
-:109960003000000000000000A815BD41CFC0BAF0D3
-:1099700028901B6C08CF002CC00FF003AC008B00AC
-:109980003FC06CB04B2C01FB4022C80FB003EA046F
-:1099900060000000000000008000EC04FB043FD4E5
-:1099A0000F1003AC00FB0032C05FB003EC00FB04FF
-:1099B0003EC04F1013EC00FB883EC04FB003E000E8
-:1099C00030000000000000000110DC00C70033621E
-:1099D0000CC00B3C00EF0033E01CF0133C08F70018
-:1099E00031C00ED803BC00FE003DC60CF003C044DD
-:1099F000300000000000000081046C00CB0322470F
-:109A00000898422C009B002AC00AB0022C00BB041C
-:109A10002AC00AB002AC08FA002E6008B002E0408A
-:109A2000100000000000000080052C009B0020407A
-:109A30000898022C00BB0022880830022C00BB00D2
-:109A400022C08A9202AC00AA802EC008B006E000B4
-:109A5000400000000000000008040C008300A0404B
-:109A60000810020C00B30028800A32120C00B30464
-:109A700028C00A30228C20B2002CC0083002C2015B
-:109A80000000000000000000000D6C02CB00304020
-:109A90001C94032C00EF0032C088F08B2C00FB00DC
-:109AA00033C0AEF003AC80EA013EC02CB003C0036B
-:109AB0005000000000000000A01DFC00FF002F402F
-:109AC00007D283FC00DF043FC00FB003FC00FF009F
-:109AD0003FC00FD00BEC00EE003F400FF003E80654
-:109AE0007000000000000000C005F500CF083F48EE
-:109AF0000FC39370D0DC303FD80CB2033CC0FF40A2
-:109B000033C42CF1036250FC3433000F5C03F000CB
-:109B100070000000000000008010C4808B002F5AED
-:109B20000BA61221C089702FDC08F2C23DD0BF40C5
-:109B300037DC88F50A2080E8102A160B9002E00432
-:109B400030000000000000008805C00083082C449D
-:109B50000B02020C0080002CC80833428C90B330FA
-:109B600028C84A3212800CB0A028280B1202E20149
-:109B70007000000000000000C015A2008B002E48FD
-:109B80000BA022202088802EC028B00AAC00BB0089
-:109B90002EC00AB002A000AB822AA00BB202F004D1
-:109BA00060000000000000004015E700CB003EC050
-:109BB000CF9C0B2100D8883EC00CB003AC00FB004A
-:109BC0003AC00EB043E840F8803A600F9803D004E2
-:109BD0007000000000000000E001B400FF000FE092
-:109BE00007A103E802FB003FC00F70237C00FF02C7
-:109BF00035C04DB0037420FC013F000FF803F8009E
-:109C000060000000000000004010A500CB00BA403A
-:109C10000C140B2F22C94032C08EB003AC00FB00E5
-:109C20003EC00EB003E400C90032002C90031004C3
-:109C30002000000000000000C80124008F00224026
-:109C40002CA54229008B04A3C10DF00A3C00BF00E3
-:109C50003FC008F0016900DA0522D00894037200C1
-:109C60004000000000000000E0056040830120C0CB
-:109C70000900022000826022C00830424C10BB0262
-:109C80002CC008B01205009B002082093202380067
-:109C9000500000000000000020011690878020E0A6
-:109CA0000858021614848121E02939025E00B78029
-:109CB00028E00878027A80968121E009F8024800BD
-:109CC0004000000000000000480808098B103844DC
-:109CD0004D25120C00C21022C80A3803CC00F31024
-:109CE0002CC00C30038AC0D91032402D1003120250
-:109CF0000000000000000000401DBC80FF003F404D
-:109D00000FF003F440ED003FC00EF303BC04FF006E
-:109D10003FC20FF00BD400FF10BF800EF003D0063F
-:109D20006000000000000000A805FA00CB023EC061
-:109D30000F9003A000CB003ACA0CB313AF24CB485A
-:109D40001EC80FB6032C00FA003EC00F9003EA00B5
-:109D5000700000000000000048119C0887202DC4FE
-:109D60000B5012DC0487002CC00870A21D00A74015
-:109D700025CB8B74821C00B7002DC10B7002D2045E
-:109D80006000000000000000C0009A0187902DE0F4
-:109D90000B7802CE0086802DE4297A029E8087A06F
-:109DA0006DE80B78021E00B5802D600B7802F00084
-:109DB00020000000000000004814CD0083022CE0C9
-:109DC0000B3002CC0083E02CC00830020C00A30052
-:109DD00024C00BB0020E20B3082CC00B3002D204FA
-:109DE0003000000000000000E815B882CA003EA85C
-:109DF0000FE003F8028E803E800DA05BA800CA0031
-:109E00003E800FA0033B80FE422F800FA803FA0480
-:109E100060000000000000004800E020F8003E0064
-:109E20000F0603C000F8113E000F0003E000F80029
-:109E300036000F800BE000F8043E200F8103D200B3
-:109E400030000000000000000810E400F9003E406F
-:109E50000C9A032440C9C03E404C90032400F900F2
-:109E600036400790032400C90432600F9003C204F7
-:109E7000300000000000000080046400B9022E40A1
-:109E80000A9202250289E02E409890022400B9002F
-:109E900022400990020400D90022440B9C02E000F9
-:109EA000100000000000000018052C00B9002C4034
-:109EB000089002242889002C40689042240CB104A8
-:109EC00026400B900A2C8081002240CB9282C60053
-:109ED000400000000000000008040400B1202C48ED
-:109EE0000A1202048081212C4C0811020408B110CE
-:109EF000204C09120224019120A0480B1002C2013B
-:109F00000000000000000000B80D41E0F8503E14D1
-:109F10000C85032140C8503E1008068301F0F86804
-:109F200036100F05032940C85032940F8503EE0305
-:109F30005000000000000000981DF400F9103F449C
-:109F40000FD10BF440FD122E4C03920BE400F920CC
-:109F50003E4C0F9103FC00FD103F440FD003E6067A
-:109F600070000000000000001805F620C9013E4006
-:109F70000FD0033C00BD0032630C9E432700E9C0B4
-:109F80003E680C98033400F9103F400FD003C60020
-:109F900070000000000000003810C220D8002E0021
-:109FA0000B80522804B8002238088803620088F029
-:109FB0002E3A488F0A2000B0802E000B8002CE047B
-:109FC00030000000000000000805C48081002C4023
-:109FD0000B10020400B10020424814420580A12069
-:109FE0002C440810820400B1202C400B1002C20146
-:109FF00070000000000000001815A50199002E4017
-:10A000000B90022440BB0122410890122400A900B9
-:10A010002C400810402408B9406E500B9202C60430
-:10A020006000000000000000A015E714C9053E41D3
-:10A030000F900B2404F908B2402C900A2400E90088
-:10A040003E402C90032700F9803E600F9003E80407
-:10A05000700000000000000028018488F9003E48DC
-:10A060000F9903E600F9023C40AF1003E412D90453
-:10A070003E400F9003E500F9C03E640F9083CA0094
-:10A0800060000000000000002810A100C8003E0091
-:10A090000F80032100C840B2000C80032010C800CC
-:10A0A00032000C8003E080F80432002C800B0A049C
-:10A0B000200000000000000028052800CA002E80B3
-:10A0C0000BE80A38108EC022800DA00228000A0476
-:10A0D000028028A002FB00BA0037B048EA020A005A
-:10A0E000400000000000000028054C0093012CC037
-:10A0F0008BB0420C909B2020C04830422C00830043
-:10A1000020C0083002CD40B30024C80838020A003D
-:10A110005000000000000000A001140087002DC0C6
-:10A120000B24061600930821C80931020C8087A071
-:10A1300021C0187202DC00B7B424E30878022800BA
-:10A140004000000000000000A8081E0297A03DF09B
-:10A150000F48033E00D68030E02C7A021E82C3F006
-:10A1600033EC0C7C03D600F78035E00CD8032A02D0
-:10A1700000000000000000000819A5A0FB003ECA76
-:10A180000F8003EC02EA003EC60FB40BED40FB006B
-:10A19000BEC00FB643E000FB023E800F9003C20634
-:10A1A00060000000000000000005FE02CF883FE0D4
-:10A1B0000CB903FE00DD8133E08CFC033F04CF804B
-:10A1C00033E24FFC033E00CFC033640CF803C00001
-:10A1D0007000000000000000A811944087002FC10B
-:10A1E0000D69A2D040BC0023C008F0029C0087008B
-:10A1F00021C00B700A3C048710214C086002EA045D
-:10A20000600000000000000000009E0087002DC0DC
-:10A21000096202D800970021C40870020C40970020
-:10A2200021C40B30025800A7082180086082C000BA
-:10A2300020000000000000002014E42583002CC052
-:10A24000092202CC20B20020C028B0028C0093006A
-:10A2500020C00B30426C20830820E208B802C804FA
-:10A260003000000000000000A815A400CF003FC08F
-:10A270000D9C03E800DB8033C00CF00B3C06DF00D4
-:10A28000B3C00BF0076800EF4032A80CA803EA0443
-:10A2900060000000000000008000EC00FB002EC009
-:10A2A0000F9403C540FA303EC00FB0036C00EB00C2
-:10A2B0003EC00F3013AD40FB023ED00FB403E000B0
-:10A2C00030000000000000000110E400C70031C1B0
-:10A2D0008CD0033400CD003DC00CF0017C00DB01CC
-:10A2E0003DC04CF00B3002C30032000FD0030044DD
-:10A2F000300000000000000081046E408B002AC086
-:10A30000288442228088803AC00DB002AC088B00BD
-:10A310002EC008B00223208B0022308B8C022040FC
-:10A320001000000000000000800524008B0022C007
-:10A330000838862A0089802AC008B002CC009B0019
-:10A340002EC008B04226008B0022710B8C02200028
-:10A35000400000000000000008040C00830028C03A
-:10A360000832420000810028C00930528C08830066
-:10A370002CC018300600008300A0000B0002020170
-:10A380000000000000000000000D74028B0033C0CC
-:10A390000C920B2002C8003BC00CF503FC00DF014F
-:10A3A0003FC104F0332140CF0032000F800B000387
-:10A3B0005000000000000000A019FC00FF003FC09A
-:10A3C0000FC403F0009C003BC00FF003FC00FF0033
-:10A3D0002FC00FF003F080FF003F000FC003E8061E
-:10A3E0007000000000000000C005F0C0FFA0312494
-:10A3F0000EF0631004EF643FC04CF3031C80DF08D1
-:10A4000037C00FF003F0A0FC0031082CD203F0009D
-:10A4100070000000000000008010E100BBC1224875
-:10A4200008FD022E0097002FC24871237E40BF0016
-:10A4300021C54BF502EF00BB4036E008A802E0045E
-:10A4400030000000000000008805C584B311A2C9D7
-:10A450000A30020001B33028C40832420C00A308BD
-:10A46000A0CA0A32828010B0412411083102E201F0
-:10A470007000000000000000C015A500BB0022E134
-:10A4800028B0022C809B002EC008B0026C00B300E4
-:10A4900022C00BB000EC20BB0026C0088002F004F4
-:10A4A00060000000000000004015E340F70432C0E7
-:10A4B0004EB0232E20EB001EC00CB0012C00FB0080
-:10A4C00036C01FB003E140FB0036980C9003D00467
-:10A4D0007000000000000000E001B604FF023FC071
-:10A4E0000FF003FE00EF023DC00FF023FC00FF0061
-:10A4F0003FC04FF003FC00F4003B400FA013F800F6
-:10A5000060000000000000004010AA20EB1036C0E0
-:10A510000DB007EC20DB0032C00CB0026C20EB0069
-:10A520003EC10DB003E020DBA032904CB00B100414
-:10A530002000000000000000C8052D008F8020C111
-:10A54000087012CF008F00A3C00DF0023C008F00F6
-:10A5500037C088F002EC00880020400880023200FA
-:10A560004000000000000000E0054C00A3802481B2
-:10A57000093006CC40930028C108B002CF40A300A8
-:10A580002CC0093002CD00904060402810023800F5
-:10A59000500000000000000020010E00878023E032
-:10A5A000487902DE41978029E01978069E0087806D
-:10A5B00025E0087802D203838021A0086802080001
-:10A5C000400000000000000048080C00A30034C058
-:10A5D0000D3042CC01D3103AC50C3903CC00E30452
-:10A5E0003CC40D3003CE00D00030400C30031202CA
-:10A5F0000000000000000000401DBC00F7003FC04C
-:10A600001FF053FC00EF0837D10FF0837C00F740B8
-:10A610003FC10FF103D000FF00BF840FC803D00675
-:10A620006000000000000000A805E000FB003EE024
-:10A630002CBE83EC00EB403EC00FB403ED20FB10BA
-:10A64000B6D20FB483EC00DB8036C10C90212A0017
-:10A65000700000000000000048119400B7002FC0F7
-:10A660000836020C0887302DD98B7286DD00B320A6
-:10A6700021C80B7402D0028400A00028200212041A
-:10A680006000000000000000C0009A00B7802DE0CC
-:10A69000087A029D00A7A02DE00B78029E80A7807B
-:10A6A00021E4087A269E18830421E008780A7000C5
-:10A6B00020000000000000004814CC00B3002CE093
-:10A6C0005830120E8283002CC00B3002CC01B30034
-:10A6D00020C10B3002C00888D2202008000252049A
-:10A6E0003000000000000000E815B860FA003F826A
-:10A6F0000CA003FA00AA001E808FA003E800F2005D
-:10A7000032801FA003E800DA003688ACE0037A0448
-:10A7100060000000000000004800E100F8003E205A
-:10A720004F8003E100F0003C000B8003E000F802E2
-:10A730003A000F8043F100FC0A3D000FC003920075
-:10A7400030000000000000000810E600C9903E4004
-:10A750000F9203E400D9003240049007E700F9109B
-:10A7600030400C9043E409D98022402C100B0204A5
-:10A7700030000000000000008004646089C02E40AA
-:10A780000B9826C58089002240289012E710B90056
-:10A790003640289012C583C980B640089002200038
-:10A7A00010000000000000001805040089402E4140
-:10A7B0004B9002E4009900A2400A9002E500B90023
-:10A7C000E241089042E4009D50AB4A08D0260600C2
-:10A7D00040000000000000000804048281202C508A
-:10A7E0000B1002E400814020504A1432C400B140F2
-:10A7F0002451181412D40085402D4008500602013F
-:10A800000000000000000000B80D6140C8003E00DC
-:10A810000F8002E000D80032000A8002E010F80049
-:10A820003200048003E000D8003A000CC0032E037D
-:10A830005000000000000000981DF440F9103F4156
-:10A840000F9403F500F9403E500D9403E510F940D4
-:10A850003E504F9403C500E94136500F9403E6067D
-:10A8600070000000000000001805F600FDA83A4046
-:10A870000CD8233600E9A03E780F9E03B680CDE2C7
-:10A8800032680C9B0336824DA037688C9803060013
-:10A8900070000000000000003810EBA0B84020203D
-:10A8A000088502215188C02E290B8E02E100D8E0D4
-:10A8B00022320D8D23614898D4A2102884020E0400
-:10A8C00030000000000000000805C500B3002A4A5F
-:10A8D00028104EA408A16828440B1402C50081402A
-:10A8E000A0500810020402912A204428144A0201B0
-:10A8F00070000000000000001815AC80B900224074
-:10A90000489006A400A9002E400B9022E400990074
-:10A9100022400910026402990022400890020604B5
-:10A920006000000000000000A015E400F9003858A5
-:10A930000C90538414A9043E400F9003E400C90016
-:10A9400032400C90032404D900B6404C900B2804EC
-:10A9500070000000000000002801A400F9023E4938
-:10A960000F10436400D9003E400F9003C400F10271
-:10A970003E400F9003C402E9043C400F1C03CA0090
-:10A9800060000000000000002810A180C8203E00E8
-:10A990008C800B2000E8023E000F8003A082C800DC
-:10A9A0006C000F80032010C80032020C80030A04E0
-:10A9B00020000000000000002805380086002E80DE
-:10A9C00068A8803A008A002E800BA002F8008A0056
-:10A9D0002E800BA00A3A008E10238008A0030A00E4
-:10A9E000400000000000000028054D0083002CC03E
-:10A9F0000838000C6023002CC00B3002CC408300D0
-:10AA00002CC00B30020C028A80A0E028300A4A00D9
-:10AA10005000000000000000A001162087022DC198
-:10AA20004870127C00A7202DC90B7200DC0087083B
-:10AA30002DC41B32021D01874221C208700228006A
-:10AA40004000000000000000A8083E02C7803DEC66
-:10AA50000C58031E00E7803DEC0F7F039600C78073
-:10AA60002DE20779030A06C38030208C38036A027E
-:10AA70000000000000000000081DAC00FB003EC00C
-:10AA80000F10438C00DB383ED80FB003CC04FB44DE
-:10AA90003EC08FB613EC02FF023E000FB003C206A9
-:10AAA00060000000000000000005FA00FF8031E3B4
-:10AAB0000EF823FE02DF80B7E20EF8037E006DD0B1
-:10AAC00033E00CF89B76C0DF84B3E004F803C000E9
-:10AAD0007000000000000000A8119040B70221C4DF
-:10AAE000087B42DC00870021C40B300010808D0001
-:10AAF00023C00DF20204428F0029C8287002EA0424
-:10AB0000600000000000000000009400B60023C0B8
-:10AB10000A72028C00870021C00A30020401A702D9
-:10AB200021C0087042008A870021C0287002C0003E
-:10AB300020000000000000002014C500B000A0D0DC
-:10AB400008B002C9428B0020C00B302204008300F1
-:10AB5000A0C0493002454093C0A8D4003502C804C3
-:10AB60003000000000000000A815AC00BB0031C0A0
-:10AB70000EB023CD00DF0037C00EF0016800E30007
-:10AB800033C01CF0034500DAC892D42CB403EA04A5
-:10AB900060000000000000008000E520FB003EC0D7
-:10ABA0000FB003EC00FB003EC04FB003AD00FB0054
-:10ABB0007EC01F3003A480E9203CC00F3203E000B8
-:10ABC00030000000000000000110DC00C70033C2AC
-:10ABD0002CF0033E20DB0013C00C70033C80EF041C
-:10ABE00073C10FF0223000C600B2C00CF003004465
-:10ABF0003000000000000000810069008B44A2C109
-:10AC000088B0036C008B0022C028B00A2D00BB0066
-:10AC100062C00BB00226028B8022C008B003204025
-:10AC20001000000000000000800528018A0822C0F2
-:10AC300008B2026C409B0028C048B0162904B90134
-:10AC400022C049B006AE098B8022E048B002200045
-:10AC5000400000000000000008040002820022C042
-:10AC600088B0024400830028C00830020800B10008
-:10AC700020C00B30028C00838020E008300A0201E3
-:10AC80000000000000000000000D6400CA0033C096
-:10AC90000CB2032C00DF003BC04CF5132C04EF007A
-:10ACA000A3C00DF003A840CB00B2002CB0030003FA
-:10ACB0005000000000000000A01DF000F4003FC0A4
-:10ACC0000FB103F000FF0037C00FF003FC00FF00DE
-:10ACD0003FC007F00B7C08FF013F000FF003A80600
-:10ACE0007000000000000000C005F0C5ED333BCC53
-:10ACF0000CF0033040FF253FCC0CF3833CD0DF4801
-:10AD000037304CF303FD80CF2833D80CF1033000EB
-:10AD100070000000000000008010ECD0BB3120CC9F
-:10AD200088F3422050BF902FC40AF6027DC08F40A6
-:10AD300026408FF602FD00FF0839C808F602A0047D
-:10AD400030000000000000008805C480A12028C950
-:10AD500008309A0009B3002CC02030024C908320A8
-:10AD600002080B3312CD80932024D808342222010C
-:10AD70007000000000000000C011AE00BB1022C037
-:10AD800008B00226013B016EC008B0024C088B00DF
-:10AD9000A2890BB002EC00AB006AC128B002B0047B
-:10ADA000600000000000000040156E00E8C13AC0DD
-:10ADB0002CB0432600FB063EC10CB00B2C02CB008E
-:10ADC00034229FB043EC009B0236C18CB0031004C8
-:10ADD0007000000000000000E001BC00FC803DD0DD
-:10ADE0002FF003FC00FB003DC0073003BC00EF0464
-:10ADF0003FE05EB001FC00FF001BC00FF003F80055
-:10AE000060000000000000004010AC00CB013EC913
-:10AE10000CB0172084EB00B2C10DB0036C00C3006E
-:10AE200032500FB0030C40C3007EC00C300310043E
-:10AE30002000000000000000C8052C008A582EE009
-:10AE400048F0022D00EF0123C008F0223C048F607F
-:10AE500036540BF00A3D408F002FC008F0037200FB
-:10AE60004000000000000000E005400089802C1038
-:10AE700008B0024900A3A024C00930024C0083C9D5
-:10AE800020904230124D0083006AC0093002380021
-:10AE900050000000000000002001160085806D6257
-:10AEA000087E025640278025E01978060E00838030
-:10AEB00061A00B78024E0087826DE009790248009C
-:10AEC000400000000000000048082C02C3613C88DC
-:10AED0002CBA124910E32C36C00D30534C44C30039
-:10AEE00020010F31034C00C3013CC02DB1031202FD
-:10AEF0000000000000000000401DBC00FF003F00FB
-:10AF00004FF109B000FF003BC00EF401FD24FF40EB
-:10AF1000BFC007F003BC006F103FC41EF183D00612
-:10AF20006000000000000000A805C400E804320032
-:10AF30000CB603E802CB0036CA0FB503AD00FB2008
-:10AF40003E400FB303EC80FBA832C68CB6032A0048
-:10AF5000700000000000000048119402E60020008C
-:10AF6000087302DC0087702DD00BF0021C84B72020
-:10AF70002DC00B7082DD24B74034C9287282920440
-:10AF80006000000000000000C000BE02AC80A120F4
-:10AF9000087900CE04878065E00B7A029E00B790A6
-:10AFA0006DA00B7802DE00B78021E0087802300047
-:10AFB00020000000000000004814ED82ABE020E417
-:10AFC000083002EE0483002CC11B30020C08B300D1
-:10AFD00064F60BB002CC04B30026C0083002920421
-:10AFE0003000000000000000E815BB80EE4931A0F1
-:10AFF0002CA003FA00CA0236800FA003A800FA02B0
-:10B000003F900FA063E800FA0032800CA0233A04BE
-:10B0100060000000000000004800E00AE8003E0870
-:10B020000F8003E350F0003E000F8013E000F800B3
-:10B030003E000F8003E001F8017E000F8003D20084
-:10B0400030000000000000000810E440C9A13240B8
-:10B05000201101A640C98436400D900344004100F0
-:10B0600032400F900B2400F9003E404C10030204C4
-:10B070003000000000000000800464008982A240CB
-:10B08000089C02250089C82240089042240089209B
-:10B0900022600B90022410B9002E4008900360003B
-:10B0A000100000000000000018052400890422CAD6
-:10B0B0000A900A2502892020402810026401A90074
-:10B0C000224B0B90022401B9002E41289002060069
-:10B0D00040000000000000000804049081A0204807
-:10B0E0000A320204808100204408110204D0A12009
-:10B0F00020400B11020600B1312C48081402420115
-:10B100000000000000000000B80D6142C854321475
-:10B110000E85032144C828B21A4C86936114E85066
-:10B1200022140F86832140F0401E140C00032E03CE
-:10B130005000000000000000981D7444F5103F44CA
-:10B140000D91037440F9003E480B9203E4C2D910FC
-:10B15000BF400F9203E504F9303E440F9443E606E6
-:10B1600070000000000000001805F622CDA1336138
-:10B170000CD8D33410CDA83E608E9C93A708CD8008
-:10B1800033400E9AD336A0C98032600C9903060072
-:10B1900070000000000000003810E3888AA020281A
-:10B1A000088022201288402C28088A022200880069
-:10B1B00022000B8C03210088D0A23E288D020E04B1
-:10B1C00030000000000000000805CE20A1482052F9
-:10B1D000291002240381002C520A1012851091407C
-:10B1E000A4400A128244009128244028120202013D
-:10B1F00070000000000000001815A400A9142240EF
-:10B20000099002A40189042C4008900224009900AE
-:10B2100022444B10422414990026400810020604D0
-:10B220006000000000000000A015E440E940B27892
-:10B230000D900B2422C9033E410E9003A402D900B5
-:10B24000165806900B6402D90036400C900B280467
-:10B25000700000000000000028018400D9803E4AF0
-:10B260000E90036420F9083E410F9003E400E108CA
-:10B270003E400F9003C400E10038400F9003CA0025
-:10B2800060000000000000002810A009F040B0108D
-:10B290004C000B2000F8003A001C0003E000C8003E
-:10B2A00036000C80032000C80032000F80030A041F
-:10B2B0002000000000000000280528003E8823A28E
-:10B2C00048E0001980BE882E800DA042E8008E0064
-:10B2D000239008A00A3A00DA0036800BA00A0A0080
-:10B2E000400000000000000028054C00B38020E072
-:10B2F0002830C20F10B34028C00B3002EC1183403D
-:10B3000028D20A30020CC0830020C00B30020A0091
-:10B310005000000000000000A0011C00B60021C089
-:10B320000820C21C10B5002DC80A7202DC40850836
-:10B3300029A21A72220C00933005C40B3222280075
-:10B340004000000000000000A8081600B280312074
-:10B350000C58031E00F78039F80B7C22CE40CF80BA
-:10B360009B602E3B031A00C7A811E00F78032A0246
-:10B370000000000000000000081DA400FA003EC00C
-:10B380000F9023E800FB003ED02DB603ED02F9003C
-:10B3900032400DB007EC00FB603EC80FB503C2069B
-:10B3A00060000000000000000005FE00FF8033A0E8
-:10B3B0000CF80B3240CE8137F00CBC03FE00FF844A
-:10B3C00033E02CF883E602CF8533F00CFC03001445
-:10B3D0007000000000000000A8119C00BE0035C6EF
-:10B3E0002830023040870023C0087A02DC00BE000B
-:10B3F00023C0087012FE00870021C008F0022A0452
-:10B40000600000000000000000009520B6002080D1
-:10B410000831025C01870025C0087202DC00B6001A
-:10B4200021D0097002D408930020C00870020000E7
-:10B4300020000000000000002014C400B0E02460E0
-:10B440000820064801800020C0083002CC04B30068
-:10B4500020840B3002E8009B0020C0083002080462
-:10B460003000000000000000A815AC00B9E03280F8
-:10B470006CB0236F00C30037C13CF003FC00FA003E
-:10B48000B0C009F003EC10DF0073C00CF00B2A0011
-:10B4900060000000000000008000EC10F8003E4258
-:10B4A0000F2403A860F8003CC10FB003EC00F94082
-:10B4B0003E8004B023E100EB003EC00FB003E0008B
-:10B4C00030000000000000000110F400EE003D30EC
-:10B4D0000CC0031400CCA0B3C04C70035C10DF00A0
-:10B4E0003F000CF003F800CF0023C00CF003004035
-:10B4F000300000000000000081046400BA812E5872
-:10B500000888022780892022C028B0022C00888366
-:10B510002E2005B062E3008B002AC008B003604013
-:10B52000100000000000000080052600B9812E40B8
-:10B53000088C062600880022C008B0166C00988887
-:10B540002E2008B004E3010B0028C00830022000C0
-:10B55000400000000000000008040400B0002CC0FF
-:10B5600028000E0010800020C00832020C00800469
-:10B570002E20093002C412830028C0083002420184
-:10B580000000000000000000000D6C00FA003E000A
-:10B590002C910320008A0033C00CF0037C00D800FB
-:10B5A0002E400CF003E080CF003BC00CF003000302
-:10B5B0005000000000000000A01DFC00FC013F4006
-:10B5C0000FC013F000F4003FC10FF423FC08FC008F
-:10B5D0003F000FF003F040FF003FC00FF003E8060C
-:10B5E0007000000000000000C005FC20CD1039C82C
-:10B5F0000DC1033C80EF9023D80FF800FE00CF80F0
-:10B600001FD00FF903FF00E7C033C40FF003B000F1
-:10B610007000000000000000C010FE02894023F00E
-:10B620000885103C008B00A3DC4BB282EC208B0021
-:10B6300026C04BB002EC10B9042AC90BB580F00447
-:10B640003000000000000000C805CC00816428C460
-:10B6500009B20A0CF0A32020C80B3202EC028308C6
-:10B660002CC8093202CC80ABA020C80B3200B2013A
-:10B670007000000000000000C015AC10890022C05E
-:10B6800008B2122C020B0022C00BB802EC008B0097
-:10B6900026C04BB046EC00B9000AC00BB002F00463
-:10B6A0006000000000000000D015EC10C9E03AC0B6
-:10B6B0000D28032C00EB1032C00F8203C400CB0016
-:10B6C0003EC10FB006EC08E900B2C00FB013900401
-:10B6D0007000000000000000E0019C00F5A03FC0E9
-:10B6E0000FE803FC08FF003FC08FC003FC00FF0011
-:10B6F00037C00FF003FC00FF043EC00FF003F8005A
-:10B7000060000000000000005010AC00F94034C0A0
-:10B710000DB4032C00DB403EC02C80036408FB10FA
-:10B720003EC68FB003EC00F98032C00CB00B14049D
-:10B730002000000000000000C8053E20E9C837D402
-:10B7400048AA221C008B006FE0088582ED40BB8474
-:10B750002FC04BB803AD40B30023D408F70232002A
-:10B760004000000000000000E0014C00B164A4C0F3
-:10B7700009200A0C04B8006CC0083802C840B38025
-:10B780002CD10B3002CC04B30028C00830023A00A0
-:10B790005000000000000000B0011E00A58025E060
-:10B7A000883A121E00A6902DE2087902DA00B782CC
-:10B7B0002DE00378829E00BCC129E00878022C109D
-:10B7C000400000000000000049080C00F30034C0F5
-:10B7D0000D3E030C00F0402EC00C3043C800F300B7
-:10B7E0003CC0073003CC80F20038C00C300312029A
-:10B7F00000000000000000004019BD20F7003FC21B
-:10B800000FF10BDC20DE043FD207F013F840FF00FD
-:10B810003FC007F003FC00FD0037C00F7003D006E7
-:10B820006000000000000000AA05CF00DC003ECA56
-:10B830000FA000AC92C90032C00FB011A408FB00E9
-:10B840002EC04FB023EC00F9003EC40FB003EA0055
-:10B850007000000000000000C8919C00840001C03E
-:10B860004B70221CC0870021C04B70021C00B70126
-:10B8700025D80B7022DC00B6002DC00B7222F2041A
-:10B88000600000000000000080009E809780A9E01A
-:10B890000BF802CE08858029E80BFC021700B78060
-:10B8A0002DE08B7802DE00B4C02DE80B7902E000B9
-:10B8B00020000000000000004814CC008308A0C055
-:10B8C0008B3C024C008300A0C01B3C0A0F29B30034
-:10B8D00024C00B3002CC00B3802CC00B3002D20449
-:10B8E0003000000000000000E815A800DE003A80EB
-:10B8F0000FEA02E800CE003A800FE0033800FA00B9
-:10B900003E800FA003E800FE003E800BA003FA0477
-:10B9100060000000000000004800E000F804BA01E8
-:10B920000F820B8004F8803E000F86036000F80051
-:10B9300036000F8023E100F8003E000F8003D200A4
-:10B9400030000000000000000810E401F90032405F
-:10B950000F9003E400490032400B9003240049009B
-:10B960003C400D9003E408C9003E600C90030204C3
-:10B97000300000000000000080046400B940A264B0
-:10B980000B18022500D15036504E900A24028940EF
-:10B990003A51089402E52289442E6028900A20003A
-:10B9A000100000000000000018012400B10822402F
-:10B9B0004B9282A500A90822500A10020C00A9404F
-:10B9C0006E500B9402C40489446C488810024600EF
-:10B9D000400000000000000000040400B140E0400E
-:10B9E0001B140A0400B90024401A10220400A1000C
-:10B9F00028400A1012C40081026C40081202420161
-:10BA00000000000000000000B80D6008B000320027
-:10BA10004F8002A150E05032140EA5232140E8507F
-:10BA20003E140F8503E140C8501E140C85436E037D
-:10BA30005000000000000000D819E500FD403E5015
-:10BA40000F7403A5005D003E500A5013F400D900A6
-:10BA50003A500D9013E400FF003E500F9103A606EC
-:10BA600070000000000000001805F690BDE8236B90
-:10BA70000BDA0B3680C9003268469043E400490077
-:10BA800032680C90032440F90032600C9C03C6011C
-:10BA900060000000000000007810E100B8E0A21192
-:10BAA0000B8E0A232288802A31288802620088802F
-:10BAB000A23028888A2200B8A8A23908CA02CE0477
-:10BAC00030000000000000004805C50821000040CB
-:10BAD0000314828580AD0821529850823423850852
-:10BAE00021520850065400B520215A095402D201AF
-:10BAF00030000000000000001811A400B9612240CD
-:10BB00000B90060400AD00694008D0027400850067
-:10BB100001400070067404B500234009D002C60439
-:10BB20006000000000000000A014A400E900324002
-:10BB30004F950BA400E90032408C90032400C9000B
-:10BB400032400C90036408F90032403D9003E80451
-:10BB500070000000000000006801A408F9003E40E9
-:10BB60004F908BE404D9013E400D90036400D9014D
-:10BB70003E400F9003A400F9003C400E9003DA0011
-:10BB800060000000000000002810A000F8403620EF
-:10BB90001784032021C8007E022C80432000E80285
-:10BBA0003E010F8003E000C8401E000F8003CA045E
-:10BBB000200000000000000028052A88B60223A00B
-:10BBC0000BEC422B00D2806EB108A0220800EA04E0
-:10BBD0003A809FA003A8008A042E800BA802CA0006
-:10BBE000400000000000000028054C00B200A4E165
-:10BBF0008BB432474583902CF44B38120E44A3018A
-:10BC00002CC04B3002CE0093006CC00B3802CA002F
-:10BC10005000000000000000A0011C00B74421C239
-:10BC20000B5402540587002C409B6C021810A7048B
-:10BC300029C00A70029B0097040D800B6082E80007
-:10BC40004000000000000000A8081E00F38035E05E
-:10BC50000B3802521084802DA00FF80B1E00E680D6
-:10BC60001DA00B6803FE02D6803DE00F7803EA02B8
-:10BC700000000000000000000A1DAC00FB003EC1F7
-:10BC80008B900B800AB8012E000CB003E800FA007C
-:10BC90003EC00FA043EC00EB003E800FA623C20283
-:10BCA00060000000000000000005FE00FE80332060
-:10BCB0004EC912F650EF903FE00C1900B642CF216A
-:10BCC0003FE00EF902E6C0FF803FE04CDC0340009D
-:10BCD0007000000000000000AA119400B70081402D
-:10BCE00008030214C487012DC8086A12384087026D
-:10BCF0002DC0087112D280B7002D800860022A047E
-:10BD0000600000000000000000009C00B7102180CF
-:10BD100008F4129404A6002CC018D202144886100D
-:10BD20002D800A6132D400B6182DC40858020010C4
-:10BD300020000000000000002014C400B30020C058
-:10BD400040B022040082810CC008300A0A008A0038
-:10BD50002EC008A002C400BB002E800820020804E8
-:10BD60003000000000000000A815AC00FB00A0C0DF
-:10BD7000249423AC10EBA00EC00CB0022E20C900FE
-:10BD80002E400E9003EC00F9803E406CA00B2A047C
-:10BD900060000000000000008000CC00FB003EC0FE
-:10BDA0008990032C00FB023E404FA0036D01FB4134
-:10BDB0003EC08FB403E800FB203E500FA403E00018
-:10BDC00030000000000000000110FC00C320B2C0E1
-:10BDD0000DD0033800CD003F800DF003FC00FD02C4
-:10BDE00036000CD0033F08FC0412C00CA003C04472
-:10BDF000300000000000000080046C028BC822C0EC
-:10BE000008980A2A4089202E018EB012EC80BBF0DF
-:10BE100022E508BD022E00BB9022ED08A202E00040
-:10BE2000100000000000000080052C008B012200A3
-:10BE300049A81E04008B012EC0499002E400B900FD
-:10BE400022400A90022C00B9002A40088002E0003B
-:10BE500040000000000000000804040081002040B1
-:10BE6000082002040083002CC00A2042CC00B3004A
-:10BE700020C00230020884B3040840082002C21126
-:10BE80000000000000000000000D6C008B00B2807C
-:10BE90000DB1032402CB013EC04D9043E400F900F4
-:10BEA000B2002E900B2C80F800BAC02C8003C00387
-:10BEB0005000000000000000A01DF4007D003FC005
-:10BEC0000F7203D400FF003FC00EF147FC00FF00DB
-:10BED0003BC00DF013FC50FF0037C00FE003E80635
-:10BEE0007000000000000000C005F0C4CC333F0427
-:10BEF0002CF6033860CC90B3200FF123F060FF01E3
-:10BF000023C80CF28A3C81DF303F640CD803300434
-:10BF100070000000000000008010E0C28A302E187F
-:10BF200008F530A594582222214BF302E1009F70BE
-:10BF30002BE40AF4121D40AF722C492F3082A00668
-:10BF400030000000000000008805C48080A02C980C
-:10BF5000083222080082002800033202C084B30C99
-:10BF600020C05832928C30A3202EC0481242620169
-:10BF70007000000000000000C015A8008B002E20FB
-:10BF800008B00A200198002A220BB002E6009B00AC
-:10BF900022C00AB012AC04AB002EC003B002F00005
-:10BFA00060000000000000000015E500C8003EB081
-:10BFB0000CB0032900C8003A204FB003E220FB0177
-:10BFC000B0C00CB0032C00FB023C410C9043480471
-:10BFD0007000000000000000E001A280FE403E0072
-:10BFE0000FF063EC00BFC417420FF003EC00FF003A
-:10BFF0001FC10FB0035C00FB003F404FF000B800D2
-:10C0000060000000000000004010A502C8003E9043
-:10C010002CB00B0106CB013E505FB0132110CB00BA
-:10C020007EC00CB00B2C00CB0032C00C900310046F
-:10C030002000000000000000C80528018BD02C342F
-:10C0400048FF023000AA042E690FF0036810DF00D9
-:10C050002FD40DF0023E005F04B6C008B00372009A
-:10C060004000000000000000E005699081802C0085
-:10C0700048B802080999004CB00B30020C008B0044
-:10C080002CC009B0400C40830000400A90023000F0
-:10C0900050000000000000002001160084882DE4FC
-:10C0A0004839021600B4802DE00A7B065E009780B6
-:10C0B0002DE20978021E90978025648A7802480054
-:10C0C000400000000000000048080D0081102C9680
-:10C0D0000831230C0090203CC41BB8020840C30068
-:10C0E0002CC40D30030E40C31030C04E10071A127E
-:10C0F0000000000000000000401DBC007D053FC5A1
-:10C100000FB10BF400EF001F450FF043FC01FF409F
-:10C110003DC41FF006FC10FF003BC12DF103D0060B
-:10C120006000000000000000A805EC04CB043EA065
-:10C1300044B6032804CB8032800FB3936008FB2001
-:10C140003ED21FB3032D80FB617E408C98032A00F2
-:10C1500070000000000000004811840C86052DC00E
-:10C1600008F4828C908500A1C00BF0025C003700BF
-:10C170002DD00B71021CC8B7482D400A7002120462
-:10C180006000000000000000C0009E0087802DA11C
-:10C1900060784A16D0A78029E00B78529601B790B4
-:10C1A0002DE80B7A225E40B7A02FE14850223000E4
-:10C1B00020000000000000004814CC1083842CC034
-:10C1C000083002A41083CB28E00B302A4F409300A4
-:10C1D0002CC00B30024C10B3022CC0AA3002120447
-:10C1E0003000000000000000E815B800CEA03F803D
-:10C1F0004CA02B3A00CE403BB80FA003B900BA00C8
-:10C200003E800FA0036800FA007E801CA00B3A0459
-:10C2100060000000000000004800E002F8003E045A
-:10C220008F0003E04AF81026180F8003A080F80260
-:10C230003E008F000BA000F8023E000F8013D200DA
-:10C2400030000000000000000810E420C900324067
-:10C250004D99032400C9023E680F90022400E900B2
-:10C2600030408C90030440C9003E400C900302040F
-:10C270003000000000000000800464208906225085
-:10C280008B9CC22400D9012E400B90422408B90196
-:10C2900022460D900A260289002C400A1002200036
-:10C2A00010000000000000001801060091404270DC
-:10C2B0000B90122C028B002E400B1022E410B100C8
-:10C2C000A240489012240899022E400890020600CD
-:10C2D0004000000000000000080404929120E048A3
-:10C2E0000B1202040291102CC00B100684C0B11076
-:10C2F0002048891102058091402E442A94020201AF
-:10C300000000000000000000B80D6140D85030145B
-:10C310000F850B21E080403E000F878BE10CF86C0D
-:10C3200032008406832004D8283E100C00032E031C
-:10C330005000000000000000981DF440AD103F4583
-:10C340000F9103FC187D201F410F900374C0F92149
-:10C350003E440F9201E440E9003D484FD003E60619
-:10C3600070000000000000001805F780FDE0337049
-:10C370000CDA032620C94031400E9A032400F980CC
-:10C380003B600F9C8336A0F9A1B0400F9103C6001B
-:10C3900070000000000000003810E290B8A02228D1
-:10C3A00028880A220288A02200088802C280B88851
-:10C3B00022040B8E032280B8D02A200B8802CE04E0
-:10C3C00030000000000000000805C580B161005881
-:10C3D00048168A04A0890122401A14880420B1401A
-:10C3E00028400B100A0420B12C204A0B1202C20173
-:10C3F00070000000000000001815A590BB40204010
-:10C40000089002244089426258081002E500B903EE
-:10C4100022C00B9002A41431002A440B9002C604DF
-:10C420006000000000000000A010A500F9013240EB
-:10C430008C90032700C19430400E90032400F90033
-:10C440003A400F90032400F9003260079027E80576
-:10C4500020000000000000002800A418F900BE44DD
-:10C460000F9003C400F900BE618F9003A400F10097
-:10C470001E400F10032408F9007E400F9003CA00ED
-:10C4800020000000000000002810A181F800320404
-:10C490000C00D32100D8043A149C80032101C80069
-:10C4A00036000C80132010C80032002C8003CA0410
-:10C4B000200000000000000028043A00BE8423850C
-:10C4C00008EC8368048A002F904DA0022801DA004E
-:10C4D00023B00AA0022A08DA0122800FA002CA00B3
-:10C4E000000000000000000028054C00BBF020C048
-:10C4F000083C0A0C00930128C88930064C008302CE
-:10C500002CF60830020400A30020C00A3002CA0042
-:10C51000500000000000000020011D11B300A0C069
-:10C520000850025C1087016D814932521EC387009A
-:10C5300028E00A32261F00370023E00B7202C800F1
-:10C54000400000000000000028081200B7823120DF
-:10C550000808370F08D7E03960197A0B5E0C83B2F0
-:10C560007DE00C7A0B3E02AFA0B1E00E7A03CA0266
-:10C570000000000000000000081DA010FB003EC0ED
-:10C580006FB043EC11FB003E400FB503EC20FB50B5
-:10C5900036000FB543E5A1DB783EC00FB403C206F9
-:10C5A00060000000000000004005FE00FFA03FA06A
-:10C5B0000DC9133E00CFD03DE802FF133E00CF82ED
-:10C5C0003F600CFC233E10EF8033F20CFC83100024
-:10C5D0007000000000000000A8119C40B5012DD0A3
-:10C5E0000858021C4057102D5A283102BC019710E0
-:10C5F0002D000A70028404CF0029C00AF0022A0428
-:10C60000600000000000000000009000B72A2D82AA
-:10C610000842223C0087110DCC8832021D00970091
-:10C620002CC40830021400A70023C0097082000047
-:10C6300020000000000000006014C020B0202C503A
-:10C640000810022DC093E22C210830020E0893003E
-:10C650002C400A30028C0093002AC00B30021804D0
-:10C660003000000000000000A815AC00F8C03E80BB
-:10C670002CA00B3F00C7603ED00CF00B3C00CF005D
-:10C680003E800CF00B2C00EF0033C10DF00B2A04A0
-:10C6900060000000000000008000EC40F3403E50CD
-:10C6A0008EB403EC10FB003E090FB013EC42EB001C
-:10C6B0003C008FB013C411E3003EC00EB003E00095
-:10C6C00030000000000000000110FC00FC8031225E
-:10C6D0000CA8033C00CF0033A00EF003DC00CF0019
-:10C6E0001FF00CF003F400CF0233C00CF002005432
-:10C6F000300000000000000081046F00BBC0227009
-:10C700000AB9422C108B00761183B002EC10AB00FA
-:10C710002EB00AB003EC048B00A2C028B002204067
-:10C72000100000000000000080056540B820224491
-:10C7300058340A2C008B0022844BB002EC008B0092
-:10C740006EC008B042E6048B0002C0083002A001AF
-:10C7500040000000000000000C000000B10020C0FC
-:10C760000A300A0C008B0324800B3002CC00A3009B
-:10C770006C000A30028D00830020C0183002820055
-:10C78000000000000000000000086400F800300015
-:10C790004CA00B2C02CF0022400EF503FC00CF0171
-:10C7A0003E000CF012DD02CF0233C04CF00B8003D0
-:10C7B0001000000000000000A419F000FC003F4041
-:10C7C0000FB103DC00BF013F000FF223FC10FF009C
-:10C7D0003F000FF001F484FF003DC04FF0136806E6
-:10C7E0007000000000000000C005FE40DF8033C87C
-:10C7F0000CF8033C0A9FC03FF008B8023E00FF80DF
-:10C800003FD80CF9612E406F903FE48FF1833000E8
-:10C8100070000000000000008010EC048B8023F00A
-:10C8200008B8023D40AB000E084822826C20BB00D5
-:10C830002FD048B0022C00BB002EC10BB002300438
-:10C8400030000000000000008805CC028301A0C574
-:10C8500008B04A4CA0802428C80932024C00B30812
-:10C860002ED129B23A0C84A3212CC84BB20A320132
-:10C870007000000000000000C015AC088B0022C052
-:10C8800008B0024C008821242109B0466C00BB0688
-:10C890002EC009B0022C10BB002EC00BB002300419
-:10C8A00060000000000000004015EC00CB0032C02A
-:10C8B0000CB9026C00CBC83AC02D900B2C08FB00C1
-:10C8C0003EC00D30422C00EB003EC00FB013000400
-:10C8D0007000000000000000E001BC00EF003DC05F
-:10C8E0000FF003BC06EF823F404EC983BC00FF003F
-:10C8F0007FC01CF0137C00FF043FC00FF003F80062
-:10C9000060000000000000004010AC00FB023EC0D0
-:10C910000EB003AC20D8403EC08C900B2C00FB0026
-:10C920003EC90DB033EC08FB023EC00FB00B5404FF
-:10C930002000000000000000C8052C00B3002FC03C
-:10C940000B3012FC0088A02E402894022C10BB044F
-:10C950002DC028B002EC00BB002EC00B72063200C6
-:10C960004000000000000000E0056C00B3002CE077
-:10C970000A1002CD0093002CC008B0024C00B30096
-:10C9800028C0083002CC00B3002CC00B30023A00A3
-:10C99000500000000000000020011E40B7802DE282
-:10C9A0000B5802DE0297812FA00868025E00B78153
-:10C9B0002FE0087902DE00B7812DE00B78023C0001
-:10C9C000400000000000000048080C00F3003CC0DC
-:10C9D0000E3203CC80D3003CC40C39034C08F31A4C
-:10C9E0003CC60D3003CE20F3083CC00F300352028A
-:10C9F0000000000000000000401DAC00FB002EC045
-:10CA00000BB003CC20EB003C800FB041AC00FB002E
-:10CA10003CC20FB003EC40FB003EC00F3003D00619
-:10CA20006000000000000000A805EE02C38030CEC8
-:10CA30000D9803ACA0C380B2C00FB003EC00FB00A4
-:10CA40003ED24FB0092E084B013EC024B003EA008D
-:10CA5000700000000000000048119C00870121C008
-:10CA60004850124C00870035C04B6002DC04B7010F
-:10CA70002DC00B70021C0087002DC10C7202F20445
-:10CA80006000000000000000C0009E00878023E0DE
-:10CA900008F802DE808F8121E04B7812DE043780B7
-:10CAA0002DE80BF8023E1887802FE0097902E0009C
-:10CAB00020000000000000004814CC008300A0C04B
-:10CAC0002830424C00830024C00B3806CC04B3004D
-:10CAD0002CC00B30020C0283002CC0083002D204A0
-:10CAE0003000000000000000E815A800CA003180F6
-:10CAF00008E0029802CE0033840BEA03E800BA0093
-:10CB00003F810FA0032800CA003E800DE003FA0415
-:10CB100060000000000000004800E000F8003E0057
-:10CB20000E8423A000F8003A100F8003E000F80004
-:10CB30003E100F8013E000F8003E000D8003D2008D
-:10CB400030000000000000000810E401F9003E4041
-:10CB50000C9A13E400C9003E400C9823E480F900CD
-:10CB60003E402C98036400F9003E400C9003C20440
-:10CB7000300000000000000080046404B9002E4072
-:10CB8000689C22E40289017C508D9822E480B920BF
-:10CB90002E5048100B2500B9442C40289000E0008E
-:10CBA000100000000000000018052400B9002E50FD
-:10CBB000089002E40489002E500A9202E400B900B1
-:10CBC0002C400891022400B9002E40089002C600B3
-:10CBD000400000000000000008040500B1012C40E6
-:10CBE000483002E40081002A404B1002C400B1002A
-:10CBF0000CC00890020C00B3002E40481202C20183
-:10CC00000000000000000000B80D6000B8013E0008
-:10CC10001C8007E150C8502E141E8503E141F850D6
-:10CC20003E140C85132148F8503E140C8543EE0346
-:10CC300050000000000000009819C400F9003E51A7
-:10CC40000F5003E500FD003F401DD003F410F90034
-:10CC50003E500F50009400F9003D400F9103E6064E
-:10CC600070000000000000001801E450CD003160A9
-:10CC700004D0033680C1422E501F9403E500E90220
-:10CC80002E720A90220508E9403E50409C0326007F
-:10CC900070000000000000003810C28288002215D9
-:10CCA000088002235888A02E280BAA42E28288809E
-:10CCB0002E382888022280B8A03A2808CD020E0417
-:10CCC00030000000000000000805C4008100A640FC
-:10CCD00028100A242695000D400B50027400850888
-:10CCE0002F4079D2AA1400A5012F4038500212011A
-:10CCF00070000000000000001815A4048900264000
-:10CD000008910224109D082F400BD002F4008D02E0
-:10CD10002F4009D0003400BD000B401870020604FB
-:10CD20006000000000000000A015C400C9053641E5
-:10CD30004C90632400D9003E400B90034408C90086
-:10CD40003E401510032400E9003C400C90032804E9
-:10CD500070000000000000002801A404F9003A401F
-:10CD60004F9803E400E9993E404F9003E420F90A0C
-:10CD70003E400E90436424F9083A420F908BDA004B
-:10CD800060000000000000002810A000C800120091
-:10CD90000C8043E000C84032000F8453E010F800DC
-:10CDA0003E000D80232000D8003E000F80030A04BF
-:10CDB0002000000000000000280538028200A18841
-:10CDC000086022C8008A4036A10BA002E910BA44CC
-:10CDD0002C800CA41229028A442E980BA4020A006B
-:10CDE000400000000000000028054C10830020E0F7
-:10CDF000183092C408934020E00B3002CD00B340BD
-:10CE00002CC00B3A42CD0083402CD00B38024A0094
-:10CE10005000000000000000A0411C00870021C05D
-:10CE2000287002D1009D8025C24B6002DC08B70249
-:10CE30002CC00A7402FE0087002DC00B340268006B
-:10CE40004000000000000000A8081E00C78431E078
-:10CE50000C6803D600978031A00F5813DE08F782C4
-:10CE60003DA00FF80BDE00C7803DE00F788B6A0213
-:10CE70000000000000000000081DAD80F3003EC16E
-:10CE80000FA023C002E9003E810F8003EC00FB00ED
-:10CE90003EC00DB0132C00EB003EC00FB003820269
-:10CEA00060000000000000000005FF32C780336012
-:10CEB0000F78033EC84E8023640CF8033A00CE80FE
-:10CEC00013EC06D8033A00DE8033A40CC803D0006C
-:10CED0007000000000000000A8119C00871001C035
-:10CEE0000B7002185084002B4408601298008613BF
-:10CEF00021C4885002188086002180086102EA045B
-:10CF0000600000000000000000009C00870021403D
-:10CF10000BF1025C800600210088D0025C008700D3
-:10CF200020898AF1021C0887102181884802C600E6
-:10CF300020000000000000002014CC108304A0C1D9
-:10CF40000B300A480C88066038080442EC018B0458
-:10CF500022C108300A2C008B002280002002D80455
-:10CF60003000000000000000A815BC00C3002280B3
-:10CF70008F9003640ACB02B2F2203512640AC90012
-:10CF8000B2400EA003240AC900A2402CA003EE0464
-:10CF900060000000000000008000EC00FB003C800E
-:10CFA0000F9003A500DB403ED04DB413A408FB0155
-:10CFB0003EC01CA0036C00FB043E504FA403E000E5
-:10CFC00030000000000000000110FC00FF0033C032
-:10CFD0000CE8432600DF80B3E00FF8037C00CD00AF
-:10CFE00033040CE0233440CD0023400CE003E00484
-:10CFF000300000000000000081046C10BB00A2D2D1
-:10D0000008280204608B1922C60EB18A2E408B902C
-:10D0100022C108A4822C008B90226448A402E00064
-:10D02000100000000000000080052C00BB00220062
-:10D0300008912E24009B0022C08BB012200488008F
-:10D040002240081022200088012AD0088042E000F7
-:10D05000400000000000000008040C00B304208021
-:10D060000810060410830020C08BB012000082005C
-:10D0700020C02810420906820028C0082002C201F0
-:10D080000000000000000000000D7C00BB003240EA
-:10D090002CB0032400D30032C05FB5030C02C100E2
-:10D0A000B2000CB00B0500C100B8C02C8013E00327
-:10D0B0005000000000000000A01DDC00FF001FC0A9
-:10D0C00087F001F400FF003FC00E7043FC107F00AA
-:10D0D0003FC00F7003FC00FF0037C00FE003E806FD
-:10D0E0007000000000000000C005F184FE6131D82E
-:10D0F0000CB2C3FCE0CC807BC00EF1037CE0CC839F
-:10D100003F200FF0CB3244DC843F254CF24330000B
-:10D1100070000000000000008010E448B01022DC25
-:10D1200008B602FD92888523F440F102ED00882DB7
-:10D130000E600BBC122C10A8822E000AFC22A00448
-:10D1400030000000000000008805C080B32228C025
-:10D15000083082CC0188002CC04A3202CC00010188
-:10D1600028004BB002A00080002C090834026201A4
-:10D170007000000000000000C015AC04B2102AC10D
-:10D1800008B002EC10898022C008B002EC088800C8
-:10D190002E4083B002A040B9802C210AB002F004D6
-:10D1A00060000000000000004015EC00FA00BAC06A
-:10D1B0002CB043EC00C0803EC08EB0034C0CC810B5
-:10D1C0003E808FB0038210D8823E280CB00B5004F2
-:10D1D0007000000000000000E001B680FD0237C1D1
-:10D1E0000FB003FC00FD003EC00FB053FC02FF0176
-:10D1F0002FA48BF0837C00AD022F40037003B80096
-:10D2000060000000000000004010AC00FB0432C0D1
-:10D210004CB0232C00F8403EC20CB0032C00FB4164
-:10D2200032C20FB0432D00C8503E400CB00B10046A
-:10D230002000000000000000C8052F90B95003C076
-:10D2400018F01A3C00B9322DE038F0603C04F900C7
-:10D250003EF00B7C802C00D9C02E400DF002320035
-:10D260004000000000000000E0054B24B21002C1A5
-:10D270002830026C04B2C12CC00830000C00B2008F
-:10D280002824033C0A000082C82CA0083002380081
-:10D29000500000000000000020011600B48021E4CE
-:10D2A000487B025E00B6806DE24879221E40AC8465
-:10D2B0002DE00BFA00524096802DE8193802080044
-:10D2C000400000000000000048080840F310B0C40F
-:10D2D000083A024C90F3103CCC0831030C49B040A2
-:10D2E00030050F3007214043013EC21C304312027B
-:10D2F0000000000000000000400DBC10FC103FC505
-:10D300000FF101BC04FF043FC40FB14BFC64F700F4
-:10D3100037C00F7253AC44FF013FC90FF403D0066E
-:10D320006000000000000000A805EC08FA003EE0E4
-:10D330000CB0032C00CB023ECA0FB2072E00DB025A
-:10D3400032080F31032C00CB043E800C35032A0039
-:10D35000700000000000000048119400B5002DC8C6
-:10D3600008700A1C2287002DC90BF2829C80A6003F
-:10D37000098B0B700A1C0285002D40087002920474
-:10D380006000000000000000C0009E00B7802CEC90
-:10D39000087B025E4085892DEC8B7B024E848F805A
-:10D3A00025640BFA02120897806FE1087A023000B8
-:10D3B00020000000000000004814CC20B3642CC002
-:10D3C0000830060C10838A6CC05B3042CC00AB1076
-:10D3D0002CF20B30020D0093042CD508300A920475
-:10D3E0003000000000000000E815BB00FEC03E80D9
-:10D3F0002CA0036800C6403F800FA0026800CE4406
-:10D4000036904F60031B70DED83FA00C20033A0417
-:10D4100060000000000000004800E040F8103E00FE
-:10D420000F8003A010F8423E101F8003A000E80CFC
-:10D430003A041F8003E000E8457E022F8003D200FB
-:10D44000300000000000000008106400E980324055
-:10D450000F900B0408D98036400F10132408F900F0
-:10D4600072700F91132410C9103E690C90030204CE
-:10D47000300000000000000080046408B9802240F1
-:10D480000B1002240089C422520B90422400B900E0
-:10D4900022E00B90122404D94A2E60089003600009
-:10D4A000100000000000000018052400B118224000
-:10D4B0000B900224008B2026490B90026400B900D7
-:10D4C000A2400B908A24008B002C40A890020600FA
-:10D4D000400000000000000008040484B120A048BF
-:10D4E0000B11060400830000404B11020449B110E7
-:10D4F00028400B1002244191002C500810024201D8
-:10D500000000000000000000B80D6940E85032142F
-:10D510000F869321E2C800360A0B868B61A8F8407B
-:10D5200022800F82A32108C8023E000C80432E03F4
-:10D530005000000000000000981DF448FD123E4419
-:10D540000F1203C4007D011E400B9203E480F520FE
-:10D5500036400F9003D4907D003D400F9403E606C3
-:10D5600070000000000000001801F6C1DD88327272
-:10D570000C98032622DD003F622C998346A0C94007
-:10D58000B2400FD8032400FD0033512CD88306008D
-:10D5900070000000000000003810E3C288C0223094
-:10D5A000088C4222118A012E00088852230080A391
-:10D5B0002A004B804222A0B80022280884028E0450
-:10D5C00030000000000000000805C400812D204844
-:10D5D000681480042081002E400B12120424812044
-:10D5E00020400B94320490B900204048104A0201B8
-:10D5F00070000000000000001815A40089202240DF
-:10D60000089012240089002E4008900224088940C6
-:10D6100022500BB0022420B909A2440890028604CB
-:10D620006000000000000000A015E400D908B2402E
-:10D630004C10230404D9C13E408F900B0408C14014
-:10D6400012400F90432404F14130780C90032804D9
-:10D65000700000000000000028018664F9803E4050
-:10D660000F900BE400F9983E402F1003A402F9102C
-:10D670003E400F900BE640F9903E600F9003CA00C9
-:10D6800060000000000000002810A000C841320027
-:10D690000C80072010C8103E0C0E8003E004C80068
-:10D6A000BA000F81432000F8703E000F000B0A04FF
-:10D6B0002000000000000000280539028E20A38011
-:10D6C00028E00A3810AE043DA18EE002F8008E007A
-:10D6D00076800B60037800BE402F820BA003CA0047
-:10D6E000400000000000000028054D008B8822C08B
-:10D6F0001830020C0083442CD01B3012CC0683005F
-:10D7000020C10B30820C01B3002C400B30020A0008
-:10D710005000000000000000A0011C00850020CC8B
-:10D720000870061C84A70129C00B7222DC80873494
-:10D7300061800B10025C00B7002DC00B7002E80086
-:10D740004000000000000000A8080E008C8031E0BE
-:10D750000CFE023F00C5802DE00E7803DFA0C7A0BD
-:10D7600021600F78031E80F7803DE00F78032A02C6
-:10D770000000000000000000081DAC00F9003EC0E1
-:10D780000FB003EC00FA003EC006B003EC80FB28AB
-:10D7900036D84FA003EC10FA003E500F3003C206FB
-:10D7A00060000000000000000005FA00CC80B3E03B
-:10D7B0000FF8033E00CF903F604FF8C33E00EF806C
-:10D7C00033F00C7A033E70C59033F10C78030000FF
-:10D7D0007000000000000000A811B800870021C000
-:10D7E0000B704A1C0087102DC04B710A3C448F12ED
-:10D7F00021860D72021E008700234008700A2A0449
-:10D80000600000000000000000009C00840025C0B3
-:10D810000B710A0C00A7122D840B700A1C00B708AC
-:10D82000234009F31A5C869708254008700200001F
-:10D8300020000000000000002014CC20812026C021
-:10D840000B30022C0082422C800B30220C089B8073
-:10D8500020E00920024D08920024E508300A08045F
-:10D860003000000000000000A815AE82CAE0B7C07A
-:10D870000FF0133C0AC9C83E400FF0033C04FF847C
-:10D8800032C00D90137C00D900F6C02C10032A047E
-:10D8900060000000000000008000E400F3003AC1D6
-:10D8A0004FB003EC00F9083C000F3013EC00EB0420
-:10D8B000BE180F9023AC60E9023A404F9003E0009D
-:10D8C00030000000000000000110FC00CA0033C05E
-:10D8D0000CF003FC00CD027F400CF0423C00CF086E
-:10D8E00037100FD003FC10CD083F662CD90300443D
-:10D8F0003000000000000000810463808BE022C043
-:10D9000008B022EC00D8806E2068B01A2C01FB0011
-:10D9100022180B88434C0088A02CC01D9002204088
-:10D920001000000000000000800108808B2022C051
-:10D9300008B022EC0088882E6248B01ACC008B0018
-:10D9400026C04A8802EC0008842E4009900220007C
-:10D95000400000000000000008040000830060C0D8
-:10D96000083002CC0090066C000830028C00A30442
-:10D9700020008B00064C2180006CC049100A020177
-:10D980000000000000000000000D6C00CA00B2C1E1
-:10D9900088B403EC10C8002E000CB00BBC088F003C
-:10D9A0003600068003EC80C8023FC10C90030003E0
-:10D9B0005000000000000000A01DF000FF003FC06C
-:10D9C0000F7283FC18FC033F008F70037C00FF0084
-:10D9D0003D000FC0238C06FC003F400ED003E8063C
-:10D9E000700000000000000000C541037040DC1022
-:10D9F00037040DC1037040DC1037040DC1017040C5
-:10DA00009C10171405C1037040DC1017040DC031C1
-:10DA1000000000000000000000C5440571015C40EA
-:10DA2000571015C40521015C40571015C401710140
-:10DA30005C40171005C40571055C41571015C011F5
-:10DA400050000000000000000080020120804820FB
-:10DA500012080482012080482012080482012080DC
-:10DA600048201208048201208048201208048020E7
-:10DA7000000000000000000000800000600058006E
-:10DA80001600058001600058001600058005600042
-:10DA900058001618018001600058005600058020CB
-:10DAA000000000000000000000C5480522011C80A5
-:10DAB000472011C80472015C80572011C8047241CC
-:10DAC0005C80572011C80472011C80472015C031AA
-:10DAD000500000000000000000C540006000180079
-:10DAE0000600018000600018000600018000600050
-:10DAF0001800060001800060001800060001803157
-:10DB0000000000000000000000C548042201088059
-:10DB10004220108804220108804220108004230142
-:10DB20000880422010880422010800422010802131
-:10DB3000000000000000000000C54A05428150A01E
-:10DB4000442C110B04428110E05428110200428140
-:10DB500010A04438110B0542811021142815003102
-:10DB6000500000000000000000800C01570054C06D
-:10DB70001530044C01130054C01570054C015300BE
-:10DB800054C01530854C01130054C0153005402198
-:10DB90004000000000000000008000004000100075
-:10DBA000040000400010001062040001080441005D
-:10DBB0001000441811000010001080040001012022
-:10DBC0000000000000000000004560020800820024
-:10DBD00020800860021800820020800820000820B1
-:10DBE000820000808020021800820020800801311D
-:10DBF000500000000000000000C54005640158000E
-:10DC000056001580056001580056401580056001DA
-:10DC100058005600158005600158007600158031C7
-:10DC2000000000000000000000C540036000D800B4
-:10DC300036000D80036000980036001D88056000E6
-:10DC4000D80016000D80036000D88046000D80319A
-:10DC5000000000000000000000C5420430810C20DC
-:10DC6000430810C20430810C22410818C2043089D4
-:10DC70000C20030810C20430810C20430810C0108F
-:10DC800050000000000000000080000030000C0088
-:10DC9000030000C00030000C00030000C000300092
-:10DCA0000C00030000C00030000C00030000C001A5
-:10DCB00000000000000000000080020130804C20C5
-:10DCC000130804C20130804C20130804C3013080C3
-:10DCD0004C20130804C20130804C30130804C021CA
-:10DCE000000000000000000000C5420560815820CF
-:10DCF0005608118205608158205608118300608102
-:10DD0000582046081182046081183056081580306A
-:10DD1000500000000000000000C5420020800820E4
-:10DD20000208008200208008200208008200308063
-:10DD300008200200008200208008200308008031B3
-:10DD4000000000000000000000C5420460811820AF
-:10DD500046481192046081192046281182003481BE
-:10DD60001820464811920460811820430811801140
-:10DD7000000000000000000000C5600458015600CB
-:10DD80005580156004580116005580016004180183
-:10DD90005600458011600458011600418011403141
-:10DDA000500000000000000000800601418050602B
-:10DDB00014180506014180506004180506004180D2
-:10DDC00010601418050601418050601418050020E9
-:10DDD0000000000000000000000002010080402060
-:10DDE0001048041201008041201008040201048040
-:10DDF00040205048041201008440201008040020F4
-:10DE0000000000000000000000C546035180D460FF
-:10DE100030180D46035180D56035180D4603058036
-:10DE2000D46015180D46031180D46035180D4031AB
-:10DE3000500000000000000000C5460571805C60D5
-:10DE4000971815C60571815C20571815C603708197
-:10DE50005C60571811C60531815C60771815C031B8
-:10DE60000000000000000000004546037180DC60F7
-:10DE700037180DC6037180DD60371805C60175813E
-:10DE8000DC6037180DC60371845C60171819C01167
-:10DE900000000000000000000045460571815C6044
-:10DEA000571814860571815C60571805C6043181C6
-:10DEB0005C60571815C60571805C60431815C01169
-:10DEC00050000000000000000000020120804820F7
-:10DED0001208048201208048201208048201708008
-:10DEE000482012080482012080482017080480007E
-:10DEF0000000000000000000000006016180586082
-:10DF0000161841860161801860063C058604618010
-:10DF10001860161801860061805860561815801028
-:10DF200000000000000000000045400570015C009A
-:10DF3000570015C00470015C00570010C004700049
-:10DF40001C00470011C00470015C00470001C011B3
-:10DF500050000000000000000045420060801820D2
-:10DF60000608018200608018200608008200608098
-:10DF70001820060801820060801820060801801120
-:10DF8000400000000000000000054204208108203D
-:10DF90004208108204208108204208118204208057
-:10DFA00008204208108204208108204208008011C5
-:10DFB00000000000000000000045420540815020A4
-:10DFC000540815020540811020540C154200408170
-:10DFD000502044081102054081102014080500114A
-:10DFE00050000000000000000001030150C0543048
-:10DFF000150805420150C05430150C05430150C0AE
-:10E000005430150C05420150C05430150C05401019
-:10E010000000000000000000000008004200108026
-:10E0200004200188006200108004001108004200F2
-:10E03000108004200108004201108004200100002B
-:10E040000000000000000000004542020080802027
-:10E050002008080202208080202028000202008080
-:10E060008020200A080202008000202008080011F9
-:10E07000500000000000000000454005600158000D
-:10E08000560005800560015808560015800760029B
-:10E090005800564015800560031800760015801161
-:10E0A000000000000000000000C540036000D80030
-:10E0B00036000D80016000D80A36000D8005700919
-:10E0C000D80136000D80036000D80057000D800095
-:10E0D00000000000000000000000000430010C00FF
-:10E0E000430010C00030010C00432010C004600148
-:10E0F0000C00434050C10430010C00460010C00029
-:10E1000000000000000000000000000030000C00D3
-:10E11000010000C00030000C00030000D00020000F
-:10E120000C00034000C00030000D00020000C000E1
-:10E1300000000000000000000000050131404C50CC
-:10E14000131004C40131404C50131404C511314163
-:10E150004C50131404C50131404C50131404C0003A
-:10E1600000000000000000000000230568C15A30D4
-:10E17000568C11A30468C11A30568C11A30568C0CF
-:10E180005A30468C11A30468C15A30168C15800091
-:10E190000000000000000000000000002000080057
-:10E1A00002000080002000080002200090002000F3
-:10E1B00008000240008000200009000200008000EA
-:10E1C0000000000000000000000008446201188404
-:10E1D0004621118844621118844601118844621056
-:10E1E0001884462111884462111884062111800088
-:10E1F0000000000000000000000000455011540421
-:10E200005501114045501114004501114044500082
-:10E2100014044500154044501114045501114000E8
-:10E2200000000000000000000000082142085082A9
-:10E2300014208508214208508204208508214208C4
-:10E2400050821420050821420850821420850000C5
-:10E25000000000000000000000000A01028040A051
-:10E260001028040A01028040A01028400A01028000
-:10E2700040A01028440A01028040A0102804000099
-:10E28000000000000000000000000C035300D4C098
-:10E2900035300D4C015300D4C035100C4C035300E5
-:10E2A000D4C035300D4C035300D4C035300D400080
-:10E2B00000000000000000000000080572015C8002
-:10E2C000172005C80672015C80572015C80272012C
-:10E2D0005C80572015C80572015C80372011C00092
-:10E2E00000000000000000000000231840C61231AA
-:10E2F000848C21230848C61230840C61231048C244
-:10E300001231848C01230848C61231048C6100004C
-:10E31000000000000000000000003FFF4FFFD3FF9F
-:10E32000F4FFFD3FFF4FFFD3FFF4FFFD3FFF4FFF23
-:10E33000D3FFF4FFFD3FFF4FFFD3FFF4FFFD0000CD
-:10E3400000000000000000000000000000000000CD
-:10E3500000000000000000000000000000000000BD
-:10E3600000000000000000000000000000000000AD
-:10E37000000000000000000000002CDB0FB6C2CD42
-:10E38000B0B36C2CDB0B36C2DFB0B36C2CDB0B7E76
-:10E39000C2CDB0B7FD2CDB0B36C2CDB0B36C0000E4
-:10E3A00000000000000000000000333C4FCF13339A
-:10E3B000C4CCF1333C4CCF133FC4CCF1333C4CFFC5
-:10E3C0001333C4CFFD333C4CCF1333C4CCF1000026
-:10E3D000000000000000000000003B7E4EDF93B70D
-:10E3E000E4EC793B1E4EDF93BFE48DF93B784EFFA2
-:10E3F00093B7E4EDFD3B1E4EDF93B784EDF90000CB
-:10E4000000000000000000000000010270409C10AD
-:10E41000271C09C10130401C10670409C10270416A
-:10E420009C11071401C10270409C50071C01C000E0
-:10E4300000000000000000000000040571015C40C5
-:10E44000571055C40131005C40571015C4057101C7
-:10E45000DC4017181DC40571055C4057101DC00035
-:10E4600000000000000000000000020120804820A1
-:10E4700012000482012080482012080482012080BA
-:10E48000482012080482012080486012080480009D
-:10E490000000000000000000000000006000180004
-:10E4A0000600418000600018004600018000600006
-:10E4B0001000061001800060001820461001800046
-:10E4C00000000000000000000000080472011C8031
-:10E4D000472011C80472011C80072011C804730072
-:10E4E0001C80472011CC0472011C80472011C00001
-:10E4F00000000000000000000000000060001800A4
-:10E5000006000184006000180006000180006040E1
-:10E510001800060401810060001800061401800044
-:10E520000000000000000000000008042201088034
-:10E530004270108C04220108C002201088042200BE
-:10E540000880425010080422010900424010800057
-:10E55000000000000000000000002E044A8112A00C
-:10E5600044A8112A044A8112A004A8112A044B804D
-:10E5700012A04488012E044A811220049801000050
-:10E58000000000000000000008C00E00530014C08E
-:10E590000530014C00530014E00530014C005300DD
-:10E5A00004C00530004C00030014C00530004010CA
-:10E5B000000000000000000008C00400400010003F
-:10E5C0000458010400400010000400010000410054
-:10E5D00004004458104400000011800450104030E2
-:10E5E000000000000000000008C0400200008000A1
-:10E5F0002000080040000000002000080002000089
-:10E600008400000008400200008000200008403024
-:10E61000000000000000000008C040006001180079
-:10E6200046000180066001980046001180046001E8
-:10E630001800460011800420011800660011803087
-:10E640000000000000000000100140006000980081
-:10E6500026000980026001980006000C800260001C
-:10E660001800060001800260009880060001820008
-:10E6700000000000000000004045420030810C20F6
-:10E68000430810C22430818C20030810C20420806B
-:10E690000C20030818C20430810C20430818C01154
-:10E6A00050000000000000004000000030000C009E
-:10E6B000030000C04030000C000300008000300068
-:10E6C0000C00032000C00030000C00032000C0003C
-:10E6D00000000000000000004001021030800C200B
-:10E6E000030800C20030800C20030800C201208013
-:10E6F0000C20032C00C20030800C30432C00C000E2
-:10E7000040000000000000004045420460811820E5
-:10E710004608118204608018204608118204608136
-:10E720001820460C11C20460811830460C11C0112B
-:10E73000500000000000000040014200208008203E
-:10E740000228008200208008200208008200208029
-:10E7500008200208018200208008200308018000B0
-:10E7600000000000000000005001420460811820F9
-:10E7700046281182046080182046081182046081B6
-:10E780001820460810820460811820430810800079
-:10E79000000000000000000040454004500114004B
-:10E7A00045001140250000140045001140045001AF
-:10E7B00014004500004004500140000100004211D7
-:10E7C000500000000000000048000600418010607A
-:10E7D0000418010600418010600418010600418001
-:10E7E0001060041801060041801060041801000048
-:10E7F00000000000000000004800020500804021E9
-:10E80000100804000100804020100804020100806C
-:10E810004020500814021100844020100814000009
-:10E820000000000000000000404546015180D46017
-:10E8300035180D46035180D46015180D46035180DC
-:10E84000546015180D46035180D46035180D4011E1
-:10E8500050000000000000000001460471811C60AF
-:10E86000451811D60471811C60671811C6047181A6
-:10E870009C60471811C60471811C60671811C000A4
-:10E8800000000000000000004005460271809C600E
-:10E89000271809C60071809C60671809C60271803C
-:10E8A0009C61271801C60271809C60071801C00096
-:10E8B00000000000000000005045460571815C60CA
-:10E8C000571855D60171815C60571815C6057181BE
-:10E8D0005C60571818C60571815C60431818821176
-:10E8E0005000000000000000400452012080482039
-:10E8F00012480490012080492012080482012480DB
-:10E9000048201248009201208048201748048001C6
-:10E910000000000000000000400006006180186058
-:10E92000063C0186006180186046180186006180FF
-:10E930001860061801860061801860461801800181
-:10E9400000000000000000000041600478011E008B
-:10E95000478011E02478011E00078011E00478014F
-:10E960001E00478011E00438011E00478011C011CD
-:10E9700050000000000000004001120060801820DC
-:10E980000648019200608019200608018200648018
-:10E9900018200648019300208018200648018000B6
-:10E9A0000000000000000000400142042081082017
-:10E9B000420810820420810820020810820420816D
-:10E9C00008204208108A0460810820420810800054
-:10E9D000000000000000000040454204408110207B
-:10E9E00044081102044081102004081102044081EF
-:10E9F0001021440801020450811020040801001174
-:10EA000050000000000000004000030050C014301F
-:10EA1000050C01430050C01430050C014300508028
-:10EA200014300508014A0050C014300508014000A8
-:10EA300000000000000000004000080042001080BC
-:10EA40000420010800420010800420010800420058
-:10EA500010800420110000420010800420110010DA
-:10EA6000400000000000000040454202008080207D
-:10EA70002008080200008080202008080202008090
-:10EA80008020200808020200808020200808001151
-:10EA9000500000000000000040014000600118002C
-:10EAA00046001180066001180046001180046001D4
-:10EAB00018004600118004600118006600118010E3
-:10EAC00000000000000000004001400264009800C7
-:10EAD0002600099006600198002640098002600027
-:10EAE0009800260000900260009800070001800056
-:10EAF00000000000000000004045600438050E00E2
-:10EB0000438010E04438010E00438010E0043801D7
-:10EB10000E00438018A00438010E004680188011B2
-:10EB200050000000000000005000010030400C10B8
-:10EB3000030400C50030400C10031400C100304035
-:10EB40000C10030400874030400C100204008000C9
-:10EB500000000000000000004004050035400C509B
-:10EB6000031400D50431410C50035C00C500310092
-:10EB70000C50031000940031400C50431000C200B0
-:10EB800000000000000000004045430520C118308F
-:10EB9000460C11970060C01830461C11830460C1F8
-:10EBA0001830520C11870460C11830460C118011C6
-:10EBB000500000000000000040010000214008005B
-:10EBC00002000080002000080002000080002000F9
-:10EBD0000800020000800020000800020000800001
-:10EBE0000000000000000000400148442201188499
-:10EBF0004621119800621018844420118844621143
-:10EC00001884422111804462111884462111800029
-:10EC100000000000000000004045400450111404B2
-:10EC2000450011410050101400450111404450119D
-:10EC30001404450101404450111404050101401120
-:10EC40005000000000000000400008204208108230
-:10EC50000420010820420810820420810820420874
-:10EC6000108204228108205208108A0422810000A8
-:10EC7000000000000000000000040A01028440A11E
-:10EC80001028000A01028040A01028040A01028016
-:10EC900040A0102C140A00028040B0102C14000078
-:10ECA000000000000000000040454D035340D4D058
-:10ECB00035300C4D035340D4D035340D4D03534003
-:10ECC000D4D035340D4D021340D4D035340D40111D
-:10ECD00050000000000000004001080472011C8088
-:10ECE000472015C80472011C80472011C804721106
-:10ECF0001C80472611C84472011C90672611C00071
-:10ED000000000000000000000000230840C612318F
-:10ED1000848C01030848C61230840C61231848C251
-:10ED20001231848C01030848C61231048C010000A2
-:10ED3000000000000000000000003FFF4FFFD3FF75
-:10ED4000F4FFFD3FFF4FFFD3FFF4FFFD3FFF4FFFF9
-:10ED5000D3FFF4FFFD3FFF4FFFD3FFF4FFFD0000A3
-:10ED600000000000000000000000000000000000A3
-:10ED70000000000000000000000000000000000093
-:10ED80000000000000000000000000000000000083
-:10ED9000000000000000000000002DFB0FB6C2CDF7
-:10EDA000B0B7FD3FFB0B36C2DFB0FB6C2CDB0B7E3C
-:10EDB000C2CDB0B7FD3FFB0B36C2CDF4B7FD0000AE
-:10EDC0000000000000000000000033FC4FCF1333B0
-:10EDD000C4CFFD3FFC4CCF133FC4FCF1333C4CFF90
-:10EDE0001333C4CFFD3FFC4CCF1333F4CFFD0000F1
-:10EDF000000000000000000000003B7E4EDF93B7E3
-:10EE0000E4EDF93FFE4EDF93B7E4EDF93B7E4EC7EC
-:10EE100093B7E4EC61231E4EDF93B784EC610000EE
-:10EE20000000000000000000000000C524A14A24EA
-:10EE3000630114024400810B2871021082403811D2
-:10EE4000410450081882873831C32C520A10000040
-:10EE5000000000000000000000000845128144800E
-:10EE600071211C0A071A8102A0522014480712813E
-:10EE7000C680602008884702014A80702010000088
-:10EE80000000000000000000000002C52C014A0044
-:10EE900052091C800724210808710210804520A116
-:10EEA0004928520114C0450091C4007202100000AC
-:10EEB0000000000000000000000002072001C10067
-:10EEC0007109108007000101007008188007000117
-:10EED000892052010C8046308145046000100000FA
-:10EEE0000000000000000000000008C202200088AE
-:10EEF00020220008C22280408802220008820AA044
-:10EF00000CA802220008800A00808C022200000067
-:10EF10000000000000000000080002430000402044
-:10EF200030080440413010C8000000000203001007
-:10EF3000C000110800C2431080C020010800020078
-:10EF40000000000000000000080008C30A20C18C77
-:10EF500012220488013620C3081228040801040084
-:10EF60004AA8220104C8412630C0880221000200BC
-:10EF70000000000000000000080008000A10C18026
-:10EF800032210C88430280448012290408420A90EE
-:10EF90008A8000200448030A1082800020000200BA
-:10EFA000000000000000000000000A8702A180AC01
-:10EFB0004329148A8402A100AC412010080626319E
-:10EFC00080A46020144A44328181AC602A18020077
-:10EFD0000000000000000000080008072201C580B2
-:10EFE00073211CC8072A010C807220104847261183
-:10EFF000C58073201C88072A1149807020140200E4
-:10F000000000000000000000080000451031C90C9D
-:10F0100073021CC04704010A0C510A1082472031B8
-:10F02000C80072021C40053011C4007201180200B1
-:10F030000000000000000000081010062401450434
-:10F04000518118904714010404718810120534018D
-:10F050004404514018D0073801C404520114C204BA
-:10F060000000000000000000000000870021890C63
-:10F0700060011CD0452401C10C42010000C52031B3
-:10F08000410840001880450021410C70421CC2001C
-:10F090000000000000000000000002011C80C420ED
-:10F0A00031081042420880C62031090020031C901C
-:10F0B000C42001490C424310804420310810000054
-:10F0C0000000000000000000000030832030480CE9
-:10F0D00032401090812420C80432401020C3208088
-:10F0E000C800024A0CA0012410C8083241100000D8
-:10F0F0000000000000000000001090030000C904A0
-:10F10000304000900020008000104010004020108F
-:10F11000C20000800820430810810032400CC00467
-:10F12000200000000000000000003000400000004F
-:10F13000100000F01020000000100000F0108040CF
-:10F140000000004000F01090800000000000C000AF
-:10F1500000000000000000003C3C108090400000D7
-:10F1600000801090A09000000000001090808000AF
-:10F1700000000000109080900000000040108F0FF1
-:10F180000000000000000000000024C6BA06C01CF9
-:10F19000492861142B1C0E403FD9BFD9AABC1A5F65
-:10F1A0000010A6503B61B325BC4019BFFFE98000A9
-:10F1B0000000000000000000000010921494800C79
-:10F1C000073F2B948614848028000049140486127B
-:10F1D0008000412734D0908492002D8A211E800027
-:10F1E000000000000000000000000000000008A275
-:10F1F000B10101000000000884B17828000000007F
-:10F2000008B13214140000000008A8235421400063
-:10F21000000000000000000000003FFFFFFFC000F2
-:10F220000000002FFFFEF7C0000000002FD7FEEF08
-:10F23000C0000000003FFF7FFFC000000000000092
-:10F24000000000000000000000003FFFFFFFC000C2
-:10F250000000000FEF77FFC0000000003EFFFEEF50
-:10F2600040000000003FFFBFFF4000000000000022
-:10F27000000000000000000000003FFFFFFFC00092
-:10F280000000003FFFDFFFC0000000003FFFFFFF66
-:10F29000C0000000003F7F2FFFC000000000000002
-:10F2A000000000000000000000003FFFFFFFC00062
-:10F2B0000000001FFFFFEFC0000000001FEFEFEF96
-:10F2C000C0000000002FFFFFFFC000000000000092
-:10F2D000000000000000000000003FFFFFFFC00032
-:10F2E0000000003FFFEFFFC0000000002FAFDFFF76
-:10F2F000C0000000003FEFFFF7C00000000000006A
-:10F30000000000000000000000003FFFFFFFC00001
-:10F310000000003FDFDFFFC0000000003FFFFFFFF5
-:10F32000C0000000001FFFDFFFC000000000000061
-:10F330000000000000000000000002C424A1002C16
-:10F34000520B18C2862CA18038620A0840C42CA136
-:10F350000828420B14008514A10828430A10000055
-:10F3600000000000000000000000080412010380FB
-:10F3700061201008071241428070201C08041A0105
-:10F3800084814020180846368105806320100001E2
-:10F390008000000000000000000000842421000C18
-:10F3A00052021400872821810872061C82842021C1
-:10F3B0004818420354804530254A18530210000172
-:10F3C000200000000000000000000804220101806D
-:10F3D000422018C8442201808442201C8804220153
-:10F3E0000080402010884436014080410010000019
-:10F3F0000000000000000000000000C00820000C19
-:10F4000022030440810020840803000080C2002001
-:10F41000C408000308888216A040883222800000B9
-:10F42000000000000000000008000201008004202D
-:10F4300010080CC2121084C82212080402030088AB
-:10F440000021000C0C404130008420100800020014
-:10F450000000000000000000080008820620088C60
-:10F4600032220C888126204D882322808883062022
-:10F4700008880023048A8136204B8832220000004D
-:10F4800000000000000000000800080202000980DF
-:10F49000322004886022008984002008980002003D
-:10F4A000008000200008023A8048803020000200DE
-:10F4B000000000000000000008000AC41AA180A893
-:10F4C000412A10CAC71AA104AD712A184AD406B13C
-:10F4D00000A8712A100884262906AC522A100200BE
-:10F4E0000000000000000000080008042A0141801C
-:10F4F00042201C00040A01098451201C8844020196
-:10F5000008804020104A4702014880632010020012
-:10F510008000000000000000080000C41021810CE1
-:10F5200041020C00C020610D0E72021C40C4083163
-:10F530000418420210808720B1C40C53021000004E
-:10F540000000000000000000081020072401CC008B
-:10F55000724014000424010800734110C0073011E8
-:10F56000CC007101100204208146104240100204B8
-:10F570000000000000000000080000C51021000885
-:10F5800062021C90C52421000C70821C10C4203122
-:10F59000880240061C008500A1000C4042000200C9
-:10F5A000000000000000000000002205148001207F
-:10F5B00030080C42060080012451080C02410080F2
-:10F5C0004C2000080C304204000420000800000019
-:10F5D0000000000000000000000010C62420000C05
-:10F5E00032C20480C73020000C53C20410C22870FD
-:10F5F0000C0902024C80810430090C024210000008
-:10F60000000000000000000000108001380002002F
-:10F6100012400C200734040200630108100024107B
-:10F620000400020104820108800910024010000455
-:10F6300030000000000000000000302010800000BA
-:10F64000208000F02010800000208000D08000008A
-:10F650004000000000301000800000000000CC409E
-:10F6600000000000000000003C3C10808000000012
-:10F67000000010908080000000000010908000903A
-:10F68000800010000010A0800000002000108C08F6
-:10F6900000000000000000000000341ABE178000C7
-:10F6A0003E40266FBAE32480001659BD828182D87D
-:10F6B000800000199986806480C03FD9998000013C
-:10F6C000F000000000000000000006160294001682
-:10F6D000C01694829016108021182828020A020869
-:10F6E00080000000000282801400011411A040007C
-:10F6F000000000000000000000000000000008847E
-:10F700000284A8800000000891228441A2082401FC
-:10F7100030000000000000000008840144010000E7
-:10F72000000000000000000000003FFFFFFFC000DD
-:10F730000000003EF7FFF7C0000000002FE7B7FF12
-:10F74000C0000000002FFE7FF7C000000000000096
-:10F75000000000000000000000003FFFFFFFC000AD
-:10F7600000000036BFFEDFC0000000000FF7DFFF23
-:10F77000C0000000003DB7B7EFC00000000000006F
-:10F78000000000000000000000003FFFFFFFC0007D
-:10F790000000001FDFDFFFC0000000000FDFDFFF01
-:10F7A000C0000000003FEFFFFFC0000000000000AD
-:10F7B000000000000000000000003FFFFFFFC0004D
-:10F7C0000000003FBF7FFFC0000000003FFF7FF749
-:10F7D000C0000000003FDFFFFFC00000000000008D
-:10F7E000000000000000000000003FFFFFFFC0001D
-:10F7F0000000003F7EFFFF40000000003FFEFFFFD3
-:10F80000C0000000003FFFFFFFC00000000000003C
-:10F81000000000000000000000003FFFFFFFC000EC
-:10F8200000000037FF6FFFC0000000003FFFFFFF38
-:10F83000C0000000003FFFFFFFC00000000000000C
-:10F8400000000000000000000000000000000000B8
-:10F8500000000000000000000000000000000000A8
-:10F860000000000000000000000000000000000098
-:10F870000000000000000000300020010200000035
-:10F880003000430C000000000000000000000000F9
-:10F890000000000000000000000000000000000068
-:10F8A0000000000000000000000000000000000058
-:10F8B0000000000000000000000000000000000048
-:10F8C0000000000000000000000000000000000038
-:10F8D0000000000000000000000000000000000028
-:10F8E0000000000000000000000000000000000018
-:10F8F00000000000000000000030C00000000030E8
-:10F90000C000000000000000000000000000000037
-:10F9100000000000000000000000000000000000E7
-:10F9200000000000000000000000000000000000D7
-:10F9300000000000000000000000000000000000C7
-:10F9400000000000000000000000000000000000B7
-:10F95000000000000000000000000030C030C000C7
-:10F960000000000000000000000000000000000097
-:10F970000000000000000000000000000000000087
-:10F980000000000000000000000000000000000077
-:10F990000000000000000000000000000000000067
-:10F9A0000000000000000000000000000000000057
-:10F9B00000000000000000000030C030C030C03047
-:10F9C000C000000000000000000000000000000077
-:10F9D0000000000000000000000000000000000027
-:10F9E0000000000000000000000000000000000017
-:10F9F0000000000000000000000000000000000007
-:10FA000000000000000000000000000000000000F6
-:10FA10000000000000000000000F00000000000FC8
-:10FA200000000000000000000000000000000000D6
-:10FA300000000000000000000000000000000000C6
-:10FA400000000000000000000000000000000000B6
-:10FA500000000000000000000000000000000000A6
-:10FA60000000000000000000000000000000000096
-:10FA70000000000000000000003FC0000000003F48
-:10FA8000C0000000000000000000000000000000B6
-:10FA90000000000000000000000000000000000066
-:10FAA0000000000000000000000000000000000056
-:10FAB0000000000000000000000000000000000046
-:10FAC0000000000000000000000000000000000036
-:10FAD0000000000000000000000F0030C030C00F28
-:10FAE0000000000000000000000000000000000016
-:10FAF0000000000000000000000000000000000006
-:10FB000000000000000000000000000000000000F5
-:10FB100000000000000000000000000000000000E5
-:10FB200000000000000000000000000000000000D5
-:10FB3000000000000000000000136B00C000CF2C8C
-:10FB40004000000000000000000000000000000075
-:10FB500000000000000000000000000000000000A5
-:10FB60000000000000000000000000000000000095
-:10FB70000000000000000000000000000000000085
-:10FB80000000000000000000000000000000000075
-:10FB900000000000000000000000000F000F000047
-:10FBA0000000000000000000000000000000000055
-:10FBB0000000000000000000000000000000000045
-:10FBC0000000000000000000000000000000000035
-:10FBD0000000000000000000000000000000000025
-:10FBE0000000000000000000000000000000000015
-:10FBF00000000000000000000030C00F000F0030C7
-:10FC0000C000000000000000000000000000000034
-:10FC100000000000000000000000000000000000E4
-:10FC200000000000000000000000000000000000D4
-:10FC300000000000000000000000000000000000C4
-:10FC400000000000000000000000000000000000B4
-:10FC500000000000000000000000003FC03FC000A6
-:10FC60000000000000000000000000000000000094
-:10FC70000000000000000000000000000000000084
-:10FC80000000000000000000000000000000000074
-:10FC90000000000000000000000000000000000064
-:10FCA0000000000000000000000000000000000054
-:10FCB00000000000000000000030C03FC03FC03026
-:10FCC000C000000000000000000000000000000074
-:10FCD0000000000000000000000000000000000024
-:10FCE0000000000000000000000000000000000014
-:10FCF0000000000000000000000000000000000004
-:10FD000000000000000000000000000000000000F3
-:10FD10000000000000000000000F000F000F000FA7
-:10FD200000000000000000000000000000000000D3
-:10FD300000000000000000000000000000000000C3
-:10FD400000000000000000000000000000000000B3
-:10FD500000000000000000000000000000000000A3
-:10FD60000000000000000000000000000000000093
-:10FD70000000000000000000003FC00F000F003F27
-:10FD8000C0000000000000000000000000000000B3
-:10FD90000000000000000000000000000000000063
-:10FDA0000000000000000000000000000000000053
-:10FDB0000000000000000000000000000000000043
-:10FDC0000000000000000000000000000000000033
-:10FDD0000000000000000000000F003FC03FC00F07
-:10FDE0000000000000000000000000000000000013
-:10FDF0000000000000000000000000000000000003
-:10FE000000000000000000000000000000000000F2
-:10FE100000000000000000000000000000000000E2
-:10FE200000000000000000000000000000000000D2
-:10FE3000000000000000000006335D80C000FDAC43
-:10FE400002000000000000000000000000000000B0
-:10FE500000000000000000000000000000000000A2
-:10FE60000000000000000000000000000000000092
-:10FE70000000000000000000000000000000000082
-:10FE80000000000000000000000000000000000072
-:10FE90000000000000000000000000000000000062
-:10FEA0000000000000000000000000000000000052
-:10FEB0000000000000000000000000000000000042
-:10FEC0000000000000000000000000000000000032
-:10FED0000000000000000000000000000000000022
-:10FEE0000000000000000000000000000000000012
-:10FEF00000000000000000000030C00000000030E2
-:10FF0000C000000000000000000000000000000031
-:10FF100000000000000000000000000000000000E1
-:10FF200000000000000000000000000000000000D1
-:10FF300000000000000000000000000000000000C1
-:10FF400000000000000000000000000000000000B1
-:10FF5000000000000000000000000030C030C000C1
-:10FF60000000000000000000000000000000000091
-:10FF70000000000000000000000000000000000081
-:10FF80000000000000000000000000000000000071
-:10FF90000000000000000000000000000000000061
-:10FFA0000000000000000000000000000000000051
-:10FFB00000000000000000000030C030C030C03041
-:10FFC000C000000000000000000000000000000071
-:10FFD0000000000000000000000000000000000021
-:10FFE0000000000000000000000000000000000011
-:10FFF0000000000000000000000000000000000001
-:108010000000000000000000000000000000000060
-:108020000000000000000000000F00000000000F32
-:108030000000000000000000000000000000000040
-:108040000000000000000000000000000000000030
-:108050000000000000000000000000000000000020
-:108060000000000000000000000000000000000010
-:108070000000000000000000000000000000000000
-:108080000000000000000000003FC0000000003FB2
-:10809000C000000000000000000000000000000020
-:1080A00000000000000000000000000000000000D0
-:1080B00000000000000000000000000000000000C0
-:1080C00000000000000000000000000000000000B0
-:1080D00000000000000000000000000000000000A0
-:1080E0000000000000000000000F0030C030C00F92
-:1080F0000000000000000000000000000000000080
-:10810000000000000000000000000000000000006F
-:10811000000000000000000000000000000000005F
-:10812000000000000000000000000000000000004F
-:10813000000000000000000000000000000000003F
-:108140000000000000000000001374C0C000F0EC4C
-:1081500040000000000000000000000000000000DF
-:10816000000000000000000000000000000000000F
-:1081700000000000000000000000000000000000FF
-:1081800000000000000000000000000000000000EF
-:1081900000000000000000000000000000000000DF
-:1081A00000000000000000000000000F000F0000B1
-:1081B00000000000000000000000000000000000BF
-:1081C00000000000000000000000000000000000AF
-:1081D000000000000000000000000000000000009F
-:1081E000000000000000000000000000000000008F
-:1081F000000000000000000000000000000000007F
-:1082000000000000000000000030C00F000F003030
-:10821000C00000000000000000000000000000009E
-:10822000000000000000000000000000000000004E
-:10823000000000000000000000000000000000003E
-:10824000000000000000000000000000000000002E
-:10825000000000000000000000000000000000001E
-:1082600000000000000000000000003FC03FC00010
-:1082700000000000000000000000000000000000FE
-:1082800000000000000000000000000000000000EE
-:1082900000000000000000000000000000000000DE
-:1082A00000000000000000000000000000000000CE
-:1082B00000000000000000000000000000000000BE
-:1082C0000000000000000000001986108030823D90
-:1082D000800000000000000000000000000000001E
-:1082E000000000000000000000000000000000008E
-:1082F000000000000000000000000000000000007E
-:10830000000000000000000000000000000000006D
-:10831000000000000000000000000000000000005D
-:108320000000000000000000000F000F000F000F11
-:10833000000000000000000000000000000000003D
-:10834000000000000000000000000000000000002D
-:10835000000000000000000000000000000000001D
-:10836000000000000000000000000000000000000D
-:1083700000000000000000000000000000000000FD
-:108380000000000000000000003FC00F000F003F91
-:10839000C00000000000000000000000000000001D
-:1083A00000000000000000000000000000000000CD
-:1083B00000000000000000000000000000000000BD
-:1083C00000000000000000000000000000000000AD
-:1083D000000000000000000000000000000000009D
-:1083E0000000000000000000000F003FC03FC00F71
-:1083F000000000000000000000000000000000007D
-:10840000000000000000000000000000000000006C
-:10841000000000000000000000000000000000005C
-:10842000000000000000000000000000000000004C
-:10843000000000000000000000000000000000003C
-:108440000000000000000000376525E48000B088CF
-:10845000AB40000000000000000000000000000031
-:10846000000000000000000000000000000000000C
-:1084700000000000000000000000000000000000FC
-:1084800000000000000000000000000000000000EC
-:1084900000000000000000000000000000000000DC
-:1084A00000000000000000000000000000000000CC
-:1084B00000000000000000000000000000000000BC
-:1084C00000000000300020010202000030004300E4
-:1084D000000000000000000000000000000000009C
-:1084E000000000000000000000000000000000008C
-:1084F000000000000000000000000000000000007C
-:10850000000000000000000000000000000000006B
-:10851000000000000000000000000000000000005B
-:10852000000000000000000000000000000000004B
-:10853000000000000000000000000000000000003B
-:10854000000000000000000000000000000000002B
-:10855000000000000000000000000000000000001B
-:10856000000000000000000000000000000000000B
-:1085700000000000000000000000000000000000FB
-:1085800000000000000000000000000000000000EB
-:1085900000000000000000000000000000000000DB
-:1085A00000000000000000000000000000000000CB
-:1085B00000000000000000000000000000000000BB
-:1085C00000000000000000000000000000000000AB
-:1085D000000000000000000000000000000000009B
-:1085E000000000000000000000000000000000008B
-:1085F000000000000000000000000000000000007B
-:10860000000000000000000000000000000000006A
-:10861000000000000000000000000000000000005A
-:10862000000000000000000000000000000000004A
-:10863000000000000000000000000000000000003A
-:10864000000000000000000000000000000000002A
-:10865000000000000000000000000000000000001A
-:10866000000000000000000000000000000000000A
-:1086700000000000000000000000000000000000FA
-:1086800000000000000000000000000000000000EA
-:1086900000000000000000000000000000000000DA
-:1086A00000000000000000000000000000000000CA
-:1086B00000000000000000000000000000000000BA
-:1086C00000000000000000000000000000000000AA
-:1086D000000000000000000000000000000000009A
-:1086E000000000000000000000000000000000008A
-:1086F000000000000000000000000000000000007A
-:108700000000000000000000000000000000000069
-:108710000000000000000000000000000000000059
-:108720000000000000000000000000000000000049
-:108730000000000000000000000000000000000039
-:108740000000000000000000000000000000000029
-:108750000000000000000000000000000000000019
-:108760000000000000000000000000000000000009
-:1087700000000000000000000000000000000000F9
-:1087800000000000000000000000000000000000E9
-:1087900000000000000000000000000000000000D9
-:1087A00000000000000000000000000000000000C9
-:1087B00000000000000000000000000000000000B9
-:1087C00000000000000000000000000000000000A9
-:1087D0000000000000000000000000000000000099
-:1087E0000000000000000000000000000000000089
-:1087F0000000000000000000000000000000000079
-:108800000000000000000000000000000000000068
-:108810000000000000000000000000000000000058
-:108820000000000000000000000000000000000048
-:108830000000000000000000000000000000000038
-:108840000000000000000000000000000000000028
-:108850000000000000000000000000000000000018
-:108860000000000000000000000000000000000008
-:1088700000000000000000000000000000000000F8
-:1088800000000000000000000000000000000000E8
-:1088900000000000000000000000000000000000D8
-:1088A00000000000000000000000000000000000C8
-:1088B00000000000000000000000000000000000B8
-:1088C00000000000000000000000000000000000A8
-:1088D0000000000000000000000000000000000098
-:1088E0000000000000000000000000000000000088
-:1088F0000000000000000000000000000000000078
-:108900000000000000000000000000000000000067
-:108910000000000000000000000000000000000057
-:108920000000000000000000000000000000000047
-:108930000000000000000000000000000000000037
-:108940000000000000000000000000000000000027
-:108950000000000000000000000000000000000017
-:108960000000000000000000000000000000000007
-:1089700000000000000000000000000000000000F7
-:1089800000000000000000000000000000000000E7
-:1089900000000000000000000000000000000000D7
-:1089A00000000000000000000000000000000000C7
-:1089B00000000000000000000000000000000000B7
-:1089C00000000000000000000000000000000000A7
-:1089D0000000000000000000000000000000000097
-:1089E0000000000000000000000000000000000087
-:1089F0000000000000000000000000000000000077
-:108A00000000000000000000000000000000000066
-:108A10000000000000000000000000000000000056
-:108A20000000000000000000000000000000000046
-:108A30000000000000000000000000000000000036
-:108A40000000000000000000000000000000000026
-:108A50000000000000000000000000000000000016
-:108A60000000000000000000000000000000000006
-:108A700000000000000000000000000000000000F6
-:108A800000000000000000000000000000000000E6
-:108A900000000000000000000000000000000000D6
-:108AA00000000000000000000000000000000000C6
-:108AB00000000000000000000000000000000000B6
-:108AC00000000000000000000000000000000000A6
-:108AD0000000000000000000000000000000000096
-:108AE0000000000000000000000000000000000086
-:108AF0000000000000000000000000000000000076
-:108B00000000000000000000000000000000000065
-:108B10000000000000000000000000000000000055
-:108B20000000000000000000000000000000000045
-:108B30000000000000000000000000000000000035
-:108B40000000000000000000000000000000000025
-:108B50000000000000000000000000000000000015
-:108B60000000000000000000000000000000000005
-:108B700000000000000000000000000000000000F5
-:108B800000000000000000000000000000000000E5
-:108B900000000000000000000000000000000000D5
-:108BA00000000000000000000000000000000000C5
-:108BB00000000000000000000000000000000000B5
-:108BC00000000000000000000000000000000000A5
-:108BD0000000000000000000000000000000000095
-:108BE0000000000000000000000000000000000085
-:108BF0000000000000000000000000000000000075
-:108C00000000000000000000000000000000000064
-:108C10000000000000000000000000000000000054
-:108C20000000000000000000000000000000000044
-:108C30000000000000000000000000000000000034
-:108C40000000000000000000000000000000000024
-:108C50000000000000000000000000000000000014
-:108C60000000000000000000000000000000000004
-:108C700000000000000000000000000000000000F4
-:108C800000000000000000000000000000000000E4
-:108C900000000000000000000000000000000000D4
-:108CA00000000000000000000000000000000000C4
-:108CB00000000000000000000000000000000000B4
-:108CC00000000000000000000000000000000000A4
-:108CD0000000000000000000000000000000000094
-:108CE0000000000000000000000000000000000084
-:108CF0000000000000000000000000000000000074
-:108D00000000000000000000000000000000000063
-:108D10000000000000000000000000000000000053
-:108D20000000000000000000000000000000000043
-:108D30000000000000000000000000000000000033
-:108D40000000000000000000000000000000000023
-:108D50000000000000000000000000000000000013
-:108D60000000000000000000000000000000000003
-:108D700000000000000000000000000000000000F3
-:108D800000000000000000000000000000000000E3
-:108D900000000000000000000000000000000000D3
-:108DA00000000000000000000000000000000000C3
-:108DB00000000000000000000000000000000000B3
-:108DC00000000000000000000000000000000000A3
-:108DD0000000000000000000000000000000000093
-:108DE0000000000000000000000000000000000083
-:108DF0000000000000000000000000000000000073
-:108E00000000000000000000000000000000000062
-:108E10000000000000000000000000000000000052
-:108E20000000000000000000000000000000000042
-:108E30000000000000000000000000000000000032
-:108E40000000000000000000000000000000000022
-:108E50000000000000000000000000000000000012
-:108E60000000000000000000000000000000000002
-:108E700000000000000000000000000000000000F2
-:108E800000000000000000000000000000000000E2
-:108E900000000000000000000000000000000000D2
-:108EA00000000000000000000000000000000000C2
-:108EB00000000000000000000000000000000000B2
-:108EC00000000000000000000000000000000000A2
-:108ED0000000000000000000000000000000000092
-:108EE0000000000000000000000000000000000082
-:108EF0000000000000000000000000000000000072
-:108F00000000000000000000000000000000000061
-:108F10000000000000000000000000000000000051
-:108F20000000000000000000000000000000000041
-:108F30000000000000000000000000000000000031
-:108F40000000000000000000000000000000000021
-:108F50000000000000000000000000000000000011
-:108F60000000000000000000000000000000000001
-:108F700000000000000000000000000000000000F1
-:108F800000000000000000000000000000000000E1
-:108F900000000000000000000000000000000000D1
-:108FA00000000000000000000000000000000000C1
-:108FB00000000000000000000000000000000000B1
-:108FC00000000000000000000000000000000000A1
-:108FD0000000000000000000000000000000000091
-:108FE0000000000000000000000000000000000081
-:108FF0000000000000000000000000000000000071
-:109000000000000000000000000000000000000060
-:109010000000000000000000000000000000000050
-:109020000000000000000000000000000000000040
-:109030000000000000000000000000000000000030
-:109040000000000000000000000000000000000020
-:109050000000000000000000000000000000000010
-:109060000000000000000000000000000000000000
-:1090700000000000000000000000000000000000F0
-:1090800000000000000000000000000000000000E0
-:1090900000000000000000000000000000000000D0
-:1090A00000000000000000000000000000000000C0
-:1090B00000000000000000000000000000000000B0
-:1090C00000000000000000000000000000000000A0
-:1090D00030000001000044723000800100000003F5
-:1090E0003000400C00000000000000000000000004
-:1090F0000000000000000000000000000000000070
-:10910000000000000000000000000000000000005F
-:109110000000000030008001000000053000A001C8
-:1091200000000000300000010000E15A00000000D3
-:0C91300000000000000000000000000033
-:00000001FF
-/*
- * This firmware is for the Emagic EMI 2|6 Audio Interface
- *
- * The firmware contained herein is Copyright (c) 1999-2002 Emagic
- * as an unpublished work. This notice does not imply unrestricted
- * or public access to this firmware which is a trade secret of Emagic,
- * and which may not be reproduced, used, sold or transferred to
- * any third party without Emagic's written consent. All Rights Reserved.
- *
- * Permission is hereby granted for the distribution of this firmware
- * image as part of a Linux or other Open Source operating system kernel
- * in text or binary form as required.
- *
- * This firmware may not be modified and may only be used with the
- * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of
- * any driver which includes this firmware, in whole or in part,
- * requires the inclusion of this statement.
- *
-/// VERSION=1.1.1.131
-// DATE=2001dec06
-// PRODUCT=EMI 2|6
diff --git a/firmware/emi26/firmware.HEX b/firmware/emi26/firmware.HEX
deleted file mode 100644
index 1ca400eb1413..000000000000
--- a/firmware/emi26/firmware.HEX
+++ /dev/null
@@ -1,1261 +0,0 @@
-:0300000002435662
-:03000300024BCDE0
-:03000B00024BD2D3
-:03001300024B920B
-:03001B00024BD5C0
-:03002300021B3984
-:03002B000243E2AB
-:03003300023FF396
-:03003B00024BC0B5
-:0300430002470071
-:03004B00023FFC75
-:030053000237FA77
-:03005B00024BC78E
-:030063000246FC56
-:1005000012011001000000406A080101000101020F
-:1005100000010902B80103010080A00904000000E5
-:10052000010100000A2401000156000201020C240E
-:100530000201010100060000000015240605010269
-:10054000030000000000000000000000000000099F
-:1005500024030204030005000C240203010200022C
-:10056000000000000D240606030203000000000046
-:100570000009240304010100060009040100000130
-:100580000200000904010102010200000724010128
-:10059000000100112402010202100344AC0080BBE0
-:1005A0000000770109050A05840101008F07250174
-:1005B0000100000009058F01030001060009040184
-:1005C000020201020000072401010001000E2402C2
-:1005D000010602100244AC0080BB0009050A054C6C
-:1005E0000201008F0725010100000009058F0103AA
-:1005F00000010600090401030201020000072401B2
-:10060000010001000E2402010603180244AC008020
-:10061000BB0009050A05720301008F0725010100CF
-:10062000000009058F01030001060009040104020E
-:1006300001020000072401010001000B2402010255
-:1006400003180100770109050A05460201008F071A
-:1006500025010100000009058F01030001060009C2
-:10066000040200000102000009040201010102006D
-:1006700000072401040001001124020102021003FA
-:1006800044AC0080BB0000770109058C05840101A2
-:100690000000072501010200000904020201010215
-:1006A00000000724010400010011240201020318C4
-:1006B0000344AC0080BB0000770109058C054602AD
-:1006C00001000007250101020000050C0901A1013C
-:1006D000050C09E9050C09EA1500250195027501CB
-:1006E0008142950175068101050C0900050C090080
-:1006F0001500250195027501910695017506910376
-:10070000C004030904180345004D00410047004997
-:10071000004300200047006D00620048001E0345B2
-:10072000006D006100670069006300200045004D16
-:10073000004900200032007C0036002A0343006F8D
-:10074000006E006600690067007500720061007449
-:100750000069006F006E0020005300740072006991
-:10076000006E006700220349006E0074006500728D
-:100770000066006100630065002000530074007291
-:090780000069006E006700000032
-:100789007400F58690FDA57C05A3E582458370F983
-:01079900223D
-:10079A00907FD6E04480F0438701000000000022E9
-:1007AA00C0D0C0E08FE0C0E08EE0C0E08DE0C0E0E5
-:1007BA008CE0C0E0C082C0830586C084C085E5188D
-:1007CA00B402030207D9B401030207DE0207FA7D65
-:1007DA0001020816E51914F519C3B513030207F542
-:1007EA005009B400EA75190A0207D97D00020816F1
-:1007FA00E51914F519C3B514030208115009B40018
-:10080A00CE75190A0207D97D020208167C05907F67
-:10081A0099E05440DC03020843B4001D907FE3745E
-:10082A007BF0A37480F0907FE27440F0907FE5F053
-:10083A00907FE27400F00208180586907FE27480C7
-:10084A00F0907965E0B4010302089EB4020302083D
-:10085A0096B4030302088EB40403020886B405039F
-:10086A0002087EB406030208760208F40586907F21
-:10087A006C0208E90586907F6C0208DD0586907F88
-:10088A006C0208CF0586907F6C0208C00586907FAF
-:10089A006C0208B20586907F6CF000F000F000F060
-:1008AA000DEDB42DF40208F4F0F0F0F0F0F00DEDD7
-:1008BA00B42DF50208F4F000F000F000F00DEDB4EC
-:1008CA0031F40208F4F0F0F0F0F0F00DEDB431F587
-:1008DA000208F4F0F0F0F00DEDB461F70208F4F05C
-:1008EA00F0F0F0F0F00DEDB461F5907FE27400F0F5
-:1008FA00D085D0840586D083D082D0E0FCD0E0FDBC
-:05090A00D0E0FED0E08A
-:06090F00FFD0E0D0D02271
-:10091500C0D0C0E0C082C083907F6FE50CF0E50DCC
-:0D092500F0E50EF0D083D082D0E0D0D022DB
-:10093200C0D0C0E08FE0C0E08EE0C0E0C082C083E3
-:100942000586C084C085907970E0FFBF0003020A6B
-:10095200B8907F96E04480F0907FE27480F0907FC0
-:1009620062E00586907FE27400F0907F96E0547F0B
-:10097200F0907FE27480F0907988E0B4010302097C
-:10098200BEB402030209C3B403030209ACB40403F4
-:1009920002099A0586020AB2EF5403FEEF030354DA
-:1009A2003FFF907F6305860209C9EF5403FEEF0300
-:1009B20003543FFF907F630586020A360586020ACA
-:1009C200A50586020A8EE0E0E0E0E0E00586E0E0D0
-:1009D200E00586E0E0E0E0E0E00586E0E0E00586B4
-:1009E200E0E0E0E0E0E00586E0E0E00586E0E0E06F
-:1009F200E0E0E00586E0E0E00586DFCAEEB4000351
-:100A0200020AB2B40103020A25E0E0E0E0E0E005F8
-:100A120086E0E0E00586E0E0E0E0E0E00586E0E098
-:100A2200E00586E0E0E0E0E0E00586E0E0E0058663
-:100A3200020AB2E0E0E0E00586E0E00586E0E0E000
-:0D0A4200E00586E0E00586E0E0E0E00586E6
-:100A4F00E0E00586E0E0E0E00586E0E00586DFD641
-:100A5F00EEB40003020AB2B40103020A80E0E0E040
-:100A6F00E00586E0E00586E0E0E0E00586E0E005F1
-:100A7F0086E0E0E0E00586E0E00586020AB2E0E00D
-:100A8F00E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E057
-:100A9F00DFEC020AB2E0E0E0E0E0E0E0E0E0E0E01E
-:100AAF00E0DFF2907FE27400F0D085D0840586D02D
-:0E0ABF0083D082D0E0FED0E0FFD0E0D0D02285
-:100ACD00C082C083C0E0E8C0E078D1E814F870FBC4
-:0A0ADD00D0E0F8D0E0D083D08222F0
-:100AE700C0D0C0E08FE0C0E08EE0C0E08DE0C0E0A5
-:100AF7008CE0C0E0758600C082C0830586C084C0D4
-:100B0700857E0090798EE0B400167401F09006CAD5
-:100B1700A3A3A3A3A3A3A3E0FF90798DF0020B39AE
-:100B270090798DE0FF90798FE0FD907990E0FC025D
-:100B37000B469006CA0586907F000586020B518DED
-:100B4700848C850586907F000586E0A30586F0A343
-:100B57000EEEB44003020B6C0586DFEE90798E74BF
-:100B670000F0020B820586AD84AC8590798FEDF09D
-:100B7700907990ECF090798D1FEFF0907FB5EEF0C3
-:100B8700D085D0840586D083D082D0E0FCD0E0FD2C
-:0B0B9700D0E0FED0E0FFD0E0D0D02284
-:100BA200C0D0C0E0C082C083907FAEE054E0F0903D
-:100BB2007F96E0440854FBF0907F97E054BFF0909A
-:100BC2007FE3747BF0907FE47440F0907978E0905A
-:100BD2007B40F0907FE27448F0907FE5E0907FE206
-:100BE2007400F0907F96E054F74404F0907FE37431
-:100BF2007BF0907FE47440F0907979E0907B40F054
-:100C0200907FE27448F0907FE5E0907FE27400F01C
-:100C1200907F96E054F3F0907FAEE0441FF0D083D3
-:070C2200D082D0E0D0D02207
-:100C2900C0D0C0E0C083C08290792FE064FFC324A4
-:0B0C390001F0D082D083D0E0D0D022A8
-:100C4400BB010689828A83E0225002E722BBFE02AE
-:090C5400E32289828A83E49322E1
-:100C5D00BB010CE58229F582E5833AF583E022504C
-:100C6D0006E92582F8E622BBFE06E92582F8E22296
-:0D0C7D00E58229F582E5833AF583E49322B0
-:100C8A00BB010689828A83F0225002F722BBFE0149
-:020C9A00F32243
-:100C9C00F8BB010DE58229F582E5833AF583E8F08E
-:100CAC00225006E92582C8F622BBFE05E92582C83A
-:020CBC00F22222
-:100CBE00C2D5EC30E709B2D5E4C39DFDE49CFCEE51
-:100CCE0030E715B2D5E4C39FFFE49EFE120E40C37B
-:100CDE00E49DFDE49CFC8003120E4030D507C3E476
-:060CEE009FFFE49EFE22C0
-:100CF400C5F0F8A3E028F0C5F0F8E582158270028B
-:060D04001583E038F02227
-:100D0A00BB0110E58229F582E5833AF583E0F5F027
-:100D1A00A3E0225009E92582F886F008E622BBFE04
-:100D2A000AE92582F8E2F5F008E222E5832AF5834A
-:080D3A00E993F5F0A3E993220F
-:100D4200E88FF0A4CC8BF0A42CFCE98EF0A42CFC50
-:100D52008AF0EDA42CFCEA8EF0A4CDA8F08BF0A4CE
-:100D62002DCC3825F0FDE98FF0A42CCD35F0FCEB2D
-:100D72008EF0A4FEA9F0EB8FF0A4CFC5F02ECD39F2
-:0F0D8200FEE43CFCEAA42DCE35F0FDE43CFC225F
-:100D9100EB9FF5F0EA9E42F0E99D42F0E89C45F0B8
-:010DA100222F
-:100DA200BB010DE58229F582E5833AF583020EA1A6
-:100DB2005007E92582F8020E95BBFE07E92582F865
-:100DC200020EADE58229F582E5833AF583020EB97A
-:100DD200BB010DE58229F582E5833AF583020ED542
-:100DE2005007E92582F8020EC9BBFE07E92582F801
-:040DF200020EE122EA
-:100DF600BB010DE58229F582E5833AF583020F06EC
-:100E06005007E92582F8020EEDBBFE07E92582F8B8
-:040E1600020F37226E
-:100E1A00D083D082F8E4937012740193700DA3A367
-:100E2A0093F8740193F5828883E47374029368607B
-:060E3A00EFA3A3A380DF7B
-:100E4000BC000BBE0029EF8DF084FFADF022E4CC96
-:100E5000F875F008EF2FFFEE33FEEC33FCEE9DEC5F
-:100E6000984005FCEE9DFE0FD5F0E9E4CEFD22EDA5
-:100E7000F8F5F0EE8420D21CFEADF075F008EF2FEF
-:100E8000FFED33FD4007985006D5F0F222C398FDE0
-:050E90000FD5F0EA227D
-:0C0E9500E6FC08E6FD08E6FE08E6FF2289
-:0C0EA100E0FCA3E0FDA3E0FEA3E0FF22C4
-:0C0EAD00E2FC08E2FD08E2FE08E2FF2281
-:100EB900E493FCA3E493FDA3E493FEA3E493FF224C
-:0C0EC900ECF608EDF608EEF608EFF62255
-:0C0ED500ECF0A3EDF0A3EEF0A3EFF02290
-:0C0EE100ECF208EDF208EEF208EFF2224D
-:100EED00D083D082E493F608740193F608740293CC
-:090EFD00F608740393F674047303
-:100F0600A8828583F0D083D082120F1D120F1D1286
-:100F16000F1D120F1DE473E493A3C583C5F0C583AB
-:100F2600C8C582C8F0A3C583C5F0C583C8C582C835
-:010F36002298
-:100F3700D083D082E493F208740193F20874029389
-:090F4700F208740393F2740473C0
-:100F5000C2AFD22C907F937430F0907F9C74BFF01E
-:100F6000907F96E05430F0907F947430F0907F9DA5
-:100F700074CFF0907F9774A0F0907F9574CCF0E4DC
-:100F8000907F9EF0C22DC22AC22BC22E907974048B
-:100F9000F0122E941249E2124BE612320D123B0D62
-:100FA0001241FD123E99E51F7018751F011217FFBF
-:100FB000122FFF1249C8124BD8124BDA12496F1286
-:100FC0001B4012398D907FAFE04401F0907FAEE07E
-:100FD000441FF0907FAC74FFF0907FADF0907FDE07
-:100FE000F0907FDFF0907FABF0907FA9F0907FAA28
-:100FF000F05391EF43D820D2E843D82043A8802271
-:10100000907963E014604414700221D0147002419E
-:10101000D914700261D7240460028156E490797873
-:10102000F090797BE0907979F04401F054FDF090F4
-:10103000797BF0E4907988F0A2AF33F512C2AF1259
-:101040000BA2E51270028156D2AF2290792DE06496
-:10105000017079907FF2F0907FF37430F0907FFF11
-:1010600074FCF0E4907978F090797BE0907979F0F5
-:101070004401F04402F090797BF0A2AFE433F51222
-:10108000C2AF120BA29079787402F0907984E0904C
-:101090007979F090797FE0B40109907979E054FE94
-:1010A000F08007907979E04401F0907979E054FD7F
-:1010B000F054FBF0907984F0120BA29079827404C2
-:1010C000F090798814F0E5126002D2AF90792DE0AB
-:1010D00064027079907FF2F0907FF37434F0907F27
-:1010E000FF74FCF0E4907978F090797BE090797966
-:1010F000F04401F04402F090797BF0A2AFE433F5C4
-:1011000012C2AF120BA29079787402F0907984E049
-:10111000907979F090797FE0B40109907979E05481
-:10112000FEF08007907979E04401F0907979E0440D
-:1011300002F054FBF0907984F0120BA29079827443
-:1011400004F090798814F0E5126002D2AF90792D06
-:10115000E0640360028156907FF2F0907FF3746444
-:10116000F0907FFF74FCF0E4907978F090797BE068
-:10117000907979F04401F04402F090797BF0A2AFCD
-:10118000E433F512C2AF120BA29079787402F0909A
-:101190007984E0907979F090797FE0B401099079D1
-:1011A00079E054FEF08007907979E04401F090797D
-:1011B00079E04404F0907984F0120BA29079827463
-:1011C00004F090798814F0E51270028156D2AF22B3
-:1011D00090792DE06401707A907FF2F0907FF37443
-:1011E00088F0907FFF74FCF0E4907978F090797B40
-:1011F000E0907979F04401F054FDF090797BF0A211
-:10120000AFE433F512C2AF120BA29079787402F0FA
-:10121000907984E0907979F090797FE0B401099039
-:101220007979E054FEF08007907979E04401F090FC
-:101230007979E054FDF054FBF0907984F0120BA220
-:10124000907982740CF09079887401F0E512600254
-:10125000D2AF90792DE0640260028156907FF2F067
-:10126000907FF37494F0907FFF74FCF0E4907978B1
-:10127000F090797BE0907979F04401F054FDF090A2
-:10128000797BF0A2AFE433F512C2AF120BA29079D2
-:10129000787402F0907984E0907979F090797FE029
-:1012A000B40109907979E054FEF08007907979E0F3
-:1012B0004401F0907979E04402F054FBF090798495
-:1012C000F0120BA2907982740CF09079887401F07E
-:1012D000E51270028156D2AF2290792DE064017040
-:1012E00077907FF2F0907FF374CCF0907FFF74FCE6
-:1012F000F0E4907978F090797BE0907979F054FC83
-:10130000F090797BF0A2AFE433F512C2AF120BA2DA
-:101310009079787402F0907984E0907979F09079FE
-:101320007FE0B40109907979E054FEF0800790796C
-:1013300079E04401F0907979E054FDF054FBF090AD
-:101340007984F0120BA29079827412F090798874EB
-:1013500002F0E5126002D2AF90792DE0640270775E
-:10136000907FF2F0907FF374E0F0907FFF74FCF0D8
-:10137000E4907978F090797BE0907979F054FCF002
-:1013800090797BF0A2AFE433F512C2AF120BA290BA
-:1013900079787402F0907984E0907979F090797F8F
-:1013A000E0B40109907979E054FEF08007907979F2
-:1013B000E04401F0907979E04402F054FBF0907938
-:1013C00084F0120BA29079827412F09079887402E2
-:1013D000F0E5126002D2AF90792DE064037077904F
-:1013E0007FF2F0907FF37494F0907FFF74FCF0E450
-:1013F000907978F090797BE0907979F054FEF04420
-:1014000002F090797BF0A2AFE433F512C2AF120B79
-:10141000A29079787402F0907984E0907979F090D4
-:10142000797FE0B40109907979E054FEF08007906B
-:101430007979E04401F0907979E04404F09079847E
-:10144000F0120BA29079827406F09079887404F0FF
-:07145000E5126002D2AF2299
-:10145700C228C229907FE8E0120E1A14840014E013
-:101467000114F602167C2116BE2215918015D18132
-:10147700162E8216CFA11705A20000170A907FE942
-:10148700E014601124FE602824FE603B24FC7040B9
-:10149700124A2AE116124BE04002E116907FEAE079
-:1014A700B40104C22AE116907FB4E04401F0E116CA
-:1014B700124BE2907FEAE0B40104D22AE116907F52
-:1014C700B4E04401F0E116907FB4E04401F0E11686
-:1014D700907FB4E04401F0E116907FE9E024F570D5
-:1014E7000512479CE116907FB4E04401F0E11690A5
-:1014F7007FE9E024FD605424026002A188124BE0DA
-:101507004002E116907FEAE07038907FECE0F454F7
-:1015170080FFC4540FFFE054072F25E024B4F58261
-:10152700E4347FF583E4F0907FECE05480FF1313FD
-:1015370013541FFFE054072F907FD7F0E04420F0AB
-:10154700E116907FB4E04401F0E116124BE240024D
-:10155700E116907FEAE07020907FECE0F45480FF82
-:10156700C4540FFFE054072F25E024B4F582E43478
-:101577007FF5837401F0E116907FB4E04401F0E158
-:1015870016907FB4E04401F0E116907FE9E0601225
-:1015970024F860092402702912171EE116124BA0C5
-:1015A700E116124BDEA22AE433FF25E0FFA22BE46B
-:1015B700334F907F00F0E4A3F0907FB57402F0E121
-:1015C70016907FB4E04401F0E116907FE9E06037C0
-:1015D70024F6602E24047041907FEBE024DE600E39
-:1015E700047016D229907FB4E04401F0E116D229A5
-:1015F700907FB4E04401F0E116907FB4E04401F03D
-:10160700E116124463E116124BDEE4907F00F0A36B
-:10161700F0907FB57402F0E116202907907FB4E0BF
-:101627004401F0C229E116907FE9E024F4603424F4
-:101637000C7039124BDE907FECE0F45480FFC454F9
-:101647000FFFE054072F25E024B4F582E4347FF53B
-:1016570083E054FD907F00F0E4A3F0907FB574021F
-:10166700F0E116907FB4E04401F0E116907FB4E01A
-:101677004401F0E116907FE9E024F6601214601A45
-:101687002402701DD228907FB4E04401F08012D26A
-:1016970028907FB4E04401F08007907FB4E04401D4
-:1016A700F020280F9079857401F012496F907FC55B
-:1016B7007402F0C22880589079867401F012496F3D
-:1016C700907FC57402F08047907FE9E024FE6012A6
-:1016D70014601A2402701DD228907FB4E04401F0F0
-:1016E7008012D228907FB4E04401F08007907FB445
-:1016F700E04401F0202803121A7BC2288011122C23
-:101707002B800C124BE45007907FB4E04401F0901B
-:071717007FB4E04402F02260
-:10171E00124BDC4002E1E3907FEBE024FE601E14EE
-:10172E00604614606E147002E1D424046002E1DCA1
-:10173E007405907FD4F07400907FD5F022907FEAEC
-:10174E00E0FF123FA28B338A348935EA496011CE0D
-:10175E00EACEEE907FD4F0CFE9CFEF907FD5F02296
-:10176E00907FB4E04401F022907FEAE0FF1248003F
-:10177E008B338A348935EA496011CEEACEEE907FFA
-:10178E00D4F0CFE9CFEF907FD5F022907FB4E04434
-:10179E0001F022907FEAE0FF907EC0E0FDA3E0FB27
-:1017AE001244D28B338A348935EA496011CEEACE9F
-:1017BE00EE907FD4F0CFE9CFEF907FD5F022907FDF
-:1017CE00B4E04401F022907FB4E04401F022907F17
-:0517DE00B4E04401F03D
-:0117E30022E3
-:1017E400C0E0C083C082907FC4E4F05391EF907F47
-:0B17F400AB7404F0D082D083D0E03250
-:0117FF0022C7
-:10180000E4907815F07B0190781204F0A37478F0DE
-:10181000A37458F0907812E0FBA3E0FAA3E0F990EB
-:101820000001120C5DFF90799AE06F6018907815B6
-:10183000E0C39406500FE004F0907813E475F00FC5
-:10184000120CF480CF907815E0B40608907FB4E0D5
-:101850004401F022907812E0FBA3E0FAA3E0F91231
-:101860000C44FF24BF7002417A24E07002414C24F2
-:101870002160024173907997E024FE7002219A144E
-:10188000700221EF24026002414490792DE0A3F020
-:10189000907923E0FFE4FCFDFEFBFA7901F8120DDC
-:1018A00042C8ECC8C9EDC9CAEECACBEFCB907922C9
-:1018B000E0FEE4FCFD2BFBEA3EFAED39F9EC38F8EA
-:1018C000907921E0FFE4FEEB2FFFEE3AFEED39FDCB
-:1018D000EC38FC907812E0FBA3E0FAA3E0F990006A
-:1018E00002120DD2900002120DA27B447AAC790054
-:1018F0007800C3120D91700590792D04F090781244
-:10190000E0FBA3E0FAA3E0F9900002120DA27B80B5
-:101910007ABB79007800C3120D91700690792D740E
-:1019200002F0907812E0FBA3E0FAA3E0F990000245
-:10193000120DA27B007A7779017800C3120D9170A5
-:101940000690792D7403F090792DE0FFB4010975AC
-:101950000C67750D06750E0BEFB40208E4F50CF577
-:101960000D750E0CEFB40308E4F50CF50D750E18AB
-:10197000EFB4030D90792EE064036005D22F123D81
-:101980007990792DE06403600AA3E0B40305C22FC7
-:10199000123D7912100012280122907923E0FFE411
-:1019A000FCFDFEFBFA7901F8120D42C8ECC8C9ED46
-:1019B000C9CAEECACBEFCB907922E0FEE4FCFD2B46
-:1019C000FBEA3EFAED39F9EC38F8907921E0FFE4D2
-:1019D000FEEB2FFFEE3AFEED39FDEC38FC9078126D
-:1019E000E0FBA3E0FAA3E0F9900006120DD22290EA
-:1019F0007923E0FFE4FCFDFEFBFA7901F8120D42C9
-:101A0000C8ECC8C9EDC9CAEECACBEFCB907922E0C9
-:101A1000FEE4FCFD2BFBEA3EFAED39F9EC38F890D8
-:101A20007921E0FFE4FEEB2FFFEE3AFEED39FDEC0D
-:101A300038FC907812E0FBA3E0FAA3E0F990000AEA
-:101A4000120DD222907FB4E04401F022907997E009
-:101A5000147018907921E0FF907812E0FBA3E0FA6F
-:101A6000A3E0F990000EEF120C9C22907FB4E044AA
-:0A1A700001F022907FB4E04401F081
-:011A7A002249
-:101A7B00E4FFFE7B0190780F04F0A37478F0A3745D
-:101A8B002BF090780FE0FBA3E0FAA3E0F9900002B3
-:101A9B00120C5DFD907FECE06D6013EFC39405506D
-:101AAB000D0F907810E475F003120CF480D48D3385
-:101ABB0090780FE0FBA3E0FAA3E0F9900001120C81
-:101ACB005DFD907FEDE06D6013EEC3940B500D0E3A
-:101ADB00907810E475F003120CF480D4907FEDE055
-:101AEB00F534EF64056003BE0B08907FB4E044014E
-:101AFB00F02290780FE0FBA3E0FAA3E0F9120C447C
-:101B0B00FF24F06008240F700E12492A22124B8317
-:0E1B1B00907920E534F022907FB4E04401F090
-:011B29002299
-:0F1B2A00907FEAE0B4FF04123416221238002232
-:071B39005398FE5398FD32A2
-:101B40000000000000000000000000000000000095
-:101B50000000000000000000000000000000000085
-:101B60000000000000000000000000000000000075
-:101B70000000000000000000000000000000000065
-:101B80000000000000000000000000000000000055
-:101B90000000000000000000000000000000000045
-:101BA0000000000000000000000000000000000035
-:101BB0000000000000000000000000000000000025
-:101BC0000000000000000000000000000000000015
-:101BD0000000000000000000000000000000000005
-:101BE00000000000000000000000000000000000F5
-:101BF00000000000000000000000000000000000E5
-:101C000000000000000000000000000000000000D4
-:101C100000000000000000000000000000000000C4
-:101C200000000000000000000000000000000000B4
-:101C300000000000000000000000000000000000A4
-:101C40000000000000000000000000000000000094
-:101C50000000000000000000000000000000000084
-:101C60000000000000000000000000000000000074
-:101C70000000000000000000000000000000000064
-:101C80000000000000000000000000000000000054
-:101C90000000000000000000000000000000000044
-:101CA0000000000000000000000000000000000034
-:101CB0000000000000000000000000000000000024
-:101CC0000000000000000000000000000000000014
-:101CD0000000000000000000000000000000000004
-:101CE00000000000000000000000000000000000F4
-:101CF00000000000000000000000000000000000E4
-:101D000000000000000000000000000000000000D3
-:101D100000000000000000000000000000000000C3
-:101D200000000000000000000000000000000000B3
-:101D300000000000000000000000000000000000A3
-:101D40000000000000000000000000000000000093
-:101D50000000000000000000000000000000000083
-:101D60000000000000000000000000000000000073
-:101D70000000000000000000000000000000000063
-:101D80000000000000000000000000000000000053
-:101D90000000000000000000000000000000000043
-:101DA0000000000000000000000000000000000033
-:101DB0000000000000000000000000000000000023
-:101DC0000000000000000000000000000000000013
-:101DD0000000000000000000000000000000000003
-:101DE00000000000000000000000000000000000F3
-:101DF00000000000000000000000000000000000E3
-:101E000000000000000000000000000000000000D2
-:101E100000000000000000000000000000000000C2
-:101E200000000000000000000000000000000000B2
-:101E300000000000000000000000000000000000A2
-:101E40000000000000000000000000000000000092
-:101E50000000000000000000000000000000000082
-:101E60000000000000000000000000000000000072
-:101E70000000000000000000000000000000000062
-:101E80000000000000000000000000000000000052
-:101E90000000000000000000000000000000000042
-:101EA0000000000000000000000000000000000032
-:0E1EB000000000000000000000000000000024
-:101EBE000000000000000000000000000000000014
-:101ECE000000000000000000000000000000000004
-:101EDE0000000000000000000000000000000000F4
-:101EEE0000000000000000000000000000000000E4
-:101EFE0000000000000000000000000000000000D4
-:101F0E0000000000000000000000000000000000C3
-:101F1E0000000000000000000000000000000000B3
-:101F2E0000000000000000000000000000000000A3
-:021F3E000000A1
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F70000000000000000000000000000000000061
-:101F80000000000000000000000000000000000051
-:101F90000000000000000000000000000000000041
-:101FA0000000000000000000000000000000000031
-:101FB0000000000000000000000000000000000021
-:101FC0000000000000000000000000000000000011
-:101FD0000000000000000000000000000000000001
-:101FE00000000000000000000000000000000000F1
-:101FF00000000000000000000000000000000000E1
-:1020000000000000000000000000000000000000D0
-:1020100000000000000000000000000000000000C0
-:1020200000000000000000000000000000000000B0
-:1020300000000000000000000000000000000000A0
-:102040000000000000000000000000000000000090
-:102050000000000000000000000000000000000080
-:102060000000000000000000000000000000000070
-:102070000000000000000000000000000000000060
-:102080000000000000000000000000000000000050
-:102090000000000000000000000000000000000040
-:1020A0000000000000000000000000000000000030
-:1020B0000000000000000000000000000000000020
-:1020C0000000000000000000000000000000000010
-:1020D0000000000000000000000000000000000000
-:1020E00000000000000000000000000000000000F0
-:1020F00000000000000000000000000000000000E0
-:1021000000000000000000000000000000000000CF
-:1021100000000000000000000000000000000000BF
-:1021200000000000000000000000000000000000AF
-:10213000000000000000000000000000000000009F
-:10214000000000000000000000000000000000008F
-:10215000000000000000000000000000000000007F
-:10216000000000000000000000000000000000006F
-:10217000000000000000000000000000000000005F
-:10218000000000000000000000000000000000004F
-:10219000000000000000000000000000000000003F
-:1021A000000000000000000000000000000000002F
-:1021B000000000000000000000000000000000001F
-:1021C000000000000000000000000000000000000F
-:1021D00000000000000000000000000000000000FF
-:1021E00000000000000000000000000000000000EF
-:1021F00000000000000000000000000000000000DF
-:1022000000000000000000000000000000000000CE
-:1022100000000000000000000000000000000000BE
-:1022200000000000000000000000000000000000AE
-:10223000000000000000000000000000000000009E
-:10224000000000000000000000000000000000008E
-:10225000000000000000000000000000000000007E
-:10226000000000000000000000000000000000006E
-:10227000000000000000000000000000000000005E
-:10228000000000000000000000000000000000004E
-:10229000000000000000000000000000000000003E
-:1022A000000000000000000000000000000000002E
-:1022B000000000000000000000000000000000001E
-:1022C000000000000000000000000000000000000E
-:1022D00000000000000000000000000000000000FE
-:1022E00000000000000000000000000000000000EE
-:1022F00000000000000000000000000000000000DE
-:1023000000000000000000000000000000000000CD
-:1023100000000000000000000000000000000000BD
-:1023200000000000000000000000000000000000AD
-:10233000000000000000000000000000000000009D
-:10234000000000000000000000000000000000008D
-:10235000000000000000000000000000000000007D
-:10236000000000000000000000000000000000006D
-:0E23700000000000000000000000000000005F
-:10237E00000000000000000000000000000000004F
-:10238E00000000000000000000000000000000003F
-:10239E00000000000000000000000000000000002F
-:1023AE00000000000000000000000000000000001F
-:1023BE00000000000000000000000000000000000F
-:1023CE0000000000000000000000000000000000FF
-:1023DE0000000000000000000000000000000000EF
-:1023EE0000000000000000000000000000000000DF
-:1023FE0000000000000000000000000000000000CF
-:10240E0000000000000000000000000000000000BE
-:10241E0000000000000000000000000000000000AE
-:10242E00000000000000000000000000000000009E
-:10243E00000000000000000000000000000000008E
-:10244E00000000000000000000000000000000007E
-:10245E00000000000000000000000000000000006E
-:10246E00000000000000000000000000000000005E
-:10247E00000000000000000000000000000000004E
-:10248E00000000000000000000000000000000003E
-:10249E00000000000000000000000000000000002E
-:1024AE00000000000000000000000000000000001E
-:1024BE00000000000000000000000000000000000E
-:1024CE0000000000000000000000000000000000FE
-:1024DE0000000000000000000000000000000000EE
-:1024EE0000000000000000000000000000000000DE
-:1024FE0000000000000000000000000000000000CE
-:10250E0000000000000000000000000000000000BD
-:10251E0000000000000000000000000000000000AD
-:10252E00000000000000000000000000000000009D
-:10253E00000000000000000000000000000000008D
-:10254E00000000000000000000000000000000007D
-:10255E00000000000000000000000000000000006D
-:10256E00000000000000000000000000000000005D
-:10257E00000000000000000000000000000000004D
-:10258E00000000000000000000000000000000003D
-:10259E00000000000000000000000000000000002D
-:1025AE00000000000000000000000000000000001D
-:1025BE00000000000000000000000000000000000D
-:1025CE0000000000000000000000000000000000FD
-:1025DE0000000000000000000000000000000000ED
-:1025EE0000000000000000000000000000000000DD
-:1025FE0000000000000000000000000000000000CD
-:10260E0000000000000000000000000000000000BC
-:10261E0000000000000000000000000000000000AC
-:10262E00000000000000000000000000000000009C
-:10263E00000000000000000000000000000000008C
-:10264E00000000000000000000000000000000007C
-:10265E00000000000000000000000000000000006C
-:10266E00000000000000000000000000000000005C
-:10267E00000000000000000000000000000000004C
-:10268E00000000000000000000000000000000003C
-:10269E00000000000000000000000000000000002C
-:1026AE00000000000000000000000000000000001C
-:1026BE00000000000000000000000000000000000C
-:1026CE0000000000000000000000000000000000FC
-:1026DE0000000000000000000000000000000000EC
-:0E26EE000000000000000000000000000000DE
-:1026FC0000000000000000000000000000000000CE
-:10270C0000000000000000000000000000000000BD
-:10271C0000000000000000000000000000000000AD
-:10272C00000000000000000000000000000000009D
-:10273C00000000000000000000000000000000008D
-:10274C00000000000000000000000000000000007D
-:10275C00000000000000000000000000000000006D
-:10276C00000000000000000000000000000000005D
-:10277C00000000000000000000000000000000004D
-:10278C00000000000000000000000000000000003D
-:10279C00000000000000000000000000000000002D
-:1027AC00000000000000000000000000000000001D
-:1027BC00000000000000000000000000000000000D
-:1027CC0000000000000000000000000000000000FD
-:1027DC0000000000000000000000000000000000ED
-:1027EC0000000000000000000000000000000000DD
-:0527FC000000000022B6
-:10280100907964E0146046147002413C2402600235
-:10281100812A907FFC74CCF0907FFF74FCF090795A
-:10282100787401F090797CE0907979F054FDF0446E
-:1028310001F090797CF0A2AFE433F512C2AF120B34
-:10284100A2E5126002D2AFE490797AF02290792D5C
-:10285100E06401600201F1907FFC74CCF0907FFF95
-:1028610074FCF09079787401F090797CE09079793A
-:10287100F04401F04402F090797EE0B401099079CE
-:1028810079E04404F08007907979E054FBF0907985
-:1028910079E090797CF0A2AFE433F512C2AF120B6C
-:1028A100A29079787402F0907984E0907979F0902F
-:1028B100797FE0B40109907979E054FEF0800790C6
-:1028C1007979E04401F0907979E054FDF054FBF01E
-:1028D100907984F0120BA290797A7401F090796565
-:1028E100F0E5126002D2AFE490798CF090798BF030
-:1028F10090792DE0640260022196907FFC74C8F00B
-:10290100907FFF74FCF09079787401F090797CE00D
-:10291100907979F04401F04402F090797EE0B401BD
-:1029210009907979E04404F08007907979E054FBCB
-:10293100F0907979E090797CF0A2AFE433F512C29E
-:10294100AF120BA29079787402F0907984E09079BB
-:1029510079F090797FE0B40109907979E054FEF043
-:102961008007907979E04401F0907979E04402F0B0
-:1029710054FBF0907984F0120BA290797A7401F0F3
-:102981009079657403F0E5126002D2AFE490798C1E
-:10299100F090798BF090792DE064036002812A90A8
-:1029A1007FFC7498F0907FFF74FCF090797874014B
-:1029B100F090797CE0907979F04401F04402F09054
-:1029C100797EE0B40109907979E04404F0800790C0
-:1029D1007979E054FBF0907979E090797CF0A2AFBD
-:1029E100E433F512C2AF120BA29079787402F09021
-:1029F1007984E0907979F090797FE0B40109907958
-:102A010079E054FEF08007907979E04401F0907903
-:102A110079E054FDF04404F0907984F0120BA29017
-:102A2100797A7401F09079657405F0E5126002D24B
-:102A3100AFE490798CF090798BF02290792DE0645D
-:102A410001600241E0907FFC74B4F0907FFF74FC60
-:102A5100F09079787401F090797CE0907979F05474
-:102A6100FEF04402F090797EE0B40109907979E0BA
-:102A71004404F08007907979E054FBF0907979E093
-:102A810090797CF0A2AFE433F512C2AF120BA290A1
-:102A910079787402F0907984E0907979F090797F77
-:102AA100E0B40109907979E054FEF08007907979DA
-:102AB100E04401F0907979E054FDF054FBF0907915
-:102AC10084F0120BA290797A7401F090796504F088
-:102AD100E5126002D2AFE490798CF090798BF0909E
-:102AE100792DE0640260026185907FFC74B0F09002
-:102AF1007FFF74FCF09079787401F090797CE0901C
-:102B01007979F054FEF04402F090797EE0B4010945
-:102B1100907979E04404F08007907979E054FBF0F2
-:102B2100907979E090797CF0A2AFE433F512C2AFED
-:102B3100120BA29079787402F0907984E0907979FF
-:102B4100F090797FE0B40109907979E054FEF0804A
-:102B510007907979E04401F0907979E04402F054EA
-:102B6100FBF0907984F0120BA290797A7401F090C5
-:102B710079657404F0E5126002D2AFE490798CF0CB
-:102B810090798BF090792DE064036002812A907F27
-:102B9100FC7468F0907FFF74FCF09079787401F018
-:102BA10090797CE0907979F054FEF04402F09079CC
-:102BB1007EE0B40109907979E04404F080079079CE
-:102BC10079E054FBF0907979E090797CF0A2AFE460
-:102BD10033F512C2AF120BA29079787402F090799A
-:102BE10084E0907979F090797FE0B4010990797966
-:102BF100E054FEF08007907979E04401F090797912
-:102C0100E054FDF04404F0907984F0120BA2907925
-:102C11007A7401F09079657406F0E5126002D2AF22
-:0A2C2100E490798CF090798BF0229A
-:102C2B00E4FF7B0190781604F0A37478F0A374583A
-:102C3B00F0907816E0FBA3E0FAA3E0F99000011204
-:102C4B000C5DFE907FECE06E6013EFC39406500DAD
-:102C5B000F907817E475F00F120CF480D4BF0608B0
-:102C6B00907FB4E04401F022907816E0FBA3E0FAE9
-:102C7B00A3E0F9120C44FF249F7002C1662421606B
-:102C8B0002C18C907FE9E0247E7002A130147002A7
-:102C9B00A1C824026002C15E900002120DA27B4407
-:102CAB007AAC79007800C3120D917013907F007489
-:102CBB0044F0A374ACF0E4A3F0907FB57403F090F0
-:102CCB007816E0FBA3E0FAA3E0F9900002120DA244
-:102CDB007B807ABB79007800C3120D917013907FC3
-:102CEB00007480F0A374BBF0E4A3F0907FB5740381
-:102CFB00F0907816E0FBA3E0FAA3E0F99000021243
-:102D0B000DA27B007A7779017800C3120D916002D6
-:102D1B00C193907F00F0A37477F0A37401F0907FC0
-:102D2B00B57403F022907816E0FBA3E0FAA3E0F968
-:102D3B00900006120DA27B447AAC79007800C31286
-:102D4B000D917013907F007444F0A374ACF0E4A366
-:102D5B00F0907FB57403F0907816E0FBA3E0FAA334
-:102D6B00E0F9900006120DA27B807ABB7900780007
-:102D7B00C3120D917013907F007480F0A374BBF09D
-:102D8B00E4A3F0907FB57403F0907816E0FBA3E01A
-:102D9B00FAA3E0F9900006120DA27B007A77790175
-:102DAB007800C3120D916002C193907F00F0A37461
-:102DBB0077F0A37401F0907FB57403F0229078162E
-:102DCB00E0FBA3E0FAA3E0F990000A120DA27B440A
-:102DDB007AAC79007800C3120D917013907F007458
-:102DEB0044F0A374ACF0E4A3F0907FB57403F090BF
-:102DFB007816E0FBA3E0FAA3E0F990000A120DA20B
-:102E0B007B807ABB79007800C3120D917013907F91
-:102E1B00007480F0A374BBF0E4A3F0907FB574034F
-:102E2B00F0907816E0FBA3E0FAA3E0F990000A1209
-:102E3B000DA27B007A7779017800C3120D9170484F
-:102E4B00907F00F0A37477F0A37401F0907FB574BA
-:102E5B0003F022907FB4E04401F022907FE9E0245C
-:102E6B007F7016907816E0FBA3E0FAA3E0F99000D0
-:102E7B000E120C5D907F00F022907FB4E04401F0C5
-:082E8B0022907FB4E04401F045
-:012E9300221C
-:102E9400753625753724907974E064017054F0F523
-:102EA40035752201E52264017048907FA5E04480D5
-:102EB400F0907FA6E536F01246C0744F2535F582B2
-:102EC400E43479F583E0907FA6F01246C07435258A
-:102ED40035F582E43479F583E0907FA6F01246C09C
-:102EE400907FA57440F0120ACD0535E535C3940DE5
-:102EF40040B2907975E064016002E1DEF0907920DF
-:102F0400E064056002E18D7B0190795C04F0A374B8
-:102F140078F0A374B2F075330790795CE0FBA3E01A
-:102F2400FAA3E0F9900001120C5D700F90000412F6
-:102F34000C5D90792FF0120C29800690792F74FF84
-:102F4400F0E4F535752201753402E5226401703927
-:102F5400907FA5E04480F0907FA6E536F01246C04D
-:102F6400AF340534907FA6EFF01246C090792FE07D
-:102F7400907FA6F01246C0907FA57440F0120ACD4F
-:102F84000535E535C3940640C1907920E0640670A8
-:102F9400497B0190795F04F0A37478F0A374FFF087
-:102FA40075330390795FE0FBA3E0FAA3E0F99000A6
-:102FB40001120C5D701C900004120C5D907933F0CA
-:102FC400700374FFF0907933E0547FFFF025E0F054
-:0A2FD4008005E4907933F01247DF26
-:012FDE0022D0
-:102FDF009079787403F0907983E0907979F0A2AFCB
-:102FEF00E433F512C2AF120BA2E5126002D2AF2288
-:012FFF0022AF
-:10300000E4FE907920E0FDB405119078257401F07C
-:10301000A37478F0A374B2F0753507EDB40611907F
-:1030200078257401F0A37478F0A374FFF07535036C
-:10303000907FEBE014601114605B24026002410594
-:10304000907FB4E04401F022907FE9E0247F703D5E
-:10305000E4FFEFC39535502F907825E0FBA3E0FA0D
-:10306000A3E0F9900001120C5DFDCCEECC0E7400D3
-:103070002CF582E4347FF583EDF0907826E475F04A
-:103080000B120CF40F80CB907FB5EEF022907FB442
-:10309000E04401F022907FE9E0247E606414700235
-:1030A000215514700221A92403600221FDE4FFEFE1
-:1030B000C395355046907825E0FBA3E0FAA3E0F9EC
-:1030C000900003120C5DFDCCEECC0E74002CF5824A
-:1030D000E4347FF583EDF0900004120C5DFDCCEE3E
-:1030E000CC0E74002CF582E4347FF583EDF09078FB
-:1030F00026E475F00B120CF40F80B4907FB5EEF05F
-:1031000022E4FFEFC395355046907825E0FBA3E01D
-:10311000FAA3E0F9900005120C5DFDCCEECC0E7424
-:10312000002CF582E4347FF583EDF0900006120C5C
-:103130005DFDCCEECC0E74002CF582E4347FF5837B
-:10314000EDF0907826E475F00B120CF40F80B4903B
-:103150007FB5EEF022E4FFEFC39535504690782519
-:10316000E0FBA3E0FAA3E0F9900007120C5DFDCCB0
-:10317000EECC0E74002CF582E4347FF583EDF090F4
-:103180000008120C5DFDCCEECC0E74002CF582E430
-:10319000347FF583EDF0907826E475F00B120CF493
-:1031A0000F80B4907FB5EEF022E4FFEFC395355069
-:1031B00046907825E0FBA3E0FAA3E0F9900009121D
-:1031C0000C5DFDCCEECC0E74002CF582E4347FF562
-:1031D00083EDF090000A120C5DFDCCEECC0E740075
-:1031E0002CF582E4347FF583EDF0907826E475F0D9
-:1031F0000B120CF40F80B4907FB5EEF022907FB4E8
-:0C320000E04401F022907FB4E04401F0B3
-:01320C00229F
-:10320D007B017A78792B907800EBF0A3EAF0A3E9B3
-:10321D00F07401120C8A907800E0FBA3E0FAA3E0B1
-:10322D00F99000017401120C9C900002E4120C9CA8
-:10323D00907801E475F003120CF4907800E0FBA394
-:10324D00E0FAA3E0F97410120C8A907800E0FBA369
-:10325D00E0FAA3E0F99000017405120C9C900002B5
-:10326D00E4120C9C907801E475F003120CF4907844
-:10327D0000E0FBA3E0FAA3E0F97402120C8A907847
-:10328D0000E0FBA3E0FAA3E0F99000017402120C38
-:10329D009C900002E4120C9C907801E475F00312EE
-:1032AD000CF4907800E0FBA3E0FAA3E0F9740112AE
-:1032BD000C8A907800E0FBA3E0FAA3E0F9900001FE
-:1032CD007403120C9C900002E4120C9C907801E4A3
-:1032DD0075F003120CF4907800E0FBA3E0FAA3E084
-:1032ED00F97410120C8A907800E0FBA3E0FAA3E0C9
-:1032FD00F99000017406120C9C900002E4120C9CD3
-:10330D00907801E475F003120CF4907800E0FBA3C3
-:10331D00E0FAA3E0F97402120C8A907800E0FBA3A6
-:10332D00E0FAA3E0F99000017404120C9C900002E5
-:10333D00E4120C9C907801E475F003120CF4907873
-:10334D0000E0FBA3E0FAA3E0F97402120C8A907876
-:10335D0000E0FBA3E0FAA3E0F99000017404120C65
-:10336D009C9000027404120C9C907801E475F0039B
-:10337D00120CF4907800E0FBA3E0FAA3E0F97402DC
-:10338D00120C8A907800E0FBA3E0FAA3E0F990001C
-:10339D00017403120C9C9000027404120C9C907822
-:1033AD0001E475F003120CF4907800E0FBA3E0FA51
-:1033BD00A3E0F97402120C8A907800E0FBA3E0FA06
-:1033CD00A3E0F99000017402120C9C9000027404A9
-:1033DD00120C9C907801E475F003120CF4907800B7
-:1033ED00E0FBA3E0FAA3E0F97402120C8A907800D6
-:1033FD00E0FBA3E0FAA3E0F99000017401120C9C2C
-:08340D009000027404120C9CF3
-:013415002294
-:10341600E4FE907920E0FDB4051190781F7401F068
-:10342600A37478F0A374B2F0753507EDB406119065
-:10343600781F7401F0A37478F0A374FFF075350358
-:10344600907999E014601114605B24026002C10651
-:10345600907FB4E04401F022907997E014703EE446
-:10346600FFEFC39535502FCDEECD0E74212DF5828D
-:10347600E43479F583E0FD90781FE0FBA3E0FAA33E
-:10348600E0F9900001ED120C9C907820E475F00BA9
-:10349600120CF40F80CB9079757401F022907FB4F2
-:1034A600E04401F022907997E024FE6063147002F4
-:1034B600A164147002A1B224036002A1FEE4FFEF2E
-:1034C600C395355044CDEECD0E74212DF582E434EE
-:1034D60079F583E0FD90781FE0FBA3E0FAA3E0F91D
-:1034E600900003ED120C9CCDEECD0E74212DF582CD
-:1034F600E43479F583E0900004120C9C907820E483
-:1035060075F00B120CF40F80B69079757401F022E9
-:10351600E4FFEFC395354002C10DCDEECD0E74210B
-:103526002DF582E43479F583E0FD90781FE0FBA366
-:10353600E0FAA3E0F9900005ED120C9CCDEECD0E5D
-:1035460074212DF582E43479F583E0900006120C9F
-:103556009C907820E475F00B120CF40F80B4E4FF15
-:10356600EFC395354002C10DCDEECD0E74212DF57C
-:1035760082E43479F583E0FD90781FE0FBA3E0FA5E
-:10358600A3E0F9900007ED120C9CCDEECD0E742150
-:103596002DF582E43479F583E0900008120C9C90B6
-:1035A6007820E475F00B120CF40F80B4E4FFEFC33F
-:1035B60095355053CDEECD0E74212DF582E4347938
-:1035C600F583E0FD90781FE0FBA3E0FAA3E0F99015
-:1035D6000009ED120C9CCDEECD0E74212DF582E482
-:1035E6003479F583E090000A120C9C907820E475FB
-:1035F600F00B120CF40F80B6907FB4E04401F02279
-:07360600907FB4E04401F0E5
-:01360D00229A
-:10360E00E4FE907920E0FDB405109078287401F066
-:10361E00A37478F0A374B2F07F07EDB4061090781F
-:10362E00287401F0A37478F0A374FFF07F039078F0
-:10363E0028E0FBA3E0FAA3E0F9120C44FD907FEA28
-:10364E00E06D6012EEC39F500D907829E475F00B7B
-:10365E00120CF40E80D8907FEBE0146011146046CB
-:10366E0024026002E19A907FB4E04401F022907F40
-:10367E00E9E0247F7028EE6F7008907FB4E044017B
-:10368E00F022907828E0FBA3E0FAA3E0F990000185
-:10369E00120C5D907F00F0907FB57401F022907F48
-:1036AE00B4E04401F022907FE9E0247E6040146093
-:1036BE006F147002E16024036002E192EE6F7008F5
-:1036CE00907FB4E04401F022907828E0FBA3E0FA6A
-:1036DE00A3E0F9900003120C5D907F00F0900004BF
-:1036EE00120C5D907F01F0907FB57402F022EE6FA8
-:1036FE007008907FB4E04401F022907828E0FBA39C
-:10370E00E0FAA3E0F9900005120C5D907F00F090B6
-:10371E000006120C5D907F01F0907FB57402F022CE
-:10372E00EE6F7008907FB4E04401F022907828E0AC
-:10373E00FBA3E0FAA3E0F9900007120C5D907F0066
-:10374E00F0900008120C5D907F01F0907FB574022E
-:10375E00F022EE6F7008907FB4E04401F022907872
-:10376E0028E0FBA3E0FAA3E0F9900009120C5D90AB
-:10377E007F00F090000A120C5D907F01F0907FB5F3
-:10378E007402F022907FB4E04401F022907FB4E006
-:03379E004401F0F3
-:0137A1002205
-:1037A200C0E0C0F0C083C082C0D0E8C0E0E9C0E0A1
-:1037B200EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EF5C
-:1037C200C0E05391EF907FAB7410F0907983E05496
-:1037D200FDF0122FDFD0E0FFD0E0FED0E0FDD0E020
-:1037E200FCD0E0FBD0E0FAD0E0F9D0E0F8D0D0D0C5
-:0837F20082D083D0F0D0E03258
-:0637FA005391BFD22632FC
-:10380000E4FE907920E0FDB405109078227401F078
-:10381000A37478F0A374B2F07F07EDB4061090782B
-:10382000227401F0A37478F0A374FFF07F03907802
-:1038300022E0FBA3E0FAA3E0F9120C44FD90799892
-:10384000E06D6012EEC39F500D907823E475F00B8D
-:10385000120CF40E80D8907999E01460111460482D
-:10386000240260022185907FB4E04401F022907927
-:1038700097E014702BEE6F7009907FB4E04401F074
-:103880008017907921E0FD907822E0FBA3E0FAA375
-:10389000E0F9900001ED120C9C9079757401F02212
-:1038A000907FB4E04401F022907997E024FE6043D9
-:1038B00014606E147002214F24036002217DEE6FAC
-:1038C0007009907FB4E04401F08021907921E0FDFF
-:1038D000907822E0FBA3E0FAA3E0F9900003ED1258
-:1038E0000C9C907922E0900004120C9C90797574E5
-:1038F00001F022EE6F7008907FB4E04401F0229056
-:103900007921E0FD907822E0FBA3E0FAA3E0F990B2
-:103910000005ED120C9C907922E0900006120C9CA0
-:1039200022EE6F7008907FB4E04401F0229079217C
-:10393000E0FD907822E0FBA3E0FAA3E0F990000715
-:10394000ED120C9C907922E0900008120C9C22EE63
-:103950006F7008907FB4E04401F022907921E0FE7E
-:10396000907822E0FBA3E0FAA3E0F9900009EE12C0
-:103970000C9C907922E090000A120C9C22907FB45B
-:0C398000E04401F022907FB4E04401F02C
-:01398C002218
-:10398D00A2AFE433F512E4907983F0122FDF907F2C
-:10399D00E07490F0907FE17404F0E4907FDDF0909E
-:1039AD007FA1F0538EF875880575B82075F8014321
-:1039BD008E30F5C875CA7F75CBF843A82090797401
-:1039CD0004F0C222E4F50F907978F0A3F0907962BB
-:1039DD00F0A3F0A3F0907966F0A3F090797BF0A3BB
-:1039ED00F0907984F090797DF0907975F0A3F0A343
-:1039FD00F0C223C224C225C226C220907F9BE0F5CF
-:103A0D000A5420F50A700690797EF0800690797E32
-:103A1D007401F0907F9BE0F50A5402F50A70069050
-:103A2D00797FF0800690797F7401F0907978740237
-:103A3D00F0907984E0907979F090797FE0B4010984
-:103A4D00907979E054FEF08007907979E04401F0A7
-:103A5D00907979E0907984F0120BA29079787401C5
-:103A6D00F090797CE0907979F090797EE0B401095D
-:103A7D00907979E04404F08007907979E054FBF077
-:103A8D00907979E090797CF0120BA2E4907978F03E
-:103A9D00A304F0E4907988F0120BA2907FFC74DD02
-:103AAD00F0907FFF74FFF09079787401F0A3F0121D
-:103ABD000BA2E490797AF090798304F0122FDFE471
-:103ACD00907930F0907985F0A3F0A3F0122E9490B8
-:103ADD00792D7402F090798814F0C22FE4907968F2
-:103AED00F090798AF090796AF0A3F0751308751447
-:103AFD0008F516F515F51790798CF090798BF02265
-:103B0D007B017A787958907803EBF0A3EAF0A3E97A
-:103B1D00F07440120C8A907803E0FBA3E0FAA3E066
-:103B2D00F9900001740A120C9C900002120DF6001F
-:103B3D0000BB80900006120DF60000AC4490000A08
-:103B4D00120DF600017700907804E475F00F120C59
-:103B5D00F4907803E0FBA3E0FAA3E0F97440120CB3
-:103B6D008A907803E0FBA3E0FAA3E0F990000174DA
-:103B7D008C120C9C900002120DF60000BB80900080
-:103B8D0006120DF60000AC4490000A120DF600016D
-:103B9D007700907804E475F00F120CF4907803E040
-:103BAD00FBA3E0FAA3E0F97440120C8A907803E0CD
-:103BBD00FBA3E0FAA3E0F9900001748F120C9C9026
-:103BCD007804E475F00F120CF4907803E0FBA3E099
-:103BDD00FAA3E0F97441120C8A907803E0FBA3E09C
-:103BED00FAA3E0F99000017484120C9C907804E41F
-:103BFD0075F00F120CF4907803E0FBA3E0FAA3E04C
-:103C0D00F97461120C8A907803E0FBA3E0FAA3E04B
-:103C1D00F99000017481120C9C907804E475F00FFA
-:103C2D00120CF4907803E0FBA3E0FAA3E0F97461C1
-:103C3D00120C8A907803E0FBA3E0FAA3E0F9900060
-:063C4D00017401120C9C41
-:013C5300224E
-:103C5400C0E0C0F0C083C082C0D0E8C0E0E9C0E0EA
-:103C6400EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EFA5
-:023C7400C0E0AE
-:103C7600907FA2E0F50B907F74E0907970F0907FD2
-:103C860075E0907971F0907983E0FFFE5402FE7042
-:103C96000DEF4402F0122FDF9079747401F0E50BFA
-:103CA60020E228907970E0FEA3E07C002400F51164
-:103CB600EC3EF510907982E0FDAE10AF11120CBE0D
-:103CC600907970EFF09079897401F01248431248A8
-:103CD60076907989E064017032124108907989E41E
-:103CE600F0907F98E04440F0907F9EE04440F09052
-:103CF6007F957480F075E80112093275E80D907FA2
-:103D06009574C0F075E80DD220800575E801C220D3
-:103D160020202B90792DE0FFB40109750C67750DF5
-:103D260006750E0BEFB40209750C00750D00750EC5
-:103D36000CEFB40309750C00750D00750E1875CAE5
-:103D46006F75CBFED2CA5391EF907FAB7402F0F041
-:103D5600D0E0FFD0E0FED0E0FDD0E0FCD0E0FBD02C
-:103D6600E0FAD0E0F9D0E0F8D0D0D082D083D0F01D
-:033D7600D0E03268
-:103D790075332575342490795C7401F0A37478F057
-:103D8900A374B2F0202F02C117E4F5357522019012
-:103D9900795CE0FBA3E0FAA3E0F9900004120C5D62
-:103DA900F53675350674422535F582E43479F5839F
-:103DB900E536F00535E535B40CEBE535C3940D4032
-:103DC90002C198E52264016002C198907FA5E04490
-:103DD90080F0907FA6E533F01246C0744F2535F583
-:103DE90082E43479F583E0907FA6F01246C07442EC
-:103DF9002535F582E43479F583E0907FA6F0124603
-:103E0900C0907FA57440F0120ACD053580ACE4F569
-:103E19003575220190795CE0FBA3E0FAA3E0F99003
-:103E29000004120C5DF53675350674352535F582B5
-:103E3900E43479F583E536F00535E535B40CEBE581
-:103E490035C3940D5049E52264017043907FA5E084
-:103E59004480F0907FA6E533F01246C0744F2535B3
-:103E6900F582E43479F583E0907FA6F01246C074B8
-:103E7900352535F582E43479F583E0907FA6F01293
-:0F3E890046C0907FA57440F0120ACD053580B079
-:013E98002207
-:103E99009078097401F0A37478F0A374B2F0E4FF88
-:103EA900FE907809E0FBA3E0FAA3E0F9EF120C8A8F
-:103EB900907809E0FBA3E0FAA3E0F9900001E4128D
-:103EC9000C9C9000027415120C9C900003E4120CD7
-:103ED9009C90000474FF120C9C900005E4120C9C49
-:103EE90090000674C3120C9C900007E4120C9C907D
-:103EF9000008E4120C9C900009E4120C9C90000A42
-:103F09007401120C9C90780AE475F00B120CF40FF2
-:103F19000EBE078D9078097401F0A37478F0A3742C
-:103F2900FFF0E4FFFE907809E0FBA3E0FAA3E0F9D3
-:103F3900EF120C8A907809E0FBA3E0FAA3E0F9906C
-:103F49000001E4120C9C9000027415120C9C900064
-:103F590003E4120C9C9000047480120C9C900005E0
-:103F6900E4120C9C90000674C3120C9C900007E4A8
-:103F7900120C9C900008E4120C9C900009E4120CAD
-:103F89009C90000A7401120C9C90780AE475F00B5D
-:083F9900120CF40F0EBE038DA3
-:013FA10022FD
-:103FA200E4FE753DFF753E05753F12AB3DAA3EA985
-:103FB2003F900001120C5D6402702FCDEECD0EED2C
-:103FC2006F700122900002120D0A85F03BF53C62EF
-:103FD2003BE53B623CE53C623B29FDE53B3AC9EDF2
-:103FE200C9753DFFF53E893F80C17B007A007900AB
-:013FF20022AC
-:093FF30053D8EF43D820C22D324F
-:043FFC005391DF32CC
-:10400000907987E0B4011D907985E0B401031242F4
-:10401000AA907986E0B40103121800E4907985F043
-:10402000A3F0A3F0122E94907F9BE0F50A5402F5C2
-:104030000A700490797FF0907F9BE0F50A5402FFAC
-:10404000F50ABF020690797F7401F0907F9BE0F53E
-:104050000A5420F50A700490797EF0907F9BE0F579
-:104060000A5420FFF50ABF200690797E7401F09073
-:10407000797FE0FF907981E06F6038907978740201
-:10408000F0907984E0907979F0EFB40106E054FE85
-:10409000F08007907979E04401F0907979E09079A7
-:1040A00084F0A2AFE433F512C2AF120BA2E51260A6
-:1040B00002D2AF90797EE0FF907980E06F60389017
-:1040C00079787401F090797CE0907979F0EFB4011F
-:1040D00006E04404F08007907979E054FBF0907991
-:1040E00079E090797CF0A2AFE433F512C2AF120B05
-:1040F000A2E5126002D2AF90797FE0907981F090D2
-:08410000797EE0907980F02245
-:1041080090792DE064017035907970E0FFD3942D9B
-:10411800402B9079697401F0907968E004F0E0D35D
-:10412800940F4019E4F0EFD39431400890792D743E
-:1041380003F0800690792D7402F012100090792D0A
-:10414800E0B4022C907970E0FFC3942F5022EFD393
-:10415800942A401C9079697401F0907968E004F021
-:10416800E0D3940F400AE4F090792D04F012100087
-:1041780090792DE0B40226907970E0D39431401DF7
-:104188009079697401F0907968E004F0E0D3940FB5
-:10419800400BE4F090792D7403F012100090792D03
-:1041A800E06403703F907970E0FFC3945F503590EE
-:1041B80079697401F0907968E004F0E0D3940F40D5
-:1041C80023E4F0EFC3942F500CEFD3942A400690C9
-:1041D800792D7401F0EFD3942F400690792D740255
-:1041E800F0121000907969E07005907968F022E487
-:0541F800907969F0223E
-:1041FD007B017A78794C907806EBF0A3EAF0A3E98D
-:10420D00F0E4120C8A907806E0FBA3E0FAA3E0F943
-:10421D009000017401120C9C907807E475F0031264
-:10422D000CF4907806E0FBA3E0FAA3E0F9E4120C9D
-:10423D008A907806E0FBA3E0FAA3E0F99000017400
-:10424D0002120C9C907807E475F003120CF4907830
-:10425D0006E0FBA3E0FAA3E0F9E4120C8A907806DD
-:10426D00E0FBA3E0FAA3E0F99000017403120C9CAB
-:10427D00907807E475F003120CF4907806E0FBA338
-:10428D00E0FAA3E0F9E4120C8A907806E0FBA3E0D3
-:0C429D00FAA3E0F99000017404120C9CDC
-:0142A90022F2
-:1042AA00E4FFFE7B0190780C04F0A37478F0A37409
-:1042BA002BF090780CE0FBA3E0FAA3E0F99000025F
-:1042CA00120C5DFD90799AE06D6013EFC39405506E
-:1042DA000D0F90780DE475F003120CF480D48D3331
-:1042EA0090780CE0FBA3E0FAA3E0F9900001120C2D
-:1042FA005DFD90799BE0FC6D6013EEC3940B500D4D
-:10430A000E90780DE475F003120CF480D38C34EF20
-:10431A0064056003BE0B08907FB4E04401F022906C
-:10432A00780CE0FBA3E0FAA3E0F9120C44FF24F0B6
-:10433A006008240E700E12494D22907920E534F05F
-:0B434A00121B2A22907FB4E04401F017
-:014355002245
-:0C435600787FE4F6D8FD75813F02439D9E
-:104362000248A9E493A3F8E493A34003F68001F280
-:1043720008DFF48029E493A3F85407240CC8C3335C
-:10438200C4540F4420C8834004F456800146F6DF2B
-:10439200E4800B0102040810204080904661E47E14
-:1043A200019360BCA3FF543F30E509541FFEE49320
-:1043B200A360010ECF54C025E060A840B8E493A3E7
-:1043C200FAE493A3F8E493A3C8C582C8CAC583CA12
-:1043D200F0A3C8C582C8CAC583CADFE9DEE780BECA
-:1043E200C0E0C0F0C083C082C0D0E8C0E0E9C0E055
-:1043F200EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EF10
-:10440200C0E0C2CAC2CF90797AE0B4011F124BAEAB
-:1044120012475853A8A0907FAEE4F01207AA124B9D
-:10442200B7907FAE741FF043A805800353A8A05332
-:10443200A8FA75E80112091575E80D43A805D0E040
-:10444200FFD0E0FED0E0FDD0E0FCD0E0FBD0E0FA0F
-:10445200D0E0F9D0E0F8D0D0D082D083D0F0D0E054
-:014462003227
-:10446300907FECE0F50914601D14602A1460371482
-:10447300604424047050907962E0907F00F0907F54
-:10448300B57401F08047907963E0907F00F0907FEE
-:10449300B57401F08037907964E0907F00F0907FED
-:1044A300B57401F08027907966E0907F00F0907FEB
-:1044B300B57401F08017907967E0907F00F0907FEA
-:0F44C300B57401F08007907FB4E04401F0D3227C
-:0444D2008D368B3761
-:1044D600123FA2EA496057120C447E0029FFEE3AC9
-:1044E600C9EFC97538FFF539893AAB38AA39A93AFF
-:1044F600900001120C5DFF64046005EF6405702EE8
-:10450600EFB40415900002120C5D6536700B900036
-:1045160003120C5D6537700122120C447E0029FFE0
-:10452600EE3AC9EFC97538FFF539893A80BC7B0088
-:044536007A0079008E
-:01453A00225E
-:10453B00E4FF7B0190781C04F0A37478F0A3744C17
-:10454B00F090781CE0FBA3E0FAA3E0F990000212D4
-:10455B000C5DFE907FECE06E6013EFC39404500D86
-:10456B0090781DE475F003120CF40F80D4BF04098E
-:10457B00907FB4E04401F08014907921E0FF9078B3
-:10458B001CE0FBA3E0FAA3E0F9EF120C8A907FC5C5
-:03459B007401F0B8
-:01459E0022FA
-:0E459F00C0E0C083C082C0D0EEC0E0EFC0E03C
-:1045AD00907985E064016005A3E0B4012D907987D1
-:1045BD007401F0E4FF907FC5E0FEEFC39E501B74C5
-:1045CD00C02FF582E4347EF583E0FE74212FF58251
-:1045DD00E43479F583EEF00F80DB5391EF907FAAF1
-:0445ED00E04401F0B5
-:0F45F100D0E0FFD0E0FED0D0D082D083D0E03237
-:10460000E4FF7B0190781904F0A37478F0A3744C54
-:10461000F0907819E0FBA3E0FAA3E0F99000021211
-:104620000C5DFE907FECE06E6013EFC39404500DC0
-:1046300090781AE475F003120CF40F80D4BF0408CC
-:10464000907FB4E04401F022907819E0FBA3E0FAF7
-:10465000A3E0F9120C44907F00F0907FB57401F054
-:014660002237
-:1046610001180201190A011C00C128C129011F01F9
-:0F46710044799F000000004179A3004179A40023
-:0446800041798900F3
-:10468400012201417931FF417934004D79353F3FB1
-:1046940000080001000000000000154D79423F3F72
-:1046A40006080407000000000000154D794F0A0AAF
-:0B46B4000900010902030405060708C5
-:0146BF0000FA
-:1046C000120ACD907FA5E0F521E5215401F5216482
-:1046D000016028E52264017022907FA5E0F5215455
-:1046E00002F5217003752201907FA5E0F5215404A5
-:0C46F000FFF521BF04D375220180CE220B
-:0446FC0053D8F73266
-:104700000249FA00023C54000217E400024A120077
-:104710000237A2000247FF00024A410002459F0003
-:1047200002498E000249AB00024A5800024A6F005B
-:10473000024A8600024A9D00024AB400024ACB00A7
-:10474000024AE200024AF900024B1000024B270025
-:08475000024B3E00024B550034
-:10475800E518701490798CE004F090798BE0C3949C
-:10476800004015E014F0801090798BE004F0A3E08D
-:10477800C394004003E014F090798BE0D394144084
-:1047880004E4F518F090798CE0D39414400575187A
-:0447980001E4F02226
-:10479C00907FD7E0F533907FECE0F50914601114AD
-:1047AC00601B24027024907FEAE0907962F08021F3
-:1047BC00907FEAE0907963F01210008014907FEA09
-:1047CC00E0907964F01228018007907FB4E04401F6
-:0247DC00F0D318
-:0147DE0022B8
-:1047DF009079787404F0907933E0907979F0A2AF02
-:1047EF00E433F512C2AF120BA2E5126002D2AF2270
-:0147FF003287
-:024800008F36F1
-:10480200E4F5377538FF753907753A01AB38AA39BF
-:10481200A93A900001120C5DB4031FAF370537EFC0
-:104822006536700122120C447E0029FFEE3AC9EF70
-:10483200C97538FFF539893A80D27B007A00790050
-:014842002253
-:1048430030262FC22690792DE0FFB40109E4F50C40
-:10485300750DF8750E0AEFB40209E4F50C750DF049
-:10486300750E0BEFB40309E4F50C750DF8750E170F
-:03487300D222222C
-:1048760030252FC22590792DE0FFB40109750CC0B3
-:10488600750D14750E0BEFB40209E4F50C750D10D9
-:10489600750E0CEFB40309E4F50C750D18750E18BA
-:0348A600D22222F9
-:1048A900E4F532120F50202E10E532C3940250095C
-:1048B9000532D23012490580ED302E05121457C247
-:0F48C9002E302D0612079A1248D912400080EAAD
-:0148D80022BD
-:1048D900907FD6E0F51D5480F51D6480701DC2AF30
-:1048E900E04480F0E04401F07F0C7E00124B6C90B4
-:0C48F9007FD6E054FEF05387FED2AF22C1
-:10490500907FD6E054FBF0E04408F0303004E044FA
-:1049150002F07FDC7E05124B6C907FD6E054F7F0F9
-:05492500E04404F02253
-:10492A00907FEBE0147014907FE9E0247F7004120A
-:10493A00460022907FB4E04401F022907FB4E04424
-:03494A0001F02257
-:10494D00907FEBE0147013907FE9E0147004124532
-:10495D003B22907FB4E04401F022907FB4E044010B
-:02496D00F02236
-:10496F00E4FF74E82FF582E4347FF583E0FE74965C
-:0E497F002FF582E43479F583EEF00FBF08E4E3
-:01498D002207
-:10498E00C0E0C083C0825391EF907FA9E04402F053
-:0D499E00907FB77403F0D082D083D0E03258
-:1049AB00C0E0C083C0825391EF907FAAE04402F035
-:0D49BB00907FC77403F0D082D083D0E0322B
-:1049C800907FD6E030E712E04401F07F147E0012B9
-:0A49D8004B6C907FD6E054FEF022F5
-:1049E200E4F51A751B0190799104F0A3F0E4A3F0A9
-:0849F200A3740AF0E4A3F02213
-:1049FA00C0E0C083C082D22E5391EF907FAB740186
-:084A0A00F0D082D083D0E0322D
-:104A1200C0E0C083C082D22D5391EF907FAB740867
-:084A2200F0D082D083D0E03215
-:104A2A00907FEAE0F508E4907962F0A3F0A3F090B1
-:074A3A007966F0A3F0D3221E
-:104A4100C0E0C083C0825391EF907FA9E04401F0A0
-:074A5100D082D083D0E032D7
-:104A5800C0E0C083C0825391EF907FA9E04404F086
-:074A6800D082D083D0E032C0
-:104A6F00C0E0C083C0825391EF907FAAE04404F06E
-:074A7F00D082D083D0E032A9
-:104A8600C0E0C083C0825391EF907FA9E04408F054
-:074A9600D082D083D0E03292
-:104A9D00C0E0C083C0825391EF907FAAE04408F03C
-:074AAD00D082D083D0E0327B
-:104AB400C0E0C083C0825391EF907FA9E04410F01E
-:074AC400D082D083D0E03264
-:104ACB00C0E0C083C0825391EF907FAAE04410F006
-:074ADB00D082D083D0E0324D
-:104AE200C0E0C083C0825391EF907FA9E04420F0E0
-:074AF200D082D083D0E03236
-:104AF900C0E0C083C0825391EF907FAAE04420F0C8
-:074B0900D082D083D0E0321E
-:104B1000C0E0C083C0825391EF907FA9E04440F091
-:074B2000D082D083D0E03207
-:104B2700C0E0C083C0825391EF907FAAE04440F079
-:074B3700D082D083D0E032F0
-:104B3E00C0E0C083C0825391EF907FA9E04480F023
-:074B4E00D082D083D0E032D9
-:104B5500C0E0C083C0825391EF907FAAE04480F00B
-:074B6500D082D083D0E032C2
-:104B6C008E338F34E5341534AE33700215334E600A
-:074B7C000512078980EE22FB
-:0F4B8300907FEAE0B4FF041230002212360E22B7
-:0E4B9200C0E0C28BD224302302C223D0E03216
-:0E4BA000907F00E508F0907FB57401F0D322FD
-:094BAE00302405C224751801220F
-:094BB700302305C223E4F51822A5
-:074BC00053C0FE53C0FD329B
-:064BC70053917FD225325C
-:054BCD00C289D2233271
-:034BD200C28D325F
-:034BD500C28F325A
-:024BD800D322E6
-:024BDA00D322E4
-:024BDC00D322E2
-:024BDE00D322E0
-:024BE000D322DE
-:024BE200D322DC
-:024BE400C322EA
-:014BE60022AC
-:00000001FF
-/*
- * This firmware is for the Emagic EMI 2|6 Audio Interface
- *
- * The firmware contained herein is Copyright (c) 1999-2002 Emagic
- * as an unpublished work. This notice does not imply unrestricted
- * or public access to this firmware which is a trade secret of Emagic,
- * and which may not be reproduced, used, sold or transferred to
- * any third party without Emagic's written consent. All Rights Reserved.
- *
- * This firmware may not be modified and may only be used with the
- * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of
- * any driver which includes this firmware, in whole or in part,
- * requires the inclusion of this statement.
- */
-/*
-VERSION=1.0.2.916
-DATE=12.02.2002
-*/
diff --git a/firmware/emi26/loader.HEX b/firmware/emi26/loader.HEX
deleted file mode 100644
index 77c439f6565b..000000000000
--- a/firmware/emi26/loader.HEX
+++ /dev/null
@@ -1,116 +0,0 @@
-:0300000002031CDC
-:03004300020400B4
-:10010000907FE9E0245B6060240260030201BE90FE
-:100110007FEAE0750A00F50BA3E0FEE4EE420A90E8
-:100120007FEEE0751500F516A3E0FEE4EE4215E55E
-:1001300016451570030201BEE4907FC5F0907FB4B0
-:10014000E020E3F9907FC5E0F50C120277AF0C7E5A
-:1001500000EF250BF50BEE350AF50AC3E5169FF502
-:1001600016E5159EF51580C7907FEAE0750A00F543
-:100170000BA3E0FEE4EE420A907FEEE0751500F579
-:1001800016A3E0FEE4EE4215E51645156030E49056
-:100190007FC5F0907FB4E020E3F9907FC5E0F50CD7
-:1001A00012028FAF0C7E00EF250BF50BEE350AF532
-:0F01B0000AC3E5169FF516E5159EF51580CAC31F
-:0101BF00221D
-:1001C000C220D2E843D820907FAB74FFF0907FA983
-:1001D000F0907FAAF05391EF907F95E044C0F090AB
-:1001E0007F98E044C0F0907F9EE044C0F0E4907FB0
-:1001F00094F0907F9DE0440FF0907F97E054F0F0F2
-:10020000907FAFE04401F0907FAEE0440DF0D2AFBC
-:10021000907F97E054F0F020204275140075130091
-:100220007512007511007F487E927D007C00AB1432
-:10023000AA13A912A811C312049A50DB2020D87A5D
-:100240000079007800E5142401F514EA3513F5135C
-:10025000E93512F512E83511F51180CA3020FD128A
-:1002600001005007907FB4E04401F0907FB4E04477
-:0602700002F0C22080E64E
-:010276002265
-:10027700E50CFFE50BF582E50AF58375927E74C000
-:08028700F8E208F0A3DFFA22FF
-:10028F00907F96858392A8827902900000E0B40057
-:10029F00377401F0907F93E054FCF0907F96E05418
-:1002AF00FCF0907F9CE04403F0907F94E0547FF04B
-:1002BF00907F97E04480F0907F9DE04480F0907FA6
-:1002CF0097E0547FF04480F0E50CFF907EC0E0F59E
-:1002DF0028E4A24733F269F2E4A24633F269F2E46A
-:1002EF00A24533F269F2E4A24433F269F2E4A24385
-:1002FF0033F269F2E4A24233F269F2E4A24133F23B
-:0D030F0069F2E4A24033F269F2A3DFC222DA
-:0C031C00787FE4F6D8FD758129020363A8
-:100328000201C0E493A3F8E493A34003F68001F22A
-:1003380008DFF48029E493A3F85407240CC8C333D6
-:10034800C4540F4420C8834004F456800146F6DFA5
-:10035800E4800B0102040810204080900484E47EAD
-:10036800019360BCA3FF543F30E509541FFEE4939A
-:10037800A360010ECF54C025E060A840B8E493A361
-:10038800FAE493A3F8E493A3C8C582C8CAC583CA8C
-:10039800F0A3C8C582C8CAC583CADFE9DEE780BE44
-:1003A800C0E0C083C082907FC4E4F05391EF907F97
-:0B03B800AB7404F0D082D083D0E032A0
-:1003C300C0E0C083C082D2205391EF907FAB740111
-:0803D300F0D082D083D0E032AB
-:1003DB00C0E0C083C0825391EF907FAB7402F0D02A
-:0603EB0082D083D0E03255
-:0103F10032D9
-:0103F20032D8
-:0103F30032D7
-:0103F40032D6
-:0103F50032D5
-:0103F60032D4
-:0103F70032D3
-:0103F80032D2
-:0103F90032D1
-:0103FA0032D0
-:0103FB0032CF
-:0103FC0032CE
-:0103FD0032CD
-:0103FE0032CC
-:0103FF0032CB
-:100400000203C3000203DB000203A80002046E0023
-:10041000020458000203F1000203F2000203F30099
-:100420000203F4000203F5000203F6000203F700E2
-:100430000203F8000203F9000203FA000203FB00C2
-:100440000203FC000203FD000203FE000203FF00A2
-:080450000204AB000204AC0041
-:10045800C0E0C083C0825391EF907FAB7410F0D09E
-:0604680082D083D0E032D7
-:10046E00C0E0C083C0825391EF907FAB7408F0D090
-:06047E0082D083D0E032C1
-:10048400020A000F010C11040D00000000410000DD
-:010494000067
-:04049500021700004A
-:010499000062
-:10049A00EB9FF5F0EA9E42F0E99D42F0E89C45F0B8
-:0104AA00222F
-:0104AB00321E
-:0104AC00321D
-:1011000012011001000000406A0801010001010203
-:10111000000109022000010103A0000904000002EF
-:10112000FF0000040705820240000007050202409C
-:10113000000004030904260341006E0063006800F8
-:101140006F007200200043006800690070007300A7
-:101150002C00200049006E0063002E00280346008A
-:10116000690072006D007700610072006500200068
-:101170004600720061006D00650057006F0072004C
-:101180006B0073002A0343006F006E006600690065
-:101190006700750072006100740069006F006E00E6
-:1011A000200053007400720069006E006700220383
-:1011B00049006E0074006500720066006100630003
-:1011C0006500200053007400720069006E00670023
-:0211D00000001D
-:00000001FF
-/*
- * This firmware is for the Emagic EMI 2|6 Audio Interface
- *
- * The firmware contained herein is Copyright (c) 1999-2002 Emagic
- * as an unpublished work. This notice does not imply unrestricted
- * or public access to this firmware which is a trade secret of Emagic,
- * and which may not be reproduced, used, sold or transferred to
- * any third party without Emagic's written consent. All Rights Reserved.
- *
- * This firmware may not be modified and may only be used with the
- * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of
- * any driver which includes this firmware, in whole or in part,
- * requires the inclusion of this statement.
- */
diff --git a/firmware/emi62/bitstream.HEX b/firmware/emi62/bitstream.HEX
deleted file mode 100644
index a0f4f570f076..000000000000
--- a/firmware/emi62/bitstream.HEX
+++ /dev/null
@@ -1,6107 +0,0 @@
-:10801000FFFFFFFFAA9955663000800100000007AE
-:10802000300160010000000D3001200100803F2D73
-:108030003000C00100000000300080010000000995
-:10804000300020010000000030008001000000012D
-:10805000300040005000581A80121000000000004C
-:108060000000000000000000000000000000000010
-:108070000000000000000000000000000000000000
-:10808000000000000000014004800000000000002B
-:1080900000121000000000000000000000000000BE
-:1080A00000000000000000000000000000000000D0
-:1080B0000000000000000000000000000000014877
-:1080C000048000000000000000020000000000002A
-:1080D00000000000000000000000000000000000A0
-:1080E0000000000000000000000000000000000090
-:1080F000000000000000000000C0000000000000C0
-:10810000000200000000000000000000000000006D
-:10811000000000000000000000000000000000005F
-:10812000000000000000000000000000000000004F
-:1081300000800000000000000012000000000000AD
-:10814000000000000000000000000000000000002F
-:10815000000000000000000000000000000000001F
-:10816000000000000000000004800000000000008B
-:10817000801200000000000000000000000000006D
-:1081800000000000000000000000000000000000EF
-:1081900000000000000000000000000000000000DF
-:1081A000009000000000000000120000000000002D
-:1081B00000000000000000000000000000000000BF
-:1081C00000000000000000000000000000000000AF
-:1081D0000000000000000008049000000000000003
-:1081E0007F100034000D00034000D0003400050073
-:1081F000074001D00074001D00074001D00074004A
-:108200001D8007E001B8006E001B8006E0013837D2
-:10821000C490000000000000C001FC80FB3036C8A4
-:108220004E0903FC84FF103BC00EC8072280FF22CA
-:1082300033C00FC8336E00FB803F200DC253D48083
-:10824000CC3A3F000CF103F0007000000000000089
-:108250008000ED60BF6023F00D82123C608F7023C0
-:10826000F0088802A540BFD063D60B88022E0CBB55
-:10827000802E20888D02E64080602E300AB11220C8
-:1082800004300000000000008805CC80A3402CC40E
-:108290004A00128C88A32220C40A904204A9A30099
-:1082A00024C88B8002CC00B3002E01090802840090
-:1082B00080202C100A3242220170000000000000D1
-:1082C000C015AC04B3002AC00808A28C008B00A221
-:1082D000C1109842A700BB0166C10B8002AC04BB71
-:1082E000002E000BB812E40289080E400AB00230DA
-:1082F00004600000000000000010AC00EB003EC075
-:108300004AB823EC18EB0032C00E2C122210EB00FE
-:1083100026C04F0043ED00FB002E240D8013E40027
-:10832000C8D07C120EB003400470000000000000B2
-:10833000E100BC00FF0035C04FE0037C08FF0117DF
-:10834000C24DC003F408F7003BC007C0037C80FFA8
-:10835000243F400CF001F404BC083F280FF00378E0
-:1083600000600000000000004010AC08FB043AC8A8
-:108370000F9403EC10F30034C00EB0036104FB0053
-:1083800036C00EA3032C80FB723E020F8A03E40268
-:10839000C9802A500FB003D0042000000000000064
-:1083A000CA443C00BF0003C00880037C00BF003FFC
-:1083B000E20890436000BF0037C00890016D00BB29
-:1083C000402C100BB042D7C089002A7C0BF002F27F
-:1083D0000040000000000000E2054C00B30020D582
-:1083E0004A00000C0493000CF00B09020801B320B2
-:1083F00028C00A0C0A0E00B3002430090002C6107F
-:10840000804220008BB002F8005000000000000005
-:1084100022011E00B79421E448D9125E40B790298A
-:10842000E08B6912D68037822CE8084A025E00B7DA
-:10843000A42D200B7902D608869029A00B7902D8AA
-:10844000004000000000000048000C00FBA028E8ED
-:108450000E2A028C00D30064C00F00430EC4F30048
-:1084600078EC0E0A430E2073E03C024F0003C44038
-:10847000C30038C00F3003D202000000000000002B
-:10848000401DBC00FF00BCCC0EB003EC20FB003C48
-:10849000C20C20036C50F30036C40F4003FC08FFED
-:1084A0001A3F800FF001E430FF023FC00FF063D0AD
-:1084B0000660000000000000A815EC40FB00B2D8E8
-:1084C0000CB0012D20DB013AC88C3803A800FB4812
-:1084D0003EC90F8003EC40FB013E000F0803A408D7
-:1084E000FA80B2800FB1026A007000000000000044
-:1084F00048191C80BF3021CA08F00A0C808F502117
-:10850000C20870509C00B70039C40B40029C04B7ED
-:108510002025400B70021480B60021800BF8021257
-:108520000460000000000000C0009E00B7B021EC15
-:108530000B7812DE8497800DE028F802DE00B790F9
-:108540002DE40B68825E80B7A029200B48029600BC
-:10855000B78021E10B7A027040200000000000008B
-:108560004804CC00B30020C00B38028C04830028E0
-:10857000C08839024C40B30428C01B10028C01B3E0
-:108580000424884B31020400B38020F20B30020235
-:108590002430000000000000E805A800FA00328046
-:1085A0000FE803E800DA013A808CED03FB04FA00DF
-:1085B0003E800F6C03FBC8BEC21F800FE503A800FE
-:1085C000FE4833804FA0037A0460000000000000E2
-:1085D0004800E000F8003C000C81936000F8013690
-:1085E000100F8003A020F8002A018F8413E100F807
-:1085F0001836000F8013E000F8203E140F8003D2DD
-:1086000080300000000000000800E400F100AA40F3
-:108610000C90032400E10038401C9003E400F9A012
-:108620003A40479A93A280F8103E400B9403E640EC
-:10863000F9C03E680B100302843000000000000007
-:108640008004E404B9002240089002240489003622
-:1086500040089002E404B9802E404F94036110E872
-:10866000402E400B9042E604B9002E400B900220B1
-:10867000001000000000000018042400B90022408F
-:108680000A10520404A9042A4008B002E401B90007
-:108690002E400B9002A80DB8402E40099402E50030
-:1086A000B9042E400B9002060040000000000000BC
-:1086B00008040480B12020C80A10420490812004DC
-:1086C000C8083026C400B1202C480B90024501B1E7
-:1086D000402C400B1282C400B12B2C4A0B12820298
-:1086E0000100000000000000B8082148F8503200E6
-:1086F0004E850B2140A8522A00088023E140F80053
-:108700003A140FA043A800F8003E000F8203E000D7
-:10871000F0203E884F820B2E035000000000000026
-:108720009819E440F91134442DD003E450791038FD
-:10873000442FD003F510F9103E45065003E500E93B
-:10874000403F400FD043F500FD283F400F9283E6A5
-:1087500006700000000000000801E600D9903769AB
-:108760004D90236780D9E037680ED007A4000586B6
-:108770003E660D50232600C9823D400DD8073602C3
-:10878000CDC033600C9C03060070000000000000A8
-:108790003810E28088A22210288A82238488A022AE
-:1087A00014488042820088402E30088002A200D8FF
-:1087B00090260008840A2100C8A0A214288C020E6A
-:1087C00004300000000000000805C52091402C4442
-:1087D0001810028504B1400C400A10068430814014
-:1087E0002C4859101A046081092E401B14022500E0
-:1087F00091E02060081602000170000000000000F7
-:108800001815A40081002A41089002A400A1002AA2
-:108810004108B08224118B002E40189102A00498C8
-:10882000202E541B90822C0089102244889002062E
-:108830000460000000000000A015E400D9003E40E4
-:108840004C9003A410F9003E408E1002A4C2C9004F
-:108850003E400D16130184C8203C600F90120400A6
-:10886000D94032500C9003288470000000000000B2
-:1088700028018400F90036404F994A44009900B419
-:10888000400F9013E600F9003C400F9003E300F81E
-:108890000136400C9903E402F9803E604F900BCA08
-:1088A00000600000000000002810A000D8003C007C
-:1088B0001D80032000E80032000C8483E010E820D3
-:1088C00032008E84032180C8003A190F0403E0248B
-:1088D000F0023C000F80138A04200000000000001A
-:1088E000280528028A010FA268A00028008A0077C4
-:1088F0008068E012E800DE00368108E0037A08AE06
-:10890000C42F8008ED02FA00BEA03B800BA0420AF3
-:10891000004000000000000028854C0093002CC09F
-:1089200088B0020C14A30420C4183802EC1093542D
-:1089300028C00A00024E00834968C0023942CE4076
-:10894000B3002CE60BB0028B0050000000000000CA
-:1089500020011C0887202C8018F2221C008710217F
-:10896000C0087082DC8096802DC00A40027D4027BE
-:10897000646DD0486042D805B60429C04B72022805
-:10898000004000000000000028083E88D7E03DE0DD
-:10899000087C423E00E38220E00C6803DF04D780BD
-:1089A0003BE04E480A5E80C7C219E00E7803D60845
-:1089B000F7803DE00FF803AA02000000000000006D
-:1089C000081DAC40FB407E800E3683ED40DB603EF0
-:1089D000800FA003ED28DA0032C40CB00BCC00FBF2
-:1089E000003EC00E8013E010F8003E000FB153C2ED
-:1089F00006600000000000004005FE00FFC033E0FC
-:108A00000CF9037F04CFD03FE40FB803FE00FF94BE
-:108A10003FE00FC8037E10F3803BE00FF803FE48F1
-:108A2000ED80332404F803300070000000000000E3
-:108A3000A8119C80BF04212808F8021EC0CF9021F5
-:108A40004C0B5A42DE00B7802CE80B04021C00B726
-:108A5000A035108F7113DEC0841021800D71022AA1
-:108A6000046000000000000080409C08B70025C89A
-:108A7000087102CC80970029C08B7206DC08B50013
-:108A80002DC80B40021C40BF1021C00B7402D480C3
-:108A9000A7402141087002040020000000000000EF
-:108AA0006014CC00B3002400083482AC1183002091
-:108AB000004B1826CF20B1062CC10B32020E08B392
-:108AC0008824320A301284088000A034283002182A
-:108AD0000430000000000000A811BC00FF00B640F8
-:108AE0002CF443FC01DF003A00039203FF88F900F5
-:108AF0002FC01B0E4B2E90FBE030320B9802EC087F
-:108B00006BC032C008F0093E0460000000000000A5
-:108B10008000EC00F3003AC00FB0016C00FB003A9B
-:108B2000100FB403EC00F0003CC00F800BAD20FB35
-:108B3000403E1007A863E000FB803ED80FB003E082
-:108B400000300000000000000110FC00FF00720077
-:108B50000FF023FC00DF003F400FC003DC008F005C
-:108B600033C10CC003BE00FF903B280E59032E00FA
-:108B70007B0032C40FB003D00430000000000000BE
-:108B8000C1046C00BB0062A00FB002EC098B002E88
-:108B9000300BA803AC00FAC122C1088C022C00B330
-:108BA000812A000D88B22200B3C022C80BB04261F6
-:108BB000401000000000000080056C00BB01226234
-:108BC0000BB002EC048B002EA2498826EC00A88092
-:108BD00022C028820AACA0BB0822C008800A2884D0
-:108BE000B9C0A2000BB002E000400000000000008D
-:108BF00008040C00B31020480A3202CC8083012400
-:108C0000000B02068C60A02020C80801020C00B3F3
-:108C10000028000920020880B100A0800B30024229
-:108C2000010000000000000000096C00FF00A20E1F
-:108C30000BF103FC08CF203EC00F8003FC84A8206A
-:108C4000B2C88C8003AC44FB703AC00E90032CA4D5
-:108C5000FB00B2400FB003C0035000000000000052
-:108C6000A01DFC00FF263E000FB613ED00FB103FD9
-:108C7000000FC113AC80F8123EC64F4243FC04FF04
-:108C8000313F000FF003EC00FF00BFC08FF003E89E
-:108C90000670000000000000C001FC40FC8036C8E7
-:108CA0000F0903C200F8C033CC2C4C036390E09052
-:108CB0003AC00D500B3C04DF643FC88DF1432C00DB
-:108CC000D50033C045F223700070000000000000A2
-:108CD0008010ED80BA0221DE8B8222E020B0002BD2
-:108CE000EC098002E340BA202FDC0898122C008B9C
-:108CF000512AD00872222E008D8021D008B6822001
-:108D000004300000000000008805CC40B92824C0D1
-:108D10004A12128885A82020C00B2202C091A1000F
-:108D200028C20B00128C40A32020C40B300A0C1167
-:108D3000990020C5090102620170000000000000D6
-:108D4000C011AC00B88022C00B8802EE01B8C12A65
-:108D5000C01BA806E200BB802EC08A8002AC00AB1C
-:108D6000002EC00AB0022C00990024C008800230F6
-:108D700004600000000000004015EC00B08036C028
-:108D80000EA813E285F3C032C00E9C23E724E882CC
-:108D90003AC10F9403AC02EB003EC00FB0032E109B
-:108DA0005100B2C00DB0035004700000000000007C
-:108DB000E001BC00FF003FC08FD003F004FD043F82
-:108DC000C04CC003F010FC001FC00DD1231C00C715
-:108DD0000039C00DF083FE44ED003BC00F7403F872
-:108DE00000600000000000004010AC00F901BAC1B2
-:108DF0000CB003A108FA0030C88F94032500F900D5
-:108E00003CC00F0483EC00FB003EE00F710B2C40D4
-:108E1000FD0837C04E9103900420000000000000C0
-:108E2000C8053C00B90023C00890022400C80037E0
-:108E3000F00B80016400490233C0849C033C00BFF6
-:108E4000020FD008F4020E10BD8033E008900A3201
-:108E50000040000000000000E0054C00B00620C00B
-:108E60000800428400A00020F00B0022CC009000FB
-:108E700028C0023D028C00B3002CC29A38020604BE
-:108E8000B11220E00830023800500000000000005D
-:108E900020011E00B68021E028EA02368086906517
-:108EA000E01BDA065E019E8425EC0A78025E00B7BC
-:108EB000802DE008794A1640BD8025E00838020878
-:108EC000004000000000000048080C00FB0028E003
-:108ED0000818028A88A1A020C21F2A23E6C8F0C071
-:108EE0003AED4E34028C08F3811EC00E30030EC0E2
-:108EF000F100B0CA0E210392020000000000000041
-:108F0000401DBC08FE103FD20FE003EC04FF147EAE
-:108F1000C00FB123FC01EE003AC40DB013BC00FF3A
-:108F2000003FC00EF083FC0CFD103BC02FE103D0CE
-:108F30000660000000000000A805EC40F08032D080
-:108F40000CA0036C00F38032DA0FB003EC00FB00DE
-:108F50003ECC4C98132C10FB043EC40CF283A6109C
-:108F6000DD203FD10CB003EA0070000000000000DB
-:108F700048119C80B70021C80C7002DC08B70021A2
-:108F8000C80E7022D800B7002CC20A700A1F08B79A
-:108F90000039C80A70021400C5692CCA2A7002D2AE
-:108FA0000460000000000000C0009E00BF8164E17A
-:108FB0000878025A01BF8021EC4B78469F08378021
-:108FC0002DE88818021E81B7B02DE0097A028E00C4
-:108FD00095A02DE4087802F00020000000000000B9
-:108FE0004814EC00B36020C008B602CC00B30120E6
-:108FF000C08AB086CF00BB106CC10A38020C01B326
-:109000000228C00BB00A0C0081002EC00AB482D224
-:109010000430000000000000E815A800FE40B68003
-:109020000CE4037880FE7432800BE603F900FE0046
-:109030003E800CE0032800FA003E804DA003A8000B
-:10904000DA043E800CE403FA046000000000000033
-:109050004800E000F8003E002E8023E000F8013CCC
-:10906000000E8003E020F8203E018F8903E000F825
-:10907000003A100E8001E000E8407E004F8003D2ED
-:1090800000300000000000000810E402C9017E402A
-:109090002C900B2400F9003E68059013A404D9001D
-:1090A00032410E9103E400F9003E600E900324006B
-:1090B000F10032406890438204300000000000005C
-:1090C0008004640089006E400890422400B9002E9C
-:1090D000708890032400B9002240089812E400B977
-:1090E000002E400A900A2600B980A2400890122063
-:1090F00000100000000000001805240089042C4026
-:109100000890022401B9002A400BB002A401B90062
-:10911000E0400A9082A400B9002C480A98022480FA
-:10912000392022402A900286004000000000000002
-:109130000804048081002C480810120410B1042C8B
-:10914000D80A10020400B1002048081002C480B1FF
-:10915000222C508A328205A0B12A204A0A128202A9
-:109160000100000000000000B80D6150C8522E142C
-:109170000C85032140F8503A001F8503A140F850A8
-:1091800032140E8003A140F8503C800E0203208070
-:10919000FA2032080E8213AE0350000000000000D7
-:1091A000981DE450FD003E440FD003F400FD003E46
-:1091B000448DD001BD00FD023E440FD400E4487947
-:1091C000143E500F92A2F408FD003E4A0DD283E6F1
-:1091D00006700000000000001805E700F9103A6E64
-:1091E0000CB103E440F9443B618E9403E400E94090
-:1091F00032660FDA0BA728C9E03F680CDA83B32088
-:10920000EDA0337908D8034600700000000000008C
-:109210003810E200B8A02E38088A02E288E8812ED1
-:1092200014090A03E280B88032300B85022101A8BC
-:10923000F4382A080ECA2390C8543438088A920E8B
-:1092400004300000000000000805C500B1002840FF
-:10925000191002C400B12028400B1006C420A1A29E
-:109260006C480B1002840881202C50091002C404A1
-:10927000B1002458083C02420170000000000000C8
-:109280001815A401B9202C40099002E410A9402E21
-:10929000400B9002A400B1012A400B94022400A9C3
-:1092A000002A4001105264008900264000980246BE
-:1092B0000460000000000000A015E400F9613A40DD
-:1092C0000D9083E520F9013A402E9002E440E90137
-:1092D0009E400F9403A40089003E402D9002E608B2
-:1092E000B90136402C9001680470000000000000B5
-:1092F0002801A400F9003E402E9003E480F9003CD0
-:10930000400C9C23E400F90036400F10438400F920
-:10931000023E400E90038080F9003C402F90038A6B
-:1093200000600000000000002810A000C8403601C6
-:109330000D8403E100E8403E080C8003E100F800E2
-:1093400032008F8003A010F80032040E808360008A
-:10935000F8003E000C00030A04200000000000009A
-:10936000280528008A01228008A024E8000A002F8E
-:10937000801AA0022800BA0016800BE0032808EA31
-:1093800000339008EC1B2280C6142F9108A0434A9A
-:10939000004000000000000028054C00930024C09D
-:1093A000093012CC04A3046CC00930028C00B30055
-:1093B0002CC01330028C00B300E6B80A380244080F
-:1093C00082502CD23A30028A005000000000000087
-:1093D000A0010E8097B421C4497102DE8187212D3E
-:1093E000D00B7B021C01BF2029C40B30025C00A7FC
-:1093F000A121C04A708A0C8184002DD00A5002E855
-:109400000040000000000000A8081E82DFA034EC2D
-:109410000D7902FE80E7E82FA0097A029E00F7A2EC
-:1094200025EA0B48039E04FFC065E40E68035F0055
-:10943000E4803DE00EF803AA0200000000000000F6
-:10944000081DAC48EB053ED90EB203EC00FB603EB4
-:10945000C00EB283AC00F350A6C04FB003AC00FB0B
-:10946000803FD80DA003EC0AF9003EC00D900342E6
-:1094700006600000000000000005FE00BB903EE01A
-:109480000839039E20CF8277E01FF803EE00FFC06B
-:109490003FE50DF903EE00FB9037A008F80F1E0022
-:1094A000CC9433600DF803C0007000000000000091
-:1094B000A8119C00B7902FE4087A021E008F122595
-:1094C000D80BBB021E00B7002DE8087D82DE40BB32
-:1094D000A027900A76025C80850037C44D7103EAAC
-:1094E000046000000000000000009C00B7202DC0B8
-:1094F00029F222BC80970025410B70129C00B7080E
-:1095000029C0084212DC40B70029C0096022DC10E3
-:1095100080002140097002C000200000000000000F
-:109520002014CC00B3C02EC00834822D0093002438
-:10953000C00B30020F8013002CC00A34A2EC00B321
-:109540000028C00B0002CC00810020C00930028935
-:109550000430000000000000A811BC00FFE03FC084
-:109560000CF483BD00DF0836400B7542FC20FF8001
-:109570003BC02C3C03FC00BF00BEC08D900BAC0276
-:10958000CA0022800DB002EA046000000000000062
-:109590008000EC00FB081EC00FB013EC00EB003A9B
-:1095A000100FB023AC01FB003EC03C8403EC00FB79
-:1095B0000026400E940B2C00F9403E900E9013E0D4
-:1095C00000300000000000000110DC02CF003FC0AE
-:1095D0000DF00B3C20CF003D000EF0079C01CF02A8
-:1095E0003EC00FC4033C00CF000FC00E44031F0257
-:1095F000CC003F802C7003004430000000000000CD
-:1096000081046C008B022EC00DB0022C00AB000652
-:109610002008B003FC00AB002EC00F8006BC00ABDE
-:10962000043AF00C88022C00C9803A9208900AA0F3
-:10963000401000000000000080052C00AB002EC090
-:109640000930022C008B0026600BB002AC008B00AE
-:109650006EC00BB0422C009B004CE00A90222C0004
-:109660008AC22C4008B042200040000000000000E8
-:1096700008040C00830D2CC60931020D81A31124AE
-:10968000008AB1E24C80A3002CCC0B02028C80A398
-:109690004808C008000A0D00810028C00830028276
-:1096A0000100000000000000000D6C00CB202FC85E
-:1096B0008DF6132DB08F0036400FF002ADA88F103D
-:1096C0003FCA0B80922C10DB403FC00E00032D04DC
-:1096D000C8023E400CB00300035000000000000030
-:1096E000A01DFC00FF003FC80EF103EC84FF2037F3
-:1096F000000DB203BCA0FF003EC90E8003FD11FFA8
-:10970000003BC00EC003FC80ED003BC00FF043687F
-:109710000670000000000000C001FC90CC923BC825
-:109720000DF0837310FF2837CA4FB203FC00DF200F
-:10973000B3C40D6843FE14CB8433E00D7803BE0040
-:10974000FF8037A00CF30330007000000000000021
-:109750008000FC48822103F40FF64220048A602B2B
-:10976000DA0BF9023F048F5223D54D8802AE00DB9D
-:109770008036C00880022004B80022600D7403E027
-:1097800000300000000000008805CCA0800108C067
-:109790004B30824290A3082CC81A30228D009300CF
-:1097A00024C809A0120C04AB0062C009B002CC00AE
-:1097B000B3002880083606A20170000000000000F7
-:1097C000C015AC00880822C00A301A001182000AB5
-:1097D000C00BB0422C008B0026C0099102EC20BBCC
-:1097E0002866C00880026000B8002A4081B006F8F0
-:1097F00004600000000000000015EC02C8043AC03C
-:1098000089B0036800E9C11EC10E3003EC00DB0023
-:1098100036C10D00230E00EB8032C8CD3032EC088B
-:10982000F3003C800CB006800470000000000000D3
-:10983000E0019C007C003FC00BB043FD00BEC4377C
-:10984000C01FF0035C00FF013BC00EC803BF20DF58
-:10985000003FD00FC013B0007C00B7400FF01BB02A
-:1098600000600000000000004010AC0CD84132C085
-:109870000EB007A8016940B2C08DB0A3EC08F30098
-:1098800032C00F8003ED00FB483AC00DB0832C00BE
-:10989000FB203E800F7023D0042000000000000059
-:1098A000C8053C00880023C008F0062C10885137FA
-:1098B000C008F0077D608F0237C00B8C002D00B30D
-:1098C0000038C00880822000B8002E500BF0003213
-:1098D0000040000000000000E0054C00980028C097
-:1098E0000A30028404A30000C06839060C109320DB
-:1098F00022C09B01A08F14331428C0093C020C0124
-:1099000093402C880B3002B800500000000000008B
-:1099100060011E10878029E00878023E00839024B1
-:10992000E0087810CE04079125E083C9021E04B731
-:10993000842BA408484212CCB4802D640B78021901
-:10994000004000000000000048002C00D01028C893
-:109950000E3B028400E34030C80C38628C00530098
-:1099600030C41F00238C3CF38018C00D30030E80E0
-:10997000D3103C800F300392000000000000000074
-:10998000401DBD00F912B4C007B003CC004A0077F7
-:10999000C00E71436C00F3003FD01FD053AC68FB86
-:1099A000183DC00FC013F050FC043F400FF403906B
-:1099B0000660000000000000A805ED40F8043ED25B
-:1099C0000FB313E010F900B2CC0EBA036D80DB02C6
-:1099D00032DC4F00036C04F30236400EB003CC00BF
-:1099E0004B003C800CF1036200700000000000009E
-:1099F00048119C00B4002DC90B7082DC00BC04210E
-:109A0000C44B37020CA08F7421C00B40021C81B7DD
-:109A1000202BC0084002D00284002D400AF202121E
-:109A20000460000000000000C0009E80B4C02DE46F
-:109A30000B7A02D200B58821E80A7802DE4097004E
-:109A400021E80BCC465E28B7C421F00A7802FE0854
-:109A500097842DA00878027000200000000000000C
-:109A60000814CC00B0C02CC09BB002CC20B3602244
-:109A7000C00B30028C00830120C01B06164F00B3C0
-:109A8000A02AF0080002E00090002C400A300202F8
-:109A90000430000000000000E815A810FEC03E8061
-:109AA0000FA003F908FE4022800EA003E800D200B8
-:109AB00032808FE0035800F60033B00E2002E80C2D
-:109AC000D2023C800CA0037A046000000000000079
-:109AD0004800E000F8203E010B8003E000F0403E2B
-:109AE000005780230000F8003E000F8403A03038A8
-:109AF000003A080FC403F000EC003F100F8003D2BF
-:109B000000300000000000000810E400D9013C48CB
-:109B10004C900B2401C9C03240AC9003E400D94002
-:109B200030400D9A032284C81432400E9003240062
-:109B3000C90082682C90030204300000000000007D
-:109B40008004640089002E4008902224008902824B
-:109B500040089002E740898036418D1802A024A871
-:109B600004624008948324008901227208900B202B
-:109B700000100000000000001805040099002A40B1
-:109B8000289012040089002240089002A420990025
-:109B900022401890062001880862400A9002341082
-:109BA0008D812341081002060040000000000000E3
-:109BB0000804048081042C48081202040283202037
-:109BC00048081202C48083602448193462A504A1A5
-:109BD00002604008D00254008D0029400812820221
-:109BE0000100000000000000B80D6140D8503A802C
-:109BF0000C85022144885032144C8043E000D80088
-:109C000022140C80032000C800A2000E8003200054
-:109C1000C80033000C82032E035000000000000037
-:109C2000981DE444FD003E440F9103F410FF103EE4
-:109C3000440F9103E440F9103E440BF013E510F992
-:109C4000403F4A2F928AA4A2F92836400F9283A659
-:109C500006700000000000001811E6C0C1003F6956
-:109C60000C9A436C00FDA03E782CD807D602D596FE
-:109C700032780D90032700FDA0355006D403E5008F
-:109C8000FD40B3400F98A3460070000000000000A4
-:109C90003810E3C288882E14A88AC222A0B8C02C2B
-:109CA00024488402E10098C4203C088A822380B8BA
-:109CB000042220088803A200B8A022000B88020E0C
-:109CC00004300000000000000805C480A1206C40A2
-:109CD0000A14024404A1682C48081402C5008160DB
-:109CE00020481990028581B14024680A1242C4803C
-:109CF000B92020408B10824201700000000000005B
-:109D00001805A410A9006EC00A10022414B9002E70
-:109D100040089012E40099002240088006A060B933
-:109D2000092260089002A400B90002400B10060648
-:109D30000460000000000000A005E400E9803E414E
-:109D40000E90036400E9C03E400C9002E400C9009C
-:109D500022410D8002A304F14036400E9002E4003F
-:109D6000F10012400F900368047000000000000032
-:109D70002801A400D9223E420D9003E400B9C43C5E
-:109D8000400F9003E400E902AE400F804B6210F9EF
-:109D9000203E400F9003E400F9027E410F9013CA69
-:109DA000006000000000000028008000C8003800AB
-:109DB0000F8020E000A82032000C8007E080C8005F
-:109DC00038000D80832110F86032008E80B32008A7
-:109DD000F8003E000C8003CA0420000000000000D0
-:109DE000280528048A00339043A02228008E80761C
-:109DF0008008E1031900868022800D60017800BE92
-:109E00000036800CE402A810BEA02F800DA0020A2C
-:109E1000004000000000000028114C0403042CD472
-:109E20000B30024C01A3C420C02835028600838079
-:109E300028C00838060E9430C0A2C00B3C020C00AB
-:109E4000B3802C480830028A005000000000000057
-:109E5000A0010C048F8021C11B72421EC083882187
-:109E6000C01828061021863821C019F7025DC0B439
-:109E70004127D00878C69C00B7002F6009720228DD
-:109E80000040000000000000A8081E02C7802DA0AE
-:109E90000F3E03FE80A780A1E00C7802940085A00D
-:109EA00039E40C78131E90B58431E00FF8871E0456
-:109EB000F7803D600C3B03AA020000000000000098
-:109EC000081DADE4FB543E800FB423EC32FB003E92
-:109ED000D84FA003E400F9003EC00F3033EC04F289
-:109EE000013EC00FB203FE10FB683C410FF04382FD
-:109EF00006600000000000004005FE00CFE43FE4E3
-:109F00000CFC037E80CF8133FA0FF803F600FF804C
-:109F10003FE20F79033E40F48033600CE8033E00DB
-:109F2000FF8033600CF883500070000000000000D8
-:109F3000A8119C00D7A02DC408BA023CA0872021FC
-:109F4000C00F5203D400B6102DC08B73035C40B415
-:109F5000B02B482841020C00BF1835462872422A0F
-:109F6000046000000000000018009C0087412D44A0
-:109F70000A73029CC481006DC88B7002D400B700C4
-:109F80002DC00BF0469C55B42025401860821C0063
-:109F9000B700234008704644002000000000000085
-:109FA0006014CC0093002C400BB0020C8280C020C7
-:109FB000C00A10020400B3002CC01B3000CD01B059
-:109FC00040AC78888C060D60B34C241208300A1817
-:109FD0000430000000000000B815BC00C7002E408F
-:109FE0000EF02ABF00C8C8BFC00B9002E404BF0037
-:109FF0003FC00FB20AAC00F88034490CB90B3F00E7
-:10A00000FBC030F00CF0036E0460000000000000A4
-:10A010008000CC00FB803E412CB013AC00F8003E29
-:10A02000C10FA003E800FA403EC00FB00B6D40F82E
-:10A03000103A400FB003EC10FE403EC00FF003E1B9
-:10A0400000300000000000000010EC0CDF003B803E
-:10A050000FF00B3C08E70833C00BD023740054000A
-:10A0600033C00FF083BE20FD0C3B602CE0033C00AE
-:10A07000CF1233500C300380043000000000000089
-:10A0800081046C04AB0022A00BB0060C00AB403680
-:10A09000C00BA8026600B80036C10B3443EE00B214
-:10A0A00000226008B4828C048A21224008B0022079
-:10A0B000401000000000000080052C009B002A20BA
-:10A0C0000BB0022C0088C522C00B8882E601BB08B9
-:10A0D00022C00AB282AC60B8024AC408B1022C00A5
-:10A0E000830022C008B002A0004000000000000071
-:10A0F00008040C00AB2020010B32062C00A000202D
-:10A10000C0090422C400B20024C18BB0024C00B0CC
-:10A110000062C0483002AC10820020C00830020249
-:10A120000100000000000000000D7C08DF2A3A005A
-:10A130000FF5123C10C900A3C00F8053EC01DA00E8
-:10A1400033C00EB003AC04F8703AC00C60432C422C
-:10A15000CD00B2402CF0038003500000000000004E
-:10A16000A019FC00FB013D000FB417FC003C003FB0
-:10A17000C04FC0037408FE003FC04FF003FC08F856
-:10A18000303FC00FF003FC04FC003D000FF003E87B
-:10A190000670000000000000C005F490EF003FD8FA
-:10A1A0000EF3032C01D48037CC0D89431250EC2CD4
-:10A1B00032050DB0533CD4C5947FA08FF0433000DE
-:10A1C000DC0033000C4807F00050000000000000E5
-:10A1D0008010E6408B702FDC08F7020C808A20008C
-:10A1E000C84A2202A0008A48225888FD02AD02A96E
-:10A1F000201EA00380022C048B0022C04C88076024
-:10A2000004300000000000008805C000232C2CC989
-:10A210000230020C68A0282CD00912028400A02170
-:10A22000201819302280D083060CA00BB006001233
-:10A23000A000200029000EA2017000000000000014
-:10A24000C011A8308B002EC04A300A2C14A0800AFE
-:10A25000C108888687008300224908B006A040AB69
-:10A260002022200B800A0C04AB0222C0888002F05E
-:10A2700004600000000000004015EF40EB063EC007
-:10A280000EB0032C02F9A03EC00D8C03AA10E940C9
-:10A29000B2480DB043AD00CB862E200F3003240012
-:10A2A000F98032C00D0CC290047000000000000064
-:10A2B000E0019400FF003DC00DF0037C00DF00379B
-:10A2C000C00FE003F000FE203F400F7003FE00FFD0
-:10A2D000827F000FC003F904DE20BD000FD90B7C84
-:10A2E00000600000000000004010AC01CB003EC048
-:10A2F0002CB00B2C00E8403EC00F94072900C94049
-:10A30000B2C00FB0030102CB0032044FF04334C09F
-:10A31000B51A3FC10F8093D0042000000000000058
-:10A32000C80528008F002FC008F0023C04D8002B7D
-:10A33000C00C804560007B5822C80BFA0161408B3D
-:10A340000032044BCE0228003A402E070B90022622
-:10A350000040000000000000E0054C0083014CC0FC
-:10A360000B3002EC1090002AC00A8006C00483045F
-:10A37000A289193006CC00830020900B30C248001F
-:10A38000B24024200B0900B800500000000000007B
-:10A390002001060487A42DE0093802DE009E8129F1
-:10A3A000E0087852FAC0968001A08B3A22CE408F06
-:10A3B000B025A00B08025608B5902DE44BD8220C0E
-:10A3C00000400000000000004808080283802EE8DA
-:10A3D0000B3813CE41D31028C00E3A02C6084B40AA
-:10A3E00030600D3B27CFC4C3A030000F304348403E
-:10A3F000F2003C040F020392020000000000000083
-:10A40000401DB800FF003FC40EF1033C00FF0133C4
-:10A41000C04DB1077C90FF003F4003F1037000FB8B
-:10A42000103B000FC00BB400FD003FC40FD00390E1
-:10A430000260000000000000A805EC04FB843AC2A2
-:10A440004CB4932C04E9003AC48D08032E00CB01D0
-:10A4500032808FB283EC00CB8032000FF9033C10C6
-:10A46000DF81B3E08CA003EA007000000000000070
-:10A4700048119408B70424C81A304A1D00B7012DAA
-:10A48000C08870061C00820021804B7612DC008799
-:10A490000029408B40021000BC002001287003B24C
-:10A4A0000460000000000000C0009A00B3902DE49A
-:10A4B0000979021E80A7802CE819F8125E018780B6
-:10A4C00025E04B7806D200978021620B3A021E00ED
-:10A4D000B78629F0086806E00020000000000000B0
-:10A4E0004814CFC0B30024C08A30320C00B3082C0B
-:10A4F000C00830120E20830024F10B3006CE0083FA
-:10A500009028600B002A2180B008280008370292AA
-:10A510000430000000000000E815B900FA003E8099
-:10A520004DA0032800EE413E800DE00378008E40F0
-:10A5300027A80BA003FB02CA8233A00FA013290097
-:10A54000FA403A800C6C03FA04600000000000003E
-:10A550004800C000F8003A000C8003E008F8003E14
-:10A56000008F8023A042F809BA104F8003E060F802
-:10A57000003E200FC003F000FC0027008F800392F4
-:10A5800000300000000000000810E50089003E4097
-:10A590006E9003A408C9003C400D90032410F9A05C
-:10A5A00032420C9013C400C9003E400F9003E440B7
-:10A5B000C9203E52CF900902043000000000000084
-:10A5C0008004660089042E400890022400D9003AD5
-:10A5D00041089005A400B940A2400D9002E54689CB
-:10A5E000002E400B9012E500A9C82E618B944220EA
-:10A5F000001000000000000018012400A9006C40B9
-:10A600004810228403A9002E40099002E404B108F6
-:10A610002840189802E50089002E400B9002F42093
-:10A620008D002F400B944286004000000000000087
-:10A6300008040480A1242C481812020480A10028D8
-:10A6400048081002840091202048091202C4948115
-:10A65000002C610B5A82D4A0A5282D4A0B900282AF
-:10A660000100000000000000B80D6002E8502E1448
-:10A670000E8503A140A8503E140D85018140F8527B
-:10A6800032940C8013C142C0513E008F8203E0809F
-:10A69000C8203F080F8003AE0350000000000000F8
-:10A6A0009819F450D9113E448F9143E440DD003AAB
-:10A6B000444FD027B400FD123F444F9143F440FD76
-:10A6C000003F410F9283E4A0F9283E4A0FD0036671
-:10A6D00006700000000000001811F680E9C03E7806
-:10A6E0008F9B03A780C94036780F1023E504DDA4B3
-:10A6F00033620FDA03F660C91033400E9893E630E8
-:10A70000C9C932788CD00B06007000000000000030
-:10A710003810E00088E22E300B88422340A0A122AE
-:10A72000380B8A02E280AAE022300B8023AB028839
-:10A73000A02A000B8C02E30088E023380880020E78
-:10A7400004300000000000000805C500A14428589E
-:10A75000431622848181202C58491080C48191485D
-:10A760006C4A0B14024484810160400A5286D4A0D2
-:10A770008500A150689006D2017000000000000022
-:10A780001805A60089002E400B90020400A9602243
-:10A79000400B9502E410B1004E400B9066AC8089EE
-:10A7A000002A600B9052F40085002140089002C6F8
-:10A7B0000460000000000000A005E620E9003E4023
-:10A7C0000F9003A410C90036400F9401E520D94032
-:10A7D000BA688F9007E600C91032620E9002E41842
-:10A7E000C90032400C9003E8047000000000000033
-:10A7F0002801A400F9043E400B90036400F9003ED8
-:10A80000408F9003E400E90272680F9003E600F9BC
-:10A81000013E420F9003C402F9043E404F90031AD8
-:10A82000006000000000000028008002C800320024
-:10A830000C80036000C84036000F8403A000D8508D
-:10A84000B2108C8103C120C8003E000FC013F00479
-:10A850004C003F000F80030A0420000000000000AD
-:10A8600028152A008A04228128A01228008A01368D
-:10A87000800BA0102810CE0123810CA812FB008AA7
-:10A88000013B8083A042E8108A002F800B60420ABF
-:10A89000004000000000000028054C008300A0C01C
-:10A8A00018B000CC009B0024C00B30066C00A3083D
-:10A8B00028C8093002CC438B002C800B3002CC021C
-:10A8C00083012CC04B30004A005000000000000003
-:10A8D000A0010C24879421E4183102DC8097102514
-:10A8E000CD0BF2027C00A00028E0187002DC01878A
-:10A8F000342940094002D00484042D004BD0226842
-:10A900000040000000000000A8081600CFA070E979
-:10A91000187B03FF4097A035E80F74025E20E480A7
-:10A9200039A02D7803FE00C7803DE05F6843C20078
-:10A93000C4841D600F78036A02000000000000005C
-:10A94000080DA4003B002ED80FB4032D8AEB623A09
-:10A95000D00FB2870CD0D80032C04F9043EC00FB30
-:10A96000083E408F9003FC00FF043F800F002B82C5
-:10A9700006600000000000000005F600FFA03EF4A5
-:10A980000EB803EE084BF07FF40CF923EE487890F4
-:10A9900032E40CF903FE00FF803FE41C79032E40F3
-:10A9A000FF8033E02C7807000070000000000000FA
-:10A9B000A8119400B3000CE50B3802FE808F806173
-:10A9C000C42878004E00F48425A80C7002CC04B38F
-:10A9D0009025400C41835240B410A3000C52036AEE
-:10A9E000046000000000000000009400B7216DC862
-:10A9F0004B7002DC42A73129C4087202DC00B72880
-:10AA00002480087006D420B7012DC1086002508050
-:10AA1000B4082162097406800020000000000000D4
-:10AA20002014C704B3002CC00BB002CC00A30260FA
-:10AA3000C00838024E44A0C02491083002C000B3C0
-:10AA4000002460081C024C88B3C020A008000A88BB
-:10AA50000430000000000000A815AC00FF002FC06B
-:10AA60004FF013FC08E78A3FC00CF5C2FE10BBC0D4
-:10AA700032D40C3013E304BF002E6208B9026E001A
-:10AA8000FB0132A44D9402AB046000000000000002
-:10AA90008000EC60FB001EC00FB013EC005B003ABE
-:10AAA000C00FB041EC007B45BA402EB015E001FB71
-:10AAB000003E500EC003F040FC203F508F900160DC
-:10AAC00000300000000000000110F400FF003FC053
-:10AAD0008FF0031C02CF0036C00DF0037C007F2AEC
-:10AAE0003F800FF8139021CF003F620CE00330004D
-:10AAF000F8003F000FD00380443000000000000049
-:10AB000081046411BB002EC00BB0022C00DB0432A8
-:10AB1000C00EB002EC00BB842E400BB94222428B27
-:10AB2000012C720A90422C00BB002EC28F8806E0D6
-:10AB3000001000000000000080012400BB006EC077
-:10AB400048B0422C008B0026C00AB012EC00BB407B
-:10AB50002EC80BB0122C008B002E480A30026C005D
-:10AB6000BB002E804B9802E0004000000000000077
-:10AB700008040400B3006CC24B31020C509B20202F
-:10AB8000C00A3212CC80B3006C0C0B31020C428331
-:10AB9000082E400A00020080B0002C410B10024237
-:10ABA0000100000000000000000D6400BB403FCC2D
-:10ABB0000EF0833DA0CF2037C00CF7C3FD48F30053
-:10ABC0003E880FB413A5008F303E400CA003608078
-:10ABD000F8003E000F9023C003500000000000006A
-:10ABE000A019F400FF293FC90FF013FC94EF123BAA
-:10ABF000C08EB207FD04FF103F0C0FF003F000FB06
-:10AC0000203D400FD043FC40FF043FC00EC043E84E
-:10AC10000670000000000000C005FCA2C7203F2411
-:10AC20000CF0033C80CC0933D10CF123FC20DF363F
-:10AC30003FC00E4803FE00FF8037E40D780311A0EB
-:10AC4000CF0037C80CF00330017000000000000096
-:10AC50008010FF008FD12E080DB6123D45F96427F4
-:10AC6000D088BA14CC048F4023F00B88022E04BB8A
-:10AC700080AEC008B80A210088D0222028B0022067
-:10AC800004200000000000008805CC0093002E0086
-:10AC90000A34828CA0A00824D8093102CC20B33217
-:10ACA00028D04A8002CC0CBB00224089B0026080D0
-:10ACB000930024D00B3002A20130000000000000FD
-:10ACC000C011AC009B002E2009B04A2C02A0000647
-:10ACD000C009B000EC00AB002AC00B88026C00BBBE
-:10ACE000202AE241B82A600A980026000BB002B878
-:10ACF00004600000000000004015EC08DB023E206C
-:10AD00004CB0032C028B2012C029B012EC00FB00C7
-:10AD10003AC00E8803ED20FBC834F00DBA0347603B
-:10AD2000C90036400FB00B90047000000000000016
-:10AD3000E0019C00EF000F000F3000FC00DF90BB33
-:10AD4000C0CEF003FC04CB0017C00FC003BC84FFCF
-:10AD50000037C00ED063B800EA003A800C300370B0
-:10AD600000600000000000004010AC00FB02320058
-:10AD70000FB0532C00FA0032C08FB0072C00FB003C
-:10AD8000B2C00F8007AC80DB247ED00EB0237404E9
-:10AD9000DD08B5400CB003100420000000000000E6
-:10ADA000C8053C00BFC0A0001BF0023F60EA502372
-:10ADB000C008FA07FC00DF0063C04818022D00B38A
-:10ADC000006EC00D3A032400828032800DF0033201
-:10ADD0000040000000000000E0054C14B359208042
-:10ADE0000930022E05B0442EC0093482EC00AB04B9
-:10ADF00020C00921B28E0493C024C00A18064C005A
-:10AE0000925020C008300270005000000000000086
-:10AE100020011E00B78061E00B780A5E01B1A02D11
-:10AE2000E00A78025E00079021E018C8021E00B711
-:10AE3000802DE08AD8023EC085802120197822002A
-:10AE4000004000000000000048080C00F3942010AF
-:10AE50004B30070C00F3003EC80F3003CC0023102A
-:10AE600000CB0520028C60930A2EC40A01074C8097
-:10AE7000D20130C02C300B5A02000000000000004C
-:10AE8000401DBC00FF010F400FF013BC00EF267304
-:10AE9000C20CB083BC40FF183DC04AC103FC00FB9C
-:10AEA000123FC44DC10BFC81FD003F200FF003D0C9
-:10AEB0000660000000000000A805EC20CB483E0022
-:10AEC0000CB0032D20E980FAC80DB003EE00DB249E
-:10AED00076F38E8033EC44EB103EC00F9003E80411
-:10AEE000DC00B3610CB0032A007000000000000019
-:10AEF00048118D0087202F012870020C848D0431A9
-:10AF0000CCC97202DD00373321D8084002DC00B71B
-:10AF1000203DC0095022F000970021800AFC0292D7
-:10AF20000460000000000000C0001E8287B02D20D9
-:10AF30000839021E41A78024E0097A328E8207A0D8
-:10AF400025E08B48021E00A7E12DE04B5800DA00F7
-:10AF5000A0802460087A0230002000000000000079
-:10AF60004814CC0083002C000830028C009300228F
-:10AF7000C1093042CC00830060C0081A02CE04B37D
-:10AF8000E028A0091C824B08A38024A02A30029A42
-:10AF90000410000000000000E815A800CA002F8877
-:10AFA0000CA0132800EE002E802DA003E800DA008C
-:10AFB00076800EE803BB80EE402FA28FE603EB867F
-:10AFC000FA8037820C20073A04600000000000007D
-:10AFD0004800E000F8401E000F800B6100E8C03A16
-:10AFE000000E8003E001F8007E101E8103E008F8E7
-:10AFF000003E000D8003C028DC503B000F8003D2D0
-:10B0000000300000000000000810C402C9003E42E9
-:10B010000F1003A600C9013A400E9401E410F10498
-:10B0200032400F9A232060F8040A420E9013240045
-:10B03000C10032400F900302043000000000000005
-:10B0400080046708A9006E400890022782890026C4
-:10B0500040089C03A410B90036409B1C1A2304B876
-:10B06000003A400E10022402C9A0A2400B900A2010
-:10B0700000100000000000001805258089042C4005
-:10B08000089002848199402E401A9006E401B9008C
-:10B09000A6411B90822100B8102E400A920AA401FA
-:10B0A0008F2223400B9002060040000000000000A9
-:10B0B00008040480A3202C4109120204808120246A
-:10B0C000480A3602C480B12004C84B14020500B1FE
-:10B0D0000528500A90020502850021400B12020249
-:10B0E0000100000000000000B80D6000C8006E14F0
-:10B0F0002C8502A140C8503A140E8002E140B050A5
-:10B1000032000B80032000FA003E000E8003A002F4
-:10B11000C80013000F82032E03500000000000003F
-:10B12000981DE448F9143F400C9103E442FD1036A9
-:10B13000440D9123A448F91138440FD003E5143984
-:10B14000427B408ED001F500A9403E50079683E631
-:10B1500006700000000000001801F680DDAE3A50D5
-:10B160000D9A0B7680CF8832702DDA03A701E99211
-:10B1700037680D9403E700EDA03A500FD003E702C3
-:10B18000CD8033680CD883060070000000000000FA
-:10B190003810E100884020200C8C02230088E02237
-:10B1A00030088402E300B8E022148D8802E300B87E
-:10B1B000502EA88B8022E34888502200088C020E73
-:10B1C00004300000000000000805C44091002A4837
-:10B1D0000914820520810820580911028588B14090
-:10B1E000A040081202C580A10028400B1802C484A8
-:10B1F000A10024500810920301700000000000001C
-:10B200001815AC109B002240089002040689042007
-:10B2100040099002E401B902224189A082E0A0B96C
-:10B22000282E440BB002E402B90026402810020682
-:10B230000460000000000000A015E400D9003840C0
-:10B240000D90032400C9A0A2408D9003A400F90032
-:10B2500036400C8413E200E9003A500F9C02E68469
-:10B26000E900B6400C9003280470000000000000C4
-:10B270002801A400E1003E680E1003A400F1283A62
-:10B28000400E9003E400F9003E420F8023E200F9F3
-:10B29000003E400F9123E440C1003A400F900BCA9A
-:10B2A000006000000000000028108000C80032008C
-:10B2B0000C8003A020C8403E000E81636000F004B3
-:10B2C0003C010C8403E000C8003E000E8003C10076
-:10B2D000D81032000C80230A042000000000000077
-:10B2E000280538608E0022800AA0023880BE003A0D
-:10B2F0008008E0022800BA00239818EC02F820AE7B
-:10B300000022800BE482E802CE4428800DA00A0AC5
-:10B310000040000000000000280540008204A0C09A
-:10B320000930028E0483506CC00A30860C00B300D2
-:10B3300028300A3612CC80810024C00B3206CC00A3
-:10B3400080886460281002020050000000000000A5
-:10B35000A0011012844021C80A72021000B7002D0B
-:10B36000CC0838121C00B3302000087182FE00A403
-:10B370008021C80B7002DC0187002C420951022099
-:10B380000040000000000000A8081200C28031F850
-:10B390004CFC139209C7803CED1E78271E00F78CE9
-:10B3A0007920087A03DE8184803DE00E7803FE2058
-:10B3B000C58135602C58032A0200000000000000FF
-:10B3C000081D8000F8043ED00FB013E000FB023AE5
-:10B3D000D00FA00BAC40FB003A002FB003CC00F024
-:10B3E000003AC40FB003FC41F3003A400F5093C23F
-:10B3F00006600000000000000005F600CC813FFC64
-:10B400001CF8037640EF923FE48CF803BF10FF80F6
-:10B41000B3200EF913FE24FD9437E01CF903EE006F
-:10B42000CD80B3E00C580200007000000000000066
-:10B43000A811944080002FC4087202DD08D7002DA7
-:10B44000CC08DE035C00B7042180C87083DC00B444
-:10B45000A02FC00C7002DE80870021C20A51422A50
-:10B4600004600000000000000000900084002DC86F
-:10B47000487002540CA7002CC08972025C00B31003
-:10B4800020000A7006DC00B4202DC0087002DC80A9
-:10B49000930020C0085002000020000000000000BF
-:10B4A0002014C00080002EC0083002C408A2422C24
-:10B4B000C10920024C00B3002080083C228C20B03F
-:10B4C000082EE0083810CF0A9340A0F00A100208B6
-:10B4D0000430000000000000A815A800C1003FC013
-:10B4E0002CF0036800AA003FC02D80037C00FF0001
-:10B4F00032000EB012ED24FA0827C810B8A2FF607F
-:10B5000098A0A2E00C50032A046000000000000094
-:10B510008000C906F8413EC00FB003E9105A203E32
-:10B52000C00E8003EC00F3007E010FB093ED00F835
-:10B53000403EC00EB003FC00E3083CC20FD013E055
-:10B5400000300000000000000110F302CC003BC2FC
-:10B550000CF023AE40DF8139C006D003FC00FF04AD
-:10B5600031410CF003FC00CCA037C20CF0037C048A
-:10B57000CD0033F00CD00308443000000000000080
-:10B5800081046000888022C00AB002E900AB442E2A
-:10B59000C0088802EC00BB00A2700AB402CC00A074
-:10B5A0002022C00FBC02CC0A8B80A2C00D900220CA
-:10B5B00040100000000000008005200089802AC0A3
-:10B5C00008B002CC0688602EC00A9806EC01BB00C9
-:10B5D000223102B202ECA08A0026C048A802EC0484
-:10B5E000A9802240089002200040000000000000D6
-:10B5F00008040000800020C00A3042CC0080012CEA
-:10B60000C01A1202CC00B30020004A3002CC00A0C5
-:10B610000008C00B2006ECA0A300A04029100002E7
-:10B620000100000000000000000D6000C8503BC099
-:10B630000CB003AC00C9003BC00E9283FC00BF00FD
-:10B6400012000CB003EC00882616C00C80175C803A
-:10B65000E90132402CD0030003500000000000003C
-:10B66000A01DD000FC203FC00FF003FC00FC003FF9
-:10B67000C00D8003FC08FF003F000FF003FC10F832
-:10B680004037C00EE021FC08DF003F400FD003E050
-:10B690000670000000000000C005FCC0FF217124FE
-:10B6A0000FF183F240FF0037C49FF2473D04C720EB
-:10B6B00033C00C7823FE40E81027C40FF2133C84FB
-:10B6C000C48133204CF023700070000000000000A3
-:10B6D0008010ED40BF5462C80BF602E000BBD022E0
-:10B6E000F01FF9123D809F812BE00AB812E8008F0D
-:10B6F0000422D008B38ABF428B8222E0288C022029
-:10B7000004300000000000008805CC00B3282808A1
-:10B710000B30068080B30224D10B30028D80931051
-:10B7200020CE8B3002CC84A1212CCC0A300A4C00D4
-:10B73000930028C0083C02220170000000000000B5
-:10B74000C015AC10BB026AE00BB002E108BB042AD2
-:10B75000C00AB0128C009B002AC00BB106C8808BB7
-:10B76000826AC10A3002AC1888102A480880023068
-:10B7700004600000000000004015EC00FB00AA304F
-:10B780000FB003A800F301B6C10BB002AC084B0028
-:10B79000B2C00FB802EC10A9813EC00FB0030C007C
-:10B7A000CBA018D00CB00310047000000000000003
-:10B7B000E001BC08F70037000FF003FD00FF003781
-:10B7C000C00FB0077C00E7003EC00AF003FE00F7A0
-:10B7D0000036C00CF003FC00FF8037E00FA003B878
-:10B7E00000600000000000004010AC00DB003600EC
-:10B7F0000EB0036900DB093AC01F3023EC08CB20F0
-:10B8000034C02FB003EC40EB483EC44DB08B6C000D
-:10B81000CB0032900F3003900420000000000000A5
-:10B82000C8053C008F00220048F0222C008F002326
-:10B83000E08BF5103C008F8023F08098032D44DBD3
-:10B840000023D408F8023C00830022C00BA48232FB
-:10B850000040000000000000E0054C0093002400C0
-:10B860000B30028400B30128F60934328C01B3D0C6
-:10B8700024E80A310A860083002AE00030028C00A6
-:10B88000830028C08938A278005000000000000022
-:10B8900020011E00979423E0093802320097A1216D
-:10B8A000E40B78021E40B7A025EC08FC023A009396
-:10B8B000B821E00878829E4087C029A00B58024832
-:10B8C000004000000000000048082C00DB0034208D
-:10B8D0000F3A038E00F3B028C40B3A03AE40F3A036
-:10B8E00034EE0F30238400E3F038C00CB00B8E42EE
-:10B8F000C30038C00F3063D2020000000000000017
-:10B90000401DBC00EB423AC41EB10788D1E3003FA2
-:10B91000C58FF163AC10CB503BC30FD103C800BB44
-:10B92000203BC02EF1031C00FF0037C04FD1039015
-:10B930000660000000000000A805EC40FB44B2C017
-:10B940004FB3432400DB1036C04CBE226D20CB50D9
-:10B950003EC94CB0132400CF2033C03DF0232CC08F
-:10B96000D8003E408F30032A007000000000000025
-:10B9700048119C04B76021C18BF0A2141087000FFE
-:10B98000C80D710A1D0087002CCC48702A9C0087C6
-:10B990000C21C00C72020CA287002DC00B70021289
-:10B9A0000460000000000000C0009E00B38021E0A1
-:10B9B0000B7A02DE00B78105E40879025C8087A07B
-:10B9C0002DE008F806B600878020E40A7B121E905E
-:10B9D00097882DE00B780E3000200000000000005A
-:10B9E0004814CC00B30020D00BB0026E34A3002C5E
-:10B9F000C10930024C0083002CC04810028D8083A6
-:10BA0000C000C08A30120C0080002C160B380212C5
-:10BA10000430000000000000E815A800FA00338898
-:10BA20000FA0037990FA0136801CA0036800CA00B9
-:10BA30003E812CA00BB90CCEE2B2808EA00B280068
-:10BA4000DA803CB00FE0833A0460000000000000A0
-:10BA50004800E000F0003E000F8003A000C8002E68
-:10BA6000000F8423A000F0403E100F8403E102F891
-:10BA7000483E100C8003C010F8803E000F0003D237
-:10BA800000300000000000000810E400D900364239
-:10BA90000F90032418F9103C48689213E400A91190
-:10BAA000B2600E91032600C90032600C1003240816
-:10BAB000C9003E400C90230204300000000000004A
-:10BAC00080046400890022400B9002A40889002EA3
-:10BAD00042489402E40089802270081422A402895A
-:10BAE000422A7028900A2400A9002E40289002A023
-:10BAF000001000000000000018050400990026C096
-:10BB00000390022401A9000E400A9046C40A89004D
-:10BB100020480A900205808141A05888900224089C
-:10BB20008D802FC008980206004000000000000031
-:10BB300008040480812020400B1202840081242C00
-:10BB4000580A3222C584A100205008B0028508811D
-:10BB500040205A0816820400A5002D400812828257
-:10BB60000100000000000000B80D6140D8503614FC
-:10BB70000F85230140E8003E000E8043C008CA0044
-:10BB800032800E80032000C00032082C02032008FF
-:10BB9000C8003F000C82032E03500000000000008C
-:10BBA000981DE440F9103F400F9143F404F9103E12
-:10BBB000440D1103E44459403E504F5043D402FD1C
-:10BBC000403E400F900BE500F9003E404FD003E6A9
-:10BBD000067000000000000018056660C9E03244ED
-:10BBE0000F9C03E400DD843F688FD842E6A0DDA40B
-:10BBF00033680D70032500C9E0B2680C9AC32600B3
-:10BC000099003E400F9A03060070000000000000FB
-:10BC10003810E3008880AA208B8802E288B8012EC1
-:10BC2000000B8402E2B088502214088002828088CF
-:10BC3000E0B63A08CEA2210888002E000BC4020EFE
-:10BC400004300000000000000805C48081606848DE
-:10BC50005B1602C420A1406C500B1402C400A1006A
-:10BC600024400B90221490854221505B501A1500FD
-:10BC700095002D400B510A82017000000000000069
-:10BC80001815A40189002A400B9046E400B9012E42
-:10BC9000400B9020E400B900264018B802A4028DA1
-:10BCA000082F408BD00224008D202F480BD0028615
-:10BCB0000460000000000000A015E400C90032404C
-:10BCC0000F9002E41049003E400F9002E400E901A9
-:10BCD00036400F18132410C98232407F902324006D
-:10BCE000D9203E720F9003A80470000000000000ED
-:10BCF00028018402F10116404F9003E510F9082E47
-:10BD0000400F9013E400C9013A401F9003E400F98A
-:10BD10002034408C9003C408F9003E600F10034AA1
-:10BD200000600000000000002810A008F8003E009D
-:10BD30000C80036000E8003E024F8013E000D0005A
-:10BD40003E000E81033000CC4033000CC00B20209D
-:10BD5000E8003E100FC003CA0420000000000000ED
-:10BD600028052804BA00228008A0022800BEC86F57
-:10BD7000800BE122A8008E202F800BE02368008A30
-:10BD800000228008E00229008A002EA80BA000CA29
-:10BD9000004000000000000028054C00B30024C053
-:10BDA0000930020C00B3C12CE00B38562C101300E4
-:10BDB0002EC00A386A2000880020000980224C42E8
-:10BDC000A3002CE00B2480CA0050000000000000FB
-:10BDD000A0011C08B7242FE00939021C01B6002D70
-:10BDE000900B60928E0086822DC20BF0025C06875B
-:10BDF0000060C02970025C0086002DC00B6002E864
-:10BE00000040000000000000A8081F40F3E43DE8E7
-:10BE10000D790B1EC067802DE00F70431D80D5008B
-:10BE20003D600E78031E00CD8031E00DC8034E004A
-:10BE3000E5803DE00F4803EA02000000000000003A
-:10BE4000081DAC80FB0070C06EB613AD40FA003E1A
-:10BE5000C00F20432D1859003E0003B00BE000FA3C
-:10BE600000BE000EB013AC00F8003EC00F8003C24D
-:10BE700006600000000000000005FE40FF803FE675
-:10BE80000FF8232E04FF903FE40DBA03FF40CF804C
-:10BE900022E10C39433210EC9033208EC803F200BB
-:10BEA000DF803F600FF803C000700000000000005A
-:10BEB000A8119C40B7903CE00B3A034E80F3B12DA3
-:10BEC000044C3823AE00808034E84D78023E8087F1
-:10BED000A029C0087002C08086022D410B7002EAC2
-:10BEE000046000000000000000009C4837012DC9DC
-:10BEF0000B72221C84B5160DC4194042DC808700E9
-:10BF000020C888730A9C80B50029C00A4802C00274
-:10BF100095002D420B5802C00020000000000000D8
-:10BF20002014CC00B3002AE00B30024C20A10124E5
-:10BF3000C10800028C008100248009380A608092C8
-:10BF4000402A000A3002C00080C82C720B1402C8BC
-:10BF50000430000000000000A815BC00FF002FF412
-:10BF60008FF0033C00B9003E40099003FC02C3017E
-:10BF700032C048B813A100BA002A000AA007EC009A
-:10BF8000DBC83E900FA202EA04600000000000003F
-:10BF90008000EC00FB023EC40FB063EC01F8403EB1
-:10BFA000400B8003CC00FA423EC00FB500AC58E90C
-:10BFB000823EC01D9003EC04FA003E800FA003E017
-:10BFC00000300000000000000110FC0CDF007FC00A
-:10BFD0002CF0037C01C70033408FD003FC00D80055
-:10BFE00015440CE01B3C00CB0E33C05C62021C020B
-:10BFF000C5002B800FC08780443000000000000087
-:10C0000081446C10BB002EC008B0520C01FAC4224F
-:10C01000610B88036C0088472A000E1C02200288EE
-:10C0200000AA0028900A2C04A80022900B8002E0AD
-:10C03000401000000000000080012C00BB002EC159
-:10C040000830126C0088882A300BB802EC009B087C
-:10C050002A4008B80220008210220008A022A00076
-:10C060008B002A020BB002E000400000000000003C
-:10C0700008000C00B3202CC20836022CC0A00820F7
-:10C08000000B3346CD28802028C00B32020C2081C3
-:10C090003028C00810028100AA002800033002C224
-:10C0A0000100000000000000000C7C00FB282ECCEA
-:10C0B0000C70537D098800BA000F8003FD80DA60A0
-:10C0C0003A508CA2832C804B2030C028A003A100C2
-:10C0D000C9003A000F9003C00310000000000000E8
-:10C0E000A01DFC04FB007EC90BB603FCC0F80C3F8E
-:10C0F000004FC3432C00B8383F8E5EF043E010F889
-:10C10000303F010FD0037000FC0037000DD007E96D
-:10C110000360000000000000C005FCE0CC8033C0DC
-:10C120000DF083FC80DC9433C01CF1037D8CFF3068
-:10C130003F308FC8037E10CF9039A08DF803AE003A
-:10C14000D58013E00C5803F00160000000000000EF
-:10C150008010DD08880023C408FC02ECA8CB202155
-:10C16000C20DF7121C40DF3022A00B88022E04DB28
-:10C170002122C008B8222E00B9802A600A8802E075
-:10C1800004300000000000008845CC10802C28CA34
-:10C190006830028D009B2028C4083202CC10B30006
-:10C1A00024080B80426C0083002ACA3AB0028C0437
-:10C1B000B00428C0081002E30130000000000000B5
-:10C1C000C0158C028040AAC008B002EC009B202A57
-:10C1D000C088B002AC009B0026E00380822C289B24
-:10C1E0002022E10BB202AC80B8802AC10A9802F08A
-:10C1F00004600000000000004015EC00C8503AC088
-:10C200000DB003EC00DB88BAC008B0036C08FB007B
-:10C2100036600F8C636C00CBC03A800EBE03AF84D7
-:10C2200079803A88049801D0047000000000000072
-:10C23000E001BC00FC8035C04FF003DC00EF0037AC
-:10C24000C0AFF0031C016F0013000FC123FCB8FF47
-:10C250000437C00CF8437E04FD003F040FD003F800
-:10C2600000600000000000004010AC00C8403AC070
-:10C270000CB003EC00FB4038C10EB0432C08C300E7
-:10C280003E400E82036D00DB4032C15FB4A3ED205F
-:10C29000C94032E08F984390042000000000000065
-:10C2A000C8053C00880023C028F5C2FC00B3042365
-:10C2B000C148F022BC06AF000E40080002CD00BB12
-:10C2C0000120C0083002EE0081E034A00B90023261
-:10C2D0000040000000000000E0054C02800028C083
-:10C2E000093C024C00B3002CC00AB0020C008301D0
-:10C2F0002C000A0502CD58BB0020000A3D02CF40A9
-:10C30000212060C0091002F8005000000000000069
-:10C3100020011E00848028E4887842DE00B7906502
-:10C32000E4887A429E40A7902DA00A4822DE04B7F6
-:10C33000802360487842FE80AF9065E00BE802C839
-:10C34000004000000000000048080C00C80038C091
-:10C350000C3003CC00FB003CC00EBA030C00C30041
-:10C360003E004E2202CCC0FB4030C00A3003CE80DB
-:10C37000E14130C90F3003D202000000000000008C
-:10C38000401DBC20FC0037C20EF123EC40FF043AF4
-:10C39000C00FB023FC00FF043EC00DA003FC58FFFB
-:10C3A00000BFC006F083DC62DF003FC00FF0031067
-:10C3B0000660000000000000A805ED80C9013EC035
-:10C3C0008CB207AE04CB803AC84CB2032C84CB307D
-:10C3D000B0E00D880B2C00EB0030000CBC832D80EE
-:10C3E000FB0032C00C9003EA047000000000000063
-:10C3F00048119C4087002CCC0876823C8287002123
-:10C40000C28D32820D4CA72821800840021D80BFBA
-:10C410002035400972435CA0B70029C0087002D2E1
-:10C420000460000000000000C0008E0084802DE049
-:10C43000087802DEC08F8028EC287B0A9E948384D3
-:10C4400023E00958509E10A7B023E00B78021E206D
-:10C45000B78021E0097802F0002000000000000011
-:10C460004814CC02821C2CC02830024C0083C0200F
-:10C47000C00830020C00A30060D2081D020F20BBD0
-:10C480002424C00B3C024F00B38028D8093202D2CA
-:10C490000430000000000000E811A800CE843E80B7
-:10C4A0000CA003E800CEC03A8008A003A800CA0090
-:10C4B00033800DEC033B80EE8233800AC08710404E
-:10C4C000F6C03390AD6403FA006000000000000085
-:10C4D0004800C002F8003C001F0403A004F8303EEE
-:10C4E000000F8003E000F8003E040F8093E000F8A6
-:10C4F000103E002C8403E000F8183E100E8003D29A
-:10C5000000300000000000000810E400D9003E40A8
-:10C510000E9003A410F9003E400490032400410053
-:10C520003E400F9113E108F8003240088983A200D1
-:10C53000C98032400C900B02003000000000000067
-:10C540008004640289002E400D90022400B9002E60
-:10C5500040489002A400890022408B9442E220B817
-:10C5600000A240089402E504A990346008900220DB
-:10C5700000100000000000001805241099002E4053
-:10C580000A9002E400B90024400A10020400A90045
-:10C590002A400B9082E001B80020403A9002A44467
-:10C5A0008904226208980206004000000000000092
-:10C5B0000804048A81002C480932064480B1002C0A
-:10C5C000480A12028480A12020500B1402C500B139
-:10C5D0004020500A2402C900A3002440081102028E
-:10C5E0000100000000000000B80D6140D8503E146A
-:10C5F0000E8003E140F85136142E85432142E85065
-:10C600003A000F8012E000F80032001E8043A000C4
-:10C61000C80132000C80032E03500000000000000F
-:10C62000981DE440FD003E444E1103A440B5003E79
-:10C63000440D9103E440D9103F400F5003E500F949
-:10C64000403F400D4403F100F5023DC02FD203E608
-:10C6500006700000000000001805E700E9003660E1
-:10C660000DDA03E640F9403E680C9A03662089A083
-:10C6700033400E9007A600F9803E500CCA03F380A9
-:10C68000C50233400CC003C600700000000000006B
-:10C690003810E30488A22038088002E340B0802EDE
-:10C6A00028088A82238088802200DB88026204B8FE
-:10C6B000B02EA8888EA2EA8088002A002888038EDF
-:10C6C00004300000000000000805C582A9082C52B3
-:10C6D0000B1402C480B1210C5288140244209169C9
-:10C6E00020400A1082C6E0B10C2C48080102E193F8
-:10C6F000A10124410A1002C20170000000000000E4
-:10C700001815A40089042240089000E40039020EA4
-:10C71000400810622400910062408B8002E054B90E
-:10C720000C2E4009B652EC00A9002A400A928086DD
-:10C730000460000000000000A011E400E160364049
-:10C740000D9023E400F9303E402C90436406C9006C
-:10C7500032490E8D93E000F9002E402C9403C7401F
-:10C76000E92030550E9003E804700000000000003E
-:10C770002801A400F9001E400F9003E400F9803C5A
-:10C78000404F9003E400E904BE400F88336200F993
-:10C79000C23E482E8833E200D9003E600D8003CAB5
-:10C7A00000600000000000002810A000C8003E004B
-:10C7B0000D8003A004E840BA000C8003E004C80028
-:10C7C0003A000E8C03E000F80232000E8003612074
-:10C7D000F80032160F8003CA042000000000000099
-:10C7E000280528008A002E8008E20328008A0022FB
-:10C7F0008008A002E8048A002EA209E802FA04BE1A
-:10C8000000A28008CD823320B6C037A04BC882CAB0
-:10C81000004000000000000028056C00830026C0D6
-:10C820000938024C00B30024C0083002EC00830039
-:10C8300028E00B3002CE81B30062C0083C024F00FA
-:10C84000B3A020B0033002CA005000000000000076
-:10C85000A0010C4187342DC00860029E40B7A02D76
-:10C86000C0087302DC0087202DC00B7082DD85BFFD
-:10C870008163C8887B021C00B74065001B7202E818
-:10C880000040000000000000A8081E00C7813DE035
-:10C89000DD7003FE80F7903FE02C7903FE80C7A097
-:10C8A00039E00F7A02DE84F7C231F20C79035E04BC
-:10C8B000F78431600F7E03EA0200000000000000F0
-:10C8C000081DAD0AFB607ED40F30036C00CB003234
-:10C8D000DE2FB203ED421B603EC10DB103EC50F7F9
-:10C8E000803DD82E3203EC30FB003E400FB003C237
-:10C8F00006600000000000000005FF00CBD03FF004
-:10C900004CF813FE00CF883FE00CF8433F00CFC83F
-:10C9100033E00CF803FE00FF803FE02CF803BE205C
-:10C92000C78033E00CF80100007000000000000038
-:10C93000A801BC4087903DC0084002DC80D7002D94
-:10C94000C00C30037C00871021C41E7020DC44B76B
-:10C950000039C00C71021C40D70229400870022A1D
-:10C96000046000000000000000009C0087322DC021
-:10C97000087002DC0187002CC02B700A5C00830069
-:10C9800023C0087002DD00B7002DC40BF0029C200C
-:10C990008718294008708200002000000000000075
-:10C9A0002014CC00830228C0081002CC0883402E3B
-:10C9B000C02A30020C008B0020F20A3002CE00B3F5
-:10C9C000882AD00A30060C0092002878083C4208D9
-:10C9D0000430000000000000A815BC02C7002FC0F2
-:10C9E0002C9002FC028FD83FC04BF0027C02CF009B
-:10C9F00020F208B013EE80FF003FD42EBD83AC00C0
-:10CA0000CB803AA0ACB8032A04600000000000000C
-:10CA10008000EC00FB103EC00F8403EC10FB003ED6
-:10CA2000C001B003EC00FB00BEC00EB023EC08FB5D
-:10CA3000103FC00DB403ED04F9001E14CFB083E025
-:10CA400000300000000000000110FC00CF0030C0EA
-:10CA50000C4003AC00FF003FC02CB003BC00FF0043
-:10CA6000B3E00DFA037E80CF0033C00CFC43FF20FF
-:10CA7000FF003F4008F803C0443000000000000001
-:10CA800081046C10AB002AC00A8E422C04BB002E1D
-:10CA9000C008B0026C00BB003AC00E30020D088323
-:10CAA0000222C00ABC02EF00BBC02C680AB902E037
-:10CAB000401000000000000080050C008B0022C028
-:10CAC00008B802AC00BB022EC008B002EC00BB00EC
-:10CAD000264819B0026D008B0022C00AB002EC0497
-:10CAE000BB1C2E200AB002E0004000000000000045
-:10CAF00008140C00AB2028C00A00020C0093042C80
-:10CB0000C10830024C00B300244109B8020C028372
-:10CB100001A0C00A3002CC1093002C000A3002C2DF
-:10CB2000010000000000000000057C00CF2833C099
-:10CB30000CA046AC11BF003FC05CF043FC00FF04FA
-:10CB400032400DB0036C08CB0431C00CB033ED4063
-:10CB5000FB043E400EB003C0035000000000000084
-:10CB6000A015FC00FF003FC00FC023FC01FF003FE9
-:10CB7000C04FF0877C00FF0039400EF003FC00FF3F
-:10CB8000003FC00F7003DC80FF003D400F7003E8E2
-:10CB90000670000000000000C005FC40EB483EC2EB
-:10CBA0000E0903BC60C02035240ED2132C60FB6A32
-:10CBB00033C00FCA032220C08037C00DF0037C00B1
-:10CBC000EF0033240FC803300070000000000000A5
-:10CBD0008010DD008F602FD808A202FD80C870226F
-:10CBE000002CFD07DC84BF6023D20BBD022300882C
-:10CBF00080A22088B0223400BB5022C80BB0022093
-:10CC000004300000000000008805CC40A3032CC2C3
-:10CC10000A00428C82A30A24800B3002CC90B3001D
-:10CC200028D80B10028C02900020C00B10424C0040
-:10CC3000B30424C00B300EA20170000000000000FD
-:10CC4000C015AC109B042CC0F89806EC00AB8026F5
-:10CC50002008902AAC10BB000AC01BB022AD00987F
-:10CC6000402A704BB0022C00B300A6861BB082B0E5
-:10CC700004600000000000004015EC00EB003EC026
-:10CC80008E9803AC08E8C036304FB042EC00F98013
-:10CC90003AC08F88422010C81030F00F30136C104B
-:10CCA000EB0036F00FBD03900470000000000000A0
-:10CCB000E001BC00EF047FC00FF043DC00C4003B88
-:10CCC000408BDC037C10F99036C24FF9236241ACF3
-:10CCD00001134004B003E400FF003BC00FC0037821
-:10CCE000006000000000000040108C12CB00F2C079
-:10CCF0000F8003AC08D9003A800F1203AC00E100AA
-:10CD000032C00C9003ED02C8403ED00F90132C02AD
-:10CD1000DB003E500CB403100420000000000000B3
-:10CD2000C8053C008F0017C00890023C088D002207
-:10CD30005408B4033C00890023C0403502CC248051
-:10CD40000022744CB0022C008F002ED40AB00A329C
-:10CD50000040000000000000E0014C02830024C0FD
-:10CD60000900028C0190006A410A30204E10310205
-:10CD70002CC0092006CE00800060E00A30820C083A
-:10CD800083082CD009B00278005000000000000099
-:10CD900020011E0487B020EC09E9028E589DB02BBB
-:10CDA000A5405B06DE4095942DE4197B06DE0084E9
-:10CDB0008060E00A780A161087802D680B79024897
-:10CDC000004000000000000048080C00CBA024E058
-:10CDD0000F2A038E00D2D038FA0F18C3CE2431B0F8
-:10CDE0003CE50C3B17CE04C08238C29E10030C00F9
-:10CDF000C3013EC00D81035202000000000000008C
-:10CE0000401DBC00EF103EC20EB1232CC1AB013659
-:10CE1000800FB0232D90E98472C862F117FC00FCEA
-:10CE2000003BC41DF003EC00EF083FC80EF1039077
-:10CE30000660000000000000A805EC80FBA43AC8D2
-:10CE40000E90032C04CA0030602D1A276C84CB602E
-:10CE500032D20CA0132D84CB023EC00DB803AC809F
-:10CE6000CB8132800CB003AA0070000000000000EB
-:10CE700048119CA4B72873C208F0023CC08F00314F
-:10CE8000C00970829C80870C20D80970221C3084D5
-:10CE9000003DC0087002142487A021C0087012123F
-:10CEA0000460000000000000C0009E40B39529E926
-:10CEB0000A68029ED086F0A3E00878129E44A382FE
-:10CEC00021E80B38020E1087802FE00B18028E022B
-:10CED000870021E0087802300020000000000000F8
-:10CEE0004814CC00B30024C04830020C04838020D6
-:10CEF000D00910028C06A38020C00B30020C0280E7
-:10CF00004028D20A30020C018300223C088702121A
-:10CF10000430000000000000E815A818FA003A806C
-:10CF20008EE4422802CE8033804DA083E800EAA040
-:10CF3000B2800AA00A2800CE182F800FA013A800E4
-:10CF4000CA0032902CAC0B3A0460000000000000D4
-:10CF50004800E000F8043A000F8083C008E8033A74
-:10CF6000000E8022C000D0007E10A48003C000F814
-:10CF7000003E100D8403C000F800BE000F80015277
-:10CF800000300000000000000810C402C900364054
-:10CF90000C90036402890432420D9203E642C900F8
-:10CFA00032700E120B2408C9003E450E9903E402AC
-:10CFB000C10032500494030204300000000000005D
-:10CFC0008004640089006E400890022400890022D9
-:10CFD000540B9003E6008900224008900A2400893F
-:10CFE000003848089082E404D900224008900220CA
-:10CFF00000100000000000001805240089012C40EA
-:10D000002810426400A1042250019042E4008904E7
-:10D0100020420A9042340089006E400A9000E400E9
-:10D02000890023400AD002060040000000000000F2
-:10D030000804048081242C480810020480A12028C0
-:10D04000400B100285808120204808506214028124
-:10D05000032E40881682C4A0912821402A50020243
-:10D060000100000000000000B80D6140C8502E14FF
-:10D070000C85036140E850B2154D8002C000485055
-:10D08000B2151A80133008C8003E000E8203E080FB
-:10D09000C02030000E400B2E0350000000000000A6
-:10D0A000981DE440F9103E440FD003E448DD1037EA
-:10D0B000400FD407E440FD103E450F9403E508FD02
-:10D0C0000239D00FD043F4A0F9283E4B0D9283E6ED
-:10D0D00006700000000000001805E680C9A632684E
-:10D0E0000C9003A681E9E93B400E58033620C9A005
-:10D0F00037780DDA033626C50037690EDE03A682BF
-:10D10000CDC033500FD003060070000000000000B7
-:10D110003810E3A488A9223A08080022A0B8E53014
-:10D120002028802243A008E82A3D08A46220008825
-:10D13000002E10088E0323A088A020280B8A820EC0
-:10D1400004300000000000000805C4409140204465
-:10D150000890A28510A1202C420B14128C01911072
-:10D160002C4809110AC40081002C500B1112C50172
-:10D17000B14024480B180E020170000000000000AE
-:10D180001815A400910022410894422400B14020C7
-:10D190004049B262240099000A40089002E5808963
-:10D1A000002E4009B0022480B90026504B900206A0
-:10D1B0000460000000000000A015E402D900B240A5
-:10D1C0002C9513A410E900BE608F900BA410590099
-:10D1D0001E409D9423E402890034400F9003E6082A
-:10D1E0007900B64007980328047000000000000092
-:10D1F00028018400E9023C402F9802E400F9423AF9
-:10D20000680A1003E410E9003E400E900F2600F972
-:10D21000043E400E1C03E600C1003A500F9983CA39
-:10D2200000600000000000002810A000E8003A00A4
-:10D230000C84032000D84232040C8813E000C8009C
-:10D2400030000C040B0000D80036000E80230000D4
-:10D25000C88032000C80010A042000000000000099
-:10D26000280528108A002E8028202228008A0023E2
-:10D27000B088E0022810DA00A3B408E81028008E75
-:10D280002023A048ED1A2800DE0023900AE0020ABD
-:10D29000004000000000000028054C00A30028C04A
-:10D2A00008300A0C00930020C22A3022A400BB00E0
-:10D2B00008E018090A4C00930224E80208064C0012
-:10D2C000930020D80A90024A00500000000000009D
-:10D2D000A0011C8087042DC00870020E0087102555
-:10D2E000000A60025E009700298208501254008FE5
-:10D2F0008061D00804025C01B708A9A00A508268C6
-:10D300000040000000000000A8083E80E78038E4EC
-:10D31000087E031F00DF80B1211E7803DC04F38048
-:10D320005BE10828035E00D78035600E68034E007D
-:10D33000DF8031E00EF80B6A020000000000000000
-:10D34000081DAD02FB743ED04FB283ED007B683AFE
-:10D35000008D8003A420DB0136806FB0418400EB98
-:10D36000003CC00FE683BC40DB00B6800FB00382F8
-:10D3700006600000000000000005FF20DFC03BE663
-:10D380000EF813FF44C7823BE00FF903BE10CFC86D
-:10D3900033608DEB033E00DB823FE00CD8033E4060
-:10D3A000CE8033E40FF8030000700000000000009E
-:10D3B000A811BC40870021E40B78A2CE90C7B02012
-:10D3C000E80B2892B68887A020640B3503140087E9
-:10D3D000B239C02CC0035E02CF0031CE0B76122AC8
-:10D3E000046000000000000000009C00A31029C899
-:10D3F0000B7402DC808F0029CC0A30061480871061
-:10D4000021C00B66025C0087002DC00B51021C80FE
-:10D41000960021C05B748200002000000000000024
-:10D420002014CC08A30020C00BB802CC008B40A86D
-:10D43000C08B08228C02830060C00B304204008342
-:10D440004028FC8A00026E008300A0D08B380208BE
-:10D450000430000000000000A811BC02EF003BC037
-:10D460004FF802FC02CF0038120E98022C00CF00B9
-:10D4700032C0099003640281C03ED00F90073C0384
-:10D48000D90032600F88032A046000000000000009
-:10D490008000CC00DB003EC08FB003EC00FB023606
-:10D4A000C04F9002E400FB00BE900F9C13EC00E91B
-:10D4B000183AD004D503EC40E9003A008F8003E02D
-:10D4C00000300000000000000110FC00CF003DC152
-:10D4D0008CF0032C00EF0AB3122C7023140A4F00B7
-:10D4E00035600DB0030400CD8007E80CC4032C00A8
-:10D4F000CD0031E22CE003004430000000000000C9
-:10D5000081046C02AB022EC00EB0022C008B0032E4
-:10D5100030009C036C008B04223608344A2C0889A6
-:10D520009020B80F8400AC02890036A008A4022025
-:10D53000401000000000000080052C008B002EC071
-:10D5400008B0020C008B0022D10888122600A3002C
-:10D5500026400BB00226008B0026C05810122C0467
-:10D5600082802A49083002200040000000000000AC
-:10D5700008040C00A3142CC81A348A0C848340229B
-:10D58000C80803624CC0A36020400A30020C008B24
-:10D590004508C00B10028CA08300264008300A0208
-:10D5A0000100000000000000000D7C00CF402FD2E1
-:10D5B0008CF6033C22CF4032D64CA6C13DA0874812
-:10D5C000360D0FB1022442CB6016C00CD0032C8064
-:10D5D000CA0032C00C3003000350000000000000FD
-:10D5E000A019FC00FF203ECA0EB003EC20DB343A49
-:10D5F000C80F8003E410DB213E180DF203FC80FF0E
-:10D600003035C00FC013EC00FF003BC00FF003E843
-:10D610000670000000000000C011FC00FB0B2FCAC8
-:10D620008DF203FA0096803BC40DF1037C80EC8000
-:10D630003B080CC2037402CC803F480EF00330A0BC
-:10D64000D5803F400CF803F000700000000000009F
-:10D650008008EE40BF802FF00BF722EE208A802357
-:10D66000FC8875123D00880022002880022408886A
-:10D67000006F5000F502290089002E540D9011A072
-:10D6800004100000000000008805CC00B3002CC18D
-:10D69000093082CC82BB0028C0493202CD00B800DC
-:10D6A0002C500901020C4080006C4409300220001B
-:10D6B000B0002C40183006E20170000000000000AD
-:10D6C000C001AC00BB012EC00BB002EE00AA004AA4
-:10D6D000C008B052EC00980226400980026C01AAF2
-:10D6E000042E4009B0022200A9802E41099002F0C8
-:10D6F00004600000000000004005EC00FB003EC09C
-:10D700000DB003CE84FA001AC08DB043EC00F002D5
-:10D710003F000DD1033500CB482E402FB0092280A9
-:10D72000F9C81EE008B1E2D004700000000000005B
-:10D73000E001BC007B003FC00FF023FC00DE0024B2
-:10D74000C04FF0032C00EC203B000E98039402DD48
-:10D75000003F404EF001F800DD003CE40FD803B874
-:10D7600000600000000000004000ACC0FB2032C898
-:10D770008DB003EC00F9003AC22C30036C04D802DF
-:10D780003C448D1003AD03EA003C400C7023E400E0
-:10D79000C8403AC00DBC0350042000000000000047
-:10D7A000C8013D00BF4223F00DF002E500E2013761
-:10D7B000F108F00E3DC0A8002E542890022C008ADB
-:10D7C000053B4148F5038C00890022D40E9502F2F6
-:10D7D0000040000000000000E0054C00B30420C041
-:10D7E000893002CC40B2002CC44830022C02A20086
-:10D7F0002C2019201A8008B0006C40083002C400A8
-:10D8000081002C40083002F80050000000000000A9
-:10D8100020011E00B7A0E1E0097802DF04AE802DF0
-:10D82000E00879021E1087902C282968028281B4B2
-:10D83000802D60087810BC008F802D600B6802C8B6
-:10D84000004000000000000048000C05F39230CAC0
-:10D850000D3003CC00F3003CC00C30020C80700093
-:10D860002C400D20038900B1003E402C3003EC50C9
-:10D87000C3203C400C3003D2020000000000000036
-:10D88000401DBC00FF003CC00EB083EC40EA0036F7
-:10D89000C20FB083AC00F8003E480EE00B7A80CF98
-:10D8A000003B440FF003ECC0FF0003440EE003D044
-:10D8B0000660000000000000A805EC00FB233EC845
-:10D8C0001DB003EE00CA003EC80CB2032D90C88400
-:10D8D00036002DB00360189B8033500CF203E20039
-:10D8E000C98032400CB8032A00700000000000001C
-:10D8F00048119C00B7280CD2287302FC0086042C27
-:10D90000CC2870830C20950120000930121004856A
-:10D91000002152087502D8008700214008600212D9
-:10D920000460000000000000C0009ED4B7B109E10F
-:10D93000087822DE0095802DE008780A5E4294C0C7
-:10D9400021600878025A0087802D68087A02D70083
-:10D95000978020600978023000200000000000005D
-:10D960004810CC00B3002CC008B002CD8092002C2F
-:10D97000C008B002CC009080A04009360248028363
-:10D98000A0AC402A3006CE029304A04009200A121F
-:10D990000430000000000000E815A800FA003A80FA
-:10D9A0000DA003FB02DE803E800CA0032800CE8089
-:10D9B00032800CA4037800CEA43F800CA007F900AD
-:10D9C000DE0032802DE0023A04600000000000001A
-:10D9D0004800E100F8007C000F8003E040E8103CC4
-:10D9E00001CF800F2000E8003E000E04039000E805
-:10D9F0000020000D8007E000E8003E040E8003D206
-:10DA000000300000000000000810E400F9107E4122
-:10DA10000E90032400F90036680E900FA408C90088
-:10DA20003A400C900B2412E9003E442C90036424ED
-:10DA3000F9022E400C9003C20430000000000000E8
-:10DA400080046510B9803E4008900A2600B1102A73
-:10DA500072089007640289402E40289012250089A0
-:10DA6000453E500D900A2500B9402E40289403E011
-:10DA7000001000000000000018052400B9002E402E
-:10DA80004890422601B94026400A904284018B0802
-:10DA90002C4009D0823432A9086E4208100224209A
-:10DAA000B9082C40189082C6004000000000000019
-:10DAB00008040480B32028480812020401B1002899
-:10DAC00058081202058981402C5808560615808195
-:10DAD0004028500914020580B1402C5A081402C293
-:10DAE0000100000000000000B80D6800F8002E00E2
-:10DAF0002E85032148F80036008E0502A00880001C
-:10DB00003E000D800B1004E0002C004C8003400010
-:10DB1000F0003E080C0003EE03500000000000007F
-:10DB2000981DE440F9103E440F9103F400FD003EBF
-:10DB3000440F9103E440FD033F441F911BE440FD6B
-:10DB4000013F500E9403F440FD003F400FD003A668
-:10DB500006700000000000001815F400CDA07168E8
-:10DB60008D9803D400CD0033600C988F2720C940D6
-:10DB70003E780C9E8B2720D11130608C9C032500B1
-:10DB8000F9403E780F90034600700000000000004E
-:10DB90003810E01088012201088C22E80088022A4F
-:10DBA00014088C0B239088A02EB0088C4223008888
-:10DBB000A0362A188A022200B8A02E340BCA820E80
-:10DBC00000300000000000000805C400814024501F
-:10DBD000091682C400A9002040081292540885004A
-:10DBE0002F4C09521214809D002150085422148099
-:10DBF000B5002D480BD00242057000000000000067
-:10DC00001805A4028901A240489002E402A9002A52
-:10DC1000406890026410AD002F4128500234008DFE
-:10DC200044274039D0023500BD142F400BD00246A6
-:10DC30000460000000000000A005C400C9003640D8
-:10DC40002D9003E700E1E032400C900B6402C9081C
-:10DC50003C500C90022602D9C032400C9013270091
-:10DC6000F9203E400F90036804700000000000009F
-:10DC70002801A402F90038400F9003E680D9A03CA7
-:10DC8000400F1003A400D9103E400F9003C492F936
-:10DC9000213C402E900FE680F9803E400F90038A91
-:10DCA00000600000000000002800A040E8103E04D2
-:10DCB0004E80032080D8603A020C80132000F84088
-:10DCC00036102D8003A008E84032000D0003210229
-:10DCD000C840B2000FC003CA0420000000000000CA
-:10DCE00028113B1086012FA00DA00238008EE023E2
-:10DCF000A208A0022800BA80228008A00228008280
-:10DD0000002A8028A0022A048A8022A00B6002CA6E
-:10DD1000004000000000000028054380A2002CA065
-:10DD20000830022E00920028C02830022C00B38058
-:10DD300024C009300A8C00A30060C008300A4C00DF
-:10DD4000830020E00B2002CA005000000000000009
-:10DD5000A001100086002DC0093A0235008600217E
-:10DD6000C00873021000BF8821000870021C088FD1
-:10DD7000002BC00820125E20878821830B6002E8F8
-:10DD80000040000000000000A8081200E5813DA04E
-:10DD90002C7A0B1E00D48038E00CFA0B1E00F680A3
-:10DDA00034E00D28038A00E68031200C78037A04E1
-:10DDB000CE8431E04F7843EA00000000000000000C
-:10DDC000080D8000F8003EC00FB523E400F00436D3
-:10DDD000400FB687E000F2003E001FA00BE800FAFB
-:10DDE000003E000EA003A800FA003E800FB003C260
-:10DDF00004600000000000000005F600CC8033A0A5
-:10DE00000CFC033E00FC8037E00FB9213E00FD8290
-:10DE100033E02CF8037E10DF843DE00CF803F600BD
-:10DE2000FD803F600CE8230000700000000000004F
-:10DE3000A8119840841021C00870021080B40021FD
-:10DE4000C80B7A021000FD0021040870021C4287F2
-:10DE5000002DC4486102D680B5002F040861822AD3
-:10DE6000046000000000000000009000810021809C
-:10DE70000830021C10BC0825804B300E1C00B4007A
-:10DE800020C0082002580096002F000A7002D0809F
-:10DE9000B4182D4009F80200002000000000000026
-:10DEA0002014C8028000A0C00830220BC0B0C022DD
-:10DEB000800B30020000A004220028A0022B008A60
-:10DEC000002C0008A006C000B0C22C0009BC1A0833
-:10DED0000430000000000000A815A000C80032C0F7
-:10DEE0000CF00B2600F9C036000FF0132C10BB40CD
-:10DEF000F2C00890036700D9803EC0089002EC0091
-:10DF0000FBD03EC0298C002A046000000000000005
-:10DF10008000E000F8443CD02FB003E400F9203E3C
-:10DF2000400F3003E000FB083E000F9013E442F97D
-:10DF3000103EC00F8003EE00FB003E800E8203E027
-:10DF400000300000000000000110E008FC8032E416
-:10DF50000EF0037400FC003F400CF00B3C00FE0090
-:10DF60003FC00DC1032020CC1033000CD10358005A
-:10DF7000CE002FC00FD1030044300000000000008D
-:10DF800081446200B0402AF108B0122608B8C82EB9
-:10DF9000700AB0022000BA002E00288003224088B8
-:10DFA0000120000A800228008A012E808B90022026
-:10DFB000401000000000000080052600B828224222
-:10DFC0000830026600B8802E3088B0022C00B901FB
-:10DFD0002EC0889002A400890022C0089002240C60
-:10DFE00089012E401B8002600040000000000000FC
-:10DFF00008040000B00028C02830020000B0002C47
-:10E00000400A30020000B1002C0008100A04008110
-:10E0100001A2C008000A048081002C001B000A0233
-:10E020000100000000000000000D6000F800324018
-:10E030000EF0236408F8002E000CF0032C00F8000A
-:10E040003EC00C80032002C80432001C9003200054
-:10E05000C8013E419F904340035000000000000073
-:10E06000A01DF000FC0C3FC00FF003F010F4003FC7
-:10E07000000FF423F000FC003F000EC003B000FCD2
-:10E08000003F000FC003E100FC003F011F5003E808
-:10E090000670000000000000C00DF0D0FF203ED050
-:10E0A0008EB003ECA0DB283ECC0CB303AD08F83CEB
-:10E0B00032230E48237A00FD943FE00F7833EE08B8
-:10E0C000BF803FE40FF90330007000000000000043
-:10E0D000A000ECC8BFD10FC80C2682FD248F002EF3
-:10E0E000990AF2621DD099612271888802AC00B849
-:10E0F000222E204B8803A00080002E080B80236076
-:10E1000004300000000000008805CC04B3030CCCF0
-:10E110000A1312CC14A30E0C580A33028C10A3203D
-:10E12000A00A18900248A0B02024800A2002CC093E
-:10E13000A1002C800B3242A2017000000000000000
-:10E14000E011AC20BB002EC04B80A2EC00AB004E17
-:10E15000462AB0022C049B802A608A9C02AC00B93B
-:10E16000812E400B9802A3008A002E400B8004F001
-:10E1700004600000000000004015E100FB043EC008
-:10E180000EB403EC0ADB022ED10EB003AC00FB820E
-:10E1900032281E0C036800B9003E404FB043ED002A
-:10E1A000EA003E400F800390047000000000000071
-:10E1B000C001B818FF021FC00CE203FC00DF032FF0
-:10E1C000A10F7003FC04AB0437422DD0027C00FC8D
-:10E1D000003F800FC003B000FD003F800FF00378C8
-:10E1E00000600000000000004010A900DB003CC0FF
-:10E1F0002E94016C11CB00B8C00CB0036C00EB0185
-:10E200003210079203A800F8003E0C07A203AD00ED
-:10E21000D80032000C8003D0042000000000000071
-:10E22000C8052808BF002FC08880023C08EF0322E1
-:10E23000000DF5003C008B822260039C022C10B97B
-:10E24000B022F00B90022000BB0022E20DB002F2DF
-:10E250000040000000000000E0054000B3022CC0B8
-:10E260000830026C00830020C0093404EC00A800D0
-:10E2700022F00B00028800B30028E00B1402A0007B
-:10E28000930020C008B002F8005000000000000019
-:10E2900020011E04B7802DE80878020EC8A790213F
-:10E2A000A81938529EC1878021E20BD9829E00B600
-:10E2B000A02D200B68021E00B4C12120094802C80D
-:10E2C000004000000000000048000C80B3103EE059
-:10E2D0000E3A074E00CB903A610D3803CED1E1984B
-:10E2E00030A48F10038800BAA13C8407000382D4B5
-:10E2F000D10072800C3003D2020000000000000048
-:10E300004015BC04FF003FC00FC223ECB0FF003239
-:10E310000406B4237C10BF003E840FB0037C40FF92
-:10E320000033400FF003FC00FE00BF400FC803D0D5
-:10E3300006600000000000008805E400CB333EC802
-:10E340004CB003AC90DBA036C00EBA436C00C900E1
-:10E350003E400F000F2800FB003E400F18436000B6
-:10E36000FA003E404F080B2A007000000000000039
-:10E3700048119C1007082CCA0820021C2087283F3F
-:10E38000808AF0021D4087042DC00B70021C00B66D
-:10E39000002D800B60031C00B5002D800B70021255
-:10E3A0000460000000000000C0008E0087A02DE483
-:10E3B0000A58021E01839021700B79029E0185C0CC
-:10E3C0002DE04B58121A00B6802D200B4802520047
-:10E3D000B4802D200B480230002000000000000017
-:10E3E0004814EC0083002CC08836020C0283006CB9
-:10E3F000C00B300AAC009BE06CC80B32020C01B3BE
-:10E40000002CC00B30020C10B3402CC00B3C82120D
-:10E410000430000000000000E815B802CA003E8089
-:10E420000EE48B2800CA0033950FA007A802CE4047
-:10E430003FB00FE4822800FA003E800FA02368005E
-:10E44000FA403E814FA4E33A04600000000000005F
-:10E450004800E080F0003C002F00026000E8003C33
-:10E46000000E80012000E8045E040F8003E000FC41
-:10E47000013F100FC403B000FC093F000FC003D2DE
-:10E4800000300000000000000810E400A920364021
-:10E490000E90034404D9003E400D9003E404C900EB
-:10E4A00032408F900BE408F9003E440E9803E600DA
-:10E4B000F9003E400F9003C204300000000000004D
-:10E4C0008004640089002240189002240089002EF4
-:10E4D00040089402E400D90422400B1C0B6400B9EC
-:10E4E000942C50089C02E414B9900E400B9002E06A
-:10E4F00000100000000000001805240289002640DA
-:10E500004A9002640099042E40089882E400890031
-:10E510006A400A9282E400BD012F5012D602F440F4
-:10E52000BD000F400BD002C60040000000000000FC
-:10E530000804048081202048081202048081222CD3
-:10E5400048A81206C490912028500B90024500B5AF
-:10E55000406D40085012D404B5022D400B5002C249
-:10E560000100000000000000B80D6140C800361432
-:10E570000A85034140D8502E140C8503C140C85071
-:10E58000BA000E8023E00078003E000E8003E00415
-:10E59000F8003E000FC003EE035000000000000032
-:10E5A000981DF440D9103E4407F103E440F9103FB0
-:10E5B00044AF9103E440FD1037500FD003E400F95D
-:10E5C000003E400F9003E4A0F9283E4A0F9283E6F4
-:10E5D00006700000000000001805E6D4FDA23A70A5
-:10E5E0008C9E032680C9A032680CDB4327809DA245
-:10E5F000B7400F50036500FD003FC107D003F5048D
-:10E60000FD402FC00CD003C60070000000000000C9
-:10E610003810E388B8502238088E00A2A088E8227B
-:10E62000384888036210A8E83C000B80036280B879
-:10E63000012E800B8021A200B0842E2A288A82CE4F
-:10E6400000300000000000000805C440B100285858
-:10E6500080134005008140205228160285809BC20D
-:10E6600064418B98020400B1092C401B1020C400A7
-:10E67000B1002C40481002C20570000000000000EC
-:10E680001815A584B900204008900224000100203C
-:10E69000500890426400A910AE580398026400B973
-:10E6A000002E400B9046A410B9002E41089002C6DF
-:10E6B0000460000000000000A011E700F9002A40FB
-:10E6C0002C940B2402C900B2440C90032404D9807A
-:10E6D000B6418F18032400F9603E400F9603E40012
-:10E6E000F9803E428C9003E80470000000000000B6
-:10E6F0002801A600F1003E400F1C03C400F9003EB3
-:10E70000408F9023C410F900BE400F900BE400F935
-:10E71000003E40079023E400F9203E408F9003CA5A
-:10E7200000600000000000002810A100F800BE00FA
-:10E730000E84032000C80032000C00832000F80083
-:10E740003E000C8003A000F80036100F8043E00864
-:10E75000F80032000F8003CA04000000000000002F
-:10E7600028052800BA00228048A0036800AA002AD1
-:10E770008008E003680082002F8008E6022804BEBB
-:10E780004023800BE802EA00BE0122800BE002CAAF
-:10E79000004000000000000028054C01930120C14A
-:10E7A0000A30020C00A30020C08838420C00A300ED
-:10E7B00024C00A3E428C00B24C24E04B3802C441D3
-:10E7C000B30022C00B1002CA00500000000000007D
-:10E7D000A0011C00B70020C9487002DC40A7142C1F
-:10E7E000C82830825CC185002DE02AF0121C80B759
-:10E7F000A021820B7082D411B68021404B5002E8D8
-:10E800000040000000000000A8081E80D58029EA12
-:10E810004E3A070E80E3B031FC0C48030E41E7800E
-:10E820003DE00E78039E80F4C435E00F7827DE00CB
-:10E83000F580B1E00F5803EA00000000000000007E
-:10E84000081DAC0031043AC40FB5936D08FB403A83
-:10E85000C8638023EC98E9003EC00DB043EC00F3A0
-:10E86000803E404FA003EC00F8683E408F9803C202
-:10E8700004600000000000000005FE60EB903EE434
-:10E880000FB8003F40CB807FE00EFB032E40CB80D3
-:10E890003FE00F79432E60CA8133648FD903FE00B5
-:10E8A000FF8133E00FD98B000070000000000000F2
-:10E8B000A8019C00878119E40BFA135E8087B22DB2
-:10E8C000EC0D79019E00D5902DF80B78037E08ABF6
-:10E8D0009129850B5102DC48B64021400B50022A99
-:10E8E000046000000000000000008C14B5206DC81A
-:10E8F0000B72025C80872069C0885302CC819750DC
-:10E900002DC80BF70ADCC0840121441B7022DC00F7
-:10E91000B50021C40B50860000200000000000005C
-:10E920002014CF3091002CC00B34024C0083002CFB
-:10E93000F20B10220C0091002CC80B180ACD01A379
-:10E940000028600B2102CE20B840A0540B1802080A
-:10E950000430000000000000A811BD00F9002FC025
-:10E960000FF4027C12CF033FC20EB003FC049B02E3
-:10E970002EF20FA40BDC00CE00B0C88FA403EF0072
-:10E98000F88032F51FDD032A04600000000000005B
-:10E990008000EC40E9003AC00FB103CC00F3003E28
-:10E9A000C00DB409EC18F9103E104FB10A6C80F993
-:10E9B0008936820BA603EC50F9503EC01F900360CD
-:10E9C00000300000000000000110FC00FDA03DC070
-:10E9D0000C70832C00EF0235C00DE203FC04FF0233
-:10E9E0002DE08EF0033C10DC003F800CD803FC00CF
-:10E9F000DE1833F04FD003C04430000000000000A8
-:10EA000081006C00B9002EC04CB0036C008B023644
-:10EA1000C00DAC12EC0079002E300D3D42AC0089E7
-:10EA2000881A100D8602EE04BB4022E00B9002E033
-:10EA3000401000000000000080052C01B9002EC02D
-:10EA400008B042AC000B0526C0099420EC00B98048
-:10EA50006EC488B0822C009B822E42088102E48022
-:10EA6000B80022C10B9002E000400000000000004E
-:10EA700008040C10B1252CCA083446CC08830024A5
-:10EA8000C20B0252CC8183002C0019B242AC8081AF
-:10EA9000082880090002C440B10020C00B1002C247
-:10EAA000010000000000000000056C00B9003FD02C
-:10EAB00008F607BCC2AF3075DC0D1602FCE0B95099
-:10EAC0003ECC0CB0232C10D9003E000C9003EC007F
-:10EAD000DE0132C00F9003C00350000000000000B0
-:10EAE000A019FC00FD103FCA2EF6036D949F303A2A
-:10EAF000C90C8393FC80FF117E190BB103FC40FD10
-:10EB0000083B000FC003FC807700BFC00F5003E834
-:10EB10000670000000000000C001FC00F49437C83B
-:10EB20000D69637C10FF6237C00DB4037C60D48034
-:10EB30003F400F48233200CE00BF408FD10330E06A
-:10EB4000FF303B600FD803B00070000000000000F1
-:10EB50008010ED20B82423F449A2023F408F5123B6
-:10EB6000DA08F6123D809B802E494B80034000D985
-:10EB70000122740BD5022100BF422E490B9C02E0FA
-:10EB800004300000000000008805CD80B82028C1B6
-:10EB90001BA0024C0093202CD80B3402CC00900117
-:10EBA0002CC61AA00268088300A4400B10020000C3
-:10EBB000B31028420B1402A20170000000000000F4
-:10EBC000C015AC00B8602AC01BA08EAC019B052606
-:10EBD000C003B0426C009B802EC003A00669009960
-:10EBE00080AAC00B900263003B002E584B9002F0AD
-:10EBF00004600000000000004011EC04F880BAC07E
-:10EC00000F30036C10DB0336C08FB003EC08D880E4
-:10EC10007EE00688034108CBA03E640F900B2A00DB
-:10EC20007B003A010F900390047000000000000088
-:10EC3000E001BC00FC8432C00CF9035C10EF003B27
-:10EC4000C00C70039C00EC013FE44FD103F100F3D2
-:10EC50000533600FD003BC04FF003F210FD003F841
-:10EC600000600000000000004010AC00C8403AC640
-:10EC70000DB4036C00F30034C00EB0036C00E91057
-:10EC80003AC00F84032C60CB0032600C500361004B
-:10EC9000CB003E900E90A3900420000000000000E6
-:10ECA000C8053C02880101F020B0013E003F00335E
-:10ECB000C00BF0323C08898022C0011512AC008BD9
-:10ECC0000022C048DB022F408F002E0108D4803282
-:10ECD0000040000000000000E0054C00080008F0C3
-:10ECE0000800124C00330124C04A30024C00A0201E
-:10ECF00028C00B10024604830420C02918020440D7
-:10ED0000B3002C400A1C42B100500000000000007B
-:10ED100020011E018D8021E018C8021E00B3A02131
-:10ED2000E01B38020E01A78021E009D840D64087B9
-:10ED30008001E0095902160097842D6008584000B0
-:10ED4000004000000000000048082C40C00038C40B
-:10ED50000C30274C20F30134C10E3A034CC4E000C0
-:10ED600018C80F34034440C30030C00D90032E0078
-:10ED7000F3003E400E10019A020000000000000067
-:10ED8000401DBC00F9000ED40EB003EC20FB203F68
-:10ED9000C40FF103EC60DB103FC04FF003A446FB4F
-:10EDA00000BDC00ED00BB400EF483F400F5003D061
-:10EDB0000660000000000000A805EC00F80032D456
-:10EDC0000F8003AD00EB0822D20CB6036C00F2807A
-:10EDD00036C00EA0032810CB00B2C00FD6032810F7
-:10EDE000FB203E404F99132B0070000000000000F4
-:10EDF00048119D10B40121C18BC0021CA0BF042783
-:10EE0000C80875021CC0B60021C008F04218108F57
-:10EE10000021C00B54A21C00B7042D410B5202125A
-:10EE20000460000000000000C0009E80B688A5E0DD
-:10EE30000B78129E81A79025E48878021E80BF80FF
-:10EE400024600B68021E00878461E00A1A0A1A0017
-:10EE5000B7A02DE00BDA0230002000000000000017
-:10EE60004814CC00BAC0A4C00B34020C00B3002478
-:10EE7000C008B00E2C00B39820600933022C00A308
-:10EE8000C820C00B10020C00B3002CF00B100212B3
-:10EE90000430000000000000E815A800FE80368164
-:10EEA0000BE003A800EA00B28008A0036800FE009F
-:10EEB00036A01FE8133B82CEE022808EA0033800EC
-:10EEC000BA003FA20FA0033A046000000000000057
-:10EED0004800E000F8203A10078003C100F800382D
-:10EEE000002F8003A001F8423E050E800BE080D881
-:10EEF000003E000F8403E100F8003E000F840BD2B7
-:10EF000000300000000000000810E400C9003A5082
-:10EF10008F9083A402D100B2404C90232408C901F1
-:10EF20003E400C90032400C10032400F140A2520FB
-:10EF3000E9003E420F9003C20430000000000000D0
-:10EF40008004640A890022700B90122580C9002277
-:10EF5000400A9003640089202C400A900A2400890A
-:10EF6000C132400B9802060089902E400B9412E0AB
-:10EF700000100000000000001801040089006A422F
-:10EF80000A1002A4008900A2400A9002240009008D
-:10EF90002E4058100224008980AA600B9002A4041D
-:10EFA000A9002E400B9402C60040000000000000A3
-:10EFB00008040480810060480B10020481812060F5
-:10EFC000480A1202448881000E590A140205008181
-:10EFD000C028504930028C8401602C500B1002C2B2
-:10EFE0000100000000000000B80D6140C0542A007C
-:10EFF0000E8503A000C85032151E05222142C8000C
-:10F000003E000C80030004C8003A004F8503A14075
-:10F0100068003E000F8003EE035000000000000077
-:10F02000981DE440FD033E440FD003E448E9103E40
-:10F03000450F9113E440FD003F440FD003F402FD5F
-:10F040004033500FD4237440F9103F400F5403E66F
-:10F0500002700000000000001805E400F901336AA6
-:10F06000099003B634F9C832640C9A03E6A0DD00B7
-:10F070003C700F9003A500898033320FD8133C00F9
-:10F08000FD0070500FD0030600700000000000006B
-:10F090003810E280B8A822100888022100B8C020E9
-:10F0A000300D8E87838888002E340B8A822280DC84
-:10F0B000E022380B80022000F8A82A280B80020EDC
-:10F0C00000300000000000000805C420B10020400E
-:10F0D0000A92928411B1246858091102C420910146
-:10F0E0002C481B500274849548AC480B94020404CD
-:10F0F000B10224480B10020205700000000000005D
-:10F100001811A400B12022400A90062C01B9002A4F
-:10F1100040099002A4009B082E480B121A74009517
-:10F12000452E600390022400B9002E400B90020689
-:10F130000460000000000000A015E400F9803040E9
-:10F140000E1603A400B90432400D9002E400D94029
-:10F150002E401F9803E580D900AE6007100B2601F2
-:10F16000B900A6400F900B280470000000000000BA
-:10F170002801A400F900BE40AC9203E400F900B4F9
-:10F18000400F9003E400E9003E600F9003A480F973
-:10F190000032000F9083E685E10032440F1003CA6D
-:10F1A00000600000000000002810A000F8003200FD
-:10F1B0000F8013E094E00032000C80036000C80070
-:10F1C0003E000D80432008F80032000F8003E0402D
-:10F1D000F80032004C8023CA042000000000000028
-:10F1E00028052800BA0023800BA002FB046A002235
-:10F1F000800AA003680A8E883A8008A0020800BA34
-:10F2000000B72203E402FA008A00228008E802CA5A
-:10F21000004000000000000028054C00B3006041E1
-:10F22000033002CC41A30004C00B30022C00A380A9
-:10F230002CC00938020C00B300A0C00B3402CC80F3
-:10F24000A10020C0083802CA0050000000000000E1
-:10F25000A0011C40B70061000B7102DC00A3002577
-:10F26000C81938025C80A7000FE80964221000B3B7
-:10F270000025C80B6002F200850123E8087082E8CF
-:10F280000040000000000000A8081E20FF80A1A090
-:10F290000F7A42DA00E7E835F02F7B621E82E680C3
-:10F2A0001DE00DF80B1E00F78031F00F7803DE0C27
-:10F2B000EF8031F82C7803EA000000000000000025
-:10F2C000081DAD84FB683E000FB003E800FB00FAA8
-:10F2D000D80EB503ED00DB003AC08EA003E000FBC2
-:10F2E000403EC00BB043C404EF02BFC00FB003C226
-:10F2F00004600000000000000005FE42C7383364CF
-:10F300000E7C035E00DFA037F00DF803FF20CF81F5
-:10F3100033E20CD803BE007FC033E00CF9037E005B
-:10F32000FD803FE00FF803C0007000000000000007
-:10F33000A8119C0087A021140871021410D7203551
-:10F34000C00C7003BC0085082BC04D4602D100B72D
-:10F350000021C00860020880F5203DCA0F5403EA6E
-:10F36000046000000000000000009C118F01208458
-:10F370001AF0021800A73465C0097102DC008E0083
-:10F3800029C00850069C00BF882DC40A6026582456
-:10F3900097006DC09B7002C00020000000000000BC
-:10F3A0002014CC008B4020001830020000BB022447
-:10F3B000C0083020CC0081C028C00B0482E010BB04
-:10F3C000A02CE00A20060000B30028C00A10028822
-:10F3D0000430000000000000A815BC00CF1032006F
-:10F3E0000EF00B2400EF0037C00DF003FC06C150F7
-:10F3F0003BC00CB403AC00F8C0BEC82EB0036E0115
-:10F40000FB002DC04B9002EA0460000000000000E9
-:10F410008000EC04FB003E000FB003AD009B003EFB
-:10F42000C00F3003AC00F8002EC005B403ED00F8A7
-:10F430004032C0090003E091E3003EC00F9011E0AC
-:10F4400000300000000000000110EC00EF0033204D
-:10F450004FF003B400EF033AC00FF0033C00DC00B0
-:10F4600031C08DF803FE04CF0032C80CF00B1C0035
-:10F47000CF9333C08C4002004430000000000000F5
-:10F4800081046C00BB00A2040B30020E00AB002A0A
-:10F49000C009B0036C08A8C036C008BC02EF02ABBC
-:10F4A000D020E008B82226108B0022C0209C022029
-:10F4B000401000000000000080052C00BB0026006A
-:10F4C0000AB002A208AB006AC00BB00A0C008B8025
-:10F4D00022C009B102EC40880822C008B802260008
-:10F4E0008B0022C0089802A000400000000000002D
-:10F4F00008040C00B30024000BB0020001830020BC
-:10F50000C00930024C00000424C00830064C0080C2
-:10F51000002CC008000200418300A2C008100A822B
-:10F520000100000000000000000D7C00EF08260034
-:10F530000EF002A000E7003BC00FF5433C02DA00EA
-:10F5400032C00DB003EC00CB00B2C00CA0032810F9
-:10F55000CB0032C00C80038003500000000000008C
-:10F56000A00DFC00FB003B000FF003F000FF023F8A
-:10F57000C00DF203BC00F4003FC00FF003FC00F725
-:10F580000033C00F6003F088FF003FC04FD0036816
-:10F590000670000000000000C005FC40FC313B0884
-:10F5A0004FF943EF00DF3032210F94077D80EF38B1
-:10F5B00032091C3803F221FD0033C40CF002FC00B8
-:10F5C000DF0033C00FF003300070000000000000C7
-:10F5D0008010EC888B6022E50EB222EC80AF112AFD
-:10F5E000200BB113AC488B4534CC48B0026B00BA49
-:10F5F000823600088822C0048800A2088B88622016
-:10F6000004300000000000008805CC00A130280074
-:10F610000B3202CC00A3222C008B1206C880A30060
-:10F620002002CA3006C401B10068800920028800A7
-:10F63000830020C20B000AA201700000000000003D
-:10F64000C015AC008B6162C00BB202E800AB022AAD
-:10F65000611B9002A800AB0020C00AB0026C04BA83
-:10F66000002E40899002E608980022000BB002B0FC
-:10F6700004600000000000004015EE00F8013A04AC
-:10F680000FAC03EC90FB023EE00B90426780A8C4F5
-:10F690002248228603E140B8022A40299003EC0266
-:10F6A000C94832400FB01390047000000000000001
-:10F6B000E001AC40FB001FA20EF882FC08FF003FF7
-:10F6C000C00FFA439644D4913F400DC003FA00FFA7
-:10F6D0000825800EE003D000EA003F800FC00378C9
-:10F6E00000600000000000004010AC00E1203A5033
-:10F6F0000F90032C00EB0876050EB027E010EA40CF
-:10F70000B2C00CA4432500F80032080F8043E80083
-:10F71000D108EE400F0003D00420000000000000DC
-:10F72000C8052C008B0022D00B90822C0087402231
-:10F73000608BB002E000D85022D00CA0036C00B364
-:10F74000C83ED00BB80225088A202A808BB882F2E6
-:10F750000040000000000000E0056400A0C024C0DC
-:10F760000938022C0083032000103022CC008300D3
-:10F7700060080A30824C00B1C000D10B380284808E
-:10F7800082012080033802F80050000000000000D1
-:10F7900020011640849825E00B7A02FA48A32061E4
-:10F7A000240B7900CEC093A421A60B7812DE80B67C
-:10F7B000802D240B4B021A40858121600B4802C822
-:10F7C000004000000000000048080C00E2A0B4FE69
-:10F7D0004BB80B0E00A3B024A80E1B02CEC1C3C0B1
-:10F7E00030682E3A474E80F18030800F22838000AF
-:10F7F000C21038804F0007D2020000000000000055
-:10F80000400DBC10FE043BC107F0031CC8DF2A0BEF
-:10F81000C48FD143F8027F003FC00CF10F3C00F2CF
-:10F82000113F411F5203BC0EED143F400FF803D0AF
-:10F830000660000000000000A805E400E900328036
-:10F840000EBE4B6F00CB827AC02CB0032C00C900D7
-:10F8500032002C10032C08C00026406C9013241298
-:10F86000C8013E000FB80B2A007000000000000025
-:10F87000481194008D0021800B70823C2083322936
-:10F88000C008F0201400800023000850069C04D714
-:10F89000022880086002081087002DC00B40021269
-:10F8A0000460000000000000C0009E00A78021E06E
-:10F8B0000B5C121E0487820DA00978160200B4802A
-:10F8C00025E00B78029E00848021220808021201A4
-:10F8D00084C02D200B080230002000000000000032
-:10F8E0004814CC008342A0D80B34820C00A3022021
-:10F8F000E008B0020C88B32124D80B3E028C0093A0
-:10F900000828C00838022C058B012CE00B300212AD
-:10F910000430000000000000E815A800EE0033905D
-:10F920000FA00B6800CA017FA80CAA033A12FEE2DE
-:10F9300037B00FEE021800CA4036A008A08B28008E
-:10F94000CA812EA00FE0033A04600000000000000E
-:10F950004800E000F8083E000F8003A202D8403EB5
-:10F96000080F8013E0404840B8040884036100FC9D
-:10F97000003F004FC003F100FC003F040FC003D262
-:10F9800000300000000000000810C400F9003050F2
-:10F990004CB9036C18F90036400E9C23A4024100B8
-:10F9A000B2440E9A03A680C9003A600A9003A4806C
-:10F9B000C90034400C9003C2043000000000000075
-:10F9C0008004640089402278089402E410B9003C65
-:10F9D00062189482A40089C82270481E016780D1F1
-:10F9E00000BC42081002252089022240089002E053
-:10F9F000001000000000000018052400B12822407B
-:10FA000008B082640439412E480A90020418A920E3
-:10FA100022424A90022C0489042B4802D002B40AE4
-:10FA20008D8023C048D002C60040000000000000C6
-:10FA3000080404808120A048281002C400B1242AB0
-:10FA4000400812428580A120A048089002440095F9
-:10FA50002C2D5A0A728214A085A8214A085282C20B
-:10FA60000100000000000000B80D4140F8503200D5
-:10FA70008C05036140F8512E000A85022000E850F1
-:10FA80003214068517A000C8203A080E8203A08011
-:10FA9000C82032082CC203EE035000000000000012
-:10FAA0009819F440FF103F440BB003E400F9103DF7
-:10FAB000400FD103F4589D103F444FD003D500F9B7
-:10FAC000003E408D9003E4B8F928BA6A0F9003E62F
-:10FAD00006700000000000001801E700FD883E608D
-:10FAE0008FD0032401DD8073400FD803A604CDA27C
-:10FAF00033781CD0033401F5883B680CDA47378033
-:10FB0000CD8832620CDA03060070000000000000AD
-:10FB10003810E380B8802E140B0A822280B8F8A235
-:10FB2000000B8FA383E088EB22A9088812A005B8F8
-:10FB3000002AAA88801362828880222888A4020E64
-:10FB400004300000000000000805C500B10A2C4187
-:10FB50000B10060420A10000408B1046C401911137
-:10FB600024586890C20400B100A85009140A0595F1
-:10FB7000A108A04228110A02017000000000000044
-:10FB80001815A418B9202E500B90062409B900228C
-:10FB9000408B9102840099642440589002A420BBB9
-:10FBA000002A4009B0020501A900224088920206FD
-:10FBB0000460000000000000A015E600F9403E408F
-:10FBC0004F980B2480D90022720B9803E484D9004B
-:10FBD000B6700899022400B9002A400D94C225008D
-:10FBE000A90022400C9403280470000000000000CB
-:10FBF0002801A680F9083EC00F9143E400F9003EB9
-:10FC0000500F9803A500E9003A640F9003E400F94F
-:10FC1000003C406E9003E420D9003C400F9082CA23
-:10FC200000600000000000002810A000E8003E0076
-:10FC30004F840B2000F80036010E8003E000C8401E
-:10FC400032102D8003E054C80036100F0483E050BA
-:10FC5000D80412000C000B0A042000000000000071
-:10FC6000280528008E422EA28BEA022808BE89377A
-:10FC70008448E01228028EC023B04D6062F80086EE
-:10FC80000023800BE002F8000E00228008E4020A44
-:10FC9000004000000000000028054C00A3002C805C
-:10FCA0001BB09A4C109B8024C00A30000C049B208F
-:10FCB00020D60830028E08A30424C0193402C707D6
-:10FCC000AAA4A0C04834020A0050000000000000AE
-:10FCD000A0010E0087002DC00B40025C40B314252C
-:10FCE000E0087A029EC09240A000496002CE028ED7
-:10FCF0000121C08B5402C408864021C88810022804
-:10FD00000040000000000000A8081EC0E4803DE2A2
-:10FD10000F58035E90B6A235E00E7C231C00D680FF
-:10FD200031E0847803DE00C78035E00F6803DE0031
-:10FD3000E38033E82C78032A020000000000000072
-:10FD4000081DAC90FA007E400F9003AC01FB003C14
-:10FD5000410F300B2D04EB013EC00EB003EC00FA56
-:10FD6000003FC00F8003EC00E9603EE40F9003C247
-:10FD700006600000000000000005FE20FF903E200D
-:10FD80000CA9072E44C99130A00CB8632F44CBA115
-:10FD900036208CF8033600CF8233E00CF8232E0097
-:10FDA000CEC03BE00C6803000070000000000000C3
-:10FDB000A8119C84B3542CF428BA8A3E4081A0290F
-:10FDC000B00F7842AE00839033E80DE100854082A9
-:10FDD0002423C60D71035EE087002BC10D44022A67
-:10FDE000046000000000000000009C0835146DC095
-:10FDF0008872325C8084302B880A70425CA891083B
-:10FE000025C80970024C22830A61C009200204003F
-:10FE1000870021C0086002000020000000000000F0
-:10FE20002014CC10B3856CDC0834024D21810028ED
-:10FE3000024A3112EF0C91C220F00830428E00824B
-:10FE40004020C8192802228183C028D409000A084A
-:10FE50000430000000000000A815BC00FBA03EC05C
-:10FE60008C04127D10CF023A5008C0427D525801D6
-:10FE7000362269D0132A00888232F009B8822F0016
-:10FE8000C9C823C00C8A032A0460000000000000D7
-:10FE90008000EC00B9403C504F8023AC12FB002A9C
-:10FEA000C06D8013AC00E804BA100F8003E800F3C3
-:10FEB000083C800F9083EC04F9602CC20F8083E033
-:10FEC00000300000000000000110DC00EC2C3FF0CE
-:10FED0008CFA8BBC00FE003F000F79033C00CE087B
-:10FEE0000BC20CF003BC00FC0033408C7A033A00D8
-:10FEF000C50033C04CC803004430000000000000BF
-:10FF000081046C0088C02EE00894022C00BB80663F
-:10FF10003016B0022C00DA4C22F008F003EC00EBB3
-:10FF2000C022680094022C02A98022C0080C02A002
-:10FF3000401000000000000080052C00AB042EC023
-:10FF400008A4062C04AB102E604380826C018180D3
-:10FF5000280A089100E000B88002E00880022D80A5
-:10FF600088C022C00882022000400000000000007B
-:10FF700008040C0080442CC828A0220C04B3262CB2
-:10FF8000C88801060CE09120200C380422C048A348
-:10FF900042A0810800020C80810020C0280002825B
-:10FFA0000100000000000000000D7C00A9403E445C
-:10FFB00008B1032C40EA492E0D0BB6137D80C940D1
-:10FFC000BAD00CB403AC00F80032400C800B200017
-:10FFD000C500B2C00C800300035000000000000008
-:10FFE000A01DFC04FC003DC50BF100FCD0772937B7
-:10FFF0000C8E7403FC08FD693FD80FF003BC00EFC2
-:10801000003F4007C003F040FD003FC00FC003E831
-:108020000670000000000000C00DFCC0DC803FC8EE
-:108030000F48037C20FF6837E00EF1039C00BF204F
-:1080400037E00CC8133C40ED60BBE42C434B70A000
-:10805000CC2C3F090FD843700070000000000000D6
-:108060008000EDC0B8802FF40F98023F00BF42227D
-:10807000CA08F4023E00BFD0226028880A3D808DE5
-:108080004022C80881022180DBC02EA50B98422027
-:1080900004300000000000008805CC10B0002CC0A7
-:1080A0000B2002CC00B32026C08A36128C41B300CC
-:1080B0002E400800020D81A13022C889A24208206A
-:1080C000B0002C400B902662017000000000000000
-:1080D000C015AC00B8502EC00A9002AC00BB002204
-:1080E000C008B0622C10BB042AF04A88020C008140
-:1080F0000022C009B8802600B8802E210B900230E3
-:1081000004600000000000008015EC00D8C03EC0F4
-:108110000B8003EC00FB0036800EB003AC00FB00CC
-:108120003CE00C0C032C00E90010C00C8C03060092
-:10813000F8CD3E220F18034004700000000000003C
-:10814000E001BC00FF003EC00FF0037C00F7023FDF
-:10815000E40F70037C04B70037400DC003FC00FD42
-:108160000037D00EC043F400DF003F808FDA03F801
-:1081700000600000000000004010AC00F8103AC0A1
-:108180006DA613EC00CB003AD00FB0032C10DB101F
-:1081900036D80D8403EC06C9083AC00E8603A860E1
-:1081A000F8203A400C900354042000000000000026
-:1081B00098053C00BB4023D00830023E10AF0020A1
-:1081C000C00BF0023C008F502EC8068A02FC008DC6
-:1081D0002482D60832022D083A4022800D90036294
-:1081E0000040000000000000E8054C00B02028C25C
-:1081F0000804028C00130228C00B30020C3093805C
-:1082000024D0092002CC00914008C02A1402810029
-:10821000900068000818023A0050000000000000BA
-:1082200070011E00B4A021E008C8129E00B3822194
-:10823000E00B7A0A1E0097802DE10A4802CE409595
-:108240009029E40858029A00B78821E00958025C96
-:1082500000400000000000004A000C00F08038C41C
-:108260000C25038C20930038C40FB0030C80D3007E
-:1082700034C00D0413CC0899002AC00E21038804D1
-:10828000F30038C00C11831202000000000000004F
-:108290004215BC00F4003FC30EC0031C00AF4A7F70
-:1082A000C40FB203FD01EF103F840FC003FC00E9CF
-:1082B0000037C20EF1477C00F7003DC00F5003D0DD
-:1082C0000660000000000000AA15EC08F8003ECA95
-:1082D0000F9003EF21FB807A408FB2A12F00CB607B
-:1082E0003EC00FB003EDA0E93032C02DB003E40072
-:1082F000F8003E000FB003EA00700000000000002C
-:10830000C8919D00B4012DC80B7002CC808F202134
-:10831000C08B76035D00870A2DC00B4022FD008DC7
-:108320001023C8085012D400B7002DC00B7002F201
-:10833000046000000000000081009E00B4802DE079
-:108340000B7C02DE40A7822DE00B3A028E00879064
-:108350002DE00B58025E00A5A265E0086882DA00F5
-:1083600095802D600B7802E00020000000000000E6
-:108370000884CC00B0092CC00B3802CC0083002E3E
-:10838000C00B30424C0083002CA00B0402CC0081B7
-:1083900000A0C008B006CF80B3102CC40B3102C3BC
-:1083A0000430000000000000E805A800FE803E80C8
-:1083B0000FE813E800EA003FB00FA003A802C200D4
-:1083C0002F880FE003E800EA0036000CE003F920F4
-:1083D000DE803FA04FA803FA046000000000000008
-:1083E0004800E000F8103C100F8083E100E8002214
-:1083F000060F0013E001F8003E000F8083E000F854
-:10840000003E000F8423E000F8003E100F8003D2EE
-:1084100000300000000000000800E400F9103E44B5
-:108420000D9003E400F9003E400C90122400F91076
-:1084300032408F9003C400C90032100C9C0124000C
-:10844000F9103E700F9002C20430000000000000DE
-:1084500080146400B9C02E48089102E400B9002ECF
-:10846000400D90036700B9802A600B9902E40081F7
-:108470000022402C90122520B9482E520B9402E085
-:10848000001000000000000018052400B9002E4074
-:10849000689046E400B9002EC0089002A460B900BC
-:1084A00022480B9006E4028900A040089002A61022
-:1084B000B9000E400B9002C6004000000000000012
-:1084C00008040480B1002C48081002C484B1202C98
-:1084D00040091202C480B12028400B1002C48089D8
-:1084E0002020404B120A8484B1202C488B1002C2F9
-:1084F0001100000000000000B80D6140BA002E001D
-:108500000C8003E808F8503E140C85032000B800E6
-:1085100032000FA003E140C85032140CA503A14063
-:10852000F8003E000FA003EE035000000000000022
-:10853000880DE440FD003E440FD003E440B9113FF4
-:10854000400F91036444F9103F400FD003E440FD15
-:10855000103F108CD1037440FF103F440FD003E64E
-:10856000067000000000000008056620ED00336979
-:108570004D50435600F9A034400F9A0B3400DD8073
-:108580003B400B5003E400F90032E00ED003F4004E
-:10859000FD003F400CD003C600700000000000004A
-:1085A0007810E280880422100B80022009B8F022A3
-:1085B000000B8E12A000B8522E000B8002E005B80E
-:1085C000AA233E0D8002E000B8003A00088002CEE7
-:1085D00004300000000000004805C420A900A444A5
-:1085E000099002C500A1082C400B11820400B100C3
-:1085F00028400A1042C400B500A140081002C4007F
-:10860000B1012C40081020D20170000000000000D1
-:108610001815A400890422400B9000AC0039002AF0
-:10862000400B1002A400B9002E480B9012E400B9D0
-:10863000002160099222E428B9000A50089006C679
-:108640000460000000000000A015E400E9003640CE
-:108650000D9003E400F9003E480F90032400D90078
-:108660003A780E9803E400B900B2400E9223E60077
-:10867000B9503E702C9003E8047000000000000028
-:1086800068018400F9003E404F9C236400F90436E1
-:10869000480F9003E400F9003E600F9203E400F9F4
-:1086A000003E408F9083E444F90078640F9003DA31
-:1086B00000600000000000002810A000F8003E004C
-:1086C0000F8203A040E8003E000D800320C0C88058
-:1086D0003E120F800360007C0033000D8013E01019
-:1086E000C8643E080C8203CA042000000000000099
-:1086F00028052800B6E00FA00B60823800AA002EE3
-:108700008008A042BA00AE202F880BE5022800BAEC
-:10871000D8378008EC02F8048E002F900DE002CAD2
-:10872000004000000000000028054C00B0242C6030
-:108730000B38028E80AB002CC00930020D0800807F
-:108740006CD00B3402CC00B8C02000483412CC40AE
-:1087500083002CE00A3502CA00500000000000002F
-:10876000A0011C40B7002D028B60029E0087202FC5
-:10877000E00872029E00A4002DC00BF8029CC0B35A
-:1087800002A5C0085086FE0087002FD0097002E8BD
-:108790000040000000000000A8081E00F4803D20FA
-:1087A0000F58039E0067803DF80D38021A10448070
-:1087B0003DE00F5803DE20B48033A02C6803D600C0
-:1087C000C7813DE00C7803EA0200000000000000D1
-:1087D000081DAC08F8003E008F80036C003B123E81
-:1087E000CA0FB503C800F8047EC00F90036C80FB6D
-:1087F000043A400F9023C800F9013CC00FB003C2F7
-:108800000660000000000000C005FE00AC9031488A
-:1088100008F803FA00CF803FE00CFC133E04FC8014
-:1088200035A00C7803BE00DF803B2024F8032E40E7
-:10883000CF8033E003F903D0007000000000000097
-:10884000A811BC0080000100087202D00087002D32
-:10885000C80AF0029840F50061410074021C00B49F
-:108860000021C80860023E20860821D80F5002EA85
-:10887000046000000000000018009C00A40021001B
-:10888000085002D80097002DC08871021400B00073
-:10889000259008C0829C40930029A1886002141290
-:1088A000874029400B6002C4002000000000000047
-:1088B0006014CC0080D0A000081C02C00093002CE3
-:1088C000D00AB0268000B30024E40808028C00B06F
-:1088D0000202410808020301810028421A0042D81E
-:1088E0000430000000000000F815BC00E8C0328031
-:1088F0000CB503E4009F003DE00CF00B2400F800F1
-:1089000036E00C2503BC05D8022A0008BA022A006A
-:10891000C1023A508B9003EE04600000000000009A
-:108920008000EC00FB083E800FA103EC04EB022E5C
-:10893000C60FB0174400E8003A400F80026C00FBFD
-:10894000003EE00F9093E100D90026708F9001E186
-:1089500000300000000000000010FC00FC03372481
-:108960000DF803E000FF003FC18DF00B3800CC0094
-:108970003FC00FFA033C0CFC043B800CA003942086
-:1089800089053B004FD023C00430000000000000E8
-:1089900080046C00B006201388A802EB00BB002EF8
-:1089A000C008B0022A00A8802EE00B941A2C00BB4D
-:1089B00000A240299802E200A98422200B9802E03C
-:1089C000001000000000000080052C00B80022000C
-:1089D000098202E600BB002EC00BB0022600888090
-:1089E0002EA00BA0022C00B3002A00099802EA2056
-:1089F000A9802A609B9882E00040000000000000EF
-:108A000008040C00B8002000090802C400B30026C6
-:108A1000C0003002000081002C410B00020C00B0AD
-:108A20000020C00B0002C880A80020410B1002C229
-:108A30000100000000000000000D6C10F850B200B2
-:108A40000D8003E000FB003DC00DF0132402C806BA
-:108A50003E800FA0033C04FB0078800CA003E400E0
-:108A6000E9001A400F9003C003500000000000000E
-:108A7000A01DFC00F4203F000EC002F001FF003FEB
-:108A8000C00FF023F000FD003FC00FC003FC00FC4E
-:108A9000003F409CC003F040FD003F400FD043E842
-:108AA0000670000000000000C005F000ED23B7488C
-:108AB0000CE1C37CC0DD8037E00FCB03FE08FC284F
-:108AC0003FF01CFB237C01FF1477E24FE8237C007E
-:108AD000C48033482CF822300070000000000000F1
-:108AE0008010E0E0C9C0225B8896222D00892222F6
-:108AF000CA0B9E22E2A0B9612CE0889F023D85BF8F
-:108B000060265048A0023C008800225008B0022095
-:108B100004300000000000008805C080B11020442F
-:108B20000BB202CED081082CC00B01028C08B30816
-:108B30002CC90810628C60B33224800AA0026C0336
-:108B40009A01264448B04262017000000000000013
-:108B5000C015A4A08B0222E00BB062AC9899002A49
-:108B6000C20B9806E400BB022EC00891422C10BB39
-:108B7000006E800A80026C001B00064048B80A7034
-:108B800004600000000000000011E700A1007678FA
-:108B90000FB003E810D9003ED04B9E13AC08B8A02C
-:108BA0007EC608A8022C01BB0026304E20034C18BC
-:108BB0009980B4404C3A034004700000000000006B
-:108BC000E001B200FDC53BC04CD0036A02ED0633A4
-:108BD000C40FD053F800FC907FC10F7803BC04FF92
-:108BE0000037640CF103A400EDA13B400BF083B807
-:108BF000006000000000000040108C00CB203E719F
-:108C00000FB3039802FB0236480F9003EC20F800E4
-:108C10003ECC0484032C00DB043C100FA003EC00CA
-:108C20009B0032400C9003D00420000000000000A4
-:108C300088052C028B482EE00B34036B008BF52249
-:108C4000F20B9C03AF00B8502EC008B0027C008F1E
-:108C5000000E5D0B8002F54083502354089C02E611
-:108C60000040000000000000E0044C0081812E4024
-:108C7000032C020433990020F04A2880CC40B00035
-:108C800026100820024C0083002CC0092002CC00D2
-:108C9000A00228400808027A0050000000000000EE
-:108CA00020010A0085802DF80BDA02D64085A0212C
-:108CB000E00B48069204B5802D210800024E008783
-:108CC000A42D600B6802DEC2AD902B60285882DCB8
-:108CD000004000000000000048084C40C3102C6C0D
-:108CE0000F300386A2F9B0B0E00F2983CE44F380A1
-:108CF0003CAC0C30030C00C3003CD50F2003CEC1AC
-:108D0000E010B8400C0003D2020000000000000098
-:108D1000C01DBC00EB003ECC0F32036408F9003BE1
-:108D2000900FF043E440FB343F8107D103AD20EBCB
-:108D3000207FC40FE103FC50CD1035400FD003D08D
-:108D40000260000000000000A805E404FD043D40AE
-:108D50002D30023C00C9013EC04FB843EC10FB006F
-:108D600032400FA023EC80CB3632804DA8032C106C
-:108D7000CB0032400C90036A00700000000000003D
-:108D8000C8119008B5002DC0085002BC0285042D02
-:108D9000C08E6006D804B70421400B7002FC80AF7F
-:108DA0002821C00B70020640870021500850023273
-:108DB000046000000000000080009E20B7802B703F
-:108DC00008F8061E0087802DE00B7032DE04378421
-:108DD00025E00B6806DE80878021A11B68021E400B
-:108DE0009F80206008580220002000000000000042
-:108DF0004814CC20B3002C8088B4228D0083902CA2
-:108E0000C00A3802CE08BB2024D00BB302CC00A38A
-:108E10000060D20B202A04089350204008170A0251
-:108E20000430000000000000E815BA00BAA03F843A
-:108E30001CE00B38408E062E800BE303F880FEE426
-:108E4000B7900FEC02E8008A00A3A009E4032A020D
-:108E5000DEC0F3800C6C033A0460000000000000E8
-:108E60004801E000F8403E000F8413E000F8002EB7
-:108E7000300A8403E004F8003A020F8013E000F89F
-:108E8000003E040D8083E040E8203E002F8003D2A6
-:108E900010300000000000000810A400F9003C643D
-:108EA0004E90832480C90032E00F10032500F900A2
-:108EB00032440F92236400C10032400C9013E4004E
-:108EC000C90022400C9003020430000000000000A2
-:108ED00080046400B9202E404896222500D9C0A203
-:108EE000700B98022400B940A2704B90022400D964
-:108EF00000A2402C9422E4028900A240289413206E
-:108F0000001000000000000018012400B9002E40ED
-:108F10000A900204008180A2440B910225001940AE
-:108F200062400BB402440089002040089082C401D2
-:108F300083022840489082060040000000000000A4
-:108F400000040580B1006C5108141A05009300203C
-:108F5000408B14020500B12020500B1406048091B0
-:108F6000202040091002C4A88100284A08904A42E3
-:108F70000100000000000000B80D6000F8003E0095
-:108F80000E80032801C85032948BA0032000B050FB
-:108F900032800F80076151C85022000C0003E0842A
-:108FA000C8043A080C00032E035000000000000023
-:108FB000989DF440BD413F500FF403F510FD003E75
-:108FC000400FD403F400FF102F404FD440A448F9C1
-:108FD000123F5A8ED283F4A8F52C374A0FD283A6BB
-:108FE00012700000000000001805E680FD283F4CCC
-:108FF0000F50033C44CD403FD00DD0021401FDA0E2
-:10900000314003D003E789F9907E500C9403E6C009
-:10901000C910326D0F9102C6007000000000000000
-:109020003810E080B8012E0C8B8482204288A06E1C
-:1090300020088003600098E82200098002E3C0E86D
-:10904000D02E28088A23E284D8A0223D0BC802CE65
-:1090500000300000000000004805C5B0B1002C48F9
-:109060000B13020402B1202E40881022C400B11458
-:1090700024400B1052C400B1212D480A5202D500E1
-:10908000BD00AD400B5202D2017000000000000094
-:109090001855A500B9822E498BB012241099022EC2
-:1090A0004008B200650099802644099102E409A9AC
-:1090B000042E460AD402B400BD402F400BD002C695
-:1090C0000460000000000000A015E740F9802E6257
-:1090D0000F9C42240099012E682C92026400B94032
-:1090E000B6600F9A03E400B9002E703E9906E402C0
-:1090F000F9003E400F9803E80470000000000000F3
-:109100006801A600F9003E401F12ABE400E9903E62
-:10911000490E9803E400F1003A400D9803E400F989
-:10912000013E60059013E400592032408F9103DA2C
-:1091300000600000000000006810A000C8083E01A8
-:109140000F84630022E8203E130F8403E1C0D84C53
-:1091500032000C8443E000F80022100F840300006A
-:10916000C800B2000CC0030A042000000000000088
-:10917000280528008E002F864BE00239088E202D0E
-:10918000900BED92F8028EE0A39808E002E808BA8E
-:1091900000628008A00228000280028048E0034AA2
-:1091A000004000000000000068054C0083102CF017
-:1091B0000A142A0D1AB30124D00BBC32CC080300C8
-:1091C00020C80B3002CC00B30222C00930020C11BF
-:1091D000830020C02820020A005000000000000088
-:1091E00020011E0185002D000B7002183286002D13
-:1091F000C00B6016FE04860027A08B7042DC80B78F
-:1092000080210108F80A1800860820A008E80A68EA
-:10921000004000000000000028083E02C6803DE03B
-:109220000F48030604F58235E00F7803DA00D38097
-:109230003160077803DE20F3B081E04F68070E024B
-:10924000CF8031E00C78132A0000000000000000FD
-:10925000081DADA0F9003F000FB053F810A9003E63
-:10926000000F8001EC00FB023AC00CB003EC00FBE5
-:10927000743C000F2003E800FA003E800F3003C268
-:1092800006600000000000004005FE028F8035E00F
-:109290008DD9032EC4F68032A40CB803DE00CF9023
-:1092A0003CE40CB803FE65FF800FEC8FF803FE0072
-:1092B000C58033E00F68031000700000000000005C
-:1092C000AA119C8084B0202029730A0E82A2A0A239
-:1092D000A04F3B038784B2802CA00A7D02DE80F77A
-:1092E000202506087002C840840035800B60036AA0
-:1092F000006000000000000000009C10863827C0BD
-:1093000049540654401D2021CA096140F880B72005
-:109310002F00897012DC81B7042DC90A6002CC00CD
-:109320008D002DC00BF8020400200000000000009A
-:109330006014CD288000240009B0224C02A1012035
-:10934000301B2302AF20B3082C801B3000CC04A3B9
-:1093500001263008AC22E80280082E804BB4025867
-:109360000430000000000000A815BC108B8036F00F
-:109370002DBC0B6C01DA0422407D9422E400AB4446
-:109380002EC009B802FC00BF003EF0CA9202E402FF
-:10939000CB006E400F84012E04600000000000002E
-:1093A0008000EC00FB003AE02EBC039808EA40364F
-:1093B000438C9003A4442A403E100EB583EC14FB6A
-:1093C0000026000E9203E040FA0016000F8013E022
-:1093D00000300000000000000110EC02FA803FE2C3
-:1093E0000FB00B2400EF92BBE01CD0037400CF053C
-:1093F0003B400FC8035C00CF0032C24DC123344054
-:10940000CF0017440CD1830004300000000000009E
-:1094100081046C008B842E540BBC0A29808B803213
-:1094200000089C03A700AB842E7C0B80022C10DB71
-:1094300001360008800220008200220008900224E9
-:10944000001000000000000080050C0089106690EC
-:109450000BB8026E12A34120040A9822E200891977
-:109460002EC04B31226C08830022C00990022400D8
-:1094700089002A400880022000400000000000000F
-:1094800008100C0080202C0E1B300204418020208C
-:10949000121816420050A0402C881B30020C8193F9
-:1094A00000240008102A000A8800280028000A0268
-:1094B0000100000000000000000C7C11E80026986C
-:1094C0000FB013210CEB603AD82884A2E180C820A9
-:1094D0003E5E1F82037C00CF0032C04D8007250016
-:1094E000C90032400C900300015000000000000051
-:1094F000A111FC00F8131E000BF001F0D0F9191FA8
-:10950000084FC013A100F8623FC00BC407ED00FF75
-:10951000003F000FC023F0A0FC0033000FD003E891
-:109520000670000000000000C005FC00FF0C3F209A
-:109530000CC9033200CF383FD00F4803FCA0CE2225
-:1095400033000FC1033C00FF003DC44CC0238CE43A
-:10955000FF10372008F103F0007000000000000049
-:109560008010FE00BF802E74052202A210DF612F42
-:10957000D08B90023DA4AA9022F40B07121D20BBB1
-:10958000C02FD8889782FD80EF72220828F623E04A
-:1095900004300000000000008805CC40B3002C001F
-:1095A0000882022200830108CC8B2082CC0090002C
-:1095B00020004B12020D80B3402CD80820428C8032
-:1095C000B3202602183326E20170000000000000DC
-:1095D000C015AC09BB002E60088002A2009B002EC3
-:1095E000C00BAC022C00BA0622C20B9402AC10BB1A
-:1095F000002EC108A802EC00AB00220008B006F063
-:1096000004600000000000009015EC00FB043E60C8
-:109610002882130E08CB003AC00F8C03EC11DB201C
-:10962000B2904BA80B2C00BB002CC00C8813AC00D4
-:10963000F300360648B012C40470000000000000B9
-:10964000E001BC00FB083D408FEA01F400FF012F60
-:10965000C00FD022FC04AF003FC08FE9037C00FFA5
-:10966000003FC00F9043FC20EF023F008FF003B893
-:1096700000600000000000005010AC08EB00124039
-:109680000F90032820AB003AC08F8583AC10F350B5
-:1096900032904C34136C00FB003EC00C98032C40FD
-:1096A000EB8032120DB00B500420000000000000CF
-:1096B00088013C100F05A2500C100222108F0023CD
-:1096C000C00B88123C009B8222C008B0023C008F75
-:1096D000A02FC008B0023C088F02200008F003262B
-:1096E0000040000000000000E0054D20930020B283
-:1096F0000B10020100A30068C00B8402AC00B38011
-:1097000020400A30024C00A3042CC00800020D00C7
-:10971000A3002024083002380050000000000000A0
-:1097200070011C20978023600878123A00839129E9
-:10973000E40B59021E00979020FC0A78021E008755
-:10974000902DE01959021E80838061A008780218CC
-:10975000004000000000000048080C40D3323006F2
-:109760000F30030464E30138C41F30078C18F10084
-:10977000304C0E30034C00E3002CC00C20030E00D4
-:10978000E30032080CB103120200000000000000E8
-:10979000401D9C80EF103D444FF107CC00FF083680
-:1097A000C6CFB003FC009700BECC0DB103FD04FF93
-:1097B0000C3FD29EE04BFD20FF023F800EF013D005
-:1097C0000660000000000000A815ECC0CB283EC0D9
-:1097D0000F8003EC00FB0132E90C28032C00FB0096
-:1097E00032C00CB4832C01EF00B2C80C20036D0012
-:1097F000CB103E000FB203EA007000000000000032
-:10980000C8919CC487602DC00B6002DC00B7122099
-:10981000CC0A70021CC0B300A0C0C870221C80B764
-:109820002421C84850020C8087102D400B7282F210
-:10983000046000000000000081008E0287802DE09F
-:109840000B7812DE00B7A021E008F88E1E40B78822
-:1098500021E00838021E40B3A120E848F8825E02E9
-:1098600087802D220B7902E000200000000000001C
-:109870000804CC0483022CD40B3002CC00B300A02B
-:10988000C08A38060C00B38020E14839122C00B39E
-:109890000022C008B0826C0083002C480B3002C24A
-:1098A0000430000000000000E805A800CA003FA046
-:1098B0000FE403D800FA0032800CE8032800FA40D5
-:1098C00032A82CA0092808F20032800CE4036800BA
-:1098D000CA003F800FA003FB0460000000000000EE
-:1098E0004800C000F8013E120B8003E040F8003E43
-:1098F000004F8403E004F0083E004F0003E000F84E
-:10990000413E002F8403A000F8003E000F8003D2E8
-:1099100000300000000000000800E600C9123E50C0
-:109920008F9083E420C1003A410F9003E400F900D6
-:1099300030680C90032400D9003A400E98032400AC
-:10994000C9903E690C1003020430000000000000C2
-:109950008004674A89802E500B9002E480A900227F
-:10996000400B9002E400B9012240089002241089C3
-:10997000002240089302242289422C604890022051
-:1099800000100000000000001815240099002E406F
-:109990000B9002E40089002A400B9002E400B90019
-:1099A000234008D002240099002A400A900624404F
-:1099B00089412E400890020600400000000000008F
-:1099C00008040C8091202C480B1002C400A1202018
-:1099D000480B1002C480B120A14908524A0480817A
-:1099E00000204848120A048081202C4028120202DC
-:1099F0000100000000000000B80D6008D8043E809F
-:109A00000F8503E000C0503A140FA503E140F802AF
-:109A100032802CC5032140DA003A140E85432140E0
-:109A2000C8523E140C850B2E0350000000000000AD
-:109A3000881DE444E9103F444FD002FC00F9123E77
-:109A4000440FD003E440FD103E444F9103E440E94D
-:109A5000403E440FD103E440F9123F400F9103E62A
-:109A600006700000000000000805F6A0FD80B3406D
-:109A70000C10031400FDA032400FD103E400F58662
-:109A800033602C9A832404FDA822400D5043F40037
-:109A9000FD0033400F90030600700000000000003E
-:109AA0007810E100B80022002880022000B800A24F
-:109AB000000B8A12E000B80422140884022000B8C7
-:109AC000402000888002E000B800A2000B80020E57
-:109AD00004300000000000004805C400B1422040EE
-:109AE0000810020400B14020400B1006C400B14031
-:109AF00024400810024404B1006040091002C40070
-:109B0000B10020400B1002120170000000000000A4
-:109B10001815A400B90222600894022400B9012299
-:109B2000400B9006E400B92026400894026408B96E
-:109B3000002240089202EC08B90422410B100206F0
-:109B40000460000000000000A015E410F100326085
-:109B50000C940B2500F90032408F94D3E400F900F7
-:109B600036404C900B6400F10032400D9212E4003C
-:109B7000F90032400F900B28047000000000000034
-:109B80006841A400F9003C408F9203E400F9003ED4
-:109B9000400F9C03E400F900BA402F9023A400F981
-:109BA00008BE40CF9003E410F1013E410F9003DA6C
-:109BB00000600000000000002810A0C8F8003E036C
-:109BC0000C8403A110E80032008C8583E000C00003
-:109BD000380C2C00036000C8003C000D80022010EF
-:109BE000C820B2020F8003CA042000000000000059
-:109BF00028053910BE046FA008A0023A008200A216
-:109C0000808DEC03A8008A00238008A02228008E03
-:109C1000CC2F8008E8C2B8008E6023900BA002CA47
-:109C2000004000000000000028054E08B0722CD053
-:109C300028B0068C01A10220C0083802CC008300A5
-:109C400020C02930024C0081002CC00832020C4098
-:109C5000830020F40B3002CA005000000000000016
-:109C6000A0011C00B4002DD048F2021E2185202046
-:109C7000E80972028E808F0120C00972020E80876F
-:109C8000002DCC1858028E00850021C00B7202E80E
-:109C90000040000000000000A8081E00B4802DE075
-:109CA0000C78839A00EDD031F40C6A03DE82C78011
-:109CB00039E00DF8835EC2C5803DE80C68031200F0
-:109CC000CF8031E00F7E83EA020000000000000038
-:109CD000080DAC08F8003CC00FB303EC00F9023EDD
-:109CE000C80FB003ED40FB00BE800EB303EDC0FB18
-:109CF000003ED22E8003EC02F9003EC00FB003C23A
-:109D00000660000000000000C005FE00F09133E096
-:109D10008FF803FE00FD803FE00C78833F00CF808A
-:109D20003FA00CF8033E00CD803FE00FF813FE107B
-:109D3000FF803F200FF943D00070000000000000BA
-:109D4000A8119C00B4C131C00B7002D410E5202FC3
-:109D5000C80F40035C0087002D800870021C4087FC
-:109D6000102DC00B7602DC80B7002DC00B7002EA0C
-:109D7000046000000000000010009C00B62221D00A
-:109D80000B7082D840B5022DC08865020C00871880
-:109D90002C040830028C0285002DC00B70469010F8
-:109DA000B6002D000B7022C400200000000000004F
-:109DB0006014CC08B200A4C00B3042C610A1002C25
-:109DC000C00A00024C0083002C080830028C00837B
-:109DD000002CC00B1882C400B0002C400B3012D8ED
-:109DE0000430000000000000F815AC0038003250CC
-:109DF0000FF003E620FD003FC008D0023C02CB80FC
-:109E00003C502CF00ABC00C9003FC00FBE03AC00A0
-:109E1000FA022EF74FF003EE04600000000000008D
-:109E20008000EC00F1003AF00FB003E900F9013EC8
-:109E3000C00F9013EC00F9003E550FB0016C00FB11
-:109E4000023EC00F9073E000F8413E000F3001E089
-:109E500000300000000000000010FC00FC0033C0D7
-:109E60001FF013F008FD023FC08DC0033C00CFA0DF
-:109E70003F800C70033C10FC0037C00FE003B000C3
-:109E8000FE003FC00CF0030404300000000000009E
-:109E900084046E00B9C2A2F00BB042EB00B9002EF0
-:109EA000C00F18036C00D9812EB00AB0422C00BA42
-:109EB000C62EC00B8C02E300B8C03CA00DB002203F
-:109EC000001000000000000080052F00B88022E292
-:109ED0000BB002E620B9002CC008B8020C008B00C1
-:109EE0002E3048B0022C00B9C02EC10B8802EE10F3
-:109EF000B9C02E2019B00220004000000000000070
-:109F000008040C00B00020C00B3006C00091002CEB
-:109F1000C04980024C0491002C008A300A0C04B124
-:109F2000002CC01B00124910B1002E200930020283
-:109F30000100000000000000000D6C00B82022C0ED
-:109F40008BF003E008FD003FC00CA0033C00CB00F9
-:109F50003E004CF00A3C00B90037C10FA003E000FE
-:109F6000FA003E000DF00B0003500000000000005E
-:109F7000A01DF001FC403F804FF002F000FD003FCB
-:109F8000C10FC003FC00FD003F004FF063FC00FD6B
-:109F9000043FC00FC003F080FC007B000FF043E8DB
-:109FA0000670000000000000C005F800C81033046F
-:109FB0000C40023400C8851FC02DD903FCC0DB282B
-:109FC00037640FDB033E00FF253FC80EF203FE207F
-:109FD000FFA437C40CC80330047000000000000068
-:109FE0008010E80088202200088812260489822E2A
-:109FF000F448B802FCC498C2227C4B9D422608BF9C
-:10A000001877E408F182EF00BBD022D80890836073
-:10A0100002300000000000008845C804A0002400B1
-:10A020000A00020C0082042CE0081002CC8083009D
-:10A0300024000B1006C801B3202CC0293202C80826
-:10A04000B10024D00882026201700000000000000C
-:10A05000C015A800A80C26000A80022C148A026EE3
-:10A06000E008B0024C08A80026200B9C02E400BBCC
-:10A070000422C019B002E801BB1102C0889002F0AE
-:10A0800000600000000000000015EC02EA40B6602D
-:10A090002E980B2002C8023EC00D9803EC02DB880C
-:10A0A000B6210F8803AC08FB002CC00EB043E5803E
-:10A0B000F06036C00C01434804700000000000004E
-:10A0C000E001BC00D6013B6485D903F00CFF003EE3
-:10A0D000C10FFC21EC00D7903B400F50033C00FF28
-:10A0E000003FC08EF003F440FD883FC02FD00278BF
-:10A0F000006000000000000040108C00DA403C408E
-:10A100000F10034800F9223CC20E9083EC02DB04DE
-:10A110003A080F8487E800CB003EC40EB003ED0080
-:10A12000E8423AC00F800B1004200000000000003D
-:10A1300088052C088A002E428B90022818BB4922E1
-:10A14000D038BC82FC00E8022262CB9C00EF60DFCA
-:10A15000002FC00BF002EC00094037C00B90023218
-:10A160000040000000000000E005481011002CA095
-:10A170000B2002440090C06434283402CC00938445
-:10A1800028400B0800CE0093002CC20A3002C00009
-:10A19000B24022C00B20023000000000000000008E
-:10A1A00070011A4085802DA00B68061680BD902591
-:10A1B00024187B42DE40A08021E00B6802D6009785
-:10A1C000902DE00B7802CE4092806DE40B7802086F
-:10A1D000000000000000000048082800D1803C88F2
-:10A1E0000B22034E80F2A13C242A3903CC40D3AC8D
-:10A1F00038C50F3082C800D3003CC00E3013C000F9
-:10A20000F10038C00FA0031A060000000000000093
-:10A21000401DB810FD343E800FE003EE0072003A9E
-:10A22000000FB063EC40F8223EC00FF003D440FFB3
-:10A23000003FD20FF003EC00CF0037C00FF003D087
-:10A240000620000000000000A805EE00EB0036E04C
-:10A250000DB0032000F08033C008B8032C80CB0081
-:10A2600032800FA0136E08CB2832E00DB483E200D9
-:10A27000CA003EE00CA803020070000000000000CD
-:10A28000C8118C04830021C04870021000B702215D
-:10A29000C04A70020D48D40035C00E6002DC00A731
-:10A2A0004029C0097202D410A6022FC808700212F9
-:10A2B000006000000000000080009E00A78020E0F9
-:10A2C0000A38021A00B58021E008F8225C818380F8
-:10A2D00021A10B78825A1083A020E80A7B02DA00C1
-:10A2E00097C02DE408E802080020000000000000EC
-:10A2F0000814CC00831020C00A30020808B3702074
-:10A30000F80A30424C04931426C40A3802CC00A345
-:10A310000028C0AA3002CE40B3882CC028300A12D0
-:10A320000430000000000000E815A900EA80B690A3
-:10A330002F240B3904BEC033920CA00B6818CEC07A
-:10A3400033800FE9437800CA0032800FA013F84829
-:10A35000DE003E800CE0023A002000000000000019
-:10A360004800E024F8003E120D8093B028F800BCAD
-:10A37000000F8403A000F0003E020E8000E000F811
-:10A38000013E000D8003E000E8003E000F8003D294
-:10A3900004200000000000000810E400F900B27082
-:10A3A0000F90010400C9003E400C9803E404E90842
-:10A3B0003A480C9A03E400F90036400B100B268053
-:10A3C000F18032400F9003C2042000000000000022
-:10A3D00080046400B90022610B9002240889002ED9
-:10A3E000400D9A02E408A90022780D9406E410B901
-:10A3F0000022500B90022580B98036400B9002E07D
-:10A40000000000000000000018052400B5002342F1
-:10A410000BD00EB40089042E60089102C404B90464
-:10A420002AC0089402E410B10026420A90022400D7
-:10A43000B92162400B9002C60040000000000000FD
-:10A4400008040500B54021504B5006940281002CB1
-:10A4500060291406C500A1222051891402C400B14C
-:10A460002020480B14020401B10004500B1002C25A
-:10A470000100000000000000B80D6008B8003200C4
-:10A480008F8003B00088003E000C8003E000E804E9
-:10A490003A000C8002E000F85036000F80032004E0
-:10A4A000F80112004F8007EE075000000000000086
-:10A4B000981DE510F9403E500F94026501FD013DE5
-:10A4C000504F5013E500FD101F5007D443D400F93E
-:10A4D000101E440F9403D500FD403E500F5283EEF2
-:10A4E00006700000000000001815E440F9603F44C9
-:10A4F0000FD0C3E430F9013E420CD003E780DDA069
-:10A5000033400CD003FC00C9903F681E9103340017
-:10A51000FD003E680C94030E007000000000000077
-:10A520003910E000B8422E090B8402E104BE002E6F
-:10A5300010088022C280884022000A8002E000A821
-:10A54000D02E104B8A036000BA002E30088A028693
-:10A5500000300000000000004005C580B1606CD0F4
-:10A560000B1000DC0CB5002C41081002C5809110C6
-:10A5700068C0083002E40C81222C5008104204000C
-:10A58000A1002C5A28900252102000000000000068
-:10A590001815A400B9002E410B9012F480BF002EB4
-:10A5A00040089002E400A96060420A9412E500A904
-:10A5B000002E400B90026420B9000E40099002C6A4
-:10A5C0000420000000000000A005E400F9003E4166
-:10A5D0000F9023E400F9003E400C9003E404D1C046
-:10A5E000BA700C9803C400C9003E400E9003254089
-:10A5F000E9403E400C10036800200000000000000D
-:10A600006801A414F9003E400F9023E408F9A03C2F
-:10A61000C22F9003C400D9803E700F9143E400F92B
-:10A62000003E401F9013E620F9A03C404E90039A54
-:10A6300004200000000000002800A000F8003E02F6
-:10A640000F8013200CFC013E000C8003E000C8507A
-:10A6500032000F800B2008F80032002C8043E040CD
-:10A66000F8023A008F80030A042000000000000076
-:10A67000A88528083A000F804BA1022800BA822E34
-:10A680008848E402E800AE90A3900BE0003800BADE
-:10A690000037A008A002F8009EE022800BA0234211
-:10A6A000000000000000000028054C1033002CD0F2
-:10A6B0000B14020C00B2912CD0083E024C008340D7
-:10A6C00024C20B36008C00B30020C009B002CE00BB
-:10A6D000B3CC68C00B300202005000000000000044
-:10A6E000E0011C88B7252DC08B581A1C08B6002D18
-:10A6F000C0087402DC40A50025C01B78029408B78E
-:10A700008025E30A7102DC00978321C88BF102489F
-:10A710000060000000000000A8081F00F7E27DE0D4
-:10A720000F58431E18F6807CE02C68025E90C380B0
-:10A7300035E00FF8039E04FFA120A10D7803D60099
-:10A74000F78039F80F78030A0600000000000000C7
-:10A75000481DAC00FB407F410F1003EC04FA003EA3
-:10A76000D00FA003ED00E9002A000FB0036400FB46
-:10A77000403EC00DB003E400D30036C00F3803C222
-:10A7800006600000000000004005FE48CFC03360B6
-:10A790008CC843D600CC943FB00DF8037F00DF8017
-:10A7A0003F600FD803DE00CFCA3D600CF8133A4477
-:10A7B000DD803FE00FF8431800200000000000009B
-:10A7C000A8119C008F1133C0484112C44884112C39
-:10A7D000EC2ABA033C40D7482D410B6002D400D785
-:10A7E000013DC00DF0035A0084182DC00B70036AA0
-:10A7F000002000000000000000408C08870021407D
-:10A80000094002D400A4922DC80962825C0087002E
-:10A810002DC00B5002FC0087002D040870021C8024
-:10A82000B5002DC00BF00200002000000000000069
-:10A830006010CC0083002040090022C700A0412CFA
-:10A84000C14B08022C0093402C7C0B3802C720938C
-:10A85000002CC00930024F84B0802CC00B32105045
-:10A860000420000000000000AA15BC02CF00B24086
-:10A870000D1003E824EBC13EC02D98137C0AC2439F
-:10A880003EB00FA903E920CF003EC08CF0030D209D
-:10A89000FAC03FC00F74012A0060000000000000F1
-:10A8A0008000EC00FB023A408E9003E8145B503CC1
-:10A8B000504E8403EC00F8403E80078103EC08F31F
-:10A8C000003AC09F3003EC00CB203EC00FB023E81D
-:10A8D00004300000000000000190FC00FF003F4039
-:10A8E0000FD0033820CF0832C10ED003FC00FE0881
-:10A8F00031E50EE4033A00FF0033800FF02B240013
-:10A90000CCA03FC00FF00300443000000000000066
-:10A9100080046C00BB003A690B906E0800834136DE
-:10A9200040C888C6EC00884036800DA8036E50BB36
-:10A930000036C00BB0022400D9082EC00BB003E0D3
-:10A94000401000000000000080052C00BB002E60BD
-:10A95000038002200089012258089822EC01AB00F4
-:10A9600022000A10022800BB0022400BB00228007F
-:10A970008A002EC00BB042200050000000000000F2
-:10A9800008040C00B30028408B0002024089012417
-:10A99000D2281002CC00831024200808024E00B3F5
-:10A9A00004A0C00B3002088892002CC00BB002C279
-:10A9B0000000000000000000000D6C00FF003E00E1
-:10A9C0000F80022010895022D82E9622FC00EB40E6
-:10A9D00032C00A90032800FF0022000FB0032CA011
-:10A9E000C8003EC00FB003000610000000000000C9
-:10A9F000A019FC00FF0C3B000FC0027090FD003E50
-:10AA0000C90F96C3FC00FF003FC00FF003FC04FF1A
-:10AA1000043FC00FF003EC00FC003FC00F7003E8E0
-:10AA20000670000000000000C005DC80FB283F002D
-:10AA30000CC10BF102ED0037302CF103B240FF00E6
-:10AA4000BBC00F4806B200FC803BCC0CF00370800A
-:10AA5000DF2833040FF40330007000000000000012
-:10AA60008010FF40BF602E210882022000A9282A02
-:10AA70000009FA022000BF5123D8099802E430B03F
-:10AA80000023D008F5A225A48F423C100BB00A2069
-:10AA900004300000000000008805CC00B3082C0042
-:10AAA00028001AC084200024C84B3142C000930201
-:10AAB00020C6080006C081B3002CD8093202A0408D
-:10AAC0009301244C0B3202220170000000000000B0
-:10AAD000C011AC00BB022E0A0880826000A8002EC4
-:10AAE000E01BB00262013B0022C1099002E200BB00
-:10AAF0006026C108B02A26009B042E210BB002302C
-:10AB000004600000000000004011EC10FB003E104B
-:10AB1000088413EC02A90436200FB003EE80FB007A
-:10AB20003AC00CA003A28079401EC08CB0636A10AA
-:10AB3000D30036A207B0030004700000000000003C
-:10AB4000E001BC00FF003E204D41039C00FD20AB16
-:10AB5000000CF003B800F7003FC04DC903F400FF3C
-:10AB6000003BC02EF000F000EF003F004B7003F8F8
-:10AB700000600000000000004010AC80EB007E1080
-:10AB80002E8403EC00E00032500FB0862500DB205D
-:10AB90003AC00DB063E110FB4838C10F30032C04FC
-:10ABA000FB0832C00CB00B90042000000000000035
-:10ABB000C8053C008F006429288003EC02E804A843
-:10ABC0005608FC07E0000FA0BFC00B9502A000BB19
-:10ABD0000537C089F00A0DC8BF082A8008F0023284
-:10ABE0000040000000000000E0054C01B30224E03A
-:10ABF0000A30128003A300A80002B822C000B300EC
-:10AC000028C10B04020800B94028C00B300203041D
-:10AC1000B34420004A300238005000000000000019
-:10AC200020011E2017A065EC083802C241B3922B08
-:10AC3000640A38023601B7902DE003F8009A00B597
-:10AC4000802DE08978121E00B78029E00A7802087A
-:10AC5000004000000000000048080C0073B024C849
-:10AC60004E300A8002E20038940E31A2C800730010
-:10AC700018C40500030000F30038C007B10300004A
-:10AC8000F30130410EB0039202000000000000000A
-:10AC9000401DBD00EF1026C803B103E000EA817833
-:10ACA000C50CB5E3DC00C3003EC10FF083B000FF6C
-:10ACB0000037C00DF403E400F7003F400DF003D06F
-:10ACC0000660000000000000A805ED10CB283EC083
-:10ACD0000DB013AC10FB003A8004B403AC00FB04CD
-:10ACE0003EC00FA4B3E000FB8032C00FB003E80009
-:10ACF000FB48B2800FB043EA007000000000000083
-:10AD000048119C02874438C08D30024C00FF00215E
-:10AD1000C00870039C00B35021D44E6202D000BF23
-:10AD20000035D4097022D800BF2221C00B7202D294
-:10AD30000460000000000000C0009E4087802DE0FD
-:10AD4000097802DE00B68029A1287A32DE0037A019
-:10AD500025E0097806D200B78021E80B7902DE00F1
-:10AD6000B79021E00B7902F0002000000000000005
-:10AD70004814CC04830128C089B00A4F00B20020D7
-:10AD8000C4883016CF00BB0420C10A3206C200B30B
-:10AD90000024C0093042EF10B30020C00B3002D2B3
-:10ADA0000430000000000000E815A8004A003E80C2
-:10ADB0002DA00BAA80FE002B800CA043FB30FA00D4
-:10ADC0003E800FA083FA04FE1822800FA003FA84AD
-:10ADD000F20033A20FA003F20460000000000000A4
-:10ADE0004800E000F0003E002F8003A020FC023E5F
-:10ADF000001F8403A000F8403E004F8001E040F8AF
-:10AE0000403E000D8013E000F8003E000F8003D2AA
-:10AE100000300000000000000810C600D9003640D5
-:10AE20000F900B0400C90036686C9403E420B990BD
-:10AE300036400C9403E40029803E400F9003242008
-:10AE4000C90036400F9003C204300000000000002B
-:10AE500080046650890020500890022409D90020FF
-:10AE600048489006E40499A022400DB822640009E5
-:10AE70005032400B9002279089402A400B9002E00C
-:10AE80000010000000000000180124009900664234
-:10AE90000AD0123400850026404A9002E401B9012C
-:10AEA0002440589012C40029402E400B100A2480E0
-:10AEB000890526410B9002C60040000000000000FA
-:10AEC00008040480812061480852021481952020E2
-:10AED000400A3602C400B12000484110424401A19A
-:10AEE0000024480B12120480812028480B1202CA49
-:10AEF0000100000000000000B80D6000D8503600CE
-:10AF00000E852321428C5434140E8002E140F85007
-:10AF10003614048003E144E8507E150F8503214276
-:10AF20004A0036140F8003EE0350000000000000BA
-:10AF3000981DC440F9101E444E9103E440F9103F9F
-:10AF4000C00D9103F400D9143E440F90037400DD4A
-:10AF5000007A440F9103F440F9383F440F9383E79C
-:10AF600006700000000000001801F680F9A43F6898
-:10AF70000E9E436780D9E43F410FD8430400EDC0E3
-:10AF800036400C9003E400D54032400C9003F400AE
-:10AF9000DD0032402C9A03C60130000000000000A2
-:10AFA0003810E000E8C02E144D8F2223C0F8F0AA1C
-:10AFB000000C8003A2A0D8822200088002E800D8FA
-:10AFC000802A00088002E80888A83600488A82CED5
-:10AFD00004300000000000000805C500B1482E4004
-:10AFE0000A122244009104A4410A940624009142CA
-:10AFF0002441091002E40191202440091002C401F7
-:10B0000091002C40091402C2013000000000000031
-:10B010001815A400A9002E404810022400B940AA27
-:10B020004018B002E40899002240199046E4809943
-:10B03000042E40099002E40199042650099002C6AA
-:10B040000460000000000000A011E400F9063C408C
-:10B050000A90036402D900B6500E90232601F9002D
-:10B060003640299483E400D94836400D9003C70048
-:10B07000D1073A50CD9003E8042000000000000002
-:10B080002801A408E9003E408F9003C408F1003A6B
-:10B09000688F9003A441F900BE400E9003E400F9CC
-:10B0A000C038402E9003E640E9003E68069003CA8F
-:10B0B00000200000000000002810A000D8053E007D
-:10B0C00007800B2000E8403E100D82036000C8009E
-:10B0D000B2008D8303E000D8503A001E8003E124C3
-:10B0E000F800B2000F8003020420000000000000FE
-:10B0F000280538008A042F846AA00BE8088E003DDA
-:10B100008088EC036810A601368008A800C8108E5D
-:10B1100010228008A002FB20BE512A800BA00282D0
-:10B1200000000000000000002805412193002CF0E1
-:10B130003930060C00A300280828BC022C008380AC
-:10B140002AC0083000CC009A8028C00A3002CD0006
-:10B15000B30462C10B30020A00500000000000007E
-:10B16000A0011E0407112CD00A3222DCC187006D19
-:10B17000D00834027C00A70824C8087002DC800FC5
-:10B180000021C4087306DC00B20061C80B3A0288D3
-:10B190000440000000000000A8080A0057812DA00C
-:10B1A0002D7C023E82E3E03BE00C78031E20C7804A
-:10B1B000B9E82C7803FF80D6803BEC027A03DE00EE
-:10B1C000F78131EC8F7C030A0200000000000000D0
-:10B1D000081DAC00FB001E8023B683EDA0DB643E9F
-:10B1E000C00EB003EDC0F2003ED40AB003EC30EE66
-:10B1F000643EC007B0C3E800FB013EC80FB803C2FD
-:10B2000004600000000000000005F600EF803BE055
-:10B210000FF8637E04CFC0B7200EF803FC00C78090
-:10B2200033F00CCC03FE08F7C133E04FF803B24013
-:10B23000FFA031E60CF803100470000000000000CD
-:10B24000A8119C00EF0221402D70021C00F710296C
-:10B2500040087022FCC0A7003DC0084002DC00B7D7
-:10B260004021C00B7002DA80B72429C648F0022AB8
-:10B27000066000000000000000009C00A700288479
-:10B280000B30020C00930025800A6102DC01A7103C
-:10B2900024C0084082DC009F0025C40B7002942566
-:10B2A000B73223C41B700200002000000000000021
-:10B2B0002014CC0CA300200029300A0C00A3006C41
-:10B2C00000081042CD10AA00ACC0000402CD00BBA3
-:10B2D0001024C0033042C309B3002CD00A30021836
-:10B2E0000030000000000000A8158000EF003A4088
-:10B2F00007F0433C009FC0B6140E8006FC01CB0152
-:10B3000037C0ACB402FC00D90137C04BF013AE0813
-:10B31000FB0033D02EF00B2A00600000000000007C
-:10B320008000EC00FB053E400F3003AC14FBA03A5C
-:10B33000C00F8443EC01F9403EC00FA203EC21F999
-:10B34000003AC00FB003E420F000BAC00DB003E033
-:10B3500000300000000000000110F800D70135683F
-:10B360006DF0033C01E70033C00DC003FC24CF02A5
-:10B3700037C00DD202FC00DF0133C05E70331C18F1
-:10B38000CF4131C20CF0034040300000000000000B
-:10B3900081006C008B0022522AB0036C00AB0028A5
-:10B3A000C00A8C02EC108BE022C00F8002CC008B14
-:10B3B0008022C008B0022A10D98022C0C8B002E0A2
-:10B3C0004010000000000000800524019B00268042
-:10B3D00029B0620C00AB016A00089802CC009B8384
-:10B3E0002EC0CBB412EC038B8028C00AB006A2009A
-:10B3F0008B0262C008B002E00050000000000000B4
-:10B4000008040C01831420000A30024C0083002A37
-:10B41000400A1000CC02930028C00A2002EC00036E
-:10B420000020C00830160080910060C0083002C2C1
-:10B430000100000000000000000D6C00DB00368001
-:10B440002DF0033C00AF003A800D8003FC005B0050
-:10B4500037C0099003FC00DF0033C00AF003A420CA
-:10B46000CB00B3C08CB0034002100000000000000D
-:10B47000A01DFC04FF200F0027F003FC00FF002D9F
-:10B48000000BD027FC00EF0037C00FC043FC00FFCB
-:10B49000003FC00DF00BE000F5003FC01FF003E8D7
-:10B4A0000730000000000000C001F4C0FC227FC093
-:10B4B0000CD0433600C48134C01C8907F280CF8091
-:10B4C00033600F79033CE0CF0833480DC403F050DC
-:10B4D000DC9037CC0FF803F0007000000000000093
-:10B4E0008010E990B8807EE488990A2608A9802215
-:10B4F000F42C9903A702898022340B9A037D00DF84
-:10B50000482B60080502E500822022C48BB002E0CF
-:10B5100006300000000000008805C500B0102CC0F7
-:10B520002A0002A408A804E0800B0002C441B2046F
-:10B53000A40A0BB0028C81832060509812128B8079
-:10B5400089002CC80B3002E20170000000000000EE
-:10B55000C011AC20BB022AC00A8802A408A980A29C
-:10B56000E11B9C22E600B84026300B9002CC0193F0
-:10B57000042A40399882EC148B652AC00BB202F879
-:10B5800000600000000000004015E700B8482E00F1
-:10B590000E88438400E3C136E80F9C12E280F3C0BA
-:10B5A00036705FA823AC01CB0422404D8403E20037
-:10B5B000D8003EC00F9003D00470000000000000CF
-:10B5C000E001B309FE103E810DC003740CFF003D85
-:10B5D000C18CD0831400CD203A400DCA017C00FFFD
-:10B5E000001F400EC023F246FE8437C00FD803F878
-:10B5F00000600000000000004010AC00DD023D4093
-:10B600000E9003AC00EB483ED00C8063A208CA0049
-:10B6100032080CB003AC08EB003E400CD483582039
-:10B62000F94232C00CB003D004200000000000003A
-:10B63000C8052802DB002EE0283A022E00DB6076E7
-:10B64000E00D8C02E000880236586815837C08BF44
-:10B65000002D60089002A900B30523C008B002F2D3
-:10B660000040000000000000E0054C1080000CC10C
-:10B67000081C82060093C020F60A200208009300EE
-:10B680002460093C020C0083002C60090112004078
-:10B69000B000E0C0083002700010000000000000A0
-:10B6A00020410A4086812DE058180A16A09780256F
-:10B6B000E9197882D600978025A019F8025E00B7B4
-:10B6C000802D602848129600B48021E0287802C8B6
-:10B6D000041000000000000048080C0081303CC24B
-:10B6E0000E00028400E34028E84C29030C00D3003C
-:10B6F00034C40D31038C08E3003C460C2003008069
-:10B70000F20032C00C3003D2021000000000000032
-:10B710004019B800FF102FC00FC023C4807F103E17
-:10B72000C00FB103DC00E7003F8006F143FC00FFDF
-:10B73000087D500EE123B408FE103FC40FF003D083
-:10B740000460000000000000A805E402CC003E00F8
-:10B750002CC0030401CB0033602C9013E80073006D
-:10B76000B2C10FA003EC80FB283E541FD003FE02A1
-:10B77000C98032C00FB003CA007000000000000092
-:10B780004811800086002D800820021408870029B7
-:10B7900040087002DC00B70021C00B60025CA0977B
-:10B7A000202D480B5002DC108D0021C80B7002D2F6
-:10B7B0000660000000000000C0009F0085812C6032
-:10B7C000185802DE20B78228605A7852DE10BF80F7
-:10B7D00021E04B7806DE40B7A02D699B7812CE00A1
-:10B7E0008780E1E40B7802C0002000000000000028
-:10B7F0004814EE0083002CC20836028C0883F068DF
-:10B80000400A3E02CD40B30020E00B32064C009BC4
-:10B81000000C400B3002CD80830820C00BB102DA4F
-:10B820000030000000000000E815B800CE083FB06E
-:10B830000CE423DA02DE40BBB20EE243FA00FE0063
-:10B8400033900BE003E800FA003E810BE013F908A7
-:10B85000CE4032800FA803FA047000000000000000
-:10B860004800E02498083C040F000B6000F8402ECC
-:10B87000030D8003E000F8003E060B8003E000D8D3
-:10B88000003C00038C23E100F8007E000F8003D20F
-:10B8900000600000000000000810E402C9003E4003
-:10B8A0008C90032500E98032440F9402E420F900D3
-:10B8B00032700F9A43E400F90032400C1033241028
-:10B8C000F9013E400F900302042000000000000038
-:10B8D0008004640089822E40289002248281C0A2C4
-:10B8E000700B9C02E4003142A2600B9482E400B928
-:10B8F000002A400894A22500B9002E400B900A208F
-:10B9000000100000000000001805240089642E408B
-:10B91000089042A400896022420B9002E600B980A0
-:10B9200022400B9002A404B9002240289002240473
-:10B93000B9002E400B90020E0040000000000000F5
-:10B940000804058081002CC1481002A40281002057
-:10B9500040833402C400BB0020D00B1402C480B169
-:10B9600020A06818141A0D00B1402C500B10020AC8
-:10B970000500000000000000B80D6000C8003E0097
-:10B980008C800BA004E8003200078003E000F80080
-:10B9900032001F8003A140F85032000C80032000C9
-:10B9A000F8003E000F80032E03500000000000004E
-:10B9B000981DF446FD403F5023D4137404F5023F14
-:10B9C000500FD403FD00BD002F500FD003E440F909
-:10B9D000103F440FD403F508FD063E500FD283E616
-:10B9E00004700000000000001805E640ED043E4829
-:10B9F0000CB283F400C10032408CD0033400FD004F
-:10BA000037400FD003E620F9883D620CD803FE24AE
-:10BA1000C1003E780FD00306007000000000000057
-:10BA20003810E10088402E1008C423A00888062A98
-:10BA3000140880036004B80022000B8002E200B802
-:10BA4000802E00088C02E38088022E380B88020EBC
-:10BA500006300000000000000805C580A1C02D7060
-:10BA6000085042C400A90020E02A100A0410B100C6
-:10BA700024404B1006C420B1086E400B1682C4202F
-:10BA800081002C500B928252002000000000000028
-:10BA90001811A400A9012E4028D020A404A9002A2E
-:10BAA000401AB0122400B90C22420B9402E400B9EF
-:10BAB000006E400B9602E41189206E400B90024606
-:10BAC0000020000000000000A015E4C0A9C03E5006
-:10BAD000089C83E402E900B2402A92122640F94011
-:10BAE00036700F9403E404F9013C400F9803E6021A
-:10BAF000C9223E400F1002680470000000000000E0
-:10BB000028018604D9401C400F9223A4B0DB043CDA
-:10BB1000C00D9A03E400F9003E440F9003E400F9DD
-:10BB2000003E422C9023E480F9003E408F92039225
-:10BB300000600000000000002810A100C8203200B2
-:10BB40004CC08B2002C83132202D8403E104F84818
-:10BB5000BA000F8903E000C80032000D81132010E5
-:10BB6000F8003A000F8123020420000000000000CA
-:10BB7000280528000E40228028A40219005280A225
-:10BB8000804DED82E800B64223BD0BE802E804DAFE
-:10BB900000378008E0023A20BA0022800BA80A0A87
-:10BBA000004000000000000028054C00838060C0B9
-:10BBB0000829020D00924024C008B402CC00B30052
-:10BBC00068E01B3002CC00930124C06938026C008D
-:10BBD000B3002CC00B30020A00500000000000002F
-:10BBE000A0011C4083C020400828069C189C022409
-:10BBF000C0097002D400B70021C00B7002CE40977C
-:10BC0000B0254008781A5800BFA265C80B780220FA
-:10BC10000440000000000000A8080E028780B1A0C8
-:10BC20000C68031A08D69235E4287842D610F580BD
-:10BC300039A00F7823DE30D3A235A04DE8035E0093
-:10BC4000F7D03DF80FF003220200000000000000D2
-:10BC5000081DAC00FB043E000BA0034804FA413A67
-:10BC6000500FB003E400F1003EC00FB003ED88FBBD
-:10BC70004D3E000FF003BC08FB203AC00FB003C2DA
-:10BC800004600000000000000005FE00DC80B3E05E
-:10BC90000CD803CE00C8A031A08DE903BE00B2804D
-:10BCA00033E00CE8437E040F8131E40CD803F60046
-:10BCB000FF803FE00FF803000420000000000000B8
-:10BCC000A8119C00B4403540085082DE80D49021F9
-:10BCD000E00D5102D440B6B02B900EE5029C40D747
-:10BCE00022195C0D7002D800B7202DC00BF0036A3A
-:10BCF000042000000000000000009C009310218040
-:10BD0000085802DCC0940023D00870A0D420B502EB
-:10BD100029800960820C00870225C0194002D400E6
-:10BD2000B7006DC00B700200002000000000000092
-:10BD30002014EC00B3C02001481802CC028144A0BA
-:10BD4000C0893802C780B1002C094A0062AC09934F
-:10BD5000012840193002CD10B3902CC00B3002C81E
-:10BD60000420000000000000A815BC20DB6222E0D7
-:10BD70006CA003E400980032C0EC9823AE08FB08E6
-:10BD80003A780990037C10CF0026400CB003EC00F9
-:10BD9000FF803FC00F90032A0460000000000000F5
-:10BDA0008000EC20FB483C610FA043ED00F8243EEE
-:10BDB000500F9083E400FB003A500F8043EC08FBE7
-:10BDC000003E400F4003F000FB003EC10F900360B7
-:10BDD00000300000000000000110FC00DDA03280F7
-:10BDE0000CE001FC00DC9139C03C40033400FF80D2
-:10BDF0003F000FD007FC00CB003D400CE003382093
-:10BE0000CF023DC00CD00308443000000000000009
-:10BE100081046C000140220028A002CE86836422A7
-:10BE2000F4088C0F6400BB102E600B9C03AC01DB8C
-:10BE3000003E60088F0223408B003AC00D1043681B
-:10BE4000401000000000000080052C009900A2C0F6
-:10BE5000089002A607980002C24888022C00BA0285
-:10BE60006E600A9802EC008B012E600890020500BB
-:10BE70008B002EC008B1022000400000000000002E
-:10BE800008040C1081002040281026CC808020A0BF
-:10BE9000CC1814420400B2206C400B00028C0083CA
-:10BEA0000028402800020000830028C009B0024298
-:10BEB0000500000000000000000D6C00D900228089
-:10BEC0000C9003AC80DA292AD22880022400FB20BF
-:10BED0003E000F9002FC008F002E400C800B2002D1
-:10BEE000CF003EC00CB00300035000000000000073
-:10BEF000A01DFC00FD003F000FD063FC49F5003E93
-:10BF0000C00BC001F4007F403F401FD003BC00FFC6
-:10BF1000003F400FC003F000FF003BC00FF003E8FC
-:10BF20000470000000000000C001F240ECA03FE0FF
-:10BF30000D48037D80F480336C0EC8033200DD9021
-:10BF40003BA02DF003FCC0FF003BE08EF0033C045F
-:10BF5000EC6031000CF003B0007000000000000045
-:10BF60008010EC00D9C12EE10D88023C80F88036AB
-:10BF70007D18A00228B0EA202220087702FD50BBDD
-:10BF80008022400BF4423D808831221208F602E004
-:10BF900004300000000000008805CC0080112EC194
-:10BFA0000800024D80B80020000A0282000099209B
-:10BFB00022C0093082CC00B30028CA0B34820D2085
-:10BFC0008000A08C083482A20170000000000000F4
-:10BFD000C015AC4099802EC20994022C00A980267D
-:10BFE000600838422220BA4162463BB002EC01BBF5
-:10BFF0008022400BB0460C1888C0222208B006F000
-:10C0000004600000000000004015CC00C9813CC164
-:10C010000CA9236C00B28032780A8A0B26009901A1
-:10C0200030E00DB003EC00B9003AC01EB0032C00A4
-:10C03000CB8032610CB0139004700000000000004F
-:10C04000E001BC10DD003FC20FE803AC00FE003D84
-:10C05000400FC043F810EF14B7E00CF003FC00F5FC
-:10C06000023F444FB04BFC02D4043D402FF003F894
-:10C0700000600000000000004010AC00F9083E60C5
-:10C080000DA003AC00E85032000C8403A500E900C9
-:10C090003AD80FB0032C00F9003AC00F30032C003F
-:10C0A000CB443ED40EB003D00420000000000000BA
-:10C0B000C8052C08B9802EC00A30423C008904769D
-:10C0C000600890622000820422D008F0437C00BB0C
-:10C0D0008222400BF0423C008AC02EC108F002F2DE
-:10C0E0000040000000000000E0054C10B2D02CC061
-:10C0F0002918028C04A100249C0810028000A101D0
-:10C100000CC12B30528C04B30128404B30024C0040
-:10C1100090202C200A3002F800500000000000009F
-:10C1200020411E00B7A225E88A68021E00858025EE
-:10C130008088E8023E0085802FE4287802DE00B780
-:10C140008061E00378025E82B7822DE0087802C841
-:10C15000004000000000000048080D00F0103C8086
-:10C160000D10838C00E25026040C11038840EB0074
-:10C170003CC40F30038C00F30838400730036E4096
-:10C18000D0083C880E3043D20200000000000000BE
-:10C19000401DBC00FB343CC94EB023ED20FB043FE6
-:10C1A000C88F70534C00EB1031C50EF4036D00F3D3
-:10C1B000003FC00FF40BBC00CD003FC00FF483D094
-:10C1C0000660000000000000A805CE04C904B0C14C
-:10C1D0000F98136C90CB023EC04FB063E400F18027
-:10C1E00012C00CB503ECC0CF8332400FB3232DA493
-:10C1F000FB003E000FB4032A0070000000000000A6
-:10C2000048119C00870021C02D60021C00D7003916
-:10C21000C00B6002DC00B50021C02A7012CC808700
-:10C220000035C00B72521C00B7002D410B320212B8
-:10C230000460000000000000C000BE0081C0232098
-:10C240000BD8025E0006C02DA00B7C12DE08BF805A
-:10C25000A1E22A7A02DE00938025600B781E5E50F0
-:10C26000B7802DA00B7802300020000000000000F5
-:10C270004814CE00836020C00931022C00930028AE
-:10C28000C01BB006CC80B34820F00A3002EC00930B
-:10C290008024C00BB0024C10B3C82CD28B300212D9
-:10C2A0000430000000000000E815BB00C6C4318166
-:10C2B0000FE0036800CE803FA20BE803F900FE40C8
-:10C2C00031806EA007E800DA0026810FA002680125
-:10C2D000F6E03D920FA0033A046000000000000069
-:10C2E0004800E0C2F8043E140F8013E010F8013E4D
-:10C2F000100F8043E000B8003E00478003E002E8F2
-:10C30000103E000F8007A000F8002E000F800BD217
-:10C3100000300000000000000810E400F901324085
-:10C320008C9003E400C90036420F9003A400C900BA
-:10C330003E420D90036400D9003E400F900B640014
-:10C34000F99032410C90030204300000000000001C
-:10C3500080046400B9C8A2600A9202E40089402EF9
-:10C36000580B90020400D9002E42089002E4048980
-:10C37000002E400B90062404B9082A404890122051
-:10C38000001000000000000018052400B91022442D
-:10C39000089002E400890022458B9002A4008900E5
-:10C3A0002A40099002E40099802E400B9026240038
-:10C3B000B9012270091002060040000000000000D0
-:10C3C00008040408B12020400A1002C48083002C15
-:10C3D000504B1002240091002E40081202C48181AB
-:10C3E000A26C400B12020480B9202A4829120202D2
-:10C3F0000100000000000000B80D6140F80032802C
-:10C40000088003E142C80032001F8503A140C850E4
-:10C410003A008D85036140D8003E000F050321409E
-:10C42000F85032140D850B2E035000000000000060
-:10C43000981DF404FD103F400F5003C440FD003F21
-:10C44000510FD003F400FF013D400F9103E440FD84
-:10C45000103F4A0F9103E440FD103F440E9103E664
-:10C4600002700000000000001805C500CD0031403A
-:10C470000DD043E400CD0033404F1102E404C1006D
-:10C480003D400C9003E400EDA432500F9003E40013
-:10C49000FD003F400F9003C6007000000000000048
-:10C4A0003810E208D8003201008012C0004800367F
-:10C4B000800B8A02E000A8002E000F8002E00088B6
-:10C4C0005034280B8002E000B8002E000B8002CE12
-:10C4D00004300000000000000805C48081002640F0
-:10C4E000091802C408210028408B1002C400B101C1
-:10C4F0002E40181002C400A10120481B1002C400E5
-:10C50000B1006C400B1012C201700000000000006E
-:10C510001811A4009980A242489002E400A92A269A
-:10C52000440B9082C481B9002E400B9042C4008914
-:10C530000026400B9002E400B9012E410B9002C688
-:10C540000460000000000000A015C520C984307000
-:10C550000D9013E402E90032700F9403E400F940F7
-:10C560003C480C9003E400E10032400F9001E400ED
-:10C57000F9903E600F9026E8047000000000000073
-:10C580002801A500F1043A448F9003E410C9043E49
-:10C59000600F9003E400E9203E400F9003E410F99F
-:10C5A000903E400F9003E400F9803E640F9007CA6C
-:10C5B00000600000000000002810A100C8043A003C
-:10C5C0001E80038003C8402A041F800320008800C7
-:10C5D00032300C80032000F8003E000C8003E000A5
-:10C5E000C8803E200F8003CA042000000000000025
-:10C5F00028053800AED0378008EC463800D6042332
-:10C60000A00BA0417804FA0037800DA002A810EE1C
-:10C61000212E8008A002E8088E802FA08BA002CADD
-:10C62000004000000000000028014C0283C0A8E880
-:10C630004A36028C0013A028C20B30060C00B3004F
-:10C6400024840930020C00B32028C0093002CC0039
-:10C6500083802CC00B3002CA0100000000000000E3
-:10C66000A0013C44AF4025C248F8821CC89F082165
-:10C67000C08BF8025C00BFB02780093A029C00A57D
-:10C68000022DE8097002CE8085082DC20B7302E8E6
-:10C690000040000000000000A8081E00C782A9E0BA
-:10C6A0000A78029E40978439A00B7A833F80D79105
-:10C6B00035A00D7A091E44F7803DE82D7A03DE820D
-:10C6C000C6803D204B7B23EA0200000000000000F2
-:10C6D000081DAC00D3003EC10F3003ED80E3003EE7
-:10C6E000800FB621EC08DB213E800FB5036C40F9CA
-:10C6F000003EDC0EB203ED40F9023E800FB003C2F3
-:10C7000006600000000000000005FE00CF803DE054
-:10C710000FC843FE00FE843FE00DF8C3FF10AF904A
-:10C7200035A00CFC033E14EC843FF00EFCC3FF0864
-:10C730004F8033E40CF8030000700000000000009C
-:10C74000A8119C00D7A22DC40C41C2DC00740025A6
-:10C75000800F7242DC90D7382D980A70021C048634
-:10C76000003FC00D7002CC00860837C62870022A30
-:10C77000006000000000000000009C0087602DC2E7
-:10C780000A5002DC00B61025C2097086DC30970022
-:10C7900025800830025C0087082DC0087002CC405C
-:10C7A0008600210009700A0004200000000000003B
-:10C7B0002014ED8093000CE1281802CC08A000247E
-:10C7C000121A3402CF0493402C800AB0224C02810A
-:10C7D0008028E0283002CC008882242008B002089B
-:10C7E0000430000000000000A815BF20C9E02CF1B3
-:10C7F0000EBD03FC00B940364009F502FD40FF8044
-:10C8000036A208F00B7C00EB802FE00AF043FC021C
-:10C810008BD032F00DF0032A04600000000000000D
-:10C820008000EC10FB003EC80F9413EC00F940367A
-:10C83000401FB003EC10FB013ED00FB003AC00F979
-:10C84000003EC40FB001EC00F9043E480FB003E015
-:10C8500000300000000000000110FC00DF003FC0BD
-:10C860000CE007FC00FC0A27004FF003FC00FF0867
-:10C8700033800CF0002C005F0033C00CF001FC0092
-:10C88000FE0023400FB00300443000000000000011
-:10C8900081046C008B862EE0488F02EC08B8A0362D
-:10C8A000304BB003AC0C9B023CA00CB0436C00B10D
-:10C8B0000028C00DB012EC10B980A2610BB00220AC
-:10C8C000401000000000000080052C009B882EE036
-:10C8D00008A002EC01BB8026620BB002EC00B301A1
-:10C8E0002A2108B0122C00B80022C008B012EC14A3
-:10C8F000B98422A20BB002A000400000000000009A
-:10C9000008040C0493002CE0080002CC09910020DC
-:10C91000400B30064C0413002600083002CC04B251
-:10C92000002AC0013000CD00B00020800B300A0288
-:10C930000100000000000000000D6C00DB246EC050
-:10C940002CA002FC00BA0426404FF057FC003F0127
-:10C950003A002CF0013C00DB0033C084F003FD08FA
-:10C96000FA0032000FF00300015000000000000048
-:10C97000A019DC00EA403F0007C003FC04FC003FB4
-:10C98000400FF0039C00FF003F000EF0037C00FD11
-:10C99000003FC10FF003FC84F4003F000FF003E8F8
-:10C9A0000470000000000000C001F080FF0003C21E
-:10C9B0000FC2033E00DFC03EC04DDB02B0C0DC3022
-:10C9C0003FE00FDB23F620FF2633E00F52035E002B
-:10C9D000FF8033C04C4903300070000000000000AD
-:10C9E0008010E1E0B70823F00BAD0A2E009A042E68
-:10C9F000B0098F03A040B9302EA00B9F03A700BB46
-:10CA00008026E00BDD022E00BB8022F40A9202A0F9
-:10CA100004300000000000008805C880B31024C066
-:10CA20000B8002AC00A3242CD0081006C080B201F9
-:10CA30002CEA4B0012C204B31008C00A90020C008A
-:10CA4000930424C0098202A20170000000000000CB
-:10CA5000C015A500BB0022C00B8002AC08BB182E7D
-:10CA6000E0188802EC01BA002E800B9886E200BB29
-:10CA70000022C40B90026C00BB00A6C00B9000B05B
-:10CA800004600000000000004011E700FB00B2C09D
-:10CA90000FA803AC02EB003E600D9E03EC00D840F3
-:10CAA0003E400F8843E200FB2032C00F100B6F9016
-:10CAB0005B8236C02D080190047000000000000069
-:10CAC000E001B708F7003FC00FF9037C08CF823CB4
-:10CAD00000AFD021BC08FD103F808FC003A400F739
-:10CAE00001BFC007D003BD30FFA438C00EDA03F881
-:10CAF00000600000000000004010A800FB00B2C170
-:10CB00000E8103EC40FB443AC10E9503E000CB419B
-:10CB1000324D0F8103E020C90072E84491036D009B
-:10CB2000CB023EC00C8003900420000000000000F7
-:10CB3000C8052400BF0033C4081D038C00BB983611
-:10CB4000484D9822ED40DB0036B00B9802E300DB45
-:10CB50000032E088D8022C02C3802FC008900372F4
-:10CB60000040000000000000E0014400B30020F09D
-:10CB70001808024F84B1C024C0890602C400910085
-:10CB800020F01B1882C60093002CD1081E020E4410
-:10CB900093942CC0082002B8005000000000000050
-:10CBA00020011E04B78020E20868069E80BF84250D
-:10CBB000A8096802C60093A065E40B7812DE009312
-:10CBC00000A1E008D8021ED0A7802DE008F8024896
-:10CBD000104000000000000048080800B32030C0EA
-:10CBE0000A2202CE40F3A03CE80B3002C100D0C1C3
-:10CBF00030C00B2113CC21D3002CC02C100B0C8087
-:10CC0000D3613CC82C200392020000000000000009
-:10CC1000401DBC00FF403BC00FE003FC00F7507F0D
-:10CC2000C42EF003FC40FE003FC00FF047FC00FFA5
-:10CC3000007DC20FD001BC805F003FC00FF003D069
-:10CC40000260000000000000A805E400FBC032C83C
-:10CC50000EE003ACA0EB2032408CA0132C00D900D6
-:10CC60003E600CB003E800FA8030C03C9203EF60F5
-:10CC7000C32031C40CA0032A007000000000000093
-:10CC800048119C00332021DA0B70439C01B5002130
-:10CC9000000AE0021C00B7002FC00D70039C00B614
-:10CCA0000031C8085702DC00875021C00A70429248
-:10CCB0000460000000000000C0009A11B79021E05D
-:10CCC0000B6882DE08A78024600870121208958025
-:10CCD0002D60096C02DE00B18023E00A5862FE007C
-:10CCE00097A021E809E802301020000000000000B1
-:10CCF0004814CD00B30020C08B3C028C00BB002444
-:10CD0000C41A3D022F88B3482CE0893E028D8093DF
-:10CD1000D9A440881002CC0493C820C00B300292E2
-:10CD20000430000000000000E815B940FA00B280AD
-:10CD30000FE003E800EA8037A00CE8133B08DE01AF
-:10CD40003F820CE043FA80FE8031280CA003F00201
-:10CD5000C4C0B2800DE0033A04600000000000008F
-:10CD60004800E000F8003E100B8083E000F8303A05
-:10CD7000006D8083E144B8043E100F8013E000F89A
-:10CD8000003A104F0403E300E8103E000E8003D287
-:10CD900000300000000000000810E400C900384026
-:10CDA0000F1A032E00FBA036600C9803E604D10096
-:10CDB00036480E9102E600F9003E000C99036240ED
-:10CDC000F800A0680C90030204300000000000008E
-:10CDD0008004640289042E64889402A500B980202E
-:10CDE000640D9C02E642890022600B9C02E410B9AB
-:10CDF000403A50089C022720B900224008100360E6
-:10CE00000010000000000000180504008900224006
-:10CE10000A9082254CB9000240089602E41089006D
-:10CE20002650139402E440B9082E4008908A24004A
-:10CE3000B9012A40089002060040000000000000EE
-:10CE40000804058081402CC80810068400B1042025
-:10CE500049091442CC89812020500B1446C400B1EA
-:10CE6000002AC02814020101B0042840389402426C
-:10CE70001100000000000000B80D600088003A00BA
-:10CE80000E80232000F850B2000C8012E140D850F0
-:10CE900036000E8003E000F8002E000C8053600482
-:10CEA000F8003A000C80032E035000000000000040
-:10CEB000981DF440F9443E440FD403E400F1003FD0
-:10CEC000440FD453F444FD102F400FF403FD00FD34
-:10CED000403B100FD423D1047C4336500F5003E65F
-:10CEE00006700000000000001805A600F9102E6270
-:10CEF0000FD283E400BD423E610FD003F6C0C9A249
-:10CF00002B400CD0033400F9813E6808C143FA007D
-:10CF1000F5803F620C140306007000000000000062
-:10CF20003810E12088112E100B8002E000B8822E0C
-:10CF3000100B8000E3C488F022000B800A2000E878
-:10CF4000402F14088802E200B8002E000888028EE4
-:10CF500004300000000000000804C500A1002C40BF
-:10CF60000B1002C418B1226CD10B1026C40081082A
-:10CF70002A408810020404B5C00F400B020241A0F1
-:10CF8000B1402C40081202021170000000000000A5
-:10CF90001815A40089062E400B9012E400B9402E0B
-:10CFA000400BB082C402894422400A90022400A9A6
-:10CFB00000274809B012EC18B9012E4040900286B3
-:10CFC0000460000000000000A015E784E9013E4075
-:10CFD0000F9003E400F9003E720F9003E7608910A0
-:10CFE0003A400C90032400F9443C402D9003E76044
-:10CFF000F9713E40289003280470000000000000F2
-:10D000002801A448A9003EC00F9A43EC00F9207EF5
-:10D01000C80F9A07660079807E400F1C03E700E97D
-:10D02000A03E40468003E020F9003C400F9003CA38
-:10D03000006000000000000028108000F8003A00A6
-:10D040000F8003A008E8403A100C8303A1C0F04011
-:10D050003E060F8403E100F8003B000F810320002F
-:10D06000F810B2004C800B0A042000000000000001
-:10D0700028052800BA002EB00BE802E9003E900215
-:10D080008108E4127800BA002DB089E822F80CBAC1
-:10D09000006E8003C5033000BA0022A808A0228ACF
-:10D0A000004000000000000028054C00B30028E804
-:10D0B0001B31128CC4A3922C408834068E0093003E
-:10D0C0002CF01931A2CC04B30028800138024C00A6
-:10D0D000B38020E00AB012020050000000000000FF
-:10D0E000A0011C00B7142D420B6002DC00B78127A1
-:10D0F000E01860025818B7222D80097022DC00B7B2
-:10D10000002D800B3B021DD0BF8028C08AF202A0F8
-:10D110000040000000000000A8081F80F7A039E2CE
-:10D120000F68039E00ED843DE24478039E00F7B44F
-:10D130002DE00D6803D600F68039E00F79035E908C
-:10D14000F78131602E7C032A0200000000000000FD
-:10D15000081DAD00FB423EC80FA003EDA0BB003888
-:10D16000C80FB0036800FB113E4009B041EC00FA63
-:10D17000023EC00FB20BED803B0036400DB02342A3
-:10D1800006600000000000000005FF00CFD033E47F
-:10D190004FF903DE40DC8036E40CB913FE00CF907B
-:10D1A00037E50FF843FE00CF923FA40F78031F002E
-:10D1B000C58033600CF82000007000000000000003
-:10D1C000A811BC000F1021810B600384008B082183
-:10D1D000600A7B0398008B1029840E6422DC40D700
-:10D1E000022D840B70021C00851821400AF022AA2F
-:10D1F000046000000000000000009C00A71469C04B
-:10D200001A6012FC01A4102DC00A52024540870C7E
-:10D2100021801B6082D400860325E01B70025C40E5
-:10D220009D0029400870020000200000000000005E
-:10D230002014CD00A30028C01B20228C11A300685D
-:10D24000F60A3C068200838028840A8C82CC4492B1
-:10D25000002CC00B30024E00910028400A3002889A
-:10D260000430000000000000A815BE22EF04BAC080
-:10D270000F1493EC02F1C33EF00E90836600CFD200
-:10D2800032500F9C03CB00C9803E280FB0034F00E3
-:10D29000D1C0AAC00C71032A046000000000000085
-:10D2A0008000EC20DB0026800FA003EC081B00367A
-:10D2B000C00F8601E540FB023A480E9403EC80F172
-:10D2C000843E004FB003ADC0EB2036C00FB023E06A
-:10D2D00000300000000000000110DC00CF003F60C3
-:10D2E0000CE0833E80ED0833D08F50039E00DF00BA
-:10D2F00033400CC0033000CC1033680CF0033C8486
-:10D300008D9030400CF00308443000000000000015
-:10D3100081046C008B022CF408A8620C808B802A9C
-:10D32000600F9C022E008B0020600D98022C80D88C
-:10D330000014400834122E008B8232400DB003607E
-:10D34000401000000000000080052C008B002ED053
-:10D3500008B8022C008A8422C00B8802E4A0830053
-:10D3600022620A98022800890022000AB1062C00D5
-:10D37000AB00224008B00260004000000000000046
-:10D3800008040C02A3002CC10820020C028B002808
-:10D39000C20A00024410831022400B10060C0091B8
-:10D3A00004AA002830022C00A101204009B002424A
-:10D3B0001100000000000000000D7C008F003EC046
-:10D3C0002CA0032940A84032CC8B8002E000CF4043
-:10D3D00032000E800A2000880022400CB0032C048A
-:10D3E000EB00B2408CB0034003500000000000008E
-:10D3F000A01DFC00DF003F400FE003FC80FF283D44
-:10D40000C00BC103B014FF003F000DD003DC00FCD3
-:10D410000037400FF021FC001D007B408FF003E03F
-:10D420000670000000000000C005D200DF0031A03F
-:10D430004DF0433200CE141B680EDA23B2C02F0029
-:10D440003FC22CE8033C40FD083BC84CF0833CA0A5
-:10D45000CF0033C40CF307F00070000000000000A0
-:10D460008010E2008FC022A008FD422F008B7022A6
-:10D470001E48890227C08F5A2E50483002BDC0BDB9
-:10D480004023C548F4823D2C877022C008F103E098
-:10D4900004300000000000008805E00093102681A1
-:10D4A0004930028040832028400A10028000A324D3
-:10D4B0002CCA0832820C00912820CA1B32020C8828
-:10D4C000830920C8093202E2017000000000000058
-:10D4D000C015A3148B04268908B002AC228B882ABD
-:10D4E00020089882A610AB002ECA08B082AC00B902
-:10D4F0000022C029B00A2C018B0022C009B022F002
-:10D5000004600000000000004015E300DB0034E28E
-:10D510000DB003A300CA80BA700E8803A600EB000A
-:10D520003E900CB5032C00FB10BAC00EB0032C02C9
-:10D53000CB0232C009B002D004700000000000002D
-:10D54000E001B008FF00BBE00F70036500F4003598
-:10D55000400F40035400DF003E400FF803EC00F79B
-:10D56000013DC10E3003EC00FF003FC08EF003B858
-:10D5700000600000000000004010A040EB083E806A
-:10D580000DB003E000C8003A510F82036420DB00B5
-:10D590003D820CBC032C10DB0072C00DB1030C20CB
-:10D5A000D30032C00FB00B50042000000000000078
-:10D5B000C805010087C02EA808F112C540880022C6
-:10D5C000400B84022700AF002EC008BC123C008B29
-:10D5D0000123C028F54A3D28DF0033C04BF0033259
-:10D5E0000040000000000000E0054880A3902C00EF
-:10D5F000083002C100920428000B14124300B30447
-:10D600002C300AB00A8C00930060C0083C060E0162
-:10D61000B3002EC08B300638005000000000000020
-:10D620002001120087802D24087802D200958021E5
-:10D63000A00B68025A2087802D661A7C029E008704
-:10D640008021E11879029E40B780A1E00B78024862
-:10D65000004000000000000048080000E3A03C403B
-:10D660000C3003C422D90038D40F30836840F30053
-:10D670003C800A32028C00DB00A2C40C30030C0098
-:10D68000F3003CC00FB103120200000000000000D4
-:10D69000400DB000FF103F400EF003FC00ED003FD6
-:10D6A000C00F3013BC407F103FC12DF0037C00FB46
-:10D6B000403FC20EF4837C00DF003FC20FF00390B6
-:10D6C0000660000000000000A805EC00DBA032C0EE
-:10D6D0000DB703E000CA043E800FB8032C10FB0016
-:10D6E00033008DB0032C80E9403ED20FB4032D806F
-:10D6F000EB20B2C00FB203EA00700000000000008F
-:10D7000048119000B71011C0087082D80A87012D07
-:10D7100080897003D808B70A21402C70020DC0859B
-:10D720000179C80B32020D208F2821C00B7282D2E2
-:10D730000460000000000000C0409610979023E0B5
-:10D74000097A02D60097802DF00B78821E00B3B0C4
-:10D7500021A00878021E00A5802DE00B7A021E8011
-:10D76000A7B021E80B7902F00020000000000000C3
-:10D770004814C000B30020E2083002C64093702C69
-:10D78000C0093C028E00B30020D80818020C0081AA
-:10D79000902EC00B302A2C108300A0C00B3002D278
-:10D7A0000430000000000000E811B900DA0233B8CC
-:10D7B0000DA003F800DEC03FB04FEC063840FA0081
-:10D7C000B3900C6C0B2808EA017E800FA0032800A0
-:10D7D000EA0032800FA003FA04600000000000009D
-:10D7E0004800E000F8403A000F8403E100E8023E00
-:10D7F000000F8403E140F8003E000F8103E000F8D1
-:10D80000003A000F8003E000F8003E000F8003D2D2
-:10D8100000300000000000000810E420F9C03E7055
-:10D820000E9002E480C90032420C9883A484F9006F
-:10D83000B2600C90832400C9003E400C1A02240000
-:10D84000C100B2400F9001C204300000000000008F
-:10D8500080046500B9812C600D94C2C7088900223C
-:10D86000400895C7A400B9002870A8940A2400892C
-:10D87000042E4028902A2600890022400B9002E0C6
-:10D88000001000000000000018052400B9402E40E0
-:10D890000A9002E5008100A040099042EC00B1002E
-:10D8A00022580890A2040289002E40089002A4A0E9
-:10D8B000890022400B9002C60040000000000000DA
-:10D8C00008040400B1202EC0891202C480812020E7
-:10D8D00040611042C500B120284818904204808160
-:10D8E000282C4808128284A0812020480B1282C272
-:10D8F0000100000000000000B80D6800F8002E00D4
-:10D900000E8003E008C85032140D8017E804F85068
-:10D9100032144C050B2140C8203E000C8703A1C2E5
-:10D92000C80032148F8203EE035000000000000094
-:10D93000981DF400F1103D400F9102D442FD103FBC
-:10D94000510E5413B500F91035442FD003E450FDA7
-:10D95000283E4E0F90036400F9383E440F9283E650
-:10D9600006700000000000001815F400FD003D40A6
-:10D970002CD003B600F9823E400CD003F400F980AD
-:10D9800033700C50033400C9C03E400CDA031680DB
-:10D99000C9403E622C988306007000000000000021
-:10D9A0003810E000B8002E000880022800B8502689
-:10D9B0000008A002E800B8002A342AAA0A20008839
-:10D9C000C02E2A0880222100A8802E000880020E86
-:10D9D00004300000000000000805C400B1002E4023
-:10D9E0004810068D00B1002C40281002C400B14040
-:10D9F0002C48081082440081602C4028140A0440FE
-:10DA000081202C400810020201700000000000007C
-:10DA10001805A440B9002E4008B0022400B9282EF1
-:10DA200050089022E400B9002E600B124264008975
-:10DA3000002C400990022400A9002C400810024646
-:10DA40000460000000000000A005E600F9003C4270
-:10DA50000C9003A740F9403E700C9802E540F90095
-:10DA60003E400C98036406C9012E400C9003240428
-:10DA7000C9003E400C900B2804700000000000001C
-:10DA80002801A400F9003E400F9083E610F900360B
-:10DA9000680F9C03E600F9003A400E9893A400F941
-:10DAA000003E400E9083C400F9003E400F90038A70
-:10DAB00000600000000000002800A000F8003E0404
-:10DAC0000C80032102C84032000F8003E100F00007
-:10DAD0003E020C80032000F8003E000C00032000F2
-:10DAE000C80032000F80030A04200000000000007C
-:10DAF00028153A00BE022FB008681238008A042A9E
-:10DB0000800BE042FB20BA002F9108E0022800BA07
-:10DB100000268008EE0A38008A0022800BA0028AC4
-:10DB2000004000000000000028054200B3002CC2A5
-:10DB300028380A4800830422C00B1002CD80B300AD
-:10DB40002EC0081C022400B3002CC00834120E4062
-:10DB5000830020C00B30120A0050000000000000BB
-:10DB6000A0011100B7002FC00870A24E008FB02195
-:10DB7000CC0B6012DC10B7302DC008D0821480B7F7
-:10DB80001225C8286002140087B221CC0B3102A8EC
-:10DB90000040000000000000A8081200F7803DE0EF
-:10DBA0000C38035600C790B1E40F7803DE00F790FD
-:10DBB0001F602C480B16A0F7803CF40C38031E00A5
-:10DBC000CFA0B1E80F7B032A020000000000000094
-:10DBD000080DA000F8003EC00BB003AC00F3213EDE
-:10DBE000C807B002E400FB203F400F8003E480FB45
-:10DBF0000036D00FA003E008FB423ED80FB003C2AE
-:10DC000006600000000000000005F080CF8031E1D8
-:10DC10000CF803DA10EF803FE40FD803FE10FF8208
-:10DC20003FE04CD81B1620CF803FE04CD830EE4070
-:10DC3000FFC0B3F40FF803C0007000000000000044
-:10DC4000A8019820834021C0087102DC8487202D20
-:10DC5000C00B6002D960F7002DC008F08214048761
-:10DC6000002DC008F0031E00B72021C08B7002EA0F
-:10DC700004600000000000000000B0008700218068
-:10DC8000087002F50427002DC08B7002DC00B7007D
-:10DC90002C50084002140087002DC00850025C047C
-:10DCA000B700A1C08B7002C000200000000000007F
-:10DCB0002014C80080000080083002CE0083C02CF1
-:10DCC000D04B3002CE00AB022C4048BC0204008393
-:10DCD000002CC00810020008B30020C0093002C8A0
-:10DCE0000430000000000000A8158340C80030C0C8
-:10DCF0002CB003EC00EF883FE607B183E100BF00E2
-:10DD00003EE00CB8033400CF003FC02CB0036810D5
-:10DD1000FF0033C00FF003EA0460000000000000C1
-:10DD20008000E400F1403EC00FB403ED40FB083E2C
-:10DD3000C00FA003E520FB003EE00DB083E400F33C
-:10DD4000003EC00F8003C400FB003EC00F3003E064
-:10DD500000300000000000000110F000CA0033E0B5
-:10DD60004EF0033400FF003FC08FE803F000FF00D7
-:10DD7000B1400CE0033400EF00B3C00CF0033800F6
-:10DD8000CF003DC00AF00300443000000000000056
-:10DD900081046222889022E0083C022E08BB012EFA
-:10DDA000C00BA0026600BB0022A008A9022400BB91
-:10DDB0000022C0282C02A200DB002EC00AB002A064
-:10DDC000401000000000000080052200980022C8DA
-:10DDD0000A98022704BB002EC00BB102E200BB0070
-:10DDE00022E208B002A400AB0020C00A888223000F
-:10DDF0008B002EC008B002A0004000000000000010
-:10DE000008140400914022C00810020C00B3002C3A
-:10DE1000C04B28224004B30020C028300A0404B3B9
-:10DE20000060C0080002842093002CC00A300282E7
-:10DE3000010000000000000000056000DA40B28030
-:10DE40000E90032400FF003FC08FA003E009FF00F5
-:10DE5000324008A00B3400EB0031C00C8003288056
-:10DE6000C7003FC00CF0030003500000000000009A
-:10DE7000A015D000EC203F000FC00BFC10FF013FAD
-:10DE8000C00FE003F400FF003FC00FF003F400FFF9
-:10DE9000003FC04FC001F008FF003FC00FF003E893
-:10DEA0000670000000000000C005FC00CC90372088
-:10DEB0000EF013BD04D4C1332C4CD9233260FF20A3
-:10DEC0003DE04FC103B640CD0037E00CE28B10C0FF
-:10DED000CD0033C60FD803300070000000000000F2
-:10DEE0008010EE088A20220008B7022D008A00B6B2
-:10DEF0003C0899022784BF682E820B01022440D976
-:10DF00004220C08AAC022DC28248A2D00B820220DD
-:10DF100006300000000000008805CC008804268040
-:10DF20002A30C2A580A92128008A00020000A3107F
-:10DF30002CC80B0002C490834224C1080002408810
-:10DF4000A360A8C00B00C222017000000000000006
-:10DF5000C015AC068A0022E048B0022E02AB802E2B
-:10DF6000204A8C022620BB006E800B30C246049BE8
-:10DF70000AA2C00A80126C40A8002AC00B8C023092
-:10DF800000600000000000004015EC00C10936618F
-:10DF90000E3203AB20F8843A782E98032600EB006B
-:10DFA0003E404F9003E200C94036E00CB4036E00DF
-:10DFB000EB003AC00F88031004700000000000005E
-:10DFC000E001BC00FD003F400FFA13F810DC04270D
-:10DFD000400D5043F400FF003F400FD903B000F95B
-:10DFE000013FF00FF023B200D4A037C00FC00BF8F0
-:10DFF00000600000000000004010AC20EB10F200B8
-:10E000000EB4032180C9403A480F9013E120FB0071
-:10E010003EC00C84032400FB0136E00C740B9C0012
-:10E02000CF0032E00F8403D0042000000000000085
-:10E03000C8051E008B80204008B802838081A02282
-:10E04000780B9183E300BF000EC10AB4036404B9E6
-:10E050005032C00AB2022000880023D40B8802F29A
-:10E060000040000000000000E0054C42A0802000BD
-:10E070004800020D0680802AD0030002C800B300C9
-:10E080002CC00836024000B90222C28B26020C10B6
-:10E09000010224C04BA102F80010000000000000A3
-:10E0A00020011E088E8021210828C29E008E80211A
-:10E0B000600B78029E20B7822FA10A78025E00B51D
-:10E0C00091A1E00B290232448680A5E00B4C02C8E6
-:10E0D000001000000000000048080C00E100228051
-:10E0E0000E000B2400C04428AD0F2002C800F3002E
-:10E0F0001CC00C0103484CF20430C00F15038040D3
-:10E10000C10014C80F0003DA021000000000000074
-:10E11000401D9C40F7003FC08FC003E400FA013F60
-:10E12000C00FF023FC08FB003F800FF001FC10FF44
-:10E13000003FC00ED103FC42FE803BC00FC003D0A5
-:10E140000660000000000000A805EC40C8003EC0CA
-:10E150000F9003EE08CB0032C00FA023E603CB4C98
-:10E1600032400FB007E800F90016400CA00B6C001D
-:10E17000CF0232C50C8003020070000000000000D6
-:10E1800048119C8084042DC10B4040DC0087042191
-:10E19000C04B7012FC018F6029400B70139C00B5BE
-:10E1A00000A3400A60020000840021C0084002125F
-:10E1B0000660000000000000C0008E0087802DA2D5
-:10E1C0000B4C16D608978821A04B6802DE04A78066
-:10E1D00021E00B4802DA04B68225600AE8621E00DC
-:10E1E000878020E8084802080020000000000000A6
-:10E1F0004814CC008B806CF00B3C02CE469BC020B8
-:10E20000E40B3C02CC20A30028E00B30028D80B14F
-:10E210008022440A210A03828080A0C008060A12D4
-:10E220000030000000000000E815A802CE803FA0EA
-:10E230000FE003FA40DEC0B3900FEA13F908EA04D6
-:10E2400033828FE403FB08FEA036A00CAC0B6B827C
-:10E25000C6A032802CE4033A0470000000000000E5
-:10E260004800E000F8903E020F8083E100E8203E85
-:10E27000030F8203E140D8003E200F0093A040F836
-:10E28000003E108F080BF000FC003E000F8003D210
-:10E2900000600000000000000810E400E9003640C3
-:10E2A0000F9407E600F980B0400C9403E440F900B5
-:10E2B00032400F940BA40071C032402C94232402EE
-:10E2C000C90032400C90030204200000000000004E
-:10E2D00080044400890022400B9802E660B90022C5
-:10E2E000600A9C02E624B90436400B98002400B969
-:10E2F00080A25208900224008940224068940220A3
-:10E30000001000000000000018052400A9002640AD
-:10E31000039402E401B9102255089022E400B100F0
-:10E3200026400B90002C09B900226008900A1C04BA
-:10E330008D08A0400810820E004000000000000080
-:10E3400008040600810020500B1242C480B1042052
-:10E35000500A1402C500B12224400B12220401B15C
-:10E3600040205008100A15008540285008140A0A59
-:10E370000500000000000000B80D6000E850360005
-:10E380000F8502E140F85032000CA023E010F85055
-:10E39000B2140FA503A148FA00B2000C80032004B8
-:10E3A000C40232000C00032E0350000000000000E5
-:10E3B000981DE500FD003F400FD103D444F5003F18
-:10E3C000510FD403F500F9103B400FD100F510F5C3
-:10E3D000407F400F542BE500F94036500FD003E644
-:10E3E00004700000000000001805F610BD40334026
-:10E3F0000FDA033780CD003F400FD003F400E9A0CF
-:10E400003E400CDE17A408FDC033418DDA1326A070
-:10E41000F9A832780CB40B06007000000000000070
-:10E420003810E100B8A036200B8A82A2802AA82EDC
-:10E43000000B8012E004B8A12E284A8E022AA0BA4E
-:10E44000C022280885022108B8E8A23C08C8020EAC
-:10E4500006300000000000000805C500B900204A91
-:10E460000B1402058001002C410B1002C404A14AC8
-:10E470002E420814028410B160A04A091002440020
-:10E48000B501294018D2021200200000000000004F
-:10E490001815A400B92126400B9602A410A9002E3D
-:10E4A000400B9612E420B9002E410A90422400B994
-:10E4B0000022410898226400B9202B4128D402068A
-:10E4C0000020000000000000A011E400F9E0325834
-:10E4D0000F98032640C9403E580F9C03E400E90012
-:10E4E0006E400C9A02A600F94432400D9A0B6484E7
-:10E4F000F900BA400C180328047000000000000066
-:10E500002801A400F9003E500F9003E600F9043EF4
-:10E51000480F9003E440F9003E650F9981E450F9FB
-:10E52000203E408F9003A480F90034400F9203D224
-:10E5300000600000000000002810A000F8403E101D
-:10E540000E84036008C8003E080F8083E028E804BA
-:10E550003E000C8403211CF04832000B0003E00253
-:10E56000C00032000CC00B020420000000000000BC
-:10E5700028053800B2882E8008E0037A808E002FAC
-:10E58000A00BE802F910BA002C8028E4022800BE93
-:10E590004023B808E802E804CA20A28008E8020A7A
-:10E5A000004000000000000028054C01B3002C4092
-:10E5B00008B8426C0283002CE00B3800CF40B30057
-:10E5C0002CC008B40A0C00B340A2820A3902CC0065
-:10E5D0009380A0C02920020A005000000000000023
-:10E5E000A0011D00B7002D64287402400087052D8E
-:10E5F000900B7402DC10B7302DC80834061C80B7AD
-:10E6000000A1C00A7002DE80830001000960822040
-:10E610000440000000000000A8081A00F7803D60D8
-:10E620000ED80B5E00C7803DE00F6803DE10F7A92F
-:10E630007FE84878031F30FF9433A00E7803CF247F
-:10E64000D680B1E00DF84322020000000000000077
-:10E65000081DAC00BB000C400FB003EC08F9003EF5
-:10E66000000F9041EC00FB617ED00FB003EC80FB0B
-:10E67000403F9B0CB003ED90FA003C000EB003C28B
-:10E6800004600000000000000005DE00EF80336041
-:10E690000DD8033640EF903EE00FF903FE00FF80F7
-:10E6A00033FE0CFA03FE00CF80B3E00FF803FE0048
-:10E6B000CD8033E00FC843C0002000000000000000
-:10E6C000A8119C0085083540087003522087112C42
-:10E6D000EC0B7102D000E70035C4087402DC4087FF
-:10E6E0001021C00B7002FC80850821000B4182EADA
-:10E6F000062000000000000000009800AF0023503A
-:10E700000950021C80A70129C01B6006DC40B7101D
-:10E7100021C84A5202DC00830021C00B7002DC13C6
-:10E72000840025C00B5802C000200000000000003B
-:10E730002014CC0081802440083E026E0089002C09
-:10E74000C00BB402CA80A30024C00A0402EC4082B9
-:10E750000A20C00B3002CD1080C0A4000B1C02C8E0
-:10E760000020000000000000A8158400EB8033406A
-:10E770000D8C832600E9A03E788F9083E100FF0096
-:10E7800031D10E8423FC00CB8232C08FB002FD4019
-:10E79000CB80B6C00FA403EA0460000000000000B4
-:10E7A0008000EC00FB003E400FA003E000F9013EBA
-:10E7B000420F9003E554E3003EC8059303EC80FB51
-:10E7C000C13EC00F2003CC48F3083A000FA043E03D
-:10E7D00000300000000000000110F000CF003F40BA
-:10E7E0000F30012C0ACD1033000FD0831400CB0260
-:10E7F00033C00CE103EC10CD0033C00CF0333C000F
-:10E80000EA0033C00CF083C8443000000000000070
-:10E8100081046E008B002E400BBC022E000B0022E8
-:10E82000300B9C022780AB002AC008B802EC00899C
-:10E83000C020E008AE022C088A00220008B042E89E
-:10E84000401000000000000080052E008B042E40C8
-:10E850008B8C02AE10890022700B8C02A2008B01FF
-:10E8600022C0088002EC108288A27009B8022C082D
-:10E87000890020C0288022E0104000000000000035
-:10E8800008040C0481002C400B200280008104A0AD
-:10E89000504B000A8000A3012AC1201002CC14832F
-:10E8A0000022C00820020C008100E000080002C223
-:10E8B0000500000000000000000D6800CB003E4095
-:10E8C0000F900BAC80C90032100F8003A400CF0260
-:10E8D00031C00C8013FC02CD0033C02C90033C02ED
-:10E8E000E800B2C00C9003C003500000000000001C
-:10E8F000A01DFC02F5003D408FF0236D00FF003F9E
-:10E90000040FC003701CFF013FC04FC003FC00FD9B
-:10E91000003FC00FE00FFC18FC003F000FD003E8E1
-:10E920000470000000000000C005FE00D7020F3098
-:10E930000CF2017E0644303F200EF0027C84FD2064
-:10E9400027080CD0013600FF6033CC0BF1132CC428
-:10E95000FF300FCD0CF403F0007000000000000049
-:10E960008010EE008FC02E0008FC022E008A302896
-:10E970005208F6823C68BD903234489C122600CF83
-:10E980004023CC0BF6023D00BF102FCC88F602E0EE
-:10E9900004300000000000008805CC0093102C0813
-:10E9A0000931024C009B2064580331624C81A10064
-:10E9B00020004814024400933024C00B33028D849D
-:10E9C000B3206CC02A3602E2017000000000000093
-:10E9D000C015AC109B022E410BB002A4009A004A55
-:10E9E0006088B0526C01B9002600089122EC08BB87
-:10E9F0000026C00BB002AC00BB056EC10AB002F02D
-:10EA000004600000000000004015EC00DB013E3017
-:10EA10002D30034760D8A016388FB0036C00790200
-:10EA200031600CC80A6600BB00B6C00FB00BAC006A
-:10EA3000FB013EC10EB003D00470000000000000D6
-:10EA4000E001BC10EF083F240CF0037620EE903577
-:10EA5000400E7003AC00FD00BB640F88133480CB04
-:10EA6000003BC00FB0036C08FF003EC00DF003F880
-:10EA700000600000000000004010AC01FB8032107C
-:10EA80000EB003ED00CB503E408CB0432C10F9008B
-:10EA900032600C400B2600C30436C00C30032C003F
-:10EAA0009B00B0C00CB003D00420000000000000A8
-:10EAB000C8050E80BF042A4000F500E60082D2227D
-:10EAC000400DF0223C00950236400A80022E008F55
-:10EAD0000037C00AF0423C008F0023C028F002F249
-:10EAE0000040000000000000E0054E00B3002220BE
-:10EAF0004A3000CC0081C028000830020C10A10070
-:10EB000028801830220404830024C0083002CC0876
-:10EB1000930020C0083006F80050000000000000FC
-:10EB200020011E00B78029A0087802FE208D8029D0
-:10EB3000E55B38421E40A18125A80879023700878D
-:10EB40008025E00A780ADE81878025E5487802C8BA
-:10EB5000004000000000000048080C00B310301214
-:10EB60000E3012CCC0C30038800C31060C40F100CE
-:10EB700038800C30430442C30036C00C3203CEC090
-:10EB8000DB0030C00C3003D20200000000000000A7
-:10EB9000401DBC00FF103D844FF103D040FC1033FA
-:10EBA000805DB183FC50DD0A25890FB803D400FFD6
-:10EBB000103FC00FF4033C40FF003BC00FF003D0F8
-:10EBC0000660000000000000A805EC00FB203E00ED
-:10EBD0000FB5032920F90032A00CB083EC0049C81E
-:10EBE000B2C08CA0036400FB0812EA0CB00B2C80AE
-:10EBF000FB202ED26CB643EA047000000000000037
-:10EC000048119C00B7492D000B30821001B50283DA
-:10EC1000C01A7222DD41850061C01820201400BF97
-:10EC20004035D00D34021D20B72825C1087482D28A
-:10EC30000660000000000000C0009E0437A02D20E8
-:10EC40000B7A121601B38021E20878429E0085807B
-:10EC500020E11868025600B7A025E0087A021E00DD
-:10EC6000B7902CE5887A02F0002000000000000038
-:10EC70004814CC00B3006C241B30020000B000200C
-:10EC8000F80A3002CC00810020D81820020400B31A
-:10EC90000024C00930020C00B30026C0083002D2A4
-:10ECA0000030000000000000E815A800FA003D80D8
-:10ECB0000F200B2880FE0033A00CA003E802CA023C
-:10ECC00032902CE4037800FA0032800CA003280074
-:10ECD000FA003E800CA003FA006000000000000073
-:10ECE0004800E100F0003E004F8003E080F8003E65
-:10ECF000000F8023C000F8023C000FC0836000B802
-:10ED0000003E000F8023E018F80136000F8003D288
-:10ED100000300000000000000810E600F921326019
-:10ED20000C90032C44F900B2400F901B2400E90022
-:10ED30003E400C1003A400F90032400F10332410A1
-:10ED4000F10032400C90030200300000000000008F
-:10ED500080046400B940A2410890022480E90022A6
-:10ED6000400B9012240089006E411890422400B993
-:10ED7000042A410B90036400F9002A400A900A20FB
-:10ED8000001000000000000018012480B942624811
-:10ED900028900A2400B10022400B10022410B9026E
-:10EDA0002E4008D002A400B10022400B900224049F
-:10EDB000B9002240081002060040000000000000D8
-:10EDC00008040C00B12060400812020400A12020B9
-:10EDD000400B1202048091202D680852120400B1E9
-:10EDE00028284A09128244A0B12C284A0A12820219
-:10EDF0000100000000000000B80D6000F8003214AF
-:10EE00000C80032000F85032140F85030140F800F5
-:10EE10002E0028C003A000F82430080F8223208091
-:10EE2000F82032080C82032E03500000000000007E
-:10EE3000981DE408F9103F408F9113E400ED103F56
-:10EE4000500F9103E440A5103E440F9103F404F9E0
-:10EE5000283E4B0B92A3E4A0E9283E4A0F9283E69A
-:10EE600006700000000000001805F400CD003340DB
-:10EE700080D001F400A50026400F90032600F18801
-:10EE80003E680D98834400C9C03A400C980324089A
-:10EE9000F9A032780F9A030600700000000000000D
-:10EEA0003810E0028800A200088002E0000A002278
-:10EEB000000B80022000B8402E14088043300088E8
-:10EEC000A0222A0A8A42A005B84232380B80020EDC
-:10EED00004300000000000000805C4039100244035
-:10EEE0000B1002C411B10420411B10224500B500D3
-:10EEF0002540095002540181402C400914924400DD
-:10EF0000B140244C0B140A420170000000000000C4
-:10EF10001815A400990024420B9002E401992026C0
-:10EF200040CB90026400BB002F410AD0023400891C
-:10EF30000026400B1002E400310062400B900246B4
-:10EF40000460000000000000A015C400D901365084
-:10EF50002F9003E660F98036520B900A6400F900A6
-:10EF600036400D9003640209003E400D900364009A
-:10EF7000B900B6400F900368047000000000000064
-:10EF80002801A400E1003A410C9023E620E900BAF0
-:10EF9000700F9003A400F9003E400D1013A700F974
-:10EFA000003A400E9043A408F9003A400F90038ABB
-:10EFB00000600000000000002810A020F8003200CF
-:10EFC0000F80832100F0003A11098003E000C8019E
-:10EFD00030010C8003B000D00034000D800320000D
-:10EFE000C80032000C80030A04200000000000006A
-:10EFF00028053800BE00228003E8021A08BE482215
-:10F00000800AA003B800CA0822800FA40208008A60
-:10F010000022808DA0022800DA002A8108A0028A3E
-:10F02000004000000000000028054400B30020401C
-:10F030000B30020800B06468C108B022CC0C938089
-:10F0400000C04836028800B30024C00830060C0116
-:10F05000A3022CC008B0020A00500000000000000B
-:10F06000A0011408B50021400B38821C21B70023F1
-:10F07000E84A72269E408F81AB404270523800A30E
-:10F080002220C44931021E0AB7222DE8087202A8C4
-:10F090000040000000000000A8081200F68021E0F7
-:10F0A0000B780B1E00B4823BE84C7C13FE02978069
-:10F0B00033A00838039A00F78835E20C78E30E0095
-:10F0C000E3E834F80C3C232A0200000000000000B2
-:10F0D000081DA804F1003E420FB013EC00FB00BE77
-:10F0E000CC1EB607ED80FB0036000FB0436800CBA6
-:10F0F000303ED80FB60BED40CB003AC02FB603C25E
-:10F1000006600000000000000005F240FB913D4C4D
-:10F1100080F803DE40C6801BF04FFD07FF00CD8066
-:10F1200033E00C6803BA00FF8033E007F8033F10B8
-:10F13000CF803FE00CFC03000070000000000000E6
-:10F14000A8119000B5C02D40086202DC20D6022133
-:10F15000C88F7002DC81B50081440D61221804B7AC
-:10F160000035C00B7002BC00A7012DC0087003EA77
-:10F17000046000000000000000009001B6012FC0F4
-:10F18000187002DC0A961029C14B7006DC1085004D
-:10F1900025800860821A20A30025C00B31025C4044
-:10F1A00087002DC008700200002000000000000051
-:10F1B0002014C800B1002C40882002ED008A602095
-:10F1C000C00A3002CC04B10024002824020A003313
-:10F1D0000024C00BB002CC00A3002CC088300288F1
-:10F1E0000430000000000000A815A000FB003EC68F
-:10F1F0000C8003E50009C8ABE20BF002FC004A00FA
-:10F2000036C0089003A600FF0033C00FF0037C0057
-:10F210008F002FC028F0022A0460000000000000C8
-:10F220008000E100FA013EC00F8003EC00F9403E8F
-:10F23000C007B003EC00FA003A400F9023E500FB52
-:10F24000003EC00FB003AC00FB003CC00FB023E099
-:10F2500000300000000000000110F000FC203FC062
-:10F260000CC803FC20CD81B3C24FF003FC00CA00E0
-:10F270003C800CD0823601FF003FC00FF0033C08F9
-:10F28000CF043AC05CB003C044300000000000006E
-:10F2900081046204B8402C60088902EE80A9602ACB
-:10F2A000C00BB0038C00AA402E000810022681EB90
-:10F2B0000026C08BB0136C00DB002EC03DB002E016
-:10F2C000401000000000000080052300BB032EC892
-:10F2D00009B002EE008B1026C00BB002EC00A800B3
-:10F2E0002EC0088822A480BB002EC04BB0220C0088
-:10F2F0008B002EC00BB002E00040000000000000B8
-:10F3000008040000B2002EC0292802EC01A002204F
-:10F31000C0093002CC00A0002C40080042840093B9
-:10F32000006CC00B30064D0093002CC0083002C2A8
-:10F330001100000000000000000D6000F8202FC048
-:10F340000DB003EC00CB0033C00BF003FC18E80059
-:10F350002E80088003A400BF003FC00FF0433D1182
-:10F36000CF033EC15DF023C0035000000000000049
-:10F37000A01DF000FC103F400EE003FC00FC003F2D
-:10F38000C00FF003BC00FC003F002FC0037400EF6F
-:10F390000027C00FF003FC18FF003FC00FF003E888
-:10F3A0000670000000000000C015FC889C293F0882
-:10F3B0000FD283EC00FF083F280FCA033C41CF2047
-:10F3C000732C0CC0033020CF6033D80F78033F80FC
-:10F3D000DD9233C80F5003300070000000000000C1
-:10F3E0008010E54088402E048B9402E400B9000EA2
-:10F3F0007F8F9E836582CF683E508D04922F04D309
-:10F400004074DC0DA2022040890022F00B980220FB
-:10F4100004300000000000008805C809A0852C0108
-:10F420000B0010CC40A2082C00DB110289009330A5
-:10F4300020050813028008A36060C00AB082088417
-:10F44000812020D00B1002A20170000000000000FB
-:10F45000C015A41288806E200B8882EE00BA812E1F
-:10F46000605A9802A2008B002A6008111A2C00BB77
-:10F470000022C008B80A2800812002C00B9002B008
-:10F4800004600000000000004005ED00D9803E202F
-:10F490004F9800EB20FBE02E600B8C62AE208B00BF
-:10F4A000226008BC03A020EB0022C10A180B250033
-:10F4B000D900B2C00F900B90047000000000000053
-:10F4C000E0019488FF003F010FD001F008DD013F0B
-:10F4D000420740035C00AF003F400FF800F000DF40
-:10F4E000003FC00FC023F450FD803FC00FD0037811
-:10F4F00000600000000000004000AC00D9003E4069
-:10F500000F9403A820CA403A400F9403EA08FB0076
-:10F510003A004CF6232C30CB0036C00D9003A102EC
-:10F52000D900BAC00F9803100420000000000000AA
-:10F53000C80524008A002E400B9502E0088880222E
-:10F54000708F8C02E000BF02200008B8020E00DFBE
-:10F550000023DD0898822A00898023C00B501A32CC
-:10F560000040000000000000E00544008305244145
-:10F57000091002CE0083902C801B2482CC00BB009B
-:10F580002C8008040804018B0022C02812026C8021
-:10F59000814824C40B100238005000000000000015
-:10F5A00020013E4286802D600B6802F6908D8021FE
-:10F5B000220B5802D740B79021E00849921E53977A
-:10F5C0008121E048C80A5222858825E00B580208AC
-:10F5D000004000000000000048080C00830034C018
-:10F5E0000F0003CE20C3307C940B3483CC14F30281
-:10F5F0003C800C04030460C300B0C00C1003EC009A
-:10F60000C9003CC40F1103120200000000000000FA
-:10F61000401D9C00EE013FC04FE103D440F5167A37
-:10F62000C04EF003F41037053DC00FC00BDC40FFA7
-:10F63000003BC20ED007BC02EF003BC60FD003D088
-:10F640000660000000000000A805F400DD8433809F
-:10F6500004F0036C02CB027EC01FA053EC00CB2051
-:10F6600034400CD00B2010EB001EE00F300B2C00B0
-:10F67000C10032C00F9103EA0070000000000000DA
-:10F6800048119C0087002180086000140085002D2F
-:10F69000800B7052D404832829C02850035000875F
-:10F6A0004025C80F60020400A7003DC80B5202D2DB
-:10F6B0000460000000000000C0008E00958021E082
-:10F6C0000938021E11A7802DF00B7852CE0A9795AB
-:10F6D00021E0195C020E00A78029C80BF8021E2049
-:10F6E0008D8021E00B5802F0002000000000000097
-:10F6F0004814CC0082E0A0E82930060E50AB802CE4
-:10F70000F00B3142CC00930028C40998024C2883A6
-:10F710000024C00AB0020D00A25828C00B1002D26B
-:10F720000430000000000000E815B900DE8031A0C0
-:10F7300009E20B7804EEA42FA48BEC02D800DA00C7
-:10F7400027810DEC061B00EA043E800BE0033B0022
-:10F75000CEC022800FA003FA046000000000000069
-:10F760004800E080F8103E050E8803E00898403E0F
-:10F77000000F8483E140E8003A020E8043E140F844
-:10F780000036000F8003E020F8003E000F8003D217
-:10F7900000300000000000000810C400E9003E40F6
-:10F7A0000C90030420E99032680E9803A400C10075
-:10F7B00030400C94832408C9003E400C9003A40000
-:10F7C000C90030500C1A0302043000000000000091
-:10F7D0008004640089402E5028900A240889061667
-:10F7E000610B9C02E420A90036400D90022760A91D
-:10F7F000002E4028901A24008900364028980220C4
-:10F80000001000000000000018052C00A9082EC2FE
-:10F810000910002400A9000640899606E600890028
-:10F8200022C00890022402890024400890020C069D
-:10F830008300224008900206004000000000000003
-:10F840000804050081442C500814020580812064BE
-:10F85000701B1402E480A120644019120A0480A1E4
-:10F86000002C5018140285008140244040100202F0
-:10F870000100000000000000B80D6000E0003C0046
-:10F880000D80020000AA5036000F8003E140C852EC
-:10F8900072140C05162008C8503E010C8003A00409
-:10F8A000C800B2000C800B2E0350000000000000C6
-:10F8B0009819F502FD403FD00FD423F444FD147F86
-:10F8C000500FD407F440F9103F5007D123F440F90A
-:10F8D000401E5007D00B7500FD023E500FD403E6CA
-:10F8E00006700000000000001805F600C9A83E726E
-:10F8F0000F9803E6C0FDA0B3400FD0037780CD90F2
-:10F900007F400FDAA31690A9C032604CB1032400E7
-:10F91000C100336A0BDA030600700000000000002B
-:10F920003810E34088E02E300B8D02F340B8E876C3
-:10F93000004F800A228088906E288F8A036144F8E5
-:10F94000E13E2A08880342A0DCA03E100B850A0E87
-:10F9500004300000000000000805C4A085082D4800
-:10F960001B5282D480B11420400B18020582810002
-:10F970006C420B12820400A16021500B50021490C3
-:10F98000952C28400B1002020170000000000000BE
-:10F990001815A4018D442F400BD402F404B9082299
-:10F9A000400A92022C8489002E400A14026C80A91D
-:10F9B000012A4009500A5C028D602A400B904206E1
-:10F9C0000460000000000000A015E662C9023E5479
-:10F9D0000F9003E400F94022460B98036720C90109
-:10F9E0002E690B940B2520A90022402D920A262275
-:10F9F00099002A408F900328047000000000000046
-:10FA000028018602F9003E400F9003E680F1A03EF7
-:10FA1000620F9883C620F9003E490F9083E400717D
-:10FA2000023E400E900BE680F9803E400F9003CAE4
-:10FA300000600000000000002810A010C8003E0078
-:10FA40004F8043B000C84132000F80032102C8023A
-:10FA50003E104C80030120C8003B000CC003B000E6
-:10FA6000CC0432000F80030A0420000000000000D4
-:10FA7000280528008A802E800BA002F8048E00231F
-:10FA8000B20EE082F9048A002E810CE00A3A80DA94
-:10FA90000022B608A00228008E002A800B600B0A04
-:10FAA00000400000000000002805440293812CC0A3
-:10FAB0004B3002C80083CA20E019B0068C008104D4
-:10FAC00044400834020D0083002A0008000A8040E8
-:10FAD000880020C00B30024B0050000000000000E6
-:10FAE000A001040297082DC00B6006CA00830921FB
-:10FAF000C00A7002DC0085312D680930021C1493A5
-:10FB00002020C008F0429C028F0029400370122878
-:10FB10000040000000000000A808160096843DA0E8
-:10FB20000F78039A028780B1E00B7803B600C5A076
-:10FB300035610C78131E02C78029000C4803900021
-:10FB4000C48031600F58036A02000000000000000A
-:10FB5000081DA400EA003E800FA003E808FB003E59
-:10FB6000800F9013E408F9003C502EF003E808FBE6
-:10FB7000403EC00B30136C00FB003E400F3003C210
-:10FB800006600000000000000005D600CD8033E0D4
-:10FB90000CF803FA00FD803FA00DF803FA40CDD029
-:10FBA000777E0CE8431E00CFD83FE00CC8033AC470
-:10FBB000CC8033E00CF8030000700000000000006F
-:10FBC000A81194028D0021C0086003D81035208B45
-:10FBD000D40D6403D8C085002F4E0764029C02D761
-:10FBE000302F040DF10B5440AF0035400870022A4D
-:10FBF0000060000000000000000094408418218094
-:10FC0000087002DA20B5000900087002D4048500EB
-:10FC10006D4C8960025C4097006DC00940025880BD
-:10FC20008488254008D00200002000000000000069
-:10FC30002014C6488000208008AC02A800B100A8AB
-:10FC400088092202864281006C520B2002C752832F
-:10FC5000002C000834826700A3802040083002088E
-:10FC60000430000000000000A815A300CBC0B24083
-:10FC70002C9082E600BB80BE78088E02EE008D00DC
-:10FC800027600D900A6F009F022E0009B403678061
-:10FC9000CA40E4C00C30032A0460000000000000E9
-:10FCA0008000E080FB223E400F8013E400FB803E9A
-:10FCB000400F9003E500F9003E400E7023AC20FB9E
-:10FCC000003EC08F8003E920F9083E400FB013E0EA
-:10FCD00000300000000000000110F000C6003200FB
-:10FCE0000FD1833440CF003D400CD003DE500D00D7
-:10FCF00073400CD1037C408702B3000DF403240051
-:10FD0000CE2032400CD00300443000000000000040
-:10FD1000810461228A0022000B8040250089C32EC5
-:10FD2000200A9803A100890036408894020F01AB95
-:10FD30000032C008040A2900A902A2400DB00A201E
-:10FD400040100000000000008005000089002261D2
-:10FD50000B900225019B882E60088802E800B10202
-:10FD600024401890022C00AB0120C108B4422C00A2
-:10FD7000820022C008B00220004000000000000005
-:10FD800008040000010020400B000A044683012CF7
-:10FD9000401A000680008100244008200A0C01A3BC
-:10FDA0000024000880020000A10020400930020267
-:10FDB0000100000000000000000D6002C8002200E9
-:10FDC0000F90022500DA003E400C9002CC00FD00AE
-:10FDD00037400C10132C02AF0032C00DB0032C00C2
-:10FDE000CA0032404C900B0001500000000000009F
-:10FDF000A01DF000FC003F0007C003F41CF4003F0E
-:10FE0000001FC023B0029D013F408FC007FC02FFCE
-:10FE1000007B000FC003F000FD003F400F7003E8BF
-:10FE20000670000000000000C005FA00CB803F24EF
-:10FE30000AC103FC24CD20370A0CC2833080DC02C7
-:10FE40003FCC0DD9033C58DF3033C80DF4233C4080
-:10FE5000FF003FC54FF023B000700000000000001D
-:10FE60008000EC020B822E080DB702FD0083180AF9
-:10FE7000580A84A2A5A089302255081262BD908F2D
-:10FE80006221D648F3023CC5BF482FD84BB702E0E9
-:10FE900004300000000000008805EC0083002E897B
-:10FEA000280002ECA08922288208120228409A0821
-:10FEB00028C888B20A0D109310A0C82830024C0040
-:10FEC000B3602CC40B30C2E20170000000000000DF
-:10FED000C015AC408B002E8008B102EC028B0020D4
-:10FEE000D00A9002AC000B0126400894028C008BD3
-:10FEF0000022C008B0022C10BB002EC00BB002F0D4
-:10FF0000046000000000000000148C20CB023E2D95
-:10FF1000088003EC08C9801E040CB00301085018C7
-:10FF20003E400C04032C00DB0132C00CB00B2C084B
-:10FF3000BB003EC00FB00380047000000000000052
-:10FF4000E100BC00FF003F600FC023EC00FFC0BE1B
-:10FF5000608FC923F650ED80B850AFC003FC00FF9E
-:10FF6000003FC10EB003FC04FF023FC00FF003F8D6
-:10FF700000600000000000004010AC00EB00328088
-:10FF80000D90032C0089003E988C30036180FA406C
-:10FF90003E402CA5032C00FB013CC02C30032C0060
-:10FFA000DB0232C00FB003D00420000000000000CC
-:10FFB000CA002E808B82A0C08C90023C008BF02265
-:10FFC000C20D800227008B1022400880223C00BF17
-:10FFD000002FC008F0023C00BF01A3C00BF012F2DA
-:10FFE0000040000000000000E0054C00B31C204071
-:10FFF0000800062C009B0020D00820024C00A30023
-:108010002CC008100A0C00BB0028C00930020C005C
-:10802000B30020C00B3002F8005000000000000038
-:1080300022111E0097A021A00879021E009790210E
-:108040006009E8223E00AF8421E4485C021E00B7CC
-:10805000902DE00978001E09B39021E40B7802D836
-:10806000004000000000000048182C40B3B032402F
-:108070002C81130C42D100B0C08C30034820E301A6
-:108080003CC00C30030C00F3103CC0CD320B0C4054
-:10809000D30030C00F3003D2020000000000000007
-:1080A0004015BC00E7003F800BF103FD006D00327E
-:1080B000401F7007D841C3103BC00FD103FD00FF24
-:1080C000103FC00EF003EC10FF083FC30FF003D0C9
-:1080D0000660000000000000A815EC04FB023E4012
-:1080E0000BA003AC00DB0036800DB003AC00E80051
-:1080F00036C12E90032C00CBA036DC0FB0032D68C8
-:10810000FBA092C20CB103EA007000000000000066
-:1081100048119C0837002DC00BE0021D80B70423D6
-:10812000000A40021C18840025C01850320D80A39C
-:108130003021CC0B34821C10B73021C8087002D219
-:108140000460000000000000C0009E20B7802D6089
-:108150000BFC229E008D8025A008F8229200B4809E
-:1081600025E008F8021E0087B021E0097A021E18F7
-:10817000B38021E0087802F0002000000000000039
-:108180004804C520B3012CD80B3C022C08B90020B0
-:10819000030A00822208900D26E40810020C00A3B6
-:1081A0000022C00B30026C00B30022C0283002C293
-:1081B0000430000000000000E8059900FA023F903A
-:1081C0000FEC23A800DA0035800DE002BA02FEC2EF
-:1081D000B6A00EE40B2800CA00B2800FA00B280046
-:1081E000FA0032800CA003FA0460000000000000D6
-:1081F0004800E000F8003E000F8203E000F8003E77
-:10820000000F8103E040E8103A004F8483E000F85B
-:10821000003A000F0003A000F8003E000F8003D2D8
-:1082200000300000000000000800E500C9023E40E8
-:108230000F90232400C90032682F10032400E91492
-:1082400032400D900B0400D9001E400C9003240016
-:10825000C90036400C90030204300000000000000A
-:108260008014640089012E404B9012240089C2A220
-:1082700060889003640089C1A240481603640289A3
-:10828000002E40089022240089003E4028900A20B9
-:1082900000100000000000001804240089022E4095
-:1082A0000B1002240089102240899002AC00A10822
-:1082B0002240099802A40089002A40089002240064
-:1082C000890026400810020600400000000000005F
-:1082D0000800240081002C410B120204818120221D
-:1082E00048081202C481812402480A900284A081B5
-:1082F000286C4A0812D204A181282C4A0812820252
-:108300000100000000000000B8086140C8002E1401
-:108310000F850B2142CA5022140D8543A140E8501D
-:1083200030000D8502A1C0D8203A082C820B208293
-:10833000C82034098C82032E035000000000000086
-:10834000980DFC02F9003F404FD103E440F514BF03
-:10835000440D51235C40F5101F4E4D50036408F945
-:10836000283E4A8F9283E4A0F9283A4B0F9283E685
-:1083700006700000000000000805F440FD003040D9
-:108380000C90032400DD003B400E900374005D0060
-:1083900036640DD000A600F94032780C99032440D1
-:1083A000C99032500F9B03060070000000000000CF
-:1083B0003810E280B800220108800A200088002AD4
-:1083C00000088002200088002220088A8BE100B883
-:1083D000802230280D022200D8E422280B8F0A0EBA
-:1083E00004300000000000000805C480B100A04077
-:1083F0000810020400890008400A904244009100DD
-:10840000205828900285008120A04C09120A04807F
-:108410009140A0400B10020201700000000000001B
-:108420001815A400B9022040089002040089012216
-:1084300040289022040089102240089002E400B1F4
-:108440000022408190020400910022400B9002061D
-:108450000460000000000000A015E500F10032609B
-:108460002C92132402D1103A400E12036604D90054
-:10847000B6400D1903A400F9003240099001240010
-:10848000D90222400F900328047000000000000071
-:108490002A01A500F9003E640F1003E400F9813EB3
-:1084A000668F9023E480F9043E408F9003E404F942
-:1084B000003C400E9003E400F9003E400F1003CA58
-:1084C00000600000000000002A10A000F8243E0018
-:1084D0002C84032000B8203E008C8003A000708212
-:1084E00032000F80032008F80032002C800B200897
-:1084F000C8003E000C8003CA0420000000000000F9
-:1085000028052804BE803A8008A00228048E006D49
-:10851000900DA0023A008E80A2800EE00B6800BA97
-:1085200000228008A0022800DA002E8008A002CADB
-:10853000004000000000000028814C00B1002CC069
-:108540000830020C18A3022C108830068281A0008B
-:108550002AC00B300A4C00B30020C01AB0028C01B4
-:1085600083002CC0083002CA005000000000000048
-:1085700020011C10B40A2BC80831261C0086002DCF
-:10858000C00972021D00A54029C00A60025C88B3C0
-:108590002025C80A72029C8097202CE8807202E88D
-:1085A000004000000000000028081600B5803DE2F1
-:1085B0000C7A8B0EC0A7812C200CFC039202EF805A
-:1085C00039E40BD8011F00F780B3F48E79038E00D5
-:1085D000C7C43DE82C7B03EA020000000000000055
-:1085E000081DAC00F8003EDD87B603EDCCE9003E87
-:1085F000400FB007CC100B0036D80F8043AD80FB86
-:10860000283AC00DB4036CE2EB603ED40FB003C255
-:1086100006600000000000004005FE00FE903FE5FF
-:108620000EF8033E10FF9017600FFC037A00EE80F7
-:1086300037E20E780FFF40EF881FE00CF883FE80D2
-:10864000CFD0B3F00CF8C3100070000000000000A1
-:10865000A8119C40B4100FCC0072021C00B6020995
-:10866000C028F0029800A60021C00B6003FC02871E
-:10867000002DC0087002DE008F1021C008F0036AD0
-:10868000046000000000000080009400B6022FC2C9
-:108690001A30801C00B60801400AF002180087005A
-:1086A00021C00BD0029C10870029C0087002DC4456
-:1086B000871064C00870020600200000000000005F
-:1086C0006014CE60B0002CC008340A0C08B004005E
-:1086D000400830A28980A26220E00B000ACC088307
-:1086E000006CC0083052CC00830024C0083002580F
-:1086F0000430000000000000A815AE00F8003FD0D4
-:108700000EFC033C00F90092840FFC03640080001F
-:10871000B7C30FB883BC04EF003FC03CF003FC02BA
-:10872000CF0037C028F0132A0460000000000000CA
-:108730008000EC00F8413EC80F3203EC00F8003A2C
-:10874000C40FB103C400F90036C00FE40BEC04FB06
-:10875000003EC10FB043EC04FB003AC00FB003E48D
-:1087600000300000000000000110F400FC803FC059
-:108770001FF0033C08FB0033802EF013A404CB0051
-:10878000B9C02CD80B3C00FF003FC00970002C047E
-:10879000FF003FC00FF003C00430000000000000E5
-:1087A000C1006C00B8802EC00BB0036C00B9162855
-:1087B0007208B0222740DB0022C008BD822C08BB13
-:1087C000002EC048B0022C00BB002EC10BB002E04E
-:1087D000401000000000000080052C00B8602EC092
-:1087E0000BB0022C00B1002A844A3022AC209880C1
-:1087F0002AC0083002AC003B002CC00AB002AC0812
-:10880000BB002EC00BB042E00040000000000000A2
-:1088100008040C01B0002CC00B30024C04B0002A3C
-:10882000800830020000100428C00820428C00B3E9
-:10883000002CC042300A8C00B3002CC08B3002C226
-:108840000100000000000000000D6400F8503FC06F
-:108850000BF0033C00FA0432800EF023AC00D90088
-:108860003BC00C9003BC04FF003DC02EF00B3C004D
-:10887000FF043FC00FF003C00350000000000000E1
-:10888000A01DFC00FC003FC007F003FC047C02B507
-:10889000000FF003F000FC0037C00FF0137C00FF66
-:1088A000003FC00DF0036D00FF003FC01FF003E864
-:1088B0000670000000000000C005D200D580330A19
-:1088C0004CF803F200FC0037261FCA03BCC4CF20BB
-:1088D00033E40F78033E44CF003BCE9F6813D000B3
-:1088E000CD80B3600FFA83F0047000000000000038
-:1088F0008010E080C928223008B222EA01B8822024
-:10890000504F9C00A8D1DB10A6E017B803EC80DB29
-:10891000081FD00BB802F600FB8022400BB00260AB
-:1089200004300000000000008805C4208180200081
-:108930008B3082C000B01028088B1130C48490287E
-:1089400024C80B30024C00831004C80B3002CC004A
-:10895000B30024400B3002E2017000000000000070
-:10896000C015A600810022100BB012EA20BB002A1D
-:10897000700A9C026200988826C802B2028E088B98
-:108980001822C00BA002EE203B0026400BB0027064
-:1089900004600000000000004015E000CB003280C1
-:1089A0000FB003E700B8523E204B0C43EF829BC050
-:1089B00032C00BB0026C018B802EC00BA083E6008E
-:1089C000FB0036400FF003D00470000000000000F0
-:1089D000E001B002FF043F900CF101F4087D803704
-:1089E000000FC0239800F7002BE00FF823FC06FBD4
-:1089F00083BFC087D003DC00EF003BC00FB001F89D
-:108A000000600000000000004010A600CB00338092
-:108A10000FB003E110F240B2003D94172D44FA412B
-:108A200032C09FB0232C02CB4032C04F90033D0098
-:108A3000CB003E400FB003100420000000000000F7
-:108A4000880526008B7120D5039902E000BB8022A7
-:108A5000601C80036000B80222C20B32022C018F1E
-:108A600002D7C00BA0036D4053802EC00EF043729E
-:108A70000040000000000000E005680280002400C3
-:108A80000B3526C200B09020C08800024F20B302F0
-:108A900060E21B38020C00880060C00B34824C027C
-:108AA000A1902C400B30023001500000000000006B
-:108AB00020013A088CA02D204B7802DA00B29021D8
-:108AC00066487902DE40B791A1E0DBF8021E4084DF
-:108AD0009001E08BF9025E0197802D600A780048D2
-:108AE000041000000000000048080C00800024046E
-:108AF0000F3203C4A0F14230C42C31024400F11102
-:108B0000A0C00B300B0C42830000C00F30034C029E
-:108B1000E3003C400B3001120200000000000000A6
-:108B2000C01DBC00FCA533C00FD003FC01BF003F3B
-:108B3000C40E7103740075103FC005F003DC40FFE4
-:108B4000043FC00FF043FC007F003F400EF003D015
-:108B50000460000000000000A804E800F204B380F4
-:108B60000FB80B2C00EB8032C00C20132E08CB0169
-:108B700032C50FB103EC48C81032FA8C38033C9070
-:108B8000CB003E400FB013C2047000000000000094
-:108B9000C8109800F60061810BF0021C00D700B7E6
-:108BA000800C7002BC108F0021C88B7243FC88DCE3
-:108BB0000037C80D50021C2287002DC00B7002D355
-:108BC000046000000000000080009E00B680A9A0A4
-:108BD0004B7C025E30A38821F00878021600858065
-:108BE00021E00B7802DE008780A1E408D8024E0065
-:108BF00097802D700B7802C8002000000000000054
-:108C00004814EC00B20028C00B10024E90930222D0
-:108C1000F00838428C42830422E44B38028E4083B1
-:108C20000020C00938224E2193002EE00B3002DBD9
-:108C30000430000000000000E815A801FA003B899C
-:108C40000FA0027808AE4023802C6C0B3A008E8C6B
-:108C5000B2000B8082E0028E0022800CE8027B8052
-:108C60009A803E800FA003FA04700000000000000C
-:108C70004800E009EC0036210B8013A100F8603EAB
-:108C8000000F8103E000F8003E000F8043E010F881
-:108C900000BE000F850B8000E8103E000F8003D25D
-:108CA00000600000000000000810E402C902304823
-:108CB0000C9913A402C9003E420C908F2400F900C5
-:108CC00032280C8803E000C900B2400F9003E7008F
-:108CD000C9103E400C1003020420000000000000F8
-:108CE000800464018980A248289242C50089402EF0
-:108CF000402C90062500B9002250089802C4008933
-:108D00000176404B9202E50289002E400D900360EF
-:108D100000100000000000001805240C8520A2406F
-:108D2000089006E50089402E40099042A4A0310039
-:108D30002250189102E400810022400B9006E400CA
-:108D400089002E400990020E004000000000000043
-:108D50000004150085402040081426E40081002C02
-:108D6000401810028480B120A050081402E502814E
-:108D70004020480B1006CC0081012C500914024AF7
-:108D80000500000000000000B80D60008C003200FB
-:108D90000C8023E000C8003E140D8012A144F8515D
-:108DA00032002C8003E000880422140F8007E000CA
-:108DB000C8003E000D80032E03500000000000009C
-:108DC000989DE400F9003F500FD003DC01BD423F05
-:108DD000504FD4437441FD103F101FC413F100FDE8
-:108DE000407E440FD043F501FD003F400F9403E661
-:108DF00004700000000000001805F400DF05336176
-:108E00000F50533410FD0433444F500376C1CDE06E
-:108E100033600CCE03F6C0E1C0B6648F500B3682CF
-:108E2000CD003E444C9EC3C601700000000000000F
-:108E30003810EA2880A0B2040B8A836000FA00365A
-:108E4000288B8003E3C8C8842214088A02E280D8F1
-:108E50008234341B8003600488002E200A8E42CEA8
-:108E600006300000000000004805C480810804416D
-:108E70000B92020400B1002C400B18022400B160D8
-:108E800026400A1602C500A1C020480B90024700E8
-:108E900091012C48181202D201600000000000006D
-:108EA0001815A40C8B04A2500B91022404A9012EC6
-:108EB000420B9002A400A90026600A9002E60081FD
-:108EC0000022408BB002240899102E401A9002C64E
-:108ED0000020000000000000A015E500C900364099
-:108EE0000F10022500B1002E600F10122402B9A04D
-:108EF000A4402E9103E600A90022400B19806404CF
-:108F0000D9812E404C9003E814700000000000004E
-:108F10006801A40AE900BE480F980BE400F9C436C2
-:108F2000701F9203E690C1903A408D8803E400F9E7
-:108F3000903E400B9803E640E9003E400F9003D27C
-:108F400000600000000000006810A102D820B210EC
-:108F50000C80832140C858B2104C800B2000F8428E
-:108F600032000F8003E002D80072001C8000200055
-:108F7000F8043E000F8003020420000000000000FF
-:108F800028053804CE41238008E0023910AE402283
-:108F90008008E0021A00BA002BAD038002E800CA84
-:108FA000002A800AE0021800BA001A800BA0034AC7
-:108FB000004000000000000068056C128900A0E07D
-:108FC0000838020D88830004E00838320E2531018C
-:108FD00024E08B3802E401830020C00830028C00BA
-:108FE000B3002EC00B30020A005000000000000049
-:108FF000A0011420862029B008F0823E04A7002199
-:10900000708870921C20BD0069C00B7602D4808FDE
-:109010002129E00A60869801B7002DC80B3B026049
-:109020000440000000000000A8083E00C7A0B0E017
-:109030002C780B1A00C38037E02878031A08F590C3
-:1090400035E00F7C12D682C79021E40878039E0099
-:10905000F5803DF10F7803220200000000000000BF
-:109060000819A400EE8036C14FD003C800FB003EB3
-:10907000510FB003E408F1603EC00FB003C500EB30
-:10908000103EC00FB0096C00FB003AC00FB003C225
-:1090900004600000000000000001FE00FD88336055
-:1090A0000FF903CE40D78437700CD8233600C5881B
-:1090B00033E04FF813F728DF8037E20C58033E0007
-:1090C000FF903FE00CF803000020000000000000CB
-:1090D000A9119C08F600A1000B6302D6308541312E
-:1090E000C80850231C00D520B1800F7003B400C7FE
-:1090F0000021C00F40A35840B7003FC40AF0022A25
-:10910000062000000000000000009C40B71021D2A3
-:109110000B7002DC42860025610851025000950068
-:1091200025C0097082D400870024C00850025C006A
-:1091300095042DC00870020000200000000000000F
-:109140002014CC08B2D020E04B0802C4008080205C
-:10915000F0081A028548811020400A3002C6109398
-:109160000020C00A1C020D40B30068C40AB0020906
-:109170000030000000000000A815AC01FE0032F035
-:109180000F8803E600C8C836F628A60A6D009D00C1
-:1091900032000BB003F603C70037C0089C0A6E000C
-:1091A000BB002FC00CF0032A046000000000000088
-:1091B0008000E401EB403E804FC103E400B8083A70
-:1091C000408FA4136C20F9003E700FB003A440EB55
-:1091D000003EC00F9223E800F9803EC00FB063E06C
-:1091E00000300000000000000110FC08CE0833C071
-:1091F0000FDA033000E40435C00DA0032800C500D9
-:1092000033000BFA03F403CB0031C00CD403142059
-:10921000CD8023C10CF002084430000000000000A3
-:1092200081044410CBD022C00B94022284B8C60221
-:1092300040082802A580890022600BB80264008BD8
-:10924000002AC0C800036600810000C00DB00AA853
-:10925000401000000000000080052C001300224098
-:109260008B24022A00BB82224000AC0284008900C9
-:1092700022220BB002C4009B002AC008B0022E00BC
-:109280008B102AC008B002A01040000000000000AF
-:1092900008040C10830020010B20020080B1002084
-:1092A000C108200288018100A0000B300244019B0C
-:1092B0000028C008B002480689002AC0093002828E
-:1092C0000500000000000000008D6C00C300B2C06B
-:1092D0000FB0032820FA00B1400DA007A000CD0078
-:1092E00022000FB003F4009F003BC02CB00B240001
-:1092F000C900BAC00CB00380035000000000000099
-:10930000A01DFC06FF02AFC00FC003F010FC003F21
-:10931000C09FE013F000FD043F404FF0037400EFE6
-:10932000003FC08FE002B401FD0437C00FF0436876
-:109330000470000000000000C005FC00C720B3C896
-:109340001CF1037C20CF0A3FD00DF0037C808F32CC
-:1093500033C40FF1833CE0CF1033C40DF2833CE201
-:10936000C78017CC4CF38330007000000000000071
-:109370008010E3408868223008060201A188C40EEC
-:109380001408878001C0285002048B8602A19888A7
-:10939000412A040A8482BD808B082BC488F40360B0
-:1093A00004300000000000008805CC088240201036
-:1093B000082112440482042C0889900244218B0065
-:1093C00024888BA00040848930224888B002CC08D1
-:1093D0008820A4C800320A220170000000000000AA
-:1093E000C015A000890022C1889062280889082E33
-:1093F000C008A0022808A80026420B9002CC508A80
-:10940000222A860A8002EC0088842AC108B026300D
-:1094100004600000000000004015F002CF0033C0DF
-:1094200048F84379008DC03F308D60837860C45820
-:1094300037200F58137B02CCC431200C4403EC02BC
-:109440008B8036C024B012100470000000000000B1
-:10945000E0019C00F4103D006FC913D412FE903F50
-:10946000F00FDA23F414FF023BF00FEA23B600FFFB
-:10947000823FE18FF403BC00FF003FC0AF7003F8F0
-:1094800000600000000000004010A000CA00320888
-:109490001CA003A520CB40BA101FB003AC00EB000A
-:1094A00072900CB4032904C95232500CB4030C005E
-:1094B000F84032C10EB00B50042000000000000044
-:1094C000C8052D80898022D90890222A008854223C
-:1094D000C08B80222019C80022408D801A2410D20F
-:1094E0004422810D80037C00B00037C088F0023236
-:1094F0001040000000000000E0054E008100A0F0D8
-:109500000890028902800022C00B0022A000B00057
-:1095100020400800020400826020800800020C083D
-:10952000B20022C0083002380050000000000000E5
-:10953000200103108E902324086B0216608F802177
-:10954000280BF9061E408F8023A44979023A409DDA
-:1095500090236409F8025E40BE9024E42879020852
-:10956000004000000000000048080C42C009300024
-:1095700028020384008A2030C48B11038450B30076
-:1095800020C00CA4220400CB4030C50C30030E4098
-:10959000F31030C40CB00312020000000000000001
-:1095A000401DB004FB043DC00FF243F804FD013F31
-:1095B0000C0F6103F848F4003D010FD003C800FC14
-:1095C00004BD040B4803FC18FF143FD50DF00390B5
-:1095D0000660000000000000A805E000F90132C0AC
-:1095E0008E90032802D10032C00DA80B0800E800BD
-:1095F0002E400C980B2E02CA00B2A06C80232D8046
-:10960000CA8032D00CBA032A0070000000000000AB
-:1096100048119C00B600A3000860020400860429DB
-:10962000000850421404A7000D804A600200008127
-:109630000021400870029D42860120C0083282123B
-:109640000460000000000000C0009200BC806320A5
-:10965000820802520084C22320880C0233008480D6
-:109660002F21894C02121494C56421084C020E80EB
-:109670009782A1EC08790230002000000000000071
-:109680004814CD44B30020C00830024D8003882820
-:10969000C0083C060F00A3432CC21B38020F009BDE
-:1096A0008864D008B8028C10930020C008300A12D9
-:1096B0000430000000000000E815AA00FA0532801E
-:1096C0008EA00B6900CA4032A03CA8032A00EA26FB
-:1096D0003EB00DA1632820CA4036A00CE013280933
-:1096E000DE0032802CA0033A04600000000000007D
-:1096F0004800F020F4003F000F4023B000EC003F92
-:10970000061EC213F088FC203F048EC003F080ECDC
-:10971000403B0C0FC0A3E000E8003E004F8003D2A6
-:1097200000300000000000000810E400F9003240A2
-:109730000C90032400C98032400F9053E410C900FC
-:1097400032400D9003E400F90036408F900324105E
-:10975000C9013C400C9003C204300000000000002E
-:109760008004474489002040089002250A81102285
-:1097700040489003C40089007640289002E410B964
-:1097800040B2400B9003640089002E41089042E0F3
-:10979000001000000000000018052402BD0023484E
-:1097A00008D0061D048D0029C04AD022F40085008F
-:1097B000614018D012FC00BD40A3404BF0020401F0
-:1097C0008B002E40089002C6004000000000000000
-:1097D000080436808520A34808520A148185202970
-:1097E00048085202B48085202548885202D480B5AA
-:1097F0002021480B520244A281002C4A081282C246
-:109800000100000000000000B80D6000F8512200C7
-:109810002C85022148C800BA140F8512E142C850B5
-:1098200022000C0003E000F85032000745032080BE
-:10983000C0013E082C8203EE03500000000000002F
-:10984000980DE440F1103E44079143E458F9113477
-:10985000444F9102E450F9103C4F0F9383E4F0F928
-:10986000113A4F0F9103E4A0FD283E4A0F9283E680
-:1098700006700000000000001805F6A0CDA0B36837
-:109880008C9A033680C5A022600C9A232604F9A086
-:1098900032660C9A830620C5A022600C9B032648E2
-:1098A000C9003E780C9A030600700000000000001A
-:1098B0003800E10088442295088512A142884002C0
-:1098C0009008840223A0BA4022A0088E92A3A0A8E8
-:1098D000402A1008AE02234088002E380884120E59
-:1098E00004300000000000000815C4008B12224064
-:1098F00008900244008140A05008110A0500B110F0
-:10990000A04808900204008140205028110244829F
-:1099100081002C50081102020170000000000000BC
-:109920001815A40289402240089412A50089282213
-:10993000490894022448B9142240089402A440A182
-:10994000502A50089142640089402E4008100206B7
-:109950000460000000000000A015E400C9003070A1
-:109960002C100B6600C94032500C90032620F9C021
-:1099700032700C90032620C90032400C9C03640016
-:10998000C9413E402C900B280470000000000000EC
-:109990002801A400F9043E480F9003E488F900343C
-:1099A000412F9C03E410F9003E442F9903E410F981
-:1099B000003E500F104BA410F9203C400F90034A7A
-:1099C00000600000000000002810A000C8003E1049
-:1099D0002C80032002C04032001C040F2100C00470
-:1099E00038000F80032108C86030100F800220006B
-:1099F000F80032000C8003CA0420000000000000C0
-:109A000028051A2082042F8008A00238008E8022A8
-:109A10008008E00228008A0022810B20022800DE54
-:109A2000E436800BA0422800BA04228008A002CAB3
-:109A3000004000000000000028054C0083012C803D
-:109A40000830022E608290A0C04830020C028300D1
-:109A500028C00B300A2C0083C220C00B302A2C00F7
-:109A6000B300A0C0083002CA00500000000000008F
-:109A7000A0013C0087012DC208F3123C008F012198
-:109A8000C86872221E04872021C40B70023C849F88
-:109A90000025C44B70021C04B78121C8087202E87B
-:109AA0000040000000000000A8001E00C7813CA08C
-:109AB0004C7A0B1A00C68030E008F8820E40CFF0D6
-:109AC00039E80F3A031E20C78031E30F38231F08FF
-:109AD000FFC033F20C7E03EA020000000000000029
-:109AE0000815880A7B003EC10B3423C810FB023ED8
-:109AF000CA0FB743EC80FB002EC20BB483EDD0FA43
-:109B0000003ED90FB383EC80BB203ED82FB403C2F4
-:109B100006600000000000000005FE00F59131A085
-:109B20000CFC03FE00C48131EE8DF80A3E30CF8478
-:109B300033E02CF883FE10FE8033E00CF9193F4827
-:109B4000CFC033E004FC03C0007000000000000040
-:109B5000A8119C08B7A121C8087102F0A085202196
-:109B6000CE0870023C808F002BC5087102DC10B457
-:109B70000021C10AF3820C00870129C00871026A22
-:109B8000046000000000000000009D00BD2127824D
-:109B9000007002FC048C00A7CCA870023C08AF0047
-:109BA00021C0087002DC00B70021C40870161C0A2E
-:109BB0008F0021C0087002C00020000000000000DB
-:109BC0002010C800BB4424E208B102C280018024F6
-:109BD000D08830020F52839128E4883D02CED0B065
-:109BE000B2A2C00A34120C02830028C00830024816
-:109BF0000430000000000000A815AC00FB01E440A8
-:109C00002CF043E5008A8837E000FA023D00EF00BF
-:109C100033D10CF403FD00F94033E80CFC013C04A3
-:109C2000CF0233C02CF003EA046000000000000003
-:109C30008000EE08F9103AD00FB093EC00FB0B3A1D
-:109C4000C08EB083EC80FB097EC80FB213EC00F924
-:109C5000003EC28FB24BCC04FB003EC00FB003608D
-:109C600000300000000000000110FC00FF0833C0BD
-:109C70001CF0037040C4C033C20FF0031C10C700B7
-:109C800031C00C70031C00C54133C00CF0232C0004
-:109C9000CF00B3C06CF0038044300000000000002F
-:109CA00081046A00B99032F108B0020A10D900228A
-:109CB000C10BB0022C00CB0622C088B0122C008849
-:109CC0008022C10DB0022C00830022C108B046E002
-:109CD000401000000000000080012E00B90022F0BA
-:109CE00008B01264008A0022C00B30422C008B00A6
-:109CF00022C008B0022C008A0022C088300A2C0042
-:109D00008B0020C008B002E000400000000000000E
-:109D100008040C04B102E4C108B022200293002020
-:109D2000C00B30120C028302A0C028300E0C02803F
-:109D300000A0C049300A0C028B0020C0083002C2CB
-:109D40000100000000000000000D6C00F92432C08A
-:109D500008F0036400C800B3C01FF00B3C008F0084
-:109D600033C04CF0433C08C30031C00CF0033D4805
-:109D7000CF0031C00CF00380035000000000000051
-:109D8000A01DF004F9413BC04FF003F011FD003F6E
-:109D9000C0877027FC00EF063FC00FF002FC08FCF4
-:109DA000003FC047F043FC0077003FC00FF003E8DE
-:109DB0000670000000000000C005D200C701370C8B
-:109DC0000FE823104AC4C031300CC9033446CF1009
-:109DD00033D00CF4033C58CF0033C02DF1033E02C6
-:109DE000CF213FE40FF203300070000000000000BC
-:109DF0008010E4840B40224C0BA8022CC08B202244
-:109E0000C84A32022480832020C008300220008B00
-:109E10002132CA4832022C308F902E880BBD12207E
-:109E200004300000000000008805CE20A340E04878
-:109E30004B20220C0282002A00082002048080208D
-:109E400020C80802020C00800C60000820122C8838
-:109E500083002CE80B30026201700000000000005B
-:109E6000C015AE00AB01A2600BA002200181002250
-:109E7000C00A901204208A0822C108A00228008883
-:109E800000244408A202AC008B042E8803B00270A8
-:109E900004600000000000004015EC00EA90322849
-:109EA0000FB6032008C9043AC04C90222400CB40CE
-:109EB00032A80CB2032C00CB80B2E00CB00B040033
-:109EC000CB003EC04FB00B500470000000000000FB
-:109ED000E001BC00DF803B810FF0C3FC00BE011F2E
-:109EE000000FE023F400FF003FB04FF043D402FF27
-:109EF000913AE04EF0037C0CFF002F800F3003B846
-:109F000000600000000000004010AC01CA00725068
-:109F100004B4032C82CB0032E00CB8032704C8C879
-:109F2000B2A20C88032C00C1003E002C301B2C0474
-:109F3000FB103EC00FB00310042000000000000022
-:109F4000C8052C040350A2E00834423300880020E6
-:109F5000100D840325008A40229008A5022C008958
-:109F6000A43A4008B0022C00BF842E800BF052327D
-:109F70000040000000000000E0056C808180248823
-:109F8000893C2621009000200208808200209B004E
-:109F9000224088B0120C0883802CC00810020C00EC
-:109FA000B3802C400B30023800500000000000004D
-:109FB00020013E0A85A0A56008FB823E849F816344
-:109FC000E089791252809782216C187802120087FA
-:109FD000A129E0085B021E00B7C02D600B780208C3
-:109FE000004000000000000048080C00810826C264
-:109FF0002C32130EA4D200B0001C21122402D12056
-:10A0000030C80C10030C00C2103C800C23030C4021
-:10A01000F3003C480F300B1202000000000000006B
-:10A02000401DBC00FD20BB40077202F010ED103F48
-:10A03000C40FD163B480EF003FC80FF003D800FE17
-:10A04000343FC40FEB43FC00FF087F400FF183D087
-:10A050000660000000000000A805EC00C800338086
-:10A060008F28032000490232C00F90032000CB004C
-:10A0700032404CB00B2C00CB8032C00E9E0324002B
-:10A08000FB203EC00FB0032A00700000000000005B
-:10A0900048119C008D0121C00B60021D00D60021DB
-:10A0A000000BE00200008304204008704234028765
-:10A0B0000123C028510A1C04B7302DC00B72039233
-:10A0C0000460000000000000C0009E00A64021A027
-:10A0D0000B68020E008F8021E00B78021610A5801D
-:10A0E00021E00818021E00838021A00878021F00CA
-:10A0F000B7802DE00B380230002000000000000087
-:10A100004814EC12A16420E60B20020010904A20B3
-:10A11000204B00420400830020C20830028C0083E0
-:10A120000420C00830020E00B3002CE04B30029235
-:10A130000430000000000000E815B800EEC03390C5
-:10A140000FA01B0800CA40B2820FA00B2802CA0051
-:10A15000B290ACA0032900CA40B2808EA4032A00AA
-:10A16000FA003FA80FA00B3A0460000000000000B6
-:10A170004800E20290003E000F8803F100FC023F1D
-:10A18000200FC803C100F0003E008F00016002F8FC
-:10A19000083E000F8083E000F8002E008F801392AD
-:10A1A00000300000000000000810E402C900B264A2
-:10A1B0000F9103E404C90032406C90032502C9905A
-:10A1C000B0400C90032420C9A03E404C9023E400F2
-:10A1D000F10092400C100302043000000000000067
-:10A1E000800464008980A2400B9642E50489002225
-:10A1F00040089002240809412240489042240489E2
-:10A20000802640089002E400B90022400894022011
-:10A2100000100000000000001805250089202240E1
-:10A220000B9002F4848500214048500224208D08C0
-:10A23000234008D00294008D0029400AD002A408CF
-:10A24000B90028401890C20600400000000000003D
-:10A2500008040500810020510B1002F58085C1A182
-:10A260005008540A050685402150885402950085FF
-:10A27000442D502A5412C501B100085008100202A2
-:10A280000100000000000000B80D6000CA503280DC
-:10A290000F8003E802C80132002CC0032000C8026E
-:10A2A00032002C800BA000C8003A004E4023A008CA
-:10A2B000F8003A002C800B2E035000000000000034
-:10A2C000981DDC04FD403F504F9063E440F1023E96
-:10A2D000410F9013F504F9413E500F94436502F984
-:10A2E0004136504D9403F400F94137404F9403E652
-:10A2F00006700000000000001801FC00CDA83370BB
-:10A300000FD013F688CD0032504F142307A0C9C0D8
-:10A3100032780C9E033702CDC032640F98032400BC
-:10A32000CD0032402CDA030600700000000000006F
-:10A330003810E20888EB22300B8012E804A0A02A33
-:10A34000200B8A0A23008880222800C842238080AC
-:10A35000D420280980022294A8002A008885020EB1
-:10A3600004300000000000000805C4A0830024D8C9
-:10A370008B1002E514890A21480B52025480854053
-:10A3800025580956024502812020500B1402043042
-:10A39000810020400810024201700000000000000F
-:10A3A0001815A4128900A6400B9042E498A9802BAE
-:10A3B000400B510255009D08274809F602440081D0
-:10A3C00004224019918A2480A9002A40089002465C
-:10A3D0000460000000000000A015E702C904365820
-:10A3E0000F9003C500C90032400F90136402C900EA
-:10A3F00036402D900B6604C9E0B2488F9847240080
-:10A40000C90072400C1003680470000000000000D6
-:10A410002801A508F9213A400F9003E604F9003E0F
-:10A42000404F9883A400E940BA600E9003A480F9DD
-:10A43000A33E480F980BE400F9001E400F90038ADA
-:10A4400000600000000000002810A248C820320868
-:10A450001F8083E122C80133002CC0033004CC40AC
-:10A46000B1000C44032012C84132002D840B60005F
-:10A47000F800B2004C800B0A04200000000000002D
-:10A4800028053A00A600239003E492F800820036E3
-:10A490008008A0036800CA00228308A00228038A5B
-:10A4A00000228008A0022800B68022800DE8020A5F
-:10A4B000004000000000000028056E00824220C01D
-:10A4C0000B3402CD09800020000800020002980031
-:10A4D000202028000A0410818020C008B0022C002F
-:10A4E000B30022C01831020A005000000000000032
-:10A4F000A0013802A30021401B7002DC2084056506
-:10A50000E008F0027C10970024C0083002548887CD
-:10A510000921E80933021C80B60863C809381228EB
-:10A520000040000000000000A8081E00C7A0A1E035
-:10A530000B7803FE00C58233200C48031E01DF8028
-:10A5400031200C48030640878231F80D7B035F0001
-:10A55000F38031F20C60032A0200000000000000CA
-:10A56000081D9C00FB012F4007B003E804F9003EE2
-:10A57000C10FB003E006E8023AC00FB001A410F921
-:10A5800040BED006B003EE00FA003CD80FA003C2D4
-:10A5900006600000000000000005F600CF8833646C
-:10A5A0002CF803FE02C4B033208CD8033200CCB4A4
-:10A5B00033A00CC8031620CFC033F00CF803FE0004
-:10A5C000CD803FE00FD803000070000000000000C5
-:10A5D000A811B5048712A1500A7412C44084112333
-:10A5E000C028E0021C02A711215848700A14008DEF
-:10A5F0000023C00B7002FC4086002DC00B50022AC5
-:10A600000460000000000000000095008740210069
-:10A61000187102DC009528E1020850023C42A72292
-:10A62000218088410214008500A1C0097102DC006C
-:10A63000B5102DC00B4002000020000000000000FB
-:10A640002014C41083842011083002C310912020EC
-:10A65000C00828120000A08420400830020426838D
-:10A660000020D00B3002CC00B2002CC00B0002083E
-:10A670000430000000000000A815AD00CF88B2E84B
-:10A680000C3013CEC2D08232000C0E0B2000C888D2
-:10A69000B2402CBA433702CB00B3C02CF003FC12FB
-:10A6A000FB007FD10F300B2B046000000000000086
-:10A6B0008000ED02F1403E410FB023ED00E8013E85
-:10A6C000C80FB013EC04DB003C800F0403E440F936
-:10A6D000003CC20EB003EE004B413EC00FB003E0A1
-:10A6E00000300000000000000110FC004B0032426E
-:10A6F0000CF0033680CD0033004CC0833C04F700DF
-:10A7000032400CB1431400CD8033C00CF003FC0088
-:10A71000FF00B3C20CA003004430000000000000A2
-:10A7200081044F028B80203008BC02201089002257
-:10A73000C000B0036004B800A290288C1A24028BD9
-:10A740008322C108B002FC00B36020C00DA003E06A
-:10A75000401000000000000080052E00ABC0226009
-:10A7600008B8022900880120000890022000B800E3
-:10A7700022C008B002E4008124A2C009B046EC0067
-:10A78000B90022C008900220004000000000000034
-:10A7900008042C00A100A04108B00A205388002022
-:10A7A000C028A0024C00B30020008800028400836F
-:10A7B0000420C0283002CC00B30262C0091002C2DB
-:10A7C0000100000000000000000D6C00E900220004
-:10A7D0000CB0030004C900B2000C90032C00F3007D
-:10A7E000B2C08CB003B4028F0023C004F003EC08A5
-:10A7F000F90033C00C80030003500000000000008B
-:10A80000A01DFC10DD043F000FC023F090FD002FC1
-:10A81000C00FE043D000FC003F008FC0227400FD59
-:10A82000043FC00FF003FC00FF063FC00FC043E829
-:10A830000670000000000000C005FC80EF2011C081
-:10A840000E7203BDB0CF31BFCC02F003FCC6CF0106
-:10A850000BC50FF1033C04EF6133D807F0033480DC
-:10A86000CD3073CC0FE80330007000000000000012
-:10A870008018E90088692210088C00218488412210
-:10A88000108886920100886222104B870221A088DE
-:10A890006020100B86A235A0AB60A1C40BB80220CB
-:10A8A00004300000000000008805CDA8334120C618
-:10A8B0004A31008C10933328CC2934128C50931CCD
-:10A8C000288401204A4C41831024CC4B31424C4017
-:10A8D000911024C00B8002220170000000000000D3
-:10A8E000C005A820900222000880002030B8082669
-:10A8F0000001808220201808424003910260000875
-:10A9000001A6000B80006C10BB0126C04B900A30E2
-:10A9100004600000000000000011FD00FD4133A1B3
-:10A920000ED203B502DF423B010FD443B500CD4048
-:10A930001BC40D78037002EC0017A10FE80B2C026A
-:10A94000D99026C00FAC0300047000000000000086
-:10A95000E001B800EE001F644FE003D810C41833C4
-:10A96000C00CA0A1B809E60936220F8823BC00FB61
-:10A97000003B640FD9039C00E3043BC00FF403F8D1
-:10A98000006000000000000040108D00C940B6804B
-:10A990000F1003A720FB50B6084C14036522D940C2
-:10A9A000B6800EA00B0000D800768228A023640099
-:10A9B000C90412C08E800390042000000000000033
-:10A9C000C8052B608A09205008A023E900B8C022DE
-:10A9D000F008AC0228048AC222500890062C008B92
-:10A9E000042251089402E4048B0437C0081842265C
-:10A9F0000040000000000000C0044B0082C8244357
-:10AA00000B260A8800B08022E40B20426900A29045
-:10AA10002840E810020C00BB002850889082C40136
-:10AA2000830020C00A1002BA00500000000000009D
-:10AA300020104E80810021A8085802D601B79068E6
-:10AA4000200359825600A5842DA2186922020034E1
-:10AA50008029A8086806C614858225E00858821C4B
-:10AA6000004000000000000048084800C2F03440E8
-:10AA70000F20038880F81030C027210B4880EA207F
-:10AA800038000C00120C087300B8400C12234C0262
-:10AA9000433430C00E110392020000000000000099
-:10AAA0004015AC90F9012E884B90116400FB1032D8
-:10AAB00000009103A400C90032C44DB043E004C8B3
-:10AAC0000036890FA803ED00F9143EC00F1043D0E3
-:10AAD00006600000000000000805E800C8003A0019
-:10AAE0000C0053A000E80132010E80532010C80072
-:10AAF0003A400C90032010E804B6008480032D1225
-:10AB0000CB002ECA049003EA007000000000000091
-:10AB10004C198C00870221C00870020C00830021B0
-:10AB2000C00830624C048300218048E0123C00875A
-:10AB30000021C00870021C00850124D00A5002F2D6
-:10AB4000046000000000000020009A00808028209F
-:10AB5000084C22D200A48024300B4802520084C04A
-:10AB600021200948681300A48060200908025600CB
-:10AB700097802DE0885802E01020000000000000BF
-:10AB80006C04CC00838020D80830024C4083002421
-:10AB9000D109B9424E00830020C18930420C0083A4
-:10ABA000F0A0D9193622660691000CC10A1002C223
-:10ABB0000430000000000000E815E802CAA52A9150
-:10ABC00028A803EA02AA00B6A00FA00A2A92CA8304
-:10ABD000BA8029A0032B00EA4066902DE40B6A801E
-:10ABE000DA003E800CE003FA046000000000000080
-:10ABF00048018000FC003D000FC003B014FC003B86
-:10AC0000120EC043B114FC003D000EC003F020F44E
-:10AC10000031000E4413A000E80636004F8013D226
-:10AC200000300000000000000810A400D1003660D1
-:10AC30001C180B4600D98030402C98058600C18036
-:10AC400092400D10034402890032700C98012400D8
-:10AC5000C90430400C9003C2043000000000000022
-:10AC60008004640089002240089402248089012223
-:10AC7000404891022400D990224108901224108962
-:10AC800000324008951224028100A2410D9042E05A
-:10AC90000010000000000000380524029D0023443D
-:10ACA00008D2067480B52023401AD00635908D0254
-:10ACB0002F4419D00274008D00634018D402A411EF
-:10ACC0008900224008B002C60040000000000000D9
-:10ACD00028140480852021680852021480A520A130
-:10ACE000480A7238148095242D4828520214808511
-:10ACF00020214808520684808120204A091002C27F
-:10AD00000100000000000000380D6140D850B2146E
-:10AD100028A0036140F85032944E85042142C85067
-:10AD20003C140D800361408850B2142CC509A14029
-:10AD3000C850321C0C8003EE0350000000000000DD
-:10AD40009815E440F9103A440F9103E440D9143EB9
-:10AD5000440D91436440E91032440793C3E450D159
-:10AD6000107E440391015444FD143E400FD003E68D
-:10AD700006700000000000001805F680DDA03368B2
-:10AD80001EDA033690CDA03B680AD823760CED80FE
-:10AD90002B620B9902A780F9E137680CDA03278050
-:10ADA000C9A222684C5003C60070000000000000D9
-:10ADB0003818E1408850221408802260008804225C
-:10ADC0000008042601008850221008AF02230088E2
-:10ADD000C0A0108884022380A0402A100880124E50
-:10ADE0000430000000000000480084008101204081
-:10ADF0000A1402450081412C500B14020504A100E5
-:10AE000028408210028440A132805009140204C4F8
-:10AE100091106444281002D201700000000000006C
-:10AE20001804AC02810022C1089002440289022663
-:10AE30004109900A240C8904225008902624008994
-:10AE40000022410910222440B9012E4008900246F8
-:10AE50000460000000000000A015E41089003240EA
-:10AE60000A900B241089001E409B90022410290098
-:10AE70001A400E9441A4002900124005904126007A
-:10AE8000D90024400C9003E804700000000000008A
-:10AE90004801A402A900BC400F9003A404F9003AA1
-:10AEA000410E90838400F9003C400E9002C408E9F2
-:10AEB000003A402E900BE600E1043A400F92035A0C
-:10AEC00000600000000000000810A020D80036023A
-:10AED0000E00A3E018C00030030F803320004000B4
-:10AEE000320D0F040BA002C80232028C8203200232
-:10AEF000C80416004E80010A042000000000000073
-:10AF000028053B008ED8238008E002F8808E1023AD
-:10AF1000A20BE0827A208E3023A10BE00228008E63
-:10AF2000002B8808E44238008E04238008A0020A1F
-:10AF3000004000000000000028056F4093C6244038
-:10AF40000A3802CC008301ACF00BB4024C04A3809D
-:10AF500028D04B30024C00AB042AC02A300AAC1077
-:10AF6000930020C10A31020A0050000000000000D6
-:10AF700080111C0082002142887406DC0B86022DA1
-:10AF8000800B702A5800A600A9C00B70025C88A72D
-:10AF90002029C00A70029C109720A1C808D8022856
-:10AFA000004000000000000088080E00D7803760D5
-:10AFB0000E6813FE00CF803DE00F78231E00EF8265
-:10AFC00031E00F3CC37E04EF80B1E00EE803BE80A9
-:10AFD000D7E033EA0E78032A0200000000000000E8
-:10AFE0000815AC00FA013E000FB003E004F800328F
-:10AFF000800F8043AC0AD80036400FB0032C0CDB26
-:10B000000026C109A0136C40EB403ADC0F900BC244
-:10B0100006600000000000004004BE00CF8133E95C
-:10B020001FF913B650EF801FE404C8037E006D8142
-:10B0300033640CF81B3E202F8893E80FFB032E800F
-:10B04000CFC073E02CD903D00070000000000000D6
-:10B05000A8189042891821C01F710214C0F7202738
-:10B06000404071121800872021804871023C0887F7
-:10B070002021820B61A21E44DF0131C8087302EA5D
-:10B08000046000000000000010008C00870021C850
-:10B090000B70029C0987022D829940020400A509C9
-:10B0A00021401970021C00870525484B72020C4094
-:10B0B0008700A1C0485002C400200000000000002A
-:10B0C0006804C120894CA0B40A38022200A1D0240F
-:10B0D00030098002274481C62214093D2A0F028BC1
-:10B0E000C0A6200B24000C10938120C0483006D845
-:10B0F0000430000000000000B815A10089C132D161
-:10B1000003BC03A92089413E6085BC8B2540EB41EF
-:10B11000A2A00DF0133E20CF9036304FBC0B3C0068
-:10B12000CF8033C10CB103EA0460000000000000CE
-:10B130008000ED00F8013CD00FB303E882D8203640
-:10B14000802EB213E100FA007EC82EB003EC80DB43
-:10B15000103A084FB223CC02FB103AC00F9003E420
-:10B160000030000000000000A010F000CD103342BD
-:10B170000CCA237C00CF00336206F0013A00CF08EE
-:10B1800033801CF0813C00FF0033A00CCA01FC049A
-:10B19000CF003FC00FF003C00430000000000000EB
-:10B1A000A1046D408848A231081002201088B42202
-:10B1B000A00880006A848820225208B00A2C10BBA4
-:10B1C0000032B3888002EC00DB002EC00B9012E14D
-:10B1D0000010000000000000000500108A0122A0FD
-:10B1E00008B0426020800020441A801AE442A00681
-:10B1F0002200783002AC00BB00A24408B012EC0080
-:10B200008B000EC00B9002E0004000000000000028
-:10B21000081400088000208108300240128000A03D
-:10B220004008B002C000820000800830028C00BBE1
-:10B23000002000082002CC8093002CC00B3002C2FA
-:10B240000100000000000000000D6000CA14320080
-:10B250000CB0034C00CA0032000E0012A000C00067
-:10B26000700028F013AC00FB0032402C1043EC00BF
-:10B27000CF003FC00F9003C003500000000000004B
-:10B280002015F002FC001F00677003B000FC003FB7
-:10B29000002DC0033010FC01BF000F70037C00F7CD
-:10B2A000043B000FC013FD10FF003DC00FF003E88A
-:10B2B0001270000000000000C005F4C0CF803360B1
-:10B2C0000EC9133650CE863F080CC0033E02D7800D
-:10B2D00039E00FF8133E40C7303BCE0DF6033D88F2
-:10B2E000CF3133E40F78033000700000000000001D
-:10B2F0008010E5D0DB807260889202E4108A802E94
-:10B30000344A8C032E00AB8002E00BB8022C808FF5
-:10B310006013D84A76029D84AF3022480B8812A071
-:10B3200004300000000000008805C4008B002400E9
-:10B330004A0002AC8083002C01280402AC008B017F
-:10B3400020C003B0020C80834020C1A834228D139A
-:10B350008320ACC80BB00262017000000000000046
-:10B36000C01586009B04AE000A9002EC000B142E60
-:10B37000C602B1126C00AB202AC10BB0422C008B6C
-:10B380000226C10AB002AC00AB042A400B9002F0C6
-:10B3900004600000000000000011E700C301364017
-:10B3A0000E88132402CA001E202C8E0B2C00CB000A
-:10B3B0002AC00FB8032E06CB003AC04CB013AC0C19
-:10B3C000CB003EC80FB043500470000000000000E6
-:10B3D000E001B408FF91334009DC01F4207E022E25
-:10B3E000400D9801BC80EF80B7E48FF40BFE407FE6
-:10B3F00000B9C04EF003FC08F70037C00FE002B8F8
-:10B4000000600000000000004010A144CB023200A8
-:10B410000D800A6D00EB04109028220B2CC2CB206B
-:10B4200076C00EB103EC01CB0632C10C30032C0206
-:10B43000CB003ED00CB00310042000000000000040
-:10B44000C8052148AB0020000095234C08BB012211
-:10B45000C008B2020C08838892D5283402EC028F0F
-:10B460002023C04DF0017C00DF002EC00D300372A0
-:10B470000040000000000000E00544008310206050
-:10B480000925020008A0004C000B0C224F1293402B
-:10B4900000C0093E02EC00AB80A4C00930222C0899
-:10B4A000B3010C8108300238005000000000000099
-:10B4B00060011609B78021640878061200B4822D55
-:10B4C000A41B69067E04179225E6097806DE80A78C
-:10B4D0009025E00979505E04B7922F6109C80248AF
-:10B4E000004000000000000048082500C300B00331
-:10B4F0000DA3420940E100BC400F11034C001300B2
-:10B5000020C0093203CC10A30026C48D302B0C8040
-:10B51000F3007C800C3001120200000000000000EB
-:10B52000401DBC00E7103D012FF142E800F59003FB
-:10B53000C10CF1439C04EF083BC20CF081DCA0DF9E
-:10B54000003BC33FF083FC05DF0C3D400FD103D02F
-:10B550000660000000000000A805F400CB80304029
-:10B560002CA003E000F88032C02EB80B2C46D3008C
-:10B5700030C00C30030C00DB4832C01FB4032C88F1
-:10B58000CB4832800C30132A00700000000000000D
-:10B590004811B40087012140087042D008B4002946
-:10B5A000C00870021C00870021C80C720A1C848F1E
-:10B5B0004009C48F73129C40832021C0086002920E
-:10B5C0000460000000000000C0009601AF80212050
-:10B5D000086802DA00BD8021E00978021E008F8829
-:10B5E00083E229F8825F8087A025E00B3A120E5093
-:10B5F00097A421A02978023000200000000000005C
-:10B600000814CC02A1810000487002C800B1002CCF
-:10B61000F80931420C10830020E00838124E0083F4
-:10B62000006AC00B30028C04930020E009380292BB
-:10B630000430000000000000E815B940EE20308022
-:10B640000CA003E800FA0033B00DE4033288CC808C
-:10B6500023000DC0036202CA0036800FA0432806F3
-:10B66000DA0033A00D6A033A046000000000000015
-:10B670004800E0009801BE000F8003F000BC0038D5
-:10B68000040880A3E000F8003E000F8013A000E053
-:10B69000003E000E0003C000E800BE044E8007D24A
-:10B6A00000300000000000000810E480C9003E687F
-:10B6B0000C90036400C9003E400C9043E000C800B9
-:10B6C00032000C80132000C90036400C9003640047
-:10B6D000810032400490130204300000000000009A
-:10B6E0008004650689402E601A142A052089002EE0
-:10B6F00040089002C408C102204008101A240089A2
-:10B7000010324108901224008904364088940A209F
-:10B7100000100000000000001805042089552E408C
-:10B7200008D50234008D002E40189002E4009900E4
-:10B730002640089002040A8900264038900A240016
-:10B74000A90020400A90820600400000000000008E
-:10B750000804050081002F400AD402340085012C22
-:10B7600040081042E40699002240081002050081BA
-:10B770004028500814120500A14024505A1002021B
-:10B780000100000000000000B80D6000C8043E0089
-:10B790000880032142CC003E002C8002E000D8004B
-:10B7A000B6002C80022002C80036000C8003600224
-:10B7B000E80032008E80032E0350000000000000DD
-:10B7C000981DF500F5003E40879003E400F1003D30
-:10B7D000500F5403D100EC403F100BC443F100F96B
-:10B7E0004036500F9413E510D9443D402DD003E668
-:10B7F00006700000000000001805F660CD023B4016
-:10B800000CD003B440FD063E400C90036604C98290
-:10B81000B6620F180B3600CD4032610C9023240A1B
-:10B82000C90032404CD04306007000000000000008
-:10B830003910E380D80022000D80022294B8002E37
-:10B84000000D80032100884022000BC42221508873
-:10B85000802222088002201080012A000A80034EE4
-:10B8600004300000000000000005C60089002A40E6
-:10B8700088100A8408B10029400A700AB5008F4078
-:10B8800029C00BF4022400812028448910020404FA
-:10B8900081022A400810020201700000000000002E
-:10B8A0001815A600992022400990122480B9002F73
-:10B8B0004403D002F4008D002B410BD002261089E6
-:10B8C000042A4009906E240089002A400A94024606
-:10B8D0000460000000000000A215E600C900384224
-:10B8E0000C1013A60479083A78069203A408C9003C
-:10B8F0003A608F98230602C9023A400D9003040073
-:10B90000C90038400C9003280470000000000000BB
-:10B9100028018410F980BE404F9002E400F9003CF9
-:10B92000608D92032442E91032500F9403E400F931
-:10B9300000B6412E1003E400F9002E400F9003CA18
-:10B9400000600000000000002810A008C8003E10A1
-:10B950000F88032008F8C01E102C4003F200CC0012
-:10B960003F000CC0132002C00030000C802B2010C0
-:10B97000C00432000F80030A042000000000000011
-:10B98000A8053A8086E02FA01BE0023A80BA042E78
-:10B990008008A0038808C2002E8108600228108E4B
-:10B9A00081038008E00178008E040380096803CADF
-:10B9B000004000000000000028054C0083602C447B
-:10B9C0000B38020F80B1002CE5033010CC1083003F
-:10B9D0000CC02930220409911024C0C830004C0446
-:10B9E000930224C00B31020A005000000000000046
-:10B9F000E001188087002D400B74421C01B5012C1A
-:10BA0000C00B6002B00094042F2009C0021490976C
-:10BA10000025C80870024C80972025C0097002E8F4
-:10BA20000040000000000000A8083A82C6802D6097
-:10BA30000BF80B1A00F5803DE08F7803DE02C7801B
-:10BA40002DE00D780B1702DF8024F82CFD035E0C2F
-:10BA5000D7E035E00F68032A020000000000000074
-:10BA6000481DAE40FA043E400F8013EC04F9003E3E
-:10BA7000C10CA013C010E8003C004E8043C42089D4
-:10BA800000BAC007B621ED06EB68BACC0F2013C28E
-:10BA900006600000000000004005BE00C680316066
-:10BAA0002D780B3E48EC923D600C58035A40D580EF
-:10BAB00031610C58233600CF823FE00CF803FF6061
-:10BAC000CF9033F00C520300007000000000000023
-:10BAD000A811B8848614B5C00870021EC0C4002D19
-:10BAE0004008400214D0861021804C62423440A5A8
-:10BAF0000035C0287042DCC28F3023C00850022AB3
-:10BB00000460000000000000020098288E00A5409C
-:10BB100008F1021864B4006D42085002180185084B
-:10BB20002140095822540085102DC4097002DC04FC
-:10BB3000970025C00844020010200000000000000B
-:10BB400060148C00828024C00880022D00804A2C62
-:10BB500042080A420600928420A08828424400A39A
-:10BB60000624C00B3002CC10930424C10900020843
-:10BB70000430000000000000A815BC00CB003640D7
-:10BB80000CB4132C00F9003EA00CA2030408C280E0
-:10BB900030A80D2A035400CB003FC00DF003FC0871
-:10BBA000DF0037D00CB0032A046000000000000062
-:10BBB0008000E000FB103A400EB003ED90F9117EDA
-:10BBC000804FB053E840E9003E400F9003A608F9CB
-:10BBD000013AC00CB013CC00EB023AC68EB803E0B9
-:10BBE00000300000000000000110F00CCE003FE02B
-:10BBF0002CF0833A48CD0135800C6012340ACE0017
-:10BC0000B3802CE00B7400C910B3C10FF01B3C00D3
-:10BC1000CF00B7C02CE0030044300000000000005B
-:10BC200081046E1088802CC01898022D8081003607
-:10BC30009108B0036800C9002240089002240083E4
-:10BC40008036C00B30022C02830020C00820036025
-:10BC50004010000000000000800506008A802E458C
-:10BC6000288802240288020202088002A2009800AA
-:10BC700022000880122400890122C10AB0026C004F
-:10BC8000AB0022C1089012600040000000000000DC
-:10BC90000804000080002CC04808120080800224A4
-:10BCA00000081842AC028B8022E008B8120402831C
-:10BCB0000020C00B30420C00A30160C048100242BB
-:10BCC0000100000000000000000D6808CA002E40BE
-:10BCD0000880030000C80632000C8002A000D800D3
-:10BCE00032000C80037400CB0022C00FF0033C0034
-:10BCF000EF0037C00C80014003500000000000003E
-:10BD0000A019FC00FC043FC00FC003E100FC003B95
-:10BD1000000FD0037C00EF002FC00FF011F410FDD6
-:10BD2000023DC04FF003DC00DF043FC00FC043E919
-:10BD3000067000000000000000C541027020DC1009
-:10BD400067040DC10270209C1037040DC1067040BD
-:10BD50004C10371415C1037040DC1013040DC107DB
-:10BD60007040DC1037040DC03100000000000000FE
-:10BD700000C5440571215C40571015C40571055C70
-:10BD800040571015C40671014C4057100DC4057181
-:10BD9000055C40531015C40771015C40571015C075
-:10BDA00011500000000000000080020120804820A7
-:10BDB0001208048201208048201208048201208099
-:10BDC00048201208048201208048201208048201C1
-:10BDD000208048201208048020000000000000009D
-:10BDE000008400016000580056000580016004587E
-:10BDF0000016000580012001580016000580016032
-:10BE000000580056000580016000580016000180AF
-:10BE1000200000000000000000C5480572115C8091
-:10BE2000172015D80532111C804720148800720194
-:10BE30001C80572005C80472015C80572015C8017A
-:10BE400072015C80572415C01150000000000000F2
-:10BE500000C140006000180006000180402000186A
-:10BE6000000600019000600018000600418000609C
-:10BE70000018000600018000600018100600018014
-:10BE8000310000000000000000C5480422010880C5
-:10BE900002201088046201088042201088002001DE
-:10BEA00008804220008804220108004220108800F7
-:10BEB00022010880423010803100000000000000A4
-:10BEC00000C54A05428150A00428150A0552811078
-:10BED000A04428111A00408010A05428050A0542E9
-:10BEE0008151201428150A01428150A054281500C0
-:10BEF000315000000000000000800C01534054C08D
-:10BF00001530055C01574054C01530055C015300E5
-:10BF100055C01574054C01530055C01574054C01EE
-:10BF2000530054C0113001402110000000000000F7
-:10BF300000800000400010000400010000400010DC
-:10BF40000004000100004200100004001100004045
-:10BF50000010C104000100004000100001100101A8
-:10BF6000200000000000000000C560020800820000
-:10BF7000208008200208008200208008200208009B
-:10BF80008200208400200208008200208408200211
-:10BF9000080082002180080111500000000000000C
-:10BFA00000C54005600158009600159005640258D0
-:10BFB0000056005590056001D900164015800560B7
-:10BFC0000159007640158005600158005600158023
-:10BFD000310000000000000000C440036000D800F1
-:10BFE00036004D80036000D80036000D80076200E7
-:10BFF000580036000D80076000D88016000D8003C1
-:10C000006000D80036001D803100000000000000F4
-:10C0100000C5420430810C20430810C20430810C5A
-:10C0200020430810C20430C10C20430810C206305F
-:10C03000810C20430810C20430810C20430818C032
-:10C04000115000000000000000C0000030000C0093
-:10C05000030000C00030000C00030000C0403000AE
-:10C060000C00030000C00030000C00030000C00002
-:10C0700030000C00030000C00000000000000000C1
-:10C080000080020130804C20130804C20130804C33
-:10C0900020130804C22530814C20130804C201304B
-:10C0A000804C32530804C20130804C20130804C075
-:10C0B000204000000000000000C5420562815820B9
-:10C0C000560815820460815820460815820160C117
-:10C0D000582046081582016081583056081582059F
-:10C0E00060815820560805801150000000000000B3
-:10C0F00000C542002080082002080082002080083D
-:10C1000020020800820020800C200208008200200B
-:10C110008008200308008200208008200208008098
-:10C12000210000000000000000C5420466811820C4
-:10C13000460811820464811820460811820060813B
-:10C140000C204608118200608119204308118204E6
-:10C1500060811920464801801100000000000000A5
-:10C1600000C56005580156005580156004580156F9
-:10C170000045801160005800060045801560015898
-:10C1800001160001801560055801560055800540D4
-:10C19000115000000000000000800601498010607E
-:10C1A00014180506017980506014180106014180B9
-:10C1B000506004180506014180106014180506013E
-:10C1C00041805060141805002000000000000000AD
-:10C1D0000080020104804020100804020004044092
-:10C1E000201008040201008440201008040201000D
-:10C1F00080412010080402110080412010480400F2
-:10C20000000000000000000000C546035180D4601B
-:10C2100035180D46021180D46035180D4603118083
-:10C22000D46035180D46035180D46035180D46038F
-:10C230005180D46035180D403150000000000000DE
-:10C2400000C5460570815C60071815C60471811C25
-:10C2500060171815C6053181DC60571815C60571C1
-:10C26000801C60771815CE0571815C60571815C069
-:10C2700011000000000000000005460271809C6172
-:10C2800077180DC60271809C6037180DC20331808B
-:10C290005C6027180DC60371809C6017180DCE03D3
-:10C2A0007180DC6037180DC0110000000000000034
-:10C2B0000045460575815C60771815C60575815C7B
-:10C2C00060571815C60531810C60571815C60571E1
-:10C2D000815C60431815C60571815C60571815C0F4
-:10C2E00011500000000000000040020120804820A2
-:10C2F0001208048201208048201208048201208054
-:10C300005C20120804820120804800170804820182
-:10C310002080482012080480000000000000000077
-:10C320000000060163805860161805860161805878
-:10C33000601618058601618158601618058601612E
-:10C34000805860561805860161805860161805806F
-:10C3500000000000000000000045400570015C0086
-:10C36000170015C08574011C00470011C00570013D
-:10C370005C00530010C00570015C00570014C90434
-:10C3800070011C00570015C0115000000000000093
-:10C390000045420060C01820060801820060801835
-:10C3A00020060801820020801830020800821060F8
-:10C3B000801820060800820060801820060801808E
-:10C3C0001100000000000000004442042081082009
-:10C3D0000208108204208108204208108204208173
-:10C3E0000820460811820420810820420811820496
-:10C3F0002081082042081080110000000000000089
-:10C400000045420540C550201408150004408150E5
-:10C4100020540811020500801020450C11420440F0
-:10C42000815020140C15420440811020540815003E
-:10C4300011500000000000000040030150C04430D3
-:10C44000150C05430150C04C30150C05432150C05C
-:10C450005430150C05430150C05430150C054301F0
-:10C4600050C05420150C05400000000000000000E2
-:10C47000000008004200048004200108004200047B
-:10C48000800420010800020010000400010800429E
-:10C490000010800400010800420010800420010008
-:10C4A00000000000000000000045420200808420DF
-:10C4B0002008080202008084202008080202008070
-:10C4C00080A0202808020200808020202808020284
-:10C4D00000808020200808001150000000000000AB
-:10C4E0000045400560415800560015800560015820
-:10C4F0000056001580052001D80056001580056003
-:10C50000015800760015800560015800560015801E
-:10C51000110000000000000000C540036000D800CA
-:10C5200026000D80026000D80036000D80076001F3
-:10C530005C0036000D80036000D80057000D8002BB
-:10C540006000980036000D80000000000000000030
-:10C550000000000430210C00430010C00430010C26
-:10C5600000430010C00430011800430010C0043024
-:10C57000010C00460010C00430010C00430010C044
-:10C5800000000000000000000000000030000C006F
-:10C59000030000C00035080C00030000C6001400B2
-:10C5A0000800034000C00030000D40020000C00041
-:10C5B00030000C00030000C000000000000000007C
-:10C5C0000000050131404C50131404C50131C04C2A
-:10C5D00050131404C50531414C50131404C50131E6
-:10C5E000404C70531404C50131404C40131404C036
-:10C5F00000000000000000000000230568C15A3060
-:10C60000568C15A30569C15A30468C11A70168C024
-:10C610001A30568C11A30468C11A30168C15A30465
-:10C6200068C15A30568C11800000000000000000E4
-:10C630000000000020000800020000800024000824
-:10C6400001020000800024000880026000800020B9
-:10C650000009400220008000200008000200008045
-:10C66000000000000000000000000844621118846F
-:10C67000462111884462091884462111886062109D
-:10C68000180446011188446211188006011188447B
-:10C690006211188446211180000000000000000093
-:10C6A00000000045501154045501154044501154E8
-:10C6B00004450111404050105404450115404450B8
-:10C6C0001114001501154044501154045500114037
-:10C6D0000000000000000000000008214208508215
-:10C6E0001420850821420050821420850820420829
-:10C6F0005082152005482142085082142081402193
-:10C700004208508214208500000000000000000054
-:10C7100000000A01028040A01028040A010284409F
-:10C72000A11028040A01028040A00028000A01028A
-:10C730008040B01028000A01028040A010280400A8
-:10C74000000000000000000000000C035300D4C0F3
-:10C7500035300D4C035300D4C035300D4C0353001D
-:10C76000D4C02130084C035300D4C03530084C03EA
-:10C770005300D4C035300D40000000000000000020
-:10C780000000080470015C80072025C90472015C68
-:10C7900080472015C8007205DC80572015C8057237
-:10C7A000011C90672015C80572011C80572015C018
-:10C7B00000000000000000000000231848C21231F1
-:10C7C000848C61031840C81231848C61031848C4FA
-:10C7D0001031840C41231848C61030040C61231812
-:10C7E00048C61230848C21000000000000000000C8
-:10C7F00000003FFF4FFFD3FFF4FFFD3FFF4FFFD38C
-:10C80000FFF4FFFD3FFF4FFFD3FFF4FFFD3FFF4F5E
-:10C81000FFD3FFF4FFFD3FFF4FFFD3FFF4FFBD0049
-:10C820000000000000000000000000000000000008
-:10C8300000000000000000000000000000000000F8
-:10C8400000000000000000000000000000000000E8
-:10C8500000000000000000000000000000000000D8
-:10C8600000002CDB0B36C2CDB0B36C2CDB0936C21A
-:10C87000CDB0B36C2CDB0B36C2CDB0B36C2CDB0B64
-:10C8800036C2CDB0B36C2CDB0B36C2CDB0B32C00AE
-:10C8900000000000000000000000333C4CCF1333C8
-:10C8A000C4CCF1333C4D4E9333C4CCF12B3C4CCF34
-:10C8B0001333C4CCE9333C4CCF12B5C4CCF1333C78
-:10C8C0004CCF1333C4CD3100000000000000000045
-:10C8D00000003B7E4EC793B7E4EDF9237E4E4793AD
-:10C8E000B7E4EDF93F7E4EDE1237E48DF93B7E4E24
-:10C8F000DF93F7848DF93B7E4EDF93B1E4EDB90011
-:10C9000000000000000000000000010270409C11C7
-:10C91000670419C30270409C10270409C1027040CB
-:10C920001C10271401C10270409C50070409C10269
-:10C9300070409C10671411C000000000000000004F
-:10C940000000040571015C40571015C40571015CBD
-:10C9500040571015C60571015C40571010C4057191
-:10C96000015C64031055C40571015C40571015C08B
-:10C9700000000000000000000000020120804820AC
-:10C9800012080482012180482012080480012080BE
-:10C990004820120805C2012080482417080482019B
-:10C9A00020804820120804800000000000000000E1
-:10C9B00000000000600018004600118400600018AC
-:10C9C00000060001800060011800061091800060E0
-:10C9D000001846461801800060001800061001800B
-:10C9E00000000000000000000000080473011C802B
-:10C9F000072001C80472011C80472011C80472017D
-:10CA00001C80472211C80472011C80072011C80431
-:10CA100072011C80072811C0000000000000000007
-:10CA2000000000006000180006000180006000188F
-:10CA30000006000180006000180006000180006010
-:10CA40000018004604018000600018000600018004
-:10CA5000000000000000000000000D04220108801A
-:10CA600002200090042781088042201098042401AD
-:10CA7000088042481088042201094042601088045E
-:10CA8000220108C0024010800000000000000000E9
-:10CA900000002A044B8112A004A8012A044A811232
-:10CAA000A044A8112A04488012A04488012A044AFC
-:10CAB00081122004AC112A044A8112B0449C110056
-:10CAC000000000000000000008C00C00530014C06B
-:10CAD0000530014400530014C00530040C0053001D
-:10CAE00014C005B0014C00530016C00130014C00C9
-:10CAF000530014C001380040100000000000000086
-:10CB000008C0001040001000040001100044801014
-:10CB10000004000110004600000004600100004015
-:10CB200000116002400100104000106001501040F0
-:10CB3000300000000000000008C04002000080003B
-:10CB40002000080802000080002000080002000009
-:10CB500080002000080002000080000000080002A1
-:10CB600000008000210008403000000000000000AC
-:10CB700008C04004600118004600118004600118DC
-:10CB80000046001180046001C80046001980006062
-:10CB90000018006600118004600118000600118072
-:10CBA000300000000000000010010002600098004A
-:10CBB00026000981026001980026000980066200B3
-:10CBC0004800262001C00260019800070009800289
-:10CBD0006000980026001182100000000000000094
-:10CBE0004045420430810C20430810C20430858C3B
-:10CBF00020430810C20430810C20434811820430C5
-:10CC0000818D20460810C20430810C20430C10C0D6
-:10CC100011500000000000004004000030000C0033
-:10CC2000030000C00010000C00030000C000300032
-:10CC30000800030000800030000C80020000C000EB
-:10CC400030000C00032000C0104000000000000075
-:10CC50004000020030800C21030800C20030800C2C
-:10CC600020030800C20430C10C20030C10C20030A5
-:10CC7000800CB0430800C20030800C20032810C094
-:10CC800000000000000000004045420460811820C0
-:10CC900046081182046080182046081182006081D5
-:10CCA00018204608118204608018200608118204AA
-:10CCB00060811820460C11C01150000000000000D7
-:10CCC00040014200208008200208008200208008E5
-:10CCD00020020800820020800C20020800C20020F0
-:10CCE000800820420800820020800820020801807D
-:10CCF0000000000000000000500142046081182084
-:10CD0000460811820460801820460811820060C124
-:10CD10000C20460C10C204608018304208118204B6
-:10CD200060811820460810800040000000000000CC
-:10CD300040454004500114004500114004500014C7
-:10CD40000045001140005000040045000040045020
-:10CD5000001400010011400450011400450000427D
-:10CD600001500000000000004800060041801060F3
-:10CD7000041801060041801060041801060041807B
-:10CD800010600418010600418010600418010600BC
-:10CD90004180106004180100100000000000000035
-:10CDA0004800020100804021100804020100804078
-:10CDB0002010080402010080402110080402010034
-:10CDC0008040301008040211008440201008140034
-:10CDD0000000000000000000404546035180D46080
-:10CDE00035180D46035180D46035180D4603518027
-:10CDF000D46035100D46035180D44035180D4603DC
-:10CE00005180D46035180D40115000000000000022
-:10CE10000001460471811C60071811CE0471811C49
-:10CE200060471801C60471819C60471819C60471D7
-:10CE3000801C60671811C60471811C60471811C0FE
-:10CE400000000000000000004000460271809C606D
-:10CE5000271809C60671801C60271809C601318091
-:10CE60001C60071809C60271809C60071809C61269
-:10CE700071809C60331801C00000000000000000B9
-:10CE80005045460571815C60571815C60571805C78
-:10CE900060571815C60131810C60171810C605714E
-:10CEA000815C60031815C60571815C605318188297
-:10CEB0001050000000000000404012012480482073
-:10CEC0001208048201248048201208048201208074
-:10CED0005820520C0582012080492002080482015A
-:10CEE000208049201248048001000000000000005A
-:10CEF00040040600618018600618018604618018ED
-:10CF00006006180186006181486006181486006179
-:10CF10008018604218018600618018600618008041
-:10CF200001000000000000000045600478011E00C0
-:10CF3000478011E80078011E00478011E004780165
-:10CF40001E00438011E00478011E00038015E004F8
-:10CF500078011E00478011C0105000000000000042
-:10CF600040011200648018200608018200648018C5
-:10CF700020060801820060801830020801820060EB
-:10CF80008019304208008200608019200648018024
-:10CF90000000000000000000400142042081082041
-:10CFA000420810820020810820420810820420815B
-:10CFB00008204608108204208108204208118204BB
-:10CFC00020810820420810800000000000000000BE
-:10CFD0004045420440811020440811020040811065
-:10CFE000204408110204408010204508010204403A
-:10CFF000811021000C11020440811020440801001E
-:10D0000011500000000000004000030050C0143028
-:10D01000050C01430050C01430050C01430050C002
-:10D020001430050C01430050C01430050C014300BE
-:10D0300050C01430050C014000000000000000004A
-:10D040004000080042041080042001090042011041
-:10D050008004200108004200100004200108004262
-:10D06000001000040001080042001080042011009C
-:10D0700000000000000000004045420200808020C7
-:10D08000200808020200800020200808020000801A
-:10D0900080A0000A08020200808034622808020290
-:10D0A00000808030200C08001150000000000000BB
-:10D0B000400140046001180046001180046003181C
-:10D0C000004600118006600198004600118004604F
-:10D0D00001180066001180046001180046001180EC
-:10D0E0000000000000000000400100026000980005
-:10D0F0002600098002640098002600199002600052
-:10D100001D00260001C0026000990006401980023F
-:10D110006000980066000180000000000000000030
-:10D120004045600438010E00438010E00438010ED1
-:10D1300000438010E00438011A00438011A0043835
-:10D14000010E00028040E00438010E004380188088
-:10D1500011500000000000005004010030400C108D
-:10D16000030400C90030400C10030400C10030402B
-:10D170000810030400810030400C78021400C10044
-:10D1800030400C100304008000000000000000008C
-:10D190004000050031400C50031400C50035400C20
-:10D1A00050031410D50031410D50031410C5003147
-:10D1B000400D48435410C50031400C40431000C29C
-:10D1C00001000000000000004045430460C1183029
-:10D1D000460C11830461C11830460C01870460C1FC
-:10D1E0001830460811830460C11820060C0183041E
-:10D1F00060C11830460C1180105000000000000083
-:10D2000040014000200008000200008000200008CB
-:10D2100000020000810020000880020000C0002001
-:10D220000008404330008000200008000200008019
-:10D230000000000000000000400148446211188412
-:10D240004621118844630118844621018804621133
-:10D250001804462110C8446211180543018188440E
-:10D2600062111884462111800000000000000000B7
-:10D27000404540045001140445011140445001143C
-:10D28000044501014045001014044503004044508A
-:10D2900011140401054140445011140405010140DA
-:10D2A00011500000000000004000082042081082D9
-:10D2B00004208108004200108204208108004208F6
-:10D2C000108205208108204208108A0520050820C8
-:10D2D00042081082042281000000000000000000CB
-:10D2E00000000A01028040A01028040201028040D0
-:10D2F000A01028040A01028040A00029040A0102AB
-:10D300008040A40028040A01028040A8102B1400C9
-:10D31000004000000000000040454D035340D4D0C1
-:10D3200035340D4D035340D4D035340D4D035340A7
-:10D33000D4D021344D4D035340D4D96134040D036E
-:10D340005340C0D835370D40115000000000000098
-:10D350004001480472001C80472011C80472011C5F
-:10D3600080472011C80472009C80472019C80072B1
-:10D37000011C88672011C80472015C82472211C019
-:10D3800000000000000000000000230848C2123125
-:10D39000848C61231040C01231848C61031048C416
-:10D3A0001031848C41231848C61030040C412318D6
-:10D3B00048C61230848C010000000000000000000C
-:10D3C00000003FFF4FFFD3FFF4FFFD3FFF4FFFD3B0
-:10D3D000FFF4FFFD3FFF4FFFD3FFF4FFFD3FFF4F83
-:10D3E000FFD3FFF4FFDD3FFF4FFFD3FFF4FFFD004E
-:10D3F000000000000000000000000000000000002D
-:10D40000000000000000000000000000000000001C
-:10D41000000000000000000000000000000000000C
-:10D4200000000000000000000000000000000000FC
-:10D4300000002CDB0B36C2CDB0B36C2CDB0B36C23C
-:10D44000CDB0B36C2CDB0B36C2CDB0B36C2CDB0B88
-:10D4500036C2CDB0B34C2CDB0B36C2CDB0B36C00B2
-:10D4600000000000000000000000335C4CD71333C4
-:10D47000C4CCF1333A4AD69333C4CCF12B3A4CCFD7
-:10D480001333C4CCE9333C4CCF12B5A4ACC9333C04
-:10D490004CCF1335C4CD690000000000000000002F
-:10D4A00000003B7E4EDF93B7E4EDF93B7E4EDF9309
-:10D4B000B7E4EDF93B7E4EDE1237E4EDE13B7E4E04
-:10D4C000DF9231848DD93B7E4EDF93B1E4EC610075
-:10D4D00000000000000000000000008404A1832C74
-:10D4E000030A1082C134108F004009140203149102
-:10D4F0000008420B1882C40031CA0C520210808509
-:10D5000000218228400A10000000000000000000F6
-:10D5100000000A0402014080732810480706010435
-:10D52000A44121140844061140807020140A04020A
-:10D5300000C88441211C08061201C080602014002C
-:10D5400000000000000000000000028404218208A6
-:10D5500053021080C500814A0442021400042021B5
-:10D5600080A872221C88C406A1428C52221C888585
-:10D570002621C08850221800000000000000000092
-:10D5800000000244000101006200100004000101DB
-:10D590002040001C00440401022062001C8004049E
-:10D5A00080892050081480042401C1005000180014
-:10D5B0000000000000000000000002803820040C81
-:10D5C000310A00000218208CA810280888C1141005
-:10D5D000C600220308020108B0000C21020082806C
-:10D5E00008004908000200000000000000000000E0
-:10D5F00000000001008008200300040243200040D6
-:10D600000020000442011080842011080400000062
-:10D6100000442420090840030090C42020080C0284
-:10D6200000000000000000000800088108200488B5
-:10D6300002220808C32A90408410200480C22620B9
-:10D64000498822220C08C126A0C98C122A048843CA
-:10D650000EA0CB8810220C02000000000000000089
-:10D6600008000A4032000180312800000112808D3C
-:10D670008400280C080132008C8002200C08012E46
-:10D6800000C38002200408430200408010200402EE
-:10D690000000000000000000080008870A2104883C
-:10D6A000112A1C0A06222140A0422A1088850AA1BC
-:10D6B00006A462221C0AC40221808C5222144886CD
-:10D6C000222008A8602A14020000000000000000C8
-:10D6D000000008450601898063201C884034110140
-:10D6E000A450281848040E014B8073281C8A040695
-:10D6F00091490463201C8A06260185807020180247
-:10D7000000000000000000000800008500B1452C6A
-:10D71000700214C00708214900420114820500115B
-:10D72000840052021C00C40021C42C53021C02813C
-:10D7300004A1CD0850021402000000000000000007
-:10D74000081012043401CC0073401C9045040148B9
-:10D7500004604118C0440401050473481450473460
-:10D7600001452062081CC2040C81C700738018C2E6
-:10D770000400000000000000080010841021CC28E4
-:10D7800042021412C51021840440001C80840091C0
-:10D79000000873821C90050C01CF0C400214304528
-:10D7A00020A1C0085002100200000000000000008C
-:10D7B000000000450C8100000108080005189105D3
-:10D7C00004000104400618000224704004004000D8
-:10D7D00001C4240088040043100040200088000099
-:10D7E0000000000000000000000012852431020C3F
-:10D7F00002C20410C42821490C02C004B2061C2035
-:10D80000030850420C800104A1490C00C20C1043D3
-:10D8100024A0C10810420000000000000000000029
-:10D820000010A2002000CD000040042001100009DB
-:10D830000402490C92073000000033080C924100AA
-:10D8400080CC0000000C00432880C20010000000C3
-:10D850000420000000000000000030105080000094
-:10D86000100000F00010800000008000D0808000D8
-:10D8700000000080109080800000000080109080E8
-:10D880000000000000C01080000000000000000048
-:10D890003C3C10808000000000001090A080000040
-:10D8A000000040109080A000000000C0109080A0F8
-:10D8B00000000020801090A0A00000000080108FC9
-:10D8C0000F0000000000000000002CC2E481803F37
-:10D8D000D9BFD998719D428000267FE672AB7C3A11
-:10D8E000400019802648DD3C91C026402640383152
-:10D8F000DB61C01999BFC980000000000000000072
-:10D90000000010801014800684979686960690007A
-:10D910003FA1280102901200801788169E90900463
-:10D92000100036BEBE9E861612848013BE97AE804F
-:10D93000000000000000000000000000000008825D
-:10D940008184214000000008A13801780000000017
-:10D9500008B8217268800000000898448868800038
-:10D96000000008B80178014000000000000000003D
-:10D9700000003FFFFFFFC0000000003FF7AFFFC007
-:10D98000000000003FFFFFFFC0000000003FFFFF5E
-:10D99000FFC0000000003FFFBFFFC000000000000C
-:10D9A000000000000000000000003FFFFFFFC0007B
-:10D9B0000000003FFFFF7F40000000003FFFFFFF2F
-:10D9C000C0000000003FFFFFFFC0000000003FFF5D
-:10D9D0002FFFC00000000000000000000000000059
-:10D9E00000003FFFFFFFC0000000003FFFFF7FC0BF
-:10D9F000000000003FFFFFFFC0000000003FFFFFEE
-:10DA0000FFC0000000003FFFFF7F8000000000001B
-:10DA1000000000000000000000003FFFFFFFC0000A
-:10DA20000000003FFFBFBFC0000000003FDFBFDFBE
-:10DA3000C0000000003FEFFFFF80000000003FDF5C
-:10DA4000FFFFC00000000000000000000000000018
-:10DA500000003FFFFFFFC0000000003F3EAFFFC0DF
-:10DA6000000000001FFFDFFFC0000000003FE7FED6
-:10DA7000EFC0000000003FFFFFDFC000000000001B
-:10DA8000000000000000000000003FFFFFFFC0009A
-:10DA90000000003FFFFFFFC0000000002FF7FFFF66
-:10DAA000C0000000002FFFFFDFC0000000003FF7B4
-:10DAB000DFF7C000000000000000000000000000D0
-:10DAC000000002C400B1C32C50091482C43091C7B5
-:10DAD0002460081C820734914C04430A10C2840459
-:10DAE000918424520B1802C424B1C32C400A108024
-:10DAF0000000000000000000000008050201C480D2
-:10DB000060201C08442201C08450019C08070A01BF
-:10DB1000C08472201CC8041211448041011C80077B
-:10DB20000811C4007000100000C0000000000000D8
-:10DB3000000000862C214A0C52021C80042021CABD
-:10DB40001062021C81470421C32051011C80042C57
-:10DB500001CB0452031440C72031C80C502210805E
-:10DB600001200000000000000000000620018900E4
-:10DB700052001480042801450462001080463011D0
-:10DB80000D00420114C0440011050050001C004467
-:10DB90002801490070001080000000000000000013
-:10DBA000000008C002300C8C30220888C226000811
-:10DBB0008020220C88810210C48010220C084002B0
-:10DBC000104888012304C8420210468C122200002B
-:10DBD0000010000000000000080002000080C820C3
-:10DBE000110900804110900824300804424100903F
-:10DBF000C420000804420010804C20230904C243C2
-:10DC000030804020110800020000000000000000E9
-:10DC1000080008810220C98C122004484122000912
-:10DC20008830200C88030E00498C10220C88402E6E
-:10DC300000C984132104C8C32200CB8C3222000007
-:10DC400004000000000000000800080102004B80F2
-:10DC5000322108884102100F8010218C08410200F7
-:10DC6000878410200488000200478010210C88411E
-:10DC70001610468030200002000000000000000066
-:10DC800000000AC422A108A4722A140A8502818411
-:10DC9000A042281C0AC5029140B8732910CAC402C8
-:10DCA000A180A4422A14CA85229180A8702A180251
-:10DCB0000080000000000000080008041E01C88069
-:10DCC00043201808453E010C8061209C48061281C3
-:10DCD000C08073001088060201C800422010C807E7
-:10DCE0000211CD80512014820000000000000000CD
-:10DCF000080000C42421C80C420114000028104C64
-:10DD000008520214804524294004720010C00524E2
-:10DD1000114408430114C04724204808720210002F
-:10DD200000000000000000000810000710110600AD
-:10DD3000720018D04620014D00714010500730117C
-:10DD4000C300714110B0052C01490043001C50452F
-:10DD500030018C0061401842040000000000000007
-:10DD6000000030C50021C00C40011412440431846D
-:10DD700024408014A1C70001400840011420052060
-:10DD800011C002608218008724114008404210022E
-:10DD90000000000000000000000002000C80C4240D
-:10DDA00031480C000108C14100004900420308103D
-:10DDB000802021090C02021880C12430080C420185
-:10DDC0001080832011080000000000000000000007
-:10DDD000000010C10420480C1242040083003148A6
-:10DDE00000024104A0070C20400012C20C80C12098
-:10DDF00020C80012C10CB0412000490802420000B6
-:10DE000000000000000000000010800100108100F0
-:10DE100030400820030010C12002000480403090F0
-:10DE20000114024004804020000904320108A003CC
-:10DE30000410080022400000043000000000000030
-:10DE40000000300010800000004000F000000000E2
-:10DE500000108000F00080800000200000F010A082
-:10DE6000000000200000F00010000000208000CC26
-:10DE700040000000000000003C3C10A080000000BA
-:10DE80000000109080C040000000001090808000D2
-:10DE900000000000109080800000000000109080C2
-:10DEA000E00000000000108C0800000000000000EE
-:10DEB0000000094DB1E90026402A7FE3F25498C0E2
-:10DEC0003FE64000014291D0C013E5876383B8CD9F
-:10DED000F900267F0000352ED503403FD9BFB18021
-:10DEE00001F0000000000000000004021614001CF5
-:10DEF000A83F881600808480379EBAA05010021276
-:10DF0000001796972650101082801E80DEBE941453
-:10DF100002108017BE819400000000000000000085
-:10DF200000000000000008A84494288000000008B9
-:10DF30009421445100000000088442410100000087
-:10DF40000008A17223414000000008B80178324067
-:10DF5000000000000000000000003FFFFFFFC000C5
-:10DF60000000003FF7FED7C0000000003FFFD7DFF2
-:10DF7000C0000000003FFF7FFFC000000000377FAF
-:10DF8000FFFFC000000000000000000000000000D3
-:10DF900000003FFFFFFFC0000000001EFFDE77C053
-:10DFA000000000001FEFFFFFC0000000003FFFFF68
-:10DFB000FFC0000000003FFFFF7FC0000000000026
-:10DFC000000000000000000000003FFFFFFFC00055
-:10DFD0000000001FCFDFFFC0000000003FFFFFBFB9
-:10DFE000C0000000003FFFFFBFC0000000003FFF77
-:10DFF000FFBFC000000000000000000000000000A3
-:10E0000000003FFFFFFFC0000000003FFFFFFFC018
-:10E01000000000003FFFFFFFC0000000001FFF1FC7
-:10E020007FC0000000002FDFFFCFC0000000000015
-:10E03000000000000000000000003FFFFFFFC000E4
-:10E040000000003FBFAFFFC0000000003FFFFFFF28
-:10E05000C0000000003EDE7FFFC0000000003FFF68
-:10E06000FFF7C000000000000000000000000000FA
-:10E0700000003FFFFFFFC0000000003F7FFFFFC028
-:10E08000000000003FFFFFFFC0000000003FFEBE99
-:10E090007FC0000000003EFFD77FC00000000000EE
-:10E0A0000000000000000000000000000000000070
-:10E0B0000000000000000000000000000000000060
-:10E0C0000000000000000000000000000000000050
-:10E0D0000000000000000000000000000000000040
-:10E0E00030002001020000003000438E00000000DC
-:10E0F0000000000000000000000000000000000020
-:10E10000000000000000000000000000000000000F
-:10E1100000000000000000000000000000000000FF
-:10E1200000000000000000000000000000000000EF
-:10E1300000000000000000000000000000000000DF
-:10E1400000000000000000000000000000000000CF
-:10E1500000000000000000000000000000000000BF
-:10E1600000000000000000000000000000000000AF
-:10E17000000000000000000000000000000000009F
-:10E18000000000000000000000000000000000008F
-:10E19000000000000000000000000000000000007F
-:10E1A000000000000000000000000000000000006F
-:10E1B000000000000000000000000000000000005F
-:10E1C000000000000000000000000000000000004F
-:10E1D000000000000000000000000000000000003F
-:10E1E000000000000000000000000000000000002F
-:10E1F000000000000000000000000000000000001F
-:10E20000000000000000000000000000000000000E
-:10E2100000000000000000000000000000000000FE
-:10E2200000000000000000000000000000000000EE
-:10E2300000000000000000000000000000000000DE
-:10E2400000000000000000000000000000000000CE
-:10E2500000000000000000000000000000000000BE
-:10E2600000000000000000000000000000000000AE
-:10E27000000000000000000000000000000000009E
-:10E28000000000000000000000000000000000008E
-:10E29000000000000000000000000000000000007E
-:10E2A000000000000000000000000000000000006E
-:10E2B000000000000000000000000000000000005E
-:10E2C000000000000000000000000000000000004E
-:10E2D000000000000000000000000000000000003E
-:10E2E000000000000000000000000000000000002E
-:10E2F000000000000000000000000000000000001E
-:10E30000000000000000000000000000000000000D
-:10E3100000000000000000000000000000000000FD
-:10E3200000000000000000000000000000000000ED
-:10E3300000000000000000000000000000000000DD
-:10E3400000000000000000000000000000000000CD
-:10E3500000000000000000000000000000000000BD
-:10E3600000000000000000000000000000000000AD
-:10E37000000000000000000000000000000000009D
-:10E38000000000000000000000000000000000008D
-:10E39000000000000000000000000000000000007D
-:10E3A000000000000000000000000000000000006D
-:10E3B000000000000000000000000000000000005D
-:10E3C000000000000000000000000000000000004D
-:10E3D000000000000000000000000000000000003D
-:10E3E000000000000000000000000000000000002D
-:10E3F000000000000000000000000000000000001D
-:10E40000000000000000000000000000000000000C
-:10E4100000000000000000000000000000000000FC
-:10E4200000000000000000000000000000000000EC
-:10E4300000000000000000000000000000000000DC
-:10E4400000000000000000000000000000000000CC
-:10E4500000000000000000000000000000000000BC
-:10E4600000000000000000000000000000000000AC
-:10E47000000000000000000000000000000000009C
-:10E48000000000000000000000000000000000008C
-:10E49000000000000000000000000000000000007C
-:10E4A000000000000000000000000000000000006C
-:10E4B000000000000000000000000000000000005C
-:10E4C000000000000000000000000000000000004C
-:10E4D000000000000000000000000000000000003C
-:10E4E000000000000000000000000000000000002C
-:10E4F000000000000000000000000000000000001C
-:10E50000000000000000000000000000000000000B
-:10E5100000000000000000000000000000000000FB
-:10E5200000000000000000000000000000000000EB
-:10E5300000000000000000000000000000000000DB
-:10E5400000000000000000000000000000000000CB
-:10E5500000000000000000000000000000000000BB
-:10E5600000000000000000000000000000000000AB
-:10E57000000000000000000000000000000000009B
-:10E58000000000000000000000000000000000008B
-:10E59000000000000000000000000000000000007B
-:10E5A000000000000000000000000000000000006B
-:10E5B000000000000000000000000000000000005B
-:10E5C000000000000000000000000000000000004B
-:10E5D000000000000000000000000000000000003B
-:10E5E000000000000000000000000000000000002B
-:10E5F000000000000000000000000000000000001B
-:10E60000000000000000000000000000000000000A
-:10E6100000000000000000000000000000000000FA
-:10E6200000000000000000000000000000000000EA
-:10E6300000000000000000000000000000000000DA
-:10E6400000000000000000000000000000000000CA
-:10E6500000000000000000000000000000000000BA
-:10E6600000000000000000000000000000000000AA
-:10E67000000000000000000000000000000000009A
-:10E68000000000000000000000000000000000008A
-:10E69000000000000000000000000000000000007A
-:10E6A000000000000000000000000000000000006A
-:10E6B000000000000000000000000000000000005A
-:10E6C000000000000000000000000000000000004A
-:10E6D000000000000000000000000000000000003A
-:10E6E000000000000000000000000000000000002A
-:10E6F000000000000000000000000000000000001A
-:10E700000000000000000000000000000000000009
-:10E7100000000000000000000000000000000000F9
-:10E7200000000000000000000000000000000000E9
-:10E7300000000000000000000000000000000000D9
-:10E7400000000000000000000000000000000000C9
-:10E7500000000000000000000000000000000000B9
-:10E7600000000000000000000000000000000000A9
-:10E770000000000000000000000000000000000099
-:10E780000000000000000000000000000000000089
-:10E790000000000000000000000000000000000079
-:10E7A0000000000000000000000000000000000069
-:10E7B0000000000000000000000000000000000059
-:10E7C0000000000000000000000000000000000049
-:10E7D0000000000000000000000000000000000039
-:10E7E0000000000000000000000000000000000029
-:10E7F0000000000000000000000000000000000019
-:10E800000000000000000000000000000000000008
-:10E8100000000000000000000000000000000000F8
-:10E8200000000000000000000000000000000000E8
-:10E8300000000000000000000000000000000000D8
-:10E8400000000000000000000000000000000000C8
-:10E8500000000000000000000000000000000000B8
-:10E8600000000000000000000000000000000000A8
-:10E870000000000000000000000000000000000098
-:10E880000000000000000000000000000000000088
-:10E890000000000000000000000000000000000078
-:10E8A0000000000000000000000000000000000068
-:10E8B0000000000000000000000000000000000058
-:10E8C0000000000000000000000000000000000048
-:10E8D0000000000000000000000000000000000038
-:10E8E0000000000000000000000000000000000028
-:10E8F0000000000000000000000000000000000018
-:10E900000000000000000000000000000000000007
-:10E9100000000000000000000000000000000000F7
-:10E9200000000000000000000000000000000000E7
-:10E9300000000000000000000000000000000000D7
-:10E9400000000000000000000000000000000000C7
-:10E9500000000000000000000000000000000000B7
-:10E9600000000000000000000000000000000000A7
-:10E970000000000000000000000000000000000097
-:10E980000000000000000000000000000000000087
-:10E990000000000000000000000000000000000077
-:10E9A0000000000000000000000000000000000067
-:10E9B0000000000000000000000000000000000057
-:10E9C0000000000000000000000000000000000047
-:10E9D0000000000000000000000000000000000037
-:10E9E0000000000000000000000000000000000027
-:10E9F0000000000000000000000000000000000017
-:10EA00000000000000000000000000000000000006
-:10EA100000000000000000000000000000000000F6
-:10EA200000000000000000000000000000000000E6
-:10EA300000000000000000000000000000000000D6
-:10EA400000000000000000000000000000000000C6
-:10EA500000000000000000000000000000000000B6
-:10EA600000000000000000000000000000000000A6
-:10EA70000000000000000000000000000000000096
-:10EA80000000000000000000000000000000000086
-:10EA90000000000000000000000000000000000076
-:10EAA0000000000000000000000000000000000066
-:10EAB0000000000000000000000000000000000056
-:10EAC0000000000000000000000000000000000046
-:10EAD0000000000000000000000000000000000036
-:10EAE0000000000000000000000000000000000026
-:10EAF0000000000000000000000000000000000016
-:10EB00000000000000000000000000000000000005
-:10EB100000000000000000000000000000000000F5
-:10EB200000000000000000000000000000000000E5
-:10EB300000000000000000000000000000000000D5
-:10EB400000000000000000000000000000000000C5
-:10EB500000000000000000000000000000000000B5
-:10EB600000000000000000000000000000000000A5
-:10EB70000000000000000000000000000000000095
-:10EB80000000000000000000000000000000000085
-:10EB90000000000000000000000000000000000075
-:10EBA0000000000000000000000000000000000065
-:10EBB0000000000000000000000000000000000055
-:10EBC0000000000000000000000000000000000045
-:10EBD0000000000000000000000000000000000035
-:10EBE0000000000000000000000000000000000025
-:10EBF0000000000000000000000000000000000015
-:10EC00000000000000000000000000000000000004
-:10EC100000000000000000000000000000000000F4
-:10EC200000000000000000000000000000000000E4
-:10EC300000000000000000000000000000000000D4
-:10EC400000000000000000000000000000000000C4
-:10EC500000000000000000000000000000000000B4
-:10EC600000000000000000000000000000000000A4
-:10EC70000000000000000000000000000000000094
-:10EC80000000000000000000000000000000000084
-:10EC90000000000000000000000000000000000074
-:10ECA0000000000000000000000000000000000064
-:10ECB0000000000000000000000000000000000054
-:10ECC0000000000000000000000000000000000044
-:10ECD0000000000000000000000000000000000034
-:10ECE0000000000000000000000000000000000024
-:10ECF0000000000000000000000000000000000014
-:10ED00000000000000000000000000000000000003
-:10ED100000000000000000000000000000000000F3
-:10ED200000000000000000000000000000000000E3
-:10ED300000000000000000000000000000000000D3
-:10ED400000000000000000000000000000000000C3
-:10ED500000000000000000000000000000000000B3
-:10ED600000000000000000000000000000000000A3
-:10ED70000000000000000000000000000000000093
-:10ED80000000000000000000000000000000000083
-:10ED90000000000000000000000000000000000073
-:10EDA0000000000000000000000000000000000063
-:10EDB0000000000000000000000000000000000053
-:10EDC0000000000000000000000000000000000043
-:10EDD0000000000000000000000000000000000033
-:10EDE0000000000000000000000000000000000023
-:10EDF0000000000000000000000000000000000013
-:10EE00000000000000000000000000000000000002
-:10EE100000000000000000000000000000000000F2
-:10EE200000000000000000000000000000000000E2
-:10EE300000000000000000000000000000000000D2
-:10EE400000000000000000000000000000000000C2
-:10EE500000000000000000000000000000000000B2
-:10EE600000000000000000000000000000000000A2
-:10EE70000000000000000000000000000000000092
-:10EE80000000000000000000000000000000000082
-:10EE90000000000000000000000000000000000072
-:10EEA0000000000000000000000000000000000062
-:10EEB0000000000000000000000000000000000052
-:10EEC0000000000000000000000000000000000042
-:10EED0000000000000000000000000000000000032
-:10EEE0000000000000000000000000000000000022
-:10EEF0000000000000000000000000000000000012
-:10EF00000000000000000000000000000000000001
-:10EF100000000000000000000000000000000000F1
-:10EF20000000000030002001020200003000438099
-:10EF300000000000000000000000000000000000D1
-:10EF400000000000000000000000000000000000C1
-:10EF500000000000000000000000000000000000B1
-:10EF600000000000000000000000000000000000A1
-:10EF70000000000000000000000000000000000091
-:10EF80000000000000000000000000000000000081
-:10EF90000000000000000000000000000000000071
-:10EFA0000000000000000000000000000000000061
-:10EFB0000000000000000000000000000000000051
-:10EFC0000000000000000000000000000000000041
-:10EFD0000000000000000000000000000000000031
-:10EFE0000000000000000000000000000000000021
-:10EFF0000000000000000000000000000000000011
-:10F000000000000000000000000000000000000000
-:10F0100000000000000000000000000000000000F0
-:10F0200000000000000000000000000000000000E0
-:10F0300000000000000000000000000000000000D0
-:10F0400000000000000000000000000000000000C0
-:10F0500000000000000000000000000000000000B0
-:10F0600000000000000000000000000000000000A0
-:10F070000000000000000000000000000000000090
-:10F080000000000000000000000000000000000080
-:10F090000000000000000000000000000000000070
-:10F0A0000000000000000000000000000000000060
-:10F0B0000000000000000000000000000000000050
-:10F0C0000000000000000000000000000000000040
-:10F0D0000000000000000000000000000000000030
-:10F0E0000000000000000000000000000000000020
-:10F0F0000000000000000000000000000000000010
-:10F1000000000000000000000000000000000000FF
-:10F1100000000000000000000000000000000000EF
-:10F1200000000000000000000000000000000000DF
-:10F1300000000000000000000000000000000000CF
-:10F1400000000000000000000000000000000000BF
-:10F1500000000000000000000000000000000000AF
-:10F16000000000000000000000000000000000009F
-:10F17000000000000000000000000000000000008F
-:10F18000000000000000000000000000000000007F
-:10F19000000000000000000000000000000000006F
-:10F1A000000000000000000000000000000000005F
-:10F1B000000000000000000000000000000000004F
-:10F1C000000000000000000000000000000000003F
-:10F1D000000000000000000000000000000000002F
-:10F1E000000000000000000000000000000000001F
-:10F1F000000000000000000000000000000000000F
-:10F2000000000000000000000000000000000000FE
-:10F2100000000000000000000000000000000000EE
-:10F2200000000000000000000000000000000000DE
-:10F2300000000000000000000000000000000000CE
-:10F2400000000000000000000000000000000000BE
-:10F2500000000000000000000000000000000000AE
-:10F26000000000000000000000000000000000009E
-:10F27000000000000000000000000000000000008E
-:10F28000000000000000000000000000000000007E
-:10F29000000000000000000000000000000000006E
-:10F2A000000000000000000000000000000000005E
-:10F2B000000000000000000000000000000000004E
-:10F2C000000000000000000000000000000000003E
-:10F2D000000000000000000000000000000000002E
-:10F2E000000000000000000000000000000000001E
-:10F2F000000000000000000000000000000000000E
-:10F3000000000000000000000000000000000000FD
-:10F3100000000000000000000000000000000000ED
-:10F3200000000000000000000000000000000000DD
-:10F3300000000000000000000000000000000000CD
-:10F3400000000000000000000000000000000000BD
-:10F3500000000000000000000000000000000000AD
-:10F36000000000000000000000000000000000009D
-:10F37000000000000000000000000000000000008D
-:10F38000000000000000000000000000000000007D
-:10F39000000000000000000000000000000000006D
-:10F3A000000000000000000000000000000000005D
-:10F3B000000000000000000000000000000000004D
-:10F3C000000000000000000000000000000000003D
-:10F3D000000000000000000000000000000000002D
-:10F3E000000000000000000000000000000000001D
-:10F3F000000000000000000000000000000000000D
-:10F4000000000000000000000000000000000000FC
-:10F4100000000000000000000000000000000000EC
-:10F4200000000000000000000000000000000000DC
-:10F4300000000000000000000000000000000000CC
-:10F4400000000000000000000000000000000000BC
-:10F4500000000000000000000000000000000000AC
-:10F46000000000000000000000000000000000009C
-:10F47000000000000000000000000000000000008C
-:10F48000000000000000000000000000000000007C
-:10F49000000000000000000000000000000000006C
-:10F4A000000000000000000000000000000000005C
-:10F4B000000000000000000000000000000000004C
-:10F4C000000000000000000000000000000000003C
-:10F4D000000000000000000000000000000000002C
-:10F4E000000000000000000000000000000000001C
-:10F4F000000000000000000000000000000000000C
-:10F5000000000000000000000000000000000000FB
-:10F5100000000000000000000000000000000000EB
-:10F5200000000000000000000000000000000000DB
-:10F5300000000000000000000000000000000000CB
-:10F5400000000000000000000000000000000000BB
-:10F5500000000000000000000000000000000000AB
-:10F56000000000000000000000000000000000009B
-:10F57000000000000000000000000000000000008B
-:10F58000000000000000000000000000000000007B
-:10F59000000000000000000000000000000000006B
-:10F5A000000000000000000000000000000000005B
-:10F5B000000000000000000000000000000000004B
-:10F5C000000000000000000000000000000000003B
-:10F5D000000000000000000000000000000000002B
-:10F5E000000000000000000000000000000000001B
-:10F5F000000000000000000000000000000000000B
-:10F6000000000000000000000000000000000000FA
-:10F6100000000000000000000000000000000000EA
-:10F6200000000000000000000000000000000000DA
-:10F6300000000000000000000000000000000000CA
-:10F6400000000000000000000000000000000000BA
-:10F6500000000000000000000000000000000000AA
-:10F66000000000000000000000000000000000009A
-:10F67000000000000000000000000000000000008A
-:10F68000000000000000000000000000000000007A
-:10F69000000000000000000000000000000000006A
-:10F6A000000000000000000000000000000000005A
-:10F6B000000000000000000000000000000000004A
-:10F6C000000000000000000000000000000000003A
-:10F6D000000000000000000000000000000000002A
-:10F6E000000000000000000000000000000000001A
-:10F6F000000000000000000000000000000000000A
-:10F7000000000000000000000000000000000000F9
-:10F7100000000000000000000000000000000000E9
-:10F7200000000000000000000000000000000000D9
-:10F7300000000000000000000000000000000000C9
-:10F7400000000000000000000000000000000000B9
-:10F7500000000000000000000000000000000000A9
-:10F760000000000000000000000000000000000099
-:10F770000000000000000000000000000000000089
-:10F780000000000000000000000000000000000079
-:10F790000000000000000000000000000000000069
-:10F7A0000000000000000000000000000000000059
-:10F7B0000000000000000000000000000000000049
-:10F7C0000000000000000000000000000000000039
-:10F7D0000000000000000000000000000000000029
-:10F7E0000000000000000000000000000000000019
-:10F7F0000000000000000000000000000000000009
-:10F8000000000000000000000000000000000000F8
-:10F8100000000000000000000000000000000000E8
-:10F8200000000000000000000000000000000000D8
-:10F8300000000000000000000000000000000000C8
-:10F8400000000000000000000000000000000000B8
-:10F8500000000000000000000000000000000000A8
-:10F860000000000000000000000000000000000098
-:10F870000000000000000000000000000000000088
-:10F880000000000000000000000000000000000078
-:10F890000000000000000000000000000000000068
-:10F8A0000000000000000000000000000000000058
-:10F8B0000000000000000000000000000000000048
-:10F8C0000000000000000000000000000000000038
-:10F8D0000000000000000000000000000000000028
-:10F8E0000000000000000000000000000000000018
-:10F8F0000000000000000000000000000000000008
-:10F9000000000000000000000000000000000000F7
-:10F9100000000000000000000000000000000000E7
-:10F9200000000000000000000000000000000000D7
-:10F9300000000000000000000000000000000000C7
-:10F9400000000000000000000000000000000000B7
-:10F9500000000000000000000000000000000000A7
-:10F960000000000000000000000000000000000097
-:10F970000000000000000000000000000000000087
-:10F980000000000000000000000000000000000077
-:10F990000000000000000000000000000000000067
-:10F9A0000000000000000000000000000000000057
-:10F9B0000000000000000000000000000000000047
-:10F9C0000000000000000000000000000000000037
-:10F9D0000000000000000000000000000000000027
-:10F9E0000000000000000000000000000000000017
-:10F9F0000000000000000000000000000000000007
-:10FA000000000000000000000000000000000000F6
-:10FA100000000000000000000000000000000000E6
-:10FA200000000000000000000000000000000000D6
-:10FA300000000000000000000000000000000000C6
-:10FA400000000000000000000000000000000000B6
-:10FA500000000000000000000000000000000000A6
-:10FA60000000000000000000000000000000000096
-:10FA70000000000000000000000000000000000086
-:10FA80000000000000000000000000000000000076
-:10FA90000000000000000000000000000000000066
-:10FAA0000000000000000000000000000000000056
-:10FAB0000000000000000000000000000000000046
-:10FAC0000000000000000000000000000000000036
-:10FAD0000000000000000000000000000000000026
-:10FAE0000000000000000000000000000000000016
-:10FAF0000000000000000000000000000000000006
-:10FB000000000000000000000000000000000000F5
-:10FB100000000000000000000000000000000000E5
-:10FB200000000000000000000000000000000000D5
-:10FB300000000000000000000000000000000000C5
-:10FB400000000000000000000000000000000000B5
-:10FB500000000000000000000000000000000000A5
-:10FB60000000000000000000000000000000000095
-:10FB70000000000000000000000000000000000085
-:10FB80000000000000000000000000000000000075
-:10FB90000000000000000000000000000000000065
-:10FBA0000000000000000000000000000000000055
-:10FBB0000000000000000000000000000000000045
-:10FBC0000000000000000000000000000000000035
-:10FBD0000000000000000000000000000000000025
-:10FBE0000000000000000000000000000000000015
-:10FBF0000000000000000000000000000000000005
-:10FC000000000000000000000000000000000000F4
-:10FC100000000000000000000000000000000000E4
-:10FC200000000000000000000000000000000000D4
-:10FC300000000000000000000000000000000000C4
-:10FC400000000000000000000000000000000000B4
-:10FC500000000000000000000000000000000000A4
-:10FC60000000000000000000000000000000000094
-:10FC70000000000000000000000000000000000084
-:10FC80000000000000000000000000000000000074
-:10FC90000000000000000000000000000000000064
-:10FCA0000000000000000000000000000000000054
-:10FCB0000000000000000000000000000000000044
-:10FCC0000000000000000000000000000000000034
-:10FCD0000000000000000000000000000000000024
-:10FCE0000000000000000000000000000000000014
-:10FCF0000000000000000000000000000000000004
-:10FD000000000000000000000000000000000000F3
-:10FD100000000000000000000000000000000000E3
-:10FD200000000000000000000000000000000000D3
-:10FD30003000000100005FA73000800100000003D8
-:10FD40003000400E00000000000000000000000035
-:10FD500000000000000000000000000000000000A3
-:10FD60000000000000000000000000000000000093
-:10FD700000000000000000000000000030008001D2
-:10FD8000000000053000A00100000000300000016C
-:10FD900000006B9700000000000000000000000061
-:04FDA000000000005F
-:00000001FF
-// VERSION= 1.0.0.191
-// DATE= 2002oct28
diff --git a/firmware/emi62/loader.HEX b/firmware/emi62/loader.HEX
deleted file mode 100644
index 0edb2dc310eb..000000000000
--- a/firmware/emi62/loader.HEX
+++ /dev/null
@@ -1,107 +0,0 @@
-:0300000002028772
-:03004300020400B4
-:10010000E4FFFEC220D2E843D820907FAB74FFF01A
-:10011000907FA9F0907FAAF05391EF907F9574C0E3
-:10012000F0907F9EF0907F98F0E4907F94F0907F25
-:100130009D74FFF0907F9774A0F0907F93E054FC43
-:10014000F0907F9C7403F0E4907F96F0907FAFE096
-:100150004401F0907FAEE0440DF0D2AF0FBF00013C
-:100160000EBE07F8BF08F520204275140075130075
-:100170007512007511007F487E927D007C00AB14E3
-:10018000AA13A912A811C31203ED50DB2020D87ABC
-:100190000079007800E5142401F514EA3513F5130D
-:1001A000E93512F512E83511F51180CA3020FD123B
-:1001B00001C75007907FB4E04401F0907FB4E04461
-:0601C00002F0C22080E6FF
-:0101C6002216
-:1001C700907FE9E0245B606024026003020285906F
-:1001D7007FEAE0750A00F50BA3E0FEE4EE420A9021
-:1001E7007FEEE0751500F516A3E0FEE4EE4215E597
-:1001F7001645157003020285E4907FC5F0907FB421
-:10020700E020E3F9907FC5E0F50C120313AF0C7EF5
-:1002170000EF250BF50BEE350AF50AC3E5169FF53A
-:1002270016E5159EF51580C7907FEAE0750A00F57B
-:100237000BA3E0FEE4EE420A907FEEE0751500F5B1
-:1002470016A3E0FEE4EE4215E51645156030E4908E
-:100257007FC5F0907FB4E020E3F9907FC5E0F50C0F
-:1002670012032BAF0C7E00EF250BF50BEE350AF5CD
-:0F0277000AC3E5169FF516E5159EF51580CAC357
-:010286002255
-:0C028700787FE4F6D8FD7581290202CED4
-:10029300020100E493A3F8E493A34003F68001F280
-:1002A30008DFF48029E493A3F85407240CC8C3336C
-:1002B300C4540F4420C8834004F456800146F6DF3B
-:1002C300E4800B010204081020408090046EE47E59
-:1002D300019360BCA3FF543F30E509541FFEE49330
-:1002E300A360010ECF54C025E060A840B8E493A3F7
-:1002F300FAE493A3F8E493A3C8C582C8CAC583CA22
-:10030300F0A3C8C582C8CAC583CADFE9DEE780BED9
-:10031300E50CFFE50BF582E50AF58375927E74C063
-:08032300F8E208F0A3DFFA2262
-:10032B00907F96858392A8827902900000E0B400BA
-:10033B000D7401F0907F97E0547FF04480F0E50C52
-:10034B00FF907EC0E0F528E4A24733F269F2E4A205
-:10035B004633F269F2E4A24533F269F2E4A2443384
-:10036B00F269F2E4A24333F269F2E4A24233F26996
-:10037B00F2E4A24133F269F2E4A24033F269F2A350
-:03038B00DFC222AC
-:10038E00C0E0C083C082907FC4E4F05391EF907FB1
-:0B039E00AB7404F0D082D083D0E032BA
-:1003A900C0E0C083C082D2205391EF907FAB74012B
-:0803B900F0D082D083D0E032C5
-:1003C100C0E0C083C0825391EF907FAB7402F0D044
-:0603D10082D083D0E0326F
-:1003D700C0E0C083C0825391EF907FAB7410F0D020
-:0603E70082D083D0E03259
-:1003ED00EB9FF5F0EA9E42F0E99D42F0E89C45F066
-:0103FD0022DD
-:0103FE0032CC
-:0103FF0032CB
-:100400000203A9000203C10002038E000204580087
-:100410000203D7000203FE000203FF00020484006F
-:10042000020485000204860002048700020488009A
-:100430000204890002048A0002048B0002048C007A
-:1004400002048D0002048E0002048F00020490005A
-:08045000020491000204920075
-:10045800C0E0C083C0825391EF907FAB7408F0D0A6
-:0604680082D083D0E032D7
-:10046E00020A000F010C11040D00000000410000F3
-:01047E00007D
-:04047F000217000060
-:010483000078
-:010484003245
-:010485003244
-:010486003243
-:010487003242
-:010488003241
-:010489003240
-:01048A00323F
-:01048B00323E
-:01048C00323D
-:01048D00323C
-:01048E00323B
-:01048F00323A
-:010490003239
-:010491003238
-:010492003237
-:1011000012011001000000406A0801010001010203
-:10111000000109022000010103A0000904000002EF
-:10112000FF0000040705820240000007050202409C
-:10113000000004030904260341006E0063006800F8
-:101140006F007200200043006800690070007300A7
-:101150002C00200049006E0063002E00280346008A
-:10116000690072006D007700610072006500200068
-:101170004600720061006D00650057006F0072004C
-:101180006B0073002A0343006F006E006600690065
-:101190006700750072006100740069006F006E00E6
-:1011A000200053007400720069006E006700220383
-:1011B00049006E0074006500720066006100630003
-:1011C0006500200053007400720069006E00670023
-:0211D00000001D
-:00000001FF
-/*
-Source: EMILOAD.HEX
-VERSION=1.0.2.002
-DATE=10.01.2002
-EMI26_62
-*/
diff --git a/firmware/emi62/midi.HEX b/firmware/emi62/midi.HEX
deleted file mode 100644
index 32a0d65176ba..000000000000
--- a/firmware/emi62/midi.HEX
+++ /dev/null
@@ -1,1266 +0,0 @@
-:030000000246B9FC
-:03000300020FFDEC
-:03000B00024E0F93
-:030013000217FDD4
-:03001B00024E1280
-:03002300024DEF9C
-:03002B0002480088
-:03003300024DE695
-:03003B00024DF67D
-:030043000249006F
-:03004B00024E035F
-:030053000248FA66
-:03005B00024DFD56
-:03006300024E0743
-:1005000012011001000000406A08110100010102FF
-:100510000001090208020501008032090400000000
-:10052000010100000A2401000156000201020C240E
-:10053000020101010002000000000D240605010275
-:10054000030000000000000924030204030005006A
-:100550000C24020305020006000000001524060614
-:100560000302000003000300030003000300030074
-:100570000009240304010100060009040100000130
-:100580000200000904010102010200000724010128
-:10059000000100112402010202100344AC0080BBE0
-:1005A0000000770109050A05840101008F07250174
-:1005B0000100000009058F01030001050009040185
-:1005C00002020102000007240101000100112402BF
-:1005D000010203180344AC0080BB00007701090549
-:1005E0000A05460201008F072501010000000905E8
-:1005F0008F01030001050009040200000102000050
-:1006000009040201010102000007240104000100A5
-:100610000E2402010602100244AC0080BB00090552
-:100620008C054C02010000072501000200000904AE
-:1006300002020101020000072401040001000E244F
-:1006400002010603180244AC0080BB0009058C05BA
-:1006500072030100000725010002000009040203E3
-:10066000010102000007240104000100112402011D
-:100670000202100344AC0080BB0000770109058C26
-:1006800005840101000007250100020000090402A1
-:1006900004010102000007240104000100112402EA
-:1006A000010203180344AC0080BB00007701090578
-:1006B0008C05460201000007250100020000090424
-:1006C00003000001010000092401000109000104E8
-:1006D00009040400020103000007240100012400B2
-:1006E000062402010700092403020801070100068D
-:1006F0002402020900092403010A01090100090575
-:10070000010204000000000525010107090581021E
-:100710000400000000052501010A04030904180370
-:1007200045006D006100670069006300200047001C
-:100730006D0062004800220345006D006100670003
-:1007400069006300200045004D004900200036008C
-:100750007C00320020006D002A0343006F006E0011
-:10076000660069006700750072006100740069002E
-:100770006F006E00200053007400720069006E006C
-:100780006700220349006E00740065007200660075
-:10079000610063006500200053007400720069006E
-:0607A0006E00670000007E
-:1007A600E4907666F01244AD202613907666E0C398
-:1007B6009402500AE004F0D242124B7F80EA3026BF
-:1007C60005122801C22630252B907696E054FCF0BF
-:1007D600908003F0121496907696E04403F0908091
-:1007E60003F0E4907667F0907667E004F0E0B44BAF
-:0A07F600F61247FA12411B80C522DB
-:10080000E4907631F0907631E0FF75F003A4240F88
-:10081000F582E43475F583E0FE907FEDE0FDEE6D4A
-:10082000600EEFC3940B5008907631E004F080D551
-:10083000EFB40B08907FB4E04401F022EF75F003B1
-:10084000A4240EF582E43475F583E0907633F02429
-:10085000F0600A240E60028187124BC722907FED60
-:10086000E0640570519076187405F0907637740145
-:10087000F09076397403F0907621F0E4907620F0D1
-:10088000907FEAE0F4602F907620E0FF75F00AA4F4
-:1008900024AAF582E43475F583E0FE907FEAE0FD5A
-:1008A000EE6D6012907621E0FEEFC39E50089076C8
-:1008B00020E004F080D1907FEDE0640670529076E5
-:1008C000187406F09076377404F0907639740AF054
-:1008D000907621F09076207403F0907FEAE0F46047
-:1008E0002F907620E0FF75F00AA424AAF582E43464
-:1008F00075F583E0FE907FEAE0FDEE6D6012907684
-:1009000021E0FEEFC39E5008907620E004F080D1F5
-:10091000907620E0FF75F00AA424AAF582E43475ED
-:10092000F583E0907229F0E490763BF0907621E038
-:10093000FEEF6E7008907FB4E04401F022907FEBF0
-:10094000E014601314700221E224026002817F909F
-:100950007FB4E04401F022907FE9E014707C907F46
-:10096000EAE0F47048907637E0907620F09076399F
-:10097000E0FE907620E0FDC39E502B90763BE0FE9B
-:1009800004F074C02EF582E4347EF583E0FEED754C
-:10099000F00AA424ABF582E43475F583EEF090768A
-:1009A00020E004F080C790763F7401F022907EC072
-:1009B000E0FEEF75F00AA424ABF582E43475F5830C
-:1009C000EEF0E0B4010890763E7401F08005E4900A
-:1009D000763EF090763F7401F022907FB4E04401BF
-:1009E000F022907FE9E024FE700241A314700261BE
-:1009F0003F14700261DB240360028177907FEAE09C
-:100A0000F4706B907637E0907620F0907639E0FFC6
-:100A1000907620E0FEC39F504E90763BE0FF04F0BE
-:100A200074C02FF582E4347EF583E0FFEE75F00AA2
-:100A3000A424ACF582E43475F583EFF090763BE0C6
-:100A4000FF04F074C02FF582E4347EF583E0FFEEFE
-:100A500075F00AA424ADF582E43475F583EFF090C7
-:100A60007620E004F080A49076407401F022907E1D
-:100A7000C0E0FF907620E0FE75F00AA424ACF58279
-:100A8000E43475F583EFF0907EC1E0FFEE75F00A77
-:100A9000A424ADF582E43475F583EFF090764174CB
-:100AA00001F022907FEAE0F47066907637E090766D
-:100AB00020F0907639E0FF907620E0FEC39F400260
-:100AC000818E90763BE0FF04F074C02FF582E43411
-:100AD0007EF583E0FFEE75F00AA424AEF582E434DF
-:100AE00075F583EFF090763BE0FF04F074C02FF5CE
-:100AF00082E4347EF583E0FFEE75F00AA424AFF5BE
-:100B000082E43475F583EFF0907620E004F080A263
-:100B1000907EC0E0FF907620E0FE75F00AA424AE3F
-:100B2000F582E43475F583EFF0907EC1E0FFEE7559
-:100B3000F00AA424AFF582E43475F583EFF0229037
-:100B40007FEAE0F47066907637E0907620F0907659
-:100B500039E0FF907620E0FEC39F4002818E9076C0
-:100B60003BE0FF04F074C02FF582E4347EF583E0AF
-:100B7000FFEE75F00AA424B0F582E43475F583EF36
-:100B8000F090763BE0FF04F074C02FF582E4347EF1
-:100B9000F583E0FFEE75F00AA424B1F582E4347524
-:100BA000F583EFF0907620E004F080A2907EC0E024
-:100BB000FF907620E0FE75F00AA424B0F582E434BC
-:100BC00075F583EFF0907EC1E0FFEE75F00AA42486
-:100BD000B1F582E43475F583EFF022907FEAE0F41A
-:100BE0007066907637E0907620F0907639E0FF904E
-:100BF0007620E0FEC39F4002818E90763BE0FF04AA
-:100C0000F074C02FF582E4347EF583E0FFEE75F0DA
-:100C10000AA424B2F582E43475F583EFF090763BB4
-:100C2000E0FF04F074C02FF582E4347EF583E0FF2A
-:100C3000EE75F00AA424B3F582E43475F583EFF081
-:100C4000907620E004F080A2907EC0E0FF907620B5
-:100C5000E0FE75F00AA424B2F582E43475F583EF62
-:100C6000F0907EC1E0FFEE75F00AA424B3F582E4B3
-:100C70003475F583EFF022907FB4E04401F02290C8
-:0F0C80007FB4E04401F022907FB4E04401F02201
-:100C8F004176680141766A0241766B0AC120C12123
-:020C9F00C12F63
-:040CA1004176230075
-:100CA500417201014572050002C9000045720A0042
-:100CB500010203044D720FD100D1000000000000B5
-:100CC500282809004D721C010001020304050607CE
-:100CD50008090A0B41722E2241722F2341723020DE
-:100CE5004172312162D2723A00000000000000001A
-:100CF50000000000000000000000000000000000EF
-:100D050000000000000000000000000000000000DE
-:100D150000000000000000000000000000000000CE
-:100D250000000000000000000000000000000000BE
-:100D350000000000000000000000000000000000AE
-:100D4500000000000000000000000000000000009E
-:100D5500000000000000000000000000000000008E
-:100D6500000000000000000000000000000000007E
-:100D75000000000000000000000001010101010168
-:100D8500010101010101010101010101010101014E
-:100D9500010101010101010101010101010101013E
-:100DA500010101010101010101010101010101012E
-:100DB5000101010101010101020202020202020216
-:100DC50002020202020202020202020202020202FE
-:100DD50002020202020202020202020202020202EE
-:100DE50002020202020202020202020202020202DE
-:100DF50002020202020303030303030303030303C3
-:100E050003030303030303030303030303030303AD
-:100E1500030303030303030303030303030303039D
-:100E2500030303030303030303030303030303038D
-:100E3500030304040404040404040404040404046F
-:100E4500040404040404040404040404040404045D
-:100E5500040404040404040404040404040404044D
-:100E6500040404040404040404040404040404043D
-:100E7500050505050505050505050505050505051D
-:100E8500050505050505050505050505050505050D
-:100E950005050505050505050505050505050505FD
-:100EA50005050505050505050505050505050606EB
-:100EB50006060606060606060606060606060606CD
-:100EC50006060606060606060606060606060606BD
-:100ED50006060606060606060606060606060606AD
-:100EE5000606060606060606060606070707080896
-:100EF500080909090A0A0A0B0B0B0C0C0C0D0D0D40
-:100F05000E0E0E0F0F0F10101011111112121213D9
-:100F15001313141414151515161616171717181874
-:100F250018191919191A1A1A1A1B1B1B1B1C1C1C18
-:100F35001C1D1D1D1D1E1E1E1E1F1F1F1F202020C8
-:100F45002121212222222323242425252626272761
-:100F5500282829292A2A2B2B2C2C2D2D2E2E2F2FD4
-:100F65003030313132323333343435353636373744
-:100F7500383839393A3A3B3C3D3E3F40414243449B
-:100F85004546474849494A4B4B4C4D4E4F505152A7
-:100F95005354555556565757585A5B5D5E5F6162B7
-:100FA500636465666768696A6B6C6D6F717273748B
-:100FB50075767778797A7B7C7E80013701013800F8
-:010FC500002B
-:100FC600E4FF74462FF582E43476F583E0FE742060
-:100FD6002FF582E43480F583EEF0744E2FF582E42B
-:100FE6003476F583E0FE74302FF582E43480F583A1
-:060FF600EEF00FBF08CC75
-:010FFC0022D2
-:030FFD00C2893274
-:10100000E490762CF090762CE0FF75F003A4240F8A
-:10101000F582E43475F583E0FE907FEDE0FDEE6D42
-:10102000600EEFC3940B500890762CE004F080D54E
-:10103000EFB40B08907FB4E04401F022EF75F003A9
-:10104000A4240EF582E43475F583E090762EF02426
-:10105000F0600A240F6002817D124BA422907FED84
-:10106000E0640570519076187405F090763874013C
-:10107000F090763A7403F090761CF0E490761BF0D2
-:10108000907FEAE0F4602F90761BE0FF75F00AA4F1
-:1010900024AAF582E43475F583E0FE907FEAE0FD52
-:1010A000EE6D601290761CE0FEEFC39E50089076C5
-:1010B0001BE004F080D1907FEDE0640670529076E2
-:1010C000187406F09076387404F090763A740AF04A
-:1010D00090761CF090761B7403F0907FEAE0F46049
-:1010E0002F90761BE0FF75F00AA424AAF582E43461
-:1010F00075F583E0FE907FEAE0FDEE6D601290767C
-:101100001CE0FEEFC39E500890761BE004F080D1F7
-:10111000E490761EF090761CE0FF90761BE0FE6F68
-:101120007008907FB4E04401F022907FEBE01460FF
-:101130001314700221BF240260028175907FB4E015
-:101140004401F022907FE9E0247F706B907FEAE019
-:10115000F4704A907638E090761BF090763AE0FF93
-:1011600090761BE0FDC39F502BED75F00AA424ABD5
-:10117000F582E43475F583E0FF90761EE0FD04F01F
-:1011800074002DF582E4347FF583EFF090761BE058
-:1011900004F080C790761EE0907FB5F022EE75F0E7
-:1011A0000AA424ABF582E43475F583E0907F00F067
-:1011B000907FB57401F022907FB4E04401F022905A
-:1011C0007FE9E0247E7002417E1470026123147076
-:1011D0000261C824036002816D907FEAE0F4706DC3
-:1011E000907638E090761BF090763AE0FF90761B90
-:1011F000E0C39F504FE0FF75F00AA424ACF582E4F1
-:101200003475F583E0FE90761EE0FD04F074002D49
-:10121000F582E4347FF583EEF0EF75F00AA424AD97
-:10122000F582E43475F583E0FF90761EE0FE04F06D
-:1012300074002EF582E4347FF583EFF090761BE0A6
-:1012400004F080A490761EE0907FB5F02290761B8B
-:10125000E0FF75F00AA424ACF582E43475F583E070
-:10126000907F00F0EF75F00AA424ADF582E43475A8
-:10127000F583E0907F01F0907FB57402F022907FBB
-:10128000EAE0F4706D907638E090761BF090763A54
-:10129000E0FF90761BE0C39F504FE0FF75F00AA47B
-:1012A00024AEF582E43475F583E0FE90761EE0FD11
-:1012B00004F074002DF582E4347FF583EEF0EF75D1
-:1012C000F00AA424AFF582E43475F583E0FF90764C
-:1012D0001EE0FE04F074002EF582E4347FF583EF07
-:1012E000F090761BE004F080A490761EE0907FB52D
-:1012F000F02290761BE0FF75F00AA424AEF582E49C
-:101300003475F583E0907F00F0EF75F00AA424AF08
-:10131000F582E43475F583E0907F01F0907FB57439
-:1013200002F022907FEAE0F4706D907638E09076DB
-:101330001BF090763AE0FF90761BE0C39F504FE0A1
-:10134000FF75F00AA424B0F582E43475F583E0FE5D
-:1013500090761EE0FD04F074002DF582E4347FF5F4
-:1013600083EEF0EF75F00AA424B1F582E43475F54C
-:1013700083E0FF90761EE0FE04F074002EF582E418
-:10138000347FF583EFF090761BE004F080A4907634
-:101390001EE0907FB5F02290761BE0FF75F00AA466
-:1013A00024B0F582E43475F583E0907F00F0EF75AA
-:1013B000F00AA424B1F582E43475F583E0907F014E
-:1013C000F0907FB57402F022907FEAE0F4706D90A7
-:1013D0007638E090761BF090763AE0FF90761BE04E
-:1013E000C39F504FE0FF75F00AA424B2F582E434A5
-:1013F00075F583E0FE90761EE0FD04F074002DF597
-:1014000082E4347FF583EEF0EF75F00AA424B3F59F
-:1014100082E43475F583E0FF90761EE0FE04F074FC
-:10142000002EF582E4347FF583EFF090761BE00424
-:10143000F080A490761EE0907FB5F02290761BE0BD
-:10144000FF75F00AA424B2F582E43475F583E090C8
-:101450007F00F0EF75F00AA424B3F582E43475F54B
-:1014600083E0907F01F0907FB57402F022907FB40A
-:10147000E04401F022907FB4E04401F022907FB478
-:05148000E04401F02230
-:101485007400F58690FDA57C05A3E582458370F97A
-:011495002234
-:10149600907FD6E04480F0438701000000000022E0
-:1014A600C0D0C0E08FE0C0E08EE0C0E08DE0C0E0DC
-:1014B6008CE0C0E0C082C0830586C084C0857D0004
-:1014C600907FE3747BF0A37480F07C11907F99E0A9
-:1014D6005440DC030214F3B40013907FE27440F02E
-:1014E600907FE5F0907FE27400F00214D29076903F
-:1014F600E0B4011290768FE02DFD907FE27480F0CB
-:10150600907F6C021557B4021290768FE02DFD90F5
-:101516007FE27480F0907F6C021596B40312907689
-:101526008FE02DFD907FE27480F0907F6C0215E1D4
-:10153600B4041290768FE02DFD907FE27480F090D7
-:101546007F6C021610907FE27480F0907F6C02161A
-:1015560040F0F0F0F0F0F0F0F0F0F0F0F0DDF27DB9
-:10156600020586907FE27400F0907F9BE05404B4FD
-:1015760000050586021640907FE27480F00586F02D
-:10158600F0F0F0F0F0F0F0F0F0F0F0DDD4021640FC
-:10159600F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F045
-:1015A600F0F0DDEC7D020586907FE27400F0907F1E
-:1015B6009BE05404B400050586021640907FE27451
-:1015C60080F00586F0F0F0F0F0F0F0F0F0F0F0F0DA
-:0615D600F0F0F0F0F0F06F
-:1015DC00DDCE021640F0F0F0F0DDFA7D02058690CB
-:1015EC007FE27400F0907F9BE05404B40005058604
-:1015FC00021640907FE27480F00586F0F0F0F0DD8A
-:10160C00DC021640F0F0F0F0F0F0DDF87D0205861B
-:10161C00907FE27400F0907F9BE05404B4000505C9
-:10162C0086021640907FE27480F00586F0F0F0F0B0
-:10163C00F0F0DDDA907FE27400F0D085D08405867E
-:10164C00D083D082D0E0FCD0E0FDD0E0FED0E0FF33
-:05165C00D0E0D0D02217
-:10166100C0D0C0E0C082C08390767CE0907F6FF0F4
-:1016710090767DE0907F6FF090767EE0907F6FF0C6
-:09168100D083D082D0E0D0D02249
-:10168A00C0D0C0E08FE0C0E08EE0C0E0C082C0837E
-:10169A000586C084C085907687E0FFBF00030217E5
-:1016AA0001907F96E04480F0907FE27480F0907F12
-:1016BA0062E00586907FE27400F0907F96E0547FA6
-:1016CA00F0907FE27480F090768EE0B40105058692
-:1016DA000216F6B4020505860216EB05860216FB0B
-:1016EA00E0E0E0E0E0E0DFF80216FBE0E0E0E0DF67
-:1016FA00FA907FE27400F0D085D0840586D083D03A
-:0C170A0082D0E0FED0E0FFD0E0D0D02282
-:10171600C082C083C0E0E8C0E078D1E814F870FB6E
-:0A172600D0E0F8D0E0D083D082229A
-:10173000C082C083C0E0E8C0E07878E814F870FBAD
-:0A174000D0E0F8D0E0D083D0822280
-:07174A00907FC57402F0223C
-:10175100907EC0E0907645F0907EC1E0907644F0B6
-:10176100907EC2E0907643F0B40003021778907641
-:10177100197403F002178E907644E0B4BB09907699
-:10178100197402F002178E9076197401F090764266
-:03179100E4F0225F
-:041794008D298B2AE6
-:10179800124A55EA4960571236927E0029FFEE3AFE
-:1017A800C9EFC9752BFFF52C892DAB2BAA2CA92DB8
-:1017B8009000011236ABFF64046005EF6405702EDB
-:1017C800EFB404159000021236AB6529700B900037
-:1017D800031236AB652A7001221236927E0029FF69
-:1017E800EE3AC9EFC9752BFFF52C892D80BC7B001B
-:0417F8007A007900FA
-:0117FC0022CA
-:0317FD00C28B326A
-:10180000907690E014603714700201D814700221B1
-:1018100072147002413B240460026103907FFC74E7
-:10182000CCF0907FFF74FCF0907695E04401F0548A
-:1018300005F0908001F0E490761AF0C22E229076A6
-:1018400095E04401F04402F0303E06E04404F080AC
-:1018500007907695E054FBF090761AE0B40108907A
-:101860007695E0908001F0907619E0FFB401229027
-:101870007FFC7474F0907FFF74FCF090768F742B73
-:10188000F0907697E054FDF0E4907681F0907680C9
-:10189000F0EFB40222907FFC7468F0907FFF74FC3C
-:1018A000F090768F742FF0907697E04402F0E490F9
-:1018B0007681F0907680F0303F09907697E054FE84
-:1018C000F08007907697E04401F0907697E054FB23
-:1018D000F0908002F0D22E22907695E054FEF044F3
-:1018E00002F0303E06E04404F08007907695E05424
-:1018F000FBF090761AE0B40108907695E0908001B4
-:10190000F0907619E0FFB40122907FFC7430F090E3
-:101910007FFF74FCF090768F742BF0907697E054F4
-:10192000FDF0E4907681F0907680F0EFB4022290A2
-:101930007FFC741CF0907FFF74FCF090768F742F06
-:10194000F0907697E04402F0E4907681F090768013
-:10195000F0303F09907697E054FEF080079076973C
-:10196000E04401F0907697E054FBF0908002F0D2D2
-:101970002E22907695E04401F04402F04408F030C5
-:101980003E06E04404F08007907695E054FBF0902A
-:10199000761AE0B40108907695E0908001F0907698
-:1019A00019E0FFB40125907FFC74CCF0907FFF74A8
-:1019B000FCF090768F742BF0907697E054FDF05405
-:1019C000FBF0E4907681F0907680F0EFB402259001
-:1019D0007FFC74C8F0907FFF74FCF090768F742FBA
-:1019E000F0907697E04402F054FBF0E4907681F0BA
-:1019F000907680F0EFB40325907FFC7498F0907F90
-:101A0000FF74FCF090768F745FF0907697E054FD51
-:101A1000F04404F0E4907681F0907680F0303F0955
-:101A2000907697E054FEF08007907697E04401F0BE
-:101A3000907697E0908002F0D22E22907695E05436
-:101A4000FEF04402F04408F0303E06E04404F0802A
-:101A500007907695E054FBF090761AE0B401089078
-:101A60007695E0908001F0907619E0FFB401259022
-:101A70007FFC74B4F0907FFF74FCF090768F742B31
-:101A8000F0907697E054FDF054FBF0E4907681F00E
-:101A9000907680F0EFB40225907FFC74B0F0907FD8
-:101AA000FF74FCF090768F742FF0907697E04402EC
-:101AB000F054FBF0E4907681F0907680F0EFB40380
-:101AC00025907FFC7468F0907FFF74FCF090768F17
-:101AD000745FF0907697E054FDF04404F0E4907663
-:101AE00081F0907680F0303F09907697E054FEF0D8
-:101AF0008007907697E04401F0907697E09080021E
-:041B0000F0D22E22CF
-:101B0400302C38C22C907619E0FFB4010E90767C0C
-:101B140074C0F0A37414F0A3740BF0EFB4020DE4DA
-:101B240090767CF0A37410F0A3740CF0EFB4030B64
-:0C1B3400E490767CF0A37418F0A3F0227B
-:101B40000000000000000000000000000000000095
-:101B50000000000000000000000000000000000085
-:101B60000000000000000000000000000000000075
-:101B70000000000000000000000000000000000065
-:101B80000000000000000000000000000000000055
-:101B90000000000000000000000000000000000045
-:101BA0000000000000000000000000000000000035
-:101BB0000000000000000000000000000000000025
-:101BC0000000000000000000000000000000000015
-:101BD0000000000000000000000000000000000005
-:101BE00000000000000000000000000000000000F5
-:101BF00000000000000000000000000000000000E5
-:101C000000000000000000000000000000000000D4
-:101C100000000000000000000000000000000000C4
-:101C200000000000000000000000000000000000B4
-:101C300000000000000000000000000000000000A4
-:101C40000000000000000000000000000000000094
-:101C50000000000000000000000000000000000084
-:101C60000000000000000000000000000000000074
-:101C70000000000000000000000000000000000064
-:101C80000000000000000000000000000000000054
-:101C90000000000000000000000000000000000044
-:101CA0000000000000000000000000000000000034
-:101CB0000000000000000000000000000000000024
-:101CC0000000000000000000000000000000000014
-:101CD0000000000000000000000000000000000004
-:101CE00000000000000000000000000000000000F4
-:101CF00000000000000000000000000000000000E4
-:101D000000000000000000000000000000000000D3
-:101D100000000000000000000000000000000000C3
-:101D200000000000000000000000000000000000B3
-:101D300000000000000000000000000000000000A3
-:101D40000000000000000000000000000000000093
-:101D50000000000000000000000000000000000083
-:101D60000000000000000000000000000000000073
-:101D70000000000000000000000000000000000063
-:101D80000000000000000000000000000000000053
-:101D90000000000000000000000000000000000043
-:101DA0000000000000000000000000000000000033
-:101DB0000000000000000000000000000000000023
-:101DC0000000000000000000000000000000000013
-:101DD0000000000000000000000000000000000003
-:101DE00000000000000000000000000000000000F3
-:101DF00000000000000000000000000000000000E3
-:101E000000000000000000000000000000000000D2
-:101E100000000000000000000000000000000000C2
-:101E200000000000000000000000000000000000B2
-:101E300000000000000000000000000000000000A2
-:101E40000000000000000000000000000000000092
-:101E50000000000000000000000000000000000082
-:101E60000000000000000000000000000000000072
-:101E70000000000000000000000000000000000062
-:101E80000000000000000000000000000000000052
-:101E90000000000000000000000000000000000042
-:101EA0000000000000000000000000000000000032
-:0E1EB000000000000000000000000000000024
-:101EBE000000000000000000000000000000000014
-:101ECE000000000000000000000000000000000004
-:101EDE0000000000000000000000000000000000F4
-:101EEE0000000000000000000000000000000000E4
-:101EFE0000000000000000000000000000000000D4
-:101F0E0000000000000000000000000000000000C3
-:101F1E0000000000000000000000000000000000B3
-:101F2E0000000000000000000000000000000000A3
-:021F3E000000A1
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F70000000000000000000000000000000000061
-:101F80000000000000000000000000000000000051
-:101F90000000000000000000000000000000000041
-:101FA0000000000000000000000000000000000031
-:101FB0000000000000000000000000000000000021
-:101FC0000000000000000000000000000000000011
-:101FD0000000000000000000000000000000000001
-:101FE00000000000000000000000000000000000F1
-:101FF00000000000000000000000000000000000E1
-:1020000000000000000000000000000000000000D0
-:1020100000000000000000000000000000000000C0
-:1020200000000000000000000000000000000000B0
-:1020300000000000000000000000000000000000A0
-:102040000000000000000000000000000000000090
-:102050000000000000000000000000000000000080
-:102060000000000000000000000000000000000070
-:102070000000000000000000000000000000000060
-:102080000000000000000000000000000000000050
-:102090000000000000000000000000000000000040
-:1020A0000000000000000000000000000000000030
-:1020B0000000000000000000000000000000000020
-:1020C0000000000000000000000000000000000010
-:1020D0000000000000000000000000000000000000
-:1020E00000000000000000000000000000000000F0
-:1020F00000000000000000000000000000000000E0
-:1021000000000000000000000000000000000000CF
-:1021100000000000000000000000000000000000BF
-:1021200000000000000000000000000000000000AF
-:10213000000000000000000000000000000000009F
-:10214000000000000000000000000000000000008F
-:10215000000000000000000000000000000000007F
-:10216000000000000000000000000000000000006F
-:10217000000000000000000000000000000000005F
-:10218000000000000000000000000000000000004F
-:10219000000000000000000000000000000000003F
-:1021A000000000000000000000000000000000002F
-:1021B000000000000000000000000000000000001F
-:1021C000000000000000000000000000000000000F
-:1021D00000000000000000000000000000000000FF
-:1021E00000000000000000000000000000000000EF
-:1021F00000000000000000000000000000000000DF
-:1022000000000000000000000000000000000000CE
-:1022100000000000000000000000000000000000BE
-:1022200000000000000000000000000000000000AE
-:10223000000000000000000000000000000000009E
-:10224000000000000000000000000000000000008E
-:10225000000000000000000000000000000000007E
-:10226000000000000000000000000000000000006E
-:10227000000000000000000000000000000000005E
-:10228000000000000000000000000000000000004E
-:10229000000000000000000000000000000000003E
-:1022A000000000000000000000000000000000002E
-:1022B000000000000000000000000000000000001E
-:1022C000000000000000000000000000000000000E
-:1022D00000000000000000000000000000000000FE
-:1022E00000000000000000000000000000000000EE
-:1022F00000000000000000000000000000000000DE
-:1023000000000000000000000000000000000000CD
-:1023100000000000000000000000000000000000BD
-:1023200000000000000000000000000000000000AD
-:10233000000000000000000000000000000000009D
-:10234000000000000000000000000000000000008D
-:10235000000000000000000000000000000000007D
-:10236000000000000000000000000000000000006D
-:0E23700000000000000000000000000000005F
-:10237E00000000000000000000000000000000004F
-:10238E00000000000000000000000000000000003F
-:10239E00000000000000000000000000000000002F
-:1023AE00000000000000000000000000000000001F
-:1023BE00000000000000000000000000000000000F
-:1023CE0000000000000000000000000000000000FF
-:1023DE0000000000000000000000000000000000EF
-:1023EE0000000000000000000000000000000000DF
-:1023FE0000000000000000000000000000000000CF
-:10240E0000000000000000000000000000000000BE
-:10241E0000000000000000000000000000000000AE
-:10242E00000000000000000000000000000000009E
-:10243E00000000000000000000000000000000008E
-:10244E00000000000000000000000000000000007E
-:10245E00000000000000000000000000000000006E
-:10246E00000000000000000000000000000000005E
-:10247E00000000000000000000000000000000004E
-:10248E00000000000000000000000000000000003E
-:10249E00000000000000000000000000000000002E
-:1024AE00000000000000000000000000000000001E
-:1024BE00000000000000000000000000000000000E
-:1024CE0000000000000000000000000000000000FE
-:1024DE0000000000000000000000000000000000EE
-:1024EE0000000000000000000000000000000000DE
-:1024FE0000000000000000000000000000000000CE
-:10250E0000000000000000000000000000000000BD
-:10251E0000000000000000000000000000000000AD
-:10252E00000000000000000000000000000000009D
-:10253E00000000000000000000000000000000008D
-:10254E00000000000000000000000000000000007D
-:10255E00000000000000000000000000000000006D
-:10256E00000000000000000000000000000000005D
-:10257E00000000000000000000000000000000004D
-:10258E00000000000000000000000000000000003D
-:10259E00000000000000000000000000000000002D
-:1025AE00000000000000000000000000000000001D
-:1025BE00000000000000000000000000000000000D
-:1025CE0000000000000000000000000000000000FD
-:1025DE0000000000000000000000000000000000ED
-:1025EE0000000000000000000000000000000000DD
-:1025FE0000000000000000000000000000000000CD
-:10260E0000000000000000000000000000000000BC
-:10261E0000000000000000000000000000000000AC
-:10262E00000000000000000000000000000000009C
-:10263E00000000000000000000000000000000008C
-:10264E00000000000000000000000000000000007C
-:10265E00000000000000000000000000000000006C
-:10266E00000000000000000000000000000000005C
-:10267E00000000000000000000000000000000004C
-:10268E00000000000000000000000000000000003C
-:10269E00000000000000000000000000000000002C
-:1026AE00000000000000000000000000000000001C
-:1026BE00000000000000000000000000000000000C
-:1026CE0000000000000000000000000000000000FC
-:1026DE0000000000000000000000000000000000EC
-:0E26EE000000000000000000000000000000DE
-:1026FC0000000000000000000000000000000000CE
-:10270C0000000000000000000000000000000000BD
-:10271C0000000000000000000000000000000000AD
-:10272C00000000000000000000000000000000009D
-:10273C00000000000000000000000000000000008D
-:10274C00000000000000000000000000000000007D
-:10275C00000000000000000000000000000000006D
-:10276C00000000000000000000000000000000005D
-:10277C00000000000000000000000000000000004D
-:10278C00000000000000000000000000000000003D
-:10279C00000000000000000000000000000000002D
-:1027AC00000000000000000000000000000000001D
-:1027BC00000000000000000000000000000000000D
-:1027CC0000000000000000000000000000000000FD
-:1027DC0000000000000000000000000000000000ED
-:1027EC0000000000000000000000000000000000DD
-:0527FC000000000022B6
-:10280100C220C221C22A907FE8E01237F9283000A5
-:10281100288C0128A2022A1F212A6A22293D802907
-:102821007D8129D1822A84A12ABAA200002ABF90DF
-:102831007FE9E014601124FE602824FE603B24FC43
-:102841007040123FE541CB124E1D400241CB907FBB
-:10285100EAE0B40104C22241CB907FB4E04401F02C
-:1028610041CB124E1F907FEAE0B40104D22241CB4A
-:10287100907FB4E04401F041CB907FB4E04401F09B
-:1028810041CB907FB4E04401F041CB907FE9E0245B
-:10289100F5700512486341CB907FB4E04401F041EB
-:1028A100CB907FE9E024FD605424026002213412C0
-:1028B1004E1D400241CB907FEAE07038907FECE002
-:1028C100F45480FFC4540FFFE054072F25E024B4D3
-:1028D100F582E4347FF583E4F0907FECE05480FFEF
-:1028E100131313541FFFE054072F907FD7F0E044D8
-:1028F10020F041CB907FB4E04401F041CB124E1F58
-:10290100400241CB907FEAE07020907FECE0F454EC
-:1029110080FFC4540FFFE054072F25E024B4F58253
-:10292100E4347FF5837401F041CB907FB4E044013E
-:10293100F041CB907FB4E04401F041CB907FE9E0DE
-:10294100601224F86009240270291243E741CB1276
-:102951004DCA41CB124E1BA222E433FF25E0FFA258
-:1029610023E4334F907F00F0E4A3F0907FB574022D
-:10297100F041CB907FB4E04401F041CB907FE9E09E
-:10298100603324F6602A2404703D907FEBE024DE5E
-:10299100600C047012907FB4E04401F041CB907F51
-:1029A100B4E04401F041CB907FB4E04401F041CB6D
-:1029B10012474541CB124E1BE4907F00F0A3F090EB
-:1029C1007FB57402F041CB907FB4E04401F041CB7C
-:1029D100907FE9E024F46034240C7039124E1B908E
-:1029E1007FECE0F45480FFC4540FFFE054072F251F
-:1029F100E024B4F582E4347FF583E054FD907F0058
-:102A0100F0E4A3F0907FB57402F041CB907FB4E085
-:102A11004401F041CB907FB4E04401F041CB907F81
-:102A2100E9E024F6601214601A2402701DD220908D
-:102A31007FB4E04401F08012D220907FB4E04401E1
-:102A4100F08007907FB4E04401F0202018907FEEE1
-:102A5100E07004A3E0600BD229D22712174AD22AD0
-:102A61008003120800C2208061907FEEE07004A311
-:102A7100E0600BD229D22812174AD22A804C123890
-:102A8100748047907FE9E024FE601214601A2402EA
-:102A9100701DD221907FB4E04401F08012D22190C8
-:102AA1007FB4E04401F08007907FB4E04401F0205E
-:102AB1002103121000C2218011122AD6800C124E5D
-:102AC100215007907FB4E04401F0202A07907FB4A1
-:052AD100E04402F022C8
-:102AD600E4907627F0907627E0FF75F00FA4244265
-:102AE600F582E43475F583E0FE907FECE0FDEE6D53
-:102AF600600EEFC394065008907627E004F080D568
-:102B0600EFB40608907FB4E04401F022EF75F00FB1
-:102B1600A42441F582E43475F583E0907628F02408
-:102B26009F7002A17424216002A1A1907FE9E02494
-:102B36007E700261FC14700281B524026002A16CF1
-:102B4600EF75F00FA42443F582E43475F583E0FCB9
-:102B5600A3E0FDA3E0FEA3E0FF7B447AAC79007816
-:102B660000C31237AB7013907F007444F0A374ACAB
-:102B7600F0E4A3F0907FB57403F0907627E075F04B
-:102B86000FA42443F582E43475F583E0FCA3E0FD4D
-:102B9600A3E0FEA3E0FF7B807ABB79007800C31236
-:102BA60037AB7013907F007480F0A374BBF0E4A37E
-:102BB600F0907FB57403F0907627E075F00FA424AB
-:102BC60043F582E43475F583E0FCA3E0FDA3E0FE63
-:102BD600A3E0FF7B007A7779017800C31237AB60F8
-:102BE60002A1A8907F00F0A37477F0A37401F0907F
-:102BF6007FB57403F022907627E075F00FA4244782
-:102C0600F582E43475F583E0FCA3E0FDA3E0FEA3C2
-:102C1600E0FF7B447AAC79007800C31237AB7013BF
-:102C2600907F007444F0A374ACF0E4A3F0907FB5F9
-:102C36007403F0907627E075F00FA42447F582E43C
-:102C46003475F583E0FCA3E0FDA3E0FEA3E0FF7B83
-:102C5600807ABB79007800C31237AB7013907F007F
-:102C66007480F0A374BBF0E4A3F0907FB57403F016
-:102C7600907627E075F00FA42447F582E43475F5C5
-:102C860083E0FCA3E0FDA3E0FEA3E0FF7B007A77F0
-:102C960079017800C31237AB6002A1A8907F00F0DB
-:102CA600A37477F0A37401F0907FB57403F02290BB
-:102CB6007627E075F00FA4244BF582E43475F5838E
-:102CC600E0FCA3E0FDA3E0FEA3E0FF7B447AAC7941
-:102CD600007800C31237AB7013907F007444F0A3E2
-:102CE60074ACF0E4A3F0907FB57403F0907627E01F
-:102CF60075F00FA4244BF582E43475F583E0FCA34C
-:102D0600E0FDA3E0FEA3E0FF7B807ABB79007800BC
-:102D1600C31237AB7013907F007480F0A374BBF0BE
-:102D2600E4A3F0907FB57403F0907627E075F00F7A
-:102D3600A4244BF582E43475F583E0FCA3E0FDA3FF
-:102D4600E0FEA3E0FF7B007A7779017800C31237B3
-:102D5600AB704F907F00F0A37477F0A37401F090EE
-:102D66007FB57403F022907FB4E04401F022907F97
-:102D7600E9E0247F701E907627E075F00FA4244FBB
-:102D8600F582E43475F583E0907F00F0907FB574AA
-:102D960001F08007907FB4E04401F0907FB4E044F6
-:032DA60001F02217
-:102DA900E4907636F0E0FF75F003A4240EF582E492
-:102DB9003475F5837401F0EF75F003A4240FF582DF
-:102DC900E43475F5837401F0EF75F003A42410F56C
-:102DD90082E43475F583E4F0907636E004F0E0FFA0
-:102DE90075F003A4240EF582E43475F5837410F0AC
-:102DF900EF75F003A4240FF582E43475F5837405A7
-:102E0900F0EF75F003A42410F582E43475F583E43A
-:102E1900F0907636E004F0E0FF75F003A4240EF597
-:102E290082E43475F5837402F0EF75F003A4240F7E
-:102E3900F582E43475F5837402F0EF75F003A42488
-:102E490010F582E43475F583E4F0907636E004F009
-:102E5900E0FF75F003A4240EF582E43475F583745C
-:102E690001F0EF75F003A4240FF582E43475F583BE
-:102E79007403F0EF75F003A42410F582E43475F5BA
-:102E890083E4F0907636E004F0E0FF75F003A424C3
-:102E99000EF582E43475F5837410F0EF75F003A430
-:102EA900240FF582E43475F5837406F0EF75F003A9
-:102EB900A42410F582E43475F583E4F0907636E0C5
-:102EC90004F0E0FF75F003A4240EF582E43475F5EF
-:102ED900837402F0EF75F003A4240FF582E43475CE
-:102EE900F5837404F0EF75F003A42410F582E4343B
-:102EF90075F583E4F0907636E004F0E0FF75F003B1
-:102F0900A4240EF582E43475F5837402F0EF75F0AC
-:102F190003A4240FF582E43475F5837408F0EF7582
-:102F2900F003A42410F582E43475F5837404F09059
-:102F39007636E004F0E0FF75F003A4240EF582E490
-:102F49003475F5837402F0EF75F003A4240FF5824C
-:102F5900E43475F583740AF0EF75F003A42410F5D1
-:102F690082E43475F5837404F0907636E004F0E079
-:102F7900FF75F003A4240EF582E43475F583740219
-:102F8900F0EF75F003A4240FF582E43475F583742A
-:102F990009F0EF75F003A42410F582E43475F58384
-:102FA9007404F0907636E004F0E0FF75F003A42491
-:102FB9000EF582E43475F5837402F0EF75F003A41D
-:102FC900240FF582E43475F5837407F0EF75F00387
-:0E2FD900A42410F582E43475F5837404F0220C
-:102FE700C0E0C083C082D2265391EF907FAB7401BB
-:082FF700F0D082D083D0E0325B
-:012FFF00329F
-:10300000907FB6E020E102C23DD236203602416E0A
-:10301000303D02416E908007E06004D2368002C2EB
-:1030200036203602412ED235E4F51A908004E0F5C0
-:10303000197408250EF8A619851918E51820E70453
-:10304000D2388002C23830380221D4E4F516E519AE
-:10305000B4F00CD2397508047509F0050E8002052C
-:1030600016E51964F7703DC239E50E24FE601714A9
-:103070006022240370297508057509F7E4F50AF53F
-:103080000B750E048020750806750AF7E4F50B75BC
-:103090000E048012750807750BF7750E0480071271
-:1030A0004DDA80020516E51954F864F8703BC23514
-:1030B000E5192407600C24FC6008240524F8500658
-:1030C0008008D23A8006C23A8002D23A751A0120AC
-:1030D0003A19907E80740FF0A3E519F0E4A3F0A3F1
-:1030E000F0907FB77404F08002051620396DE51961
-:1030F00064F76067E51A7063E51854F064F070597E
-:10310000851819F50EE519240F601B24FE6017249D
-:10311000FD602214601F2405702F750803050E85BD
-:103120001809D2378028750802050E85180975140C
-:1031300001D2378019750805050E851809E4F50ACE
-:10314000F50B750E03D2378005124DDAC2353035D6
-:103150000A85081385181280020516851819E516C8
-:1031600064047062F50EE51954F0F519F51585182B
-:1031700019E5152470601824F0601424F060102400
-:10318000F0601E24F0601A24F0600424607027E5CB
-:1031900015C4540FF519F508050E851809D23780A6
-:1031A0001AE515C4540FF519F508050E85180975AB
-:1031B0001401D2378005124DDAC23530350A85192F
-:1031C0001385181280020516E516D3940540571290
-:1031D0004DDA8052303917E50E700A8508097508F6
-:1031E00004050E80417408250EF8A6198038203792
-:1031F0002AE50EB4010F85080A85090B8513088599
-:103200001209750E04E514B4011C85080AE4F50BD7
-:10321000851308851209750E04800BE514B40106A8
-:10322000E4F50B750E04E4F51A303502050EE50ED3
-:10323000D394035002010BC237E4F50EF510C236E9
-:10324000D23DF51474082510F8E6FF74802510F5BA
-:1032500082E4347EF583EFF074082510F8E4F60577
-:0F32600010E510B404DE907FB77404F0010B2268
-:10326F00907618E0FF640570429075ABE0B40119D9
-:10327F009072377401F0E4908020F0908031F090DC
-:10328F008028F0908039F08022E4907237F09075AA
-:10329F00ADE090722BF0E02480F0E0908020F09071
-:1032AF008031F0908028F0908039F0EF6406600252
-:1032BF0081999072397404F0907239E0FF24FE9076
-:1032CF007204F0EF75F00AA424ABF582E43475F5BF
-:1032DF0083E06401705490723604F0907204E0FF42
-:1032EF0024FD602824FE6024240324FB5004601C6A
-:1032FF00818C74202FF582E43480F583E4F07428F8
-:10330F002FF582E43480F583E4F0818C907204E031
-:10331F00FF2430F582E43480F583E4F074382FF520
-:10332F0082E43480F583E4F0818CE4907236F0907F
-:10333F007239E075F00AA424ADF582E43475F58393
-:10334F00E0FF7E0090750CEEF0A3EFF07006907228
-:10335F0002743BF090750CE0FEA3E0FF64804E70AA
-:10336F0004907202F0EF4E70028135EF64804E7060
-:10337F00028135EFF8E490750DF0E890750CF09040
-:10338F007234E075F00AA424ACF582E43475F58349
-:10339F00E0FF907202F090750DE02FF090750CE049
-:1033AF003400F0E0FEA3E0FFE4FCFD7BD67AA5F944
-:1033BF00F8D3123795400A90750C74A5F0A374D604
-:1033CF00F090750DE0242AF090750CE0345AF0E07F
-:1033DF00FEA3E07805CEA2E713CE13D8F8FF9075C1
-:1033EF000CEEF0A3EFF090722CEEF0A3EFF0D3946D
-:1033FF00D2EE64809482400A90722C7402F0A3740F
-:10340F00D2F0C390722CE0648094805004E4F0A357
-:10341F00F090722CE0FEA3E0243AF582EE3472F5C0
-:10342F0083E0907202F0907204E0FF24FD602D247F
-:10343F00FE6029240324FB50046021804090720217
-:10344F00E0FE74202FF582E43480F583EEF07428CB
-:10345F002FF582E43480F583EEF08021907202E044
-:10346F00FF907204E0FE2430F582E43480F583EFA0
-:10347F00F074382EF582E43480F583EFF0907239D2
-:0B348F00E004F0E0640A600241C72284
-:10349A00907618E0FFB40523907237E0701D90759E
-:1034AA00ADE090722BF0E02480F0E0908020F09064
-:1034BA008031F0908028F0908039F0EF6406600245
-:1034CA00C191907236E06002C191907640E070310D
-:1034DA009072037403F0907203E0FF75F00AA4245B
-:1034EA00AAF582E43475F583E0FE907229E0FDEED8
-:1034FA006D600EEFC3940A5008907203E004F080E6
-:10350A00D59072397404F0907640E0700890720396
-:10351A00E0907239F0907239E0FD24FE90722AF040
-:10352A00ED75F00AA424ADF582E43475F583E0FF65
-:10353A007E0090750CEEF0A3EFF0700690720274A4
-:10354A0080F090750CE0FEA3E0FF64804E7004905A
-:10355A007202F0EF4E7002C11BEF64804E7002C11E
-:10356A001BEFF8E490750DF0E890750CF0ED75F02E
-:10357A000AA424ACF582E43475F583E0FF90720264
-:10358A00F090750DE02FF090750CE03400F0E0FE3D
-:10359A00A3E0FFE4FCFD7BD67AA5F9F8D3123795B0
-:1035AA00400A90750C74A5F0A374D6F090750DE0DE
-:1035BA00242AF090750CE0345AF0E0FEA3E0780576
-:1035CA00CEA2E713CE13D8F8FF90750CEEF0A3EF56
-:1035DA00F090722CEEF0A3EFF0D394D2EE648094C4
-:1035EA0082400A90722C7402F0A374D2F0C39072D3
-:1035FA002CE0648094805004E4F0A3F090722CE0F4
-:10360A00FEA3E0243AF582EE3472F583E09072026A
-:10361A00F090722AE0FF24FD602D24FE6029240325
-:10362A0024FB500460218040907202E0FE74202F37
-:10363A00F582E43480F583EEF074282FF582E434C1
-:10364A0080F583EEF08021907202E0FF90722AE00A
-:10365A00FE2430F582E43480F583EFF074382EF5D9
-:10366A0082E43480F583EFF0907640E07006907241
-:10367A0039740AF0907239E004F0E0C3940A5002F7
-:08368A00A111E4907640F0224A
-:10369200BB010689828A83E0225002E722BBFE0236
-:0936A200E32289828A83E4932269
-:1036AB00BB010CE58229F582E5833AF583E02250D4
-:1036BB0006E92582F8E622BBFE06E92582F8E2221E
-:0D36CB00E58229F582E5833AF583E4932238
-:1036D800C2D5EC30E709B2D5E4C39DFDE49CFCEE0D
-:1036E80030E715B2D5E4C39FFFE49EFE12381FC32E
-:1036F800E49DFDE49CFC800312381F30D507C3E429
-:063708009FFFE49EFE227B
-:10370E00BB0110E58229F582E5833AF583E0F5F0F9
-:10371E00A3E0225009E92582F886F008E622BBFED6
-:10372E000AE92582F8E2F5F008E222E5832AF5831C
-:08373E00E993F5F0A3E99322E1
-:10374600E88FF0A4CC8BF0A42CFCE98EF0A42CFC22
-:103756008AF0EDA42CFCEA8EF0A4CDA8F08BF0A4A0
-:103766002DCC3825F0FDE98FF0A42CCD35F0FCEBFF
-:103776008EF0A4FEA9F0EB8FF0A4CFC5F02ECD39C4
-:0F378600FEE43CFCEAA42DCE35F0FDE43CFC2231
-:10379500EB9FF5F0EA9E42F0E99D42F0EC6480C8AB
-:0637A50064809845F0224B
-:1037AB00EB9FF5F0EA9E42F0E99D42F0E89C45F074
-:0137BB0022EB
-:0C37BC00ECF0A3EDF0A3EEF0A3EFF02280
-:1037C800A8828583F0D083D0821237DF1237DF12C8
-:1037D80037DF1237DFE473E493A3C583C5F0C583ED
-:1037E800C8C582C8F0A3C583C5F0C583C8C582C84B
-:0137F80022AE
-:1037F900D083D082F8E4937012740193700DA3A35F
-:1038090093F8740193F5828883E473740293686072
-:06381900EFA3A3A380DF72
-:10381F00BC000BBE0029EF8DF084FFADF022E4CC8D
-:10382F00F875F008EF2FFFEE33FEEC33FCEE9DEC56
-:10383F00984005FCEE9DFE0FD5F0E9E4CEFD22ED9C
-:10384F00F8F5F0EE8420D21CFEADF075F008EF2FE6
-:10385F00FFED33FD4007985006D5F0F222C398FDD7
-:05386F000FD5F0EA2274
-:10387400E4907629F0907629E0FF75F00FA42442B5
-:10388400F582E43475F583E0FE907FECE0FDEE6DA7
-:10389400600EEFC394065008907629E004F080D5BA
-:1038A400EFB40608907FB4E04401F022EF75F00F06
-:1038B400A42441F582E43475F583E090762AF0245B
-:1038C400BF7002414124E070024112242160024190
-:1038D4003A907FE9E024FE607D14700221B2240254
-:1038E4006002410A121751907642E0FCA3E0FDA366
-:1038F400E0FEA3E0FF907629E075F00FA42443F5E1
-:1039040082E43475F5831237BC907619E0FFB40174
-:103914001290767C7467F090767D7406F090767ED3
-:10392400740BF0EFB4020FE490767CF090767DF0A7
-:1039340090767E740CF0EFB4030FE490767CF090F4
-:10394400767DF090767E7418F090761A7401F012F9
-:103954003E9F12180022907EC2E0FFE4FCFDFEFBB5
-:10396400FA7901F8123746C8ECC8C9EDC9CAEECADB
-:10397400CBEFCB907EC1E0FEE4FCFD2BFBEA3EFAEC
-:10398400ED39F9EC38F8907EC0E0FFE4FEEB2FFF50
-:10399400EE3AFEED39FDEC38FC907629E075F00F37
-:1039A400A42447F582E43475F5831237BC22907E53
-:1039B400C2E0FFE4FCFDFEFBFA7901F8123746C8C9
-:1039C400ECC8C9EDC9CAEECACBEFCB907EC1E0FE0C
-:1039D400E4FCFD2BFBEA3EFAED39F9EC38F8907E75
-:1039E400C0E0FFE4FEEB2FFFEE3AFEED39FDEC38CC
-:1039F400FC907629E075F00FA4244BF582E434752D
-:103A0400F5831237BC22907FB4E04401F022907F0A
-:103A1400E9E0147019907EC0E0FF907629E075F01B
-:103A24000FA4244FF582E43475F583EFF022907FE0
-:0E3A3400B4E04401F022907FB4E04401F0229F
-:103A4200E4907635F0907635E0FFC394034002416E
-:103A5200FFEF75F00AA424AAF582E43475F583EF2A
-:103A6200F0EF75F00AA424ABF582E43475F583E433
-:103A7200F0EF75F00AA424ACF582E43475F5837492
-:103A8200F0F0EF75F00AA424ADF582E43475F58305
-:103A920074FFF0EF75F00AA424AEF582E43475F5F4
-:103AA20083E4F0EF75F00AA424AFF582E43475F5EF
-:103AB200837480F0EF75F00AA424B0F582E43475C3
-:103AC200F583E4F0EF75F00AA424B1F582E43475CD
-:103AD200F583E4F0EF75F00AA424B2F582E43475BC
-:103AE200F583E4F0EF75F00AA424B3F582E43475AB
-:103AF200F5837401F0907635E004F0414790763C0E
-:103B0200740AF0E4A3F09076357403F090763CE00A
-:103B1200FF907635E0FEC39F400261D290763DE091
-:103B2200FF04F0EE75F00AA424AAF582E43475F5D8
-:103B320083EFF0EE75F00AA424ABF582E43475F558
-:103B420083E4F0EE75F00AA424ACF582E43475F552
-:103B520083745EF0EE75F00AA424ADF582E4347548
-:103B6200F58374BAF0EE75F00AA424AEF582E4345B
-:103B720075F5837405F0EE75F00AA424AFF582E4BE
-:103B82003475F5837480F0EE75F00AA424B0F582E2
-:103B9200E43475F583E4F0EE75F00AA424B1F582FD
-:103BA200E43475F583E4F0EE75F00AA424B2F582EC
-:103BB200E43475F5837415F0EE75F00AA424B3F5B8
-:103BC20082E43475F583E4F0907635E004F0610E1A
-:013BD20022D0
-:103BD300E4907636F0E0FB75F00FA42441F582E41F
-:103BE3003475F5837440F0EB75F00FA42442F5822D
-:103BF300E43475F583740AF0EB75F00FA42443F5F0
-:103C030082E43475F5831237C80000AC44EB75F0D9
-:103C13000FA42447F582E43475F5831237C80000F6
-:103C2300AC44EB75F00FA4244BF582E43475F583B3
-:103C33001237C800017700907636E004F0E0FB7598
-:103C4300F00FA42441F582E43475F5837440F0EB5E
-:103C530075F00FA42442F582E43475F583748CF077
-:103C6300EB75F00FA42443F582E43475F583123722
-:103C7300C80000AC44EB75F00FA42447F582E4348C
-:103C830075F5831237C80000AC44EB75F00FA4241C
-:103C93004BF582E43475F5831237C8000177009041
-:103CA3007636E004F0E0FF75F00FA42441F582E4DA
-:103CB3003475F5837440F0EF75F00FA42442F58258
-:103CC300E43475F583748FF0907636E004F0E0FF0A
-:103CD30075F00FA42441F582E43475F5837441F043
-:103CE300EF75F00FA42442F582E43475F5837484F0
-:103CF300F0907636E004F0E0FF75F00FA42441F570
-:103D030082E43475F5837461F0EF75F00FA42442F7
-:103D1300F582E43475F5837481F0907636E004F02F
-:103D2300E0FF75F00FA42441F582E43475F5837444
-:103D330061F0EF75F00FA42442F582E43475F58346
-:043D43007401F022F5
-:103D4700C0E0C0F0C083C082C0D0E8C0E0E9C0E0F6
-:103D5700EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EFB1
-:103D6700C0E0907FA2E090767FF0907F74E090763D
-:103D770087F0907F75E0907688F0907F98E0440216
-:103D8700F0907696E0FF20E10C4402F0908003F07B
-:103D9700D232124B2890767FE020E250907687E06F
-:103DA700FEA3E07C002400F534EC3EF533907698D2
-:103DB700E0FDAE33AF341236D8907687EFF0D22FCE
-:103DC700303129203F26C231907F94E054CFF090C4
-:103DD7007F9AE030E404D22DC22C907F9AE020E550
-:103DE70004C22DD22C907F94E04430F01248BD12CB
-:103DF7001B04302F1212421FC22F75E80112168AB8
-:103E070075E80DD22B800575E801C22B202B349065
-:103E17007619E0FFB4010E90767C7467F0A3740600
-:103E2700F0A3740BF0EFB4020B90767CE4F0A3F0F0
-:103E3700A3740CF0EFB4030B90767CE4F0A3F0A32B
-:103E47007418F075CAD375CBFED2CA303404C234A5
-:103E57008002D23430340D907689E0C39403400455
-:103E6700E024FDF05391EF907FAB7402F0F0907F68
-:103E770098E054FDF0D0E0FFD0E0FED0E0FDD0E0C8
-:103E8700FCD0E0FBD0E0FAD0E0F9D0E0F8D0D0D019
-:083E970082D083D0F0D0E032AC
-:103E9F00907692E014601D147002E15424026002C7
-:103EAF00E1E49076947401F0908000F0E490768EC7
-:103EBF00F0D23122907619E0FFB4011BE4907FF22B
-:103ECF00F0907FF37430F0907FFF74FCF090769752
-:103EDF00E054FDF054FBF0EFB4021BE4907FF2F0DE
-:103EEF00907FF37434F0907FFF74FCF0907697E03E
-:103EFF004402F054FBF0EFB40318E4907FF2F0901B
-:103F0F007FF37464F0907FFF74FCF0907697E04439
-:103F1F0004F0907694E04401F0908000F0303F0977
-:103F2F00907697E054FEF08007907697E04401F08A
-:103F3F00907697E0908002F09076987404F09076E7
-:103F4F008E7401F022907619E0FFB4011BE4907F8C
-:103F5F00F2F0907FF37444F0907FFF74FCF0907652
-:103F6F0097E054FDF054FBF0EFB4021BE4907FF2A6
-:103F7F00F0907FF3744CF0907FFF74FCF090769785
-:103F8F00E04402F054FBF0EFB40318E4907FF2F03A
-:103F9F00907FF37494F0907FFF74FCF0907697E02D
-:103FAF004404F0907694E054FEF0908000F0303F9F
-:103FBF0009907697E054FEF08007907697E04401E1
-:103FCF00F0907697E0908002F09076987406F090DB
-:063FDF00768E7402F02250
-:103FE500907FEAE0907682F0E4907691F090769278
-:0B3FF500F0907690F0907693F0D322CD
-:10400000E511D3940050022106907689E0C394080C
-:10401000400221067440250FF582E4347EF583E0EA
-:10402000F517E50D600E908005E517F0907689E0B4
-:1040300004F001DAE5171237F940C1024067054084
-:104040007A0640980740C10C40C10D40C70F40CBD5
-:10405000F640CBF840CBFA40CBFB40CBFC40CBFE4C
-:1040600040CBFF000040DA907E41E0908005F09068
-:104070007689E004F07511018060907E41E09080C7
-:1040800005F0907E42E0908005F0907689E004F0A3
-:10409000E004F07511018042907E41E0908005F0CF
-:1040A000907E42E0908005F0907E43E0908005F0A5
-:1040B000907689E004F0E004F0E004F075110180EE
-:1040C00019D23BD23C8013D23B800F908005E5177C
-:1040D000F0907689E004F0751101203B04050D8015
-:1040E0001F303C1C907E41E0908005F0907E42E0C5
-:1040F000908005F0907689E004F0E004F0751101FD
-:10410000050F15110100E5117010C233F50DF50F03
-:0B411000907FC77404F0C23BC23C2249
-:10411B0090768DE064017027302708C227120800C3
-:10412B0012174A302808C22812387412174A302A3C
-:10413B000EE490768DF0C22A907FB4E04402F090AA
-:10414B00763FE0B40105E4F012326F907641E0B4B3
-:10415B000105E4F012349A907640E0B40103123476
-:10416B009A123000303303124000907F9BE020E422
-:10417B0002C23F907F9BE030E402D23F907F9BE0F6
-:10418B0020E502C23E907F9BE030E502D23EA24189
-:10419B00303F01B3501FA23F9241303F09907697B9
-:1041AB00E054FEF08007907697E04401F09076970C
-:1041BB00E0908002F0303F34907619E0FFB4010EAE
-:1041CB0090767C7467F0A37406F0A3740BF0EFB4D5
-:1041DB00020BE490767CF0A3F0A3740CF0EFB40325
-:1041EB000BE490767CF0A3F0A37418F0A240303E61
-:1041FB0001B3501FA23E9240303E09907695E044A9
-:10420B0004F08007907695E054FBF0907695E09063
-:04421B008001F0220C
-:10421F00907619E064017035907687E0FFD3942D86
-:10422F00402B9076867401F0907685E004F0E0D311
-:10423F00940F4019E4F0EFD394314008907619743D
-:10424F0003F080069076197402F0123E9F90761953
-:10425F00E0B4022C907687E0FFC3942F5022EFD367
-:10426F00942A401C9076867401F0907685E004F0D5
-:10427F00E0D3940F400AE4F090761904F0123E9FB9
-:10428F00907619E0B40226907687E0D39431401DE2
-:10429F009076867401F0907685E004F0E0D3940F69
-:1042AF00400BE4F09076197403F0123E9F9076194C
-:1042BF00E06403703F907687E0FFC3945F503590C2
-:1042CF0076867401F0907685E004F0E0D3940F4089
-:1042DF0023E4F0EFC3942F500CEFD3942A400690B1
-:1042EF0076197401F0EFD3942F400690761974026B
-:1042FF00F0123E9F907686E07005907685F022E46E
-:05430F00907686F0220B
-:10431400E4907696F0908003F0907FE07490F090B3
-:104324007FE17404F0E4907FDDF0907FA1F0538E80
-:10433400F875880575B82075F801438E30F5C87591
-:10434400CA7F75CBF843A820124565C22CC22DC282
-:104354002BC22F907FFC74DDF0907FFF74FFF090F0
-:104364007F97E04401F09076197401F0E49076852B
-:10437400F0A3F0907681F0907680F01249AE120F9F
-:10438400C6124AF1907F97E04408F0E054B9F0D2A5
-:1043940030203018124AA612300012400012421F78
-:1043A4001248BD121B0412166112421F124AA6C201
-:1043B4002FC231C232C234C233C229C227C228E456
-:1043C400F511907689F090763FF0907641F09076F2
-:1043D40040F090768AF0A3F0A304F0E4A3F0907682
-:0343E40099F0222B
-:1043E700124E19400281AC907FEBE024FE601E1450
-:1043F700604614606E147002819D2404600281A5DA
-:104407007405907FD4F07400907FD5F022907FEAF6
-:10441700E0FF124A558B208A218922EA496011CE92
-:10442700EACEEE907FD4F0CFE9CFEF907FD5F022A0
-:10443700907FB4E04401F022907FEAE0FF1247B793
-:104447008B208A218922EA496011CEEACEEE907F3D
-:10445700D4F0CFE9CFEF907FD5F022907FB4E0443E
-:1044670001F022907FEAE0FF907EC0E0FDA3E0FB31
-:104477001217948B208A218922EA496011CEEACE4D
-:10448700EE907FD4F0CFE9CFEF907FD5F022907FE9
-:10449700B4E04401F022907FB4E04401F022907F21
-:0544A700B4E04401F047
-:0144AC0022ED
-:1044AD00C2AFD224907F937430F0907F9C74BBF098
-:1044BD00907F96E04430F0E05430F0907F9474306B
-:1044CD00F0907F9D74CFF0907F9774A0F0907F95C2
-:1044DD0074C0F0907F9E7403F0907F99E030E209F4
-:1044ED0090051974A0F0E4A3F0C225C222C223C224
-:1044FD0026124B28122DA9123BD3124619123A42FD
-:10450D009076687401F0700F124C29124E15124EF0
-:10451D0017121B40121496124314907FAFE0440102
-:10452D00F0907FAEE0441FF0907FAC74FFF0907F71
-:10453D00ADF0907FDEF0907FDFF0907FABF0907F5D
-:10454D00A9F0907FAAF05391EF43D820D2E843D839
-:08455D002053A8A043A880220E
-:1045650090769A7402F0E4907691F0A3F0907690AC
-:10457500F0907693F09076967403F0908003F0E4D3
-:10458500907697F0908002F090769404F0908000F9
-:10459500F0E490768EF090761AF090769504F0C25D
-:1045A5002E907F9BE0FF5410FF7002C23F907F9BCF
-:1045B500E0FF5410FEFFBE1002D23F907F9BE0FF4C
-:1045C5005420FF7002C23E907F9BE0FF5420FEFF07
-:1045D500BE2002D23E303F09907697E054FEF0802F
-:1045E50007907697E04401F0907697E0908002F08E
-:1045F500303E09907695E04404F08007907695E08A
-:1046050054FBF0907695E0908001F0A23E9240A296
-:034615003F924190
-:01461800227F
-:10461900E4907636F0E0FF75F003A42432F582E4E5
-:104629003475F583E4F0EF75F003A42433F582E4DF
-:104639003475F5837401F0907636E004F0E0FF7587
-:10464900F003A42432F582E43475F583E4F0EF75C0
-:10465900F003A42433F582E43475F5837402F090F1
-:104669007636E004F0E0FF75F003A42432F582E425
-:104679003475F583E4F0EF75F003A42433F582E48F
-:104689003475F5837403F0907636E004F0E0FF7535
-:10469900F003A42432F582E43475F583E4F0EF7570
-:1046A900F003A42433F582E43475F5837404F0220D
-:0C46B900787FE4F6D8FD758138024700D8
-:1046C5000207A6E493A3F8E493A34003F68001F25E
-:1046D50008DFF48029E493A3F85407240CC8C333F6
-:1046E500C4540F4420C8834004F456800146F6DFC5
-:1046F500E4800B0102040810204080900C8FE47EBA
-:10470500019360BCA3FF543F30E509541FFEE493B9
-:10471500A360010ECF54C025E060A840B8E493A380
-:10472500FAE493A3F8E493A3C8C582C8CAC583CAAB
-:10473500F0A3C8C582C8CAC583CADFE9DEE780BE63
-:10474500907FECE0907683F0E014601D14602A14ED
-:10475500603714604424047050907691E0907F0097
-:10476500F0907FB57401F08047907692E0907F00DD
-:10477500F0907FB57401F08037907690E0907F00DF
-:10478500F0907FB57401F08027907684E0907F00EB
-:10479500F0907FB57401F08017907693E0907F00DC
-:1047A500F0907FB57401F08007907FB4E04401F08C
-:0247B500D3220D
-:0247B7008F2E43
-:1047B900E4F52F7530FF75310775321AAB30AA3120
-:1047C900A9329000011236ABB4031FAF2F052FEFAA
-:1047D900652E7001221236927E0029FFEE3AC9EF4A
-:1047E900C97530FFF531893280D27B007A007900B2
-:0147F900229D
-:0647FA00124B28C231221F
-:10480000C0E0C0F0C083C082C0D0E8C0E0E9C0E032
-:10481000EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EFED
-:10482000C0E0C2CAC2CF907F98E04401F0302E03AE
-:104830001214A6907F98E054FEF053A8FA12166165
-:10484000D0E0FFD0E0FED0E0FDD0E0FCD0E0FBD037
-:10485000E0FAD0E0F9D0E0F8D0D0D082D083D0F028
-:03486000D0E03273
-:10486300907FECE0907683F0E014601714602114DD
-:10487300602B14603224047038907FEAE0907691C4
-:10488300F08035907FEAE0907692F0123E9F802888
-:10489300907FEAE0907690F0121800801B907FEAF8
-:1048A300E0907684F08011907FEAE0907693F08038
-:0A48B30007907FB4E04401F0D32227
-:1048BD00302D39C22D907619E0FFB4010DE49076BC
-:1048CD007CF0A374F8F0A3740AF0EFB4020DE49039
-:1048DD00767CF0A374F0F0A3740BF0EFB4030DE449
-:0D48ED0090767CF0A374F8F0A37417F0220D
-:0648FA005391BFD22D32E4
-:10490000022FE700023D4700024DB400024C430075
-:10491000024BE900022FFF00024C5B00024C0A0030
-:10492000024C7200024B5A00024C8900024CA0005B
-:10493000024CB700024CCE00024CE500024CFC00D9
-:10494000024D1300024D2A00024D4100024D580055
-:08495000024D6F00024D8600CC
-:10495800E4907626F0907626E0FF75F003A42434E0
-:10496800F582E43475F583E0FE907FECE0FDEE6DB2
-:10497800600EEFC394045008907626E004F080D5CA
-:10498800EFB40408907FB4E04401F022EF75F0031F
-:10499800A42432F582E43475F583E0907F00F0902A
-:0649A8007FB57401F0224E
-:1049AE009076467480F0E4A3F0A3F0A3F0A3F0A3F6
-:1049BE00F0A3F0A3F0A3F0A37480F0E4A3F0A3F0AF
-:1049CE00A3F0A3F0A3F0A3F0A37440F0E4A3F0A32C
-:1049DE007440F0E4A3F0A3F0A3F0A3F0A3F0A3F0CF
-:1049EE00A37440F0E4A3F0A37440F0E4A3F0A3F0AA
-:0549FE00A3F0A3F0226C
-:104A0300E4907625F0907625E0FF75F003A4243436
-:104A1300F582E43475F583E0FE907FECE0FDEE6D06
-:104A2300600EEFC394045008907625E004F080D51F
-:104A3300EFB40408907FB4E04401F022907EC0E01C
-:104A4300FEEF75F003A42432F582E43475F583EEAA
-:024A5300F0224F
-:104A5500E4FE751DFF751E05751F12AB1DAA1EA967
-:104A65001F9000011236AB6402702FCDEECD0EED16
-:104A75006F70012290000212370E85F01BF51C6243
-:104A85001BE51B621CE51C621B29FDE51B3AC9EDF4
-:104A9500C9751DFFF51E891F80C17B007A0079004D
-:014AA50022EE
-:104AA600E490769BF090769BE0FF04F0EF6008E0E0
-:104AB6002408F8E4F680EE907696E04404F0440884
-:104AC600F0908003F0E4F518D235F50EF510D236E5
-:104AD600751211751322C237C239C238F516F5148C
-:0B4AE600F51AF50DC23BC23CC23D2298
-:104AF100E4FF74562FF582E43476F583E0FE7428E2
-:104B01002FF582E43480F583EEF0745E2FF582E4B4
-:104B11003476F583E0FE74382FF582E43480F58332
-:064B2100EEF00FBF08CC0E
-:014B2700226B
-:104B2800E4907236F0A3F0907F97E054FBF0E490A5
-:104B38007233F0907232F090720104F0E4907233A4
-:104B4800F0907232F090720104F0907F97E0440484
-:024B5800F02249
-:104B5A00C0E0C083C0825391EF907FAAE04402F084
-:104B6A00907FC7E0F511750F00750D00D233D08222
-:054B7A00D083D0E03201
-:104B7F00907FD6E054FBF0E04408F0304204E0446C
-:104B8F0002F07FDC7E05124D9D907FD6E054F7F04A
-:054B9F00E04404F022D7
-:104BA400907FEBE0147014907FE9E0247F7004128E
-:104BB400495822907FB4E04401F022907FB4E0444D
-:034BC40001F022DB
-:104BC700907FEBE0147013907FE9E0147004124AB1
-:104BD7000322907FB4E04401F022907FB4E04401C7
-:024BE700F022BA
-:104BE900C0E0C083C0825391EF907FAB7410F09006
-:104BF9007696E054FDF0908003F0D082D083D0E027
-:014C09003278
-:104C0A00C0E0C083C0825391EF907FAAE04401F0D4
-:0F4C1A00C22990768D7401F0D082D083D0E03221
-:104C2900907FD6E030E712E04401F07F147E001255
-:0A4C39004D9D907FD6E054FEF0225E
-:104C4300C0E0C083C082D2255391EF907FAB74083C
-:084C5300F0D082D083D0E032E2
-:104C5B00C0E0C083C0825391EF907FA9E04401F084
-:074C6B00D082D083D0E032BB
-:104C7200C0E0C083C0825391EF907FA9E04402F06C
-:074C8200D082D083D0E032A4
-:104C8900C0E0C083C0825391EF907FA9E04404F053
-:074C9900D082D083D0E0328D
-:104CA000C0E0C083C0825391EF907FAAE04404F03B
-:074CB000D082D083D0E03276
-:104CB700C0E0C083C0825391EF907FA9E04408F021
-:074CC700D082D083D0E0325F
-:104CCE00C0E0C083C0825391EF907FAAE04408F009
-:074CDE00D082D083D0E03248
-:104CE500C0E0C083C0825391EF907FA9E04410F0EB
-:074CF500D082D083D0E03231
-:104CFC00C0E0C083C0825391EF907FAAE04410F0D3
-:074D0C00D082D083D0E03219
-:104D1300C0E0C083C0825391EF907FA9E04420F0AC
-:074D2300D082D083D0E03202
-:104D2A00C0E0C083C0825391EF907FAAE04420F094
-:074D3A00D082D083D0E032EB
-:104D4100C0E0C083C0825391EF907FA9E04440F05E
-:074D5100D082D083D0E032D4
-:104D5800C0E0C083C0825391EF907FAAE04440F046
-:074D6800D082D083D0E032BD
-:104D6F00C0E0C083C0825391EF907FA9E04480F0F0
-:074D7F00D082D083D0E032A6
-:104D8600C0E0C083C0825391EF907FAAE04480F0D8
-:074D9600D082D083D0E0328F
-:104D9D008E358F36E5361536AE35700215354E60CB
-:074DAD000512148580EE22BF
-:104DB400C0E0C083C0825391EF907FAB7404F0D005
-:064DC40082D083D0E03232
-:104DCA00907682E0907F00F0907FB57401F0D32254
-:0C4DDA00C237E4F50EF510C236F51422C5
-:094DE600C22553D8EF43D8203256
-:074DEF005398FE5398FD32BA
-:074DF60053C0FE53C0FD3263
-:064DFD0053917FD22C321D
-:044E03005391DF32B6
-:044E070053D8F73253
-:044E0B001217302228
-:034E0F00C28D321F
-:034E1200C28F321A
-:024E1500D322A6
-:024E1700D322A4
-:024E1900D322A2
-:024E1B00D322A0
-:024E1D00D3229E
-:024E1F00D3229C
-:024E2100C322AA
-:00000001FF
-/*
-Source: EMI62MFW.HEX
-VERSION=1.04.062
-DATE=16.10.2002
-*/
diff --git a/firmware/emi62/spdif.HEX b/firmware/emi62/spdif.HEX
deleted file mode 100644
index 322d50c9cf4d..000000000000
--- a/firmware/emi62/spdif.HEX
+++ /dev/null
@@ -1,1257 +0,0 @@
-:030000000245F9BD
-:03000300020FFDEC
-:03000B00024D9B08
-:030013000217FDD4
-:03001B00024D9EF5
-:03002300024D7516
-:03002B000246F793
-:03003300024D6C0F
-:03003B00024D7CF7
-:030043000249006F
-:03004B00024D8FD4
-:03005300024D83D8
-:03005B00024D89CA
-:03006300024D93B8
-:1005000012011001000000406A08110100010102FF
-:1005100000010902AC01030100803209040000005F
-:10052000010100000A2401000156000201020C240E
-:10053000020101010002000000000D240605010275
-:10054000030000000000000924030204030005006A
-:100550000C24020305020006000000001524060614
-:100560000302000003000300030003000300030074
-:100570000009240304010100060009040100000130
-:100580000200000904010102010200000724010128
-:10059000000100112402010202100344AC0080BBE0
-:1005A0000000770109050A05840101008F07250174
-:1005B0000100000009058F01030001050009040185
-:1005C00002020102000007240101000100112402BF
-:1005D000010203180344AC0080BB00007701090549
-:1005E0000A05460201008F072501010000000905E8
-:1005F0008F01030001050009040200000102000050
-:1006000009040201010102000007240104000100A5
-:100610000E2402010602100244AC0080BB00090552
-:100620008C054C02010000072501000200000904AE
-:1006300002020101020000072401040001000E244F
-:1006400002010603180244AC0080BB0009058C05BA
-:1006500072030100000725010002000009040203E3
-:10066000010102000007240104000100112402011D
-:100670000202100344AC0080BB0000770109058C26
-:1006800005840101000007250100020000090402A1
-:1006900004010102000007240104000100112402EA
-:1006A000010203180344AC0080BB00007701090578
-:1006B0008C0546020100000725010002000004032A
-:1006C0000904180345006D006100670069006300BC
-:1006D000200047006D0062004800220345006D00C5
-:1006E0006100670069006300200045004D0049007B
-:1006F000200036007C00320020006D002A034300F9
-:100700006F006E006600690067007500720061008E
-:10071000740069006F006E002000530074007200C6
-:1007200069006E006700220349006E0074006500D6
-:1007300072006600610063006500200053007400D1
-:0A074000720069006E0067000000FF
-:10074A0090769A7402F0E4907691F0A3F090769005
-:10075A00F0907693F09076967403F0908003F0E42C
-:10076A00907697F0908002F090769404F090800052
-:10077A00F0E490768EF090761AF090769504F0C2B6
-:10078A002E907F9BE0FF5410FF7002C23F907F9B28
-:10079A00E0FF5410FEFFBE1002D23F907F9BE0FFA5
-:1007AA005420FF7002C23E907F9BE0FF5420FEFF60
-:1007BA00BE2002D23E303F09907697E054FEF08088
-:1007CA0007907697E04401F0907697E0908002F0E7
-:1007DA00303E09907695E04404F08007907695E0E3
-:1007EA0054FBF0907695E0908001F0A23E9240A2F0
-:0307FA003F9241EA
-:0107FD0022D9
-:0207FE00D32204
-:10080000E4907631F0907631E0FF75F003A4240F88
-:10081000F582E43475F583E0FE907FEDE0FDEE6D4A
-:10082000600EEFC3940B5008907631E004F080D551
-:10083000EFB40B08907FB4E04401F022EF75F003B1
-:10084000A4240EF582E43475F583E0907633F02429
-:10085000F0600A240E60028187124B3E22907FEDE9
-:10086000E0640570519076187405F0907637740145
-:10087000F09076397403F0907621F0E4907620F0D1
-:10088000907FEAE0F4602F907620E0FF75F00AA4F4
-:1008900024AAF582E43475F583E0FE907FEAE0FD5A
-:1008A000EE6D6012907621E0FEEFC39E50089076C8
-:1008B00020E004F080D1907FEDE0640670529076E5
-:1008C000187406F09076377404F0907639740AF054
-:1008D000907621F09076207403F0907FEAE0F46047
-:1008E0002F907620E0FF75F00AA424AAF582E43464
-:1008F00075F583E0FE907FEAE0FDEE6D6012907684
-:1009000021E0FEEFC39E5008907620E004F080D1F5
-:10091000907620E0FF75F00AA424AAF582E43475ED
-:10092000F583E0907229F0E490763BF0907621E038
-:10093000FEEF6E7008907FB4E04401F022907FEBF0
-:10094000E014601314700221E224026002817F909F
-:100950007FB4E04401F022907FE9E014707C907F46
-:10096000EAE0F47048907637E0907620F09076399F
-:10097000E0FE907620E0FDC39E502B90763BE0FE9B
-:1009800004F074C02EF582E4347EF583E0FEED754C
-:10099000F00AA424ABF582E43475F583EEF090768A
-:1009A00020E004F080C790763F7401F022907EC072
-:1009B000E0FEEF75F00AA424ABF582E43475F5830C
-:1009C000EEF0E0B4010890763E7401F08005E4900A
-:1009D000763EF090763F7401F022907FB4E04401BF
-:1009E000F022907FE9E024FE700241A314700261BE
-:1009F0003F14700261DB240360028177907FEAE09C
-:100A0000F4706B907637E0907620F0907639E0FFC6
-:100A1000907620E0FEC39F504E90763BE0FF04F0BE
-:100A200074C02FF582E4347EF583E0FFEE75F00AA2
-:100A3000A424ACF582E43475F583EFF090763BE0C6
-:100A4000FF04F074C02FF582E4347EF583E0FFEEFE
-:100A500075F00AA424ADF582E43475F583EFF090C7
-:100A60007620E004F080A49076407401F022907E1D
-:100A7000C0E0FF907620E0FE75F00AA424ACF58279
-:100A8000E43475F583EFF0907EC1E0FFEE75F00A77
-:100A9000A424ADF582E43475F583EFF090764174CB
-:100AA00001F022907FEAE0F47066907637E090766D
-:100AB00020F0907639E0FF907620E0FEC39F400260
-:100AC000818E90763BE0FF04F074C02FF582E43411
-:100AD0007EF583E0FFEE75F00AA424AEF582E434DF
-:100AE00075F583EFF090763BE0FF04F074C02FF5CE
-:100AF00082E4347EF583E0FFEE75F00AA424AFF5BE
-:100B000082E43475F583EFF0907620E004F080A263
-:100B1000907EC0E0FF907620E0FE75F00AA424AE3F
-:100B2000F582E43475F583EFF0907EC1E0FFEE7559
-:100B3000F00AA424AFF582E43475F583EFF0229037
-:100B40007FEAE0F47066907637E0907620F0907659
-:100B500039E0FF907620E0FEC39F4002818E9076C0
-:100B60003BE0FF04F074C02FF582E4347EF583E0AF
-:100B7000FFEE75F00AA424B0F582E43475F583EF36
-:100B8000F090763BE0FF04F074C02FF582E4347EF1
-:100B9000F583E0FFEE75F00AA424B1F582E4347524
-:100BA000F583EFF0907620E004F080A2907EC0E024
-:100BB000FF907620E0FE75F00AA424B0F582E434BC
-:100BC00075F583EFF0907EC1E0FFEE75F00AA42486
-:100BD000B1F582E43475F583EFF022907FEAE0F41A
-:100BE0007066907637E0907620F0907639E0FF904E
-:100BF0007620E0FEC39F4002818E90763BE0FF04AA
-:100C0000F074C02FF582E4347EF583E0FFEE75F0DA
-:100C10000AA424B2F582E43475F583EFF090763BB4
-:100C2000E0FF04F074C02FF582E4347EF583E0FF2A
-:100C3000EE75F00AA424B3F582E43475F583EFF081
-:100C4000907620E004F080A2907EC0E0FF907620B5
-:100C5000E0FE75F00AA424B2F582E43475F583EF62
-:100C6000F0907EC1E0FFEE75F00AA424B3F582E4B3
-:100C70003475F583EFF022907FB4E04401F02290C8
-:0F0C80007FB4E04401F022907FB4E04401F02201
-:100C8F004176680141766A0241766B0AC120C12123
-:020C9F00C12F63
-:040CA1004176230075
-:100CA500417201014572050002C9000045720A0042
-:100CB500010203044D720FD100D1000000000000B5
-:100CC500282809004D721C010001020304050607CE
-:100CD50008090A0B41722E2241722F2341723020DE
-:100CE5004172312162D2723A00000000000000001A
-:100CF50000000000000000000000000000000000EF
-:100D050000000000000000000000000000000000DE
-:100D150000000000000000000000000000000000CE
-:100D250000000000000000000000000000000000BE
-:100D350000000000000000000000000000000000AE
-:100D4500000000000000000000000000000000009E
-:100D5500000000000000000000000000000000008E
-:100D6500000000000000000000000000000000007E
-:100D75000000000000000000000001010101010168
-:100D8500010101010101010101010101010101014E
-:100D9500010101010101010101010101010101013E
-:100DA500010101010101010101010101010101012E
-:100DB5000101010101010101020202020202020216
-:100DC50002020202020202020202020202020202FE
-:100DD50002020202020202020202020202020202EE
-:100DE50002020202020202020202020202020202DE
-:100DF50002020202020303030303030303030303C3
-:100E050003030303030303030303030303030303AD
-:100E1500030303030303030303030303030303039D
-:100E2500030303030303030303030303030303038D
-:100E3500030304040404040404040404040404046F
-:100E4500040404040404040404040404040404045D
-:100E5500040404040404040404040404040404044D
-:100E6500040404040404040404040404040404043D
-:100E7500050505050505050505050505050505051D
-:100E8500050505050505050505050505050505050D
-:100E950005050505050505050505050505050505FD
-:100EA50005050505050505050505050505050606EB
-:100EB50006060606060606060606060606060606CD
-:100EC50006060606060606060606060606060606BD
-:100ED50006060606060606060606060606060606AD
-:100EE5000606060606060606060606070707080896
-:100EF500080909090A0A0A0B0B0B0C0C0C0D0D0D40
-:100F05000E0E0E0F0F0F10101011111112121213D9
-:100F15001313141414151515161616171717181874
-:100F250018191919191A1A1A1A1B1B1B1B1C1C1C18
-:100F35001C1D1D1D1D1E1E1E1E1F1F1F1F202020C8
-:100F45002121212222222323242425252626272761
-:100F5500282829292A2A2B2B2C2C2D2D2E2E2F2FD4
-:100F65003030313132323333343435353636373744
-:100F7500383839393A3A3B3C3D3E3F40414243449B
-:100F85004546474849494A4B4B4C4D4E4F505152A7
-:100F95005354555556565757585A5B5D5E5F6162B7
-:100FA500636465666768696A6B6C6D6F717273748B
-:100FB50075767778797A7B7C7E80013701013800F8
-:010FC500002B
-:100FC600E4FF74462FF582E43476F583E0FE742060
-:100FD6002FF582E43480F583EEF0744E2FF582E42B
-:100FE6003476F583E0FE74302FF582E43480F583A1
-:060FF600EEF00FBF08CC75
-:010FFC0022D2
-:030FFD00C2893274
-:10100000E490762CF090762CE0FF75F003A4240F8A
-:10101000F582E43475F583E0FE907FEDE0FDEE6D42
-:10102000600EEFC3940B500890762CE004F080D54E
-:10103000EFB40B08907FB4E04401F022EF75F003A9
-:10104000A4240EF582E43475F583E090762EF02426
-:10105000F0600A240F6002817D124B1B22907FED0D
-:10106000E0640570519076187405F090763874013C
-:10107000F090763A7403F090761CF0E490761BF0D2
-:10108000907FEAE0F4602F90761BE0FF75F00AA4F1
-:1010900024AAF582E43475F583E0FE907FEAE0FD52
-:1010A000EE6D601290761CE0FEEFC39E50089076C5
-:1010B0001BE004F080D1907FEDE0640670529076E2
-:1010C000187406F09076387404F090763A740AF04A
-:1010D00090761CF090761B7403F0907FEAE0F46049
-:1010E0002F90761BE0FF75F00AA424AAF582E43461
-:1010F00075F583E0FE907FEAE0FDEE6D601290767C
-:101100001CE0FEEFC39E500890761BE004F080D1F7
-:10111000E490761EF090761CE0FF90761BE0FE6F68
-:101120007008907FB4E04401F022907FEBE01460FF
-:101130001314700221BF240260028175907FB4E015
-:101140004401F022907FE9E0247F706B907FEAE019
-:10115000F4704A907638E090761BF090763AE0FF93
-:1011600090761BE0FDC39F502BED75F00AA424ABD5
-:10117000F582E43475F583E0FF90761EE0FD04F01F
-:1011800074002DF582E4347FF583EFF090761BE058
-:1011900004F080C790761EE0907FB5F022EE75F0E7
-:1011A0000AA424ABF582E43475F583E0907F00F067
-:1011B000907FB57401F022907FB4E04401F022905A
-:1011C0007FE9E0247E7002417E1470026123147076
-:1011D0000261C824036002816D907FEAE0F4706DC3
-:1011E000907638E090761BF090763AE0FF90761B90
-:1011F000E0C39F504FE0FF75F00AA424ACF582E4F1
-:101200003475F583E0FE90761EE0FD04F074002D49
-:10121000F582E4347FF583EEF0EF75F00AA424AD97
-:10122000F582E43475F583E0FF90761EE0FE04F06D
-:1012300074002EF582E4347FF583EFF090761BE0A6
-:1012400004F080A490761EE0907FB5F02290761B8B
-:10125000E0FF75F00AA424ACF582E43475F583E070
-:10126000907F00F0EF75F00AA424ADF582E43475A8
-:10127000F583E0907F01F0907FB57402F022907FBB
-:10128000EAE0F4706D907638E090761BF090763A54
-:10129000E0FF90761BE0C39F504FE0FF75F00AA47B
-:1012A00024AEF582E43475F583E0FE90761EE0FD11
-:1012B00004F074002DF582E4347FF583EEF0EF75D1
-:1012C000F00AA424AFF582E43475F583E0FF90764C
-:1012D0001EE0FE04F074002EF582E4347FF583EF07
-:1012E000F090761BE004F080A490761EE0907FB52D
-:1012F000F02290761BE0FF75F00AA424AEF582E49C
-:101300003475F583E0907F00F0EF75F00AA424AF08
-:10131000F582E43475F583E0907F01F0907FB57439
-:1013200002F022907FEAE0F4706D907638E09076DB
-:101330001BF090763AE0FF90761BE0C39F504FE0A1
-:10134000FF75F00AA424B0F582E43475F583E0FE5D
-:1013500090761EE0FD04F074002DF582E4347FF5F4
-:1013600083EEF0EF75F00AA424B1F582E43475F54C
-:1013700083E0FF90761EE0FE04F074002EF582E418
-:10138000347FF583EFF090761BE004F080A4907634
-:101390001EE0907FB5F02290761BE0FF75F00AA466
-:1013A00024B0F582E43475F583E0907F00F0EF75AA
-:1013B000F00AA424B1F582E43475F583E0907F014E
-:1013C000F0907FB57402F022907FEAE0F4706D90A7
-:1013D0007638E090761BF090763AE0FF90761BE04E
-:1013E000C39F504FE0FF75F00AA424B2F582E434A5
-:1013F00075F583E0FE90761EE0FD04F074002DF597
-:1014000082E4347FF583EEF0EF75F00AA424B3F59F
-:1014100082E43475F583E0FF90761EE0FE04F074FC
-:10142000002EF582E4347FF583EFF090761BE00424
-:10143000F080A490761EE0907FB5F02290761BE0BD
-:10144000FF75F00AA424B2F582E43475F583E090C8
-:101450007F00F0EF75F00AA424B3F582E43475F54B
-:1014600083E0907F01F0907FB57402F022907FB40A
-:10147000E04401F022907FB4E04401F022907FB478
-:05148000E04401F02230
-:101485007400F58690FDA57C05A3E582458370F97A
-:011495002234
-:10149600907FD6E04480F0438701000000000022E0
-:1014A600C0D0C0E08FE0C0E08EE0C0E08DE0C0E0DC
-:1014B6008CE0C0E0C082C0830586C084C0857D0004
-:1014C600907FE3747BF0A37480F07C11907F99E0A9
-:1014D6005440DC030214F3B40013907FE27440F02E
-:1014E600907FE5F0907FE27400F00214D29076903F
-:1014F600E0B4011290768FE02DFD907FE27480F0CB
-:10150600907F6C021557B4021290768FE02DFD90F5
-:101516007FE27480F0907F6C021596B40312907689
-:101526008FE02DFD907FE27480F0907F6C0215E1D4
-:10153600B4041290768FE02DFD907FE27480F090D7
-:101546007F6C021610907FE27480F0907F6C02161A
-:1015560040F0F0F0F0F0F0F0F0F0F0F0F0DDF27DB9
-:10156600020586907FE27400F0907F9BE05404B4FD
-:1015760000050586021640907FE27480F00586F02D
-:10158600F0F0F0F0F0F0F0F0F0F0F0DDD4021640FC
-:10159600F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F045
-:1015A600F0F0DDEC7D020586907FE27400F0907F1E
-:1015B6009BE05404B400050586021640907FE27451
-:1015C60080F00586F0F0F0F0F0F0F0F0F0F0F0F0DA
-:0615D600F0F0F0F0F0F06F
-:1015DC00DDCE021640F0F0F0F0DDFA7D02058690CB
-:1015EC007FE27400F0907F9BE05404B40005058604
-:1015FC00021640907FE27480F00586F0F0F0F0DD8A
-:10160C00DC021640F0F0F0F0F0F0DDF87D0205861B
-:10161C00907FE27400F0907F9BE05404B4000505C9
-:10162C0086021640907FE27480F00586F0F0F0F0B0
-:10163C00F0F0DDDA907FE27400F0D085D08405867E
-:10164C00D083D082D0E0FCD0E0FDD0E0FED0E0FF33
-:05165C00D0E0D0D02217
-:10166100C0D0C0E0C082C08390767CE0907F6FF0F4
-:1016710090767DE0907F6FF090767EE0907F6FF0C6
-:09168100D083D082D0E0D0D02249
-:10168A00C0D0C0E08FE0C0E08EE0C0E0C082C0837E
-:10169A000586C084C085907687E0FFBF00030217E5
-:1016AA0001907F96E04480F0907FE27480F0907F12
-:1016BA0062E00586907FE27400F0907F96E0547FA6
-:1016CA00F0907FE27480F090768EE0B40105058692
-:1016DA000216F6B4020505860216EB05860216FB0B
-:1016EA00E0E0E0E0E0E0DFF80216FBE0E0E0E0DF67
-:1016FA00FA907FE27400F0D085D0840586D083D03A
-:0C170A0082D0E0FED0E0FFD0E0D0D02282
-:10171600C082C083C0E0E8C0E078D1E814F870FB6E
-:0A172600D0E0F8D0E0D083D082229A
-:10173000C082C083C0E0E8C0E07878E814F870FBAD
-:0A174000D0E0F8D0E0D083D0822280
-:07174A00907FC57402F0223C
-:10175100907EC0E0907645F0907EC1E0907644F0B6
-:10176100907EC2E0907643F0B40003021778907641
-:10177100197403F002178E907644E0B4BB09907699
-:10178100197402F002178E9076197401F090764266
-:03179100E4F0225F
-:041794008D298B2AE6
-:101798001249FFEA4960571236927E0029FFEE3A55
-:1017A800C9EFC9752BFFF52C892DAB2BAA2CA92DB8
-:1017B8009000011236ABFF64046005EF6405702EDB
-:1017C800EFB404159000021236AB6529700B900037
-:1017D800031236AB652A7001221236927E0029FF69
-:1017E800EE3AC9EFC9752BFFF52C892D80BC7B001B
-:0417F8007A007900FA
-:0117FC0022CA
-:0317FD00C28B326A
-:10180000907690E014603714700201D814700221B1
-:1018100072147002413B240460026103907FFC74E7
-:10182000CCF0907FFF74FCF0907695E04401F0548A
-:1018300005F0908001F0E490761AF0C22E229076A6
-:1018400095E04401F04402F0303E06E04404F080AC
-:1018500007907695E054FBF090761AE0B40108907A
-:101860007695E0908001F0907619E0FFB401229027
-:101870007FFC7474F0907FFF74FCF090768F742B73
-:10188000F0907697E054FDF0E4907681F0907680C9
-:10189000F0EFB40222907FFC7468F0907FFF74FC3C
-:1018A000F090768F742FF0907697E04402F0E490F9
-:1018B0007681F0907680F0303F09907697E054FE84
-:1018C000F08007907697E04401F0907697E054FB23
-:1018D000F0908002F0D22E22907695E054FEF044F3
-:1018E00002F0303E06E04404F08007907695E05424
-:1018F000FBF090761AE0B40108907695E0908001B4
-:10190000F0907619E0FFB40122907FFC7430F090E3
-:101910007FFF74FCF090768F742BF0907697E054F4
-:10192000FDF0E4907681F0907680F0EFB4022290A2
-:101930007FFC741CF0907FFF74FCF090768F742F06
-:10194000F0907697E04402F0E4907681F090768013
-:10195000F0303F09907697E054FEF080079076973C
-:10196000E04401F0907697E054FBF0908002F0D2D2
-:101970002E22907695E04401F04402F04408F030C5
-:101980003E06E04404F08007907695E054FBF0902A
-:10199000761AE0B40108907695E0908001F0907698
-:1019A00019E0FFB40125907FFC74CCF0907FFF74A8
-:1019B000FCF090768F742BF0907697E054FDF05405
-:1019C000FBF0E4907681F0907680F0EFB402259001
-:1019D0007FFC74C8F0907FFF74FCF090768F742FBA
-:1019E000F0907697E04402F054FBF0E4907681F0BA
-:1019F000907680F0EFB40325907FFC7498F0907F90
-:101A0000FF74FCF090768F745FF0907697E054FD51
-:101A1000F04404F0E4907681F0907680F0303F0955
-:101A2000907697E054FEF08007907697E04401F0BE
-:101A3000907697E0908002F0D22E22907695E05436
-:101A4000FEF04402F04408F0303E06E04404F0802A
-:101A500007907695E054FBF090761AE0B401089078
-:101A60007695E0908001F0907619E0FFB401259022
-:101A70007FFC74B4F0907FFF74FCF090768F742B31
-:101A8000F0907697E054FDF054FBF0E4907681F00E
-:101A9000907680F0EFB40225907FFC74B0F0907FD8
-:101AA000FF74FCF090768F742FF0907697E04402EC
-:101AB000F054FBF0E4907681F0907680F0EFB40380
-:101AC00025907FFC7468F0907FFF74FCF090768F17
-:101AD000745FF0907697E054FDF04404F0E4907663
-:101AE00081F0907680F0303F09907697E054FEF0D8
-:101AF0008007907697E04401F0907697E09080021E
-:041B0000F0D22E22CF
-:101B0400302C38C22C907619E0FFB4010E90767C0C
-:101B140074C0F0A37414F0A3740BF0EFB4020DE4DA
-:101B240090767CF0A37410F0A3740CF0EFB4030B64
-:0C1B3400E490767CF0A37418F0A3F0227B
-:101B40000000000000000000000000000000000095
-:101B50000000000000000000000000000000000085
-:101B60000000000000000000000000000000000075
-:101B70000000000000000000000000000000000065
-:101B80000000000000000000000000000000000055
-:101B90000000000000000000000000000000000045
-:101BA0000000000000000000000000000000000035
-:101BB0000000000000000000000000000000000025
-:101BC0000000000000000000000000000000000015
-:101BD0000000000000000000000000000000000005
-:101BE00000000000000000000000000000000000F5
-:101BF00000000000000000000000000000000000E5
-:101C000000000000000000000000000000000000D4
-:101C100000000000000000000000000000000000C4
-:101C200000000000000000000000000000000000B4
-:101C300000000000000000000000000000000000A4
-:101C40000000000000000000000000000000000094
-:101C50000000000000000000000000000000000084
-:101C60000000000000000000000000000000000074
-:101C70000000000000000000000000000000000064
-:101C80000000000000000000000000000000000054
-:101C90000000000000000000000000000000000044
-:101CA0000000000000000000000000000000000034
-:101CB0000000000000000000000000000000000024
-:101CC0000000000000000000000000000000000014
-:101CD0000000000000000000000000000000000004
-:101CE00000000000000000000000000000000000F4
-:101CF00000000000000000000000000000000000E4
-:101D000000000000000000000000000000000000D3
-:101D100000000000000000000000000000000000C3
-:101D200000000000000000000000000000000000B3
-:101D300000000000000000000000000000000000A3
-:101D40000000000000000000000000000000000093
-:101D50000000000000000000000000000000000083
-:101D60000000000000000000000000000000000073
-:101D70000000000000000000000000000000000063
-:101D80000000000000000000000000000000000053
-:101D90000000000000000000000000000000000043
-:101DA0000000000000000000000000000000000033
-:101DB0000000000000000000000000000000000023
-:101DC0000000000000000000000000000000000013
-:101DD0000000000000000000000000000000000003
-:101DE00000000000000000000000000000000000F3
-:101DF00000000000000000000000000000000000E3
-:101E000000000000000000000000000000000000D2
-:101E100000000000000000000000000000000000C2
-:101E200000000000000000000000000000000000B2
-:101E300000000000000000000000000000000000A2
-:101E40000000000000000000000000000000000092
-:101E50000000000000000000000000000000000082
-:101E60000000000000000000000000000000000072
-:101E70000000000000000000000000000000000062
-:101E80000000000000000000000000000000000052
-:101E90000000000000000000000000000000000042
-:101EA0000000000000000000000000000000000032
-:0E1EB000000000000000000000000000000024
-:101EBE000000000000000000000000000000000014
-:101ECE000000000000000000000000000000000004
-:101EDE0000000000000000000000000000000000F4
-:101EEE0000000000000000000000000000000000E4
-:101EFE0000000000000000000000000000000000D4
-:101F0E0000000000000000000000000000000000C3
-:101F1E0000000000000000000000000000000000B3
-:101F2E0000000000000000000000000000000000A3
-:021F3E000000A1
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F70000000000000000000000000000000000061
-:101F80000000000000000000000000000000000051
-:101F90000000000000000000000000000000000041
-:101FA0000000000000000000000000000000000031
-:101FB0000000000000000000000000000000000021
-:101FC0000000000000000000000000000000000011
-:101FD0000000000000000000000000000000000001
-:101FE00000000000000000000000000000000000F1
-:101FF00000000000000000000000000000000000E1
-:1020000000000000000000000000000000000000D0
-:1020100000000000000000000000000000000000C0
-:1020200000000000000000000000000000000000B0
-:1020300000000000000000000000000000000000A0
-:102040000000000000000000000000000000000090
-:102050000000000000000000000000000000000080
-:102060000000000000000000000000000000000070
-:102070000000000000000000000000000000000060
-:102080000000000000000000000000000000000050
-:102090000000000000000000000000000000000040
-:1020A0000000000000000000000000000000000030
-:1020B0000000000000000000000000000000000020
-:1020C0000000000000000000000000000000000010
-:1020D0000000000000000000000000000000000000
-:1020E00000000000000000000000000000000000F0
-:1020F00000000000000000000000000000000000E0
-:1021000000000000000000000000000000000000CF
-:1021100000000000000000000000000000000000BF
-:1021200000000000000000000000000000000000AF
-:10213000000000000000000000000000000000009F
-:10214000000000000000000000000000000000008F
-:10215000000000000000000000000000000000007F
-:10216000000000000000000000000000000000006F
-:10217000000000000000000000000000000000005F
-:10218000000000000000000000000000000000004F
-:10219000000000000000000000000000000000003F
-:1021A000000000000000000000000000000000002F
-:1021B000000000000000000000000000000000001F
-:1021C000000000000000000000000000000000000F
-:1021D00000000000000000000000000000000000FF
-:1021E00000000000000000000000000000000000EF
-:1021F00000000000000000000000000000000000DF
-:1022000000000000000000000000000000000000CE
-:1022100000000000000000000000000000000000BE
-:1022200000000000000000000000000000000000AE
-:10223000000000000000000000000000000000009E
-:10224000000000000000000000000000000000008E
-:10225000000000000000000000000000000000007E
-:10226000000000000000000000000000000000006E
-:10227000000000000000000000000000000000005E
-:10228000000000000000000000000000000000004E
-:10229000000000000000000000000000000000003E
-:1022A000000000000000000000000000000000002E
-:1022B000000000000000000000000000000000001E
-:1022C000000000000000000000000000000000000E
-:1022D00000000000000000000000000000000000FE
-:1022E00000000000000000000000000000000000EE
-:1022F00000000000000000000000000000000000DE
-:1023000000000000000000000000000000000000CD
-:1023100000000000000000000000000000000000BD
-:1023200000000000000000000000000000000000AD
-:10233000000000000000000000000000000000009D
-:10234000000000000000000000000000000000008D
-:10235000000000000000000000000000000000007D
-:10236000000000000000000000000000000000006D
-:0E23700000000000000000000000000000005F
-:10237E00000000000000000000000000000000004F
-:10238E00000000000000000000000000000000003F
-:10239E00000000000000000000000000000000002F
-:1023AE00000000000000000000000000000000001F
-:1023BE00000000000000000000000000000000000F
-:1023CE0000000000000000000000000000000000FF
-:1023DE0000000000000000000000000000000000EF
-:1023EE0000000000000000000000000000000000DF
-:1023FE0000000000000000000000000000000000CF
-:10240E0000000000000000000000000000000000BE
-:10241E0000000000000000000000000000000000AE
-:10242E00000000000000000000000000000000009E
-:10243E00000000000000000000000000000000008E
-:10244E00000000000000000000000000000000007E
-:10245E00000000000000000000000000000000006E
-:10246E00000000000000000000000000000000005E
-:10247E00000000000000000000000000000000004E
-:10248E00000000000000000000000000000000003E
-:10249E00000000000000000000000000000000002E
-:1024AE00000000000000000000000000000000001E
-:1024BE00000000000000000000000000000000000E
-:1024CE0000000000000000000000000000000000FE
-:1024DE0000000000000000000000000000000000EE
-:1024EE0000000000000000000000000000000000DE
-:1024FE0000000000000000000000000000000000CE
-:10250E0000000000000000000000000000000000BD
-:10251E0000000000000000000000000000000000AD
-:10252E00000000000000000000000000000000009D
-:10253E00000000000000000000000000000000008D
-:10254E00000000000000000000000000000000007D
-:10255E00000000000000000000000000000000006D
-:10256E00000000000000000000000000000000005D
-:10257E00000000000000000000000000000000004D
-:10258E00000000000000000000000000000000003D
-:10259E00000000000000000000000000000000002D
-:1025AE00000000000000000000000000000000001D
-:1025BE00000000000000000000000000000000000D
-:1025CE0000000000000000000000000000000000FD
-:1025DE0000000000000000000000000000000000ED
-:1025EE0000000000000000000000000000000000DD
-:1025FE0000000000000000000000000000000000CD
-:10260E0000000000000000000000000000000000BC
-:10261E0000000000000000000000000000000000AC
-:10262E00000000000000000000000000000000009C
-:10263E00000000000000000000000000000000008C
-:10264E00000000000000000000000000000000007C
-:10265E00000000000000000000000000000000006C
-:10266E00000000000000000000000000000000005C
-:10267E00000000000000000000000000000000004C
-:10268E00000000000000000000000000000000003C
-:10269E00000000000000000000000000000000002C
-:1026AE00000000000000000000000000000000001C
-:1026BE00000000000000000000000000000000000C
-:1026CE0000000000000000000000000000000000FC
-:1026DE0000000000000000000000000000000000EC
-:0E26EE000000000000000000000000000000DE
-:1026FC0000000000000000000000000000000000CE
-:10270C0000000000000000000000000000000000BD
-:10271C0000000000000000000000000000000000AD
-:10272C00000000000000000000000000000000009D
-:10273C00000000000000000000000000000000008D
-:10274C00000000000000000000000000000000007D
-:10275C00000000000000000000000000000000006D
-:10276C00000000000000000000000000000000005D
-:10277C00000000000000000000000000000000004D
-:10278C00000000000000000000000000000000003D
-:10279C00000000000000000000000000000000002D
-:1027AC00000000000000000000000000000000001D
-:1027BC00000000000000000000000000000000000D
-:1027CC0000000000000000000000000000000000FD
-:1027DC0000000000000000000000000000000000ED
-:1027EC0000000000000000000000000000000000DD
-:0527FC000000000022B6
-:10280100C220C221C22A907FE8E01237F9283000A5
-:10281100288C0128A2022A1F212A6A22293D802907
-:102821007D8129D1822A84A12ABAA200002ABF90DF
-:102831007FE9E014601124FE602824FE603B24FC43
-:102841007040124BA041CB124DA7400241CB907F6B
-:10285100EAE0B40104C22241CB907FB4E04401F02C
-:1028610041CB124DA9907FEAE0B40104D22241CBC1
-:10287100907FB4E04401F041CB907FB4E04401F09B
-:1028810041CB907FB4E04401F041CB907FE9E0245B
-:10289100F5700512480041CB907FB4E04401F0414E
-:1028A100CB907FE9E024FD605424026002213412C0
-:1028B1004DA7400241CB907FEAE07038907FECE079
-:1028C100F45480FFC4540FFFE054072F25E024B4D3
-:1028D100F582E4347FF583E4F0907FECE05480FFEF
-:1028E100131313541FFFE054072F907FD7F0E044D8
-:1028F10020F041CB907FB4E04401F041CB124DA9CF
-:10290100400241CB907FEAE07020907FECE0F454EC
-:1029110080FFC4540FFFE054072F25E024B4F58253
-:10292100E4347FF5837401F041CB907FB4E044013E
-:10293100F041CB907FB4E04401F041CB907FE9E0DE
-:10294100601224F86009240270291243DB41CB1282
-:102951004D5C41CB124DA5A222E433FF25E0FFA23D
-:1029610023E4334F907F00F0E4A3F0907FB574022D
-:10297100F041CB907FB4E04401F041CB907FE9E09E
-:10298100603324F6602A2404703D907FEBE024DE5E
-:10299100600C047012907FB4E04401F041CB907F51
-:1029A100B4E04401F041CB907FB4E04401F041CB6D
-:1029B10012468541CB124DA5E4907F00F0A3F09023
-:1029C1007FB57402F041CB907FB4E04401F041CB7C
-:1029D100907FE9E024F46034240C7039124DA59005
-:1029E1007FECE0F45480FFC4540FFFE054072F251F
-:1029F100E024B4F582E4347FF583E054FD907F0058
-:102A0100F0E4A3F0907FB57402F041CB907FB4E085
-:102A11004401F041CB907FB4E04401F041CB907F81
-:102A2100E9E024F6601214601A2402701DD220908D
-:102A31007FB4E04401F08012D220907FB4E04401E1
-:102A4100F08007907FB4E04401F0202018907FEEE1
-:102A5100E07004A3E0600BD229D22712174AD22AD0
-:102A61008003120800C2208061907FEEE07004A311
-:102A7100E0600BD229D22812174AD22A804C123890
-:102A8100748047907FE9E024FE601214601A2402EA
-:102A9100701DD221907FB4E04401F08012D22190C8
-:102AA1007FB4E04401F08007907FB4E04401F0205E
-:102AB1002103121000C2218011122AD6800C124D5E
-:102AC100AB5007907FB4E04401F0202A07907FB417
-:052AD100E04402F022C8
-:102AD600E4907627F0907627E0FF75F00FA4244265
-:102AE600F582E43475F583E0FE907FECE0FDEE6D53
-:102AF600600EEFC394065008907627E004F080D568
-:102B0600EFB40608907FB4E04401F022EF75F00FB1
-:102B1600A42441F582E43475F583E0907628F02408
-:102B26009F7002A17424216002A1A1907FE9E02494
-:102B36007E700261FC14700281B524026002A16CF1
-:102B4600EF75F00FA42443F582E43475F583E0FCB9
-:102B5600A3E0FDA3E0FEA3E0FF7B447AAC79007816
-:102B660000C31237AB7013907F007444F0A374ACAB
-:102B7600F0E4A3F0907FB57403F0907627E075F04B
-:102B86000FA42443F582E43475F583E0FCA3E0FD4D
-:102B9600A3E0FEA3E0FF7B807ABB79007800C31236
-:102BA60037AB7013907F007480F0A374BBF0E4A37E
-:102BB600F0907FB57403F0907627E075F00FA424AB
-:102BC60043F582E43475F583E0FCA3E0FDA3E0FE63
-:102BD600A3E0FF7B007A7779017800C31237AB60F8
-:102BE60002A1A8907F00F0A37477F0A37401F0907F
-:102BF6007FB57403F022907627E075F00FA4244782
-:102C0600F582E43475F583E0FCA3E0FDA3E0FEA3C2
-:102C1600E0FF7B447AAC79007800C31237AB7013BF
-:102C2600907F007444F0A374ACF0E4A3F0907FB5F9
-:102C36007403F0907627E075F00FA42447F582E43C
-:102C46003475F583E0FCA3E0FDA3E0FEA3E0FF7B83
-:102C5600807ABB79007800C31237AB7013907F007F
-:102C66007480F0A374BBF0E4A3F0907FB57403F016
-:102C7600907627E075F00FA42447F582E43475F5C5
-:102C860083E0FCA3E0FDA3E0FEA3E0FF7B007A77F0
-:102C960079017800C31237AB6002A1A8907F00F0DB
-:102CA600A37477F0A37401F0907FB57403F02290BB
-:102CB6007627E075F00FA4244BF582E43475F5838E
-:102CC600E0FCA3E0FDA3E0FEA3E0FF7B447AAC7941
-:102CD600007800C31237AB7013907F007444F0A3E2
-:102CE60074ACF0E4A3F0907FB57403F0907627E01F
-:102CF60075F00FA4244BF582E43475F583E0FCA34C
-:102D0600E0FDA3E0FEA3E0FF7B807ABB79007800BC
-:102D1600C31237AB7013907F007480F0A374BBF0BE
-:102D2600E4A3F0907FB57403F0907627E075F00F7A
-:102D3600A4244BF582E43475F583E0FCA3E0FDA3FF
-:102D4600E0FEA3E0FF7B007A7779017800C31237B3
-:102D5600AB704F907F00F0A37477F0A37401F090EE
-:102D66007FB57403F022907FB4E04401F022907F97
-:102D7600E9E0247F701E907627E075F00FA4244FBB
-:102D8600F582E43475F583E0907F00F0907FB574AA
-:102D960001F08007907FB4E04401F0907FB4E044F6
-:032DA60001F02217
-:102DA900E4907636F0E0FF75F003A4240EF582E492
-:102DB9003475F5837401F0EF75F003A4240FF582DF
-:102DC900E43475F5837401F0EF75F003A42410F56C
-:102DD90082E43475F583E4F0907636E004F0E0FFA0
-:102DE90075F003A4240EF582E43475F5837410F0AC
-:102DF900EF75F003A4240FF582E43475F5837405A7
-:102E0900F0EF75F003A42410F582E43475F583E43A
-:102E1900F0907636E004F0E0FF75F003A4240EF597
-:102E290082E43475F5837402F0EF75F003A4240F7E
-:102E3900F582E43475F5837402F0EF75F003A42488
-:102E490010F582E43475F583E4F0907636E004F009
-:102E5900E0FF75F003A4240EF582E43475F583745C
-:102E690001F0EF75F003A4240FF582E43475F583BE
-:102E79007403F0EF75F003A42410F582E43475F5BA
-:102E890083E4F0907636E004F0E0FF75F003A424C3
-:102E99000EF582E43475F5837410F0EF75F003A430
-:102EA900240FF582E43475F5837406F0EF75F003A9
-:102EB900A42410F582E43475F583E4F0907636E0C5
-:102EC90004F0E0FF75F003A4240EF582E43475F5EF
-:102ED900837402F0EF75F003A4240FF582E43475CE
-:102EE900F5837404F0EF75F003A42410F582E4343B
-:102EF90075F583E4F0907636E004F0E0FF75F003B1
-:102F0900A4240EF582E43475F5837402F0EF75F0AC
-:102F190003A4240FF582E43475F5837408F0EF7582
-:102F2900F003A42410F582E43475F5837404F09059
-:102F39007636E004F0E0FF75F003A4240EF582E490
-:102F49003475F5837402F0EF75F003A4240FF5824C
-:102F5900E43475F583740AF0EF75F003A42410F5D1
-:102F690082E43475F5837404F0907636E004F0E079
-:102F7900FF75F003A4240EF582E43475F583740219
-:102F8900F0EF75F003A4240FF582E43475F583742A
-:102F990009F0EF75F003A42410F582E43475F58384
-:102FA9007404F0907636E004F0E0FF75F003A42491
-:102FB9000EF582E43475F5837402F0EF75F003A41D
-:102FC900240FF582E43475F5837407F0EF75F00387
-:0E2FD900A42410F582E43475F5837404F0220C
-:102FE700C0E0C083C082D2265391EF907FAB7401BB
-:082FF700F0D082D083D0E0325B
-:012FFF00329F
-:10300000907FB6E020E102C23DD236203602416E0A
-:10301000303D02416E908007E06004D2368002C2EB
-:1030200036203602412ED235E4F51A908004E0F5C0
-:10303000197408250EF8A619851918E51820E70453
-:10304000D2388002C23830380221D4E4F516E519AE
-:10305000B4F00CD2397508047509F0050E8002052C
-:1030600016E51964F7703DC239E50E24FE601714A9
-:103070006022240370297508057509F7E4F50AF53F
-:103080000B750E048020750806750AF7E4F50B75BC
-:103090000E048012750807750BF7750E0480071271
-:1030A00048F380020516E51954F864F8703BC23500
-:1030B000E5192407600C24FC6008240524F8500658
-:1030C0008008D23A8006C23A8002D23A751A0120AC
-:1030D0003A19907E80740FF0A3E519F0E4A3F0A3F1
-:1030E000F0907FB77404F08002051620396DE51961
-:1030F00064F76067E51A7063E51854F064F070597E
-:10310000851819F50EE519240F601B24FE6017249D
-:10311000FD602214601F2405702F750803050E85BD
-:103120001809D2378028750802050E85180975140C
-:1031300001D2378019750805050E851809E4F50ACE
-:10314000F50B750E03D23780051248F3C2353035C2
-:103150000A85081385181280020516851819E516C8
-:1031600064047062F50EE51954F0F519F51585182B
-:1031700019E5152470601824F0601424F060102400
-:10318000F0601E24F0601A24F0600424607027E5CB
-:1031900015C4540FF519F508050E851809D23780A6
-:1031A0001AE515C4540FF519F508050E85180975AB
-:1031B0001401D23780051248F3C23530350A85191B
-:1031C0001385181280020516E516D3940540571290
-:1031D00048F38052303917E50E700A8508097508E2
-:1031E00004050E80417408250EF8A6198038203792
-:1031F0002AE50EB4010F85080A85090B8513088599
-:103200001209750E04E514B4011C85080AE4F50BD7
-:10321000851308851209750E04800BE514B40106A8
-:10322000E4F50B750E04E4F51A303502050EE50ED3
-:10323000D394035002010BC237E4F50EF510C236E9
-:10324000D23DF51474082510F8E6FF74802510F5BA
-:1032500082E4347EF583EFF074082510F8E4F60577
-:0F32600010E510B404DE907FB77404F0010B2268
-:10326F00907618E0FF640570429075ABE0B40119D9
-:10327F009072377401F0E4908020F0908031F090DC
-:10328F008028F0908039F08022E4907237F09075AA
-:10329F00ADE090722BF0E02480F0E0908020F09071
-:1032AF008031F0908028F0908039F0EF6406600252
-:1032BF0081999072397404F0907239E0FF24FE9076
-:1032CF007204F0EF75F00AA424ABF582E43475F5BF
-:1032DF0083E06401705490723604F0907204E0FF42
-:1032EF0024FD602824FE6024240324FB5004601C6A
-:1032FF00818C74202FF582E43480F583E4F07428F8
-:10330F002FF582E43480F583E4F0818C907204E031
-:10331F00FF2430F582E43480F583E4F074382FF520
-:10332F0082E43480F583E4F0818CE4907236F0907F
-:10333F007239E075F00AA424ADF582E43475F58393
-:10334F00E0FF7E0090750CEEF0A3EFF07006907228
-:10335F0002743BF090750CE0FEA3E0FF64804E70AA
-:10336F0004907202F0EF4E70028135EF64804E7060
-:10337F00028135EFF8E490750DF0E890750CF09040
-:10338F007234E075F00AA424ACF582E43475F58349
-:10339F00E0FF907202F090750DE02FF090750CE049
-:1033AF003400F0E0FEA3E0FFE4FCFD7BD67AA5F944
-:1033BF00F8D3123795400A90750C74A5F0A374D604
-:1033CF00F090750DE0242AF090750CE0345AF0E07F
-:1033DF00FEA3E07805CEA2E713CE13D8F8FF9075C1
-:1033EF000CEEF0A3EFF090722CEEF0A3EFF0D3946D
-:1033FF00D2EE64809482400A90722C7402F0A3740F
-:10340F00D2F0C390722CE0648094805004E4F0A357
-:10341F00F090722CE0FEA3E0243AF582EE3472F5C0
-:10342F0083E0907202F0907204E0FF24FD602D247F
-:10343F00FE6029240324FB50046021804090720217
-:10344F00E0FE74202FF582E43480F583EEF07428CB
-:10345F002FF582E43480F583EEF08021907202E044
-:10346F00FF907204E0FE2430F582E43480F583EFA0
-:10347F00F074382EF582E43480F583EFF0907239D2
-:0B348F00E004F0E0640A600241C72284
-:10349A00907618E0FFB40523907237E0701D90759E
-:1034AA00ADE090722BF0E02480F0E0908020F09064
-:1034BA008031F0908028F0908039F0EF6406600245
-:1034CA00C191907236E06002C191907640E070310D
-:1034DA009072037403F0907203E0FF75F00AA4245B
-:1034EA00AAF582E43475F583E0FE907229E0FDEED8
-:1034FA006D600EEFC3940A5008907203E004F080E6
-:10350A00D59072397404F0907640E0700890720396
-:10351A00E0907239F0907239E0FD24FE90722AF040
-:10352A00ED75F00AA424ADF582E43475F583E0FF65
-:10353A007E0090750CEEF0A3EFF0700690720274A4
-:10354A0080F090750CE0FEA3E0FF64804E7004905A
-:10355A007202F0EF4E7002C11BEF64804E7002C11E
-:10356A001BEFF8E490750DF0E890750CF0ED75F02E
-:10357A000AA424ACF582E43475F583E0FF90720264
-:10358A00F090750DE02FF090750CE03400F0E0FE3D
-:10359A00A3E0FFE4FCFD7BD67AA5F9F8D3123795B0
-:1035AA00400A90750C74A5F0A374D6F090750DE0DE
-:1035BA00242AF090750CE0345AF0E0FEA3E0780576
-:1035CA00CEA2E713CE13D8F8FF90750CEEF0A3EF56
-:1035DA00F090722CEEF0A3EFF0D394D2EE648094C4
-:1035EA0082400A90722C7402F0A374D2F0C39072D3
-:1035FA002CE0648094805004E4F0A3F090722CE0F4
-:10360A00FEA3E0243AF582EE3472F583E09072026A
-:10361A00F090722AE0FF24FD602D24FE6029240325
-:10362A0024FB500460218040907202E0FE74202F37
-:10363A00F582E43480F583EEF074282FF582E434C1
-:10364A0080F583EEF08021907202E0FF90722AE00A
-:10365A00FE2430F582E43480F583EFF074382EF5D9
-:10366A0082E43480F583EFF0907640E07006907241
-:10367A0039740AF0907239E004F0E0C3940A5002F7
-:08368A00A111E4907640F0224A
-:10369200BB010689828A83E0225002E722BBFE0236
-:0936A200E32289828A83E4932269
-:1036AB00BB010CE58229F582E5833AF583E02250D4
-:1036BB0006E92582F8E622BBFE06E92582F8E2221E
-:0D36CB00E58229F582E5833AF583E4932238
-:1036D800C2D5EC30E709B2D5E4C39DFDE49CFCEE0D
-:1036E80030E715B2D5E4C39FFFE49EFE12381FC32E
-:1036F800E49DFDE49CFC800312381F30D507C3E429
-:063708009FFFE49EFE227B
-:10370E00BB0110E58229F582E5833AF583E0F5F0F9
-:10371E00A3E0225009E92582F886F008E622BBFED6
-:10372E000AE92582F8E2F5F008E222E5832AF5831C
-:08373E00E993F5F0A3E99322E1
-:10374600E88FF0A4CC8BF0A42CFCE98EF0A42CFC22
-:103756008AF0EDA42CFCEA8EF0A4CDA8F08BF0A4A0
-:103766002DCC3825F0FDE98FF0A42CCD35F0FCEBFF
-:103776008EF0A4FEA9F0EB8FF0A4CFC5F02ECD39C4
-:0F378600FEE43CFCEAA42DCE35F0FDE43CFC2231
-:10379500EB9FF5F0EA9E42F0E99D42F0EC6480C8AB
-:0637A50064809845F0224B
-:1037AB00EB9FF5F0EA9E42F0E99D42F0E89C45F074
-:0137BB0022EB
-:0C37BC00ECF0A3EDF0A3EEF0A3EFF02280
-:1037C800A8828583F0D083D0821237DF1237DF12C8
-:1037D80037DF1237DFE473E493A3C583C5F0C583ED
-:1037E800C8C582C8F0A3C583C5F0C583C8C582C84B
-:0137F80022AE
-:1037F900D083D082F8E4937012740193700DA3A35F
-:1038090093F8740193F5828883E473740293686072
-:06381900EFA3A3A380DF72
-:10381F00BC000BBE0029EF8DF084FFADF022E4CC8D
-:10382F00F875F008EF2FFFEE33FEEC33FCEE9DEC56
-:10383F00984005FCEE9DFE0FD5F0E9E4CEFD22ED9C
-:10384F00F8F5F0EE8420D21CFEADF075F008EF2FE6
-:10385F00FFED33FD4007985006D5F0F222C398FDD7
-:05386F000FD5F0EA2274
-:10387400E4907629F0907629E0FF75F00FA42442B5
-:10388400F582E43475F583E0FE907FECE0FDEE6DA7
-:10389400600EEFC394065008907629E004F080D5BA
-:1038A400EFB40608907FB4E04401F022EF75F00F06
-:1038B400A42441F582E43475F583E090762AF0245B
-:1038C400BF7002414124E070024112242160024190
-:1038D4003A907FE9E024FE607D14700221B2240254
-:1038E4006002410A121751907642E0FCA3E0FDA366
-:1038F400E0FEA3E0FF907629E075F00FA42443F5E1
-:1039040082E43475F5831237BC907619E0FFB40174
-:103914001290767C7467F090767D7406F090767ED3
-:10392400740BF0EFB4020FE490767CF090767DF0A7
-:1039340090767E740CF0EFB4030FE490767CF090F4
-:10394400767DF090767E7418F090761A7401F012F9
-:103954003E8F12180022907EC2E0FFE4FCFDFEFBC5
-:10396400FA7901F8123746C8ECC8C9EDC9CAEECADB
-:10397400CBEFCB907EC1E0FEE4FCFD2BFBEA3EFAEC
-:10398400ED39F9EC38F8907EC0E0FFE4FEEB2FFF50
-:10399400EE3AFEED39FDEC38FC907629E075F00F37
-:1039A400A42447F582E43475F5831237BC22907E53
-:1039B400C2E0FFE4FCFDFEFBFA7901F8123746C8C9
-:1039C400ECC8C9EDC9CAEECACBEFCB907EC1E0FE0C
-:1039D400E4FCFD2BFBEA3EFAED39F9EC38F8907E75
-:1039E400C0E0FFE4FEEB2FFFEE3AFEED39FDEC38CC
-:1039F400FC907629E075F00FA4244BF582E434752D
-:103A0400F5831237BC22907FB4E04401F022907F0A
-:103A1400E9E0147019907EC0E0FF907629E075F01B
-:103A24000FA4244FF582E43475F583EFF022907FE0
-:0E3A3400B4E04401F022907FB4E04401F0229F
-:103A4200E4907635F0907635E0FFC394034002416E
-:103A5200FFEF75F00AA424AAF582E43475F583EF2A
-:103A6200F0EF75F00AA424ABF582E43475F583E433
-:103A7200F0EF75F00AA424ACF582E43475F5837492
-:103A8200F0F0EF75F00AA424ADF582E43475F58305
-:103A920074FFF0EF75F00AA424AEF582E43475F5F4
-:103AA20083E4F0EF75F00AA424AFF582E43475F5EF
-:103AB200837480F0EF75F00AA424B0F582E43475C3
-:103AC200F583E4F0EF75F00AA424B1F582E43475CD
-:103AD200F583E4F0EF75F00AA424B2F582E43475BC
-:103AE200F583E4F0EF75F00AA424B3F582E43475AB
-:103AF200F5837401F0907635E004F0414790763C0E
-:103B0200740AF0E4A3F09076357403F090763CE00A
-:103B1200FF907635E0FEC39F400261D290763DE091
-:103B2200FF04F0EE75F00AA424AAF582E43475F5D8
-:103B320083EFF0EE75F00AA424ABF582E43475F558
-:103B420083E4F0EE75F00AA424ACF582E43475F552
-:103B520083745EF0EE75F00AA424ADF582E4347548
-:103B6200F58374BAF0EE75F00AA424AEF582E4345B
-:103B720075F5837405F0EE75F00AA424AFF582E4BE
-:103B82003475F5837480F0EE75F00AA424B0F582E2
-:103B9200E43475F583E4F0EE75F00AA424B1F582FD
-:103BA200E43475F583E4F0EE75F00AA424B2F582EC
-:103BB200E43475F5837415F0EE75F00AA424B3F5B8
-:103BC20082E43475F583E4F0907635E004F0610E1A
-:013BD20022D0
-:103BD300E4907636F0E0FB75F00FA42441F582E41F
-:103BE3003475F5837440F0EB75F00FA42442F5822D
-:103BF300E43475F583740AF0EB75F00FA42443F5F0
-:103C030082E43475F5831237C80000AC44EB75F0D9
-:103C13000FA42447F582E43475F5831237C80000F6
-:103C2300AC44EB75F00FA4244BF582E43475F583B3
-:103C33001237C800017700907636E004F0E0FB7598
-:103C4300F00FA42441F582E43475F5837440F0EB5E
-:103C530075F00FA42442F582E43475F583748CF077
-:103C6300EB75F00FA42443F582E43475F583123722
-:103C7300C80000AC44EB75F00FA42447F582E4348C
-:103C830075F5831237C80000AC44EB75F00FA4241C
-:103C93004BF582E43475F5831237C8000177009041
-:103CA3007636E004F0E0FF75F00FA42441F582E4DA
-:103CB3003475F5837440F0EF75F00FA42442F58258
-:103CC300E43475F583748FF0907636E004F0E0FF0A
-:103CD30075F00FA42441F582E43475F5837441F043
-:103CE300EF75F00FA42442F582E43475F5837484F0
-:103CF300F0907636E004F0E0FF75F00FA42441F570
-:103D030082E43475F5837461F0EF75F00FA42442F7
-:103D1300F582E43475F5837481F0907636E004F02F
-:103D2300E0FF75F00FA42441F582E43475F5837444
-:103D330061F0EF75F00FA42442F582E43475F58346
-:043D43007401F022F5
-:103D4700C0E0C0F0C083C082C0D0E8C0E0E9C0E0F6
-:103D5700EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EFB1
-:103D6700C0E0907FA2E090767FF0907F74E090763D
-:103D770087F0907F75E0907688F0907F98E0440216
-:103D8700F0907696E0FF20E10C4402F0908003F07B
-:103D9700D232124AC490767FE020E250907687E0D4
-:103DA700FEA3E07C002400F534EC3EF533907698D2
-:103DB700E0FDAE33AF341236D8907687EFF0D22FCE
-:103DC700303129203F26C231907F94E054CFF090C4
-:103DD7007F9AE030E404D22DC22C907F9AE020E550
-:103DE70004C22DD22C907F94E04430F0124A501236
-:103DF7001B04302F12124216C22F75E80112168AC1
-:103E070075E80DD22B800575E801C22B202B349065
-:103E17007619E0FFB4010E90767C7467F0A3740600
-:103E2700F0A3740BF0EFB4020B90767CE4F0A3F0F0
-:103E3700A3740CF0EFB4030B90767CE4F0A3F0A32B
-:103E47007418F075CAD375CBFED2CA303404C234A5
-:103E57008002D2345391EF907FAB7402F0F0907FE1
-:103E670098E054FDF0D0E0FFD0E0FED0E0FDD0E0D8
-:103E7700FCD0E0FBD0E0FAD0E0F9D0E0F8D0D0D029
-:083E870082D083D0F0D0E032BC
-:103E8F00907692E014601D147002E14424026002E7
-:103E9F00E1D49076947401F0908000F0E490768EE7
-:103EAF00F0D23122907619E0FFB4011BE4907FF23B
-:103EBF00F0907FF37430F0907FFF74FCF090769762
-:103ECF00E054FDF054FBF0EFB4021BE4907FF2F0EE
-:103EDF00907FF37434F0907FFF74FCF0907697E04E
-:103EEF004402F054FBF0EFB40318E4907FF2F0902B
-:103EFF007FF37464F0907FFF74FCF0907697E0444A
-:103F0F0004F0907694E04401F0908000F0303F0987
-:103F1F00907697E054FEF08007907697E04401F09A
-:103F2F00907697E0908002F09076987404F09076F7
-:103F3F008E7401F022907619E0FFB4011BE4907F9C
-:103F4F00F2F0907FF37444F0907FFF74FCF0907662
-:103F5F0097E054FDF054FBF0EFB4021BE4907FF2B6
-:103F6F00F0907FF3744CF0907FFF74FCF090769795
-:103F7F00E04402F054FBF0EFB40318E4907FF2F04A
-:103F8F00907FF37494F0907FFF74FCF0907697E03D
-:103F9F004404F0907694E054FEF0908000F0303FAF
-:103FAF0009907697E054FEF08007907697E04401F1
-:103FBF00F0907697E0908002F09076987406F090EB
-:063FCF00768E7402F02260
-:103FD500C0E0C083C0825391EF907FAAE04402F015
-:103FE500907FC7E0F511750F00750D00D233D082B3
-:053FF500D083D0E03292
-:063FFA00124AC4C231228C
-:10400000E511D3940050022106907689E0C394080C
-:10401000400221067440250FF582E4347EF583E0EA
-:10402000F517E50D600E908005E517F0907689E0B4
-:1040300004F001DAE5171237F940C1024067054084
-:104040007A0640980740C10C40C10D40C70F40CBD5
-:10405000F640CBF840CBFA40CBFB40CBFC40CBFE4C
-:1040600040CBFF000040DA907E41E0908005F09068
-:104070007689E004F07511018060907E41E09080C7
-:1040800005F0907E42E0908005F0907689E004F0A3
-:10409000E004F07511018042907E41E0908005F0CF
-:1040A000907E42E0908005F0907E43E0908005F0A5
-:1040B000907689E004F0E004F0E004F075110180EE
-:1040C00019D23BD23C8013D23B800F908005E5177C
-:1040D000F0907689E004F0751101203B04050D8015
-:1040E0001F303C1C907E41E0908005F0907E42E0C5
-:1040F000908005F0907689E004F0E004F0751101FD
-:10410000050F15110100E5117010C233F50DF50F03
-:0B411000907FC77404F0C23BC23C2249
-:10411B0090768DE064017027302708C227120800C3
-:10412B0012174A302808C22812387412174A302A3C
-:10413B000EE490768DF0C22A907FB4E04402F090AA
-:10414B00763FE0B40105E4F012326F907641E0B4B3
-:10415B000105E4F012349A907640E0B40103123476
-:10416B009A907F9BE020E402C23F907F9BE030E47B
-:10417B0002D23F907F9BE020E502C23E907F9BE006
-:10418B0030E502D23EA241303F01B3501FA23F9215
-:10419B0041303F09907697E054FEF0800790769778
-:1041AB00E04401F0907697E0908002F0303F34903D
-:1041BB007619E0FFB4010E90767C7467F0A3740659
-:1041CB00F0A3740BF0EFB4020BE490767CF0A3F049
-:1041DB00A3740CF0EFB4030BE490767CF0A3F0A384
-:1041EB007418F0A240303E01B3501FA23E924030F3
-:1041FB003E09907695E04404F08007907695E05464
-:0B420B00FBF0907695E0908001F0221F
-:10421600907619E064017035907687E0FFD3942D8F
-:10422600402B9076867401F0907685E004F0E0D31A
-:10423600940F4019E4F0EFD3943140089076197446
-:1042460003F080069076197402F0123E8F9076196C
-:10425600E0B4022C907687E0FFC3942F5022EFD370
-:10426600942A401C9076867401F0907685E004F0DE
-:10427600E0D3940F400AE4F090761904F0123E8FD2
-:10428600907619E0B40226907687E0D39431401DEB
-:104296009076867401F0907685E004F0E0D3940F72
-:1042A600400BE4F09076197403F0123E8F90761965
-:1042B600E06403703F907687E0FFC3945F503590CB
-:1042C60076867401F0907685E004F0E0D3940F4092
-:1042D60023E4F0EFC3942F500CEFD3942A400690BA
-:1042E60076197401F0EFD3942F4006907619740274
-:1042F600F0123E8F907686E07005907685F022E487
-:05430600907686F02214
-:10430B00E4907696F0908003F0907FE07490F090BC
-:10431B007FE17404F0E4907FDDF0907FA1F0538E89
-:10432B00F875880575B82075F801438E30F5C8759A
-:10433B00CA7F75CBF843A82012074AC22CC22DC2E4
-:10434B002BC22F907FFC74DDF0907FFF74FFF090F9
-:10435B007F97E04401F09076197401F0E490768534
-:10436B00F0A3F0907681F0907680F0124958120FFE
-:10437B00C6124A8D907F97E04408F0E054B9F0D212
-:10438B00302030181247B41230001240001242167F
-:10439B00124A50121B04121661124216C22FC2315E
-:1043AB00C232C234C233C229C227C228E4F51190EB
-:1043BB007689F090763FF0907641F0907640F090D1
-:1043CB00768AF0A3F0A304F0E4A3F0907699F022A0
-:1043DB00124DA3400281A0907FEBE024FE601E14DF
-:1043EB00604614606E1470028191240460028199FE
-:1043FB007405907FD4F07400907FD5F022907FEA03
-:10440B00E0FF1249FF8B208A218922EA496011CEF5
-:10441B00EACEEE907FD4F0CFE9CFEF907FD5F022AC
-:10442B00907FB4E04401F022907FEAE0FF1248B0A5
-:10443B008B208A218922EA496011CEEACEEE907F49
-:10444B00D4F0CFE9CFEF907FD5F022907FB4E0444A
-:10445B0001F022907FEAE0FF907EC0E0FDA3E0FB3D
-:10446B001217948B208A218922EA496011CEEACE59
-:10447B00EE907FD4F0CFE9CFEF907FD5F022907FF5
-:10448B00B4E04401F022907FB4E04401F022907F2D
-:05449B00B4E04401F053
-:0144A00022F9
-:1044A100C2AFD224907F937430F0907F9C74BBF0A4
-:1044B100907F96E04430F0E05430F0907F94743077
-:1044C100F0907F9D74CFF0907F9774A0F0907F95CE
-:1044D10074C0F0907F9E7403F0907F99E030E20900
-:1044E10090051974A0F0E4A3F0C225C222C223C230
-:1044F10026124AC4122DA9123BD3124559123A422F
-:104501009076687401F0700F124BBB1207FE124DCA
-:10451100A1121B4012149612430B907FAFE044018D
-:10452100F0907FAEE0441FF0907FAC74FFF0907F7D
-:10453100ADF0907FDEF0907FDFF0907FABF0907F69
-:10454100A9F0907FAAF05391EF43D820D2E843D845
-:084551002053A8A043A880221A
-:10455900E4907636F0E0FF75F003A42432F582E4A6
-:104569003475F583E4F0EF75F003A42433F582E4A0
-:104579003475F5837401F0907636E004F0E0FF7548
-:10458900F003A42432F582E43475F583E4F0EF7581
-:10459900F003A42433F582E43475F5837402F090B2
-:1045A9007636E004F0E0FF75F003A42432F582E4E6
-:1045B9003475F583E4F0EF75F003A42433F582E450
-:1045C9003475F5837403F0907636E004F0E0FF75F6
-:1045D900F003A42432F582E43475F583E4F0EF7531
-:1045E900F003A42433F582E43475F5837404F022CE
-:0C45F900787FE4F6D8FD7581380246405A
-:1046050002475AE493A3F8E493A34003F68001F22A
-:1046150008DFF48029E493A3F85407240CC8C333B6
-:10462500C4540F4420C8834004F456800146F6DF85
-:10463500E4800B0102040810204080900C8FE47E7A
-:10464500019360BCA3FF543F30E509541FFEE4937A
-:10465500A360010ECF54C025E060A840B8E493A341
-:10466500FAE493A3F8E493A3C8C582C8CAC583CA6C
-:10467500F0A3C8C582C8CAC583CADFE9DEE780BE24
-:10468500907FECE0907683F0E014601D14602A14AE
-:10469500603714604424047050907691E0907F0058
-:1046A500F0907FB57401F08047907692E0907F009E
-:1046B500F0907FB57401F08037907690E0907F00A0
-:1046C500F0907FB57401F08027907684E0907F00AC
-:1046D500F0907FB57401F08017907693E0907F009D
-:1046E500F0907FB57401F08007907FB4E04401F04D
-:0246F500D322CE
-:1046F700C0E0C0F0C083C082C0D0E8C0E0E9C0E03D
-:10470700EAC0E0EBC0E0ECC0E0EDC0E0EEC0E0EFF7
-:10471700C0E0C2CAC2CF907F98E04401F0302E03B8
-:104727001214A6907F98E054FEF053A8FA1216616F
-:10473700D0E0FFD0E0FED0E0FDD0E0FCD0E0FBD041
-:10474700E0FAD0E0F9D0E0F8D0D0D082D083D0F032
-:03475700D0E0327D
-:10475A00E4907666F01244A1202613907666E0C3B0
-:10476A009402500AE004F0D242124AF680EA302655
-:10477A0005122801C22630252B907696E054FCF0CB
-:10478A00908003F0121496907696E04403F090809D
-:10479A0003F0E4907667F0907667E004F0E0B44BBB
-:0A47AA00F6123FFA12411B80C522EF
-:1047B400E490769BF090769BE0FF04F0EF6008E0D5
-:1047C4002408F8E4F680EE907696E054FBF054F773
-:1047D400F0908003F0E4F518D235F50EF510D236DA
-:1047E400751211751322C237C239C238F516F51481
-:0B47F400F51AF50DC23BC23CC23D228D
-:10480000907FECE0907683F0E01460171460211440
-:10481000602B14603224047038907FEAE090769127
-:10482000F08035907FEAE0907692F0123E8F8028FB
-:10483000907FEAE0907690F0121800801B907FEA5B
-:10484000E0907684F08011907FEAE0907693F0809B
-:0A48500007907FB4E04401F0D3228A
-:10485A00E4907626F0907626E0FF75F003A42434DF
-:10486A00F582E43475F583E0FE907FECE0FDEE6DB1
-:10487A00600EEFC394045008907626E004F080D5C9
-:10488A00EFB40408907FB4E04401F022EF75F0031E
-:10489A00A42432F582E43475F583E0907F00F09029
-:0648AA007FB57401F0224D
-:0248B0008F2E49
-:1048B200E4F52F7530FF7531067532BEAB30AA3183
-:1048C200A9329000011236ABB4031FAF2F052FEFB0
-:1048D200652E7001221236927E0029FFEE3AC9EF50
-:1048E200C97530FFF531893280D27B007A007900B8
-:0148F20022A3
-:0C48F300C237E4F50EF510C236F51422B1
-:10490000022FE700023D4700024D4600024BD50052
-:10491000024B6000022FFF00024BED00024B8100B2
-:10492000024C0400023FD500024C1B00024C320036
-:10493000024C4900024C6000024C7700024C8E0091
-:10494000024CA500024CBC00024CD300024CEA0011
-:08495000024D0100024D1800A8
-:104958009076467480F0E4A3F0A3F0A3F0A3F0A34C
-:10496800F0A3F0A3F0A3F0A37480F0E4A3F0A3F005
-:10497800A3F0A3F0A3F0A3F0A37440F0E4A3F0A382
-:104988007440F0E4A3F0A3F0A3F0A3F0A3F0A3F025
-:10499800A37440F0E4A3F0A37440F0E4A3F0A3F000
-:0549A800A3F0A3F022C2
-:1049AD00E4907625F0907625E0FF75F003A424348D
-:1049BD00F582E43475F583E0FE907FECE0FDEE6D5D
-:1049CD00600EEFC394045008907625E004F080D576
-:1049DD00EFB40408907FB4E04401F022907EC0E073
-:1049ED00FEEF75F003A42432F582E43475F583EE01
-:0249FD00F022A6
-:1049FF00E4FE751DFF751E05751F12AB1DAA1EA9BE
-:104A0F001F9000011236AB6402702FCDEECD0EED6C
-:104A1F006F70012290000212370E85F01BF51C6299
-:104A2F001BE51B621CE51C621B29FDE51B3AC9ED4A
-:104A3F00C9751DFFF51E891F80C17B007A007900A3
-:014A4F002244
-:104A5000302D39C22D907619E0FFB4010DE4907627
-:104A60007CF0A374F8F0A3740AF0EFB4020DE490A4
-:104A7000767CF0A374F0F0A3740BF0EFB4030DE4B4
-:0D4A800090767CF0A374F8F0A37417F02278
-:104A8D00E4FF74562FF582E43476F583E0FE742846
-:104A9D002FF582E43480F583EEF0745E2FF582E419
-:104AAD003476F583E0FE74382FF582E43480F58397
-:064ABD00EEF00FBF08CC73
-:014AC30022D0
-:104AC400E4907236F0A3F0907F97E054FBF0E4900A
-:104AD4007233F0907232F090720104F0E490723309
-:104AE400F0907232F090720104F0907F97E04404E9
-:024AF400F022AE
-:104AF600907FD6E054FBF0E04408F0304204E044F6
-:104B060002F07FDC7E05124D2F907FD6E054F7F041
-:054B1600E04404F02260
-:104B1B00907FEBE0147014907FE9E0247F70041217
-:104B2B00485A22907FB4E04401F022907FB4E044D5
-:034B3B0001F02264
-:104B3E00907FEBE0147013907FE9E014700412493B
-:104B4E00AD22907FB4E04401F022907FB4E04401A6
-:024B5E00F02243
-:104B6000C0E0C083C0825391EF907FAB7410F0908F
-:104B70007696E054FDF0908003F0D082D083D0E0B0
-:014B80003202
-:104B8100C0E0C083C0825391EF907FAAE04401F05E
-:0F4B9100C22990768D7401F0D082D083D0E032AB
-:104BA000907FEAE0907682F0E4907691F0907692B1
-:0B4BB000F0907690F0907693F0D32206
-:104BBB00907FD6E030E712E04401F07F147E0012C4
-:0A4BCB004D2F907FD6E054FEF0223B
-:104BD500C0E0C083C082D2255391EF907FAB7408AB
-:084BE500F0D082D083D0E03251
-:104BED00C0E0C083C0825391EF907FA9E04401F0F3
-:074BFD00D082D083D0E0322A
-:104C0400C0E0C083C0825391EF907FA9E04402F0DA
-:074C1400D082D083D0E03212
-:104C1B00C0E0C083C0825391EF907FA9E04404F0C1
-:074C2B00D082D083D0E032FB
-:104C3200C0E0C083C0825391EF907FAAE04404F0A9
-:074C4200D082D083D0E032E4
-:104C4900C0E0C083C0825391EF907FA9E04408F08F
-:074C5900D082D083D0E032CD
-:104C6000C0E0C083C0825391EF907FAAE04408F077
-:074C7000D082D083D0E032B6
-:104C7700C0E0C083C0825391EF907FA9E04410F059
-:074C8700D082D083D0E0329F
-:104C8E00C0E0C083C0825391EF907FAAE04410F041
-:074C9E00D082D083D0E03288
-:104CA500C0E0C083C0825391EF907FA9E04420F01B
-:074CB500D082D083D0E03271
-:104CBC00C0E0C083C0825391EF907FAAE04420F003
-:074CCC00D082D083D0E0325A
-:104CD300C0E0C083C0825391EF907FA9E04440F0CD
-:074CE300D082D083D0E03243
-:104CEA00C0E0C083C0825391EF907FAAE04440F0B5
-:074CFA00D082D083D0E0322C
-:104D0100C0E0C083C0825391EF907FA9E04480F05E
-:074D1100D082D083D0E03214
-:104D1800C0E0C083C0825391EF907FAAE04480F046
-:074D2800D082D083D0E032FD
-:104D2F008E358F36E5361536AE35700215354E6039
-:074D3F000512148580EE222D
-:104D4600C0E0C083C0825391EF907FAB7404F0D073
-:064D560082D083D0E032A0
-:104D5C00907682E0907F00F0907FB57401F0D322C2
-:094D6C00C22553D8EF43D82032D0
-:074D75005398FE5398FD3234
-:074D7C0053C0FE53C0FD32DD
-:064D83005391BFD22D3256
-:064D890053917FD22C3291
-:044D8F005391DF322B
-:044D930053D8F732C8
-:044D9700121730229D
-:034D9B00C28D3294
-:034D9E00C28F328F
-:024DA100D3221B
-:024DA300D32219
-:024DA500D32217
-:024DA700D32215
-:024DA900D32213
-:024DAB00C32221
-:00000001FF
-/*
-Source: EMI62SFW.HEX
-VERSION=1.04.062
-DATE=16.10.2002
-*/
diff --git a/firmware/ess/maestro3_assp_kernel.fw.ihex b/firmware/ess/maestro3_assp_kernel.fw.ihex
deleted file mode 100644
index 933c4c375c2f..000000000000
--- a/firmware/ess/maestro3_assp_kernel.fw.ihex
+++ /dev/null
@@ -1,120 +0,0 @@
-:10000000807930008079B4038079B4038079FB0073
-:100010008079DD008079B4038079320380798702AA
-:100020008079B4038079B4038079B4038079B40310
-:1000300080791A038079B40380792F028079B40320
-:100040008079B4038079B4038079B4038079B403F0
-:100050008079630080796B008079B4038079B40380
-:1000600080BF7C2C0688048840BE20BC09AE0010EE
-:100070000AAE0100386908EB53005A6908EBD60054
-:100080000900888B806988E3360030BE20BC09698E
-:1000900001B8099041BE41BE286988EB780041BE95
-:1000A00040BE8079380041BE41BE3A90386908E3CD
-:1000B00056003A9041BE40BE00EF3A90396908E3DD
-:1000C0005E003A9000EF0B690C668CEF0A690C66D3
-:1000D0000B62096600EF10690F6604EF88E3750094
-:1000E0000E690F6610620D6600EF0E690D6600EF77
-:1000F00070AE010020BC27AE0100396908EB5D003D
-:10010000266901B826902600888B806988E3CB0099
-:100110002890280D114200E17A00114700E1A0006B
-:10012000807A630011B80A66096204E37A000B0C56
-:1001300005400A1001BA1290120C02408079AF00FB
-:10014000807A6B0002BE0E620D6610BA44E37A003C
-:10015000100C05400E1001BA1290120C0240031050
-:1001600002BA1290120C0040031088E3BA00041087
-:100170008079BC00041001BA1290120C0140050CE9
-:100180000340060C04401110B0BFFF011290120C86
-:10019000064020BC00EF26AE28107069D0BF0100D9
-:1001A000709088E37A0028AE000000EF70AE000384
-:1001B000700C0CB05AAE000000EF807A8A037F69A1
-:1001C00001B87F905600888BA00C08B071AF00B0CA
-:1001D000714E00E2F30056AE57105600A00C08B066
-:1001E00056808079A1031008A0BF591004E3A10331
-:1001F00056808079A103807A8A0301BF43BE59BE2D
-:100200007C90376988E30D0101BA08E30C0171AEF7
-:100210000400710C0050366937900ABF9E108A8B1B
-:1002200080AF1480804C0ABF600500F50ABF20052E
-:1002300000B917BBA090176988E34801170D00E1CA
-:1002400027010CBF78050DBF7C0580792B010CBF01
-:1002500038050DBF3C05006908E335018C8B59BE9C
-:1002600007BBA09020BC807957010C038B8B03B98E
-:100270000988C6BE3E01AC69AB90AD69AB9013086E
-:100280000A6644E3440109030C8320BC80795701CA
-:10029000556988E35701387C0BBF780500F50BBF23
-:1002A000380507B90988C6BE5601AB10AA90746913
-:1002B00088E3630172AE400500F572AE000561AEE1
-:1002C0003B10807AF602786988E382018C8B0CBF40
-:1002D000600500E5407C140820BA12883D73807ADE
-:1002E00080033E73807A80038C8B0CBF6C0500E525
-:1002F000407C14082CBA12883F73807A80034073C4
-:10030000807A8003756988E38E0172AE480500F536
-:1003100072AE080561AE4110807AF602796988E311
-:10032000AD018C8B0CBF600500E5407C140818BA49
-:1003300012884373807A80034473807A80038C8BA5
-:100340000CBF6C0500E5407C140824BA1288457384
-:10035000807A80034673807A8003766988E3B901E6
-:1003600072AE580500F572AE180561AE4710807A7E
-:10037000F6027A6988E3D8018C8B0CBF600500E532
-:10038000407C140808BA12884973807A80034A7343
-:10039000807A80038C8B0CBF6C0500E5407C1408D0
-:1003A00014BA12884B73807A80034C73807A80036E
-:1003B00021BC1CAE90108A8B0ABF600500E5407C12
-:1003C000120804B813888D8B0DBF6C0500E5407CC6
-:1003D000150804B81188807A4A038A8B0ABF600521
-:1003E00000E5407C1F7303B90988C6BEF9018A5431
-:1003F00003BEA098207303B90988C6BE01028A54BF
-:1004000003BEA098201F1F2F269820BC356988E3C3
-:10041000A103336901B83390A0BFEE0208E3A10342
-:10042000339000BF516988E31F02347380BE605768
-:1004300003BE7E9F59BE34907E69510D139020BC3F
-:100440005C6988E3A1035E7380BE605703BE7E9F34
-:1004500059BE5E907E695C0D13908079A103807A0D
-:100460008A0301BF43BE776988E34E0261AE4D1037
-:100470006100888B806988E34E027190710D0B00DA
-:10048000A0AF1080A0AF108010080A6608E34902F0
-:10049000090010080C6688E34E020B8020BC7B69C3
-:1004A00088E3A1030ABF9E108A8B80AF1480804C22
-:1004B00000E166027C6990BF6005729072037C69FE
-:1004C00090BF640573907304807970027C6990BF5B
-:1004D0002005729072037C6990BF240573907304A9
-:1004E0007C6901B87C900ABFFD108A8B80AF1080B8
-:1004F0004F738A5403BE809821BC26738B5403BE6D
-:100500008B618C9803BE806180988079A103807A8A
-:100510008A03280D114700E1BE0212AF064012699E
-:10052000B0BF000C88E3B602A0BF000888E3B202A7
-:100530001269B0BF000CA0BF000488E3A3020969E0
-:100540000B908079A5020BAF054001690590026907
-:100550000690114300E1ED021169C0BF0020119027
-:100560008079ED0209690B908079B8020BAF0540E4
-:1005700005AF034006AF04408079ED0212AF06409C
-:100580001269B0BF000C88E3E702A0BF000888E34F
-:10059000E3021269B0BF000CA0BF000488E3D402DC
-:1005A0000D6910908079D60210AF05400169059061
-:1005B00002690690114300E1ED021169C0BF0020FD
-:1005C00011908079ED020D6910908079E90210AFE9
-:1005D000054005AF034006AF044020BC7069719030
-:1005E000807A7800716970908079A10320BC6103E2
-:1005F0008B8B806988EF7202720304787190710DA1
-:100600008A8B0B0003B90988C6BE0903A869AB90A1
-:10061000A869AA9010080A6644E30F0309001008AD
-:100620000C6688E314030B8020BC616901B86190FB
-:100630008079F702807A8A03355D0100346901B858
-:1006400034900ABF9E108A8B80AF1480804872AEAF
-:10065000500500F572AE100561AE5110807AF602B9
-:100660008079A103807A8A03355D02005E6901B852
-:100670005E900ABF9E108A8B80AF1480804772AE56
-:10068000580500F572AE180561AE5C10807AF6026E
-:100690008079A1031C00888B806988EF1D901D0D57
-:1006A0000F1010668CE358030E6910660F620D661A
-:1006B0000FBA01E37A0310048A8B03B90988C6BE16
-:1006C0006C038C6AAA61AB988C6AAB61AD988C6A3A
-:1006D000AD61A9988C6AA961AA98047C8B8B047C73
-:1006E0008D8B047C898B047C14080E6608E37903E7
-:1006F0000D04108421BC1C6901B81C9080794A0348
-:1007000003B909888A8BC6BE8803AC5403BE8C61CA
-:10071000AA9800EF20BC46BE09086B900A086C90AE
-:100720000B086D901A0862901B0863901E08649075
-:1007300059BE1E88658066816782688369846A8580
-:1007400000EF20BC6B6909886C690A886D690B88A9
-:1007500062691A8863691B8864691E88650066017E
-:0A0760006702680369046A053ABEE7
-:00000001FF
diff --git a/firmware/ess/maestro3_assp_minisrc.fw.ihex b/firmware/ess/maestro3_assp_minisrc.fw.ihex
deleted file mode 100644
index d2c0031dadf2..000000000000
--- a/firmware/ess/maestro3_assp_minisrc.fw.ihex
+++ /dev/null
@@ -1,51 +0,0 @@
-:1000000080BF1E106E906E00888B806988EF6F90A5
-:100010006F0D006908EB120420BC6E6901B86E9088
-:10002000807903040EB9078843BE01BF47BE41BEB5
-:10003000807A2A0040BE2930CCEF41BE807A280069
-:1000400040BE2830CCEF076908E32A0409692C90E8
-:1000500080792C040D692C9009101A880A1001BAB5
-:100060001B880D101C880E1001BA1D8880BFED0082
-:100070001E880C05240104B92790186908E3B3040D
-:100080002D901369A0BF987504F72DAEFF008D8BDE
-:10009000196908E363041A6908E3560407B9098873
-:1000A000C6BE5304A910AD9080797C0403B90988B9
-:1000B000C6BE60048918226CAD90A910236E226C14
-:1000C000AD9080797C041A1008E36F0403B90988A5
-:1000D000C6BE6C04A910A090AD9080797C0401B9D3
-:1000E0000988C6BE7B048918226CA090AD90A91027
-:1000F000236E226CA090AD902D6908E39C0424012E
-:1001000003B702B91888898B2C028A10047CA0904E
-:100110002B691F88807E5B052A690988898BA099D5
-:100120008A10A0902B691F88807E5B052A69098848
-:10013000898BAF99997B840424010F061B1013202F
-:100140001B90A0BFFF7F44E3AC041B90898B807A97
-:100150001A05276901BA2790807A2305276908E3E1
-:100160009E0480790F052406261013202690A0BF38
-:10017000FF7F04E3C0048D8B807A1A058079B40474
-:100180002690131026301B908D8B807A1A05807A6A
-:100190002305271001BA279008E3B40424010F06B1
-:1001A000898B1A6908E3EA04196988E3E00403B952
-:1001B0000988C6BEDD04A01FAE2FA99880790F055F
-:1001C00001B9188807B90988C6BEE704EE10A990DE
-:1001D00080790F05196908E3FE0403B9098846BE52
-:1001E000C6BEFA04A0171EBEAE1FBFBF00FF13BEDF
-:1001F000DFBF8080A99947BE80790F0501B90988C2
-:10020000C6BE0E05A016A026B7BF00FF1EBEA01ECC
-:10021000AE2EBFBF00FF13BEDFBF8080A9990C8543
-:100220000F86076988E31605070D108559BE1E88DD
-:100230004ABE00EF1E101C901F101D90A0101E90B3
-:10024000A0101F9000EF1E101C3020901B73205434
-:1002500003BE259825101C2025902573145403BE39
-:100260008E8B80982F6988E3390559BE07BB806162
-:100270008098A08B1F101D3021901B73215403BE4A
-:100280002E982E101D202E902E73155403BE80988C
-:100290002F6988E34F0559BE07BB80618098A08B0A
-:1002A000186908EF2573165403BEA0982E731754CF
-:1002B00003BEA09800EFA08BC6BE6B0559BE04BB61
-:1002C00090AA04BE1EBEE099E08BA069D090A06900
-:1002D000D0901F0805B81F88908BA069D090A069A6
-:1002E0009090D08BD88B1FBE00EF00000000000064
-:1002F00000000000000000000000000000000000FE
-:1003000000000000000000000000000000000000ED
-:020310000000EB
-:00000001FF
diff --git a/firmware/ihex2fw.c b/firmware/ihex2fw.c
deleted file mode 100644
index 08d90e25abf0..000000000000
--- a/firmware/ihex2fw.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Parser/loader for IHEX formatted data.
- *
- * Copyright © 2008 David Woodhouse <[email protected]>
- * Copyright © 2005 Jan Harkes <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <stdint.h>
-#include <arpa/inet.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#define _GNU_SOURCE
-#include <getopt.h>
-
-
-struct ihex_binrec {
- struct ihex_binrec *next; /* not part of the real data structure */
- uint32_t addr;
- uint16_t len;
- uint8_t data[];
-};
-
-/**
- * nybble/hex are little helpers to parse hexadecimal numbers to a byte value
- **/
-static uint8_t nybble(const uint8_t n)
-{
- if (n >= '0' && n <= '9') return n - '0';
- else if (n >= 'A' && n <= 'F') return n - ('A' - 10);
- else if (n >= 'a' && n <= 'f') return n - ('a' - 10);
- return 0;
-}
-
-static uint8_t hex(const uint8_t *data, uint8_t *crc)
-{
- uint8_t val = (nybble(data[0]) << 4) | nybble(data[1]);
- *crc += val;
- return val;
-}
-
-static int process_ihex(uint8_t *data, ssize_t size);
-static void file_record(struct ihex_binrec *record);
-static int output_records(int outfd);
-
-static int sort_records = 0;
-static int wide_records = 0;
-static int include_jump = 0;
-
-static int usage(void)
-{
- fprintf(stderr, "ihex2fw: Convert ihex files into binary "
- "representation for use by Linux kernel\n");
- fprintf(stderr, "usage: ihex2fw [<options>] <src.HEX> <dst.fw>\n");
- fprintf(stderr, " -w: wide records (16-bit length)\n");
- fprintf(stderr, " -s: sort records by address\n");
- fprintf(stderr, " -j: include records for CS:IP/EIP address\n");
- return 1;
-}
-
-int main(int argc, char **argv)
-{
- int infd, outfd;
- struct stat st;
- uint8_t *data;
- int opt;
-
- while ((opt = getopt(argc, argv, "wsj")) != -1) {
- switch (opt) {
- case 'w':
- wide_records = 1;
- break;
- case 's':
- sort_records = 1;
- break;
- case 'j':
- include_jump = 1;
- break;
- default:
- return usage();
- }
- }
-
- if (optind + 2 != argc)
- return usage();
-
- if (!strcmp(argv[optind], "-"))
- infd = 0;
- else
- infd = open(argv[optind], O_RDONLY);
- if (infd == -1) {
- fprintf(stderr, "Failed to open source file: %s",
- strerror(errno));
- return usage();
- }
- if (fstat(infd, &st)) {
- perror("stat");
- return 1;
- }
- data = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, infd, 0);
- if (data == MAP_FAILED) {
- perror("mmap");
- return 1;
- }
-
- if (!strcmp(argv[optind+1], "-"))
- outfd = 1;
- else
- outfd = open(argv[optind+1], O_TRUNC|O_CREAT|O_WRONLY, 0644);
- if (outfd == -1) {
- fprintf(stderr, "Failed to open destination file: %s",
- strerror(errno));
- return usage();
- }
- if (process_ihex(data, st.st_size))
- return 1;
-
- return output_records(outfd);
-}
-
-static int process_ihex(uint8_t *data, ssize_t size)
-{
- struct ihex_binrec *record;
- uint32_t offset = 0;
- uint32_t data32;
- uint8_t type, crc = 0, crcbyte = 0;
- int i, j;
- int line = 1;
- int len;
-
- i = 0;
-next_record:
- /* search for the start of record character */
- while (i < size) {
- if (data[i] == '\n') line++;
- if (data[i++] == ':') break;
- }
-
- /* Minimum record length would be about 10 characters */
- if (i + 10 > size) {
- fprintf(stderr, "Can't find valid record at line %d\n", line);
- return -EINVAL;
- }
-
- len = hex(data + i, &crc); i += 2;
- if (wide_records) {
- len <<= 8;
- len += hex(data + i, &crc); i += 2;
- }
- record = malloc((sizeof (*record) + len + 3) & ~3);
- if (!record) {
- fprintf(stderr, "out of memory for records\n");
- return -ENOMEM;
- }
- memset(record, 0, (sizeof(*record) + len + 3) & ~3);
- record->len = len;
-
- /* now check if we have enough data to read everything */
- if (i + 8 + (record->len * 2) > size) {
- fprintf(stderr, "Not enough data to read complete record at line %d\n",
- line);
- return -EINVAL;
- }
-
- record->addr = hex(data + i, &crc) << 8; i += 2;
- record->addr |= hex(data + i, &crc); i += 2;
- type = hex(data + i, &crc); i += 2;
-
- for (j = 0; j < record->len; j++, i += 2)
- record->data[j] = hex(data + i, &crc);
-
- /* check CRC */
- crcbyte = hex(data + i, &crc); i += 2;
- if (crc != 0) {
- fprintf(stderr, "CRC failure at line %d: got 0x%X, expected 0x%X\n",
- line, crcbyte, (unsigned char)(crcbyte-crc));
- return -EINVAL;
- }
-
- /* Done reading the record */
- switch (type) {
- case 0:
- /* old style EOF record? */
- if (!record->len)
- break;
-
- record->addr += offset;
- file_record(record);
- goto next_record;
-
- case 1: /* End-Of-File Record */
- if (record->addr || record->len) {
- fprintf(stderr, "Bad EOF record (type 01) format at line %d",
- line);
- return -EINVAL;
- }
- break;
-
- case 2: /* Extended Segment Address Record (HEX86) */
- case 4: /* Extended Linear Address Record (HEX386) */
- if (record->addr || record->len != 2) {
- fprintf(stderr, "Bad HEX86/HEX386 record (type %02X) at line %d\n",
- type, line);
- return -EINVAL;
- }
-
- /* We shouldn't really be using the offset for HEX86 because
- * the wraparound case is specified quite differently. */
- offset = record->data[0] << 8 | record->data[1];
- offset <<= (type == 2 ? 4 : 16);
- goto next_record;
-
- case 3: /* Start Segment Address Record */
- case 5: /* Start Linear Address Record */
- if (record->addr || record->len != 4) {
- fprintf(stderr, "Bad Start Address record (type %02X) at line %d\n",
- type, line);
- return -EINVAL;
- }
-
- memcpy(&data32, &record->data[0], sizeof(data32));
- data32 = htonl(data32);
- memcpy(&record->data[0], &data32, sizeof(data32));
-
- /* These records contain the CS/IP or EIP where execution
- * starts. If requested output this as a record. */
- if (include_jump)
- file_record(record);
- goto next_record;
-
- default:
- fprintf(stderr, "Unknown record (type %02X)\n", type);
- return -EINVAL;
- }
-
- return 0;
-}
-
-static struct ihex_binrec *records;
-
-static void file_record(struct ihex_binrec *record)
-{
- struct ihex_binrec **p = &records;
-
- while ((*p) && (!sort_records || (*p)->addr < record->addr))
- p = &((*p)->next);
-
- record->next = *p;
- *p = record;
-}
-
-static int output_records(int outfd)
-{
- unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0};
- struct ihex_binrec *p = records;
-
- while (p) {
- uint16_t writelen = (p->len + 9) & ~3;
-
- p->addr = htonl(p->addr);
- p->len = htons(p->len);
- if (write(outfd, &p->addr, writelen) != writelen)
- return 1;
- p = p->next;
- }
- /* EOF record is zero length, since we don't bother to represent
- the type field in the binary version */
- if (write(outfd, zeroes, 6) != 6)
- return 1;
- return 0;
-}
diff --git a/firmware/kaweth/new_code.bin.ihex b/firmware/kaweth/new_code.bin.ihex
deleted file mode 100644
index 292d40f4f334..000000000000
--- a/firmware/kaweth/new_code.bin.ihex
+++ /dev/null
@@ -1,206 +0,0 @@
-:10000000B6C3AABBCCDD9FCFDE06E7570000C4060F
-:1000100097C1E767FF1F28C0E787000424C0E76790
-:10002000FFF922C097CFD70900C0E709A2C0BE06DA
-:100030009FAF3600E70500C0A7CFBC0697CFE757B4
-:100040000000B806A7A1B80697CFE757000014082C
-:100050000AC0E7570000A4C0A7C07A069FAF920766
-:10006000E70700001408E757FFFFBA069FA0380013
-:10007000E759BA06BE069FA03800C809CA0608623A
-:100080009FA13608C00976060060A7C07A069FAF18
-:10009000CC02E7570000B806A7C17A069FAF04005C
-:1000A000E75700008E060AC1E70920C01008E7D014
-:1000B0001008E767400010089FAF920CC009D006F7
-:1000C000006005C4C059BE0602C09FAFEC009FAFE0
-:1000D0003402E7570000A6069FA07A02A7CF7A064F
-:1000E0004802E709BE06D006C83704009FAF0803E0
-:1000F00097CFE7570000CE0697C0D70900C0C1DFF1
-:10010000C809C606086214C02704C6061094F00782
-:1001100010080200C107010070000400F007300160
-:10012000060050AFE707FFFFD006E7070000CE0646
-:10013000E70500C097CFD70900C0C1DF4802D0094A
-:10014000C6062702C606E70500C097CF4802C83793
-:100150000400000C0C00006021C0C0373E0023C921
-:10016000C057B4051BC8C0173F00C067C0FF3000B0
-:100170000800F007000004000002C0174C00300027
-:100180000600F007A0010A004802C1070200D709D3
-:1001900000C0C1DF51AFE70500C097CF9FAF080394
-:1001A0009FAF7A0297CF9FAF7A02C9370400C1DFB1
-:1001B000C809A20650026702A206D107000027D88C
-:1001C000AA06C0DF9FAFC40197CFE7570000D20651
-:1001D00097C1E7570100A80697C0C809A0060862A2
-:1001E00097C00002C0170E0027003401270C0C0036
-:1001F0003601E70750C312C0E707CC0B0200E70740
-:100200000100A806E707050090C097CFC809A4061B
-:10021000086202C0106407C1E70700009E06E707F6
-:100220007204240097CF2704A406C8170E002702E3
-:100230009E06E7078004240097CFD70900C0C1DFDE
-:10024000E7570000900613C19FAF0602E757000072
-:100250009E0613C0E7099E063001E707F20532014A
-:10026000E707100096C0E7099E06900604CFE757FF
-:1002700000009E0602C19FAF0602E70500C097CFAF
-:10028000D70900C0C1DF0892E7570200AA0602C3DF
-:10029000C809A4062702A606086203C1E70500C034
-:1002A00097CF2704A406E70500C0F0074000080028
-:1002B000F007000004000002C0170C003000060028
-:1002C000F00746010A00C8170400C107020051AF39
-:1002D00097CFE7570000960697C0C1DFC80996067A
-:1002E000270496062752980603C1E7079606980644
-:1002F000C0DF1702C8170E009FAFBA03C805006021
-:1003000003C09FAF240397CF9FAF080397CF570237
-:10031000C907A406D70900C0C1DF08621BC050048A
-:100320001102E70500C0C90597CF9702CA09D60692
-:10033000F21701000400F22700000600CA172C0083
-:10034000F87701000E0006C0CAD9F857FF000E006A
-:1003500001C1CAD9221C0C00E2270000E2170100EB
-:10036000E2270000CA05000C0C00C0174100C0675E
-:10037000C0FF300008000002C0170C00300006006B
-:10038000F007DA000A00F00700000400000C080083
-:1003900040D10100C019CE06C059C20604C949AFF8
-:1003A0009FAFEC004AAF6710CE06C8170400C10724
-:1003B0000100D70900C0C1DF50AFE70500C097CFEB
-:1003C000C0070100C109AC06C177010097C1D87709
-:1003D000010012C0C9076A069FAF080404C1C177B3
-:1003E000080013C097CFC177020097C1C1771000F2
-:1003F0000CC09FAF2C0497CFC177040006C0C9077B
-:1004000070069FAF080497C000CF009097CF50545C
-:1004100097C1705C0200020097C1705C0400040088
-:1004200097CF8001C0006000300018000C0006006B
-:100430000000CB09B206CC09B4060B5311C0C902A7
-:10044000CA071C049FAF080497C00AC882080ACFD5
-:1004500082089FAF080497C005C28930826078C1C6
-:10046000009097CF8910095379C2893082087ACFDA
-:10047000C0DF97CFC0DF97CFE70996C09206E709A4
-:1004800098C094060FCFE70996C09206E70998C076
-:100490009406E7099E063001E707F2053201E707F7
-:1004A000100096C0D70900C01702C8099006C837C7
-:1004B0000E00E7772A00920630C09702CA09D606D6
-:1004C000E777200092060EC0F21701001000F22715
-:1004D00000001200E7770A009206CA051EC09702C4
-:1004E000CA09D606F21701000C00F22700000E0020
-:1004F000E7770200920607C0F21701004400F227D6
-:100500000000460006CFF21701006000F22700004D
-:100510006200CA059FAF08030FCF57020902F10915
-:1005200094060C00F1DA0C00C80998065002670224
-:100530009806D1070000C905E7099E069006E7570F
-:100540000000900602C09FAF0602C805E70500C084
-:10055000C0DF97CFD70900C0170017029702C00964
-:1005600092C0E707040090C0CA09D606E70700005A
-:10057000A806E7076A040200C077020008C0F21765
-:1005800001005000F227000052009FCF2406C077E0
-:10059000100006C0F21701005800F22700005A00B0
-:1005A000C077800006C0F21701007000F22700003B
-:1005B0007200C07708001DC1F21701000800F22781
-:1005C00000000A00C077000206C0F21701006400B4
-:1005D000F22700006600C077400006C0F217010055
-:1005E0005C00F22700005E00C077010001C01BCF55
-:1005F0001ACFF21701000000F22700000200C8091C
-:100600003401CA171400D877010005C0CAD9D857D9
-:10061000FF0001C0CAD9E21994C0E2270000E21726
-:100620000100E22700009FAF40069FAFC401E757DB
-:100630000000D2069FA10E0ACA05C805C005E7053D
-:1006400000C0C0DF97CFC809A006086297C0270482
-:10065000A0062752A20603C1E707A006A2069FAF85
-:100660000803E7570000AA0602C027DAAA0697CFB8
-:10067000FFFFFFFFFFFF0000000000000000000080
-:10068000000000000000000000000000000000006A
-:10069000000000000000000000000000000000005A
-:1006A000000000000000000000000000000000004A
-:1006B000000000000000000000000000000000003A
-:1006C00000000000000000003F00000000000000EB
-:1006D000000000000000FFFF01000000000000001B
-:1006E000FFFFFB13E7570080B20006C2E707EE0BDF
-:1006F0001200E707340CB200E707C607F202C80988
-:10070000B400F80702000D00D7090EC0E70700008B
-:100710000EC0C809DE00C8170900C907DA06C007FD
-:100720000400680A00DA7DC1E709C0007C06E70919
-:10073000BE007806E7091000BC06C807D6079FAFC1
-:10074000AE079FAF000AC809DE00000E0F004190FF
-:100750009FDE060044AF2700B2062700B40627003C
-:10076000B606C007740044AF2700D6060800009004
-:10077000C1073A00200001DA7DC19FAFBA09C00766
-:10078000440048AF27007A069FAF960AE7070100AA
-:10079000C006E7050EC097CF49AFE78743000EC0FC
-:1007A000E707FFFFBE069FAFAE0AC007010060AFBC
-:1007B0004AAF97CF00080908110800DA7CC197CF2B
-:1007C0006704CC02C0DF5194B1AF0600C1DFC90994
-:1007D000CC02496275C1C0DFA7CFD6020E0024004B
-:1007E000800422004E05D0000E0AAA003008BE0088
-:1007F0004A0A1000200004006E0402006A04060089
-:10080000000024C0040428C0FEFB1EC0000422C057
-:10081000FFF4C000900900000000FFFF56086008C8
-:10082000D008DA0800090409080932094209500908
-:1008300052095A095A092702CA0697CFE70700004A
-:10084000CA060A0E0100CA570E009FC35A09CA37CA
-:1008500000009FC25A090AD2B2CF1608C809DE00AA
-:1008600007069FCF6C091702C809DE00000E0F00B3
-:1008700041909FDE0600C805305006009FC85A0907
-:10088000270C0200B006C009B2062700B406E7072D
-:100890000000AE0627008006001C06002700B606F2
-:1008A00041906750B0060DC067007E06270C060019
-:1008B0008206E707BC088406C8077E06419051AF50
-:1008C00097CF9FAF480CE709B606B406E709B00614
-:1008D000AE0659AF97CF270C0200AC0659AF97CFA1
-:1008E000090C020009DA49D2C919D606C8077E06E2
-:1008F000E00700006002E0070400D007CC0848DBF6
-:10090000419050AF97CF59AF97CF59AF97CFF0578E
-:100910000600060025C1E7077006800641906700C3
-:100920007E06270C06008206E7078C098406C807A6
-:100930007E06419051AF97CF070C0600C7570600BF
-:100940000FC1C807700615CF000C020000DA40D1B5
-:100950002700C2061ECF1DCF270C0200CC0619CFE0
-:1009600027022001E70708002201E7071300B0C0B3
-:1009700097CF419067007E06E70182062702800636
-:10098000E7078C098406C8077E06C107008050AFC0
-:1009900097CF59AF97CF006005C0E7070000C406A6
-:1009A000A7CF7C069FAF000AE7070100C40649AF46
-:1009B000D70900C007AFE70500C04AAFA7CF7C0644
-:1009C000C007FE7F44AF4000C03700014190C037F0
-:1009D0000800DFDE5006C057100002C2C00710003A
-:1009E00027009A0641909FDE400644AF27009C06F0
-:1009F000C0099A06419000D200D89FDE080044AF9B
-:100A00002700C80697CFE787008428C0E767FFFB69
-:100A100024C097CFE7870100D206E7570000A80659
-:100A200097C19FAF000AE787000622C0E7070000D2
-:100A300090C0E767FEFF3EC0E70726000AC0E787D1
-:100A400001003EC0E707FFFFBE069FAF100B97CF28
-:100A50001700A7AF7806C00527007606E7870100D4
-:100A6000D2069FAF000AE7070C0040C09FAF100BF3
-:100A700000902700A6062700AA06E709B206B406DA
-:100A80002700AE062700AC069FAFAE0AC0070000E5
-:100A90002700B2022700B40227008E06C007060016
-:100AA000C809DE00C8170300C9077006290A00DA62
-:100AB0007DC197CFD70900C0C1DF009027009606FF
-:100AC000E707960698062700A006E707A006A206F5
-:100AD0002700A6062700900627009E06C8099C0648
-:100AE000C1099A06C907A40611020902C8174006DF
-:100AF00001DA7AC15194C809C806C907C606C109F6
-:100B00009A0611020902C817080001DA7AC1519445
-:100B1000E70500C097CFE7570000760697C09FAF64
-:100B20000400E709BE06BA06E757FFFFBA0604C18C
-:100B3000E707100BB80697CFE7173200BA06E7674A
-:100B4000FF07BA06E707460BB80697CFE75700003E
-:100B5000C00623C0E707040090C0E707008080C0FC
-:100B6000E707000080C0E707008080C0C0070000E2
-:100B7000C0070000C0070000E707000080C0E707CB
-:100B8000008080C0E707008040C0C0070000E70782
-:100B9000000040C0E707000080C0E707040090C0E5
-:100BA000E707000240C0E7070C0240C0E70700006B
-:100BB000C006E7070000B806E7070000D206D7091D
-:100BC00000C0C1DF9FAF3402E70500C09FAFC40182
-:100BD00097CFD70900C0170017029702E757000008
-:100BE000A80606C0C00992C0C07709029FC15C0573
-:100BF0009FCF3206D7090EC0E70700000EC09FAF97
-:100C0000020CE7050EC097CFD70900C01702C8092C
-:100C1000B0C0E767FE7FB0C0C87700209FC164EB1B
-:100C2000E7570000C8029FC180EBC899CA02C86795
-:100C300004009FC196EB9FCF4CEBE7070000A6C0D6
-:100C4000E709B0C0C802E7070300B0C097CFC009EA
-:100C5000B006C037010097C9C909B2060200419029
-:100C60004802C91706009FAF08049FA2720C02DA5F
-:100C700077C1416071C197CF170257024304210425
-:100C8000E00043042104E00043042104E000C10724
-:100C90000100C905C80597CFE70701008E06C80700
-:100CA0008606E70700008606E70710088806E707BC
-:100CB00004008A06E707BC0C8C06C107038050AF0E
-:0C0CC00097CFE70700008E0697CF0000DA
-:00000001FF
diff --git a/firmware/kaweth/new_code_fix.bin.ihex b/firmware/kaweth/new_code_fix.bin.ihex
deleted file mode 100644
index fb35d3d0c924..000000000000
--- a/firmware/kaweth/new_code_fix.bin.ihex
+++ /dev/null
@@ -1,40 +0,0 @@
-:10000000B6C3AABBCCDD0200080028002C003400D7
-:100010003C0040004800540058005E006400680046
-:100020006E006C00720076007C00800086008A0002
-:100030009000940098009E00A600AA00B000B400B2
-:10004000B800C000C600CA00D000D400D800E0004C
-:10005000DE00E800F000FC0004010A0118012201A2
-:1000600028013A013E017E0198019C01A201AC01E8
-:10007000B201BA01C001C801D001D601F401FC01EE
-:10008000080216021A0222022A022E023E0244022C
-:100090004A025002640262026C02720286028C0200
-:1000A00090029E02BC02D002D802DC02E002E8020A
-:1000B000E602F402FE0204030C0328037C0390030F
-:1000C00094039C03A203C003D003D403EE03FA03FA
-:1000D000FE032E0432043C0440044E0476047C04E7
-:1000E00084048A048E04A604B004B804BE04D204B6
-:1000F000DC04EE0410051A0524052A05360534052E
-:100100003C05420564056A056E058605220626063D
-:100110002C06300642064A064E06560654065A0675
-:1001200060066606E806EE06F406160726072C07A4
-:10013000320736073A073E07520756075A07640741
-:1001400076077A07800784078A079E07A207DA07DF
-:10015000DE07E207E607EA07EE07F207F6070E08F2
-:10016000160818081A081C081E0820082208240867
-:10017000260828082A082C082E0832083A084608BB
-:100180004E0854085E0878087E08820886088C08A5
-:10019000900898089E08A408AA08B008AE08B408F9
-:1001A000BE08C408C208CA08C808D408E408E80899
-:1001B000F608140912091A092009260924092A092E
-:1001C0003E094C0956097009740978097E097C09B1
-:1001D000820998099C09A009A609B809DC09E8095F
-:1001E000EC09FC09120A180A1E0A420A460A4E0ABB
-:1001F000540A5A0A5E0A680A6E0A720A780A760A6D
-:100200007C0A800A840A940AA40AB80ABE0ABC0AB4
-:10021000C20AC80AC60ACC0AD00AD40AD80ADC0A1A
-:10022000E00AF20AF60AFA0A140B1A0B200B1E0B4C
-:10023000260B2E0B2C0B360B3C0B420B400B4A0BA8
-:10024000AA0BB00BB60BC00BC80BDA0BE80BEC0B10
-:10025000FA0B4A0C540C620C660C960C9A0CA00C0F
-:0E026000A60CA40CAC0CB20CB00CC00C000030
-:00000001FF
diff --git a/firmware/kaweth/trigger_code.bin.ihex b/firmware/kaweth/trigger_code.bin.ihex
deleted file mode 100644
index c3e1658c2803..000000000000
--- a/firmware/kaweth/trigger_code.bin.ihex
+++ /dev/null
@@ -1,13 +0,0 @@
-:10000000B6C3AABBCCDDC807A000F0075E0006009F
-:10001000F0070A000800F00900000200E7073600B8
-:100020000000F00700000400E70750C310C0F0090B
-:100030000EC00000E78701000EC097CFD70900C0AF
-:100040001702C807A000E71750C310C030D804003B
-:10005000305C08000400B0C00600C805E70500C019
-:10006000C0DF97CF49AFC007000060AF4AAF000CB8
-:100070000C0040D2001C0C0040D230000800F007F9
-:1000800000000400F0078600060067CF270C02007E
-:100090000000270C00000EC049AF64AFC00700008D
-:1000A0004BAF4AAF5ACF0000000000000000000034
-:0600B000940005000000B1
-:00000001FF
diff --git a/firmware/kaweth/trigger_code_fix.bin.ihex b/firmware/kaweth/trigger_code_fix.bin.ihex
deleted file mode 100644
index 7712f73faeda..000000000000
--- a/firmware/kaweth/trigger_code_fix.bin.ihex
+++ /dev/null
@@ -1,3 +0,0 @@
-:10000000B6C3AABBCCDD0200060018003E0080008B
-:060010009800AA000000A8
-:00000001FF
diff --git a/firmware/keyspan/mpr.HEX b/firmware/keyspan/mpr.HEX
deleted file mode 100644
index a53ba10b2358..000000000000
--- a/firmware/keyspan/mpr.HEX
+++ /dev/null
@@ -1,104 +0,0 @@
-:0300330002001AAE
-:04001A0053D8EF3296
-:100003008E568F57E5571557AE56700215564E60EC
-:0700130005120FA280EE228E
-:0300230002004692
-:10004600C0E0C083C082C086758600C0D075D00867
-:1000560030990E300B07A20E929B853699C299D223
-:10006600122012030202F9C2123003197E7E7F406B
-:10007600751A7E751B407517007E7D7FC075187DCD
-:100086007519C080177E7D7FC0751A7D751BC0757A
-:1000960017017E7E7F4075187E751940200B03027E
-:1000A6000184E53AC39553503C200C342009319025
-:1000B6007F9BE055387029301012AF3A053AE51BA0
-:1000C6002FF582E4351AF583E013920EAF3A053A1E
-:1000D600E51B2FF582E4351AF583E0F5360202F7C3
-:1000E600C20B0202F7300311907FC7E4F0A3E0547D
-:1000F60002F51DA3E0F51C8011907FC9E4F0907F06
-:03004300020F00A9
-:03000000020026D5
-:0C002600787FE4F6D8FD75815A020A3399
-:40010600C6E05402F51DA3E0F51CE51724FF9203300D0DC20D907FBB7401F0C20B0202F7E51D6005C20B0202F7851C53851982851883E013920D7512FF200C3A2009379082
-:400146007F9BE05538702F30101C851982851883A3E013920E851982851883A3A3E0F536753A030202F7753A02851982851883A3E0F5360202F7753A01C20B0202F73003FE
-:400186000E907FC6E05402F51DA3E0F51C800C907FC8E05402F51DA3E0F51CE53AC395535003020268E51D6007C214C2050202F7851C53851B82851A83E013920D7512FF61
-:4001C600300C03020260300903020260907F9BE05538600302026030101B851B82851A83A3E013929B851B82851A83A3A3E0F599753A03800D851B82851A83A3E0F5997575
-:400206003A02E53AC395534026300307907FC7E4F08005907FC9E4F0E51724FF9203200D030202F7C20D907FBB7401F00202F7301012AF3A053AE51B2FF582E4351AF58394
-:40024600E013920EAF3A053AE51B2FF582E4351AF583E0F536D20B0202F7753A01C2140202F7300C030202F53009030202F5907F9BE055387079301012AF3A053AE51B2FF2
-:40028600F582E4351AF583E013929BAF3A053AE51B2FF582E4351AF583E0F599E53AC395534022300307907FC7E4F08005907FC9E4F0E51724FF9203300D36C20D907FBB0E
-:4002C6007401F0802C301012AF3A053AE51B2FF582E4351AF583E013920EAF3A053AE51B2FF582E4351AF583E0F536D20B8002C214D201209803020435C298200203020383
-:40030600A2201527AF39053974802FF582E4347EF583E599F030104DAF39053974802FF582E4347EF583E598F0803A859955E555B54704D209802EE555B54604C20980251C
-:40034600AF39053974802FF582E4347EF583E555F0301011AF39053974802FF582E4347EF583E598F0D20FE539C395435003020433907FB8E030E116E539C39440500302F5
-:40038600043315391539052B433401020433907FB7E539F0753900C202020433201527AF39053974002FF582E4347EF583E599F030104DAF39053974002FF582E4347EF594
-:4003C60083E598F0803A859955E555B54704D209802EE555B54604C2098025AF39053974002FF582E4347EF583E555F0301011AF39053974002FF582E4347EF583E598F0EA
-:40040600D20FE539C395434024907FB6E030E112E539C39440401615391539052B433401800B907FB9E539F0753900D202D201300105C201020056D0D0D086D082D083D02F
-:40044600E032907FBCE020E154E5346050E531704CE53430E10BE4F52F753401753102800EA208E433F52FC208E4F534753110E4F5567E007B0074242556F9EE3400FA12D8
-:400486000C79FF74002556F582E4347DF583EFF00556E556B40CDB907FBD740CF0907FCAE030E1030205D1E4F55674402556F582E4347DF583E0FFE5567C007B00243BF903
-:4004C600EC3400FAEF120C920556E556B418DBE53B601175C92075C836853CCA853DCBE4907F9FF0E53E139210929F853F38E540139215E5416009907F98E054FBF0800744
-:40050600907F98E04404F0E5426009907F98E0547FF08007907F98E04480F0E548600BC20CC209907F95E04402F0E549600CD209433401907F95E04402F0E54A600DC2AFBB
-:40054600C20BD200E4F553F53AD2AFE54B6005301502D209E54C6015907F95E054FDF0907F9EE04402F0907F98E054FDF0E54D600AD29CC298752C0175311EE54E6007C227
-:400586009CE4F539F52CE54F6003E4F539E5506002D207E551600AE54D7002F531E5514234E552601F907FD77411F07431F07412F07432F07413F07433F07414F07434F067
-:4005C600D203D202D208E4907FCBF0A20CE433FF652960058F29433401A209E433FF652A60058F2A433401907F9BE0FF54086408F55765256006855725433401EF5410643A
-:4006060010F55765266006855726433401EF54406440F55765276006855727433401EF54206420F55765286006855728433401907F9AE054406440F557652E600685572E5B
-:40064600433401300735C2AF300218907FB8E020E127E5396009907FB7F0E4F539C202C2078016907FB6E020E10FE5396009907FB9F0E4F539D202C207D2AF20053D3003DB
-:400686001E907FC6E020E133907E40E013920D753A01907FC7E0F553D2057512FF801C907FC8E020E115907DC0E013920D753A01907FC9E0F553D2057512FF2014332000E6
-:4006C60006E53A6553702A30051A300309E4907FC7F0C2038007E4907FC9F0D203C205E4F553F53A300D0AC20DC200907FBB7401F03014030207BF2005030207BF300C0314
-:400706000207BF3009030207BF907F9BE0553860030207BF30030C7E7E7F4075587E755940800A7E7D7FC075587D7559C0301012AF3A053AE5592FF582E43558F583E0137C
-:40074600921AAF3A053AE5592FF582E43558F583E0F557E53AC39553502A301012AF3A053AE5592FF582E43558F583E013920EAF3A053AE5592FF582E43558F583E0F53688
-:40078600D20B8015C20B300309E4907FC7F0C2038007E4907FC9F0D203301004A21A929BD214C2AF855799200B0D300D0AC20DC200907FBB7401F0D2AF22907FE9E0120C70
-:4007C600A4091C0009890109E60307E306090D0809010908E90A08F80B00000A24907FEBE024FE601C14700302087924026003020A24740D907FD4F07487907FD5F0020AE6
-:400806002B907FEAE0B401047F0280027F037582D875830DEFF07582D175830DF07582CA75830DF07582C375830DF0907FEAE00475829E75830DF0907FEFE0FE907FEEE07B
-:400846007C002400F55AEC3EF55975150D75169975829B75830DE0751300F514D3E514955AE51395594006855913855A14120BBA020A2B907FEAE0700B7556FF75570D7503
-:4008860058DC802D907FEAE0B4010B7556FF75570D7558E0801B907FEAE0B4020B7556FF75570D7558F080097556FF75570E75581E907FEEE0755900F55AAE57AF588E1512
-:4008C6008F168F828E83E0FEA3E08E13F514D3955AE51395594006855913855A14120BBA020A2B907F00E511F0907FB57401F0020A2B907FEAE0F511020A2B120C24907F84
-:40090600EAE0F510020A2B907F00E510F0907FB57401F0020A2B907FE8E0247F602714603424026003020A24A216E433FF25E0FFA218E4334F907F00F0E4A3F0907FB57455
-:4009460002F0020A2BE4907F00F0A3F0907FB57402F0020A2B907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F00B
-:40098600020A2B907FE8E024FE601724026003020A2B907FEAE064016003020A24C216020A2B907FEAE07076907FECE0F45480FFC4540FFFE054072F25E024B4F582E4348D
-:4009C6007FF583E4F0907FECE05480FF131313541FFFE054072F907FD7F0E04420F08045907FE8E024FE601024027039907FEAE06401702AD216802D907FEAE07020907F77
-:400A0600ECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08007907FB4E04401F0907FB4E04402F022C210E4F510F534C209C20CC20BC214C20DC215A5
-:400A4600C211C207C212C20FC208F535F539F553F53AF533F530F52FF52EF52DF52CF52BF52AF529F528F527F526F525F524C205C217C219C216C218C204D213C206C20178
-:400A8600907F92E054FDF0D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440FF0907FAC740EF0D2AFD2BCD247
-:400AC6001A120F7DC21730040312044830042A300627C206E51260161512907FD8E030E6047F0080027F20907F96EFF08006907F967420F0120B1480CD301707C217120741
-:400B0600C080C33019C0C219120EDC80B922E53160021531E53960556535704BE533F460020533E533C395444043C2AF30021B907FB8E020E12D907FB7E539F0C202E4F5AA
-:400B460039F533F5357512FF8019907FB6E020E112907FB9E539F0D202E4F539F533F5357512FFD2AF8006853935E4F533E52C6030200F07907F9BE030E00FE52D6006E497
-:400B8600F52D433401E4F5308014E530D39545500DE530B54506752D014334010530C20F22907FD9E030E2047F0080027F20907F96EFF022E51445136057AE13AF14D3EF0F
-:400BC6009440EE940040047E007F40C3E5149FF514E5139EF513E4FDEDC39FE49E501F851682851583E0FC74002DF582E4347FF583ECF00D0516E5167002051580DA907FC4
-:400C0600A97401F0907FACE04401F0907FB5EFF022907FACE054FEF0E4907FB5F022E4907F93F0907F9C7430F0907F967420F0907F947401F0907F9D74FFF0907F977486DF
-:400C4600F0907F957403F0907F9E7484F0907F98F0E4907FC7F0907FC9F0907FCBF075984043A810907FDE741FF0907FDF740FF0D20422BB010689828A83E0225002E722C3
-:400C8600BBFE02E32289828A83E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA367
-:400CC600A3A380DFE4907F95F0907F94F0907F93F0907F9DE04402F0907F97E04442F0907F9C7410F0E4907F96F0907F9D74BEF03016047F8080027F00907F97EFF0E49045
-:400D06007F95F0907F9EF0907F98F022C0E0C0F0C083C082C085C084C086758600C0D075D0085391EF907FA97401F0120BBAD0D0D086D084D085D082D083D0F0D0E032C06A
-:400D4600E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E03200000000000000000000000000000000000000000000001C
-:400D86000012011001FFFFFF40CD061C010100010200020902430001010080320904000007FF00000007050102400000070502024000000705030240000007058102400002
-:400DC600010705820240000107058302400001070584024000010403090410034B00650079007300700061006E002E034B00650079007300700061006E00200055005000A3
-:400E0600530048003100310032002D00530065007200690061006C0022035500530041002D003500330020003200300030003200610070007200320036000000C0E0C083DB
-:400E4600C082C085C084C0867586005391EF907FAB7402F0D206D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2175391EF907FAB7401F0D086D01F
-:400E860084D085D082D083D0E032C0E0C083C082C085C084C086758600D2195391EF907FAB7408F0D086D084D085D082D083D0E032C0E0C083C082C085C084C08675860084
-:400EC6005391EF907FA97402F0D086D084D085D082D083D0E032120CCA120FB3907FD6E030E712E04401F07F0D7E00120003907FD6E054FEF0120C242200020E6900020EA3
-:400F06004200020D4500020E9000020F1000020F1400020D1200020F1C00020EB700020F2400020F3300020F2C00020F58C0E0C083C082C085C084C0867586005391EF90A9
-:400F46007FA97404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C0867586005391EF907FA97408F0D086D084D085D082D083D0E032907FD6E054FBF0E044C1
-:3D0F860008F0301A04E04402F07FF47E01120003907FD6E054F7F0E04404F0227400F58690FDA57C05A3E582458370F922907FD6E04480F04387010000000000222C
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
-
-static char theFirmwareDate53[] =
- "04/26/2002 02:47p 11,570 USA53";
-
diff --git a/firmware/keyspan/usa18x.HEX b/firmware/keyspan/usa18x.HEX
deleted file mode 100644
index a9ff70eadfe7..000000000000
--- a/firmware/keyspan/usa18x.HEX
+++ /dev/null
@@ -1,141 +0,0 @@
-:030033000212F7BF
-:10000300E4907F93F0907F9C7430F0E4907F96F0BF
-:10001300907F94F0907F9D74FFF0E4907F97F09031
-:0F0023007F95F0907F9E7407F0E4907F98F02215
-:1000460030091812131BEFC3953C40030200D890E9
-:100056007FBF7401F0C209C200807730033B907FF6
-:10006600C6E020E16D12131BEFC394405064907EEE
-:1000760040E0139209907FC7E014F5192000116043
-:100086000FF5087E7E7F41750C7E750D41120CBA08
-:10009600C203E4907FC7F08039907FC8E020E13248
-:1000A60012131BEFC394405029907DC0E0139209B0
-:1000B600907FC9E014F519200011600FF5087E7DC8
-:1000C6007FC1750C7D750DC1120CBAD203E4907F09
-:1000D600C9F0907FB6E030E1030201601211D68FBD
-:1000E600191213278F36E519C3953A500F1212EBE2
-:1000F600EF30E008E53620E703300B5EC20BE5196A
-:0C003600907F987410F090C000E0FF2252
-:03004300021300A5
-:03000000020E00ED
-:400106006058B48003433602E53630E726E519D3942040037519208519087E7E7F80750C7E750D80AF36120F4BE51925E0907FB7F08027E519D3943F400375193F851908D4
-:40014600907E80E536F07E7E7F81750C7E750D81120CDFE51904907FB7F0907FCEE030E1062005030203C1C205E4F51874402518F582E4347CF583E0FFE5187C007B017AF1
-:400186007E79002400F9EC347EFAEF120ED20518E518B420D7907E00E06068907E03E060247F01E4FD1211B17F037DCD1211B1434680907F987414F090C000E546F0E490E0
-:4001C6007E13F08030907E01E0FF121035907E02E0FF12105B7F01907E11E0FD1211B17F037D071211B1434680907F987414F090C000E546F0907F987412F0E5404406903E
-:40020600C000F0907E03E07006907E13E07008E4907E13F07525FF907E05E06012A3E0543FF544907F987413F090C000E544F0907E07E0602BA3E0600543428080035342DA
-:400246007F5342FC907E09E06011434202A3E0FF1210A7907E0BE0FF1210CDAF42121081907E03E0600853427FAF42121081907E0CE06018A3E0600543460280035346FDB4
-:40028600907F987414F090C000E546F0907E0EE06018A3E0600543460180035346FE907F987414F090C000E546F0907E12E0F53AA3E013920DA3E0F53CA3E060054346108B
-:4002C60080035346EF907F987414F090C000E546F0907E16E060325344BF907F987413F0E544547F90C000F0907F987411F01212DFEF54FE90C000F0533EFDE4FFAD3E120F
-:4003060011B1E4F52AF529D207907E17E0600F433E02E4FFAD3E1211B1752901D207907E18E06010907F987412F0E540440490C000F0D200907E19E06011434440907F98F2
-:400346007413F0E544547F90C000F0907E1AE0600F533EFEE4FFAD3E1211B1752B01D207907E1BE0600F433E01E4FFAD3E1211B1E4F52BD207907E1CE0600E907F98741284
-:40038600F0E540440290C000F0907E1DE06002D20B907E1EE06008752C01E4F538D207907E1FE06011907FD77411F07431F07415F07435F0D203E4907FCFF0301A52E53892
-:4003C60060021538201349E513D3940040041513803E75130A301B02D2131212DFEF5401F519652A600585192AD207121333EF5480F51965266005851926D207300D11127F
-:400406001333EF5410F51965256005851925D207201B030207EC300A1812136FEFC3953D40030204AE907FC17401F0C20AC200807730043B907FCAE020E16D12136FEFC35A
-:4004460094405064907D40E013920A907FCBE014F519200011600FF5087E7D7F41750C7D750D41120D04C204E4907FCBF08039907FCCE020E13212136FEFC39440502990BC
-:400486007CC0E013920A907FCDE014F519200011600FF5087E7C7FC1750C7C750DC1120D04D204E4907FCDF0907FBAE030E1030205361212208F1912137B8F37E519C3952B
-:4004C6003B500F121357EF30E008E53720E703300C5EC20CE5196058B48003433702E53730E726E519D3942040037519208519087E7D7F80750C7D750D80AF37120F84E503
-:400506001925E0907FBBF08027E519D3943F400375193F851908907D80E537F07E7D7F81750C7D750D81120D29E51904907FBBF0907FD0E030E106200603020797C206E4F8
-:40054600F51874C02518F582E4347BF583E0FFE5187C007B017A7E79202420F9EC347EFAEF120ED20518E518B420D7907E20E06068907E23E060247F01E4FD1211FB7F0329
-:400586007DCD1211FB434780907F98740CF090C000E547F0E4907E33F08030907E21E0FF121119907E22E0FF12113F7F01907E31E0FD1211FB7F037D071211FB4347809048
-:4005C6007F98740CF090C000E547F0907F98740AF0E541440690C000F0907E23E07006907E33E07008E4907E33F0752EFF907E25E06012A3E0543FF545907F98740BF090EB
-:40060600C000E545F0907E27E0602BA3E06005434380800353437F5343FC907E29E06011434302A3E0FF121165907E2BE0FF12118BAF431210F3907E23E0600853437FAFFE
-:40064600431210F3907E2CE06018A3E0600543470280035347FD907F98740CF090C000E547F0907E2EE06018A3E0600543470180035347FE907F98740CF090C000E547F0D4
-:40068600907E32E0F53BA3E013920EA3E0F53DA3E0600543471080035347EF907F98740CF090C000E547F0907E36E060325345BF907F98740BF0E545547F90C000F0907F79
-:4006C600987409F012134BEF54FE90C000F0533FFDE4FFAD3F1211FBE4F533F532D208907E37E0600F433F02E4FFAD3F1211FB753201D208907E38E06010907F98740AF043
-:40070600E541440490C000F0D200907E39E06011434540907F98740BF0E545547F90C000F0907E3AE0600F533FFEE4FFAD3F1211FB753401D208907E3BE0600F433F01E4E9
-:40074600FFAD3F1211FBE4F534D208907E3CE0600E907F98740AF0E541440290C000F0907E3DE06002D20C907E3EE06008753501E4F539D208907E3FE06011907FD7741389
-:40078600F07433F07416F07436F0D204E4907FD1F0301A52E53960021539301349E513D3940040041513803E75130A301B02C21312134BEF5401F51965336005851933D279
-:4007C60008121387EF5480F519652F600585192FD208300E11121387EF5410F519652E600585192ED208301A2A907FD2E020E123907B40E06009E0F515907B42E0F5169035
-:400806007B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E103020920E50A7040300739E5387035C207F5187E007B0074242518F9EE3400FA120E8CFF748025BD
-:4008460018F582E4347BF583EFF00518E518B409DB907FC37409F0753810E4F52C750A0122E50A64017040300839E5397035C208F5187E007B00742D2518F9EE3400FA1297
-:400886000E8CFF74802518F582E4347BF583EFF00518E518B409DB907FC37409F0753910E4F535750A0222E50A6402703630142FC214F5187E007B00740E2518F9EE340083
-:4008C600FA120E8CFF74802518F582E4347BF583EFF00518E518B405DB907FC37405F0750A0322E51560301515E4F5187E007B0074142518F9EE3400FA120E8CFF748025F2
-:4009060018F582E4347BF583EFF00518E518B403DB907FC37403F0E4F50A22907FE9E0120EE40A08000A7C010AE80309440609FB0809F50909DD0A09EC0B00000B37907F3D
-:40094600EBE024FE6019146061240260030209D37419907FD4F07400907FD5F0020B3E907FEAE070047F0280027F03758282758319EFF075827B758319F0758274758319B2
-:40098600F0758266758319F0758258758319F0907FEAE004758217758319F07419907FD4F07412907FD5F0020B3E907FEAE0FF120F0AEA49600DEA907FD4F0E9907FD5F085
-:4009C600020B3E907FB4E04401F0020B3E907FB4E04401F0020B3E907F00E509F0907FB57401F0020B3E907FEAE0F509020B3E120B46020B3E907F007401F0907FB5F00205
-:400A06000B3E907FE8E0247F60241460312402705BA210E433FF25E0FFA216E4334F907F00F0E4A3F0907FB57402F0020B3EE4907F00F0A3F0907FB57402F0020B3E907F04
-:400A4600ECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B3E907FB4E04401F0020B3E907FE8E024FE601D24020F
-:400A86006003020B3E907FEAE0B40105C210020B3E907FB4E04401F0020B3E907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FB6
-:400AC600ECE05480FF131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D210803F907FB4E04401F049
-:400B06008036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022D4
-:400B4600E4907F93F0907F9C7430F0E4907F96F0907F9574C0F0907F9E743FF0907F987418F0E4F58E907FDF74FFF0907FDEF0E4F5247518017B0074242518F9E43400FA8B
-:400B8600E4120ED20518E518B409EA753A01E4F538F513F536C207C20BC205C200C209C213907F987413F075440390C0007403F07F0CE4FD1211B17F108F42121081907F02
-:400BC600987412F07F018F40EF440690C000F0907F987414F075468090C0007480F00FE4FD1211B1E4FF7EA3AD068D3E1211B1907F987411F090C000E4F07F057D7F12118E
-:400C0600B17F0112126A7F037D071211B1201B03020CB7752D017518017B00742D2518F9E43400FAE4120ED20518E518B409EA753B01E4F539F513F537C208C20CC206C2CD
-:400C460000C20AC213907F98740BF075450390C0007403F07F0CE4FD1211FB7F108F431210F3907F98740AF07F018F41EF440690C000F0907F98740CF075478090C000744E
-:400C860080F00FE4FD1211FBE4FF7EA3AD068D3F1211FB907F987409F090C000E4F07F057D7F1211FB7F0112128B7F037D071211FBD21222907F987410F0AF08E50DF582A5
-:400CC600E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF08E50DF582E50CF583C2AF058690C000E00586F0A30586DFF70586D2AF22907F20
-:400D0600987408F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AF08E50DF582E50CF583C2AF058690C000E00586F0A3055C
-:400D460086DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022D219907F92E04402F0907FAEE0FFD39210E433FEEF4EF089
-:400D8600D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440DF0D2AFD21A121245C211E4F50BF513C217C212D4
-:400DC600907FA104F0907FD8E065176010301205D21A120046907FD8E0F5178008301205C21A120046301107C21112092180D63018D3C21812139380CC22787FE4F6D8FDC7
-:400E0600758147020E47020D6FE493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F456800146F6DFE4800B01020408102040F5
-:400E4600809012ACE47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CA1E
-:400E8600DFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E5B8
-:400EC6008229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3C1
-:400F0600A3A380DF8F18E4F519751AFF751B19751C86AB1AAA1BA91C900001120EA5B4031DAF190519EFB5180122120E8C7E0029FFEE3AA907751AFFF51B891C80D47B00A5
-:400F46007A007900228F1A050DE50DAE0C7002050C14F5828E83E51AF0120036050DE50DAC0C7002050C14F5828C83EFF01508E508600A1213278F1AEF423680CA228F1AFC
-:400F8600050DE50DAE0C7002050C14F5828E83E51AF012133F050DE50DAC0C7002050C14F5828C83EFF01508E508600A12137B8F1AEF423780CA22C0E0C083C082C085C088
-:400FC60084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2115391EF907FAB7401F0D086D084D0C6
-:4010060085D082D083D0E032C0E0C083C082C085C084C086758600D2185391EF907FAB7408F0D086D084D085D082D083D0E032907F987413F090C00074BFF0907F9874108A
-:40104600F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987411F090C000EFF0907F987413F0E544547F90C000F022907F98741349
-:40108600F090C00074BFF0907F987412F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987414F090C000EFF0907F987413F0E544D9
-:4010C600547F90C000F022907F987413F090C00074BFF0907F987416F090C000EFF0907F987413F0E544547F90C000F022907F98740BF090C00074BFF0907F98740AF0902A
-:40110600C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F987408F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090AF
-:40114600C00074BFF0907F987409F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F98740CF090C000EFF0907F98740BF0E545547FEC
-:4011860090C000F022907F98740BF090C00074BFF0907F98740EF090C000EFF0907F98740BF0E545547F90C000F022907F987413F0E544547F90C000F0907F987417F09075
-:4011C600C000EFF0907F987415F090C000EDF02212130F8F1A12130F8F1BE51A651B601212130F8F1AE51A651B600712130F8F1B80E8AF1A22907F98740BF0E545547F9098
-:40120600C000F0907F98740FF090C000EFF0907F98740DF090C000EDF0221213638F1A1213638F1BE51A651B60121213638F1AE51A651B60071213638F1B80E8AF1A2290C8
-:401246007FD6E054FBF0E04408F0301A04E04402F07FF47E011212C8907FD6E054F7F0E04404F022AE07E4FFE53E547FFD1211B1907F987411F090C000EEF0E4E53E4480E8
-:40128600FD1211B122AE07E4FFE53F547FFD1211FB907F987409F090C000EEF0E4E53F4480FD1211FB22050E02000000000314030000C111C118C195C110C116010A00C19C
-:4012C6001B008E188F19E5191519AE18700215184E6005120D4E80EE22907F987411F090C000E0FF22907F987412F090C000E0FF2253D8EF320000000000020FE70002130A
-:401306000400020FBD0002100E907F987413F090C000E0FF22907F987414F090C000E0FF22907F987415F090C000E0FF22907F987416F090C000E0FF22907F987408F09050
-:40134600C000E0FF22907F987409F090C000E0FF22907F98740AF090C000E0FF22907F98740BF090C000E0FF22907F98740CF090C000E0FF22907F98740DF090C000E0FFC5
-:4013860022907F98740EF090C000E0FF22120003120D5F120B4622000000000000000000000000000000000000000000000000000000000000000000000000000000000083
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06120100000102000209027400010100A032090400000EFF0000000705010240000007050202400000070503024000000705040240000007050502400074
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:141A06007200100330003000300030003000300030000000F7
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa19.HEX b/firmware/keyspan/usa19.HEX
deleted file mode 100644
index c5d1496e8714..000000000000
--- a/firmware/keyspan/usa19.HEX
+++ /dev/null
@@ -1,101 +0,0 @@
-:0A002600120DBF120F47120D6B22DE
-:0300330002001AAE
-:04001A0053D8EF3296
-:100003008E138F14E5141514AE13700215134E607E
-:0700130005120F3680EE22FA
-:0300230002004692
-:10004600C0E0C083C082C086758600C0D075D00867
-:1000560030990E300807A20B929B853599C299D22A
-:100066000F200F03020431C20F20020302025620A2
-:100076000803020127E537C39550503E2009362074
-:100086000633907F9BE030E303200E29300D12AF3C
-:1000960037053774402FF582E4347EF583E01392FA
-:1000A6000BAF37053774402FF582E4347EF583E0D5
-:1000B600F53502042FC20802042F907FC7E4F0C270
-:1000C60002300A0CC20A907FBB04F0C20802042F59
-:1000D600907FC8E030E105C20802042F907FC9E096
-:1000E600F550907DC0E013920A20092D20062A9033
-:1000F6007F9BE030E303200E20300D11907DC1E0A0
-:03004300020F00A9
-:03000000020C618E
-:4001060013920BA3E0F53575370302042F753702907DC1E0F53502042F753701C20802042FE537C3955050030201CF907FC6E030E107C210C20302042F907FC7E0F5509004
-:400146007E40E013920A3009030201C720067220006F907F9BE030E303200E65300D10907E41E013929BA3E0F5997537038009907E41E0F599753702E537C39550401790B1
-:400186007FC7E4F0C202200A0302042FC20A907FBB04F002042F300D12AF37053774402FF582E4347EF583E013920BAF37053774402FF582E4347EF583E0F535D20802045D
-:4001C6002F753701C21002042F300903020251200679907F9BE030E303200E6F300D12AF37053774402FF582E4347EF583E013929BAF37053774402FF582E4347EF583E046
-:40020600F599E537C395504017907FC7E4F0C202200A0302042FC20A907FBB04F002042F300D12AF37053774402FF582E4347EF583E013920BAF37053774402FF582E43483
-:400246007EF583E0F535D20802042FC21002042F200803020308E537C39550503E200936200633907F9BE030E303200E29300D12AF37053774C02FF582E4347DF583E013DE
-:40028600920BAF37053774C02FF582E4347DF583E0F53502042FC20802042F907FC9E4F0D202300A0CC20A907FBB04F0C20802042F907FC6E030E105C20802042F907FC765
-:4002C600E0F550907E40E013920A20092D20062A907F9BE030E303200E20300D11907E41E013920BA3E0F53575370302042F753702907E41E0F53502042F753701C20802EF
-:40030600042FE537C3955050030203B0907FC8E030E107C210C20302042F907FC9E0F550907DC0E013920A3009030203A820067220006F907F9BE030E303200E65300D1034
-:40034600907DC1E013929BA3E0F5997537038009907DC1E0F599753702E537C395504017907FC9E4F0D202200A0302042FC20A907FBB04F002042F300D12AF37053774C0F5
-:400386002FF582E4347DF583E013920BAF37053774C02FF582E4347DF583E0F535D20802042F753701C21002042F30090302042D200674907F9BE030E303200E6A300D128E
-:4003C600AF37053774C02FF582E4347DF583E013929BAF37053774C02FF582E4347DF583E0F599E537C395504013907FC9E4F0D202300A35C20A907FBB04F0802C300D12CC
-:40040600AF37053774C02FF582E4347DF583E013920BAF37053774C02FF582E4347DF583E0F535D2088002C210D21220980302056DC2982001030204DA201127AF360536F3
-:4004460074802FF582E4347EF583E599F0300D4DAF36053674802FF582E4347EF583E598F0803A859910E510B54404D206802EE510B54304C2068025AF36053674802FF5AB
-:4004860082E4347EF583E510F0300D11AF36053674802FF582E4347EF583E598F0D20CE536C39540500302056B907FB8E030E116E536C39440500302056B15361536052BDD
-:4004C60043330102056B907FB7E536F0753600C20102056B201127AF36053674002FF582E4347EF583E599F0300D4DAF36053674002FF582E4347EF583E598F0803A859937
-:4005060010E510B54404D206802EE510B54304C2068025AF36053674002FF582E4347EF583E510F0300D11AF36053674002FF582E4347EF583E598F0D20CE536C3954040CE
-:4005460024907FB6E030E112E536C39440401615361536052B433301800B907FB9E536F0753600D201D212301205C212020056D0D0D086D082D083D0E032907FCAE030E1CA
-:40058600030206ABE4F51374402513F582E4347DF583E0FFE5137C007B002438F9EC3400FAEF120D330513E513B418DBE538600C75C92075C8348539CA853ACBE53B1392BF
-:4005C6000D929FE53C13920EE53D139211E53E6009907F98E054FBF08007907F98E04404F0E53F6009907F98E0547FF08007907F98E04480F0E545600BC209C206907F950E
-:40060600E04402F0E546600CD206433301907F95E04402F0E547600DC2AFC208D200E4F550F537D2AFE5486005301102D206E5496015907F95E054FDF0907F9EE04402F0AA
-:40064600907F98E054FDF0E54A600AD29CC298752C0175311EE54B6007C29CE4F536F52CE54C6003E4F536E54D6002D204E54E600AE54A7002F531E54E4233E54F601F9064
-:400686007FD77411F07431F07412F07432F07413F07433F07414F07434F0D202D201D205E4907FCBF0A209E433FF652960058F29433301A206E433FF652A60058F2A4333BA
-:4006C60001907F9BE05408B5250AE054086408F525433301907F9BE05410B5260AE054106410F526433301907F9BE05440B5270AE054406440F527433301907F9BE0542026
-:40070600B5280AE054206420F528433301300435C2AF300118907FB8E020E127E5366009907FB7F0E4F536C201C2048016907FB6E020E10FE5366009907FB9F0E4F536D234
-:4007460001C204D2AF20033730021B907FC6E020E12D907E40E013920A753701907FC7E0F550D2038019907FC8E020E112907DC0E013920A753701907FC9E0F550D20320E9
-:400786001033200006E5376550702A30031A300209E4907FC7F0C2028007E4907FC9F0D202C203E4F550F537300A0AC20AC200907FBB7401F03010030208C5200303020805
-:4007C600C5300E0A907F9BE030E3030208C53006030208C53009030208C5300262300D12AF37053774402FF582E4347EF583E0139219AF37053774402FF582E4347EF583CF
-:40080600E0F514E537C39550502A300D12AF37053774402FF582E4347EF583E013920BAF37053774402FF582E4347EF583E0F535D208806BC208E4907FC7F0C20280603081
-:400846000D12AF37053774C02FF582E4347DF583E0139219AF37053774C02FF582E4347DF583E0F514E537C39550502A300D12AF37053774C02FF582E4347DF583E013929F
-:400886000BAF37053774C02FF582E4347DF583E0F535D2088009C208E4907FC9F0D202300D04A219929BD210C2AF85149920080D300A0AC20AC200907FBB7401F0D2AF9072
-:4008C6007FBCE020E151E533604DE5317049E53330E108E4F52F753301800BA205E433F52FC205E4F533E4F5137E007B0074242513F9EE3400FA120CEDFF74002513F582D8
-:40090600E4347DF583EFF00513E513B40CDB907FBD740CF075311022907FE9E0120D450A03000A77010AE30309410609F40809E80909D00A09DF0B00000B32907FEBE024EB
-:40094600FE601614605724027076740F907FD4F07464907FD5F0020B39907FEAE070047F0280027F037582B575830FEFF07582AE75830FF07582A775830FF07582A07583BA
-:400986000FF0907FEAE00475827B75830FF0740F907FD4F07476907FD5F0020B39907FEAE0FF120E48EA49600DEA907FD4F0E9907FD5F0020B39907FB4E04401F0020B39D4
-:4009C600907FB4E04401F0020B39907F00E519F0907FB57401F0020B39907FEAE0F519020B39907FEAE0F518120D6B020B39907F00E518F0907FB57401F0020B39907FE822
-:400A0600E0247F60241460312402705BA213E433FF25E0FFA217E4334F907F00F0E4A3F0907FB57402F0020B39E4907F00F0A3F0907FB57402F0020B39907FECE0F45480B6
-:400A4600FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B39907FB4E04401F0020B39907FE8E024FE601D24026003020B3904
-:400A8600907FEAE0B40105C213020B39907FB4E04401F0020B39907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FECE05480FFCC
-:400AC600131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D213803F907FB4E04401F08036907FEA36
-:400B0600E07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022201503020B3E
-:400B4600D3E53160021531E536604F65347045E532F460020532E532C39541403DC2AF300118907FB8E020E127907FB7E536F0C201E4F536F532F5348016907FB6E020E13D
-:400B86000F907FB9E536F0D201E4F536F532F534D2AF8006853634E4F532E52C602F200C07907F9BE030E00FE52D6006E4F52D433301E4F5308014E530D39542500DE530DB
-:400BC600B54206752D014333010530C20C22751201C214C218C213C217C215C212D216E4F518907F92E054FDF0907FAEE0FFD39213E433FEEF4EF0D2E843D820907FDE74DB
-:400C060001F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440DF0D2AFD2BCD219120EDAC214301503120580907FD8E065116008E0F5CA
-:400C460011120B4180EA301407C21412091E80E03018DDC21812002680D622787FE4F6D8FD758150020CA8020BD4E493A3F8E493A34003F68001F208DFF48029E493A3F83B
-:400C86005407240CC8C333C4540F4420C8834004F456800146F6DFE4800B0102040810204080900E04E47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E08E
-:400CC60060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E4932242
-:400D0600BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D0E1
-:400D460083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3A3A380DFE4907F93F0907F9C7430F0907F967410F0907F947401F0907F9D04E2
-:400D8600F0907F977420F0907F957403F0907F9E7484F0E4907F98F0907FC7F0907FC9F0907FCBF075984043A810907FDE741FF0907FDF740FF0D21522E4907F95F0907FF7
-:400DC60094F0907F93F0907F9DE04402F0907F97E04402F0907F9DE054FDF0907F9C7420F0E4907F96F0907F9DE044FDF0E4907F97F0907F9E74FFF0E4907F98F0220C24D0
-:400E0600000000000000000000000000013000013301013200013700015000013600013400C105C10CC103C10FC104C10EC111C10AC110C108C109C106C100C10DC181C109
-:400E460082008F13E4F5147515FF75160F7517B9AB15AA16A917900001120D06B4031DAF140514EFB5130122120CED7E0029FFEE3AA9077515FFF516891780D47B007A006D
-:400E8600790022C0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2145391C7
-:400EC600EF907FAB7401F0D086D084D085D082D083D0E032907FD6E054FBF0E04408F0301904E04402F07FF47E01120003907FD6E054F7F0E04404F02200020EB300020FC0
-:400F06000400020E8900020F0FC0E0C083C082C085C084C086758600D2185391EF907FAB7408F0D086D084D085D082D083D0E0327400F58690FDA57C05A3E582458370F9B9
-:400F460022907FD6E04480F04387010000000000220000000000000000000000000012011001FF000040CD0607010100010200020902430001010080320904000007FF008A
-:400F86000000070501024000000705020240000007050302400000070581024000010705820240000107058302400001070584024000010403090410034B00650079007332
-:170FC60000700061006E000E03530065007200690061006C00000064
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa19qi.HEX b/firmware/keyspan/usa19qi.HEX
deleted file mode 100644
index 353bfcfefb9c..000000000000
--- a/firmware/keyspan/usa19qi.HEX
+++ /dev/null
@@ -1,101 +0,0 @@
-:0300330002001AAE
-:04001A0053D8EF3296
-:100003008E118F12E5121512AE11700215114E608A
-:0700130005120F8480EE22AC
-:0300230002004692
-:10004600C0E0C083C082C086758600C0D075D00867
-:1000560030990E300B07A20E929B853699C299D223
-:100066001220120302041EC21220030302024E20B3
-:100076000B03020126E53AC39553503C200C34206D
-:100086000931907F9BE055387029301012AF3A0540
-:100096003A74402FF582E4347EF583E013920EAF76
-:1000A6003A053A74402FF582E4347EF583E0F5365E
-:1000B60002041CC20B02041C907FC7E4F0C203308A
-:1000C6000D0CC20D907FBB04F0C20B02041C907F86
-:1000D600C8E030E105C20B02041C907FC9E0F5536D
-:1000E600907DC0E013920D7516FF200C2B20092879
-:1000F600907F9BE055387020301011907DC1E01341
-:03004300020E00AA
-:03000000020026D5
-:0C002600787FE4F6D8FD758154020B28A9
-:40010600920EA3E0F536753A0302041C753A02907DC1E0F53602041C753A01C20B02041CE53AC3955350030201C9907FC6E030E107C214C20502041C907FC7E0F553907ECB
-:4001460040E013920D7516FF200C7020096D907F9BE055387065301010907E41E013929BA3E0F599753A038009907E41E0F599753A02E53AC395534017907FC7E4F0C203F6
-:40018600200D0302041CC20D907FBB04F002041C301012AF3A053A74402FF582E4347EF583E013920EAF3A053A74402FF582E4347EF583E0F536D20B02041C753A01C214A3
-:4001C60002041C300C03020249200977907F9BE05538706F301012AF3A053A74402FF582E4347EF583E013929BAF3A053A74402FF582E4347EF583E0F599E53AC3955340AB
-:4002060017907FC7E4F0C203200D0302041CC20D907FBB04F002041C301012AF3A053A74402FF582E4347EF583E013920EAF3A053A74402FF582E4347EF583E0F536D20B44
-:4002460002041CC21402041C200B030202FFE53AC39553503C200C34200931907F9BE055387029301012AF3A053A74C02FF582E4347DF583E013920EAF3A053A74C02FF5F9
-:4002860082E4347DF583E0F53602041CC20B02041C907FC9E4F0D203300D0CC20D907FBB04F0C20B02041C907FC6E030E105C20B02041C907FC7E0F553907E40E013920DAF
-:4002C6007516FF200C2B200928907F9BE055387020301011907E41E013920EA3E0F536753A0302041C753A02907E41E0F53602041C753A01C20B02041CE53AC39553500381
-:400306000203A2907FC8E030E107C214C20502041C907FC9E0F553907DC0E013920D7516FF200C7020096D907F9BE055387065301010907DC1E013929BA3E0F599753A037A
-:400346008009907DC1E0F599753A02E53AC395534017907FC9E4F0D203200D0302041CC20D907FBB04F002041C301012AF3A053A74C02FF582E4347DF583E013920EAF3A81
-:40038600053A74C02FF582E4347DF583E0F536D20B02041C753A01C21402041C200C75200972907F9BE05538706A301012AF3A053A74C02FF582E4347DF583E013929BAF02
-:4003C6003A053A74C02FF582E4347DF583E0F599E53AC395534013907FC9E4F0D203300D35C20D907FBB04F0802C301012AF3A053A74C02FF582E4347DF583E013920EAF3D
-:400406003A053A74C02FF582E4347DF583E0F536D20B8002C214D20120980302055AC2982002030204C7201627AF39053974802FF582E4347EF583E599F030104DAF3905C8
-:400446003974802FF582E4347EF583E598F0803A859910E510B54704D209802EE510B54604C2098025AF39053974802FF582E4347EF583E510F0301011AF39053974802F11
-:40048600F582E4347EF583E598F0D20FE539C395435003020558907FB8E030E116E539C39440500302055815391539052B433401020558907FB7E539F0753900C2020205D3
-:4004C60058201627AF39053974002FF582E4347EF583E599F030104DAF39053974002FF582E4347EF583E598F0803A859910E510B54704D209802EE510B54604C209802573
-:40050600AF39053974002FF582E4347EF583E510F0301011AF39053974002FF582E4347EF583E598F0D20FE539C395434024907FB6E030E112E539C3944040161539153909
-:40054600052B433401800B907FB9E539F0753900D202D201300105C201020056D0D0D086D082D083D0E032907FBCE020E151E534604DE5317049E53430E108E4F52F7534D4
-:4005860001800BA208E433F52FC208E4F534E4F5117E007B0074242511F9EE3400FA120D06FF74002511F582E4347DF583EFF00511E511B40CDB907FBD740CF075311090CD
-:4005C6007FCAE030E1030206F3E4F51174402511F582E4347DF583E0FFE5117C007B00243BF9EC3400FAEF120D1F0511E511B418DBE53B601175C92075C836853CCA853D98
-:40060600CBE4907F9FF0E53E139210929F853F38E540139216E5416009907F98E054FBF08007907F98E04404F0E5426009907F98E0547FF08007907F98E04480F0E54860BE
-:400646000BC20CC209907F95E04402F0E549600CD209433401907F95E04402F0E54A600DC2AFC20BD200E4F553F53AD2AFE54B6005301602D209E54C6015907F95E054FDB4
-:40068600F0907F9EE04402F0907F98E054FDF0E54D600AD29CC298752C0175311EE54E6007C29CE4F539F52CE54F6003E4F539E5506002D207E551600AE54D7002F531E55C
-:4006C600514234E552601F907FD77411F07431F07412F07432F07413F07433F07414F07434F0D203D202D208E4907FCBF0A20CE433FF652960058F29433401A209E433FF84
-:40070600652A60058F2A433401907F9BE0FF54086408FE652560058E25433401EF54106410FE652660058E26433401EF54406440FE652760058E27433401EF54206420FE1C
-:40074600652860058E28433401907F9AE054406440FE652E60058E2E433401300735C2AF300218907FB8E020E127E5396009907FB7F0E4F539C202C2078016907FB6E0203B
-:40078600E10FE5396009907FB9F0E4F539D202C207D2AF20053D30031E907FC6E020E133907E40E013920D753A01907FC7E0F553D2057516FF801C907FC8E020E115907DD3
-:4007C600C0E013920D753A01907FC9E0F553D2057516FF201433200006E53A6553702A30051A300309E4907FC7F0C2038007E4907FC9F0D203C205E4F553F53A300D0AC265
-:400806000DC200907FBB7401F0301403020914200503020914300C03020914300903020914907F9BE055386003020914300361301012AF3A053A74402FF582E4347EF5833F
-:40084600E013921BAF3A053A74402FF582E4347EF583E0FEE53AC39553502A301012AF3A053A74402FF582E4347EF583E013920EAF3A053A74402FF582E4347EF583E0F546
-:4008860036D20B806AC20BE4907FC7F0C203805F301012AF3A053A74C02FF582E4347DF583E013921BAF3A053A74C02FF582E4347DF583E0FEE53AC39553502A301012AFE7
-:4008C6003A053A74C02FF582E4347DF583E013920EAF3A053A74C02FF582E4347DF583E0F536D20B8009C20BE4907FC9F0D203301004A21B929BD214C2AF8E99200B0D301D
-:400906000D0AC20DC200907FBB7401F0D2AF22907FE9E0120D310A11000A7E010ADB030938060A020809F60909DE0A09ED0B00000B19907FEBE024FE601914605A24026041
-:4009460003020B19740D907FD4F07487907FD5F0020B20907FEAE070047F0280027F037582D875830DEFF07582D175830DF07582CA75830DF07582C375830DF0907FEAE078
-:400986000475829E75830DF0740D907FD4F07499907FD5F0020B20907FEAE0700B7511FF75120D7513DC801B907FEAE0B4010B7511FF75120D7513E080097511FF75120D19
-:4009C6007513F0AA12A913AE02EE907FD4F0AF01EF907FD5F0020B20907F00E515F0907FB57401F0020B20907FEAE0F515020B20120CB1907FEAE0F514020B20907F00E5BF
-:400A060014F0907FB57401F0020B20907FE8E0247F602714603424026003020B19A217E433FF25E0FFA219E4334F907F00F0E4A3F0907FB57402F0020B20E4907F00F0A3B7
-:400A4600F0907FB57402F0020B20907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B20907FE8E024FE601726
-:400A860024026003020B20907FEAE064016003020B19C217020B20907FEAE07076907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FECE05480D6
-:400AC600FF131313541FFFE054072F907FD7F0E04420F08045907FE8E024FE601024027039907FEAE06401702AD217802D907FEAE07020907FECE0F45480FFC4540FFFE056
-:400B060054072F25E024B4F582E4347FF5837401F08007907FB4E04401F0907FB4E04402F022C210E4F514F534C209C20CC20BC214C20DC216C211C207C212C20FC208F538
-:400B460035F539F553F53AF533F530F52FF52EF52DF52CF52BF52AF529F528F527F526F525F524C205C218C21AC217C219C215C204D213C206C201907F92E054FDF0D2E820
-:400B860043D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440FF0907FAC740EF0D2AFD2BCD21B120F5FC21830040316
-:400BC60012056D30042A300627C206E51660161516907FD8E030E6047F0080027F20907F96EFF08006907F967420F0120C0B80CD301807C21812091580C3301AC0C21A128E
-:400C06000FBB80B922E53160021531E53960556535704BE533F460020533E533C395444043C2AF30021B907FB8E020E12D907FB7E539F0C202E4F539F533F5357516FF802D
-:400C460019907FB6E020E112907FB9E539F0D202E4F539F533F5357516FFD2AF8006853935E4F533E52C6030200F07907F9BE030E00FE52D6006E4F52D433401E4F5308000
-:400C860014E530D39545500DE530B54506752D014334010530C20F22907FD9E030E2047F0080027F20907F96EFF022E4907F93F0907F9C7430F0907F967420F0907F94748A
-:400CC60001F0907F9D74BFF0907F977486F0907F957403F0907F9E7484F0907F98F0E4907FC7F0907FC9F0907FCBF075984043A810907FDE741FF0907FDF740FF0D204221A
-:400D0600BB010689828A83E0225002E722BBFE02E32289828A83E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193EB
-:400D4600F5828883E4737402936860EFA3A3A380DFC0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E03200000000007B
-:400D86000012011001FF000040CD060C010100010200020902430001010080320904000007FF00000007050102400000070502024000000705030240000007058102400010
-:400DC600010705820240000107058302400001070584024000010403090410034B00650079007300700061006E000E03530065007200690061006C000000020EA200020E41
-:400E06007B00020D5700020EC900020E1000020E1400020E1800020E1C00020EF000020E2400020F1500020E2C00020F3AE4907F95F0907F94F0907F93F0907F9DE044020A
-:400E4600F0907F97E04402F0907F9C7410F0E4907F96F0907F9D74FEF03017047F8080027F00907F97EFF0E4907F95F0907F9EF0907F98F022C0E0C083C082C085C084C00E
-:400E8600867586005391EF907FAB7402F0D206D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2185391EF907FAB7401F0D086D084D085D082D083EB
-:400EC600D0E032C0E0C083C082C085C084C086758600D21A5391EF907FAB7408F0D086D084D085D082D083D0E032C0E0C083C082C085C084C0867586005391EF907FA974C2
-:400F060002F0D086D084D085D082D083D0E032C0E0C083C082C085C084C0867586005391EF907FA97404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086D7
-:400F46007586005391EF907FA97408F0D086D084D085D082D083D0E032907FD6E054FBF0E04408F0301B04E04402F07FF47E01120003907FD6E054F7F0E04404F0227400B9
-:400F8600F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022907FD6E04401F07F0D7E00120003907FD6E054FEF022120E33120F95907FD6E030FA
-:090FC600E703120FA5120CB12281
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa19qw.HEX b/firmware/keyspan/usa19qw.HEX
deleted file mode 100644
index 8a891023bf51..000000000000
--- a/firmware/keyspan/usa19qw.HEX
+++ /dev/null
@@ -1,142 +0,0 @@
-:0300330002002D9B
-:04002D0053D8EF3283
-:10004600301019120E0FEFC3951440030200DF9013
-:100056007FBF7401F0C210C20B0200DF300D3E906C
-:100066007FC6E020E173120E0FEFC39440506A90F2
-:100076007E40E0139210907FC7E014F536200B11F6
-:10008600600FF5247E7E7F4175297E752A4112090F
-:1000960010C20DE4907FC7F07526FF803C907FC8A4
-:1000A600E020E135120E0FEFC39440502C907DC036
-:1000B600E0139210907FC9E014F536200B11600F03
-:1000C600F5247E7D7FC175297D752AC1120910D25E
-:1000D6000DE4907FC9F07526FF907FB6E030E1030E
-:1000E600020168120CFF8F36120E1B8F11E536C304
-:1000F6009513500F120DDEEF30E008E51120E703EF
-:0C003600907F987410F090C000E0FF2252
-:03004300020E00AA
-:10000300C0E0C083C082C085C084C086758600906E
-:100013007FC4E4F05391EF907FAB7404F0D086D0AB
-:0A00230084D085D082D083D0E03273
-:030000000209C52D
-:4001060030135FC213E5366059B48003431102E51130E724E536D3942040037536208536247E7E7F8075297E752A80120B9AE53625E0907FB7F0802AE536D3943F4003753B
-:40014600363F853624907E80E511F07E7E7F8175297E752A81120935E53604907FB7F07526FF907FCEE030E106200E030203C4E4F53574402535F582E4347CF583E0FFE589
-:40018600357C007B017A7E79002400F9EC347EFAEF120A970535E535B420D7907E00E0606E7F01907E11E0FD120CDA907E01E0FF120C1C907E02E0FF120C42D211D2127562
-:4001C6003604907E03E06005C2124336C0907E04E0B40107C21243360B8010907E04E06007C21143360980034336027F03AD36120CDA431A80907F987414F090C000E51A72
-:40020600F0907F987412F0E517440690C000F0907E05E06012A3E0543FF519907F987413F090C000E519F0907E07E06042907E13E0600543160480035316FBE4FFAD161247
-:400246000CDA907E08E06005431880800353187F5318FC907E09E06011431802A3E0FF120C8E907E0BE0FF120CB4AF18120C68907E0EE06018A3E06005431A018003531AD4
-:40028600FE907F987414F090C000E51AF0907E0CE06018A3E06005431A028003531AFD907F987414F090C000E51AF0907E12E0F513A3E0139214A3E0F514A3E06005431AC3
-:4002C600108003531AEF907F987414F090C000E51AF0907E16E060325319BF907F987413F0E519547F90C000F0907F987411F0120DD2EF54FE90C000F05316FDE4FFAD1621
-:40030600120CDAE4F50EF50DD20F907E17E0600F431602E4FFAD16120CDA750D01D20F907E18E06010907F987412F0E517440490C000F0D20B907E19E06011431940907F0D
-:40034600987413F0E519547F90C000F0907E1AE0600F5316FEE4FFAD16120CDA750F01D20F907E1BE0600F431601E4FFAD16120CDAE4F50FD20F907E1CE0600E907F9874A9
-:4003860012F0E517440290C000F0907E1DE06002D213907E1EE06008751001E4F512D20F907E1FE06011907FD77411F07431F07415F07435F0D20DC20EE4907FCFF0301674
-:4003C60071E51260021512E530D3940040041530806075300A120DD2EF5401F536650E600785360ED20F8011120E27EF5410F53665096005853609D20F120E27EF5480F5C1
-:4004060036650A600585360AD20F120E27EF5420F536650B600885360B301102D20F120E27EF5440F536650C600885360C301202D20F30162A907FD2E020E123907B40E035
-:400446006009E0F532907B42E0F533907B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E103020529E5277040300F39E5127035C20FF5357E007B0074082535DB
-:40048600F9EE3400FA120A51FF74802535F582E4347BF583EFF00535E535B409DB907FC37409F0751210E4F51075270222E5276402703630052FC205F5357E007B00742B96
-:4004C6002535F9EE3400FA120A51FF74802535F582E4347BF583EFF00535E535B405DB907FC37405F075270322E53260337531031532E4F5357E007B0074312535F9EE34CD
-:4005060000FA120A51FF74802535F582E4347BF583EFF00535E535B403DB907FC37403F0E4F52722907FE9E0120AA9060800067C0106E903054D0605F90805ED0905D50A02
-:4005460005E40B00000739907FEBE024FE60161460502402706F7419907FD4F07400907FD5F0020740907FEAE070047F0280027F03758282758319EFF0758274758319F06E
-:40058600758258758319F0907FEAE004758217758319F07419907FD4F07412907FD5F0020740907FEAE0FF120B1CEA49600DEA907FD4F0E9907FD5F0020740907FB4E0449B
-:4005C60001F0020740907FB4E04401F0020740907F00E525F0907FB57401F0020740907FEAE0F525020740120748907FEAE0F523020740907F00E523F0907FB57401F00216
-:400606000740907FE8E0247F60241460312402705BA201E433FF25E0FFA207E4334F907F00F0E4A3F0907FB57402F0020740E4907F00F0A3F0907FB57402F0020740907F2C
-:40064600ECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020740907FB4E04401F0020740907FE8E024FE601E240216
-:400686006003020740907FEAE0B40106120DF9020740907FB4E04401F0020740907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F090F8
-:4006C6007FECE05480FF131313541FFFE054072F907FD7F0E04420F08060907FB4E04401F08057907FE8E024FE60192402704B907FEAE0B40105120DF6803F907FB4E04487
-:4007060001F08036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F9
-:40074600F022E4907F93F0907F9C7430F0907F967420F0907F9574C0F0907F9E743FF0907F987410F0E4F58E907FDF74FFF0907FDEF0E4F5087F017B0074082FF9E4340023
-:40078600FAE4120A970FBF09EE751301E4F512F530F511C20FC213C20EC20BC210C204907F987413F075190390C0007403F07F0CE4FD120CDA7F108F18120C68907F9874C2
-:4007C60012F07F018F17EF440690C000F00FE4FD120CDAE4FF7EA3AD068D16120CDA907F987411F090C000E4F07F057D7F120CDA7F01120D6A7F037D07120CDAE4FFE5167B
-:40080600547FFD120CDA120E0F8F15E4FFE5164480FD120CDAE51530E704C2088002D208907F987414F0751A8090C0007480F0D20322D215907F92E04402F0120DF9D2E87C
-:4008460043D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAE740DF0D2AFD216120D24C202E4F528F530C209F523C20390F7
-:400886007FA104F0907FD8E065346048300305D216120046E50F6022E52660161526907FD8E030E6047F2080027F30907F96EFF0801A907F967430F08012907FD9E030E2F8
-:4008C600047F3080027F20907F96EFF0907FD8E0F5348020300307C2161200468016E50F7012907FD9E030E2047F3080027F20907F96EFF0300207C20212052A8086300AE4
-:4009060083C20A120B5D02088A22907F987410F0AF24E52AF582E529F583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF24E52AF582E529F583C2A3
-:40094600AF058690C000E00586F0A30586DFF70586D2AF22907F987408F0AF24E52AF582E529F583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AFCD
-:4009860024E52AF582E529F583C2AF058690C000E00586F0A30586DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022784B
-:4009C6007FE4F6D8FD758139020A0C020838E493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F456800146F6DFE4800B010211
-:400A0600040810204080900D8BE47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582B0
-:400A4600C8CAC583CADFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E925BB
-:400A860082F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193F5828883E47374028F
-:400AC600936860EFA3A3A380DFE4907F93F0907F9C7420F0300103FF80027F00907F96EFF0E4907F94F0907F9D74FFF0E4907F97F0300811907F95F0907F9E74FFF0907F05
-:400B0600987420F022E4907F95F0907F9E74DFF0E4907F98F0228F35E4F5367537FF753819753986AB37AA38A939900001120A6AB4031DAF360536EFB5350122120A517E5C
-:400B46000029FFEE3AA9077537FFF538893980D47B007A00790022907FD8E0F535120ACF200807907F92E054FDF0907FD6E04480F01209B5907FD6E030E70E300105120D9C
-:400B8600BC8006120D49EF60E1907F92E04402F012074822052AE52AAE297002052914F5828E83E511F0120036052AE52AAC297002052914F5828C83EFF01524E5246007C7
-:400BC600120E1B8F1180CD22C0E0C083C082C085C084C086758600D2025391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D20A9F
-:400C06005391EF907FAB7408F0D086D084D085D082D083D0E032907F987413F090C00074BFF0907F987410F090C000EFF0907F987413F0E519547F90C000F022907F9874E8
-:400C460013F090C00074BFF0907F987411F090C000EFF0907F987413F0E519547F90C000F022907F987413F090C00074BFF0907F987412F090C000EFF0907F987413F0E57C
-:400C860019547F90C000F022907F987413F090C00074BFF0907F987414F090C000EFF0907F987413F0E519547F90C000F022907F987413F090C00074BFF0907F987416F0FE
-:400CC60090C000EFF0907F987413F0E519547F90C000F022907F987413F0E519547F90C000F0907F987417F090C000EFF0907F987415F090C000EDF022120DEA8F37120D91
-:400D0600EA8F38E53765386012120DEA8F37E53765386007120DEA8F3880E8AF3722907FD6E054FBF0E04408F0301604E04402F07FF47E01120DA5907FD6E054F7F0E04448
-:400D460004F022907FD8E0F536120748120E27EF30E60B907FD8E0653660F17F0122120ACF7F0022AE07E4FFE516547FFD120CDA907F987411F090C000EEF0E4E516448084
-:400D8600FD120CDA22052B02000000000331030000C186C102C10AC101C107012700008E368F37E5371537AE36700215364E60051209A480EE22907FD6E04401F07F0D7E8D
-:400DC60000120DA5907FD6E054FEF022907F987411F090C000E0FF22907F987412F090C000E0FF22907F987413F090C000E0FF22D20122C2012200000000020BCE00020EF1
-:400E0600040002000300020BF5907F987414F090C000E0FF22907F987415F090C000E0FF22907F987416F090C000E0FF22000000000000000000000000000000000000004E
-:400E4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C
-:400E8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C
-:400EC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC
-:400F060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB
-:400F4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B
-:400F8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002B
-:400FC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB
-:4010060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AA
-:40104600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A
-:40108600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A
-:4010C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA
-:4011060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A9
-:401146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069
-:401186000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029
-:4011C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9
-:4012060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A8
-:401246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068
-:401286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028
-:4012C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8
-:4013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A7
-:401346000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067
-:401386000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06190100000102000209027400010100A032090400000EFF000000070501024000000705020240000007050302400000070504024000000705050240006D
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:041A0600720000006A
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa19w.HEX b/firmware/keyspan/usa19w.HEX
deleted file mode 100644
index a3b84313f2ca..000000000000
--- a/firmware/keyspan/usa19w.HEX
+++ /dev/null
@@ -1,141 +0,0 @@
-:03003300020D5C5F
-:10000300E4907F93F0907F9C7430F0E4907F96F0BF
-:10001300907F94F0907F9D74FFF0E4907F97F09031
-:0F0023007F95F0907F9E7417F0E4907F98F02205
-:10004600300F18120D38EFC3951440030200D890F4
-:100056007FBF7401F0C20FC20A8077300C3B907FDD
-:10006600C6E020E16D120D38EFC394405064907ED7
-:1000760040E013920F907FC7E014F51C200A116030
-:100086000FF5237E7E7F4175277E75284112080174
-:10009600C20CE4907FC7F08039907FC8E020E1323F
-:1000A600120D38EFC394405029907DC0E013920F93
-:1000B600907FC9E014F51C200A11600FF5237E7DA0
-:1000C6007FC175277D7528C1120801D20CE4907F87
-:1000D600C9F0907FB6E030E10302015E120C418F59
-:1000E6001C120D448F11E51CC39513500F120D20E1
-:1000F600EF30E008E51120E70330125CC212E51C80
-:0C003600907F987410F090C000E0FF2252
-:03004300020E00AA
-:030000000208B63D
-:400106006056B48003431102E51130E724E51CD394204003751C20851C237E7E7F8075277E752880120A86E51C251C907FB7F08027E51CD3943F4003751C3F851C23907E06
-:4001460080E511F07E7E7F8175277E752881120826E51C04907FB7F0907FCEE030E106200D030203BAE4F51B7440251BF582E4347CF583E0FFE51B7C007B017A7E7900244A
-:4001860000F9EC347EFAEF120A0D051BE51BB420D7907E00E0606E7F01907E11E0FD120C1C907E01E0FF120B5E907E02E0FF120B84D210D211751C04907E03E06005C211D7
-:4001C600431CC0907E04E0B40107C211431C0B8010907E04E06007C210431C098003431C027F03AD1C120C1C431980907F987414F090C000E519F0907F987412F0E51644CE
-:400206000690C000F0907E05E06012A3E0543FF518907F987413F090C000E518F0907E07E06042907E13E0600543150480035315FBE4FFAD15120C1C907E08E060054317BC
-:4002460080800353177F5317FC907E09E06011431702A3E0FF120BD0907E0BE0FF120BF6AF17120BAA907E0EE06018A3E0600543190180035319FE907F987414F090C00046
-:40028600E519F0907E0CE06018A3E0600543190280035319FD907F987414F090C000E519F0907E12E0F513A3E0139213A3E0F514A3E0600543191080035319EF907F98742D
-:4002C60014F090C000E519F0907E16E060325318BF907F987413F0E518547F90C000F0907F987411F0120D14EF54FE90C000F05315FDE4FFAD15120C1CE4F50EF50DD20EEB
-:40030600907E17E0600F431502E4FFAD15120C1C750D01D20E907E18E06010907F987412F0E516440490C000F0D20A907E19E06011431840907F987413F0E518547F90C064
-:4003460000F0907E1AE0600F5315FEE4FFAD15120C1C750F01D20E907E1BE0600F431501E4FFAD15120C1CE4F50FD20E907E1CE0600E907F987412F0E516440290C000F0D8
-:40038600907E1DE06002D212907E1EE06008751001E4F512D20E907E1FE06011907FD77411F07431F07415F07435F0D20CC20DE4907FCFF0301571E51260021512E52ED326
-:4003C60094004004152E8060752E0A120D14EF5401F51C650E6007851C0ED20E8011120D50EF5410F51C65096005851C09D20E120D50EF5480F51C650A6005851C0AD20EFB
-:40040600120D50EF5420F51C650B6008851C0B301002D20E120D50EF5440F51C650C6008851C0C301102D20E30152A907FD2E020E123907B40E06009E0F530907B42E0F572
-:4004460031907B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E10302051FE5257040300E39E5127035C20EF51B7E007B007408251BF9EE3400FA1209C7FF7447
-:4004860080251BF582E4347BF583EFF0051BE51BB409DB907FC37409F0751210E4F51075250222E5256402703630052FC205F51B7E007B007429251BF9EE3400FA1209C7C2
-:4004C600FF7480251BF582E4347BF583EFF0051BE51BB405DB907FC37405F075250322E5306033752F031530E4F51B7E007B00742F251BF9EE3400FA1209C7FF7480251B26
-:40050600F582E4347BF583EFF0051BE51BB403DB907FC37403F0E4F52522907FE9E0120A1F05F600066A0106D70305430605E90805E30905CB0A05DA0B00000727907FEBC9
-:40054600E024FE60161460502402706F7419907FD4F07400907FD5F002072E907FEAE070047F0280027F03758282758319EFF0758274758319F0758258758319F0907FEA65
-:40058600E004758217758319F07419907FD4F07412907FD5F002072E907FEAE0FF120A45EA49600DEA907FD4F0E9907FD5F002072E907FB4E04401F002072E907FB4E044D1
-:4005C60001F002072E907F00E524F0907FB57401F002072E907FEAE0F52402072E12073602072E907F007401F0907FB5F002072E907FE8E0247F60241460312402705BA221
-:4006060001E433FF25E0FFA207E4334F907F00F0E4A3F0907FB57402F002072EE4907F00F0A3F0907FB57402F002072E907FECE0F45480FFC4540FFFE054072F25E024B4CD
-:40064600F582E4347FF583E054FD907F00F0E4A3F0907FB57402F002072E907FB4E04401F002072E907FE8E024FE601E2402600302072E907FEAE0B40106120D6302072E53
-:40068600907FB4E04401F002072E907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FECE05480FF131313541FFFE054072F907F69
-:4006C600D7F0E04420F08060907FB4E04401F08057907FE8E024FE60192402704B907FEAE0B40105120D60803F907FB4E04401F08036907FEAE07020907FECE0F45480FFAD
-:40070600C4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022E4907F93F0907F9C7430F0E4907F96F06B
-:40074600907F9574C0F0907F9E743FF0907F987418F0E4F58E907FDF74FFF0907FDEF0E4F5087F017B0074082FF9E43400FAE4120A0D0FBF09EE751301E4F512F52EF511A2
-:40078600C20EC212C20DC20AC20FC204907F987413F075180390C0007403F07F0CE4FD120C1C7F108F17120BAA907F987412F07F018F16EF440690C000F00FE4FD120C1C71
-:4007C600E4FF7EA3AD068D15120C1C907F987411F090C000E4F07F057D7F120C1C7F01120CAC7F037D07120C1C907F987414F075198090C0007480F0D20322907F98741059
-:40080600F0AF23E528F582E527F583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF23E528F582E527F583C2AF058690C000E00586F0A30586DFF76F
-:400846000586D2AF22907F987408F0AF23E528F582E527F583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AF23E528F582E527F583C2AF058690C045
-:4008860000E00586F0A30586DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022787FE4F6D8FD7581310208FD020942E43B
-:4008C60093A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F456800146F6DFE4800B0102040810204080900CCDE47E019360BC36
-:40090600A3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BED214907F83
-:4009460092E04402F0120D63D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAE740DF0D2AFD215120C66C202E4F557
-:4009860026F52EC208C203907FA104F0907FD8E0651A6010300305D215120046907FD8E0F51A8008300305C215120046300207C20212052080D63009D3C209120ABA80CC40
-:4009C60022BB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E58229F582E51F
-:400A0600833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3A3A380DF8F58
-:400A46001BE4F51C751DFF751E19751F86AB1DAA1EA91F9000011209E0B4031DAF1C051CEFB51B01221209C77E0029FFEE3AA907751DFFF51E891F80D47B007A00790022F3
-:400A86000528E528AE277002052714F5828E83E511F01200360528E528AC277002052714F5828C83EFF01523E5236007120D448F1180CD22907FD8E0F51B120003907FD6AB
-:400AC600E04480F01208A6907FD6E030E70E300105120CFE8006120C8BEF60E112073622C0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D0DF
-:400B060084D085D082D083D0E032C0E0C083C082C085C084C086758600D2025391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C08675860025
-:400B4600D2095391EF907FAB7408F0D086D084D085D082D083D0E032907F987413F090C00074BFF0907F987410F090C000EFF0907F987413F0E518547F90C000F022907FDB
-:400B8600987413F090C00074BFF0907F987411F090C000EFF0907F987413F0E518547F90C000F022907F987413F090C00074BFF0907F987412F090C000EFF0907F98741307
-:400BC600F0E518547F90C000F022907F987413F090C00074BFF0907F987414F090C000EFF0907F987413F0E518547F90C000F022907F987413F090C00074BFF0907F9874F2
-:400C060016F090C000EFF0907F987413F0E518547F90C000F022907F987413F0E518547F90C000F0907F987417F090C000EFF0907F987415F090C000EDF022120D2C8F1D44
-:400C4600120D2C8F1EE51D651E6012120D2C8F1DE51D651E6007120D2C8F1E80E8AF1D22907FD6E054FBF0E04408F0301504E04402F07FF47E01120CE7907FD6E054F7F0D8
-:400C8600E04404F022907FD8E0F51C120736120D50EF30E60B907FD8E0651C60F17F01221200037F0022AE07E4FFE515547FFD120C1C907F987411F090C000EEF0E4E51599
-:400CC6004480FD120C1C2205290200000000032F030000C186C102C109C101C107012500008E1C8F1DE51D151DAE1C7002151C4E600512089580EE22907FD6E04401F07F86
-:400D06000D7E00120CE7907FD6E054FEF022907F987411F090C000E0FF22907F987412F090C000E0FF22907F987413F090C000E0FF22907F987414F090C000E0FF22907F2B
-:400D4600987415F090C000E0FF22907F987416F090C000E0FF2253D8EF32D20122C20122000000000000000000000000000000000000000000000000000000000000000073
-:400D8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002D
-:400DC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020B1000020EC0
-:400E06000400020AE600020B370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072
-:400E4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C
-:400E8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C
-:400EC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC
-:400F060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB
-:400F4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B
-:400F8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002B
-:400FC60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB
-:4010060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AA
-:40104600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A
-:40108600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A
-:4010C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA
-:4011060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A9
-:401146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069
-:401186000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029
-:4011C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9
-:4012060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A8
-:401246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068
-:401286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028
-:4012C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8
-:4013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A7
-:401346000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067
-:401386000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06080100000102000209027400010100A032090400000EFF000000070501024000000705020240000007050302400000070504024000000705050240007E
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:041A0600720000006A
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa28.HEX b/firmware/keyspan/usa28.HEX
deleted file mode 100644
index 000c97863c01..000000000000
--- a/firmware/keyspan/usa28.HEX
+++ /dev/null
@@ -1,148 +0,0 @@
-:0A0026001217DB1218B51214C322E2
-:0300330002001DAB
-:04001D0053D8EF3293
-:100006008E128F13E5131513AE12700215124E6081
-:07001600051218A480EE2280
-:03000300020046B2
-:10004600C0E0C083C082C086758600C0D075D00867
-:1000560030990E301107A217929B854699C299D204
-:100066001F30C10E301207A21892C38547C1C2C104
-:10007600D220201F03020442C21F2003030202678C
-:10008600201103020138E54AC3957C503E20133601
-:10009600200B33907F9BE020E303201C29301B12AA
-:1000A600AE4A054A74402EF582E4347EF583E013A9
-:1000B6009217AE4A054A74402EF582E4347EF583E3
-:1000C600E0F546020440C211020440907FC7E4F006
-:1000D600C20330150CC215907FBF04F0C211020492
-:1000E60040907FC8E030E105C211020440907FC90C
-:1000F600E0F57C907DC0E013921520132D200B2A8D
-:03004300021B009D
-:0300230002004692
-:03003B000200467A
-:0300000002163DA8
-:40010600907F9BE020E303201C20301B11907DC1E0139217A3E0F546754A03020440754A02907DC1E0F546020440754A01C211020440E54AC3957C50030201E0907FC6E08A
-:4001460030E107C221C205020440907FC7E0F57C907E40E01392153013030201D8200B7220006F907F9BE020E303201C65301B10907E41E013929BA3E0F599754A038009BE
-:40018600907E41E0F599754A02E54AC3957C4017907FC7E4F0C203201503020440C215907FBF04F0020440301B12AE4A054A74402EF582E4347EF583E0139217AE4A054AA7
-:4001C60074402EF582E4347EF583E0F546D211020440754A01C221020440301303020262200B79907F9BE020E303201C6F301B12AE4A054A74402EF582E4347EF583E013DC
-:40020600929BAE4A054A74402EF582E4347EF583E0F599E54AC3957C4017907FC7E4F0C203201503020440C215907FBF04F0020440301B12AE4A054A74402EF582E4347EB6
-:40024600F583E0139217AE4A054A74402EF582E4347EF583E0F546D211020440C221020440201103020319E54AC3957C503E201336200B33907F9BE020E303201C29301B5F
-:4002860012AE4A054A74C02EF582E4347DF583E0139217AE4A054A74C02EF582E4347DF583E0F546020440C211020440907FC9E4F0D20330150CC215907FBF04F0C2110276
-:4002C6000440907FC6E030E105C211020440907FC7E0F57C907E40E013921520132D200B2A907F9BE020E303201C20301B11907E41E0139217A3E0F546754A03020440759E
-:400306004A02907E41E0F546020440754A01C211020440E54AC3957C50030203C1907FC8E030E107C221C205020440907FC9E0F57C907DC0E01392153013030203B9200B48
-:400346007220006F907F9BE020E303201C65301B10907DC1E013929BA3E0F599754A038009907DC1E0F599754A02E54AC3957C4017907FC9E4F0D203201503020440C21573
-:40038600907FBF04F0020440301B12AE4A054A74C02EF582E4347DF583E0139217AE4A054A74C02EF582E4347DF583E0F546D211020440754A01C221020440301303020463
-:4003C6003E200B74907F9BE020E303201C6A301B12AE4A054A74C02EF582E4347DF583E013929BAE4A054A74C02EF582E4347DF583E0F599E54AC3957C4013907FC9E4F09D
-:40040600D203301535C215907FBF04F0802C301B12AE4A054A74C02EF582E4347DF583E0139217AE4A054A74C02EF582E4347DF583E0F546D2118002C221D2252020030230
-:40044600080CC220200403020631201203020502E54BC3957D503E201436200D33907F9AE020E503201E29301D12AE4B054B74402EF582E4347DF583E0139218AE4B054B99
-:4004860074402EF582E4347DF583E0F54702080AC21202080A907FCBE4F0C20430160CC216907FC104F0C21202080A907FCCE030E105C21202080A907FCDE0F57D907CC0BB
-:4004C600E013921620142D200D2A907F9AE020E503201E20301D11907CC1E0139218A3E0F547754B0302080A754B02907CC1E0F54702080A754B01C21202080AE54BC39566
-:400506007D50030205AA907FCAE030E107C222C20602080A907FCBE0F57D907D40E01392163014030205A2200D7220006F907F9AE020E503201E65301D10907D41E013920D
-:40054600C3A3E0F5C1754B038009907D41E0F5C1754B02E54BC3957D4017907FCBE4F0C20420160302080AC216907FC104F002080A301D12AE4B054B74402EF582E4347D24
-:40058600F583E0139218AE4B054B74402EF582E4347DF583E0F547D21202080A754B01C22202080A30140302062C200D79907F9AE020E503201E6F301D12AE4B054B7440E9
-:4005C6002EF582E4347DF583E01392C3AE4B054B74402EF582E4347DF583E0F5C1E54BC3957D4017907FCBE4F0C20420160302080AC216907FC104F002080A301D12AE4B91
-:40060600054B74402EF582E4347DF583E0139218AE4B054B74402EF582E4347DF583E0F547D21202080AC22202080A2012030206E3E54BC3957D503E201436200D33907F1A
-:400646009AE020E503201E29301D12AE4B054B74C02EF582E4347CF583E0139218AE4B054B74C02EF582E4347CF583E0F54702080AC21202080A907FCDE4F0D20430160C43
-:40068600C216907FC104F0C21202080A907FCAE030E105C21202080A907FCBE0F57D907D40E013921620142D200D2A907F9AE020E503201E20301D11907D41E0139218A352
-:4006C600E0F547754B0302080A754B02907D41E0F54702080A754B01C21202080AE54BC3957D500302078B907FCCE030E107C222C20602080A907FCDE0F57D907CC0E013AC
-:400706009216301403020783200D7220006F907F9AE020E503201E65301D10907CC1E01392C3A3E0F5C1754B038009907CC1E0F5C1754B02E54BC3957D4017907FCDE4F0AE
-:40074600D20420160302080AC216907FC104F002080A301D12AE4B054B74C02EF582E4347CF583E0139218AE4B054B74C02EF582E4347CF583E0F547D21202080A754B0173
-:40078600C22202080A301403020808200D74907F9AE020E503201E6A301D12AE4B054B74C02EF582E4347CF583E01392C3AE4B054B74C02EF582E4347CF583E0F5C1E54B3F
-:4007C600C3957D4013907FCDE4F0D204301635C216907FC104F0802C301D12AE4B054B74C02EF582E4347CF583E0139218AE4B054B74C02EF582E4347CF583E0F547D2122A
-:400806008002C222D22520980302093EC2982001030208B0202327AE48054874802EF582E4347EF583E599F0301B49AE48054874802EF582E4347EF583E598F08036AF996E
-:40084600EFB55804D20B802CEFB55704C20B8024AE48054874802EF582E4347EF583EFF0301B11AE48054874802EF582E4347EF583E598F0D219E548C39554500302093C9F
-:40088600907FB8E030E115E548C39440500302093C15481548052DD20C02093C907FB7E548F0754800C20102093C202327AE48054874002EF582E4347EF583E599F0301BBF
-:4008C60049AE48054874002EF582E4347EF583E598F08036AF99EFB55804D20B802CEFB55704C20B8024AE48054874002EF582E4347EF583EFF0301B11AE48054874002E51
-:40090600F582E4347EF583E598F0D219E548C395544023907FB6E030E111E548C39440401515481548052DD20C800B907FB9E548F0754800D201D22520C003020A70C2C016
-:400946002002030209E2202427AE49054974802EF582E4347DF583E5C1F0301D49AE49054974802EF582E4347DF583E5C0F08036AFC1EFB57004D20D802CEFB56F04C20DAE
-:400986008024AE49054974802EF582E4347DF583EFF0301D11AE49054974802EF582E4347DF583E5C0F0D21AE549C3956C5003020A6E907FBCE030E115E549C39440500351
-:4009C600020A6E154915490539D20E020A6E907FBBE549F0754900C202020A6E202427AE49054974002EF582E4347DF583E5C1F0301D49AE49054974002EF582E4347DF555
-:400A060083E5C0F08036AFC1EFB57004D20D802CEFB56F04C20D8024AE49054974002EF582E4347DF583EFF0301D11AE49054974002EF582E4347DF583E5C0F0D21AE54983
-:400A4600C3956C4023907FBAE030E111E549C394404015154915490539D20E800B907FBDE549F0754900D202D225302505C225020056D0D0D086D082D083D0E032907FCE99
-:400A8600E030E103020BA5E4F51274402512F582E4347CF583E0FFE5127C007B00244CF9EC3400FAEF1215CD0512E512B418DBE54C600C75C92075C836854DCA854ECBE5BC
-:400AC6004F13921B929FE55013921CE551139223E5526009907F98E054FBF08007907F98E04404F0E5536009907F98E0547FF08007907F98E04480F0E559600BC213C20B18
-:400B0600907F95E04402F0E55A600BD20BD20C907F95E04402F0E55B600DC2AFC211D200E4F57CF54AD2AFE55C6005302302D20BE55D6015907F95E054FDF0907F9EE044D9
-:400B460002F0907F98E054FDF0E55E600AD29CC298752E01754028E55F6007C29CE4F548F52EE5606003E4F548E5616002D207E5626008E55E7002F540D20CE56360199060
-:400B86007FD77411F07431F07412F07432F07415F07435F0D203D201D209E4907FCFF0A213E433FF652B60048F2BD20CA20BE433FF652C60048F2CD20C907F9BE054086589
-:400BC600276007E05408F527D20C907F9BE05440B52909E054406440F529D20C300735C2AF300118907FB8E020E127E5486009907FB7F0E4F548C201C2078016907FB6E0E9
-:400C060020E10FE5486009907FB9F0E4F548D201C207D2AF20053730031B907FC6E020E12D907E40E0139215754A01907FC7E0F57CD2058019907FC8E020E112907DC0E0CF
-:400C4600139215754A01907FC9E0F57CD205202133200006E54A657C702A30051A300309E4907FC7F0C2038007E4907FC9F0D203C205E4F57CF54A30150AC215C200907F5C
-:400C8600BF7401F0302103020D94200503020D94301C0A907F9BE020E303020D94300B03020D94301303020D94300362301B12AF4A054A74402FF582E4347EF583E01392CE
-:400CC6002DAF4A054A74402FF582E4347EF583E0F513E54AC3957C502A301B12AF4A054A74402FF582E4347EF583E0139217AF4A054A74402FF582E4347EF583E0F546D266
-:400D060011806BC211E4907FC7F0C2038060301B12AF4A054A74C02FF582E4347DF583E013922DAF4A054A74C02FF582E4347DF583E0F513E54AC3957C502A301B12AF4A67
-:400D4600054A74C02FF582E4347DF583E0139217AF4A054A74C02FF582E4347DF583E0F546D2118009C211E4907FC9F0D203301B04A22D929BD221C2AF85139920110D3043
-:400D8600150AC215C200907FBF7401F0D2AF907FD0E030E103020EB5E4F51274C02512F582E4347BF583E0FFE5127C007B002464F9EC3400FAEF1215CD0512E512B418DB51
-:400DC600E564600B758960758840D2DF85658DE56713921D92C7E56813921EE569139224E56A6009907F97E054EFF08007907F97E04410F0E56B6009907F97E0547FF080A4
-:400E060007907F97E04480F0E571600BC214C20D907F94E04408F0E572600BD20DD20E907F94E04408F0E573600DC2AFC212D200E4F57DF54BD2AFE5746005302402D20D20
-:400E4600E5756015907F94E054F7F0907F9DE04408F0907F97E054F7F0E576600AD2C4C2C0753A01754128E5776007C2C4E4F549F53AE5786003E4F549E5796002D208E5F0
-:400E86007A6008E5767002F541D20EE57B6019907FD77413F07433F07414F07434F07416F07436F0D204D202D20AE4907FD1F0A214E433FF653760048F37D20EA20DE43304
-:400EC600FF653860048F38D20E907F9AE0542065336007E05420F533D20E907F9AE05440B53509E054406440F535D20E300835C2AF300218907FBCE020E127E54960099099
-:400F06007FBBF0E4F549C202C2088016907FBAE020E10FE5496009907FBDF0E4F549D202C208D2AF20063730041B907FCAE020E12D907D40E0139216754B01907FCBE0F503
-:400F46007DD2068019907FCCE020E112907CC0E0139216754B01907FCDE0F57DD206202233200006E54B657D702A30061A300409E4907FCBF0C2048007E4907FCDF0D2042C
-:400F8600C206E4F57DF54B30160AC216C200907FC17401F03022030210A42006030210A4301E0A907F9AE020E5030210A4300D030210A43014030210A4300462301D12AF8E
-:400FC6004B054B74402FF582E4347DF583E013922DAF4B054B74402FF582E4347DF583E0F513E54BC3957D502A301D12AF4B054B74402FF582E4347DF583E0139218AF4B78
-:40100600054B74402FF582E4347DF583E0F547D212806BC212E4907FCBF0C2048060301D12AF4B054B74C02FF582E4347CF583E013922DAF4B054B74C02FF582E4347CF5F2
-:4010460083E0F513E54BC3957D502A301D12AF4B054B74C02FF582E4347CF583E0139218AF4B054B74C02FF582E4347CF583E0F547D2128009C212E4907FCDF0D204301DF4
-:4010860004A22D92C3D222C2AF8513C120120D30160AC216C200907FC17401F0D2AF907FC2E030E10302117AE51A7046300C3FE540703BA20933F531C209C20CE4F5127E0D
-:4010C600007B0074262512F9EE3400FA121587FF74802512F582E4347BF583EFF00512E512B40CDB907FC3740CF075401022751A0122E51A64017045300E3EE541703AA2C5
-:401106000A33F53DC20AC20EE4F5127E007B0074322512F9EE3400FA121587FF74802512F582E4347BF583EFF00512E512B40CDB907FC3740CF0754110751A0222E51C60CA
-:4011460030151CE4F5127E007B00741B2512F9EE3400FA121587FF74802512F582E4347BF583EFF00512E512B403DB907FC37403F0E4F51A22907FE9E012161712400012A7
-:40118600B401132003119E06123308122D0912200A13760B0000136F907FEBE024FE6016146040240270697419907FD4F07400907FD5F0021376907FEAE0FF12174B8B1261
-:4011C6008A138914EA496011AE02EE907FD4F0AF01EF907FD5F0021376907FB4E04401F0021376907FEAE0FF12179A8B128A138914EA496011AE02EE907FD4F0AF01EF9083
-:401206007FD5F0021376907FB4E04401F0021376907FB4E04401F0021376907F007401F0907FB5F00213761214C3021376907F007401F0907FB5F0021376907FE8E0247FBF
-:4012460060241460312402705BA226E433FF25E0FFA22BE4334F907F00F0E4A3F0907FB57402F0021376E4907F00F0A3F0907FB57402F0021376907FECE0F45480FFC45429
-:401286000FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0021376907FB4E04401F0021376907FE8E024FE601D24026003021376907FEA0B
-:4012C600E0B40105C226021376907FB4E04401F0021376907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FECE05480FF131313A7
-:40130600541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D226803F907FB4E04401F08036907FEAE07020A3
-:40134600907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F0222028030214C2E54063
-:4013860060021540E548604F65447045E542F460020542E542C39555403DC2AF300118907FB8E020E127907FB7E548F0C201E4F548F542F5448016907FB6E020E10F907F07
-:4013C600B9E548F0D201E4F548F542F544D2AF8006854844E4F542E52E602D201907907F9BE030E00EE52F6005E4F52FD20CE4F53E8013E53ED39556500CE53EB556057504
-:401406002F01D20C053EC219E54160021541E549604F65457045E543F460020543E543C3956D403DC2AF300218907FBCE020E127907FBBE549F0C202E4F549F543F54580E2
-:4014460016907FBAE020E10F907FBDE549F0D202E4F549F543F545D2AF8006854945E4F543E53A602D201A07907F9AE030E20EE53B6005E4F53BD20EE4F53F8013E53FD35E
-:40148600956E500CE53FB56E05753B01D20E053FC21A907FD2E020E123907B40E06009E0F51C907B42E0F51D907B41E06009907FD77417F07437F0E4907FD3F022E4907FC5
-:4014C60093F0907F9C7430F0907F96E04410F0907F94740DF0907F9D749AF0907F97E054FDF0907F957423F0907F9E7484F0E4907FC7F0907FC9F0907FCFF075984043A89E
-:4015060010C21BC205C221C20BC213F57CF54AC211C215F542C219F544F548C223C21CF52DF52FC207C200C21FF53EC209D20CF526907FCBF0907FCDF0907FD1F075C04043
-:4015460043A840C21DC206C222C20DC214F57DF54BC212C216F543C21AF545F549C224C21EF539F53BC208C200C220F53FC20AD20E753201907FDF74FFF0907FDEF0D228DE
-:4015860022BB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E58229F582E553
-:4015C600833AF583E49322BB010689828A83F0225002F722BBFE01F322BB0110E58229F582E5833AF583E0F5F0A3E0225009E92582F886F008E622BBFE0AE92582F8E2F511
-:40160600F008E222E5832AF583E993F5F0A3E99322D083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3A3A380DF787FE4F6D8FD75817D0E
-:401646000216840216C9E493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F456800146F6DFE4800B010204081020408090181A
-:40168600C5E47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CADFE9DE39
-:4016C600E780BE751101907F92E054FDF0907FAEE0FFD39226E433FEEF4EF0D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE044C5
-:4017060001F0907FAEE0440DF0D2AFD2BCD2BED22D12187FC227C225C228302803120A83907FD8E065106008E0F51012137E80EA302707C22712117B80E0302CDDC22C12C5
-:40174600002680D622E4FE7517FF751819751912AB17AA18A9199000011215A06402702DAD060EEDB50701229000021215DF85F015F5166215E5156216E516621529FDE551
-:40178600153AA9057517FFF518891980C37B007A007900228F15E4F5167517FF751819751986AB17AA18A9199000011215A0B4031DAF160516EFB51501221215877E0029BE
-:4017C600FFEE3AA9077517FFF518891980D47B007A00790022E4907F93F0907F9CF0907F94F0907F9D7402F0907F97F0E4907F95F0907F9E74FFF0E4907F98F0907F9DF003
-:4018060022C0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2275391EF9024
-:401846007FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D22C5391EF907FAB7408F0D086D084D085D082D083D0E032907FD6E054FBF0DD
-:40188600E04408F0302D04E04402F07FF47E01120006907FD6E054F7F0E04404F0227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022C125
-:4018C600AA011A00031B030000C127C12CC126C12B000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF0031
-:401906000040CD060F0100000102000109027400010100A032090400000EFF0000000705010240000007050202400000070503024000000705040240000007050502400078
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:401A0600720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E
-:401A46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
-:401A86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020
-:401AC6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002183100021B78
-:091B06000400021807000218583F
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa28x.HEX b/firmware/keyspan/usa28x.HEX
deleted file mode 100644
index 9f0f7fac7609..000000000000
--- a/firmware/keyspan/usa28x.HEX
+++ /dev/null
@@ -1,141 +0,0 @@
-:030033000212F7BF
-:10000300E4907F93F0907F9C7430F0E4907F96F0BF
-:10001300907F94F0907F9D74FFF0E4907F97F09031
-:0F0023007F95F0907F9E7407F0E4907F98F02215
-:1000460030091812131BEFC3953C40030200D890E9
-:100056007FBF7401F0C209C200807730033B907FF6
-:10006600C6E020E16D12131BEFC394405064907EEE
-:1000760040E0139209907FC7E014F5192000116043
-:100086000FF5087E7E7F41750C7E750D41120CBA08
-:10009600C203E4907FC7F08039907FC8E020E13248
-:1000A60012131BEFC394405029907DC0E0139209B0
-:1000B600907FC9E014F519200011600FF5087E7DC8
-:1000C6007FC1750C7D750DC1120CBAD203E4907F09
-:1000D600C9F0907FB6E030E1030201601211D68FBD
-:1000E600191213278F36E519C3953A500F1212EBE2
-:1000F600EF30E008E53620E703300B5EC20BE5196A
-:0C003600907F987410F090C000E0FF2252
-:03004300021300A5
-:03000000020E00ED
-:400106006058B48003433602E53630E726E519D3942040037519208519087E7E7F80750C7E750D80AF36120F4BE51925E0907FB7F08027E519D3943F400375193F851908D4
-:40014600907E80E536F07E7E7F81750C7E750D81120CDFE51904907FB7F0907FCEE030E1062005030203C1C205E4F51874402518F582E4347CF583E0FFE5187C007B017AF1
-:400186007E79002400F9EC347EFAEF120ED20518E518B420D7907E00E06068907E03E060247F01E4FD1211B17F037DCD1211B1434680907F987414F090C000E546F0E490E0
-:4001C6007E13F08030907E01E0FF121035907E02E0FF12105B7F01907E11E0FD1211B17F037D071211B1434680907F987414F090C000E546F0907F987412F0E5404406903E
-:40020600C000F0907E03E07006907E13E07008E4907E13F07525FF907E05E06012A3E0543FF544907F987413F090C000E544F0907E07E0602BA3E0600543428080035342DA
-:400246007F5342FC907E09E06011434202A3E0FF1210A7907E0BE0FF1210CDAF42121081907E03E0600853427FAF42121081907E0CE06018A3E0600543460280035346FDB4
-:40028600907F987414F090C000E546F0907E0EE06018A3E0600543460180035346FE907F987414F090C000E546F0907E12E0F53AA3E013920DA3E0F53CA3E060054346108B
-:4002C60080035346EF907F987414F090C000E546F0907E16E060325344BF907F987413F0E544547F90C000F0907F987411F01212DFEF54FE90C000F0533EFDE4FFAD3E120F
-:4003060011B1E4F52AF529D207907E17E0600F433E02E4FFAD3E1211B1752901D207907E18E06010907F987412F0E540440490C000F0D200907E19E06011434440907F98F2
-:400346007413F0E544547F90C000F0907E1AE0600F533EFEE4FFAD3E1211B1752B01D207907E1BE0600F433E01E4FFAD3E1211B1E4F52BD207907E1CE0600E907F98741284
-:40038600F0E540440290C000F0907E1DE06002D20B907E1EE06008752C01E4F538D207907E1FE06011907FD77411F07431F07415F07435F0D203E4907FCFF0301A52E53892
-:4003C60060021538201349E513D3940040041513803E75130A301B02D2131212DFEF5401F519652A600585192AD207121333EF5480F51965266005851926D207300D11127F
-:400406001333EF5410F51965256005851925D207201B030207EC300A1812136FEFC3953D40030204AE907FC17401F0C20AC200807730043B907FCAE020E16D12136FEFC35A
-:4004460094405064907D40E013920A907FCBE014F519200011600FF5087E7D7F41750C7D750D41120D04C204E4907FCBF08039907FCCE020E13212136FEFC39440502990BC
-:400486007CC0E013920A907FCDE014F519200011600FF5087E7C7FC1750C7C750DC1120D04D204E4907FCDF0907FBAE030E1030205361212208F1912137B8F37E519C3952B
-:4004C6003B500F121357EF30E008E53720E703300C5EC20CE5196058B48003433702E53730E726E519D3942040037519208519087E7D7F80750C7D750D80AF37120F84E503
-:400506001925E0907FBBF08027E519D3943F400375193F851908907D80E537F07E7D7F81750C7D750D81120D29E51904907FBBF0907FD0E030E106200603020797C206E4F8
-:40054600F51874C02518F582E4347BF583E0FFE5187C007B017A7E79202420F9EC347EFAEF120ED20518E518B420D7907E20E06068907E23E060247F01E4FD1211FB7F0329
-:400586007DCD1211FB434780907F98740CF090C000E547F0E4907E33F08030907E21E0FF121119907E22E0FF12113F7F01907E31E0FD1211FB7F037D071211FB4347809048
-:4005C6007F98740CF090C000E547F0907F98740AF0E541440690C000F0907E23E07006907E33E07008E4907E33F0752EFF907E25E06012A3E0543FF545907F98740BF090EB
-:40060600C000E545F0907E27E0602BA3E06005434380800353437F5343FC907E29E06011434302A3E0FF121165907E2BE0FF12118BAF431210F3907E23E0600853437FAFFE
-:40064600431210F3907E2CE06018A3E0600543470280035347FD907F98740CF090C000E547F0907E2EE06018A3E0600543470180035347FE907F98740CF090C000E547F0D4
-:40068600907E32E0F53BA3E013920EA3E0F53DA3E0600543471080035347EF907F98740CF090C000E547F0907E36E060325345BF907F98740BF0E545547F90C000F0907F79
-:4006C600987409F012134BEF54FE90C000F0533FFDE4FFAD3F1211FBE4F533F532D208907E37E0600F433F02E4FFAD3F1211FB753201D208907E38E06010907F98740AF043
-:40070600E541440490C000F0D200907E39E06011434540907F98740BF0E545547F90C000F0907E3AE0600F533FFEE4FFAD3F1211FB753401D208907E3BE0600F433F01E4E9
-:40074600FFAD3F1211FBE4F534D208907E3CE0600E907F98740AF0E541440290C000F0907E3DE06002D20C907E3EE06008753501E4F539D208907E3FE06011907FD7741389
-:40078600F07433F07416F07436F0D204E4907FD1F0301A52E53960021539301349E513D3940040041513803E75130A301B02C21312134BEF5401F51965336005851933D279
-:4007C60008121387EF5480F519652F600585192FD208300E11121387EF5410F519652E600585192ED208301A2A907FD2E020E123907B40E06009E0F515907B42E0F5169035
-:400806007B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E103020920E50A7040300739E5387035C207F5187E007B0074242518F9EE3400FA120E8CFF748025BD
-:4008460018F582E4347BF583EFF00518E518B409DB907FC37409F0753810E4F52C750A0122E50A64017040300839E5397035C208F5187E007B00742D2518F9EE3400FA1297
-:400886000E8CFF74802518F582E4347BF583EFF00518E518B409DB907FC37409F0753910E4F535750A0222E50A6402703630142FC214F5187E007B00740E2518F9EE340083
-:4008C600FA120E8CFF74802518F582E4347BF583EFF00518E518B405DB907FC37405F0750A0322E51560301515E4F5187E007B0074142518F9EE3400FA120E8CFF748025F2
-:4009060018F582E4347BF583EFF00518E518B403DB907FC37403F0E4F50A22907FE9E0120EE40A08000A7C010AE80309440609FB0809F50909DD0A09EC0B00000B37907F3D
-:40094600EBE024FE6019146061240260030209D37419907FD4F07400907FD5F0020B3E907FEAE070047F0280027F03758282758319EFF075827B758319F0758274758319B2
-:40098600F0758266758319F0758258758319F0907FEAE004758217758319F07419907FD4F07412907FD5F0020B3E907FEAE0FF120F0AEA49600DEA907FD4F0E9907FD5F085
-:4009C600020B3E907FB4E04401F0020B3E907FB4E04401F0020B3E907F00E509F0907FB57401F0020B3E907FEAE0F509020B3E120B46020B3E907F007401F0907FB5F00205
-:400A06000B3E907FE8E0247F60241460312402705BA210E433FF25E0FFA216E4334F907F00F0E4A3F0907FB57402F0020B3EE4907F00F0A3F0907FB57402F0020B3E907F04
-:400A4600ECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B3E907FB4E04401F0020B3E907FE8E024FE601D24020F
-:400A86006003020B3E907FEAE0B40105C210020B3E907FB4E04401F0020B3E907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FB6
-:400AC600ECE05480FF131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D210803F907FB4E04401F049
-:400B06008036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022D4
-:400B4600E4907F93F0907F9C7430F0E4907F96F0907F9574C0F0907F9E743FF0907F987418F0E4F58E907FDF74FFF0907FDEF0E4F5247518017B0074242518F9E43400FA8B
-:400B8600E4120ED20518E518B409EA753A01E4F538F513F536C207C20BC205C200C209C213907F987413F075440390C0007403F07F0CE4FD1211B17F108F42121081907F02
-:400BC600987412F07F018F40EF440690C000F0907F987414F075468090C0007480F00FE4FD1211B1E4FF7EA3AD068D3E1211B1907F987411F090C000E4F07F057D7F12118E
-:400C0600B17F0112126A7F037D071211B1201B03020CB7752D017518017B00742D2518F9E43400FAE4120ED20518E518B409EA753B01E4F539F513F537C208C20CC206C2CD
-:400C460000C20AC213907F98740BF075450390C0007403F07F0CE4FD1211FB7F108F431210F3907F98740AF07F018F41EF440690C000F0907F98740CF075478090C000744E
-:400C860080F00FE4FD1211FBE4FF7EA3AD068D3F1211FB907F987409F090C000E4F07F057D7F1211FB7F0112128B7F037D071211FBD21222907F987410F0AF08E50DF582A5
-:400CC600E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF08E50DF582E50CF583C2AF058690C000E00586F0A30586DFF70586D2AF22907F20
-:400D0600987408F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AF08E50DF582E50CF583C2AF058690C000E00586F0A3055C
-:400D460086DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022D219907F92E04402F0907FAEE0FFD39210E433FEEF4EF089
-:400D8600D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440DF0D2AFD21A121245C211E4F50BF513C217C212D4
-:400DC600907FA104F0907FD8E065176010301205D21A120046907FD8E0F5178008301205C21A120046301107C21112092180D63018D3C21812139380CC22787FE4F6D8FDC7
-:400E0600758147020E47020D6FE493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F456800146F6DFE4800B01020408102040F5
-:400E4600809012ACE47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CA1E
-:400E8600DFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E5B8
-:400EC6008229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3C1
-:400F0600A3A380DF8F18E4F519751AFF751B19751C86AB1AAA1BA91C900001120EA5B4031DAF190519EFB5180122120E8C7E0029FFEE3AA907751AFFF51B891C80D47B00A5
-:400F46007A007900228F1A050DE50DAE0C7002050C14F5828E83E51AF0120036050DE50DAC0C7002050C14F5828C83EFF01508E508600A1213278F1AEF423680CA228F1AFC
-:400F8600050DE50DAE0C7002050C14F5828E83E51AF012133F050DE50DAC0C7002050C14F5828C83EFF01508E508600A12137B8F1AEF423780CA22C0E0C083C082C085C088
-:400FC60084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2115391EF907FAB7401F0D086D084D0C6
-:4010060085D082D083D0E032C0E0C083C082C085C084C086758600D2185391EF907FAB7408F0D086D084D085D082D083D0E032907F987413F090C00074BFF0907F9874108A
-:40104600F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987411F090C000EFF0907F987413F0E544547F90C000F022907F98741349
-:40108600F090C00074BFF0907F987412F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987414F090C000EFF0907F987413F0E544D9
-:4010C600547F90C000F022907F987413F090C00074BFF0907F987416F090C000EFF0907F987413F0E544547F90C000F022907F98740BF090C00074BFF0907F98740AF0902A
-:40110600C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F987408F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090AF
-:40114600C00074BFF0907F987409F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F98740CF090C000EFF0907F98740BF0E545547FEC
-:4011860090C000F022907F98740BF090C00074BFF0907F98740EF090C000EFF0907F98740BF0E545547F90C000F022907F987413F0E544547F90C000F0907F987417F09075
-:4011C600C000EFF0907F987415F090C000EDF02212130F8F1A12130F8F1BE51A651B601212130F8F1AE51A651B600712130F8F1B80E8AF1A22907F98740BF0E545547F9098
-:40120600C000F0907F98740FF090C000EFF0907F98740DF090C000EDF0221213638F1A1213638F1BE51A651B60121213638F1AE51A651B60071213638F1B80E8AF1A2290C8
-:401246007FD6E054FBF0E04408F0301A04E04402F07FF47E011212C8907FD6E054F7F0E04404F022AE07E4FFE53E547FFD1211B1907F987411F090C000EEF0E4E53E4480E8
-:40128600FD1211B122AE07E4FFE53F547FFD1211FB907F987409F090C000EEF0E4E53F4480FD1211FB22050E02000000000314030000C111C118C195C110C116010A00C19C
-:4012C6009B008E188F19E5191519AE18700215184E6005120D4E80EE22907F987411F090C000E0FF22907F987412F090C000E0FF2253D8EF320000000000020FE70002138A
-:401306000400020FBD0002100E907F987413F090C000E0FF22907F987414F090C000E0FF22907F987415F090C000E0FF22907F987416F090C000E0FF22907F987408F09050
-:40134600C000E0FF22907F987409F090C000E0FF22907F98740AF090C000E0FF22907F98740BF090C000E0FF22907F98740CF090C000E0FF22907F98740DF090C000E0FFC5
-:4013860022907F98740EF090C000E0FF22120003120D5F120B4622000000000000000000000000000000000000000000000000000000000000000000000000000000000083
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06100100000102000209027400010100A032090400000EFF0000000705010240000007050202400000070503024000000705040240000007050502400076
-:4019460000070506024000000705070240000007058102400001070582024000000705830240000107058402400001070585024000010705860240000107058702400001F4
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:041A0600720000006A
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa28xa.HEX b/firmware/keyspan/usa28xa.HEX
deleted file mode 100644
index f14932efbafb..000000000000
--- a/firmware/keyspan/usa28xa.HEX
+++ /dev/null
@@ -1,141 +0,0 @@
-:030033000212F9BD
-:10000300E4907F93F0907F9C7430F0E4907F96F0BF
-:10001300907F94F0907F9D74FFF0E4907F97F09031
-:0F0023007F95F0907F9E7407F0E4907F98F02215
-:10004600300918121327EFC3953C40030200D890DD
-:100056007FBF7401F0C209C200807730033B907FF6
-:10006600C6E020E16D121327EFC394405064907EE2
-:1000760040E0139209907FC7E014F5192000116043
-:100086000FF5087E7E7F41750C7E750D41120CC8FA
-:10009600C203E4907FC7F08039907FC8E020E13248
-:1000A600121327EFC394405029907DC0E0139209A4
-:1000B600907FC9E014F519200011600FF5087E7DC8
-:1000C6007FC1750C7D750DC1120CC8D203E4907FFB
-:1000D600C9F0907FB6E030E1030201601211E48FAF
-:1000E600191213338F36E519C3953A500F12130FB1
-:1000F600EF30E008E53620E703300B5EC20BE5196A
-:0C003600907F987410F090C000E0FF2252
-:03004300021300A5
-:03000000020E0EDF
-:400106006058B48003433602E53630E726E519D3942040037519208519087E7E7F80750C7E750D80AF36120F59E51925E0907FB7F08027E519D3943F400375193F851908C6
-:40014600907E80E536F07E7E7F81750C7E750D81120CEDE51904907FB7F0907FCEE030E1062005030203C1C205E4F51874402518F582E4347CF583E0FFE5187C007B017AE3
-:400186007E79002400F9EC347EFAEF120EE00518E518B420D7907E00E06068907E03E060247F01E4FD1211BF7F037DCD1211BF434680907F987414F090C000E546F0E490B6
-:4001C6007E13F08030907E01E0FF121043907E02E0FF1210697F01907E11E0FD1211BF7F037D071211BF434680907F987414F090C000E546F0907F987412F0E54044069006
-:40020600C000F0907E03E07006907E13E07008E4907E13F07525FF907E05E06012A3E0543FF544907F987413F090C000E544F0907E07E0602BA3E0600543428080035342DA
-:400246007F5342FC907E09E06011434202A3E0FF1210B5907E0BE0FF1210DBAF4212108F907E03E0600853427FAF4212108F907E0CE06018A3E0600543460280035346FD7C
-:40028600907F987414F090C000E546F0907E0EE06018A3E0600543460180035346FE907F987414F090C000E546F0907E12E0F53AA3E013920DA3E0F53CA3E060054346108B
-:4002C60080035346EF907F987414F090C000E546F0907E16E060325344BF907F987413F0E544547F90C000F0907F987411F01212EDEF54FE90C000F0533EFDE4FFAD3E1201
-:4003060011BFE4F52AF529D207907E17E0600F433E02E4FFAD3E1211BF752901D207907E18E06010907F987412F0E540440490C000F0D200907E19E06011434440907F98D6
-:400346007413F0E544547F90C000F0907E1AE0600F533EFEE4FFAD3E1211BF752B01D207907E1BE0600F433E01E4FFAD3E1211BFE4F52BD207907E1CE0600E907F98741268
-:40038600F0E540440290C000F0907E1DE06002D20B907E1EE06008752C01E4F538D207907E1FE06011907FD77411F07431F07415F07435F0D203E4907FCFF0301A52E53892
-:4003C60060021538201349E513D3940040041513803E75130A301B02D2131212EDEF5401F519652A600585192AD20712133FEF5480F51965266005851926D207300D111265
-:40040600133FEF5410F51965256005851925D207201B030207EC300A1812137BEFC3953D40030204AE907FC17401F0C20AC200807730043B907FCAE020E16D12137BEFC336
-:4004460094405064907D40E013920A907FCBE014F519200011600FF5087E7D7F41750C7D750D41120D12C204E4907FCBF08039907FCCE020E13212137BEFC39440502990A2
-:400486007CC0E013920A907FCDE014F519200011600FF5087E7C7FC1750C7C750DC1120D12D204E4907FCDF0907FBAE030E10302053612122E8F191213878F37E519C39503
-:4004C6003B500F121363EF30E008E53720E703300C5EC20CE5196058B48003433702E53730E726E519D3942040037519208519087E7D7F80750C7D750D80AF37120F92E5E9
-:400506001925E0907FBBF08027E519D3943F400375193F851908907D80E537F07E7D7F81750C7D750D81120D37E51904907FBBF0907FD0E030E106200603020797C206E4EA
-:40054600F51874C02518F582E4347BF583E0FFE5187C007B017A7E79202420F9EC347EFAEF120EE00518E518B420D7907E20E06068907E23E060247F01E4FD1212097F030C
-:400586007DCD121209434780907F98740CF090C000E547F0E4907E33F08030907E21E0FF121127907E22E0FF12114D7F01907E31E0FD1212097F037D0712120943478090FF
-:4005C6007F98740CF090C000E547F0907F98740AF0E541440690C000F0907E23E07006907E33E07008E4907E33F0752EFF907E25E06012A3E0543FF545907F98740BF090EB
-:40060600C000E545F0907E27E0602BA3E06005434380800353437F5343FC907E29E06011434302A3E0FF121173907E2BE0FF121199AF43121101907E23E0600853437FAFD3
-:4006460043121101907E2CE06018A3E0600543470280035347FD907F98740CF090C000E547F0907E2EE06018A3E0600543470180035347FE907F98740CF090C000E547F0C5
-:40068600907E32E0F53BA3E013920EA3E0F53DA3E0600543471080035347EF907F98740CF090C000E547F0907E36E060325345BF907F98740BF0E545547F90C000F0907F79
-:4006C600987409F0121357EF54FE90C000F0533FFDE4FFAD3F121209E4F533F532D208907E37E0600F433F02E4FFAD3F121209753201D208907E38E06010907F98740AF019
-:40070600E541440490C000F0D200907E39E06011434540907F98740BF0E545547F90C000F0907E3AE0600F533FFEE4FFAD3F121209753401D208907E3BE0600F433F01E4DA
-:40074600FFAD3F121209E4F534D208907E3CE0600E907F98740AF0E541440290C000F0907E3DE06002D20C907E3EE06008753501E4F539D208907E3FE06011907FD774137A
-:40078600F07433F07416F07436F0D204E4907FD1F0301A52E53960021539301349E513D3940040041513803E75130A301B02C213121357EF5401F51965336005851933D26D
-:4007C60008121393EF5480F519652F600585192FD208300E11121393EF5410F519652E600585192ED208301A2A907FD2E020E123907B40E06009E0F515907B42E0F516901D
-:400806007B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E103020920E50A7040300739E5387035C207F5187E007B0074242518F9EE3400FA120E9AFF748025AF
-:4008460018F582E4347BF583EFF00518E518B409DB907FC37409F0753810E4F52C750A0122E50A64017040300839E5397035C208F5187E007B00742D2518F9EE3400FA1297
-:400886000E9AFF74802518F582E4347BF583EFF00518E518B409DB907FC37409F0753910E4F535750A0222E50A6402703630142FC214F5187E007B00740E2518F9EE340075
-:4008C600FA120E9AFF74802518F582E4347BF583EFF00518E518B405DB907FC37405F0750A0322E51560301515E4F5187E007B0074142518F9EE3400FA120E9AFF748025D6
-:4009060018F582E4347BF583EFF00518E518B403DB907FC37403F0E4F50A22907FE9E0120EF20A08000A7C010AE80309440609FB0809F50909DD0A09EC0B00000B37907F2F
-:40094600EBE024FE6019146061240260030209D37419907FD4F07400907FD5F0020B3E907FEAE070047F0280027F03758282758319EFF075827B758319F0758274758319B2
-:40098600F0758266758319F0758258758319F0907FEAE004758217758319F07419907FD4F07412907FD5F0020B3E907FEAE0FF120F18EA49600DEA907FD4F0E9907FD5F077
-:4009C600020B3E907FB4E04401F0020B3E907FB4E04401F0020B3E907F00E509F0907FB57401F0020B3E907FEAE0F509020B3E120B46020B3E907F007401F0907FB5F00205
-:400A06000B3E907FE8E0247F60241460312402705BA210E433FF25E0FFA216E4334F907F00F0E4A3F0907FB57402F0020B3EE4907F00F0A3F0907FB57402F0020B3E907F04
-:400A4600ECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B3E907FB4E04401F0020B3E907FE8E024FE601D24020F
-:400A86006003020B3E907FEAE0B40105C210020B3E907FB4E04401F0020B3E907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FB6
-:400AC600ECE05480FF131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D210803F907FB4E04401F049
-:400B06008036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022D4
-:400B4600E4907F93F0907F9C7430F0E4907F96F0907F9574C0F0907F9E743FF0907F987418F0E4F58E907FDF74FFF0907FDEF0E4F5247518017B0074242518F9E43400FA8B
-:400B8600E4120EE00518E518B409EA753A01E4F538F513F536C207C20BC205C200C209C213907F987413F075440390C0007403F07F0CE4FD1211BF7F108F4212108F907FD8
-:400BC600987412F07F018F40EF440690C000F0907F987414F075468090C0007480F00FE4FD1211BFE4FF7EA3AD068D3E1211BF907F987411F090C000E4F07F057D7F121172
-:400C0600BF7F011212787F037D071211BF7F137D011211BF201B03020CC5752D017518017B00742D2518F9E43400FAE4120EE00518E518B409EA753B01E4F539F513F537B7
-:400C4600C208C20CC206C200C20AC213907F98740BF075450390C0007403F07F0CE4FD1212097F108F43121101907F98740AF07F018F41EF440690C000F0907F98740CF00E
-:400C860075478090C0007480F00FE4FD121209E4FF7EA3AD068D3F121209907F987409F090C000E4F07F057D7F1212097F011212997F037D071212097F137D01121209D28D
-:400CC6001222907F987410F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF08E50DF582E50CF583C2AF058690C000E00568
-:400D060086F0A30586DFF70586D2AF22907F987408F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AF08E50DF582E50CF577
-:400D460083C2AF058690C000E00586F0A30586DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022D219907F92E04402F00A
-:400D8600907FAEE0FFD39210E433FEEF4EF0D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440DF0D2AFD21A56
-:400DC600121253C211E4F50BF513C217C212907FA104F0907FD8E065176010301205D21A120046907FD8E0F5178008301205C21A120046301107C21112092180D63018D38A
-:400E0600C21812139F80CC22787FE4F6D8FD758147020E55020D7DE493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F4568031
-:400E46000146F6DFE4800B01020408102040809012BAE47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C582C828
-:400E8600CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E0225006E92548
-:400EC60082F8E622BBFE06E92582F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A393F87401DE
-:400F060093F5828883E4737402936860EFA3A3A380DF8F18E4F519751AFF751B19751C86AB1AAA1BA91C900001120EB3B4031DAF190519EFB5180122120E9A7E0029FFEEB6
-:400F46003AA907751AFFF51B891C80D47B007A007900228F1A050DE50DAE0C7002050C14F5828E83E51AF0120036050DE50DAC0C7002050C14F5828C83EFF01508E508607B
-:400F86000A1213338F1AEF423680CA228F1A050DE50DAE0C7002050C14F5828E83E51AF012134B050DE50DAC0C7002050C14F5828C83EFF01508E508600A1213878F1AEFF8
-:400FC600423780CA22C0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D21123
-:401006005391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2185391EF907FAB7408F0D086D084D085D082D083D0E032907F9833
-:401046007413F090C00074BFF0907F987410F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987411F090C000EFF0907F987413F0C0
-:40108600E544547F90C000F022907F987413F090C00074BFF0907F987412F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987414B3
-:4010C600F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987416F090C000EFF0907F987413F0E544547F90C000F022907F98740BCC
-:40110600F090C00074BFF0907F98740AF090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F987408F090C000EFF0907F98740BF0E54582
-:40114600547F90C000F022907F98740BF090C00074BFF0907F987409F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F98740CF090C3
-:40118600C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F98740EF090C000EFF0907F98740BF0E545547F90C000F022907F987413F0E5CC
-:4011C60044547F90C000F0907F987417F090C000EFF0907F987415F090C000EDF02212131B8F1A12131B8F1BE51A651B601212131B8F1AE51A651B600712131B8F1B80E8ED
-:40120600AF1A22907F98740BF0E545547F90C000F0907F98740FF090C000EFF0907F98740DF090C000EDF02212136F8F1A12136F8F1BE51A651B601212136F8F1AE51A65AD
-:401246001B600712136F8F1B80E8AF1A22907FD6E054FBF0E04408F0301A04E04402F07FF47E011212D6907FD6E054F7F0E04404F022AE07E4FFE53E547FFD1211BF907F2F
-:40128600987411F090C000EEF0E4E53E4480FD1211BF22AE07E4FFE53F547FFD121209907F987409F090C000EEF0E4E53F4480FD12120922050E02000000000314030000DF
-:4012C600C111C118C195C110C116010A00C19B008E188F19E5191519AE18700215184E6005120D5C80EE22907F987411F090C000E0FF2253D8EF32000000020FF500021367
-:401306000400020FCB0002101C907F987412F090C000E0FF22907F987413F090C000E0FF22907F987414F090C000E0FF22907F987415F090C000E0FF22907F987416F0902A
-:40134600C000E0FF22907F987408F090C000E0FF22907F987409F090C000E0FF22907F98740AF090C000E0FF22907F98740BF090C000E0FF22907F98740CF090C000E0FFCA
-:4013860022907F98740DF090C000E0FF22907F98740EF090C000E0FF22120003120D6D120B462200000000000000000000000000000000000000000000000000000000000C
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06150100000102000209027400010100A032090400000EFF0000000705010240000007050202400000070503024000000705040240000007050502400071
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:041A0600720000006A
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa28xb.HEX b/firmware/keyspan/usa28xb.HEX
deleted file mode 100644
index 07cb708f1956..000000000000
--- a/firmware/keyspan/usa28xb.HEX
+++ /dev/null
@@ -1,142 +0,0 @@
-:0300330002002D9B
-:04002D0053D8EF3283
-:10004600300918121333EFC3953C40030200D890D1
-:100056007FBF7401F0C209C200807730033B907FF6
-:10006600C6E020E16D121333EFC394405064907ED6
-:1000760040E0139209907FC7E014F5192000116043
-:100086000FF5087E7E7F41750C7E750D41120CCCF6
-:10009600C203E4907FC7F08039907FC8E020E13248
-:1000A600121333EFC394405029907DC0E013920998
-:1000B600907FC9E014F519200011600FF5087E7DC8
-:1000C6007FC1750C7D750DC1120CCCD203E4907FF7
-:1000D600C9F0907FB6E030E1030201601211F58F9E
-:1000E6001912133F8F36E519C3953A500F12131B99
-:1000F600EF30E008E53620E703300B5EC20BE5196A
-:0C003600907F987410F090C000E0FF2252
-:03004300021300A5
-:10000300C0E0C083C082C085C084C086758600906E
-:100013007FC4E4F05391EF907FAB7404F0D086D0AB
-:0A00230084D085D082D083D0E03273
-:03000000020E12DB
-:400106006058B48003433602E53630E726E519D3942040037519208519087E7E7F80750C7E750D80AF36120F5DE51925E0907FB7F08027E519D3943F400375193F851908C2
-:40014600907E80E536F07E7E7F81750C7E750D81120CF1E51904907FB7F0907FCEE030E1062005030203C1E4F51874402518F582E4347CF583E0FFE5187C007B017A7E79AF
-:40018600002400F9EC347EFAEF120EE40518E518B420D7907E00E06068907E03E060247F01E4FD1211D07F037DCD1211D0434680907F987414F090C000E546F0E4907E13F6
-:4001C600F08030907E01E0FF121054907E02E0FF12107A7F01907E11E0FD1211D07F037D071211D0434680907F987414F090C000E546F0907F987412F0E540440690C00093
-:40020600F0907E03E07006907E13E07008E4907E13F07525FF907E05E06012A3E0543FF544907F987413F090C000E544F0907E07E0602BA3E06005434280800353427F53C8
-:4002460042FC907E09E06011434202A3E0FF1210C6907E0BE0FF1210ECAF421210A0907E03E0600853427FAF421210A0907E0CE06018A3E0600543460280035346FD907FFB
-:40028600987414F090C000E546F0907E0EE06018A3E0600543460180035346FE907F987414F090C000E546F0907E12E0F53AA3E013920DA3E0F53CA3E06005434610800317
-:4002C6005346EF907F987414F090C000E546F0907E16E060325344BF907F987413F0E544547F90C000F0907F987411F012130FEF54FE90C000F0533EFDE4FFAD3E1211D080
-:40030600E4F52AF529D207907E17E0600F433E02E4FFAD3E1211D0752901D207907E18E06010907F987412F0E540440490C000F0D200907E19E06011434440907F9874130E
-:40034600F0E544547F90C000F0907E1AE0600F533EFEE4FFAD3E1211D0752B01D207907E1BE0600F433E01E4FFAD3E1211D0E4F52BD207907E1CE0600E907F987412F0E5F8
-:4003860040440290C000F0907E1DE06002D20B907E1EE06008752C01E4F538D207907E1FE06011907FD77411F07431F07415F07435F0D203C205E4907FCFF0301A54E5389E
-:4003C6006002153820134BE513D3940040041513804075130A301B02D21312130FEF5401F519652A600585192AD20712134BEF54806480F51965266005851926D207300D71
-:400406001112134BEF5410F51965256005851925D207201B030207F0300A18121387EFC3953D40030204B0907FC17401F0C20AC200807730043B907FCAE020E16D1213879B
-:40044600EFC394405064907D40E013920A907FCBE014F519200011600FF5087E7D7F41750C7D750D41120D16C204E4907FCBF08039907FCCE020E132121387EFC394405099
-:4004860029907CC0E013920A907FCDE014F519200011600FF5087E7C7FC1750C7C750DC1120D16D204E4907FCDF0907FBAE030E10302053812123F8F191213938F37E5197F
-:4004C600C3953B500F12136FEF30E008E53720E703300C5EC20CE5196058B48003433702E53730E726E519D3942040037519208519087E7D7F80750C7D750D80AF37120FFC
-:4005060096E51925E0907FBBF08027E519D3943F400375193F851908907D80E537F07E7D7F81750C7D750D81120D3BE51904907FBBF0907FD0E030E106200603020799E431
-:40054600F51874C02518F582E4347BF583E0FFE5187C007B017A7E79202420F9EC347EFAEF120EE40518E518B420D7907E20E06068907E23E060247F01E4FD12121A7F03F7
-:400586007DCD12121A434780907F98740CF090C000E547F0E4907E33F08030907E21E0FF121138907E22E0FF12115E7F01907E31E0FD12121A7F037D0712121A43478090AA
-:4005C6007F98740CF090C000E547F0907F98740AF0E541440690C000F0907E23E07006907E33E07008E4907E33F0752EFF907E25E06012A3E0543FF545907F98740BF090EB
-:40060600C000E545F0907E27E0602BA3E06005434380800353437F5343FC907E29E06011434302A3E0FF121184907E2BE0FF1211AAAF43121112907E23E0600853437FAFA0
-:4006460043121112907E2CE06018A3E0600543470280035347FD907F98740CF090C000E547F0907E2EE06018A3E0600543470180035347FE907F98740CF090C000E547F0B4
-:40068600907E32E0F53BA3E013920EA3E0F53DA3E0600543471080035347EF907F98740CF090C000E547F0907E36E060325345BF907F98740BF0E545547F90C000F0907F79
-:4006C600987409F0121363EF54FE90C000F0533FFDE4FFAD3F12121AE4F533F532D208907E37E0600F433F02E4FFAD3F12121A753201D208907E38E06010907F98740AF0EB
-:40070600E541440490C000F0D200907E39E06011434540907F98740BF0E545547F90C000F0907E3AE0600F533FFEE4FFAD3F12121A753401D208907E3BE0600F433F01E4C9
-:40074600FFAD3F12121AE4F534D208907E3CE0600E907F98740AF0E541440290C000F0907E3DE06002D20C907E3EE06008753501E4F539D208907E3FE06011907FD7741369
-:40078600F07433F07416F07436F0D204C206E4907FD1F0301A54E5396002153930134BE513D3940040041513804075130A301B02C213121363EF5401F51965336005851998
-:4007C60033D20812139FEF54806480F519652F600585192FD208300E1112139FEF5410F519652E600585192ED208301A2A907FD2E020E123907B40E06009E0F515907B4297
-:40080600E0F516907B41E06009907FD77417F07437F0E4907FD3F0907FC2E030E103020924E50A7040300739E5387035C207F5187E007B0074242518F9EE3400FA120E9E44
-:40084600FF74802518F582E4347BF583EFF00518E518B409DB907FC37409F0753810E4F52C750A0122E50A64017040300839E5397035C208F5187E007B00742D2518F9EEBF
-:400886003400FA120E9EFF74802518F582E4347BF583EFF00518E518B409DB907FC37409F0753910E4F535750A0222E50A6402703630142FC214F5187E007B00740E25184C
-:4008C600F9EE3400FA120E9EFF74802518F582E4347BF583EFF00518E518B405DB907FC37405F0750A0322E51560301515E4F5187E007B0074142518F9EE3400FA120E9ECB
-:40090600FF74802518F582E4347BF583EFF00518E518B403DB907FC37403F0E4F50A22907FE9E0120EF60A0C000A80010AEC0309480609FF0809F90909E10A09F00B000044
-:400946000B3B907FEBE024FE6019146061240260030209D77419907FD4F07400907FD5F0020B42907FEAE070047F0280027F03758282758319EFF075827B758319F07582DA
-:4009860074758319F0758266758319F0758258758319F0907FEAE004758217758319F07419907FD4F07412907FD5F0020B42907FEAE0FF120F1CEA49600DEA907FD4F0E9BE
-:4009C600907FD5F0020B42907FB4E04401F0020B42907FB4E04401F0020B42907F00E509F0907FB57401F0020B42907FEAE0F509020B42120B4A020B42907F007401F0903B
-:400A06007FB5F0020B42907FE8E0247F60241460312402705BA210E433FF25E0FFA216E4334F907F00F0E4A3F0907FB57402F0020B42E4907F00F0A3F0907FB57402F0022E
-:400A46000B42907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F0020B42907FB4E04401F0020B42907FE8E024FE4E
-:400A8600601D24026003020B42907FEAE0B40105C210020B42907FB4E04401F0020B42907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583EA
-:400AC600E4F0907FECE05480FF131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D210803F907FB47B
-:400B0600E04401F08036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E017
-:400B46004402F022E4907F93F0907F9C7430F0E4907F96F0907F9574C0F0907F9E743FF0907F987418F0E4F58E907FDF74FFF0907FDEF0E4F5247518017B0074242518F945
-:400B8600E43400FAE4120EE40518E518B409EA753A01E4F538F513F536C207C20BC205C200C209C213907F987413F075440390C0007403F07F0CE4FD1211D07F108F42125F
-:400BC60010A0907F987412F07F018F40EF440690C000F0907F987414F075468090C0007480F00FE4FD1211D0E4FF7EA3AD068D3E1211D0907F987411F090C000E4F07F05B0
-:400C06007D7F1211D07F011212897F037D071211D07F137D091211D0201B03020CC9752D017518017B00742D2518F9E43400FAE4120EE40518E518B409EA753B01E4F53978
-:400C4600F513F537C208C20CC206C200C20AC213907F98740BF075450390C0007403F07F0CE4FD12121A7F108F43121112907F98740AF07F018F41EF440690C000F0907FC0
-:400C860098740CF075478090C0007480F00FE4FD12121AE4FF7EA3AD068D3F12121A907F987409F090C000E4F07F057D7F12121A7F011212AA7F037D0712121A7F137D0927
-:400CC60012121AD21222907F987410F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987410F0AF08E50DF582E50CF583C2AF058690FD
-:400D0600C000E00586F0A30586DFF70586D2AF22907F987408F0AF08E50DF582E50CF583C2AF058690C0000586E0A30586F00586DFF7D2AF22907F987408F0AF08E50DF53A
-:400D460082E50CF583C2AF058690C000E00586F0A30586DFF70586D2AF227400F58690FDA57C05A3E582458370F922907FD6E04480F0438701000000000022D219907F92B8
-:400D8600E04402F0907FAEE0FFD39210E433FEEF4EF0D2E843D820907FDE7401F0907FDFF0907FAB74FFF0907FA9F0907FAAF05391EF907FAFE04401F0907FAEE0440DF0AD
-:400DC600D2AFD21A121264C211E4F50BF513C217C212907FA104F0907FD8E065176010301205D21A120046907FD8E0F5178008301205C21A120046301107C21112092580F9
-:400E0600D63018D3C2181213AB80CC22787FE4F6D8FD758147020E59020D81E493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C88340FA
-:400E460004F456800146F6DFE4800B01020408102040809012CBE47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A320
-:400E8600C8C582C8CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BEBB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F582E5833AF583E022D5
-:400EC6005006E92582F8E622BBFE06E92582F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E4937012740193700DA3A37A
-:400F060093F8740193F5828883E4737402936860EFA3A3A380DF8F18E4F519751AFF751B19751C86AB1AAA1BA91C900001120EB7B4031DAF190519EFB5180122120E9E7EC4
-:400F46000029FFEE3AA907751AFFF51B891C80D47B007A007900228F1A050DE50DAE0C7002050C14F5828E83E51AF0120036050DE50DAC0C7002050C14F5828C83EFF015BA
-:400F860008E508600A12133F8F1AEF423680CA228F1A050DE50DAE0C7002050C14F5828E83E51AF0121357050DE50DAC0C7002050C14F5828C83EFF01508E508600A1213AA
-:400FC600938F1AEF423780CA22E4907F93F0907F9C7430F0E4907F96F0907F95F0907F9E7427F0907F987420F0907F9E7407F0E4907F94F0907F9D74FFF0E4907F97F0227C
-:40100600C0E0C083C082C085C084C086758600D2115391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2185391EF907FAB74087E
-:40104600F0D086D084D085D082D083D0E032907F987413F090C00074BFF0907F987410F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF00C
-:40108600907F987411F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987412F090C000EFF0907F987413F0E544547F90C000F0220A
-:4010C600907F987413F090C00074BFF0907F987414F090C000EFF0907F987413F0E544547F90C000F022907F987413F090C00074BFF0907F987416F090C000EFF0907F9807
-:401106007413F0E544547F90C000F022907F98740BF090C00074BFF0907F98740AF090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907FFA
-:40114600987408F090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F987409F090C000EFF0907F98740BF0E545547F90C000F022907F71
-:4011860098740BF090C00074BFF0907F98740CF090C000EFF0907F98740BF0E545547F90C000F022907F98740BF090C00074BFF0907F98740EF090C000EFF0907F98740BFD
-:4011C600F0E545547F90C000F022907F987413F0E544547F90C000F0907F987417F090C000EFF0907F987415F090C000EDF0221213278F1A1213278F1BE51A651B60121292
-:4012060013278F1AE51A651B60071213278F1B80E8AF1A22907F98740BF0E545547F90C000F0907F98740FF090C000EFF0907F98740DF090C000EDF02212137B8F1A121325
-:401246007B8F1BE51A651B601212137B8F1AE51A651B600712137B8F1B80E8AF1A22907FD6E054FBF0E04408F0301A04E04402F07FF47E011212E7907FD6E054F7F0E044E1
-:4012860004F022AE07E4FFE53E547FFD1211D0907F987411F090C000EEF0E4E53E4480FD1211D022AE07E4FFE53F547FFD12121A907F987409F090C000EEF0E4E53F448095
-:4012C600FD12121A22050E02000000000314030000C111C118C195C110C116010A00C19B008E188F19E5191519AE18700215184E6005120D6080EE2200000210060002137E
-:4013060004000200030002102D907F987411F090C000E0FF22907F987412F090C000E0FF22907F987413F090C000E0FF22907F987414F090C000E0FF22907F987415F090F5
-:40134600C000E0FF22907F987416F090C000E0FF22907F987408F090C000E0FF22907F987409F090C000E0FF22907F98740AF090C000E0FF22907F98740BF090C000E0FFC0
-:4013860022907F98740CF090C000E0FF22907F98740DF090C000E0FF22907F98740EF090C000E0FF22120FCF120D71120B4A220000000000000000000000000000000000C1
-:4013C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7
-:4014060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6
-:401446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066
-:401486000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
-:4014C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6
-:4015060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5
-:401546000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
-:401586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025
-:4015C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5
-:4016060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4
-:401646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064
-:401686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024
-:4016C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4
-:4017060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3
-:401746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
-:401786000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
-:4017C60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3
-:4018060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2
-:401846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
-:401886000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
-:4018C6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012011001FF00BF
-:401906000040CD06100100000102000209027400010100A032090400000EFF0000000705010240000007050202400000070503024000000705040240000007050502400076
-:4019460000070506024000000705070240000007058102400001070582024000000705830240000107058402400001070585024000010705860240000107058702400001F4
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0036034B00650079007300700061006E0020005500530042002000530065007200690061006C002000410064006100700074006500F9
-:041A0600720000006A
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa49w.HEX b/firmware/keyspan/usa49w.HEX
deleted file mode 100644
index 5e5b3d13dd5f..000000000000
--- a/firmware/keyspan/usa49w.HEX
+++ /dev/null
@@ -1,145 +0,0 @@
-:030033000218FBB5
-:0C0036009078417401F090C000E0FF22BF
-:10004600E4FF74402FF582E4347BF583E0FEE5158A
-:100056002404FDE43514FAA9057B01EF7C0029F997
-:10006600EC3AFAEE1211F10FBF22D7E5152405F589
-:1000760082E43514F583E07003020134E5152409A2
-:10008600F582E43514F583E0700EE515240AF58251
-:10009600E43514F583E060187F01E4FD121647E5A8
-:1000A600152431F582E43514F583E054CFF0804110
-:1000B600E5152406F582E43514F583E0FF1216767D
-:1000C600E5152407F582E43514F583E0FF120003F5
-:1000D6007F01E5152408F582E43514F583E0FD1269
-:1000E6001647E5152431F582E43514F583E04430EE
-:1000F600F0E5152439F582E43514F583E04480F003
-:100003009078417403F090C00074BFF0907841740D
-:1000130001F090C000EFF09078417403F0E51524EF
-:1000230037F582E43514F583E0547F90C000F02265
-:03004300021B009D
-:0300000002109556
-:400106009078417404F0E5152439F582E43514F583E090C000F09078417402F0E5152436F582E43514F583E0440690C000F0E515240BF582E43514F583E06032E515240C0B
-:40014600F582E43514F583E0543FFFE5152437F582E43514F583EFF09078417403F0E5152437F582E43514F583E090C000F0E515240DF582E43514F583E0700302024FE588
-:40018600152417F582E43514F583E06011E5152432F582E43514F583E04404F0800FE5152432F582E43514F583E054FBF0E4FFE5152432F582E43514F583E0FD121647E55E
-:4001C60015240EF582E43514F583E06011E5152433F582E43514F583E04480F0800FE5152433F582E43514F583E0547FF0E5152433F582E43514F583E054FCF0E515240FEB
-:40020600F582E43514F583E0602FE5152433F582E43514F583E04402F0E5152410F582E43514F583E0FF1215E7E5152411F582E43514F583E0FF121617E5152433F582E45E
-:400246003514F583E0FF1215B7E5152414F582E43514F583E06044E5152415F582E43514F583E06011E5152439F582E43514F583E04401F0800FE5152439F582E43514F581
-:4002860083E054FEF09078417404F0E5152439F582E43514F583E090C000F0E5152412F582E43514F583E06044E5152413F582E43514F583E06011E5152439F582E43514E6
-:4002C600F583E04402F0800FE5152439F582E43514F583E054FDF09078417404F0E5152439F582E43514F583E090C000F0E5152416F582E43514F583E0FFE5152435F5820A
-:40030600E43514F583EFF0E5152417F582E43514F583E030E011E5152431F582E43514F583E04440F0800FE5152431F582E43514F583E054BFF0E5152418F582E43514F576
-:4003460083E0FFE515243BF582E43514F583EFF0E5152419F582E43514F583E06011E5152439F582E43514F583E04410F0800FE5152439F582E43514F583E054EFF0907869
-:40038600417404F0E5152439F582E43514F583E090C000F0E515241AF582E43514F583E0606BE5152437F582E43514F583E054BFF09078417403F0E5152437F582E43514FF
-:4003C600F583E0547F90C000F09078417401F0120036EF54FE90C000F0E5152432F582E43514F583E054FDFFF0FDE4FF121647E515242CF582E43514F583E4F0E515242BB7
-:40040600F582E43514F583E4F0E5164213E515241BF582E43514F583E0700EE5152425F582E43514F583E06028E5152432F582E43514F583E04402FFF0FDE4FF121647E547
-:4004460015242BF582E43514F5837401F0E5164213E515241CF582E43514F583E0FF700EE5152425F582E43514F583E0602A9078417402F0E5152436F582E43514F583E0C6
-:40048600440490C000F0EF600FE5152431F582E43514F583E04404F0E515241DF582E43514F583E06027E5152437F582E43514F583E04440F09078417403F0E5152437F550
-:4004C60082E43514F583E0547F90C000F0E515241EF582E43514F583E06028E5152432F582E43514F583E054FEFFF0FDE4FF121647E515242DF582E43514F5837401F0E58F
-:40050600164213E515241FF582E43514F583E0700EE5152425F582E43514F583E06027E5152432F582E43514F583E04401FFF0FDE4FF121647E515242DF582E43514F58397
-:40054600E4F0E5164213E5152420F582E43514F583E0700EE5152425F582E43514F583E060189078417402F0E5152436F582E43514F583E0440290C000F0E5152421F582A7
-:40058600E43514F583E0600FE5152431F582E43514F583E04402F0E5152422F582E43514F583E0601FE515242EF582E43514F5837401F0E515243AF582E43514F583E4F0F0
-:4005C600E5164213E5152423F582E43514F583E06003121885E5152424F582E43514F583E0601BE5152431F582E43514F583E04408F0907F98E0FFE516F4FEEF5EF0E5156C
-:400606002425F582E43514F583E06016E5152431F582E43514F583E054F7F0907F98E04516F022907FE9E012120307830007F701086303064C0607740807680907500A07CE
-:400646005F0B000008B2907FEBE024FE601C1470030206FE240260030207467419907FD4F07400907FD5F00208B9907FEAE004758217758319F0907FEAE030E0047F03802D
-:40068600027F02758282758319EFF075826D758319F0758266758319F075825F758319F0758258758319F0907FEAE030E1047F6480027F3275821A758319EFF0907FEFE0FB
-:4006C600FE907FEEE07C002400F519EC3EF518753319753412758214758319E0752700F528D3E5289519E527951840068518278519281213120208B9907FEAE0FF12142BC9
-:40070600EA496032907FEEE0751800F519AE02AF018E338F348F828E83E0FEA3E08E27F528D39519E527951840068518278519281213120208B9907FB4E04401F00208B99E
-:40074600907FB4E04401F00208B9907F00E525F0907FB57401F00208B9907FEAE0F5250208B9907FEAE0F522120AB80208B9907F00E522F0907FB57401F00208B9907FE8BD
-:40078600E0247F60241460312402705BA200E433FF25E0FFA206E4334F907F00F0E4A3F0907FB57402F00208B9E4907F00F0A3F0907FB57402F00208B9907FECE0F4548063
-:4007C600FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F00208B9907FB4E04401F00208B9907FE8E024FE601D240260030208B910
-:40080600907FEAE0B40105C2000208B9907FB4E04401F00208B9907FEAE07038907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E4F0907FECE05480FF67
-:40084600131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A907FEAE0B40104D200803F907FB4E04401F08036907FEACB
-:40088600E07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F08007907FB4E04401F0907FB4E04402F022E511540F703D
-:4008C600030209B21216A5EF20E175121703EF14F5191218CCEF2519FFE433FEC3EF9480EE648094805059851582851483E0FEA3E0FFF5828E83E030E011E5152431F58250
-:40090600E43514F583E04480F0800FE5152431F582E43514F583E0547FF0E5152431F582E43514F583E020E212E519600EF523EF2401F52DE43EF52C1214ADE4FF1214E3C0
-:40094600E5152431F582E43514F583E030E75D1218CCE515243BF582E43514F583E0FEEFC39E5048E515242FF582E43514F5837401F0E5152431F582E43514F583E0547B99
-:40098600F0E515243AF582E43514F583E4F0E5164213907FC2E030E110E5152426F582E43514F583E0F52480031212A11216D4EF30E103020AB71217D28F191218D8E515D5
-:4009C6002438F582E43514F583EFF0E5152435F582E43514F583E0FFE519C39F50281218B4EF30E021E5152438F582E43514F583E020E712E5152431F582E43514F583E0C0
-:400A060020E103020AB7E5152431F582E43514F583E054FDF0E5197003020AB7B4800FE5152438F582E43514F583E04402F0E5152438F582E43514F583E0FF30E729E519CF
-:400A4600D394204003751920851923851582851483A3A3E0FCA3E08C2CF52D1213DDE51925E0FF12151922E519D3943F400375193F851923E5152438F582E43514F583E053
-:400A8600FF851582851483A3A3E0FCA3E0F5828C83EFF0851582851483A3A3E0FEA3E02401F52DE43EF52C12146CE51904FF12151922E4907F93F0907F9C74F0F0907F9677
-:400AC600F0E4907F94F090784A04F0F58E907F9574C0F0907F9E743FF0907F98741FF090784374FFF0E4907841F0907FDF749FF0907FDEF0907F92E04402F07E7B7FC07581
-:400B0600147B7515C0907F9674EFF0751601120F127E7B7FC075147B7515C0907F9674EFF0751601E5152426F582E43514F583E4F07E7E7F40851582851483747EF0A374F5
-:400B460040F07E7E7F80851582851483A3A3747EF0A37480F07E7C7F0075147C751500907F9674DFF0751602120F127E7C7F0075147C751500907F9674DFF0751602E51536
-:400B86002426F582E43514F5837401F07E7D7FC0851582851483747DF0A374C0F07E7E7F00851582851483A3A3747EF0A37400F07E7C7F4075147C751540907F9674BFF018
-:400BC600751604120F127E7C7F4075147C751540907F9674BFF0751604E5152426F582E43514F5837402F07E7D7F40851582851483747DF0A37440F07E7D7F8085158285D3
-:400C06001483A3A3747DF0A37480F07E7C7F8075147C751580907F96747FF0751608120F127E7C7F8075147C751580907F96747FF0751608E5152426F582E43514F583741C
-:400C460003F07E7C7FC0851582851483747CF0A374C0F07E7D7F00851582851483A3A3747DF0A37400F0C20AC209D20222E510045403F51014601F1460311460432403701B
-:400C8600527E7B7FC075147B7515C0907F9674EFF0751601803D7E7C7F0075147C751500907F9674DFF075160280287E7C7F4075147C751540907F9674BFF075160480137E
-:400CC6007E7C7F8075147C751580907F96747FF0751608E53255167003020E11E516F4FF5232E526547FFE700FE52A55166024907F98E04516F0801BBE2018E5152431F543
-:400D060082E43514F583E030E309E4F52A907F98E05FF0E515243AF582E43514F583E06003E014F0E5152434F582E43514F583E06003E014F0E06003020E11740AF012009D
-:400D460036EF5401FFF519E515242CF582E43514F583E06F6007E519F0E51642131218E48F19E5152427F582E43514F583E0FFE5195410FE6F6006EEF0E5164213E5152415
-:400D860028F582E43514F583E0FFE5195480FE6F6006EEF0E5164213E5152429F582E43514F583E0FFE5195420FE6F6015EEF0E5152431F582E43514F583E030E404E51665
-:400DC6004213E5125516FFF519E515242AF582E43514F583E06F6016E519F0E5152431F582E43514F583E030E504E5164213E5175516FFF519E5152430F582E43514F58380
-:400E0600E06F6007E519F0E516421322300903020F11E52414602A14604114605814606F24046003020ECF7E7B7FC075147B7515C0907F9674EFF07516011212A17524015A
-:400E4600227E7C7F0075147C751500907F9674DFF07516021212A1752402227E7C7F4075147C751540907F9674BFF07516041212A1752403227E7C7F8075147C7515809051
-:400E86007F96747FF07516081212A175240422300433C2045313DFE4F5197E007B00742E2519F9EE3400FA1211ABFF74802519F582E4347BF583EFF00519E519B403DB902D
-:400EC6007FC37403F075240522E536603BD5360A5313EF300A04D209C20AE4F5197E007B0074352519F9EE3400FA1211ABFF74802519F582E4347BF583EFF00519E519B467
-:400F060003DB907FC37403F0E4F52422E4F51A7E007B01E515251AF9EE3514FAE41211F1051AE51AB43CE8E5152435F582E43514F5837401F09078417403F0E5152437F569
-:400F460082E43514F5837403F090C000F07F0CE4FD1216477F10E5152433F582E43514F583EFF01215B79078417402F07F01E5152436F582E43514F583EFF0440690C000F1
-:400F8600F09078417404F0E5152439F582E43514F5837480F090C000F00FE4FD121647E4FF7EA3E5152432F582E43514F583EEF0FD1216479078417401F090C000E4F07F89
-:400FC600057D7F1216477F0112154F7F037D071216472253133F907BF1E030E3167E7B7FC075147B7515C0907F9674EFF07516011208C1907C31E030E3167E7C7F00751417
-:401006007C751500907F9674DFF07516021208C1907C71E030E3167E7C7F4075147C751540907F9674BFF07516041208C1907CB1E030E3167E7C7F8075147C751580907F37
-:4010460096747FF07516081208C10511E511540FF518701F907841E054F7F0907F99E0F517907841E04408F0907F99E0F4F51212112122E518B40104120C7322907FC2E018
-:4010860020E108E5136004120E1222120C7322787FE4F6D8FD7581370210DC021229E493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F44207E
-:4010C600C8834004F456800146F6DFE4800B0102040810204080901850E47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8A2
-:40110600E493A3C8C582C8CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BE907FD2E030E1030211AAC209907B40E014602614603B14605024836064248070637E7B7FC01C
-:4011460075147B7515C0907F9674EFF0751601120046804B7E7C7F0075147C751500907F9674DFF075160212004680337E7C7F4075147C751540907F9674BFF075160412FB
-:401186000046801B7E7C7F8075147C751580907F96747FF0751608120046800312175CE4907FD3F022BB010689828A83E0225002E722BBFE02E32289828A83E49322BB0189
-:4011C6000CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D086
-:4012060082F8E4937012740193700DA3A393F8740193F5828883E4737402936860EFA3A3A380DF907FAEE0FFD39200E433FEEF4EF0D2E843D820907FDE7401F0907FDFF08E
-:40124600907FAB74FFF0907FA9F0907FAAF05391EF907FAF7401F0907FAE740DF0D2AFD20B121814C201E4F52BF531C207C2027529F0907FD8E06526600675320FE0F526C9
-:40128600300203120FD9300107C20112062980E23008DFC20812183580D822E5135516606AE515243AF582E43514F583E0705CE516F45213E5152426FFE43514FEE4FD0FA2
-:4012C600EFAA0670010E14F5828A83E0FC74802DF582E4347BF583ECF00DBD0BE2907FC3740BF0E515243AF582E43514F5837410F0E515242EF582E43514F583E4F0E515C1
-:40130600242FF582E43514F583E4F022E52845276057AE27AF28D3EF9440EE940040047E007F40C3E5289FF528E5279EF527E4FDEDC39FE49E501F853482853383E0FC7494
-:40134600002DF582E4347FF583ECF00D0534E5347002053380DA907FA97401F0907FACE04401F0907FB5EFF022907FACE054FEF0E4907FB5F022E4907F93F0907F9C74F0A7
-:40138600F0907F96F0E490784AF0907F94F0907F9D74FFF0E4907F97F0300007E52954F0FF80027F00EF4408907841F0E4907F98F0907F95F0907F9E74FFF0E4907F98F0C9
-:4013C600907F93F0907F9C74F0F0E4907F96F0907F92E054FDF0228F1A052DE52DAE2C7002052C14F5828E83E51AF01218F0052DE52DAC2C7002052C14F5828C83EFF0159D
-:4014060023E523601FE5152438F582E43514F583C083C082E0FE1218D88F1AEE4FD082D083F080B5228F1AE4F51B751CFF751D19751E86AB1CAA1DA91E9000011211C4B4E1
-:40144600031DAF1B051BEFB51A01221211AB7E0029FFEE3AA907751CFFF51D891E80D47B007A00790022E4907841F090784F74C0F0E4907850F0E52C907851F0AE2CE52DF8
-:40148600907852F0907854E523F09078577404F0907FE2E04410F0E054F7F0E4907855F0907855E060FA22E4907841F0E52C90784FF0AE2CE52D907850F090785174C0F081
-:4014C600E4907852F0907854E523F09078577404F0E4907855F0907855E060FA22E5152404F582E43514F583E014600F1460131460178000907FC7EFF08013907FC9EFF081
-:40150600800C907FCBEFF08005907FCDEFF0E516422A22E5152404F582E43514F583E014600F1460131460178000907FB7EFF08013907FB9EFF0800C907FBBEFF08005903B
-:401546007FBDEFF0E516422A22AE07E4FFE5152432F582E43514F583E0547FFD1216479078417401F090C000EEF0E4E5152432F582E43514F583E04480FD12164722C0E0A0
-:40158600C0F0C083C082C085C084C086758600C0D075D0085391EF907FA97401F0121312D0D0D086D084D085D082D083D0F0D0E0329078417403F090C00074BFF0907841D0
-:4015C6007402F090C000EFF09078417403F0E5152437F582E43514F583E0547F90C000F0229078417403F090C00074BFF09078417404F090C000EFF09078417403F0E5156D
-:401606002437F582E43514F583E0547F90C000F0229078417403F090C00074BFF09078417406F090C000EFF09078417403F0E5152437F582E43514F583E0547F90C000F0FF
-:40164600229078417403F0E5152437F582E43514F583E0547F90C000F09078417407F090C000EFF09078417405F090C000EDF0229078417403F090C00074BFF0E4907841FA
-:40168600F090C000EFF09078417403F0E5152437F582E43514F583E0547F90C000F022E5152404F582E43514F583E014600E1460111460148000907FC6E0FF22907FC8E015
-:4016C600FF22907FCAE0FF22907FCCE0FF22E5152404F582E43514F583E014600E1460111460148000907FB6E0FF22907FB8E0FF22907FBAE0FF22907FBCE0FF22E515249E
-:4017060004F582E43514F583E014600E1460111460148000907FC7E0FF22907FC9E0FF22907FCBE0FF22907FCDE0FF22C0E0C083C082C085C084C086758600907FC4E4F096
-:401746005391EF907FAB7404F0D086D084D085D082D083D0E032907B41E0F536431310A3E06009907FD77417F07437F0907B43E0F537A3E054F0F529E06002D20A22C0E024
-:40178600C083C082C085C084C086758600D2015391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2085391EF907FAB7408F0D0F7
-:4017C60086D084D085D082D083D0E0321218C0AE071218C0AD07EE6D60101218C0AE07EE6D60071218C0AD0780ECAF06227400F58690FDA57C05A3E582458370F922907FD5
-:40180600D6E04480F0438701000000000022907FD6E04404F0E04408F0300B04E04402F07FF47E0112186B907FD6E054F7F02212137C121804907FD6E030E70A7F057E007D
-:4018460012186B12189E120AB8220335800000032E810000C185C181C108C100C106012200012400008E188F19E5191519AE18700215184E60081217F31217F380EB22E545
-:40188600152404F582E43514F583E004FF4410907FD7F0EF4430F022907FD6E04401F07F0D7E0012186B907FD6E054FEF0229078417402F090C000E0FF229078417403F0D5
-:4018C60090C000E0FF229078417404F090C000E0FF229078417405F090C000E0FF229078417406F090C000E0FF22E4907841F090C000E0FF2253D8EF320012011001FF00AB
-:401906000040CD060A0100000102000409027400010100A032090400000EFF000000070501024000000705020240000007050302400000070504024000000705050240007A
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E003603550053004200200034002D0070006F00720074002000530065007200690061006C00200041006400610070007400650072003C
-:401A060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0
-:401A46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
-:401A86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020
-:401AC6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002178400021B26
-:151B06000400021732000217AB00021B1000021B1400021584BE
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2001
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
diff --git a/firmware/keyspan/usa49wlc.HEX b/firmware/keyspan/usa49wlc.HEX
deleted file mode 100644
index 8406eb1bf373..000000000000
--- a/firmware/keyspan/usa49wlc.HEX
+++ /dev/null
@@ -1,153 +0,0 @@
-:017F920001ED
-:030033000218FBB5
-:0D003600E51104907841F090C000E0FF2239
-:10004600E4FF74402FF582E4347BF583E0FEE5158A
-:100056002404FDE43514FAA9057B01EF7C0029F997
-:10006600EC3AFAEE1211EC0FBF22D7E5152405F58E
-:1000760082E43514F583E07003020134E5152409A2
-:10008600F582E43514F583E0700EE515240AF58251
-:10009600E43514F583E060187F01E4FD12166BE584
-:1000A600152431F582E43514F583E054CFF0804110
-:1000B600E5152406F582E43514F583E0FF12000306
-:1000C600E5152407F582E43514F583E0FF1215AB38
-:1000D6007F01E5152408F582E43514F583E0FD1269
-:1000E600166BE5152431F582E43514F583E04430CA
-:1000F600F0E5152439F582E43514F583E04480F003
-:1000030090784174F3F090C00074BFF0907841741D
-:10001300F0F090C000EFF090784174F3F0E5152410
-:1000230037F582E43514F583E0547F90C000F02265
-:03004300021B009D
-:030000000210905B
-:4001060090784174F4F0E5152439F582E43514F583E090C000F090784174F2F0E5152436F582E43514F583E0440690C000F0E515240BF582E43514F583E06032E515240C2B
-:40014600F582E43514F583E0543FFFE5152437F582E43514F583EFF090784174F3F0E5152437F582E43514F583E090C000F0E515240DF582E43514F583E0700302024FE598
-:40018600152417F582E43514F583E06011E5152432F582E43514F583E04404F0800FE5152432F582E43514F583E054FBF0E4FFE5152432F582E43514F583E0FD12166BE53A
-:4001C60015240EF582E43514F583E06011E5152433F582E43514F583E04480F0800FE5152433F582E43514F583E0547FF0E5152433F582E43514F583E054FCF0E515240FEB
-:40020600F582E43514F583E0602FE5152433F582E43514F583E04402F0E5152410F582E43514F583E0FF12160BE5152411F582E43514F583E0FF12163BE5152433F582E415
-:400246003514F583E0FF1215DBE5152414F582E43514F583E06044E5152415F582E43514F583E06011E5152439F582E43514F583E04401F0800FE5152439F582E43514F55D
-:4002860083E054FEF090784174F4F0E5152439F582E43514F583E090C000F0E5152412F582E43514F583E06044E5152413F582E43514F583E06011E5152439F582E43514F6
-:4002C600F583E04402F0800FE5152439F582E43514F583E054FDF090784174F4F0E5152439F582E43514F583E090C000F0E5152416F582E43514F583E0FFE5152435F5821A
-:40030600E43514F583EFF0E5152417F582E43514F583E030E011E5152431F582E43514F583E04440F0800FE5152431F582E43514F583E054BFF0E5152418F582E43514F576
-:4003460083E0FFE515243BF582E43514F583EFF0E5152419F582E43514F583E06011E5152439F582E43514F583E04410F0800FE5152439F582E43514F583E054EFF0907869
-:400386004174F4F0E5152439F582E43514F583E090C000F0E515241AF582E43514F583E0606BE5152437F582E43514F583E054BFF090784174F3F0E5152437F582E435141F
-:4003C600F583E0547F90C000F090784174F1F0120036EF54FE90C000F0E5152432F582E43514F583E054FDFFF0FDE4FF12166BE515242CF582E43514F583E4F0E515242BA3
-:40040600F582E43514F583E4F0E5164213E515241BF582E43514F583E0700EE5152425F582E43514F583E06028E5152432F582E43514F583E04402FFF0FDE4FF12166BE523
-:4004460015242BF582E43514F5837401F0E5164213E515241CF582E43514F583E0FF700EE5152425F582E43514F583E0602A90784174F2F0E5152436F582E43514F583E0D6
-:40048600440490C000F0EF600FE5152431F582E43514F583E04404F0E515241DF582E43514F583E06027E5152437F582E43514F583E04440F090784174F3F0E5152437F560
-:4004C60082E43514F583E0547F90C000F0E515241EF582E43514F583E06028E5152432F582E43514F583E054FEFFF0FDE4FF12166BE515242DF582E43514F5837401F0E56B
-:40050600164213E515241FF582E43514F583E0700EE5152425F582E43514F583E06027E5152432F582E43514F583E04401FFF0FDE4FF12166BE515242DF582E43514F58373
-:40054600E4F0E5164213E5152420F582E43514F583E0700EE5152425F582E43514F583E0601890784174F2F0E5152436F582E43514F583E0440290C000F0E5152421F582B7
-:40058600E43514F583E0600FE5152431F582E43514F583E04402F0E5152422F582E43514F583E0601FE515242EF582E43514F5837401F0E515243AF582E43514F583E4F0F0
-:4005C600E5164213E5152423F582E43514F583E0600312187AE5152424F582E43514F583E06023E5152431F582E43514F583E04408F0E516C454F0FF4211907F96E04FF000
-:40060600907841E04FF0E5152425F582E43514F583E06024E5152431F582E43514F583E054F7F0E516C454F0F4FF5211907F96E05FF0907841E05FF022907FE9E01211FE43
-:40064600079900080D01087903066206078A08077E0907660A07750B000008C8907FEBE024FE601C1470030207142402600302075C7419907FD4F07400907FD5F00208CF4C
-:40068600907FEAE004758217758319F0907FEAE030E0047F0280027F03758282758319EFF075826D758319F0758266758319F075825F758319F0758258758319F0907FEA0A
-:4006C600E030E1047F6480027F3275821A758319EFF0907FEFE0FE907FEEE07C002400F518EC3EF517753319753412758214758319E0752700F528D3E5289518E5279517D6
-:40070600400685172785182812130D0208CF907FEAE0FF12145FEA496032907FEEE0751700F518AE02AF018E338F348F828E83E0FEA3E08E27F528D39518E527951740068B
-:4007460085172785182812130D0208CF907FB4E04401F00208CF907FB4E04401F00208CF907F00E525F0907FB57401F00208CF907FEAE0F5250208CF907FEAE0F522120A9B
-:40078600CE0208CF907F00E522F0907FB57401F00208CF907FE8E0247F60241460312402705BA200E433FF25E0FFA206E4334F907F00F0E4A3F0907FB57402F00208CFE4C9
-:4007C600907F00F0A3F0907FB57402F00208CF907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF583E054FD907F00F0E4A3F0907FB57402F00208CF907FB45C
-:40080600E04401F00208CF907FE8E024FE601D240260030208CF907FEAE0B40105C2000208CF907FB4E04401F00208CF907FEAE07038907FECE0F45480FFC4540FFFE05490
-:40084600072F25E024B4F582E4347FF583E4F0907FECE05480FF131313541FFFE054072F907FD7F0E04420F0805F907FB4E04401F08056907FE8E024FE60182402704A90CA
-:400886007FEAE0B40104D200803F907FB4E04401F08036907FEAE07020907FECE0F45480FFC4540FFFE054072F25E024B4F582E4347FF5837401F08010907FB4E04401F046
-:4008C6008007907FB4E04401F0907FB4E04402F022E512540F70030209C812169AEF20E1751216F8EF14F5181218C5EF2518FFE433FEC3EF9480EE64809480505985158201
-:40090600851483E0FEA3E0FFF5828E83E030E011E5152431F582E43514F583E04480F0800FE5152431F582E43514F583E0547FF0E5152431F582E43514F583E020E212E5CC
-:4009460018600EF523EF2401F52DE43EF52C1214A0E4FF1214D7E5152431F582E43514F583E030E75D1218C5E515243BF582E43514F583E0FEEFC39E5048E515242FF58207
-:40098600E43514F5837401F0E5152431F582E43514F583E0547BF0E515243AF582E43514F583E4F0E5164213907FC2E030E110E5152426F582E43514F583E0F524800312C5
-:4009C600129C1216C9EF30E103020ACD1217C78F181218D3E5152438F582E43514F583EFF0E5152435F582E43514F583E0FFE518C39F50281218A9EF30E021E5152438F52E
-:400A060082E43514F583E020E712E5152431F582E43514F583E020E103020ACDE5152431F582E43514F583E054FDF0E5187003020ACDB4800FE5152438F582E43514F583DE
-:400A4600E04402F0E5152438F582E43514F583E0FF30E729E518D394204003751820851823851582851483A3A3E0FCA3E08C2CF52D1213CFE51825E0FF12150D22E518D3C3
-:400A8600943F400375183F851823E5152438F582E43514F583E0FF851582851483A3A3E0FCA3E0F5828C83EFF0851582851483A3A3E0FEA3E02401F52DE43EF52C12141D4F
-:400AC600E51804FF12150D22E4907F93F0907F9C74FFF0E4907F96F0907F94F090784A04F0F58E907F9574C0F0907F9E743FF0907F98742FF090784374F7F0E4907841F02C
-:400B0600907FDF749FF0907FDEF0907F92E04402F07E7B7FC075147B7515C0907F98742EF0751601120F287E7B7FC075147B7515C0907F98742EF0751601E5152426F58290
-:400B4600E43514F583E4F07E7E7F40851582851483747EF0A37440F07E7E7F80851582851483A3A3747EF0A37480F07E7C7F0075147C751500907F98742DF0751602120F0A
-:400B8600287E7C7F0075147C751500907F98742DF0751602E5152426F582E43514F5837401F07E7D7FC0851582851483747DF0A374C0F07E7E7F00851582851483A3A374EE
-:400BC6007EF0A37400F07E7C7F4075147C751540907F98742BF0751604120F287E7C7F4075147C751540907F98742BF0751604E5152426F582E43514F5837402F07E7D7F57
-:400C060040851582851483747DF0A37440F07E7D7F80851582851483A3A3747DF0A37480F07E7C7F8075147C751580907F987427F0751608120F287E7C7F8075147C751590
-:400C460080907F987427F0751608E5152426F582E43514F5837403F07E7C7FC0851582851483747CF0A374C0F07E7D7F00851582851483A3A3747DF0A37400F0C20AC209D3
-:400C8600E4F511D20222E510045403F51014601F146031146043240370527E7B7FC075147B7515C0907F98742EF0751601803D7E7C7F0075147C751500907F98742DF07564
-:400CC600160280287E7C7F4075147C751540907F98742BF075160480137E7C7F8075147C751580907F987427F0751608E53255167003020E27E516F45232E526547FFF7095
-:400D060017E52A55166034907F96E0FEE516C454F0F4FDEE5DF08023BF2020E5152431F582E43514F583E030E311E4F52A907F96E0FFE516C454F0FEEF4EF0E515243AF5C3
-:400D460082E43514F583E06003E014F0E5152434F582E43514F583E06003E014F0E06003020E27740AF0120036EF5401FFF518E515242CF582E43514F583E06F6007E518F1
-:400D8600F0E51642131218E18F18E5152427F582E43514F583E0FFE5185410FE6F6006EEF0E5164213E5152428F582E43514F583E0FFE5185480FE6F6006EEF0E516421386
-:400DC600E5152429F582E43514F583E0FFE5185420FE6F6015EEF0E5152431F582E43514F583E030E404E5164213E515242AF582E43514F583E0FFE5185440FE6F6015EE23
-:400E0600F0E5152431F582E43514F583E030E504E5164213E5152430F582E43514F583E4F022300903020F27E52414602A14604114605814606F24046003020EE57E7B7F31
-:400E4600C075147B7515C0907F98742EF075160112129C752401227E7C7F0075147C751500907F98742DF075160212129C752402227E7C7F4075147C751540907F98742B05
-:400E8600F075160412129C752403227E7C7F8075147C751580907F987427F075160812129C75240422300433C2045313DFE4F5187E007B00742E2518F9EE3400FA1211A6CA
-:400EC600FF74802518F582E4347BF583EFF00518E518B403DB907FC37403F075240522E536603BD5360A5313EF300A04D209C20AE4F5187E007B0074352518F9EE3400FACC
-:400F06001211A6FF74802518F582E4347BF583EFF00518E518B403DB907FC37403F0E4F52422E4F5197E007B01E5152519F9EE3514FAE41211EC0519E519B43CE8E51524FA
-:400F460035F582E43514F5837401F090784174F3F0E5152437F582E43514F5837403F090C000F07F0CE4FD12166B7F10E5152433F582E43514F583EFF01215DB9078417464
-:400F8600F2F07F01E5152436F582E43514F583EFF0440690C000F090784174F4F0E5152439F582E43514F5837480F090C000F00FE4FD12166BE4FF7EA3E5152432F582E486
-:400FC6003514F583EEF0FD12166B90784174F1F090C000E4F07F057D7F12166B7F011215437F037D0712166B2253133F907BF1E030E3167E7B7FC075147B7515C0907F986B
-:40100600742EF07516011208D7907C31E030E3167E7C7F0075147C751500907F98742DF07516021208D7907C71E030E3167E7C7F4075147C751540907F98742BF0751604C4
-:401046001208D7907CB1E030E3167E7C7F8075147C751580907F987427F07516081208D70512E512540FF517700412111C22E517B40104120C8C22907FC2E020E108E51370
-:401086006004120E2822120C8C22787FE4F6D8FD7581370210D7021224E493A3F8E493A34003F68001F208DFF48029E493A3F85407240CC8C333C4540F4420C8834004F4D7
-:4010C60056800146F6DFE4800B0102040810204080901845E47E019360BCA3FF543F30E509541FFEE493A360010ECF54C025E060A840B8E493A3FAE493A3F8E493A3C8C589
-:4011060082C8CAC583CAF0A3C8C582C8CAC583CADFE9DEE780BE907FD2E030E1030211A5C209907B40E014602614603B14605024836064248070637E7B7FC075147B75153A
-:40114600C0907F98742EF0751601120046804B7E7C7F0075147C751500907F98742DF075160212004680337E7C7F4075147C751540907F98742BF0751604120046801B7E2B
-:401186007C7F8075147C751580907F987427F07516081200468003121751E4907FD3F022BB010689828A83E0225002E722BBFE02E32289828A83E49322BB010CE58229F5B8
-:4011C60082E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E58229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322D083D082F8E49370B6
-:4012060012740193700DA3A393F8740193F5828883E4737402936860EFA3A3A380DF907FAEE0FFD39200E433FEEF4EF0D2E843D820907FDE7401F0907FDFF0907FAB74FFC2
-:40124600F0907FA9F0907FAAF05391EF907FAF7401F0907FAE740DF0D2AFD20B121809C201E4F52BF531C207C20275290F907FD8E06526600675320FE0F526300203120F8C
-:40128600EF300107C20112063F80E23008DFC20812182A80D822E5135516606AE515243AF582E43514F583E0705CE516F45213E5152426FFE43514FEE4FD0FEFAA067001C7
-:4012C6000E14F5828A83E0FC74802DF582E4347BF583ECF00DBD0BE2907FC3740BF0E515243AF582E43514F5837410F0E515242EF582E43514F583E4F0E515242FF582E423
-:401306003514F583E4F022E52845276057AE27AF28D3EF9440EE940040047E007F40C3E5289FF528E5279EF527E4FDEDC39FE49E501F853482853383E0FC74002DF582E4BA
-:40134600347FF583ECF00D0534E5347002053380DA907FA97401F0907FACE04401F0907FB5EFF022907FACE054FEF0E4907FB5F022907F98740FF0E490784AF0907F94F0E1
-:40138600907F9D74FFF0E4907F97F0907841F0907F93F0907F9C74FFF0300007E529540FFF80027F00907F96EFF0907F98741FF0E4907F95F0907F9E743FF0907F9874DFAD
-:4013C600F0907F92E054FDF0228F19052DE52DAE2C7002052C14F5828E83E519F01218EF052DE52DAC2C7002052C14F5828C83EFF01523E523601FE5152438F582E4351416
-:40140600F583C083C082E0FE1218D38F19EE4FD082D083F080B522907841E511F090784F74C0F0E4907850F0E52C907851F0AE2CE52D907852F0907854E523F09078577470
-:4014460004F0907FE2E04410F0E054F7F0E4907855F0907855E060FA228F19E4F51A751BFF751C19751D86AB1BAA1CA91D9000011211BFB4031DAF1A051AEFB519012212F9
-:4014860011A67E0029FFEE3AA907751BFFF51C891D80D47B007A00790022907841E511F0E52C90784FF0AE2CE52D907850F090785174C0F0E4907852F0907854E523F0907D
-:4014C60078577404F0E4907855F0907855E060FA22E5152404F582E43514F583E014600F1460131460178000907FC7EFF08013907FC9EFF0800C907FCBEFF08005907FCDED
-:40150600EFF0E516422A22E5152404F582E43514F583E014600F1460131460178000907FB7EFF08013907FB9EFF0800C907FBBEFF08005907FBDEFF0E516422A22AE07E4A4
-:40154600FFE5152432F582E43514F583E0547FFD12166B90784174F1F090C000EEF0E4E5152432F582E43514F583E04480FD12166B22C0E0C0F0C083C082C085C084C086A1
-:40158600758600C0D075D0085391EF907FA97401F012130DD0D0D086D084D085D082D083D0F0D0E03290784174F3F090C00074BFF090784174F1F090C000EFF090784174A8
-:4015C600F3F0E5152437F582E43514F583E0547F90C000F02290784174F3F090C00074BFF090784174F2F090C000EFF090784174F3F0E5152437F582E43514F583E0547FD7
-:4016060090C000F02290784174F3F090C00074BFF090784174F4F090C000EFF090784174F3F0E5152437F582E43514F583E0547F90C000F02290784174F3F090C00074BF16
-:40164600F090784174F6F090C000EFF090784174F3F0E5152437F582E43514F583E0547F90C000F02290784174F3F0E5152437F582E43514F583E0547F90C000F09078412F
-:4016860074F7F090C000EFF090784174F5F090C000EDF022E5152404F582E43514F583E014600E1460111460148000907FC6E0FF22907FC8E0FF22907FCAE0FF22907FCC19
-:4016C600E0FF22E5152404F582E43514F583E014600E1460111460148000907FB6E0FF22907FB8E0FF22907FBAE0FF22907FBCE0FF22E5152404F582E43514F583E0146000
-:401706000E1460111460148000907FC7E0FF22907FC9E0FF22907FCBE0FF22907FCDE0FF22C0E0C083C082C085C084C086758600907FC4E4F05391EF907FAB7404F0D086BF
-:40174600D084D085D082D083D0E032907B41E0F536431310A3E06009907FD77417F07437F0907B43E0F537A3E054F0F529E06002D20A22C0E0C083C082C085C084C08675A6
-:401786008600D2015391EF907FAB7401F0D086D084D085D082D083D0E032C0E0C083C082C085C084C086758600D2085391EF907FAB7408F0D086D084D085D082D083D0E03C
-:4017C600321218B7AE071218B7AD07EE6D60101218B7AE07EE6D60071218B7AD0780ECAF06227400F58690FDA57C05A3E582458370F922907FD6E04480F043870100000048
-:40180600000022907FD6E04404F0E04408F0300B04E04402F07FF47E01121860907FD6E054F7F0221213771217F9907FD6E030E70A7F057E00121860121893120ACE220378
-:4018460035800000032E810000C185C181C108C100C106012200012400008E178F18E5181518AE17700215174E60081217E81217E880EB22E5152404F582E43514F583E07E
-:4018860004FF4410907FD7F0EF4430F022907FD6E04401F07F0D7E00121860907FD6E054FEF022E5112402907841F090C000E0FF22E5112403907841F090C000E0FF22E597
-:4018C600112404907841F090C000E0FF22E5112405907841F090C000E0FF22E5112406907841F090C000E0FF22907841E511F090C000E0FF2253D8EF320012011001FFFFDE
-:40190600FF40CD062A0100000102000409027400010100A032090400000EFF000000070501024000000705020240000007050302400000070504024000000705050240005B
-:4019460000070506024000000705070240000007058102400001070582024000010705830240000107058402400001070585024000010705860240000107058702400001F3
-:401986000403090448034B00650079007300700061006E002C002000610020006400690076006900730069006F006E0020006F006600200049006E006E006F005300790040
-:4019C6007300200049006E0063002E0024034B00650079007300700061006E0020005500530041002D003400390057004C00430022035500530041002D00360035002000B5
-:401A060032003000300033006A0061006E0033003100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E
-:401A46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
-:401A86000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020
-:401AC6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002177900021B31
-:151B06000400021727000217A000021B1000021B1400021578E0
-:00000001FF
-
- The firmware contained herein is
-
- Copyright (C) 1999-2003
- Keyspan, A division of InnoSys Incorporated ("Keyspan")
-
- as an unpublished work. This notice does not imply unrestricted or
- public access to the source code from which this firmware image is
- derived. Except as noted below this firmware image may not be
- reproduced, used, sold or transferred to any third party without
- Keyspan's prior written consent. All Rights Reserved.
-
- Permission is hereby granted for the distribution of this firmware
- image as part of a Linux or other Open Source operating system kernel
- in text or binary form as required.
-
- This firmware may not be modified and may only be used with
- Keyspan hardware. Distribution and/or Modification of the
- keyspan.c driver which includes this firmware, in whole or in
- part, requires the inclusion of this statement."
-
-static char theFirmwareDate49[] =
- "02/14/2002 02:37p 19,347 USA49";
-
-static char theFirmwareDate65[] =
- "01/31/2003 09:34a 19,331 USA65";
-
diff --git a/firmware/keyspan_pda/keyspan_pda.HEX b/firmware/keyspan_pda/keyspan_pda.HEX
deleted file mode 100644
index 6fcf02bb4b2d..000000000000
--- a/firmware/keyspan_pda/keyspan_pda.HEX
+++ /dev/null
@@ -1,83 +0,0 @@
-:03000000020200F9
-:0400230002055F0073
-:0400430002010000B6
-:050030000000000000CB
-:10010000020296000200000002000000020000004F
-:1001100002000000020000000200000002000000D7
-:1001200002000000020000000204610002048900D5
-:1002000075815EE4F532F533F530F531F534C20031
-:10021000C201A90074FE901000F0A3D9FC74FD90F7
-:100220001100F0A3D9FC7402907F9DF07400907FC0
-:1002300097F07486907F9EF0907F957403F0907F86
-:10024000AFE0D2E0F07401907FABF0907FAEF09021
-:100250007FAC7404F0907FAD7404F0907FC9F074AB
-:1002600084907F98F07400F59875C8307B059120D4
-:10027000D2CA759850D2E8D2AFD2AC7400F586904D
-:100280007FD67402F0792E7A007B00DBFEDAFAD991
-:10029000F67406F080FEC086C082C083C084C0852C
-:1002A000C0E0E591C2E4F591907FAB7401F0907FDE
-:1002B000E8E0F9A3E0FAA3E0FBA3E0FCE95460B4B2
-:1002C0000003020339B4406EBA000B12042040034D
-:1002D00002040202040ABA010302040ABA02030277
-:1002E000040ABA0303020444BA041EBB000A907F46
-:1002F00095E04402F0020402907F98E054FDF090F3
-:100300007F95E054FDF0020402BA050302040ABA24
-:100310000619BB0008E533D395320203DEBB0108A2
-:10032000E532C395330203DE02040ABA07058B34B3
-:1003300002040202040A02040ABA0020B9801090E2
-:100340007F00E4F0A3F0907FB57402F0020402B9DC
-:10035000820280EBB9810280E602040ABA010FBB77
-:10036000000302040ABB010302040202040ABA03E6
-:100370000FBB000302040ABB010302040202040AC9
-:10038000BA0656BC010F907FD47406F0907FD574E6
-:1003900012F0020402BC0212BB006F907FD47406FC
-:1003A000F0907FD57424F0020402BC03297404C3C6
-:1003B0009B40576055EB2B9006442582F5827400D4
-:1003C0003583F583E0F9A3E0FA907FD4E9F0907FDC
-:1003D000D5EAF002040202040ABA080F7401907F01
-:1003E00000F07401907FB5F0020402BA0903020420
-:1003F00002BA0A0574000203DEBA0B030204020209
-:10040000040A907FB47402F08009907FB4E0440144
-:10041000F08000D0E0D085D084D083D082D08632E6
-:10042000EB20E71EC3940A5019EB2324FEF58274D7
-:10043000053400F583E0F5CBF5CDA3E0F5CAF5CCA6
-:10044000C322D322B94111EB64FF5484FB907F98FF
-:10045000E0547B4BF0020402907F9BE064FF0203B8
-:10046000DEC086C082C083C084C085C0E0E591C282
-:10047000E4F591907FA97404F01205A0D0E0D08536
-:10048000D084D083D082D08632C086C082C083C060
-:1004900084C085C0E0E591C2E4F591907FAA740420
-:1004A000F0907FC9E0F9E4F586907DC075851085F0
-:1004B0003284E005860584F0E584B53302800905C1
-:1004C000320586A3D9EC8000907FC9F0B131D0E02D
-:1004D000D085D084D083D082D08632E4F586907FD8
-:1004E000BCE020E14B907D00E532F0A3E533F0A3C2
-:1004F000E530F0A3E531F0A3E430000104F0A305FA
-:10050000869010007910E0A30586F0A30586D9F641
-:10051000058674FCF0A305869011007910E0A30510
-:1005200086F0A30586D9F6E4F586907FBD7426F0A3
-:1005300022200013E532B53301220533758310857F
-:100540003382E0F599D2007400B5340122E533D34B
-:100550009532C3953440F5753400D2010205A0C030
-:1005600086C082C083C084C085C0E0309907C2992C
-:10057000C20012053430980512058AC298D0E0D026
-:1005800085D084D083D082D0863275831185308225
-:100590000582E599F0E582B53101220530B1A0224E
-:1005A000907FB8E020E138200136E530B5310122F6
-:1005B000E4F5867583110586907E00F0A3058679A3
-:1005C00001E530B5310280100531853182E00586C4
-:1005D000F0A3058609B940E9907FB9E96001F022EE
-:1005E000C201E4F586907E007401F0A37402F090DD
-:1005F0007FB9F022C299F5993099FDC29922E55E42
-:10060000F63CFD8FFEC8FF64FFB2FFD9FFEDFFF39C
-:10061000FFFA12010001FFFFFF40CD06040189AB84
-:1006200001020301090220000101008032090400D7
-:100630000002FFFFFF0007058203400001070502DB
-:1006400002400000064C0650067206A0040300009B
-:100650002203410043004D00450020007500730057
-:100660006200200077006900640067006500740084
-:1006700073002E03410043004D004500200055004B
-:1006800053004200200073006500720069006100A1
-:100690006C0020007700690064006700650074004A
-:0606A000060334003700E0
-:00000001FF
diff --git a/firmware/keyspan_pda/keyspan_pda.S b/firmware/keyspan_pda/keyspan_pda.S
deleted file mode 100644
index f3acc197a5ef..000000000000
--- a/firmware/keyspan_pda/keyspan_pda.S
+++ /dev/null
@@ -1,1124 +0,0 @@
-/* $Id: loop.s,v 1.23 2000/03/20 09:49:06 warner Exp $
- *
- * Firmware for the Keyspan PDA Serial Adapter, a USB serial port based on
- * the EzUSB microcontroller.
- *
- * (C) Copyright 2000 Brian Warner <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * "Keyspan PDA Serial Adapter" is probably a copyright of Keyspan, the
- * company.
- *
- * This serial adapter is basically an EzUSB chip and an RS-232 line driver
- * in a little widget that has a DB-9 on one end and a USB plug on the other.
- * It uses the EzUSB's internal UART0 (using the pins from Port C) and timer2
- * as a baud-rate generator. The wiring is:
- * PC0/RxD0 <- rxd (DB9 pin 2) PC4 <- dsr pin 6
- * PC1/TxD0 -> txd pin 3 PC5 <- ri pin 9
- * PC2 -> rts pin 7 PC6 <- dcd pin 1
- * PC3 <- cts pin 8 PC7 -> dtr pin 4
- * PB1 -> line driver standby
- *
- * The EzUSB register constants below come from their excellent documentation
- * and sample code (which used to be available at www.anchorchips.com, but
- * that has now been absorbed into Cypress' site and the CD-ROM contents
- * don't appear to be available online anymore). If we get multiple
- * EzUSB-based drivers into the kernel, it might be useful to pull them out
- * into a separate .h file.
- *
- * THEORY OF OPERATION:
- *
- * There are two 256-byte ring buffers, one for tx, one for rx.
- *
- * EP2out is pure tx data. When it appears, the data is copied into the tx
- * ring and serial transmission is started if it wasn't already running. The
- * "tx buffer empty" interrupt may kick off another character if the ring
- * still has data. If the host is tx-blocked because the ring filled up,
- * it will request a "tx unthrottle" interrupt. If sending a serial character
- * empties the ring below the desired threshold, we set a bit that will send
- * up the tx unthrottle message as soon as the rx buffer becomes free.
- *
- * EP2in (interrupt) is used to send both rx chars and rx status messages
- * (only "tx unthrottle" at this time) back up to the host. The first byte
- * of the rx message indicates data (0) or status msg (1). Status messages
- * are sent before any data.
- *
- * Incoming serial characters are put into the rx ring by the serial
- * interrupt, and the EP2in buffer sent if it wasn't already in transit.
- * When the EP2in buffer returns, the interrupt prompts us to send more
- * rx chars (or status messages) if they are pending.
- *
- * Device control happens through "vendor specific" control messages on EP0.
- * All messages are destined for the "Interface" (with the index always 0,
- * so that if their two-port device might someday use similar firmware, we
- * can use index=1 to refer to the second port). The messages defined are:
- *
- * bRequest = 0 : set baud/bits/parity
- * 1 : unused
- * 2 : reserved for setting HW flow control (CTSRTS)
- * 3 : get/set "modem info" (pin states: DTR, RTS, DCD, RI, etc)
- * 4 : set break (on/off)
- * 5 : reserved for requesting interrupts on pin state change
- * 6 : query buffer room or chars in tx buffer
- * 7 : request tx unthrottle interrupt
- *
- * The host-side driver is set to recognize the device ID values stashed in
- * serial EEPROM (0x06cd, 0x0103), program this firmware into place, then
- * start it running. This firmware will use EzUSB's "renumeration" trick by
- * simulating a bus disconnect, then reconnect with a different device ID
- * (encoded in the desc_device descriptor below). The host driver then
- * recognizes the new device ID and glues it to the real serial driver code.
- *
- * USEFUL DOCS:
- * EzUSB Technical Reference Manual: <http://www.cypress.com/>
- * 8051 manuals: everywhere, but try www.dalsemi.com because the EzUSB is
- * basically the Dallas enhanced 8051 code. Remember that the EzUSB IO ports
- * use totally different registers!
- * USB 1.1 spec: www.usb.org
- *
- * HOW TO BUILD:
- * gcc -x assembler-with-cpp -P -E -o keyspan_pda.asm keyspan_pda.s
- * as31 -l keyspan_pda.asm
- * mv keyspan_pda.obj keyspan_pda.hex
- * perl ezusb_convert.pl keyspan_pda < keyspan_pda.hex > keyspan_pda_fw.h
- * Get as31 from <http://www.pjrc.com/tech/8051/index.html>, and hack on it
- * a bit to make it build.
- *
- * THANKS:
- * Greg Kroah-Hartman, for coordinating the whole usb-serial thing.
- * AnchorChips, for making such an incredibly useful little microcontroller.
- * KeySpan, for making a handy, cheap ($40) widget that was so easy to take
- * apart and trace with an ohmmeter.
- *
- * TODO:
- * lots. grep for TODO. Interrupt safety needs stress-testing. Better flow
- * control. Interrupting host upon change in DCD, etc, counting transitions.
- * Need to find a safe device id to use (the one used by the Keyspan firmware
- * under Windows would be ideal.. can anyone figure out what it is?). Parity.
- * More baud rates. Oh, and the string-descriptor-length silicon bug
- * workaround should be implemented, but I'm lazy, and the consequence is
- * that the device name strings that show up in your kernel log will have
- * lots of trailing binary garbage in them (appears as ????). Device strings
- * should be made more accurate.
- *
- * Questions, bugs, patches to Brian.
- *
- * -Brian Warner <[email protected]>
- *
- */
-
-#define HIGH(x) (((x) & 0xff00) / 256)
-#define LOW(x) ((x) & 0xff)
-
-#define dpl1 0x84
-#define dph1 0x85
-#define dps 0x86
-
-;;; our bit assignments
-#define TX_RUNNING 0
-#define DO_TX_UNTHROTTLE 1
-
- ;; stack from 0x60 to 0x7f: should really set SP to 0x60-1, not 0x60
-#define STACK #0x60-1
-
-#define EXIF 0x91
-#define EIE 0xe8
- .flag EUSB, EIE.0
- .flag ES0, IE.4
-
-#define EP0CS #0x7fb4
-#define EP0STALLbit #0x01
-#define IN0BUF #0x7f00
-#define IN0BC #0x7fb5
-#define OUT0BUF #0x7ec0
-#define OUT0BC #0x7fc5
-#define IN2BUF #0x7e00
-#define IN2BC #0x7fb9
-#define IN2CS #0x7fb8
-#define OUT2BC #0x7fc9
-#define OUT2CS #0x7fc8
-#define OUT2BUF #0x7dc0
-#define IN4BUF #0x7d00
-#define IN4BC #0x7fbd
-#define IN4CS #0x7fbc
-#define OEB #0x7f9d
-#define OUTB #0x7f97
-#define OEC #0x7f9e
-#define OUTC #0x7f98
-#define PINSC #0x7f9b
-#define PORTCCFG #0x7f95
-#define IN07IRQ #0x7fa9
-#define OUT07IRQ #0x7faa
-#define IN07IEN #0x7fac
-#define OUT07IEN #0x7fad
-#define USBIRQ #0x7fab
-#define USBIEN #0x7fae
-#define USBBAV #0x7faf
-#define USBCS #0x7fd6
-#define SUDPTRH #0x7fd4
-#define SUDPTRL #0x7fd5
-#define SETUPDAT #0x7fe8
-
- ;; usb interrupt : enable is EIE.0 (0xe8), flag is EXIF.4 (0x91)
-
- .org 0
- ljmp start
- ;; interrupt vectors
- .org 23H
- ljmp serial_int
- .byte 0
-
- .org 43H
- ljmp USB_Jump_Table
- .byte 0 ; filled in by the USB core
-
-;;; local variables. These are not initialized properly: do it by hand.
- .org 30H
-rx_ring_in: .byte 0
-rx_ring_out: .byte 0
-tx_ring_in: .byte 0
-tx_ring_out: .byte 0
-tx_unthrottle_threshold: .byte 0
-
- .org 0x100H ; wants to be on a page boundary
-USB_Jump_Table:
- ljmp ISR_Sudav ; Setup Data Available
- .byte 0
- ljmp 0 ; Start of Frame
- .byte 0
- ljmp 0 ; Setup Data Loading
- .byte 0
- ljmp 0 ; Global Suspend
- .byte 0
- ljmp 0 ; USB Reset
- .byte 0
- ljmp 0 ; Reserved
- .byte 0
- ljmp 0 ; End Point 0 In
- .byte 0
- ljmp 0 ; End Point 0 Out
- .byte 0
- ljmp 0 ; End Point 1 In
- .byte 0
- ljmp 0 ; End Point 1 Out
- .byte 0
- ljmp ISR_Ep2in
- .byte 0
- ljmp ISR_Ep2out
- .byte 0
-
-
- .org 0x200
-
-start: mov SP,STACK-1 ; set stack
- ;; clear local variables
- clr a
- mov tx_ring_in, a
- mov tx_ring_out, a
- mov rx_ring_in, a
- mov rx_ring_out, a
- mov tx_unthrottle_threshold, a
- clr TX_RUNNING
- clr DO_TX_UNTHROTTLE
-
- ;; clear fifo with "fe"
- mov r1, 0
- mov a, #0xfe
- mov dptr, #tx_ring
-clear_tx_ring_loop:
- movx @dptr, a
- inc dptr
- djnz r1, clear_tx_ring_loop
-
- mov a, #0xfd
- mov dptr, #rx_ring
-clear_rx_ring_loop:
- movx @dptr, a
- inc dptr
- djnz r1, clear_rx_ring_loop
-
-;;; turn on the RS-232 driver chip (bring the STANDBY pin low)
- ;; set OEB.1
- mov a, #02H
- mov dptr,OEB
- movx @dptr,a
- ;; clear PB1
- mov a, #00H
- mov dptr,OUTB
- movx @dptr,a
- ;; set OEC.[127]
- mov a, #0x86
- mov dptr,OEC
- movx @dptr,a
- ;; set PORTCCFG.[01] to route TxD0,RxD0 to serial port
- mov dptr, PORTCCFG
- mov a, #0x03
- movx @dptr, a
-
- ;; set up interrupts, autovectoring
- mov dptr, USBBAV
- movx a,@dptr
- setb acc.0 ; AVEN bit to 0
- movx @dptr, a
-
- mov a,#0x01 ; enable SUDAV: setup data available (for ep0)
- mov dptr, USBIRQ
- movx @dptr, a ; clear SUDAVI
- mov dptr, USBIEN
- movx @dptr, a
-
- mov dptr, IN07IEN
- mov a,#0x04 ; enable IN2 int
- movx @dptr, a
-
- mov dptr, OUT07IEN
- mov a,#0x04 ; enable OUT2 int
- movx @dptr, a
- mov dptr, OUT2BC
- movx @dptr, a ; arm OUT2
-
- mov a, #0x84 ; turn on RTS, DTR
- mov dptr,OUTC
- movx @dptr, a
- ;; setup the serial port. 9600 8N1.
- mov a,#01010011 ; mode 1, enable rx, clear int
- mov SCON, a
- ;; using timer2, in 16-bit baud-rate-generator mode
- ;; (xtal 12MHz, internal fosc 24MHz)
- ;; RCAP2H,RCAP2L = 65536 - fosc/(32*baud)
- ;; 57600: 0xFFF2.F, say 0xFFF3
- ;; 9600: 0xFFB1.E, say 0xFFB2
- ;; 300: 0xF63C
-#define BAUD 9600
-#define BAUD_TIMEOUT(rate) (65536 - (24 * 1000 * 1000) / (32 * rate))
-#define BAUD_HIGH(rate) HIGH(BAUD_TIMEOUT(rate))
-#define BAUD_LOW(rate) LOW(BAUD_TIMEOUT(rate))
-
- mov T2CON, #030h ; rclk=1,tclk=1,cp=0,tr2=0(enable later)
- mov r3, #5
- acall set_baud
- setb TR2
- mov SCON, #050h
-
-#if 0
- mov r1, #0x40
- mov a, #0x41
-send:
- mov SBUF, a
- inc a
- anl a, #0x3F
- orl a, #0x40
-; xrl a, #0x02
-wait1:
- jnb TI, wait1
- clr TI
- djnz r1, send
-;done: sjmp done
-
-#endif
-
- setb EUSB
- setb EA
- setb ES0
- ;acall dump_stat
-
- ;; hey, what say we RENUMERATE! (TRM p.62)
- mov a, #0
- mov dps, a
- mov dptr, USBCS
- mov a, #0x02 ; DISCON=0, DISCOE=0, RENUM=1
- movx @dptr, a
- ;; now presence pin is floating, simulating disconnect. wait 0.5s
- mov r1, #46
-renum_wait1:
- mov r2, #0
-renum_wait2:
- mov r3, #0
-renum_wait3:
- djnz r3, renum_wait3
- djnz r2, renum_wait2
- djnz r1, renum_wait1 ; wait about n*(256^2) 6MHz clocks
- mov a, #0x06 ; DISCON=0, DISCOE=1, RENUM=1
- movx @dptr, a
- ;; we are back online. the host device will now re-query us
-
-
-main: sjmp main
-
-
-
-ISR_Sudav:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, USBIRQ ; clear USB int
- mov a,#01h
- movx @dptr,a
-
- ;; get request type
- mov dptr, SETUPDAT
- movx a, @dptr
- mov r1, a ; r1 = bmRequestType
- inc dptr
- movx a, @dptr
- mov r2, a ; r2 = bRequest
- inc dptr
- movx a, @dptr
- mov r3, a ; r3 = wValueL
- inc dptr
- movx a, @dptr
- mov r4, a ; r4 = wValueH
-
- ;; main switch on bmRequest.type: standard or vendor
- mov a, r1
- anl a, #0x60
- cjne a, #0x00, setup_bmreq_type_not_standard
- ;; standard request: now main switch is on bRequest
- ljmp setup_bmreq_is_standard
-
-setup_bmreq_type_not_standard:
- ;; a still has bmreq&0x60
- cjne a, #0x40, setup_bmreq_type_not_vendor
- ;; Anchor reserves bRequest 0xa0-0xaf, we use small ones
- ;; switch on bRequest. bmRequest will always be 0x41 or 0xc1
- cjne r2, #0x00, setup_ctrl_not_00
- ;; 00 is set baud, wValue[0] has baud rate index
- lcall set_baud ; index in r3, carry set if error
- jc setup_bmreq_type_not_standard__do_stall
- ljmp setup_done_ack
-setup_bmreq_type_not_standard__do_stall:
- ljmp setup_stall
-setup_ctrl_not_00:
- cjne r2, #0x01, setup_ctrl_not_01
- ;; 01 is reserved for set bits (parity). TODO
- ljmp setup_stall
-setup_ctrl_not_01:
- cjne r2, #0x02, setup_ctrl_not_02
- ;; 02 is set HW flow control. TODO
- ljmp setup_stall
-setup_ctrl_not_02:
- cjne r2, #0x03, setup_ctrl_not_03
- ;; 03 is control pins (RTS, DTR).
- ljmp control_pins ; will jump to setup_done_ack,
- ; or setup_return_one_byte
-setup_ctrl_not_03:
- cjne r2, #0x04, setup_ctrl_not_04
- ;; 04 is send break (really "turn break on/off"). TODO
- cjne r3, #0x00, setup_ctrl_do_break_on
- ;; do break off: restore PORTCCFG.1 to reconnect TxD0 to serial port
- mov dptr, PORTCCFG
- movx a, @dptr
- orl a, #0x02
- movx @dptr, a
- ljmp setup_done_ack
-setup_ctrl_do_break_on:
- ;; do break on: clear PORTCCFG.0, set TxD high(?) (b1 low)
- mov dptr, OUTC
- movx a, @dptr
- anl a, #0xfd ; ~0x02
- movx @dptr, a
- mov dptr, PORTCCFG
- movx a, @dptr
- anl a, #0xfd ; ~0x02
- movx @dptr, a
- ljmp setup_done_ack
-setup_ctrl_not_04:
- cjne r2, #0x05, setup_ctrl_not_05
- ;; 05 is set desired interrupt bitmap. TODO
- ljmp setup_stall
-setup_ctrl_not_05:
- cjne r2, #0x06, setup_ctrl_not_06
- ;; 06 is query room
- cjne r3, #0x00, setup_ctrl_06_not_00
- ;; 06, wValue[0]=0 is query write_room
- mov a, tx_ring_out
- setb c
- subb a, tx_ring_in ; out-1-in = 255 - (in-out)
- ljmp setup_return_one_byte
-setup_ctrl_06_not_00:
- cjne r3, #0x01, setup_ctrl_06_not_01
- ;; 06, wValue[0]=1 is query chars_in_buffer
- mov a, tx_ring_in
- clr c
- subb a, tx_ring_out ; in-out
- ljmp setup_return_one_byte
-setup_ctrl_06_not_01:
- ljmp setup_stall
-setup_ctrl_not_06:
- cjne r2, #0x07, setup_ctrl_not_07
- ;; 07 is request tx unthrottle interrupt
- mov tx_unthrottle_threshold, r3; wValue[0] is threshold value
- ljmp setup_done_ack
-setup_ctrl_not_07:
- ljmp setup_stall
-
-setup_bmreq_type_not_vendor:
- ljmp setup_stall
-
-
-setup_bmreq_is_standard:
- cjne r2, #0x00, setup_breq_not_00
- ;; 00: Get_Status (sub-switch on bmRequestType: device, ep, int)
- cjne r1, #0x80, setup_Get_Status_not_device
- ;; Get_Status(device)
- ;; are we self-powered? no. can we do remote wakeup? no
- ;; so return two zero bytes. This is reusable
-setup_return_two_zero_bytes:
- mov dptr, IN0BUF
- clr a
- movx @dptr, a
- inc dptr
- movx @dptr, a
- mov dptr, IN0BC
- mov a, #2
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Status_not_device:
- cjne r1, #0x82, setup_Get_Status_not_endpoint
- ;; Get_Status(endpoint)
- ;; must get stall bit for ep[wIndexL], return two bytes, bit in lsb 0
- ;; for now: cheat. TODO
- sjmp setup_return_two_zero_bytes
-setup_Get_Status_not_endpoint:
- cjne r1, #0x81, setup_Get_Status_not_interface
- ;; Get_Status(interface): return two zeros
- sjmp setup_return_two_zero_bytes
-setup_Get_Status_not_interface:
- ljmp setup_stall
-
-setup_breq_not_00:
- cjne r2, #0x01, setup_breq_not_01
- ;; 01: Clear_Feature (sub-switch on wValueL: stall, remote wakeup)
- cjne r3, #0x00, setup_Clear_Feature_not_stall
- ;; Clear_Feature(stall). should clear a stall bit. TODO
- ljmp setup_stall
-setup_Clear_Feature_not_stall:
- cjne r3, #0x01, setup_Clear_Feature_not_rwake
- ;; Clear_Feature(remote wakeup). ignored.
- ljmp setup_done_ack
-setup_Clear_Feature_not_rwake:
- ljmp setup_stall
-
-setup_breq_not_01:
- cjne r2, #0x03, setup_breq_not_03
- ;; 03: Set_Feature (sub-switch on wValueL: stall, remote wakeup)
- cjne r3, #0x00, setup_Set_Feature_not_stall
- ;; Set_Feature(stall). Should set a stall bit. TODO
- ljmp setup_stall
-setup_Set_Feature_not_stall:
- cjne r3, #0x01, setup_Set_Feature_not_rwake
- ;; Set_Feature(remote wakeup). ignored.
- ljmp setup_done_ack
-setup_Set_Feature_not_rwake:
- ljmp setup_stall
-
-setup_breq_not_03:
- cjne r2, #0x06, setup_breq_not_06
- ;; 06: Get_Descriptor (s-switch on wValueH: dev, config[n], string[n])
- cjne r4, #0x01, setup_Get_Descriptor_not_device
- ;; Get_Descriptor(device)
- mov dptr, SUDPTRH
- mov a, #HIGH(desc_device)
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, #LOW(desc_device)
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Descriptor_not_device:
- cjne r4, #0x02, setup_Get_Descriptor_not_config
- ;; Get_Descriptor(config[n])
- cjne r3, #0x00, setup_stall; only handle n==0
- ;; Get_Descriptor(config[0])
- mov dptr, SUDPTRH
- mov a, #HIGH(desc_config1)
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, #LOW(desc_config1)
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Descriptor_not_config:
- cjne r4, #0x03, setup_Get_Descriptor_not_string
- ;; Get_Descriptor(string[wValueL])
- ;; if (wValueL >= maxstrings) stall
- mov a, #((desc_strings_end-desc_strings)/2)
- clr c
- subb a,r3 ; a=4, r3 = 0..3 . if a<=0 then stall
- jc setup_stall
- jz setup_stall
- mov a, r3
- add a, r3 ; a = 2*wValueL
- mov dptr, #desc_strings
- add a, dpl
- mov dpl, a
- mov a, #0
- addc a, dph
- mov dph, a ; dph = desc_strings[a]. big endian! (handy)
- ;; it looks like my adapter uses a revision of the EZUSB that
- ;; contains "rev D errata number 8", as hinted in the EzUSB example
- ;; code. I cannot find an actual errata description on the Cypress
- ;; web site, but from the example code it looks like this bug causes
- ;; the length of string descriptors to be read incorrectly, possibly
- ;; sending back more characters than the descriptor has. The workaround
- ;; is to manually send out all of the data. The consequence of not
- ;; using the workaround is that the strings gathered by the kernel
- ;; driver are too long and are filled with trailing garbage (including
- ;; leftover strings). Writing this out by hand is a nuisance, so for
- ;; now I will just live with the bug.
- movx a, @dptr
- mov r1, a
- inc dptr
- movx a, @dptr
- mov r2, a
- mov dptr, SUDPTRH
- mov a, r1
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, r2
- movx @dptr, a
- ;; done
- ljmp setup_done_ack
-
-setup_Get_Descriptor_not_string:
- ljmp setup_stall
-
-setup_breq_not_06:
- cjne r2, #0x08, setup_breq_not_08
- ;; Get_Configuration. always 1. return one byte.
- ;; this is reusable
- mov a, #1
-setup_return_one_byte:
- mov dptr, IN0BUF
- movx @dptr, a
- mov a, #1
- mov dptr, IN0BC
- movx @dptr, a
- ljmp setup_done_ack
-setup_breq_not_08:
- cjne r2, #0x09, setup_breq_not_09
- ;; 09: Set_Configuration. ignored.
- ljmp setup_done_ack
-setup_breq_not_09:
- cjne r2, #0x0a, setup_breq_not_0a
- ;; 0a: Get_Interface. get the current altsetting for int[wIndexL]
- ;; since we only have one interface, ignore wIndexL, return a 0
- mov a, #0
- ljmp setup_return_one_byte
-setup_breq_not_0a:
- cjne r2, #0x0b, setup_breq_not_0b
- ;; 0b: Set_Interface. set altsetting for interface[wIndexL]. ignored
- ljmp setup_done_ack
-setup_breq_not_0b:
- ljmp setup_stall
-
-
-setup_done_ack:
- ;; now clear HSNAK
- mov dptr, EP0CS
- mov a, #0x02
- movx @dptr, a
- sjmp setup_done
-setup_stall:
- ;; unhandled. STALL
- ;EP0CS |= bmEPSTALL
- mov dptr, EP0CS
- movx a, @dptr
- orl a, EP0STALLbit
- movx @dptr, a
- sjmp setup_done
-
-setup_done:
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-;;; ==============================================================
-
-set_baud: ; baud index in r3
- ;; verify a < 10
- mov a, r3
- jb ACC.7, set_baud__badbaud
- clr c
- subb a, #10
- jnc set_baud__badbaud
- mov a, r3
- rl a ; a = index*2
- add a, #LOW(baud_table)
- mov dpl, a
- mov a, #HIGH(baud_table)
- addc a, #0
- mov dph, a
- ;; TODO: shut down xmit/receive
- ;; TODO: wait for current xmit char to leave
- ;; TODO: shut down timer to avoid partial-char glitch
- movx a,@dptr ; BAUD_HIGH
- mov RCAP2H, a
- mov TH2, a
- inc dptr
- movx a,@dptr ; BAUD_LOW
- mov RCAP2L, a
- mov TL2, a
- ;; TODO: restart xmit/receive
- ;; TODO: reenable interrupts, resume tx if pending
- clr c ; c=0: success
- ret
-set_baud__badbaud:
- setb c ; c=1: failure
- ret
-
-;;; ==================================================
-control_pins:
- cjne r1, #0x41, control_pins_in
-control_pins_out:
- mov a, r3 ; wValue[0] holds new bits: b7 is new DTR, b2 is new RTS
- xrl a, #0xff ; 1 means active, 0V, +12V ?
- anl a, #0x84
- mov r3, a
- mov dptr, OUTC
- movx a, @dptr ; only change bits 7 and 2
- anl a, #0x7b ; ~0x84
- orl a, r3
- movx @dptr, a ; other pins are inputs, bits ignored
- ljmp setup_done_ack
-control_pins_in:
- mov dptr, PINSC
- movx a, @dptr
- xrl a, #0xff
- ljmp setup_return_one_byte
-
-;;; ========================================
-
-ISR_Ep2in:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, IN07IRQ ; clear USB int
- mov a,#04h
- movx @dptr,a
-
- ;; do stuff
- lcall start_in
-
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-ISR_Ep2out:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, OUT07IRQ ; clear USB int
- mov a,#04h
- movx @dptr,a
-
- ;; do stuff
-
- ;; copy data into buffer. for now, assume we will have enough space
- mov dptr, OUT2BC ; get byte count
- movx a,@dptr
- mov r1, a
- clr a
- mov dps, a
- mov dptr, OUT2BUF ; load DPTR0 with source
- mov dph1, #HIGH(tx_ring) ; load DPTR1 with target
- mov dpl1, tx_ring_in
-OUT_loop:
- movx a,@dptr ; read
- inc dps ; switch to DPTR1: target
- inc dpl1 ; target = tx_ring_in+1
- movx @dptr,a ; store
- mov a,dpl1
- cjne a, tx_ring_out, OUT_no_overflow
- sjmp OUT_overflow
-OUT_no_overflow:
- inc tx_ring_in ; tx_ring_in++
- inc dps ; switch to DPTR0: source
- inc dptr
- djnz r1, OUT_loop
- sjmp OUT_done
-OUT_overflow:
- ;; signal overflow
- ;; fall through
-OUT_done:
- ;; ack
- mov dptr,OUT2BC
- movx @dptr,a
-
- ;; start tx
- acall maybe_start_tx
- ;acall dump_stat
-
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-dump_stat:
- ;; fill in EP4in with a debugging message:
- ;; tx_ring_in, tx_ring_out, rx_ring_in, rx_ring_out
- ;; tx_active
- ;; tx_ring[0..15]
- ;; 0xfc
- ;; rx_ring[0..15]
- clr a
- mov dps, a
-
- mov dptr, IN4CS
- movx a, @dptr
- jb acc.1, dump_stat__done; busy: cannot dump, old one still pending
- mov dptr, IN4BUF
-
- mov a, tx_ring_in
- movx @dptr, a
- inc dptr
- mov a, tx_ring_out
- movx @dptr, a
- inc dptr
-
- mov a, rx_ring_in
- movx @dptr, a
- inc dptr
- mov a, rx_ring_out
- movx @dptr, a
- inc dptr
-
- clr a
- jnb TX_RUNNING, dump_stat__no_tx_running
- inc a
-dump_stat__no_tx_running:
- movx @dptr, a
- inc dptr
- ;; tx_ring[0..15]
- inc dps
- mov dptr, #tx_ring ; DPTR1: source
- mov r1, #16
-dump_stat__tx_ring_loop:
- movx a, @dptr
- inc dptr
- inc dps
- movx @dptr, a
- inc dptr
- inc dps
- djnz r1, dump_stat__tx_ring_loop
- inc dps
-
- mov a, #0xfc
- movx @dptr, a
- inc dptr
-
- ;; rx_ring[0..15]
- inc dps
- mov dptr, #rx_ring ; DPTR1: source
- mov r1, #16
-dump_stat__rx_ring_loop:
- movx a, @dptr
- inc dptr
- inc dps
- movx @dptr, a
- inc dptr
- inc dps
- djnz r1, dump_stat__rx_ring_loop
-
- ;; now send it
- clr a
- mov dps, a
- mov dptr, IN4BC
- mov a, #38
- movx @dptr, a
-dump_stat__done:
- ret
-
-;;; ============================================================
-
-maybe_start_tx:
- ;; make sure the tx process is running.
- jb TX_RUNNING, start_tx_done
-start_tx:
- ;; is there work to be done?
- mov a, tx_ring_in
- cjne a,tx_ring_out, start_tx__work
- ret ; no work
-start_tx__work:
- ;; tx was not running. send the first character, setup the TI int
- inc tx_ring_out ; [++tx_ring_out]
- mov dph, #HIGH(tx_ring)
- mov dpl, tx_ring_out
- movx a, @dptr
- mov sbuf, a
- setb TX_RUNNING
-start_tx_done:
- ;; can we unthrottle the host tx process?
- ;; step 1: do we care?
- mov a, #0
- cjne a, tx_unthrottle_threshold, start_tx__maybe_unthrottle_tx
- ;; nope
-start_tx_really_done:
- ret
-start_tx__maybe_unthrottle_tx:
- ;; step 2: is there now room?
- mov a, tx_ring_out
- setb c
- subb a, tx_ring_in
- ;; a is now write_room. If thresh >= a, we can unthrottle
- clr c
- subb a, tx_unthrottle_threshold
- jc start_tx_really_done ; nope
- ;; yes, we can unthrottle. remove the threshold and mark a request
- mov tx_unthrottle_threshold, #0
- setb DO_TX_UNTHROTTLE
- ;; prod rx, which will actually send the message when in2 becomes free
- ljmp start_in
-
-
-serial_int:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- jnb TI, serial_int__not_tx
- ;; tx finished. send another character if we have one
- clr TI ; clear int
- clr TX_RUNNING
- lcall start_tx
-serial_int__not_tx:
- jnb RI, serial_int__not_rx
- lcall get_rx_char
- clr RI ; clear int
-serial_int__not_rx:
- ;; return
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-get_rx_char:
- mov dph, #HIGH(rx_ring)
- mov dpl, rx_ring_in
- inc dpl ; target = rx_ring_in+1
- mov a, sbuf
- movx @dptr, a
- ;; check for overflow before incrementing rx_ring_in
- mov a, dpl
- cjne a, rx_ring_out, get_rx_char__no_overflow
- ;; signal overflow
- ret
-get_rx_char__no_overflow:
- inc rx_ring_in
- ;; kick off USB INpipe
- acall start_in
- ret
-
-start_in:
- ;; check if the inpipe is already running.
- mov dptr, IN2CS
- movx a, @dptr
- jb acc.1, start_in__done; int will handle it
- jb DO_TX_UNTHROTTLE, start_in__do_tx_unthrottle
- ;; see if there is any work to do. a serial interrupt might occur
- ;; during this sequence?
- mov a, rx_ring_in
- cjne a, rx_ring_out, start_in__have_work
- ret ; nope
-start_in__have_work:
- ;; now copy as much data as possible into the pipe. 63 bytes max.
- clr a
- mov dps, a
- mov dph, #HIGH(rx_ring) ; load DPTR0 with source
- inc dps
- mov dptr, IN2BUF ; load DPTR1 with target
- movx @dptr, a ; in[0] signals that rest of IN is rx data
- inc dptr
- inc dps
- ;; loop until we run out of data, or we have copied 64 bytes
- mov r1, #1 ; INbuf size counter
-start_in__loop:
- mov a, rx_ring_in
- cjne a, rx_ring_out, start_inlocal_irq_enablell_copying
- sjmp start_in__kick
-start_inlocal_irq_enablell_copying:
- inc rx_ring_out
- mov dpl, rx_ring_out
- movx a, @dptr
- inc dps
- movx @dptr, a ; write into IN buffer
- inc dptr
- inc dps
- inc r1
- cjne r1, #64, start_in__loop; loop
-start_in__kick:
- ;; either we ran out of data, or we copied 64 bytes. r1 has byte count
- ;; kick off IN
- mov dptr, IN2BC
- mov a, r1
- jz start_in__done
- movx @dptr, a
- ;; done
-start_in__done:
- ;acall dump_stat
- ret
-start_in__do_tx_unthrottle:
- ;; special sequence: send a tx unthrottle message
- clr DO_TX_UNTHROTTLE
- clr a
- mov dps, a
- mov dptr, IN2BUF
- mov a, #1
- movx @dptr, a
- inc dptr
- mov a, #2
- movx @dptr, a
- mov dptr, IN2BC
- movx @dptr, a
- ret
-
-putchar:
- clr TI
- mov SBUF, a
-putchar_wait:
- jnb TI, putchar_wait
- clr TI
- ret
-
-
-baud_table: ; baud_high, then baud_low
- ;; baud[0]: 110
- .byte BAUD_HIGH(110)
- .byte BAUD_LOW(110)
- ;; baud[1]: 300
- .byte BAUD_HIGH(300)
- .byte BAUD_LOW(300)
- ;; baud[2]: 1200
- .byte BAUD_HIGH(1200)
- .byte BAUD_LOW(1200)
- ;; baud[3]: 2400
- .byte BAUD_HIGH(2400)
- .byte BAUD_LOW(2400)
- ;; baud[4]: 4800
- .byte BAUD_HIGH(4800)
- .byte BAUD_LOW(4800)
- ;; baud[5]: 9600
- .byte BAUD_HIGH(9600)
- .byte BAUD_LOW(9600)
- ;; baud[6]: 19200
- .byte BAUD_HIGH(19200)
- .byte BAUD_LOW(19200)
- ;; baud[7]: 38400
- .byte BAUD_HIGH(38400)
- .byte BAUD_LOW(38400)
- ;; baud[8]: 57600
- .byte BAUD_HIGH(57600)
- .byte BAUD_LOW(57600)
- ;; baud[9]: 115200
- .byte BAUD_HIGH(115200)
- .byte BAUD_LOW(115200)
-
-desc_device:
- .byte 0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40
- .byte 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab, 1, 2, 3, 0x01
-;;; The "real" device id, which must match the host driver, is that
-;;; "0xcd 0x06 0x04 0x01" sequence, which is 0x06cd, 0x0104
-
-desc_config1:
- .byte 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32
- .byte 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00
- .byte 0x07, 0x05, 0x82, 0x03, 0x40, 0x00, 0x01
- .byte 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00
-
-desc_strings:
- .word string_langids, string_mfg, string_product, string_serial
-desc_strings_end:
-
-string_langids: .byte string_langids_end-string_langids
- .byte 3
- .word 0
-string_langids_end:
-
- ;; sigh. These strings are Unicode, meaning UTF16? 2 bytes each. Now
- ;; *that* is a pain in the ass to encode. And they are little-endian
- ;; too. Use this perl snippet to get the bytecodes:
- /* while (<>) {
- @c = split(//);
- foreach $c (@c) {
- printf("0x%02x, 0x00, ", ord($c));
- }
- }
- */
-
-string_mfg: .byte string_mfg_end-string_mfg
- .byte 3
-; .byte "ACME usb widgets"
- .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x73, 0x00
-string_mfg_end:
-
-string_product: .byte string_product_end-string_product
- .byte 3
-; .byte "ACME USB serial widget"
- .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00
-string_product_end:
-
-string_serial: .byte string_serial_end-string_serial
- .byte 3
-; .byte "47"
- .byte 0x34, 0x00, 0x37, 0x00
-string_serial_end:
-
-;;; ring buffer memory
- ;; tx_ring_in+1 is where the next input byte will go
- ;; [tx_ring_out] has been sent
- ;; if tx_ring_in == tx_ring_out, theres no work to do
- ;; there are (tx_ring_in - tx_ring_out) chars to be written
- ;; dont let _in lap _out
- ;; cannot inc if tx_ring_in+1 == tx_ring_out
- ;; write [tx_ring_in+1] then tx_ring_in++
- ;; if (tx_ring_in+1 == tx_ring_out), overflow
- ;; else tx_ring_in++
- ;; read/send [tx_ring_out+1], then tx_ring_out++
-
- ;; rx_ring_in works the same way
-
- .org 0x1000
-tx_ring:
- .skip 0x100 ; 256 bytes
-rx_ring:
- .skip 0x100 ; 256 bytes
-
-
- .END
-
diff --git a/firmware/keyspan_pda/xircom_pgs.HEX b/firmware/keyspan_pda/xircom_pgs.HEX
deleted file mode 100644
index e9b00d70282f..000000000000
--- a/firmware/keyspan_pda/xircom_pgs.HEX
+++ /dev/null
@@ -1,87 +0,0 @@
-:03000000020200F9
-:0400230002059B0037
-:050030000000000000CB
-:0400430002010000B6
-:100100000202BA000200000002000000020000002B
-:1001100002000000020000000200000002000000D7
-:100120000200000002000000020485000204B90081
-:1002000075815EE4F532F533F530F531F534C20031
-:10021000C201A90074FE901000F0A3D9FC74FD90F7
-:100220001100F0A3D9FC907F9474BFF0907F957477
-:10023000EFF07410907F9EF07400907F98F07440FF
-:10024000907F9DF07400907F97F07482907F9EF075
-:10025000907F957403F0907FAFE0D2E0F07401904E
-:100260007FABF0907FAEF0907FAC7404F0907FADE8
-:100270007404F0907FC9F07407907FAFF074209001
-:100280007F9CF07480907F98F07453F59875C83017
-:100290007B059144D2CA759850D2E8D2AFD2AC74E3
-:1002A00000F586907FD67402F0792E7A007B00DB11
-:1002B000FEDAFAD9F67406F080FEC086C082C083EA
-:1002C000C084C085C0E0E591C2E4F591907FAB7435
-:1002D00001F0907FE8E0F9A3E0FAA3E0FBA3E0FCE3
-:1002E000E95460B4000302035DB4406EBA000B121F
-:1002F0000444400302042602042EBA010302042E21
-:10030000BA020302042EBA0303020468BA041EBB35
-:10031000000A907F95E04402F0020426907F98E066
-:1003200054FDF0907F95E054FDF0020426BA0503D9
-:1003300002042EBA0619BB0008E533D39532020435
-:1003400002BB0108E532C3953302040202042EBA4F
-:1003500007058B3402042602042E02042EBA002064
-:10036000B98010907F00E4F0A3F0907FB57402F0A4
-:10037000020426B9820280EBB9810280E602042ED3
-:10038000BA010FBB000302042EBB010302042602C4
-:10039000042EBA030FBB000302042EBB01030204A8
-:1003A0002602042EBA0656BC010F907FD47406F0C4
-:1003B000907FD5745AF0020426BC0212BB006F90E5
-:1003C0007FD47406F0907FD5746CF0020426BC03D1
-:1003D000297404C39B40576055EB2B90068C2582F3
-:1003E000F58274003583F583E0F9A3E0FA907FD4B9
-:1003F000E9F0907FD5EAF002042602042EBA080F35
-:100400007401907F00F07401907FB5F0020426BA69
-:100410000903020426BA0A057400020402BA0B0397
-:1004200002042602042E907FB47402F08009907FAB
-:10043000B4E04401F08000D0E0D085D084D083D0F7
-:1004400082D08632EB20E71EC3940A5019EB232496
-:1004500046F58274063400F583E0F5CBF5CDA3E0D4
-:10046000F5CAF5CCC322D322B94111EB64FF548005
-:10047000FB907F98E0547F4BF0020426907F9BE036
-:1004800064FF020402C086C082C083C084C085C0ED
-:10049000E0E591C2E4F591907FA97404F074209096
-:1004A0007F9CF01205DC7420907F9CF0D0E0D0851A
-:1004B000D084D083D082D08632C086C082C083C030
-:1004C00084C085C0E07410907F9CF0E591C2E4F593
-:1004D00091907FAA7404F0907FC9E0F9E4F58690CA
-:1004E0007DC0758510853284E005860584F0E5843D
-:1004F000B53302800905320586A3D9EC8000907FD0
-:10050000C9F0B16D7420907F9CF0D0E0D085D0848C
-:10051000D083D082D08632E4F586907FBCE020E1A3
-:100520004B907D00E532F0A3E533F0A3E530F0A376
-:10053000E531F0A3E430000104F0A305869010003B
-:100540007910E0A30586F0A30586D9F6058674FC2C
-:10055000F0A305869011007910E0A30586F0A305AD
-:1005600086D9F6E4F586907FBD7426F0222000132C
-:10057000E532B53301220533758310853382E0F50A
-:1005800099D2007400B5340122E533D39532C39576
-:100590003440F5753400D2010205DCC086C082C04B
-:1005A00083C084C085C0E0309907C299C20012059B
-:1005B000703098051205C6C298D0E0D085D084D09E
-:1005C00083D082D086327583118530820582E59989
-:1005D000F0E582B53101220530B1DC227410907F44
-:1005E0009CF0907FB8E020E13E20013CE530B53141
-:1005F0000122E4F5867583110586907E00F0A3053F
-:10060000867901E530B5310280100531853182E00F
-:100610000586F0A3058609B940E97410907F9CF027
-:10062000907FB9E96001F022C201E4F586907E0076
-:100630007401F0A37402F0907FB9F022C299F59989
-:100640003099FDC29922E55EF63CFD8FFEC8FF643D
-:10065000FFB2FFD9FFEDFFF3FFFA12010001FFFF28
-:10066000FF40CD06040189AB01020301090220000D
-:1006700001010080320904000002FFFFFF000705AE
-:10068000820340000107050202400000069406981C
-:1006900006BA06E8040300002203410043004D00AF
-:1006A000450020007500730062002000770069009B
-:1006B000640067006500740073002E03410043006E
-:1006C0004D004500200055005300420020007300FB
-:1006D00065007200690061006C002000770069000D
-:0E06E0006400670065007400060334003700F4
-:00000001FF
diff --git a/firmware/keyspan_pda/xircom_pgs.S b/firmware/keyspan_pda/xircom_pgs.S
deleted file mode 100644
index 0b79bbf0ae15..000000000000
--- a/firmware/keyspan_pda/xircom_pgs.S
+++ /dev/null
@@ -1,1192 +0,0 @@
-/* $Id: loop.s,v 1.23 2000/03/20 09:49:06 warner Exp $
- *
- * Firmware for the Keyspan PDA Serial Adapter, a USB serial port based on
- * the EzUSB microcontroller.
- *
- * (C) Copyright 2000 Brian Warner <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * "Keyspan PDA Serial Adapter" is probably a copyright of Keyspan, the
- * company.
- *
- * This serial adapter is basically an EzUSB chip and an RS-232 line driver
- * in a little widget that has a DB-9 on one end and a USB plug on the other.
- * It uses the EzUSB's internal UART0 (using the pins from Port C) and timer2
- * as a baud-rate generator. The wiring is:
- * PC0/RxD0 <- rxd (DB9 pin 2) PC4 <- dsr pin 6
- * PC1/TxD0 -> txd pin 3 PC5 <- ri pin 9
- * PC2 -> rts pin 7 PC6 <- dcd pin 1
- * PC3 <- cts pin 8 PC7 -> dtr pin 4
- * PB1 -> line driver standby
- *
- * The EzUSB register constants below come from their excellent documentation
- * and sample code (which used to be available at www.anchorchips.com, but
- * that has now been absorbed into Cypress' site and the CD-ROM contents
- * don't appear to be available online anymore). If we get multiple
- * EzUSB-based drivers into the kernel, it might be useful to pull them out
- * into a separate .h file.
- *
- * THEORY OF OPERATION:
- *
- * There are two 256-byte ring buffers, one for tx, one for rx.
- *
- * EP2out is pure tx data. When it appears, the data is copied into the tx
- * ring and serial transmission is started if it wasn't already running. The
- * "tx buffer empty" interrupt may kick off another character if the ring
- * still has data. If the host is tx-blocked because the ring filled up,
- * it will request a "tx unthrottle" interrupt. If sending a serial character
- * empties the ring below the desired threshold, we set a bit that will send
- * up the tx unthrottle message as soon as the rx buffer becomes free.
- *
- * EP2in (interrupt) is used to send both rx chars and rx status messages
- * (only "tx unthrottle" at this time) back up to the host. The first byte
- * of the rx message indicates data (0) or status msg (1). Status messages
- * are sent before any data.
- *
- * Incoming serial characters are put into the rx ring by the serial
- * interrupt, and the EP2in buffer sent if it wasn't already in transit.
- * When the EP2in buffer returns, the interrupt prompts us to send more
- * rx chars (or status messages) if they are pending.
- *
- * Device control happens through "vendor specific" control messages on EP0.
- * All messages are destined for the "Interface" (with the index always 0,
- * so that if their two-port device might someday use similar firmware, we
- * can use index=1 to refer to the second port). The messages defined are:
- *
- * bRequest = 0 : set baud/bits/parity
- * 1 : unused
- * 2 : reserved for setting HW flow control (CTSRTS)
- * 3 : get/set "modem info" (pin states: DTR, RTS, DCD, RI, etc)
- * 4 : set break (on/off)
- * 5 : reserved for requesting interrupts on pin state change
- * 6 : query buffer room or chars in tx buffer
- * 7 : request tx unthrottle interrupt
- *
- * The host-side driver is set to recognize the device ID values stashed in
- * serial EEPROM (0x06cd, 0x0103), program this firmware into place, then
- * start it running. This firmware will use EzUSB's "renumeration" trick by
- * simulating a bus disconnect, then reconnect with a different device ID
- * (encoded in the desc_device descriptor below). The host driver then
- * recognizes the new device ID and glues it to the real serial driver code.
- *
- * USEFUL DOCS:
- * EzUSB Technical Reference Manual: <http://www.cypress.com/>
- * 8051 manuals: everywhere, but try www.dalsemi.com because the EzUSB is
- * basically the Dallas enhanced 8051 code. Remember that the EzUSB IO ports
- * use totally different registers!
- * USB 1.1 spec: www.usb.org
- *
- * HOW TO BUILD:
- * gcc -x assembler-with-cpp -P -E -o keyspan_pda.asm keyspan_pda.s
- * as31 -l keyspan_pda.asm
- * mv keyspan_pda.obj keyspan_pda.hex
- * perl ezusb_convert.pl keyspan_pda < keyspan_pda.hex > keyspan_pda_fw.h
- * Get as31 from <http://www.pjrc.com/tech/8051/index.html>, and hack on it
- * a bit to make it build.
- *
- * THANKS:
- * Greg Kroah-Hartman, for coordinating the whole usb-serial thing.
- * AnchorChips, for making such an incredibly useful little microcontroller.
- * KeySpan, for making a handy, cheap ($40) widget that was so easy to take
- * apart and trace with an ohmmeter.
- *
- * TODO:
- * lots. grep for TODO. Interrupt safety needs stress-testing. Better flow
- * control. Interrupting host upon change in DCD, etc, counting transitions.
- * Need to find a safe device id to use (the one used by the Keyspan firmware
- * under Windows would be ideal.. can anyone figure out what it is?). Parity.
- * More baud rates. Oh, and the string-descriptor-length silicon bug
- * workaround should be implemented, but I'm lazy, and the consequence is
- * that the device name strings that show up in your kernel log will have
- * lots of trailing binary garbage in them (appears as ????). Device strings
- * should be made more accurate.
- *
- * Questions, bugs, patches to Brian.
- *
- * -Brian Warner <[email protected]>
- *
- */
-
-#define HIGH(x) (((x) & 0xff00) / 256)
-#define LOW(x) ((x) & 0xff)
-
-#define dpl1 0x84
-#define dph1 0x85
-#define dps 0x86
-
-;;; our bit assignments
-#define TX_RUNNING 0
-#define DO_TX_UNTHROTTLE 1
-
- ;; stack from 0x60 to 0x7f: should really set SP to 0x60-1, not 0x60
-#define STACK #0x60-1
-
-#define EXIF 0x91
-#define EIE 0xe8
- .flag EUSB, EIE.0
- .flag ES0, IE.4
-
-#define EP0CS #0x7fb4
-#define EP0STALLbit #0x01
-#define IN0BUF #0x7f00
-#define IN0BC #0x7fb5
-#define OUT0BUF #0x7ec0
-#define OUT0BC #0x7fc5
-#define IN2BUF #0x7e00
-#define IN2BC #0x7fb9
-#define IN2CS #0x7fb8
-#define OUT2BC #0x7fc9
-#define OUT2CS #0x7fc8
-#define OUT2BUF #0x7dc0
-#define IN4BUF #0x7d00
-#define IN4BC #0x7fbd
-#define IN4CS #0x7fbc
-#define OEB #0x7f9d
-#define OUTB #0x7f97
-#define OEC #0x7f9e
-#define OUTC #0x7f98
-#define PINSC #0x7f9b
-#define PORTBCFG #0x7f94
-#define PORTCCFG #0x7f95
-#define OEA #0x7f9c
-#define IN07IRQ #0x7fa9
-#define OUT07IRQ #0x7faa
-#define IN07IEN #0x7fac
-#define OUT07IEN #0x7fad
-#define USBIRQ #0x7fab
-#define USBIEN #0x7fae
-#define USBBAV #0x7faf
-#define USBCS #0x7fd6
-#define SUDPTRH #0x7fd4
-#define SUDPTRL #0x7fd5
-#define SETUPDAT #0x7fe8
-
- ;; usb interrupt : enable is EIE.0 (0xe8), flag is EXIF.4 (0x91)
-
- .org 0
- ljmp start
- ;; interrupt vectors
- .org 23H
- ljmp serial_int
- .byte 0
-
- .org 43H
- ljmp USB_Jump_Table
- .byte 0 ; filled in by the USB core
-
-;;; local variables. These are not initialized properly: do it by hand.
- .org 30H
-rx_ring_in: .byte 0
-rx_ring_out: .byte 0
-tx_ring_in: .byte 0
-tx_ring_out: .byte 0
-tx_unthrottle_threshold: .byte 0
-
- .org 0x100H ; wants to be on a page boundary
-USB_Jump_Table:
- ljmp ISR_Sudav ; Setup Data Available
- .byte 0
- ljmp 0 ; Start of Frame
- .byte 0
- ljmp 0 ; Setup Data Loading
- .byte 0
- ljmp 0 ; Global Suspend
- .byte 0
- ljmp 0 ; USB Reset
- .byte 0
- ljmp 0 ; Reserved
- .byte 0
- ljmp 0 ; End Point 0 In
- .byte 0
- ljmp 0 ; End Point 0 Out
- .byte 0
- ljmp 0 ; End Point 1 In
- .byte 0
- ljmp 0 ; End Point 1 Out
- .byte 0
- ljmp ISR_Ep2in
- .byte 0
- ljmp ISR_Ep2out
- .byte 0
-
-
- .org 0x200
-
-start: mov SP,STACK-1 ; set stack
- ;; clear local variables
- clr a
- mov tx_ring_in, a
- mov tx_ring_out, a
- mov rx_ring_in, a
- mov rx_ring_out, a
- mov tx_unthrottle_threshold, a
- clr TX_RUNNING
- clr DO_TX_UNTHROTTLE
-
- ;; clear fifo with "fe"
- mov r1, 0
- mov a, #0xfe
- mov dptr, #tx_ring
-clear_tx_ring_loop:
- movx @dptr, a
- inc dptr
- djnz r1, clear_tx_ring_loop
-
- mov a, #0xfd
- mov dptr, #rx_ring
-clear_rx_ring_loop:
- movx @dptr, a
- inc dptr
- djnz r1, clear_rx_ring_loop
-
-;;; turn on the RS-232 driver chip (bring the STANDBY pin low)
-;;; on Xircom the STANDBY is wired to PB6 and PC4
- mov dptr, PORTBCFG
- mov a, #0xBf
- movx @dptr, a
- mov dptr, PORTCCFG
- mov a, #0xef
- movx @dptr, a
-
- ;; set OEC.4
- mov a, #0x10
- mov dptr,OEC
- movx @dptr,a
-
- ;; clear PC4
- mov a, #0x00
- mov dptr,OUTC
- movx @dptr,a
-
- ;; set OEB.6
- mov a, #0x40
- mov dptr,OEB
- movx @dptr,a
-
- ;; clear PB6
- mov a, #0x00
- mov dptr,OUTB
- movx @dptr,a
-
- ;; set OEC.[17]
- mov a, #0x82
- mov dptr,OEC
- movx @dptr,a
-
-
- ;; set PORTCCFG.[01] to route TxD0,RxD0 to serial port
- mov dptr, PORTCCFG
- mov a, #0x03
- movx @dptr, a
-
- ;; set up interrupts, autovectoring
- ;; set BKPT
- mov dptr, USBBAV
- movx a,@dptr
- setb acc.0 ; AVEN bit to 0
- movx @dptr, a
-
- mov a,#0x01 ; enable SUDAV: setup data available (for ep0)
- mov dptr, USBIRQ
- movx @dptr, a ; clear SUDAVI
- mov dptr, USBIEN
- movx @dptr, a
-
- mov dptr, IN07IEN
- mov a,#0x04 ; enable IN2 int
- movx @dptr, a
-
- mov dptr, OUT07IEN
- mov a,#0x04 ; enable OUT2 int
- movx @dptr, a
- mov dptr, OUT2BC
- movx @dptr, a ; arm OUT2
-
-;; mov a, #0x84 ; turn on RTS, DTR
-;; mov dptr,OUTC
-;; movx @dptr, a
-
- mov a, #0x7 ; turn on DTR
- mov dptr,USBBAV
- movx @dptr, a
-
- mov a, #0x20 ; turn on the RED led
- mov dptr,OEA
- movx @dptr, a
-
- mov a, #0x80 ; turn on RTS
- mov dptr,OUTC
- movx @dptr, a
-
- ;; setup the serial port. 9600 8N1.
- mov a,#0x53 ; mode 1, enable rx, clear int
- mov SCON, a
- ;; using timer2, in 16-bit baud-rate-generator mode
- ;; (xtal 12MHz, internal fosc 24MHz)
- ;; RCAP2H,RCAP2L = 65536 - fosc/(32*baud)
- ;; 57600: 0xFFF2.F, say 0xFFF3
- ;; 9600: 0xFFB1.E, say 0xFFB2
- ;; 300: 0xF63C
-#define BAUD 9600
-#define BAUD_TIMEOUT(rate) (65536 - (24 * 1000 * 1000) / (32 * rate))
-#define BAUD_HIGH(rate) HIGH(BAUD_TIMEOUT(rate))
-#define BAUD_LOW(rate) LOW(BAUD_TIMEOUT(rate))
-
- mov T2CON, #030h ; rclk=1,tclk=1,cp=0,tr2=0(enable later)
- mov r3, #5
- acall set_baud
- setb TR2
- mov SCON, #050h
-
-#if 0
- mov r1, #0x40
- mov a, #0x41
-send:
- mov SBUF, a
- inc a
- anl a, #0x3F
- orl a, #0x40
-; xrl a, #0x02
-wait1:
- jnb TI, wait1
- clr TI
- djnz r1, send
-;done: sjmp done
-
-#endif
-
- setb EUSB
- setb EA
- setb ES0
- ;acall dump_stat
-
- ;; hey, what say we RENUMERATE! (TRM p.62)
- mov a, #0
- mov dps, a
- mov dptr, USBCS
- mov a, #0x02 ; DISCON=0, DISCOE=0, RENUM=1
- movx @dptr, a
- ;; now presence pin is floating, simulating disconnect. wait 0.5s
- mov r1, #46
-renum_wait1:
- mov r2, #0
-renum_wait2:
- mov r3, #0
-renum_wait3:
- djnz r3, renum_wait3
- djnz r2, renum_wait2
- djnz r1, renum_wait1 ; wait about n*(256^2) 6MHz clocks
- mov a, #0x06 ; DISCON=0, DISCOE=1, RENUM=1
- movx @dptr, a
- ;; we are back online. the host device will now re-query us
-
-
-main: sjmp main
-
-
-
-ISR_Sudav:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, USBIRQ ; clear USB int
- mov a,#01h
- movx @dptr,a
-
- ;; get request type
- mov dptr, SETUPDAT
- movx a, @dptr
- mov r1, a ; r1 = bmRequestType
- inc dptr
- movx a, @dptr
- mov r2, a ; r2 = bRequest
- inc dptr
- movx a, @dptr
- mov r3, a ; r3 = wValueL
- inc dptr
- movx a, @dptr
- mov r4, a ; r4 = wValueH
-
- ;; main switch on bmRequest.type: standard or vendor
- mov a, r1
- anl a, #0x60
- cjne a, #0x00, setup_bmreq_type_not_standard
- ;; standard request: now main switch is on bRequest
- ljmp setup_bmreq_is_standard
-
-setup_bmreq_type_not_standard:
- ;; a still has bmreq&0x60
- cjne a, #0x40, setup_bmreq_type_not_vendor
- ;; Anchor reserves bRequest 0xa0-0xaf, we use small ones
- ;; switch on bRequest. bmRequest will always be 0x41 or 0xc1
- cjne r2, #0x00, setup_ctrl_not_00
- ;; 00 is set baud, wValue[0] has baud rate index
- lcall set_baud ; index in r3, carry set if error
- jc setup_bmreq_type_not_standard__do_stall
- ljmp setup_done_ack
-setup_bmreq_type_not_standard__do_stall:
- ljmp setup_stall
-setup_ctrl_not_00:
- cjne r2, #0x01, setup_ctrl_not_01
- ;; 01 is reserved for set bits (parity). TODO
- ljmp setup_stall
-setup_ctrl_not_01:
- cjne r2, #0x02, setup_ctrl_not_02
- ;; 02 is set HW flow control. TODO
- ljmp setup_stall
-setup_ctrl_not_02:
- cjne r2, #0x03, setup_ctrl_not_03
- ;; 03 is control pins (RTS, DTR).
- ljmp control_pins ; will jump to setup_done_ack,
- ; or setup_return_one_byte
-setup_ctrl_not_03:
- cjne r2, #0x04, setup_ctrl_not_04
- ;; 04 is send break (really "turn break on/off"). TODO
- cjne r3, #0x00, setup_ctrl_do_break_on
- ;; do break off: restore PORTCCFG.1 to reconnect TxD0 to serial port
- mov dptr, PORTCCFG
- movx a, @dptr
- orl a, #0x02
- movx @dptr, a
- ljmp setup_done_ack
-setup_ctrl_do_break_on:
- ;; do break on: clear PORTCCFG.0, set TxD high(?) (b1 low)
- mov dptr, OUTC
- movx a, @dptr
- anl a, #0xfd ; ~0x02
- movx @dptr, a
- mov dptr, PORTCCFG
- movx a, @dptr
- anl a, #0xfd ; ~0x02
- movx @dptr, a
- ljmp setup_done_ack
-setup_ctrl_not_04:
- cjne r2, #0x05, setup_ctrl_not_05
- ;; 05 is set desired interrupt bitmap. TODO
- ljmp setup_stall
-setup_ctrl_not_05:
- cjne r2, #0x06, setup_ctrl_not_06
- ;; 06 is query room
- cjne r3, #0x00, setup_ctrl_06_not_00
- ;; 06, wValue[0]=0 is query write_room
- mov a, tx_ring_out
- setb c
- subb a, tx_ring_in ; out-1-in = 255 - (in-out)
- ljmp setup_return_one_byte
-setup_ctrl_06_not_00:
- cjne r3, #0x01, setup_ctrl_06_not_01
- ;; 06, wValue[0]=1 is query chars_in_buffer
- mov a, tx_ring_in
- clr c
- subb a, tx_ring_out ; in-out
- ljmp setup_return_one_byte
-setup_ctrl_06_not_01:
- ljmp setup_stall
-setup_ctrl_not_06:
- cjne r2, #0x07, setup_ctrl_not_07
- ;; 07 is request tx unthrottle interrupt
- mov tx_unthrottle_threshold, r3; wValue[0] is threshold value
- ljmp setup_done_ack
-setup_ctrl_not_07:
- ljmp setup_stall
-
-setup_bmreq_type_not_vendor:
- ljmp setup_stall
-
-
-setup_bmreq_is_standard:
- cjne r2, #0x00, setup_breq_not_00
- ;; 00: Get_Status (sub-switch on bmRequestType: device, ep, int)
- cjne r1, #0x80, setup_Get_Status_not_device
- ;; Get_Status(device)
- ;; are we self-powered? no. can we do remote wakeup? no
- ;; so return two zero bytes. This is reusable
-setup_return_two_zero_bytes:
- mov dptr, IN0BUF
- clr a
- movx @dptr, a
- inc dptr
- movx @dptr, a
- mov dptr, IN0BC
- mov a, #2
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Status_not_device:
- cjne r1, #0x82, setup_Get_Status_not_endpoint
- ;; Get_Status(endpoint)
- ;; must get stall bit for ep[wIndexL], return two bytes, bit in lsb 0
- ;; for now: cheat. TODO
- sjmp setup_return_two_zero_bytes
-setup_Get_Status_not_endpoint:
- cjne r1, #0x81, setup_Get_Status_not_interface
- ;; Get_Status(interface): return two zeros
- sjmp setup_return_two_zero_bytes
-setup_Get_Status_not_interface:
- ljmp setup_stall
-
-setup_breq_not_00:
- cjne r2, #0x01, setup_breq_not_01
- ;; 01: Clear_Feature (sub-switch on wValueL: stall, remote wakeup)
- cjne r3, #0x00, setup_Clear_Feature_not_stall
- ;; Clear_Feature(stall). should clear a stall bit. TODO
- ljmp setup_stall
-setup_Clear_Feature_not_stall:
- cjne r3, #0x01, setup_Clear_Feature_not_rwake
- ;; Clear_Feature(remote wakeup). ignored.
- ljmp setup_done_ack
-setup_Clear_Feature_not_rwake:
- ljmp setup_stall
-
-setup_breq_not_01:
- cjne r2, #0x03, setup_breq_not_03
- ;; 03: Set_Feature (sub-switch on wValueL: stall, remote wakeup)
- cjne r3, #0x00, setup_Set_Feature_not_stall
- ;; Set_Feature(stall). Should set a stall bit. TODO
- ljmp setup_stall
-setup_Set_Feature_not_stall:
- cjne r3, #0x01, setup_Set_Feature_not_rwake
- ;; Set_Feature(remote wakeup). ignored.
- ljmp setup_done_ack
-setup_Set_Feature_not_rwake:
- ljmp setup_stall
-
-setup_breq_not_03:
- cjne r2, #0x06, setup_breq_not_06
- ;; 06: Get_Descriptor (s-switch on wValueH: dev, config[n], string[n])
- cjne r4, #0x01, setup_Get_Descriptor_not_device
- ;; Get_Descriptor(device)
- mov dptr, SUDPTRH
- mov a, #HIGH(desc_device)
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, #LOW(desc_device)
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Descriptor_not_device:
- cjne r4, #0x02, setup_Get_Descriptor_not_config
- ;; Get_Descriptor(config[n])
- cjne r3, #0x00, setup_stall; only handle n==0
- ;; Get_Descriptor(config[0])
- mov dptr, SUDPTRH
- mov a, #HIGH(desc_config1)
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, #LOW(desc_config1)
- movx @dptr, a
- ljmp setup_done_ack
-setup_Get_Descriptor_not_config:
- cjne r4, #0x03, setup_Get_Descriptor_not_string
- ;; Get_Descriptor(string[wValueL])
- ;; if (wValueL >= maxstrings) stall
- mov a, #((desc_strings_end-desc_strings)/2)
- clr c
- subb a,r3 ; a=4, r3 = 0..3 . if a<=0 then stall
- jc setup_stall
- jz setup_stall
- mov a, r3
- add a, r3 ; a = 2*wValueL
- mov dptr, #desc_strings
- add a, dpl
- mov dpl, a
- mov a, #0
- addc a, dph
- mov dph, a ; dph = desc_strings[a]. big endian! (handy)
- ;; it looks like my adapter uses a revision of the EZUSB that
- ;; contains "rev D errata number 8", as hinted in the EzUSB example
- ;; code. I cannot find an actual errata description on the Cypress
- ;; web site, but from the example code it looks like this bug causes
- ;; the length of string descriptors to be read incorrectly, possibly
- ;; sending back more characters than the descriptor has. The workaround
- ;; is to manually send out all of the data. The consequence of not
- ;; using the workaround is that the strings gathered by the kernel
- ;; driver are too long and are filled with trailing garbage (including
- ;; leftover strings). Writing this out by hand is a nuisance, so for
- ;; now I will just live with the bug.
- movx a, @dptr
- mov r1, a
- inc dptr
- movx a, @dptr
- mov r2, a
- mov dptr, SUDPTRH
- mov a, r1
- movx @dptr, a
- mov dptr, SUDPTRL
- mov a, r2
- movx @dptr, a
- ;; done
- ljmp setup_done_ack
-
-setup_Get_Descriptor_not_string:
- ljmp setup_stall
-
-setup_breq_not_06:
- cjne r2, #0x08, setup_breq_not_08
- ;; Get_Configuration. always 1. return one byte.
- ;; this is reusable
- mov a, #1
-setup_return_one_byte:
- mov dptr, IN0BUF
- movx @dptr, a
- mov a, #1
- mov dptr, IN0BC
- movx @dptr, a
- ljmp setup_done_ack
-setup_breq_not_08:
- cjne r2, #0x09, setup_breq_not_09
- ;; 09: Set_Configuration. ignored.
- ljmp setup_done_ack
-setup_breq_not_09:
- cjne r2, #0x0a, setup_breq_not_0a
- ;; 0a: Get_Interface. get the current altsetting for int[wIndexL]
- ;; since we only have one interface, ignore wIndexL, return a 0
- mov a, #0
- ljmp setup_return_one_byte
-setup_breq_not_0a:
- cjne r2, #0x0b, setup_breq_not_0b
- ;; 0b: Set_Interface. set altsetting for interface[wIndexL]. ignored
- ljmp setup_done_ack
-setup_breq_not_0b:
- ljmp setup_stall
-
-
-setup_done_ack:
- ;; now clear HSNAK
- mov dptr, EP0CS
- mov a, #0x02
- movx @dptr, a
- sjmp setup_done
-setup_stall:
- ;; unhandled. STALL
- ;EP0CS |= bmEPSTALL
- mov dptr, EP0CS
- movx a, @dptr
- orl a, EP0STALLbit
- movx @dptr, a
- sjmp setup_done
-
-setup_done:
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-;;; ==============================================================
-
-set_baud: ; baud index in r3
- ;; verify a < 10
- mov a, r3
- jb ACC.7, set_baud__badbaud
- clr c
- subb a, #10
- jnc set_baud__badbaud
- mov a, r3
- rl a ; a = index*2
- add a, #LOW(baud_table)
- mov dpl, a
- mov a, #HIGH(baud_table)
- addc a, #0
- mov dph, a
- ;; TODO: shut down xmit/receive
- ;; TODO: wait for current xmit char to leave
- ;; TODO: shut down timer to avoid partial-char glitch
- movx a,@dptr ; BAUD_HIGH
- mov RCAP2H, a
- mov TH2, a
- inc dptr
- movx a,@dptr ; BAUD_LOW
- mov RCAP2L, a
- mov TL2, a
- ;; TODO: restart xmit/receive
- ;; TODO: reenable interrupts, resume tx if pending
- clr c ; c=0: success
- ret
-set_baud__badbaud:
- setb c ; c=1: failure
- ret
-
-;;; ==================================================
-control_pins:
- cjne r1, #0x41, control_pins_in
-control_pins_out:
- ;TODO BKPT is DTR
- mov a, r3 ; wValue[0] holds new bits: b7 is new RTS
- xrl a, #0xff ; 1 means active, 0V, +12V ?
- anl a, #0x80
- mov r3, a
- mov dptr, OUTC
- movx a, @dptr ; only change bit 7
- anl a, #0x7F ; ~0x84
- orl a, r3
- movx @dptr, a ; other pins are inputs, bits ignored
- ljmp setup_done_ack
-control_pins_in:
- mov dptr, PINSC
- movx a, @dptr
- xrl a, #0xff
- ljmp setup_return_one_byte
-
-;;; ========================================
-
-ISR_Ep2in:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, IN07IRQ ; clear USB int
- mov a,#04h
- movx @dptr,a
-
- mov a, #0x20 ; Turn off the green LED
- mov dptr,OEA
- movx @dptr, a
-
-
- ;; do stuff
- lcall start_in
-
- mov a, #0x20 ; Turn off the green LED
- mov dptr,OEA
- movx @dptr, a
-
-
-
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-ISR_Ep2out:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
-
- mov a, #0x10 ; Turn the green LED
- mov dptr,OEA
- movx @dptr, a
-
-
-
- mov a,EXIF
- clr acc.4
- mov EXIF,a ; clear INT2 first
- mov dptr, OUT07IRQ ; clear USB int
- mov a,#04h
- movx @dptr,a
-
- ;; do stuff
-
- ;; copy data into buffer. for now, assume we will have enough space
- mov dptr, OUT2BC ; get byte count
- movx a,@dptr
- mov r1, a
- clr a
- mov dps, a
- mov dptr, OUT2BUF ; load DPTR0 with source
- mov dph1, #HIGH(tx_ring) ; load DPTR1 with target
- mov dpl1, tx_ring_in
-OUT_loop:
- movx a,@dptr ; read
- inc dps ; switch to DPTR1: target
- inc dpl1 ; target = tx_ring_in+1
- movx @dptr,a ; store
- mov a,dpl1
- cjne a, tx_ring_out, OUT_no_overflow
- sjmp OUT_overflow
-OUT_no_overflow:
- inc tx_ring_in ; tx_ring_in++
- inc dps ; switch to DPTR0: source
- inc dptr
- djnz r1, OUT_loop
- sjmp OUT_done
-OUT_overflow:
- ;; signal overflow
- ;; fall through
-OUT_done:
- ;; ack
- mov dptr,OUT2BC
- movx @dptr,a
-
- ;; start tx
- acall maybe_start_tx
- ;acall dump_stat
-
- mov a, #0x20 ; Turn off the green LED
- mov dptr,OEA
- movx @dptr, a
-
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-dump_stat:
- ;; fill in EP4in with a debugging message:
- ;; tx_ring_in, tx_ring_out, rx_ring_in, rx_ring_out
- ;; tx_active
- ;; tx_ring[0..15]
- ;; 0xfc
- ;; rx_ring[0..15]
- clr a
- mov dps, a
-
- mov dptr, IN4CS
- movx a, @dptr
- jb acc.1, dump_stat__done; busy: cannot dump, old one still pending
- mov dptr, IN4BUF
-
- mov a, tx_ring_in
- movx @dptr, a
- inc dptr
- mov a, tx_ring_out
- movx @dptr, a
- inc dptr
-
- mov a, rx_ring_in
- movx @dptr, a
- inc dptr
- mov a, rx_ring_out
- movx @dptr, a
- inc dptr
-
- clr a
- jnb TX_RUNNING, dump_stat__no_tx_running
- inc a
-dump_stat__no_tx_running:
- movx @dptr, a
- inc dptr
- ;; tx_ring[0..15]
- inc dps
- mov dptr, #tx_ring ; DPTR1: source
- mov r1, #16
-dump_stat__tx_ring_loop:
- movx a, @dptr
- inc dptr
- inc dps
- movx @dptr, a
- inc dptr
- inc dps
- djnz r1, dump_stat__tx_ring_loop
- inc dps
-
- mov a, #0xfc
- movx @dptr, a
- inc dptr
-
- ;; rx_ring[0..15]
- inc dps
- mov dptr, #rx_ring ; DPTR1: source
- mov r1, #16
-dump_stat__rx_ring_loop:
- movx a, @dptr
- inc dptr
- inc dps
- movx @dptr, a
- inc dptr
- inc dps
- djnz r1, dump_stat__rx_ring_loop
-
- ;; now send it
- clr a
- mov dps, a
- mov dptr, IN4BC
- mov a, #38
- movx @dptr, a
-dump_stat__done:
- ret
-
-;;; ============================================================
-
-maybe_start_tx:
- ;; make sure the tx process is running.
- jb TX_RUNNING, start_tx_done
-start_tx:
- ;; is there work to be done?
- mov a, tx_ring_in
- cjne a,tx_ring_out, start_tx__work
- ret ; no work
-start_tx__work:
- ;; tx was not running. send the first character, setup the TI int
- inc tx_ring_out ; [++tx_ring_out]
- mov dph, #HIGH(tx_ring)
- mov dpl, tx_ring_out
- movx a, @dptr
- mov sbuf, a
- setb TX_RUNNING
-start_tx_done:
- ;; can we unthrottle the host tx process?
- ;; step 1: do we care?
- mov a, #0
- cjne a, tx_unthrottle_threshold, start_tx__maybe_unthrottle_tx
- ;; nope
-start_tx_really_done:
- ret
-start_tx__maybe_unthrottle_tx:
- ;; step 2: is there now room?
- mov a, tx_ring_out
- setb c
- subb a, tx_ring_in
- ;; a is now write_room. If thresh >= a, we can unthrottle
- clr c
- subb a, tx_unthrottle_threshold
- jc start_tx_really_done ; nope
- ;; yes, we can unthrottle. remove the threshold and mark a request
- mov tx_unthrottle_threshold, #0
- setb DO_TX_UNTHROTTLE
- ;; prod rx, which will actually send the message when in2 becomes free
- ljmp start_in
-
-
-serial_int:
- push dps
- push dpl
- push dph
- push dpl1
- push dph1
- push acc
- jnb TI, serial_int__not_tx
- ;; tx finished. send another character if we have one
- clr TI ; clear int
- clr TX_RUNNING
- lcall start_tx
-serial_int__not_tx:
- jnb RI, serial_int__not_rx
- lcall get_rx_char
- clr RI ; clear int
-serial_int__not_rx:
- ;; return
- pop acc
- pop dph1
- pop dpl1
- pop dph
- pop dpl
- pop dps
- reti
-
-get_rx_char:
- mov dph, #HIGH(rx_ring)
- mov dpl, rx_ring_in
- inc dpl ; target = rx_ring_in+1
- mov a, sbuf
- movx @dptr, a
- ;; check for overflow before incrementing rx_ring_in
- mov a, dpl
- cjne a, rx_ring_out, get_rx_char__no_overflow
- ;; signal overflow
- ret
-get_rx_char__no_overflow:
- inc rx_ring_in
- ;; kick off USB INpipe
- acall start_in
- ret
-
-start_in:
- ;; check if the inpipe is already running.
- mov a,#0x10
- mov dptr, OEA
- movx @dptr,a
-
- mov dptr, IN2CS
- movx a, @dptr
- jb acc.1, start_in__done; int will handle it
- jb DO_TX_UNTHROTTLE, start_in__do_tx_unthrottle
- ;; see if there is any work to do. a serial interrupt might occur
- ;; during this sequence?
- mov a, rx_ring_in
- cjne a, rx_ring_out, start_in__have_work
- ret ; nope
-start_in__have_work:
- ;; now copy as much data as possible into the pipe. 63 bytes max.
- clr a
- mov dps, a
- mov dph, #HIGH(rx_ring) ; load DPTR0 with source
- inc dps
- mov dptr, IN2BUF ; load DPTR1 with target
- movx @dptr, a ; in[0] signals that rest of IN is rx data
- inc dptr
- inc dps
- ;; loop until we run out of data, or we have copied 64 bytes
- mov r1, #1 ; INbuf size counter
-start_in__loop:
- mov a, rx_ring_in
- cjne a, rx_ring_out, start_inlocal_irq_enablell_copying
- sjmp start_in__kick
-start_inlocal_irq_enablell_copying:
- inc rx_ring_out
- mov dpl, rx_ring_out
- movx a, @dptr
- inc dps
- movx @dptr, a ; write into IN buffer
- inc dptr
- inc dps
- inc r1
- cjne r1, #64, start_in__loop; loop
-start_in__kick:
- ;; either we ran out of data, or we copied 64 bytes. r1 has byte count
- ;; kick off IN
- mov a, #0x10 ; Turn the green LED
- mov dptr,OEA
- movx @dptr, a
- mov dptr, IN2BC
- mov a, r1
- jz start_in__done
- movx @dptr, a
- ;; done
-start_in__done:
- ;acall dump_stat
- ret
-start_in__do_tx_unthrottle:
- ;; special sequence: send a tx unthrottle message
- clr DO_TX_UNTHROTTLE
- clr a
- mov dps, a
- mov dptr, IN2BUF
- mov a, #1
- movx @dptr, a
- inc dptr
- mov a, #2
- movx @dptr, a
- mov dptr, IN2BC
- movx @dptr, a
- ret
-
-putchar:
- clr TI
- mov SBUF, a
-putchar_wait:
- jnb TI, putchar_wait
- clr TI
- ret
-
-
-baud_table: ; baud_high, then baud_low
- ;; baud[0]: 110
- .byte BAUD_HIGH(110)
- .byte BAUD_LOW(110)
- ;; baud[1]: 300
- .byte BAUD_HIGH(300)
- .byte BAUD_LOW(300)
- ;; baud[2]: 1200
- .byte BAUD_HIGH(1200)
- .byte BAUD_LOW(1200)
- ;; baud[3]: 2400
- .byte BAUD_HIGH(2400)
- .byte BAUD_LOW(2400)
- ;; baud[4]: 4800
- .byte BAUD_HIGH(4800)
- .byte BAUD_LOW(4800)
- ;; baud[5]: 9600
- .byte BAUD_HIGH(9600)
- .byte BAUD_LOW(9600)
- ;; baud[6]: 19200
- .byte BAUD_HIGH(19200)
- .byte BAUD_LOW(19200)
- ;; baud[7]: 38400
- .byte BAUD_HIGH(38400)
- .byte BAUD_LOW(38400)
- ;; baud[8]: 57600
- .byte BAUD_HIGH(57600)
- .byte BAUD_LOW(57600)
- ;; baud[9]: 115200
- .byte BAUD_HIGH(115200)
- .byte BAUD_LOW(115200)
-
-desc_device:
- .byte 0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40
- .byte 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab, 1, 2, 3, 0x01
-;;; The "real" device id, which must match the host driver, is that
-;;; "0xcd 0x06 0x04 0x01" sequence, which is 0x06cd, 0x0104
-
-desc_config1:
- .byte 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32
- .byte 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00
- .byte 0x07, 0x05, 0x82, 0x03, 0x40, 0x00, 0x01
- .byte 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00
-
-desc_strings:
- .word string_langids, string_mfg, string_product, string_serial
-desc_strings_end:
-
-string_langids: .byte string_langids_end-string_langids
- .byte 3
- .word 0
-string_langids_end:
-
- ;; sigh. These strings are Unicode, meaning UTF16? 2 bytes each. Now
- ;; *that* is a pain in the ass to encode. And they are little-endian
- ;; too. Use this perl snippet to get the bytecodes:
- /* while (<>) {
- @c = split(//);
- foreach $c (@c) {
- printf("0x%02x, 0x00, ", ord($c));
- }
- }
- */
-
-string_mfg: .byte string_mfg_end-string_mfg
- .byte 3
-; .byte "ACME usb widgets"
- .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x73, 0x00
-string_mfg_end:
-
-string_product: .byte string_product_end-string_product
- .byte 3
-; .byte "ACME USB serial widget"
- .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00
-string_product_end:
-
-string_serial: .byte string_serial_end-string_serial
- .byte 3
-; .byte "47"
- .byte 0x34, 0x00, 0x37, 0x00
-string_serial_end:
-
-;;; ring buffer memory
- ;; tx_ring_in+1 is where the next input byte will go
- ;; [tx_ring_out] has been sent
- ;; if tx_ring_in == tx_ring_out, theres no work to do
- ;; there are (tx_ring_in - tx_ring_out) chars to be written
- ;; dont let _in lap _out
- ;; cannot inc if tx_ring_in+1 == tx_ring_out
- ;; write [tx_ring_in+1] then tx_ring_in++
- ;; if (tx_ring_in+1 == tx_ring_out), overflow
- ;; else tx_ring_in++
- ;; read/send [tx_ring_out+1], then tx_ring_out++
-
- ;; rx_ring_in works the same way
-
- .org 0x1000
-tx_ring:
- .skip 0x100 ; 256 bytes
-rx_ring:
- .skip 0x100 ; 256 bytes
-
-
- .END
-
diff --git a/firmware/korg/k1212.dsp.ihex b/firmware/korg/k1212.dsp.ihex
deleted file mode 100644
index b151997b380c..000000000000
--- a/firmware/korg/k1212.dsp.ihex
+++ /dev/null
@@ -1,987 +0,0 @@
-:1000000001FF18FFF5FFCFFF00FF00FFFFFF00FF1C
-:1000100000FF00FFFFFF00FF00FF00FFFFFF00FFEA
-:1000200026FF18FFFFFF0FFF00FF00FFFFFF00FF8D
-:1000300000FF00FFFFFF00FF00FF00FFFFFF00FFCA
-:1000400000FF0AFFFFFF1FFF00FF00FFFFFF00FF91
-:1000500000FF00FFFFFF00FF00FF00FFFFFF00FFAA
-:1000600000FF0AFFFFFF1FFF00FF00FFFFFF00FF71
-:1000700000FF00FFFFFF00FF00FF00FFFFFF00FF8A
-:1000800000FF0AFFFFFF1FFF00FF00FFFFFF00FF51
-:1000900000FF00FFFFFF00FF00FF00FFFFFF00FF6A
-:1000A00038FF18FFFFFFDFFF00FF00FFFFFF00FF2B
-:1000B00000FF00FFFFFF00FF00FF00FFFFFF00FF4A
-:1000C00000FF0AFFFFFF1FFF00FF00FFFFFF00FF11
-:1000D00000FF00FFFFFF00FF00FF00FFFFFF00FF2A
-:1000E00003FF3CFFFFFFFCFF67FF40FFFFFFC0FF78
-:1000F000FFFF93FFFFFFE0FF00FF0CFFFFFF0CFF80
-:100100000CFF0CFFFFFF00FF30FF0CFFFFFF00FFA5
-:100110000FFF40FFFFFFF4FF47FF80FFFFFF0AFFD5
-:1001200082FF23FFFFFF0FFF8DFF93FFFFFF7AFF8B
-:100130008DFF83FFFFFF70FF47FF90FFFFFF00FF72
-:1001400000FF48FFFFFF04FFA0FF23FFFFFF0FFF9B
-:1001500046FF90FFFFFF6AFF00FF0CFFFFFF20FF3D
-:1001600000FF04FFFFFF1CFF00FF04FFFFFF1CFF59
-:1001700000FF04FFFFFF1CFF00FF04FFFFFF1CFF49
-:1001800000FF04FFFFFF10FF00FF04FFFFFF10FF51
-:1001900000FF04FFFFFF10FF00FF04FFFFFF10FF41
-:1001A00000FF04FFFFFF10FF00FF04FFFFFF10FF31
-:1001B00000FF04FFFFFF10FF00FF04FFFFFF10FF21
-:1001C00000FF04FFFFFF10FF00FF04FFFFFF10FF11
-:1001D00000FF04FFFFFF10FF00FF04FFFFFF10FF01
-:1001E00072FF1CFFFFFF5FFF02FF40FFFFFF40FFAA
-:1001F00011FF90FFFFFF20FF00FF48FFFFFF00FF00
-:100200008BFF93FFFFFF20FF00FF40FFFFFF00FF7A
-:1002100086FF93FFFFFF70FF8BFF93FFFFFF30FF11
-:100220008DFF93FFFFFF40FF02FF91FFFFFF80FF65
-:1002300002FF91FFFFFF90FF8DFF93FFFFFFC0FFC5
-:1002400046FF90FFFFFF20FF8DFF93FFFFFFD0FFD2
-:1002500000FF48FFFFFF00FF8BFF93FFFFFF40FF02
-:10026000FFFF47FFFFFFF0FF8DFF93FFFFFFE0FF62
-:1002700000FF34FFFFFF17FF00FF38FFFFFF17FFEE
-:1002800080FF37FFFFFF02FF84FF3BFFFFFF02FFFE
-:1002900002FF34FFFFFF4AFF02FF38FFFFFF4AFF64
-:1002A00001FF34FFFFFF2BFF01FF38FFFFFF2BFF94
-:1002B00080FF43FFFFFF00FF82FF93FFFFFF50FF20
-:1002C00081FF43FFFFFF20FF82FF93FFFFFF60FFDF
-:1002D00084FF43FFFFFF00FF82FF93FFFFFF70FFDC
-:1002E00085FF43FFFFFF20FF83FF93FFFFFFC0FF5A
-:1002F00082FF37FFFFFF81FF00FF34FFFFFF89FF11
-:1003000088FF43FFFFFF00FF00FF68FFFFFF07FFBD
-:1003100082FF83FFFFFF60FF00FF68FFFFFF07FF13
-:100320008CFF43FFFFFF00FF00FF68FFFFFF07FF99
-:1003300083FF83FFFFFFC0FF00FF68FFFFFF07FF92
-:100340008AFF43FFFFFF00FF00FF68FFFFFF07FF7B
-:1003500082FF83FFFFFF50FF00FF68FFFFFF07FFE3
-:100360008EFF43FFFFFF00FF00FF68FFFFFF07FF57
-:1003700082FF83FFFFFF70FF00FF68FFFFFF07FFA3
-:1003800083FF37FFFFFF01FF00FF34FFFFFF89FFFF
-:1003900000FF34FFFFFF26FF30FF0CFFFFFF00FFD1
-:1003A00000FF40FFFFFF26FF20FF40FFFFFF04FF8D
-:1003B00080FF41FFFFFF02FFE0FF20FFFFFF0FFF75
-:1003C00000FF68FFFFFFB6FF63FF22FFFFFF0FFF85
-:1003D00062FF6AFFFFFFA6FF62FF6AFFFFFFA6FF43
-:1003E00000FF68FFFFFFA6FF00FF09FFFFFF07FFF9
-:1003F00040FF41FFFFFF02FFE0FF20FFFFFF0FFF75
-:1004000000FF68FFFFFFB6FF63FF22FFFFFF0FFF44
-:1004100062FF6AFFFFFFA6FF62FF6AFFFFFFA6FF02
-:1004200000FF68FFFFFFA6FF05FF41FFFFFF02FF80
-:10043000E0FF20FFFFFF0FFF8BFF93FFFFFFBBFFDE
-:1004400002FF41FFFFFF82FFE0FF20FFFFFF0FFFE2
-:100450008BFF93FFFFFFCBFF05FF41FFFFFFE2FF95
-:10046000E0FF20FFFFFF0FFF8BFF93FFFFFFDBFF8E
-:1004700020FF0CFFFFFF00FF30FF0CFFFFFF00FF1E
-:1004800000FF40FFFFFF26FF00FF41FFFFFF02FFCD
-:10049000E0FF20FFFFFF0FFF83FF93FFFFFF82FFBF
-:1004A00083FF93FFFFFF9BFF03FF41FFFFFF02FF5F
-:1004B000E0FF20FFFFFF0FFF83FF93FFFFFFA2FF7F
-:1004C00083FF93FFFFFFBBFF20FF0CFFFFFF00FF39
-:1004D00000FF40FFFFFF00FF44FF90FFFFFF60FFB2
-:1004E00000FF00FFFFFF00FF00FF00FFFFFF00FF16
-:1004F00000FF00FFFFFF00FF00FF00FFFFFF00FF06
-:1005000000FF00FFFFFF00FF00FF00FFFFFF00FFF5
-:1005100000FF00FFFFFF00FF00FF00FFFFFF00FFE5
-:1005200021FF40FFFFFF60FF40FF90FFFFFF20FF24
-:1005300002FF35FFFFFF00FF00FF34FFFFFF08FF52
-:1005400000FF3CFFFFFF85FF0AFF14FFFFFFAEFF28
-:1005500000FFA0FFFFFF03FF00FF35FFFFFF00FFCD
-:1005600000FF34FFFFFF08FF02FF3CFFFFFF05FF16
-:100570000AFF14FFFFFFFEFF00FFA0FFFFFF03FFC6
-:1005800003FF35FFFFFF00FF00FF34FFFFFF08FF01
-:1005900002FF3CFFFFFF05FF0BFF14FFFFFF4EFFB5
-:1005A00000FFA0FFFFFF03FF00FF35FFFFFF01FF7C
-:1005B00078FF1CFFFFFF5FFF03FF35FFFFFF01FF19
-:1005C00078FF1CFFFFFF5FFF5BFF40FFFFFFF0FFB7
-:1005D000FFFF93FFFFFF30FF80FF42FFFFFF70FF31
-:1005E000FFFF93FFFFFF60FFDFFF40FFFFFFF0FF14
-:1005F000FEFF93FFFFFFF0FF80FF42FFFFFF70FF52
-:10060000FFFF93FFFFFF20FFC1FF41FFFFFF80FFC0
-:10061000FFFF93FFFFFFF0FF03FF3CFFFFFFFCFF27
-:1006200000FF3CFFFFFF04FF02FF3CFFFFFF23FF33
-:1006300000FF48FFFFFF00FF8BFF93FFFFFF20FF3E
-:1006400059FF18FFFFFFDFFF00FF48FFFFFF00FF1C
-:100650008BFF93FFFFFF20FF18FF23FFFFFF0FFF1C
-:100660000CFF14FFFFFFE4FF8BFF83FFFFFF24FF5E
-:1006700000FF22FFFFFF0FFF0DFF18FFFFFF0FFF1F
-:100680008BFF83FFFFFF20FF00FF40FFFFFF14FFF2
-:10069000E0FF22FFFFFF0FFF10FF18FFFFFFD0FF5B
-:1006A0008BFF83FFFFFF20FF00FF40FFFFFF24FFC2
-:1006B000E0FF22FFFFFF0FFF10FF18FFFFFF30FFDB
-:1006C0008BFF83FFFFFF20FF00FF40FFFFFF44FF82
-:1006D000E0FF22FFFFFF0FFF22FF18FFFFFF90FF49
-:1006E0008BFF83FFFFFF20FF00FF40FFFFFF84FF22
-:1006F000E0FF22FFFFFF0FFF22FF18FFFFFF90FF29
-:100700000CFF18FFFFFF6FFF00FF40FFFFFF00FF20
-:1007100086FF93FFFFFF70FF76FF1CFFFFFF9FFF29
-:1007200086FF83FFFFFF50FF86FF83FFFFFF64FF0D
-:1007300060FF22FFFFFF0FFF74FF18FFFFFF81FF25
-:1007400000FF35FFFFFF00FF60FF1CFFFFFF7FFF83
-:1007500061FF1CFFFFFFAFFF77FF1CFFFFFFAFFF35
-:1007600063FF1CFFFFFF4FFF05FF35FFFFFF00FF8B
-:1007700092FF3BFFFFFF00FF00FF34FFFFFF08FF7A
-:1007800000FF38FFFFFF08FF00FF3CFFFFFF65FF92
-:100790000FFF14FFFFFF6EFF00FF60FFFFFF03FF6F
-:1007A00000FF60FFFFFF13FF00FF78FFFFFF13FF55
-:1007B00000FF78FFFFFF03FF05FF35FFFFFFE0FFAE
-:1007C0007FFF38FFFFFF00FF00FF34FFFFFF08FF40
-:1007D00000FF38FFFFFF08FF00FF3CFFFFFF65FF42
-:1007E00010FF14FFFFFF0EFF00FF60FFFFFF03FF7E
-:1007F00000FF60FFFFFF13FF00FF58FFFFFF13FF25
-:1008000000FF58FFFFFF03FF79FF1CFFFFFFFFFF03
-:1008100000FF0AFFFFFF0FFF0EFF1CFFFFFF1FFF80
-:100820008DFF83FFFFFFE0FF78FF22FFFFFF0FFF39
-:1008300015FF1CFFFFFF85FF75FF1CFFFFFF8FFFEC
-:1008400000FF40FFFFFF40FF8BFF93FFFFFF80FF94
-:1008500002FF40FFFFFF60FF11FF90FFFFFF20FF3F
-:1008600016FF18FFFFFF1FFF0EFF1CFFFFFF1FFFFC
-:1008700075FF1CFFFFFF8FFF80FF35FFFFFF00FFAD
-:1008800000FF34FFFFFF08FF00FF40FFFFFF00FFF6
-:1008900040FF3CFFFFFF05FF11FF14FFFFFF4EFF6E
-:1008A00000FF68FFFFFF03FF87FF83FFFFFFF0FFED
-:1008B00086FF93FFFFFF80FF90FF37FFFFFF00FFE2
-:1008C00002FF34FFFFFF08FF00FF60FFFFFF03FF91
-:1008D00089FF93FFFFFF20FF00FF60FFFFFF03FF83
-:1008E00089FF93FFFFFF30FF00FF60FFFFFF03FF63
-:1008F00089FF93FFFFFF40FF00FF60FFFFFF03FF43
-:1009000089FF93FFFFFF50FF86FF97FFFFFF90FFD8
-:1009100003FF35FFFFFF00FF60FF1CFFFFFF7FFFAE
-:1009200063FF1CFFFFFF7FFF00FF40FFFFFF00FF93
-:100930008DFF93FFFFFF60FF82FF93FFFFFF40FFEC
-:1009400086FF93FFFFFFA0FF83FF37FFFFFF80FFBE
-:1009500075FF1CFFFFFF1FFF83FF43FFFFFF00FF2B
-:1009600087FF93FFFFFFE0FF6AFF1CFFFFFF0FFF02
-:1009700040FF41FFFFFF00FF8BFF93FFFFFF90FF52
-:1009800080FF41FFFFFF00FF8BFF93FFFFFFA0FFF2
-:100990008BFF87FFFFFF90FF7EFF38FFFFFF00FF09
-:1009A00040FF34FFFFFF08FF00FF38FFFFFF08FF95
-:1009B00000FF3CFFFFFF55FF13FF14FFFFFFBEFFCB
-:1009C00000FF60FFFFFF03FF00FF60FFFFFF13FF5B
-:1009D00000FF58FFFFFF13FF00FF58FFFFFF03FF5B
-:1009E00000FF60FFFFFF03FF00FF60FFFFFF13FF3B
-:1009F00000FF58FFFFFF13FF00FF58FFFFFF03FF3B
-:100A000000FF60FFFFFF03FF00FF60FFFFFF13FF1A
-:100A100000FF58FFFFFF13FF00FF58FFFFFF03FF1A
-:100A200000FF60FFFFFF03FF00FF60FFFFFF03FF0A
-:100A30008BFF97FFFFFF90FF05FF41FFFFFF00FFC8
-:100A400092FF43FFFFFF01FF86FF93FFFFFFF0FFD1
-:100A500086FF93FFFFFFE1FF8DFF83FFFFFFE0FFB6
-:100A600078FF22FFFFFF0FFF15FF1CFFFFFF85FF31
-:100A700075FF1CFFFFFF8FFF8DFF83FFFFFF40FF10
-:100A800078FF22FFFFFF0FFF53FF18FFFFFFB4FFA8
-:100A900072FF1CFFFFFF0FFF00FF40FFFFFF00FF83
-:100AA0008BFF93FFFFFF30FF02FF40FFFFFF60FF60
-:100AB00011FF90FFFFFF20FF16FF18FFFFFF4FFF02
-:100AC00038FF42FFFFFF50FF48FF90FFFFFFA0FFEE
-:100AD00000FF00FFFFFF00FF00FF00FFFFFF00FF20
-:100AE00000FF00FFFFFF00FF00FF00FFFFFF00FF10
-:100AF00030FF40FFFFFF00FF47FF90FFFFFF50FF69
-:100B000000FF0AFFFFFF0FFF1EFF1CFFFFFF0FFF8D
-:100B100020FF1CFFFFFFCFFF16FF18FFFFFF1FFF87
-:100B200000FF40FFFFFF00FF46FF90FFFFFF70FF49
-:100B300018FF1CFFFFFFEFFF6AFF1CFFFFFFBFFF57
-:100B40005CFF1CFFFFFF7FFF18FF1CFFFFFFEFFF95
-:100B500067FF1CFFFFFF3FFF5CFF1CFFFFFF7FFFE6
-:100B600008FF40FFFFFF00FF46FF90FFFFFF70FF01
-:100B700018FF1CFFFFFFEFFF69FF1CFFFFFF0FFFC8
-:100B80005DFF1CFFFFFF2FFF18FF1CFFFFFFEFFFA4
-:100B900079FF1CFFFFFF1FFF5CFF1CFFFFFF7FFFB4
-:100BA00018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFF35
-:100BB00018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFF25
-:100BC00018FF1CFFFFFFEFFF5DFF1CFFFFFF2FFF64
-:100BD00018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFF05
-:100BE00018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFFF5
-:100BF00018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFFE5
-:100C000018FF1CFFFFFFEFFF5DFF1CFFFFFF2FFF23
-:100C100018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFFC4
-:100C200018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFFB4
-:100C300018FF1CFFFFFFEFFF5CFF1CFFFFFF7FFFA4
-:100C400018FF1CFFFFFFEFFF5DFF1CFFFFFF2FFFE3
-:100C500018FF1CFFFFFFEFFF66FF1CFFFFFF1FFFDA
-:100C60005CFF1CFFFFFF7FFF16FF18FFFFFF4FFF1A
-:100C70008BFF87FFFFFF61FF00FF34FFFFFF89FF4E
-:100C800000FF34FFFFFF26FF00FF60FFFFFF06FFAE
-:100C900083FF93FFFFFFD0FF00FF60FFFFFF06FF12
-:100CA00083FF93FFFFFFE0FF38FF22FFFFFF0FFFEF
-:100CB00019FF14FFFFFF85FF8BFF83FFFFFF50FF2E
-:100CC00078FF22FFFFFF0FFF00FF60FFFFFF07FF1E
-:100CD00004FF0DFFFFFF30FF00FF60FFFFFF07FF76
-:100CE00083FF93FFFFFFF0FF00FF60FFFFFF07FFA1
-:100CF00008FF0DFFFFFF30FF00FF60FFFFFF07FF52
-:100D000086FF93FFFFFF40FF00FF40FFFFFF01FF53
-:100D10008BFF93FFFFFF51FF00FF34FFFFFF46FFF4
-:100D200000FF09FFFFFF06FF8BFF97FFFFFF61FF3B
-:100D300083FF8BFFFFFFD0FF83FF8BFFFFFFE1FFF0
-:100D400087FF37FFFFFF01FF6EFF1CFFFFFFBFFFA5
-:100D500087FF37FFFFFF00FF92FF37FFFFFF01FF15
-:100D60007FFF38FFFFFF00FF7EFF38FFFFFF01FF1F
-:100D700023FF1CFFFFFFFFFF7EFF38FFFFFF00FF89
-:100D800083FF87FFFFFFF1FF86FF8BFFFFFF41FF20
-:100D90006CFF1CFFFFFF2FFF87FF37FFFFFF00FFE8
-:100DA0008BFF8BFFFFFFA0FF00FF34FFFFFF08FF5B
-:100DB00040FF38FFFFFF08FF00FF3CFFFFFF55FF2C
-:100DC0001BFF14FFFFFFCEFF00FF60FFFFFF03FFCD
-:100DD00000FF60FFFFFF13FF00FF78FFFFFF13FF1F
-:100DE00000FF78FFFFFF03FF00FF60FFFFFF03FF2F
-:100DF00000FF60FFFFFF13FF00FF78FFFFFF13FFFF
-:100E000000FF78FFFFFF03FF00FF60FFFFFF03FF0E
-:100E100000FF60FFFFFF13FF00FF78FFFFFF13FFDE
-:100E200000FF78FFFFFF03FF8BFF83FFFFFFE1FF62
-:100E30008BFF83FFFFFFF0FF00FF78FFFFFF13FF33
-:100E400000FF78FFFFFF03FF8BFF9BFFFFFFA0FF6B
-:100E50008BFF87FFFFFF90FF7EFF38FFFFFF00FF44
-:100E600040FF34FFFFFF08FF00FF38FFFFFF08FFD0
-:100E700000FF3CFFFFFF55FF1DFF14FFFFFF3EFF7C
-:100E800000FF60FFFFFF03FF00FF60FFFFFF13FF96
-:100E900000FF58FFFFFF13FF00FF58FFFFFF03FF96
-:100EA00000FF60FFFFFF03FF00FF60FFFFFF13FF76
-:100EB00000FF58FFFFFF13FF00FF58FFFFFF03FF76
-:100EC00000FF60FFFFFF03FF00FF60FFFFFF13FF56
-:100ED00000FF58FFFFFF13FF00FF58FFFFFF03FF56
-:100EE00000FF60FFFFFF03FF00FF60FFFFFF03FF46
-:100EF0008BFF97FFFFFF90FF00FF0AFFFFFF0FFF31
-:100F00008BFF87FFFFFF61FF00FF34FFFFFF89FFBB
-:100F100000FF34FFFFFF26FF00FF60FFFFFF06FF1B
-:100F200083FF93FFFFFFD0FF00FF60FFFFFF06FF7F
-:100F300083FF93FFFFFFE0FF8BFF83FFFFFF51FF66
-:100F400079FF22FFFFFF0FFF74FF18FFFFFFB4FFC1
-:100F500038FF22FFFFFF0FFF1EFF14FFFFFFD5FF2B
-:100F60008BFF83FFFFFF50FF78FF22FFFFFF0FFF84
-:100F700000FF60FFFFFF07FF04FF0DFFFFFF30FFD3
-:100F800000FF60FFFFFF07FF83FF93FFFFFFF0FFFE
-:100F900000FF60FFFFFF07FF08FF0DFFFFFF30FFAF
-:100FA00000FF60FFFFFF07FF86FF93FFFFFF40FF8B
-:100FB00000FF40FFFFFF01FF8BFF93FFFFFF51FF8B
-:100FC00000FF34FFFFFF46FF00FF09FFFFFF06FFA2
-:100FD0008BFF97FFFFFF61FF83FF8BFFFFFFD0FFBA
-:100FE00083FF8BFFFFFFE1FF87FF37FFFFFF01FF5D
-:100FF0006EFF1CFFFFFFBFFF87FF37FFFFFF00FFF4
-:1010000092FF37FFFFFF01FF7FFF38FFFFFF00FF69
-:1010100023FF1CFFFFFFFFFF7EFF38FFFFFF00FFE6
-:1010200083FF87FFFFFFF1FF86FF8BFFFFFF41FF7D
-:101030006CFF1CFFFFFF2FFF00FF0AFFFFFF0FFFEA
-:101040008DFF8FFFFFFFC5FF20FF14FFFFFFAEFFE7
-:1010500000FF00FFFFFF00FF00FF0AFFFFFF0FFF81
-:101060008BFF83FFFFFF84FF00FF23FFFFFF0FFFC6
-:101070008BFF93FFFFFF8AFF64FF1CFFFFFFE0FF72
-:101080007EFF38FFFFFF00FF00FF38FFFFFF08FF74
-:1010900000FF3CFFFFFFE5FF21FF14FFFFFF5EFFA6
-:1010A00000FF40FFFFFF00FF00FF58FFFFFF03FFAF
-:1010B00000FF0AFFFFFF0FFF08FF40FFFFFF10FFC9
-:1010C00047FF90FFFFFF20FF00FF04FFFFFF1CFF13
-:1010D00000FF04FFFFFF1CFF00FF04FFFFFF1CFFDA
-:1010E00000FF04FFFFFF1CFF00FF04FFFFFF10FFD6
-:1010F00000FF04FFFFFF10FF00FF04FFFFFF10FFD2
-:1011000000FF04FFFFFF10FF00FF04FFFFFF10FFC1
-:1011100000FF04FFFFFF10FF00FF04FFFFFF10FFB1
-:1011200000FF04FFFFFF10FF00FF04FFFFFF10FFA1
-:1011300000FF04FFFFFF10FF00FF04FFFFFF10FF91
-:1011400000FF04FFFFFF10FF02FF40FFFFFF40FF13
-:1011500011FF90FFFFFF20FF78FF42FFFFFF50FFCE
-:1011600048FF90FFFFFFA0FF00FF00FFFFFF00FF11
-:1011700000FF00FFFFFF00FF00FF00FFFFFF00FF79
-:1011800000FF00FFFFFF00FF00FF00FFFFFF00FF69
-:10119000B0FF40FFFFFF00FF47FF90FFFFFF50FF42
-:1011A00000FF40FFFFFF00FF8DFF93FFFFFF40FFA9
-:1011B0008DFF93FFFFFF50FF00FF40FFFFFF01FF88
-:1011C0008BFF93FFFFFF51FF00FF40FFFFFF00FF7A
-:1011D00046FF90FFFFFF70FF8DFF83FFFFFFD0FFF3
-:1011E00078FF22FFFFFF0FFF0CFF18FFFFFF90FFAC
-:1011F0000CFF18FFFFFF6FFF20FF0CFFFFFF00FF3A
-:1012000000FF34FFFFFF09FF00FF34FFFFFF08FF6F
-:1012100000FF38FFFFFF08FF00FF38FFFFFF09FF57
-:1012200000FF38FFFFFF06FF00FF34FFFFFF26FF30
-:1012300098FFCCFFFFFF37FF00FF3CFFFFFFA5FF3C
-:1012400024FF14FFFFFFFEFF00FF60FFFFFF73FF9F
-:1012500008FF0DFFFFFF14FF98FF20FFFFFF0FFFA8
-:1012600000FF50FFFFFFC6FF69FFCCFFFFFF37FF06
-:1012700000FF05FFFFFF00FF00FF58FFFFFFC6FF55
-:1012800098FF20FFFFFF0FFF00FF60FFFFFF72FFCF
-:1012900008FF0DFFFFFF14FF00FF50FFFFFFC6FF19
-:1012A00069FFCCFFFFFF37FF00FF05FFFFFF00FFD7
-:1012B00000FF58FFFFFFC6FF98FF20FFFFFF0FFF53
-:1012C00000FF60FFFFFF73FF08FF0DFFFFFF14FF2C
-:1012D00000FF50FFFFFFC6FF69FF20FFFFFF0FFF6A
-:1012E00000FF05FFFFFF00FF00FF58FFFFFFC6FFE5
-:1012F00030FF0CFFFFFF00FF00FF0AFFFFFF0FFFA3
-:1013000000FF0CFFFFFF30FF47FF80FFFFFF58FF8C
-:1013100010FF0FFFFFFF01FF66FF23FFFFFF0FFF1F
-:1013200026FF18FFFFFF94FF00FF48FFFFFF00FFAD
-:101330008BFF93FFFFFF40FF80FF40FFFFFF00FF99
-:1013400049FF90FFFFFF40FF16FF0FFFFFFF02FF67
-:1013500066FF23FFFFFF0FFF38FF18FFFFFFB4FFFB
-:101360000FFF40FFFFFFF4FF47FF80FFFFFF0AFF73
-:1013700082FF23FFFFFF0FFF8DFF93FFFFFF7AFF29
-:101380007AFF26FFFFFF0FFF10FF27FFFFFF0FFF72
-:1013900038FF18FFFFFFB4FF27FF18FFFFFFD2FF42
-:1013A00000FF48FFFFFF00FF8BFF93FFFFFF30FFB1
-:1013B0008DFF83FFFFFF70FF47FF90FFFFFF00FFE0
-:1013C00000FF48FFFFFF04FFA0FF23FFFFFF0FFF09
-:1013D00046FF90FFFFFF6AFF00FF0CFFFFFF20FFAB
-:1013E00000FF0AFFFFFF1FFF10FF27FFFFFF0FFF98
-:1013F00029FF18FFFFFF92FF46FF80FFFFFF00FF5E
-:101400008BFF93FFFFFF20FF8DFF83FFFFFF70FF28
-:1014100047FF90FFFFFF00FF00FF48FFFFFF04FFB3
-:10142000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFB4
-:1014300000FF0CFFFFFF20FF00FF04FFFFFF1CFF6A
-:1014400000FF04FFFFFF1CFF00FF04FFFFFF1CFF66
-:1014500000FF04FFFFFF1CFF00FF04FFFFFF10FF62
-:1014600000FF04FFFFFF10FF00FF04FFFFFF10FF5E
-:1014700000FF04FFFFFF10FF00FF04FFFFFF10FF4E
-:1014800000FF04FFFFFF10FF00FF04FFFFFF10FF3E
-:1014900000FF04FFFFFF10FF00FF04FFFFFF10FF2E
-:1014A00000FF04FFFFFF10FF00FF04FFFFFF10FF1E
-:1014B00000FF04FFFFFF10FF00FF04FFFFFF03FF1B
-:1014C0000DFF18FFFFFF0FFF10FF27FFFFFF0FFFAC
-:1014D00031FF18FFFFFF12FF30FF0CFFFFFF00FF7F
-:1014E00008FF0CFFFFFF00FFFFFF4FFFFFFF89FF1B
-:1014F00090FF37FFFFFF00FF02FF34FFFFFF08FFF1
-:1015000000FF34FFFFFF34FF00FF34FFFFFF55FFF4
-:1015100046FF80FFFFFF08FF00FF0EFFFFFF0FFFEA
-:1015200000FF0DFFFFFF4EFFA7FF23FFFFFF0FFF91
-:1015300000FF68FFFFFFA3FF00FF0DFFFFFF4AFF53
-:1015400046FF80FFFFFF18FF00FF0EFFFFFF0FFFAA
-:1015500000FF0DFFFFFF5EFFAFFF23FFFFFF0FFF49
-:1015600000FF68FFFFFFA0FF00FF0DFFFFFF5AFF16
-:1015700046FF80FFFFFF48FF10FF0FFFFFFFFEFF4A
-:1015800087FF93FFFFFFFEFF00FF0DFFFFFF2EFF12
-:1015900002FF40FFFFFF06FFE0FF20FFFFFF0FFFFE
-:1015A00000FF40FFFFFF01FF63FF22FFFFFF0FFF70
-:1015B00000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF88
-:1015C00000FF0DFFFFFF5AFF00FF68FFFFFFA0FFB6
-:1015D00000FF0DFFFFFF5AFF63FF22FFFFFF0FFF1A
-:1015E00000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF58
-:1015F00000FF0DFFFFFF5AFF00FF68FFFFFFA0FF86
-:1016000063FF22FFFFFF0FFF00FF0DFFFFFF4AFFF9
-:1016100049FF6AFFFFFFA3FF00FF0DFFFFFF5AFF17
-:1016200000FF68FFFFFFA0FF63FF22FFFFFF0FFF28
-:1016300000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF07
-:1016400000FF0DFFFFFF5AFF00FF68FFFFFFA0FF35
-:1016500063FF22FFFFFF0FFF00FF0DFFFFFF4AFFA9
-:1016600049FF6AFFFFFFA3FF00FF0DFFFFFF5AFFC7
-:1016700000FF68FFFFFFA0FF63FF22FFFFFF0FFFD8
-:1016800000FF0DFFFFFF4AFF49FF6AFFFFFFA3FFB7
-:1016900000FF0DFFFFFF5AFF00FF68FFFFFFA0FFE5
-:1016A00063FF22FFFFFF0FFF00FF0DFFFFFF4AFF59
-:1016B00049FF6AFFFFFFA3FF00FF0DFFFFFF5AFF77
-:1016C00000FF68FFFFFFA1FF46FF80FFFFFF28FF2D
-:1016D00000FF0EFFFFFF0FFF00FF0DFFFFFF4EFF9C
-:1016E000A7FF23FFFFFF0FFF00FF68FFFFFFA3FF20
-:1016F00000FF0DFFFFFF4AFF46FF80FFFFFF38FF9F
-:1017000000FF0EFFFFFF0FFF00FF0DFFFFFF5EFF5B
-:10171000AFFF23FFFFFF0FFF00FF68FFFFFFA0FFEA
-:1017200000FF0DFFFFFF5AFF63FF22FFFFFF0FFFC8
-:1017300000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF06
-:1017400000FF0DFFFFFF5AFF00FF68FFFFFFA0FF34
-:1017500063FF22FFFFFF0FFF00FF0DFFFFFF4AFFA8
-:1017600049FF6AFFFFFFA3FF00FF0DFFFFFF5AFFC6
-:1017700000FF68FFFFFFA0FF63FF22FFFFFF0FFFD7
-:1017800000FF0DFFFFFF4AFF49FF6AFFFFFFA3FFB6
-:1017900000FF0DFFFFFF5AFF00FF68FFFFFFA0FFE4
-:1017A00063FF22FFFFFF0FFF00FF0DFFFFFF4AFF58
-:1017B00049FF6AFFFFFFA3FF00FF0DFFFFFF5AFF76
-:1017C00000FF68FFFFFFA0FF63FF22FFFFFF0FFF87
-:1017D00000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF66
-:1017E00000FF0DFFFFFF5AFF00FF68FFFFFFA0FF94
-:1017F00063FF22FFFFFF0FFF00FF0DFFFFFF4AFF08
-:1018000049FF6AFFFFFFA3FF00FF0DFFFFFF5AFF25
-:1018100000FF68FFFFFFA0FF63FF22FFFFFF0FFF36
-:1018200000FF0DFFFFFF4AFF49FF6AFFFFFFA3FF15
-:1018300000FF0DFFFFFF5AFF00FF68FFFFFFA3FF40
-:10184000FFFF4FFFFFFFF0FF86FF93FFFFFF50FFFB
-:101850008DFF83FFFFFF70FF47FF90FFFFFF00FF3B
-:1018600000FF48FFFFFF04FFA0FF23FFFFFF0FFF64
-:1018700046FF90FFFFFF6AFF00FF0CFFFFFF20FF06
-:1018800000FF0AFFFFFF1FFF10FF27FFFFFF0FFFF3
-:1018900032FF18FFFFFF42FF8BFF83FFFFFFE4FFD4
-:1018A0008BFF83FFFFFFF5FF46FF90FFFFFF44FF25
-:1018B00008FF22FFFFFF0FFFFFFF4FFFFFFF89FF22
-:1018C00000FF0DFFFFFF8AFF00FF0EFFFFFF0FFF6E
-:1018D00000FF0DFFFFFF4EFFA7FF23FFFFFF0FFFDE
-:1018E00046FF90FFFFFF5AFF8DFF83FFFFFF70FF52
-:1018F00047FF90FFFFFF00FF00FF48FFFFFF04FFCF
-:10190000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFCF
-:1019100000FF0CFFFFFF20FF00FF0AFFFFFF1FFF7C
-:1019200010FF27FFFFFF0FFF35FF18FFFFFFD2FF5C
-:1019300000FF4CFFFFFF00FF00FF93FFFFFF00FFD2
-:101940000BFF40FFFFFF80FF11FF90FFFFFFF0FF45
-:1019500000FF40FFFFFF10FF11FF90FFFFFFE0FFC0
-:1019600046FF80FFFFFF0AFF7AFF26FFFFFF0FFF02
-:1019700035FF1CFFFFFF24FF10FF27FFFFFF0FFFB6
-:1019800033FF18FFFFFFC5FF00FF40FFFFFFC0FF51
-:1019900011FF90FFFFFF60FF8DFF93FFFFFFD0FF60
-:1019A00000FF48FFFFFF00FF8DFF83FFFFFF70FF79
-:1019B00047FF90FFFFFF00FF00FF48FFFFFF04FF0E
-:1019C000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF0F
-:1019D00000FF0CFFFFFF20FF00FF0AFFFFFF1FFFBC
-:1019E00010FF27FFFFFF0FFF34FF18FFFFFF85FFEA
-:1019F00000FF40FFFFFF40FF11FF90FFFFFF60FF70
-:101A00008DFF93FFFFFFD0FF8DFF83FFFFFF70FF70
-:101A100047FF90FFFFFF00FF00FF48FFFFFF04FFAD
-:101A2000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFAE
-:101A300000FF0CFFFFFF20FF00FF0AFFFFFF1FFF5B
-:101A400000FF40FFFFFF00FF11FF90FFFFFF60FF5F
-:101A50008DFF93FFFFFFD0FF8DFF83FFFFFF70FF20
-:101A600047FF90FFFFFF00FF00FF48FFFFFF04FF5D
-:101A7000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF5E
-:101A800000FF0CFFFFFF20FF00FF0AFFFFFF1FFF0B
-:101A900000FF48FFFFFF00FF8DFF93FFFFFF80FF68
-:101AA00000FF48FFFFFF00FF00FF93FFFFFF00FF65
-:101AB0000DFF40FFFFFFF0FF11FF90FFFFFFF0FF62
-:101AC00000FF40FFFFFF10FF11FF90FFFFFFE0FF4F
-:101AD000FFFF40FFFFFFF0FF90FF27FFFFFF0FFF1B
-:101AE00000FF0AFFFFFF0FFF10FF27FFFFFF0FFFA1
-:101AF00037FF18FFFFFF42FF46FF80FFFFFF00FF99
-:101B000089FF93FFFFFFA0FF46FF80FFFFFF10FF4D
-:101B100089FF93FFFFFFB0FF46FF80FFFFFF20FF1D
-:101B200089FF93FFFFFFC0FF46FF80FFFFFF30FFED
-:101B300089FF93FFFFFFD0FF46FF80FFFFFF40FFBD
-:101B400089FF93FFFFFFE0FF46FF80FFFFFF50FF8D
-:101B500089FF93FFFFFFF0FF00FF40FFFFFF10FF33
-:101B600086FF93FFFFFF60FF8DFF83FFFFFF70FF86
-:101B700047FF90FFFFFF00FF00FF48FFFFFF04FF4C
-:101B8000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF4D
-:101B900000FF0CFFFFFF20FF00FF0AFFFFFF1FFFFA
-:101BA00010FF27FFFFFF0FFF39FF18FFFFFF22FF86
-:101BB00046FF80FFFFFF00FF8DFF93FFFFFF20FF29
-:101BC00046FF80FFFFFF10FF8DFF93FFFFFF30FFF9
-:101BD00046FF80FFFFFF20FF78FF22FFFFFF0FFF80
-:101BE00038FF1CFFFFFF84FF00FF40FFFFFF00FFE7
-:101BF00046FF90FFFFFF20FF00FF48FFFFFF00FFB1
-:101C00008DFF93FFFFFF40FF8DFF83FFFFFF70FFFE
-:101C100047FF90FFFFFF00FF00FF48FFFFFF04FFAB
-:101C2000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFAC
-:101C300000FF0CFFFFFF20FF00FF0AFFFFFF1FFF59
-:101C400000FF48FFFFFF00FF8DFF93FFFFFF50FFE6
-:101C500000FF0AFFFFFF0FFF00FF0CFFFFFF20FF49
-:101C600000FF0AFFFFFF1FFF00FF0CFFFFFF30FF19
-:101C700000FF48FFFFFF00FF8BFF93FFFFFF50FFB8
-:101C800000FF0CFFFFFF20FF00FF0AFFFFFF1FFF09
-:101C90008DFF83FFFFFF70FF0FFF40FFFFFFF4FF8B
-:101CA000E0FF22FFFFFF0FFF41FF18FFFFFF30FFA4
-:101CB0008DFF83FFFFFF70FF0FFF40FFFFFFE4FF7B
-:101CC000E0FF22FFFFFF0FFF42FF18FFFFFF40FF73
-:101CD0008DFF83FFFFFF70FF0FFF40FFFFFFD4FF6B
-:101CE000E0FF22FFFFFF0FFF47FF18FFFFFFA0FFEE
-:101CF0008DFF83FFFFFF70FF0FFF40FFFFFFC4FF5B
-:101D0000E0FF22FFFFFF0FFF46FF18FFFFFFD0FF9E
-:101D10008DFF83FFFFFF70FF0FFF40FFFFFFB4FF4A
-:101D2000E0FF22FFFFFF0FFF48FF18FFFFFFE0FF6C
-:101D30008DFF83FFFFFF70FF0FFF40FFFFFFA4FF3A
-:101D4000E0FF22FFFFFF0FFF4AFF18FFFFFF60FFCA
-:101D50008DFF83FFFFFF70FF0FFF40FFFFFF94FF2A
-:101D6000E0FF22FFFFFF0FFF4CFF18FFFFFF00FF08
-:101D70008DFF83FFFFFF70FF0FFF40FFFFFF84FF1A
-:101D8000E0FF22FFFFFF0FFF4DFF18FFFFFFE0FF07
-:101D90008DFF83FFFFFF70FF0FFF40FFFFFF74FF0A
-:101DA000E0FF22FFFFFF0FFF4FFF18FFFFFF20FFA5
-:101DB0008DFF83FFFFFF70FF0FFF40FFFFFF64FFFA
-:101DC000E0FF22FFFFFF0FFF4FFF18FFFFFFF0FFB5
-:101DD0008DFF83FFFFFF70FF0EFF40FFFFFFF4FF4B
-:101DE000E0FF22FFFFFF0FFF44FF18FFFFFF40FF50
-:101DF0008DFF83FFFFFF70FF0EFF40FFFFFFE4FF3B
-:101E0000E0FF22FFFFFF0FFF45FF18FFFFFF50FF1E
-:101E10008DFF83FFFFFF70FF0AFF40FFFFFF04FFFE
-:101E2000E0FF22FFFFFF0FFF3DFF18FFFFFFD0FF86
-:101E30008DFF83FFFFFF70FF0AFF40FFFFFF14FFCE
-:101E4000E0FF22FFFFFF0FFF3FFF18FFFFFF10FF24
-:101E50008DFF83FFFFFF70FF0AFF40FFFFFF24FF9E
-:101E6000E0FF22FFFFFF0FFF3FFF18FFFFFF80FF94
-:101E70008DFF83FFFFFF70FF0AFF40FFFFFF34FF6E
-:101E8000E0FF22FFFFFF0FFF3FFF18FFFFFFF0FF04
-:101E90008DFF83FFFFFF70FF0AFF40FFFFFF44FF3E
-:101EA000E0FF22FFFFFF0FFF40FF18FFFFFF60FF73
-:101EB0008DFF83FFFFFF70FF47FF90FFFFFF00FFD5
-:101EC00000FF48FFFFFF04FFA0FF23FFFFFF0FFFFE
-:101ED00046FF90FFFFFF6AFF00FF0CFFFFFF20FFA0
-:101EE00000FF0AFFFFFF1FFF8DFF83FFFFFF70FF53
-:101EF00047FF90FFFFFF00FF00FF48FFFFFF04FFC9
-:101F0000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFC9
-:101F100000FF0CFFFFFF08FF00FF40FFFFFF00FF77
-:101F2000FFFF93FFFFFFF0FF00FF40FFFFFF00FFF9
-:101F300044FF90FFFFFF60FF00FF00FFFFFF00FF77
-:101F400000FF00FFFFFF00FF00FF00FFFFFF00FF9B
-:101F500000FF00FFFFFF00FF00FF00FFFFFF00FF8B
-:101F600000FF00FFFFFF00FF00FF00FFFFFF00FF7B
-:101F700000FF00FFFFFF00FF21FF40FFFFFF80FF8A
-:101F8000FFFF93FFFFFFF0FF8DFF83FFFFFF70FF59
-:101F900047FF90FFFFFF00FF00FF48FFFFFF04FF28
-:101FA000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF29
-:101FB00025FF40FFFFFF80FFFFFF93FFFFFFF0FFC4
-:101FC0008DFF83FFFFFF70FF47FF90FFFFFF00FFC4
-:101FD00000FF48FFFFFF04FFA0FF23FFFFFF0FFFED
-:101FE00046FF90FFFFFF6AFFE9FF41FFFFFF80FF11
-:101FF000FFFF93FFFFFFF0FF8DFF83FFFFFF70FFE9
-:1020000047FF90FFFFFF00FF00FF48FFFFFF04FFB7
-:10201000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFB8
-:10202000EDFF41FFFFFF80FFFFFF93FFFFFFF0FF8A
-:102030008DFF83FFFFFF70FF47FF90FFFFFF00FF53
-:1020400000FF48FFFFFF04FFA0FF23FFFFFF0FFF7C
-:1020500046FF90FFFFFF6AFF00FF40FFFFFF00FF0A
-:1020600044FF90FFFFFF60FF00FF00FFFFFF00FF46
-:1020700000FF00FFFFFF00FF00FF00FFFFFF00FF6A
-:1020800000FF00FFFFFF00FFF1FF41FFFFFF80FFA8
-:10209000FFFF93FFFFFFF0FF46FF84FFFFFF00FFFE
-:1020A00000FF34FFFFFF08FF00FF60FFFFFF03FF9B
-:1020B00000FF00FFFFFF00FF00FF00FFFFFF00FF2A
-:1020C00000FF00FFFFFF00FF00FF00FFFFFF00FF1A
-:1020D00046FF90FFFFFF60FFF7FF4FFFFFFFF4FF9A
-:1020E00046FF90FFFFFF74FF8DFF83FFFFFF70FF30
-:1020F00047FF90FFFFFF00FF00FF48FFFFFF04FFC7
-:10210000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFC7
-:1021100000FF0CFFFFFF20FF00FF0AFFFFFF1FFF74
-:1021200046FF84FFFFFF00FF00FF34FFFFFF08FFB3
-:1021300000FF34FFFFFF06FF00FF00FFFFFF00FF6F
-:1021400000FF00FFFFFF00FF00FF00FFFFFF00FF99
-:1021500000FF00FFFFFF00FF46FF80FFFFFF10FFB3
-:1021600000FF00FFFFFF00FF00FF00FFFFFF00FF79
-:1021700000FF00FFFFFF00FF00FF00FFFFFF00FF69
-:1021800000FF68FFFFFF02FF00FF00FFFFFF00FFEF
-:1021900000FF00FFFFFF00FF00FF00FFFFFF00FF49
-:1021A00000FF00FFFFFF00FF00FF60FFFFFF22FFB7
-:1021B00000FF00FFFFFF00FF00FF00FFFFFF00FF29
-:1021C00000FF00FFFFFF00FF00FF00FFFFFF00FF19
-:1021D00046FF90FFFFFF62FFF7FF4FFFFFFFF4FF97
-:1021E00046FF90FFFFFF74FF8DFF83FFFFFF70FF2F
-:1021F00047FF90FFFFFF00FF00FF48FFFFFF04FFC6
-:10220000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFC6
-:1022100000FF0CFFFFFF20FF00FF0AFFFFFF1FFF73
-:1022200046FF88FFFFFF00FF00FF38FFFFFF08FFAA
-:1022300000FF50FFFFFF03FF00FF00FFFFFF00FF55
-:1022400000FF00FFFFFF00FF00FF00FFFFFF00FF98
-:1022500000FF00FFFFFF00FF46FF90FFFFFF60FF52
-:10226000F7FF4FFFFFFFF4FF46FF90FFFFFF74FFF4
-:102270008DFF83FFFFFF70FF47FF90FFFFFF00FF11
-:1022800000FF48FFFFFF04FFA0FF23FFFFFF0FFF3A
-:1022900046FF90FFFFFF6AFF00FF0CFFFFFF20FFDC
-:1022A00000FF0AFFFFFF1FFF46FF88FFFFFF00FF41
-:1022B00000FF38FFFFFF08FF00FF38FFFFFF04FFAC
-:1022C00000FF00FFFFFF00FF00FF00FFFFFF00FF18
-:1022D00000FF00FFFFFF00FF00FF00FFFFFF00FF08
-:1022E00046FF80FFFFFF10FF00FF58FFFFFF03FFC7
-:1022F00000FF50FFFFFF23FF00FF00FFFFFF00FF75
-:1023000000FF00FFFFFF00FF00FF00FFFFFF00FFD7
-:1023100000FF00FFFFFF00FF46FF90FFFFFF62FF8F
-:10232000F7FF4FFFFFFFF4FF46FF90FFFFFF74FF33
-:102330008DFF83FFFFFF70FF47FF90FFFFFF00FF50
-:1023400000FF48FFFFFF04FFA0FF23FFFFFF0FFF79
-:1023500046FF90FFFFFF6AFF00FF0CFFFFFF20FF1B
-:1023600000FF0AFFFFFF1FFF46FF80FFFFFF00FF88
-:10237000FFFF93FFFFFFE0FFFFFF83FFFFFFE2FF91
-:1023800046FF90FFFFFF62FFF7FF4FFFFFFFF4FFE5
-:1023900046FF90FFFFFF74FF8DFF83FFFFFF70FF7D
-:1023A00047FF90FFFFFF00FF00FF48FFFFFF04FF14
-:1023B000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF15
-:1023C00000FF0CFFFFFF20FF00FF0AFFFFFF1FFFC2
-:1023D00003FF0DFFFFFF0FFF00FF00FFFFFF00FFE8
-:1023E00000FF00FFFFFF00FF00FF00FFFFFF00FFF7
-:1023F00000FF00FFFFFF00FF46FF90FFFFFF60FFB1
-:102400000CFF0DFFFFFFF0FF00FF00FFFFFF00FFCD
-:1024100000FF00FFFFFF00FF00FF00FFFFFF00FFC6
-:1024200000FF00FFFFFF00FFF7FF4FFFFFFFF4FF7C
-:1024300046FF90FFFFFF74FF8DFF83FFFFFF70FFDC
-:1024400047FF90FFFFFF00FF00FF48FFFFFF04FF73
-:10245000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF74
-:1024600000FF0CFFFFFF20FF00FF0AFFFFFF1FFF21
-:1024700046FF80FFFFFF02FF00FF00FFFFFF00FF9E
-:1024800000FF00FFFFFF00FF00FF00FFFFFF00FF56
-:1024900000FF00FFFFFF00FF00FF00FFFFFF00FF46
-:1024A00000FF00FFFFFF00FF00FF00FFFFFF00FF36
-:1024B00000FF00FFFFFF00FF46FF80FFFFFF13FF4D
-:1024C00000FF40FFFFFF00FF11FF90FFFFFF60FFD5
-:1024D0008DFF93FFFFFFD0FF11FF90FFFFFFF2FF83
-:1024E00011FF90FFFFFFE3FFF7FF4FFFFFFFF4FF38
-:1024F00046FF90FFFFFF74FF8DFF83FFFFFF70FF1C
-:1025000047FF90FFFFFF00FF00FF48FFFFFF04FFB2
-:10251000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFB3
-:1025200000FF0CFFFFFF20FF00FF0AFFFFFF1FFF60
-:1025300046FF84FFFFFF00FF00FF34FFFFFF08FF9F
-:1025400000FF34FFFFFF06FF00FF00FFFFFF00FF5B
-:1025500000FF00FFFFFF00FF00FF00FFFFFF00FF85
-:1025600000FF00FFFFFF00FF46FF80FFFFFF10FF9F
-:10257000FFFF93FFFFFFE0FF00FF60FFFFFF22FF71
-:1025800067FF40FFFFFF40FFFFFF93FFFFFFE0FFFC
-:1025900000FF00FFFFFF00FF00FF00FFFFFF00FF45
-:1025A00000FF00FFFFFF00FF00FF00FFFFFF00FF35
-:1025B00046FF90FFFFFF62FFF7FF4FFFFFFFF4FFB3
-:1025C00046FF90FFFFFF74FF8DFF83FFFFFF70FF4B
-:1025D00047FF90FFFFFF00FF00FF48FFFFFF04FFE2
-:1025E000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFE3
-:1025F00000FF0CFFFFFF20FF00FF0AFFFFFF1FFF90
-:1026000046FF84FFFFFF00FF00FF34FFFFFF08FFCE
-:1026100000FF34FFFFFF06FF00FF00FFFFFF00FF8A
-:1026200000FF00FFFFFF00FF46FF80FFFFFF10FFDE
-:1026300000FF00FFFFFF00FF00FF00FFFFFF00FFA4
-:1026400000FF00FFFFFF00FF00FF00FFFFFF00FF94
-:1026500046FF80FFFFFF23FFFFFF93FFFFFFE0FF29
-:1026600000FF68FFFFFF32FF00FF60FFFFFF72FF08
-:1026700067FF40FFFFFF40FFFFFF93FFFFFFE0FF0B
-:1026800000FF00FFFFFF00FF00FF00FFFFFF00FF54
-:1026900000FF00FFFFFF00FF00FF00FFFFFF00FF44
-:1026A00046FF90FFFFFF67FFF7FF4FFFFFFFF4FFBD
-:1026B00046FF90FFFFFF74FF8DFF83FFFFFF70FF5A
-:1026C00047FF90FFFFFF00FF00FF48FFFFFF04FFF1
-:1026D000A0FF23FFFFFF0FFF46FF90FFFFFF6AFFF2
-:1026E00000FF0CFFFFFF20FF00FF0AFFFFFF1FFF9F
-:1026F00046FF80FFFFFF05FF03FF0DFFFFFF0FFFFA
-:1027000000FF00FFFFFF00FF00FF00FFFFFF00FFD3
-:1027100000FF00FFFFFF00FF00FF00FFFFFF00FFC3
-:102720000CFF0DFFFFFFF5FF00FF00FFFFFF00FFA5
-:1027300000FF00FFFFFF00FF00FF00FFFFFF00FFA3
-:1027400000FF00FFFFFF00FFF7FF4FFFFFFFF4FF59
-:1027500046FF90FFFFFF74FF8DFF83FFFFFF70FFB9
-:1027600047FF90FFFFFF00FF00FF48FFFFFF04FF50
-:10277000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF51
-:1027800000FF0CFFFFFF20FF00FF0AFFFFFF1FFFFE
-:1027900046FF80FFFFFF00FF8DFF93FFFFFFC0FF9D
-:1027A0008DFF83FFFFFFC7FF46FF90FFFFFF67FF1F
-:1027B000F7FF4FFFFFFFF4FF46FF90FFFFFF74FF9F
-:1027C0008DFF83FFFFFF70FF47FF90FFFFFF00FFBC
-:1027D00000FF48FFFFFF04FFA0FF23FFFFFF0FFFE5
-:1027E00046FF90FFFFFF6AFF00FF0CFFFFFF20FF87
-:1027F00000FF0AFFFFFF1FFF46FF80FFFFFF00FFF4
-:102800008DFF93FFFFFFE0FF8DFF83FFFFFFE7FFDB
-:1028100000FF00FFFFFF00FF00FF00FFFFFF00FFC2
-:1028200000FF00FFFFFF00FF00FF00FFFFFF00FFB2
-:1028300046FF90FFFFFF67FFF7FF4FFFFFFFF4FF2B
-:1028400046FF90FFFFFF74FF8DFF83FFFFFF70FFC8
-:1028500047FF90FFFFFF00FF00FF48FFFFFF04FF5F
-:10286000A0FF23FFFFFF0FFF46FF90FFFFFF6AFF60
-:1028700000FF0CFFFFFF20FF00FF0AFFFFFF1FFF0D
-:102880008DFF83FFFFFFD0FF00FF40FFFFFF24FF0E
-:10289000A0FF23FFFFFF0FFF11FF90FFFFFF6AFF65
-:1028A00000FF40FFFFFF14FF18FF23FFFFFF0FFF94
-:1028B00051FF14FFFFFF81FF90FF80FFFFFF60FFCC
-:1028C00080FF23FFFFFF0FFF8DFF83FFFFFFD0FF80
-:1028D00000FF40FFFFFF14FFA0FF23FFFFFF0FFFDC
-:1028E00011FF90FFFFFF6AFF30FF0CFFFFFF00FFAB
-:1028F00000FF40FFFFFF16FF10FF40FFFFFF07FF35
-:1029000090FF34FFFFFF71FF00FF34FFFFFF09FF5F
-:102910000FFF40FFFFFFF5FF00FF60FFFFFF07FF16
-:1029200088FF63FFFFFF27FFE8FF60FFFFFF07FF50
-:1029300062FF61FFFFFF27FF88FF2BFFFFFF8BFF79
-:10294000E8FF60FFFFFF07FF62FF61FFFFFF17FF68
-:1029500088FF2FFFFFFFFBFF89FF23FFFFFF0FFF14
-:1029600098FF20FFFFFF0FFFEAFF20FFFFFF0FFF91
-:1029700000FF0DFFFFFFABFF00FF0DFFFFFFB8FFE4
-:1029800000FF0DFFFFFFCFFF62FF21FFFFFF0FFFE3
-:1029900010FF22FFFFFF0FFF62FF21FFFFFF0FFF6E
-:1029A00000FF40FFFFFF24FF90FF80FFFFFF60FF5D
-:1029B00080FF23FFFFFF0FFF51FF18FFFFFF00FF06
-:1029C0008BFF93FFFFFFEBFF8BFF93FFFFFFFCFFEE
-:1029D00000FF0AFFFFFF0FFF51FF1CFFFFFF0FFF6C
-:1029E0008DFF93FFFFFFACFF82FF3CFFFFFF45FF22
-:1029F00054FF14FFFFFF2EFFFFFF3FFFFFFFF5FF18
-:102A000054FF14FFFFFF1EFF00FF00FFFFFF00FF4A
-:102A100000FF00FFFFFF00FF51FF1CFFFFFF0FFF44
-:102A200000FF0DFFFFFF0CFF8DFF83FFFFFFA4FFE3
-:102A3000E0FF22FFFFFF0FFF53FF18FFFFFFB3FF71
-:102A40008DFF83FFFFFFD0FF00FF40FFFFFF24FF4C
-:102A5000A0FF23FFFFFF0FFF00FF0DFFFFFFBAFFE7
-:102A60008BFF83FFFFFFF5FF11FF90FFFFFF6BFF61
-:102A700000FF40FFFFFF14FF18FF23FFFFFF0FFFC2
-:102A800055FF14FFFFFF21FF90FF80FFFFFF60FF56
-:102A900080FF23FFFFFF0FFF00FF40FFFFFF20FF2E
-:102AA00000FF40FFFFFF01FF8BFF83FFFFFFE4FFFD
-:102AB0008BFF83FFFFFFF5FF08FF0CFFFFFF00FF09
-:102AC00060FF22FFFFFF0FFF49FF2AFFFFFFEAFF22
-:102AD00000FF0DFFFFFF4EFF8BFF93FFFFFFEEFF99
-:102AE00000FF0DFFFFFF5AFF8BFF93FFFFFFFAFF71
-:102AF0008DFF83FFFFFF20FF8DFF83FFFFFF31FF6F
-:102B0000E0FF22FFFFFF0FFFC9FF2AFFFFFFEAFFE1
-:102B100054FF18FFFFFFD5FF00FF0DFFFFFF4EFF23
-:102B200000FF0DFFFFFF5AFF82FF4FFFFFFFF0FF87
-:102B3000FFFF4FFFFFFFF1FFE0FF22FFFFFF0FFF4F
-:102B4000C9FF2AFFFFFFEAFF56FF18FFFFFFB4FF90
-:102B500054FF18FFFFFFDFFF00FF40FFFFFF20FFD4
-:102B600047FF90FFFFFF20FF0CFF0CFFFFFF00FF60
-:102B700002FF40FFFFFF60FF11FF90FFFFFF20FFFC
-:102B800016FF18FFFFFF4FFF8DFF83FFFFFFD0FFF2
-:102B900000FF40FFFFFF24FFA0FF23FFFFFF0FFF09
-:102BA00011FF90FFFFFF6AFF00FF40FFFFFF14FFD0
-:102BB00018FF23FFFFFF0FFF57FF14FFFFFF91FFD9
-:102BC00090FF80FFFFFF60FF80FF23FFFFFF0FFFED
-:102BD0008DFF83FFFFFFD0FF00FF40FFFFFF14FFCB
-:102BE000A0FF23FFFFFF0FFF11FF90FFFFFF6AFF12
-:102BF00030FF0CFFFFFF00FF00FF40FFFFFF16FF4D
-:102C000010FF40FFFFFF07FF90FF34FFFFFF71FF42
-:102C100000FF34FFFFFF09FF0FFF40FFFFFFF5FF3D
-:102C200000FF60FFFFFF07FF88FF63FFFFFF27FF35
-:102C3000E8FF60FFFFFF07FF62FF61FFFFFF27FF65
-:102C400088FF2BFFFFFF8BFFE8FF60FFFFFF07FF01
-:102C500062FF61FFFFFF17FF88FF2FFFFFFFFBFFF2
-:102C600089FF23FFFFFF0FFF98FF20FFFFFF0FFFEC
-:102C7000EAFF20FFFFFF0FFF00FF0DFFFFFFABFF8D
-:102C800000FF0DFFFFFFB8FF00FF0DFFFFFFCFFFAD
-:102C900062FF21FFFFFF0FFF10FF22FFFFFF0FFF6B
-:102CA00062FF21FFFFFF0FFF00FF40FFFFFF24FF38
-:102CB00090FF80FFFFFF60FF80FF23FFFFFF0FFFFC
-:102CC00057FF18FFFFFF10FF8BFF93FFFFFFEBFF86
-:102CD0008BFF93FFFFFFFCFF5CFF1CFFFFFF3FFF2D
-:102CE00000FF0AFFFFFF0FFF57FF1CFFFFFF1FFF43
-:102CF0008DFF93FFFFFFACFF82FF3CFFFFFF45FF0F
-:102D00005AFF14FFFFFF4EFFFFFF3FFFFFFFF5FFDE
-:102D10005AFF14FFFFFF3EFF00FF00FFFFFF00FF11
-:102D200000FF00FFFFFF00FF57FF1CFFFFFF1FFF1B
-:102D300000FF0DFFFFFF0CFF8DFF83FFFFFFA4FFD0
-:102D4000E0FF22FFFFFF0FFF59FF18FFFFFFD3FF38
-:102D50005CFF1CFFFFFF3FFF8DFF83FFFFFFD0FFE6
-:102D600000FF40FFFFFF24FFA0FF23FFFFFF0FFF37
-:102D700000FF0DFFFFFFBAFF8BFF83FFFFFFF5FF93
-:102D80005CFF1CFFFFFF3FFF11FF90FFFFFF6BFF8A
-:102D900000FF40FFFFFF14FF18FF23FFFFFF0FFF9F
-:102DA0005BFF14FFFFFF61FF90FF80FFFFFF60FFED
-:102DB00080FF23FFFFFF0FFF00FF40FFFFFF20FF0B
-:102DC00000FF40FFFFFF01FF8BFF83FFFFFFE4FFDA
-:102DD0008BFF83FFFFFFF5FF08FF0CFFFFFF00FFE6
-:102DE00060FF22FFFFFF0FFF49FF2AFFFFFFEAFFFF
-:102DF00000FF0DFFFFFF4EFF8BFF93FFFFFFEEFF76
-:102E00008BFF93FFFFFFFAFF5EFF1CFFFFFF0FFF2B
-:102E10005BFF18FFFFFF0FFF8BFF83FFFFFF20FF0C
-:102E200078FF22FFFFFF0FFF0DFF18FFFFFF05FFD9
-:102E300000FF0AFFFFFF0FFF08FF0CFFFFFF00FF6F
-:102E400000FF40FFFFFF14FF00FF40FFFFFF05FFF3
-:102E50008BFF83FFFFFFE0FF8BFF83FFFFFFF1FF8F
-:102E600060FF22FFFFFF0FFF49FF2AFFFFFFEAFF7E
-:102E70008BFF93FFFFFFFAFF8BFF93FFFFFFEEFF38
-:102E80000CFF0CFFFFFF00FF00FF0AFFFFFF0FFF1B
-:102E900008FF0CFFFFFF00FF00FF40FFFFFF14FFD4
-:102EA00000FF40FFFFFF05FF8BFF83FFFFFFE0FFF9
-:102EB0008BFF83FFFFFFF1FF60FF22FFFFFF0FFF8C
-:102EC00049FF2AFFFFFFEAFF8BFF93FFFFFFFAFF97
-:102ED0008BFF93FFFFFFEEFF0CFF0CFFFFFF00FFD8
-:102EE0008DFF83FFFFFF40FF78FF22FFFFFF0FFFF3
-:102EF0005EFF1CFFFFFF04FF00FF0AFFFFFF0FFF45
-:102F000008FF0CFFFFFF00FF8DFF83FFFFFF50FF57
-:102F100078FF22FFFFFF0FFF5FFF1CFFFFFF54FF43
-:102F20000FFF40FFFFFFF5FF90FF80FFFFFFA8FFAF
-:102F300010FF0FFFFFFF08FF90FF80FFFFFF90FFD4
-:102F400088FF27FFFFFF0FFFB6FF27FFFFFF0FFFE1
-:102F50008BFF83FFFFFFFAFFF2FF22FFFFFF0FFF50
-:102F600000FF0DFFFFFF0AFF00FF40FFFFFF14FF00
-:102F7000E2FF22FFFFFF0FFF74FF18FFFFFFE2FFDA
-:102F800038FF23FFFFFF0FFF00FF40FFFFFF24FF7D
-:102F9000E2FF22FFFFFF0FFF74FF18FFFFFFE2FFBA
-:102FA00000FF0AFFFFFF0FFF0FFF40FFFFFFF5FFCE
-:102FB00090FF80FFFFFF80FF8BFF83FFFFFFE2FF9B
-:102FC00088FF27FFFFFF0FFF98FF20FFFFFF0FFF86
-:102FD00010FF40FFFFFF07FFE8FF20FFFFFF0FFF8D
-:102FE00000FF0DFFFFFFACFFF2FF22FFFFFF0FFF0F
-:102FF00000FF0DFFFFFF0AFF01FF40FFFFFF04FF7F
-:10300000E2FF22FFFFFF0FFF74FF18FFFFFFE2FF49
-:1030100038FF23FFFFFF0FFF02FF40FFFFFF04FF0A
-:10302000E2FF22FFFFFF0FFF74FF18FFFFFFE2FF29
-:1030300000FF0AFFFFFF0FFF00FF34FFFFFF08FF45
-:1030400000FF34FFFFFFD4FF00FF34FFFFFF85FFC9
-:10305000FFFF4FFFFFFF89FF00FF09FFFFFF01FF99
-:1030600089FF83FFFFFFB8FF00FF0EFFFFFF0FFF89
-:1030700000FF0DFFFFFF4EFFA7FF23FFFFFF0FFF26
-:1030800000FF68FFFFFFA3FF89FF83FFFFFFA8FF8B
-:1030900000FF0EFFFFFF0FFF00FF0DFFFFFF4EFFC2
-:1030A000A7FF23FFFFFF0FFF00FF68FFFFFFA3FF46
-:1030B00000FF09FFFFFF03FF8BFF83FFFFFFB0FF50
-:1030C00000FF68FFFFFF00FF00FF0AFFFFFF0FFF89
-:1030D00002FF35FFFFFF00FF00FF34FFFFFF08FF87
-:1030E00000FF34FFFFFF26FF89FF83FFFFFFD8FFAC
-:1030F00000FF0EFFFFFF0FFF00FF0DFFFFFF4EFF62
-:10310000A7FF23FFFFFF0FFF00FF68FFFFFFA3FFE5
-:1031100089FF83FFFFFFC8FF00FF0EFFFFFF0FFFC8
-:1031200000FF0DFFFFFF4EFFA7FF23FFFFFF0FFF75
-:1031300000FF68FFFFFFA3FF00FF09FFFFFF03FF82
-:103140008BFF83FFFFFFD0FF00FF68FFFFFF02FF41
-:1031500001FF40FFFFFF80FF00FF68FFFFFF02FF4E
-:1031600000FF40FFFFFF20FF00FF68FFFFFF03FF9E
-:1031700000FF0AFFFFFF0FFF00FF40FFFFFF10FFF0
-:103180008BFF93FFFFFF40FF30FF40FFFFFF00FF7B
-:1031900049FF90FFFFFF40FF00FF0AFFFFFF0FFF07
-:1031A00000FF40FFFFFF60FF00FF91FFFFFFF0FF08
-:1031B00000FF0AFFFFFF0FFF01FF42FFFFFF80FF3D
-:1031C00000FF91FFFFFF70FF07FF42FFFFFF80FF3F
-:1031D00003FF91FFFFFF70FF02FF42FFFFFF00FFB1
-:1031E00000FF91FFFFFFF0FF08FF42FFFFFF00FF1E
-:1031F00003FF91FFFFFFF0FF00FF40FFFFFF20FFF5
-:1032000001FF91FFFFFF70FF00FF40FFFFFF20FF66
-:1032100004FF91FFFFFF70FF00FF0AFFFFFF0FFF9A
-:1032200004FF42FFFFFF00FF49FF90FFFFFF20FF69
-:1032300062FF1CFFFFFFFFFF00FF0AFFFFFF0FFF02
-:1032400000FF40FFFFFF20FF00FF91FFFFFFF0FFA7
-:1032500001FF42FFFFFF00FF49FF90FFFFFF20FF3C
-:1032600062FF1CFFFFFFFFFF00FF0AFFFFFF0FFFD2
-:1032700000FF40FFFFFF40FF8BFF93FFFFFF80FF3A
-:1032800005FF35FFFFFF00FF92FF3BFFFFFF00FF41
-:1032900000FF34FFFFFF08FF00FF38FFFFFF08FFBC
-:1032A00000FF3CFFFFFF65FF65FF14FFFFFF9EFF70
-:1032B00000FF60FFFFFF03FF00FF60FFFFFF13FF42
-:1032C00000FF78FFFFFF13FF00FF78FFFFFF03FF02
-:1032D00001FF42FFFFFF00FF49FF90FFFFFF20FFBC
-:1032E00062FF1CFFFFFFFFFF05FF81FFFFFFC0FF25
-:1032F00078FF22FFFFFF0FFF21FF18FFFFFF71FF85
-:1033000000FF0AFFFFFF0FFF49FF80FFFFFF48FF9D
-:1033100010FF0FFFFFFF03FF66FF23FFFFFF0FFFFD
-:1033200074FF18FFFFFF54FF86FF83FFFFFFC0FFFE
-:1033300049FF90FFFFFF20FF62FF1CFFFFFFFFFF21
-:1033400086FF83FFFFFF80FF01FF40FFFFFF04FFB9
-:10335000E0FF22FFFFFF0FFF86FF93FFFFFF8AFFC3
-:1033600067FF1CFFFFFF00FF86FF87FFFFFFD0FF07
-:1033700075FF1CFFFFFF1FFF00FF0AFFFFFF0FFF8E
-:1033800000FF48FFFFFF00FF82FF93FFFFFF40FFAA
-:1033900000FF0AFFFFFF0FFF08FF0CFFFFFF00FF0A
-:1033A00086FF8BFFFFFFB0FF00FF38FFFFFF08FF26
-:1033B00000FF38FFFFFFF4FFFFFF4FFFFFFF89FF14
-:1033C0008DFF83FFFFFF60FF89FF83FFFFFF44FF47
-:1033D00000FF40FFFFFF01FF89FF83FFFFFF55FF55
-:1033E00060FF26FFFFFF0FFF49FF22FFFFFF0FFFD8
-:1033F00000FF78FFFFFFA3FF10FF22FFFFFF0FFF7B
-:1034000000FF78FFFFFFA0FF8DFF83FFFFFF60FF3E
-:1034100089FF83FFFFFF24FF00FF40FFFFFF01FF45
-:1034200089FF83FFFFFF35FF60FF26FFFFFF0FFFD0
-:1034300049FF22FFFFFF0FFF00FF78FFFFFFA3FF01
-:1034400010FF22FFFFFF0FFF00FF78FFFFFFA3FF2A
-:103450008DFF83FFFFFF60FF20FF40FFFFFF04FFA2
-:1034600060FF22FFFFFF0FFF8DFF93FFFFFF6AFF4B
-:103470000CFF0CFFFFFF00FF00FF0AFFFFFF0FFF25
-:1034800008FF0CFFFFFF00FF86FF87FFFFFFB0FF75
-:1034900000FF34FFFFFF08FF01FF34FFFFFF04FFC1
-:1034A00000FF34FFFFFF35FFFFFF4FFFFFFF89FFE6
-:1034B00000FF09FFFFFF01FF87FF8BFFFFFFE0FF1A
-:1034C00000FF38FFFFFF88FF00FF70FFFFFF03FFD3
-:1034D00000FF68FFFFFF00FF00FF70FFFFFF03FF1B
-:1034E00000FF68FFFFFF03FF87FF9BFFFFFFE0FF79
-:1034F0000CFF0CFFFFFF00FF00FF0AFFFFFF0FFFA5
-:1035000001FF3CFFFFFF05FF6AFF14FFFFFF9EFF67
-:1035100067FF1CFFFFFF3FFF69FF1CFFFFFF0FFF5F
-:1035200066FF1CFFFFFF1FFF38FF22FFFFFF0FFF9B
-:103530006AFF14FFFFFF85FF8BFF83FFFFFF40FF44
-:1035400078FF22FFFFFF0FFF00FF00FFFFFF00FFDC
-:1035500000FF0AFFFFFF0FFF82FF83FFFFFF40FF17
-:1035600078FF22FFFFFF0FFF6AFF1CFFFFFFF4FF42
-:1035700000FF0AFFFFFF0FFF00FF40FFFFFF10FFEC
-:1035800047FF90FFFFFF20FF87FF83FFFFFFF0FF54
-:1035900086FF93FFFFFF80FF00FF40FFFFFF00FF5C
-:1035A0008DFF93FFFFFF60FF82FF93FFFFFF40FF50
-:1035B00086FF87FFFFFF90FF02FF34FFFFFF08FF3A
-:1035C00000FF60FFFFFF03FF89FF93FFFFFF20FF66
-:1035D00000FF60FFFFFF03FF89FF93FFFFFF30FF46
-:1035E00000FF60FFFFFF03FF89FF93FFFFFF40FF26
-:1035F00000FF60FFFFFF03FF89FF93FFFFFF50FF06
-:1036000086FF97FFFFFF90FF00FF0AFFFFFF0FFFFE
-:1036100000FF34FFFFFF64FF00FF34FFFFFF35FFB3
-:1036200001FF34FFFFFF96FF00FF38FFFFFF34FF6D
-:1036300000FF38FFFFFF65FF01FF38FFFFFF96FF28
-:1036400000FF38FFFFFF08FF02FF34FFFFFF49FFC5
-:1036500002FF38FFFFFF49FF10FF40FFFFFF06FF9B
-:1036600010FF40FFFFFF02FF30FF0CFFFFFF00FFD6
-:1036700000FF3CFFFFFF25FF6DFF14FFFFFFBEFFB4
-:1036800098FF50FFFFFF73FF88FF50FFFFFF73FF9E
-:1036900083FF68FFFFFFC5FF88FF68FFFFFFC4FFD0
-:1036A00083FF68FFFFFFC5FF00FF68FFFFFFC6FF46
-:1036B00098FF50FFFFFF73FF88FF50FFFFFF73FF6E
-:1036C00083FF78FFFFFFC4FF88FF78FFFFFFC5FF80
-:1036D00083FF78FFFFFFC4FF00FF78FFFFFFC6FFF7
-:1036E00098FF50FFFFFF73FF88FF50FFFFFF73FF3E
-:1036F00083FF68FFFFFFC5FF88FF68FFFFFFC4FF70
-:1037000083FF68FFFFFFC5FF00FF68FFFFFFC6FFE5
-:1037100000FF3CFFFFFF25FF6EFF14FFFFFF8EFF42
-:1037200098FF50FFFFFF73FF88FF50FFFFFF73FFFD
-:1037300083FF78FFFFFFC4FF88FF78FFFFFFC4FF10
-:1037400000FF78FFFFFFC4FF20FF0CFFFFFF00FF1B
-:1037500000FF0AFFFFFF0FFF00FF34FFFFFFE9FF3D
-:1037600001FF38FFFFFF28FF01FF38FFFFFF29FFA0
-:1037700000FF38FFFFFF66FF00FF38FFFFFF34FF49
-:1037800000FF38FFFFFF75FF10FF40FFFFFF06FF40
-:1037900000FF41FFFFFF07FF30FF0CFFFFFF00FFAF
-:1037A00098FF70FFFFFF20FF00FF3CFFFFFF25FF9A
-:1037B00070FF14FFFFFF2EFF80FF70FFFFFF42FF2F
-:1037C00063FF72FFFFFF20FF80FF68FFFFFFA7FF7F
-:1037D00000FF70FFFFFF41FF63FF72FFFFFF24FF49
-:1037E00080FF68FFFFFFA7FF00FF70FFFFFF46FF9E
-:1037F00063FF72FFFFFF24FF80FF68FFFFFFA7FF4B
-:1038000000FF70FFFFFF45FF63FF72FFFFFF20FF18
-:1038100000FF68FFFFFFA7FF80FF70FFFFFF42FF71
-:1038200063FF72FFFFFF20FF80FF70FFFFFF41FF7C
-:1038300063FF6AFFFFFFA7FF00FF70FFFFFF24FF8A
-:1038400080FF68FFFFFFA7FF00FF70FFFFFF44FF3F
-:1038500063FF72FFFFFF24FF80FF68FFFFFFA7FFEA
-:10386000F0FF40FFFFFF05FF00FF4FFFFFFF04FFDA
-:1038700000FF0DFFFFFF0BFF80FF27FFFFFF0FFF84
-:1038800088FF23FFFFFF0FFFEAFF20FFFFFF0FFF6F
-:1038900074FF22FFFFFF0FFF00FF68FFFFFFA7FF7E
-:1038A00000FF70FFFFFF24FF80FF70FFFFFF44FF5A
-:1038B00063FF72FFFFFF24FF80FF68FFFFFFA7FF8A
-:1038C00000FF4FFFFFFF04FF00FF0DFFFFFF0BFF97
-:1038D00080FF27FFFFFF0FFF88FF23FFFFFF0FFF82
-:1038E000EAFF20FFFFFF0FFF74FF22FFFFFF0FFF24
-:1038F00000FF68FFFFFFA7FF00FF0AFFFFFF0FFFAA
-:1039000038FF22FFFFFF0FFF72FF14FFFFFF35FF9D
-:103910008BFF83FFFFFF30FF78FF22FFFFFF0FFFCA
-:1039200000FF0AFFFFFF0FFF0EFF40FFFFFF00FF3A
-:1039300010FF90FFFFFF10FF08FF40FFFFFF00FF99
-:1039400010FF90FFFFFF90FF02FF40FFFFFF40FFCF
-:1039500011FF90FFFFFF20FF00FF40FFFFFF00FF70
-:1039600010FF90FFFFFFB0FFB0FF40FFFFFF00FF21
-:1039700047FF90FFFFFF50FF30FF40FFFFFF00FFBA
-:1039800047FF90FFFFFF40FF78FF42FFFFFF50FF20
-:1039900048FF90FFFFFFA0FF40FF40FFFFFF00FF39
-:1039A00049FF90FFFFFF70FF18FF40FFFFFF00FF80
-:1039B00047FF90FFFFFF70FF18FF40FFFFFF10FF62
-:1039C00047FF90FFFFFF70FF18FF40FFFFFF00FF62
-:1039D00047FF90FFFFFF70FF00FF40FFFFFF00FF6A
-:1039E00011FF90FFFFFF60FF8DFF93FFFFFFD0FFF0
-:1039F0000BFF40FFFFFF80FF11FF90FFFFFFF0FF75
-:103A000000FF40FFFFFF10FF11FF90FFFFFFE0FFEF
-:103A100000FF48FFFFFF00FF00FF93FFFFFF00FFD5
-:103A200000FF0AFFFFFF0FFF08FF40FFFFFF00FF3F
-:103A300047FF90FFFFFF20FF22FF18FFFFFF9FFFC0
-:103A400000FF48FFFFFF10FF86FF93FFFFFF70FF9F
-:103A500022FF18FFFFFF9FFF00FF48FFFFFF00FF4F
-:103A600086FF93FFFFFF70FF22FF18FFFFFF9FFFFE
-:103A700000FF48FFFFFF20FF86FF93FFFFFF70FF5F
-:103A800022FF18FFFFFF9FFF00FF34FFFFFF48FFEB
-:103A900000FF60FFFFFF03FF86FF93FFFFFFB0FF04
-:103AA00000FF60FFFFFF03FF86FF93FFFFFFC0FFE4
-:103AB00086FF97FFFFFFD0FF00FF0AFFFFFF0FFF0A
-:103AC00080FF37FFFFFF02FF84FF3BFFFFFF02FF86
-:103AD00000FF60FFFFFF0BFF0CFF0DFFFFFF90FFDC
-:103AE00000FF70FFFFFF0BFF0CFF0DFFFFFFB0FF9C
-:103AF00088FF37FFFFFF03FF8CFF3BFFFFFF03FF44
-:103B000000FF40FFFFFF01FF8BFF93FFFFFF51FF0F
-:103B100082FF43FFFFFF80FF8BFF93FFFFFF60FFEC
-:103B200000FF34FFFFFF89FF00FF40FFFFFF00FFA2
-:103B30000CFF0DFFFFFF80FF0CFF0DFFFFFFA0FF3D
-:103B400000FF0AFFFFFF0FFF80FF37FFFFFF00FFAF
-:103B500000FF34FFFFFF08FF02FF3CFFFFFF45FFB0
-:103B600076FF14FFFFFFDEFF00FFA0FFFFFF03FF54
-:103B700084FF37FFFFFF00FF00FF34FFFFFF08FF58
-:103B800002FF3CFFFFFF45FF77FF14FFFFFF2EFF03
-:103B900000FFA0FFFFFF03FF7EFF38FFFFFF00FFD6
-:103BA00000FF38FFFFFF08FF00FF3CFFFFFFE5FFBE
-:103BB00077FF14FFFFFF8EFF00FF40FFFFFF00FFB6
-:103BC00000FF58FFFFFF03FF00FF0AFFFFFF0FFF8B
-:103BD00064FF1CFFFFFF4FFF38FF22FFFFFF0FFFB7
-:103BE00077FF14FFFFFFE5FF8BFF83FFFFFF40FF21
-:103BF00078FF22FFFFFF0FFF64FF1CFFFFFF8FFF17
-:103C000038FF22FFFFFF0FFF78FF14FFFFFF35FF94
-:103C10008BFF83FFFFFF40FF78FF22FFFFFF0FFFB7
-:103C200000FF0AFFFFFF0FFF00FF34FFFFFF09FF48
-:103C300000FF34FFFFFF85FF00FF34FFFFFF56FF4B
-:103C400000FF09FFFFFF06FF20FF40FFFFFF00FF0F
-:103C500001FF40FFFFFFC1FF00FF40FFFFFF44FFE8
-:103C600000FF68FFFFFF05FF00FF68FFFFFF15FF74
-:103C700000FF68FFFFFF05FF00FF68FFFFFF45FF34
-:103C800000FF0AFFFFFF0FFF86FF87FFFFFFF0FF28
-:103C900086FF8BFFFFFFE0FF00FF34FFFFFFC8FF41
-:103CA00000FF38FFFFFFC8FF00FF60FFFFFF03FFBB
-:103CB00000FF60FFFFFF13FF00FF78FFFFFF13FF10
-:103CC00000FF78FFFFFF03FF86FF97FFFFFFF0FF76
-:103CD00086FF9BFFFFFFE0FF05FF81FFFFFFC0FFA7
-:103CE00078FF22FFFFFF0FFF21FF18FFFFFF71FF8B
-:103CF00000FF0AFFFFFF0FFF7FFF38FFFFFF01FFFD
-:103D000000FF38FFFFFF09FF00FF38FFFFFF06FF3E
-:103D10007EFF40FFFFFF00FF00FF40FFFFFFB1FFFE
-:103D200008FF0CFFFFFF00FF00FF3CFFFFFFC5FF88
-:103D30007AFF14FFFFFFBEFF00FF50FFFFFF46FFAB
-:103D4000E1FF22FFFFFF0FFF7AFF1CFFFFFFE0FFF5
-:103D500060FF22FFFFFF0FFF00FF58FFFFFFA7FFDD
-:103D60000CFF0CFFFFFF00FF00FF0AFFFFFF0FFF2C
-:103D700000FF40FFFFFFC4FF00FF0AFFFFFF0FFF30
-:103D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43
-:043D9000FFFFFFFF33
-:00000001FF
diff --git a/firmware/matrox/g200_warp.H16 b/firmware/matrox/g200_warp.H16
deleted file mode 100644
index 5064b6f01bb4..000000000000
--- a/firmware/matrox/g200_warp.H16
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * WARP pipes are named according to the functions they perform, where
- *
- * - T stands for computation of texture stage 0
- * - T2 stands for computation of both texture stage 0 and texture stage 1
- * - G stands for computation of triangle intensity (Gouraud interpolation)
- * - Z stands for computation of Z buffer interpolation
- * - S stands for computation of specular highlight
- * - A stands for computation of the alpha channel
- * - F stands for computation of vertex fog interpolation
- */
-/* TGZ */
-:04B8000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E9728007EA241F20E9154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E2608015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E803800AEA17C12BBD008000E8008000E8B3689725008000E833C033AF3C274FE9573920E9281960EC2B3220E91D3B20E9B30500E0162820E9233B33AD1E2B20E91C8020E9573620E90080A0E94040D8ECFF80C0E990E200E085FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E884FF0AEA008000E8C941C8EC42E100E082FF20EA008000E8008000E8008000E8C840C0EC008000E87FFF20EA008000E8008000E8008000E871
-/* TGZF */
-:0548000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E97F8007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E26B8015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E80D211AB6052131B603802AEA17C12BBD0D2005202FC021C6B3689725008000E833C033AF3C274FE91750569F008000E8370F5C9F00E02F20008000E8281960ECB30500E0008000E8233B33AD008000E8172617DF35174FE9008000E8008000E8008000E839374FE92F2F17AF008000E8008000E8008000E831804FE9008000E8008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E078FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E877FF0AEA008000E8C941C8EC42E100E075FF20EA008000E8008000E8008000E8C840C0EC008000E872FF20EA008000E8008000E8008000E8BB
-/* TGZA */
-:04E80000000098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E97D8007EA241F20E9154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E26B8015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E82D444CB6254454B603802AEA17C12BBD2D20252007C044C6B3689725008000E833C033AF3C274FE91F62579F008000E83F3D5D9F00E00720008000E8281960ECB30500E0008000E8233B33AD008000E81F261FDF9D1F4FE9008000E8008000E8008000E89E3F4FE907071FAF008000E8008000E8008000E89C804FE9008000E8008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E07AFF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E879FF0AEA008000E8C941C8EC42E100E077FF20EA008000E8008000E8008000E8C840C0EC008000E874FF20EA008000E8008000E8008000E8D9
-/* TGZAF */
-:0568000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E9838007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E26F8015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E80D211AB6052131B62D444CB6254454B603802AEA17C12BBD0D2005202FC021C6B3689725008000E833C033AF3C274FE900E0252007C044C61750569F00E02D20370F5C9F00E02F201F62579F00E007203F3D5D9F008000E8008000E8281960ECB30500E0172617DF233B33AD35174FE91F261FDF9D1F4FE99E3F4FE939374FE92F2F17AF008000E807071FAF008000E831804FE9008000E89C804FE9008000E8008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E074FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E873FF0AEA008000E8C941C8EC42E100E071FF20EA008000E8008000E8008000E8C840C0EC008000E86EFF20EA008000E8008000E8008000E830
-/* TGZS */
-:05C0000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E98B8007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E2778015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E82D211AB0252131B00D211AB2052131B203802AEA17C12BBD2D20252005200D20B3689725008000E833C033AF2FC021C01642569F3C274FE91E62579F008000E8252131B42D211AB43F2F5D9F008000E8330500E0281960EC370F5C9F00E02F20233B33AD1E261EDFA71E4FE9172616DF2D2000E0A83F4FE92F2F1EAF252000E0A4164FE90FC021C2A6804FE91F62579F3F2F5D9F00E08F20A5374FE90F170FAF06C021C4008000E8008000E8A3804FE9062000E01F261FDFA11F4FE9A23F4FE9008000E8008000E806061FAF008000E8008000E8008000E8A0804FE9008000E8008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E06CFF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E86BFF0AEA008000E8C941C8EC42E100E069FF20EA008000E8008000E8008000E8C840C0EC008000E866FF20EA008000E8008000E8008000E85C
-/* TGZSF */
-:05E0000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E98F8007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E27B8015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E82D211AB0252131B00D211AB2052131B203802AEA17C12BBD2D20252005200D20B3689725008000E833C033AF2FC021C01642569F3C274FE91E62579F008000E8252131B42D211AB43F2F5D9F008000E8330500E0281960EC0D211AB6052131B6370F5C9F00E02F20233B33AD1E261EDFA71E4FE9172616DF2D2000E0A83F4FE92F2F1EAF252000E0A4164FE90FC021C2A6804FE91F62579F0D2005202FC021C63F2F5D9F00E00F201750569FA5374FE906C021C40F170FAF370F5C9F008000E82F2000E0A3804FE9062000E01F261FDF172617DF35174FE9A11F4FE9A23F4FE906061FAF39374FE92F2F17AF008000E8A0804FE9008000E831804FE9008000E8008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E068FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E867FF0AEA008000E8C941C8EC42E100E065FF20EA008000E8008000E8008000E8C840C0EC008000E862FF20EA008000E8008000E8008000E8F9
-/* TGZSA */
-:05E0000000008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E98F8007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E27B8015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E82D211AB0252131B00D211AB2052131B203802AEA17C12BBD2D20252005200D20B3689725008000E833C033AF2FC021C01642569F3C274FE91E62579F008000E8252131B42D211AB43F2F5D9F008000E8330500E0281960EC0D444CB6054454B6370F5C9F00E02F20233B33AD1E261EDFA71E4FE9172616DF2D2000E0A83F4FE92F2F1EAF252000E0A4164FE90FC021C2A6804FE91F62579F0D200520008000E83F2F5D9F00E00F201750569FA5374FE906C021C40F170FAF370F5C9F008000E82FC044C6A3804FE9062000E01F261FDF172617DF9D174FE9A11F4FE9A23F4FE906061FAF00E0AF209E374FE92F172FAFA0804FE9008000E8008000E89C804FE9008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E068FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E867FF0AEA008000E8C941C8EC42E100E065FF20EA008000E8008000E8008000E8C840C0EC008000E862FF20EA008000E8008000E8008000E883
-/* TGZAF */
-:05B8000000008000E8008000E8008000E8008000E8008000E8008000E80098A0E94040D8ECFF80C0E9008000E81FD718BD3FD722BD8104890401040904C941C0EC110400E041CC41CD49CC49CDD141C0EC51CC51CD80041004080400E000CCC0CDD149C0EC8A1F20E98B3F20E9413C41AD493C49AD10CC10CD08CC08CDB94149BB1FF041CD513C51AD009880E9948007EA241F20E9214580E81A4D80E8315580E8008000E8154149BD1D4151BD2E412AB83453A0E815301D3058E300E0B54048BD3D4050BD2443A0E82C4BA0E8157209E300E01D723530B530BD303D309C97579F008000E86C64C8EC98E1B505BD052E3032C0A0E833C0A0E87464C8EC403C40AD326A2A302073336A00E028731C7283E2808015EAB83D28DF303520DF403000E0CCE26472254252BF2D424ABF302E30DF382E38DF181D45E91E1545E92B4951BD00E01F73383840AF303040AF241F24DF1D3220E92C1F2CDF1A3320E9B01008E34010B81026F030CD2FF038CD2B8020E92A8020E9A62088E200E0AF20282A26AF202AC0AF341F34DF462446DF283080BF203880BF472447DF4E2C4EDF4F2C4FDF563456DF281528DF201D20DF573457DF00E01D05048010EA89E22B303FC11DBD008000E8008000E8008000E8A068BF25008000E820C020AF2805977400E02A1016C020E9048010EA8CE2950528C128AD1FC115BD008000E8008000E8A8679F6B008000E828C028AD1D252005283280AD402A40BD1C8020E9203320AD207300E0B64951BB262FB0E8192020E9352035DF3D203DDF152015DF1D201DDF26D026CD29492AB8264080BD3B4850BD3E54579F00E082E11EAF599F008000E826302930483C48AD2B72C2E12CC044C2052434BF0D242CBF2D464EBF254656BF201D6F8F323E5FE93E50569F00E03B301E8F519F331E5FE9054454B20D444CB219C0B0E834C044C4337300E03E62579F1EAF599F00E00D20843E58E9281D6F8F052000E0851E58E99B3B33DF202042AF3042569F803E57E93F8F519F30805FE9282824AF811E57E9054757BF0D474FBF888058E91B291BDF301D6F8F3A304FE91C3026DF09E33B053E50569F3B3F4FE91E8F519F00E0AC202D444CB42C1CC0AF254454B400E0C830304630AF1B1B48AF00E02520382C4FE9868057E9381D6F8F287400E00D444CB0054454B02D209B10823E57E932F01BCD1EBD599F831E57E9384738AF34202A3000E00D2032200520878057E91F54579F1742569F00E03B6A3F8F519F371E4FE937322AAF00E03200008000E827C044C0361F4FE91F1F26DF371B37BF172617DF3E174FE93F3F4FE9341F34AF2B05A720332B37DF2717C0AF34804FE9008000E82D211AB0252131B00D211AB2052131B203802AEA17C12BBD2D20252005200D20B3689725008000E833C033AF2FC021C01642569F3C274FE91E62579F008000E8252131B42D211AB43F2F5D9F008000E8330500E0281960EC0D211AB6052131B6370F5C9F00E02F20233B33AD1E261EDFA71E4FE9172616DF2D2000E0A83F4FE92F2F1EAF252000E0A4164FE90FC021C2A6804FE91F62579F0D2005202FC021C62D444CB6254454B63F2F5D9F00E00F202D20252007C044C61750569FA5374FE906C021C40F170FAF370F5C9F008000E81E62579F008000E83E3D5D9F00E007202F2000E0A30F4FE9062000E01F261FDF172617DFA11F4FE91E261EDF9D1E4FE935174FE9A23F4FE906061FAF39374FE92F2F17AF07071EAFA0804FE99E3E4FE931804FE99C804FE9008000E8573920E9162820E91D3B20E91E2B20E92B3220E91C2320E9573620E90080A0E94040D8ECFF80C0E990E200E063FF20EA19C8C1CD1FD718BD3FD722BD9F4149BD008000E8254149BD2D4151BD0D8007EA008000E8354048BD3D4050BD008000E825302D303530B530BD303D309CA75B9F008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E8008000E862FF0AEA008000E8C941C8EC42E100E060FF20EA008000E8008000E8008000E8C840C0EC008000E85DFF20EA008000E8008000E8008000E8D8
-:0000000001FF
diff --git a/firmware/matrox/g400_warp.H16 b/firmware/matrox/g400_warp.H16
deleted file mode 100644
index b432d1074d8d..000000000000
--- a/firmware/matrox/g400_warp.H16
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * WARP pipes are named according to the functions they perform, where
- *
- * - T stands for computation of texture stage 0
- * - T2 stands for computation of both texture stage 0 and texture stage 1
- * - G stands for computation of triangle intensity (Gouraud interpolation)
- * - Z stands for computation of Z buffer interpolation
- * - S stands for computation of specular highlight
- * - A stands for computation of the alpha channel
- * - F stands for computation of vertex fog interpolation
- */
-/* TGZ */
-:0338000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC31003900588015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF4A8007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF32322DDF22222DDF12122DDF3A3A2DDF473747DF573D57DF3DCF74C037CF74C431532F9F348020E939E52C9F3C3D20E90A444CB0024454B02A444CB21A4454B21D803AEA0A2002203DCF74C22A201A2030502E9F32315FE938212C9F33395FE931532F9F008000E82A444CB41A4454B439E52C9F383D20E988735EE92A201A202A464EBF1A4656BF31532F9F3E304FE939E52C9F3F384FE90A474FBF024757BF31532F9F3A314FE939E52C9F3B394FE92A434BBF1A4353BF30502E9F36314FE938212C9F37394FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E9AFFF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFD6FF20EA008000E84E334ECF573B57CF9DFF20EA57C0BFEA0080A0E90000D8EC59
-/* TGZF */
-:0360000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC310039005D8015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF4F8007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF32322DDF22222DDF12122DDF3A3A2DDF473747DF573D57DF3DCF74C037CF74C439E52C9F348020E931532F9F008000E888735EE9008000E827CF75C63C3D20E90A444CB0024454B02A444CB21A4454B220803AEA0A2002203DCF74C22A201A2030502E9F32315FE938212C9F33395FE931532F9F312720E90A444CB4024454B42A454DB61A4555B639E52C9F383D20E90A2002202A201A200A474FBF024757BF30502E9F3E304FE938212C9F3F384FE92A464EBF1A4656BF31532F9F3A314FE939E52C9F3B394FE931532F9F36304FE939E52C9F37384FE92A434BBF1A4353BF30502E9F35314FE938212C9F39394FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E9AAFF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFD3FF20EA008000E84E334ECF573B57CF98FF20EA57C0BFEA0080A0E90000D8EC90
-/* TGZA */
-:0358000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC310039005C8015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF4E8007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF32322DDF22222DDF12122DDF3A3A2DDF473747DF573D57DF3DCF74C037CF74C431532F9F348020E939E52C9F3C3D20E927CF74C63DCF74C20A444CB0024454B02A444CB21A4454B220803AEA0A20022088735EE92A201A2030502E9F32315FE938212C9F33395FE931532F9F9C2720E90A444CB4024454B42A444CB61A4454B639E52C9F383D20E90A2002202A201A200A474FBF024757BF30502E9F3E304FE938212C9F3F384FE92A464EBF1A4656BF31532F9F3A314FE939E52C9F3B394FE931532F9F36304FE939E52C9F37384FE92A434BBF1A4353BF30502E9F9D314FE938212C9F9E394FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E9ABFF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFD3FF20EA008000E84E334ECF573B57CF99FF20EA57C0BFEA0080A0E90000D8EC35
-/* TGZAF */
-:0380000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC31003900618015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF538007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF32322DDF22222DDF12122DDF3A3A2DDF473747DF573D57DF3DCF74C037CF74C40A444CB0024454B031532F9F343720E939E52C9F3C3D20E92A444CB21A4454B226803AEA0A20022088735EE92A201A203DCF74C227CF74C630502E9F32315FE938212C9F33395FE931532F9F9C2720E90A444CB4024454B42A444CB61A4454B639E52C9F383D20E90A2002202A201A203DCF75C6008000E830502E9F3E304FE938212C9F3F384FE90A454DB6024555B631532F9F3A314FE939E52C9F3B394FE9313D20E90A2002202A464EBF1A4656BF0A474FBF024757BF30502E9F36304FE938212C9F37384FE931532F9F9D314FE939E52C9F9E394FE92A434BBF1A4353BF30502E9F35304FE938212C9F39384FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E9A6FF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFCDFF20EA008000E84E334ECF573B57CF94FF20EA57C0BFEA0080A0E90000D8EC89
-/* TGZS */
-:03A0000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC31003900658015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF578007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF473747DF573D57DF32322DDF22222DDF12122DDF3A3A2DDF27CF74C237CF74C40A444CB0024454B03DCF74C0343720E931532F9F382720E939E52C9F3C3D20E92A444CB21A4454B229803AEA0A20022027CF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA62720E939E52C9FA33D20E92A444CB41A4454B40A454DB0024555B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE92A454DB21A4555B20A454DB4024555B438212C9F3B394FE90A2002202A201A202A464EBF1A4656BF31532F9F36314FE939E52C9F37394FE930502E9FA7304FE938212C9FA8384FE90A474FBF024757BF31532F9FA4314FE939E52C9FA5394FE92A434BBF1A4353BF30502E9FA1304FE938212C9FA2384FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E9A2FF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFCAFF20EA008000E84E334ECF573B57CF90FF20EA57C0BFEA0080A0E90000D8ECD8
-/* TGZSF */
-:03C8000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC310039006A8015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF5C8007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF473747DF573D57DF32322DDF22222DDF12122DDF3A3A2DDF27CF74C237CF74C40A444CB0024454B03DCF74C0343720E931532F9F382720E939E52C9F3C3D20E92A444CB21A4454B22E803AEA0A20022027CF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA62720E939E52C9FA33D20E92A444CB41A4454B40A454DB0024555B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A454DB21A4555B20A454DB4024555B427CF75C62A201A20A7304FE90A20022031532F9F312720E939E52C9FA8384FE92A454DB61A4555B630502E9F36314FE938212C9F37394FE9008000E82A201A202A464EBF1A4656BF31532F9FA4314FE939E52C9FA5394FE90A474FBF024757BF31532F9FA1304FE939E52C9FA2384FE92A434BBF1A4353BF30502E9F35314FE938212C9F39394FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E99DFF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFC5FF20EA008000E84E334ECF573B57CF8BFF20EA57C0BFEA0080A0E90000D8ECD3
-/* TGZSA */
-:03C8000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC310039006A8015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF5C8007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF473747DF573D57DF32322DDF22222DDF12122DDF3A3A2DDF27CF74C237CF74C40A444CB0024454B03DCF74C0343720E931532F9F382720E939E52C9F3C3D20E92A444CB21A4454B22E803AEA0A20022027CF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA62720E939E52C9FA33D20E92A444CB41A4454B40A454DB0024555B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A454DB21A4555B20A454DB4024555B427CF74C62A201A20A7304FE90A20022031532F9F9C2720E939E52C9FA8384FE92A444CB61A4454B630502E9F36314FE938212C9F37394FE9008000E82A201A202A464EBF1A4656BF31532F9FA4314FE939E52C9FA5394FE90A474FBF024757BF31532F9FA1304FE939E52C9FA2384FE92A434BBF1A4353BF30502E9F9D314FE938212C9F9E394FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E99DFF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFC5FF20EA008000E84E334ECF573B57CF8BFF20EA57C0BFEA0080A0E90000D8ECA0
-/* TGZSAF */
-:03E8000000008898E9008000E80080A0E90000D8ECFF80C0E9008000E8224048BF2A4050BF324149BF3A4151BFC36BCB6B008898E9737BC8EC96E241047B43A0E8734BA0E8ADEE299F00E0490490E251043146B1E84941C0EC3957B1E8000446E27353A0E85141C0EC310039006E8015EA080410045149C0EC2F4160EA312039201F42A0E82A424ABF274AA0E81A4252BF1E4960EA737BC8EC265160EA324048BD224050BD124149BD3A4151BDBF2F26BD00E07B723220222012203A20463146BF4E314EBFB3E22D9F008000E8563156BF473947BF4F394FBF573957BF608007EA244120E94273F8EC00E02D7333720CE3A52F1EBD43432DDF4B4B2DDFAE1E26BD58E3336653532DDF008000E8B83833BF00E059E31E1241E91A2241E92B403DE93F4BA0E82D73307605803DEA3743A0E83D53A0E84870F8EC2B483CE91F27BCE8008000E8008000E8008000E815C020E915C020E915C020E915C020E9183A41E91D3241E92A4020E9563D56DF463746DF4E3F4EDF163020E94F3F4FDF473747DF573D57DF32322DDF22222DDF12122DDF3A3A2DDF27CF74C237CF74C40A444CB0024454B03DCF74C0343720E931532F9F382720E939E52C9F3C3D20E92A444CB21A4454B232803AEA0A20022027CF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA62720E939E52C9FA33D20E92A444CB41A4454B40A454DB0024555B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A454DB21A4555B20A454DB4024555B427CF74C62A201A20A7304FE90A20022031532F9F9C2720E939E52C9FA8384FE92A444CB61A4454B630502E9F36314FE938212C9F37394FE90A454DB6024555B63DCF75C62A201A202A464EBF1A4656BF31532F9FA4314FE939E52C9FA5394FE9313D20E90A2002200A474FBF024757BF30502E9FA1304FE938212C9FA2384FE931532F9F9D314FE939E52C9F9E394FE92A434BBF1A4353BF30502E9F35304FE938212C9F39384FE931532F9F803157E939E52C9F813957E9374850BD8A3620E9867657E98B3E20E9823057E9877757E9833857E9354951BD84315EE9301F5FE985395EE9572520E92B4820E91D37E1EA1E35E1EA00E02677244920E999FF20EA162620E9572EBFEA1C46A0E8234EA0E82B56A0E81D47A0E8244FA0E82C57A0E81C0023002B0000E01D0024002C0000E01C6523652B6500E01D6524652C6500E01C2360EC36D736AD2B8060EC1D2460EC3ED73EAD2C8060EC1C2BDEE82380DEE8368036BD3E803EBD33D71CBD3BD723BD468046CF4F804FCF563356CF473B47CFC1FF20EA008000E84E334ECF573B57CF87FF20EA57C0BFEA0080A0E90000D8EC83
-/* T2GZ */
-:0438000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC31003900788015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF698007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF12122DDF22222DDF32322DDF3A3A2DDF683D68DF493749DF3DCF74C037CF74C431532F9F348020E939E52C9F3C3D20E90A4454B0024464B02A4454B21A4464B225803AEA0A2002203DCF74C22A201A2030502E9F32315FE938212C9F33395FE931532F9F008000E82A4454B41A4464B439E52C9F383D20E988735EE92A201A202A4656BF1A4666BF31532F9F3E304FE939E52C9F3F384FE90A4757BF024767BF31532F9F3A314FE939E52C9F3B394FE92A4353BF1A4363BF30502E9F36314FE938212C9F37394FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E99FFF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFBEFF20EA008000E8583358CF693B69CF7DFF20EA57C0BFEA0080A0E90000D8ECAC
-/* T2GZF */
-:0460000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC310039007D8015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF6E8007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF12122DDF22222DDF32322DDF3A3A2DDF683D68DF493749DF3DCF74C037CF74C439E52C9F348020E931532F9F008000E888735EE9008000E80FCF75C63C3D20E90A4454B0024464B02A4454B21A4464B228803AEA0A2002203DCF74C22A201A2030502E9F32315FE938212C9F33395FE931532F9F310F20E90A4454B4024464B42A4555B61A4565B639E52C9F383D20E90A2002202A201A200A4757BF024767BF30502E9F3E304FE938212C9F3F384FE92A4656BF1A4666BF31532F9F3A314FE939E52C9F3B394FE931532F9F36304FE939E52C9F37384FE92A4353BF1A4363BF30502E9F35314FE938212C9F39394FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E99AFF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFBBFF20EA008000E8583358CF693B69CF78FF20EA57C0BFEA0080A0E90000D8ECFB
-/* T2GZA */
-:0458000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC310039007C8015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF6D8007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF12122DDF22222DDF32322DDF3A3A2DDF683D68DF493749DF3DCF74C037CF74C431532F9F348020E939E52C9F3C3D20E90A4454B0024464B02A4454B21A4464B229803AEA0A2002200FCF74C63DCF74C288735EE92A201A2030502E9F32315FE938212C9F33395FE931532F9F9C0F20E90A4454B4024464B42A4454B61A4464B639E52C9F383D20E90A2002202A201A200A4757BF024767BF30502E9F3E304FE938212C9F3F384FE92A4656BF1A4666BF31532F9F3A314FE939E52C9F3B394FE931532F9F36304FE939E52C9F37384FE92A4353BF1A4363BF30502E9F9D314FE938212C9F9E394FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E99BFF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFBAFF20EA008000E8583358CF693B69CF79FF20EA57C0BFEA0080A0E90000D8ECA0
-/* T2GZAF */
-:0480000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC31003900818015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF728007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF12122DDF22222DDF32322DDF3A3A2DDF683D68DF493749DF3DCF74C037CF74C40A4454B0024464B031532F9F343720E939E52C9F3C3D20E92A4454B21A4464B22E803AEA0A20022088735EE92A201A203DCF74C20FCF74C630502E9F32315FE938212C9F33395FE931532F9F9C0F20E90A4454B4024464B42A4454B61A4464B639E52C9F383D20E90A2002202A201A203DCF75C6008000E830502E9F3E304FE938212C9F3F384FE90A4555B6024565B631532F9F3A314FE939E52C9F3B394FE9313D20E90A2002202A4656BF1A4666BF0A4757BF024767BF30502E9F36304FE938212C9F37384FE931532F9F9D314FE939E52C9F9E394FE92A4353BF1A4363BF30502E9F35304FE938212C9F39384FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E996FF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFB5FF20EA008000E8583358CF693B69CF74FF20EA57C0BFEA0080A0E90000D8ECDC
-/* T2GZS */
-:04A0000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC31003900858015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF768007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF683D68DF493749DF32322DDF22222DDF12122DDF3A3A2DDF0FCF74C237CF74C40A4454B0024464B03DCF74C0343720E931532F9F380F20E939E52C9F3C3D20E92A4454B21A4464B231803AEA0A2002200FCF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA60F20E939E52C9FA33D20E92A4454B41A4464B40A4555B0024565B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE92A4555B21A4565B20A4555B4024565B438212C9F3B394FE92A201A200A2002202A4656BF1A4666BF31532F9F36314FE939E52C9F37394FE930502E9FA7304FE938212C9FA8384FE90A4757BF024767BF31532F9FA4314FE939E52C9FA5394FE92A4353BF1A4363BF30502E9FA1304FE938212C9FA2384FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E992FF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFB2FF20EA008000E8583358CF693B69CF70FF20EA57C0BFEA0080A0E90000D8EC43
-/* T2GZSF */
-:04C8000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC310039008A8015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF7B8007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF683D68DF493749DF32322DDF22222DDF12122DDF3A3A2DDF0FCF74C237CF74C40A4454B0024464B03DCF74C0343720E931532F9F380F20E939E52C9F3C3D20E92A4454B21A4464B236803AEA0A2002200FCF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA60F20E939E52C9FA33D20E92A4454B41A4464B40A4555B0024565B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A4555B21A4565B20A4555B4024565B40FCF75C62A201A20A7304FE90A20022031532F9F310F20E939E52C9FA8384FE92A4555B61A4565B630502E9F36314FE938212C9F37394FE9008000E82A201A202A4656BF1A4666BF31532F9FA4314FE939E52C9FA5394FE90A4757BF024767BF31532F9FA1304FE939E52C9FA2384FE92A4353BF1A4363BF30502E9F35314FE938212C9F39394FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E98DFF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFADFF20EA008000E8583358CF693B69CF6BFF20EA57C0BFEA0080A0E90000D8EC56
-/* T2GZSA */
-:04C8000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC310039008A8015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF7B8007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF683D68DF493749DF32322DDF22222DDF12122DDF3A3A2DDF0FCF74C237CF74C40A4454B0024464B03DCF74C0343720E931532F9F380F20E939E52C9F3C3D20E92A4454B21A4464B236803AEA0A2002200FCF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA60F20E939E52C9FA33D20E92A4454B41A4464B40A4555B0024565B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A4555B21A4565B20A4555B4024565B40FCF74C62A201A20A7304FE90A20022031532F9F9C0F20E939E52C9FA8384FE92A4454B61A4464B630502E9F36314FE938212C9F37394FE9008000E82A201A202A4656BF1A4666BF31532F9FA4314FE939E52C9FA5394FE90A4757BF024767BF31532F9FA1304FE939E52C9FA2384FE92A4353BF1A4363BF30502E9F9D314FE938212C9F9E394FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E98DFF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFADFF20EA008000E8583358CF693B69CF6BFF20EA57C0BFEA0080A0E90000D8EC23
-/* T2GZSAF */
-:04E8000000008A98E9008000E80080A0E90000D8ECFF80C0E9008000E80A4050BF2A4060BF324151BF3A4161BFC36BD36B008A98E9737BC8EC96E241047B43A0E87353A0E8ADEE239F00E0510490E261043146B1E85141E0EC3967B1E8000446E27363A0E86141E0EC310039008E8015EA100420046151E0EC2F4160EA312039201F42A0E82A4252BF0F52A0E81A4262BF1E5160EA737BC8EC0E6160EA324050BD224060BD124151BD3A4161BDBF2F0EBD97E27B723220222012203A203548B1E83D59B1E8463146BF563156BFB3E22D9F008000E8663166BF473947BF573957BF673967BF7F8007EA244120E935003D0000E02D7333720CE38D2F1EBD4375F8EC35203D2043432DDF53532DDFAE1E0EBD58E33366483548BF583558BF683568BF493D49BF593D59BF693D69BF63632DDF4D7DF8EC59E300E0B83833BF2D733076183A41E93F53A0E805803DEA3743A0E83D63A0E85070F8EC2B503CE91F0FBCE8008000E85978F8EC008000E815C020E915C020E915C020E915C020E91E1241E91A2241E9463746DF563F56DF2B403DE9663D66DF1D3241E9673D67DF473747DF573F57DF2A4020E9593F59DF163020E9693D69DF483748DF583F58DF683D68DF493749DF32322DDF22222DDF12122DDF3A3A2DDF0FCF74C237CF74C40A4454B0024464B03DCF74C0343720E931532F9F380F20E939E52C9F3C3D20E92A4454B21A4464B23A803AEA0A2002200FCF75C02A201A2030502E9F32315FE938212C9F33395FE93DCF75C237CF75C431532F9FA60F20E939E52C9FA33D20E92A4454B41A4464B40A4555B0024565B088735EE92A201A20A03720E90A20022031532F9F3E304FE939E52C9F3F384FE930502E9F3A314FE938212C9F3B394FE92A4555B21A4565B20A4555B4024565B40FCF74C62A201A20A7304FE90A20022031532F9F9C0F20E939E52C9FA8384FE92A4454B61A4464B630502E9F36314FE938212C9F37394FE90A4555B6024565B63DCF75C62A201A202A4656BF1A4666BF31532F9FA4314FE939E52C9FA5394FE9313D20E90A2002200A4757BF024767BF30502E9FA1304FE938212C9FA2384FE931532F9F9D314FE939E52C9F9E394FE92A4353BF1A4363BF30502E9F35304FE938212C9F39384FE90A4858BF024868BF31532F9F803157E939E52C9F813957E92A4959BF1A4969BF30502E9F823057E938212C9F833857E931532F9F84315EE939E52C9F85395EE9867657E98A3620E9877757E98B3EBFEA803057E9813857E9823157E9867857E9833957E9877957E9301F5FE98A3420E98B3C20E9375060BD570D20E9355161BD2B5020E91D37E1EA1E35E1EA00E00E77245120E989FF20EA160E20E9572EBFEA0B46A0E81B56A0E82B66A0E80C47A0E81C57A0E82C67A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC36D736AD2B8060EC0C1C60EC3ED73EAD2C8060EC0B2BDEE81B80DEE8368036BD3E803EBD33D70BBD3BD71BBD468046CF578057CF663366CF473B47CF563356CF673B67CF0B48A0E81B58A0E82B68A0E80C49A0E81C59A0E82C69A0E80B001B002B0000E00C001C002C0000E00B651B652B6500E00C651C652C6500E00B1B60EC34D734AD2B8060EC0C1C60EC3CD73CAD2C8060EC0B2BDEE81B80DEE8348034BD3C803CBD33D70BBD3BD71BBD488048CF598059CF683368CF493B49CFA9FF20EA008000E8583358CF693B69CF67FF20EA57C0BFEA0080A0E90000D8ECEE
-:0000000001FF
diff --git a/firmware/mts_cdma.fw.ihex b/firmware/mts_cdma.fw.ihex
deleted file mode 100644
index f6ad0cbd30cb..000000000000
--- a/firmware/mts_cdma.fw.ihex
+++ /dev/null
@@ -1,867 +0,0 @@
-:1000000014360002001E021AF9FFFFFFFFFF023341
-:100010001DFFFFFFFFFFFFFFFFFFFFFFFFFF02339B
-:10002000C87581CE90FDE88583A012353CEC4D600B
-:100030007378AB8003760018B89CFA787F800376DB
-:100040000018B865FA78208003760018B820FA788E
-:10005000208003760018B81FFA90FDDDAE83AF82D2
-:1000600090FBF81200AA6005E4F0A380F690FDE88A
-:10007000A88290FDE8A982E8696005E4F20880F7AB
-:100080009001081200B390010C1200B390011012FD
-:1000900000B39001141200D190011A1200D1900106
-:1000A000201200D175D00012341A020126EF6582A9
-:1000B0007003EE658322E493F8740193F97402935C
-:1000C000FE740393F5828E83E869700122E493F64F
-:1000D000A30880F4E493FC740193FD740293FE740E
-:1000E0000393FF740493F8740593F58288831200D8
-:1000F000AA700122E493A3A883A9828C838D82F045
-:10010000A3AC83AD828883898280E32121049B8014
-:1001100080049BACAE049BFDE8049D049DFBF304AE
-:10012000A2049DFBF30502050280FED0F030F00929
-:1001300020F303F68010F7800D30F10920F303F26D
-:100140008004F38001F020F404FCD0E0CC22CCC089
-:10015000E0120163020154BC0005D0F0ACF022C3F0
-:1001600013DCFC02012ABF0009ED258275F001F8BD
-:10017000E622BF010FED2582F582EE3583F583750A
-:10018000F004E022ED258275F002F8E222D083D05F
-:1001900082F5F0C3E493A3C5F095F0C0E0C3D0F0BE
-:1001A000E493A395F04012A3A3C3E5F033500205F6
-:1001B000832582F58250020583740193C0E0E493A5
-:1001C000C0E022D083D082F5F0E4937009740193EB
-:1001D0007004A3A3800C74029365F06005A3A3A32D
-:1001E00080E7740193C0E0E493C0E022120264024D
-:1001F00001FB1202B80201FB1202DC0201FB30E03B
-:100200000720E302E622E72230E10720E302E222B0
-:10021000E32230E202E022E493221202DC02022313
-:100220001202B8020223ABF012022DCBC5F0CB2292
-:1002300030E01020E306E6F5F008E622E7F5F009E5
-:10024000E7192230E11020E306E2F5F008E222E3AC
-:10025000F5F009E3192230E206E0F5F0A3E022E42C
-:1002600093F5F074019322BB0003740922BB0107CC
-:1002700089828A83740422BB020789828A8374106C
-:1002800022740A22020284BB0007E92582F8740165
-:1002900022BB010DE92582F582EA3583F5837404DA
-:1002A00022BB020DE92582F582EA3583F5837410BD
-:1002B00022E92582F87402220202B8BF0005EDF897
-:1002C000740122BF01078D828E83740422BF02074E
-:1002D0008D828E83741022EDF87402220202DCBF3C
-:1002E0000007ED2582F8740122BF010DED2582F58E
-:1002F00082EE3583F583740422BF020DED2582F56D
-:1003000082EE3583F583741022ED2582F874022283
-:10031000020310C0E0120264020328C0E01202B817
-:10032000020328C0E01202DC02032830E00B20E3C5
-:1003300004D0E0F622D0E0F72230E10B20E304D035
-:10034000E0F222D0E0F322D0E0F022C9CDC9CACE3B
-:10035000CACBCFCB12035BEDF9EEFAEFFB22BB0069
-:100360002FBF000AFAEDF8E7F60809DAFA22BF0112
-:10037000128D828E83F802037809A3E7F0D8FA225F
-:10038000020383FAEDF8E7F20809DAFA2202038D94
-:10039000BB014DBF001489828A83F9EDF802039FE7
-:1003A00008A3E0F6D9FA220203B0BF01228D828EA3
-:1003B00083FB08C9C582C9CAC583CAE0A3C9C5826F
-:1003C000C9CAC583CAF0A3DBEAD8E8220203D38DE9
-:1003D000828E83F9EDF8E0F208A3D9FA220203DD58
-:1003E000BB024DBF001289828A83F9EDF80203EF48
-:1003F00008A3E493F6D9F922BF01238D828E83FBF3
-:1004000008C9C582C9CAC583CAE493A3C9C582C93C
-:10041000CAC583CAF0A3DBE9D8E722020422898295
-:100420008A83F9EDF8E493F208A3D9F922020433A0
-:10043000BF000DFAEDF8E3F60809DAFA2202043DEE
-:10044000BF01128D828E83F802044A09A3E3F0D81B
-:10045000FA22020455FAEDF8E3F20809DAFA220268
-:10046000045FE6FB08E6FA08E6F904F618700106F0
-:1004700022E6FF08E6FE08E6FD22EFF0A3EEF0A379
-:10048000EDF022EBF0A3EAF0A3E9F022E0FFA3E015
-:10049000FEA3E0FD22E0FBA3E0FAA3E0F9220000C6
-:1004A00000000000000502006105710026059800AB
-:1004B000330A0900610A750066154400610CF900F1
-:1004C0006109A9006109E000610DC000610BF10044
-:1004D000610A1C00610A510061173C0033174F008C
-:1004E000341E1400431EBF0044202C0044201A0078
-:1004F000471EE600471F8B004D1FDC004F1F080002
-:100500005832A800617CCC7DFF121CC52290FFFCF4
-:10051000E020E72DC2AFAE59AF58755A20E55A1406
-:10052000C55A6019E4FE7F05EE4FCE24FFCECF34CE
-:10053000FFCF6007E490FF92F080ED80E08E598F4E
-:10054000582212050A7D077CB71232C47D0F7C6EDB
-:100550001232DE789D7A06E4F608DAFC7A06120595
-:10056000CD7C03120E55122168E4FEFF7C0F12327F
-:100570004DD2A822123138E490FC38F090FFF0E020
-:1005800030E408740190FC39F08005E490FC39F007
-:100590007D0A7C001225461231BB2212313890FCB4
-:1005A00039E014700E90FFF0E04410F07C0012254A
-:1005B000DF801990FC39E0700E90FFF0E054EFF00E
-:1005C0007C001225DF80057C171225DF1231BB224B
-:1005D00090FFF0E054ABF090FFF0E04420F0228C6C
-:1005E000378D367882EDF608ECF6EDFEECFD7F01F6
-:1005F0009000051201F57880F67882E6FD08E6FCA9
-:10060000EDFEECFD7F019000041201F5540FFC7D1E
-:100610008012176D7880E6700DAD3AAE39AF38E4D0
-:100620001203187C082290FFF0E054FEF090FFF0D7
-:10063000E054FDF0801E7882E6FD08E6FCEDFEEC5D
-:10064000FD7F0190000812021725E0440190FFF39E
-:10065000F00206D97882E6FD08E6FCEDFEECFD7FAF
-:100660000190000612021754FE90FFF3F0802B78E1
-:1006700082E6FD08E6FCEDFEECFD7F01900008122D
-:100680000217FAEB90FFF1F01208C8400DAD3AAE38
-:1006900039AF38E41203187C18227882E6FD08E6A8
-:1006A000FCEDFEECFD7F0190000812021790FFF1B7
-:1006B000F01208C8400DAD3AAE39AF38E412031855
-:1006C0007C18227882E6FD08E6FCEDFEECFD7F0159
-:1006D000900006120217440190FFF3F07883E6249D
-:1006E00003F618E63400F67880E624FE500990FF01
-:1006F000F0E054FDF0800790FFF0E04402F0E49059
-:10070000FFF1F0788176007880E624FFFCE434FF86
-:10071000FD7881E67F00FEECD39EEF6480CD64809F
-:100720009D402F1208AD400F7881E6AD3AAE39AF4B
-:10073000381203187C182290FFF2E0FC788286833E
-:10074000088682ECF0788106A37882A68308A682C8
-:1007500080B51208AD400F7881E6AD3AAE39AF38BA
-:100760001203187C182290FFF2E0FC78828683083E
-:100770008682ECF07880E6AD3AAE39AF38120318D5
-:100780007C00228C378D367882EDF608ECF6EDFE93
-:10079000ECFD7F019000051201F57881F67882E684
-:1007A000FD08E6FCEDFEECFD7F019000041201F572
-:1007B000540FFC7D8112176D7881E670037C08224E
-:1007C00090FFF0E054FEF090FFF0E054FDF0801B4D
-:1007D0007882E6FD08E6FCEDFEECFD7F0190000866
-:1007E00012021725E090FFF3F0805B7882E6FD08A7
-:1007F000E6FCEDFEECFD7F0190000612021754FEB0
-:1008000090FFF3F080217882E6FD08E6FCEDFEEC37
-:10081000FD7F01900008120217FAEB90FFF1F01231
-:1008200008C840037C18227882E6FD08E6FCEDFE4D
-:10083000ECFD7F0190000812021790FFF1F0120802
-:10084000C840037C18227883E6240AF618E63400B0
-:10085000F6788076007881E624FFFCE434FFFD78AA
-:1008600080E67F00FEECD39EEF6480CD64809D40E7
-:100870002178828683088682E090FFF1F01208C812
-:1008800040037C1822788006788306E618700106FB
-:1008900080C390FFF0E04401F0788286830886826E
-:1008A000E090FFF1F01208C840037C18227C00227F
-:1008B00090FFF0E020E71290FFF0E030E50990FFB4
-:1008C000F0E04420F0C32280E7D32290FFF0E02044
-:1008D000E31290FFF0E030E50990FFF0E04420F0F3
-:1008E000C32280E7D3228C428D417C00ED54F0FD81
-:1008F000EC7003ED64307005753E038003753E04B3
-:10090000AC3E120F72758300858340E541540FF5AC
-:100910003FE5407004E53F64037035E53E24FD7516
-:10092000F00AA42402F582E434FCF583E030E60505
-:100930001210598019E53E249DF8E654FBF678A97B
-:10094000E62405F58218E63400F583740FF080592B
-:10095000E5407004E53F64047048E53E24FD75F011
-:100960000AA42402F582E434FCF583E030E507AC08
-:1009700042AD41121C5AE54230E21578ADE630E056
-:100980000F78ADE630E109E4FF04FE7C0412324D3D
-:1009900078A9E62406F58218E63400F583740FF092
-:1009A0008007E4FC7DEE121C5AC203221231381279
-:1009B0000F7278A9E62406F58218E63400F583E084
-:1009C00090FC38F078A9E62405F58218E63400F5A5
-:1009D00083E090FC39F0C2037D027C0012254612B0
-:1009E00031BB221231387895ECF6EC249DF8E630D4
-:1009F000E1077C131225DF800F90FC39E0FD78952C
-:100A0000E6FC1213EF1225DF1231BB2212313878C7
-:100A100095ECF67D00120F121225DF1231BB221267
-:100A200031387895ECF6EC249DF8E630E2077C133B
-:100A30001225DF801B7895E6249DF8E620E1077CEF
-:100A4000121225DF800A7895E6FC1214131225DFB6
-:100A50001231BB221231387895ECF6EC249DF8E681
-:100A600020E2077C111225DF800A7895E6FC12153A
-:100A7000141225DF1231BB221231387895ECF612B0
-:100A80000F7278A9E62409F58218E63400F583E0B0
-:100A900090FC3FF078A9E6240AF58218E63400F5C8
-:100AA00083E090FC40F078A9E62403F58218E63450
-:100AB00000F583E0FC78A9E62404F58218E634000A
-:100AC000F583E0F56278A9E62402F58218E63400A1
-:100AD000F583E0F5638C61E4EC333354017895F6EB
-:100AE0006008E56230E1037895067895E690FC4170
-:100AF000F078A7E62402F58218E63400F583E0FDDD
-:100B0000A3E0540CFCED54E68C65F564E56130E53A
-:100B100003436501E56220E50EE561547F7008E559
-:100B20006120E703436502E56130E303436510E5B7
-:100B30006130E203436520E561540360034365408F
-:100B4000E56130E103436580E56130E4034364011E
-:100B5000E56130E603436408E56220E40EE5615494
-:100B60007F7008E56120E7034364105365FB53641D
-:100B7000F9AD64E56590FC3ACDF0A3CDF0E56330C6
-:100B8000E30DE5635430C4540F90FC3DF08005E460
-:100B900090FC3DF0E563540390FC3CF0E5635404A5
-:100BA000C31390FC3EF090FC3CE0700E7D357EFC63
-:100BB0007F01740190000912014B78A9E62408F521
-:100BC0008218E63400F583E07C00FD78A9E624076E
-:100BD000F58218E63400F583E07F004CFEEF4D907F
-:100BE000FC38F0A3CEF0CEC2037D0A7C001225466D
-:100BF0001231BB221231387895ECF6789A760108DA
-:100C000076FC0876387897760C789A12046E120281
-:100C10001D7898CBF6CB08F67F00EF24EA401FE45E
-:100C2000EF25E090357EFD93CD04937899667003AF
-:100C3000ED186670067897760080030F80DC789652
-:100C4000EFF6789A12046E9000021202177898CB91
-:100C5000F6CB08F65404CB54064B60047897760B19
-:100C60007899E630E313789A12046E900005120129
-:100C7000F524FB50047897760D7899E654C07D00F2
-:100C800064C04D70047897760B789A12046E9000C9
-:100C9000041201F524FC50047897760F789A120418
-:100CA0006E9000061201F524FD50047897760E78B8
-:100CB0009A12046E9000091201F524FD50047897F1
-:100CC000760A7897E6702A7895E6FC120F72789A81
-:100CD00012046E78A7E6F978A6E6FA7B01740A7822
-:100CE00000120348C2037895E6FC1211157897ECC0
-:100CF000F67897E6FC1225DF1231BB2212313878E4
-:100D000095ECF6120F727895E624FD75F00AA4248E
-:100D100014F582E434FCF583AC82AD8378A6868337
-:100D2000088682ECF9EDFA7B0A78011203B0C2035F
-:100D30007895E6FC1211151231BB228D2B8C2AED11
-:100D400060407527017529487528FFE52A24FDFCB8
-:100D5000E434FFFDEC7C0325E0CD33CDDCF9FCE58C
-:100D6000292CF529E5283DF528AD29AE28AF2774B3
-:100D7000809000061203207480900002120320125B
-:100D80000FC5E52B14603B7527017529087528FFF1
-:100D9000E52A24FDFCE434FFFDEC7C0325E0CD33A3
-:100DA000CDDCF9FCE5292CF529E5283DF528AD2910
-:100DB000AE28AF27E4900006120320E49000021250
-:100DC0000320221231387895ECF6EC249DF8E630B9
-:100DD000E2097895E6FC121514D2007895E6FC122B
-:100DE0000F727896760090FC39E030E704789676BA
-:100DF000017896E6FD7895E6FC120D38C2033000C6
-:100E0000077895E6FC1214137C001225DF1231BB23
-:100E10002278A9E62404F58218E63400F583E0443C
-:100E200001F078A9E62404F58218E63400F583E0A1
-:100E300030E00280ED78A9E6240BF58218E6340054
-:100E4000F583E054F8F078A9E62402F58218E63438
-:100E500000F583E04480F022C2038C58120F7278B0
-:100E6000A6868308868279AF7A357B0A78011203D9
-:100E7000FE120E0EAC587D02120D38C203AC581291
-:100E80001115228D538E528F518C50120F72754F47
-:100E90000078A9E62405F58218E63400F583E02001
-:100EA000E41FE54F24F64019054FC2037C181232A7
-:100EB000FB90FF93E04401F0B2B3AC50120F72808C
-:100EC000D078A9E62405F58218E63400F583E02001
-:100ED000E405C2037C022278A9E62405F58218E61F
-:100EE0003400F583E0540F601678A9E62405F582F6
-:100EF00018E63400F583E0540FF0C2037C01227839
-:100F0000A88683088682E0AD53AE52AF5112031813
-:100F1000C2037C00228D318C30121514E531600F34
-:100F2000E530B4030A7C0112250E7C8112250EAC3B
-:100F300030120F72E531601A78AA8683088682E043
-:100F400054E7F0A3A3A3A3E054E7F0AC307D021272
-:100F50000D3878A6868308868279B97A357B0A7837
-:100F6000011203FEC203E530249DF8E654FDF6AC01
-:100F700030121115228C2630030512329A80F87C2B
-:100F80000A1231ADD203E52624FD78A3F670077866
-:100F9000AA76FF0876E078A3E67D007C0425E0CD04
-:100FA00033CDDCF9FC24A078A9F6ED34FF18F678EF
-:100FB000A3E675F00AA42400FCE434FCFD78A6ED59
-:100FC000F608ECF61232462278A9E62402F58218D9
-:100FD000E63400F583E030E72278A9E62402F582C2
-:100FE00018E63400F583E0547FF078A9E62402F592
-:100FF0008218E63400F583E04480F02278AA8683E4
-:10100000088682E0547FF0AD83E5822404FCE43D51
-:101010008C82F583E0547FF078A9E6240BF58218E2
-:10102000E63400F583E054F8F078ABE62401F5826D
-:1010300018E63400F583E04403F078ABE62405F5C8
-:101040008218E63400F583E04403F078A9E624052D
-:10105000F58218E63400F583740FF02278AA8683AF
-:10106000088682E0543FF0AD83E5822404FCE43D31
-:101070008C82F583E0543FF078A3E624A4F8E6FCE4
-:1010800078ABE62401F58218E63400F583ECF078BD
-:10109000A3E624A4F8E6FC78ABE62405F58218E67E
-:1010A0003400F583ECF078A9E6240BF58218E634D9
-:1010B00000F583E054FB4402F52678A7E62402F508
-:1010C0008218E63400F583E030E50343260178A971
-:1010D000E62405F58218E63400F583E030E00312DB
-:1010E0000FC5E526FC78A9E6240BF58218E6340046
-:1010F000F583ECF078A9E62405F58218E63400F5CE
-:1011000083740FF078AA8683088682E04480F0A377
-:10111000A3A3A3E04480F0228C2A120F7278A7E6E2
-:101120002408F58218E63400F583E0FC78A9E6246B
-:101130000AF58218E63400F583ECF078A7E6240778
-:10114000F58218E63400F583E0FC78A9E62409F579
-:101150008218E63400F583ECF078A6868308868250
-:10116000E0FDA3E0FCEDFE78A9E62408F58218E690
-:101170003400F583EEF0ECFE78A9E62407F582183A
-:10118000E63400F583EEF08C298D28C3EC9405ED50
-:10119000940C400575277C8033D3E5299401E5281C
-:1011A0009403400575273C8023D3E5299481E528E5
-:1011B000940140057527188013D3E5299460E5282C
-:1011C0009400400575270C8003752708AF27E4EFCE
-:1011D000547C4483FF8F27E527FC78ABE62401F598
-:1011E0008218E63400F583ECF0E527FC78ABE624C2
-:1011F00005F58218E63400F583ECF0E527FC78A3CA
-:10120000E624A4F8ECF678A9E62402F58218E63480
-:1012100000F583E0F52778A7E62402F58218E63486
-:1012200000F583A3E030E3175327C778A7E624052A
-:10123000F58218E63400F583E09035AA93422778CA
-:10124000A7E62402F58218E63400F583E030E705CE
-:1012500043274080035327BF5327FB78A7E6240684
-:10126000F58218E63400F583E06003432704532732
-:10127000FC78A7E62404F58218E63400F583E04202
-:1012800027432780E527FC78A9E62402F58218E6A3
-:101290003400F583ECF078A9E62404F58218E634EE
-:1012A00000F583E0F52778A7E62402F58218E634F6
-:1012B00000F583A3E030E1055327DF8003432720B7
-:1012C00078A7E62402F58218E63400F583E030E4DE
-:1012D000055327EF800343271078A7E62409F582FA
-:1012E00018E63400F583E0B40203432702E527FC47
-:1012F00078A9E62404F58218E63400F583ECF0784A
-:10130000A9E62403F58218E63400F583E0F5277892
-:10131000A7E62409F58218E63400F583E07005534A
-:10132000277F800343278078A7E62402F58218E60A
-:101330003400F583A3E030E00543272080035327E2
-:10134000DF78A7E62402F58218E63400F583E03062
-:10135000E30543274080035327BF78A7E62402F51F
-:101360008218E63400F583E030E00543271080035F
-:101370005327EF78A7E62402F58218E63400F583B8
-:10138000A3E030E40543270880035327F778A7E656
-:101390002402F58218E63400F583A3E030E5054326
-:1013A000270480035327FB78A7E62402F58218E67A
-:1013B0003400F583A3E030E605432701800353277B
-:1013C000FE78A7E62402F58218E63400F583A3E050
-:1013D00030E70543270280035327FDE527FC78A962
-:1013E000E62403F58218E63400F583ECF0C2037CB2
-:1013F00000228D278C26ED54031460037C1022E517
-:1014000027547C24FC40037C0B22E526249DF8E62F
-:101410004402F67C00228C30120F72E530249DF8D5
-:10142000E620E24FAC307D02120D38E53024FE4458
-:1014300028FC78AA8683088682ECF0AF83E58224B4
-:1014400004FEE43FFFEC8E828F83F07C038C2CE55E
-:101450002CFC78ABE62401F58218E63400F583EC29
-:10146000F0E52CFC78ABE62405F58218E63400F5AF
-:1014700083ECF0752D01752F48752EFFE53024FDA6
-:10148000FCE434FFFDEC7C0325E0CD33CDDCF9FC3E
-:10149000E52F2CF52FE52E3DF52E78ABE62404F54F
-:1014A0008218E63400F583E054E7F52CAD2FAE2E1C
-:1014B000AF2DE4900002120320E4900006120320F6
-:1014C0001201EF30E503432C10E52CFC78ABE62449
-:1014D00004F58218E63400F583ECF012105978A96F
-:1014E000E62406F58218E63400F583E0C203FCE545
-:1014F00030249DF8E64404F68C2CE530540FC45497
-:10150000F07E00FFEEEF44047D00FFEC4EFCED4F5B
-:10151000FD121CC57C00228C2F120F72120FF9785D
-:10152000AA8683088682E05408F0A3A3A3A3E0540C
-:1015300008F0AC2F7D02120D38C203E52F249DF870
-:10154000E654FBF67C00221231387896ECF6EC2457
-:101550009DF8E630E10A7D007C131225461231BB6E
-:101560007896E6249DF8E64401F67896E6FC120F9C
-:10157000727896E624FD75F00AA42414F582E4340A
-:10158000FCF58378A6E6FA08E6F97B0A78011203EF
-:10159000B078A6868308868279B97A357B0A780185
-:1015A0001203FE120FC5C2037896E6FC12111578DD
-:1015B00095ECF6EC600A7D007C081225461231BBE2
-:1015C0007896E6FC120F7278A9E62404F58218E6F4
-:1015D0003400F583E0441054DFFC78A9E62404F5D8
-:1015E0008218E63400F583ECF07895ECF6C2037CC3
-:1015F000C81232FB7896E6FC120F7278A9E6240432
-:10160000F58218E63400F583E054EFF0C2037CC89D
-:101610001232FB7896E6FC120F7278A9E62404F5E4
-:101620008218E63400F583E04410F0C2037CC8124F
-:1016300032FB7896E6FC120F7278A9E62404F58254
-:1016400018E63400F583E04420F0C2037CF0123247
-:10165000FB7896E6FC120F7278A9E62405F582184D
-:10166000E63400F583E030E415C2037896E64410D2
-:101670007F00FE7C0712324D1231BB02173B78A966
-:10168000E62404F58218E63400F583E054CFF0C276
-:10169000037CC81232FB7896E6FC120F7278A9E63A
-:1016A0002404F58218E63400F583E04430F0C203E8
-:1016B0007CF01232FB7896E6FC120F7278A9E624D1
-:1016C00005F58218E63400F583E030E414C20378AF
-:1016D00096E644107F00FE7C0712324D1231BB802B
-:1016E0005D78A9E62404F58218E63400F583E05419
-:1016F000EFF078A9E62404F58218E63400F583E0DB
-:1017000054DFF07896E624FD75F00AA42414F582DF
-:10171000E434FCF583AC82AD8378A68683088682A8
-:10172000ECF9EDFA7B0A78011203B0C2037896E671
-:10173000FC1211157D007C0B1225461231BB2212C2
-:101740003138E490FC39F07D027C001225461231DC
-:10175000BB221231387C001225DF1231BB22743CCF
-:1017600090FBE0F0743E90FBE0F0E490FC28F02267
-:101770008D358C34ECB401028003D340028028B450
-:1017800002028003D34008A835E625E0F68018B4AD
-:1017900004028003D3400AA835E625E025E0F68060
-:1017A00006A83576008000228C3C8D3BEDFEECFDDA
-:1017B0007F0175660675670090FC29120477120197
-:1017C000EFB480028006D3500302186E90FC2912F9
-:1017D00004899000031201F554F0B430028003D361
-:1017E000405F90FC29120489900008120217FAFD4C
-:1017F000EBFE7F0190FC2C120477EECD9035C3FCFC
-:10180000E493FF740193FEF9EFFA7B01EAFFE9FE2E
-:10181000ECC39EED9F40259035C5E493FD74019384
-:10182000FCEDFEECFD7F01EECDFC90FC2EE0D39CA8
-:1018300090FC2DE09D5005756680803312198C80D8
-:101840002EB460028003D3400BAC3CAD3B1207804A
-:101850008C66801BB41003B34010C3B42003B340A4
-:1018600009C3B440028003D34000756681800080C4
-:1018700075B481028003D3406B90FC2912048990D7
-:1018800000031201F554F0B430028003D3401D90E0
-:10189000FC29120489900008120217FAFDEBFE7F62
-:1018A0000190FC2F1204771218F68036B460028083
-:1018B00003D34013753A67E4F539F538AC3CAD3BDA
-:1018C0001205DC8C66801BB41003B34010C3B42037
-:1018D00003B34009C3B440028003D340007566815E
-:1018E000800080028000E566FC90FC29120489ECEF
-:1018F000900002120320AC672290FC291204899008
-:1019000000041201F5600474018001E4A2E0920178
-:1019100090FC29120489ED2403FD50010E90FC2C4B
-:1019200012047790FC291204899000051201F5F544
-:10193000679000041201F5540FFC7D6712176DE5E6
-:10194000677004756608227566007884760078846E
-:10195000E6C39567503890FC2F1204891201EFFC02
-:1019600090FC2C120489EC12031830010E90FC310B
-:10197000E004F090FC307003E004F078840690FC02
-:101980002EE004F090FC2D7003E004F080C0229063
-:10199000FC2AE0FDA3E0FCEDFEECFD7F01ED240A56
-:1019A000FD50010E90FC3212047790FC291204893C
-:1019B0009000041201F5540FB401028003D34017C4
-:1019C00090FC321204890DED70010E90FC2F120470
-:1019D0007778887601804EB402028003D340199054
-:1019E000FC32120489ED2402FD50010E90FC2F12EE
-:1019F000047778887602802DB404028003D34019DE
-:101A000090FC32120489ED2404FD50010E90FC2F4D
-:101A100012047778887604800CB400028003D340E7
-:101A2000007566082290FC291204899000051201B5
-:101A3000F5F567788576007885E6C39567400302FB
-:101A40001AF4788676007886E6C378889650769081
-:101A5000FC2C1204891201EFFC90FC321204921249
-:101A600001E9F45CFC1201E9F890FC2F120489E80A
-:101A7000C0E01201EFC8D0E0C8584CFC90FC2C121A
-:101A80000489EC1203187887ECF690FC31E004F03E
-:101A900090FC307003E004F009E970010A90FC3218
-:101AA00012048090FC291204899000041201F53080
-:101AB000E40E90FC2EE004F090FC2D7003E004F0A6
-:101AC00078860680817888E6FDE4FEFFEECDFC9006
-:101AD000FC31E02CF090FC30E03DF07888E6FDE44D
-:101AE000FEFFEECDFC90FC34E02CF090FC33E03DAA
-:101AF000F0788506021A347566002222C0E0C0F034
-:101B0000C082C083C0D0E8C0E0E9C0E0EAC0E0EB3A
-:101B1000C0E0ECC0E0EDC0E0EEC0E0EFC0E090FF60
-:101B200092E01201C01B47301B47321B56381B681E
-:101B30003A1B7A3E1B92441B86461B9E501BE0526A
-:101B40001BBF541C015600001C2290FF92E07F0036
-:101B5000FE7C0112324D021C32E4FF04FE7C0312B3
-:101B6000324D742090FFFEF0021C32E4FF04FE7C34
-:101B70000212324D744090FFFEF0021C32E4FF046A
-:101B8000FE7C0412324D021C32E4FF04FE7C05127E
-:101B9000324D021C32E4FF04FE7C0612324D021C60
-:101BA0003290FFA5E07D0090FBF8CDF0A3CDF09042
-:101BB000FBF9E0FCF58390FBF8E04433FD121CC513
-:101BC000807390FFB5E07D0090FBFACDF0A3CDF0DF
-:101BD00090FBFBE0FCF58390FBFAE04443FD121C14
-:101BE000C5805290FFA6E07D0090FBFCCDF0A3CD18
-:101BF000F090FBFDE0FCF58390FBFCE04434FD122B
-:101C00001CC5803190FFB6E07D0090FBFECDF0A3B7
-:101C1000CDF090FBFFE0FCF58390FBFEE04444FD3B
-:101C2000121CC5801090FF92E07D00FCED44AAFDDF
-:101C3000121CC58000E490FF92F0D0E0FFD0E0FEDF
-:101C4000D0E0FDD0E0FCD0E0FBD0E0FAD0E0F9D06D
-:101C5000E0F8D0D0D083D082D0F0D0E0320581053A
-:101C60008105810581A881181818EDF608ECF69019
-:101C7000FF5AE020E70280F790FF59E07D00A8813D
-:101C800018CDF6CD08F67D03A881E618FCE6CC2534
-:101C9000E0CC33CCDDF9CCF6CC08F6A88118E644CC
-:101CA000F8F6A881181818E6FD08E6FCA881188641
-:101CB00083088682EDF0A3ECF0740290FF5AF015D1
-:101CC0008115811581158122E5812405F581E4A81E
-:101CD0008118F6A88118181818EDF608ECF690FB94
-:101CE000F5E024F85003021DE6E4A8811818F6A8D0
-:101CF0008118E6FEA88118181818E6FD08E6FC7F92
-:101D000000EF24F8404DE4EF25E0247DF582E43433
-:101D1000FCF583E0FBA3E06C7003FAEB6D700974D3
-:101D200001A8811818F6802BE4EF25E0247DF582C8
-:101D3000E434FCF5837A00E054F0CCF8CCCDF9CD56
-:101D4000FB7800E954F0F9EA687002EB6970010E63
-:101D50000F80AEA88118EEF6A88118181818EDF6B5
-:101D600008ECF6A881EFF6A8811818E67079A8812A
-:101D700018E624F74071A88118181818E6540FA81F
-:101D800081F664046017A881E664036010A88118D6
-:101D9000181818E6FD08E6FC121C5A804A7C0A1244
-:101DA00031ADA88118181818E6FD08E6FC90FBF480
-:101DB000E025E0247DF582E434FCF583EDF0A3EC2E
-:101DC000F090FBF4E0FFE4EF045407FF90FBF4F025
-:101DD00090FBF5E004F012324690FBF6E07008E468
-:101DE000FEFF7C0F12324D802790FBF7E004F05489
-:101DF0003F701D90FBF7E044FE7D00FC90FBF4E09B
-:101E000025E0247DF582E434FCF583EDF0A3ECF0CD
-:101E1000E58124FBF58122788B7600788C7600743E
-:101E20000190FBF6F012313890FBF5E060577C0A28
-:101E30001231AD90FBF3E025E0247DF582E434FC23
-:101E4000F583E0FDA3E0FC90FBF3E025E0247DF5C5
-:101E500082E434FCF583E4F0A3F090FBF3E0FFE4CC
-:101E6000EF045407FF90FBF3F090FBF5E014F078DB
-:101E700089EDF608ECF61232467889E6FD08E6FCB4
-:101E80001208E380A312329A90FF93E04401F0B26B
-:101E9000B3788B06B60011788B7600788CE6F40464
-:101EA00004A2E092B4788CF6021E25E490FBF6F0D2
-:101EB00090FBF5E07D00FCED44CFFD121C5A123181
-:101EC000BB22123138E5706449456F601590FF837D
-:101ED000E0540F7D00D39570ED956F5005122F8162
-:101EE00080031230511231BB22123138E57064493F
-:101EF000456F600512308B800E90FF80E04408F043
-:101F000090FF83E0547FF01231BB221231388C54A1
-:101F1000EC54F0B41015756A357569FC756801E507
-:101F20006A2403F56AE5693400F569E4F557F55666
-:101F3000E556C394015027E554540FFCAD6AAE69D1
-:101F4000AF68120E808C55EC60028012056AE56A5B
-:101F5000700205690557E5577002055680D2E554B1
-:101F6000540F249DF8E654FEF6E554540F7F00FE0E
-:101F70007C1212324DE5551470097D007C09122542
-:101F8000468007AD577C001225461231BB22123124
-:101F90003890FFFCE04402F090FF00E030E713903F
-:101FA000FF83E04480F0436D8090FFFCE04401F04B
-:101FB000801190FF82E04408F0536D7F90FFFCE0B9
-:101FC00054FEF090FF81E04480F01225F990FFFE6E
-:101FD000E04405F090FFFCE054FDF01231BB22120A
-:101FE00031387C011232FB78ADE64402F674FEFC17
-:101FF00004FD121CC590FF5AE030E70280F7E4F5BB
-:102000004E754D10AC4EAD4DE54E154E7002154D52
-:10201000EC4D600280EE4387011231BB2212313851
-:102020007C021231C778ADE654FDF61231BB2212A4
-:10203000313878ADE630E02C78ADE630E12678AD89
-:10204000E6FCF58318E644F0FD121C5A90FFFCE014
-:102050004420F07C021232FB78ADE654FDF6741A8F
-:1020600090FFFEF078ADE6FCF58318E644F1FD1232
-:102070001C5A1231BB22756D0090FFFFE0600343D4
-:102080006D01756E00E4F56CF56BE4F56F757049E4
-:10209000748490FF82F0748490FF80F0748090FFCD
-:1020A00058F0748090FF5AF0AD46AF457E00EE24A4
-:1020B000FE5003022142E4EE75F007A4247FF5826E
-:1020C000E434F8F583E0FFE4EF5480FDE4EF540FCF
-:1020D00014FFED6038E4EF75F008A42448F582E4BD
-:1020E00034FFF5837490F0E4EF75F008A4244AF50A
-:1020F00082E434FFF5837480F0E4EF75F008A424E3
-:102100004EF582E434FFF5837480F08034E4EF759B
-:10211000F008A42408F582E434FFF5837490F0E419
-:10212000EF75F008A4240AF582E434FFF583E4F0A7
-:10213000E4EF75F008A4240EF582E434FFF583E49F
-:10214000F00E0220AB8D468E448F45747F90FFFDCC
-:10215000F0749090FFFCF0228C58EC24F65006E5C9
-:10216000582437FC22E5582430FC22D2B0122543F3
-:10217000EC700302227E755C03AE5B7F00E55C15AC
-:102180005C6480247F5035EF2400F582E434FBF555
-:1021900083E0FE24FE501EEF7D00FCE4FB7474C35C
-:1021A0009CFAEB9DFBEE7D00FCEAC39CED6480CBCA
-:1021B00064809B50028005EF2EFF80C18E5B8F5A9A
-:1021C000E55C6480247F500302227EE55A248E5011
-:1021D0000302227E855A5D755B00AE5AAF5B903577
-:1021E000EEE493F55CE55C155C6480247F5018EEAA
-:1021F0002400F582E434FBF583E0FCEF9035EE93A8
-:102200006C70040E0F80DE8E5A8F5BE55C64802458
-:102210007F406E755E017560E8755FFFE55D2402C5
-:10222000F55A755C07E55C334057AD60AE5FAF5E55
-:10223000E55CF5823395E0F5831201F5C4540FFC9B
-:10224000122155E55A2400F582E434FBF583ECF0C5
-:10225000055A055AAD60AE5FAF5EE55CF582339519
-:10226000E0F5831201F5540FFC122155E55A2400C4
-:10227000F582E434FBF583ECF0055A055A155C80D1
-:10228000A4740290F851F090F86B79C77A357B27E7
-:1022900078011203FE756A357569FC756801E49072
-:1022A000FF83F0748090FF81F0755902E55975F055
-:1022B00007A4247FF582E434F8F583E0788FF6FCF8
-:1022C000540F14FC788FECF6E55975F007A42481BF
-:1022D000F582E434F8F583E0789276FD0876E8FC40
-:1022E000788FE675F008A42448F582E434FFF5837E
-:1022F000E4F0788FE675F008A4244FF582E434FF0B
-:10230000F583ECF07892E6FF08E67E03CFC313CFA7
-:1023100013DEF9FE788FE675F008A42449F582E40F
-:1023200034FFF583EEF0788FE675F008A4244AF5C3
-:1023300082E434FFF5837480F07890ECF67D0078C9
-:1023400093E62CF618E63DF67892E6FD08E67C0367
-:10235000CDC313CD13DCF9FC788FE675F008A42407
-:102360004DF582E434FFF583ECF0788FE675F008E4
-:10237000A4244EF582E434FFF583E4F07892E6FD80
-:1023800008E6FC788FE6FF7E00EE24FE5003022470
-:10239000FDE4EE75F007A4247FF582E434F8F583BC
-:1023A000E0FFE4EF5480FAE4EF540F14FFE4EE751D
-:1023B000F007A42481F582E434F8F583E07890F600
-:1023C000E4EE1313548024F0F8E434FDF9E8FCE95A
-:1023D000FD8A5AEA700302246AE4EF75F008A42427
-:1023E00048F582E434FFF583E4F07890E6FAE4EF10
-:1023F00075F008A4244FF582E434FFF583EAF0ED8C
-:10240000FBEC7A03CBC313CB13DAF9FAE4EF75F0E4
-:1024100008A42449F582E434FFF583EAF07890E6D5
-:102420007B00FAEC2AFCED3BFDFBEC7A03CBC313FB
-:10243000CB13DAF9FAE4EF75F008A4244DF582E441
-:1024400034FFF583EAF0E4EF75F008A4244AF5823E
-:10245000E434FFF5837480F0E4EF75F008A4244EB3
-:10246000F582E434FFF5837480F00224F9E4EF751B
-:10247000F008A42408F582E434FFF583E4F07890B2
-:10248000E6FAE4EF75F008A4240FF582E434FFF5D2
-:1024900083EAF0EDFBEC7A03CBC313CB13DAF9FA42
-:1024A000E4EF75F008A42409F582E434FFF583EA2B
-:1024B000F07890E67B00FAEC2AFCED3BFDFBEC7A31
-:1024C00003CBC313CB13DAF9FAE4EF75F008A424B5
-:1024D0000DF582E434FFF583EAF0E4EF75F008A42B
-:1024E000240AF582E434FFF583E4F0E4EF75F008A4
-:1024F000A4240EF582E434FFF583E4F00E02238673
-:102500008E597892EDF608ECF6788FEFF61220737C
-:10251000228C26EC30E718E526540F1475F008A439
-:102520002448F582E434FFF583E054DFF08016E5BB
-:1025300026540F1475F008A42408F582E434FFF53E
-:1025400083E054DFF0227C0022EC90FC37F08C24F6
-:10255000ED2403F5257D00D39572ED95714003853B
-:102560007225E52524B75009752503740290FC37C0
-:10257000F0AC2512307622E4F56CF56B12257D2245
-:1025800090FC35E06573600E740490FC37F0E4F560
-:102590006B756C0380467D73E4FEFF79357AFC7BB6
-:1025A0000174057800120348E56C2403F56CE56BB3
-:1025B0003400F56BE56CD39572E56B95714006853B
-:1025C000726C85716BD3E56C9448E56B9400400C9C
-:1025D000740290FC37F0E4F56B756C03AC6C123050
-:1025E0007622EC90FC37F0E4F56CF56B8C32EC6005
-:1025F0000512306780057C001230762290FF93E050
-:102600004401F0B2B390FF04E0F54A90FF06E0FD0C
-:10261000A3E0ED7D00FC7D00FC90FF06E0FFA3E061
-:102620007E00FFE4FEEC4EFCED4FFDC3EC9448ED64
-:102630009400502290FF06E0FDA3E0ED7D00FC7DBC
-:1026400000FC90FF06E0FFA3E07E00FFE4FEEC4EFE
-:10265000FCED4FFD8004E4FD7C488C728D7190FF91
-:1026600002E0FDA3E0ED7D00FC7D00FC90FF02E0B8
-:10267000FFA3E07E00FFE4FEEC4EF54CED4FF54B82
-:10268000756A357569FC7568017D357EFC7F017959
-:1026900073E4FAFB74057800120348754900E549B4
-:1026A00024FE4019AD6AAE69AF68E412031805490B
-:1026B0000DED70010E8D6A8E698F6880E1756A3547
-:1026C0007569FC75680190FF00E05460B4000280F9
-:1026D00006D35003022CBFE54A540FF549E54A548E
-:1026E00080A2E0920290FF01E012018A000B2CBA56
-:1026F000270528232CBA292F2CBA2A122A462BADBB
-:102700002BB02BF02C632C91E56D30E70EE54C459A
-:102710004B7008E572640245716003022CBC90FFA7
-:1027200000E0541FB400028003D34029E54A60034F
-:10273000022820AD6AAE69AF68740112031878AD43
-:10274000E630E00BAD6AAE69AF6874021203187C24
-:102750000212307622B401028003D3401BE56D20C3
-:10276000E107E54A6003022820E54A24FE500302FF
-:1027700028207C0212307622B402028006D3500355
-:1027800002281EE56D20E10DE54A6009E54A6480F6
-:102790006003022820AC4A1230FD4003022820E5E5
-:1027A00049702530021190FF80E05408AD6AAE698F
-:1027B000AF68120318800F90FF82E05408AD6AAE34
-:1027C00069AF68120318803D154930021DE549754F
-:1027D000F008A42448F582E434FFF583E05408AD02
-:1027E0006AAE69AF68120318801BE54975F008A44A
-:1027F0002408F582E434FFF583E05408AD6AAE693D
-:10280000AF68120318AD6AAE69AF681201EF600BD2
-:10281000AD6AAE69AF6874011203187C021230769B
-:10282000228000022CBCE56D20E706E57245716050
-:1028300003022CBC90FF00E0541FB400028003D3BD
-:10284000401AE54C14454B7004E54A600302292CFC
-:1028500078ADE654FEF67C0012307622B401028098
-:1028600003D3402AE56D20E108E56D20E00302294D
-:102870002CE56D30E004E54A700BE56D30E109E5CB
-:102880004A24FE500302292C7C0012307622B40226
-:10289000028006D3500302292AE54C454B6003020F
-:1028A000292CAC4A1230FD400302292CE56D20E1B1
-:1028B00007E56D20E0028077E56D30E006E54960D0
-:1028C00002806CE549700F90FF82E054F7F090FFB2
-:1028D00080E054F7F022E549B401028003D34009B7
-:1028E0007D017C03120F128011B402028003D340D9
-:1028F000097D017C04120F1280001549300215E594
-:102900004975F008A42448F582E434FFF583E054C7
-:10291000F7F08013E54975F008A42408F582E43443
-:10292000FFF583E054F7F07C00123076228000023D
-:102930002CBCE56D20E706E57245716003022CBCF6
-:1029400090FF00E0541FB400028003D3401AE54C0E
-:1029500014454B7004E54A6003022A0F78ADE64443
-:1029600001F67C0012307622B401028003D34029A4
-:10297000E56D20E108E56D20E003022A0FE56D30EA
-:10298000E004E549700BE56D30E108E54924FE50AF
-:1029900002807F7C0012307622B402028003D34092
-:1029A0006FE54C454B60028069AC4A1230FD400235
-:1029B0008060E56D20E107E56D20E0028054E54987
-:1029C000701430020990FF80E04408F0800790FF07
-:1029D00082E04408F022E56D30E1331549300215FC
-:1029E000E54975F008A42448F582E434FFF583E056
-:1029F0004408F08013E54975F008A42408F582E442
-:102A000034FFF583E04408F07C0012307622800227
-:102A10008000022CBCE56D20E712E5724571700C58
-:102A2000E54A700890FF00E0541F6003022CBCE5EB
-:102A30004C90FFFFF090FFFFE06005436D018003C5
-:102A4000536DFE7C0012307622E56D30E70EE572A4
-:102A50004571600890FF00E0541F6003022CBCAD7C
-:102A60004BE54CED7D00FC7D00FCBD0002800302C7
-:102A70002BA8B401028003D34032E54A7005E54C2F
-:102A8000FC6003022BAA756A407569F8756801D36A
-:102A9000E5729412E57194004006E4FD7C12800416
-:102AA000AC72AD718C708D6F12308B22B4020280CB
-:102AB00003D34059E54A6003022BAAE54CFC70277A
-:102AC000756A527569F8756801D3E5729419E571F4
-:102AD00094004006E4FD7C198004AC72AD718C70EA
-:102AE0008D6F12308B8025756A6B7569F87568017A
-:102AF000D3E5729427E57194004006E4FD7C2780BD
-:102B000004AC72AD718C708D6F12308B22B40302E5
-:102B10008006D35003022BA8E54CF549700F90FFB7
-:102B200004E0FDA3E04D6003022BAA801890FB0295
-:102B3000E0FDA3E0FC90FF05E06C700790FF04E06F
-:102B40006D60028068E4F570F56F7F00E54914C59B
-:102B500049600FEF2400F582E434FBF583E02FFF9A
-:102B600080EA8F4AE54A2400F582E434FBF583E0ED
-:102B70007D00D39572ED95714006AC72AD71800FFA
-:102B8000E54A2400F582E434FBF583E07D00FC8C0B
-:102B9000708D6FE54A2400FCE434FBFDFEECFD7F04
-:102BA000018D6A8E698F6812308B228000022CBCE6
-:102BB000022CBCE56D30E719E5721445717012E521
-:102BC0004A700EE54C454B700890FF00E0541F60C2
-:102BD00003022CBCE56D20E008E56D20E103022C2A
-:102BE000BC756A6EE4F569F568E4F56F04F570127A
-:102BF000308B22E56D20E727E57245717021E54AAB
-:102C0000701DE54C6402454B600DE54C14454B606E
-:102C100006E54C454B700890FF00E0541F6003022E
-:102C20002CBCE56D20E008E56D20E103022CBC859D
-:102C30004C6EE56E700A436D01536DFDD2B080207D
-:102C4000E56E64026007E56E1460028072536DFEEB
-:102C5000436D02E56E64026005E56E147002C2B059
-:102C60007C0012307622E56D30E71AE5721445716A
-:102C70007013E54A700FE54C454B700990FF00E07A
-:102C8000541F1460028038E56D20E10280317C0120
-:102C900012307622E56D20E715E5724571700FE57B
-:102CA0004C454B700990FF00E0541F146002800FE8
-:102CB000E56D20E10280087C00123076228000025F
-:102CC0002F7DB440028006D35003022F7390FF0182
-:102CD000E090FC35F0E54A90FC36F0E490FC37F0EB
-:102CE000E56A2403F56AE5693400F569AD4BE54C06
-:102CF000856A82856983CDF0A3CDF090FF01E01253
-:102D000001C02D2A012D50022D7A032DA4042DF28D
-:102D1000052E2F062E55072E7B082EA7092ECD0B2C
-:102D20002EF30C2F02802F028100002F60E56D2012
-:102D3000E7067C051225DF227D767E357F02793815
-:102D40007AFC7B01740878001203487D087C00122D
-:102D5000254622E56D20E7067C051225DF22E54A9F
-:102D6000B403004010B40500500BE54A7F00FE7C20
-:102D70001012324D227D007C0712254622E56D207F
-:102D8000E7067C051225DF22E54AB403004010B4B3
-:102D90000500500BE54A7F00FE7C1112324D227D6A
-:102DA000007C0712254622E56D20E7067C051225EA
-:102DB000DF22E54AB405028003D3400AE4FF04FEA3
-:102DC0007C0A12324D22B401028003D3400AE4FF90
-:102DD00004FE7C0812324D22B403004010B40500FA
-:102DE000500BE54A7F00FE7C1312324D227D007CA1
-:102DF0000712254622E56D20E734D3E5729448E5B5
-:102E00007194005006E572457170067C021225DF50
-:102E100022E54AB40103B3400BC3B403004009B434
-:102E200006005004123123227C071225DF221225CE
-:102E30007D22E56D20E71DE54AB403004010B4058E
-:102E400000500BE54A7F00FE7C1612324D227C07B3
-:102E50001225DF2212257D22E56D20E71DE54AB40B
-:102E600003004010B40500500BE54A7F00FE7C19BA
-:102E700012324D227C071225DF2212257D22E56DBC
-:102E800020E723748190FF93F0E54AB403004010DB
-:102E9000B40500500BE54A7F00FE7C1712324D222C
-:102EA0007C071225DF2212257D22E56D20E71DE536
-:102EB0004AB403004010B40500500BE54A7F00FE01
-:102EC0007C1812324D227C071225DF2212257D222A
-:102ED000E56D20E71DE54AB403004010B40500503D
-:102EE0000BE54A7F00FE7C1512324D227C0712252D
-:102EF000DF2212257D22E56D20E7067C071225DF03
-:102F00002212257D22E56D30E72090FF00E0541F5E
-:102F1000701090FF01E0B480051225748003122523
-:102F20007D227D007C051225462290FF00E0541F83
-:102F300060067C051225DF22D3E5729448E5719482
-:102F400000500BC3E5729407E571940050067C03B2
-:102F50001225DF22E54AB40504123123227C071230
-:102F600025DF22E56D30E7087D007C05122546222D
-:102F70007C051225DF22B420028003D340008000AC
-:102F80001230512275430090FF83E0540FD39543D4
-:102F90004024E54324F0F582E434FEF583E0AD6A95
-:102FA000AE69AF6812031805430DED70010E8D6A0E
-:102FB0008E698F6880D1E5437D00FCC3E5709CF588
-:102FC00070E56F9DF56FE570456F6006E490FF83D7
-:102FD000F02290FF82E04408F0E4F56F75704990AC
-:102FE000FC35E0B405028003D3404090FC36E0F5A8
-:102FF00043B405028003D3400AE4FF04FE7C0B12B5
-:10300000324D22B401028003D3400AE4FF04FE7C67
-:103010000912324D22B403004010B40500500BE5F4
-:10302000437F00FE7C1412324D2222B480004023E4
-:10303000B48200501E7C357DFC1217A57D008C6C7F
-:103040008D6B90FC37E0600512305180057C0012DA
-:103050003076222290FF83E0547FF090FF82E0449C
-:1030600008F090FF80E04408F02290FF82E04408DE
-:10307000F090FF80E04408F0228C237D008C708D5E
-:103080006F756A357569FC75680112308B2290FF87
-:1030900083E0547FF0E5706449456F700122C3E519
-:1030A000709408E56F94004015752108E5217D00B6
-:1030B000FCC3E5709CF570E56F9DF56F8009857028
-:1030C00021E4F56F757049752200E522C395215002
-:1030D00026AD6AAE69AF681201EFFCE52224F8F56F
-:1030E00082E434FEF583ECF005220DED70010E8DC7
-:1030F0006A8E698F6880D3E521547F90FF81F0222A
-:103100008C487F00EF24FD4019E4EF75F007A424FC
-:103110007FF582E434F8F583E065487002D3220F2E
-:1031200080E28F47C32285727085716F90FF82E0C5
-:1031300054F7F090FF83E0547FF022C000C001C03C
-:1031400002C006C007E5782408F8860653067F7C8F
-:10315000FF1231AD7C007D00E57B6046FF90FD9560
-:10316000E0547F6E700FC083C082A3E0FDA3E0FC3B
-:10317000A3157B8007A3A3A3DFE68026DF06D0820A
-:10318000D083801EE0F8A3E0F9A3E0FAD082D083D8
-:10319000E8F0A3E9F0A3EAF0A3C083C082A3A3A34D
-:1031A00080DA123246D007D006D002D001D00022F9
-:1031B00085A87A75A888EC70027C3F8C7922E57826
-:1031C0002408F8760012329A80FBC000C001C002C9
-:1031D000C006C007AE047CFF1231ADE57B6042FF44
-:1031E00090FD95E0547F6E700BC083C082A3A3A3B3
-:1031F000157B8007A3A3A3DFEA8026DF06D082D059
-:103200008380D8E0F8A3E0F9A3E0FAD082D083E885
-:10321000F0A3E9F0A3EAF0A3C083C082A3A3A38034
-:10322000DA7808087918097C01E6547F6E70067612
-:10323000007700800608090CBC08EE123246D00761
-:10324000D006D002D001D00022757900857AA8225C
-:10325000C0F0C082C083C3E57B24E8500512329AD7
-:1032600080F4EC6031903575E493C39C4028C00431
-:103270007CFF1231ADD004430480E57B75F003A4DC
-:103280002495F582E434FDF583ECF0EFA3F0EEA392
-:10329000F0057B123246D083D082D0F022C0047C6D
-:1032A00020D28CD28DD504FDD0042275A80075885B
-:1032B0000075B80075F00075D000E4F8900000F6D5
-:1032C00008B800FB020000C3ED940250047D037CAB
-:1032D000E8ECF4FCEDF4FD0CBC00010D8C7F8D7E60
-:1032E00022C3EC94BCED940250047D077CD0ECF436
-:1032F000FCEDF4FD0CBC00010D8C7D8D7C22EC708E
-:103300000122C000E5782418F8A604E5782408F81E
-:10331000C6547FF6E630E703D0002212329A80F4DA
-:10332000C28C857C8C857D8AD28CC0E0C0D0C0F0F8
-:10333000C082C083C000C001C002C003C004C00579
-:10334000C006C007121AF8E5782408F8E66024E5FC
-:10335000782410F8A681E57875F021A4248DF582F3
-:10336000E434FCF58378AEE58104C398F9E6F0080F
-:10337000A3D9FA74082578F8057808E65480700C0B
-:10338000E578B407F3780875780080EFE5782410C5
-:10339000F88681E57875F021A4248DF582E434FC6B
-:1033A000F58378AEE58104C398F9E0F608A3D9FA6D
-:1033B000D007D006D005D004D003D002D001D00071
-:1033C000D083D082D0F0D0D0D0E032C0E0C0D0C026
-:1033D00000C001C002C28E857E8D857F8BD28E7823
-:1033E0001979097A07E77004A600800BE6600816D1
-:1033F000E67004E74480F70809DAEAE57960131417
-:10340000F579700EE5782408F87600123246D28CF1
-:10341000D28DD002D001D000D0D0D0E0327581ADB5
-:10342000742A90FF93F0757F30757EF8757D607516
-:103430007CF012053F1234CE12175B90FF93E044EC
-:1034400001F0B2B31234F81232A880DA22C0007C44
-:1034500001EC2408F8E660090CBC08F512329A80E9
-:10346000EED00022C0F0C082C083C000C006C007FA
-:10347000ED2410F876BCED75F021A4248DF582E4DE
-:1034800034FCF583C082C083A3A3E4780DF0A3D8F5
-:10349000FCEC547F75F002A42441F582E5F034354C
-:1034A000F583E493FE740193F5828E83E493FE74B6
-:1034B0000193FFD083D082EFF0A3EEF0ED2408F863
-:1034C000EC4480F6D007D006D000D083D082D0F074
-:1034D00022757800757B007A08791878087600776D
-:1034E000000809DAF8E478087480447FF67401442F
-:1034F00010F58975B808D2ABD2A9227581ADD28EEC
-:10350000D28CD2AFE57B6032FF90FD95E0548060B5
-:103510002478087908E0547FFA7B00E6547FB502EE
-:10352000027BFF08D9F5EB700CEAF012344AAD04C7
-:10353000AC02123461A3A3A3DFD212329A80C57CFD
-:10354000017D002204FE04F204F604EA04E604E22B
-:1035500004EE04FA04A604AA04D604DA04A204A21F
-:1035600004A204DE04BE04B604BA04B204CA04C64B
-:1035700004C204CE04D204AE1901030022004802A2
-:1035800000480E301420C81AD0180A0C0506020391
-:1035900001020001CE0181010000C0008000600036
-:1035A0003000180010000800040002000100081894
-:1035B00028380C05100A0200000000000301100A60
-:1035C000020000000000FBE0FBF2090227000102FC
-:1035D00000A0FA0904000003FF00000007058102B3
-:1035E00040000007050102400000070583030200B8
-:1035F00001220354005500530042003300340031CF
-:1036000000300020002000200020002000200020AA
-:073610000020000000000093
-:00000001FF
diff --git a/firmware/mts_edge.fw.ihex b/firmware/mts_edge.fw.ihex
deleted file mode 100644
index d14ebd647846..000000000000
--- a/firmware/mts_edge.fw.ihex
+++ /dev/null
@@ -1,881 +0,0 @@
-:10000000F0360002001E021AFBFFFFFFFFFF023363
-:10001000F9FFFFFFFFFFFFFFFFFFFFFFFFFF0234BE
-:10002000A47581D490FDE88583A0123618EC4D604C
-:100030007378AF8003760018B8A0FA787F800376D3
-:100040000018B865FA78208003760018B820FA788E
-:10005000208003760018B81FFA90FDDDAE83AF82D2
-:1000600090FBF81200AA6005E4F0A380F690FDE88A
-:10007000A88290FDE8A982E8696005E4F20880F7AB
-:100080009001081200B390010C1200B390011012FD
-:1000900000B39001141200D190011A1200D1900106
-:1000A000201200D175D0001234F6020126EF6582CD
-:1000B0007003EE658322E493F8740193F97402935C
-:1000C000FE740393F5828E83E869700122E493F64F
-:1000D000A30880F4E493FC740193FD740293FE740E
-:1000E0000393FF740493F8740593F58288831200D8
-:1000F000AA700122E493A3A883A9828C838D82F045
-:10010000A3AC83AD828883898280E32121049B8014
-:1001100080049BB0B4049BFDE8049F049FFBF304A0
-:10012000A4049FFBF30504050480FED0F030F00921
-:1001300020F303F68010F7800D30F10920F303F26D
-:100140008004F38001F020F404FCD0E0CC22CCC089
-:10015000E0120163020154BC0005D0F0ACF022C3F0
-:1001600013DCFC02012ABF0009ED258275F001F8BD
-:10017000E622BF010FED2582F582EE3583F583750A
-:10018000F004E022ED258275F002F8E222D083D05F
-:1001900082F5F0C3E493A3C5F095F0C0E0C3D0F0BE
-:1001A000E493A395F04012A3A3C3E5F033500205F6
-:1001B000832582F58250020583740193C0E0E493A5
-:1001C000C0E022D083D082F5F0E4937009740193EB
-:1001D0007004A3A3800C74029365F06005A3A3A32D
-:1001E00080E7740193C0E0E493C0E022120264024D
-:1001F00001FB1202B80201FB1202DC0201FB30E03B
-:100200000720E302E622E72230E10720E302E222B0
-:10021000E32230E202E022E493221202DC02022313
-:100220001202B8020223ABF012022DCBC5F0CB2292
-:1002300030E01020E306E6F5F008E622E7F5F009E5
-:10024000E7192230E11020E306E2F5F008E222E3AC
-:10025000F5F009E3192230E206E0F5F0A3E022E42C
-:1002600093F5F074019322BB0003740922BB0107CC
-:1002700089828A83740422BB020789828A8374106C
-:1002800022740A22020284BB0007E92582F8740165
-:1002900022BB010DE92582F582EA3583F5837404DA
-:1002A00022BB020DE92582F582EA3583F5837410BD
-:1002B00022E92582F87402220202B8BF0005EDF897
-:1002C000740122BF01078D828E83740422BF02074E
-:1002D0008D828E83741022EDF87402220202DCBF3C
-:1002E0000007ED2582F8740122BF010DED2582F58E
-:1002F00082EE3583F583740422BF020DED2582F56D
-:1003000082EE3583F583741022ED2582F874022283
-:10031000020310C0E0120264020328C0E01202B817
-:10032000020328C0E01202DC02032830E00B20E3C5
-:1003300004D0E0F622D0E0F72230E10B20E304D035
-:10034000E0F222D0E0F322D0E0F022C9CDC9CACE3B
-:10035000CACBCFCB12035BEDF9EEFAEFFB22BB0069
-:100360002FBF000AFAEDF8E7F60809DAFA22BF0112
-:10037000128D828E83F802037809A3E7F0D8FA225F
-:10038000020383FAEDF8E7F20809DAFA2202038D94
-:10039000BB014DBF001489828A83F9EDF802039FE7
-:1003A00008A3E0F6D9FA220203B0BF01228D828EA3
-:1003B00083FB08C9C582C9CAC583CAE0A3C9C5826F
-:1003C000C9CAC583CAF0A3DBEAD8E8220203D38DE9
-:1003D000828E83F9EDF8E0F208A3D9FA220203DD58
-:1003E000BB024DBF001289828A83F9EDF80203EF48
-:1003F00008A3E493F6D9F922BF01238D828E83FBF3
-:1004000008C9C582C9CAC583CAE493A3C9C582C93C
-:10041000CAC583CAF0A3DBE9D8E722020422898295
-:100420008A83F9EDF8E493F208A3D9F922020433A0
-:10043000BF000DFAEDF8E3F60809DAFA2202043DEE
-:10044000BF01128D828E83F802044A09A3E3F0D81B
-:10045000FA22020455FAEDF8E3F20809DAFA220268
-:10046000045FE6FB08E6FA08E6F904F618700106F0
-:1004700022E6FF08E6FE08E6FD22EFF0A3EEF0A379
-:10048000EDF022EBF0A3EAF0A3E9F022E0FFA3E015
-:10049000FEA3E0FD22E0FBA3E0FAA3E0F9220000C6
-:1004A000000000000000000504006105730026053F
-:1004B0009A00330A0B00610A770066154600610C4A
-:1004C000FB006109AB006109E200610DC200610B34
-:1004D000F300610A1E00610A530061173E003317E2
-:1004E0005100341E1600431EBC0044202900442045
-:1004F0001700471EE300471F88004D1FD9004F1FFC
-:10050000050058338400617CCC7DFF121CC722900B
-:10051000FFFCE020E72DC2AFAE59AF58755A20E579
-:100520005A14C55A6019E4FE7F05EE4FCE24FFCE63
-:10053000CF34FFCF6007E490FF92F080ED80E08E33
-:10054000598F582212050C7D077CB71233A07D0FFE
-:100550007C6E1233BA78A17A06E4F608DAFC7A06E1
-:100560001205CF7C03120E57122165E4FEFF7C0FAB
-:10057000123329D2A822123214E490FC38F090FFF2
-:10058000F0E030E408740190FC39F08005E490FC60
-:1005900039F07D0A7C00122547123297221232145C
-:1005A00090FC39E014700E90FFF0E04410F07C00F5
-:1005B0001225E0801990FC39E0700E90FFF0E054B5
-:1005C000EFF07C001225E080057C171225E0123246
-:1005D000972290FFF0E054ABF090FFF0E04420F061
-:1005E000228C378D367882EDF608ECF6EDFEECFDC8
-:1005F0007F019000051201F57880F67882E6FD080B
-:10060000E6FCEDFEECFD7F019000041201F5540FB5
-:10061000FC7D8012176F7880E6700DAD3AAE39AF71
-:1006200038E41203187C082290FFF0E054FEF090AA
-:10063000FFF0E054FDF0801E7882E6FD08E6FCED58
-:10064000FEECFD7F0190000812021725E0440190A6
-:10065000FFF3F00206DB7882E6FD08E6FCEDFEEC37
-:10066000FD7F0190000612021754FE90FFF3F08008
-:100670002B7882E6FD08E6FCEDFEECFD7F019000A4
-:1006800008120217FAEB90FFF1F01208CA400DAD04
-:100690003AAE39AF38E41203187C18227882E6FDAE
-:1006A00008E6FCEDFEECFD7F0190000812021790B9
-:1006B000FFF1F01208CA400DAD3AAE39AF38E4127E
-:1006C00003187C18227882E6FD08E6FCEDFEECFDBE
-:1006D0007F01900006120217440190FFF3F0788327
-:1006E000E62403F618E63400F67880E624FE500986
-:1006F00090FFF0E054FDF0800790FFF0E04402F03E
-:10070000E490FFF1F0788176007880E624FFFCE445
-:1007100034FFFD7881E67F00FEECD39EEF6480CD50
-:1007200064809D402F1208AF400F7881E6AD3AAE4D
-:1007300039AF381203187C182290FFF2E0FC78825F
-:100740008683088682ECF0788106A37882A68308E7
-:10075000A68280B51208AF400F7881E6AD3AAE3977
-:10076000AF381203187C182290FFF2E0FC788286E2
-:1007700083088682ECF07880E6AD3AAE39AF381265
-:1007800003187C00228C378D367882EDF608ECF663
-:10079000EDFEECFD7F019000051201F57881F67801
-:1007A00082E6FD08E6FCEDFEECFD7F019000041200
-:1007B00001F5540FFC7D8112176F7881E670037C80
-:1007C000082290FFF0E054FEF090FFF0E054FDF0BE
-:1007D000801B7882E6FD08E6FCEDFEECFD7F0190D3
-:1007E000000812021725E090FFF3F0805B7882E6A4
-:1007F000FD08E6FCEDFEECFD7F01900006120217FD
-:1008000054FE90FFF3F080217882E6FD08E6FCEDCF
-:10081000FEECFD7F01900008120217FAEB90FFF149
-:10082000F01208CA40037C18227882E6FD08E6FC34
-:10083000EDFEECFD7F0190000812021790FFF1F031
-:100840001208CA40037C18227883E6240AF618E6C8
-:100850003400F6788076007881E624FFFCE434FFEB
-:10086000FD7880E67F00FEECD39EEF6480CD64804F
-:100870009D402178828683088682E090FFF1F01205
-:1008800008CA40037C1822788006788306E6187030
-:10089000010680C390FFF0E04401F078828683086F
-:1008A0008682E090FFF1F01208CA40037C18227C97
-:1008B000002290FFF0E020E71290FFF0E030E50921
-:1008C00090FFF0E04420F0C32280E7D32290FFF0B5
-:1008D000E020E31290FFF0E030E50990FFF0E04403
-:1008E00020F0C32280E7D3228C428D417C00ED545E
-:1008F000F0FDEC7003ED64307005753E0380037508
-:100900003E04AC3E120F74758300858340E541546C
-:100910000FF53FE5407004E53F64037035E53E2484
-:10092000FD75F00AA42402F582E434FCF583E0307E
-:10093000E60512105B8019E53E24A1F8E654FBF6AB
-:1009400078ADE62405F58218E63400F583740FF0DF
-:100950008059E5407004E53F64047048E53E24FD9D
-:1009600075F00AA42402F582E434FCF583E030E556
-:1009700007AC42AD41121C5CE54230E21578B1E6AD
-:1009800030E00F78B1E630E109E4FF04FE7C0412A8
-:10099000332978ADE62406F58218E63400F5837431
-:1009A0000FF08007E4FC7DEE121C5CC203221232C1
-:1009B00014120F7478ADE62406F58218E63400F5BB
-:1009C00083E090FC38F078ADE62405F58218E63433
-:1009D00000F583E090FC39F0C2037D027C00122513
-:1009E00047123297221232147899ECF6EC24A1F8CF
-:1009F000E630E1077C131225E0800F90FC39E0FD22
-:100A00007899E6FC1213F11225E012329722123285
-:100A1000147899ECF67D00120F141225E01232972B
-:100A2000221232147899ECF6EC24A1F8E630E207B1
-:100A30007C131225E0801B7899E624A1F8E620E1DA
-:100A4000077C121225E0800A7899E6FC1214151230
-:100A500025E0123297221232147899ECF6EC24A198
-:100A6000F8E620E2077C111225E0800A7899E6FC7E
-:100A70001215161225E0123297221232147899ECD0
-:100A8000F6120F7478ADE62409F58218E63400F505
-:100A900083E090FC3FF078ADE6240AF58218E63456
-:100AA00000F583E090FC40F078ADE62403F5821871
-:100AB000E63400F583E0FC78ADE62404F58218E620
-:100AC0003400F583E0F56278ADE62402F58218E69D
-:100AD0003400F583E0F5638C61E4EC333354017842
-:100AE00099F66008E56230E1037899067899E69016
-:100AF000FC41F078ABE62402F58218E63400F58379
-:100B0000E0FDA3E0540CFCED54E68C65F564E56172
-:100B100030E503436501E56220E50EE561547F7031
-:100B200008E56120E703436502E56130E3034365BF
-:100B300010E56130E203436520E56154036003433F
-:100B40006540E56130E103436580E56130E40343DE
-:100B50006401E56130E603436408E56220E40EE5E4
-:100B600061547F7008E56120E7034364105365FB1F
-:100B70005364F9AD64E56590FC3ACDF0A3CDF0E5A2
-:100B80006330E30DE5635430C4540F90FC3DF080B6
-:100B900005E490FC3DF0E563540390FC3CF0E56314
-:100BA0005404C31390FC3EF090FC3CE0700E7D3585
-:100BB0007EFC7F01740190000912014B78ADE624A0
-:100BC00008F58218E63400F583E07C00FD78ADE698
-:100BD0002407F58218E63400F583E07F004CFEEF31
-:100BE0004D90FC38F0A3CEF0CEC2037D0A7C0012FB
-:100BF0002547123297221232147899ECF6789E76B5
-:100C0000010876FC087638789B760C789E12046E84
-:100C100012021D789CCBF6CB08F67F00EF24EA4049
-:100C20001FE4EF25E090365AFD93CD0493789D663E
-:100C30007003ED18667006789B760080030F80DCE9
-:100C4000789AEFF6789E12046E90000212021778DE
-:100C50009CCBF6CB08F65404CB54064B6004789B2F
-:100C6000760B789DE630E313789E12046E900005B3
-:100C70001201F524FB5004789B760D789DE654C054
-:100C80007D0064C04D7004789B760B789E12046ED4
-:100C90009000041201F524FC5004789B760F789E96
-:100CA00012046E9000061201F524FD5004789B7624
-:100CB0000E789E12046E9000091201F524FD500476
-:100CC000789B760A789BE6702A7899E6FC120F7476
-:100CD000789E12046E78ABE6F978AAE6FA7B017486
-:100CE0000A7800120348C2037899E6FC12111778BB
-:100CF0009BECF6789BE6FC1225E01232972212322A
-:100D0000147899ECF6120F747899E624FD75F00AC0
-:100D1000A42414F582E434FCF583AC82AD8378AA74
-:100D20008683088682ECF9EDFA7B0A78011203B01B
-:100D3000C2037899E6FC121117123297228D2B8C80
-:100D40002AED60407527017529487528FFE52A249A
-:100D5000FDFCE434FFFDEC7C0325E0CD33CDDCF974
-:100D6000FCE5292CF529E5283DF528AD29AE28AF6D
-:100D700027748090000612032074809000021203F2
-:100D800020120FC7E52B14603B75270175290875E4
-:100D900028FFE52A24FDFCE434FFFDEC7C0325E07C
-:100DA000CD33CDDCF9FCE5292CF529E5283DF528E6
-:100DB000AD29AE28AF27E4900006120320E490008E
-:100DC00002120320221232147899ECF6EC24A1F8D6
-:100DD000E630E2097899E6FC121516D2007899E619
-:100DE000FC120F74789A760090FC39E030E70478B2
-:100DF0009A7601789AE6FD7899E6FC120D3AC203DC
-:100E00003000077899E6FC1214157C001225E012D8
-:100E100032972278ADE62404F58218E63400F58393
-:100E2000E04401F078ADE62404F58218E63400F5DC
-:100E300083E030E00280ED78ADE6240BF58218E621
-:100E40003400F583E054F8F078ADE62402F582181A
-:100E5000E63400F583E04480F022C2038C58120F80
-:100E60007478AA8683088682798B7A367B0A780121
-:100E70001203FE120E10AC587D02120D3AC203ACE2
-:100E800058121117228D538E528F518C50120F749D
-:100E9000754F0078ADE62405F58218E63400F58339
-:100EA000E020E41FE54F24F64019054FC2037C18EB
-:100EB0001233D790FF93E04401F0B2B3AC50120F5D
-:100EC0007480D078ADE62405F58218E63400F58309
-:100ED000E020E405C2037C022278ADE62405F58219
-:100EE00018E63400F583E0540F601678ADE624056B
-:100EF000F58218E63400F583E0540FF0C2037C015C
-:100F00002278AC8683088682E0AD53AE52AF511290
-:100F10000318C2037C00228D318C30121516E53186
-:100F2000600FE530B4030A7C0112250F7C81122585
-:100F30000FAC30120F74E531601A78AE86830886E4
-:100F400082E054E7F0A3A3A3A3E054E7F0AC307D24
-:100F500002120D3A78AA868308868279957A367BC2
-:100F60000A78011203FEC203E53024A1F8E654FD1D
-:100F7000F6AC30121117228C26300305123376801E
-:100F8000F87C0A123289D203E52624FD78A7F67090
-:100F90000778AE76FF0876E078A7E67D007C04252A
-:100FA000E0CD33CDDCF9FC24A078ADF6ED34FF18AC
-:100FB000F678A7E675F00AA42400FCE434FCFD787A
-:100FC000AAEDF608ECF61233222278ADE62402F5FB
-:100FD0008218E63400F583E030E72278ADE624029B
-:100FE000F58218E63400F583E0547FF078ADE6240E
-:100FF00002F58218E63400F583E04480F02278AEF2
-:101000008683088682E0547FF0AD83E5822404FC69
-:10101000E43D8C82F583E0547FF078ADE6240BF557
-:101020008218E63400F583E054F8F078AFE6240146
-:10103000F58218E63400F583E04403F078AFE62447
-:1010400005F58218E63400F583E04403F078ADE658
-:101050002405F58218E63400F583740FF02278AE8B
-:101060008683088682E0543FF0AD83E5822404FC49
-:10107000E43D8C82F583E0543FF078A7E624A8F89D
-:10108000E6FC78AFE62401F58218E63400F583EC3F
-:10109000F078A7E624A8F8E6FC78AFE62405F58208
-:1010A00018E63400F583ECF078ADE6240BF58218F1
-:1010B000E63400F583E054FB4402F52678ABE624E1
-:1010C00002F58218E63400F583E030E5034326019B
-:1010D00078ADE62405F58218E63400F583E030E0CB
-:1010E00003120FC7E526FC78ADE6240BF58218E65F
-:1010F0003400F583ECF078ADE62405F58218E6348B
-:1011000000F583740FF078AE8683088682E0448011
-:10111000F0A3A3A3A3E04480F0228C2A120F7478DA
-:10112000ABE62408F58218E63400F583E0FC78ADE0
-:10113000E6240AF58218E63400F583ECF078ABE695
-:101140002407F58218E63400F583E0FC78ADE62448
-:1011500009F58218E63400F583ECF078AA86830856
-:101160008682E0FDA3E0FCEDFE78ADE62408F58282
-:1011700018E63400F583EEF0ECFE78ADE62407F5D2
-:101180008218E63400F583EEF08C298D28C3EC94A8
-:1011900005ED940C400575277C8033D3E529940137
-:1011A000E5289403400575273C8023D3E5299481E5
-:1011B000E528940140057527188013D3E52994602C
-:1011C000E5289400400575270C8003752708AF2794
-:1011D000E4EF547C4483FF8F27E527FC78AFE624B7
-:1011E00001F58218E63400F583ECF0E527FC78AFD2
-:1011F000E62405F58218E63400F583ECF0E527FCDB
-:1012000078A7E624A8F8ECF678ADE62402F5821873
-:10121000E63400F583E0F52778ABE62402F5821882
-:10122000E63400F583A3E030E3175327C778ABE635
-:101230002405F58218E63400F583E0903686934263
-:101240002778ABE62402F58218E63400F583E03017
-:10125000E70543274080035327BF5327FB78ABE6BE
-:101260002406F58218E63400F583E0600343270482
-:101270005327FC78ABE62404F58218E63400F583A6
-:10128000E04227432780E527FC78ADE62402F5827B
-:1012900018E63400F583ECF078ADE62404F5821806
-:1012A000E63400F583E0F52778ABE62402F58218F2
-:1012B000E63400F583A3E030E1055327DF800343E4
-:1012C000272078ABE62402F58218E63400F583E0A7
-:1012D00030E4055327EF800343271078ABE6240959
-:1012E000F58218E63400F583E0B40203432702E5F3
-:1012F00027FC78ADE62404F58218E63400F583EC8B
-:10130000F078ADE62403F58218E63400F583E0F5C5
-:101310002778ABE62409F58218E63400F583E070FF
-:101320000553277F800343278078ABE62402F582AC
-:1013300018E63400F583A3E030E00543272080035E
-:101340005327DF78ABE62402F58218E63400F583F4
-:10135000E030E30543274080035327BF78ABE62402
-:1013600002F58218E63400F583E030E005432710EB
-:1013700080035327EF78ABE62402F58218E63400A9
-:10138000F583A3E030E40543270880035327F7786B
-:10139000ABE62402F58218E63400F583A3E030E5DD
-:1013A0000543270480035327FB78ABE62402F5822C
-:1013B00018E63400F583A3E030E6054327018003F7
-:1013C0005327FE78ABE62402F58218E63400F58355
-:1013D000A3E030E70543270280035327FDE527FC00
-:1013E00078ADE62403F58218E63400F583ECF0C20C
-:1013F000037C00228D278C26ED54031460037C109F
-:1014000022E527547C24FC40037C0B22E52624A102
-:10141000F8E64402F67C00228C30120F74E530248A
-:10142000A1F8E620E24FAC307D02120D3AE53024FF
-:10143000FE4428FC78AE8683088682ECF0AF83E514
-:10144000822404FEE43FFFEC8E828F83F07C038CC9
-:101450002CE52CFC78AFE62401F58218E63400F583
-:1014600083ECF0E52CFC78AFE62405F58218E63431
-:1014700000F583ECF0752D01752F48752EFFE530D2
-:1014800024FDFCE434FFFDEC7C0325E0CD33CDDC12
-:10149000F9FCE52F2CF52FE52E3DF52E78AFE6244F
-:1014A00004F58218E63400F583E054E7F52CAD2FFF
-:1014B000AE2EAF2DE4900002120320E4900006123D
-:1014C00003201201EF30E503432C10E52CFC78AF2C
-:1014D000E62404F58218E63400F583ECF012105B84
-:1014E00078ADE62406F58218E63400F583E0C20301
-:1014F000FCE53024A1F8E64404F68C2CE530540FCA
-:10150000C454F07E00FFEEEF44047D00FFEC4EFC7F
-:10151000ED4FFD121CC77C00228C2F120F74120F8E
-:10152000FB78AE8683088682E05408F0A3A3A3A3C9
-:10153000E05408F0AC2F7D02120D3AC203E52F24CF
-:10154000A1F8E654FBF67C0022123214789AECF6ED
-:10155000EC24A1F8E630E10A7D007C131225471245
-:101560003297789AE624A1F8E64401F6789AE6FCE8
-:10157000120F74789AE624FD75F00AA42414F582FB
-:10158000E434FCF58378AAE6FA08E6F97B0A7801E8
-:101590001203B078AA868308868279957A367B0A08
-:1015A00078011203FE120FC7C203789AE6FC1211EB
-:1015B000177899ECF6EC600A7D007C08122547123A
-:1015C0003297789AE6FC120F7478ADE62404F5821F
-:1015D00018E63400F583E0441054DFFC78ADE624CF
-:1015E00004F58218E63400F583ECF07899ECF6C245
-:1015F000037CC81233D7789AE6FC120F7478ADE6F4
-:101600002404F58218E63400F583E054EFF0C203B9
-:101610007CC81233D7789AE6FC120F7478ADE624B2
-:1016200004F58218E63400F583E04410F0C2037C30
-:10163000C81233D7789AE6FC120F7478ADE624040A
-:10164000F58218E63400F583E04420F0C2037CF014
-:101650001233D7789AE6FC120F7478ADE62405F5BC
-:101660008218E63400F583E030E415C203789AE688
-:1016700044107F00FE7C0712332912329702173D77
-:1016800078ADE62404F58218E63400F583E054CF03
-:10169000F0C2037CC81233D7789AE6FC120F747834
-:1016A000ADE62404F58218E63400F583E04430F01A
-:1016B000C2037CF01233D7789AE6FC120F7478AD2F
-:1016C000E62405F58218E63400F583E030E414C220
-:1016D00003789AE644107F00FE7C07123329123209
-:1016E00097805D78ADE62404F58218E63400F58332
-:1016F000E054EFF078ADE62404F58218E63400F506
-:1017000083E054DFF0789AE624FD75F00AA42414EF
-:10171000F582E434FCF583AC82AD8378AA86830835
-:101720008682ECF9EDFA7B0A78011203B0C20378E5
-:101730009AE6FC1211177D007C0B12254712329796
-:1017400022123214E490FC39F07D027C001225470D
-:10175000123297221232147C001225E012329722A4
-:10176000743C90FBE0F0743E90FBE0F0E490FC28C9
-:10177000F0228D358C34ECB401028003D34002801A
-:1017800028B402028003D34008A835E625E0F6809D
-:1017900018B404028003D3400AA835E625E025E00A
-:1017A000F68006A83576008000228C3C8D3BEDFE4D
-:1017B000ECFD7F0175660675670090FC29120477C1
-:1017C0001201EFB480028006D3500302187090FC1F
-:1017D000291204899000031201F554F0B4300280FC
-:1017E00003D3405F90FC291204899000081202176D
-:1017F000FAFDEBFE7F0190FC2C120477EECD9036C3
-:101800009FFCE493FF740193FEF9EFFA7B01EAFF7A
-:10181000E9FEECC39EED9F40259036A1E493FD7454
-:101820000193FCEDFEECFD7F01EECDFC90FC2EE083
-:10183000D39C90FC2DE09D50057566808033121975
-:101840008E802EB460028003D3400BAC3CAD3B12C3
-:1018500007828C66801BB41003B34010C3B420030E
-:10186000B34009C3B440028003D340007566818051
-:10187000008075B481028003D3406B90FC29120470
-:10188000899000031201F554F0B430028003D34074
-:101890001D90FC29120489900008120217FAFDEB32
-:1018A000FE7F0190FC2F1204771218F88036B46086
-:1018B000028003D34013753A67E4F539F538AC3C40
-:1018C000AD3B1205DE8C66801BB41003B34010C321
-:1018D000B42003B34009C3B440028003D340007571
-:1018E0006681800080028000E566FC90FC2912047D
-:1018F00089EC900002120320AC672290FC291204AC
-:10190000899000041201F5600474018001E4A2E0F2
-:10191000920190FC29120489ED2403FD50010E90E0
-:10192000FC2C12047790FC29120489900005120106
-:10193000F5F5679000041201F5540FFC7D6712174E
-:101940006FE5677004756608227566007884760016
-:101950007884E6C39567503890FC2F1204891201F1
-:10196000EFFC90FC2C120489EC12031830010E904D
-:10197000FC31E004F090FC307003E004F078840661
-:1019800090FC2EE004F090FC2D7003E004F080C089
-:101990002290FC2AE0FDA3E0FCEDFEECFD7F01EDD2
-:1019A000240AFD50010E90FC3212047790FC29129B
-:1019B00004899000041201F5540FB401028003D38E
-:1019C000401790FC321204890DED70010E90FC2F2F
-:1019D00012047778887601804EB402028003D340E7
-:1019E0001990FC32120489ED2402FD50010E90FC86
-:1019F0002F12047778887602802DB404028003D3F6
-:101A0000401990FC32120489ED2404FD50010E901F
-:101A1000FC2F12047778887604800CB400028003CF
-:101A2000D340007566082290FC29120489900005B5
-:101A30001201F5F567788576007885E6C3956740ED
-:101A400003021AF6788676007886E6C37888965080
-:101A50007690FC2C1204891201EFFC90FC321204E7
-:101A6000921201E9F45CFC1201E9F890FC2F1204D7
-:101A700089E8C0E01201EFC8D0E0C8584CFC90FCE7
-:101A80002C120489EC1203187887ECF690FC31E0F4
-:101A900004F090FC307003E004F009E970010A9052
-:101AA000FC3212048090FC29120489900004120177
-:101AB000F530E40E90FC2EE004F090FC2D7003E075
-:101AC00004F078860680817888E6FDE4FEFFEECD9E
-:101AD000FC90FC31E02CF090FC30E03DF07888E6A2
-:101AE000FDE4FEFFEECDFC90FC34E02CF090FC33E6
-:101AF000E03DF0788506021A367566002222C0E0C5
-:101B0000C0F0C082C083C0D0E8C0E0E9C0E0EAC055
-:101B1000E0EBC0E0ECC0E0EDC0E0EEC0E0EFC0E024
-:101B200090FF92E01201C01B49301B49321B58380C
-:101B30001B6A3A1B7C3E1B94441B88461BA0501B0F
-:101B4000E2521BC1541C035600001C2490FF92E07B
-:101B50007F00FE7C01123329021C34E4FF04FE7C6A
-:101B600003123329742090FFFEF0021C34E4FF04BA
-:101B7000FE7C02123329744090FFFEF0021C34E414
-:101B8000FF04FE7C04123329021C34E4FF04FE7CB3
-:101B900005123329021C34E4FF04FE7C06123329AB
-:101BA000021C3490FFA5E07D0090FBF8CDF0A3CDA2
-:101BB000F090FBF9E0FCF58390FBF8E04433FD1274
-:101BC0001CC7807390FFB5E07D0090FBFACDF0A3B9
-:101BD000CDF090FBFBE0FCF58390FBFAE04443FD85
-:101BE000121CC7805290FFA6E07D0090FBFCCDF058
-:101BF000A3CDF090FBFDE0FCF58390FBFCE04434CA
-:101C0000FD121CC7803190FFB6E07D0090FBFECD39
-:101C1000F0A3CDF090FBFFE0FCF58390FBFEE044E9
-:101C200044FD121CC7801090FF92E07D00FCED4443
-:101C3000AAFD121CC78000E490FF92F0D0E0FFD014
-:101C4000E0FED0E0FDD0E0FCD0E0FBD0E0FAD0E058
-:101C5000F9D0E0F8D0D0D083D082D0F0D0E03205F7
-:101C600081058105810581A881181818EDF608EC19
-:101C7000F690FF5AE020E70280F790FF59E07D00E0
-:101C8000A88118CDF6CD08F67D03A881E618FCE6FC
-:101C9000CC25E0CC33CCDDF9CCF6CC08F6A8811805
-:101CA000E644F8F6A881181818E6FD08E6FCA881B5
-:101CB000188683088682EDF0A3ECF0740290FF5A38
-:101CC000F0158115811581158122E5812405F581A5
-:101CD000E4A88118F6A88118181818EDF608ECF693
-:101CE00090FBF5E024F85003021DE8E4A8811818E1
-:101CF000F6A88118E6FEA88118181818E6FD08E66F
-:101D0000FC7F00EF24F8404DE4EF25E0247DF582D0
-:101D1000E434FCF583E0FBA3E06C7003FAEB6D7038
-:101D2000097401A8811818F6802BE4EF25E0247DC2
-:101D3000F582E434FCF5837A00E054F0CCF8CCCDA5
-:101D4000F9CDFB7800E954F0F9EA687002EB6970AC
-:101D5000010E0F80AEA88118EEF6A8811818181889
-:101D6000EDF608ECF6A881EFF6A8811818E6707970
-:101D7000A88118E624F74071A88118181818E654AD
-:101D80000FA881F664046017A881E664036010A8B8
-:101D90008118181818E6FD08E6FC121C5C804A7CC5
-:101DA0000A123289A88118181818E6FD08E6FC9076
-:101DB000FBF4E025E0247DF582E434FCF583EDF0CE
-:101DC000A3ECF090FBF4E0FFE4EF045407FF90FB7A
-:101DD000F4F090FBF5E004F012332290FBF6E07093
-:101DE00008E4FEFF7C0F123329802790FBF7E00404
-:101DF000F0543F701D90FBF7E044FE7D00FC90FB2B
-:101E0000F4E025E0247DF582E434FCF583EDF0A3D5
-:101E1000ECF0E58124FBF58122788B7600788C76D6
-:101E200000740190FBF6F012321490FBF5E060575D
-:101E30007C0A12328990FBF3E025E0247DF582E4F0
-:101E400034FCF583E0FDA3E0FC90FBF3E025E02407
-:101E50007DF582E434FCF583E4F0A3F090FBF3E03D
-:101E6000FFE4EF045407FF90FBF3F090FBF5E01460
-:101E7000F07889EDF608ECF61233227889E6FD0851
-:101E8000E6FC1208E580A312337690FF93E044014C
-:101E9000F0B2B3788B06B6000D788B7600788CE6BE
-:101EA000F40404788CF68082E490FBF6F090FBF565
-:101EB000E07D00FCED44CFFD121C5C123297221233
-:101EC0003214E5706449456F601590FF83E0540F4C
-:101ED0007D00D39570ED956F500512305D80031233
-:101EE000312D12329722123214E5706449456F6029
-:101EF00005123167800E90FF80E04408F090FF8368
-:101F0000E0547FF0123297221232148C54EC54F0C9
-:101F1000B41015756A357569FC756801E56A2403A6
-:101F2000F56AE5693400F569E4F557F556E556C3F9
-:101F300094015027E554540FFCAD6AAE69AF6812A6
-:101F40000E828C55EC60028012056AE56A7002050B
-:101F5000690557E5577002055680D2E554540F24A1
-:101F6000A1F8E654FEF6E554540F7F00FE7C1212F1
-:101F70003329E5551470097D007C09122547800737
-:101F8000AD577C001225471232972212321490FF6F
-:101F9000FCE04402F090FF00E030E71390FF83E0A4
-:101FA0004480F0436D8090FFFCE04401F08011908C
-:101FB000FF82E04408F0536D7F90FFFCE054FEF098
-:101FC00090FF81E04480F01225FA90FFFEE0440586
-:101FD000F090FFFCE054FDF0123297221232147C94
-:101FE000011233D778B1E64402F674FEFC04FD1208
-:101FF0001CC790FF5AE030E70280F7E4F54E754DBC
-:1020000010AC4EAD4DE54E154E7002154DEC4D60C9
-:102010000280EE438701123297221232147C0212A0
-:1020200032A378B1E654FDF61232972212321478B8
-:10203000B1E630E02C78B1E630E12678B1E6FCF587
-:102040008318E644F0FD121C5C90FFFCE04420F095
-:102050007C021233D778B1E654FDF6741A90FFFE75
-:10206000F078B1E6FCF58318E644F1FD121C5C1231
-:10207000329722756D0090FFFFE06003436D01759C
-:102080006E00E4F56CF56BE4F56F7570497484903F
-:10209000FF82F0748490FF80F0748090FF58F07499
-:1020A0008090FF5AF0AD46AF457E00EE24FE50030F
-:1020B00002213FE4EE75F007A4247FF582E434F8B2
-:1020C000F583E0FFE4EF5480FDE4EF540F14FFEDDF
-:1020D0006038E4EF75F008A42448F582E434FFF595
-:1020E000837490F0E4EF75F008A4244AF582E43498
-:1020F000FFF5837480F0E4EF75F008A4244EF582B8
-:10210000E434FFF5837480F08034E4EF75F008A4C4
-:102110002408F582E434FFF5837490F0E4EF75F061
-:1021200008A4240AF582E434FFF583E4F0E4EF75B3
-:10213000F008A4240EF582E434FFF583E4F00E02E7
-:1021400020A88D468E448F45747F90FFFDF07490DB
-:1021500090FFFCF0228C58EC24F65006E55824370A
-:10216000FC22E5582430FC22D2B0D2B1C2B41225F0
-:1021700044EC700302227F755C03AE5B7F00E55C7C
-:10218000155C6480247F5035EF2400F582E434FB35
-:10219000F583E0FE24FE501EEF7D00FCE4FB74742A
-:1021A000C39CFAEB9DFBEE7D00FCEAC39CED6480D2
-:1021B000CB64809B50028005EF2EFF80C18E5B8F29
-:1021C0005AE55C6480247F500302227FE55A248E06
-:1021D000500302227F855A5D755B00AE5AAF5B905B
-:1021E00036CAE493F55CE55C155C6480247F501886
-:1021F000EE2400F582E434FBF583E0FCEF9036CA70
-:10220000936C70040E0F80DE8E5A8F5BE55C6480E9
-:10221000247F406E755E017560E8755FFFE55D24A3
-:1022200002F55A755C07E55C334057AD60AE5FAFB1
-:102230005EE55CF5823395E0F5831201F5C4540F39
-:10224000FC122152E55A2400F582E434FBF583ECBC
-:10225000F0055A055AAD60AE5FAF5EE55CF58233BE
-:1022600095E0F5831201F5540FFC122152E55A2432
-:1022700000F582E434FBF583ECF0055A055A155C51
-:1022800080A4740290F851F090F86B79A37A367BB1
-:102290002778011203FE756A357569FC756801E4DB
-:1022A00090FF83F0748090FF81F0755902E55975B5
-:1022B000F007A4247FF582E434F8F583E07893F600
-:1022C000FC540F14FC7893ECF6E55975F007A42440
-:1022D00081F582E434F8F583E0789676FD0876E8B7
-:1022E000FC7893E675F008A42448F582E434FFF501
-:1022F00083E4F07893E675F008A4244FF582E43483
-:10230000FFF583ECF07896E6FF08E67E03CFC31373
-:10231000CF13DEF9FE7893E675F008A42449F58220
-:10232000E434FFF583EEF07893E675F008A4244AD0
-:10233000F582E434FFF5837480F07894ECF67D0048
-:102340007897E62CF618E63DF67896E6FD08E67CEA
-:1023500003CDC313CD13DCF9FC7893E675F008A424
-:10236000244DF582E434FFF583ECF07893E675F0C4
-:1023700008A4244EF582E434FFF583E4F07896E671
-:10238000FD08E6FC7893E6FF7E00EE24FE50030293
-:1023900024FEE4EE75F007A4247FF582E434F8F51A
-:1023A00083E0FFE4EF5480FAE4EF540F14FFE4EE0F
-:1023B00075F007A42481F582E434F8F583E078947D
-:1023C000F6E4EE1313548024F0F8E434FDF9E8FC4D
-:1023D000E9FD8A5AEA700302246BE4EF75F008A461
-:1023E0002448F582E434FFF583E4F07894E6FAE4D7
-:1023F000EF75F008A4244FF582E434FFF583EAF08A
-:10240000EDFBEC7A03CBC313CB13DAF9FAE4EF75E7
-:10241000F008A42449F582E434FFF583EAF07894C7
-:10242000E67B00FAEC2AFCED3BFDFBEC7A03CBC328
-:1024300013CB13DAF9FAE4EF75F008A4244DF58212
-:10244000E434FFF583EAF0E4EF75F008A4244AF5DC
-:1024500082E434FFF5837480F0E4EF75F008A4247F
-:102460004EF582E434FFF5837480F00224FAE4EF41
-:1024700075F008A42408F582E434FFF583E4F078CD
-:1024800094E6FAE4EF75F008A4240FF582E434FF33
-:10249000F583EAF0EDFBEC7A03CBC313CB13DAF947
-:1024A000FAE4EF75F008A42409F582E434FFF5831B
-:1024B000EAF07894E67B00FAEC2AFCED3BFDFBECBD
-:1024C0007A03CBC313CB13DAF9FAE4EF75F008A45F
-:1024D000240DF582E434FFF583EAF0E4EF75F008AB
-:1024E000A4240AF582E434FFF583E4F0E4EF75F008
-:1024F00008A4240EF582E434FFF583E4F00E0223F1
-:10250000878E597896EDF608ECF67893EFF6122060
-:1025100070228C26EC30E718E526540F1475F0086D
-:10252000A42448F582E434FFF583E054DFF08016FC
-:10253000E526540F1475F008A42408F582E434FF4E
-:10254000F583E054DFF0227C0022EC90FC37F08C25
-:1025500024ED2403F5257D00D39572ED957140039C
-:10256000857225E52524B75009752503740290FC72
-:1025700037F0AC2512315222E4F56CF56B12257E52
-:102580002290FC35E06573600E740490FC37F0E433
-:10259000F56B756C0380467D73E4FEFF79357AFC3C
-:1025A0007B0174057800120348E56C2403F56CE5A3
-:1025B0006B3400F56BE56CD39572E56B9571400655
-:1025C00085726C85716BD3E56C9448E56B94004023
-:1025D0000C740290FC37F0E4F56B756C03AC6C1274
-:1025E000315222EC90FC37F0E4F56CF56B8C32EC58
-:1025F000600512314380057C001231522290FF9316
-:10260000E04401F0B2B390FF04E0F54A90FF06E029
-:10261000FDA3E0ED7D00FC7D00FC90FF06E0FFA344
-:10262000E07E00FFE4FEEC4EFCED4FFDC3EC944871
-:10263000ED9400502290FF06E0FDA3E0ED7D00FC4C
-:102640007D00FC90FF06E0FFA3E07E00FFE4FEECCF
-:102650004EFCED4FFD8004E4FD7C488C728D719042
-:10266000FF02E0FDA3E0ED7D00FC7D00FC90FF0299
-:10267000E0FFA3E07E00FFE4FEEC4EF54CED4FF5ED
-:102680004B756A357569FC7568017D357EFC7F0187
-:102690007973E4FAFB74057800120348754900E584
-:1026A0004924FE4019AD6AAE69AF68E4120318050B
-:1026B000490DED70010E8D6A8E698F6880E1756A33
-:1026C000357569FC75680178B3E614184660030235
-:1026D00027927890E6FF08E6FE788EE4F608F6C3C7
-:1026E000788FE6940218E69400501DE4FEFFC3EED6
-:1026F00094E8EF940350070EBE00010F80F0788F2E
-:1027000006E61870010680D77890EFF608EEF6D24C
-:10271000B47890E6FF08E6FE788EE4F608F6C37813
-:102720008FE6941E18E69400501DE4FEFFC3EE945D
-:10273000E8EF940350070EBE00010F80F0788F067B
-:10274000E61870010680D77890EFF608EEF6C2B171
-:102750007890E6FF08E6FE788EE4F608F6C3788FF8
-:10276000E6943A18E69400501DE4FEFFC3EE94E8A8
-:10277000EF940350070EBE00010F80F0788F06E63D
-:102780001870010680D77890EFF608EEF6D2B1788F
-:10279000B2E4F608F690FF00E05460B40002800650
-:1027A000D35003022D9BE54A540FF549E54A548066
-:1027B000A2E0920290FF01E012018A000B2D962701
-:1027C000D428F22D9629FE2D962AE12B152C7C2C4F
-:1027D0007F2CBF2D3F2D6DE56D30E70EE54C454B51
-:1027E0007008E572640245716003022D9890FF0045
-:1027F000E0541FB400028003D34029E54A6003027D
-:1028000028EFAD6AAE69AF68740112031878B1E6BB
-:1028100030E00BAD6AAE69AF6874021203187C0237
-:1028200012315222B401028003D3401BE56D20E136
-:1028300007E54A60030228EFE54A24FE5003022818
-:10284000EF7C0212315222B402028006D3500302FE
-:1028500028EDE56D20E10DE54A6009E54A648060F8
-:10286000030228EFAC4A1231D940030228EFE549B0
-:10287000702530021190FF80E05408AD6AAE69AF58
-:1028800068120318800F90FF82E05408AD6AAE69A9
-:10289000AF68120318803D154930021DE54975F0F7
-:1028A00008A42448F582E434FFF583E05408AD6AB7
-:1028B000AE69AF68120318801BE54975F008A424BF
-:1028C00008F582E434FFF583E05408AD6AAE69AFE1
-:1028D00068120318AD6AAE69AF681201EF600BAD04
-:1028E0006AAE69AF6874011203187C021231522279
-:1028F0008000022D98E56D20E706E57245716003C2
-:10290000022D9890FF00E0541FB400028003D340D2
-:102910001AE54C14454B7004E54A60030229FB7824
-:10292000B1E654FEF67C0012315222B4010280035B
-:10293000D3402AE56D20E108E56D20E0030229FB84
-:10294000E56D30E004E54A700BE56D30E109E54ADC
-:1029500024FE50030229FB7C0012315222B40202F1
-:102960008006D350030229F9E54C454B6003022948
-:10297000FBAC4A1231D940030229FBE56D20E10787
-:10298000E56D20E0028077E56D30E006E549600204
-:10299000806CE549700F90FF82E054F7F090FF8063
-:1029A000E054F7F022E549B401028003D340097DE9
-:1029B000017C03120F148011B402028003D340097A
-:1029C0007D017C04120F1480001549300215E54981
-:1029D00075F008A42448F582E434FFF583E054F749
-:1029E000F08013E54975F008A42408F582E434FF6B
-:1029F000F583E054F7F07C00123152228000022D62
-:102A000098E56D20E706E57245716003022D989008
-:102A1000FF00E0541FB400028003D3401AE54C14B9
-:102A2000454B7004E54A6003022ADE78B1E64401B2
-:102A3000F67C0012315222B401028003D34029E512
-:102A40006D20E108E56D20E003022ADEE56D30E04F
-:102A500004E549700BE56D30E108E54924FE5002BC
-:102A6000807F7C0012315222B402028003D3406F77
-:102A7000E54C454B60028069AC4A1231D940028076
-:102A800060E56D20E107E56D20E0028054E54970C6
-:102A90001430020990FF80E04408F0800790FF8224
-:102AA000E04408F022E56D30E1331549300215E5C8
-:102AB0004975F008A42448F582E434FFF583E04426
-:102AC00008F08013E54975F008A42408F582E43481
-:102AD000FFF583E04408F07C00123152228002802E
-:102AE00000022D98E56D20E712E5724571700CE546
-:102AF0004A700890FF00E0541F6003022D98E54CD7
-:102B000090FFFFF090FFFFE06005436D01800353ED
-:102B10006DFE7C0012315222E56D30E70EE5724504
-:102B200071600890FF00E0541F6003022D98AD4BC8
-:102B3000E54CED7D00FC7D00FCBD00028003022C15
-:102B400077B401028003D34032E54A7005E54CFCBE
-:102B50006003022C79756A407569F8756801D3E5E0
-:102B6000729412E57194004006E4FD7C128004AC7E
-:102B700072AD718C708D6F12316722B402028003C6
-:102B8000D34059E54A6003022C79E54CFC70277567
-:102B90006A527569F8756801D3E5729419E5719404
-:102BA000004006E4FD7C198004AC72AD718C708D20
-:102BB0006F1231678025756A6B7569F8756801D386
-:102BC000E5729427E57194004006E4FD7C278004BB
-:102BD000AC72AD718C708D6F12316722B4030280BC
-:102BE00006D35003022C77E54CF549700F90FF0493
-:102BF000E0FDA3E04D6003022C79801890FB02E019
-:102C0000FDA3E0FC90FF05E06C700790FF04E06D11
-:102C100060028068E4F570F56F7F00E54914C549EE
-:102C2000600FEF2400F582E434FBF583E02FFF8092
-:102C3000EA8F4AE54A2400F582E434FBF583E07D1F
-:102C400000D39572ED95714006AC72AD71800FE5C1
-:102C50004A2400F582E434FBF583E07D00FC8C70AF
-:102C60008D6FE54A2400FCE434FBFDFEECFD7F01A2
-:102C70008D6A8E698F68123167228000022D98025A
-:102C80002D98E56D30E719E5721445717012E54A2B
-:102C9000700EE54C454B700890FF00E0541F600338
-:102CA000022D98E56D20E008E56D20E103022D98E6
-:102CB000756A6EE4F569F568E4F56F04F570123134
-:102CC0006722E56D20E727E57245717021E54A70BE
-:102CD0001DE54C6402454B600DE54C14454B600608
-:102CE000E54C454B700890FF00E0541F6003022D37
-:102CF00098E56D20E008E56D20E103022D98854CF4
-:102D00006EE56E7010436D01536DFDD2B078B2E484
-:102D1000F608F68027E56E64026007E56E1460022F
-:102D20008079536DFE436D02E56E64026005E56EC9
-:102D300014700978B2E4F60804F6C2B07C001231CF
-:102D40005222E56D30E71AE5721445717013E54AB9
-:102D5000700FE54C454B700990FF00E0541F146064
-:102D6000028038E56D20E10280317C01123152226F
-:102D7000E56D20E715E5724571700FE54C454B7028
-:102D80000990FF00E0541F146002800FE56D20E100
-:102D90000280087C00123152228000023059B44077
-:102DA000028006D3500302304F90FF01E090FC35C3
-:102DB000F0E54A90FC36F0E490FC37F0E56A240335
-:102DC000F56AE5693400F569AD4BE54C856A8285A5
-:102DD0006983CDF0A3CDF090FF01E01201C02E0673
-:102DE000012E2C022E56032E80042ECE052F0B060C
-:102DF0002F31072F57082F83092FA90B2FCF0C2F07
-:102E0000DE802FDE810000303CE56D20E7067C058A
-:102E10001225E0227D527E367F0279387AFC7B01D2
-:102E2000740878001203487D087C0012254722E5CB
-:102E30006D20E7067C051225E022E54AB403004038
-:102E400010B40500500BE54A7F00FE7C10123329B8
-:102E5000227D007C0712254722E56D20E7067C05D0
-:102E60001225E022E54AB403004010B40500500BDF
-:102E7000E54A7F00FE7C11123329227D007C071277
-:102E8000254722E56D20E7067C051225E022E54A6C
-:102E9000B405028003D3400AE4FF04FE7C0A123327
-:102EA0002922B401028003D3400AE4FF04FE7C0817
-:102EB00012332922B403004010B40500500BE54A38
-:102EC0007F00FE7C13123329227D007C07122547E8
-:102ED00022E56D20E734D3E5729448E57194005003
-:102EE00006E572457170067C021225E022E54AB4BF
-:102EF0000103B3400BC3B403004009B406005004FF
-:102F00001231FF227C071225E02212257E22E56D78
-:102F100020E71DE54AB403004010B40500500BE55E
-:102F20004A7F00FE7C16123329227C071225E022FC
-:102F300012257E22E56D20E71DE54AB4030040100E
-:102F4000B40500500BE54A7F00FE7C19123329229C
-:102F50007C071225E02212257E22E56D20E72374EE
-:102F60008190FF93F0E54AB403004010B40500508F
-:102F70000BE54A7F00FE7C17123329227C071225BD
-:102F8000E02212257E22E56D20E71DE54AB403000C
-:102F90004010B40500500BE54A7F00FE7C18123348
-:102FA00029227C071225E02212257E22E56D20E7EA
-:102FB0001DE54AB403004010B40500500BE54A7FFC
-:102FC00000FE7C15123329227C071225E0221225EF
-:102FD0007E22E56D20E7067C071225E02212257E81
-:102FE00022E56D30E72090FF00E0541F701090FF45
-:102FF00001E0B48005122575800312257E227D0034
-:103000007C051225472290FF00E0541F60067C05D6
-:103010001225E022D3E5729448E5719400500BC369
-:10302000E5729407E571940050067C031225E022B6
-:10303000E54AB405041231FF227C071225E022E59F
-:103040006D30E7087D007C05122547227C0512259E
-:10305000E022B420028003D34000800012312D22F0
-:1030600075430090FF83E0540FD395434024E5431C
-:1030700024F0F582E434FEF583E0AD6AAE69AF6812
-:1030800012031805430DED70010E8D6A8E698F686D
-:1030900080D1E5437D00FCC3E5709CF570E56F9D34
-:1030A000F56FE570456F6006E490FF83F02290FFB6
-:1030B00082E04408F0E4F56F75704990FC35E0B4A7
-:1030C00005028003D3404090FC36E0F543B405028E
-:1030D0008003D3400AE4FF04FE7C0B12332922B4A0
-:1030E00001028003D3400AE4FF04FE7C0912332965
-:1030F00022B403004010B40500500BE5437F00FEEE
-:103100007C141233292222B480004023B482005060
-:103110001E7C357DFC1217A77D008C6C8D6B90FC9E
-:1031200037E0600512312D80057C001231522222D9
-:1031300090FF83E0547FF090FF82E04408F090FF1E
-:1031400080E04408F02290FF82E04408F090FF8085
-:10315000E04408F0228C237D008C708D6F756A35F9
-:103160007569FC7568011231672290FF83E0547F16
-:10317000F0E5706449456F700122C3E5709408E57D
-:103180006F94004015752108E5217D00FCC3E570B2
-:103190009CF570E56F9DF56F8009857021E4F56FF2
-:1031A000757049752200E522C395215026AD6AAE9F
-:1031B00069AF681201EFFCE52224F8F582E434FEE1
-:1031C000F583ECF005220DED70010E8D6A8E698F8E
-:1031D0006880D3E521547F90FF81F0228C487F00E6
-:1031E000EF24FD4019E4EF75F007A4247FF582E495
-:1031F00034F8F583E065487002D3220F80E28F47F0
-:10320000C32285727085716F90FF82E054F7F09051
-:10321000FF83E0547FF022C000C001C002C006C09E
-:1032200007E5782408F8860653067F7CFF1232896A
-:103230007C007D00E57B6046FF90FD95E0547F6E4D
-:10324000700FC083C082A3E0FDA3E0FCA3157B80C8
-:1032500007A3A3A3DFE68026DF06D082D083801EEB
-:10326000E0F8A3E0F9A3E0FAD082D083E8F0A3E984
-:10327000F0A3EAF0A3C083C082A3A3A380DA123331
-:1032800022D007D006D002D001D0002285A87A75BE
-:10329000A888EC70027C3F8C7922E5782408F876C7
-:1032A0000012337680FBC000C001C002C006C00718
-:1032B000AE047CFF123289E57B6042FF90FD95E011
-:1032C000547F6E700BC083C082A3A3A3157B8007BD
-:1032D000A3A3A3DFEA8026DF06D082D08380D8E0D4
-:1032E000F8A3E0F9A3E0FAD082D083E8F0A3E9F0F4
-:1032F000A3EAF0A3C083C082A3A3A380DA7808085E
-:103300007918097C01E6547F6E700676007700809C
-:103310000608090CBC08EE123322D007D006D002F2
-:10332000D001D00022757900857AA822C0F0C08231
-:10333000C083C3E57B24E8500512337680F4EC604B
-:1033400031903651E493C39C4028C0047CFF123274
-:1033500089D004430480E57B75F003A42495F582AD
-:10336000E434FDF583ECF0EFA3F0EEA3F0057B125F
-:103370003322D083D082D0F022C0047C20D28CD2E1
-:103380008DD504FDD0042275A80075880075B8009D
-:1033900075F00075D000E4F8900000F608B800FB66
-:1033A000020000C3ED940250047D037CE8ECF4FCC1
-:1033B000EDF4FD0CBC00010D8C7F8D7E22C3EC94DE
-:1033C000BCED940250047D077CD0ECF4FCEDF4FDE0
-:1033D0000CBC00010D8C7D8D7C22EC700122C000A4
-:1033E000E5782418F8A604E5782408F8C6547FF692
-:1033F000E630E703D0002212337680F4C28C857C5D
-:103400008C857D8AD28CC0E0C0D0C0F0C082C083E1
-:10341000C000C001C002C003C004C005C006C00790
-:10342000121AFAE5782408F8E66024E5782410F802
-:10343000A681E57875F021A4248DF582E434FCF5AD
-:103440008378B4E58104C398F9E6F008A3D9FA7447
-:10345000082578F8057808E65480700CE578B407FC
-:10346000F3780875780080EFE5782410F88681E518
-:103470007875F021A4248DF582E434FCF58378B4CA
-:10348000E58104C398F9E0F608A3D9FAD007D0067D
-:10349000D005D004D003D002D001D000D083D08298
-:1034A000D0F0D0D0D0E032C0E0C0D0C000C001C069
-:1034B00002C28E857E8D857F8BD28E781979097AAE
-:1034C00007E77004A600800BE6600816E67004E7C4
-:1034D0004480F70809DAEAE579601314F579700E8B
-:1034E000E5782408F87600123322D28CD28DD002EF
-:1034F000D001D000D0D0D0E0327581B3742A90FFD3
-:1035000093F0757F30757EF8757D60757CF01205DF
-:10351000411235AA12175D90FF93E04401F0B2B357
-:103520001235D412338480DA22C0007C01EC2408E6
-:10353000F8E660090CBC08F512337680EED0002264
-:10354000C0F0C082C083C000C006C007ED2410F8E0
-:1035500076C2ED75F021A4248DF582E434FCF58368
-:10356000C082C083A3A3E4780DF0A3D8FCEC547F01
-:1035700075F002A4241DF582E5F03436F583E4935A
-:10358000FE740193F5828E83E493FE740193FFD061
-:1035900083D082EFF0A3EEF0ED2408F8EC4480F63F
-:1035A000D007D006D000D083D082D0F0227578002A
-:1035B000757B007A0879187808760077000809DAB0
-:1035C000F8E478087480447FF674014410F5897536
-:1035D000B808D2ABD2A9227581B3D28ED28CD2AF29
-:1035E000E57B6032FF90FD95E05480602478087997
-:1035F00008E0547FFA7B00E6547FB502027BFF08A7
-:10360000D9F5EB700CEAF0123526AD04AC02123598
-:103610003DA3A3A3DFD212337680C57C017D0022B7
-:10362000050004F404F804EC04E804E404F004FCE9
-:1036300004A804AC04D804DC04A404A404A404E096
-:1036400004C004B804BC04B404CC04C804C404D04A
-:1036500004D404B0190103002200480200480E30CF
-:103660001420C81AD0180A0C050602030102000132
-:10367000CE0181010000C000800060003000180011
-:1036800010000800040002000100081828380C058A
-:10369000100A0200000000000301100A02000000EE
-:1036A0000000FBE0FBF209022700010200A0FA097A
-:1036B00004000003FF00000007058102400000072E
-:1036C00005010240000007058303020001220354A4
-:1036D0000055005300420033003400310030002018
-:1036E00000200020002000200020002000200000FA
-:0336F000000000D7
-:00000001FF
diff --git a/firmware/mts_gsm.fw.ihex b/firmware/mts_gsm.fw.ihex
deleted file mode 100644
index f6ad0cbd30cb..000000000000
--- a/firmware/mts_gsm.fw.ihex
+++ /dev/null
@@ -1,867 +0,0 @@
-:1000000014360002001E021AF9FFFFFFFFFF023341
-:100010001DFFFFFFFFFFFFFFFFFFFFFFFFFF02339B
-:10002000C87581CE90FDE88583A012353CEC4D600B
-:100030007378AB8003760018B89CFA787F800376DB
-:100040000018B865FA78208003760018B820FA788E
-:10005000208003760018B81FFA90FDDDAE83AF82D2
-:1000600090FBF81200AA6005E4F0A380F690FDE88A
-:10007000A88290FDE8A982E8696005E4F20880F7AB
-:100080009001081200B390010C1200B390011012FD
-:1000900000B39001141200D190011A1200D1900106
-:1000A000201200D175D00012341A020126EF6582A9
-:1000B0007003EE658322E493F8740193F97402935C
-:1000C000FE740393F5828E83E869700122E493F64F
-:1000D000A30880F4E493FC740193FD740293FE740E
-:1000E0000393FF740493F8740593F58288831200D8
-:1000F000AA700122E493A3A883A9828C838D82F045
-:10010000A3AC83AD828883898280E32121049B8014
-:1001100080049BACAE049BFDE8049D049DFBF304AE
-:10012000A2049DFBF30502050280FED0F030F00929
-:1001300020F303F68010F7800D30F10920F303F26D
-:100140008004F38001F020F404FCD0E0CC22CCC089
-:10015000E0120163020154BC0005D0F0ACF022C3F0
-:1001600013DCFC02012ABF0009ED258275F001F8BD
-:10017000E622BF010FED2582F582EE3583F583750A
-:10018000F004E022ED258275F002F8E222D083D05F
-:1001900082F5F0C3E493A3C5F095F0C0E0C3D0F0BE
-:1001A000E493A395F04012A3A3C3E5F033500205F6
-:1001B000832582F58250020583740193C0E0E493A5
-:1001C000C0E022D083D082F5F0E4937009740193EB
-:1001D0007004A3A3800C74029365F06005A3A3A32D
-:1001E00080E7740193C0E0E493C0E022120264024D
-:1001F00001FB1202B80201FB1202DC0201FB30E03B
-:100200000720E302E622E72230E10720E302E222B0
-:10021000E32230E202E022E493221202DC02022313
-:100220001202B8020223ABF012022DCBC5F0CB2292
-:1002300030E01020E306E6F5F008E622E7F5F009E5
-:10024000E7192230E11020E306E2F5F008E222E3AC
-:10025000F5F009E3192230E206E0F5F0A3E022E42C
-:1002600093F5F074019322BB0003740922BB0107CC
-:1002700089828A83740422BB020789828A8374106C
-:1002800022740A22020284BB0007E92582F8740165
-:1002900022BB010DE92582F582EA3583F5837404DA
-:1002A00022BB020DE92582F582EA3583F5837410BD
-:1002B00022E92582F87402220202B8BF0005EDF897
-:1002C000740122BF01078D828E83740422BF02074E
-:1002D0008D828E83741022EDF87402220202DCBF3C
-:1002E0000007ED2582F8740122BF010DED2582F58E
-:1002F00082EE3583F583740422BF020DED2582F56D
-:1003000082EE3583F583741022ED2582F874022283
-:10031000020310C0E0120264020328C0E01202B817
-:10032000020328C0E01202DC02032830E00B20E3C5
-:1003300004D0E0F622D0E0F72230E10B20E304D035
-:10034000E0F222D0E0F322D0E0F022C9CDC9CACE3B
-:10035000CACBCFCB12035BEDF9EEFAEFFB22BB0069
-:100360002FBF000AFAEDF8E7F60809DAFA22BF0112
-:10037000128D828E83F802037809A3E7F0D8FA225F
-:10038000020383FAEDF8E7F20809DAFA2202038D94
-:10039000BB014DBF001489828A83F9EDF802039FE7
-:1003A00008A3E0F6D9FA220203B0BF01228D828EA3
-:1003B00083FB08C9C582C9CAC583CAE0A3C9C5826F
-:1003C000C9CAC583CAF0A3DBEAD8E8220203D38DE9
-:1003D000828E83F9EDF8E0F208A3D9FA220203DD58
-:1003E000BB024DBF001289828A83F9EDF80203EF48
-:1003F00008A3E493F6D9F922BF01238D828E83FBF3
-:1004000008C9C582C9CAC583CAE493A3C9C582C93C
-:10041000CAC583CAF0A3DBE9D8E722020422898295
-:100420008A83F9EDF8E493F208A3D9F922020433A0
-:10043000BF000DFAEDF8E3F60809DAFA2202043DEE
-:10044000BF01128D828E83F802044A09A3E3F0D81B
-:10045000FA22020455FAEDF8E3F20809DAFA220268
-:10046000045FE6FB08E6FA08E6F904F618700106F0
-:1004700022E6FF08E6FE08E6FD22EFF0A3EEF0A379
-:10048000EDF022EBF0A3EAF0A3E9F022E0FFA3E015
-:10049000FEA3E0FD22E0FBA3E0FAA3E0F9220000C6
-:1004A00000000000000502006105710026059800AB
-:1004B000330A0900610A750066154400610CF900F1
-:1004C0006109A9006109E000610DC000610BF10044
-:1004D000610A1C00610A510061173C0033174F008C
-:1004E000341E1400431EBF0044202C0044201A0078
-:1004F000471EE600471F8B004D1FDC004F1F080002
-:100500005832A800617CCC7DFF121CC52290FFFCF4
-:10051000E020E72DC2AFAE59AF58755A20E55A1406
-:10052000C55A6019E4FE7F05EE4FCE24FFCECF34CE
-:10053000FFCF6007E490FF92F080ED80E08E598F4E
-:10054000582212050A7D077CB71232C47D0F7C6EDB
-:100550001232DE789D7A06E4F608DAFC7A06120595
-:10056000CD7C03120E55122168E4FEFF7C0F12327F
-:100570004DD2A822123138E490FC38F090FFF0E020
-:1005800030E408740190FC39F08005E490FC39F007
-:100590007D0A7C001225461231BB2212313890FCB4
-:1005A00039E014700E90FFF0E04410F07C0012254A
-:1005B000DF801990FC39E0700E90FFF0E054EFF00E
-:1005C0007C001225DF80057C171225DF1231BB224B
-:1005D00090FFF0E054ABF090FFF0E04420F0228C6C
-:1005E000378D367882EDF608ECF6EDFEECFD7F01F6
-:1005F0009000051201F57880F67882E6FD08E6FCA9
-:10060000EDFEECFD7F019000041201F5540FFC7D1E
-:100610008012176D7880E6700DAD3AAE39AF38E4D0
-:100620001203187C082290FFF0E054FEF090FFF0D7
-:10063000E054FDF0801E7882E6FD08E6FCEDFEEC5D
-:10064000FD7F0190000812021725E0440190FFF39E
-:10065000F00206D97882E6FD08E6FCEDFEECFD7FAF
-:100660000190000612021754FE90FFF3F0802B78E1
-:1006700082E6FD08E6FCEDFEECFD7F01900008122D
-:100680000217FAEB90FFF1F01208C8400DAD3AAE38
-:1006900039AF38E41203187C18227882E6FD08E6A8
-:1006A000FCEDFEECFD7F0190000812021790FFF1B7
-:1006B000F01208C8400DAD3AAE39AF38E412031855
-:1006C0007C18227882E6FD08E6FCEDFEECFD7F0159
-:1006D000900006120217440190FFF3F07883E6249D
-:1006E00003F618E63400F67880E624FE500990FF01
-:1006F000F0E054FDF0800790FFF0E04402F0E49059
-:10070000FFF1F0788176007880E624FFFCE434FF86
-:10071000FD7881E67F00FEECD39EEF6480CD64809F
-:100720009D402F1208AD400F7881E6AD3AAE39AF4B
-:10073000381203187C182290FFF2E0FC788286833E
-:10074000088682ECF0788106A37882A68308A682C8
-:1007500080B51208AD400F7881E6AD3AAE39AF38BA
-:100760001203187C182290FFF2E0FC78828683083E
-:100770008682ECF07880E6AD3AAE39AF38120318D5
-:100780007C00228C378D367882EDF608ECF6EDFE93
-:10079000ECFD7F019000051201F57881F67882E684
-:1007A000FD08E6FCEDFEECFD7F019000041201F572
-:1007B000540FFC7D8112176D7881E670037C08224E
-:1007C00090FFF0E054FEF090FFF0E054FDF0801B4D
-:1007D0007882E6FD08E6FCEDFEECFD7F0190000866
-:1007E00012021725E090FFF3F0805B7882E6FD08A7
-:1007F000E6FCEDFEECFD7F0190000612021754FEB0
-:1008000090FFF3F080217882E6FD08E6FCEDFEEC37
-:10081000FD7F01900008120217FAEB90FFF1F01231
-:1008200008C840037C18227882E6FD08E6FCEDFE4D
-:10083000ECFD7F0190000812021790FFF1F0120802
-:10084000C840037C18227883E6240AF618E63400B0
-:10085000F6788076007881E624FFFCE434FFFD78AA
-:1008600080E67F00FEECD39EEF6480CD64809D40E7
-:100870002178828683088682E090FFF1F01208C812
-:1008800040037C1822788006788306E618700106FB
-:1008900080C390FFF0E04401F0788286830886826E
-:1008A000E090FFF1F01208C840037C18227C00227F
-:1008B00090FFF0E020E71290FFF0E030E50990FFB4
-:1008C000F0E04420F0C32280E7D32290FFF0E02044
-:1008D000E31290FFF0E030E50990FFF0E04420F0F3
-:1008E000C32280E7D3228C428D417C00ED54F0FD81
-:1008F000EC7003ED64307005753E038003753E04B3
-:10090000AC3E120F72758300858340E541540FF5AC
-:100910003FE5407004E53F64037035E53E24FD7516
-:10092000F00AA42402F582E434FCF583E030E60505
-:100930001210598019E53E249DF8E654FBF678A97B
-:10094000E62405F58218E63400F583740FF080592B
-:10095000E5407004E53F64047048E53E24FD75F011
-:100960000AA42402F582E434FCF583E030E507AC08
-:1009700042AD41121C5AE54230E21578ADE630E056
-:100980000F78ADE630E109E4FF04FE7C0412324D3D
-:1009900078A9E62406F58218E63400F583740FF092
-:1009A0008007E4FC7DEE121C5AC203221231381279
-:1009B0000F7278A9E62406F58218E63400F583E084
-:1009C00090FC38F078A9E62405F58218E63400F5A5
-:1009D00083E090FC39F0C2037D027C0012254612B0
-:1009E00031BB221231387895ECF6EC249DF8E630D4
-:1009F000E1077C131225DF800F90FC39E0FD78952C
-:100A0000E6FC1213EF1225DF1231BB2212313878C7
-:100A100095ECF67D00120F121225DF1231BB221267
-:100A200031387895ECF6EC249DF8E630E2077C133B
-:100A30001225DF801B7895E6249DF8E620E1077CEF
-:100A4000121225DF800A7895E6FC1214131225DFB6
-:100A50001231BB221231387895ECF6EC249DF8E681
-:100A600020E2077C111225DF800A7895E6FC12153A
-:100A7000141225DF1231BB221231387895ECF612B0
-:100A80000F7278A9E62409F58218E63400F583E0B0
-:100A900090FC3FF078A9E6240AF58218E63400F5C8
-:100AA00083E090FC40F078A9E62403F58218E63450
-:100AB00000F583E0FC78A9E62404F58218E634000A
-:100AC000F583E0F56278A9E62402F58218E63400A1
-:100AD000F583E0F5638C61E4EC333354017895F6EB
-:100AE0006008E56230E1037895067895E690FC4170
-:100AF000F078A7E62402F58218E63400F583E0FDDD
-:100B0000A3E0540CFCED54E68C65F564E56130E53A
-:100B100003436501E56220E50EE561547F7008E559
-:100B20006120E703436502E56130E303436510E5B7
-:100B30006130E203436520E561540360034365408F
-:100B4000E56130E103436580E56130E4034364011E
-:100B5000E56130E603436408E56220E40EE5615494
-:100B60007F7008E56120E7034364105365FB53641D
-:100B7000F9AD64E56590FC3ACDF0A3CDF0E56330C6
-:100B8000E30DE5635430C4540F90FC3DF08005E460
-:100B900090FC3DF0E563540390FC3CF0E5635404A5
-:100BA000C31390FC3EF090FC3CE0700E7D357EFC63
-:100BB0007F01740190000912014B78A9E62408F521
-:100BC0008218E63400F583E07C00FD78A9E624076E
-:100BD000F58218E63400F583E07F004CFEEF4D907F
-:100BE000FC38F0A3CEF0CEC2037D0A7C001225466D
-:100BF0001231BB221231387895ECF6789A760108DA
-:100C000076FC0876387897760C789A12046E120281
-:100C10001D7898CBF6CB08F67F00EF24EA401FE45E
-:100C2000EF25E090357EFD93CD04937899667003AF
-:100C3000ED186670067897760080030F80DC789652
-:100C4000EFF6789A12046E9000021202177898CB91
-:100C5000F6CB08F65404CB54064B60047897760B19
-:100C60007899E630E313789A12046E900005120129
-:100C7000F524FB50047897760D7899E654C07D00F2
-:100C800064C04D70047897760B789A12046E9000C9
-:100C9000041201F524FC50047897760F789A120418
-:100CA0006E9000061201F524FD50047897760E78B8
-:100CB0009A12046E9000091201F524FD50047897F1
-:100CC000760A7897E6702A7895E6FC120F72789A81
-:100CD00012046E78A7E6F978A6E6FA7B01740A7822
-:100CE00000120348C2037895E6FC1211157897ECC0
-:100CF000F67897E6FC1225DF1231BB2212313878E4
-:100D000095ECF6120F727895E624FD75F00AA4248E
-:100D100014F582E434FCF583AC82AD8378A6868337
-:100D2000088682ECF9EDFA7B0A78011203B0C2035F
-:100D30007895E6FC1211151231BB228D2B8C2AED11
-:100D400060407527017529487528FFE52A24FDFCB8
-:100D5000E434FFFDEC7C0325E0CD33CDDCF9FCE58C
-:100D6000292CF529E5283DF528AD29AE28AF2774B3
-:100D7000809000061203207480900002120320125B
-:100D80000FC5E52B14603B7527017529087528FFF1
-:100D9000E52A24FDFCE434FFFDEC7C0325E0CD33A3
-:100DA000CDDCF9FCE5292CF529E5283DF528AD2910
-:100DB000AE28AF27E4900006120320E49000021250
-:100DC0000320221231387895ECF6EC249DF8E630B9
-:100DD000E2097895E6FC121514D2007895E6FC122B
-:100DE0000F727896760090FC39E030E704789676BA
-:100DF000017896E6FD7895E6FC120D38C2033000C6
-:100E0000077895E6FC1214137C001225DF1231BB23
-:100E10002278A9E62404F58218E63400F583E0443C
-:100E200001F078A9E62404F58218E63400F583E0A1
-:100E300030E00280ED78A9E6240BF58218E6340054
-:100E4000F583E054F8F078A9E62402F58218E63438
-:100E500000F583E04480F022C2038C58120F7278B0
-:100E6000A6868308868279AF7A357B0A78011203D9
-:100E7000FE120E0EAC587D02120D38C203AC581291
-:100E80001115228D538E528F518C50120F72754F47
-:100E90000078A9E62405F58218E63400F583E02001
-:100EA000E41FE54F24F64019054FC2037C181232A7
-:100EB000FB90FF93E04401F0B2B3AC50120F72808C
-:100EC000D078A9E62405F58218E63400F583E02001
-:100ED000E405C2037C022278A9E62405F58218E61F
-:100EE0003400F583E0540F601678A9E62405F582F6
-:100EF00018E63400F583E0540FF0C2037C01227839
-:100F0000A88683088682E0AD53AE52AF5112031813
-:100F1000C2037C00228D318C30121514E531600F34
-:100F2000E530B4030A7C0112250E7C8112250EAC3B
-:100F300030120F72E531601A78AA8683088682E043
-:100F400054E7F0A3A3A3A3E054E7F0AC307D021272
-:100F50000D3878A6868308868279B97A357B0A7837
-:100F6000011203FEC203E530249DF8E654FDF6AC01
-:100F700030121115228C2630030512329A80F87C2B
-:100F80000A1231ADD203E52624FD78A3F670077866
-:100F9000AA76FF0876E078A3E67D007C0425E0CD04
-:100FA00033CDDCF9FC24A078A9F6ED34FF18F678EF
-:100FB000A3E675F00AA42400FCE434FCFD78A6ED59
-:100FC000F608ECF61232462278A9E62402F58218D9
-:100FD000E63400F583E030E72278A9E62402F582C2
-:100FE00018E63400F583E0547FF078A9E62402F592
-:100FF0008218E63400F583E04480F02278AA8683E4
-:10100000088682E0547FF0AD83E5822404FCE43D51
-:101010008C82F583E0547FF078A9E6240BF58218E2
-:10102000E63400F583E054F8F078ABE62401F5826D
-:1010300018E63400F583E04403F078ABE62405F5C8
-:101040008218E63400F583E04403F078A9E624052D
-:10105000F58218E63400F583740FF02278AA8683AF
-:10106000088682E0543FF0AD83E5822404FCE43D31
-:101070008C82F583E0543FF078A3E624A4F8E6FCE4
-:1010800078ABE62401F58218E63400F583ECF078BD
-:10109000A3E624A4F8E6FC78ABE62405F58218E67E
-:1010A0003400F583ECF078A9E6240BF58218E634D9
-:1010B00000F583E054FB4402F52678A7E62402F508
-:1010C0008218E63400F583E030E50343260178A971
-:1010D000E62405F58218E63400F583E030E00312DB
-:1010E0000FC5E526FC78A9E6240BF58218E6340046
-:1010F000F583ECF078A9E62405F58218E63400F5CE
-:1011000083740FF078AA8683088682E04480F0A377
-:10111000A3A3A3E04480F0228C2A120F7278A7E6E2
-:101120002408F58218E63400F583E0FC78A9E6246B
-:101130000AF58218E63400F583ECF078A7E6240778
-:10114000F58218E63400F583E0FC78A9E62409F579
-:101150008218E63400F583ECF078A6868308868250
-:10116000E0FDA3E0FCEDFE78A9E62408F58218E690
-:101170003400F583EEF0ECFE78A9E62407F582183A
-:10118000E63400F583EEF08C298D28C3EC9405ED50
-:10119000940C400575277C8033D3E5299401E5281C
-:1011A0009403400575273C8023D3E5299481E528E5
-:1011B000940140057527188013D3E5299460E5282C
-:1011C0009400400575270C8003752708AF27E4EFCE
-:1011D000547C4483FF8F27E527FC78ABE62401F598
-:1011E0008218E63400F583ECF0E527FC78ABE624C2
-:1011F00005F58218E63400F583ECF0E527FC78A3CA
-:10120000E624A4F8ECF678A9E62402F58218E63480
-:1012100000F583E0F52778A7E62402F58218E63486
-:1012200000F583A3E030E3175327C778A7E624052A
-:10123000F58218E63400F583E09035AA93422778CA
-:10124000A7E62402F58218E63400F583E030E705CE
-:1012500043274080035327BF5327FB78A7E6240684
-:10126000F58218E63400F583E06003432704532732
-:10127000FC78A7E62404F58218E63400F583E04202
-:1012800027432780E527FC78A9E62402F58218E6A3
-:101290003400F583ECF078A9E62404F58218E634EE
-:1012A00000F583E0F52778A7E62402F58218E634F6
-:1012B00000F583A3E030E1055327DF8003432720B7
-:1012C00078A7E62402F58218E63400F583E030E4DE
-:1012D000055327EF800343271078A7E62409F582FA
-:1012E00018E63400F583E0B40203432702E527FC47
-:1012F00078A9E62404F58218E63400F583ECF0784A
-:10130000A9E62403F58218E63400F583E0F5277892
-:10131000A7E62409F58218E63400F583E07005534A
-:10132000277F800343278078A7E62402F58218E60A
-:101330003400F583A3E030E00543272080035327E2
-:10134000DF78A7E62402F58218E63400F583E03062
-:10135000E30543274080035327BF78A7E62402F51F
-:101360008218E63400F583E030E00543271080035F
-:101370005327EF78A7E62402F58218E63400F583B8
-:10138000A3E030E40543270880035327F778A7E656
-:101390002402F58218E63400F583A3E030E5054326
-:1013A000270480035327FB78A7E62402F58218E67A
-:1013B0003400F583A3E030E605432701800353277B
-:1013C000FE78A7E62402F58218E63400F583A3E050
-:1013D00030E70543270280035327FDE527FC78A962
-:1013E000E62403F58218E63400F583ECF0C2037CB2
-:1013F00000228D278C26ED54031460037C1022E517
-:1014000027547C24FC40037C0B22E526249DF8E62F
-:101410004402F67C00228C30120F72E530249DF8D5
-:10142000E620E24FAC307D02120D38E53024FE4458
-:1014300028FC78AA8683088682ECF0AF83E58224B4
-:1014400004FEE43FFFEC8E828F83F07C038C2CE55E
-:101450002CFC78ABE62401F58218E63400F583EC29
-:10146000F0E52CFC78ABE62405F58218E63400F5AF
-:1014700083ECF0752D01752F48752EFFE53024FDA6
-:10148000FCE434FFFDEC7C0325E0CD33CDDCF9FC3E
-:10149000E52F2CF52FE52E3DF52E78ABE62404F54F
-:1014A0008218E63400F583E054E7F52CAD2FAE2E1C
-:1014B000AF2DE4900002120320E4900006120320F6
-:1014C0001201EF30E503432C10E52CFC78ABE62449
-:1014D00004F58218E63400F583ECF012105978A96F
-:1014E000E62406F58218E63400F583E0C203FCE545
-:1014F00030249DF8E64404F68C2CE530540FC45497
-:10150000F07E00FFEEEF44047D00FFEC4EFCED4F5B
-:10151000FD121CC57C00228C2F120F72120FF9785D
-:10152000AA8683088682E05408F0A3A3A3A3E0540C
-:1015300008F0AC2F7D02120D38C203E52F249DF870
-:10154000E654FBF67C00221231387896ECF6EC2457
-:101550009DF8E630E10A7D007C131225461231BB6E
-:101560007896E6249DF8E64401F67896E6FC120F9C
-:10157000727896E624FD75F00AA42414F582E4340A
-:10158000FCF58378A6E6FA08E6F97B0A78011203EF
-:10159000B078A6868308868279B97A357B0A780185
-:1015A0001203FE120FC5C2037896E6FC12111578DD
-:1015B00095ECF6EC600A7D007C081225461231BBE2
-:1015C0007896E6FC120F7278A9E62404F58218E6F4
-:1015D0003400F583E0441054DFFC78A9E62404F5D8
-:1015E0008218E63400F583ECF07895ECF6C2037CC3
-:1015F000C81232FB7896E6FC120F7278A9E6240432
-:10160000F58218E63400F583E054EFF0C2037CC89D
-:101610001232FB7896E6FC120F7278A9E62404F5E4
-:101620008218E63400F583E04410F0C2037CC8124F
-:1016300032FB7896E6FC120F7278A9E62404F58254
-:1016400018E63400F583E04420F0C2037CF0123247
-:10165000FB7896E6FC120F7278A9E62405F582184D
-:10166000E63400F583E030E415C2037896E64410D2
-:101670007F00FE7C0712324D1231BB02173B78A966
-:10168000E62404F58218E63400F583E054CFF0C276
-:10169000037CC81232FB7896E6FC120F7278A9E63A
-:1016A0002404F58218E63400F583E04430F0C203E8
-:1016B0007CF01232FB7896E6FC120F7278A9E624D1
-:1016C00005F58218E63400F583E030E414C20378AF
-:1016D00096E644107F00FE7C0712324D1231BB802B
-:1016E0005D78A9E62404F58218E63400F583E05419
-:1016F000EFF078A9E62404F58218E63400F583E0DB
-:1017000054DFF07896E624FD75F00AA42414F582DF
-:10171000E434FCF583AC82AD8378A68683088682A8
-:10172000ECF9EDFA7B0A78011203B0C2037896E671
-:10173000FC1211157D007C0B1225461231BB2212C2
-:101740003138E490FC39F07D027C001225461231DC
-:10175000BB221231387C001225DF1231BB22743CCF
-:1017600090FBE0F0743E90FBE0F0E490FC28F02267
-:101770008D358C34ECB401028003D340028028B450
-:1017800002028003D34008A835E625E0F68018B4AD
-:1017900004028003D3400AA835E625E025E0F68060
-:1017A00006A83576008000228C3C8D3BEDFEECFDDA
-:1017B0007F0175660675670090FC29120477120197
-:1017C000EFB480028006D3500302186E90FC2912F9
-:1017D00004899000031201F554F0B430028003D361
-:1017E000405F90FC29120489900008120217FAFD4C
-:1017F000EBFE7F0190FC2C120477EECD9035C3FCFC
-:10180000E493FF740193FEF9EFFA7B01EAFFE9FE2E
-:10181000ECC39EED9F40259035C5E493FD74019384
-:10182000FCEDFEECFD7F01EECDFC90FC2EE0D39CA8
-:1018300090FC2DE09D5005756680803312198C80D8
-:101840002EB460028003D3400BAC3CAD3B1207804A
-:101850008C66801BB41003B34010C3B42003B340A4
-:1018600009C3B440028003D34000756681800080C4
-:1018700075B481028003D3406B90FC2912048990D7
-:1018800000031201F554F0B430028003D3401D90E0
-:10189000FC29120489900008120217FAFDEBFE7F62
-:1018A0000190FC2F1204771218F68036B460028083
-:1018B00003D34013753A67E4F539F538AC3CAD3BDA
-:1018C0001205DC8C66801BB41003B34010C3B42037
-:1018D00003B34009C3B440028003D340007566815E
-:1018E000800080028000E566FC90FC29120489ECEF
-:1018F000900002120320AC672290FC291204899008
-:1019000000041201F5600474018001E4A2E0920178
-:1019100090FC29120489ED2403FD50010E90FC2C4B
-:1019200012047790FC291204899000051201F5F544
-:10193000679000041201F5540FFC7D6712176DE5E6
-:10194000677004756608227566007884760078846E
-:10195000E6C39567503890FC2F1204891201EFFC02
-:1019600090FC2C120489EC12031830010E90FC310B
-:10197000E004F090FC307003E004F078840690FC02
-:101980002EE004F090FC2D7003E004F080C0229063
-:10199000FC2AE0FDA3E0FCEDFEECFD7F01ED240A56
-:1019A000FD50010E90FC3212047790FC291204893C
-:1019B0009000041201F5540FB401028003D34017C4
-:1019C00090FC321204890DED70010E90FC2F120470
-:1019D0007778887601804EB402028003D340199054
-:1019E000FC32120489ED2402FD50010E90FC2F12EE
-:1019F000047778887602802DB404028003D34019DE
-:101A000090FC32120489ED2404FD50010E90FC2F4D
-:101A100012047778887604800CB400028003D340E7
-:101A2000007566082290FC291204899000051201B5
-:101A3000F5F567788576007885E6C39567400302FB
-:101A40001AF4788676007886E6C378889650769081
-:101A5000FC2C1204891201EFFC90FC321204921249
-:101A600001E9F45CFC1201E9F890FC2F120489E80A
-:101A7000C0E01201EFC8D0E0C8584CFC90FC2C121A
-:101A80000489EC1203187887ECF690FC31E004F03E
-:101A900090FC307003E004F009E970010A90FC3218
-:101AA00012048090FC291204899000041201F53080
-:101AB000E40E90FC2EE004F090FC2D7003E004F0A6
-:101AC00078860680817888E6FDE4FEFFEECDFC9006
-:101AD000FC31E02CF090FC30E03DF07888E6FDE44D
-:101AE000FEFFEECDFC90FC34E02CF090FC33E03DAA
-:101AF000F0788506021A347566002222C0E0C0F034
-:101B0000C082C083C0D0E8C0E0E9C0E0EAC0E0EB3A
-:101B1000C0E0ECC0E0EDC0E0EEC0E0EFC0E090FF60
-:101B200092E01201C01B47301B47321B56381B681E
-:101B30003A1B7A3E1B92441B86461B9E501BE0526A
-:101B40001BBF541C015600001C2290FF92E07F0036
-:101B5000FE7C0112324D021C32E4FF04FE7C0312B3
-:101B6000324D742090FFFEF0021C32E4FF04FE7C34
-:101B70000212324D744090FFFEF0021C32E4FF046A
-:101B8000FE7C0412324D021C32E4FF04FE7C05127E
-:101B9000324D021C32E4FF04FE7C0612324D021C60
-:101BA0003290FFA5E07D0090FBF8CDF0A3CDF09042
-:101BB000FBF9E0FCF58390FBF8E04433FD121CC513
-:101BC000807390FFB5E07D0090FBFACDF0A3CDF0DF
-:101BD00090FBFBE0FCF58390FBFAE04443FD121C14
-:101BE000C5805290FFA6E07D0090FBFCCDF0A3CD18
-:101BF000F090FBFDE0FCF58390FBFCE04434FD122B
-:101C00001CC5803190FFB6E07D0090FBFECDF0A3B7
-:101C1000CDF090FBFFE0FCF58390FBFEE04444FD3B
-:101C2000121CC5801090FF92E07D00FCED44AAFDDF
-:101C3000121CC58000E490FF92F0D0E0FFD0E0FEDF
-:101C4000D0E0FDD0E0FCD0E0FBD0E0FAD0E0F9D06D
-:101C5000E0F8D0D0D083D082D0F0D0E0320581053A
-:101C60008105810581A881181818EDF608ECF69019
-:101C7000FF5AE020E70280F790FF59E07D00A8813D
-:101C800018CDF6CD08F67D03A881E618FCE6CC2534
-:101C9000E0CC33CCDDF9CCF6CC08F6A88118E644CC
-:101CA000F8F6A881181818E6FD08E6FCA881188641
-:101CB00083088682EDF0A3ECF0740290FF5AF015D1
-:101CC0008115811581158122E5812405F581E4A81E
-:101CD0008118F6A88118181818EDF608ECF690FB94
-:101CE000F5E024F85003021DE6E4A8811818F6A8D0
-:101CF0008118E6FEA88118181818E6FD08E6FC7F92
-:101D000000EF24F8404DE4EF25E0247DF582E43433
-:101D1000FCF583E0FBA3E06C7003FAEB6D700974D3
-:101D200001A8811818F6802BE4EF25E0247DF582C8
-:101D3000E434FCF5837A00E054F0CCF8CCCDF9CD56
-:101D4000FB7800E954F0F9EA687002EB6970010E63
-:101D50000F80AEA88118EEF6A88118181818EDF6B5
-:101D600008ECF6A881EFF6A8811818E67079A8812A
-:101D700018E624F74071A88118181818E6540FA81F
-:101D800081F664046017A881E664036010A88118D6
-:101D9000181818E6FD08E6FC121C5A804A7C0A1244
-:101DA00031ADA88118181818E6FD08E6FC90FBF480
-:101DB000E025E0247DF582E434FCF583EDF0A3EC2E
-:101DC000F090FBF4E0FFE4EF045407FF90FBF4F025
-:101DD00090FBF5E004F012324690FBF6E07008E468
-:101DE000FEFF7C0F12324D802790FBF7E004F05489
-:101DF0003F701D90FBF7E044FE7D00FC90FBF4E09B
-:101E000025E0247DF582E434FCF583EDF0A3ECF0CD
-:101E1000E58124FBF58122788B7600788C7600743E
-:101E20000190FBF6F012313890FBF5E060577C0A28
-:101E30001231AD90FBF3E025E0247DF582E434FC23
-:101E4000F583E0FDA3E0FC90FBF3E025E0247DF5C5
-:101E500082E434FCF583E4F0A3F090FBF3E0FFE4CC
-:101E6000EF045407FF90FBF3F090FBF5E014F078DB
-:101E700089EDF608ECF61232467889E6FD08E6FCB4
-:101E80001208E380A312329A90FF93E04401F0B26B
-:101E9000B3788B06B60011788B7600788CE6F40464
-:101EA00004A2E092B4788CF6021E25E490FBF6F0D2
-:101EB00090FBF5E07D00FCED44CFFD121C5A123181
-:101EC000BB22123138E5706449456F601590FF837D
-:101ED000E0540F7D00D39570ED956F5005122F8162
-:101EE00080031230511231BB22123138E57064493F
-:101EF000456F600512308B800E90FF80E04408F043
-:101F000090FF83E0547FF01231BB221231388C54A1
-:101F1000EC54F0B41015756A357569FC756801E507
-:101F20006A2403F56AE5693400F569E4F557F55666
-:101F3000E556C394015027E554540FFCAD6AAE69D1
-:101F4000AF68120E808C55EC60028012056AE56A5B
-:101F5000700205690557E5577002055680D2E554B1
-:101F6000540F249DF8E654FEF6E554540F7F00FE0E
-:101F70007C1212324DE5551470097D007C09122542
-:101F8000468007AD577C001225461231BB22123124
-:101F90003890FFFCE04402F090FF00E030E713903F
-:101FA000FF83E04480F0436D8090FFFCE04401F04B
-:101FB000801190FF82E04408F0536D7F90FFFCE0B9
-:101FC00054FEF090FF81E04480F01225F990FFFE6E
-:101FD000E04405F090FFFCE054FDF01231BB22120A
-:101FE00031387C011232FB78ADE64402F674FEFC17
-:101FF00004FD121CC590FF5AE030E70280F7E4F5BB
-:102000004E754D10AC4EAD4DE54E154E7002154D52
-:10201000EC4D600280EE4387011231BB2212313851
-:102020007C021231C778ADE654FDF61231BB2212A4
-:10203000313878ADE630E02C78ADE630E12678AD89
-:10204000E6FCF58318E644F0FD121C5A90FFFCE014
-:102050004420F07C021232FB78ADE654FDF6741A8F
-:1020600090FFFEF078ADE6FCF58318E644F1FD1232
-:102070001C5A1231BB22756D0090FFFFE0600343D4
-:102080006D01756E00E4F56CF56BE4F56F757049E4
-:10209000748490FF82F0748490FF80F0748090FFCD
-:1020A00058F0748090FF5AF0AD46AF457E00EE24A4
-:1020B000FE5003022142E4EE75F007A4247FF5826E
-:1020C000E434F8F583E0FFE4EF5480FDE4EF540FCF
-:1020D00014FFED6038E4EF75F008A42448F582E4BD
-:1020E00034FFF5837490F0E4EF75F008A4244AF50A
-:1020F00082E434FFF5837480F0E4EF75F008A424E3
-:102100004EF582E434FFF5837480F08034E4EF759B
-:10211000F008A42408F582E434FFF5837490F0E419
-:10212000EF75F008A4240AF582E434FFF583E4F0A7
-:10213000E4EF75F008A4240EF582E434FFF583E49F
-:10214000F00E0220AB8D468E448F45747F90FFFDCC
-:10215000F0749090FFFCF0228C58EC24F65006E5C9
-:10216000582437FC22E5582430FC22D2B0122543F3
-:10217000EC700302227E755C03AE5B7F00E55C15AC
-:102180005C6480247F5035EF2400F582E434FBF555
-:1021900083E0FE24FE501EEF7D00FCE4FB7474C35C
-:1021A0009CFAEB9DFBEE7D00FCEAC39CED6480CBCA
-:1021B00064809B50028005EF2EFF80C18E5B8F5A9A
-:1021C000E55C6480247F500302227EE55A248E5011
-:1021D0000302227E855A5D755B00AE5AAF5B903577
-:1021E000EEE493F55CE55C155C6480247F5018EEAA
-:1021F0002400F582E434FBF583E0FCEF9035EE93A8
-:102200006C70040E0F80DE8E5A8F5BE55C64802458
-:102210007F406E755E017560E8755FFFE55D2402C5
-:10222000F55A755C07E55C334057AD60AE5FAF5E55
-:10223000E55CF5823395E0F5831201F5C4540FFC9B
-:10224000122155E55A2400F582E434FBF583ECF0C5
-:10225000055A055AAD60AE5FAF5EE55CF582339519
-:10226000E0F5831201F5540FFC122155E55A2400C4
-:10227000F582E434FBF583ECF0055A055A155C80D1
-:10228000A4740290F851F090F86B79C77A357B27E7
-:1022900078011203FE756A357569FC756801E49072
-:1022A000FF83F0748090FF81F0755902E55975F055
-:1022B00007A4247FF582E434F8F583E0788FF6FCF8
-:1022C000540F14FC788FECF6E55975F007A42481BF
-:1022D000F582E434F8F583E0789276FD0876E8FC40
-:1022E000788FE675F008A42448F582E434FFF5837E
-:1022F000E4F0788FE675F008A4244FF582E434FF0B
-:10230000F583ECF07892E6FF08E67E03CFC313CFA7
-:1023100013DEF9FE788FE675F008A42449F582E40F
-:1023200034FFF583EEF0788FE675F008A4244AF5C3
-:1023300082E434FFF5837480F07890ECF67D0078C9
-:1023400093E62CF618E63DF67892E6FD08E67C0367
-:10235000CDC313CD13DCF9FC788FE675F008A42407
-:102360004DF582E434FFF583ECF0788FE675F008E4
-:10237000A4244EF582E434FFF583E4F07892E6FD80
-:1023800008E6FC788FE6FF7E00EE24FE5003022470
-:10239000FDE4EE75F007A4247FF582E434F8F583BC
-:1023A000E0FFE4EF5480FAE4EF540F14FFE4EE751D
-:1023B000F007A42481F582E434F8F583E07890F600
-:1023C000E4EE1313548024F0F8E434FDF9E8FCE95A
-:1023D000FD8A5AEA700302246AE4EF75F008A42427
-:1023E00048F582E434FFF583E4F07890E6FAE4EF10
-:1023F00075F008A4244FF582E434FFF583EAF0ED8C
-:10240000FBEC7A03CBC313CB13DAF9FAE4EF75F0E4
-:1024100008A42449F582E434FFF583EAF07890E6D5
-:102420007B00FAEC2AFCED3BFDFBEC7A03CBC313FB
-:10243000CB13DAF9FAE4EF75F008A4244DF582E441
-:1024400034FFF583EAF0E4EF75F008A4244AF5823E
-:10245000E434FFF5837480F0E4EF75F008A4244EB3
-:10246000F582E434FFF5837480F00224F9E4EF751B
-:10247000F008A42408F582E434FFF583E4F07890B2
-:10248000E6FAE4EF75F008A4240FF582E434FFF5D2
-:1024900083EAF0EDFBEC7A03CBC313CB13DAF9FA42
-:1024A000E4EF75F008A42409F582E434FFF583EA2B
-:1024B000F07890E67B00FAEC2AFCED3BFDFBEC7A31
-:1024C00003CBC313CB13DAF9FAE4EF75F008A424B5
-:1024D0000DF582E434FFF583EAF0E4EF75F008A42B
-:1024E000240AF582E434FFF583E4F0E4EF75F008A4
-:1024F000A4240EF582E434FFF583E4F00E02238673
-:102500008E597892EDF608ECF6788FEFF61220737C
-:10251000228C26EC30E718E526540F1475F008A439
-:102520002448F582E434FFF583E054DFF08016E5BB
-:1025300026540F1475F008A42408F582E434FFF53E
-:1025400083E054DFF0227C0022EC90FC37F08C24F6
-:10255000ED2403F5257D00D39572ED95714003853B
-:102560007225E52524B75009752503740290FC37C0
-:10257000F0AC2512307622E4F56CF56B12257D2245
-:1025800090FC35E06573600E740490FC37F0E4F560
-:102590006B756C0380467D73E4FEFF79357AFC7BB6
-:1025A0000174057800120348E56C2403F56CE56BB3
-:1025B0003400F56BE56CD39572E56B95714006853B
-:1025C000726C85716BD3E56C9448E56B9400400C9C
-:1025D000740290FC37F0E4F56B756C03AC6C123050
-:1025E0007622EC90FC37F0E4F56CF56B8C32EC6005
-:1025F0000512306780057C001230762290FF93E050
-:102600004401F0B2B390FF04E0F54A90FF06E0FD0C
-:10261000A3E0ED7D00FC7D00FC90FF06E0FFA3E061
-:102620007E00FFE4FEEC4EFCED4FFDC3EC9448ED64
-:102630009400502290FF06E0FDA3E0ED7D00FC7DBC
-:1026400000FC90FF06E0FFA3E07E00FFE4FEEC4EFE
-:10265000FCED4FFD8004E4FD7C488C728D7190FF91
-:1026600002E0FDA3E0ED7D00FC7D00FC90FF02E0B8
-:10267000FFA3E07E00FFE4FEEC4EF54CED4FF54B82
-:10268000756A357569FC7568017D357EFC7F017959
-:1026900073E4FAFB74057800120348754900E549B4
-:1026A00024FE4019AD6AAE69AF68E412031805490B
-:1026B0000DED70010E8D6A8E698F6880E1756A3547
-:1026C0007569FC75680190FF00E05460B4000280F9
-:1026D00006D35003022CBFE54A540FF549E54A548E
-:1026E00080A2E0920290FF01E012018A000B2CBA56
-:1026F000270528232CBA292F2CBA2A122A462BADBB
-:102700002BB02BF02C632C91E56D30E70EE54C459A
-:102710004B7008E572640245716003022CBC90FFA7
-:1027200000E0541FB400028003D34029E54A60034F
-:10273000022820AD6AAE69AF68740112031878AD43
-:10274000E630E00BAD6AAE69AF6874021203187C24
-:102750000212307622B401028003D3401BE56D20C3
-:10276000E107E54A6003022820E54A24FE500302FF
-:1027700028207C0212307622B402028006D3500355
-:1027800002281EE56D20E10DE54A6009E54A6480F6
-:102790006003022820AC4A1230FD4003022820E5E5
-:1027A00049702530021190FF80E05408AD6AAE698F
-:1027B000AF68120318800F90FF82E05408AD6AAE34
-:1027C00069AF68120318803D154930021DE549754F
-:1027D000F008A42448F582E434FFF583E05408AD02
-:1027E0006AAE69AF68120318801BE54975F008A44A
-:1027F0002408F582E434FFF583E05408AD6AAE693D
-:10280000AF68120318AD6AAE69AF681201EF600BD2
-:10281000AD6AAE69AF6874011203187C021230769B
-:10282000228000022CBCE56D20E706E57245716050
-:1028300003022CBC90FF00E0541FB400028003D3BD
-:10284000401AE54C14454B7004E54A600302292CFC
-:1028500078ADE654FEF67C0012307622B401028098
-:1028600003D3402AE56D20E108E56D20E00302294D
-:102870002CE56D30E004E54A700BE56D30E109E5CB
-:102880004A24FE500302292C7C0012307622B40226
-:10289000028006D3500302292AE54C454B6003020F
-:1028A000292CAC4A1230FD400302292CE56D20E1B1
-:1028B00007E56D20E0028077E56D30E006E54960D0
-:1028C00002806CE549700F90FF82E054F7F090FFB2
-:1028D00080E054F7F022E549B401028003D34009B7
-:1028E0007D017C03120F128011B402028003D340D9
-:1028F000097D017C04120F1280001549300215E594
-:102900004975F008A42448F582E434FFF583E054C7
-:10291000F7F08013E54975F008A42408F582E43443
-:10292000FFF583E054F7F07C00123076228000023D
-:102930002CBCE56D20E706E57245716003022CBCF6
-:1029400090FF00E0541FB400028003D3401AE54C0E
-:1029500014454B7004E54A6003022A0F78ADE64443
-:1029600001F67C0012307622B401028003D34029A4
-:10297000E56D20E108E56D20E003022A0FE56D30EA
-:10298000E004E549700BE56D30E108E54924FE50AF
-:1029900002807F7C0012307622B402028003D34092
-:1029A0006FE54C454B60028069AC4A1230FD400235
-:1029B0008060E56D20E107E56D20E0028054E54987
-:1029C000701430020990FF80E04408F0800790FF07
-:1029D00082E04408F022E56D30E1331549300215FC
-:1029E000E54975F008A42448F582E434FFF583E056
-:1029F0004408F08013E54975F008A42408F582E442
-:102A000034FFF583E04408F07C0012307622800227
-:102A10008000022CBCE56D20E712E5724571700C58
-:102A2000E54A700890FF00E0541F6003022CBCE5EB
-:102A30004C90FFFFF090FFFFE06005436D018003C5
-:102A4000536DFE7C0012307622E56D30E70EE572A4
-:102A50004571600890FF00E0541F6003022CBCAD7C
-:102A60004BE54CED7D00FC7D00FCBD0002800302C7
-:102A70002BA8B401028003D34032E54A7005E54C2F
-:102A8000FC6003022BAA756A407569F8756801D36A
-:102A9000E5729412E57194004006E4FD7C12800416
-:102AA000AC72AD718C708D6F12308B22B4020280CB
-:102AB00003D34059E54A6003022BAAE54CFC70277A
-:102AC000756A527569F8756801D3E5729419E571F4
-:102AD00094004006E4FD7C198004AC72AD718C70EA
-:102AE0008D6F12308B8025756A6B7569F87568017A
-:102AF000D3E5729427E57194004006E4FD7C2780BD
-:102B000004AC72AD718C708D6F12308B22B40302E5
-:102B10008006D35003022BA8E54CF549700F90FFB7
-:102B200004E0FDA3E04D6003022BAA801890FB0295
-:102B3000E0FDA3E0FC90FF05E06C700790FF04E06F
-:102B40006D60028068E4F570F56F7F00E54914C59B
-:102B500049600FEF2400F582E434FBF583E02FFF9A
-:102B600080EA8F4AE54A2400F582E434FBF583E0ED
-:102B70007D00D39572ED95714006AC72AD71800FFA
-:102B8000E54A2400F582E434FBF583E07D00FC8C0B
-:102B9000708D6FE54A2400FCE434FBFDFEECFD7F04
-:102BA000018D6A8E698F6812308B228000022CBCE6
-:102BB000022CBCE56D30E719E5721445717012E521
-:102BC0004A700EE54C454B700890FF00E0541F60C2
-:102BD00003022CBCE56D20E008E56D20E103022C2A
-:102BE000BC756A6EE4F569F568E4F56F04F570127A
-:102BF000308B22E56D20E727E57245717021E54AAB
-:102C0000701DE54C6402454B600DE54C14454B606E
-:102C100006E54C454B700890FF00E0541F6003022E
-:102C20002CBCE56D20E008E56D20E103022CBC859D
-:102C30004C6EE56E700A436D01536DFDD2B080207D
-:102C4000E56E64026007E56E1460028072536DFEEB
-:102C5000436D02E56E64026005E56E147002C2B059
-:102C60007C0012307622E56D30E71AE5721445716A
-:102C70007013E54A700FE54C454B700990FF00E07A
-:102C8000541F1460028038E56D20E10280317C0120
-:102C900012307622E56D20E715E5724571700FE57B
-:102CA0004C454B700990FF00E0541F146002800FE8
-:102CB000E56D20E10280087C00123076228000025F
-:102CC0002F7DB440028006D35003022F7390FF0182
-:102CD000E090FC35F0E54A90FC36F0E490FC37F0EB
-:102CE000E56A2403F56AE5693400F569AD4BE54C06
-:102CF000856A82856983CDF0A3CDF090FF01E01253
-:102D000001C02D2A012D50022D7A032DA4042DF28D
-:102D1000052E2F062E55072E7B082EA7092ECD0B2C
-:102D20002EF30C2F02802F028100002F60E56D2012
-:102D3000E7067C051225DF227D767E357F02793815
-:102D40007AFC7B01740878001203487D087C00122D
-:102D5000254622E56D20E7067C051225DF22E54A9F
-:102D6000B403004010B40500500BE54A7F00FE7C20
-:102D70001012324D227D007C0712254622E56D207F
-:102D8000E7067C051225DF22E54AB403004010B4B3
-:102D90000500500BE54A7F00FE7C1112324D227D6A
-:102DA000007C0712254622E56D20E7067C051225EA
-:102DB000DF22E54AB405028003D3400AE4FF04FEA3
-:102DC0007C0A12324D22B401028003D3400AE4FF90
-:102DD00004FE7C0812324D22B403004010B40500FA
-:102DE000500BE54A7F00FE7C1312324D227D007CA1
-:102DF0000712254622E56D20E734D3E5729448E5B5
-:102E00007194005006E572457170067C021225DF50
-:102E100022E54AB40103B3400BC3B403004009B434
-:102E200006005004123123227C071225DF221225CE
-:102E30007D22E56D20E71DE54AB403004010B4058E
-:102E400000500BE54A7F00FE7C1612324D227C07B3
-:102E50001225DF2212257D22E56D20E71DE54AB40B
-:102E600003004010B40500500BE54A7F00FE7C19BA
-:102E700012324D227C071225DF2212257D22E56DBC
-:102E800020E723748190FF93F0E54AB403004010DB
-:102E9000B40500500BE54A7F00FE7C1712324D222C
-:102EA0007C071225DF2212257D22E56D20E71DE536
-:102EB0004AB403004010B40500500BE54A7F00FE01
-:102EC0007C1812324D227C071225DF2212257D222A
-:102ED000E56D20E71DE54AB403004010B40500503D
-:102EE0000BE54A7F00FE7C1512324D227C0712252D
-:102EF000DF2212257D22E56D20E7067C071225DF03
-:102F00002212257D22E56D30E72090FF00E0541F5E
-:102F1000701090FF01E0B480051225748003122523
-:102F20007D227D007C051225462290FF00E0541F83
-:102F300060067C051225DF22D3E5729448E5719482
-:102F400000500BC3E5729407E571940050067C03B2
-:102F50001225DF22E54AB40504123123227C071230
-:102F600025DF22E56D30E7087D007C05122546222D
-:102F70007C051225DF22B420028003D340008000AC
-:102F80001230512275430090FF83E0540FD39543D4
-:102F90004024E54324F0F582E434FEF583E0AD6A95
-:102FA000AE69AF6812031805430DED70010E8D6A0E
-:102FB0008E698F6880D1E5437D00FCC3E5709CF588
-:102FC00070E56F9DF56FE570456F6006E490FF83D7
-:102FD000F02290FF82E04408F0E4F56F75704990AC
-:102FE000FC35E0B405028003D3404090FC36E0F5A8
-:102FF00043B405028003D3400AE4FF04FE7C0B12B5
-:10300000324D22B401028003D3400AE4FF04FE7C67
-:103010000912324D22B403004010B40500500BE5F4
-:10302000437F00FE7C1412324D2222B480004023E4
-:10303000B48200501E7C357DFC1217A57D008C6C7F
-:103040008D6B90FC37E0600512305180057C0012DA
-:103050003076222290FF83E0547FF090FF82E0449C
-:1030600008F090FF80E04408F02290FF82E04408DE
-:10307000F090FF80E04408F0228C237D008C708D5E
-:103080006F756A357569FC75680112308B2290FF87
-:1030900083E0547FF0E5706449456F700122C3E519
-:1030A000709408E56F94004015752108E5217D00B6
-:1030B000FCC3E5709CF570E56F9DF56F8009857028
-:1030C00021E4F56F757049752200E522C395215002
-:1030D00026AD6AAE69AF681201EFFCE52224F8F56F
-:1030E00082E434FEF583ECF005220DED70010E8DC7
-:1030F0006A8E698F6880D3E521547F90FF81F0222A
-:103100008C487F00EF24FD4019E4EF75F007A424FC
-:103110007FF582E434F8F583E065487002D3220F2E
-:1031200080E28F47C32285727085716F90FF82E0C5
-:1031300054F7F090FF83E0547FF022C000C001C03C
-:1031400002C006C007E5782408F8860653067F7C8F
-:10315000FF1231AD7C007D00E57B6046FF90FD9560
-:10316000E0547F6E700FC083C082A3E0FDA3E0FC3B
-:10317000A3157B8007A3A3A3DFE68026DF06D0820A
-:10318000D083801EE0F8A3E0F9A3E0FAD082D083D8
-:10319000E8F0A3E9F0A3EAF0A3C083C082A3A3A34D
-:1031A00080DA123246D007D006D002D001D00022F9
-:1031B00085A87A75A888EC70027C3F8C7922E57826
-:1031C0002408F8760012329A80FBC000C001C002C9
-:1031D000C006C007AE047CFF1231ADE57B6042FF44
-:1031E00090FD95E0547F6E700BC083C082A3A3A3B3
-:1031F000157B8007A3A3A3DFEA8026DF06D082D059
-:103200008380D8E0F8A3E0F9A3E0FAD082D083E885
-:10321000F0A3E9F0A3EAF0A3C083C082A3A3A38034
-:10322000DA7808087918097C01E6547F6E70067612
-:10323000007700800608090CBC08EE123246D00761
-:10324000D006D002D001D00022757900857AA8225C
-:10325000C0F0C082C083C3E57B24E8500512329AD7
-:1032600080F4EC6031903575E493C39C4028C00431
-:103270007CFF1231ADD004430480E57B75F003A4DC
-:103280002495F582E434FDF583ECF0EFA3F0EEA392
-:10329000F0057B123246D083D082D0F022C0047C6D
-:1032A00020D28CD28DD504FDD0042275A80075885B
-:1032B0000075B80075F00075D000E4F8900000F6D5
-:1032C00008B800FB020000C3ED940250047D037CAB
-:1032D000E8ECF4FCEDF4FD0CBC00010D8C7F8D7E60
-:1032E00022C3EC94BCED940250047D077CD0ECF436
-:1032F000FCEDF4FD0CBC00010D8C7D8D7C22EC708E
-:103300000122C000E5782418F8A604E5782408F81E
-:10331000C6547FF6E630E703D0002212329A80F4DA
-:10332000C28C857C8C857D8AD28CC0E0C0D0C0F0F8
-:10333000C082C083C000C001C002C003C004C00579
-:10334000C006C007121AF8E5782408F8E66024E5FC
-:10335000782410F8A681E57875F021A4248DF582F3
-:10336000E434FCF58378AEE58104C398F9E6F0080F
-:10337000A3D9FA74082578F8057808E65480700C0B
-:10338000E578B407F3780875780080EFE5782410C5
-:10339000F88681E57875F021A4248DF582E434FC6B
-:1033A000F58378AEE58104C398F9E0F608A3D9FA6D
-:1033B000D007D006D005D004D003D002D001D00071
-:1033C000D083D082D0F0D0D0D0E032C0E0C0D0C026
-:1033D00000C001C002C28E857E8D857F8BD28E7823
-:1033E0001979097A07E77004A600800BE6600816D1
-:1033F000E67004E74480F70809DAEAE57960131417
-:10340000F579700EE5782408F87600123246D28CF1
-:10341000D28DD002D001D000D0D0D0E0327581ADB5
-:10342000742A90FF93F0757F30757EF8757D607516
-:103430007CF012053F1234CE12175B90FF93E044EC
-:1034400001F0B2B31234F81232A880DA22C0007C44
-:1034500001EC2408F8E660090CBC08F512329A80E9
-:10346000EED00022C0F0C082C083C000C006C007FA
-:10347000ED2410F876BCED75F021A4248DF582E4DE
-:1034800034FCF583C082C083A3A3E4780DF0A3D8F5
-:10349000FCEC547F75F002A42441F582E5F034354C
-:1034A000F583E493FE740193F5828E83E493FE74B6
-:1034B0000193FFD083D082EFF0A3EEF0ED2408F863
-:1034C000EC4480F6D007D006D000D083D082D0F074
-:1034D00022757800757B007A08791878087600776D
-:1034E000000809DAF8E478087480447FF67401442F
-:1034F00010F58975B808D2ABD2A9227581ADD28EEC
-:10350000D28CD2AFE57B6032FF90FD95E0548060B5
-:103510002478087908E0547FFA7B00E6547FB502EE
-:10352000027BFF08D9F5EB700CEAF012344AAD04C7
-:10353000AC02123461A3A3A3DFD212329A80C57CFD
-:10354000017D002204FE04F204F604EA04E604E22B
-:1035500004EE04FA04A604AA04D604DA04A204A21F
-:1035600004A204DE04BE04B604BA04B204CA04C64B
-:1035700004C204CE04D204AE1901030022004802A2
-:1035800000480E301420C81AD0180A0C0506020391
-:1035900001020001CE0181010000C0008000600036
-:1035A0003000180010000800040002000100081894
-:1035B00028380C05100A0200000000000301100A60
-:1035C000020000000000FBE0FBF2090227000102FC
-:1035D00000A0FA0904000003FF00000007058102B3
-:1035E00040000007050102400000070583030200B8
-:1035F00001220354005500530042003300340031CF
-:1036000000300020002000200020002000200020AA
-:073610000020000000000093
-:00000001FF
diff --git a/firmware/myricom/lanai.bin.ihex b/firmware/myricom/lanai.bin.ihex
deleted file mode 100644
index bf47f4c74940..000000000000
--- a/firmware/myricom/lanai.bin.ihex
+++ /dev/null
@@ -1,4771 +0,0 @@
-:100000004FF8F20EFE00C290000007880008E001E1
-:10001000014C9793FFFCE000001400000001000079
-:1000200000009293FFFC02900008F7062A6C9713D9
-:10003000FFFCF7062C109713FFFC07880008E00070
-:1000400015489793FFFCF702053C9713FFFCF70256
-:1000500000039713FFFCF70629E09713FFFC0788BE
-:100060000008E000161C9793FFFCF7062B849713FB
-:10007000FFFCF7062C1C9713FFFC07880008E00024
-:1000800015489793FFFCF7020ABC9713FFFCF70291
-:1000900000029713FFFCF7062AF89713FFFC078866
-:1000A0000008E000161C9793FFFC8796FFFC8296E1
-:1000B000FFF802140000013C0000000000019293D0
-:1000C000FFFC02900008F7044A9C85160000203AC5
-:1000D0000001EE00010100000001F70475EC0000D2
-:1000E0000001203A0000E600010000000001F704D2
-:1000F00075F000000001203A0000E600012D00002C
-:100100000001F7042D38F6862C2806380001F60584
-:100110002D3877390002F482001220320044E600C4
-:1001200001E0B4BA6802E00001E0F0052D38F70400
-:100130003B64F5844F54F7057A10202E0000E6004A
-:100140000199972A002095AA001CF6064A9826AC29
-:10015000000177350001C738680077390002073899
-:10016000000CA4BA60020000000194AA0010C73875
-:100170006000873A000400000001972A0014F70489
-:100180004A9C0000000127380001C02E7200D700F1
-:100190000A01E00001D0F7057A1895AA001CF606BE
-:1001A0004A9806AC000177350001C73868007739F6
-:1001B00000020738000CA4BA60020000000194AAF3
-:1001C0000010C7386000873A0004F0057A18972AB3
-:1001D0000014F50579D807880008E00001F497932A
-:1001E000FFFC8796FFFC8296FFF802140004013C96
-:1001F0000000000000019293FFFC02900008221012
-:100200000038F7047A10F6843B6400000001C03A1D
-:100210006A00470C0001D7000A70203A0000E6008F
-:10022000024C00000001F70475EC00000001203AC8
-:100230000000E600024C00000001F70475F0000029
-:100240000001203A0000E6000285F4820000F70475
-:100250002D38F6862C2806380001F6052D3877391A
-:100260000002F302001220320044E6000274B33AA6
-:100270006802F0052D38F3062A6CF3052C10E00017
-:100280000528F0057A18F38479D8F6844AA0231457
-:1002900000209316FFC4841E00109696FFD4F70426
-:1002A0004A9C9416FFE0851E0014C0367200EC00D4
-:1002B000036C9516FFE477350001C738680077397D
-:1002C0000002F3064A98C6B8300006B4000CC58494
-:1002D00000008736000000000001C03A4200E6003E
-:1002E00002FCC62400008736000400000001C03A6A
-:1002F0005200E600030020320000F6020001203226
-:100300000000E600030D00000001F58200008636C3
-:1003100000008716FFE000000001C0327200E2001A
-:100320000348F5020000C0327200E6000350202AA4
-:10033000000086B600048716FFE400000001C03606
-:100340007200E2000351202A0000F5020001202A79
-:100350000000E6000361202E0000F5820001202E3F
-:100360000000E600037020260000F4820001202631
-:100370000000E60003A5F60200018716FFD4F3068D
-:100380004A9876B90001C6B4700076B50002C6B4CA
-:10039000300006B4001486B600009716FFD8E000BF
-:1003A00004189696FFDC2714002C9713FFFC831685
-:1003B000FFC4000000019313FFFCF3064A98931357
-:1003C000FFFC9396FFCC07880008E001256897930F
-:1003D000FFFC8396FFCC20220000E6000415F60205
-:1003E00000018716FFD4F3064A9876B90001C6B417
-:1003F000700076B50002C6B4300006B4001486B6AC
-:1004000000009716FFD89696FFDCF7054AA0E0009B
-:10041000041C20320000F602000020320000E6003A
-:10042000042CF4820001E0000484F482000086962B
-:10043000FFD80000000177350002C738680077391F
-:100440000002F68642C8A63A6802C73868007539C5
-:10045000001E7528FFE505B8000286AE00000738CB
-:1004600000049716FFECC63057C07630FFF09616A2
-:10047000FFF475AD001E75ACFFE5C6B45FC076B481
-:10048000FFF09696FFF020260000E6000525F30613
-:1004900029E08696FFF0F5820000C7346800C49C0E
-:1004A0007200C02E6A00EC0004F0C5240000C62CC7
-:1004B00000008716FFEC00000001A6B2700205AC38
-:1004C0000001C73070007739001E7738FFE5C6B4E9
-:1004D00077C076B4FFF0F6AB280005280002871637
-:1004E000FFF000000001C02E7200EC0004B10630E5
-:1004F0000002F3020003F30576F48716FFF0869EF0
-:100500000004C7387000C7384800C6B470008716AA
-:10051000FFF406B400209702FF6C9482FF5096828D
-:10052000FF58F30629E0F3052C108796FFFC82960E
-:10053000FFF802140000013C00000000000192934B
-:10054000FFFC02900008F7047A1800000001203A2E
-:100550000000E60005CD00000001F7047A10F684E3
-:100560003B6400000001C03A6A00470C0001203AD9
-:100570000000E60005CDF5864A98F60479D8F684A1
-:100580004F540000000196B2001C06B400017735FC
-:100590000001C7386800773900020738000CA53A17
-:1005A00058020000000195320010C7385800873A01
-:1005B0000004F0057A189732001407880008E0005C
-:1005C00001F49793FFFCE00005FC00000001F70434
-:1005D0002D38F6862C2806380001F6052D38773997
-:1005E0000002F502001220320044E60005F4B53A9C
-:1005F0006802F0052D38F5062A6CF5052C10879653
-:10060000FFFC8296FFF802140000013C000000008D
-:1006100000019293FFFC0290000885960000F70409
-:1006200075EC852E0020203A0000E60006CCF5058A
-:100630007A08F70475F000000001203A0000E60097
-:1006400006CC00000001F7047A08F6843B64000041
-:100650000001C03A6A00470C0001D7000A70203A36
-:100660000000E60006CC00000001872E001CF68486
-:100670004F54F7057A00C7347200203A0000EE00AC
-:10068000068DF5020001E0000690F50579F8F08589
-:1006900079F8F6847A00C7387000C6B47000F704A1
-:1006A00079F8F68579E8C7387000C6347000F70429
-:1006B0004A9C00000001C0367200EC0006CCF60532
-:1006C00079F020360000EC0006F800000001F70485
-:1006D0002D38F6862C2806380001F6052D38773996
-:1006E0000002F502001320320044E6000738B53A54
-:1006F0006802E0000738F0052D38F7044A9C000036
-:100700000001C0327200EE00071900000001F7047A
-:100710004A9CE0000728F70579F020320000EC0041
-:10072000072800000001F08579F0F58579E0078859
-:100730000008E000074C9793FFFC8796FFFC829629
-:10074000FFF802140004013C000000000001929335
-:10075000FFFC0290000822100038F70475EC00003E
-:100760000001203A0000E60007A400000001F704A1
-:1007700075F000000001203A0000E60007A4000028
-:100780000001F7047A08F6843B6400000001C03AD7
-:100790006A00470C0001D7000A70203A0000E6000A
-:1007A00007D5F4020000F7042D38F6862C28063809
-:1007B0000001F6052D3877390002F30200132032CC
-:1007C0000044E60007CCB33A6802F0052D38E0009B
-:1007D0000AA4F3062B84F68479E8F6064A9877355E
-:1007E0000001C738680077390002F68479E00738DD
-:1007F000000CA33A6002C3B4000093360010C7385F
-:100800006000873A0004231400209316FFC4973633
-:100810000014849E0010F6844AA09496FFE09696F9
-:10082000FFD4851E0014F7044A9C00000001C03666
-:100830007200EC0008EC9516FFE477350001C7382C
-:10084000680077390002C6B8600006B4000CC584A1
-:1008500000008736000000000001C03A4A00E600B0
-:10086000087CC62000008736000400000001C03A62
-:100870005200E600088020320000F602000120321B
-:100880000000E600088D00000001F58200008636B9
-:1008900000008716FFE000000001C0327200E20095
-:1008A00008C8F5020000C0327200E60008D0202A15
-:1008B000000086B600048716FFE400000001C03681
-:1008C0007200E20008D1202A0000F5020001202A6F
-:1008D0000000E60008E1202E0000F5820001202E35
-:1008E0000000E60008F020220000F40200012022AF
-:1008F0000000E6000925F60200018716FFD4F30682
-:100900004A9876B90001C6B4700076B50002C6B444
-:10091000300006B4001486B600009716FFD8E00039
-:1009200009989696FFDC2714002C9713FFFC83167A
-:10093000FFC4000000019313FFFCF3064A989313D1
-:10094000FFFC9396FFCC07880008E0012568979389
-:10095000FFFC8396FFCC20220000E6000995F602FA
-:1009600000018716FFD4F3064A9876B90001C6B491
-:10097000700076B50002C6B4300006B4001486B626
-:1009800000009716FFD89696FFDCF7054AA0E00016
-:10099000099C20320000F602000020320000E60030
-:1009A00009ACF4820001E0000A04F482000086969B
-:1009B000FFD80000000177350002C738680077399A
-:1009C0000002F68642C8A63A6802C7386800753940
-:1009D000001E7528FFE505B8000286AE0000073846
-:1009E00000049716FFECC63057C07630FFF096161D
-:1009F000FFF475AD001E75ACFFE5C6B45FC076B4FC
-:100A0000FFF09696FFF020260000E6000AA5F30608
-:100A10002AF88696FFF0F5820000C7346800C49C6F
-:100A20007200C02E6A00EC000A70C5240000C62CBB
-:100A300000008716FFEC00000001A6B2700205ACB2
-:100A40000001C73070007739001E7738FFE5C6B463
-:100A500077C076B4FFF0F6AB2800052800028716B1
-:100A6000FFF000000001C02E7200EC000A310630D9
-:100A70000002F3020002F30576F48716FFF0869E6B
-:100A80000004C7387000C7384800C6B47000871625
-:100A9000FFF406B400209702FF6C9482FF50968208
-:100AA000FF58F3062AF8F3052C1C8796FFFC829664
-:100AB000FFF802140000013C0000000000019293C6
-:100AC000FFFC02900008F68479E8F70479F800004A
-:100AD0000001C6B47000F7047A20F68579E807387B
-:100AE0000001F7057A20F70479F0F6047A20C03681
-:100AF0007200E6000B2CF6862C28F7042D38000037
-:100B0000000106380001F6052D3877390002F5821C
-:100B1000001320320044E6000B20B5BA6802F0054D
-:100B20002D38F5862B84E0000B38F5852C1C0788C2
-:100B30000008E000074C9793FFFC8796FFFC829625
-:100B4000FFF802140000013C000000000001929335
-:100B5000FFFC02900008F7062C109713FFFCF70625
-:100B600029E09713FFFC07880008E00014F497932E
-:100B7000FFFCF7062C109713FFFCF7062A6C97135F
-:100B8000FFFC07880008E00014F49793FFFCF706C9
-:100B90002C1C9713FFFCF7062AF89713FFFC078815
-:100BA0000008E00014F49793FFFCF7062C1C971341
-:100BB000FFFCF7062B849713FFFC07880008E00072
-:100BC00014F49793FFFC8796FFFC8296FFF80214BB
-:100BD0000000013C0000000000019293FFFC029025
-:100BE0000008F0052D38F0052D3C8796FFFC829615
-:100BF000FFF802140000013C000000000001929385
-:100C0000FFFC0290000822100018FF852EDCF7067A
-:100C10000C3EC77C7400203A0000E60014299716A9
-:100C2000FFF44738FFFBF6846F50CFB8000083967F
-:100C3000FFF4F702003FC39C6D80C71C7400203A8C
-:100C4000003FE20012609396FFF477390002F682CB
-:100C50000C5CA6B6700200000001C1340000000068
-:100C600012600000126000000D6800000D680000B6
-:100C70000D5C00000D5C00000D6800000D680000B8
-:100C80001250000012500000123C0000123C000004
-:100C90000DE000000DE00000123C0000123C0000DE
-:100CA0000DE800000DF400000E0000000E20000012
-:100CB0000E4000000E6000000E8000000EA000003C
-:100CC0000EC000000EC800000ED000001228000068
-:100CD0000ED800000EF400000F10000012280000D3
-:100CE0000F1800000F1800000F2400000F24000050
-:100CF0000F4400000F4400000F6400000F64000068
-:100D00000F8400000F8400000F8C00000F8C000087
-:100D10000F9400000F9400000FB000000FB000000F
-:100D20000FB800000FD800000FF80000102C0000D2
-:100D3000106000001094000010C8000010FC0000BB
-:100D400011300000114C0000116800001214000066
-:100D50001184000011B4000011E400001214F382A9
-:100D60000006E00012549393FFFCF60200052032C7
-:100D70000014E6000DB527000010203A0001E20043
-:100D80000DB5F7062DCCF6842ECC0000000175B50C
-:100D90000002B62E700206B40001F6852ECC860243
-:100DA000FF34F7062E4C2036001FE2000DB5B62E9C
-:100DB0007002F0052ECCF7042D5800000001873A90
-:100DC000000000000001873A0018000000010788B9
-:100DD0000008C13800009793FFFCE000126000009B
-:100DE0000001E0001240F3820006F382000BE000F5
-:100DF00012549393FFFCF3820007E0001254939384
-:100E0000FFFCF382000B9393FFFC07880008E000CF
-:100E100015849793FFFCF3820005E000125493932E
-:100E2000FFFCF38200079393FFFC07880008E000B3
-:100E300015849793FFFCF3820005E000125493930E
-:100E4000FFFCF382000B9393FFFC07880008E0008F
-:100E500015849793FFFCF3820006E00012549393ED
-:100E6000FFFCF38200079393FFFC07880008E00073
-:100E700015849793FFFCF3820006E00012549393CD
-:100E8000FFFCF382000B9393FFFC07880008E0004F
-:100E900015849793FFFCF3820005E00012549393AE
-:100EA000FFFCF38200079393FFFC07880008E00033
-:100EB00015849793FFFCF3820005E000125493938E
-:100EC000FFFCE0001240F382000BE0001240F382CE
-:100ED0000007E000122CF382000BF382000B9393C7
-:100EE000FFFC07880008E00015849793FFFCE000F2
-:100EF0001240F3820006F38200079393FFFC0788F9
-:100F00000008E00015849793FFFCE0001240F38294
-:100F10000006E000122CF382000BF3820014E000C4
-:100F200012549393FFFCF38200149393FFFC078801
-:100F30000008E00015849793FFFCF3820005E000B1
-:100F400012549393FFFCF38200149393FFFC0788E1
-:100F50000008E00015849793FFFCF3820006E00090
-:100F600012549393FFFCF38200149393FFFC0788C1
-:100F70000008E00015849793FFFCF3820005E00071
-:100F800012549393FFFCE0001240F3820014E0003F
-:100F9000122CF3820014F38200149393FFFC078851
-:100FA0000008E00015849793FFFCE0001240F382F4
-:100FB0000006E000122CF3820014F38200149393D5
-:100FC000FFFC07880008E00015849793FFFCF3827C
-:100FD000000BE00012549393FFFCF38200149393F0
-:100FE000FFFC07880008E00015849793FFFCF3825C
-:100FF0000007E00012549393FFFCF38200149393D4
-:10100000FFFC07880008E00015849793FFFCF3823B
-:10101000000B9393FFFC07880008E000158497936A
-:10102000FFFCF3820005E00012549393FFFCF3826F
-:1010300000149393FFFC07880008E0001584979341
-:10104000FFFCF38200079393FFFC07880008E00091
-:1010500015849793FFFCF3820005E00012549393EC
-:10106000FFFCF38200149393FFFC07880008E00064
-:1010700015849793FFFCF382000B9393FFFC078882
-:101080000008E00015849793FFFCF3820006E0005F
-:1010900012549393FFFCF38200149393FFFC078890
-:1010A0000008E00015849793FFFCF38200079393F8
-:1010B000FFFC07880008E00015849793FFFCF3828B
-:1010C0000006E00012549393FFFCF3820014939304
-:1010D000FFFC07880008E00015849793FFFCF3826B
-:1010E000000B9393FFFC07880008E000158497939A
-:1010F000FFFCF3820005E00012549393FFFCF3829F
-:1011000000149393FFFC07880008E0001584979370
-:10111000FFFCF38200079393FFFC07880008E000C0
-:1011200015849793FFFCF3820005E000125493931B
-:10113000FFFCF38200149393FFFC07880008E00093
-:1011400015849793FFFCE0001240F382000BF382BA
-:1011500000149393FFFC07880008E0001584979320
-:10116000FFFCE0001240F3820007F3820014939327
-:10117000FFFC07880008E00015849793FFFCE0005F
-:10118000122CF382000BF38200149393FFFC078868
-:101190000008E00015849793FFFCF382000B939303
-:1011A000FFFC07880008E00015849793FFFCE0002F
-:1011B0001240F3820006F38200149393FFFC078829
-:1011C0000008E00015849793FFFCF38200079393D7
-:1011D000FFFC07880008E00015849793FFFCE000FF
-:1011E0001240F3820006F38200149393FFFC0788F9
-:1011F0000008E00015849793FFFCE000122CF382B6
-:10120000000BF7043528F682000107380008E000DB
-:1012100013CCF7053544F38200149393FFFC078841
-:101220000008E00015849793FFFCF3820007939376
-:10123000FFFC07880008E00015849793FFFCF38209
-:1012400000059393FFFC07880008E000158497933E
-:10125000FFFC9013FFFC07880008E00015849793BB
-:10126000FFFC8396FFF400000001779C0014703EA1
-:10127000FFE1E600129DF7060400F7046F5C000032
-:10128000000107380001F7056F5CF7046F5CE000B0
-:101290000000000000018396FFF4F7060400C01E62
-:1012A0007400E600142900000001F7042ED0F68433
-:1012B00035240738000120360000E6001405F70544
-:1012C0002ED0F704E01400000001203A0000E600F0
-:1012D0001405F6820000F685E014F7042ED8C53414
-:1012E000000007380001F7052ED8202A0002EE0082
-:1012F00013CCF6820000F684352800000001873602
-:10130000000000000001203A0002E60013A005B42E
-:1013100000089593FFFC9516FFE89596FFE49696D6
-:10132000FFE007880008E00016649793FFFC85162D
-:10133000FFE88596FFE48696FFE020220000E600A5
-:101340001390F70200008636000C000000012032E6
-:10135000000FE20013750000000187360014000042
-:101360000001073800019736001487360014E000AA
-:101370001390F702000076B10002C6B46000773522
-:101380000005C7386A00C738600007380010C72C4E
-:101390007000203A0000E6001200F705352CF684B4
-:1013A0003528F7046F4C00000001C0367200E600DB
-:1013B00013C007341494F3846F44E00013C4F3851E
-:1013C0003528F7053528E00012E805280001203609
-:1013D0000000E6001429F6862C28F7042D38F005C5
-:1013E000352406380001F6052D3877390002F382DE
-:1013F000000D20320044E6001428B3BA6802E00071
-:101400001428F0052D38F704E01000000001203A00
-:101410000000E6001429F7020000F705E010078835
-:101420000008E00102989793FFFCF4842D38F7043C
-:101430002D3C00000001C03A4A00E6000C09F68687
-:101440002C2877390002A53A680200000001202A02
-:101450000014E600149127280015203A0001E2004C
-:101460001491F7062DCCF6842ECC8602FF3475B588
-:101470000002B52E700206B40001F6852ECCF706E8
-:101480002E4C2036001FE2001491B62E7002F0059B
-:101490002ECCF7062D4476A90002A7367002000074
-:1014A0000001873A000000000001C6B470008736D2
-:1014B00000049496FFEC07880008C1380000979359
-:1014C000FFFCF7042D3C8496FFEC07380001203A1E
-:1014D0000044E600142CF7052D3CE000142CF00528
-:1014E0002D3C8796FFFC8296FFF802140000013C19
-:1014F0000000000000019293FFFC02900008841697
-:101500000000F702000085960004203A0021EE005A
-:10151000153495A20000F606233807200084C6A0E3
-:101520000000963A000427380004C03A6A00EC0034
-:101530001520000000018796FFFC8296FFF8021438
-:101540000008013C0000000000019293FFFC0290A3
-:1015500000088696000087160004F6042D40973692
-:1015600000009736000407300001F7052D4096363D
-:1015700000088796FFFC8296FFF802140008013CE1
-:101580000000000000019293FFFC02900008851605
-:10159000000000000001202A0014E60015D92728C9
-:1015A0000015203A0001E20015D9F7062DCCF6848B
-:1015B0002ECC8602FF3475B50002B52E700206B43B
-:1015C0000001F6852ECCF7062E4C2036001FE200D7
-:1015D00015D9B62E7002F0052ECCF6862D4477294B
-:1015E0000002A6BA68020000000186B600000000F2
-:1015F0000001C7386800873A00040000000107882E
-:101600000008C13800009793FFFC8796FFFC829684
-:10161000FFF802140004013C000000000001929356
-:10162000FFFC029000088716000086960004F6066C
-:101630002D4476B5000285BA000000000001B5B661
-:101640006002C6B47000859600080000000195B6DF
-:1016500000048796FFFC8296FFF80214000C013C00
-:101660000000000000019293FFFC02900008861623
-:101670000000000000018732000400000001203A51
-:10168000000F86B20000C5380000EE0016B4C5B4E5
-:1016900000002036000FEE0016B400000001203AD2
-:1016A0000000EC0016B50000000120360000EC0040
-:1016B00016D0000000018732000C0000000107383E
-:1016C00000019732000C8732000CE00016D8F402BB
-:1016D0000000C02A5A00440C00018796FFFC829645
-:1016E000FFF802140004013C0000000000010000AB
-:1016F00000009293FFFC02900008F7062EE097137B
-:10170000FFFCF70632D49713FFFC07880008E000BF
-:1017100015489793FFFCF702182C9713FFFCF782EC
-:1017200000099793FFFCF7062EE09713FFFC07884C
-:101730000008E000161C9793FFFCF702345897133B
-:10174000FFFCF702000C9713FFFCF7062F6C9713B2
-:10175000FFFC07880008E000161C9793FFFCF702C7
-:101760003F949713FFFCF782000B9793FFFCF7065B
-:101770002FF89713FFFC07880008E000161C9793CA
-:10178000FFFCF7023B849713FFFCF782000B979353
-:10179000FFFCF70632289713FFFC07880008E000DB
-:1017A000161C9793FFFCF70226E49713FFFCF70241
-:1017B00000139713FFFCF70630849713FFFC07888C
-:1017C0000008E000161C9793FFFCF70226A0971371
-:1017D000FFFCF70200119713FFFCF7063110971377
-:1017E000FFFC07880008E000161C9793FFFCF70237
-:1017F000182C9713FFFCF78200099793FFFCF7065C
-:10180000319C9713FFFC07880008E000161C979393
-:10181000FFFCF0057A78F00532E88796FFFC8296A7
-:10182000FFF802140000013C000000000001929348
-:10183000FFFC0290000822100050F70471C800005D
-:101840000001203A0000E6001855F68671C4E00059
-:10185000186CF6020000F70471D40000000177391B
-:101860000002C7386800863A001800000001F6053B
-:1018700032C486B2000807018000C5B47400F58543
-:1018800032D087320018F6866F4477390002A73AC3
-:101890006802202E0000F70532C0073809D886B24A
-:1018A0000004F70532CCE6001941F68532C8F7048A
-:1018B0007198F6847A782738000120360000E60017
-:1018C0001910F7057198F70476FC00000001203A22
-:1018D0000000E60018E8F3020011F30632D4F30525
-:1018E00076FCE00018F8F7020001F30576F8F3063D
-:1018F00032D4F3057700F7020000203A0000E6003A
-:101900001914F3020001F3063110E000268CF305F0
-:1019100032D4F3020001F3057A78F3063084F3053C
-:1019200032D4F30432C4000000019313FFFC078893
-:101930000008E00006109793FFFCE000268C0000F2
-:101940000001F3020000202E0000E6001CB99316EF
-:10195000FFE4873200088696FFE4C3040000C03A23
-:101960003200E6001984203600008732000C0000A7
-:101970000001C03A3200E600198420360000F682E9
-:10198000000120360000E6001CB8F3020000F70456
-:1019900032C09316FFACF58432C4863A142803B8DB
-:1019A0001420042C000886BA142400000001C03260
-:1019B0006A00EC001A709616FFEC77310001C73808
-:1019C000600077390002C63838000630000C86B255
-:1019D0000000872E00088516FFACC0367200E600B6
-:1019E0001A00C484000086B20004872E000C000098
-:1019F0000001C0367200E6001A04202A0000F50239
-:101A00000001202A0000E6001A1100000001F48203
-:101A1000000086B200008722000000000001C036EE
-:101A20007200E2001A4CF5820000C0367200E60037
-:101A30001A54202E000086B2000487220004000001
-:101A40000001C0367200E2001A55202E0000F58217
-:101A50000001202E0000E6001A6520260000F48216
-:101A6000000120260000E6001A70F3020001931620
-:101A7000FFAC8316FFAC00000001201A0000E60056
-:101A80001AB1F60200018716FFEC0000000176B9DA
-:101A90000001C6B4700076B50002C6B4380006B4C2
-:101AA000001486B600009716FFF0E0001B1896960B
-:101AB000FFF4271400149713FFFC9413FFFC939377
-:101AC000FFFC9396FFBC07880008E0012568979308
-:101AD000FFFC8396FFBC20220000E6001B15F602E7
-:101AE00000018716FFEC0000000176B90001C6B4C2
-:101AF000700076B50002C6B4380006B4001486B68D
-:101B000000009716FFF09696FFF4971E0008E0007D
-:101B10001B1C20320000F602000020320000E6000C
-:101B20001CB8F3020000F60432C09316FFAC86B274
-:101B3000142803B014200430148C873214240000BD
-:101B40000001C0367200EC001C049696FFEC77355D
-:101B50000001C738680077390002C5B8380005AC05
-:101B6000000C86AE00008732148C8516FFACC036A0
-:101B70007200E6001B94C484000086AE0004873225
-:101B8000149000000001C0367200E6001B98202A65
-:101B90000000F5020001202A0000E6001BA500005D
-:101BA0000001F482000086AE0000872200000000E1
-:101BB0000001C0367200E2001BE0F6020000C036F1
-:101BC0007200E6001BE82032000086AE0004872287
-:101BD000000400000001C0367200E2001BE9203260
-:101BE0000000F602000120320000E6001BF920266A
-:101BF0000000F482000120260000E6001C04F3022D
-:101C000000019316FFAC8316FFAC00000001201A00
-:101C10000000E6001C45F60200018716FFEC0000FC
-:101C2000000176B90001C6B4700076B50002C6B4F2
-:101C3000380006B4001486B600009716FFF0E000E6
-:101C40001CAC9696FFF4271400149713FFFC941312
-:101C5000FFFC9393FFFC9396FFBC07880008E0010C
-:101C600025689793FFFC8396FFBC20220000E600C6
-:101C70001CA9F60200018716FFEC0000000176B9EE
-:101C80000001C6B4700076B50002C6B4380006B4D0
-:101C9000001486B600009716FFF09696FFF4971E84
-:101CA0000008E0001CB020320000F60200002032E4
-:101CB0000000E6001E15F3020001F68432C00000A9
-:101CC000000185B60EF486360EF8202E0010E200D4
-:101CD0001CDC20320010E2001CF9000000018736F5
-:101CE0000F00000000010738000197360F0087360B
-:101CF0000F00E0001D24F702000007300001C03A89
-:101D00005A00E6001D1DF682000020320010E60099
-:101D10001D20202E0000E6001D24C7340000F6829E
-:101D20000001C7340000203A0000E6001E14F30250
-:101D30000001F30432CC000000019316FFDC931382
-:101D4000FFFC07880008E00043689793FFFC20220F
-:101D50000000E6001DFCF30200008316FFDC00001B
-:101D60000001861A00000000000120320010E2008D
-:101D70001D9176B10002871A000C0000000107389F
-:101D80000001971A000C871A000CE0001DFCF302FA
-:101D90000000F302004C9313FFFCC6B460007735DB
-:101DA0000004C7386A008316FFDCC7386000C738F4
-:101DB0003000073800109713FFFCF3067A289313BE
-:101DC000FFFC9616FFB407880008E00126F89793F9
-:101DD000FFFC8616FFB4000000010630000120322F
-:101DE0000011E6001DEC00000001F6020000831661
-:101DF000FFDC00000001961A0000F30200019316B8
-:101E0000FFD48316FFD400000001201A0000E60072
-:101E10001E18F30200019316FFE48316FFE400008E
-:101E20000001201A0000E6001F35F6820CABF70413
-:101E300032B48316FFD407380001F70532B4F70433
-:101E400032B4201A0000E6001E7000000001F70402
-:101E500032C0F306E030C03A3200E6001E700000E7
-:101E60000001F70432E80000000107380001F7051F
-:101E700032E8F70471C400000001203A0000E600D7
-:101E80001EADF6862C28F7042D3800000001063818
-:101E90000001F6052D3877390002F302000A2032DE
-:101EA0000044E6001EACB33A6802F0052D38F70492
-:101EB00071D4F68471CC07380001C03A6A00E6009C
-:101EC0001EC8F70571D4F00571D4F68471D4F704F7
-:101ED00071D0F00571C4C0367200470C0001F68461
-:101EE00032D00000000120360000E60025D9F705B9
-:101EF00071C8F704719800000001203A0000E60064
-:101F0000257900000001F70475EC00000001203A7B
-:101F10000000E600257800000001F70475F00000DD
-:101F20000001203A0000E600257800000001E000F2
-:101F300025DCF306319CF00532E8F70432C0F604E4
-:101F40006F5496BA000420320000E6001F60F302CE
-:101F5000000CF3020001F3056F54E0001F68F70264
-:101F60000001F3056F58F7020000203A0000E60078
-:101F70001F7CF3062F6CE000268CF30532D4F58429
-:101F80007A7024940010202E0001E6002284F5854A
-:101F90007AA0F7020001F60432C8F7057A70F70458
-:101FA00032C4F68432C0F6057A2C9002FF8090028B
-:101FB000FF38F5847A28073800249582FF3C970281
-:101FC000FF409602FF448736141000000001C73816
-:101FD0006000973614108736141800000001073887
-:101FE00000019736141887361418F0056F50F7045F
-:101FF00032B89596FFECC7386000F70532B8F704A1
-:1020000032BCF3062FF807380001F70532BCF7049D
-:1020100032BCF30532D4F7060C3EC07E7400E600F5
-:10202000203400000001C07E7400E600202500007E
-:102030000001F7060C3EC77C7400203A0010E60051
-:10204000268C00000001F70432E4FF820010F584C2
-:102050006F5807380001202E0021E2002090F7057C
-:1020600032E4F7042D38F6862C2806380001F605F0
-:102070002D387739000220320044E6002084B5BABA
-:102080006802F0052D38F3020022E0002094F305E9
-:102090006F58F0056F54F58432C000000001902E97
-:1020A0000004872E000000000001203A0002E60034
-:1020B00021C0000000018702FF38032C0EF49316A4
-:1020C000FFCCF7057A689313FFFC9596FFB8078855
-:1020D0000008E00043A09793FFFC8596FFB82022FC
-:1020E0000000E600217C00000001862E0EF80000B2
-:1020F000000120320010E2002119F302004C872E6B
-:102100000F000000000107380001972E0F00872EF6
-:102110000F00E000217C000000019313FFFCF30698
-:102120007A289313FFFC76B10002C6B460007735BD
-:102130000004C7386A008316FFCCC7386000C73870
-:102140003000073800109713FFFC9596FFB89616DD
-:10215000FFB407880008E00126F89793FFFC861675
-:10216000FFB48596FFB80630000120320011E6006A
-:10217000217800000001F6020000962E0EF8F70408
-:1021800032C0F306E030C03A3200E60021C0000061
-:102190000001F704E0180000000177B8001E703E4F
-:1021A000FFE1E60021C1000000010F814000F704BB
-:1021B00079C80000000107380001F70579C8F70465
-:1021C00079C8F70471C400000001203A0000E6005D
-:1021D00021FDF6862C28F7042D3800000001063872
-:1021E0000001F6052D3877390002F302000A20328B
-:1021F0000044E60021FCB33A6802F0052D38F704EC
-:1022000071D4F68471CC07380001C03A6A00E60048
-:102210002218F70571D4F00571D4F68471D4F7044F
-:1022200071D0F00571C4C0367200470C0001F6840D
-:1022300032D00000000120360000E60025D9F70565
-:1022400071C8F704719800000001203A0000E60010
-:10225000257900000001F70475EC00000001203A28
-:102260000000E600257800000001F70475F000008A
-:102270000001203A0000E600257800000001E0009F
-:1022800025DCF306319CF0057A889002FF38F005D2
-:102290006F509002FF80F70432C4F3063228F30532
-:1022A00032D4F60432C8F6847A2CF50200000738DE
-:1022B0000024F7057A9820320000E60022D5F605C2
-:1022C0007A90C02A5A00E6002620C0326A00EE004A
-:1022D000262100000001F68432C00000000187368C
-:1022E000141000000001C7386000973614108736BC
-:1022F00014180000000107380001973614188736BB
-:102300001418F70432B800000001C7386000F70560
-:1023100032B8F70432BC0000000107380001F705AD
-:1023200032BCF70432BC20320000E6002345000036
-:102330000001F70432E0F5057A7007380001E0008B
-:102340002348F70532E0F5057A70F5846F580000F0
-:102350000001202E0021E200238CF6862C28F704B1
-:102360002D380000000106380001F6052D387739B8
-:10237000000220320044E6002380B5BA6802F0056E
-:102380002D38F3020022E0002390F3056F58F0058A
-:102390006F54F58432C000000001902E0004872E97
-:1023A000000000000001203A0002E60024BC00000A
-:1023B00000018702FF38032C0EF49316FFC4F705C3
-:1023C0007A689313FFFC9596FFB807880008E00031
-:1023D00043A09793FFFC8596FFB820220000E600FB
-:1023E000247800000001862E0EF800000001203243
-:1023F0000010E2002415F302004C872E0F000000AD
-:10240000000107380001972E0F00872E0F00E00013
-:102410002478000000019313FFFCF3067A2893133D
-:10242000FFFC76B10002C6B4600077350004C738FF
-:102430006A008316FFC4C7386000C7383000073809
-:1024400000109713FFFC9596FFB89616FFB4078807
-:102450000008E00126F89793FFFC8616FFB48596E6
-:10246000FFB80630000120320011E600247400009D
-:102470000001F6020000962E0EF8F70432C0F306B3
-:10248000E030C03A3200E60024BC00000001F7044E
-:10249000E0180000000177B8001E703EFFE1E60082
-:1024A00024BD000000010F814000F70479C800003E
-:1024B000000107380001F70579C8F70479C8F70467
-:1024C00071C400000001203A0000E60024F9F686FD
-:1024D0002C28F7042D380000000106380001F6050D
-:1024E0002D3877390002F302000A20320044E6005A
-:1024F00024F8B33A6802F0052D38F70471D4F68455
-:1025000071CC07380001C03A6A00E6002514F705CF
-:1025100071D4F00571D4F68471D4F70471D0F0054C
-:1025200071C4C0367200470C0001F68432D000003E
-:10253000000120360000E60025D9F70571C8F70430
-:10254000719800000001203A0000E60025790000A3
-:102550000001F70475EC00000001203A0000E600DD
-:10256000257800000001F70475F000000001203A12
-:102570000000E60025D100000001F58476F8000097
-:102580000001202E0021E20025C4F6862C28F70445
-:102590002D380000000106380001F6052D38773986
-:1025A000000220320044E60025B0B5BA6802F0050A
-:1025B0002D38F3020022F30576F8F3047700E000EB
-:1025C00025C8F30576FCF00576FCE00025D8F0057B
-:1025D0007A78E00025DCF306319CF3062EE0F30563
-:1025E00032D4F70471C800000001203A0000E60070
-:1025F000268CF6862C28F7042D38000000010638BA
-:102600000001F6052D3877390002F3020009203267
-:102610000044E600268CB33A6802E000268CF00500
-:102620002D38F7047A9000000001C03A6A00EE00ED
-:102630002641C5B40000C7385A00E0002648F70517
-:102640007A90C5B80000F0057A90F6847A88F7068B
-:102650007A2876350003A732700206B40001971677
-:10266000FFEC84A6FFFCF7067A2CF3047A98948298
-:10267000FF3C9302FF409582FF44B5B27002F7041D
-:102680007A98F6857A88C7385800F7057A98879639
-:10269000FFFC8296FFF802140000013C00000000DD
-:1026A00000019293FFFC02900008F7020001F70579
-:1026B0007A78F7063084F70532D4F70432C4000084
-:1026C00000019713FFFC07880008E00006109793AD
-:1026D000FFFC8796FFFC8296FFF802140000013C85
-:1026E0000000000000019293FFFC029000082210FD
-:1026F0000050F70432D0F3020000203A0000E60058
-:102700002A719316FFE4F68432C48616FFE48736F6
-:102710000008C3040000C03A3200E600273C203223
-:1027200000008736000C00000001C03A3200E600CD
-:10273000273C20320000F602000120320000E600B3
-:102740002A70F3020000F70432C09316FFACF58440
-:1027500032C4863A142803B81420042C000886BA20
-:10276000142400000001C0326A00EC0028289616EC
-:10277000FFEC77310001C738600077390002C638B6
-:1027800038000630000C86B20000872E000885163F
-:10279000FFACC0367200E60027B8C484000086B2E1
-:1027A0000004872E000C00000001C0367200E60015
-:1027B00027BC202A0000F5020001202A0000E600C4
-:1027C00027C900000001F482000086B200008722C1
-:1027D000000000000001C0367200E2002804F5820B
-:1027E0000000C0367200E600280C202E000086B2E1
-:1027F00000048722000400000001C0367200E200DD
-:10280000280D202E0000F5820001202E0000E60099
-:10281000281D20260000F482000120260000E6008A
-:102820002828F30200019316FFAC8316FFAC0000CA
-:102830000001201A0000E6002869F6020001871650
-:10284000FFEC0000000176B90001C6B4700076B557
-:102850000002C6B4380006B4001486B6000097160D
-:10286000FFF0E00028D09696FFF427140014971389
-:10287000FFFC9413FFFC9393FFFC9396FFBC078827
-:102880000008E00125689793FFFC8396FFBC202297
-:102890000000E60028CDF60200018716FFEC0000DC
-:1028A000000176B90001C6B4700076B50002C6B466
-:1028B000380006B4001486B600009716FFF096960E
-:1028C000FFF4971E0008E00028D420320000F60232
-:1028D000000020320000E6002A70F3020000F60437
-:1028E00032C09316FFAC86B2142803B01420043013
-:1028F000148C8732142400000001C0367200EC00F2
-:1029000029BC9696FFEC77350001C7386800773907
-:102910000002C5B8380005AC000C86AE0000873256
-:10292000148C8516FFACC0367200E600294CC484B6
-:10293000000086AE00048732149000000001C0360B
-:102940007200E6002950202A0000F5020001202A2A
-:102950000000E600295D00000001F482000086AE60
-:1029600000008722000000000001C0367200E20073
-:102970002998F6020000C0367200E60029A0203235
-:10298000000086AE00048722000400000001C0366B
-:102990007200E20029A120320000F602000120327C
-:1029A0000000E60029B120260000F4820001202664
-:1029B0000000E60029BCF30200019316FFAC831669
-:1029C000FFAC00000001201A0000E60029FDF6021D
-:1029D00000018716FFEC0000000176B90001C6B4C3
-:1029E000700076B50002C6B4380006B4001486B68E
-:1029F00000009716FFF0E0002A649696FFF4271473
-:102A000000149713FFFC9413FFFC9393FFFC939621
-:102A1000FFBC07880008E00125689793FFFC8396B8
-:102A2000FFBC20220000E6002A61F60200018716A2
-:102A3000FFEC0000000176B90001C6B4700076B565
-:102A40000002C6B4380006B4001486B6000097161B
-:102A5000FFF09696FFF4971E0008E0002A682032E7
-:102A60000000F602000020320000E6002BCDF30249
-:102A70000001F68432C00000000185B60EF48636EF
-:102A80000EF8202E0010E2002A9420320010E200FE
-:102A90002AB10000000187360F000000000107384E
-:102AA000000197360F0087360F00E0002ADCF7029E
-:102AB000000007300001C03A5A00E6002AD5F6822D
-:102AC000000020320010E6002AD8202E0000E60088
-:102AD0002ADCC7340000F6820001C7340000203A27
-:102AE0000000E6002BCCF3020001F30432CC00001E
-:102AF00000019316FFDC9313FFFC07880008E00039
-:102B000043689793FFFC20220000E6002BB4F302F9
-:102B100000008316FFDC00000001861A00000000A0
-:102B2000000120320010E2002B4976B10002871A22
-:102B3000000C0000000107380001971A000C871AEA
-:102B4000000CE0002BB4F3020000F302004C9313DE
-:102B5000FFFCC6B4600077350004C7386A008316EE
-:102B6000FFDCC7386000C738300007380010971303
-:102B7000FFFCF3067A289313FFFC9616FFB4078830
-:102B80000008E00126F89793FFFC8616FFB40000CA
-:102B900000010630000120320011E6002BA40000E5
-:102BA0000001F60200008316FFDC00000001961A07
-:102BB0000000F30200019316FFD48316FFD4000037
-:102BC0000001201A0000E6002BD0F302000193164A
-:102BD000FFE48316FFE400000001201A0000E60075
-:102BE0002CEDF6820CABF70432B48316FFD4073811
-:102BF0000001F70532B4F70432B4201A0000E600F1
-:102C00002C2800000001F70432C0F306E030C03A7F
-:102C10003200E6002C2800000001F70432E8000032
-:102C2000000107380001F70532E8F70471C400001D
-:102C30000001203A0000E6002C65F6862C28F704F7
-:102C40002D380000000106380001F6052D387739CF
-:102C50000002F302000A20320044E6002C64B33A7A
-:102C60006802F0052D38F70471D4F68471CC07386A
-:102C70000001C03A6A00E6002C80F70571D4F00527
-:102C800071D4F68471D4F70471D0F00571C4C036E4
-:102C90007200470C0001F68432D00000000120369B
-:102CA0000000E6003391F70571C8F7047198000041
-:102CB0000001203A0000E600333100000001F70473
-:102CC00075EC00000001203A0000E60033300000FF
-:102CD0000001F70475F000000001203A0000E60052
-:102CE000333000000001E0003394F306319CF0051E
-:102CF00032E8F70432C0F6046F5496BA000420326A
-:102D00000000E6002D18F302000CF3020001F305A9
-:102D10006F54E0002D20F7020001F3056F58F70211
-:102D20000000203A0000E6002D34F3062F6CE0008E
-:102D30003444F30532D4F5847A7024940010202EA4
-:102D40000001E600303CF5857AA0F7020001F604A8
-:102D500032C8F7057A70F70432C4F68432C0F6053B
-:102D60007A2C9002FF809002FF38F5847A28073889
-:102D700000249582FF3C9702FF409602FF4487366D
-:102D8000141000000001C738600097361410873611
-:102D90001418000000010738000197361418873610
-:102DA0001418F0056F50F70432B89596FFECC73849
-:102DB0006000F70532B8F70432BCF3062FF8073885
-:102DC0000001F70532BCF70432BCF30532D4F70634
-:102DD0000C3EC07E7400E6002DEC00000001C07EB9
-:102DE0007400E6002DDD00000001F7060C3EC77CF4
-:102DF0007400203A0010E600344400000001F7049B
-:102E000032E4FF820010F5846F5807380001202E4D
-:102E10000021E2002E48F70532E4F7042D38F6864B
-:102E20002C2806380001F6052D38773900022032AB
-:102E30000044E6002E3CB5BA6802F0052D38F302D6
-:102E40000022E0002E4CF3056F58F0056F54F58416
-:102E500032C000000001902E0004872E0000000008
-:102E60000001203A0002E6002F78000000018702EE
-:102E7000FF38032C0EF49316FFCCF7057A689313F2
-:102E8000FFFC9596FFB807880008E00043A09793E1
-:102E9000FFFC8596FFB820220000E6002F340000DA
-:102EA0000001862E0EF80000000120320010E20022
-:102EB0002ED1F302004C872E0F00000000010738CE
-:102EC0000001972E0F00872E0F00E0002F34000026
-:102ED00000019313FFFCF3067A289313FFFC76B1ED
-:102EE0000002C6B4600077350004C7386A00831654
-:102EF000FFCCC7386000C738300007380010971380
-:102F0000FFFC9596FFB89616FFB407880008E0010D
-:102F100026F89793FFFC8616FFB48596FFB8063017
-:102F2000000120320011E6002F3000000001F602FF
-:102F30000000962E0EF8F70432C0F306E030C03AD7
-:102F40003200E6002F7800000001F704E0180000CE
-:102F5000000177B8001E703EFFE1E6002F79000007
-:102F600000010F814000F70479C800000001073814
-:102F70000001F70579C8F70479C8F70471C40000A7
-:102F80000001203A0000E6002FB5F6862C28F70451
-:102F90002D380000000106380001F6052D3877397C
-:102FA0000002F302000A20320044E6002FB4B33AD4
-:102FB0006802F0052D38F70471D4F68471CC073817
-:102FC0000001C03A6A00E6002FD0F70571D4F00581
-:102FD00071D4F68471D4F70471D0F00571C4C03691
-:102FE0007200470C0001F68432D000000001203648
-:102FF0000000E6003391F70571C8F70471980000EE
-:103000000001203A0000E600333100000001F7041F
-:1030100075EC00000001203A0000E60033300000AB
-:103020000001F70475F000000001203A0000E600FE
-:10303000333000000001E0003394F306319CF005CA
-:103040007A889002FF38F0056F509002FF80F704F5
-:1030500032C4F3063228F30532D4F60432C8F684BB
-:103060007A2CF502000007380024F7057A98203200
-:103070000000E600308DF6057A90C02A5A00E6007E
-:1030800033D8C0326A00EE0033D900000001F68464
-:1030900032C0000000018736141000000001C7385C
-:1030A00060009736141087361418000000010738A6
-:1030B00000019736141887361418F70432B8000048
-:1030C0000001C7386000F70532B8F70432BC0000D1
-:1030D000000107380001F70532BCF70432BC20328A
-:1030E0000000E60030FD00000001F70432E0F505C5
-:1030F0007A7007380001E0003100F70532E0F5058D
-:103100007A70F5846F5800000001202E0021E20043
-:103110003144F6862C28F7042D38000000010638CB
-:103120000001F6052D387739000220320044E60010
-:103130003138B5BA6802F0052D38F3020022E000FC
-:103140003148F3056F58F0056F54F58432C0000024
-:103150000001902E0004872E000000000001203A9C
-:103160000002E6003274000000018702FF38032CE1
-:103170000EF49316FFC4F7057A689313FFFC959637
-:10318000FFB807880008E00043A09793FFFC8596EE
-:10319000FFB820220000E600323000000001862E39
-:1031A0000EF80000000120320010E20031CDF302E1
-:1031B000004C872E0F000000000107380001972EF9
-:1031C0000F00872E0F00E000323000000001931343
-:1031D000FFFCF3067A289313FFFC76B10002C6B415
-:1031E000600077350004C7386A008316FFC4C7380B
-:1031F0006000C7383000073800109713FFFC959621
-:10320000FFB89616FFB407880008E00126F89793E8
-:10321000FFFC8616FFB48596FFB806300001203209
-:103220000011E600322C00000001F6020000962E8C
-:103230000EF8F70432C0F306E030C03A3200E60080
-:10324000327400000001F704E0180000000177B8B4
-:10325000001E703EFFE1E6003275000000010F81A4
-:103260004000F70479C80000000107380001F705A5
-:1032700079C8F70479C8F70471C400000001203A46
-:103280000000E60032B1F6862C28F7042D38000045
-:10329000000106380001F6052D3877390002F302E7
-:1032A000000A20320044E60032B0B33A6802F0056A
-:1032B0002D38F70471D4F68471CC07380001C03A78
-:1032C0006A00E60032CCF70571D4F00571D4F684BB
-:1032D00071D4F70471D0F00571C4C0367200470C88
-:1032E0000001F68432D00000000120360000E60024
-:1032F0003391F70571C8F704719800000001203A76
-:103300000000E600333100000001F70475EC000016
-:103310000001203A0000E600333000000001F7040D
-:1033200075F000000001203A0000E600338900003B
-:103330000001F58476F800000001202E0021E20053
-:10334000337CF6862C28F7042D380000000106385F
-:103350000001F6052D387739000220320044E600DE
-:103360003368B5BA6802F0052D38F3020022F30580
-:1033700076F8F3047700E0003380F30576FCF0057F
-:1033800076FCE0003390F0057A78E0003394F306A1
-:10339000319CF3062EE0F30532D4F70471C8000027
-:1033A0000001203A0000E6003444F6862C28F70499
-:1033B0002D380000000106380001F6052D38773958
-:1033C0000002F302000920320044E6003444B33A1C
-:1033D0006802E0003444F0052D38F7047A900000CC
-:1033E0000001C03A6A00EE0033F9C5B40000C738E6
-:1033F0005A00E0003400F7057A90C5B80000F005E7
-:103400007A90F6847A88F7067A2876350003A73210
-:10341000700206B400019716FFEC84A6FFFCF706C5
-:103420007A2CF3047A989482FF3C9302FF409582B1
-:10343000FF44B5B27002F7047A98F6857A88C738E7
-:103440005800F7057A988796FFFC8296FFF80214D9
-:103450000000013C0000000000019293FFFC02907C
-:10346000000822100020F5847A7000000001202E50
-:103470000001E600376CF5857AA0F7020001F6043A
-:1034800032C8F7057A70F70432C4F68432C0F60504
-:103490007A2C9002FF809002FF38F5847A28073852
-:1034A00000249582FF3C9702FF409602FF44873636
-:1034B000141000000001C7386000973614108736DA
-:1034C00014180000000107380001973614188736D9
-:1034D0001418F0056F50F70432B89596FFF4C7380A
-:1034E0006000F70532B8F70432BCF4862FF80738CD
-:1034F0000001F70532BCF70432BCF48532D4F7067C
-:103500000C3EC07E7400E600351C00000001C07E49
-:103510007400E600350D00000001F7060C3EC77C84
-:103520007400203A0010E6003B7000000001F70430
-:1035300032E4FF820010F5846F5807380001202E16
-:103540000021E2003578F70532E4F7042D38F686DD
-:103550002C2806380001F6052D3877390002203274
-:103560000044E600356CB5BA6802F0052D38F482E7
-:103570000022E000357CF4856F58F0056F54F58427
-:1035800032C000000001902E0004872E00000000D1
-:103590000001203A0002E60036A800000001870280
-:1035A000FF3804AC0EF49496FFECF7057A68949318
-:1035B000FFFC9596FFDC07880008E00043A0979386
-:1035C000FFFC8596FFDC20220000E6003664000048
-:1035D0000001862E0EF80000000120320010E200EB
-:1035E0003601F482004C872E0F00000000010738DE
-:1035F0000001972E0F00872E0F00E00036640000B8
-:1036000000019493FFFCF4867A289493FFFC76B132
-:103610000002C6B4600077350004C7386A0084969B
-:10362000FFECC7386000C738480007380010971310
-:10363000FFFC9596FFDC9616FFD807880008E0018E
-:1036400026F89793FFFC8616FFD88596FFDC063098
-:10365000000120320011E600366000000001F60291
-:103660000000962E0EF8F70432C0F486E030C03A1F
-:103670004A00E60036A800000001F704E018000048
-:10368000000177B8001E703EFFE1E60036A9000099
-:1036900000010F814000F70479C8000000010738DD
-:1036A0000001F70579C8F70479C8F70471C4000070
-:1036B0000001203A0000E60036E5F6862C28F704E3
-:1036C0002D380000000106380001F6052D38773945
-:1036D0000002F482000A20320044E60036E4B4BA64
-:1036E0006802F0052D38F70471D4F68471CC0738E0
-:1036F0000001C03A6A00E6003700F70571D4F00512
-:1037000071D4F68471D4F70471D0F00571C4C03659
-:103710007200470C0001F68432D000000001203610
-:103720000000E6003AC1F70571C8F704719800007F
-:103730000001203A0000E6003A6100000001F704B1
-:1037400075EC00000001203A0000E6003A6000003D
-:103750000001F70475F000000001203A0000E600C7
-:103760003A6000000001E0003AC4F486319CF005A4
-:103770007A889002FF38F0056F509002FF80F704BE
-:1037800032C4F4863228F48532D4F60432C8F68482
-:103790007A2CF502000007380024F7057A982032C9
-:1037A0000000E60037BDF6057A90C02A5A00E60010
-:1037B0003B08C0326A00EE003B0900000001F684BD
-:1037C00032C0000000018736141000000001C73825
-:1037D000600097361410873614180000000107386F
-:1037E00000019736141887361418F70432B8000011
-:1037F0000001C7386000F70532B8F70432BC00009A
-:10380000000107380001F70532BCF70432BC203252
-:103810000000E600382D00000001F70432E0F50555
-:103820007A7007380001E0003830F70532E0F5051E
-:103830007A70F5846F5800000001202E0021E2000C
-:103840003874F6862C28F7042D380000000106385D
-:103850000001F6052D387739000220320044E600D9
-:103860003868B5BA6802F0052D38F4820022E0000D
-:103870003878F4856F58F0056F54F58432C0000035
-:103880000001902E0004872E000000000001203A65
-:103890000002E60039A4000000018702FF3804ACF2
-:1038A0000EF49496FFE4F7057A689493FFFC9596DE
-:1038B000FFDC07880008E00043A09793FFFC859693
-:1038C000FFDC20220000E600396000000001862EA7
-:1038D0000EF80000000120320010E20038FDF482F2
-:1038E000004C872E0F000000000107380001972EC2
-:1038F0000F00872E0F00E000396000000001949354
-:10390000FFFCF4867A289493FFFC76B10002C6B4DB
-:10391000600077350004C7386A008496FFE4C73832
-:103920006000C7384800073800109713FFFC9596D1
-:10393000FFDC9616FFD807880008E00126F8979369
-:10394000FFFC8616FFD88596FFDC0630000120328A
-:103950000011E600395C00000001F6020000962E1E
-:103960000EF8F70432C0F486E030C03A4A00E600B0
-:1039700039A400000001F704E0180000000177B846
-:10398000001E703EFFE1E60039A5000000010F8136
-:103990004000F70479C80000000107380001F7056E
-:1039A00079C8F70479C8F70471C400000001203A0F
-:1039B0000000E60039E1F6862C28F7042D380000D7
-:1039C000000106380001F6052D3877390002F4822F
-:1039D000000A20320044E60039E0B4BA6802F0057B
-:1039E0002D38F70471D4F68471CC07380001C03A41
-:1039F0006A00E60039FCF70571D4F00571D4F6844D
-:103A000071D4F70471D0F00571C4C0367200470C50
-:103A10000001F68432D00000000120360000E600EC
-:103A20003AC1F70571C8F704719800000001203A07
-:103A30000000E6003A6100000001F70475EC0000A8
-:103A40000001203A0000E6003A6000000001F7049F
-:103A500075F000000001203A0000E6003AB90000CD
-:103A60000001F58476F800000001202E0021E2001C
-:103A70003AACF6862C28F7042D38000000010638F1
-:103A80000001F6052D387739000220320044E600A7
-:103A90003A98B5BA6802F0052D38F4820022F48510
-:103AA00076F8F4847700E0003AB0F48576FCF0050F
-:103AB00076FCE0003AC0F0057A78E0003AC4F4867B
-:103AC000319CF4862EE0F48532D4F70471C80000EE
-:103AD0000001203A0000E6003B70F6862C28F7042F
-:103AE0002D380000000106380001F6052D38773921
-:103AF0000002F482000920320044E6003B70B4BAB0
-:103B00006802E0003B70F0052D38F7047A90000061
-:103B10000001C03A6A00EE003B29C5B40000C73876
-:103B20005A00E0003B30F7057A90C5B80000F00578
-:103B30007A90F7047A88F6867A2876390003A6B256
-:103B4000680207380001F7057A88F7047A98969694
-:103B5000FFF49682FF3CF4847A98F6867A2CC73874
-:103B600058009482FF409582FF44B5B26802F70581
-:103B70007A988796FFFC8296FFF802140000013CB9
-:103B80000000000000019293FFFC02900008221048
-:103B90000018F5047A88F7067A2CF5847A9076A9CD
-:103BA0000003A6B67002202E0000E6003BCD000008
-:103BB0000001F7047AA000000001C02A7200E600AC
-:103BC0003F18C02E6A00EE003F1900000001F68485
-:103BD00032C0F60432C88736141000000001C7381E
-:103BE000600097361410873614180000000107385B
-:103BF00000019736141887361418F70432B80000FD
-:103C00000001C7386000F70532B8F70432BC000085
-:103C1000000107380001F70532BCF70432BC202E42
-:103C20000000E6003C3DF6820000F70432E0F68535
-:103C30007A7007380001E0003C40F70532E0F505F6
-:103C40007A70F5846F5800000001202E0021E200F8
-:103C50003C84F6862C28F7042D3800000001063835
-:103C60000001F6052D387739000220320044E600C5
-:103C70003C78B5BA6802F0052D38F4820022E000E5
-:103C80003C88F4856F58F0056F54F58432C000000D
-:103C90000001902E0004872E000000000001203A51
-:103CA0000002E6003DB4000000018702FF3804ACCA
-:103CB0000EF49496FFECF7057A689493FFFC9596C2
-:103CC000FFE407880008E00043A09793FFFC859677
-:103CD000FFE420220000E6003D7000000001862E77
-:103CE0000EF80000000120320010E2003D0DF482C9
-:103CF000004C872E0F000000000107380001972EAE
-:103D00000F00872E0F00E0003D700000000194932B
-:103D1000FFFCF4867A289493FFFC76B10002C6B4C7
-:103D2000600077350004C7386A008496FFECC73816
-:103D30006000C7384800073800109713FFFC9596BD
-:103D4000FFE49616FFE007880008E00126F8979345
-:103D5000FFFC8616FFE08596FFE406300001203266
-:103D60000011E6003D6C00000001F6020000962EF6
-:103D70000EF8F70432C0F486E030C03A4A00E6009C
-:103D80003DB400000001F704E0180000000177B81E
-:103D9000001E703EFFE1E6003DB5000000010F810E
-:103DA0004000F70479C80000000107380001F7055A
-:103DB00079C8F70479C8F70471C400000001203AFB
-:103DC0000000E6003DF1F6862C28F7042D380000AF
-:103DD000000106380001F6052D3877390002F4821B
-:103DE000000A20320044E6003DF0B4BA6802F00553
-:103DF0002D38F70471D4F68471CC07380001C03A2D
-:103E00006A00E6003E0CF70571D4F00571D4F68423
-:103E100071D4F70471D0F00571C4C0367200470C3C
-:103E20000001F68432D00000000120360000E600D8
-:103E30003ED1F70571C8F704719800000001203ADF
-:103E40000000E6003E7100000001F70475EC000080
-:103E50000001203A0000E6003E7000000001F70477
-:103E600075F000000001203A0000E6003EC90000A5
-:103E70000001F58476F800000001202E0021E20008
-:103E80003EBCF6862C28F7042D38000000010638C9
-:103E90000001F6052D387739000220320044E60093
-:103EA0003EA8B5BA6802F0052D38F4820022F485E8
-:103EB00076F8F4847700E0003EC0F48576FCF005E7
-:103EC00076FCE0003ED0F0057A78E0003ED4F4863F
-:103ED000319CF4862EE0F48532D4F70471C80000DA
-:103EE0000001203A0000E6003F80F6862C28F70407
-:103EF0002D380000000106380001F6052D3877390D
-:103F00000002F482000920320044E6003F80B4BA87
-:103F10006802E0003F80F0052D38F7047A90000039
-:103F20000001C03A6A00EE003F39C5B40000C7384E
-:103F30005A00E0003F40F7057A90C5B80000F00550
-:103F40007A90F7047A88F6867A2876390003A6B242
-:103F5000680207380001F7057A88F7047A98969680
-:103F6000FFF49682FF3CF4847A98F6867A2CC73860
-:103F700058009482FF409582FF44B5B26802F7056D
-:103F80007A988796FFFC8296FFF802140000013CA5
-:103F90000000000000019293FFFC02900008221034
-:103FA0000010F5846F5800000001202E0021E2006F
-:103FB0003FE4F6862C28F7042D380000000106386F
-:103FC0000001F6052D387739000220320044E60062
-:103FD0003FD8B5BA6802F0052D38F5020022E0009E
-:103FE0003FE8F5056F58F0056F54F58432C00000C6
-:103FF0000001902E0004872E000000000001203AEE
-:104000000002E6004114000000018702FF38052C81
-:104010000EF49516FFF4F7057A689513FFFC959654
-:10402000FFEC07880008E00043A09793FFFC85960B
-:10403000FFEC20220000E60040D000000001862EA8
-:104040000EF80000000120320010E200406DF50281
-:10405000004C872E0F000000000107380001972E4A
-:104060000F00872E0F00E00040D0000000019513E4
-:10407000FFFCF5067A289513FFFC76B10002C6B462
-:10408000600077350004C7386A008516FFF4C7382A
-:104090006000C7385000073800109713FFFC959652
-:1040A000FFEC9616FFE807880008E00126F89793D2
-:1040B000FFFC8616FFE88596FFEC063000012032F3
-:1040C0000011E60040CC00000001F6020000962E30
-:1040D0000EF8F70432C0F506E030C03A5200E600B0
-:1040E000411400000001F704E0180000000177B857
-:1040F000001E703EFFE1E6004115000000010F8147
-:104100004000F70479C80000000107380001F705F6
-:1041100079C8F70479C8F70471C400000001203A97
-:104120000000E6004151F6862C28F7042D380000E7
-:10413000000106380001F6052D3877390002F50236
-:10414000000A20320044E6004150B53A6802F0050A
-:104150002D38F70471D4F68471CC07380001C03AC9
-:104160006A00E600416CF70571D4F00571D4F6845D
-:1041700071D4F70471D0F00571C4C0367200470CD9
-:104180000001F68432D00000000120360000E60075
-:104190004231F70571C8F704719800000001203A18
-:1041A0000000E60041D100000001F70475EC0000BA
-:1041B0000001203A0000E60041D000000001F704B1
-:1041C00075F000000001203A0000E60042290000DE
-:1041D0000001F58476F800000001202E0021E200A5
-:1041E000421CF6862C28F7042D3800000001063802
-:1041F0000001F6052D387739000220320044E60030
-:104200004208B5BA6802F0052D38F5020022F5051E
-:1042100076F8F5047700E0004220F50576FCF0051D
-:1042200076FCE0004230F0057A78E0004234F50692
-:10423000319CF5062EE0F50532D4F70471C8000074
-:104240000001203A0000E6004274F6862C28F704AC
-:104250002D380000000106380001F6052D387739A9
-:104260000002F502000920320044E6004274B53A2B
-:104270006802F0052D388796FFFC8296FFF802143D
-:104280000000013C0000000000019293FFFC02903E
-:104290000008F70632D49713FFFCF7062EE09713B9
-:1042A000FFFC07880008E00014F49793FFFCF70672
-:1042B00032D49713FFFCF7062F6C9713FFFC078887
-:1042C0000008E00014F49793FFFCF70632D497132C
-:1042D000FFFCF7062FF89713FFFC07880008E000A3
-:1042E00014F49793FFFCF70632D49713FFFCF706FC
-:1042F00030849713FFFC07880008E00014F49793BC
-:10430000FFFCF70632D49713FFFCF7063110971322
-:10431000FFFC07880008E00014F49793FFFCF70601
-:1043200032D49713FFFCF706319C9713FFFC0788E4
-:104330000008E00014F49793FFFCF70632D49713BB
-:10434000FFFCF70632289713FFFC07880008E000FF
-:1043500014F49793FFFC8796FFFC8296FFF80214F3
-:104360000000013C0000000000019293FFFC02905D
-:104370000008871600000000000186BA0000873A96
-:10438000000400000001C0367200440C0001879652
-:10439000FFFC8296FFF802140004013C00000000BC
-:1043A00000019293FFFC0290000885960000000037
-:1043B0000001862E000086AE000420320010E200CC
-:1043C00043D00000000120360010E20043ED073426
-:1043D0000001872E000C0000000107380001972E15
-:1043E000000C872E000CE0004414F4020000C03AD8
-:1043F0006200E6004411F402000020360010E600DE
-:1044000044140000000120320000E60044140000C3
-:104410000001F40200018796FFFC8296FFF8021467
-:104420000004013C0000000000019293FFFC029098
-:104430000008F7020001F7053524F7046F44000077
-:104440000001F7053528F70632F49713FFFCF7064D
-:1044500035309713FFFC07880008E0001548979354
-:10446000FFFCF70245049713FFFCF702000D9713BA
-:10447000FFFCF70632F49713FFFC07880008E00002
-:10448000161C9793FFFCF7024A049713FFFCF702F0
-:10449000000F9713FFFCF70633809713FFFC078884
-:1044A0000008E000161C9793FFFCF7024EEC9713F0
-:1044B000FFFCF70200089713FFFCF706340C971374
-:1044C000FFFC07880008E000161C9793FFFCF7022A
-:1044D00057649713FFFCF70200079713FFFCF706DA
-:1044E00034989713FFFC07880008E000161C979388
-:1044F000FFFC8796FFFC8296FFF802140000013C47
-:104500000000000000019293FFFC029000082210BE
-:104510000014F70475F800000001203A0000E600DE
-:10452000452DF68675F8E0004544F7020000F704D3
-:1045300076040000000177390002C7386800873A26
-:10454000001800000001203A0000E600455CF70575
-:104550003548F4863380E00049F0F4853530F704BF
-:104560006F5400000001203A0000E6004580F4820C
-:104570000008F4820001F4856F54E0004588F702DA
-:104580000001F4856F58F7020000203A0000E600B1
-:1045900045A0F4820004F486340CE00049F0F48570
-:1045A0003530F6843548F604352CF4B72800073446
-:1045B0000002F4820001F4BB28008732008CF482F0
-:1045C00000019736001887320090F4856F509736B7
-:1045D000000484B200840000000194B6001084B28C
-:1045E00000880000000194B6001484B6001000009A
-:1045F000000194B6000884B600140000000194B6CF
-:10460000000C84B2009800000001F4853554F48257
-:1046100000019482FF80F5043554F4863498F485C3
-:1046200035309502FF3885B2000006B4002495822B
-:10463000FF3C9682FF4087320004F6853550970292
-:10464000FF4486B20004F005354CF704354095165A
-:10465000FFF49596FFF4C7386800F7053540F584F8
-:10466000352886B20004872E141400000001C738D4
-:104670006800972E14148732008000000001203A51
-:104680000001EE0049F0F7060C3EC07E7400E60023
-:1046900046A400000001C07E7400E60046950000BC
-:1046A0000001F7060C3EC77C7400203A0010E600BB
-:1046B00049F000000001FF8200108682FF38F704F5
-:1046C0003558F5846F58F685355407380001202E8B
-:1046D0000021E2004708F7053558F7042D38F68623
-:1046E0002C2806380001F6052D38773900022032D3
-:1046F0000044E60046FCB5BA6802F0052D38F482A5
-:104700000022E000470CF4856F58F0056F54F684E2
-:10471000352C0000000187360094C4840000C03AA4
-:104720004A00E60047710000000186360094F684D6
-:1047300035540000000176B4FFF0F7043554969626
-:10474000FFF4473900009716FFF0C6B47000F70475
-:10475000354877B4000F703EFFE107380024E600CB
-:104760004769C638600006B40001C7046E00F7331D
-:104770002800F6843544000000018736000400005C
-:104780000001203A000FE20047BD073800018736DC
-:10479000000C00000001073800019736000C873636
-:1047A000000CE00047D000000001F7043528F68235
-:1047B000000107380008E0004968F7053544203A51
-:1047C0000010E60047CC00000001F7020000973619
-:1047D0000004F704353CF684352807380001F70556
-:1047E000353CF704353C8736141C000000010738BF
-:1047F00000019736141CF704760486B6141CF604E0
-:1048000075FC07380001F684760000000001C03A0C
-:104810006A00E600481CF7057604F0057604F68485
-:104820007604F7047608F00575FCC0367200470C74
-:10483000000120320000E6004881F70575F8F70412
-:104840007648F4867218C03A4A00470C0001203AB4
-:104850000000E6004881F6862C28F7042D38000079
-:10486000000106380001F6052D3877390002F48280
-:10487000000E20320044E6004880B4BA6802F00519
-:104880002D38F5020000202A0002EE004968F68269
-:104890000000F68435280000000187360000000083
-:1048A0000001203A0002E600493C05B40008959357
-:1048B000FFFC9516FFEC9596FFE89696FFE40788B7
-:1048C0000008E0005EDC9793FFFC8516FFEC859600
-:1048D000FFE88696FFE420220000E600492CF7025C
-:1048E00000008636000C000000012032000FE200BC
-:1048F000491100000001873600140000000107384C
-:1049000000019736001487360014E000492CF702A6
-:10491000000076B10002C6B4600077350005C738E4
-:104920006A00C738600007380010C72C7000203AB2
-:104930000000E60047A8F705352CF6843528F70473
-:104940006F4C00000001C0367200E600495C07347D
-:104950001494F4846F44E0004960F4853528F70529
-:104960003528E00048840528000120360000E600D4
-:1049700049A1F6862C28F7042D38000000010638DE
-:104980000001F6052D3877390002F482000D20323F
-:104990000044E60049A8B4BA6802E00049A8F0055E
-:1049A0002D38F4820001F4853524F6843528F70487
-:1049B0006F44F48632F4C0367200E60049F0F485A4
-:1049C0003530F704E0180000000177B8001F703E92
-:1049D000FFE1E60049F1000000010F814000F7040B
-:1049E00079C80000000107380001F70579C8F7040D
-:1049F00079C88796FFFC8296FFF802140000013CFC
-:104A00000000000000019293FFFC029000082210B9
-:104A10000014F70475F800000001203A0000E600D9
-:104A20004A2DF68675F8E0004A40F6820000F70449
-:104A300076040000000177390002C738680086BAA2
-:104A40000018F7046F5400000001203A0000E6004F
-:104A50004A64F6853548F4820001F4856F54E0001D
-:104A60004A70F7020001F4820008F4856F58F702DB
-:104A70000000203A0000E6004A88F4820004F48630
-:104A8000340CE0004ED8F4853530F6843548F60411
-:104A9000352CF4B7280007340002F4820001F4BB7F
-:104AA00028008732008CF482000197360018873284
-:104AB0000090F4856F509736000484B200840000A3
-:104AC000000194B6001084B200880000000194B682
-:104AD000001484B600100000000194B6000884B6EB
-:104AE00000140000000194B6000C84B2009800008D
-:104AF0000001F4853554F48200019482FF80F504AE
-:104B00003554F4863498F48535309502FF3885B2F3
-:104B1000000006B400249582FF3C9682FF40873255
-:104B20000004F68535509702FF4486B20004F00574
-:104B3000354CF70435409516FFF49596FFF4C738C9
-:104B40006800F7053540F584352886B20004872EC5
-:104B5000141400000001C7386800972E141487321F
-:104B6000008000000001203A0001EE004ED8F70658
-:104B70000C3EC07E7400E6004B8C00000001C07E3D
-:104B80007400E6004B7D00000001F7060C3EC77C78
-:104B90007400203A0010E6004ED800000001FF82A9
-:104BA00000108682FF38F7043558F5846F58F68573
-:104BB000355407380001202E0021E2004BF0F705A4
-:104BC0003558F7042D38F6862C2806380001F605EE
-:104BD0002D387739000220320044E6004BE4B5BAA4
-:104BE0006802F0052D38F4820022E0004BF4F485D1
-:104BF0006F58F0056F54F684352C0000000187369D
-:104C00000094C4840000C03A4A00E6004C590000F9
-:104C1000000186360094F68435540000000176B415
-:104C2000FFF0F70435549696FFF4473900009716C5
-:104C3000FFF0C6B47000F704354877B4000F703E3B
-:104C4000FFE107380024E6004C51C638600006B486
-:104C50000001C7046E00F7332800F68435440000D5
-:104C600000018736000400000001203A000FE20036
-:104C70004CA5073800018736000C000000010738FA
-:104C800000019736000C8736000CE0004CB800009D
-:104C90000001F7043528F682000107380008E0001B
-:104CA0004E50F7053544203A0010E6004CB40000A1
-:104CB0000001F702000097360004F704353CF68443
-:104CC000352807380001F705353CF704353C8736B1
-:104CD000141C00000001073800019736141CF7046B
-:104CE000760486B6141CF60475FC07380001F684B9
-:104CF000760000000001C03A6A00E6004D04F705A6
-:104D00007604F0057604F6847604F7047608F00558
-:104D100075FCC0367200470C000120320000E6002E
-:104D20004D69F70575F8F7047648F4867218C03AAD
-:104D30004A00470C0001203A0000E6004D69F68663
-:104D40002C28F7042D380000000106380001F60574
-:104D50002D3877390002F482000E20320044E6003C
-:104D60004D68B4BA6802F0052D38F5020000202A1B
-:104D70000002EE004E50F6820000F6843528000056
-:104D800000018736000000000001203A0002E60022
-:104D90004E2405B400089593FFFC9516FFEC9596FC
-:104DA000FFE89696FFE407880008E0005EDC979332
-:104DB000FFFC8516FFEC8596FFE88696FFE420222F
-:104DC0000000E6004E14F70200008636000C0000DA
-:104DD00000012032000FE2004DF90000000187368B
-:104DE00000140000000107380001973600148736D0
-:104DF0000014E0004E14F702000076B10002C6B4C1
-:104E0000600077350005C7386A00C738600007388A
-:104E10000010C72C7000203A0000E6004C90F70507
-:104E2000352CF6843528F7046F4C00000001C0369D
-:104E30007200E6004E4407341494F4846F44E0009A
-:104E40004E48F4853528F7053528E0004D6C0528D7
-:104E5000000120360000E6004E89F6862C28F70473
-:104E60002D380000000106380001F6052D3877398D
-:104E70000002F482000D20320044E6004E90B4BAE5
-:104E80006802E0004E90F0052D38F4820001F485B0
-:104E90003524F6843528F7046F44F48632F4C0369E
-:104EA0007200E6004ED8F4853530F704E0180000B3
-:104EB000000177B8001F703EFFE1E6004ED9000008
-:104EC00000010F814000F70479C800000001073895
-:104ED0000001F70579C8F70479C88796FFFC829628
-:104EE000FFF802140000013C000000000001929352
-:104EF000FFFC0290000822100014F6843548F604E6
-:104F0000352CF4820004F4B7280007340002F48240
-:104F10000001F4BB28008732008CF4820001973630
-:104F2000001887320090F4856F509736000484B2E1
-:104F300000840000000194B6001084B200880000D4
-:104F4000000194B6001484B600100000000194B66D
-:104F5000000884B600140000000194B6000C84B26E
-:104F6000009800000001F4853554F4820001948219
-:104F7000FF80F5043554F4863498F4853530950275
-:104F8000FF3885B2000006B400249582FF3C96826B
-:104F9000FF4087320004F68535509702FF4486B201
-:104FA0000004F005354CF70435409516FFF495964E
-:104FB000FFF4C7386800F7053540F584352886B218
-:104FC0000004872E141400000001C7386800972ED3
-:104FD00014148732008000000001203A0001EE0026
-:104FE000534CF7060C3EC07E7400E60050000000F3
-:104FF0000001C07E7400E6004FF100000001F706DA
-:105000000C3EC77C7400203A0010E600534C0000B0
-:105010000001FF8200108682FF38F7043558F584BE
-:105020006F58F685355407380001202E0021E20024
-:105030005064F7053558F7042D38F6862C280638C5
-:105040000001F6052D387739000220320044E600D1
-:105050005058B5BA6802F0052D38F4820022E000FD
-:105060005068F4856F58F0056F54F684352C0000B5
-:10507000000187360094C4840000C03A4A00E6006C
-:1050800050CD0000000186360094F68435540000AF
-:10509000000176B4FFF0F70435549696FFF44739D3
-:1050A00000009716FFF0C6B47000F704354877B4D7
-:1050B000000F703EFFE107380024E60050C5C638F7
-:1050C000600006B40001C7046E00F7332800F684C0
-:1050D0003544000000018736000400000001203A3A
-:1050E000000FE2005119073800018736000C00005C
-:1050F0000001073800019736000C8736000CE000ED
-:10510000512C00000001F7043528F6820001073811
-:105110000008E00052C4F7053544203A0010E600CC
-:10512000512800000001F702000097360004F70440
-:10513000353CF684352807380001F705353CF7047F
-:10514000353C8736141C00000001073800019736F3
-:10515000141CF704760486B6141CF60475FC073894
-:105160000001F684760000000001C03A6A00E60003
-:105170005178F7057604F0057604F6847604F70492
-:105180007608F00575FCC0367200470C000120322D
-:105190000000E60051DDF70575F8F7047648F4865F
-:1051A0007218C03A4A00470C0001203A0000E6009D
-:1051B00051DDF6862C28F7042D3800000001063852
-:1051C0000001F6052D3877390002F482000E2032F6
-:1051D0000044E60051DCB4BA6802F0052D38F5024F
-:1051E0000000202A0002EE0052C4F6820000F6847D
-:1051F0003528000000018736000000000001203A39
-:105200000002E600529805B400089593FFFC95163D
-:10521000FFEC9596FFE89696FFE407880008E0000B
-:105220005EDC9793FFFC8516FFEC8596FFE886967B
-:10523000FFE420220000E6005288F70200008636D4
-:10524000000C000000012032000FE200526D00004F
-:10525000000187360014000000010738000197366E
-:10526000001487360014E0005288F702000076B17F
-:105270000002C6B4600077350005C7386A00C73839
-:10528000600007380010C72C7000203A0000E600CC
-:105290005104F705352CF6843528F7046F4C0000CF
-:1052A0000001C0367200E60052B807341494F4844A
-:1052B0006F44E00052BCF4853528F7053528E0003E
-:1052C00051E00528000120360000E60052FDF68678
-:1052D0002C28F7042D380000000106380001F605DF
-:1052E0002D3877390002F482000D20320044E600A8
-:1052F0005304B4BA6802E0005304F0052D38F48278
-:105300000001F4853524F6843528F7046F44F486CB
-:1053100032F4C0367200E600534CF4853530F704A1
-:10532000E0180000000177B8001F703EFFE1E600C2
-:10533000534D000000010F814000F70479C80000C0
-:10534000000107380001F70579C8F70479C8879686
-:10535000FFFC8296FFF802140000013C00000000F0
-:1053600000019293FFFC0290000822100014F484C4
-:105370003554F684354CF584352C9482FF3876B557
-:105380000003A52E6802000000019502FF3CF38493
-:105390003550C6AC68009382FF4087360004000099
-:1053A00000019702FF4486360004F70435400000F0
-:1053B0000001C7386000F7053540F604352886B689
-:1053C0000004873214149496FFF4C73868009732AB
-:1053D0001414872E008000000001203A0001EE0026
-:1053E00057509516FFF4F7060C3EC07E7400E60099
-:1053F000540400000001C07E7400E60053F5000074
-:105400000001F7060C3EC77C7400203A0010E6004D
-:10541000575000000001FF8200108682FF38F70419
-:105420003558F5846F58F685355407380001202E1D
-:105430000021E2005468F7053558F7042D38F68648
-:105440002C2806380001F6052D3877390002203265
-:105450000044E600545CB5BA6802F0052D38F382CA
-:105460000022E000546CF3856F58F0056F54F68409
-:10547000352C0000000187360094C3840000C03A38
-:105480003A00E60054D10000000186360094F6840C
-:1054900035540000000176B4FFF0F70435549696B9
-:1054A000FFF4473900009716FFF0C6B47000F70408
-:1054B000354877B4000F703EFFE107380024E6005E
-:1054C00054C9C638600006B40001C7046E00F73343
-:1054D0002800F684354400000001873600040000EF
-:1054E0000001203A000FE200551D07380001873601
-:1054F000000C00000001073800019736000C8736C9
-:10550000000CE000553000000001F7043528F68259
-:10551000000107380008E00056C8F7053544203A76
-:105520000010E600552C00000001F702000097363D
-:105530000004F704353CF684352807380001F705E8
-:10554000353CF704353C8736141C00000001073851
-:1055500000019736141CF704760486B6141CF60472
-:1055600075FC07380001F684760000000001C03A9F
-:105570006A00E600557CF7057604F0057604F684AB
-:105580007604F7047608F00575FCC0367200470C07
-:10559000000120320000E60055E1F70575F8F70438
-:1055A0007648F3867218C03A3A00470C0001203A58
-:1055B0000000E60055E1F6862C28F7042D3800009F
-:1055C000000106380001F6052D3877390002F38214
-:1055D000000E20320044E60055E0B3BA6802F00540
-:1055E0002D38F5020000202A0002EE0056C8F6828F
-:1055F0000000F68435280000000187360000000016
-:105600000001203A0002E600569C05B4000895937C
-:10561000FFFC9516FFEC9596FFE89696FFE4078849
-:105620000008E0005EDC9793FFFC8516FFEC859692
-:10563000FFE88696FFE420220000E600568CF70281
-:1056400000008636000C000000012032000FE2004E
-:105650005671000000018736001400000001073871
-:1056600000019736001487360014E000568CF702CC
-:10567000000076B10002C6B4600077350005C73877
-:105680006A00C738600007380010C72C7000203A45
-:105690000000E6005508F705352CF6843528F70498
-:1056A0006F4C00000001C0367200E60056BC0734A3
-:1056B0001494F3846F44E00056C0F3853528F70551
-:1056C0003528E00055E40528000120360000E600FA
-:1056D0005701F6862C28F7042D3800000001063803
-:1056E0000001F6052D3877390002F382000D2032D3
-:1056F0000044E6005708B3BA6802E0005708F00516
-:105700002D38F3820001F3853524F6843528F7041B
-:105710006F44F38632F4C0367200E6005750F385CA
-:105720003530F704E0180000000177B8001F703E24
-:10573000FFE1E6005751000000010F814000F7042F
-:1057400079C80000000107380001F70579C8F7049F
-:1057500079C88796FFFC8296FFF802140000013C8E
-:105760000000000000019293FFFC0290000822104C
-:1057700000148702FF38F384352CF7053554871E53
-:105780000080F504354C27380001C02A7200E6007D
-:105790005A4C00000001F5846F5800000001202ED3
-:1057A0000021E20057D8F6862C28F7042D38000097
-:1057B000000106380001F6052D3877390002203245
-:1057C0000044E60057CCB5BA6802F0052D38F30264
-:1057D0000022E00057DCF3056F58F0056F54F684A3
-:1057E000352C0000000187360094C3040000C03A45
-:1057F0003200E60058410000000186360094F6842D
-:1058000035540000000176B4FFF0F7043554969645
-:10581000FFF4473900009716FFF0C6B47000F70494
-:10582000354877B4000F703EFFE107380024E600EA
-:105830005839C638600006B40001C7046E00F7335B
-:105840002800F6843544000000018736000400007B
-:105850000001203A000FE200588D0738000187361A
-:10586000000C00000001073800019736000C873655
-:10587000000CE00058A000000001F7043528F68273
-:10588000000107380008E0005A38F7053544203A8F
-:105890000010E600589C00000001F7020000973657
-:1058A0000004F704353CF684352807380001F70575
-:1058B000353CF704353C8736141C000000010738DE
-:1058C00000019736141CF704760486B6141CF604FF
-:1058D00075FC07380001F684760000000001C03A2C
-:1058E0006A00E60058ECF7057604F0057604F684C5
-:1058F0007604F7047608F00575FCC0367200470C94
-:10590000000120320000E6005951F70575F8F70450
-:105910007648F3067218C03A3200470C0001203A6C
-:105920000000E6005951F6862C28F7042D380000B7
-:10593000000106380001F6052D3877390002F30220
-:10594000000E20320044E6005950B33A6802F005D8
-:105950002D38F5020000202A0002EE005A38F682A7
-:105960000000F684352800000001873600000000A2
-:105970000001203A0002E6005A0C05B40008959395
-:10598000FFFC9516FFEC9596FFE89696FFE40788D6
-:105990000008E0005EDC9793FFFC8516FFEC85961F
-:1059A000FFE88696FFE420220000E60059FCF7029B
-:1059B00000008636000C000000012032000FE200DB
-:1059C00059E100000001873600140000000107388B
-:1059D00000019736001487360014E00059FCF702E6
-:1059E000000076B10002C6B4600077350005C73804
-:1059F0006A00C738600007380010C72C7000203AD2
-:105A00000000E6005878F705352CF6843528F704B1
-:105A10006F4C00000001C0367200E6005A2C0734BB
-:105A20001494F3046F44E0005A30F3053528F70569
-:105A30003528E00059540528000120360000E60012
-:105A40005DC4F3020001E0005DF000000001772971
-:105A50000003C71C7000873A00040528000176A9DE
-:105A60000003F4843554F60435509482FF38A41EA4
-:105A70006802C63070009402FF3C9602FF40C69C4C
-:105A8000680087360004000000019702FF4485B6D5
-:105A90000004F704354000000001C7385800F7053E
-:105AA000354085B60004F505354CF6843528F605F5
-:105AB0003550873614149496FFF4C738580097363B
-:105AC0001414871E008000000001203A0001EE003F
-:105AD0005E3C9416FFF4F7060C3EC07E7400E600B0
-:105AE0005AF400000001C07E7400E6005AE5000090
-:105AF0000001F7060C3EC77C7400203A0010E60057
-:105B00005E3C00000001FF8200108682FF38F7042F
-:105B10003558F5846F58F685355407380001202E26
-:105B20000021E2005B58F7053558F7042D38F6865A
-:105B30002C2806380001F6052D387739000220326E
-:105B40000044E6005B4CB5BA6802F0052D38F3025C
-:105B50000022E0005B5CF3056F58F0056F54F6849B
-:105B6000352C0000000187360094C3040000C03AC1
-:105B70003200E6005BC10000000186360094F68426
-:105B800035540000000176B4FFF0F70435549696C2
-:105B9000FFF4473900009716FFF0C6B47000F70411
-:105BA000354877B4000F703EFFE107380024E60067
-:105BB0005BB9C638600006B40001C7046E00F73355
-:105BC0002800F684354400000001873600040000F8
-:105BD0000001203A000FE2005C0D07380001873613
-:105BE000000C00000001073800019736000C8736D2
-:105BF000000CE0005C2000000001F7043528F6826C
-:105C0000000107380008E0005DB8F7053544203A88
-:105C10000010E6005C1C00000001F702000097364F
-:105C20000004F704353CF684352807380001F705F1
-:105C3000353CF704353C8736141C0000000107385A
-:105C400000019736141CF704760486B6141CF6047B
-:105C500075FC07380001F684760000000001C03AA8
-:105C60006A00E6005C6CF7057604F0057604F684BD
-:105C70007604F7047608F00575FCC0367200470C10
-:105C8000000120320000E6005CD1F70575F8F7044A
-:105C90007648F3067218C03A3200470C0001203AE9
-:105CA0000000E6005CD1F6862C28F7042D380000B1
-:105CB000000106380001F6052D3877390002F3029D
-:105CC000000E20320044E6005CD0B33A6802F005D2
-:105CD0002D38F5020000202A0002EE005DB8F682A1
-:105CE0000000F6843528000000018736000000001F
-:105CF0000001203A0002E6005D8C05B4000895938F
-:105D0000FFFC9516FFEC9596FFE89696FFE4078852
-:105D10000008E0005EDC9793FFFC8516FFEC85969B
-:105D2000FFE88696FFE420220000E6005D7CF70293
-:105D300000008636000C000000012032000FE20057
-:105D40005D61000000018736001400000001073883
-:105D500000019736001487360014E0005D7CF702DE
-:105D6000000076B10002C6B4600077350005C73880
-:105D70006A00C738600007380010C72C7000203A4E
-:105D80000000E6005BF8F705352CF6843528F704AB
-:105D90006F4C00000001C0367200E6005DAC0734B5
-:105DA0001494F3046F44E0005DB0F3053528F70563
-:105DB0003528E0005CD40528000120360000E6000C
-:105DC0005DF1F3020001F7042D38F6862C28063821
-:105DD0000001F6052D3877390002F302000D20325C
-:105DE0000044E6005DF4B33A6802E0005DF4F005BB
-:105DF0002D38F3053524F6843528F7046F44F3066F
-:105E000032F4C0367200E6005E3CF3053530F7042C
-:105E1000E0180000000177B8001F703EFFE1E600C7
-:105E20005E3D000000010F814000F70479C80000CA
-:105E3000000107380001F70579C8F70479C887968B
-:105E4000FFFC8296FFF802140000013C00000000F5
-:105E500000019293FFFC02900008F706353097137B
-:105E6000FFFCF70632F49713FFFC07880008E000F8
-:105E700014F49793FFFCF70635309713FFFCF706F1
-:105E800033809713FFFC07880008E00014F4979311
-:105E9000FFFCF70635309713FFFCF706340C971319
-:105EA000FFFC07880008E00014F49793FFFCF70656
-:105EB00035309713FFFCF70634989713FFFC0788DB
-:105EC0000008E00014F49793FFFC8796FFFC82968D
-:105ED000FFF802140000013C000000000001929352
-:105EE000FFFC0290000886160000000000018732C7
-:105EF000000400000001203A000F86B20000C538FF
-:105F00000000EE005F2CC5B400002036000FEE004C
-:105F10005F2C00000001203A0000EC005F2D000023
-:105F2000000120360000EC005F48000000018732CD
-:105F3000000C00000001073800019732000C873286
-:105F4000000CE0005F50F4020000C02A5A00440C2C
-:105F500000018796FFFC8296FFF802140004013CC2
-:105F6000000000000001000000009293FFFC02907E
-:105F70000008F68635609693FFFCF68642309693CD
-:105F8000FFFC07880008E00015489793FFFCF682A5
-:105F900066F89693FFFCF78200179793FFFCF6864E
-:105FA00035609693FFFC07880008E000161C979365
-:105FB000FFFCF68269809693FFFCF78200189793A6
-:105FC000FFFCF68635609693FFFC07880008E0002A
-:105FD000161C9793FFFCF6826B509693FFFCF7829A
-:105FE00000169793FFFCF68635609693FFFC0788B2
-:105FF0000008E000161C9793FFFCF68261789693E8
-:10600000FFFCF782001F9793FFFCF686356096939E
-:10601000FFFC07880008E000161C9793FFFCF6823F
-:10602000627C9693FFFCF78200209793FFFCF68634
-:1060300035609693FFFC07880008E000161C9793D4
-:10604000FFFCF68266F89693FFFCF78200179793A1
-:10605000FFFCF68635EC9693FFFC07880008E0000D
-:10606000161C9793FFFCF68269809693FFFCF782DB
-:1060700000189793FFFCF68635EC9693FFFC078893
-:106080000008E000161C9793FFFCF6826B50969375
-:10609000FFFCF78200169793FFFCF68635EC96938B
-:1060A000FFFC07880008E000161C9793FFFCF682AF
-:1060B00061789693FFFCF782001F9793FFFCF686AA
-:1060C00035EC9693FFFC07880008E000161C9793B8
-:1060D000FFFCF682627C9693FFFCF7820020979388
-:1060E000FFFCF68635EC9693FFFC07880008E0007D
-:1060F000161C9793FFFCF704E02800000001203AEB
-:106100000000E600611500000001F704E028E0004F
-:10611000611877390002F70200F0F7054228F70608
-:10612000408AF03B2800F706408CF03B2800F7023D
-:106130000000F7057AC0F7057AB8F7057AB0F705D9
-:106140007AC8F682C3509693FFFCF68200169693A7
-:10615000FFFCF68642309693FFFC07880008E001BA
-:106160001EC09793FFFC8796FFFC8296FFF80214EF
-:106170000000013C0000000000019293FFFC02902F
-:106180000008F6046F340000000120320000E60031
-:1061900061ED76B1001E8732000076B4FFE5C738A6
-:1061A0006FC07739FFF0203A0007E60061EC06B0D7
-:1061B00000028736000076B5001E76B4FFE5C738CA
-:1061C0006FC07739FFF0203A0001E60061ECF50678
-:1061D00035ECF704423000000001C03A5200470C91
-:1061E0000001203A0000E6006211F5820000F70489
-:1061F00042A0F60642A276B1001E76B4FFE5C7388B
-:106200006FC07739FFF007380001E0006268F733AC
-:1062100028008732000400000001F705E00086B284
-:106220000008203A0000E600623CF685E0042036D3
-:106230000000E6006240202E0000F5820001202EC2
-:106240000000E6006265F60642A2F70442A076B1BD
-:10625000001E76B4FFE5C7386FC07739FFF0073806
-:106260000001F7332800F00542288796FFFC82964C
-:10627000FFF802140000013C0000000000019293AE
-:10628000FFFC02900008F704423CF6846F340738A4
-:10629000000120360000E60062B1F705423C873677
-:1062A0000000F59E0002C03A5A00E60062BDF58685
-:1062B00035ECF70442A0E00062DCF60642A2F704E7
-:1062C000423000000001C03A5A00470C0001203A59
-:1062D0000000E60062F9F60642A4F70442A476B193
-:1062E000001E76B4FFE5C7386FC07739FFF0073876
-:1062F0000001E000630CF73328009693FFFC078849
-:106300000008E00063209793FFFCF0054228879681
-:10631000FFFC8296FFF802140000013C0000000020
-:1063200000019293FFFC02900008221000208316C7
-:10633000000000000001871A001800000001203A48
-:106340000000E600636CF7020000839A001C000066
-:106350000001F3857AC0849A0014F7057AC8F485A1
-:106360007AB0F7057AB88316000000000001869A1B
-:106370000014F7047AB000000001C0367200E60095
-:1063800063D0F6020000869A001CF7047AC0000071
-:106390000001C0367200E60063D000000001869A5A
-:1063A0000018F7047AB800000001C0367200E60059
-:1063B00063D000000001869A0020F7047AC800002C
-:1063C0000001C7386800203A0064EE0063D920322B
-:1063D0000000F602000120320000E60064580000D0
-:1063E00000018396000000000001871E00180000D5
-:1063F0000001203A0000E600643CF7020000F705C7
-:106400004080F7054084F6846E50F482FFFF831EBF
-:10641000000CF4854F5493360010839E0010849630
-:10642000000093B6001484A600080000000194B692
-:106430001DDCF6820064F6854A98F7054A9C8316AF
-:10644000000000000001871A002000000001203A2F
-:106450000000EE00647CF3820000F70442A4F6061C
-:1064600042A676B1001E76B4FFE5C7386FC0773913
-:10647000FFF007380001E00066E4F7332800939648
-:10648000FFF484160000F48642C89496FFECF302F1
-:10649000000C9316FFE4839600008496FFF4871E99
-:1064A000002000000001C0267200EC006648F38660
-:1064B0004A9884A200248316FFE4C5040000B49A1D
-:1064C0003802C7183800832200288396FFF4849688
-:1064D000FFE4933A000493BA0008F604E000F306E0
-:1064E0004A98A6A63002F5820000C0326A00E60093
-:1064F0006510C6380000F684E0048732000400000E
-:106500000001C0367200E6006514202E0000F582FE
-:106510000001202E0000E600652100000001F502C8
-:106520000000F684E0008732000000000001C03661
-:106530007200E200655CF5820000C0367200E60081
-:106540006564202E0000F684E00487320004000019
-:106550000001C0367200E2006565202E0000F58261
-:106560000001202E0000E6006575202A0000F502DB
-:106570000001202A0000E6006588000000018396E3
-:10658000FFF400000001F3854F548722002C76A110
-:10659000001E76B4FFE505A0002E762D001E763095
-:1065A000FFE5F48200009496FFDC8316FFEC2026C2
-:1065B0000007C7386FC07738FFF0F71B2800872E19
-:1065C000000006980002C73867C07738FFF0E20085
-:1065D000661CF73728008516FFEC8596FFDC000067
-:1065E0000001C72C400086BA0030062800040528A8
-:1065F000000205AC00028396FFDC7739001E773875
-:10660000FFE5039C00019396FFDC201E0007C6B443
-:1066100077C076B4FFF0E20065E1F6B3280004200D
-:10662000001C8496FFEC8316FFE48396FFF404A419
-:1066300000149496FFEC0318000C9316FFE4039CDF
-:106640000001E00064949396FFF48496000000003B
-:1066500000018726002000000001F7054A9C85A65E
-:106660000020F7047AB80000000107380001F705A0
-:106670007AB8F7047AB8F6847AC886260018C6B4C1
-:1066800058008726001C0000000127380001C03296
-:106690007200470C0001203A0000E60066E5F6852E
-:1066A0007AC883260008F7046E50F3053B6483A67E
-:1066B0000008F682000093BA1DDC84A6000C831645
-:1066C000000094BA0010831A0010F6857AC8933A35
-:1066D0000014F7020001F7054084F6857AC0F685BC
-:1066E0007AB8F6857AB08796FFFC8296FFF8021496
-:1066F0000004013C0000000000019293FFFC0290A6
-:10670000000822100008F3846F3400000001871E87
-:106710000018F684E01C00000001C0367200EC0096
-:106720006729F7020001F7020000203A0000E600A6
-:1067300067E8F5820001F704E01C869E001800005F
-:106740000001C03A6A00470C0001203A0000E60050
-:1067500067E9C5840000869E0010F704E000F60299
-:106760000000C0367200E6006788051C0010869E97
-:106770000014F704E00400000001C0367200E600D7
-:10678000678C20320000F602000120320000E60093
-:10679000679900000001F582000086AA0000F70456
-:1067A000E00000000001C0367200E20067D4F6028B
-:1067B0000000C0367200E60067DC2032000086AAC6
-:1067C0000004F704E00400000001C0367200E2009B
-:1067D00067DD20320000F602000120320000E600F2
-:1067E00067ED202E0000F5820001202E0000E6005B
-:1067F0006810F606429CF704429C76B1001E76B4FF
-:10680000FFE5C7386FC07739FFF007380001F7336D
-:106810002800F70475F475ACFFE1203A0000E600AB
-:1068200068459596FFF4F7044298F606429876B1CB
-:10683000001E76B4FFE5C7386FC07739FFF0073820
-:106840000001F7332800871E0020041C002076A1D9
-:10685000001E76B4FFE5C7386FC07739FFF0203AE5
-:106860000008EE0068C4F3061554F5020000059C0C
-:106870000022C4AC0000F60200018722000076A1CD
-:10688000001E76B4FFE5C7386FC07739FFF0C02A25
-:106890007200EC0068C0C6A46000A726600276B54E
-:1068A000001E76B4FFE505280001C7386FC07739B0
-:1068B000FFE8F72F680005AC0001E00068780630BB
-:1068C0000002F30615549313FFFCF704E0240000C4
-:1068D00000019713FFFCF704E01C00000001971370
-:1068E000FFFCF306E0009313FFFC9393FFFCF3021D
-:1068F00000019313FFFC07880008E000EE64979303
-:10690000FFFC20220000E6006928F606429EF704FC
-:10691000429C76B1001E76B4FFE5C7386FC0773968
-:10692000FFF007380001F73328008316FFF400005A
-:106930000001201A0000E600696CF30635ECF7044C
-:10694000423000000001C03A3200470C0001203AFA
-:106950000000E600696DF0054228F3063560F30596
-:10696000423007880008E000789C9793FFFC8796E8
-:10697000FFFC8296FFF802140000013C00000000BA
-:1069800000019293FFFC0290000822100004F5041D
-:106990006F34F7044240862A001807380001F68455
-:1069A000E01CF7054240C0366200EC0069B5F70212
-:1069B0000001F7020000203A0000E6006A80F702BA
-:1069C0000001F704E01C86AA001800000001C03A8C
-:1069D0006A00470C0001203A0000E6006A7DC58489
-:1069E000000086AA0010F704E000F6020000C0369E
-:1069F0007200E6006A1404A8001086AA0014F704C6
-:106A0000E00400000001C0367200E6006A1820327F
-:106A10000000F602000120320000E6006A250000B6
-:106A20000001F582000086A60000F704E0000000E7
-:106A30000001C0367200E2006A60F6020000C03653
-:106A40007200E6006A682032000086A60004F7049F
-:106A5000E00400000001C0367200E2006A692032E2
-:106A60000000F602000120320000E6006A81C72C17
-:106A70000000F5820001E0006A80C72C0000C70416
-:106A80000000203A0000EE006B3DF686408AF704D5
-:106A9000408876B5001E76B4FFE5C7386FC07738FA
-:106AA000FFF0203A0000E6006B3CF6820000F6851D
-:106AB0004080F68540849693FFFC9693FFFCF70494
-:106AC000E01C000000019713FFFCF386E0009393A5
-:106AD000FFFC9513FFFCF38200029393FFFC969654
-:106AE000FFF407880008E000EE649793FFFCF405CC
-:106AF00040848696FFF4F7046E50F38635ECF685F5
-:106B00004090F6854094873A1DDCF6854228F705CB
-:106B10003B64F7044230F4054080C03A3A00470C29
-:106B20000001203A0000E6006B3DF3863560F385F6
-:106B3000423007880008E000789C9793FFFC879616
-:106B4000FFFC8296FFF802140000013C00000000E8
-:106B500000019293FFFC02900008F4864230949367
-:106B6000FFFC07880008E00120E49793FFFC202247
-:106B70000000E6006DD9F5820000F704408CF606AF
-:106B8000408C7631001EF68442287630FFE506B44C
-:106B90000001C73867C07738FFF0203A0000E600F0
-:106BA0006BC8F6854228F7044088F686408A76B599
-:106BB000001E76B4FFE5C7386FC07738FFF0203A83
-:106BC0000000E6006D0D00000001F704408CF68621
-:106BD000408C76B5001E76B4FFE5C7386FC07738B5
-:106BE000FFF0203A0000E6006C35F606408AF70414
-:106BF000408876B1001E76B4FFE5C7386FC077389D
-:106C0000FFF0203A0000E6006C34F4863678F70492
-:106C1000424400000001C03A4A00470C0001203AFB
-:106C20000000E6006C35F4820001F4B32800E000B7
-:106C30006D10F005422CF704408CF506408C76A9C7
-:106C4000001E76B4FFE5C7386FC07738FFF0203AF2
-:106C50000000E6006CC1F606408AF704408876B171
-:106C6000001E76B4FFE5C7386FC07738FFF0203AD2
-:106C70000000E6006CC100000001F704422C000097
-:106C8000000107380001203A0009EE006D11F705F8
-:106C9000422CF02B2800F0332800F5820001F70485
-:106CA0004294F606429476B1001E76B4FFE5C738EA
-:106CB0006FC07739FFF007380001E0006D10F7333F
-:106CC0002800F704408CF686408C76B5001E76B41A
-:106CD000FFE5C7386FC07738FFF0203A0000E600C4
-:106CE0006D14202E0000F7044088F606408A76B125
-:106CF000001E76B4FFE5C7386FC07738FFF0203A42
-:106D00000000E6006D15202E0000F0332800F5820B
-:106D10000001202E0000E6006DB5F48635ECF70486
-:106D2000423000000001C03A4A00470C0001203AFE
-:106D30000000E6006D5900000001F704E0280000A3
-:106D40000001203A0000E6006D79F682003CF684EE
-:106D5000E028E0006D7800000001F704E028000062
-:106D60000001203A0000E6006D79F68200F0F70499
-:106D7000E0280000000176B90002F7044228000074
-:106D80000001C03A6A00EC006DB5F6862C28F704C5
-:106D90002D38F005422806380001F6052D387739E0
-:106DA0000002F482001920320044E6006DB4B4BA47
-:106DB0006802F0052D38F482C3509493FFFCF482EE
-:106DC00000169493FFFCF48642309493FFFC0788EE
-:106DD0000008E0011EC09793FFFC8796FFFC829697
-:106DE000FFF802140000013C000000000001929333
-:106DF000FFFC0290000822100004F5863678959377
-:106E0000FFFCF58642449593FFFC07880008E000EC
-:106E100015489793FFFCF58274189593FFFCF58253
-:106E200000199593FFFCF58636789593FFFC07884B
-:106E30000008E000161C9793FFFCF58274AC959354
-:106E4000FFFCF782001D9793FFFCF58637049593AE
-:106E5000FFFC07880008E000161C9793FFFCF582F2
-:106E600078009593FFFCF782001B9793FFFCF58653
-:106E700037049593FFFC07880008E000161C9793E1
-:106E8000FFFCF58278FC9593FFFCF782001A97933C
-:106E9000FFFCF58637909593FFFC07880008E0001B
-:106EA000161C9793FFFCF58280D89593FFFCF78220
-:106EB000001B9793FFFCF58637909593FFFC07889E
-:106EC0000008E000161C9793FFFCF58281749593EF
-:106ED000FFFCF782001D9793FFFCF586381C959305
-:106EE000FFFC07880008E000161C9793FFFCF58262
-:106EF00087749593FFFCF782001B9793FFFCF58640
-:106F0000381C9593FFFC07880008E000161C979337
-:106F1000FFFCF58294F89593FFFCF782001B979392
-:106F2000FFFCF58639349593FFFC07880008E000E4
-:106F3000161C9793FFFCF5828A009593FFFCF7825D
-:106F4000001C9793FFFCF58639349593FFFC078866
-:106F50000008E000161C9793FFFCF5828E089593BD
-:106F6000FFFCF782001A9793FFFCF586393495935E
-:106F7000FFFC07880008E000161C9793FFFCF582D1
-:106F8000969C9593FFFCF782001E9793FFFCF58675
-:106F900038A89593FFFC07880008E000161C97931B
-:106FA000FFFCF5829B2C9593FFFCF782001B9793C7
-:106FB000FFFCF58638A89593FFFC07880008E000E1
-:106FC000161C9793FFFCF582A2DC9593FFFCF782D9
-:106FD000001E9793FFFCF5863AD89593FFFC07882F
-:106FE0000008E000161C9793FFFCF5829E549593D1
-:106FF000FFFCF782001B9793FFFCF5863AD8959328
-:10700000FFFC07880008E000161C9793FFFCF58240
-:10701000A3C09593FFFCF782001C9793FFFCF586B5
-:1070200039C09593FFFC07880008E000161C979371
-:10703000FFFCF582A7649593FFFCF782001E9793EF
-:10704000FFFCF58639C09593FFFC07880008E00037
-:10705000161C9793FFFCF582AA049593FFFCF78218
-:10706000001B9793FFFCF58639C09593FFFC0788BA
-:107070000008E000161C9793FFFCF582AEF895938C
-:10708000FFFCF782001C9793FFFCF5863A4C959322
-:10709000FFFC07880008E000161C9793FFFCF7062A
-:1070A0004250F03B2800F7064088F03B2800F602EB
-:1070B0000000F6054080F6054084F7063B70F63B7D
-:1070C0002800F7063B72F0BB2800F582CA20F58540
-:1070D0003B74F7063B78F03B2800F7063B7AF0BBA1
-:1070E0002800F582B194F5853B7CF7063B80F03BA8
-:1070F0002800F7063B82F0BB2800F582C754F585CF
-:107100003B84F7063B88F03B2800F7063B8AF0BB40
-:107110002800F582BEF8F5853B8CF7063B90F03BE6
-:107120002800F7063B92F0BB2800F582C8F8F585E9
-:107130003B94F7063B98F03B2800F7063B9AF0BBE0
-:107140002800F582C5D8F5853B9CF7063BA0F03BAF
-:107150002800F7063BA2F0BB2800F582C770F58532
-:107160003BA4F7063BA8F03B2800F7063BAAF0BB80
-:107170002800F582C1B4F5853BAC9616FFF407886C
-:107180000008E000D5409793FFFCF6846E50861609
-:10719000FFF40000000196361DDCF6053B6487967F
-:1071A000FFFC8296FFF802140000013C0000000082
-:1071B00000019293FFFC02900008221000302594F9
-:1071C0000020F02F280026140038F03328009013F8
-:1071D000FFFCF7044250F686425076B5001E76B4A6
-:1071E000FFE5C7386FC07739FFF09713FFFC9613A0
-:1071F000FFFC9593FFFC07880008E000F5F49793E7
-:10720000FFFC20220000E600721DF5021770F70453
-:1072100042540000000127380001F705425495133D
-:10722000FFFCF502001B9513FFFCF5064244951385
-:10723000FFFC07880008E0011EC09793FFFC8796BB
-:10724000FFFC8296FFF802140000013C00000000E1
-:1072500000019293FFFC02900008F704E0048616F8
-:107260000000F68200FF7739FFF0C7386C00F73373
-:107270002800F706E006873A000006B00002F7375C
-:107280002800F6843B6407300004F6BB2800870220
-:10729000FF3406300006F73328008796FFFC8296FD
-:1072A000FFF802140004013C00000000000192936A
-:1072B000FFFC029000082210003026140020F0335A
-:1072C000280027140038F03B28009713FFFC909308
-:1072D000FFFCF7044250F686425076B5001E76B4A5
-:1072E000FFE5C7386FC07739FFF09713FFFC96139F
-:1072F000FFFC07880008E000F3389793FFFC20228A
-:107300000000E6007319F5821770F704425400007C
-:10731000000127380001F70542549593FFFCF582E0
-:10732000001B9593FFFCF58642449593FFFC07886C
-:107330000008E0011EC09793FFFC8796FFFC829631
-:10734000FFF802140000013C0000000000019293CD
-:10735000FFFC029000082210004026140020961620
-:10736000FFC4F03328009013FFFC9613FFFC261493
-:1073700000389616FFBC9613FFFC07880008E00053
-:10738000D0DC9793FFFC9013FFFCF7044250F68685
-:10739000425076B5001E76B4FFE5C7386FC0773926
-:1073A000FFF09713FFFC8616FFBC00000001961348
-:1073B000FFFC8616FFC4000000019613FFFC07883F
-:1073C0000008E000F5F49793FFFC20220000E6009F
-:1073D00073E5F6021770F7044254000000012738E5
-:1073E0000001F70542549613FFFCF602001B9613AA
-:1073F000FFFCF60642449613FFFC07880008E001F4
-:107400001EC09793FFFC8796FFFC8296FFF802143C
-:107410000000013C0000000000019293FFFC02907C
-:10742000000822100004F5820000F5854080959642
-:10743000FFF407880008E000CB509793FFFC859687
-:10744000FFF4F5020064F5053BB4F7044250F486FE
-:10745000425076A5001E76B4FFE5F6044F5CF402B8
-:107460000006F4054254F5853B6CF5853BB8953232
-:10747000000095B20004C7386FC07739FFF00738B5
-:107480000001F727280007880008E00071B09793F3
-:10749000FFFCF4063704F40542448796FFFC82960D
-:1074A000FFF802140000013C00000000000192936C
-:1074B000FFFC0290000822100050F7044250F686AC
-:1074C000425076B5001E76B4FFE5F6046F34C73837
-:1074D0006FC086B2000C7739FFF0C0367200E6004C
-:1074E00077ECC504000086B20010F704E000F30258
-:1074F0000000C0367200E600751804B0001086B2B5
-:107500000014F704E00400000001C0367200E60039
-:10751000751C201A0000F3020001201A0000E6008A
-:10752000752900000001F502000086A60000F7049E
-:10753000E00000000001C0367200E2007564F6024F
-:107540000000C0367200E600756C2032000086A68E
-:107550000004F704E00400000001C0367200E200FD
-:10756000756D20320000F602000120320000E600B6
-:10757000757D202A0000F5020001202A0000E600A7
-:1075800077EC0000000107880008E000CBCC97935F
-:10759000FFFC26140020F033280004A00002F0278E
-:1075A0002800F582000023940022F59F280003A004
-:1075B000001A9396FFD42594002285AE000077AD83
-:1075C000001E77BCFFE5C5AC7FC075ADFFF076311E
-:1075D000001E7630FFE506A400022314001E751578
-:1075E000001EF59F2800F384E0007528FFE593A2B4
-:1075F000001CF584E0047399001E739CFFE59396CC
-:10760000FFAC7395001E739CFFE59396FFCC23940B
-:10761000004295A200208716FFE07595001E75AC0C
-:10762000FFE59596FFB47595001E75ACFFE5959640
-:10763000FFC4C73867C07738FFF0F7272800F48405
-:107640004F58871A0000C4A04A0074A4FFFAC5A4CA
-:107650000000F59F28008396FFAC2314001A7619CA
-:10766000001E7630FFE58596FFB4C7383FC07738F7
-:10767000FFF0F737280006B400028716FFE4839670
-:10768000FFCCC73857C07738FFF0F7372800871A84
-:10769000000006B40002C73867C07738FFF0F7373C
-:1076A000280006B400028716FFE823140016761996
-:1076B000001E7630FFE5C7385FC07738FFF0F73738
-:1076C0002800871A000006B40002C73867C0773860
-:1076D000FFF0F737280006B400028716FFEC2314EA
-:1076E00000127619001E7630FFE5C7383FC07738A4
-:1076F000FFF0F7372800871A000006B400028596CD
-:10770000FFC4C73867C07738FFF0F73728008716FF
-:10771000FFF006B40002C7385FC07738FFF0F737D4
-:107720002800F3820002F3A3280004200018259407
-:10773000002285AE000077AD001E77BCFFE5C5AC2A
-:107740007FC075ADFFF08396FFD4F5A32800F49FAA
-:1077500028002594004285AE000077AD001E77BC5E
-:10776000FFE5C5AC7FC075ADFFF044AD000094935C
-:10777000FFFCF786E0009793FFFCF3844F5C00006A
-:1077800000019393FFFC07880008E00123409793D2
-:10779000FFFC07880008E00078D89793FFFCF0050D
-:1077A0004084F786E0009793FFFC07880008E0001C
-:1077B000D5A09793FFFCF7046E50F4054084873AF8
-:1077C0001DDC00000001F7053B64F5863678F58581
-:1077D0004244F3863560F3854230F5864244959302
-:1077E000FFFC07880008E0011F489793FFFC87967D
-:1077F000FFFC8296FFF802140000013C000000002C
-:1078000000019293FFFC02900008F5864244959394
-:10781000FFFC07880008E00120E49793FFFC20228A
-:107820000000E600788900000001F70442540000DF
-:107830000001203A0000EE007851F6064250078819
-:107840000008E00071B09793FFFCE000788800002A
-:107850000001F704425076B1001E76B4FFE5F582D0
-:107860000006F5854254C7386FC07739FFF00738F6
-:107870000001F733280007880008E00072AC9793F6
-:10788000FFFCF5863790F58542448796FFFC82968B
-:10789000FFF802140000013C000000000001929378
-:1078A000FFFC02900008F6063678F6054244F7021F
-:1078B0000000F7054080F7054094F6846E50F70508
-:1078C000409097361DDC8796FFFC8296FFF80214E5
-:1078D0000000013C0000000000019293FFFC0290B8
-:1078E0000008F7020001F70540808796FFFC8296AA
-:1078F000FFF802140000013C000000000001929318
-:10790000FFFC02900008221000A8F7044250F58600
-:10791000425076AD001EF4846F3476B4FFE5949641
-:10792000FFC4C7386FC086A6000C7739FFF0C03699
-:107930007200E6007955F606429AF704429876B14D
-:10794000001E76B4FFE5C7386FC07739FFF00738FF
-:107950000001F7332800F704425076AD001E76B4DC
-:10796000FFE58516FFC4C7386FC086AA000C7739BB
-:10797000FFF0C0367200E60080A8F606429A872A19
-:107980000010862A001C203A0000E60079A8F68242
-:107990000000872A001400000001203A0000E600E1
-:1079A00079AC20360000F682000120360000E600A7
-:1079B0007A05249400209496FFBC8516FFC4F02716
-:1079C0002800052800109516FFB49513FFFC0788C2
-:1079D0000008E00072509793FFFC8496FFB400000B
-:1079E00000019493FFFC8516FFBC00000001951375
-:1079F000FFFC07880008E000F9349793FFFCE000E3
-:107A000080C40000000120320000E600806C00000D
-:107A1000000107880008E000CBCC9793FFFC259479
-:107A20000020F02F280004A000029496FF5CF027AD
-:107A30002800F48200002514005AF4AB2800072027
-:107A4000001A2514005A852A000077A9001E77BC69
-:107A5000FFE5C5287FC07529FFF075AD001E75AC28
-:107A6000FFE52314001E7619001EF53B2800F48460
-:107A7000E0007630FFE594A2001CF504E004849653
-:107A8000FF5C952200208716FFE006A40002751512
-:107A9000001E7528FFE59516FF547495001E74A40A
-:107AA000FFE59496FF9C7515001E7528FFE5951659
-:107AB000FF947495001E8516FF5C74A4FFE59496F0
-:107AC000FF8C8496FF54C7385FC07738FFF0F72BE0
-:107AD0002800871A00008516FF9CC73867C07738D2
-:107AE000FFF0F737280006B400028716FFE42314DE
-:107AF000001A7619001E7630FFE5C7384FC0773878
-:107B0000FFF0F7372800871A000006B400028496B9
-:107B1000FF94C73867C07738FFF0F737280006B4FE
-:107B200000028716FFE8231400167619001E76302F
-:107B3000FFE5C73857C07738FFF0F7372800871AB6
-:107B4000000006B40002C73867C07738FFF0F73787
-:107B5000280006B400028716FFEC231400127619E1
-:107B6000001E7630FFE5C7384FC07738FFF0F73793
-:107B70002800871A000006B400028516FF8CC7385B
-:107B800067C07738FFF0F73728008716FFF006B494
-:107B90000002C73857C07738FFF0F7372800F48263
-:107BA0000002F4A328002514005A852A000077A9B2
-:107BB000001E77BCFFE5C5287FC07529FFF00720B0
-:107BC0000018F53B28009416FFAC07880008E00079
-:107BD000CBCC9793FFFC261400382494005A84A63B
-:107BE000000077A5001E77BCFFE5C4A47FC074A584
-:107BF000FFF005A0000206AC000223940036751DBC
-:107C0000001E7528FFE50720001AF4B3280076311E
-:107C1000001E7630FFE59516FF547495001E74A47F
-:107C2000FFE59496FF5C7515001E7528FFE5951617
-:107C3000FF7C7495001E8516FFC474A4FFE594961E
-:107C4000FF74852A00342494005A9516FF8484A674
-:107C5000000077A5001E77BCFFE5C4A47FC074A513
-:107C6000FFF02514005AF4AF2800852A000077A9F8
-:107C7000001E77BCFFE5C5287FC07529FFF08496FC
-:107C8000FFC4F53B280084A600108516FFC494A20B
-:107C9000001C852A00147495001E74A4FFE59496B8
-:107CA000FF6C952200208716FFC88516FF54C73841
-:107CB00067C07738FFF0F72F2800871E00008496F2
-:107CC000FF5CC73857C07738FFF0F737280006B495
-:107CD00000028716FFCC23940032761D001E7630FA
-:107CE000FFE58516FF7CC7384FC07738FFF0F737C0
-:107CF0002800871E000006B40002C73867C0773826
-:107D0000FFF0F737280006B400028716FFD023944F
-:107D1000002E761D001E7630FFE5C73857C0773835
-:107D2000FFF0F7372800871E000006B40002849693
-:107D3000FF748516FF6CC73867C07738FFF0F737D8
-:107D4000280006B400028716FFD42394002A761D6B
-:107D5000001E7630FFE5C7384FC07738FFF0F737A1
-:107D60002800871E000006B40002C73867C07738B5
-:107D7000FFF0F73728008716FFD806B40002C7388F
-:107D800057C07738FFF0F7372800F4820002F4A3D9
-:107D90002800072000182514007A852A000077A9FA
-:107DA000001E77BCFFE5C5287FC07529FFF08496CB
-:107DB000FFC4F53B28008726000400000001203A9C
-:107DC0000024F7044F58E6007EF99416FF54C720AC
-:107DD0007200F6846E508626002C7738FFFA251440
-:107DE000005A842A000077A9001E77BCFFE5C42052
-:107DF0007FC07421FFF04739000086B61DDC77395B
-:107E00000002C0326A00468C0001D6800A68203623
-:107E10000000F6864098E6007EC0C3B86800C584BE
-:107E2000000086A60024F704E000F6020000C03639
-:107E30007200E6007E540324002486A60028F7047E
-:107E4000E00400000001C0367200E6007E582032D7
-:107E50000000F602000120320000E6007E6500000E
-:107E60000001F5820000869A0000F704E00000009F
-:107E70000001C0367200E2007EA0F6020000C036AB
-:107E80007200E6007EA820320000869A0004F70403
-:107E9000E00400000001C0367200E2007EA920323A
-:107EA0000000F602000120320000E6007EB9202E1C
-:107EB0000000F5820001202E0000E6007EC50000D3
-:107EC0000001F4020001F7044F58F41F28008496C3
-:107ED000FF548516FFC4F686409AC724720077388F
-:107EE000FFFA862A00304739000077390002C73888
-:107EF0006800E0007F4CF63B28008496FF54F606AD
-:107F00004098C72472007738FFFAC6B8000046B51B
-:107F1000000076B50002C6B46000F5020001F53736
-:107F200028004739000077390002C73860002494E0
-:107F3000005A84A6000077A5001E77BCFFE5C4A404
-:107F40007FC074A5FFF007380002F4BB2800F704D7
-:107F50004F588516FF548496FFACC6A8720076B4BD
-:107F6000FFFA0624001AF6B32800C72472007738F7
-:107F7000FFFA06A8001AF7372800473900009713C0
-:107F8000FFFC0724001C9713FFFCF5044F5C000066
-:107F900000019513FFFC07880008E0012340979338
-:107FA000FFFCF7044F588496FF5400000001C724DB
-:107FB00072007738FFFA473900009713FFFC072457
-:107FC000001C9713FFFCF5044F5C000000019513A3
-:107FD000FFFC07880008E00123409793FFFC078817
-:107FE0000008E00078D89793FFFCF6846E500000FC
-:107FF000000187361DDC00000001073800019736BC
-:108000001DDC87361DDCF0054084F486E000949387
-:10801000FFFC07880008E000D5A09793FFFCF4055B
-:108020004084F7046E50F005425C873A1DDCF6860A
-:108030002C28F7053B64F7042D38F5063A4CF50576
-:10804000424406380001F6052D3877390002F482E3
-:10805000001C20320044E6008060B4BA6802F005DB
-:108060002D38F50635ECE000808CF50542302032E5
-:108070000001E60080C40000000107880008E0005D
-:10808000789C9793FFFCF4863560F4854230F506C2
-:1080900042449513FFFC07880008E0011F489793AE
-:1080A000FFFCE00080C400000001F704429876B1B4
-:1080B000001E76B4FFE5C7386FC07739FFF0073888
-:1080C0000001F73328008796FFFC8296FFF8021420
-:1080D0000000013C0000000000019293FFFC0290B0
-:1080E0000008F58642449593FFFC07880008E001EC
-:1080F00020E49793FFFC20220000E600816100004D
-:108100000001F704425400000001203A0000EE0094
-:108110008129F606425007880008E00072AC979368
-:10812000FFFCE000816000000001F704425076B1DE
-:10813000001E76B4FFE5F5820006F5854254C73887
-:108140006FC07739FFF007380001F7332800078840
-:108150000008E000734C9793FFFCF586381CF5850A
-:1081600042448796FFFC8296FFF802140000013C0F
-:108170000000000000019293FFFC02900008221012
-:108180000058F7044250F686425076B5001E76B489
-:10819000FFE5F6046F34C7386FC086B2000C77393C
-:1081A000FFF0C0367200E6008250F4820000C50481
-:1081B000000086B20010F704E000C5A40000C0363D
-:1081C0007200E60081E40430001086B20014F70467
-:1081D000E00400000001C0367200E60081E8202EB5
-:1081E0000000F5820001202E0000E60081F500006D
-:1081F0000001F502000086A20000F704E000000084
-:108200000001C0367200E2008230F6020000C03683
-:108210007200E60082382032000086A20004F704D3
-:10822000E00400000001C0367200E2008239203212
-:108230000000F602000120320000E6008249202AF8
-:108240000000F5020001202A0000E60082592026E5
-:108250000000F482000120260000E6008760000094
-:10826000000107880008E000CBCC9793FFFC0720B3
-:108270000002F03B2800F7044F58F4053BB006A07D
-:108280000014C72072007738FFFAF737280006A0DD
-:108290000016F7372800F3020001F32328000788AF
-:1082A0000008E000CBCC9793FFFC26140020F033AD
-:1082B000280004A00002F0272800F3020000239405
-:1082C000002AF31F28000720001A2394002A839E07
-:1082D0000000779D001E77BCFFE5C39C7FC0739DA7
-:1082E000FFF07631001E7630FFE506A4000275151A
-:1082F000001EF3BB2800F304E0007528FFE593227D
-:10830000001CF384E0042314001E9316FFA4759947
-:10831000001E75ACFFE57315001E7318FFE593167C
-:10832000FFCC8316FFA493A200208716FFE073956D
-:10833000001E739CFFE59396FFAC7395001E739C23
-:10834000FFE5C73867C07738FFF0F7272800871A9E
-:1083500000009396FFC4C7385FC07738FFF0F73747
-:10836000280006B400028716FFE42394001A9396AF
-:10837000FFA4761D001E7630FFE5C73857C077385A
-:10838000FFF0F7372800871E000006B40002C73848
-:1083900067C07738FFF0F737280006B40002871669
-:1083A000FFE8231400169316FFA47619001E839687
-:1083B000FFAC7630FFE5C7383FC07738FFF0F737BE
-:1083C0002800871A000006B40002C73867C0773853
-:1083D000FFF0F737280006B400028716FFEC2314DD
-:1083E00000129316FFA47619001E8396FFCC7630F8
-:1083F000FFE5C7383FC07738FFF0F7372800871A06
-:10840000000006B40002C73867C07738FFF0F737BE
-:1084100028008716FFF08316FFC406B40002C73891
-:1084200037C07738FFF0F7372800F3820002F3A354
-:1084300028002314002A831A00007799001E77BCB5
-:10844000FFE5C3187FC07319FFF007200018F33B46
-:1084500028009416FFDC07880008E000CBCC979337
-:10846000FFFC072000022394002A839E0000779DD2
-:10847000001E77BCFFE5C39C7FC0739DFFF0248086
-:1084800000070520000AF3BB280020260007EE00A5
-:1084900084E00628000E86B200007731001E77388F
-:1084A000FFE575B1001E75ACFFE50528000204A4C8
-:1084B0000001C6B477C076B5FFF0F702FF00C6B47E
-:1084C0007400F6B3280087320000F30200FFC738BB
-:1084D0005FC07739FFF0C7383400E0008488F73395
-:1084E000280005200026862A000076A9001EF584B3
-:1084F0004F5876B4FFE58396FFDCF30200FF941635
-:10850000FFBCC71C5A007738FFFAC6306FC07631FF
-:10851000FFF047390000C7383400F682FF00C6304C
-:108520006C00C7386000F6843B6CF72B2800C5A0B0
-:108530005A0075ACFFFA8316FFDC07340001F7051B
-:108540003B6C0720003AF6BB280007200036F03BC2
-:108550002800F3820003F3A328000718001AF5BBD4
-:10856000280007880008E000CBCC9793FFFC072089
-:108570000002F03B2800248000070520000A202686
-:108580000007EE0085D40628000E86B20000773181
-:10859000001E7738FFE575B1001E75ACFFE50528B4
-:1085A000000204A40001C6B477C076B5FFF0F7025C
-:1085B000FF00C6B47400F6B3280087320000F382CF
-:1085C00000FFC7385FC07739FFF0C7383C00E000D4
-:1085D000857CF733280005A00026862E000076ADA6
-:1085E000001E76B4FFE5C520000024000007F3025A
-:1085F00000019316FFA4F7044F588396FFBC248014
-:10860000000EC71C72007738FFFAC6306FC0763193
-:10861000FFF047390000F68200FFC7386C00F68291
-:10862000FF00C6306C00C7386000F6843B6CF72F43
-:10863000280007340001F7053B6C0728003AF6BB19
-:10864000280007280036F03B2800F3020003F32B34
-:10865000280020220007EE008694C6284800063035
-:1086600000268732000076B1001E76B4FFE504A430
-:108670000002042000018396FFA4C7386FC0773939
-:10868000FFF0F682FF00C7386C00C71C7000E000E6
-:108690008650F73328000628002686B2000077317E
-:1086A000001E7738FFE5C6B477C076B5FFF0F70255
-:1086B000FF00C6B47400F6B328009513FFFCF30462
-:1086C0003BB0000000019313FFFC9516FFB4078830
-:1086D0000008E000D42C9793FFFC8516FFB4F0054A
-:1086E000407C8396FFBC23000007F3054258F70443
-:1086F0004250F606425076B1001E76B4FFE5F3060E
-:108700003934F3054244F5054074F3854260F38241
-:108710000006F3854254C7386FC07739FFF0F684FE
-:108720002D3807380001F733280006340001F6051C
-:108730002D38F7062C2876B50002F382001C203273
-:108740000044E600874CB3B67002F0052D38F306FE
-:1087500042449313FFFC07880008E0011F489793E9
-:10876000FFFC8796FFFC8296FFF802140000013C94
-:108770000000000000019293FFFC0290000822100C
-:108780000048F38642449393FFFC07880008E00109
-:1087900020E49793FFFC20220000E60089ED000012
-:1087A0000001F704425400000001203A0000EE00EE
-:1087B00087C90000000107880008E000734C979308
-:1087C000FFFCE00089EC0000000107880008E000E1
-:1087D000CBCC9793FFFC26140020F033280005A093
-:1087E0000002F02F2800F382000024940022F3A757
-:1087F000280004A0001A9496FFD423940022839E9C
-:108800000000779D001E77BCFFE5C39C7FC0739D71
-:10881000FFF07631001E7630FFE506AC000223142F
-:10882000001E7519001EF3A72800F484E0007528C7
-:10883000FFE594A2001CF384E0047495001E74A468
-:10884000FFE59496FFB47495001E74A4FFE594961A
-:10885000FFCC8496FFB493A200208716FFE07395A7
-:10886000001E739CFFE59396FFBC7395001E739CDE
-:10887000FFE59396FFC48396FFBCC73867C077387F
-:10888000FFF0F72F2800F5844F58871A0000C5A085
-:108890005A0075ACFFFAC73857C07738FFF0F73782
-:1088A000280006B400028716FFE42314001A761984
-:1088B000001E7630FFE545AD0000C7384FC0773861
-:1088C000FFF0F7372800871A000006B400028496EC
-:1088D000FFCCC73867C07738FFF0F737280006B4F9
-:1088E00000028716FFE8231400167619001E763062
-:1088F000FFE5C7383FC07738FFF0F7372800871A01
-:10890000000006B40002C73867C07738FFF0F737B9
-:10891000280006B400028716FFEC23140012761913
-:10892000001E7630FFE5C7384FC07738FFF0F737C5
-:108930002800871A000006B400028396FFC4C738D7
-:1089400067C07738FFF0F73728008716FFF006B4C6
-:108950000002C7383FC07738FFF0F7372800F482AD
-:108960000002F4A328000420001823940022839E10
-:108970000000779D001E77BCFFE5C39C7FC0739D00
-:10898000FFF08496FFD4F3A32800F3820001F3A73D
-:1089900028009593FFFCF486E0009493FFFCF38499
-:1089A0004F5C000000019393FFFC07880008E00182
-:1089B00023409793FFFC07880008E00078D897933E
-:1089C000FFFCF4863678F4854244F0054084F68452
-:1089D0004F5CF70200649736000090360004F702FF
-:1089E0000001F7054084F38635ECF3854230879625
-:1089F000FFFC8296FFF802140000013C000000001A
-:108A000000019293FFFC0290000822100090F704EE
-:108A10004260F502000005B80018F6044258000054
-:108A2000000120320007EE008A70C7306000C738AE
-:108A300058000738000E86BA00007739001E7738D4
-:108A4000FFE5C6B477C076B5FFF0F70200FFC6B405
-:108A50007400C0365200470C0001D7000A70203A5B
-:108A60000000E6008A7107300001E0008A18F7056F
-:108A70004258F40442580000000120220007EE0092
-:108A80008D9424940036F604426025140038239413
-:108A90000020063000028732000076B1001E76B456
-:108AA000FFE50630000275B1001EC7386FC0773889
-:108AB000FFF0F72B28008732000075ACFFE5C738C0
-:108AC0005FC07738FFF0F727280024940034063081
-:108AD00000028732000076B1001E76B4FFE5C73889
-:108AE0006FC07738FFF0F727280024940032063053
-:108AF00000028732000076B1001E76B4FFE5C73869
-:108B00006FC07738FFF0F727280024940030063034
-:108B100000028732000076B1001E76B4FFE5C73848
-:108B20006FC07738FFF0F72728002494002E063016
-:108B300000028732000076B1001E76B4FFE5C73828
-:108B40006FC07738FFF0F72728002494002C0630F8
-:108B500000028732000076B1001E76B4FFE5C73808
-:108B60006FC07738FFF0F72728002494002A0630DA
-:108B700000028732000076B1001E76B4FFE5C738E8
-:108B80006FC07738FFF0F7272800063000028732E1
-:108B90000000249400287631001E7630FFE5C738A7
-:108BA00067C07738FFF0F72728009413FFFC951370
-:108BB000FFFC9396FF7C9393FFFC07880008E0007E
-:108BC000D0DC9793FFFCF60442602494007E2514C9
-:108BD000008023940068063000028732000076B1DE
-:108BE000001E76B4FFE50630000275B1001EC738DE
-:108BF0006FC07738FFF0F72B28008732000075AC84
-:108C0000FFE5C7385FC07738FFF0F72728002494C6
-:108C1000007C063000028732000076B1001E76B478
-:108C2000FFE5C7386FC07738FFF0F7272800249496
-:108C3000007A063000028732000076B1001E76B45A
-:108C4000FFE5C7386FC07738FFF0F7272800249476
-:108C50000078063000028732000076B1001E76B43C
-:108C6000FFE5C7386FC07738FFF0F7272800249456
-:108C70000076063000028732000076B1001E76B41E
-:108C8000FFE5C7386FC07738FFF0F7272800249436
-:108C90000074063000028732000076B1001E76B400
-:108CA000FFE5C7386FC07738FFF0F7272800249416
-:108CB0000072063000028732000076B1001E76B4E2
-:108CC000FFE5C7386FC07738FFF0F7272800063078
-:108CD000000287320000249400707631001E763046
-:108CE000FFE5C73867C07738FFF0F72728009513EE
-:108CF000FFFC9396FF749393FFFC07880008E00045
-:108D0000D2589793FFFC8396FF7400000001939361
-:108D1000FFFCF704425823940050C70072009713D9
-:108D2000FFFC9396FF6C9393FFFC07880008E0001C
-:108D3000CF249793FFFC8396FF6CF6864250939363
-:108D4000FFFCF384425876B5001E9393FFFCF704B2
-:108D5000425076B4FFE5C7386FC07739FFF09713FC
-:108D6000FFFC8396FF7C000000019393FFFC0788C3
-:108D70000008E000F3389793FFFC20220000E60093
-:108D80008D9500000001F7044258000000010738EB
-:108D90000001F7054258F704425800000001203A4C
-:108DA0000007EE008DD4F3821770F7042D38F68695
-:108DB0002C2806380001F6052D3877390002F38299
-:108DC000001C20320044E6008DF4B3BA6802E000D3
-:108DD0008DF4F0052D389393FFFCF382001B9393E1
-:108DE000FFFCF38642449393FFFC07880008E001F0
-:108DF0001EC09793FFFC8796FFFC8296FFF8021433
-:108E00000000013C0000000000019293FFFC029072
-:108E1000000822100088F7044250F686425076B5CA
-:108E2000001EF3846F3476B4FFE59396FFC4C73811
-:108E30006FC0869E000C7739FFF0C0367200E600E6
-:108E40008E65F60642A0F70442A076B1001E76B405
-:108E5000FFE5C7386FC07739FFF007380001E00041
-:108E600094E4F7332800F604426024940036851613
-:108E7000FFC423940038063000028732000076B128
-:108E8000001E76B4FFE5852A001C0630000275B18D
-:108E9000001EC7386FC07738FFF09516FFBCF71F6C
-:108EA00028008732000075ACFFE58516FFC4C7387F
-:108EB0005FC07738FFF0F72728002494003406308D
-:108EC00000028732000076B1001E76B4FFE5C73895
-:108ED0006FC07738FFF0F72728002494003206305F
-:108EE00000028732000076B1001E76B4FFE5C73875
-:108EF0006FC07738FFF0F727280024940030063041
-:108F000000028732000076B1001E76B4FFE5C73854
-:108F10006FC07738FFF0F72728002494002E063022
-:108F200000028732000076B1001E76B4FFE5C73834
-:108F30006FC07738FFF0F72728002494002C063004
-:108F400000028732000076B1001E76B4FFE5C73814
-:108F50006FC07738FFF0F72728002494002A0630E6
-:108F600000028732000076B1001E76B4FFE5C738F4
-:108F70006FC07738FFF0F7272800063000028732ED
-:108F80000000249400287631001E7630FFE5C738B3
-:108F900067C07738FFF0F7272800872A00200000F5
-:108FA00000019713FFFC9393FFFC271400209713F5
-:108FB000FFFC07880008E000D0DC9793FFFC839655
-:108FC000FFC400000001871E001000000001203ACD
-:108FD0000000E6008FF0F6820000871E00140000FB
-:108FE0000001203A0000E6008FF420360000F682EF
-:108FF000000120360000E6009041000000018516C7
-:10900000FFC400000001052800109516FFB4951359
-:10901000FFFC07880008E00072509793FFFC8396DE
-:10902000FFB4271400209393FFFC9713FFFC0788DD
-:109030000008E000F9349793FFFCE00094E400009E
-:1090400000018516FFBC00000001202A0000E60098
-:1090500094BC0000000107880008E000CBCC979387
-:10906000FFFCF502000023940062F51F28007595AF
-:10907000001E75ACFFE50620000206B000022314B6
-:10908000001E7399001E739CFFE59396FF7475157F
-:10909000001E7528FFE59516FF7C7395001E739CD6
-:1090A000FFE59396FF8C8516FFC47395001E93967B
-:1090B000FF84852A0034239400629516FFACF033B8
-:1090C00028000520001A9516FF94839E0000779DC6
-:1090D000001E77BCFFE5C39C7FC0739DFFF07495B5
-:1090E000001EF3AB28008516FFC474A4FFE5852A93
-:1090F00000108396FFC49522001C839E00148516E1
-:10910000FF8493A200208716FFE07528FFE59516DF
-:10911000FF84F3844F588516FF74C7385FC07738D3
-:10912000FFF0F7332800871A00009396FFA4C022AF
-:109130003A008396FF7CC73857C07738FFF0F7377F
-:10914000280006B400028716FFE42314001A7619DB
-:10915000001E7630FFE5C7384FC07738FFF0F7378D
-:109160002800871A000006B40002C73867C07738A5
-:10917000FFF0F737280006B400028716FFE8231433
-:1091800000167619001E7630FFE5C7383FC07738E5
-:10919000FFF0F7372800871A000006B40002851692
-:1091A000FF8C8396FF84C73867C07738FFF0F737A6
-:1091B000280006B400028716FFEC2314001276196B
-:1091C000001E7630FFE5C73857C07738FFF0F73715
-:1091D0002800871A000006B40002C73867C0773835
-:1091E000FFF0F73728008716FFF006B40002C738F3
-:1091F0003FC07738FFF0F7372800F5020002F5236B
-:10920000280023940052839E0000779D001E77BCA7
-:10921000FFE5C39C7FC0739DFFF003200018E600AC
-:109220009230F39B2800F7044270E000929CF6060F
-:1092300042728516FFC40000000186AA00200000CB
-:10924000000107340007203A000EE2009294C73470
-:109250006800F5844260F38200FFC72C7000073875
-:10926000002686BA00009716FF747739001E7738FB
-:10927000FFE5C6B477C076B5FFF0C6B43C00203633
-:109280000000470C0001D7000A70203A0000E600F9
-:1092900092C900000001F7044274F606427476B1E8
-:1092A000001E76B4FFE5C7386FC07739FFF0073886
-:1092B0000001F733280007880008E000789C9793A6
-:1092C000FFFCE00094E4000000018516FFA48396F3
-:1092D000FF74C720520074B8FFFAC6240000871E2E
-:1092E0000000769D001E76B4FFE5C5AC520075AC5B
-:1092F000FFFA46310000F50200FFC6305400C738BF
-:109300006FC07739FFF0F682FF00C7386C00C630B7
-:109310007000F61F28008396FF948516FFC4F59F02
-:109320002800872A000400000001203A0024E600FB
-:109330009469F6864098F7046E50862A002CC6A4DD
-:10934000000023940062849E0000779D001E77BC7D
-:10935000FFE5C4A47FC074A5FFF046B50000873ABE
-:109360001DDC76B50002C0327200470C0001D70048
-:109370000A70203A0000F7064098E6009434C3349F
-:109380007000C584000086AA0024F704E000F602FD
-:109390000000C036720005280024E60093C495162C
-:1093A000FF748396FFC400000001869E0028F70426
-:1093B000E00400000001C0367200E60093C82032CD
-:1093C0000000F602000120320000E60093D5000004
-:1093D0000001F58200008516FF74F704E00086AAFC
-:1093E000000000000001C0367200E2009414F60292
-:1093F0000000C0367200E600941C2032000086AAED
-:109400000004F704E00400000001C0367200E2002E
-:10941000941D20320000F602000120320000E60018
-:10942000942D202E0000F5820001202E0000E60081
-:10943000943900000001F4820001F7044F58F49BB6
-:1094400028008396FFC4F686409AC72072007738BA
-:10945000FFFA861E00304739000077390002C7380E
-:109460006800E00094E4F63B2800472500007739C7
-:109470000002C7386800F5020001F53B28000738F4
-:10948000000223940062839E0000779D001E77BC3B
-:10949000FFE5C39C7FC0739DFFF025140062F3BB02
-:1094A0002800852A000077A9001E77BCFFE5C528A3
-:1094B0007FC07529FFF0E00094E4F51B2800839637
-:1094C000FFBC00000001201E0001E60094E4000043
-:1094D000000107880008E000789C9793FFFCF506E0
-:1094E0003560F50542308796FFFC8296FFF802143E
-:1094F0000000013C0000000000019293FFFC02907C
-:109500000008F50642449513FFFC07880008E001B7
-:1095100020E49793FFFC20220000E60096890000DB
-:109520000001F68442540000000120360000EE00E5
-:10953000958DF5864250F7044250762D001E763008
-:10954000FFE526B40001F685425425000007F50525
-:109550004258F6842D38C73867C07739FFF007388E
-:109560000001F72F280006340001F6052D38F70614
-:109570002C2876B50002F502001C20320044E600DB
-:109580009688B5367002E0009688F0052D38F5040F
-:109590004260000000019513FFFC07880008E0000E
-:1095A000B2849793FFFCF6844F5800000001073403
-:1095B0000040C0227200E60095ECF6064276F70401
-:1095C000427476B1001E76B4FFE5C7386FC07739B4
-:1095D000FFF007380001F733280007880008E00093
-:1095E000789C9793FFFCE000968800000001F70448
-:1095F000426000000001C0227200E60096240000D4
-:1096000000019713FFFCF5043BB000000001951327
-:10961000FFFC07880008E000D42C9793FFFCE000D3
-:10962000964000000001C0226A00E600967100002A
-:1096300000019713FFFC07880008E000CC609793B7
-:10964000FFFCF704407C000000010738000197137D
-:10965000FFFCF5044074000000019513FFFC07882F
-:109660000008E000BEF89793FFFCE0009688000039
-:109670000001F5044074000000019513FFFC078809
-:109680000008E000C1B49793FFFC8796FFFC829628
-:10969000FFF802140000013C00000000000192935A
-:1096A000FFFC0290000822100070F6046F34F704EB
-:1096B000426486B2000400000001C0367200E60079
-:1096C0009B1806B0000287360000F404407C76B593
-:1096D000001E76B4FFE5C7386FC07739FFF0C03A97
-:1096E0004200E6009B1824940036F604407423944C
-:1096F0000038063000028732000076B1001E76B4D2
-:10970000FFE50630000275B1001EC7386FC077381C
-:10971000FFF0F71F28008732000075ACFFE5C7385F
-:109720005FC07738FFF0F727280024940034063014
-:1097300000028732000076B1001E76B4FFE5C7381C
-:109740006FC07738FFF0F7272800249400320630E6
-:1097500000028732000076B1001E76B4FFE5C738FC
-:109760006FC07738FFF0F7272800249400300630C8
-:1097700000028732000076B1001E76B4FFE5C738DC
-:109780006FC07738FFF0F72728002494002E0630AA
-:1097900000028732000076B1001E76B4FFE5C738BC
-:1097A0006FC07738FFF0F72728002494002C06308C
-:1097B00000028732000076B1001E76B4FFE5C7389C
-:1097C0006FC07738FFF0F72728002494002A06306E
-:1097D00000028732000076B1001E76B4FFE5C7387C
-:1097E0006FC07738FFF0F727280006300002873275
-:1097F0000000249400287631001E7630FFE5C7383B
-:1098000067C07738FFF0F72728009413FFFC939385
-:10981000FFFC271400209713FFFC07880008E000D6
-:10982000D0DC9793FFFC07880008E000CBCC97932F
-:10983000FFFCF50440749416FFC407200002F03BBF
-:10984000280024800007F40200FF8396FFC49516C9
-:10985000FFBC031C000A20260007EE0098A806188B
-:10986000000E86B200007731001E7738FFE575B133
-:10987000001E75ACFFE503180002C6B477C076B5CC
-:10988000FFF0F702FF00C6B47400F6B32800873279
-:10989000000004A40001C7385FC07739FFF0C73863
-:1098A0004400E0009854F73328008516FFC47495EF
-:1098B000001E74A4FFE58396FFC42314001E7419D0
-:1098C000001E7420FFE5052800269516FF8C85AA4A
-:1098D000000076A9001E76B4FFE5039C0002939673
-:1098E000FFB4061C00027395001E739CFFE593965F
-:1098F000FFAC7395001E739CFFE59396FF9C8396C7
-:10990000FFBC7515001E7528FFE59516FF947515AB
-:10991000001E7528FFE59516FFA48516FFC4C5AC8B
-:109920006FC075ADFFF0F5054260F5044F58F68243
-:1099300000FFC71C52007738FFFA47390000C738CC
-:109940006C00F682FF00C5AC6C00C73858008396E7
-:10995000FF8CF5843B6C8516FFB4F71F2800871633
-:10996000FFE006AC0001F6853B6C8396FFC4C73868
-:109970004FC07738FFF0F72B2800F5044F58871AAF
-:109980000000C01E5200C73847C07738FFF0F733D9
-:109990002800063000028716FFE42314001A769987
-:1099A000001E8396FF9476B4FFE5C7383FC0773832
-:1099B000FFF0F7332800871A000006300002C7388E
-:1099C0006FC07738FFF0F7332800063000028716A3
-:1099D000FFE8231400167699001E76B4FFE585167D
-:1099E000FFAC8396FFA4C73857C07738FFF0F73332
-:1099F0002800871A0000063000028516FF9CC73831
-:109A00006FC07738FFF0F733280006300002871662
-:109A1000FFEC231400127699001E76B4FFE5C738D8
-:109A20003FC07738FFF0F7332800871A0000063070
-:109A300000028396FFC4C7386FC07738FFF0F73352
-:109A400028008716FFF006300002C73857C0773865
-:109A5000FFF0F7332800071C003AF5BB2800071C6D
-:109A60000036F03B2800F5020003E6009AA4F51F3B
-:109A70002800F7044278F606427876B1001E76B4E4
-:109A8000FFE5C7386FC07739FFF007380001F733BB
-:109A9000280007880008E000789C9793FFFCE0000E
-:109AA0009B1800000001F38642449393FFFC078853
-:109AB0000008E0011F489793FFFC25000007F5050B
-:109AC0004258F7044250F606425076B1001E76B472
-:109AD000FFE5F3820006F3854254F5063934F505B7
-:109AE0004244C7386FC07739FFF0F6842D38073805
-:109AF0000001F733280006340001F6052D38F7067B
-:109B00002C2876B50002F382001C20320044E600C7
-:109B10009B18B3B67002F0052D388796FFFC82962D
-:109B2000FFF802140000013C0000000000019293C5
-:109B3000FFFC0290000822100078F38642449393C1
-:109B4000FFFC07880008E00120E49793FFFC202237
-:109B50000000E6009E4100000001F70442540000AE
-:109B60000001203A0000EE009D8524940036F604A2
-:109B7000407425140038063000028732000076B1A8
-:109B8000001E76B4FFE50630000275B1001EC7382E
-:109B90006FC07738FFF0F72B28008732000075ACD4
-:109BA000FFE5C7385FC07738FFF0F7272800249417
-:109BB0000034063000028732000076B1001E76B411
-:109BC000FFE5C7386FC07738FFF0F72728002494E7
-:109BD0000032063000028732000076B1001E76B4F3
-:109BE000FFE5C7386FC07738FFF0F72728002494C7
-:109BF0000030063000028732000076B1001E76B4D5
-:109C0000FFE5C7386FC07738FFF0F72728002494A6
-:109C1000002E063000028732000076B1001E76B4B6
-:109C2000FFE5C7386FC07738FFF0F7272800249486
-:109C3000002C063000028732000076B1001E76B498
-:109C4000FFE5C7386FC07738FFF0F7272800249466
-:109C5000002A063000028732000076B1001E76B47A
-:109C6000FFE5C7386FC07738FFF0F72728000630C8
-:109C7000000287320000249400287631001E7630DE
-:109C8000FFE5C73867C07738FFF0F7272800F3846F
-:109C9000407C000000019393FFFC9513FFFC23948C
-:109CA00000209396FF949393FFFC07880008E00040
-:109CB000D0DC9793FFFC8396FF9400000001939300
-:109CC000FFFC239400689396FF8C9393FFFC078816
-:109CD0000008E000D2589793FFFC8396FF8C0000A9
-:109CE00000019393FFFC9013FFFC23940050939684
-:109CF000FF849393FFFC07880008E000CF2497932C
-:109D0000FFFC8702FF3400000001F7054264F38482
-:109D1000407C000000019393FFFC9713FFFC8396A7
-:109D2000FF84000000019393FFFC8396FF940000E2
-:109D300000019393FFFC07880008E000F7C89793A1
-:109D4000FFFC20220000E6009D5DF3821770F704FF
-:109D500042540000000127380001F7054254939354
-:109D6000FFFCF382001B9393FFFCF3864244939322
-:109D7000FFFC07880008E0011EC09793FFFCE0008D
-:109D80009E4000000001F504407CF4844074C72824
-:109D90005000C724700005B8002686AE0000772D5D
-:109DA000001E7738FFE5C6B477C077B40008703E70
-:109DB000FFE8470C0001D7000A70203A0000F704C2
-:109DC0004F58E6009DFDF60200FFF7044278F606C4
-:109DD000427A76B1001E76B4FFE5C7386FC0773996
-:109DE000FFF007380001F733280007880008E0007B
-:109DF000789C9793FFFCE0009E400000000186AE37
-:109E00000000772D001E7738FFE5C6B477C076B521
-:109E1000FFF0F7020001C7386400F602FF00C6B485
-:109E20006400C7386800F72F28000728000197133F
-:109E3000FFFC9493FFFC07880008E000BEF89793AE
-:109E4000FFFC8796FFFC8296FFF802140000013C9D
-:109E50000000000000019293FFFC02900008221015
-:109E600000D8F38642449393FFFC07880008E00182
-:109E700020E49793FFFC20220000E600A2C9000026
-:109E80000001F704425400000001203A0000EE00F7
-:109E9000A03524940036F6044074251400380630AA
-:109EA00000028732000076B1001E76B4FFE506306E
-:109EB000000275B1001EC7386FC07738FFF0F72B6E
-:109EC00028008732000075ACFFE5C7385FC07738DF
-:109ED000FFF0F72728002494003406300002873270
-:109EE000000076B1001E76B4FFE5C7386FC0773842
-:109EF000FFF0F72728002494003206300002873252
-:109F0000000076B1001E76B4FFE5C7386FC0773821
-:109F1000FFF0F72728002494003006300002873233
-:109F2000000076B1001E76B4FFE5C7386FC0773801
-:109F3000FFF0F72728002494002E06300002873215
-:109F4000000076B1001E76B4FFE5C7386FC07738E1
-:109F5000FFF0F72728002494002C063000028732F7
-:109F6000000076B1001E76B4FFE5C7386FC07738C1
-:109F7000FFF0F72728002494002A063000028732D9
-:109F8000000076B1001E76B4FFE5C7386FC07738A1
-:109F9000FFF0F727280006300002873200002494E3
-:109FA00000287631001E7630FFE5C73867C0773865
-:109FB000FFF0F7272800F384407C00000001939312
-:109FC000FFFC9513FFFC239400209396FF4C939382
-:109FD000FFFC07880008E000D0DC9793FFFC839625
-:109FE000FF4C000000019393FFFC239400509396D4
-:109FF000FF449393FFFC07880008E000D258979332
-:10A00000FFFC8702FF3400000001F7054264F3847F
-:10A01000407C000000019393FFFC9713FFFC8396A4
-:10A02000FF44000000019393FFFC8396FF4CE00087
-:10A03000A2809393FFFCF404407CF6044074F38206
-:10A040000000C7204000C73070000738002686BADD
-:10A0500000007739001E7738FFE5C6B477C077B4C3
-:10A060000008703EFFE8470C0001D7000A70203A54
-:10A070000000E600A0AD9396FF3CF70442A0F60670
-:10A0800042A076B1001E76B4FFE5C7386FC07739BD
-:10A09000FFF007380001F733280007880008E000C8
-:10A0A000789C9793FFFCE000A2C8000000010630F6
-:10A0B00000028732000076B1001E76B4FFE52494DA
-:10A0C000007E25140080239400680630000275B1DC
-:10A0D000001EC7386FC07738FFF0F72B2800873293
-:10A0E000000075ACFFE5C7385FC07738FFF0F72791
-:10A0F00028002494007C063000028732000076B1EC
-:10A10000001E76B4FFE5C7386FC07738FFF0F72739
-:10A1100028002494007A063000028732000076B1CD
-:10A12000001E76B4FFE5C7386FC07738FFF0F72719
-:10A13000280024940078063000028732000076B1AF
-:10A14000001E76B4FFE5C7386FC07738FFF0F727F9
-:10A15000280024940076063000028732000076B191
-:10A16000001E76B4FFE5C7386FC07738FFF0F727D9
-:10A17000280024940074063000028732000076B173
-:10A18000001E76B4FFE5C7386FC07738FFF0F727B9
-:10A19000280024940072063000028732000076B155
-:10A1A000001E76B4FFE5C7386FC07738FFF0F72799
-:10A1B00028000630000287320000249400707631B7
-:10A1C000001E7630FFE5C73867C07738FFF0F72705
-:10A1D00028009413FFFC9513FFFC9396FF34939390
-:10A1E000FFFC07880008E000D0DC9793FFFC839613
-:10A1F000FF34000000019393FFFC239400B093967A
-:10A20000FF2C9393FFFC07880008E000D258979337
-:10A21000FFFC8396FF2C000000019393FFFC8396C4
-:10A22000FF3C000000019393FFFC23940098939659
-:10A23000FF249393FFFC07880008E000CF24979346
-:10A24000FFFCF3820006F38542548702FF34F38655
-:10A2500038A8F3854244F7054264F384407C00004B
-:10A2600000019393FFFC9713FFFC8396FF240000EB
-:10A2700000019393FFFC8396FF3400000001939349
-:10A28000FFFC07880008E000F7C89793FFFC202236
-:10A290000000E600A2A9F3821770F7044254000000
-:10A2A000000127380001F70542549393FFFCF38225
-:10A2B000001B9393FFFCF38642449393FFFC0788B3
-:10A2C0000008E0011EC09793FFFC8796FFFC829672
-:10A2D000FFF802140000013C00000000000192930E
-:10A2E000FFFC02900008F6046F34F704426486B263
-:10A2F000000400000001C0367200E600A3AC06B006
-:10A3000000028736000076B5001E76B4FFE5C73838
-:10A310006FC0F684407C7739FFF0C03A6A00E600EF
-:10A32000A3ACC7346800F5844074F6044F580000AD
-:10A330000001C62C62007630FFFAC5AC700005AC97
-:10A34000002686AE0000772D001E7738FFE54631E7
-:10A350000000C6B477C076B5FFF0F70200FFC63044
-:10A360007400F702FF00C6B47400C6306800F62F10
-:10A370002800F50642449513FFFC07880008E00119
-:10A380001F489793FFFCF704407C0000000107384A
-:10A3900000019713FFFCF5044074000000019513C1
-:10A3A000FFFC07880008E000BEF89793FFFC879643
-:10A3B000FFFC8296FFF802140000013C0000000040
-:10A3C00000019293FFFC0290000822100080F70425
-:10A3D000425800000001203A0000E600A3F4203AB1
-:10A3E0000007F5020001F5054258F7044258000045
-:10A3F0000001203A0007EE00A6F02394001EF604A8
-:10A40000426023140066F4844078063000028732EC
-:10A41000000076B1001E76B4FFE504A400027425A6
-:10A42000001E7420FFE5063000027531001E7528FD
-:10A43000FFE59516FF7CC7386FC07738FFF025140D
-:10A4400000209516FF94F72B280087320000851610
-:10A45000FF7C05A40002C73857C07738FFF0F71F0C
-:10A4600028002394001C063000028732000076B1D9
-:10A47000001E76B4FFE525140050C7386FC077384A
-:10A48000FFF0F71F28002394001A063000028732DD
-:10A49000000076B1001E76B4FFE5C7386FC077388C
-:10A4A000FFF0F71F280023940018063000028732BF
-:10A4B000000076B1001E76B4FFE5C7386FC077386C
-:10A4C000FFF0F71F280023940016063000028732A1
-:10A4D000000076B1001E76B4FFE5C7386FC077384C
-:10A4E000FFF0F71F28002394001406300002873283
-:10A4F000000076B1001E76B4FFE5C7386FC077382C
-:10A50000FFF0F71F28002394001206300002873264
-:10A51000000076B1001E76B4FFE5C7386FC077380B
-:10A52000FFF0F71F28002394001006300002873246
-:10A53000000076AD001E7631001E7630FFE5C7388C
-:10A5400067C07738FFF0F71F280087260000261421
-:10A550000068C73847C07738FFF0F7332800872EE8
-:10A56000000076B4FFE5C7386FC07738FFF0F71BFF
-:10A5700028002314006405AC0002872E000076AD8D
-:10A58000001E76B4FFE5C7386FC07738FFF0F71BC1
-:10A5900028002314006205AC0002872E000076AD6F
-:10A5A000001E76B4FFE5C7386FC07738FFF0F71BA1
-:10A5B00028002314006005AC0002872E000076AD51
-:10A5C000001E76B4FFE5C7386FC07738FFF0F71B81
-:10A5D00028002314005E05AC0002872E000076AD33
-:10A5E000001E76B4FFE5C7386FC07738FFF0F71B61
-:10A5F00028002314005C05AC0002872E000076AD15
-:10A60000001E76B4FFE5C7386FC07738FFF0F71B40
-:10A6100028002314005A05AC0002872E000076ADF6
-:10A62000001E76B4FFE5C7386FC07738FFF0F71B20
-:10A63000280005AC0002872E00002314005875ADD9
-:10A64000001E75ACFFE5C7385FC07738FFF0F71B19
-:10A6500028009613FFFC9516FF8C9513FFFC0788C6
-:10A660000008E000D2589793FFFC8516FF8C00008D
-:10A6700000019513FFFCF5044258000000019513FA
-:10A68000FFFC251400389516FF849513FFFC0788FE
-:10A690000008E000CF249793FFFCF5044258000027
-:10A6A00000019513FFFCF5044264000000019513BE
-:10A6B000FFFC8516FF84000000019513FFFC851642
-:10A6C000FF94000000019513FFFC07880008E000DC
-:10A6D000F7C89793FFFC20220000E600A6F10000D7
-:10A6E0000001F70442580000000107380001F70597
-:10A6F0004258F704425800000001203A0007EE00DB
-:10A70000A730F5021770F7042D38F6862C28063886
-:10A710000001F6052D3877390002F502001C2032C1
-:10A720000044E600A750B53A6802E000A750F005E3
-:10A730002D389513FFFCF502001B9513FFFCF50661
-:10A7400042449513FFFC07880008E0011EC0979360
-:10A75000FFFC8796FFFC8296FFF802140000013C84
-:10A760000000000000019293FFFC029000082210FC
-:10A770000030F6046F34F704426486B2000400002F
-:10A780000001C0367200E600A9F007300002863AE8
-:10A790000000F5820000F684407C7739001E77388F
-:10A7A000FFE5C63077C0F7044074C6B46800763160
-:10A7B000FFF0C60062009616FFF4C738680007383D
-:10A7C000002686BA00007739001E7738FFE5C6B448
-:10A7D00077C077B40008703EFFE8470C0001D7004F
-:10A7E0000A70203A0000E600A834F60200FF831643
-:10A7F000FFF48396FFF4F7044078C6983800C73812
-:10A8000068000738002686BA00007739001E7738BE
-:10A81000FFE5C6B477C076B5FFF0C6B46400C036B5
-:10A820005A00470C0001D7000A70203A0000E600E9
-:10A83000A83D202E0000F5820001202E0000E60039
-:10A84000A875F606427CF704427C76B1001E76B409
-:10A85000FFE5C7386FC07739FFF007380001F733DD
-:10A86000280007880008E000789C9793FFFCE00030
-:10A87000A9F000000001F3044260000000019313FE
-:10A88000FFFC07880008E000CC609793FFFCF4040D
-:10A890004078F7044F58F5044074F384407CF30487
-:10A8A000407CC62072007630FFFAC59C3000C5A8F7
-:10A8B000580005AC002686AE000074AD001E74A4DE
-:10A8C000FFE573AD001E739CFFE59396FFD4C5288A
-:10A8D00072007528FFFA8316FFF48396FFF4463161
-:10A8E000000045290000C7183800C420700004206B
-:10A8F00000267321001EC6B44FC076B5FFF0F48267
-:10A9000000FFC6304C00F382FF00C6B43C00C630E6
-:10A910006800F62F2800872E00007318FFE59316B5
-:10A92000FFCC8316FFD48396FFF4C5284C00C738AC
-:10A9300037C07739FFF0769D001076B5FFF8C7383D
-:10A940004C00C6B47000F6AF28008722000076A144
-:10A95000001E8316FFCCF382FF0076B4FFE5C738F4
-:10A9600037C07739FFF0C7383C00C5287000F523A1
-:10A97000280087220000F304407CC7386FC0773975
-:10A98000FFF0731900109316FFEC7399FFF8C738A6
-:10A990004C00C71C70009716FFDC23140022831A9A
-:10A9A00000007799001E77BCFFE5C3187FC07319BC
-:10A9B000FFF0F3232800F38642449393FFFC0788BB
-:10A9C0000008E0011F489793FFFCF704407C00005B
-:10A9D0000001073800019713FFFCF30440740000E6
-:10A9E00000019313FFFC07880008E000BEF897936E
-:10A9F000FFFC8796FFFC8296FFF802140000013CE2
-:10AA00000000000000019293FFFC02900008221059
-:10AA10000098F30642449313FFFC07880008E00106
-:10AA200020E49793FFFC20220000E600AEE5000042
-:10AA30000001F704425400000001203A0000EE003B
-:10AA4000AD8927380001F70542542394001EF6040F
-:10AA50004260249400669496FF64F3044078249442
-:10AA600000209496FF94063000028732000076B1F1
-:10AA7000001E76B4FFE5031800029316FF747419E4
-:10AA8000001E7420FFE505980002063000027531B3
-:10AA9000001EC7386FC07738FFF0F72728008732CD
-:10AAA00000007528FFE5C73857C07738FFF0F71F5B
-:10AAB00028002394001C063000028732000076B183
-:10AAC000001E76B4FFE58516FF64C7386FC077387F
-:10AAD000FFF0F71F28002394001A06300002873287
-:10AAE000000076B1001E76B4FFE5C7386FC0773836
-:10AAF000FFF0F71F28002394001806300002873269
-:10AB0000000076B1001E76B4FFE5C7386FC0773815
-:10AB1000FFF0F71F2800239400160630000287324A
-:10AB2000000076B1001E76B4FFE5C7386FC07738F5
-:10AB3000FFF0F71F2800239400140630000287322C
-:10AB4000000076B1001E76B4FFE5C7386FC07738D5
-:10AB5000FFF0F71F2800239400120630000287320E
-:10AB6000000076B1001E76B4FFE5C7386FC07738B5
-:10AB7000FFF0F71F280023940010063000028732F0
-:10AB8000000076AD001E7631001E7630FFE5C73836
-:10AB900067C07738FFF0F71F2800871A00002614D7
-:10ABA0000068C73847C07738FFF0F7332800872E92
-:10ABB000000076B4FFE5C7386FC07738FFF0F72B99
-:10ABC0002800231400649316FF6405AC0002872E4E
-:10ABD000000076AD001E76B4FFE5C7386FC0773849
-:10ABE000FFF0F71B2800249400629496FF6405ACE4
-:10ABF0000002872E000076AD001E76B4FFE5C73850
-:10AC00006FC07738FFF0F7272800251400609516ED
-:10AC1000FF6405AC0002872E000076AD001E76B4FE
-:10AC2000FFE5C7386FC07738FFF0F72B28002314F3
-:10AC3000005E9316FF6405AC0002872E000076AD1F
-:10AC4000001E76B4FFE5C7386FC07738FFF0F71BFA
-:10AC500028002494005C9496FF6405AC0002872EC3
-:10AC6000000076AD001E76B4FFE5C7386FC07738B8
-:10AC7000FFF0F72728002514005A9516FF6405AC4D
-:10AC80000002872E000076AD001E76B4FFE5249406
-:10AC90000050C7386FC07738FFF0F72B2800231417
-:10ACA000005805AC0002872E00009316FF6475ADB6
-:10ACB000001E75ACFFE5C7385FC07738FFF0F71BA3
-:10ACC00028009613FFFC9496FF8C9493FFFC078852
-:10ACD0000008E000D2589793FFFC8516FF8C2314E0
-:10ACE00000389513FFFC278000079793FFFC93160D
-:10ACF000FF849313FFFC07880008E000CF2497939C
-:10AD0000FFFC27800007F7854258278000079793AC
-:10AD1000FFFCF4844264000000019493FFFC85165C
-:10AD2000FF84000000019513FFFC8316FF940000D0
-:10AD300000019313FFFC07880008E000F7C8979311
-:10AD4000FFFC20220000E600AD5D00000001F704DA
-:10AD500042580000000107380001F7054258F70487
-:10AD60002D38F6862C2806380001F6052D3877395F
-:10AD70000002F482001C20320044E600AEE4B4BAC3
-:10AD80006802E000AEE4F0052D38F7044078F58461
-:10AD90004F580738001686BA0000F4063B90773902
-:10ADA000001E7738FFE5C6B477C076B4FFF076357D
-:10ADB0000006A72E6002C52C600076A9001E76B49E
-:10ADC000FFE5C7386FC07739FFF077390003C73820
-:10ADD00040000738000286BA00007739001E773835
-:10ADE000FFE5C6B477C073B7FFF0EE00AE55951619
-:10ADF000FF64A72E600276A9001E76B4FFE5C7386F
-:10AE00006FC07739FFF077390003C738400086BA42
-:10AE10000004231400887739001E7738FFE5C6B494
-:10AE200077C076B5FFF0A6AA6802771D0003C73881
-:10AE3000680027380008853A000484BA0000000042
-:10AE40000001951A0004949A00008596FF7CE000AA
-:10AE5000AE78000000018496FF64A72E600276A5FC
-:10AE6000001E76B4FFE5C7386FC07739FFF0773939
-:10AE70000003C738400085BA00048516FF64F60653
-:10AE80003B90872A000076A9001E76B4FFE5C738FC
-:10AE90006FC07739FFF077390003A6BA6002201E31
-:10AEA0000000C73860007739001E7738FFE5C6B468
-:10AEB00077C0EE00AEC976B5FFF08316FF780000CC
-:10AEC00000017719FFF0C6B868008496FF6400009F
-:10AED0000001C72468009713FFFC07880008C12CF5
-:10AEE00000009793FFFC8796FFFC8296FFF8021400
-:10AEF0000000013C0000000000019293FFFC029062
-:10AF0000000822100010F704408400000001203ADD
-:10AF10000000E600AF3CF60642B8F70442B876B14E
-:10AF2000001E76B4FFE5F3063678F3054244C738D1
-:10AF30006FC07739FFF007380001F7332800F704B6
-:10AF40004F5CF384425C833A0004C43800009316DB
-:10AF5000FFEC771D0001C73838007739000204B8CC
-:10AF6000000C8316FFEC00000001C01E3200EC0054
-:10AF7000B070C5040000A6A24802F704E000F58204
-:10AF80000000C0367200E600AFA8C620480086B2B6
-:10AF90000004F704E00400000001C0367200E6007F
-:10AFA000AFAC202E0000F5820001202E0000E6004C
-:10AFB000AFB900000001F502000086B20000F704FE
-:10AFC000E00000000001C0367200E200AFF4F5823C
-:10AFD0000000C0367200E600AFFC202E000086B2F2
-:10AFE0000004F704E00400000001C0367200E20033
-:10AFF000AFFD202E0000F5820001202E0000E600AB
-:10B00000B00D202A0000F5020001202A0000E60011
-:10B01000B05900000001F7047AD000000001203A86
-:10B020000000E600B064C7204800873A0008F60632
-:10B03000409877390002A6BA6002C73860007739B5
-:10B04000001E7738FFE5C6B477C076B5FFF020362E
-:10B050000000E600B0640000000104A4000CE00061
-:10B06000AF60039C00018316FFEC00000001C01ECE
-:10B070003200EC00B104F3063678F6844F5C771D9D
-:10B080000001C7383800773900020738000CC6B411
-:10B09000700087360008F6844F5877390006C6B42A
-:10B0A00070009693FFFC9396FFF407880008E00079
-:10B0B000FA989793FFFC20220000F684426C839656
-:10B0C000FFF4470C0001D7000A70C71C7000F70599
-:10B0D000425C06B40001F7042D38F685426CF68612
-:10B0E0002C2806380001F6052D3877390002F302C6
-:10B0F000001C20320044E600B108B33A6802E000C8
-:10B10000B108F0052D38F30542448796FFFC82967E
-:10B11000FFF802140000013C0000000000019293BF
-:10B12000FFFC02900008F4020000C5A00000F682B7
-:10B130000770F7046E5020360000E600B16D063847
-:10B14000001C8732000000000001C4207000C022F3
-:10B150007200E400B15D0000000105AC000126B4FE
-:10B16000000120360000E600B14006300004C42093
-:10B170005800C0225A00E400B18100000001042000
-:10B1800000018796FFFC8296FFF802140000013C44
-:10B190000000000000019293FFFC02900008078865
-:10B1A0000008E00078D89793FFFC07880008E000CB
-:10B1B000B11C9793FFFCF704409400000001C022EB
-:10B1C0007200E600B1EDF4054090F7046E50000007
-:10B1D000000186BA1DDCF582000106B4000196BAB2
-:10B1E0001DDC873A1DDCE000B1F0F5857AD0F00572
-:10B1F0007AD0F5844090F0054084F5854094F5863A
-:10B20000E0009593FFFC07880008E000D5A0979325
-:10B21000FFFCF7046E50F405408485BA1DDC000085
-:10B220000001F5853B64F584E000F005425C95BAC9
-:10B230000010F584E004F6862C2895BA0014F70473
-:10B240002D38F5863A4CF585424406380001F6055E
-:10B250002D3877390002F582001C20320044E600C8
-:10B26000B268B5BA6802F0052D38F58635ECF5857B
-:10B2700042308796FFFC8296FFF802140008013CDA
-:10B280000000000000019293FFFC029000082210D1
-:10B2900000C8F30200009316FF94248000089496DF
-:10B2A000FF84238000078316FF940000000193169B
-:10B2B000FF54201E0007EE00B564C71C38008496BA
-:10B2C000000000000001C72470000738002686BA7D
-:10B2D0000000F5844F587739001E7738FFE5C6B473
-:10B2E00077C076B5FFF0F70200FFC6B67400E6003F
-:10B2F000B32D20360001E600B32D77350006A6BA3F
-:10B300005802C73858007639001E7630FFE5C6B4BB
-:10B3100067C076B5FFF020360002E600B331C6B84C
-:10B320000000C72C0000E000B330C6B80000F6846F
-:10B330004F58F7044F58C5340000C02A7200E60089
-:10B34000B55D00000001F6843BBCF30200009316DB
-:10B35000FF3C0428001CF7043BB800000001C03685
-:10B360007200EC00B4409696FFAC77350001C73808
-:10B37000680077390002F4863BB4C63848000630CE
-:10B38000000CC30400009316FF3486B20000872A25
-:10B39000001C8596FF3CC0367200E600B3C0202E2C
-:10B3A000000086B20004872A002000000001C03699
-:10B3B0007200E600B3C0202E0000F5820001202EAE
-:10B3C0000000E600B3D100000001F4820000949672
-:10B3D000FF3486B200008722000000000001C03662
-:10B3E0007200E200B40CF5820000C0367200E60084
-:10B3F000B414202E000086B200048722000400004E
-:10B400000001C0367200E200B415202E0000F58263
-:10B410000001202E0000E600B42500000001F30228
-:10B4200000019316FF348496FF34000000012026AB
-:10B430000000E600B44000000001F3020001931692
-:10B44000FF3C8496FF3C0000000120260000E6003F
-:10B45000B481F60200018716FFACF3063BB476B95F
-:10B460000001C6B4700076B50002C6B4300006B460
-:10B47000001486B600009716FFB0E000B4F496966C
-:10B48000FFB4271400549713FFFC9413FFFCF486B9
-:10B490003BB49493FFFC9396FF4C9516FF440788AA
-:10B4A0000008E00125689793FFFC8396FF4C851602
-:10B4B000FF4420220000E600B4F1F60200018716E6
-:10B4C000FFACF3063BB476B90001C6B4700076B5A4
-:10B4D0000002C6B4300006B4001486B60000971609
-:10B4E000FFB09696FFB4F7053BBCE000B4F82032FD
-:10B4F0000000F602000020320000E600B52D2714FF
-:10B5000000088496FF5400000001C72470008316D1
-:10B51000FFB404A400049496FF548496FF94933AD5
-:10B52000FFC004A40001E000B5549496FF94831674
-:10B53000FF5400000001C7187000F4844F5803182E
-:10B5400000049316FF548316FF9494BAFFC00318A7
-:10B5500000019316FF949516FF3C9396FF8CE00034
-:10B56000B2B0039C00018496FF94000000012026E5
-:10B570000000E600B584F3820001F4044F58E000B7
-:10B58000BEE4000000018316FFB88496FF9400001B
-:10B590000001C01E4A00EC00B5CC9316FF7C269437
-:10B5A00000048736FFC08316FF7C00000001C03A0C
-:10B5B0003200E600BB98039C00018496FF940000D3
-:10B5C0000001C01E4A00EC00B5A106B40004F4045A
-:10B5D0004F588316FF7C00000001C01A4200E600AD
-:10B5E000BA2DF48200009496FF7423800007201E79
-:10B5F0000007EE00B748C71C38008316FF7C000028
-:10B600000001C71870000738002686BA0000F584CC
-:10B610004F587739001E7738FFE5C6B477C076B546
-:10B62000FFF0F70200FFC6B67400E600B6692036E8
-:10B630000001E600B66977350006A6BA5802C73899
-:10B6400058007639001E7630FFE5C6B467C076B57F
-:10B65000FFF020360002E600B66DC6B80000C72C29
-:10B660000000E000B66CC6B80000F6844F58F7043E
-:10B670004F58C5340000C02A7200E600B741C584A7
-:10B6800000008496FF7486AA001C8316FF3CF60215
-:10B69000000004A400019496FF74871A001C04A8FB
-:10B6A000001C9496FF34C0367200E600B6CC041835
-:10B6B000001C86AA0020871A002000000001C03666
-:10B6C0007200E600B6D020320000F60200012032FF
-:10B6D0000000E600B6DD00000001F58200008316E0
-:10B6E000FF3487220000869A000000000001C03667
-:10B6F0007200E200B71CF6020000C0367200E600DD
-:10B70000B72420320000869A00048722000400003B
-:10B710000001C0367200E200B72520320000F602B8
-:10B72000000120320000E600B735202E0000F5822F
-:10B730000001202E0000E600B740000000019396B3
-:10B74000FF84E000B5EC039C00018496FF7483162F
-:10B75000FF9400000001C0263200E600BB982300E1
-:10B7600000088496FF8400000001C0263200E60035
-:10B77000BB99F6020000F684407CF7044074C6B41E
-:10B780006800C73868000738002686BA0000773995
-:10B79000001E7738FFE5C6B477C077B40008703E66
-:10B7A000FFE8470C0001D7000A70203A0000E600CD
-:10B7B000B804F58200FF8496FF848316FF8C000096
-:10B7C0000001C72432008496FF7CC7387000C7246C
-:10B7D00070000738002686BA00007739001E7738D7
-:10B7E000FFE5C6B477C076B5FFF0C6B45C00C036DE
-:10B7F0006200470C0001D7000A70203A0000E60002
-:10B80000B80D20320000F602000120320000E600F0
-:10B81000BB9823800007201E0007EE00B8C8C71C95
-:10B8200038008316000000000001C71870000738B8
-:10B83000002686BA0000F5844F587739001E773805
-:10B84000FFE5C6B477C076B5FFF0F70200FFC6B6D5
-:10B850007400E600B89120360001E600B891773513
-:10B860000006A6BA5802C73858007639001E76304E
-:10B87000FFE5C6B467C076B5FFF020360002E600EB
-:10B88000B895C6B80000C72C0000E000B894C6B850
-:10B890000000F6844F58F7044F58C5340000C02A02
-:10B8A0007200E600B8C1000000019513FFFC9396FA
-:10B8B000FF4C07880008E000CC609793FFFC83965C
-:10B8C000FF4CE000B814039C00018496FF848316AB
-:10B8D000FF8CF384407CF5044074C4A43200949639
-:10B8E000FF348316FF34C59C3800C5A8580005AC4A
-:10B8F000002686AE0000772D001E7738FFE5742DF8
-:10B90000001E7420FFE5739D0010739DFFF8C4A412
-:10B9100030009496FF3C8316FF7CC6B477C0C49871
-:10B9200048009496FF3C04A400269496FF3C73259F
-:10B93000001E7318FFE59316FF6C74A5001E949605
-:10B94000FF6474A4FFE59496FF648316FF7CF4847F
-:10B950004F5876B5FFF0C6184A007630FFFA4631E8
-:10B960000000F30200FFC6303400F482FF00C6B4CA
-:10B970004C00C6306800F62F2800872E0000831682
-:10B98000FF34C73847C07739FFF07319001093169A
-:10B99000FF347499FFF8F30200FFC7383400C7245E
-:10B9A00070009716FF34249400CA84A6000077A57F
-:10B9B000001E77BCFFE5C4A47FC074A5FFF083160A
-:10B9C000FF3CF4AF2800F4844F58871A0000C528C4
-:10B9D0004A007528FFFA8316FF6C45290000F4829F
-:10B9E00000FFC5284C008496FF3CC73837C0773924
-:10B9F000FFF0F302FF00C7383400C5287000F527B8
-:10BA00002800872600008316FF648416FF7CC73851
-:10BA100037C07739FFF0F48200FFC7384C00831637
-:10BA2000FF3CC39C7000E000BEE4F39B2800F704D9
-:10BA3000407CF6044074C7387000C7307000073887
-:10BA4000002686BA00007739001E7738FFE5C6B4B5
-:10BA500077C077B40008703EFFE8470C0001D700BC
-:10BA60000A70203A0000E600BA7D25800007E00059
-:10BA7000BEE404200040E000BAD8C42C0000C73067
-:10BA80004200849600007538FFFA0624000A202E32
-:10BA90000007EE00BAD40730000E86BA00007739EE
-:10BAA000001E7738FFE5C6B477C076B5FFF0F70221
-:10BAB00000FFC6B4740047290000C0367200470C6E
-:10BAC0000001203A0000E600BA7406300002E000EF
-:10BAD000BA8C05AC0001F402000807200007203AE8
-:10BAE000000EE200BBA4C5A0400083160000F504D0
-:10BAF000407CF48200FFF6044F58C598580005AC0E
-:10BB0000002686AE0000772D001E7738FFE5C618A8
-:10BB100062007630FFFA46310000C6304C00C6B4F1
-:10BB200077C076B5FFF0772900107739FFF8C6B4F3
-:10BB30004C00C7386800F72F2800F5844074C528EA
-:10BB40005000C5AC500005AC002686AE0000772D35
-:10BB5000001E7738FFE5752D001E7528FFE5C6B479
-:10BB600077C076B5FFF0F702FF00C6B47400C630A8
-:10BB70006800F62F2800872E000076A1001076B509
-:10BB8000FFF8C73857C07739FFF0C7384C00C6B444
-:10BB90007000E000BBF8F6AF2800F4044F58E00056
-:10BBA000BEE404200040F6044F5883160000F7045A
-:10BBB000407CF5844074C61862007630FFFAC738BE
-:10BBC0007000C5AC700005AC002686AE0000772D75
-:10BBD000001E7738FFE546310000C6B477C076B561
-:10BBE000FFF0F70200FFC6307400F702FF00C6B492
-:10BBF0007400C6306800F62F280023800007201E3E
-:10BC00000007EE00BEE0C71C38008496000000006C
-:10BC10000001C72470000738002686BA0000F584AA
-:10BC20004F587739001E7738FFE5C6B477C076B530
-:10BC3000FFF0F70200FFC6B67400E600BC792036BC
-:10BC40000001E600BC7977350006A6BA5802C7386D
-:10BC500058007639001E7630FFE5C6B467C076B569
-:10BC6000FFF020360002E600BC7DC6B80000C72CFD
-:10BC70000000E000BC7CC6B80000F6844F58F70412
-:10BC80004F58C5340000C02A7200E600BED906A88D
-:10BC9000001C83160000000000019313FFFC969324
-:10BCA000FFFCF4863BB49493FFFC9396FF4C9516EF
-:10BCB000FF449696FF4007880008E00123409793D1
-:10BCC000FFFCF3044F5CF48200009496FF5C8696C0
-:10BCD000FF408396FF4C8516FF449316FF34861A67
-:10BCE00000089696FF3C871A000400000001C0324D
-:10BCF0007200EC00BDB89616FF9C77310001C73882
-:10BD0000600077390002C63830000630000C86B279
-:10BD10000000872A001C8596FF5CC0367200E60092
-:10BD2000BD40C404000086B20004872A0020000041
-:10BD30000001C0367200E600BD44202E0000F582EE
-:10BD40000001202E0000E600BD5100000001F402B9
-:10BD500000008316FF3C86B20000871A0000000036
-:10BD60000001C0367200E200BD90F5820000C036CE
-:10BD70007200E600BD98202E000086B20004871AEB
-:10BD8000000400000001C0367200E200BD99202EC0
-:10BD90000000F5820001202E0000E600BDA920224F
-:10BDA0000000F402000120220000E600BDB80000FF
-:10BDB0000001F48200019496FF5C8316FF5C000092
-:10BDC0000001201A0000E600BDF9F6020001871606
-:10BDD000FF9C8496FF3476B90001C6B4700076B536
-:10BDE0000002C6B4480006B4001486B600009716D8
-:10BDF000FFA0E000BE709696FFA42714006497137E
-:10BE0000FFFC8316FF3C000000019313FFFC8496A7
-:10BE1000FF34000000019493FFFC9396FF4C9516AD
-:10BE2000FF4407880008E00125689793FFFC83968C
-:10BE3000FF4C8516FF4420220000E600BE71F6028A
-:10BE400000008716FF9C8316FF3476B90001C6B444
-:10BE5000700076B50002C6B4300006B4001486B691
-:10BE600000009716FFA09696FFA4971A0008F60206
-:10BE7000000120320000E600BE99F606429CF7045D
-:10BE8000429C76B1001E76B4FFE5C7386FC07739A3
-:10BE9000FFF007380001F7332800F7044F5800007F
-:10BEA0000001C72872007738FFFA4739000097135E
-:10BEB000FFFC0728001C9713FFFCF4844F5C000074
-:10BEC00000019493FFFC9396FF4C07880008E00163
-:10BED00023409793FFFC8396FF4CE000BBFC039C40
-:10BEE0000001841600008796FFFC8296FFF802147A
-:10BEF0000004013C0000000000019293FFFC02904E
-:10BF0000000822100060851600008616000406A8AE
-:10BF10000018C7306000C5B8680020320007EE0086
-:10BF2000BF64072C000E86BA00007739001E7738F0
-:10BF3000FFE5C6B477C076B5FFF0F70200FFC6B4E0
-:10BF4000740020360000470C0001D7000A70203A28
-:10BF50000000E600BF6105AC0002E000BF1806303B
-:10BF6000000120320007EE00C04C06A80016F505BF
-:10BF70004074F605407CF3020006F3054254961324
-:10BF8000FFFC052800029516FFC49513FFFC2394BF
-:10BF900000209396FFBC9393FFFC9616FFAC078896
-:10BFA0000008E000D0DC9793FFFC8496FFC42314C4
-:10BFB00000389493FFFC9316FFB49313FFFC07889B
-:10BFC0000008E000D2589793FFFC8702FF348616E2
-:10BFD000FFACF70542649613FFFC9713FFFC8396B2
-:10BFE000FFB4000000019393FFFC8496FFBC0000A7
-:10BFF00000019493FFFC07880008E000F7C89793BE
-:10C00000FFFC20220000E600C01DF3063AD8F7042A
-:10C0100042540000000127380001F7054254F3059F
-:10C020004244F38217709393FFFCF482001B9493B5
-:10C03000FFFCF30642449313FFFC07880008E0016D
-:10C040001EC09793FFFCE000C1A0000000018736EE
-:10C050000000F5844F58F4063B7076B5001E76B4A8
-:10C06000FFE5C7386FC07738FFF076390006A72E96
-:10C070006002C52C600076A9001E76B4FFE5C738C3
-:10C080006FC07739FFF077390003C73840000738B1
-:10C09000000286BA00007739001E7738FFE5C6B483
-:10C0A00077C076B7FFF0EE00C1159696FF9CA72EDD
-:10C0B000600276A9001E76B4FFE58396FF9CC73820
-:10C0C0006FC07739FFF077390003C738400086BA70
-:10C0D0000004249400607739001E7738FFE5C6B469
-:10C0E00077C076B5FFF0A6AA6802771D0003C738AF
-:10C0F00068002738000883BA0004833A0000000073
-:10C10000000193A60004932600008596FFA4E0009A
-:10C11000C13823000007A72E600276A9001E76B45E
-:10C12000FFE5C7386FC07739FFF077390003C738AC
-:10C13000400085BA0004230000079313FFFC872A00
-:10C14000000076A9001E76B4FFE58396FF9CF606F4
-:10C150003B70C7386FC07739FFF077390003A6BA54
-:10C160006002201E0000C73860007739001E773853
-:10C17000FFE5C6B477C0EE00C18D76B5FFF08496BA
-:10C18000FFA0000000017725FFF0C6B86800C728AF
-:10C1900068009713FFFC07880008C12C00009793E4
-:10C1A000FFFC8796FFFC8296FFF802140008013C12
-:10C1B0000000000000019293FFFC02900008221092
-:10C1C000007025000007202A0007EE00C3B8C7282A
-:10C1D00050008316000000000001C71870000738E7
-:10C1E000002686BA0000F5844F587739001E77384C
-:10C1F000FFE5C6B477C076B5FFF0F70200FFC6B61C
-:10C200007400E600C23D20360001E600C23D7735ED
-:10C210000006A6BA5802C73858007639001E763094
-:10C22000FFE5C6B467C076B5FFF020360002E60031
-:10C23000C24DC03A5A00E000C248C72C0000F704C3
-:10C240004F58F5844F5800000001C03A5A00E600EC
-:10C25000C3B1F4863B908396000000000001069C69
-:10C2600000168736000076B5001E76B4FFE5C738A5
-:10C270006FC07738FFF076390006A72E6002C52C14
-:10C28000600076A9001E76B4FFE5C7386FC0773925
-:10C29000FFF077390003C73848000738000286BA34
-:10C2A00000007739001E7738FFE5C6B477C076B74F
-:10C2B000FFF0EE00C3219696FF8CA72E600276A9B0
-:10C2C000001E76B4FFE58316FF8CC7386FC0773940
-:10C2D000FFF077390003C738480086BA0004249479
-:10C2E00000707739001E7738FFE5C6B477C076B5A1
-:10C2F000FFF0A6AA680277190003C738680027383C
-:10C30000000883BA0004833A00000000000193A6ED
-:10C310000004932600008616FF94E000C34400004A
-:10C320000001A72E600276A9001E76B4FFE5F30691
-:10C330003B90C7386FC07739FFF077390003C738B3
-:10C340003000863A0004872A000076A9001E76B4E1
-:10C35000FFE58396FF8CF4863B90C7386FC0773932
-:10C36000FFF077390003A6BA4802201E0000C73844
-:10C3700048007739001E7738FFE5C6B477C0EE0075
-:10C38000C39576B5FFF08316FF9000000001771982
-:10C39000FFF0C6B86800C72868009713FFFC07883D
-:10C3A0000008C13000009793FFFCE000C5C4000006
-:10C3B0000001E000C1C40528000183960000F4825A
-:10C3C0000006F4854254F60442602514001E23142E
-:10C3D00000209316FFACF3854078063000028732C8
-:10C3E000000076B1001E76B4FFE50630000275B19C
-:10C3F000001EC7386FC07738FFF0F71B2800873260
-:10C40000000075ACFFE5C7385FC07738FFF0F72B49
-:10C4100028002514001C063000028732000076B187
-:10C42000001E76B4FFE5C7386FC07738FFF0F72BF2
-:10C4300028002514001A063000028732000076B169
-:10C44000001E76B4FFE5C7386FC07738FFF0F72BD2
-:10C45000280025140018063000028732000076B14B
-:10C46000001E76B4FFE5C7386FC07738FFF0F72BB2
-:10C47000280025140016063000028732000076B12D
-:10C48000001E76B4FFE5C7386FC07738FFF0F72B92
-:10C49000280025140014063000028732000076B10F
-:10C4A000001E76B4FFE5C7386FC07738FFF0F72B72
-:10C4B000280025140012063000028732000076B1F1
-:10C4C000001E76B4FFE5C7386FC07738FFF0F72B52
-:10C4D0002800063000028732000025140010763153
-:10C4E000001E7630FFE5C73867C07738FFF0F72BBE
-:10C4F0002800071C00029713FFFC2394005093961A
-:10C50000FFA49393FFFC07880008E000D25897939C
-:10C51000FFFC8496FFA4231400389493FFFC27802B
-:10C5200000079793FFFC9316FF9C9313FFFC07886B
-:10C530000008E000CF249793FFFC8702FF34278098
-:10C540000007F7854258F705426427800007979354
-:10C55000FFFC9713FFFC8396FF9C00000001939360
-:10C56000FFFC8496FFAC000000019493FFFC078859
-:10C570000008E000F5F49793FFFC20220000E6009D
-:10C58000C59500000001F70442580000000107387B
-:10C590000001F7054258F7042D38F30639C0F305BA
-:10C5A0004244F6862C2806380001F6052D387739E6
-:10C5B0000002F382001C20320044E600C5C4B3BA76
-:10C5C0006802F0052D388796FFFC8296FFF802146A
-:10C5D0000004013C0000000000019293FFFC029067
-:10C5E000000825000007F7044074F6844F58F6044D
-:10C5F0004260C7386A0075B8FFFA0630000A202A80
-:10C600000007EE00C6480730000E86BA00007739F2
-:10C61000001E7738FFE5C6B477C076B5FFF0F702A5
-:10C6200000FFC6B47400472D0000C0367200470CEE
-:10C630000001203A0000E600C64CC3280000063086
-:10C640000002E000C5FC05280001F3020008C5183F
-:10C650003000F3844260F6044F58F704407CF484C1
-:10C660004074C51C50000528002685AA00007429C6
-:10C67000001E7420FFE5C61C62007630FFFAC6B8C3
-:10C680007000C4A4680004A4002676A5001E76B439
-:10C69000FFE5773900107739FFF846310000C5AC67
-:10C6A00047C075ADFFF0F40200FFC5AC4400C738C9
-:10C6B0005800F72B28008726000075A5001EC630FD
-:10C6C000440075ACFFE5C7386FC07739FFF0F682DC
-:10C6D000FF00C7386C00C6307000F6272800872698
-:10C6E00000007699001076B5FFF8C7385FC077393B
-:10C6F000FFF0C7384400C6B47000F6A72800939333
-:10C70000FFFCF3843BB0000000019393FFFC07881B
-:10C710000008E000D42C9793FFFCF704407C000055
-:10C720000001073800019713FFFCF38440740000F8
-:10C7300000019393FFFC07880008E000BEF8979380
-:10C74000FFFC8796FFFC8296FFF802140004013C70
-:10C750000000000000019293FFFC02900008879601
-:10C76000FFFC8296FFF802140008013C0000000064
-:10C7700000019293FFFC029000088796FFFC8296CE
-:10C78000FFF802140004013C000000000001929335
-:10C79000FFFC029000088796FFFC8296FFF80214C7
-:10C7A0000000013C0000000000019293FFFC029099
-:10C7B0000008F70642309713FFFCF7063560971321
-:10C7C000FFFC07880008E00014F49793FFFCF706CD
-:10C7D00042309713FFFCF70635EC9713FFFC0788F0
-:10C7E0000008E00014F49793FFFCF7064244971307
-:10C7F000FFFCF70636789713FFFC07880008E00077
-:10C8000014F49793FFFCF70642449713FFFCF706D6
-:10C8100037049713FFFC07880008E00014F497938F
-:10C82000FFFCF70642449713FFFCF7063790971377
-:10C83000FFFC07880008E00014F49793FFFCF7065C
-:10C8400042449713FFFCF706381C9713FFFC078838
-:10C850000008E00014F49793FFFCF7064244971396
-:10C86000FFFCF70638A89713FFFC07880008E000D4
-:10C8700014F49793FFFCF70642449713FFFCF70666
-:10C8800039349713FFFC07880008E00014F49793ED
-:10C89000FFFCF70642449713FFFCF70639C09713D5
-:10C8A000FFFC07880008E00014F49793FFFCF706EC
-:10C8B00042449713FFFCF7063A4C9713FFFC078896
-:10C8C0000008E00014F49793FFFCF7064244971326
-:10C8D000FFFCF7063AD89713FFFC07880008E00032
-:10C8E00014F49793FFFC8796FFFC8296FFF80214DE
-:10C8F0000000013C0000000000019293FFFC029048
-:10C90000000885960000F5063B90872E000076AD66
-:10C91000001E76B4FFE5C7386FC07739FFF077396E
-:10C920000003C73850000738000286BA0000773984
-:10C93000001E7738FFE5C6B477C07637FFF0EE000B
-:10C94000C99500000001872E000076AD001E76B468
-:10C95000FFE5C7386FC07739FFF077390003C73874
-:10C96000500086BA00047739001E7738FFE5C6B458
-:10C9700077C076B5FFF0A6AE680277310003C738FE
-:10C9800068002738000884BA0004843A0000E000F8
-:10C99000C9B4C5240000872E000076AD001E76B411
-:10C9A000FFE5C7386FC07739FFF077390003C73824
-:10C9B0005000853A0004872E000076AD001E76B444
-:10C9C000FFE520320000F6063B90C7386FC077398C
-:10C9D000FFF077390003A6BA6002C73860007739E4
-:10C9E000001E7738FFE5C6B477C0EE00C9F976B50A
-:10C9F000FFF07721FFF0C6B86800C72C68009713D6
-:10CA0000FFFC07880008C12800009793FFFC879669
-:10CA1000FFFC8296FFF802140004013C00000000B5
-:10CA200000019293FFFC0290000885960000F50635
-:10CA30003B70872E000076AD001E76B4FFE5C73848
-:10CA40006FC07739FFF077390003C73850000738D7
-:10CA5000000286BA00007739001E7738FFE5C6B4B9
-:10CA600077C07637FFF0EE00CABD00000001872EC8
-:10CA7000000076AD001E76B4FFE5C7386FC0773989
-:10CA8000FFF077390003C738500086BA00047739C1
-:10CA9000001E7738FFE5C6B477C076B5FFF0A6AEC6
-:10CAA000680277310003C73868002738000884BA65
-:10CAB0000004843A0000E000CADCC5240000872E90
-:10CAC000000076AD001E76B4FFE5C7386FC0773939
-:10CAD000FFF077390003C7385000853A0004839689
-:10CAE000000476AD001E76B4FFE52032000093937B
-:10CAF000FFFC872E0000F6063B70C7386FC0773901
-:10CB0000FFF077390003A6BA6002C73860007739B2
-:10CB1000001E7738FFE5C6B477C0EE00CB2976B5A6
-:10CB2000FFF07721FFF0C6B86800C72C68009713A4
-:10CB3000FFFC07880008C12800009793FFFC879638
-:10CB4000FFFC8296FFF802140008013C0000000080
-:10CB500000019293FFFC02900008F5044F58F58203
-:10CB6000000206280080202E0062EE00CB900730E5
-:10CB70000040F0332800C6B8520076B4FFFA063001
-:10CB80000014F6B32800C6380000E000CB6405AC02
-:10CB90000001F7044F580000000106B818D4F482D1
-:10CBA0000001F4B72800073818C0F03B2800F7064A
-:10CBB00042C0F4820002F4BB28008796FFFC8296F4
-:10CBC000FFF802140000013C0000000000019293F5
-:10CBD000FFFC02900008F68442C0F60642C077319E
-:10CBE000001E7738FFE575B1001EC6B477C076B475
-:10CBF000FFF0F7044F5876B50006C4386800872266
-:10CC0000001476A1001E76B4FFE5C7386FC07738F0
-:10CC1000FFF0F7332800F70442C075ACFFE5C738D2
-:10CC20005FC07738FFF0203A0001E600CC4CF606F2
-:10CC30004290F704429076B1001E76B4FFE5C73803
-:10CC40006FC07739FFF007380001F7332800879667
-:10CC5000FFFC8296FFF802140000013C0000000077
-:10CC600000019293FFFC0290000822100004851638
-:10CC70000000000000019513FFFC9516FFF40788E3
-:10CC80000008E000CD009793FFFC8516FFF42022FA
-:10CC90000000E600CCBCF58642C0F7044290F606E0
-:10CCA000429276B1001E76B4FFE5C7386FC077397F
-:10CCB000FFF007380001E000CCECF7332800F02B40
-:10CCC0002800F68442C0772D001E7738FFE506283D
-:10CCD0000014C6B477C076B4FFF0F7044F58F6B32B
-:10CCE0002800C72872007738FFFAF72F28008796A8
-:10CCF000FFFC8296FFF802140004013C00000000D3
-:10CD000000019293FFFC0290000886960000F70451
-:10CD10004F58F4020000C6B472007734FFFA273887
-:10CD20000002203A0061F702003FE200CD40C6B4A5
-:10CD3000740020360000E600CD4000000001F4023F
-:10CD400000018796FFFC8296FFF802140004013C64
-:10CD50000000000000019293FFFC0290000886167C
-:10CD600000008716000885960004C5307000C032A8
-:10CD70005200E600CDA10000000186B2000077312C
-:10CD8000001E7738FFE5C6B477C076B5FFE8F6AF8A
-:10CD9000680006300001C0325200E600CD7805ACD4
-:10CDA00000018796FFFC8296FFF80214000C013CFC
-:10CDB000000000000001000000009293FFFC0290C0
-:10CDC000000884960000841600048596000886A654
-:10CDD00000007725001E7738FFE5C6B477C07535AB
-:10CDE000FFF0202A0010E200CE0DF606428EF5027A
-:10CDF0000010F704428C76B1001E76B4FFE5C73808
-:10CE00006FC07739FFF007380001F7332800202E74
-:10CE10000001E600CE70202A0000EE00CE7107244B
-:10CE2000000225280001A5BA50028622000076A142
-:10CE3000001E76B4FFE5C73850007739001E7738FA
-:10CE4000FFE5C5AC77C0C6306FC07631FFF075AD79
-:10CE5000FFE8F68200FFF702F15475AD0002A72E3D
-:10CE60007002C6306C00C6307580F623280024207E
-:10CE7000000225A80001F302F24603A40002C4AC9C
-:10CE80003800252C0001202E0000EC00CF110000FE
-:10CE90000001E600CEA0C71C5000E000CEB4F602B0
-:10CEA0000000A69E50027739001E7738FFE5C6B411
-:10CEB00077C07635FFE886A600007725001E773814
-:10CEC000FFE52528000225AC0002C6B477C076B580
-:10CED000FFE877310004C738620077390001C738AE
-:10CEE0003000C6B46800C6B4700006B4000E8736C1
-:10CEF000000024A4000276B5001E76B4FFE5C73812
-:10CF00006FC07738FFF0F7232800E000CE8424209C
-:10CF100000028796FFFC8296FFF80214000C013C89
-:10CF20000000000000019293FFFC029000088616AA
-:10CF3000000883160004839600008732000076B153
-:10CF4000001E76B4FFE5059C0002749D001E74A4CB
-:10CF5000FFE5741D001E063000027531001EC73843
-:10CF60006FC07738FFF0F71F280087320000752860
-:10CF7000FFE5C73857C07738FFF0F72F280005AC1A
-:10CF80000002063000028732000076B1001E76B43F
-:10CF9000FFE5C7386FC07738FFF0F72F280005ACE2
-:10CFA0000002063000028732000076B1001E76B41F
-:10CFB000FFE5C7386FC07738FFF0F72F280005ACC2
-:10CFC0000002063000028732000076B1001E76B4FF
-:10CFD000FFE5C7386FC07738FFF0F72F280005ACA2
-:10CFE0000002063000028732000076B1001E76B4DF
-:10CFF000FFE5C7386FC07738FFF0F72F280005AC82
-:10D000000002063000028732000076B1001E76B4BE
-:10D01000FFE5C7386FC07738FFF0F72F280005AC61
-:10D020000002063000028732000076B1001E76B49E
-:10D03000FFE5C7386FC07738FFF0F72F28000630BC
-:10D0400000028732000005AC00027631001E763007
-:10D05000FFE5C73867C07738FFF0F72F2800871E35
-:10D0600000007420FFE5C7384FC07739FFF007385C
-:10D070000001F71F2800871E0000049C0002C7382B
-:10D0800047C07739FFF025380001202A0000EE0064
-:10D09000D0BD26280001A7266002C6A4600076B590
-:10D0A000001E76B4FFE5C5A45000C5300000C738A7
-:10D0B0006FC07739FFE8E000D088F72F6800071CC1
-:10D0C0000002F33B6800C41C00008796FFFC8296B8
-:10D0D000FFF80214000C013C0000000000019293D4
-:10D0E000FFFC0290000886160004841600008732B8
-:10D0F000000076B1001E76B4FFE505A0000274A121
-:10D10000001E74A4FFE5063000027531001EC7380A
-:10D110006FC07738FFF0F7232800873200007528AA
-:10D12000FFE5C73857C07738FFF0F72F280005AC68
-:10D130000002063000028732000076B1001E76B48D
-:10D14000FFE5C7386FC07738FFF0F72F280005AC30
-:10D150000002063000028732000076B1001E76B46D
-:10D16000FFE5C7386FC07738FFF0F72F280005AC10
-:10D170000002063000028732000076B1001E76B44D
-:10D18000FFE5C7386FC07738FFF0F72F280005ACF0
-:10D190000002063000028732000076B1001E76B42D
-:10D1A000FFE5C7386FC07738FFF0F72F280005ACD0
-:10D1B0000002063000028732000076B1001E76B40D
-:10D1C000FFE5C7386FC07738FFF0F72F280005ACB0
-:10D1D0000002063000028732000076B1001E76B4ED
-:10D1E000FFE5C7386FC07738FFF0F72F280005AC90
-:10D1F0000002063000028732000006A000027631ED
-:10D20000001E7630FFE5C73867C07738FFF0F72F8C
-:10D210002800872200007621001E85960008C73866
-:10D220004FC07739FFF0C6B47000F5B768008722A9
-:10D2300000007630FFE5C73867C07739FFF0073860
-:10D240000001F72328008796FFFC8296FFF802145E
-:10D25000000C013C0000000000019293FFFC0290D2
-:10D2600000082210002027140020F03B280084969C
-:10D270000004F502000086A600007625001E763028
-:10D28000FFE504240002C6B467C076B4FFF0F6BB25
-:10D2900028008726000076A5001E76B4FFE5C73873
-:10D2A0006FC07739FFF0C02A7200EC00D2F876A583
-:10D2B000001E8726000076B4FFE5062800012594AD
-:10D2C000001EC5AC5000C5300000C7386FC07739AC
-:10D2D000FFF0C7385200A6A27002C720700077394D
-:10D2E000001E7738FFE5C6B477C076B5FFE8C68084
-:10D2F0006A00E000D290F6AF68008716FFE076156E
-:10D30000001E7630FFE5839600002314001E7599F9
-:10D31000001E75ACFFE57515001E7528FFE57495B8
-:10D32000001E74A4FFE57415001E7420FFE5069C22
-:10D3300000027395001E9396FFDCC73867C0839682
-:10D3400000007738FFF0F71F28008396FFDC871A6C
-:10D350000000739CFFE59396FFDCC7385FC0773809
-:10D36000FFF0F737280006B400028716FFE4231405
-:10D37000001A7619001E7630FFE5C73857C0773897
-:10D38000FFF0F7372800871A000006B40002C738FC
-:10D3900067C07738FFF0F737280006B40002871619
-:10D3A000FFE8231400167619001E7630FFE5C73813
-:10D3B0004FC07738FFF0F7372800871A000006B40F
-:10D3C0000002C73867C07738FFF0F737280006B487
-:10D3D00000028716FFEC231400127619001E763027
-:10D3E000FFE5C73847C07738FFF0F7372800871ABE
-:10D3F000000006B4000284160000C73867C0773802
-:10D40000FFF0F73728008716FFF006B40002C73890
-:10D410003FC07738FFF0F73728008796FFFC8296E9
-:10D42000FFF802140008013C000000000001929384
-:10D43000FFFC029000088616000084160004F684A3
-:10D440004F5887320014033000147519001E7528D8
-:10D45000FFE5C3A06A00739CFFFA04A0001475A541
-:10D46000001EC6306A007630FFFAC73857C07738DA
-:10D47000FFF0F7272800F39B280007200016F63B53
-:10D4800028008722001475ACFFE5C7385FC07738E5
-:10D49000FFF077390006C6B4700006B40016F3B783
-:10D4A00028008796FFFC8296FFF802140008013CD2
-:10D4B0000000000000019293FFFC02900008861615
-:10D4C0000000F5844F5805300016872A000076A921
-:10D4D000001E76B4FFE5C7386FC07738FFF07739A4
-:10D4E0000006C42C7000C0226200E600D52906A008
-:10D4F000001687360000C6305A007630FFFA76B53F
-:10D50000001E76B4FFE5C7386FC07738FFF0773973
-:10D51000000676B8FFFAF6AB2800C72C7000073873
-:10D520000014E000D52CF63B2800C42C00008796A0
-:10D53000FFFC8296FFF802140004013C000000008A
-:10D5400000019293FFFC02900008F7064F844738D1
-:10D55000FFFCF7056F30F686505C46B4FFFCF6859D
-:10D560006E50F7066E7C4738FFFCF7056E540734A3
-:10D57000191CF7054F5CF70200649736191CF70277
-:10D5800000009736192006B4001CF6854F58879680
-:10D59000FFFC8296FFF802140000013C000000002E
-:10D5A00000019293FFFC0290000822100090F30209
-:10D5B000FFFFF3054F54F38200009396FFAC231452
-:10D5C00000209316FF9C239400389396FF948316B3
-:10D5D000FFACF7044F5CF382000C9396FF74931634
-:10D5E000FF8C873A0004000000019716FFA4831601
-:10D5F000FFAC8396FFA400000001C01A3A00EC00C3
-:10D60000DB78F30204BCF7044F5C8316FF74000060
-:10D610000001C7383000873A0008F6844F58773940
-:10D620000006C4B470009493FFFC9496FF7C0788B6
-:10D630000008E000CD009793FFFC8496FF7C202239
-:10D640000000E600D654C5040000F7044288E0005C
-:10D65000D87CF6064288F6044F5C83960000831659
-:10D66000FF74869E0000A7323002F5820000C036AB
-:10D670007200E600D694C6303000869E00048732E1
-:10D68000000400000001C0367200E600D698202E8B
-:10D690000000F5820001202E0000E600D6A5000063
-:10D6A0000001F50200008396000087320000869E8C
-:10D6B000000000000001C0367200E200D6E4F582EE
-:10D6C0000000C0367200E600D6EC202E0000869ED8
-:10D6D00000048732000400000001C0367200E2003E
-:10D6E000D6ED202E0000F5820001202E0000E6007D
-:10D6F000D6FD202A0000F5020001202A0000E600E5
-:10D70000D72804A400028316FFACF70642C883960C
-:10D71000FF8CF3054F54C71C7000F03B28000738FE
-:10D720000002E000DB50F03B28009496FF6C872657
-:10D73000000076A5001E76B4FFE58316FF6C839685
-:10D74000FF9C2494001E0618000275B1001E75ACE3
-:10D75000FFE5C7386FC07738FFF0F71F2800873222
-:10D760000000751D001E7528FFE5C7385FC07738BB
-:10D77000FFF0F72728002494001C063000028732AF
-:10D78000000076B1001E76B4FFE5C7386FC0773869
-:10D79000FFF0F72728002494001A06300002873291
-:10D7A000000076B1001E76B4FFE5C7386FC0773849
-:10D7B000FFF0F72728002494001806300002873273
-:10D7C000000076B1001E76B4FFE5C7386FC0773829
-:10D7D000FFF0F72728002494001606300002873255
-:10D7E000000076B1001E76B4FFE5C7386FC0773809
-:10D7F000FFF0F72728002494001406300002873237
-:10D80000000076B1001E76B4FFE5C7386FC07738E8
-:10D81000FFF0F72728002494001206300002873218
-:10D82000000076B1001E76B4FFE5C7386FC07738C8
-:10D83000FFF0F7272800063000028732000024940A
-:10D8400000107631001E7630FFE5C73867C07738A4
-:10D85000FFF0F72728008716FFE0F682FFFCC738A5
-:10D8600057C07739FFF007380003C4B86C00202692
-:10D870000010E200D89DF606428AF704428876B18D
-:10D88000001E76B4FFE5F4020000C7386FC0773998
-:10D89000FFF007380001E000DBA0F7332800831613
-:10D8A000FF6C251400368396FF94871A0000769942
-:10D8B000001E76B4FFE50618000275B1001EC738D9
-:10D8C0006FC07738FFF0F71F28008732000075AC73
-:10D8D000FFE5C7385FC07738FFF0F72B2800251425
-:10D8E0000034063000028732000076B1001E76B4A4
-:10D8F000FFE5C7386FC07738FFF0F72B28002514F5
-:10D900000032063000028732000076B1001E76B485
-:10D91000FFE5C7386FC07738FFF0F72B28002514D4
-:10D920000030063000028732000076B1001E76B467
-:10D93000FFE5C7386FC07738FFF0F72B28002514B4
-:10D94000002E063000028732000076B1001E76B449
-:10D95000FFE5C7386FC07738FFF0F72B2800251494
-:10D96000002C063000028732000076B1001E76B42B
-:10D97000FFE5C7386FC07738FFF0F72B2800251474
-:10D98000002A063000028732000076B1001E76B40D
-:10D99000FFE5C7386FC07738FFF0F72B2800251454
-:10D9A0000028063000028732000026A4000274A47A
-:10D9B000FFFF7631001E7630FFE5C73867C0773845
-:10D9C000FFF0F72B28009013FFFC8316FF8CF7065F
-:10D9D00042CCC7187000C73868009713FFFC9393B8
-:10D9E000FFFC9496FF7C07880008E000CDB8979371
-:10D9F000FFFC8396FF6C2414004E25140050831600
-:10DA0000FF8C8496FF7C871E0000769D001E76B4F6
-:10DA1000FFE5061C000275B1001E75ACFFE5C738B6
-:10DA20006FC07738FFF0F72B280087320000752988
-:10DA3000001E7528FFE5C7385FC07738FFF0F72371
-:10DA400028002414004C063000028732000076B112
-:10DA5000001E76B4FFE5C7386FC07738FFF0F723B4
-:10DA600028002414004A063000028732000076B1F4
-:10DA7000001E76B4FFE5C7386FC07738FFF0F72394
-:10DA8000280024140048063000028732000076B1D6
-:10DA9000001E76B4FFE5C7386FC07738FFF0F72374
-:10DAA000280024140046063000028732000076B1B8
-:10DAB000001E76B4FFE5C7386FC07738FFF0F72354
-:10DAC000280024140044063000028732000076B19A
-:10DAD000001E76B4FFE5C7386FC07738FFF0F72334
-:10DAE000280024140042063000028732000076B17C
-:10DAF000001E76B4FFE5C7386FC07738FFF0F72314
-:10DB000028000630000287320000241400407631DD
-:10DB1000001E7630FFE5C73867C07738FFF0F7237F
-:10DB200028008696FFB0F60642C8C6186000F702C5
-:10DB30000003C6B457C076B5FFF0C6B47400F70250
-:10DB40000004C7386A00F733280006300002F4B337
-:10DB500028008396FF8C8316FF74039C0014939611
-:10DB6000FF8C0318000C8396FFAC9316FF74039C84
-:10DB70000001E000D5EC9396FFAC9313FFFCF38417
-:10DB80004F5C000000019393FFFCF3064A98931347
-:10DB9000FFFC07880008E00126F89793FFFCF402D9
-:10DBA00000018796FFFC8296FFF802140004013CF6
-:10DBB0000000000000019293FFFC02900008221078
-:10DBC00001A0F5020000F3846E50F602001C202A2A
-:10DBD0000063EE00DC08C59C6000A69E6002772D05
-:10DBE000001E7738FFE5C6B477C076B5FFF0203663
-:10DBF0000003E600DBFC072C0036F03B2800063073
-:10DC00000040E000DBCC05280001F5844F5C0000FB
-:10DC1000000186AE0008F4020000872E0004000018
-:10DC20000001C0367200EC00DCF09696FFEC773510
-:10DC30000001C738680077390002C638580006303E
-:10DC4000000CC38400008316000086B20000871A0F
-:10DC5000000000000001C0367200E600DC7CC52038
-:10DC6000000086B20004871A000400000001C036DC
-:10DC70007200E600DC80202A0000F5020001202A64
-:10DC80000000E600DC8D00000001F38200008496B5
-:10DC9000000086B200008726000000000001C036A8
-:10DCA0007200E200DCCCF5020000C0367200E60033
-:10DCB000DCD4202A000086B200048726000400007D
-:10DCC0000001C0367200E200DCD5202A0000F50217
-:10DCD0000001202A0000E600DCE5201E0000F3829F
-:10DCE0000001201E0000E600DCF420220000F40207
-:10DCF000000120220000E600DD29F602000187165F
-:10DD0000FFEC0000000176B90001C6B4700076B5E2
-:10DD10000002C6B4580006B4001486B60000971678
-:10DD2000FFF0E000DD989696FFF427140014971397
-:10DD3000FFFC83160000000000019313FFFC959385
-:10DD4000FFFC9596FE7007880008E0012568979310
-:10DD5000FFFC8596FE7020220000E600DD95F602AD
-:10DD600000018716FFEC0000000176B90001C6B47F
-:10DD7000700076B50002C6B4580006B4001486B62A
-:10DD800000009716FFF09696FFF4972E0008E0002B
-:10DD9000DD9C20320000F602000020320000E60088
-:10DDA000DDB0F4820000F704427CE000E09CF6065F
-:10DDB000427E9496FF448716FFF4F6044F58773955
-:10DDC0000006C73070009716FF5406B8001A873651
-:10DDD00000008316FF5476B5001E76B4FFE5C73801
-:10DDE0006FC09313FFFC7738FFF077390006C63019
-:10DDF00070009616FF4C07880008E000CD0097934E
-:10DE0000FFFC20220000E600DE35F30200018496CC
-:10DE1000FF4C000000019493FFFC07880008E0001D
-:10DE2000CD009793FFFC20220000E600DE380000C2
-:10DE30000001F30200019316FF448496FF440000A2
-:10DE4000000120260000E600DE59F60642A4F70491
-:10DE500042A4E000E0A076B1001E8316FF4C8616B7
-:10DE6000FF4C871A00007699001E76B4FFE5C7388C
-:10DE70006FC07739FFF0203A0002E600DE8500002F
-:10DE80000001F6044F58F5844F5800000001C032DD
-:10DE90005A00E600E025000000018496FF4C0000D7
-:10DEA000000106A4001A873600008316FF5476B5D9
-:10DEB000001E76B4FFE5C7386FC07738FFF07739BA
-:10DEC0000006C72C7000C03A3200E600DEDDF60620
-:10DED0004280F7044280E000E0A076B1001E2614E4
-:10DEE0000030F03328008716FFD07631001E7630E0
-:10DEF000FFE58496FF4C2314002E9316FE6475995B
-:10DF0000001E75ACFFE57515001E7528FFE573153D
-:10DF1000001E7318FFE59316FF348316FE64042475
-:10DF2000000206A000027495001E74A4FFE59496FA
-:10DF3000FF3C7495001EC73867C07738FFF0F723A1
-:10DF40002800871A000074A4FFE59496FF2CC738B8
-:10DF50005FC07738FFF0F737280006B40002871655
-:10DF6000FFD42494002A9496FE647625001E763011
-:10DF7000FFE5C73857C07738FFF0F7372800872606
-:10DF8000000006B40002C73867C07738FFF0F737E3
-:10DF9000280006B400028716FFD823140026931623
-:10DFA000FE647619001E8496FF3C7630FFE5C73884
-:10DFB0004FC07738FFF0F7372800871A000006B403
-:10DFC00000028496FF34C73867C07738FFF0F73710
-:10DFD000280006B400028716FFDC231400229316E3
-:10DFE000FE647619001E7630FFE5C7384FC07738DB
-:10DFF000FFF0F7372800871A000006B40002C73880
-:10E0000067C07738FFF0F73728008716FFE08316E0
-:10E01000FF2C06B40002C73837C07738FFF0E000A5
-:10E02000EAA0F737280007880008E000CBCC9793D8
-:10E03000FFFC06A00002F7044F58F037280006A0A6
-:10E0400000149416FF24C72072007738FFFAF737C0
-:10E05000280006A00016F7372800F4820001F4A378
-:10E0600028009413FFFC07880008E000CD00979378
-:10E07000FFFC20220000E600E0BC26940048F704E4
-:10E080004280E000E09CF60642828696FEF4E000C4
-:10E09000E29400000001F7044284F606428476B15F
-:10E0A000001E76B4FFE5F4020000C7386FC0773970
-:10E0B000FFF007380001E000EAA4F73328008316D8
-:10E0C000FF4C7515001E7528FFE59316FF1C0718F9
-:10E0D0000036F4820001F4BB2800F03728008716D0
-:10E0E000FFB876B5001E76B4FFE5041800020620DE
-:10E0F0000002231400469316FF147599001E75AC98
-:10E10000FFE57495001E74A4FFE59496FF0C73154B
-:10E11000001E7318FFE59316FF047495001E74A487
-:10E12000FFE59496FEFC230000079316FEF4849608
-:10E13000FF1C8316FF1404A4000A9496FE7CC738C3
-:10E140006FC07738FFF0F7232800F6844F58849685
-:10E15000FF54871A0000C6A46A007434FFFAC73857
-:10E160005FC07738FFF0F7332800063000028716CB
-:10E17000FFBC231400429316FF147699001E76B458
-:10E18000FFE5C73857C07738FFF0F7332800871A04
-:10E19000000006300002C7386FC07738FFF0F73351
-:10E1A0002800063000028716FFC02494003E949693
-:10E1B000FF1476A5001E8316FF0C76B4FFE5C73862
-:10E1C00037C07738FFF0F733280087260000063085
-:10E1D0000002C7386FC07738FFF0F73328000630E9
-:10E1E00000028716FFC42494003A9496FF1476A583
-:10E1F000001E8316FF0476B4FFE5C73837C07738B2
-:10E20000FFF0F73328008726000006300002C738E9
-:10E210006FC07738FFF0F73328008716FFC8849661
-:10E22000FEFC06300002C7384FC07738FFF0F733E6
-:10E2300028008316FEF400000001201A0007EE00FB
-:10E24000E294F68200088496FE7C00000001072418
-:10E25000000E86BA00007739001E7738FFE5C6B495
-:10E2600077C076B5FFF0F70200FFC6B4740047210F
-:10E270000000C0367200470C0001203A0000E600A2
-:10E28000E08804A400029496FE7C03180001E000DC
-:10E29000E2309316FEF48316FF1C000000010718FD
-:10E2A0000038F6BB28009313FFFC8496FF2400007F
-:10E2B00000019493FFFC07880008E000D42C97939A
-:10E2C000FFFC231400789316FEBC849600002314F0
-:10E2D00000A886A60004872600009316FE9CC6B4FC
-:10E2E00070009696FEECF7020001C7347400971692
-:10E2F000FEE48496FF24000000019493FFFC07884D
-:10E300000008E000D4B49793FFFCF7044F580000D6
-:10E310000001C0227200E600EAA19416FF1C86A24A
-:10E3200000387721001E7738FFE5F30200009316CE
-:10E33000FED4C6B477C076B5FFF09696FEDC849620
-:10E34000FED4000000012026000EEE00E2F0F302F1
-:10E35000000F9313FFFC8316FEEC00000001C718AA
-:10E3600048009713FFFC07880008E00127E897930F
-:10E37000FFFCC3A000008496FEE4000000012026FC
-:10E380000000E600E38D239C0007C3803A00C71C11
-:10E3900038008316FF1CF48200FFF6044F58C7189C
-:10E3A00070000738002686BA00009716FEC4773939
-:10E3B000001E7738FFE5C6B477C076B5FFF0C6B467
-:10E3C0004C0076B50006C330680007300040C01A24
-:10E3D0007200E600E40D9316FECC9313FFFC9396B7
-:10E3E000FE749616FE6C9696FE6807880008E0009C
-:10E3F000CD009793FFFC8396FE748616FE6C86967E
-:10E40000FE6820220000E600E09500000001F5848F
-:10E410004F588496FECC072C0040C0267200E600C0
-:10E42000EA8D00000001A732680276A5001E76B4CE
-:10E43000FFE58616FECCC7386FC07739FFF0203A6B
-:10E440000002E600E451C0325A00C62C0000C0327F
-:10E450005A00E600E6E5251400768316FF1C849634
-:10E46000FEBC061800028732000076B1001E76B4AA
-:10E47000FFE58316FEDC0630000275B1001EC738CA
-:10E480006FC07738FFF0F72728008732000075AC9F
-:10E49000FFE5C7385FC07738FFF0F72B2800251459
-:10E4A0000074063000028732000076B1001E76B498
-:10E4B000FFE5C7386FC07738FFF0F72B2800251429
-:10E4C0000072063000028732000076B1001E76B47A
-:10E4D000FFE5C7386FC07738FFF0F72B2800251409
-:10E4E0000070063000028732000076B1001E76B45C
-:10E4F000FFE5C7386FC07738FFF0F72B28002514E9
-:10E50000006E063000028732000076B1001E76B43D
-:10E51000FFE5C7386FC07738FFF0F72B28002514C8
-:10E52000006C063000028732000076B1001E76B41F
-:10E53000FFE5C7386FC07738FFF0F72B28002514A8
-:10E54000006A063000028732000076B1001E76B401
-:10E55000FFE5C7386FC07738FFF0F72B280006308B
-:10E56000000287320000251400687631001E7630E4
-:10E57000FFE5C73867C07738FFF0F72B2800C71CC6
-:10E5800032009713FFFC9493FFFC2614006096134F
-:10E59000FFFC9616FE6C07880008E000D0DC97931D
-:10E5A000FFFC8716FFA08616FE6C8496FECC231413
-:10E5B000005E9316FE5C7599001E75ACFFE5741540
-:10E5C000001E7420FFE57315001E7318FFE59316F7
-:10E5D000FEAC8316FE5C7631001E7630FFE5052426
-:10E5E000000206A800027495001E74A4FFE594962C
-:10E5F000FEB47495001EC73867C07738FFF0F72B5C
-:10E600002800871A000074A4FFE59496FEA4C7387A
-:10E610005FC07738FFF0F737280006B4000287168E
-:10E62000FFA42494005A9496FE5C7625001E83165F
-:10E63000FEB47630FFE5C73837C07738FFF0F737DC
-:10E6400028008726000006B40002C73867C0773864
-:10E65000FFF0F737280006B400028716FFA82494BD
-:10E6600000569496FE5C7625001E7630FFE5C7388E
-:10E6700047C07738FFF0F73728008726000006B438
-:10E680000002C73867C07738FFF0F737280006B4B4
-:10E6900000028716FFAC231400529316FE5C761915
-:10E6A000001E8496FEAC7630FFE5C7384FC0773841
-:10E6B000FFF0F7372800871A000006B40002C738B9
-:10E6C00067C07738FFF0F73728008716FFB083164A
-:10E6D000FEA406B40002C73837C07738FFF0E00068
-:10E6E000EA8CF73728008496FECC0000000104A4D1
-:10E6F00000369496FE5C8726000076A5001E76B450
-:10E70000FFE5C7386FC07739FFF0203A0000470CAB
-:10E710000001203A0000E600EA8D000000018316A7
-:10E72000FECC8496FF1C0618003A85B20000072430
-:10E73000003A86BA00007631001E7630FFE5773960
-:10E74000001E7738FFE5C5AC67C0C6B477C075ADAD
-:10E75000FFF076B5FFF0C02E6A00EC00E764F5022A
-:10E760000002F50200018316FF1C000000010718DB
-:10E77000003686BA00007739001E7738FFE5C6B448
-:10E7800077C076B5FFF020360002E600E79C000077
-:10E790000001202A0001E600EA8D000000018496B5
-:10E7A000FE5C8316FF1CF52728000618000287323E
-:10E7B000000076B1001E76B4FFE5251400A684960D
-:10E7C000FE9C8316FEDC0630000275B1001EC738C1
-:10E7D0006FC07738FFF0F72728008732000075AC4C
-:10E7E000FFE5C7385FC07738FFF0F72B2800251406
-:10E7F00000A4063000028732000076B1001E76B415
-:10E80000FFE5C7386FC07738FFF0F72B28002514D5
-:10E8100000A2063000028732000076B1001E76B4F6
-:10E82000FFE5C7386FC07738FFF0F72B28002514B5
-:10E8300000A0063000028732000076B1001E76B4D8
-:10E84000FFE5C7386FC07738FFF0F72B2800251495
-:10E85000009E063000028732000076B1001E76B4BA
-:10E86000FFE5C7386FC07738FFF0F72B2800251475
-:10E87000009C063000028732000076B1001E76B49C
-:10E88000FFE5C7386FC07738FFF0F72B2800251455
-:10E89000009A063000028732000076B1001E76B47E
-:10E8A000FFE5C7386FC07738FFF0F72B2800063038
-:10E8B000000287320000251400987631001E763061
-:10E8C000FFE5C73867C07738FFF0F72B2800C71C73
-:10E8D00032009713FFFC9493FFFC261400909613CC
-:10E8E000FFFC9616FE6C07880008E000D0DC9793CA
-:10E8F000FFFC8716FF708616FE6C8496FECC239470
-:10E90000008E759D001E75ACFFE57315001E731813
-:10E91000FFE59316FE947415001E7420FFE5731531
-:10E92000001E7318FFE59316FE848316FE9476315D
-:10E93000001E7630FFE50524000206A8000274954B
-:10E94000001E74A4FFE59496FE8CC73867C0773824
-:10E95000FFF0F72B28008496FEC4871E0000752563
-:10E96000001EC7385FC07738FFF0F737280006B4BD
-:10E9700000028716FF742394008A761D001E7630ED
-:10E98000FFE58496FE8C7528FFE5C73837C07738D9
-:10E99000FFF0F7372800871E000006B40002831638
-:10E9A000FE84C73867C07738FFF0F737280006B411
-:10E9B00000028716FF7823940086761D001E7630AD
-:10E9C000FFE5C73847C07738FFF0F7372800871EC4
-:10E9D000000006B40002C73867C07738FFF0F73789
-:10E9E000280006B400028716FF7C23940082761D5F
-:10E9F000001E7630FFE5C7384FC07738FFF0F73795
-:10EA00002800871E000006B400028496FEC4C738A2
-:10EA100067C07738FFF0F73728008716FF8006B405
-:10EA20000002C73837C07738FFF0F737280087264D
-:10EA30000000F30200FFC73857C07738FFE8C6B8B8
-:10EA40003400F7020080C73474007739001077393A
-:10EA5000FFF0203A0000E600EA6127000100C6B49A
-:10EA600075808496FECC0000000107240038F6BBB8
-:10EA700028009493FFFC8316FF24000000019313E9
-:10EA8000FFFC07880008E000D42C9793FFFC8496D5
-:10EA9000FED40000000104A40001E000E33C9496D1
-:10EAA000FED4F40200018796FFFC8296FFF8021460
-:10EAB0000004013C0000000000019293FFFC029062
-:10EAC0000008861600088696000CF502FFFC859665
-:10EAD000000484160010F484E0000730000294B2B1
-:10EAE0000010F484E00406B4000394B20014F4842B
-:10EAF000E01CC6B4540094B20018F4820005F4B3CC
-:10EB00002800F4820001F4BB280027340008973263
-:10EB1000000486160000072C0003C7385400C6B84E
-:10EB200068009693FFFCC63072009613FFFCF70254
-:10EB30000003C5AC7400F7020004C7385A009713ED
-:10EB4000FFFC07880008C12000009793FFFC879610
-:10EB5000FFFC8296FFF802140014013C0000000044
-:10EB600000019293FFFC0290000822100018871603
-:10EB700000040000000183BA000084960000939610
-:10EB8000FFF0F3846E54873A00049396FFEC9716D7
-:10EB9000FFF49013FFFC271C00029713FFFC0724CF
-:10EBA00000209713FFFC9496FFE407880008E0001C
-:10EBB000CDB89793FFFC8496FFE4839600088726E0
-:10EBC00000188516FFECC03A3A00EE00EC7CF582A6
-:10EBD0000001872600188396000800000001C01E6F
-:10EBE0007200E600EC7CC584000086A60010871643
-:10EBF000FFF0F6020000C0367200E600EC1C0424B0
-:10EC0000001086A600148716FFF400000001C0362D
-:10EC10007200E600EC2020320000F60200012032F3
-:10EC20000000E600EC2D00000001F582000086A245
-:10EC300000008716FFF000000001C0367200E200FD
-:10EC4000EC68F6020000C0367200E600EC7020327C
-:10EC5000000086A200048716FFF400000001C03601
-:10EC60007200E200EC7120320000F6020001203256
-:10EC70000000E600EC81202E0000F5820001202E2D
-:10EC80000000E600ECACF7020001F704429CF60637
-:10EC9000429C76B1001E76B4FFE5C7386FC0773965
-:10ECA000FFF007380001F7332800F7020001972A28
-:10ECB000000883A6000C772CFFE193AA000C972A8A
-:10ECC000001C83A6001CF7046E5093AA002083BA90
-:10ECD0001DDCF682000093AA002C8396000CC5B4BC
-:10ECE000000093AA003083BA0010C634000093AA33
-:10ECF0000024873A001400000001972A00282036DB
-:10ED0000001FEE00ED1CC73050000738003495BAE4
-:10ED1000000006300004E000ECFC06B4000183961D
-:10ED2000001076A5001E9393FFFCF38200B493932A
-:10ED3000FFFC9513FFFC8726002076B4FFE5C7385B
-:10ED40006FC07739FFF09713FFFC8396FFEC00004C
-:10ED500000019393FFFC07880008E000EAB897934E
-:10ED6000FFFC8796FFFC8296FFF802140014013C1A
-:10ED70000000000000019293FFFC029000082210A6
-:10ED800000188716000400000001863A0000000009
-:10ED900000019616FFF0873A000400000001971664
-:10EDA000FFF4F6021DE09613FFFC8616000000003B
-:10EDB00000019613FFFCF6046E500000000196134C
-:10EDC000FFFC261400109616FFEC07880008E001EF
-:10EDD00026F89793FFFCF6846E50F6020000873603
-:10EDE0001DD89616FFE476B5001E76B4FFE5C73849
-:10EDF0006FC07738FFF0F68642C0F73728008616D6
-:10EE0000FFEC000000019613FFFC07880008E000FB
-:10EE1000DBB49793FFFC20220000E600EE4D0000DB
-:10EE200000018616FFEC000000019613FFFC078826
-:10EE30000008E000D5A09793FFFC20220000E60028
-:10EE4000EE4D00000001F60200019616FFE4841664
-:10EE5000FFE48796FFFC8296FFF802140008013C4D
-:10EE60000000000000019293FFFC029000088696CB
-:10EE70000004861600008736000885960008203AB0
-:10EE80000000E600EE99203A0003E600EEE9F40205
-:10EE90000000E000EF0C0000000177B0001F703EA2
-:10EEA000FFE1E600EF0DF4020000851600140000FB
-:10EEB00000019513FFFC851600100000000195135A
-:10EEC000FFFC8516000C000000019513FFFC9593D4
-:10EED000FFFC9693FFFC07880008E000EB60979327
-:10EEE000FFFCE000EF0C0000000177B0001E703E58
-:10EEF000FFE1E600EF0D000000019593FFFC969303
-:10EF0000FFFC07880008E000ED749793FFFC8796EC
-:10EF1000FFFC8296FFF802140018013C000000007C
-:10EF200000019293FFFC0290000822100018F48266
-:10EF3000000086960000F6044AA023940010843650
-:10EF400000009616FFE4F7044A9C9416FFF08536FD
-:10EF50000004C0327200EC00F0149516FFF4773113
-:10EF60000001C738600077390002F3064A98C6B836
-:10EF7000300006B4000CC584000087360000000095
-:10EF80000001C03A4200E600EFA4C6240000873624
-:10EF9000000400000001C03A5200E600EFA8203251
-:10EFA0000000F602000120320000E600EFB500008C
-:10EFB0000001F5820000863600008716FFF0000091
-:10EFC0000001C0327200E200EFF0F5020000C03232
-:10EFD0007200E600EFF8202A000086B600048716CB
-:10EFE000FFF400000001C0367200E200EFF9202AB1
-:10EFF0000000F5020001202A0000E600F009202EA2
-:10F000000000F5820001202E0000E600F018202606
-:10F010000000F482000120260000E600F04DF60218
-:10F0200000018716FFE4F3064A9876B90001C6B4DA
-:10F03000700076B50002C6B4300006B4001486B67F
-:10F0400000009716FFE8E000F0B09696FFEC27145A
-:10F05000001C9713FFFC9393FFFCF3064A9893134D
-:10F06000FFFC07880008E00125689793FFFC202239
-:10F070000000E600F0ADF60200018716FFE4F3069B
-:10F080004A9876B90001C6B4700076B50002C6B4DD
-:10F09000300006B4001486B600009716FFE8969676
-:10F0A000FFECF7054AA0E000F0B420320000F602C1
-:10F0B000000020320000E600F121F4020001871672
-:10F0C000FFE8F60642C876B90002C6B4700076B50D
-:10F0D0000002A736600283160004C6B460007635CD
-:10F0E000001E7630FFE50534000275A9001EC73802
-:10F0F00067C07738FFF0971A0000872A000075ACC8
-:10F10000FFE583160008C7385FC07738FFF0971A0D
-:10F1100000008316000C06B40004E000F124969A67
-:10F120000000F40200008796FFFC8296FFF80214AC
-:10F130000010013C0000000000010000B9000000C8
-:10F14000BA000000BB000000BC000000BD000000D1
-:10F15000BE000000BF000000800000008100000031
-:10F160008200000083000000840000008500000091
-:10F17000860000008700B9B9B9BAB9BBB9BCB9BD3E
-:10F18000B9BEB9BFB980B981B982B983B984B9852B
-:10F19000B986B987BAB9BABABABBBABCBABDBABE2F
-:10F1A000BABFBA80BA81BA82BA83BA84BA85BA863B
-:10F1B000BA87BBB9BBBABBBBBBBCBBBDBBBEBBBFCD
-:10F1C000BB80BB81BB82BB83BB84BB85BB86BB874B
-:10F1D000BCB9BCBABCBBBCBCBCBDBCBEBCBFBC80AB
-:10F1E000BC81BC82BC83BC84BC85BC86BC87BDB9E9
-:10F1F000BDBABDBBBDBCBDBDBDBEBDBFBD80BD81BB
-:10F20000BD82BD83BD84BD85BD86BD87BEB9BEBA86
-:10F21000BEBBBEBCBEBDBEBEBEBFBE80BE81BE82CA
-:10F22000BE83BE84BE85BE86BE87BFB9BFBABFBB24
-:10F23000BFBCBFBDBFBEBFBFBF80BF81BF82BF83DA
-:10F24000BF84BF85BF86BF8780B980BA80BB80BCC2
-:10F2500080BD80BE80BF80808081808280838084EA
-:10F2600080858086808781B981BA81BB81BC81BD60
-:10F2700081BE81BF818081818182818381848185FA
-:10F280008186818782B982BA82BB82BC82BD82BEFE
-:10F2900082BF82808281828282838284828582860A
-:10F2A000828783B983BA83BB83BC83BD83BE83BF9C
-:10F2B000838083818382838383848385838683871A
-:10F2C00084B984BA84BB84BC84BD84BE84BF84807A
-:10F2D000848184828483848484858486848785B9B8
-:10F2E00085BA85BB85BC85BD85BE85BF858085818A
-:10F2F00085828583858485858586858786B986BA56
-:10F3000086BB86BC86BD86BE86BF86808681868299
-:10F310008683868486858686868787B987BA87BBF3
-:10F3200087BC87BD87BE87BF8780878187828783A9
-:10F33000878487858786878700009293FFFC0290E9
-:10F34000000822100018F70475EC00000001203AB4
-:10F350000000E600F37DF6064296F704429476B18B
-:10F36000001E76B4FFE5F4020000C7386FC077399D
-:10F37000FFF007380001E000F5E0F7332800F384E0
-:10F380006F309013FFFC271C00029713FFFC8316BD
-:10F390000000000000019313FFFC9396FFEC078828
-:10F3A0000008E000CDB89793FFFC8396FFECF702CE
-:10F3B0000000971E00088316000400000001931E41
-:10F3C000000C83160008049C0022931E001C831668
-:10F3D000000C9396FFF4871A00007699001E76B40D
-:10F3E000FFE50618000275B1001E75ACFFE5C738D1
-:10F3F0006FC07738FFF0069C0020F737280087326F
-:10F4000000009696FFE47535001EC7385FC0773858
-:10F41000FFF0F7272800049C002406300002873202
-:10F42000000076B1001E76B4FFE5C7386FC07738AC
-:10F43000FFF0F7272800049C0026063000028732E0
-:10F44000000076B1001E76B4FFE5C7386FC077388C
-:10F45000FFF0F7272800049C0028063000028732BE
-:10F46000000076B1001E76B4FFE5C7386FC077386C
-:10F47000FFF0F7272800049C002A0630000287329C
-:10F48000000076B1001E76B4FFE5C7386FC077384C
-:10F49000FFF0F7272800049C002C0630000287327A
-:10F4A000000076B1001E76B4FFE5C7386FC077382C
-:10F4B000FFF0F7272800049C002E06300002873258
-:10F4C000000076B1001E76B4FFE5C7386FC077380C
-:10F4D000FFF0F72728000630000287320000049C66
-:10F4E00000307631001E7630FFE5C73867C07738C8
-:10F4F000FFF0F7272800871E00207528FFE5C73892
-:10F5000057C07739FFF0203A0008EE00F598F3066F
-:10F5100014D88316FFE4871E00207699001E76B467
-:10F52000FFE5C7386FC07739FFF025B80001C4ACDC
-:10F53000580004240001202E0000EC00F595F5028F
-:10F5400000008316FFE40000000106180002A73245
-:10F550005802C6B0580076B5001E76B4FFE5C7382D
-:10F560006FC07739FFE8C6B0400077B80018703E2A
-:10F57000FFE1E600F57DF7376800F502FFFFC730D1
-:10F580004800F53B680024A4000224200002E000AB
-:10F59000F53425AC0001F30614D89313FFFCF302F5
-:10F5A00000349313FFFC8316FFF400000001931353
-:10F5B000FFFC8316000000000001871A0000769906
-:10F5C000001E76B4FFE5C7386FC07739FFF0971398
-:10F5D000FFFC9393FFFC07880008E000EAB89793CC
-:10F5E000FFFC8796FFFC8296FFF802140010013C96
-:10F5F0000000000000019293FFFC0290000822101E
-:10F600000010F70475EC00000001203A0000E6004D
-:10F61000F639F6064296F704429476B1001E76B4A7
-:10F62000FFE5F4020000C7386FC07739FFF00738F4
-:10F630000001E000F748F7332800F5046F300000C0
-:10F6400000019516FFF49013FFFC27280002971382
-:10F65000FFFC85960004000000019593FFFC0788DD
-:10F660000008E000CDB89793FFFC85160004F60271
-:10F67000000086AA00007729001E7738FFE5C6B48F
-:10F6800077C076B5FFF0F7020001C0367400E600DF
-:10F69000F6999696FFECC63800009613FFFC859607
-:10F6A000FFEC8516FFF4472CFFFE07380002C72841
-:10F6B00072009713FFFC85960000000000019593EF
-:10F6C000FFFC07880008E000CDB89793FFFC851683
-:10F6D000FFF4F7020002972A000885960008000050
-:10F6E000000195AA000C8596000C0000000195AA67
-:10F6F000001CF50614D89513FFFCF58200209593A5
-:10F70000FFFC8516FFF4000000019513FFFC8596B1
-:10F7100000008516FFEC872E000076AD001E76B443
-:10F72000FFE5C7386FC07739FFF0C738500097132F
-:10F73000FFFC8596FFF4000000019593FFFC07880D
-:10F740000008E000EAB89793FFFC8796FFFC8296DA
-:10F75000FFF802140010013C000000000001929329
-:10F76000FFFC0290000885960000851600048716AD
-:10F770000008F602FFFC06A80003C6B464000738C0
-:10F780000003C7386400C73470009713FFFCC5AC92
-:10F790006A009593FFFCF7020003C5287400F70286
-:10F7A0000004C73852009713FFFC07880008E001E7
-:10F7B00014D89793FFFC8796FFFC8296FFF80214FB
-:10F7C0000010013C0000000000019293FFFC029039
-:10F7D000000822100010F70475EC00000001203A28
-:10F7E0000000E600F80DF6064296F704429476B162
-:10F7F000001E76B4FFE5F4020000C7386FC0773909
-:10F80000FFF007380001E000F920F7332800F50485
-:10F810006F30000000019516FFF49013FFFC2728BD
-:10F8200000029713FFFC85960004000000019593E9
-:10F83000FFFC07880008E000CDB89793FFFC851611
-:10F840000004F602000086AA00007729001E77381F
-:10F85000FFE5C6B477C076B5FFF0F7020001C03609
-:10F860007400E600F86D9696FFECC638000096131B
-:10F87000FFFC8596FFEC8516FFF4472CFFFE07384A
-:10F880000002C72872009713FFFC85960000000055
-:10F8900000019593FFFC07880008E000CDB897931E
-:10F8A000FFFC8516FFF4F5820006F5AB280085966F
-:10F8B00000080728000295AA00040514000E852AF6
-:10F8C000000077A9001E77BCFFE5C5287FC0752919
-:10F8D000FFF0F53B2800F58614D89593FFFCF50260
-:10F8E00000089513FFFC859600008516FFEC872E17
-:10F8F000000076AD001E76B4FFE5C7386FC07739DB
-:10F90000FFF0C73850009713FFFC8596FFF4000006
-:10F9100000019593FFFC07880008E000F75C9793CF
-:10F92000FFFC8796FFFC8296FFF802140010013C52
-:10F930000000000000019293FFFC029000082210DA
-:10F940000008F70475EC83960004203A0000E600F6
-:10F95000FA64F6064296F5046F309013FFFC2728F0
-:10F9600000029713FFFC83160000000000019313B0
-:10F97000FFFC9396FFF49516FFF007880008E0005F
-:10F98000CDB89793FFFC8516FFF0F302000783962E
-:10F99000FFF4F32B280007280002F3020001F33BD9
-:10F9A0002800871E0000769D001E76B4FFE5059CAA
-:10F9B0000002762D001E7630FFE5749D001E74A4B3
-:10F9C000FFE5041C000683160000C7386FC07738B7
-:10F9D000FFF006A80004F7372800872E000006A8CD
-:10F9E000000675A1001EC73867C07738FFF0F737EB
-:10F9F0002800871E000475ACFFE506A800087619EC
-:10FA0000001EC7384FC07738FFF0F737280087222D
-:10FA1000000006A8000AC7385FC07738FFF0F73744
-:10FA20002800F30614D89313FFFCF302000C931381
-:10FA3000FFFC8316000000000001871A00007630EA
-:10FA4000FFE5C73867C07739FFF09713FFFC9513C0
-:10FA5000FFFC07880008E000F75C9793FFFCE000DC
-:10FA6000FA8400000001F704429476B1001E76B4D7
-:10FA7000FFE5F4020000C7386FC07739FFF00738A0
-:10FA80000001F73328008796FFFC8296FFF80214E6
-:10FA90000008013C0000000000019293FFFC02906E
-:10FAA000000822100048F70475EC85960000203A03
-:10FAB0000000E600FD98F606429605AC0002872E8F
-:10FAC000000076AD001E76B4FFE52414001E062C5F
-:10FAD00000027531001E249400207528FFE5F38490
-:10FAE0006E50C7386FC07738FFF0F727280087328D
-:10FAF00000009396FFC4C73857C07738FFF0F7234C
-:10FB000028002414001C063000028732000076B161
-:10FB1000001E76B4FFE5C7386FC07738FFF0F723D3
-:10FB200028002414001A063000028732000076B143
-:10FB3000001E76B4FFE5C7386FC07738FFF0F723B3
-:10FB4000280024140018063000028732000076B125
-:10FB5000001E76B4FFE5C7386FC07738FFF0F72393
-:10FB6000280024140016063000028732000076B107
-:10FB7000001E76B4FFE5C7386FC07738FFF0F72373
-:10FB8000280024140014063000028732000076B1E9
-:10FB9000001E76B4FFE5C7386FC07738FFF0F72353
-:10FBA000280024140012063000028732000076B1CB
-:10FBB000001E76B4FFE5C7386FC07738FFF0F72333
-:10FBC000280006300002873200002414001076312D
-:10FBD000001E7630FFE5C73867C07738FFF0F7239F
-:10FBE00028009013FFFC271C00029713FFFC94933E
-:10FBF000FFFC9596FFBC07880008E000CDB89793FE
-:10FC0000FFFC8596FFBC231400362494003873A5AE
-:10FC1000001E739CFFE5F40442C0F68642C076B530
-:10FC2000001E76B4FFE5872E0000762D001E76308C
-:10FC3000FFE5C4206FC07420FFF005AC0002752DF5
-:10FC4000001E7528FFE5C73867C07738FFF0F72733
-:10FC50002800872E0000F6046E50C73857C077384A
-:10FC6000FFF0F71B28002314003405AC0002872E98
-:10FC7000000076AD001E76B4FFE5C7386FC0773858
-:10FC8000FFF0F71B28002314003205AC0002872E7A
-:10FC9000000076AD001E76B4FFE5C7386FC0773838
-:10FCA000FFF0F71B28002314003005AC0002872E5C
-:10FCB000000076AD001E76B4FFE5C7386FC0773818
-:10FCC000FFF0F71B28002314002E05AC0002872E3E
-:10FCD000000076AD001E76B4FFE5C7386FC07738F8
-:10FCE000FFF0F71B28002314002C05AC0002872E20
-:10FCF000000076AD001E76B4FFE5C7386FC07738D8
-:10FD0000FFF0F71B28002314002A05AC0002872E01
-:10FD1000000076AD001E76B4FFE5C7386FC07738B7
-:10FD2000FFF0F71B280005AC0002872E000023140B
-:10FD3000002875AD001E75ACFFE5C7385FC0773889
-:10FD4000FFF0F71B28008716FFC8F6820003C738AC
-:10FD50003FC096B2000806B01DD8F4372800F386DD
-:10FD600014D89393FFFCF3821DE09393FFFC96134A
-:10FD7000FFFC7739FFF09713FFFC8396FFC4000068
-:10FD800000019393FFFC07880008E000EAB897930E
-:10FD9000FFFCE000FDB800000001F704429476B1DA
-:10FDA000001E76B4FFE5F4020000C7386FC0773953
-:10FDB000FFF007380001F73328008796FFFC829692
-:10FDC000FFF802140004013C0000000000019293BF
-:10FDD000FFFC029000088616000000000001873238
-:10FDE000000076B1001E76B4FFE5C7386FC07739E2
-:10FDF000FFF0203A0006E600FE21F582001EF7041F
-:10FE000042A8F60642A876B1001E76B4FFE5C738D0
-:10FE10006FC07739FFF007380001E000FE34F73398
-:10FE20002800F6056F349593FFFC07880008E00072
-:10FE300015849793FFFC8796FFFC8296FFF80214C7
-:10FE40000004013C0000000000019293FFFC0290BE
-:10FE5000000886160000859600048732000076B1FF
-:10FE6000001E76B4FFE5C7386FC07739FFF0203A3F
-:10FE70000007E600FE9DF4020000F70442A8F60623
-:10FE800042AA76B1001E76B4FFE5C7386FC0773955
-:10FE9000FFF007380001E000FF1CF73328000730AF
-:10FEA000000286BA00007739001E7738FFE5C6B435
-:10FEB00077C076B5FFF020360001E600FED5F605E6
-:10FEC0006F3420360002E600FEE5F5020020E00077
-:10FED000FEFCF60642AC202E000CE600FF1CF402ED
-:10FEE0000000F502001F9513FFFC07880008E000E2
-:10FEF00015849793FFFCE000FF1CF4020001F70457
-:10FF000042AC76B1001E76B4FFE5C7386FC07739D2
-:10FF1000FFF007380001F7332800F402000187964C
-:10FF2000FFFC8296FFF802140008013C000000006C
-:10FF300000019293FFFC02900008869600000000EA
-:10FF4000000187360004F6020000073800089736E3
-:10FF500000048736000800000001203A0000EC0091
-:10FF6000FF7DF6856F348736000800000001203AD7
-:10FF70000003EE00FF8020320000F6020001203274
-:10FF80000000E600FFBDF60642AEF7046F34000045
-:10FF90000001873A0008F682FFEC77390002A73AA1
-:10FFA0006802000000019713FFFC07880008E000CA
-:10FFB00015849793FFFCE000FFD800000001F704D0
-:10FFC00042AC76B1001E76B4FFE5C7386FC0773912
-:10FFD000FFF007380001F73328008796FFFC829670
-:10FFE000FFF802140004013C0000000000010000C2
-:10FFF00000170000001A0000001D0000001800009B
-:020000021000EC
-:10000000000056657273696F6E537472696E673A59
-:10001000206D63702D6C34763320332E303863209E
-:1000200044656320313120313939362031333A305B
-:10003000363A313600009293FFFC02900008F70434
-:10004000E00CFF0200009702FF84F7060C3ECFFC95
-:100050007580F60200029602FF8C9002FF88F7047A
-:10006000E02000000001203A0000E6010074F68262
-:100070000000F68200039682FF988796FFFC829626
-:10008000FFF802140000013C000000000001929300
-:10009000FFFC029000082210000CF5021494F505F4
-:1000A0007B00F50EF014F5057B08F706E000F686F8
-:1000B0007B68C7386A00F7057AF0F502004CF682D3
-:1000C000000020360002EE010124F5057AF8C5B4DF
-:1000D0000000C6340000F706E030C72C7000F506BB
-:1000E0006F44B73250029013FFFC9713FFFC9596B4
-:1000F000FFF49616FFF09696FFEC07880008E001E3
-:10010000031C9793FFFC8596FFF48616FFF08696F6
-:10011000FFEC05AC149406B4000120360002EE0199
-:1001200000D506300004F5020022F5056F58F005F1
-:100130006F54F0056F50F0052D408796FFFC8296B6
-:10014000FFF802140000013C00000000000192933F
-:10015000FFFC0290000807880008E00129589793E7
-:10016000FFFCF7020003F705E008F7047AD8F6026F
-:1001700000019602FF94203A0000E6010191F70683
-:100180007AE807880008E00103DC9793FFFCF70694
-:100190007AE8F6020005F63B2800F7067AE0868248
-:1001A000FF44F602000320360000E60101C9F63BD9
-:1001B0002800F7046F648682FF4407380001203668
-:1001C0000000E60101B0F7056F6407880008E00150
-:1001D00000349793FFFC07880008E001008C979398
-:1001E000FFFC07880008E00044289793FFFC07887D
-:1001F0000008E00016F09793FFFC07880008E00174
-:100200000C609793FFFC07880008E00104089793AF
-:10021000FFFC07880008E00000209793FFFC078898
-:100220000008E0000BD89793FFFC07880008E00166
-:100230001D689793FFFC07880008E0011E50979304
-:10024000FFFC07880008E0005F689793FFFC0788C1
-:100250000008E0006DEC9793FFFC07880008E001C0
-:1002600021D09793FFFC07880008E001222C979388
-:10027000FFFC9002FF9407880008E0000BFC9793B6
-:10028000FFFCF40200008796FFFC8296FFF8021440
-:100290000000013C0000000000019293FFFC02906E
-:1002A000000822100008F6020000C5B0000020324D
-:1002B0000002EE010308F5066F44A6AE50020000EE
-:1002C00000018736000000000001203A0001E6012D
-:1002D00002FCF50200029513FFFC9693FFFC959635
-:1002E000FFF49616FFF007880008E001031C9793BF
-:1002F000FFFC8616FFF08596FFF40000000105ACB8
-:100300000004E00102AC063000018796FFFC8296F3
-:10031000FFF802140000013C00000000000192936D
-:10032000FFFC0290000887160000F6020000F6822B
-:100330000008963A0008963A000C963A09D8963A80
-:1003400009DC963A0EF4963A0EF896BA1420963ACC
-:10035000142490BA148C8696000490BA149096BA1D
-:100360000000963A00048796FFFC8296FFF802147C
-:100370000008013C0000000000019293FFFC029085
-:100380000008859600008716000886160004773856
-:10039000FFFFC5307000C0325200E40103C9000005
-:1003A0000001872E000076AD001E76B4FFE5C73849
-:1003B0006FC07738FFF0F733280006300002C032F4
-:1003C0005200E40103A005AC00028796FFFC829670
-:1003D000FFF80214000C013C0000000000019293A1
-:1003E000FFFC02900008F7020001E00103E8F705B6
-:1003F0007AD88796FFFC8296FFF802140000013C31
-:10040000000000000001000000009293FFFC029039
-:100410000008F502000AF50571CCF00571D4F0056D
-:1004200071D0F00571C4F5020001F682000020369B
-:10043000000AEC010464F50571C8F58A1E00F60691
-:1004400071C4472CFFFC973200180630000406B434
-:100450000001F70471CC00000001C0367200EC010D
-:10046000044105AC214CF0057198F5066F689513B1
-:10047000FFFCF5067B189513FFFC07880008E000D9
-:1004800015489793FFFCF50605D49513FFFCF782FA
-:1004900000059793FFFCF5066F689513FFFC07882E
-:1004A0000008E000161C9793FFFCF5060B709513EF
-:1004B000FFFCF78200069793FFFCF5066F68951323
-:1004C000FFFC07880008E000161C9793FFFCF50668
-:1004D0000BA09513FFFCF78200059793FFFCF50630
-:1004E00070809513FFFC07880008E000161C9793A6
-:1004F000FFFCF5060B709513FFFCF782000697933F
-:10050000FFFCF50670809513FFFC07880008E000EB
-:10051000161C9793FFFCF50605589513FFFCF50292
-:10052000000A9513FFFCF506710C9513FFFC078874
-:100530000008E000161C9793FFFC07880008E00104
-:1005400005589793FFFC8796FFFC8296FFF80214EC
-:100550000000013C0000000000019293FFFC0290AB
-:100560000008F70471C400000001203A0000E60111
-:10057000057DF68671C4E0010594F7020000F704DA
-:1005800071D00000000177390002C7386800873A4F
-:10059000001800000001203A0000E60105ACF70554
-:1005A0007B10F606710CE00105C0F6057B18F60617
-:1005B0006F68F6057B189702FF48073821289702D5
-:1005C000FF4C8796FFFC8296FFF802140000013C66
-:1005D0000000000000019293FFFC0290000822102E
-:1005E00000108682FF48F4866F68F4857B18F50456
-:1005F0007B1026B4000285B60000872A0000762909
-:10060000001E7630FFE576B5001E76B4FFE5C5AC7A
-:100610006FC0C73867C07739FFF077B80010703EF9
-:10062000FFE1E601064575ACFFF0F70471AC000090
-:10063000000107380001F70571ACF70471ACE00167
-:1006400008C4F7020001772CFFF8203A0000E60109
-:10065000067176A9001EF70471A800000001073892
-:100660000001F70571A8F70471A8E00108C4F702BA
-:100670000001872A000076B4FFE5C7386FC07739DC
-:10068000FFF027380004203A0003E20108A400002C
-:10069000000177390002F68606A4A6B670020000B3
-:1006A0000001C1340000000106B40001077C000114
-:1006B00007EC00010844872A0004C4840000C03A03
-:1006C0004A00E60106D8000000018702FF4800004A
-:1006D0000001C7385200972A0004872A000400004E
-:1006E0000001203A2100EE01073CF602000086AA34
-:1006F00000048702FF4800000001C7385200273875
-:100700000028C0367200E601073C0000000177FCBB
-:10071000001D703EFFE1E601073C0000000177FC90
-:100720000017703EFFE1E601073D0000000177FC85
-:100730000016703EFFE1E601074420320000F60299
-:10074000000120320000E601088800000001872A2D
-:10075000001800000001203A0002EE0108C100006C
-:100760000001F70471A40000000107380001F7053B
-:1007700071A4F70471A4E00108C4F7020001872AFC
-:10078000000400000001203A2100EE0107E0F6021B
-:10079000000086AA00048702FF4800000001C73855
-:1007A00052002738000CC0367200E60107E0000056
-:1007B000000177FC001D703EFFE1E60107E000004C
-:1007C000000177FC0017703EFFE1E60107E1000041
-:1007D000000177FC0016703EFFE1E6010880203240
-:1007E0000000F6020001E0010880203200008702CC
-:1007F000FF4800000001C738520027380004203AA3
-:100800000008E6010838F682000077FC001D703E03
-:10081000FFE1E60108380000000177FC0017703E98
-:10082000FFE1E60108390000000177FC0016703E88
-:10083000FFE1E601088020360000F6820001E001B9
-:10084000088020360000F702000077FC001D703E93
-:10085000FFE1E60108780000000177FC0017703E18
-:10086000FFE1E60108790000000177FC0016703E08
-:10087000FFE1E6010880203A0000F7020001203A7B
-:100880000000E60108C100000001F70471A00000AB
-:10089000000107380001F70571A0F70471A0E0011D
-:1008A00008C4F7020001F704719C0000000107383A
-:1008B0000001F705719CF704719CE00108C4F70280
-:1008C0000001F7020000203A0000E601096800007C
-:1008D0000001F6847B10000000018736000076B529
-:1008E000001E76B4FFE5C7386FC07739FFF02738B0
-:1008F0000004203A0003E2010B5077390002F6862B
-:10090000090CA6B6700200000001C134000000010D
-:10091000091C00010AE000010AAC00010B14F704F5
-:1009200071D0F60471CC06B80001C0366200E60151
-:100930000938C7340000F7020000F58471D40000C4
-:100940000001C03A5A00470C0001203A0000E601BD
-:10095000098500000001F70471B0000000010738AC
-:100960000001F70571B0F70471B0F70471B400002D
-:10097000000107380001F70571B4F70471B4E00114
-:100980000B5000000001F48471C8F68571D0949674
-:10099000FFF4F4847B10C0366200E60109A494964B
-:1009A000FFECF00571D0F70471D0F00571C88496A2
-:1009B000FFECC03A5A00470C0001F70571C48726C6
-:1009C000000800000001703AFFE1E60109E10000C3
-:1009D0000001F70471980000000107380001F705D5
-:1009E00071988496FFF40000000120260000E601C3
-:1009F0000A710000000107880008E001055897937C
-:100A0000FFFCF602000920320014E6010A4D27001F
-:100A1000000C203A0001E2010A4DF7062DCCF684C5
-:100A20002ECC0000000175B50002B62E700206B48F
-:100A30000001F6852ECC8602FF34F7062E4C2036B8
-:100A4000001FE2010A4DB62E7002F0052ECCF7040D
-:100A50002D6800000001873A000000000001873A7D
-:100A600000280000000107880008C13800009793A3
-:100A7000FFFCF70471BC8496FFEC07380001F70512
-:100A800071BCF70471BC86A600048496FFF4F704D9
-:100A900071B820260000C7386800F70571B8E60174
-:100AA0000B5100000001E0010B5C00000001F704A5
-:100AB00071C00000000107380001F70571C0F7049C
-:100AC00071C0F4847B10000000019493FFFC078840
-:100AD0000008E000FDCC9793FFFCE0010B50000004
-:100AE0000001F70471C00000000107380001F7059C
-:100AF00071C0F70471C0F4847B100000000194936E
-:100B0000FFFC07880008E000FF309793FFFCE0013E
-:100B10000B5000000001F70471C00000000107380D
-:100B20000001F70571C0F70471C0F6847B108702DD
-:100B3000FF4800000001C7386A00273800049713F7
-:100B4000FFFC9693FFFC07880008E000FE4897939F
-:100B5000FFFC07880008E00105589793FFFC879683
-:100B6000FFFC8296FFF802140000013C0000000028
-:100B700000019293FFFC02900008F7067080F705D1
-:100B80007B1807880008E00105589793FFFC8796BB
-:100B9000FFFC8296FFF802140000013C00000000F8
-:100BA00000019293FFFC02900008F7066F68F705BA
-:100BB0007B1807880008E00105589793FFFC87968B
-:100BC000FFFC8296FFF802140000013C00000000C8
-:100BD00000019293FFFC02900008F7067B18971320
-:100BE000FFFCF7066F689713FFFC07880008E0001A
-:100BF00014F49793FFFCF7067B189713FFFCF70696
-:100C00006FF49713FFFC07880008E00014F4979333
-:100C1000FFFCF7067B189713FFFCF706708097130D
-:100C2000FFFC07880008E00014F49793FFFCF70628
-:100C30007B189713FFFCF706710C9713FFFC0788CE
-:100C40000008E00014F49793FFFC8796FFFC82965F
-:100C5000FFF802140000013C000000000001000049
-:100C600000009293FFFC02900008F5020004F505D5
-:100C70007600F0057608F0057604F00575F8F502C3
-:100C80000001F682000020360004EC010CBCF505E2
-:100C900075FCF58E6AF8F60675F8472CFFFC97325E
-:100CA00000180630000406B40001F70476000000C6
-:100CB0000001C0367200EC010C9905AC214CF50620
-:100CC00072189513FFFCF50676489513FFFC07880C
-:100CD0000008E00015489793FFFCF5060DF4951306
-:100CE000FFFCF782000E9793FFFCF5067218951330
-:100CF000FFFC07880008E000161C9793FFFCF50630
-:100D00000DF49513FFFCF782000E9793FFFCF50698
-:100D100072A49513FFFC07880008E000161C979347
-:100D2000FFFCF506132C9513FFFCF7820001979347
-:100D3000FFFCF50673309513FFFC07880008E00000
-:100D4000161C9793FFFCF50616C89513FFFCF78257
-:100D500000019793FFFCF50673BC9513FFFC078811
-:100D60000008E000161C9793FFFCF5061800951389
-:100D7000FFFCF78200109793FFFCF506744895136B
-:100D8000FFFC07880008E000161C9793FFFCF5069F
-:100D900016409513FFFCF78200109793FFFCF506B1
-:100DA00074D49513FFFC07880008E000161C979385
-:100DB000FFFCF506132C9513FFFCF50200129513AA
-:100DC000FFFCF50675609513FFFC07880008E0003E
-:100DD000161C9793FFFCF00575F0F00575ECF00517
-:100DE00075F48796FFFC8296FFF802140000013C20
-:100DF0000000000000019293FFFC02900008221006
-:100E00000038F70475EC00000001203A0000E6010C
-:100E10000E2800000001F70475F000000001203AE0
-:100E20000000E6010E3D0000000107880008E00117
-:100E300015D09793FFFCE001131800000001F704A0
-:100E400075FC00000001203A0000E6010E59F6860C
-:100E500075F8E0010E6CF6820000F70476080000D9
-:100E6000000177390002C738680086BA0018F70415
-:100E700076FC00000001203A0000E6010E90F685A5
-:100E80007660F3067648F30576FCE0010EA4F702DF
-:100E90000001F3020010F30576F8F3067648F30537
-:100EA0007700F7020000203A0000E6011315F30670
-:100EB0007448F70475EC00000001203A0000E601D8
-:100EC0000ED800000001F70475F000000001203A80
-:100ED0000000E6010EED0000000107880008E001B7
-:100EE00016409793FFFCE001131800000001F68400
-:100EF0007660000000018736000800000001703AAB
-:100F0000FFE1E6010F21F48200009693FFFC0788C1
-:100F10000008E00000BC9793FFFCE0011314F30607
-:100F20007560C3B40000841E0010F6844AA0231428
-:100F300000209316FFC49416FFE09696FFD4851EFA
-:100F40000014F7044A9C00000001C0367200EC0156
-:100F5000100C9516FFE477350001C7386800773923
-:100F60000002F3064A98C6B8300006B4000CC584E7
-:100F700000008736000000000001C03A4200E60190
-:100F80000F9CC62400008736000400000001C03A10
-:100F90005200E6010FA020320000F60200012032CC
-:100FA0000000E6010FAD00000001F582000086366A
-:100FB00000008716FFE000000001C0327200E2016D
-:100FC0000FE8F5020000C0327200E6010FF0202A9F
-:100FD000000086B600048716FFE400000001C0365A
-:100FE0007200E2010FF1202A0000F5020001202A20
-:100FF0000000E6011001202E0000F5820001202EE5
-:101000000000E601101020260000F48200012026D6
-:101010000000E6011045F60200018716FFD4F30632
-:101020004A9876B90001C6B4700076B50002C6B41D
-:10103000300006B4001486B600009716FFD8E00111
-:1010400010B89696FFDC2714002C9713FFFC83162C
-:10105000FFC4000000019313FFFCF3064A989313AA
-:10106000FFFC9396FFCC07880008E0012568979362
-:10107000FFFC8396FFCC20220000E60110B5F602AB
-:1010800000018716FFD4F3064A9876B90001C6B46A
-:10109000700076B50002C6B4300006B4001486B6FF
-:1010A00000009716FFD89696FFDCF7054AA0E001EE
-:1010B00010BC20320000F602000020320000E601E1
-:1010C00010CCF4820001E0011124F4820000869625
-:1010D000FFD80000000177350002C7386800773973
-:1010E0000002F68642C8A63A6802C7386800753919
-:1010F000001E7528FFE505B8000286AE000007381F
-:1011000000049716FFECC63057C07630FFF09616F5
-:10111000FFF475AD001E75ACFFE5C6B45FC076B4D4
-:10112000FFF09696FFF020260000E6011138F582C8
-:101130000000E00111CCF60200008696FFF00000EE
-:101140000001C7346800C49C7200C02E6A00EC0124
-:101150001198C5240000C62C00008716FFEC000083
-:101160000001A6B2700205AC0001C73070007739EB
-:10117000001E7738FFE5C6B477C076B4FFF0F6AB53
-:101180002800052800028716FFF000000001C02E8D
-:101190007200EC01115906300002F3020001F30560
-:1011A00076F4F60200018716FFF0869E0004C73829
-:1011B0007000C7384800C6B470008716FFF406B444
-:1011C00000209702FF6C9482FF509682FF582032D5
-:1011D0000000E601131000000001F704765CF584BE
-:1011E00076F807380001F705765CF704765C202E68
-:1011F0000021E2011230F6862C28F7042D38000079
-:10120000000106380001F6052D387739000220323A
-:101210000044E601121CB5BA6802F0052D38F3024D
-:101220000022F30576F8F3047700E0011234F305A9
-:1012300076FCF00576FCF70475F800000001203A12
-:101240000000E6011271F6862C28F7042D38000004
-:10125000000106380001F6052D3877390002F30247
-:10126000000F20320044E6011270B33A6802F00524
-:101270002D38F7047608F684760007380001C03A66
-:101280006A00E601128CF7057608F0057608F68408
-:101290007608F7047604F00575F8F60675F8C0369A
-:1012A0007200470C0001203A0000E60112B9F70570
-:1012B00075FCE00112C8F702000077350002C7385C
-:1012C0006000873A001800000001203A0000E601A3
-:1012D0001309F7057660F7042D38F30672A4F305B9
-:1012E0007648F6862C2806380001F6052D38773921
-:1012F0000002F302000E20320044E6011318B33A54
-:101300006802E0011318F0052D38E0011314F3060C
-:101310007218F3067330F30576488796FFFC8296C1
-:10132000FFF802140000013C00000000000192934D
-:10133000FFFC02900008F70476600000000186BA06
-:101340000004F704765400000001C7386800F70570
-:101350007654F70476580000000107380001F705BD
-:101360007658F70475F8F6847658203A0000E601BE
-:10137000139DF6862C28F7042D380000000106384E
-:101380000001F6052D3877390002F502000F2032F2
-:101390000044E601139CB53A6802F0052D38F704C5
-:1013A0007608F684760007380001C03A6A00E60144
-:1013B00013B8F7057608F0057608F7047608F68482
-:1013C0007604F00575F8F58476F8C03A6A00470CA3
-:1013D0000001202E0021E2011414F70575FCF7042A
-:1013E0002D38F6862C2806380001F6052D38773979
-:1013F000000220320044E6011400B5BA6802F0058C
-:101400002D38F5020022F50576F8F5047700E001A5
-:101410001418F50576FCF00576FCF70475ECF50676
-:101420007218203A0000E6011440F5057648F704EA
-:1014300075F000000001203A0000E601145500009C
-:10144000000107880008E00115D09793FFFCE00138
-:1014500014C400000001F70475FC00000001203AEC
-:101460000000E6011471F68675F8E0011488F702B1
-:101470000000F70476080000000177390002C73841
-:101480006800873A001800000001203A0000E601D9
-:1014900014C5F7057660F7042D38F6862C28063833
-:1014A0000001F6052D3877390002F502000E2032D2
-:1014B0000044E60114BCB53A6802F0052D38F50683
-:1014C00072A4F50576488796FFFC8296FFF8021411
-:1014D0000000013C0000000000019293FFFC02901C
-:1014E0000008F70475EC00000001203A0000E60156
-:1014F0001540F40200008696000400000001F68505
-:1015000075EC8696000800000001F6857B3886960B
-:101510000000F7047648F6857B30F6867218C03AEC
-:101520006A00470C0001203A0000E6011541F40270
-:10153000000107880008E00115D09793FFFCF40232
-:1015400000018796FFFC8296FFF80214000C013C14
-:101550000000000000019293FFFC02900008F704D5
-:1015600075F400000001203A0000E60115BCF40209
-:1015700000008696000400000001F68575F086964E
-:10158000000800000001F6857B4886960000F704FD
-:101590007648F6857B40F6867218C03A6A00470C9A
-:1015A0000001203A0000E60115BDF40200010788A1
-:1015B0000008E00115D09793FFFCF4020001879624
-:1015C000FFFC8296FFF80214000C013C00000000B2
-:1015D00000019293FFFC02900008F70476FC0000E3
-:1015E0000001203A0000E60115FCF6820010F686A4
-:1015F0007648F68576FCE001160CF7020001F685C8
-:1016000076F8F6867648F6857700F7020000203AED
-:101610000000E6011620F68674D4E001162CF6854B
-:10162000764807880008E00116409793FFFC8796EC
-:10163000FFFC8296FFF802140000013C000000004D
-:1016400000019293FFFC02900008F60475F0000080
-:10165000000120320000E6011685F7020001F705BF
-:1016600075F4F6847B48F70576F4F7047B40C6B042
-:10167000680026B400049702FF6C9602FF50E00158
-:1016800016A800000001F70475ECF6847B38F5829B
-:101690000001F58576F4F6047B30C6B8680026B400
-:1016A00000049602FF6C9702FF509682FF58F58661
-:1016B00073BCF58576488796FFFC8296FFF8021486
-:1016C0000000013C0000000000019293FFFC02902A
-:1016D0000008F7047B280000000107380001F70527
-:1016E0007B28F70475F4F6847B28203A0000E60195
-:1016F000172100000001F00575F4F70475EC0000F7
-:101700000001203A0000E6011725F00575F0078872
-:101710000008E00116409793FFFCE00117EC000081
-:101720000001F00575ECF70475FC00000001203A9B
-:101730000000E6011741F68675F8E0011758F70238
-:101740000000F70476080000000177390002C7386E
-:101750006800873A001800000001203A0000E60106
-:101760001795F7057660F7042D38F6862C2806388D
-:101770000001F6052D3877390002F502000E2032FF
-:101780000044E601178CB53A6802F0052D38E001F7
-:101790001798F50672A4F5067218F5057648F584D3
-:1017A00076F800000001202E0021E20117E8F686FD
-:1017B0002C28F7042D380000000106380001F6053A
-:1017C0002D387739000220320044E60117D4B5BA2B
-:1017D0006802F0052D38F5020022F50576F8F504CB
-:1017E0007700E00117ECF50576FCF00576FC8796AE
-:1017F000FFFC8296FFF802140000013C000000008C
-:1018000000019293FFFC0290000822100038F704B8
-:1018100075EC00000001203A0000E60118340000D9
-:101820000001F70475F000000001203A0000E60115
-:1018300018490000000107880008E001164097934E
-:10184000FFFCE0011C7400000001F68476600000DB
-:1018500000018736000800000001703AFFE1E60150
-:10186000187DF48200009693FFFC07880008E000D2
-:1018700000BC9793FFFCE0011C70F3067560C3B4D5
-:101880000000841E0010F6844AA023140020931642
-:10189000FFC49416FFE09696FFD4851E0014F7044B
-:1018A0004A9C00000001C0367200EC0119689516D0
-:1018B000FFE477350001C738680077390002F30686
-:1018C0004A98C6B8300006B4000CC58400008736BC
-:1018D000000000000001C03A4200E60118F8C624EA
-:1018E00000008736000400000001C03A5200E60103
-:1018F00018FC20320000F602000120320000E60150
-:10190000190900000001F5820000863600008716E4
-:10191000FFE000000001C0327200E2011944F5024C
-:101920000000C0327200E601194C202A000086B681
-:1019300000048716FFE400000001C0367200E201D7
-:10194000194D202A0000F5020001202A0000E601BE
-:10195000195D202E0000F5820001202E0000E60116
-:10196000196C20260000F482000120260000E60108
-:1019700019A1F60200018716FFD4F3064A9876B93A
-:101980000001C6B4700076B50002C6B4300006B4DB
-:10199000001486B600009716FFD8E0011A14969638
-:1019A000FFDC2714002C9713FFFC8316FFC40000F4
-:1019B00000019313FFFCF3064A989313FFFC9396E0
-:1019C000FFCC07880008E00125689793FFFC839609
-:1019D000FFCC20220000E6011A11F6020001871652
-:1019E000FFD4F3064A9876B90001C6B4700076B504
-:1019F0000002C6B4300006B4001486B60000971684
-:101A0000FFD89696FFDCF7054AA0E0011A182032AD
-:101A10000000F602000020320000E6011A28F482DD
-:101A20000001E0011A80F48200008696FFD80000D1
-:101A3000000177350002C738680077390002F68662
-:101A400042C8A63A6802C73868007539001E752872
-:101A5000FFE505B8000286AE0000073800049716BF
-:101A6000FFECC63057C07630FFF09616FFF475AD28
-:101A7000001E75ACFFE5C6B45FC076B4FFF0969665
-:101A8000FFF020260000E6011A94F5820000E00134
-:101A90001B28F60200008696FFF000000001C73404
-:101AA0006800C49C7200C02E6A00EC011AF4C524C0
-:101AB0000000C62C00008716FFEC00000001A6B253
-:101AC000700205AC0001C73070007739001E77380E
-:101AD000FFE5C6B477C076B4FFF0F6AB2800052862
-:101AE00000028716FFF000000001C02E7200EC011A
-:101AF0001AB506300002F3020001F30576F4F6028F
-:101B000000018716FFF0869E0004C7387000C738B2
-:101B10004800C6B470008716FFF406B40020970290
-:101B2000FF6C9482FF509682FF5820320000E6013D
-:101B30001C6C00000001F704765CF58476F8073829
-:101B40000001F705765CF704765C202E0021E201A7
-:101B50001B8CF6862C28F7042D380000000106386F
-:101B60000001F6052D387739000220320044E601E5
-:101B70001B78B5BA6802F0052D38F3020022F30590
-:101B800076F8F3047700E0011B90F30576FCF0058E
-:101B900076FCF70475F800000001203A0000E60129
-:101BA0001BCDF6862C28F7042D38000000010638DE
-:101BB0000001F6052D3877390002F302000F2032BC
-:101BC0000044E6011BCCB33A6802F0052D38F70457
-:101BD0007608F684760007380001C03A6A00E6010C
-:101BE0001BE8F7057608F0057608F6847608F70412
-:101BF0007604F00575F8F60675F8C0367200470CE5
-:101C00000001203A0000E6011C15F70575FCE00113
-:101C10001C24F702000077350002C7386000873ABD
-:101C2000001800000001203A0000E6011C65F705DD
-:101C30007660F7042D38F30672A4F3057648F6862D
-:101C40002C2806380001F6052D3877390002F302FA
-:101C5000000E20320044E6011C74B33A6802E00131
-:101C60001C74F0052D38E0011C70F3067218F306A1
-:101C70007330F30576488796FFFC8296FFF80214CE
-:101C80000000013C0000000000019293FFFC029064
-:101C90000008F70676489713FFFCF70672189713AB
-:101CA000FFFC07880008E00014F49793FFFCF70698
-:101CB00076489713FFFCF70672A49713FFFC07887A
-:101CC0000008E00014F49793FFFCF706764897139A
-:101CD000FFFCF70673309713FFFC07880008E0004D
-:101CE00014F49793FFFCF70676489713FFFCF7066A
-:101CF00073BC9713FFFC07880008E00014F4979367
-:101D0000FFFCF70676489713FFFCF7067448971315
-:101D1000FFFC07880008E00014F49793FFFCF70627
-:101D200076489713FFFCF70674D49713FFFC0788D7
-:101D30000008E00014F49793FFFCF7067648971329
-:101D4000FFFCF70675609713FFFC07880008E000AA
-:101D500014F49793FFFC8796FFFC8296FFF8021419
-:101D60000000013C0000000000019293FFFC029083
-:101D70000008F68676689693FFFCF68677049693BD
-:101D8000FFFC07880008E00015489793FFFCF686E3
-:101D90001DD49693FFFC9013FFFCF686766896930D
-:101DA000FFFC07880008E000161C9793FFFCF70271
-:101DB0000022F70576F4F70576F8F00576FCF005D5
-:101DC00077008796FFFC8296FFF802140000013C22
-:101DD0000000000000019293FFFC02900008F7044D
-:101DE00076F400000001203A0022E6011E01000006
-:101DF00000019713FFFC07880008E0001584979303
-:101E0000FFFC8796FFFC8296FFF802140000013C5D
-:101E10000000000000019293FFFC02900008F7060A
-:101E200077049713FFFCF70676689713FFFC078883
-:101E30000008E00014F49793FFFC8796FFFC82965D
-:101E4000FFF802140000013C000000000001000047
-:101E500000009293FFFC02900008F686781096939B
-:101E6000FFFCF68678A49693FFFC07880008E00044
-:101E700015489793FFFCF6861FBC9693FFFCF682ED
-:101E800000149693FFFCF68678109693FFFC078863
-:101E90000008E000161C9793FFFCF005789C900268
-:101EA000FF34F7027FFFF70578A09702FF3087968F
-:101EB000FFFC8296FFF802140000013C00000000C5
-:101EC00000019293FFFC02900008F604789C8716AC
-:101ED000000084960008F5867710873A0008F68699
-:101EE000218C7539000477390002A73A6802203244
-:101EF0000000C6A8580084160004C63075809436C9
-:101F00000004B4AA580287360008F605789C073802
-:101F10000001E6011F2D973600088702FF30000000
-:101F20000001C03A4A00EE011F3500000001F485AF
-:101F300078A09482FF308796FFFC8296FFF8021407
-:101F4000000C013C0000000000019293FFFC029095
-:101F500000088596000000000001872E0008F68624
-:101F6000218C77390002A73A6802F604789CC704EE
-:101F7000760086AE0008C6307400F7067710F605C6
-:101F8000789C76B50004C6B470008736000820320D
-:101F9000000007380001E6011FA897360008F70285
-:101FA0007FFFF70578A09702FF308796FFFC8296A7
-:101FB000FFF802140004013C0000000000019293AD
-:101FC000FFFC0290000822100008F704789C000033
-:101FD0000001203A0000E60120D1F6027FFF9616AC
-:101FE000FFF4F6842D40F606771026B4000177350D
-:101FF0000004C4B86000C338000074350002F6065F
-:102000007710C0266200EC0120C1F606218CF38413
-:10201000789CA722600200000001C01E7400E60147
-:1020200020B10000000186A60000F70478A000009F
-:102030000001C6B4720020360000EE01209896A67A
-:102040000000F7042D38F6067710C5186000F686F4
-:102050002C28862A000405B80001F5852D3877392B
-:102060000002202E0044E6012070B63A6802F00516
-:102070002D38862A000800000001962A000CF6067A
-:10208000218CA722600200000001C7047600C71C53
-:102090007400E00120B0F705789C8616FFF400007C
-:1020A0000001C0366200EC0120B0000000019696ED
-:1020B000FFF424A4001023180010E0011FFC2420CA
-:1020C00000048616FFF400000001F60578A09602D1
-:1020D000FF308796FFFC8296FFF802140000013C57
-:1020E0000000000000019293FFFC02900008871698
-:1020F000000000000001873A0008F6867710773963
-:102100000004C738680086BA000C873A000800004F
-:102110000001C0367200440C00018796FFFC8296D5
-:10212000FFF802140004013C00000000000192933B
-:10213000FFFC02900008F702000F203A0000EC01BB
-:10214000215DF68677189036000027380001C60416
-:102150000000C03A6200E601214406B40010F60611
-:1021600078A49613FFFCF60678109613FFFC0788F8
-:102170000008E00014F49793FFFC8796FFFC82961A
-:10218000FFF802140000013C000000000001000004
-:102190000001000000020000000400000008000030
-:1021A000001000000020000000400000008000003F
-:1021B0000100000002000000040000000800000010
-:1021C000100000002000000040000000800000001F
-:1021D00000009293FFFC02900008F70678B0971376
-:1021E000FFFCF70679CC9713FFFC07880008E00096
-:1021F00015489793FFFCF706222C9713FFFCF70274
-:1022000000159713FFFCF70678B09713FFFC0788BB
-:102210000008E000161C9793FFFC8796FFFC82964F
-:10222000FFF802140000013C00000000000192933E
-:10223000FFFC02900008F6846F440000000187361E
-:10224000000000000001203A0002E6012270F602C0
-:10225000000087360EF486B60EF800000001C03A82
-:102260006A00470C0001203A0000E6012278203283
-:102270000000F602000120320000E6012294000076
-:102280000001F70432E800000001203A0000E601F6
-:1022900022B1F58203E80F814000F70479C80000FD
-:1022A000000107380001F70579C8F70479C8F582FD
-:1022B00003E89593FFFCF58200159593FFFCF586E6
-:1022C00079CC9593FFFC07880008E0011EC0979326
-:1022D000FFFC8796FFFC8296FFF802140000013C89
-:1022E0000000000000019293FFFC02900008F70636
-:1022F00079CC9713FFFCF70678B09713FFFC07889B
-:102300000008E00014F49793FFFCF70679CC9713CC
-:10231000FFFCF706793C9713FFFC07880008E000F4
-:1023200014F49793FFFC8796FFFC8296FFF8021443
-:102330000000013C000000000001C13C0000021050
-:1023400000049293FFFC029000082210000C859676
-:1023500000000000000186AE0004000000012036ED
-:102360000000E60123842714000C872E00040000DF
-:10237000000107380001972E0004872E0004E001B9
-:1023800024349696FFF49713FFFC85160004000092
-:1023900000019513FFFC9593FFFC9596FFEC0788D1
-:1023A0000008E00125689793FFFC8596FFEC20224A
-:1023B0000000E60124340000000186AE0004861609
-:1023C000FFF400000001C0366200EE0124217735E1
-:1023D0000001C738680077390002C6B85800773165
-:1023E0000001C738600077390002C73858008536C9
-:1023F0000000000000019536000C85360004000046
-:102400000001953600108536000800000001953661
-:10241000001426B4000CC0367200EE0123EC00005C
-:102420000001872E00040000000107380001972EEC
-:102430000004872E00048696FFF485160004773585
-:102440000001C738680077390002C72C7000852A60
-:10245000000000000001953A000C85160004000001
-:102460000001852A000400000001953A001085163D
-:102470000008F4020001953A001496AE0008879611
-:10248000FFFC8296FFF80214000C013C00000000E3
-:1024900000019293FFFC029000082210000C859628
-:1024A000000000000001842E000400000001202232
-:1024B0000000E60125552714000C9713FFFC851634
-:1024C0000004000000019513FFFC9593FFFC959616
-:1024D000FFEC07880008E00125689793FFFC8596CC
-:1024E000FFEC20220000E6012555000000018616C1
-:1024F000FFF40000000120320000EE012545773195
-:102500000001C6AC0000C738600077390002C73848
-:10251000580085360018000000019536000C8536FD
-:10252000001C0000000195360010853600200000D8
-:1025300000019536001406B4000CC0367200EC01A0
-:10254000251100000001872E0004F4020001273845
-:102550000001972E00048796FFFC8296FFF8021474
-:102560000008013C0000000000019293FFFC029073
-:102570000008221000088396000483160000C5009E
-:102580000000841A0004C4A800009416FFF4C026BA
-:102590004200E60126D1000000018316FFF400008E
-:1025A0000001C02A3200E60126D1C7204A00951654
-:1025B000FFF476B8FFE1C73868007739FFFFC5241C
-:1025C000700077290001C738500077390002831660
-:1025D0000000869E0000C5B8300005AC000C872EB8
-:1025E0000000C6000000C0367200E601261020324E
-:1025F0000000869E0004872E000400000001C03603
-:102600007200E601261020320000F602000120329E
-:102610000000E601262500000001C7000000E001DF
-:102620002678203A0000869E0000872E00000000D9
-:102630000001C0367200E201265C00000001E601E4
-:10264000266420320000869E0004872E00040000CD
-:102650000001C0367200E201266520320000F60259
-:102660000001203200004704FFFFE6012679203AEE
-:102670000000F7020001203A0000E60126B1203AEE
-:102680000000EE0126A0203A00014304FFFFC03AFB
-:102690003200E60126C9C0264200E0012590000074
-:1026A0000001E60126C1C0264200E001259000009D
-:1026B000000183160008F4020001E00126E0951AEB
-:1026C0000000E001258CC4A80000E001258CC4288E
-:1026D00000008316000800000001941A0000C400E6
-:1026E00000008796FFFC8296FFF80214000C013C64
-:1026F000000000000001000000009293FFFC029027
-:102700000008859600048416000084960008F702ED
-:102710000003C6A04D80C6B67400E6012771C6202E
-:10272000000020360002E60127A0C5204800C7208F
-:10273000480027380002C0227200E201279CC538F9
-:102740000000872E000076AD001E76B4FFE5C73886
-:102750006FC07738FFF0F733280006300002C03230
-:102760005200E201274105AC0002E00127A0C5208C
-:102770004800C720480027380004C0227200E20148
-:1027800027A0C520480083AD00040000000193B1DC
-:102790000004C0327200E201278500000001C5205C
-:1027A0004800C0325200E40127D50000000186AE87
-:1027B0000000772D001E7738FFE5C6B477C076B5E8
-:1027C000FFE8F6B3680006300001C0325200E401B1
-:1027D00027AC05AC00018796FFFC8296FFF8021437
-:1027E000000C013C0000000000019293FFFC0290ED
-:1027F0000008841600008696000400000001C7222D
-:102800006D80E601281020360000E0012874C438ED
-:102810000000F7020001EE012841F602000076B543
-:10282000000120360000EE01281C77390001E0018C
-:10283000284420220000742100017738FFFF063071
-:10284000000120220000EE012834203A0000E601B9
-:10285000287100000001C0226A00E4012864000021
-:102860000001C4206A00773AFFFFE601285476B4DD
-:10287000FFFFD42007628796FFFC8296FFF80214C0
-:102880000008013C0000000000019293FFFC029050
-:10289000000822100004E00128CCF70629DC86BAE3
-:1028A00000000000000120360000E60128C90000F9
-:1028B00000019716FFF407880008C13400009793C1
-:1028C000FFFC8716FFF40000000127380004F6061D
-:1028D00029E0C03A6200E401289D000000018796CB
-:1028E000FFFC8296FFF802140000013C000000008B
-:1028F00000019293FFFC0290000822100004E00106
-:102900002934F706299886BA000000000001203615
-:102910000000E6012931000000019716FFF4078846
-:102920000008C13400009793FFFC8716FFF40000F5
-:10293000000107380004F60629E0C03A6200E4010D
-:102940002904000000018796FFFC8296FFF802141C
-:102950000000013C0000000000019293FFFC029087
-:102960000008F7047B5000000001203A0000E60157
-:102970002984F6820001F6857B5007880008E00173
-:1029800028F09793FFFC8796FFFC8296FFF80214CD
-:102990000000013C00000000000100000B4C0000A2
-:1029A0000000000042880000000000005E500000AF
-:1029B00000000000C7A80000000000010BD00000CC
-:1029C000000000011C880000000000011E1400002F
-:1029D00000000001212C00000000000122E40000A2
-:0229E0000000F5
-:00000001FF
-/* This is the Myrinet MCP code for LANai4.x */
-/* Generated by cat $MYRI_HOME/lib/lanai/mcp4.dat > myri_code4.h */
diff --git a/firmware/ositech/Xilinx7OD.bin.ihex b/firmware/ositech/Xilinx7OD.bin.ihex
deleted file mode 100644
index 03e80857a549..000000000000
--- a/firmware/ositech/Xilinx7OD.bin.ihex
+++ /dev/null
@@ -1,177 +0,0 @@
-:10000000FF04A036F3ECFFFFFFDFFBFFF3FFFFFF72
-:10001000EF3FFFF7FFFFFFFFEF7FFEFFCEFEFEFE8D
-:10002000FEDEBDDDFDFFFDCFF7BF7FFF7F3FFEBFE3
-:10003000FFFFFFBCFFFFBDB57F7FBFBF7FFFEFFFAF
-:10004000FFFFFBFFF7F7FFFFFFFFFEDEFEFEFADE1E
-:10005000BDFDEDFDFDCFEFEFEFEFC7DFDFDFDFDF52
-:10006000FF7EFEFD7D6DEEFE7CFBF4FBCFDBDFFF54
-:10007000FFBB7FFF7FFFF7FF9EBF3BBFBF7F7F7F41
-:100080007E6FDFEFF5F6FDF6F5EDEBFFEFEFEF7EC0
-:100090007F7F6F7FFFFEFEFEFEFEEFBFFFFFFFFFD5
-:1000A000FFFFFFFFFFFFBC1F1FEEFFBCB7FFDFFF1F
-:1000B000DFEF3BE3D3FFFBFFFFDFFFFFFFBABF2D07
-:1000C000DBBDFDDBDFFAFBFFEFFBDBF3FFDFFD7FDB
-:1000D000EFFBFFFFBEBF27BAFEFBDFFFF6FFFFEF20
-:1000E000FBDBF3D99A3FFFAFBFFFFFBE3F37BD96A3
-:1000F000FFFFFFFFFFFFAEFBF3F3EBFFFFFFFFFF91
-:10010000FFF7FABCAEFEBEFEBB7FFDFF7FEFF7FB45
-:10011000BBD7F77FFFF7FFFFF7BCEDFDBD9D7D7BF4
-:10012000FB7B7BFBAFFFFEFDFDFEFEFFFFFFFFF74E
-:10013000AAB9BF8FBFDFFF7FFFFF7FCFFBEBCBEB0A
-:10014000EEFFFFD7FFFFFF3E333F1C7CFCFFFFFFAE
-:10015000FFFFCFD3F3E3F3FBFFFFFFFFFFEBFE3522
-:100160003F3DFDFDFFFFFFBFFFEF6FE3E3E3EFFF69
-:10017000FFDFFFFFF7FE3E5EFEFFFFFFFFFDFFFF1D
-:10018000AFCFF2CBCF8EFFFFFFFFFFFDFC3E1F9EE8
-:10019000ADFDFFFFBFFFFFEFFFB3F7E7F7FAFFFF8C
-:1001A000FFFFFFEEEBABAF9FE37FFFDEFF7FEEFFD6
-:1001B000FFFB3AFAFFF277FFFFF7FEFFFEBDAEDE70
-:1001C0007D7DFDFFBFEEFFFDFFDBFBFFF7EFFBFFDC
-:1001D000FFFEFF2DAFB9FD79FBFAFFBFEFFFFF91E7
-:1001E000FAFBDFF7F7FFFFFFFCCF37BFBFFF7F7FD3
-:1001F000FFFFFFAFFFFFF3FBFBFFF5EFFFFFF7FA9A
-:10020000FFFFEEFAFEFB55DDFF7FAFFEFFFBFBF5C8
-:10021000FFF7EFFFFFFFBEBDBDBDBD7D7B7B7B7BE1
-:10022000FBAEFFFDFEFFFFFFFFFFFFFFF7DAB76149
-:10023000FFB959F373F3DF7F6FDFEFF7EBEBD7FF16
-:10024000D7FFFFF7FE7FFB3E3873F67FFCFFFFCF43
-:10025000FFB7FBB3B367FFE7FDFFEFF67FB7BCF572
-:100260007BF6F7F5FFFFEFFFF7FFF7CEE7FF9FFF06
-:10027000FFF5FE7DFF5FFFFFFFFFFFFFFFEFFFF6D4
-:10028000CBDBEEFEFFDFFFFFFFFE7FBE1E3EFEFF6D
-:100290007DFEFFFFEFBFE7FFE3E3FFDFE7FFFFFFC9
-:1002A000B8EFB72FEEFFDFFFBFFF7FEFEBBFA3D3AA
-:1002B000FF7FFFFFFFFFF7BEFD3FCFFDFBFFFFFF0F
-:1002C000FFFFAFFBBFBBBFDBFDFBFFFFFFFF3EFE42
-:1002D0003FBABAFEFFFFFFEFFFEFC37FB29BFFFF06
-:1002E000FFFFFEFFFF3CFF3F3CFFFEFFFFFFFFFF66
-:1002F000AFF3FEF3E3EBFFFFFFFBFFF79AFEAF9ECA
-:10030000BEFEFFDFFFFF7BEFF7BFFBFBFBFFFF7FC7
-:10031000FFFFFFBCBDFDBDDD7D7B7B7B7BFBAEFFBF
-:10032000FFFFFEFEFFFDFFFFFFF79AFF9FFFAFEF0E
-:10033000FFFFFFFF7FCFF3FFEBFFEBFFFFBFFFFFF1
-:10034000EFFEFF37FCBFFFFFFFFFFFFFCFEFFDF327
-:10035000FFEEFEFFFFFFFFFF6EFD2FFDFFFDFFFF26
-:10036000FFFFFFEFCFFFF3BF69FFFFFFFFFFFFFEC0
-:10037000FB9FFFBFFDFFFFFFFFFFEF87FEDAEFCF21
-:10038000FFFFFFFFFFFFFEEFBFEFEFFDFFFFFFFFF0
-:10039000FFEFFDFF7BFFEBFEFFFFFFFFEBF8FFEF43
-:1003A000AFFFFFBDFFFFFF7FEE7FEFFFBBFFBFFB98
-:1003B000FFFFFFF7F6FBBDFDDDF5FFFFFFFFFFAF22
-:1003C000FF5FF5DFFF7FFFFFFFFFFFF6F3FFDEFEBE
-:1003D000EFFDFFFFFFFFEFFFDEDF5FDFFDFFFFFF52
-:1003E000FFFFFEFFFFFEFEFFFDFFFFFFFFAFFFFF72
-:1003F000EFEDFFDFFFFFFBFFFFDABDBEAEFE7FFDCF
-:10040000DFFFFF7FEFFFFBFBFB7FF7FFFFFFFFF748
-:10041000BCFDBDBDBDFD7B7B7B7BFBAEFFFFFDFF60
-:10042000FFFFFDFFFFFFFFFA9FBFBFCF7FFFFFFF73
-:10043000FFFFAFFFEBEBEBFFD7FEFFFFBFE7FEBF1A
-:100440007FFCFFFFEDFFFFFFFF4FFFFBFBFFFFDD2B
-:10045000FFFFFFFFFFFEBDDF9DFDDFB9FFFFFFFFD9
-:10046000EFFFFBEFEBFFDEFFFFFFFFFFF69FFFFC61
-:10047000FEFBFDFFFFFFFFEFDFFACDCFBF9FFFFFCA
-:10048000FFFFF7FEBFFFDFEF5FFFFFFFFF7F6FFFA5
-:10049000BBFDFFFFFFFFFFFFFFFF7EFF5FFFBFBF53
-:1004A000F9FFFFFF7F6E7BFFEFFDEBDFFFFFFFFF3D
-:1004B000F7B63EFCFDBF7EFBFFFFFFF7EFF7F3F75C
-:1004C000FFFBFFFFFFFFFFFF6E3579FFBFFCFFFF64
-:1004D000FFFFFFEFFB53DFFFEBBFFFFFFFFFFFBCA3
-:1004E000FFFFFFBFFFFDFFFFFFFFAFF5FFF7FFFBC4
-:1004F000FFFFFFFFFFFFBAAAEEFE3F7DFDFFFFFFFC
-:100500007FAF77FBFBFFFBF7FFFFFFFFF7BEBDBD34
-:10051000BDBDFD7B7B7B7BFBAEFFEFFFFFFFFFFCE9
-:10052000FFFFFFFF9AD9B8FFFF79FFFFFFFFFFCF63
-:10053000FBFFEBFFEBD7FFFFFFFFE7DEF8FBFE3F24
-:10054000FBFDFFFFFFFFCFADBFFAFF73DFFFFFFF34
-:10055000FFFF3AF5B7FC3FF9FDFFFFFF7FEFF3FF29
-:10056000BFFEF39FFEFFFFFFF73EFFFFFFBFFFFF52
-:10057000FFFFFFFFAFD3FEDBFFDBDFFFFFFFFFFF70
-:100580003EFFBFFF7FFFFDFFFFFFFF8FF3FFEDFF8C
-:10059000F7FBFFFFFFFFEFF63CFEFFFFFFFFFFFF54
-:1005A000FF9FEFEFD1FFFFFFFFFFFFFFFFFF7EBFCA
-:1005B000FDFFFFFFFFFFFFFFBBEFDFF1FFFFFFFFCF
-:1005C000FFFFFFFFFFEE3EFEFFFFFFFFFFFFFFBF4E
-:1005D000EFFDC3FFFFFFFFFFFFFFBFFFFC3EFEFF7E
-:1005E000FFFFFFFFFFFFFF2EEFF3FFFFFFFFFFFF08
-:1005F000FFFFF7BABEFEFFFFFFFFFFFFFF7FAFFB6E
-:10060000FBFDFFFFFFFEFFFFFFF2D6EDBDBDBD7D91
-:100610007B7B7B7BFBAFDFFFFFFFFFFFFFFFFFFF6E
-:10062000FF92BFFFFFFFFFFFFFFFFF7FAFEBEBFF7F
-:10063000FFFFFFFFFFFFFFE7FE2EFEFFFFFFFFFFB5
-:10064000FFFFFF4FEFF3FFFFFFFFFFFFFFFFFFFE87
-:100650003CFEFFFFFFFFFFFFFFFFEFCEC3FDFFFFED
-:10066000FFFFFFFFFFFFFE5DFFFFFFFFFFFFFFFF3D
-:10067000FFEFCFEBFFFFFFFFFFFFFFFFF7EE3EFFB8
-:10068000FFFFFFFFFFFFFF7FEFDFE2FFFFFFFBFF4B
-:10069000FFFFFFFFF6BEFCFFFFFFFFFFFFFF7FEE48
-:1006A0005FE6FFFFFFFFFFFFFFFFFF3E7DFFFFFF56
-:1006B000FFFFFFFFFFFFEFF3FBFFFFFFFFFFFFFF6A
-:1006C000BFF736BEFEFFFFFFFFFFFFFFFFEFD3F6D2
-:1006D000FEFFFFFFFFFFFFFFFFFC7FEEFFFFFFFFBF
-:1006E000FFFFFFFFAFEFEBFFFFFFFFFFFFFFFFFF8E
-:1006F000BABEFEFFFFFFFFFFFFFFFFEEFBFAFFFFAB
-:10070000FFFFFFFFFFFFF7D6FDBDBDBD7D7B7B7B00
-:100710007BFBAEFF7EFFFFFFFFFFFFFFFFF7BABFD0
-:10072000FFFFFFFFFFFFFFFF7FEFEB6BFFFFFFFF11
-:10073000FFFFFFFFF7FEBEFEFFFFFFFFFFFFFFFF14
-:100740004FEFF7FFFFFFFFFFFFFFFFEF3E6EFCFFE6
-:10075000FFFFFFFFFFFFFFEFC3C9FFFFFFFFFFFF2B
-:10076000FFFFFF3EBFFFFFFFFFFFFFFFFFFFEFFBAE
-:10077000D5FFFFFFFFFFFFFFFFFFFEFEFEFFFFFFB6
-:10078000FFFFFFFFFF6FEFFBFFFFFFFBFFFFFFFF21
-:10079000FFF6DFFFFFFFFFFFFFFF7FFEEFFFFFFF23
-:1007A000FFFFFFFFFFFFE7FFFEFFF7FFFFFFFFFF7A
-:1007B000FF7FFAEFBFFFFFFFFFFFFFFFFFE7FFFE37
-:1007C000FFFFFFFFFFFFFFFF7FFEEFBFFFFFFFFF0A
-:1007D000FFFFFFFFA7FFFCF7FFFFFFFFFFFFFF7F0C
-:1007E000FEAEFFFFFDFFFFFFFFFFFFE7F7FAFFFD94
-:1007F000FFFFFFFFFFFFFF7FAFFFFFFFFFFFFFFFD9
-:10080000FFFFFFF7BEBDBDBDBD7D7B7B7B7BFBAF2F
-:100810007FFFFFFFFFFFFFFFFFFFFFCAFFFFFFFF9D
-:10082000FFFFFFFFFF7F6FFFFFFFFFFFFFFFFFFFE8
-:10083000FFE7FEFFFFFFFFFFFFFFFFFFFFCFFEFF12
-:10084000FFFFFFFFFFFFFFFFFFFEDFFFFFFFFFFFD9
-:10085000FFFFFFFFEFFFFEFFFFFFFFFFFFFFFFFFB9
-:10086000FEFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFA9
-:10087000FFFFFFFFFFFFF7FEFFFFFFFFFFFFFFFF91
-:10088000FFFFEFFFFEFFFFFFFBFFFFFFFFE7F2FCB5
-:10089000EFFFFFFFFFFFFFFF7FAEEFFFFFFFFFFF59
-:1008A000FFFFFFFFF77EFDFFFFFFFFFFFFFFFFFFE3
-:1008B000EFFFFEFFFFFFBFFFFFFFBFFFFEFEFFFFDB
-:1008C000FFFFFFFFFFFFDFEFDDFEFFFFFFFFFFFF8B
-:1008D000FFFFFFFEFEFFFFFFFFFFFFFFFFFFAFEF8A
-:1008E000FFFFFFFFFFFFFFFFFFFFBAFEFFFFFFFF5E
-:1008F000FFFFFFFFFFEFFAFEFFFFFFFFFFFFFFFF1E
-:10090000F69CBDBDBDBD7D7B7B7B7BFBAEFFFFFF52
-:10091000FFFFFFFFFFFFFFF77AFFFFFFFFDFFFFF94
-:10092000FFFF6FEFF7FFFFFFDFFFFFFFFFFFF7FEA8
-:10093000FEFFFFFFDFFFFFFFFFFFCFEBFFFFFFFF2C
-:10094000FFFFFFFFFFEF9EFCFFFFFFFFFFFFFFFF2B
-:10095000FFEFEFFFFFFFFFFFFFFFFFFFFFFEFFFFC8
-:10096000FFFFFFFFFFFFFF7FEFCBFFFFFFFFFFFD5D
-:10097000FFFFFFFFBEFDFFFFFFFFFFFFFFFFFFEFDA
-:10098000EFFFFFFFDFFFFFFFFFFFFFF8FFFFFFFFAE
-:10099000BFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFB7
-:1009A000FFFFFEFFFFFFFFFFFFFFFFFFFBAF7FFF2C
-:1009B000FFFFDFFFFFFFFFFFFFFEEFFFFFFFFFFF78
-:1009C000FFFFFFFFEFFFFFFFFFFFFFFFFFFFBFFF87
-:1009D000FEFFFFFFFFFFFFFFFFFFFFAEFFFFFFFF79
-:1009E000FFFFFFFFFFFFF7FAFFFFFFFFFFFFFFFF24
-:1009F000FF7FEFFFFFFFFFFFFFFFFFFFFFF7BCBD24
-:100A0000BDBDBD7D7B7B7B7BFBAFFFFFFFFFFFFFA2
-:100A1000FFFFFFFFF7FAFFFFFFFFFFFFFFFFFF7F73
-:100A2000AF7FFFFFFFFFFFFFFFFFFFEFFEFFFFFFB7
-:100A3000FFFFFFFFFFFFFFCFFFFFFFFFFFFFFFFFF6
-:100A4000FFFFFFFEFFFFFFFFFFFFFBFFFFFFEFFFCB
-:100A5000FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFA7
-:100A6000FFFFFFFFFFEFFFFFFFFFFFFFBFFFFFFFE6
-:100A7000FFFCFFFFFFFFFFFFFFFFFFFFEFFFFFFF99
-:100A8000FFFFFBFFFFFFFFEFFEFF9F9F9F3F3F3FEB
-:100A90003F3FFFEFDFDFDFDFCFB7BFBFBFBFFFBC31
-:100AA000B99DBDBD7D7B7B7B7BFBEFD7F5F3F1D1A2
-:100AB00065E3E3E3A3FFFE7FFEDEDEFFBDBDBDBD5C
-:100AC000DFEFFBF7F3F3F3E7E7E7E7E7FBFEFFFF13
-:0A0AD000FFFFFFFFFFFFFFFFFFFF26
-:00000001FF
-This file contains the firmware of Seven of Diamonds from OSITECH.
-(Special thanks to Kevin MacPherson of OSITECH)
diff --git a/firmware/qlogic/1040.bin.ihex b/firmware/qlogic/1040.bin.ihex
deleted file mode 100644
index d1213307f713..000000000000
--- a/firmware/qlogic/1040.bin.ihex
+++ /dev/null
@@ -1,2111 +0,0 @@
-:1000000007410600001078003A1000005841000037
-:100010004320504F525947495448312039392035EF
-:100020004C51474F43494320524F4F50415249543E
-:100030004E4F49205053303130324920542F462002
-:100040007269776D726120655620726569736E6F93
-:1000500030202E3735362020432073756F74656D40
-:1000600020726F4E202E303050206F727564746392
-:100070004E202E6F2020313024200120FD0404204A
-:1000800082A005004800451038004B10780047104A
-:1000900028004B10B920121278004D10B9202222EE
-:1000A000C120080071201000C3700400C920FF782F
-:1000B00089208611C7705349CB702050CF70202003
-:1000C000D3700700003FD670C1200800192000003F
-:1000D0000920FFFE00210B20A5A5ECA1FF7F642DC8
-:1000E0006B200A0ADCADFF3F542B5B2050501421DB
-:1000F00086A2A5A54000BF1086A30F004000851072
-:100100006A2C5A2AC120000019200F0078006510BF
-:100110006A2C5A2AC12008000920FF7F482144295F
-:100120004B200A0ABCA9FF3F34273B205050142122
-:1001300086A20A0A4000A9104A283A26C1200400D3
-:100140000920FF3F34210B205050142186A250502B
-:100150004000AA1078008E114A283A26C09888A13B
-:1001600000102C210B20A5A5142186A2A5A54000D6
-:10017000BC100A258AA10010C1987800C1100A2578
-:100180007800C1106A2C5A2A30218AA14000282107
-:10019000A2A10052248424842484248424842484DA
-:1001A00092A1007909200000012031007810261D5D
-:1001B000182279200052A02F082411200000A92025
-:1001C0004000A4420981C000DC10F27E2885E67D53
-:1001D000EA7CEE7B8378000031203000CF7801018B
-:1001E0000B7802000F7802004F780300692040521C
-:1001F0000120FD04042082A00500480004113800FD
-:100200000011780008111B683C0078000A11A80052
-:1002100008111B683C001B682800076807000B6872
-:10022000FA000F68080013680500236800002768BB
-:100230000600176808002B6800001F681900692075
-:10024000805411202000092010000B680C080F6852
-:100250001900036800FD076818001A6A002DE8A05D
-:10026000080090A204000981C000221169200055F5
-:1002700009200200A9200001376800000B68400037
-:10028000F07B86A3FFFEC0004811176800011F68BD
-:10029000640078004C11176864001F680200E8AD24
-:1002A000100070005211780039110981C000371117
-:1002B0007810A72278103D497810B5197810334E80
-:1002C000003285A00D009020C370000090006C11DA
-:1002D000C07086A00200C0006C11781084127810E3
-:1002E0009611CC7805A0C0007A1178104F1D10002F
-:1002F000801168008011781086211000801168003C
-:1003000080117810B91AE0006C117810BA4C78009E
-:100310006C118E119011AC24AC24BE49BE49AC24A2
-:10032000AC2478008E11780090117800921178003A
-:1003300094116800011261200000186084A001007F
-:10034000C0000112147805A0C000A711100002120D
-:100350007800011209205B52042105A0C00001129F
-:10036000092064520B200000147986A14200C000CD
-:10037000CC1116780920625264210B20000018600D
-:10038000C6701460CA701C618CA100FF206084A03C
-:10039000FF0005A1CE7078109A197800FF1114782B
-:1003A00086A01800C000D3117810781617780000C6
-:1003B00009206252042165A04000EF117E0C9C6070
-:1003C00060207810171A7F0C9F60000078104E177D
-:1003D00009200C000760030178107619C000FB119A
-:1003E00078109A19092062520B20000009205C52F3
-:1003F00004210B20000005A04000FF110120054052
-:1004000078008612780084127C00C3700000C770E8
-:100410000000CB700000CF700000C070BCA0C0FF17
-:10042000C00052123820790012128412E512A9126B
-:10043000FE120D131313A012661717139812AD12A4
-:10044000AF12B112B3126B179812291365139016DD
-:100450006017B512AF15CB15E7151216681576158E
-:100460008A159E15E913981297139D13A213A713CB
-:10047000AD13B213B713BC13C113C513DA13E613CC
-:100480009812981298129812F513FE130D14511425
-:100490005B146214A814B714C614D8144815581560
-:1004A00098129812981298125D15BCA0A0FFC00077
-:1004B0009812382084A01F0079005B12A417A71798
-:1004C000B7179812981231194E199812981298125B
-:1004D00052195A199812981298129812DB12F412A3
-:1004E0001F135B1386168217961798124718601908
-:1004F0000D1917191B19291998129812CA72C67169
-:100500000120064078008612CE73CA72C67101209F
-:100510000040C27068008712612000001B6001006B
-:1005200091200050E0008F12E000911268009112BB
-:10053000912080407C00C370014078008712C37016
-:1005400006407800871299204100A1204100A9208F
-:100550000500A35378008412C470C37004007A00AD
-:100560007800841278008412780084127800841253
-:1005700091200080C3700000C7705349CB70205099
-:10058000CF702020D3700700003FD6707920000084
-:100590001B78010031203000592000102920570419
-:1005A0005120700461207204B920FFFFC1200000B7
-:1005B0009120005091208040780055047810C41B91
-:1005C000C0009C12D875DC74DA75DE747800E8120D
-:1005D000292000002025D071C873CC72C470781017
-:1005E000FE1A40008412C370024078008412781012
-:1005F000C41BC0009C12D875DC74DA75DE747800F8
-:100600000113292000002025D071C873CC72C4705A
-:1006100078105E1B40008412C37002407800841280
-:10062000C471C87014210A2078008212C471142188
-:1006300078008212C7700700CB704100CF700600AF
-:10064000780084127810C41BC0009C12D875DC7628
-:10065000DA75DE7678002C13292000003025C4706E
-:10066000C872CC73D074C670CA72CE73D27405A02F
-:10067000400055130AA440003C13C80046130180F3
-:10068000927884A000FC40004A13CC7885A0010039
-:10069000CE7801200540780086129A7A9E7BA27D52
-:1006A000A67E967CCC7884A0FCFFCE787800591387
-:1006B000CC7885A00100CE78780084127810C41B15
-:1006C000C0009C12D875DC76DA75DE767800681387
-:1006D000292000003025C470C872CC73D474C67051
-:1006E000CA72CE73D67405A0400091130AA44000CC
-:1006F0007813C80082130180AE7884A000FC40000B
-:100700008613CC7885A00001CE78012005407800C2
-:100710008612B67ABA7BBE7DC27EB27CCC7884A0CB
-:10072000FFFCCE7878009513CC7885A00001CE78B8
-:1007300078008412092061520C21EC7A7800821230
-:10074000092041520C2178008312092042520C21C9
-:1007500078008312612040520C611062780082128E
-:10076000092045520C2178008312092046520C21A1
-:1007700078008312092048520C2178008312092046
-:1007800049520C217800831208790C7A7800821281
-:10079000C471078184A00F00038003800380E8A058
-:1007A0008054006A046884A008004000D713086BD6
-:1007B0007800D8130C6B78008112C4777810C519B3
-:1007C000912000801C6B146A91200180082778001A
-:1007D00081124C7978008312C4777810C519912062
-:1007E00000800869186A106B9120018078008112DE
-:1007F000C47182A11000C8007C1278107F23780099
-:100800008112C47182A11000C8007C1211204152D3
-:1008100004227E001221781038237F017800831291
-:10082000C47119200001042382A0060048001B1493
-:1008300011204914A920080078001F141120411428
-:10084000A9200800042206A140002A14108270008A
-:10085000281478001F1478007C12042382A006005C
-:100860004800331492A249147800351492A241141E
-:100870007E0211204252042212217F017E00781054
-:1008800044237F0178008312E803FA00F401EE02AA
-:100890006400190032004B00E803FA00F401EE0294
-:1008A0000400010002000300612040520C6110624C
-:1008B000C4700E60C87012607800821261204052CD
-:1008C0001461C47016607800831261204052C471B4
-:1008D000112004001F6019001920121286A128009F
-:1008E00040008314112005001F6019001920121206
-:1008F00086A1320040008314112006001F600C0006
-:100900001920222286A13C00C0007C1218607E00C3
-:100910001A61007884A00100C0009E140120FD042B
-:10092000042082A005004800961438009A1478002C
-:100930009E1428009A1478009E1419202222780010
-:10094000A01419201212B823781055237810334EB2
-:100950007F0178008312C47184A1CFFFC0007C1294
-:1009600011204852042212217E00781077237F0143
-:1009700078008312C47182A11000C8007C1211207B
-:10098000495204227E001221781066237F017800EC
-:100990008312C471C87284A1FDFFC0007B1284A2BF
-:1009A000FDFFC0007B12002108790A7800220C7A32
-:1009B0000E7878008212C471078184A00F00038032
-:1009C00003800380E8A0805419200000C872BCD2C4
-:1009D0004000E9149DA31000B4D24000EE149DA382
-:1009E000080000687E0026A240001115026A84A457
-:1009F00000204000FA149DA3100084A400104000C1
-:100A000000159DA3080084A40040400011150F812B
-:100A100084A2004040000D1578109923780011152C
-:100A200078108B2378001115CC72086806A240005C
-:100A30004015A4A2FF0061204052186186A1280041
-:100A40004000271586A1320040002D1586A13C00EC
-:100A50004000331582A4640048003D157800371526
-:100A600082A4500048003D157800371582A4430049
-:100A700048003D15C471C6717F02CA7278007D12AC
-:100A80000A6A9DA30A00046805A306687F020C6B2E
-:100A9000C47178008112C4777810C5199120008044
-:100AA000146A1C6B91200180C8701668CC701E6897
-:100AB000082778008112C4704C794E787800831230
-:100AC000C471C872CC7382A11000C8007C12781067
-:100AD000A72378008112C4777810C519912000806F
-:100AE000086A95A202000A6A91200180082778000E
-:100AF0008212C4777810C51991200080086A94A2E8
-:100B0000F9FF0A6A046805A04000851578106F2275
-:100B100091200180082778008212C4777810C519C7
-:100B200091200080086A95A204000A6A046805A062
-:100B30004000991578106F229120018008277800D5
-:100B40008212C47741200100492005005120200075
-:100B5000912000807810D219912001800827086A1E
-:100B600078008212C477C872CC73C677CA72CE730B
-:100B70007810521AC000C715186805A04000C715A4
-:100B800008277810B723C000C715177815009120E3
-:100B900001807C009120018078008412C477C677A0
-:100BA0004120210049200500512020009120008093
-:100BB0007810D219612040526F6003008267936001
-:100BC0000F00736000001778160078106F229120D4
-:100BD00001807C00C877CA77C477C677BCA700FFBE
-:100BE00091200080612040526F600200736000001D
-:100BF000826793600F001778170078106F2291209A
-:100C00000180412021004920040051201000912042
-:100C100000807810D219C8703668388784A71F0002
-:100C2000C0000616912001807C00CC7884A00300CF
-:100C3000C000361639200000412021004920040060
-:100C4000512008007810C5199120008008680DA86F
-:100C50000A6991200180388784A71F00C0001F16F1
-:100C6000BCA700FF3F8738873F8784A7000FC000DD
-:100C70001F169120008069200001306884A0400088
-:100C800040005F164B680400A9201400486884A047
-:100C9000040040004C1670004C16780043164B6858
-:100CA0000900A9201400486884A0010040005916DA
-:100CB0007000591678005016A920FA0070005F16CF
-:100CC00078005B1679200052177818006120405296
-:100CD0006F6001007360000093600F00CC7885A006
-:100CE0000200CE78086884A0FDFF0A681B684800EF
-:100CF000912001807C00CC7884A0FDFFCE7884A078
-:100D00000100C000821678109C1AC471C6714A791D
-:100D10007C007810C41BC0009C12D875DC74DA7596
-:100D2000DE7478009316292000002025C471C87352
-:100D3000CC72C671CA73CE727920005291200080A5
-:100D4000781080199120018040004A17A9200500E1
-:100D5000A120185291200080A141912001800920FA
-:100D6000200078107B194000B61678109A19780088
-:100D70004A17046084A000FF07800980400019170B
-:100D80007E0C682C912000807810801991200180C1
-:100D90004000EA16002C9E680981C000BE169F60C4
-:100DA00000007F0C7E0C18721C7320742475682C54
-:100DB0009C6865A0400018170920200078107B1956
-:100DC000C0000117046084A0FF0086A00200C000DC
-:100DD000EA16002D02607800D0167F0C7E0C9C6015
-:100DE00060207810171A7F0C9F60000078104E1753
-:100DF00009200C00086085A000020A6078107619AE
-:100E000078109A1978004A177F0C7E0C9C6060203D
-:100E10007810171A7F0C9F60000078104E17092079
-:100E20000C00076003011B6003007810761978102E
-:100E30009A1978004A177F0CC474C873CC72146076
-:100E400091200080177812007E0E712040526F7042
-:100E500005007370000076737A727E7482708770FA
-:100E60000000002C8A708F7000002EA030251C61BD
-:100E7000A26184A1600040003C177810D3487F0E27
-:100E80009665A6659A66AA66AF600000B36000002A
-:100E900078106F22912001807C00C370054078009B
-:100EA0008712A920050099201852912000800A532A
-:100EB00091200180002110A299A30000A1A40000AC
-:100EC000A9A500007C00C471C770000006797800F5
-:100ED0008412C471C671682178006D1769200010F2
-:100EE0000C6916A0042D10A2688D0981C0006F172F
-:100EF00085A20000C0007D17C370004078007F17F6
-:100F0000C3700340CA7078008712112067520C2208
-:100F1000C470038048008F177810513C84A1FF7F74
-:100F2000780093177810443C85A100801220780047
-:100F30008312C47178103B3C006101206752042089
-:100F400084A000800DA10462086378008112E47916
-:100F500078008312C471C6719821A1204200A92093
-:100F60000400A353A02199204200A9200400A35308
-:100F700078008412C470682079200052912000808B
-:100F8000781080199120018040004318076001000B
-:100F90000B6000002B6000001B600600106A8CA232
-:100FA0000F0084A2F000038003800380038005A16A
-:100FB000166084A200084000DE171B600A0078005B
-:100FC000E41784A200104000E4171B600C0084A208
-:100FD00000034000ED172B600100048004800480B2
-:100FE00085A001001E60236000002760000084A22D
-:100FF00000044000FA172B600000A920060080AC16
-:101000000B00A02080AD05009820A35384A200030C
-:10101000C0000F1846604A604E60526096609A6049
-:10102000780019180068466004684A60086E4E66C9
-:101030000C6D526596659A66146091200080177851
-:101040004200082C612040526F6005007360000070
-:10105000776000007B6000007F60000082608A6132
-:1010600084A200048E60912001807E0E71202000F9
-:1010700007700A0007700200037000007F0E9120C5
-:10108000008078106F22912001807C00C3700540A1
-:10109000780087127E0C7E0D7E0E7E0F91200080E0
-:1010A000712040527920000161201000A0706DA0D5
-:1010B00040000319046A94A2FF0086A207004000C2
-:1010C000621886A20F00C00003191C6984A1C00029
-:1010D0004000031984A18000C000D318246884A0B4
-:1010E00000FF85A019002668B071FF8140008918B3
-:1010F0007E0D69202000076810000869086806A1B5
-:10110000C0007A180C690C6806A1C0007F1884A181
-:10111000FF00C0007F187F0DB87884A01F80C0003A
-:101120008918487885A00C004A78B071FF8140008A
-:10113000AC18B37000007E0D69202000076818000D
-:10114000046884A00800C0009D18076808000468AF
-:1011500084A00800C000A418076802007F0DC461C5
-:10116000C862CC63C661CA62CE637E0E7120005233
-:1011700066726A7380AE19007F0E487884A00C00F6
-:10118000C000BA187810E147A3780000587884A00E
-:10119000FFED5A78B47080A0DA001A787F0F7F0EC6
-:1011A0007F0D7F0C9120018078008412246884A038
-:1011B00000FF85A019002668B87884A01F80C000B1
-:1011C000D918487885A00C004A78487884A00C008B
-:1011D000C000E218B071FF8140000119B370000037
-:1011E0007E0D6920200007681800046884A00800AC
-:1011F000C000F21807680800046884A00800C00056
-:10120000F918076802007F0D7800CB187F0F7F0E5A
-:101210007F0D7F0C9120018001200540780086120F
-:101220008079C671C47182A10300C8007C128279E2
-:10123000780084128079C671780084127479C6713E
-:10124000C47176797879CA71C8717A797C79CE71EE
-:10125000CC717E79780084127479C6717879CA71FC
-:101260007C79CE71780084120079C671C4710279DC
-:101270000120FD04042082A0050048004019380028
-:10128000421978004C19A8004C198CA10100C0002B
-:101290004A19B920222278004C19B920121278007C
-:1012A00084120079C67178008412092074520421D6
-:1012B000C670C4700A207800841209207452042178
-:1012C000C67078008412C471078184A00F00038067
-:1012D00003800380E8A08054146AB4D240007119DE
-:1012E0001120010078007319112000000C6B7800A8
-:1012F000811280AC01007810801B7C0080AC010062
-:101300007810201B7C00507865A040008819042CC0
-:101310005278632000007C007E0F792000525078C4
-:101320006DA040009819042D5278036800000768EA
-:1013300000000B6800007F0F7C00912000807E0F72
-:101340007920005250786220002C05A0C000A71917
-:1013500078108C2452787F0F912001807C007E0FC2
-:101360007920005250786A20002D52787F0F7C003F
-:1013700011200079527AEC7B19834000C21980A2B7
-:101380003100122010207800B919132000007C00D1
-:1013900084A7000F0B8084A71F00038003800380B5
-:1013A000038005A1E8A000557C007810C51900292C
-:1013B0002A68002A2E68086884A0EFFF0DA80A6931
-:1013C000092052520C21046805A04000041A16A1FD
-:1013D000C000EF196020006006687E010B2000004D
-:1013E0007800F219092000007E01046865A0400021
-:1013F000011A006006687810311A7810CB1C10684A
-:1014000001801268C000F2197F01026906697C0040
-:1014100065A04000161A08209C6005A04000131A21
-:1014200062209F60000065A07800091A5078527908
-:1014300062207C0065A04000301A08209C6005A056
-:101440004000251A62209F60000065A078001B1AEA
-:101450007E0F7920005291200080507852797F0FC2
-:101460006220912001807C00076003018F600000F2
-:10147000A9201C0080AC0500A02001200000A44091
-:1014800028681A602C6822607C007E0E7120405211
-:101490004C708CA00002C000501A88A080520A2D07
-:1014A00000804E7006A07F0E7C007810C519912038
-:1014B000008004681E7865A040009B1A7800631ABB
-:1014C000002C1E78006065A040009B1A0C6006A3EB
-:1014D000C0005D1A106006A2C0005D1A282C012011
-:1014E0005252042006ACC000741A7800991A04689D
-:1014F00006ACC000811A006065A00668C0008B1AA7
-:101500000368000078008B1A00641C786020026475
-:1015100086A40000C0008B1A002C02686025781099
-:10152000311A1B600500236020007810CB1C106866
-:10153000018050108C24126885A0FFFF7C003920A8
-:101540000000412021004920040051200800912082
-:1015500000807810D219388784A71F00C000A61A0F
-:10156000BCA700FF3F8738873F8784A7000FC000D4
-:10157000A61A912001807C0061200000186084A0E0
-:101580000100C000CA1A91200080E078E3780000D2
-:101590009120018005A0C000CB1A7C008CA0F0FF38
-:1015A0004000D11A78108C247900D31AE31AE61A75
-:1015B000EC1AF01AE41AF41AFA1AE41AE41A951C4E
-:1015C000B91CBD1CE41AE41AE41AE41A7C00781071
-:1015D0008C2478109C1A012001807800C31C012003
-:1015E00003807800C31C012004807800C31C78109D
-:1015F0009C1A012006807800C31C01200780780017
-:10160000C31C3020382182A721004800061B092076
-:10161000200000267810201BC0001F1BBAA7200046
-:1016200048001E1B40001E1B0827B0A6200090A2E9
-:10163000400099A30000A1A40000A9A50000780023
-:10164000001B06A07C00FF8140005B1B992030003E
-:10165000A0200C7084A0FF004000321B0770040023
-:10166000047084A00400C0002D1BA8211770000086
-:101670000B8112711A721E73227426750C7885A064
-:1016800001000270077001000120FD04042082A007
-:101690000500C8004F1B09202200042184A000403F
-:1016A000C000411B08700B80C800411B077002007E
-:1016B0008CA0E001C0005B1BA55306A003700000D6
-:1016C0007C003020382182A721004800661B0920B9
-:1016D000200000267810801BC0007F1BBAA72000C6
-:1016E00048007E1B40007E1B0827B0A6200090A269
-:1016F000400099A30000A1A40000A9A50000780063
-:10170000601B06A07C00FF814000C11B9820A12027
-:1017100030000C7084A0FF004000921B0770040092
-:10172000047084A00400C0008D1BA8211770000065
-:101730000B8112711A721E73227426750C7885A0A3
-:1017400000000270A653077001000120FD04042070
-:1017500082A00500C800B01B09202200042184A03B
-:101760000040C000A21B107084A000F04000B91B14
-:10177000077008007800BD1B08710381C800A21B18
-:101780000770020084A1E001037000007C000120CA
-:10179000FD04042082A00400C800CD1B7800D01BEB
-:1017A00006A07800D21B85A001007C007E0E71206F
-:1017B0000052082D5870026805A0C000DD1B5E7144
-:1017C0005A717F0E7C00082C5878026005A0C0007A
-:1017D000E71B5E795A797C009120008014617810B3
-:1017E0008021006984A10001C000352084A100028D
-:1017F000C00031201C6805A0C0003D20036000002F
-:10180000082C5C7865A0C000051C5A797800061C7D
-:1018100002615E799120018078108C227C007E0E1E
-:101820007120005258706DA040001A1C00685A7058
-:1018300005A0C000191C5E70FF8D7F0E7C007E0D20
-:101840007E0C7E0F7920005280AF16006020006071
-:1018500005A04000431C6820146806A3C000331C88
-:10186000286884A0FF0006A44000361C602D780084
-:10187000241C006805A00260C000421C80AF160056
-:1018800006AC4000411C002C5E78002D7F0F7F0CC1
-:101890007F0D05A07C007E0D7E0C7E0F792000520E
-:1018A00080AF16006020006005A040006B1C68201F
-:1018B000146884A0FF0006A340005E1C602D780021
-:1018C000501C006805A00260C0006A1C80AF1600B2
-:1018D00006AC4000691C002C5E78002D7F0F7F0C49
-:1018E0007F0D05A07C007E0D7E0C7E0F79200052BE
-:1018F00080AF1600602000606DA04000901C14684E
-:1019000006A34000831C602D7800781C006805A0A9
-:101910000260C0008F1C80AF160006AC40008E1C19
-:10192000002C5E78002D7F0F7F0C7F0D05A07C00C2
-:101930009120008069204052006886A0000040008D
-:10194000A31C91200180E37809007C008068BCA082
-:1019500000FF412021004920040051201000781090
-:10196000D219388784A71F00C000AC1C91200180C9
-:1019700001200A807800C31C01200C807800C31C61
-:1019800078109C1A01200D807800C31CC270612061
-:1019900000001B600100912080407C000460082C46
-:1019A00063200000847800808678887805A08A7992
-:1019B0004000DA1C022C7800DB1C8E797C00076862
-:1019C00003017E0C61200052082D6B200000846012
-:1019D00000808660886005A08A614000EF1C022DAF
-:1019E0007800F01C8E617F0C7C007810031D400095
-:1019F000021D7E0C9C6065A04000FD1C7810171A2B
-:101A00007F0C9F60000078109A197C008C7865A08C
-:101A10004000151D91200080847801808678042C78
-:101A20008E7805A0C000131D8A7800809120018067
-:101A30007C00A920100006A0048086808E81C8004A
-:101A40001F1D00A27000231D78001A1D86808E8144
-:101A50007C007E15A920100005A04000491D1AA198
-:101A6000C800491D13828D8148003A1D1AA1C80083
-:101A70003B1D7000411D78002F1D1AA10823108204
-:101A80007000411D78002F1D7E00003284A0FFF7FA
-:101A900080207F007F157C007E00003285A000083A
-:101AA0007800451D9479D07006A14000BD1D91209D
-:101AB000008071202000047005A0C000BD1D0870CA
-:101AC000087206A2C000BD1D86A20800C000BD1D90
-:101AD00071201000781080194000BD1D9C7A987B01
-:101AE000A47CA07D84A100FF40008B1D312000005C
-:101AF0000B81B5860B81B5860B81B5860B81B586CA
-:101B00000B81B5860B81B586002110A2002619A392
-:101B1000A1A40000A9A500007800951D07810480FC
-:101B2000048010A299A30000A1A40000A9A50000B0
-:101B30000920200078107B19912001804000B41DFD
-:101B400078109A19A8780080AA7886A00200C000B0
-:101B5000BD1D91200080E3780200AB780000CC78B6
-:101B600085A00300CE78912001807800BD1DAB7860
-:101B7000000078104921046084A00F007900C21D84
-:101B800071201000912001807C00D21DF41D1A1ECE
-:101B9000D21D371EE11DC91FE41FD21DEE1D141EEC
-:101BA0007F1EEE1E571F691FE01F39200004DC78DE
-:101BB00005A7DE78086005A70A60781064209C609D
-:101BC000DA78781031217C00DC7884A000014000B4
-:101BD000E81D7800D21D1C6085A080001E60780082
-:101BE000FB1D7810C41BC000D21D78106321DC7867
-:101BF00084A000014000FB1D7800D21DDF780000AA
-:101C00000460078084A0FF00D27801809F600000FC
-:101C10004000111E781064204000111EDC7885A061
-:101C20000001DE787800131E781088207C00781080
-:101C3000C41BC000D21D78105F21DC788CA0000E80
-:101C4000C000231E84A00001C000251E7800D21D04
-:101C500078106420C000361E04618CA1FF0086A1AC
-:101C600007004000212086A10F00400021207810AD
-:101C700088207C00DC7884A0000140003E1E7800B3
-:101C8000D21DDF780000146711200100A920010097
-:101C9000186084A0FF0005A04000611E1120010013
-:101CA000BCA700FFA92020008EA001004000611EFB
-:101CB0003920000011200200A92000018EA002009E
-:101CC0004000611E78007C1E7810C51991200080AC
-:101CD0002B6800002F680000086884A0DEFF0A68F7
-:101CE000E8AD1000912001807000751E7800631E21
-:101CF000118240007C1EA92000017800631E78102C
-:101D00009A197C0001206752042084A000804000C2
-:101D10004920146178108021006984A101004000ED
-:101D2000A01E286084A0FF00C0004120006884A09D
-:101D3000010040004920036800000B6800000768AC
-:101D4000000078005120112001002060F4D04000F4
-:101D5000A81E95A20200C4D04000AD1E95A20800A6
-:101D6000CCD04000B21E95A200041C6084A00200EA
-:101D70004000B91E95A204002C608CA0FF0082A137
-:101D8000020048004D2082A11B00C8004D204000E9
-:101D90004D200E692C6007808CA0FF0082A10200FC
-:101DA00048004D2082A11B00C8004D2040004D205E
-:101DB0001269306005A0C000DC1E01201E000080FA
-:101DC0001668286084A0FF0040004920066828604B
-:101DD000078084A0FF00400049200A68026A78005A
-:101DE000512001204052042086A00700C000531F4C
-:101DF00001206752042084A0008040004920146123
-:101E0000781080210120525204201020FF824000CF
-:101E10000E1F80A00500042084A0FF0006A1C000C2
-:101E2000531F91200080046A086B186484A4030087
-:101E300040002D1F28618CA1FF000180C000231FDE
-:101E4000002110A24800531F78002D1F0180C00000
-:101E5000531F002112A24800531FFF824000531F4E
-:101E600084A40C004000471F28610F818CA1FF0053
-:101E700082A00400C0003F1F002118A34800531F88
-:101E80007800471F82A00400C000531F00211AA33E
-:101E90004800531F306005A040004D1F00801668A9
-:101EA000066A0A6B91200180780051209120018000
-:101EB00078004D2014617810802191200080086BFB
-:101EC00018834800651F0A6B91200180780060200C
-:101ED0009120018078004D202460078084A0FF00BD
-:101EE0004000871F86A08000C000C71FA9200800EF
-:101EF0006920107691200080006884A0FFFC0268B1
-:101F0000E8AD08007000831F7800791F91200180E0
-:101F100078005120286015A04000C71F1461781078
-:101F200080217E0C7E0DE8AD0700912000800068C6
-:101F30000DA04000C31F06A240009E1F682178002C
-:101F4000941F602100600268682C7810AC197F0D26
-:101F500018680DA04000BB1F602000621A6A1C6A4E
-:101F600002621E6878108919A02D9821A9203100DD
-:101F7000A353602D7810CB1C7800BE1F086800802A
-:101F80000A68912001807F0C7800602091200180F8
-:101F90007F0D7F0C78004920146178108021006843
-:101FA00084A001004000392091200080046A108242
-:101FB0004800DC1F066A9120018078006020912093
-:101FC000018078004D207810C41BC000D21D146120
-:101FD00078108021BE60BB600000006984A1080009
-:101FE0004000F31F206085A00001226084A1010051
-:101FF0004000492084A10001C000352084A10002D6
-:10200000C00031201C6805A0C0003D20046084A0F1
-:10201000FF0086A00F00C0000C2078106321DF783D
-:1020200000000460078084A0FF00D27801809F60D8
-:102030000000400021207810642040002120DC783E
-:1020400085A00001DE787C00D7780000DB780000F6
-:10205000246084A000FF26607810AC3A40004F1D39
-:102060007810E91B78004F1D0920170078005320D5
-:1020700009200E0078005320092007007800532023
-:10208000092035007800532009203E0078005320B5
-:10209000092004007800532009200600780053200E
-:1020A000092016007800532009200100246084A034
-:1020B00000FF05A12660912000807810CB1C9120A4
-:1020C000018078004F1D78109A1978004F1DD47840
-:1020D0006DA0C0006F20002CD678DA789F600000D9
-:1020E00078007B20002C9E689F600000D678002D31
-:1020F0000260D87806ADC0007B200260D0780180F5
-:10210000D278C0008720DC7884A0FFFEDE78D87803
-:10211000602006A07C002EA030251C61A26184A155
-:10212000FFE11E6084A16000400097207E0E7810C1
-:10213000D3487F0E9665A6659A66AA66AF600000D2
-:10214000B360000014677810C51991200080A0606A
-:1021500084A00080C000BE20086884A00100400068
-:10216000BE20912001807810311A912000807810D3
-:10217000CB1C91200180D7780000DB78000078002C
-:102180003021246096A00100C000C5200080266098
-:10219000106A14689120018002A24800D4204000F7
-:1021A000D420392000027810312178003021082C09
-:1021B00091200080A06084A0008040000121006880
-:1021C00065A040000621046A7E0E71204052007016
-:1021D00084A001004000FB20487006A2C000FB2044
-:1021E000046B1C2360210263002305A0C000F620BD
-:1021F0000269602202617F0E78000D216021026277
-:1022000006697F0E78000D21006865A04000062158
-:1022100002610269C0000A210669602103600000B2
-:102220006021A06084A0008040001721086884A07D
-:10223000FCFF0A681068008012689120018008681D
-:102240008CA040004000262186A040000A6878103B
-:10225000421A9120008078106F2291200180DB7853
-:102260000000D77800007C00086005A70A60912074
-:1022700000807810CB1C91200180D87865A04000A8
-:1022800044219C60DA789F60000078003421D77880
-:102290000000DB7800007C009079947800800AA12F
-:1022A000C800502106A09678D270047805A040009E
-:1022B0005E2101800678C0005E2168005E219120C9
-:1022C00080407C00392077217800652139207D21EC
-:1022D000042705A04000762100AC6820086B0C6C38
-:1022E0001069146A0A690E6A126B166C38877800D6
-:1022F00065217C00030009000F0015001B00000091
-:1023000015001B0000007E0C78103B3C682C7F0CF5
-:102310007C001000F7216800F72129200000CB780D
-:1023200000008C7865A04000F0210920745204213F
-:1023300084A001004000BE21046086A00301C0000B
-:10234000BE21186005A0C000BE21146005A0C00019
-:10235000BE217E0D69200000186884A00100C00025
-:10236000BD210C60C6701060CA70C37020801B68ED
-:102370000100912080407F0D7810F21C7800F5213B
-:102380007F0D7810F8214000F021046294A2FF0034
-:1023900096A203004000D021046296A21001C00062
-:1023A000DE21CB780100046294A200FF1782118223
-:1023B0004000DE21FF85C000F021108202A2C8008B
-:1023C000F0217E05781007227F054000EB21E078A0
-:1023D00086A003004000F0217800DE212885C8781F
-:1023E00005A040008E21FF854000F721912080400C
-:1023F000B078D6707C00AC7BB079D47002A1C000FC
-:102400000122002305A07C004800052202A37C00D5
-:1024100002807C000120FD04042082A00500C80089
-:1024200021229120008071202000047005A0C000AE
-:1024300056220870087206A2C000562286A2080022
-:10244000C00056227120100078105B220920200065
-:10245000046086A00301C0003022286005A0C000EF
-:10246000302209200C007810761940004922C478E7
-:102470000080C67886A00200C0005622912000800D
-:10248000E3780300C7780000CC7885A00003CE78FD
-:102490009120018078005622C77800007810F21C45
-:1024A000AC79B07800800AA1C800542206A0B278A6
-:1024B00006A071201000912001807C00078104801B
-:1024C0000480B87AB47BC07CBC7D10A299A30000C4
-:1024D000A1A40000A9A500007C0009205B52912066
-:1024E00000800A207E0F7E0E71204052007086A070
-:1024F0000000C000892209201252042105A0C0005A
-:10250000892279200001307884A0C000C00089228F
-:10251000180089221B784B007F0E7F0F7C007E0FF6
-:102520007E0E7120405291200080007086A0000035
-:10253000C000A22279200001307884A0C000C00031
-:10254000A2221800A2221B784D00912001807F0E4C
-:102550007F0F7C007E129120002371204052792051
-:1025600000014B780F009800B52238787800AE2231
-:10257000A9204000007882A004004800BE22A920C3
-:1025800060009B780000AF780000AF78000070001A
-:10259000C8227800C022007882A004004800D72218
-:1025A000B77093001920F04F781013232F7001801B
-:1025B0007800E322B77000001920704E78101323C2
-:1025C0001920AF4E781013232F7000800370000085
-:1025D00078102024047084A00F007E010920FD04DF
-:1025E0000C218AA105004800F8223800FE2285A0AF
-:1025F0008062780000232800FE2285A08062780097
-:10260000002385A0C0627F0106780F7804B243786A
-:10261000D800537880000B7808004770080053708A
-:102620007F524F7000007F1200207C007E137E14CA
-:102630007E157E04A1202B01042305A09A7840007A
-:1026400033231883242318839823A82484A400FF09
-:1026500040002B2382A40001A92000012020A653C2
-:1026600005A0C00022231833780019237F047F15AA
-:102670007F147F137C008CA10F0011200101042224
-:1026800084A0F0FF05A11220781020247C001120E6
-:102690000101A92009000B8170004D237800482317
-:1026A0008CA1000E042284A0FFF105A112207C0061
-:1026B00009200101A9200500138270005E23780023
-:1026C000592394A2E000042184A01FFF05A20A2040
-:1026D0007C0011200101A9200C000B8170006F23E8
-:1026E00078006A238CA100F0042284A0FF0F05A1CA
-:1026F00012207C0011200201042284A0CFFF05A13A
-:1027000012207C000381038080A020007E0C6120C9
-:1027100000019A60AC62AC637F0C7C000381038093
-:1027200080A022007E0C612000019A60A46084A039
-:10273000DFFFAE607F0C7C000381038080A022005D
-:102740007E0C612000019A60A46085A02000AE602C
-:102750007F0C7C000381038080A020007E0C612020
-:1027600000019A60A460AE621020A460AE631820DD
-:102770007F0C7C00912000807E0C7E0E186805A0E6
-:102780004000FE2361200076781006244000E823F4
-:10279000A9200000612000757E0C781006244000FE
-:1027A000D6237F0C608C7000D4237800C923780076
-:1027B000FE237F0082A000757120405286708271D6
-:1027C000012004006E7093700F0073700000781089
-:1027D0006A227800FA23C06005A0C000FE237120A1
-:1027E00040528271002C8A70012006006E70937036
-:1027F0000F007370000078106A220120000078003A
-:102800000024012001009120018005A07F0E7F0C93
-:102810007C00042C05A040001D2460200C6006A351
-:10282000C0001A24106006A2C0001A24146006A179
-:10283000C0001A2406A078001F2400607800072436
-:1028400085A001007C00112041520C228CA10F00B8
-:1028500011203B01042284A00001400036242120E5
-:1028600004FF22210B810B810B810B818DA1000FB5
-:1028700004217C007E0EE4688CA0200040008A24A5
-:1028800084A00600C0008A241460078084A00F0082
-:10289000038003800380F0A08054047084A00A00A9
-:1028A000C0008A24087194A100FF40008A248CA1F2
-:1028B000FF0001200C0006A140007124012012003D
-:1028C00006A1400075240120140006A140007924CF
-:1028D0000120190006A140007D240120320006A13C
-:1028E0004000812478008524092012007800872484
-:1028F0000920140078008724092019007800872413
-:10290000092020007800872409203F0078008724D0
-:1029100011200000002105A20A707F0E7C006800D3
-:102920008C2491200080712000007E00187084A00B
-:102930000100C00093247F0071201000CA707F0046
-:10294000C670C3700280DB704107DF700600712023
-:1029500000001B700100912080407800AA247E10A6
-:102960007E007E12912000233C7F587E307C387D93
-:10297000C277C674CA76CE7594A53F009CA40300A6
-:1029800084A40F007900C124D324D324D3240D2898
-:10299000093AD12402250C25D124D124D124D124D3
-:1029A000D124D124D124D12478108C24078584A06B
-:1029B0001F007900D82416250D28C729C42AEC2A1F
-:1029C0008C2D37309A30FB3080313832D6320225A8
-:1029D000E9280C30F824AC3DCC3D8F3F9B3F744040
-:1029E000F824F82449414D41AA3DF824FA3EF82440
-:1029F0005E3C0C25F82478108C241800B1247F123A
-:102A0000912001807F007F107C001920494F7810B1
-:102A100013232F7001001B784F007800FA2419202F
-:102A2000AF4E781013232F7000801B78CD007800F4
-:102A3000FA24427209200F520B20000084A50100E5
-:102A4000C000723C4000332578108C2403700000D5
-:102A50004B70000043700000377000007810E039C0
-:102A60001800B12409200F520B200000687005A047
-:102A7000C000FE256C7084A0070079003C25352637
-:102A8000442550256D258F25DC25B5254425781056
-:102A9000C839092048007810D82EC0004E25037090
-:102AA00004007800FA247810C839C0006B258070C3
-:102AB000078082789B781000AB780C009B786000D0
-:102AC000AB7801005B7804000920DD007810CC2E83
-:102AD000C0006B250370040093700F007800FA2487
-:102AE0007810C839C0008D258071078182789B7865
-:102AF00010008CA11F008DA1C000AA79AB78060040
-:102B00009B786000AB7802005B7804000920DD0050
-:102B10007810CC2EC0008D250370040093700F0038
-:102B20007800FA247810C839C000B3258071078175
-:102B300082789B7810008CA11F008DA1C000AA791B
-:102B4000AB7820008471AA79AB780D009B78600087
-:102B5000AB7804005B7804000920DD007810CC2EEF
-:102B6000C000B3250370040093700F007800FA24AE
-:102B70007810C839C000DA258071078182789B7887
-:102B800010008CA11F008DA1C000AA79AB780600AF
-:102B90009B786000AB7802005B7804000920DD00C0
-:102BA0007810CC2EC000DA2588708B700000682069
-:102BB0004A700370020093700F007800FA247810B6
-:102BC000C839C000FA2488706820146F7810BD38A6
-:102BD000502C78107A3A9B781000146884A01F005B
-:102BE00085A08000AA781C6E412001008C7084A012
-:102BF0000004012004004000FC25012006007800AC
-:102C00001D277810C839C000FA249B78100068701E
-:102C10006820146F7810BD38502C78107A3A08600C
-:102C200085A010000A60246805A040001C2682A030
-:102C3000060048001A2678001C2627680500146B39
-:102C40009CA31F009DA3C000587084A0008040007A
-:102C50002A2684A6010040002C269CA3BFFFAA7B45
-:102C600031202000412001000120030078001D27B1
-:102C70001800B1244C7485A4000040004F2680A0A9
-:102C800080523020507108812AA148004626092030
-:102C9000805264210465FF85C00060262184C00045
-:102CA00040265271037000004B700000407005A078
-:102CB0004000723C7800FA244C76B0A680525071E5
-:102CC000002678004B265271682558254A75502CED
-:102CD000346085A00000C0005D2608673A7784A7AD
-:102CE0003F034000962684A72100C0005D2684A7EC
-:102CF000020040007F2684A7040040005D26BCA798
-:102D0000FBFF0A6784A70800C0005D2684A71000A7
-:102D1000C0005D2684A70002C0005D2684A70001D4
-:102D200040009626186005A0C0005D26BCA7FFFEE7
-:102D30000A67236800001C6E84A60E00186140001C
-:102D4000A6261C6002A14800A9264000A9267800FA
-:102D50005926FF81C0005926C368000084A780005F
-:102D6000C000B1260C702260BCA77FFF0A677810F4
-:102D70007A3A1800B1249B78100046A07810C83920
-:102D8000C000FA24146B9CA31F009DA3C0005870C0
-:102D900084A000804000CD2684A601004000CF26FC
-:102DA0009CA3BFFF84A610004000D5269DA3200051
-:102DB000AA7B408884A60E00C000E026BDA71000B4
-:102DC0000A6778001B2758718CA100084000CB349B
-:102DD0001120200084A60800C000F126108284A6DD
-:102DE0000200C000F1261082AA7A40887810E039EB
-:102DF000146A0C6108818CA1FF00E0A10075642CAD
-:102E0000FF8C40001227146006A2C000FC26B860A8
-:102E10000180BA60C000F7267E0C602A086085A099
-:102E200000010A607F0C780035267810C839C00090
-:102E3000FA24602A0E61AA794088327101200100CB
-:102E40007E005C7184A118004000382784A1100026
-:102E500040002B277810D036C0005B2784A10800E3
-:102E600040003827A06984A10006C00038277810E8
-:102E7000BB3578005B27A06984A1000840004F277C
-:102E80007E0C7E026029006085A000200260046143
-:102E90008DA1100006617F027F0C7810D036C00033
-:102EA0005B27A06984A100024000572778100C36E8
-:102EB00078005B2784A10004C0003427A06984A1A6
-:102EC00000104000662714698CA100FF0F81781064
-:102ED0008B237F0002708CA6E00084A66000400077
-:102EE000742786A06000C00074278DA10040FF8871
-:102EF000400079278DA104005A79B6699B7860005B
-:102F00000028AA789B78610018688DA0008084A0B2
-:102F1000FF7F1A698CA680004000982797700000F8
-:102F20008AA00D00500096278AA00C0096710120FF
-:102F30000C000C809A71AA7808800C814000D13472
-:102F40008CA1F800C000D1347E157E137E14A12020
-:102F50002B019B7800000080AC8080AD0B00982096
-:102F6000A6537F147F137F15146807808278946DB1
-:102F7000D67DDE7D986ED27EDA7E7810C839C000AC
-:102F8000CF272C7003804800C8271920AF4E781037
-:102F900013232F700080307884A0C000C000CF279A
-:102FA0009800D727086084A0EFFF0A607810E03906
-:102FB00078002325007284A2070086A00100C000CB
-:102FC000E4271B784F007810E0397800F527B46AC1
-:102FD00095A200205A7A1B784F007810E0390072D1
-:102FE000002505A64000F52784A2070079100328D4
-:102FF00080AD0900367084A2070086A00100C000E1
-:10300000FA24186000801A607800FA240B284B4BD1
-:103010004B4B3A4B4B4B0B283A4B0B2878108C24DC
-:103020007810C8397E0F79200052CC787F0F84A0A9
-:103030000100400031286C7086A00100C0002028EB
-:103040006E707800C4286C7086A00500C0002F2820
-:10305000887068201B68040017680000206885A03D
-:10306000080022686F700000112004006C7186A1B6
-:1030700001004000522886A10700C0004228092014
-:1030800038520B20050078005228092013520421E1
-:10309000092012520A20092038520B2001006F70BB
-:1030A000000073700100780054286F7000007810E1
-:1030B00087487E15A9201000392000007810B0370D
-:1030C000B8A700017000632878005B287F150070A6
-:1030D0007900672895287C287C286F2895289528D2
-:1030E0009528952821205A52042405A040009528AF
-:1030F00006ADC0007C280068222078008C2820685B
-:1031000084A00100C0008828146F7810BD387810A2
-:10311000A23478008C2860706020006802601A6A0F
-:1031200017680000206885A0080022687810DC1C61
-:10313000212000767810D12821205A527810D128E9
-:103140007E15A9200000212000757810D128208448
-:103150007000A9287800A2286120005521200200D3
-:10316000A920000118601061FF814000B82802A169
-:103170005000B82812601B600000E0AC1000700026
-:10318000C0287800AF282184C000AD287F159C702E
-:1031900084A000804000CB287810CE3A0370000055
-:1031A0004B7000007800FA247E04042405A040003F
-:1031B000E528682000687E001A6A17680000206809
-:1031C00085A0080022687810DC1C7F007800D328D6
-:1031D0007F04232000007C0082A203005000EF281F
-:1031E00078108C2400237900F228F5286829852995
-:1031F00082A202004000FB2878108C246C706F7053
-:10320000000093700000790002290A290A290C297C
-:103210004029D7340A2940290A2978108C2480773C
-:103220007810B0378077BCA7000F7810BD381860D1
-:1032300005A0400037292120007609200400112034
-:1032400010007810A029400037297E15A920000021
-:10325000212000757E040920040011201000781040
-:10326000A0297F0440003629208470003629780088
-:1032700027297F15388784A71F00C00012297800EE
-:1032800023257800232580777810BD38186005A0A5
-:103290004000662921200076092005001120200029
-:1032A0007810A029400066297E15A9200000212061
-:1032B00000757E0409200500112020007810A02947
-:1032C0007F04400065292084700065297800562914
-:1032D0007F1578002325002279006B296E2970293B
-:1032E000702978108C24092012006C7086A00200CE
-:1032F0004000792909200E00186884A00080400051
-:103300007F291A696F7000007370010078005639C8
-:103310000022790088298D2970298B2978108C2426
-:1033200078108748007086A00100C00067347810CC
-:10333000B834086084A0EFFF0A6078105A34400067
-:10334000673478003526042405A04000C32968208E
-:10335000042D7E00146806A74000AF29202D7F00B1
-:103360007800A1297F0022201A69176800002068D0
-:1033700005A222687810DC1C1060018012600860D1
-:1033800084A0EFFF0A607810B8347C0085A00100AB
-:103390007800C22900237900CA29CF29CD29682ABB
-:1033A00078108C24EC7884A00100C000E329007020
-:1033B00086A00400C000DB297800062A7810B83403
-:1033C000086084A0EFFF0A6078006734E47805A005
-:1033D000D000062A1800FA24082084A03000C0007B
-:1033E000F2291B784F007800FA24EC7884A00300BF
-:1033F0004000EE29002184A007007900FC293F2A23
-:103400004A2A302A042ABB39BB39042A592A78109F
-:103410008C24007086A00400C000202A6C7086A056
-:103420000200C000162A11200200192000007800B6
-:10343000E9286C7086A006004000102A6C7086A0F7
-:1034400004004000102AE47984A1300040002A2AB8
-:10345000EC7884A00300C0002C2A78000C300120F6
-:1034600003007800A02D186884A000804000372A4F
-:103470001B681D0078108F372B7808301B7856009A
-:103480007800FA24186884A000804000462A1B684F
-:103490001D0078108F3778008639186884A0008066
-:1034A0004000512A1B681D0078108F372B78083098
-:1034B0001B78CA007800FA24186884A000804000B5
-:1034C000602A1B681D0078108F372B7808301B7816
-:1034D0008F007800FA2484A50F00C000852A0070B0
-:1034E00079006F2A2325792A772A6734673467346D
-:1034F0006734772A78108C247810B834086084A058
-:10350000EFFF0A6078105A3440006734780035269F
-:10351000E47805A0D000062A1800062A082084A016
-:103520003000C000942A1B784F007800FA24EC7811
-:1035300084A003004000902A002184A107007900A4
-:103540009E2AB02AB42AA82AA62ABB39BB39A62AA1
-:10355000B13978108C24781097372B7808301B7885
-:1035600056007800FA24781097377800863978105A
-:1035700097372B7808301B78CA007800FA24781027
-:1035800097372B7808301B788F007800FA240023B7
-:103590007900C72ACC2ACA2ACE2A78108C2478002F
-:1035A00080311B680800A3780000E47984A1300012
-:1035B00040008031EC7884A003004000803184A179
-:1035C00007007900E02AE82AB42A302A5639BB39A4
-:1035D000BB39E82AB13978106A397800FA2482A216
-:1035E00005005000F22A78108C2400237900F52A77
-:1035F000F82A4D2D5B2D00227900FB2A152B022B7A
-:10360000152B002B322D78108C249B781800A8786D
-:1036100084A0FF0082A0200048006B378AA004002D
-:10362000C8006B377900112B6B376B376B37193745
-:103630009B781800A87984A180004000262B780090
-:103640006B37007005A0C0001C2B1120040078000F
-:10365000E93284A1FF008AA01000C8006B3779000E
-:103660002E2B402B3E2B582B5C2B172C6B376B379C
-:10367000192C6B376B372E2D2E2D6B376B376B3725
-:10368000302D78108C2484A6001040004D2B012092
-:103690000005008000803A781B788D007800FA24BD
-:1036A000186884A000804000562B1B681D0078001D
-:1036B000442B780056391B681D0078007B37206941
-:1036C000226984A60018C0009D2B206884A00100F8
-:1036D000C000A52B186886A00800C0006E2B1B68D0
-:1036E000000084A600044000132C84A68000400043
-:1036F000992B97700000186884A03F008AA00D00E5
-:103700005000992B8AA00C00967101200C000C80AF
-:103710009A719B786100AA787E157E137E14A12091
-:103720002B019B7800000080AC8080AD0B009820BE
-:10373000A6537F147F137F151B7858007800FA2456
-:1037400084A600104000A52B1B7865007800FA24A1
-:1037500084A6600040000F2C84A6000840000F2CB7
-:1037600084A60080C000B32B7800CB2BB4A6FF7FCB
-:103770005A7EB66EDC7AD879D0781B80C800BE2B12
-:10378000008084A03F0008A191A20000986B002156
-:1037900002A3B268946B002203A3AE6884A6004023
-:1037A0004000D32BB4A6FFBF5A7EB66E007086A031
-:1037B0000300C000E02B78103D4978103A4B1B788D
-:1037C00064007800FA2406A07810414CB06AAC6915
-:1037D000986C946B002205A14000EF2B002222A4DC
-:1037E00000211BA3AA6CD27CDA7CA66BD67BDE7B85
-:1037F000002305A4C000012CB5A600405A7EB66E79
-:103800001B7864007800FA241B786400002215A15C
-:10381000C0000B2C78104B4B7800FA247810964B94
-:103820007800FA241B7865007800FA241B78580089
-:103830007800FA2478108C2478007A2C206984A1EE
-:1038400000014000312C8CA1FFFE22697E0C5470D7
-:103850006020006084A0FFEF0260046084A0F5FF98
-:1038600006607F0C7800692C84A100024000692C5E
-:103870008CA1FFFD22697E0C54706020006084A042
-:10388000FFDF0260046084A0EFFF06600820482C80
-:103890007F0C84A108004000692C7810B93878109A
-:1038A000BB35FF884000692C9B7860000028AA780F
-:1038B000587EB5A604005A7E84A60004C000632C7E
-:1038C0002B7808301B7856007800FA242B780830C3
-:1038D0001B7865007800FA24587E84A60004C00096
-:1038E000722C1B7858007800FA241B786500780049
-:1038F000FA24780073377800733719200000907924
-:103900008CA10700C000882C206884A00001400022
-:10391000782C092008009B781000A87894A0FF005C
-:1039200086A20100C000BF2C0023A87C00A41820A0
-:1039300002A14000B72C48009C2C7800B92C80A331
-:10394000020002A1C800B72C20698CA1FFFC2269EB
-:103950007E0C54706020006084A0EFEF0260046071
-:1039600084A0E5FF06607F0C587EB4A6FBFF5A7E5C
-:1039700078006A2C78001B2CA824A87AF000B92CB7
-:1039800078008A2C84A2F00086A02000C0001F2DA1
-:1039900018831883002302A14000CF2C4800CF2CAD
-:1039A00078001C2D86A223004000782C1C6884A07F
-:1039B000F1FF1E68587E84A6F1FF85A0100030201C
-:1039C0005A7E086085A010000A607E0C547060204A
-:1039D00004600820482C7F0C84A110004000F32CC8
-:1039E0007810B9387810D0367800022D7E0C5470DB
-:1039F000602004600820482C7F0C84A1080040004F
-:103A0000692C7810B9387810BB35FF884000692CD4
-:103A10009B7860000028AA78B5A604005A7E84A688
-:103A20000004C000162D2B7808301B785600780053
-:103A3000FA242B7808301B7865007800FA24A87ADD
-:103A400078008A2C1883002302A14000282D48000A
-:103A5000282D78008A2C84A28000C0007B37780053
-:103A6000733778007B3778006B379B781800A8781D
-:103A700084A0FF008EA0010040003D2D78108C2412
-:103A8000A87A94A2FF00A87884A0FF008AA004006E
-:103A9000C8006B377900492D6B3708356B376536B1
-:103AA00082A20000C000532D78108C2478108F372C
-:103AB0002B7808301B7865007800FA2482A2030076
-:103AC000C000612D78108C2484A40080C000842D57
-:103AD0006C7005A040006B2D78108C24146F8277D9
-:103AE000BCA7000F7810BD38086085A021000A60CF
-:103AF000388784A71F00C0006F2D781093376F7030
-:103B00000200092038520B2009007800862D781019
-:103B10009F372B7808301B7865007800FA2482A242
-:103B200004005000922D78108C2400237900952DEC
-:103B3000982D812EB42E86A2030040009E2D781071
-:103B40008C24012000007E00C06805A04000A72D45
-:103B500003700300A06884A000204000B02D08601E
-:103B600085A002000A607F003E70007084A00700FC
-:103B70007900B72D2325C12DC12DB62FF22F232576
-:103B8000F22FBF2D78108C2484A60010C000C92D00
-:103B90007810874840005B2E68788CA0FF004000BA
-:103BA000112E86A10800C000E02D7810B8340860FE
-:103BB00084A0EFFF0A6078105A344000112E78106C
-:103BC00087487800F82D86A12800C000112E7810B3
-:103BD0008748086084A0EFFF0A60186005A04000D5
-:103BE000F82D01801A6005A04000F82D018005A085
-:103BF0004000F82D1E60206884A0010040002325AD
-:103C0000206884A0FEFF226860707E0C602000683F
-:103C100002607F0C0460026805A0002DC0000E2E1B
-:103C200002600660780023257E017810E52E7F0172
-:103C300084A600DF1E682B680000146FFF8140001F
-:103C40005B2E86A10200C0005B2E84A60008C00087
-:103C50002E2E84A6600040002E2ED878DC7A2E68A6
-:103C6000326A206884A00008C0005B2E178794A2E7
-:103C70000F0013821382138290A2805490A200003E
-:103C80001C2284A30001C000442E78004A2E10821A
-:103C9000042285A018001220118284A30004400091
-:103CA000572EA06884A00001C000572E7810692FFD
-:103CB00078002325086085A002000A60166918684C
-:103CC00084A000804000632E3C701A688CA600DF40
-:103CD0001E697810A9347810B834C000702E0860BE
-:103CE00084A0EFFF0A60206884A00100C000792E44
-:103CF0007810A23478007D2E607060200068026029
-:103D00007810DC1C7800232582A204004800872E4E
-:103D100078108C24002279008A2E852E8E2E9B2EE0
-:103D20008E2E007086A005004000972E78108F37E9
-:103D30002B7808301B7865007800FA24907807808B
-:103D4000018084A0070080A018009A78A8798CA12F
-:103D5000FF0086A103004000B02E86A100004000B5
-:103D6000B02E78006B371B7865007800FA24206845
-:103D700085A004002268FF82C000BF2E78108F3714
-:103D80007800C62E11824000C42E78108C24781042
-:103D90009F372B7808301B7865007800FA242C7048
-:103DA00003804800D62E1920AF4E781013232F70B1
-:103DB00000807810E039307884A0C000C000E22E86
-:103DC0001800E22E1A7906A07C0085A001007C0074
-:103DD00084A66000C000EF2E2F680000336800004A
-:103DE0007800682F84A60008C000112FB46884A052
-:103DF000004835A684A60008C000112F9869946A6F
-:103E00002E69326A3C7005A0C000092F002205A16E
-:103E10004000102F3F701500007086A00600400083
-:103E2000102F781087487C0084A620004000332F94
-:103E300084A6004040001F2F2F6800003368000058
-:103E40007800092FB46884A0004835A684A60040F5
-:103E5000C000192F3C7005A0C0002D2F3F70150029
-:103E6000D879DC7A2E69326A7800092F84A600405E
-:103E700040003D2F2F680000336800007800092FB4
-:103E8000B46884A0004835A684A60040C000372F3F
-:103E90003C7005A0C0004B2F3F701500D879DC7A2C
-:103EA000D078FB80C800522F008084A03F0008A17A
-:103EB00091A200002E69326A002105A2C0005F2F86
-:103EC0007800092F007086A006004000682F781047
-:103ED000414C7800092F7C00086085A000020A6030
-:103EE00084A300024000752F086085A002000A60CC
-:103EF0001B6806008F68000093680000306A2C6918
-:103F00003E6A42692F68030033680000376820006A
-:103F1000976800009B682000B3680000AF6800004D
-:103F200000707900902F23259A2FA32F982F982F78
-:103F3000982F982F982F78108C24206884A0010047
-:103F4000C000A32F7810A2347800A92F6070502CE5
-:103F5000602000680260602A21205A52042405A0D3
-:103F60004000B22F20207800AB2F222D6B200000C4
-:103F70007C007810A9347810B834086084A0FFFD64
-:103F80000A602B6800009B780E00146F176802000F
-:103F90007810894C84A600084000CF2F1C698DA1A1
-:103FA00000201E69186884A000804000DF2F687818
-:103FB0008CA0FF004000DD2F1B681E007800DF2F63
-:103FC0001B68000021205A52042406AD4000E62F51
-:103FD000607400682220C36800003C6A4069326A4D
-:103FE0002E697810DC1C780023257810E52E2B68CC
-:103FF000000001200E00146F7810E6398CA0FF003D
-:104000001669186884A00080400005303C701A686A
-:104010008CA600DF1E696F700000780023250070F9
-:1040200005A0C00012307800232506A0781087482C
-:10403000176800001B6814008CA600DF1E692B683F
-:104040000000206885A0FF002268007079002530FC
-:1040500023252F302F3031303130313031302D3079
-:1040600078108C247810B834086084A0EFFF0A60C0
-:1040700078007234002379003A303D303F30983078
-:1040800078108C2484A60080C0007D3000707900F8
-:1040900046302325503050306C30503079306C3001
-:1040A0004E3078108C2484A6600086A06000C0008A
-:1040B0006830B4A6DFFFB4A6FFBFB5A600205A7EC5
-:1040C000B66E1C6884A0DFFF1E68781087487810E1
-:1040D0004B4B7800563984A6002040005A301868AF
-:1040E00084A00080400079301B68150084A6004041
-:1040F000400079301B68070078106A397800FA248C
-:10410000B4A6FF7F5A7EDC7AD879D078D2791B802A
-:10411000C8008830008084A03F0008A191A2000060
-:10412000986B002102A3B268946B002203A3AE68CF
-:104130001B7865007C0078108C24002379009D306A
-:10414000A030A230EB3078108C2484A60080C00010
-:10415000DA3000707900A9302325B330B330CF3086
-:10416000B330D630CF30B13078108C2484A66000C4
-:1041700086A06000C000CB30B4A6BFFFB4A6FFBFCE
-:10418000B5A600205A7EB66E1C6884A0BFFF1E68CC
-:104190007810874878104B4B7800563984A6002059
-:1041A0004000BD30186884A000804000D6301B68F5
-:1041B00007001B78CA007800FA24B4A6FF7F5A7E55
-:1041C000DC7AD879986B002102A3B268946B002244
-:1041D00003A3AE68D2791B7865007C00206885A0B7
-:1041E0000400226878102139B5A6000878108F37AE
-:1041F0002B7808301B7865007800FA2400237900BA
-:10420000FE3001310331053178108C2478007B3782
-:1042100084A60004C0002E31E47984A1200040006F
-:104220001531EC7884A00300400015312B7809305B
-:104230009B786000AB78000084A6FBFF5A78E47995
-:1042400084A1200040002631EC7884A00300C00047
-:104250002A31012014007800A02D84A107007900E4
-:104260006631907A94A207009B786000A879FF815C
-:10427000400064319B781000A87B84A30100C0003B
-:104280005531A87BA87B86A30100C00048310920D6
-:10429000F7FF78004E3186A30300C0005531092096
-:1042A000EFFF7E0C54706020046004A106607F0C58
-:1042B0009B786000AB78000084A6FBFF5A782B78CF
-:1042C000093020698CA1FFFD8CA1FFFE22697800D6
-:1042D00056393F2A4A2A703178316E316E3156395B
-:1042E000563978108C2420698CA1FFFD8CA1FFFE2B
-:1042F00022697800603920698CA1FFFD8CA1FFFE46
-:10430000226978005639E47984A1300040008A316E
-:10431000EC7884A00300C000B131007086A00400D6
-:10432000C000A4316C7086A00200C0009A31112038
-:104330000200192000007800E9286C7086A00600B1
-:10434000400094316C7086A00400400094310070ED
-:1043500086A000004000FA24186885A000801A6832
-:10436000012014007800A02D84A107007900B53148
-:1043700056395639BD315639BB39BB39563956399C
-:1043800084A680004000EC319471FF814000EC3144
-:1043900082A10D00D000CD31977000007800D2319D
-:1043A00082A10C00967009200C009B786100AA790C
-:1043B0007E157E137E149870148110A29A7280A0CC
-:1043C0000B0000AD9820A1202B019B7800000881F4
-:1043D000AC81A6537F147F137F157800603984A6C3
-:1043E0000004C0002D32206884A001004000603924
-:1043F0008CA6600084A660004000013286A06000A8
-:10440000C00001328DA100408CA1FBFF5A79B66932
-:104410009B786000AB7800009B786100186885A0ED
-:1044200000801A68AA7808800C814000D1348CA1E1
-:10443000F800C000D1347E157E137E14A1202B011C
-:104440009B7800000080AC8080AD0B009820A653C4
-:104450007F147F137F151468078082787800603995
-:10446000186884A00080400034321B6808001B7864
-:10447000C0007800FA24002379003B324032D43265
-:104480003E3278108C24007084A0070079004532F9
-:1044900023254F3284325A324D3223254D324D324C
-:1044A00078108C241C6884A00020400068320860CA
-:1044B00085A002000A6078006832C06805A0C000CC
-:1044C000843220698DA101002269C368010000685F
-:1044D0006A7078007E3220698DA10100226900682F
-:1044E000066005A0C000723202601C6884A00E0045
-:1044F00040007E321470BA68307188A1007578006F
-:10450000803209200076042102680A2D6271B66E9D
-:1045100084A660004000D23284A60008C000983211
-:1045200084A6FF7FB6689468A6689868AA68781021
-:1045300087487800D23284A620004000AD32C0689F
-:1045400005A04000A4327810894C7800A73206A05C
-:104550007810414CD879DC7AAA69A66A7800B3321F
-:104560007810CA38AA69A66A7810414C84A60080DF
-:104570004000D23284A6FF7FB668DC7AD87984A660
-:104580002000C000CA32D0781B80C800C53200802D
-:1045900084A03F0008A191A20000986B002102A313
-:1045A000B268946B002203A3AE68780023257800DC
-:1045B0007B373770000082A206005000DE32781090
-:1045C0008C24007084A00700C0108C3A002379006E
-:1045D000E632E9321233263300227900EC3210330E
-:1045E0007B37F232103342338433037005000120ED
-:1045F000107768204A707E15A92031000320000042
-:104600000080700002337800FB327F1580AD090016
-:10461000367017680000B76800072368000827682D
-:10462000030078006B3778108C240370050001209C
-:10463000107768204A7080AD09003670002279003A
-:104640001E337B3724332433423324337B377810B3
-:104650008C24037005000120107768204A7080AD1B
-:10466000090036700022790032333A333833383358
-:104670003A3338333A3378108C2478109F372B78BC
-:1046800008301B7865007800FA2403700200807AF5
-:1046900094A2000F9B781800A87C84A41F0015A288
-:1046A00069200076042D082D6271682005A0400065
-:1046B0005D33146806A240007933006878005033F7
-:1046C000037005000120107768204A7036707E154F
-:1046D000A920310003200000008070006E337800B4
-:1046E00067337F1580AD09003670166AB76800071A
-:1046F0002368000827680300B46E5A7E206884A0EF
-:10470000000C4000D333781097377800D333037010
-:104710000200807A94A2000F9B781800A87C84A4E1
-:104720001F0015A2A879A8798CA1FF00E8A1007547
-:10473000042D082D6271682005A04000A333146881
-:1047400006A24000BE33006878009633037005006F
-:104750000120107768204A707E15A92031000320BF
-:10476000000000807000B3337800AC337F1580AD5B
-:1047700009003670166AB7680007236800082768C2
-:104780000300B46E5A7E206884A0000C4000D3332E
-:1047900084A000084000CD3378109B377800D333D5
-:1047A000781097378B7000007800D3337E02078231
-:1047B00084A00F0003800380038080A080546020C9
-:1047C000567000605A7004605E7084A660004000FD
-:1047D0002B34986B946CAC69B06805A1C0000D34A3
-:1047E000D27BDA7BD67CDE7CB4A6FFB75A7E84A669
-:1047F000600086A0600040002B34C06805A0400027
-:104800000634037003002B68000078103A4B7800E0
-:10481000083478104B4BB5A600205A7E78002B3414
-:10482000B0681AA3002123A4002405A340002B3460
-:10483000D27BDA7BD67CDE7CB068B4A6FFBF5A7E22
-:104840007E00C06805A07F0040002934037003008B
-:1048500078103A4B78002B347810964B7F077810FD
-:10486000BD380920650084A6040040004C34E4787B
-:1048700084A0300040004434EC7884A00300400061
-:1048800044342B7808300920650078004C347E0FC2
-:1048900079200052781087487F0F400023251A792D
-:1048A000002D4A70078284A00F00038003800380DC
-:1048B00080A0805448207800FA24206005A04000A1
-:1048C000663401802260086085A008000A601070CC
-:1048D00026607C0006A078108748176800001B68D7
-:1048E0000100236840001F680001007084A00700D9
-:1048F000790077342325813481349E348934873498
-:1049000089347F3478108C247810A9347810A2343C
-:104910007810DC1C780023256C706F700000937099
-:104920000000790090349A349A349834983498344A
-:104930009A3498349A34790002296F700000780014
-:1049400023251B6800007800B62F006805A0C00072
-:10495000A734026006607C00106005A04000B234FD
-:104960000180D000B23478108C241260086084A0DA
-:10497000EFFF0A607C00186005A04000BE34018093
-:104980001A607C007810E0391B6818007800F53454
-:104990007810E0391B6819007800F5347810E03998
-:1049A0001B681A007800F5347810E0391B680300A2
-:1049B0007800F53480777810BD3884718CA1FF00C1
-:1049C000E8A10075042D082D682005A0C000E7347B
-:1049D000780023251468807206A24000EF34006836
-:1049E0007800E03400680A201B6805008B70000026
-:1049F0007810A934206884A00100C000FE3478102B
-:104A0000A2347810B8341F680000236820007810A2
-:104A1000DC1C7800232582A20300C0006B37A87D30
-:104A2000ACA5FF00A87CA4A4FF0020698DA1800094
-:104A3000226984A1000140006C358CA1FFFE22692F
-:104A4000A4A4FF004000563582A40C00480029357C
-:104A50004000293521200C002B852B8578102E381D
-:104A6000400033357810273678005F357810E93705
-:104A70007E0C6029046084A0F5FF06607810523631
-:104A80007F0C20698DA100012269587EB5A6040023
-:104A90005A7E84A60004C00050352B7808301B785D
-:104AA00056007800FA242B7808301B7865007800CF
-:104AB000FA247E0C6029046084A0F5FF066078105B
-:104AC00052367F0C587E84A60004C00068351B78DF
-:104AD00058007800FA241B7865007800FA247E0CD0
-:104AE0005470602000618CA100104000AC35086259
-:104AF000178294A2FF0082A20C004800803540007B
-:104B0000803511200C00002402A2C8008535202227
-:104B1000086294A2FF00187086A02800C000953596
-:104B200082A21900C8009B351120190078009B351E
-:104B300082A20C00C8009B3511200C00002202A5A7
-:104B4000C800A03528227810ED372B852B857810EA
-:104B50002E384000AC35781027367800B035781004
-:104B6000E93778105236587885A004005A787F0CBF
-:104B70002B7808301B7865007800FA247E0C6029B9
-:104B80000060E4D0C000D535B4D0C000CF3510608F
-:104B900084A00F00C000CF3504618CA1F5FF066131
-:104BA0007F0C7C0011203200192000007800FC35B9
-:104BB000A06884A00002C000CF35086294A2FF0064
-:104BC000187086A02800C000EA3582A21900C8002B
-:104BD000F035112019007800F03582A20C00C800D1
-:104BE000F03511200C0008631F839CA3FF0082A3F3
-:104BF0000C004800FC354000FC3519200C00AB7857
-:104C00000100AB780300AB780100AA7AAA7BC0A8A8
-:104C10000500206885A0000122687F0C7C007E0CC6
-:104C200060298CA1F5FF06611120320019200000D7
-:104C300078001736AB780100AB780300AB78010041
-:104C4000AA7AAA7BC0A80500206885A00001226876
-:104C50007F0C7C007E0C5471602178102E367F0C06
-:104C60007C00082084A0F0FF25A4867C18609A7838
-:104C7000AE7C1264A47884A0F8FF8CA1070005A183
-:104C8000A67816608A78A4A40F0027840482048082
-:104C900084A0FF0005A40E60EC788CD0C0005136D3
-:104CA000046084A0F5FF06607C007E0C54706020D8
-:104CB000781059367F0C7C0018609A78A47884A00C
-:104CC000F0FFA6781260847884A0F0FF86787C00DC
-:104CD00082A20200C0006B37A87A20698DA18000F3
-:104CE000226984A100024000AE368CA1FFFD22693A
-:104CF00094A2FF0082A20200C8006B377810F93638
-:104D00007810523680A901000C207810B93878103C
-:104D1000BB35FF884000A1369B7860000028AA7848
-:104D2000587EB5A604005A7E84A60004C0009B36B7
-:104D30002B7808301B7856007800FA242B7808303E
-:104D40001B7865007800FA24587E84A60004C00011
-:104D5000AA361B7858007800FA241B786500780082
-:104D6000FA2482A20200C800B63684A201004000E4
-:104D7000C036547188A100000C218CA10020C00015
-:104D8000C036112000007810DB377810F936781023
-:104D90005236587885A004005A782B7808301B7852
-:104DA00065007800FA247E0C7E02602900601120E4
-:104DB0000100ECD0C000E936BCD0C000E73614607A
-:104DC00084A04000C000E7368CA1EFFF066106A07A
-:104DD0007800F63611200000AB780100AB780200B5
-:104DE000AB780300AA7AC0A80400206885A000025E
-:104DF00022687F027F0C7C007E0C5470602078104B
-:104E000000377F0C7C00FF824000053711204000F6
-:104E1000186080A002009A78A47884A0BFFF05A241
-:104E2000A6788A781660EC788CD0C00018370460B9
-:104E300084A0EFFF06607C007E00007086A0030067
-:104E4000400022377F00780025377F0078006737E1
-:104E500084A6200040006737887884A04000400086
-:104E60006737B87B84A33F001B83C80035370080B9
-:104E700005A040004B371B83C8003E37018040002F
-:104E8000633784A6004040004B37B8781B80C800C9
-:104E90004737008084A03F00C0006337B4A6FFBF3F
-:104EA0005A7ED879DC7A0120010008A1C800573762
-:104EB00091A20000D279DA79D67ADE7A7810414C64
-:104EC0001B7864007810C64A7800FA241B786400C6
-:104ED0007800FA241B7865007800FA247810A3374C
-:104EE0002B7808301B7865007800FA2478108F370B
-:104EF0002B7808301B7865007800FA2427680200B8
-:104F000078109737E47884A0300040002325EC78AF
-:104F100084A00300400023252B7808301B7865000F
-:104F20007800FA24012005007800A53701200C0044
-:104F30007800A537012006007800A53701200D0074
-:104F40007800A537012009007800A5370120070067
-:104F50009B781000AA789B786000AB780100B5A61A
-:104F600004005A7E7C007E073F87BCA70F003B876A
-:104F70003B870387E0A08054B8A720009A7FA479DC
-:104F800084A10F004000C93784A1F0FFA678126009
-:104F9000046085A008000660388738879A7FA47966
-:104FA00084A140004000D93784A1BFFFA6781660D5
-:104FB000046085A0100006607F077C009B781000CD
-:104FC000AB780100AB780200AB780300AA7A9B783B
-:104FD0006000AB7804007C00212000002920320012
-:104FE0009B781000AB780100AB780300AB78010030
-:104FF000AA7DAA7C9B786000AB7805007C007E15BA
-:10500000078084A0FF000380038080A020009A789E
-:10501000A4798CA1F0FF01204652042082A0280030
-:10502000400017382120A03819201400A9200C00B6
-:1050300078001D382120AC3819201900A9200D0056
-:1050400011206400042484A0F0FF06A140002C3845
-:105050002084002310A270002C3878001F387F15A0
-:105060007C007E15092046520C2182A132004800A6
-:105070004238400046380920923819201100A920F2
-:105080000E00112032007800583882A1280040001C
-:1050900050380920A03819201400A9200C00112034
-:1050A0006400780058380920AC3819201900A9206C
-:1050B0000D0011206400002202A54000683848005D
-:1050C00068380881002310A27000653878005838CD
-:1050D0007F1506A07C007F1582A56400C800773884
-:1050E000087885A070000A78447085A0700046702A
-:1050F00078007738EC7884A0000340007F380421E2
-:105100007800903804219EA00211C0009038012040
-:10511000FD04042082A0050048008F380120011200
-:1051200078009038042105A07C0002110230023280
-:105130000342034404540456056605680678067A5B
-:10514000070C070C070E0232024202520262027280
-:10515000056605760578057A057C057E057F0222C1
-:105160000232024202520454046404740476047845
-:10517000047A047C047E047F9B78100046A07C00A7
-:1051800084A7000F0B8084A71F0003800380038087
-:10519000038005A1E0A000557C00D879DC7AD078A6
-:1051A0001B80C800D138008084A03F0008A191A2D4
-:1051B00000007C007E0F79200001092040529120E0
-:1051C000008004217900E1381739EB38EB38EB38EF
-:1051D000EB38EB38EB381B3978108C244B78040013
-:1051E000487884A00400C000ED384B780800487867
-:1051F00084A00800C000F438B46885A00040B668F8
-:10520000587885A000405A78307884A08000C0008B
-:105210001739180017391C6884A02000C000153900
-:105220007E0E7120405278106A397F0E780017394F
-:105230001B78CA00912001807F0F7C00B3700000B2
-:105240007810443B780017397E0C1468078084A0DE
-:105250000F00038003800380E0A08054046084A0DA
-:105260000A00C0005439086194A100FF400054397D
-:105270008CA1FF000120190006A140004339012044
-:10528000320006A14000473978004B390920200040
-:1052900078004D3909203F0078004D391120000079
-:1052A000002105A20A60046085A0020006607F0C50
-:1052B0007C001B7865007800FA242B7808301B7876
-:1052C00065007800FA241B7858007800FA242B78BF
-:1052D00008301B7856007800FA24092020520C214F
-:1052E00086A1000040007E3986A10100400081397E
-:1052F000092038520B200B006F7001001B7848000A
-:105300007C001B78C4007C00092038520B200A0066
-:105310007C00092020520C2186A100004000A13908
-:1053200086A1010040009B39092038520B200B0058
-:105330006F7001001B7848007800FA240920385269
-:105340000B200A007800FA242B7808301B78C40060
-:105350007800FA241B78CA007800FA242B780830E9
-:105360001B78CA007800FA241B788F007800FA2492
-:105370002B7808301B788F007800FA24186884A0F6
-:1053800000804000C2391B681D006F7001001B784F
-:1053900048007800FA247E00307884A0C000C00065
-:1053A000DE39087884A0FCFF0A78050005000500B6
-:1053B0000500EC7884A021004000DE3944700A78B2
-:1053C00005A07F007C00447085A0020046700A782A
-:1053D0007C007E00307884A04000C000E73998004F
-:1053E000F2397F009A78AC787C00087884A0FDFFC1
-:1053F0000A780500050005000500EC7884A021006E
-:105400004000013A9800FF397F009A78AC787E001E
-:1054100044700A787F007C00EC7884A00200C00011
-:10542000714884A77D00C000153A002778108C24AD
-:1054300084A70100C0000C3084A770004000253A0A
-:105440007E0C602D682F78103724782D682C7F0C07
-:1054500084A708004000323A4B780800EC7884A01A
-:105460000300400023257800563984A7040040003B
-:10547000653AB87884A001404000653A4B7808004E
-:10548000EC7884A0030040002325E47884A0070082
-:1054900086A00100C000653AC07885A00048302091
-:1054A0005A7E1B78CA007800FA244B7808001868E6
-:1054B00084A000804000613A1B68150084A600406B
-:1054C0004000613A1B68070078106A397800FA24B6
-:1054D0001B680300587884A0003F1E682F680000F6
-:1054E000336800004B780800EC7884A0030040008B
-:1054F000062A1800FA2478007337146B078384A0F7
-:105500000F0003800380038080A080546020482027
-:10551000567000605A7004605E70602A7C007900EA
-:105520008E3A963A973A963A993A963A963A963AFF
-:105530009E3A7C007810B8347810874838700A603A
-:105540007C00A07005A04000AB3A68207810D31B07
-:105550007810FE4778100548A37000007C007E0E8E
-:105560009120008071204052007086A00700C0008A
-:10557000C23A1061BC7006A1C000C23A7F0E78101A
-:10558000E01B7810C83A06A07C00912001807F0EB5
-:1055900085A001007C007E0F7E0E712040527800B5
-:1055A00097225B780000AF700E00092000017E0199
-:1055B000A0706DA04000DD3AA37000007800E33ACF
-:1055C000B370000078100C1C4000E93AAC702668FB
-:1055D0007810C63B7800DD3A7F017E157E0C7E0D8B
-:1055E000A920080061201076006005A102601C60FF
-:1055F0006DA04000013B00681E607810AC19086087
-:1056000000800A607800F43A18606DA040000B3BFF
-:1056100000681A607810AC197800013BE0AC080013
-:105620007000113B7800F13A9C7084A0008040002B
-:10563000183B7810443C7F0D7F0C7F157C007E1258
-:1056400091200023046884A00F007900243B343BA0
-:10565000343B343B343B343B343B363B3C3B343BC8
-:10566000343B343B343B343B3E3B343B363B78109D
-:105670008C247810D3457810AC197800423B276809
-:105680000B007810D3457810C63B7F127C007E1249
-:10569000912000239800603B307884A0C000C000B7
-:1056A000603B7E0D78101248002D2E680920040002
-:1056B00001200000276884007810C7477810C63B97
-:1056C0007F0D7800943B487985A100404A78980086
-:1056D000693B4A7978004E3B287886A03418C00090
-:1056E000723B85A104007800793B287886A01418C5
-:1056F000C000663B85A10C004A789B780E00AB7811
-:105700000200587884A0FF0085A000045A78B47085
-:1057100080A091001A78276884022C683668306867
-:105720003A6809200400012000007810C7477F1262
-:105730007C007E0D146B7810701C4000A33B682029
-:10574000276802007810C63B7800983B7F0D7C00EC
-:105750007E0D146B286CA4A4FF0078101C1C400064
-:10576000B33B6820276802007810C63B7F0D7C00A1
-:105770007E0D146B9CA3FF007810481C4000C43BB6
-:105780006820276802007810C63B7800B93B7F0D7F
-:105790007C007E0C146978103B3C04698CA1FF00EE
-:1057A00086A106004000E13B86A10D004000003CC0
-:1057B00086A11700C000DD3B7810AC197800DF3BF4
-:1057C0007810DE1C7F0C7C00046001804800FE3BEA
-:1057D00006600920000084A60100C000EE3B8DA1F8
-:1057E000008084A604004000F43B8DA102001E69E5
-:1057F0002368000004710F81186805A11A687800F9
-:10580000DD3B78108C24186005A0C0000F3C0860B8
-:10581000018048000F3C0A601C600268002D1E6079
-:105820007800253C88AC0600042105A04000183C07
-:1058300008207800113C02680A2D086001804800A9
-:10584000DF3B0A601860682000681A607800093C35
-:105850007E157E137E147E0C7E0D78108919C00093
-:10586000303C78108C24A02D7F13A9203100A35345
-:105870007F0C7F147F137F157800DD3B84A11F0010
-:1058800003800380038080A0107660207C001920B4
-:105890005152042385A001001A201920020104237B
-:1058A00085A001001A207C0019205152042384A0F5
-:1058B000FEFF1A2019200201042384A0FEFF1A20F3
-:1058C0007C0090798CA1F8FF9279B47080A0D80008
-:1058D0001A787800FA24A370000003700000437067
-:1058E0000100377000001800B12478100C1C400033
-:1058F000993C09200F520B200000BC686020006119
-:1059000084A1000340008D3C27680E0084A00002A3
-:105910004000893C276817007810C63B7800683C37
-:10592000007086A00700C0000D3D002DA27080AD64
-:105930000F0036707800A03C407086A00100400047
-:1059400033257800FA24312000001C6984A102006C
-:105950004000A93CB5A6040084A1C00003800380D8
-:10596000078080A0A63D042035A6206884A00004FE
-:105970004000C13C9B781800AB7803009B78810005
-:10598000AB780100B5A60050206884A000804000DC
-:10599000CF3CB5A600049B780E0024680780AA7847
-:1059A0007800EF3C1C68FCD0C000DD3CB5A60008C8
-:1059B0002068C4D04000EF3CB5A600407800EF3C22
-:1059C0002068C4D04000E53CB5A600407800EF3C1C
-:1059D0009B781800AB7802009B788100AB780100BF
-:1059E000B5A6001084A600024000093D2C68D278BC
-:1059F0003068D67884A600014000073D2C6884A05A
-:105A000001004000073D887884A040004000073D29
-:105A1000B5A600807810F6475A7EB66E78003548F5
-:105A20007810C839C000A03D2C70048048001B3D90
-:105A30001920494F781013232F70010041200100D5
-:105A4000312000109B781800146884A01F0085A0E6
-:105A50008000AA781C6984A102004000343DB5A6EC
-:105A60000400AB7820002868AA78C0A802001C684F
-:105A7000F4D040003D3D502C78107A3A781002471F
-:105A8000206884A0008040004B3DB5A600049B78B0
-:105A90000E0024680780AA787800523D1C6884A014
-:105AA0000080C000523DB5A60008206884A0000117
-:105AB0004000593DB5A600401C6884A0C00003808A
-:105AC0000380078080A0A63D042035A684A600019F
-:105AD0004000733D2C6884A001004000733D88782D
-:105AE00084A040004000733DB5A600809B787E00F6
-:105AF000AE7EB66E14680780AA7882781028AA7ADB
-:105B0000307884A0C000C000A03D1800A03DB47053
-:105B100080A0DD001A787810E03984A600024000E9
-:105B2000943D2C68D2783068D6787810F647002DEE
-:105B3000A2704A701068BE700370070080AD0F003D
-:105B400036707800FA247810D31B7810E03978008A
-:105B5000FA24000000030002000078108C240023C7
-:105B60007900AF3DB23DB23DB43D78108C24781041
-:105B70000548246984A1FF0086A00A004000C63DB4
-:105B800084A100FF85A00A0026687810D31B780046
-:105B9000683C01200A00781097477800683C82A290
-:105BA00005005000D23D78108C24007084A00700BE
-:105BB000C0108C3A78108919C000F43D6920FFFFAD
-:105BC00084A604004000E53D012000287800E73D60
-:105BD00001200008B47188A191009B780E00078015
-:105BE000AA78312000045A7E1A797800FA240768CE
-:105BF00006010B6800009F6800002768000086A36C
-:105C00000200C000153E86A20200C000153EA0782A
-:105C100005A0C000153E84A40080C000153EE478B5
-:105C200084A008004000153EB5A608001920000019
-:105C300078101742002DA2704A7003700700377069
-:105C40000000246884A080004000273E7810CD42E8
-:105C50007800FA24002379002A3E2D3EAE3EC73E4E
-:105C600000227900303E353E453E6B3E773E9A3EFF
-:105C70002920010026A0112000007810F3437900AC
-:105C80003E3E433EFA24683C433E433E78108C241B
-:105C900090798CA10700C0004C3E0920080011201B
-:105CA000010084A604004000543E1120030020227D
-:105CB0002AA1112001007810F34379005C3E613E77
-:105CC000FA24683C693E633E78003B48AB70673E0F
-:105CD0007800FA247800613E78108C2484A61000A5
-:105CE0004000753E78109C424000753E7800FA24D2
-:105CF00078000D43006084A002004000943EB47020
-:105D000080A0CD001A787E0D78101248002D2E68E4
-:105D1000276800007810C63B7F0D7810AC1903701F
-:105D20000000377000004B7000007800683C84A6CB
-:105D30000400C0009A3E78003B48006084A0040044
-:105D4000C000AC3E006084A001004000AC3EAB70DF
-:105D5000AC3E0120070078108F477800414878005A
-:105D60003B4800227900B13EB63EB83EB63EB63E54
-:105D7000B63E78108C24A770BC3E78004748E47883
-:105D800084A00800C000B83E78108147AB70C53EC3
-:105D900078003B4800227900CA3ECF3ED13ED13E3A
-:105DA000CF3ECF3E78108C24E47884A008004000D9
-:105DB000E63EA770DA3E78004748112004007810CC
-:105DC000ED437900E03EE63EFA24683CE63EF03ED4
-:105DD000F43EAB70EE3E0120030078108F47780050
-:105DE000414878003B48AB70E63E7800FA24AB703F
-:105DF000F83E7800FA247800EE3E82A203005000BC
-:105E0000003F78108C2486A30200C000193F86A2B0
-:105E10000200C0001F3FA07805A0C0001F3F84A45F
-:105E20000080C0001F3FE47884A008004000193FB4
-:105E3000B5A608001920000084A6080040001F3FF6
-:105E4000781079421068BE70037007000023790053
-:105E5000263F293F563F5E3F002279002C3F313FCD
-:105E60002F3F4A3F78108C249079ACA1070026A0E0
-:105E7000112001007810F34379003B3F403FFA24A2
-:105E8000683C483F423F78003B48AB70463F780053
-:105E9000FA247800403F78108C2484A6100040003B
-:105EA000543F78109C424000543F7800FA24780018
-:105EB0000D4300227900593F5C3F5C3F5C3F781006
-:105EC0008C2400227900613F643F663F663F781072
-:105ED0008C24E47884A0080040007B3FA7706F3FCB
-:105EE00078004748112004007810ED437900753F91
-:105EF0007B3FFA24683C7B3F853F893FAB70833F03
-:105F00000120030078108F477800414878003B4813
-:105F1000AB707B3F7800FA24AB708D3F7800FA2499
-:105F20007800833F00237900923F973F993F953F48
-:105F300078108C24A4707A00A4707A0082A20200E7
-:105F40005000A13F78108C2484A600024000AB3F93
-:105F50007810FE477810D543781005480023790063
-:105F6000AE3FB13FD93F3F4086ADFFFF4000683CA8
-:105F700086A201004000BB3F78108C2484A600025A
-:105F80004000C33F7810FE4778100548012001000B
-:105F900078109747B87884A001C04000D53F487872
-:105FA00085A008004A78487884A00800C000D03F47
-:105FB000037000007800683C00227900DC3FDE3F7F
-:105FC0000F40A770E23F7800474811200D0078107D
-:105FD000ED437900E83FEF3FFA24683CF73FFF3F8D
-:105FE00005400740B4A6FF00B5A60004B66E5A7E71
-:105FF00078003548B4A6FF00B5A60004B66E5A7EF8
-:1060000078003548AB7003407800FA247800EF3F01
-:1060100078108C24AB700B407800FA2478104D482F
-:106020007800FA24A7701340780047481120120026
-:106030007810ED43790019401F40FA24683C2B404A
-:1060400033403940B4A6FF00B5A60004B66E5A7EB0
-:10605000B47080A0AA001A787800FA24B4A6FF00D1
-:10606000B5A60004B66E5A7E78003548AB7037404E
-:106070007800FA2478001F40AB703D407800FA2485
-:1060800078002B4086A201004000454078108C2407
-:10609000A770494078004748112015007810ED435B
-:1060A00079004F405440FA24683C62406E40B4A6E8
-:1060B000FF00B5A60004B66E5A7E3B780113B4709B
-:1060C00080A0B5001A787800FA24B4A6FF00B5A61F
-:1060D0000004B66E5A7EB47080A0AA001A787800C8
-:1060E000FA24AB7072407800FA247800544082A2FF
-:1060F000030050007A4078108C24002379007D4002
-:106100008040B740144186A20100400086407810CC
-:106110008C24046884A0FF0086A00600C000934081
-:106120007810C63B037000007800683C3B680000B4
-:106130003768000084A600024000A1407810FE47A6
-:106140007810D54378100548012001007810974752
-:10615000B87884A001C04000B340487885A008000A
-:106160004A78487884A00800C000AE400370000060
-:106170007800683C00227900BA40BC40EF40A7702C
-:10618000C0407800474811200D007810ED43790099
-:10619000C640CD40FA24683CD540DD40E340E540B0
-:1061A000B4A6FF00B5A60008B66E5A7E7800354842
-:1061B000B4A6FF00B5A60008B66E5A7E7800354832
-:1061C000AB70E1407800FA247800CD4078108C2440
-:1061D000AB70EB40781005487800FA2478104D48F1
-:1061E0007800FA24A770F340780047481120050092
-:1061F0007810ED437900F940FE40FA24683C0641EE
-:106200000E41B4A6FF00B5A60008B66E5A7E78000F
-:106210003548B4A6FF00B5A60008B66E5A7E7800D1
-:106220003548AB7012417800FA247800FE4086A20F
-:10623000010040001A4178108C24A7701E4178009C
-:106240004748112006007810ED4379002441294188
-:10625000FA24683C2F413941B5A60008B66E5A7E33
-:1062600078003548B4A6FF00B5A60008B66EB5A6FE
-:1062700000405A7E78003548AB703D417800FA24E2
-:106280007800294100237900424147414541454179
-:1062900078108C2478108C240023A87105A07A0132
-:1062A0001068BE7082A203005000554178108C2403
-:1062B0000023790058415B4169418B4184A600026B
-:1062C000400063417810FE47781005480120010026
-:1062D000781097477800FA2496A202004000724195
-:1062E000FF824000724178108C24A77076417800BC
-:1062F0004748112018007810ED4379007C41814116
-:10630000FA24683C83418541780035487800354857
-:10631000AB7089417800FA2478008141002279002D
-:106320008E419041A941A7709441780047481120BF
-:1063300017007810ED4379009A419F41FA24683C98
-:10634000A141A3417800354878003548AB70A7419A
-:106350007800FA2478009F4184A40080C0000542A0
-:1063600084A600014000B5417810FE477810D5435F
-:10637000D878D278DC78D678B4A6FFEF5A7EA770AA
-:10638000C0417800474811200D007810ED43790096
-:10639000C641CD41FA24683CCD41F341F941FB416E
-:1063A000D878DC7905A1C000DF41B87884A01F004F
-:1063B000C000DF41B3700000587884A0FFFD5A7818
-:1063C0007800354884A600014000F141487885A056
-:1063D00008004A787810BC472C68D2783068D678A4
-:1063E000B37000007810F64778003548AB70F7417D
-:1063F0007800FA247800CD4178108C24AB700142EB
-:10640000781005487800FA2478104D487800FA246E
-:1064100078100548AB700F420120030078108F47B9
-:10642000780041487810F6472C68D2783068D678E2
-:1064300078003548B8701268BE700080BA701B686A
-:10644000000084A6080040003A427E157E137E14A8
-:106450009078048004800480048084A00F001A686F
-:10646000AC809B78000080AF2B00982080AD0B00A3
-:10647000A020A5537F147F137F15C4A6000F84A608
-:106480000200C00049422C690D810D810D8184A15B
-:106490000700082078005C429B781000AC7984A14A
-:1064A000200040005C427E01092005000120003DE3
-:1064B0007810C747246885A03B0026687F0184A127
-:1064C0001F0005A8166878103B3CBE6884A604002F
-:1064D00040006D428CA100FFA87884A0FF0005A1B8
-:1064E0002A68B4A6FF00006084A00800400077423C
-:1064F000B5A60040B66E7C007E157E137E1418692A
-:106500009078048004800480048084A00F007E00C2
-:1065100000A11A687F000080048040009842A820F3
-:10652000048180A00B0000ADA0209B78000080AF0C
-:106530002B009820A5537F147F137F157C002C68B7
-:1065400084A02000C000A4420C627800A542106222
-:10655000186B002302A24000C542182082A30E003F
-:106560004800B5424000B54219200E007800B942FB
-:10657000587884A0EFFF5A783B78011B937800008D
-:10658000A27BB47080A08E001A7885A001007C00E8
-:10659000587884A0EFFF5A789378000006A07C001A
-:1065A00004698CA1FF0096A107004000DA4296A181
-:1065B0000F004000DA4207681701146978103B3C6D
-:1065C00000610481C800F5421C6005A04000E9425A
-:1065D000012000087800F7427E0D24687E007810C4
-:1065E00012487F002668002D2E687810C63B7F0D6C
-:1065F0000120000224698CA1FF000DA126690780FB
-:106600009B780E00AA78206885A00080226831203F
-:106610000004B66E5A7EB47188A191001A797C008C
-:10662000C4A6000F84A60200C00021432C690D817E
-:106630000D810D8184A10700082005A81668781037
-:106640003B3CBE6878002443146978103B3C0061F1
-:106650000481C800824384A10003400030430768DE
-:10666000170178004E43046005A0C0005743076837
-:1066700017011C6005A0C00044437E0D781012482D
-:1066800027683400002D2E687810C63B7F0D84A645
-:10669000040040004E43312000040120002878000F
-:1066A00052433120000401200008B47188A19100F8
-:1066B0007800B043186005A0C00044431C6005A0EA
-:1066C000C00044439F68000027683D0084A6010085
-:1066D0004000BE4394D6C0007B430061D4D140004B
-:1066E0007B432C698CA1FF004000BE4386A10300C0
-:1066F0004000BE4386A112004000BE43B5A600087C
-:10670000B47188A1AE007800B94307681701312041
-:1067100000042C698CA1FF0086A11200C0009343E5
-:106720000120CB43092001007800A44386A1030087
-:10673000C0009D430120CC43092012007800A443EF
-:1067400001200002B47188A191007800B043781054
-:10675000E147A37800001C6885A040001E68B47162
-:1067600088A1DA0006A0266807809B780E00AA7828
-:10677000206885A000802268B66E5A7E1A7978005B
-:10678000FA24B66E7810C63B1068BE70037007001E
-:10679000A37000004B7000007800FA242300700002
-:1067A00005000000000A00000000250000000000B5
-:1067B0003B6800003768000084A600024000EC43FC
-:1067C000B8788CA01F0084A000804000E5430881B9
-:1067D000D87800A13668DC7881A000003A687C0097
-:1067E00090790F81ACA507002120000080A4100043
-:1067F0009A78A8798CA1FF0084A18000C0001B4476
-:1068000082A12000C800394482A11200C80081473B
-:106810000021791009447C008147EB45814781477D
-:10682000464449448344B944ED44F0448147814798
-:10683000A44414454E4581478147744584A12000F6
-:10684000C000A8458CA11F00146884A01F0006A1E9
-:1068500040003644B47080A0CD001A7801201400A6
-:106860007810974778100548037000000120020057
-:106870007C00012000007C0082A12400C800814728
-:1068800084A10300791009447C0081478147814736
-:106890008147781081477C00002279004C4477457D
-:1068A0007745704470447044704470447044704440
-:1068B00070446E4470446544704470447044704445
-:1068C000704478447B4477457B4470447044704402
-:1068D0007E0C7E07146F7810B0377F077F0C78002E
-:1068E000704478108E462768B30209200B000120FF
-:1068F00000487800AB45781073477C002768930008
-:1069000009200B000120004878009345582D0468A9
-:1069100084A0FF0086A00600C0008D440768170110
-:106920002768020078101248276836003269002D67
-:106930002E687E0D7810963B7810D345682B781022
-:10694000C63B7F0D7810C63B012002007C0078100A
-:10695000D3450120170078109747A3700000092045
-:1069600038520B200600AF70170009200002781083
-:10697000D43A012001007C0000227900BC44774514
-:10698000A845A845A845DD44BA45E544BA45BA45F9
-:10699000BD45BD45C245C245D544D544A845A845D9
-:1069A000BA45A845E5447745E544E544E544E54472
-:1069B0002768840009200B00012000437800CC45A3
-:1069C00027680D0009200B00012000437800AB452B
-:1069D0002768930009200B000120004378009345AD
-:1069E000012000007C0000227900F34477450C452B
-:1069F0000C450C450C45BA45BA45BA45BA45BA45A9
-:106A0000BA45BA45BA450C450C450C450C45BA4546
-:106A10000C450C45BA45BA45BA45BA45774527688D
-:106A2000930009200B00012000437800934584A6C1
-:106A30000400C0002845046884A0FF0086A006006A
-:106A4000C00081477810D345076817017810C63B0E
-:106A5000012002007C00006084A004004000814707
-:106A6000582D046884A0FF0086A00600C0003745AA
-:106A70000768170127680200781012482768360057
-:106A80003269002D2E687E0D7810A53B7810D34515
-:106A9000682B7810C63B7F0D7810C63B01200200A2
-:106AA0007C00006084A0040040008147046A94A236
-:106AB000FF0086A20600C0005C4507681701276832
-:106AC0000200582D78101248276836003269002DD0
-:106AD0002E687E0D7810B53B7810D345682B781062
-:106AE000C63B7F0D7810C63B012002007C00781069
-:106AF00081477C00B47080A0CD001A78012001008D
-:106B000078109747781005480370000001200200B4
-:106B10007C007810C7477810FE477810D54378106E
-:106B2000CD4278100548012001007C007810C7474D
-:106B30007810FE477810D543B47080A0CD001A7845
-:106B40000120130078109747781005480370000063
-:106B5000012002007C00781081477C007810C74734
-:106B60007810FE477810D5437810CD42781005484C
-:106B700078104D48012001007C00012003007C00BA
-:106B800078108E46012000007C007E0C7E07146F7A
-:106B90007810B0377F077F0C012000007C00781050
-:106BA000C74778108147012006007C0004698CA14A
-:106BB000FF0086A107004000DE4586A10F00C0004F
-:106BC000E2457810FE477810D543B47080A0CD0020
-:106BD0001A7878100548037000007C00A87A94A207
-:106BE000FF00A87884A0FF008AA00400C8008147A5
-:106BF0007910F8457C008147FC458147954682A283
-:106C0000030040000346781081477C00A87DACA5B6
-:106C1000FF00A87CA4A4FF00B86984A10001400083
-:106C200042468CA1FFFEBA69A07805A0C00042468A
-:106C3000A4A4FF004000364682A40C0040001F467A
-:106C4000C80029462B852B8578102E384000294610
-:106C5000781027367800384678106047781052361A
-:106C6000B8698DA10001BA69B5A600105A7E7800F6
-:106C70003B4678105236B4A6FFEF5A7EB47080A01F
-:106C800091001A78012001007C007E0C7810824669
-:106C90000062E4D2400073460862178294A2FF00AB
-:106CA00082A20C00480055464000554611200C00B9
-:106CB000002402A2C8005A462022086294A2FF00C3
-:106CC0001C7002A2C80062461C72002202A5C80005
-:106CD00067462822781064472B852B8578102E383C
-:106CE0004000734678102E3678007746781060475B
-:106CF00078105936B5A600105A7EB47080A0B9003D
-:106D00001A78012004007F0C7C007E001468078044
-:106D100084A00F00038003800380E0A080547F00E4
-:106D20007C007E0C78108246781059367F0C7C00EF
-:106D300082A20200C0008147A87A94A2FF00B8692D
-:106D400084A100024000CC468CA1FFFDBA69A07866
-:106D500005A0C000CC4682A20200C8006B377810A4
-:106D60002A477810F9367810523684A60001400080
-:106D7000C2462C6884A001004000C246FCC6887848
-:106D800084A040004000C246FDC6B5A600105A7E51
-:106D9000B47080A091001A78012001007C007E0C64
-:106DA0007810824684A2FEFF4000D74611200100E1
-:106DB0007800DB4684A201004000E1460061ECD18E
-:106DC000C000E1461120000078101C477810003701
-:106DD0007810593684A600014000F7462C6884A03C
-:106DE00001004000F746FCC6887884A040004000BF
-:106DF000F746FDC6B5A600105A7EB47080A0B90053
-:106E00001A78012004007F0C7C007E0C6029006051
-:106E10001120010084A00020C0000D4711200000B7
-:106E2000AB780100AB780200AB780300AA7AC0A867
-:106E30000400B86885A00002BA687F0C7C009B78CB
-:106E40001800AB780100AB780200AB780300AA7A97
-:106E50009B788100AB7804007C007E0C547060202D
-:106E6000006084A00010C000384729203200212093
-:106E70000000780058470865ACA5FF00187086A090
-:106E80002800C000484782A51900C8004E472920A5
-:106E9000190078004E4782A50C00C8004E472920F3
-:106EA0000C0008642784A4A4FF0082A40C004800FE
-:106EB000584721200C0078106447B86885A000016D
-:106EC000BA687F0C7C0021200000292032009B78CA
-:106ED0001800AB780100AB780300AB780100AA7D05
-:106EE000AA7C9B788100AB7805007C000120030020
-:106EF00078108F47B5A600105A7EB47080A0B900F4
-:106F00001A78012005007C000120070078108F47C7
-:106F1000B5A600105A7EB47080A0B9001A7801207E
-:106F200004007C009B781800AA789B788100AB78DD
-:106F300001007C0004698CA1FF0096A107004000BD
-:106F4000A54796A10F004000A5477810AC197C001A
-:106F5000246994A13F00C000AE478CA1C0FF05A1E9
-:106F600026687810C63B1C6984A100014000BB471D
-:106F7000146978103B3C0462108206627C002C6924
-:106F800034682E6812A13069386832681BA100A2EB
-:106F900001A37C007E0CE0AD180003607000066168
-:106FA0000B6000000F60000A136000001760000013
-:106FB00007801A601F600000236000007F0C2468B7
-:106FC00085A0800026687C007E157E137E149820A4
-:106FD00080AF2D00A020AC814000EC47A65384A1D7
-:106FE00001004000F2470433BE787F147F137F1501
-:106FF0007C00B07005A0C0108C24B37000807800B5
-:107000004B4BB071FF81400004487810414C7C002C
-:10701000B071FF8140001148487885A008004A7887
-:10702000B3700000781087487C007E0C7E0D7810CD
-:107030008919C0001A4878108C247F0C7E157E13A5
-:107040007E14A02D982CA9203100A3537F147F1308
-:107050007F1507680D010B680000047007801A682F
-:10706000236800001F6800009F6800007F0C7C0000
-:10707000B47080A091001A787800FA24B47080A0CF
-:1070800081001A787800FA24B47080A0B9001A78C8
-:107090007800FA24B47080A0C3001A787800FA242B
-:1070A00004698CA1FF0096A1070040005A4896A1F0
-:1070B0000F0040005A4807681701246884A0FF00A9
-:1070C00085A00002266807809B780E00AA782068B9
-:1070D00085A00080226831200004B66E5A7EB4710B
-:1070E00088A191001A797C0078100548487885A01D
-:1070F0000C004A78B47080A0CD001A7809200B00EB
-:10710000012000447810C7470120130078109747EA
-:107110007800683C7E129120002249208748007048
-:10712000047205A20C7215A2087084A0F7FF05A2D4
-:107130004000994878009E48037000007F120020AC
-:107140007C00007084A00100C000CC48087103815D
-:10715000C800AB487810CE497800A3480C708CA0CA
-:10716000FF004000CC4804700480C800C34814707D
-:1071700005A0C000BF48107005A04000C34802A190
-:10718000C800A348077010007800CC48FF8A400070
-:10719000CC487810184CC000C6484000A34878106E
-:1071A0005749037000007F1200207C007E010461BB
-:1071B0008CA1FF0086A107004000DF488EA10F00D0
-:1071C000C000E24840607800E34828647F01FF8403
-:1071D00040000D49702C0470BCA00F00B8A71D49D9
-:1071E0003C27FB87C000FB484800F54878108C24FA
-:1071F0009C6075A040000D497800E848042768AEFF
-:10720000086830A60C6829A5218440000D493887FC
-:10721000042705A0C000FC489C7075A0C000E84889
-:107220007C000000050009000D0011001500190088
-:107230001D000000030009000F0015001B000000E6
-:10724000000012490F4900000000008000001249B0
-:1072500000001A49174900000000000000001A4908
-:107260000000154915490000000000800000154984
-:1072700000001B491B4900000000000000001B49E2
-:107280007E12912000227920005271201000077098
-:107290000A000770020003700000712020000770D0
-:1072A0000A000770020003700000492000007F12EE
-:1072B00000207C00492057491920000004700480F8
-:1072C000C800AA49077012000871087006A1C00022
-:1072D000614984A1E00140006C4978108C240120B0
-:1072E000FD04042082A00500C800774984A1004065
-:1072F000C00061499CA10C3086A304204000854950
-:1073000086A308004000904986A30C20C000614974
-:1073100000720482480090490C7384A3FF0040006F
-:10732000904978108C2407701200007084A001002E
-:10733000C000AA49087084A0E001C000AA491073E7
-:10734000147005A34000AA490C7184A10003C00079
-:10735000AA4984A1FF00C0005749077012000770B6
-:107360000800047084A00800C000AE490770120035
-:10737000087103814800B3490370000049200000F0
-:107380007C007E107E007E127E1591200022087106
-:107390007810CE497F157F12912001807F007F10E9
-:1073A0007C00047200750C7384A30003C000F549CF
-:1073B00084A1E001C000194A087184A1E001C00065
-:1073C000194A0120FD04042082A00500C800E949F3
-:1073D00084A10040C000D94984A107007900ED498B
-:1073E000F749094AF549094AF549554AF549534AC1
-:1073F00078108C24047084A0100085A00200067010
-:10740000FF8AC000044A492000007800084A78102A
-:10741000184CC000044A7C00047084A0100085A0B1
-:1074200002000670FF8AC000144A7800184A7810DB
-:10743000184CC000144A7C00077012000871E0006C
-:107440001C4A91200060E000204A912000600770F3
-:10745000120007700800047084A00800C000284AC9
-:10746000077012000871038148002D4A0370000064
-:10747000007005A0C000414A047005A0C000414A48
-:107480000C7005A04000434A7800244A49200000BF
-:107490007810D738186884A0008040004E4A1B68D6
-:1074A00002007C0078108C2478108C247810B14A6B
-:1074B000107214710C709CA0FF00002800A311A290
-:1074C00089A100007810B14A0427582C60AC0863E9
-:1074D000002222A30C6300211BA3002405A340006B
-:1074E000784AC800784A128410820A8389A1000071
-:1074F000602B78005F4A602B078A7E00046084A0BE
-:1075000008004000844ABAA717497800864ABAA7FB
-:107510000F497F003DA7002C86688A6F926C8E6BA6
-:1075200007701200781057497C003887042705A09F
-:10753000C000A54A9C6005A04000AE4A60200460DF
-:1075400084A00F0080A01D493C20FB8740108C24A4
-:10755000518A4000AD4A087084A0030086A0030051
-:107560007C00512000007C00508A3987042704A049
-:10757000C000C54A006064A0C000BC4A602D046021
-:1075800084A00F0080A02D493C20FB8740108C2454
-:107590007C007E127E0D912000227F0D8468602089
-:1075A00088688C6B906C5780D4AAFF0084A0FF0081
-:1075B0007E00046884A008007F004000E04AB8A074
-:1075C00017497800E24AB8A00F49087EB5A60C001A
-:1075D00004698CA1FF0086A107004000F04A8EA13B
-:1075E0000F00C000F94A1C6884A040004000004B16
-:1075F000B5A601007800004B1C6884A04000400044
-:10760000004BB5A6010007700400047084A00400BC
-:10761000C000024B002405A3C0000D4B7800334B83
-:10762000582C0427046160AC006000A41A70046048
-:1076300001A31E7084A108004000234B106081A0AC
-:1076400000002270146081A00000267008620024EF
-:1076500002A212700C62002303A216700276077059
-:107660000100602B7810924A7800354B7810184C46
-:10767000C000334B7F1200207C007E127E0D9120D3
-:1076800000227F0D07700400047084A00400C00075
-:10769000414B037008007F1200207C007E127E0D9B
-:1076A000912000227F0D49204B4B0770040004708D
-:1076B00084A00400C000544B087EB5A60C000469E9
-:1076C0008CA1FF0086A107004000674B8EA10F0030
-:1076D000C000724B1C6884A0400040006E4BB5A6F1
-:1076E00001004068502078007B4B1C6884A020007B
-:1076F000C000794BB5A6010028685020602D0460B9
-:10770000BCA00F00B8A71D493C27FB87C0008F4BCA
-:107710004800894B78108C249C6865A04000934BEE
-:1077200078007C4B7810184CC0008F4B7F120020E3
-:107730007C007E127E007E017E0D912000227F0D56
-:107740007F037F04087EB5A60C0004698CA1FF00AE
-:1077500086A107004000AD4B8EA10F00C000B64BC4
-:107760001C6884A040004000BD4BB5A60100780015
-:10777000BD4B1C6884A040004000BD4BB5A6010075
-:107780004920964B7E0104698CA1FF0086A1070069
-:107790004000CB4B8EA10F00C000CE4B406878005C
-:1077A000CF4B28687F0155A04000154C702D602EEE
-:1077B0000470BCA00F00B8A71D493C27FB87C00080
-:1077C000E94B4800E24B78108C249C7075A0602037
-:1077D0004000154C7800D54B042768AE086822A4F9
-:1077E0000C681BA34800024C518AC000F64B78106D
-:1077F0008C243887042705A0C000EA4B9C7075A034
-:1078000060204000154C7800D54B228420841A83D8
-:1078100099A300000869002422A10C6900231BA180
-:10782000C800114C78108C24712020007800004B87
-:107830007F1200207C00087084A0030086A0030053
-:107840004000404C042708AC04211A700881042130
-:107850001E700881042112700881042116700460D2
-:1078600084A008004000374C088104212270088160
-:10787000042126700276047084A0100085A0010007
-:1078800006707810924A7C007E127E007E0D912058
-:1078900000224920414C7F0D7F08087184A103001C
-:1078A000C0006B4C7E0104698CA1FF0086A107001B
-:1078B00040005B4C8EA10F00C0005E4C4068780019
-:1078C0005F4C28687F0105A04000794C78009E48F5
-:1078D00020006B4C7810554A7800794CA000724C0F
-:1078E00008717810CE4978004A4C07701000A0004B
-:1078F000744C08717810CE49087086A00800C0004A
-:107900004A4C007005A0C0004A4C0370000049209A
-:1079100000007F1200207C007E127E147E137E15F4
-:107920007E0C7E0D912000227F0D4920894C80AD78
-:107930001100A020992031000C7084A0FF002A685B
-:107940000770080007700200037001004000A84C97
-:107950000080AC80A55307700400047084A004006C
-:10796000C000AA4C7F0C49200000037000007F1566
-:107970007F137F147F1200207C00912000609120F3
-:107980000080CC7805A04000D14C9479D07006A13D
-:10799000C000D14C047805A04000D14C077800000D
-:1079A0006800D14C91208040207801802278C0006E
-:1079B0002C4D2478227869204052006884A007006A
-:1079C0004000EF4C86A002004000EF4C34680DA050
-:1079D0004000EF4C042105A04000EF4C01800A203C
-:1079E0004000D44D487805A04000FD4C01804A7805
-:1079F000C000FD4C0920020144680A2078106F2263
-:107A0000906805A04000094D01809268C000094DB2
-:107A10006F6800007368010061200055A920000113
-:107A200009200200346005A040001F4D018036602F
-:107A3000C0001F4D106005A040001F4D7E01781052
-:107A40006F227F01E0AC10007000254D78000F4DD3
-:107A5000098140002C4DA920000178000F4D7810BD
-:107A6000394D78105E4D0920515204210920020140
-:107A70000A20912001807C00347801803678C00093
-:107A80005D4D3878367891200080447805A0C0009C
-:107A9000484D012001010180467880A000754020FA
-:107AA000042065A040005D4D246005A04000594DB4
-:107AB0000180266040008D4D0060402C78004E4DC6
-:107AC0007C00287801802A78C0008C4D2C782A7898
-:107AD000307805A0C0006B4D012000020180327893
-:107AE000038003800380038090A0005598A20200C9
-:107AF000042384A0080040008C4D90A209000422B9
-:107B000005A04000844D01801220C0008C4D04234C
-:107B100084A0F7FF85A080001A2078106F227C00D7
-:107B200069204052006805A04000974D486806ACA7
-:107B30004000D44D1B600600B46084A0003F1E606E
-:107B4000206084A0FF0085A06000226000604220C9
-:107B50001467826F7810C519186805A04000AF4DF2
-:107B600001801A68086884A0EFFF0A681068018025
-:107B7000D000B94D78108C2412682F60000033605B
-:107B80000000682C7810DC1C69204052447984A1E4
-:107B90000001012006006E68C000CF4D86690120FB
-:107BA00004006E6878106A22912001807C006920B0
-:107BB000000109204052042184A007004000304EFB
-:107BC00086A00700C000EA4D7E0D092052526C21AC
-:107BD00078101C3B7F0D7800304E092052526421F2
-:107BE000781037241B600600586884A0003F1E6090
-:107BF000206084A0FF0085A0480022602F60000064
-:107C000033600000306884A040004000244E4B6880
-:107C10000400A9201400486884A004004000114E0C
-:107C20007000114E7800084E4B680900A92014001E
-:107C3000486884A0010040001E4E70001E4E78006F
-:107C4000154EA920FA007000244E7800204E0868D6
-:107C500084A0FDFF0A681B68480009205B520B20C6
-:107C600007004C784A78912001807C0079200052EE
-:107C700078105E4E7810424E7810504E33780000E7
-:107C8000477800004B7800007C0019200300112089
-:107C90004652042286A03C0040004D4E19200200AE
-:107CA0002A7B2E7B7C0019203900112046520422A9
-:107CB00086A03C0040005B4E19202700367B3A7BB3
-:107CC0007C001920713911204652042286A03C0004
-:107CD0004000694E19202626227B267B3F78000033
-:107CE00043780A007C0020002B00000020000000E8
-:107CF0002000000020000000200000002000000004
-:107D000020000000200000002000000020000000F3
-:107D100020000000200000002000000020000000E3
-:107D200020000000200000002000000014001400CB
-:107D300049981400140014001400140014001400D6
-:107D400080000F00000001020406080C20212240E0
-:107D500080F818000B3001A2140000A2140000A249
-:107D6000140200006C0002001400CD989E009300E5
-:107D700002A2388806383988C32064088598C1284B
-:107D8000AE9C03A20C30462861816A840083561899
-:107D90003A886598F228919C58980C30E128919C7B
-:107DA000022806A2C3642E2807A2A064E06DA06783
-:107DB000C06F14183B882478C16864783E8879982D
-:107DC000768577866B20C128AE9C44200321A220B3
-:107DD0008120659809A201298D98140005A200A3AD
-:107DE00072189A873C88E21F01C60AA26E850407B2
-:107DF000919C140004A200A30930E21964F86E8576
-:107E00003F88E608919881F88C9801C81400C1F861
-:107E10001600B285F080329502FBE21D1400328517
-:107E200041F21400E21DA884A0D7E61F140008A2A6
-:107E300043600880C11D1600008360812A8441F0E0
-:107E40000830A884D6114270DD201100D520228888
-:107E50001600008047281110C098008000A002285A
-:107E60001110C69865983E281110CA980BA21700E9
-:107E70000C3000A3E21D81DB14001002D79814001F
-:107E8000E0263A8702FBF219E21F14000DA2063821
-:107E90001002B39C040700006C0002004F9814000D
-:107EA0009E00A0001700FF600C30208711A2D09C1C
-:107EB0007287378801217A98D210E278D39C59983A
-:107EC00084D9E2F0A1F0CD981400318866D13088D1
-:107ED0000F80019420B502C820887A9801237A98EF
-:107EE000D210E478D39C21882088599823F142F15C
-:107EF00001F1C698D210F670328803820C879ED9A1
-:107F000001601400456814021BA2D09C0120C59892
-:107F10000182521884D163D1348801808D98273032
-:107F2000A884561A3388140018A28169BC9C26695B
-:107F30000269341A9998141A2170140000A341613F
-:107F40006469108092852680B984E4692380E116F3
-:107F50000180F110466913A2621413A20080E11699
-:107F6000B598696914A2C2610280E1140480E11627
-:107F700001010A302788140017A2BC9C140000A33A
-:107F800081812A84A884E61C2C88160012A2D09C29
-:107F9000D210E4700400078024941ACCD39CC598B6
-:107FA00027880A3013000080A4841600C2111E2105
-:107FB0000E871DA214008E8716001CA23510919802
-:107FC00010A200A0108092853B8544D02280073803
-:107FD000BB84EA9821800738B9840C307E812B87D6
-:107FE00072879198000020002B0000002000000004
-:107FF0002000000020000000200000002000000001
-:1080000020000000200000002000000020000000F0
-:1080100020000000200000002000000020000000E0
-:1080200020000000200000002000000014001400C8
-:10803000499814001400E298CD981400140014001C
-:1080400080003701000001020406080C20212240B4
-:1080500080F818000B3001A2140000A2140000A246
-:10806000140202A2388806383988C32064082FA871
-:10807000C128AE9C03A20C30462861816A8400832B
-:1080800056183A8804A8F228919CF4A80C30E128EC
-:10809000919C022806A2C3642E2807A2A064E06D6A
-:1080A000A067C06F14183B882478C16864783E8844
-:1080B00002A8768577866B20C128AE9C44200321D8
-:1080C000A2208120E4A809A2012909A8140005A280
-:1080D00000A372189A873C88E21F01C60AA26E8527
-:1080E0000407919C140004A200A30930E21964F86B
-:1080F0006E853F88E608F7A881F8F0A801C814004B
-:10810000C1F81600B285F080329502FBE21D140022
-:10811000328541F21400E21DA884A0D7E61F1400A6
-:1081200008A243600880C11D1600008360812A8474
-:1081300041F00830A884D6114270DD201100D5200E
-:1081400022881600008047281110FCA8008000A09B
-:1081500002281110FDA89BA83E281110FDA80BA213
-:1081600017000C3000A3E21D81DB1400100201A8EF
-:108170001400E0263A8702FBF219E21F14000DA258
-:1081800006381002B39C04071700FF600C302087EC
-:1081900011A2639D72873788012121A8D210E2784D
-:1081A000669DFCA884D9E2F0A1F06CA81400318887
-:1081B00066D130880F80019420B502C820880FA8AE
-:1081C00001230DA8D210E478669D21882088E6A8B6
-:1081D00023F142F101F14FA8D210F67032880382E8
-:1081E0000C879ED901601400456814021BA2639D90
-:1081F000012040A80182521884D163D134880180C3
-:1082000001A82730A884561A3388140018A281695F
-:108210004F9D26690269341A01A8141A21701400AE
-:1082200000A341616469108092852680B984E46965
-:108230002380E1160180F110466913A2621413A293
-:108240000080E11607A8696914A2C2610280E114E6
-:108250000480E11601010A302788140017A24F9DFF
-:10826000140000A381812A84A884E61C2C881600AF
-:1082700012A2639DD210E4700400078024941ACCEB
-:10828000669DF8A827880A3013000080A484160091
-:10829000C2111E210E871DA214008E8716001CA27B
-:1082A0003510B4A810A207380C307E812B87728756
-:0682B000ADA800000C0D5A
-:00000001FF
-/**************************************************************************
- * QLOGIC LINUX SOFTWARE
- *
- * Copyright (C) 2004 QLogic Corporation
- * (www.qlogic.com)
- *
- *************************************************************************/
-
-/************************************************************************
- * *
- * --- ISP1040 Initiator/Target Firmware --- *
- * 32 LUN Support *
- * *
- ************************************************************************/
-
-/*
- * Firmware Version 7.65.06 (14:38 Jan 07, 2002)
- */
diff --git a/firmware/qlogic/12160.bin.ihex b/firmware/qlogic/12160.bin.ihex
deleted file mode 100644
index dc800ecdaf3a..000000000000
--- a/firmware/qlogic/12160.bin.ihex
+++ /dev/null
@@ -1,1771 +0,0 @@
-:100000000A042A000010040841100000C93600004C
-:100010004320504F525947495448312039392C31E7
-:1000200039313239312C39392C3339313439512085
-:100030004F4C494720434F435052524F54414F4930
-:10004000004E492050533231363146207269776D67
-:10005000726120655620726569736E6F31202E3093
-:1000600034302020432073756F74656D20726F4E9D
-:10007000202E303050206F72756474634E202E6FC6
-:100080002020303020200024C920FF907120000261
-:10009000A070A2700120FF010420FCD0201171206B
-:1000A0000001A070A270C1202000892021127120BF
-:1000B0001000C3700400C7705349CB702050CF703C
-:1000C0002020D3700A000120FD040420D6700920EE
-:1000D000FFFE30212821A2A1004724842484248407
-:1000E00024842484248492A100910920000001200A
-:1000F00032000C08051E182279200047A02F082482
-:1001000011200000A9204000A4420981D81D092027
-:1001100000FF003402A118021001A820A4421B789D
-:1001200064001478CDC0D5C0167871200002D600C6
-:10013000692040470C085C460120FF010420FCD0E8
-:10014000301169208047712000010C085C4614784A
-:10015000D4C01678DE00CA7EC27CC67B67780000F9
-:1001600000788DC0027831203000AF78010123780B
-:1001700002002778020009200200692040471B681E
-:100180000300236807002768FA002B6808002F681F
-:10019000280037680600336808003B6800000981C2
-:1001A0000005CF680A00BF68C04779200047D368C0
-:1001B0002D76C368C04CC768C04BCB68C08CA7689D
-:1001C000448FAB68498FAF68448FB368448FA3688E
-:1001D00001000120FF010420FCD0C81169208047E4
-:1001E0007008CF680A00BF68C049D3683978C3680F
-:1001F000C06CC768404CCB68D08DA768498FAB688E
-:100200004E8FAF68498FB368498FA3680100E6003D
-:100210006920C04B71200002EC70E4D0192009184D
-:1002200021200900201119200C1821200C000C0895
-:10023000751D0120FF010420FCD088116920404C6D
-:1002400071200001EC70E4D0192009182120090068
-:10025000201119200C1821200C000C08751DEE002F
-:10026000112002006920C04C09200200A9200001D1
-:10027000376800000B684000C87B86A3FFFE28118A
-:10028000176800011F6864002000176864001F6879
-:100290000200E8AD1000041F35110981381D01204E
-:1002A000FF010420FCD02811118218016920C06CC4
-:1002B000D8080C08F6220C083D400C088C1B0C08D2
-:1002C000154691200022792000477120500091208E
-:1002D00000247920004771202000912000267920F9
-:1002E00000027120404791200028792000017120F0
-:1002F00080479120002079200047712010000032B3
-:1003000085A03D30902071201000C37000000410C3
-:100310008C11C07086A0020010110C08BA1339208D
-:1003200000000C08AB12AC7805A08011040E9A11E5
-:100330006C7865A010010C08A1200C08261E040E84
-:10034000AF116C7865A010010C08A120040EAF114C
-:10035000092047471120874704210C2205A11001DD
-:100360000C089B1C71204047A07005A0E8014C744C
-:1003700085A40000C8017920000291200080D0727D
-:100380008CA23D3090210C084C27912000809120B8
-:100390003D30040ED111792000476C7865A0200112
-:1003A000712010000C08A120041DD91179200047EC
-:1003B000712010000C08294471208047A07005A00E
-:1003C00088014C7025A070017920000191200080E7
-:1003D000D0728CA23D3090210C084C2791200080D7
-:1003E00091203D307920004771201000040EFA1151
-:1003F0006C7865A010010C08A120041D8E110C085A
-:10040000294404088E11003C84A0070002000C124D
-:100410000C120E120E1213121312181218120C08CC
-:100420007525912000240C08D5400500912000225C
-:100430000C08D5400500912000220C08D5409120E1
-:1004400000240C08D540050041124112421242120C
-:100450004D124D124D124D1256125612611261126A
-:100460004D124D124D124D12701270127012701208
-:10047000701270127012701270127012701270126C
-:100480007012701270127012F80C0600060126012C
-:10049000912000280C0892252E010E010E000D005F
-:1004A0000600060126010C0800122E010E010E00A6
-:1004B0000D00060006012601912000260C08922559
-:1004C0002E010E010E000D000600060126019120EE
-:1004D00000260C089225912000280C0892252E0158
-:1004E0000E010E000D00060006012601D600E600F2
-:1004F000F600792000477120000269204047003D46
-:100500008CD03001EC7084A0001CE2780C085C46B2
-:10051000003D84D050016920804771200001EC70BB
-:1005200084A0001CE6780C085C460C082625FE001A
-:10053000EE00DE002E010E010E000D0008700B8093
-:100540004012077002008CA0E00120119CD008012D
-:1005500087089708C37002400408BD13040E1E13D9
-:1005600061200000186084D004191E13287805A0AB
-:10057000201104001F1304081E13FCD030010600D4
-:100580000C08291B0E005001280006000C081E1B39
-:100590000E002001012007400408BC131079FCD094
-:1005A0002811612040479CC1FCC720006120804782
-:1005B0009DC1FDC7606005A004191E1312797E60FD
-:1005C0002878FCC086A018002011C6000C08261947
-:1005D000CE002B780000786065A0E001C6009C602A
-:1005E0000C08F31BCE009F6000000C08601A092065
-:1005F00018008760030110780600FF841011FF8542
-:100600001001C5C012780C08341B0E001278981126
-:100610000C087F1B10789CD01811612040472000E7
-:10062000612080479CC012787B600000D060C4D0FD
-:100630003001C4C0D260012005400408BC13040886
-:10064000BA13050006A0C270C670CA70CE70DA7008
-:10065000C0703DA08AA04000041A6C130200BA13B7
-:100660000814D6133C1470147014CE13781A7A142C
-:10067000C813DA13DB13DC13DD137C1AC8138714D9
-:10068000DB144119721ADE13C817FE1730187618DA
-:1006900085179217A517B717BF15C8130D1518158D
-:1006A000261534154B1559155C156E157C158615D8
-:1006B000A515B115C813C813C813C813CC15DD157B
-:1006C000F7152B165416661669169316CC16DE16F9
-:1006D00053176317C813C813C813C813751700211D
-:1006E0008AA04000041AC8130200C813C813C81314
-:1006F000C813C8139E1AA41AC813C813C813A81A7B
-:10070000E81AC813C813C813C81303146B1482144F
-:10071000D6143C19C813C8130B19C813EC1A901A35
-:100720009A1AC813C813C813C813C813C813C81318
-:10073000C813C813C813C813C813C813C813C813E1
-:10074000C813C813C813C813C813C813C813C813D1
-:10075000C813C813C813C813C813C813C813C813C1
-:10076000C813C813C813C813C813CA72C6710120AE
-:1007700006402800CE73CA72C67101200040C270C4
-:10078000040EBD13612000001B6001009120005089
-:10079000912080400500C3700140900CC37006405A
-:1007A000780C99204100A1204100A9200500A35305
-:1007B000200CC470C37004000708F808F008E808AB
-:1007C000E00891200080C3700400C7705349CB70CB
-:1007D0002050CF702020D3700A0001200400D67072
-:1007E000792000001B7801003120300059200010D2
-:1007F00029201A045120450461204704C12020000B
-:10080000912000509120804004081804D875DC74B1
-:10081000DA75DE741800292000002025D071C87216
-:10082000CC73C470A02099203000037001000770C1
-:1008300006001A731E722274267521204000FF8163
-:100840000409BA1382A140001012202106A008203A
-:100850000384127007700400077001000870FCD058
-:10086000E80D0770020084A0E0012001C37002407F
-:100870000408BD13A824A553100C0408BA1329209A
-:1008800000002025D071C872CC73C4709820A120BC
-:10089000300003700000077006001A731E72227485
-:1008A00026752120400007700600FF810409BA1355
-:1008B00082A140001012202106A00820038412709B
-:1008C000A824A653077001000870FCD0E80D84A08E
-:1008D000E001480DC37002400408BD13D875DC74F4
-:1008E000DA75DE747808C471C87014219EA70400FC
-:1008F00008110A20CA720408B913C7700A00CB7025
-:100900000400CF702A000408BA13D875DC76DA75B3
-:10091000DE761800292000003025C470C872CC7320
-:10092000D074C670CA72CE73D27405A0E8050AA44A
-:10093000080140120180727884A000FC3801AC7874
-:1009400085C0AE78012005400408BC137E7B7A7A0E
-:10095000867E827D767C8CA400FF700107840480F3
-:1009600004800C810C810F8118A191A20000B1A616
-:10097000000081A50000500007840480048018A3B3
-:1009800091A20000B1A6000081A500001A731E729A
-:100990002276267005A61801107AC5C2127AAC78A4
-:1009A00084A0FCFFAE781800AC7885C0AE7804084F
-:1009B000BA13D875DC76DA75DE76180029200000C7
-:1009C0003025C470C872CC73D474C670CA72CE732A
-:1009D000D67405A000050AA41001041ABC130180F6
-:1009E000927884A000FC3801AC78C5C0AE780120B4
-:1009F00005400408BC139A7A9E7BA27DA67E002641
-:100A000005A51801107AC5C2127A967CAC7884A02C
-:100A1000FFFCAE781800AC78C5C0AE780408BA13F5
-:100A2000092000006C7865A0180108810060D80CCE
-:100A3000C47A0408B813092048470C210120FF019B
-:100A40000420FCD00419B91311208847142204088B
-:100A5000B813092049470C210120FF010420FCD0D4
-:100A60000419B9131120894714220408B81361200E
-:100A7000404728612C621482148214820120FF01F5
-:100A80000420FCD04811612080472863DA732C636E
-:100A90001C831C831C83DE730408B81309204C4795
-:100AA0000C210120FF010420FCD00419B9131120EE
-:100AB0008C4714220408B81318790408B9130920C4
-:100AC00002020C218CA1300F0120FF010420FCD078
-:100AD0000419B91311200201142294A2300F040842
-:100AE000B81309204D470C210120FF010420FCD040
-:100AF0000419B91311208D4714220408B813207962
-:100B00000120FF010420FCD00419B913247A040841
-:100B1000B8131120404CC471FCD110111120C04BEE
-:100B2000078184A00F0003800380038068A2006A0D
-:100B3000086B1C6CDA74FCD1181121203B021000E8
-:100B400021203B012424A4A4001CDE740408B71354
-:100B5000C4770C089A1B912000801C6B146A9120AA
-:100B6000018008270408B71361204047186101205D
-:100B7000FF010420FCD00419B913612080471862DA
-:100B80000408B813C4770C089A1B912000800869E8
-:100B9000186A106BDA77912001800408B713C471CA
-:100BA000102194A20F0082A21000041AB3130C08A3
-:100BB000B42384A30040100195A220000408B713B9
-:100BC000C4710021BCC082A01000041AB313BCD1B0
-:100BD00020111120484704222000112088470422B8
-:100BE000BDC006000021BCC012200C0858231E0006
-:100BF0000408B913C471212049470424C670192080
-:100C000000003000C871212089470424CA70FDC348
-:100C100011202316A9200800042206A13801108201
-:100C2000041F0916C471C8720408B21392A22316D5
-:100C3000260022211E000C086A230120FF01042047
-:100C4000FCD01011FCD3F0090408BA13E803FA0031
-:100C5000F401EE020400010002000300612040479D
-:100C600028612C62148214821482C4702A60C870B5
-:100C70000380038003802E600120FF010420FCD04C
-:100C8000A011260016006120804728612C62148282
-:100C900014821482D8702A60DC7003800380038081
-:100CA0002E60DA71DE721E002E000408B813612077
-:100CB00040473061C47032600120FF010420FCD045
-:100CC0000419B913612080473062C870326004088B
-:100CD000B81318790408B913C47184A1CFF048017E
-:100CE0000120FF010420FCD00419B313C8720408CA
-:100CF000B213192000000C08A62336000120FF01C2
-:100D00000420FCD018011E000408B913C87184A186
-:100D1000CFF028010E001021C4710408B213FDC3E6
-:100D20000C08A62310231E000408B813C47182A166
-:100D3000100048020120FF010420FCD00419B31365
-:100D4000C8720408B21311204D4704220600048122
-:100D5000081208811221192000000C089323012099
-:100D6000FF010420FCD018011E000408B913C8714B
-:100D700082A11000280206001021C4710408B213D9
-:100D800011208D47042206000481081208811221D7
-:100D9000FDC30C0893232E001E000408B813C47171
-:100DA000C87284A1FDFF0419B21384A2FDFF0419C7
-:100DB000B2130021207922780022247A26780408B0
-:100DC000B8131120404CC471FCD110111120C04B3C
-:100DD000078184A00F0003800380038068A2C8728B
-:100DE000CC73D874C6710068CA70CE73DA7491205F
-:100DF0000080026AACD2181121200000900084A467
-:100E0000FF0082A00200041A4F173F84BCA7FF0016
-:100E1000400186A7020004194F1784A4FF000409AB
-:100E20004F1761200002FCD1100161200001292030
-:100E30000900312062003F84BCA7FF003001078316
-:100E400084A0FF0010113DA738114120190084A390
-:100E5000FF0082A01A001002A4A4FF00078384A050
-:100E6000FF00880142A8F00286A0100020119CA378
-:100E7000FF009DA3000FBCA3FF00002502A7900266
-:100E8000002602A7781239203A00046805A70668F0
-:100E90000A6B0C6BCE731C68DA701E6C912001809B
-:100EA0000408BA13912001800408B413C4770C0815
-:100EB0009A1B91200080146A1C6B91200180C870DD
-:100EC0001668CC701E6808270408B713C470612028
-:100ED000404718611A600120FF010420FCD004196A
-:100EE000B913C8706120804718621A600408B813EB
-:100EF000C471C872CC7382A11000041AB3130C0819
-:100F0000D82384A30040100195A220000408B71341
-:100F1000C4770C089A1B91200080086A8DC20A6A67
-:100F20009120018008270408B813C4770C089A1B85
-:100F300091200080086A94A2F9FF0A6A046805A05B
-:100F400010010C08D5229120018008270408B8134D
-:100F5000C4770C089A1B91200080086A95C20A6A1F
-:100F6000046805A010010C08D522912001800827F3
-:100F70000408B813C477412001004920050051201E
-:100F80002000912000800C08B21B912001800827CE
-:100F9000086A0408B813C477FCD728010C08291B79
-:100FA00038010408BC130C081E1B10010408BC13F4
-:100FB000C873CC72C677CA73CE720C082A1CE811AB
-:100FC000186805A0A001082776000C08F7237E000A
-:100FD000701101201500FCD718116120404718003E
-:100FE000FDC0612080472A78912001800500912072
-:100FF0000180012005400408BC13912001800408F1
-:10100000BA13C477FCD728010C08291B380104083F
-:10101000BC130C081E1B10010408BC13C67741202A
-:1010200021004920050051202000912000800C085B
-:10103000B21B09201600FCD7181161204047180088
-:1010400061208047FDC1636003007B600000726720
-:101050007F600F002A79D061C4C1D2610C08D5220B
-:10106000912001800500C877CA77C477C677FCD77E
-:1010700028010C08291B38010408BC130C081E1B8E
-:1010800010010408BC13BCA700FF912000800920B8
-:101090001700FCD7181161204047180061208047D5
-:1010A000FDC17B6000006360020072677F600F001B
-:1010B0002A79D061C4C1D2610C08D5229120018067
-:1010C000412021004920050051201000912000807E
-:1010D000C87005A01801D060FDC0D2600C08B21B1A
-:1010E000C8703668388784A71F00C01D9120018012
-:1010F000050019200000C87284D228010C08291BA1
-:1011000038010408BC130C081E1B10010408BC1392
-:10111000C872CA72AC7884A0030018153920000088
-:1011200084D20801FDC7412021004920040051203C
-:1011300008000C089A1B912000800868D4C00DA8F4
-:101140000A693768000091200180388784A71F0052
-:10115000801DBCA700FF3F8738873F8784A7000F0B
-:10116000401D91200080C8726920000184D21011B6
-:1011700069200002086884A0FDFF0A683068B4D0C6
-:10118000B0014B680400A9201400486894D01001F5
-:10119000041FC2184B680900A9201400486884D0B5
-:1011A0001001041FCB18A920FA00041FD2187920BF
-:1011B000004709201800C87284D2181161204047E6
-:1011C000180061208047FDC17B6000002A796360C0
-:1011D00001007F600F00A3600000A460AE60B260F9
-:1011E000D060B4D06001B4C0D260C600B46065A065
-:1011F0000860D4C00A60186001801A60CE00D06018
-:1012000084A0FF7ED260AC788DC0AE78FF830801E9
-:1012100005001B685400912001800500CC730C0868
-:101220007818EC69486A85A100184A6885A14000D1
-:10123000EE68CC7321200400A920FF09041F1B19AC
-:101240002184D01D1983B01DEE694A6A9120018066
-:101250000500FCD71811692040471000692080471D
-:10126000C471C6711669FF811011A3680100AC78C2
-:101270008CC0AE7884D010110C087A1C0500D8758B
-:10128000DC74DA75DE7410002EA02025C471C873DA
-:10129000CC72C671CA73CE7279200047DE7DDA7CCB
-:1012A000D67BD27A0C08771B04095C1AA9200500AA
-:1012B000A120144791200080A141912001800920A4
-:1012C00040000C08411D20010C087F1B04085C1A1B
-:1012D00004608CA0FF008EA10900201106000C08FC
-:1012E00086200E0084A000FF078009800409F11900
-:1012F000C600682C0C08771BA805002C9E68098185
-:10130000C01D9F600000CE00C600DC7DD87CD47B71
-:10131000D07A90A2400099A30000A1A40000A9A542
-:101320000000DE7DDA7CD67BD27A682C9C6865A0D2
-:101330000409F019092040000C08411DA0150460A3
-:1013400084A0FF0086A002005001046084A0FF007A
-:1013500086A00A00381116000C0883201E00002DFC
-:1013600002609808CE00C6009C600C08F31BCE00FB
-:101370009F6000000C08601A092018000860CDC0AA
-:101380000A600460866010780600FF841011FF85F3
-:101390001001C5C012780C08341B0E0012780C081E
-:1013A0007F1B04085C1ACE00C6009C600C08F31B6F
-:1013B000CE009F6000000C08601A092018008760AA
-:1013C00003011B60030010780600FF841011FF85E5
-:1013D0001001C5C012780C08341B0E0012780C08DE
-:1013E0007F1B04085C1ACE001461FCD120010C089C
-:1013F000291BF00118000C081E1BD0010C08601AF4
-:1014000009201800876003011B6021001078060086
-:10141000FF841011FF851001C5C012780C08341B21
-:101420000E0012780C087F1B012007400408BC1333
-:1014300004618CA1FF0086A1050018111C60BDC0CD
-:101440001E60C474C873CC72146091200080E600E2
-:1014500009201200FCD0181171204047180071209B
-:101460008047FDC12A7963700500D071C4C1D27173
-:1014700066736A726E74727077700000002C7A70F6
-:101480002EA030251C6184A1600010010C08E93FEA
-:10149000EE009665A6659A66AA66AF600000B36026
-:1014A0000000146723600000246096A00100101162
-:1014B000008026600C08D522912001800500C370B1
-:1014C00005400408BD13A920050099201447912068
-:1014D00000800A5391200180002110A299A30000EE
-:1014E000A1A40000A9A500000500C471C7700000F8
-:1014F0001E790408BA13C471C671682110006920EE
-:1015000000100C6916A0042D10A2688D0981D81D49
-:1015100085A200001811C37000401000C370034082
-:10152000CA700408BD136479C671C47182A1030036
-:10153000041AB31366790408BA136479C6710408EF
-:10154000BA130079C671C47102790408BA1300791C
-:10155000C6710408BA13C470112000008CA00D00DD
-:1015600060010C81300210820C810C81100210820B
-:101570000C81FF810419B41310820E7A8CD23805C5
-:101580001079CDC11279092021001920030084D2DD
-:10159000C00108811920410011204E8F122319200B
-:1015A00042001082122319204300108212231920B6
-:1015B000460010821223192047001082122319209E
-:1015C00006001120538F12211120738F12230479EA
-:1015D00006780408B9130478C6700408BA13C471F5
-:1015E000FCD118111120C04B10001120404C078174
-:1015F00084A00F0003800380038068A211200000F4
-:101600001468FCD0100195A20002B4D0100195A27C
-:1016100001000C6B0068DA700408B7131478F4D07A
-:10162000300101200740DB70000005A04800FCD01D
-:10163000300101200740DB70010005A0080006A072
-:1016400005001478F4D0300101200740DB70000061
-:1016500005A0080006A005001478FCD03001012088
-:101660000740DB70010005A0080006A0050012710C
-:101670001A721E731078C4D010012274267580ACC3
-:10168000010008810C81A9819880A120300003709D
-:1016900000008460A220A65307700100747984A121
-:1016A00000FF40010F810C810C81048004800780C1
-:1016B00000A118000781048004807C7908A1787A51
-:1016C00006A011A2107DC4D52001847B19A3807CC3
-:1016D00021A40870FCD0E80D03700100077006001B
-:1016E0001A711E72107DC4D510012273267484A055
-:1016F000E0010500487865A02001042C4A786320A9
-:1017000000000500F6007920004748786220002C90
-:1017100005A010110C0875254A78FE00050011205F
-:1017200000914A7AC47B1983280180A232001220DA
-:101730001020C80C13200000050016002600FCD75E
-:1017400018111120C04C10001120C06C84A7000F8C
-:101750000B8084A71F002001038003800380038087
-:1017600005A168A22E001E000500390C00292A6878
-:10177000002A2E68086884A0EFF90DA80A69E6001F
-:10178000FCD728110920524771204047200009202A
-:101790009247712080470C21046805A0480116A1DA
-:1017A000381160200060066816000B200000180049
-:1017B000092000001600046865A078010060066832
-:1017C00021040C08B21D1068087909810A7901808A
-:1017D0001268881D1079A5C112791E000269066978
-:1017E000002D60200C08BF26EE00050065A06001FA
-:1017F00008209C6005A0280162209F60000065A071
-:10180000C00C48784A7962200500076003018F60A8
-:101810000000A9201C0080AC0500A02001200000D1
-:10182000A44028681A602C6822600500E600FCD7F6
-:101830002811712040473120C04720007120804787
-:101840003120C0494C708CA00002281108A60A2D36
-:1018500000804E7006A0EE000500F600FCD71811BF
-:10186000792040471000792080470C089A1B91206E
-:10187000008004680A7865A0F0053000002C0A7822
-:101880006020006065A0B805106006A3B81D0C605C
-:1018900006A2A01D282C487806AC0811480404684C
-:1018A00006AC401100606020066805A018110368AE
-:1018B00000004800006408786020026486A40000EC
-:1018C0001011002C026860250C08021C1B6005002A
-:1018D00023602000FE000C08B21DF6000879098183
-:1018E0000A7910680180126818111078A5C0127862
-:1018F0000120FFFF05A0FE0005007600002739202B
-:101900000000FCD00801FDC741202100492004004F
-:1019100051200800912000800C08B21B388784A752
-:101920001F00D01DBCA700FF3F8738873F8784A7D3
-:10193000000F901D912001807E0005006C78092029
-:10194000748F0C210DA1180165A00408A12061204D
-:101950000000186084D0B81110788CD030018CC091
-:101960001278FCC76920404728008DC01278692092
-:101970008047FDC7912000801C681F6800009120EF
-:10198000018005A0081105008CA0F0FF10010C08D3
-:1019900075250200D71CDA1CE01CE41CD81CE81CCE
-:1019A000D81CD81CD81CEE1C181D1B1D201D291D61
-:1019B000D81CD81C05000C0875250C087A1C0120C1
-:1019C00001800408321D012003800408321D01201B
-:1019D00004800408321D0C087A1C012006800408CB
-:1019E000321D11200A8091200080FCD71811692037
-:1019F00040471000692080473820006886A000001A
-:101A000020011E6F91200180050026007068BCA097
-:101A100000FF4120210049200400512010000C0843
-:101A2000B21B388784A71F00D01D912001800E00B3
-:101A30007069C671D00001200C80B8000C087A1CB7
-:101A400001200D809000FCD71001E4780800E078B8
-:101A5000C67001200E804800FCD71001EC78080009
-:101A6000E878C67001200F800000C270FCD7181102
-:101A7000DB7000001000DB700100612000001B60C3
-:101A8000010091208040050080AC0100FF81180515
-:101A900099203000A0200C7084A0FF07000118706E
-:101AA00006001C70060020700600247006001271EB
-:101AB000AC811A721E7322742675037001000770C0
-:101AC000010008700B80E81E077002008CA0E00186
-:101AD0001011A55306A003700000077004000E004B
-:101AE00026700E0022700E001E700E001A70050087
-:101AF00011202000092010000A6B0E6C1F680102E3
-:101B0000036820FD076838001A6A002DE8A0080065
-:101B100090A204000981801D0500EC70DCD0201526
-:101B2000292001001478CCD06011EC70E4D0192089
-:101B30000A0C21200A00201119200C0C21200C0075
-:101B40007000EC70E4D0281119200C1821200C0032
-:101B500030001920091821200900ADA500020A6BE8
-:101B60000E6C1E6D07683800050004608660082C46
-:101B700063200000687805A06A791001022C080033
-:101B80006E790500C6006120004787680301082DB3
-:101B90006B200000686005A06A611001022D08003A
-:101BA0006E61CE00050091200080042C6E7805A0A7
-:101BB00008116A78912001809C6005A08801C60008
-:101BC000602008209C6005A0380162209F60000012
-:101BD00065A09C6005A0C81D48784A796220CE00A7
-:101BE000487862209F60000085AC000010110C084E
-:101BF00075254A780500A920100006A0048086807B
-:101C00008E81081200A2041FFC1D86808E810500B3
-:101C10005601A920100005A0B8011AA1A81213822C
-:101C20008D8128021AA12012041F0C1E28001AA15F
-:101C300008231082041F0C1E0600003284A0FFEF50
-:101C400080200E005E0105000600003285A0001015
-:101C5000B80C747DD07006A50409DA1E10785020E7
-:101C60000C08771B0409DA1E46A070790025008055
-:101C700012A10920400008123000D07206A21801FB
-:101C8000408809208000C600127107700100992069
-:101C90003000A920200080AC0100A02061200000BD
-:101CA000FF8810010C08771B0870FCD0E80D077046
-:101CB0000200912001808CA0E0013815A553FF8C13
-:101CC0002011FF880409C71E5000002C8E78A9201F
-:101CD000200080AC0100A020A5530408C71E46A028
-:101CE00018721C73C4DA10012074247592A240008B
-:101CF0009BA30000A3A40000ABA500001A721E73F2
-:101D0000C4DA18012274267506A0077004000409BD
-:101D1000C71EFF8C10010C087F1BCE000C087F1B18
-:101D200046A0887800808A7886A00200C0017C7A6C
-:101D3000787BC4DA1001847C807D7479078104800B
-:101D4000048010A299A30000A1A40000A9A500008E
-:101D50001A721E73C4DA8805227426757004146022
-:101D6000FCD018116920404710006920804791205D
-:101D700000801F680200FF88200146A08C78602048
-:101D8000700C8B780000AC7885A00300AE789120B1
-:101D900001809800CE008B7800000C085C20046065
-:101DA00084A00F005900FF8830018C786020046007
-:101DB00084A00F0019000408261E05000200EC1E76
-:101DC000071F201FEC1E2D1FFD1EEC1EEC1EEC1E1F
-:101DD000051F1E1FEC1EEC1EEC1EEC1EEC1E392017
-:101DE0000004BC7805A7BE78086005A70A600C0847
-:101DF000691F9C60BA789F6000000C0848200500AD
-:101E0000BC78C4D00801580C1C60BDC01E603000F6
-:101E10000C088620BC78C4D00801080CBF780000EC
-:101E20000460078084A0FF00B278018038010C08AC
-:101E3000691F2001BC78C5C0BE7810000408841F4B
-:101E400005000C088320BC788CA0000E1011C4D0B3
-:101E5000081128080C08691F10110408841F0500C8
-:101E6000BC78C4D010010408EC1EBF7800001467D1
-:101E700011200100A822186084A0FF0005A088019D
-:101E8000BCA700FFA92020008EA001005001BCA724
-:101E9000008011200200A92000018EA0020008018C
-:101EA000C0000C089A1B002D912000802B680000B8
-:101EB0002F680000086884A0DEFF0A68E8AD100003
-:101EC00091200180041F511F11821801A9200001D7
-:101ED000580C0C087F1B05009F600000B4786DA0B3
-:101EE000002CB6781011BA7838009E68002D026078
-:101EF000B87806AD08110260B0780180B278301170
-:101F0000BC78C4C0BE78B878602006A00500E600A2
-:101F10002EA03025BA7DB67DAE65B2651C60A2608C
-:101F2000482084A9FFE11E6084A9600060010C08BC
-:101F3000E93FFF864011FF853011392000080C0869
-:101F40004820040846209665A6659A66AA66146726
-:101F500071208047FCD710117120404784A7000FE3
-:101F60000B8084A71F00200103800380038003806F
-:101F700005A1C07168A10027078084A00F0003801D
-:101F800003800380C47100A1C26091200080147896
-:101F9000C4D03801FCD71811F4D040111000FCD087
-:101FA0002811086E84D6F001FCD9E011912001803F
-:101FB0000C08021C912000800C08B21D91200180A9
-:101FC0001478C4D004094620FCD72011F4D0301175
-:101FD00004084620FCD01011040846201B60210094
-:101FE00004084620246096A001001011008026609D
-:101FF000106A146802A268026001912001803920F1
-:1020000000029C60BA789F6000000C084820040819
-:102010004620082CFCD9F001006865A0D801046AAC
-:10202000007084A002006801487006A25011046B81
-:1020300060210423026005A0081102696022026188
-:102040009800002D60200C08BF26086E60210262F7
-:10205000066950000068026965A01001026108006D
-:1020600006696021036000006021FCD91801B4A654
-:10207000FCFF0A6E1068087D28850A7D00801268C2
-:1020800091200180B4D62801B6A640000A6E0C0843
-:10209000131CEE000500086005A70A60912000806F
-:1020A0000C08B21D91200180B87865A028019C60C1
-:1020B000BA789F600000780CB678BA78050070791D
-:1020C0007478182884D31801008012A1200200809F
-:1020D00012A1781284C37C7A1A72787A1E72C4DADA
-:1020E0002001847A2272807A267206A084D30801A5
-:1020F00000807678D2701C7805A0380101801E78A7
-:102100002011040E82209120804005003920982063
-:10211000100039209E20042705A0600100AC682033
-:102120000869106812690A680C69146816690E68F3
-:102130003887880C0500030009000F0015001B00FC
-:10214000000015001B000000412000000C78020078
-:102150004A222522A92019213920748F3427107D85
-:10216000C000846086A00301041903211461186073
-:1021700005A12001FF86D81104080321038680A051
-:10218000558F0C6202220080106202220C08D01DC2
-:1021900030868EA60F00040984216C7865A0081D86
-:1021A000087802A62012ACD510113A26050082A6A6
-:1021B0000300041A8421912000806920000018681F
-:1021C00084D0F8111120558F0422C6701082042289
-:1021D000CA7084D6301110820422DA701082042270
-:1021E000DE7085A62080C2701B68010091208040AF
-:1021F000107884A0CFFF1278912001803B2000004E
-:1022000005001078ADC01278040884213A260C0825
-:10221000502204196C226C7865A00419AE2091201C
-:102220000080107884A0CFFFFF860801ADC012782F
-:102230009120018004086C223920748F3427107D8E
-:10224000A000846086A0030104196E211461186047
-:1022500005A12001FF86B81104086E2180A6558FC4
-:102260000C6202220C08D01D30868EA61E000409C6
-:1022700084216C7865A0281D087802A62012ACD5B0
-:1022800010113A26050082A60600041A8421912026
-:10229000008069200000186884D0F8111120558F43
-:1022A00009204E8FA8261C2104221A2008811082A2
-:1022B000041F502185A63080C2701B680100912048
-:1022C0008040107884A0CFFF12789120018006A072
-:1022D0000920758F0A203A2005001078ADC01278C9
-:1022E000B0003A260C08502204196C226C7865A0C4
-:1022F00004191E2191200080107884A0CFFFFF8652
-:102300000801ADC012789120018004086C22912050
-:102310000080077004009479D47002A1280268013B
-:10232000907B02A350111000028038113A261078D9
-:10233000ADC0127891200180050084A100FF40010A
-:102340000F810C810C8104800480078000A118009B
-:102350000781048004809C7A10A21A72987A06A0E1
-:1023600011A21E72C4D43001A47A11A22272A07AE2
-:1023700011A22672A1203000037000000920548FA2
-:102380000A2609819821042184D008013386B0A649
-:102390000200A826A65303861270077001009079E8
-:1023A000947800800AA1081206A02820747984A1DC
-:1023B00000FF40010F810C810C81048004800780A4
-:1023C00000A118000781048004807C7908A1787A34
-:1023D00006A011A2C4D42001847B19A3807C21A46F
-:1023E0000870FCD0E80D84A0E001D001107D312000
-:1023F000548F3426A8780080AA788CD038110770C2
-:102400000600047094D0E81D04088621692047471F
-:102410006B200300AC7885A00003AE7806A04800CE
-:102420003020D67591208040967D107DACA5CFFFE1
-:10243000127D91200180AA78077006003A26037069
-:1024400001001A711E72C4D5100122732674050092
-:10245000846086A00301D8111461186005A1B81129
-:1024600069200000186884D090110C60C67010605C
-:10247000CA70C37020801B680100912080400C0846
-:10248000D01D040E43226C7865A0101D0500590074
-:1024900030156C7865A0E0191004290000156C78DF
-:1024A00065A0D81DE000846086A003016811186053
-:1024B000FCC01A6086A0040038110478A4D0200162
-:1024C0000C08D01D06A005007900181185A0010098
-:1024D0000500B900101141200100107D0500FF88A2
-:1024E0001001912080400500907B9479D47002A166
-:1024F000181185A300000500100202A30500028048
-:10250000050084A100FF40010F810C810C81048033
-:102510000480078000A118000781048004809C7A51
-:10252000987BA47CA07D10A206A019A321A429A5B4
-:1025300009201800286005A01001092040000C089F
-:10254000341BD001A8780080AA788CD010151460B4
-:10255000FCD0181169204047100069208047912065
-:1025600000801F680300AB780000AC7885A00003F2
-:10257000AE78912001806800AB7800000C08D01D77
-:102580009079947800800AA1081206A09678D670F7
-:1025900006A071201000912001800500FCD71811C1
-:1025A00009205847100009209847912000800A20F0
-:1025B000F6000920804779200001FCD7201109206E
-:1025C000404779200002042186A000008011FCD73A
-:1025D000181109204547100009208547042105A04E
-:1025E0003011307884A0C00010111B785200FE001A
-:1025F000050009200200692000470120FF01042096
-:10260000FCD004194B237120804779200001212040
-:10261000BF494B780F000120FF010420FCD01801B6
-:102620001920373E3000A1202B011920373E84D1DC
-:102630001001A1202B02042305A040019A781883E1
-:10264000AC2318839823A6531833A80C9B7800005A
-:102650009B782000A9201000AF780000AF782020E0
-:10266000041F29230370000016008CD109200000EC
-:102670000801BDC10C086C241E00207084A00F004E
-:1026800085A0006306780F7800904378D8005378CF
-:1026900090000B78082F52744F70000009814001A0
-:1026A00071204047792000022120BF4704080623FB
-:1026B0000C0826250500160011200101BCD11011BF
-:1026C000112001028CA10F00042284A0F0FF05A1BB
-:1026D00012201E000C086C24050011200101FCD3FF
-:1026E000101111200102A92009000B81041F72237F
-:1026F0008CA1000E042284A0FFF105A11220050088
-:102700001920020009200101A92005001382041FDD
-:10271000832394A2E000042184A01FFF05A20A20C5
-:102720001983180109200102780C0500112001010C
-:10273000FCD3101111200102A9200C000B81041FF1
-:102740009B238CA100F0042284A0FF0F05A112207E
-:10275000050011200201FCD31011112002020422F5
-:102760009CA0300F84A0CFF005A112200500C60068
-:1027700061200001BCD1101161200002BCC10381A5
-:10278000038080A020009A60AC62AC63CE0005009C
-:10279000C60061200001BCD1101161200002BCC143
-:1027A0000381038080A022009A60A46084A0DFFFE0
-:1027B000AE60CE000500C60061200001BCD1101142
-:1027C00061200002BCC10381038080A020009A60C8
-:1027D000A4608CA220001801ACC29DA30040ECC3F1
-:1027E000B4D30811EDC3AE621020A460AE6318200C
-:1027F000CE00050091200080C600E600186805A004
-:1028000004095024FCD118016120D08E10006120F1
-:10281000C08D0C0858246005A9200101FCD11801C5
-:102820006120D08D10006120C08CC6000C08582497
-:102830002801CE00608C041F1224A8040E00FCD1D5
-:10284000280182A0D08D71208047200082A0C08CFA
-:102850007120404776707271382101200400627047
-:102860007F700F00D071C4C1D2710C08CB22C000A0
-:10287000FCD1181171204047100071208047206062
-:10288000DDC0226072713821002C7A7001200600B0
-:1028900062707F700F00D071C4C1D2710C08CB225E
-:1028A000012000001000012001009120018005A0FE
-:1028B000EE00CE000500042C05A070016020106021
-:1028C00006A340110C6006A22811146006A1101185
-:1028D00006A020000060800C85A001000500F60025
-:1028E000E60016007920804771200001BCD120113C
-:1028F000792040477120000220798CA10F00EC70F4
-:10290000C4D010111E0060000B810B810B810B8164
-:102910000E008DA10008BCD010118DA1000F042164
-:10292000EE00FE000500012001470420ACD0381164
-:10293000E468ACD0200184A006000811090005005D
-:102940001460E600360018207120404CFCD01011B5
-:102950007120C04B078084A00F0003800380038098
-:1029600070AE047084A00A0004192325087194A194
-:1029700000FF040923258CA1FF001C7084A000FF28
-:10298000C001047085A03A0006700120090002A170
-:10299000D81601200A0002A1D01601200C0002A1C5
-:1029A000C8161C7084A0FF001E70047084A0DFFF96
-:1029B000067001200A0006A1A80101200C0006A152
-:1029C000A0010120120006A198010120140006A117
-:1029D00090010120190006A188010120320006A102
-:1029E0008001D80009200C00D00009201200B80096
-:1029F00009201400A00009201900880009202000E7
-:102A0000700009203F00580009200A0040000920FA
-:102A10000C002800092019001000112000000021DE
-:102A200005A20A70047085A00A0006707120004794
-:102A30000470BCD05801FCD32011EA7371204047C8
-:102A40001800EE73712080471F700D003E00EE00ED
-:102A500005000120FF010420FCD0D0110120FD045D
-:102A6000042082A00500A01271200002EC718CA14C
-:102A7000001C0F810C810C8179200001EC7884A06E
-:102A8000001C07800480048005A18AA007000802BA
-:102A90000500020074255B2574255B254E256825FD
-:102AA0004E25087084A0FFC385A000300A70087806
-:102AB00084A0FFC385A000300A780500087084A0B8
-:102AC000FFC385A000200A70087884A0FFC385A0FA
-:102AD00000200A780500087084A0FFC385A0000CC0
-:102AE0000A70087884A0FFC385A0000C0A7805004E
-:102AF000040E7525912000807120000006001870DA
-:102B000084D0E81D0E0071201000CA700E00C6703F
-:102B1000C3700280DB70040ADF702A00712000009D
-:102B20001B70010091208040F80C3C7F587E307C67
-:102B3000387DA0788A708E75927496769A7794A56F
-:102B40003F00F4D43801BCD7281184A77D000419B4
-:102B50009C3C71089CA40F0082A304002003A6A340
-:102B6000070030191824078584A00F0002006C2B81
-:102B7000572C952CFB2E7932D03276330534D9344C
-:102B8000AB35C725C4259E29852A4D32C4250C089E
-:102B90007525050006A0380008788DC00A7806A0C3
-:102BA00002704A704270CE705C7005A0041918273C
-:102BB000607084A007000200E12552265A26632691
-:102BC0006C26FE26752652263078BCD0101DD0719A
-:102BD000BCD1F819B4D104192F26A07086A0010029
-:102BE000C009147005A0A819B0706DA0006865A098
-:102BF00055A09B7880000C6BAA7B086845A0106DDF
-:102C000004686DA05DA086A801001801BC69AA7DBA
-:102C1000AA79C0684DA01C6E0120100004084B2842
-:102C20005C7005A00419C625C600D600B0706DA062
-:102C3000006865A055A09B7880000C6BAA7B086893
-:102C400045A0106D04686DA05DA086A80100180164
-:102C5000BC69AA7DAA79C0684DA01C6E0120200025
-:102C600004084B280C085B3C0419C6251B78680037
-:102C7000B8706DA0B4685A789468D678DE78986891
-:102C8000D278DA7808788DC00A78BC683E70B4C112
-:102C9000D271B47065A0C068567003700200002D38
-:102CA0004A7080AD0900427005000C085B3C2011A1
-:102CB0001B7854000370040005000C085B3C2811CD
-:102CC00011200C0019040370040005000C085B3C83
-:102CD000281111200600D1000370040005000C0823
-:102CE0005B3C281111200D008900037004000500D1
-:102CF0000C085B3C501111200600410078707B707D
-:102D0000000068204A700370040005007071FCC167
-:102D1000078182789B78800086A20C002011AA7A15
-:102D20000120010098008CA11F008DA1C000AA798C
-:102D300086A20D002001AA7A012002003800AB789B
-:102D400020007471AA79AA7A012004009B7860009F
-:102D5000AA785B7804001B7813010C086E3C7F7026
-:102D60000F00D070B4D06801B4C0D270C600B47087
-:102D700065A0086084A0EFFB0A60186001801A60FB
-:102D8000CE000500147005A03811D070B4D0280111
-:102D9000B47006AC1011290C05001600A07186A1B4
-:102DA00001002805D600260000211120010012A2F2
-:102DB000B0706820006806AC20011182B001C90023
-:102DC000C80CC60000211120010012A2B0706820BA
-:102DD00000686020086084A0EFFB0A601182100187
-:102DE0004100B00CA3700100CE002E00DE001E00DA
-:102DF0000500E8AD0500A87006AD1011A4706820AC
-:102E000005000C085B3C0419C625787068207077B3
-:102E10000C08953B502C0C08F63C9B7880001468FD
-:102E200084A01F00BDC0AA781C6E412001000120B3
-:102E30000400040850280C085B3C0419C6259B7844
-:102E400080005C706820146FD070B4D06801B4C08A
-:102E5000D270C600B47065A0086084A0EFFB0A6061
-:102E6000186001801A60CE000C08953B502C0C08AD
-:102E7000F63C246805A0300182A00600080210007C
-:102E800027680500146884A01F00BDC0AA783120FF
-:102E900020004120010001200300040850288DC2B9
-:102EA000D272BC7200A215A0507108812AA108023A
-:102EB000BC7164210465FF85701152712184A81DC5
-:102EC000D0708CD02801CC7005A01011CF700A00F2
-:102ED00005000022900CD0708CC0D270CF70000022
-:102EE000346005A0B01D086784A73F07D001D4D780
-:102EF000801D84A72100681D84A70200300184A7DB
-:102F00000400380DBCA7FBFF0A6784A71802081D40
-:102F100084A700013001186005A0D819BCA7FFFEE6
-:102F20000A676825236800001C6E84A60E001863DB
-:102F300028011C6002A3200218015808FF834819C9
-:102F4000582D502C5271BCD72011287022603A6045
-:102F50001000BCC70A67C06865A04DA00061602A68
-:102F600041200100146B9CA31F009DA3C000FCD155
-:102F7000100184D610019CA3BFFFA4D610019DA30D
-:102F8000200084A60E0004190228A5C70A67002C99
-:102F9000C668A07786A701007811D070B4D0601100
-:102FA000007082A0020040123078BCD028119B78BB
-:102FB0008000AA7B040849283987A2775027AC777C
-:102FC000B0A70500A87006A60811A476AE763A2C24
-:102FD00038873A2D38873A2838873A2338873A2570
-:102FE0003078BCD050019120008091203D30D070CD
-:102FF00084A03D30912000809020D5AA00002001BF
-:1030000021840022041951270500DCD10409F1377D
-:10301000292020009CD6201128858CD608112885CF
-:103020004088146F0C6108818CA1FF00C87060A1FA
-:10303000642CFF8C8801146006A7D01DB860018045
-:10304000BA60881D602A086085A000010A6000221D
-:103050002184041951270500602A0E61BE69002CE5
-:10306000C66840880860D5C00A60A07786A70100BE
-:103070000419D927D070B4D00419D927007082A0C0
-:103080000200041AD9273078BCD00419D9279B78BC
-:103090008000AA7BAA7DAA790120020006001860A0
-:1030A00000801A600800060060290461602A0C088C
-:1030B000093D901584A11800800184A11000180119
-:1030C0000C089A39481584A108003801A06984A128
-:1030D000000618110C08B838F800A06984A1001E79
-:1030E000280584A100087801C6006029006085A039
-:1030F0000020026004618DA110000661CE000C0862
-:103100009A395011A06984A1000218010C08FD38F9
-:10311000180084A10004F019A06984A100103001F6
-:1031200014698CA100FF0F810C08C5232E008CA60A
-:10313000E00084A66000280186A0600010118DA127
-:1031400000408DA10401B6699B7860000028AA7830
-:103150001868FDC01A68BCD66801FCC08370000006
-:103160008AA00D0028038AA00C00827101200C00A7
-:103170000C808671AA781835403328340080AC80E2
-:1031800080AF2B00A0209B78000080AD0B00982022
-:10319000A653A8239828A02586A220000815D07041
-:1031A000B5C0D270002CB670002DBA701468FCC087
-:1031B0000780827886A2020004092129A07000807D
-:1031C000A270B07498A40500A87006A30811A47397
-:1031D000B27386A210000409C625DE00CE000500E9
-:1031E000007005A0E01986A20200041938290C0815
-:1031F0005B3CA8191468FCC007808278912000808D
-:103200001B786800B4685A789468D678DE78986835
-:10321000D278DA789120018008788DC00A7826016A
-:10322000D600C600D07084A0002E9020CE00DE0014
-:103230002E0100295670BC683E7003700200002DFC
-:103240004A7080AD090042703078BCD040019120B6
-:103250003D30D07084A03D30912000809020A0703F
-:1032600005A0081105002184E80D4C72BC7000A275
-:1032700015A00408512786A2100060150C085B3CBD
-:103280000419CC281468FCC0078082781B78680079
-:10329000B4685A789468D678DE789868D278DA7804
-:1032A00008788DC00A78A0700080A270B07490A4D5
-:1032B0000500A87006A20811A472B2720029567007
-:1032C000BC683E7003700200002D4A7080AD09009A
-:1032D00042700500B46B9DA300205A7B1468FCC0AB
-:1032E00007808278946BD67BDE7B986ED27EDA7E06
-:1032F0001B78680000295670027208788DC00A7821
-:10330000002305A67001D07084A0002E86A00026A0
-:1033100018110920000010000920010084A20F00EC
-:10332000330080AD09004270002D4A7005009C29D1
-:1033300008420842F64108429C299C299C290C0815
-:103340007525087884A0FDFF0A78F60079200047EB
-:10335000AC78FE0084D0C001607186A10100040930
-:10336000612A86A10700700186A1050058117870B6
-:1033700068201B68040017680000206884A0FF0014
-:103380009DC0226863700000A3700000A470AE703E
-:10339000B2700C08AE26560111200400607186A19F
-:1033A0000100580186A1070018111F7005001000C8
-:1033B0001F700100D070C5C0D27001200A470420E0
-:1033C00084A0FF0086A0180030011870167005A0B8
-:1033D0001011A370010066000C084E3FA9201000D8
-:1033E000392000000C088B3AB8A70001041FEF2910
-:1033F0006E00007002002C2A0A2A0A2A022A2C2AAD
-:103400002C2A2C2A002A0C0875255C7005A038058A
-:1034100006AD181100685E708000206884D04811E5
-:10342000146F0C08953B0860D4C00A600C08C737BD
-:103430002000587060200068026084A6005F1E684B
-:103440001868FCD008011A6A176800002B68000091
-:10345000206884A0FF009DC022680C08BF1D1120B9
-:103460000400C874A0A40001B104A0AE1700990420
-:10347000A9200101C87479042084041F382AC0706F
-:10348000602021200200A92000011061FF81980125
-:10349000186016000600112002470C2202A112201B
-:1034A0000E001E0002A138031260281111200447EB
-:1034B0000422A5C012201B600000E0AC1000041F15
-:1034C000422A2184001D5E01637000000370000029
-:1034D0004B70000005004600042405A0A8016820E8
-:1034E000006806001A6A176800002B680000B468BC
-:1034F00084A0005F1E68206884A0FF009DC0226831
-:103500000C08BF1D0E00480C4E00232000000500D3
-:1035100082A2030010030C087525002302008F2AE5
-:103520000C2B1A2B82A2020010010C08752560706A
-:10353000637000007F7000002200D077C5C7D2778B
-:103540000200A62AA62AA82AE02AFB37A62AE02AF1
-:10355000A62A0C08752570770C088B3A7077BCA7E3
-:10356000008F0C08953B186005A02805FCD71811A2
-:103570002120C08D10002120D08E092005001120AF
-:1035800010000C08342BB8015601A9200101FCD70A
-:1035900018112120C08C10002120D08D4600092058
-:1035A0000500112010000C08342B4E001801208457
-:1035B000041FCB2A5E01388784A71F0090190408D6
-:1035C000C9250408C92570770C08953B186005A02B
-:1035D0002005FCD718112120C08D10002120D08E8D
-:1035E00009200500112020000C08342BB0015601E1
-:1035F000A9200101FCD718112120C08C1000212026
-:10360000D08D4600092005001120200081044E00C5
-:1036100018012084041FFE2A5E010408C925002227
-:103620000200112B132B132B0C087525637000005F
-:10363000D070C5C0D2700408C92500220200212B19
-:10364000132B1F2B0C0875250C084E3F007086A00D
-:103650000200041980370C08E137086084A0EFFBF2
-:103660000A600C087237040980370408C92504244D
-:1036700005A090056820042D0600146806A718010F
-:10368000202D0E00A80C0E0022201A6917680000D9
-:103690002B680000B46884A0005F1E68206884A0C6
-:1036A000FF0005A222680C08BF1D212002471C2430
-:1036B0001983222310600180126028112120044701
-:1036C0000424A5C02220086084A0EFF90A600C0839
-:1036D000CA260C08E137050085A00100E00C002394
-:1036E0000200732B712BEE2B0C087525E47805A0D6
-:1036F000B01708328CA1000818010401C62510007B
-:103700000403C625082084A03000101104084D329F
-:10371000EC7884A00300D00D8478FCD0181184A12B
-:103720000700900084A1070086A004001811012062
-:103730000000500084A1070086A00500180184A1A4
-:1037400007001000012001000200D12BDA2BC72B4B
-:10375000AA2B4F3C4F3CAA2BE42B0C08752500707C
-:1037600086A004009011607086A002003011112024
-:103770000200192000000408852A607086A0060057
-:10378000B00D607086A00400900DE4790120030064
-:1037900004083B2F1868FCD010011B681D000C08A2
-:1037A000613A1B786E0005001868FCD010011B6898
-:1037B0001D000C08613A04082D3C1868FCD010016B
-:1037C0001B681D000C08613A1B78FA000500186898
-:1037D000FCD010011B681D000C08613A1B78CB005F
-:1037E000050084A50F00C01100700200C925FB2B45
-:1037F000FD2B803780378037FB2BFB2B0C08752582
-:103800000C08E137086084A0EFFB0A600C087237EF
-:10381000040980370408C925E47805A0041BAC2BF3
-:1038200008328CA1000818010401AC2B100004031D
-:10383000AC2B082084A0300018111B78680005000C
-:10384000EC7884A00300C80D8478FCD0181184A102
-:103850000700900084A1070086A004001811012031
-:103860000000500084A1070086A00500180184A173
-:1038700007001000012001000200492C4D2C442CAF
-:10388000422C4F3C4F3C422C493C0C0875250C08FF
-:10389000673A1B786E0005000C08673A04082D3C57
-:1038A0000C08673A1B78FA0005000C08673A1B7889
-:1038B000CB000500002302005E2C5C2C602C0C0861
-:1038C0007525040805341B681600A3780000E47908
-:1038D00084A1300004090534EC7884A003000409B5
-:1038E000053484A10001980D8478FCD0181184A1BE
-:1038F0000700900084A1070086A004001811012091
-:103900000000500084A1070086A00500180184A1D2
-:1039100007001000012001000200922C4D2CC72B43
-:103920000B3C4F3C4F3C0B3C493C0C08173C050002
-:1039300082A2050010030C0875259878402000230A
-:103940000200A12CCB2ED52E00220200BD2CAA2CC9
-:10395000BD2CA82CAD2E0C0875259B781800A878D6
-:10396000102084A0FF0082A02000040A303A8AA020
-:103970000400041A303A0200303A303A303AE4395E
-:103980009B781800A87984A1800048010408303A87
-:10399000007005A0D81D112004000408B73584A1CB
-:1039A000FF008AA01000041A303A0200E52CE32C34
-:1039B000F72CFB2CA92D303A303AAB2D303A303A67
-:1039C000A92EA92E303A303A303AAB2E0C08752584
-:1039D000E4D6400101200003008000803A781B7883
-:1039E000C70005001868FCD018011B681D00900C6A
-:1039F00004080B3C1B681D0004085B3A206922691F
-:103A000084A6001804194C2D206884D00419542D64
-:103A1000186886A0080010111B680000D4D668053D
-:103A2000BCD6580583700000186884A03F008AA0A7
-:103A30000D0018078AA00C00827101200C000C8078
-:103A400086719B786100AA785601360146011600FE
-:103A500008328CA100061801A1202B021000A12021
-:103A60002B011E009B7800000080AC8080AD0B0015
-:103A70009820A6534E013E015E01386005A050110A
-:103A80001C6884A00E0004095B3A0C086D3A2B7880
-:103A90000830100001803A601B7871000500E4D600
-:103AA00030011B78830005001B788300050084A685
-:103AB0006000D00DDCD6C00DFCD6A001FCC65A7E3D
-:103AC000B66EDC7AD879D078078084A07F0008A110
-:103AD00091A20000986B002102A3B268946B0022AF
-:103AE00003A3AE68F4D61801F4C65A7EB66E007011
-:103AF00086A00300481106000C084E3F0C0808423F
-:103B00000E001B788000050006A00C08E842B06A91
-:103B1000AC69986C946B002205A12001002222A4BC
-:103B200000211BA3AA6CD27CDA7CA66BD67BDE7B41
-:103B3000002305A43011F5C65A7EB66E1B788000AE
-:103B400005001B788000002215A118110C080842FE
-:103B500005000C08354205000C08752504083F2EA9
-:103B6000C6005470602020698CA1FFEC22690060BF
-:103B700084A0DFCF02600C08173906A0402038204F
-:103B80000C08BF390408332EC60054706020482C3E
-:103B9000A87A94A2FF0086A20400D8112069E4D17B
-:103BA000701139200000412000003120000006A0E3
-:103BB00010200C081A390C08BF390408332E8CA1C8
-:103BC000FFEC226904618CA1DDFF06610060ACC0DE
-:103BD000026086A20300D001046184A110004805A0
-:103BE0000C08913B0C089A39FF881805CE009B7889
-:103BF00060000028AA78587E95C65A7ED4D618113F
-:103C00001B786E0005001B78820005002069CCD16E
-:103C100030018CA1FFFD22690060ECC002603920F8
-:103C20000000412000003120000006A010200C08F8
-:103C3000BF3986A201005801046184A10800B001C7
-:103C40000C08913B0C08B838FF888019780020696F
-:103C5000C4D130018CA1FFFE22690060E4C0026083
-:103C60003120000006A010200C081A39CE00587E22
-:103C7000D4D618111B78710005001B78830005004D
-:103C80000408573A08289B78800019208000A878FB
-:103C900094A0FF0086A20100B811002302A186A013
-:103CA00001000409AD2DA87CA4A4FF0080A402009B
-:103CB00000A3182002A1040AC12D0409C12DA824C3
-:103CC000A87A041F5D2E180C84A2F00082A02000A8
-:103CD000B806002282A021009816A87A18831883BB
-:103CE000002102A3A00A86A2230050091C6884A018
-:103CF000F1FF1E68587E84A6F1FFA5C030205A7ED1
-:103D00000860A5C00A60A07805A00409342EA82088
-:103D100098799B786000AA78112080009A79A87819
-:103D200098799A7AAA78987A041F8B2E95C65A7E2B
-:103D3000D4D618111B786E0005001B788200050090
-:103D40001883002102A3040A442E84A280000419CF
-:103D50005B3AA07805A0C80804085B3A0408303A2A
-:103D600054704DA09B781800A87884A0FF008EA006
-:103D7000010010010C087525A87A94A2FF004B7869
-:103D80000800A87884A0FF008AA00500041A303A31
-:103D90000200303A2F38303A4A39593D82A20000A9
-:103DA00010110C0875250C08613A1B78820005007B
-:103DB00082A2030010110C087525FCD4D01160708C
-:103DC00005A010010C087525146F7277BCA7008F31
-:103DD0000C08953B086085A021000A60388784A7FD
-:103DE0001F00B01D0C08643A637002001F700900C8
-:103DF00010000C08703A1B788200050082A20400B3
-:103E000010030C08752500230200052F9B30D730C6
-:103E100086A2030098050072D87CDC7DD07FD0712B
-:103E2000B4D12805BCD11815012001470420C4D005
-:103E3000F011687884A0FF00D01182A20200B812AD
-:103E4000D6003B7800831B785900B8706DA0B46829
-:103E50005A789468D678DE789868D278DA78B4C1DF
-:103E6000D27103703000DE000120000058003B7862
-:103E700000131B7857000120000020000072D87C3E
-:103E8000DC7DD07F4670A068ECD0180108608DC042
-:103E90000A6084A20F0002007C30562F532FA731F6
-:103EA0003232C925512F512F0C0875250860D4C016
-:103EB0000A60E4D62001447086A01400E8110C08C2
-:103EC0004E3F092000001868FCD00801447086A00D
-:103ED00014006801186886A0080004193E3058785C
-:103EE0009CD004093E302068ACD004093E301B68E9
-:103EF000140009200200A80468788CA0FF0088053F
-:103F000086A1080058110860A4C00A600C08723726
-:103F100040050C08E1370C084E3F600086A12800E0
-:103F20000015186005A0780D0180680D0180580DFE
-:103F30001E60480C206884D00409C92584C022680A
-:103F40000C08BF265870C600602000680260CE00D2
-:103F50000460026805A0002D0811026006600408D4
-:103F6000C9251600FF81F015007086A03000D0052D
-:103F7000D071BCD1B815B4D1E8115C7005A0901512
-:103F8000A07086A001007005037000004600560076
-:103F900076006600C600D6000C08F125DE00CE00D3
-:103FA0006E007E005E004E00D071B4D1D811037057
-:103FB0004000C0000C085B3CA8111B786800D600CC
-:103FC000B8706DA0B4685A789468D678DE7898682E
-:103FD000D278DA78B4C1D2710370300008788DC01D
-:103FE0000A78DE000C08FF301E00FF8104093E3015
-:103FF00084A600DF1E682B680000146F86A10200F3
-:1040000004193F30186886A0140030110820E4D647
-:10401000180168788CA0FF000C087A3A0C08CA26B0
-:104020002068DCD07815178794A20F0013821382C2
-:10403000138284B20006180190A2C04B100090A217
-:10404000404C90A200001C22C4D370012068E4D030
-:10405000280184A0FFEF2268ACC31223108204223F
-:1040600085A0380012201182D4D33801A068C4D0B2
-:1040700020110C0867310408C92508608DC00A604A
-:1040800008002A6916691868FCD0100144701A6883
-:104090008CA600DF1E691064FF84680109200247B6
-:1040A000042101800A202184126428112120044760
-:1040B0000424A5C02220186005A0180101801A6000
-:1040C00018110860A4C00A60206884D0301100680C
-:1040D00005A008110260066020005870602000688A
-:1040E00002606120004787680301082D6B200000F3
-:1040F000686005A06A611001022D08006E610072FF
-:1041000086A23000580186A240000419C925037018
-:10411000020048706820C468602005000370020037
-:10412000B8706DA0BC683E70B47065A0C068567071
-:10413000002D4A7080AD09004270050082A2040083
-:1041400010020C08752500220200A630B530C130DF
-:10415000B53086A50013600186A50083901D03700D
-:104160000000186001801A60086084A0EFFB0A60FC
-:10417000007086A0050028010C08613A1B788200B7
-:1041800005001B788300050090780780018084A0DB
-:10419000070080A018009A78A8798CA1FF0086A15A
-:1041A0000300280186A1000010010408303A1B78A2
-:1041B00083000500206895C02268FF8218110C0852
-:1041C000613A3000118210010C0875250C08703A14
-:1041D0001B78820005000C086E3C307884A0C0007B
-:1041E0007011160008328CA100081E00180104018D
-:1041F000FC3010000403FC301A7906A0050085A0ED
-:104200000100050084A6600030112F6800003368AB
-:10421000000004086631DCD69811B468DCD0801147
-:104220009869946A2E69326A447005A030110022A0
-:1042300005A104094E3F4770150004084E3F0500D4
-:10424000ACD6F001F4D630012F68000033680000CE
-:1042500004084E3FB46884A0004035A6F4D6A01DE3
-:10426000447005A0101147701500DCD62811B46801
-:10427000DCD01001A86CA46D2E6C326D04084E3F8A
-:10428000F4D630012F6800003368000004084E3F68
-:10429000B46884A0004835A6F4D6A01D447005A0DB
-:1042A000101147701500082410250027078084A0EE
-:1042B0007F0008A191A200002E69326A002105A2A8
-:1042C000101104084E3F007086A00600100104087B
-:1042D0004E3F050046690860CDC0CCD308018DC0B3
-:1042E0000A6018683A681B6806008F6800009368C7
-:1042F0000000306A2C693E6A42692F680300336807
-:10430000000037682000976800009B68200000705C
-:104310000200C925963190318E318E318E318E3129
-:104320008E310C087525206884D018110C08C73709
-:1043300030005870502C602000680260602AA0AEE7
-:104340001700042405A010012020D80C222D6B207A
-:10435000000005000C08CD370C08E1370860CCC020
-:104360000A602B6800009B780E00146F38691A6988
-:10437000446916690920000086AE404710010920F3
-:1043800001000C081F43DCD6C8011C69EDC11E6981
-:10439000286882A00E009002486884A00F0086A0C2
-:1043A0000B0060115C6886A04700401101200147A6
-:1043B0000420ACD0181100270C089E241868FCD0EB
-:1043C00040011B68000068788CA0FF0010011B688A
-:1043D0001E00A0AE1700006822203C6A4069326AC5
-:1043E0002E69C06860200060A4D0800541202100B3
-:1043F0004920050051202000D600F6005601460154
-:10440000792000470C08B21B4E015E01FE00C87007
-:10441000102009200101260004226DA0400114682B
-:1044200006A710010068C80C2068D5C022682E00BD
-:1044300010820981801DDE00637003007B70000024
-:1044400072777F700F00D071C4C1D271186886A0D6
-:1044500002003811176800002B6800001C68ECC0CF
-:104460001E680C08BF1D0408C925D87CDC7DD07FE0
-:104470000C08FF302B6800009B780E00146F0C08AE
-:10448000723C8CA0FF0016691868FCD010014470C3
-:104490001A688CA600DF1E69637000000408C92535
-:1044A000007005A010110408C92506A00C084E3F95
-:1044B0002069ACD110111B6814008CA600DF1E69A6
-:1044C0002B680000206884A0FF00226800700200B2
-:1044D000C9256F326F327232723272326D326D3282
-:1044E0000C087525186804083B2F0860A4C00A60F2
-:1044F0001768000004089537002302007E328032DE
-:10450000CE320C087525FCD604195B2D00700DA069
-:104510000200C92590329032BA329032CB328E32BC
-:104520008E320C08752584A66000380586A06000D0
-:104530001015ACC6F4C6EDC65A7EB66E1C68ACC08B
-:104540001E6886A1020048010C084E3FAC69B068A5
-:1045500015A118010C08354210000C0808421B7800
-:104560008300D071B4D10419C625A07086A00100C3
-:1045700004190D260500ECD6F0091868FCD070016E
-:10458000F4D630111B6815001B7883000408C6257B
-:104590001B6807002F680000336800000C08173CF8
-:1045A00005000C08752500230200D732F93251337B
-:1045B0000C08752500700200E132E332EA32E13284
-:1045C000E132E132E132E1320C087525AC69B068C4
-:1045D00015A118010C08354210000C0808421C688F
-:1045E000B4C01E68D070B4D00419C625A07086A0CF
-:1045F000010004190D260500FCD604194133007092
-:104600000DA00200C9250F33093339330F333E3370
-:10461000073307330C0875259468D678DE789868D8
-:10462000D278DA7884A66000380586A0600010157C
-:10463000B4A6BFBFEDC65A7EB66E86A10200480181
-:104640000C084E3FAC69B06815A118010C08354242
-:1046500010000C0808421B7883001C68B4C01E6858
-:10466000D071B4D10419C625A07086A00100041928
-:104670000D260500ECD6F0091868FCD010011B6867
-:1046800007001B78FB000500FCC65A7EDC7AD8794F
-:10469000986B002102A3B268946B002203A3AE685A
-:1046A000D2791B7883000500DCD630012B780930E5
-:1046B0001B7883000408C6258478ACC08678E4782B
-:1046C00084A00800501184A400020801F5C6DDC6CC
-:1046D0005A7E1B7883000408C625206895C022688E
-:1046E0000C08023CDDC60C08613A1B788200040805
-:1046F000C625002302007B337D337F330C087525EC
-:1047000004085B3A987DD4D6A815E479ACD1300181
-:10471000EC7884A0030010012B7809309B786000AE
-:10472000AB78000084A6FBFF5A789A7DE479ACD17F
-:104730002001EC7884A0030020110120140004085B
-:104740003B2F8478FCD0181184A10700900084A12D
-:10475000070086A00400181101200000500084A169
-:10476000070086A00500180184A1070010000120A1
-:104770000100C204907A94A207009B786000A87997
-:10478000FF8168059B788000A87B84A30100D0117D
-:10479000A87BA87B86A3040018110920DFFF58001E
-:1047A00086A3010018110920F7FF280086A3030043
-:1047B00048110920EFFFC60054706020046004A176
-:1047C0000660CE009B786000AB78000084A6FBFFFB
-:1047D0005A782B78093020698CA1FFEC22699A7DE8
-:1047E00004080B3CD12BDA2BF933FF33F733F733C3
-:1047F0000B3C0B3C0C08752520698CA1FFFC226941
-:104800000408113C20698CA1FFFC226904080B3CC0
-:10481000E47984A130002001EC7884A003007015B5
-:10482000007086A004009011607086A00200301114
-:1048300011200200192000000408852A607086A05B
-:104840000600B00D607086A00400900D007086A078
-:1048500000000409C625206984A120042801D4C1D0
-:104860002269186804083B2F18688EA002002001F6
-:10487000FDC01A680120140004083B2F8478FCD086
-:10488000181184A10700900084A1070086A00400ED
-:10489000181101200000500084A1070086A0050027
-:1048A000180184A1070010000120010002000B3C48
-:1048B0000B3C5C340B3C4F3C4F3C0B3C0B3CBCD6A4
-:1048C00070058071FF81580582A10D001813837057
-:1048D0000000280082A10C00827009200C009B7847
-:1048E0006100AA795601360146018470148110A234
-:1048F000867280A00B0000AD982084B200061801DB
-:10490000A1202B021000A1202B019B780000088120
-:10491000AC81A6534E013E015E010408113CD4D681
-:104920000419CF34206884D00409113C8CA660009F
-:1049300084A66000200186A060000811F5C194C122
-:104940005A79B6699B786000AB7800009B7861006B
-:104950001868FDC01A68AA7808800C810409F63727
-:104960008CA1F8000419F6375601360146011600ED
-:10497000A1202B0108328CA100061001A1202B02DE
-:104980001E009B7800000080AC8080AD0B0098205A
-:10499000A6534E013E015E011468FCC00780827878
-:1049A0000408113C1868FCD010011B6808000C08B2
-:1049B000613A1B78ED00050000230200E0349D35CC
-:1049C000DE340C087525D87CDC7DD07FFF8228156D
-:1049D000007286A203000409092FD071BCD1F8111E
-:1049E000B4D1E801012001470420C4D0C011D60091
-:1049F0003B7800881B785900B8706DA0B468A5C0DA
-:104A00005A789468D678DE789868D278DA78B4C123
-:104A1000D27103703000DE003000007220003B785D
-:104A200000181B78570084A20F0002008835453516
-:104A30001D35382F1B3588351B351B350C08752562
-:104A40001C68ECD0180108608DC00A60206985C11F
-:104A500022690068066005A0081102600860D4C0E1
-:104A60000A601C6884A00E002011C87188A1000192
-:104A700028003070BA683C71C87008A1042102682F
-:104A80000A2D5A71DCD62011FCC6B66E0408883592
-:104A9000B66E84A66000201184A6FF7FB668D80495
-:104AA000DCD6501184A6FF7FB6689468A668986823
-:104AB000AA680C084E3F7804ACD6400106A00C084A
-:104AC0004E3F08241025AA69A66A6800082410250C
-:104AD0000027078084A07F0008A191A20000AA6996
-:104AE000A66A0C084E3FFCD6B00184A6FF7FB668CC
-:104AF00010250824ACD638110027078084A07F0039
-:104B000008A191A20000986B002102A3B268946BE7
-:104B1000002203A3AE68007086A030000419C925E6
-:104B200003700200B8706DA0BC683E70B47065A0E0
-:104B3000C0685670002D4A7080AD090042700500B3
-:104B400086A50088481103700000186001801A6073
-:104B5000086084A0EFFB0A6004085B3A4370000021
-:104B600082A2060010030C08752500230200B73549
-:104B7000C835D23500220200BF355B3AC135BF359A
-:104B8000033651360C087525807A94A2000F0C0864
-:104B9000A5360408303AC10002005B3AD035D03562
-:104BA0000336D0355B3A0C08752571000200DC3500
-:104BB000DA35DA35DC35DA35DC350C0875250C08E4
-:104BC000703A1B7882000500007086A00200501128
-:104BD0000C08E13710000C084E3F086084A0EFFB82
-:104BE0000A602000007086A00300A80D0370050075
-:104BF0000120E08E8EAE404710010120128F682008
-:104C00004A7080AD0900427000220500007086A045
-:104C100002005811D070B5C0D270002CB670002DB3
-:104C2000BA7038000C084E3F2000007086A00300C8
-:104C3000C80D03700100807A94A2000F9B781800C1
-:104C4000A87C84A41F0015A26920C08D84B2000630
-:104C50001811FDC26920D08E042D082D5A716DA047
-:104C60002801146806A220010068B80C0C08A536BB
-:104C7000B46E5A7E206984A1000C0409CB366070A2
-:104C800086A006002811707006A2101162707A705A
-:104C90001B680500ADC11B680500ADC1D4C1226908
-:104CA0000C08673A0408CB36007286A2020058113D
-:104CB000D070B5C0D270002CB670002DBA70300024
-:104CC0000C084E3F180086A20300D00D03700100AF
-:104CD000807A94A2000F9B781800A87C84A41F00FF
-:104CE00015A286AE40470801FDC2A879A8798CA11B
-:104CF000FF001821C87068A1042D082D5A716DA0FD
-:104D00002801146806A218010068B80C0904B46EE2
-:104D1000206984A1000C0409CB36DCD078016070D6
-:104D200086A004004011707006A22811747006A3BA
-:104D3000101162707A700C086D3A80041B680500CF
-:104D4000ADC1D4C122690C08673A7B700000300401
-:104D50000370050084B2000618010120E08E1000E7
-:104D60000120128F68204A705601A92032000320CA
-:104D700000000080041FB4365E0184B200061001FA
-:104D8000FCC20800FDC2166A80AD09004270B76817
-:104D9000000723680008276803000500ECC6ACA6DE
-:104DA000600004091237986B946CAC69B06805A177
-:104DB000E011D27BDA7BD67CDE7C86A56000C8055C
-:104DC000F4D60811EDC6B4A6FFB75A7E09208300B9
-:104DD0009CD62801092082001920000020231A797E
-:104DE000ECD688050C0808427004B0681AA30021AC
-:104DF00023A4002405A3F801D27BDA7BD67CDE7CD9
-:104E0000B068F4D60811EDC6F4C65A7E11208300AE
-:104E10009CD62801112082001920000020231A7A34
-:104E2000ECD688010C0835427000192000002023C0
-:104E30001000B4A6FFB75A7E092083009CD610014B
-:104E4000092082001A79C0685670002D4A70C46823
-:104E50006020D071012001470420C4D0C815D4704F
-:104E60002DA0B801BCD14805807A94A2000FD8705B
-:104E700006A21801E07804A55815D670BCC1D271FD
-:104E80003804312001002C85180233861082D80C9A
-:104E90000500E07D94A500FF3001112008002F855A
-:104EA000810C37860800690C1782807884A0000F77
-:104EB00006A27001DA72D6765800807A94A2000FAA
-:104EC000D87036A2C00DE07834A5A80DBDC1D2714E
-:104ED000B4D10419C625002305A40409C625A07071
-:104EE00086A0010004190D260500206005A05001D0
-:104EF00001802260086085A008000A600F70000130
-:104F00002C702660050006A00C084E3F007086A09D
-:104F100002002001607086A0050050112B6800007F
-:104F2000176800001B680100236840001F6800012B
-:104F3000007084A00F000200C925A637A337C3372D
-:104F4000AF37C925A137A1370C08752549041104CD
-:104F50002800310458706020006802600C08BF1DF2
-:104F60000408C9256070637000007F7000000200B3
-:104F7000BF37BF37BD37BD37BD37BF37BD37BF3789
-:104F800004089A2A637000000408C9251B68000001
-:104F90000408A731006805A008110260066005003A
-:104FA0001064FF84680109200247042101800A205F
-:104FB000218412642811212004470424A5C0222042
-:104FC0000860A4C00A600500186005A010010180F7
-:104FD0001A6005000C086E3C1B68180090040C0851
-:104FE0006E3C1B68190068040C086E3C1B681A00B4
-:104FF00040040C086E3C1B680300180470770C0812
-:10500000953B74718CA1FF00103294A20006180128
-:10501000E8A1C08C1000E8A1D08D042D082D6820D7
-:1050200005A018117A700408C9251468707206A2C8
-:1050300010010068980C00680A201B6805007B704E
-:1050400000000C08CD37206884D010110C08C73739
-:105050000C08E1371F680000236820000C08BF1D02
-:105060000408C92582A203000419353AA87DACA51D
-:10507000FF00A87EB4A6FF002069BDC12269C4D18B
-:10508000B005C4C12269B4A6FF00300582A618008D
-:10509000180210013120180086A610000811308671
-:1050A0002B852B85412000000C08EE3A18010C08D6
-:1050B0001A39A0000C08BA3A0C0817392069C5C182
-:1050C0002269587E95C65A7ED4D618111B786E0078
-:1050D00005001B78820005000C081739587ED4D6CD
-:1050E00018111B78710005001B7883000500C600AD
-:1050F000547060200061E4D198050862178294A280
-:10510000FF0082A2180018021001112018000026CA
-:1051100002A20812302286A610000811308608620A
-:1051200094A2FF00EC78E4D0300182A20A00401281
-:1051300011200A00280082A20C00101211200C007D
-:10514000002202A5081228220C08BE3A2B852B85C6
-:10515000412000000C08EE3A18010C081A39200012
-:105160000C08BA3A0C081739587895C05A78CE000E
-:105170001B7882000500C60060290060E4D0881119
-:10518000B4D05011106084A00F00301104618CA1C4
-:10519000F5FF0661CE000500112032001920000045
-:1051A000F000A068CCD0C01D086294A2FF00EC788B
-:1051B000E4D0300182A20B00181211200A0028004E
-:1051C00082A20C00101211200C0008631F839CA304
-:1051D000FF0082A318001802100119201800AB78F4
-:1051E0000100AB780300AB780100AA7AAA7BC0A8C3
-:1051F00005002068C5C022680C087A3ACE00050078
-:10520000C600602904618CA1F5FF066111203200FF
-:10521000192000000000AB780100AB780300AB78E8
-:105220000100AA7AAA7BC0A805002068C5C0226830
-:10523000CE00050006A030201020C6005471602169
-:105240001820082084A0E0FF35A6867E18609A7892
-:10525000AE7E1266A47884A070778CA10F0005A1A1
-:10526000292005472C25CCD54001A4D3100185A0C9
-:105270000008FCD3100185A08080A67816608A788B
-:10528000B4A61F0037860482048005A60E60046061
-:1052900084A0D5FF0660CE00050082A2020004199A
-:1052A0003F3AA87A2069BDC12269CCD16805CCC13A
-:1052B000226994A2FF0082A20200041A303A0C086C
-:1052C000C1390C08173980A901000C200C08913B4A
-:1052D0000C08B838FF8878019B7860000028AA780D
-:1052E000587E95C65A7ED4D618111B786E000500DC
-:1052F0001B7882000500587ED4D618111B787100E7
-:1053000005001B788300050082A20200181284A207
-:1053100001004001547188A100000C21ECD1101152
-:10532000112000000C08AC3A79040C0817395878A1
-:1053300095C05A781B7882000500C60026006029B7
-:10534000006011200100ECD05811BCD0381114605D
-:10535000B4D02011A4C1066106A08800112000006D
-:10536000AB780100AB780200AB780300AA7AC0A842
-:1053700004000C087A3A206885A0000222682E00FA
-:10538000CE000500078815A7C6000920000054704C
-:105390006020FF82100109204000186080A00200F8
-:1053A0009A78A47884A09FFF05A1ECC0B4D008111E
-:1053B000EDC00061F4D1100185A02000A678166030
-:1053C0008A78046084A0EFFF0660CE000500060026
-:1053D000007086A0030010010E0010000E0098045B
-:1053E000ACD68805887884A040006805B87B078320
-:1053F00084A07F001815078284A0FF000409573A93
-:105400009AA00400041A573AF4D6D011D879DC7A5D
-:1054100008A191A20000D279DA79D67ADE7A0C0856
-:10542000E8421B78800084B20006180101200000C9
-:105430001000012001000C089A4105000C08752598
-:105440001B78800005001B788300050039200000D0
-:10545000412000003120000006A010200C081A395D
-:105460000C08BF39587E0C08733A1B78820005007F
-:10547000D10C2068C4C02268C600547060200C089B
-:105480004439B000810C2068CCC02268C60054703A
-:1054900060200C08DE396000310C206884A0FFEC2D
-:1054A0002268C60054706020046084A0C5FF0660B6
-:1054B000CE00050049001B78820005002768020025
-:1054C00049001B78820005000120050088000120AA
-:1054D0000C0070002068D5C0226801200600400042
-:1054E00001200D0028000120090010000120070004
-:1054F0009B787E00AA789DC65A7ED070B4D0680191
-:10550000B4C0D270C600B47065A0086084A0EFFB80
-:105510000A60186001801A60CE00050076003F879F
-:10552000BCA70F003B873B870387E0A0C04B8EAE34
-:1055300040471001E0A0404CB8A720009A7FA47912
-:1055400084A1E07FAE781260A47984A13F77A67829
-:105550001660046085A0380006607E0005009B7818
-:105560008000AB780100AB780200AB780300AA7A28
-:105570009B786000AB7804000008312000002920EF
-:1055800032009B788000AB780100AB780300AB78E9
-:105590000100AA7DAA7E9B786000AB780500040814
-:1055A0007A3A5601078084A0FF000380038080A020
-:1055B00020009A78A4798CA1E0FF21207A3B192061
-:1055C0001100A9200E0011203200042484A0E0FF65
-:1055D00006A128012084002310A2041FE23A5E01E4
-:1055E000050056010408303B2120883BA920090012
-:1055F0001120290082A5280050052084A99511209A
-:10560000330082A5330018062084A99519200A00CA
-:1056100011206500002202A5D0022084002310A2E0
-:10562000041F073B5E01880021207A3B19201100EE
-:10563000A9200E0011203300002202A54002208480
-:10564000002310A2041F193B5E0106A00500118271
-:105650005E0182A564002012087885A070000A7897
-:10566000042405A0050086A80200E8012120663B6D
-:10567000A9200D001120280082A52800480D2084B3
-:105680001920190011203300002202A5000E2084E9
-:10569000002310A2041F413B5E011120840182A55A
-:1056A0008501B00A90082120753BA9200300112034
-:1056B000240086A52400600920841120280086A5E6
-:1056C0002800300920841920190011203300040813
-:1056D000193B21100222033404460558066A077C50
-:1056E000104612461258125A146A146C146E177E21
-:1056F000219002B004E210E210E2091202300232FC
-:105700000342034404540456056605680678067A85
-:10571000070C070C070EE1100A330558055A066AF4
-:10572000066C077C077E000E9B78800046A0050073
-:1057300084A7000F0B8084A71F00038003800380D1
-:10574000038005A1FCD71801E0A0C06C1000E0A008
-:10575000C04C0500E600F60084D038017920000135
-:105760000920804771208047300009204047792078
-:1057700000027120404791200080042184A00F0086
-:105780000200C83BC83BC83BC83BC83BC83BC63B04
-:10579000C63B0C087525B469F5C18CA19FFFB6699D
-:1057A00005A08005587884A09FFF85A000605A78E6
-:1057B000287886A0141830154B780400487884A007
-:1057C0000400E01D4B780800487884A00800E01D24
-:1057D0003078BCD0B81184B2000818010401FF3B36
-:1057E00010000403FF3BE47984A130005801EC78F9
-:1057F00084A0030038011C68ACD01011D90010003F
-:105800001B78FB00FE00EE0005000120014704208C
-:10581000ACD0181114680C089E2405001B78830076
-:1058200005001B78820005001B78710005001B78BD
-:105830006E000500092019470C2186A100005001C7
-:1058400086A1010050011F700B00637001001B78DE
-:10585000540005001B78F30005001F700A000500C6
-:10586000092019470C2186A10000680186A10100CA
-:1058700038011F700B00637001001B785400050095
-:105880001F700A0005001B78F20005001B78FB0062
-:1058900005001B78FA0005001B78CC0005001B787A
-:1058A000CB0005001868FCD010011B681D001F709C
-:1058B0000B00637001001B7854000500307884A051
-:1058C000C000701108788CC00A7800E000E000E0A9
-:1058D00000E0EC7884A02100180108788DC00A78D7
-:1058E000050008788DC00A780500307884A0400053
-:1058F000E01D84B2000818010411803C100004135C
-:10590000803CAC780500087884A0FDFF0A7800E0B0
-:1059100000E000E000E0EC7884A02100400184B2C7
-:105920000008180104118F3C10000413923CAC785D
-:105930000600087885A002000A780E00050084A7FA
-:10594000010004194D3284A770004001C600602D8B
-:10595000682F0C089024782D682CCE0084A70800AE
-:1059600048014B780800EC7884A0030004094D320C
-:1059700004080B3C84A70400C801B87884A0008008
-:10598000A8014B780800EC7884A0030004094D328C
-:10599000E47884A0070086A001004011C07885A6A5
-:1059A000004830205A7E1B78FB00050084A7800049
-:1059B00040018478FCD028010C08573A1B6822006B
-:1059C00005001B680300587884A0005F1E682F68DC
-:1059D0000000336800004B780800EC7884A00300D6
-:1059E0000409AC2B84B2000810010401C62504038D
-:1059F000C625146B078384A00F00038003800380F7
-:105A0000FCD3180180A0404C100080A0C04B602047
-:105A100048205670602A0500C60060290060ACD09E
-:105A20000409573DA068ACD1201184A0000E0409E0
-:105A3000553D086117818CA1FF001C632F83DCD0CA
-:105A400010019DA30100CCD0C81184A5FF0038012E
-:105A5000EC78E4D010011382B8002920000082A164
-:105A60000C009012EC78E4D0181109200C006000B2
-:105A700082A10B00481209200A00300009203200E0
-:105A80001120000029200000AB780100AB7806004F
-:105A9000AB780400AA79AB780000AA7AAA7BAA7D29
-:105AA000C0A80800206885A0001022680C087A3A77
-:105AB00085A00100CE00050082A206000419493A23
-:105AC000A87DAC7E3786ACA5FF00B4A6FF00AC7FF6
-:105AD0004787BCA7FF00C4A8FF002069BDC1226999
-:105AE000E4D10409CB3D8CA1FFEC226982A702001E
-:105AF000041A233AB4A6FF000409C83D82A6310067
-:105B0000041A233A82A50900040A233A82A8030052
-:105B1000041A233A86A80200D00186A800000419BE
-:105B2000233A01200C00EC79E4D1100101200A0095
-:105B300002A590120C08233AC6006029046085A0D3
-:105B40001A0006600060ACC00260CE00050086A7A7
-:105B500000000409233A348682A618002802200196
-:105B6000312018000408193E86A61000081130865E
-:105B70002B852B850C08EE3A0409233A0C081A39B8
-:105B80000C08BF39587ED4D618111B787100050057
-:105B90001B78830005000C081739900C86A80200BA
-:105BA00008113486547188A100000C21ACD104097D
-:105BB000233AECD120113920000041200000E4D12B
-:105BC0002011312000004120000082A70200C812ED
-:105BD0001C6284A2FF0006A710013920000005A660
-:105BE000900108611F819CA3FF00680102A30812B5
-:105BF0003023078805A786A00102600186A800005F
-:105C0000680139200000412000003120000006A07A
-:105C10001020700084A200FF0811402084A1FF0022
-:105C200002A5080128212B852B850C08EE3A580D7A
-:105C30000C081A390C08BF399B788000AB7801003A
-:105C4000AB780600AB780400AA7DAB780000AA7E92
-:105C5000AA7F0028AA789B786000AB7808002068AB
-:105C6000E5C022680C087A3A587895C05A781B78B3
-:105C7000820005002000200000002000000020001D
-:105C80000000200000002000000020000000200094
-:105C90000000200000002000000020000000200084
-:105CA0000000200000002000000020000000200074
-:105CB0000000200000002000620009001400140011
-:105CC00055984D9814001199FF98140014009000F5
-:105CD000E70000010204082080F8180017000F8474
-:105CE000C1D8140016000AA214000B300CA2140034
-:105CF00000251300002510001000100010001000F7
-:105D00001000100010001000100010001000100013
-:105D1000100000A206383988C420640850A8083052
-:105D2000C128189D01A20C30472861816A84008037
-:105D3000A48456183A8808A8E228CE9CF3A86408E0
-:105D40003EA80C3001A80830E128CE9CA22863713F
-:105D500031A8212018A805A20C87DED8A064E06D28
-:105D6000C06FA467806C120205A23D882B881418AE
-:105D70003B882770F28537A732A503F076857786B2
-:105D800013A83E8811A88228627114A80A2804A2C8
-:105D9000C064E06DA067C06F14183B8823707685DF
-:105DA000778602A861783E886A20C128189D422023
-:105DB0000121CAA802290EA20BA807A2140003A25F
-:105DC0000080A48572189A873C88E21F01F608A219
-:105DD0006E852171140004070830CE9C140002A2C5
-:105DE0000080A4850930A884E21944F86E853F88B4
-:105DF000E608F5A861F8EBA801F8140081F8160090
-:105E0000B285F0803295A2FAE21D1400328521F2AB
-:105E10001400E21DA884E0D6E61F140008300080BC
-:105E200049281110FCA80830008000A08120022819
-:105E30001110FCA889A80830A1203C281110FCA84A
-:105E400009A217000C300080A485E21DC1DA1400FD
-:105E5000100201A81400E0263A87A3FAF219E026FE
-:105E6000F21814000BA214000DA206381002229D95
-:105E7000040706A265687E812A84C11D2388160056
-:105E800042600880FAA860812A84808121F008306D
-:105E9000A884D7114270DD201100D5202288160079
-:105EA00000002601D07084A0004C04809020047271
-:105EB00008709CC005A2A0110C72FF822801FF8A05
-:105EC0007811007284D260110478CCD010010C08D3
-:105ED0005B4307700800037008002E0100200500D6
-:105EE000007084A0030002709CC684D088050871ED
-:105EF00000E0087006A1D81D84A103000409CA3F70
-:105F000084A1E0010419CA3FF4D1881D84A10030A6
-:105F100086A00010600D112080010C7111823001EB
-:105F20000870F4D0201D0C7006A1C00D077012007F
-:105F3000087100E0087006A1D81D84A1030068055F
-:105F400094D1B00DF4D148050770020080082804F0
-:105F50000871FCD130010C08D640FF8A0409543F77
-:105F6000B80C0C708CA0FF07E801047084D0780195
-:105F7000147005A048111070107306A3E01D0023D3
-:105F800005A0280102A1201E077010003000FF8A22
-:105F900048010C089A42E81DD8090C085C402E0103
-:105FA00000200500047208719CC10381181207705B
-:105FB0000200C00C05A2881D0770080003700800CD
-:105FC0000600012001470420CCD010010C085B43DF
-:105FD0000E002E01002005002864FF840805702CA7
-:105FE0000470BCA00F00B8A71D403C27FB874811D8
-:105FF00010020C0875259C6075A09001880C392052
-:106000001240042768AE086830A60C6829A52184D0
-:1060100038013887042705A0A81D9C7075A0001DB5
-:1060200005000000050009000D0011001500190011
-:106030001D000000030009000F0015001B000000F8
-:10604000000012400F4000000000008000001240DD
-:1060500000001A40174000000000000000001A4035
-:1060600000001540154000000000008000001540B1
-:1060700000001B401B4000000000000000001B400F
-:10608000792000477120100007700A000770020095
-:1060900003700100092002007120500007700A00FF
-:1060A00007700200037000000120FF010420FCD0F3
-:1060B00028110981180171202000800C050004704E
-:1060C0000480041AB2400871087006A1E01D84A182
-:1060D000E00120010C080E410408D24007701200B4
-:1060E000192000000871087006A1E01D84A1E001DC
-:1060F00020010C080E410408D2409CA10C3086A35C
-:106100000420900186A30800C001047084D04811C7
-:106110000871087006A1E01D84A1030010010408A5
-:106120000E4186A30C20F0190072048230020C7319
-:1061300084A3FF0710010C0875250871087006A1DB
-:10614000E01D84A1E00118010C080E4170040770E5
-:106150001200007084D048111073147005A3280138
-:106160000C7184A1FF0704195C400871087006A136
-:10617000E01D84A1E00118010C080E41B000077079
-:1061800012000770080004709CD0E81D08710870A8
-:1061900006A1E01D84A1E00118010C080E412800B1
-:1061A0000770120008710381880E03700800050053
-:1061B000087184A1E001A815087184A1E001881587
-:1061C00084A107000200EA40F840E840F840E840B7
-:1061D0004841E84046410C087525047084A0100031
-:1061E0008DC00670FF8A18114920000005000C08B8
-:1061F0009A42E81D0500047084A010008DC006704E
-:10620000047084D040110871087006A1E01D84A1BB
-:10621000030008013000FF8A18010C089A42E81DAB
-:106220000500077012000871041D114191200060E3
-:10623000041D1541912000600770120007700800CE
-:1062400004709CD0E81D077012000871FCD1D81DA5
-:1062500003700000007005A03011047005A0181133
-:106260000C7005A00801400C4920000084B2000217
-:106270001801012000001000012001000C08A73BBC
-:106280001B6802005120000005000C0875250C0851
-:1062900075250C088741107214710C709CA0FF07C3
-:1062A000002800A311A289A10000A1040427582CF2
-:1062B00060AC0863002222A30C6300211BA300240E
-:1062C00005A340013812128410820A8389A10000BC
-:1062D000602B580C602B078A060004609CD01801C4
-:1062E000BAA717401000BAA70F400E003DA7002C18
-:1062F00086688A6F926C8E6B0871087006A1E01D2B
-:1063000084A1E00110010C080E41077012000C0876
-:106310005C400500508A3987042704A0681100609A
-:1063200064A00811602D046084A00F0080A02D409F
-:106330003C20FB870C09752505002601D600D0708E
-:1063400084A0004C04809020DE008468602088686F
-:106350008C6B906C5780D4AAFF0084A0FF000600CD
-:10636000046884A008000E001801B8A017401000AF
-:10637000B8A00F4084B200021001207E0800247EE5
-:10638000B5A60C001C68B4D0080185C6002405A37E
-:106390005005582C0427046160AC006000A448201C
-:1063A000CCA9040018010C08A34300041A7004606F
-:1063B00001A31E709CD14001106081A000002270DA
-:1063C000146081A0000026700862002402A21270EE
-:1063D0000C62002303A21670027607700100602B86
-:1063E0000C08C54210000C089A42E81D2E0100203E
-:1063F00005002601D600D07084A0004C04809020B7
-:10640000DE0007700400047094D0E81D03700800DB
-:106410002E01002005002601D600D07084A0004C7B
-:1064200004809020DE00207E84B200020811247EC9
-:10643000B5A60C001C68ACD0181185C6037000000E
-:1064400028685020602D0460BCA00F00B8A71D4034
-:106450003C27FB87381110020C0875259C6865A045
-:106460002001880C0C089A42E81D2E01002005002E
-:10647000260106001600D600D07084A0004C0480CF
-:106480009020207E84B200020811247EDE003E00AF
-:106490004E00B5A60C001C68B4D0280185C6037058
-:1064A00000000770040049203542286855A0D60036
-:1064B00004099642702D602E0470BCA00F00B8A78E
-:1064C0001D403C27FB87401110020C0875259C706D
-:1064D00075A060207005800C042768AE086822A4AF
-:1064E0000C681BA36802518A10110C0875253887A7
-:1064F000042705A0901D9C7075A06020D001E008C5
-:10650000228420841A8399A300000869002422A110
-:106510000C6900231BA110120C08752584B200021F
-:10652000180171205000100071202000DE000408C6
-:10653000C341DE002E01002005000870060084A083
-:10654000E0010E00100106A0050084A0030086A053
-:10655000030008110500042778AC0078082F94D0B8
-:106560000419A6431A7004781E70087812700C780B
-:10657000167004609CD02001107822701478267068
-:106580000276047084A0100085C006707920004750
-:10659000518AE8013887042705A068119C6005A08E
-:1065A000B8016020046084A00F0080A01D403C2042
-:1065B000FB870C0975250870060084A0E0010E0019
-:1065C000100106A0280084A0030086A00300050097
-:1065D00051200000050026010600D600D07084A0DE
-:1065E000004C04809020DE008E00087184A103001E
-:1065F0002811286805A0780104086D3F0871FCD1B6
-:1066000018010C08D640880C077010000871FCD1E6
-:10661000E80D0C08D640087086A00800301D0070F8
-:1066200005A0181D0370000049200000060001208D
-:1066300001470420CCD010010C085B430E002E0152
-:10664000002005002601460136015601C600D6008D
-:10665000D07084A0004C04809020DE0049201F43AD
-:1066600080AD1100A02084B20002180199203200F0
-:106670001000992031000C7084A0FF072A68077071
-:106680000800077002000370010018010080AC8050
-:10669000A5530C7084A0FF0730010770040004703C
-:1066A00084A00400E01DCE0049200000037000001B
-:1066B0005E013E014E012E01002005001468FCD051
-:1066C00004099E43007084D0E005247EB5A6040032
-:1066D00007700400047084A00400E01D1871160007
-:1066E0001C71160020711600247116001B7000002A
-:1066F0001F70FF3F2370000027700000137004001C
-:10670000177000000276077001000120FFFF0920CA
-:1067100031000A200A200871087006A1E01DFCD192
-:10672000D00D2E0026722E0022722E001E722E0018
-:106730001A7207700200087086A008001001040891
-:106740000E41077004000370000005004920C3419A
-:106750006800087084A00300100106A0050006A0D0
-:1067600020201820582C602149200000588B0061FF
-:10677000002108A41A71046001A31E700600042BF6
-:1067800084A008005001106081A000002270060063
-:10679000146081A000002670060084A1070011206B
-:1067A00008002AA20862002412A226000C624022DD
-:1067B000002343A82E00FF887011002502A20801C3
-:1067C0005012202241200000042B9CD010010E000A
-:1067D0000E000E005004127517700000027686A994
-:1067E000C3411811077001002800047084A0100034
-:1067F00085C00670002500A11A70042B84A0080033
-:1068000010010E004E001E0089A100001E710C2B0D
-:106810008CA108003001A1A40000227481A0000016
-:106820002670002522A2C3A8000012742028167426
-:10683000027686A9C3411811077001002800047070
-:1068400084A0100085C00670598B602B792000470A
-:106850000C08C54206A00500912000809120006030
-:10686000AC7805A068117479D07006A148111C7825
-:1068700005A030011F780000040E3D4491208040A7
-:1068800069208047FDC7006884A00F009811D06878
-:10689000B4D08001BCD07011F60079200001FCD783
-:1068A000101179200002307884A0C00010110C086B
-:1068B000D522FE00FCD7200169204047FCC7180CF8
-:1068C0003078018032780419C744347832786120F6
-:1068D000C06C69208047FDC7CC6805A028010180F5
-:1068E000CE6810110C083946006884A00F006801BA
-:1068F00086A00100500140680DA03801042105A0C8
-:10690000200101800A200409D645146805A0A801C9
-:10691000018016689011A3680100F600FCD71811D9
-:10692000792000021000792000010C086E3CFE0066
-:10693000606805A010010C08D5227C6805A0400104
-:1069400001807E68281163680000D068C5C0D268E5
-:10695000D068FCD0B001FCC0D268A920000234602D
-:1069600005A0580101803660D068FDC0D2682811AA
-:10697000106005A010010C08D522E0AC1000041F27
-:10698000AC44FCD738016120C04C69204047FCC7AB
-:10699000040869445904387801803A78A0113C7899
-:1069A0003A786120C04C69204047FCC70C6805A0BC
-:1069B00010010C084345FCD730116120C06C6920E0
-:1069C0008047FDC7980C1078CCD06801ACD020115E
-:1069D000A4D04801ADC0127891200180040EEF448C
-:1069E0000C08A1200500912001800500407801805D
-:1069F0004278041942454478427869204047FCC7F0
-:106A000079200002D46805A03801E07D04A520119A
-:106A1000D668D068BCC0D26879200047106805A04D
-:106A200010110120010101801268FCD7180180A01B
-:106A3000D08D100080A0C08C4020042065A0E00113
-:106A4000246005A0B001018026609811006805A0AF
-:106A50003001486806AC18110C08D645680060681B
-:106A600005A018012760010020000C0884450428B7
-:106A7000280C0060402C100CFCD73811692080478E
-:106A8000FDC7792000010408FF440500092000002B
-:106A9000A920000208609CD05805246005A01801B8
-:106AA00001802660180408609CC084D01011ACD00E
-:106AB000C0010A60046005A0D801D600C600160017
-:106AC00068201060018012600C08C737002D682C08
-:106AD00060200C08021C0C08B21D1E00CE00DE0057
-:106AE0003800BDC00A608DA1010010008DA1000119
-:106AF000E0AC1000041F474584A1010030018CA1C7
-:106B0000FEFF0E690C08D52208000E690500002C56
-:106B10007A681467726F176000002B6000001B60BA
-:106B20000600B46084A0005F1E60206084A0FF00A7
-:106B300085A0600022600060422069208047FCD769
-:106B4000101169204047586806AC101100285A6897
-:106B50000C089A1B186805A0100101801A680868C3
-:106B6000A4C00A681068087909810A7901801013A5
-:106B70000C087525126818111079A5C112792F60BB
-:106B8000000033600000682C0C08BF1DFCD71811F2
-:106B900069204047100069208047106984A10001E6
-:106BA0000120060018117669012004000C08CB2290
-:106BB0000500D60048696021FCD718116920000241
-:106BC0001000692000010C0890241B600600586822
-:106BD00084A0005F1E60206084A0FF0085A04800A4
-:106BE00022602F60000033600000086884A0FDFF71
-:106BF0000A683068B4D0B0014B680400A9201400C2
-:106C0000486894D01001041FFD454B680900A92075
-:106C10001400486884D01001041F0646A920FA0019
-:106C2000041F0D461B685400DE0063680700050062
-:106C300079200047E1008900A900092002006920AD
-:106C400080470F6800001368000017680000098182
-:106C5000180169204047A80C05001920A3003A7BC1
-:106C60003E7B050019203300427B467B050019203E
-:106C7000DD32327B367B05004C6A85A20000F001D4
-:106C80005069BC6B00A3C60064210463FF83381104
-:106C90001182480108811AA1B80EBC69A80CCF68FE
-:106CA0000A00CE0005004C69BC6A64220860B5C0C9
-:106CB0000A6010820981C81D4E69CE0005001600C9
-:106CC000041D5D4691200060041D61469120006016
-:106CD000EC70DCD01811D4D09001A0008EAE000171
-:106CE00038011478F5C0C5C01678D4D0801560047A
-:106CF0001478FDC0C5C01678D4D048152804E4D057
-:106D00000409C446041D7F469120006009200C0040
-:106D1000041D8546912000600981D01DE47084A087
-:106D2000FF0186A0FF011011EC70C0088EAE0001BB
-:106D300028011478F4C0FCD0301120001478FCC075
-:106D4000F4D00811C4C0167804788CD00005C600B1
-:106D500061200000186084D0B81186AE0002E60001
-:106D6000712010002001DB700100E4781800DB7056
-:106D70000000E078C670C3700E801B600100912097
-:106D80008040EE00CE001800CE001F680C001E00F0
-:086D9000A070A2700500260CA2
-:00000001FF
-/*****************************************************************************
- * QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP12160 device driver for Linux 2.2.x and 2.4.x
- * Copyright (C) 2002 Qlogic Corporation (www.qlogic.com)
- *
- *****************************************************************************/
-
-/************************************************************************
- * --- ISP12160A Initiator Firmware --- *
- * 32 LUN Support *
- ************************************************************************/
-
-/*
- * Firmware Version 10.04.42 (15:44 Apr 18, 2003)
- */
diff --git a/firmware/qlogic/1280.bin.ihex b/firmware/qlogic/1280.bin.ihex
deleted file mode 100644
index 612c2633f8cd..000000000000
--- a/firmware/qlogic/1280.bin.ihex
+++ /dev/null
@@ -1,2008 +0,0 @@
-:10000000080F0B0000107800411000002E3E000089
-:100010004320504F525947495448312039392C31E7
-:1000200039313239312C39392C3339313439512085
-:100030004F4C494720434F435052524F54414F4930
-:10004000004E492050533231303446207269776D6A
-:10005000726120655620726569736E6F30202E388C
-:1000600035312020432073756F74656D20726F4E9B
-:10007000202E303050206F72756474634E202E6FC6
-:100080002020303020200024C920FF980120FC04CB
-:10009000042086A08010C000541071200001A070C0
-:1000A000A270C12010008920741378006D10012007
-:1000B000FC04042086A08012C00069107120000298
-:1000C000A070A27071200001A070A270C120100069
-:1000D0008920F81378006D10C120200089201C139E
-:1000E00071201000C3700400C7705349CB702050BA
-:1000F000CF702020D37008000120FE04D670C120EC
-:100100002100192000000920FFFE00210B20A5A5D9
-:10011000ECA1FF7F642D6B200A0ADCADFF3F542B5E
-:100120005B205050142186A2A5A54000A41086A3F0
-:100130000F004000A0106A2C5A2AC120200019206C
-:100140000F00780080106A2C5A2A7800A2106A2CBE
-:100150005A2A30212821A2A1004F248424842484F7
-:1001600024842484248492A1009909200000012081
-:1001700032007810C12018227920004FA02F0824C7
-:1001800011200000A9204000A4420981C000BF1036
-:10019000092000FF003402A14800CF104000CF101A
-:1001A000A820A4420120FC04042086A08010C000E6
-:1001B000E510712000017E0D6920404F7810B04D90
-:1001C0007F0D1078EDC012781B78640078000A115A
-:1001D0000120FC04042086A08012C00005111478C0
-:1001E000EDC0D5C016781B786400712000027E0D2A
-:1001F0006920404F7810B04D6920804F7120000178
-:100200007810B04D1478D4C016787F0D78000A119C
-:100210001478E5C016781B783C00CA7EC27CC67B89
-:100220006778000000788DC0027831203000AF7808
-:1002300001012378020027780200092002006920CA
-:10024000404F1B680300236807002768FA002B68EB
-:1002500008002F682800376800003B6806003368F4
-:1002600008003F680000098140005E11D3680A0061
-:10027000C368C04F7920004F1478E4D0C000441107
-:10028000ECD0C0004811D768297378004A11D768AC
-:100290000D7378004A11D7682D73C768C054CB68B6
-:1002A000C053CF68C094AB684497AF684997B368B0
-:1002B0004497B7684497A76801006920804F780089
-:1002C0001E11D3680A00C368C0511478E4D0C0007E
-:1002D0006A11D768397478006C11D7681974C768C7
-:1002E000C074CB684054CF68D095AB684997AF686D
-:1002F0004E97B3684997B7684997A7680100107887
-:10030000ECD0C000C2111478E4D0C000B4117E0E4D
-:100310006920C05371200002EC70E4D0C000951138
-:1003200019200C0C21200C007810502078009B1113
-:1003300019200A0C21200A0078105020692040540E
-:1003400071200001EC70E4D0C000AB1119200C0C3E
-:1003500021200C00781050207800B11119200A0CCF
-:1003600021200A00781050207F0E7800DB11192020
-:100370000C0C21200C006920C053781050206920FB
-:100380004054781050207800DB116920C0537E0E55
-:1003900071200001EC70E4D0C000D41119200C0CC5
-:1003A00021200C00781050207F0E7800DB111920DE
-:1003B0000A0C21200A00781050207F0E1120020024
-:1003C0006920C05409200200A920000137680000FC
-:1003D0000B684000C87B86A3FFFEC000F2111768BF
-:1003E00000011F6864007800F611176864001F6838
-:1003F0000200E8AD1000F000E3110981C000E11136
-:100400001182400004126920C0747800DF11781056
-:10041000A2267810124778101B1E7810424D9120AA
-:1004200000217920004F1078ECD040001812712084
-:10043000200078001A1271205000912000227920AB
-:10044000004F71202000912000237920004F107868
-:10045000ECD040002C127920000178002E12792077
-:1004600000027120404F912000247920000171206A
-:10047000804F912000207920004F71201000003221
-:1004800085A03D30902071201000C37000009000C6
-:100490004D12C07086A00200C0004D127810C11528
-:1004A000392000001078ECD0C000CF1278108E14E4
-:1004B000AC7805A0C0006B12680061126C7865A072
-:1004C000400061127810DC237810E8206800781270
-:1004D0006C7865A040006B127810DC2368007812FD
-:1004E0000920474F1120874F04210C2205A140000D
-:1004F00078127810511F7120404FA47005A0400061
-:100500009D12507485A4000040009D1279200002C5
-:1005100091200080D4728CA23D3090217810B12BB4
-:100520009120008091203D3068009D127920004F7D
-:100530006C7865A040009D12712010007810DC23BB
-:10054000E000A5127920004F712010007810164BA2
-:100550007120804FA47005A04000BD12507025A0EE
-:100560004000BD127920000191200080D4728CA23D
-:100570003D3090217810B12B9120008091203D30AA
-:100580007920004F712010006800C9126C7865A0B6
-:100590004000C9127810DC23E00053127810164B8B
-:1005A0007800531278108E14AC7805A0C000E712C2
-:1005B0006800DD126C7865A04000DD127810DC2345
-:1005C0007810E8206800F1126C7865A04000E7120E
-:1005D0007810DC236800F1120920474F042105A0A0
-:1005E0004000F1127810511F7120404FA47005A0F7
-:1005F00040000C13507485A4000040000C137920B7
-:10060000000191200080D4728CA23D30902178109E
-:10061000B12B9120008091203D307920004F712036
-:100620001000680016136C7865A04000161378104F
-:10063000DC23E000CF127810164B7800CF123C1369
-:100640003C133E133E134B134B134B134B135613D8
-:100650005613631363134B134B134B134B133C137E
-:100660003C133E133E134B134B134B134B135613B8
-:100670005613631363134B134B134B134B13780035
-:100680003C137E007E107E12912000247810D12928
-:100690007F127F107F00912001807C007E007E1001
-:1006A0007E127810C8137F127F107F009120018086
-:1006B0007C007E007E107E12912000237810D129CC
-:1006C0007F127F107F00912001807C007E007E10D1
-:1006D0007E12912000237810D129912000247810D7
-:1006E000D1297F127F107F00912001807C0094131C
-:1006F000941396139613A313A313A313A313AE1368
-:10070000AE1396139613A313A313A313A313AF133C
-:10071000AF13AF13AF13AF13AF13AF13AF13AF13C9
-:10072000AF13AF13AF13AF13AF13AF13AF13780003
-:1007300094137E007E107E12912000237810D12920
-:100740007F127F107F00912001807C007E007E1050
-:100750007E127810D5137F127F107F0091200180C8
-:100760007C007C007E107E127E0D7E0E7E0F7E0051
-:10077000712000016920404F7920004FEC7084A067
-:10078000001CE2787810B04D7F007F0F7F0E7F0D48
-:100790007F127F107C00003C84A007007900CD13FD
-:1007A000DE13DE13E013E013E513E513EA13EA1397
-:1007B000003C84A003007900DA13DE13DE13F31388
-:1007C000F3137810B229912000227810EC477C00B6
-:1007D000912000217810EC477C00912000217810B6
-:1007E000EC47912000227810EC477C0091200021FA
-:1007F0007810EC477C00181418141A141A142714D3
-:10080000271427142714321432143F143F142714CA
-:100810002714271427145014501450145014501433
-:1008200050145014501450145014501450145014A8
-:10083000501450145014780018147E007E107E124C
-:10084000912000247810D1297F127F107F00912001
-:1008500001807C007E007E107E127810C8137F120B
-:100860007F107F00912001807C007E007E107E1230
-:10087000912000237810D1297F127F107F009120D2
-:1008800001807C007E007E107E1291200023781073
-:10089000D129912000247810D1297F127F107F0068
-:1008A000912001807C007E007E107E127E0D7E0EE7
-:1008B0007E0F7920004F712000026920404F003DDB
-:1008C0008CD040006614EC7084A0001CE278781094
-:1008D000B04D003D84D0400074146920804F7120D9
-:1008E0000001EC7084A0001CE6787810B04D7F0FFA
-:1008F0007F0E7F0D7F127F107F007C0008700B80C1
-:10090000C8008914077002008CA0E001C0008A149E
-:100910009CD0400089147A087A09C370024078009C
-:10092000C41568001A1561200000186084D0C0004A
-:100930001A15287805A0C0009E1410001B15780019
-:100940001A151079F4D14000A4147800B914147960
-:10095000ECD14000BD14FCD04000B3147E007810F0
-:10096000AE1D7F004000BD147800B9147E007810E1
-:10097000A11D7F004000BD14012007407800C31571
-:100980001079FCD0C000C7146120404F9CC1FCC747
-:100990007800CB146120804F9DC1FDC7646005A025
-:1009A000C0001A15127982602878FCC086A0180051
-:1009B000C000DB147E0C7810851B7F0C2B780000A8
-:1009C0007C6065A0400000157E0C9C607810901E35
-:1009D0007F0C9F6000007810D51C092018008760EC
-:1009E000030110787E00FF84C000F614FF854000EC
-:1009F000F814C5C012787810BB1D7F001278C000B3
-:100A0000141578100D1E10789CD0C00008156120B8
-:100A1000404F78000C156120804F9CC012787F6099
-:100A20000000D460DCD040001815DCC0D660012086
-:100A300005407800C3157800C1157C001078F4D00B
-:100A400040002315012007407800C31506A0C2709E
-:100A5000C670CA70CE70DA70C0703DA08AA0400027
-:100A6000C80031157900381500218AA04000C8005F
-:100A7000CF1579007815C1151716E0154F16871692
-:100A80008716D715ED1C9216CF15E415E615E81557
-:100A9000EA15F21CCF15A016FD16A51BE71CEC15D8
-:100AA000EA192C1A671AB81AA519B219C619D91950
-:100AB000EB17CF15341741174D1759176F177B17C1
-:100AC0007E178A1796179E17D317DF17CF15CF15E6
-:100AD000CF15CF15F8170A1826185C188418941823
-:100AE0009718C818F9180B1974198419CF15CF1550
-:100AF000CF15CF159419CF15CF15CF15CF15CF150D
-:100B0000171D1D1DCF15CF15CF15211D661DCF1526
-:100B1000CF15CF15CF15111681169A16F7169F1BF4
-:100B2000CF15CF15681BCF156A1D091D131DCF15D5
-:100B3000CF15CF15CF15CF15CF15CF15CF15CF1595
-:100B4000CF15CF15CF15CF15CF15CF15CF15CF1585
-:100B5000CF15CF15CF15CF15CF15CF15CF15CF1575
-:100B6000CF15CF15CF15CF15CF15CF15CF15CF1565
-:100B7000CF15CF15CF15CA72C67101200640780077
-:100B8000C315CE73CA72C67101200040C2706800DE
-:100B9000C415612000001B600100912000509120CD
-:100BA00080407C00C37001407800C415C3700640CB
-:100BB0007800C41599204100A1204100A92005001A
-:100BC000A3537800C115C470C37004007A00780084
-:100BD000C1157800C1157800C1157800C1159120A4
-:100BE0000080C3700400C7705349CB702050CF7091
-:100BF0002020D370080001200F00D670792000005B
-:100C00001B780100312030005920001029201A04DF
-:100C10005120450461204704C1202000912000504C
-:100C20009120804078001804D875DC74DA75DE7481
-:100C300078001A16292000002025D071C872CC73C4
-:100C4000C470A020992030000370010007700600D6
-:100C50001A731E722274267521204000FF81400005
-:100C6000C11582A14000C8003416202106A008202A
-:100C70000384127007700400077001000870FCD034
-:100C800040003B160770020084A0E00140004916B6
-:100C9000C37002407800C415A824A55378002B1611
-:100CA0007800C115292000002025D071C872CC73AE
-:100CB000C4709820A1203000037000000770060067
-:100CC0001A731E72227426752120400007700600D8
-:100CD000FF814000C11582A14000C8006E1620218E
-:100CE00006A0082003841270A824A65307700100F0
-:100CF0000870FCD04000751684A0E0014000631627
-:100D0000C37002407800C415D875DC74DA75DE74DF
-:100D100078005216C471C87014219EA70400C00048
-:100D20008F160A20CA727800C015C7700800CB70F1
-:100D30000F00CF700B007800C115D875DC76DA751E
-:100D4000DE767800A316292000003025C470C87212
-:100D5000CC73D074C670CA72CE73D27405A0400032
-:100D6000F2160AA44000B316C800BC1601807278BF
-:100D700084A000FC4000C016AC7885C0AE7801208D
-:100D800005407800C3157E7B7A7A867E827D767CEC
-:100D90008CA400FF4000D8160784048004800C81D6
-:100DA0000C810F8118A191A20000B1A6000081A5BD
-:100DB00000007800E21607840480048018A391A242
-:100DC0000000B1A6000081A500001A731E722276F1
-:100DD000267005A64000EC16107AC5C2127AAC78CF
-:100DE00084A0FCFFAE787800F516AC7885C0AE78AC
-:100DF0007800C115D875DC76DA75DE7678000017D4
-:100E0000292000003025C470C872CC73D474C67019
-:100E1000CA72CE73D67405A040002F170AA44000F2
-:100E20001017C80019170180927884A000FC4000B8
-:100E30001D17AC78C5C0AE78012005407800C315F9
-:100E40009A7A9E7BA27DA67E002605A540002817E3
-:100E5000107AC5C2127A967CAC7884A0FFFCAE787A
-:100E600078003217AC78C5C0AE787800C11509207B
-:100E700000006C7865A040003E1708810060780093
-:100E80003717C47A7800BF150920484F0C21107815
-:100E9000ECD0C000C0151120884F14227800BF1577
-:100EA0000920494F0C211078ECD0C000C01511204A
-:100EB000894F14227800BF156120404F28612C62B1
-:100EC0001482148214821078ECD0C0006D17612057
-:100ED000804F2863DA732C631C831C831C83DE73AE
-:100EE0007800BF1509204C4F0C211078ECD0C000C1
-:100EF000C01511208C4F14227800BF151879780086
-:100F0000C01509204D4F0C211078ECD0C000C01541
-:100F100011208D4F14227800BF1509204E4F0C214F
-:100F20001078ECD0C000C01511208E4F142278002C
-:100F3000BF1520791078ECD0C000C015247A780055
-:100F4000BF15C471FCD1C000A6171120C053780092
-:100F5000A81711204054078184A00F00038003804C
-:100F6000038068A2006A04689CD04000B717086B31
-:100F70007800B8170C6BFCD1C000BF1721203B02D2
-:100F80007800C11721203B0124241479E4D14000CA
-:100F9000CD17C4D4C000CC17D5C47800CD17DDC49C
-:100FA000A4A4001CDE74C4717800BE15C477781048
-:100FB0002B1E912000801C6B146A91200180082751
-:100FC0007800BE156120404F18611078ECD0C00049
-:100FD000C0156120804F18627800BF15C477781063
-:100FE0002B1E912000800869186A106BDA77912017
-:100FF00001807800BE15C471102194A20F0082A256
-:101000001000C800B9157810C62784A3004040001E
-:10101000081895A220007800BE15C4710021BCC03C
-:1010200082A01000C800B915BCD1C0001918112049
-:10103000484F042278001D181120884F0422BDC09B
-:101040007E000021BCC01220781023277F01780089
-:10105000C015C4712120494F0424C6701920000016
-:1010600078003518C8712120894F0424CA70FDC347
-:1010700011205418A9200800042206A14000441899
-:101080001082F0003918C471C8727800B81592A2A5
-:1010900054187E0222217F01781044271078ECD06A
-:1010A000C0005218FCD340002F187800C115E80387
-:1010B000FA00F401EE0204000100020003006120C6
-:1010C000404F28612C62148214821482C4702A60FA
-:1010D000C8700380038003802E601078ECD0C000BD
-:1010E00082187E027E016120804F28612C6214826A
-:1010F00014821482D8702A60DC700380038003801D
-:101100002E60DA71DE727F017F027800BF156120E8
-:10111000404F3061C47032601078ECD0C000C01510
-:101120006120804F3062C87032607800BF15187936
-:101130007800C015C47184A1CFFF4000A3181078B7
-:10114000ECD0C000B915C8727800B81511204D4F09
-:10115000042212217E00192000007810AB2710789D
-:10116000ECD04000B3187F017800C015C87184A18D
-:10117000CFFF4000BC181021C4717800B8151120B1
-:101180008D4F042212217E00FDC37810AB277F0211
-:101190007F017800BF15C47182A110004800D418E7
-:1011A0001078ECD0C000B915C8727800B8151120BD
-:1011B0004E4F04227E00122119200000781089274A
-:1011C0001078ECD04000E4187F017800C015C87199
-:1011D00082A110004800ED181021C4717800B815E4
-:1011E00011208E4F04227E001221FDC37810892722
-:1011F0007F027F017800BF15C471C87284A1FDFF12
-:10120000C000B81584A2FDFFC000B81500212079E8
-:1012100022780022247A26787800BF15C471FCD188
-:10122000C00013191120C053780015191120405423
-:10123000078184A00F0003800380038068A2192027
-:101240000000C872BCD2400024199DA31000B4D283
-:10125000400029199DA308009120008000687E00AD
-:1012600026A240004819026AECD440003519A5C3F3
-:10127000E4D4400039199DC3F4D4400048190F81CB
-:10128000F4D24000441978100828780048197810E2
-:10129000E62778004819CC72086806A240006A194F
-:1012A000A4A2FF001478E4D0C0005B1982A4280037
-:1012B000480067194000671978005F1982A443004D
-:1012C00048006719C471C6717F02CA7291200180FB
-:1012D0007800BA150A6A9DA30A00046805A3066887
-:1012E0007F020C6BC471912001807800BE15C47719
-:1012F00078102B1E91200080146A1C6B91200180B5
-:10130000C8701668CC701E6808277800BE15C470B7
-:101310006120404F18611A601078ECD0C000C015F1
-:10132000C8706120804F18621A607800BF15C471C0
-:10133000C872CC7382A11000C800B91578102A2891
-:1013400084A300404000A31995A220007800BE1598
-:10135000C47778102B1E91200080086A8DC20A6A1B
-:101360009120018008277800BF15C47778102B1EC4
-:1013700091200080086A94A2F9FF0A6A046805A017
-:101380004000C11978106F2691200180082778004D
-:10139000BF15C47778102B1E91200080086A95C273
-:1013A0000A6A046805A04000D41978106F269120BD
-:1013B000018008277800BF15C4774120010049202B
-:1013C000050051202000912000807810461E9120B9
-:1013D00001800827086A7800BF15C4771478E4D024
-:1013E000C000FE19FCD74000F8197810AE1D40006F
-:1013F000FE197800C3157810A11D4000FE19780071
-:10140000C315C873CC72C677CA73CE727810CD1E5E
-:10141000C000281A186805A04000221A08277E0775
-:1014200078105A287F07C000221A01201500FCD727
-:10143000C0001B1A6120404F78001E1AFDC06120B9
-:10144000804F2A78912001807C009120018001202A
-:1014500005407800C315912001807800C115C4773C
-:101460001478E4D0C000401AFCD740003A1A781033
-:10147000AE1D4000401A7800C3157810A11D400031
-:10148000401A7800C315C677412021004920050085
-:1014900051202000912000807810461E092016005F
-:1014A000FCD7C000541A6120404F7800571A6120C1
-:1014B000804FFDC1676003007F6000007667836036
-:1014C0000F002A79D461DCC1D66178106F26912093
-:1014D00001807C00C877CA77C477C6771478E4D0D7
-:1014E000C0007E1AFCD74000781A7810AE1D40006C
-:1014F0007E1A7800C3157810A11D40007E1A78006E
-:10150000C315BCA700FF9120008009201700FCD75D
-:10151000C0008B1A6120404F78008E1A6120804FE6
-:10152000FDC17F60000067600200766783600F0086
-:101530002A79D461DCC1D66178106F2691200180B0
-:1015400041202100492005005120100091200080F9
-:10155000C87005A04000AC1AD460FDC0D6607810F9
-:10156000461EC8703668388784A71F00C000AC1AB2
-:10157000912001807C00192000001478E4D0C00084
-:10158000CE1AC87284D24000C81A7810AE1D40002E
-:10159000CE1A7800C3157810A11D4000CE1A78002D
-:1015A000C315C872CA72AC7884A00300C000F91ACF
-:1015B0003920000084D24000DB1AFDC74120210001
-:1015C000492004005120080078102B1E9120008033
-:1015D0000868D4C00DA80A6991200180388784A7C3
-:1015E0001F00C000E11ABCA700FF3F8738873F8774
-:1015F00084A7000FC000E11A91200080C87284D235
-:10160000C0000B1B1078ECD04000071B69200001C4
-:1016100078000D1B6920000278000D1B6920000175
-:10162000086884A0FDFF0A683068B4D040002D1B14
-:101630004B680400A9201400486894D040001F1B88
-:10164000F000191B4B680900A9201400486884D0D9
-:101650004000291BF000231BA920FA00F0002B1BDF
-:101660007920004F09201800C87284D2C000391BAD
-:101670006120404F78003C1B6120804FFDC17F609E
-:1016800000002A796760010083600F00A7600000F6
-:10169000A860B260B660D460B4D04000581BB4C03B
-:1016A000D6607E0CB86065A00860D4C00A6018607F
-:1016B00001801A607F0CD46084A0FF77D660AC787C
-:1016C0008DC0AE78FF834000631B7C001B68470021
-:1016D000912001807C00CC737810BA1AEC69486ABA
-:1016E00085A100184A6885A14000EE68CC732120CE
-:1016F0000400A920FF09F000781B2184C000761B9C
-:101700001983C000741BEE694A6A912001807C0035
-:10171000FCD7C0008C1B6920404F78008E1B6920CD
-:10172000804FC471C6711669FF81C000961BA768FF
-:101730000100AC788CC0AE7884D0C0009E1B7810BD
-:101740002D1F7C00D875DC74DA75DE747800A71B59
-:101750002EA02025C471C873CC72C671CA73CE7214
-:101760007920004FDE7DDA7CD67BD27A7810041E99
-:101770004000D11CA9200500A120144F9120008019
-:10178000A1419120018009204000781018204000DC
-:10179000CA1B78100D1E7800D11C04608CA0FF00BD
-:1017A0008EA10900C000D51B7E007810BF237F00EA
-:1017B00084A000FF078009804000611C7E0C682C1B
-:1017C0007810041E40001B1C002C9E680981C0007C
-:1017D000DC1B9F6000007F0C7E0CDC7DD87CD47B02
-:1017E000D07A90A2400099A30000A1A40000A9A56E
-:1017F0000000DE7DDA7CD67BD27A682C9C6865A0FE
-:101800004000601C0920400078101820C0003E1CD9
-:10181000046084A0FF0086A00200C0001B1C0460BE
-:1018200084A0FF0086A00A00C000171C7E0178106B
-:10183000BB237F01002D02607800EA1B7F0C7E0C29
-:101840009C607810901E7F0C9F6000007810D51C63
-:10185000092018000860CDC00A6004608660107816
-:101860007E00FF84C000341CFF854000361CC5C0CC
-:1018700012787810BB1D7F00127878100D1E78004A
-:10188000D11C7F0C7E0C9C607810901E7F0C9F609A
-:1018900000007810D51C09201800876003011B6028
-:1018A000030010787E00FF84C000561CFF854000B6
-:1018B000581CC5C012787810BB1D7F0012787810B4
-:1018C0000D1E7800D11C7F0C1478E4D0C0008F1C52
-:1018D0001461FCD140006F1C7810AE1D40008F1CBD
-:1018E0007800731C7810A11D40008F1C7810D51C47
-:1018F00009201800876003011B60210010787E001A
-:10190000FF84C000831CFF854000851CC5C0127881
-:101910007810BB1D7F00127878100D1E0120074043
-:101920007800C315C474C873CC7214609120008011
-:101930007E0E09201200FCD0C0009F1C7120404F79
-:101940007800A21C7120804FFDC12A7967700500C4
-:10195000D471DCC1D6716A736E72727476707B70EA
-:101960000000002C7E702EA030251C6184A1600038
-:101970004000B91C7810B6467F0E9665A6659A663B
-:10198000AA66AF600000B360000014672360000027
-:10199000246096A00100C000CC1C00802660781056
-:1019A0006F26912001807C00C37005407800C4152B
-:1019B000A92005009920144F912000800A539120FE
-:1019C0000180002110A299A30000A1A40000A9A5F4
-:1019D00000007C00C471C77000001E797800C1153A
-:1019E000C471C67168217800F41C692000100C696C
-:1019F00016A0042D10A2688D0981C000F61C85A2D6
-:101A00000000C000041DC37000407800061DC370B4
-:101A10000340CA707800C4156479C671C47182A18C
-:101A20000300C800B91566797800C1156479C671DC
-:101A30007800C1150079C671C47102797800C115AA
-:101A40000079C6717800C115C470112000008CA007
-:101A50000D004000361D0C814800321D10820C81A3
-:101A60000C814800321D10820C81FF81C000BA1524
-:101A700010820E7A8CD24000621D1079CDC112798D
-:101A8000092021001920030084D240005C1D088138
-:101A90001920410011204E97122319204200108274
-:101AA00012231920430010821223192046001082AD
-:101AB000122319204700108212231920060011203A
-:101AC0005397122111207397122304790678780016
-:101AD000C0150478C6707800C115C471FCD1C0006F
-:101AE000721D1120C0537800741D112040540781CD
-:101AF00084A00F0003800380038068A2146AB4D21C
-:101B00004000831D112001007800851D1120000078
-:101B10000C6B0068DA707800BE151478F4D04000C1
-:101B2000951D01200740DB70000005A07800A01D76
-:101B3000FCD040009F1D01200740DB70010005A084
-:101B40007800A01D06A07C001478F4D04000AC1DE5
-:101B500001200740DB70000005A07800AD1D06A045
-:101B60007C001478FCD04000B91D01200740DB70D8
-:101B7000010005A07800BA1D06A07C0012711A723F
-:101B80001E731078C4D04000C41D2274267580AC2A
-:101B9000010008810C81A9819880A1203000037088
-:101BA00000008460A220A65307700100747984A10C
-:101BB00000FF4000E11D0F810C810C810480048036
-:101BC000078000A17800E41D0781048004807C79EF
-:101BD00008A1787A06A011A2107DC4D54000F11D9D
-:101BE000847B19A3807C21A40870FCD04000F11DE7
-:101BF00003700100077006001A711E72107DC4D5B3
-:101C00004000011E2273267484A0E0017C00487805
-:101C100065A040000C1E042C4A78632000007C0064
-:101C20007E0F7920004F48786220002C05A0C0006C
-:101C3000181E7810B2294A787F0F7C001120009975
-:101C40004A7AC47B19834000281E80A232001220E9
-:101C5000102078001F1E132000007C007E017E02F1
-:101C6000FCD7C000341E1120C0547800361E11204D
-:101C7000C07484A7000F0B8084A71F004000411E82
-:101C8000038003800380038005A168A27F027F0197
-:101C90007C0078102B1E00292A68002A2E6808680C
-:101CA00084A0EFF90DA80A697E0EFCD7C0005B1E68
-:101CB0000920534F7120404F78005F1E0920934F39
-:101CC0007120804F0C21046805A040006F1E16A1F2
-:101CD000C0006F1E6020006006687E010B200000BF
-:101CE0007800721E092000007E01046865A0400093
-:101CF000871E006006687810A21E781064201068A5
-:101D0000087909810A7901801268C000721E107971
-:101D1000A5C112797F0102690669002D6020781043
-:101D2000132B7F0E7C0065A04000A11E08209C6044
-:101D300005A040009E1E62209F60000065A0780004
-:101D4000941E48784A7962207C00076003018F6006
-:101D50000000A9201C0080AC0500A020012000008C
-:101D6000A44028681A602C6822607C007E0EFCD794
-:101D7000C000BD1E7120404F3120C04F7800C11EF1
-:101D80007120804F3120C05150708CA00002C000E3
-:101D9000CB1E08A60A2D0080527006A07F0E7C0084
-:101DA0007E0FFCD7C000D51E7920404F7800D71E8B
-:101DB0007920804F78102B1E9120008004680A78CB
-:101DC00065A040002B1F7800E91E002C0A786020D7
-:101DD000006065A040002B1F106006A3C000E21E3B
-:101DE0000C6006A2C000E21E282C4C7806ACC00095
-:101DF000F81E7800281F046806ACC000061F0060AB
-:101E00006020066805A0C000061F03680000780077
-:101E1000101F006408786020026486A40000C000DF
-:101E2000101F002C026860257F0F7810A21E7E0F05
-:101E30001B600500236020007F0F781064207E0F58
-:101E4000087909810A79106801801268C000281F8A
-:101E50001078A5C012780120FFFF05A07F0F7C003D
-:101E60007E07002739200000FCD04000351FFDC749
-:101E700041202100492004005120080091200080C9
-:101E80007810461E388784A71F00C0003D1FBCA7DE
-:101E900000FF3F8738873F8784A7000FC0003D1FA2
-:101EA000912001807F077C006C78092074970C21B9
-:101EB0000DA140005B1F65A07800DC2361200000BD
-:101EC000186084D0C0007B1F10788CD040006C1F3D
-:101ED0008CC01278FCC76920404F7800711F8DC0FC
-:101EE00012786920804FFDC7912000801C681F6810
-:101EF00000009120018005A0C0007C1F7C008CA008
-:101F0000F0FF4000821F7810B2297900841F941FCF
-:101F1000971F9D1FA11F951FA51F951F951F951FFB
-:101F2000AB1FDC1FE01FE61FFB1F951F951F7C00EA
-:101F30007810B22978102D1F012001807800072029
-:101F4000012003807800072001200480780007200A
-:101F500078102D1F01200680780007209120008036
-:101F60007E07FCD7C000B71F6920404F3920090009
-:101F70007800BB1F6920804F39200900006886A0C7
-:101F800000004000C51F7F001E6F912001807C0073
-:101F900074687F07BCA000FF412021004920040095
-:101FA000512010007810461E388784A71F00C000FB
-:101FB000CF1F9120018001200A8078000720012096
-:101FC0000C807800072078102D1F01200D807800EC
-:101FD00007201478E4D0C000F91FECD04000F31FB4
-:101FE000FCD74000F31FE4787800F41FE078C67057
-:101FF00001200E80780007207800951FFCD7400054
-:102000000120EC7878000220E878C67001200F806B
-:1020100078000720C270FCD7C0000F20DB700000E2
-:1020200078001120DB700100612000001B600100BE
-:10203000912080407C0080AC0100FF814000432063
-:1020400099203000A0200C7084A0FF0340002520C0
-:1020500018707E001C707E0020707E0024707E0050
-:102060001271AC811A721E732274267503700100FE
-:102070000770010008700B80C8003720077002004D
-:102080008CA0E001C0004320A55306A0037000000F
-:10209000077004007F0026707F0022707F001E7092
-:1020A0007F001A707C0011202000092010000A6BAC
-:1020B0000E6C036800FD076818001A6A002DE8A07E
-:1020C000080090A204000981C00054207C00046034
-:1020D0008660082C63200000687805A06A794000BB
-:1020E0007120022C780072206E797C007E0C6120B9
-:1020F000004F87680301082D6B200000686005A071
-:102100006A6140008320022D780084206E617F0C7C
-:102110007C0091200080042C6E7805A0C0008E20E9
-:102120006A78912001809C6005A04000A7207E0C69
-:10213000602008209C6005A04000A32062209F60D2
-:10214000000065A09C6005A0C0009B2048784A79EB
-:1021500062207F0C487862209F60000085AC000000
-:10216000C000B1207810B2294A787C00A920100064
-:1021700006A0048086808E81C800BC2000A2F000EA
-:10218000B72086808E817C007E15A920100005A0D6
-:102190004000E2201AA1C800E22013828D8148008D
-:1021A000D5201AA1C800D620F000CA207800DA2075
-:1021B0001AA108231082F000CA207E00003284A0F9
-:1021C000FFF780207F007F157C007E00003285A015
-:1021D00000087800DE20747DD07006A54000CE2176
-:1021E0001078502000788CD040000A21ECDA4000B2
-:1021F0000A217E0E9120008071202000047005A02D
-:10220000C000072108707F0E86A0080040000A2148
-:102210007800CE217F0E7800CE217810041E400079
-:10222000CE2146A070790025008012A1092040002F
-:10223000C800192178002021D07206A24000202178
-:102240004088092080007E0C1271077001009920DF
-:102250003000A920200080AC0100A02061200000F7
-:10226000FF88400032217810041E0870FCD0400026
-:10227000322107700200912001808CA0E001C00093
-:102280006921A553FF8CC0004721FF884000B82179
-:1022900078005121002C8E78A920200080AC01000C
-:1022A000A020A5537800B82146A018721C73C4DA88
-:1022B000400059212074247592A240009BA3000085
-:1022C000A3A40000ABA500001A721E73C4DA40007C
-:1022D00069212274267506A0077004004000B82109
-:1022E000FF8C4000722178100D1E7F0C78100D1E9F
-:1022F00046A0887800808A7886A002004000982155
-:102300007C7A787BC4DA40008421847C807D747977
-:1023100007810480048010A299A30000A1A40000FA
-:10232000A9A500001A721E73C4DA4000CE212274DF
-:1023300026757800CE211460FCD0C000A021692051
-:10234000404F7800A2216920804F912000801F68B3
-:102350000200FF884000AE2146A08C786020780003
-:1023600098218B780000AC7885A00300AE7891208E
-:1023700001807800CE217F0C8B78000078108D23AF
-:10238000046084A00F007810CF21FF884000CC218A
-:102390008C786020046084A00F007810CF21780032
-:1023A000E8207C007900D121E121FF211D22E121DB
-:1023B0002E22F221E121E121E121FD211B22E12157
-:1023C000E121E121E121E12139200004BC7805A7C8
-:1023D000BE78086005A70A60781071229C60BA7800
-:1023E0009F600000781077237C00BC78C4D0400048
-:1023F000F8217800E1211C60BDC01E607800052234
-:102400007810BF23BC78C4D0400005227800E121B9
-:10241000BF7800000460078084A0FF00B2780180CC
-:10242000400018227810712240001822BC78C5C0E4
-:10243000BE7878001A22780090227C007810BB23A6
-:10244000BC788CA0000EC0002522C4D0C00027227A
-:102450007800E12178107122C0002D2278009022AE
-:102460007C00BC78C4D0400034227800E121BF78E1
-:102470000000146711200100A822186084A0FF004A
-:1024800005A040005422BCA700FFA92020008EA078
-:10249000010040005422BCA7008011200200A920A6
-:1024A00000018EA002004000542278006E227810B5
-:1024B0002B1E002D912000802B6800002F6800004B
-:1024C000086884A0DEFF0A68E8AD10009120018052
-:1024D000F0005722118240006E22A92000017800EE
-:1024E000572278100D1E7C009F600000B4786DA00C
-:1024F000002CB678C0007C22BA78780084229E68CE
-:10250000002D0260B87806ADC00084220260B07869
-:102510000180B278C0008F22BC78C4C0BE78B87881
-:10252000602006A07C007E0E2EA03025BA7DB67DF0
-:10253000AE65B2651C60A260482084A9FFE11E6000
-:1025400084A960004000A3227810B6469665A6656F
-:102550009A66AA6614677120804FFCD7C000AF222C
-:102560007120404F84A7000F0B8084A71F004000FC
-:10257000BA22038003800380038005A1C47168A18F
-:102580000027078084A00F00038003800380C871A8
-:1025900000A1C260912000801478C4D04000DF22E6
-:1025A000ECD04000DB22FCD7C000D822F4D0C00021
-:1025B000E6227800DF22FCD0C000E6221078F4D0BA
-:1025C000C000E622086E84D640001023FCD9C0006B
-:1025D0001023912001807810A21E91200080781095
-:1025E0006420912001801478E4D0C0007523147811
-:1025F000C4D040007523ECD040000823FCD7C000B5
-:102600000323F4D0C0000C2378007523FCD0C00055
-:102610000C23780075231078F4D0400075231B60DC
-:10262000210078007523246096A00100C0001723C4
-:1026300000802660106A146802A248002A23400025
-:102640002A2391200180392000029C60BA789F6083
-:1026500000007810772378007523082CFCD94000FF
-:102660005223006865A040005223046A007084A0D1
-:102670000200400048234C7006A2C0004823046BAF
-:1026800060210423026005A0C00044230269602287
-:10269000026178005E23002D60207810132B086EF5
-:1026A00060210262066978005E230068026965A005
-:1026B00040005A23026178005B23066960210360B1
-:1026C00000006021FCD940006523B4A6FCFF0A6E1F
-:1026D0001068087D28850A7D00801268912001809D
-:1026E000B4D640007523B6A640000A6E7810B31E1B
-:1026F0007F0E7C00086005A70A609120008078109A
-:10270000642091200180B87865A040008A239C60F5
-:10271000BA789F60000078007723B678BA787C009A
-:1027200070797478182884D340009723008012A110
-:1027300048009C23008012A1C800AC2384C37C7A8B
-:102740001A72787A1E72C4DA4000A723847A227241
-:10275000807A267206A084D34000AC23008076786D
-:10276000D2701C7805A04000BA2301801E78C000FA
-:10277000BA236800BA23912080407C003920D323FB
-:102780007800C1233920D923042705A04000D22393
-:1027900000AC68200869106812690A680C6914683E
-:1027A00016690E6838877800C1237C000300090091
-:1027B0000F0015001B00000015001B000000412049
-:1027C00000000C787900E123B3258625E5235E24FB
-:1027D000392074973427107D78000524846086A002
-:1027E0000301C00047241461186005A14000FA23CA
-:1027F000FF86C000162478004724038680A05597E2
-:102800000C6202220080106202227810862030863C
-:102810008EA60F004000D2246C7865A0C000EB2388
-:10282000087802A6C8001624ACD5C00016243A26A3
-:102830007C0082A60300C800D22491200080692079
-:102840000000186884D0C00042241120559704224B
-:10285000C67010820422CA7084D6C000322410824E
-:102860000422DA7010820422DE7085A62080C270F5
-:102870001B68010091208040107884A0CFFF12785F
-:10288000912001803B2000007C001078ADC01278C0
-:102890007800D2243A267810BD25C000E0256C7857
-:1028A00065A0C000EB2391200080107884A0CFFFAA
-:1028B000FF8640005924ADC0127891200180780035
-:1028C000E025392074973427107D78007A248460BD
-:1028D00086A00301C000BB241461186005A140005C
-:1028E0007324FF86C0008B247800BB2480A65597F4
-:1028F0000C6202227810862030868EA61E004000D0
-:10290000D2246C7865A0C0006424087802A6C800B0
-:102910008B24ACD5C0008B243A267C0082A606000E
-:10292000C800D2249120008069200000186884D05B
-:10293000C000B6241120559709204E97A8261C21C7
-:1029400004221A2008811082F0009C2485A6308081
-:10295000C2701B68010091208040107884A0CFFFD6
-:1029600012789120018006A0092075970A203A204C
-:102970007C001078ADC012787800D2243A26781006
-:10298000BD25C000E0256C7865A0C00064249120BE
-:102990000080107884A0CFFFFF864000CD24ADC01A
-:1029A0001278912001807800E02591200080077046
-:1029B00004009479D47002A14800E3244000ED247F
-:1029C000907B02A3C000ED247800E6240280C000C2
-:1029D000ED243A261078ADC01278912001807C0059
-:1029E00084A100FF4000FA240F810C810C81048037
-:1029F0000480078000A17800FD2407810480048002
-:102A00009C7A10A21A72987A06A011A21E72C4D4DF
-:102A100040000D25A47A11A22272A07A11A226727A
-:102A2000A120300003700000092054970A26098174
-:102A30009821042184D040001B253386B0A60200D3
-:102A4000A826A65303861270077001009079947827
-:102A500000800AA1C8002A2506A02820747984A134
-:102A600000FF400039250F810C810C810480048017
-:102A7000078000A178003C250781048004807C79D0
-:102A800008A1787A06A011A2C4D440004825847B0E
-:102A900019A3807C21A40870FCD04000482584A0A4
-:102AA000E00140006D25107D312054973426A87830
-:102AB0000080AA788CD0C0006225077006000470E0
-:102AC00094D0C0005C257800D4246920474F6B2047
-:102AD0000300AC7885A00003AE7806A078007625C8
-:102AE0003020D67591208040967D107DACA5CFFF1B
-:102AF000127D91200180AA78077006003A260370A3
-:102B000001001A711E72C4D54000852522732674F7
-:102B10007C00846086A00301C000A92514611860B0
-:102B200005A1C000A92569200000186884D0C00054
-:102B3000A9250C60C6701060CA70C37020801B6825
-:102B4000010091208040781086206800A8256C78CC
-:102B500065A0C00086257C007810BD25C000E0255A
-:102B60006C7865A0C00086257800E0257810BD252A
-:102B7000C000E0256C7865A0C000B3257800E02592
-:102B8000846086A00301C000D1251860FCC01A60D3
-:102B900086A00400C000D1250478A4D04000D1252F
-:102BA0007810862006A07C007810E625C000D82585
-:102BB00085A001007C007810F525C000DE254120AD
-:102BC0000100107D7C00FF884000E52591208040B9
-:102BD0007C00907B9479D47002A1C000EF2585A37E
-:102BE00000007C004800F32502A37C0002807C00EA
-:102BF0001078ECD040000D267E0E912000807120D0
-:102C00002000047005A0C0000A2608707F0E86A070
-:102C1000080040000D2678005E267F0E78005E26B4
-:102C200084A100FF40001A260F810C810C810480D2
-:102C30000480078000A178001D260781048004809D
-:102C40009C7A987BA47CA07D10A206A019A321A445
-:102C500029A509201800286005A040002E2609207B
-:102C600040007810BB1D40005026A8780080AA784C
-:102C70008CD0C0005E261460FCD0C00040266920C5
-:102C8000404F780042266920804F912000801F68C5
-:102C90000300AB780000AC7885A00003AE789120EB
-:102CA000018078005E26AB7800007810862090794D
-:102CB000947800800AA1C8005B2606A09678D6709A
-:102CC00006A071201000912001807C00FCD7C0007C
-:102CD0006A260920594F78006C260920994F9120C7
-:102CE00000800A207E0FFCD7C00083260920404FB9
-:102CF0000120044F0420ECD040007F267920000101
-:102D00007800872679200002780087260920804FE6
-:102D100079200001042186A00000C000A026FCD775
-:102D2000C00093260920454F780095260920854F3D
-:102D3000042105A0C000A026307884A0C000C000F7
-:102D4000A0261B7845007F0F7C0009200200692027
-:102D5000004F1068ECD0C0000F277120804F792001
-:102D600000012120BF514B780F001920A74484D1C6
-:102D70004000C3261068ECD04000BF26A1202B01E4
-:102D80007800C526A1202B027800C526A1202B01A2
-:102D9000042305A04000D2269A781883AC23188318
-:102DA0009823A65318337800C5269B782000A920C5
-:102DB00010001468E4D04000E226AF780000AF783D
-:102DC0002090F000DA267800E826AF780000AF788F
-:102DD0002080F000E226037000007E018CD10920E3
-:102DE00000004000F126BDC17810E2287F0120706C
-:102DF00084A00F007E001468E4D07F00C00001278B
-:102E000085A040637800032785A0C06206780F780C
-:102E100000924378D800537880000B7808005674ED
-:102E2000537000000981400022277120404F106834
-:102E3000ECD040001C277920000178001E27792063
-:102E400000022120BF4F7800B0267C007E01BCD15B
-:102E5000C00037277E000120044F0420ECD07F0003
-:102E60004000332711200101780039271120010289
-:102E700078003927112001018CA10F00042284A0C1
-:102E8000F0FF05A112207F017810E2287C00FCD31E
-:102E9000C00057277E000120044F0420ECD07F00A3
-:102EA0004000532711200101780059271120010209
-:102EB0007800592711200101A92009000B81F00099
-:102EC0005B278CA1000E042284A0FFF105A1122033
-:102ED0007C00192002000120044F0420ECD04000A7
-:102EE0007327198309200101780075270920010142
-:102EF000A92005001382F000772794A2E0000421A6
-:102F000084A01FFF05A20A201983400088270920FA
-:102F10000102780075277C00FCD3C0009C277E004E
-:102F20000120044F0420ECD07F004000982711209E
-:102F3000010178009E271120010278009E271120B0
-:102F40000101A9200C000B81F000A0278CA100F04A
-:102F5000042284A0FF0F05A112207C00FCD3C00036
-:102F6000BE277E000120044F0420ECD07F004000EB
-:102F7000BA27112002017800C02711200202780030
-:102F8000C02711200201042284A0CFFF05A1122036
-:102F90007C007E0CBCD1C000DA277E000120044FEB
-:102FA0000420ECD07F004000D6276120000178008B
-:102FB000DC27612000027800DC2761200001BCC111
-:102FC0000381038080A020009A60AC62AC637F0C18
-:102FD0007C007E0CBCD1C000FA277E000120044F8B
-:102FE0000420ECD07F004000F6276120000178002B
-:102FF000FC27612000027800FC2761200001BCC191
-:103000000381038080A022009A60A46084A0DFFF77
-:10301000AE607F0C7C007E0CBCD1C0001C287E0002
-:103020000120044F0420ECD07F00400018286120CC
-:10303000000178001E286120000278001E2861200F
-:103040000001BCC10381038080A022009A60A460BB
-:1030500085A02000AE607F0C7C007E0CBCD1C0003F
-:103060003E287E000120044F0420ECD07F00400069
-:103070003A28612000017800402861200002780091
-:10308000402861200001BCC10381038080A0200092
-:103090009A60A4608CA2200040004E28ACC29DA380
-:1030A0000040FCC3B4D3C0005328FDC3AE6210205F
-:1030B000A460AE6318207F0C7C00912000807E0C01
-:1030C0007E0E186805A04000C028FCD14000692889
-:1030D0006120D09678006B286120C0957810C828B0
-:1030E0004000A228A9200101FCD1400078286120DD
-:1030F000D09578007A286120C0947E0C7810C8287A
-:10310000400085287F0C608CF0007A287800C02869
-:103110007F00FCD140008F2882A0D0957120804F85
-:103120007800932882A0C0947120404F7A70767105
-:10313000382101200400667083700F00D471DCC157
-:10314000D671781063267800BC28FCD1C000A9286D
-:103150007120404F7800AB287120804F2060DDC087
-:10316000226076713821002C7E7001200600667086
-:1031700083700F00D471DCC1D671781063260120F2
-:1031800000007800C228012001009120018005A0E4
-:103190007F0E7F0C7C00042C05A04000DF286020FF
-:1031A000106006A3C000DC280C6006A2C000DC286A
-:1031B000146006A1C000DC2806A07800E1280060A9
-:1031C0007800C92885A001007C007E0F7E0E7E015C
-:1031D000BCD1C000FA287920404F7E000120044F66
-:1031E0000420ECD07F004000F62871200001780018
-:1031F000FE28712000027800FE287920804F71207F
-:10320000000120798CA10F00EC70C4D0C000082907
-:103210007F01780023290B810B810B810B817F00BB
-:10322000BCD0C00020297E000120044F0420ECD037
-:103230007F0040001C298DA1000F780022298DA15C
-:10324000000F780022298DA1000804217F0E7F0F36
-:103250007C007E0E0120014F0420ACD0C000A329C9
-:10326000E468ACD04000A32984A00600C000A329D4
-:103270001460FCD0C0003D297120C05378003F2964
-:1032800071204054078084A00F00038003800380D6
-:1032900070AE047084A00A00C000A329087194A134
-:1032A00000FF4000A3298CA1FF0001200A0006A115
-:1032B0004000722901200C0006A14000762901205F
-:1032C000120006A140007A290120140006A1400046
-:1032D0007E290120190006A1400082290120320028
-:1032E00006A14000862978008A2909200C00780070
-:1032F0008C290920120078008C29092014007800FC
-:103300008C290920190078008C29092020007800D8
-:103310008C2909203F0078008C2911200000002111
-:1033200005A20A707120004F0470BCD04000A32990
-:103330001460FCD0C0009E29EA707120404F7800D4
-:10334000A129EE707120804F1F700D007F0E7C0050
-:103350000120054F0420E4D0C000B129047884A0E6
-:103360001FFF85A0406306787C006800B229912089
-:103370000080712000007E00187084D0C000B92940
-:103380007F0071201000CA707F00C670C370028079
-:10339000DB700F08DF700B00712000001B70010054
-:1033A000912080407800CF293C7F587E307C387D4A
-:1033B000A0788E70927596749A769E7794A53F0049
-:1033C000F4D44000E62984A77D00C0001D44781095
-:1033D000B2299CA40F0082A304005000F129A6A3E7
-:1033E0000700C000B2291824078584A00F007900C7
-:1033F000F629713062318D31FF33E8376238173981
-:10340000A839963A853B092A062A422E652FB937F4
-:10341000062A7810B2297C0006A07800132A0878C2
-:103420008DC00A7806A002704E704670D27060702F
-:1034300005A0C000792B647084A0070079001D2AC4
-:10344000252A982AA12AAC2AB72A5F2BC22A982AB1
-:103450003078BCD0C000082AD471BCD1C000082A82
-:10346000B4D1C000752AA47086A001004000082ACB
-:10347000B4706DA0006865A055A09B7810000C6B1F
-:10348000AA7B086845A0106D04686DA05DA086A8A1
-:10349000010040004B2ABC69AA7DAA79C0684DA0F2
-:1034A0001C6E012010007800D32C607005A0C000B5
-:1034B000082A7E0C7E0DB4706DA0006865A055A032
-:1034C0009B7810000C6BAA7B086845A0106D0468FF
-:1034D0006DA05DA086A8010040006E2ABC69AA7D8F
-:1034E000AA79C0684DA01C6E012020007800D32C62
-:1034F0007810B043C000082A1B785B00BC706DA038
-:10350000B4685A789468D678DE789868D278DA7891
-:1035100008788DC00A78BC684270B4C1D671B870A2
-:1035200065A0C0685A7003700200002D4E7080AD17
-:10353000090046707C007810B043C000A02A1B78B8
-:103540004700037004007C007810B043C000AB2A31
-:1035500011200C007810D22A037004007C0078102F
-:10356000B043C000B62A112006007810D22A03709A
-:1035700004007C007810B043C000C12A11200D0067
-:103580007810D22A037004007C007810B043C00089
-:10359000D12A112006007810D22A7C707F7000009A
-:1035A00068204E70037001007C007471FCC10781BB
-:1035B00082789B78100086A20C00C000E12AAA7ACB
-:1035C000012001007800F62A8CA11F008DA1C00007
-:1035D000AA7986A20D004000EF2AAA7A01200200F3
-:1035E0007800F62AAB7820007871AA79AA7A0120AF
-:1035F00004009B786000AA785B7804001B781601B1
-:103600007810D34383700F00D470B4D04000122BD5
-:10361000B4C0D6707E0CB87065A0086084A0EFFBC3
-:103620000A60186001801A607F0C7C00147005A08D
-:10363000C000212BD470B4D04000222BB87006AC4F
-:10364000C000222B7810012B7C007E01A47186A182
-:1036500001004000542B7E0D7E020021112001004C
-:1036600012A2B4706820006806AC40003B2B1182A7
-:103670004000522B7810562B7800302B7E0C002106
-:103680001120010012A2B470682000686020086058
-:1036900084A0EFFB0A60118240004F2B7810562B5C
-:1036A0007800422BA77001007F0C7F027F0D7F0105
-:1036B0007C00E8AD0500AC7006ADC0005E2BA870C4
-:1036C00068207C007810B043C000082A7C70682015
-:1036D000747778104E42502C781092449B781000EA
-:1036E000146884A01F00BDC0AA781C6E4120010090
-:1036F000012004007800D92C7810B043C000082ABB
-:103700009B78100060706820146FD470B4D04000B3
-:10371000932BB4C0D6707E0CB87065A0086084A0EE
-:10372000EFFB0A60186001801A607F0C78104E422F
-:10373000502C78109244246805A04000A42B82A04D
-:1037400006004800A22B7800A42B27680500146807
-:1037500084A01F00BDC0AA783120200041200100B4
-:10376000012003007800D92C8DC2D672C07200A24D
-:1037700015A0547108812AA14800BC2BC071642196
-:103780000465FF85C000D32B56712184C000B72B80
-:10379000D4708CD04000CF2BD07005A0C000CF2BB0
-:1037A000D3700A007C0000227800C12BD4708CC03A
-:1037B000D670D3700000346005A0C000D02B08671D
-:1037C00084A73F074000022CD4D7C000D02B84A789
-:1037D0002100C000D02B84A702004000F32B84A757
-:1037E00004004000D02BBCA7FBFF0A6784A7180287
-:1037F000C000D02B84A700014000022C186005A057
-:10380000C000D02BBCA7FFFE0A6768252368000014
-:103810001C6E84A60E0018634000132C1C6002A3CB
-:103820004800162C4000162C7800D02BFF83C000D7
-:10383000D02B582D502C5671BCD7C0001F2C28708F
-:1038400022603A60BCC70A67C06865A04DA00061ED
-:10385000602A41200100146B9CA31F009DA3C0009F
-:10386000FCD14000332C84D64000352C9CA3BFFFF4
-:10387000A4D640003A2C9DA3200084A60E00C000D0
-:10388000852CA5C70A67002CC668A47786A7010007
-:10389000C000592CD470B4D0C000592C007082A044
-:1038A0000200C800592C3078BCD0C000592C9B783D
-:1038B0001000AA7B7800D12C3987A6775027B077E3
-:1038C000B0A70500AC7006A6C000642CA876B2763E
-:1038D0003A2C38873A2D38873A2838873A23388760
-:1038E0003A253078BCD040007C2C9120008091207B
-:1038F0003D30D47084A03D30912000809020D5AA26
-:1039000000004000842C21840022C000B62B7C00E3
-:10391000DCD14000493E292020009CD6C000922CDA
-:1039200028858CD6C000922C28854088146F0C61A5
-:1039300008818CA1FF00CC7060A1642CFF8C40003A
-:10394000B12C146006A7C0009A2CB8600180BA6040
-:10395000C000952C602A086085A000010A60002242
-:103960002184C000B62B7C00602A0E61BE69002C49
-:10397000C66840880860D5C00A60A47786A70100A1
-:10398000C000592CD470B4D0C000592C007082A053
-:103990000200C800592C3078BCD0C000592C9B784C
-:1039A0001000AA7BAA7DAA79012002007E0018607F
-:1039B00000801A607800DA2C7E0060290461602A99
-:1039C00084A118004000F62C84A110004000E92CCE
-:1039D00078105E40C0001B2D84A108004000F62C2A
-:1039E000A06984A10006C000F62C78103E3F780044
-:1039F0001B2DA06984A1001E4000262D84A1000873
-:103A000040000F2D7E0C6029006085A00020026020
-:103A100004618DA1100006617F0C78105E40C0002B
-:103A20001B2DA06984A100024000172D7810A13F32
-:103A300078001B2D84A10004C000F22CA06984A191
-:103A400000104000262D14698CA100FF0F81781012
-:103A5000E6277F028CA6E00084A660004000332D9C
-:103A600086A06000C000332D8DA100408DA104010F
-:103A7000B6699B7860000028AA781868FDC01A68AB
-:103A8000BCD640004E2DFCC0877000008AA00D00FF
-:103A900050004C2D8AA00C00867101200C000C8077
-:103AA0008A71AA781835403328340080AC8080AF02
-:103AB0002B00A0209B78000080AD0B009820A6531F
-:103AC000A8239828A02586A22000C000862DD470A7
-:103AD000B5C0D670002CBA70002DBE701468FCC042
-:103AE0000780827886A202004000BC2DA47000806E
-:103AF000A670B47498A40500AC7006A3C0007E2D17
-:103B0000A873B67386A210004000082A7F0D7F0CB0
-:103B10007C00007005A0C000642D86A20200C000D9
-:103B2000D62D7810B043C000642D1468FCC0078007
-:103B30008278912000801B785B00B4685A78946882
-:103B4000D678DE789868D278DA7891200180087883
-:103B50008DC00A787E127E0D7E0CD47084A0002762
-:103B600090207F0C7F0D7F1200295A70BC68427034
-:103B700003700200002D4E7080AD09004670307851
-:103B8000BCD04000C82D91203D30D47084A03D3081
-:103B9000912000809020A47005A0C000CD2D7C0055
-:103BA00021844000CC2D5072C07000A215A0780076
-:103BB000B62B86A21000C000072E7810B043C000BC
-:103BC000642D1468FCC0078082781B785B00B468A1
-:103BD0005A789468D678DE789868D278DA78087857
-:103BE0008DC00A78A4700080A670B47490A40500FB
-:103BF000AC7006A2C000FA2DA872B67200295A70E5
-:103C0000BC68427003700200002D4E7080AD090048
-:103C100046707C00B46B9DA300205A7B1468FCC0E6
-:103C200007808278946BD67BDE7B986ED27EDA7EBC
-:103C30001B785B0000295A70027208788DC00A78E0
-:103C4000002305A64000322ED47084A0002786A051
-:103C50000023C0002C2E0920000078002E2E092001
-:103C6000010084A20F007910382E80AD0900467043
-:103C7000002D4E707C00402E3F493F492C493F4962
-:103C8000402E402E402E7810B229087884A0FDFFE7
-:103C90000A787810A5297E0F7920004FAC787F0F25
-:103CA00084D040006A2E647086A00100C000582EA7
-:103CB00066707800412F647086A00500C000682EF1
-:103CC0007C7068201B68040017680000206884A0CE
-:103CD000FF009DC0226867700000A7700000A870F8
-:103CE000B270B6707810012B7E151120040064713B
-:103CF00086A1010040008A2E86A10700C000812E07
-:103D00001F70050078008A2E1F7001006770000088
-:103D1000D470DDC0D67078008C2E67700000012052
-:103D20000A4F042084A0FF0086A0180040009C2EAB
-:103D30001870167005A0C0009C2EA77001007E06AA
-:103D40007810D645A920100039200000781048418D
-:103D5000B8A70001F000A32E7F0600707900AD2EF9
-:103D6000E72EC22EC22EB72EE72EE72EE72EB52E57
-:103D70007810B229607005A04000E72E06ADC000A3
-:103D8000C22E006862707800D42E206884D0C000F3
-:103D9000D02E146F78104E420860D4C00A6078109C
-:103DA000193E7800D42E5C7060200068026084A602
-:103DB000005F1E681868FCD04000DC2E1A6A176885
-:103DC00000002B680000206884A0FF009DC02268CE
-:103DD0007810732084B200044000EF2E2120D0968A
-:103DE0007800F12E2120C0957810462F84B200046F
-:103DF0004000FB2E2120984F7800FD2E2120584FA7
-:103E00007810462FA920010184B200044000092F38
-:103E10002120D09578000B2F2120C0947810462FB8
-:103E20002084F0000B2F84B200034000182F612083
-:103E3000C05478001A2F6120C07421200200A920EC
-:103E400000011061FF814000372F18607E017E0065
-:103E50001120024F0C2202A112207F007F0102A13B
-:103E60005000372F1260C000372F1120044F04225A
-:103E7000A5C012201B600000E0AC1000F0001E2F57
-:103E80002184C0001C2F7F15037000004F700000BC
-:103E90007C007E04042405A04000612F6820006897
-:103EA0007E001A6A176800002B680000B46884A0BE
-:103EB000005F1E68206884A0FF009DC02268781003
-:103EC00073207F007800482F7F04232000007C00AF
-:103ED00082A2030050006B2F7810B22900237900D2
-:103EE0006E2F712FFC2F193082A202004000772F15
-:103EF0007810B22964706770000083700000790048
-:103F00007E2F862F862F882FC82F553E862FC82FAD
-:103F1000862F7810B2297477781048417477BCA73F
-:103F2000008F78104E42186005A04000BF2FFCD7CC
-:103F3000C0009B2F2120C09578009D2F2120D09676
-:103F40000920050011201000781034304000BF2FE8
-:103F50007E15A9200101FCD7C000AF2F2120C094FD
-:103F60007800B12F2120D0957E0409200500112072
-:103F70001000781034307F044000BE2F2084F00001
-:103F8000B12F7F15388784A71F00C0008E2F7800BF
-:103F90000C2A78000C2A747778104E42186005A01D
-:103FA0004000FA2FFCD7C000D62F2120C095780002
-:103FB000D82F2120D096092005001120200078104C
-:103FC00034304000FA2F7E15A9200101FCD7C00033
-:103FD000EA2F2120C0947800EC2F2120D0957E0478
-:103FE0000920050011202000781034307F044000A3
-:103FF000F92F2084F000EC2F7F1578000C2A002286
-:104000007900FF2F0230043004307810B2290920E3
-:104010001200647086A0020040000D3009200E00DE
-:104020001868FCD0400012301A6967700000D47024
-:10403000DDC0D67078005D43002279001C3021304D
-:1040400004301F307810B2297810D645007086A051
-:104050000200C000C73D7810363E086084A0EFFB28
-:104060000A607810B83D4000C73D78000C2A04244F
-:1040700005A040006D306820042D7E00146806A75E
-:1040800040004330202D7F00780035307F00222013
-:104090001A69176800002B680000B46884A0005FEC
-:1040A0001E68206884A0FF0005A222687810732093
-:1040B0002120024F1C2419832223106001801260EA
-:1040C000C00064302120044F0424A5C022200860D1
-:1040D00084A0EFF90A607810222B7810363E7C001D
-:1040E00085A0010078006C300023790074307930AD
-:1040F0007730F9307810B229E47805A0D000AF30DD
-:1041000008327E000120044F0420ECD07F004000E4
-:104110008A308CA1000378008C308CA10004400010
-:1041200092301800082A780094302800082A0820C5
-:1041300084A03000C0009B307800B937EC7884A0B0
-:10414000030040009930002184A007007900A530C9
-:10415000D930E330CE30AD30A543A543AD30EE309D
-:104160007810B229007086A00400C000C9306470C5
-:1041700086A00200C000BF301120020019200000FC
-:104180007800652F647086A006004000B930647026
-:1041900086A004004000B930E479012003007800D3
-:1041A00043341868FCD04000D4301B681D007810E0
-:1041B00018411B7864007C001868FCD04000DF3098
-:1041C0001B681D0078101841780081431868FCD0E6
-:1041D0004000E9301B681D00781018411B78F8007A
-:1041E0007C001868FCD04000F4301B681D0078107B
-:1041F00018411B78C8007C0084A50F00C00018314E
-:104200007810A5290070790002310C2A0A310C318E
-:10421000C73DC73DC73D0A310A317810B229781031
-:10422000363E086084A0EFFB0A607810B83D40007D
-:10423000C73D78000C2AE47805A0D000AF300832E2
-:104240007E000120044F0420ECD07F004000293183
-:104250008CA1000378002B318CA100044000313187
-:104260001800AF30780033312800AF30082084A028
-:104270003000C0003B311B785B007C00EC7884A0F0
-:10428000030040003831002184A107007900453146
-:10429000543158314F314D31A543A5434D319F43E2
-:1042A0007810B229781020411B7864007C007810C7
-:1042B000204178008143781020411B78F8007C0071
-:1042C000781020411B78C8007C00002379006531FC
-:1042D0006A3168316C317810B2297800A8391B68CE
-:1042E0001600A3780000E47984A130004000A839CA
-:1042F000EC7884A003004000A83984A100014000AC
-:10430000703184A10700790082318A315831CE3072
-:104310005D43A543A5435D439F43781069437C00FB
-:1043200082A20500500093317810B2290023790051
-:1043300096319931C933D433002279009C31B6319A
-:10434000A331B631A131AC337810B2299B78180073
-:10435000A87884A0FF0082A02000480007418AA01E
-:104360000400C80007417900B23107410741074105
-:10437000B1409B781800A87984A180004000C73123
-:1043800078000741007005A0C000BD311120040075
-:104390007800933B84A1FF008AA01000C800074169
-:1043A0007900CF31E131DF31F631FA31CD320741D9
-:1043B0000741CF3207410741A833A83307410741DE
-:1043C0000741AA337810B229E4D64000EC3101202D
-:1043D0000003008000803A781B78C3007C001868D6
-:1043E000FCD04000F4311B681D007800E4317800F7
-:1043F0005D431B681D00780011412069226984A675
-:104400000018C0005F32206884D0C0006532186890
-:1044100086A00800C0000B321B680000D4D6400004
-:10442000CA32BCD640004B3287700000186884A0A6
-:104430003F008AA00D0050004B328AA00C0086710C
-:1044400001200C000C808A719B786100AA787E158F
-:104450007E137E147E0108328CA1000340003D32A1
-:104460007E000120044F0420ECD07F004000393250
-:10447000A1202B0178003F32A1202B0278003F328F
-:10448000A1202B017F019B7800000080AC8080ADD3
-:104490000B009820A6537F147F137F15386005A06A
-:1044A000C0005A321C6884A00E00400011417810F0
-:1044B00027412B78083078005C3201803A601B7805
-:1044C00067007C00E4D6400065321B7879007C00F0
-:1044D00084A660004000C732DCD64000C732FCD65C
-:1044E000C000713278008832FCC65A7EB66EDC7A23
-:1044F000D879D0781B80C8007B32008084A03F0030
-:1045000008A191A20000986B002102A3B268946BED
-:10451000002203A3AE68F4D640008E32F4C65A7E61
-:10452000B66E007086A00300C0009C327E0078103A
-:10453000D64578103F497F001B7876007C0006A0A6
-:104540007810444AB06AAC69986C946B002205A15B
-:104550004000AB32002222A400211BA3AA6CD27C13
-:10456000DA7CA66BD67BDE7B002305A4C000BB32C1
-:10457000F5C65A7EB66E1B7876007C001B787600F6
-:10458000002215A1C000C43278103F497C00781089
-:1045900077497C001B7879007C001B7867007C00E1
-:1045A0007810B22978001B332069C4D14000E4326E
-:1045B000C4C122697E0C587060200060E4C00260B3
-:1045C000046084A0F5FF06607F0C78000F33CCD127
-:1045D00040000F33CCC122697E0C5870602000600F
-:1045E000ECC002600460A4C006600820482C7F0C68
-:1045F0009CD140000F3378104A4278103E3FFF882C
-:1046000040000F339B7860000028AA78587E95C63A
-:104610005A7ED4D6C0000C331B7864007C001B7813
-:1046200078007C00587ED4D6C00016331B78670013
-:104630007C001B7879007C0078000C411920000078
-:1046400090798CA10700C0002933206884A0000164
-:1046500040001933092008009B781000A87894A026
-:10466000FF0086A20100C00045330023A87C00A4FF
-:10467000182002A140003D3348003D3378003F330D
-:104680007800D132A824A87AF0003F3378002B3389
-:1046900084A2F00086A02000C000993318831883FC
-:1046A000002302A14000553348005533780096336B
-:1046B00086A22300400019331C6884A0F1FF1E6805
-:1046C000587E84A6F1FFA5C030205A7E0860A5C0A0
-:1046D0000A607E0C5870602004600820482C7F0C13
-:1046E000A4D14000763378104A4278105E407800BA
-:1046F00084337E0C5870602004600820482C7F0CA6
-:104700009CD140000F3378104A4278103E3FFF881A
-:1047100040000F339B7860000028AA7895C65A7E27
-:10472000D4D6C00093331B7864007C001B787800DB
-:104730007C00A87A78002B331883002302A1400064
-:10474000A2334800A23378002B3384A28000C0003B
-:10475000114178000C4178001141780007415870F0
-:104760004DA09B781800A87884A0FF008EA00100BF
-:104770004000B9337810B229A87A94A2FF00A87833
-:1047800084A0FF008AA00400C80007417900C53357
-:1047900007418F3E0741064082A20000C000CF3390
-:1047A0007810B229781018411B7878007C0082A21A
-:1047B0000300C000DA337810B229FCD4C000FA3309
-:1047C000647005A04000E3337810B229146F767747
-:1047D000BCA7008F78104E42086085A021000A60B7
-:1047E000388784A71F00C000E73378101C4167702A
-:1047F00002001F7009007800FC3378102B411B78F1
-:1048000078007C0082A20400500005347810B229A0
-:104810000023790008340B34CB350E3686A2030012
-:10482000400043340072D87CDC7DD07FD471BCD191
-:10483000C0003B34B4D140003B34687884A0FF0012
-:10484000C0003B3482A20200C8003B347E0D3B789E
-:1048500000831B784C00BC706DA0B4685A789468D3
-:10486000D678DE789868D278DA78B4C1D6710370D9
-:1048700030007F0D01200000780047343B780013A2
-:104880001B784A0001200000780047340072D87C71
-:10489000DC7DD07F4A70A068ECD040004F340860C7
-:1048A0008DC00A6084A20F0079005334AB356034A8
-:1048B0005D3411379D370C2A5B345B347810B22994
-:1048C0000860D4C00A60E4D640006834487086A00E
-:1048D0001400C00088347810D645092000001868FC
-:1048E000FCD040007134487086A01400400082342F
-:1048F000186886A00800C000633558789CD0400036
-:1049000063352068ACD0400063351B681400092073
-:1049100002007800C73468788CA0FF004000C734DC
-:1049200086A10800C0009E340860A4C00A60781008
-:10493000B83D4000C7347810363E7810D645780030
-:10494000AF3486A12800C000C734186005A040001D
-:1049500091340180400091340180400091341E6008
-:1049600078009134206884D040000C2A84C02268EA
-:104970007810132B5C707E0C6020006802607F0C46
-:104980000460026805A0002DC000C4340260066007
-:1049900078000C2A7E01FF81C0001135007086A0CE
-:1049A000300040001135D471BCD1C0001135B4D1F4
-:1049B000C000F834607005A0C0001135A47086A056
-:1049C000010040001135037000007E047E057E0763
-:1049D0007E067E0C7E0D7810352A7F0D7F0C7F06BB
-:1049E0007F077F057F04D471B4D1C00011350370F7
-:1049F0004000780011357810B043C00011351B78A5
-:104A00005B007E0DBC706DA0B4685A789468D6784F
-:104A1000DE789868D278DA78B4C1D6710370300045
-:104A200008788DC00A787F0D781048367F01FF81A5
-:104A30004000633584A600DF1E682B680000146FF9
-:104A400086A10200C0006435186886A01400C0006A
-:104A50002D350820E4D640002D3568788CA0FF0065
-:104A60007810012B7810222B2068DCD0C000643530
-:104A7000178794A20F0013821382138284B200035B
-:104A80004000433590A2C0537800453590A2405471
-:104A900090A200001C22C4D3C0004D3578005335CD
-:104AA0001082042285A0180012201182D4D3400065
-:104AB0005E35A068C4D0C0005E357810C23678007C
-:104AC0000C2A08608DC00A60780064352A6916696E
-:104AD0001868FCD040006B3548701A688CA600DF5F
-:104AE0001E691064FF84400080350920024F0421B4
-:104AF00001800A2021841264C00080352120044FE7
-:104B00000424A5C02220186005A04000883501803B
-:104B10001A60C0008B350860A4C00A60206884D089
-:104B2000C0009735006805A0C0009435026006609B
-:104B300078009B355C706020006802606120004F47
-:104B400087680301082D6B200000686005A06A617A
-:104B50004000AA35022D7800AB356E61007286A246
-:104B600030004000BB3586A24000C0000C2A037014
-:104B700002004C706820C46860207C000370020052
-:104B8000BC706DA0BC684270B87065A0C0685A70F7
-:104B9000002D4E7080AD090046707C0082A204009A
-:104BA0004800D1357810B22900227900D435D835A3
-:104BB000E935F635E93586A500134000E93586A5C7
-:104BC0000083C000CF3503700000186001801A60B8
-:104BD000086084A0EFFB0A60007086A0050040001A
-:104BE000F335781018411B7878007C001B78790029
-:104BF0007C0090780780018084A0070080A01800C6
-:104C00009A78A8798CA1FF0086A1030040000B369A
-:104C100086A1000040000B36780007411B78790020
-:104C20007C00206895C02268FF82C000183678108A
-:104C3000184178001F36118240001D367810B229C5
-:104C400078102B411B7878007C007810D3433078A3
-:104C500084A0C000C00045367E0108327E000120DD
-:104C6000044F0420ECD07F00400037368CA10003B5
-:104C7000780039368CA100047F01400040361800CE
-:104C8000453678004236280045361A7906A07C0061
-:104C900085A001007C0084A66000C00052362F6809
-:104CA0000000336800007800C136DCD6C0006A36E8
-:104CB000B468DCD0C0006A369869946A2E69326A9A
-:104CC000487005A0C0006736002205A14000D64507
-:104CD0004B7015007800D6457C00ACD6400090366D
-:104CE000F4D6400076362F68000033680000780064
-:104CF000D645B46884A0004035A6F4D6C00070360E
-:104D0000487005A0C00083364B701500DCD6C0008B
-:104D10008C36B468DCD040008C36A86CA46D2E6C48
-:104D2000326D7800D645F4D6400099362F680000E1
-:104D3000336800007800D645B46884A0004835A6E2
-:104D4000F4D6C0009336487005A0C000A6364B705C
-:104D50001500082410250027FB80C800AD36008010
-:104D600084A03F0008A191A200002E69326A0021B0
-:104D700005A2C000BA367800D645007086A00600AD
-:104D80004000C1367800D6457C0046690860CDC039
-:104D9000CCD34000C9368DC00A6018683A681B68D9
-:104DA00006008F68000093680000306A2C693E6A34
-:104DB00042692F6803003368000037682000976855
-:104DC00000009B68200000707900E3360C2AF5365D
-:104DD000ED36EB36EB36EB36EB36EB367810B229A8
-:104DE000206884D0C000F5367810193E7800FB3674
-:104DF0005C70502C602000680260602A08328CA130
-:104E00000003400004372120584F78000637212046
-:104E1000984F042405A040000D3720207800063765
-:104E2000222D6B2000007C007810203E7810363E4A
-:104E30000860CCC00A602B6800009B780E00146FDD
-:104E400038691A694469166908328CA10003400068
-:104E50002A370920000078002C370920010078103B
-:104E6000814ADCD6400034371C69EDC11E691868E0
-:104E7000FCD04000433768788CA0FF0040004137E9
-:104E80001B681E00780043371B68000084B20003D3
-:104E9000C0004B372120984F78004D372120584FC4
-:104EA000006822203C6A4069326A2E69C06860202E
-:104EB0000060A4D040008D3741202100492005002A
-:104EC000512020007E0D7E0F7E157E147920004F2C
-:104ED0007810461E7F147F157F0FCC70102009209C
-:104EE00001017E0204226DA040007D37146806A7F0
-:104EF00040007A370068780070372068D5C0226893
-:104F00007F0210820981C0006E377F0D6770030039
-:104F10007F700000767783700F00D471DCC1D6718A
-:104F2000186886A00200C0009937176800002B6837
-:104F300000001C68ECC01E687810732078000C2AF2
-:104F4000D87CDC7DD07F781048362B6800009B78B9
-:104F50000E00146F7810D7438CA0FF0016691868F4
-:104F6000FCD04000B23748701A688CA600DF1E697A
-:104F70006770000078000C2A007005A0C000BF37E1
-:104F800078000C2A06A07810D6452069ACD1C00064
-:104F9000C8371B6814008CA600DF1E692B68000050
-:104FA000206884A0FF00226800707900D4370C2AA2
-:104FB000DE37DE37E137E137E137DC37DC377810D1
-:104FC000B2291868780043340860A4C00A601768E2
-:104FD00000007800DE3D00237900EB37EE37F03734
-:104FE00060387810B229FCD6C000473800700DA098
-:104FF0007900F7370C2A0138013831380138443844
-:10500000FF37FF377810B22984A66000400031389E
-:1050100086A06000C0002E38ACC6F4C6EDC65A7E2D
-:10502000B66E1C68ACC01E6886A102004000203825
-:105030007810D645AC69B06815A1400020387810CA
-:1050400077497800223878103F491B787900D4716D
-:10505000B4D1C000082AA47086A00100C000522A62
-:105060007C00ECD640000B381868FCD04000443877
-:10507000F4D6C0003E381B6815001B787900780014
-:10508000082A1B6807002F680000336800007810AA
-:1050900069437C00FCC65A7EDC7AD879D0781B80C4
-:1050A000C8005038008084A03F0008A191A20000F1
-:1050B000986B002102A3B268946B002203A3AE6830
-:1050C0001B7879007C007810B229002379006538BC
-:1050D0006A388F38EF387810B229007079006D384F
-:1050E000753877388038753875387538753875384B
-:1050F0007810B229AC69B06815A1400080387810EA
-:1051000077497800823878103F491C68B4C01E681F
-:10511000D470B4D0C000082AA47086A00100C000DA
-:10512000522A7C00FCD6C000DF3800700DA0790048
-:1051300096380C2AA638A038D638A638DC389E38DF
-:105140009E387810B2299468D678DE789868D2783C
-:10515000DA7884A660004000D63886A06000C000DF
-:10516000D338B4A6BFBFEDC65A7EB66E86A1020084
-:105170004000C2387810D645AC69B06815A140002F
-:10518000C238781077497800C43878103F491B78C6
-:1051900079001C68B4C01E68D471B4D1C000082A5C
-:1051A000A47086A00100C000522A7C00ECD640000A
-:1051B000B0381868FCD04000DC381B6807001B784A
-:1051C000F9007C00FCC65A7EDC7AD879986B002105
-:1051D00002A3B268946B002203A3AE68D2791B7855
-:1051E00079007C00DCD64000F8382B7809301B7839
-:1051F00079007800082A8478ACC08678E47884A0A6
-:105200000800C0000B3984A4000240000539F5C62F
-:10521000DDC65A7E1B7879007800082A206895C080
-:1052200022687810E242DDC6781018411B787800B9
-:105230007800082A002379001A391D391F392139CD
-:105240007810B22978001141D4D6C0005C39E479D5
-:10525000ACD140002F39EC7884A0030040002F39F6
-:105260002B7809309B786000AB78000084A6FBFFA8
-:105270005A78E479ACD140003F39EC7884A003003F
-:10528000C00058390120044F0420E4D0C000543934
-:105290002068C4D0400054397E0C587060200460EF
-:1052A0009DC00660086084A0FF000A607F0C01209A
-:1052B00014007800433484A1070079009239907A71
-:1052C00094A207009B786000A879FF814000903984
-:1052D0009B781000A87B84A30100C0008339A87BC1
-:1052E000A87B86A30100C00076390920F7FF78006B
-:1052F0007C3986A30300C00083390920EFFF7E0CB0
-:1053000058706020046004A106607F0C9B786000E8
-:10531000AB78000084A6FBFF5A782B78093020690F
-:105320008CA1FFFC226978005D43D930E3309C39C1
-:10533000A2399A399A395D435D437810B2292069C0
-:105340008CA1FFFC22697800634320698CA1FFFCDB
-:10535000226978005D43E47984A130004000B239CD
-:10536000EC7884A00300C000E639007086A0040039
-:10537000C000CC39647086A00200C000C239112080
-:105380000200192000007800652F647086A00600D6
-:105390004000BC39647086A004004000BC39007035
-:1053A00086A000004000082A206984A12004400053
-:1053B000DB39D4C1226918687800433418688EA09C
-:1053C00002004000E439FDC01A6801201400780092
-:1053D000433484A107007900EA395D435D43F23923
-:1053E0005D43A543A5435D435D43BCD64000343ACD
-:1053F0008471FF814000343A82A10D00D000013A4F
-:10540000877000007800063A82A10C00867009209F
-:105410000C009B786100AA797E157E137E1488703B
-:10542000148110A28A7280A00B0000AD982084B273
-:1054300000034000283A7E000120044F0420ECD0F5
-:105440007F004000243AA1202B0178002A3AA120B5
-:105450002B0278002A3AA1202B019B7800000881BA
-:10546000AC81A6537F147F137F1578006343D4D695
-:10547000C000883A206884D0400063438CA6600056
-:1054800084A660004000463A86A06000C000463A0C
-:10549000F5C194C15A79B6699B786000AB78000079
-:1054A0009B7861001868FDC01A68AA7808800C8192
-:1054B00040004F3E8CA1F800C0004F3E7E157E1389
-:1054C0007E147E0108328CA100034000743A7E00F5
-:1054D0000120044F0420ECD07F004000703AA1204E
-:1054E0002B017800763AA1202B027800763AA12091
-:1054F0002B017F019B7800000080AC8080AD0B0009
-:105500009820A6537F147F137F151468FCC0078072
-:105510008278780063431868FCD040008E3A1B689C
-:1055200008002068ADC02268781020411B78EA008E
-:105530007C0000237900993A9E3A763B9C3A781099
-:10554000B229D87CDC7DD07FFF82C000C73A0072D0
-:1055500086A2030040001034D471BCD1C000CA3A06
-:10556000B4D14000CA3A7E0D3B7800881B784C00CD
-:10557000BC706DA0B468A5C05A789468D678DE78FF
-:105580009868D278DA78B4C1D671037030007F0D94
-:105590007800CE3A00727800CE3A3B7800181B783B
-:1055A0004A0084A20F007900D23A613B103BDC3AFA
-:1055B0003F34DA3A613BDA3ADA3A7810B2291C68B9
-:1055C000ECD04000E33A08608DC00A60206985C1D4
-:1055D00022690068066005A0C000EC3A026008601D
-:1055E000D4C00A601C6884A00E00C000003B84B2D6
-:1055F00000034000FC3A0920C0957800053B0920D3
-:10560000D0967800053B3070BA684071CC7008A124
-:10561000042102680A2D5E71DCD6C000103BFCC676
-:10562000B66E7800613BB66E84A66000C0001A3B7F
-:1056300084A6FF7FB6687800613BDCD6C000283BBB
-:1056400084A6FF7FB6689468A6689868AA687810F0
-:10565000D6457800613BACD64000343B06A07810BC
-:10566000D64508241025AA69A66A7800443B082478
-:10567000102500271B80C8003B3B008084A03F0012
-:1056800008A191A20000AA69A66A7810D645FCD6A6
-:105690004000613B84A6FF7FB66810250824ACD685
-:1056A000C000593B00271B80C800543B008084A0E9
-:1056B0003F0008A191A20000986B002102A3B268EC
-:1056C000946B002203A3AE68007086A03000C00077
-:1056D0000C2A03700200BC706DA0BC684270B870E8
-:1056E00065A0C0685A70002D4E7080AD09004670EC
-:1056F0007C0086A50088C000833B03700000186012
-:1057000001801A60086084A0EFFB0A6078001141F4
-:105710004770000082A2060050008D3B7810B2292D
-:1057200000237900903B933BA53BB13B00227900DD
-:10573000963B9C3B11419E3B9C3BEB3B403C781095
-:10574000B229807A94A2000F7810CA3C78000741F1
-:105750007810C23B7900A93B1141AF3BAF3BEB3B1B
-:10576000AF3B11417810B2297810C23B7900B53BAC
-:10577000BD3BBB3BBB3BBD3BBB3BBD3B7810B229FC
-:1057800078102B411B7878007C00007086A0020006
-:10579000C000D33B7810363E7800CD3B7810D6451C
-:1057A000086084A0EFFB0A607800D83B007086A0F8
-:1057B00003004000CB3B0370050084B200034000AF
-:1057C000E23B0120E0967800E43B0120129768203C
-:1057D0004E7080AD0900467000227C00007086A0EB
-:1057E0000200C000FD3BD470B5C0D670002CBA706A
-:1057F000002DBE707800023C7810D6457800023C3F
-:10580000007086A003004000F93B03700100807A1D
-:1058100094A2000F9B781800A87C84A41F0015A2F6
-:105820006920C09584B20003C000163CFDC2692007
-:10583000D096042D082D5E716DA04000233C1468A5
-:1058400006A24000253C00687800173C7810CA3C4E
-:10585000B46E5A7E206984A1000C4000F43C647050
-:1058600086A00600C000373C747006A2C000373C1A
-:1058700066707E701B680500ADC1D4C122697810C6
-:1058800020417800F43C007286A20200C000523C25
-:10589000D470B5C0D670002CBA70002DBE707800E0
-:1058A000563C7810D6457800563C86A2030040004E
-:1058B0004E3C03700100807A94A2000F9B78180080
-:1058C000A87C84A41F0015A284B20003C000663C1B
-:1058D000FDC2A879A8798CA1FF001821CC7068A11D
-:1058E000042D082D5E716DA040007A3C146806A25C
-:1058F0004000A33C006878006E3C0370050084B251
-:1059000000034000843C0120E0967800863C0120A2
-:10591000129768204E707E15A920320003200000E7
-:105920000080F0008B3C7F1584B200034000983C5F
-:10593000FCC27800993CFDC2166A80AD0900467031
-:10594000B76800072368000827680300B46E206961
-:1059500084A1000C4000F43CDCD04000BF3C6470EB
-:1059600086A00400C000BB3C747006A2C000BB3C13
-:10597000787006A3C000BB3C66707E70781027412B
-:105980007800F43C1B680500ADC1D4C122697810D1
-:1059900020417F7000007800F43C0370050084B261
-:1059A00000034000D43C0120E0967800D63C012062
-:1059B000129768204E707E15A92032000320000047
-:1059C0000080F000DB3C7F1584B200034000E83C1F
-:1059D000FCC27800E93CFDC2166A80AD0900467041
-:1059E000B768000723680008276803007C00ECC63E
-:1059F000ACA660004000463D986B946CAC69B06802
-:105A000005A1C000213DD27BDA7BD67CDE7C86A559
-:105A1000600040004B3DF4D6C0000C3DEDC6B4A67E
-:105A2000FFB75A7E092079009CD64000193D092015
-:105A300078001920000020231A79ECD64000563D4A
-:105A400078103F497800563DB0681AA3002123A47E
-:105A5000002405A340004D3DD27BDA7BD67CDE7C62
-:105A6000B068F4D6C000323DEDC6F4C65A7E1120AF
-:105A700079009CD640003E3D11207800192000009E
-:105A800020231A7AECD64000563D781077497800EA
-:105A9000563D19200000202378004D3DB4A6FFB7E5
-:105AA0005A7E092079009CD64000553D0920780097
-:105AB0001A79C0685A70002D4E70C4686020D47185
-:105AC0000120014F0420C4D0C000AB3DD8702DA0F0
-:105AD0004000843DBCD140009E3D807A94A2000FDE
-:105AE000DC7006A24000753DE07804A5C000AB3D27
-:105AF000DA70BCC1D6717800AB3D312001002C8535
-:105B00004800833D3386108278007C3D7C00E07D38
-:105B100094A500FF4000913D112008002F857810CA
-:105B20007A3D37867800933D78107A3D17828078E9
-:105B300084A0000F06A24000AB3DDE72DA7678004A
-:105B4000AB3D807A94A2000FDC7036A240009B3DF2
-:105B5000E07834A540009B3DBDC1D671B4D1C000F2
-:105B6000082A002305A44000082AA47086A001008A
-:105B7000C000522A7C00206005A04000C63D018084
-:105B80002260086085A008000A600F7000012C7078
-:105B900026607C0006A07810D645007086A0020022
-:105BA0004000D43D647086A00500C000DE3D2B6837
-:105BB0000000176800001B680100236840001F6890
-:105BC0000001007084A00F007900E33D0C2AF33D32
-:105BD000ED3D153EFD3D0C2AEB3DEB3D7810B22925
-:105BE0007810203E7810193E7800F93D7810203E5C
-:105BF0005C706020006802607810732078000C2AC6
-:105C0000647067700000837000007900043E113EEC
-:105C1000113E0C3E0C3E0C3E113E0C3E113ED47724
-:105C2000DDC7D67779007E2F6770000078000C2AD8
-:105C30001B68000078001137006805A0C0001E3EF8
-:105C4000026006607C001064FF844000323E092040
-:105C5000024F042101800A2021841264C000323ED8
-:105C60002120044F0424A5C022200860A4C00A609B
-:105C70007C00186005A040003C3E01801A607C005A
-:105C80007810D3431B68180078007D3E7810D3430A
-:105C90001B68190078007D3E7810D3431B681A00FA
-:105CA00078007D3E7810D3431B68030078007D3E6A
-:105CB000747778104E4278718CA1FF00103294A254
-:105CC00000034000643EE8A1C0947800663EE8A16D
-:105CD000D095042D082D682005A0C0006F3E7E7071
-:105CE00078000C2A1468747206A24000773E00689F
-:105CF0007800673E00680A201B6805007F7000007E
-:105D00007810203E206884D0C000853E7810193E6F
-:105D10007810363E1F68000023682000781073203A
-:105D200078000C2A82A20300C0000741A87DACA520
-:105D3000FF005A7EA87EB4A6FF002069BDC122697B
-:105D4000C4D14000EA3EC4C12269B4A6FF004000AD
-:105D5000D73E82A60C004800AE3E4000AE3E312049
-:105D60000C00002586A00A004000B53E2B852B853F
-:105D70007810E0414000BD3E7810BC3F7800E03E26
-:105D800078109B417E0C6029046084A0F5FF0660BA
-:105D90007810F23F7F0C2069C5C12269587E95C6F4
-:105DA0005A7ED4D6C000D43E1B7864007C001B7899
-:105DB00078007C007E0C6029046084A0F5FF0660FA
-:105DC0007810F23F7F0C587ED4D6C000E73E1B7897
-:105DD00067007C001B7879007C007E0C5870602086
-:105DE0000061E4D14000333F0862178294A2FF00B3
-:105DF00082A20C004800FD3E4000FD3E11200C0038
-:105E0000002602A2C800023F3022086294A2FF00CE
-:105E10000120054F0420E4D0C000173FEC78E4D007
-:105E20004000173F82A20A00C8001D3F11200A004F
-:105E300078001D3F82A20C00C8001D3F11200C00FD
-:105E4000002202A5C800223F282278109F41002589
-:105E500086A00A0040002B3F2B852B857810E0415F
-:105E60004000333F7810BC3F7800373F78109B41AB
-:105E70007810F23F587895C05A787F0C1B787800DC
-:105E80007C007E0C60290060E4D0C000583FB4D094
-:105E9000C000523F106084A00F00C000523F046158
-:105EA0008CA1F5FF06617F0C7C00112032001920C7
-:105EB00000007800833FA068CCD0C000523F086249
-:105EC00094A2FF000120054F0420E4D0C000713FE0
-:105ED000EC78E4D04000713F82A20B00C800713F13
-:105EE00011200A007800773F82A20C00C800773F9B
-:105EF00011200C0008631F839CA3FF0082A30C00E9
-:105F00004800833F4000833F19200C00AB7801001C
-:105F1000AB780300AB780100AA7AAA7BC0A8050081
-:105F20002068C5C02268D470B4D040009F3FB4C080
-:105F3000D670B87065A0086084A0EFFB0A60186096
-:105F400001801A607F0C7C007E0C602904618CA1AA
-:105F5000F5FF066111203200192000007800AD3FE6
-:105F6000AB780100AB780300AB780100AA7AAA7B7A
-:105F7000C0A805002068C5C022687F0C7C007E0C8C
-:105F80005871602118208CA020004000C53FACC093
-:105F9000082084A0F0FF35A6867E18609A78AE7E31
-:105FA0001266A47884A0F0FF8CA10F0005A1F4C0B4
-:105FB0009CA320004000DB3F85A00040FCC0B4D083
-:105FC000C000E03FFDC0A67816608A78B4A60F0036
-:105FD00037860482048084A0FF0005A60E6004605A
-:105FE00084A0F5FF06607F0C7C007E0C587060205A
-:105FF00018609A78A47884A0F0FFA678126084785C
-:1060000084A0F0FF86780C6084A0FF000E607F0CF7
-:106010007C0082A20200C0000741A87A2069BDC1AD
-:106020002269CCD140004140CCC1226994A2FF003A
-:1060300082A20200C8000741781094407810F23F15
-:1060400080A901000C2078104A4278103E3FFF885A
-:10605000400037409B7860000028AA78587E95C69B
-:106060005A7ED4D6C00034401B7864007C001B7874
-:1060700078007C00587ED4D6C0003E401B78670074
-:106080007C001B7879007C0082A20200C800494095
-:1060900084A2010040005240587188A100000C21E8
-:1060A000ECD1C00052401120000078107C417810E3
-:1060B00094407810F23F587895C05A781B78780051
-:1060C0007C007E0C7E026029006011200100ECD073
-:1060D000C0007540BCD0C00073401460B4D0C00094
-:1060E0007340A4C1066106A0780091401120000011
-:1060F000AB780100AB780200AB780300AA7AC0A8A5
-:106100000400D470B4D040008D40B4C0D670B870D4
-:1061100065A0086084A0EFFB0A60186001801A6027
-:10612000206885A0000222687F027F0C7C007E0C24
-:1061300058706020FF8240009C4011204000186091
-:1061400080A002009A78A47884A0BFFF05A2FCC0BA
-:10615000B4D0C000A940FDC0A67816608A7804605B
-:10616000A4C006607F0C7C007E00007086A0030047
-:106170004000BA407F007800BD407F0078000441B5
-:10618000ACD640000441887884A04000400004411F
-:10619000B87B84A33F001B83C800CC40008005A0CF
-:1061A0004000E1401B83C800D54001804000014110
-:1061B000F4D64000E140B8781B80C800DD40008084
-:1061C00084A03F00C0000141F4C65A7ED879DC7A31
-:1061D0000120010008A1C800EC4091A20000D27982
-:1061E000DA79D67ADE7A7810444A1B78760084B25F
-:1061F00000034000FC40012000007800FE40012028
-:1062000001007810CE487C001B7876007C001B785B
-:1062100079007C0078102F411B7878007C00781082
-:1062200018411B7878007C00276802007810204114
-:106230001B7878007C0001200500780031410120A6
-:106240000C00780031412068D5C02268012006008A
-:106250007800314101200D00780031410120090012
-:1062600078003141012007009B787E00AA789DC606
-:106270005A7ED470B4D040004741B4C0D6707E0C72
-:10628000B87065A0086084A0EFFB0A601860018008
-:106290001A607F0C7C007E073F87BCA70F003B87FE
-:1062A0003B8703877E018CB2000340005841E0A089
-:1062B000C05378005A41E0A040547F01B8A72000A5
-:1062C0009A7FA47984A10F0040006A4184A1F0FF65
-:1062D000A678126004609DC00660388738879A7F70
-:1062E000A47984A1400040007A4184A1BFFFFDC091
-:1062F000A67816600460A5C006607F077C009B78C6
-:106300001000AB780100AB780200AB780300AA7AEA
-:106310009B786000AB780400D470B4D040009A4100
-:10632000B4C0D6707E0CB87065A0086084A0EFFB86
-:106330000A60186001801A607F0C7C003120000028
-:10634000292032009B781000AB780100AB78030065
-:10635000AB780100AA7DAA7E9B786000AB7805002F
-:10636000D470B4D04000BE41B4C0D6707E0CB870BA
-:1063700065A0086084A0EFFB0A60186001801A60C5
-:106380007F0C7C007E15078084A0FF0003800380C3
-:1063900080A020009A78A4798CA1F0FF21203342BC
-:1063A00019201100A9200E0011203200042484A01D
-:1063B000F0FF06A14000DE412084002310A2F0007F
-:1063C000D3417F157C007E150120054F0420E4D0C9
-:1063D000C000114221204142A920090011202800BB
-:1063E00082A5190040002742480027422084A99531
-:1063F0001120320082A53200400027424800274287
-:106400002084A99519200A0011206400002202A509
-:1064100040002742480027422084002310A2F000B9
-:1064200003427F15780025422120334219201100B4
-:10643000A9200E0011203200002202A540002742B0
-:10644000480027422084002310A2F00019427F1543
-:1064500006A07C007F1582A56400C8003042087841
-:1064600085A070000A78042405A07C00091202307F
-:106470000232034203440454045605660568067854
-:10648000067A070C070C070EE1100A330558055A67
-:10649000066A066C077C077E000E9B78100046A0FB
-:1064A0007C0084A7000F0B8084A71F00038003805B
-:1064B0000380038005A1FCD740005F42E0A0C074C8
-:1064C00078006142E0A0C0547C007E0E7E0F84D034
-:1064D00040006F42792000010920804F7120804FD9
-:1064E00078007F420920404F7120404F0120044F27
-:1064F0000420ECD040007D427920000178007F42EA
-:106500007920000291200080042184A00F007900EE
-:1065100086429042904290429042904290428E42F7
-:106520008E427810B229B469F5C18CA19FFFB6697B
-:1065300005A04000DF42587884A09FFF85A000603E
-:106540005A78287886A01418C000DF424B780400DF
-:10655000487884A00400C000A5424B780800487821
-:1065600084A00800C000AC423078BCD0C000DF423C
-:106570007E000120044F0420ECD07F004000C14287
-:1065800084B200037800C34284B200044000C942D0
-:106590001800DF427800CB422800DF42E47984A172
-:1065A00030004000DF42EC7884A003004000DF426E
-:1065B0001C68ACD0C000DD42781069437800DF422F
-:1065C0001B78F9007F0F7F0E7C007E0C0120014FAD
-:1065D0000420ACD0C0005B431468078084A00F0087
-:1065E0000380038003808CB200034000F842E0A0E7
-:1065F000C0537800FA42E0A04054046084A00A002E
-:10660000C0005B43086194A100FF40005B438CA184
-:10661000FF0001200A0006A14000264301200C00D3
-:1066200006A140002A430120120006A140002E438B
-:106630000120140006A1400032430120190006A1E8
-:10664000400036430120320006A140003A43780062
-:106650003E4309200C0078004043092012007800D6
-:1066600040430920140078004043092019007800B5
-:106670004043092020007800404309203F00780073
-:10668000404311200000002105A20A60046085A09B
-:10669000020006606120004F0460BCD040005B43F4
-:1066A0001468FCD0C0005643EA606120404F780077
-:1066B0005943EE606120804F1F600F807F0C7C008B
-:1066C0001B7879007C001B7878007C001B786700C1
-:1066D0007C001B7864007C000920194F0C2186A1E6
-:1066E000000040007B4386A1010040007E431F70F4
-:1066F0000B00677001001B7847007C001B78F000DE
-:106700007C001F700A007C000920194F0C2186A113
-:1067100000004000964386A10100400093431F7093
-:106720000B00677001001B7847007C001F700A0097
-:106730007C001B78EF007C001B78F9007C001B7844
-:10674000F8007C001B78C9007C001B78C8007C0026
-:106750001868FCD04000AB431B681D006770010047
-:106760001B7847007C00307884A0C000C000D24372
-:1067700008788CC00A780500050005000500EC7853
-:1067800084A02100C000CF430120054F0420E4D0A5
-:10679000C000CD43047884A01FFF85A0E0000678E8
-:1067A00006A07C0008788DC00A787C0008788DC02F
-:1067B0000A787C00307884A04000C000D7430120D4
-:1067C000044F0420ECD04000E64384B2000378007C
-:1067D000E84384B200044000EE439800F24378009E
-:1067E000F043A800F243AC787C00087884A0FDFF59
-:1067F0000A780500050005000500EC7884A021005A
-:10680000400015447E000120044F0420ECD07F009E
-:1068100040000B4484B2000378000D4484B20004AD
-:106820004000134498000F4478001544A800134416
-:10683000AC787E00087885A002000A787F007C0092
-:1068400084A70100C000B93784A7700040002D4420
-:106850007E0C602D682F78102629782D682C7F0CEF
-:1068600084A7080040003A444B780800EC7884A0E4
-:1068700003004000B93778005D4384A7040040005E
-:106880006944B87884A00140400069444B7808000E
-:10689000EC7884A003004000B937E47884A00700B6
-:1068A00086A00100C0006944C07885A60048302059
-:1068B0005A7E1B78F9007C004B7808001868FCD0E1
-:1068C000400066441B681500F4D6400066441B680F
-:1068D0000700781069437C001B680300587884A087
-:1068E000003F1E682F680000336800004B780800E6
-:1068F000EC7884A003004000AF307E000120044FFC
-:106900000420ECD07F004000864484B2000378006D
-:10691000884484B2000440008E441800082A78009D
-:1069200090442800082A78000C41146B078384A047
-:106930000F00038003800380FCD34000A04480A0AC
-:1069400040547800A24480A0C053602048205A7070
-:10695000602A7C00200020000000200000002000B1
-:1069600000002000000020000000200000002000A7
-:106970000000200000002000000020000000200097
-:106980000000200000002000000020000000200087
-:106990000000200000002000620009001400140024
-:1069A0004898140014001499FD98140014008000F5
-:1069B000FF0000010204082080F818000AA2140059
-:1069C0000B300CA21400002513000025100010004D
-:1069D0001000100010001000100010001000100037
-:1069E000100010001000100000A2063802715F8035
-:1069F00081943988C420640856A80830C1281B9D9A
-:106A000001A20C30472861816A840080A484561852
-:106A10003A8808A8E228CB9CF3A8640844A80C3064
-:106A200001A80830E128CB9C21201DA805A20C87D5
-:106A3000DED8A064E06DC06FA463806C120205A272
-:106A40003D8842792080A1A42B8814183B88DF80E0
-:106A5000A1942770F28537A732A503F07685778653
-:106A600016A83E8814A8012012A804A2C064E06DF4
-:106A7000A067C06F42792080A1A41418DF80A19480
-:106A80003B8823707685778602A861783E886B20E4
-:106A9000C1281B9D44200321A2208120C3A807A256
-:106AA00004090EA209A803A20080A48572189A877F
-:106AB0003C88E21F01F608A26E856F8661711400A2
-:106AC00004070830CB9C140002A20080A485093082
-:106AD000A884E21944F86E853F88E608F5A861F8B5
-:106AE000EAA801F8140081F81600B285F08032950A
-:106AF000A2FAE21D1400328521F21400E21DA884DE
-:106B0000E0D6E61F1400083000804A281110FCA8C7
-:106B10000830339D008000A002281110FDA8399D87
-:106B2000BDA80830339D3B281110FDA809A20271B1
-:106B30005F80819417000C3009A20080A485E21DBB
-:106B400009A2C1DA1400100201A81400E0263A8755
-:106B5000A3FAF219E026F21814000BA214000DA2F9
-:106B600006381002259D040706A265687E812A84E6
-:106B7000C11D2388160042600880FAA80080A48402
-:106B800060812A8421F00830A884D6114270DD206B
-:106B90001100D420228816004479218420A032A537
-:106BA000A184160044792184DFA03295A1841600C7
-:106BB00000007E12D47084A00046048090200472ED
-:106BC00008709CC005A2C00002460C72FF82400003
-:106BD000ED45FF8AC0000246007284D2C000024622
-:106BE0000478CCD04000F3457810CC4A23700000E4
-:106BF00027700000007084D04000FD45077004003D
-:106C0000037008007F1200207C00007084A0030045
-:106C100002709CC684D040005B4608710500087075
-:106C200006A1C0000A4684A1030040008C4684A14E
-:106C3000E001C0008C46F4D1C0000A4684A10030B7
-:106C400086A0001040000A460120054F0420E4D031
-:106C500040003746112080010C71118240004546EA
-:106C60000870F4D0C0000A460C7006A140002A4605
-:106C700078002746112080010C71118240004546A2
-:106C80000870F4D0C0000A460C7006A140003A46D5
-:106C90000770120008710500087006A1C000474681
-:106CA00084A1030040008C4694D140004746F4D1B3
-:106CB00040008C460770020078000A460871FCD13B
-:106CC000400066467810ED47FF8A4000DC457800BA
-:106CD0005B460C708CA0FF0340009146047084D08A
-:106CE00040008346147005A0C0007F4610701073EA
-:106CF00006A3C0007346002305A04000834602A1FE
-:106D0000C8005B460770100078008C46FF8A400080
-:106D100091467810F249C000864640005B467810E4
-:106D200038477F1200207C00047208719CC10381E7
-:106D3000C800A04607700200780091460370080062
-:106D40007F1200207C0005A2C0008C46237000004A
-:106D500027700000037008007E000120014F04200E
-:106D6000CCD04000B2467810CC4A7F007F12002081
-:106D70007C002864FF844000E246702C0470BCA0B4
-:106D80000F00B8A7F2463C27FB87C000D04648005A
-:106D9000C8467810B2299C6075A04000E246780091
-:106DA000BB463920E746042768AE086830A60C6861
-:106DB00029A521844000E2463887042705A0C000A9
-:106DC000D1469C7075A0C000BB467C000000050049
-:106DD00009000D001100150019001D00000003003E
-:106DE00009000F0015001B0000000000E746E44604
-:106DF0000000000000800000E7460000EF46EC467F
-:106E00000000000000000000EF460000EA46EA46ED
-:106E10000000000000800000EA460000F046F04656
-:106E20000000000000000000F0467920004F7120B3
-:106E3000100007700A00077002000370010010784C
-:106E4000ECD0400026470920010071202000780086
-:106E50002A47092002007120500007700A000770BD
-:106E600002000370000009814000374771202000B4
-:106E700078002A477C0004700480C800C14708716C
-:106E8000087006A1C0003C4784A1E00140004947CA
-:106E9000781030487800E947077012001920000088
-:106EA0000871087006A1C0004D4784A1E0014000B0
-:106EB0005A47781030487800E9471078ECD0400005
-:106EC00074470120FD04042086A00300C000784719
-:106ED00084A1004040007C4782A30300C8007C4797
-:106EE00084A1040040004D47188378004D47147872
-:106EF000ECD0C0007C4784A10040C0004D479CA15D
-:106F00000C3086A304204000994786A30800400067
-:106F1000A447047084D0C00095470871087006A18A
-:106F2000C0008A4784A1030040009547780030489C
-:106F300086A30C20C0004D47007204824800A4477D
-:106F40000C7384A3FF034000A4477810B229087192
-:106F5000087006A1C000A44784A1E0014000B14729
-:106F6000781030487800E94707701200007084D02C
-:106F7000C000C1471073147005A34000C1470C71D5
-:106F800084A1FF03C00038470871087006A1C00043
-:106F9000C14784A1E0014000CE4778103048780016
-:106FA000E947077012000770080004709CD0C00009
-:106FB000D2470871087006A1C000D64784A1E0013D
-:106FC0004000E347781030487800E9470770120026
-:106FD000087103814800D647037008007C000871DF
-:106FE00084A1E001C0003048087184A1E001C00024
-:106FF000304884A107007900FA4704481448024841
-:10700000144802487248024870487810B229047047
-:1070100084A010008DC00670FF8AC0000F48492070
-:1070200000007C007810F249C0000F487C0004701A
-:1070300084A010008DC00670047084D0C000284861
-:107040000871087006A1C0001D4884A1030040001B
-:10705000284878003048FF8A40002F487810F249CD
-:10706000C0002B487C00077012000871E000334814
-:1070700091200060E0003748912000600770120006
-:107080000770080004709CD0C0003F4807701200D1
-:107090000871FCD1C000434803700000007005A0D7
-:1070A000C0005748047005A0C00057480C7005A0E8
-:1070B0004000594878003B484920000084B2000154
-:1070C000400063480120000078006548012001006D
-:1070D000781062421B680200512000007C0078108A
-:1070E000B2297810B2297810B948107214710C7056
-:1070F0009CA0FF03002800A311A289A10000781022
-:10710000B9480427582C60AC0863002222A30C6302
-:1071100000211BA3002405A340009548C800954802
-:10712000128410820A8389A10000602B78007C48B9
-:10713000602B078A7E0004609CD04000A048BAA75C
-:10714000EC467800A248BAA7E4467F003DA7002C91
-:1071500086688A6F926C8E6B0871087006A1C000F9
-:10716000A94884A1E0014000B44878103048077075
-:107170001200781038477C00508A3987042704A011
-:10718000C000CD48006064A0C000C448602D046009
-:1071900084A00F0080A002473C20FB874010B2294A
-:1071A0007C007E127E0DD47084A000460480902066
-:1071B0007F0D8468602088688C6B906C5780D4AA9F
-:1071C000FF0084A0FF007E00046884A008007F0008
-:1071D0004000EB48B8A0EC467800ED48B8A0E44683
-:1071E00084B200014000F448207E7800F548247EF7
-:1071F000B5A60C001C68B4D04000FC4885C600242D
-:1072000005A340002549582C0427046160AC0060A8
-:1072100000A41A70046001A31E709CD1400015499F
-:10722000106081A000002270146081A00000267010
-:107230000862002402A212700C62002303A21670DE
-:10724000027607700100602B78101C4A78002749ED
-:107250007810F249C00025497F1200207C007E1280
-:107260007E0DD47084A00046048090207F0D0770AE
-:107270000400047094D0C0003649037008007F12E7
-:1072800000207C007E127E0DD47084A00046048015
-:107290007E0090207F007F0D207E84B20001C00020
-:1072A0004F49247EB5A60C001C68ACD0C0005A49DA
-:1072B00085C6037000000770040028685020602D08
-:1072C0000460BCA00F00B8A7F2463C27FB87C000B3
-:1072D000704948006A497810B2299C6865A040004E
-:1072E000744978005D497810F249C00070497F12F6
-:1072F00000207C007E127E007E017E0DD47084A072
-:10730000004604807E0090207F00207E84B2000131
-:10731000C0008849247E7F0D7F037F04B5A60C0042
-:107320001C68B4D04000964985C603700000077001
-:10733000040049207749286855A07E0D4000EE4999
-:10734000702D602E0470BCA00F00B8A7F2463C2739
-:10735000FB87C000B3494800AC497810B2299C7043
-:1073600075A060204000EE4978009F49042768AE70
-:10737000086822A40C681BA34800CC49518AC000AD
-:10738000C0497810B2293887042705A0C000B44945
-:107390009C7075A060204000EE4978009F492284CF
-:1073A00020841A8399A300000869002422A10C6993
-:1073B00000231BA1C800DB497810B22984B2000168
-:1073C0004000E9490120044F0420ECD0C000E94905
-:1073D000712050007800EB49712020007F0D78006B
-:1073E000FC487F0D7F1200207C0008707E0084A086
-:1073F000E0017F004000FB4906A07C0084A0030060
-:1074000086A00300C000024A7C00042778AC007804
-:107410001A7004781E70087812700C781670046068
-:107420009CD04000144A107822701478267002769E
-:10743000047084A0100085C006707920004F388742
-:10744000518A4000404A042705A0C000324A9C608F
-:1074500005A04000414A6020046084A00F0080A085
-:10746000F2463C20FB874010B22908707E0084A0C1
-:10747000E0017F0040003C4A06A07800414A84A019
-:10748000030086A003007C00512000007C007E12D7
-:107490007E007E0DD47084A00046048090207F0D75
-:1074A0007F08087184A10300C000594A286805A01C
-:1074B0004000694A780002460871FCD14000614AE8
-:1074C0007810ED4778004E4A077010000871FCD123
-:1074D0004000634A7810ED47087086A00800C0009D
-:1074E0004E4A007005A0C0004E4A037000004920BB
-:1074F00000007E000478CCD040007D4A7810CC4A51
-:107500007F007F1200207C007E127E147E137E1589
-:107510007E0C7E0DD47084A00046048090207F0DE8
-:107520004920814A80AD1100A02084B200014000B2
-:10753000A44A0120044F0420ECD04000A04A992026
-:1075400031007800A64A992032007800A64A992096
-:1075500031000C7084A0FF032A68077008000770D0
-:107560000200037001004000B54A0080AC80A553C2
-:107570000C7084A0FF034000C14A0770040004702F
-:1075800084A00400C000BC4A7F0C492000000370A6
-:1075900000007F157F137F147F1200207C00146889
-:1075A000FCD04000114B007084D04000114B247E71
-:1075B000B5A6040007700400047084A00400C00095
-:1075C000D94A18717E011C717E0120717E012471DF
-:1075D0007E010EA01A711F70FF3F22712671137079
-:1075E000040016710276077001000120FFFF0920D8
-:1075F00031000A200A200871087006A1C000F84A6C
-:10760000FCD14000F84A7F0226727F0222727F027C
-:107610001E727F021A7207700200087086A00800AE
-:107620004000114B780030480770040003700000E0
-:107630007C009120008091200060AC7805A0C00003
-:107640002D4B7479D07006A1C0002D4B1C7805A07D
-:1076500040002D4B1F78000068002D4B912080408A
-:10766000307801803278C000B54B347832781078A9
-:10767000ECD0C000AE4B6120C0746920804FFDC7C4
-:10768000D06805A04000474B0180D268C000474B3E
-:107690007810834D006884A00F0040005C4B86A0EA
-:1076A000010040005C4B44680DA040005C4B04218D
-:1076B00005A040005C4B01800A204000F64C146895
-:1076C00005A04000814B01801668C000814BA7686F
-:1076D00001007E0FFCD7C000764B1078ECD0400044
-:1076E000724B792000017800784B792000027800F5
-:1076F000784B792000017810D3437F0F646805A090
-:107700004000814B78106F26806805A040008E4BAA
-:1077100001808268C0008E4B67680000D468DDC0BD
-:10772000D668D468FCD04000AB4BFCC0D668A9201A
-:107730000002346005A04000A74B01803660D46889
-:10774000FDC0D668C000A74B106005A04000A74B45
-:1077500078106F26E0AC1000F000964BFCD740008C
-:10776000B54B6120C0546920404FFCC778003D4BA9
-:107770007810F14B387801803A78C000D74B3C78CC
-:107780003A786120C0546920404FFCC70C6805A0BE
-:107790004000C94B78105B4CFCD7C000D74B107829
-:1077A000ECD0C000D74B6120C0746920804FFDC76A
-:1077B0007800C34B1478E4D0C000DB4B1078CCD0F9
-:1077C0004000EE4BACD0C000E74BA4D04000EE4BE5
-:1077D000ADC01278912001806800ED4B7810DC2359
-:1077E0007C00912001807C00407801804278C000BC
-:1077F0005A4C447842786920404FFCC71078792071
-:107800000002ECD04000034C79200001D86805A0AC
-:1078100040000F4CE07D04A5C0000F4CDA68D4682E
-:10782000BCC0D6687920004F106805A0C000174C76
-:107830000120010101801268FCD74000204C80A08B
-:10784000D0957800224C80A0C0944020042065A0F0
-:1078500040004C4C246005A04000484C018026604C
-:10786000C000484C006805A040003B4C4C6806AC8A
-:10787000C0003B4C7810F64C78004C4C646805A076
-:107880004000434C276001007800484C7810A94C18
-:1078900004287800244C0060402C7800244CFCD74D
-:1078A000C0005A4C1078ECD0C0005A4C6920804F70
-:1078B000FDC7792000017800034C7C0009200000FE
-:1078C000A920000208609CD04000954C246005A0CF
-:1078D00040006B4C018026607800934C08609CC08F
-:1078E00084D0C000734CACD040008D4C0A60046062
-:1078F00005A04000954C7E0D7E0C7E016820106036
-:10790000018012607810193E002D682C60207810DC
-:10791000A21E781064207F017F0C7F0D7800954CAB
-:10792000BDC00A608DA101007800954C8DA10001B9
-:10793000E0AC1000F0005F4C84A101004000A44CBA
-:107940008CA1FEFF0E6978106F267800A54C0E6999
-:107950007C00C000A54C6C78002C7E681467766FA4
-:10796000176000002B6000001B600600B46084A05C
-:10797000003F1E60206084A0FF0085A060002260A0
-:107980000060422078102B1E186805A04000C74CEC
-:1079900001801A680868A4C00A681068087909811B
-:1079A0000A790180D000D34C7810B2291268C00047
-:1079B000D94C1079A5C112792F6000003360000006
-:1079C000682C78107320FCD7C000E74C6920404F2A
-:1079D0007800E94C6920804F106984A100010120E2
-:1079E0000600C000F34C7A69012004007810632679
-:1079F0007C007E0D4C696021FCD7C000084D1078DA
-:107A0000ECD04000044D6920000178000A4D692047
-:107A1000000278000A4D69200001781026291B60B9
-:107A20000600586884A0003F1E60206084A0FF000C
-:107A300085A0480022602F600000336000000868C5
-:107A400084A0FDFF0A683068B4D040003C4D4B680C
-:107A50000400A9201400486894D040002E4DF00086
-:107A6000284D4B680900A9201400486884D04000C4
-:107A7000384DF000324DA920FA00F0003A4D1B6855
-:107A800047007F0D676807007C007920004F781061
-:107A9000764D78105C4D7810694D09200200692000
-:107AA000804F0F680000136800001768000009810C
-:107AB00040005B4D6920404F78004E4D7C001078AF
-:107AC000ECD04000644D1920CC007800664D1920A0
-:107AD0007B003A7B3E7B7C001478E4D0C000714D83
-:107AE000192040007800734D19202600427B467B08
-:107AF0007C001478E4D0C0007E4D1920943F7800BB
-:107B0000804D19202426327B367B7C00506A85A26A
-:107B100000004000AF4D5469C06B00A37E0C64218F
-:107B20000463FF83C0009B4D118240009F4D08817C
-:107B30001AA148008C4DC06978008C4DD3680A00AA
-:107B40007F0C7C005069C06A64222B6000002F60AB
-:107B500000000860B5C00A6010820981C000A14D14
-:107B600052697F0C7C00E000B04D91200060E00085
-:107B7000B44D91200060EC70DCD0C000C14DD4D079
-:107B80004000EA4D7800ED4D08201078ECD0400020
-:107B9000D44DC4D1C0000E4E1478C5C016781078EC
-:107BA000F5C01278ECD040000A4E7800064E8EAE3A
-:107BB00000014000E14D1478F5C0C5C01678D4D05E
-:107BC000C0000A4E7800064E1478FDC0C5C0167875
-:107BD000D4D0C0000A4E7800064EE4D040000C4ECF
-:107BE000E000ED4D9120006009200C00E000F34D15
-:107BF000912000600981C000F34DE47084A0FF0172
-:107C000086A0FF01C000044EEC707800C14D7810D2
-:107C10000F4E04788CD040000C4E1F680C00A070F2
-:107C2000A2707C001079ECD14000194E1478C4C0C9
-:107C3000F4C1127978002B4E8EAE00014000254E23
-:107C40001478F4C0FCD0C0002B4EC4C078002B4E7A
-:107C50001478FCC0F4D0C0002B4EC4C016787C0051
-:027C6000E3142B
-:00000001FF
-/*****************************************************************************
- * QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
- * Copyright (C) 2001 Qlogic Corporation (www.qlogic.com)
- *
- *****************************************************************************/
-
-/************************************************************************
- * --- ISP1240/1080/1280 Initiator Firmware --- *
- * 32 LUN Support *
- ************************************************************************/
-
-/*
- * Firmware Version 8.15.11 (10:20 Jan 02, 2002)
- */
diff --git a/firmware/qlogic/isp1000.bin.ihex b/firmware/qlogic/isp1000.bin.ihex
deleted file mode 100644
index a5c242cda220..000000000000
--- a/firmware/qlogic/isp1000.bin.ihex
+++ /dev/null
@@ -1,1158 +0,0 @@
-:1000000078003010000019240000FF124320504FE8
-:10001000525947495448312039392C313931323914
-:10002000312C39392C333931343951204F4C49472F
-:1000300020434F435052524F54414F49004E4920A4
-:1000400050533031303046207269776D72612065CF
-:100050005620726569736E6F30202E313133202047
-:10006000B9201212C120080071201000C3700400D2
-:10007000C920FF3F8920C810C7705349CB7020505A
-:10008000CF702020D3700100003FD67031203000A7
-:100090007920003563780000A02F09202703112064
-:1000A0000000A9204000A4420981C00051109B78A3
-:1000B00001010B7802000F7802004F78B80B69201D
-:1000C0004035A8006A101B683C0009201313B821B2
-:1000D00078006C101B682800076807000B68FA009E
-:1000E0000F680800136805001F68000023680600F9
-:1000F00017680800276800006920003611202000DA
-:10010000092010000B68190C0F681900036800DD46
-:1001100007681A001A6A002DE8A0080090A20400DF
-:100120000981C000821069208036A92080003768CC
-:1001300000000B684000176800011F686400E8AD0C
-:1001400010007000A510780097107810381A7810F9
-:100150003A2F781081167810BA33003285A00D003E
-:100160009020C37000009000BC10C07086A00200F8
-:10017000C000BC107810BA117810EC107810171865
-:100180007810A81978107D3278107D177800BC108F
-:10019000D010D210C31BC31B982F982FC31BC31B97
-:1001A0007800D0107800D2107800D4107800D610E3
-:1001B00008700C80C800E710077002008CA00C00CB
-:1001C000C000E81004800480C800E7107A087A09AB
-:1001D000C37002407800BD11147805A0C000F4106F
-:1001E0001000301178002F1109206835042105A076
-:1001F000C0002F11147886A00100C00001117810F2
-:1002000036151778000009206F35042165A04000DD
-:100210001D1109206A351C2108811421088104213F
-:1002200010A299A3000009201C008360030178102C
-:100230001116C00029117810781609206F350B208F
-:1002400000000920693504210B20000005A04000B2
-:100250002D11012005407800BC117800BA117C00F6
-:1002600061200000186084A00100400038117C006B
-:10027000C3700000C7700000CB700000CF7000009A
-:10028000C070BCA0C0FFC0008811382079004811A0
-:10029000BA110512D311051256125612CA11901531
-:1002A0006112C611D711D911DB11DD119515C611D7
-:1002B0006712831244158A15DF116B148D14A7146D
-:1002C000D0142414321446145A14EF12C6119F127B
-:1002D000A612AB12B012B612BB12C012C512CA12CD
-:1002E000CE12E312C611C611C611C611C611FB12F9
-:1002F00004131313391343134A1370137F138E130C
-:10030000A0130914C611C611C611C611C6111914BD
-:10031000BCA0A0FFC000C611382084A01F00790037
-:100320009111C611C611C611C611C611C611C6114A
-:10033000C611C611C611C611C611C611C611C61105
-:10034000C611C611C611C611C611C611C611C611F5
-:10035000C611C611C611ED15F715FB150916C61104
-:10036000C611CA72C671012006407800BC11CE7356
-:10037000CA72C67101200040C270612000001B607B
-:10038000010091200050912080407C00C37001400A
-:100390007800BD1199204100A1204100A92005004D
-:1003A000A3537800BA11C470C37004007A007800B7
-:1003B000BA117800BA117800BA117800BA119120F8
-:1003C0000080C3700000C7705349CB702050CF70BD
-:1003D0002020D3700100003FD670792000001B78E8
-:1003E00001003120300059200010292057045120ED
-:1003F000700461207204B920FFFFC1200000912029
-:1004000000509120804078005504D071C872CC73A0
-:10041000C470A020982031203000FF814000BA1124
-:10042000077004001A731E72512012004920341202
-:100430004120BA110370020086A70100C0002612F5
-:100440004920421241204E12037003001770000031
-:100450000B811271C8002E12177001000770010085
-:1004600086A70100400042120C7084A07F00048027
-:100470000920200002A142094A09A820A026A6536B
-:100480007800D8100C7084A07F0040004212AC802D
-:10049000480042129826A5537800D8100C7084A00A
-:1004A0007F00AC809826A5537800BA11C471C8703B
-:1004B00014219EA70400C0005E120A20CA727800B0
-:1004C000B911C7700100CB701F007800BA11C47059
-:1004D000C872CC73D074C670CA72CE73D27405A0C1
-:1004E00040007D12018072787A7A7E7B767C9878E3
-:1004F00084A0FCFF9A7878008112987885A001008A
-:100500009A787800BA11C470C872CC73D474C6706B
-:10051000CA72CE73D67405A0400099120180867805
-:100520008E7A927B8A7C987884A0FFFC9A787800F7
-:100530009D12987885A000019A787800BA11092058
-:1005400059350C21112010047800B81109204135CB
-:100550000C217800B911092042350C217800B9111D
-:10056000612040350C6110627800B81109204535D2
-:100570000C217800B911092046350C217800B911F9
-:10058000092047350C217800B911092048350C2184
-:100590007800B91108790C7A7800B811C471078114
-:1005A00084A00F00038003800380E8A00036006A67
-:1005B000046884A008004000E012086B7800E11293
-:1005C0000C6B7800B711C4777810921691200080D8
-:1005D0001C6B146A9120018008277800B711C4773A
-:1005E00078109216912000800869186A106B91208B
-:1005F00001807800B711C47182A11000C800B21147
-:100600007810BC1A7800B711C47182A11000C8001C
-:10061000B2111120413504227E0012217810751A82
-:100620007F017800B911C47111203113A92008008D
-:10063000042206A1400023131082700021137800C9
-:1006400018137800B21192A231137E0211204235A4
-:10065000042212217F017E007810811A7F01780028
-:10066000B911E803FA00F401EE0264001900320047
-:100670004B00612040350C611062C4700E60C87080
-:1006800012607800B811612040351461C4701660A2
-:100690007800B911C471112004001920121286A12A
-:1006A000280040006313112005001920121286A1B2
-:1006B000320040006313112006001920131386A195
-:1006C0003C00C000B2116120403518607E001A6104
-:1006D000B8237810921A7810BA337F017800B911D4
-:1006E000C47184A1CFFFC000B2111120473504228C
-:1006F00012217E007810B41A7F017800B911C471FC
-:1007000082A11000C800B2111120483504227E00D9
-:1007100012217810A31A7F017800B911C471C87230
-:1007200084A1FDFFC000B11184A2FDFFC000B11182
-:10073000002108790A7800220C7A0E787800B81126
-:10074000C471078184A00F00038003800380E8A0A8
-:10075000003619200000C87200687E0026A2400002
-:10076000CF13026A84A400204000B8139DA3100098
-:1007700084A400104000BE139DA3080084A4004080
-:100780004000CF130F8184A200404000CB137810AB
-:10079000D61A7800CF137810C81A7800CF13CC720D
-:1007A000FF8240000114086806A240000114A4A2C0
-:1007B000FF0061204035186186A128004000E81341
-:1007C00086A132004000EE1386A13C004000F413E5
-:1007D00082A464004800FE137800F81382A450003D
-:1007E0004800FE137800F81382A443004800FE136B
-:1007F000C471C6717F02CA727800B3110A6A9DA3E0
-:100800000A00046805A306687F020C6BC4717800B7
-:10081000B711C4777810921691200080146A1C6B6F
-:1008200091200180C8701668CC701E680827780077
-:10083000B711C471C872CC7382A11000C800B21184
-:100840007810E41A7800B711C477781092169120C6
-:100850000080086A95A202000A6A91200180082798
-:100860007800B811C4777810921691200080086A39
-:1008700094A2F9FF0A6A046805A0400041147810A8
-:10088000191A9120018008277800B811C4777810D0
-:10089000921691200080086A95A204000A6A0468F2
-:1008A00005A0400055147810191A912001800827DE
-:1008B0007800B811C477412001004920050051207B
-:1008C00020009120008078109F1691200180082739
-:1008D000086A7800B811C477C872CC73C677CA7238
-:1008E000CE7378101817C0008914186805A040004E
-:1008F000831408277810F41AC00083141778FFFFB8
-:10090000912001807C009120018001200540780029
-:10091000BC11912001807800BA11C477C6774120BC
-:1009200021004920050051202000912000807810EE
-:100930009F1661204035A3600300B667A7600000E2
-:100940001778FFFF912001807810191A7C00C87772
-:10095000CA77C477C677BCA700FF912000806120CA
-:100960004035A3600200A7600000B6671778FFFF5C
-:100970007810191A9120018041202100492004009B
-:10098000512010009120008078109F16C8703668A2
-:10099000388784A70700C000C414912001807C0020
-:1009A000987884A00300C000F4143920000041208E
-:1009B000210049200400512008007810921691204F
-:1009C000008008680DA80A6991200180388784A7F3
-:1009D0000700C000DD14BCA700FF3F8738873F87B2
-:1009E00084A7000FC000DD14912000806920000161
-:1009F000306884A0400040001D154B680400A92009
-:100A00001400486884A0040040000A1570000A150C
-:100A1000780001154B680900A9201400486884A0DB
-:100A20000100400017157000171578000E15A92059
-:100A3000FA0070001D157800191579200035177817
-:100A4000010061204035A3600100A7600000C36081
-:100A50000F00987885A002009A78086884A0FDFFAE
-:100A60000A681B684600912001807C00987884A069
-:100A7000FDFF9A7884A00100C0004015781060172F
-:100A8000C471C6714A797C00C474C873CC72C674D0
-:100A9000CA73CE72792000350920400078106F1695
-:100AA0004000861578103F1640005A1578107816C9
-:100AB000780086151060912001801778FFFF0920CB
-:100AC00068350B20050008810B20000008810A23EF
-:100AD00008810A2208810A2408810A2008810B2043
-:100AE000000008810A2C2EA030257E0E7810132FCE
-:100AF0007F0E9265A2659666A666AB600000AF6049
-:100B00000000912001807810191A7C00C370054004
-:100B10007800BD11C471C770000006797800BA1161
-:100B2000C471C671682178009715692000100C699E
-:100B300016A0042D10A2688D0981C000991585A208
-:100B40000000C000A715C37000407800A915C3704D
-:100B50000340CA707800BD11C471C872CC73002103
-:100B600084A1FCFFC000C61100217900B715CE1585
-:100B7000E315E515E715C3700340CE71D272D67345
-:100B80007800CA15C3700040CF700000D370000019
-:100B9000D7700000C677CA717800BA113120E91504
-:100BA000242630861224042246A4C000BB1584A447
-:100BB000FFFFC000D0153120E9151082198384A3EE
-:100BC000FFFFC000D0157800C2157800C21578006C
-:100BD000C2155555AAAAFFFF00006079C671C471FD
-:100BE00082A10300C800B21162797800BA1160795D
-:100BF000C6717800BA115479C671C47156795879A2
-:100C0000CA71C8715A795C79CE71CC715E797800FD
-:100C1000BA115479C6715879CA715C79CE7178006D
-:100C2000BA110C7084A07F0040001D1607700400EC
-:100C3000047084A00400C000181617700000127120
-:100C40001A721E7308810C81A981988CA120300032
-:100C50008060A220A6530C7885A000000270077067
-:100C6000010008710481C80031160770020084A1D8
-:100C70000C000C7184A10003037000007C000C7058
-:100C800084A07F0040004B1607700400047084A00D
-:100C90000400C00046161770000012711A721E730D
-:100CA000992030000881AC810C7885A00100027089
-:100CB0000770010008700C80C8005A160770020007
-:100CC0008CA00C00C0006C160C7184A10003C00045
-:100CD0006C16A02CA55306A0037000007C00507871
-:100CE00065A040007716042C5278632000007C0039
-:100CF0007E0F7920003550786220002C52787F0FCB
-:100D00007C0011200040527A192010041983400001
-:100D10008F1680A22F001220102078008616132034
-:100D200000007C0084A7000F0C8084A707000380CC
-:100D300003800380038005A1E8A080367C00781042
-:100D4000921600292A68002A2E68086884A0EFFFFE
-:100D50000DA80A6909204F350C21046805A0400040
-:100D6000BC1616A1C000BC166020006006687E019B
-:100D70000B2000007800BF16092000007E010468E7
-:100D800065A04000CE16006006687810DF16781067
-:100D9000CB17106801801268C000BF167F0102697E
-:100DA00006697C0065A04000DE1698609B6000002C
-:100DB00008207810781600217800D2167C00036095
-:100DC0000301A9201C0080AC0400A0200120000029
-:100DD000A440286816602C681E607C007E0E71207E
-:100DE000403540708CA08000C000FC1688A0803583
-:100DF0000A2D0080427006A07F0E7C007E0E7120BE
-:100E00004035092080354072218211824800161732
-:100E10000421088106ADC000051719811E21088133
-:100E200018831182C8000E17427406A07F0E7C0042
-:100E3000781092169120008004681E7865A040000A
-:100E40005F1778002917002C1E78006065A040000D
-:100E50005F170C6006A3C0002317086006A2C0003D
-:100E60002317282C01204F35042006AC40005F17C3
-:100E7000046806ACC000461700606020066805A044
-:100E8000C0004617036800007800501700641C7803
-:100E90006020026486A40000C0005017002C026885
-:100EA00060257810DF16176005001F60200078109D
-:100EB000CB171068018012680120FFFF05A07C009D
-:100EC0003920000041202100492004005120080061
-:100ED0009120008078109F16388784A70700C000F3
-:100EE0006A17BCA700FF3F8738873F8784A7000F9A
-:100EF000C0006A17912001807C006120000018600A
-:100F000084A00100C0008A17AC78AF78000005A06B
-:100F1000C0008B177C008CA0F0FF40009117781068
-:100F2000A51B79009317A317A517AB17AF17A31726
-:100F3000B317A317A317A317A317B917BD17A317A1
-:100F4000A317A317A3177810A51B7810601701200B
-:100F500001807800C317012003807800C3170120A7
-:100F600004807800C317781060170120068078008D
-:100F7000C31701200C807800C31778106017012078
-:100F80000D807800C317C270612000001B60010053
-:100F9000912080407C00042C8260082C632000009B
-:100FA000647800806678687805A06A794000DB176D
-:100FB000022C7800DC176E797C007E0C61200035F5
-:100FC00083680301082D6B20000064600080666068
-:100FD000686005A06A614000F017022D7800F117E3
-:100FE0006E617F0C7C0078100418400003187E0CA2
-:100FF000986065A04000FE177810D2167F0C9B60A9
-:101000000000781078167C006C7865A040001618F7
-:1010100091200080647801806678042C6E7805A0A9
-:10102000C00014186A780080912001807C009878B4
-:1010300005A0C00065187479D07005000500D07255
-:1010400006A2C0001C18002206A1C00033180478B4
-:1010500005A0400065180778000068006518912019
-:1010600080407800651878106F16400065187C7A0B
-:10107000787B07810480048010A299A300000920D6
-:10108000400078103F1640005C1878107816807881
-:101090000080827886A00200C00065189120008040
-:1010A000AF78020083780000987885A003009A78D2
-:1010B00091200180780065188378000078109219DB
-:1010C000006084A00700790066187C006E187D1807
-:1010D0009D186E18AF186E186E186E18392000041F
-:1010E000A87805A7AA78046005A706607810ED180F
-:1010F0001860A67878107A197C00A87884A000017E
-:101100004000841878006E18AB78000000600780FB
-:1011100084A0FF009E7801809B60000040009A1828
-:101120007810ED1840009A18A87885A00001AA78D8
-:1011300078009C18781011197C00A8788CA0000EFB
-:10114000C000A61884A00001C000A81878006E187E
-:101150007810ED18C000AE18781011197C00A8782E
-:1011600084A000014000B61878006E18AB7800002B
-:101170001067A9200100146084A0FF0005A04000B2
-:10118000D318BCA700FFA92008008EA001004000D2
-:10119000D31839200000A92080008EA00200400052
-:1011A000D3187800EA1878109216002D912000804C
-:1011B0002B6800002F680000086884A0DEFF0A6822
-:1011C000002D80A010006820912001807000EA1896
-:1011D0007800D618781078167C00A0786DA0C00032
-:1011E000F818002CA278A6789B60000078000419FB
-:1011F000002C9A689B600000A278002D0260A47801
-:1012000006ADC000041902609C7801809E78C00081
-:101210001019A87884A00000AA78A478602006A0FD
-:101220007C002EA03025186184A160009E614000E2
-:101230001D197E0E7810132F7F0E9265A26596669B
-:10124000A666AB600000AF600000106778109216D1
-:1012500091200080086884A0010040003F1991207F
-:1012600001807810DF16912000807810CB17912034
-:101270000180A3780000A778000078007919206029
-:1012800096A00100C000461900802260106A146810
-:101290009120018002A248005519400055193920BB
-:1012A000000278107A1978007919082C91200080B2
-:1012B000006865A040005D1902610269C000611903
-:1012C00006696021036000001068008012689120A8
-:1012D000018008688CA040004000731986A040007F
-:1012E0000A687810EE167810191AA7780000A3780B
-:1012F00000007C00046005A7066091200080781043
-:10130000CB1791200180A47865A040008D199860CA
-:10131000A6789B60000078007D19A3780000A7786C
-:1013200000007C007079747800800AA1C8009919C7
-:1013300006A07678D270047805A04000A719018035
-:101340000678C000A7196800A719912080407C008A
-:101350006800C219292000006C7865A04000BD1902
-:101360007810C3194000BD197E057810D9197F0582
-:10137000C000BD1928857800AC19FF854000C2194E
-:10138000912080407C00847B8879D4720500050020
-:10139000D47006A2C000C519002202A1C000D31952
-:1013A000002305A07C004800D71902A37C0002801E
-:1013B0007C0078100B1A09201C00246005A0400056
-:1013C000E31909204000781011164000FC199478A8
-:1013D0000080967886A00200C0000A1A9120008042
-:1013E000AF78030097780000987885A000039A787A
-:1013F0009120018078000A1A977800007810F3177E
-:101400008479887800800AA1C800071A06A08A7823
-:10141000D67006A07C00078104800480907A8C7BC3
-:1014200010A299A300007C0009206835912000805B
-:101430000A207E0F7920000109204035912000808C
-:10144000042186A00000C000341A092012350421AE
-:1014500005A0C000341A307884A0C000C000341A3F
-:101460001800341A1B784400912001807F0F7C0003
-:101470007E1291200023712040357920000119202F
-:10148000D82DA1202B01042305A04000501A9A78E2
-:101490001883AC2318839823A65318337800431A73
-:1014A0009B782000A9201000AF780000AF782002C0
-:1014B00070005C1A7800541A0370000078105B1BEF
-:1014C000047084A00F0085A0806206780F780092D7
-:1014D0004378D800537880000B78380047707F3508
-:1014E000437000007F1200207C008CA10F001120AF
-:1014F0000101042284A0F0FF05A1122078105B1BDB
-:101500007C0011200101A92009000B8170008A1ABA
-:101510007800851A8CA1000E042284A0FFF105A199
-:1015200012207C0009200101A9200500138270000F
-:101530009B1A7800961A94A2E000042184A01FFF51
-:1015400005A20A207C0011200101A9200C000B81BA
-:101550007000AC1A7800A71A8CA100F0042284A0B5
-:10156000FF0F05A112207C0011200201042284A09B
-:10157000CFFF05A112207C000381038080A0200002
-:101580007E0C612000019A60AC62AC637F0C7C0031
-:101590000381038080A022007E0C612000019A60FC
-:1015A000A46084A0DFFFAE607F0C7C000381038019
-:1015B00080A022007E0C612000019A60A46085A0BA
-:1015C0002000AE607F0C7C000381038080A020009F
-:1015D0007E0C612000019A60A460AE621020A460BD
-:1015E000AE6318207F0C7C00912000807E0C7E0E64
-:1015F000186805A04000391B6120803F7810411B0E
-:101600004000271BA92000006120803E7E0C78103E
-:10161000411B4000131B7F0C608C7000111B780075
-:10162000061B7800391B7F0082A0803E7120403568
-:10163000BA701C6085A000081E60B671A76000002B
-:1016400001200400A2707810141A7800351B712054
-:1016500040351C6085A000081E60B671A7600000C0
-:1016600001200600A2707810141A012000007800F2
-:101670003B1B012001009120018005A07F0E7F0C03
-:101680007C00042C05A04000581B60200C6006A3C1
-:10169000C000551B086006A2C000551B106006A1C3
-:1016A000C000551B06A078005A1B00607800421B42
-:1016B00085A001007C00112041350C228CA10F0077
-:1016C00011203B01042284A0000140006A1B21205C
-:1016D00080FF22217C007E0EE4688CA02000400068
-:1016E000A31B84A00600C000A31B1060078084A079
-:1016F0000F00038003800380F0A00036047084A0F4
-:101700000A00C000A31B087194A100FF4000A31BA6
-:101710008CA1FF000120190006A14000961B0120AA
-:10172000320006A140009A1B78009E1B0920200071
-:101730007800A01B09203F007800A01B11200000AA
-:10174000002105A20A707F0E7C006800A51B7E00A8
-:1017500071200000187084A00100C000AA1B7F0047
-:10176000082E71201000CA707F00C670C3700280FE
-:10177000712000001B700100912080407F007020CC
-:101780007F007800C11B7E107E007E129120002316
-:101790003C7F587E307C387D94A53F0084A4004077
-:1017A0004000D81B84A77C00C0009C2D7810A51B8E
-:1017B0009CA40F0082A304005000E01B7810A51B1E
-:1017C000078584A00F007900E51BEA1F9A20C0203E
-:1017D000E6226B25B325EA256526BF2644270B1C88
-:1017E000F51B531E1D1F4A25F51B7810A51B18005D
-:1017F000C81B7F12912001807F007F107C00037046
-:1018000000003F700000307005A04000091C3370DC
-:1018100000001800C81B5C7005A0C000B61CA070BA
-:1018200084A007007900141CD61C1C1C2A1C4B1C0D
-:10183000711C9D1C9B1C1C1C087884A0FDFF0A7851
-:101840000920460078101224C000281C03700400F0
-:101850007800F71B78105E2DC000491CB47007801B
-:101860009B787E00AA789B781000AB780C009B7860
-:101870006000AB7801005B7804000920F700781065
-:101880001024C000491C03700400C3700F003370A3
-:1018900070357800F71B78105E2DC0006F1CB47196
-:1018A00007819B787E00AA789B7810008CA10700A6
-:1018B0008DA1C000AA79AB7806009B786000AB7858
-:1018C00002005B7804000920F70078101024C000A3
-:1018D0006F1C03700400C3700F0033707035780004
-:1018E000F71B78105E2DC000991CB47107819B789E
-:1018F0007E00AA789B7810008CA107008DA1C00003
-:10190000AA79AB782000B871AA79AB780D009B78E2
-:101910006000AB7804005B7804000920F7007810C1
-:101920001024C000991C03700400C3700F003370B2
-:1019300070357800F71B78004B1C78105E2DC000C6
-:10194000F71BBC7068209B781000106F7810A12CDA
-:10195000502C106884A0070085A08000AA78186E1B
-:1019600041200100012004007800DE1D78105E2D6A
-:10197000C000F71B9B7810005C706820106F781017
-:10198000A12C502C086085A010000A60106884A06B
-:10199000070085A08000AA783120200041200100A6
-:1019A0007810C52D012003007800C91D1800C81B40
-:1019B000407485A400004000F01C80A080353020D9
-:1019C000447108812AA14800E71C09208035642160
-:1019D0000465FF85C000FD1C2184C000E11C467128
-:1019E000037000003F7000007800F71B4076B0A63F
-:1019F0008035447100267800EC1C46716825582516
-:101A00003E75502C346085A00000C000FA1C0867A9
-:101A1000367784A73F0140002F1D84A72100C00016
-:101A2000FA1C84A7020040001C1D84A7040040008B
-:101A3000FA1CBCA7FBFF0A6784A70800C000FA1CB9
-:101A400084A71000C000FA1C84A7000140002F1DCD
-:101A5000186005A0C000FA1CBCA7FFFE0A671F683B
-:101A60000000186E84A60E00186140003F1D1C6027
-:101A700002A14800421D4000421D7800F61CFF8173
-:101A8000C000F61C84A78000C000481D0C702260B6
-:101A9000BCA77FFF0A67106B078384A00F00038039
-:101AA0000380038080A00036602048204A700060D8
-:101AB0004E7004605270602A1800C81B9B7810009A
-:101AC00046A078105E2DC000F71B106B9CA307008A
-:101AD0009DA3C0004C7084A000804000731D84A6AC
-:101AE00001004000751D9CA3BFFF84A610004000AC
-:101AF0007B1D9DA32000AA7B408884A60E00C00009
-:101B0000861DBDA710000A677800C71D4C718CA107
-:101B100000084000022911202100048004804800B0
-:101B20009D1D11202200048048009D1D11202000D1
-:101B3000048048009D1D4000C71DAA7A4088781087
-:101B4000772D106A0C6108818CA1FF00E0A1803E16
-:101B5000642CFF8C4000BE1D106006A2C000A81DB2
-:101B6000B4600180B660C000A31D7E0C602A0860CE
-:101B700085A000010A607F0C7800D61C78105E2DCD
-:101B8000C000F71B602A0E61AA7940882E710120DF
-:101B900001007E00507184A118004000DD1D84A169
-:101BA00010004000D71D7810CC2AC000DD1D84A194
-:101BB00008004000DD1D7810E6297F0002708CA629
-:101BC0006000FF884000E61D8DA104005A79B269CB
-:101BD0009B7860000028AA789B786100146885A033
-:101BE00000801668AA787E157E137E14A1202C0131
-:101BF0009B7800000080AC8080AD0A009820A6533E
-:101C00007F147F137F15106807809B787E00AA7869
-:101C1000906DD67DDE7D946ED27EDA7E307884A0A3
-:101C2000C000C000151E98001D1E086084A0EFFFB4
-:101C30000A607810772D7800FF1B007284A20700DD
-:101C400086A00100C0002A1E1B7849007810772D5D
-:101C500078003B1EB06A95A200205A7A1B78490092
-:101C60007810772D0072002505A640003B1E84A247
-:101C700007007910491E80AD0800327084A2070069
-:101C800086A00100C000471E186000801A6078001E
-:101C9000F71B511EF030F030DF30F030511E511E76
-:101CA000511E7810A51B087884A0FDFF0A787E0FCE
-:101CB0007920003598787F0F84A001004000791EBC
-:101CC000A07086A00100C000681EA2707800011FED
-:101CD000A07086A00500C000771EBC706820176841
-:101CE0000400136800001C6885A008001E68A3702B
-:101CF00000007E1511200400A07186A101004000A3
-:101D00009B1E86A10700C0008B1E09202B350B20CF
-:101D1000050078009B1E0920133504210920123587
-:101D20000A2009202B350B200100A3700000A770AA
-:101D3000010078009D1EA37000007810C72EA92016
-:101D40001000392000007810A62BB8A70001700001
-:101D5000AB1E7800A31E007020207900AF1EDD1E90
-:101D6000C61EC61EB91EDD1EDD1EB71EB71E7810AC
-:101D7000A51B21205735042405A04000C61E06AD32
-:101D8000C000C61E006822207800D61E1C6884A0F1
-:101D90000100C000D21E106F7810A12C7810D92835
-:101DA0007800D61E5470602000680260166A1C68B5
-:101DB00085A008001E687810DD172120803F78106C
-:101DC000071F212057357810071FA9200000212068
-:101DD000803E7810071F20847000F01E7800E91EF6
-:101DE000A9208000612080361860106102A1126075
-:101DF0001B600000E0AC10007000001F7800F41EB3
-:101E00007F15037000003F7000007800F71B7E0410
-:101E1000042405A04000191F682000687E00166A8F
-:101E20001C6885A008001E687810DD177F00780008
-:101E3000091F7F04232000007C0082A203005000C1
-:101E4000231F7810A51B00237900261F291F9C1F24
-:101E5000AA1F82A2020040002F1F7810A51BA070AD
-:101E6000A3700000C37000007900361F3E1F3E1FA4
-:101E7000401F741F08293E1F741F3E1F7810A51BAA
-:101E8000B4777810A62BB477BCA7000F7810A12CDC
-:101E9000186005A040006B1F2120803F092004002E
-:101EA000112010007810C51F40006B1F7E15A9205F
-:101EB00000002120803E7E04092004001120100033
-:101EC0007810C51F7F0440006A1F208470006A1FBD
-:101ED00078005B1F7F15388784A70700C000461F66
-:101EE0007800FF1B7800FF1BB4777810A12C1860D6
-:101EF00005A040009A1F2120803F092005001120E5
-:101F000020007810C51F40009A1F7E15A9200000F0
-:101F10002120803E7E040920050011202000781039
-:101F2000C51F7F044000991F20847000991F78000E
-:101F30008A1F7F157800FF1B002279009F1FA21FB8
-:101F4000A41FA41F7810A51BA3700000A770010098
-:101F50007800F71B00227900AD1FB21FA41FB01F2D
-:101F60007810A51B78101F24007086A00100C00007
-:101F7000AF287810EF28086084A0EFFF0A6078107F
-:101F8000A2284000AF287800D61C042405A04000F9
-:101F9000E61F6820042D7E00106806A74000D41FAD
-:101FA000202D7F007800C61F7F00222016691C6844
-:101FB00005A21E687810DD171060018012600860AD
-:101FC00084A0EFFF0A607810EF287C0085A0010054
-:101FD0007800E51F00237900ED1FF21FF01F352068
-:101FE0007810A51BE47805A0D00015201800152056
-:101FF000082084A03000C00001201B784900780030
-:10200000F71BEC7884A003004000FD1F002184A092
-:10201000070079000B20232029201D201320582D94
-:10202000582D13202F207810A51B007005A040000C
-:10203000FF1B012003007800FA227810892B1B78FF
-:1020400055007800F71B7810892B1B78DC0078008E
-:10205000F71B7810892B1B78E3007800F71B7810AA
-:10206000892B1B789D007800F71B84A50F00C0000A
-:102070005F2078101F24007079003E2046205320F6
-:102080004620AF284820AF28462046207810A51BC0
-:10209000A071A370000086A10400C0005120780048
-:1020A00008297800AF287810EF28086084A0EFFF97
-:1020B0000A607810A2284000AF287800D61CE47887
-:1020C00005A0D000152018001520082084A030009D
-:1020D000C0006E201B7849007800F71BEC7884A0C4
-:1020E000030040006A20002184A1070079007820C5
-:1020F00088208E2082208020582D582D8020502D21
-:102100007810A51B7810912B1B7855007800F71BD1
-:102110007810912B1B78DC007800F71B7810912B3E
-:102120001B78E3007800F71B7810912B1B789D003B
-:102130007800F71B002379009D20A220A020A42076
-:102140007810A51B7800652617680800A3780000A2
-:10215000E47984A1300040006526EC7884A0030077
-:102160004000652684A107007900B620232029209D
-:102170001D20302D582D582DBE20502D7810A51B18
-:1021800082A205005000C6207810A51B002379000C
-:10219000C920CC20CE22DA2200227900CF20D42000
-:1021A000D620E920D420B3227810A51B9B781800F4
-:1021B000A87884A0FF0082A0200048006A2B8AA093
-:1021C0000400C8006A2B7900E5206A2B6A2B6A2B71
-:1021D0000C2B9B781800A87984A180004000FE2079
-:1021E00084A118004000FA2078006A2B007005A036
-:1021F000C000F420112003007800522784A1FF00C2
-:102200008AA01000C8006A2B790006211821162127
-:102210002E213021C2216A2B6A2BC4216A2B6A2B02
-:10222000AF22AF226A2B6A2B6A2BB1227810A51B32
-:1022300084A60010400025210120000300800080BA
-:102240003A781B789A007800F71B146884A0008005
-:1022500040002C21176803007800302D7810A51B52
-:102260001C691E6984A60018C0004A211C6884A04D
-:102270000100C0005221146886A00800C00042215D
-:102280001768000084A600044000BE211B78580097
-:102290007800F71B84A60010400052211B785800DC
-:1022A0007800F71B84A660004000BA2184A60008CD
-:1022B0004000BA2184A60080C000602178007A2105
-:1022C000B4A6FF7F5A7EB26E9B787400AC7AAC796C
-:1022D000AC781B80C8006D21008084A03F0008A15D
-:1022E00091A20000946B002102A3AE68906B0022C3
-:1022F00003A3AA6884A6004040008221B4A6FFBFC1
-:102300005A7EB26E007086A00300C0008F21781044
-:102310003A2F7810DF301B7867007800F71B06A093
-:1023200078109431AC6AA869946C906B002205A176
-:1023300040009E21002222A400211BA3D27CD67B38
-:10234000002305A4C000AC21B5A600405A7EB26EA1
-:102350001B7867007800F71B1B786700002215A127
-:10236000C000B6217810F0307800F71B78101D31CE
-:102370007800F71B1B786A007800F71B1B78580061
-:102380007800F71B7810A51B780021221C6984A116
-:1023900000014000DC218CA1FFFE1E697E0C48700C
-:1023A0006020006084A0FFEF0260046084A0F5FF5D
-:1023B00006607F0C7800102284A1000240001022E9
-:1023C0008CA1FFFD1E697E0C48706020006084A017
-:1023D000FFDF0260046084A0EFFF06600820482C45
-:1023E0007F0C84A108004000102278109D2C7810EA
-:1023F000E629FF88400010229B7860000028AA7818
-:10240000587EB5A604005A7E84A60004C0000C22A3
-:102410001B7855007800F71B1B7869007800F71BC4
-:10242000587E84A60004C00019221B78580078004A
-:10243000F71B1B786A007800F71B7800702B780078
-:10244000702B1920000090798CA1070040001F22FA
-:102450009B781000A87894A0FF0086A20100C0001D
-:1024600044220023A87C00A4182002A140003C22A2
-:1024700048003C2278003E227800C621A824A87A91
-:10248000F0003E2278002A2284A2F00086A02000DC
-:10249000C000A02218831883002302A14000542208
-:1024A0004800542278009D2286A2230040001F226B
-:1024B000186884A0F1FF1A68587E84A6F1FF85A0F1
-:1024C000100030205A7E086085A010000A607E0C43
-:1024D0004870602004600820482C7F0C84A1100004
-:1024E0004000782278109D2C7810CC2A7800872222
-:1024F0007E0C4870602004600820482C7F0C84A16A
-:1025000008004000102278109D2C7810E629FF88E2
-:10251000400010229B7860000028AA78B5A604002D
-:102520005A7E84A60004C00099221B7855007800CA
-:10253000F71B1B7869007800F71BA87A78002A221D
-:102540001883002302A14000A9224800A922780094
-:102550002A2284A28000C000762B7800702B78009D
-:10256000762B78006A2B9B781800A87884A0FF004F
-:102570008EA001004000BE227810A51BA87A94A26C
-:10258000FF00A87884A0FF008AA00400C8006A2B7E
-:102590007900CA226A2B39296A2B672A82A2000095
-:1025A000C000D4227810A51B7810892B1B786900F5
-:1025B0007800F71B82A20300C000E0227810A51B60
-:1025C0007810992B1B7869007800F71B82A2040011
-:1025D0005000EC227810A51B00237900EF22F22294
-:1025E000C923FA2386A203004000F8227810A51B15
-:1025F000012000003A70007084A0070079000023D9
-:1026000008230A230A2308253025D2240823082377
-:102610007810A51B84A60010C00012237810C72EC6
-:102620004000A32368788CA0FF0040005A2386A1B5
-:102630000800C00029237810EF28086084A0EFFF6D
-:102640000A607810A22840005A237810C72E78001C
-:10265000412386A12800C0005A237810C72E0860A5
-:1026600084A0EFFF0A60186005A0400041230180AC
-:102670001A6005A040004123018005A040004123CD
-:102680001E601C6884A001004000FF1B1C6884A021
-:10269000FEFF1E6854707E0C6020006802607F0C94
-:1026A0000460026805A0002DC00057230260066088
-:1026B0007800FF1B7E0178101F247F0184A600DFB5
-:1026C0001A6827680000106FFF814000A32386A1CD
-:1026D0000200C0009B2384A60008C000772384A6C4
-:1026E000600040007723D878DC7A2E682A6A178742
-:1026F00094A20F0013821382138290A2003690A23C
-:1027000000001C2284A30001C000882378008E23CF
-:102710001082042285A018001220118284A30004D4
-:1027200040009B239C6884A00001C0009B2378107C
-:1027300091247800FF1B86A118004000A32386A1E6
-:1027400014004000FF1B1269146884A00080400040
-:10275000AB23387016688CA600DF1A697810E02861
-:102760007810EF28C000B823086084A0EFFF0A604B
-:102770001C6884A00100C000C1237810D92878000B
-:10278000C52354706020006802607810DD1778005F
-:10279000FF1B82A204004800CF237810A51B002253
-:1027A0007900D223D623D823E523D8237810A51B7C
-:1027B000007086A005004000E1237810892B1B786B
-:1027C00069001B786A007800F71B90780780018009
-:1027D00084A0070080A018009A78A8798CA1FF0037
-:1027E00086A103004000F62378006A2B1B786A005C
-:1027F0007800F71B1C6885A004001E68FF82C000DB
-:1028000005247810892B78000C24118240000A24BA
-:102810007810A51B7810992B1B7869007800F71B9E
-:102820007810772D307884A0C000C0001C241800D8
-:102830001C241A7906A07C0085A001007C0084A6D7
-:102840006000C00029242F6800002B680000780079
-:10285000902484A60008C0003824B06884A00048F2
-:1028600035A684A60008C00038247810C72E7C0046
-:1028700084A6200040006224D0780380C80046244B
-:1028800006A078109431D4787810F93184A60040ED
-:10289000400050242F6800002B6800007800352489
-:1028A000B06884A0004835A684A60040C0004A2431
-:1028B000387005A0C0005C24D879DC7A2E692A6AB9
-:1028C0007800352484A6004040006C242F68000066
-:1028D0002B68000078003524B06884A0004835A635
-:1028E00084A60040C0006624387005A0C0007A2489
-:1028F0003B700700D879DC7AD078F380C800812457
-:10290000008084A03F0008A191A200002E692A6ADD
-:10291000002105A2C0008E2478003524781094315F
-:102920007C0084A3000240009924086085A0020076
-:102930000A6017680600286A2C693A6A3E692B68A3
-:1029400000032F6800003368002093680000976838
-:10295000200000707900AC24B424B624BF24B42431
-:10296000B424B424B424B4247810A51B1C6884A017
-:102970000100C000BF247810D9287800C524547005
-:10298000502C602000680260602A21205735042402
-:1029900005A04000CE2420207800C724222D6B20E3
-:1029A00000007C00B4777810A62BBCA7000F78102D
-:1029B000A12C186005A0400001257E0D0120903F4C
-:1029C00068207F0D2120803F092004001120100085
-:1029D0007810C51F400001257E15A9200000212088
-:1029E000803E7E0409200400112010007810C51FCD
-:1029F0007F04400000252084700000257800F12429
-:102A00007F15388784A70700C000D7247800FF1BF4
-:102A10007810E0287810EF28276800009B780E00D7
-:102A2000106F136802007810CA3184A600084000B5
-:102A30001D2518698DA100201A69146884A00080E2
-:102A40004000242517680000212057350068222007
-:102A5000386A3C692A6A2E697810DD177800FF1BF6
-:102A600078101F24276800009B780E00106F7810E4
-:102A70007C2D8CA0FF001269146884A000804000A7
-:102A80004325387016688CA600DF1A69A370000011
-:102A90007800FF1B06A07810C72E13680000176887
-:102AA00001008CA600DF1A69276800000070790019
-:102AB00059256125632563256525652565256125DE
-:102AC00061257810A51B7810EF28086084A0EFFF1F
-:102AD0000A607800BA28002379006E2571257325D5
-:102AE000B1257810A51B0070790076257E258025FC
-:102AF00080258B25802592257E257E257810A51B97
-:102B000084A60020C0008B25B5A600205A7E781030
-:102B1000F0307800302D146884A0008040009225A9
-:102B200017680700092018350C2186A10000400015
-:102B3000A72586A101004000AB2509202B350B20DD
-:102B40000B00A37001001B7846007800F71B1B7870
-:102B5000DD007800F71B09202B350B200A007800D8
-:102B6000F71B7810A51B00237900B625B925BB25D6
-:102B7000DE257810A51B00707900BE25C625C82566
-:102B8000C825D325C825DA25C625C6257810A51B56
-:102B900084A60020C000D325B5A600205A7E781058
-:102BA000F0307800302D146884A000804000DA25D1
-:102BB000176807001B78E4007800F71B1C6885A0E5
-:102BC00004001E68B5A600087810892B1B786900E0
-:102BD0007800F71B00237900ED25F025F225F42578
-:102BE0007810A51B7810A51B84A60004C00013262E
-:102BF0002B7809309B786000AB78000084A6FBFF3F
-:102C00005A78E47984A1200040000B26EC7884A057
-:102C10000300C0000F26012014007800FA2284A1CE
-:102C2000070079004B26907A94A207009B786000F9
-:102C3000A879FF81400049269B781000A87B84A3D7
-:102C40000100C0003A26A87BA87B86A30100C00033
-:102C50002D260920F7FF7800332686A30300C00045
-:102C60003A260920EFFF7E0C48706020046004A122
-:102C700006607F0C9B786000AB78000084A6FBFFA9
-:102C80005A782B7809301C698CA1FFFD8CA1FFFEBE
-:102C90001E697800302D2320292055265D265326D5
-:102CA00053265326302D7810A51B1C698CA1FFFDDF
-:102CB0008CA1FFFE1E697800382D1C698CA1FFFDD8
-:102CC0008CA1FFFE1E697800302DE47984A13000CC
-:102CD00040006F26EC7884A00300C00077261468BB
-:102CE00085A000801668012014007800FA2284A1D3
-:102CF000070079007B26302D302D8326302D582D6E
-:102D0000582D302D302D84A60004C000B4261C6838
-:102D100084A001004000382D8CA660208CA1FBFF10
-:102D20005A79B2699B786000AB7800009B786100AB
-:102D3000146885A000801668AA787E157E137E141C
-:102D4000A1202C019B7800000080AC8080AD0A009F
-:102D50009820A6537F147F137F15106807809B78F7
-:102D60007E00AA787800382D146884A00080400086
-:102D7000BB26176808001B78D8007800F71B0023D3
-:102D80007900C226C7264227C5267810A51B0070E9
-:102D900084A007007900CC26D426D626F226D42695
-:102DA000D426D224D426D4267810A51B1C698DA144
-:102DB00001001E690068066005A0C000E0260260F0
-:102DC000186884A00E004000EC261470B6682C71C0
-:102DD00088A1803E7800EE260920803F0421026809
-:102DE0000A2D5671B26E84A660004000402784A66A
-:102DF0000008C000042784A6FF7FB268906894682A
-:102E00007810C72E7800402784A62000400016279F
-:102E100006A078109431D0780380C8001227D478A7
-:102E20007810F931D879DC7A78001A277810AE2C2E
-:102E30007810943184A600804000402784A6FF7F4C
-:102E4000B2689B78740078107C2D102078107C2D4F
-:102E5000082084A62000C000382778107C2D1B8015
-:102E6000C8003327008084A03F0008A191A2000081
-:102E7000946B002102A3AE68906B002203A3AA68A2
-:102E80007800FF1B7800762B3370000082A20500CB
-:102E900050004C277810A51B002379004F2752279C
-:102EA0005C277F270022790055275A27762B5A273F
-:102EB000A827F9277810A51B007086A00100C00084
-:102EC00069277810EF287810C72E34700A607800D0
-:102ED0006E27007086A00300400063270370050082
-:102EE0000120903F68203E703270002279007827E0
-:102EF000762B7D27A8277D27762B7810A51B0070C1
-:102F000086A00100C0008C277810EF287810C72E0B
-:102F100034700A6078009127007086A0030040009A
-:102F20008627037005000120903F68203E703270B4
-:102F3000002279009B27A227A027A227A027A2274B
-:102F40007810A51B7810992B1B7869007800F71B67
-:102F5000007086A00100C000B5277810EF28781017
-:102F6000C72E34700A607800BA27007086A003006C
-:102F70004000AF2703700200807A94A2000F9B7874
-:102F80001800A87C84A4070015A26920803F042DA6
-:102F9000082D5671682005A04000D527106806A2AC
-:102FA0004000EE2700687800C82703700500012064
-:102FB000903F68203E7032707E15A9202F000320BC
-:102FC000000000807000E6277800DF277F15126A76
-:102FD000B36800071F68000823680300B06E5A7EBC
-:102FE0001C6884A0000C40004F287810912B7800BA
-:102FF0004F28007086A00100C00006287810EF2836
-:103000007810C72E34700A6078000B28007086A0F4
-:1030100003004000002803700200807A94A2000F91
-:103020009B781800A87C84A4070015A2A879A87929
-:103030008CA1FF00E8A1803E042D082D5671682068
-:1030400005A040002A28106806A240004328006816
-:1030500078001D28037005000120903F68203E7015
-:1030600032707E15A9202F00032000000080700020
-:103070003B28780034287F15126AB36800071F6860
-:10308000000823680300B06E5A7E1C6884A0000C00
-:1030900040004F2878108D2B587E78004F287E02F4
-:1030A000078284A00F0003800380038080A0003685
-:1030B00060204A7000604E700460527084A6600008
-:1030C00040008628946B906CA869AC6805A1C0008C
-:1030D0007428D27BDA7BD67CDE7CB4A6FFB75A7E1E
-:1030E0007810F03078008628AC681AA3002123A459
-:1030F000002405A340008628D27BDA7BD67CDE7CC8
-:10310000AC68B4A6FFBF5A7E78101D317F077810D7
-:10311000A12C09206A0084A60800400091280920FB
-:103120006900B5A600205A7E1A79002D3E700782EC
-:1031300084A00F0003800380038080A00036482015
-:103140007800F71B206005A04000AE2801802260B7
-:10315000086085A008000A60107026607C0006A048
-:103160007810C72E13680000176801001F68400020
-:103170001B680001007084A007007900BF28C728E1
-:10318000C928C928D528D128C728C728C728781012
-:10319000A51B7810E0287810D9287810DD17780062
-:1031A000FF1BA37000007800FF1B17680000780069
-:1031B0000825006805A0C000DE28026006607C00CB
-:1031C000106005A04000E9280180D000E9287810AF
-:1031D000A51B1260086084A0EFFF0A607C001860E5
-:1031E00005A04000F52801801A607C007810772D3A
-:1031F00017681800780026297810772D17681900AD
-:10320000780026297810772D17681A00780026296B
-:10321000B4777810A12CB8718CA1FF00E8A1803E92
-:10322000042D082D682005A0C00018297800FF1B78
-:103230001068B47206A240002029006878001129A5
-:1032400000680A2017680500BF7000007810E028A9
-:103250001C6884A00100C0002F297810D92878109C
-:10326000EF281B6800001F6820007810DD17780029
-:10327000FF1B82A20300C0006A2BA87DACA5FF0043
-:10328000A87EB4A6FF001C698DA180001E6984A1E0
-:103290000001400099298CA1FFFE1E69B4A6FF0021
-:1032A0004000832982A60F0048005A2940005A296D
-:1032B00031200F002B852B857810242C40006429A9
-:1032C0007810332A78008C297810DF2B7E0C602947
-:1032D000046084A0F5FF06607810572A7F0C1C69F3
-:1032E0008DA100011E69587EB5A604005A7E84A6F1
-:1032F0000004C0007F291B7855007800F71B1B785D
-:1033000069007800F71B7E0C6029046084A0F5FF3B
-:1033100006607810572A7F0C587E84A60004C000EF
-:1033200095291B7858007800F71B1B786A007800F5
-:10333000F71B7E0C4870602000618CA100104000DB
-:10334000D9290862178294A2FF0082A20F004800C8
-:10335000AD294000AD2911200F00002602A2C800AF
-:10336000B2293022086294A2FF00187086A02800BB
-:10337000C000C22982A21900C800C8291120190062
-:103380007800C82982A20C00C800C82911200C00AE
-:10339000002202A5C800CD2928227810E32B2B8516
-:1033A0002B857810242C4000D9297810332A7800F6
-:1033B000DD297810DF2B7810572A587885A0040073
-:1033C0005A787F0C1B7869007800F71B7E0C602907
-:1033D000006084A00010C000012A106084A00F00CB
-:1033E000C000FB298CA10200C000FB298CA1F5FFC5
-:1033F00006617F0C7C00112032001920000078004B
-:10340000232A086294A2FF00187086A02800C0003A
-:10341000112A82A21900C800172A11201900780069
-:10342000172A82A20C00C800172A11200C0008637A
-:103430001F839CA3FF0082A30F004800232A4000A3
-:10344000232A19200F00AB780100AB780300AB787A
-:103450000100AA7AAA7BC0A805001C6885A000010B
-:103460001E687F0C7C007E0C48716021082084A0BF
-:10347000F0FF35A6867E18609A78AE7E1266A47834
-:1034800084A0F8FF8CA1070005A1A67816608A78B1
-:10349000B4A60F0037860482048084A0FF0005A62E
-:1034A0000E60046084A0F5FF06607F0C7C007E0C3B
-:1034B0004870602018609A78A47884A0F0FFA678FD
-:1034C0001260847884A0F0FF86787F0C7C0082A252
-:1034D0000200C0006A2BA87A1C698DA180001E69B9
-:1034E00084A100024000AC2A8CA1FFFD1E6994A2B9
-:1034F000FF0082A20200C8006A2B7810F32A78101D
-:10350000572A80A901000C2078109D2C7810E629FC
-:10351000FF8840009F2A9B7860000028AA78587E88
-:10352000B5A604005A7E84A60004C0009B2A1B781E
-:1035300055007800F71B1B7869007800F71B587E50
-:1035400084A60004C000A82A1B7858007800F71B46
-:103550001B786A007800F71B82A20200C800B42A18
-:1035600084A201004000BE2A487188A100000C21FD
-:103570008CA10020C000BE2A112000007810D12BA1
-:103580007810F32A7810572A587885A004005A78C2
-:103590001B7869007800F71B7E0C7E0260290060B2
-:1035A0001120010084A00020C000E32A146084A040
-:1035B0004000C000E12A8CA1EFFF066106A0780060
-:1035C000F02A11200000AB780100AB780200AB7844
-:1035D0000300AA7AC0A804001C6885A000021E6827
-:1035E0007F027F0C7C007E0C48706020FF824000D0
-:1035F000FB2A11204000186080A002009A78A4786D
-:1036000084A0BFFF05A2A67816608A78046084A013
-:10361000EFFF06607F0C7C007E00007086A0030038
-:103620004000152B7F007800182B7F007800662B58
-:1036300084A620004000662B887884A040004000CB
-:10364000662BA87801804000252BB87B84A33F001F
-:103650001B83C8002C2B008005A040004D2B1B8332
-:10366000C800352B01804000622B06A078109431F1
-:10367000B4787810F9317800662B84A600404000B9
-:103680004D2BB8781B80C800462B008084A03F00DB
-:10369000C000622BB4A6FFBF5A7ED879DC7A012025
-:1036A000010008A1C800562B91A20000D279DA7956
-:1036B000D67ADE7A781094311B78670078105E3005
-:1036C0007800F71B1B7867007800F71B1B786A00EF
-:1036D0007800F71B78109D2B1B7869007800F71B8A
-:1036E0007810892B1B7869007800F71B236802008B
-:1036F0007810912B1C698DA120001E69146884A08C
-:1037000000804000852B176805001B786900780051
-:10371000F71B0120050078009F2B01200C0078008A
-:103720009F2B0120060078009F2B01200D007800C0
-:103730009F2B0120090078009F2B012007009B7818
-:103740007F00AA78B5A608005A7E7C007E073F87D6
-:10375000BCA70F003B873B870387E0A00036B8A7D4
-:1037600020009A7FA47984A10F004000BF2B84A180
-:10377000F0FFA6781260046085A008000660388714
-:1037800038879A7FA47984A140004000CF2B84A180
-:10379000BFFFA6781660046085A0100006607F0752
-:1037A0007C009B781000AB780100AB780200AB780E
-:1037B0000300AA7A9B786000AB7804007C0031207B
-:1037C0000000292032009B781000AB780100AB7814
-:1037D0000300AB780100AA7DAA7E9B786000AB78DD
-:1037E00005007C007E15078084A0FF000380038015
-:1037F00080A020009A78A4798CA1F0FF01204635A2
-:10380000042082A0280040000D2C2120842C1920A7
-:103810001400A9200C007800132C2120902C1920D2
-:103820001900A9200D0011206400042484A0F0FFD9
-:1038300006A14000222C2084002310A27000222C1C
-:103840007800152C7F157C007E151120463514223A
-:1038500082A232004800382C40003C2C2120762CDB
-:1038600019201100A9200E001120320078004C2CE4
-:1038700082A228004000442C2120842C192014000E
-:10388000A9200C0078004A2C2120902C1920190026
-:10389000A9200D0011206400002202A540005C2C2C
-:1038A00048005C2C2084002310A27000592C780062
-:1038B0004C2C7F1506A07C007F1582A56400C800F3
-:1038C000652C087885A070000A78EC7884A0000345
-:1038D0004000732C04249EA00112C000732C012010
-:1038E00001217800742C042405A07C000112023010
-:1038F0000232034203440454045605660568067800
-:10390000067A070A070C070E0232024202520262CE
-:103910000272056605760578057A057C057E057FC9
-:1039200002220232024202520454046404740476F5
-:103930000478047A047C047E047F9B78100046A0FF
-:103940007C0084A7000F0C8084A7070003800380FD
-:103950000380038005A1E0A080367C00D879DC7A62
-:10396000D0781B80C800B52C008084A03F0008A13F
-:1039700091A200007C007E0F7920000109204035D3
-:103980009120008004217900C52CF72CCF2CCF2C5E
-:10399000CF2CCF2CCF2CCD2CCD2C7810A51B4B7839
-:1039A0000400487884A00400C000D12C4B780800A3
-:1039B000487884A00800C000D82CB06885A00040DA
-:1039C000B268587885A000405A78307884A080008A
-:1039D000C000F72C1800F72C186884A02000C00045
-:1039E000F52C1B78DD007800F72C1B78E400912083
-:1039F00001807F0F7C007E0C1068078084A00F0080
-:103A0000038003800380E0A00036046084A00A00E5
-:103A1000C0002E2D086194A100FF40002E2D8CA126
-:103A2000FF000120190006A140001D2D01203200D9
-:103A300006A14000212D7800252D092020007800C6
-:103A4000272D09203F007800272D1120000000219C
-:103A500005A20A60046085A0020006607F0C7C005D
-:103A60001B786A007800F71B1B7869007800F71B49
-:103A70001B7858007800F71B1B7855007800F71B5F
-:103A80001B78DD007800F71B1B78DC007800F71B43
-:103A90001B78E4007800F71B1B78E3007800F71B25
-:103AA0001B789E007800F71B1B789D007800F71BA1
-:103AB000A37001001B7846007800F71B7E00307869
-:103AC00084A0C000C000752D087884A0FDFF0A788E
-:103AD0000500050005000500EC7884A021004000E9
-:103AE000752D087885A002000A787F007C00087890
-:103AF00085A002000A787C00307884A04000C000D5
-:103B00007C2D9800852DAC787C00087884A0FDFF82
-:103B10000A780500050005000500EC7884A0210066
-:103B20004000942D9800922DAC787E00087885A0F6
-:103B300002000A787F007C0084A770004000A82D56
-:103B40007E0C602D682F78106B1B782D682C7F0CF5
-:103B500017680300587884A0003F1A682F68000097
-:103B60002B6800004B780800E47805A0D0001520F1
-:103B700084A0200040001520EC7884A003004000C1
-:103B80001520180015207800702B7E0C1068078017
-:103B900084A00F0003800380038080A00036602093
-:103BA00048204A7000604E70046052707F0C7C00A8
-:103BB0002000200000002000000020000000200065
-:103BC0000000200000002000000020000000200075
-:103BD0000000200000002000000020000000200065
-:103BE0000000200000002000000020000000200055
-:103BF000000020006200090014001400479814001F
-:103C00001400F598E798140014008000BF0000012C
-:103C10000204082080F80AA214000B300CA2140041
-:103C200000A238887E812A84A08406383988C22878
-:103C3000C39C05A864083BA80830C128C39C01A206
-:103C40000C30472861816A840080A48456183A8821
-:103C500008A8E228A09CF3A8640829A80C3001A8B1
-:103C60000830E128A09C0D2804A2C064A067C06FA2
-:103C700014183B882370768577860FA86E783E8867
-:103C80000CA82B2805A2A064A067C06F14183B885D
-:103C900023707685778601A83E886920C128C39C59
-:103CA00044200321A2208120DCA807A2140003A243
-:103CB0000080A884A48572189A843C88E21F01F6CB
-:103CC00008A26E856F8604070830A09C140002A22B
-:103CD0000080A4850930A884E21948F87481EB8635
-:103CE000EB852E87A9873F88E608F1A861F8E8A848
-:103CF00001F8140081F81600B285F0803295A2FA1E
-:103D0000E21D1400328521F21400E21DA884E0D6E1
-:103D1000E61F140006A265687F812A84C11D2388DE
-:103D2000160042600880FAA80080A48460812A847A
-:103D300021F00830A884C61DD720228816000080F4
-:103D400048281110FCA80830008000A0022811109B
-:103D5000FDA887A808303D281110FDA809A217006A
-:103D60000C300080A485E21DC1DA1400E0263A87F9
-:103D7000A2FAF219E21F14000BA214000DA27E8118
-:103D80002A84A08406381002CD9C040700007E120D
-:103D9000912000224920C72E0070047205A20C72E7
-:103DA00015A2087084A0FDFF05A24000D92E78005E
-:103DB000DE2E037000007F1200207C00007084A0C3
-:103DC0000100C0000C2F08710481C800EB2E781090
-:103DD000A82F7800E32E0C708CA07F0040000C2FE1
-:103DE00004700480C800032F147005A0C000FF2ECB
-:103DF000107005A04000032F02A1C800E32E077039
-:103E0000100078000C2FFF8A40000C2F78106B31C7
-:103E1000C000062F4000E32E7810562F03700000DC
-:103E20007F1200207C002464FF844000302F702C1F
-:103E30003920352F042768AE0C6830A6086829A5FC
-:103E400021844000302F3887042705A0C0001B2F95
-:103E5000987075A04000302F3920322F78001A2F2B
-:103E60007C000000040008000C0010001400180082
-:103E70001C0000007E129120002279200035712064
-:103E8000100007700A000770020003700000712024
-:103E9000200007700A00077002000370000049202C
-:103EA0000000B37800007F1200207C004920562FCC
-:103EB00004700480C800822F077012000871087017
-:103EC00006A1C0005E2F84A1300040006B2F86A0A9
-:103ED0003000C0005E2F007084A00100C000822F5F
-:103EE000087084A00C00C000802F0C7184A1000316
-:103EF000C000802F84A17F00C000562F7800822F41
-:103F0000176803000770120007700800047084A08F
-:103F10000800C000862F0770120008710481480055
-:103F20008B2FB378000003700000492000007C0054
-:103F30007E107E007E127E1591200022087178107E
-:103F4000A82F7F157F12912001807F007F107C00B9
-:103F50000472182108710C7084A00003C000EA2FBD
-:103F600084A10C00C000EA2F1382138213821382F3
-:103F700084A200010DA10B810B810F8184A1070098
-:103F80007900C22FCC2FDC2FEA2FDC2FFE2FFE2F43
-:103F9000EA2FFC2F7810A51B07700200FF8AC000D3
-:103FA000D52F492000007800D92F78106B31C00040
-:103FB000D52FB37800007C0007700200FF8AC00094
-:103FC000E32F7800E72F78106B31C000E32FB37830
-:103FD00000007C00077002007810562F7810BB2C70
-:103FE000146884A000804000F72F176802007C004E
-:103FF0007810A51B7810A51B781050301072147122
-:104000000C709CA07F00002800A311A289A10000D1
-:10401000B07805A040001030B3780000780033304D
-:10402000781050300427582C60AC0C63002222A377
-:10403000086300211BA3002405A340002930C80009
-:104040002930128410820A8389A10000602B780035
-:104050001030602B078ABAA7322F3DA7002C826848
-:10406000866F8E6C8A6B077012007810562F7C005A
-:104070003887042705A0C0004430986005A04000A0
-:104080004D3060203920322F518A40004C3008706A
-:1040900084A0C00086A0C0007C00512000007C00ED
-:1040A000508A3987042704A0C0005D303920382F9A
-:1040B000006064A0C0005D30602D7C007E127E0D2B
-:1040C000912000227F0D806860208468886B8C6C52
-:1040D0005780D4AAFF0084A0FF00B8A0322F087E2A
-:1040E000B5A60C00186884A0400040007930B5A641
-:1040F00001007E0F7920000158787F0F84A04000D6
-:104100004000883084A60100C0008830B5A60100B8
-:1041100007700400047084A00400C0008A3000709E
-:1041200005A0400095307810A51B002405A3C00011
-:104130009B307800D830582C042760AC046000A471
-:104140007E001A70006001A31E700920FD04042186
-:1041500086A0FD047F00C000C83084A0010040009C
-:10416000C83084A60100C000C83013700100177069
-:104170000000027607700100B3780100A0A40100DE
-:1041800099A30000046000A41A70006001A31E70CF
-:104190000C62002402A212700862002303A21670AF
-:1041A000027607700100602B781038307800DA3022
-:1041B00078106B31C000D8307F1200207C007E1256
-:1041C0007E0D912000227F0D07700400047084A0F2
-:1041D0000400C000E630037008007F1200207C005D
-:1041E0007E127E0D912000227F0D4920F030077055
-:1041F0000400047084A00400C000F930007005A021
-:10420000400004317810A51B087EB5A60C00186884
-:1042100084A0400040000E31B5A60100246805A02E
-:1042200040001A3150203920352F602D78106B3125
-:10423000C00016317F1200207C007E127E007E01BD
-:104240007E0D912000227F0D7F037F04087EB5A69E
-:104250000C00186884A0400040003031B5A6010071
-:1042600049201D31246855A040006831702D602E12
-:104270003920352F042768AE0C6822A408681BA3D8
-:1042800048005531518AC00047317810A51B388746
-:10429000042705A0C0003B31987075A06020400045
-:1042A00068313920322F78003A31228420841A83F1
-:1042B00099A300000C69002422A1086900231BA116
-:1042C000C80064317810A51B712020007800883068
-:1042D0007F1200207C00087084A0C00086A0C0006F
-:1042E00040009331042708AC04211E70088104218A
-:1042F0001A700881042116700881042112707E0F43
-:104300007920000158787F0F84A0400040008E3152
-:1043100084A60100C0008E31B5A6010002760770A8
-:104320000100781038307C007E127E007E0D9120D6
-:104330000022492094317F0D7F08087184A1C000BC
-:10434000C000AA31246805A04000BA317800DE2EF2
-:104350007800BA3108710481C800B2317810A82FF2
-:1043600078009D310770100008710481C800B431D5
-:104370007810A82F087086A00200C0009D31007040
-:1043800005A0C0009D3103700000492000007F128D
-:1043900000207C007E127E147E137E157E0D9120FF
-:1043A00000227F0D4920CA3180AD1000A020992045
-:1043B00031000C7084A07F00266807700800077029
-:1043C0000200037001004000E8310080AC80A5537A
-:1043D00007700400047084A00400C000EA31492082
-:1043E0000000037000007F157F137F147F120020F0
-:1043F0007C007E127E007E0D912000227F0D4920E0
-:10440000F931806860208468886B8C6C5780D4AAEE
-:10441000FF0084A0FF00B8A0322F087EB5A60400DC
-:1044200007700400047084A00400C0001232582CED
-:10443000042760AC046000A41A70006001A31E7021
-:1044400013700100177000000276077001007F00F2
-:104450000780092031000A20A0002C320871077063
-:1044600002000C81C8002C320C81480039327800DF
-:10447000EA2FA0A4010099A300008A6B8E6C07703C
-:10448000040049200000037000007F1200207C001F
-:10449000A920100006A0048086808E81C8005132B9
-:1044A00000A2F0004C3286808E817C007E15A9200F
-:1044B000100005A0400077321AA1C800773213829D
-:1044C0008D8148006A321AA1C8006B32F0005F3259
-:1044D00078006F321AA108231082F0005F327E004C
-:1044E000003284A0FFF780207F007F157C007E00D3
-:1044F000003285A0000878007332E000BF329120BE
-:104500000060207801802278C000B93224782278B7
-:104510009120008069204035006884A00700400099
-:10452000A13286A002004000A13230680DA04000F8
-:10453000A132042105A04000A13201800A204000E0
-:104540006F3361208036A9208000346005A04000D0
-:10455000B33201803660C000B332106005A0400065
-:10456000B3327810191AE0AC10007000B93278003C
-:10457000A5327810D4327810C2327810F9329120F6
-:1045800001807C003C7801803E78C000D3324078C6
-:104590003E78487805A04000D33201804A78C000B8
-:1045A000D3327810191A7C00347801803678C00034
-:1045B000F8323878367891200080447805A0C00021
-:1045C000E332012001010180467880A0803E402036
-:1045D000042065A04000F832206005A04000F432BD
-:1045E00001802260400028330060402C7800E932CE
-:1045F0007C00287801802A78C00027332C782A781C
-:10460000307805A0C0000633012080000180327898
-:10461000038003800380038090A0803698A202006C
-:10462000042384A008004000273390A2090004223C
-:1046300005A040001F3301801220C000273304234F
-:1046400084A0F7FF85A080001A207810191A7C003A
-:1046500069204035006805A0400032333C6806AC54
-:1046600040006F3317600600B06084A0003F1A60FE
-:104670001C6084A0FF0085A060001E6000604220D6
-:104680001067B66F78109216186805A040004A337C
-:1046900001801A68086884A0EFFF0A68106801802A
-:1046A000D00054337810A51B12682F6000002B60D7
-:1046B0000000682C7810DD176920403501200600C5
-:1046C000A268447984A10001C0006A33BA6901205C
-:1046D0000400A2687810141A912001807C0009203F
-:1046E0004F3564216920000178106B1B17600600AC
-:1046F000586884A0003F1A601C6084A0FF0085A059
-:1047000048001E602F6000002B600000306884A00D
-:1047100040004000AB334B680400A92014004868F7
-:1047200084A00400400098337000983378008F33E1
-:104730004B680900A9201400486884A001004000CB
-:10474000A5337000A53378009C33A920FA007000CF
-:10475000AB337800A733086884A0FDFF0A681B68A4
-:104760004600092068350B2007004C784A789120D4
-:1047700001807C0079200035781003347810CB3329
-:104780007810E0337810F533337800004778000074
-:104790004B7800007C0019200A00112046350422C5
-:1047A00086A032004000DD3319200C00042286A0D0
-:1047B0003C004000DD33192008002A7B2E7B7C0062
-:1047C0001920300011204635042286A03200400016
-:1047D000F23319203900042286A03C004000F23355
-:1047E00019202700367B3A7B7C0019200D00112010
-:1047F0004635042286A03C004000003419200A00FF
-:104800003E7B427B7C001920AF2F112046350422CD
-:1048100086A032004000153419207139042286A088
-:104820003C004000153419202626227B267B7C0084
-:02483000A7924D
-:00000001FF
-/* Version 1.31.00 ISP1000 Initiator RISC firmware */
diff --git a/firmware/qlogic/sd7220.fw.ihex b/firmware/qlogic/sd7220.fw.ihex
deleted file mode 100644
index a33636319112..000000000000
--- a/firmware/qlogic/sd7220.fw.ihex
+++ /dev/null
@@ -1,513 +0,0 @@
-:10000000020A29020A87E5E630E6047F0180027FC2
-:1000100000E5E230E4047E0180027E00EE5F6008CD
-:1000200053F9F7E4F5FE80087F0A121731120EA289
-:1000300075FC08E4F5FDE5E720E70343F908220035
-:1000400001201100042000755101E4F552F553F52B
-:1000500052F57E7F04020438C2360552E552D3942D
-:100060000C4005755201D23690070C7407F0A3744A
-:10007000FFF0E4F50CA3F0900714F0A3F0750B204B
-:10008000F509E4F508E508D39430400302040412AE
-:100090000006150BE50870047F0180027F00E5096A
-:1000A00070047E0180027E00EE5F6005121871D23E
-:1000B0003553E1F7E5084509FFE50B25E025E02488
-:1000C00083F582E43407F583EFF085E220E552D32F
-:1000D0009401400D1219F3E054A064407003020330
-:1000E000FB53F9F8909470E4F0E0F510AF09121E9C
-:1000F000B3AF08EF4408F582758380E0F529EF443B
-:1001000007121A3CF5225440D39400401EE52954AE
-:10011000F070211219F3E04480F0E52254306508B4
-:1001200070091219F3E054BFF080091219F37440FA
-:10013000F00203FB121A127583AE74FFF0AF087E53
-:1001400000EF4407F582E0FDE50B25E025E0248182
-:10015000F582E43407F583EDF090070EE004F0EF4C
-:100160004407F582758398E0F528121A23400C1293
-:1001700019F3E04401121A320203F6AF087E00744C
-:1001800080CDEFCD8D82F583E030E00A1219F3E0E7
-:100190004420F00203FB1219F3E054DFF0EE44AE0A
-:1001A000121A4330E4030203FB749E121A0520E086
-:1001B000030203FB8F828E83E020E0030203FB1225
-:1001C00019F3E04410F0E5E320E708E508121A3AD5
-:1001D0004404F0AF087E00EF121A3A20E2341219FC
-:1001E000F3E04408F0E5E430E6047D0180027D00A0
-:1001F000E57EC3940450047C0180027C00EC4D60D9
-:1002000005C2350203FBEE44D2121A434440F00209
-:1002100003FB1219F3E054F7F0121A127583D2E0BF
-:1002200054BFF0900714E004F0E57E7003757E0182
-:10023000AF087E00121A2340121219F3E044011293
-:1002400019F2E05402121A320203FB1219F3E044CD
-:10025000021219F2E054FEF0C235EE448A8F82F5A4
-:1002600083E0F517548F4440F07490FCE508440790
-:10027000FDF5828C83E0543F900702F0E054C08D7E
-:10028000828C83F07492121A05900703121A197463
-:1002900082121A05900704121A1974B4121A0590E2
-:1002A0000705121A197494FEE5084406121A0AF595
-:1002B0001030E004D2378002C237E510547F8F82BD
-:1002C0008E83F0304430121A035480D394004004DB
-:1002D000D2398002C2398F828E83E04480F0121AB4
-:1002E000035440D394004004D23A8002C23A8F8231
-:1002F0008E83E04440F07492FEE5084406121A0A28
-:1003000030E704D2388002C2388F828E83E0547F77
-:10031000F0121E46E4F50A20030280033043031264
-:1003200019952002028003304203120C8F303006F0
-:10033000121995120C8F120D471219F3E054FBF0AD
-:10034000E50AC39401404643E1081219F3E044046E
-:10035000F0E5E420E72A121A127583D2E05408D39C
-:10036000940040047F0180027F00E50AC3940140AD
-:10037000047E0180027E00EF5E6005121DD78017AB
-:10038000121A127583D2E04408F00203FB121A120B
-:100390007583D2E054F7F0121E467F0812173174AD
-:1003A0008EFE121A128E83E0F51054FEF0E5104412
-:1003B00001FFE508FDED4407F582EFF0E51054FE7E
-:1003C000FFED4407F582EF121A11758386E04410A1
-:1003D000121A11E04410F01219F3E054FD4401FF29
-:1003E0001219F3EF121A3230320CE5084408F58284
-:1003F0007583827405F0AF0B1218D774102508F5B9
-:10040000080200850509E509D3940750030200821C
-:10041000E57ED3940040047F0180027F00E57EC327
-:1004200094FA50047E0180027E00EE5F6002057E39
-:1004300030350B43E1017F0912173102005853E1B7
-:10044000FE0200588E6A8F6B8C6C8D6D756E017517
-:100450006F01757001E4F573F574F57590072FF071
-:10046000F53CF53EF546F547F53DF53FF56FE56F93
-:10047000700FE56B456A12072A758380743AF08025
-:100480000912072A758380741AF0E4F56EC3743F6D
-:10049000956EFF120865758382EFF0121A4D1208EF
-:1004A000C6E533F01208FA1208B140E1E56F700BAF
-:1004B00012072A7583807436F0800912072A758323
-:1004C000807416F0756E0112072A7583B4E56EF01C
-:1004D000121A4D743F256EF582E43400F583E5333E
-:1004E000F074BF256EF582E434001208B140D8E400
-:1004F000F570F546F547F56E1208FAF583E0FE1241
-:1005000008C6E07C002400FFEC3EFEAD3BD3EF9D2F
-:10051000EE9C50047B0180027B00E57070047A0140
-:1005200080027A00EB5A6006856E46757001D3EF43
-:100530009DEE9C50047F0180027F00E570B40104B1
-:100540007E0180027E00EF5E6003856E47056EE5EA
-:100550006E647F70A3E5466005E547B47E0385467B
-:1005600047E56F7008854676854777800EC3747FB0
-:100570009546F578C3747F9547F579E56F7037E553
-:10058000466547700C757301757401F53CF53D8047
-:1005900035E4F54EC3E5479546F53CC313F57125A3
-:1005A00046F572C3943F4005E4F53D8040C3743F77
-:1005B0009572F53D8037E5466547700F7573017597
-:1005C0007501F53EF53F754E018022E4F54EC3E519
-:1005D000479546F53EC313F5712546F572D3943F12
-:1005E0005005E4F53F8006E57224C1F53F056FE54F
-:1005F0006FC39402500302046EE56D456C70028077
-:1006000004E574457590072FF07F01E53E6004E531
-:100610003C7014E4F53CF53DF53EF53F1208D27010
-:1006200004F00206A4807AE53CC3953E4007E53C11
-:10063000953EFF8006C3E53E953CFFE576D3957970
-:10064000400585767A800385797AE577C395785079
-:100650000585777B800385787BE57BD3957A403071
-:10066000E57B957AF53CF53EC3E57B957A900719D5
-:10067000F0E53CC313F571257AF572C3943F40054C
-:10068000E4F53D801FC3743F9572F53DF53F80143E
-:10069000E4F53CF53E900719F01208D27003F080A3
-:1006A000037401F01208657583D0E0540FFEAD3C71
-:1006B00070027E07BE0F027E80EEFBEFD39B74803C
-:1006C000F898401FE4F53CF53E1208D27003F08024
-:1006D000127401F0E508FBEB4407F5827583D2E064
-:1006E0004410F0E508FBEB4409F58275839EEDF0BC
-:1006F000EB4407F5827583CAEDF01208657583CC6B
-:10070000EFF022E5084407F5827583BCE054F0F071
-:10071000E5084407F5827583BEE054F0F0E508442F
-:1007200007F5827583C0E054F0F0E5084407F582D0
-:1007300022F0900728E0FEA3E0F5828E8322854216
-:100740004285414185404074C02FF58274023EF5D8
-:1007500083E542F074E02FF58274023EF58322E5D2
-:100760004229FDE433FCE53CC39DEC6480F87480D1
-:100770009822F583E0900722541FFDE0FAA3E0F5EC
-:10078000828A83EDF022900722E0FCA3E0F5828CC0
-:100790008322900724FFED4407CFF0A3EFF02285DA
-:1007A0003838853939853A3A74C02FF58274023E5B
-:1007B000F58322900726FFED4407CFF0A3EFF02248
-:1007C000F074A02FF58274023EF5832274C02511C7
-:1007D000F582E43401F5832274002511F582E434B6
-:1007E00002F5832274602511F582E43403F5832237
-:1007F00074802511F582E43403F5832274E0251119
-:10080000F582E43403F5832274402511F582E43443
-:1008100006F5832274802FF58274023EF58322AFA1
-:10082000087E00EF4407F58222F583E5824407F550
-:1008300082E540F02274402511F582E43402F5830C
-:100840002274C02511F582E43403F5832274002557
-:1008500011F582E43406F5832274202511F582E433
-:100860003406F58322E508FDED4407F58222E541D3
-:10087000F0E56564014564227E00FB7A00FD7C00A2
-:100880002274202511F582E434022274A02511F58A
-:1008900082E4340322853E42853F418F4022853CDD
-:1008A00042853D418F402275453F900720E4F0A3EB
-:1008B00022F583E532F0056EE56EC3944022F0E543
-:1008C000084406F582227400256EF582E43400F5B2
-:1008D0008322E56D456C90072F22E4F9E53CD39522
-:1008E0003E2274802EF582E43402F583E02274A067
-:1008F0002EF582E43402F583E0227480256EF582C1
-:10090000E43400222542FDE433FC22854242854145
-:100910004185404022ED4C60030209E5EF4E7037FF
-:10092000900726120789E0FD1207CCEDF09007280A
-:10093000120789E0FD1207D8EDF0120786E0541F78
-:10094000FD120881F583EDF0900724120789E05429
-:100950001FFD120835EDF0EF64044E703790072646
-:10096000120789E0FD1207E4EDF0900728120789CD
-:10097000E0FD1207F0EDF0120786E0541FFD1208AB
-:100980008BF583EDF0900724120789E0541FFD12C8
-:100990000841EDF0EF64014E70047D0180027D009E
-:1009A000EF64024E70047F0180027F00EF4D60789B
-:1009B000900726120735E0FF1207FCEF120731E01F
-:1009C000FF120808EFF0900722120735E0541FFFCE
-:1009D00012084DEFF0900724120735E0541FFF1264
-:1009E0000859EFF0221207CCE4F01207D8E4F01215
-:1009F0000881F583E4F01208357414F01207E4E47A
-:100A0000F01207F0E4F012088BF583E4F0120841CD
-:100A10007414F01207FCE4F0120808E4F012084D18
-:100A2000E4F01208597414F02253F9F775FC10E43D
-:100A3000F5FD75FE30F5FFE5E720E70343F908E52E
-:100A4000E620E70B78FFE4F6D8FD53E6FE80097850
-:100A500008E4F6D8FD53E6FE758180E4F5A8D2A837
-:100A6000C2A9D2AFE5E220E50520E602800343E11A
-:100A700002E5E220E00E9000007F007E08E4F0A393
-:100A8000DFFCDEFA020ADB43FA01C0E0C0F0C083FB
-:100A9000C082C0D0121CE7D0D0D082D083D0F0D09A
-:100AA000E053FAFE32021B55E493A3F8E493A3F655
-:100AB00008DFF98029E493A3F85407240CC8C33352
-:100AC000C4540F4420C8834004F456800146F6DF26
-:100AD000E4800B010204081020408090003FE47E77
-:100AE000019360C1A3FF543F30E509541FFEE49316
-:100AF000A360010ECF54C025E060AD40B880FE8CED
-:100B0000648D658A668B67E4F569EF4E7003021D9C
-:100B100055E4F568E5674566703212072A758390DB
-:100B2000E41207297583C2E41207297583C4E4120D
-:100B30000870702912072A758392E41207297583B9
-:100B4000C6E41207297583C8E4F0801190072612C5
-:100B50000735E41208707005120732E4F0121D55D3
-:100B6000121EBFE5674566703312072A758390E54C
-:100B7000411207297583C2E5411207297583C41202
-:100B8000086E702912072A758392E54012072975AD
-:100B900083C6E5401207297583C8800E9007261288
-:100BA000073512086E7006120732E540F0AF697E15
-:100BB00000AD67AC6612044412072A7583CAE0D3FD
-:100BC0009400500C0568E568C394055003020B14AB
-:100BD000228C608D611208DA7420400D2FF582742A
-:100BE000033EF583E53EF0800B2FF58274033EF55E
-:100BF00083E53CF0E53CD3953E403CE561456070C3
-:100C000010E9120904E53E120768403B120895807E
-:100C100018E53EC39538401D853E38E53E600585A4
-:100C20003F3980038539398F3A120814E53E12079F
-:100C3000C0E53FF0228043E5614560701912075F0F
-:100C4000400512089E802712090B120814E5421273
-:100C500007C0E541F022E53CC39538401D853C388E
-:100C6000E53C6005853D3980038539398F3A1208A6
-:100C700014E53C1207C0E53DF02285383885393946
-:100C8000853A3A120814E5381207C0E539F0227F98
-:100C900006121731121D23120E04120E33E0440AFD
-:100CA000F0748EFE120E04120E0BEFF0E52830E504
-:100CB00003D38001C3400575142080037514081206
-:100CC0000E0475838AE514F0B4FF05751280800662
-:100CD000E514C313F512E4F516F57F121936121355
-:100CE000A3E50AC3940150090516E516C394144000
-:100CF000EAE5E420E728120E047583D2E05408D315
-:100D0000940040047F0180027F00E50AC394014003
-:100D1000047E0180027E00EF5E6003121DD7E57F36
-:100D2000C394114014120E047583D2E04480F0E5A0
-:100D3000E420E70F121DD7800A120E047583D2E05B
-:100D4000547FF0121D2322748A850882F583E517EB
-:100D5000F0120E3AE4F0900702E0120E177583903D
-:100D6000EFF07492FEE5084407FFF5828E83E054AD
-:100D7000C0FD900703E0543F4D8F828E83F09007B3
-:100D800004E0120E17758382EFF0900705E0FFED87
-:100D90004407F5827583B4EF120E03758380E05427
-:100DA000BFF030370A120E91758394E04480F03022
-:100DB000380A120E91758392E04480F0E52830E401
-:100DC0001A20390A120E04758388E0547FF0203A05
-:100DD0000A120E04758388E054BFF0748CFE120E64
-:100DE000048E83E0540F120E03758386E054BFF027
-:100DF000E5084406120DFD75838AE4F022F582753C
-:100E00008382E4F0E5084407F582228E83E0F51042
-:100E100054FEF0E5104401FFE508FDED4407F582BE
-:100E200022E515C45407FFE508FDED4408F5827579
-:100E3000838222758380E04440F0E5084408F5820F
-:100E400075838A22E51625E025E024AFF582E43497
-:100E50001AF583E493F50D2243E11043E18053E159
-:100E6000FD85E11022E51625E025E024B2F582E4B7
-:100E7000341AF583E49322855582855483E515F071
-:100E800022E5E25420D3940022E5E25440D39400BA
-:100E900022E5084406F58222FDE508FBEB4407F550
-:100EA000822253F9F775FE3022EF4E70261207CCDE
-:100EB000E0FD90072612077B1207D8E0FD90072877
-:100EC00012077B120881120772120835E09007247E
-:100ED000120778EF64044E70291207E4E0FD9007D2
-:100EE0002612077B1207F0E0FD90072812077B12FD
-:100EF000088B120772120841E0541FFD900724125C
-:100F0000077BEF64014E70047D0180027D00EF6479
-:100F1000024E70047F0180027F00EF4D60351207A2
-:100F2000FCE0FF900726120789EFF0120808E0FFA7
-:100F3000900728120789EFF012084DE0541FFF12A6
-:100F40000786EFF0120859E0541FFF90072412079C
-:100F500089EFF022E4F553120E8140047F018002F4
-:100F60007F00120E8940047E0180027E00EE4F70E9
-:100F700003020FF685E11043E10253E10F85E11012
-:100F8000E4F551E5E3543FF552120E89401DAD5290
-:100F9000AF51121118EF600885E11043E140800B5A
-:100FA00053E1BF120E5812000680FBE5E3543FF5F3
-:100FB00051E5E4543FF552120E81401DAD52AF5140
-:100FC000121118EF600885E11043E120800B53E116
-:100FD000DF120E5812000680FB120E8140047F01C2
-:100FE00080027F00120E8940047E0180027E00EEA6
-:100FF0004F6003120E5B22120E21EFF012109122AD
-:1010000002110002104002109000000000000000D9
-:1010100001200120E4F5571216BD121644E4121007
-:10102000561214B7900726120735E4120731E4F080
-:101030001210561214B7900726120735E541120711
-:1010400031E540F0AF577E00AD567C00120444AF4E
-:10105000567E000211EEFF900720A3E0FDE4F55656
-:10106000F540FEFCAB56FA1211517F0F7D18E4F5E6
-:1010700056F540FEFCAB56FA121541AF567E0012F3
-:101080001AFFE4FFF5567D1FF540FEFCAB56FA2231
-:1010900022E4F555E508FD74A0F556ED4407F55733
-:1010A000E52830E503D38001C340057F28EF8004A5
-:1010B0007F14EFC313F554E4F9120E1875838EE014
-:1010C000F510CEEFCEEED394004026E51054FE127C
-:1010D0000E9875838EEDF0E5104401FDEB4407F5A5
-:1010E00082EDF0855782855683E030E301091E804A
-:1010F000D4C234E9C395544002D2342202000622FD
-:10110000303011901000E493F510901010E493F536
-:101110001012109012115022E4FCC3ED9FFAEFF56B
-:101120008375820079FFE493CC6CCCA3D9F8DAF60E
-:10113000E5E230E4028CE5ED24FFFFEF7582FFF578
-:1011400083E4936C70037F01227F00222211000050
-:10115000228E588F598C5A8D5B8A5C8B5D755E012F
-:10116000E4F55FF560F56212072A7583D0E0FFC4ED
-:10117000540FF561121EA585595ED3E55E955BE5BA
-:101180005A12076B504B1207037583BCE0455E1281
-:1011900007297583BEE0455E1207297583C0E045C7
-:1011A0005EF0AF5FE560120878120AFFAF627E0062
-:1011B000AD5DAC5C120444E561AF5E7E00B4030536
-:1011C000121E218007AD5DAC5C121317055E021183
-:1011D0007A1207037583BCE045401207297583BE68
-:1011E000E045401207297583C0E04540F0228E5843
-:1011F0008F59755A017901755B01E4FB12072A7555
-:1012000083AEE0541AFF120865E0C4135407FEEFE2
-:10121000700CEE6535700790072FE0B4010DAF3507
-:101220007E00120EA9CFEBCF021E60E55964024585
-:101230005870047F0180027F00E559455870047E94
-:101240000180027E00EE4F602385414985404BE5D9
-:10125000594558702CAF5AFECDE9CDFCAB59AA5870
-:10126000120AFFAF5B7E00121E608015AF5B7E002E
-:10127000121E60900726120735E549120731E54B2B
-:10128000F0E4FDAF35FEFC120915228C648D651269
-:1012900008DA403CE56545647010120904C3E53E78
-:1012A000120769403B1208958018E53EC395384007
-:1012B0001D853E38E53E6005853F39800385393917
-:1012C0008F3A1207A8E53E120753E53FF022803B14
-:1012D000E5654564701112075F400512089E801F86
-:1012E00012073EE541F022E53CC39538401D853CA0
-:1012F00038E53C6005853D3980038539398F3A12E0
-:1013000007A8E53C120753E53DF02212079FE53898
-:10131000120753E539F0228C638D641208DA403CE1
-:10132000E56445637010120904C3E53E1207694085
-:101330003B1208958018E53EC39538401D853E3820
-:10134000E53E6005853F3980038539398F3A1207BC
-:10135000A8E53E120753E53FF022803BE564456374
-:10136000701112075F400512089E801F12073EE5AC
-:1013700041F022E53CC39538401D853C38E53C6092
-:1013800005853D3980038539398F3A1207A8E53C38
-:10139000120753E53DF02212079FE538120753E587
-:1013A00039F022E50DFEE5088E544405F555751516
-:1013B0000FF582120E7A1217A320310575150380DE
-:1013C0000375150BE50AC39401503812142020311F
-:1013D0000605150515800415151515E50AC39401B4
-:1013E0005021121420203104051580021515E50A3C
-:1013F000C39401500E120E771217A3203105051564
-:10140000120E77E515B408047F0180027F00E51510
-:10141000B407047E0180027E00EE4F6002057F2249
-:10142000855582855483E515F01217A32212072AE9
-:101430007583AE74FF120729E0541AF534E0C41323
-:101440005407F53524FE602424FE603C24047063B8
-:1014500075312DE508FD74B612079274BC90072211
-:1014600012079574901207B37492803C75313AE577
-:1014700008FD74BA12079274C09007221207B6745E
-:10148000C41207B374C88020753135E508FD74B8FF
-:1014900012079274BEFFED4407900722CFF0A3EF2E
-:1014A000F074C21207B374C6FFED4407A3CFF0A3D4
-:1014B000EFF022753401228E588F598C5A8D5B8A39
-:1014C0005C8B5D755E01E4F55F121EA585595ED3E8
-:1014D000E55E955BE55A12076B5057E55D455C701C
-:1014E0003012072A758392E55E1207297583C6E5D7
-:1014F0005E1207297583C8E55E120729758390E59A
-:101500005E1207297583C2E55E1207297583C480C0
-:1015100003120732E55EF0AF5F7E00AD5DAC5C129A
-:101520000444AF5E7E00AD5DAC5C120BD1055E0283
-:1015300014CFAB5DAA5CAD5BAC5AAF59AE58021B81
-:10154000FB8C5C8D5D8A5E8B5F756001E4F561F5F7
-:1015500062F563121EA58F60D3E560955DE55C12B0
-:10156000076B5061E55F455E702712072A7583B6E9
-:10157000E5601207297583B8E5601207297583BAFB
-:10158000E560F0AF617E00E56212087A120AFF8022
-:1015900019900724120735E56012072975838EE438
-:1015A0001207297401120729E4F0AF637E00AD5FD2
-:1015B000AC5E120444AF607E00AD5FAC5E12128B75
-:1015C00005600215582290114DE49390072EF012F9
-:1015D000081F7583AEE0541AF5347067EF4407F5C1
-:1015E000827583CEE0FF1313135407F536540FD3DF
-:1015F0009400400612142D121BA9E536540F24FE48
-:10160000600C14600C146019240370378010021EE3
-:1016100091121E9112072A7583CEE054EFF0021D3D
-:10162000AE121014E4F555121D850555E555C39409
-:101630000540F412072A7583CEE054C7120729E04B
-:101640004408F022E4F558F559AF08EF4407F58255
-:101650007583D0E0FDC4540FF55AEF4407F5827549
-:1016600083807401F0120821758382E545F0EF4410
-:1016700007F58275838A74FFF0121A4D12072A75D6
-:1016800083BCE054EF1207297583BEE054EF1207C4
-:10169000297583C0E054EF1207297583BCE044101C
-:1016A0001207297583BEE044101207297583C0E034
-:1016B0004410F0AF58E559120878020AFFE4F558D3
-:1016C0007D01F559AF35FEFC12091512072A758305
-:1016D000B674101207297583B87410120729758320
-:1016E000BA74101207297583BC7410120729758308
-:1016F000BE74101207297583C074101207297583F0
-:1017000090E41207297583C2E41207297583C4E4A3
-:10171000120729758392E41207297583C6E412071C
-:10172000297583C8E4F0AF58FEE55912087A020A19
-:10173000FFE5E230E46CE5E754C064407064E5091D
-:10174000C45430FEE50825E025E054C04EFEEF54B9
-:101750003F4EFDE52BAE2A7802C333CE33CED8F907
-:10176000F5828E83EDF0E52BAE2A7802C333CE33BB
-:10177000CED8F9FFF5828E83A3E5FEF08F828E83AB
-:10178000A3A3E5FDF08F828E83A3A3A3E5FCF0C3A2
-:10179000E52B94FAE52A94005008052BE52B7002FE
-:1017A000052A22E4FFE4F558F556F5577482FC1239
-:1017B0000E048C83E0F510547FF0E5104480120E87
-:1017C00098EDF07E0A120E047583A0E020E026DE7C
-:1017D000F40557E55770020556E5142401FDE4337E
-:1017E000FCD3E5579DE5569C40D9E50A942050026C
-:1017F000050A43E108C231120E047583A6E05512B2
-:1018000065127003D23122C23122900726E0FAA37A
-:10181000E0F5828A83E0F541E539C395414026E54C
-:10182000399541C39FEE12076B40047C0180027C16
-:1018300000E541643F60047B0180027B00EC5B605B
-:101840002905418028C3E5419539C39FEE12076BF6
-:1018500040047F0180027F00E54160047E01800238
-:101860007E00EF5E600415418003853941853A4072
-:1018700022E5E230E460E5E130E25BE50970047FF7
-:101880000180027F00E50870047E0180027E00EE88
-:101890005F604353F9F8E5E230E43BE5E130E22EE6
-:1018A00043FA0253FAFBE4F510909470E510F0E56A
-:1018B000E130E2E7909470E06510600343FA0405BC
-:1018C00010909470E510F070E612000680E153FA73
-:1018D000FD53FAFB80C0228F54120006E5E130E090
-:1018E000047F0180027F00E57ED3940540047E01E1
-:1018F00080027E00EE4F603D855411E5E220E1322A
-:1019000074CE121A0530E7047D0180027D008F82BB
-:101910008E83E030E6047F0180027F00EF5D70156A
-:101920001215C674CE121A0530E607E04480F04363
-:10193000F98012187122120E44E51625E025E024E4
-:10194000B0F582E4341AF583E493F50FE51625E04B
-:1019500025E024B1F582E4341AF583E493F50E1200
-:101960000E65F510E50F54F0120E1775838CEFF02D
-:10197000E50F30E00C120E04758386E04440F080E1
-:101980000A120E04758386E054BFF0120E9175831F
-:1019900082E50EF0227F05121731120E04120E336B
-:1019A0007402F0748EFE120E04120E0BEFF0751519
-:1019B00070120FF72034057515108003751550123D
-:1019C0000FF72034047410800274F02515F51512F9
-:1019D0000E21EFF0121091203417E5156430600CE1
-:1019E00074102515F515B48003E4F515120E21EFDA
-:1019F000F022F0E50B25E025E02482F582E43407AF
-:101A0000F583227488FEE5084407FFF5828E83E0A3
-:101A100022F0E5084407F58222F0E054C08F828E60
-:101A200083F022EF4407F582758386E05410D39447
-:101A30000022F0900715E004F0224406F582758339
-:101A40009EE022FEEF4407F5828E83E022E49007B9
-:101A50002AF0A3F012072A758382E0547F12072927
-:101A6000E04480F01210FC12081F7583A0E020E013
-:101A70001A90072BE004F0700690072AE004F0901B
-:101A8000072AE0B410E1A3E0B400DCEE44A6FCEFCA
-:101A90004407F5828C83E0F532EE44A8FEEF44075C
-:101AA000F5828E83E0F5332201201100042000909E
-:101AB00000200F9200210F9400220F9600230F9810
-:101AC00000240F9A00250F9C00260F9E00270FA0D0
-:101AD000012001A2012101A4012201A6012301A8E4
-:101AE000012401AA012501AC012601AE012701B0A4
-:101AF000012801B400280FB640280FB8612801CB97
-:101B0000EFCBCAEECA7F01E4FDEB4A7024E508F58D
-:101B10008274B6120829E508F58274B8120829E51E
-:101B200008F58274BA1208297E007C00120AFF8030
-:101B300012900726120735E541F090072412073569
-:101B4000E540F012072A75838EE41207297401120A
-:101B50000729E4F022E4F526F52753E1FEF52A757E
-:101B60002B01F5087F0112173130301C901AA9E4BF
-:101B700093F510901FF9E493F510900041E493F56C
-:101B800010901ECAE493F5107F02121731120F5401
-:101B90007F03121731120006E5E230E70912100048
-:101BA00030300312110002004712081F7583D0E085
-:101BB000C4540FFD7543017544FF1208AA7404F064
-:101BC000753B01ED14600C14600B14600F2403705E
-:101BD0000B800980001208A704F080061208A77481
-:101BE00004F0EE4482FEEF4407F5828E83E5451251
-:101BF00008BE758382E531F002114C8E608F611250
-:101C00001EA5E4FFCEEDCEEED39561E56012076B25
-:101C1000403974202EF582E43403F583E07003FF2D
-:101C200080261208E2FDC39F401ECFEDCFEB4A7025
-:101C30000B8D421208EEF5418E40800C1208E2F541
-:101C4000381208EEF5398E3A1E80BC22755801E52F
-:101C500035700C1207CCE0F54A1207D8E0F54CE5D8
-:101C600035B4040C1207E4E0F54A1207F0E0F54C35
-:101C7000E535B401047F0180027F00E535B402043C
-:101C80007E0180027E00EE4F600C1207FCE0F54AF8
-:101C9000120808E0F54C85414985404B22755B01EF
-:101CA000900724120735E0541FFFD3940250048F8D
-:101CB000588005EF24FEF558EFC394184005755978
-:101CC000188004EF04F55985435AAF587E00AD598A
-:101CD0007C00AB5B7A00121541AF5A7E0012180AE5
-:101CE000AF5B7E00021AFFE5E230E70E121003C27E
-:101CF000303030031210FF203328E5E730E70512BB
-:101D00000EA2800DE5FEC394205006120EA243F9E8
-:101D100008E5F230E70353F97FE5F15470D39400FE
-:101D200050D822120E04758380E4F0E508440712AF
-:101D30000DFD758384120E02758386120E02758363
-:101D40008CE054F3120E0375838E120E0275839489
-:101D5000E054FBF02212072A75838EE412072974DF
-:101D600001120729E41208BE75838CE04420120892
-:101D7000BEE054DFF07484850882F583E0547FF080
-:101D8000E04480F022755601E4FDF557AF35FEFCC6
-:101D9000120915121C9D121E7A121C4CAF577E00A0
-:101DA000AD567C00120444AF567E000211EE75560B
-:101DB00001E4FDF557AF35FEFC120915121C9D120A
-:101DC0001E7A121C4CAF577E00AD567C00120444A4
-:101DD000AF567E000211EEE4F516120E44FEE50841
-:101DE0004405FF120E658F828E83F00516E516C33B
-:101DF000941440E6E508120E2BE4F022E4F558F5C1
-:101E000059F55AFFFEAD58FC1209157F047E00AD4E
-:101E1000587C001209157F027E00AD587C00020933
-:101E200015E53C253EFCE5422400FBE433FAECC317
-:101E30009BEA12076B400B8C42E53D253FF5418F35
-:101E4000402212090B227484F5188508198519821D
-:101E5000851883E0547FF0E04480F0E04480F02275
-:101E6000EF4E700B12072A7583D2E054DFF0221276
-:101E7000072A7583D2E04420F02275580190072686
-:101E8000120735E0543FF541120732E0543FF54068
-:101E900022755602E4F557121DFCAF577E00AD5671
-:101EA0007C00020444E4F542F541F540F538F5398B
-:101EB000F53A22EF5407FFE5F954F84FF5F9227F80
-:101EC00001E4FE0F0EBEFFFB2201200001042000F2
-:101ED0000000000000000000000000000000000002
-:101EE00000000000000000000000000000000000F2
-:101EF00000000000000000000000000000000000E2
-:101F000000000000000000000000000000000000D1
-:101F100000000000000000000000000000000000C1
-:101F200000000000000000000000000000000000B1
-:101F300000000000000000000000000000000000A1
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F70000000000000000000000000000000000061
-:101F80000000000000000000000000000000000051
-:101F90000000000000000000000000000000000041
-:101FA0000000000000000000000000000000000031
-:101FB0000000000000000000000000000000000021
-:101FC0000000000000000000000000000000000011
-:101FD0000000000000000000000000000000000001
-:101FE00000000000000000000000000000000000F1
-:101FF000000000000000000001201100042000810A
-:00000001FF
diff --git a/firmware/r128/r128_cce.bin.ihex b/firmware/r128/r128_cce.bin.ihex
deleted file mode 100644
index 4831315d7b99..000000000000
--- a/firmware/r128/r128_cce.bin.ihex
+++ /dev/null
@@ -1,129 +0,0 @@
-:1000000000000000108038000000000010003800E0
-:10001000000000020000008E0000000200000091BD
-:1000200000000000402E2423000000006062124FF8
-:10003000000000002E2B596D000000007677753E01
-:1000400000000000898984820000000023BC8B0D21
-:10005000000000002323232300000000238DABB405
-:1000600000000000232323230000000100B028002B
-:100070000000000100032800000000010004C0008F
-:100080000000000100030800000000023660300E8E
-:100090000000000B00040000000000000000000051
-:1000A000000000010200151D0000000100001D0EEF
-:1000B00000000001000039D900000001000019D73C
-:1000C0000000000C0000001C00000001000019D618
-:1000D0000000000C0000001C0000000200000017DF
-:1000E0000000000B01200000000000000100358A24
-:1000F0000000000100064000000000090000001E92
-:100100000000000108D015B4000000101910100004
-:100110000000000300002000000000000000280094
-:1001200000000001000308000000000100003D0E77
-:10013000000000010000C8000000000A0000882A3A
-:10014000000000090000002A000000010200150F55
-:1001500000000002000028240000000100003D65AE
-:100160000000000100003D66000000020000002BBE
-:100170000000000100F32DB4000000012200D8BFF0
-:100180000000000100E088BF0000000C1333383786
-:1001900000000001020615650000000C0000003799
-:1001A00000000001020015640000000100003D662F
-:1001B000000000020000002E000000040020083AA9
-:1001C0000000000100080800000000010006C0FF58
-:1001D000000000040040003D000000010007C800CE
-:1001E00000000001000700FF000000030000000005
-:1001F0000000000C0000005C000000020000002E67
-:100200000000000C000000B00000000100003D767E
-:100210000000000100032800000000010000480069
-:1002200000000001000208000000000106001D0E91
-:1002300000000001000248000000000100028800E8
-:100240000000000100F3C5F80000000100100000EC
-:10025000000000060030004E0000000100003D6379
-:100260000000001080303DF0000000021000384314
-:1002700000000002000028430000000C000000B055
-:100280000000000100003D760000000100003D7705
-:100290000000000100003D0E0000000100003D0FC5
-:1002A000000000010050280000000006003000524D
-:1002B0000000001080303DF00000000100003DF81B
-:1002C00000000002000000520000000100053D0E89
-:1002D0000000000100103D0F00000002003000553A
-:1002E0000000000100003D700000000100001E89B8
-:1002F0000000000100003D710000000300003D729D
-:100300000000000C0000005C000000020000006221
-:100310000000000100003F280000000100003F270E
-:100320000000000100003E820000000100003E8845
-:100330000000000100003E660000000100003E6772
-:100340000000000100003E760000000100003E6851
-:100350000000000100003E690000000100003E6C4A
-:100360000000000000003E6D0000000100002800B9
-:1003700000000001005028000000000100003D685E
-:100380000000000100030800000000060000006EED
-:10039000000000010002C0000000000106303D62C4
-:1003A0000000000200000070000000020030006F3A
-:1003B00000000000200038C0000000010001C0C0A3
-:1003C0000000000E0000007D0000000C0003287FEC
-:1003D00000000001020015BB0000000C00030880B3
-:1003E0000000000002003DBC0000000100003DBB19
-:1003F0000000000000003DBC00000003000480007D
-:100400000000000100048000000000030006C0029C
-:100410000000000100B0280000000000306038003B
-:100420000000000100C028000000000100B008002A
-:100430000000000100D600000000000712801086B6
-:10044000000000000000280000000001000039CC7E
-:1004500000000001000039CD00000001000039C992
-:1004600000000001000039CA00000000000039CB84
-:10047000000000011003B80000000001009000001F
-:100480000000000110003800000000010003080017
-:100490000000000100903D1B0000000140203D0ACB
-:1004A0000000000140203D0B00000001000880001A
-:1004B000000000010001C0C00000000E0000009F0D
-:1004C0000000000C000308800000000142203DBD38
-:1004D0000000000C0003087F0000000142003DBB4B
-:1004E0000000000C000308800000000142203DBC19
-:1004F00000000002000000A20000000140203DBDFD
-:100500000000000140003DBB0000000140203DBC58
-:1005100000000001000840000000000100A00000F1
-:1005200000000006003000A6000000101060380037
-:1005300000000009000000A80000000300400000C7
-:100540000000000300403D1D00000000000000000E
-:1005500000000000000001000000000E000000AEDE
-:10056000000000010001C0A900000001020015C741
-:100570000000000C000000B0000000000000280097
-:10058000000000010001C0AA00000001020015D215
-:10059000000000010001C0A900000003020015C70F
-:1005A0000000000100003E88000000010001C0BA08
-:1005B0000000000102001728000000010001C0BB7C
-:1005C000000000010200165A0000000000003E5B1F
-:1005D000000000000000010000000000000010000A
-:1005E000000000010006400B00000009000000BCF4
-:1005F00000000000000028000000000000000000D3
-:1006000000000000000000000000000000000000EA
-:1006100000000000000000000000000000000000DA
-:1006200000000000000000000000000000000000CA
-:1006300000000000000000000000000000000000BA
-:1006400000000000000000000000000000000000AA
-:10065000000000000000000000000000000000009A
-:10066000000000000000000000000000000000008A
-:10067000000000000000000000000000000000007A
-:10068000000000000000000000000000000000006A
-:10069000000000000000000000000000000000005A
-:1006A000000000000000000000000000000000004A
-:1006B000000000000000000000000000000000003A
-:1006C000000000000000000000000000000000002A
-:1006D000000000000000000000000000000000001A
-:1006E000000000000000000000000000000000000A
-:1006F00000000000000000000000000000000000FA
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
diff --git a/firmware/radeon/R100_cp.bin.ihex b/firmware/radeon/R100_cp.bin.ihex
deleted file mode 100644
index 151647b04fc4..000000000000
--- a/firmware/radeon/R100_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:1000000000000000210070000000000020007000CF
-:1000100000000004000000B400000004000000B86C
-:10002000000000006F5B4D4C000000004C4C427F14
-:10003000000000005B568A92000000004CA09C6DFE
-:1000400000000000AD4C4C4C000000004CE1AF3D06
-:1000500000000000D8AFAFAF00000000D64C4CDC71
-:10006000000000004CD10D1000000016000F000031
-:1000700000000000362F242D0000000400000012B4
-:1000800000000016000F000000000000362F282D91
-:1000900000000002000380E70000000204002C972B
-:1000A00000000016000F000100000000333A373056
-:1000B00000000002000077EF0000000200061000C0
-:1000C0000000001A000000210000001E0000400097
-:1000D00000000002000610000000001A00000021CD
-:1000E0000000001E0000400000000002000610009A
-:1000F0000000001A000000210000001E0000400067
-:100100000000000400000017000000020003802B24
-:1001100000000002040067E0000000040000001777
-:1001200000000002000077E000000002000650001E
-:1001300000000002000037E100000006040067E153
-:1001400000000002000077E000000002000077E1FC
-:1001500000000006000077E100000000FFFFFFFF45
-:100160000000000010000000000000020003802BCF
-:1001700000000006040067E0000000020000767541
-:100180000000000200007676000000020000767792
-:100190000000000600007678000000020003802CBA
-:1001A00000000002040026760000000200007677BE
-:1001B0000000000600007678000000180000002F04
-:1001C000000000180000002F0000000600000000E2
-:1001D000000000180000003000000018000000308F
-:1001E0000000000600000000000000020160500056
-:1001F000000000020006500000000002000980001C
-:1002000000000002000610000000000464C0603E10
-:1002100000000002000380E600000002040025C583
-:1002200000000016000800000000000000000000B0
-:10023000000000020400251D00000002000075807F
-:100240000000000200067581000000020400258005
-:100250000000000200067581000000040000004953
-:10026000000000000000500000000002000380E6D3
-:1002700000000002040025C5000000020006100076
-:10028000000000020000750E000000020001900056
-:10029000000000140001105500000012000000557D
-:1002A000000000020400250F000000040000504F71
-:1002B00000000002000380E600000002040025C5E3
-:1002C0000000000200007565000000020000756675
-:1002D000000000040000005800000002000380E657
-:1002E00000000002040025C50000000201E655B42C
-:1002F000000000024401B0E40000000201C110E46B
-:10030000000000182666706600000002040C2565D7
-:1003100000000018000000660000000204002564D0
-:100320000000000200007566000000040000005D8F
-:1003300000000008004010690000000200101000DA
-:1003400000000002000D80FF000000080080006C2B
-:1003500000000002000F900000000002000E00FFED
-:100360000000000600000000000000180000008FE0
-:10037000000000040000005B00000002000380E6B3
-:1003800000000002040025C5000000020000757690
-:100390000000000200065000000000020000900073
-:1003A0000000000200041000000000020C00350EE6
-:1003B0000000000200049000000000020005100090
-:1003C0000000000201E785F80000000200200000A4
-:1003D0000000000C0060007E000000020000756359
-:1003E00000000021006075F0000000042000707320
-:1003F000000000040000507300000002000380E6CB
-:1004000000000002040025C500000002000075760F
-:100410000000000200007577000000020000750E69
-:10042000000000020000750F0000000200A0500054
-:100430000000000C0060008300000021006075F0E7
-:1004400000000002000075F80000000400000083B6
-:1004500000000002000A750E00000002000380E6A2
-:1004600000000002040025C5000000020020750FF6
-:1004700000000004006000860000000200007570AB
-:100480000000000200007571000000060000757297
-:1004900000000002000380E600000002040025C501
-:1004A00000000002000050000000000200A0500008
-:1004B0000000000200007568000000020006100045
-:1004C0000000000C00000095000000020005800004
-:1004D000000000020C60756200000004000000973C
-:1004E00000000002000380E600000002040025C5B1
-:1004F000000000040060009600000000400070E56D
-:1005000000000002000380E600000002040025C590
-:1005100000000002000380E50000001C000000A8AD
-:1005200000000018000650AA00000002040025BBCD
-:1005300000000018000610AB00000000040075BCAD
-:1005400000000002000075BB00000000000075BC48
-:100550000000000600090000000000020009000081
-:1005600000000006000D800200000002000078324A
-:10057000000000020000500000000002000380E7BD
-:100580000000000204002C97000000020000782008
-:100590000000000200007821000000000000780048
-:1005A000000000020120000000000002200770008F
-:1005B0000000000201200000000000022000700086
-:1005C0000000000200061000000000020120751B60
-:1005D000000000028040750A000000028040750B98
-:1005E000000000020011000000000002000380E58E
-:1005F0000000001C000000C600000018000610AB40
-:1006000000000002844075BD00000018000610AA1A
-:1006100000000002840075BB00000018000610AB4B
-:1006200000000002844075BC00000004000000C906
-:1006300000000002804075BD00000002800075BB14
-:1006400000000002804075BC000000020010800025
-:1006500000000002014000000000000C006000CD1E
-:100660000000002020C0700000000012000000CF39
-:100670000000000600800000000000060080751DDC
-:100680000000000000000000000000020000775C95
-:100690000000000200A050000000000200661000F0
-:1006A000000000200460275D000000000000400002
-:1006B0000000000201E0083000000000210070008E
-:1006C000000000006464614D00000000696874204F
-:1006D00000000000000000730000000000000000A7
-:1006E000000000020000500000000002000380D063
-:1006F00000000002040025E000000000000075E199
-:10070000000000000000000100000002000380E083
-:1007100000000002040023940000000000005000CC
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000080000000000000004AD
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/R200_cp.bin.ihex b/firmware/radeon/R200_cp.bin.ihex
deleted file mode 100644
index 3a0bd73111c4..000000000000
--- a/firmware/radeon/R200_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:1000000000000000210070000000000020007000CF
-:1000100000000004000000BF00000004000000C356
-:10002000000000007A685E5D000000005D5D55889C
-:100030000000000068659197000000005DA19F78B6
-:10004000000000005D5D5D5D000000005DEE5D5044
-:1000500000000000F2ACACAC00000000E75DF9E984
-:1000600000000000B1DD0E1100000000E2AFAFAFF4
-:1000700000000016000F000000000000452F232D97
-:10008000000000040000001300000016000F000034
-:1000900000000000452F272D00000016000F000172
-:1000A000000000003E4D4A3700000002000077EFDC
-:1000B00000000002000610000000001A00000020EE
-:1000C0000000001E000040000000000200061000BA
-:1000D0000000001A000000200000001E0000400088
-:1000E00000000002000610000000001A00000020BE
-:1000F0000000001E00004000000000040000001688
-:10010000000000020003802A00000002040067E0F3
-:10011000000000040000001600000002000077E06C
-:10012000000000020006500000000002000037E15D
-:1001300000000006040067E100000002000077E014
-:1001400000000002000077E100000006000077E1F7
-:1001500000000000FFFFFFFF000000001000000093
-:100160000000000007F007F0000000020003802AF2
-:1001700000000006040067E0000000020003802C7D
-:100180000000000204002741000000020400274193
-:100190000000000204002743000000020000767502
-:1001A0000000000200007676000000020000767772
-:1001B0000000000600007678000000020003802C9A
-:1001C0000000000204002741000000020400274153
-:1001D00000000002040027430000000200007676C1
-:1001E000000000020000767700000006000076782C
-:1001F000000000020003802B0000000204002676AD
-:100200000000000200007677000000020003802C4E
-:100210000000000204002741000000020400274300
-:100220000000000600007678000000020003802C29
-:1002300000000002040027410000000204002741E2
-:10024000000000020400274300000006000076784A
-:10025000000000180000002F000000180000002F10
-:100260000000000600000000000000180000003739
-:100270000000001800000037000000060000000029
-:100280000000000201605000000000020006500063
-:1002900000000002000980000000000200061000BB
-:1002A0000000000464C06051000000160008000057
-:1002B0000000000000000000000000020400251DF6
-:1002C0000000000200007580000000020006758139
-:1002D0000000000204002580000000020006758175
-:1002E000000000040000005A000000000000500060
-:1002F0000000000200061000000000020000750E61
-:1003000000000002000190000000001400011064D1
-:100310000000001200000064000000020400250F2D
-:10032000000000040000505E00000002000075653F
-:100330000000000200007566000000040000006577
-:100340000000000201E655B4000000024401B0F0D4
-:100350000000000201C110F0000000182666707154
-:1003600000000002040C2565000000180000007168
-:100370000000000204002564000000020000756611
-:100380000000000400000068000000080040107435
-:10039000000000020010100000000002000D80FFAD
-:1003A000000000080080007700000002000F9000AD
-:1003B00000000002000E00FF000000060000000028
-:1003C0000000001800000094000000040000006815
-:1003D00000000002000075760000000200065000D8
-:1003E0000000000200009000000000020004100065
-:1003F000000000020C00350E000000020004900016
-:1004000000000002000510000000000201E785F86E
-:1004100000000002002000000000000C00600087C7
-:10042000000000020000756300000021006075F00C
-:10043000000000042000707C000000040000507CDC
-:1004400000000002000075760000000200007577D1
-:10045000000000020000750E000000020000750F91
-:100460000000000200A050000000000C0060008AA4
-:1004700000000021006075F000000002000075F827
-:10048000000000040000008A00000002000A750E4F
-:10049000000000020020750F000000040060008DC5
-:1004A000000000020000757000000002000075717D
-:1004B00000000006000075720000000200005000FD
-:1004C0000000000200A0500000000002000075685B
-:1004D00000000002000610000000000C0000009860
-:1004E0000000000200058000000000020C60756240
-:1004F000000000040000009A000000040060009961
-:1005000000000000400070F100000002000380F1D4
-:100510000000001C000000A700000018000650A901
-:1005200000000002040025BB00000018000610AA0D
-:1005300000000000040075BC00000002000075BB54
-:1005400000000000000075BC00000006000900006B
-:10055000000000020009000000000006000D8002FB
-:10056000000000020000500000000002000078219E
-:100570000000000000007800000000020000782168
-:10058000000000000000780000000002016650003A
-:1005900000000002000A000000000002000671CC0A
-:1005A000000000020286F1CD00000010000000B73C
-:1005B00000000000210070000000001C000000BED0
-:1005C000000000020006500000000002000A0000C7
-:1005D000000000020006100000000002000B0000F6
-:1005E000000000023806700000000004000A00BA93
-:1005F0000000000020007000000000020120000048
-:10060000000000022007700000000002012000002E
-:100610000000000020007000000000020006100032
-:10062000000000020120751B000000028040750AD6
-:10063000000000028040750B000000020011000065
-:1006400000000002000380F10000001C000000D147
-:1006500000000018000610AA00000002844075BDCA
-:1006600000000018000610A900000002840075BBFD
-:1006700000000018000610AA00000002844075BCAB
-:1006800000000004000000D400000002804075BD9E
-:1006900000000002800075BB00000002804075BCB5
-:1006A0000000000200108000000000020140000075
-:1006B0000000000C006000D80000002020C0700086
-:1006C00000000012000000DA0000000600800000B8
-:1006D000000000060080751D00000002000025BB20
-:1006E00000000004000040D4000000020000775C1D
-:1006F0000000000200A05000000000020066100090
-:10070000000000200460275D0000000000004000A1
-:1007100000000002000079990000000200A05000D3
-:100720000000000200661000000000200460299B09
-:1007300000000000000040000000000201E008305E
-:1007400000000000210070000000000200005000C6
-:10075000000000020003805600000002040025E0B3
-:1007600000000000000075E1000000000000000132
-:1007700000000002000380ED0000000004007394FC
-:100780000000000000000000000000000000000069
-:1007900000000002000078C400000002000078C5DC
-:1007A00000000002000078C600000002000079246A
-:1007B00000000002000079250000000200007926F8
-:1007C00000000004000000F2000000020000792494
-:1007D00000000002000079250000000200007926D8
-:1007E00000000004000000F900000000000000000C
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/R300_cp.bin.ihex b/firmware/radeon/R300_cp.bin.ihex
deleted file mode 100644
index d307d56882c9..000000000000
--- a/firmware/radeon/R300_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:10000000000000004200E000000000004000E000AE
-:1000100000000008000000AE00000008000000B270
-:100020000000000067554B4A000000004A4A447532
-:100030000000000055527D83000000004A8C8B6553
-:10004000000000004AEF4AF6000000004AE14A4A78
-:1000500000000000E497979700000000DB4AEBDD0A
-:10006000000000009CCC4A4A00000000D1989898FB
-:10007000000000004A0F9AD600000004000CA00007
-:1000800000000038000D0012000000040000E8B479
-:1000900000000038000D0014000000040000E8B665
-:1000A00000000038000D0016000000040000E854B5
-:1000B00000000038000D0018000000040000E855A2
-:1000C00000000038000D001A000000040000E8568F
-:1000D00000000038000D001C000000040000E8577C
-:1000E00000000038000D001E000000040000E8249D
-:1000F00000000038000D0020000000040000E8258A
-:1001000000000038000D0022000000040000E8306C
-:1001100000000038000D0024000000040000F0C0C2
-:1001200000000038000D0026000000040000F0C1AF
-:1001300000000038000D0028000000040000F0411D
-:1001400000000038000D002A000000040000F184C7
-:1001500000000038000D002C000000040000F185B4
-:1001600000000038000D002E000000040000F186A1
-:1001700000000038000D0030000000040000F1878E
-:1001800000000038000D0032000000040000F18083
-:1001900000000038000D0034000000040000F3935C
-:1001A00000000038000D0036000000040000F38A53
-:1001B00000000038000D0038000000040000F38E3D
-:1001C000000000040000E821000000040140A0003D
-:1001D00000000018000000430000000400CCE8000C
-:1001E00000000004001B000100000004080048009B
-:1001F00000000004001B000100000004080048008B
-:1002000000000004001B000100000004080048007A
-:10021000000000080000003A000000000000A000FC
-:10022000000000042000451D000000040000E580DF
-:1002300000000004000CE581000000040800458077
-:1002400000000004000CE5810000000800000047E9
-:10025000000000000000A00000000004000C2000CE
-:10026000000000040000E50E000000040003200070
-:10027000000000280002205100000024000000516E
-:10028000000000040800450F000000080000A04B1B
-:10029000000000040000E565000000040000E566C1
-:1002A00000000008000000520000000403CCA5B4C8
-:1002B00000000004054320000000000400022000AC
-:1002C000000000304CCCE05E0000000408274565CB
-:1002D000000000300000005E0000000408004564DB
-:1002E000000000040000E566000000080000005562
-:1002F00000000010008020610000000400202000A9
-:1003000000000004001B00FF00000010010000645A
-:1003100000000004001F200000000004001C00FF7B
-:100320000000000C00000000000000300000008011
-:100330000000000800000055000000040000E57601
-:1003400000000004000CA0000000000400012000D8
-:100350000000000400082000000000041800650EE2
-:10036000000000040009200000000004000A200032
-:1003700000000004000F0000000000040040000026
-:100380000000001800000074000000040000E56395
-:10039000000000C200C0E5F900000008000000698C
-:1003A000000000080000A069000000040000E576DD
-:1003B000000000040000E577000000040000E50EE6
-:1003C000000000040000E50F000000040140A00050
-:1003D0000000001800000077000000C200C0E5F92E
-:1003E0000000000800000077000000040014E50E83
-:1003F000000000040040E50F0000000800C0007A83
-:10040000000000040000E570000000040000E57139
-:100410000000000C0000E572000000040000A000D5
-:10042000000000040140A000000000040000E56896
-:1004300000000004000C20000000001800000084F0
-:1004400000000004000B00000000000418C0E5627A
-:1004500000000008000000860000000800C00085C1
-:1004600000000004000700E30000003800000092D4
-:1004700000000030000CA09400000004080045BB00
-:1004800000000030000C2095000000000800E5BCD2
-:10049000000000040000E5BB000000000000E5BC17
-:1004A0000000000C00120000000000040012000018
-:1004B0000000000C001B0002000000040000A0006F
-:1004C000000000040000E821000000000000E80037
-:1004D000000000040000E821000000000000E82EF9
-:1004E0000000000402CCA000000000040014000082
-:1004F00000000004000CE1CC00000004050DE1CD7B
-:10050000000000040040000000000018000000A4EB
-:100510000000000400C0A00000000008000000A1CE
-:1005200000000020000000A6000000004200E000E3
-:1005300000000038000000AD00000004000CA00026
-:10054000000000040014000000000004000C200063
-:10055000000000040016000000000004700CE00021
-:1005600000000008001400A9000000004000E000A6
-:10057000000000040240000000000004400EE00003
-:100580000000000402400000000000004000E00005
-:1005900000000004000C2000000000040240E51BE5
-:1005A000000000050080E50A000000050080E50B62
-:1005B000000000040022000000000004000700E327
-:1005C00000000038000000C000000030000C209542
-:1005D000000000050880E5BD00000030000C2094FC
-:1005E000000000050800E5BB00000030000C20956D
-:1005F000000000050880E5BC00000008000000C302
-:10060000000000050080E5BD000000050000E5BB1E
-:10061000000000050080E5BC00000004002100008F
-:1006200000000004028000000000001800C000C7A5
-:10063000000000404180E00000000024000000C9EC
-:100640000000000C010000000000000C0100E51D8E
-:1006500000000004000045BB00000008000080C34B
-:10066000000000040000F3CE000000040140A000E0
-:100670000000000400CC20000000004008C053CF60
-:100680000000000000008000000000040000F3D221
-:10069000000000040140A0000000000400CC200085
-:1006A0000000004008C053D300000000000080009C
-:1006B000000000040000F39D000000040140A000C1
-:1006C0000000000400CC20000000004008C0539E41
-:1006D00000000000000080000000000403C008309B
-:1006E000000000004200E000000000040000A00044
-:1006F00000000004200045E0000000000000E5E1EB
-:10070000000000000000000100000004000700E0FD
-:10071000000000000800E39400000000000000005A
-:10072000000000040000E8C4000000040000E8C568
-:10073000000000040000E8C6000000040000E928F2
-:10074000000000040000E929000000040000E92A7C
-:1007500000000008000000E4000000040000E92898
-:10076000000000040000E929000000040000E92A5C
-:1007700000000008000000EB0000000402C02000A0
-:10078000000000040006000000000034000000F338
-:1007900000000008000000F00000000400008000DD
-:1007A00000000000C000E0000000000000000000A9
-:1007B00000000004000C200000000004001D0018D0
-:1007C00000000004001A000100000034000000FBDB
-:1007D000000000080000004A000000080500A04AD0
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/R420_cp.bin.ihex b/firmware/radeon/R420_cp.bin.ihex
deleted file mode 100644
index 3815891275f9..000000000000
--- a/firmware/radeon/R420_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:10000000000000004200E000000000004000E000AE
-:100010000000000800000099000000080000009D9A
-:10002000000000004A554B4A000000004A4A44675D
-:100030000000000055526F75000000004A7E7D658B
-:1000400000000000D9D3DFF6000000004AC54A4A8C
-:1000500000000000C882828200000000BF4ACFC1B9
-:100060000000000087B04A4A00000000B583838387
-:10007000000000004A0F85BA00000004000CA00038
-:1000800000000038000D0012000000040000E8B479
-:1000900000000038000D0014000000040000E8B665
-:1000A00000000038000D0016000000040000E854B5
-:1000B00000000038000D0018000000040000E855A2
-:1000C00000000038000D001A000000040000E8568F
-:1000D00000000038000D001C000000040000E8577C
-:1000E00000000038000D001E000000040000E8249D
-:1000F00000000038000D0020000000040000E8258A
-:1001000000000038000D0022000000040000E8306C
-:1001100000000038000D0024000000040000F0C0C2
-:1001200000000038000D0026000000040000F0C1AF
-:1001300000000038000D0028000000040000F0411D
-:1001400000000038000D002A000000040000F184C7
-:1001500000000038000D002C000000040000F185B4
-:1001600000000038000D002E000000040000F186A1
-:1001700000000038000D0030000000040000F1878E
-:1001800000000038000D0032000000040000F18083
-:1001900000000038000D0034000000040000F3935C
-:1001A00000000038000D0036000000040000F38A53
-:1001B00000000038000D0038000000040000F38E3D
-:1001C000000000040000E821000000040140A0003D
-:1001D00000000018000000430000000400CCE8000C
-:1001E00000000004001B000100000004080048009B
-:1001F00000000004001B000100000004080048008B
-:1002000000000004001B000100000004080048007A
-:10021000000000080000003A000000000000A000FC
-:10022000000000042000451D000000040000E580DF
-:1002300000000004000CE581000000040800458077
-:1002400000000004000CE5810000000800000047E9
-:10025000000000000000A00000000004000C2000CE
-:10026000000000040000E50E000000040003200070
-:10027000000000280002205100000024000000516E
-:10028000000000040800450F000000080000A04B1B
-:10029000000000040000E565000000040000E566C1
-:1002A00000000008000000520000000403CCA5B4C8
-:1002B00000000004054320000000000400022000AC
-:1002C000000000304CCCE05E0000000408274565CB
-:1002D000000000300000005E0000000408004564DB
-:1002E000000000040000E566000000080000005562
-:1002F00000000010008020610000000400202000A9
-:1003000000000004001B00FF00000010010000645A
-:1003100000000004001F200000000004001C00FF7B
-:100320000000000C0000000000000030000000721F
-:100330000000000800000055000000040000E57601
-:10034000000000040000E577000000040000E50E56
-:10035000000000040000E50F000000040140A000C0
-:100360000000001800000069000000C200C0E5F9AC
-:100370000000000800000069000000040014E50E01
-:10038000000000040040E50F0000000800C0006C01
-:10039000000000040000E570000000040000E571AA
-:1003A0000000000C0000E572000000040000A00046
-:1003B000000000040140A000000000040000E56807
-:1003C00000000004000C200000000018000000766F
-:1003D00000000004000B00000000000418C0E562EB
-:1003E00000000008000000780000000800C000774E
-:1003F00000000004000700C7000000380000008073
-:10040000000000040000E5BB000000000000E5BCA7
-:10041000000000040000A000000000040000E8212B
-:10042000000000000000E800000000040000E821D7
-:10043000000000000000E82E0000000402CCA00034
-:10044000000000040014000000000004000CE1CCD7
-:1004500000000004050DE1CD000000040040000094
-:10046000000000180000008F0000000400C0A00081
-:10047000000000080000008C000000200000009137
-:10048000000000004200E00000000038000000987A
-:1004900000000004000CA000000000040014000094
-:1004A00000000004000C2000000000040016000002
-:1004B00000000004700CE00000000008001400942C
-:1004C000000000004000E0000000000402400000C6
-:1004D00000000004400EE0000000000402400000A4
-:1004E000000000004000E00000000004000C2000BC
-:1004F000000000040240E51B000000050080E50A42
-:10050000000000050080E50B000000040022000050
-:1005100000000004000700C700000038000000A42D
-:10052000000000050080E5BD000000050000E5BBFF
-:10053000000000050080E5BC000000040021000070
-:1005400000000004028000000000001800C000ABA2
-:10055000000000404180E00000000024000000ADE9
-:100560000000000C010000000000000C0100E51D6F
-:1005700000000004000045BB00000008000080A748
-:10058000000000040000F3CE000000040140A000C1
-:100590000000000400CC20000000004008C053CF41
-:1005A0000000000000008000000000040000F3D202
-:1005B000000000040140A0000000000400CC200066
-:1005C0000000004008C053D300000000000080007D
-:1005D000000000040000F39D000000040140A000A2
-:1005E0000000000400CC20000000004008C0539E22
-:1005F00000000000000080000000000403C008307C
-:10060000000000004200E000000000040000A00024
-:1006100000000004200045E0000000000000E5E1CB
-:10062000000000000000000100000004000700C4FA
-:10063000000000000800E39400000000000000003B
-:10064000000000040000E8C4000000040000E8C549
-:10065000000000040000E8C6000000040000E928D3
-:10066000000000040000E929000000040000E92A5D
-:1006700000000008000000C8000000040000E92895
-:10068000000000040000E929000000040000E92A3D
-:1006900000000008000000CF0000000402C020009D
-:1006A000000000040006000000000034000000D735
-:1006B00000000008000000D40000000400008000DA
-:1006C00000000000C000E000000000040000E1CCD9
-:1006D000000000040500E1CD00000004000CA000B3
-:1006E00000000034000000DE00000008000000DA16
-:1006F000000000000000A000000000040019E1CC90
-:1007000000000004001B0001000000040500A00020
-:1007100000000004080041CD00000004000CA0000F
-:1007200000000034000000FB000000080000004A48
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B00000000004000C200000000004001D0018D0
-:1007C00000000004001A000100000034000000FBDB
-:1007D000000000080000004A000000080500A04AD0
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/R520_cp.bin.ihex b/firmware/radeon/R520_cp.bin.ihex
deleted file mode 100644
index 372ff82a0143..000000000000
--- a/firmware/radeon/R520_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:10000000000000004200E000000000004000E000AE
-:100010000000000800000099000000080000009D9A
-:10002000000000004A554B4A000000004A4A44675D
-:100030000000000055526F75000000004A7E7D658B
-:1000400000000000E0DAE6F6000000004AC54A4A77
-:1000500000000000C882828200000000BF4ACFC1B9
-:100060000000000087B04AD500000000B5838383FC
-:10007000000000004A0F85BA00000004000CA00038
-:1000800000000038000D0012000000040000E8B479
-:1000900000000038000D0014000000040000E8B665
-:1000A00000000038000D0016000000040000E854B5
-:1000B00000000038000D0018000000040000E855A2
-:1000C00000000038000D001A000000040000E8568F
-:1000D00000000038000D001C000000040000E8577C
-:1000E00000000038000D001E000000040000E8249D
-:1000F00000000038000D0020000000040000E8258A
-:1001000000000038000D0022000000040000E8306C
-:1001100000000038000D0024000000040000F0C0C2
-:1001200000000038000D0026000000040000F0C1AF
-:1001300000000038000D0028000000040000E0006E
-:1001400000000038000D002A000000040000E0005C
-:1001500000000038000D002C000000040000E0004A
-:1001600000000038000D002E000000040000E00038
-:1001700000000038000D0030000000040000E00026
-:1001800000000038000D0032000000040000F18083
-:1001900000000038000D0034000000040000F3935C
-:1001A00000000038000D0036000000040000F38A53
-:1001B00000000038000D0038000000040000F38E3D
-:1001C000000000040000E821000000040140A0003D
-:1001D00000000018000000430000000400CCE8000C
-:1001E00000000004001B000100000004080048009B
-:1001F00000000004001B000100000004080048008B
-:1002000000000004001B000100000004080048007A
-:10021000000000080000003A000000000000A000FC
-:10022000000000042000451D000000040000E580DF
-:1002300000000004000CE581000000040800458077
-:1002400000000004000CE5810000000800000047E9
-:10025000000000000000A00000000004000C2000CE
-:10026000000000040000E50E000000040003200070
-:10027000000000280002205100000024000000516E
-:10028000000000040800450F000000080000A04B1B
-:10029000000000040000E565000000040000E566C1
-:1002A00000000008000000520000000403CCA5B4C8
-:1002B00000000004054320000000000400022000AC
-:1002C000000000304CCCE05E0000000408274565CB
-:1002D000000000300000005E0000000408004564DB
-:1002E000000000040000E566000000080000005562
-:1002F00000000010008020610000000400202000A9
-:1003000000000004001B00FF00000010010000645A
-:1003100000000004001F200000000004001C00FF7B
-:100320000000000C0000000000000030000000721F
-:100330000000000800000055000000040000E57601
-:10034000000000040000E577000000040000E50E56
-:10035000000000040000E50F000000040140A000C0
-:100360000000001800000069000000C200C0E5F9AC
-:100370000000000800000069000000040014E50E01
-:10038000000000040040E50F0000000800C0006C01
-:10039000000000040000E570000000040000E571AA
-:1003A0000000000C0000E572000000040000A00046
-:1003B000000000040140A000000000040000E56807
-:1003C00000000004000C200000000018000000766F
-:1003D00000000004000B00000000000418C0E562EB
-:1003E00000000008000000780000000800C000774E
-:1003F00000000004000700C7000000380000008073
-:10040000000000040000E5BB000000000000E5BCA7
-:10041000000000040000A000000000040000E8212B
-:10042000000000000000E800000000040000E821D7
-:10043000000000000000E82E0000000402CCA00034
-:10044000000000040014000000000004000CE1CCD7
-:1004500000000004050DE1CD000000040040000094
-:10046000000000180000008F0000000400C0A00081
-:10047000000000080000008C000000200000009137
-:10048000000000004200E00000000038000000987A
-:1004900000000004000CA000000000040014000094
-:1004A00000000004000C2000000000040016000002
-:1004B00000000004700CE00000000008001400942C
-:1004C000000000004000E0000000000402400000C6
-:1004D00000000004400EE0000000000402400000A4
-:1004E000000000004000E00000000004000C2000BC
-:1004F000000000040240E51B000000050080E50A42
-:10050000000000050080E50B000000040022000050
-:1005100000000004000700C700000038000000A42D
-:10052000000000050080E5BD000000050000E5BBFF
-:10053000000000050080E5BC000000040021000070
-:1005400000000004028000000000001800C000ABA2
-:10055000000000404180E00000000024000000ADE9
-:100560000000000C010000000000000C0100E51D6F
-:1005700000000004000045BB00000008000080A748
-:10058000000000040000F3CE000000040140A000C1
-:100590000000000400CC20000000004008C053CF41
-:1005A0000000000000008000000000040000F3D202
-:1005B000000000040140A0000000000400CC200066
-:1005C0000000004008C053D300000000000080007D
-:1005D000000000040000F39D000000040140A000A2
-:1005E0000000000400CC20000000004008C0539E22
-:1005F00000000000000080000000000403C008307C
-:10060000000000004200E000000000040000A00024
-:1006100000000004200045E0000000000000E5E1CB
-:10062000000000000000000100000004000700C4FA
-:10063000000000000800E39400000000000000003B
-:10064000000000040000E8C4000000040000E8C549
-:10065000000000040000E8C6000000040000E928D3
-:10066000000000040000E929000000040000E92A5D
-:1006700000000008000000C8000000040000E92895
-:10068000000000040000E929000000040000E92A3D
-:1006900000000008000000CF00000000DEADBEEF4B
-:1006A000000000000000011600000004000700D355
-:1006B00000000004080050E700000004000700D418
-:1006C000000000040800401C000000000000E01DC5
-:1006D0000000000402C0200000000004000600002A
-:1006E00000000034000000DE00000008000000DB15
-:1006F000000000040000800000000000C000E000D6
-:10070000000000040000E1CC000000040500E1CD81
-:1007100000000004000CA00000000034000000E510
-:1007200000000008000000E1000000000000A00040
-:10073000000000040019E1CC00000004001B0001CF
-:10074000000000040500A00000000004080041CDE6
-:1007500000000004000CA00000000034000000FBBA
-:10076000000000080000004A000000000000000037
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B00000000004000C200000000004001D0018D0
-:1007C00000000004001A000100000034000000FBDB
-:1007D000000000080000004A000000080500A04AD0
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/R600_me.bin.ihex b/firmware/radeon/R600_me.bin.ihex
deleted file mode 100644
index 30d4c14a308d..000000000000
--- a/firmware/radeon/R600_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A0000060441100000614000000000060000021
-:1000B000000005B20000000000600000000005C55F
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E0000000000000000020002036250000000075
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000003100204A2D82
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000002100203625C1
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001D00200E2D54
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001D12
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000300020362407
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:1003800000000000000000100020362300000000E4
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E230000000000000011C7
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000003000204A2D0000000046
-:1003F0000000000000204811000000000000003252
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A0000000000000204804000000000000002DB2
-:1005B0000020162D0000000000000000002F00A306
-:1005C00000000000000000000CC0000000000080DF
-:1005D0000000002E0020162D00000000000000008A
-:1005E000002F00A400000000000000000CC000006C
-:1005F00000000081000000000040000000000087B3
-:100600000000002D00203623000000000000002E16
-:1006100000203624000000000000001D00201E2DD8
-:10062000000000000000000200210227000000007E
-:100630000000000014E0000000000087000000003F
-:1006400000600000000005ED0000000000600000F8
-:10065000000005E10000000200210E220000000061
-:100660000000000014C000000000008A0000001814
-:10067000C040362000000090000000002EE0000086
-:100680000000008E000000002CE000000000008D43
-:100690000000000200400E2D0000008F000000034B
-:1006A00000400E2D0000008F0000000C00200E2DD9
-:1006B00000000000000000180020362300000000A9
-:1006C0000000000300210E220000000000000000D6
-:1006D00014C00000000000950000A00C0020441190
-:1006E0000000000000000000C020480000000000E2
-:1006F00000000000C04048000000009D0000A00C69
-:1007000000204411000000000000000000204811FB
-:1007100000000000000000002EE000000000009B30
-:10072000000000002CE000000000009A0000000221
-:1007300000400E2D0000009C0000000300400E2D24
-:100740000000009C0000000C00200E2D00000000A6
-:10075000000000000020480300000000000000002E
-:10076000003A0C0200000000003F000000280E23A9
-:10077000000000000000001000210E230000000017
-:100780000000001300203623000000000000001EBF
-:100790000021022B000000000000000014C0000037
-:1007A000000000A40000001CC02036200000000053
-:1007B0000000001F0021022B0000000000000000CC
-:1007C00014C00000000000A70000001BC02036205D
-:1007D000000000000000000800210E2B00000000B7
-:1007E0000000007F00280E23000000000000000031
-:1007F000002F022300000000000000000CE00000B9
-:10080000000000DB000000002700000000000000E6
-:1008100000000000006000000000028C8100000069
-:1008200000204411000000000000000600204811D4
-:10083000000000000000000C00221E30000000003C
-:100840009980000000204411000000000000000416
-:100850000020122D000000000000000800221224D9
-:10086000000000000000001000201811000000002F
-:100870000000000000291CE400000000000000004F
-:1008800000604807000001289B0000000020441180
-:1008900000000000000000000020480200000000EE
-:1008A0009C00000000204411000000000000000037
-:1008B0000033146F000000000000000100333E23ED
-:1008C0000000000000000000D90048000000000007
-:1008D0000000000000203C05000000008100000036
-:1008E00000204411000000000000000E002048110C
-:1008F00000000000000000000020101000000000B8
-:100900000000E00700204411000000000000000F7C
-:100910000021022B000000000000000014C00000B5
-:10092000000000C500F8FF0800204811000000008A
-:100930009800000000404811000000D6000000F0C0
-:1009400000280E2200000000000000A0002F02235B
-:1009500000000000000000000CC00000000000D4F7
-:100960000000001300200E2D000000000000000118
-:10097000002F022300000000000000000CE0000037
-:10098000000000CF00000002002F02230000000042
-:10099000000000000CE00000000000CE00003F005E
-:1009A00000400C11000000D000001F0000400C119E
-:1009B000000000D000000F0000200C11000000001B
-:1009C0000038000900294A23000000003F00000011
-:1009D00000280E2B000000000000000200220E2361
-:1009E000000000000000000700494A23000000D674
-:1009F00000380F09002048110000000068000007BF
-:100A000000204811000000000000000800214A27D3
-:100A1000000000000000000000204811000000005D
-:100A2000060A020000294A2400000000000000001D
-:100A300000204811000000000000000000204811C4
-:100A4000000000000000A20200204411000000008D
-:100A500000FF000000284A220000000000000030D3
-:100A600000200E2D000000000000002E0020122D9E
-:100A70000000000000000000002F008300000000C4
-:100A8000000000000CE00000000000E30000000097
-:100A900000600000000005E70000000000400000CA
-:100AA000000000E40000000000600000000005EA13
-:100AB000000000070020222D0000000000000005BB
-:100AC00000220E22000000000010000000280E236B
-:100AD0000000000000000000002920680000000065
-:100AE00000000000003A0C0200000000000000EFCF
-:100AF00000280E23000000000000000000292068EC
-:100B0000000000000000001D00200E2D000000006D
-:100B1000000000030021022300000000000000008C
-:100B200014E00000000000F10000000B002102288A
-:100B3000000000000000000014C00000000000F1F0
-:100B40000000040000292228000000000000001A14
-:100B500000203628000000000000001C00210E22AA
-:100B6000000000000000000014C00000000000F6BB
-:100B70000000A30C00204411000000000000000051
-:100B800000204811000000000000001E00210E227D
-:100B9000000000000000000014C00000000001047C
-:100BA0000000A30F0020441100000000000000130B
-:100BB00000200E2D0000000000000001002F022385
-:100BC00000000000000000000CC00000000000FD5C
-:100BD000FFFFFFFF00404811000001040000000279
-:100BE000002F022300000000000000000CC00000E5
-:100BF000000001000000FFFF004048110000010458
-:100C000000000004002F022300000000000000008C
-:100C10000CC0000000000103000000FF004048116C
-:100C20000000010400000001002048110000000045
-:100C30000002C40000204411000000000000001F5A
-:100C400000210E22000000000000000014C000007F
-:100C50000000010B0000001040210E2000000000E9
-:100C600000000019002036230000000000000018DA
-:100C700040224A200000000000000010C0424A202C
-:100C80000000010D0000000000200C110000000019
-:100C900000000019002036230000000000000000C2
-:100CA0000020481100000000000000000020481152
-:100CB000000000000000000A0020101100000000E9
-:100CC00000000000002F02240000000000000000CF
-:100CD0000CE000000000011400000000002048119A
-:100CE0000000000000000001005312240000011069
-:100CF000FFBFFFFF00283A2E000000000000001B8D
-:100D000000210222000000000000000014C00000CA
-:100D100000000127810000000020441100000000B5
-:100D20000000000D00204811000000000000001825
-:100D300000220E3000000000FC00000000280E23FE
-:100D400000000000810000000020441100000000AD
-:100D50000000000E0020481100000000000000000C
-:100D600000201010000000000000E00E00204411E0
-:100D70000000000007F8FF080020481100000000F4
-:100D80000000000000294A230000000000000024A9
-:100D900000201E2D000000000000000800214A274E
-:100DA00000000000000000000020481100000000CA
-:100DB000060A020000294A2400000000000000008A
-:100DC0000020481100000000000000000020481131
-:100DD0000000000000000000008000000000000093
-:100DE000810000000020441100000000000000010C
-:100DF00000204811000000000000217C0020441168
-:100E000000000000008000000020481100000000E9
-:100E1000000000000020480600000000000000085C
-:100E200000214A2700000000000000001700000019
-:100E3000000000000004217F00604411000006143F
-:100E40000000001F00210230000000000000000030
-:100E500014C00000000006130000000400404C1104
-:100E60000000012E00000000006000000000000BE8
-:100E70000000000000600411000002FE00000000FD
-:100E800000200411000000000000000000600811B4
-:100E90000000019F00000000006000000000015100
-:100EA0000000FFFF40280E2000000000000000109E
-:100EB000C0211220000000000000FFFF4028062093
-:100EC0000000000000000010C0210A200000000007
-:100ED0000000000000341461000000000000000069
-:100EE00000741882000002A40001A1FD00604411FA
-:100EF000000002C900003FFF002F022F0000000089
-:100F0000000000000CC000000000013800000000DC
-:100F1000C04004000000000100000000006000006C
-:100F20000000000B0000000000600411000002FE41
-:100F3000000000000020041100000000000000007C
-:100F4000006008110000019F00003FFF002F022FEA
-:100F500000000000000000000CE0000000000000A5
-:100F600000000000006000000000015100000010BF
-:100F700040210E20000000000000FFFFC0281220CA
-:100F800000000000000000104021162000000000BA
-:100F90000000FFFFC0681A20000002A40001A1FDAC
-:100FA00000604411000002C900003FFF002F022F23
-:100FB00000000000000000000CC00000000001491B
-:100FC00000000000C0400400000000010000225C9E
-:100FD00000204411000000000000000100300A2F32
-:100FE000000000000000000100210A2200000000B3
-:100FF0000000000300384A220000000000002256D2
-:1010000000204411000000000000001A00204811D8
-:10101000000000000000A1FC0020441100000000BE
-:1010200000000001008048110000000000000000E6
-:10103000006000000000000B0000000000600000E5
-:101040000000017C00000000006000000000018D35
-:1010500000003FFF002F022F0000000000000000F2
-:101060000CE00000000000000000000000202C0840
-:10107000000000000000000000202411000000001B
-:10108000000000000020281100000000000022568F
-:10109000002044110000000000000016002048114C
-:1010A000000000000000225C00204411000000004D
-:1010B00000000003002048110000000093800000A1
-:1010C00000204411000000000000000200221E2940
-:1010D0000000000000000000007048EB00000189E3
-:1010E0000000000000600000000002A400000001F9
-:1010F000403306200000000000000000C03024093A
-:101100000000000000003FFF002F022F0000000041
-:10111000000000000CE000000000000000000000E3
-:10112000006000000000028C9500000000204411C7
-:101130000000000000000000002F0221000000005D
-:10114000000000000CE0000000000173000000003F
-:10115000C0204800000000000000000100530621EC
-:101160000000016F92000000002044110000000008
-:1011700000000000C0604800000001840001A1FDE3
-:101180000020441100000000000000130020062D84
-:1011900000000000000000000078042A000002E4C3
-:1011A00000000000002028090000000000003FFFB0
-:1011B000002F022F00000000000000000CC0000003
-:1011C0000000016500000000C040040000000001B4
-:1011D0000000021000600411000002FE00003FFF4A
-:1011E000002F022F00000000000000000CE00000B3
-:1011F000000001810000001BC0203620000000001C
-:101200000000001CC0203620000000003F800000CD
-:1012100000200411000000004600000000600811DA
-:101220000000019F0000000000800000000000009E
-:101230000000A1FC002044110000000000003FFF5E
-:10124000002F022F00000000000000000CC0000072
-:10125000000001880000000100804811000000002B
-:101260000000002100804811000000000000FFFF86
-:1012700040280E200000000000000010C0211220B5
-:10128000000000000000FFFF4028162000000000C2
-:1012900000000010C0811A20000000008100000042
-:1012A000002044110000000000000006002048114A
-:1012B000000000000000000800221E3000000000B6
-:1012C0000000003200201A2D000000000000E000A5
-:1012D0000020441100000000FFFBFF09002048111E
-:1012E00000000000000000110020222D000000007E
-:1012F00000001FFF00294A2800000000000000062F
-:101300000020222D0000000000000000002920E83D
-:10131000000000000000000000204808000000005D
-:10132000000000000020481100000000060A020032
-:1013300000294A260000000000000000002048119B
-:101340000000000000000000002048110000000024
-:10135000000001000020181100000000000000083B
-:1013600000621E28000001280000000800822228D8
-:10137000000000000002C000002044110000000036
-:101380000000001B00600E2D000001AA0000001CE0
-:1013900000600E2D000001AA0000C00800204411CA
-:1013A000000000000000001D00200E2D00000000C5
-:1013B0000000000014C00000000001A600000000B2
-:1013C000002004110000000000000000002048017F
-:1013D000000000003900000000204811000000005B
-:1013E0000000000000204811000000000000000084
-:1013F00000804802000000000000002000202E2D88
-:101400000000000000000000003B0D630000000031
-:101410000000000800224A23000000000000001025
-:1014200000224A23000000000000001800224A2386
-:1014300000000000000000000080480300000000E1
-:1014400000000000006000000000000B0000100021
-:1014500000600411000002FE0000000000200411E2
-:101460000000000000000000006008110000019F63
-:10147000000000070021062F0000000000000019F6
-:1014800000200A2D000000000000000100202C11A7
-:10149000000000000000FFFF4028222000000000A4
-:1014A0000000000F002622280000000000000010AD
-:1014B00040212620000000000000000F0026262901
-:1014C00000000000000000000020280200000000D2
-:1014D0000000225600204411000000000000001B04
-:1014E000002048110000000000000000002F022131
-:1014F00000000000000000000CE00000000001CD32
-:101500000000225C00204411000000000000008167
-:1015100000204811000000000000A1FC0020441140
-:101520000000000000000001002048110000000041
-:101530000000008000201C110000000000000000DE
-:10154000002F022700000000000000000CE0000057
-:10155000000001C90000000000600000000001D68A
-:101560000000000100531E27000001C5000000011B
-:1015700000202C11000000000000001F00280A229B
-:10158000000000000000001F00282A2A00000000C0
-:101590000000000100530621000001BE0000225C93
-:1015A00000204411000000000000000200304A2F1B
-:1015B000000000000000A1FC002044110000000019
-:1015C00000000001002048110000000000000001A0
-:1015D00000301E2F0000000000000000002F022736
-:1015E00000000000000000000CE00000000000000F
-:1015F0000000000000600000000001D600000001B3
-:1016000000531E27000001D20000FFFF40280E20DB
-:10161000000000000000000F00260E230000000064
-:1016200000000010C0211220000000000000000F88
-:101630000026122400000000000000000020141109
-:10164000000000000000000000601811000002A46B
-:101650000001A1FD00204411000000000000000076
-:10166000002F022B00000000000000000CE0000032
-:10167000000001E500000010002216280000000014
-:10168000FFFF000000281625000000000000FFFFFB
-:1016900000281A290000000000000000002948C5A9
-:1016A00000000000000000000020480A00000000C8
-:1016B0000000000000202C110000000000000010BD
-:1016C0000022162300000000FFFF0000002816255E
-:1016D000000000000000FFFF00281A2400000000A6
-:1016E00000000000002948C50000000000000000C4
-:1016F00000731503000001F200000000002018052F
-:10170000000000000000000000731524000001F23A
-:1017100000000000002D14C50000000000000000C3
-:10172000003008A200000000000000000020480275
-:10173000000000000000000000202802000000005F
-:101740000000000000202003000000000000000056
-:1017500000802404000000000000000F002102258A
-:10176000000000000000000014C00000000006138C
-:1017700000000000002B1405000000000000000124
-:10178000009016250000000000000000006000002E
-:101790000000000B0000000000600411000002FEC9
-:1017A0000000000000200411000000000000000004
-:1017B000006008110000019F000022560020441123
-:1017C000000000000000001A00294A22000000006A
-:1017D00000000000C02000000000000000003FFFEB
-:1017E000002F022F00000000000000000CE00000AD
-:1017F0000000000000000000C02004000000000005
-:101800000000225C002044110000000000000003E2
-:1018100000384A21000000000000A1FC0020441113
-:10182000000000000000000100204811000000003E
-:101830000000FFFF40281220000000000000001000
-:10184000C0211A20000000000000FFFF40280E20E9
-:101850000000000000000010C02116200000000061
-:101860000000000000741465000002A40001A1FD46
-:1018700000604411000002C900000001003306218D
-:101880000000000000000000002F02210000000006
-:10189000000000000CC000000000020600003FFF36
-:1018A000002F022F00000000000000000CC000000C
-:1018B000000001FF00000000C04004000000000123
-:1018C0000000000000600000000005C500000000EE
-:1018D0000040040F00000200000000000060000053
-:1018E000000005B20000000000600000000005C517
-:1018F0000000021000600411000002FE0000000061
-:10190000006000000000018D000000000060000089
-:10191000000001890000000000600000000002A437
-:1019200000000000006000000000028C93800000B6
-:1019300000204411000000000000000000204808C2
-:10194000000000009500000000204411000000008D
-:1019500000000000002F022F000000000000000027
-:101960000CE000000000021F00000000C040480022
-:101970000000021C92000000002044110000000042
-:1019800000000000C02048000000000000002256B7
-:101990000020441100000000000000160020481143
-:1019A000000000000000225C002044110000000044
-:1019B0000000000300204811000000000000A1FC0E
-:1019C0000020441100000000000000010020481128
-:1019D000000000000001A1FD0020441100000000F3
-:1019E0000000000000600411000002E4000000009C
-:1019F000C040040000000001000000000060000082
-:101A0000000005B20000A00C0020441100000000FE
-:101A100000000000C020480000000000000000009E
-:101A2000C04048000000000000000000006000000E
-:101A30000000000B0000001840210A2000000000F8
-:101A400000000003002F0222000000000000000040
-:101A50000AE00000000002350000001A0020222DDC
-:101A600000000000000801010029222800000000F9
-:101A70000000001A00203628000000000000A30C1F
-:101A8000002044110000000000000000C0204800B9
-:101A90000000000000000000C0204800000000001E
-:101AA00000000000C04048000000023A00000000B2
-:101AB000006000000000000B000000100060041136
-:101AC000000002FE3F800000002004110000000022
-:101AD00000000000006008110000019F0000225C6F
-:101AE0000020441100000000000000030020481105
-:101AF000000000000000000000600000000002651F
-:101B00000000001D00201E2D00000000000000014C
-:101B100000211E27000000000000000014E000006B
-:101B2000000002530000001800201E2D00000000DD
-:101B30000000FFFF00281E2700000000000000003A
-:101B400000341C27000000000000000012C000004C
-:101B5000000002480000000000201C1100000000EE
-:101B600000000000002F00E5000000000000000061
-:101B700008C000000000024B000000000020140715
-:101B8000000000000000001800201E2D00000000D2
-:101B90000000001000211E270000000000000000CF
-:101BA00000341C47000000000000000012C00000CC
-:101BB000000002500000000000201C110000000086
-:101BC00000000000002F00E6000000000000000000
-:101BD00008C00000000002530000000000201807A9
-:101BE000000000000000000000600000000002AAE9
-:101BF00000002256002044110000000000000000F8
-:101C000000342023000000000000000012C000008B
-:101C10000000025B000000000034204400000000CF
-:101C20000000000012C000000000025A0000001670
-:101C3000004048110000025F0000001800404811F9
-:101C40000000025F0000000000342044000000009B
-:101C50000000000012C000000000025E000000173B
-:101C6000004048110000025F0000001900204811E8
-:101C7000000000000000A1FC002044110000000052
-:101C80000000000100204811000000000001A1FD3B
-:101C900000604411000002D200003FFF002F022F1D
-:101CA00000000000000000000CC000000000023F27
-:101CB00000000000C040040000000001000000100F
-:101CC00040210620000000000000FFFFC0280A207D
-:101CD000000000000000001040210E200000000065
-:101CE0000000FFFFC02812200000000000000010CC
-:101CF00040211620000000000000FFFFC0881A20CD
-:101D000000000000810000000020441100000000DD
-:101D10000000000100204811000000000004200421
-:101D20000060441100000614000000000060000084
-:101D3000000005B200000000C06000000000028C3E
-:101D40000000000500200A2D00000000000000082F
-:101D500000220A22000000000000003400201A2D9A
-:101D6000000000000000002400201E2D00000000E4
-:101D70000000700000281E27000000000000000086
-:101D800000311CE6000000000000003300201A2D86
-:101D9000000000000000000C00221A2600000000D5
-:101DA00000000000002F00E600000000000000001E
-:101DB00006E000000000027B0000000000201C1173
-:101DC000000000000000000000200C1100000000D6
-:101DD0000000003400203623000000000000001046
-:101DE00000201811000000000000000000691CE243
-:101DF0000000012893800000002044110000000032
-:101E000000000000002048070000000095000000CE
-:101E1000002044110000000000000000002F022FED
-:101E200000000000000000000CE00000000002863E
-:101E30000000000100333E2F000000000000000001
-:101E4000D90048000000000092000000002044116A
-:101E50000000000000000000C0204800000000005A
-:101E60000000002400403627000000000000000CA5
-:101E7000C0220A20000000000000003200203622AC
-:101E80000000000000000031C040362000000000CB
-:101E90000000A2A40020441100000000000000097E
-:101EA0000020481100000000A100000000204411A3
-:101EB0000000000000000001008048110000000048
-:101EC0000000002900201E2D00000000000000007E
-:101ED000002C1CE300000000000000290020362731
-:101EE000000000000000002A00201E2D000000005D
-:101EF00000000000002C1CE4000000000000002A8C
-:101F000000203627000000000000002B00201E2DBE
-:101F10000000000000000000003120A300000000CD
-:101F200000000000002D1D07000000000000002B35
-:101F300000203627000000000000002C00201E2D8D
-:101F40000000000000000000003120C4000000007C
-:101F500000000000002D1D07000000000000002C04
-:101F600000803627000000000000002900203623F2
-:101F7000000000000000002A0020362400000000BD
-:101F80000000000000311CA3000000000000002B36
-:101F900000203627000000000000000000311CC4B3
-:101FA000000000000000002C008036270000000028
-:101FB000000000220020362700000000000000235F
-:101FC00000203628000000000000001D00201E2D0B
-:101FD00000000000000000020021022700000000B5
-:101FE0000000000014C00000000002C50000000056
-:101FF00000400000000002C200000022002036273E
-:10200000000000000000002300203628000000002F
-:102010000000001D00201E2D000000000000000236
-:1020200000210227000000000000000014E0000072
-:10203000000002C20000000300210227000000008F
-:102040000000000014E00000000002C50000002BAA
-:1020500000201E2D0000000000000000002E00E106
-:10206000000000000000000002C00000000002C5E7
-:102070000000002900201E2D0000000000000000CC
-:10208000003120A10000000000000000002E00E848
-:10209000000000000000000006C00000000002C5B3
-:1020A0000000002C00201E2D000000000000000099
-:1020B000002E00E2000000000000000002C000004E
-:1020C000000002C50000002A00201E2D00000000B4
-:1020D00000000000003120C20000000000000000ED
-:1020E000002E00E8000000000000000006C0000014
-:1020F000000002C50000000000600000000005EDC7
-:1021000000000000006000000000029E00000000CF
-:1021100000400000000002C7000000000060000056
-:102120000000029E0000000000600000000005E4C6
-:102130000000000000400000000002C70000000096
-:10214000006000000000029000000000004000005D
-:10215000000002C70000002200201E2D0000000029
-:10216000000000230080222D00000000000000106D
-:1021700000221E2300000000000000000029488704
-:10218000000000000000000000311CA3000000005F
-:102190000000001000221E270000000000000000C8
-:1021A00000294887000000000000001000221E23C4
-:1021B0000000000000000000003120C4000000000A
-:1021C0000000FFFF0028222800000000000000009F
-:1021D00000894907000000000000001000221E23B3
-:1021E00000000000000000000029488700000000F7
-:1021F0000000001000221E2100000000000000006E
-:1022000000294847000000000000000000311CA326
-:10221000000000000000001000221E270000000047
-:1022200000000000002948870000000000000000B6
-:1022300000311CA1000000000000001000221E2739
-:1022400000000000000000000029484700000000D6
-:102250000000001000221E2300000000000000000B
-:10226000003120C4000000000000FFFF00282228E9
-:1022700000000000000000000029490700000000E5
-:102280000000001000221E210000000000000000DD
-:10229000003120C2000000000000FFFF00282228BB
-:1022A0000000000000000000008949070000000055
-:1022B0000000001000221E230000000000000000AB
-:1022C00000294887000000000000000100220A21C8
-:1022D0000000000000000000003308A20000000021
-:1022E0000000001000221E2200000000000000106C
-:1022F0000021222200000000000000000029490700
-:10230000000000000000000000311CA300000000DD
-:102310000000001000221E27000000000000000046
-:1023200000294887000000000000000100220A2167
-:102330000000000000000000003008A200000000C3
-:102340000000001000221E2200000000000000100B
-:10235000002122220000000000000000002949079F
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:102390000000000000000000003808C50000000038
-:1023A00000000000003008410000000000000001B3
-:1023B00000220A220000000000000000003308A2F2
-:1023C000000000000000001000221E22000000009B
-:1023D0000000001000212222000000000000000088
-:1023E00000894907000000000000001D0020222D88
-:1023F000000000000000000014C000000000030105
-:10240000FFFFFFEF00280621000000000000001A77
-:102410000020222D000000000000F8E00020441100
-:102420000000000000000000002949010000000039
-:1024300000000000008949010000000000000000C9
-:10244000002048110000000000000000002048119A
-:1024500000000000060A0200008048110000000091
-:1024600000000000C02000000000000097000000F5
-:10247000C02044110000000000000000C0204811EE
-:10248000000000008A00000000204411000000004D
-:102490000000000000204811000000000000225C45
-:1024A000002044110000000000000000C02048008F
-:1024B000000000000000A1FC00204411000000000A
-:1024C00000000000C02048000000000000000000E4
-:1024D000C0200400000000000000000000A0000A6E
-:1024E00000000000970000000020441100000000E0
-:1024F0000000000000204811000000008A000000D9
-:1025000000204411000000000000000000204811DD
-:10251000000000000000225C0020441100000000C8
-:1025200000000000C0204800000000000000A1FCE6
-:10253000002044110000000000000000C0204800FE
-:102540000000000000000000C020040000000000A7
-:102550000000000000A0000A00000000970000003A
-:10256000002044110000000000000000002048117D
-:10257000000000008A00000000204411000000005C
-:102580000000000000204811000000000000225C54
-:10259000002044110000000000000000C02048009E
-:1025A000000000000000A1FC002044110000000019
-:1025B00000000000C0204800000000000001A1FD54
-:1025C000002044110000000000000000D900480075
-:1025D0000000000000000000C02004000000000017
-:1025E0000000000000A0000A0000000000002257C8
-:1025F000002044110000000000000003C0484A20F1
-:10260000000000000000225D0020441100000000D6
-:1026100000000000C0404800000000000000000072
-:1026200000600000000005C500000000C020080098
-:10263000000000000000225C0020441100000000A7
-:102640000000000300384A22000000000000A1FC46
-:10265000002044110000000000000000C0204800DD
-:10266000000000000001A1FD002044110000000056
-:1026700000000000002F0222000000000000000007
-:102680000CE00000000000000000000040204800B6
-:10269000000000000000000140304A20000000005F
-:1026A00000000002C0304A200000000000000001CD
-:1026B00000530A22000003340000003FC0280A2013
-:1026C0000000000081000000002044110000000014
-:1026D000000000010020481100000000000021F867
-:1026E00000204411000000000000001700204811E5
-:1026F00000000000000421F90060441100000614ED
-:102700000000001100210230000000000000000065
-:1027100014E000000000033D00000014002F02221E
-:1027200000000000000000000CC000000000035189
-:102730000000201000204411000000000000800074
-:1027400000204811000000000001A2A40020441154
-:102750000000000000000000002048110000000000
-:1027600000000016006048110000035E0000210018
-:10277000002044110000000000000000C0204800BC
-:102780000000000000000000C02048000000000021
-:1027900000000000C0204800000000000000000011
-:1027A000C0204800000000000001A2A40020441145
-:1027B00000000000000000000020481100000000A0
-:1027C000000000000040480200000000000000047B
-:1027D000002F022200000000000000000CC00000DA
-:1027E00000000355000020100020441100000000EC
-:1027F000000080000040481100000349000000284C
-:10280000002F022200000000000000000CE0000089
-:1028100000000349000021040020441100000000D2
-:1028200000000000C0204800000000000000000080
-:10283000C02048000000000000000000C020480048
-:102840000000000000000000C02048000000000060
-:102850000000A2A4002044110000000000000000BD
-:10286000004048020000000000000035002036262D
-:1028700000000000000000490020181100000000C6
-:1028800000000000002048110000000000000001CE
-:1028900000331A260000000000000000002F02266E
-:1028A00000000000000000000CC0000000000360F9
-:1028B0000000003500801A2D000000000000003FDD
-:1028C000C0280A200000000000000015002F02228E
-:1028D00000000000000000000CE000000000037693
-:1028E0000000001E002F0222000000000000000077
-:1028F0000CE000000000038000000020002F0222F6
-:1029000000000000000000000CE000000000038C4C
-:102910000000000F002F0222000000000000000055
-:102920000CE000000000039800000010002F0222BD
-:1029300000000000000000000CE000000000039810
-:1029400000000006002F022200000000000000002E
-:102950000CE000000000039A00000016002F022285
-:1029600000000000000000000CE000000000039FD9
-:102970000000A2A40020441100000000000000009C
-:1029800000404802000000000800000000290A2260
-:10299000000000000000000340210E2000000000A5
-:1029A0000000000CC0211220000000000008000000
-:1029B000002812240000000000000014C02216208D
-:1029C0000000000000000000002914A40000000026
-:1029D0000000A2A40020441100000000000000003C
-:1029E000002948A2000000000000A1FE00204411C0
-:1029F000000000000000000000404803000000004C
-:102A000081000000002044110000000000000001CF
-:102A10000020481100000000000021F800204411AF
-:102A20000000000000000015002048110000000018
-:102A3000000421F900604411000006140000001594
-:102A400000210230000000000000000014E000003F
-:102A5000000003820000210E00204411000000004D
-:102A600000000000C020480000000000000000003E
-:102A7000C0204800000000000000A2A40020441173
-:102A800000000000000000000040480200000000BC
-:102A9000810000000020441100000000000000013F
-:102AA0000020481100000000000021F8002044111F
-:102AB0000000000000000016002048110000000087
-:102AC000000421F900604411000006140000000316
-:102AD00000210230000000000000000014E00000AF
-:102AE0000000038E000021080020441100000000B7
-:102AF00000000000C02048000000000000000000AE
-:102B0000C0204800000000000000A2A400204411E2
-:102B1000000000000000000000404802000000002B
-:102B20000000201000204411000000000000800080
-:102B30000040481100000000000020100020441157
-:102B4000000000000000800000204811000000008C
-:102B50000001A2A4002044110000000000000000B9
-:102B6000002048110000000000000006004048114D
-:102B700000000000000020100020441100000000B0
-:102B80000000800000204811000000000001A2A405
-:102B90000020441100000000000000000020481147
-:102BA0000000000000000016006048110000035EF5
-:102BB0000000001600404811000000000000000066
-:102BC000C02008000000000000000000C0200C0031
-:102BD000000000000000001D002102230000000092
-:102BE0000000000014E00000000003B981000000B4
-:102BF00000204411000000000000000100204811E6
-:102C000000000000000021F8002044110000000036
-:102C1000000000170020481100000000000421F906
-:102C20000060441100000614000000110021023071
-:102C3000000000000000000014E00000000003ABF2
-:102C400000002100002044110000000000000000EE
-:102C5000002048020000000000000000002048039F
-:102C600000000000BABECAFE0020481100000000AB
-:102C7000CAFEBABE0020481100000000000020106B
-:102C800000204411000000000000800000204811D6
-:102C9000000000000000A2A4002044110000000079
-:102CA00000000004004048110000000000002170F6
-:102CB0000020441100000000000000000020480235
-:102CC0000000000000000000002048030000000099
-:102CD0008100000000204411000000000000000AF4
-:102CE000002048110000000000000000002000103B
-:102CF000000000000000000014C00000000003BE3F
-:102D00008C0000000020441100000000CAFEBABE82
-:102D10000040481100000000810000000020441124
-:102D20000000000000000001002048110000000029
-:102D300000003FFF40280A20000000008000000043
-:102D400040280E200000000040000000C028122093
-:102D50000000000000040000006946220000061484
-:102D6000000000000020141000000000000000001F
-:102D7000002F022300000000000000000CC0000033
-:102D8000000003CC00000000C0401800000003CF8A
-:102D900000003FFFC0281A200000000000040000CF
-:102DA00000694626000006140000000000201810EC
-:102DB0000000000000000000002F022400000000BE
-:102DC000000000000CC00000000003D20000000062
-:102DD000C0401C00000003D500003FFFC0281E209B
-:102DE00000000000000400000069462700000614EF
-:102DF0000000000000201C10000000000000000087
-:102E0000002044020000000000000000002820C54F
-:102E10000000000000000000004948E80000000039
-:102E2000A580000000200811000000000000200024
-:102E300000200C110000000083000000006044111D
-:102E4000000003FD0000000000204402000000001C
-:102E500000000000C020480000000000000000004A
-:102E600040204800000000000000001FC021022098
-:102E7000000000000000000014C00000000003E299
-:102E8000000020100020441100000000000080001D
-:102E900000204811000000000000FFFFC048122081
-:102EA000000003EAA78000000020081100000000D5
-:102EB0000000A00000200C110000000083000000B2
-:102EC00000604411000003FD0000000000204402E7
-:102ED0000000000000000000C020480000000000CA
-:102EE00000000000C0204800000000000000FFFFBC
-:102EF000C0281220000000008300000000204411C0
-:102F000000000000000000000030488300000000C6
-:102F100084000000002044110000000000000000B8
-:102F2000C020480000000000000000001D0000005C
-:102F3000000000008300000000604411000003FD59
-:102F400000000000C040040000000001A980000053
-:102F500000200811000000000000C00000400C111B
-:102F6000000003E5AB800000002008110000000015
-:102F70000000F8E000400C11000003E5AD80000007
-:102F800000200811000000000000F88000400C1133
-:102F9000000003E5B38000000020081100000000DD
-:102FA0000000F3FC00400C11000003E5AF800000BE
-:102FB00000200811000000000000E00000400C119B
-:102FC000000003E5B18000000020081100000000AF
-:102FD0000000F00000400C11000003E58300000039
-:102FE000002044110000000000002148002048118A
-:102FF00000000000840000000020441100000000D8
-:1030000000000000C0204800000000000000000098
-:103010001D00000000000000000000000080000013
-:103020000000000000182000C03046200000000012
-:1030300000000000D900480000000000000000006F
-:10304000C0200400000000000000000000A0000AF2
-:10305000000000000018A000C03046200000000062
-:1030600000000000D900480000000000000000003F
-:10307000C0200400000000000000000000A0000AC2
-:10308000000000000018C000C03046200000000012
-:1030900000000000D900480000000000000000000F
-:1030A000C0200400000000000000000000A0000A92
-:1030B000000000000018F8E0C030462000000000CA
-:1030C00000000000D90048000000000000000000DF
-:1030D000C0200400000000000000000000A0000A62
-:1030E000000000000018F880C030462000000000FA
-:1030F00000000000D90048000000000000000000AF
-:10310000C0200400000000000000000000A0000A31
-:10311000000000000018E000C03046200000000061
-:1031200000000000D900480000000000000000007E
-:10313000C0200400000000000000000000A0000A01
-:10314000000000000018F000C03046200000000021
-:1031500000000000D900480000000000000000004E
-:10316000C0200400000000000000000000A0000AD1
-:10317000000000000018F3FCC030462000000000F2
-:1031800000000000D900480000000000000000001E
-:10319000C0200400000000000000000000A0000AA1
-:1031A0000000000086000000002044110000000024
-:1031B0000000000000404801000000008500000001
-:1031C0000020441100000000000000000040480101
-:1031D000000000000000217C0020441100000000DD
-:1031E00000000000C02048000000000000000000B7
-:1031F000C02048000000000000000000C02048007F
-:1032000000000000810000000020441100000000C8
-:103210000000000100204811000000000000000034
-:10322000C02008000000000000000000170000009F
-:10323000000000000004217F00604411000006141B
-:103240000000001F0021023000000000000000000C
-:1032500014C00000000000000000000000404C020C
-:103260000000042E00000000C0200C000000000040
-:1032700000000000C020100000000000000000005E
-:10328000C02014000000000000000000C020180052
-:103290000000000000000000C0201C000000000032
-:1032A00000007F0000280A21000000000000450007
-:1032B000002F022200000000000000000CE00000CF
-:1032C0000000043C00000000C020200000000000BE
-:1032D00000000000170000000000000000000010C7
-:1032E00000280A230000000000000010002F022226
-:1032F00000000000000000000CE00000000004449A
-:1033000081000000002044110000000000000001C6
-:10331000002048110000000000040000006946245D
-:103320000000061400000000004000000000044DF2
-:103330008100000000204411000000000000000097
-:1033400000204811000000000000216D0020441101
-:103350000000000000000000002048040000000001
-:1033600000000000002048050000000000000000F0
-:103370001AC00000000004499E0000000020441113
-:1033800000000000CAFEBABE002048110000000084
-:10339000000000001AE000000000044C00000000E3
-:1033A000002824F0000000000000000700280A2385
-:1033B0000000000000000001002F022200000000B9
-:1033C000000000000AE000000000045400000000BB
-:1033D000002F00C9000000000000000004E0000011
-:1033E0000000046D00000000004000000000047AAE
-:1033F00000000002002F0222000000000000000078
-:103400000AE000000000045900000000002F00C97D
-:10341000000000000000000002E000000000046D59
-:1034200000000000004000000000047A00000003DB
-:10343000002F022200000000000000000AE000004F
-:103440000000045E00000000002F00C90000000022
-:10345000000000000CE000000000046D000000000F
-:10346000004000000000047A00000004002F022247
-:1034700000000000000000000AE0000000000463FB
-:1034800000000000002F00C9000000000000000044
-:103490000AE000000000046D000000000040000091
-:1034A0000000047A00000005002F02220000000046
-:1034B000000000000AE000000000046800000000B6
-:1034C000002F00C9000000000000000006E000001E
-:1034D0000000046D00000000004000000000047ABD
-:1034E00000000006002F0222000000000000000083
-:1034F0000AE000000000046D00000000002F00C979
-:10350000000000000000000008E000000000046D62
-:1035100000000000004000000000047A00007F006E
-:1035200000280A210000000000004500002F0222B0
-:1035300000000000000000000AE0000000000000A1
-:103540000000000800210A23000000000000000025
-:1035500014C000000000047700002169002044111D
-:103560000000000000000000C02048000000000033
-:1035700000000000C0204800000000000000000023
-:10358000C020480000000000CAFEBABE004048113A
-:103590000000000000000000C02044000000000007
-:1035A00000000000C020000000000000000000003B
-:1035B000C04048000000000000007F0000280A21F1
-:1035C0000000000000004500002F02220000000063
-:1035D000000000000AE0000000000480000000007D
-:1035E000C02000000000000000000000C02000001B
-:1035F0000000000000000000C040000000000000CB
-:103600000000000000404C080000043C00000000E6
-:10361000C0200800000000000000001040210E2023
-:1036200000000000000000114021122000000000F6
-:103630000000001240211620000000000000216957
-:10364000002044110000000000000000002048029B
-:103650000000000000000000002102250000000022
-:103660000000000014E000000000048A00040000D4
-:10367000C0494A200000048BFFFBFFFFC0284A20FE
-:1036800000000000000000000021022300000000F4
-:103690000000000014E0000000000497000000009B
-:1036A000C02048000000000000000000C0204800CA
-:1036B00000000000000000000021022400000000C3
-:1036C0000000000014C000000000000081000000A5
-:1036D00000204411000000000000000C00204811F0
-:1036E00000000000000000000020001000000000AA
-:1036F0000000000014C0000000000493A0000000BF
-:103700000020441100000000CAFEBABE004048116B
-:1037100000000000810000000020441100000000B3
-:103720000000000400204811000000000000216B90
-:10373000002044110000000000000000C0204810DC
-:103740000000000081000000002044110000000083
-:103750000000000500204811000000000000216C5E
-:10376000002044110000000000000000C0204810AC
-:103770000000000000000000002F022400000000F4
-:10378000000000000CE0000000000000000000004D
-:10379000004000000000049100000000C0210A2049
-:1037A000000000000000000014C00000000004AE93
-:1037B0008100000000204411000000000000000013
-:1037C00000204811000000000000216D002044117D
-:1037D0000000000000000000C020480000000000C1
-:1037E00000000000C02048000000000000000000B1
-:1037F0001AC00000000004A99E000000002044112F
-:1038000000000000CAFEBABE0020481100000000FF
-:10381000000000001AE00000000004AC00000000FE
-:1038200000400000000004B28100000000204411AC
-:10383000000000000000000100204811000000000E
-:1038400000040000C0294620000000000000000025
-:10385000C0600000000006140000000100210222E8
-:10386000000000000000000014C00000000004B9C7
-:103870000000216900204411000000000000000049
-:10388000C02048000000000000000000C0204800E8
-:1038900000000000000000000020481000000000B0
-:1038A000CAFEBABE0040481100000000000000003F
-:1038B000C02044000000000000000000C04048108C
-:1038C0000000000081000000002044110000000002
-:1038D000000000010020481100000000000021F855
-:1038E00000204411000000000000000D00204811DD
-:1038F00000000000000421F90060441100000614DB
-:103900000000000000210230000000000000000064
-:1039100014C00000000004BB0000218000204411FE
-:103920000000000000000000C0204800000000006F
-:1039300000000000C02000000000000000000000A7
-:10394000C02048000000000000000000C02000006F
-:103950000000000000000000C0404800000000001F
-:103960000000000300333E2F0000000000000001B3
-:1039700000210221000000000000000014E000000F
-:10398000000004EB0000003500200A2D00000000BC
-:103990000004000018E00C11000004DA000000012F
-:1039A00000333E2F00000000000021690020441178
-:1039B000000000000000000000204802000000009D
-:1039C0000000000000204803000000000000000884
-:1039D00000300A220000000000000000C020480063
-:1039E0000000000000000000C020480000000000AF
-:1039F00000002169002044110000000000000000C8
-:103A000000204802000000000000000000204803E1
-:103A1000000000000000000800300A220000000042
-:103A200000000000C020480000000000000000006E
-:103A3000D8C04800000004CE0000216900204411D5
-:103A4000000000000000000000204802000000000C
-:103A500000000000002048030000000000000008F3
-:103A600000300A220000000000000000C0204800D2
-:103A70000000000000000000C0204800000000001E
-:103A8000000000360020122D0000000000000000A1
-:103A900000290C830000000000002169002044116F
-:103AA00000000000000000000020480200000000AC
-:103AB0000000000000204803000000000000000893
-:103AC00000300A220000000000000000C020480072
-:103AD0000000000000000000C020480000000000BE
-:103AE000000000110021022400000000000000007E
-:103AF00014C00000000000000000000000400000B2
-:103B00000000049100000035C020362000000000B5
-:103B100000000036C0403620000000000000304A9F
-:103B20000020441100000000E0000000C0484A20CE
-:103B3000000000000000000F002102210000000032
-:103B40000000000014C00000000004F200000000AB
-:103B5000006000000000000B00000000D900000021
-:103B60000000000000000000C04004000000000150
-:103B7000810000000020441100000000000000024D
-:103B80000020481100000000000000FF00280E3057
-:103B90000000000000000000002F022300000000D1
-:103BA000000000000CC00000000004F6000000004F
-:103BB000C0200800000000000000000014C0000049
-:103BC0000000050B0000000000200C1100000000A8
-:103BD0000000002400203623000000000000003414
-:103BE00000203623000000000000003200203623B1
-:103BF000000000000000003100203623000000001B
-:103C00000000001D00203623000000000000002DF1
-:103C100000203623000000000000002E0020362384
-:103C2000000000000000001B002036230000000000
-:103C30000000001C0020362300000000FFFFE00011
-:103C400000200C1100000000000000290020362395
-:103C5000000000000000002A0020362300000000C1
-:103C600000001FFF00200C11000000000000002BCE
-:103C700000203623000000000000002C0020362326
-:103C800000000000F1FFFFFF00283A2E00000000B6
-:103C90000000001AC0220E200000000000000000FA
-:103CA0000029386E0000000081000000002044114F
-:103CB0000000000000000006002048110000000085
-:103CC0000000003340203620000000008700000084
-:103CD000002044110000000000000000C020480047
-:103CE000000000000000A1F40020441100000000CA
-:103CF0000000000000204810000000009D000000AF
-:103D000000204411000000000000001F40214A2054
-:103D10000000000096000000002044110000000098
-:103D200000000000C020480000000000000000006B
-:103D3000C0200C000000000000000000C0201000A7
-:103D4000000000000000001F0021162400000000F9
-:103D50000000000014C0000000000000000000256A
-:103D600000203623000000000000000300281E236E
-:103D700000000000000000080022222300000000D4
-:103D8000FFFFF000002822280000000000000000D3
-:103D9000002920E80000000000000027002036284D
-:103DA000000000000000001800211E230000000099
-:103DB000000000280020362700000000000000025C
-:103DC000002216240000000000000000003014A8AB
-:103DD0000000000000000026002036250000000042
-:103DE0000000000300211A24000000001000000061
-:103DF00000281A2600000000EFFFFFFF00283A2EDF
-:103E00000000000000000000004938CE000006025B
-:103E10000000000140280A20000000000000000609
-:103E200040280E200000000000000300C0281220DF
-:103E30000000000000000008002112240000000023
-:103E400000000000C020162000000000000000005C
-:103E5000C0201A2000000000000000000021022203
-:103E6000000000000000000014C000000000054138
-:103E7000810000000020441100000000000000014B
-:103E800000204811000000000000225800300A24E1
-:103E90000000000000040000006946220000061433
-:103EA0000000216900204411000000000000000013
-:103EB00000204805000000000002000000294A26FA
-:103EC000000000000000000000204810000000007A
-:103ED000CAFEBABE00204811000000000000000227
-:103EE000002F022300000000000000000CC00000B2
-:103EF0000000054900000000C0201C100000000068
-:103F000000000000C04000000000055B000000024F
-:103F1000002F022300000000000000000CC0000081
-:103F2000000005498100000000204411000000004D
-:103F3000000000010020481100000000000022588D
-:103F400000300A240000000000040000006946223E
-:103F50000000061400000000C0201C10000000003B
-:103F600000000000C04000000000055B00000000F1
-:103F7000002F022300000000000000000CC0000021
-:103F80000000054D00000000C0201C0000000000E3
-:103F900000000000C04000000000055B00000004BD
-:103FA000002F022300000000000000000CC00000F1
-:103FB00000000559810000000020441100000000AD
-:103FC0000000000000204811000000000000216DEA
-:103FD000002044110000000000000000C020480044
-:103FE0000000000000000000C020480000000000A9
-:103FF000000000001AC00000000005549E000000F0
-:104000000020441100000000CAFEBABE0020481182
-:1040100000000000000000001AE00000000005574A
-:104020000000000000401C100000055B00000000C4
-:10403000C02000000000000000000000C0400000A0
-:1040400000000000000000000EE000000000055D20
-:104050000000000000600000000005A40000000057
-:10406000002F022400000000000000000CC000002F
-:104070000000056D0000A2B7002044110000000000
-:104080000000000000204807000000008100000040
-:104090000020441100000000000000010020481131
-:1040A000000000000004A2B60060441100000614E5
-:1040B0000000001A0021223000000000000000066D
-:1040C00000222630000000000000A2C4002044119D
-:1040D0000000000000000000003048E9000000007F
-:1040E0000000000000E000000000056B0000A2D10D
-:1040F00000204411000000000000000000404808BB
-:10410000000000000000A2D10020441100000000C7
-:104110000000000100504A280000000000000001DB
-:10412000002F022400000000000000000CC000006E
-:104130000000057D0000A2BB00204411000000002B
-:10414000000000000020480700000000810000007F
-:104150000020441100000000000000010020481170
-:10416000000000000004A2BA006044110000061420
-:104170000000001A002122300000000000000006AC
-:1041800000222630000000000000A2C500204411DB
-:104190000000000000000000003048E900000000BE
-:1041A0000000000000E000000000057B0000A2D23B
-:1041B00000204411000000000000000000404808FA
-:1041C000000000000000A2D2002044110000000006
-:1041D0000000000100504A2800000000000000021A
-:1041E000002F022400000000000000000CC00000AE
-:1041F0000000058D0000A2BF002044110000000057
-:1042000000000000002048070000000081000000BE
-:1042100000204411000000000000000100204811AF
-:10422000000000000004A2BE00604411000006145B
-:104230000000001A002122300000000000000006EB
-:1042400000222630000000000000A2C60020441119
-:104250000000000000000000003048E900000000FD
-:104260000000000000E000000000058B0000A2D369
-:104270000020441100000000000000000040480839
-:10428000000000000000A2D3002044110000000044
-:104290000000000100504A28000000000000A2C3F6
-:1042A000002044110000000000000000002048072A
-:1042B0000000000081000000002044110000000008
-:1042C0000000000100204811000000000004A2C20C
-:1042D00000604411000006140000001A0021223082
-:1042E0000000000000000006002226300000000050
-:1042F0000000A2C7002044110000000000000000E0
-:10430000003048E9000000000000000000E000006C
-:10431000000005990000A2D4002044110000000014
-:104320000000000000404808000000000000A2D487
-:1043300000204411000000000000000100504A2845
-:104340000000000085000000002044110000000073
-:104350000000000000204801000000000000304A7A
-:10436000002044110000000001000000002048115E
-:104370000000000000000000004000000000059F59
-:10438000A4000000C0204411000000000000000054
-:10439000C04048000000000000000000C0600000B5
-:1043A000000005A400000000C0400400000000015F
-:1043B0000001A2A400204411000000000000000041
-:1043C00000204811000000000000000000204811FB
-:1043D0000000000000000000002048110000000064
-:1043E000000000000020481100000000000000054F
-:1043F00000204811000000000000A1F4002044113A
-:104400000000000000000000002048110000000033
-:10441000880000000020441100000000000000019E
-:104420000020481100000000FF000000002044119F
-:104430000000000000000000002048110000000003
-:1044400000000001002048110000000000000002F0
-:104450000080481100000000000000000EE0000095
-:10446000000005B700001000002008110000000047
-:104470000000003400203622000000000000000090
-:1044800000600000000005BB0000000000600000AC
-:10449000000005A498000000002044110000000066
-:1044A0000000000000804811000000000000000033
-:1044B000C0600000000005BB00000000C040040018
-:1044C000000000010000A2A4002044110000000030
-:1044D00000000022002048110000000089000000B8
-:1044E00000204411000000000000000100204811DD
-:1044F00000000000FF000000002044110000000048
-:104500000000000000204811000000000000000131
-:104510000020481100000000000000020080481147
-:10452000000000000000217AC020441100000000BB
-:10453000000000000040481100000000970000004B
-:10454000002044110000000000000000002048117D
-:10455000000000008A00000000204411000000005C
-:10456000000000000020481100000000FF000000D3
-:10457000002044110000000000000000002048114D
-:1045800000000000000000010020481100000000B1
-:104590000000000200804811000000000000000040
-:1045A00000600000000005E1000020100020441120
-:1045B0000000000000008000002048110000000002
-:1045C0000001A2A4C020441100000000000000006F
-:1045D0000020481100000000000000160060481193
-:1045E0000000035E000000160020481100000000DB
-:1045F0000000201000204411000000000001000015
-:10460000002048110000000081000000002044113B
-:104610000000000000000001002048110000000020
-:104620000000217C002044110000000009800000EF
-:104630000020481100000000FFFFFFFF002048118C
-:1046400000000000000000000020481100000000F1
-:104650000000000017000000000000000004217F9F
-:1046600000604411000006140000001F0021023009
-:10467000000000000000000014C000000000000066
-:104680000000000400404C11000005DC0000001D8B
-:1046900000201E2D000000000000000400291E273D
-:1046A000000000000000001D008036270000000010
-:1046B0000000001D00201E2D00000000FFFFFFFB7A
-:1046C00000281E27000000000000001D0080362783
-:1046D000000000000000001D00201E2D0000000052
-:1046E0000000000800291E27000000000000001D37
-:1046F00000803627000000000000001D00201E2D55
-:1047000000000000FFFFFFF700281E270000000048
-:104710000000001D0080362700000000000020106F
-:10472000002044110000000000008000002048111B
-:10473000000000000001A2A40020441100000000BD
-:1047400000000000002048110000000000000016DA
-:10475000006048110000035E0000001600204811B0
-:1047600000000000000020100020441100000000A4
-:104770000001000000204811000000000000217C22
-:1047800000204411000000000180000000204811BA
-:104790000000000000FFFFFF0020481100000000A3
-:1047A0000000000000204811000000000000000090
-:1047B00017000000000000008100000000204411EC
-:1047C000000000000000000100204811000000006F
-:1047D0000004217F00604411000006140000000066
-:1047E00000200010000000000000000014C00000C5
-:1047F000000006130000001000404C11000005F9F5
-:1048000000000000C02004000000000000000000C4
-:1048100038C00000000000000000002500200A2D24
-:10482000000000000000002600200E2D0000000007
-:10483000000000270020122D0000000000000028CA
-:104840000020162D00000000000021690020441106
-:1048500000000000000000000020480400000000EC
-:1048600000000000002048050000000000000000DB
-:104870000020480100000000CAFEBABE0020481116
-:1048800000000000000000040030122400000000BE
-:1048900000000000002F0064000000000000000085
-:1048A0000CC00000000006120000000300281A22BD
-:1048B000000000000000000800221222000000009A
-:1048C000FFFFF0000028122400000000000000009C
-:1048D000002910C40000000000000027004036241A
-:1048E0000000000000000000008000000000000048
-:1048F000000000001AC00000000006149F00000025
-:104900000020441100000000CAFEBABE0020481179
-:1049100000000000000000001AE000000000061780
-:104920000000000000800000000000000000000007
-:10493000006000000000000B000010000060041187
-:10494000000002FE00000000002004110000000032
-:1049500000000000006008110000019F0000225CC0
-:104960000020441100000000000000030020481156
-:10497000000000000000225600204411000000004A
-:104980000000001B00204811000000000000A1FCF6
-:104990000020441100000000000000010020481128
-:1049A000000000000001A1FDC02044110000000033
-:1049B0000000002900201E2D000000000000001053
-:1049C00000221E27000000000000002C0020222DE5
-:1049D000000000000000FFFF002822280000000067
-:1049E000000000000029490700000000000000004E
-:1049F00000204811000000000000002A0020222DA5
-:104A0000000000000000FFFF002822280000000036
-:104A1000000000000029490700000000000000001D
-:104A200000204811000000000000002B00201E2D77
-:104A3000000000000000001000221E2700000000FF
-:104A400000000000002949070000000000000000ED
-:104A500000404811000000000000000000000000BD
-:104A60000000000000000000000000000000000046
-:104A70000000000000000000000000000000000036
-:104A80000000000000000000000000000000000026
-:104A90000000000000000000000000000000000016
-:104AA0000000000000000000000000000000000006
-:104AB00000000000000000000000000000000000F6
-:104AC00000000000000000000000000000000000E6
-:104AD00000000000000000000000000000000000D6
-:104AE00000000000000000000000000000000000C6
-:104AF00000000000000000000000000000000000B6
-:104B000000000000000000000000000000000000A5
-:104B10000000000000000000000000000000000095
-:104B20000000000000000000000000000000000085
-:104B30000000000000000000000000000000000075
-:104B40000000000000000000000000000000000065
-:104B50000000000000000000000000000000000055
-:104B60000000000000000000000000000000000045
-:104B70000000000000000000000000000000000035
-:104B80000000000000000000000000000000000025
-:104B90000000000000000000000000000000000015
-:104BA0000000000000000000000000000000000005
-:104BB00000000000000000000000000000000000F5
-:104BC00000000000000000000000000000000000E5
-:104BD00000000000000000000000000000000000D5
-:104BE00000000000000000000000000000000000C5
-:104BF00000000000000000000000000000000000B5
-:104C000000000000000000000000000000000000A4
-:104C10000000000000000000000000000000000094
-:104C20000000000000000000000000000000000084
-:104C30000000000000000000000000000000000074
-:104C40000000000000000000000000000000000064
-:104C50000000000000000000000000000000000054
-:104C60000000000000000000000000000000000044
-:104C70000000000000000000000000000000000034
-:104C80000000000000000000000000000000000024
-:104C90000000000000000000000000000000000014
-:104CA0000000000000000000000000000000000004
-:104CB00000000000000000000000000000000000F4
-:104CC00000000000000000000000000000000000E4
-:104CD00000000000000000000000000000000000D4
-:104CE00000000000000000000000000000000000C4
-:104CF00000000000000000000000000000000000B4
-:104D000000000000000000000000000000000000A3
-:104D10000000000000000000000000000000000093
-:104D20000000000000000000000000000000000083
-:104D30000000000000000000000000000000000073
-:104D40000000000000000000000000000000000063
-:104D50000000000000000000000000000000000053
-:104D60000000000000000000000000000000000043
-:104D70000000000000000000000000000000000033
-:104D80000000000000000000000000000000000023
-:104D90000000000000000000000000000000000013
-:104DA0000000000000000000000000000000000003
-:104DB00000000000000000000000000000000000F3
-:104DC00000000000000000000000000000000000E3
-:104DD00000000000000000000000000000000000D3
-:104DE00000000000000000000000000000000000C3
-:104DF00000000000000000000000000000000000B3
-:104E000000000000000000000000000000000000A2
-:104E10000000000000000000000000000000000092
-:104E20000000000000000000000000000000000082
-:104E30000000000000000000000000000000000072
-:104E40000000000000000000000000000000000062
-:104E50000000000000000000000000000000000052
-:104E60000000000000000000000000000000000042
-:104E70000000000000000000000000000000000032
-:104E80000000000000000000000000000000000022
-:104E90000000000000000000000000000000000012
-:104EA0000000000000000000000000000000000002
-:104EB00000000000000000000000000000000000F2
-:104EC00000000000000000000000000000000000E2
-:104ED00000000000000000000000000000000000D2
-:104EE00000000000000000000000000000000000C2
-:104EF00000000000000000000000000000000000B2
-:104F000000000000000000000000000000000000A1
-:104F10000000000000000000000000000000000091
-:104F20000000000000000000000000000000000081
-:104F30000000000000000000000000000000000071
-:104F40000000000000000000000000000000000061
-:104F50000000000000000000000000000000000051
-:104F60000000000000000000000000000000000041
-:104F70000000000000000000000000000000000031
-:104F80000000000000000000000000000000000021
-:104F90000000000000000000000000000000000011
-:104FA0000000000000000000000000000000000001
-:104FB00000000000000000000000000000000000F1
-:104FC00000000000000000000000000000000000E1
-:104FD00000000000000000000000000000000000D1
-:104FE00000000000000000000000000000000000C1
-:104FF00000000000000000000000000000000000B1
-:1050000000000000000000000000000000000000A0
-:105010000000000000000000000000000000000090
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000000000070
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B000013304EF059B02390000000001B00159E1
-:1052C0000425059B00000000021201F6023901428C
-:1052D000000000000210022E0289022A00000000D5
-:1052E00003C2059B059B059B0000000005CD05CE74
-:1052F0000308059B00000000059B05A00309032986
-:10530000000000000313026B032B031D00000000CC
-:10531000059B059B059B059B00000000059B052C3C
-:10532000059B059B0000000003A5059B04A2032D1F
-:1053300000000000048104330423059B00000000EA
-:1053400004BB04ED042704C800000000043304F487
-:10535000033A036500000000059B059B059B059B28
-:1053600000000000059B059B059B059B00000000BD
-:10537000059B059B05B905A200000000059B059B48
-:105380000007059B00000000059B059B059B059BF6
-:1053900000000000059B059B059B059B000000008D
-:1053A00003E303D803F303F10000000003F903F55E
-:1053B00003F703FB0000000004070403040F040BC1
-:1053C0000000000004170413041F041B0000000069
-:1053D000059B059B059B059B00000000059B059B0D
-:1053E000059B059B00000000059B059B059B059BFD
-:1053F0000000000000020600061900060000000080
-:00000001FF
diff --git a/firmware/radeon/R600_pfp.bin.ihex b/firmware/radeon/R600_pfp.bin.ihex
deleted file mode 100644
index 52361086c280..000000000000
--- a/firmware/radeon/R600_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000D4007100D4007200CA040000A00000F7
-:10001000007E828B0080000300CA040000D4401ED2
-:1000200000EE001E00CA040000A00000007E828BCB
-:1000300000C4183800CA240000CA2800009581A80E
-:1000400000C41C3A00C3C00000CA080000CA0C006B
-:10005000007C744B00C200050099C00000C41C3A2B
-:10006000007C744C00C0FFF000042C0400309002AF
-:10007000007D250000351402007D350B002554035A
-:10008000007CD58000259C030095C00400D5001B92
-:10009000007EDDC1007D9D8000D6801B00D5801BC9
-:1000A00000D4401E00D5401E00D6401E00D6801E43
-:1000B00000D4801E00D4C01E009783D400D5C01E7B
-:1000C00000CA08000080001B00CA0C0000E4011EEA
-:1000D00000D4001E0080000D00C4183800E4013E6A
-:1000E00000D4001E0080000D00C4183800D4401E4B
-:1000F00000EE001E00CA040000A00000007E828BFB
-:1001000000E4011E00D4001E00D4401E00EE001EBC
-:1001100000CA040000A00000007E828B00E4013EC3
-:1001200000D4001E00D4401E00EE001E00CA0400D1
-:1001300000A00000007E828B00CA180000D4401E80
-:1001400000D5801E0080005400D4007300D4401EEF
-:1001500000CA080000CA0C0000CA100000D48019B0
-:1001600000D4C01800D5001700D4801E00D4C01ED3
-:1001700000D5001E00E2001E00CA040000A000001E
-:10018000007E828B00CA080000D4806000D4401E2C
-:100190000080000200D4801E00CA080000D48061E4
-:1001A00000D4401E0080000200D4801E00CA080057
-:1001B00000CA0C0000D4401E00D4801600D4C01623
-:1001C00000D4801E008001B900D4C01E00C6083EC5
-:1001D00000CA0C0000CA10000094800400CA140079
-:1001E00000E420F300D4201300D5606500D4E01CA7
-:1001F00000D5201C00D5601C0080000200062001F4
-:1002000000C6083E00CA0C0000CA1000009483F724
-:1002100000CA140000E420F30080007A00D4201308
-:1002200000C6083E00CA0C0000CA1000009883EF08
-:1002300000CA140000D400640080008E000000009A
-:1002400000C4143200C6183E00C4082F00954005B3
-:1002500000C40C3000D4401E0080000200EE001EDE
-:10026000009583F500C4103100D4403300D52065DB
-:1002700000D4A01C00D4E01C00D5201C00D40073C6
-:1002800000E4015E00D4001E008001B900062001D8
-:10029000000A200100D6007400C4083600C61040D1
-:1002A0000098800700CC38350095010F00D4001F5E
-:1002B00000D460620080000200D4206200CC1433BD
-:1002C000008401BC00D4007000D5401E00800002F4
-:1002D00000EE001E00CA0C0000CA100000D4C01AB4
-:1002E000008401BC00D5001A00CC04430035101F67
-:1002F000002C9401007D098B00984005007D15CBF2
-:1003000000D4001A008001B900D4006D003444010B
-:1003100000CC0C440098403A00CC2C460095800458
-:1003200000CC0445008001B900D4001A00D4C01AE2
-:1003300000282801008400F300CC10030098801BE3
-:100340000004380C008400F300CC100300988017E0
-:1003500000043808008400F300CC100300988013D8
-:1003600000043804008400F300CC100300988014CB
-:1003700000CC1047009A800900CC1448009840DA5D
-:1003800000D4006D00CC184400D5001A00D5401AE6
-:10039000008000CC00D5801A0096C0D300D4006D38
-:1003A000008001B900D4006E009AC00300D4006D33
-:1003B00000D4006E0080000200EC007F009AC0CAEA
-:1003C00000D4006D008001B900D4006E00CC14038D
-:1003D00000CC180300CC1C03007D9103007DD58365
-:1003E000007D190C0035CC1F0035701F007CF0CB50
-:1003F000007CD08B00880000007E8E8B0095C004AE
-:1004000000D4006E008001B900D4001A00D4C01AD4
-:1004100000CC080300CC0C0300CC100300CC140368
-:1004200000CC180300CC1C0300CC240300CC280310
-:100430000035C41F0036B01F007C704B0034F01F25
-:10044000007C704B0035701F007C704B007D8881F4
-:10045000007DCCC1007E5101007E9541007C9082E0
-:10046000007CD4C2007C848B009AC003007C8C8BFF
-:10047000002C88010098809C00D4006D0098409A60
-:1004800000D4006E00CC084700CC0C4800CC1044CF
-:1004900000D4801A00D4C01A0080010400D5001ACC
-:1004A00000CC083200D40032009482D800CA0C007C
-:1004B00000D4401E0080000200D4001E00E4011E93
-:1004C00000D4001E00CA080000CA0C0000CA1000B8
-:1004D00000D4401E00CA140000D4801E00D4C01EE8
-:1004E00000D5001E00D5401E00D54034008000021B
-:1004F00000EE001E0028040400E2001A00E2001AC8
-:1005000000D4401A00CA380000CC080300CC0C0309
-:1005100000CC0C0300CC0C03009882BC000000004F
-:10052000008401BC00D7806F0080000200EE001F35
-:1005300000CA040000C2FF0000CC083400C13FFF25
-:10054000007C74CB007CC90B007D010F009902AFC9
-:10055000007C738B008401BC00D7806F0080000298
-:1005600000EE001F00CA080000281900007D898BDA
-:10057000009580140028140400CA0C0000CA100062
-:1005800000CA1C0000CA240000E2001F00D4C01AE8
-:1005900000D5001A00D5401A00CC180300CC2C035B
-:1005A00000CC2C0300CC2C03007DA58B007D9C4748
-:1005B00000984296000000000080016400D4C01A38
-:1005C00000D4401E00D4801E0080000200EE001EF9
-:1005D00000E4011E00D4001E00D4401E00EE001EE8
-:1005E00000CA040000A00000007E828B00E4013EEF
-:1005F00000D4001E00D4401E00EE001E00CA0400FD
-:1006000000A00000007E828B00CA080000248C0637
-:10061000000CCC060098C00600CC104900990004DC
-:1006200000D4007100E4011E00D4001E00D4401E5E
-:1006300000D4801E0080000200EE001E00CA0800E8
-:1006400000CA0C000034D018002510010095001FCE
-:1006500000C17FFF00CA100000CA140000CA1800C1
-:1006600000D4801D00D4C01D007DB18B00C14202AA
-:1006700000C2C00100D5801D0034DC0E007D5D4C41
-:10068000007F734C00D7401E00D5001E00D5401ED1
-:1006900000C1420000C2C00000099C010031DC1012
-:1006A000007F5F4C007F734C007D838000D5806F9E
-:1006B00000D5806600D7401E00EC005E00C8240212
-:1006C000008001B900D6007400D4401E00D4801E02
-:1006D00000D4C01E0080000200EE001E0080000258
-:1006E00000EE001F00D4001F0080000200D4001F95
-:1006F00000D4001F0088000000D4001F000000008C
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:10080000000101740002017B0003009000040080DD
-:100810000005000500060040000700330008012F16
-:1008200000090047000A0037001001B7001700A4B4
-:100830000022013D0023014C002000B500240128C6
-:100840000027004E0028006B002A0061002B005397
-:10085000002F00660032008800340182003C0159FC
-:10086000003F00730041018F0044013100550176C3
-:100870000056017D0060000C006100350062003907
-:1008800000630039006400390065003900660039F2
-:10089000006700390068003B00690042006A0049B7
-:1008A000006B0049006C0049006D0049006E004972
-:1008B000006F0049007301B7000000070000000747
-:1008C000000000070000000700000007000000070C
-:1008D00000000007000000070000000700000007FC
-:1008E00000000007000000070000000700000007EC
-:1008F00000000007000000070000000700000007DC
-:00000001FF
diff --git a/firmware/radeon/RS600_cp.bin.ihex b/firmware/radeon/RS600_cp.bin.ihex
deleted file mode 100644
index 4a895016aca4..000000000000
--- a/firmware/radeon/RS600_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:10000000000000004200E000000000004000E000AE
-:1000100000000008000000A000000008000000A48C
-:10002000000000004A554B4A000000004A4A44675D
-:100030000000000055526F75000000004A7E7D658B
-:10004000000000004AE74AF6000000004AD34A4A8E
-:1000500000000000D689898900000000CD4ADDCF6C
-:10006000000000008EBE4AE200000000C38A8A8AB7
-:10007000000000004A0F8CC800000004000CA00023
-:1000800000000038000D0012000000040000E8B479
-:1000900000000038000D0014000000040000E8B665
-:1000A00000000038000D0016000000040000E854B5
-:1000B00000000038000D0018000000040000E855A2
-:1000C00000000038000D001A000000040000E8568F
-:1000D00000000038000D001C000000040000E8577C
-:1000E00000000038000D001E000000040000E8249D
-:1000F00000000038000D0020000000040000E8258A
-:1001000000000038000D0022000000040000E8306C
-:1001100000000038000D0024000000040000F0C0C2
-:1001200000000038000D0026000000040000F0C1AF
-:1001300000000038000D0028000000040000F0411D
-:1001400000000038000D002A000000040000F184C7
-:1001500000000038000D002C000000040000F185B4
-:1001600000000038000D002E000000040000F186A1
-:1001700000000038000D0030000000040000F1878E
-:1001800000000038000D0032000000040000F18083
-:1001900000000038000D0034000000040000F3935C
-:1001A00000000038000D0036000000040000F38A53
-:1001B00000000038000D0038000000040000F38E3D
-:1001C000000000040000E821000000040140A0003D
-:1001D00000000018000000430000000400CCE8000C
-:1001E00000000004001B000100000004080048009B
-:1001F00000000004001B000100000004080048008B
-:1002000000000004001B000100000004080048007A
-:10021000000000080000003A000000000000A000FC
-:10022000000000042000451D000000040000E580DF
-:1002300000000004000CE581000000040800458077
-:1002400000000004000CE5810000000800000047E9
-:10025000000000000000A00000000004000C2000CE
-:10026000000000040000E50E000000040003200070
-:10027000000000280002205100000024000000516E
-:10028000000000040800450F000000080000A04B1B
-:10029000000000040000E565000000040000E566C1
-:1002A00000000008000000520000000403CCA5B4C8
-:1002B00000000004054320000000000400022000AC
-:1002C000000000304CCCE05E0000000408274565CB
-:1002D000000000300000005E0000000408004564DB
-:1002E000000000040000E566000000080000005562
-:1002F00000000010008020610000000400202000A9
-:1003000000000004001B00FF00000010010000645A
-:1003100000000004001F200000000004001C00FF7B
-:100320000000000C0000000000000030000000721F
-:100330000000000800000055000000040000E57601
-:10034000000000040000E577000000040000E50E56
-:10035000000000040000E50F000000040140A000C0
-:100360000000001800000069000000C200C0E5F9AC
-:100370000000000800000069000000040014E50E01
-:10038000000000040040E50F0000000800C0006C01
-:10039000000000040000E570000000040000E571AA
-:1003A0000000000C0000E572000000040000A00046
-:1003B000000000040140A000000000040000E56807
-:1003C00000000004000C200000000018000000766F
-:1003D00000000004000B00000000000418C0E562EB
-:1003E00000000008000000780000000800C000774E
-:1003F00000000004000700D5000000380000008461
-:1004000000000030000CA08600000004080045BB7E
-:1004100000000030000C2087000000000800E5BC50
-:10042000000000040000E5BB000000000000E5BC87
-:100430000000000C00120000000000040012000088
-:100440000000000C001B0002000000040000A000DF
-:10045000000000040000E821000000000000E800A7
-:10046000000000040000E821000000000000E82E69
-:100470000000000402CCA0000000000400140000F2
-:1004800000000004000CE1CC00000004050DE1CDEB
-:10049000000000040040000000000018000000966A
-:1004A0000000000400C0A00000000008000000934D
-:1004B0000000002000000098000000004200E00062
-:1004C000000000380000009F00000004000CA000A5
-:1004D000000000040014000000000004000C2000D4
-:1004E000000000040016000000000004700CE00092
-:1004F000000000080014009B000000004000E00025
-:10050000000000040240000000000004400EE00073
-:100510000000000402400000000000004000E00075
-:1005200000000004000C2000000000040240E51B55
-:10053000000000050080E50A000000050080E50BD2
-:10054000000000040022000000000004000700D5A5
-:1005500000000038000000B200000030000C2087CE
-:10056000000000050880E5BD00000030000C20867A
-:10057000000000050800E5BB00000030000C2087EB
-:10058000000000050880E5BC00000008000000B580
-:10059000000000050080E5BD000000050000E5BB8F
-:1005A000000000050080E5BC000000040021000000
-:1005B00000000004028000000000001800C000B924
-:1005C000000000404180E00000000024000000BB6B
-:1005D0000000000C010000000000000C0100E51DFF
-:1005E00000000004000045BB00000008000080B5CA
-:1005F000000000040000F3CE000000040140A00051
-:100600000000000400CC20000000004008C053CFD0
-:100610000000000000008000000000040000F3D291
-:10062000000000040140A0000000000400CC2000F5
-:100630000000004008C053D300000000000080000C
-:10064000000000040000F39D000000040140A00031
-:100650000000000400CC20000000004008C0539EB1
-:1006600000000000000080000000000403C008300B
-:10067000000000004200E000000000040000A000B4
-:1006800000000004200045E0000000000000E5E15B
-:10069000000000000000000100000004000700D27C
-:1006A000000000000800E3940000000000000000CB
-:1006B000000000040000E8C4000000040000E8C5D9
-:1006C000000000040000E8C6000000040000E92863
-:1006D000000000040000E929000000040000E92AED
-:1006E00000000008000000D6000000040000E92817
-:1006F000000000040000E929000000040000E92ACD
-:1007000000000008000000DD0000000000E001160D
-:1007100000000004000700E1000000040800401C85
-:1007200000000004200050E7000000040000E01D6D
-:1007300000000008000000E40000000402C02000E7
-:10074000000000040006000000000034000000EB80
-:1007500000000008000000E8000000040000800025
-:1007600000000000C000E0000000000000000000E9
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B00000000004000C200000000004001D0018D0
-:1007C00000000004001A000100000034000000FBDB
-:1007D000000000080000004A000000080500A04AD0
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/RS690_cp.bin.ihex b/firmware/radeon/RS690_cp.bin.ihex
deleted file mode 100644
index 689627441d8b..000000000000
--- a/firmware/radeon/RS690_cp.bin.ihex
+++ /dev/null
@@ -1,130 +0,0 @@
-:1000000000000008000000DD00000008000000DF24
-:1000100000000008000000A000000008000000A48C
-:10002000000000004A554B4A000000004A4A44675D
-:100030000000000055526F75000000004A7E7D658B
-:10004000000000004AD74AF6000000004AC94A4AA8
-:1000500000000000CC89898900000000C34AD3C594
-:10006000000000008E4A4A4A000000004A8A8A8A3C
-:10007000000000004A0F8C4A00000004000CA000A1
-:1000800000000038000D0012000000040000E8B479
-:1000900000000038000D0014000000040000E8B665
-:1000A00000000038000D0016000000040000E854B5
-:1000B00000000038000D0018000000040000E855A2
-:1000C00000000038000D001A000000040000E8568F
-:1000D00000000038000D001C000000040000E8577C
-:1000E00000000038000D001E000000040000E8249D
-:1000F00000000038000D0020000000040000E8258A
-:1001000000000038000D0022000000040000E8306C
-:1001100000000038000D0024000000040000F0C0C2
-:1001200000000038000D0026000000040000F0C1AF
-:1001300000000038000D0028000000040000F0411D
-:1001400000000038000D002A000000040000F184C7
-:1001500000000038000D002C000000040000F185B4
-:1001600000000038000D002E000000040000F186A1
-:1001700000000038000D0030000000040000F1878E
-:1001800000000038000D0032000000040000F18083
-:1001900000000038000D0034000000040000F3935C
-:1001A00000000038000D0036000000040000F38A53
-:1001B00000000038000D0038000000040000F38E3D
-:1001C000000000040000E821000000040140A0003D
-:1001D00000000018000000430000000400CCE8000C
-:1001E00000000004001B000100000004080048009B
-:1001F00000000004001B000100000004080048008B
-:1002000000000004001B000100000004080048007A
-:10021000000000080000003A000000000000A000FC
-:10022000000000042000451D000000040000E580DF
-:1002300000000004000CE581000000040800458077
-:1002400000000004000CE5810000000800000047E9
-:10025000000000000000A00000000004000C2000CE
-:10026000000000040000E50E000000040003200070
-:10027000000000280002205100000024000000516E
-:10028000000000040800450F000000080000A04B1B
-:10029000000000040000E565000000040000E566C1
-:1002A00000000008000000520000000403CCA5B4C8
-:1002B00000000004054320000000000400022000AC
-:1002C000000000304CCCE05E0000000408274565CB
-:1002D000000000300000005E0000000408004564DB
-:1002E000000000040000E566000000080000005562
-:1002F00000000010008020610000000400202000A9
-:1003000000000004001B00FF00000010010000645A
-:1003100000000004001F200000000004001C00FF7B
-:100320000000000C0000000000000030000000721F
-:100330000000000800000055000000040000E57601
-:10034000000000040000E577000000040000E50E56
-:10035000000000040000E50F000000040140A000C0
-:100360000000001800000069000000C200C0E5F9AC
-:100370000000000800000069000000040014E50E01
-:10038000000000040040E50F0000000800C0006C01
-:10039000000000040000E570000000040000E571AA
-:1003A0000000000C0000E572000000040000A00046
-:1003B000000000040140A000000000040000E56807
-:1003C00000000004000C200000000018000000766F
-:1003D00000000004000B00000000000418C0E562EB
-:1003E00000000008000000780000000800C000774E
-:1003F00000000004000700CB00000038000000846B
-:1004000000000030000CA08600000004080045BB7E
-:1004100000000030000C2087000000000800E5BC50
-:10042000000000040000E5BB000000000000E5BC87
-:100430000000000C00120000000000040012000088
-:100440000000000C001B0002000000040000A000DF
-:10045000000000040000E821000000000000E800A7
-:10046000000000040000E821000000000000E82E69
-:100470000000000402CCA0000000000400140000F2
-:1004800000000004000CE1CC00000004050DE1CDEB
-:10049000000000040040000000000018000000966A
-:1004A0000000000400C0A00000000008000000934D
-:1004B0000000002000000098000000004200E00062
-:1004C000000000380000009F00000004000CA000A5
-:1004D000000000040014000000000004000C2000D4
-:1004E000000000040016000000000004700CE00092
-:1004F000000000080014009B000000004000E00025
-:10050000000000040240000000000004400EE00073
-:100510000000000402400000000000004000E00075
-:100520000000002C0010000000000000000040004F
-:1005300000000004080045C8000000040024000575
-:100540000000000408004D0B00000004000C200017
-:10055000000000040240E51B000000050080E50AE1
-:10056000000000050080E50B0000000400220000F0
-:1005700000000004000700CB00000038000000B7B6
-:1005800000000030000C2087000000050880E5BD59
-:1005900000000030000C2086000000050800E5BBCC
-:1005A00000000030000C2087000000050880E5BC3A
-:1005B00000000008000000BA000000050080E5BD52
-:1005C000000000050000E5BB000000050080E5BC60
-:1005D0000000000400210000000000040280000070
-:1005E0000000001800C000BE000000404180E00094
-:1005F00000000024000000C00000000C010000000A
-:100600000000000C0100E51D00000004000045BBD7
-:1006100000000008000080BA0000000403C0083099
-:10062000000000004200E000000000040000A00004
-:1006300000000004200045E0000000000000E5E1AB
-:10064000000000000000000100000004000700C8D6
-:10065000000000000800E39400000000000000001B
-:10066000000000040000E8C4000000040000E8C529
-:10067000000000040000E8C6000000040000E928B3
-:10068000000000040000E929000000040000E92A3D
-:1006900000000008000000CC000000040000E92871
-:1006A000000000040000E929000000040000E92A1D
-:1006B00000000008000000D30000000402C0200079
-:1006C000000000040006000000000034000000DB11
-:1006D00000000008000000D80000000400008000B6
-:1006E00000000000C000E00000000030000000E159
-:1006F000000000004200E00000000030000000E1C7
-:10070000000000004000E000000000040025001B85
-:100710000000000400230000000000040025000584
-:1007200000000034000000E60000000C00000000A3
-:10073000000000040024400000000004080045C838
-:1007400000000004002400050000000C08004D0B10
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B00000000004000C200000000004001D0018D0
-:1007C00000000004001A000100000034000000FBDB
-:1007D000000000080000004A000000080500A04AD0
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:00000001FF
-/* production radeon ucode r1xx-r6xx */
diff --git a/firmware/radeon/RS780_me.bin.ihex b/firmware/radeon/RS780_me.bin.ihex
deleted file mode 100644
index 6479c106b91f..000000000000
--- a/firmware/radeon/RS780_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A0000060441100000622000000000060000013
-:1000B000000005D10000000000600000000005DE27
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:100660000000000000600000000005FF0000000026
-:1006700000600000000005F30000000200210E22CF
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE0000000000000600000000005F900000000A8
-:100AF00000400000000000EB00000000006000006B
-:100B0000000005FC000000070020222D000000006E
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E9000000006220000001F0021023000000000B8
-:100EA0000000000014C00000000006210000000443
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000062200000011002102300000000066
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000062100000000002B1405000000001D
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A000000000010000000000600000000005DEF3
-:1019B000000000000040040F0000021300000000BF
-:1019C00000600000000005D1000000000060000081
-:1019D000000005DE00000210006004110000031585
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B100000600000000005D10000A00C002044116E
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E3000000420040060441100000622000000009D
-:101E400000600000000005D100000000C06000003C
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000005FF0000000000600000000002B5A3
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:10224000000005F60000000000400000000002DE73
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A0000000097000000C020441165
-:102600000000000000000000C02048110000000091
-:102610008A000000C02044110000000000000000FB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D00000000000C0200400000000000000000016
-:1026E00000A0000A00000000970000000020441134
-:1026F0000000000000000000002048110000000061
-:102700008A000000002044110000000000000000CA
-:1027100000204811000000000000225C002044114D
-:102720000000000000000000C02048000000000081
-:102730000000A1FC00204411000000000000000087
-:10274000C0204800000000000001A1FD002044114D
-:102750000000000000000000D90048000000000058
-:1027600000000000C0200400000000000000000085
-:1027700000A0000A000000000000225700204411C1
-:102780000000000000000003C0484A2000000000D4
-:102790000000225D00204411000000000000000045
-:1027A000C040480000000000000000000060000081
-:1027B000000005DE00000000C0200800000000004E
-:1027C0000000225C00204411000000000000000313
-:1027D00000384A22000000000000A1FC0020441143
-:1027E0000000000000000000C020480000000000C1
-:1027F0000001A1FD002044110000000000000000C5
-:10280000002F022200000000000000000CE0000089
-:102810000000000000000000402048000000000010
-:102820000000000140304A200000000000000002CB
-:10283000C0304A20000000000000000100530A22BE
-:10284000000003550000003FC0280A2000000000DF
-:102850008100000000204411000000000000000181
-:102860000020481100000000000021F80020441161
-:1028700000000000000000180020481100000000C7
-:10288000000421F90060441100000622000000113C
-:1028900000210230000000000000000014E00000F1
-:1028A0000000035E00000014002F02220000000060
-:1028B000000000000CC000000000036C0001A2A496
-:1028C00000204411000000000000000000604802E9
-:1028D00000000374000021000020441100000000EB
-:1028E00000000000C02048000000000000000000C0
-:1028F000C02048000000000000000000C020480088
-:102900000000000000000000C0404800000000007F
-:1029100000000004002F0222000000000000000060
-:102920000CC00000000003700001A2A400204411AC
-:1029300000000000000000000040480200000367A3
-:1029400000000028002F022200000000000000000C
-:102950000CC00000000005BA0001A2A40020441130
-:102960000000000000000000004048020000036773
-:102970000000002C00203626000000000000004966
-:1029800000201811000000000000003F0020481146
-:10299000000000000000000100331A2600000000C3
-:1029A00000000000002F02260000000000000000D0
-:1029B0000CC00000000003760000002C00801A2DDF
-:1029C000000000000000003FC0280A2000000000B6
-:1029D00000000015002F022200000000000000008F
-:1029E0000CE000000000038C00000006002F022213
-:1029F00000000000000000000CE00000000003B731
-:102A000000000016002F022200000000000000005D
-:102A10000CE00000000003B900000020002F02229B
-:102A200000000000000000000CE00000000003A215
-:102A30000000000F002F0222000000000000000034
-:102A40000CE00000000003AE00000010002F022286
-:102A500000000000000000000CE00000000003AED9
-:102A60000000001E002F02220000000000000000F5
-:102A70000CE00000000003960000A2A40020441116
-:102A800000000000000000000040480200000000BC
-:102A90000800000000290A220000000000000003D6
-:102AA00040210E20000000000000000CC021122078
-:102AB00000000000000800000028122400000000B0
-:102AC00000000014C02216200000000000000000DA
-:102AD000002914A4000000000000A2A4002044115A
-:102AE0000000000000000000002948A200000000D3
-:102AF0000000A1FE002044110000000000000000C2
-:102B00000040480300000000810000000020441144
-:102B1000000000000000000100204811000000003B
-:102B2000000021F800204411000000000000001601
-:102B30000020481100000000000421F90060441149
-:102B400000000622000000150021023000000000F5
-:102B50000000000014E00000000003980000210EB7
-:102B6000002044110000000000000000C0204800C8
-:102B70000000000000000000C0204800000000002D
-:102B80000000A2A40020441100000000000000008A
-:102B900000404802000000008100000000204411B5
-:102BA00000000000000000010020481100000000AB
-:102BB000000021F800204411000000000000001770
-:102BC0000020481100000000000421F900604411B9
-:102BD0000000062200000003002102300000000077
-:102BE0000000000014E00000000003A40000210821
-:102BF000002044110000000000000000C020480038
-:102C00000000000000000000C0204800000000009C
-:102C10000000A2A4002044110000000000000000F9
-:102C200000404802000000000000A2A4002044115F
-:102C3000000000000000000000204802000000002A
-:102C4000800000000020441100000000000000008F
-:102C50000020481100000000810000000020441105
-:102C600000000000000000100020481100000000DB
-:102C70000000000000200010000000000000000024
-:102C800014C00000000003B4000000000040000079
-:102C9000000000000001A2A4002044110000000078
-:102CA0000000000600404811000000000001A2A43E
-:102CB00000204411000000000000001600604811D0
-:102CC000000003740000000000400000000000004D
-:102CD00000000000C020080000000000000000000C
-:102CE000C0200C00000000000000001D0021022395
-:102CF000000000000000000014E00000000003CE0F
-:102D000081000000002044110000000000000001CC
-:102D10000020481100000000000021F800204411AC
-:102D20000000000000000018002048110000000012
-:102D3000000421F900604411000006220000001187
-:102D400000210230000000000000000014E000003C
-:102D5000000003C200002100002044110000000018
-:102D600000000000002048020000000000000000F9
-:102D70000020480300000000BABECAFE002048112F
-:102D800000000000CAFEBABE00204811000000008A
-:102D90000000A2A400204411000000000000000474
-:102DA0000040481100000000000021700020441184
-:102DB00000000000000000000020480200000000A9
-:102DC0000000000000204803000000008100000017
-:102DD00000204411000000000000000A00204811FB
-:102DE00000000000000000000020001000000000B3
-:102DF0000000000014C00000000003D38C0000009D
-:102E00000020441100000000CAFEBABE0040481174
-:102E100000000000810000000020441100000000BC
-:102E200000000001002048110000000000003FFFEA
-:102E300040280A20000000008000000040280E20EA
-:102E40000000000040000000C02812200000000028
-:102E50000004000000694622000006220000000075
-:102E6000002014100000000000000000002F0223CA
-:102E700000000000000000000CC00000000003E1A2
-:102E800000000000C0401800000003E400003FFF05
-:102E9000C0281A2000000000000400000069462637
-:102EA00000000622000000000020181000000000B2
-:102EB00000000000002F02240000000000000000BD
-:102EC0000CC00000000003E700000000C0401C0030
-:102ED000000003EA00003FFFC0281E2000000000A1
-:102EE00000040000006946270000062200000000E0
-:102EF00000201C1000000000000000000020440220
-:102F00000000000000000000002820C500000000B4
-:102F100000000000004948E800000000A580000013
-:102F200000200811000000000000200000200C110B
-:102F30000000000083000000006044110000041243
-:102F4000000000000020440200000000000000001B
-:102F5000C0204800000000000000000040204800A1
-:102F6000000000000000001FC0210220000000003F
-:102F70000000000014C00000000003F70000201053
-:102F800000204411000000000000800000204811D3
-:102F9000000000000000FFFFC0481220000003FFF7
-:102FA000A780000000200811000000000000A00021
-:102FB00000200C110000000083000000006044119C
-:102FC0000000041200000000002044020000000085
-:102FD00000000000C02048000000000000000000C9
-:102FE000C0204800000000000000FFFFC0281220A1
-:102FF00000000000830000000020441100000000D9
-:103000000000000000304883000000008400000041
-:10301000002044110000000000000000C020480013
-:1030200000000000000000001D0000000000000083
-:103030008300000000604411000004120000000042
-:10304000C040040000000001A98000000020081119
-:10305000000000000000C00000400C11000003FA56
-:10306000AB80000000200811000000000000F8E024
-:1030700000400C11000003FAAD8000000020081190
-:10308000000000000000F88000400C11000003FA6E
-:10309000B380000000200811000000000000F3FCD5
-:1030A00000400C11000003FAAF800000002008115E
-:1030B000000000000000E00000400C11000003FAD6
-:1030C000B180000000200811000000000000F000A6
-:1030D00000400C11000003FA83000000002044119E
-:1030E00000000000000021480020481100000000FE
-:1030F00084000000002044110000000000000000D7
-:10310000C020480000000000000000001D0000007A
-:10311000000000000000000000800000000000002F
-:1031200001182000C0304620000000000000000010
-:10313000D90048000000000000000000C02004008A
-:10314000000000000000000000A0000A00000000D5
-:103150000218A000C030462000000000000000005F
-:10316000D90048000000000000000000C02004005A
-:10317000000000000000000000A0000A00000000A5
-:103180000318C000C030462000000000000000000E
-:10319000D90048000000000000000000C02004002A
-:1031A000000000000000000000A0000A0000000075
-:1031B0000418F8E0C03046200000000000000000C5
-:1031C000D90048000000000000000000C0200400FA
-:1031D000000000000000000000A0000A0000000045
-:1031E0000518F880C03046200000000000000000F4
-:1031F000D90048000000000000000000C0200400CA
-:10320000000000000000000000A0000A0000000014
-:103210000618E000C030462000000000000000005A
-:10322000D90048000000000000000000C020040099
-:10323000000000000000000000A0000A00000000E4
-:103240000718F000C0304620000000000000000019
-:10325000D90048000000000000000000C020040069
-:10326000000000000000000000A0000A00000000B4
-:103270000818F3FCC03046200000000000000000E9
-:10328000D90048000000000000000000C020040039
-:10329000000000000000000000A0000A0000000084
-:1032A00000000033C0300A200000000000000000D1
-:1032B000C0403440000000000000003000200A2D13
-:1032C0000000000000000000C0290C4000000000C9
-:1032D0000000003000203623000000000000000045
-:1032E000C0200400000000000000000000A0000A50
-:1032F00000000000860000000020441100000000D3
-:1033000000000000004048010000000085000000AF
-:10331000C0204411000000000000000000404801EF
-:10332000000000000000217C00204411000000008B
-:1033300000000018402102200000000000000000F2
-:1033400014C000000000044700800000C0494A206B
-:103350000000044800000000C020480000000000F9
-:1033600000000000C0204800000000000000000035
-:10337000C02048000000000081000000002044112F
-:1033800000000000000000010020481100000000C3
-:1033900000000000C0200800000000000000000441
-:1033A000002F0222000000000000000006E00000E4
-:1033B000000004500000000400200811000000007C
-:1033C0000000000017000000000000000004217F42
-:1033D00000604411000006220000001F002102309E
-:1033E000000000000000000014C000000000000009
-:1033F0000000000000404C020000045000000000EB
-:10340000C0200C000000000000000000C0201000E0
-:103410000000000000000000C020140000000000B8
-:1034200000000000C02018000000000000000000A4
-:10343000C0201C000000000000007F0000280A21BE
-:103440000000000000004500002F022200000000E4
-:10345000000000000CE0000000000461000000001B
-:10346000C02020000000000000000004002F0228FF
-:10347000000000000000000006E000000000046101
-:1034800000000004002020110000000000000000E7
-:1034900017000000000000000000001000280A23B0
-:1034A0000000000000000010002F022200000000B9
-:1034B000000000000CE00000000004698100000032
-:1034C000002044110000000000000001002048110D
-:1034D00000000000000400000069462400000622ED
-:1034E00000000000004000000000046E81000000A9
-:1034F00000204411000000000000000000204811DE
-:10350000000000000000216D0020441100000000B8
-:10351000000000000020480400000000000000003F
-:10352000006048050000062700000000002824F085
-:10353000000000000000000700280A23000000002F
-:1035400000000001002F0222000000000000000027
-:103550000AE000000000047500000000002F00C910
-:10356000000000000000000004E000000000048EE5
-:1035700000000000004000000000049B000000026A
-:10358000002F022200000000000000000AE00000FE
-:103590000000047A00000000002F00C900000000B5
-:1035A0000000000002E000000000048E00000000A7
-:1035B000004000000000049B00000003002F0222D6
-:1035C00000000000000000000AE000000000047F8E
-:1035D00000000000002F00C90000000000000000F3
-:1035E0000CE000000000048E00000000004000001D
-:1035F0000000049B00000004002F022200000000D5
-:10360000000000000AE00000000004840000000048
-:10361000002F00C900000000000000000AE00000C8
-:103620000000048E00000000004000000000049B29
-:1036300000000005002F0222000000000000000032
-:103640000AE000000000048900000000002F00C90B
-:10365000000000000000000006E000000000048EF2
-:1036600000000000004000000000049B0000000675
-:10367000002F022200000000000000000AE000000D
-:103680000000048E00000000002F00C900000000B0
-:103690000000000008E000000000048E00000000B0
-:1036A000004000000000049B00007F0000280A2169
-:1036B0000000000000004500002F02220000000072
-:1036C000000000000AE00000000000000000000808
-:1036D00000210A23000000000000000014C00000C8
-:1036E000000004980000216900204411000000003F
-:1036F00000000000C02048000000000000000000A2
-:10370000C02048000000000000000000C020480069
-:1037100000000000CAFEBABE0040481100000000D0
-:1037200000000000C0204400000000000000000075
-:10373000C02000000000000000000000C040480061
-:103740000000000000007F0000280A2100000000A7
-:1037500000004500002F02220000000000000000D1
-:103760000AE00000000004A100000000C0200000EA
-:103770000000000000000000C02000000000000069
-:1037800000000000C0400000000000000000000039
-:1037900000404C080000046100000000C020080048
-:1037A000000000000000001040210E20000000007A
-:1037B0000000001140211220000000000000001253
-:1037C0004021162000000000000021690020441163
-:1037D000000000000000000000204802000000007F
-:1037E0000000000000210225000000000000000091
-:1037F00014E00000000004AB00040000C0494A20AF
-:10380000000004ACFFFBFFFFC0284A2000000000BE
-:103810000000000000210223000000000000000062
-:1038200014E00000000004B800000000C0204800C0
-:103830000000000000000000C02048000000000060
-:103840000000000000210224000000000000000031
-:1038500014C000000000000081000000002044119E
-:10386000000000000000000C0020481100000000D3
-:103870000000000000200010000000000000000018
-:1038800014C00000000004B4A00000000020441197
-:1038900000000000CAFEBABE00404811000000004F
-:1038A000810000000020441100000000000000041E
-:1038B00000204811000000000000216B002044118E
-:1038C0000000000000000000C020481000000000C0
-:1038D00081000000002044110000000000000005ED
-:1038E00000204811000000000000216C002044115D
-:1038F0000000000000000000C02048100000000090
-:1039000000000000002F0224000000000000000062
-:103910000CE000000000000000000000004000007B
-:10392000000004B200000000C0210A2000000000D6
-:103930000000000014C00000000004CB8100000063
-:103940000020441100000000000000000020481189
-:10395000000000000000216D002044110000000064
-:1039600000000000C020480000000000000000002F
-:10397000C060480000000627000000000040000072
-:10398000000004CF8100000000204411000000006E
-:1039900000000001002048110000000000040000A9
-:1039A000C02946200000000000000000C0600000A8
-:1039B0000000062200000001002102220000000099
-:1039C0000000000014C00000000004D600002169BF
-:1039D000002044110000000000000000C02048004A
-:1039E0000000000000000000C020480000000000AF
-:1039F000000000000020481000000000CAFEBABE0F
-:103A0000004048110000000000000000C0204400F9
-:103A10000000000000000000C0404810000000004E
-:103A2000810000000020441100000000000000019F
-:103A30000020481100000000000021F8002044117F
-:103A4000000000000000000E0020481100000000EF
-:103A5000000421F90060441100000622000000006B
-:103A600000210230000000000000000014C000002F
-:103A7000000004D800002180002044110000000054
-:103A800000000000C020480000000000000000000E
-:103A9000C02000000000000000000000C02048001E
-:103AA0000000000000000000C02000000000000036
-:103AB00000000000C04048000000000000000003BB
-:103AC00000333E2F00000000000000010021022111
-:103AD000000000000000000014E0000000000508E5
-:103AE0000000002C00200A2D00000000000400004F
-:103AF00018E00C11000004F70000000100333E2F15
-:103B000000000000000021690020441100000000B6
-:103B1000000000000020480200000000000000003B
-:103B200000204803000000000000000800300A22C6
-:103B30000000000000000000C0204800000000005D
-:103B400000000000C02048000000000000002169C3
-:103B50000020441100000000000000000020480286
-:103B600000000000000000000020480300000000EA
-:103B70000000000800300A220000000000000000E1
-:103B8000C02048000000000000000000D8C048002D
-:103B9000000004EB00002169002044110000000037
-:103BA00000000000002048020000000000000000AB
-:103BB00000204803000000000000000800300A2236
-:103BC0000000000000000000C020480000000000CD
-:103BD00000000000C0204800000000000000002D90
-:103BE0000020122D000000000000000000290C83BE
-:103BF00000000000000021690020441100000000C6
-:103C0000000000000020480200000000000000004A
-:103C100000204803000000000000000800300A22D5
-:103C20000000000000000000C0204800000000006C
-:103C300000000000C020480000000000000000114B
-:103C400000210224000000000000000014C0000059
-:103C5000000000000000000000400000000004B26E
-:103C60000000002CC0203620000000000000002DC5
-:103C7000C0403620000000000000000F002102219B
-:103C8000000000000000000014C000000000050D4E
-:103C900000000000006000000000000B00000000B9
-:103CA000D90000000000000000000000C040040037
-:103CB00000000001B50000000020441100000000D9
-:103CC000000020000020481100000000B6000000A5
-:103CD00000204411000000000000A0000020481156
-:103CE00000000000B70000000020441100000000A8
-:103CF0000000C0000020481100000000B8000000D3
-:103D000000204411000000000000F8E000204811ED
-:103D100000000000B9000000002044110000000075
-:103D20000000F8800020481100000000BA000000E8
-:103D300000204411000000000000E00000204811B5
-:103D400000000000BB000000002044110000000043
-:103D50000000F0000020481100000000BC0000003E
-:103D600000204411000000000000F3FC0020481176
-:103D7000000000008100000000204411000000004D
-:103D8000000000020020481100000000000000FFB9
-:103D900000280E300000000000000000002F022369
-:103DA00000000000000000000CC000000000052121
-:103DB00000000000C020080000000000000000001B
-:103DC00014C00000000005360000000000200C11A7
-:103DD000000000000000001C00203623000000004E
-:103DE0000000002B00203623000000000000002906
-:103DF00000203623000000000000002800203623A9
-:103E00000000000000000017002036230000000022
-:103E100000000025002036230000000000000026DE
-:103E2000002036230000000000000015002036238B
-:103E300000000000000000160020362300000000F3
-:103E4000FFFFE00000200C11000000000000002136
-:103E5000002036230000000000000022002036234E
-:103E60000000000000001FFF00200C1100000000F7
-:103E70000000002300203623000000000000002482
-:103E80000020362300000000F1FFFFFF00283A2E3B
-:103E9000000000000000001AC0220E2000000000F8
-:103EA000000000000029386E0000000081000000C2
-:103EB000002044110000000000000006002048110E
-:103EC000000000000000002A402036200000000012
-:103ED00087000000002044110000000000000000E6
-:103EE000C0204800000000000000A1F400204411A0
-:103EF000000000000000000000204810000000004A
-:103F00009D00000000204411000000000000001F80
-:103F100040214A20000000009600000000204411CB
-:103F20000000000000000000C02048000000000069
-:103F300000000000C0200C00000000000000000095
-:103F4000C0201000000000000000001F0021162407
-:103F5000000000000000000014C00000000000008D
-:103F60000000001D002036230000000000000003B8
-:103F700000281E2300000000000000080022222369
-:103F800000000000FFFFF0000028222800000000D1
-:103F900000000000002920E8000000000000001FD1
-:103FA00000203628000000000000001800211E2319
-:103FB0000000000000000020002036270000000064
-:103FC0000000000200221624000000000000000093
-:103FD000003014A8000000000000001E002036255C
-:103FE000000000000000000300211A24000000006F
-:103FF0001000000000281A2600000000EFFFFFFF5D
-:1040000000283A2E0000000000000000004938CED1
-:10401000000006100000000140280A2000000000F7
-:104020000000000640280E200000000000000300F1
-:10403000C028122000000000000000080021122407
-:104040000000000000000000C0201620000000005A
-:1040500000000000C0201A20000000000000000046
-:1040600000210222000000000000000014C0000037
-:104070000000056C810000000020441100000000D9
-:10408000000000010020481100000000000022583C
-:1040900000300A24000000000004000000694622ED
-:1040A00000000622000021690020441100000000E9
-:1040B0000000000000204805000000000002000091
-:1040C00000294A26000000000000000000204810DF
-:1040D00000000000CAFEBABE002048110000000027
-:1040E00000000002002F022300000000000000007A
-:1040F0000CC000000000057400000000C0201C106F
-:104100000000000000000000C04000000000058228
-:1041100000000002002F0223000000000000000049
-:104120000CC0000000000574810000000020441154
-:104130000000000000000001002048110000000005
-:104140000000225800300A24000000000004000093
-:10415000006946220000062200000000C0201C105A
-:104160000000000000000000C040000000000582C8
-:1041700000000000002F02230000000000000000EB
-:104180000CC000000000057800000000C0201C00EA
-:104190000000000000000000C04000000000058298
-:1041A00000000004002F02230000000000000000B7
-:1041B0000CC00000000005808100000000204411B8
-:1041C0000000000000000000002048110000000076
-:1041D0000000216D002044110000000000000000DC
-:1041E000C02048000000000000000000C06048003F
-:1041F000000006270000000000401C10000005829F
-:1042000000000000C02000000000000000000000CE
-:10421000C040000000000000000000000EE00000B0
-:10422000000005840000000000600000000005C3DD
-:1042300000000000002F0224000000000000000029
-:104240000CC00000000005920000A2B7002044113D
-:1042500000000000000000000020480700000000EF
-:10426000000000330020262D000000000000001A8E
-:10427000002122290000000000000006002226295B
-:10428000000000000000A2C4002044110000000053
-:1042900000000000003048E90000000000000000BD
-:1042A00000E00000000005900000A2D100204411B1
-:1042B000000000000000000000404808000000006E
-:1042C0000000A2D100204411000000000000000105
-:1042D00000504A280000000000000001002F0224C6
-:1042E00000000000000000000CC00000000005A05D
-:1042F0000000A2BB002044110000000000000000EC
-:104300000020480700000000000000340020262D97
-:10431000000000000000001A002122290000000017
-:104320000000000600222629000000000000A2C5AF
-:10433000002044110000000000000000003048E9A7
-:10434000000000000000000000E000000000059EEA
-:104350000000A2D200204411000000000000000074
-:1043600000404808000000000000A2D200204411D4
-:10437000000000000000000100504A28000000007A
-:1043800000000002002F02240000000000000000D6
-:104390000CC00000000005AE0000A2BF00204411C8
-:1043A000000000000000000000204807000000009E
-:1043B000000000350020262D000000000000001A3B
-:1043C000002122290000000000000006002226290A
-:1043D000000000000000A2C6002044110000000000
-:1043E00000000000003048E900000000000000006C
-:1043F00000E00000000005AC0000A2D30020441142
-:10440000000000000000000000404808000000001C
-:104410000000A2D3002044110000000000000001B1
-:1044200000504A28000000000000A2C300204411F0
-:10443000000000000000000000204807000000000D
-:10444000000000360020262D000000000000001AA9
-:104450000021222900000000000000060022262979
-:10446000000000000000A2C700204411000000006E
-:1044700000000000003048E90000000000000000DB
-:1044800000E00000000005B80000A2D400204411A4
-:10449000000000000000000000404808000000008C
-:1044A0000000A2D400204411000000000000000120
-:1044B00000504A2800000000850000000020441140
-:1044C0000000000000000000002048010000000083
-:1044D0000000304A002044110000000001000000EC
-:1044E0000020481100000000000000000040000013
-:1044F000000005BEA4000000C02044110000000020
-:1045000000000000C0404800000000000000000063
-:10451000C0600000000005C300000000C0400400AF
-:10452000000000010001A2A40020441100000000CE
-:104530000000003F00204811000000000000003F84
-:1045400000204811000000000000003F002048113A
-:10455000000000000000003F0020481100000000A3
-:104560000000000500204811000000000000A1F438
-:10457000002044110000000000000000002048114D
-:10458000000000008800000000204411000000002E
-:10459000000000010020481100000000FF000000A2
-:1045A000002044110000000000000000002048111D
-:1045B0000000000000000001002048110000000081
-:1045C0000000000200804811000000000000000010
-:1045D0000EE00000000005D60000100000200811C9
-:1045E000000000000000002B002036220000000028
-:1045F0000000000000600000000005DA000000007C
-:1046000000600000000005C3980000000020441175
-:1046100000000000000000000080481100000000C1
-:1046200000000000C0600000000005DA000000008B
-:10463000C0400400000000010000A2A400204411BA
-:1046400000000000000000220020481100000000CF
-:10465000890000000020441100000000000000015B
-:1046600000404811000005CD9700000000204411D3
-:1046700000000000000000000020481100000000C1
-:104680008A0000000020441100000000000000002B
-:1046900000404811000005CD00000000006000004F
-:1046A000000005F30001A2A4C02044110000000096
-:1046B0000000001600604811000003740000201084
-:1046C00000204411000000000001000000204811FB
-:1046D00000000000810000000020441100000000E4
-:1046E0000000000100204811000000000000217CB3
-:1046F0000020441100000000098000000020481143
-:1047000000000000FFFFFFFF002048110000000034
-:104710000000000000204811000000000000000020
-:1047200017000000000000000004217F0060441119
-:10473000000006220000001F0021023000000000DF
-:104740000000000014C00000000000000000000491
-:1047500000404C11000005ED00000000004000008A
-:10476000000000000000001700201E2D00000000C7
-:104770000000000400291E270000000000000017B0
-:1047800000803627000000000000001700201E2DCA
-:1047900000000000FFFFFFFB00281E2700000000B4
-:1047A00000000017008036270000000000000017FE
-:1047B00000201E2D000000000000000800291E2718
-:1047C00000000000000000170080362700000000F5
-:1047D0000000001700201E2D00000000FFFFFFF763
-:1047E00000281E2700000000000000170080362768
-:1047F000000000000001A2A40020441100000000FD
-:104800000000001600604811000003740000201032
-:1048100000204411000000000001000000204811A9
-:10482000000000000000217C002044110000000076
-:10483000018000000020481100000000FFFFFFFF82
-:104840000020481100000000000000000020481176
-:104850000000000000000000170000000000000041
-:104860008100000000204411000000000000000151
-:1048700000204811000000000004217F0060441166
-:10488000000006220000001F00210230000000008E
-:104890000000000014C0000000000621000000100D
-:1048A00000404C110000060700000000C02004007A
-:1048B000000000000000000038C000000000000000
-:1048C0000000001D00200A2D000000000000001E56
-:1048D00000200E2D000000000000001F0020122DFF
-:1048E00000000000000000200020162D0000000045
-:1048F00000002169002044110000000000000000B9
-:1049000000204804000000000000000000204805CE
-:10491000000000000000000000204801000000002E
-:10492000CAFEBABE002048110000000000000004CA
-:10493000003012240000000000000000002F00647E
-:1049400000000000000000000CC000000000062075
-:104950000000000300281A220000000000000008E8
-:104960000022122200000000FFFFF00000281224A5
-:104970000000000000000000002910C4000000003A
-:104980000000001F0040362400000000000000006E
-:104990000080000000000000000000001AC00000BD
-:1049A000000006229F0000000020441100000000CB
-:1049B000CAFEBABE0020481100000000000000003E
-:1049C0001AE0000000000625000000000080000042
-:1049D00000000000000000001AC0000000000627D0
-:1049E0009E0000000020441100000000CAFEBABE74
-:1049F0000020481100000000000000001AE0000044
-:104A00000000062A000000000080000000000000F6
-:104A100000000000006000000000000B000010001B
-:104A200000600411000003150000000000200411C4
-:104A3000000000000000000000600811000001B24A
-:104A40000000225C00204411000000000000000370
-:104A500000204811000000000000225600204411F0
-:104A6000000000000000001B0020481100000000B2
-:104A70000000A1FC00204411000000000000000123
-:104A800000204811000000000001A1FDC0204411D9
-:104A9000000000000000002100201E2D000000008A
-:104AA0000000001000221E2700000000000000246B
-:104AB0000020222D000000000000FFFF0028222817
-:104AC000000000000000000000294907000000006D
-:104AD000000000000020481100000000000000223B
-:104AE0000020222D000000000000FFFF00282228E7
-:104AF000000000000000000000294907000000003D
-:104B00000000000000204811000000000000002309
-:104B100000201E2D000000000000001000221E27B3
-:104B2000000000000000000000294907000000000C
-:104B300000000000004048110000000000000000DC
-:104B40000000000000000000000000000000000065
-:104B50000000000000000000000000000000000055
-:104B60000000000000000000000000000000000045
-:104B70000000000000000000000000000000000035
-:104B80000000000000000000000000000000000025
-:104B90000000000000000000000000000000000015
-:104BA0000000000000000000000000000000000005
-:104BB00000000000000000000000000000000000F5
-:104BC00000000000000000000000000000000000E5
-:104BD00000000000000000000000000000000000D5
-:104BE00000000000000000000000000000000000C5
-:104BF00000000000000000000000000000000000B5
-:104C000000000000000000000000000000000000A4
-:104C10000000000000000000000000000000000094
-:104C20000000000000000000000000000000000084
-:104C30000000000000000000000000000000000074
-:104C40000000000000000000000000000000000064
-:104C50000000000000000000000000000000000054
-:104C60000000000000000000000000000000000044
-:104C70000000000000000000000000000000000034
-:104C80000000000000000000000000000000000024
-:104C90000000000000000000000000000000000014
-:104CA0000000000000000000000000000000000004
-:104CB00000000000000000000000000000000000F4
-:104CC00000000000000000000000000000000000E4
-:104CD00000000000000000000000000000000000D4
-:104CE00000000000000000000000000000000000C4
-:104CF00000000000000000000000000000000000B4
-:104D000000000000000000000000000000000000A3
-:104D10000000000000000000000000000000000093
-:104D20000000000000000000000000000000000083
-:104D30000000000000000000000000000000000073
-:104D40000000000000000000000000000000000063
-:104D50000000000000000000000000000000000053
-:104D60000000000000000000000000000000000043
-:104D70000000000000000000000000000000000033
-:104D80000000000000000000000000000000000023
-:104D90000000000000000000000000000000000013
-:104DA0000000000000000000000000000000000003
-:104DB00000000000000000000000000000000000F3
-:104DC00000000000000000000000000000000000E3
-:104DD00000000000000000000000000000000000D3
-:104DE00000000000000000000000000000000000C3
-:104DF00000000000000000000000000000000000B3
-:104E000000000000000000000000000000000000A2
-:104E10000000000000000000000000000000000092
-:104E20000000000000000000000000000000000082
-:104E30000000000000000000000000000000000072
-:104E40000000000000000000000000000000000062
-:104E50000000000000000000000000000000000052
-:104E60000000000000000000000000000000000042
-:104E70000000000000000000000000000000000032
-:104E80000000000000000000000000000000000022
-:104E90000000000000000000000000000000000012
-:104EA0000000000000000000000000000000000002
-:104EB00000000000000000000000000000000000F2
-:104EC00000000000000000000000000000000000E2
-:104ED00000000000000000000000000000000000D2
-:104EE00000000000000000000000000000000000C2
-:104EF00000000000000000000000000000000000B2
-:104F000000000000000000000000000000000000A1
-:104F10000000000000000000000000000000000091
-:104F20000000000000000000000000000000000081
-:104F30000000000000000000000000000000000071
-:104F40000000000000000000000000000000000061
-:104F50000000000000000000000000000000000051
-:104F60000000000000000000000000000000000041
-:104F70000000000000000000000000000000000031
-:104F80000000000000000000000000000000000021
-:104F90000000000000000000000000000000000011
-:104FA0000000000000000000000000000000000001
-:104FB00000000000000000000000000000000000F1
-:104FC00000000000000000000000000000000000E1
-:104FD00000000000000000000000000000000000D1
-:104FE00000000000000000000000000000000000C1
-:104FF00000000000000000000000000000000000B1
-:1050000000000000000000000000000000000000A0
-:105010000000000000000000000000000000000090
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000000000070
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B0000142050A05BA02500000000001C301685E
-:1052C000044105BA00000000022502090250015104
-:1052D000000000000223024502A00241000000007D
-:1052E00003D705BA05BA05BA0000000005E205E3D8
-:1052F000031F05BA00000000032005BF0320034A76
-:105300000000000003340282034C033E0000000052
-:1053100005BA05BA05BA05BA0000000005BA055776
-:1053200005BA032A0000000003BC05BA04C3034EFB
-:105330000000000004A20455043F05BA000000006C
-:1053400004D805BA044304E5000000000455050F25
-:10535000035B037B0000000005BA05BA05BA05BA75
-:105360000000000005BA05BA05BA05BA0000000041
-:1053700005BA05BA05D805C10000000005BA05BA8E
-:10538000000705BA0000000005BA05BA05BA05BA5B
-:105390000000000005BA05BA05BA05BA0000000011
-:1053A00003F803ED0408040600000000040E040ADC
-:1053B000040C041000000000041C04180424042041
-:1053C00000000000042C0428043404300000000015
-:1053D00005BA05BA043A04380000000005BA05BA57
-:1053E00005BA05BA0000000005BA05BA05BA05BA43
-:1053F000000000000002060E062C0006000000005F
-:00000001FF
diff --git a/firmware/radeon/RS780_pfp.bin.ihex b/firmware/radeon/RS780_pfp.bin.ihex
deleted file mode 100644
index 40880411e785..000000000000
--- a/firmware/radeon/RS780_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001DB007C038B00D4401E00EE001E3C
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581CB00C41C3AE5
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFE000042C0800309002007D250055
-:1000700000351402007D350B00255407007CD58027
-:1000800000259C070095C00400D5001B007EDDC143
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA080000CA0C00008001DB30
-:1001400000D4802400CA0800007C00C000C8142528
-:1001500000C81824007C9488007C988000C20003AA
-:1001600000D40075007C744C0080006400D4401EF4
-:1001700000CA180000D4401E00D5801E0080006216
-:1001800000D4007500D4401E00CA080000CA0C004C
-:1001900000CA100000D4801900D4C01800D5001780
-:1001A00000D4801E00D4C01E00D5001E00E2001E38
-:1001B00000CA040000A00000007E828B00D40075FD
-:1001C00000D4401E00CA080000CA0C0000CA10007B
-:1001D00000D4801900D4C01800D5001700D4801EA8
-:1001E00000D4C01E00D5001E00EE001E00CA040090
-:1001F00000A00000007E828B00CA080000248C0151
-:1002000000D480600094C0030004100100041002B8
-:1002100000D5002500D4401E0080000000D4801EC0
-:1002200000CA080000D4806100D4401E0080000095
-:1002300000D4801E00CA080000CA0C0000D4401E72
-:1002400000D4801600D4C01600D4801E008001DBCC
-:1002500000D4C01E00C6084300CA0C0000CA10002B
-:100260000094800400CA140000E420F300D420139A
-:1002700000D5606500D4E01C00D5201C00D5601CB2
-:10028000008000000006200100C6084300CA0C00E0
-:1002900000CA1000009483F700CA140000E420F3A1
-:1002A0000080009C00D4201300C6084300CA0C0044
-:1002B00000CA1000009883EF00CA140000D4006444
-:1002C000008000B00000000000C4143200C61843D3
-:1002D00000C4082F0095400500C40C3000D4401E17
-:1002E0000080000000EE001E009583F500C4103170
-:1002F00000D4403300D5206500D4A01C00D4E01CFD
-:1003000000D5201C00E4015E00D4001E0080000027
-:100310000006200100CA1800000A200100D600765D
-:1003200000C408360098800700C6104500950110EB
-:1003300000D4001F00D460620080000000D420625E
-:1003400000CC383500CC1433008401DE00D40072B8
-:1003500000D5401E0080000000EE001E00E2001AE2
-:10036000008401DE00E2001A00CC104B00CC0447F0
-:10037000002C9401007D098B00984005007D15CB71
-:1003800000D4001A008001DB00D4006D0034440169
-:1003900000CC0C480098403A00CC2C4A00958004D0
-:1003A00000CC0449008001DB00D4001A00D4C01A3C
-:1003B000002828010084011300CC10030098801B42
-:1003C0000004380C0084011300CC1003009880173F
-:1003D000000438080084011300CC10030098801337
-:1003E000000438040084011300CC1003009880142A
-:1003F00000CC104C009A800900CC144D009840DCD1
-:1004000000D4006D00CC184800D5001A00D5401A61
-:10041000008000EC00D5801A0096C0D500D4006D95
-:10042000008001DB00D4006E009AC00300D4006D90
-:1004300000D4006E0080000000EC007F009AC0CC69
-:1004400000D4006D008001DB00D4006E00CC1403EA
-:1004500000CC180300CC1C03007D9103007DD583E4
-:10046000007D190C0035CC1F0035701F007CF0CBCF
-:10047000007CD08B00880000007E8E8B0095C0042D
-:1004800000D4006E008001DB00D4001A00D4C01A32
-:1004900000CC080300CC0C0300CC100300CC1403E8
-:1004A00000CC180300CC1C0300CC240300CC280390
-:1004B0000035C41F0036B01F007C704B0034F01FA5
-:1004C000007C704B0035701F007C704B007D888174
-:1004D000007DCCC1007E5101007E9541007C908260
-:1004E000007CD4C2007C848B009AC003007C8C8B7F
-:1004F000002C88010098809E00D4006D0098409CDC
-:1005000000D4006E00CC084C00CC0C4D00CC104840
-:1005100000D4801A00D4C01A0080012400D5001A2B
-:1005200000CC083200D40032009482B600CA0C001D
-:1005300000D4401E0080000000D4001E00E4011E14
-:1005400000D4001E00CA080000CA0C0000CA100037
-:1005500000D4401E00CA140000D4801E00D4C01E67
-:1005600000D5001E00D5401E00D54034008000009C
-:1005700000EE001E0028040400E2001A00E2001A47
-:1005800000D4401A00CA380000CC080300CC0C0389
-:1005900000CC0C0300CC0C030098829A00000000F1
-:1005A000008401DE00D7A06F0080000000EE001F75
-:1005B00000CA040000C2FF0000CC083400C13FFFA5
-:1005C000007C74CB007CC90B007D010F0099028D6B
-:1005D000007C738B008401DE00D7A06F00800000D8
-:1005E00000EE001F00CA080000281900007D898B5A
-:1005F000009580140028140400CA0C0000CA1000E2
-:1006000000CA1C0000CA240000E2001F00D4C01A67
-:1006100000D5001A00D5401A00CC180300CC2C03DA
-:1006200000CC2C0300CC2C03007DA58B007D9C47C7
-:1006300000984274000000000080018400D4C01AB9
-:1006400000D4401E00D4801E0080000000EE001E7A
-:1006500000E4011E00D4001E00D4401E00EE001E67
-:1006600000CA040000A00000007E828B00E4013E6E
-:1006700000D4001E00D4401E00EE001E00CA04007C
-:1006800000A00000007E828B00CA080000248C06B7
-:10069000000CCC060098C00600CC104E0099000457
-:1006A00000D4007300E4011E00D4001E00D4401EDC
-:1006B00000D4801E0080000000EE001E00CA08006A
-:1006C00000CA0C000034D01800251001009500214C
-:1006D00000C17FFF00CA100000CA140000CA180041
-:1006E00000D4801D00D4C01D007DB18B00C142022A
-:1006F00000C2C00100D5801D0034DC0E007D5D4CC1
-:10070000007F734C00D7401E00D5001E00D5401E50
-:1007100000C1420000C2C00000099C010031DC1091
-:10072000007F5F4C007F734C00042802007D8380B3
-:1007300000D5A86F00D5806600D7401E00EC005E93
-:1007400000C8240200C82402008001DB00D6007625
-:1007500000D4401E00D4801E00D4C01E00800000C3
-:1007600000EE001E0080000000EE001F00D4001FFD
-:100770000080000000D4001F00D4001F008800008B
-:1007800000D4001F00000000000000000000000076
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:10080000000101940002019B000300B2000400A259
-:10081000000500030006003F000700320008014FFA
-:1008200000090046000A0036001001D9001700C573
-:100830000022015D0023016C002000D70024014844
-:100840000026004D0027005C0028008D0029005183
-:10085000002A007E002B0061002F0088003200AAD1
-:10086000003401A20036006F003C0179003F009582
-:10087000004101AF00440151005501960056019D11
-:100880000060000B00610034006200380063003833
-:1008900000640038006500380066003800670038E2
-:1008A0000068003A00690041006A0048006B004897
-:1008B000006C0048006D0048006E0048006F004862
-:1008C000007301D9000000060000000600000006C9
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV610_me.bin.ihex b/firmware/radeon/RV610_me.bin.ihex
deleted file mode 100644
index ba19ed892920..000000000000
--- a/firmware/radeon/RV610_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A000006044110000068D0000000000600000A8
-:1000B000000006310000000000600000000006455E
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:1006600000000000006000000000066800000000BC
-:10067000006000000000065C0000000200210E2265
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE000000000000060000000000662000000003E
-:100AF00000400000000000EB00000000006000006B
-:100B000000000665000000070020222D0000000004
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E90000000068D0000001F00210230000000004D
-:100EA0000000000014C000000000068C00000004D8
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000068D000000110021023000000000FB
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000068C00000000002B140500000000B2
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A000000000010000000000600000000006458B
-:1019B000000000000040040F0000021300000000BF
-:1019C0000060000000000631000000000060000020
-:1019D000000006450000021000600411000003151D
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B100000600000000006310000A00C002044110D
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E300000042004006044110000068D0000000032
-:101E4000006000000000063100000000C0600000DB
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000006680000000000600000000002B539
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:102240000000065F0000000000400000000002DE09
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A00000000970000000020441125
-:102600000000000000000000002048110000000051
-:102610008A000000002044110000000000000000BB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D0000001A1FD002044110000000000000000E6
-:1026E000D90048000000000000000000C0200400E5
-:1026F000000000000000000000A0000A0000000030
-:1027000000002257002044110000000000000003D8
-:10271000C0484A20000000000000225D0020441153
-:102720000000000000000000C04048000000000061
-:1027300000000000006000000000064500000000EE
-:10274000C0200800000000000000225C00204411AE
-:10275000000000000000000300384A2200000000D2
-:102760000000A1FC00204411000000000000000057
-:10277000C0204800000000000001A1FD002044111D
-:102780000000000000000000002F022200000000F6
-:10279000000000000CE0000000000000000000004D
-:1027A00040204800000000000000000140304A20A6
-:1027B0000000000000000002C0304A2000000000BD
-:1027C0000000000100530A220000034B0000003FFC
-:1027D000C0280A20000000008100000000204411F1
-:1027E000000000000000000100204811000000006F
-:1027F000000021F800204411000000000000001833
-:102800000020481100000000000421F9006044117C
-:102810000000068D000000110021023000000000C1
-:102820000000000014E00000000003540000001449
-:10283000002F022200000000000000000CC0000079
-:10284000000003640000201000204411000000007C
-:102850000000800000204811000000000001A2A438
-:102860000020441100000000000000000060480249
-:102870000000036E00002100002044110000000051
-:1028800000000000C0204800000000000000000020
-:10289000C02048000000000000000000C0204800E8
-:1028A0000000000000000000C040480000000000E0
-:1028B00000000004002F02220000000000000000C1
-:1028C0000CC000000000036A00002010002044112A
-:1028D00000000000000080000020481100000000FF
-:1028E0000001A2A40020441100000000000000002C
-:1028F000004048020000035F00000028002F022271
-:1029000000000000000000000CC00000000005C036
-:102910000001A2A4002044110000000000000000FB
-:10292000004048020000035F0000002C0020362613
-:102930000000000000000049002018110000000005
-:102940000000003F002048110000000000000001CE
-:1029500000331A260000000000000000002F0226AD
-:1029600000000000000000000CC000000000037028
-:102970000000002C00801A2D000000000000003F25
-:10298000C0280A200000000000000015002F0222CD
-:1029900000000000000000000CE0000000000386C2
-:1029A00000000006002F02220000000000000000CE
-:1029B0000CE00000000003B100000016002F02220E
-:1029C00000000000000000000CE00000000003B563
-:1029D00000000020002F0222000000000000000084
-:1029E0000CE000000000039C0000000F002F0222FA
-:1029F00000000000000000000CE00000000003A840
-:102A000000000010002F0222000000000000000063
-:102A10000CE00000000003A80000001E002F0222AE
-:102A200000000000000000000CE000000000039027
-:102A30000000A2A4002044110000000000000000DB
-:102A400000404802000000000800000000290A229F
-:102A5000000000000000000340210E2000000000E4
-:102A60000000000CC021122000000000000800003F
-:102A7000002812240000000000000014C0221620CC
-:102A80000000000000000000002914A40000000065
-:102A90000000A2A40020441100000000000000007B
-:102AA000002948A2000000000000A1FE00204411FF
-:102AB000000000000000000000404803000000008B
-:102AC000810000000020441100000000000000010F
-:102AD0000020481100000000000021F800204411EF
-:102AE0000000000000000016002048110000000057
-:102AF000000421F9006044110000068D000000155B
-:102B000000210230000000000000000014E000007E
-:102B1000000003920000210E00204411000000007C
-:102B200000000000C020480000000000000000007D
-:102B3000C0204800000000000000A2A400204411B2
-:102B400000000000000000000040480200000000FB
-:102B5000810000000020441100000000000000017E
-:102B60000020481100000000000021F8002044115E
-:102B700000000000000000170020481100000000C5
-:102B8000000421F9006044110000068D00000003DC
-:102B900000210230000000000000000014E00000EE
-:102BA0000000039E000021080020441100000000E6
-:102BB00000000000C02048000000000000000000ED
-:102BC000C0204800000000000000A2A40020441122
-:102BD000000000000000000000404802000000006B
-:102BE0000000A2A40020441100000000000000002A
-:102BF0000020480200000000800000000020441176
-:102C0000000000000000000000204811000000004B
-:102C100081000000002044110000000000000010AE
-:102C200000204811000000000000000000200010FB
-:102C3000000000000000000014C00000000003AE0F
-:102C40000000000000400000000000000000201014
-:102C50000020441100000000000080000020481106
-:102C6000000000000001A2A40020441100000000A8
-:102C70000000000600404811000000000000201085
-:102C800000204411000000000000800000204811D6
-:102C9000000000000001A2A4002044110000000078
-:102CA00000000016006048110000036E00000000E4
-:102CB000004000000000000000000000C0200800EC
-:102CC0000000000000000000C0200C000000000018
-:102CD0000000001D00210223000000000000000091
-:102CE00014E00000000003CE810000000020441129
-:102CF000000000000000000100204811000000005A
-:102D0000000021F80020441100000000000000181D
-:102D10000020481100000000000421F90060441167
-:102D20000000068D000000110021023000000000AC
-:102D30000000000014E00000000003C000002100BB
-:102D400000204411000000000000000000204802A4
-:102D50000000000000000000002048030000000008
-:102D6000BABECAFE0020481100000000CAFEBABE6A
-:102D70000020481100000000000020100020441135
-:102D8000000000000000800000204811000000004A
-:102D90000000A2A400204411000000000000000474
-:102DA0000040481100000000000021700020441184
-:102DB00000000000000000000020480200000000A9
-:102DC0000000000000204803000000008100000017
-:102DD00000204411000000000000000A00204811FB
-:102DE00000000000000000000020001000000000B3
-:102DF0000000000014C00000000003D38C0000009D
-:102E00000020441100000000CAFEBABE0040481174
-:102E100000000000810000000020441100000000BC
-:102E200000000001002048110000000000003FFFEA
-:102E300040280A20000000008000000040280E20EA
-:102E40000000000040000000C02812200000000028
-:102E500000040000006946220000068D000000000A
-:102E6000002014100000000000000000002F0223CA
-:102E700000000000000000000CC00000000003E1A2
-:102E800000000000C0401800000003E400003FFF05
-:102E9000C0281A2000000000000400000069462637
-:102EA0000000068D00000000002018100000000047
-:102EB00000000000002F02240000000000000000BD
-:102EC0000CC00000000003E700000000C0401C0030
-:102ED000000003EA00003FFFC0281E2000000000A1
-:102EE00000040000006946270000068D0000000075
-:102EF00000201C1000000000000000000020440220
-:102F00000000000000000000002820C500000000B4
-:102F100000000000004948E800000000A580000013
-:102F200000200811000000000000200000200C110B
-:102F30000000000083000000006044110000041243
-:102F4000000000000020440200000000000000001B
-:102F5000C0204800000000000000000040204800A1
-:102F6000000000000000001FC0210220000000003F
-:102F70000000000014C00000000003F70000201053
-:102F800000204411000000000000800000204811D3
-:102F9000000000000000FFFFC0481220000003FFF7
-:102FA000A780000000200811000000000000A00021
-:102FB00000200C110000000083000000006044119C
-:102FC0000000041200000000002044020000000085
-:102FD00000000000C02048000000000000000000C9
-:102FE000C0204800000000000000FFFFC0281220A1
-:102FF00000000000830000000020441100000000D9
-:103000000000000000304883000000008400000041
-:10301000002044110000000000000000C020480013
-:1030200000000000000000001D0000000000000083
-:103030008300000000604411000004120000000042
-:10304000C040040000000001A98000000020081119
-:10305000000000000000C00000400C11000003FA56
-:10306000AB80000000200811000000000000F8E024
-:1030700000400C11000003FAAD8000000020081190
-:10308000000000000000F88000400C11000003FA6E
-:10309000B380000000200811000000000000F3FCD5
-:1030A00000400C11000003FAAF800000002008115E
-:1030B000000000000000E00000400C11000003FAD6
-:1030C000B180000000200811000000000000F000A6
-:1030D00000400C11000003FA83000000002044119E
-:1030E00000000000000021480020481100000000FE
-:1030F00084000000002044110000000000000000D7
-:10310000C020480000000000000000001D0000007A
-:10311000000000000000000000800000000000002F
-:1031200001182000C0304620000000000000000010
-:10313000D90048000000000000000000C02004008A
-:10314000000000000000000000A0000A00000000D5
-:103150000218A000C030462000000000000000005F
-:10316000D90048000000000000000000C02004005A
-:10317000000000000000000000A0000A00000000A5
-:103180000318C000C030462000000000000000000E
-:10319000D90048000000000000000000C02004002A
-:1031A000000000000000000000A0000A0000000075
-:1031B0000418F8E0C03046200000000000000000C5
-:1031C000D90048000000000000000000C0200400FA
-:1031D000000000000000000000A0000A0000000045
-:1031E0000518F880C03046200000000000000000F4
-:1031F000D90048000000000000000000C0200400CA
-:10320000000000000000000000A0000A0000000014
-:103210000618E000C030462000000000000000005A
-:10322000D90048000000000000000000C020040099
-:10323000000000000000000000A0000A00000000E4
-:103240000718F000C0304620000000000000000019
-:10325000D90048000000000000000000C020040069
-:10326000000000000000000000A0000A00000000B4
-:103270000818F3FCC03046200000000000000000E9
-:10328000D90048000000000000000000C020040039
-:10329000000000000000000000A0000A0000000084
-:1032A0000000003000200A2D000000000000000097
-:1032B000C0290C4000000000000000300020362330
-:1032C0000000000000000000C0200400000000001A
-:1032D0000000000000A0000A0000000086000000BE
-:1032E00000204411000000000000000000404801E0
-:1032F0000000000085000000C02044110000000014
-:103300000000000000404801000000000000217C97
-:10331000002044110000000000000018402102209D
-:10332000000000000000000014C000000000044580
-:1033300000800000C0494A20000004460000000050
-:10334000C02048000000000000000000C02048002D
-:103350000000000000000000C02048000000000045
-:103360008100000000204411000000000000000166
-:10337000002048110000000000000000C0200800EC
-:103380000000000000000000170000000000000026
-:103390000004217F006044110000068D0000001F22
-:1033A00000210230000000000000000014C00000F6
-:1033B000000000000000000000404C020000044B30
-:1033C00000000000C0200C00000000000000000011
-:1033D000C02010000000000000000000C020140009
-:1033E0000000000000000000C020180000000000E5
-:1033F00000000000C0201C000000000000007F0052
-:1034000000280A210000000000004500002F0222D1
-:1034100000000000000000000CE000000000045963
-:1034200000000000C020200000000000000000009C
-:1034300017000000000000000000001000280A2310
-:103440000000000000000010002F02220000000019
-:10345000000000000CE0000000000461810000009A
-:10346000002044110000000000000001002048116D
-:103470000000000000040000006946240000068DE2
-:103480000000000000400000000004668100000011
-:10349000002044110000000000000000002048113E
-:1034A000000000000000216D002044110000000019
-:1034B00000000000002048040000000000000000A0
-:1034C000006048050000069200000000002824F07B
-:1034D000000000000000000700280A230000000090
-:1034E00000000001002F0222000000000000000088
-:1034F0000AE000000000046D00000000002F00C979
-:10350000000000000000000004E00000000004864D
-:1035100000000000004000000000049300000002D2
-:10352000002F022200000000000000000AE000005E
-:103530000000047200000000002F00C9000000001D
-:103540000000000002E0000000000486000000000F
-:10355000004000000000049300000003002F02223E
-:1035600000000000000000000AE0000000000477F6
-:1035700000000000002F00C9000000000000000053
-:103580000CE0000000000486000000000040000085
-:103590000000049300000004002F0222000000003D
-:1035A000000000000AE000000000047C00000000B1
-:1035B000002F00C900000000000000000AE0000029
-:1035C000000004860000000000400000000004939A
-:1035D00000000005002F0222000000000000000093
-:1035E0000AE000000000048100000000002F00C974
-:1035F000000000000000000006E00000000004865B
-:1036000000000000004000000000049300000006DD
-:10361000002F022200000000000000000AE000006D
-:103620000000048600000000002F00C90000000018
-:103630000000000008E00000000004860000000018
-:10364000004000000000049300007F0000280A21D1
-:103650000000000000004500002F022200000000D2
-:10366000000000000AE00000000000000000000868
-:1036700000210A23000000000000000014C0000028
-:1036800000000490000021690020441100000000A7
-:1036900000000000C0204800000000000000000002
-:1036A000C02048000000000000000000C0204800CA
-:1036B00000000000CAFEBABE004048110000000031
-:1036C00000000000C02044000000000000000000D6
-:1036D000C02000000000000000000000C0404800C2
-:1036E0000000000000007F0000280A210000000008
-:1036F00000004500002F0222000000000000000032
-:103700000AE000000000049900000000C020000052
-:103710000000000000000000C020000000000000C9
-:1037200000000000C0400000000000000000000099
-:1037300000404C080000045900000000C0200800B0
-:10374000000000000000001040210E2000000000DA
-:1037500000000011402112200000000000000012B3
-:1037600040211620000000000000216900204411C3
-:1037700000000000000000000020480200000000DF
-:1037800000000000002102250000000000000000F1
-:1037900014E00000000004A300040000C0494A2017
-:1037A000000004A4FFFBFFFFC0284A200000000027
-:1037B00000000000002102230000000000000000C3
-:1037C00014E00000000004B000000000C020480029
-:1037D0000000000000000000C020480000000000C1
-:1037E0000000000000210224000000000000000092
-:1037F00014C00000000000008100000000204411FF
-:10380000000000000000000C002048110000000033
-:103810000000000000200010000000000000000078
-:1038200014C00000000004ACA000000000204411FF
-:1038300000000000CAFEBABE0040481100000000AF
-:10384000810000000020441100000000000000047E
-:1038500000204811000000000000216B00204411EE
-:103860000000000000000000C02048100000000020
-:10387000810000000020441100000000000000054D
-:1038800000204811000000000000216C00204411BD
-:103890000000000000000000C020481000000000F0
-:1038A00000000000002F02240000000000000000C3
-:1038B0000CE00000000000000000000000400000DC
-:1038C000000004AA00000000C0210A20000000003F
-:1038D0000000000014C00000000004C381000000CC
-:1038E00000204411000000000000000000204811EA
-:1038F000000000000000216D0020441100000000C5
-:1039000000000000C020480000000000000000008F
-:10391000C060480000000692000000000040000067
-:10392000000004C7810000000020441100000000D6
-:103930000000000100204811000000000004000009
-:10394000C02946200000000000000000C060000008
-:103950000000068D0000000100210222000000008E
-:103960000000000014C00000000004CE0000216927
-:10397000002044110000000000000000C0204800AA
-:103980000000000000000000C0204800000000000F
-:10399000000000000020481000000000CAFEBABE6F
-:1039A000004048110000000000000000C02044005A
-:1039B0000000000000000000C040481000000000AF
-:1039C0008100000000204411000000000000000100
-:1039D0000020481100000000000021F800204411E0
-:1039E000000000000000000E002048110000000050
-:1039F000000421F9006044110000068D0000000061
-:103A000000210230000000000000000014C000008F
-:103A1000000004D0000021800020441100000000BC
-:103A200000000000C020480000000000000000006E
-:103A3000C02000000000000000000000C02048007E
-:103A40000000000000000000C02000000000000096
-:103A500000000000C040480000000000000000031B
-:103A600000333E2F00000000000000010021022171
-:103A7000000000000000000014E00000000005004D
-:103A80000000002C00200A2D0000000000040000AF
-:103A900018E00C11000004EF0000000100333E2F7D
-:103AA0000000000000002169002044110000000017
-:103AB000000000000020480200000000000000009C
-:103AC00000204803000000000000000800300A2227
-:103AD0000000000000000000C020480000000000BE
-:103AE00000000000C0204800000000000000216924
-:103AF00000204411000000000000000000204802E7
-:103B0000000000000000000000204803000000004A
-:103B10000000000800300A22000000000000000041
-:103B2000C02048000000000000000000D8C048008D
-:103B3000000004E30000216900204411000000009F
-:103B4000000000000020480200000000000000000B
-:103B500000204803000000000000000800300A2296
-:103B60000000000000000000C0204800000000002D
-:103B700000000000C0204800000000000000002DF0
-:103B80000020122D000000000000000000290C831E
-:103B90000000000000002169002044110000000026
-:103BA00000000000002048020000000000000000AB
-:103BB00000204803000000000000000800300A2236
-:103BC0000000000000000000C020480000000000CD
-:103BD00000000000C02048000000000000000011AC
-:103BE00000210224000000000000000014C00000BA
-:103BF000000000000000000000400000000004AAD7
-:103C00000000002CC0203620000000000000002D25
-:103C1000C0403620000000000000000F00210221FB
-:103C2000000000000000000014C0000000000505B6
-:103C300000000000006000000000000B0000000019
-:103C4000D90000000000000000000000C040040097
-:103C500000000001B5000000002044110000000039
-:103C6000000020000020481100000000B600000005
-:103C700000204411000000000000A00000204811B6
-:103C800000000000B7000000002044110000000008
-:103C90000000C0000020481100000000B800000033
-:103CA00000204411000000000000F8E0002048114E
-:103CB00000000000B90000000020441100000000D6
-:103CC0000000F8800020481100000000BA00000049
-:103CD00000204411000000000000E0000020481116
-:103CE00000000000BB0000000020441100000000A4
-:103CF0000000F0000020481100000000BC0000009F
-:103D000000204411000000000000F3FC00204811D6
-:103D100000000000810000000020441100000000AD
-:103D2000000000020020481100000000000000FF19
-:103D300000280E300000000000000000002F0223C9
-:103D400000000000000000000CC000000000051989
-:103D500000000000C020080000000000000000007B
-:103D600014C000000000052E0000000000200C110F
-:103D7000000000000000001C0020362300000000AE
-:103D80000000002B00203623000000000000002966
-:103D90000020362300000000000000280020362309
-:103DA0000000000000000017002036230000000083
-:103DB000000000250020362300000000000000263F
-:103DC00000203623000000000000001500203623EC
-:103DD0000000000000000016002036230000000054
-:103DE000FFFFE00000200C11000000000000002197
-:103DF00000203623000000000000002200203623AF
-:103E00000000000000001FFF00200C110000000057
-:103E100000000023002036230000000000000024E2
-:103E20000020362300000000F1FFFFFF00283A2E9B
-:103E3000000000000000001AC0220E200000000058
-:103E4000000000000029386E000000008100000022
-:103E5000002044110000000000000006002048116E
-:103E6000000000000000002A402036200000000072
-:103E70008700000000204411000000000000000046
-:103E8000C0204800000000000000A1F40020441100
-:103E900000000000000000000020481000000000AA
-:103EA0000000000000200C110000000000000030A5
-:103EB00000203623000000009D0000000020441177
-:103EC000000000000000001F40214A200000000008
-:103ED00096000000002044110000000000000000D7
-:103EE000C02048000000000000000000C0200C00BE
-:103EF0000000000000000000C020100000000000D2
-:103F00000000001F00211624000000000000000037
-:103F100014C00000000000000000001D0020362337
-:103F2000000000000000000300281E230000000025
-:103F3000000000080022222300000000FFFFF00024
-:103F4000002822280000000000000000002920E8CE
-:103F5000000000000000001F0020362800000000C4
-:103F60000000001800211E230000000000000020B7
-:103F70000020362700000000000000020022162466
-:103F80000000000000000000003014A80000000045
-:103F90000000001E00203625000000000000000385
-:103FA00000211A24000000001000000000281A263A
-:103FB00000000000EFFFFFFF00283A2E0000000085
-:103FC00000000000004938CE0000067B0000000120
-:103FD00040280A20000000000000000640280E20B3
-:103FE0000000000000000300C028122000000000B4
-:103FF0000000000800211224000000000000000062
-:10400000C02016200000000000000000C0201A2080
-:10401000000000000000000000210222000000005B
-:104020000000000014C000000000056681000000D0
-:104030000020441100000000000000010020481191
-:10404000000000000000225800300A240000000098
-:1040500000040000006946220000068D000021696E
-:10406000002044110000000000000000002048056E
-:10407000000000000002000000294A2600000000A5
-:10408000000000000020481000000000CAFEBABE78
-:10409000002048110000000000000002002F022351
-:1040A00000000000000000000CC000000000056ED1
-:1040B00000000000C0201C100000000000000000F4
-:1040C000C04000000000057C00000002002F022319
-:1040D00000000000000000000CC000000000056EA1
-:1040E00081000000002044110000000000000001D9
-:1040F00000204811000000000000225800300A246F
-:104100000000000000040000006946220000068D47
-:1041100000000000C0201C10000000000000000093
-:10412000C04000000000057C00000000002F0223BA
-:1041300000000000000000000CC00000000005723C
-:1041400000000000C0201C00000000000000000073
-:10415000C04000000000057C00000004002F022386
-:1041600000000000000000000CC000000000057A04
-:104170008100000000204411000000000000000049
-:1041800000204811000000000000216D00204411B3
-:104190000000000000000000C020480000000000F7
-:1041A00000000000C060480000000692000000000F
-:1041B00000401C100000057C00000000C020000032
-:1041C0000000000000000000C040000000000000EF
-:1041D000000000000EE000000000057E000000006E
-:1041E00000600000000005C900000000002F02244C
-:1041F00000000000000000000CC000000000058F5F
-:104200000000A2B7002044110000000000000000E0
-:104210000020480700000000810000000020441139
-:104220000000000000000001002048110000000014
-:104230000004A2B6006044110000068D0000001AC0
-:10424000002122300000000000000006002226307D
-:104250000000000000042004006044110000068DEE
-:104260000000A2C400204411000000000000000073
-:10427000003048E9000000000000000000E00000FD
-:104280000000058D0000A2D10020441100000000B4
-:104290000000000000404808000000000000A2D11B
-:1042A00000204411000000000000000100504A28D6
-:1042B0000000000000000001002F022400000000A8
-:1042C000000000000CC00000000005A00000A2BB20
-:1042D00000204411000000000000000000204807FA
-:1042E00000000000810000000020441100000000D8
-:1042F0000000000100204811000000000004A2BAE4
-:10430000006044110000068D0000001A00212230D8
-:10431000000000000000000600222630000000001F
-:1043200000042004006044110000068D0000A2C5B6
-:10433000002044110000000000000000003048E9A7
-:10434000000000000000000000E000000000059EEA
-:104350000000A2D200204411000000000000000074
-:1043600000404808000000000000A2D200204411D4
-:10437000000000000000000100504A28000000007A
-:1043800000000002002F02240000000000000000D6
-:104390000CC00000000005B10000A2BF00204411C5
-:1043A000000000000000000000204807000000009E
-:1043B0008100000000204411000000000000000106
-:1043C00000204811000000000004A2BE006044115B
-:1043D0000000068D0000001A0021223000000000BD
-:1043E0000000000600222630000000000004200427
-:1043F000006044110000068D0000A2C60020441198
-:104400000000000000000000003048E9000000004B
-:104410000000000000E00000000005AF0000A2D393
-:104420000020441100000000000000000040480887
-:10443000000000000000A2D3002044110000000092
-:104440000000000100504A28000000000000A2C344
-:104450000020441100000000000000000020480778
-:104460000000000081000000002044110000000056
-:104470000000000100204811000000000004A2C25A
-:10448000006044110000068D0000001A0021223057
-:10449000000000000000000600222630000000009E
-:1044A00000042004006044110000068D0000A2C733
-:1044B000002044110000000000000000003048E926
-:1044C000000000000000000000E00000000005BE49
-:1044D0000000A2D4002044110000000000000000F1
-:1044E00000404808000000000000A2D40020441151
-:1044F000000000000000000100504A2800000000F9
-:1045000085000000002044110000000000000000B1
-:1045100000204801000000000000304A0020441143
-:104520000000000001000000002048110000000011
-:104530000000000000400000000005C4A4000000CE
-:10454000C02044110000000000000000C0404800EE
-:104550000000000000000000C0600000000005C96D
-:1045600000000000C0400400000000010000002C1A
-:1045700000203621000000008100000000204411CE
-:1045800000000000000000060020481100000000AC
-:1045900000000000002F02300000000000000000BA
-:1045A0000CC00000000005D0000000000020041135
-:1045B000000000000000003000403621000005E34C
-:1045C000000000300020062D0000000000007E00EA
-:1045D000002806210000000000000000002F02213A
-:1045E00000000000000000000CE00000000005E3F7
-:1045F00081000000002044110000000000000001C4
-:1046000000204811000000000004A0920060441146
-:104610000000068D00000031002036300000000050
-:104620000004A093006044110000068D00000032D9
-:1046300000203630000000000004A2B600604411E3
-:104640000000068D0000003300203630000000001E
-:104650000004A2BA006044110000068D000000347E
-:1046600000203630000000000004A2BE00604411AB
-:104670000000068D000000350020363000000000EC
-:104680000004A2C2006044110000068D0000003644
-:1046900000203630000000000004200400604411B7
-:1046A0000000068D0001A2A40020441100000000BB
-:1046B0000000003F00204811000000000000003F03
-:1046C00000204811000000000000003F00204811B9
-:1046D000000000000000003F002048110000000022
-:1046E0000000000500204811000000000000A1F4B7
-:1046F00000204411000000000000000000204811CC
-:1047000000000000880000000020441100000000AC
-:10471000000000010020481100000000810000009E
-:104720000020441100000000000000060020481195
-:104730000000000000000001002F02300000000017
-:10474000000000000CE000000000062C000000301B
-:104750000020062D0000000000000000002F0221B4
-:1047600000000000000000000CE000000000062C2B
-:104770008100000000204411000000000000000142
-:10478000002048110000000000007E0000280621E3
-:104790000000000000000000002F022100000000C7
-:1047A000000000000CE00000000006050000A092E0
-:1047B00000204411000000000000003100204A2DBC
-:1047C000000000000000A093002044110000000041
-:1047D0000000003200204A2D000000000000A2B6B8
-:1047E00000204411000000000000003300204A2D8A
-:1047F000000000000000A2BA0020441100000000E8
-:104800000000003400204A2D000000000000A2BE7D
-:1048100000204411000000000000003500204A2D57
-:10482000000000000000A2C20020441100000000AF
-:104830000000003600204A2D00000000000000307B
-:104840000020062D00000000000001FF00280621C6
-:104850000000000000000000002F02210000000006
-:10486000000000000CE000000000062B000000002B
-:1048700000210221000000000000000014C0000020
-:104880000000060E0004A003006044110000068D25
-:104890000000A00300204411000000000000000000
-:1048A0000020481000000000000000010021062147
-:1048B000000000000000000014C00000000006130B
-:1048C0000004A010006044110000068D0000A0103C
-:1048D00000204411000000000000000000204810EB
-:1048E000000000000000000100210621000000007F
-:1048F00000000000002F0221000000000000000066
-:104900000CE000000000062B0004A0110060441120
-:104910000000068D0000A0110020441100000000DE
-:104920000000000000204810000000000004A01259
-:10493000006044110000068D0000A0120020441108
-:1049400000000000000000000020481000000000EF
-:104950000004A013006044110000068D0000A013A5
-:10496000002044110000000000000000002048105A
-:10497000000000000004A014006044110000068D37
-:104980000000A014002044110000000000000000FE
-:1049900000204810000000000004A0150060441131
-:1049A0000000068D0000A01500204411000000004A
-:1049B0000000000000204810000000000004A016C5
-:1049C000006044110000068D0000A0160020441174
-:1049D000000000000000000000204810000000005F
-:1049E0000004A017006044110000068D0000A0170D
-:1049F00000204411000000000000000000204810CA
-:104A00000000000000042004006044110000068D36
-:104A10000000002C0080062D00000000FF000000B8
-:104A20000020441100000000000000000020481198
-:104A300000000000000000010020481100000000FC
-:104A4000000000020080481100000000000000008B
-:104A50000EE000000000063D000000300020062DA2
-:104A600000000000000000020028062100000000F5
-:104A700000000000002F02210000000000000000E4
-:104A80000CE000000000063B810000000020441103
-:104A9000000000000000000100204811000000009C
-:104AA00000042004006044110000068D0000100086
-:104AB00000200811000000000000002B002036221A
-:104AC000000000000000000000600000000006413F
-:104AD0000000000000600000000005C99800000010
-:104AE0000020441100000000000000000080481178
-:104AF0000000000000000000C0600000000006414F
-:104B000000000000C0400400000000010000A2A45A
-:104B10000020441100000000000000220020481185
-:104B20000000000089000000002044110000000087
-:104B300000000001004048110000062D9700000011
-:104B40000020441100000000000000000020481177
-:104B5000000000008A000000002044110000000056
-:104B600000000000004048110000062D0000000079
-:104B7000006000000000065C0000201000204411CE
-:104B8000000000000000800000204811000000002C
-:104B90000001A2A4C0204411000000000000001683
-:104BA000006048110000036E000020100020441136
-:104BB000000000000001000000204811000000007B
-:104BC00081000000002044110000000000000001EE
-:104BD00000204811000000000000217C002044114A
-:104BE00000000000098000000020481100000000C3
-:104BF000FFFFFFFF00204811000000000000000040
-:104C00000020481100000000000000001700000014
-:104C1000000000000004217F006044110000068DA8
-:104C20000000001F00210230000000000000000012
-:104C300014C00000000000000000000400404C11FF
-:104C400000000656000000000040000000000000C8
-:104C50000000001700201E2D0000000000000004CE
-:104C600000291E27000000000000001700803627E2
-:104C7000000000000000001700201E2D00000000B2
-:104C8000FFFFFFFB00281E270000000000000017A8
-:104C900000803627000000000000001700201E2DB5
-:104CA000000000000000000800291E27000000008E
-:104CB00000000017008036270000000000000017E9
-:104CC00000201E2D00000000FFFFFFF700281E2718
-:104CD00000000000000000170080362700000000E0
-:104CE000000020100020441100000000000080009F
-:104CF00000204811000000000001A2A4002044117F
-:104D00000000000000000016006048110000036E63
-:104D100000002010002044110000000000010000ED
-:104D200000204811000000000000217C00204411F8
-:104D30000000000001800000002048110000000079
-:104D4000FFFFFFFF002048110000000000000000EE
-:104D500000204811000000000000000017000000C3
-:104D6000000000008100000000204411000000004D
-:104D70000000000100204811000000000004217F15
-:104D8000006044110000068D0000001F0021023069
-:104D9000000000000000000014C000000000068CAD
-:104DA0000000001000404C110000067200000000DE
-:104DB000C0200400000000000000000038C0000017
-:104DC000000000000000001D00200A2D000000006F
-:104DD0000000001E00200E2D000000000000001F3B
-:104DE0000020122D00000000000000200020162DE1
-:104DF00000000000000021690020441100000000B4
-:104E00000000000000204804000000000000000036
-:104E100000204805000000000000000000204801BC
-:104E200000000000CAFEBABE0020481100000000C9
-:104E30000000000400301224000000000000000008
-:104E4000002F006400000000000000000CC0000003
-:104E50000000068B0000000300281A22000000005A
-:104E6000000000080022122200000000FFFFF000F6
-:104E7000002812240000000000000000002910C4D7
-:104E8000000000000000001F004036240000000069
-:104E90000000000000800000000000000000000092
-:104EA0001AC000000000068D9F0000000020441181
-:104EB00000000000CAFEBABE002048110000000039
-:104EC000000000001AE00000000006900000000052
-:104ED0000080000000000000000000001AC0000078
-:104EE000000006929E000000002044110000000017
-:104EF000CAFEBABE002048110000000000000000F9
-:104F00001AE000000000069500000000008000008C
-:104F10000000000000000000006000000000000B26
-:104F200000001000006004110000031500000000E4
-:104F300000200411000000000000000000600811C3
-:104F4000000001B20000225C0020441100000000BB
-:104F5000000000030020481100000000000022565D
-:104F600000204411000000000000001B0020481138
-:104F7000000000000000A1FC00204411000000001F
-:104F80000000000100204811000000000001A1FD08
-:104F9000C0204411000000000000002100201E2D50
-:104FA000000000000000001000221E27000000008A
-:104FB000000000240020222D000000000000FFFF60
-:104FC00000282228000000000000000000294907F6
-:104FD0000000000000000000002048110000000058
-:104FE000000000220020222D000000000000FFFF32
-:104FF00000282228000000000000000000294907C6
-:105000000000000000000000002048110000000027
-:105010000000002300201E2D0000000000000010F2
-:1050200000221E27000000000000000000294907A0
-:1050300000000000000000000040481100000000D7
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B0000142050205C002500000000001C3016860
-:1052C000043F05C000000000022502090250015100
-:1052D000000000000223024502A00241000000007D
-:1052E00003D705C005C005C0000000000649064AF6
-:1052F000031F05C00000000005C005C503200340D2
-:1053000000000000032A0282034203340000000070
-:1053100005C005C005C005C00000000005C005515E
-:1053200005C005C00000000003BA05C004BB03446B
-:1053300000000000049A0450043D05C00000000075
-:1053400004D005C0044104DD00000000045005073E
-:10535000035103750000000005C005C005C005C06D
-:105360000000000005C005C005C005C00000000029
-:1053700005C005C0063F05C70000000005C005C008
-:10538000000705C00000000005C005C005C005C03D
-:105390000000000005C005C005C005C000000000F9
-:1053A00003F803ED0408040600000000040E040ADC
-:1053B000040C041000000000041C04180424042041
-:1053C00000000000042C0428043404300000000015
-:1053D00005C005C0043805C00000000005C005C0B8
-:1053E00005C005C00000000005C005C005C005C01F
-:1053F0000000000000020679069700060000000089
-:00000001FF
diff --git a/firmware/radeon/RV610_pfp.bin.ihex b/firmware/radeon/RV610_pfp.bin.ihex
deleted file mode 100644
index f55292c97b79..000000000000
--- a/firmware/radeon/RV610_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001B8007C038B00D4401E00EE001E5F
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581A800C41C3A08
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFF000042C0400309002007D250049
-:1000700000351402007D350B00255403007CD5802B
-:1000800000259C030095C00400D5001B007EDDC147
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA180000D4401E00D5801EAD
-:100140000080005300D4007500D4401E00CA08008F
-:1001500000CA0C0000CA100000D4801900D4C018D6
-:1001600000D5001700D4801E00D4C01E00D5001E8C
-:1001700000E2001E00CA040000A00000007E828B86
-:1001800000CA080000D4806000D4401E0080000037
-:1001900000D4801E00CA080000D4806100D4401E34
-:1001A0000080000000D4801E00CA080000CA0C00B5
-:1001B00000D4401E00D4801600D4C01600D4801E87
-:1001C000008001B800D4C01E00C6084300CA0C005D
-:1001D00000CA10000094800400CA140000E420F358
-:1001E00000D4201300D5606500D4E01C00D5201C8D
-:1001F00000D5601C008000000006200100C60843F6
-:1002000000CA0C0000CA1000009483F700CA140052
-:1002100000E420F30080007900D4201300C60843D6
-:1002200000CA0C0000CA1000009883EF00CA140036
-:1002300000D400640080008D0000000000C414326F
-:1002400000C6184300C4082F0095400500C40C30B8
-:1002500000D4401E0080000000EE001E009583F5D3
-:1002600000C4103100D4403300D5206500D4A01C58
-:1002700000D4E01C00D5201C00E4015E00D4001E68
-:10028000008000000006200100CA1800000A2001BA
-:1002900000D6007600C408360098800700C61045D6
-:1002A0000095011000D4001F00D46062008000009F
-:1002B00000D4206200CC383500CC1433008401BB5C
-:1002C00000D4007200D5401E0080000000EE001E29
-:1002D00000E2001A008401BB00E2001A00CC104BBF
-:1002E00000CC0447002C9401007D098B0098400548
-:1002F000007D15CB00D4001A008001B800D4006D39
-:100300000034440100CC0C480098403A00CC2C4A00
-:100310000095800400CC0449008001B800D4001A84
-:1003200000D4C01A00282801008400F000CC10037B
-:100330000098801B0004380C008400F000CC1003EF
-:100340000098801700043808008400F000CC1003E7
-:100350000098801300043804008400F000CC1003DF
-:100360000098801400CC104C009A800900CC144DE9
-:10037000009840DC00D4006D00CC184800D5001A6D
-:1003800000D5401A008000C900D5801A0096C0D55B
-:1003900000D4006D008001B800D4006E009AC00344
-:1003A00000D4006D00D4006E0080000000EC007FDF
-:1003B000009AC0CC00D4006D008001B800D4006E5B
-:1003C00000CC140300CC180300CC1C03007D910367
-:1003D000007DD583007D190C0035CC1F0035701FC2
-:1003E000007CF0CB007CD08B00880000007E8E8BE0
-:1003F0000095C00400D4006E008001B800D4001A3B
-:1004000000D4C01A00CC080300CC0C0300CC1003AD
-:1004100000CC140300CC180300CC1C0300CC240334
-:1004200000CC28030035C41F0036B01F007C704B81
-:100430000034F01F007C704B0035701F007C704B47
-:10044000007D8881007DCCC1007E5101007E9541F8
-:10045000007C9082007CD4C2007C848B009AC00314
-:10046000007C8C8B002C88010098809E00D4006D4D
-:100470000098409C00D4006E00CC084C00CC0C4D81
-:1004800000CC104800D4801A00D4C01A00800101AA
-:1004900000D5001A00CC083200D40032009482D972
-:1004A00000CA0C0000D4401E0080000000D4001ED2
-:1004B00000E4011E00D4001E00CA080000CA0C009F
-:1004C00000CA100000D4401E00CA140000D4801ED0
-:1004D00000D4C01E00D5001E00D5401E00D54034FB
-:1004E0000080000000EE001E0028040400E2001A54
-:1004F00000E2001A00D4401A00CA380000CC0803F9
-:1005000000CC0C0300CC0C0300CC0C03009882BD83
-:1005100000000000008401BB00D7A06F0080000035
-:1005200000EE001F00CA040000C2FF0000CC083427
-:1005300000C13FFF007C74CB007CC90B007D010F24
-:10054000009902B0007C738B008401BB00D7A06FC0
-:100550000080000000EE001F00CA080000281900FB
-:10056000007D898B009580140028140400CA0C00BB
-:1005700000CA100000CA1C0000CA240000E2001FCC
-:1005800000D4C01A00D5001A00D5401A00CC1803B8
-:1005900000CC2C0300CC2C0300CC2C03007DA58BBD
-:1005A000007D9C4700984297000000000080016198
-:1005B00000D4C01A00D4401E00D4801E0080000069
-:1005C00000EE001E00E4011E00D4001E00D4401EF8
-:1005D00000EE001E00CA040000A00000007E828B16
-:1005E00000E4013E00D4001E00D4401E00EE001EB8
-:1005F00000CA040000A00000007E828B00CA080030
-:1006000000248C06000CCC060098C00600CC104ECE
-:100610000099000400D4007300E4011E00D4001E01
-:1006200000D4401E00D4801E0080000000EE001E9A
-:1006300000CA080000CA0C000034D01800251001C0
-:100640000095002100C17FFF00CA100000CA1400FD
-:1006500000CA180000D4801D00D4C01D007DB18BDD
-:1006600000C1420200C2C00100D5801D0034DC0E72
-:10067000007D5D4C007F734C00D7401E00D5001EEE
-:1006800000D5401E00C1420000C2C00000099C010C
-:100690000031DC10007F5F4C007F734C00042802A7
-:1006A000007D838000D5A86F00D5806600D7401EEE
-:1006B00000EC005E00C8240200C82402008001B8DB
-:1006C00000D6007600D4401E00D4801E00D4C01E88
-:1006D0000080000000EE001E0080000000EE001F01
-:1006E00000D4001F0080000000D4001F00D4001FB1
-:1006F0000088000000D4001F00000000000000007F
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:1008000000010171000201780003008F0004007FE5
-:10081000000500030006003F000700320008012C1D
-:1008200000090046000A0036001001B6001700A2B9
-:100830000022013A00230149002000B400240125D0
-:100840000027004D0028006A002A0060002B00529B
-:10085000002F0065003200870034017F003C015604
-:10086000003F00720041018C0044012E00550173CD
-:100870000056017A0060000B00610034006200380D
-:1008800000630038006400380065003800660038F6
-:10089000006700380068003A00690041006A0048BB
-:1008A000006B0048006C0048006D0048006E004876
-:1008B000006F00480000000600000006000000066F
-:1008C0000000000600000006000000060000000610
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV620_me.bin.ihex b/firmware/radeon/RV620_me.bin.ihex
deleted file mode 100644
index ba19ed892920..000000000000
--- a/firmware/radeon/RV620_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A000006044110000068D0000000000600000A8
-:1000B000000006310000000000600000000006455E
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:1006600000000000006000000000066800000000BC
-:10067000006000000000065C0000000200210E2265
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE000000000000060000000000662000000003E
-:100AF00000400000000000EB00000000006000006B
-:100B000000000665000000070020222D0000000004
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E90000000068D0000001F00210230000000004D
-:100EA0000000000014C000000000068C00000004D8
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000068D000000110021023000000000FB
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000068C00000000002B140500000000B2
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A000000000010000000000600000000006458B
-:1019B000000000000040040F0000021300000000BF
-:1019C0000060000000000631000000000060000020
-:1019D000000006450000021000600411000003151D
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B100000600000000006310000A00C002044110D
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E300000042004006044110000068D0000000032
-:101E4000006000000000063100000000C0600000DB
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000006680000000000600000000002B539
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:102240000000065F0000000000400000000002DE09
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A00000000970000000020441125
-:102600000000000000000000002048110000000051
-:102610008A000000002044110000000000000000BB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D0000001A1FD002044110000000000000000E6
-:1026E000D90048000000000000000000C0200400E5
-:1026F000000000000000000000A0000A0000000030
-:1027000000002257002044110000000000000003D8
-:10271000C0484A20000000000000225D0020441153
-:102720000000000000000000C04048000000000061
-:1027300000000000006000000000064500000000EE
-:10274000C0200800000000000000225C00204411AE
-:10275000000000000000000300384A2200000000D2
-:102760000000A1FC00204411000000000000000057
-:10277000C0204800000000000001A1FD002044111D
-:102780000000000000000000002F022200000000F6
-:10279000000000000CE0000000000000000000004D
-:1027A00040204800000000000000000140304A20A6
-:1027B0000000000000000002C0304A2000000000BD
-:1027C0000000000100530A220000034B0000003FFC
-:1027D000C0280A20000000008100000000204411F1
-:1027E000000000000000000100204811000000006F
-:1027F000000021F800204411000000000000001833
-:102800000020481100000000000421F9006044117C
-:102810000000068D000000110021023000000000C1
-:102820000000000014E00000000003540000001449
-:10283000002F022200000000000000000CC0000079
-:10284000000003640000201000204411000000007C
-:102850000000800000204811000000000001A2A438
-:102860000020441100000000000000000060480249
-:102870000000036E00002100002044110000000051
-:1028800000000000C0204800000000000000000020
-:10289000C02048000000000000000000C0204800E8
-:1028A0000000000000000000C040480000000000E0
-:1028B00000000004002F02220000000000000000C1
-:1028C0000CC000000000036A00002010002044112A
-:1028D00000000000000080000020481100000000FF
-:1028E0000001A2A40020441100000000000000002C
-:1028F000004048020000035F00000028002F022271
-:1029000000000000000000000CC00000000005C036
-:102910000001A2A4002044110000000000000000FB
-:10292000004048020000035F0000002C0020362613
-:102930000000000000000049002018110000000005
-:102940000000003F002048110000000000000001CE
-:1029500000331A260000000000000000002F0226AD
-:1029600000000000000000000CC000000000037028
-:102970000000002C00801A2D000000000000003F25
-:10298000C0280A200000000000000015002F0222CD
-:1029900000000000000000000CE0000000000386C2
-:1029A00000000006002F02220000000000000000CE
-:1029B0000CE00000000003B100000016002F02220E
-:1029C00000000000000000000CE00000000003B563
-:1029D00000000020002F0222000000000000000084
-:1029E0000CE000000000039C0000000F002F0222FA
-:1029F00000000000000000000CE00000000003A840
-:102A000000000010002F0222000000000000000063
-:102A10000CE00000000003A80000001E002F0222AE
-:102A200000000000000000000CE000000000039027
-:102A30000000A2A4002044110000000000000000DB
-:102A400000404802000000000800000000290A229F
-:102A5000000000000000000340210E2000000000E4
-:102A60000000000CC021122000000000000800003F
-:102A7000002812240000000000000014C0221620CC
-:102A80000000000000000000002914A40000000065
-:102A90000000A2A40020441100000000000000007B
-:102AA000002948A2000000000000A1FE00204411FF
-:102AB000000000000000000000404803000000008B
-:102AC000810000000020441100000000000000010F
-:102AD0000020481100000000000021F800204411EF
-:102AE0000000000000000016002048110000000057
-:102AF000000421F9006044110000068D000000155B
-:102B000000210230000000000000000014E000007E
-:102B1000000003920000210E00204411000000007C
-:102B200000000000C020480000000000000000007D
-:102B3000C0204800000000000000A2A400204411B2
-:102B400000000000000000000040480200000000FB
-:102B5000810000000020441100000000000000017E
-:102B60000020481100000000000021F8002044115E
-:102B700000000000000000170020481100000000C5
-:102B8000000421F9006044110000068D00000003DC
-:102B900000210230000000000000000014E00000EE
-:102BA0000000039E000021080020441100000000E6
-:102BB00000000000C02048000000000000000000ED
-:102BC000C0204800000000000000A2A40020441122
-:102BD000000000000000000000404802000000006B
-:102BE0000000A2A40020441100000000000000002A
-:102BF0000020480200000000800000000020441176
-:102C0000000000000000000000204811000000004B
-:102C100081000000002044110000000000000010AE
-:102C200000204811000000000000000000200010FB
-:102C3000000000000000000014C00000000003AE0F
-:102C40000000000000400000000000000000201014
-:102C50000020441100000000000080000020481106
-:102C6000000000000001A2A40020441100000000A8
-:102C70000000000600404811000000000000201085
-:102C800000204411000000000000800000204811D6
-:102C9000000000000001A2A4002044110000000078
-:102CA00000000016006048110000036E00000000E4
-:102CB000004000000000000000000000C0200800EC
-:102CC0000000000000000000C0200C000000000018
-:102CD0000000001D00210223000000000000000091
-:102CE00014E00000000003CE810000000020441129
-:102CF000000000000000000100204811000000005A
-:102D0000000021F80020441100000000000000181D
-:102D10000020481100000000000421F90060441167
-:102D20000000068D000000110021023000000000AC
-:102D30000000000014E00000000003C000002100BB
-:102D400000204411000000000000000000204802A4
-:102D50000000000000000000002048030000000008
-:102D6000BABECAFE0020481100000000CAFEBABE6A
-:102D70000020481100000000000020100020441135
-:102D8000000000000000800000204811000000004A
-:102D90000000A2A400204411000000000000000474
-:102DA0000040481100000000000021700020441184
-:102DB00000000000000000000020480200000000A9
-:102DC0000000000000204803000000008100000017
-:102DD00000204411000000000000000A00204811FB
-:102DE00000000000000000000020001000000000B3
-:102DF0000000000014C00000000003D38C0000009D
-:102E00000020441100000000CAFEBABE0040481174
-:102E100000000000810000000020441100000000BC
-:102E200000000001002048110000000000003FFFEA
-:102E300040280A20000000008000000040280E20EA
-:102E40000000000040000000C02812200000000028
-:102E500000040000006946220000068D000000000A
-:102E6000002014100000000000000000002F0223CA
-:102E700000000000000000000CC00000000003E1A2
-:102E800000000000C0401800000003E400003FFF05
-:102E9000C0281A2000000000000400000069462637
-:102EA0000000068D00000000002018100000000047
-:102EB00000000000002F02240000000000000000BD
-:102EC0000CC00000000003E700000000C0401C0030
-:102ED000000003EA00003FFFC0281E2000000000A1
-:102EE00000040000006946270000068D0000000075
-:102EF00000201C1000000000000000000020440220
-:102F00000000000000000000002820C500000000B4
-:102F100000000000004948E800000000A580000013
-:102F200000200811000000000000200000200C110B
-:102F30000000000083000000006044110000041243
-:102F4000000000000020440200000000000000001B
-:102F5000C0204800000000000000000040204800A1
-:102F6000000000000000001FC0210220000000003F
-:102F70000000000014C00000000003F70000201053
-:102F800000204411000000000000800000204811D3
-:102F9000000000000000FFFFC0481220000003FFF7
-:102FA000A780000000200811000000000000A00021
-:102FB00000200C110000000083000000006044119C
-:102FC0000000041200000000002044020000000085
-:102FD00000000000C02048000000000000000000C9
-:102FE000C0204800000000000000FFFFC0281220A1
-:102FF00000000000830000000020441100000000D9
-:103000000000000000304883000000008400000041
-:10301000002044110000000000000000C020480013
-:1030200000000000000000001D0000000000000083
-:103030008300000000604411000004120000000042
-:10304000C040040000000001A98000000020081119
-:10305000000000000000C00000400C11000003FA56
-:10306000AB80000000200811000000000000F8E024
-:1030700000400C11000003FAAD8000000020081190
-:10308000000000000000F88000400C11000003FA6E
-:10309000B380000000200811000000000000F3FCD5
-:1030A00000400C11000003FAAF800000002008115E
-:1030B000000000000000E00000400C11000003FAD6
-:1030C000B180000000200811000000000000F000A6
-:1030D00000400C11000003FA83000000002044119E
-:1030E00000000000000021480020481100000000FE
-:1030F00084000000002044110000000000000000D7
-:10310000C020480000000000000000001D0000007A
-:10311000000000000000000000800000000000002F
-:1031200001182000C0304620000000000000000010
-:10313000D90048000000000000000000C02004008A
-:10314000000000000000000000A0000A00000000D5
-:103150000218A000C030462000000000000000005F
-:10316000D90048000000000000000000C02004005A
-:10317000000000000000000000A0000A00000000A5
-:103180000318C000C030462000000000000000000E
-:10319000D90048000000000000000000C02004002A
-:1031A000000000000000000000A0000A0000000075
-:1031B0000418F8E0C03046200000000000000000C5
-:1031C000D90048000000000000000000C0200400FA
-:1031D000000000000000000000A0000A0000000045
-:1031E0000518F880C03046200000000000000000F4
-:1031F000D90048000000000000000000C0200400CA
-:10320000000000000000000000A0000A0000000014
-:103210000618E000C030462000000000000000005A
-:10322000D90048000000000000000000C020040099
-:10323000000000000000000000A0000A00000000E4
-:103240000718F000C0304620000000000000000019
-:10325000D90048000000000000000000C020040069
-:10326000000000000000000000A0000A00000000B4
-:103270000818F3FCC03046200000000000000000E9
-:10328000D90048000000000000000000C020040039
-:10329000000000000000000000A0000A0000000084
-:1032A0000000003000200A2D000000000000000097
-:1032B000C0290C4000000000000000300020362330
-:1032C0000000000000000000C0200400000000001A
-:1032D0000000000000A0000A0000000086000000BE
-:1032E00000204411000000000000000000404801E0
-:1032F0000000000085000000C02044110000000014
-:103300000000000000404801000000000000217C97
-:10331000002044110000000000000018402102209D
-:10332000000000000000000014C000000000044580
-:1033300000800000C0494A20000004460000000050
-:10334000C02048000000000000000000C02048002D
-:103350000000000000000000C02048000000000045
-:103360008100000000204411000000000000000166
-:10337000002048110000000000000000C0200800EC
-:103380000000000000000000170000000000000026
-:103390000004217F006044110000068D0000001F22
-:1033A00000210230000000000000000014C00000F6
-:1033B000000000000000000000404C020000044B30
-:1033C00000000000C0200C00000000000000000011
-:1033D000C02010000000000000000000C020140009
-:1033E0000000000000000000C020180000000000E5
-:1033F00000000000C0201C000000000000007F0052
-:1034000000280A210000000000004500002F0222D1
-:1034100000000000000000000CE000000000045963
-:1034200000000000C020200000000000000000009C
-:1034300017000000000000000000001000280A2310
-:103440000000000000000010002F02220000000019
-:10345000000000000CE0000000000461810000009A
-:10346000002044110000000000000001002048116D
-:103470000000000000040000006946240000068DE2
-:103480000000000000400000000004668100000011
-:10349000002044110000000000000000002048113E
-:1034A000000000000000216D002044110000000019
-:1034B00000000000002048040000000000000000A0
-:1034C000006048050000069200000000002824F07B
-:1034D000000000000000000700280A230000000090
-:1034E00000000001002F0222000000000000000088
-:1034F0000AE000000000046D00000000002F00C979
-:10350000000000000000000004E00000000004864D
-:1035100000000000004000000000049300000002D2
-:10352000002F022200000000000000000AE000005E
-:103530000000047200000000002F00C9000000001D
-:103540000000000002E0000000000486000000000F
-:10355000004000000000049300000003002F02223E
-:1035600000000000000000000AE0000000000477F6
-:1035700000000000002F00C9000000000000000053
-:103580000CE0000000000486000000000040000085
-:103590000000049300000004002F0222000000003D
-:1035A000000000000AE000000000047C00000000B1
-:1035B000002F00C900000000000000000AE0000029
-:1035C000000004860000000000400000000004939A
-:1035D00000000005002F0222000000000000000093
-:1035E0000AE000000000048100000000002F00C974
-:1035F000000000000000000006E00000000004865B
-:1036000000000000004000000000049300000006DD
-:10361000002F022200000000000000000AE000006D
-:103620000000048600000000002F00C90000000018
-:103630000000000008E00000000004860000000018
-:10364000004000000000049300007F0000280A21D1
-:103650000000000000004500002F022200000000D2
-:10366000000000000AE00000000000000000000868
-:1036700000210A23000000000000000014C0000028
-:1036800000000490000021690020441100000000A7
-:1036900000000000C0204800000000000000000002
-:1036A000C02048000000000000000000C0204800CA
-:1036B00000000000CAFEBABE004048110000000031
-:1036C00000000000C02044000000000000000000D6
-:1036D000C02000000000000000000000C0404800C2
-:1036E0000000000000007F0000280A210000000008
-:1036F00000004500002F0222000000000000000032
-:103700000AE000000000049900000000C020000052
-:103710000000000000000000C020000000000000C9
-:1037200000000000C0400000000000000000000099
-:1037300000404C080000045900000000C0200800B0
-:10374000000000000000001040210E2000000000DA
-:1037500000000011402112200000000000000012B3
-:1037600040211620000000000000216900204411C3
-:1037700000000000000000000020480200000000DF
-:1037800000000000002102250000000000000000F1
-:1037900014E00000000004A300040000C0494A2017
-:1037A000000004A4FFFBFFFFC0284A200000000027
-:1037B00000000000002102230000000000000000C3
-:1037C00014E00000000004B000000000C020480029
-:1037D0000000000000000000C020480000000000C1
-:1037E0000000000000210224000000000000000092
-:1037F00014C00000000000008100000000204411FF
-:10380000000000000000000C002048110000000033
-:103810000000000000200010000000000000000078
-:1038200014C00000000004ACA000000000204411FF
-:1038300000000000CAFEBABE0040481100000000AF
-:10384000810000000020441100000000000000047E
-:1038500000204811000000000000216B00204411EE
-:103860000000000000000000C02048100000000020
-:10387000810000000020441100000000000000054D
-:1038800000204811000000000000216C00204411BD
-:103890000000000000000000C020481000000000F0
-:1038A00000000000002F02240000000000000000C3
-:1038B0000CE00000000000000000000000400000DC
-:1038C000000004AA00000000C0210A20000000003F
-:1038D0000000000014C00000000004C381000000CC
-:1038E00000204411000000000000000000204811EA
-:1038F000000000000000216D0020441100000000C5
-:1039000000000000C020480000000000000000008F
-:10391000C060480000000692000000000040000067
-:10392000000004C7810000000020441100000000D6
-:103930000000000100204811000000000004000009
-:10394000C02946200000000000000000C060000008
-:103950000000068D0000000100210222000000008E
-:103960000000000014C00000000004CE0000216927
-:10397000002044110000000000000000C0204800AA
-:103980000000000000000000C0204800000000000F
-:10399000000000000020481000000000CAFEBABE6F
-:1039A000004048110000000000000000C02044005A
-:1039B0000000000000000000C040481000000000AF
-:1039C0008100000000204411000000000000000100
-:1039D0000020481100000000000021F800204411E0
-:1039E000000000000000000E002048110000000050
-:1039F000000421F9006044110000068D0000000061
-:103A000000210230000000000000000014C000008F
-:103A1000000004D0000021800020441100000000BC
-:103A200000000000C020480000000000000000006E
-:103A3000C02000000000000000000000C02048007E
-:103A40000000000000000000C02000000000000096
-:103A500000000000C040480000000000000000031B
-:103A600000333E2F00000000000000010021022171
-:103A7000000000000000000014E00000000005004D
-:103A80000000002C00200A2D0000000000040000AF
-:103A900018E00C11000004EF0000000100333E2F7D
-:103AA0000000000000002169002044110000000017
-:103AB000000000000020480200000000000000009C
-:103AC00000204803000000000000000800300A2227
-:103AD0000000000000000000C020480000000000BE
-:103AE00000000000C0204800000000000000216924
-:103AF00000204411000000000000000000204802E7
-:103B0000000000000000000000204803000000004A
-:103B10000000000800300A22000000000000000041
-:103B2000C02048000000000000000000D8C048008D
-:103B3000000004E30000216900204411000000009F
-:103B4000000000000020480200000000000000000B
-:103B500000204803000000000000000800300A2296
-:103B60000000000000000000C0204800000000002D
-:103B700000000000C0204800000000000000002DF0
-:103B80000020122D000000000000000000290C831E
-:103B90000000000000002169002044110000000026
-:103BA00000000000002048020000000000000000AB
-:103BB00000204803000000000000000800300A2236
-:103BC0000000000000000000C020480000000000CD
-:103BD00000000000C02048000000000000000011AC
-:103BE00000210224000000000000000014C00000BA
-:103BF000000000000000000000400000000004AAD7
-:103C00000000002CC0203620000000000000002D25
-:103C1000C0403620000000000000000F00210221FB
-:103C2000000000000000000014C0000000000505B6
-:103C300000000000006000000000000B0000000019
-:103C4000D90000000000000000000000C040040097
-:103C500000000001B5000000002044110000000039
-:103C6000000020000020481100000000B600000005
-:103C700000204411000000000000A00000204811B6
-:103C800000000000B7000000002044110000000008
-:103C90000000C0000020481100000000B800000033
-:103CA00000204411000000000000F8E0002048114E
-:103CB00000000000B90000000020441100000000D6
-:103CC0000000F8800020481100000000BA00000049
-:103CD00000204411000000000000E0000020481116
-:103CE00000000000BB0000000020441100000000A4
-:103CF0000000F0000020481100000000BC0000009F
-:103D000000204411000000000000F3FC00204811D6
-:103D100000000000810000000020441100000000AD
-:103D2000000000020020481100000000000000FF19
-:103D300000280E300000000000000000002F0223C9
-:103D400000000000000000000CC000000000051989
-:103D500000000000C020080000000000000000007B
-:103D600014C000000000052E0000000000200C110F
-:103D7000000000000000001C0020362300000000AE
-:103D80000000002B00203623000000000000002966
-:103D90000020362300000000000000280020362309
-:103DA0000000000000000017002036230000000083
-:103DB000000000250020362300000000000000263F
-:103DC00000203623000000000000001500203623EC
-:103DD0000000000000000016002036230000000054
-:103DE000FFFFE00000200C11000000000000002197
-:103DF00000203623000000000000002200203623AF
-:103E00000000000000001FFF00200C110000000057
-:103E100000000023002036230000000000000024E2
-:103E20000020362300000000F1FFFFFF00283A2E9B
-:103E3000000000000000001AC0220E200000000058
-:103E4000000000000029386E000000008100000022
-:103E5000002044110000000000000006002048116E
-:103E6000000000000000002A402036200000000072
-:103E70008700000000204411000000000000000046
-:103E8000C0204800000000000000A1F40020441100
-:103E900000000000000000000020481000000000AA
-:103EA0000000000000200C110000000000000030A5
-:103EB00000203623000000009D0000000020441177
-:103EC000000000000000001F40214A200000000008
-:103ED00096000000002044110000000000000000D7
-:103EE000C02048000000000000000000C0200C00BE
-:103EF0000000000000000000C020100000000000D2
-:103F00000000001F00211624000000000000000037
-:103F100014C00000000000000000001D0020362337
-:103F2000000000000000000300281E230000000025
-:103F3000000000080022222300000000FFFFF00024
-:103F4000002822280000000000000000002920E8CE
-:103F5000000000000000001F0020362800000000C4
-:103F60000000001800211E230000000000000020B7
-:103F70000020362700000000000000020022162466
-:103F80000000000000000000003014A80000000045
-:103F90000000001E00203625000000000000000385
-:103FA00000211A24000000001000000000281A263A
-:103FB00000000000EFFFFFFF00283A2E0000000085
-:103FC00000000000004938CE0000067B0000000120
-:103FD00040280A20000000000000000640280E20B3
-:103FE0000000000000000300C028122000000000B4
-:103FF0000000000800211224000000000000000062
-:10400000C02016200000000000000000C0201A2080
-:10401000000000000000000000210222000000005B
-:104020000000000014C000000000056681000000D0
-:104030000020441100000000000000010020481191
-:10404000000000000000225800300A240000000098
-:1040500000040000006946220000068D000021696E
-:10406000002044110000000000000000002048056E
-:10407000000000000002000000294A2600000000A5
-:10408000000000000020481000000000CAFEBABE78
-:10409000002048110000000000000002002F022351
-:1040A00000000000000000000CC000000000056ED1
-:1040B00000000000C0201C100000000000000000F4
-:1040C000C04000000000057C00000002002F022319
-:1040D00000000000000000000CC000000000056EA1
-:1040E00081000000002044110000000000000001D9
-:1040F00000204811000000000000225800300A246F
-:104100000000000000040000006946220000068D47
-:1041100000000000C0201C10000000000000000093
-:10412000C04000000000057C00000000002F0223BA
-:1041300000000000000000000CC00000000005723C
-:1041400000000000C0201C00000000000000000073
-:10415000C04000000000057C00000004002F022386
-:1041600000000000000000000CC000000000057A04
-:104170008100000000204411000000000000000049
-:1041800000204811000000000000216D00204411B3
-:104190000000000000000000C020480000000000F7
-:1041A00000000000C060480000000692000000000F
-:1041B00000401C100000057C00000000C020000032
-:1041C0000000000000000000C040000000000000EF
-:1041D000000000000EE000000000057E000000006E
-:1041E00000600000000005C900000000002F02244C
-:1041F00000000000000000000CC000000000058F5F
-:104200000000A2B7002044110000000000000000E0
-:104210000020480700000000810000000020441139
-:104220000000000000000001002048110000000014
-:104230000004A2B6006044110000068D0000001AC0
-:10424000002122300000000000000006002226307D
-:104250000000000000042004006044110000068DEE
-:104260000000A2C400204411000000000000000073
-:10427000003048E9000000000000000000E00000FD
-:104280000000058D0000A2D10020441100000000B4
-:104290000000000000404808000000000000A2D11B
-:1042A00000204411000000000000000100504A28D6
-:1042B0000000000000000001002F022400000000A8
-:1042C000000000000CC00000000005A00000A2BB20
-:1042D00000204411000000000000000000204807FA
-:1042E00000000000810000000020441100000000D8
-:1042F0000000000100204811000000000004A2BAE4
-:10430000006044110000068D0000001A00212230D8
-:10431000000000000000000600222630000000001F
-:1043200000042004006044110000068D0000A2C5B6
-:10433000002044110000000000000000003048E9A7
-:10434000000000000000000000E000000000059EEA
-:104350000000A2D200204411000000000000000074
-:1043600000404808000000000000A2D200204411D4
-:10437000000000000000000100504A28000000007A
-:1043800000000002002F02240000000000000000D6
-:104390000CC00000000005B10000A2BF00204411C5
-:1043A000000000000000000000204807000000009E
-:1043B0008100000000204411000000000000000106
-:1043C00000204811000000000004A2BE006044115B
-:1043D0000000068D0000001A0021223000000000BD
-:1043E0000000000600222630000000000004200427
-:1043F000006044110000068D0000A2C60020441198
-:104400000000000000000000003048E9000000004B
-:104410000000000000E00000000005AF0000A2D393
-:104420000020441100000000000000000040480887
-:10443000000000000000A2D3002044110000000092
-:104440000000000100504A28000000000000A2C344
-:104450000020441100000000000000000020480778
-:104460000000000081000000002044110000000056
-:104470000000000100204811000000000004A2C25A
-:10448000006044110000068D0000001A0021223057
-:10449000000000000000000600222630000000009E
-:1044A00000042004006044110000068D0000A2C733
-:1044B000002044110000000000000000003048E926
-:1044C000000000000000000000E00000000005BE49
-:1044D0000000A2D4002044110000000000000000F1
-:1044E00000404808000000000000A2D40020441151
-:1044F000000000000000000100504A2800000000F9
-:1045000085000000002044110000000000000000B1
-:1045100000204801000000000000304A0020441143
-:104520000000000001000000002048110000000011
-:104530000000000000400000000005C4A4000000CE
-:10454000C02044110000000000000000C0404800EE
-:104550000000000000000000C0600000000005C96D
-:1045600000000000C0400400000000010000002C1A
-:1045700000203621000000008100000000204411CE
-:1045800000000000000000060020481100000000AC
-:1045900000000000002F02300000000000000000BA
-:1045A0000CC00000000005D0000000000020041135
-:1045B000000000000000003000403621000005E34C
-:1045C000000000300020062D0000000000007E00EA
-:1045D000002806210000000000000000002F02213A
-:1045E00000000000000000000CE00000000005E3F7
-:1045F00081000000002044110000000000000001C4
-:1046000000204811000000000004A0920060441146
-:104610000000068D00000031002036300000000050
-:104620000004A093006044110000068D00000032D9
-:1046300000203630000000000004A2B600604411E3
-:104640000000068D0000003300203630000000001E
-:104650000004A2BA006044110000068D000000347E
-:1046600000203630000000000004A2BE00604411AB
-:104670000000068D000000350020363000000000EC
-:104680000004A2C2006044110000068D0000003644
-:1046900000203630000000000004200400604411B7
-:1046A0000000068D0001A2A40020441100000000BB
-:1046B0000000003F00204811000000000000003F03
-:1046C00000204811000000000000003F00204811B9
-:1046D000000000000000003F002048110000000022
-:1046E0000000000500204811000000000000A1F4B7
-:1046F00000204411000000000000000000204811CC
-:1047000000000000880000000020441100000000AC
-:10471000000000010020481100000000810000009E
-:104720000020441100000000000000060020481195
-:104730000000000000000001002F02300000000017
-:10474000000000000CE000000000062C000000301B
-:104750000020062D0000000000000000002F0221B4
-:1047600000000000000000000CE000000000062C2B
-:104770008100000000204411000000000000000142
-:10478000002048110000000000007E0000280621E3
-:104790000000000000000000002F022100000000C7
-:1047A000000000000CE00000000006050000A092E0
-:1047B00000204411000000000000003100204A2DBC
-:1047C000000000000000A093002044110000000041
-:1047D0000000003200204A2D000000000000A2B6B8
-:1047E00000204411000000000000003300204A2D8A
-:1047F000000000000000A2BA0020441100000000E8
-:104800000000003400204A2D000000000000A2BE7D
-:1048100000204411000000000000003500204A2D57
-:10482000000000000000A2C20020441100000000AF
-:104830000000003600204A2D00000000000000307B
-:104840000020062D00000000000001FF00280621C6
-:104850000000000000000000002F02210000000006
-:10486000000000000CE000000000062B000000002B
-:1048700000210221000000000000000014C0000020
-:104880000000060E0004A003006044110000068D25
-:104890000000A00300204411000000000000000000
-:1048A0000020481000000000000000010021062147
-:1048B000000000000000000014C00000000006130B
-:1048C0000004A010006044110000068D0000A0103C
-:1048D00000204411000000000000000000204810EB
-:1048E000000000000000000100210621000000007F
-:1048F00000000000002F0221000000000000000066
-:104900000CE000000000062B0004A0110060441120
-:104910000000068D0000A0110020441100000000DE
-:104920000000000000204810000000000004A01259
-:10493000006044110000068D0000A0120020441108
-:1049400000000000000000000020481000000000EF
-:104950000004A013006044110000068D0000A013A5
-:10496000002044110000000000000000002048105A
-:10497000000000000004A014006044110000068D37
-:104980000000A014002044110000000000000000FE
-:1049900000204810000000000004A0150060441131
-:1049A0000000068D0000A01500204411000000004A
-:1049B0000000000000204810000000000004A016C5
-:1049C000006044110000068D0000A0160020441174
-:1049D000000000000000000000204810000000005F
-:1049E0000004A017006044110000068D0000A0170D
-:1049F00000204411000000000000000000204810CA
-:104A00000000000000042004006044110000068D36
-:104A10000000002C0080062D00000000FF000000B8
-:104A20000020441100000000000000000020481198
-:104A300000000000000000010020481100000000FC
-:104A4000000000020080481100000000000000008B
-:104A50000EE000000000063D000000300020062DA2
-:104A600000000000000000020028062100000000F5
-:104A700000000000002F02210000000000000000E4
-:104A80000CE000000000063B810000000020441103
-:104A9000000000000000000100204811000000009C
-:104AA00000042004006044110000068D0000100086
-:104AB00000200811000000000000002B002036221A
-:104AC000000000000000000000600000000006413F
-:104AD0000000000000600000000005C99800000010
-:104AE0000020441100000000000000000080481178
-:104AF0000000000000000000C0600000000006414F
-:104B000000000000C0400400000000010000A2A45A
-:104B10000020441100000000000000220020481185
-:104B20000000000089000000002044110000000087
-:104B300000000001004048110000062D9700000011
-:104B40000020441100000000000000000020481177
-:104B5000000000008A000000002044110000000056
-:104B600000000000004048110000062D0000000079
-:104B7000006000000000065C0000201000204411CE
-:104B8000000000000000800000204811000000002C
-:104B90000001A2A4C0204411000000000000001683
-:104BA000006048110000036E000020100020441136
-:104BB000000000000001000000204811000000007B
-:104BC00081000000002044110000000000000001EE
-:104BD00000204811000000000000217C002044114A
-:104BE00000000000098000000020481100000000C3
-:104BF000FFFFFFFF00204811000000000000000040
-:104C00000020481100000000000000001700000014
-:104C1000000000000004217F006044110000068DA8
-:104C20000000001F00210230000000000000000012
-:104C300014C00000000000000000000400404C11FF
-:104C400000000656000000000040000000000000C8
-:104C50000000001700201E2D0000000000000004CE
-:104C600000291E27000000000000001700803627E2
-:104C7000000000000000001700201E2D00000000B2
-:104C8000FFFFFFFB00281E270000000000000017A8
-:104C900000803627000000000000001700201E2DB5
-:104CA000000000000000000800291E27000000008E
-:104CB00000000017008036270000000000000017E9
-:104CC00000201E2D00000000FFFFFFF700281E2718
-:104CD00000000000000000170080362700000000E0
-:104CE000000020100020441100000000000080009F
-:104CF00000204811000000000001A2A4002044117F
-:104D00000000000000000016006048110000036E63
-:104D100000002010002044110000000000010000ED
-:104D200000204811000000000000217C00204411F8
-:104D30000000000001800000002048110000000079
-:104D4000FFFFFFFF002048110000000000000000EE
-:104D500000204811000000000000000017000000C3
-:104D6000000000008100000000204411000000004D
-:104D70000000000100204811000000000004217F15
-:104D8000006044110000068D0000001F0021023069
-:104D9000000000000000000014C000000000068CAD
-:104DA0000000001000404C110000067200000000DE
-:104DB000C0200400000000000000000038C0000017
-:104DC000000000000000001D00200A2D000000006F
-:104DD0000000001E00200E2D000000000000001F3B
-:104DE0000020122D00000000000000200020162DE1
-:104DF00000000000000021690020441100000000B4
-:104E00000000000000204804000000000000000036
-:104E100000204805000000000000000000204801BC
-:104E200000000000CAFEBABE0020481100000000C9
-:104E30000000000400301224000000000000000008
-:104E4000002F006400000000000000000CC0000003
-:104E50000000068B0000000300281A22000000005A
-:104E6000000000080022122200000000FFFFF000F6
-:104E7000002812240000000000000000002910C4D7
-:104E8000000000000000001F004036240000000069
-:104E90000000000000800000000000000000000092
-:104EA0001AC000000000068D9F0000000020441181
-:104EB00000000000CAFEBABE002048110000000039
-:104EC000000000001AE00000000006900000000052
-:104ED0000080000000000000000000001AC0000078
-:104EE000000006929E000000002044110000000017
-:104EF000CAFEBABE002048110000000000000000F9
-:104F00001AE000000000069500000000008000008C
-:104F10000000000000000000006000000000000B26
-:104F200000001000006004110000031500000000E4
-:104F300000200411000000000000000000600811C3
-:104F4000000001B20000225C0020441100000000BB
-:104F5000000000030020481100000000000022565D
-:104F600000204411000000000000001B0020481138
-:104F7000000000000000A1FC00204411000000001F
-:104F80000000000100204811000000000001A1FD08
-:104F9000C0204411000000000000002100201E2D50
-:104FA000000000000000001000221E27000000008A
-:104FB000000000240020222D000000000000FFFF60
-:104FC00000282228000000000000000000294907F6
-:104FD0000000000000000000002048110000000058
-:104FE000000000220020222D000000000000FFFF32
-:104FF00000282228000000000000000000294907C6
-:105000000000000000000000002048110000000027
-:105010000000002300201E2D0000000000000010F2
-:1050200000221E27000000000000000000294907A0
-:1050300000000000000000000040481100000000D7
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B0000142050205C002500000000001C3016860
-:1052C000043F05C000000000022502090250015100
-:1052D000000000000223024502A00241000000007D
-:1052E00003D705C005C005C0000000000649064AF6
-:1052F000031F05C00000000005C005C503200340D2
-:1053000000000000032A0282034203340000000070
-:1053100005C005C005C005C00000000005C005515E
-:1053200005C005C00000000003BA05C004BB03446B
-:1053300000000000049A0450043D05C00000000075
-:1053400004D005C0044104DD00000000045005073E
-:10535000035103750000000005C005C005C005C06D
-:105360000000000005C005C005C005C00000000029
-:1053700005C005C0063F05C70000000005C005C008
-:10538000000705C00000000005C005C005C005C03D
-:105390000000000005C005C005C005C000000000F9
-:1053A00003F803ED0408040600000000040E040ADC
-:1053B000040C041000000000041C04180424042041
-:1053C00000000000042C0428043404300000000015
-:1053D00005C005C0043805C00000000005C005C0B8
-:1053E00005C005C00000000005C005C005C005C01F
-:1053F0000000000000020679069700060000000089
-:00000001FF
diff --git a/firmware/radeon/RV620_pfp.bin.ihex b/firmware/radeon/RV620_pfp.bin.ihex
deleted file mode 100644
index f55292c97b79..000000000000
--- a/firmware/radeon/RV620_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001B8007C038B00D4401E00EE001E5F
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581A800C41C3A08
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFF000042C0400309002007D250049
-:1000700000351402007D350B00255403007CD5802B
-:1000800000259C030095C00400D5001B007EDDC147
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA180000D4401E00D5801EAD
-:100140000080005300D4007500D4401E00CA08008F
-:1001500000CA0C0000CA100000D4801900D4C018D6
-:1001600000D5001700D4801E00D4C01E00D5001E8C
-:1001700000E2001E00CA040000A00000007E828B86
-:1001800000CA080000D4806000D4401E0080000037
-:1001900000D4801E00CA080000D4806100D4401E34
-:1001A0000080000000D4801E00CA080000CA0C00B5
-:1001B00000D4401E00D4801600D4C01600D4801E87
-:1001C000008001B800D4C01E00C6084300CA0C005D
-:1001D00000CA10000094800400CA140000E420F358
-:1001E00000D4201300D5606500D4E01C00D5201C8D
-:1001F00000D5601C008000000006200100C60843F6
-:1002000000CA0C0000CA1000009483F700CA140052
-:1002100000E420F30080007900D4201300C60843D6
-:1002200000CA0C0000CA1000009883EF00CA140036
-:1002300000D400640080008D0000000000C414326F
-:1002400000C6184300C4082F0095400500C40C30B8
-:1002500000D4401E0080000000EE001E009583F5D3
-:1002600000C4103100D4403300D5206500D4A01C58
-:1002700000D4E01C00D5201C00E4015E00D4001E68
-:10028000008000000006200100CA1800000A2001BA
-:1002900000D6007600C408360098800700C61045D6
-:1002A0000095011000D4001F00D46062008000009F
-:1002B00000D4206200CC383500CC1433008401BB5C
-:1002C00000D4007200D5401E0080000000EE001E29
-:1002D00000E2001A008401BB00E2001A00CC104BBF
-:1002E00000CC0447002C9401007D098B0098400548
-:1002F000007D15CB00D4001A008001B800D4006D39
-:100300000034440100CC0C480098403A00CC2C4A00
-:100310000095800400CC0449008001B800D4001A84
-:1003200000D4C01A00282801008400F000CC10037B
-:100330000098801B0004380C008400F000CC1003EF
-:100340000098801700043808008400F000CC1003E7
-:100350000098801300043804008400F000CC1003DF
-:100360000098801400CC104C009A800900CC144DE9
-:10037000009840DC00D4006D00CC184800D5001A6D
-:1003800000D5401A008000C900D5801A0096C0D55B
-:1003900000D4006D008001B800D4006E009AC00344
-:1003A00000D4006D00D4006E0080000000EC007FDF
-:1003B000009AC0CC00D4006D008001B800D4006E5B
-:1003C00000CC140300CC180300CC1C03007D910367
-:1003D000007DD583007D190C0035CC1F0035701FC2
-:1003E000007CF0CB007CD08B00880000007E8E8BE0
-:1003F0000095C00400D4006E008001B800D4001A3B
-:1004000000D4C01A00CC080300CC0C0300CC1003AD
-:1004100000CC140300CC180300CC1C0300CC240334
-:1004200000CC28030035C41F0036B01F007C704B81
-:100430000034F01F007C704B0035701F007C704B47
-:10044000007D8881007DCCC1007E5101007E9541F8
-:10045000007C9082007CD4C2007C848B009AC00314
-:10046000007C8C8B002C88010098809E00D4006D4D
-:100470000098409C00D4006E00CC084C00CC0C4D81
-:1004800000CC104800D4801A00D4C01A00800101AA
-:1004900000D5001A00CC083200D40032009482D972
-:1004A00000CA0C0000D4401E0080000000D4001ED2
-:1004B00000E4011E00D4001E00CA080000CA0C009F
-:1004C00000CA100000D4401E00CA140000D4801ED0
-:1004D00000D4C01E00D5001E00D5401E00D54034FB
-:1004E0000080000000EE001E0028040400E2001A54
-:1004F00000E2001A00D4401A00CA380000CC0803F9
-:1005000000CC0C0300CC0C0300CC0C03009882BD83
-:1005100000000000008401BB00D7A06F0080000035
-:1005200000EE001F00CA040000C2FF0000CC083427
-:1005300000C13FFF007C74CB007CC90B007D010F24
-:10054000009902B0007C738B008401BB00D7A06FC0
-:100550000080000000EE001F00CA080000281900FB
-:10056000007D898B009580140028140400CA0C00BB
-:1005700000CA100000CA1C0000CA240000E2001FCC
-:1005800000D4C01A00D5001A00D5401A00CC1803B8
-:1005900000CC2C0300CC2C0300CC2C03007DA58BBD
-:1005A000007D9C4700984297000000000080016198
-:1005B00000D4C01A00D4401E00D4801E0080000069
-:1005C00000EE001E00E4011E00D4001E00D4401EF8
-:1005D00000EE001E00CA040000A00000007E828B16
-:1005E00000E4013E00D4001E00D4401E00EE001EB8
-:1005F00000CA040000A00000007E828B00CA080030
-:1006000000248C06000CCC060098C00600CC104ECE
-:100610000099000400D4007300E4011E00D4001E01
-:1006200000D4401E00D4801E0080000000EE001E9A
-:1006300000CA080000CA0C000034D01800251001C0
-:100640000095002100C17FFF00CA100000CA1400FD
-:1006500000CA180000D4801D00D4C01D007DB18BDD
-:1006600000C1420200C2C00100D5801D0034DC0E72
-:10067000007D5D4C007F734C00D7401E00D5001EEE
-:1006800000D5401E00C1420000C2C00000099C010C
-:100690000031DC10007F5F4C007F734C00042802A7
-:1006A000007D838000D5A86F00D5806600D7401EEE
-:1006B00000EC005E00C8240200C82402008001B8DB
-:1006C00000D6007600D4401E00D4801E00D4C01E88
-:1006D0000080000000EE001E0080000000EE001F01
-:1006E00000D4001F0080000000D4001F00D4001FB1
-:1006F0000088000000D4001F00000000000000007F
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:1008000000010171000201780003008F0004007FE5
-:10081000000500030006003F000700320008012C1D
-:1008200000090046000A0036001001B6001700A2B9
-:100830000022013A00230149002000B400240125D0
-:100840000027004D0028006A002A0060002B00529B
-:10085000002F0065003200870034017F003C015604
-:10086000003F00720041018C0044012E00550173CD
-:100870000056017A0060000B00610034006200380D
-:1008800000630038006400380065003800660038F6
-:10089000006700380068003A00690041006A0048BB
-:1008A000006B0048006C0048006D0048006E004876
-:1008B000006F00480000000600000006000000066F
-:1008C0000000000600000006000000060000000610
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV630_me.bin.ihex b/firmware/radeon/RV630_me.bin.ihex
deleted file mode 100644
index ba3a7e632d97..000000000000
--- a/firmware/radeon/RV630_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A000006044110000068A0000000000600000AB
-:1000B0000000062E00000000006000000000064264
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:1006600000000000006000000000066500000000BF
-:1006700000600000000006590000000200210E2268
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE00000000000006000000000065F0000000041
-:100AF00000400000000000EB00000000006000006B
-:100B000000000662000000070020222D0000000007
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E90000000068A0000001F002102300000000050
-:100EA0000000000014C000000000068900000004DB
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000068A000000110021023000000000FE
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000068900000000002B140500000000B5
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A000000000010000000000600000000006428E
-:1019B000000000000040040F0000021300000000BF
-:1019C000006000000000062E000000000060000023
-:1019D0000000064200000210006004110000031520
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B1000006000000000062E0000A00C0020441110
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E300000042004006044110000068A0000000035
-:101E4000006000000000062E00000000C0600000DE
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000006650000000000600000000002B53C
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:102240000000065C0000000000400000000002DE0C
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A00000000970000000020441125
-:102600000000000000000000002048110000000051
-:102610008A000000002044110000000000000000BB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D0000001A1FD002044110000000000000000E6
-:1026E000D90048000000000000000000C0200400E5
-:1026F000000000000000000000A0000A0000000030
-:1027000000002257002044110000000000000003D8
-:10271000C0484A20000000000000225D0020441153
-:102720000000000000000000C04048000000000061
-:1027300000000000006000000000064200000000F1
-:10274000C0200800000000000000225C00204411AE
-:10275000000000000000000300384A2200000000D2
-:102760000000A1FC00204411000000000000000057
-:10277000C0204800000000000001A1FD002044111D
-:102780000000000000000000002F022200000000F6
-:10279000000000000CE0000000000000000000004D
-:1027A00040204800000000000000000140304A20A6
-:1027B0000000000000000002C0304A2000000000BD
-:1027C0000000000100530A220000034B0000003FFC
-:1027D000C0280A20000000008100000000204411F1
-:1027E000000000000000000100204811000000006F
-:1027F000000021F800204411000000000000001833
-:102800000020481100000000000421F9006044117C
-:102810000000068A000000110021023000000000C4
-:102820000000000014E00000000003540000001449
-:10283000002F022200000000000000000CC0000079
-:10284000000003640000201000204411000000007C
-:102850000000800000204811000000000001A2A438
-:102860000020441100000000000000000060480249
-:102870000000036E00002100002044110000000051
-:1028800000000000C0204800000000000000000020
-:10289000C02048000000000000000000C0204800E8
-:1028A0000000000000000000C040480000000000E0
-:1028B00000000004002F02220000000000000000C1
-:1028C0000CC000000000036A00002010002044112A
-:1028D00000000000000080000020481100000000FF
-:1028E0000001A2A40020441100000000000000002C
-:1028F000004048020000035F00000028002F022271
-:1029000000000000000000000CC00000000005BD39
-:102910000001A2A4002044110000000000000000FB
-:10292000004048020000035F0000002C0020362613
-:102930000000000000000049002018110000000005
-:102940000000003F002048110000000000000001CE
-:1029500000331A260000000000000000002F0226AD
-:1029600000000000000000000CC000000000037028
-:102970000000002C00801A2D000000000000003F25
-:10298000C0280A200000000000000015002F0222CD
-:1029900000000000000000000CE0000000000386C2
-:1029A00000000006002F02220000000000000000CE
-:1029B0000CE00000000003B100000016002F02220E
-:1029C00000000000000000000CE00000000003B563
-:1029D00000000020002F0222000000000000000084
-:1029E0000CE000000000039C0000000F002F0222FA
-:1029F00000000000000000000CE00000000003A840
-:102A000000000010002F0222000000000000000063
-:102A10000CE00000000003A80000001E002F0222AE
-:102A200000000000000000000CE000000000039027
-:102A30000000A2A4002044110000000000000000DB
-:102A400000404802000000000800000000290A229F
-:102A5000000000000000000340210E2000000000E4
-:102A60000000000CC021122000000000000800003F
-:102A7000002812240000000000000014C0221620CC
-:102A80000000000000000000002914A40000000065
-:102A90000000A2A40020441100000000000000007B
-:102AA000002948A2000000000000A1FE00204411FF
-:102AB000000000000000000000404803000000008B
-:102AC000810000000020441100000000000000010F
-:102AD0000020481100000000000021F800204411EF
-:102AE0000000000000000016002048110000000057
-:102AF000000421F9006044110000068A000000155E
-:102B000000210230000000000000000014E000007E
-:102B1000000003920000210E00204411000000007C
-:102B200000000000C020480000000000000000007D
-:102B3000C0204800000000000000A2A400204411B2
-:102B400000000000000000000040480200000000FB
-:102B5000810000000020441100000000000000017E
-:102B60000020481100000000000021F8002044115E
-:102B700000000000000000170020481100000000C5
-:102B8000000421F9006044110000068A00000003DF
-:102B900000210230000000000000000014E00000EE
-:102BA0000000039E000021080020441100000000E6
-:102BB00000000000C02048000000000000000000ED
-:102BC000C0204800000000000000A2A40020441122
-:102BD000000000000000000000404802000000006B
-:102BE0000000A2A40020441100000000000000002A
-:102BF0000020480200000000800000000020441176
-:102C0000000000000000000000204811000000004B
-:102C100081000000002044110000000000000010AE
-:102C200000204811000000000000000000200010FB
-:102C3000000000000000000014C00000000003AE0F
-:102C40000000000000400000000000000000201014
-:102C50000020441100000000000080000020481106
-:102C6000000000000001A2A40020441100000000A8
-:102C70000000000600404811000000000000201085
-:102C800000204411000000000000800000204811D6
-:102C9000000000000001A2A4002044110000000078
-:102CA00000000016006048110000036E00000000E4
-:102CB000004000000000000000000000C0200800EC
-:102CC0000000000000000000C0200C000000000018
-:102CD0000000001D00210223000000000000000091
-:102CE00014E00000000003CE810000000020441129
-:102CF000000000000000000100204811000000005A
-:102D0000000021F80020441100000000000000181D
-:102D10000020481100000000000421F90060441167
-:102D20000000068A000000110021023000000000AF
-:102D30000000000014E00000000003C000002100BB
-:102D400000204411000000000000000000204802A4
-:102D50000000000000000000002048030000000008
-:102D6000BABECAFE0020481100000000CAFEBABE6A
-:102D70000020481100000000000020100020441135
-:102D8000000000000000800000204811000000004A
-:102D90000000A2A400204411000000000000000474
-:102DA0000040481100000000000021700020441184
-:102DB00000000000000000000020480200000000A9
-:102DC0000000000000204803000000008100000017
-:102DD00000204411000000000000000A00204811FB
-:102DE00000000000000000000020001000000000B3
-:102DF0000000000014C00000000003D38C0000009D
-:102E00000020441100000000CAFEBABE0040481174
-:102E100000000000810000000020441100000000BC
-:102E200000000001002048110000000000003FFFEA
-:102E300040280A20000000008000000040280E20EA
-:102E40000000000040000000C02812200000000028
-:102E500000040000006946220000068A000000000D
-:102E6000002014100000000000000000002F0223CA
-:102E700000000000000000000CC00000000003E1A2
-:102E800000000000C0401800000003E400003FFF05
-:102E9000C0281A2000000000000400000069462637
-:102EA0000000068A0000000000201810000000004A
-:102EB00000000000002F02240000000000000000BD
-:102EC0000CC00000000003E700000000C0401C0030
-:102ED000000003EA00003FFFC0281E2000000000A1
-:102EE00000040000006946270000068A0000000078
-:102EF00000201C1000000000000000000020440220
-:102F00000000000000000000002820C500000000B4
-:102F100000000000004948E800000000A580000013
-:102F200000200811000000000000200000200C110B
-:102F30000000000083000000006044110000041243
-:102F4000000000000020440200000000000000001B
-:102F5000C0204800000000000000000040204800A1
-:102F6000000000000000001FC0210220000000003F
-:102F70000000000014C00000000003F70000201053
-:102F800000204411000000000000800000204811D3
-:102F9000000000000000FFFFC0481220000003FFF7
-:102FA000A780000000200811000000000000A00021
-:102FB00000200C110000000083000000006044119C
-:102FC0000000041200000000002044020000000085
-:102FD00000000000C02048000000000000000000C9
-:102FE000C0204800000000000000FFFFC0281220A1
-:102FF00000000000830000000020441100000000D9
-:103000000000000000304883000000008400000041
-:10301000002044110000000000000000C020480013
-:1030200000000000000000001D0000000000000083
-:103030008300000000604411000004120000000042
-:10304000C040040000000001A98000000020081119
-:10305000000000000000C00000400C11000003FA56
-:10306000AB80000000200811000000000000F8E024
-:1030700000400C11000003FAAD8000000020081190
-:10308000000000000000F88000400C11000003FA6E
-:10309000B380000000200811000000000000F3FCD5
-:1030A00000400C11000003FAAF800000002008115E
-:1030B000000000000000E00000400C11000003FAD6
-:1030C000B180000000200811000000000000F000A6
-:1030D00000400C11000003FA83000000002044119E
-:1030E00000000000000021480020481100000000FE
-:1030F00084000000002044110000000000000000D7
-:10310000C020480000000000000000001D0000007A
-:10311000000000000000000000800000000000002F
-:1031200001182000C0304620000000000000000010
-:10313000D90048000000000000000000C02004008A
-:10314000000000000000000000A0000A00000000D5
-:103150000218A000C030462000000000000000005F
-:10316000D90048000000000000000000C02004005A
-:10317000000000000000000000A0000A00000000A5
-:103180000318C000C030462000000000000000000E
-:10319000D90048000000000000000000C02004002A
-:1031A000000000000000000000A0000A0000000075
-:1031B0000418F8E0C03046200000000000000000C5
-:1031C000D90048000000000000000000C0200400FA
-:1031D000000000000000000000A0000A0000000045
-:1031E0000518F880C03046200000000000000000F4
-:1031F000D90048000000000000000000C0200400CA
-:10320000000000000000000000A0000A0000000014
-:103210000618E000C030462000000000000000005A
-:10322000D90048000000000000000000C020040099
-:10323000000000000000000000A0000A00000000E4
-:103240000718F000C0304620000000000000000019
-:10325000D90048000000000000000000C020040069
-:10326000000000000000000000A0000A00000000B4
-:103270000818F3FCC03046200000000000000000E9
-:10328000D90048000000000000000000C020040039
-:10329000000000000000000000A0000A0000000084
-:1032A0000000003000200A2D000000000000000097
-:1032B000C0290C4000000000000000300020362330
-:1032C0000000000000000000C0200400000000001A
-:1032D0000000000000A0000A0000000086000000BE
-:1032E00000204411000000000000000000404801E0
-:1032F0000000000085000000C02044110000000014
-:103300000000000000404801000000000000217C97
-:10331000002044110000000000000000C020480010
-:103320000000000000000000C02048000000000075
-:1033300000000000C02048000000000081000000E4
-:10334000002044110000000000000001002048118E
-:103350000000000000000000C02008000000000085
-:103360000000000017000000000000000004217FA2
-:10337000006044110000068A0000001F0021023096
-:10338000000000000000000014C000000000000069
-:103390000000000000404C02000004480000000053
-:1033A000C0200C000000000000000000C020100041
-:1033B0000000000000000000C02014000000000019
-:1033C00000000000C0201800000000000000000005
-:1033D000C0201C000000000000007F0000280A211F
-:1033E0000000000000004500002F02220000000045
-:1033F000000000000CE00000000004560000000087
-:10340000C0202000000000000000000017000000A5
-:10341000000000000000001000280A230000000047
-:1034200000000010002F0222000000000000000039
-:103430000CE000000000045E810000000020441148
-:103440000000000000000001002048110000000002
-:1034500000040000006946240000068A0000000005
-:1034600000400000000004638100000000204411BF
-:1034700000000000000000000020481100000000D3
-:103480000000216D00204411000000000000000039
-:103490000020480400000000000000000060480513
-:1034A0000000068F00000000002824F0000000004B
-:1034B0000000000700280A230000000000000001AF
-:1034C000002F022200000000000000000AE00000BF
-:1034D0000000046A00000000002F00C90000000086
-:1034E0000000000004E00000000004830000000071
-:1034F000004000000000049000000002002F0222A3
-:1035000000000000000000000AE000000000046F5E
-:1035100000000000002F00C90000000000000000B3
-:1035200002E00000000004830000000000400000F2
-:103530000000049000000003002F022200000000A1
-:10354000000000000AE00000000004740000000019
-:10355000002F00C900000000000000000CE0000087
-:103560000000048300000000004000000000049000
-:1035700000000004002F02220000000000000000F4
-:103580000AE000000000047900000000002F00C9DC
-:1035900000000000000000000AE0000000000483BA
-:1035A0000000000000400000000004900000000542
-:1035B000002F022200000000000000000AE00000CE
-:1035C0000000047E00000000002F00C90000000081
-:1035D0000000000006E0000000000483000000007E
-:1035E000004000000000049000000006002F0222AE
-:1035F00000000000000000000AE00000000004835A
-:1036000000000000002F00C90000000000000000C2
-:1036100008E00000000004830000000000400000FB
-:103620000000049000007F0000280A210000000034
-:1036300000004500002F02220000000000000000F2
-:103640000AE00000000000000000000800210A233A
-:10365000000000000000000014C000000000048D05
-:10366000000021690020441100000000000000005B
-:10367000C02048000000000000000000C0204800FA
-:103680000000000000000000C02048000000000012
-:10369000CAFEBABE00404811000000000000000051
-:1036A000C02044000000000000000000C020000016
-:1036B0000000000000000000C040480000000000C2
-:1036C00000007F0000280A210000000000004500E3
-:1036D000002F022200000000000000000AE00000AD
-:1036E0000000049600000000C02000000000000060
-:1036F00000000000C02000000000000000000000EA
-:10370000C0400000000000000000000000404C0825
-:103710000000045600000000C02008000000000067
-:103720000000001040210E200000000000000011E9
-:10373000402112200000000000000012402116204D
-:10374000000000000000216900204411000000007A
-:1037500000000000002048020000000000000000FF
-:1037600000210225000000000000000014E000001D
-:10377000000004A000040000C0494A20000004A189
-:10378000FFFBFFFFC0284A200000000000000000EF
-:1037900000210223000000000000000014E00000EF
-:1037A000000004AD00000000C02048000000000040
-:1037B00000000000C02048000000000000000000E1
-:1037C00000210224000000000000000014C00000DE
-:1037D00000000000810000000020441100000000F3
-:1037E0000000000C00204811000000000000000054
-:1037F00000200010000000000000000014C00000C5
-:10380000000004A9A00000000020441100000000F6
-:10381000CAFEBABE0040481100000000810000004E
-:1038200000204411000000000000000400204811A6
-:10383000000000000000216B002044110000000087
-:1038400000000000C02048100000000081000000BF
-:103850000020441100000000000000050020481175
-:10386000000000000000216C002044110000000056
-:1038700000000000C0204810000000000000000010
-:10388000002F022400000000000000000CE00000F7
-:10389000000000000000000000400000000004A73D
-:1038A00000000000C0210A2000000000000000000D
-:1038B00014C00000000004C081000000002044117A
-:1038C000000000000000000000204811000000007F
-:1038D0000000216D002044110000000000000000E5
-:1038E000C02048000000000000000000C060480048
-:1038F0000000068F0000000000400000000004C42B
-:1039000081000000002044110000000000000001C0
-:10391000002048110000000000040000C0294620DB
-:103920000000000000000000C06000000000068AE7
-:103930000000000100210222000000000000000041
-:1039400014C00000000004CB0000216900204411D5
-:103950000000000000000000C0204800000000003F
-:1039600000000000C020480000000000000000002F
-:103970000020481000000000CAFEBABE00404811F6
-:103980000000000000000000C02044000000000013
-:1039900000000000C040481000000000810000004E
-:1039A0000020441100000000000000010020481128
-:1039B00000000000000021F8002044110000000079
-:1039C0000000000E0020481100000000000421F952
-:1039D000006044110000068A00000000002102304F
-:1039E000000000000000000014C00000000004CD32
-:1039F00000002180002044110000000000000000B1
-:103A0000C02048000000000000000000C0200000AE
-:103A10000000000000000000C0204800000000007E
-:103A200000000000C02000000000000000000000B6
-:103A3000C0404800000000000000000300333E2F9B
-:103A40000000000000000001002102210000000031
-:103A50000000000014E00000000004FD0000002C45
-:103A600000200A2D000000000004000018E00C11E6
-:103A7000000004EC0000000100333E2F00000000B5
-:103A80000000216900204411000000000000000037
-:103A90000020480200000000000000000020480351
-:103AA000000000000000000800300A2200000000B2
-:103AB00000000000C02048000000000000000000DE
-:103AC000C0204800000000000000216900204411CF
-:103AD000000000000000000000204802000000007C
-:103AE0000000000000204803000000000000000863
-:103AF00000300A220000000000000000C020480042
-:103B00000000000000000000D8C04800000004E0F1
-:103B100000002169002044110000000000000000A6
-:103B200000204802000000000000000000204803C0
-:103B3000000000000000000800300A220000000021
-:103B400000000000C020480000000000000000004D
-:103B5000C0204800000000000000002D0020122DB1
-:103B6000000000000000000000290C83000000009D
-:103B70000000216900204411000000000000000046
-:103B80000020480200000000000000000020480360
-:103B9000000000000000000800300A2200000000C1
-:103BA00000000000C02048000000000000000000ED
-:103BB000C020480000000000000000110021022485
-:103BC000000000000000000014C000000000000021
-:103BD0000000000000400000000004A70000002CCE
-:103BE000C0203620000000000000002DC04036201C
-:103BF000000000000000000F002102210000000072
-:103C00000000000014C000000000050200000000D9
-:103C1000006000000000000B00000000D900000060
-:103C20000000000000000000C0400400000000018F
-:103C3000B50000000020441100000000000020003A
-:103C40000020481100000000B600000000204411D0
-:103C5000000000000000A00000204811000000004B
-:103C6000B700000000204411000000000000C00068
-:103C70000020481100000000B8000000002044119E
-:103C8000000000000000F8E00020481100000000E3
-:103C9000B900000000204411000000000000F8807E
-:103CA0000020481100000000BA000000002044116C
-:103CB000000000000000E0000020481100000000AB
-:103CC000BB00000000204411000000000000F000D4
-:103CD0000020481100000000BC000000002044113A
-:103CE000000000000000F3FC00204811000000006C
-:103CF00081000000002044110000000000000002CC
-:103D00000020481100000000000000FF00280E30D5
-:103D10000000000000000000002F0223000000004F
-:103D2000000000000CC000000000051600000000AC
-:103D3000C0200800000000000000000014C00000C7
-:103D40000000052B0000000000200C110000000006
-:103D50000000001C00203623000000000000002BA3
-:103D60000020362300000000000000290020362338
-:103D700000000000000000280020362300000000A2
-:103D8000000000170020362300000000000000257E
-:103D9000002036230000000000000026002036230B
-:103DA0000000000000000015002036230000000085
-:103DB000000000160020362300000000FFFFE00096
-:103DC00000200C110000000000000021002036231C
-:103DD0000000000000000022002036230000000048
-:103DE00000001FFF00200C11000000000000002355
-:103DF00000203623000000000000002400203623AD
-:103E000000000000F1FFFFFF00283A2E0000000034
-:103E10000000001AC0220E20000000000000000078
-:103E20000029386E000000008100000000204411CD
-:103E30000000000000000006002048110000000003
-:103E40000000002A4020362000000000870000000B
-:103E5000002044110000000000000000C0204800C5
-:103E6000000000000000A1F4002044110000000048
-:103E700000000000002048100000000000000000CA
-:103E800000200C110000000000000030002036234C
-:103E9000000000009D000000002044110000000010
-:103EA0000000001F40214A20000000009600000092
-:103EB000002044110000000000000000C020480065
-:103EC0000000000000000000C0200C000000000006
-:103ED00000000000C0201000000000000000001FD3
-:103EE00000211624000000000000000014C00000A3
-:103EF000000000000000001D00203623000000002C
-:103F00000000000300281E2300000000000000083D
-:103F10000022222300000000FFFFF00000282228DA
-:103F20000000000000000000002920E80000000060
-:103F30000000001F002036280000000000000018CC
-:103F400000211E2300000000000000200020362772
-:103F50000000000000000002002216240000000003
-:103F600000000000003014A8000000000000001E47
-:103F700000203625000000000000000300211A2464
-:103F8000000000001000000000281A2600000000B9
-:103F9000EFFFFFFF00283A2E0000000000000000A5
-:103FA000004938CE000006780000000140280A20B1
-:103FB000000000000000000640280E200000000065
-:103FC00000000300C02812200000000000000008CC
-:103FD000002112240000000000000000C020162074
-:103FE0000000000000000000C0201A2000000000B7
-:103FF000000000000021022200000000000000007C
-:1040000014C000000000056381000000002044117E
-:104010000000000000000001002048110000000026
-:104020000000225800300A240000000000040000B4
-:10403000006946220000068A000021690020441120
-:104040000000000000000000002048050000000003
-:104050000002000000294A260000000000000000C5
-:104060000020481000000000CAFEBABE002048111F
-:104070000000000000000002002F022300000000EA
-:10408000000000000CC000000000056B00000000F4
-:10409000C0201C100000000000000000C040000014
-:1040A0000000057900000002002F0223000000003C
-:1040B000000000000CC000000000056B8100000043
-:1040C0000020441100000000000000010020481101
-:1040D000000000000000225800300A240000000008
-:1040E00000040000006946220000068A000000006B
-:1040F000C0201C100000000000000000C0400000B4
-:104100000000057900000000002F022300000000DD
-:10411000000000000CC000000000056F000000005F
-:10412000C0201C000000000000000000C040000093
-:104130000000057900000004002F022300000000A9
-:10414000000000000CC000000000057781000000A6
-:104150000020441100000000000000000020481171
-:10416000000000000000216D00204411000000004C
-:1041700000000000C0204800000000000000000017
-:10418000C06048000000068F0000000000401C10C6
-:104190000000057900000000C020000000000000C1
-:1041A00000000000C040000000000000000000000F
-:1041B0000EE000000000057B000000000060000031
-:1041C000000005C600000000002F022400000000CF
-:1041D000000000000CC000000000058C0000A2B729
-:1041E00000204411000000000000000000204807EB
-:1041F00000000000810000000020441100000000C9
-:104200000000000100204811000000000004A2B6D8
-:10421000006044110000068A0000001A00212230CC
-:104220000000000000000006002226300000000010
-:1042300000042004006044110000068A0000A2C4AB
-:10424000002044110000000000000000003048E998
-:10425000000000000000000000E000000000058AEF
-:104260000000A2D100204411000000000000000066
-:1042700000404808000000000000A2D100204411C6
-:10428000000000000000000100504A28000000006B
-:1042900000000001002F02240000000000000000C8
-:1042A0000CC000000000059D0000A2BB00204411CE
-:1042B000000000000000000000204807000000008F
-:1042C00081000000002044110000000000000001F7
-:1042D00000204811000000000004A2BA0060441150
-:1042E0000000068A0000001A0021223000000000B1
-:1042F0000000000600222630000000000004200418
-:10430000006044110000068A0000A2C5002044118C
-:104310000000000000000000003048E9000000003C
-:104320000000000000E000000000059B0000A2D299
-:104330000020441100000000000000000040480878
-:10434000000000000000A2D2002044110000000084
-:104350000000000100504A28000000000000000298
-:10436000002F022400000000000000000CC000002C
-:10437000000005AE0000A2BF0020441100000000B4
-:10438000000000000020480700000000810000003D
-:10439000002044110000000000000001002048112E
-:1043A000000000000004A2BE006044110000068A64
-:1043B0000000001A0021223000000000000000066A
-:1043C0000022263000000000000420040060441198
-:1043D0000000068A0000A2C6002044110000000070
-:1043E00000000000003048E900000000000000006C
-:1043F00000E00000000005AC0000A2D30020441142
-:10440000000000000000000000404808000000001C
-:104410000000A2D3002044110000000000000001B1
-:1044200000504A28000000000000A2C300204411F0
-:10443000000000000000000000204807000000000D
-:104440008100000000204411000000000000000175
-:1044500000204811000000000004A2C200604411C6
-:104460000000068A0000001A00212230000000002F
-:104470000000000600222630000000000004200496
-:10448000006044110000068A0000A2C70020441109
-:104490000000000000000000003048E900000000BB
-:1044A0000000000000E00000000005BB0000A2D4F6
-:1044B00000204411000000000000000000404808F7
-:1044C000000000000000A2D4002044110000000001
-:1044D0000000000100504A28000000008500000094
-:1044E00000204411000000000000000000204801EE
-:1044F000000000000000304A0020441100000000CD
-:104500000100000000204811000000000000000031
-:1045100000400000000005C1A4000000C0204411BC
-:104520000000000000000000C04048000000000043
-:1045300000000000C0600000000005C60000000090
-:10454000C0400400000000010000002C00203621C3
-:104550000000000081000000002044110000000065
-:1045600000000006002048110000000000000000CC
-:10457000002F023000000000000000000CC000000E
-:10458000000005CD00000000002004110000000024
-:104590000000003000403621000005E0000000303F
-:1045A0000020062D0000000000007E0000280621EB
-:1045B0000000000000000000002F022100000000A9
-:1045C000000000000CE00000000005E08100000099
-:1045D00000204411000000000000000100204811EC
-:1045E000000000000004A092006044110000068A50
-:1045F0000000003100203630000000000004A093CD
-:10460000006044110000068A0000003200203630AD
-:10461000000000000004A2B6006044110000068AF9
-:104620000000003300203630000000000004A2BA71
-:10463000006044110000068A00000034002036307B
-:10464000000000000004A2BE006044110000068AC1
-:104650000000003500203630000000000004A2C237
-:10466000006044110000068A000000360020363049
-:104670000000000000042004006044110000068ACD
-:104680000001A2A400204411000000000000003F2F
-:1046900000204811000000000000003F00204811E9
-:1046A000000000000000003F002048110000000052
-:1046B0000000003F0020481100000000000000053D
-:1046C00000204811000000000000A1F40020441167
-:1046D0000000000000000000002048110000000061
-:1046E00088000000002044110000000000000001CC
-:1046F000002048110000000081000000002044114B
-:10470000000000000000000600204811000000002A
-:1047100000000001002F0230000000000000000037
-:104720000CE0000000000629000000300020062DEB
-:104730000000000000000000002F02210000000027
-:10474000000000000CE000000000062981000000CD
-:10475000002044110000000000000001002048116A
-:104760000000000000007E0000280621000000007C
-:1047700000000000002F02210000000000000000E7
-:104780000CE00000000006020000A092002044118E
-:10479000000000000000003100204A2D0000000051
-:1047A0000000A0930020441100000000000000322F
-:1047B00000204A2D000000000000A2B60020441195
-:1047C000000000000000003300204A2D000000001F
-:1047D0000000A2BA002044110000000000000034D4
-:1047E00000204A2D000000000000A2BE002044115D
-:1047F000000000000000003500204A2D00000000ED
-:104800000000A2C200204411000000000000003699
-:1048100000204A2D00000000000000300020062D7E
-:1048200000000000000001FF002806210000000039
-:1048300000000000002F0221000000000000000026
-:104840000CE000000000062800000000002102210A
-:10485000000000000000000014C000000000060B73
-:104860000004A003006044110000068A0000A003B9
-:10487000002044110000000000000000002048104B
-:1048800000000000000000010021062100000000DF
-:104890000000000014C00000000006100004A0107A
-:1048A000006044110000068A0000A010002044119E
-:1048B0000000000000000000002048100000000080
-:1048C000000000010021062100000000000000009F
-:1048D000002F022100000000000000000CE000009A
-:1048E000000006280004A011006044110000068AA0
-:1048F0000000A01100204411000000000000000092
-:1049000000204810000000000004A01200604411C4
-:104910000000068A0000A0120020441100000000E0
-:104920000000000000204810000000000004A01358
-:10493000006044110000068A0000A013002044110A
-:1049400000000000000000000020481000000000EF
-:104950000004A014006044110000068A0000A014A6
-:10496000002044110000000000000000002048105A
-:10497000000000000004A015006044110000068A39
-:104980000000A015002044110000000000000000FD
-:1049900000204810000000000004A0160060441130
-:1049A0000000068A0000A01600204411000000004C
-:1049B0000000000000204810000000000004A017C4
-:1049C000006044110000068A0000A0170020441176
-:1049D000000000000000000000204810000000005F
-:1049E00000042004006044110000068A0000002C2E
-:1049F0000080062D00000000FF0000000020441190
-:104A0000000000000000000000204811000000002D
-:104A1000000000010020481100000000000000021A
-:104A20000080481100000000000000000EE00000BF
-:104A30000000063A000000300020062D00000000B3
-:104A40000000000200280621000000000000000015
-:104A5000002F022100000000000000000CE0000018
-:104A60000000063881000000002044110000000012
-:104A70000000000100204811000000000004200494
-:104A8000006044110000068A000010000020081198
-:104A9000000000000000002B002036220000000073
-:104AA00000000000006000000000063E0000000062
-:104AB00000600000000005C69800000000204411BE
-:104AC000000000000000000000804811000000000D
-:104AD00000000000C06000000000063E0000000072
-:104AE000C0400400000000010000A2A40020441106
-:104AF000000000000000002200204811000000001B
-:104B000089000000002044110000000000000001A6
-:104B1000004048110000062A9700000000204411C0
-:104B2000000000000000000000204811000000000C
-:104B30008A00000000204411000000000000000076
-:104B4000004048110000062A00000000006000003C
-:104B50000000065900002010002044110000000051
-:104B60000000800000204811000000000001A2A405
-:104B7000C020441100000000000000160060481131
-:104B80000000036E0000201000204411000000000F
-:104B9000000100000020481100000000810000001A
-:104BA0000020441100000000000000010020481116
-:104BB000000000000000217C0020441100000000E3
-:104BC000098000000020481100000000FFFFFFFFE7
-:104BD00000204811000000000000000000204811E3
-:104BE00000000000000000001700000000000000AE
-:104BF0000004217F006044110000068A0000001FAD
-:104C000000210230000000000000000014C000007D
-:104C1000000000000000000400404C11000006539A
-:104C2000000000000040000000000000000000172D
-:104C300000201E2D000000000000000400291E2797
-:104C40000000000000000017008036270000000070
-:104C50000000001700201E2D00000000FFFFFFFBDA
-:104C600000281E27000000000000001700803627E3
-:104C7000000000000000001700201E2D00000000B2
-:104C80000000000800291E27000000000000001797
-:104C900000803627000000000000001700201E2DB5
-:104CA00000000000FFFFFFF700281E2700000000A3
-:104CB00000000017008036270000000000002010D0
-:104CC0000020441100000000000080000020481176
-:104CD000000000000001A2A4002044110000000018
-:104CE00000000016006048110000036E0000201054
-:104CF00000204411000000000001000000204811C5
-:104D0000000000000000217C002044110000000091
-:104D1000018000000020481100000000FFFFFFFF9D
-:104D20000020481100000000000000000020481191
-:104D3000000000000000000017000000000000005C
-:104D4000810000000020441100000000000000016C
-:104D500000204811000000000004217F0060441181
-:104D60000000068A0000001F002102300000000041
-:104D70000000000014C000000000068900000010C0
-:104D800000404C110000066F00000000C02004002D
-:104D9000000000000000000038C00000000000001B
-:104DA0000000001D00200A2D000000000000001E71
-:104DB00000200E2D000000000000001F0020122D1A
-:104DC00000000000000000200020162D0000000060
-:104DD00000002169002044110000000000000000D4
-:104DE00000204804000000000000000000204805EA
-:104DF000000000000000000000204801000000004A
-:104E0000CAFEBABE002048110000000000000004E5
-:104E1000003012240000000000000000002F006499
-:104E200000000000000000000CC000000000068828
-:104E30000000000300281A22000000000000000803
-:104E40000022122200000000FFFFF00000281224C0
-:104E50000000000000000000002910C40000000055
-:104E60000000001F00403624000000000000000089
-:104E70000080000000000000000000001AC00000D8
-:104E80000000068A9F00000000204411000000007E
-:104E9000CAFEBABE00204811000000000000000059
-:104EA0001AE000000000068D0000000000800000F5
-:104EB00000000000000000001AC000000000068F83
-:104EC0009E0000000020441100000000CAFEBABE8F
-:104ED0000020481100000000000000001AE000005F
-:104EE00000000692000000000080000000000000AA
-:104EF00000000000006000000000000B0000100037
-:104F000000600411000003150000000000200411DF
-:104F1000000000000000000000600811000001B265
-:104F20000000225C0020441100000000000000038B
-:104F3000002048110000000000002256002044110B
-:104F4000000000000000001B0020481100000000CD
-:104F50000000A1FC0020441100000000000000013E
-:104F600000204811000000000001A1FDC0204411F4
-:104F7000000000000000002100201E2D00000000A5
-:104F80000000001000221E27000000000000002486
-:104F90000020222D000000000000FFFF0028222832
-:104FA0000000000000000000002949070000000088
-:104FB0000000000000204811000000000000002256
-:104FC0000020222D000000000000FFFF0028222802
-:104FD0000000000000000000002949070000000058
-:104FE0000000000000204811000000000000002325
-:104FF00000201E2D000000000000001000221E27CF
-:105000000000000000000000002949070000000027
-:1050100000000000004048110000000000000000F7
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000000000070
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B000014204FF05BD02500000000001C3016867
-:1052C000043F05BD00000000022502090250015103
-:1052D000000000000223024502A00241000000007D
-:1052E00003D705BD05BD05BD000000000646064705
-:1052F000031F05BD0000000005BD05C203200340DB
-:1053000000000000032A0282034203340000000070
-:1053100005BD05BD05BD05BD0000000005BD054E70
-:1053200005BD05BD0000000003BA05BD04B8034477
-:10533000000000000497044D043D05BD000000007E
-:1053400004CD05BD044104DA00000000044D05044D
-:10535000035103750000000005BD05BD05BD05BD79
-:105360000000000005BD05BD05BD05BD0000000035
-:1053700005BD05BD063C05C40000000005BD05BD1A
-:10538000000705BD0000000005BD05BD05BD05BD4C
-:105390000000000005BD05BD05BD05BD0000000005
-:1053A00003F803ED0408040600000000040E040ADC
-:1053B000040C041000000000041C04180424042041
-:1053C00000000000042C0428043404300000000015
-:1053D00005BD05BD043805BD0000000005BD05BDC7
-:1053E00005BD05BD0000000005BD05BD05BD05BD31
-:1053F000000000000002067606940006000000008F
-:00000001FF
diff --git a/firmware/radeon/RV630_pfp.bin.ihex b/firmware/radeon/RV630_pfp.bin.ihex
deleted file mode 100644
index f55292c97b79..000000000000
--- a/firmware/radeon/RV630_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001B8007C038B00D4401E00EE001E5F
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581A800C41C3A08
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFF000042C0400309002007D250049
-:1000700000351402007D350B00255403007CD5802B
-:1000800000259C030095C00400D5001B007EDDC147
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA180000D4401E00D5801EAD
-:100140000080005300D4007500D4401E00CA08008F
-:1001500000CA0C0000CA100000D4801900D4C018D6
-:1001600000D5001700D4801E00D4C01E00D5001E8C
-:1001700000E2001E00CA040000A00000007E828B86
-:1001800000CA080000D4806000D4401E0080000037
-:1001900000D4801E00CA080000D4806100D4401E34
-:1001A0000080000000D4801E00CA080000CA0C00B5
-:1001B00000D4401E00D4801600D4C01600D4801E87
-:1001C000008001B800D4C01E00C6084300CA0C005D
-:1001D00000CA10000094800400CA140000E420F358
-:1001E00000D4201300D5606500D4E01C00D5201C8D
-:1001F00000D5601C008000000006200100C60843F6
-:1002000000CA0C0000CA1000009483F700CA140052
-:1002100000E420F30080007900D4201300C60843D6
-:1002200000CA0C0000CA1000009883EF00CA140036
-:1002300000D400640080008D0000000000C414326F
-:1002400000C6184300C4082F0095400500C40C30B8
-:1002500000D4401E0080000000EE001E009583F5D3
-:1002600000C4103100D4403300D5206500D4A01C58
-:1002700000D4E01C00D5201C00E4015E00D4001E68
-:10028000008000000006200100CA1800000A2001BA
-:1002900000D6007600C408360098800700C61045D6
-:1002A0000095011000D4001F00D46062008000009F
-:1002B00000D4206200CC383500CC1433008401BB5C
-:1002C00000D4007200D5401E0080000000EE001E29
-:1002D00000E2001A008401BB00E2001A00CC104BBF
-:1002E00000CC0447002C9401007D098B0098400548
-:1002F000007D15CB00D4001A008001B800D4006D39
-:100300000034440100CC0C480098403A00CC2C4A00
-:100310000095800400CC0449008001B800D4001A84
-:1003200000D4C01A00282801008400F000CC10037B
-:100330000098801B0004380C008400F000CC1003EF
-:100340000098801700043808008400F000CC1003E7
-:100350000098801300043804008400F000CC1003DF
-:100360000098801400CC104C009A800900CC144DE9
-:10037000009840DC00D4006D00CC184800D5001A6D
-:1003800000D5401A008000C900D5801A0096C0D55B
-:1003900000D4006D008001B800D4006E009AC00344
-:1003A00000D4006D00D4006E0080000000EC007FDF
-:1003B000009AC0CC00D4006D008001B800D4006E5B
-:1003C00000CC140300CC180300CC1C03007D910367
-:1003D000007DD583007D190C0035CC1F0035701FC2
-:1003E000007CF0CB007CD08B00880000007E8E8BE0
-:1003F0000095C00400D4006E008001B800D4001A3B
-:1004000000D4C01A00CC080300CC0C0300CC1003AD
-:1004100000CC140300CC180300CC1C0300CC240334
-:1004200000CC28030035C41F0036B01F007C704B81
-:100430000034F01F007C704B0035701F007C704B47
-:10044000007D8881007DCCC1007E5101007E9541F8
-:10045000007C9082007CD4C2007C848B009AC00314
-:10046000007C8C8B002C88010098809E00D4006D4D
-:100470000098409C00D4006E00CC084C00CC0C4D81
-:1004800000CC104800D4801A00D4C01A00800101AA
-:1004900000D5001A00CC083200D40032009482D972
-:1004A00000CA0C0000D4401E0080000000D4001ED2
-:1004B00000E4011E00D4001E00CA080000CA0C009F
-:1004C00000CA100000D4401E00CA140000D4801ED0
-:1004D00000D4C01E00D5001E00D5401E00D54034FB
-:1004E0000080000000EE001E0028040400E2001A54
-:1004F00000E2001A00D4401A00CA380000CC0803F9
-:1005000000CC0C0300CC0C0300CC0C03009882BD83
-:1005100000000000008401BB00D7A06F0080000035
-:1005200000EE001F00CA040000C2FF0000CC083427
-:1005300000C13FFF007C74CB007CC90B007D010F24
-:10054000009902B0007C738B008401BB00D7A06FC0
-:100550000080000000EE001F00CA080000281900FB
-:10056000007D898B009580140028140400CA0C00BB
-:1005700000CA100000CA1C0000CA240000E2001FCC
-:1005800000D4C01A00D5001A00D5401A00CC1803B8
-:1005900000CC2C0300CC2C0300CC2C03007DA58BBD
-:1005A000007D9C4700984297000000000080016198
-:1005B00000D4C01A00D4401E00D4801E0080000069
-:1005C00000EE001E00E4011E00D4001E00D4401EF8
-:1005D00000EE001E00CA040000A00000007E828B16
-:1005E00000E4013E00D4001E00D4401E00EE001EB8
-:1005F00000CA040000A00000007E828B00CA080030
-:1006000000248C06000CCC060098C00600CC104ECE
-:100610000099000400D4007300E4011E00D4001E01
-:1006200000D4401E00D4801E0080000000EE001E9A
-:1006300000CA080000CA0C000034D01800251001C0
-:100640000095002100C17FFF00CA100000CA1400FD
-:1006500000CA180000D4801D00D4C01D007DB18BDD
-:1006600000C1420200C2C00100D5801D0034DC0E72
-:10067000007D5D4C007F734C00D7401E00D5001EEE
-:1006800000D5401E00C1420000C2C00000099C010C
-:100690000031DC10007F5F4C007F734C00042802A7
-:1006A000007D838000D5A86F00D5806600D7401EEE
-:1006B00000EC005E00C8240200C82402008001B8DB
-:1006C00000D6007600D4401E00D4801E00D4C01E88
-:1006D0000080000000EE001E0080000000EE001F01
-:1006E00000D4001F0080000000D4001F00D4001FB1
-:1006F0000088000000D4001F00000000000000007F
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:1008000000010171000201780003008F0004007FE5
-:10081000000500030006003F000700320008012C1D
-:1008200000090046000A0036001001B6001700A2B9
-:100830000022013A00230149002000B400240125D0
-:100840000027004D0028006A002A0060002B00529B
-:10085000002F0065003200870034017F003C015604
-:10086000003F00720041018C0044012E00550173CD
-:100870000056017A0060000B00610034006200380D
-:1008800000630038006400380065003800660038F6
-:10089000006700380068003A00690041006A0048BB
-:1008A000006B0048006C0048006D0048006E004876
-:1008B000006F00480000000600000006000000066F
-:1008C0000000000600000006000000060000000610
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV635_me.bin.ihex b/firmware/radeon/RV635_me.bin.ihex
deleted file mode 100644
index ba3a7e632d97..000000000000
--- a/firmware/radeon/RV635_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A000006044110000068A0000000000600000AB
-:1000B0000000062E00000000006000000000064264
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:1006600000000000006000000000066500000000BF
-:1006700000600000000006590000000200210E2268
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE00000000000006000000000065F0000000041
-:100AF00000400000000000EB00000000006000006B
-:100B000000000662000000070020222D0000000007
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E90000000068A0000001F002102300000000050
-:100EA0000000000014C000000000068900000004DB
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000068A000000110021023000000000FE
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000068900000000002B140500000000B5
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A000000000010000000000600000000006428E
-:1019B000000000000040040F0000021300000000BF
-:1019C000006000000000062E000000000060000023
-:1019D0000000064200000210006004110000031520
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B1000006000000000062E0000A00C0020441110
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E300000042004006044110000068A0000000035
-:101E4000006000000000062E00000000C0600000DE
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000006650000000000600000000002B53C
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:102240000000065C0000000000400000000002DE0C
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A00000000970000000020441125
-:102600000000000000000000002048110000000051
-:102610008A000000002044110000000000000000BB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D0000001A1FD002044110000000000000000E6
-:1026E000D90048000000000000000000C0200400E5
-:1026F000000000000000000000A0000A0000000030
-:1027000000002257002044110000000000000003D8
-:10271000C0484A20000000000000225D0020441153
-:102720000000000000000000C04048000000000061
-:1027300000000000006000000000064200000000F1
-:10274000C0200800000000000000225C00204411AE
-:10275000000000000000000300384A2200000000D2
-:102760000000A1FC00204411000000000000000057
-:10277000C0204800000000000001A1FD002044111D
-:102780000000000000000000002F022200000000F6
-:10279000000000000CE0000000000000000000004D
-:1027A00040204800000000000000000140304A20A6
-:1027B0000000000000000002C0304A2000000000BD
-:1027C0000000000100530A220000034B0000003FFC
-:1027D000C0280A20000000008100000000204411F1
-:1027E000000000000000000100204811000000006F
-:1027F000000021F800204411000000000000001833
-:102800000020481100000000000421F9006044117C
-:102810000000068A000000110021023000000000C4
-:102820000000000014E00000000003540000001449
-:10283000002F022200000000000000000CC0000079
-:10284000000003640000201000204411000000007C
-:102850000000800000204811000000000001A2A438
-:102860000020441100000000000000000060480249
-:102870000000036E00002100002044110000000051
-:1028800000000000C0204800000000000000000020
-:10289000C02048000000000000000000C0204800E8
-:1028A0000000000000000000C040480000000000E0
-:1028B00000000004002F02220000000000000000C1
-:1028C0000CC000000000036A00002010002044112A
-:1028D00000000000000080000020481100000000FF
-:1028E0000001A2A40020441100000000000000002C
-:1028F000004048020000035F00000028002F022271
-:1029000000000000000000000CC00000000005BD39
-:102910000001A2A4002044110000000000000000FB
-:10292000004048020000035F0000002C0020362613
-:102930000000000000000049002018110000000005
-:102940000000003F002048110000000000000001CE
-:1029500000331A260000000000000000002F0226AD
-:1029600000000000000000000CC000000000037028
-:102970000000002C00801A2D000000000000003F25
-:10298000C0280A200000000000000015002F0222CD
-:1029900000000000000000000CE0000000000386C2
-:1029A00000000006002F02220000000000000000CE
-:1029B0000CE00000000003B100000016002F02220E
-:1029C00000000000000000000CE00000000003B563
-:1029D00000000020002F0222000000000000000084
-:1029E0000CE000000000039C0000000F002F0222FA
-:1029F00000000000000000000CE00000000003A840
-:102A000000000010002F0222000000000000000063
-:102A10000CE00000000003A80000001E002F0222AE
-:102A200000000000000000000CE000000000039027
-:102A30000000A2A4002044110000000000000000DB
-:102A400000404802000000000800000000290A229F
-:102A5000000000000000000340210E2000000000E4
-:102A60000000000CC021122000000000000800003F
-:102A7000002812240000000000000014C0221620CC
-:102A80000000000000000000002914A40000000065
-:102A90000000A2A40020441100000000000000007B
-:102AA000002948A2000000000000A1FE00204411FF
-:102AB000000000000000000000404803000000008B
-:102AC000810000000020441100000000000000010F
-:102AD0000020481100000000000021F800204411EF
-:102AE0000000000000000016002048110000000057
-:102AF000000421F9006044110000068A000000155E
-:102B000000210230000000000000000014E000007E
-:102B1000000003920000210E00204411000000007C
-:102B200000000000C020480000000000000000007D
-:102B3000C0204800000000000000A2A400204411B2
-:102B400000000000000000000040480200000000FB
-:102B5000810000000020441100000000000000017E
-:102B60000020481100000000000021F8002044115E
-:102B700000000000000000170020481100000000C5
-:102B8000000421F9006044110000068A00000003DF
-:102B900000210230000000000000000014E00000EE
-:102BA0000000039E000021080020441100000000E6
-:102BB00000000000C02048000000000000000000ED
-:102BC000C0204800000000000000A2A40020441122
-:102BD000000000000000000000404802000000006B
-:102BE0000000A2A40020441100000000000000002A
-:102BF0000020480200000000800000000020441176
-:102C0000000000000000000000204811000000004B
-:102C100081000000002044110000000000000010AE
-:102C200000204811000000000000000000200010FB
-:102C3000000000000000000014C00000000003AE0F
-:102C40000000000000400000000000000000201014
-:102C50000020441100000000000080000020481106
-:102C6000000000000001A2A40020441100000000A8
-:102C70000000000600404811000000000000201085
-:102C800000204411000000000000800000204811D6
-:102C9000000000000001A2A4002044110000000078
-:102CA00000000016006048110000036E00000000E4
-:102CB000004000000000000000000000C0200800EC
-:102CC0000000000000000000C0200C000000000018
-:102CD0000000001D00210223000000000000000091
-:102CE00014E00000000003CE810000000020441129
-:102CF000000000000000000100204811000000005A
-:102D0000000021F80020441100000000000000181D
-:102D10000020481100000000000421F90060441167
-:102D20000000068A000000110021023000000000AF
-:102D30000000000014E00000000003C000002100BB
-:102D400000204411000000000000000000204802A4
-:102D50000000000000000000002048030000000008
-:102D6000BABECAFE0020481100000000CAFEBABE6A
-:102D70000020481100000000000020100020441135
-:102D8000000000000000800000204811000000004A
-:102D90000000A2A400204411000000000000000474
-:102DA0000040481100000000000021700020441184
-:102DB00000000000000000000020480200000000A9
-:102DC0000000000000204803000000008100000017
-:102DD00000204411000000000000000A00204811FB
-:102DE00000000000000000000020001000000000B3
-:102DF0000000000014C00000000003D38C0000009D
-:102E00000020441100000000CAFEBABE0040481174
-:102E100000000000810000000020441100000000BC
-:102E200000000001002048110000000000003FFFEA
-:102E300040280A20000000008000000040280E20EA
-:102E40000000000040000000C02812200000000028
-:102E500000040000006946220000068A000000000D
-:102E6000002014100000000000000000002F0223CA
-:102E700000000000000000000CC00000000003E1A2
-:102E800000000000C0401800000003E400003FFF05
-:102E9000C0281A2000000000000400000069462637
-:102EA0000000068A0000000000201810000000004A
-:102EB00000000000002F02240000000000000000BD
-:102EC0000CC00000000003E700000000C0401C0030
-:102ED000000003EA00003FFFC0281E2000000000A1
-:102EE00000040000006946270000068A0000000078
-:102EF00000201C1000000000000000000020440220
-:102F00000000000000000000002820C500000000B4
-:102F100000000000004948E800000000A580000013
-:102F200000200811000000000000200000200C110B
-:102F30000000000083000000006044110000041243
-:102F4000000000000020440200000000000000001B
-:102F5000C0204800000000000000000040204800A1
-:102F6000000000000000001FC0210220000000003F
-:102F70000000000014C00000000003F70000201053
-:102F800000204411000000000000800000204811D3
-:102F9000000000000000FFFFC0481220000003FFF7
-:102FA000A780000000200811000000000000A00021
-:102FB00000200C110000000083000000006044119C
-:102FC0000000041200000000002044020000000085
-:102FD00000000000C02048000000000000000000C9
-:102FE000C0204800000000000000FFFFC0281220A1
-:102FF00000000000830000000020441100000000D9
-:103000000000000000304883000000008400000041
-:10301000002044110000000000000000C020480013
-:1030200000000000000000001D0000000000000083
-:103030008300000000604411000004120000000042
-:10304000C040040000000001A98000000020081119
-:10305000000000000000C00000400C11000003FA56
-:10306000AB80000000200811000000000000F8E024
-:1030700000400C11000003FAAD8000000020081190
-:10308000000000000000F88000400C11000003FA6E
-:10309000B380000000200811000000000000F3FCD5
-:1030A00000400C11000003FAAF800000002008115E
-:1030B000000000000000E00000400C11000003FAD6
-:1030C000B180000000200811000000000000F000A6
-:1030D00000400C11000003FA83000000002044119E
-:1030E00000000000000021480020481100000000FE
-:1030F00084000000002044110000000000000000D7
-:10310000C020480000000000000000001D0000007A
-:10311000000000000000000000800000000000002F
-:1031200001182000C0304620000000000000000010
-:10313000D90048000000000000000000C02004008A
-:10314000000000000000000000A0000A00000000D5
-:103150000218A000C030462000000000000000005F
-:10316000D90048000000000000000000C02004005A
-:10317000000000000000000000A0000A00000000A5
-:103180000318C000C030462000000000000000000E
-:10319000D90048000000000000000000C02004002A
-:1031A000000000000000000000A0000A0000000075
-:1031B0000418F8E0C03046200000000000000000C5
-:1031C000D90048000000000000000000C0200400FA
-:1031D000000000000000000000A0000A0000000045
-:1031E0000518F880C03046200000000000000000F4
-:1031F000D90048000000000000000000C0200400CA
-:10320000000000000000000000A0000A0000000014
-:103210000618E000C030462000000000000000005A
-:10322000D90048000000000000000000C020040099
-:10323000000000000000000000A0000A00000000E4
-:103240000718F000C0304620000000000000000019
-:10325000D90048000000000000000000C020040069
-:10326000000000000000000000A0000A00000000B4
-:103270000818F3FCC03046200000000000000000E9
-:10328000D90048000000000000000000C020040039
-:10329000000000000000000000A0000A0000000084
-:1032A0000000003000200A2D000000000000000097
-:1032B000C0290C4000000000000000300020362330
-:1032C0000000000000000000C0200400000000001A
-:1032D0000000000000A0000A0000000086000000BE
-:1032E00000204411000000000000000000404801E0
-:1032F0000000000085000000C02044110000000014
-:103300000000000000404801000000000000217C97
-:10331000002044110000000000000000C020480010
-:103320000000000000000000C02048000000000075
-:1033300000000000C02048000000000081000000E4
-:10334000002044110000000000000001002048118E
-:103350000000000000000000C02008000000000085
-:103360000000000017000000000000000004217FA2
-:10337000006044110000068A0000001F0021023096
-:10338000000000000000000014C000000000000069
-:103390000000000000404C02000004480000000053
-:1033A000C0200C000000000000000000C020100041
-:1033B0000000000000000000C02014000000000019
-:1033C00000000000C0201800000000000000000005
-:1033D000C0201C000000000000007F0000280A211F
-:1033E0000000000000004500002F02220000000045
-:1033F000000000000CE00000000004560000000087
-:10340000C0202000000000000000000017000000A5
-:10341000000000000000001000280A230000000047
-:1034200000000010002F0222000000000000000039
-:103430000CE000000000045E810000000020441148
-:103440000000000000000001002048110000000002
-:1034500000040000006946240000068A0000000005
-:1034600000400000000004638100000000204411BF
-:1034700000000000000000000020481100000000D3
-:103480000000216D00204411000000000000000039
-:103490000020480400000000000000000060480513
-:1034A0000000068F00000000002824F0000000004B
-:1034B0000000000700280A230000000000000001AF
-:1034C000002F022200000000000000000AE00000BF
-:1034D0000000046A00000000002F00C90000000086
-:1034E0000000000004E00000000004830000000071
-:1034F000004000000000049000000002002F0222A3
-:1035000000000000000000000AE000000000046F5E
-:1035100000000000002F00C90000000000000000B3
-:1035200002E00000000004830000000000400000F2
-:103530000000049000000003002F022200000000A1
-:10354000000000000AE00000000004740000000019
-:10355000002F00C900000000000000000CE0000087
-:103560000000048300000000004000000000049000
-:1035700000000004002F02220000000000000000F4
-:103580000AE000000000047900000000002F00C9DC
-:1035900000000000000000000AE0000000000483BA
-:1035A0000000000000400000000004900000000542
-:1035B000002F022200000000000000000AE00000CE
-:1035C0000000047E00000000002F00C90000000081
-:1035D0000000000006E0000000000483000000007E
-:1035E000004000000000049000000006002F0222AE
-:1035F00000000000000000000AE00000000004835A
-:1036000000000000002F00C90000000000000000C2
-:1036100008E00000000004830000000000400000FB
-:103620000000049000007F0000280A210000000034
-:1036300000004500002F02220000000000000000F2
-:103640000AE00000000000000000000800210A233A
-:10365000000000000000000014C000000000048D05
-:10366000000021690020441100000000000000005B
-:10367000C02048000000000000000000C0204800FA
-:103680000000000000000000C02048000000000012
-:10369000CAFEBABE00404811000000000000000051
-:1036A000C02044000000000000000000C020000016
-:1036B0000000000000000000C040480000000000C2
-:1036C00000007F0000280A210000000000004500E3
-:1036D000002F022200000000000000000AE00000AD
-:1036E0000000049600000000C02000000000000060
-:1036F00000000000C02000000000000000000000EA
-:10370000C0400000000000000000000000404C0825
-:103710000000045600000000C02008000000000067
-:103720000000001040210E200000000000000011E9
-:10373000402112200000000000000012402116204D
-:10374000000000000000216900204411000000007A
-:1037500000000000002048020000000000000000FF
-:1037600000210225000000000000000014E000001D
-:10377000000004A000040000C0494A20000004A189
-:10378000FFFBFFFFC0284A200000000000000000EF
-:1037900000210223000000000000000014E00000EF
-:1037A000000004AD00000000C02048000000000040
-:1037B00000000000C02048000000000000000000E1
-:1037C00000210224000000000000000014C00000DE
-:1037D00000000000810000000020441100000000F3
-:1037E0000000000C00204811000000000000000054
-:1037F00000200010000000000000000014C00000C5
-:10380000000004A9A00000000020441100000000F6
-:10381000CAFEBABE0040481100000000810000004E
-:1038200000204411000000000000000400204811A6
-:10383000000000000000216B002044110000000087
-:1038400000000000C02048100000000081000000BF
-:103850000020441100000000000000050020481175
-:10386000000000000000216C002044110000000056
-:1038700000000000C0204810000000000000000010
-:10388000002F022400000000000000000CE00000F7
-:10389000000000000000000000400000000004A73D
-:1038A00000000000C0210A2000000000000000000D
-:1038B00014C00000000004C081000000002044117A
-:1038C000000000000000000000204811000000007F
-:1038D0000000216D002044110000000000000000E5
-:1038E000C02048000000000000000000C060480048
-:1038F0000000068F0000000000400000000004C42B
-:1039000081000000002044110000000000000001C0
-:10391000002048110000000000040000C0294620DB
-:103920000000000000000000C06000000000068AE7
-:103930000000000100210222000000000000000041
-:1039400014C00000000004CB0000216900204411D5
-:103950000000000000000000C0204800000000003F
-:1039600000000000C020480000000000000000002F
-:103970000020481000000000CAFEBABE00404811F6
-:103980000000000000000000C02044000000000013
-:1039900000000000C040481000000000810000004E
-:1039A0000020441100000000000000010020481128
-:1039B00000000000000021F8002044110000000079
-:1039C0000000000E0020481100000000000421F952
-:1039D000006044110000068A00000000002102304F
-:1039E000000000000000000014C00000000004CD32
-:1039F00000002180002044110000000000000000B1
-:103A0000C02048000000000000000000C0200000AE
-:103A10000000000000000000C0204800000000007E
-:103A200000000000C02000000000000000000000B6
-:103A3000C0404800000000000000000300333E2F9B
-:103A40000000000000000001002102210000000031
-:103A50000000000014E00000000004FD0000002C45
-:103A600000200A2D000000000004000018E00C11E6
-:103A7000000004EC0000000100333E2F00000000B5
-:103A80000000216900204411000000000000000037
-:103A90000020480200000000000000000020480351
-:103AA000000000000000000800300A2200000000B2
-:103AB00000000000C02048000000000000000000DE
-:103AC000C0204800000000000000216900204411CF
-:103AD000000000000000000000204802000000007C
-:103AE0000000000000204803000000000000000863
-:103AF00000300A220000000000000000C020480042
-:103B00000000000000000000D8C04800000004E0F1
-:103B100000002169002044110000000000000000A6
-:103B200000204802000000000000000000204803C0
-:103B3000000000000000000800300A220000000021
-:103B400000000000C020480000000000000000004D
-:103B5000C0204800000000000000002D0020122DB1
-:103B6000000000000000000000290C83000000009D
-:103B70000000216900204411000000000000000046
-:103B80000020480200000000000000000020480360
-:103B9000000000000000000800300A2200000000C1
-:103BA00000000000C02048000000000000000000ED
-:103BB000C020480000000000000000110021022485
-:103BC000000000000000000014C000000000000021
-:103BD0000000000000400000000004A70000002CCE
-:103BE000C0203620000000000000002DC04036201C
-:103BF000000000000000000F002102210000000072
-:103C00000000000014C000000000050200000000D9
-:103C1000006000000000000B00000000D900000060
-:103C20000000000000000000C0400400000000018F
-:103C3000B50000000020441100000000000020003A
-:103C40000020481100000000B600000000204411D0
-:103C5000000000000000A00000204811000000004B
-:103C6000B700000000204411000000000000C00068
-:103C70000020481100000000B8000000002044119E
-:103C8000000000000000F8E00020481100000000E3
-:103C9000B900000000204411000000000000F8807E
-:103CA0000020481100000000BA000000002044116C
-:103CB000000000000000E0000020481100000000AB
-:103CC000BB00000000204411000000000000F000D4
-:103CD0000020481100000000BC000000002044113A
-:103CE000000000000000F3FC00204811000000006C
-:103CF00081000000002044110000000000000002CC
-:103D00000020481100000000000000FF00280E30D5
-:103D10000000000000000000002F0223000000004F
-:103D2000000000000CC000000000051600000000AC
-:103D3000C0200800000000000000000014C00000C7
-:103D40000000052B0000000000200C110000000006
-:103D50000000001C00203623000000000000002BA3
-:103D60000020362300000000000000290020362338
-:103D700000000000000000280020362300000000A2
-:103D8000000000170020362300000000000000257E
-:103D9000002036230000000000000026002036230B
-:103DA0000000000000000015002036230000000085
-:103DB000000000160020362300000000FFFFE00096
-:103DC00000200C110000000000000021002036231C
-:103DD0000000000000000022002036230000000048
-:103DE00000001FFF00200C11000000000000002355
-:103DF00000203623000000000000002400203623AD
-:103E000000000000F1FFFFFF00283A2E0000000034
-:103E10000000001AC0220E20000000000000000078
-:103E20000029386E000000008100000000204411CD
-:103E30000000000000000006002048110000000003
-:103E40000000002A4020362000000000870000000B
-:103E5000002044110000000000000000C0204800C5
-:103E6000000000000000A1F4002044110000000048
-:103E700000000000002048100000000000000000CA
-:103E800000200C110000000000000030002036234C
-:103E9000000000009D000000002044110000000010
-:103EA0000000001F40214A20000000009600000092
-:103EB000002044110000000000000000C020480065
-:103EC0000000000000000000C0200C000000000006
-:103ED00000000000C0201000000000000000001FD3
-:103EE00000211624000000000000000014C00000A3
-:103EF000000000000000001D00203623000000002C
-:103F00000000000300281E2300000000000000083D
-:103F10000022222300000000FFFFF00000282228DA
-:103F20000000000000000000002920E80000000060
-:103F30000000001F002036280000000000000018CC
-:103F400000211E2300000000000000200020362772
-:103F50000000000000000002002216240000000003
-:103F600000000000003014A8000000000000001E47
-:103F700000203625000000000000000300211A2464
-:103F8000000000001000000000281A2600000000B9
-:103F9000EFFFFFFF00283A2E0000000000000000A5
-:103FA000004938CE000006780000000140280A20B1
-:103FB000000000000000000640280E200000000065
-:103FC00000000300C02812200000000000000008CC
-:103FD000002112240000000000000000C020162074
-:103FE0000000000000000000C0201A2000000000B7
-:103FF000000000000021022200000000000000007C
-:1040000014C000000000056381000000002044117E
-:104010000000000000000001002048110000000026
-:104020000000225800300A240000000000040000B4
-:10403000006946220000068A000021690020441120
-:104040000000000000000000002048050000000003
-:104050000002000000294A260000000000000000C5
-:104060000020481000000000CAFEBABE002048111F
-:104070000000000000000002002F022300000000EA
-:10408000000000000CC000000000056B00000000F4
-:10409000C0201C100000000000000000C040000014
-:1040A0000000057900000002002F0223000000003C
-:1040B000000000000CC000000000056B8100000043
-:1040C0000020441100000000000000010020481101
-:1040D000000000000000225800300A240000000008
-:1040E00000040000006946220000068A000000006B
-:1040F000C0201C100000000000000000C0400000B4
-:104100000000057900000000002F022300000000DD
-:10411000000000000CC000000000056F000000005F
-:10412000C0201C000000000000000000C040000093
-:104130000000057900000004002F022300000000A9
-:10414000000000000CC000000000057781000000A6
-:104150000020441100000000000000000020481171
-:10416000000000000000216D00204411000000004C
-:1041700000000000C0204800000000000000000017
-:10418000C06048000000068F0000000000401C10C6
-:104190000000057900000000C020000000000000C1
-:1041A00000000000C040000000000000000000000F
-:1041B0000EE000000000057B000000000060000031
-:1041C000000005C600000000002F022400000000CF
-:1041D000000000000CC000000000058C0000A2B729
-:1041E00000204411000000000000000000204807EB
-:1041F00000000000810000000020441100000000C9
-:104200000000000100204811000000000004A2B6D8
-:10421000006044110000068A0000001A00212230CC
-:104220000000000000000006002226300000000010
-:1042300000042004006044110000068A0000A2C4AB
-:10424000002044110000000000000000003048E998
-:10425000000000000000000000E000000000058AEF
-:104260000000A2D100204411000000000000000066
-:1042700000404808000000000000A2D100204411C6
-:10428000000000000000000100504A28000000006B
-:1042900000000001002F02240000000000000000C8
-:1042A0000CC000000000059D0000A2BB00204411CE
-:1042B000000000000000000000204807000000008F
-:1042C00081000000002044110000000000000001F7
-:1042D00000204811000000000004A2BA0060441150
-:1042E0000000068A0000001A0021223000000000B1
-:1042F0000000000600222630000000000004200418
-:10430000006044110000068A0000A2C5002044118C
-:104310000000000000000000003048E9000000003C
-:104320000000000000E000000000059B0000A2D299
-:104330000020441100000000000000000040480878
-:10434000000000000000A2D2002044110000000084
-:104350000000000100504A28000000000000000298
-:10436000002F022400000000000000000CC000002C
-:10437000000005AE0000A2BF0020441100000000B4
-:10438000000000000020480700000000810000003D
-:10439000002044110000000000000001002048112E
-:1043A000000000000004A2BE006044110000068A64
-:1043B0000000001A0021223000000000000000066A
-:1043C0000022263000000000000420040060441198
-:1043D0000000068A0000A2C6002044110000000070
-:1043E00000000000003048E900000000000000006C
-:1043F00000E00000000005AC0000A2D30020441142
-:10440000000000000000000000404808000000001C
-:104410000000A2D3002044110000000000000001B1
-:1044200000504A28000000000000A2C300204411F0
-:10443000000000000000000000204807000000000D
-:104440008100000000204411000000000000000175
-:1044500000204811000000000004A2C200604411C6
-:104460000000068A0000001A00212230000000002F
-:104470000000000600222630000000000004200496
-:10448000006044110000068A0000A2C70020441109
-:104490000000000000000000003048E900000000BB
-:1044A0000000000000E00000000005BB0000A2D4F6
-:1044B00000204411000000000000000000404808F7
-:1044C000000000000000A2D4002044110000000001
-:1044D0000000000100504A28000000008500000094
-:1044E00000204411000000000000000000204801EE
-:1044F000000000000000304A0020441100000000CD
-:104500000100000000204811000000000000000031
-:1045100000400000000005C1A4000000C0204411BC
-:104520000000000000000000C04048000000000043
-:1045300000000000C0600000000005C60000000090
-:10454000C0400400000000010000002C00203621C3
-:104550000000000081000000002044110000000065
-:1045600000000006002048110000000000000000CC
-:10457000002F023000000000000000000CC000000E
-:10458000000005CD00000000002004110000000024
-:104590000000003000403621000005E0000000303F
-:1045A0000020062D0000000000007E0000280621EB
-:1045B0000000000000000000002F022100000000A9
-:1045C000000000000CE00000000005E08100000099
-:1045D00000204411000000000000000100204811EC
-:1045E000000000000004A092006044110000068A50
-:1045F0000000003100203630000000000004A093CD
-:10460000006044110000068A0000003200203630AD
-:10461000000000000004A2B6006044110000068AF9
-:104620000000003300203630000000000004A2BA71
-:10463000006044110000068A00000034002036307B
-:10464000000000000004A2BE006044110000068AC1
-:104650000000003500203630000000000004A2C237
-:10466000006044110000068A000000360020363049
-:104670000000000000042004006044110000068ACD
-:104680000001A2A400204411000000000000003F2F
-:1046900000204811000000000000003F00204811E9
-:1046A000000000000000003F002048110000000052
-:1046B0000000003F0020481100000000000000053D
-:1046C00000204811000000000000A1F40020441167
-:1046D0000000000000000000002048110000000061
-:1046E00088000000002044110000000000000001CC
-:1046F000002048110000000081000000002044114B
-:10470000000000000000000600204811000000002A
-:1047100000000001002F0230000000000000000037
-:104720000CE0000000000629000000300020062DEB
-:104730000000000000000000002F02210000000027
-:10474000000000000CE000000000062981000000CD
-:10475000002044110000000000000001002048116A
-:104760000000000000007E0000280621000000007C
-:1047700000000000002F02210000000000000000E7
-:104780000CE00000000006020000A092002044118E
-:10479000000000000000003100204A2D0000000051
-:1047A0000000A0930020441100000000000000322F
-:1047B00000204A2D000000000000A2B60020441195
-:1047C000000000000000003300204A2D000000001F
-:1047D0000000A2BA002044110000000000000034D4
-:1047E00000204A2D000000000000A2BE002044115D
-:1047F000000000000000003500204A2D00000000ED
-:104800000000A2C200204411000000000000003699
-:1048100000204A2D00000000000000300020062D7E
-:1048200000000000000001FF002806210000000039
-:1048300000000000002F0221000000000000000026
-:104840000CE000000000062800000000002102210A
-:10485000000000000000000014C000000000060B73
-:104860000004A003006044110000068A0000A003B9
-:10487000002044110000000000000000002048104B
-:1048800000000000000000010021062100000000DF
-:104890000000000014C00000000006100004A0107A
-:1048A000006044110000068A0000A010002044119E
-:1048B0000000000000000000002048100000000080
-:1048C000000000010021062100000000000000009F
-:1048D000002F022100000000000000000CE000009A
-:1048E000000006280004A011006044110000068AA0
-:1048F0000000A01100204411000000000000000092
-:1049000000204810000000000004A01200604411C4
-:104910000000068A0000A0120020441100000000E0
-:104920000000000000204810000000000004A01358
-:10493000006044110000068A0000A013002044110A
-:1049400000000000000000000020481000000000EF
-:104950000004A014006044110000068A0000A014A6
-:10496000002044110000000000000000002048105A
-:10497000000000000004A015006044110000068A39
-:104980000000A015002044110000000000000000FD
-:1049900000204810000000000004A0160060441130
-:1049A0000000068A0000A01600204411000000004C
-:1049B0000000000000204810000000000004A017C4
-:1049C000006044110000068A0000A0170020441176
-:1049D000000000000000000000204810000000005F
-:1049E00000042004006044110000068A0000002C2E
-:1049F0000080062D00000000FF0000000020441190
-:104A0000000000000000000000204811000000002D
-:104A1000000000010020481100000000000000021A
-:104A20000080481100000000000000000EE00000BF
-:104A30000000063A000000300020062D00000000B3
-:104A40000000000200280621000000000000000015
-:104A5000002F022100000000000000000CE0000018
-:104A60000000063881000000002044110000000012
-:104A70000000000100204811000000000004200494
-:104A8000006044110000068A000010000020081198
-:104A9000000000000000002B002036220000000073
-:104AA00000000000006000000000063E0000000062
-:104AB00000600000000005C69800000000204411BE
-:104AC000000000000000000000804811000000000D
-:104AD00000000000C06000000000063E0000000072
-:104AE000C0400400000000010000A2A40020441106
-:104AF000000000000000002200204811000000001B
-:104B000089000000002044110000000000000001A6
-:104B1000004048110000062A9700000000204411C0
-:104B2000000000000000000000204811000000000C
-:104B30008A00000000204411000000000000000076
-:104B4000004048110000062A00000000006000003C
-:104B50000000065900002010002044110000000051
-:104B60000000800000204811000000000001A2A405
-:104B7000C020441100000000000000160060481131
-:104B80000000036E0000201000204411000000000F
-:104B9000000100000020481100000000810000001A
-:104BA0000020441100000000000000010020481116
-:104BB000000000000000217C0020441100000000E3
-:104BC000098000000020481100000000FFFFFFFFE7
-:104BD00000204811000000000000000000204811E3
-:104BE00000000000000000001700000000000000AE
-:104BF0000004217F006044110000068A0000001FAD
-:104C000000210230000000000000000014C000007D
-:104C1000000000000000000400404C11000006539A
-:104C2000000000000040000000000000000000172D
-:104C300000201E2D000000000000000400291E2797
-:104C40000000000000000017008036270000000070
-:104C50000000001700201E2D00000000FFFFFFFBDA
-:104C600000281E27000000000000001700803627E3
-:104C7000000000000000001700201E2D00000000B2
-:104C80000000000800291E27000000000000001797
-:104C900000803627000000000000001700201E2DB5
-:104CA00000000000FFFFFFF700281E2700000000A3
-:104CB00000000017008036270000000000002010D0
-:104CC0000020441100000000000080000020481176
-:104CD000000000000001A2A4002044110000000018
-:104CE00000000016006048110000036E0000201054
-:104CF00000204411000000000001000000204811C5
-:104D0000000000000000217C002044110000000091
-:104D1000018000000020481100000000FFFFFFFF9D
-:104D20000020481100000000000000000020481191
-:104D3000000000000000000017000000000000005C
-:104D4000810000000020441100000000000000016C
-:104D500000204811000000000004217F0060441181
-:104D60000000068A0000001F002102300000000041
-:104D70000000000014C000000000068900000010C0
-:104D800000404C110000066F00000000C02004002D
-:104D9000000000000000000038C00000000000001B
-:104DA0000000001D00200A2D000000000000001E71
-:104DB00000200E2D000000000000001F0020122D1A
-:104DC00000000000000000200020162D0000000060
-:104DD00000002169002044110000000000000000D4
-:104DE00000204804000000000000000000204805EA
-:104DF000000000000000000000204801000000004A
-:104E0000CAFEBABE002048110000000000000004E5
-:104E1000003012240000000000000000002F006499
-:104E200000000000000000000CC000000000068828
-:104E30000000000300281A22000000000000000803
-:104E40000022122200000000FFFFF00000281224C0
-:104E50000000000000000000002910C40000000055
-:104E60000000001F00403624000000000000000089
-:104E70000080000000000000000000001AC00000D8
-:104E80000000068A9F00000000204411000000007E
-:104E9000CAFEBABE00204811000000000000000059
-:104EA0001AE000000000068D0000000000800000F5
-:104EB00000000000000000001AC000000000068F83
-:104EC0009E0000000020441100000000CAFEBABE8F
-:104ED0000020481100000000000000001AE000005F
-:104EE00000000692000000000080000000000000AA
-:104EF00000000000006000000000000B0000100037
-:104F000000600411000003150000000000200411DF
-:104F1000000000000000000000600811000001B265
-:104F20000000225C0020441100000000000000038B
-:104F3000002048110000000000002256002044110B
-:104F4000000000000000001B0020481100000000CD
-:104F50000000A1FC0020441100000000000000013E
-:104F600000204811000000000001A1FDC0204411F4
-:104F7000000000000000002100201E2D00000000A5
-:104F80000000001000221E27000000000000002486
-:104F90000020222D000000000000FFFF0028222832
-:104FA0000000000000000000002949070000000088
-:104FB0000000000000204811000000000000002256
-:104FC0000020222D000000000000FFFF0028222802
-:104FD0000000000000000000002949070000000058
-:104FE0000000000000204811000000000000002325
-:104FF00000201E2D000000000000001000221E27CF
-:105000000000000000000000002949070000000027
-:1050100000000000004048110000000000000000F7
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000000000070
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B000014204FF05BD02500000000001C3016867
-:1052C000043F05BD00000000022502090250015103
-:1052D000000000000223024502A00241000000007D
-:1052E00003D705BD05BD05BD000000000646064705
-:1052F000031F05BD0000000005BD05C203200340DB
-:1053000000000000032A0282034203340000000070
-:1053100005BD05BD05BD05BD0000000005BD054E70
-:1053200005BD05BD0000000003BA05BD04B8034477
-:10533000000000000497044D043D05BD000000007E
-:1053400004CD05BD044104DA00000000044D05044D
-:10535000035103750000000005BD05BD05BD05BD79
-:105360000000000005BD05BD05BD05BD0000000035
-:1053700005BD05BD063C05C40000000005BD05BD1A
-:10538000000705BD0000000005BD05BD05BD05BD4C
-:105390000000000005BD05BD05BD05BD0000000005
-:1053A00003F803ED0408040600000000040E040ADC
-:1053B000040C041000000000041C04180424042041
-:1053C00000000000042C0428043404300000000015
-:1053D00005BD05BD043805BD0000000005BD05BDC7
-:1053E00005BD05BD0000000005BD05BD05BD05BD31
-:1053F000000000000002067606940006000000008F
-:00000001FF
diff --git a/firmware/radeon/RV635_pfp.bin.ihex b/firmware/radeon/RV635_pfp.bin.ihex
deleted file mode 100644
index f55292c97b79..000000000000
--- a/firmware/radeon/RV635_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001B8007C038B00D4401E00EE001E5F
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581A800C41C3A08
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFF000042C0400309002007D250049
-:1000700000351402007D350B00255403007CD5802B
-:1000800000259C030095C00400D5001B007EDDC147
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA180000D4401E00D5801EAD
-:100140000080005300D4007500D4401E00CA08008F
-:1001500000CA0C0000CA100000D4801900D4C018D6
-:1001600000D5001700D4801E00D4C01E00D5001E8C
-:1001700000E2001E00CA040000A00000007E828B86
-:1001800000CA080000D4806000D4401E0080000037
-:1001900000D4801E00CA080000D4806100D4401E34
-:1001A0000080000000D4801E00CA080000CA0C00B5
-:1001B00000D4401E00D4801600D4C01600D4801E87
-:1001C000008001B800D4C01E00C6084300CA0C005D
-:1001D00000CA10000094800400CA140000E420F358
-:1001E00000D4201300D5606500D4E01C00D5201C8D
-:1001F00000D5601C008000000006200100C60843F6
-:1002000000CA0C0000CA1000009483F700CA140052
-:1002100000E420F30080007900D4201300C60843D6
-:1002200000CA0C0000CA1000009883EF00CA140036
-:1002300000D400640080008D0000000000C414326F
-:1002400000C6184300C4082F0095400500C40C30B8
-:1002500000D4401E0080000000EE001E009583F5D3
-:1002600000C4103100D4403300D5206500D4A01C58
-:1002700000D4E01C00D5201C00E4015E00D4001E68
-:10028000008000000006200100CA1800000A2001BA
-:1002900000D6007600C408360098800700C61045D6
-:1002A0000095011000D4001F00D46062008000009F
-:1002B00000D4206200CC383500CC1433008401BB5C
-:1002C00000D4007200D5401E0080000000EE001E29
-:1002D00000E2001A008401BB00E2001A00CC104BBF
-:1002E00000CC0447002C9401007D098B0098400548
-:1002F000007D15CB00D4001A008001B800D4006D39
-:100300000034440100CC0C480098403A00CC2C4A00
-:100310000095800400CC0449008001B800D4001A84
-:1003200000D4C01A00282801008400F000CC10037B
-:100330000098801B0004380C008400F000CC1003EF
-:100340000098801700043808008400F000CC1003E7
-:100350000098801300043804008400F000CC1003DF
-:100360000098801400CC104C009A800900CC144DE9
-:10037000009840DC00D4006D00CC184800D5001A6D
-:1003800000D5401A008000C900D5801A0096C0D55B
-:1003900000D4006D008001B800D4006E009AC00344
-:1003A00000D4006D00D4006E0080000000EC007FDF
-:1003B000009AC0CC00D4006D008001B800D4006E5B
-:1003C00000CC140300CC180300CC1C03007D910367
-:1003D000007DD583007D190C0035CC1F0035701FC2
-:1003E000007CF0CB007CD08B00880000007E8E8BE0
-:1003F0000095C00400D4006E008001B800D4001A3B
-:1004000000D4C01A00CC080300CC0C0300CC1003AD
-:1004100000CC140300CC180300CC1C0300CC240334
-:1004200000CC28030035C41F0036B01F007C704B81
-:100430000034F01F007C704B0035701F007C704B47
-:10044000007D8881007DCCC1007E5101007E9541F8
-:10045000007C9082007CD4C2007C848B009AC00314
-:10046000007C8C8B002C88010098809E00D4006D4D
-:100470000098409C00D4006E00CC084C00CC0C4D81
-:1004800000CC104800D4801A00D4C01A00800101AA
-:1004900000D5001A00CC083200D40032009482D972
-:1004A00000CA0C0000D4401E0080000000D4001ED2
-:1004B00000E4011E00D4001E00CA080000CA0C009F
-:1004C00000CA100000D4401E00CA140000D4801ED0
-:1004D00000D4C01E00D5001E00D5401E00D54034FB
-:1004E0000080000000EE001E0028040400E2001A54
-:1004F00000E2001A00D4401A00CA380000CC0803F9
-:1005000000CC0C0300CC0C0300CC0C03009882BD83
-:1005100000000000008401BB00D7A06F0080000035
-:1005200000EE001F00CA040000C2FF0000CC083427
-:1005300000C13FFF007C74CB007CC90B007D010F24
-:10054000009902B0007C738B008401BB00D7A06FC0
-:100550000080000000EE001F00CA080000281900FB
-:10056000007D898B009580140028140400CA0C00BB
-:1005700000CA100000CA1C0000CA240000E2001FCC
-:1005800000D4C01A00D5001A00D5401A00CC1803B8
-:1005900000CC2C0300CC2C0300CC2C03007DA58BBD
-:1005A000007D9C4700984297000000000080016198
-:1005B00000D4C01A00D4401E00D4801E0080000069
-:1005C00000EE001E00E4011E00D4001E00D4401EF8
-:1005D00000EE001E00CA040000A00000007E828B16
-:1005E00000E4013E00D4001E00D4401E00EE001EB8
-:1005F00000CA040000A00000007E828B00CA080030
-:1006000000248C06000CCC060098C00600CC104ECE
-:100610000099000400D4007300E4011E00D4001E01
-:1006200000D4401E00D4801E0080000000EE001E9A
-:1006300000CA080000CA0C000034D01800251001C0
-:100640000095002100C17FFF00CA100000CA1400FD
-:1006500000CA180000D4801D00D4C01D007DB18BDD
-:1006600000C1420200C2C00100D5801D0034DC0E72
-:10067000007D5D4C007F734C00D7401E00D5001EEE
-:1006800000D5401E00C1420000C2C00000099C010C
-:100690000031DC10007F5F4C007F734C00042802A7
-:1006A000007D838000D5A86F00D5806600D7401EEE
-:1006B00000EC005E00C8240200C82402008001B8DB
-:1006C00000D6007600D4401E00D4801E00D4C01E88
-:1006D0000080000000EE001E0080000000EE001F01
-:1006E00000D4001F0080000000D4001F00D4001FB1
-:1006F0000088000000D4001F00000000000000007F
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:1008000000010171000201780003008F0004007FE5
-:10081000000500030006003F000700320008012C1D
-:1008200000090046000A0036001001B6001700A2B9
-:100830000022013A00230149002000B400240125D0
-:100840000027004D0028006A002A0060002B00529B
-:10085000002F0065003200870034017F003C015604
-:10086000003F00720041018C0044012E00550173CD
-:100870000056017A0060000B00610034006200380D
-:1008800000630038006400380065003800660038F6
-:10089000006700380068003A00690041006A0048BB
-:1008A000006B0048006C0048006D0048006E004876
-:1008B000006F00480000000600000006000000066F
-:1008C0000000000600000006000000060000000610
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV670_me.bin.ihex b/firmware/radeon/RV670_me.bin.ihex
deleted file mode 100644
index 9fbfc0e4438c..000000000000
--- a/firmware/radeon/RV670_me.bin.ihex
+++ /dev/null
@@ -1,1345 +0,0 @@
-:1000000000000000C020040000000000000000000C
-:1000100000A0000A000000000000FFFF00284621A9
-:100020000000000000000000D900480000000000AF
-:1000300000000000C02004000000000000000000DC
-:1000400000A0000A000000000000000000E0000026
-:100050000000000000010000C02946200000000050
-:1000600000000000D900480000000000000000006F
-:10007000C0200400000000000000000000A0000AF2
-:10008000000000008100000000204411000000007A
-:1000900000000001002048110000000000042004BE
-:1000A000006044110000067C0000000000600000B9
-:1000B0000000062400000000006000000000063878
-:1000C00000000000C02008000000000000000F0039
-:1000D000002816220000000000000008002116255C
-:1000E000000000000000001800203625000000007D
-:1000F0008D000000002044110000000000000004FA
-:10010000002F022500000000000000000CE00000AD
-:1001100000000018004120000040481100000019B4
-:100120000042200000204811000000008E00000066
-:1001300000204411000000000000002800204A2D8B
-:1001400000000000900000000020441100000000AA
-:100150000000000000204805000000000000000C26
-:1001600000211622000000000000000300281625D0
-:10017000000000000000001900211A220000000009
-:100180000000000400281A26000000000000000003
-:10019000002914C5000000000000001900203625C9
-:1001A0000000000000000000003A140200000000FF
-:1001B00000000016002116250000000000000003CA
-:1001C00000281625000000000000001700200E2D5A
-:1001D00000000000FFFFFFFC00280E2300000000CD
-:1001E00000000000002914A3000000000000001718
-:1001F00000203625000000000000800000280E22AC
-:10020000000000000000000700220E230000000094
-:10021000000000000029386E0000000020000000EF
-:1002200000280E22000000000000000600210E231E
-:1002300000000000000000000029386E00000000EF
-:100240000000000000220222000000000000000068
-:1002500014E0000000000038000000002EE0000064
-:1002600000000035000000002CE000000000003716
-:100270000000000000400E2D0000003900000008C2
-:1002800000200E2D00000000000000090040122D8B
-:10029000000000460000000100400E2D0000003963
-:1002A00000000000C0200C0000000000003FFFFC28
-:1002B0000028122300000000000000020022122487
-:1002C000000000000000001F00211E2300000000AD
-:1002D0000000000014E000000000003E00000008E4
-:1002E00000401C11000000410000000D00201E2DE8
-:1002F000000000000000000F00281E270000000082
-:100300000000000300221E27000000007FC0000044
-:1003100000281A23000000000000001400211A2603
-:10032000000000000000000100331A260000000059
-:100330000000000800221A26000000000000000053
-:1003400000290CC700000000000000270020362410
-:100350000000000000007F000028122100000000C3
-:1003600000001400002F0224000000000000000024
-:100370000CE000000000004B0000000100290E23EB
-:10038000000000000000000E0020362300000000E6
-:100390000000E0000020441100000000FFF8000011
-:1003A00000294A230000000000000000003A2C024F
-:1003B000000000000000000200220E2B00000000E0
-:1003C000FC00000000280E23000000000000000FC9
-:1003D000002036230000000000001FFF00294A23F0
-:1003E000000000000000002700204A2D000000004F
-:1003F000000000000020481100000000000000295B
-:1004000000200E2D00000000060A020000294A23E9
-:100410000000000000000000002048110000000063
-:100420000000000000204811000000000000000152
-:1004300000210222000000000000000014E0000083
-:1004400000000061000000002EE000000000005FDE
-:10045000000000002CE000000000005E0000000032
-:1004600000400E2D000000620000000100400E2D33
-:10047000000000620000000A00200E2D00000000B5
-:100480000000000B0040122D0000006A0000000078
-:10049000C0200C0000000000003FFFFC00281223D9
-:1004A00000000000000000020022122400000000F2
-:1004B0007FC0000000281623000000000000001488
-:1004C0000021162500000000000000010033162561
-:1004D000000000008000000000280E230000000043
-:1004E0000000000000290CA3000000003FFFFC00FA
-:1004F00000290E23000000000000001F00211E2321
-:10050000000000000000000014E000000000006D8A
-:100510000000010000401C11000000700000000DF0
-:1005200000201E2D00000000000000F000281E2703
-:10053000000000000000000400221E270000000050
-:100540008100000000204411000000000000000DA8
-:100550000020481100000000FFFFF0FF00281A30C3
-:10056000000000000000A02800204411000000004E
-:1005700000000000002948E6000000000000A0186C
-:1005800000204411000000003FFFFFFF00284A2325
-:10059000000000000000A010002044110000000036
-:1005A00000000000002048040000000000000030AF
-:1005B0000020162D00000000000000020029162572
-:1005C0000000000000000030002036250000000080
-:1005D000000000250020162D000000000000000093
-:1005E000002F00A300000000000000000CC000006D
-:1005F00000000083000000260020162D00000000EF
-:1006000000000000002F00A4000000000000000017
-:100610000CC000000000008400000000004000004A
-:100620000000008A000000250020362300000000A2
-:100630000000002600203624000000000000001703
-:1006400000201E2D000000000000000200210227F3
-:10065000000000000000000014E000000000008A1C
-:1006600000000000006000000000065900000000CB
-:10067000006000000000064D0000000200210E2274
-:10068000000000000000000014C000000000008D09
-:1006900000000012C040362000000093000000005F
-:1006A0002EE0000000000091000000002CE000009F
-:1006B000000000900000000200400E2D000000929B
-:1006C0000000000300400E2D000000920000000C0E
-:1006D00000200E2D00000000000000120020362334
-:1006E000000000000000000300210E2200000000B6
-:1006F0000000000014C00000000000980000A00CE2
-:10070000002044110000000000000000C02048004C
-:100710000000000000000000C0404800000000A0F1
-:100720000000A00C002044110000000000000000A8
-:100730000020481100000000000000002EE0000032
-:100740000000009E000000002CE000000000009D62
-:100750000000000200400E2D0000009F000000037A
-:1007600000400E2D0000009F0000000C00200E2D08
-:10077000000000000000000000204803000000000E
-:1007800000000000003A0C0200000000003F0000E2
-:1007900000280E23000000000000001000210E239E
-:1007A00000000000000000110020362300000000BF
-:1007B0000000001E0021022B0000000000000000CD
-:1007C00014C00000000000A700000016C020362062
-:1007D000000000000000001F0021022B00000000AC
-:1007E0000000000014C00000000000AA0000001576
-:1007F000C0203620000000000000000800210E2B61
-:10080000000000000000007F00280E230000000010
-:1008100000000000002F0223000000000000000084
-:100820000CE00000000000E10000000027000000D4
-:10083000000000000000000000600000000002A3B3
-:1008400000000001002F0223000000000000000053
-:100850000AE00000000000B300000000006000009B
-:100860000000013A81000000002044110000000057
-:100870000000000600204811000000000000000CED
-:1008800000221E300000000099800000002044116A
-:1008900000000000000000040020122D00000000F5
-:1008A00000000008002212240000000000000010D8
-:1008B00000201811000000000000000000291CE4C6
-:1008C0000000000000000000006048070000012F49
-:1008D0009B00000000204411000000000000000008
-:1008E00000204802000000009C000000002044118D
-:1008F00000000000000000000033146F0000000042
-:100900000000000100333E23000000000000000052
-:10091000D9004800000000000000000000203C0555
-:1009200000000000810000000020441100000000D1
-:100930000000000E00204811000000000000000030
-:1009400000201010000000000000E007002044110B
-:10095000000000000000000F0021022B000000003A
-:100960000000000014C00000000000CB00F8FF08E9
-:1009700000204811000000009800000000404811CD
-:10098000000000DC000000F000280E220000000043
-:10099000000000A0002F0223000000000000000063
-:1009A0000CC00000000000DA0000001100200E2D35
-:1009B0000000000000000001002F022300000000E2
-:1009C000000000000CE00000000000D50000000264
-:1009D000002F022300000000000000000CE00000D7
-:1009E000000000D400003F0000400C11000000D6C1
-:1009F00000001F0000400C11000000D600000F0096
-:100A000000200C11000000000038000900294A23D2
-:100A1000000000003F00000000280E2B0000000036
-:100A20000000000200220E2300000000000000076A
-:100A300000494A23000000DC00380F09002048115B
-:100A400000000000680000070020481100000000BE
-:100A50000000000800214A270000000000000000FC
-:100A60000020481100000000060A020000294A2464
-:100A700000000000000000000020481100000000FD
-:100A80000000000000204811000000000000A20249
-:100A9000002044110000000000FF000000280E228A
-:100AA000000000000000008000294A230000000030
-:100AB0000000002700200E2D00000000000000268E
-:100AC0000020122D0000000000000000002F008315
-:100AD00000000000000000000CE00000000000EA40
-:100AE000000000000060000000000653000000004D
-:100AF00000400000000000EB00000000006000006B
-:100B000000000656000000070020222D0000000013
-:100B10000000000500220E2200000000001000006E
-:100B200000280E23000000000000000000292068BB
-:100B30000000000000000000003A0C02000000006D
-:100B4000000000EF00280E2300000000000000005D
-:100B500000292068000000000000001700200E2D72
-:100B6000000000000000000300210223000000003C
-:100B70000000000014E00000000000F80000000B7E
-:100B800000210228000000000000000014C0000046
-:100B9000000000F8000004000029222800000000E6
-:100BA0000000001400203628000000000000001C97
-:100BB00000210E22000000000000000014C0000010
-:100BC000000000FD0000A30C002044110000000004
-:100BD0000000000000204811000000000000001E7E
-:100BE00000210E22000000000000000014C00000E0
-:100BF0000000010B0000A30F0020441100000000C2
-:100C00000000001100200E2D000000000000000177
-:100C1000002F022300000000000000000CC00000B4
-:100C200000000104FFFFFFFF004048110000010B1E
-:100C300000000002002F022300000000000000005E
-:100C40000CC00000000001070000FFFF0040481139
-:100C50000000010B00000004002F02230000000030
-:100C6000000000000CC000000000010A000000FFAE
-:100C7000004048110000010B000000010020481155
-:100C8000000000000002C400002044110000000029
-:100C90000000001F00210E220000000000000000E4
-:100CA00014C00000000001120000001040210E20BE
-:100CB00000000000000000130020362300000000A8
-:100CC0000000001840224A20000000000000001030
-:100CD000C0424A20000001140000000000200C1156
-:100CE0000000000000000013002036230000000078
-:100CF000000000000020481100000000000000007B
-:100D000000204811000000000000000A002010111F
-:100D10000000000000000000002F0224000000007E
-:100D2000000000000CE000000000011B00000000BB
-:100D300000204811000000000000000100531224B0
-:100D400000000117FFBFFFFF00283A2E000000003F
-:100D50000000001B00210222000000000000000033
-:100D600014C000000000012E81000000002044118A
-:100D7000000000000000000D0020481100000000ED
-:100D80000000001800220E3000000000FC000000EF
-:100D900000280E2300000000810000000020441104
-:100DA000000000000000000E0020481100000000BC
-:100DB0000000000000201010000000000000E00E05
-:100DC000002044110000000007F8FF08002048112F
-:100DD000000000000000000000294A23000000007D
-:100DE0000000001C00201E2D000000000000000874
-:100DF00000214A27000000000000000000204811E8
-:100E000000000000060A020000294A240000000039
-:100E10000000000000204811000000000000000059
-:100E200000204811000000000000000000800000C9
-:100E300000000000810000000020441100000000BC
-:100E40000000000100204811000000000000217C8B
-:100E50000020441100000000008000000020481124
-:100E60000000000000000000002048060000000014
-:100E70000000000800214A270000000000000000D8
-:100E800017000000000000000004217F00604411F2
-:100E90000000067C0000001F00210230000000005E
-:100EA0000000000014C000000000067B00000004E9
-:100EB00000404C1100000135810000000020441169
-:100EC00000000000000000010020481100000000A8
-:100ED000000021F800204411000000000000001C68
-:100EE0000020481100000000000421F900604411B6
-:100EF0000000067C0000001100210230000000000C
-:100F00000000000014E000000000013C00000000B0
-:100F100000800000000000000000000000600000F1
-:100F20000000000B00000000006004110000031529
-:100F3000000000000020041100000000000000007C
-:100F400000600811000001B2000000000060000015
-:100F5000000001600000FFFF40280E20000000009C
-:100F600000000010C0211220000000000000FFFF60
-:100F7000402806200000000000000010C0210A20C8
-:100F800000000000000000000034146100000000B8
-:100F90000000000000741882000002BB0001A1FDE7
-:100FA00000604411000002E000003FFF002F022F0C
-:100FB00000000000000000000CC00000000001471D
-:100FC00000000000C040040000000001000000001C
-:100FD000006000000000000B000000000060041131
-:100FE00000000315000000000020041100000000B4
-:100FF0000000000000600811000001B200003FFF87
-:10100000002F022F00000000000000000CE0000094
-:10101000000000000000000000600000000001600F
-:101020000000001040210E20000000000000FFFF23
-:10103000C0281220000000000000001040211620EF
-:10104000000000000000FFFFC0681A20000002BB83
-:101050000001A1FD00604411000002E000003FFF1C
-:10106000002F022F00000000000000000CC0000054
-:101070000000015800000000C04004000000000112
-:101080000000225C0020441100000000000000016C
-:1010900000300A2F000000000000000100210A2299
-:1010A000000000000000000300384A220000000099
-:1010B0000000225600204411000000000000001A29
-:1010C00000204811000000000000A1FC0020441195
-:1010D0000000000000000001008048110000000036
-:1010E00000000000006000000000000B0000000095
-:1010F000006000000000018F0000000000600000A0
-:10110000000001A000003FFF002F022F00000000A0
-:10111000000000000CE000000000000000000000E3
-:1011200000202C0800000000000000000020241116
-:101130000000000000000000002028110000000056
-:10114000000022560020441100000000000000169C
-:1011500000204811000000000000225C0020441123
-:101160000000000000000003002048110000000003
-:1011700093800000002044110000000000000002E5
-:1011800000221E290000000000000000007048EB53
-:101190000000019C0000000000600000000002BB95
-:1011A00000000001403306200000000000000000A5
-:1011B000C03024090000000000003FFF002F022F74
-:1011C00000000000000000000CE000000000000033
-:1011D0000000000000600000000002A3000000000A
-:1011E000002F022100000000000000000AE00000C3
-:1011F0000000018100000000006000000000013AD2
-:101200000000000000400000000001869500000082
-:10121000002044110000000000000000002F022107
-:1012200000000000000000000CE00000000001864B
-:1012300000000000C0204800000000000000000185
-:10124000005306210000018292000000002044119A
-:101250000000000000000000C0604800000001978E
-:101260000001A1FD00204411000000000000001159
-:101270000020062D00000000000000000078042A75
-:10128000000002FB00000000002028090000000010
-:1012900000003FFF002F022F0000000000000000B0
-:1012A0000CC000000000017400000000C0400400F9
-:1012B000000000010000021000600411000003158E
-:1012C00000003FFF002F022F000000000000000080
-:1012D0000CE000000000019400000015C020362042
-:1012E0000000000000000016C020362000000000B2
-:1012F0003F800000002004110000000046000000B4
-:1013000000600811000001B2000000000080000031
-:10131000000000000000A1FC0020441100000000BB
-:1013200000003FFF002F022F00000000000000001F
-:101330000CC000000000019B00000001008048116B
-:1013400000000000000000210080481100000000A3
-:101350000000FFFF40280E200000000000000010E9
-:10136000C0211220000000000000FFFF40281620CE
-:101370000000000000000010C0811A2000000000E2
-:101380008100000000204411000000000000000661
-:1013900000204811000000000000000800221E305C
-:1013A000000000000000002900201A2D00000000AD
-:1013B0000000E0000020441100000000FFFBFF09D6
-:1013C00000204811000000000000000F0020222D26
-:1013D0000000000000001FFF00294A280000000054
-:1013E000000000060020222D000000000000000088
-:1013F000002920E80000000000000000002048084C
-:101400000000000000000000002048110000000063
-:10141000060A020000294A26000000000000000021
-:1014200000204811000000000000000000204811CA
-:101430000000000000000100002018110000000062
-:101440000000000800621E280000012F00000008B4
-:1014500000822228000000000002C0000020441189
-:10146000000000000000001500600E2D000001BD0E
-:101470000000001600600E2D000001BD0000C00835
-:1014800000204411000000000000001700200E2D75
-:10149000000000000000000014C00000000001B9BE
-:1014A0000000000000200411000000000000000007
-:1014B0000020480100000000390000000020481111
-:1014C00000000000000000000020481100000000A3
-:1014D000000000000080480200000000000000182A
-:1014E00000202E2D0000000000000000003B0D63D6
-:1014F000000000000000000800224A230000000055
-:101500000000001000224A23000000000000001824
-:1015100000224A2300000000000000000080480371
-:101520000000000000000000006000000000000B50
-:10153000000010000060041100000315000000000E
-:1015400000200411000000000000000000600811ED
-:10155000000001B2000000070021062F000000007B
-:101560000000001300200A2D000000000000000110
-:1015700000202C11000000000000FFFF4028222066
-:10158000000000000000000F0026222800000000DC
-:101590000000001040212620000000000000000F85
-:1015A000002626290000000000000000002028027C
-:1015B000000000000000225600204411000000003E
-:1015C0000000001B00204811000000000000000087
-:1015D000002F022100000000000000000CE00000CD
-:1015E000000001E00000225C002044110000000027
-:1015F0000000008100204811000000000000A1FC54
-:1016000000204411000000000000000100204811EB
-:10161000000000000000008000201C1100000000FD
-:1016200000000000002F0227000000000000000062
-:101630000CE00000000001DC000000000060000081
-:10164000000001E90000000100531E27000001D83E
-:101650000000000100202C11000000000000001F0D
-:1016600000280A22000000000000001F00282A2A8B
-:10167000000000000000000100530621000001D11D
-:101680000000225C00204411000000000000000265
-:1016900000304A2F000000000000A1FC002044118F
-:1016A00000000000000000010020481100000000C0
-:1016B0000000000100301E2F0000000000000000AC
-:1016C000002F022700000000000000000CE00000D6
-:1016D000000000000000000000600000000001E9C0
-:1016E0000000000100531E27000001E50000FFFF7D
-:1016F00040280E20000000000000000F00260E23EE
-:101700000000000000000010C021122000000000B6
-:101710000000000F0026122400000000000000005E
-:1017200000201411000000000000000000601811EB
-:10173000000002BB0001A1FD0020441100000000D8
-:1017400000000000002F022B00000000000000003D
-:101750000CE00000000001F8000000100022162834
-:1017600000000000FFFF0000002816250000000018
-:101770000000FFFF00281A29000000000000000000
-:10178000002948C500000000000000000020480AB1
-:10179000000000000000000000202C1100000000EC
-:1017A000000000100022162300000000FFFF0000D0
-:1017B00000281625000000000000FFFF00281A2462
-:1017C0000000000000000000002948C500000000E3
-:1017D0000000000000731503000002050000000077
-:1017E0000020180500000000000000000073152410
-:1017F0000000020500000000002D14C500000000DC
-:1018000000000000003008A20000000000000000FE
-:101810000020480200000000000000000020280214
-:101820000000000000000000002020030000000075
-:101830000000000000802404000000000000000FF1
-:1018400000210225000000000000000014C000007C
-:101850000000067B00000000002B140500000000C3
-:1018600000000001009016250000000000000000AC
-:10187000006000000000000B000000000060041188
-:10188000000003150000000000200411000000000B
-:101890000000000000600811000001B200002256A4
-:1018A00000204411000000000000001A00294A2214
-:1018B0000000000000000000C02000000000000048
-:1018C00000003FFF002F022F00000000000000007A
-:1018D0000CE000000000000000000000C020040038
-:1018E000000000000000225C002044110000000005
-:1018F0000000000300384A21000000000000A1FCA5
-:1019000000204411000000000000000100204811E8
-:10191000000000000000FFFF40281220000000002F
-:1019200000000010C0211A20000000000000FFFF8E
-:1019300040280E200000000000000010C0211620EA
-:10194000000000000000000000741465000002BBED
-:101950000001A1FD00604411000002E00000000150
-:10196000003306210000000000000000002F0221CB
-:1019700000000000000000000CC000000000021980
-:1019800000003FFF002F022F0000000000000000B9
-:101990000CC000000000021200000000C040040063
-:1019A0000000000100000000006000000000063898
-:1019B000000000000040040F0000021300000000BF
-:1019C000006000000000062400000000006000002D
-:1019D000000006380000021000600411000003152A
-:1019E0000000000000600000000001A000000000F6
-:1019F000006000000000019C00000000006000008A
-:101A0000000002BB0000000000600000000002A314
-:101A1000938000000020441100000000000000003E
-:101A2000002048080000000000000000002F022FE6
-:101A300000000000000000000AE000000000023288
-:101A400000000000006000000000013A00000000FB
-:101A50000040000000000236950000000020441104
-:101A60000000000000000000002F022F0000000016
-:101A7000000000000CE00000000002360000000042
-:101A8000C0404800000002339200000000204411D2
-:101A90000000000000000000C0204800000000001E
-:101AA0000000225600204411000000000000001633
-:101AB00000204811000000000000225C00204411BA
-:101AC000000000000000000300204811000000009A
-:101AD0000000A1FC002044110000000000000001F3
-:101AE00000204811000000000001A1FD0020441169
-:101AF000000000000000000000600411000002FB74
-:101B000000000000C04004000000000100000000D0
-:101B100000600000000006240000A00C002044111A
-:101B20000000000000000000C0204800000000008D
-:101B300000000000C040480000000000000000005D
-:101B4000006000000000000B0000001840210A2087
-:101B50000000000000000003002F0222000000002F
-:101B6000000000000AE000000000024C0000001429
-:101B70000020222D00000000000801010029222879
-:101B800000000000000000140020362800000000C3
-:101B90000000A30C00204411000000000000000021
-:101BA000C02048000000000000000000C0204800E5
-:101BB0000000000000000000C0404800000002518A
-:101BC00000000000006000000000000B000000109A
-:101BD00000600411000003153F8000000020041184
-:101BE000000000000000000000600811000001B2C9
-:101BF0000000225C002044110000000000000003EF
-:101C000000204811000000000000000000600000FB
-:101C10000000027C0000001700201E2D00000000C4
-:101C20000000000100211E2700000000000000004D
-:101C300014E000000000026A0000001200201E2DC7
-:101C4000000000000000FFFF00281E270000000029
-:101C50000000000000341C2700000000000000000D
-:101C600012C000000000025F0000000000201C11F4
-:101C70000000000000000000002F00E50000000050
-:101C80000000000008C00000000002620000000028
-:101C900000201407000000000000001200201E2D8C
-:101CA000000000000000001000211E2700000000BE
-:101CB0000000000000341C4700000000000000008D
-:101CC00012C00000000002670000000000201C118C
-:101CD0000000000000000000002F00E600000000EF
-:101CE0000000000008C000000000026A00000000C0
-:101CF0000020180700000000000000000060000045
-:101D0000000002C100002256002044110000000023
-:101D1000000000000034202300000000000000004C
-:101D200012C00000000002720000000000342044D5
-:101D3000000000000000000012C00000000002715E
-:101D40000000001600404811000002760000001854
-:101D500000404811000002760000000000342044DA
-:101D6000000000000000000012C00000000002752A
-:101D70000000001700404811000002760000001922
-:101D800000204811000000000000A1FC00204411C8
-:101D900000000000000000010020481100000000C9
-:101DA0000001A1FD00604411000002E900003FFFB6
-:101DB000002F022F00000000000000000CC00000F7
-:101DC0000000025600000000C040040000000001B6
-:101DD0000000001040210620000000000000FFFF6E
-:101DE000C0280A20000000000000001040210E2042
-:101DF000000000000000FFFFC028122000000000CB
-:101E00000000001040211620000000000000FFFF2D
-:101E1000C0881A200000000081000000002044114A
-:101E20000000000000000001002048110000000038
-:101E300000042004006044110000067C0000000043
-:101E4000006000000000062400000000C0600000E8
-:101E5000000002A30000000500200A2D0000000081
-:101E60000000000800220A22000000000000002BF1
-:101E700000201A2D000000000000001C00201E2D74
-:101E8000000000000000700000281E270000000075
-:101E90000000000000311CE6000000000000002AE5
-:101EA00000201A2D000000000000000C00221A265D
-:101EB0000000000000000000002F00E6000000000D
-:101EC0000000000006E00000000002920000000098
-:101ED00000201C11000000000000000000200C1178
-:101EE000000000000000002B00203623000000004E
-:101EF0000000001000201811000000000000000089
-:101F000000691CE20000012F9380000000204411B2
-:101F10000000000000000000002048070000000052
-:101F200095000000002044110000000000000000A7
-:101F3000002F022F00000000000000000CE0000055
-:101F40000000029D0000000100333E2F0000000051
-:101F500000000000D90048000000000092000000CE
-:101F6000002044110000000000000000C0204800D4
-:101F7000000000000000001C0040362700000000A8
-:101F80000000000CC0220A20000000000000002910
-:101F9000002036220000000000000028C04036204B
-:101FA000000000000000A2A4002044110000000076
-:101FB000000000090020481100000000A1000000FE
-:101FC00000204411000000000000000100804811C2
-:101FD000000000000000002100201E2D0000000075
-:101FE00000000000002C1CE30000000000000021A5
-:101FF00000203627000000000000002200201E2DD7
-:102000000000000000000000002C1CE400000000A4
-:1020100000000022002036270000000000000023FE
-:1020200000201E2D0000000000000000003120A351
-:102030000000000000000000002D1D07000000004F
-:1020400000000023002036270000000000000024CC
-:1020500000201E2D0000000000000000003120C400
-:102060000000000000000000002D1D07000000001F
-:10207000000000240080362700000000000000213E
-:10208000002036230000000000000022002036243B
-:10209000000000000000000000311CA30000000050
-:1020A0000000002300203627000000000000000090
-:1020B00000311CC40000000000000024008036270E
-:1020C000000000000000001A002036270000000079
-:1020D0000000001B00203628000000000000001750
-:1020E00000201E2D00000000000000020021022739
-:1020F000000000000000000014C00000000002DC2E
-:102100000000000000400000000002D90000001A9A
-:1021100000203627000000000000001B00203628A9
-:10212000000000000000001700201E2D000000002D
-:102130000000000200210227000000000000000053
-:1021400014E00000000002D9000000030021022773
-:10215000000000000000000014E00000000002DCAD
-:102160000000002300201E2D0000000000000000E1
-:10217000002E00E1000000000000000002C000008E
-:10218000000002DC0000002100201E2D00000000E5
-:1021900000000000003120A100000000000000004D
-:1021A000002E00E8000000000000000006C0000053
-:1021B000000002DC0000002400201E2D00000000B2
-:1021C00000000000002E00E20000000000000000FF
-:1021D00002C00000000002DC0000002200201E2DD2
-:1021E0000000000000000000003120C200000000DC
-:1021F00000000000002E00E80000000000000000C9
-:1022000006C00000000002DC0000000000600000CA
-:10221000000006590000000000600000000002B548
-:102220000000000000400000000002DE000000008E
-:1022300000600000000002B5000000000060000027
-:10224000000006500000000000400000000002DE18
-:102250000000000000600000000002A70000000075
-:1022600000400000000002DE0000001A00201E2DC9
-:10227000000000000000001B0080222D0000000074
-:102280000000001000221E230000000000000000DB
-:1022900000294887000000000000000000311CA356
-:1022A000000000000000001000221E2700000000B7
-:1022B0000000000000294887000000000000001016
-:1022C00000221E230000000000000000003120C496
-:1022D000000000000000FFFF00282228000000008E
-:1022E0000000000000894907000000000000001005
-:1022F00000221E2300000000000000000029488783
-:10230000000000000000001000221E21000000005C
-:102310000000000000294847000000000000000005
-:1023200000311CA3000000000000001000221E2746
-:1023300000000000000000000029488700000000A5
-:102340000000000000311CA100000000000000108F
-:1023500000221E270000000000000000002948475E
-:10236000000000000000001000221E2300000000FA
-:1023700000000000003120C4000000000000FFFF4A
-:102380000028222800000000000000000029490762
-:10239000000000000000001000221E2100000000CC
-:1023A00000000000003120C2000000000000FFFF1C
-:1023B00000282228000000000000000000894907D2
-:1023C000000000000000001000221E23000000009A
-:1023D0000000000000294887000000000000000104
-:1023E00000220A210000000000000000003308A2C3
-:1023F000000000000000001000221E22000000006B
-:102400000000001000212222000000000000000057
-:1024100000294907000000000000000000311CA353
-:10242000000000000000001000221E270000000035
-:1024300000000000002948870000000000000001A3
-:1024400000220A210000000000000000003008A265
-:10245000000000000000001000221E22000000000A
-:1024600000000010002122220000000000000000F7
-:1024700000294907000000000000001000221E2370
-:102480000000000000000000003120C40000000037
-:102490000000FFFF002822280000000000000000CC
-:1024A000002949070000000000000000003808C5AE
-:1024B00000000000000000000030084100000000A3
-:1024C0000000000100220A220000000000000000BD
-:1024D000003308A2000000000000001000221E22AD
-:1024E0000000000000000010002122220000000077
-:1024F00000000000008949070000000000000017EC
-:102500000020222D000000000000000014C0000088
-:1025100000000318FFFFFFEF002806210000000065
-:10252000000000140020222D000000000000F8E050
-:1025300000204411000000000000000000294901B3
-:1025400000000000000000000089490100000000B8
-:102550000000000000204811000000000000000002
-:102560000020481100000000060A02000080481107
-:102570000000000000000000C0200000000000007B
-:1025800097000000C020441100000000000000007F
-:10259000C0204811000000008A0000000020441103
-:1025A00000000000000000000020481100000000B2
-:1025B0000000225C00204411000000000000000028
-:1025C000C0204800000000000000A1FC00204411D1
-:1025D0000000000000000000C020480000000000D3
-:1025E00000000000C0200400000000000000000007
-:1025F00000A0000A00000000970000000020441125
-:102600000000000000000000002048110000000051
-:102610008A000000002044110000000000000000BB
-:1026200000204811000000000000225C002044113E
-:102630000000000000000000C02048000000000072
-:102640000000A1FC00204411000000000000000078
-:10265000C02048000000000000000000C02004006E
-:10266000000000000000000000A0000A00000000C0
-:10267000970000000020441100000000000000004E
-:1026800000204811000000008A00000000204411D2
-:1026900000000000000000000020481100000000C1
-:1026A0000000225C00204411000000000000000037
-:1026B000C0204800000000000000A1FC00204411E0
-:1026C0000000000000000000C020480000000000E2
-:1026D0000001A1FD002044110000000000000000E6
-:1026E000D90048000000000000000000C0200400E5
-:1026F000000000000000000000A0000A0000000030
-:1027000000002257002044110000000000000003D8
-:10271000C0484A20000000000000225D0020441153
-:102720000000000000000000C04048000000000061
-:1027300000000000006000000000063800000000FB
-:10274000C0200800000000000000225C00204411AE
-:10275000000000000000000300384A2200000000D2
-:102760000000A1FC00204411000000000000000057
-:10277000C0204800000000000001A1FD002044111D
-:102780000000000000000000002F022200000000F6
-:10279000000000000CE0000000000000000000004D
-:1027A00040204800000000000000000140304A20A6
-:1027B0000000000000000002C0304A2000000000BD
-:1027C0000000000100530A220000034B0000003FFC
-:1027D000C0280A20000000008100000000204411F1
-:1027E000000000000000000100204811000000006F
-:1027F000000021F800204411000000000000001833
-:102800000020481100000000000421F9006044117C
-:102810000000067C000000110021023000000000D2
-:102820000000000014E00000000003540000001449
-:10283000002F022200000000000000000CC0000079
-:10284000000003620001A2A4002044110000000067
-:1028500000000000006048020000036A0000210040
-:10286000002044110000000000000000C0204800CB
-:102870000000000000000000C02048000000000030
-:1028800000000000C0204800000000000000000020
-:10289000C04048000000000000000004002F022299
-:1028A00000000000000000000CC0000000000366F3
-:1028B0000001A2A40020441100000000000000005C
-:1028C000004048020000035D00000028002F0222A3
-:1028D00000000000000000000CC00000000005B374
-:1028E0000001A2A40020441100000000000000002C
-:1028F000004048020000035D0000002C0020362646
-:102900000000000000000049002018110000000035
-:102910000000003F002048110000000000000001FE
-:1029200000331A260000000000000000002F0226DD
-:1029300000000000000000000CC000000000036C5C
-:102940000000002C00801A2D000000000000003F55
-:10295000C0280A200000000000000015002F0222FD
-:1029600000000000000000000CE0000000000382F6
-:1029700000000006002F02220000000000000000FE
-:102980000CE00000000003AD00000016002F022242
-:1029900000000000000000000CE00000000003AF99
-:1029A00000000020002F02220000000000000000B4
-:1029B0000CE00000000003980000000F002F02222E
-:1029C00000000000000000000CE00000000003A474
-:1029D00000000010002F0222000000000000000094
-:1029E0000CE00000000003A40000001E002F0222E3
-:1029F00000000000000000000CE000000000038C5C
-:102A00000000A2A40020441100000000000000000B
-:102A100000404802000000000800000000290A22CF
-:102A2000000000000000000340210E200000000014
-:102A30000000000CC021122000000000000800006F
-:102A4000002812240000000000000014C0221620FC
-:102A50000000000000000000002914A40000000095
-:102A60000000A2A4002044110000000000000000AB
-:102A7000002948A2000000000000A1FE002044112F
-:102A800000000000000000000040480300000000BB
-:102A9000810000000020441100000000000000013F
-:102AA0000020481100000000000021F8002044111F
-:102AB0000000000000000016002048110000000087
-:102AC000000421F9006044110000067C000000159C
-:102AD00000210230000000000000000014E00000AF
-:102AE0000000038E0000210E0020441100000000B1
-:102AF00000000000C02048000000000000000000AE
-:102B0000C0204800000000000000A2A400204411E2
-:102B1000000000000000000000404802000000002B
-:102B200081000000002044110000000000000001AE
-:102B30000020481100000000000021F8002044118E
-:102B400000000000000000170020481100000000F5
-:102B5000000421F9006044110000067C000000031D
-:102B600000210230000000000000000014E000001E
-:102B70000000039A0000210800204411000000001A
-:102B800000000000C020480000000000000000001D
-:102B9000C0204800000000000000A2A40020441152
-:102BA000000000000000000000404802000000009B
-:102BB0000000A2A40020441100000000000000005A
-:102BC00000204802000000008000000000204411A6
-:102BD000000000000000000000204811000000007C
-:102BE00081000000002044110000000000000010DF
-:102BF000002048110000000000000000002000102C
-:102C0000000000000000000014C00000000003AA43
-:102C10000000000000400000000000000001A2A42D
-:102C20000020441100000000000000060040481190
-:102C3000000000000001A2A40020441100000000D8
-:102C400000000016006048110000036A0000000048
-:102C5000004000000000000000000000C02008004C
-:102C60000000000000000000C0200C000000000078
-:102C70000000001D002102230000000000000000F1
-:102C800014E00000000003C4810000000020441193
-:102C900000000000000000010020481100000000BA
-:102CA000000021F80020441100000000000000187E
-:102CB0000020481100000000000421F900604411C8
-:102CC0000000067C0000001100210230000000001E
-:102CD0000000000014E00000000003B80000210024
-:102CE0000020441100000000000000000020480205
-:102CF0000000000000000000002048030000000069
-:102D0000BABECAFE0020481100000000CAFEBABECA
-:102D100000204811000000000000A2A4002044117F
-:102D20000000000000000004004048110000000006
-:102D3000000021700020441100000000000000008D
-:102D400000204802000000000000000000204803AE
-:102D5000000000008100000000204411000000007D
-:102D60000000000A002048110000000000000000E0
-:102D700000200010000000000000000014C000004F
-:102D8000000003C98C000000002044110000000076
-:102D9000CAFEBABE004048110000000081000000D9
-:102DA0000020441100000000000000010020481134
-:102DB0000000000000003FFF40280A200000000043
-:102DC0008000000040280E200000000040000000AD
-:102DD000C028122000000000000400000069462204
-:102DE0000000067C0000000000201410000000001D
-:102DF00000000000002F022300000000000000007F
-:102E00000CC00000000003D700000000C040180004
-:102E1000000003DA00003FFFC0281A200000000075
-:102E200000040000006946260000067C0000000047
-:102E3000002018100000000000000000002F0224F5
-:102E400000000000000000000CC00000000003DDD6
-:102E500000000000C0401C00000003E000003FFF35
-:102E6000C0281E2000000000000400000069462762
-:102E70000000067C0000000000201C100000000084
-:102E800000000000002044020000000000000000DC
-:102E9000002820C50000000000000000004948E8AC
-:102EA00000000000A58000000020081100000000C4
-:102EB0000000200000200C11000000008300000032
-:102EC00000604411000004080000000000204402DB
-:102ED0000000000000000000C020480000000000CA
-:102EE0000000000040204800000000000000001F1B
-:102EF000C0210220000000000000000014C00000FB
-:102F0000000003ED0000201000204411000000002C
-:102F10000000800000204811000000000000FFFFBA
-:102F2000C0481220000003F5A7800000002008110F
-:102F3000000000000000A00000200C1100000000B4
-:102F4000830000000060441100000408000000003D
-:102F5000002044020000000000000000C0204800E3
-:102F60000000000000000000C02048000000000039
-:102F70000000FFFFC02812200000000083000000B6
-:102F800000204411000000000000000000304883D1
-:102F90000000000084000000002044110000000038
-:102FA00000000000C02048000000000000000000F9
-:102FB0001D000000000000008300000000604411BC
-:102FC0000000040800000000C040040000000001F0
-:102FD000A980000000200811000000000000C000CF
-:102FE00000400C11000003F0AB800000002008112D
-:102FF000000000000000F8E000400C11000003F0A9
-:10300000AD80000000200811000000000000F880E2
-:1030100000400C11000003F0B380000000200811F4
-:10302000000000000000F3FC00400C11000003F061
-:10303000AF80000000200811000000000000E00048
-:1030400000400C11000003F0B180000000200811C6
-:10305000000000000000F00000400C11000003F030
-:1030600083000000002044110000000000002148FF
-:1030700000204811000000008400000000204411DE
-:103080000000000000000000C02048000000000018
-:10309000000000001D000000000000000000000013
-:1030A000008000000000000001182000C030462011
-:1030B0000000000000000000D900480000000000EF
-:1030C00000000000C020040000000000000000001C
-:1030D00000A0000A000000000218A000C030462036
-:1030E0000000000000000000D900480000000000BF
-:1030F00000000000C02004000000000000000000EC
-:1031000000A0000A000000000318C000C0304620E4
-:103110000000000000000000D9004800000000008E
-:1031200000000000C02004000000000000000000BB
-:1031300000A0000A000000000418F8E0C03046209B
-:103140000000000000000000D9004800000000005E
-:1031500000000000C020040000000000000000008B
-:1031600000A0000A000000000518F880C0304620CA
-:103170000000000000000000D9004800000000002E
-:1031800000000000C020040000000000000000005B
-:1031900000A0000A000000000618E000C030462031
-:1031A0000000000000000000D900480000000000FE
-:1031B00000000000C020040000000000000000002B
-:1031C00000A0000A000000000718F000C0304620F0
-:1031D0000000000000000000D900480000000000CE
-:1031E00000000000C02004000000000000000000FB
-:1031F00000A0000A000000000818F3FCC0304620C0
-:103200000000000000000000D9004800000000009D
-:1032100000000000C02004000000000000000000CA
-:1032200000A0000A000000000000003000200A2D6D
-:103230000000000000000000C0290C400000000059
-:1032400000000030002036230000000000000000D5
-:10325000C0200400000000000000000000A0000AE0
-:103260000000000086000000002044110000000063
-:103270000000000000404801000000008500000040
-:10328000C020441100000000000000000040480180
-:10329000000000000000217C00204411000000001C
-:1032A00000000000C02048000000000000000000F6
-:1032B000C02048000000000000000000C0204800BE
-:1032C0000000000081000000002044110000000008
-:1032D0000000000100204811000000000000000074
-:1032E000C0200800000000000000000017000000DF
-:1032F000000000000004217F006044110000067CF3
-:103300000000001F0021023000000000000000004B
-:1033100014C00000000000000000000000404C024B
-:103320000000043E00000000C0200C00000000006F
-:1033300000000000C020100000000000000000009D
-:10334000C02014000000000000000000C020180091
-:103350000000000000000000C0201C000000000071
-:1033600000007F0000280A21000000000000450046
-:10337000002F022200000000000000000CE000000E
-:103380000000044C00000000C020200000000000ED
-:103390000000000017000000000000000000001006
-:1033A00000280A230000000000000010002F022265
-:1033B00000000000000000000CE0000000000454C9
-:1033C0008100000000204411000000000000000106
-:1033D000002048110000000000040000006946249D
-:1033E0000000067C000000000040000000000459BE
-:1033F00081000000002044110000000000000000D7
-:1034000000204811000000000000216D0020441140
-:103410000000000000000000002048040000000040
-:103420000000000000604805000006810000000068
-:10343000002824F0000000000000000700280A23F4
-:103440000000000000000001002F02220000000028
-:10345000000000000AE0000000000460000000001E
-:10346000002F00C9000000000000000004E0000080
-:103470000000047900000000004000000000048605
-:1034800000000002002F02220000000000000000E7
-:103490000AE000000000046500000000002F00C9E1
-:1034A000000000000000000002E0000000000479BD
-:1034B000000000000040000000000486000000033F
-:1034C000002F022200000000000000000AE00000BF
-:1034D0000000046A00000000002F00C90000000086
-:1034E000000000000CE00000000004790000000073
-:1034F000004000000000048600000004002F0222AB
-:1035000000000000000000000AE000000000046F5E
-:1035100000000000002F00C90000000000000000B3
-:103520000AE00000000004790000000000400000F4
-:103530000000048600000005002F022200000000A9
-:10354000000000000AE00000000004740000000019
-:10355000002F00C9000000000000000006E000008D
-:103560000000047900000000004000000000048614
-:1035700000000006002F02220000000000000000F2
-:103580000AE000000000047900000000002F00C9DC
-:10359000000000000000000008E0000000000479C6
-:1035A00000000000004000000000048600007F00D2
-:1035B00000280A210000000000004500002F022220
-:1035C00000000000000000000AE000000000000011
-:1035D0000000000800210A23000000000000000095
-:1035E00014C0000000000483000021690020441181
-:1035F0000000000000000000C020480000000000A3
-:1036000000000000C0204800000000000000000092
-:10361000C020480000000000CAFEBABE00404811A9
-:103620000000000000000000C02044000000000076
-:1036300000000000C02000000000000000000000AA
-:10364000C04048000000000000007F0000280A2160
-:103650000000000000004500002F022200000000D2
-:10366000000000000AE000000000048C00000000E0
-:10367000C02000000000000000000000C02000008A
-:103680000000000000000000C0400000000000003A
-:103690000000000000404C080000044C0000000046
-:1036A000C0200800000000000000001040210E2093
-:1036B0000000000000000011402112200000000066
-:1036C00000000012402116200000000000002169C7
-:1036D000002044110000000000000000002048020B
-:1036E0000000000000000000002102250000000092
-:1036F0000000000014E00000000004960004000038
-:10370000C0494A2000000497FFFBFFFFC0284A2061
-:103710000000000000000000002102230000000063
-:103720000000000014E00000000004A300000000FE
-:10373000C02048000000000000000000C020480039
-:103740000000000000000000002102240000000032
-:103750000000000014C00000000000008100000014
-:1037600000204411000000000000000C002048115F
-:103770000000000000000000002000100000000019
-:103780000000000014C000000000049FA000000022
-:103790000020441100000000CAFEBABE00404811DB
-:1037A0000000000081000000002044110000000023
-:1037B0000000000400204811000000000000216B00
-:1037C000002044110000000000000000C02048104C
-:1037D00000000000810000000020441100000000F3
-:1037E0000000000500204811000000000000216CCE
-:1037F000002044110000000000000000C02048101C
-:103800000000000000000000002F02240000000063
-:10381000000000000CE000000000000000000000BC
-:10382000004000000000049D00000000C0210A20AC
-:10383000000000000000000014C00000000004B6FA
-:103840008100000000204411000000000000000082
-:1038500000204811000000000000216D00204411EC
-:103860000000000000000000C02048000000000030
-:1038700000000000C0604800000006810000000059
-:1038800000400000000004BA810000000020441144
-:1038900000000000000000010020481100000000AE
-:1038A00000040000C02946200000000000000000C5
-:1038B000C06000000000067C000000010021022220
-:1038C000000000000000000014C00000000004C15F
-:1038D00000002169002044110000000000000000E9
-:1038E000C02048000000000000000000C020480088
-:1038F0000000000000000000002048100000000050
-:10390000CAFEBABE004048110000000000000000DE
-:10391000C02044000000000000000000C04048102B
-:1039200000000000810000000020441100000000A1
-:10393000000000010020481100000000000021F8F4
-:1039400000204411000000000000000E002048117B
-:1039500000000000000421F9006044110000067C12
-:103960000000000000210230000000000000000004
-:1039700014C00000000004C3000021800020441196
-:103980000000000000000000C0204800000000000F
-:1039900000000000C0200000000000000000000047
-:1039A000C02048000000000000000000C02000000F
-:1039B0000000000000000000C040480000000000BF
-:1039C0000000000300333E2F000000000000000153
-:1039D00000210221000000000000000014E00000AF
-:1039E000000004F30000002C00200A2D000000005D
-:1039F0000004000018E00C11000004E200000001C7
-:103A000000333E2F00000000000021690020441117
-:103A1000000000000000000000204802000000003C
-:103A20000000000000204803000000000000000823
-:103A300000300A220000000000000000C020480002
-:103A40000000000000000000C0204800000000004E
-:103A50000000216900204411000000000000000067
-:103A60000020480200000000000000000020480381
-:103A7000000000000000000800300A2200000000E2
-:103A800000000000C020480000000000000000000E
-:103A9000D8C04800000004D600002169002044116D
-:103AA00000000000000000000020480200000000AC
-:103AB0000000000000204803000000000000000893
-:103AC00000300A220000000000000000C020480072
-:103AD0000000000000000000C020480000000000BE
-:103AE0000000002D0020122D00000000000000004A
-:103AF00000290C830000000000002169002044110F
-:103B0000000000000000000000204802000000004B
-:103B10000000000000204803000000000000000832
-:103B200000300A220000000000000000C020480011
-:103B30000000000000000000C0204800000000005D
-:103B4000000000110021022400000000000000001D
-:103B500014C0000000000000000000000040000051
-:103B60000000049D0000002CC02036200000000052
-:103B70000000002DC0403620000000000000000FB3
-:103B800000210221000000000000000014C000001D
-:103B9000000004F800000000006000000000000BBE
-:103BA00000000000D900000000000000000000003C
-:103BB000C040040000000001B500000000204411D6
-:103BC000000000000000200000204811000000005C
-:103BD000B600000000204411000000000000A0001A
-:103BE0000020481100000000B70000000020441130
-:103BF000000000000000C00000204811000000008C
-:103C0000B800000000204411000000000000F8E0AF
-:103C10000020481100000000B900000000204411FD
-:103C2000000000000000F8800020481100000000A3
-:103C3000BA00000000204411000000000000E00075
-:103C40000020481100000000BB00000000204411CB
-:103C5000000000000000F0000020481100000000FB
-:103C6000BC00000000204411000000000000F3FC34
-:103C700000204811000000008100000000204411D5
-:103C800000000000000000020020481100000000B9
-:103C9000000000FF00280E300000000000000000BF
-:103CA000002F022300000000000000000CC00000F4
-:103CB0000000050C00000000C0200800000000000B
-:103CC0000000000014C000000000052100000000FA
-:103CD00000200C11000000000000001C0020362312
-:103CE000000000000000002B002036230000000030
-:103CF00000000029002036230000000000000028FA
-:103D000000203623000000000000001700203623AA
-:103D10000000000000000025002036230000000005
-:103D200000000026002036230000000000000015DF
-:103D3000002036230000000000000016002036237B
-:103D400000000000FFFFE00000200C110000000058
-:103D500000000021002036230000000000000022A7
-:103D6000002036230000000000001FFF00200C117F
-:103D700000000000000000230020362300000000A7
-:103D8000000000240020362300000000F1FFFFFFA8
-:103D900000283A2E000000000000001AC0220E2069
-:103DA00000000000000000000029386E0000000044
-:103DB0008100000000204411000000000000000607
-:103DC00000204811000000000000002A402036209A
-:103DD00000000000870000000020441100000000E7
-:103DE00000000000C0204800000000000000A1F416
-:103DF00000204411000000000000000000204810D6
-:103E0000000000000000000000200C110000000075
-:103E10000000003000203623000000009D0000005C
-:103E200000204411000000000000001F40214A2033
-:103E30000000000096000000002044110000000077
-:103E400000000000C020480000000000000000004A
-:103E5000C0200C000000000000000000C020100086
-:103E6000000000000000001F0021162400000000D8
-:103E70000000000014C00000000000000000001D51
-:103E800000203623000000000000000300281E234D
-:103E900000000000000000080022222300000000B3
-:103EA000FFFFF000002822280000000000000000B2
-:103EB000002920E8000000000000001F0020362834
-:103EC000000000000000001800211E230000000078
-:103ED0000000002000203627000000000000000243
-:103EE000002216240000000000000000003014A88A
-:103EF000000000000000001E002036250000000029
-:103F00000000000300211A2400000000100000003F
-:103F100000281A2600000000EFFFFFFF00283A2EBD
-:103F20000000000000000000004938CE0000066AD2
-:103F30000000000140280A200000000000000006E8
-:103F400040280E200000000000000300C0281220BE
-:103F50000000000000000008002112240000000002
-:103F600000000000C020162000000000000000003B
-:103F7000C0201A20000000000000000000210222E2
-:103F8000000000000000000014C0000000000559FF
-:103F9000810000000020441100000000000000012A
-:103FA00000204811000000000000225800300A24C0
-:103FB0000000000000040000006946220000067CAA
-:103FC00000002169002044110000000000000000F2
-:103FD00000204805000000000002000000294A26D9
-:103FE0000000000000000000002048100000000059
-:103FF000CAFEBABE00204811000000000000000206
-:10400000002F022300000000000000000CC0000090
-:104010000000056100000000C0201C10000000002E
-:1040200000000000C04000000000056F000000021A
-:10403000002F022300000000000000000CC0000060
-:104040000000056181000000002044110000000014
-:10405000000000010020481100000000000022586C
-:1040600000300A240000000000040000006946221D
-:104070000000067C00000000C0201C1000000000B2
-:1040800000000000C04000000000056F00000000BC
-:10409000002F022300000000000000000CC0000000
-:1040A0000000056500000000C0201C0000000000AA
-:1040B00000000000C04000000000056F0000000488
-:1040C000002F022300000000000000000CC00000D0
-:1040D0000000056D81000000002044110000000078
-:1040E0000000000000204811000000000000216DC9
-:1040F000002044110000000000000000C020480023
-:104100000000000000000000C060480000000681C0
-:104110000000000000401C100000056F00000000BF
-:10412000C02000000000000000000000C0400000AF
-:1041300000000000000000000EE00000000005711B
-:104140000000000000600000000005BC000000004E
-:10415000002F022400000000000000000CC000003E
-:10416000000005820000A2B70020441100000000FA
-:10417000000000000020480700000000810000004F
-:104180000020441100000000000000010020481140
-:10419000000000000004A2B6006044110000067C8C
-:1041A0000000001A0021223000000000000000067C
-:1041B00000222630000000000004200400604411AA
-:1041C0000000067C0000A2C4002044110000000092
-:1041D00000000000003048E900000000000000007E
-:1041E00000E00000000005800000A2D10020441182
-:1041F000000000000000000000404808000000002F
-:104200000000A2D1002044110000000000000001C5
-:1042100000504A280000000000000001002F022486
-:1042200000000000000000000CC00000000005932A
-:104230000000A2BB002044110000000000000000AC
-:104240000020480700000000810000000020441109
-:1042500000000000000000010020481100000000E4
-:104260000004A2BA006044110000067C0000001A9D
-:10427000002122300000000000000006002226304D
-:104280000000000000042004006044110000067CCF
-:104290000000A2C500204411000000000000000042
-:1042A000003048E9000000000000000000E00000CD
-:1042B000000005910000A2D200204411000000007F
-:1042C0000000000000404808000000000000A2D2EA
-:1042D00000204411000000000000000100504A28A6
-:1042E0000000000000000002002F02240000000077
-:1042F000000000000CC00000000005A40000A2BFE8
-:1043000000204411000000000000000000204807C9
-:1043100000000000810000000020441100000000A7
-:104320000000000100204811000000000004A2BEAF
-:10433000006044110000067C0000001A00212230B9
-:1043400000000000000000060022263000000000EF
-:1043500000042004006044110000067C0000A2C696
-:10436000002044110000000000000000003048E977
-:10437000000000000000000000E00000000005A2B6
-:104380000000A2D300204411000000000000000043
-:1043900000404808000000000000A2D300204411A3
-:1043A000000000000000000100504A28000000004A
-:1043B0000000A2C300204411000000000000000023
-:1043C0000020480700000000810000000020441188
-:1043D0000000000000000001002048110000000063
-:1043E0000004A2C2006044110000067C0000001A14
-:1043F00000212230000000000000000600222630CC
-:104400000000000000042004006044110000067C4D
-:104410000000A2C7002044110000000000000000BE
-:10442000003048E9000000000000000000E000004B
-:10443000000005B10000A2D40020441100000000DB
-:104440000000000000404808000000000000A2D466
-:1044500000204411000000000000000100504A2824
-:104460000000000085000000002044110000000052
-:104470000000000000204801000000000000304A59
-:10448000002044110000000001000000002048113D
-:10449000000000000000000000400000000005B720
-:1044A000A4000000C0204411000000000000000033
-:1044B000C04048000000000000000000C060000094
-:1044C000000005BC00000000C04004000000000126
-:1044D0000000002C002036210000000081000000B8
-:1044E00000204411000000000000000600204811D8
-:1044F0000000000000000000002F0230000000005B
-:10450000000000000CC00000000005C30000000017
-:10451000002004110000000000000030004036219F
-:10452000000005D6000000300020062D000000002D
-:1045300000007E00002806210000000000000000AE
-:10454000002F022100000000000000000CE000002D
-:10455000000005D68100000000204411000000008A
-:104560000000000100204811000000000004A0929B
-:10457000006044110000067C00000031002036304D
-:10458000000000000004A093006044110000067CBD
-:104590000000003200203630000000000004A2B607
-:1045A000006044110000067C00000033002036301B
-:1045B000000000000004A2BA006044110000067C64
-:1045C0000000003400203630000000000004A2BECD
-:1045D000006044110000067C0000003500203630E9
-:1045E000000000000004A2C2006044110000067C2C
-:1045F00000000036002036300000000000042004D7
-:10460000006044110000067C0001A2A400204411B7
-:10461000000000000000003F0020481100000000E2
-:104620000000003F00204811000000000000003F93
-:1046300000204811000000000000003F0020481149
-:1046400000000000000000050020481100000000EC
-:104650000000A1F400204411000000000000000050
-:1046600000204811000000008800000000204411D4
-:1046700000000000000000010020481100000000C0
-:10468000810000000020441100000000000000062E
-:10469000002048110000000000000001002F02303F
-:1046A00000000000000000000CE000000000061FF9
-:1046B000000000300020062D000000000000000077
-:1046C000002F022100000000000000000CE00000AC
-:1046D0000000061F810000000020441100000000BF
-:1046E00000000001002048110000000000007E00D2
-:1046F000002806210000000000000000002F022119
-:1047000000000000000000000CE00000000005F8C0
-:104710000000A092002044110000000000000031C1
-:1047200000204A2D000000000000A093002044114A
-:10473000000000000000003200204A2D00000000B0
-:104740000000A2B600204411000000000000003369
-:1047500000204A2D000000000000A2BA00204411F1
-:10476000000000000000003400204A2D000000007E
-:104770000000A2BE0020441100000000000000352F
-:1047800000204A2D000000000000A2C200204411B9
-:10479000000000000000003600204A2D000000004C
-:1047A000000000300020062D00000000000001FF86
-:1047B000002806210000000000000000002F022158
-:1047C00000000000000000000CE000000000061ED9
-:1047D0000000000000210221000000000000000095
-:1047E00014C00000000006010004A0030060441192
-:1047F0000000067C0000A00300204411000000001F
-:10480000000000000020481000000000000000012F
-:1048100000210621000000000000000014C000007C
-:10482000000006060004A010006044110000067C91
-:104830000000A01000204411000000000000000053
-:1048400000204810000000000000000100210621A7
-:104850000000000000000000002F02210000000006
-:10486000000000000CE000000000061E0004A01183
-:10487000006044110000067C0000A01100204411DB
-:1048800000000000000000000020481000000000B0
-:104890000004A012006044110000067C0000A01279
-:1048A000002044110000000000000000002048101B
-:1048B000000000000004A013006044110000067C0A
-:1048C0000000A013002044110000000000000000C0
-:1048D00000204810000000000004A01400604411F3
-:1048E0000000067C0000A01400204411000000001D
-:1048F0000000000000204810000000000004A01587
-:10490000006044110000067C0000A0150020441146
-:10491000000000000000000000204810000000001F
-:104920000004A016006044110000067C0000A016E0
-:10493000002044110000000000000000002048108A
-:10494000000000000004A017006044110000067C75
-:104950000000A0170020441100000000000000002B
-:1049600000204810000000000004200400604411F2
-:104970000000067C0000002C0080062D00000000D6
-:10498000FF000000002044110000000000000000B3
-:104990000020481100000000000000010020481124
-:1049A000000000000000000200804811000000002C
-:1049B000000000000EE000000000063000000030A3
-:1049C0000020062D00000000000000020028062143
-:1049D0000000000000000000002F02210000000085
-:1049E000000000000CE000000000062E8100000026
-:1049F00000204411000000000000000100204811C8
-:104A00000000000000042004006044110000067C47
-:104A10000000100000200811000000000000002B22
-:104A200000203622000000000000000000600000AE
-:104A3000000006340000000000600000000005BC1B
-:104A40009800000000204411000000000000000059
-:104A5000008048110000000000000000C06000005D
-:104A60000000063400000000C04004000000000107
-:104A70000000A2A400204411000000000000002259
-:104A800000204811000000008900000000204411AF
-:104A90000000000000000001004048110000062056
-:104AA00097000000002044110000000000000000FA
-:104AB00000204811000000008A000000002044117E
-:104AC0000000000000000000004048110000062027
-:104AD00000000000006000000000064D0001A2A4DC
-:104AE000C0204411000000000000001600604811C2
-:104AF0000000036A000020100020441100000000A4
-:104B000000010000002048110000000081000000AA
-:104B100000204411000000000000000100204811A6
-:104B2000000000000000217C002044110000000073
-:104B3000098000000020481100000000FFFFFFFF77
-:104B40000020481100000000000000000020481173
-:104B5000000000000000000017000000000000003E
-:104B60000004217F006044110000067C0000001F4B
-:104B700000210230000000000000000014C000000E
-:104B8000000000000000000400404C110000064737
-:104B900000000000004000000000000000000017BE
-:104BA00000201E2D000000000000000400291E2728
-:104BB0000000000000000017008036270000000001
-:104BC0000000001700201E2D00000000FFFFFFFB6B
-:104BD00000281E2700000000000000170080362774
-:104BE000000000000000001700201E2D0000000043
-:104BF0000000000800291E27000000000000001728
-:104C000000803627000000000000001700201E2D45
-:104C100000000000FFFFFFF700281E270000000033
-:104C20000000001700803627000000000001A2A449
-:104C30000020441100000000000000160060481130
-:104C40000000036A00002010002044110000000052
-:104C50000001000000204811000000000000217C3D
-:104C600000204411000000000180000000204811D5
-:104C700000000000FFFFFFFF0020481100000000BF
-:104C800000000000002048110000000000000000AB
-:104C90001700000000000000810000000020441107
-:104CA000000000000000000100204811000000008A
-:104CB0000004217F006044110000067C0000001FFA
-:104CC00000210230000000000000000014C00000BD
-:104CD0000000067B0000001000404C11000006613F
-:104CE00000000000C02004000000000000000000E0
-:104CF00038C00000000000000000001D00200A2D48
-:104D0000000000000000001E00200E2D000000002A
-:104D10000000001F0020122D0000000000000020F5
-:104D20000020162D00000000000021690020441121
-:104D30000000000000000000002048040000000007
-:104D400000000000002048050000000000000000F6
-:104D50000020480100000000CAFEBABE0020481131
-:104D600000000000000000040030122400000000D9
-:104D700000000000002F00640000000000000000A0
-:104D80000CC000000000067A0000000300281A2270
-:104D900000000000000000080022122200000000B5
-:104DA000FFFFF000002812240000000000000000B7
-:104DB000002910C4000000000000001F004036243D
-:104DC0000000000000000000008000000000000063
-:104DD000000000001AC000000000067C9F000000D8
-:104DE0000020441100000000CAFEBABE0020481195
-:104DF00000000000000000001AE000000000067F34
-:104E00000000000000800000000000000000000022
-:104E10001AC00000000006819E000000002044111E
-:104E200000000000CAFEBABE0020481100000000C9
-:104E3000000000001AE000000000068400000000EE
-:104E40000080000000000000000000000060000082
-:104E50000000000B000010000060041100000315AA
-:104E6000000000000020041100000000000000000D
-:104E700000600811000001B20000225C0020441113
-:104E800000000000000000030020481100000000A6
-:104E90000000225600204411000000000000001B0A
-:104EA00000204811000000000000A1FC0020441177
-:104EB0000000000000000001002048110000000078
-:104EC0000001A1FDC02044110000000000000021ED
-:104ED00000201E2D000000000000001000221E27F0
-:104EE00000000000000000240020222D000000002F
-:104EF0000000FFFF00282228000000000000000042
-:104F000000294907000000000000000000204811AF
-:104F100000000000000000220020222D0000000000
-:104F20000000FFFF00282228000000000000000011
-:104F3000002949070000000000000000002048117F
-:104F4000000000000000002300201E2D00000000D3
-:104F50000000001000221E270000000000000000DA
-:104F6000002949070000000000000000004048112F
-:104F70000000000000000000000000000000000031
-:104F80000000000000000000000000000000000021
-:104F90000000000000000000000000000000000011
-:104FA0000000000000000000000000000000000001
-:104FB00000000000000000000000000000000000F1
-:104FC00000000000000000000000000000000000E1
-:104FD00000000000000000000000000000000000D1
-:104FE00000000000000000000000000000000000C1
-:104FF00000000000000000000000000000000000B1
-:1050000000000000000000000000000000000000A0
-:105010000000000000000000000000000000000090
-:105020000000000000000000000000000000000080
-:105030000000000000000000000000000000000070
-:105040000000000000000000000000000000000060
-:105050000000000000000000000000000000000050
-:105060000000000000000000000000000000000040
-:105070000000000000000000000000000000000030
-:105080000000000000000000000000000000000020
-:105090000000000000000000000000000000000010
-:1050A0000000000000000000000000000000000000
-:1050B00000000000000000000000000000000000F0
-:1050C00000000000000000000000000000000000E0
-:1050D00000000000000000000000000000000000D0
-:1050E00000000000000000000000000000000000C0
-:1050F00000000000000000000000000000000000B0
-:10510000000000000000000000000000000000009F
-:10511000000000000000000000000000000000008F
-:10512000000000000000000000000000000000007F
-:10513000000000000000000000000000000000006F
-:10514000000000000000000000000000000000005F
-:10515000000000000000000000000000000000004F
-:10516000000000000000000000000000000000003F
-:10517000000000000000000000000000000000002F
-:10518000000000000000000000000000000000001F
-:10519000000000000000000000000000000000000F
-:1051A00000000000000000000000000000000000FF
-:1051B00000000000000000000000000000000000EF
-:1051C00000000000000000000000000000000000DF
-:1051D00000000000000000000000000000000000CF
-:1051E00000000000000000000000000000000000BF
-:1051F00000000000000000000000000000000000AF
-:10520000000000000000000000000000000000009E
-:10521000000000000000000000000000000000008E
-:10522000000000000000000000000000000000007E
-:10523000000000000000000000000000000000006E
-:10524000000000000000000000000000000000005E
-:10525000000000000000000000000000000000004E
-:10526000000000000000000000000000000000003E
-:10527000000000000000000000000000000000002E
-:10528000000000000000000000000000000000001E
-:10529000000000000000000000000000000000000E
-:1052A00000000000000000000000000000000000FE
-:1052B000014204F505B302500000000001C301687B
-:1052C000043505B300000000022502090250015117
-:1052D000000000000223024502A00241000000007D
-:1052E00003CD05B305B305B300000000063C063D41
-:1052F000031F05B30000000005B305B803200340F9
-:1053000000000000032A0282034203340000000070
-:1053100005B305B305B305B30000000005B30544AC
-:1053200005B305B30000000003B205B304AE0344A7
-:1053300000000000048D0443043305B300000000A6
-:1053400004C305B3043704D000000000044304FA8A
-:10535000035103710000000005B305B305B305B3A5
-:105360000000000005B305B305B305B3000000005D
-:1053700005B305B3063205BA0000000005B305B356
-:10538000000705B30000000005B305B305B305B37E
-:105390000000000005B305B305B305B3000000002D
-:1053A00003EE03E303FE03FC00000000040404001A
-:1053B00004020406000000000412040E041A04167D
-:1053C000000000000422041E042A0426000000003D
-:1053D00005B305B3042E05B30000000005B305B303
-:1053E00005B305B30000000005B305B305B305B36D
-:1053F00000000000000206680686000600000000AB
-:00000001FF
diff --git a/firmware/radeon/RV670_pfp.bin.ihex b/firmware/radeon/RV670_pfp.bin.ihex
deleted file mode 100644
index f55292c97b79..000000000000
--- a/firmware/radeon/RV670_pfp.bin.ihex
+++ /dev/null
@@ -1,145 +0,0 @@
-:1000000000CA040000A00000007E828B007C038BED
-:10001000008001B8007C038B00D4401E00EE001E5F
-:1000200000CA040000A00000007E828B00C41838C3
-:1000300000CA240000CA2800009581A800C41C3A08
-:1000400000C3C00000CA080000CA0C00007C744B4A
-:1000500000C200050099C00000C41C3A007C744C2A
-:1000600000C0FFF000042C0400309002007D250049
-:1000700000351402007D350B00255403007CD5802B
-:1000800000259C030095C00400D5001B007EDDC147
-:10009000007D9D8000D6801B00D5801B00D4401EB3
-:1000A00000D5401E00D6401E00D6801E00D4801E03
-:1000B00000D4C01E009783D300D5C01E00CA08001C
-:1000C0000080001A00CA0C0000E4011E00D4001ECB
-:1000D0000080000C00C4183800E4013E00D4001E6B
-:1000E0000080000C00C4183800D4401E00EE001E32
-:1000F00000CA040000A00000007E828B00E4011E04
-:1001000000D4001E00D4401E00EE001E00CA0400F1
-:1001100000A00000007E828B00E4013E00D4001E9F
-:1001200000D4401E00EE001E00CA040000A0000023
-:10013000007E828B00CA180000D4401E00D5801EAD
-:100140000080005300D4007500D4401E00CA08008F
-:1001500000CA0C0000CA100000D4801900D4C018D6
-:1001600000D5001700D4801E00D4C01E00D5001E8C
-:1001700000E2001E00CA040000A00000007E828B86
-:1001800000CA080000D4806000D4401E0080000037
-:1001900000D4801E00CA080000D4806100D4401E34
-:1001A0000080000000D4801E00CA080000CA0C00B5
-:1001B00000D4401E00D4801600D4C01600D4801E87
-:1001C000008001B800D4C01E00C6084300CA0C005D
-:1001D00000CA10000094800400CA140000E420F358
-:1001E00000D4201300D5606500D4E01C00D5201C8D
-:1001F00000D5601C008000000006200100C60843F6
-:1002000000CA0C0000CA1000009483F700CA140052
-:1002100000E420F30080007900D4201300C60843D6
-:1002200000CA0C0000CA1000009883EF00CA140036
-:1002300000D400640080008D0000000000C414326F
-:1002400000C6184300C4082F0095400500C40C30B8
-:1002500000D4401E0080000000EE001E009583F5D3
-:1002600000C4103100D4403300D5206500D4A01C58
-:1002700000D4E01C00D5201C00E4015E00D4001E68
-:10028000008000000006200100CA1800000A2001BA
-:1002900000D6007600C408360098800700C61045D6
-:1002A0000095011000D4001F00D46062008000009F
-:1002B00000D4206200CC383500CC1433008401BB5C
-:1002C00000D4007200D5401E0080000000EE001E29
-:1002D00000E2001A008401BB00E2001A00CC104BBF
-:1002E00000CC0447002C9401007D098B0098400548
-:1002F000007D15CB00D4001A008001B800D4006D39
-:100300000034440100CC0C480098403A00CC2C4A00
-:100310000095800400CC0449008001B800D4001A84
-:1003200000D4C01A00282801008400F000CC10037B
-:100330000098801B0004380C008400F000CC1003EF
-:100340000098801700043808008400F000CC1003E7
-:100350000098801300043804008400F000CC1003DF
-:100360000098801400CC104C009A800900CC144DE9
-:10037000009840DC00D4006D00CC184800D5001A6D
-:1003800000D5401A008000C900D5801A0096C0D55B
-:1003900000D4006D008001B800D4006E009AC00344
-:1003A00000D4006D00D4006E0080000000EC007FDF
-:1003B000009AC0CC00D4006D008001B800D4006E5B
-:1003C00000CC140300CC180300CC1C03007D910367
-:1003D000007DD583007D190C0035CC1F0035701FC2
-:1003E000007CF0CB007CD08B00880000007E8E8BE0
-:1003F0000095C00400D4006E008001B800D4001A3B
-:1004000000D4C01A00CC080300CC0C0300CC1003AD
-:1004100000CC140300CC180300CC1C0300CC240334
-:1004200000CC28030035C41F0036B01F007C704B81
-:100430000034F01F007C704B0035701F007C704B47
-:10044000007D8881007DCCC1007E5101007E9541F8
-:10045000007C9082007CD4C2007C848B009AC00314
-:10046000007C8C8B002C88010098809E00D4006D4D
-:100470000098409C00D4006E00CC084C00CC0C4D81
-:1004800000CC104800D4801A00D4C01A00800101AA
-:1004900000D5001A00CC083200D40032009482D972
-:1004A00000CA0C0000D4401E0080000000D4001ED2
-:1004B00000E4011E00D4001E00CA080000CA0C009F
-:1004C00000CA100000D4401E00CA140000D4801ED0
-:1004D00000D4C01E00D5001E00D5401E00D54034FB
-:1004E0000080000000EE001E0028040400E2001A54
-:1004F00000E2001A00D4401A00CA380000CC0803F9
-:1005000000CC0C0300CC0C0300CC0C03009882BD83
-:1005100000000000008401BB00D7A06F0080000035
-:1005200000EE001F00CA040000C2FF0000CC083427
-:1005300000C13FFF007C74CB007CC90B007D010F24
-:10054000009902B0007C738B008401BB00D7A06FC0
-:100550000080000000EE001F00CA080000281900FB
-:10056000007D898B009580140028140400CA0C00BB
-:1005700000CA100000CA1C0000CA240000E2001FCC
-:1005800000D4C01A00D5001A00D5401A00CC1803B8
-:1005900000CC2C0300CC2C0300CC2C03007DA58BBD
-:1005A000007D9C4700984297000000000080016198
-:1005B00000D4C01A00D4401E00D4801E0080000069
-:1005C00000EE001E00E4011E00D4001E00D4401EF8
-:1005D00000EE001E00CA040000A00000007E828B16
-:1005E00000E4013E00D4001E00D4401E00EE001EB8
-:1005F00000CA040000A00000007E828B00CA080030
-:1006000000248C06000CCC060098C00600CC104ECE
-:100610000099000400D4007300E4011E00D4001E01
-:1006200000D4401E00D4801E0080000000EE001E9A
-:1006300000CA080000CA0C000034D01800251001C0
-:100640000095002100C17FFF00CA100000CA1400FD
-:1006500000CA180000D4801D00D4C01D007DB18BDD
-:1006600000C1420200C2C00100D5801D0034DC0E72
-:10067000007D5D4C007F734C00D7401E00D5001EEE
-:1006800000D5401E00C1420000C2C00000099C010C
-:100690000031DC10007F5F4C007F734C00042802A7
-:1006A000007D838000D5A86F00D5806600D7401EEE
-:1006B00000EC005E00C8240200C82402008001B8DB
-:1006C00000D6007600D4401E00D4801E00D4C01E88
-:1006D0000080000000EE001E0080000000EE001F01
-:1006E00000D4001F0080000000D4001F00D4001FB1
-:1006F0000088000000D4001F00000000000000007F
-:1007000000000000000000000000000000000000E9
-:1007100000000000000000000000000000000000D9
-:1007200000000000000000000000000000000000C9
-:1007300000000000000000000000000000000000B9
-:1007400000000000000000000000000000000000A9
-:100750000000000000000000000000000000000099
-:100760000000000000000000000000000000000089
-:100770000000000000000000000000000000000079
-:100780000000000000000000000000000000000069
-:100790000000000000000000000000000000000059
-:1007A0000000000000000000000000000000000049
-:1007B0000000000000000000000000000000000039
-:1007C0000000000000000000000000000000000029
-:1007D0000000000000000000000000000000000019
-:1007E0000000000000000000000000000000000009
-:1007F00000000000000000000000000000000000F9
-:1008000000010171000201780003008F0004007FE5
-:10081000000500030006003F000700320008012C1D
-:1008200000090046000A0036001001B6001700A2B9
-:100830000022013A00230149002000B400240125D0
-:100840000027004D0028006A002A0060002B00529B
-:10085000002F0065003200870034017F003C015604
-:10086000003F00720041018C0044012E00550173CD
-:100870000056017A0060000B00610034006200380D
-:1008800000630038006400380065003800660038F6
-:10089000006700380068003A00690041006A0048BB
-:1008A000006B0048006C0048006D0048006E004876
-:1008B000006F00480000000600000006000000066F
-:1008C0000000000600000006000000060000000610
-:1008D0000000000600000006000000060000000600
-:1008E00000000006000000060000000600000006F0
-:1008F00000000006000000060000000600000006E0
-:00000001FF
diff --git a/firmware/radeon/RV710_me.bin.ihex b/firmware/radeon/RV710_me.bin.ihex
deleted file mode 100644
index 5cdfe306eea5..000000000000
--- a/firmware/radeon/RV710_me.bin.ihex
+++ /dev/null
@@ -1,341 +0,0 @@
-:10000000CC0003EA04080003CC8000437C4080005D
-:10001000A0000000CC80006280000003D040007F80
-:1000200080000003CC4000417C40C000C0160004AA
-:1000300030D03FFF7D15000CCC11000028D8001EE9
-:100040003198000128DC001FC820000495C000067C
-:100050007C424000CC0000627E56800CCC2900001F
-:10006000C82400047E26000B958000067C42C00058
-:10007000CC0000627ED7000CCC310000C82C0004FC
-:100080007E2E000CCC00006231103FFF8000000388
-:10009000CE1100007C40C00080000003CC40004036
-:1000A00080000003CC4122577C418000CC400045B9
-:1000B000CC400048CC41225CCC41A1FC7C4080007B
-:1000C000A0000000CC800062CC400045CC4000483D
-:1000D0007C40C000CC41225CCC41A1FC7C40800033
-:1000E000A0000000CC800062CC000045CC0000489D
-:1000F000CC41225CCC41A1FC7C408000A0000000EF
-:10010000CC800062040CA1FDC0120001CC000045AF
-:10011000CC0000487CD0C00CCC41225CCC41A1FC7E
-:10012000D04D00007C408000A0000000CC80006228
-:1001300080000003CC41225D7C4080007C40C000F8
-:10014000C02A00027C4100007D29000C309400018F
-:1001500030980006309C030029DC00087C42000037
-:100160007C4240009540000FC02E000405F022584C
-:100170007F2F000CCC310000C8280004CCC12169BD
-:10018000CD01216ACE81216B0DB40002CC01216C1E
-:100190009740000E0DB400008000007DC834000AB6
-:1001A0000DB40002974000090DB40000C02E0004F9
-:1001B00005F022587F2F000CCC310000C828000425
-:1001C0008000007DC834000A974000047E02800051
-:1001D0008000007DC834000A0DB400049740FF8CF5
-:1001E00000000000CE01216DCE41216EC828000321
-:1001F000C834000A9B400004043C00058400026DE2
-:10020000CC0000620DF400009740000BC82C03E600
-:10021000CE81A2B7C03000067EF34028C030002057
-:100220007F6B80207FB3C029CF81A2C480000003F0
-:10023000CFC1A2D10DF400019740000BC82C03E7F9
-:10024000CE81A2BBC03000067EF34028C030002023
-:100250007F6B80207FB3C029CF81A2C580000003BF
-:10026000CFC1A2D20DF400029740000BC82C03E8C6
-:10027000CE81A2BFC03000067EF34028C0300020EF
-:100280007F6B80207FB3C029CF81A2C6800000038E
-:10029000CFC1A2D3C82C03E9CE81A2C3C0300006CF
-:1002A0007EF34028C03000207F6B80207FB3C029C0
-:1002B000CF81A2C780000003CFC1A2D48000000379
-:1002C000CC4000427C40C0007C4100002914001D4D
-:1002D000315400019940000C31181000C81C001165
-:1002E00095C00000C81C0011CCC12100CD01210126
-:1002F000CCC12102CD012103041800048000037E3B
-:10030000CD81A2A4C02A00049580000836A821A3AC
-:10031000CC290000C8280004C81C00110DE40040CE
-:100320009640FFFFC81C0011CCC12170CD01217186
-:10033000C820001296000000C82000128000037E32
-:10034000CC0000647C40C0007C410000CC00004533
-:10035000CC00004840D40003CD41225CCD01A1FC7B
-:10036000C01A0001041CA1FD7DD9C00C7C42000014
-:1003700008CC00010624000106280002CE1D000062
-:10038000CE5D000098C0FFFACE9D00007C4080004A
-:10039000A0000000CC8000627C40C00030D0000192
-:1003A00028CC00017C414000950000067C41800083
-:1003B000CD41216DCD81216E800000F4C81C000369
-:1003C000C02200047E16000CCC210000C81C0004D2
-:1003D0007C42400098C000047C4280008000000302
-:1003E000CDE50000CE412169CE81216ACDC1216BCE
-:1003F00080000003CC01216C7C40C0007C410000E7
-:100400007C4140007C4180007C41C00028A4000861
-:10041000326400FF0E68003C9680000A7C020000F7
-:100420007C4200001E300003CC00006A9B000003E9
-:100430004220000504200040800001117C024000A1
-:100440007E0240009A4000000A64000130EC001077
-:100450009AC0000ACC000062C02A0004C82C002107
-:100460007E92800CCC000041CC290000CEC000213F
-:1004700080000121C8300004CD01216DCD41216EE5
-:10048000C83000037F1F000B30F4000727780001FD
-:100490009740002A07B801269F8000000000000056
-:1004A000800001367F1B80048000013A7F1B80059D
-:1004B0008000013E7F1B8002800001427F1B800381
-:1004C000800001467F1B80078000014A7F1B800659
-:1004D0008000014F28A400089B80001928A4000870
-:1004E0008000015F326400FF9B80001528A4000893
-:1004F0008000015F326400FF9B80001128A4000887
-:100500008000015F326400FF9B80000D28A400087A
-:100510008000015F326400FF9B80000928A400086E
-:100520008000015F326400FF9B80000528A4000862
-:100530008000015F326400FF28A40008326400FFDD
-:100540000E68003C9A80FEB228EC00087C43400014
-:100550007C4380007C43C00096C00007CC00006252
-:10056000CF412169CF81216ACFC1216B8000000377
-:10057000CC01216C80000003CFF50000CC00006BA3
-:10058000840003810E68003C9A800004C82800158E
-:1005900080000003D040007F9680FFAB7E024000C9
-:1005A0008400023BC00E0002CC00004180000239F2
-:1005B000CCC1304A7C40C0007C410000C01E00011C
-:1005C00029240012C022000296400005C026000423
-:1005D000C027FFFB7D25000BC02600007DD2800BCD
-:1005E0007E12C00B7D25000C7C4140007C418000C8
-:1005F000CCC121699A80000ACD01216ACD41216BCD
-:1006000096C0FE83CD81216CC83000189700000091
-:10061000C830001880000003CC000018840003815B
-:10062000CC00007FC8140013C8180014CD41216B02
-:1006300096C0FE77CD81216C80000183C830001800
-:10064000C80C000898C00000C80C00087C410000DD
-:1006500095000002000000007C414000C820000915
-:10066000CC400043CE01A1F4CC400044C00E800039
-:100670007C4240007C4280002AAC001F96C0FE6491
-:10068000C035F000CE4003E232780003267C00083B
-:100690007FF7C00B7FFBC00C2A780018CFC003E3A4
-:1006A000CF8003E426B000027F3F0000CF0003E5C7
-:1006B0008000031F7C80C0007C40C00028D0000860
-:1006C0003110000F9500000F2528000106A801B485
-:1006D0009E80000000000000800001D5C0120800CC
-:1006E000800001E3C814000F800001EAC814001064
-:1006F000800001F1CCC1A2A4800001FAC81400114D
-:1007000030D0003F0D2800159A8000120D28001EE1
-:100710009A80001E0D2800209A8000230D24000FCF
-:100720000D2800107E6A800C9A8000260D2000049F
-:100730000D2400140D2800287E62400C7EA6800C3B
-:100740009A80002AC814001180000003CCC1A2A422
-:10075000C01208007C4140007D0CC00CC012000893
-:1007600029580003295C000C7C4200007DD1C00B9D
-:10077000262000147E1E400C7E4E800CCE81A2A44A
-:1007800080000003CD81A1FEC814000F0410210ECB
-:1007900095400000C814000FD051000080000003F5
-:1007A000CCC1A2A4C8140010041021089540000078
-:1007B000C8140010D051000080000003CCC1A2A4D6
-:1007C000CCC1A2A404100001CD0000198400038153
-:1007D000CC00007FC810001999000000C810001953
-:1007E000800000047C40800004102100954000003F
-:1007F000C8140011D05100008000037ECCC1A2A417
-:100800007C40C000CC40000D94C0FE01CC40000EE6
-:100810007C4100009500000508CC0001C8140005CB
-:10082000994000140000000098C0FFFB7C410000CC
-:10083000800000047D008000C81400057C40C000DA
-:100840009940000CC818000C7C4100009580FDF018
-:10085000C820000EC81C000D662000207E1E002C43
-:10086000252400027E62402080000003CCE60000C8
-:100870007C410000CC00006CCC00006DC818001F4B
-:10088000C81C001E659800207DD9C02C7CD4C00CEB
-:10089000CCDE000045DC0004C82800179680000F5D
-:1008A000C00E0001286800082AAC001632A800FF1C
-:1008B0000EB000497F2F000B9700000600000000DB
-:1008C000C81400057C40C000800002237C41000069
-:1008D00080000226D040007F8400023BCC00004113
-:1008E000CCC1304A94000000C83C001A043C00050A
-:1008F000CFC1A2A4C0361F90C0387FFF7C03C010B8
-:100900007F7B400CCF41217CCFC1217DCC01217E5A
-:10091000C03A00040434217F7F7B400CCC350000BA
-:10092000C83C00042BFC001F0438002097C00005C1
-:10093000CC0000629B8000000BB8000180000247E1
-:10094000CC000071CC01A1F404380016C0360002BE
-:10095000CF81A2A488000000CF4120107C40C000BD
-:1009600028D0001C9500000504D40001CD4000658E
-:1009700080000003CD40006809540002800000039D
-:10098000CD4000668400026CC81803EA7C40C000B9
-:100990009980FD9FC814001608D000019940002BD3
-:1009A000CD0000687C408000A0000000CC80006288
-:1009B000043C0005CFC1A2A4CC01A1F484000381B2
-:1009C000CC00004688000000CC00007F8400027E3E
-:1009D000C81803EA7C40C0009980FD8DC814001639
-:1009E00008D0000199400019CD0000687C408000CB
-:1009F000A0000000CC800062043C0022CFC1A2A471
-:100A000084000381CC00004788000000CC00007FF8
-:100A1000C81000169900000DCC400067800000044B
-:100A20007C408000C81803EA9980FD797C40C000B2
-:100A300094C00003C810001699000004CCC00068E0
-:100A4000800000047C4080008400023BC0148000D1
-:100A5000CC000041CD41304AC01480009900000014
-:100A6000C8100016800000047C408000C012000105
-:100A70007C51400C80000003D05500007C40C00039
-:100A80007C4100007C4140007C418000291C001F0B
-:100A9000CCC0004ACD00004B95C00003C01C8000B4
-:100AA000CDC12010DD830000055C2000CC00006279
-:100AB00080000003D81F41007C40C0007C41000042
-:100AC0007C4140007C418000CCC0004CCD00004DFA
-:100AD000DD830000055CA00080000003D81F4100FA
-:100AE0007C40C0007C4100007C4140007C41800093
-:100AF000CCC0004ECD00004FDD830000055CC0007F
-:100B000080000003D81F41007C40C0007C410000F1
-:100B10007C4140007C418000CCC00050CD000051A1
-:100B2000DD830000055CF8E080000003D81F410071
-:100B30007C40C0007C4100007C4140007C41800042
-:100B4000CCC00052CD000053DD830000055CF8806E
-:100B500080000003D81F41007C40C0007C410000A1
-:100B60007C4140007C418000CCC00054CD00005549
-:100B7000DD830000055CE00080000003D81F410019
-:100B80007C40C0007C4100007C4140007C418000F2
-:100B9000CCC00056CD000057DD830000055CF0009E
-:100BA00080000003D81F41007C40C0007C41000051
-:100BB0007C4140007C418000CCC00058CD000059F1
-:100BC000DD830000055CF3FC80000003D81F4100BA
-:100BD000D04320007C408000A0000000CC80006258
-:100BE000D043A0007C408000A0000000CC800062C8
-:100BF000D043C0007C408000A0000000CC80006298
-:100C0000D043F8E07C408000A0000000CC8000626F
-:100C1000D043F8807C408000A0000000CC800062BF
-:100C2000D043E0007C408000A0000000CC80006247
-:100C3000D043F0007C408000A0000000CC80006227
-:100C4000D043F3FC7C408000A0000000CC80006218
-:100C5000C81403E0CC430000CC430000CC430000A8
-:100C60007D45C000CDC30000D04300007C40800023
-:100C7000A0000000CC8000627C40C000C81003E2ED
-:100C8000C81403E5C81803E3C81C03E4CD81216937
-:100C9000CDC1216ACCC1216BCC01216C04200004A0
-:100CA0007DA180007D9640029640FCD9CD8003E373
-:100CB00031280003C02DF000251800087DAD800B01
-:100CC0007DA9800C80000003CD8003E3308CFFFF02
-:100CD000D04D00007C408000A0000000CC8000626D
-:100CE000C8140020155800029580FFFFC81400208A
-:100CF000CC00006ECC4121807C40C000CCC1218D55
-:100D0000CC41218128D0001F34588000CD81218C16
-:100D10009500FCBFCC412182C81400209940FFFF00
-:100D2000C8140020800000047C4080007C40C0008B
-:100D300028D0001831100001C01600809500000373
-:100D4000C02A00047CD4C00CCCC1217CCC41217DC4
-:100D5000CC41217E7C4180001DB0000336A0217F64
-:100D60009B000003419C0005041C004099C000004A
-:100D700009DC0001CC210000C82400042A6C001FFB
-:100D8000419C00059AC0FFFACC80006280000004FC
-:100D90007C4080007C40C00004D403E68000000357
-:100DA000CC5400008000037ECC4003EAC01C8000CD
-:100DB000044CA000CDC120107C410000C8140009E3
-:100DC00004180000041C0008CD80007109DC00013B
-:100DD00005980001CD0D000099C0FFFCCC80006299
-:100DE0008000037ECD400071C00E0100CC000041A8
-:100DF000CCC1304AC83C007FCC00007F800000039B
-:100E0000CC00007FCC00007F88000000CC00007F79
-:100E100000000000000000000000000000000000D2
-:100E200000000000000000000000000000000000C2
-:100E300000000000000000000000000000000000B2
-:100E400000000000000000000000000000000000A2
-:100E50000000000000000000000000000000000092
-:100E60000000000000000000000000000000000082
-:100E70000000000000000000000000000000000072
-:100E80000000000000000000000000000000000062
-:100E90000000000000000000000000000000000052
-:100EA0000000000000000000000000000000000042
-:100EB0000000000000000000000000000000000032
-:100EC0000000000000000000000000000000000022
-:100ED0000000000000000000000000000000000012
-:100EE0000000000000000000000000000000000002
-:100EF00000000000000000000000000000000000F2
-:100F000000000000000000000000000000000000E1
-:100F100000000000000000000000000000000000D1
-:100F200000000000000000000000000000000000C1
-:100F300000000000000000000000000000000000B1
-:100F400000000000000000000000000000000000A1
-:100F50000000000000000000000000000000000091
-:100F60000000000000000000000000000000000081
-:100F70000000000000000000000000000000000071
-:100F80000000000000000000000000000000000061
-:100F90000000000000000000000000000000000051
-:100FA0000000000000000000000000000000000041
-:100FB0000000000000000000000000000000000031
-:100FC0000000000000000000000000000000000021
-:100FD0000000000000000000000000000000000011
-:100FE0000000000000000000000000000000000001
-:100FF00000000000000000000000000000000000F1
-:1010000000000000000000000000000000000000E0
-:1010100000000000000000000000000000000000D0
-:1010200000000000000000000000000000000000C0
-:1010300000000000000000000000000000000000B0
-:1010400000000000000000000000000000000000A0
-:101050000000000000000000000000000000000090
-:101060000000000000000000000000000000000080
-:101070000000000000000000000000000000000070
-:101080000000000000000000000000000000000060
-:101090000000000000000000000000000000000050
-:1010A0000000000000000000000000000000000040
-:1010B0000000000000000000000000000000000030
-:1010C0000000000000000000000000000000000020
-:1010D0000000000000000000000000000000000010
-:1010E0000000000000000000000000000000000000
-:1010F00000000000000000000000000000000000F0
-:1011000000000000000000000000000000000000DF
-:1011100000000000000000000000000000000000CF
-:1011200000000000000000000000000000000000BF
-:1011300000000000000000000000000000000000AF
-:10114000000000000000000000000000000000009F
-:10115000000000000000000000000000000000008F
-:10116000000000000000000000000000000000007F
-:10117000000000000000000000000000000000006F
-:10118000000000000000000000000000000000005F
-:10119000000000000000000000000000000000004F
-:1011A000000000000000000000000000000000003F
-:1011B000000000000000000000000000000000002F
-:1011C000000000000000000000000000000000001F
-:1011D000000000000000000000000000000000000F
-:1011E00000000000000000000000000000000000FF
-:1011F00000000000000000000000000000000000EF
-:1012000000000000000000000000000000000000DE
-:1012100000000000000000000000000000000000CE
-:1012200000000000000000000000000000000000BE
-:1012300000000000000000000000000000000000AE
-:10124000000000000000000000000000000000009E
-:10125000000000000000000000000000000000008E
-:10126000000000000000000000000000000000007E
-:10127000000000000000000000000000000000006E
-:10128000000000000000000000000000000000005E
-:10129000000000000000000000000000000000004E
-:1012A000000000000000000000000000000000003E
-:1012B000000000000000000000000000000000002E
-:1012C000000000000000000000000000000000001E
-:1012D000000000000000000000000000000000000E
-:1012E00000000000000000000000000000000000FE
-:1012F00000000000000000000000000000000000EE
-:1013000000000000000000000000000000000000DD
-:1013100000000000000000000000000000000000CD
-:1013200000000000000000000000000000000000BD
-:1013300000000000000000000000000000000000AD
-:10134000000000000000000000000000000000009D
-:10135000000000000000000000000000000000008D
-:10136000000000000000000000000000000000007D
-:10137000000000000000000000000000000000006D
-:10138000000000000000000000000000000000005D
-:10139000000000000000000000000000000000004D
-:1013A000000000000000000000000000000000003D
-:1013B000000000000000000000000000000000002D
-:1013C000000000000000000000000000000000001D
-:1013D000000000000000000000000000000000000D
-:1013E00000000000000000000000000000000000FD
-:1013F00000000000000000000000000000000000ED
-:101400000001033300100006001700080021000A45
-:101410000027002A002800250029002B002A002888
-:10142000002B002B002D003A002E0041002F004C15
-:101430000034004E00360032003900B1003A00D1CD
-:10144000003B00E6003C00FE003D016D003F00AFA8
-:10145000004103380043034B00440190004500FE67
-:10146000004601AE004701AE004802000049020EEE
-:10147000004A0257004B028400520261005302737B
-:10148000005402890057029B0060029F006102AE77
-:10149000006202B8006302C2006402CC006502D69A
-:1014A000006602E0006702EA006802F4006902F8E0
-:1014B000006A02FC006B0300006C0304006D03086B
-:1014C000006E030C006F03100070031400720365BC
-:1014D0000074036B00790369007C031E000F037A1C
-:1014E000000F037A000F037A000F037A000F037ACC
-:1014F000000F037A000F037A000F037A000F037ABC
-:10150000000F037A000F037A000F037A000F037AAB
-:10151000000F037A000F037A000F037A000F037A9B
-:10152000000F037A000F037A000F037A000F037A8B
-:10153000000F037A000F037A000F037A000F037A7B
-:00000001FF
diff --git a/firmware/radeon/RV710_pfp.bin.ihex b/firmware/radeon/RV710_pfp.bin.ihex
deleted file mode 100644
index 3d811ff0a1a8..000000000000
--- a/firmware/radeon/RV710_pfp.bin.ihex
+++ /dev/null
@@ -1,213 +0,0 @@
-:100000007C408000A00000007E82800B8000000009
-:10001000DC030000CC800040D04000407C408000E9
-:10002000A00000007E82800BC818000E31980001ED
-:100030007C4240009580023A7C428000C81C001C33
-:10004000C037C0007C40C0007C4100007CB4800B05
-:10005000C036000399C00000C81C001C7CB4800C92
-:1000600024D400027D654000CD400043CE80004393
-:10007000CD000043CC800040CE400040CE80004008
-:10008000CCC00040DC3A00009780FFDECD0000408D
-:100090007C40C000800000187C410000D400034078
-:1000A000D4000FC0D4000FA2C818000E8000000CAE
-:1000B00031980002D40003C0D4000FC0D4000FA2B6
-:1000C000C818000E288C000830CC000F3410000136
-:1000D0007D0D00088000000C7D91800BCC800040DD
-:1000E000D04000407C408000A00000007E82800B59
-:1000F000D4000340D4000FC0D4000FA2CC80004035
-:10010000D04000407C408000A00000007E82800B38
-:10011000D40003C0D4000FC0D4000FA2CC80004094
-:10012000D04000407C408000A00000007E82800B18
-:10013000CC4003F980000249CC4003F8C037FFFFF0
-:100140007C414000CF41A29EC82003F8C81C03F99F
-:1001500066200020C81803FB7DE1C02C7D58C00834
-:100160007CDCC02069100020C0360003CC000054A5
-:100170007CB4800C80000069CC8000407C41800011
-:10018000CD81A29ECC80004080000067CD800040E1
-:10019000C019FFFFCC800040CD81A29E7C40C000F2
-:1001A0007C4100007C414000CCC1A1FACD01A1F905
-:1001B000CD41A29DCCC00040CD000040CD400040CC
-:1001C000CC4000407C408000A00000007E82800B7C
-:1001D000CC000054CC8000407C40C0007C4100003A
-:1001E0007C414000CCC1A1FACD01A1F9CD41A29D35
-:1001F000CCC00040CD000040CD400040D040004089
-:100200007C408000A00000007E82800B7C40C0000B
-:1002100030D00001CCC1A29F95000003041400015E
-:1002200004140002CD4003FBCC800040800000009D
-:10023000CCC000407C40C000CC800040CCC1A2A219
-:1002400080000000CCC000407C40C00028D4001FCB
-:10025000CC800040954000037C410000CCC000579A
-:100260002918001FCCC0004095800003CD0000403D
-:10027000CD00005880000249CC00007FC820001744
-:10028000C83000229A0000060E280001C824001E73
-:100290000A640001D4001240CE400040C036C000C5
-:1002A0009680000737747900041C0001CF4000409D
-:1002B000CDC00040CF0003FA7C030000CA0C001040
-:1002C0007C41000094C000047C414000D42002C462
-:1002D000CDE000449B00000B7C418000CC00004B33
-:1002E000CDA00049CD200041CD600041CDA000410E
-:1002F00006200001CE00005680000249CC00007F9D
-:10030000C8280020C82C0021CC0000637EEA4001F0
-:10031000657400207F53402C269C00027DF5C02090
-:1003200069F80020CE80004BCE600049CDE000414E
-:10033000CFA00041CE600041271C00027DF5C02007
-:1003400069F800207DB24001CF00004BCE6000492B
-:10035000CDE00041CFA00041800000BCCE60004154
-:10036000C8200017C83000229A0000060E2800019D
-:10037000C824001E0A640001D4001240CE40004090
-:10038000CA0C00107C41000094C0000BC036C000B5
-:100390009680000737747900041C0001CF400040AC
-:1003A000CDC00040CF0003FA7C030000800000B500
-:1003B0007C414000CC000048800000EE00000000BE
-:1003C000C8200017C81C00230E24000299C0001585
-:1003D0007C4180000A200001CE000056D400044079
-:1003E000CC000040C036C000CA140013964000077D
-:1003F00037747900CF400040CC000040C83003FA89
-:1004000080000103CF000022CC000022954001466D
-:10041000CC00007FCCA0004680000000CC2000462D
-:1004200080000249CC000064C8200017C810001FDB
-:100430009600000509100001D4000440CD000040E2
-:10044000CD000022CC800040D0400040C80C0025E8
-:1004500094C0FEECC8100008CD000040D4000FC0CE
-:1004600080000000D4000FA27C40C0007C4100004E
-:10047000CCC003FDCD0003FCCCC00042CD00004247
-:100480002914001F29180010319800073B5C000157
-:100490007D76000B998000057D5E400BCC0000420C
-:1004A00080000249CC00004D29980001292C000849
-:1004B0009980003D32EC0001960000042930000CC8
-:1004C00080000249CC00004204140010CD400042DC
-:1004D00033300001342800018400015DC81400039A
-:1004E0009B40001B0438000C8400015DC81400030D
-:1004F0009B400017043800088400015DC814000305
-:100500009B400013043800048400015DC8140003FC
-:100510009B400015C80C03FD9A800009C81003FC1D
-:100520009B000101CC00004D04140010CCC000421F
-:10053000CD00004280000135CD40004296C000FA57
-:10054000CC00004D80000249CC00004E9AC0000350
-:10055000CC00004DCC00004EDF8300008000000086
-:10056000D80301FF9AC000F0CC00004D8000024982
-:10057000CC00004EC8180003C81C0003C8200003AC
-:100580007D5D40037DA1C0037D5D400C2A10001FEE
-:10059000299C001F7D1D000B7D17400B880000006B
-:1005A0007E92800B96400004CC00004E80000249F1
-:1005B000CC00004204380008CF800042C808000385
-:1005C000C80C0003C8100003C8140003C8180003B7
-:1005D000C81C0003C8240003C828000329FC001F0E
-:1005E0002AB0001F7FF3C00B28F0001F7FF3C00B61
-:1005F0002970001F7FF3C00B7D8880017DCCC00176
-:100600007E5100017E9540017C9080027CD4C00226
-:100610007CBC800B9AC000037C8F400B38B4000177
-:100620009B4000C1CC00004D9BC000BFCC00004EE1
-:10063000C80C03FDC81003FCCCC000428000016E52
-:10064000CD000042D4000340D4000FC0D4000FA25C
-:10065000CC800040CC400040CC400040CC4000402A
-:100660007C40C000CCC00040CCC0000D8000000029
-:10067000D04000407C40C0007C4100006514002058
-:100680007D4D402C245800027D5980207C41C000C3
-:10069000CD80004269980020CD800042CDC000424C
-:1006A000C023C00005E400027CA0800B266400107B
-:1006B0007CA4800CCC800040CDC00040CCC0004069
-:1006C00095C0000ECD00004009DC0001C8280003E1
-:1006D00096800008CE800040C834001D974000007E
-:1006E000C834001D26A800088400024CCC2B000052
-:1006F00099C0FFF709DC0001DC3A00009780000494
-:100700007C418000800001A225980002A00000002A
-:100710007D808000C818001D7C40C00064D00008A7
-:1007200095800000C818001DCC130000CC8000404C
-:10073000CCC0004080000000CC400040C810001F2A
-:100740007C40C000CC8000407CD1400CCD400040BB
-:100750000518000180000000CD8000227C40C00010
-:10076000645000208400024CCC0000617CD0C02C7E
-:10077000C8200017C8D60000994000087C438000BC
-:10078000DF830000CFA0004F8400024CCC00006249
-:1007900080000000D040007F80000249CC00006251
-:1007A0008400024CCC000061C82000177C40C000CF
-:1007B000C036FF00C810000DC0303FFF7CF5400B75
-:1007C0007D51800B7D81800F998000087CF3800B28
-:1007D000DF830000CFA0004F8400024CCC000062F9
-:1007E00080000000D040007F80000249CC00006201
-:1007F0008400024C7C40C00028DC000895C0001931
-:1008000030DC00107C41000099C0000464540020DA
-:1008100080000208C91D00007D15002CC91E0000C3
-:100820007C4200007C4240007C4180007DE5C00BA2
-:100830007DE280079A80000E41AC00059AC000005E
-:100840000AEC000130DC001099C000040000000038
-:100850008000020BC91D00008000020BC91E0000B1
-:10086000CC800040CCC00040D0400040C80C0025E7
-:1008700094C0FDE4C8100008CD000040D4000FC0B3
-:1008800080000000D4000FA2D4000340D4000FC0A9
-:10089000D4000FA2CC800040D04000407C408000BB
-:1008A000A00000007E82800BD40003C0D4000FC0E3
-:1008B000D4000FA2CC800040D04000407C4080009B
-:1008C000A00000007E82800B7C40C00030D000067B
-:1008D0000D10000699000007C81400159940000586
-:1008E000CC000052D4000340D4000FC0D4000FA2AB
-:1008F000CC800040CCC0004080000000D0400040D0
-:100900007C40C000CC4D0000DC3A00009780FDBD6B
-:1009100004CC000180000242CC4D000080000000A9
-:10092000D040007FCC00007F80000000CC00007F22
-:10093000CC00007F88000000CC00007F0000000099
-:1009400000000000000000000000000000000000A7
-:100950000000000000000000000000000000000097
-:100960000000000000000000000000000000000087
-:100970000000000000000000000000000000000077
-:100980000000000000000000000000000000000067
-:100990000000000000000000000000000000000057
-:1009A0000000000000000000000000000000000047
-:1009B0000000000000000000000000000000000037
-:1009C0000000000000000000000000000000000027
-:1009D0000000000000000000000000000000000017
-:1009E0000000000000000000000000000000000007
-:1009F00000000000000000000000000000000000F7
-:100A000000000000000000000000000000000000E6
-:100A100000000000000000000000000000000000D6
-:100A200000000000000000000000000000000000C6
-:100A300000000000000000000000000000000000B6
-:100A400000000000000000000000000000000000A6
-:100A50000000000000000000000000000000000096
-:100A60000000000000000000000000000000000086
-:100A70000000000000000000000000000000000076
-:100A80000000000000000000000000000000000066
-:100A90000000000000000000000000000000000056
-:100AA0000000000000000000000000000000000046
-:100AB0000000000000000000000000000000000036
-:100AC0000000000000000000000000000000000026
-:100AD0000000000000000000000000000000000016
-:100AE0000000000000000000000000000000000006
-:100AF00000000000000000000000000000000000F6
-:100B000000000000000000000000000000000000E5
-:100B100000000000000000000000000000000000D5
-:100B200000000000000000000000000000000000C5
-:100B300000000000000000000000000000000000B5
-:100B400000000000000000000000000000000000A5
-:100B50000000000000000000000000000000000095
-:100B60000000000000000000000000000000000085
-:100B70000000000000000000000000000000000075
-:100B80000000000000000000000000000000000065
-:100B90000000000000000000000000000000000055
-:100BA0000000000000000000000000000000000045
-:100BB0000000000000000000000000000000000035
-:100BC0000000000000000000000000000000000025
-:100BD0000000000000000000000000000000000015
-:100BE0000000000000000000000000000000000005
-:100BF00000000000000000000000000000000000F5
-:100C0000000302220004022A0005009F00020003E4
-:100C10000006003C0007002700080191000900447D
-:100C2000000A002D00100247001700F0002201D733
-:100C3000002301E80026004C0027005F0020011A75
-:100C4000002800920029004F002A0083002B006436
-:100C5000002F008D003200D80034023200360074BC
-:100C60000039010A003C01FC003F009F00410005E3
-:100C7000004401940048019D004901C5004A01CF8C
-:100C8000005502250056022D0060000A0061002A6E
-:100C90000062003000630030006400300065003006
-:100CA0000066003000670030006800370069003FD0
-:100CB000006A0047006B0047006C0047006D00476A
-:100CC000006E0047006F0047007000470073024746
-:100CD000007B024000000005000000050000000548
-:100CE00000000005000000050000000500000005F0
-:100CF00000000005000000050000000500000005E0
-:100D000000000005000000050000000500000005CF
-:100D100000000005000000050000000500000005BF
-:100D200000000005000000050000000500000005AF
-:100D3000000000050000000500000005000000059F
-:00000001FF
diff --git a/firmware/radeon/RV730_me.bin.ihex b/firmware/radeon/RV730_me.bin.ihex
deleted file mode 100644
index 390c18e7cef3..000000000000
--- a/firmware/radeon/RV730_me.bin.ihex
+++ /dev/null
@@ -1,341 +0,0 @@
-:10000000CC0003EA7C408000A0000000CC800062AD
-:1000100080000001D040007F80000001CC40004102
-:100020007C40C000C016000430D03FFF7D15000C9E
-:10003000CC11000028D8001E3198000128DC001FD8
-:10004000C820000495C000067C424000CC0000623D
-:100050007E56800CCC290000C82400047E26000BAC
-:10006000958000067C42C000CC0000627ED7000C68
-:10007000CC310000C82C00047E2E000CCC000062A5
-:1000800031103FFF80000001CE1100007C40C00015
-:1000900080000001CC40004080000001CC4122578C
-:1000A0007C418000CC400045CC400048CC41225CE3
-:1000B000CC41A1FC7C408000A0000000CC8000620C
-:1000C000CC400045CC4000487C40C000CC41225C84
-:1000D000CC41A1FC7C408000A0000000CC800062EC
-:1000E000CC000045CC000048CC41225CCC41A1FCB6
-:1000F0007C408000A0000000CC800062040CA1FDC8
-:10010000C0120001CC000045CC0000487CD0C00CDF
-:10011000CC41225CCC41A1FCD04D00007C40800051
-:10012000A0000000CC80006280000001CC41225D74
-:100130007C4080007C40C000C02A00027C4100005E
-:100140007D29000C3094000130980006309C03009B
-:1001500029DC00087C4200007C4240009540000FF2
-:10016000C02E000405F022587F2F000CCC31000077
-:10017000C8280004CCC12169CD01216ACE81216B40
-:100180000DB40002CC01216C9740000E0DB40000AC
-:100190008000007BC834000A0DB4000297400009BB
-:1001A0000DB40000C02E000405F022587F2F000C73
-:1001B000CC310000C82800048000007BC834000A4D
-:1001C000974000047E0280008000007BC834000A53
-:1001D0000DB400049740FF8C00000000CE01216D9B
-:1001E000CE41216EC8280003C834000A9B40000499
-:1001F000043C00058400026BCC0000620DF400009A
-:100200009740000BC82C03E6CE81A2B7C030000691
-:100210007EF34028C03000207F6B80207FB3C02950
-:10022000CF81A2C480000001CFC1A2D10DF4000192
-:100230009740000BC82C03E7CE81A2BBC03000065C
-:100240007EF34028C03000207F6B80207FB3C02920
-:10025000CF81A2C580000001CFC1A2D20DF400025F
-:100260009740000BC82C03E8CE81A2BFC030000627
-:100270007EF34028C03000207F6B80207FB3C029F0
-:10028000CF81A2C680000001CFC1A2D3C82C03E950
-:10029000CE81A2C3C03000067EF34028C0300020CB
-:1002A0007F6B80207FB3C029CF81A2C7800000016F
-:1002B000CFC1A2D480000001CC4000427C40C000ED
-:1002C0007C4100002914001D315400019940000CAC
-:1002D00031181000C81C001195C00000C81C001186
-:1002E000CCC12100CD012101CCC12102CD012103CE
-:1002F000041800048000037CCD81A2A4C02A00045D
-:100300009580000836A821A3CC290000C828000445
-:10031000C81C00110DE400409640FFFFC81C0011EE
-:10032000CCC12170CD012171C820001296000000BF
-:10033000C82000128000037CCC0000647C40C00018
-:100340007C410000CC000045CC00004840D40003B4
-:10035000CD41225CCD01A1FCC01A0001041CA1FD0D
-:100360007DD9C00C7C42000008CC000106240001AD
-:1003700006280002CE1D0000CE5D000098C0FFFAE6
-:10038000CE9D00007C408000A0000000CC80006278
-:100390007C40C00030D0000128CC00017C414000EE
-:1003A000950000067C418000CD41216DCD81216EFC
-:1003B000800000F2C81C0003C02200047E16000C5E
-:1003C000CC210000C81C00047C42400098C00004FE
-:1003D0007C42800080000001CDE50000CE41216913
-:1003E000CE81216ACDC1216B80000001CC01216C3E
-:1003F0007C40C0007C4100007C4140007C4180008A
-:100400007C41C00028A40008326400FF0E68003C54
-:100410009680000A7C0200007C4200001E3000032F
-:10042000CC00006A9B00000342200005042000402D
-:100430008000010F7C0240007E0240009A400000D4
-:100440000A64000130EC00109AC0000ACC0000627F
-:10045000C02A0004C82C00217E92800CCC000041F0
-:10046000CC290000CEC000218000011FC83000044C
-:10047000CD01216DCD41216EC83000037F1F000BDF
-:1004800030F40007277800019740002A07B80124BC
-:100490009F80000000000000800001347F1B80046A
-:1004A000800001387F1B80058000013C7F1B80029B
-:1004B000800001407F1B8003800001447F1B800778
-:1004C000800001487F1B80068000014D28A40008A1
-:1004D0009B80001928A400088000015D326400FFA1
-:1004E0009B80001528A400088000015D326400FF95
-:1004F0009B80001128A400088000015D326400FF89
-:100500009B80000D28A400088000015D326400FF7C
-:100510009B80000928A400088000015D326400FF70
-:100520009B80000528A400088000015D326400FF64
-:1005300028A40008326400FF0E68003C9A80FEB2D6
-:1005400028EC00087C4340007C4380007C43C000D2
-:1005500096C00007CC000062CF412169CF81216A9B
-:10056000CFC1216B80000001CC01216C8000000113
-:10057000CFF50000CC00006B8400037F0E68003CC8
-:100580009A800004C828001580000001D040007F38
-:100590009680FFAB7E02400084000239C00E00024C
-:1005A000CC00004180000237CCC1304A7C40C00002
-:1005B0007C410000C01E000129240012C02200025C
-:1005C00096400005C0260004C027FFFB7D25000BD8
-:1005D000C02600007DD2800B7E12C00B7D25000C52
-:1005E0007C4140007C418000CCC121699A80000A96
-:1005F000CD01216ACD41216B96C0FE83CD81216C56
-:10060000C830001897000000C830001880000001B2
-:10061000CC0000188400037FCC00007FC8140013B6
-:10062000C8180014CD41216B96C0FE77CD81216C96
-:1006300080000181C8300018C80C000898C0000074
-:10064000C80C00087C41000095000002000000007A
-:100650007C414000C8200009CC400043CE01A1F4F9
-:10066000CC400044C00E80007C4240007C428000B0
-:100670002AAC001F96C0FE64C035F000CE4003E2F5
-:1006800032780003267C00087FF7C00B7FFBC00C8C
-:100690002A780018CFC003E3CF8003E426B000021D
-:1006A0007F3F0000CF0003E58000031D7C80C00079
-:1006B0007C40C00028D000083110000F9500000FCA
-:1006C0002528000106A801B29E800000000000005D
-:1006D000800001D3C0120800800001E1C814000F9F
-:1006E000800001E8C8140010800001EFCCC1A2A472
-:1006F000800001F8C814001130D0003F0D2800150B
-:100700009A8000120D28001E9A80001E0D280020DD
-:100710009A8000230D24000F0D2800107E6A800CA3
-:100720009A8000260D2000040D2400140D280028B6
-:100730007E62400C7EA6800C9A80002AC8140011AC
-:1007400080000001CCC1A2A4C01208007C4140007E
-:100750007D0CC00CC012000829580003295C000C55
-:100760007C4200007DD1C00B262000147E1E400C70
-:100770007E4E800CCE81A2A480000001CD81A1FE1E
-:10078000C814000F0410210E95400000C814000F7B
-:10079000D051000080000001CCC1A2A4C8140010F8
-:1007A0000410210895400000C8140010D05100002A
-:1007B00080000001CCC1A2A4CCC1A2A404100001FD
-:1007C000CD0000198400037FCC00007FC810001901
-:1007D00099000000C8100019800000027C408000D1
-:1007E0000410210095400000C8140011D0510000F1
-:1007F0008000037CCCC1A2A47C40C000CC40000D92
-:1008000094C0FE01CC40000E7C4100009500000524
-:1008100008CC0001C8140005994000140000000035
-:1008200098C0FFFB7C410000800000027D0080003A
-:10083000C81400057C40C0009940000CC818000C8A
-:100840007C4100009580FDF0C820000EC81C000D02
-:10085000662000207E1E002C252400027E6240209F
-:1008600080000001CCE600007C410000CC00006C60
-:10087000CC00006DC818001FC81C001E6598002021
-:100880007DD9C02C7CD4C00CCCDE000045DC00043B
-:10089000C82800179680000FC00E000128680008C5
-:1008A0002AAC001632A800FF0EB000497F2F000BC3
-:1008B0009700000600000000C81400057C40C0003E
-:1008C000800002217C41000080000224D040007F93
-:1008D00084000239CC000041CCC1304A94000000B1
-:1008E000C83C001A043C0005CFC1A2A4C0361F902A
-:1008F000C0387FFF7C03C0107F7B400CCF41217C40
-:10090000CFC1217DCC01217EC03A00040434217F77
-:100910007F7B400CCC350000C83C00042BFC001F42
-:100920000438002097C00005CC0000629B800000C6
-:100930000BB8000180000245CC000071CC01A1F48D
-:1009400004380016C0360002CF81A2A4880000003F
-:10095000CF4120107C40C00028D0001C950000052D
-:1009600004D40001CD40006580000001CD40006846
-:100970000954000280000001CD4000668400026A34
-:10098000C81803EA7C40C0009980FD9FC814001677
-:1009900008D000019940002BCD0000687C40800009
-:1009A000A0000000CC800062043C0005CFC1A2A4DE
-:1009B000CC01A1F48400037FCC0000468800000035
-:1009C000CC00007F8400027CC81803EA7C40C00091
-:1009D0009980FD8DC814001608D0000199400019B7
-:1009E000CD0000687C408000A0000000CC80006248
-:1009F000043C0022CFC1A2A48400037FCC000047A6
-:100A000088000000CC00007FC81000169900000D7F
-:100A1000CC400067800000027C408000C81803EAD8
-:100A20009980FD797C40C00094C00003C810001676
-:100A300099000004CCC00068800000027C40800067
-:100A400084000239C0148000CC000041CD41304AFE
-:100A5000C014800099000000C81000168000000239
-:100A60007C408000C01200017C51400C80000001DD
-:100A7000D05500007C40C0007C4100007C4140001B
-:100A80007C418000291C001FCCC0004ACD00004BD7
-:100A900095C00003C01C8000CDC12010DD83000084
-:100AA000055C2000CC00006280000001D81F4100DE
-:100AB0007C40C0007C4100007C4140007C418000C3
-:100AC000CCC0004CCD00004DDD830000055CA000D3
-:100AD00080000001D81F41007C40C0007C41000024
-:100AE0007C4140007C418000CCC0004ECD00004FD6
-:100AF000DD830000055CC00080000001D81F4100BC
-:100B00007C40C0007C4100007C4140007C41800072
-:100B1000CCC00050CD000051DD830000055CF8E042
-:100B200080000001D81F41007C40C0007C410000D3
-:100B30007C4140007C418000CCC00052CD0000537D
-:100B4000DD830000055CF88080000001D81F4100B3
-:100B50007C40C0007C4100007C4140007C41800022
-:100B6000CCC00054CD000055DD830000055CE000E2
-:100B700080000001D81F41007C40C0007C41000083
-:100B80007C4140007C418000CCC00056CD00005725
-:100B9000DD830000055CF00080000001D81F4100EB
-:100BA0007C40C0007C4100007C4140007C418000D2
-:100BB000CCC00058CD000059DD830000055CF3FC7B
-:100BC00080000001D81F4100D04320007C408000FD
-:100BD000A0000000CC800062D043A0007C408000D8
-:100BE000A0000000CC800062D043C0007C408000A8
-:100BF000A0000000CC800062D043F8E07C40800080
-:100C0000A0000000CC800062D043F8807C408000CF
-:100C1000A0000000CC800062D043E0007C40800057
-:100C2000A0000000CC800062D043F0007C40800037
-:100C3000A0000000CC800062D043F3FC7C40800028
-:100C4000A0000000CC800062C81403E0CC43000088
-:100C5000CC430000CC4300007D45C000CDC3000064
-:100C6000D04300007C408000A0000000CC800062E7
-:100C70007C40C000C81003E2C81403E5C81803E3B1
-:100C8000C81C03E4CD812169CDC1216ACCC1216B8F
-:100C9000CC01216C042000047DA180007D964002DF
-:100CA0009640FCD9CD8003E331280003C02DF0002D
-:100CB000251800087DAD800B7DA9800C8000000107
-:100CC000CD8003E3308CFFFFD04D00007C408000DE
-:100CD000A0000000CC800062C8140020155800025B
-:100CE0009580FFFFC8140020CC00006ECC4121800D
-:100CF0007C40C000CCC1218DCC41218128D0001F77
-:100D000034588000CD81218C9500FCBFCC412182DC
-:100D1000C81400209940FFFFC81400208000000282
-:100D20007C4080007C40C00028D0001831100001B9
-:100D3000C016008095000003C02A00047CD4C00CBB
-:100D4000CCC1217CCC41217DCC41217E7C418000E5
-:100D50001DB0000336A0217F9B000003419C0005CD
-:100D6000041C004099C0000009DC0001CC210000F7
-:100D7000C82400042A6C001F419C00059AC0FFFA99
-:100D8000CC800062800000027C4080007C40C0007B
-:100D900004D403E680000001CC5400008000037CF2
-:100DA000CC4003EAC01C8000044CA000CDC1201040
-:100DB0007C410000C814000904180000041C00084D
-:100DC000CD80007109DC000105980001CD0D000007
-:100DD00099C0FFFCCC8000628000037CCD40007194
-:100DE000C00E0100CC000041CCC1304AC83C007F9D
-:100DF000CC00007F80000001CC00007FCC00007F91
-:100E000088000000CC00007F00000000000000000F
-:100E100000000000000000000000000000000000D2
-:100E200000000000000000000000000000000000C2
-:100E300000000000000000000000000000000000B2
-:100E400000000000000000000000000000000000A2
-:100E50000000000000000000000000000000000092
-:100E60000000000000000000000000000000000082
-:100E70000000000000000000000000000000000072
-:100E80000000000000000000000000000000000062
-:100E90000000000000000000000000000000000052
-:100EA0000000000000000000000000000000000042
-:100EB0000000000000000000000000000000000032
-:100EC0000000000000000000000000000000000022
-:100ED0000000000000000000000000000000000012
-:100EE0000000000000000000000000000000000002
-:100EF00000000000000000000000000000000000F2
-:100F000000000000000000000000000000000000E1
-:100F100000000000000000000000000000000000D1
-:100F200000000000000000000000000000000000C1
-:100F300000000000000000000000000000000000B1
-:100F400000000000000000000000000000000000A1
-:100F50000000000000000000000000000000000091
-:100F60000000000000000000000000000000000081
-:100F70000000000000000000000000000000000071
-:100F80000000000000000000000000000000000061
-:100F90000000000000000000000000000000000051
-:100FA0000000000000000000000000000000000041
-:100FB0000000000000000000000000000000000031
-:100FC0000000000000000000000000000000000021
-:100FD0000000000000000000000000000000000011
-:100FE0000000000000000000000000000000000001
-:100FF00000000000000000000000000000000000F1
-:1010000000000000000000000000000000000000E0
-:1010100000000000000000000000000000000000D0
-:1010200000000000000000000000000000000000C0
-:1010300000000000000000000000000000000000B0
-:1010400000000000000000000000000000000000A0
-:101050000000000000000000000000000000000090
-:101060000000000000000000000000000000000080
-:101070000000000000000000000000000000000070
-:101080000000000000000000000000000000000060
-:101090000000000000000000000000000000000050
-:1010A0000000000000000000000000000000000040
-:1010B0000000000000000000000000000000000030
-:1010C0000000000000000000000000000000000020
-:1010D0000000000000000000000000000000000010
-:1010E0000000000000000000000000000000000000
-:1010F00000000000000000000000000000000000F0
-:1011000000000000000000000000000000000000DF
-:1011100000000000000000000000000000000000CF
-:1011200000000000000000000000000000000000BF
-:1011300000000000000000000000000000000000AF
-:10114000000000000000000000000000000000009F
-:10115000000000000000000000000000000000008F
-:10116000000000000000000000000000000000007F
-:10117000000000000000000000000000000000006F
-:10118000000000000000000000000000000000005F
-:10119000000000000000000000000000000000004F
-:1011A000000000000000000000000000000000003F
-:1011B000000000000000000000000000000000002F
-:1011C000000000000000000000000000000000001F
-:1011D000000000000000000000000000000000000F
-:1011E00000000000000000000000000000000000FF
-:1011F00000000000000000000000000000000000EF
-:1012000000000000000000000000000000000000DE
-:1012100000000000000000000000000000000000CE
-:1012200000000000000000000000000000000000BE
-:1012300000000000000000000000000000000000AE
-:10124000000000000000000000000000000000009E
-:10125000000000000000000000000000000000008E
-:10126000000000000000000000000000000000007E
-:10127000000000000000000000000000000000006E
-:10128000000000000000000000000000000000005E
-:10129000000000000000000000000000000000004E
-:1012A000000000000000000000000000000000003E
-:1012B000000000000000000000000000000000002E
-:1012C000000000000000000000000000000000001E
-:1012D000000000000000000000000000000000000E
-:1012E00000000000000000000000000000000000FE
-:1012F00000000000000000000000000000000000EE
-:1013000000000000000000000000000000000000DD
-:1013100000000000000000000000000000000000CD
-:1013200000000000000000000000000000000000BD
-:1013300000000000000000000000000000000000AD
-:10134000000000000000000000000000000000009D
-:10135000000000000000000000000000000000008D
-:10136000000000000000000000000000000000007D
-:10137000000000000000000000000000000000006D
-:10138000000000000000000000000000000000005D
-:10139000000000000000000000000000000000004D
-:1013A000000000000000000000000000000000003D
-:1013B000000000000000000000000000000000002D
-:1013C000000000000000000000000000000000001D
-:1013D000000000000000000000000000000000000D
-:1013E00000000000000000000000000000000000FD
-:1013F00000000000000000000000000000000000ED
-:10140000000103310010000400170006002100084D
-:10141000002700280028002300290029002A002690
-:10142000002B0029002D0038002E003F002F004A1D
-:101430000034004C00360030003900AF003A00CFD5
-:10144000003B00E4003C00FC003D016B003F00ADB0
-:1014500000410336004303490044018E004500FC6F
-:10146000004601AC004701AC004801FE0049020CF7
-:10147000004A0255004B02820052025F0053027183
-:1014800000540287005702990060029D006102AC7F
-:10149000006202B6006302C0006402CA006502D4A2
-:1014A000006602DE006702E8006802F2006902F6E8
-:1014B000006A02FA006B02FE006C0302006D030674
-:1014C000006E030A006F030E0070031200720363C4
-:1014D0000074036900790367007C031C000F037824
-:1014E000000F0378000F0378000F0378000F0378D4
-:1014F000000F0378000F0378000F0378000F0378C4
-:10150000000F0378000F0378000F0378000F0378B3
-:10151000000F0378000F0378000F0378000F0378A3
-:10152000000F0378000F0378000F0378000F037893
-:10153000000F0378000F0378000F0378000F037883
-:00000001FF
diff --git a/firmware/radeon/RV730_pfp.bin.ihex b/firmware/radeon/RV730_pfp.bin.ihex
deleted file mode 100644
index 3d811ff0a1a8..000000000000
--- a/firmware/radeon/RV730_pfp.bin.ihex
+++ /dev/null
@@ -1,213 +0,0 @@
-:100000007C408000A00000007E82800B8000000009
-:10001000DC030000CC800040D04000407C408000E9
-:10002000A00000007E82800BC818000E31980001ED
-:100030007C4240009580023A7C428000C81C001C33
-:10004000C037C0007C40C0007C4100007CB4800B05
-:10005000C036000399C00000C81C001C7CB4800C92
-:1000600024D400027D654000CD400043CE80004393
-:10007000CD000043CC800040CE400040CE80004008
-:10008000CCC00040DC3A00009780FFDECD0000408D
-:100090007C40C000800000187C410000D400034078
-:1000A000D4000FC0D4000FA2C818000E8000000CAE
-:1000B00031980002D40003C0D4000FC0D4000FA2B6
-:1000C000C818000E288C000830CC000F3410000136
-:1000D0007D0D00088000000C7D91800BCC800040DD
-:1000E000D04000407C408000A00000007E82800B59
-:1000F000D4000340D4000FC0D4000FA2CC80004035
-:10010000D04000407C408000A00000007E82800B38
-:10011000D40003C0D4000FC0D4000FA2CC80004094
-:10012000D04000407C408000A00000007E82800B18
-:10013000CC4003F980000249CC4003F8C037FFFFF0
-:100140007C414000CF41A29EC82003F8C81C03F99F
-:1001500066200020C81803FB7DE1C02C7D58C00834
-:100160007CDCC02069100020C0360003CC000054A5
-:100170007CB4800C80000069CC8000407C41800011
-:10018000CD81A29ECC80004080000067CD800040E1
-:10019000C019FFFFCC800040CD81A29E7C40C000F2
-:1001A0007C4100007C414000CCC1A1FACD01A1F905
-:1001B000CD41A29DCCC00040CD000040CD400040CC
-:1001C000CC4000407C408000A00000007E82800B7C
-:1001D000CC000054CC8000407C40C0007C4100003A
-:1001E0007C414000CCC1A1FACD01A1F9CD41A29D35
-:1001F000CCC00040CD000040CD400040D040004089
-:100200007C408000A00000007E82800B7C40C0000B
-:1002100030D00001CCC1A29F95000003041400015E
-:1002200004140002CD4003FBCC800040800000009D
-:10023000CCC000407C40C000CC800040CCC1A2A219
-:1002400080000000CCC000407C40C00028D4001FCB
-:10025000CC800040954000037C410000CCC000579A
-:100260002918001FCCC0004095800003CD0000403D
-:10027000CD00005880000249CC00007FC820001744
-:10028000C83000229A0000060E280001C824001E73
-:100290000A640001D4001240CE400040C036C000C5
-:1002A0009680000737747900041C0001CF4000409D
-:1002B000CDC00040CF0003FA7C030000CA0C001040
-:1002C0007C41000094C000047C414000D42002C462
-:1002D000CDE000449B00000B7C418000CC00004B33
-:1002E000CDA00049CD200041CD600041CDA000410E
-:1002F00006200001CE00005680000249CC00007F9D
-:10030000C8280020C82C0021CC0000637EEA4001F0
-:10031000657400207F53402C269C00027DF5C02090
-:1003200069F80020CE80004BCE600049CDE000414E
-:10033000CFA00041CE600041271C00027DF5C02007
-:1003400069F800207DB24001CF00004BCE6000492B
-:10035000CDE00041CFA00041800000BCCE60004154
-:10036000C8200017C83000229A0000060E2800019D
-:10037000C824001E0A640001D4001240CE40004090
-:10038000CA0C00107C41000094C0000BC036C000B5
-:100390009680000737747900041C0001CF400040AC
-:1003A000CDC00040CF0003FA7C030000800000B500
-:1003B0007C414000CC000048800000EE00000000BE
-:1003C000C8200017C81C00230E24000299C0001585
-:1003D0007C4180000A200001CE000056D400044079
-:1003E000CC000040C036C000CA140013964000077D
-:1003F00037747900CF400040CC000040C83003FA89
-:1004000080000103CF000022CC000022954001466D
-:10041000CC00007FCCA0004680000000CC2000462D
-:1004200080000249CC000064C8200017C810001FDB
-:100430009600000509100001D4000440CD000040E2
-:10044000CD000022CC800040D0400040C80C0025E8
-:1004500094C0FEECC8100008CD000040D4000FC0CE
-:1004600080000000D4000FA27C40C0007C4100004E
-:10047000CCC003FDCD0003FCCCC00042CD00004247
-:100480002914001F29180010319800073B5C000157
-:100490007D76000B998000057D5E400BCC0000420C
-:1004A00080000249CC00004D29980001292C000849
-:1004B0009980003D32EC0001960000042930000CC8
-:1004C00080000249CC00004204140010CD400042DC
-:1004D00033300001342800018400015DC81400039A
-:1004E0009B40001B0438000C8400015DC81400030D
-:1004F0009B400017043800088400015DC814000305
-:100500009B400013043800048400015DC8140003FC
-:100510009B400015C80C03FD9A800009C81003FC1D
-:100520009B000101CC00004D04140010CCC000421F
-:10053000CD00004280000135CD40004296C000FA57
-:10054000CC00004D80000249CC00004E9AC0000350
-:10055000CC00004DCC00004EDF8300008000000086
-:10056000D80301FF9AC000F0CC00004D8000024982
-:10057000CC00004EC8180003C81C0003C8200003AC
-:100580007D5D40037DA1C0037D5D400C2A10001FEE
-:10059000299C001F7D1D000B7D17400B880000006B
-:1005A0007E92800B96400004CC00004E80000249F1
-:1005B000CC00004204380008CF800042C808000385
-:1005C000C80C0003C8100003C8140003C8180003B7
-:1005D000C81C0003C8240003C828000329FC001F0E
-:1005E0002AB0001F7FF3C00B28F0001F7FF3C00B61
-:1005F0002970001F7FF3C00B7D8880017DCCC00176
-:100600007E5100017E9540017C9080027CD4C00226
-:100610007CBC800B9AC000037C8F400B38B4000177
-:100620009B4000C1CC00004D9BC000BFCC00004EE1
-:10063000C80C03FDC81003FCCCC000428000016E52
-:10064000CD000042D4000340D4000FC0D4000FA25C
-:10065000CC800040CC400040CC400040CC4000402A
-:100660007C40C000CCC00040CCC0000D8000000029
-:10067000D04000407C40C0007C4100006514002058
-:100680007D4D402C245800027D5980207C41C000C3
-:10069000CD80004269980020CD800042CDC000424C
-:1006A000C023C00005E400027CA0800B266400107B
-:1006B0007CA4800CCC800040CDC00040CCC0004069
-:1006C00095C0000ECD00004009DC0001C8280003E1
-:1006D00096800008CE800040C834001D974000007E
-:1006E000C834001D26A800088400024CCC2B000052
-:1006F00099C0FFF709DC0001DC3A00009780000494
-:100700007C418000800001A225980002A00000002A
-:100710007D808000C818001D7C40C00064D00008A7
-:1007200095800000C818001DCC130000CC8000404C
-:10073000CCC0004080000000CC400040C810001F2A
-:100740007C40C000CC8000407CD1400CCD400040BB
-:100750000518000180000000CD8000227C40C00010
-:10076000645000208400024CCC0000617CD0C02C7E
-:10077000C8200017C8D60000994000087C438000BC
-:10078000DF830000CFA0004F8400024CCC00006249
-:1007900080000000D040007F80000249CC00006251
-:1007A0008400024CCC000061C82000177C40C000CF
-:1007B000C036FF00C810000DC0303FFF7CF5400B75
-:1007C0007D51800B7D81800F998000087CF3800B28
-:1007D000DF830000CFA0004F8400024CCC000062F9
-:1007E00080000000D040007F80000249CC00006201
-:1007F0008400024C7C40C00028DC000895C0001931
-:1008000030DC00107C41000099C0000464540020DA
-:1008100080000208C91D00007D15002CC91E0000C3
-:100820007C4200007C4240007C4180007DE5C00BA2
-:100830007DE280079A80000E41AC00059AC000005E
-:100840000AEC000130DC001099C000040000000038
-:100850008000020BC91D00008000020BC91E0000B1
-:10086000CC800040CCC00040D0400040C80C0025E7
-:1008700094C0FDE4C8100008CD000040D4000FC0B3
-:1008800080000000D4000FA2D4000340D4000FC0A9
-:10089000D4000FA2CC800040D04000407C408000BB
-:1008A000A00000007E82800BD40003C0D4000FC0E3
-:1008B000D4000FA2CC800040D04000407C4080009B
-:1008C000A00000007E82800B7C40C00030D000067B
-:1008D0000D10000699000007C81400159940000586
-:1008E000CC000052D4000340D4000FC0D4000FA2AB
-:1008F000CC800040CCC0004080000000D0400040D0
-:100900007C40C000CC4D0000DC3A00009780FDBD6B
-:1009100004CC000180000242CC4D000080000000A9
-:10092000D040007FCC00007F80000000CC00007F22
-:10093000CC00007F88000000CC00007F0000000099
-:1009400000000000000000000000000000000000A7
-:100950000000000000000000000000000000000097
-:100960000000000000000000000000000000000087
-:100970000000000000000000000000000000000077
-:100980000000000000000000000000000000000067
-:100990000000000000000000000000000000000057
-:1009A0000000000000000000000000000000000047
-:1009B0000000000000000000000000000000000037
-:1009C0000000000000000000000000000000000027
-:1009D0000000000000000000000000000000000017
-:1009E0000000000000000000000000000000000007
-:1009F00000000000000000000000000000000000F7
-:100A000000000000000000000000000000000000E6
-:100A100000000000000000000000000000000000D6
-:100A200000000000000000000000000000000000C6
-:100A300000000000000000000000000000000000B6
-:100A400000000000000000000000000000000000A6
-:100A50000000000000000000000000000000000096
-:100A60000000000000000000000000000000000086
-:100A70000000000000000000000000000000000076
-:100A80000000000000000000000000000000000066
-:100A90000000000000000000000000000000000056
-:100AA0000000000000000000000000000000000046
-:100AB0000000000000000000000000000000000036
-:100AC0000000000000000000000000000000000026
-:100AD0000000000000000000000000000000000016
-:100AE0000000000000000000000000000000000006
-:100AF00000000000000000000000000000000000F6
-:100B000000000000000000000000000000000000E5
-:100B100000000000000000000000000000000000D5
-:100B200000000000000000000000000000000000C5
-:100B300000000000000000000000000000000000B5
-:100B400000000000000000000000000000000000A5
-:100B50000000000000000000000000000000000095
-:100B60000000000000000000000000000000000085
-:100B70000000000000000000000000000000000075
-:100B80000000000000000000000000000000000065
-:100B90000000000000000000000000000000000055
-:100BA0000000000000000000000000000000000045
-:100BB0000000000000000000000000000000000035
-:100BC0000000000000000000000000000000000025
-:100BD0000000000000000000000000000000000015
-:100BE0000000000000000000000000000000000005
-:100BF00000000000000000000000000000000000F5
-:100C0000000302220004022A0005009F00020003E4
-:100C10000006003C0007002700080191000900447D
-:100C2000000A002D00100247001700F0002201D733
-:100C3000002301E80026004C0027005F0020011A75
-:100C4000002800920029004F002A0083002B006436
-:100C5000002F008D003200D80034023200360074BC
-:100C60000039010A003C01FC003F009F00410005E3
-:100C7000004401940048019D004901C5004A01CF8C
-:100C8000005502250056022D0060000A0061002A6E
-:100C90000062003000630030006400300065003006
-:100CA0000066003000670030006800370069003FD0
-:100CB000006A0047006B0047006C0047006D00476A
-:100CC000006E0047006F0047007000470073024746
-:100CD000007B024000000005000000050000000548
-:100CE00000000005000000050000000500000005F0
-:100CF00000000005000000050000000500000005E0
-:100D000000000005000000050000000500000005CF
-:100D100000000005000000050000000500000005BF
-:100D200000000005000000050000000500000005AF
-:100D3000000000050000000500000005000000059F
-:00000001FF
diff --git a/firmware/radeon/RV770_me.bin.ihex b/firmware/radeon/RV770_me.bin.ihex
deleted file mode 100644
index a0e16990a20a..000000000000
--- a/firmware/radeon/RV770_me.bin.ihex
+++ /dev/null
@@ -1,341 +0,0 @@
-:10000000CC0003EA7C408000A0000000CC800062AD
-:1000100080000001D040007F80000001CC40004102
-:100020007C40C000C016000430D03FFF7D15000C9E
-:10003000CC11000028D8001E3198000128DC001FD8
-:10004000C820000495C000067C424000CC0000623D
-:100050007E56800CCC290000C82400047E26000BAC
-:10006000958000067C42C000CC0000627ED7000C68
-:10007000CC310000C82C00047E2E000CCC000062A5
-:1000800031103FFF80000001CE1100007C40C00015
-:1000900080000001CC40004080000001CC4122578C
-:1000A0007C418000CC400045CC400048CC41225CE3
-:1000B000CC41A1FC7C408000A0000000CC8000620C
-:1000C000CC400045CC4000487C40C000CC41225C84
-:1000D000CC41A1FC7C408000A0000000CC800062EC
-:1000E000CC000045CC000048CC41225CCC41A1FCB6
-:1000F0007C408000A0000000CC800062040CA1FDC8
-:10010000C0120001CC000045CC0000487CD0C00CDF
-:10011000CC41225CCC41A1FCD04D00007C40800051
-:10012000A0000000CC80006280000001CC41225D74
-:100130007C4080007C40C000C02A00027C4100005E
-:100140007D29000C3094000130980006309C03009B
-:1001500029DC00087C4200007C4240009540000FF2
-:10016000C02E000405F022587F2F000CCC31000077
-:10017000C8280004CCC12169CD01216ACE81216B40
-:100180000DB40002CC01216C9740000E0DB40000AC
-:100190008000007BC834000A0DB4000297400009BB
-:1001A0000DB40000C02E000405F022587F2F000C73
-:1001B000CC310000C82800048000007BC834000A4D
-:1001C000974000047E0280008000007BC834000A53
-:1001D0000DB400049740FF8C00000000CE01216D9B
-:1001E000CE41216EC8280003C834000A9B40000499
-:1001F000043C00058400026DCC0000620DF4000098
-:100200009740000BC82C03E6CE81A2B7C030000691
-:100210007EF34028C03000207F6B80207FB3C02950
-:10022000CF81A2C480000001CFC1A2D10DF4000192
-:100230009740000BC82C03E7CE81A2BBC03000065C
-:100240007EF34028C03000207F6B80207FB3C02920
-:10025000CF81A2C580000001CFC1A2D20DF400025F
-:100260009740000BC82C03E8CE81A2BFC030000627
-:100270007EF34028C03000207F6B80207FB3C029F0
-:10028000CF81A2C680000001CFC1A2D3C82C03E950
-:10029000CE81A2C3C03000067EF34028C0300020CB
-:1002A0007F6B80207FB3C029CF81A2C7800000016F
-:1002B000CFC1A2D480000001CC4000427C40C000ED
-:1002C0007C4100002914001D315400019940000DAB
-:1002D00031181000C81C001109DC000195C0FFFF97
-:1002E000C81C0011CCC12100CD012101CCC12102CB
-:1002F000CD012103041800048000039FCD81A2A436
-:10030000C02A00049580000836A821A3CC2900004B
-:10031000C8280004C81C00110DE400409640FFFFEF
-:10032000C81C0011CCC12170CD012171C820001260
-:1003300096000000C82000128000039FCC000064DB
-:100340007C40C0007C410000CC000045CC0000484F
-:1003500040D40003CD41225CCD01A1FCC01A0001B4
-:10036000041CA1FD7DD9C00C7C42000008CC00011A
-:100370000624000106280002CE1D0000CE5D00000C
-:1003800098C0FFFACE9D00007C408000A0000000D5
-:10039000CC8000627C40C00030D0000128CC00013D
-:1003A0007C414000950000067C418000CD41216DDC
-:1003B000CD81216E800000F3C81C0003C022000420
-:1003C0007E16000CCC210000C81C00047C424000BA
-:1003D00098C000047C42800080000001CDE5000050
-:1003E000CE412169CE81216ACDC1216B80000001FF
-:1003F000CC01216C7C40C0007C4100007C4140006D
-:100400007C4180007C41C00028A40008326400FFC9
-:100410000E68003C9680000A7C0200007C420000CE
-:100420001E300003CC00006A9B0000034220000540
-:1004300004200040800001107C0240007E02400049
-:100440009A4000000A64000130EC00109AC0000AD3
-:10045000CC000062C02A0004C82C00217E92800CCF
-:10046000CC000041CC290000CEC00021800001203A
-:10047000C8300004CD01216DCD41216EC83000038C
-:100480007F1F000B30F40007277800019740002AF7
-:1004900007B801259F8000000000000080000135A2
-:1004A0007F1B8004800001397F1B80058000013D97
-:1004B0007F1B8002800001417F1B8003800001457B
-:1004C0007F1B8007800001497F1B80068000014E52
-:1004D00028A400089B80001928A400088000015E61
-:1004E000326400FF9B80001528A400088000015E94
-:1004F000326400FF9B80001128A400088000015E88
-:10050000326400FF9B80000D28A400088000015E7B
-:10051000326400FF9B80000928A400088000015E6F
-:10052000326400FF9B80000528A400088000015E63
-:10053000326400FF28A40008326400FF0E68003C0B
-:100540009A80FEB128EC00087C4340007C43800088
-:100550007C43C00096C00007CC000062CF412169F7
-:10056000CF81216ACFC1216B80000001CC01216CB9
-:1005700080000001CFF50000CC00006B840003A2D6
-:100580000E68003C9A800004C82800158000000115
-:10059000D040007F9680FFAB7E0240008400023B8B
-:1005A000C00E0002CC00004180000239CCC1304AAC
-:1005B0007C40C0007C410000C01E000129240012C4
-:1005C000C022000296400005C0260004C027FFFBA1
-:1005D0007D25000BC02600007DD2800B7E12C00B53
-:1005E0007D25000C7C4140007C418000CCC121690C
-:1005F0009A80000ACD01216ACD41216B96C0FE820E
-:10060000CD81216CC830001897000000C830001858
-:1006100080000001CC000018840003A2CC00007F01
-:10062000C8140013C8180014CD41216B96C0FE7683
-:10063000CD81216C80000182C8300018C80C0008F0
-:1006400098C00000C80C00087C4100009500000222
-:10065000000000007C414000C8200009CC4000435D
-:10066000CE01A1F4CC400044C00E80007C4240008A
-:100670007C4280002AAC001F96C0FE63C035F000AB
-:10068000CE4003E232780003267C00087FF7C00BDF
-:100690007FFBC00C2A780018CFC003E3CF8003E4AF
-:1006A00026B000027F3F0000CF0003E58000031F5B
-:1006B0007C80C0007C40C00028D000083110000FB2
-:1006C0009500000F2528000106A801B39E800000B8
-:1006D00000000000800001D4C0120800800001E288
-:1006E000C814000F800001E9C8140010800001F058
-:1006F000CCC1A2A4800001F9C814001130D0003F81
-:100700000D2800159A8000120D28001E9A80001EE8
-:100710000D2800209A8000230D24000F0D280010C2
-:100720007E6A800C9A8000260D2000040D2400149F
-:100730000D2800287E62400C7EA6800C9A80002A3C
-:10074000C814001180000001CCC1A2A4C01208008E
-:100750007C4140007D0CC00CC012000829580003E9
-:10076000295C000C7C4200007DD1C00B26200014C7
-:100770007E1E400C7E4E800CCE81A2A48000000123
-:10078000CD81A1FEC814000F0410210E9540000079
-:10079000C814000FD051000080000001CCC1A2A4F9
-:1007A000C81400100410210895400000C81400105F
-:1007B000D051000080000001CCC1A2A4CCC1A2A4F1
-:1007C00004100001CD000019840003A2CC00007FBA
-:1007D000C810001999000000C8100019800000021C
-:1007E0007C40800004102100095400019540FFFF67
-:1007F000C8140011D05100008000039FCCC1A2A4F6
-:100800007C40C000CC40000D94C0FDFFCC40000EE9
-:100810007C4100009500000508CC0001C8140005CB
-:10082000994000140000000098C0FFFB7C410000CC
-:10083000800000027D008000C81400057C40C000DC
-:100840009940000CC818000C7C4100009580FDEE1A
-:10085000C820000EC81C000D662000207E1E002C43
-:10086000252400027E62402080000001CCE60000CA
-:100870007C410000CC00006CCC00006DC818001F4B
-:10088000C81C001E659800207DD9C02C7CD4C00CEB
-:10089000CCDE000045DC0004C82800179680000F5D
-:1008A000C00E0001286800082AAC001632A800FF1C
-:1008B0000EB000497F2F000B9700000600000000DB
-:1008C000C81400057C40C000800002237C41000069
-:1008D00080000226D040007F8400023BCC00004113
-:1008E000CCC1304A94000000C83C001A043C00050A
-:1008F000CFC1A2A4C0361F90C0387FFF7C03C010B8
-:100900007F7B400CCF41217CCFC1217DCC01217E5A
-:10091000C03A00040434217F7F7B400CCC350000BA
-:10092000C83C00042BFC001F0438002097C00005C1
-:10093000CC0000629B8000000BB8000180000247E1
-:10094000CC000071CC01A1F404380016C0360002BE
-:10095000CF81A2A488000000CF4120107C40C000BD
-:1009600028D0001C9500000504D40001CD4000658E
-:1009700080000001CD4000680954000280000001A1
-:10098000CD4000668400026CC81803EA7C40C000B9
-:100990009980FD9DC814001608D000019940002BD5
-:1009A000CD0000687C408000A0000000CC80006288
-:1009B000043C0005CFC1A2A4CC01A1F4840003A291
-:1009C000CC00004688000000CC00007F8400027E3E
-:1009D000C81803EA7C40C0009980FD8BC81400163B
-:1009E00008D0000199400019CD0000687C408000CB
-:1009F000A0000000CC800062043C0022CFC1A2A471
-:100A0000840003A2CC00004788000000CC00007FD7
-:100A1000C81000169900000DCC400067800000024D
-:100A20007C408000C81803EA9980FD777C40C000B4
-:100A300094C00003C810001699000004CCC00068E0
-:100A4000800000027C4080008400023BC0148000D3
-:100A5000CC000041CD41304AC01480009900000014
-:100A6000C8100016800000027C408000C012000107
-:100A70007C51400C80000001D05500007C40C0003B
-:100A80007C4100007C4140007C418000291C001F0B
-:100A9000CCC0004ACD00004B95C00003C01C8000B4
-:100AA000CDC12010DD830000055C2000CC00006279
-:100AB00080000001D81F41007C40C0007C41000044
-:100AC0007C4140007C418000CCC0004CCD00004DFA
-:100AD000DD830000055CA00080000001D81F4100FC
-:100AE0007C40C0007C4100007C4140007C41800093
-:100AF000CCC0004ECD00004FDD830000055CC0007F
-:100B000080000001D81F41007C40C0007C410000F3
-:100B10007C4140007C418000CCC00050CD000051A1
-:100B2000DD830000055CF8E080000001D81F410073
-:100B30007C40C0007C4100007C4140007C41800042
-:100B4000CCC00052CD000053DD830000055CF8806E
-:100B500080000001D81F41007C40C0007C410000A3
-:100B60007C4140007C418000CCC00054CD00005549
-:100B7000DD830000055CE00080000001D81F41001B
-:100B80007C40C0007C4100007C4140007C418000F2
-:100B9000CCC00056CD000057DD830000055CF0009E
-:100BA00080000001D81F41007C40C0007C41000053
-:100BB0007C4140007C418000CCC00058CD000059F1
-:100BC000DD830000055CF3FC80000001D81F4100BC
-:100BD000D04320007C408000A0000000CC80006258
-:100BE000D043A0007C408000A0000000CC800062C8
-:100BF000D043C0007C408000A0000000CC80006298
-:100C0000D043F8E07C408000A0000000CC8000626F
-:100C1000D043F8807C408000A0000000CC800062BF
-:100C2000D043E0007C408000A0000000CC80006247
-:100C3000D043F0007C408000A0000000CC80006227
-:100C4000D043F3FC7C408000A0000000CC80006218
-:100C5000C81403E0CC430000CC430000CC430000A8
-:100C60007D45C000CDC30000D04300007C40800023
-:100C7000A0000000CC8000627C40C000C81003E2ED
-:100C8000C81403E5C81803E3C81C03E4CD81216937
-:100C9000CDC1216ACCC1216BCC01216C04200004A0
-:100CA0007DA180007D9640029640FCD7CD8003E375
-:100CB00031280003C02DF000251800087DAD800B01
-:100CC0007DA9800C80000001CD8003E3308CFFFF04
-:100CD000D04D00007C408000A0000000CC8000626D
-:100CE0007C40C0007C4100002924001832640001CF
-:100CF0009A400013C8140020155800029580FFFF89
-:100D0000C8140020CC00006ECCC12180CD01218D03
-:100D1000CC4121812914001F34588000CD81218CC1
-:100D20009540FCB9CC412182C81400209940FFFFB6
-:100D3000C8140020800000027C4080007C414000FC
-:100D40007C4180007C41C00065B400207F57402C6E
-:100D5000D437810047740004D437810047740004FD
-:100D6000D43781004774000409DC0004D4378100C3
-:100D700099C0FFF8477400042924001FC0380019E7
-:100D80009640FCA1C03E0004CF8121F837E021F954
-:100D9000CC210000C82000042A20001832200001C5
-:100DA0009A00FFFBCF8121F8800000027C40800088
-:100DB0007C40C00028D0001831100001C01600800F
-:100DC00095000003C02A00047CD4C00CCCC1217C57
-:100DD000CC41217DCC41217E7C4180001DB00003AF
-:100DE00036A0217F9B000003419C0005041C0040AD
-:100DF00099C0000009DC0001CC210000C8240004D7
-:100E00002A6C001F419C00059AC0FFFACC8000624A
-:100E1000800000027C4080007C40C00004D403E6D7
-:100E200080000001CC5400008000039FCC4003EA06
-:100E3000C01C8000044CA000CDC120107C410000EB
-:100E4000C814000904180000041C0008CD800071BB
-:100E500009DC000105980001CD0D000099C0FFFCE0
-:100E6000CC8000628000039FCD400071C00E010065
-:100E7000CC000041CCC1304AC83C007FCC00007F90
-:100E800080000001CC00007FCC00007F88000000C3
-:100E9000CC00007F00000000000000000000000007
-:100EA0000000000000000000000000000000000042
-:100EB0000000000000000000000000000000000032
-:100EC0000000000000000000000000000000000022
-:100ED0000000000000000000000000000000000012
-:100EE0000000000000000000000000000000000002
-:100EF00000000000000000000000000000000000F2
-:100F000000000000000000000000000000000000E1
-:100F100000000000000000000000000000000000D1
-:100F200000000000000000000000000000000000C1
-:100F300000000000000000000000000000000000B1
-:100F400000000000000000000000000000000000A1
-:100F50000000000000000000000000000000000091
-:100F60000000000000000000000000000000000081
-:100F70000000000000000000000000000000000071
-:100F80000000000000000000000000000000000061
-:100F90000000000000000000000000000000000051
-:100FA0000000000000000000000000000000000041
-:100FB0000000000000000000000000000000000031
-:100FC0000000000000000000000000000000000021
-:100FD0000000000000000000000000000000000011
-:100FE0000000000000000000000000000000000001
-:100FF00000000000000000000000000000000000F1
-:1010000000000000000000000000000000000000E0
-:1010100000000000000000000000000000000000D0
-:1010200000000000000000000000000000000000C0
-:1010300000000000000000000000000000000000B0
-:1010400000000000000000000000000000000000A0
-:101050000000000000000000000000000000000090
-:101060000000000000000000000000000000000080
-:101070000000000000000000000000000000000070
-:101080000000000000000000000000000000000060
-:101090000000000000000000000000000000000050
-:1010A0000000000000000000000000000000000040
-:1010B0000000000000000000000000000000000030
-:1010C0000000000000000000000000000000000020
-:1010D0000000000000000000000000000000000010
-:1010E0000000000000000000000000000000000000
-:1010F00000000000000000000000000000000000F0
-:1011000000000000000000000000000000000000DF
-:1011100000000000000000000000000000000000CF
-:1011200000000000000000000000000000000000BF
-:1011300000000000000000000000000000000000AF
-:10114000000000000000000000000000000000009F
-:10115000000000000000000000000000000000008F
-:10116000000000000000000000000000000000007F
-:10117000000000000000000000000000000000006F
-:10118000000000000000000000000000000000005F
-:10119000000000000000000000000000000000004F
-:1011A000000000000000000000000000000000003F
-:1011B000000000000000000000000000000000002F
-:1011C000000000000000000000000000000000001F
-:1011D000000000000000000000000000000000000F
-:1011E00000000000000000000000000000000000FF
-:1011F00000000000000000000000000000000000EF
-:1012000000000000000000000000000000000000DE
-:1012100000000000000000000000000000000000CE
-:1012200000000000000000000000000000000000BE
-:1012300000000000000000000000000000000000AE
-:10124000000000000000000000000000000000009E
-:10125000000000000000000000000000000000008E
-:10126000000000000000000000000000000000007E
-:10127000000000000000000000000000000000006E
-:10128000000000000000000000000000000000005E
-:10129000000000000000000000000000000000004E
-:1012A000000000000000000000000000000000003E
-:1012B000000000000000000000000000000000002E
-:1012C000000000000000000000000000000000001E
-:1012D000000000000000000000000000000000000E
-:1012E00000000000000000000000000000000000FE
-:1012F00000000000000000000000000000000000EE
-:1013000000000000000000000000000000000000DD
-:1013100000000000000000000000000000000000CD
-:1013200000000000000000000000000000000000BD
-:1013300000000000000000000000000000000000AD
-:10134000000000000000000000000000000000009D
-:10135000000000000000000000000000000000008D
-:10136000000000000000000000000000000000007D
-:10137000000000000000000000000000000000006D
-:10138000000000000000000000000000000000005D
-:10139000000000000000000000000000000000004D
-:1013A000000000000000000000000000000000003D
-:1013B000000000000000000000000000000000002D
-:1013C000000000000000000000000000000000001D
-:1013D000000000000000000000000000000000000D
-:1013E00000000000000000000000000000000000FD
-:1013F00000000000000000000000000000000000ED
-:10140000000103330010000400170006002100084B
-:10141000002700280028002300290029002A002690
-:10142000002B0029002D0038002E003F002F004A1D
-:101430000034004C00360030003900AF003A00D0D4
-:10144000003B00E5003C00FD003D016C003F00ADAD
-:10145000004103380043036C0044018F004500FD48
-:10146000004601AD004701AD004802000049020EF0
-:10147000004A0257004B028400520261005302737B
-:10148000005402890057029B0060029F006102AE77
-:10149000006202B8006302C2006402CC006502D69A
-:1014A000006602E0006702EA006802F4006902F8E0
-:1014B000006A02FC006B0300006C0304006D03086B
-:1014C000006E030C006F031000700314007203869B
-:1014D0000074038C0079038A007C031E000F039BB9
-:1014E000000F039B000F039B000F039B000F039B48
-:1014F000000F039B000F039B000F039B000F039B38
-:10150000000F039B000F039B000F039B000F039B27
-:10151000000F039B000F039B000F039B000F039B17
-:10152000000F039B000F039B000F039B000F039B07
-:10153000000F039B000F039B000F039B000F039BF7
-:00000001FF
diff --git a/firmware/radeon/RV770_pfp.bin.ihex b/firmware/radeon/RV770_pfp.bin.ihex
deleted file mode 100644
index a2d1619107de..000000000000
--- a/firmware/radeon/RV770_pfp.bin.ihex
+++ /dev/null
@@ -1,213 +0,0 @@
-:100000007C408000A00000007E82800B8000000009
-:10001000DC030000CC800040D04000407C408000E9
-:10002000A00000007E82800BC818000E31980001ED
-:100030007C424000958002527C428000C81C001C1B
-:10004000C037C0007C40C0007C4100007CB4800B05
-:10005000C036000399C00000C81C001C7CB4800C92
-:1000600024D400027D654000CD400043CE80004393
-:10007000CD000043CC800040CE400040CE80004008
-:10008000CCC00040DC3A00009780FFDECD0000408D
-:100090007C40C000800000187C410000D400034078
-:1000A000D4000FC0D4000FA2C818000E8000000CAE
-:1000B00031980002D40003C0D4000FC0D4000FA2B6
-:1000C000C818000E288C000830CC000F3410000136
-:1000D0007D0D00088000000C7D91800BCC800040DD
-:1000E000D04000407C408000A00000007E82800B59
-:1000F000D4000340D4000FC0D4000FA2CC80004035
-:10010000D04000407C408000A00000007E82800B38
-:10011000D40003C0D4000FC0D4000FA2CC80004094
-:10012000D04000407C408000A00000007E82800B18
-:10013000CC4003F980000261CC4003F8C82003F8EA
-:10014000C81C03F9C81803FBC037FFFF7C414000FF
-:10015000CF41A29E662000207DE1C02C7D58C008C2
-:100160007CDCC02068D00020C0360003CC000054E6
-:100170007CB4800C8000006ACC8000407C41800010
-:10018000CD81A29ECC800040CD80004080000068E0
-:10019000CC000054C019FFFFCC800040CD81A29E4E
-:1001A0007C40C0007C4100007C414000CCC1A1FAF1
-:1001B000CD01A1F9CD41A29DCCC00040CD000040B1
-:1001C000CD400040CC4000407C408000A0000000BA
-:1001D0007E82800BCC000054CC8000407C40C0006C
-:1001E0007C4100007C414000CCC1A1FACD01A1F9C5
-:1001F000CD41A29DCCC00040CD000040CD4000408C
-:10020000D04000407C408000A00000007E82800B37
-:100210007C40C00030D00001CCC1A29F95000003FB
-:100220000414000104140002CD4003FBCC80004004
-:1002300080000000CCC000407C40C000CC8000406A
-:10024000CCC1A2A280000000CCC000407C40C00015
-:1002500028D4001FCC800040954000037C41000062
-:10026000CCC000572918001FCCC000409580000367
-:10027000CD000040CD00005880000261CC00007F1E
-:10028000C8200017C83000229A0000060E2800017E
-:10029000C824001E0A640001D4001240CE40004071
-:1002A000C036C0009680000737747900041C000136
-:1002B000CF400040CDC00040CF0003FA7C030000D7
-:1002C000CA0C00107C41000094C000047C41400036
-:1002D000D42002C4CDE000449B00000B7C41800090
-:1002E000CC00004BCDA00049CD200041CD600041A5
-:1002F000CDA0004106200001CE0000568000026122
-:10030000CC00007FC8280020C82C0021CC0000634E
-:100310007EEA4001657400207F53402C269C000239
-:100320007DF5C02069F80020CE80004BCE600049EA
-:10033000CDE00041CFA00041CE600041271C00026B
-:100340007DF5C02069F800207DB24001CF00004B50
-:10035000CE600049CDE00041CFA00041800000BD4B
-:10036000CE600041C8200017C83000229A00000665
-:100370000E280001C824001E0A640001D4001240A7
-:10038000CE400040CA0C00107C41000094C0000B1D
-:10039000C036C0009680000737747900041C000145
-:1003A000CF400040CDC00040CF0003FA7C030000E6
-:1003B000800000B67C414000CC000048800000EF87
-:1003C00000000000C8200017C81C00230E240002F3
-:1003D00099C000157C4180000A200001CE00005623
-:1003E000D4000440CC000040C036C000CA14001342
-:1003F0009640000737747900CF400040CC000040A1
-:10040000C83003FA80000104CF000022CC00002293
-:100410009540015DCC00007FCCA00046800000002C
-:10042000CC20004680000261CC000064C820001788
-:10043000C810001F9600000509100001D4000440F8
-:10044000CD000040CD000022CC800040D0400040D4
-:10045000C80C002594C0FEEBC8100008CD00004079
-:10046000D4000FC080000000D4000FA27C40C00068
-:100470007C410000CCC003FDCD0003FCCCC0004299
-:10048000CD0000422914001F2918001031980007E0
-:100490003B5C00017D76000B998000057D5E400B82
-:1004A000CC00004280000261CC00004D2998000180
-:1004B000292C00089980003D32EC000196000004D0
-:1004C0002930000C80000261CC00004204140010AE
-:1004D000CD40004233300001342800018400015E29
-:1004E000C81400039B40001B0438000C8400015E0C
-:1004F000C81400039B400017043800088400015E04
-:10050000C81400039B400013043800048400015EFB
-:10051000C81400039B400015C80C03FD9A80000915
-:10052000C81003FC9B000118CC00004D04140010FF
-:10053000CCC00042CD00004280000136CD400042D8
-:1005400096C00111CC00004D80000261CC00004E2D
-:100550009AC00003CC00004DCC00004EDF830000A9
-:1005600080000000D80301FF9AC00107CC00004DB5
-:1005700080000261CC00004EC8180003C81C0003B4
-:10058000C82000037D5D40037DA1C0037D5D400C5C
-:100590002A10001F299C001F7D1D000B7D17400B9A
-:1005A000880000007E92800B96400004CC00004E34
-:1005B00080000261CC00004204380008CF80004275
-:1005C000C8080003C80C0003C8100003C8140003C7
-:1005D000C8180003C81C0003C8240003C82800036F
-:1005E00029FC001F2AB0001F7FF3C00B28F0001F5A
-:1005F0007FF3C00B2970001F7FF3C00B7D88800143
-:100600007DCCC0017E5100017E9540017C9080022E
-:100610007CD4C0027CBC800B9AC000037C8F400B52
-:1006200038B400019B4000D8CC00004D9BC000D6E0
-:10063000CC00004EC80C03FDC81003FCCCC0004227
-:100640008000016FCD000042D4000340D4000FC0F1
-:10065000D4000FA2CC800040CC400040CC400040F1
-:10066000CC4000407C40C000CCC00040CCC0000D5D
-:1006700080000000D04000407C40C0007C41000071
-:10068000651400207D4D402C245800027D598020A7
-:100690007C41C000CD80004269980020CD8000429E
-:1006A000CDC00042C023C00005E400027CA0800B46
-:1006B000266400107CA4800CCC800040CDC000409B
-:1006C000CCC0004095C0000ECD00004009DC000108
-:1006D000C828000396800008CE800040C834001D62
-:1006E00097400000C834001D26A80008840002645A
-:1006F000CC2B000099C0FFF709DC0001DC3A0000B8
-:10070000978000047C418000800001A325980002AE
-:10071000A00000007D808000C818001D7C40C00043
-:1007200064D0000895800000C818001DCC1300009C
-:10073000CC800040CCC0004080000000CC40004095
-:10074000C810001F7C40C000CC8000407CD1400C11
-:10075000CD4000400518000180000000CD8000223F
-:100760007C40C0006450002084000264CC00006122
-:100770007CD0C02CC8200017C8D6000099400008C3
-:100780007C438000DF830000CFA0004F8400026420
-:10079000CC00006280000000D040007F8000026139
-:1007A000CC00006284000264CC000061C820001705
-:1007B0007C40C000C036FF00C810000DC0303FFFB5
-:1007C0007CF5400B7D51800B7D81800F9980000866
-:1007D0007CF3800BDF830000CFA0004F8400026415
-:1007E000CC00006280000000D040007F80000261E9
-:1007F000CC000062840002647C40C00028DC000859
-:1008000095C0001930DC00107C41000099C0000444
-:100810006454002080000209C91D00007D15002CD1
-:10082000C91E00007C4200007C4240007C418000E8
-:100830007DE5C00B7DE280079A80000E41AC00058B
-:100840009AC000000AEC000130DC001099C00004DE
-:10085000000000008000020CC91D00008000020C96
-:10086000C91E0000CC800040CCC00040D0400040F9
-:10087000C80C002594C0FDE3C8100008CD0000405E
-:10088000D4000FC080000000D4000FA2D4000340A9
-:10089000D4000FC0D4000FA2CC800040D040004054
-:1008A0007C408000A00000007E82800BD40003C04A
-:1008B000D4000FC0D4000FA2CC800040D040004034
-:1008C0007C408000A00000007E82800B7C40C00045
-:1008D00030D000060D10000699000007C81400155E
-:1008E00099400005CC000052D4000340D4000FC052
-:1008F000D4000FA2CC800040CCC00040800000009B
-:10090000D04000407C40C000CC4D0000DC3A0000EC
-:100910009780FDBC04CC000180000243CC4D000058
-:100920007C40C0007C410000292400183264000192
-:100930009640000FCC8000407C4140007C4180000C
-:100940007C41C000CCC00043CD00004331DC7FFFC0
-:10095000CDC00043CCC00040CD000040CD400040A1
-:10096000CD80004080000000CDC00040CCC00040E1
-:10097000CD00004080000000D0400040800000001A
-:10098000D040007FCC00007F80000000CC00007FC2
-:10099000CC00007F88000000CC00007F0000000039
-:1009A0000000000000000000000000000000000047
-:1009B0000000000000000000000000000000000037
-:1009C0000000000000000000000000000000000027
-:1009D0000000000000000000000000000000000017
-:1009E0000000000000000000000000000000000007
-:1009F00000000000000000000000000000000000F7
-:100A000000000000000000000000000000000000E6
-:100A100000000000000000000000000000000000D6
-:100A200000000000000000000000000000000000C6
-:100A300000000000000000000000000000000000B6
-:100A400000000000000000000000000000000000A6
-:100A50000000000000000000000000000000000096
-:100A60000000000000000000000000000000000086
-:100A70000000000000000000000000000000000076
-:100A80000000000000000000000000000000000066
-:100A90000000000000000000000000000000000056
-:100AA0000000000000000000000000000000000046
-:100AB0000000000000000000000000000000000036
-:100AC0000000000000000000000000000000000026
-:100AD0000000000000000000000000000000000016
-:100AE0000000000000000000000000000000000006
-:100AF00000000000000000000000000000000000F6
-:100B000000000000000000000000000000000000E5
-:100B100000000000000000000000000000000000D5
-:100B200000000000000000000000000000000000C5
-:100B300000000000000000000000000000000000B5
-:100B400000000000000000000000000000000000A5
-:100B50000000000000000000000000000000000095
-:100B60000000000000000000000000000000000085
-:100B70000000000000000000000000000000000075
-:100B80000000000000000000000000000000000065
-:100B90000000000000000000000000000000000055
-:100BA0000000000000000000000000000000000045
-:100BB0000000000000000000000000000000000035
-:100BC0000000000000000000000000000000000025
-:100BD0000000000000000000000000000000000015
-:100BE0000000000000000000000000000000000005
-:100BF00000000000000000000000000000000000F5
-:100C0000000302230004022B000500A000020003E1
-:100C10000006003C0007002700080192000900447C
-:100C2000000A002D0010025F001700F1002201D819
-:100C3000002301E90026004C0027005F0020011B73
-:100C4000002800930029004F002A0084002B006533
-:100C5000002F008E003200D90034023300360075B8
-:100C60000039010B003C01FD003F00A0004102489B
-:100C7000004401950048019E004901C6004A01D088
-:100C8000005502260056022E0060000A0061002A6C
-:100C90000062003000630030006400300065003006
-:100CA0000066003000670030006800370069003FD0
-:100CB000006A0047006B0047006C0047006D00476A
-:100CC000006E0047006F0047007000470073025F2E
-:100CD000007B024100000005000000050000000547
-:100CE00000000005000000050000000500000005F0
-:100CF00000000005000000050000000500000005E0
-:100D000000000005000000050000000500000005CF
-:100D100000000005000000050000000500000005BF
-:100D200000000005000000050000000500000005AF
-:100D3000000000050000000500000005000000059F
-:00000001FF
diff --git a/firmware/sb16/alaw_main.csp.ihex b/firmware/sb16/alaw_main.csp.ihex
deleted file mode 100644
index 04502707c42a..000000000000
--- a/firmware/sb16/alaw_main.csp.ihex
+++ /dev/null
@@ -1,87 +0,0 @@
-:10000000001000440800004400B1004400610044B6
-:10001000085000440DF261A8440404190000404552
-:10002000404939AC5555718B500563800000063945
-:10003000FF2E2149FF0FD4492001090E2000718BAA
-:10004000A801A8808801A880A8000080D200718B38
-:100050008800A880A804B3802007B3808803B180FB
-:10006000C000095CC2010082A100718BCD0004199F
-:100070002120718BCF0004190000B180C200041947
-:100080000040001408400424000034490C4000449F
-:1000900044040439000040453200095C00000C397A
-:1000A00000004045404009EFFF2009CF000463A154
-:1000B000500333800004A38000FFC28B00D004549F
-:1000C00004E000C4200380C03000008800007A0AE9
-:1000D000D001008200600044C0000099006000442C
-:1000E00000FFC28B20000080000D428B083200C44C
-:1000F000000E428B00A200C4001E428B0CB200C452
-:10010000008E428B006200C4009E428B085200C4E5
-:1001100000BE428B085200C40004428B047200C42B
-:100120000024428B00D200C40055428B006000C402
-:1001300000004045200179800030428B088200C4D5
-:10014000000040450000718B4001008000600044C9
-:10015000FF00E2AB00B200C40FF2A8A82000B188F3
-:10016000000041024DF20039C001008200600044ED
-:100170000DF2A3A84DF2003900600044FF00E2AB8D
-:1001800020000088000061024DF204190060004464
-:10019000FF00E2ABA0000088000061104DF20419DE
-:1001A00000600044FF20E2AB60000088000071C0E6
-:1001B0004DF20419006000440000798000E20084E0
-:1001C0000303044904C20054006004640060004456
-:1001D0000000638000000619030004490060004429
-:1001E00020016380000006190020E28B0CF20084DD
-:1001F000BE00518BC020003908010044EC00518B37
-:10020000C02000390002E28B042100843F00518BA2
-:10021000C2200039001100443D00518BC22000393A
-:10022000E500718BCD0000390000B180C9200419B0
-:10023000CB200419C1200419C32004191000718BAC
-:10024000C7200419DE00518BCF0000390001B180B6
-:10025000C4200419C6200419C8200419CA2004198E
-:100260002000718BCC200419030004490060004475
-:10027000090461A8C10004190B0461A8CA0004198B
-:10028000046000D40D00610A9040098F0001004510
-:100290000F00610A0040098F000100458200092E0D
-:1002A000804009CF02006122432561224033008053
-:1002B0000848004420B1495C9200094E0203092E0F
-:1002C0000000A302C00071C02000EB800004C28BBC
-:1002D0002004618000047A02C00000820CC3084937
-:1002E000B001F3800000103920000C890C88084907
-:1002F0000300A81800001039BDFF628B20010080A8
-:10030000000063CB00007A024000015B2000008007
-:1003100000004ACB2000138020007A80E02100C03A
-:10032000080008491041098EAEAE628B00046122BC
-:1003300000030045220133802001A30200007A80DF
-:10034000C00000820720400A08A3008440210080EA
-:1003500040059310C7200039000040450720400A9F
-:100360000C930084080000820C246150400100803E
-:10037000C7200039000040450004638000000639B2
-:100380004201090E0220610A000100450C20600AAA
-:1003900000C300840004B180000006390C6104D45D
-:1003A000002471C0203333C0E001A38222037A020B
-:1003B000C301A3822001338000007A80C201B350C0
-:1003C000CC20003900007180000800440C20600A35
-:1003D00000F300840004B180000006390C6104D4ED
-:1003E000000071C000009310CC20003900080044C8
-:1003F000CC200039002000C0003071C0000800444B
-:1004000020010080AEAE628B20013380000083802B
-:1004100020007A8020A1495C8200096E804A098E02
-:10042000E001B3822004A38000007ACB2804EA1004
-:100430000C047A107000C08B00001039900300800B
-:100440004000215B900061800C8A084900001C1963
-:100450004000085B08000849200200800300A8183B
-:1004600000001419400021CB000041020000EB8085
-:10047000F2010082402133020820610AC4000419FD
-:10048000C70000990200610A0C0A04140100610A05
-:100490000300480A00580454C30004190C580044CF
-:1004A0000800C80A0C580454C80004190A00610A5C
-:1004B0000900480A00C80454C90004190CC80044C3
-:1004C0000B00C80A0CC80454CB0004190400610ACC
-:1004D0000600480A00D80454C60004190CD8004489
-:1004E0000500C80A0CD80454C50004190700610AA5
-:1004F0000C00480A000A0454CC0004190C0A0044F9
-:100500000E00C80A0C0A0454CE000419000040452D
-:080510002010718B0842060067
-:00000001FF
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
diff --git a/firmware/sb16/ima_adpcm_capture.csp.ihex b/firmware/sb16/ima_adpcm_capture.csp.ihex
deleted file mode 100644
index 9a50a58564ae..000000000000
--- a/firmware/sb16/ima_adpcm_capture.csp.ihex
+++ /dev/null
@@ -1,121 +0,0 @@
-:1000000000100044080000440070004408D0004480
-:1000100000F000440DF261A84404041900004045BA
-:100020000004638000000639FF2E2149FF0CD449EB
-:10003000404939AC5555718B5001B1800000718B2E
-:10004000C2300419C0A00419C2A004198900718B20
-:10005000C83004197100718BCD000419CF00041948
-:100060008000718BCB2004192000718BC4200419EF
-:100070004700518BC020003900006380C1A00419E3
-:100080009300014FCD300009CF3000090C4000141F
-:1000900000600014000461A8020461A80C6004243C
-:1000A000000034490850004444040439000040452D
-:1000B0000830610A05B0E8180CC00454C8300419AF
-:1000C000090400A80B0400A800004045090461A829
-:1000D000C10004190B0461A8CA0004190D00610ACB
-:1000E000000100450F00610A0040098F0001004532
-:1000F000404009EFFF2009CF000463A15003338083
-:100100000004A38000FFC28B0C120454081200C428
-:10011000200380C03000008800007A0AD0010082ED
-:1001200004500044C00000990450004400FFC28BFA
-:1001300020000080000D428B044200C4000E428B60
-:10014000085200C4001E428B00E200C4008E428BA5
-:1001500008D200C4009E428B04F200C400BE428B51
-:1001600004F200C40004428B041100C40024428B3A
-:100170000C6100C40055428B045000C4003F428B08
-:100180000C0100C400004045200179800030428B02
-:10019000046200C4000040450000718B40010080F3
-:1001A00004500044FF00E2AB08C200C40FF2A8A84C
-:1001B0002000B188000041024DF20039C0010082E8
-:1001C000045000440DF2A3A84DF20039045000443D
-:1001D000FF00E2AB20000088000061024DF204192C
-:1001E00004500044FF00E2ABA00000880000611052
-:1001F0004DF2041904500044FF20E2AB6000008877
-:10020000000071C04DF204190450004400007A0A45
-:100210002001F08001A0410A001100C42001F080FB
-:10022000C130041904500044000079800C4100845E
-:100230008900718BC83004199700718BCD0000398B
-:100240000001B1808000041982000419C120041942
-:10025000C3200419C2300419CD100419CF10041999
-:10026000B000718B84000419860004198000718B22
-:10027000CB2004199300014FCD300009CF30000985
-:100280000302044908410014045000440000638044
-:100290000000061903000449045000442001638053
-:1002A000000006190020E28B00C100844700518B3A
-:1002B000C020003900006380C1A0041900E100449F
-:1002C000BD00518BC02000390000B180C1A00419CD
-:1002D00003000449045000440020610A0001004565
-:1002E0000230610A0C8300C40C780844045A0844A4
-:1002F000B200094F1042098E05B0E01804230084B3
-:100300000C01001108056110004908440048084428
-:10031000B200094F8000718BC00000820C013310C5
-:100320002801A31000017A808C0100800230610A4C
-:10033000200004190C8300C405B0C818084300C489
-:100340000130C80A0C3800C4088800440C780844FE
-:10035000045A08440000A318800004190B0461A883
-:10036000C3200039C33004190F10610ACA300419C0
-:10037000090441A8E1200039D100094F00046102BD
-:10038000086300440330410A20000039A300094FEC
-:100390000004610200480844088800440230610AF1
-:1003A000000800C40C780844045A0844B200090F3D
-:1003B0001040098E0000685B2004B1800200615B80
-:1003C00088037A80AC01008005B0E01800D3008477
-:1003D0000049084400480844B200090F8000718BAE
-:1003E000C00000820230610A000800C405B0C818CD
-:1003F0000C1800C40130C80A0C3800C40888004436
-:100400000C780844000061182005B180000068CB1A
-:10041000800004190D10610AC33004190B0441A8AF
-:10042000090441A8E1200039083800440330410A9A
-:100430002004B18000480844088800440000B180CE
-:10044000C23004190CB800D40F30610A0D30C80A4C
-:100450000CB800C49300014FE700016F0F30610A30
-:1004600020000088020061024104041902046102B4
-:1004700043040439CF3000092000094900590044E1
-:100480009300014FE700016F0D30610A2000618881
-:10049000C2000082C2030082CD3000092000094959
-:1004A0000F30610A0D30C80A0C5800840230610A0E
-:1004B00005B0A818C2300419000000469040098F0A
-:1004C0001204096E0300090E0001718220010080F0
-:1004D000000061CB8004B1800001E0600CD80414FE
-:1004E0000001EB804000521B80007980C00171C286
-:1004F0002000C080080A0454C004A8828000721B37
-:10050000800000800001F0802000C0800C2A04548C
-:10051000C004A8821000721B800000800001F080DF
-:100520002000C080083A0454C004A8822000721B36
-:1005300080000080C003F0822000A0800001001134
-:100540004000C28B00AA00C40000E98005B0A818D2
-:100550000001A822D0010082F000E21B0620A80AB8
-:100560002D10610AD100092E0001A8020E10C80A40
-:100570000CBA04140E10610A044A00440C10C80A94
-:10058000044A04540C10610AD00100820010A8181B
-:10059000A0000088000171820300090E9A0100602A
-:1005A0003200092E00000046000171822001008007
-:1005B000000061CB8024B1C00031E0600CCA04149B
-:1005C0000001EB804000521B80007980C00171C2A5
-:1005D0002000C08008DA0454C004A8828000721B86
-:1005E000800000800001F0802000C0800CFA0454DC
-:1005F000C004A8821000721B800000800001F080FF
-:100600002000C08008290454C004A8822000721B66
-:1006100080000080C003F0822000A0800001001153
-:100620004000C28B003900C40000E98005B0A81862
-:100630000001A822D0010082B000E21B0620A80A17
-:100640002F10610AF100092E0001A8020E10C80A3D
-:100650000CA904140E10610A049900440C10C80A75
-:10066000049904540C10610AD00100820010A818EB
-:10067000A0000088000171829F0100600000004618
-:10068000000033800000838020007A8020073380C0
-:100690000000838020047A80200100800000004652
-:1006A0000200610A041B04140100610A0300480AE5
-:1006B0000C790454C300041904C900440800C80A92
-:1006C00004C90454C80004190A00610A0900480A50
-:1006D0000CE90454C900041904D900440B00C80AE9
-:1006E00004D90454CB0004190400610A0600480A26
-:1006F0000CF90454C6000419040B00440500C80A90
-:10070000040B0454C50004190700610A0C00480AD0
-:100710000C2B0454CC000419041B00440E00C80A1E
-:10072000041B0454CE000419000040459220718B34
-:04073000A6C5110049
-:00000001FF
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
diff --git a/firmware/sb16/ima_adpcm_init.csp.ihex b/firmware/sb16/ima_adpcm_init.csp.ihex
deleted file mode 100644
index a899a9e743f4..000000000000
--- a/firmware/sb16/ima_adpcm_init.csp.ihex
+++ /dev/null
@@ -1,70 +0,0 @@
-:10000000001000440000404500004045000040450D
-:1000100000004045AAAA718B440404190000404521
-:10002000FF6E2149FF0FD449404939AC5555718BBA
-:100030005005B1806200190E2100718B880000808C
-:10004000B000718B880000804000718B88000080B8
-:100050006000718B880000805000718B88000080E8
-:100060007000718B88000080C000718B8800008058
-:10007000E000718B88000080D000718B88000080C8
-:100080000200718B880000802200718B8800008044
-:100090003200718B88000080A200718B8800008084
-:1000A000B200718B880000806200718B8800008034
-:1000B000C200718B88000080F200718B8800008084
-:1000C0001100718B88000080A100718B8800008076
-:1000D0006100718B88000080E100718B88000080D6
-:1000E0001300718B88000080B300718B8800008042
-:1000F000C300718B880000801800718B880000801D
-:100100006800718B880000800A00718B8800008075
-:100110004A00718B880000802900718B8800008064
-:100120007900718B880000809B00718B88000080B3
-:100130001400718B88000080F400718B88000080AF
-:10014000E600718B88000080E500718B88000080DC
-:10015000D700718B880000802E00718B8800008092
-:100160009D00718B88000080EF00718B88000080FB
-:10017000B220718B880000803320718B8800008052
-:100180002A20718B880000803B20718B88000080C2
-:100190004620718B880000802C20718B88000080A5
-:1001A000DD20718B880000800110718B8800008039
-:1001B0009A10718B880000801610718B8800008067
-:1001C0008E10718B88000080C230718B8800008097
-:1001D000C930718B880000803C30718B88000080B2
-:1001E0008180718B88000080D480718B88000080B2
-:1001F00010A0718B8800008034A0718B8800008073
-:100200000290718B880000807590718B880000804F
-:100210009AB0718B880000801240718B880000803A
-:100220000D40718B880000803C60718B88000080DD
-:10023000E750718B880000800E70718B8800008001
-:10024000FFC0718B88000080C8D0718B880000804F
-:1002500057F0718B88000080C822718B8800008065
-:10026000B032718B88000080DD82718B8800008045
-:1002700090B2718B880000808A62718B8800008048
-:10028000CE72718B88000080A5D2718B88000080AF
-:100290009721718B88000080A2A1718B880000805B
-:1002A0005C41718B88000080FEC1718B88000080EA
-:1002B0007A23718B880000807893718B880000808E
-:1002C0006773718B880000801728718B880000800D
-:1002D0008848718B88000080DBF8718B8800008073
-:1002E0002BBA718B88000080F109718B8800008027
-:1002F000DC69718B88000080198B718B880000800D
-:10030000FFFB718B880000802000718B88000080CB
-:100310005200718BC2000082FFFF718BC20000820D
-:10032000C2000082C2000082C20000821000718BF5
-:10033000C20000828000718BC20000829000718B2D
-:10034000C20000824000718BC2000082FFFF718BEF
-:10035000C2000082C2000082C2000082C20000828D
-:100360001000718BC20000828000718BC20000827D
-:100370009000718BC20000824000718BC20000822D
-:10038000FFFB718BC20000820004718BC2000082EF
-:100390004A00718BC20000820000718BC200008293
-:1003A0000000718BC2000082C2000082C2300419BA
-:1003B0001000094FC2010082C2010082C201008206
-:1003C000C2010082C2010082C2010082C201008219
-:1003D000C2010082C2010082C2010082C201008209
-:1003E000C2010082C20100820010718BC130041969
-:1003F0009300014FCD300009CF300009000034498F
-:0804000000080044C85411007B
-:00000001FF
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
diff --git a/firmware/sb16/ima_adpcm_playback.csp.ihex b/firmware/sb16/ima_adpcm_playback.csp.ihex
deleted file mode 100644
index f09f18cf35e2..000000000000
--- a/firmware/sb16/ima_adpcm_playback.csp.ihex
+++ /dev/null
@@ -1,122 +0,0 @@
-:1000000000100044080000440C50004400700044FC
-:10001000047000440DF261A8440404190000404536
-:100020000004638000000639FF2E2149FF0DD449EA
-:10003000404939AC5555718B5001B1800001B180F8
-:10004000C92004195100718BCD000419E420718B73
-:10005000CF0004198000718BCB2004191000718B24
-:10006000C42004196500518BC22000390000B18002
-:10007000C230041900006380C1A004199300014F2D
-:10008000CD300009CF300009044000140C400014AA
-:10009000000461A8020461A804600424000034493B
-:1000A000005000444404043900004045000040452D
-:1000B0000F00610A00010045404009EFFF2009CF11
-:1000C000000463A1500333800004A38000FFC28BAF
-:1000D00008F004540CD000C4200380C03000008815
-:1000E00000007A0AD001008208500044C000009944
-:1000F0000850004400FFC28B20000080000D428B9E
-:1001000000A200C4000E428B0C9200C4001E428B61
-:10011000046200C4008E428B0C5200C4009E428BCD
-:1001200000C200C400BE428B00C200C40004428B67
-:1001300000F200C40024428B009100C40055428BA1
-:10014000085000C4003F428B08E200C40000404554
-:10015000200179800030428B009200C400004045AD
-:100160000000718B4001008008500044FF00E2ABAA
-:100170000C4200C40FF2A8A82000B1880000410280
-:100180004DF20039C0010082085000440DF2A3A8CE
-:100190004DF2003908500044FF00E2AB2000008817
-:1001A000000061024DF2041908500044FF00E2AB68
-:1001B000A0000088000061104DF2041908500044AE
-:1001C000FF20E2AB60000088000071C04DF204190E
-:1001D0000850004400007A0A2001F08001A0410A82
-:1001E00004D200C42001F080C1300419085000443A
-:1001F0000000798000A10084B500518BCF00003948
-:100200000001B180880004198A000419C82004196B
-:10021000CA200419C2300419CD100419CF100419D2
-:10022000B000718B8C0004198E0004191000718BC2
-:10023000C42004199300014FCD300009CF300009CC
-:100240000303044904810054085004640850004426
-:1002500000006380000006190300044908500044B0
-:1002600020016380000006190002E28B084100842F
-:100270006500518BC220003900006380C1A00419C1
-:10028000086100442D00518BC22000390000B1806C
-:10029000C1A0041903000449085000440220610A67
-:1002A000000100450230610A040300C405B0C8180B
-:1002B000047100C4001300440079084400047980EC
-:1002C000004900C4CA2004194A040419FF00E28B43
-:1002D0000CF90844CF1004190C2B08448E000419A3
-:1002E0000330610AC8200039480400390A30610A25
-:1002F0000CF90844CD1004190C2B08448C00041987
-:100300000CD908440C5A0044007908440004798050
-:10031000004900C4C3300419CA3000990CD90844FC
-:10032000420A090E000133118C01A38000017A10EA
-:100330008005B18005B0E01800930084007908447E
-:1003400000047980004900C40C1B0844880004198B
-:100350008A0000990CD90844420A090E8000718B6A
-:10036000C004B1821000E00B004300840230610A37
-:100370000130C80A004300840000B180C230041973
-:100380000CA800440230610A00D300C405B0C818AC
-:10039000046300C408F30044007908440004798031
-:1003A000004900C420000419FF00E28B0CF9084446
-:1003B000CD100419CF1004190C2B08448C0004191B
-:1003C0008E0004190330610AC8200039CA200039A0
-:1003D000480400394A0400390CD908440C5A004436
-:1003E0000079084400047980004900C4C33004192E
-:1003F0000CD90844420A090E05B0E0180018008420
-:100400000079084400047980004900C40C1B0844AA
-:10041000800100800CD90844420A090E8000718BCB
-:10042000C004B1821000E00B008800840230610A31
-:100430000130C80A008800840000B180C23004196D
-:1004400000010011000FE28B000041CB8C00008006
-:10045000000048CB20007A8080010080820C096E69
-:100460000308090E804009CF000171C20008C21BB9
-:1004700004B800C42005A8802001F0800001C21B40
-:10048000044800C42005A8802001F0800002C21B9F
-:10049000046800C42005A8802001F0802003A88003
-:1004A000000100110004C28B087800C40000E9803C
-:1004B00005B0A81800004ACB2000A822D001008275
-:1004C00040010080C4000419B000E28B0620A80A95
-:1004D0002D10610AD108092E0001A8020CF9084468
-:1004E000CD1004190C2B08440308090E9A25B1609D
-:1004F000A20E096E0300090F000171822001008025
-:10050000000061CB800100800300090F000171C26F
-:100510000008C21B0C2A00C42005A8802001F0801E
-:100520000001C21B0C1A00C42005A8802001F08025
-:100530000002C21B0C3A00C42005A8802001F080F4
-:100540002003A880000100110004C28B04AA00C48B
-:100550000000E98005B0A81800004ACB2000A822BE
-:10056000D001008240010080C7000419B000E28B76
-:100570000620A80A2F10610AF108092E0001A8021E
-:100580000CF90844CF1004190C2B08449F35B160B6
-:100590000308090E0001718220010080000061CB78
-:1005A00080010080E420718B000100459040098F9C
-:1005B0000005638000000639081904D49300014F38
-:1005C000E700016F0D30610A200461A8C2000082BB
-:1005D000020461A8C2000082CD30000902000002BE
-:1005E00002000002C0800009200009490F30610AA2
-:1005F0000D30C80A002900C40080C80A002900C4C0
-:100600000004B18000000639C920043900390044D3
-:1006100000046380000006390004B180C920043959
-:10062000003900440920230A00000619C9200419D2
-:10063000000040450200610A0CB904140400610A7C
-:100640000600480A00A90454C60004190CA9004475
-:100650000500C80A0CA90454C50004190700610A62
-:100660000C00480A00B90454CC0004190CB9004429
-:100670000E00C80A0CB90454CE0004190C5A0044E8
-:10068000820D092E804009CF00DF718B8001008030
-:1006900002C1002203C1002200016580D2056582EB
-:1006A00040210080D3030082403300800C5A004474
-:1006B0000F30610A0D30C80A08D900C49300014FF9
-:1006C000E700016F0F30610A20000088020061021C
-:1006D00002000003CF3000092000094900046380B4
-:1006E00004D900440004B180000000460230610AD1
-:1006F00005B0A818C2300419000000460E10C80A40
-:100700000C0B04140E10610A042B00440C10C80AD0
-:10071000042B04540C10610A000000460010A818B5
-:10072000A0000088000171820000004600043380B0
-:100730000000838020047A802001338000008380C1
-:1007400020007A80200300800000004616CE1100B1
-:00000001FF
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
diff --git a/firmware/sb16/mulaw_main.csp.ihex b/firmware/sb16/mulaw_main.csp.ihex
deleted file mode 100644
index b64b565f2296..000000000000
--- a/firmware/sb16/mulaw_main.csp.ihex
+++ /dev/null
@@ -1,84 +0,0 @@
-:10000000001000440800004400B1004400610044B6
-:10001000085000440DF261A8440404190000404552
-:10002000404939AC5555718B500563800000063945
-:10003000FF2E2149FF0FD4492001090E2000718BAA
-:10004000A801A8808801A880A8000080D200718B38
-:100050008800A880A804B3802007B3808803B180FB
-:10006000C000095CC2010082A100718BCD0004199F
-:10007000A220718BCF0004190000B180C2000419C6
-:100080000040001408400424000034490C4000449F
-:1000900044040439000040453200095C00000C397A
-:1000A00000004045404009EFFF2009CF000463A154
-:1000B000500333800004A38000FFC28B00D004549F
-:1000C00004E000C4200380C03000008800007A0AE9
-:1000D000D001008200600044C0000099006000442C
-:1000E00000FFC28B20000080000D428B083200C44C
-:1000F000000E428B00A200C4001E428B0CB200C452
-:10010000008E428B006200C4009E428B085200C4E5
-:1001100000BE428B085200C40004428B047200C42B
-:100120000024428B00D200C40055428B006000C402
-:1001300000004045200179800030428B088200C4D5
-:10014000000040450000718B4001008000600044C9
-:10015000FF00E2AB00B200C40FF2A8A82000B188F3
-:10016000000041024DF20039C001008200600044ED
-:100170000DF2A3A84DF2003900600044FF00E2AB8D
-:1001800020000088000061024DF204190060004464
-:10019000FF00E2ABA0000088000061104DF20419DE
-:1001A00000600044FF20E2AB60000088000071C0E6
-:1001B0004DF20419006000440000798000E20084E0
-:1001C0000303044908C20054006004640060004452
-:1001D0000000638000000619030004490060004429
-:1001E00020016380000006190020E28B0CF20084DD
-:1001F0003E00518BC0200039080100446C00518B37
-:10020000C02000390002E28B04210084FD00518BE4
-:10021000C220003900110044FE00518BC220003979
-:10022000E500718BCD0000390000B180C9200419B0
-:10023000CB200419C1200419C32004191000718BAC
-:10024000C72004195E00718BCF0000390000B18017
-:10025000C4200419C6200419C8200419CA2004198E
-:100260002000718BCC200419030004490060004475
-:10027000090461A8C10004190B0461A8CA0004198B
-:10028000046000D40D00610A9040098F0001004510
-:100290000F00610A0040098F000100458200092E0D
-:1002A000804009CF02006122432561224033008053
-:1002B00008A800442031495C9200094E0203092E2F
-:1002C0000000A302C00071C02000EB800004C28BBC
-:1002D0002004618000047A02CB00A858B005F380A6
-:1002E0002004A81000001039B000E08B200100802D
-:1002F000000063CB00007A024000015B2000008018
-:1003000000004ACB2000138020007A80E02100C04A
-:10031000080008491041098EFFFF628B000461222A
-:1003200000030045220133802001A30200007A80EF
-:10033000C00000820720400A08830084402100801A
-:1003400040059310C7200039000040450720400AAF
-:100350000CA30084080000820C246150400100803E
-:10036000C7200039000040450004638000000639C2
-:100370004201090E0220610A000100450C20600ABA
-:10038000007300840004B180000006390C6104D4BD
-:10039000002471C0203333C0E001A38222037A021B
-:1003A000C301A3822001338000007A80C201B350D0
-:1003B000CC2000390000718000F300440C20600A5A
-:1003C00000D300840004B180000006390C6104D41D
-:1003D0000000B310CC200039000071C000F30044CD
-:1003E000CC200039002071C0003071C000F30044FF
-:1003F00020010080FFFF628B20013380000083809A
-:1004000020007A8020E1095C8200092F804A098E51
-:10041000E001B3822004A38000007ACB0300A81877
-:10042000000010390804EA1008047A102000008047
-:10043000400021CB0C00E810000041020C00EB1042
-:10044000F2010082402133020820610AC40004192D
-:10045000C70000990200610A0CE804140100610A57
-:100460000300480A00B80454C30004190CB800443F
-:100470000800C80A0CB80454C80004190A00610A2C
-:100480000900480A00680454C90004190C680044B3
-:100490000B00C80A0C680454CB0004190400610A5C
-:1004A0000600480A00780454C60004190C78004479
-:1004B0000500C80A0C780454C50004190700610A35
-:1004C0000C00480A00E80454CC0004190CE800446D
-:1004D0000E00C80A0CE80454CE0004190000404580
-:0804E0002010718B093F070099
-:00000001FF
-/*
- * Copyright (c) 1994 Creative Technology Ltd.
- * Microcode files for SB16 Advanced Signal Processor
- */
diff --git a/firmware/sun/cassini.bin.ihex b/firmware/sun/cassini.bin.ihex
deleted file mode 100644
index 5cd7ae70e71f..000000000000
--- a/firmware/sun/cassini.bin.ihex
+++ /dev/null
@@ -1,143 +0,0 @@
-:1000000000827E82090000000000008E8EFFCE82FA
-:1000100025FF010FCE8426FF0111CE853DDFE58649
-:1000200039B78FF87EC3C2964784F38A009747CECC
-:100030008233FF010F9646840C8104270B96468479
-:100040000C810827577E8425964784F38A049747B6
-:10005000CE8254FF010F9646840C81042638B612D6
-:1000600020842026037E8425967BD67CFE8F56BD79
-:10007000F7B6FE8F4EBDEC8EBDFAF7BDF728CE82E7
-:1000800082FF010F9646840C8104260AB612208452
-:100090002027B57E8425BDF71F7E841F964784F3F5
-:1000A0008A089747DEE1AD00CE82AFFF010F7E8464
-:1000B00025964185102606962385402706BDED002E
-:1000C0007E83A2DE42BDEB8E9624840827037E83C6
-:1000D000DF967BD67CFE8F56BDF7B6FE8F50BDEC0B
-:1000E0008EBDFAF78611C649BDE412CE82EFFF013C
-:1000F0000F9646840C81002717C649BDE491240D54
-:10010000B612208520260CCE82C1FF010F7E8425E9
-:100110007E8416FE8F52BDEC8EBDFAF7866AC64904
-:10012000BDE412CE8327FF010F9646840C81002781
-:100130000AC649BDE49125067E84257E8416B6183C
-:1001400070BB19702A0481AF2E19967BF62007FA2E
-:100150002027C4388138270BF62007FA2027CB0840
-:100160007E82D3BDF7668674C649BDE412CE837124
-:10017000FF010F9646840C8108260AC649BDE4910A
-:1001800025067E84257E8416BDF73E260EBDE50934
-:100190002606CE82C1FF010F7E8425FE8F54BDEC62
-:1001A0008EBDFAF7BDF733860FC651BDE412CE837C
-:1001B000B2FF010F9646840C8108265CB61220849B
-:1001C0003F813A271C9623854027037E8425C6510C
-:1001D000BDE49125037E8425CE82C1FF010F7E847C
-:1001E00025BDF8377C007ACE83EEFF010F7E842593
-:1001F0009646840C81082620962484082629B61861
-:1002000082BB1982B1013B2209B6122084378132A8
-:100210002715BDF8447E82C1BDF71FBDF844BDFC63
-:1002200029CE8225FF010F39964784FC8A00974723
-:10023000CE8434FF011196468403810227037E8514
-:100240001E964784FC8A029747DEE1AD008601B71F
-:100250001251BDF714B6103184FDB71031BDF81E30
-:100260009681D682FE8F5ABDF7B6FE8F5CBDEC8EAE
-:10027000BDFAF78608D600C51026028B20C651BDF0
-:10028000E412CE8486FF011196468403810227037F
-:100290007E850FC651BDE49125037E851E9644855B
-:1002A00010260AB61250BA013C851027A8BDF76681
-:1002B000CE84B7FF01117E851E96468403810226F7
-:1002C00050B612308403810127037E851E96448533
-:1002D000102613B61250BA013C85102609CE84535D
-:1002E000FF01117E851EB610318A02B71031BD851F
-:1002F0001FBDF8377C0080CE84FEFF01117E851E75
-:100300009646840381022609B612308403810127B0
-:100310000FBDF844BDF70BBDFC29CE8426FF0111AB
-:1003200039D622C40FB61230BA12328404270D9681
-:100330002285042705CA107E853ACA20D72239862D
-:1003400000978318CE1C00BDEB4696578501270207
-:100350004F3985022701397F8F7D8604B7120486C5
-:1003600008B712078610B7120C8607B71206B68FA9
-:100370007DB712708601BA1204B71204010101019F
-:100380000101B6120484FE8A02B7120401010101C0
-:10039000010186FDB41204B71204B612008408816C
-:1003A000082716B68F7D810C27088B04B78F7D7EBA
-:1003B000856C860397407E896E8607B712065FF7C5
-:1003C0008F825FF78F7FF78F70F78F71F78F72F7DC
-:1003D0008F73F78F74F78F75F78F76F78F77F78FA7
-:1003E00078F78F79F78F7AF78F7BB612048A10B778
-:1003F000120486E4B71270B71207F71205F7120954
-:100400008608BA1204B7120486F7B41204B71204AD
-:10041000010101010101B61208277F8180260B86A8
-:1004200008CE8F79BD897B7E868E8140260B86041F
-:10043000CE8F76BD897B7E868E8120260B8602CE6E
-:100440008F73BD897B7E868E8110260B8601CE8FB1
-:1004500070BD897B7E868E8108260B8608CE8F79BB
-:10046000BD897F7E868E8104260B8604CE8F76BD65
-:10047000897F7E868E8102260B8A02CE8F73BD898C
-:100480007F7E868E810126088601CE8F70BD897F92
-:10049000B68F7F810F26037E8747B61209840381BA
-:1004A0000327067C12097E85FEB6120684078107A3
-:1004B00027088B01B712067E86D5B68F82260A7C66
-:1004C0008F824FB712067E85C0B61206843F813FE9
-:1004D00027108B08B71206B6120984FCB712097EE2
-:1004E00085FECE8F7018CE8F84C60CBD896FCE8FDF
-:1004F0008418CE8F70C60CBD896FD683C14F2D0373
-:100500007E8740B68F7F8107270F810B2715810DCE
-:10051000271B810E27217E8740F78F7B8602B78FAE
-:100520007A201CF78F788602B78F772012F78F75A5
-:100530008602B78F742008F78F728602B78F717E9C
-:100540008747860497407E896ECE8F72BD89F7CE2D
-:100550008F75BD89F7CE8F78BD89F7CE8F7BBD892A
-:10056000F74FB78F7DB78F81B68F7227477C8F7D0E
-:10057000B68F75273F7C8F7DB68F7827377C8F7D30
-:10058000B68F7B272F7F8F7D7C8F817A8F72271B81
-:100590007C8F7D7A8F7527167C8F7D7A8F782711D7
-:1005A0007C8F7D7A8F7B270C7E87837A8F757A8FFD
-:1005B000787A8F7BCEC1FCF68F7D3AA600B7127099
-:1005C000B68F7226037E87FAB68F75260A18CE8FED
-:1005D00073BD89D57E87FAB68F78260A18CE8F76B6
-:1005E000BD89D57E87FAB68F7B260A18CE8F79BD56
-:1005F00089D57E87FA860597407E8900B68F7581FA
-:10060000072EF2F61206C4F81BB71206B68F7881D1
-:10061000072EE2484848F61206C4C71BB71206B6B2
-:100620008F7B81072ECFF61205C4F81BB712058603
-:1006300000F68F71BD89948601F68F74BD8994860A
-:1006400002F68F77BD89948603F68F7ABD8994CEA2
-:100650008F70A60181012707810327037E8866A684
-:1006600000B88F818401260B8C8F792C0E08080826
-:100670007E8850B612048A40B71204B6120484FB76
-:1006800084EFB71204B6120736B68F7C4848B7120B
-:10069000078601BA1204B7120401010101010186A3
-:1006A000FEB41204B712048602BA1204B71204860A
-:1006B000FDB41204B7120432B71207B61200840850
-:1006C0008108270F7C82082607867697407E896EF0
-:1006D0007E86ECB68F7F810F273CBDE6C7B7120D33
-:1006E000BDE6CBB612048A20B71204CEFFFFB612C5
-:1006F00000810C26050926F6271CB6120484DFB7F4
-:100700001204968381072C057C0083200696838B38
-:100710000897837E85417F8F7E8680B7120C860185
-:10072000B78F7DB6120C847FB7120C8A80B7120C7B
-:10073000860ABD8A06B6120A2A09B6120CBA8F7D3D
-:10074000B7120CB68F7E8160271A8B20B78F7EB6CA
-:10075000120C849FBA8F7EB7120CB68F7D48B78F6C
-:100760007D7E8921B612048A20B71204BD8A0A4F01
-:1007700039A60018A7000818085A26F539366C0063
-:1007800032BA8F7FB78F7FB612098403A701B612E2
-:1007900006843FA70239368603B78F8032C1002610
-:1007A00006B78F7C7E89C9C1012718C102270CC1F9
-:1007B000032700F68F800505F78F80F68F800505EB
-:1007C000F78F80F68F800505F78F80F68F8053F4C2
-:1007D00012071BB7120739CE8F70A60018E6001853
-:1007E000A700E700A60118E60118A701E701A60285
-:1007F00018E60218A702E70239A6008407E600C43B
-:10080000385454541BA700394A26FD399622840FC8
-:1008100097228601B78F70B61207B78F71F6120C48
-:10082000C40FC80FF78F72F68F72B68F71840327CB
-:10083000148101271C81022724F48F70272A962215
-:100840008A807E8A64F48F70271E96228A107E8AA0
-:1008500064F48F70271296228A207E8A64F48F7047
-:10086000270696228A409722748F71748F71788F31
-:1008700070B68F70851027AFD622C41058B612708C
-:1008800081E4273681E1260C96228420441BD6225F
-:10089000C4CF20235881C6260D9622844044441B91
-:1008A000D622C4AF2011588127260F962284804477
-:1008B00044441BD622C46F1B972239270C7C820626
-:0D08C000BDD9EDB682077E8AB97F82063968
-:00000001FF
-/* firmware patch for NS_DP83065 */
diff --git a/firmware/tehuti/bdx.bin.ihex b/firmware/tehuti/bdx.bin.ihex
deleted file mode 100644
index b029e4c85795..000000000000
--- a/firmware/tehuti/bdx.bin.ihex
+++ /dev/null
@@ -1,2678 +0,0 @@
-:1000000002000F00008071402D000000000000C0C1
-:1000100002000F00018071002D000000000080C070
-:1000200002000F00028071002D000000000000C1DE
-:1000300002000F00038071002D000000000080C14D
-:1000400002000F00048071002D000000000000C2BB
-:1000500002000F00058071002D000000000080C22A
-:1000600002000F00068071002D000000000000C398
-:1000700002000F00078071002D000000000080C307
-:1000800002000F00088071002D000000000000C475
-:1000900002000F00098071002D000000000080C4E4
-:1000A00002000F000A8071002D000000000000C552
-:1000B00002000F000B8071002D000000000080C5C1
-:1000C00002000F000C8071002D000000000000C62F
-:1000D00002000F000D8071002D000000000080C69E
-:1000E00002000F000E8071002D000000000000C70C
-:1000F00002000F000F8071002D000000000080C77B
-:1001000002000F00108071002D000000000000C8E8
-:1001100002000F00118071002D000000000080C857
-:1001200002000F00128071002D000000000000C9C5
-:1001300002000F00138071002D000000000080C934
-:1001400002000F00148071002D000000000000CAA2
-:1001500002000F00158071002D000000000080CA11
-:1001600002000F00168071002D000000000000CB7F
-:1001700002000F00178071002D000000000080CBEE
-:1001800002000F00188071002D000000000000CC5C
-:1001900002000F00198071002D000000000080CCCB
-:1001A00002000F001A8071002D000000000000CD39
-:1001B00002000F001B8071002D000000000080CDA8
-:1001C00002000F001C8071002D000000000000CE16
-:1001D00002000F001D8071002D000000000080CE85
-:1001E00002000F001E8071002D000000000000CFF3
-:1001F00002000F001F8071002D000000000080CF62
-:1002000002000F00208071002D000000000000D0CF
-:1002100002000F00218071002D000000000080D03E
-:1002200002000F00228071002D000000000000D1AC
-:1002300002000F00238071002D000000000080D11B
-:1002400002000F00248071002D000000000000D289
-:1002500002000F00258071002D000000000080D2F8
-:1002600002000F00268071002D000000000000D366
-:1002700002000F00278071002D000000000080D3D5
-:1002800002000F00288071002D000000000000D443
-:1002900002000F00298071002D000000000080D4B2
-:1002A00002000F002A8071002D000000000000D520
-:1002B00002000F002B8071002D000000000080D58F
-:1002C00002000F002C8071002D000000000000D6FD
-:1002D00002000F002D8071002D000000000080D66C
-:1002E00002000F002E8071002D000000000000D7DA
-:1002F00002000F002F8071002D000000000080D749
-:1003000002000F00308071002D000000000000D8B6
-:1003100002000F00318071002D000000000080D825
-:1003200002000F00328071002D000000000000D993
-:1003300002000F00338071002D000000000080D902
-:1003400002000F00348071002D000000000000DA70
-:1003500002000F00358071002D000000000080DADF
-:1003600002000F00368071002D000000000000DB4D
-:1003700002000F00378071002D000000000080DBBC
-:1003800002000F00388071007B000000008060DDFB
-:1003900002000F00398071002D000000000000DD18
-:1003A00002000F003A8071002D000000000080DB89
-:1003B00002000F003B8071002D000000000000DDF6
-:1003C00002000F003C8071002D000000000000DDE5
-:1003D00002000F003D8071000000000000000000DE
-:1003E00002000F003E8071000000000000000000CD
-:1003F00002000F003F8071000000000000000000BC
-:1004000002000F00408071000000000000000000AA
-:1004100002000F0041807100000000000000000099
-:1004200002000F0042807100000000000000000088
-:1004300002000F0043807100000000000000000077
-:1004400002000F0044807100000000000000000066
-:1004500002000F0045807100000000000000000055
-:1004600002000F0046807100000000000000000044
-:1004700002000F0047807100000000000000000033
-:1004800002000F0048807100000000000000000022
-:1004900002000F0049807100000000000000000011
-:1004A00002000F004A807100000000000000000000
-:1004B00002000F004B8071000000000000000000EF
-:1004C00002000F004C8071000000000000000000DE
-:1004D00002000F004D8071000000000000000000CD
-:1004E00002000F004E8071000000000000000000BC
-:1004F00002000F004F8071000000000000000000AB
-:1005000002000F0050807100000000000000000099
-:1005100002000F0051807100000000000000000088
-:1005200002000F0052807100000000000000000077
-:1005300002000F0053807100000000000000000066
-:1005400002000F0054807100000000000000000055
-:1005500002000F0055807100000000000000000044
-:1005600002000F0056807100000000000000000033
-:1005700002000F0057807100000000000000000022
-:1005800002000F0058807100000000000000000011
-:1005900002000F0059807100000000000000000000
-:1005A00002000F005A8071000000000000000000EF
-:1005B00002000F005B8071000000000000000000DE
-:1005C00002000F005C8071000000000000000000CD
-:1005D00002000F005D8071000000000000000000BC
-:1005E00002000F005E8071000000000000000000AB
-:1005F00002000F005F80710000000000000000009A
-:1006000002000F0060807100000000000000000088
-:1006100002000F0061807100000000000000000077
-:1006200002000F0062807100000000000000000066
-:1006300002000F0063807100000000000000000055
-:1006400002000F00648071002D000000000000DB3C
-:1006500002000F00658071003F000000040100DD12
-:1006600002000F00668071003F000000010018DDED
-:1006700002000F0067807100690000007A3D00DD14
-:1006800002000F00688071003F000000040800DDD8
-:1006900002000F0069807100690000007A3D00DDF2
-:1006A00002000F006A8071003F000000043000DD8E
-:1006B00002000F006B8071003F000000010018DD98
-:1006C00002000F006C807100690000007A3D00DDBF
-:1006D00002000F006D8071003F000000040000DD8B
-:1006E00002000F006E807100690000007A3D00DD9D
-:1006F00002000F006F8071003F000000043D00DD2C
-:1007000002000F00708071003F000000010018DD42
-:1007100002000F0071807100690000007A3D00DD69
-:1007200002000F00728071003F000000040700DD2E
-:1007300002000F0073807100690000007A3D00DD47
-:1007400002000F00748071003F000000842800DD6B
-:1007500002000F00758071003F000000010018DDED
-:1007600002000F0076807100690000007A3D00DD14
-:1007700002000F00778071003F000000043700DDA9
-:1007800002000F0078807100690000007A3D00DDF2
-:1007900002000F00798071003F000000042900DD95
-:1007A00002000F007A8071003F000000010018DD98
-:1007B00002000F007B807100690000007A3D00DDBF
-:1007C00002000F007C8071003F00000004AA04DDDD
-:1007D00002000F007D807100690000007A3D00DD9D
-:1007E00002000F007E8071003F000000042800DD41
-:1007F00002000F007F8071003F000000010018DD43
-:1008000002000F0080807100690000007A3D00DD69
-:1008100002000F00818071003F000000043100DD04
-:1008200002000F0082807100690000007A3D00DD47
-:1008300002000F00838071003F000000842B00DD68
-:1008400002000F00848071003F000000010018DDED
-:1008500002000F0085807100690000007A3D00DD14
-:1008600002000F00868071003F00000004E401DDFB
-:1008700002000F0087807100690000007A3D00DDF2
-:1008800002000F00888071003F000000840080D7C4
-:1008900002000F00898071003F000000010098D71E
-:1008A00002000F008A80710059000000EF3780D7E6
-:1008B00002000F008B8071003D0000006F0080F788
-:1008C00002000F008C8071003D0000006F0080F777
-:1008D00002000F008D8071003D0000006F0080F766
-:1008E00002000F008E8071002D0000007F02D6D71D
-:1008F00002000F008F807100180000008100FF17B8
-:1009000002000F00908071003D0000006F0080F732
-:1009100002000F00918071003D0000006F0080F721
-:1009200002000F00928071002D000000B800D8D79F
-:1009300002000F0093807100180000008100EB1787
-:1009400002000F00948071003F000000042900DDC8
-:1009500002000F00958071003F000000010018DDCB
-:1009600002000F0096807100690000007A3D00DDF2
-:1009700002000F00978071003F00000084AA04DD90
-:1009800002000F0098807100690000007A3D00DDD0
-:1009900002000F00998071003F000000042B00DD71
-:1009A00002000F009A8071003F000000010018DD76
-:1009B00002000F009B807100690000007A3D00DD9D
-:1009C00002000F009C8071003F000000040000DD69
-:1009D00002000F009D807100690000007A3D00DD7B
-:1009E00002000F009E8071003F000000842900DD9E
-:1009F00002000F009F8071003F000000010018DD21
-:100A000002000F00A0807100690000007A3D00DD47
-:100A100002000F00A18071003F000000040000DD13
-:100A200002000F00A2807100690000007A3D00DD25
-:100A300002000F00A38071003F000000042A00DDC7
-:100A400002000F00A48071003F000000010018DDCB
-:100A500002000F00A5807100690000007A3D00DDF2
-:100A600002000F00A68071003F000000849100DDAD
-:100A700002000F00A7807100690000007A3D00DDD0
-:100A800002000F00A88071003F000000841980D68A
-:100A900002000F00A98071003F000000010080D615
-:100AA00002000F00AA80710035000000ED0080D622
-:100AB00002000F00AB807100180000008100FF37BA
-:100AC00002000F00AC8071003F000000042B00DD2D
-:100AD00002000F00AD8071003F000000010018DD32
-:100AE00002000F00AE807100690000007A3D00DD59
-:100AF00002000F00AF8071003F000000040000DD25
-:100B000002000F00B0807100690000007A3D00DD36
-:100B100002000F00B18071003F000000842A00DD58
-:100B200002000F00B28071003F000000010018DDDC
-:100B300002000F00B3807100690000007A3D00DD03
-:100B400002000F00B48071003F000000040000DDCF
-:100B500002000F00B5807100690000007A3D00DDE1
-:100B600002000F00B68071003F000000840C80D6A8
-:100B700002000F00B78071003F000000010080D626
-:100B800002000F00B880710035000000ED0080D633
-:100B900002000F00B9807100180000008100FF37CB
-:100BA00002000F00BA8071003F000000842A00DDBF
-:100BB00002000F00BB8071003F000000010018DD43
-:100BC00002000F00BC807100690000007A3D00DD6A
-:100BD00002000F00BD8071003F000000040000DD36
-:100BE00002000F00BE807100690000007A3D00DD48
-:100BF00002000F00BF8071003F000000840F80D60C
-:100C000002000F00C08071003F000000010080D68C
-:100C100002000F00C180710035000000ED0080D699
-:100C200002000F00C2807100180000008100FF3731
-:100C300002000F00C38071003F000000042A00DDA5
-:100C400002000F00C48071003F000000010018DDA9
-:100C500002000F00C5807100690000007A3D00DDD0
-:100C600002000F00C68071003F000000841100DD0B
-:100C700002000F00C7807100690000007A3D00DDAE
-:100C800002000F00C88071003F000000842800DDD2
-:100C900002000F00C98071003F000000010018DD54
-:100CA00002000F00CA807100690000007A3D00DD7B
-:100CB00002000F00CB8071003F000000843700DD90
-:100CC00002000F00CC807100690000007A3D00DD59
-:100CD00002000F00CD8071002D000000000080D3C5
-:100CE00002000F00CE8071003F000000803700D26C
-:100CF00002000F00CF8071003F000000040480D18B
-:100D000002000F00D08071003F000000010084D17C
-:100D100002000F00D180710069000000763B00DD09
-:100D200002000F00D280710069000000763B00DDF8
-:100D300002000F00D380710069000000763B00DDE7
-:100D400002000F00D48071003F00000084FF7FD1BB
-:100D500002000F00D58071003F00000081FF7FD1AD
-:100D600002000F00D680710069000000763B00DDB4
-:100D700002000F00D780710069000000763B00DDA3
-:100D800002000F00D880710069000000763B00DD92
-:100D900002000F00D980710069000000763B00DD81
-:100DA00002000F00DA80710069000000763B00DD70
-:100DB00002000F00DB80710069000000763B00DD5F
-:100DC00002000F00DC8071003F000000840780D625
-:100DD00002000F00DD8071003F000000010080D69E
-:100DE00002000F00DE80710035000000ED0080D6AB
-:100DF00002000F00DF807100180000008100FF3743
-:100E000002000F00E080710049000000633B00DD3C
-:100E100002000F00E180710059000000763B00DD08
-:100E200002000F00E28071003D0000006F0080F7BB
-:100E300002000F00E38071003D0000006F0080F7AA
-:100E400002000F00E48071003D0000006F0080F799
-:100E500002000F00E58071002D0000007F0206DD1A
-:100E600002000F00E6807100180000007A3D7F1D2F
-:100E700002000F00E780710045000000393100DDFD
-:100E800002000F00E8807100940000003B310B006D
-:100E900002000F00E9807100940000003D3109005C
-:100EA00002000F00EA807100940000003F3107004B
-:100EB00002000F00EB80710094000000763B0500FB
-:100EC00002000F00EC807100090000007A3DEDC1C6
-:100ED00002000F00ED8071003F00000080B700D2DB
-:100EE00002000F00EE8071003F000000842800DD4A
-:100EF00002000F00EF8071003F000000010018DDCC
-:100F000002000F00F080710069000000643200DD13
-:100F100002000F00F1807100690000007A3D00DDE1
-:100F200002000F00F28071003F000000840780D6AD
-:100F300002000F00F38071003F000000010080D626
-:100F400002000F00F480710035000000ED0080D633
-:100F500002000F00F5807100180000008100FF37CB
-:100F600002000F00F680710049000000633B00DDC5
-:100F700002000F00F780710059000000763B00DD91
-:100F800002000F00F88071003D0000006F0080F744
-:100F900002000F00F98071003D0000006F0080F733
-:100FA00002000F00FA8071003D0000006F0080F722
-:100FB00002000F00FB8071002D0000007F0206DDA3
-:100FC00002000F00FC807100180000007A3D7F1DB8
-:100FD00002000F00FD807100450000003A3100DD85
-:100FE00002000F00FE80710018000000763B2D1DEE
-:100FF00002000F00FF807100450000003C3100DD61
-:1010000002000F000081710018000000763B131DE4
-:1010100002000F0001817100450000003E3100DD3B
-:1010200002000F000281710018000000763B1B1DBA
-:1010300002000F00038171003F000000043000DD5A
-:1010400002000F00048171003F000000010018DD64
-:1010500002000F0005817100690000007A3D00DD8B
-:1010600002000F00068171003F000000040100DD56
-:1010700002000F0007817100690000007A3D00DD69
-:1010800002000F0008817100090000007A3D2DC5A3
-:1010900002000F000981710029000000640001D2E4
-:1010A00002000F000A8171003F000000842800DD6B
-:1010B00002000F000B8171003F000000010018DDED
-:1010C00002000F000C81710069000000643200DD35
-:1010D00002000F000D817100690000007A3D00DD03
-:1010E00002000F000E817100090000007A3D29C244
-:1010F00002000F000F81710029000000640000D27F
-:1011000002000F00108171003F000000842800DD04
-:1011100002000F00118171003F000000010018DD86
-:1011200002000F001281710069000000643200DDCE
-:1011300002000F0013817100690000007A3D00DD9C
-:1011400002000F001481710049000000633B00DDC4
-:1011500002000F001581710059000000763B00DD90
-:1011600002000F00168171003D0000006F0080F743
-:1011700002000F00178171003D0000006F0080F732
-:1011800002000F00188171003D0000006F0080F721
-:1011900002000F00198171002D0000007F0206DDA2
-:1011A00002000F001A817100180000007A3D7F1DB7
-:1011B00002000F001B817100450000003A3100DD84
-:1011C00002000F001C81710018000000763B0F1D0B
-:1011D00002000F001D8171003F000000043000DD9F
-:1011E00002000F001E8171003F000000010018DDA9
-:1011F00002000F001F817100690000007A3D00DDD0
-:1012000002000F00208171003F000000040100DD9A
-:1012100002000F0021817100690000007A3D00DDAD
-:1012200002000F0022817100090000007A3D2DC5E7
-:1012300002000F00238171002D000000820008D100
-:1012400002000F0024817100080000007A3DC323D2
-:1012500002000F0025817100490000000A3B00D602
-:1012600002000F00268171003F000000040000D33F
-:1012700002000F00278171003F000000010004D32D
-:1012800002000F00288171002F000000854081D6E8
-:1012900002000F00298171003F00000084FFFFD48D
-:1012A00002000F002A8171003F000000810780D4F6
-:1012B00002000F002B8171003F00000084FFFFD16E
-:1012C00002000F002C8171003F000000010080D15E
-:1012D00002000F002D81710049000000663600DD1C
-:1012E00002000F002E81710069000000763B00DDD6
-:1012F00002000F002F81710069000000763B00DDC5
-:1013000002000F003081710069000000763B00DDB3
-:1013100002000F003181710069000000693B00DDAF
-:1013200002000F003281710069000000763B00DD91
-:1013300002000F003381710069000000763B00DD80
-:1013400002000F003481710069000000763B00DD6F
-:1013500002000F003581710069000000693B00DD6B
-:1013600002000F0036817100610000006C0400F67D
-:1013700002000F003781710035000000ED0080D6BB
-:1013800002000F00388171001800000081006B3DE1
-:1013900002000F0039817100490000008B0500D662
-:1013A00002000F003A8171002F000000060181D673
-:1013B00002000F003B8171002D000000000000D2F0
-:1013C00002000F003C81710021000000E40000D207
-:1013D00002000F003D8171003D0000006F0080F7AA
-:1013E00002000F003E8171002D0000007F0106DD2C
-:1013F00002000F003F817100180000007A3D7F1D40
-:1014000002000F0040817100490000006C3600D8D6
-:1014100002000F004181710069000000E73300D82D
-:1014200002000F004281710069000000E73300D81C
-:1014300002000F004381710069000000EF3700D8FF
-:1014400002000F0044817100310000006C0100D6E1
-:1014500002000F00458171002D000000000000D146
-:1014600002000F004681710049000000E4337AD188
-:1014700002000F00478171002F000000620171D14E
-:1014800002000F00488171002F000000620161D14D
-:1014900002000F004981710049000000E33340D190
-:1014A00002000F004A8171003D0000006F0080F7CC
-:1014B00002000F004B8171002D0000007F0106DD4E
-:1014C00002000F004C817100180000007A3D7F1D62
-:1014D00002000F004D817100490000006C3600D8F9
-:1014E00002000F004E81710069000000E73300D850
-:1014F00002000F004F81710069000000623100D8C6
-:1015000002000F005081710069000000EF3700D821
-:1015100002000F0051817100310000006C0100D603
-:1015200002000F00528171003D0000006F0080F743
-:1015300002000F00538171002D0000007F0106DDC5
-:1015400002000F0054817100180000007A3D7F1DD9
-:1015500002000F0055817100490000006C3600D870
-:1015600002000F005681710069000000E73300D8C7
-:1015700002000F005781710069000000E73300D8B6
-:1015800002000F005881710069000000EF3700D899
-:1015900002000F0059817100310000006C0100D67B
-:1015A00002000F005A8171002D000000000000D1E0
-:1015B00002000F005B8171002D000000E4076CD178
-:1015C00002000F005C81710049000000E33340D14C
-:1015D00002000F005D8171003D0000006F0080F788
-:1015E00002000F005E8171002D0000007F0106DD0A
-:1015F00002000F005F817100180000007A3D7F1D1E
-:1016000002000F0060817100490000006C3600D8B4
-:1016100002000F006181710069000000E73300D80B
-:1016200002000F006281710069000000623100D881
-:1016300002000F006381710069000000EF3700D8DD
-:1016400002000F0064817100310000006C0100D6BF
-:1016500002000F00658171003D0000006F0080F7FF
-:1016600002000F00668171002D0000007F0106DD81
-:1016700002000F0067817100180000007A3D7F1D95
-:1016800002000F0068817100490000006C3600D82C
-:1016900002000F006981710069000000E73300D883
-:1016A00002000F006A81710069000000E73300D872
-:1016B00002000F006B81710069000000EF3700D855
-:1016C00002000F006C817100310000006C0100D637
-:1016D00002000F006D8171002D000000000000D19C
-:1016E00002000F006E81710049000000E43378D1E0
-:1016F00002000F006F8171002F000000620171D1A4
-:1017000002000F00708171002F000000620161D1A2
-:1017100002000F007181710049000000E33340D1E5
-:1017200002000F00728171003D0000006F0080F721
-:1017300002000F00738171002D0000007F0106DDA3
-:1017400002000F0074817100180000007A3D7F1DB7
-:1017500002000F0075817100490000006C3600D84E
-:1017600002000F007681710069000000E73300D8A5
-:1017700002000F007781710069000000623100D81B
-:1017800002000F007881710069000000EF3700D877
-:1017900002000F0079817100310000006C0100D659
-:1017A00002000F007A8171003D0000006F0080F799
-:1017B00002000F007B8171002D0000007F0106DD1B
-:1017C00002000F007C817100180000007A3D7F1D2F
-:1017D00002000F007D817100490000006C3600D8C6
-:1017E00002000F007E81710069000000E73300D81D
-:1017F00002000F007F81710069000000E73300D80C
-:1018000002000F008081710069000000EF3700D8EE
-:1018100002000F0081817100310000006C0100D6D0
-:1018200002000F00828171002D000000000000D135
-:1018300002000F00838171002D000000E40768D1D1
-:1018400002000F008481710049000000E33340D1A1
-:1018500002000F00858171003D0000006F0080F7DD
-:1018600002000F00868171002D0000007F0106DD5F
-:1018700002000F0087817100180000007A3D7F1D73
-:1018800002000F0088817100490000006C3600D80A
-:1018900002000F008981710069000000E73300D861
-:1018A00002000F008A81710069000000623100D8D7
-:1018B00002000F008B81710069000000EF3700D833
-:1018C00002000F008C817100310000006C0100D615
-:1018D00002000F008D81710035000000ED0080D600
-:1018E00002000F008E817100080000008100792243
-:1018F00002000F008F817100490000000C0600D625
-:1019000002000F00908171002F000000060181D6B7
-:1019100002000F00918171003F000000020080D49E
-:1019200002000F00928171003F000000840080D40B
-:1019300002000F00938171003F000000020100D5FA
-:1019400002000F00948171003F000000840100D567
-:1019500002000F00958171003F000000020280D557
-:1019600002000F00968171003F000000040280D544
-:1019700002000F00978171003D0000006F0080F7AA
-:1019800002000F00988171002D0000007F0106DD2C
-:1019900002000F0099817100180000007A3D7F1D40
-:1019A00002000F009A817100490000006C3600D8D7
-:1019B00002000F009B81710069000000E93400D82B
-:1019C00002000F009C817100690000006A3500D898
-:1019D00002000F009D81710069000000EF3700D800
-:1019E00002000F009E817100310000006C0100D6E2
-:1019F00002000F009F81710041000000EB3480D491
-:101A000002000F00A0817100410000006B3500D57D
-:101A100002000F00A181710035000000ED0080D6AA
-:101A200002000F00A2817100180000008100EB3756
-:101A300002000F00A3817100490000000D3B00D699
-:101A400002000F00A481710049000000073B80D60E
-:101A500002000F00A58171002D000000000000D1E0
-:101A600002000F00A681710049000000663600DD0B
-:101A700002000F00A781710069000000763B00DDC5
-:101A800002000F00A881710069000000763B00DDB4
-:101A900002000F00A981710069000000763B00DDA3
-:101AA00002000F00AA81710069000000763B00DD92
-:101AB00002000F00AB81710069000000763B00DD81
-:101AC00002000F00AC81710069000000763B00DD70
-:101AD00002000F00AD81710069000000763B00DD5F
-:101AE00002000F00AE81710069000000763B00DD4E
-:101AF00002000F00AF817100610000006C0400F66D
-:101B000002000F00B081710035000000ED0080D6AA
-:101B100002000F00B1817100180000008100EB3756
-:101B200002000F00B2817100490000000E3B00D698
-:101B300002000F00B381710049000000083B80D60D
-:101B400002000F00B481710049000000093B80D5FC
-:101B500002000F00B58171003D0000006F0080F7AA
-:101B600002000F00B68171002D0000007F0106DD2C
-:101B700002000F00B7817100180000007A3D7F1D40
-:101B800002000F00B8817100490000006C3600D8D7
-:101B900002000F00B981710069000000EB3500D828
-:101BA00002000F00BA81710069000000E73300D81D
-:101BB00002000F00BB81710069000000EF3700D800
-:101BC00002000F00BC81710041000000EC0700D64C
-:101BD00002000F00BD817100410000006B0880D53C
-:101BE00002000F00BE81710035000000ED0080D6BC
-:101BF00002000F00BF817100180000008100ED3766
-:101C000002000F00C08171003F00000080FFFFD480
-:101C100002000F00C18171003F000000040002D5E6
-:101C200002000F00C28171003F000000010018D5C2
-:101C300002000F00C3817100490000006A3B00DD13
-:101C400002000F00C481710069000000693B00DDE3
-:101C500002000F00C581710069000000693B00DDD2
-:101C600002000F00C681710021000000EA0000D5CB
-:101C700002000F00C7817100490000006A3B0EDDC1
-:101C800002000F00C8817100350000007A0004D105
-:101C900002000F00C9817100180000008100F537B3
-:101CA00002000F00CA8171003F00000080FFFFD4D6
-:101CB00002000F00CB8171003F000000040004D53A
-:101CC00002000F00CC8171003F000000010018D518
-:101CD00002000F00CD81710069000000693B00DD4A
-:101CE00002000F00CE81710069000000693B00DD39
-:101CF00002000F00CF817100490000006A3B00DD47
-:101D000002000F00D081710051000000EA0000F5D0
-:101D100002000F00D18171003D0000006F0080F7CC
-:101D200002000F00D28171003D0000006F0080F7BB
-:101D300002000F00D3817100490000006A3B0EDDF4
-:101D400002000F00D4817100350000007A8004D1B8
-:101D500002000F00D5817100180000008100F537E6
-:101D600002000F00D68171003F000000047F7FC792
-:101D700002000F00D78171003F000000017F7FC784
-:101D800002000F00D88171003F000000004080D6A3
-:101D900002000F00D98171003F00000000C003D194
-:101DA00002000F00DA81710025000000E20020DE51
-:101DB00002000F00DB817100490000004E2780DE29
-:101DC00002000F00DC8171003D0000006F0080F711
-:101DD00002000F00DD8171003D0000006F0080F700
-:101DE00002000F00DE81710035000000E20000D12A
-:101DF00002000F00DF81710035000000ED0080D689
-:101E000002000F00E0817100180000008100F5372A
-:101E100002000F00E18171003F000000043000DD8E
-:101E200002000F00E28171003F000000010018DD98
-:101E300002000F00E3817100690000003A1D00DD1F
-:101E400002000F00E4817100690000007A3D00DDAE
-:101E500002000F00E58171007D00000013A760C73C
-:101E600002000F00E681710031000000410080C0D7
-:101E700002000F00E781710031000000480000C43B
-:101E800002000F00E881710031000000450080C2AF
-:101E900002000F00E9817100000000000000000056
-:101EA00002000F00EA817100000000000000000045
-:101EB00002000F00EB817100000000000000000034
-:101EC00002000F00EC817100000000000000000023
-:101ED00002000F00ED817100000000000000000012
-:101EE00002000F00EE817100000000000000000001
-:101EF00002000F00EF8171000000000000000000F0
-:101F000002000F00F08171000000000000000000DE
-:101F100002000F00F18171000000000000000000CD
-:101F200002000F00F28171000000000000000000BC
-:101F300002000F00F38171000000000000000000AB
-:101F400002000F00F48171002D000000000000DB92
-:101F500002000F00F58171003F000000043000DD39
-:101F600002000F00F68171003F000000010018DD43
-:101F700002000F00F7817100690000007A3D00DD6A
-:101F800002000F00F88171003F000000040000DD36
-:101F900002000F00F9817100690000007A3D00DD48
-:101FA00002000F00FA8171002D000000000080D3B4
-:101FB00002000F00FB8171003F000000040400DDFF
-:101FC00002000F00FC8171003F000000010018DDDD
-:101FD00002000F00FD81710069000000140A00DD9D
-:101FE00002000F00FE817100690000007A3D00DDF3
-:101FF00002000F00FF81710049000000943304D1FA
-:1020000002000F00008271003F000000840400DD28
-:1020100002000F00018271003F000000010018DD86
-:1020200002000F000282710069000000623100DDD1
-:1020300002000F0003827100690000007A3D00DD9C
-:1020400002000F00048271003F000000040500DD63
-:1020500002000F00058271003F000000010018DD42
-:1020600002000F000682710069000000950A00DD81
-:1020700002000F0007827100690000007A3D00DD58
-:1020800002000F000882710049000000953304D15E
-:1020900002000F00098271003F000000840500DD8E
-:1020A00002000F000A8271003F000000010018DDED
-:1020B00002000F000B82710069000000623100DD38
-:1020C00002000F000C827100690000007A3D00DD03
-:1020D00002000F000D8271003F000000040600DDC9
-:1020E00002000F000E8271003F000000010018DDA9
-:1020F00002000F000F827100690000007A3D00DDD0
-:1021000002000F00108271003F000000840000DD1B
-:1021100002000F0011827100690000007A3D00DDAD
-:1021200002000F00128271003F000000040000DD79
-:1021300002000F00138271003F000000010018DD53
-:1021400002000F001482710069000000160B00DD10
-:1021500002000F0015827100690000007A3D00DD69
-:1021600002000F00168271003F000000041000DD25
-:1021700002000F00178271003F000000010018DD0F
-:1021800002000F0018827100690000007A3D00DD36
-:1021900002000F00198271003F000000040000DD02
-:1021A00002000F001A827100690000007A3D00DD14
-:1021B00002000F001B8271003F000000841000DD50
-:1021C00002000F001C8271003F000000010018DDBA
-:1021D00002000F001D827100690000007A3D00DDE1
-:1021E00002000F001E8271003F000000048001DD2C
-:1021F00002000F001F827100690000007A3D00DDBF
-:1022000002000F00208271003F000000041100DD79
-:1022100002000F00218271003F000000010018DD64
-:1022200002000F0022827100690000007A3D00DD8B
-:1022300002000F00238271003F000000040000DD57
-:1022400002000F0024827100690000007A3D00DD69
-:1022500002000F00258271003F000000841100DDA4
-:1022600002000F00268271003F000000010018DD0F
-:1022700002000F0027827100690000007A3D00DD36
-:1022800002000F00288271003F000000040016DDEC
-:1022900002000F0029827100690000007A3D00DD14
-:1022A00002000F002A8271003F000000041200DDCE
-:1022B00002000F002B8271003F000000010018DDBA
-:1022C00002000F002C827100690000007A3D00DDE1
-:1022D00002000F002D8271003F000000040000DDAD
-:1022E00002000F002E827100690000007A3D00DDBF
-:1022F00002000F002F8271003F000000841200DDF9
-:1023000002000F00308271003F000000010018DD64
-:1023100002000F0031827100690000007A3D00DD8B
-:1023200002000F00328271003F000000040000DD57
-:1023300002000F0033827100690000007A3D00DD69
-:1023400002000F00348271003F000000041300DD22
-:1023500002000F00358271003F000000010018DD0F
-:1023600002000F0036827100690000007A3D00DD36
-:1023700002000F00378271003F000000040000DD02
-:1023800002000F0038827100690000007A3D00DD14
-:1023900002000F00398271003F000000841300DD4D
-:1023A00002000F003A8271003F000000010018DDBA
-:1023B00002000F003B827100690000007A3D00DDE1
-:1023C00002000F003C8271003F000000040005DDA8
-:1023D00002000F003D827100690000007A3D00DDBF
-:1023E00002000F003E8271003F000000042000DD6B
-:1023F00002000F003F8271003F000000010018DD65
-:1024000002000F0040827100690000007A3D00DD8B
-:1024100002000F00418271003F000000040000DD57
-:1024200002000F0042827100690000007A3D00DD69
-:1024300002000F00438271003F000000842000DD95
-:1024400002000F00448271003F000000010018DD0F
-:1024500002000F0045827100690000007A3D00DD36
-:1024600002000F00468271003F000000049001DD71
-:1024700002000F0047827100690000007A3D00DD14
-:1024800002000F00488271003F000000042100DDBF
-:1024900002000F00498271003F000000010018DDBA
-:1024A00002000F004A827100690000007A3D00DDE1
-:1024B00002000F004B8271003F000000840000DD2D
-:1024C00002000F004C827100690000007A3D00DDBF
-:1024D00002000F004D8271003F000000842100DDEA
-:1024E00002000F004E8271003F000000010018DD65
-:1024F00002000F004F827100690000007A3D00DD8C
-:1025000002000F00508271003F000000040000DD57
-:1025100002000F0051827100690000007A3D00DD69
-:1025200002000F00528271003F000000042200DD13
-:1025300002000F00538271003F000000010018DD0F
-:1025400002000F0054827100690000007A3D00DD36
-:1025500002000F00558271003F000000840200DD80
-:1025600002000F0056827100690000007A3D00DD14
-:1025700002000F00578271003F000000842200DD3E
-:1025800002000F00588271003F000000010018DDBA
-:1025900002000F0059827100690000007A3D00DDE1
-:1025A00002000F005A8271003F000000040000DDAD
-:1025B00002000F005B827100690000007A3D00DDBF
-:1025C00002000F005C8271003F000000042300DD68
-:1025D00002000F005D8271003F000000010018DD65
-:1025E00002000F005E827100690000007A3D00DD8C
-:1025F00002000F005F8271003F000000040000DD58
-:1026000002000F0060827100690000007A3D00DD69
-:1026100002000F00618271003F000000041800DD1D
-:1026200002000F00628271003F000000010018DD0F
-:1026300002000F006382710069000000970B00DD4B
-:1026400002000F0064827100690000007A3D00DD25
-:1026500002000F006582710049000000973304D129
-:1026600002000F00668271003F000000841800DD48
-:1026700002000F00678271003F000000010018DDBA
-:1026800002000F006882710069000000623100DD05
-:1026900002000F0069827100690000007A3D00DDD0
-:1026A00002000F006A8271003F000000041900DD83
-:1026B00002000F006B8271003F000000010018DD76
-:1026C00002000F006C82710069000000180C00DD30
-:1026D00002000F006D827100690000007A3D00DD8C
-:1026E00002000F006E82710049000000983304D18F
-:1026F00002000F006F8271003F000000841900DDAE
-:1027000002000F00708271003F000000010018DD20
-:1027100002000F007182710069000000623100DD6B
-:1027200002000F0072827100690000007A3D00DD36
-:1027300002000F00738271003F000000041A00DDE8
-:1027400002000F00748271003F000000010018DDDC
-:1027500002000F0075827100690000007A3D00DD03
-:1027600002000F00768271003F000000040000DDCF
-:1027700002000F0077827100690000007A3D00DDE1
-:1027800002000F00788271003F000000841A00DD13
-:1027900002000F00798271003F000000010018DD87
-:1027A00002000F007A82710069000000160B00DD44
-:1027B00002000F007B827100690000007A3D00DD9D
-:1027C00002000F007C8271003F000000041C00DD4D
-:1027D00002000F007D8271003F000000010018DD43
-:1027E00002000F007E82710069000000990C00DD7C
-:1027F00002000F007F827100690000007A3D00DD59
-:1028000002000F00808271003F000000841C00DD88
-:1028100002000F00818271003F000000010018DDFE
-:1028200002000F0082827100690000001A0D00DDB5
-:1028300002000F0083827100690000007A3D00DD14
-:1028400002000F00848271003F000000041D00DDC3
-:1028500002000F00858271003F000000010018DDBA
-:1028600002000F0086827100690000009B0D00DDF0
-:1028700002000F0087827100690000007A3D00DDD0
-:1028800002000F0088827100490000009B3304D1D0
-:1028900002000F00898271003F000000841D00DDEE
-:1028A00002000F008A8271003F000000010018DD65
-:1028B00002000F008B82710069000000623100DDB0
-:1028C00002000F008C827100690000007A3D00DD7B
-:1028D00002000F008D8271003F000000041E00DD29
-:1028E00002000F008E8271003F000000010018DD21
-:1028F00002000F008F827100690000001C0E00DDD5
-:1029000002000F0090827100690000007A3D00DD36
-:1029100002000F00918271003F000000040100DD01
-:1029200002000F00928271003F000000010018DDDC
-:1029300002000F0093827100690000007A3D00DD03
-:1029400002000F00948271003F000000040F00DDC0
-:1029500002000F0095827100690000007A3D00DDE1
-:1029600002000F00968271007D00000013A760C76F
-:1029700002000F009782710031000000410080C00A
-:1029800002000F009882710031000000480000C46E
-:1029900002000F009982710031000000450080C2E2
-:1029A00002000F009A827100310000006D0080D695
-:1029B0000F000F0064007000000000000000000025
-:1029C00000000000400000000001000000040000C2
-:1029D000640000005400000000000000002400001B
-:1029E0000028000000040000802800008001000092
-:1029F00003000000000000000000000000000000D4
-:102A0000510000007D01000008000000510000009E
-:102A10005D00000000000000090000000050000000
-:102A200000000000000000000F000F00F401700023
-:102A30000000000000000000000000004000000056
-:102A400000010000000400006400000054000000C9
-:102A50000000000000240000002800000004000026
-:102A6000802800008001000003000000000000003A
-:102A70000000000000000000510000007D01000087
-:102A800008000000510000005D0000000000000090
-:102A900009000000005000000000000000000000DD
-:102AA00002000F00000070000100000000000000A4
-:102AB00002000F0000007000010000000000000094
-:102AC00002000F00008071002500000002000EDDF2
-:102AD00002000F000180710004000000763BD1016C
-:102AE00002000F00028071002500000082000EDD50
-:102AF00002000F000380710004000000763B890291
-:102B000002000F00048071002500000002010EDDAC
-:102B100002000F000580710004000000763B850272
-:102B200002000F00068071002500000082010EDD0A
-:102B300002000F000780710004000000763BFD03D7
-:102B400002000F000880710009000000763B81CF71
-:102B500002000F000980710000000000000000006A
-:102B600002000F000A807100000000000000000059
-:102B700002000F000B807100000000000000000048
-:102B800002000F000C807100000000000000000037
-:102B900002000F000D807100000000000000000026
-:102BA00002000F000E807100000000000000000015
-:102BB00002000F000F807100000000000000000004
-:102BC00002000F00108071000000000000000000F3
-:102BD00002000F00118071000000000000000000E2
-:102BE00002000F00128071000000000000000000D1
-:102BF00002000F00138071000000000000000000C0
-:102C000002000F00148071000000000000000000AE
-:102C100002000F001580710000000000000000009D
-:102C200002000F001680710000000000000000008C
-:102C300002000F001780710000000000000000007B
-:102C400002000F001880710000000000000000006A
-:102C500002000F0019807100000000000000000059
-:102C600002000F001A807100000000000000000048
-:102C700002000F001B807100000000000000000037
-:102C800002000F001C807100000000000000000026
-:102C900002000F001D807100000000000000000015
-:102CA00002000F001E807100000000000000000004
-:102CB00002000F001F8071000000000000000000F3
-:102CC00002000F00208071000000000000000000E2
-:102CD00002000F00218071000000000000000000D1
-:102CE00002000F00228071000000000000000000C0
-:102CF00002000F00238071000000000000000000AF
-:102D000002000F002480710000000000000000009D
-:102D100002000F002580710000000000000000008C
-:102D200002000F002680710000000000000000007B
-:102D300002000F002780710000000000000000006A
-:102D400002000F002880710049000000003B00C015
-:102D500002000F002980710049000000023B80C082
-:102D600002000F002A80710049000000033B00C1EF
-:102D700002000F002B80710049000000043B80C15D
-:102D800002000F002C80710029000000760060DF37
-:102D900002000F002D807100490000007D3B44DFE0
-:102DA00002000F002E80710079000000769060FD17
-:102DB00002000F002F8071003D0000006F0080F7BF
-:102DC00002000F00308071003D0000006F0080F7AE
-:102DD00002000F00318071003D0000006F0080F79D
-:102DE00002000F00328071003D0000006F0080F78C
-:102DF00002000F003380710000000000000000009E
-:102E000002000F003480710000000000000000008C
-:102E100002000F003580710000000000000000007B
-:102E200002000F003680710000000000000000006A
-:102E300002000F0037807100000000000000000059
-:102E400002000F0038807100000000000000000048
-:102E500002000F0039807100000000000000000037
-:102E600002000F003A807100000000000000000026
-:102E700002000F003B807100000000000000000015
-:102E800002000F003C807100000000000000000004
-:102E900002000F003D8071000000000000000000F3
-:102EA00002000F003E8071000000000000000000E2
-:102EB00002000F003F8071000000000000000000D1
-:102EC00002000F00408071000000000000000000C0
-:102ED00002000F00418071000000000000000000AF
-:102EE00002000F004280710000000000000000009E
-:102EF00002000F004380710000000000000000008D
-:102F000002000F004480710000000000000000007B
-:102F100002000F004580710000000000000000006A
-:102F200002000F0046807100000000000000000059
-:102F300002000F0047807100000000000000000048
-:102F400002000F0048807100000000000000000037
-:102F500002000F0049807100000000000000000026
-:102F600002000F004A807100000000000000000015
-:102F700002000F004B807100000000000000000004
-:102F800002000F004C8071000000000000000000F3
-:102F900002000F004D8071000000000000000000E2
-:102FA00002000F004E8071000000000000000000D1
-:102FB00002000F004F8071000000000000000000C0
-:102FC00002000F00508071000000000000000000AF
-:102FD00002000F005180710000000000000000009E
-:102FE00002000F005280710000000000000000008D
-:102FF00002000F005380710000000000000000007C
-:1030000002000F005480710000000000000000006A
-:1030100002000F0055807100000000000000000059
-:1030200002000F0056807100000000000000000048
-:1030300002000F0057807100000000000000000037
-:1030400002000F0058807100000000000000000026
-:1030500002000F0059807100000000000000000015
-:1030600002000F005A807100000000000000000004
-:1030700002000F005B8071000000000000000000F3
-:1030800002000F005C8071000000000000000000E2
-:1030900002000F005D8071000000000000000000D1
-:1030A00002000F005E8071000000000000000000C0
-:1030B00002000F005F8071000000000000000000AF
-:1030C00002000F00608071003F000000030000DF7D
-:1030D00002000F00618071002D000000810FE0DD13
-:1030E00002000F00628071003F000000830280DD5B
-:1030F00002000F00638071002D000000800104DDDC
-:1031000002000F00648071007D000000800015FD4A
-:1031100002000F00658071007A000000763B2010ED
-:1031200002000F00668071007A000000767B20307C
-:1031300002000F006780710021000000600024D0B1
-:1031400002000F00688071003F000000040100DDF4
-:1031500002000F00698071003F000000810240DD25
-:1031600002000F006A8071007900000003BB31DDAE
-:1031700002000F006B8071007900000004FB31DD5C
-:1031800002000F006C8071007900000076BB31DD19
-:1031900002000F006D8071007900000076FB31DDC8
-:1031A00002000F006E80710079000000010121FD16
-:1031B00002000F006F8071007D00000081402BFD38
-:1031C00002000F0070807100400000000230003DDE
-:1031D00002000F007180710048000000023B001DDA
-:1031E00002000F007280710079000000767B21DD03
-:1031F00002000F00738071002D0000007F0504DDC8
-:1032000002000F007480710018000000763B7F3DC3
-:1032100002000F00758071003D0000006F0080F714
-:1032200002000F00768071003D0000006F0080F703
-:1032300002000F00778071003D0000006F0080F7F2
-:1032400002000F007880710021000000761F37E334
-:1032500002000F007980710049000000793B00DD19
-:1032600002000F007A8071007900000076BB21DD3A
-:1032700002000F007B80710049000000793B00DDF7
-:1032800002000F007C8071007900000076BB21DD18
-:1032900002000F007D80710049000000793B00DDD5
-:1032A00002000F007E8071007900000076BB21DDF6
-:1032B00002000F007F80710079000000769060FDB1
-:1032C00002000F00808071007900000076FB21DD94
-:1032D00002000F00818071003F000000830000DFCA
-:1032E00002000F00828071003D0000006F0080F737
-:1032F00002000F0083807100000000000000000049
-:1033000002000F0084807100000000000000000037
-:1033100002000F0085807100000000000000000026
-:1033200002000F0086807100000000000000000015
-:1033300002000F0087807100000000000000000004
-:1033400002000F00888071000000000000000000F3
-:1033500002000F00898071000000000000000000E2
-:1033600002000F008A8071000000000000000000D1
-:1033700002000F008B8071000000000000000000C0
-:1033800002000F008C8071000000000000000000AF
-:1033900002000F008D80710000000000000000009E
-:1033A00002000F008E80710000000000000000008D
-:1033B00002000F008F80710000000000000000007C
-:1033C00002000F009080710000000000000000006B
-:1033D00002000F009180710000000000000000005A
-:1033E00002000F0092807100000000000000000049
-:1033F00002000F0093807100000000000000000038
-:1034000002000F0094807100000000000000000026
-:1034100002000F0095807100000000000000000015
-:1034200002000F0096807100000000000000000004
-:1034300002000F00978071000000000000000000F3
-:1034400002000F00988071000000000000000000E2
-:1034500002000F00998071000000000000000000D1
-:1034600002000F009A8071000000000000000000C0
-:1034700002000F009B8071000000000000000000AF
-:1034800002000F009C80710000000000000000009E
-:1034900002000F009D80710000000000000000008D
-:1034A00002000F009E80710000000000000000007C
-:1034B00002000F009F80710000000000000000006B
-:1034C00002000F00A08071002D000000030808D04A
-:1034D00002000F00A18071000800000076FBB521FA
-:1034E00002000F00A280710079000000810001DD60
-:1034F00002000F00A380710079000000028101DD4D
-:1035000002000F00A48071007D000000838001FD97
-:1035100002000F00A580710079000000763B90D07A
-:1035200002000F00A6807100490000007A3B58D0CD
-:1035300002000F00A780710049000000003B04D288
-:1035400002000F00A88071003D000000030040DD74
-:1035500002000F00A9807100240000006402003204
-:1035600002000F00AA8071003D00000003F87FDD1B
-:1035700002000F00AB807100290000007A0120D00A
-:1035800002000F00AC807100490000000E3BA4D087
-:1035900002000F00AD8071002D000000FF4204DD2D
-:1035A00002000F00AE80710018000000763B7F3DE6
-:1035B00002000F00AF8071002D000000820006DDC8
-:1035C00002000F00B080710038000000E001003000
-:1035D00002000F00B180710039000000600100D0CE
-:1035E00002000F00B2807100790000007C3BB1D175
-:1035F00002000F00B38071002D000000E30FE0DD3A
-:1036000002000F00B480710049000000E43080D057
-:1036100002000F00B5807100790000007C7B31DD75
-:1036200002000F00B6807100790000007C3B31DDA4
-:1036300002000F00B78071007D000000824037FD5E
-:1036400002000F00B880710008000000763B7D0189
-:1036500002000F00B98071003D0000006F0080F78C
-:1036600002000F00BA8071003D0000006F0080F77B
-:1036700002000F00BB80710049000000870300DDDD
-:1036800002000F00BC80710079000000080431DDE9
-:1036900002000F00BD807100790000007A7D31DDED
-:1036A00002000F00BE807100490000007C3B00D387
-:1036B00002000F00BF807100790000007CBB81D345
-:1036C00002000F00C08071007F0000007CB201D1B9
-:1036D00002000F00C18071004800000064320051F8
-:1036E00002000F00C28071003D000000030040DDB9
-:1036F00002000F00C38071000800000062319501D4
-:1037000002000F00C480710021000000660600D393
-:1037100002000F00C580710020000000E700805308
-:1037200002000F00C68071003F000000000800DDAD
-:1037300002000F00C78071007900000066B301DD50
-:1037400002000F00C880710079000000E7B301DDBE
-:1037500002000F00C980710075000000628601F14F
-:1037600002000F00CA8071007500000064B101D230
-:1037700002000F00CB80710078000000767B001DF6
-:1037800002000F00CC80710025000000E30100DD85
-:1037900002000F00CD807100080000006231B1010D
-:1037A00002000F00CE8071003D0000006F0080F726
-:1037B00002000F00CF8071003D0000006F0080F715
-:1037C00002000F00D08071003D0000006F0080F704
-:1037D00002000F00D180710021000000639F37E3D9
-:1037E00002000F00D2807100490000007C3B00D332
-:1037F00002000F00D3807100790000007CBB81D3F0
-:1038000002000F00D48071007F0000007CB201D163
-:1038100002000F00D58071004800000064320051A2
-:1038200002000F00D68071007500000064B101D263
-:1038300002000F00D780710078000000767B001D29
-:1038400002000F00D88071003F000000040000DD7E
-:1038500002000F00D98071007900000081C001DDF5
-:1038600002000F00DA80710079000000769060FDA0
-:1038700002000F00DB8071002D000000030808DD4E
-:1038800002000F00DC8071007800000081C0013D63
-:1038900002000F00DD8071003D0000006F0080F726
-:1038A00002000F00DE807100000000000000000038
-:1038B00002000F00DF807100000000000000000027
-:1038C00002000F00E0807100000000000000000016
-:1038D00002000F00E1807100000000000000000005
-:1038E00002000F00E28071000000000000000000F4
-:1038F00002000F00E38071000000000000000000E3
-:1039000002000F00E48071000000000000000000D1
-:1039100002000F00E58071000000000000000000C0
-:1039200002000F00E68071000000000000000000AF
-:1039300002000F00E780710000000000000000009E
-:1039400002000F00E880710049000000033B8ED1A7
-:1039500002000F00E98071002F000000E30081D118
-:1039600002000F00EA8071003F000000031880D1C0
-:1039700002000F00EB80710049000000033B04D1FE
-:1039800002000F00EC8071003F000000030280DDA8
-:1039900002000F00ED80710049000000023B04D2DC
-:1039A00002000F00EE80710049000000003B84D24D
-:1039B00002000F00EF80710025000000E20000DD32
-:1039C00002000F00F08071009400000062411300BB
-:1039D00002000F00F18071009400000062430B00B0
-:1039E00002000F00F280710094000000E248150010
-:1039F00002000F00F38071009400000062491B0078
-:103A000002000F00F48071009400000076402F0047
-:103A100002000F00F5807100090000007A3D81CF9F
-:103A200002000F00F68071001D000000E5802BFDF4
-:103A300002000F00F78071003000000063808331C6
-:103A400002000F00F88071003000000063808211D6
-:103A500002000F00F98071001D000000E58025FDC7
-:103A600002000F00FA807100300000006300833113
-:103A700002000F00FB807100300000006300821123
-:103A800002000F00FC8071002F000000E30081D1D4
-:103A900002000F00FD8071001D000000E58009FD9F
-:103AA00002000F00FE8071003000000063D38331FC
-:103AB00002000F00FF8071003000000063D283110C
-:103AC00002000F00008171002F000000E30081D18F
-:103AD00002000F00018171003F000000840180D6C8
-:103AE00002000F00028171003F000000010080D63B
-:103AF00002000F000381710035000000ED0080D648
-:103B000002000F0004817100180000008100FF37DF
-:103B100002000F000581710025000000640200D240
-:103B200002000F0006817100180000007AFD777D09
-:103B300002000F000781710049000000633B20DE96
-:103B400002000F000881710049000000793B80DE0F
-:103B500002000F000981710021000000E30080D104
-:103B600002000F000A817100090000007A3D81CF38
-:103B700002000F000B81710049000000E33100DDFD
-:103B800002000F000C81710069000000783B0EDD1F
-:103B900002000F000D81710061000000763B00DD26
-:103BA00002000F000E8171003F000000840100DD63
-:103BB00002000F000F8171003F000000010000DDD6
-:103BC00002000F001081710035000000FA0000DDD6
-:103BD00002000F001181710018000000763B7F3B4E
-:103BE00002000F00128171003D0000006F0080F79D
-:103BF00002000F00138171003D0000006F0080F78C
-:103C000002000F00148171003D0000006F0080F77A
-:103C100002000F001581710021000000E30080D137
-:103C200002000F001681710069000000793B04DD7D
-:103C300002000F001781710061000000E30080F1B5
-:103C400002000F00188171003F000000840180D63F
-:103C500002000F00198171003F000000010080D6B2
-:103C600002000F001A81710035000000ED0080D6BF
-:103C700002000F001B817100180000008100FF3757
-:103C800002000F001C81710025000000640200D2B8
-:103C900002000F001D8171009800000076BB5D607E
-:103CA00002000F001E817100090000007A3D81CFE3
-:103CB00002000F001F8171000000000000000000E2
-:103CC00002000F00208171000000000000000000D1
-:103CD00002000F00218171000000000000000000C0
-:103CE00002000F00228171000000000000000000AF
-:103CF00002000F002381710000000000000000009E
-:103D000002000F002481710000000000000000008C
-:103D100002000F002581710000000000000000007B
-:103D200002000F002681710000000000000000006A
-:103D300002000F0027817100000000000000000059
-:103D400002000F0028817100000000000000000048
-:103D500002000F0029817100000000000000000037
-:103D600002000F002A817100000000000000000026
-:103D700002000F002B817100000000000000000015
-:103D800002000F002C817100000000000000000004
-:103D900002000F002D8171000000000000000000F3
-:103DA00002000F002E8171000000000000000000E2
-:103DB00002000F002F8171000000000000000000D1
-:103DC00002000F00308171000000000000000000C0
-:103DD00002000F00318171000000000000000000AF
-:103DE00002000F003281710000000000000000009E
-:103DF00002000F003381710000000000000000008D
-:103E000002000F003481710000000000000000007B
-:103E100002000F003581710000000000000000006A
-:103E200002000F0036817100000000000000000059
-:103E300002000F0037817100000000000000000048
-:103E400002000F0038817100000000000000000037
-:103E500002000F0039817100000000000000000026
-:103E600002000F003A817100000000000000000015
-:103E700002000F003B817100000000000000000004
-:103E800002000F003C8171000000000000000000F3
-:103E900002000F003D8171000000000000000000E2
-:103EA00002000F003E8171000000000000000000D1
-:103EB00002000F003F8171000000000000000000C0
-:103EC00002000F004081710049000000013B08D44E
-:103ED00002000F0041817100090000007A3D8BC291
-:103EE00002000F00428171003F000000800300D4F7
-:103EF00002000F0043817100090000007A3D8BC26F
-:103F000002000F004481710049000000033B0ED401
-:103F100002000F00458171003F000000000042D602
-:103F200002000F00468171002F000000804081D206
-:103F300002000F00478171002D000000650384D24C
-:103F400002000F00488171003F000000800080D611
-:103F500002000F00498171003F000000040004DDF1
-:103F600002000F004A8171003F000000010018DDCF
-:103F700002000F004B817100690000006D3B00DD05
-:103F800002000F004C817100690000006D3B00DDF4
-:103F900002000F004D8171003100000065D203D393
-:103FA00002000F004E81710049000000663B40DEB8
-:103FB00002000F004F8171003F000000840180D695
-:103FC00002000F00508171003F000000010080D608
-:103FD00002000F005181710035000000ED0080D615
-:103FE00002000F0052817100180000008100FF37AD
-:103FF00002000F0053817100490000007E3B80D514
-:1040000002000F005481710021000000E60040DE34
-:1040100002000F00558171003F000000840180D62E
-:1040200002000F00568171003F000000010080D6A1
-:1040300002000F005781710035000000ED0080D6AE
-:1040400002000F0058817100180000008100FF3746
-:1040500002000F0059817100490000007E3B00D52D
-:1040600002000F005A81710079000000763B01DDEB
-:1040700002000F005B8171002D0000007F4004DD15
-:1040800002000F005C81710018000000763B7F3D4C
-:1040900002000F005D8171007900000076BB01DD38
-:1040A00002000F005E81710075000000E88001FDD4
-:1040B00002000F005F81710094000000684115004C
-:1040C00002000F006081710094000000E8442500A8
-:1040D00002000F006181710094000000E84123009C
-:1040E00002000F0062817100940000006845170013
-:1040F00002000F0063817100940000006842150007
-:1041000002000F006481710094000000E842270063
-:1041100002000F00658171009400000068432D00CB
-:1041200002000F00668171009400000068442D00B9
-:1041300002000F006781710094000000E843330023
-:1041400002000F006881710004000000763B9703B5
-:1041500002000F00698171000D00000065C10DE3D0
-:1041600002000F006A817100300000007600033207
-:1041700002000F006B817100300000007600021217
-:1041800002000F006C8171003F000000000080D42D
-:1041900002000F006D8171003F000000008080D19F
-:1041A00002000F006E8171000D00000065C13FE349
-:1041B00002000F006F817100300000007660043251
-:1041C00002000F0070817100300000007640041280
-:1041D00002000F00718171003F000000008082D456
-:1041E00002000F00728171003F000000008080D14A
-:1041F00002000F00738171000D00000065C13FE3F4
-:1042000002000F007481710030000000762004323B
-:1042100002000F007581710030000000760004126A
-:1042200002000F00768171003F000000000082D480
-:1042300002000F00778171000D00000065C163E38B
-:1042400002000F00788171003000000076200332F8
-:1042500002000F0079817100300000007600031227
-:1042600002000F007A8171003F000000000083D43B
-:1042700002000F007B81710049000000763B80D274
-:1042800002000F007C8171000D00000065C10DE38C
-:1042900002000F007D817100300000007680033243
-:1042A00002000F007E817100300000007680021253
-:1042B00002000F007F8171003F000000000081D4E8
-:1042C00002000F00808171003F000000000002D654
-:1042D00002000F00818171003F000000000081D1C9
-:1042E00002000F00828171000D00000065C13FE3F4
-:1042F00002000F008381710030000000762004323C
-:1043000002000F008481710030000000760004126A
-:1043100002000F00858171003F000000000082D480
-:1043200002000F008681710041000000EB3480D450
-:1043300002000F0087817100790000006ABB01DD77
-:1043400002000F00888171007900000076BB01DD5A
-:1043500002000F00898171003F000000031800D2A5
-:1043600002000F008A8171003F000000000081D12F
-:1043700002000F008B81710075000000638001FD59
-:1043800002000F008C81710098000000643B69807E
-:1043900002000F008D81710051000000E40000F266
-:1043A00002000F008E8171003F000000840180D662
-:1043B00002000F008F8171003F000000010080D6D5
-:1043C00002000F009081710035000000ED0080D6E2
-:1043D00002000F0091817100180000008100FF377A
-:1043E00002000F00928171002D0000007F4004DD6B
-:1043F00002000F009381710018000000763B7F3DA2
-:1044000002000F009481710049000000383BC0D3C6
-:1044100002000F009581710049000000643B00DD3F
-:1044200002000F009681710051000000E40000F2CC
-:1044300002000F00978171003F000000840180D6C8
-:1044400002000F00988171003F000000010080D63B
-:1044500002000F009981710035000000ED0080D648
-:1044600002000F009A817100180000008100FF37E0
-:1044700002000F009B81710049000000383BA0D36F
-:1044800002000F009C8171001900000076BB61DD05
-:1044900002000F009D81710049000000673B00DDB4
-:1044A00002000F009E81710075000000638281F19F
-:1044B00002000F009F81710041000000EB3480D4A6
-:1044C00002000F00A0817100790000006ABB01DDCD
-:1044D00002000F00A18171007900000076BB01DDB0
-:1044E00002000F00A28171003F000000031800D2FB
-:1044F00002000F00A38171003F000000008080D106
-:1045000002000F00A481710075000000638001FDAE
-:1045100002000F00A581710098000000643B378005
-:1045200002000F00A681710051000000E40000F2BB
-:1045300002000F00A78171003F000000840180D6B7
-:1045400002000F00A88171003F000000010080D62A
-:1045500002000F00A981710035000000ED0080D637
-:1045600002000F00AA817100180000008100FF37CF
-:1045700002000F00AB8171002D0000007F4004DDC0
-:1045800002000F00AC81710018000000763B7F3DF7
-:1045900002000F00AD81710049000000383B80D35C
-:1045A00002000F00AE8171001900000076BB6FDDC4
-:1045B00002000F00AF81710049000000673B00DD81
-:1045C00002000F00B081710075000000638281F16C
-:1045D00002000F00B181710041000000EB3480D473
-:1045E00002000F00B2817100790000006ABB01DD9A
-:1045F00002000F00B38171007900000063BB01DD90
-:1046000002000F00B481710075000000638001FD9D
-:1046100002000F00B581710098000000643B178014
-:1046200002000F00B681710049000000643B40DECB
-:1046300002000F00B78171003F000000840180D6A6
-:1046400002000F00B88171003F000000010080D619
-:1046500002000F00B981710035000000ED0080D626
-:1046600002000F00BA817100180000008100FF37BE
-:1046700002000F00BB8171002D0000007F4004DDAF
-:1046800002000F00BC81710018000000763B7F3DE6
-:1046900002000F00BD81710021000000E40000D283
-:1046A00002000F00BE817100190000007E7BEFD375
-:1046B00002000F00BF81710075000000638281F16C
-:1046C00002000F00C08171003F000000000080D692
-:1046D00002000F00C18171003F000000040004DDF2
-:1046E00002000F00C28171003F000000010018DDD0
-:1046F00002000F00C3817100690000006D3B00DD06
-:1047000002000F00C4817100690000006D3B00DDF4
-:1047100002000F00C58171003F000000000000DDB5
-:1047200002000F00C68171002D000000800154DDE1
-:1047300002000F00C7817100790000007680E0F36D
-:1047400002000F00C8817100490000007A3600D6CF
-:1047500002000F00C98171007900000076FB01DDC5
-:1047600002000F00CA8171003D0000006F0080F759
-:1047700002000F00CB81710049000000033B00DD07
-:1047800002000F00CC81710059000000763B00FD53
-:1047900002000F00CD8171003F000000031C80DD8E
-:1047A00002000F00CE8171003D0000006F0080F715
-:1047B00002000F00CF8171003D0000006F0080F704
-:1047C00002000F00D08171003D0000006F0080F7F3
-:1047D00002000F00D18171002D0000007F0206DD74
-:1047E00002000F00D2817100180000007A3D7F1D89
-:1047F00002000F00D3817100310000006B8883D468
-:1048000002000F00D4817100790000006ABB01DD55
-:1048100002000F00D581710079000000769081F1CF
-:1048200002000F00D681710075000000638001FD59
-:1048300002000F00D78171009800000076BB538002
-:1048400002000F00D881710019000000797B7FDD24
-:1048500002000F00D981710075000000638281F1B0
-:1048600002000F00DA81710000000000000000006B
-:1048700002000F00DB81710000000000000000005A
-:1048800002000F00DC817100000000000000000049
-:1048900002000F00DD817100000000000000000038
-:1048A00002000F00DE817100000000000000000027
-:1048B00002000F00DF817100000000000000000016
-:1048C00002000F00E0817100000000000000000005
-:1048D00002000F00E18171000000000000000000F4
-:1048E00002000F00E28171000000000000000000E3
-:1048F00002000F00E38171000000000000000000D2
-:1049000002000F00E48171000000000000000000C0
-:1049100002000F00E58171000000000000000000AF
-:1049200002000F00E681710000000000000000009E
-:1049300002000F00E781710000000000000000008D
-:1049400002000F00E881710000000000000000007C
-:1049500002000F00E981710000000000000000006B
-:1049600002000F00EA81710000000000000000005A
-:1049700002000F00EB817100000000000000000049
-:1049800002000F00EC817100000000000000000038
-:1049900002000F00ED817100000000000000000027
-:1049A00002000F00EE817100000000000000000016
-:1049B00002000F00EF817100000000000000000005
-:1049C00002000F00F08171000000000000000000F4
-:1049D00002000F00F18171000000000000000000E3
-:1049E00002000F00F28171000000000000000000D2
-:1049F00002000F00F38171000000000000000000C1
-:104A000002000F00F48171000000000000000000AF
-:104A100002000F00F581710000000000000000009E
-:104A200002000F00F681710000000000000000008D
-:104A300002000F00F781710000000000000000007C
-:104A400002000F00F881710000000000000000006B
-:104A500002000F00F981710000000000000000005A
-:104A600002000F00FA817100000000000000000049
-:104A700002000F00FB817100000000000000000038
-:104A800002000F00FC817100000000000000000027
-:104A900002000F00FD817100000000000000000016
-:104AA00002000F00FE8171003F000000030280DD64
-:104AB00002000F00FF81710049000000023B84D119
-:104AC00002000F000082710049000000033B00DD7E
-:104AD00002000F0001827100690000007A3B00DDD6
-:104AE00002000F000282710049000000793B00DDE6
-:104AF00002000F000382710065000000630280F174
-:104B000002000F000482710018000000763B7D7DDA
-:104B100002000F0005827100090000007A3D81CF7C
-:104B200002000F000682710000000000000000007B
-:104B300002000F000782710000000000000000006A
-:104B400002000F0008827100000000000000000059
-:104B500002000F0009827100000000000000000048
-:104B600002000F000A827100000000000000000037
-:104B700002000F000B827100000000000000000026
-:104B800002000F000C827100000000000000000015
-:104B900002000F000D827100000000000000000004
-:104BA00002000F000E8271000000000000000000F3
-:104BB00002000F000F8271000000000000000000E2
-:104BC00002000F00108271000000000000000000D1
-:104BD00002000F00118271000000000000000000C0
-:104BE00002000F00128271000000000000000000AF
-:104BF00002000F001382710000000000000000009E
-:104C000002000F001482710000000000000000008C
-:104C100002000F001582710000000000000000007B
-:104C200002000F001682710000000000000000006A
-:104C300002000F0017827100000000000000000059
-:104C400002000F0018827100000000000000000048
-:104C500002000F0019827100000000000000000037
-:104C600002000F001A827100000000000000000026
-:104C700002000F001B827100000000000000000015
-:104C800002000F001C827100000000000000000004
-:104C900002000F001D8271000000000000000000F3
-:104CA00002000F001E8271000000000000000000E2
-:104CB00002000F001F8271000000000000000000D1
-:104CC00002000F00208271000000000000000000C0
-:104CD00002000F00218271000000000000000000AF
-:104CE00002000F002282710000000000000000009E
-:104CF00002000F002382710000000000000000008D
-:104D000002000F002482710000000000000000007B
-:104D100002000F002582710000000000000000006A
-:104D200002000F0026827100000000000000000059
-:104D300002000F0027827100000000000000000048
-:104D400002000F0028827100000000000000000037
-:104D500002000F0029827100000000000000000026
-:104D600002000F002A827100000000000000000015
-:104D700002000F002B827100000000000000000004
-:104D800002000F002C8271000000000000000000F3
-:104D900002000F002D8271000000000000000000E2
-:104DA00002000F002E8271000000000000000000D1
-:104DB00002000F002F8271000000000000000000C0
-:104DC00002000F00308271000000000000000000AF
-:104DD00002000F003182710000000000000000009E
-:104DE00002000F003282710000000000000000008D
-:104DF00002000F003382710000000000000000007C
-:104E000002000F003482710000000000000000006A
-:104E100002000F0035827100000000000000000059
-:104E200002000F0036827100000000000000000048
-:104E300002000F0037827100000000000000000037
-:104E400002000F0038827100000000000000000026
-:104E500002000F0039827100000000000000000015
-:104E600002000F003A827100000000000000000004
-:104E700002000F003B8271000000000000000000F3
-:104E800002000F003C8271000000000000000000E2
-:104E900002000F003D8271000000000000000000D1
-:104EA00002000F003E8271000000000000000000C0
-:104EB00002000F003F8271000000000000000000AF
-:104EC00002000F004082710000000000000000009E
-:104ED00002000F004182710000000000000000008D
-:104EE00002000F004282710000000000000000007C
-:104EF00002000F004382710000000000000000006B
-:104F000002000F0044827100000000000000000059
-:104F100002000F0045827100000000000000000048
-:104F200002000F0046827100000000000000000037
-:104F300002000F0047827100000000000000000026
-:104F400002000F0048827100000000000000000015
-:104F500002000F0049827100000000000000000004
-:104F600002000F004A8271000000000000000000F3
-:104F700002000F004B8271000000000000000000E2
-:104F800002000F004C8271000000000000000000D1
-:104F900002000F004D8271000000000000000000C0
-:104FA00002000F004E8271000000000000000000AF
-:104FB00002000F004F82710000000000000000009E
-:104FC00002000F005082710000000000000000008D
-:104FD00002000F005182710000000000000000007C
-:104FE00002000F005282710000000000000000006B
-:104FF00002000F005382710000000000000000005A
-:1050000002000F0054827100000000000000000048
-:1050100002000F0055827100000000000000000037
-:1050200002000F0056827100000000000000000026
-:1050300002000F0057827100000000000000000015
-:1050400002000F0058827100000000000000000004
-:1050500002000F00598271000000000000000000F3
-:1050600002000F005A8271000000000000000000E2
-:1050700002000F005B8271000000000000000000D1
-:1050800002000F005C8271000000000000000000C0
-:1050900002000F005D8271000000000000000000AF
-:1050A00002000F005E82710000000000000000009E
-:1050B00002000F005F82710000000000000000008D
-:1050C00002000F006082710000000000000000007C
-:1050D00002000F006182710000000000000000006B
-:1050E00002000F006282710000000000000000005A
-:1050F00002000F0063827100000000000000000049
-:1051000002000F0064827100000000000000000037
-:1051100002000F0065827100000000000000000026
-:1051200002000F0066827100000000000000000015
-:1051300002000F0067827100000000000000000004
-:1051400002000F00688271000000000000000000F3
-:1051500002000F00698271000000000000000000E2
-:1051600002000F006A8271000000000000000000D1
-:1051700002000F006B8271000000000000000000C0
-:1051800002000F006C8271000000000000000000AF
-:1051900002000F006D82710000000000000000009E
-:1051A00002000F006E82710000000000000000008D
-:1051B00002000F006F82710000000000000000007C
-:1051C00002000F007082710000000000000000006B
-:1051D00002000F007182710000000000000000005A
-:1051E00002000F0072827100000000000000000049
-:1051F00002000F0073827100000000000000000038
-:1052000002000F0074827100000000000000000026
-:1052100002000F0075827100000000000000000015
-:1052200002000F0076827100000000000000000004
-:1052300002000F00778271000000000000000000F3
-:1052400002000F00788271000000000000000000E2
-:1052500002000F00798271000000000000000000D1
-:1052600002000F007A8271000000000000000000C0
-:1052700002000F007B8271000000000000000000AF
-:1052800002000F007C82710000000000000000009E
-:1052900002000F007D82710000000000000000008D
-:1052A00002000F007E82710000000000000000007C
-:1052B00002000F007F82710000000000000000006B
-:1052C00002000F008082710000000000000000005A
-:1052D00002000F0081827100000000000000000049
-:1052E00002000F0082827100000000000000000038
-:1052F00002000F0083827100000000000000000027
-:1053000002000F0084827100000000000000000015
-:1053100002000F0085827100000000000000000004
-:1053200002000F00868271000000000000000000F3
-:1053300002000F00878271000000000000000000E2
-:1053400002000F00888271000000000000000000D1
-:1053500002000F00898271000000000000000000C0
-:1053600002000F008A8271000000000000000000AF
-:1053700002000F008B82710000000000000000009E
-:1053800002000F008C82710000000000000000008D
-:1053900002000F008D82710000000000000000007C
-:1053A00002000F008E82710000000000000000006B
-:1053B00002000F008F82710000000000000000005A
-:1053C00002000F0090827100000000000000000049
-:1053D00002000F0091827100000000000000000038
-:1053E00002000F0092827100000000000000000027
-:1053F00002000F0093827100000000000000000016
-:1054000002000F0094827100000000000000000004
-:1054100002000F00958271000000000000000000F3
-:1054200002000F00968271000000000000000000E2
-:1054300002000F00978271000000000000000000D1
-:1054400002000F00988271000000000000000000C0
-:1054500002000F00998271000000000000000000AF
-:1054600002000F009A82710000000000000000009E
-:1054700002000F009B82710000000000000000008D
-:1054800002000F009C82710000000000000000007C
-:1054900002000F009D82710000000000000000006B
-:1054A00002000F009E82710000000000000000005A
-:1054B00002000F009F827100000000000000000049
-:1054C00002000F00A0827100000000000000000038
-:1054D00002000F00A1827100000000000000000027
-:1054E00002000F00A2827100000000000000000016
-:1054F00002000F00A3827100000000000000000005
-:1055000002000F00A48271000000000000000000F3
-:1055100002000F00A58271000000000000000000E2
-:1055200002000F00A68271000000000000000000D1
-:1055300002000F00A78271000000000000000000C0
-:1055400002000F00A88271000000000000000000AF
-:1055500002000F00A982710000000000000000009E
-:1055600002000F00AA82710000000000000000008D
-:1055700002000F00AB82710000000000000000007C
-:1055800002000F00AC82710000000000000000006B
-:1055900002000F00AD82710000000000000000005A
-:1055A00002000F00AE827100000000000000000049
-:1055B00002000F00AF827100000000000000000038
-:1055C00002000F00B0827100000000000000000027
-:1055D00002000F00B1827100000000000000000016
-:1055E00002000F00B2827100000000000000000005
-:1055F00002000F00B38271000000000000000000F4
-:1056000002000F00B48271000000000000000000E2
-:1056100002000F00B58271000000000000000000D1
-:1056200002000F00B68271000000000000000000C0
-:1056300002000F00B78271000000000000000000AF
-:1056400002000F00B882710000000000000000009E
-:1056500002000F00B982710000000000000000008D
-:1056600002000F00BA82710000000000000000007C
-:1056700002000F00BB82710000000000000000006B
-:1056800002000F00BC82710000000000000000005A
-:1056900002000F00BD827100000000000000000049
-:1056A00002000F00BE827100000000000000000038
-:1056B00002000F00BF827100000000000000000027
-:1056C00002000F00C0827100000000000000000016
-:1056D00002000F00C1827100000000000000000005
-:1056E00002000F00C28271000000000000000000F4
-:1056F00002000F00C38271000000000000000000E3
-:1057000002000F00C48271000000000000000000D1
-:1057100002000F00C58271000000000000000000C0
-:1057200002000F00C68271000000000000000000AF
-:1057300002000F00C782710000000000000000009E
-:1057400002000F00C882710000000000000000008D
-:1057500002000F00C982710000000000000000007C
-:1057600002000F00CA82710000000000000000006B
-:1057700002000F00CB82710000000000000000005A
-:1057800002000F00CC827100000000000000000049
-:1057900002000F00CD827100000000000000000038
-:1057A00002000F00CE827100000000000000000027
-:1057B00002000F00CF827100000000000000000016
-:1057C00002000F00D0827100000000000000000005
-:1057D00002000F00D18271000000000000000000F4
-:1057E00002000F00D28271000000000000000000E3
-:1057F00002000F00D38271000000000000000000D2
-:1058000002000F00D48271000000000000000000C0
-:1058100002000F00D58271000000000000000000AF
-:1058200002000F00D682710000000000000000009E
-:1058300002000F00D782710000000000000000008D
-:1058400002000F00D882710000000000000000007C
-:1058500002000F00D982710000000000000000006B
-:1058600002000F00DA82710000000000000000005A
-:1058700002000F00DB827100000000000000000049
-:1058800002000F00DC827100000000000000000038
-:1058900002000F00DD827100000000000000000027
-:1058A00002000F00DE827100000000000000000016
-:1058B00002000F00DF827100000000000000000005
-:1058C00002000F00E08271000000000000000000F4
-:1058D00002000F00E18271000000000000000000E3
-:1058E00002000F00E28271000000000000000000D2
-:1058F00002000F00E38271000000000000000000C1
-:1059000002000F00E48271000000000000000000AF
-:1059100002000F00E582710000000000000000009E
-:1059200002000F00E682710000000000000000008D
-:1059300002000F00E782710000000000000000007C
-:1059400002000F00E882710000000000000000006B
-:1059500002000F00E982710000000000000000005A
-:1059600002000F00EA827100000000000000000049
-:1059700002000F00EB827100000000000000000038
-:1059800002000F00EC827100000000000000000027
-:1059900002000F00ED827100000000000000000016
-:1059A00002000F00EE827100000000000000000005
-:1059B00002000F00EF8271000000000000000000F4
-:1059C00002000F00F08271000000000000000000E3
-:1059D00002000F00F18271000000000000000000D2
-:1059E00002000F00F28271000000000000000000C1
-:1059F00002000F00F38271000000000000000000B0
-:105A000002000F00F482710000000000000000009E
-:105A100002000F00F582710000000000000000008D
-:105A200002000F00F682710000000000000000007C
-:105A300002000F00F782710000000000000000006B
-:105A400002000F00F882710000000000000000005A
-:105A500002000F00F9827100000000000000000049
-:105A600002000F00FA827100000000000000000038
-:105A700002000F00FB827100000000000000000027
-:105A800002000F00FC827100000000000000000016
-:105A900002000F00FD827100000000000000000005
-:105AA00002000F00FE8271000000000000000000F4
-:105AB00002000F00FF8271000000000000000000E3
-:105AC00002000F00008371000000000000000000D1
-:105AD00002000F00018371000000000000000000C0
-:105AE00002000F00028371000000000000000000AF
-:105AF00002000F000383710000000000000000009E
-:105B000002000F000483710000000000000000008C
-:105B100002000F000583710000000000000000007B
-:105B200002000F000683710000000000000000006A
-:105B300002000F0007837100000000000000000059
-:105B400002000F0008837100000000000000000048
-:105B500002000F0009837100000000000000000037
-:105B600002000F000A837100000000000000000026
-:105B700002000F000B837100000000000000000015
-:105B800002000F000C837100000000000000000004
-:105B900002000F000D8371000000000000000000F3
-:105BA00002000F000E8371000000000000000000E2
-:105BB00002000F000F8371000000000000000000D1
-:105BC00002000F00108371000000000000000000C0
-:105BD00002000F00118371000000000000000000AF
-:105BE00002000F001283710000000000000000009E
-:105BF00002000F001383710000000000000000008D
-:105C000002000F001483710000000000000000007B
-:105C100002000F001583710000000000000000006A
-:105C200002000F0016837100000000000000000059
-:105C300002000F0017837100000000000000000048
-:105C400002000F0018837100000000000000000037
-:105C500002000F0019837100000000000000000026
-:105C600002000F001A837100000000000000000015
-:105C700002000F001B837100000000000000000004
-:105C800002000F001C8371000000000000000000F3
-:105C900002000F001D8371000000000000000000E2
-:105CA00002000F001E8371000000000000000000D1
-:105CB00002000F001F8371000000000000000000C0
-:105CC00002000F00208371000000000000000000AF
-:105CD00002000F002183710000000000000000009E
-:105CE00002000F002283710000000000000000008D
-:105CF00002000F002383710000000000000000007C
-:105D000002000F002483710000000000000000006A
-:105D100002000F0025837100000000000000000059
-:105D200002000F0026837100000000000000000048
-:105D300002000F0027837100000000000000000037
-:105D400002000F0028837100000000000000000026
-:105D500002000F0029837100000000000000000015
-:105D600002000F002A837100000000000000000004
-:105D700002000F002B8371000000000000000000F3
-:105D800002000F002C8371000000000000000000E2
-:105D900002000F002D8371000000000000000000D1
-:105DA00002000F002E8371000000000000000000C0
-:105DB00002000F002F8371000000000000000000AF
-:105DC00002000F003083710000000000000000009E
-:105DD00002000F003183710000000000000000008D
-:105DE00002000F003283710000000000000000007C
-:105DF00002000F003383710000000000000000006B
-:105E000002000F0034837100000000000000000059
-:105E100002000F0035837100000000000000000048
-:105E200002000F0036837100000000000000000037
-:105E300002000F0037837100000000000000000026
-:105E400002000F0038837100000000000000000015
-:105E500002000F0039837100000000000000000004
-:105E600002000F003A8371000000000000000000F3
-:105E700002000F003B8371000000000000000000E2
-:105E800002000F003C8371000000000000000000D1
-:105E900002000F003D8371000000000000000000C0
-:105EA00002000F003E8371000000000000000000AF
-:105EB00002000F003F83710000000000000000009E
-:105EC00002000F004083710000000000000000008D
-:105ED00002000F004183710000000000000000007C
-:105EE00002000F004283710000000000000000006B
-:105EF00002000F004383710000000000000000005A
-:105F000002000F0044837100000000000000000048
-:105F100002000F0045837100000000000000000037
-:105F200002000F0046837100000000000000000026
-:105F300002000F0047837100000000000000000015
-:105F400002000F0048837100000000000000000004
-:105F500002000F00498371000000000000000000F3
-:105F600002000F004A8371000000000000000000E2
-:105F700002000F004B8371000000000000000000D1
-:105F800002000F004C8371000000000000000000C0
-:105F900002000F004D8371000000000000000000AF
-:105FA00002000F004E83710000000000000000009E
-:105FB00002000F004F83710000000000000000008D
-:105FC00002000F005083710000000000000000007C
-:105FD00002000F005183710000000000000000006B
-:105FE00002000F005283710000000000000000005A
-:105FF00002000F0053837100000000000000000049
-:1060000002000F0054837100000000000000000037
-:1060100002000F0055837100000000000000000026
-:1060200002000F0056837100000000000000000015
-:1060300002000F0057837100000000000000000004
-:1060400002000F00588371000000000000000000F3
-:1060500002000F00598371000000000000000000E2
-:1060600002000F005A8371000000000000000000D1
-:1060700002000F005B8371000000000000000000C0
-:1060800002000F005C8371000000000000000000AF
-:1060900002000F005D83710000000000000000009E
-:1060A00002000F005E83710000000000000000008D
-:1060B00002000F005F83710000000000000000007C
-:1060C00002000F006083710000000000000000006B
-:1060D00002000F006183710000000000000000005A
-:1060E00002000F0062837100000000000000000049
-:1060F00002000F0063837100000000000000000038
-:1061000002000F0064837100000000000000000026
-:1061100002000F0065837100000000000000000015
-:1061200002000F0066837100000000000000000004
-:1061300002000F00678371000000000000000000F3
-:1061400002000F00688371000000000000000000E2
-:1061500002000F00698371000000000000000000D1
-:1061600002000F006A8371000000000000000000C0
-:1061700002000F006B8371000000000000000000AF
-:1061800002000F006C83710000000000000000009E
-:1061900002000F006D83710000000000000000008D
-:1061A00002000F006E83710000000000000000007C
-:1061B00002000F006F83710000000000000000006B
-:1061C00002000F007083710000000000000000005A
-:1061D00002000F0071837100000000000000000049
-:1061E00002000F0072837100000000000000000038
-:1061F00002000F0073837100000000000000000027
-:1062000002000F0074837100000000000000000015
-:1062100002000F0075837100000000000000000004
-:1062200002000F00768371000000000000000000F3
-:1062300002000F00778371000000000000000000E2
-:1062400002000F00788371000000000000000000D1
-:1062500002000F00798371000000000000000000C0
-:1062600002000F007A8371000000000000000000AF
-:1062700002000F007B83710000000000000000009E
-:1062800002000F007C83710000000000000000008D
-:1062900002000F007D83710000000000000000007C
-:1062A00002000F007E83710000000000000000006B
-:1062B00002000F007F83710000000000000000005A
-:1062C00002000F0080837100000000000000000049
-:1062D00002000F0081837100000000000000000038
-:1062E00002000F0082837100000000000000000027
-:1062F00002000F0083837100000000000000000016
-:1063000002000F0084837100000000000000000004
-:1063100002000F00858371000000000000000000F3
-:1063200002000F00868371000000000000000000E2
-:1063300002000F00878371000000000000000000D1
-:1063400002000F00888371000000000000000000C0
-:1063500002000F00898371000000000000000000AF
-:1063600002000F008A83710000000000000000009E
-:1063700002000F008B83710000000000000000008D
-:1063800002000F008C83710000000000000000007C
-:1063900002000F008D83710000000000000000006B
-:1063A00002000F008E83710000000000000000005A
-:1063B00002000F008F837100000000000000000049
-:1063C00002000F0090837100000000000000000038
-:1063D00002000F0091837100000000000000000027
-:1063E00002000F0092837100000000000000000016
-:1063F00002000F0093837100000000000000000005
-:1064000002000F00948371000000000000000000F3
-:1064100002000F00958371000000000000000000E2
-:1064200002000F00968371000000000000000000D1
-:1064300002000F00978371000000000000000000C0
-:1064400002000F00988371000000000000000000AF
-:1064500002000F009983710000000000000000009E
-:1064600002000F009A83710000000000000000008D
-:1064700002000F009B83710000000000000000007C
-:1064800002000F009C83710000000000000000006B
-:1064900002000F009D83710000000000000000005A
-:1064A00002000F009E837100000000000000000049
-:1064B00002000F009F837100000000000000000038
-:1064C00002000F00A0837100000000000000000027
-:1064D00002000F00A1837100000000000000000016
-:1064E00002000F00A2837100000000000000000005
-:1064F00002000F00A38371000000000000000000F4
-:1065000002000F00A48371000000000000000000E2
-:1065100002000F00A58371000000000000000000D1
-:1065200002000F00A68371000000000000000000C0
-:1065300002000F00A78371000000000000000000AF
-:1065400002000F00A883710000000000000000009E
-:1065500002000F00A983710000000000000000008D
-:1065600002000F00AA83710000000000000000007C
-:1065700002000F00AB83710000000000000000006B
-:1065800002000F00AC83710000000000000000005A
-:1065900002000F00AD837100000000000000000049
-:1065A00002000F00AE837100000000000000000038
-:1065B00002000F00AF837100000000000000000027
-:1065C00002000F00B0837100000000000000000016
-:1065D00002000F00B1837100000000000000000005
-:1065E00002000F00B28371000000000000000000F4
-:1065F00002000F00B38371000000000000000000E3
-:1066000002000F00B48371000000000000000000D1
-:1066100002000F00B58371000000000000000000C0
-:1066200002000F00B68371000000000000000000AF
-:1066300002000F00B783710000000000000000009E
-:1066400002000F00B883710000000000000000008D
-:1066500002000F00B983710000000000000000007C
-:1066600002000F00BA83710000000000000000006B
-:1066700002000F00BB83710000000000000000005A
-:1066800002000F00BC837100000000000000000049
-:1066900002000F00BD837100000000000000000038
-:1066A00002000F00BE837100000000000000000027
-:1066B00002000F00BF837100000000000000000016
-:1066C00002000F00C0837100000000000000000005
-:1066D00002000F00C18371000000000000000000F4
-:1066E00002000F00C28371000000000000000000E3
-:1066F00002000F00C38371000000000000000000D2
-:1067000002000F00C48371000000000000000000C0
-:1067100002000F00C58371000000000000000000AF
-:1067200002000F00C683710000000000000000009E
-:1067300002000F00C783710000000000000000008D
-:1067400002000F00C883710000000000000000007C
-:1067500002000F00C983710000000000000000006B
-:1067600002000F00CA83710000000000000000005A
-:1067700002000F00CB837100000000000000000049
-:1067800002000F00CC837100000000000000000038
-:1067900002000F00CD837100000000000000000027
-:1067A00002000F00CE837100000000000000000016
-:1067B00002000F00CF837100000000000000000005
-:1067C00002000F00D08371000000000000000000F4
-:1067D00002000F00D18371000000000000000000E3
-:1067E00002000F00D28371000000000000000000D2
-:1067F00002000F00D38371000000000000000000C1
-:1068000002000F00D48371000000000000000000AF
-:1068100002000F00D583710000000000000000009E
-:1068200002000F00D683710000000000000000008D
-:1068300002000F00D783710000000000000000007C
-:1068400002000F00D883710000000000000000006B
-:1068500002000F00D983710000000000000000005A
-:1068600002000F00DA837100000000000000000049
-:1068700002000F00DB837100000000000000000038
-:1068800002000F00DC837100000000000000000027
-:1068900002000F00DD837100000000000000000016
-:1068A00002000F00DE837100000000000000000005
-:1068B00002000F00DF8371000000000000000000F4
-:1068C00002000F00E08371000000000000000000E3
-:1068D00002000F00E18371000000000000000000D2
-:1068E00002000F00E28371000000000000000000C1
-:1068F00002000F00E38371000000000000000000B0
-:1069000002000F00E483710000000000000000009E
-:1069100002000F00E583710000000000000000008D
-:1069200002000F00E683710000000000000000007C
-:1069300002000F00E783710000000000000000006B
-:1069400002000F00E883710000000000000000005A
-:1069500002000F00E9837100000000000000000049
-:1069600002000F00EA837100000000000000000038
-:1069700002000F00EB837100000000000000000027
-:1069800002000F00EC837100000000000000000016
-:1069900002000F00ED837100000000000000000005
-:1069A00002000F00EE8371000000000000000000F4
-:1069B00002000F00EF8371000000000000000000E3
-:1069C00002000F00F08371000000000000000000D2
-:1069D00002000F00F18371000000000000000000C1
-:1069E00002000F00F28371000000000000000000B0
-:1069F00002000F00F383710000000000000000009F
-:106A000002000F00F483710000000000000000008D
-:106A100002000F00F583710000000000000000007C
-:106A200002000F00F683710000000000000000006B
-:106A300002000F00F783710000000000000000005A
-:106A400002000F00F8837100000000000000000049
-:106A500002000F00F9837100000000000000000038
-:106A600002000F00FA837100000000000000000027
-:106A700002000F00FB837100000000000000000016
-:106A800002000F00FC837100000000000000000005
-:106A900002000F00FD8371000000000000000000F4
-:106AA00002000F00FE8371000000000000000000E3
-:106AB00002000F00FF8371000000000000000000D2
-:106AC00002000F00008471000000000000000000C0
-:106AD00002000F00018471000000000000000000AF
-:106AE00002000F000284710000000000000000009E
-:106AF00002000F000384710000000000000000008D
-:106B000002000F000484710000000000000000007B
-:106B100002000F000584710000000000000000006A
-:106B200002000F0006847100000000000000000059
-:106B300002000F0007847100000000000000000048
-:106B400002000F0008847100000000000000000037
-:106B500002000F0009847100000000000000000026
-:106B600002000F000A847100000000000000000015
-:106B700002000F000B847100000000000000000004
-:106B800002000F000C8471000000000000000000F3
-:106B900002000F000D8471000000000000000000E2
-:106BA00002000F000E8471000000000000000000D1
-:106BB00002000F000F8471000000000000000000C0
-:106BC00002000F00108471000000000000000000AF
-:106BD00002000F001184710000000000000000009E
-:106BE00002000F001284710000000000000000008D
-:106BF00002000F001384710000000000000000007C
-:106C000002000F001484710000000000000000006A
-:106C100002000F0015847100000000000000000059
-:106C200002000F0016847100000000000000000048
-:106C300002000F0017847100000000000000000037
-:106C400002000F0018847100000000000000000026
-:106C500002000F0019847100000000000000000015
-:106C600002000F001A847100000000000000000004
-:106C700002000F001B8471000000000000000000F3
-:106C800002000F001C8471000000000000000000E2
-:106C900002000F001D8471000000000000000000D1
-:106CA00002000F001E8471000000000000000000C0
-:106CB00002000F001F8471000000000000000000AF
-:106CC00002000F002084710000000000000000009E
-:106CD00002000F002184710000000000000000008D
-:106CE00002000F002284710000000000000000007C
-:106CF00002000F002384710000000000000000006B
-:106D000002000F0024847100000000000000000059
-:106D100002000F0025847100000000000000000048
-:106D200002000F0026847100000000000000000037
-:106D300002000F0027847100000000000000000026
-:106D400002000F0028847100000000000000000015
-:106D500002000F0029847100000000000000000004
-:106D600002000F002A8471000000000000000000F3
-:106D700002000F002B8471000000000000000000E2
-:106D800002000F002C8471000000000000000000D1
-:106D900002000F002D8471000000000000000000C0
-:106DA00002000F002E8471000000000000000000AF
-:106DB00002000F002F84710000000000000000009E
-:106DC00002000F003084710000000000000000008D
-:106DD00002000F003184710000000000000000007C
-:106DE00002000F003284710000000000000000006B
-:106DF00002000F003384710000000000000000005A
-:106E000002000F0034847100000000000000000048
-:106E100002000F0035847100000000000000000037
-:106E200002000F0036847100000000000000000026
-:106E300002000F0037847100000000000000000015
-:106E400002000F0038847100000000000000000004
-:106E500002000F00398471000000000000000000F3
-:106E600002000F003A8471000000000000000000E2
-:106E700002000F003B8471000000000000000000D1
-:106E800002000F003C8471000000000000000000C0
-:106E900002000F003D8471000000000000000000AF
-:106EA00002000F003E84710000000000000000009E
-:106EB00002000F003F84710000000000000000008D
-:106EC00002000F004084710000000000000000007C
-:106ED00002000F004184710000000000000000006B
-:106EE00002000F004284710000000000000000005A
-:106EF00002000F0043847100000000000000000049
-:106F000002000F0044847100000000000000000037
-:106F100002000F0045847100000000000000000026
-:106F200002000F0046847100000000000000000015
-:106F300002000F0047847100000000000000000004
-:106F400002000F00488471000000000000000000F3
-:106F500002000F00498471000000000000000000E2
-:106F600002000F004A8471000000000000000000D1
-:106F700002000F004B8471000000000000000000C0
-:106F800002000F004C8471000000000000000000AF
-:106F900002000F004D84710000000000000000009E
-:106FA00002000F004E84710000000000000000008D
-:106FB00002000F004F84710000000000000000007C
-:106FC00002000F005084710000000000000000006B
-:106FD00002000F005184710000000000000000005A
-:106FE00002000F0052847100000000000000000049
-:106FF00002000F0053847100000000000000000038
-:1070000002000F0054847100000000000000000026
-:1070100002000F0055847100000000000000000015
-:1070200002000F0056847100000000000000000004
-:1070300002000F00578471000000000000000000F3
-:1070400002000F00588471000000000000000000E2
-:1070500002000F00598471000000000000000000D1
-:1070600002000F005A8471000000000000000000C0
-:1070700002000F005B8471000000000000000000AF
-:1070800002000F005C84710000000000000000009E
-:1070900002000F005D84710000000000000000008D
-:1070A00002000F005E84710000000000000000007C
-:1070B00002000F005F84710000000000000000006B
-:1070C00002000F006084710000000000000000005A
-:1070D00002000F0061847100000000000000000049
-:1070E00002000F0062847100000000000000000038
-:1070F00002000F0063847100000000000000000027
-:1071000002000F0064847100000000000000000015
-:1071100002000F0065847100000000000000000004
-:1071200002000F00668471000000000000000000F3
-:1071300002000F00678471000000000000000000E2
-:1071400002000F00688471000000000000000000D1
-:1071500002000F00698471000000000000000000C0
-:1071600002000F006A8471000000000000000000AF
-:1071700002000F006B84710000000000000000009E
-:1071800002000F006C84710000000000000000008D
-:1071900002000F006D84710000000000000000007C
-:1071A00002000F006E84710000000000000000006B
-:1071B00002000F006F84710000000000000000005A
-:1071C00002000F0070847100000000000000000049
-:1071D00002000F0071847100000000000000000038
-:1071E00002000F0072847100000000000000000027
-:1071F00002000F0073847100000000000000000016
-:1072000002000F0074847100000000000000000004
-:1072100002000F00758471000000000000000000F3
-:1072200002000F00768471000000000000000000E2
-:1072300002000F00778471000000000000000000D1
-:1072400002000F00788471000000000000000000C0
-:1072500002000F00798471000000000000000000AF
-:1072600002000F007A84710000000000000000009E
-:1072700002000F007B84710000000000000000008D
-:1072800002000F007C84710000000000000000007C
-:1072900002000F007D84710000000000000000006B
-:1072A00002000F007E84710000000000000000005A
-:1072B00002000F007F847100000000000000000049
-:1072C00002000F0080847100000000000000000038
-:1072D00002000F0081847100000000000000000027
-:1072E00002000F0082847100000000000000000016
-:1072F00002000F0083847100000000000000000005
-:1073000002000F00848471000000000000000000F3
-:1073100002000F00858471000000000000000000E2
-:1073200002000F00868471000000000000000000D1
-:1073300002000F00878471000000000000000000C0
-:1073400002000F00888471000000000000000000AF
-:1073500002000F008984710000000000000000009E
-:1073600002000F008A84710000000000000000008D
-:1073700002000F008B84710000000000000000007C
-:1073800002000F008C84710000000000000000006B
-:1073900002000F008D84710000000000000000005A
-:1073A00002000F008E847100000000000000000049
-:1073B00002000F008F847100000000000000000038
-:1073C00002000F0090847100000000000000000027
-:1073D00002000F0091847100000000000000000016
-:1073E00002000F0092847100000000000000000005
-:1073F00002000F00938471000000000000000000F4
-:1074000002000F00948471000000000000000000E2
-:1074100002000F00958471000000000000000000D1
-:1074200002000F00968471000000000000000000C0
-:1074300002000F00978471000000000000000000AF
-:1074400002000F009884710000000000000000009E
-:1074500002000F009984710000000000000000008D
-:1074600002000F009A84710000000000000000007C
-:1074700002000F009B84710000000000000000006B
-:1074800002000F009C84710000000000000000005A
-:1074900002000F009D847100000000000000000049
-:1074A00002000F009E847100000000000000000038
-:1074B00002000F009F847100000000000000000027
-:1074C00002000F00A0847100000000000000000016
-:1074D00002000F00A1847100000000000000000005
-:1074E00002000F00A28471000000000000000000F4
-:1074F00002000F00A38471000000000000000000E3
-:1075000002000F00A48471000000000000000000D1
-:1075100002000F00A58471000000000000000000C0
-:1075200002000F00A68471000000000000000000AF
-:1075300002000F00A784710000000000000000009E
-:1075400002000F00A884710000000000000000008D
-:1075500002000F00A984710000000000000000007C
-:1075600002000F00AA84710000000000000000006B
-:1075700002000F00AB84710000000000000000005A
-:1075800002000F00AC847100000000000000000049
-:1075900002000F00AD847100000000000000000038
-:1075A00002000F00AE847100000000000000000027
-:1075B00002000F00AF847100000000000000000016
-:1075C00002000F00B0847100000000000000000005
-:1075D00002000F00B18471000000000000000000F4
-:1075E00002000F00B28471000000000000000000E3
-:1075F00002000F00B38471000000000000000000D2
-:1076000002000F00B48471000000000000000000C0
-:1076100002000F00B58471000000000000000000AF
-:1076200002000F00B684710000000000000000009E
-:1076300002000F00B784710000000000000000008D
-:1076400002000F00B884710000000000000000007C
-:1076500002000F00B984710000000000000000006B
-:1076600002000F00BA84710000000000000000005A
-:1076700002000F00BB847100000000000000000049
-:1076800002000F00BC847100000000000000000038
-:1076900002000F00BD847100000000000000000027
-:1076A00002000F00BE847100000000000000000016
-:1076B00002000F00BF847100000000000000000005
-:1076C00002000F00C08471000000000000000000F4
-:1076D00002000F00C18471000000000000000000E3
-:1076E00002000F00C28471000000000000000000D2
-:1076F00002000F00C38471000000000000000000C1
-:1077000002000F00C48471000000000000000000AF
-:1077100002000F00C584710000000000000000009E
-:1077200002000F00C684710000000000000000008D
-:1077300002000F00C784710000000000000000007C
-:1077400002000F00C884710000000000000000006B
-:1077500002000F00C984710000000000000000005A
-:1077600002000F00CA847100000000000000000049
-:1077700002000F00CB847100000000000000000038
-:1077800002000F00CC847100000000000000000027
-:1077900002000F00CD847100000000000000000016
-:1077A00002000F00CE847100000000000000000005
-:1077B00002000F00CF8471000000000000000000F4
-:1077C00002000F00D08471000000000000000000E3
-:1077D00002000F00D18471000000000000000000D2
-:1077E00002000F00D28471000000000000000000C1
-:1077F00002000F00D38471000000000000000000B0
-:1078000002000F00D484710000000000000000009E
-:1078100002000F00D584710000000000000000008D
-:1078200002000F00D684710000000000000000007C
-:1078300002000F00D784710000000000000000006B
-:1078400002000F00D884710000000000000000005A
-:1078500002000F00D9847100000000000000000049
-:1078600002000F00DA847100000000000000000038
-:1078700002000F00DB847100000000000000000027
-:1078800002000F00DC847100000000000000000016
-:1078900002000F00DD847100000000000000000005
-:1078A00002000F00DE8471000000000000000000F4
-:1078B00002000F00DF8471000000000000000000E3
-:1078C00002000F00E08471000000000000000000D2
-:1078D00002000F00E18471000000000000000000C1
-:1078E00002000F00E28471000000000000000000B0
-:1078F00002000F00E384710000000000000000009F
-:1079000002000F00E484710000000000000000008D
-:1079100002000F00E584710000000000000000007C
-:1079200002000F00E684710000000000000000006B
-:1079300002000F00E784710000000000000000005A
-:1079400002000F00E8847100000000000000000049
-:1079500002000F00E9847100000000000000000038
-:1079600002000F00EA847100000000000000000027
-:1079700002000F00EB847100000000000000000016
-:1079800002000F00EC847100000000000000000005
-:1079900002000F00ED8471000000000000000000F4
-:1079A00002000F00EE8471000000000000000000E3
-:1079B00002000F00EF8471000000000000000000D2
-:1079C00002000F00F08471000000000000000000C1
-:1079D00002000F00F18471000000000000000000B0
-:1079E00002000F00F284710000000000000000009F
-:1079F00002000F00F384710000000000000000008E
-:107A000002000F00F484710000000000000000007C
-:107A100002000F00F584710000000000000000006B
-:107A200002000F00F684710000000000000000005A
-:107A300002000F00F7847100000000000000000049
-:107A400002000F00F8847100000000000000000038
-:107A500002000F00F9847100000000000000000027
-:107A600002000F00FA847100000000000000000016
-:107A700002000F00FB847100000000000000000005
-:107A800002000F00FC8471000000000000000000F4
-:107A900002000F00FD8471000000000000000000E3
-:107AA00002000F00FE8471000000000000000000D2
-:107AB00002000F00FF8471000000000000000000C1
-:107AC00002000F00008571000000000000000000AF
-:107AD00002000F000185710000000000000000009E
-:107AE00002000F000285710000000000000000008D
-:107AF00002000F000385710000000000000000007C
-:107B000002000F000485710000000000000000006A
-:107B100002000F0005857100000000000000000059
-:107B200002000F0006857100000000000000000048
-:107B300002000F0007857100000000000000000037
-:107B400002000F0008857100000000000000000026
-:107B500002000F0009857100000000000000000015
-:107B600002000F000A857100000000000000000004
-:107B700002000F000B8571000000000000000000F3
-:107B800002000F000C8571000000000000000000E2
-:107B900002000F000D8571000000000000000000D1
-:107BA00002000F000E8571000000000000000000C0
-:107BB00002000F000F8571000000000000000000AF
-:107BC00002000F001085710000000000000000009E
-:107BD00002000F001185710000000000000000008D
-:107BE00002000F001285710000000000000000007C
-:107BF00002000F001385710000000000000000006B
-:107C000002000F0014857100000000000000000059
-:107C100002000F0015857100000000000000000048
-:107C200002000F0016857100000000000000000037
-:107C300002000F0017857100000000000000000026
-:107C400002000F0018857100000000000000000015
-:107C500002000F0019857100000000000000000004
-:107C600002000F001A8571000000000000000000F3
-:107C700002000F001B8571000000000000000000E2
-:107C800002000F001C8571000000000000000000D1
-:107C900002000F001D8571000000000000000000C0
-:107CA00002000F001E8571000000000000000000AF
-:107CB00002000F001F85710000000000000000009E
-:107CC00002000F002085710000000000000000008D
-:107CD00002000F002185710000000000000000007C
-:107CE00002000F002285710000000000000000006B
-:107CF00002000F002385710000000000000000005A
-:107D000002000F0024857100000000000000000048
-:107D100002000F0025857100000000000000000037
-:107D200002000F0026857100000000000000000026
-:107D300002000F0027857100000000000000000015
-:107D400002000F0028857100000000000000000004
-:107D500002000F00298571000000000000000000F3
-:107D600002000F002A8571000000000000000000E2
-:107D700002000F002B8571000000000000000000D1
-:107D800002000F002C8571000000000000000000C0
-:107D900002000F002D8571000000000000000000AF
-:107DA00002000F002E85710000000000000000009E
-:107DB00002000F002F85710000000000000000008D
-:107DC00002000F003085710000000000000000007C
-:107DD00002000F003185710000000000000000006B
-:107DE00002000F003285710000000000000000005A
-:107DF00002000F0033857100000000000000000049
-:107E000002000F0034857100000000000000000037
-:107E100002000F0035857100000000000000000026
-:107E200002000F0036857100000000000000000015
-:107E300002000F0037857100000000000000000004
-:107E400002000F00388571000000000000000000F3
-:107E500002000F00398571000000000000000000E2
-:107E600002000F003A8571000000000000000000D1
-:107E700002000F003B8571000000000000000000C0
-:107E800002000F003C8571000000000000000000AF
-:107E900002000F003D85710000000000000000009E
-:107EA00002000F003E85710000000000000000008D
-:107EB00002000F003F85710000000000000000007C
-:107EC00002000F004085710000000000000000006B
-:107ED00002000F004185710000000000000000005A
-:107EE00002000F0042857100000000000000000049
-:107EF00002000F0043857100000000000000000038
-:107F000002000F0044857100000000000000000026
-:107F100002000F0045857100000000000000000015
-:107F200002000F0046857100000000000000000004
-:107F300002000F00478571000000000000000000F3
-:107F400002000F00488571000000000000000000E2
-:107F500002000F00498571000000000000000000D1
-:107F600002000F004A8571000000000000000000C0
-:107F700002000F004B8571000000000000000000AF
-:107F800002000F004C85710000000000000000009E
-:107F900002000F004D85710000000000000000008D
-:107FA00002000F004E85710000000000000000007C
-:107FB00002000F004F85710000000000000000006B
-:107FC00002000F005085710000000000000000005A
-:107FD00002000F0051857100000000000000000049
-:107FE00002000F0052857100000000000000000038
-:107FF00002000F0053857100000000000000000027
-:1080000002000F0054857100000000000000000015
-:1080100002000F0055857100000000000000000004
-:1080200002000F00568571000000000000000000F3
-:1080300002000F00578571000000000000000000E2
-:1080400002000F00588571000000000000000000D1
-:1080500002000F00598571000000000000000000C0
-:1080600002000F005A8571000000000000000000AF
-:1080700002000F005B85710000000000000000009E
-:1080800002000F005C85710000000000000000008D
-:1080900002000F005D85710000000000000000007C
-:1080A00002000F005E85710000000000000000006B
-:1080B00002000F005F85710000000000000000005A
-:1080C00002000F0060857100000000000000000049
-:1080D00002000F0061857100000000000000000038
-:1080E00002000F0062857100000000000000000027
-:1080F00002000F0063857100000000000000000016
-:1081000002000F0064857100000000000000000004
-:1081100002000F00658571000000000000000000F3
-:1081200002000F00668571000000000000000000E2
-:1081300002000F00678571000000000000000000D1
-:1081400002000F00688571000000000000000000C0
-:1081500002000F00698571000000000000000000AF
-:1081600002000F006A85710000000000000000009E
-:1081700002000F006B85710000000000000000008D
-:1081800002000F006C85710000000000000000007C
-:1081900002000F006D85710000000000000000006B
-:1081A00002000F006E85710000000000000000005A
-:1081B00002000F006F857100000000000000000049
-:1081C00002000F0070857100000000000000000038
-:1081D00002000F0071857100000000000000000027
-:1081E00002000F0072857100000000000000000016
-:1081F00002000F0073857100000000000000000005
-:1082000002000F00748571000000000000000000F3
-:1082100002000F00758571000000000000000000E2
-:1082200002000F00768571000000000000000000D1
-:1082300002000F00778571000000000000000000C0
-:1082400002000F00788571000000000000000000AF
-:1082500002000F007985710000000000000000009E
-:1082600002000F007A85710000000000000000008D
-:1082700002000F007B85710000000000000000007C
-:1082800002000F007C85710000000000000000006B
-:1082900002000F007D85710000000000000000005A
-:1082A00002000F007E857100000000000000000049
-:1082B00002000F007F857100000000000000000038
-:1082C00002000F0080857100000000000000000027
-:1082D00002000F0081857100000000000000000016
-:1082E00002000F0082857100000000000000000005
-:1082F00002000F00838571000000000000000000F4
-:1083000002000F00848571000000000000000000E2
-:1083100002000F00858571000000000000000000D1
-:1083200002000F00868571000000000000000000C0
-:1083300002000F00878571000000000000000000AF
-:1083400002000F008885710000000000000000009E
-:1083500002000F008985710000000000000000008D
-:1083600002000F008A85710000000000000000007C
-:1083700002000F008B85710000000000000000006B
-:1083800002000F008C85710000000000000000005A
-:1083900002000F008D857100000000000000000049
-:1083A00002000F008E857100000000000000000038
-:1083B00002000F008F857100000000000000000027
-:1083C00002000F0090857100000000000000000016
-:1083D00002000F0091857100000000000000000005
-:1083E00002000F00928571000000000000000000F4
-:1083F00002000F00938571000000000000000000E3
-:1084000002000F00948571000000000000000000D1
-:1084100002000F00958571000000000000000000C0
-:1084200002000F00968571000000000000000000AF
-:1084300002000F009785710000000000000000009E
-:1084400002000F009885710000000000000000008D
-:1084500002000F009985710000000000000000007C
-:1084600002000F009A85710000000000000000006B
-:1084700002000F009B85710000000000000000005A
-:1084800002000F009C857100000000000000000049
-:1084900002000F009D857100000000000000000038
-:1084A00002000F009E857100000000000000000027
-:1084B00002000F009F857100000000000000000016
-:1084C00002000F00A0857100000000000000000005
-:1084D00002000F00A18571000000000000000000F4
-:1084E00002000F00A28571000000000000000000E3
-:1084F00002000F00A38571000000000000000000D2
-:1085000002000F00A48571000000000000000000C0
-:1085100002000F00A58571000000000000000000AF
-:1085200002000F00A685710000000000000000009E
-:1085300002000F00A785710000000000000000008D
-:1085400002000F00A885710000000000000000007C
-:1085500002000F00A985710000000000000000006B
-:1085600002000F00AA85710000000000000000005A
-:1085700002000F00AB857100000000000000000049
-:1085800002000F00AC857100000000000000000038
-:1085900002000F00AD857100000000000000000027
-:1085A00002000F00AE857100000000000000000016
-:1085B00002000F00AF857100000000000000000005
-:1085C00002000F00B08571000000000000000000F4
-:1085D00002000F00B18571000000000000000000E3
-:1085E00002000F00B28571000000000000000000D2
-:1085F00002000F00B38571000000000000000000C1
-:1086000002000F00B48571000000000000000000AF
-:1086100002000F00B585710000000000000000009E
-:1086200002000F00B685710000000000000000008D
-:1086300002000F00B785710000000000000000007C
-:1086400002000F00B885710000000000000000006B
-:1086500002000F00B985710000000000000000005A
-:1086600002000F00BA857100000000000000000049
-:1086700002000F00BB857100000000000000000038
-:1086800002000F00BC857100000000000000000027
-:1086900002000F00BD857100000000000000000016
-:1086A00002000F00BE857100000000000000000005
-:1086B00002000F00BF8571000000000000000000F4
-:1086C00002000F00C08571000000000000000000E3
-:1086D00002000F00C18571000000000000000000D2
-:1086E00002000F00C28571000000000000000000C1
-:1086F00002000F00C38571000000000000000000B0
-:1087000002000F00C485710000000000000000009E
-:1087100002000F00C585710000000000000000008D
-:1087200002000F00C685710000000000000000007C
-:1087300002000F00C785710000000000000000006B
-:1087400002000F00C885710000000000000000005A
-:1087500002000F00C9857100000000000000000049
-:1087600002000F00CA857100000000000000000038
-:1087700002000F00CB857100000000000000000027
-:1087800002000F00CC857100000000000000000016
-:1087900002000F00CD857100000000000000000005
-:1087A00002000F00CE8571000000000000000000F4
-:1087B00002000F00CF8571000000000000000000E3
-:1087C00002000F00D08571000000000000000000D2
-:1087D00002000F00D18571000000000000000000C1
-:1087E00002000F00D28571000000000000000000B0
-:1087F00002000F00D385710000000000000000009F
-:1088000002000F00D485710000000000000000008D
-:1088100002000F00D585710000000000000000007C
-:1088200002000F00D685710000000000000000006B
-:1088300002000F00D785710000000000000000005A
-:1088400002000F00D8857100000000000000000049
-:1088500002000F00D9857100000000000000000038
-:1088600002000F00DA857100000000000000000027
-:1088700002000F00DB857100000000000000000016
-:1088800002000F00DC857100000000000000000005
-:1088900002000F00DD8571000000000000000000F4
-:1088A00002000F00DE8571000000000000000000E3
-:1088B00002000F00DF8571000000000000000000D2
-:1088C00002000F00E08571000000000000000000C1
-:1088D00002000F00E18571000000000000000000B0
-:1088E00002000F00E285710000000000000000009F
-:1088F00002000F00E385710000000000000000008E
-:1089000002000F00E485710000000000000000007C
-:1089100002000F00E585710000000000000000006B
-:1089200002000F00E685710000000000000000005A
-:1089300002000F00E7857100000000000000000049
-:1089400002000F00E8857100000000000000000038
-:1089500002000F00E9857100000000000000000027
-:1089600002000F00EA857100000000000000000016
-:1089700002000F00EB857100000000000000000005
-:1089800002000F00EC8571000000000000000000F4
-:1089900002000F00ED8571000000000000000000E3
-:1089A00002000F00EE8571000000000000000000D2
-:1089B00002000F00EF8571000000000000000000C1
-:1089C00002000F00F08571000000000000000000B0
-:1089D00002000F00F185710000000000000000009F
-:1089E00002000F00F285710000000000000000008E
-:1089F00002000F00F385710000000000000000007D
-:108A000002000F00F485710000000000000000006B
-:108A100002000F00F585710000000000000000005A
-:108A200002000F00F6857100000000000000000049
-:108A300002000F00F7857100000000000000000038
-:108A400002000F00F8857100000000000000000027
-:108A500002000F00F9857100000000000000000016
-:108A600002000F00FA857100000000000000000005
-:108A700002000F00FB8571000000000000000000F4
-:108A800002000F00FC8571000000000000000000E3
-:108A900002000F00FD8571000000000000000000D2
-:108AA00002000F00FE8571000000000000000000C1
-:108AB00002000F00FF8571000000000000000000B0
-:108AC00002000F000086710000000000000000009E
-:108AD00002000F000186710000000000000000008D
-:108AE00002000F000286710000000000000000007C
-:108AF00002000F000386710000000000000000006B
-:108B000002000F0004867100000000000000000059
-:108B100002000F0005867100000000000000000048
-:108B200002000F0006867100000000000000000037
-:108B300002000F0007867100000000000000000026
-:108B400002000F0008867100000000000000000015
-:108B500002000F0009867100000000000000000004
-:108B600002000F000A8671000000000000000000F3
-:108B700002000F000B8671000000000000000000E2
-:108B800002000F000C8671000000000000000000D1
-:108B900002000F000D8671000000000000000000C0
-:108BA00002000F000E8671000000000000000000AF
-:108BB00002000F000F86710000000000000000009E
-:108BC00002000F001086710000000000000000008D
-:108BD00002000F001186710000000000000000007C
-:108BE00002000F001286710000000000000000006B
-:108BF00002000F001386710000000000000000005A
-:108C000002000F0014867100000000000000000048
-:108C100002000F0015867100000000000000000037
-:108C200002000F0016867100000000000000000026
-:108C300002000F0017867100000000000000000015
-:108C400002000F0018867100000000000000000004
-:108C500002000F00198671000000000000000000F3
-:108C600002000F001A8671000000000000000000E2
-:108C700002000F001B8671000000000000000000D1
-:108C800002000F001C8671000000000000000000C0
-:108C900002000F001D8671000000000000000000AF
-:108CA00002000F001E86710000000000000000009E
-:108CB00002000F001F86710000000000000000008D
-:108CC00002000F002086710000000000000000007C
-:108CD00002000F002186710000000000000000006B
-:108CE00002000F002286710000000000000000005A
-:108CF00002000F0023867100000000000000000049
-:108D000002000F0024867100000000000000000037
-:108D100002000F0025867100000000000000000026
-:108D200002000F0026867100000000000000000015
-:108D300002000F0027867100000000000000000004
-:108D400002000F00288671000000000000000000F3
-:108D500002000F00298671000000000000000000E2
-:108D600002000F002A8671000000000000000000D1
-:108D700002000F002B8671000000000000000000C0
-:108D800002000F002C8671000000000000000000AF
-:108D900002000F002D86710000000000000000009E
-:108DA00002000F002E86710000000000000000008D
-:108DB00002000F002F86710000000000000000007C
-:108DC00002000F003086710000000000000000006B
-:108DD00002000F003186710000000000000000005A
-:108DE00002000F0032867100000000000000000049
-:108DF00002000F0033867100000000000000000038
-:108E000002000F0034867100000000000000000026
-:108E100002000F0035867100000000000000000015
-:108E200002000F0036867100000000000000000004
-:108E300002000F00378671000000000000000000F3
-:108E400002000F00388671000000000000000000E2
-:108E500002000F00398671000000000000000000D1
-:108E600002000F003A8671000000000000000000C0
-:108E700002000F003B8671000000000000000000AF
-:108E800002000F003C86710000000000000000009E
-:108E900002000F003D86710000000000000000008D
-:108EA00002000F003E86710000000000000000007C
-:108EB00002000F003F86710000000000000000006B
-:108EC00002000F004086710000000000000000005A
-:108ED00002000F0041867100000000000000000049
-:108EE00002000F0042867100000000000000000038
-:108EF00002000F0043867100000000000000000027
-:108F000002000F0044867100000000000000000015
-:108F100002000F0045867100000000000000000004
-:108F200002000F00468671000000000000000000F3
-:108F300002000F00478671000000000000000000E2
-:108F400002000F00488671000000000000000000D1
-:108F500002000F00498671000000000000000000C0
-:108F600002000F004A8671000000000000000000AF
-:108F700002000F004B86710000000000000000009E
-:108F800002000F004C86710000000000000000008D
-:108F900002000F004D86710000000000000000007C
-:108FA00002000F004E86710000000000000000006B
-:108FB00002000F004F86710000000000000000005A
-:108FC00002000F0050867100000000000000000049
-:108FD00002000F0051867100000000000000000038
-:108FE00002000F0052867100000000000000000027
-:108FF00002000F0053867100000000000000000016
-:1090000002000F0054867100000000000000000004
-:1090100002000F00558671000000000000000000F3
-:1090200002000F00568671000000000000000000E2
-:1090300002000F00578671000000000000000000D1
-:1090400002000F00588671000000000000000000C0
-:1090500002000F00598671000000000000000000AF
-:1090600002000F005A86710000000000000000009E
-:1090700002000F005B86710000000000000000008D
-:1090800002000F005C86710000000000000000007C
-:1090900002000F005D86710000000000000000006B
-:1090A00002000F005E86710000000000000000005A
-:1090B00002000F005F867100000000000000000049
-:1090C00002000F0060867100000000000000000038
-:1090D00002000F0061867100000000000000000027
-:1090E00002000F0062867100000000000000000016
-:1090F00002000F0063867100000000000000000005
-:1091000002000F00648671000000000000000000F3
-:1091100002000F00658671000000000000000000E2
-:1091200002000F00668671000000000000000000D1
-:1091300002000F00678671000000000000000000C0
-:1091400002000F00688671000000000000000000AF
-:1091500002000F006986710000000000000000009E
-:1091600002000F006A86710000000000000000008D
-:1091700002000F006B86710000000000000000007C
-:1091800002000F006C86710000000000000000006B
-:1091900002000F006D86710000000000000000005A
-:1091A00002000F006E867100000000000000000049
-:1091B00002000F006F867100000000000000000038
-:1091C00002000F0070867100000000000000000027
-:1091D00002000F0071867100000000000000000016
-:1091E00002000F0072867100000000000000000005
-:1091F00002000F00738671000000000000000000F4
-:1092000002000F00748671000000000000000000E2
-:1092100002000F00758671000000000000000000D1
-:1092200002000F00768671000000000000000000C0
-:1092300002000F00778671000000000000000000AF
-:1092400002000F007886710000000000000000009E
-:1092500002000F007986710000000000000000008D
-:1092600002000F007A86710000000000000000007C
-:1092700002000F007B86710000000000000000006B
-:1092800002000F007C86710000000000000000005A
-:1092900002000F007D867100000000000000000049
-:1092A00002000F007E867100000000000000000038
-:1092B00002000F007F867100000000000000000027
-:1092C00002000F0080867100000000000000000016
-:1092D00002000F0081867100000000000000000005
-:1092E00002000F00828671000000000000000000F4
-:1092F00002000F00838671000000000000000000E3
-:1093000002000F00848671000000000000000000D1
-:1093100002000F00858671000000000000000000C0
-:1093200002000F00868671000000000000000000AF
-:1093300002000F008786710000000000000000009E
-:1093400002000F008886710000000000000000008D
-:1093500002000F008986710000000000000000007C
-:1093600002000F008A86710000000000000000006B
-:1093700002000F008B86710000000000000000005A
-:1093800002000F008C867100000000000000000049
-:1093900002000F008D867100000000000000000038
-:1093A00002000F008E867100000000000000000027
-:1093B00002000F008F867100000000000000000016
-:1093C00002000F0090867100000000000000000005
-:1093D00002000F00918671000000000000000000F4
-:1093E00002000F00928671000000000000000000E3
-:1093F00002000F00938671000000000000000000D2
-:1094000002000F00948671000000000000000000C0
-:1094100002000F00958671000000000000000000AF
-:1094200002000F009686710000000000000000009E
-:1094300002000F009786710000000000000000008D
-:1094400002000F009886710000000000000000007C
-:1094500002000F009986710000000000000000006B
-:1094600002000F009A86710000000000000000005A
-:1094700002000F009B867100000000000000000049
-:1094800002000F009C867100000000000000000038
-:1094900002000F009D867100000000000000000027
-:1094A00002000F009E867100000000000000000016
-:1094B00002000F009F867100000000000000000005
-:1094C00002000F00A08671000000000000000000F4
-:1094D00002000F00A18671000000000000000000E3
-:1094E00002000F00A28671000000000000000000D2
-:1094F00002000F00A38671000000000000000000C1
-:1095000002000F00A48671000000000000000000AF
-:1095100002000F00A586710000000000000000009E
-:1095200002000F00A686710000000000000000008D
-:1095300002000F00A786710000000000000000007C
-:1095400002000F00A886710000000000000000006B
-:1095500002000F00A986710000000000000000005A
-:1095600002000F00AA867100000000000000000049
-:1095700002000F00AB867100000000000000000038
-:1095800002000F00AC867100000000000000000027
-:1095900002000F00AD867100000000000000000016
-:1095A00002000F00AE867100000000000000000005
-:1095B00002000F00AF8671000000000000000000F4
-:1095C00002000F00B08671000000000000000000E3
-:1095D00002000F00B18671000000000000000000D2
-:1095E00002000F00B28671000000000000000000C1
-:1095F00002000F00B38671000000000000000000B0
-:1096000002000F00B486710000000000000000009E
-:1096100002000F00B586710000000000000000008D
-:1096200002000F00B686710000000000000000007C
-:1096300002000F00B786710000000000000000006B
-:1096400002000F00B886710000000000000000005A
-:1096500002000F00B9867100000000000000000049
-:1096600002000F00BA867100000000000000000038
-:1096700002000F00BB867100000000000000000027
-:1096800002000F00BC867100000000000000000016
-:1096900002000F00BD867100000000000000000005
-:1096A00002000F00BE8671000000000000000000F4
-:1096B00002000F00BF8671000000000000000000E3
-:1096C00002000F00C08671000000000000000000D2
-:1096D00002000F00C18671000000000000000000C1
-:1096E00002000F00C28671000000000000000000B0
-:1096F00002000F00C386710000000000000000009F
-:1097000002000F00C486710000000000000000008D
-:1097100002000F00C586710000000000000000007C
-:1097200002000F00C686710000000000000000006B
-:1097300002000F00C786710000000000000000005A
-:1097400002000F00C8867100000000000000000049
-:1097500002000F00C9867100000000000000000038
-:1097600002000F00CA867100000000000000000027
-:1097700002000F00CB867100000000000000000016
-:1097800002000F00CC867100000000000000000005
-:1097900002000F00CD8671000000000000000000F4
-:1097A00002000F00CE8671000000000000000000E3
-:1097B00002000F00CF8671000000000000000000D2
-:1097C00002000F00D08671000000000000000000C1
-:1097D00002000F00D18671000000000000000000B0
-:1097E00002000F00D286710000000000000000009F
-:1097F00002000F00D386710000000000000000008E
-:1098000002000F00D486710000000000000000007C
-:1098100002000F00D586710000000000000000006B
-:1098200002000F00D686710000000000000000005A
-:1098300002000F00D7867100000000000000000049
-:1098400002000F00D8867100000000000000000038
-:1098500002000F00D9867100000000000000000027
-:1098600002000F00DA867100000000000000000016
-:1098700002000F00DB867100000000000000000005
-:1098800002000F00DC8671000000000000000000F4
-:1098900002000F00DD8671000000000000000000E3
-:1098A00002000F00DE8671000000000000000000D2
-:1098B00002000F00DF8671000000000000000000C1
-:1098C00002000F00E08671000000000000000000B0
-:1098D00002000F00E186710000000000000000009F
-:1098E00002000F00E286710000000000000000008E
-:1098F00002000F00E386710000000000000000007D
-:1099000002000F00E486710000000000000000006B
-:1099100002000F00E586710000000000000000005A
-:1099200002000F00E6867100000000000000000049
-:1099300002000F00E7867100000000000000000038
-:1099400002000F00E8867100000000000000000027
-:1099500002000F00E9867100000000000000000016
-:1099600002000F00EA867100000000000000000005
-:1099700002000F00EB8671000000000000000000F4
-:1099800002000F00EC8671000000000000000000E3
-:1099900002000F00ED8671000000000000000000D2
-:1099A00002000F00EE8671000000000000000000C1
-:1099B00002000F00EF8671000000000000000000B0
-:1099C00002000F00F086710000000000000000009F
-:1099D00002000F00F186710000000000000000008E
-:1099E00002000F00F286710000000000000000007D
-:1099F00002000F00F386710000000000000000006C
-:109A000002000F00F486710000000000000000005A
-:109A100002000F00F5867100000000000000000049
-:109A200002000F00F6867100000000000000000038
-:109A300002000F00F7867100000000000000000027
-:109A400002000F00F8867100000000000000000016
-:109A500002000F00F9867100000000000000000005
-:109A600002000F00FA8671000000000000000000F4
-:109A700002000F00FB8671000000000000000000E3
-:109A800002000F00FC8671000000000000000000D2
-:109A900002000F00FD8671000000000000000000C1
-:109AA00002000F00FE8671000000000000000000B0
-:109AB00002000F00FF86710000000000000000009F
-:109AC00002000F000087710000000000000000008D
-:109AD00002000F000187710000000000000000007C
-:109AE00002000F000287710000000000000000006B
-:109AF00002000F000387710000000000000000005A
-:109B000002000F0004877100000000000000000048
-:109B100002000F0005877100000000000000000037
-:109B200002000F0006877100000000000000000026
-:109B300002000F0007877100000000000000000015
-:109B400002000F0008877100000000000000000004
-:109B500002000F00098771000000000000000000F3
-:109B600002000F000A8771000000000000000000E2
-:109B700002000F000B8771000000000000000000D1
-:109B800002000F000C8771000000000000000000C0
-:109B900002000F000D8771000000000000000000AF
-:109BA00002000F000E87710000000000000000009E
-:109BB00002000F000F87710000000000000000008D
-:109BC00002000F001087710000000000000000007C
-:109BD00002000F001187710000000000000000006B
-:109BE00002000F001287710000000000000000005A
-:109BF00002000F0013877100000000000000000049
-:109C000002000F0014877100000000000000000037
-:109C100002000F0015877100000000000000000026
-:109C200002000F0016877100000000000000000015
-:109C300002000F0017877100000000000000000004
-:109C400002000F00188771000000000000000000F3
-:109C500002000F00198771000000000000000000E2
-:109C600002000F001A8771000000000000000000D1
-:109C700002000F001B8771000000000000000000C0
-:109C800002000F001C8771000000000000000000AF
-:109C900002000F001D87710000000000000000009E
-:109CA00002000F001E87710000000000000000008D
-:109CB00002000F001F87710000000000000000007C
-:109CC00002000F002087710000000000000000006B
-:109CD00002000F002187710000000000000000005A
-:109CE00002000F0022877100000000000000000049
-:109CF00002000F0023877100000000000000000038
-:109D000002000F0024877100000000000000000026
-:109D100002000F0025877100000000000000000015
-:109D200002000F0026877100000000000000000004
-:109D300002000F00278771000000000000000000F3
-:109D400002000F00288771000000000000000000E2
-:109D500002000F00298771000000000000000000D1
-:109D600002000F002A8771000000000000000000C0
-:109D700002000F002B8771000000000000000000AF
-:109D800002000F002C87710000000000000000009E
-:109D900002000F002D87710000000000000000008D
-:109DA00002000F002E87710000000000000000007C
-:109DB00002000F002F87710000000000000000006B
-:109DC00002000F003087710000000000000000005A
-:109DD00002000F0031877100000000000000000049
-:109DE00002000F0032877100000000000000000038
-:109DF00002000F0033877100000000000000000027
-:109E000002000F0034877100000000000000000015
-:109E100002000F0035877100000000000000000004
-:109E200002000F00368771000000000000000000F3
-:109E300002000F00378771000000000000000000E2
-:109E400002000F00388771000000000000000000D1
-:109E500002000F00398771000000000000000000C0
-:109E600002000F003A8771000000000000000000AF
-:109E700002000F003B87710000000000000000009E
-:109E800002000F003C87710000000000000000008D
-:109E900002000F003D87710000000000000000007C
-:109EA00002000F003E87710000000000000000006B
-:109EB00002000F003F87710000000000000000005A
-:109EC00002000F0040877100000000000000000049
-:109ED00002000F0041877100000000000000000038
-:109EE00002000F0042877100000000000000000027
-:109EF00002000F0043877100000000000000000016
-:109F000002000F0044877100000000000000000004
-:109F100002000F00458771000000000000000000F3
-:109F200002000F00468771000000000000000000E2
-:109F300002000F00478771000000000000000000D1
-:109F400002000F00488771000000000000000000C0
-:109F500002000F00498771000000000000000000AF
-:109F600002000F004A87710000000000000000009E
-:109F700002000F004B87710000000000000000008D
-:109F800002000F004C87710000000000000000007C
-:109F900002000F004D87710000000000000000006B
-:109FA00002000F004E87710000000000000000005A
-:109FB00002000F004F877100000000000000000049
-:109FC00002000F0050877100000000000000000038
-:109FD00002000F0051877100000000000000000027
-:109FE00002000F0052877100000000000000000016
-:109FF00002000F0053877100000000000000000005
-:10A0000002000F00548771000000000000000000F3
-:10A0100002000F00558771000000000000000000E2
-:10A0200002000F00568771000000000000000000D1
-:10A0300002000F00578771000000000000000000C0
-:10A0400002000F00588771000000000000000000AF
-:10A0500002000F005987710000000000000000009E
-:10A0600002000F005A87710000000000000000008D
-:10A0700002000F005B87710000000000000000007C
-:10A0800002000F005C87710000000000000000006B
-:10A0900002000F005D87710000000000000000005A
-:10A0A00002000F005E877100000000000000000049
-:10A0B00002000F005F877100000000000000000038
-:10A0C00002000F0060877100000000000000000027
-:10A0D00002000F0061877100000000000000000016
-:10A0E00002000F0062877100000000000000000005
-:10A0F00002000F00638771000000000000000000F4
-:10A1000002000F00648771000000000000000000E2
-:10A1100002000F00658771000000000000000000D1
-:10A1200002000F00668771000000000000000000C0
-:10A1300002000F00678771000000000000000000AF
-:10A1400002000F006887710000000000000000009E
-:10A1500002000F006987710000000000000000008D
-:10A1600002000F006A87710000000000000000007C
-:10A1700002000F006B87710000000000000000006B
-:10A1800002000F006C87710000000000000000005A
-:10A1900002000F006D877100000000000000000049
-:10A1A00002000F006E877100000000000000000038
-:10A1B00002000F006F877100000000000000000027
-:10A1C00002000F0070877100000000000000000016
-:10A1D00002000F0071877100000000000000000005
-:10A1E00002000F00728771000000000000000000F4
-:10A1F00002000F00738771000000000000000000E3
-:10A2000002000F00748771000000000000000000D1
-:10A2100002000F00758771000000000000000000C0
-:10A2200002000F00768771000000000000000000AF
-:10A2300002000F007787710000000000000000009E
-:10A2400002000F007887710000000000000000008D
-:10A2500002000F007987710000000000000000007C
-:10A2600002000F007A87710000000000000000006B
-:10A2700002000F007B87710000000000000000005A
-:10A2800002000F007C877100000000000000000049
-:10A2900002000F007D877100000000000000000038
-:10A2A00002000F007E877100000000000000000027
-:10A2B00002000F007F877100000000000000000016
-:10A2C00002000F0080877100000000000000000005
-:10A2D00002000F00818771000000000000000000F4
-:10A2E00002000F00828771000000000000000000E3
-:10A2F00002000F00838771000000000000000000D2
-:10A3000002000F00848771000000000000000000C0
-:10A3100002000F00858771000000000000000000AF
-:10A3200002000F008687710000000000000000009E
-:10A3300002000F008787710000000000000000008D
-:10A3400002000F008887710000000000000000007C
-:10A3500002000F008987710000000000000000006B
-:10A3600002000F008A87710000000000000000005A
-:10A3700002000F008B877100000000000000000049
-:10A3800002000F008C877100000000000000000038
-:10A3900002000F008D877100000000000000000027
-:10A3A00002000F008E877100000000000000000016
-:10A3B00002000F008F877100000000000000000005
-:10A3C00002000F00908771000000000000000000F4
-:10A3D00002000F00918771000000000000000000E3
-:10A3E00002000F00928771000000000000000000D2
-:10A3F00002000F00938771000000000000000000C1
-:10A4000002000F00948771000000000000000000AF
-:10A4100002000F009587710000000000000000009E
-:10A4200002000F009687710000000000000000008D
-:10A4300002000F009787710000000000000000007C
-:10A4400002000F009887710000000000000000006B
-:10A4500002000F009987710000000000000000005A
-:10A4600002000F009A877100000000000000000049
-:10A4700002000F009B877100000000000000000038
-:10A4800002000F009C877100000000000000000027
-:10A4900002000F009D877100000000000000000016
-:10A4A00002000F009E877100000000000000000005
-:10A4B00002000F009F8771000000000000000000F4
-:10A4C00002000F00A08771000000000000000000E3
-:10A4D00002000F00A18771000000000000000000D2
-:10A4E00002000F00A28771000000000000000000C1
-:10A4F00002000F00A38771000000000000000000B0
-:10A5000002000F00A487710000000000000000009E
-:10A5100002000F00A587710000000000000000008D
-:10A5200002000F00A687710000000000000000007C
-:10A5300002000F00A787710000000000000000006B
-:10A5400002000F00A887710000000000000000005A
-:10A5500002000F00A9877100000000000000000049
-:10A5600002000F00AA877100000000000000000038
-:10A5700002000F00AB877100000000000000000027
-:10A5800002000F00AC877100000000000000000016
-:10A5900002000F00AD877100000000000000000005
-:10A5A00002000F00AE8771000000000000000000F4
-:10A5B00002000F00AF8771000000000000000000E3
-:10A5C00002000F00B08771000000000000000000D2
-:10A5D00002000F00B18771000000000000000000C1
-:10A5E00002000F00B28771000000000000000000B0
-:10A5F00002000F00B387710000000000000000009F
-:10A6000002000F00B487710000000000000000008D
-:10A6100002000F00B587710000000000000000007C
-:10A6200002000F00B687710000000000000000006B
-:10A6300002000F00B787710000000000000000005A
-:10A6400002000F00B8877100000000000000000049
-:10A6500002000F00B9877100000000000000000038
-:10A6600002000F00BA877100000000000000000027
-:10A6700002000F00BB877100000000000000000016
-:10A6800002000F00BC877100000000000000000005
-:10A6900002000F00BD8771000000000000000000F4
-:10A6A00002000F00BE8771000000000000000000E3
-:10A6B00002000F00BF8771000000000000000000D2
-:10A6C00002000F00C087710079000000769060FDE5
-:10A6D00002000F00C18771003D0000006F0080F78D
-:10A6E00002000F00C28771003D0000006F0080F77C
-:10A6F00002000F00C38771003D0000006F0080F76B
-:10A7000002000F00C48771803D0000006F0080F7D9
-:00000001FF
-/* Loading Firmware */
-/* INT_MEM Ver */
- * Tehuti Networks(R) Network Driver
- * Copyright (C) 2007 Tehuti Networks Ltd. All rights reserved
diff --git a/firmware/ti_3410.fw.ihex b/firmware/ti_3410.fw.ihex
deleted file mode 100644
index b22c0425980e..000000000000
--- a/firmware/ti_3410.fw.ihex
+++ /dev/null
@@ -1,862 +0,0 @@
-:10000000C2350002001E021ADBFFFFFFFFFF0232B3
-:10001000CBFFFFFFFFFFFFFFFFFFFFFFFFFF0233ED
-:10002000767581CE90FDE88583A01234EAEC4D60B0
-:100030006A78AB8003760018B89CFA787F800376E4
-:100040000018B865FA78208003760018B820FA9076
-:10005000FDDDAE83AF8290FBF81200A16005E4F0F5
-:10006000A380F690FDE8A88290FDE8A982E8C399F4
-:10007000500576000880F69000FF1200AA90010358
-:100080001200AA9001071200AA90010B1200C8905A
-:1000900001111200C89001171200C875D000123368
-:1000A000C802011DEF65827003EE658322E493F8B8
-:1000B000740193F9740293FE740393F5828E83E8BE
-:1000C00069700122E493F6A30880F4E493FC7401C0
-:1000D00093FD740293FE740393FF740493F8740504
-:1000E00093F58288831200A1700122E493A3A88370
-:1000F000A9828C838D82F0A3AC83AD8288838982B0
-:1001000080E32121049280800492ACAE0492FDE849
-:1001100004940494FBF304990494FBF304F904F9A4
-:1001200080FED0F030F00920F303F68010F7800D48
-:1001300030F10920F303F28004F38001F020F4048D
-:10014000FCD0E0CC22CCC0E012015A02014BBC0032
-:1001500005D0F0ACF022C313DCFC020121BF000982
-:10016000ED258275F001F8E622BF010FED2582F53D
-:1001700082EE3583F58375F004E022ED258275F07B
-:1001800002F8E222D083D082F5F0C3E493A3C5F055
-:1001900095F0C0E0C3D0F0E493A395F04012A3A380
-:1001A000C3E5F033500205832582F58250020583B2
-:1001B000740193C0E0E493C0E022D083D082F5F0D4
-:1001C000E49370097401937004A3A3800C740293E8
-:1001D00065F06005A3A3A380E7740193C0E0E493F6
-:1001E000C0E02212025B0201F21202AF0201F2121F
-:1001F00002D30201F230E00720E302E622E72230D8
-:10020000E10720E302E222E32230E202E022E4936B
-:10021000221202D302021A1202AF02021AABF01229
-:100220000224CBC5F0CB2230E01020E306E6F5F047
-:1002300008E622E7F5F009E7192230E11020E3068D
-:10024000E2F5F008E222E3F5F009E3192230E206D4
-:10025000E0F5F0A3E022E493F5F074019322BB00F3
-:1002600003740922BB010789828A83740422BB02BA
-:100270000789828A83741022740A2202027BBB00DF
-:1002800007E92582F8740122BB010DE92582F58278
-:10029000EA3583F583740422BB020DE92582F582D9
-:1002A000EA3583F583741022E92582F8740222026C
-:1002B00002AFBF0005EDF8740122BF01078D828EE9
-:1002C00083740422BF02078D828E83741022EDF89E
-:1002D0007402220202D3BF0007ED2582F8740122C6
-:1002E000BF010DED2582F582EE3583F5837404227E
-:1002F000BF020DED2582F582EE3583F58374102261
-:10030000ED2582F8740222020307C0E012025B02AC
-:10031000031FC0E01202AF02031FC0E01202D302AB
-:10032000031F30E00B20E304D0E0F622D0E0F722F8
-:1003300030E10B20E304D0E0F222D0E0F322D0E061
-:10034000F022C9CDC9CACECACBCFCB120352EDF928
-:10035000EEFAEFFB22BB002FBF000AFAEDF8E7F63A
-:100360000809DAFA22BF01128D828E83F802036F28
-:1003700009A3E7F0D8FA2202037AFAEDF8E7F208C7
-:1003800009DAFA22020384BB014DBF001489828A74
-:1003900083F9EDF802039608A3E0F6D9FA220203E6
-:1003A000A7BF01228D828E83FB08C9C582C9CAC539
-:1003B00083CAE0A3C9C582C9CAC583CAF0A3DBEA60
-:1003C000D8E8220203CA8D828E83F9EDF8E0F208A4
-:1003D000A3D9FA220203D4BB024DBF001289828A3C
-:1003E00083F9EDF80203E608A3E493F6D9F922BFF6
-:1003F00001238D828E83FB08C9C582C9CAC583CA01
-:10040000E493A3C9C582C9CAC583CAF0A3DBE9D8EE
-:10041000E72202041989828A83F9EDF8E493F2084D
-:10042000A3D9F92202042ABF000DFAEDF8E3F60879
-:1004300009DAFA22020434BF01128D828E83F80297
-:10044000044109A3E3F0D8FA2202044CFAEDF8E3E0
-:10045000F20809DAFA22020456E6FB08E6FA08E690
-:10046000F904F61870010622E6FF08E6FE08E6FD2C
-:1004700022EFF0A3EEF0A3EDF022EBF0A3EAF0A35D
-:10048000E9F022E0FFA3E0FEA3E0FD22E0FBA3E011
-:10049000FAA3E0F9220000000000000004F9006166
-:1004A00005680026058F00330A0000610A6C0066AB
-:1004B000151D00610CF0006109A0006109D7006101
-:1004C0000DB700610BE800610A1300610A48006182
-:1004D00017150033172800341DF600431EA10044F1
-:1004E000200E00441FFC00471EC800471F6D004D32
-:1004F0001FBE004F1EEA0058325600617CCC7DFFC3
-:10050000121CA72290FFFCE020E72DC2AFAE59AF2E
-:1005100058755A20E55A14C55A6019E4FE7F05EE55
-:100520004FCE24FFCECF34FFCF6007E490FF92F090
-:1005300080ED80E08E598F58221205017D077CB72F
-:100540001232727D0F7C6E12328C789D7A06E4F640
-:1005500008DAFC7A061205C47C03120E4C12214AFA
-:10056000E4FEFF7C0F1231FBD2A8221230E6E490A9
-:10057000FC38F090FFF0E030E408740190FC39F0B2
-:100580008005E490FC39F07D0A7C001225261231AA
-:1005900069221230E690FC39E014700E90FFF0E012
-:1005A0004410F07C001225BF801990FC39E0700ED9
-:1005B00090FFF0E054EFF07C001225BF80057C171F
-:1005C0001225BF1231692290FFF0E054ABF090FF8A
-:1005D000F0E04420F0228C378D367882EDF608EC7E
-:1005E000F6EDFEECFD7F019000051201EC7880F63F
-:1005F0007882E6FD08E6FCEDFEECFD7F019000044C
-:100600001201EC540FFC7D801217467880E6700DC5
-:10061000AD3AAE39AF38E412030F7C082290FFF0F8
-:10062000E054FEF090FFF0E054FDF0801E7882E68A
-:10063000FD08E6FCEDFEECFD7F0190000812020EC5
-:1006400025E0440190FFF3F00206D07882E6FD0831
-:10065000E6FCEDFEECFD7F0190000612020E54FE5A
-:1006600090FFF3F0802B7882E6FD08E6FCEDFEECCF
-:10067000FD7F0190000812020EFAEB90FFF1F012DC
-:1006800008BF400DAD3AAE39AF38E412030F7C1805
-:10069000227882E6FD08E6FCEDFEECFD7F0190008D
-:1006A0000812020E90FFF1F01208BF400DAD3AAEF5
-:1006B00039AF38E412030F7C18227882E6FD08E691
-:1006C000FCEDFEECFD7F0190000612020E4401904D
-:1006D000FFF3F07883E62403F618E63400F678801A
-:1006E000E624FE500990FFF0E054FDF0800790FFF3
-:1006F000F0E04402F0E490FFF1F078817600788039
-:10070000E624FFFCE434FFFD7881E67F00FEECD3B5
-:100710009EEF6480CD64809D402F1208A4400F7826
-:1007200081E6AD3AAE39AF3812030F7C182290FF44
-:10073000F2E0FC78828683088682ECF0788106A35A
-:100740007882A68308A68280B51208A4400F78811B
-:10075000E6AD3AAE39AF3812030F7C182290FFF2A3
-:10076000E0FC78828683088682ECF07880E6AD3AF9
-:10077000AE39AF3812030F7C00228C378D36788269
-:10078000EDF608ECF6EDFEECFD7F019000051201A0
-:10079000EC7881F67882E6FD08E6FCEDFEECFD7F64
-:1007A000019000041201EC540FFC7D811217467871
-:1007B00081E670037C082290FFF0E054FEF090FF89
-:1007C000F0E054FDF0801B7882E6FD08E6FCEDFECB
-:1007D000ECFD7F0190000812020E25E090FFF3F07F
-:1007E000805B7882E6FD08E6FCEDFEECFD7F019083
-:1007F000000612020E54FE90FFF3F080217882E68C
-:10080000FD08E6FCEDFEECFD7F0190000812020EF3
-:10081000FAEB90FFF1F01208BF40037C18227882B7
-:10082000E6FD08E6FCEDFEECFD7F019000081202FB
-:100830000E90FFF1F01208BF40037C18227883E687
-:10084000240AF618E63400F6788076007881E624EB
-:10085000FFFCE434FFFD7880E67F00FEECD39EEFE2
-:100860006480CD64809D402178828683088682E002
-:1008700090FFF1F01208BF40037C182278800678C0
-:100880008306E61870010680C390FFF0E04401F093
-:1008900078828683088682E090FFF1F01208BF40DC
-:1008A000037C18227C002290FFF0E020E71290FFEA
-:1008B000F0E030E50990FFF0E04420F0C32280E74B
-:1008C000D32290FFF0E020E31290FFF0E030E50942
-:1008D00090FFF0E04420F0C32280E7D3228C428DC9
-:1008E000417C00ED54F0FDEC7003ED643070057553
-:1008F0003E038003753E04AC3E120F69758300858C
-:100900008340E541540FF53FE5407004E53F640343
-:100910007035E53E24FD75F00AA42402F582E43426
-:10092000FCF583E030E60512104B8019E53E249D6E
-:10093000F8C654FBF678A9E62405F58218E63400DB
-:10094000F583740FF08059E5407004E53F6404704E
-:1009500048E53E24FD75F00AA42402F582E434FC47
-:10096000F583E030E507AC42AD41121C3CE5423076
-:10097000E21578ADE630E00F78ADE630E109E4FF4E
-:1009800004FE7C041231FB78A9E62406F58218E601
-:100990003400F583740FF08007E4FC7DEE121C3CFC
-:1009A000C203221230E6120F6978A9E62406F58206
-:1009B00018E63400F583E090FC38F078A9E62405C9
-:1009C000F58218E63400F583E090FC39F0C2037D2F
-:1009D000027C00122526123169221230E67895EC4D
-:1009E000F6EC249DF8E630E1077C131225BF800F5A
-:1009F00090FC39E0FD7895E6FC1213C81225BF1271
-:100A00003169221230E67895ECF67D00120F09125A
-:100A100025BF123169221230E67895ECF6EC249D60
-:100A2000F8E630E2077C131225BF801B7895E62498
-:100A30009DF8E620E1077C121225BF800A7895E632
-:100A4000FC1213EC1225BF123169221230E67895A0
-:100A5000ECF6EC249DF8E620E2077C111225BF801D
-:100A60000A7895E6FC1214ED1225BF1231692212A4
-:100A700030E67895ECF6120F6978A9E62409F5823C
-:100A800018E63400F583E090FC3FF078A9E6240AEC
-:100A9000F58218E63400F583E090FC40F078A9E692
-:100AA0002403F58218E63400F583E0FC78A9E624F7
-:100AB00004F58218E63400F583E0F56278A9E624AF
-:100AC00002F58218E63400F583E0F5638C61E4EC0E
-:100AD000333354017895F66008E56230E103789588
-:100AE000067895E690FC41F078A7E62402F5821896
-:100AF000E63400F583E0FDA3E0540CFCED54E68CF5
-:100B000065F564E56130E503436501E56220E50EC6
-:100B1000E561547F7008E56120E703436502E56104
-:100B200030E303436510E56130E203436520E5618E
-:100B300054036003436540E56130E103436580E5AC
-:100B40006130E403436401E56130E603436408E592
-:100B50006220E40EE561547F7008E56120E70343FD
-:100B600064105365FB536479AD64E56590FC3ACD40
-:100B7000F0A3CDF0E56330E30DE5635430C4540FCA
-:100B800090FC3DF08005E490FC3DF0E5635403905B
-:100B9000FC3CF0E5635404C31390FC3EF090FC3C35
-:100BA000E0700E7D357EFC7F01740190000912011A
-:100BB0004278A9E62408F58218E63400F583E07C43
-:100BC00000FD78A9E62407F58218E63400F583E0F5
-:100BD0007F004CFEEF4D90FC38F0A3CEF0CEC20368
-:100BE0007D0A7C00122526123169221230E67895A2
-:100BF000ECF6789A76010876FC0876387897760CC9
-:100C0000789A1204651202147898CBF6CB08F67F16
-:100C100000EF24EA401FE4EF25E090352CFD93CD52
-:100C200004937899667003ED1866700678977600DD
-:100C300080030F80DC7896EFF6789A1204659000B6
-:100C40000212020E7898CBF6CB08F65404CB5486E9
-:100C50004B60047897760B7899E630E313789A1214
-:100C600004659000051201EC24FB50047897760D82
-:100C70007899E654C07D0064C04D70047897760B77
-:100C8000789A1204659000041201EC24FC50047858
-:100C900097760F789A1204659000061201EC24FDF5
-:100CA00050047897760E789A120465900009120124
-:100CB000EC24FD50047897760A7897E6702A7895A8
-:100CC000E6FC120F69789A12046578A7E6F978A60F
-:100CD000E6FA7B01740A780012033FC2037895E6B6
-:100CE000FC1211077897ECF67897E6FC1225BF12F4
-:100CF0003169221230E67895ECF6120F697895E6A4
-:100D000024FD75F00AA42414F582E434FCF583ACC8
-:100D100082AD8378A68683088682ECF9EDFA7B0A99
-:100D200078011203A7C2037895E6FC12110712316D
-:100D300069228D2B8C2AED60407527017529487535
-:100D400028FFE52A24FDFCE434FFFDEC7C0325E0CC
-:100D5000CD33CDDCF9FCE5292CF529E5283DF52836
-:100D6000AD29AE28AF277480900006120317748057
-:100D7000900002120317120FB7E52B14603B752782
-:100D8000017529087528FFE52A24FDFCE434FFFDE0
-:100D9000EC7C0325E0CD33CDDCF9FCE5292CF529ED
-:100DA000E5283DF528AD29AE28AF27E490000612CE
-:100DB0000317E4900002120317221230E67895EC34
-:100DC000F6EC249DF8E630E2097895E6FC1214ED85
-:100DD000D2007895E6FC120F697896760090FC397F
-:100DE000E030E704789676017896E6FD7895E6FCA3
-:100DF000120D2FC2033000077895E6FC1213EC7C2D
-:100E0000001225BF1231692278A9E62404F5821860
-:100E1000E63400F583E04401F078A9E62404F58285
-:100E200018E63400F583E030E00280ED78A9E6248E
-:100E30000BF58218E63400F583E054F8F078A9E663
-:100E40002402F58218E63400F583E04480F022C2E3
-:100E5000038C58120F6978A68683088682795D7A9A
-:100E6000357B0A78011203F5120E05AC587D02128B
-:100E70000D2FC203AC58121107228D538E528F5181
-:100E80008C50120F69754F0078A9E62405F5821879
-:100E9000E63400F583E020E41FE54F24F640190511
-:100EA0004FC2037C181232A990FF93E04401F0B2C4
-:100EB000B3AC50120F6980D078A9E62405F58218EA
-:100EC000E63400F583E020E405C2037C022278A921
-:100ED000E62405F58218E63400F583E0540F601629
-:100EE00078A9E62405F58218E63400F583E0540F6E
-:100EF000F0C2037C012278A88683088682E0AD5385
-:100F0000AE52AF5112030FC2037C00228D318C30E0
-:100F10001214EDE531600FE530B4030A7C011224B0
-:100F2000EE7C811224EEAC30120F69E531601A7844
-:100F3000AA8683088682E054E7F0A3A3A3A3E05423
-:100F4000E7F0AC307D02120D2F78A68683088682EA
-:100F500079677A357B0A78011203F5C203E53024FC
-:100F60009DF8C654FDF6AC30121107228C263003D2
-:100F70000512324880F87C0A12315BD203E5262440
-:100F8000FD78A3F6700778AA76FF0876E078A3E6E6
-:100F900075F010A4ADF0FC24A078A9F6ED34FF188C
-:100FA000F678A3E675F00AA42400FCE434FCFD788E
-:100FB000A6EDF608ECF61231F42278A9E62402F543
-:100FC0008218E63400F583E030E72278A9E62402AF
-:100FD000F58218E63400F583E0547FF078A9E62422
-:100FE00002F58218E63400F583E04480F02278AA06
-:100FF0008683088682E0547FF0AD83E5822404FC7A
-:10100000E43D8C82F583E0547FF078A9E6240BF56B
-:101010008218E63400F583E054F8F078ABE624015A
-:10102000F58218E63400F583E04403F078ABE6245B
-:1010300005F58218E63400F583E04403F078A9E66C
-:101040002405F58218E63400F583740FF02278AA9F
-:101050008683088682E0543FF0AD83E5822404FC59
-:10106000E43D8C82F583E0543FF078A3E624A4F8B5
-:10107000E6FC78ABE62401F58218E63400F583EC53
-:10108000F078A3E624A4F8E6FC78ABE62405F58224
-:1010900018E63400F583ECF078A9E6240BF5821805
-:1010A000E63400F583E054FB4402F52678A7E624F5
-:1010B00002F58218E63400F583E030E503432601AB
-:1010C00078A9E62405F58218E63400F583E030E0DF
-:1010D00003120FB7E526FC78A9E6240BF58218E683
-:1010E0003400F583ECF078A9E62405F58218E6349F
-:1010F00000F583740FF078AA8683088682E0448026
-:10110000F0A3A3A3A3E04480F0228C2A120F6978F5
-:10111000A7E62408F58218E63400F583E0FC78A9F8
-:10112000E6240AF58218E63400F583ECF078A7E6A9
-:101130002407F58218E63400F583E0FC78A9E6245C
-:1011400009F58218E63400F583ECF078A68683086A
-:101150008682E0FDA3E0FCEDFE78A9E62408F58296
-:1011600018E63400F583EEF0ECFE78A9E62407F5E6
-:101170008218E63400F583EEF08C298D28C3EC94B8
-:1011800005ED940C400575277C8033D3E529940147
-:10119000E5289403400575273C8023D3E5299481F5
-:1011A000E528940140057527188013D3E52994603C
-:1011B000E5289400400575270C8003752708AF27A4
-:1011C000E4EF547C4483FF8F27E527FC78ABE624CB
-:1011D00001F58218E63400F583ECF0E527FC78ABE6
-:1011E000E62405F58218E63400F583ECF0E527FCEB
-:1011F00078A3E624A4F8ECF678A9E62402F5821890
-:10120000E63400F583E0F52778A7E62402F5821896
-:10121000E63400F583A3E030E3175327C778A7E649
-:101220002405F58218E63400F583E09035589342A2
-:10123000275327FB78A7E62406F58218E63400F545
-:1012400083E060034327045327FC78A7E62404F5D2
-:101250008218E63400F583E04227432780E527FC27
-:1012600078A9E62402F58218E63400F583ECF078DC
-:10127000A9E62404F58218E63400F583E0F5277822
-:10128000A7E62402F58218E63400F583A3E030E1F6
-:10129000055327DF800343272078A7E62402F58241
-:1012A00018E63400F583E030E4055327EF8003436C
-:1012B000271078A7E62409F58218E63400F583E0C4
-:1012C000B40203432702E527FC78A9E62404F5824B
-:1012D00018E63400F583ECF078A9E62403F58218CB
-:1012E000E63400F583E0F52778A7E62409F58218AF
-:1012F000E63400F583E0700553277F8003432780A1
-:1013000078A7E62402F58218E63400F583A3E030DE
-:10131000E00543272080035327DF78A7E62402F562
-:101320008218E63400F583E030E30543274080036C
-:101330005327BF78A7E62402F58218E63400F58328
-:10134000E030E00543271080035327EF78A7E62419
-:1013500002F58218E63400F583A3E030E405432764
-:101360000880035327F778A7E62402F58218E634AD
-:1013700000F583A3E030E50543270480035327FBF2
-:1013800078A7E62402F58218E63400F583A3E0305E
-:10139000E60543270180035327FE78A7E62402F5DC
-:1013A0008218E63400F583A3E030E7054327028086
-:1013B000035327FDE527FC78A9E62403F58218E608
-:1013C0003400F583ECF0C2037C00228D278C26EDDF
-:1013D00054031460037C1022E527547C24FC400352
-:1013E0007C0B22E526249DF8C64402F67C00228C64
-:1013F00030120F69E530249DF8E620E24FAC307DD5
-:1014000002120D2FE53024FE4428FC78AA868308BA
-:101410008682ECF0AF83E5822404FEE43FFFEC8E8D
-:10142000828F83F07C038C2CE52CFC78ABE62401C6
-:10143000F58218E63400F583ECF0E52CFC78ABE699
-:101440002405F58218E63400F583ECF0752D01755E
-:101450002F48752EFFE53024FDFCE434FFFDEC7CC5
-:101460000325E0CD33CDDCF9FCE52F2CF52FE52E5F
-:101470003DF52E78ABE62404F58218E63400F583BA
-:10148000E054E7F52CAD2FAE2EAF2DE49000021204
-:101490000317E49000061203171201E630E5034338
-:1014A0002C10E52CFC78ABE62404F58218E6340019
-:1014B000F583ECF012104B78A9E62406F58218E6C5
-:1014C0003400F583E0C203FCE530249DF8C64404F3
-:1014D000F68C2CE530540FC454F07E00FFEEEF4440
-:1014E000047D00FFEC4EFCED4FFD121CA77C00229A
-:1014F0008C2F120F69120FEB78AA8683088682E080
-:101500005408F0A3A3A3A3E05408F0AC2F7D02126B
-:101510000D2FC203E52F249DF8C654FBF67C002254
-:101520001230E67896ECF6EC249DF8E630E10A7D80
-:10153000007C131225261231697896E6249DF8C6A0
-:101540004401F67896E6FC120F697896E624FD755C
-:10155000F00AA42414F582E434FCF58378A6E6FAB4
-:1015600008E6F97B0A78011203A778A68683088625
-:101570008279677A357B0A78011203F5120FB7C2B8
-:10158000037896E6FC1211077895ECF6EC600A7D7C
-:10159000007C081225261231697896E6FC120F6944
-:1015A00078A9E62404F58218E63400F583E04410B7
-:1015B00054DFFC78A9E62404F58218E63400F583AC
-:1015C000ECF07895ECF6C2037CC81232A97896E666
-:1015D000FC120F6978A9E62404F58218E63400F5B8
-:1015E00083E054EFF0C2037CC81232A97896E6FC7F
-:1015F000120F6978A9E62404F58218E63400F58311
-:10160000E04410F0C2037CC81232A97896E6FC12BE
-:101610000F6978A9E62404F58218E63400F583E022
-:101620004420F0C2037CF01232A97896E6FC120F37
-:101630006978A9E62405F58218E63400F583E030E0
-:10164000E415C2037896E644107F00FE7C07123151
-:10165000FB12316902171478A9E62404F58218E612
-:101660003400F583E054CFF0C2037CC81232A9786D
-:1016700096E6FC120F6978A9E62404F58218E63490
-:1016800000F583E04430F0C2037CF01232A9789672
-:10169000E6FC120F6978A9E62405F58218E6340005
-:1016A000F583E030E414C2037896E644107F00FE30
-:1016B0007C071231FB123169805D78A9E62404F5BC
-:1016C0008218E63400F583E054EFF078A9E62404AC
-:1016D000F58218E63400F583E054DFF07896E624CE
-:1016E000FD75F00AA42414F582E434FCF583AC8281
-:1016F000AD8378A68683088682ECF9EDFA7B0A78BA
-:10170000011203A7C2037896E6FC1211077D007C44
-:101710000B122526123169221230E6E490FC39F0D2
-:101720007D027C00122526123169221230E67C00EF
-:101730001225BF12316922743C90FBE0F0743E9098
-:10174000FBE0F0E490FC28F0228D358C34ECB40101
-:10175000028003D340028028B402028003D34008F1
-:10176000A835C625E0F68018B404028003D3400AE9
-:10177000A835C625E025E0F68006A835760080006D
-:10178000228C3C8D3BEDFEECFD7F01756606756796
-:101790000090FC2912046E1201E6B480028006D388
-:1017A000500302184790FC29120480900003120194
-:1017B000EC54F0B430028003D3405F90FC29120453
-:1017C0008090000812020EFAFDEBFE7F0190FC2CC7
-:1017D00012046EEECD903571FCE493FF740193FE1C
-:1017E000F9EFFA7B01EAFFE9FEECC39EED9F40258D
-:1017F000903573E493FD740193FCEDFEECFD7F01E5
-:10180000EECDFC90FC2EE0D39C90FC2DE09D50058D
-:101810007566808033121965802EB460028003D310
-:10182000400BAC3CAD3B1207778C66801BB41003B9
-:10183000B34010C3B42003B34009C3B440028003D3
-:10184000D3400075668180008075B481028003D327
-:10185000406B90FC291204809000031201EC54F0BC
-:10186000B430028003D3401D90FC29120480900004
-:101870000812020EFAFDEBFE7F0190FC2F12046E9F
-:101880001218CF8036B460028003D34013753A67D4
-:10189000E4F539F538AC3CAD3B1205D38C66801BC2
-:1018A000B41003B34010C3B42003B34009C3B44021
-:1018B000028003D34000756681800080028000E5CD
-:1018C00066FC90FC29120480EC900002120317AC15
-:1018D000672290FC291204809000041201EC60043D
-:1018E00074018001E4A2E0920190FC29120480EDD1
-:1018F0002403FD50010E90FC2C12046E90FC291262
-:1019000004809000051201ECF5679000041201ECD0
-:10191000540FFC7D67121746E56770047566082250
-:10192000756600788476007884E6C39567503890B1
-:10193000FC2F1204801201E6FC90FC2C120480ECB7
-:1019400012030F30010E90FC31E004F090FC307077
-:1019500003E004F078840690FC2EE004F090FC2D67
-:101960007003E004F080C02290FC2AE0FDA3E0FCBC
-:10197000EDFEECFD7F01ED240AFD50010E90FC32DE
-:1019800012046E90FC291204809000041201EC54A1
-:101990000FB401028003D3401790FC321204800D73
-:1019A000ED70010E90FC2F12046E78887601804E47
-:1019B000B402028003D3401990FC32120480ED245B
-:1019C00002FD50010E90FC2F12046E788876028082
-:1019D0002DB404028003D3401990FC32120480ED30
-:1019E0002404FD50010E90FC2F12046E78887604BA
-:1019F000800CB400028003D340007566082290FC7E
-:101A0000291204809000051201ECF56778857600B4
-:101A10007885E6C395674003021ACD78867600780C
-:101A200086E6C3788896507690FC2C1204801201CA
-:101A3000E6FC90FC321204891201E0F45CFC120115
-:101A4000E0F890FC2F120480E8C0E01201E6C8D054
-:101A5000E0C8584CFC90FC2C120480EC12030F7868
-:101A600087ECF690FC31E004F090FC307003E00469
-:101A7000F009E970010A90FC3212047790FC2912F7
-:101A800004809000041201EC30E40E90FC2EE0047F
-:101A9000F090FC2D7003E004F07886068081788851
-:101AA000E6FDE4FEFFEECDFC90FC31E02CF090FC76
-:101AB00030E03DF07888E6FDE4FEFFEECDFC90FCE2
-:101AC00034E02CF090FC33E03DF0788506021A0DEE
-:101AD00075660022E53D053D047002B2B022C0E00B
-:101AE000C0F0C082C083C0D0E8C0E0E9C0E0EAC076
-:101AF000E0EBC0E0ECC0E0EDC0E0EEC0E0EFC0E045
-:101B000090FF92E01201B71B29301B29321B383895
-:101B10001B4A3A1B5C3E1B74441B68461B80501BCF
-:101B2000C2521BA1541BE35600001C0490FF92E01C
-:101B30007F00FE7C011231FB021C14E4FF04FE7CDA
-:101B4000031231FB742090FFFEF0021C14E4FF042A
-:101B5000FE7C021231FB744090FFFEF0021C14E484
-:101B6000FF04FE7C041231FB021C14E4FF04FE7C23
-:101B7000051231FB021C14E4FF04FE7C061231FB4B
-:101B8000021C1490FFA5E07D0090FBF8CDF0A3CDE2
-:101B9000F090FBF9E0FCF58390FBF8E04433FD1294
-:101BA0001CA7807390FFB5E07D0090FBFACDF0A3F9
-:101BB000CDF090FBFBE0FCF58390FBFAE04443FDA5
-:101BC000121CA7805290FFA6E07D0090FBFCCDF098
-:101BD000A3CDF090FBFDE0FCF58390FBFCE04434EA
-:101BE000FD121CA7803190FFB6E07D0090FBFECD7A
-:101BF000F0A3CDF090FBFFE0FCF58390FBFEE0440A
-:101C000044FD121CA7801090FF92E07D00FCED4483
-:101C1000AAFD121CA78000E490FF92F0D0E0FFD054
-:101C2000E0FED0E0FDD0E0FCD0E0FBD0E0FAD0E078
-:101C3000F9D0E0F8D0D0D083D082D0F0D0E0320517
-:101C400081058105810581A881181818EDF608EC39
-:101C5000F690FF5AE020E70280F790FF59E07D0000
-:101C6000A88118CDF6CD08F67D03A881E618FCE61C
-:101C7000CC25E0CC33CCDDF9CCF6CC08F6A8811825
-:101C8000E644F8F6A881181818E6FD08E6FCA881D5
-:101C9000188683088682EDF0A3ECF0740290FF5A58
-:101CA000F0158115811581158122E5812405F581C5
-:101CB000E4A88118F6A88118181818EDF608ECF6B3
-:101CC00090FBF5E024F85003021DC8E4A881181821
-:101CD000F6A88118E6FEA88118181818E6FD08E68F
-:101CE000FC7F00EF24F8404DE4EF25E0247DF582F1
-:101CF000E434FCF583E0FBA3E06C7003FAEB6D7059
-:101D0000097401A8811818F6802BE4EF25E0247DE2
-:101D1000F582E434FCF5837A00E054F0CCF8CCCDC5
-:101D2000F9CDFB7800E954F0F9EA687002EB6970CC
-:101D3000010E0F80AEA88118EEF6A88118181818A9
-:101D4000EDF608ECF6A881EFF6A8811818E6707990
-:101D5000A88118E624F74071A88118181818E654CD
-:101D60000FA881F664046017A881E664036010A8D8
-:101D70008118181818E6FD08E6FC121C3C804A7C05
-:101D80000A12315BA88118181818E6FD08E6FC90C5
-:101D9000FBF4E025E0247DF582E434FCF583EDF0EE
-:101DA000A3ECF090FBF4E0FFE4EF045407FF90FB9A
-:101DB000F4F090FBF5E004F01231F490FBF6E070E3
-:101DC00008E4FEFF7C0F1231FB802790FBF7E00454
-:101DD000F0543F701D90FBF7E044FE7D00FC90FB4B
-:101DE000F4E025E0247DF582E434FCF583EDF0A3F6
-:101DF000ECF0E58124FBF58122788B7600788C76F7
-:101E000000740190FBF6F01230E690FBF5E06057AD
-:101E10007C0A12315B90FBF3E025E0247DF582E43F
-:101E200034FCF583E0FDA3E0FC90FBF3E025E02427
-:101E30007DF582E434FCF583E4F0A3F090FBF3E05D
-:101E4000FFE4EF045407FF90FBF3F090FBF5E01480
-:101E5000F07889EDF608ECF61231F47889E6FD08A1
-:101E6000E6FC1208DA80A312324890FF93E04401A6
-:101E7000F0B2B3788B06B60011788B7600788CE6DA
-:101E8000F40404A2E092B4788CF6021E07E490FBFE
-:101E9000F6F090FBF5E07D00FCED44CFFD121C3C1C
-:101EA000123169221230E6E5706449456F60159081
-:101EB000FF83E0540F7D00D39570ED956F500512B0
-:101EC0002F2F8003122FFF123169221230E6E570A6
-:101ED0006449456F6005123039800E90FF80E04400
-:101EE00008F090FF83E0547FF0123169221230E64F
-:101EF0008C54EC54F0B41015756A357569FC75682E
-:101F000001E56A2403F56AE5693400F569E4F557EB
-:101F1000F556E556C394015027E554540FFCAD6ABD
-:101F2000AE69AF68120E778C55EC60028012056ABC
-:101F3000E56A700205690557E5577002055680D2BB
-:101F4000E554540F249DF8C654FEF6E554540F7F13
-:101F500000FE7C121231FBE5551470097D007C09EE
-:101F60001225268007AD577C0012252612316922E2
-:101F70001230E690FFFCE04402F090FF00E030E712
-:101F80001390FF83E04480F0436D8090FFFCE044B9
-:101F900001F0801190FF82E04408F0536D7F90FFC4
-:101FA000FCE054FEF090FF81E04480F01225D990CF
-:101FB000FFFEE04405F090FFFCE054FDF0123169B3
-:101FC000221230E67C011232A978ADE64402F674A2
-:101FD000FEFC04FD121CA790FF5AE030E70280F7D8
-:101FE000E4F54E754D10AC4EAD4DE54E154E7002FC
-:101FF000154DEC4D600280EE4387011231692212CB
-:1020000030E67C0212317578ADE654FDF612316986
-:10201000221230E678ADE630E02C78ADE630E126ED
-:1020200078ADE6FCF58318E644F0FD121C3C90FF09
-:10203000FCE04420F07C021232A978ADE654FDF6B3
-:10204000741A90FFFEF078ADE6FCF58318E644F1D3
-:10205000FD121C3C12316922756D0090FFFFE0609B
-:1020600003436D01756E00E4F56CF56BE4F56F7577
-:102070007049748490FF82F0748490FF80F07480C3
-:1020800090FF58F0748090FF5AF0AD46AF457E0047
-:10209000EE24FE5003022124E4EE75F007A4247F11
-:1020A000F582E434F8F583E0FFE4EF5480FDE4EFDB
-:1020B000540F14FFED6038E4EF75F008A42448F5E0
-:1020C00082E434FFF5837490F0E4EF75F008A42403
-:1020D0004AF582E434FFF5837480F0E4EF75F0088C
-:1020E000A4244EF582E434FFF5837480F08034E458
-:1020F000EF75F008A42408F582E434FFF5837490AA
-:10210000F0E4EF75F008A4240AF582E434FFF583C7
-:10211000E4F0E4EF75F008A4240EF582E434FFF552
-:1021200083E4F00E02208D8D468E448F45747F909F
-:10213000FFFDF0749090FFFCF0228C58EC24F650D8
-:1021400006E5582437FC22E5582430FC22122523CA
-:10215000EC700302225E755C03AE5B7F00E55C15EC
-:102160005C6480247F5035EF2400F582E434FBF575
-:1021700083E0FE24FE501EEF7D00FCE4FB7474C37C
-:102180009CFAEB9DFBEE7D00FCEAC39CED6480CBEA
-:1021900064809B50028005EF2EFF80C18E5B8F5ABA
-:1021A000E55C6480247F500302225EE55A248E5051
-:1021B0000302225E855A5D755B00AE5AAF5B9035B7
-:1021C0009CE493F55CE55C155C6480247F5018EE1C
-:1021D0002400F582E434FBF583E0FCEF90359C931A
-:1021E0006C70040E0F80DE8E5A8F5BE55C64802479
-:1021F0007F406E755E017560E8755FFFE55D2402E6
-:10220000F55A755C07E55C334057AD60AE5FAF5E75
-:10221000E55CF5823395E0F5831201ECC4540FFCC4
-:10222000122137E55A2400F582E434FBF583ECF003
-:10223000055A055AAD60AE5FAF5EE55CF582339539
-:10224000E0F5831201EC540FFC122137E55A24000B
-:10225000F582E434FBF583ECF0055A055A155C80F1
-:10226000A4740290F851F090F86B79757A357B2759
-:1022700078011203F5756A357569FC756801E4909B
-:10228000FF83F0748090FF81F0755902E55975F075
-:1022900007A4247FF582E434F8F583E0788FF6FC18
-:1022A000540F14FC788FECF6E55975F007A42481DF
-:1022B000F582E434F8F583E0789276FD0876E8FC60
-:1022C000788FE675F008A42448F582E434FFF5839E
-:1022D000E4F0788FE675F008A4244FF582E434FF2B
-:1022E000F583ECF07892E6FF08E67E03CFC313CFC8
-:1022F00013DEF9FE788FE675F008A42449F582E430
-:1023000034FFF583EEF0788FE675F008A4244AF5E3
-:1023100082E434FFF5837480F07890ECF67D0078E9
-:1023200093E62CF618E63DF67892E6FD08E67C0387
-:10233000CDC313CD13DCF9FC788FE675F008A42427
-:102340004DF582E434FFF583ECF0788FE675F00804
-:10235000A4244EF582E434FFF583E4F07892E6FDA0
-:1023600008E6FC788FE6FF7E00EE24FE5003022490
-:10237000DDE4EE75F007A4247FF582E434F8F583FC
-:10238000E0FFE4EF5480FAE4EF540F14FFE4EE753D
-:10239000F007A42481F582E434F8F583E07890F620
-:1023A000E4EE1313548024F0F8E434FDF9E8FCE97A
-:1023B000FD8A5AEA700302244AE4EF75F008A42467
-:1023C00048F582E434FFF583E4F07890E6FAE4EF30
-:1023D00075F008A4244FF582E434FFF583EAF0EDAC
-:1023E000FBEC7A03CBC313CB13DAF9FAE4EF75F005
-:1023F00008A42449F582E434FFF583EAF07890E6F6
-:102400007B00FAEC2AFCED3BFDFBEC7A03CBC3131B
-:10241000CB13DAF9FAE4EF75F008A4244DF582E461
-:1024200034FFF583EAF0E4EF75F008A4244AF5825E
-:10243000E434FFF5837480F0E4EF75F008A4244ED3
-:10244000F582E434FFF5837480F00224D9E4EF755B
-:10245000F008A42408F582E434FFF583E4F07890D2
-:10246000E6FAE4EF75F008A4240FF582E434FFF5F2
-:1024700083EAF0EDFBEC7A03CBC313CB13DAF9FA62
-:10248000E4EF75F008A42409F582E434FFF583EA4B
-:10249000F07890E67B00FAEC2AFCED3BFDFBEC7A51
-:1024A00003CBC313CB13DAF9FAE4EF75F008A424D5
-:1024B0000DF582E434FFF583EAF0E4EF75F008A44B
-:1024C000240AF582E434FFF583E4F0E4EF75F008C4
-:1024D000A4240EF582E434FFF583E4F00E022366B3
-:1024E0008E597892EDF608ECF6788FEFF6122055BB
-:1024F000228C26EC30E718E526540F1475F008A45A
-:102500002448F582E434FFF583E054DFF08016E5DB
-:1025100026540F1475F008A42408F582E434FFF55E
-:1025200083E054DFF0227C0022EC90FC37F08C2416
-:10253000ED2403F5257D00D39572ED95714003855B
-:102540007225E52524B75009752503740290FC37E0
-:10255000F0AC2512302422E4F56CF56B12255D22D7
-:1025600090FC35E06573600E740490FC37F0E4F580
-:102570006B756C0380467D73E4FEFF79357AFC7BD6
-:10258000017405780012033FE56C2403F56CE56BDC
-:102590003400F56BE56CD39572E56B95714006855B
-:1025A000726C85716BD3E56C9448E56B9400400CBC
-:1025B000740290FC37F0E4F56B756C03AC6C123070
-:1025C0002422EC90FC37F0E4F56CF56B8C32EC6077
-:1025D0000512301580057C001230242290FF93E014
-:1025E0004401F0B2B390FF04E0F54A90FF06E0FD2D
-:1025F000A3E0ED7D00FC7D00FC90FF06E0FFA3E082
-:102600007E00FFE4FEEC4EFCED4FFDC3EC9448ED84
-:102610009400502290FF06E0FDA3E0ED7D00FC7DDC
-:1026200000FC90FF06E0FFA3E07E00FFE4FEEC4E1E
-:10263000FCED4FFD8004E4FD7C488C728D7190FFB1
-:1026400002E0FDA3E0ED7D00FC7D00FC90FF02E0D8
-:10265000FFA3E07E00FFE4FEEC4EF54CED4FF54BA2
-:10266000756A357569FC7568017D357EFC7F017979
-:1026700073E4FAFB7405780012033F754900E549DD
-:1026800024FE4019AD6AAE69AF68E412030F054934
-:102690000DED70010E8D6A8E698F6880E1756A3567
-:1026A0007569FC75680190FF00E05460B400028019
-:1026B00006D35003022C6DE54A540FF549E54A5400
-:1026C00080A2E0920290FF01E0120181000B2C68D1
-:1026D00026E528032C68290F2C6829F22A262B8D41
-:1026E0002B902BD02C112C3FE56D30E70EE54C459F
-:1026F0004B7008E572640245716003022C6A90FF1A
-:1027000000E0541FB400028003D34029E54A60036F
-:10271000022800AD6AAE69AF68740112030F78AD8C
-:10272000E630E00BAD6AAE69AF68740212030F7C4D
-:102730000212302422B401028003D3401BE56D2035
-:10274000E107E54A6003022800E54A24FE5003023F
-:1027500028007C0212302422B402028006D35003E7
-:102760000227FEE56D20E10DE54A6009E54A648037
-:102770006003022800AC4A1230AB4003022800E597
-:1027800049702530021190FF80E05408AD6AAE69AF
-:10279000AF6812030F800F90FF82E05408AD6AAE5D
-:1027A00069AF6812030F803D154930021DE5497578
-:1027B000F008A42448F582E434FFF583E05408AD22
-:1027C0006AAE69AF6812030F801BE54975F008A473
-:1027D0002408F582E434FFF583E05408AD6AAE695D
-:1027E000AF6812030FAD6AAE69AF681201E6600B05
-:1027F000AD6AAE69AF68740112030F7C0212302417
-:10280000228000022C6AE56D20E706E572457160C2
-:1028100003022C6A90FF00E0541FB400028003D32F
-:10282000401AE54C14454B7004E54A600302290C3C
-:1028300078ADE654FEF67C0012302422B40102800A
-:1028400003D3402AE56D20E108E56D20E00302296D
-:102850000CE56D30E004E54A700BE56D30E109E50B
-:102860004A24FE500302290C7C0012302422B402B8
-:10287000028006D3500302290AE54C454B6003024F
-:10288000290CAC4A1230AB400302290CE56D20E163
-:1028900007E56D20E0028077E56D30E006E54960F0
-:1028A00002806CE549700F90FF82E054F7F090FFD2
-:1028B00080E054F7F022E549B401028003D34009D7
-:1028C0007D017C03120F098011B402028003D34002
-:1028D000097D017C04120F0980001549300215E5BD
-:1028E0004975F008A42448F582E434FFF583E054E8
-:1028F000F7F08013E54975F008A42408F582E43464
-:10290000FFF583E054F7F07C0012302422800002AF
-:102910002C6AE56D20E706E57245716003022C6ABA
-:1029200090FF00E0541FB400028003D3401AE54C2E
-:1029300014454B7004E54A60030229EF78ADE64484
-:1029400001F67C0012302422B401028003D3402916
-:10295000E56D20E108E56D20E0030229EFE56D302B
-:10296000E004E549700BE56D30E108E54924FE50CF
-:1029700002807F7C0012302422B402028003D34004
-:102980006FE54C454B60028069AC4A1230AB4002A7
-:102990008060E56D20E107E56D20E0028054E549A7
-:1029A000701430020990FF80E04408F0800790FF27
-:1029B00082E04408F022E56D30E13315493002151C
-:1029C000E54975F008A42448F582E434FFF583E076
-:1029D0004408F08013E54975F008A42408F582E462
-:1029E00034FFF583E04408F07C001230242280029A
-:1029F0008000022C6AE56D20E712E5724571700CCB
-:102A0000E54A700890FF00E0541F6003022C6AE55D
-:102A10004C90FFFFF090FFFFE06005436D018003E5
-:102A2000536DFE7C0012302422E56D30E70EE57216
-:102A30004571600890FF00E0541F6003022C6AADEE
-:102A40004BE54CED7D00FC7D00FCBD0002800302E7
-:102A50002B88B401028003D34032E54A7005E54C6F
-:102A6000FC6003022B8A756A407569F8756801D3AA
-:102A7000E5729412E57194004006E4FD7C12800436
-:102A8000AC72AD718C708D6F12303922B40202803D
-:102A900003D34059E54A6003022B8AE54CFC7027BA
-:102AA000756A527569F8756801D3E5729419E57114
-:102AB00094004006E4FD7C198004AC72AD718C700A
-:102AC0008D6F1230398025756A6B7569F8756801EC
-:102AD000D3E5729427E57194004006E4FD7C2780DD
-:102AE00004AC72AD718C708D6F12303922B4030258
-:102AF0008006D35003022B88E54CF549700F90FFF8
-:102B000004E0FDA3E04D6003022B8A801890FB02D5
-:102B1000E0FDA3E0FC90FF05E06C700790FF04E08F
-:102B20006D60028068E4F570F56F7F00E54914C5BB
-:102B300049600FEF2400F582E434FBF583E02FFFBA
-:102B400080EA8F4AE54A2400F582E434FBF583E00D
-:102B50007D00D39572ED95714006AC72AD71800F1A
-:102B6000E54A2400F582E434FBF583E07D00FC8C2B
-:102B7000708D6FE54A2400FCE434FBFDFEECFD7F24
-:102B8000018D6A8E698F68123039228000022C6AAA
-:102B9000022C6AE56D30E719E5721445717012E593
-:102BA0004A700EE54C454B700890FF00E0541F60E2
-:102BB00003022C6AE56D20E008E56D20E103022C9C
-:102BC0006A756A6EE4F569F568E4F56F04F57012EC
-:102BD000303922E56D20E712E5724571700CE54A47
-:102BE000700890FF00E0541F6003022C6AE56D201E
-:102BF000E007E56D20E1028074854C6EE56E70089B
-:102C0000436D01536DFD8006536DFE436D027C00E4
-:102C100012302422E56D30E71AE572144571701305
-:102C2000E54A700FE54C454B700990FF00E0541FDA
-:102C30001460028038E56D20E10280317C011230A1
-:102C40002422E56D20E715E5724571700FE54C45CE
-:102C50004B700990FF00E0541F146002800FE56D77
-:102C600020E10280087C00123024228000022F2BF9
-:102C7000B440028006D35003022F2190FF01E09060
-:102C8000FC35F0E54A90FC36F0E490FC37F0E56A5C
-:102C90002403F56AE5693400F569AD4BE54C856AB6
-:102CA00082856983CDF0A3CDF090FF01E01201B7DA
-:102CB0002CD8012CFE022D28032D52042DA0052D09
-:102CC000DD062E03072E29082E55092E7B0B2EA17B
-:102CD0000C2EB0802EB08100002F0EE56D20E7068F
-:102CE0007C051225BF227D247E357F0279387AFC4F
-:102CF0007B017408780012033F7D087C00122526B2
-:102D000022E56D20E7067C051225BF22E54AB403C3
-:102D1000004010B40500500BE54A7F00FE7C101205
-:102D200031FB227D007C0712252622E56D20E70677
-:102D30007C051225BF22E54AB403004010B405000B
-:102D4000500BE54A7F00FE7C111231FB227D007C96
-:102D50000712252622E56D20E7067C051225BF22F5
-:102D6000E54AB405028003D3400AE4FF04FE7C0A6E
-:102D70001231FB22B401028003D3400AE4FF04FEB7
-:102D80007C081231FB22B403004010B40500500B44
-:102D9000E54A7F00FE7C131231FB227D007C071286
-:102DA000252622E56D20E734D3E5729448E5719439
-:102DB000005006E572457170067C021225BF22E5BF
-:102DC0004AB40103B3400BC3B403004009B4060086
-:102DD00050041230D1227C071225BF2212255D2219
-:102DE000E56D20E71DE54AB403004010B40500502E
-:102DF0000BE54A7F00FE7C161231FB227C07122570
-:102E0000BF2212255D22E56D20E71DE54AB40300CF
-:102E10004010B40500500BE54A7F00FE7C191231CA
-:102E2000FB227C071225BF2212255D22E56D20E7DB
-:102E300023748190FF93F0E54AB403004010B40579
-:102E400000500BE54A7F00FE7C171231FB227C0705
-:102E50001225BF2212255D22E56D20E71DE54AB44B
-:102E600003004010B40500500BE54A7F00FE7C18BB
-:102E70001231FB227C071225BF2212255D22E56D4F
-:102E800020E71DE54AB403004010B40500500BE5EF
-:102E90004A7F00FE7C151231FB227C071225BF22DF
-:102EA00012255D22E56D20E7067C071225BF221260
-:102EB000255D22E56D30E72090FF00E0541F701083
-:102EC00090FF01E0B48005122554800312255D2295
-:102ED0007D007C051225262290FF00E0541F60062D
-:102EE0007C051225BF22D3E5729448E57194005009
-:102EF0000BC3E5729407E571940050067C0312251C
-:102F0000BF22E54AB405041230D1227C071225BF46
-:102F100022E56D30E7087D007C05122526227C0520
-:102F20001225BF22B420028003D340008000122F5C
-:102F3000FF2275430090FF83E0540FD39543402454
-:102F4000E54324F0F582E434FEF583E0AD6AAE6932
-:102F5000AF6812030F05430DED70010E8D6A8E6987
-:102F60008F6880D1E5437D00FCC3E5709CF570E57A
-:102F70006F9DF56FE570456F6006E490FF83F0226A
-:102F800090FF82E04408F0E4F56F75704990FC35DD
-:102F9000E0B405028003D3404090FC36E0F543B432
-:102FA00005028003D3400AE4FF04FE7C0B1231FBD0
-:102FB00022B401028003D3400AE4FF04FE7C09121C
-:102FC00031FB22B403004010B40500500BE5437FF1
-:102FD00000FE7C141231FB2222B480004023B48214
-:102FE00000501E7C357DFC12177E7D008C6C8D6B35
-:102FF00090FC37E06005122FFF80057C0012302422
-:10300000222290FF83E0547FF090FF82E04408F09A
-:1030100090FF80E04408F02290FF82E04408F090A6
-:10302000FF80E04408F0228C237D008C708D6F754A
-:103030006A357569FC7568011230392290FF83E0AA
-:10304000547FF0E5706449456F700122C3E57094C8
-:1030500008E56F94004015752108E5217D00FCC34B
-:10306000E5709CF570E56F9DF56F8009857021E432
-:10307000F56F757049752200E522C395215026AD84
-:103080006AAE69AF681201E6FCE52224F8F582E435
-:1030900034FEF583ECF005220DED70010E8D6A8E85
-:1030A000698F6880D3E521547F90FF81F0228C489E
-:1030B0007F00EF24FD4019E4EF75F007A4247FF5AD
-:1030C00082E434F8F583E065487002D3220F80E291
-:1030D0008F47C32285727085716F90FF82E054F72D
-:1030E000F090FF83E0547FF022C000C001C002C016
-:1030F00006C007E5782408F8860653067F7CFF1291
-:10310000315B7C007D00E57B6046FF90FD95E054DF
-:103110007F6E700FC083C082A3E0FDA3E0FCA31507
-:103120007B8007A3A3A3DFE68026DF06D082D083BF
-:10313000801EE0F8A3E0F9A3E0FAD082D083E8F0A3
-:10314000A3E9F0A3EAF0A3C083C082A3A3A380DA1B
-:103150001231F4D007D006D002D001D0002285A8C9
-:103160007A75A888EC70027C3F8C7922E578240877
-:10317000F8760012324880FBC000C001C002C006D1
-:10318000C007AE047CFF12315BE57B6042FF90FD1F
-:1031900095E0547F6E700BC083C082A3A3A3157B00
-:1031A0008007A3A3A3DFEA8026DF06D082D0838036
-:1031B000D8E0F8A3E0F9A3E0FAD082D083E8F0A346
-:1031C000E9F0A3EAF0A3C083C082A3A3A380DA78C6
-:1031D00008087918097C01E6547F6E70067600773E
-:1031E00000800608090CBC08EE1231F4D007D006A6
-:1031F000D002D001D00022757900857AA822C0F0D3
-:10320000C082C083C3E57B24E8500512324880F4B5
-:10321000EC6031903523E493C39C4028C0047CFFCC
-:1032200012315BD004430480E57B75F003A4249540
-:10323000F582E434FDF583ECF0EFA3F0EEA3F005A6
-:103240007B1231F4D083D082D0F022C0047C20D213
-:103250008CD28DD504FDD0042275A8007588007528
-:10326000B80075F00075D000E4F8900000F608B8DA
-:1032700000FB020000C3ED940250047D037CE8ECE7
-:10328000F4FCEDF4FD0CBC00010D8C7F8D7E22C39F
-:10329000EC94BCED940250047D077CD0ECF4FCED82
-:1032A000F4FD0CBC00010D8C7D8D7C22EC700122A4
-:1032B000C000E5782418F8A604E5782408F8C65478
-:1032C0007FF6E630E703D0002212324880F4C28C49
-:1032D000857C8C857D8AD28CC0E0C0D0C0F0C08255
-:1032E000C083C000C001C002C003C004C005C00646
-:1032F000C007121AD1E5782408F8E66024E578249E
-:1033000010F8A681E57875F021A4248DF582E434C7
-:10331000FCF58378AEE58104C398F9E6F008A3D9FB
-:10332000FA74082578F8057808E65480700CE5787A
-:10333000B407F3780875780080EFE5782410F886F4
-:1033400081E57875F021A4248DF582E434FCF583C1
-:1033500078AEE58104C398F9E0F608A3D9FAD0075E
-:10336000D006D005D004D003D002D001D000D08345
-:10337000D082D0F0D0D0D0E032C0E0C0D0C000C009
-:1033800001C002C28E857E8D857F8BD28E781979A1
-:10339000097A07E77004A600800BE6600816E6705D
-:1033A00004E74480F70809DAEAE579601314F5794F
-:1033B000700EE5782408F876001231F4D28CD28DA4
-:1033C000D002D001D000D0D0D0E0327581AD742AC7
-:1033D00090FF93F0757F30757EF8757D60757CF099
-:1033E00012053612347C12173490FF93E04401F03A
-:1033F000B2B31234A612325680DA22C0007C01EC3D
-:103400002408F8E660090CBC08F512324880EED0BA
-:103410000022C0F0C082C083C000C006C007ED24F7
-:1034200010F876BCED75F021A4248DF582E434FC0F
-:10343000F583C082C083A3A3E4780DF0A3D8FCEC8D
-:10344000547F75F002A424EFF582E5F03434F5835F
-:10345000E493FE740193F5828E83E493FE740193EA
-:10346000FFD083D082EFF0A3EEF0ED2408F8EC4417
-:1034700080F6D007D006D000D083D082D0F022755D
-:103480007800757B007A087918780876007700084C
-:1034900009DAF8E478087480447FF674014410F582
-:1034A0008975B808D2ABD2A9227581ADD28ED28CE3
-:1034B000D2AFE57B6032FF90FD95E05480602478C8
-:1034C000087908E0547FFA7B00E6547FB502027B5E
-:1034D000FF08D9F5EB700CEAF01233F8AD04AC023A
-:1034E00012340FA3A3A3DFD212324880C57C017D22
-:1034F000002204F504E904ED04E104DD04D904E547
-:1035000004F1049D04A104CD04D104990499049903
-:1035100004D504B504AD04B104A904C104BD04B9C3
-:1035200004C504C904A5190103002200480200488B
-:103530000E301420C81AD0180A0C05060203010226
-:103540000001CE0181010000C00080006000300059
-:1035500018001000080004000200010008183828B4
-:103560000C05100A0200000000000301100A02000E
-:1035700000000000FBE0FBF209022700010200A0AE
-:10358000320904000003FF0000000705810240002B
-:103590000007050102400000070583030200012225
-:1035A0000354005500530042003300340031003012
-:1035B000002000200020002000200020002000200B
-:0535C000000000000006
-:00000001FF
diff --git a/firmware/ti_5052.fw.ihex b/firmware/ti_5052.fw.ihex
deleted file mode 100644
index b529e07cd6ec..000000000000
--- a/firmware/ti_5052.fw.ihex
+++ /dev/null
@@ -1,862 +0,0 @@
-:10000000C1350002001E021B32FFFFFFFFFF02325C
-:100010006AFFFFFFFFFFFFFFFFFFFFFFFFFF02334E
-:10002000157581C890FEF08583A012347DEC4D607B
-:100030006A78A58003760018B896FA7879800376F6
-:100040000018B85FFA78208003760018B820FA907C
-:10005000FEE5AE83AF8290FD001200A16005E4F0E2
-:10006000A380F690FEF0A88290FEF0A982E8C399E2
-:10007000500576000880F69000FF1200AA90010358
-:100080001200AA9001071200AA90010B1200C8905A
-:1000900001111200C89001171200C875D000123368
-:1000A0006702011DEF65827003EE658322E493F819
-:1000B000740193F9740293FE740393F5828E83E8BE
-:1000C00069700122E493F6A30880F4E493FC7401C0
-:1000D00093FD740293FE740393FF740493F8740504
-:1000E00093F58288831200A1700122E493A3A88370
-:1000F000A9828C838D82F0A3AC83AD8288838982B0
-:1001000080E3212104927A7A0492A6A80492FEF058
-:1001100004940494FBFB04990494FBFB04F904F994
-:1001200080FED0F030F00920F303F68010F7800D48
-:1001300030F10920F303F28004F38001F020F4048D
-:10014000FCD0E0CC22CCC0E012015A02014BBC0032
-:1001500005D0F0ACF022C313DCFC020121BF000982
-:10016000ED258275F001F8E622BF010FED2582F53D
-:1001700082EE3583F58375F004E022ED258275F07B
-:1001800002F8E222D083D082F5F0C3E493A3C5F055
-:1001900095F0C0E0C3D0F0E493A395F04012A3A380
-:1001A000C3E5F033500205832582F58250020583B2
-:1001B000740193C0E0E493C0E022D083D082F5F0D4
-:1001C000E49370097401937004A3A3800C740293E8
-:1001D00065F06005A3A3A380E7740193C0E0E493F6
-:1001E000C0E02212025B0201F21202AF0201F2121F
-:1001F00002D30201F230E00720E302E622E72230D8
-:10020000E10720E302E222E32230E202E022E4936B
-:10021000221202D302021A1202AF02021AABF01229
-:100220000224CBC5F0CB2230E01020E306E6F5F047
-:1002300008E622E7F5F009E7192230E11020E3068D
-:10024000E2F5F008E222E3F5F009E3192230E206D4
-:10025000E0F5F0A3E022E493F5F074019322BB00F3
-:1002600003740922BB010789828A83740422BB02BA
-:100270000789828A83741022740A2202027BBB00DF
-:1002800007E92582F8740122BB010DE92582F58278
-:10029000EA3583F583740422BB020DE92582F582D9
-:1002A000EA3583F583741022E92582F8740222026C
-:1002B00002AFBF0005EDF8740122BF01078D828EE9
-:1002C00083740422BF02078D828E83741022EDF89E
-:1002D0007402220202D3BF0007ED2582F8740122C6
-:1002E000BF010DED2582F582EE3583F5837404227E
-:1002F000BF020DED2582F582EE3583F58374102261
-:10030000ED2582F8740222020307C0E012025B02AC
-:10031000031FC0E01202AF02031FC0E01202D302AB
-:10032000031F30E00B20E304D0E0F622D0E0F722F8
-:1003300030E10B20E304D0E0F222D0E0F322D0E061
-:10034000F022C9CDC9CACECACBCFCB120352EDF928
-:10035000EEFAEFFB22BB002FBF000AFAEDF8E7F63A
-:100360000809DAFA22BF01128D828E83F802036F28
-:1003700009A3E7F0D8FA2202037AFAEDF8E7F208C7
-:1003800009DAFA22020384BB014DBF001489828A74
-:1003900083F9EDF802039608A3E0F6D9FA220203E6
-:1003A000A7BF01228D828E83FB08C9C582C9CAC539
-:1003B00083CAE0A3C9C582C9CAC583CAF0A3DBEA60
-:1003C000D8E8220203CA8D828E83F9EDF8E0F208A4
-:1003D000A3D9FA220203D4BB024DBF001289828A3C
-:1003E00083F9EDF80203E608A3E493F6D9F922BFF6
-:1003F00001238D828E83FB08C9C582C9CAC583CA01
-:10040000E493A3C9C582C9CAC583CAF0A3DBE9D8EE
-:10041000E72202041989828A83F9EDF8E493F2084D
-:10042000A3D9F92202042ABF000DFAEDF8E3F60879
-:1004300009DAFA22020434BF01128D828E83F80297
-:10044000044109A3E3F0D8FA2202044CFAEDF8E3E0
-:10045000F20809DAFA22020456E6FB08E6FA08E690
-:10046000F904F61870010622E6FF08E6FE08E6FD2C
-:1004700022EFF0A3EEF0A3EDF022EBF0A3EAF0A35D
-:10048000E9F022E0FFA3E0FEA3E0FD22E0FBA3E011
-:10049000FAA3E0F9220000000000000004F9005B6C
-:1004A00005730026059A00330A0B005B0A7700608B
-:1004B0001552005B0CFB005B09AB005B09E2005BC3
-:1004C0000DC2005B0BF3005B0A1E005B0A53005B6E
-:1004D000174A0033176000341E4D00431EF00044DD
-:1004E000205D0044204B00471F1700471FBC004DF4
-:1004F000200D004F1F39005831F5005B7CCC7DFF8B
-:10050000121CFE22749090FF91F090FFFCE020E717
-:100510002DC2AFAE59AF58755A20E55A14C55A606E
-:1005200019E4FE7F05EE4FCE24FFCECF34FFCF601F
-:1005300007E490FF92F080ED80E08E598F582212F0
-:1005400005017D077CB71232117D0F7C6E12322BB4
-:1005500078977A06E4F608DAFC7A061205CF7C036F
-:10056000120E577C04120E5712218BE4FEFF7C0FF3
-:1005700012319AD2A822123085E490FD40F090FF0B
-:10058000F0E030E408740190FD41F08005E490FD56
-:1005900041F07D0A7C001224B1123108221230850C
-:1005A00090FD41E014700E90FFF0E04410F07C00EC
-:1005B00012254A801990FD41E0700E90FFF0E05442
-:1005C000EFF07C0012254A80057C1712254A123173
-:1005D000082290FFF0E054ABF090FFF0E04420F0F0
-:1005E000228C378D36787CEDF608ECF6EDFEECFDCE
-:1005F0007F019000051201EC787AF6787CE6FD0820
-:10060000E6FCEDFEECFD7F019000041201EC540FBE
-:10061000FC7D7A12179D787AE6700DAD3AAE39AF4F
-:1006200038E412030F7C082290FFF0E054FEF090B3
-:10063000FFF0E054FDF0801E787CE6FD08E6FCED5E
-:10064000FEECFD7F0190000812020E25E0440190AF
-:10065000FFF3F00206DB787CE6FD08E6FCEDFEEC3D
-:10066000FD7F0190000612020E54FE90FFF3F08011
-:100670002B787CE6FD08E6FCEDFEECFD7F019000AA
-:100680000812020EFAEB90FFF1F01208CA400DAD0D
-:100690003AAE39AF38E412030F7C1822787CE6FDBD
-:1006A00008E6FCEDFEECFD7F0190000812020E90C2
-:1006B000FFF1F01208CA400DAD3AAE39AF38E4127E
-:1006C000030F7C1822787CE6FD08E6FCEDFEECFDCD
-:1006D0007F0190000612020E440190FFF3F0787D36
-:1006E000E62403F618E63400F6787AE624FE50098C
-:1006F00090FFF0E054FDF0800790FFF0E04402F03E
-:10070000E490FFF1F0787B7600787AE624FFFCE451
-:1007100034FFFD787BE67F00FEECD39EEF6480CD56
-:1007200064809D402F1208AF400F787BE6AD3AAE53
-:1007300039AF3812030F7C182290FFF2E0FC787C6E
-:100740008683088682ECF0787B06A3787CA68308F3
-:10075000A68280B51208AF400F787BE6AD3AAE397D
-:10076000AF3812030F7C182290FFF2E0FC787C86F1
-:1007700083088682ECF0787AE6AD3AAE39AF38126B
-:10078000030F7C00228C378D36787CEDF608ECF672
-:10079000EDFEECFD7F019000051201EC787BF67810
-:1007A0007CE6FD08E6FCEDFEECFD7F019000041206
-:1007B00001EC540FFC7D7B12179D787BE670037C67
-:1007C000082290FFF0E054FEF090FFF0E054FDF0BE
-:1007D000801B787CE6FD08E6FCEDFEECFD7F0190D9
-:1007E000000812020E25E090FFF3F0805B787CE6B3
-:1007F000FD08E6FCEDFEECFD7F0190000612020E06
-:1008000054FE90FFF3F08021787CE6FD08E6FCEDD5
-:10081000FEECFD7F0190000812020EFAEB90FFF152
-:10082000F01208CA40037C1822787CE6FD08E6FC3A
-:10083000EDFEECFD7F0190000812020E90FFF1F03A
-:100840001208CA40037C1822787DE6240AF618E6CE
-:100850003400F6787A7600787BE624FFFCE434FFF7
-:10086000FD787AE67F00FEECD39EEF6480CD648055
-:100870009D4021787C8683088682E090FFF1F0120B
-:1008800008CA40037C1822787A06787D06E618703C
-:10089000010680C390FFF0E04401F0787C86830875
-:1008A0008682E090FFF1F01208CA40037C18227C97
-:1008B000002290FFF0E020E71290FFF0E030E50921
-:1008C00090FFF0E04420F0C32280E7D32290FFF0B5
-:1008D000E020E31290FFF0E030E50990FFF0E04403
-:1008E00020F0C32280E7D3228C428D417C00ED545E
-:1008F000F0FDEC7003ED64307005753E0380037508
-:100900003E04AC3E120F7C758300858340E5415464
-:100910000FF53FE5407004E53F64037035E53E2484
-:10092000FD75F00AA4240AF582E434FDF583E03075
-:10093000E6051210678019E53E2497F8C654FBF6C9
-:1009400078A3E62405F58218E63400F583740FF0E9
-:100950008059E5407004E53F64047048E53E24FD9D
-:1009600075F00AA4240AF582E434FDF583E030E54D
-:1009700007AC42AD41121C93E54230E21578A7E680
-:1009800030E00F78A7E630E109E4FF04FE7C0412B2
-:10099000319A78A3E62406F58218E63400F58374CC
-:1009A0000FF08007E4FC7DEE121C93C2032212308C
-:1009B00085120F7C78A3E62406F58218E63400F54C
-:1009C00083E090FD40F078A3E62405F58218E63434
-:1009D00000F583E090FD41F0C2037D027C0012240B
-:1009E000B112310822123085788FECF6EC2497F89A
-:1009F000E630E1077C1312254A800F90FD41E0FDAF
-:100A0000788FE6FC1213FD12254A123108221230AB
-:100A100085788FECF67D00120F0B12254A123108F3
-:100A200022123085788FECF6EC2497F8E630E20756
-:100A30007C1312254A801B788FE62497F8E620E184
-:100A4000077C1212254A800A788FE6FC12142112C4
-:100A5000254A12310822123085788FECF6EC249763
-:100A6000F8E620E2077C1112254A800A788FE6FC1E
-:100A700012152212254A12310822123085788FEC85
-:100A8000F6120F7C78A3E62409F58218E63400F507
-:100A900083E090FD47F078A3E6240AF58218E63457
-:100AA00000F583E090FD48F078A3E62403F5821872
-:100AB000E63400F583E0FC78A3E62404F58218E62A
-:100AC0003400F583E0F55C78A3E62402F58218E6AD
-:100AD0003400F583E0F55D8C5BE4EC33335401784E
-:100AE0008FF66008E55C30E103788F06788FE6903A
-:100AF000FD49F078A1E62402F58218E63400F5837A
-:100B0000E0FDA3E0540CFCED54E68C5FF55EE55B84
-:100B100030E503435F01E55C20E50EE55B547F7043
-:100B200008E55B20E703435F02E55B30E303435FD7
-:100B300010E55B30E203435F20E55B540360034351
-:100B40005F40E55B30E103435F80E55B30E40343F6
-:100B50005E01E55B30E603435E08E55C20E40EE5FC
-:100B60005B547F7008E55B20E703435E10535FFB37
-:100B7000535EF9AD5EE55F90FD42CDF0A3CDF0E5AB
-:100B80005D30E30DE55D5430C4540F90FD45F080B9
-:100B900005E490FD45F0E55D540390FD44F0E55D0E
-:100BA0005404C31390FD46F090FD44E0700E7D3D6B
-:100BB0007EFD7F01740190000912014278A3E624B2
-:100BC00008F58218E63400F583E07C00FD78A3E6A2
-:100BD0002407F58218E63400F583E07F004CFEEF31
-:100BE0004D90FD40F0A3CEF0CEC2037D0A7C0012F2
-:100BF00024B112310822123085788FECF678947681
-:100C0000010876FD0876407891760C789412046598
-:100C10001202147892CBF6CB08F67F00EF24EB405B
-:100C20001FE4EF25E09034BFFD93CD0493789366E5
-:100C30007003ED186670067891760080030F80DCF3
-:100C40007890EFF6789412046590000212020E7804
-:100C500092CBF6CB08F65404CB54064B6004789143
-:100C6000760B7893E630E3137894120465900005D0
-:100C70001201EC24FB50047891760D7893E654C071
-:100C80007D0064C04D70047891760B7894120465F1
-:100C90009000041201EC24FC50047891760F7894B3
-:100CA0001204659000061201EC24FD500478917640
-:100CB0000E78941204659000091201EC24FD500492
-:100CC0007891760A7891E6702A788FE6FC120F7C8C
-:100CD000789412046578A1E6F978A0E6FA7B0174AD
-:100CE0000A780012033FC203788FE6FC12112378C2
-:100CF00091ECF67891E6FC12254A12310822123066
-:100D000085788FECF6120F7C788FE624FD75F00A5B
-:100D1000A4241CF582E434FDF583AC82AD8378A075
-:100D20008683088682ECF9EDFA7B0A78011203A724
-:100D3000C203788FE6FC121123123108228D2B8C0E
-:100D40002AED60407527017529487528FFE52A249A
-:100D5000FDFCE434FFFDEC7C0325E0CD33CDDCF974
-:100D6000FCE5292CF529E5283DF528AD29AE28AF6D
-:100D700027748090000612031774809000021203FB
-:100D800017120FD3E52B14603B75270175290875E1
-:100D900028FFE52A24FDFCE434FFFDEC7C0325E07C
-:100DA000CD33CDDCF9FCE5292CF529E5283DF528E6
-:100DB000AD29AE28AF27E4900006120317E4900097
-:100DC0000212031722123085788FECF6EC2497F884
-:100DD000E630E209788FE6FC121522D200788FE621
-:100DE000FC120F7C7890760090FD41E030E70478AB
-:100DF0009076017890E6FD788FE6FC120D3AC203FA
-:100E0000300007788FE6FC1214217C0012254A126C
-:100E100031082278A3E62404F58218E63400F5832D
-:100E2000E04401F078A3E62404F58218E63400F5E6
-:100E300083E030E00280ED78A3E6240BF58218E62B
-:100E40003400F583E054F8F078A3E62402F5821824
-:100E5000E63400F583E04480F022C2038C58120F80
-:100E60007C78A0868308868279EE7A347B0A7801C2
-:100E70001203F5120E10AC587D02120D3AC203ACEB
-:100E800058121123228D538E528F518C50120F7C89
-:100E9000754F0078A3E62405F58218E63400F58343
-:100EA000E020E416E54F24F64010054FC2037C18FD
-:100EB000123248AC50120F7C80D978A3E62405F595
-:100EC0008218E63400F583E020E405C2037C0222A8
-:100ED00078A3E62405F58218E63400F583E0540F84
-:100EE000601678A3E62405F58218E63400F583E061
-:100EF000540FF0C2037C012278A28683088682E028
-:100F0000AD53AE52AF5112030FC2037C00228D319C
-:100F10008C30121522E5316020E530B4030C7C01E1
-:100F200012247C7C8112247C800FE530B4040A7C7E
-:100F30000212247C7C8212247CAC30120F7CE531BE
-:100F4000601A78A48683088682E054E7F0A3A3A3FE
-:100F5000A3E054E7F0AC307D02120D3A78A086830E
-:100F600008868279F87A347B0A78011203F5C20385
-:100F7000E5302497F8C654FDF6AC30121123228CCC
-:100F8000263003051231E780F87C0A1230FAD203CA
-:100F9000E52624FD789DF6700978A476FF0876E0B2
-:100FA000800778A476FF0876E2789DE675F010A4B5
-:100FB000ADF0FC24A078A3F6ED34FF18F6789DE69A
-:100FC00075F00AA42408FCE434FDFD78A0EDF608D1
-:100FD000ECF61231932278A3E62402F58218E63467
-:100FE00000F583E030E72278A3E62402F58218E6D4
-:100FF0003400F583E0547FF078A3E62402F58218EC
-:10100000E63400F583E04480F02278A486830886E5
-:1010100082E0547FF0AD83E5822404FCE43D8C82C1
-:10102000F583E0547FF078A3E6240BF58218E634CC
-:1010300000F583E054F8F078A5E62401F58218E67F
-:101040003400F583E04403F078A5E62405F5821822
-:10105000E63400F583E04403F078A3E62405F58246
-:1010600018E63400F583740FF02278A4868308868E
-:1010700082E0543FF0AD83E5822404FCE43D8C82A1
-:10108000F583E0543FF0789DE6249EF8E6FC78A5D1
-:10109000E62401F58218E63400F583ECF0789DE64D
-:1010A000249EF8E6FC78A5E62405F58218E63400CF
-:1010B000F583ECF078A3E6240BF58218E63400F50E
-:1010C00083E054FB4402F52678A1E62402F5821859
-:1010D000E63400F583E030E50343260178A3E624F7
-:1010E00005F58218E63400F583E030E003120FD3F3
-:1010F000E526FC78A3E6240BF58218E63400F58398
-:10110000ECF078A3E62405F58218E63400F5837444
-:101110000FF078A48683088682E04480F0A3A3A31E
-:10112000A3E04480F0228C2A120F7C78A1E62408E8
-:10113000F58218E63400F583E0FC78A3E6240AF58E
-:101140008218E63400F583ECF078A1E62407F582F6
-:1011500018E63400F583E0FC78A3E62409F582184C
-:10116000E63400F583ECF078A08683088682E0FD03
-:10117000A3E0FCEDFE78A3E62408F58218E634002F
-:10118000F583EEF0ECFE78A3E62407F58218E6344A
-:1011900000F583EEF08C298D28C3EC9402ED9406C3
-:1011A000400575277C8033D3E5299481E528940197
-:1011B000400575273C8023D3E52994C0E528940099
-:1011C00040057527188013D3E5299430E52894004D
-:1011D000400575270C8003752708AF27E4EF547C82
-:1011E0004483FF8F27E527FC78A5E62401F58218C4
-:1011F000E63400F583ECF0E527FC78A5E62405F558
-:101200008218E63400F583ECF0E527FC789DE624AF
-:101210009EF8ECF678A3E62402F58218E63400F591
-:1012200083E0F52778A1E62402F58218E63400F57C
-:1012300083A3E030E3175327C778A1E62405F5829E
-:1012400018E63400F583E09034E993422778A1E66C
-:101250002402F58218E63400F583E030E7054327E1
-:101260004080035327BF5327FB78A1E62406F5826D
-:1012700018E63400F583E060034327045327FC7825
-:10128000A1E62404F58218E63400F583E042274302
-:101290002780E527FC78A3E62402F58218E63400CF
-:1012A000F583ECF078A3E62404F58218E63400F523
-:1012B00083E0F52778A1E62402F58218E63400F5EC
-:1012C00083A3E030E1055327DF800343272078A183
-:1012D000E62402F58218E63400F583E030E4055395
-:1012E00027EF800343271078A1E62409F58218E64A
-:1012F0003400F583E0B40203432702E527FC78A31A
-:10130000E62404F58218E63400F583ECF078A3E6D1
-:101310002403F58218E63400F583E0F52778A1E68A
-:101320002409F58218E63400F583E0700553277F21
-:10133000800343278078A1E62402F58218E6340072
-:10134000F583A3E030E00543272080035327DF78AF
-:10135000A1E62402F58218E63400F583E030E305C7
-:1013600043274080035327BF78A1E62402F5821863
-:10137000E63400F583E030E005432710800353276F
-:10138000EF78A1E62402F58218E63400F583A3E0A5
-:1013900030E40543270880035327F778A1E62402A9
-:1013A000F58218E63400F583A3E030E50543270411
-:1013B00080035327FB78A1E62402F58218E6340067
-:1013C000F583A3E030E60543270180035327FE7829
-:1013D000A1E62402F58218E63400F583A3E030E7A5
-:1013E0000543270280035327FDE527FC78A3E62465
-:1013F00003F58218E63400F583ECF0C2037C00228A
-:101400008D278C26ED54031460037C1022E52754AD
-:101410007C24FC40037C0B22E5262497F8C644027A
-:10142000F67C00228C30120F7CE5302497F8E62001
-:10143000E24FAC307D02120D3AE53024FE4428FC28
-:1014400078A48683088682ECF0AF83E5822404FECC
-:10145000E43FFFEC8E828F83F07C038C2CE52CFC28
-:1014600078A5E62401F58218E63400F583ECF0E572
-:101470002CFC78A5E62405F58218E63400F583EC0B
-:10148000F0752D01752F48752EFFE53024FDFCE425
-:1014900034FFFDEC7C0325E0CD33CDDCF9FCE52FFA
-:1014A0002CF52FE52E3DF52E78A5E62404F58218BF
-:1014B000E63400F583E054E7F52CAD2FAE2EAF2DCA
-:1014C000E4900002120317E49000061203171201C1
-:1014D000E630E503432C10E52CFC78A5E62404F562
-:1014E0008218E63400F583ECF012106778A3E62446
-:1014F00006F58218E63400F583E0C203FCE53024EB
-:1015000097F8C64404F68C2CE530540FC454F07E92
-:1015100000FFEEEF44047D00FFEC4EFCED4FFD12AA
-:101520001CFE7C00228C2F120F7C12100778A486E0
-:1015300083088682E05408F0A3A3A3A3E05408F034
-:10154000AC2F7D02120D3AC203E52F2497F8C65442
-:10155000FBF67C00221230857890ECF6EC2497F8AC
-:10156000E630E10A7D007C131224B1123108789034
-:10157000E62497F8C64401F67890E6FC120F7C78D2
-:1015800090E624FD75F00AA4241CF582E434FDF5F0
-:101590008378A0E6FA08E6F97B0A78011203A778B7
-:1015A000A0868308868279F87A347B0A7801120350
-:1015B000F5120FD3C2037890E6FC121123788FEC5A
-:1015C000F6EC600A7D007C081224B1123108789094
-:1015D000E6FC120F7C78A3E62404F58218E63400BA
-:1015E000F583E0441054DFFC78A3E62404F5821868
-:1015F000E63400F583ECF0788FECF6C2037CC81279
-:1016000032487890E6FC120F7C78A3E62404F58239
-:1016100018E63400F583E054EFF0C2037CC81232C0
-:10162000487890E6FC120F7C78A3E62404F5821833
-:10163000E63400F583E04410F0C2037CC81232485F
-:101640007890E6FC120F7C78A3E62404F58218E675
-:101650003400F583E04420F0C2037CF01232487875
-:1016600090E6FC120F7C78A3E62405F58218E63498
-:1016700000F583E030E415C2037890E644107F0063
-:10168000FE7C0712319A12310802174978A3E6242A
-:1016900004F58218E63400F583E054CFF0C2037CF1
-:1016A000C81232487890E6FC120F7C78A3E6240436
-:1016B000F58218E63400F583E04430F0C2037CF094
-:1016C0001232487890E6FC120F7C78A3E62405F5E8
-:1016D0008218E63400F583E030E414C2037890E623
-:1016E00044107F00FE7C0712319A123108805D7829
-:1016F000A3E62404F58218E63400F583E054EFF005
-:1017000078A3E62404F58218E63400F583E054DF7C
-:10171000F07890E624FD75F00AA4241CF582E434E8
-:10172000FDF583AC82AD8378A08683088682ECF9D0
-:10173000EDFA7B0A78011203A7C2037890E6FC1247
-:1017400011237D007C0B1224B11231082212308546
-:1017500090FF91E090FD41F07D027C001224B112D7
-:1017600031082212308590FD40E0F4FC90FF91E0BA
-:101770005CF53390FD41E0FC90FD40E05C4233E5D8
-:101780003390FF91F07C0012254A12310822743CFC
-:1017900090FBE8F0743E90FBE8F0E490FD30F0221E
-:1017A0008D358C34ECB401028003D340028028B420
-:1017B00002028003D34008A835C625E0F68018B49D
-:1017C00004028003D3400AA835C625E025E0F68050
-:1017D00006A83576008000228C3C8D3BEDFEECFDAA
-:1017E0007F0175600675610090FD3112046E120173
-:1017F000E6B480028006D3500302189E90FD311299
-:1018000004809000031201EC54F0B430028003D342
-:10181000405F90FD3112048090000812020EFAFD24
-:10182000EBFE7F0190FD3412046EEECD903502FC8C
-:10183000E493FF740193FEF9EFFA7B01EAFFE9FEFE
-:10184000ECC39EED9F4025903504E493FD74019315
-:10185000FCEDFEECFD7F01EECDFC90FD36E0D39C6F
-:1018600090FD35E09D500575608080331219BC8075
-:101870002EB460028003D3400BAC3CAD3B12078218
-:101880008C60801BB41003B34010C3B42003B3407A
-:1018900009C3B440028003D340007560818000809A
-:1018A00075B481028003D3406B90FD3112048090A7
-:1018B00000031201EC54F0B430028003D3401D90B9
-:1018C000FD3112048090000812020EFAFDEBFE7F3B
-:1018D0000190FD3712046E1219268036B460028022
-:1018E00003D34013753A61E4F539F538AC3CAD3BB0
-:1018F0001205DE8C60801BB41003B34010C3B4200B
-:1019000003B34009C3B440028003D3400075608133
-:10191000800080028000E560FC90FD31120480ECC4
-:10192000900002120317AC612290FD3112048090E6
-:1019300000041201EC600474018001E4A2E0920151
-:1019400090FD31120480ED2403FD50010E90FD3412
-:1019500012046E90FD311204809000051201ECF526
-:10196000619000041201EC540FFC7D6112179DE59B
-:1019700061700475600822756000787E7600787E5C
-:10198000E6C39561503890FD371204801201E6FCE1
-:1019900090FD34120480EC12030F30010E90FD39DB
-:1019A000E004F090FD387003E004F0787E0690FDCE
-:1019B00036E004F090FD357003E004F080C0229022
-:1019C000FD32E0FDA3E0FCEDFEECFD7F01ED240A1D
-:1019D000FD50010E90FD3A12046E90FD311204800C
-:1019E0009000041201EC540FB401028003D340179D
-:1019F00090FD3A1204800DED70010E90FD37120437
-:101A00006E78827601804EB402028003D340199032
-:101A1000FD3A120480ED2402FD50010E90FD3712B4
-:101A2000046E78827602802DB404028003D34019BC
-:101A300090FD3A120480ED2404FD50010E90FD3714
-:101A400012046E78827604800CB400028003D340C6
-:101A5000007560082290FD3112048090000512018B
-:101A6000ECF561787F7600787FE6C39561400302EC
-:101A70001B24788076007880E6C378829650769032
-:101A8000FD341204801201E6FC90FD3A1204891222
-:101A900001E0F45CFC1201E0F890FD37120480E8EC
-:101AA000C0E01201E6C8D0E0C8584CFC90FD3412EA
-:101AB0000480EC12030F7881ECF690FD39E004F01D
-:101AC00090FD387003E004F009E970010A90FD3AD6
-:101AD00012047790FD311204809000041201EC3062
-:101AE000E40E90FD36E004F090FD357003E004F064
-:101AF00078800680817882E6FDE4FEFFEECDFC90E2
-:101B0000FD39E02CF090FD38E03DF07882E6FDE410
-:101B1000FEFFEECDFC90FD3CE02CF090FD3BE03D67
-:101B2000F0787F06021A6475600022E53D053D04E9
-:101B30007002B2B022C0E0C0F0C082C083C0D0E862
-:101B4000C0E0E9C0E0EAC0E0EBC0E0ECC0E0EDC01E
-:101B5000E0EEC0E0EFC0E090FF92E01201B71B8022
-:101B6000301B80321B8F381BA13A1BB33E1BCB446A
-:101B70001BBF461BD7501C19521BF8541C3A560069
-:101B8000001C5B90FF92E07F00FE7C0112319A0204
-:101B90001C6BE4FF04FE7C0312319A742090FFFE5C
-:101BA000F0021C6BE4FF04FE7C0212319A74409038
-:101BB000FFFEF0021C6BE4FF04FE7C0412319A026B
-:101BC0001C6BE4FF04FE7C0512319A021C6BE4FFDF
-:101BD00004FE7C0612319A021C6B90FFA5E07D008A
-:101BE00090FD00CDF0A3CDF090FD01E0FCF58390D9
-:101BF000FD00E04433FD121CFE807390FFB5E07DD4
-:101C00000090FD02CDF0A3CDF090FD03E0FCF58344
-:101C100090FD02E04443FD121CFE805290FFA6E0BE
-:101C20007D0090FD04CDF0A3CDF090FD05E0FCF526
-:101C30008390FD04E04434FD121CFE803190FFB619
-:101C4000E07D0090FD06CDF0A3CDF090FD07E0FC17
-:101C5000F58390FD06E04444FD121CFE801090FFC9
-:101C600092E07D00FCED44AAFD121CFE8000E49091
-:101C7000FF92F0D0E0FFD0E0FED0E0FDD0E0FCD05D
-:101C8000E0FBD0E0FAD0E0F9D0E0F8D0D0D083D0BB
-:101C900082D0F0D0E0320581058105810581A881DF
-:101CA000181818EDF608ECF690FF6AE020E70280BD
-:101CB000F790FF69E07D00A88118CDF6CD08F67D8C
-:101CC00003A881E618FCE6CC25E0CC33CCDDF9CCCA
-:101CD000F6CC08F6A88118E644F8F6A8811818187A
-:101CE000E6FD08E6FCA881188683088682EDF0A34D
-:101CF000ECF0740290FF6AF0158115811581158151
-:101D000022E5812405F581E4A88118F6A881181838
-:101D10001818EDF608ECF690FBFDE024F8500302ED
-:101D20001E1FE4A8811818F6A88118E6FEA88118DD
-:101D3000181818E6FD08E6FC7F00EF24F8404DE493
-:101D4000EF25E02485F582E434FDF583E0FBA3E094
-:101D50006C7003FAEB6D70097401A8811818F68095
-:101D60002BE4EF25E02485F582E434FDF5837A0049
-:101D7000E054F0CCF8CCCDF9CDFB7800E954F0F983
-:101D8000EA687002EB6970010E0F80AEA88118EE50
-:101D9000F6A88118181818EDF608ECF6A881EFF6E9
-:101DA000A8811818E67079A88118E624F74071A870
-:101DB0008118181818E6540FA881F664046017A853
-:101DC00081E664036010A88118181818E6FD08E67B
-:101DD000FC121C93804A7C0A1230FAA88118181849
-:101DE00018E6FD08E6FC90FBFCE025E02485F58282
-:101DF000E434FDF583EDF0A3ECF090FBFCE0FFE4B0
-:101E0000EF045407FF90FBFCF090FBFDE004F012A0
-:101E1000319390FBFEE07008E4FEFF7C0F12319AD4
-:101E2000802790FBFFE004F0543F701D90FBFFE023
-:101E300044FE7D00FC90FBFCE025E02485F582E477
-:101E400034FDF583EDF0A3ECF0E58124FBF5812270
-:101E50007885760078867600740190FBFEF012306B
-:101E60008590FBFDE060597C0A1230FA90FBFBE0A4
-:101E700025E02485F582E434FDF583E0FDA3E0FC54
-:101E800090FBFBE025E02485F582E434FDF583E456
-:101E9000F0A3F090FBFBE0FFE4EF045407FF90FB9E
-:101EA000FBF090FBFDE014F07883EDF608ECF61201
-:101EB0003193B2B37883E6FD08E6FC1208E580A111
-:101EC0001231E7788506B60011788576007886E6C7
-:101ED000F40404A2E092B47886F68085E490FBFED8
-:101EE000F090FBFDE07D00FCED44CFFD121C931251
-:101EF000310822123085E56A64494569601590FF12
-:101F000083E0540F7D00D3956AED95695005122E3C
-:101F1000CE8003122F9E12310822123085E56A64AA
-:101F20004945696005122FD8800E90FF80E0440873
-:101F3000F090FF83E0547FF0123108221230858C3C
-:101F400054EC54F0B4101575643D7563FD75620171
-:101F5000E5642403F564E5633400F563E4F557F5BF
-:101F600056E556C394015027E554540FFCAD64AEBA
-:101F700063AF62120E828C55EC600280120564E53C
-:101F800064700205630557E5577002055680D2E577
-:101F900054540F2497F8C654FEF6E554540F7F00AE
-:101FA000FE7C1212319AE5551470097D007C0912ED
-:101FB00024B18007AD577C001224B11231082212DF
-:101FC000308590FFFCE04402F090FF00E030E71322
-:101FD00090FF83E04480F043678090FFFCE0440181
-:101FE000F0801190FF82E04408F053677F90FFFC7F
-:101FF000E054FEF090FF81E04480F012256490FFF1
-:10200000FEE04405F090FFFCE054FDF012310822A0
-:102010001230857C0112324878A7E64402F674FE3D
-:10202000FC04FD121CFE90FF6AE030E70280F7E43A
-:10203000F54E754D10AC4EAD4DE54E154E7002157A
-:102040004DEC4D600280EE438701123108221230C0
-:10205000857C0212311478A7E654FDF6123108226D
-:1020600012308578A7E630E02C78A7E630E12678B4
-:10207000A7E6FCF58318E644F0FD121C9390FFFCE4
-:10208000E04420F07C0212324878A7E654FDF67452
-:102090001A90FFFEF078A7E6FCF58318E644F1FD00
-:1020A000121C9312310822756700756800E4F5660A
-:1020B000F565E4F569756A49748490FF82F074846B
-:1020C00090FF80F0748090FF68F0748090FF6AF059
-:1020D000AD46AF457E00EE24FC500302216AE4EEDB
-:1020E00075F007A4243FF582E434FCF583E0FFE4B7
-:1020F000EF5480FDE4EF540F14FFED6038E4EF750A
-:10210000F008A42448F582E434FFF5837490F0E4E9
-:10211000EF75F008A4244AF582E434FFF583748057
-:10212000F0E4EF75F008A4244EF582E434FFF58363
-:102130007480F08034E4EF75F008A42408F582E49C
-:1021400034FFF5837490F0E4EF75F008A4240AF5E9
-:1021500082E434FFF583E4F0E4EF75F008A4240E84
-:10216000F582E434FFF583E4F00E0220D38D468E31
-:10217000448F45747F90FFFDF0749090FFFCF090C9
-:10218000FC19E030E60790FFFCE04404F02290FCEC
-:102190000DE014700490FC0CE0703990FC0079069E
-:1021A0007A357B1278011203F57F00EF334015EF8B
-:1021B00090354D93FCEF2480F582E434FCF583ECFC
-:1021C000F00F80E78F5990FC2B79187A357B3578A2
-:1021D000011203F5E490FFFFF0745190FFFAF074E0
-:1021E0000490FFFBF0745390FFF8F0745190FFF9E6
-:1021F000F0745590FFF7F0749390FFF6F0743290FE
-:10220000FFF5F075643D7563FD756201E490FF8331
-:10221000F0748090FF81F0755804E55875F007A4BC
-:10222000243FF582E434FCF583E07889F6FC540F12
-:1022300014FC7889ECF6E55875F007A42441F58282
-:10224000E434FCF583E0788C76F8087600FC788935
-:10225000E675F008A42448F582E434FFF583E4F041
-:102260007889E675F008A4244FF582E434FFF583FD
-:10227000ECF0788CE6FF08E67E03CFC313CF13DEC5
-:10228000F9FE7889E675F008A42449F582E434FF64
-:10229000F583EEF07889E675F008A4244AF582E427
-:1022A00034FFF5837480F0788AECF67D00788DE653
-:1022B0002CF618E63DF6788CE6FD08E67C03CDC3E7
-:1022C00013CD13DCF9FC7889E675F008A4244DF5EC
-:1022D00082E434FFF583ECF07889E675F008A424F5
-:1022E0004EF582E434FFF583E4F0788CE6FD08E6F1
-:1022F000FC7889E6FF7E00EE24FC500302246BE4A8
-:10230000EE75F007A4243FF582E434FCF583E0FF8A
-:10231000E4EF5480FAE4EF540F14FFE4EE75F00795
-:10232000A42441F582E434FCF583E0788AF6EE7566
-:10233000F080A42408F8E5F034F8F9E8FCE9FD8A17
-:1023400059EA70030223D8E4EF75F008A42448F595
-:1023500082E434FFF583E4F0788AE6FAE4EF75F07E
-:1023600008A4244FF582E434FFF583EAF0EDFBEC9A
-:102370007A03CBC313CB13DAF9FAE4EF75F008A4B0
-:102380002449F582E434FFF583EAF0788AE67B009D
-:10239000FAEC2AFCED3BFDFBEC7A03CBC313CB1329
-:1023A000DAF9FAE4EF75F008A4244DF582E434FF7D
-:1023B000F583EAF0E4EF75F008A4244AF582E434EA
-:1023C000FFF5837480F0E4EF75F008A4244EF582E5
-:1023D000E434FFF5837480F0022467E4EF75F008BD
-:1023E000A42408F582E434FFF583E4F0788AE6FA61
-:1023F000E4EF75F008A4240FF582E434FFF583EAD6
-:10240000F0EDFBEC7A03CBC313CB13DAF9FAE4EF6C
-:1024100075F008A42409F582E434FFF583EAF07826
-:102420008AE67B00FAEC2AFCED3BFDFBEC7A03CB61
-:10243000C313CB13DAF9FAE4EF75F008A4240DF511
-:1024400082E434FFF583EAF0E4EF75F008A4240A8F
-:10245000F582E434FFF583E4F0E4EF75F008A4249A
-:102460000EF582E434FFF583E4F00E0222F48E5878
-:10247000788CEDF608ECF67889EFF61220A4228C21
-:1024800026EC30E718E526540F1475F008A424480C
-:10249000F582E434FFF583E054DFF08016E526543E
-:1024A0000F1475F008A42408F582E434FFF583E0E6
-:1024B00054DFF022EC90FD3FF08C24ED2403F52551
-:1024C0007D00D3956CED956B4003856C25E5252447
-:1024D000B75009752503740290FD3FF0AC25122F0B
-:1024E000C322E4F566F5651224E82290FD3DE0651F
-:1024F0006D600E740490FD3FF0E4F5657566038031
-:10250000467D6DE4FEFF793D7AFD7B017405780020
-:1025100012033FE5662403F566E5653400F565E5DD
-:1025200066D3956CE565956B4006856C66856B6535
-:10253000D3E5669448E5659400400C740290FD3F35
-:10254000F0E4F565756603AC66122FC322EC90FDCE
-:102550003FF0E4F566F5658C32EC6005122FB4802F
-:10256000057C00122FC32290FF04E0F54A90FF067D
-:10257000E0FDA3E0ED7D00FC7D00FC90FF06E0FFA8
-:10258000A3E07E00FFE4FEEC4EFCED4FFDC3EC94B7
-:1025900048ED9400502290FF06E0FDA3E0ED7D00A1
-:1025A000FC7D00FC90FF06E0FFA3E07E00FFE4FE60
-:1025B000EC4EFCED4FFD8004E4FD7C488C6C8D6B93
-:1025C00090FF02E0FDA3E0ED7D00FC7D00FC90FFAC
-:1025D00002E0FFA3E07E00FFE4FEEC4EF54CED4F81
-:1025E000F54B75643D7563FD7562017D3D7EFD7F34
-:1025F00001796DE4FAFB7405780012033F75490018
-:10260000E54924FE4019AD64AE63AF62E412030FE6
-:1026100005490DED70010E8D648E638F6280E1754A
-:10262000643D7563FD75620190FF00E05460B40085
-:10263000028006D35003022C12E54A540FF549E5F7
-:102640004A5480A2E0920290FF01E0120181000B47
-:102650002C0D266727852C0D28912C0D297429A86F
-:102660002B0F2B122B522BB62BE4E56730E70EE530
-:102670004C454B7008E56C6402456B6003022C0FFF
-:1026800090FF00E0541FB400028003D34029E54AC4
-:102690006003022782AD64AE63AF62740112030F60
-:1026A00078A7E630E00BAD64AE63AF62740212034C
-:1026B0000F7C02122FC322B401028003D3401BE51A
-:1026C0006720E107E54A6003022782E54A24FE50BD
-:1026D000030227827C02122FC322B402028006D397
-:1026E0005003022780E56720E10DE54A6009E54ACD
-:1026F00064806003022782AC4A12304A40030227FA
-:1027000082E549702530021190FF80E05408AD64E5
-:10271000AE63AF6212030F800F90FF82E05408ADEA
-:1027200064AE63AF6212030F803D154930021DE5B0
-:102730004975F008A42448F582E434FFF583E05499
-:1027400008AD64AE63AF6212030F801BE54975F0FC
-:1027500008A42408F582E434FFF583E05408AD644E
-:10276000AE63AF6212030FAD64AE63AF621201E6F7
-:10277000600BAD64AE63AF62740112030F7C021292
-:102780002FC3228000022C0FE56720E706E56C4589
-:102790006B6003022C0F90FF00E0541FB400028016
-:1027A00003D3401AE54C14454B7004E54A6003021C
-:1027B000288E78A7E654FEF67C00122FC322B401BF
-:1027C000028003D3402AE56720E108E56720E003A3
-:1027D00002288EE56730E004E54A700BE56730E1DA
-:1027E00009E54A24FE500302288E7C00122FC322E2
-:1027F000B402028006D3500302288CE54C454B609E
-:102800000302288EAC4A12304A400302288EE56744
-:1028100020E107E56720E0028077E56730E006E524
-:10282000496002806CE549700F90FF82E054F7F038
-:1028300090FF80E054F7F022E549B401028003D311
-:1028400040097D017C03120F0B8011B4020280034A
-:10285000D340097D017C04120F0B80001549300222
-:1028600015E54975F008A42448F582E434FFF583A2
-:10287000E054F7F08013E54975F008A42408F582C8
-:10288000E434FFF583E054F7F07C00122FC322807C
-:1028900000022C0FE56720E706E56C456B6003023C
-:1028A0002C0F90FF00E0541FB400028003D3401AA5
-:1028B000E54C14454B7004E54A600302297178A782
-:1028C000E64401F67C00122FC322B401028003D338
-:1028D0004029E56720E108E56720E003022971E56A
-:1028E0006730E004E549700BE56730E108E549240D
-:1028F000FE5002807F7C00122FC322B402028003AC
-:10290000D3406FE54C454B60028069AC4A12304AB7
-:1029100040028060E56720E107E56720E00280541F
-:10292000E549701430020990FF80E04408F0800708
-:1029300090FF82E04408F022E56730E1331549302A
-:102940000215E54975F008A42448F582E434FFF542
-:1029500083E04408F08013E54975F008A42408F5E5
-:1029600082E434FFF583E04408F07C00122FC32298
-:1029700080028000022C0FE56720E712E56C456BB2
-:10298000700CE54A700890FF00E0541F6003022CB1
-:102990000FE54C90FFFFF090FFFFE06005436701FB
-:1029A00080035367FE7C00122FC322E56730E70ED9
-:1029B000E56C456B600890FF00E0541F6003022C3B
-:1029C0000FAD4BE54CED7D00FC7D00FCBD000280B1
-:1029D00003022B0AB401028003D34032E54A70059A
-:1029E000E54CFC6003022B0C7564007563FC75629A
-:1029F00001D3E56C9412E56B94004006E4FD7C1273
-:102A00008004AC6CAD6B8C6A8D69122FD822B40235
-:102A1000028003D34059E54A6003022B0CE54CFCCD
-:102A200070277564127563FC756201D3E56C9419A7
-:102A3000E56B94004006E4FD7C198004AC6CAD6B42
-:102A40008C6A8D69122FD8802575642B7563FC758F
-:102A50006201D3E56C9435E56B94004006E4FD7C9F
-:102A6000358004AC6CAD6B8C6A8D69122FD822B4A2
-:102A700003028006D35003022B0AE54CF549700F80
-:102A800090FF04E0FDA3E04D6003022B0C80189042
-:102A9000FC82E0FDA3E0FC90FF05E06C700790FF76
-:102AA00004E06D60028068E4F56AF5697F00E5493D
-:102AB00014C549600FEF2480F582E434FCF583E00F
-:102AC0002FFF80EA8F4AE54A2480F582E434FCF542
-:102AD00083E07D00D3956CED956B4006AC6CAD6BDF
-:102AE000800FE54A2480F582E434FCF583E07D0024
-:102AF000FC8C6A8D69E54A2480FCE434FCFDFEEC24
-:102B0000FD7F018D648E638F62122FD822800002B8
-:102B10002C0F022C0FE56730E719E56C14456B703C
-:102B200012E54A700EE54C454B700890FF00E054EA
-:102B30001F6003022C0FE56720E008E56720E10332
-:102B4000022C0F756468E4F563F562E4F56904F539
-:102B50006A122FD822E56720E727E56C456B7021C4
-:102B6000E54A701DE54C6402454B600DE54C14458B
-:102B70004B6006E54C454B700890FF00E0541F6029
-:102B800003022C0FE56720E008E56720E103022C33
-:102B90000F854C68E56870084367015367FD801333
-:102BA000E56864026007E56814600280655367FEAB
-:102BB0004367027C00122FC322E56730E71AE56CF9
-:102BC00014456B7013E54A700FE54C454B70099046
-:102BD000FF00E0541F1460028038E56720E10280A6
-:102BE000317C01122FC322E56720E715E56C456BA8
-:102BF000700FE54C454B700990FF00E0541F1460C6
-:102C000002800FE56720E10280087C00122FC322BA
-:102C10008000022ECAB440028006D35003022EC0A8
-:102C200090FF01E090FD3DF0E54A90FD3EF0E4901C
-:102C3000FD3FF0E5642403F564E5633400F563AD1E
-:102C40004BE54C856482856383CDF0A3CDF090FF86
-:102C500001E01201B72C7D012CA3022CCD032CF72F
-:102C6000042D45052D82062DA8072DCE082DF4092B
-:102C70002E1A0B2E400C2E4F802E4F8100002EADB1
-:102C8000E56720E7067C0512254A227DB77E347F62
-:102C90000279407AFD7B017408780012033F7D08B9
-:102CA0007C001224B122E56720E7067C0512254A44
-:102CB00022E54AB403004010B40500500BE54A7FFA
-:102CC00000FE7C1012319A227D007C071224B12272
-:102CD000E56720E7067C0512254A22E54AB4030091
-:102CE0004010B40500500BE54A7F00FE7C11123104
-:102CF0009A227D007C071224B122E56720E7067C3A
-:102D00000512254A22E54AB405028003D3400AE4AD
-:102D1000FF04FE7C0A12319A22B401028003D340E0
-:102D20000AE4FF04FE7C0812319A22B4030040102A
-:102D3000B40500500BE54A7F00FE7C1312319A2245
-:102D40007D007C071224B122E56720E734D3E56CCF
-:102D50009448E56B94005006E56C456B70067C0268
-:102D600012254A22E54AB40103B3400BC3B4030061
-:102D70004009B406005004123070227C0712254A24
-:102D8000221224E822E56720E71DE54AB40300404B
-:102D900010B40500500BE54A7F00FE7C1612319AF4
-:102DA000227C0712254A221224E822E56720E71D2B
-:102DB000E54AB403004010B40500500BE54A7F001B
-:102DC000FE7C1912319A227C0712254A221224E82D
-:102DD00022E56720E71DE54AB403004010B4050072
-:102DE000500BE54A7F00FE7C1712319A227C0712B5
-:102DF000254A221224E822E56720E71DE54AB403AC
-:102E0000004010B40500500BE54A7F00FE7C18120C
-:102E1000319A227C0712254A221224E822E56720F3
-:102E2000E71DE54AB403004010B40500500BE54A25
-:102E30007F00FE7C1512319A227C0712254A22124D
-:102E400024E822E56720E7067C0712254A2212249F
-:102E5000E822E56730E72090FF00E0541F701090F3
-:102E6000FF01E0B480051224DF80031224E8227DF4
-:102E7000007C051224B12290FF00E0541F60067C04
-:102E80000512254A22D3E56C9448E56B9400500B5B
-:102E9000C3E56C9407E56B940050067C0312254A49
-:102EA00022E54AB40504123070227C0712254A221A
-:102EB000E56730E7087D007C051224B1227C05120D
-:102EC000254A22B420028003D340008000122F9EA6
-:102ED0002275430090FF83E0540FD395434024E5CF
-:102EE0004324F0F582E434FEF583E0AD64AE63AFD5
-:102EF0006212030F05430DED70010E8D648E638F1A
-:102F00006280D1E5437D00FCC3E56A9CF56AE56912
-:102F10009DF569E56A45696006E490FF83F02290BB
-:102F2000FF82E04408F0E4F569756A4990FD3DE0F0
-:102F3000B405028003D3404090FD3EE0F543B40564
-:102F4000028003D3400AE4FF04FE7C0B12319A2274
-:102F5000B401028003D3400AE4FF04FE7C0912316D
-:102F60009A22B403004010B40500500BE5437F00E3
-:102F7000FE7C1412319A2222B480004023B48200D5
-:102F8000501E7C3D7DFD1217D57D008C668D6590B1
-:102F9000FD3FE06005122F9E80057C00122FC322AA
-:102FA0002290FF83E0547FF090FF82E04408F0908D
-:102FB000FF80E04408F02290FF82E04408F090FF98
-:102FC00080E04408F0228C237D008C6A8D69756452
-:102FD0003D7563FD756201122FD82290FF83E05486
-:102FE0007FF0E56A64494569700122C3E56A940887
-:102FF000E56994004015752108E5217D00FCC3E5D5
-:103000006A9CF56AE5699DF5698009856A21E4F5A0
-:1030100069756A49752200E522C395215026AD6481
-:10302000AE63AF621201E6FCE52224F8F582E434D7
-:10303000FEF583ECF005220DED70010E8D648E63BC
-:103040008F6280D3E521547F90FF81F0228C487FEE
-:1030500000EF24FB4019E4EF75F007A4243FF5824C
-:10306000E434FCF583E065487002D3220F80E28FE0
-:1030700047C322856C6A856B6990FF82E054F7F044
-:1030800090FF83E0547FF022C000C001C002C00660
-:10309000C007E5722408F8860653067F7CFF1230CD
-:1030A000FA7C007D00E5756046FF90FE9DE0547F50
-:1030B0006E700FC083C082A3E0FDA3E0FCA3157572
-:1030C0008007A3A3A3DFE68026DF06D082D083801B
-:1030D0001EE0F8A3E0F9A3E0FAD082D083E8F0A3E1
-:1030E000E9F0A3EAF0A3C083C082A3A3A380DA120D
-:1030F0003193D007D006D002D001D0002285A87429
-:1031000075A888EC70027C3F8C7322E5722408F865
-:1031100076001231E780FBC000C001C002C006C0CB
-:1031200007AE047CFF1230FAE5756042FF90FE9D09
-:10313000E0547F6E700BC083C082A3A3A31575807B
-:1031400007A3A3A3DFEA8026DF06D082D08380D83E
-:10315000E0F8A3E0F9A3E0FAD082D083E8F0A3E995
-:10316000F0A3EAF0A3C083C082A3A3A380DA780807
-:10317000087918097C01E6547F6E700676007700A6
-:10318000800608090CBC08EE123193D007D006D097
-:1031900002D001D000227573008574A822C0F0C04F
-:1031A00082C083C3E57524E850051231E780F4EC52
-:1031B00060319034B6E493C39C4028C0047CFF1275
-:1031C00030FAD004430480E57575F003A4249DF51E
-:1031D00082E434FEF583ECF0EFA3F0EEA3F0057586
-:1031E000123193D083D082D0F022C0047C20D28CC4
-:1031F000D28DD504FDD0042275A80075880075B85D
-:103200000075F00075D000E4F8900000F608B800F2
-:10321000FB020000C3ED940250047D037CE8ECF453
-:10322000FCEDF4FD0CBC00010D8C798D7822C3EC13
-:1032300094BCED940250047D077CD0ECF4FCEDF4DA
-:10324000FD0CBC00010D8C778D7622EC700122C044
-:1032500000E5722418F8A604E5722408F8C6547F25
-:10326000F6E630E703D000221231E780F4C28C8505
-:10327000768C85778AD28CC0E0C0D0C0F0C082C086
-:1032800083C000C001C002C003C004C005C006C0A6
-:1032900007121B28E5722408F8E66024E572241062
-:1032A000F8A681E57275F021A42495F582E434FD39
-:1032B000F58378A8E58104C398F9E6F008A3D9FA64
-:1032C00074082572F8057208E65480700CE572B433
-:1032D00007F3780875720080EFE5722410F8868194
-:1032E000E57275F021A42495F582E434FDF5837828
-:1032F000A8E58104C398F9E0F608A3D9FAD007D06D
-:1033000006D005D004D003D002D001D000D083D0A5
-:1033100082D0F0D0D0D0E032C0E0C0D0C000C00138
-:10332000C002C28E85788D85798BD28E7819790905
-:103330007A07E77004A600800BE6600816E67004C2
-:10334000E74480F70809DAEAE573601314F573704F
-:103350000EE5722408F87600123193D28CD28DD00B
-:1033600002D001D000D0D0D0E0327581A775900096
-:103370007579307578F87577607576F012053C12BE
-:10338000340F12178B1234391231F580E322C0004A
-:103390007C01EC2408F8E660090CBC08F51231E762
-:1033A00080EED00022C0F0C082C083C000C006C042
-:1033B00007ED2410F876B6ED75F021A42495F5827A
-:1033C000E434FDF583C082C083A3A3E4780DF0A3A9
-:1033D000D8FCEC547F75F002A42482F582E5F03429
-:1033E00034F583E493FE740193F5828E83E493FEB7
-:1033F000740193FFD083D082EFF0A3EEF0ED2408A8
-:10340000F8EC4480F6D007D006D000D083D082D02C
-:10341000F0227572007575007A08791878087600C0
-:1034200077000809DAF8E478087480447FF67401BC
-:103430004410F58975B808D2ABD2A9227581A7D2FC
-:103440008ED28CD2AFE5756032FF90FE9DE0548045
-:10345000602478087908E0547FFA7B00E6547FB551
-:1034600002027BFF08D9F5EB700CEAF012338BAD4A
-:1034700004AC021233A2A3A3A3DFD21231E780C5AA
-:103480007C017D002204F504E904ED04E104DD047F
-:10349000D904E504F1049D04A104CD04D1049904E8
-:1034A00099049904D504B504AD04B104A904C10478
-:1034B000BD04B904C504C904A519010300220048CC
-:1034C0000200240F180A10640D680C05060203019F
-:1034D0000181010000E700C0008000600040003072
-:1034E0000018000C00080004000200010008183851
-:1034F000280602100A0200000000000181100A02E2
-:103500000000000000FBE8FBFA12011001FF0000C0
-:103510000851045F50160101020002090235000142
-:103520000200E0000904000005FF0000000705811B
-:10353000024000000705010240000007058202402A
-:103540000000070502024000000705850302000194
-:10355000040309042403540065007800610073002B
-:10356000200049006E0073007400720075006D0049
-:1035700065006E00740073002A0354005500530068
-:103580004200350030003500320020005300650055
-:103590007200690061006C00200050006F00720032
-:1035A00074002203540055005300420035003000DF
-:1035B00035003200200020002000200020002000E4
-:0435C00020002000C7
-:00000001FF
diff --git a/firmware/tigon/tg3.bin.ihex b/firmware/tigon/tg3.bin.ihex
deleted file mode 100644
index d842d7cc91b5..000000000000
--- a/firmware/tigon/tg3.bin.ihex
+++ /dev/null
@@ -1,175 +0,0 @@
-:10000000000000000800000000000A80000000005E
-:1000100010000003000000000000000D0000000DB3
-:100020003C1D080037BD3FFC03A0F0213C10080038
-:10003000261000000E000018000000000000000D57
-:100040003C1D080037BD3FFC03A0F0213C10080018
-:10005000261000340E00021C000000000000000DFD
-:1000600000000000000000000000000027BDFFE0CD
-:100070003C1CC000AFBF0018AF80680C0E00004CE5
-:10008000241B210597850000978700029782002C8A
-:100090009783002E3C040800248409C0AFA00014FC
-:1000A000000214000062182500052C00AFA3001008
-:1000B0008F86001000E528250E000060240701024D
-:1000C0003C02AC00344201003C03AC01346301004B
-:1000D000AF8204903C02FFFFAF820494AF83049888
-:1000E000AF82049C24020001AF825CE00E00003F5E
-:1000F000AF825D000E000140000000008FBF0018BD
-:1001000003E0000827BD00202402FFFFAF82540453
-:100110008F83540034630400AF835400AF825404CF
-:100120003C02080024420034AF82541C03E0000863
-:10013000AF80540000000000000000003C020800F6
-:10014000344230003C030800346330003C040800B3
-:10015000348437FF3C010800AC220A6424020040CA
-:100160003C010800AC220A683C010800AC200A608F
-:10017000AC600000246300040083102B5040FFFD9E
-:10018000AC60000003E0000800000000008048218F
-:100190008FAA00103C0208008C420A603C04080050
-:1001A0008C840A688FAB0014244300010044102B98
-:1001B0003C010800AC230A60144000030000402109
-:1001C0003C010800AC200A603C0208008C420A6036
-:1001D0003C0308008C630A64912400000002114073
-:1001E000004310210048102125080001A044000010
-:1001F000290200081440FFF4252900013C020800F0
-:100200008C420A603C0308008C630A648F84680C8B
-:100210000002114000431021AC440008AC45000C22
-:10022000AC460010AC470014AC4A001803E00008CC
-:10023000AC4B001C000000000000000000000000AB
-:1002400000000000000000000000000000000000AE
-:10025000000000000000000000000000000000009E
-:10026000000000000000000000000000000000008E
-:10027000000000000000000000000000000000007E
-:10028000000000000000000000000000000000006E
-:10029000000000000000000000000000000000005E
-:1002A000000000000000000000000000000000004E
-:1002B000000000000000000000000000000000003E
-:1002C000000000000000000000000000000000002E
-:1002D000000000000000000000000000000000001E
-:1002E000000000000000000000000000000000000E
-:1002F00000000000000000000000000000000000FE
-:1003000000000000000000000000000002000008E3
-:10031000000000000A0001E33C0A00010A0001E3BA
-:100320003C0A00020A0001E3000000000A0001E3A9
-:10033000000000000A0001E3000000000A0001E3E1
-:10034000000000000A0001E3000000000A0001E3D1
-:10035000000000000A0001E3000000000A0001E3C1
-:10036000000000000A0001E3000000000A0001E3B1
-:100370003C0A00070A0001E33C0A00080A0001E306
-:100380003C0A00090A0001E3000000000A0001E342
-:10039000000000000A0001E33C0A000B0A0001E330
-:1003A0003C0A000C0A0001E33C0A000D0A0001E3CC
-:1003B000000000000A0001E3000000000A0001E361
-:1003C0003C0A000E0A0001E3000000000A0001E3FD
-:1003D000000000000A0001E3000000000A0001E341
-:1003E000000000000A0001E3000000000A0001E331
-:1003F000000000000A0001E3000000000A0001E321
-:10040000000000000A0001E33C0A00130A0001E3B7
-:100410003C0A001400000000000000000000000082
-:1004200000000000000000000000000000000000CC
-:1004300000000000000000000000000000000000BC
-:1004400000000000000000000000000000000000AC
-:10045000000000000000000000000000000000009C
-:10046000000000000000000000000000000000008C
-:10047000000000000000000000000000000000007C
-:10048000000000000000000000000000000000006C
-:10049000000000000000000000000000000000005C
-:1004A000000000000000000000000000000000004C
-:1004B000000000000000000000000000000000003C
-:1004C000000000000000000000000000000000002C
-:1004D000000000000000000000000000000000001C
-:1004E000000000000000000000000000000000000C
-:1004F00000000000000000000000000000000000FC
-:1005000000000000000000000000000027BDFFE028
-:100510000000182100001021AFBF0018AFB1001477
-:10052000AFB000103C01080000220821AC200A7086
-:100530003C01080000220821AC200A743C0108009C
-:1005400000220821AC200A78246300011860FFF51E
-:100550002442000C241100018F9068103202000424
-:1005600014400005240400013C0208008C420A7873
-:1005700018400003000020210E000182000000004E
-:100580003202000110400003000000000E0001696B
-:10059000000000000A000153AF9150288FBF0018DF
-:1005A0008FB100148FB0001003E0000827BD0020B9
-:1005B0003C0508008CA50A703C0608008CC60A8021
-:1005C0003C0708008CE70A7827BDFFE03C040800E0
-:1005D000248409D0AFBF0018AFA000100E00006047
-:1005E000AFA000140E00017B000020218FBF001877
-:1005F00003E0000827BD0020240200018F8368105B
-:1006000000821004000210270062182403E0000892
-:10061000AF83681027BDFFD8AFBF00241080002E25
-:10062000AFB000208F825CECAFA200188F825CEC30
-:100630003C10080026100A78AFA2001C340280008B
-:10064000AF825CEC8E020000184000160000000033
-:100650003C02080094420A748FA3001C000221C0CF
-:10066000AC8300048FA2001C3C0108000E000201B4
-:10067000AC220A7410400005000000008E02000049
-:10068000244200010A0001DFAE0200003C02080023
-:100690008C420A7000021C02000321C00A0001C53E
-:1006A000AFA2001C0E000201000000001040001F5D
-:1006B000000000008E0200008FA3001C24420001F5
-:1006C0003C010800AC230A703C010800AC230A740A
-:1006D0000A0001DFAE0200003C10080026100A7874
-:1006E0008E02000018400028000000000E000201E9
-:1006F0000000000014400024000000008E020000F2
-:100700003C0308008C630A702442FFFFAFA3001C67
-:1007100018400006AE02000000031402000221C0CF
-:100720008C8200043C010800AC220A7097A2001ED3
-:100730002442FF002C4203001440000B240240001E
-:100740003C040800248409DCAFA00010AFA0001412
-:100750008FA6001C240500080E0000600000382150
-:100760000A0001DF00000000AF825CF83C020800D4
-:100770008C420A408FA3001C24420001AF835CF826
-:100780003C010800AC220A408FBF00248FB000203B
-:1007900003E0000827BD002827BDFFE03C04080057
-:1007A000248409E8000028210000302100003821BD
-:1007B000AFBF0018AFA000100E000060AFA0001483
-:1007C0008FBF001803E0000827BD00208F82680C4F
-:1007D0008F85680C000218270003182B00031823CC
-:1007E000004310240044102100A2282B10A0000672
-:1007F00000000000004018218F82680C0043102B7D
-:100800001440FFFD0000000003E0000800000000AD
-:100810003C0408008C8400003C0308008C630A4000
-:100820000064102B54400002008310230064102346
-:100830002C42000803E000083842000127BDFFE019
-:10084000008028213C04080024840A000000302194
-:1008500000003821AFBF0018AFA000100E000060EC
-:10086000AFA000140A000216000000008FBF00189D
-:1008700003E0000827BD00200000000027BDFFE0C6
-:100880003C1CC000AFBF00180E00004CAF80680CCD
-:100890003C04080024840A10038028210000302131
-:1008A00000003821AFA000100E000060AFA00014BF
-:1008B0002402FFFFAF8254043C0200AA0E0002345F
-:1008C000AF8254348FBF001803E0000827BD00201A
-:1008D00000000000000000000000000027BDFFE84D
-:1008E000AFB0001024100001AFBF00143C01C003E2
-:1008F000AC2000008F8268103042200010400003BE
-:10090000000000000E000246000000000A00023A4B
-:10091000AF9054288FBF00148FB0001003E0000880
-:1009200027BD001827BDFFF88F845D0C3C0200FF37
-:100930003C0308008C630A503442FFF80082102404
-:100940001043001E3C0500FF34A5FFF83C06C00321
-:100950003C074000008518248C6200103C01080010
-:10096000AC230A50304200081040000500871025D3
-:100970008CC2000024420001ACC200000087102598
-:10098000AF825D0C8FA2000024420001AFA20000E4
-:100990008FA200008FA2000024420001AFA200003D
-:1009A0008FA200008F845D0C3C0308008C630A500A
-:1009B000008510241443FFE80085182427BD000893
-:1009C00003E000080000000000000000353730316F
-:1009D000726C734100000000000000005377457600
-:1009E000656E743000000000726C704576656E7440
-:1009F00031000000556E6B6E45766E74000000008D
-:100A0000000000000000000000000000666174614A
-:100A10006C45727200000000000000004D61696EBC
-:100A2000437075420000000000000000000000005C
-:100A300000000000000000000000000000000000B6
-:100A400000000000000000000000000000000000A6
-:100A50000000000000000000000000000000000096
-:0C0A60000000000000000000000000008A
-:00000001FF
- * Firmware is:
- * Derived from proprietary unpublished source code,
- * Copyright (C) 2000-2003 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware
- * data in hexadecimal or equivalent format, provided this copyright
- * notice is accompanying it.
diff --git a/firmware/tigon/tg3_tso.bin.ihex b/firmware/tigon/tg3_tso.bin.ihex
deleted file mode 100644
index f10c4ef90513..000000000000
--- a/firmware/tigon/tg3_tso.bin.ihex
+++ /dev/null
@@ -1,446 +0,0 @@
-:100000000106000008000000000024140E00000398
-:100010000000000008001B24000000001000000386
-:10002000000000000000000D0000000D3C1D080055
-:1000300037BD400003A0F0213C100800261000004E
-:100040000E000010000000000000000D27BDFFE0C2
-:100050003C04FEFEAFBF00180E0005D83484000239
-:100060000E000668000000003C03080090631B6857
-:10007000240200023C04080024841AAC1462000329
-:10008000240500013C04080024841AA0240600066C
-:1000900000003821AFA000100E00067CAFA00014B5
-:1000A0008F625C5034420001AF625C508F625C90A2
-:1000B00034420001AF625C902402FFFF0E00003466
-:1000C000AF6254048FBF001803E0000827BD002072
-:1000D00000000000000000000000000027BDFFE05D
-:1000E000AFBF001CAFB20018AFB100140E00005B30
-:1000F000AFB0001024120002241100018F7068209C
-:100100003202010010400003000000000E0000BB9E
-:10011000000000008F7068203202200010400004B0
-:10012000320200010E0001F024040001320200013D
-:1001300010400003000000000E0000A300000000BB
-:100140003C02080090421B9814520003000000007B
-:100150000E0004C0000000000A00003CAF715028EF
-:100160008FBF001C8FB200188FB100148FB0001029
-:1001700003E0000827BD002027BDFFE03C04080085
-:1001800024841AC0000028210000302100003821FA
-:10019000AFBF0018AFA000100E00067CAFA0001487
-:1001A0003C040800248423D8A48000003C010800FB
-:1001B000A0201B983C010800AC201B9C3C010800BF
-:1001C000AC201BA03C010800AC201BA43C01080093
-:1001D000AC201BAC3C010800AC201BB83C01080063
-:1001E000AC201BBC8F6244343C010800AC221B884D
-:1001F0008F6244383C010800AC221B8C8F62441093
-:10020000AC80F7A83C010800AC201B843C0108002E
-:10021000AC2023E03C010800AC2023C83C010800CE
-:10022000AC2023CC3C010800AC2024003C01080099
-:10023000AC221B908F6200682403000700021702A3
-:1002400010430005000000008F62006800021702E2
-:1002500014400004240200013C0108000A00009739
-:10026000AC20240CAC8200343C04080024841ACC5A
-:100270003C0508008CA5240C00003021000038212A
-:10028000AFA000100E00067CAFA000148FBF0018B6
-:1002900003E0000827BD002027BDFFE03C04080064
-:1002A00024841AD8000028210000302100003821C1
-:1002B000AFBF0018AFA000100E00067CAFA0001466
-:1002C0000E00005B000000000E0000B400002021C2
-:1002D0008FBF001803E0000827BD002024020001A2
-:1002E0008F63682000821004000210270062182427
-:1002F00003E00008AF63682027BDFFD0AFBF002C2C
-:10030000AFB60028AFB50024AFB40020AFB3001CD7
-:10031000AFB20018AFB10014AFB000108F675C5CD3
-:100320003C03080024631BBC8C62000014470005DA
-:100330003C0200FF3C02080090421B981440011947
-:100340003C0200FF3442FFF800E28824AC67000062
-:1003500000111902306300FF30E20003000211C0F7
-:100360000062282500A04021000716023C03080077
-:1003700090631B983044000F1460003600804821C1
-:10038000240200013C010800A0221B980005110076
-:10039000008210253C010800AC201B9C3C01080099
-:1003A000AC201BA03C010800AC201BA43C010800B1
-:1003B000AC201BAC3C010800AC201BB83C01080081
-:1003C000AC201BB03C010800AC201BB43C01080071
-:1003D000A42223D89622000C30437FFF3C01080062
-:1003E000A4222410304280003C010800A4231BC634
-:1003F00010400005240200013C010800AC2223F457
-:100400000A0001022406003E240600363C010800D2
-:10041000AC2023F49622000A3C03080094631BC618
-:100420003C010800AC2023F03C010800AC2023F87C
-:10043000000213020002108000C210210062182185
-:100440003C010800A42223D03C0108000A00011549
-:10045000A4231B969622000C3C010800A42223EC46
-:100460003C04080024841B9C8C82000000021100C4
-:100470003C01080000220821AC311BC88C8200001E
-:10048000000211003C01080000220821AC271BCC0F
-:100490008C82000025030001306601FF000211007C
-:1004A0003C01080000220821AC261BD08C820000F1
-:1004B000000211003C01080000220821AC291BD4D5
-:1004C000962300083C0208008C421BAC0043282104
-:1004D0003C010800AC251BAC9622000A3042000407
-:1004E00014400018000611008F630C143063000FD5
-:1004F0002C6200021440000B3C02C0008F630C14FD
-:100500003C0208008C421B403063000F2442000173
-:100510003C010800AC221B402C6200021040FFF797
-:100520003C02C00000E21825AF635C5C8F625C5047
-:100530003042000210400014000000000A00014791
-:10054000000000003C0308008C631B803C04080092
-:1005500094841B94012210253C010800A42223DA74
-:10056000240200013C010800AC221BB824630001F6
-:100570000085202A3C01080010800003AC231B806A
-:100580003C010800A4251B943C06080024C61B9CC3
-:100590008CC2000024420001ACC20000284200804E
-:1005A00014400005000000000E000656240400025E
-:1005B0000A0001E6000000003C0208008C421BB863
-:1005C00010400078240200013C05080090A51B980B
-:1005D00014A20072000000003C15080096B51B969E
-:1005E0003C0408008C841BAC32A3FFFF0083102A5C
-:1005F0001440006C000000001483000300000000A1
-:100600003C010800AC2523F01060005C0000902144
-:1006100024D600040060A02124D300148EC2000060
-:10062000000281003C110800023088210E000625DE
-:100630008E311BC80040282110A00054000000008B
-:100640009628000A31020040104000052407180CCB
-:100650008E22000C2407188C00021400ACA2001893
-:100660003C030800007018218C631BD03C0208007A
-:10067000005010218C421BD400031D000002140006
-:1006800000621825ACA300148EC300049622000853
-:10069000004320233242FFFF3083FFFF004310213D
-:1006A0000282102A1440000202B23023008030215E
-:1006B0008E62000030C4FFFF00441021AE620000D3
-:1006C0008E220000ACA200008E2200048E63FFF494
-:1006D00000431021ACA20004A4A6000E8E62FFF419
-:1006E00000441021AE62FFF4962300080043102A54
-:1006F00014400005024690218E62FFF0AE60FFF4C8
-:1007000024420001AE62FFF0ACA000083242FFFFBD
-:1007100014540008240203053102008054400001F3
-:1007200034E7001024020905A4A2000C0A0001CB42
-:1007300034E70020A4A2000C3C0208008C4223F005
-:10074000104000033C024B650A0001D3344276544A
-:100750003C02B49A344289ABACA2001C30E2FFFFE9
-:10076000ACA200100E0005A200A020213242FFFF23
-:100770000054102B1440FFA90000000024020002C6
-:100780003C0108000A0001E6A0221B988EC2083C2A
-:10079000244200010A0001E6AEC2083C0E0004C07B
-:1007A000000000008FBF002C8FB600288FB50024FA
-:1007B0008FB400208FB3001C8FB200188FB10014CB
-:1007C0008FB0001003E0000827BD003027BDFFD028
-:1007D000AFBF0028AFB30024AFB20020AFB1001C00
-:1007E000AFB000188F725C9C3C0200FF3442FFF8EF
-:1007F0003C07080024E71BB4024288249623000E1D
-:100800008CE2000000431021ACE200008E220010B8
-:100810003042002014400011008098210E00063B59
-:10082000022020213C02C00002421825AF635C9CDC
-:100830008F625C90304200021040011E00000000F8
-:10084000AF635C9C8F625C903042000210400119E3
-:10085000000000000A00020D000000008E240008C5
-:100860008E23001400041402000231C0000315029C
-:10087000304201FF2442FFFF3042007F0003194253
-:1008800030637800000211002442400000624821D9
-:100890009522000A3084FFFF30420008104000B06B
-:1008A000000429C03C0208008C42240014400024AB
-:1008B00024C5000894C200143C010800A42223D0DF
-:1008C0008CC40010000414023C010800A42223D2AE
-:1008D0003C010800A42423D494C2000E3083FFFFFF
-:1008E000004310233C010800AC22240894C2001AE3
-:1008F0003C010800AC2624003C010800AC32240472
-:100900003C010800AC2223FC3C02C0000242182536
-:10091000AF635C9C8F625C9030420002104000E547
-:1009200000000000AF635C9C8F625C90304200026C
-:10093000104000E0000000000A0002460000000035
-:1009400094C2000E3C030800946323D40043402368
-:100950003103FFFF2C6200081040001C0000000063
-:1009600094C200142442002800A22821000310424F
-:100970001840000B0000202124E6084800403821E0
-:1009800094A300008CC200002484000100431021C5
-:10099000ACC200000087102A1440FFF924A5000211
-:1009A000310200011040001F3C0240003C040800DE
-:1009B000248423FCA0A0000194A300008C820000EA
-:1009C000004310210A000285AC8200008F6268009B
-:1009D0003C030010004310241040000900000000F8
-:1009E00094C2001A3C0308008C6323FC00431021CE
-:1009F0003C010800AC2223FC0A0002863C024000B5
-:100A000094C2001A94C4001C3C0308008C6323FCAD
-:100A100000441023006218213C010800AC2323FC91
-:100A20003C02400002421825AF635C9C8F625C90E0
-:100A3000304200021440FFFC000000009522000A32
-:100A4000304200101040009B000000003C030800F2
-:100A5000946323D43C07080024E724008CE40000BE
-:100A60008F62680024630030008328213C0300105B
-:100A7000004310241440000A0000000094A2000467
-:100A80003C0408008C8424083C0308008C6323FC8D
-:100A900000441023006218213C010800AC2323FC11
-:100AA0003C0408008C8423FC00041C023082FFFFFD
-:100AB000006220210004140200822021000410277B
-:100AC000A4A200063C0308008C6324043C0200FF3F
-:100AD0003442FFF8006288249622000824050001B1
-:100AE00024034000000231C000801021A4C2001A7B
-:100AF000A4C0001CACE000003C010800AC251B6059
-:100B0000AF635CB88F625CB03042000210400003FB
-:100B1000000000003C010800AC201B608E22000891
-:100B2000AF625CB88F625CB03042000210400003DC
-:100B3000000000003C010800AC201B603C020800E3
-:100B40008C421B601040FFEC000000003C040800D9
-:100B50000E00063B8C8424040A00032A00000000D7
-:100B60003C03080090631B982402000214620003F7
-:100B70003C034B650A0002E1000080218E22001C2C
-:100B80003463765410430002241000022410000144
-:100B900000C020210E000350020030212402000377
-:100BA0003C010800A0221B98240200021202000A45
-:100BB000240200013C0308008C6323F0106200064D
-:100BC000000000003C020800944223D800021400F8
-:100BD0000A00031FAE2200143C040800248423DA18
-:100BE0009482000000021400AE2200143C020800AF
-:100BF0008C421BBC3C03C0003C010800A0201B9899
-:100C000000431025AF625C5C8F625C503042000292
-:100C100010400009000000002484F7E28C820000EC
-:100C200000431025AF625C5C8F625C503042000272
-:100C30001440FFFA000000003C02080024421B841C
-:100C40008C43000024630001AC4300008F630C144C
-:100C50003063000F2C6200021440000C3C02400084
-:100C60008F630C143C0208008C421B403063000F61
-:100C7000244200013C010800AC221B402C6200020F
-:100C80001040FFF7000000003C024000024218251F
-:100C9000AF635C9C8F625C90304200021440FFFCAA
-:100CA0000000000012600003000000000E0004C0FD
-:100CB000000000008FBF00288FB300248FB20020F7
-:100CC0008FB1001C8FB0001803E0000827BD003072
-:100CD0008F6344503C04080024841B888C820000ED
-:100CE00000031C020043102B144000073C0380004B
-:100CF0008C8400048F62445000021C020083102B7D
-:100D00001040FFFC3C038000AF6344448F624444C6
-:100D1000004310241440FFFD000000008F6244488F
-:100D200003E000083042FFFF3C0240000082202523
-:100D3000AF645C388F625C30304200021440FFFCCC
-:100D40000000000003E000080000000027BDFFE0F5
-:100D50000080582114C00011256E00083C020800D4
-:100D60008C4223F410400007240200163C010800C6
-:100D7000A42223D22402002A3C0108000A000364B2
-:100D8000A42223D48D670010000714023C01080040
-:100D9000A42223D23C010800A42723D43C04080049
-:100DA000948423D43C030800946323D295CF000697
-:100DB0003C020800944223D00083202301E2C02398
-:100DC0003065FFFF24A2002801C248213082FFFFC6
-:100DD00014C0001A012260219582000C3042003FAD
-:100DE0003C010800A42223D69582000495830006C6
-:100DF0003C010800AC2023E43C010800AC2023E8BF
-:100E000000021400004310253C010800AC221BC066
-:100E1000952200043C010800A4221BC49523000273
-:100E200001E510230043102A1040001024020001A5
-:100E30003C0108000A000398AC2223F83C03080098
-:100E40008C6323E83C02080094421BC40043102139
-:100E5000A52200043C02080094421BC0A5820004A5
-:100E60003C0208008C421BC0A58200063C02080020
-:100E70008C4223F03C0D08008DAD23E43C0A0800B1
-:100E8000144000E58D4A23E83C02080094421BC44C
-:100E9000004A18213063FFFF0062182B2402000271
-:100EA00010C2000D014350233C020800944223D697
-:100EB0003042000910400008000000009582000C3C
-:100EC0003042FFF6A582000C3C020800944223D673
-:100ED0003042000901A268233C0208008C4223F83A
-:100EE0001040004A012038213C020800944223D2DD
-:100EF00000004021A520000A01E21023A5220002E3
-:100F00003082FFFF0002104218400008000030212C
-:100F10000040182194E200002508000100C23021A1
-:100F20000103102A1440FFFB24E7000200061C0204
-:100F300030C2FFFF006230210006140200C23021DF
-:100F400000C0282100061027A522000A0000302139
-:100F50002527000C0000402194E200002508000134
-:100F600000C230212D0200041440FFFB24E70002E0
-:100F70009522000200004021912300090044202313
-:100F8000018038213082FFFFA4E0001000621821A8
-:100F9000000210421840001000C3302100404821D8
-:100FA00094E2000024E7000200C2302130E2007F1A
-:100FB00014400006250800018D6300003C02007FFC
-:100FC0003442FF8000625824256700080109102A76
-:100FD0001440FFF3000000003082000110400005C3
-:100FE00000061C02A0E0000194E2000000C23021D3
-:100FF00000061C0230C2FFFF00623021000614020E
-:1010000000C230210A00047D30C6FFFF2402000226
-:1010100014C20081000000003C0208008C42240C35
-:1010200014400007000000003C020800944223D254
-:101030009523000201E210231062007700000000F7
-:101040003C020800944223D201E21023A5220002B0
-:101050003C0208008C42240C1040001A31E3FFFFD0
-:101060008DC700103C02080094421B9600E040210E
-:1010700000072C0200AA20210043102300823823FD
-:101080000007240230E2FFFF00823821000710270A
-:10109000A522000A3102FFFF3C040800948423D4F7
-:1010A0000045302300E0282100641823006D18213A
-:1010B00000C3302100061C0230C2FFFF0A00047D7D
-:1010C0000062302101203821000040213082FFFFE2
-:1010D0000002104218400008000030210040182192
-:1010E00094E200002508000100C230210103102A0B
-:1010F0001440FFFB24E7000200061C0230C2FFFF81
-:10110000006230210006140200C2302100C02821F4
-:1011100000061027A522000A000030212527000C18
-:101120000000402194E200002508000100C23021A7
-:101130002D0200041440FFFB24E700029522000268
-:101140000000402191230009004420230180382120
-:101150003082FFFFA4E000103C040800948423D4F4
-:101160000062182100C3302100061C0230C2FFFFBC
-:101170000062302100061C023C020800944223D089
-:1011800000C348210044102300021FC20043102165
-:1011900000021043184000100000302100402021C0
-:1011A00094E2000024E7000200C2302130E2007F18
-:1011B00014400006250800018D6300003C02007FFA
-:1011C0003442FF8000625824256700080104102A79
-:1011D0001440FFF3000000003C020800944223EC9E
-:1011E00000C230213122FFFF00C2302100061C0264
-:1011F00030C2FFFF006230210006140200C230211D
-:1012000000C0402100061027A5820010ADC00014C8
-:101210000A00049DADC000008DC7001000E0402111
-:101220001140000700072C0200AA3021000614021A
-:1012300030C3FFFF004330210006140200C2282102
-:1012400000051027A522000A3C030800946323D45C
-:101250003102FFFF01E210210043302300CD302195
-:1012600000061C0230C2FFFF00623021000614029B
-:1012700000C2302100C0402100061027A5820010C6
-:101280003102FFFF00051C0000431025ADC2001015
-:101290003C0208008C4223F4104000052DE205EBCF
-:1012A0001440000225E2FFF234028870A5C2003427
-:1012B0003C030800246323E88C6200002442000100
-:1012C000AC6200003C0408008C8423E43C0208006B
-:1012D0008C421BC03303FFFF0083202100431821F1
-:1012E0000062102B3C010800AC2423E410400003F2
-:1012F0002482FFFF3C010800AC2223E43C010800EB
-:10130000AC231BC003E0000827BD002027BDFFB8A9
-:101310003C05080024A51B96AFBF0044AFBE0040AB
-:10132000AFB7003CAFB60038AFB50034AFB4003053
-:10133000AFB3002CAFB20028AFB10024AFB0002093
-:1013400094A900003C020800944223D03C0308000A
-:101350008C631BB03C0408008C841BAC012210235E
-:101360000064182AA7A9001E106000BEA7A20016DC
-:1013700024BE002297B6001E24B3001A24B700161C
-:101380008FC2000014400008000000008FC2FFF868
-:1013900097A300168FC4FFF4004310210082202A77
-:1013A000148000B00000000097D5081832A2FFFF9B
-:1013B000104000A3000090210040A02100008821DF
-:1013C0000E000625000000000040302114C0000778
-:1013D000000000003C0208008C4223DC2442000193
-:1013E0003C0108000A000596AC2223DC3C100800F2
-:1013F000021180218E101BC89608000A310200409D
-:10140000104000052407180C8E02000C2407188CCD
-:1014100000021400ACC200183102008054400001E8
-:1014200034E700103C020800005110218C421BD010
-:101430003C030800007118218C631BD400021500C6
-:1014400000031C0000431025ACC2001496040008E1
-:101450003242FFFF008210210282102A1440000253
-:1014600002B22823008028218E020000024590212C
-:10147000ACC200008E02000400C020212631001002
-:10148000AC82000430E2FFFFAC800008A485000EAF
-:10149000AC820010240203050E0005A2A482000CF9
-:1014A0003242FFFF0054102B1440FFC53242FFFFB1
-:1014B0000A00058E000000008E6200008E63FFFCB3
-:1014C0000043102A10400067000000008E62FFF009
-:1014D000000289003C100800021180210E00062540
-:1014E0008E101BC80040302114C000050000000011
-:1014F0008E62082C244200010A000596AE62082C78
-:101500009608000A31020040104000052407180C1C
-:101510008E02000C2407188C00021400ACC20018C4
-:101520003C020800005110218C421BD03C030800F3
-:10153000007118218C631BD40002150000031C00ED
-:1015400000431025ACC200148E63FFF4960200081D
-:10155000004320233242FFFF3083FFFF004310216E
-:1015600002C2102A104000030080282197A9001E03
-:10157000013228238E62000030A4FFFF00441021B6
-:10158000AE620000A4C5000E8E020000ACC20000D6
-:101590008E0200048E63FFF400431021ACC20004ED
-:1015A0008E63FFF496020008006418210062102A7E
-:1015B00014400006024590218E62FFF0AE60FFF4F9
-:1015C000244200010A000571AE62FFF0AE63FFF431
-:1015D000ACC000083242FFFF105600033102000485
-:1015E000104000062402030531020080544000012F
-:1015F00034E7001034E7002024020905A4C2000CDF
-:101600008EE300008EE20004146200073C02B49AEC
-:101610008EE208605440000134E704003C024B6550
-:101620000A00058834427654344289ABACC2001CAF
-:1016300030E2FFFFACC200100E0005A200C0202166
-:101640003242FFFF0056102B1440FF9B00000000A9
-:101650008E6200008E63FFFC0043102A1440FF4896
-:10166000000000008FBF00448FBE00408FB7003CD9
-:101670008FB600388FB500348FB400308FB3002C94
-:101680008FB200288FB100248FB0002003E0000843
-:1016900027BD004827BDFFE8AFBF0014AFB0001062
-:1016A0008F6244508F6344100A0005B1008080218E
-:1016B0008F626820304220001040000300000000CC
-:1016C0000E0001F0000020218F6244508F6344100F
-:1016D0003042FFFF0043102B1440FFF500000000D4
-:1016E0008F630C143063000F2C6200021440000B57
-:1016F000000000008F630C143C0208008C421B4069
-:101700003063000F244200013C010800AC221B4062
-:101710002C6200021040FFF700000000AF705C1860
-:101720008F625C103042000210400009000000008F
-:101730008F626820304220001040FFF80000000057
-:101740000E0001F0000020210A0005C40000000086
-:101750008FBF00148FB0001003E0000827BD0018F1
-:1017600000000000000000000000000027BDFFE8AE
-:101770003C1BC000AFBF0014AFB00010AF60680CDE
-:101780008F62680434420082AF6268048F63400055
-:1017900024020B503C010800AC221B5424020B789D
-:1017A0003C010800AC221B6434630002AF634000BC
-:1017B0000E000605008080213C010800A0221B6865
-:1017C000304200FF24030002144300050000000023
-:1017D0003C0208008C421B540A0005F8AC5000C0C3
-:1017E0003C0208008C421B54AC5000BC8F62443455
-:1017F0008F6344388F6444103C010800AC221B5CAA
-:101800003C010800AC231B6C3C010800AC241B58B5
-:101810008FBF00148FB0001003E0000827BD001830
-:101820003C0408008C8700003C03AA553463AA5589
-:101830003C06C003AC8300008CC2000014430007C8
-:10184000240500023C0355AA346355AAAC8300006A
-:101850008CC2000050430001240500013C02080036
-:10186000AC47000003E0000800A0102127BDFFF8EE
-:1018700018800009000028218F63680C8F62680CB3
-:101880001043FFFE0000000024A5000100A4102A60
-:101890001440FFF90000000003E0000827BD000825
-:1018A0008F6344503C0208008C421B5C00031C0206
-:1018B0000043102B144000083C0380003C04080047
-:1018C0008C841B6C8F62445000021C020083102B1E
-:1018D0001040FFFC3C038000AF6344448F624444EB
-:1018E000004310241440FFFD000000008F624448B4
-:1018F00003E000083042FFFF3082FFFF2442E00097
-:101900002C422001144000033C0240000A0006481B
-:101910002402FFFF00822025AF645C388F625C30B8
-:10192000304200021440FFFC0000102103E00008D8
-:10193000000000008F6244503C0308008C631B5879
-:101940000A0006513042FFFF8F6244503042FFFFD1
-:101950000043102B1440FFFC0000000003E00008CF
-:101960000000000027BDFFE0008028213C040800A3
-:1019700024841AF00000302100003821AFBF001885
-:10198000AFA000100E00067CAFA000140A00066095
-:10199000000000008FBF001803E0000827BD0020F2
-:1019A0000000000000000000000000003C020800F1
-:1019B000344230003C030800346330003C0408002B
-:1019C000348437FF3C010800AC221B742402004021
-:1019D0003C010800AC221B783C010800AC201B70C5
-:1019E000AC600000246300040083102B5040FFFD16
-:1019F000AC60000003E00008000000000080482107
-:101A00008FAA00103C0208008C421B703C040800A6
-:101A10008C841B788FAB0014244300010044102BEE
-:101A20003C010800AC231B7014400003000040215F
-:101A30003C010800AC201B703C0208008C421B706B
-:101A40003C0308008C631B749124000000021140C9
-:101A5000004310210048102125080001A044000087
-:101A6000290200081440FFF4252900013C02080067
-:101A70008C421B703C0308008C631B748F64680CE1
-:101A80000002114000431021AC440008AC45000C9A
-:101A9000AC460010AC470014AC4A001803E0000844
-:101AA000AC4B001C00000000000000004D61696E9E
-:101AB00043707542000000004D61696E43707541CE
-:101AC00000000000000000000000000073746B6F55
-:101AD00066666C64496E000073746B6F66662A2AD2
-:101AE0000000000053774576656E743000000000FA
-:101AF000000000000000000000000000666174614A
-:101B00006C45727200000000000000000000000040
-:101B100000000000000000000000000000000000C5
-:101B200000000000000000000000000000000000B5
-:101B300073746B6F66666C645F76312E362E300080
-:101B40000000000000000000000000000000000095
-:0C1B500000000000000000000000000089
-:00000001FF
- * Firmware is:
- * Derived from proprietary unpublished source code,
- * Copyright (C) 2000-2003 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware
- * data in hexadecimal or equivalent format, provided this copyright
- * notice is accompanying it.
diff --git a/firmware/tigon/tg3_tso5.bin.ihex b/firmware/tigon/tg3_tso5.bin.ihex
deleted file mode 100644
index 33672514eab3..000000000000
--- a/firmware/tigon/tg3_tso5.bin.ihex
+++ /dev/null
@@ -1,252 +0,0 @@
-:10000000010200000001000000000FD80C004003B6
-:100010000000000000010F040000000010000003B9
-:10002000000000000000000D0000000D3C1D00015C
-:1000300037BDE00003A0F0213C10000126100000B5
-:100040000C004010000000000000000D27BDFFE084
-:100050003C04FEFEAFBF00180C0042E834840002EE
-:100060000C004364000000003C03000190630F3467
-:10007000240200023C04000124840E9C146200034C
-:10008000240500013C04000124840E902406000293
-:1000900000003821AFA000100C004378AFA000147E
-:1000A0000C00402C000000008FBF001803E0000887
-:1000B00027BD0020000000000000000027BDFFE079
-:1000C000AFBF001CAFB20018AFB100140C0042D497
-:1000D000AFB000103C128000241100018F70681036
-:1000E0003202040010400007000000008F64100876
-:1000F0000092102414400003000000000C00406433
-:10010000000000003C02000190420F561051000315
-:10011000320202001040FFF1000000000C0041B468
-:100120000000000008004034000000008FBF001CE9
-:100130008FB200188FB100148FB0001003E00008D8
-:1001400027BD002027BDFFE03C04000124840EB041
-:10015000000028210000302100003821AFBF001826
-:10016000AFA000100C004378AFA000140000D02115
-:1001700024020130AF6250003C010001A4200F5066
-:100180003C010001A0200F578FBF001803E00008BA
-:1001900027BD002000000000000000003C0300011B
-:1001A00024630F609062000027BDFFF0144000033D
-:1001B0000080C02108004073000048213C0220005C
-:1001C00003021024104000032409000208004073B9
-:1001D000A0600000240900010018104030431F8077
-:1001E000346F80081520004B25EB00283C040001EB
-:1001F000008320218C8480103C05000124A50F7A07
-:1002000000041402A0A200003C010001A0240F7B06
-:100210003C02000100431021944280143C01000183
-:10022000A0220F7C3C0C0001018360218D8C801882
-:10023000304200FF24420008000220C324020001D3
-:100240003C010001A0220F600124102B1040000C83
-:100250000000382124A6000E016028218CA2000095
-:100260008CA3000424A5000824E70001ACC2000010
-:10027000ACC3000400E4102B1440FFF824C60008AF
-:10028000000038213C08000125080F7B9106000082
-:100290003C02000190420F7C2503000D00C3282181
-:1002A0000046102300021FC2004310210002104329
-:1002B0001840000C0000202191020001004610238C
-:1002C00000021FC2004310210002184394A2000044
-:1002D00024E700010082202100E3102A1440FFFBE4
-:1002E00024A5000200041C023082FFFF00622021CE
-:1002F00000041402008220213C02FFFF018210242E
-:100300003083FFFF004310253C010001080040FA44
-:10031000AC220F803C05000124A50F7C90A20000B8
-:100320003C0C0001018360218D8C8018000220C2EA
-:100330001080000E000038210160302124A5000C3F
-:100340008CA200008CA3000424A5000824E700016F
-:10035000ACC20000ACC3000400E4102B1440FFF852
-:1003600024C600083C05000124A50F7C90A20000D3
-:1003700030430007240200041062001128620005C7
-:10038000104000052402000210620008000710C09F
-:10039000080040FA00000000240200061062000E6F
-:1003A000000710C0080040FA0000000000A2182159
-:1003B0009463000C004B1021080040FAA443000095
-:1003C000000710C000A218218C63000C004B102104
-:1003D000080040FAAC43000000A218218C63000C16
-:1003E000004B202100A21021AC8300009442001099
-:1003F000A482000495E700063C02000190420F7CB5
-:100400003C03000190630F7A00E2C8233C02000124
-:1004100090420F7B2463002801E3402124420028FE
-:100420001520001201E2302194C2000C3C010001B1
-:10043000A4220F7894C2000494C300063C0100017A
-:10044000A4200F763C010001A4200F7200021400CA
-:10045000004310253C010001AC220F6C9502000402
-:100460003C01000108004124A4220F703C0200015D
-:1004700094420F703C03000194630F7200431021FB
-:10048000A50200043C02000194420F6CA4C20004C7
-:100490003C0200018C420F6CA4C200063C04000127
-:1004A00094840F723C02000194420F703C0A0001D8
-:1004B000954A0F76004418213063FFFF0062182A26
-:1004C000240200021122000B008320233C030001C0
-:1004D00094630F7830620009104000063062FFF626
-:1004E000A4C2000C3C02000194420F783042000983
-:1004F00001425023240200011122001B2922000284
-:1005000050400005240200021120000731A2FFFF25
-:1005100008004197000000001122001D240200166F
-:100520000800419731A2FFFF3C0E000195CE0F80DD
-:10053000108000050180682101C4202100041C02F4
-:100540003082FFFF00627021000E1027A502000A12
-:100550003C03000190630F7B31A2FFFF00E21021FA
-:100560000800418D004320233C02000194420F808B
-:100570000044202100041C023082FFFF0062202181
-:10058000008070210004102708004185A502000AA0
-:100590003C05000124A50F7A90A30000146200021C
-:1005A00024E2FFF2A5E2003490A2000000E2102352
-:1005B000A50200023C03000194630F803C0200018D
-:1005C00094420F5A30E5FFFF0064182100451023C4
-:1005D0000062202300041C023082FFFF0062202101
-:1005E00000041027A502000A3C03000190630F7C61
-:1005F0002462000114A20005008070210163102113
-:10060000904200000800418500026200246200025E
-:1006100014A20003306200FE004B1021944C000035
-:100620003C02000194420F823183FFFF3C04000131
-:1006300090840F7B0043102100E21021004420230E
-:10064000008A202100041C023082FFFF006220216A
-:100650000004140200822021008068210004102779
-:10066000A4C2001031A2FFFF000E1C0000431025A1
-:100670003C04000124840F72ADE20010948200005B
-:100680003C05000194A50F763C0300018C630F6CC0
-:100690002442000100B92821A48200003322FFFF78
-:1006A000006220210083182B3C010001A4250F7655
-:1006B0001060000324A2FFFF3C010001A4220F767A
-:1006C0003C024000030210253C010001AC240F6CE9
-:1006D000AF62100803E0000827BD00103C030001D2
-:1006E00090630F5627BDFFE824020001AFBF00143E
-:1006F00010620026AFB000108F620CF42442FFFF9E
-:100700003042007F000211008C4340003C01000198
-:10071000AC230F648C434008244440008C5C4004AC
-:1007200030620040144000022402008824020008C5
-:100730003C010001A4220F68306200041040000553
-:10074000240200013C010001A0220F57080041D5FE
-:10075000000314023C010001A0200F570003140203
-:100760003C010001A4220F549483000C24020001D8
-:100770003C010001A4200F503C010001A0220F56B3
-:100780003C010001A4230F62240200011342001E59
-:10079000000000001340000524020003134200671C
-:1007A00000000000080042CF000000003C020001F1
-:1007B00094420F62241A00013C010001A4200F5E44
-:1007C0003C010001A4200F52304407FF00021BC26D
-:1007D000000318233063003E3463003600021242E7
-:1007E0003042003C006218213C010001A4240F5853
-:1007F00000832021246300303C010001A4240F5A0F
-:100800003C010001A4230F5C3C06000124C60F52EA
-:1008100094C5000094C300023C04000194840F5A64
-:10082000006510210044102A104000133C10800085
-:1008300000A31021A4C200003C02A000AF620CF48F
-:100840003C010001A0200F568F6410080090102476
-:1008500014400003000000000C0040640000000091
-:100860008F620CF400501024104000B7000000000C
-:100870000800420F000000003C03000194630F5089
-:1008800000851023A4C40000006218213042FFFF3D
-:100890003C010001A4230F50AF620CE83C020001B0
-:1008A00094420F6834420024AF620CEC94C30002FF
-:1008B0003C02000194420F50146200123C0280007E
-:1008C0003C1080003C02A000AF620CF43C0100012F
-:1008D000A0200F568F6410080090102414400003CD
-:1008E000000000000C004064000000008F620CF467
-:1008F000005010241440FFF700000000080042CF11
-:10090000241A0003AF620CF43C1080008F641008BE
-:100910000090102414400003000000000C0040640C
-:10092000000000008F620CF4005010241440FFF708
-:1009300000000000080042CF241A00033C07000119
-:1009400024E70F5094E2000003821021AF620CE014
-:100950003C0200018C420F64AF620CE43C050001D4
-:1009600094A50F5494E300003C04000194840F58B4
-:100970003C02000194420F5E00A328230082202342
-:1009800030A6FFFF3083FFFF00C3102B144000434D
-:10099000000000003C02000194420F5C00021400C1
-:1009A00000621025AF620CE894E200003C030001F5
-:1009B00094630F5400441021A4E200003042FFFF72
-:1009C000144300213C0200083C02000190420F57F2
-:1009D000104000063C03000C3C02000194420F68EA
-:1009E000346306240800427C0000D0213C02000150
-:1009F00094420F683C03000834630624004310252A
-:100A0000AF620CEC3C1080003C02A000AF620CF422
-:100A10003C010001A0200F568F64100800901024A4
-:100A200014400003000000000C00406400000000BF
-:100A30008F620CF4005010241040001500000000DC
-:100A400008004283000000003C03000194630F682B
-:100A5000344206243C108000006218253C028000CD
-:100A6000AF630CECAF620CF48F641008009010249C
-:100A700014400003000000000C004064000000006F
-:100A80008F620CF4005010241440FFF700000000A7
-:100A90003C010001080042CFA4200F5E3C0200018F
-:100AA00094420F5C0002140000C21025AF620CE8F3
-:100AB0003C02000190420F57104000093C03000C1B
-:100AC0003C02000194420F68346306240000D021E8
-:100AD00000431025AF620CEC080042C13C108000BE
-:100AE0003C02000194420F683C0300083463060492
-:100AF00000431025AF620CEC3C02000194420F5EF3
-:100B0000004510213C010001A4220F5E3C10800032
-:100B10003C02A000AF620CF43C010001A0200F5683
-:100B20008F6410080090102414400003000000009F
-:100B30000C004064000000008F620CF40050102490
-:100B40001440FFF7000000008FBF00148FB00010AA
-:100B500003E0000827BD00180000000027BDFFE0EB
-:100B60003C04000124840EC0000028210000302134
-:100B700000003821AFBF0018AFA000100C00437870
-:100B8000AFA000140000D02124020130AF62500059
-:100B90003C010001A4200F503C010001A0200F5790
-:100BA0008FBF001803E0000827BD002027BDFFE825
-:100BB0003C1BC000AFBF0014AFB00010AF60680CAA
-:100BC0008F62680434420082AF6268048F63400021
-:100BD00024020B503C010001AC220F2024020B78B0
-:100BE0003C010001AC220F3034630002AF634000CF
-:100BF0000C004315008080213C010001A0220F342D
-:100C0000304200FF240300021443000500000000EE
-:100C10003C0200018C420F2008004308AC5000C089
-:100C20003C0200018C420F20AC5000BC8F62443467
-:100C30008F6344388F6444103C010001AC220F28BC
-:100C40003C010001AC230F383C010001AC240F240F
-:100C50008FBF00148FB0001003E0000827BD0018FC
-:100C600003E000082402000127BDFFF818800009F6
-:100C7000000028218F63680C8F62680C1043FFFE10
-:100C80000000000024A5000100A4102A1440FFF970
-:100C90000000000003E0000827BD00088F634450F7
-:100CA0003C0200018C420F2800031C020043102B61
-:100CB000144000083C0380003C0400018C840F3881
-:100CC0008F62445000021C020083102B1040FFFC76
-:100CD0003C038000AF6344448F62444400431024CB
-:100CE0001440FFFD000000008F62444803E000084C
-:100CF0003042FFFF3082FFFF2442E0002C422001FF
-:100D0000144000033C024000080043472402FFFF58
-:100D100000822025AF645C388F625C303042000274
-:100D20001440FFFC0000102103E000080000000058
-:100D30008F6244503C0300018C630F240800435031
-:100D40003042FFFF8F6244503042FFFF0043102BC0
-:100D50001440FFFC0000000003E000080000000059
-:100D600027BDFFE0008028213C04000124840ED030
-:100D70000000302100003821AFBF0018AFA00010E4
-:100D80000C004378AFA000140800435F000000008F
-:100D90008FBF001803E0000827BD00203C020001BF
-:100DA0003442D6003C0300013463D6003C04000109
-:100DB0003484DDFF3C010001AC220F4024020040DE
-:100DC0003C010001AC220F443C010001AC200F3C6F
-:100DD000AC600000246300040083102B5040FFFD32
-:100DE000AC60000003E00008000000000080482123
-:100DF0008FAA00103C0200018C420F3C3C04000111
-:100E00008C840F448FAB0014244300010044102B4A
-:100E10003C010001AC230F3C1440000300004021C2
-:100E20003C010001AC200F3C3C0200018C420F3C15
-:100E30003C0300018C630F4091240000000211402C
-:100E4000004310210048102125080001A0440000A3
-:100E5000290200081440FFF4252900013C0200018A
-:100E60008C420F3C3C0300018C630F408F64680C84
-:100E70000002114000431021AC440008AC45000CB6
-:100E8000AC460010AC470014AC4A001803E0000860
-:100E9000AC4B001C00000000000000004D61696EBA
-:100EA00043707542000000004D61696E43707541EA
-:100EB00000000000000000000000000073746B6F71
-:100EC00066666C64000000000000000073746B6FC5
-:100ED00066666C64000000000000000066617461DA
-:100EE0006C4572720000000000000000000000006D
-:100EF00000000000000000000000000000000000F2
-:100F000000000000000000000000000000000000E1
-:100F100073746B6F66666C645F76312E322E3000B0
-:0C0F2000000000000000000000000000C5
-:00000001FF
- * Firmware is:
- * Derived from proprietary unpublished source code,
- * Copyright (C) 2000-2003 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware
- * data in hexadecimal or equivalent format, provided this copyright
- * notice is accompanying it.
-/* 5705 needs a special version of the TSO firmware. */
diff --git a/firmware/ttusb-budget/dspbootcode.bin.ihex b/firmware/ttusb-budget/dspbootcode.bin.ihex
deleted file mode 100644
index b4b2247077c4..000000000000
--- a/firmware/ttusb-budget/dspbootcode.bin.ihex
+++ /dev/null
@@ -1,820 +0,0 @@
-:1000000008AA001800030800001000000180185F13
-:100010000000018077182AEB6BF8001803FF68F8DE
-:100020000018FFFEF7B8F7BEF6B9F4A0F6B7F6B5BC
-:10003000F6B6F02019DFF1000001F84D01ABF6B87B
-:10004000F02019DFF07301A57EF80012F000000126
-:1000500047F800117E9200F80011F00000017EF8D0
-:100060000011F00000016C89019AF7B8EEFCF02055
-:10007000FFFFF1000001F84D01BFF27301B94E021C
-:10008000F495F5E356027E001100FA4C01B76B03BC
-:100090000001F6B8EE04F0740DA7F07401C54A1122
-:1000A0004A1672112AE610F80011FA4501DBF495A0
-:1000B000EEFF4811F0002AC68816F495F49510EE6C
-:1000C000FFFFF4E36CE9FFFF01D510F82AE7F845DC
-:1000D00001E210F82AE7F4E3F07401FFEE018A165A
-:1000E0008A11FC00F7B8E9204A1109F82AE6F84E0F
-:1000F00001F3F27301FDF495E80172112AE649114A
-:1001000080E12AC6F3000001E80081F82AE68A119E
-:10011000FC00F495F073020010F82A0FFC004A115D
-:10012000F074020280F82A107308000940F82A15BA
-:1001300082F80011F495771003E8F5A9F830022150
-:1001400071F82A102A1556F82A0CF0E34EF82A16F0
-:10015000E8004EF82A0C8A11FC004A064A074A1D9C
-:1001600068F800077D3F69F80007400068F8001D47
-:10017000FFFC6BF82A0F00018A1D8A078A06F4EB40
-:10018000EEFD76F82A0F000076000000FB80194C87
-:10019000F495E80080F82A11F980190780F82A0EF2
-:1001A000F980166676002A1210F82A11F98018E3F1
-:1001B00010F82A0EF980166610F82A0EF9801687B4
-:1001C000EE03FC004A11F6B8F495F020800011F817
-:1001D0002A5AF84D029311F82A9FF84C027C7712A4
-:1001E0002A39491201F82A9F8911F495F4957181F1
-:1001F00000116CE1FFAB02936BF82A9F0001E90547
-:1002000001E2000381F82AA0F073029572112A9F7F
-:10021000F49510E12A396BF82A9F000111F82A9F02
-:1002200009F82AA0F84C029376F82A5A000076F8CA
-:100230002A9F000076F82AA000008811F495481142
-:100240008A11FC004A11EEFE10F82A5AF84402B254
-:1002500076F82A5A0001F07402588811F495771044
-:100260008000F4A9F83002B24811F03000FF80009D
-:1002700010F82A5BF98018D6EE028A11FC00F4957A
-:100280004A084A094A0A4A0B4A0C4A0D4A104A11BE
-:100290004A124A134A144A154A164A174A174A1963
-:1002A0004A0E4A064A074A1A4A1D4A1B4A1C68F85F
-:1002B00000077D3F69F80007400068F8001DFFFC5B
-:1002C000481868F80018FFFEF495F4954A08EEFD0A
-:1002D000F07402588811F49577108000F4A9F83072
-:1002E00002EF4811F03000FF800010F82A5BF9801F
-:1002F00018D6EE038A18F4958A1C8A1B8A1D8A1A5E
-:100300008A078A068A0E8A198A178A178A168A1510
-:100310008A148A138A128A118A108A0D8A0C8A0B0F
-:100320008A0A8A098A08F4EB4A1177112A397681F8
-:10033000005577122A1810E2000180E1000110E256
-:10034000000280E1000276E10003000076E1000493
-:1003500000AAF07402988A11FC004A118811F495E1
-:10036000F49510816FF82A9E0C88E8FF18E10001CF
-:100370001AF82A9EF0301FFF80F82A9E8A11FC008E
-:100380004A1177112A397681005577122A1811E21D
-:10039000000181E1000111E2000281E1000276E149
-:1003A0000003000248086FE100040C98F03000FFE1
-:1003B00080E1000576E1000600AAF07402988A1137
-:1003C000FC004A1177112A397681005577122A18D4
-:1003D00010E2000180E1000110E2000280E1000271
-:1003E00076E1000300044811F00000048812F4953F
-:1003F00077132A76E900E598F3000001F6B8480B78
-:1004000008F82A3CF8430371768200AAF074029837
-:100410008A11FC004A11EEF08811F495F49571816F
-:10042000001471E1000100154911F3000002891167
-:10043000E7826DEA0004E7836DEB000A771A000596
-:10044000F07203AA1181F2E88082E9FF19E100014C
-:10045000F1A0819211E1000CF2E88083E9FF19E13B
-:10046000000DF1A081936DE9000248184918700051
-:100470000015F0000004F300000A80018102F2740C
-:100480000E54F4954814EE108A11FC004A11F074D1
-:100490000C5E80F82A5C77122A3976820055771133
-:1004A0002A1810E1000180E2000110E1000280E260
-:1004B000000276E20003001CF6B856F82A16F0F0A7
-:1004C000F0F880E2000756F82A16F1F0E8FFF28013
-:1004D00080E2000656F82A16F1F8E8FFF28080E282
-:1004E000000557F82A16E8FFF28080E2000456F86B
-:1004F000276CF0F0F0F880E2000B56F8276CF1F072
-:10050000E8FFF28080E2000A56F8276CF1F8E8FF75
-:10051000F28080E20009E8FF57F8276CF28080E261
-:10052000000856F8276AF0F0F0F880E2000F56F85D
-:10053000276AF1F0E8FFF28080E2000E56F8276AA1
-:10054000F1F8E8FFF28080E2000D57F8276AE8FF33
-:10055000F28080E2000C76E20013000076E20012E6
-:1005600000006FF82A5C0C5880E20011E8FF18F8D0
-:100570002A5C80E2001076E20017000076E20016A6
-:1005800000006FF82A9E0C5880E20015E8FF18F86A
-:100590002A9E80E2001476E2001B000076E2001A38
-:1005A000000076E20019000070E20018276E76E283
-:1005B000001F000076E2001E000076E2001D000031
-:1005C00076E2001C000076E2002000AAF074029897
-:1005D0008A11FC004A11EEFE10F82A38F84504EDA5
-:1005E00077122A1810E200028811F495771000089B
-:1005F0006DE9FFDFF6A9F8200475F073047DF010B3
-:100600000021F0001A8348087EF80008F4E2F07434
-:10061000030AF07304EA4812F2740323F0000004A2
-:10062000F2740336F495E800F07304EA77112A189F
-:10063000E8FF6FE100040D4818E10005F274096954
-:10064000F495F2A0F0740336F07304EA77112A18D7
-:10065000E8FF6FE100040D4818E10005F27409415C
-:10066000F495F2A0F0740336F07304EAF0740357C3
-:10067000F07304EA10F82A1CF07412A4F274033622
-:10068000F495E800F07304EA4812F2740380F00075
-:100690000004F2740336F495E800F07304EA10F8ED
-:1006A0002A1CF07412C5F2740336F495E800F07356
-:1006B00004EA77112A18E8FF6FE100060D4818E1F7
-:1006C000000771E100050012F2A070000012800125
-:1006D00010E10004F0740E7AF2740336F495E80029
-:1006E000F07304EAF07403BC76F82A380000EE02D6
-:1006F0008A11FC004A1177112A3976810055771248
-:100700002A1810E2000180E1000110E2000280E1FD
-:10071000000276E1000300094811F000000488128D
-:10072000F49577132A86E900E598F3000001F6B8FE
-:10073000480B08F82A3CF843050A768200AAF074B0
-:1007400002988A11FC004A1177112A3976810055E6
-:1007500077132A1810E3000180E1000110E3000282
-:1007600080E1000213E3000381E1000348117711E7
-:100770000000F84D0544F000000488124813F00012
-:1007800000048813F495F495E5986D91F6B8481136
-:1007900008F82A3CF843053AF0202A394911F500B7
-:1007A0008911F495F49576E1000400AAF07402989A
-:1007B0008A11FC004A1177112A3976810055771287
-:1007C0002A1810E2000180E1000110E2000280E13D
-:1007D000000276E10003000C4811F00000048812CA
-:1007E000F49577132A7AE900E598F3000001F6B84A
-:1007F000480B08F82A3CF843056A768200AAF07490
-:1008000002988A11FC004A1177112A397681005525
-:1008100077122A1810E2000180E1000110E20002C4
-:1008200080E1000276E1000300194811F0000004A5
-:100830008812F49577132A5DE900E598F30000012A
-:10084000F6B8480B08F82A3CF8430593768200AACC
-:10085000F07402988A11FC004A11881110F82A38A5
-:10086000F84405E310F82AA1F84405BA6CE1FF56F4
-:1008700005E372122AA1F49570E22A1800116BF8B0
-:100880002AA10001F07305E372122AA1F49570E227
-:100890002A18001110F82AA1F00000018812F4951E
-:1008A000F4956EE2FFFC05D173122AA14811F00005
-:1008B000000580F82AA210F82AA108F82AA2F84414
-:1008C00005E36CE1FFAB05DD76F82A38000176F828
-:1008D0002AA1000076F82AA200008A11FC00F495F3
-:1008E0004A084A094A0A4A0B4A0C4A0D4A104A1158
-:1008F0004A124A134A144A154A164A174A174A19FD
-:100900004A0E4A064A074A1A4A1D4A1B4A1C68F8F8
-:1009100000077D3F69F80007400068F8001DFFFCF4
-:10092000481868F80018FFFEF495F4954A08EEFFA1
-:1009300010F82A5BF9801804F07405A2EE018A18F9
-:10094000F4958A1C8A1B8A1D8A1A8A078A068A0ECF
-:100950008A198A178A178A168A158A148A138A129C
-:100960008A118A108A0D8A0C8A0B8A0A8A098A08D7
-:10097000F4EBEEFD76F82A38000076F82A5A0000EB
-:10098000E8014E00FB8017D6F495E80180F82A5B59
-:1009900076002A8FF98016AA10F82A5BF980175C76
-:1009A00010F82A5BF980176FFB801666F495E81A39
-:1009B000FB801687F495E81AFB801666F495E81B11
-:1009C000FB801687F495E81BEE03FC004A11F495B2
-:1009D00013028811E800F84D066AF3100001891A25
-:1009E000F495F07206691C918A11FC004A11881175
-:1009F00012031102F8450679F0100001881AF495E7
-:100A0000F072067881918A11FC004A11F495710206
-:100A10000011110361F800110001F8300691F6B8D9
-:100A20006FF800110C1F8811F3E8E8FF1881F1A09E
-:100A30008181F073069DF6B86FF800110C1F8811C4
-:100A4000F33000FFF020FF001881F1A081818A11AE
-:100A5000FC004A11F495110261F8000B0001F82026
-:100A600006B1490BF61F8811F495F4951081F273C5
-:100A700006B8F03000FF490BF61F8811F495F49585
-:100A80001281F4788A11FC004A11F4957102001267
-:100A900013038811E800F84D06CCF3100001891A01
-:100AA000F495F07206CB1192F2C081918A11FC008C
-:100AB0008812120271010013F84506DBF0100001E4
-:100AC000881AF495F07206DAE598FC004A11EEFEF9
-:100AD0008811110410067105001261F8001200015E
-:100AE000F82006EAF0000001F6B8F00000016FF807
-:100AF00000120F1F48088100F47F8001F27406BACB
-:100B0000F4954811EE028A11FC004A11EEFE88129B
-:100B1000110410067105001361F800130001F8209C
-:100B20000709F0000001F00000018811F6B86FF825
-:100B300000130F1F81004811F47F8001F27406CE6C
-:100B4000F49548124811F030FFFEEE028A11FC00C5
-:100B50004A114A164A17EEFCF495800271080016F5
-:100B60001009710B00178003710A00114817F8452E
-:100B7000073F700000111003F074069F80017000A1
-:100B800000161002F074067B6D916D966CEFFFFFFE
-:100B9000072FEE048A178A168A11FC004A11EEFE0E
-:100BA00010F82AE808F82AE9F845076476000001F9
-:100BB00062F82AE9005EF274120BF0003040721104
-:100BC0002AE97710000FF5A9F82007616BF82AE9E8
-:100BD0000001F073076476F82AE90000EE028A113A
-:100BE000FC004A118811E80075F800080008E800C8
-:100BF00075F800080009F6B8F495F020FC3F75F888
-:100C00000008000DF0200C3075F80008000C76F894
-:100C10002AE8000076F82AE900006C81079276F84D
-:100C20002AEA0000FB801676F495E810E80075F8D3
-:100C300000080000F07307A876F82AEA0001FB809C
-:100C40001666F495E810FB801687F495E810E80026
-:100C500075F800080000F6B8F495F020FFFF75F86D
-:100C6000000800008A11FC00F4954A084A094A0A63
-:100C70004A064A074A1D68F800077D3F69F80007E1
-:100C8000400068F8001DFFFC10F82AEAF84507E16B
-:100C900010F82AE8F0000001F030000F80F82AE890
-:100CA00010F82AE8F84407D6F6B8F495F020FC3F8F
-:100CB00075F80008000DF0200C3075F80008000CE5
-:100CC000E80075F800080000F6B8F495F020FFFF82
-:100CD00075F8000800008A1D8A078A068A0A8A09B0
-:100CE0008A08F4EBEEFFF2740767F495E801EE0171
-:100CF000FC004A074A1D68F800077D3F69F80007B5
-:100D0000400068F8001DFFFC8A1D8A07F4EB4A11B9
-:100D10007711002876812400E80075F800080001AA
-:100D2000F2740767F495E8007711001D6881007F71
-:100D3000F6B8F495F020FF807711001DF030010027
-:100D40001A818081F0740A33F07411ACF980132594
-:100D5000F9801653F9801782F074062FF98014B2C7
-:100D6000F9801910F0740DE3F07407E8F07402369E
-:100D70008A11FC004A1160F8277BFFFFF830083920
-:100D800071F8277B277960F82779FFFFF83008B2E0
-:100D900010F8298608F82779F0307FFF8811F4953C
-:100DA00077104000F6A9F830085810F8277908F8AD
-:100DB000277AF0307FFF8811F49577104000F6A96C
-:100DC000F820086376F82779FFFF76F8277BFFFF86
-:100DD000F7B8F27308D9F020FFFFF6B856F8277479
-:100DE000F0F9881156F82772F0F98812F495F49505
-:100DF000E720F4A9F830088FF120277C4811F6008D
-:100E00008813F495F495108308F82779F0307FFF64
-:100E10008813F49577104000F5ABF830088F6D918A
-:100E20004811F03001FF8811F495E720F7A9F83058
-:100E300008746D894811F03001FFF0E7F495480817
-:100E40004EF827744808F1F98911F495F49571E189
-:100E5000277C277A60F8277BFFFFF83008AB48082B
-:100E60004EF8277276F8277BFFFF76F82779FFFF89
-:100E7000F27308D9F495E80044F8277340F8277511
-:100E800082F80011F49577108000F6A9F82008D8B0
-:100E9000F6B810F82773F000800048084EF8277461
-:100EA0004808F0F98811F495F49571E1277C277AC8
-:100EB000F7B857F82774F062FFFFF040FF80F28028
-:100EC0004EF82774E8008A11FC004A114A16EEFB1E
-:100ED00011F8277109F8277389118810F495F49592
-:100EE000F6A9F82008EDF273090EF495E800F62053
-:100EF00076000041F07412EE8816F495F7B86D96FE
-:100F000010F80016F847090AE7617600000076013C
-:100F10000080760200FF76030000F2740CB9F495AD
-:100F2000E8006CE9FFFF08FB7316000EF066004155
-:100F3000EE058A168A11FC004A11F495710200131D
-:100F4000F6B877117FFF57F827724811F280F0004A
-:100F500080008811F640F0E0F1F1E801F28080F8BD
-:100F600027787712800057F827724812F28088128B
-:100F7000F495F4956C820938E80075F800080001D2
-:100F8000F073093DF020800175F8000800017081C0
-:100F900000138A11FC004A11F0307FFF11F82986F6
-:100FA000F520F3307FFF8911F49577104000F6A902
-:100FB000F8200954F2730967F495E8026FF8277A6C
-:100FC0000D20F3307FFF8911F49577104000F6A9CA
-:100FD000F8200964F2730967F495E80180F8277B2B
-:100FE000E8008A11FC004A1111F82986F520F33037
-:100FF0007FFF8911F49577104000F6A9F820097A4F
-:10100000F273098DF495E8026FF8277A0D20F3301A
-:101010007FFF8911F49577104000F6A9F820098A1E
-:10102000F273098DF495E80180F82779E8008A11B8
-:10103000FC004A11F495710200128811F6B857F8B5
-:101040002772F0207FFFF280F0008000808157F847
-:101050002772E801F3F1F28080F827787711800099
-:10106000481157F82772F2808811F495F4956C8135
-:1010700009B5E80075F800080001F07309BAF0201E
-:10108000800175F80008000145F8277143F82773BF
-:1010900083F80011F495E720F6A9F83009C9F27336
-:1010A00009E47712000057F82772F0207FFFF280E2
-:1010B0004912F500F300800061F8000B8000F83061
-:1010C00009DCF1208000F5208912F49548126FF8B0
-:1010D00027730D00F495490B4FF827728A11FE0013
-:1010E0004812F4954A114A164A17EEFCF495710815
-:1010F00000168817F0740830481870000016F27453
-:10110000098FF00000028811F495F4956C810A0AA9
-:10111000F27408DBF4954816481870000016F27453
-:10112000098FF00000028811100270010011800088
-:10113000F27406CEF495481749114817F60088173F
-:10114000E760F5A9F8200A2D4816F62088114818FE
-:1011500070000011F274098FF00000028811700114
-:10116000001110028000F27406CEF4954817EE04C8
-:1011700048168A178A168A11FC00EEFDE8004EF820
-:101180002770E8004EF82772E8004EF82774E80050
-:101190004EF8277676F82779FFFF76F8277A000051
-:1011A00076F8277BFFFF76F827780000E80075F8CF
-:1011B000000800017600000076010200F27412DCE3
-:1011C000F020277CEE03FC004A11EEFCF4954E0063
-:1011D00077127FFFF6B84912F180F3008000891280
-:1011E000F0E0F1F14F02E901F495480BF5405602A9
-:1011F000F18081F827787711800056004911F1803D
-:101200008911F495F4956C810A81E80075F800085D
-:101210000001F0730A86F020800175F800080001D3
-:101220001082EE048A11FC004A11EEFEF4954E0085
-:1012300077117FFFF6B84911F180F3008000891122
-:10124000F0E0F1F1E801F28080F827785600F12013
-:101250008000F180F495490BF84D0AABF020800135
-:1012600075F800080001F0730AAFE80075F800088F
-:101270000001EE0248118A11FC004A118812130283
-:1012800077110000F84D0ACBF3100001891AF4958C
-:10129000F0720ACA48111CF8297E881111F8297EBB
-:1012A000F200000180F8297E819248118A11FC0029
-:1012B0004A11F495710200118812F6B8F0207FFFF0
-:1012C00057F82770F280F0008000808257F827706E
-:1012D000E801F3F1F28080F8277877128000481255
-:1012E00057F82770F2808812F495F4956C820AF40E
-:1012F000E80075F800080001F0730AF9F020800199
-:1013000075F80008000145F82775E71043F82771C4
-:1013100083F800126DE800046D8AF6AAF8300B0A13
-:10132000F2730B257711000057F82770F0207FFF2C
-:10133000F2804911F500F300800061F8000B800095
-:10134000F8300B1DF1208000F5208911F49548112B
-:101350006FF827710D00F495490B4FF8277048116D
-:101360008A11FC004A114A164A17EEF08817101726
-:1013700080051016800610158007711400111005E5
-:10138000F030000188101006F0300001800849118B
-:101390001005F6018009100661F800080001F82028
-:1013A0000B4B1009F0000001800971080012F4AA2B
-:1013B000F8300B541009F00000018009120949119E
-:1013C000F47F8009F620800A56F827704E0C100929
-:1013D00080004818F2740ACEF00000048816F495D4
-:1013E000F4956C860B6DF2730C59F495E800F6B821
-:1013F000F495560CF0F98812F495F49570E2277C78
-:101400002986E800800E4811F8450BCC77100001C2
-:10141000F4A9F8300B896CE1FFFD0B8B10E700029B
-:10142000800EF0730B8B1087800EE710F5AEF8205E
-:101430000BB270000017700100161004F07406CE95
-:1014400048174916F60088174811F6208811100928
-:10145000F62080004818F2740ACEF00000048816C6
-:1014600010047000001770010011F07406CE4811CE
-:1014700000048004F0730BBC7000001770010011B1
-:101480001004F07406CE4811000480044911481677
-:10149000F6208816F495F4956C860BCC100A800023
-:1014A0004818F2740ACEF00000048816120AF845B3
-:1014B0000C33710A0010F4AEF8300C1C4816F0E141
-:1014C00088111208F8450BDB6D891207F8450BE906
-:1014D0001007800070020011100680011004F074E3
-:1014E00006DCF0730BEF48116F000C9F1004F074D2
-:1014F0000AB3110EF1C0810E10064911F6008006E4
-:101500001005F6208811F000000148086F000C9FBC
-:101510004818F2740ACEF00000041207F8450C11C6
-:101520001007800070020011100680011004F07492
-:1015300006DCF0730C1748116F000C9F1004F07458
-:101540000AB3110EF1C0810EF0730C331207F84587
-:101550000C2A10078000100680011005800210047C
-:10156000F07406DCF0730C3012056F000C9F100451
-:10157000F0740AB3110EF1C0810E76000001481814
-:10158000F2740ACEF0000004710400117081298603
-:10159000100E1CF82986800E760000014818F2749F
-:1015A0000ACEF0000004100E71040011808110F8C2
-:1015B0002986F0000001F0307FFF80F829861009AD
-:1015C000F00000028009EE108A178A168A11FC00CA
-:1015D00010F8277508F82771F01000014808FC0082
-:1015E0004A114A16EEFFF49571040016F00000014E
-:1015F00048084EF8297C6DEEFFFD4816F8450C9919
-:1016000056F8297CF0740A5A881110F8297DF000E8
-:10161000000148084EF8297C10F82982F0000001EA
-:101620008810F495F495F4A9FA300C9680F8298284
-:1016300056F82980F00000014EF8298073112982A4
-:101640006CEEFFFF0C76EE018A168A11FC004A113F
-:1016500076F82984000076F829850001E8004EF824
-:101660002A0C76F82986000076F829870000771181
-:1016700029887681AAAA76E10001AAAA76E1000269
-:1016800000008A11FC004A11EEFCF495710600146A
-:10169000710700137108001271090015771000FF1F
-:1016A000F4AAF8300D44491353F82A0C4FF82A0CC9
-:1016B0007312000EF166000D8911F4957710000188
-:1016C00071E124000011F4A9F8300D177710000221
-:1016D000F4A9F8300CEC7711298A76810000E80033
-:1016E0007714000077130000F0730D486C830CFA38
-:1016F0007711298A4812F0E8F04080008081E800E4
-:1017000077140000F0730D484913F340800081F80E
-:10171000298A61F800150001F8200D0769F8298A67
-:10172000400061F800140001F8200D0F69F8298AC3
-:1017300020007711298A4912F3E81B818181F07317
-:101740000D4811F82984F84C0D37771129887681D6
-:10175000AAAA11F82985F3100001F340AA0081E13B
-:101760000001760000028001700200147003001373
-:10177000F2740B28F495481171F829852984F073C7
-:101780000D737600000080017602000070030013E4
-:10179000F2740B28F495E800F0730D737711298A21
-:1017A0007081001311F82984F84C0D68771129888D
-:1017B0007681AAAA11F82985F3100001F340AA0046
-:1017C00081E10001760000038001700200147003C3
-:1017D0000013F2740B28F495481171F829852984B7
-:1017E000F0730D7376000001800170020014700325
-:1017F0000013F2740B28F49548116BF82984FFFF4D
-:10180000EE048A11FC004A11F540F495480BF47877
-:101810008811F495F4956CE1FFB90D88F2730DA56C
-:10182000F495E860F200000661F800110020F8303D
-:101830000D9861F8000B0001F8200DA3F2000007DD
-:10184000F0730DA361F8000B0001F8200DA1F273F5
-:101850000DA3F0000001F00000024808F47F8A1197
-:10186000FC00EEFFF07407FDF0740744F0740DB453
-:10187000F0740205F0740460F0730DAAEEFD10F828
-:101880002AA3F8440DCB10F82AA4F8450DD776000A
-:101890000200F27409E8F020220076F82AA4000081
-:1018A00076F82AA70000F0730DD776000200F274D4
-:1018B00009E8F020200076F82AA3000076F82AA78D
-:1018C0000001F0740C5EF0E0F0103A98F8470DE17A
-:1018D00076F8276E0000EE03FC004A11EEFE771149
-:1018E00020007600AAAA76010200F274066CF49534
-:1018F000481176005555760102004811F274066CC5
-:10190000F000020076F82AA3000076F82AA400006E
-:10191000E8004E00FB80153EF495E80480F82AA507
-:1019200076002AA8F980148776002AADFB8013621E
-:10193000F495E80210F82AA5F9801463FB80166676
-:10194000F495E81CFB801687F495E81CE8014E002E
-:10195000FB8017D6F495E80080F82AA676002AB70F
-:10196000F98016AA10F82AA6F980175C10F82AA6A2
-:10197000F980176FEE028A11FC00F4954A084A09B3
-:101980004A0A4A074A1D68F800077D3F69F80007C0
-:10199000400068F8001DFFFC10F82AA7F8440E4B21
-:1019A00076F82AA30001F0730E4E76F82AA40001FF
-:1019B0008A1D8A078A0A8A098A08F4EB4A114A169C
-:1019C0004A17EEFE880E71080016710600171107FF
-:1019D000F066000DF00025A0881176010006810058
-:1019E000F27406CEF00000017601000670000016C9
-:1019F0004811F27406CEF000000770810017EE0265
-:101A00008A178A168A11FC004A11880E7102001288
-:101A10001103F066000DF00024008811F495708128
-:101A200000126EE2FFFE0E8DF495E800E80180E101
-:101A3000000276E1000300FF76E10004000076E199
-:101A4000000B000076E1000C000081E100018A112A
-:101A5000FC004A11EEFC880EF495F166000DF300CF
-:101A600024008911F495F49576E1000C000076E1EC
-:101A7000000B000076E10002000176000000760114
-:101A80000000800276030000F2740CB9F495E800BF
-:101A9000EE048A11FC004A118819F4957319000E9E
-:101AA000F166000DF2002400771525A077140000E0
-:101AB000771A001FF0720F14F6B849190985F84C0F
-:101AC0000F13F100000589114915F3000001891376
-:101AD0004915F3000007891211931D91199289107D
-:101AE000F495F4956C800F1311931D911992891040
-:101AF000F495F4956C800F1311931D911992891030
-:101B0000F495F4956C800F1311931D91199289101F
-:101B1000F495F4956C800F1311931D91199289100F
-:101B2000F495F4956C800F1311931D9119928911FE
-:101B3000F495F4956C810F136D946DED000D4814C0
-:101B40008A11FC004A114A164A17EEF88817100D40
-:101B50008004100C8005710E00167317000EF066DD
-:101B6000000DF0002400881110F82763F8450F32AB
-:101B7000F2740E9FF495481710F82760F8440F3D53
-:101B800060E100020001F8200F6DF07311331004C2
-:101B900080001005F074069F1104F3000001810419
-:101BA0006D8E7710000171E100020012F4AAF83086
-:101BB0000F6277100002F4AAF8300F6D45E1000BB8
-:101BC000881043E1000C83F80012F495F495F4AA10
-:101BD000F8300F6DF0730F96F50081044916F5206B
-:101BE000891676E1000C000076E10004000048163A
-:101BF000F8451133F7B871E10002001210F8001235
-:101C0000F0100003F8460F8C10F80012F0100003DB
-:101C1000F845101677100001F4AAF8300F9C7710E1
-:101C20000002F4AAF8300FA8F0730F9677100004A2
-:101C3000F4AAF83010B777100005F4AAF83010BCF9
-:101C4000F2740E9FF4954817F073113176E1000C91
-:101C5000000076E1000B000076E10004000076E170
-:101C60000002000211E1000CE803F6208912F4954D
-:101C700077100003F5AAF8300FB66BF8276F000154
-:101C80008810F495F495F5AEF8200FBD481680063F
-:101C90008813F49577100003F6ABF8200FC86BF8A3
-:101CA000276F00011206F845100010E100048000C3
-:101CB0001005800110048002100680034811F274A0
-:101CC000071EF0000005100600E1000480E100049A
-:101CD000100600E1000C80E1000C881211061004CF
-:101CE000F60080044816F62088168913F4957710BC
-:101CF0000003F6ABF8200FF56BF8276F00017710A3
-:101D0000000C71E100040013F6ABF82010006BF832
-:101D1000276F00016CE2FFFD1131F6B86FE100059D
-:101D20000C486FE100060C18F0300FFFF0000003C4
-:101D300080E1000B76E1000200034816F8451133FC
-:101D400071E1000C001210E1000B4912F62088131B
-:101D5000E80CF6208810F495F495F5ABF8201027E0
-:101D6000481380068810F495F495F5AEF8201030ED
-:101D7000700600161206F845105F10E1000480009E
-:101D80001005800110048002100680034811F274CF
-:101D9000071EF0000005100600E1000480E10004C9
-:101DA000100600E1000C80E1000C881211061004FE
-:101DB000F60080044816F6208816F4957710000C7B
-:101DC00071E100040013F6ABF820105F6BF8276F89
-:101DD00000017710000CF6AAF820106BF2740E9F29
-:101DE000F495481771E1000C00127710000CF4AA6A
-:101DF000F830107C7710000C71E1000B0013F6AB8B
-:101E0000F83010B4E730F7AAF83010B4F2740EC10D
-:101E1000F49548178812F495F4956C82108D76E14C
-:101E20000004000076E100020005F07310B476E1D2
-:101E3000000200047710000C71E1000B0012F5AAFB
-:101E4000F820109AF073109C7712000C76000000B6
-:101E50007001001270020017760300014811F2743D
-:101E60000CB9F000000576E1000400007710000CCA
-:101E700071E1000B0012F6AAF820111C4816F84573
-:101E8000113360E100020005F82010DF10E1000BC3
-:101E900008E1000C11E10004F84D10C76BF8276F42
-:101EA00000018810F495F495F5AEF82010CF48168F
-:101EB000F4954808F84511166FE1000C0D0081E11A
-:101EC000000C1104F50081044916F5208916F07301
-:101ED000110E10E1000B71E1000C00128810F49556
-:101EE000F495F6AAF83011164912F6208810F495E8
-:101EF000F495F5AEF82010F3481680064808F8452A
-:101F000011161004700200178000760300001006FE
-:101F100080011005F0740CB9100600E1000C80E19E
-:101F2000000C11061004F60080044816F6208816EE
-:101F300010E1000C08E1000BF845111CF0731131A1
-:101F4000F2740E9FF4954817F073113376E1000C8C
-:101F5000000076E1000B000076E1000200011004B1
-:101F600080001005F074069F8812F495771000FF2A
-:101F7000F4AAF83011336C860F70EE088A178A16AF
-:101F80008A11FC004A11EEFCF495710600128811CA
-:101F90007312000EF166000DF30024008914138102
-:101FA000F77AF330000181F8276013E10001F77C34
-:101FB000F330000381F82761E90F19E1000181F88E
-:101FC000276271E400030013F6B84913F30000011F
-:101FD000F330000F490B09F82762F84D117577109F
-:101FE00000FFF4ABF830117557F8276CF3000001CF
-:101FF0004FF8276C76F827630001F073117876F8B4
-:102000002763000070E40003276276F8276400006D
-:1020100011F8276161F8000B0002F820118DE90129
-:102020006FE100020F1881F8276411F8276161F849
-:10203000000B0001F82011A910F82764F10000043A
-:102040008913E9B8F52081F8276560840002F8203B
-:1020500011A9700000117001001370022765F2745D
-:102060000F18F4954812EE048A11FC004A114A1622
-:102070004A17EEFCE8004EF82766E8004EF827689D
-:10208000E8004EF8276CE8004EF8276A77122740E0
-:1020900077112400771A001FF07211DB7092001183
-:1020A00076E10001FFFF7681000076E1000200008A
-:1020B00076E1000300FF76E1000C000076E1000B02
-:1020C000000076E1000400006DE9000DF02025A07D
-:1020D000F10000078911F100000181028816F495D2
-:1020E00077170020768600FF760000007601000654
-:1020F0001002F074066C7600000076010006F2749F
-:10210000066CF49548111002F000000D80026DE994
-:10211000000D6DEE000D6CEFFFFF11E8F0740C9DEB
-:10212000EE048A178A168A11FC004A114A164A17C9
-:10213000EEFA8811100A4911F84D129F4808F84527
-:10214000129F80041281F5788912F495F4956CE25F
-:10215000FFB9128A61F800080080F830128A13E192
-:102160000001F0E8F778F1A0F2301FFF8817F4952E
-:10217000771224007716000077130020F6B848176E
-:1021800008E20001F84512426DEA000D6D966CEB15
-:10219000FFFF1234F073129056F8276AF000000126
-:1021A0004EF8276A60820001F83012547000001661
-:1021B000F2741138F4954811F07312907000001603
-:1021C000F2741138F495481172102A9EF495F4AF08
-:1021D000F830126E76000000760100BC7002001626
-:1021E00076030000F2740CB9F4954811F073129064
-:1021F00010F8276EF844129076000000760100BCBB
-:102200007002001676030000F2740CB9F4954811C0
-:10221000F0740C5EF0E0F0101388F842129076F83B
-:10222000276E0001F073129056F82766F000000147
-:102230004EF827666DE9005E56F82768F000000149
-:102240004EF82768710400126EEAFFFF121870043E
-:102250000012EE068A178A168A11FC004A11EEFE59
-:10226000880EF495F066000DF00025A08811F49515
-:10227000F495768100FF7600000076010006F27486
-:10228000066CF0000001760000007601000648119F
-:10229000F274066CF0000007EE028A11FC004A118D
-:1022A000880EF495F066000DF00024008811F49576
-:1022B000F49576E10001FFFF7681000076E10002EF
-:1022C000000076E1000300FF8A11FC004A11F4953A
-:1022D00013038811FA4D12EC71020012F310000181
-:1022E000891AF495F07212EB709100128A11FC00B9
-:1022F000F4954A0B4A0C4A0DF7B8EEFE10F80008A8
-:102300001106F1C08300F4851106F7858106F6B841
-:10231000EC0F1E0661008000F8201305F484EE0225
-:102320008A0D8A0C8A0BFC00F4954A0B4A0C4A0D64
-:10233000EEFEF7B8800010F80008F4851106F78566
-:102340008106F6B8EC0F1E06F0F061008000F82060
-:102350001320F484EE028A0D8A0C8A0BFC004A11C9
-:102360007711007B76812EEC7711007BEEFF718177
-:102370000011EE0176E10001000076E100040000AA
-:1023800076E10006000076E10062000076E100766A
-:10239000000076E10092000076E10094000076E112
-:1023A00000B0000076E100B3000076E100BE00005E
-:1023B00076E100BF000076E100C1000076E100C3D5
-:1023C000000076E100C5000076E100C700007681DC
-:1023D00000008A11F495F4E44A114A164A17EEFFF8
-:1023E000F49571060016FB8016A28817F495F7B8CD
-:1023F00010F80017F0100002FA4613887711000059
-:1024000010F80017F0100002F84513F910F8001743
-:10241000F845143910F80017F0100001F845141FA2
-:10242000F073145210F80017F0100003F84513D39E
-:1024300010F80017F0100006F84414527712007BD1
-:102440007182001461E400070040F830145249140E
-:102450004817F6008812F495771300557711005746
-:102460006DEA003BE50110E600068081481400F8A3
-:1024700000178812F4957711005510E20040808112
-:102480007711005710E6000780817711005510E2A0
-:102490000045808110E60008771100578081771190
-:1024A000005510E2004A80817711005710E60009BC
-:1024B0008081F2731452771103C07712007B10826F
-:1024C000F00000078813F495F495961BF830145229
-:1024D00010E300357712005580827712005710E61E
-:1024E000000480827712005510E300378082771253
-:1024F000005710E6000580824811F0400010F2738A
-:102500001450F04000207712007B1082F00000078A
-:102510008812F495F495960DF830145210E20034B8
-:102520007713005580837713005710E600028083ED
-:1025300010E200367712005580827712005710E6BD
-:10254000000380824811F0400004F2731450F04000
-:1025500000087712007B1082F00000078812F495C3
-:10256000F495960EF830145210E2003377120055AD
-:1025700080827712005710E6000180824811F273C2
-:102580001450F04000027712007B1082F000000728
-:102590008812F495F495960FF830145210E2003238
-:1025A000771200557713005780824811E762F04098
-:1025B0000001E5018811F4957712007B48117182C2
-:1025C00000121AE2000780E20007F980169AEE0175
-:1025D0008A1748118A168A11F4E44A118811770E75
-:1025E000000577120055E804F6B828E10002EEFF76
-:1025F000808277120057F0208000EE011A82771255
-:1026000000578082E80132E10002F5827711005420
-:10261000F693188177110054F2A080818A11F49505
-:10262000F4E44A114A16F49571040011FB8016A2D5
-:102630008816F4957712005510E600038082771211
-:10264000005610E100027713005680827712005680
-:1026500010E10003808210E10004771200568082AE
-:102660007712005610E100018082E712E501F9803F
-:10267000169A8A168A11F4E44A114A164A17EEF994
-:102680007711007B76000016760100177602001A9B
-:102690007603001B7604001C7605001D718100176F
-:1026A00071E7000600111081F84414DFF980165319
-:1026B000F6B8FB801585F020FFFFF6B8FB80160802
-:1026C000F020FFFF7711007B7181001776E700068D
-:1026D00000014817771600007710000477150003F3
-:1026E0007714000277130001F000003976E7000844
-:1026F000001F76E700070000880E771A00054817CC
-:10270000F0000009881248188819E800F072152CAA
-:10271000731900117682000011917311001970E293
-:102720000003001670E20004001370E200050014BC
-:1027300081E2000170E20006001570E2000700105F
-:1027400080E20002730E0011F100001E6DEE000524
-:102750006DEB00056DEC00056DED00056DE8000505
-:10276000F000000181916DEA00087311000EEE0780
-:1027700076E70041002476E70046002576E7004B27
-:10278000002676E7005000278A178A168A11F4E49B
-:102790004A114A16EEFE881156064E00F98016A21E
-:1027A000F7B810F80011F010FFFFFA451560771622
-:1027B000FFFF7712007B49111082F603F000000939
-:1027C0008811F495F4951081F8441571F273157120
-:1027D000F495E7167711007B1081F000000988114D
-:1027E000F495771200061081F845155C6EEAFFFF3C
-:1027F00015696DE9000876860001E9015600F1804F
-:1028000010F8000BF845157EFB801585F4954816E9
-:10281000F980169AEE0248168A168A11F4E44A11D3
-:10282000EEFFFB8016A28811F4957710FFFFF4A944
-:10283000F83015C410E1000377120055808277123A
-:1028400000567682000077120056768200007712DA
-:1028500000567682000077120056768200007712CA
-:1028600000567682000010E10002F000000832F805
-:10287000000877120054E801F482F493188277126A
-:102880000054F0400000808210E10001F9801676CB
-:1028900010E10001F9801666F07316037711007BD2
-:1028A0007181001171E1000700127682000010E1D1
-:1028B0000009F98015857711007B7181001110E105
-:1028C0000009FB801585F00000087711007B7181FD
-:1028D000001110E10009FB801585F0000010771150
-:1028E000007B7181001110E10009FB801585F0006B
-:1028F00000187711007B7181001110E10009FB8045
-:102900001585F00000207711007B7181001110E126
-:102910000009FB801585F0000028F980169AEE0169
-:102920008A11F4E44A11EEFFFB8016A28811F49597
-:102930007710FFFFF4A9F830164177110055768122
-:10294000001E7711005676810000771100567681BF
-:1029500000007711005676810000771100567681CD
-:1029600000007711005676810000771100567681BD
-:1029700000007711005676810000771100567681AD
-:102980000000771100567681000077110056F2732F
-:10299000164E768100007711007B7181001171E184
-:1029A000000700127682000010E10039F980160855
-:1029B000F980169AEE018A11F4E44A117711007B2E
-:1029C0001081F00000048811F495F4951081FA4408
-:1029D0001663F495EEFF76810001EE018A11F4E4AE
-:1029E000F01000104A1132F80008EEFF77110001D4
-:1029F000E801EE01F4821A8180818A11F495F4E4F1
-:102A0000F01000104A1132F80008EEFFE8017711CB
-:102A10000000F482EE01F493188180818A11F4950C
-:102A2000F4E44A11F01000107711000032F80008A9
-:102A3000EEFF1181E801EE0177110000F482F2A0AF
-:102A400080818A11F495F4E4F273169EF6BBF49536
-:102A5000F495F495F495F4E4F27316A6F7BBF495A7
-:102A6000F495F495F495F4E44A114A16F49571043A
-:102A70000016FB8016A28811F49571E10005001282
-:102A80007682000E10E6000E71E1000600128082D0
-:102A900071E1000500127682000D71E1000600125E
-:102AA00010E6000D808271E1000500127682000CB4
-:102AB00010E6000C71E100060012808271E1000551
-:102AC00000127682000B10E6000B71E10006001286
-:102AD000808271E1000500127682000A71E1000631
-:102AE000001210E6000A808271E100050012768271
-:102AF000000910E6000971E100060012808271E110
-:102B0000000500127682000871E10006001210E64E
-:102B10000008808271E1000500127682000710E64D
-:102B2000000771E100060012808271E100050012C9
-:102B30007682000671E10006001210E6000680822F
-:102B400071E1000500127682000571E100060012B5
-:102B500010E60005808271E1000500127682000413
-:102B600071E10006001210E60004808271E10005A8
-:102B700000127682000371E10006001210E60003E5
-:102B8000808271E1000500127682000210E60002E8
-:102B900071E100060012808271E100050012768268
-:102BA000000110E6000171E100060012808271E16F
-:102BB000000500127682000071E100060013E76252
-:102BC000E501F980169A8A168A11F4E44A118811EF
-:102BD000F495F49571E100050012EEFF7682000095
-:102BE000EE0171E100060011698100018A11F4957E
-:102BF000F4E44A118811F495F49571E1000500128E
-:102C0000EEFF76820001EE0171E10006001169819C
-:102C100000018A11F495F4E44A117711007B1081C8
-:102C2000F00000948811F495F4951081FA44179CF3
-:102C3000F495EEFFF98016537711007B1081F000B8
-:102C400000948811F495F49576810001EE0176E107
-:102C50000001000076E10002002176E1000300207F
-:102C600076E10004002376E10005002276E100060B
-:102C7000003876E10007003976E10008001576E1BA
-:102C80000009001476E1000A000076E1000B004123
-:102C900076E1000C004076E1000D004376E1000E85
-:102CA000004276E1000F004876E10010004976E12D
-:102CB0000011001B76E10012001A8A11F495F4E469
-:102CC0004A11EEFD881156064E00F98016A27712C1
-:102CD000007B770E0009108228F80011F0000095A3
-:102CE0008811F495F4951081F84517F0F27317FDEB
-:102CF0007711FFFF76810001E9015600F18010F89D
-:102D0000000BF84517FDFB801810F4954811F98069
-:102D1000169AEE0348118A11F495F4E44A118811C9
-:102D2000F495EEFF71E100010011EE0110818A11AE
-:102D3000F495F4E44A11EEFFFB8016A28811F49595
-:102D40007710FFFFF4A9F83018C371E100050012F5
-:102D50007682000071E1000600127682000071E1C7
-:102D6000000500127682000171E1000600127682F1
-:102D7000000071E1000500127682000271E1000698
-:102D800000127682000071E10005001276820003D5
-:102D900071E1000600127682000071E10005001268
-:102DA0007682000471E1000600127682000071E173
-:102DB000000500127682000571E10006001276829D
-:102DC000000071E1000500127682000671E1000644
-:102DD00000127682000171E1000500127682000780
-:102DE00071E1000600127682200071E100050012F8
-:102DF0007682000871E1000600127682000071E11F
-:102E0000000500127682000971E100060012768248
-:102E1000000071E1000500127682000A71E10006EF
-:102E200000127682000071E1000500127682000B2C
-:102E300071E1000600127682000071E100050012C7
-:102E40007682000C71E1000600127682000071E1CA
-:102E5000000500127682000D71E1000600127682F4
-:102E6000000071E1000500127682000E71E100069B
-:102E700000127682000010E10007F980167610E15A
-:102E80000008F980167610E10007F980166610E157
-:102E90000008F9801666F07318D17711007B108155
-:102EA000FB801810F00000957711007B1081FB80EB
-:102EB0001810F000009EF980169AEE018A11F4E4D1
-:102EC0004A118811EEFFF495100471E1000300111E
-:102ED000EE0180818A11F495F4E44A114A16F495C2
-:102EE00071040016FB8016A28811F49571E10002AE
-:102EF00000127682001010E6000171E1000300125A
-:102F0000808271E10004001210E600028082E76214
-:102F100071E100020013E501F980169A8A168A1100
-:102F2000F4E44A118811EEFFEE0110E100018A116C
-:102F3000F495F4E44A117711007B1081F00000B39E
-:102F40008811F495F4951081FA44192AF495EEFF4E
-:102F5000F98016537711007B1081F00000B38811BF
-:102F6000F495F49576810001EE0176E10001000010
-:102F700076E10002001376E10003002676E100040A
-:102F8000002576E10005002476E10006000076E1E8
-:102F90000007001776E10008003276E100090031F1
-:102FA00076E1000A00308A11F495F4E44A114A16D9
-:102FB0004A17EEFFF49571060017FB8016A28811E0
-:102FC000F495F7B810F80011F010FFFFFA451973E7
-:102FD0007716FFFF7712007B770E0005108228F826
-:102FE0000011F00000B48811F495F4951081F844B4
-:102FF0001984F2731984F495E7167711007B108118
-:10300000F00000B48811F495771200021081F845A1
-:10301000196F6EEAFFFF197C6DE9000561F8001772
-:103020000001FA20198F76860001FB801997F4952C
-:103030004816F980169AEE018A1748168A168A11E0
-:10304000F4E44A11EEFFFB8016A28811F495771084
-:10305000FFFFF4A9F83019CC71E100020012698277
-:10306000001071E1000200126882F7FF71E10002B6
-:1030700000126882FBFF71E1000200126882FFF01B
-:1030800071E1000300127682FFFF71E1000400127B
-:103090007682FFFF71E1000200126982002071E177
-:1030A00000020011F27319DA6881FFEF7711007BDB
-:1030B0001081FB801997F00000B47711007B10811C
-:1030C000FB801997F00000B9F980169AEE018A1179
-:1030D000F4E400A4000019DF00012AE6000000016A
-:1030E0002AE7000000032A120C01C34F0000000170
-:1030F0002A15000000022A160000000000192A5DAF
-:103100000043006F0070007900720069006700687A
-:10311000007400200054006500630068006E006FBA
-:10312000005400720065006E0064002000410047FA
-:10313000000000042A760030002E00300000000C51
-:103140002A7A004600650062002000320037002025
-:103150000032003000300031000000092A860031C2
-:103160000034003A00330035003A003300330000E9
-:10317000000F2A8F00000000000000010000000185
-:10318000000000000000000000000000000000003F
-:10319000000000012A9E000000012A9F000000019B
-:1031A0002AA0000000012AA1000000012AA20000BC
-:1031B0000001297E000000022980000000000001BB
-:1031C0002982FFFF00012AA7000000052AA87141FB
-:1031D0002000200000230400000A2AAD00000000A7
-:1031E00000000000000000000000000000000000DF
-:1031F000000F2AB7000000000000004000A082403D
-:103200000008307F00800180000000000000000006
-:1032100000000001276E00000001276F0000000081
-:10322000000900001A8304E804CF04C504BA04B0FE
-:1032300004AC049C048C0481007800000100F2734B
-:1032400007EFF495F495F27307EFF495F495F273A4
-:1032500007EFF495F495F27307EFF495F495F27394
-:1032600007EFF495F495F27307EFF495F495F27384
-:1032700007EFF495F495F27307EFF495F495F27374
-:1032800007EFF495F495F27307EFF495F495F27364
-:1032900007EFF495F495F27307EFF495F495F27354
-:1032A00007EFF495F495F27307EFF495F495F27344
-:1032B00007EFF495F495F27307EFF495F495F27334
-:1032C00007AAF495F495F27307EFF495F495F27369
-:1032D00007EFF495F495F2730223F495F495F273E5
-:1032E00007EFF495F495F27307EFF495F495F27304
-:1032F00007EFF495F495F27307EFF495F495F273F4
-:1033000007EFF495F495F27307EFF495F495F273E3
-:1033100005E5F495F495F27302B5F495F495F2731E
-:103320000E33F495F495F27307EFF495F4950000DD
-:00000001FF
diff --git a/firmware/vicam/firmware.H16 b/firmware/vicam/firmware.H16
deleted file mode 100644
index cac0cba68cc7..000000000000
--- a/firmware/vicam/firmware.H16
+++ /dev/null
@@ -1,7 +0,0 @@
-:0026000000B6C31F000264E767FDFF0EC0E709DE008E00C0094003C01744034BAFC00700004BAF97CF00001D
-:000A000000B6C30300036418000000FB
-:0008000000B6C301000664000014
-:0696000000B6C38F060264E707000008C0E70700003EC0E7075401AA00E707C805B600E7074201D200E7077C001600E70756001800E707060092C0E70700001EC0E707FFFF22C0E707040024C0E707EC2728C0E70716018E00E78701000EC097CFD70900C0E777010092C009C1E709FE052401E70904062601E707070092C0E70500C0C0DF97CF170057001702D70900C0E777010092C00AC1E757FFFFFA050DC0E7570000FA050FC09FAFC600E70500C0C805C105C005C0DF97CF27DAFA05EF0701000B0673CF9FAF78019FAF1A036ECFE709FC052401E70902062601E707070092C0E709FC05FE05E70902060406E7090006FC05E709FE05000627DAFA05E7570100FA0502CA04C097CF9FAF660597CFE70740000206C809FC059FAFDA0297CFCF170200EF57810009069FA0B601EF57800009069FA04002EF5701000B069FA04603E70701000AC046AF47AF9FAF4002E7072E000AC0EF878000090697CF000E0100C05751009FC09E02C057500020C0C057550012C0C05756009FC072029FCFD602C10B080601D06F900806C0070800C10B08069FAF280597CF2F0E02000806C0070800C10B08069FAF28059FCFD6022F0E02000906EF87800009069FCFD602EF677FFF0906E767FFFD22C0E767EFFF24C0E787100028C09FAFB805E787E02124C09FAFA805E787080024C0E767DFFF24C0C8070A00C0070000C10701009FAF28059FAFB805C0079E009FAF4405E767FFFE24C0C00920C0E787000124C0C07700020FC1E767F7FF24C0E767F7FF24C0E787080024C008DA5EC1EF078000090697CFEF0701000A0697CFEF0700000B06EF0700000A06EF677FFF0906EF0700000D06E767EFFF28C0E76717D824C0E70700001EC0E707FFFF22C097CFC8070E069FAFDA02E7070000F205E7071000F605E7070E06F405E707D602F805C807F205C107008050AF97CF2F0C020007062F0C04000606E7070000F205E7071000F605E707E205F405E707CE02F805C807F205C107008051AF97CF9FAF66049FAF1A0359AF97CFC0070E00C10B0C0641D19FAF2805C0073C009FAF44056800C0073B009FAF44056F000C066800E0070401E80B0A06E8070000E0070002E007EC01E007FCFF97CFE707FFFFFA05EF0700000B06E7070E062401E7070E06FE05E70740002601E70740000406E707070092C097CFEF0702000B069FAF7801EF77800007069FC01404EF770100070637C0EF7701000D060FC1EF0701000D06C0070200C10730009FAF2805C0070100C10702009FAF2805C807FF4F9FAFA805C00738009FAF4405C177030002C108DA75C1C17701000AC1C0070100C10702009FAF2805EF07010006062CCFC0070100C10704009FAF2805EF070000060622CFEF0700000D06EF57010006061BC0C0070100C10701009FAF2805C0070200C10730009FAF2805C807FF4F9FAFA805C00738009FAF4405C1670300C157030002C008DA73C1C0070200C1071200EF570000060602C0C10723009FAF2805C0071400C10BEA059FAF2805C0073E009FAF0A05E709E405FA0527D8FA05E7070E06FC05E7074E060006E707400002069FAF66059FAFC60097CFC10BE20541D001D2C11723009FAFDC04C0070400C10BE3059FAF2805C0070600C109E6059FAF2805C0070700C109E605C1D19FAF2805C0070B00C109E8059FAF2805C0070C00C109E805C1D19FAF2805C0070D00C10709009FAF2805C0070300C10732009FAF2805C0070F00C10700009FAF280597CFE767FFD924C0C8070A004000C0670002278024C0E787000424C0E767FFF924C001D208DA72C1E787002024C097CF27001EC0E787FF0022C0E7677FFF24C0E787800024C0E787800024C097CF9FAF0A0567001EC0E767BFFF24C0E787400024C0E787400024C097CF9FAF0A05E76700FF22C0E767FFFE24C0E767FFFE24C0C10920C0E787000124C097CFC0074000C809FC05E76700FF22C0E767FFFE24C0E767BFFF24C0E767BFFF24C000DAE80920C0E787400024C0E787400024C000DAE80920C06DC1E787000124C097CFE707320012C0E777008012C07CC097CFE707204E12C0E777008012C07CC097CF0902190001010080960904000001000000000705810240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1
-:0136000000B6C32F0103640E0014001A00200026004A0064006A0092009A00A000B200B800BE00C200C800CE00DC00DA00E200E000E800E600EE00EC00F200F80002010A010E0112011E01220128012C0132013601440150015E01720176017A01800188018C0194019C01A001A401AA01B001B401BA01D001DA01F601FA01020234023C0244024A0250025602740278027E0284028A02880290028E029402A202A802AE02B402BA02B802C002BE02C402D002D402E002E602EE02F802FC0206031E032403280330032E033C034A034E03540358035E0366036E037A0386038E039603B203B803C603CC03D403DA03E803F403FC03040420042A04320436043E044404420448044E044C04540452045A045E046204680474047C04800488048C0494049A04A204A604AE04B404C004CC04D8042A0546056C0500005E
-:0008000000B6C301000664000014
-:0000000001FF
diff --git a/firmware/whiteheat.HEX b/firmware/whiteheat.HEX
deleted file mode 100644
index 8dae60295d55..000000000000
--- a/firmware/whiteheat.HEX
+++ /dev/null
@@ -1,1097 +0,0 @@
-:030000000297E381
-:03000300021312D3
-:03000B00020BB530
-:0300330002081CA4
-:03004300020A00AE
-:03005B0002833BE2
-:10037000907FE9E070030204731470030204E72421
-:10038000FE700302054F24FB700302046414700323
-:1003900002045214700302043A1470030204492444
-:1003A00005600302059E907FEBE024FE601614605A
-:1003B000362402707B7412907FD4F07400907FD545
-:1003C000F00205A5907FEAE0FF120A99EA49600D64
-:1003D000EA907FD4F0E9907FD5F00205A5907FB434
-:1003E000E04401F00205A5907FEAE0FF120A58EA16
-:1003F00049603312A23BF54E907FEEE0FFE54ED30D
-:100400009F4003E0F54EE54ED394404003754E40C7
-:10041000AE02AF017C7F7D00AB4E129137907FB56D
-:10042000E54EF00205A5907FB4E04401F00205A579
-:10043000907FB4E04401F00205A5907F00E521F033
-:10044000907FB57401F00205A5907FEAE0F52102E6
-:1004500005A5907FEAE0F535D202438810D2EBD2B1
-:10046000A80205A5907F00E535F0907FB57401F0F6
-:100470000205A5907FE8E0247F6024146031240207
-:10048000705BA200E433FF25E0FFA205E4334F9048
-:100490007F00F0E4A3F0907FB57402F00205A5E4BC
-:1004A000907F00F0A3F0907FB57402F00205A59054
-:1004B0007FECE0F45480FFC4540FFFE054072F2575
-:1004C000E024B4F582E4347FF583E05401907F00AA
-:1004D000F0E4A3F0907FB57402F00205A5907FB41C
-:1004E000E04401F00205A5907FE8E024FE601D24B1
-:1004F0000260030205A5907FEAE0B40105C2000294
-:1005000005A5907FB4E04401F00205A5907FEAE0E4
-:100510007034907FECE0FF5407FEF54EEF30E703B8
-:10052000434E10907FD7E54EF0E54E4420F0EFF4B7
-:100530005480FDC4540F2E25E024B4F582E4347FAA
-:10054000F583E4F0805F907FB4E04401F080569042
-:100550007FE8E024FE60182402704A907FEAE0B44D
-:100560000104D200803F907FB4E04401F0803690D7
-:100570007FEAE07020907FECE0F45480FFC4540FD9
-:10058000FFE054072F25E024B4F582E4347FF5839F
-:100590007401F08010907FB4E04401F08007907FF8
-:0C05A000B4E04401F0907FB4E04402F0AD
-:0105AC00222C
-:1005AD00754AFF7549FF75480F754700D203C2069E
-:1005BD00C202C200C205C2019003007419F0E4909A
-:1005CD0001BCF0C2049001C0F0A3F0C2AFC2A812EA
-:1005DD000C22E49002AFF09001BDF0900100F0A369
-:1005ED00F0A3F0A3F0A3F0A37410F0A37401F0A393
-:1005FD007408F07E017F001219C1754C12754D0AF9
-:10060D0090010BE0FF054DE54DAC4C7002054C140F
-:10061D00F5828C83EFF090010CE04480FF054DE5F1
-:10062D004DAC4C7002054C14F5828C83EFF09001AB
-:10063D000DE0FF054DE54DAC4C7002054C14F582F7
-:10064D008C83EFF090010EE0FF054DE54DAC4C7045
-:10065D0002054C14F5828C83EFF090120AE493FF9F
-:10066D0074019390011CCFF0A3EFF090011CE0FFFB
-:10067D00A3E0FEEF6EFF90011CF0A3E06FFFF09082
-:10068D00011CE06FF0E0FEA3E0FFE4FCFD755210ED
-:10069D007553027554127555AC129426754C12751E
-:1006AD004DB290010DE0FF054DE54DAC4C700205CE
-:1006BD004C14F5828C83EFF090010EE0FF054DE5B3
-:1006CD004DAC4C7002054C14F5828C83EFF0907F8D
-:1006DD0092E0FFC4540F2441FF054DE54DAC4C7025
-:1006ED0002054C14F5828C83EFF0054DE54DAE4CB3
-:1006FD007002054C14F5828E83E4F07582107583BB
-:10070D0001E0FCA3E0FDA3E0FEA3E0FF90011812C1
-:10071D00A3EE7E017F181286BE900118E0FCA3E0C7
-:10072D00FDA3E0FEA3E0FF75520A75530675541242
-:10073D007555B8129426D2E843D820907FAB74FF3C
-:10074D00F05391EF907FAFE04401F0907FAEE04425
-:10075D001FF0D2AF20012E20012BA2039207120908
-:10076D00C575465075456D7544337543002001E4DC
-:10077D007FFF7EFF7DFF7CFF784312A3D7EC4D4EAC
-:10078D004F60D180E8300105120370C20130060AB6
-:10079D001209FB5003120AE8C20612965E9001BDC3
-:1007AD00E0600C129201E49001BDF0907FD3F090C7
-:1007BD0002AFE0B40F031299B912A095E4FF7401D2
-:1007CD00A807088002C333D8FCFE9001BCE05E6030
-:1007DD001474282FF8E6D3940A40047E0180027E1B
-:1007ED00008E4B8003754B0174682FF582E4342025
-:1007FD00F583E54BF00FBF04C5E52CD3940A4004F7
-:0E080D007F0180027F0090206CEFF0020792C6
-:01081B0022BA
-:04081C0053D8EF328C
-:10082000E533C39401400E907F93E04430F0907F15
-:1008300095E044C0F07FF47E011209AE907F96E00F
-:1008400054FEF07F0A7E001209AE907F96E04408C5
-:10085000F07F057E001209AE907F96E054FBF07F9A
-:10086000057E001209AEE533C39401500E7F027D70
-:10087000FF1282EA7F057E001209AE907F96E04467
-:1008800002F0E0547FF07F057E001209AE907F9663
-:10089000E04440F07F057E001209AE907F96E05460
-:1008A000BFF07F327E001209AE907F96E04440F0A8
-:0808B0007F327E001209AE2226
-:1008B800907F96E054FDF0E04480F07F0A7E0012BD
-:1008C80009AEE533C39401500E7F02E4FD1282EABB
-:1008D8007F057E001209AE907F96E054BFF07F0539
-:1008E8007E001209AE907F96E04404F07F057E00FA
-:1008F8001209AE907F96E054F7F07F057E0012094A
-:10090800AE907F96E04401F07F057E001209AEE5C7
-:1009180033C39401400E907F93E054CFF0907F95BD
-:08092800E0543FF0120B002225
-:10093000900AF4E4937076907F937430F0907F94F3
-:10094000743CF0907F9574C6F07F0A7E001209AE69
-:10095000E4907F9CF0907F967408F0907F9C74CF19
-:10096000F07F0A7E001209AE902070E0FFC4540FA1
-:10097000F533C394015007907F96E04480F0E490F3
-:100980007F97F0907F9D7402F0E533C39401400B94
-:10099000E4907F98F0907F9E74C0F0907FE2741294
-:0E09A000F01208207582F475830A74FFF022AD
-:1009AE008E5D8F5EE55E155EAE5D7002155D4E600E
-:0709BE00051209EA80EE2298
-:1009C500907FD6E054FBF0E04408F0300704E044A3
-:1009D50002F07FD07E071209AE907FD6E054F7F083
-:0509E500E04404F022D3
-:1009EA007400F58690FDA57C05A3E582458370F920
-:0109FA0022DA
-:0509FB001208B8D32230
-:100A0000020C4E00020C8100020C6600020CC000B9
-:100A1000020CAA00020AED00020AEE00020AEF0030
-:100A2000020CDB00020DCB00020D1700020E2B00A2
-:100A3000020D5300020E8B00020D8F00020EEB0020
-:100A4000020AF000020AF200020AF100020AF300B0
-:080A5000020F4B00020F6100D0
-:020A58008F4FBE
-:100A5A00E4F5507551FF75521275536AAB51AA529B
-:100A6A00A95390000112A254B4031DAF500550EFD0
-:100A7A00B54F012212A23B7E0029FFEE3AA9077563
-:0E0A8A0051FFF552895380D47B007A00790029
-:010A9800223B
-:100A9900E4FE7551FF755212755312AB51AA52A952
-:100AA9005390000112A2546402702DAD060EEDB5EB
-:100AB90007012290000212A2AD85F04FF550624F56
-:100AC900E54F6250E550624F29FDE54F3AA905759A
-:0E0AD90051FFF552895380C37B007A007900EB
-:010AE70022EC
-:050AE800120820D322DA
-:010AED0032D6
-:010AEE0032D5
-:010AEF0032D4
-:010AF00032D3
-:010AF10032D2
-:010AF20032D1
-:010AF30032D0
-:030AF400000407F4
-:090B0000907FD6E04480F080747F
-:100B7D00438701000000000000000000000000227B
-:100B8D00538EF7E58954F14401F589758CB1D2A9DD
-:100B9D0075984075CBFF75CAF375C834E4FF7F05B2
-:070BAD007828E4F608DFFCE4
-:010BB400221E
-:100BB500C0E0C083C082C0D075D000C000C006C0F0
-:010BC5000728
-:100BC600300416758CF8758A307F2FAE071FEE60DD
-:100BD6003C9020007455F080F2758CB17F28EFD3DD
-:100BE600942C5009A807E66001160F80F1900300C7
-:100BF600E0600214F09001C0E07002A3E0600E9085
-:0D0C060001C1E024FFF09001C0E034FFF0D8
-:0F0C1300D007D006D000D0D0D082D083D0E0322E
-:100C2200D200758E10120930E533C394014008904A
-:100C32007F927402F08005E4907F92F0128000129D
-:0C0C42000F7D1294F7121B0C120B8D2278
-:100C4E00C0E0C083C082D2015391EF907FAB74019C
-:080C5E00F0D082D083D0E03217
-:100C6600C0E0C083C082907FC4E4F05391EF907FD0
-:0B0C7600AB7404F0D082D083D0E032D9
-:100C8100C0E0C083C0825391EF907FAB7402F090BB
-:100C91007FD8E0700D907FD9E07007E52C70037567
-:090CA1002C14D082D083D0E03283
-:100CAA00C0E0C083C0825391EF907FAB7410F0D044
-:060CBA0082D083D0E0327D
-:100CC000C0E0C083C082300202D2065391EF907F11
-:0B0CD000AB7408F0D082D083D0E0327B
-:100CDB00C0E0C083C082C0D075D0105391EF907F1D
-:100CEB00A97402F0E53430E013E53230E0079020D0
-:100CFB0004E04401F0902001E04401F0E52C700386
-:0C0D0B00752C14D0D0D082D083D0E03200
-:100D1700C0E0C083C082C0D075D0105391EF907FE0
-:100D2700A97404F0E53430E113E53230E10790208F
-:100D37000CE04401F0902009E04401F0E52C700339
-:0C0D4700752C14D0D0D082D083D0E032C4
-:100D5300C0E0C083C082C0D075D0105391EF907FA4
-:100D6300A97408F0E53430E213E53230E20790204D
-:100D730014E04401F0902011E04401F0E52C7003ED
-:0C0D8300752C14D0D0D082D083D0E03288
-:100D8F00C0E0C083C082C0D075D0105391EF907F68
-:100D9F00A97410F0E53430E313E53230E307902007
-:100DAF001CE04401F0902019E04401F0E52C7003A1
-:0C0DBF00752C14D0D0D082D083D0E0324C
-:100DCB00C0E0C083C082C085C084C086758600C069
-:100DDB00D075D0105391EF907FAA7402F0E53420B8
-:100DEB00E006907FC7F08022E53130E00A907FC7A4
-:100DFB00E09002F8F08013E52230E007902004E049
-:100E0B004402F0902001E04402F0E52C7003752CB5
-:100E1B0014D0D0D086D084D085D082D083D0E0328D
-:100E2B00C0E0C083C082C085C084C086758600C008
-:100E3B00D075D0105391EF907FAA7404F0E5342055
-:100E4B00E106907FC9F08022E53130E10A907FC93D
-:100E5B00E09002F9F08013E52230E10790200CE0DE
-:100E6B004402F0902009E04402F0E52C7003752C4D
-:100E7B0014D0D0D086D084D085D082D083D0E0322D
-:100E8B00C0E0C083C082C085C084C086758600C0A8
-:100E9B00D075D0105391EF907FAA7408F0E53420F1
-:100EAB00E206907FCBF08022E53130E20A907FCBD7
-:100EBB00E09002FAF08013E52230E207902014E074
-:100ECB004402F0902011E04402F0E52C7003752CE5
-:100EDB0014D0D0D086D084D085D082D083D0E032CD
-:100EEB00C0E0C083C082C085C084C086758600C048
-:100EFB00D075D0105391EF907FAA7410F0E5342089
-:100F0B00E306907FCDF08022E53130E30A907FCD70
-:100F1B00E09002FBF08013E52230E30790201CE009
-:100F2B004402F0902019E04402F0E52C7003752C7C
-:100F3B0014D0D0D086D084D085D082D083D0E0326C
-:100F4B00C0E0C083C0825391EF907FA97480F0D032
-:060F5B0082D083D0E032D9
-:100F6100C0E0C083C0825391EF907FAA7480F0905B
-:0C0F710001BD74FFF0D082D083D0E032CC
-:100F7D0090012012A3FA000025809001247408F03E
-:100F8D00A37401F0A3746EF0A3F0A37413F0A37413
-:100F9D0011F0E4A3F0A3F090011EF090011EE0FF0C
-:100FAD0004A3F0EF75F00DA42401F9740335F0A836
-:100FBD0001FC7D017B017A01791F7E007F0D12A25C
-:100FCD00127E017F1F1287A690011EE004F0E0C380
-:100FDD00940440C7E4F52790011EF090011EE0FF38
-:100FED00C39404501A74F82FF582E43402F583E4A7
-:100FFD00F074232FF8E4F690011EE004F080DCE499
-:10100D00F534E5C0602F90011E7401F090011EE0D3
-:10101D00FFD39404501FEF14FF7401A8070880023A
-:10102D00C333D8FC42347E017F1E12844190011ED1
-:10103D00E004F080D7E4F53EF522F531F53290016C
-:10104D001EF090011EE0FF75F008A42406F582E461
-:10105D003420F583E054F0FE74C52FF582E434019D
-:10106D00F583EEF0743A2FF8A60674362FF8E4F6F1
-:10107D00742D2FF8E4F674FC2FF582E43402F58319
-:10108D00E4F090011EE004F0E0B404B6902060E0BE
-:04109D00540FF54EA9
-:1010A1007003021126E490011EF090011EE0FFC3BF
-:1010B100940450E47401A807088002C333D8FC5596
-:1010C1004E605A90011EE0FE75F008A42402F582DC
-:1010D100E43420F583E0FFEE75F008A42405F582E1
-:1010E100E43420F583E0EE75F008A42406F582E4EB
-:1010F1003420F583E0FFAF06EE75F00DA42402F570
-:1011010082E43403F583E0FCA3E0FDA3E0FEA3E069
-:10111100F5668E658D648C637D061283DF90011EFA
-:06112100E004F0808522CD
-:02112700AC0713
-:10112900907FA5E04480F0EC25E04441907FA6F053
-:101139007B3CAF031BEF7016907FA5E04440F09015
-:101149007FA6E0FD7D32AF051DEF60D480F8907F6A
-:10115900A5E0FD30E0DC20E109E04440F07EFF7FBE
-:10116900F922ED30E20C907FA5E04440F07EFF7F4C
-:10117900FA22907FA5E04420F0907FA6E0FD7B1E37
-:10118900AF031BEF7016907FA5E04440F0907FA657
-:10119900E0FD7D32AF051DEF608680F8907FA5E008
-:1011A900FD20E0DC7B3CAF031BEF7019907FA5E0CD
-:1011B9004440F0907FA6E0FD7D32AF051DEF70033E
-:1011C90002112980F5907FA5E0FD30E0D930E209D0
-:1011D900E04440F07EFF7FFA22C2AF907FA5E04451
-:0C11E90040F0907FA6E0FDD2AFFF7E003A
-:0111F50022D7
-:1012000012010001FFFFFF401007018042000102B0
-:10121000030109025800010104803C090400000A8E
-:10122000FFFFFF050705810240000007050102409E
-:10123000000007058202400000070502024000008E
-:101240000705830240000007050302400000070570
-:1012500084024000000705040240000007058702E1
-:1012600040000007050702400000040309042403AE
-:1012700043006F006E006E00650063007400200084
-:101280005400650063006800200049006E006300A0
-:101290002E001803570068006900740065004800BC
-:1012A0004500410054002D0034001A035800580036
-:1012B0002D00580058002D005800580058005800C4
-:1012C000580058002A0343006F006E006600690052
-:1012D0006700750072006100740069006F006E00A5
-:1012E000200053007400720069006E006700220342
-:1012F00049006E00740065007200660061006300C2
-:101300006500200053007400720069006E006700E1
-:021310000000DB
-:10131200C0E0C0F0C083C082C085C084C086C0D097
-:1013220075860075D018902060E0540FF5F07011AA
-:10133200D0D0D086D084D085D082D083D0F0D0E0F7
-:101342003275860010F00B10F11210F21910F32012
-:1013520080D4E528700375281402137CE5297003F4
-:1013620075291402150DE52A7003752A1402169EBA
-:10137200E52B7003752B1402182F902002E0543FC6
-:1013820020E23A20E10B20E40B20E514600902136D
-:1013920043021465021343438204E0F53A02134305
-:1013A200438204E0432D010213435382F843820532
-:1013B200E042365382FBE054FBF002134330E10279
-:1013C20080E8F585E53230E00A5382F8438204E092
-:1013D20054FEF0E58520E3569020507400F09020F2
-:1013E200587401F0907FE2E04440F0907FE305867C
-:1013F200907E800586E585F0A3E584F00586907FE2
-:10140200E5E53FFD030303FEF0F0F0F0F0F0F0F04D
-:10141200DEF6907FE2E054BFF09020587400F09026
-:101422007FB7EDF0902001E054FEF00213437F40BD
-:10143200907E800586902000E584FE2405FD8D8443
-:10144200E08E8430E009E00586F0A30586DFEF0533
-:1014520086C374409F907FB7F00586A3E054FEF0E8
-:10146200021343532DFAE5236008752300D2E7FEE9
-:10147200800A907FC7E0FE70030214FF9020507430
-:1014820000F09020587401F0907FE2E04440F09028
-:101492007FE30586907E400586E585F0A3E584F02E
-:1014A2000586907FE5EE30E7080586E02438F005F2
-:1014B20086EE547FFE5407FBEE547860300303033C
-:1014C20030E30474077B08FDFCE0E0E0E0E0E0E0EC
-:1014D200E0DDF6EBFE6019EC640770118B23907F60
-:1014E200E2E054BFF09020587400F0801BE0DEFD73
-:1014F200907FE2E054BFF09020587400F0902001F9
-:10150200E054FDF0907FC7F002134390200AE054AC
-:101512003F20E23A20E10B20E40B20E514600902AF
-:1015220013430215F6021343438204E0F53B021310
-:1015320043438204E0432E010213435382F8438261
-:1015420005E042375382FBE054FBF002134330E1E3
-:101552000280E8F585E53230E10A5382F8438204DD
-:10156200E054FEF0E58520E3569020507401F0909F
-:1015720020587401F0907FE2E04440F0907FE30550
-:1015820086907E000586E585F0A3E584F0058690C9
-:101592007FE5E540FD030303FEF0F0F0F0F0F0F02C
-:1015A200F0DEF6907FE2E054BFF09020587400F035
-:1015B200907FB9EDF0902009E054FEF00213437FD2
-:1015C20040907E000586902008E584FE2405FD8D6E
-:1015D20084E08E8430E009E00586F0A30586DFEF23
-:1015E2000586C374409F907FB9F00586A3E054FE40
-:1015F200F0021343532EFAE5246008752400D2E763
-:10160200FE800A907FC9E0FE70030216909020507F
-:101612007401F09020587401F0907FE2E04440F0B1
-:10162200907FE30586907DC00586E585F0A3E5847D
-:10163200F00586907FE5EE30E7080586E02438F075
-:101642000586EE547FFE5407FBEE547860300303A8
-:101652000330E30474077B08FDFCE0E0E0E0E0E037
-:10166200E0E0DDF6EBFE6019EC640770118B24906C
-:101672007FE2E054BFF09020587400F0801BE0DE5F
-:0E168200FD907FE2E054BFF09020587400F01D
-:10169000902009E054FDF0907FC9F00213439020A0
-:1016A00012E0543F20E23A20E10B20E40B20E51445
-:1016B0006009021343021787021343438204E0F5D3
-:1016C0003C021343438204E0432F0102134353823D
-:1016D000F8438205E042385382FBE054FBF00213EA
-:1016E0004330E10280E8F585E53230E20A5382F8C2
-:1016F000438204E054FEF0E58520E35690205074C8
-:1017000002F09020587401F0907FE2E04440F090A5
-:101710007FE30586907D800586E585F0A3E584F06E
-:101720000586907FE5E541FD030303FEF0F0F0F050
-:10173000F0F0F0F0DEF6907FE2E054BFF090205839
-:101740007400F0907FBBEDF0902011E054FEF002A9
-:1017500013437F40907D800586902010E584FE2411
-:1017600005FD8D84E08E8430E009E00586F0A30558
-:1017700086DFEF0586C374409F907FBBF00586A38C
-:10178000E054FEF0021343532FFAE5256008752557
-:1017900000D2E7FE800A907FCBE0FE7003021821A2
-:1017A0009020507402F09020587401F0907FE2E095
-:1017B0004440F0907FE30586907D400586E585F006
-:1017C000A3E584F00586907FE5EE30E7080586E026
-:1017D0002438F00586EE547FFE5407FBEE54786003
-:1017E0003003030330E30474077B08FDFCE0E0E012
-:1017F000E0E0E0E0E0DDF6EBFE6019EC640770117C
-:101800008B25907FE2E054BFF09020587400F08068
-:101810001BE0DEFD907FE2E054BFF09020587400A2
-:10182000F0902011E054FDF0907FCBF00213439034
-:10183000201AE0543F20E23A20E10B20E40B20E59F
-:10184000146009021343021918021343438204E08F
-:10185000F53D021343438204E04330010213435336
-:1018600082F8438205E042395382FBE054FBF002E8
-:10187000134330E10280E8F585E53230E30A538214
-:10188000F8438204E054FEF0E58520E356902050B2
-:101890007403F09020587401F0907FE2E04440F02F
-:1018A000907FE30586907D000586E585F0A3E584BD
-:1018B000F00586907FE5E542FD030303FEF0F0F0BE
-:1018C000F0F0F0F0F0DEF6907FE2E054BFF0902010
-:1018D000587400F0907FBDEDF0902019E054FEF0B8
-:1018E0000213437F40907D000586902018E584FE1A
-:1018F0002405FD8D84E08E8430E009E00586F0A3A8
-:101900000586DFEF0586C374409F907FBDF0058696
-:10191000A3E054FEF00213435330FAE52660087545
-:101920002600D2E7FE800A907FCDE0FE7003021908
-:10193000B29020507403F09020587401F0907FE230
-:10194000E04440F0907FE30586907CC00586E58505
-:10195000F0A3E584F00586907FE5EE30E708058684
-:10196000E02438F00586EE547FFE5407FBEE5478F1
-:10197000603003030330E30474077B08FDFCE0E000
-:10198000E0E0E0E0E0E0DDF6EBFE6019EC6407701B
-:10199000118B26907FE2E054BFF09020587400F045
-:1019A000801BE0DEFD907FE2E054BFF09020587491
-:1019B00000F0902019E054FDF0907FCDF002134329
-:0119C00032F4
-:0419C100AD07AC06BC
-:1019C5007906ED2404F582E43CF583E0FAA3E0FB17
-:1019D5004A7003021B09E9B407004003021ADB90B1
-:1019E50019EBF8282873021AB9021A71021A5A0259
-:1019F5001A40021A2F021A1A021A00907FA5E04413
-:101A050080F08D828C83A3E0FF25E044A0907FA623
-:101A1500F019021ADB198D828C83E0C39420400AE9
-:101A2500A3A3E0907FA6F0021ADB8D828C83A3A38B
-:101A3500E0A3E0907FA6F019021ADB907FA5E044B1
-:101A450080F08D828C83A3E0FF25E044A1907FA6E2
-:101A5500F019021ADBEB64014A7008907FA5E04497
-:101A650020F019907FA6E0F55919806AED2404F558
-:101A750082E43CF583E0FEA3E064024E7008907FAB
-:101A8500A5E04420F019907FA6E0FFED2406F5823D
-:101A9500E43CF583E475F00112A29785F082F583A5
-:101AA500EFF0ED2404F582E43CF58374FFF5F012C4
-:101AB500A2818022907FA5E04440F0907FA6E0FFC0
-:101AC500ED2406F582E43CF583E0FAA3E0F5828A8D
-:101AD50083EFF07F0822907FA5E0F55930E0F730DD
-:101AE500E207E04440F07F0622E9D3940250030266
-:101AF50019C7E55930E1030219C7907FA5E04440B5
-:061B0500F07F07227F08BB
-:011B0B0022B7
-:101B0C00E533C39401501C7F057E001209AE7F02A1
-:101B1C007DFF1282EA7F057E001209AE7F037DFFF6
-:041B2C001282EA2215
-:108000007BFF7A12791B90000412A254FD8B5075ED
-:108010005112755224E4907FE1F0907FE0F0F54E2C
-:10802000F54F9002AEF0907FDFF0907FDEF0907F12
-:10803000A974FFF0907FAAF0E4FCEC25E024B4F5ED
-:1080400082E4347FF583E4F00CBC10EEE4907FDD35
-:10805000F0AF051DEF70030281C6AB50AA51A952C3
-:1080600090000112A254640560030281B5900003E0
-:1080700012A2546401600302813C90000212A254D7
-:10808000FF547FFCD394075003028116ECC3941075
-:108090004003028116EF30E742E54FAE4E7802CE44
-:1080A000C313CE13D8F9FF74F02CF582E4347FF5B6
-:1080B00083EFF0907FE0E0FFEC24F8FE7401A80667
-:1080C000088002C333D8FC4F907FE0F09002AEE00E
-:1080D00004F0907FDDE04480F0803EE54FAE4E78C6
-:1080E00002CEC313CE13D8F9FF74E82CF582E43422
-:1080F0007FF583EFF0907FE1E0FFEC24F8FE740160
-:10810000A806088002C333D8FC4F907FE1F09002AC
-:10811000AEE004F080037FFF2290000412A25425F9
-:108120004FF54FE4354EF54E90000512A254FEE493
-:10813000254FF54FEE354EF54E0281B8AB50AA51A2
-:10814000A95290000312A254FF64026005EF640379
-:10815000706090000212A254FF547FFCD394075029
-:108160004EEF30E71E907FDEE0FF7401A804088028
-:1081700002C333D8FCFE4F907FDEF0907FACE04E20
-:10818000F08035907FDFE0FF7401A804088002C30F
-:1081900033D8FCFE4F907FDFF0907FADE04EF0ECE7
-:1081A00025E024C5F582E4347FF583ECF080097F77
-:1081B000FF227FFF227FFF2274072552F552E4350C
-:1081C00051F55102805120030D9002AEE0600790FE
-:0881D0007FAEE04402F07F00E5
-:0181D8002284
-:0481D9008E598F5AD2
-:1081DD00755B03E55A2404F582E43559F583E0FE19
-:1081ED00A3E04E70030282E7E55B604E1460381425
-:1081FD00602014600302828B907FA5E04480F0859F
-:10820D005A82855983A3E0FF25E044A0907FA6F014
-:10821D00806C855A82855983E0C394204009A3A3BD
-:10822D00E0907FA6F08057155B855A82855983A310
-:10823D00A3E0A3E0907FA6F08044E55A2406F582E2
-:10824D00E43559F583E475F00112A29785F082F5B6
-:10825D0083E0907FA6F0907FA5E04440F0E55A249E
-:10826D0004F582E43559F58374FFF5F012A281858A
-:10827D005A82855983A3A3E475F00112A281907FE0
-:10828D00A5E0F55C30E0F730E207E04440F07F0612
-:10829D0022E55C20E10A907FA5E04440F07F0722B3
-:1082AD00E55B70317F017E001209AE907FA5E04441
-:1082BD0080F0855A82855983A3E0FF25E044A09084
-:1082CD007FA6F0907FA5E0F55C30E0F730E1D57545
-:0C82DD005B030281E0155B0281E07F087A
-:0182E9002272
-:0282EA00AE07DD
-:1082EC007C02EC14601514701E907FA5E04480F0A5
-:1082FC00EE25E04440907FA6F0800C907FA6EDF038
-:10830C00907FA5E04440F0907FA5E0FB30E0F8BC06
-:10831C00020A20E107E04440F07F0722EB30E20A3A
-:0E832C00907FA5E04440F07F0622DCB67F087B
-:01833A002220
-:10833B00C0E0C083C082C2A99003007419F0D2A917
-:0F834B0053917F9001C4E4F0D082D083D0E03210
-:10835A00EF75F008A42400F582E43420AB82FAF524
-:10836A0083A3E4F08B828A83A3A3A3E0F56174BF9D
-:10837A00F08B828A83A3A3E04410F08B828A83A3C2
-:10838A00A3A3E4F08B828A83A3F0F9ED601D740144
-:10839A007E00A807088005C333CE33CED8F9FFE4A0
-:1083AA00EF5531600479098002790D8B828A83A3A3
-:1083BA00A3A374BFF08B828A83A3A3E054EFF08B4C
-:1083CA00828A83A3A3A3E561F0AE02AF038F828EF4
-:0483DA0083A3E9F0A0
-:0183DE00227C
-:0483DF008F618D62BB
-:1083E300E4F567743F2FF876087F807E257D007C57
-:1083F30000AB66AA65A964A863D312A3B340267F22
-:10840300007E967D007C00A863D312A3B3500C7545
-:108413006740743F2561F87610800A756780743F62
-:108423002561F87638E56745624401FFE56175F03B
-:0D84330008A42402F582E43420F583EFF064
-:018440002219
-:108441008F828E83E014F557C3940440037FFF228B
-:10845100E55775F008A42400F582E43420AF82F5D5
-:10846100588F59E55725E024C6F582E4347FF5831A
-:10847100E020E10FE55725E024C7F582E4347FF5DC
-:1084810083E4F074232557F8E4F6E5592404F582D2
-:10849100E43558F583E04403F0E55775F00DA42465
-:1084A10002F582E43403F583E0FCA3E0FDA3E0FEE2
-:1084B100A3E0F5668E658D648C637D06AF571283EC
-:1084C100DFAF577D0112835A855982855883A3A353
-:1084D100E020E043E0FFE5592405F582E43558F555
-:1084E10083E0E5592406F582E43558F583E0FFE59C
-:1084F1005775F00DA42402F582E43403F583E0FC02
-:10850100A3E0FDA3E0FEA3E0F5668E658D648C63B8
-:108511007D06AF571283DF74F82557F582E43402E4
-:10852100F583E4F0E55725E0FFC3740C9F75F04037
-:10853100A42440F582E5F0347BAF82FEE55725E0C7
-:1085410024EFF582E43402F583EEF0A3EFF0AF57A8
-:0F8551007401A807088002C333D8FC42347F00AE
-:0185600022F8
-:108561008F828E83E014F557C3940440037FFF226A
-:10857100AF57E4FD12835A74F82557F582E43402AB
-:10858100F583E4F0E55775F008A42400F582E4349E
-:1085910020AF82F5598F5AF583E5822404F582E4F0
-:1085A1003583F583E054FCF0E55775F00DA4240CF8
-:1085B100F582E43403F583E4F0E55775F00DA42466
-:1085C10002F582E43403F583E0FCA3E0FDA3E0FEC1
-:1085D100A3E0F5668E658D648C637D06AF571283CB
-:1085E100DFE55A2405F582E43559F583E030E009E9
-:1085F100855A82855983E0F558AF577401A8070859
-:108601008002C333D8FCF45234E55725E024C6F583
-:1086110082E4347FF583E020E10FE55725E024C7AC
-:0B862100F582E4347FF583E4F07F0075
-:01862C00222B
-:04862D008E578F587D
-:108631008F828E83E014F559C3940440037FFF2297
-:10864100E55975F008A42401F582E43420F583E0AE
-:1086510054037066855882855783A3E030E028E58E
-:108661005975F00DA42402F582E43403F583E0FC8E
-:10867100A3E0FDA3E0FEA3E0F5668E658D648C6347
-:108681007D02AF591283DF855882855783A3E0307D
-:10869100E128E55975F00DA42402F582E43403F5CF
-:1086A10083E0FCA3E0FDA3E0FEA3E0F5668E658D0B
-:0C86B100648C637D04AF591283DF7F00EE
-:0186BD00229A
-:1086BE008F828E83C083C082E0FDA3A3A3E0FCED76
-:1086CE006CD082D083F08F828E83A3A3A3C083C08D
-:1086DE0082E0FD8F828E83E0FCED6CD082D083F041
-:1086EE008F828E83C083C082A3A3A3E0FDEC6DD0E6
-:1086FE0082D083F08F828E83A3C083C082E0FD8FF1
-:10870E00828E83A3A3E0FCED6CD082D083F08F82A7
-:10871E008E83A3A3C083C082E0FD8F828E83A3E0ED
-:10872E00FCED6CD082D083F08F828E83A3C083C089
-:10873E0082E0FD8F828E83A3A3E0FFED6FD082D007
-:03874E0083F02293
-:04875100AD07AC06BE
-:10875500790D8D828C83E014FEC3940440037FFF62
-:10876500228C578D58EE75F00DA42401F582E43462
-:1087750003AF82FEAD0119ED60240FEFAC06700169
-:108785000E14F5828C83E0FD0558E558AA57700252
-:10879500055714F5828A83E06D60D97F01227F0039
-:0187A50022B1
-:0487A6008E578F5803
-:1087AA008F828E83E014F55EC3940440037FFF2218
-:1087BA00E55E75F008A42400F582E43420AF82F562
-:1087CA005F8F60855882855783A3E0FCA3E0FDA3F1
-:1087DA00E0FEA3E0FF7B087A0079007800D312A3B9
-:1087EA00B34010855882855783A312A3FA0000006C
-:1087FA0008802E855882855783A3E0FCA3E0FDA359
-:10880A00E0FEA3E0FF7B007A0879077800C312A391
-:10881A00B3500E855882855783A312A3FA0007081E
-:10882A0000855882855783A3E0F8A3E0F9A3E0FA0C
-:10883A00A3E0FB7F007E507D467C0012A3218F5C63
-:10884A008E5B8D5A8C597B0A7A007900780012A3C4
-:10885A0021AF038F5DAF5CAE5BAD5AAC597B0A7A30
-:10886A00007900780012A3218F5C8E5B8D5A8C5997
-:10887A00E55DC394054015E55C2401F55CE4355BD0
-:10888A00F55BE4355AF55AE43559F5598560828520
-:10889A005F83A3E4F0856082855F83A3A3A3E0449A
-:1088AA0080F0856082855F83E55CF0AF5CAE5BAD8E
-:1088BA005AAC59780812A3C4856082855F83A3EFF6
-:1088CA00F0856082855F83A3A3A3E0547FF0E4F57B
-:1088DA005DE558240BF582E43557F583E0FF30E077
-:1088EA00235401F0E5602404F582E4355FF583E062
-:1088FA0054FDF0AF5E7401A807088002C333D8FCA8
-:10890A004222803674017E00A85E088005C333CEF9
-:10891A0033CED8F9FFE4EF5522601FE5602404F551
-:10892A0082E4355FF583E04402F0AF5E7401A80784
-:10893A00088002C333D8FCF45222E5582408F58291
-:10894A00E43557F583E0FFB46205435D0A801AEF08
-:10895A00B47205435D088011EFB47405435D02806B
-:10896A0008EF646E60037FFF22E558240BF582E46A
-:10897A003557F583E0FF30E303435D80EF30E712BC
-:10898A00435D40E5602404F582E4355FF583E04405
-:10899A0002F0E558240BF582E43557F583E030E11F
-:1089AA0020AF5E7401A807088002C333D8FC4232A4
-:1089BA00E5602404F582E4355FF583E04401F08044
-:1089CA0010AF5E7401A807088002C333D8FCF452C2
-:1089DA0032E558240BF582E43557F583E0FF30E49D
-:1089EA0011AE5E7401A806088002C333D8FC423176
-:1089FA008010AE5E7401A806088002C333D8FCF466
-:108A0A005231EF20E10330E403E4F55D85608285AD
-:108A1A005F83A3A3A374BFF0856082855F83A3A34A
-:108A2A00E4F0E55DF0E558240AF582E43557F5836C
-:108A3A00E0FFE5602404F582E4355FF583EFF0E5B5
-:108A4A0058240AF582E43557F583E0FFE5602405EA
-:108A5A00F582E4355FF583EFF0E5582409F582E401
-:108A6A003557F583E0FFE5602406F582E4355FF5C6
-:108A7A0083EFF0E5582409F582E43557F583E0FFE2
-:108A8A00E5602407F582E4355FF583EFF0856082BF
-:108A9A00855F83A3A3A3E4F0856082855F83A3A394
-:108AAA00F0855882855783A3E0FCA3E0FDA3E0FE8E
-:108ABA00A3E0F5668E658D648C637D06AF5E1283D6
-:108ACA00DF755D08E558240CF582E43557F583E037
-:108ADA006003435D10E5602404F582E4355FF583A5
-:108AEA00E05403455DF0E5582405F582E43557F571
-:108AFA0083E0FEC394054006EED3940840037FFF4B
-:108B0A0022E5582406F582E43557F583E0FDC3943F
-:108B1A00014006EDD3940240037FFF22ED14FF25A6
-:108B2A00E025E0FFEE24FB4FF55DE5582407F582CA
-:108B3A00E43557F583E024D0601814601A24C36022
-:108B4A001E146009240A7014435D188012435D08DC
-:108B5A00800D435D388008435D2880037FFF2285AE
-:108B6A006082855F83A3A3A3E55DF074017E00A8FC
-:108B7A005E088005C333CE33CED8F9FFE4EF55340F
-:108B8A006007AF5E7D0112835AAA57A9587B01C0BC
-:108B9A0003C001E55E75F00DA42401F9740335F0F4
-:108BAA00A801FCAD03D001D0037E007F0D12A212F2
-:028BBA007F003A
-:018BBC002296
-:108BBD008F828E83E014FEC3940440037FFF22EE68
-:108BCD0075F008A42400F582E43420AD82FC9001F8
-:108BDD002C7408F0EE04A3F0E4A3F08D828C83E5F1
-:108BED00822406F582E43583F583E090012FF08D24
-:108BFD00828C83E5822405F582E43583F583E05488
-:108C0D001E900130F0742D2EF8E6A3F0AF0674011E
-:108C1D00A807088002C333D8FCF557E533C3940188
-:108C2D00400D902078E0540F755800F55980097F5C
-:108C3D00021211278E588F59C3E5586480948040D5
-:108C4D00DAE5575559900132F07E017F2C7D0712E0
-:048C5D00916A7F0099
-:018C610022F0
-:108C62008F828E83E014FEC3940440037FFF22EEC2
-:108C720075F008A42400F582E43420AF82FE90014E
-:108C820033740AF08F828E83E5822404F582E43500
-:108C920083F583E0900134F07E017F337D021291EF
-:038CA2006A7F00E6
-:018CA50022AC
-:048CA6008E578F58FE
-:108CAA008F828E83E014FEC3940440037FFF22EE7A
-:108CBA0075F008A42400F582E43420AD82FC8558BE
-:108CCA0082855783A3E0600FED2404F582E43CF526
-:108CDA0083E04402F08043EE75F00DA4240CF58283
-:108CEA00E43403F583E030E020EE25E024C6F58283
-:108CFA00E4347FF583E030E1F07F60ED2405F5820E
-:108D0A00E43CF583E05FB507F2AE04AF05EF240457
-:0C8D1A00F582E43EF583E054FDF07F009C
-:018D2600222A
-:048D2700AD07AC06E2
-:108D2B008D828C83E014FEC3940440037FFF22EEFC
-:108D3B0075F008A42400F582E43420AF82FE8D8206
-:108D4B008C83A3E0600FEF2404F582E43EF583E00F
-:108D5B004401F0800DEF2404F582E43EF583E054EA
-:048D6B00FEF07F0097
-:018D6F0022E1
-:048D7000AD07AC0699
-:108D74008D828C83E014FEC3940440037FFF22EEB3
-:108D840075F008A42400F582E43420AF82FE8D82BD
-:108D94008C83A3E0600D8F828E83A3A3A3E0444061
-:108DA400F0800B8F828E83A3A3A3E054BFF07F00D7
-:018DB400229C
-:108DB5008F828E83E014FEC3940440037FFF22AFAD
-:108DC500067401A807088002C333D8FC423E7F0021
-:018DD500227B
-:048DD6008E578F58CD
-:108DDA008F828E83A3E0F55C8F828E83E0F559D370
-:108DEA00940440037FFF22E55924FE601614601F95
-:108DFA001460282403702E7E7E7F80755A7E755BF0
-:108E0A008080227E7E7F00755A7E755B0080167E8A
-:108E1A007D7F80755A7D755B80800A7E7D7F0075B7
-:108E2A005A7D755B00E55C701B855B82855A83748D
-:108E3A00FFF0E55925E024B5F582E4347FF5837423
-:108E4A0001F08048E5582402FFE43557FEE55C60EE
-:108E5A00230FEFAC0670010E14F5828C83E0FD053A
-:108E6A005BE55BAA5A7002055A14F5828A83EDF013
-:108E7A00155C80D9855882855783A3E0FFE559257B
-:0E8E8A00E024B5F582E4347FF583EFF07F003D
-:018E980022B7
-:108E9900EF2405F558E43EF5579001357407F09035
-:108EA900017A7401F0A37436F0855882855783A33B
-:108EB900A3A3E0FEA3E08E59F55A8558828557830E
-:108EC900E0249E606124F9600E24F17003028F7A18
-:108ED90024146003028FC8855882855783A3E0FE56
-:108EE900A3E0FFC3E49FF55C74019EF55BD3E55CE9
-:108EF900943FE55B94004006755B00755C3FD3E5E4
-:108F09005A955CE559955B5003028FCBAE5BAF5C1C
-:108F1900855882855783A3A3A3EEF0FEA3EFF08EB5
-:108F290059F55A028FCB855882855783A3E0FEA352
-:108F3900E0FFC374309FF55CE49EF55BD3E55C9478
-:108F490010E55B94004006755B00755C10D3E55A2B
-:108F5900955CE559955B406AAE5BAF5C8558828547
-:108F69005783A3A3A3EEF0FEA3EFF08E59F55A8021
-:108F790051855882855783A3E0FEA3E0FFC3E49F90
-:108F8900F55CE49EF55B455C600BD3E55C943FE5DD
-:108F99005B94004006755B00755C3FD3E55A955CB0
-:108FA900E559955B401CAE5BAF5C8558828557835C
-:108FB900A3A3A3EEF0FEA3EFF08E59F55A80037F29
-:108FC9000122855882855783E0249E700302908B85
-:108FD90024F9605824F170030290DB241460030221
-:108FE900911F855882855783A3E0FEA3E0FFD394A0
-:108FF900FFEE9400400302911F900175EFF0E55ACE
-:10900900155AAE59700215594E700302911F9001FD
-:1090190075E0FF04F0A807E6FF90017AE475F00116
-:1090290012A29785F082F583EFF080D28558828568
-:109039005783A3E0FEA3E0FFC39480EE940050039E
-:1090490002911FD3EF94FFEE9400400302911F9009
-:109059000176EFF0E55A155AAE59700215594E705E
-:109069000302911F900176E0FF04F0A807E6FF9044
-:10907900017AE475F00112A29785F082F583EFF089
-:1090890080D2855882855783A3E0FEA3E0FFC3946D
-:1090990020EE9400500302911FD3EF942FEE940019
-:1090A9005074900177EFF0E55A155AAE59700215D0
-:1090B900594E6062900177E0FF04F0A807E6FF903F
-:1090C900017AE475F00112A29785F082F583EFF039
-:1090D90080D5855882855783A3E0FFA3E090017866
-:1090E900CFF0A3EFF0E55A155AAE59700215594E53
-:1090F9006024900178E475F00112A29785F082F559
-:1091090083E0FF90017AE475F00112A29785F0825D
-:10911900F583EFF080CF7E017F35855882855783AF
-:0D912900A3A3A3E0A3E004FD12916A7F0060
-:019136002216
-:109137008E628F638C648D65AF031BEF60240563BC
-:10914700E563AE627002056214F5828E83E0FF0567
-:1091570065E565AC647002056414F5828C83EFF0F5
-:0391670080D6228D
-:06916A008D5DAB07AA06B3
-:1091700075614075600D755F03755E00907FC2E09C
-:1091800020E1F9AF61AE60AD5FAC5EEC4D4E4F706B
-:1091900008907FC27402F080D7907FC2E020E11671
-:1091A000AF03AE027C7B7D80AB5D129137907FC3B5
-:0891B000E55DF07F01227F0064
-:0191B8002294
-:1091B900900184740BF0A3E533F0900AF5E49390E1
-:1091C9000186F0900AF6E493900187F0E490017C1F
-:1091D900F0A3F0A3F0A3F0A3F0A37410F0A374011B
-:1091E900F0A37488F07E017F7C1219C17E017F840F
-:0791F9007D1412916A7F0052
-:01920000224B
-:109201007E7B7F40754E7B754F40907FD3E0FF851D
-:109211004E51854F52E5522401F556E43551F5552D
-:10922100E4F550855282855183E0FE14B40C005060
-:109231005B909239F828287302925D02925D029246
-:109241006702927102927102927102928502925D9D
-:1092510002927B02925D02928D02925DEF64026046
-:109261002B7550FF8026EF640E60217550FF801C26
-:10927100EF640360177550FF8012EF6403600D7592
-:1092810050FF8008EF640660037550FFE5506015DC
-:109291009001987411F0A3EEF07E017F987D021287
-:1092A100916AAF5022E4F550855282855183E014D2
-:1092B100B40F0040030293CF9092C0F828287302A4
-:1092C10092ED0292F902930502935302935E029387
-:1092D1006902937402937F02938A0293950293A089
-:1092E1000293A70293CF0293B20293BDAF56AE553C
-:1092F1001284418F500293D2AF56AE551285618FC1
-:10930100500293D2855553855654E5542401FFE408
-:109311003553FE1286BEAF54AE531287518F50EFB4
-:10932100640160030293D2AF54AE531287A68F50EB
-:10933100E55070030293D2855482855383E075F022
-:109341000DA424F4F582E43402AF82FE1287A60252
-:1093510093D2AF56AE55128CA68F508074AF56AED5
-:1093610055128D278F508069AF56AE55128D708F73
-:1093710050805EAF4FAE4E128E998F508053AF56D4
-:10938100AE55128BBD8F508048AF56AE5512862D0B
-:109391008F50803DAF56AE55128C628F5080321285
-:1093A10091B98F50802BAF56AE55128DB58F50802D
-:1093B10020AF56AE55128DD68F508015AF4FAE4EA1
-:1093C1007C027DAF7B40129137E4F55080037550EC
-:1093D100FFE550601D9001987411F085528285510E
-:1093E10083E0900199F07E017F987D0212916AAF2E
-:1093F1005022855282855183E0FF1424FA500424BF
-:10940100FE701F9001987410F0A3EFF085568285CD
-:109411005583E090019AF07E017F987D0312916A55
-:049421008F50AF5069
-:019425002224
-:089426008F518E508D4F8C4ECA
-:10942E0075580175599CE4F557AF531553EF7003FA
-:10943E000294C4AF52E4FCFDFEF8F9FAAB07AF514B
-:10944E00AE50AD4FAC4E12A321AF038F56AF51AEFF
-:10945E0050AD4FAC4EC004C005C006C007AF52E4BD
-:10946E00FCFDFEF8F9FAAB07D007D006D005D00404
-:10947E0012A3218F518E508D4F8C4EE5562430F510
-:10948E0056D39439400674072556F5560559E559B5
-:10949E00AE587002055814F5828E83E4F00559E536
-:1094AE0059AE587002055814F5828E83E556F005B4
-:1094BE00570557029437E559155970021558AF578D
-:1094CE001557EF6023E5591559AE5870021558F52A
-:1094DE00828E83E0FF0555E555AC54700205541499
-:0894EE00F5828C83EFF080D6BB
-:0194F6002253
-:1094F700E49001C9F07E017FCA9001BEEEF0A3EFB0
-:0A950700F09001C2EEF0A3EFF02295
-:10951100AA07A9059001C9E0C394405061AC027447
-:10952100017E00A804088005C333CE33CED8F9FFED
-:10953100E4EF55346045EA04FF9001C2E0FCA3E08A
-:10954100FDF5828C83EFF0A3E9F08D828C83A3A3D8
-:10955100EBF09001C2E475F00312A281FCD3E5F0B7
-:109561009487EC9402400A9001C27401F0A374CA7A
-:10957100F0C2AF9001C9E004F0D2AF7F01227F00B9
-:0195810022C7
-:109582009001C9E0D3940040559001BEE0FCA3E0F5
-:10959200AA04F97B01C003C002C001AA06A907A858
-:1095A20001AC02AD03D001D002D0037E007F0312D2
-:1095B200A2129001BEE475F00312A281FCD3E5F081
-:1095C2009487EC9402400A9001BE7401F0A374CA1D
-:1095D200F0C2AF9001C9E014F0D2AF7F01227F0048
-:0195E2002266
-:1095E300907FC2E020E1737E7B7F8075537B75544F
-:1095F30080E5542401FFE43553A9077B018B55F51E
-:10960300568957FE129582EF6050AB55AA56A9575B
-:1096130012A23B14FF90000112A254B40216C2AF6F
-:10962300EF75F008A42401F582E43420F583E044C7
-:1096330004F0D2AF74017E00A807088005C333CEBF
-:1096430033CED8F9FFE4EF5534600F855482855348
-:0A96530083740DF0907FC37404F0DF
-:01965D0022EA
-:10965E001295E3E4F54E743A254EF8E654F0F54FC4
-:10966E0074C5254EF582E43401F583E0654FFFC4E1
-:10967E00540FF550602274C5254EF582E43401F581
-:10968E0083E54FF0AF4E7D01E54F4550FB1295112E
-:10969E00EF70051295E380EC054EE54EC394044041
-:1096AE00B51295E3E53E6048E4F54EAF4E7401A861
-:1096BE0007088002C333D8FCF54F553E6029E54EAE
-:1096CE0075F008A42405F582E43420F583E030E635
-:1096DE0016AF4E7D047B80129511EF70051295E347
-:1096EE0080EFE54FF4523E054EE54EC3940440BB69
-:1096FE00900300E060030297DF7419F0E533C39422
-:10970E0001400D902078E0540F755100F5528009FC
-:10971E007F021211278E518F52C3E55164809480BF
-:10972E0040DA9001BCE06552F06037E4F54EAF4E82
-:10973E007401A807088002C333D8FCF54F9001BC12
-:10974E00E0554F6014AF4E7D08E54F5552FB129514
-:10975E0011EF70051295E380EC054EE54EC39404AF
-:10976E0040CC9001BCE552F0E4F54EC2AF74362504
-:10977E004EF8E6F54FE4F6D2AF534F1EE54F6011AB
-:10978E00AF4E7D02AB4F129511EF70051295E3802F
-:10979E00EF742D254EF8E6F54F74FC254EF582E458
-:1097AE003402F583E0654F6011AF4E7D04AB4F126E
-:1097BE009511EF70051295E380EF74FC254EF5823E
-:1097CE00E43402F583E54FF0054EE54EC3940440B4
-:0497DE009A1295E363
-:0197E2002264
-:0C97E300787FE4F6D8FD75816702982AB3
-:1097EF000205ADE493A3F8E493A34003F68001F2DE
-:1097FF0008DFF48029E493A3F85407240CC8C3337B
-:10980F00C4540F4420C8834004F456800146F6DF49
-:10981F00E4800B010204081020408090986FE47ED2
-:10982F00019360BCA3FF543F30E509541FFEE4933E
-:10983F00A360010ECF54C025E060A840B8E493A305
-:10984F00FAE493A3F8E493A3C8C582C8CAC583CA30
-:10985F00F0A3C8C582C8CAC583CADFE9DEE780BEE8
-:10986F006024028A010204081020408081828488CB
-:10987F0090A0C0C1C2C4C8D0E0E1E2E4E8F0F1F2C8
-:08988F00F4F8F9FAFCFDFEFFFC
-:0198970000D0
-:089898008B598A5A895B8D5C33
-:1098A000E4F55DF55EAF5C155CEF6036AB59055BCA
-:1098B000E55BAA5A7002055A14F912A23BFFE55D56
-:1098C000E55E6F25E0FFE433FE74952FF582EE34FC
-:1098D0009EF583E55DFFE493F55D7401936FF55E9E
-:0698E00080C3AE5DAF5E27
-:0198E600225F
-:0B98E700C0E0C083C082C0D075D01864
-:1098F200902060E0540FFE30E005902002E0FFEE81
-:1099020030E10590200AE0FFEE30E205902012E0FF
-:10991200FFEE30E30590201AE0FF9001C4E0B51E8F
-:0A99220004E4F080059001C4EEF0AB
-:09992C00D0D0D082D083D0E0320B
-:02993500A90384
-:10993700EF75F008A42400F582E43420AB82FAE541
-:109947005C455DF55EE960148A83E5822404F5824F
-:10995700E43583F583E04DF0E4FE8013EB2404F552
-:1099670082E43AF583E0FFEDF4FCEF5CF0AE5EEBEA
-:109977002406F582E43AF583E0555EFCB50603AFAD
-:109987000522E55C5CFEE55D5CFDE96016EE7004B2
-:109997007F0180027F00AE07ED70047F0180027FA8
-:1099A70000AD07EE6003AF5C22ED6003AF5D227F81
-:0199B70000AF
-:0199B800228C
-:1099B9007555027556B0900335740FF0855682853A
-:1099C9005583A3E0FF900337F0855682855583E0E0
-:1099D900900336F090033874FFF0755703755839C2
-:1099E900EF14B40B004003029E5D9099FAF8282801
-:1099F90073029A1B029ABA029BBF029BDE029BDE8C
-:109A0900029C94029CCF029CF4029DB2029DE20248
-:109A19009E0EE4F54EE54E75F008A42400F582E4A7
-:109A29003420AF82F5538F54E4FFE4FEEF601074E5
-:109A39008A2EF582E43402F583E0F4F54F800D7443
-:109A49008A2EF582E43402F583E0F54FE5542407C4
-:109A5900F582E43553F583E54FF0E0F550654F6045
-:109A690038E4900338F0E54E04FD0558E558AA5747
-:109A79007002055714F5828A83EDF00558E558AC54
-:109A8900577002055714F5828C83E54FF08558828B
-:109A9900855783E550F0029E630EBE248F0FEF6455
-:109AA900027087054EE54E64046003029A1E029E09
-:109AB90063E4F54EAF4EE4FD12835A054EE54ED3ED
-:109AC900940340F09000047498F0A374E7F0E4F56F
-:109AD900507E207F00755320755400F54EAF4E74AB
-:109AE90001A807088002C333D8FCF54F9001C4F0E0
-:109AF9009001C0E4F0A3740AF0855482855383A3CE
-:109B09007402F09001C4E0B54F349001C0E07002D6
-:109B1900A3E070EF900338F0E54E04FF0558E558CF
-:109B2900AC577002055714F5828C83EFF085588283
-:109B390085578374FFF0E49001C4F07550FF9001DC
-:109B4900C4E0FF6037E4900338F0E54E04FE0558A1
-:109B5900E558AC577002055714F5828C83EEF00571
-:109B690058E558AC577002055714F5828C83EFF00D
-:109B7900855882855783E54FF07550FFE55070167B
-:109B890074082554F554E43553F553054EE54E64F0
-:109B9900046003029AE6E4F54EAF4E7D0112835A42
-:109BA900054EE54ED3940340F09000047413F0A3DE
-:109BB9007412F0029E63855682855583E014FF7402
-:109BC90001A807088002C333D8FC9002F7F090017E
-:109BD900C4F0029E639001C07403F0A374E8F0E43A
-:109BE900F5509002F7E0FF9001C4E0B50719900124
-:109BF900C0E07002A3E070EA900338F085588285CE
-:109C0900578374FFF0F550E5506003029E6390019D
-:109C1900C0F0A37496F09001C0E07002A3E070F662
-:109C2900E533C39401400D902078E0540F7551003D
-:109C3900F55280097F021211278E518F52C3E551C7
-:109C49006480948040DAE552540FF5509002F7E0B1
-:109C5900555070047F0180027F008F4F85568285A1
-:109C69005583A3E0B4050CE54F70047F0180027FA2
-:109C7900008F4FE54F7003029E63E4900338F0852F
-:109C89005882855783E550F0029E63E4FFFD1283F5
-:109C99005A7E207F00755320755400855482855360
-:109CA90083A3A3A3E04480F0855482855383740180
-:109CB900F0A3E4F0855482855383A3A3A3E0547FE2
-:109CC900F0D204029E63C2047E207F007553207582
-:109CD9005400E5542405F582E43553F583E030E674
-:109CE900F1E4FF7D0112835A029E63E4F550F54EBB
-:109CF900AF4EE4FD12835AE54E75F008A42400F531
-:109D090082E43420AF82F5538F54F583E58224042D
-:109D1900F582E43583F583E054FCF0AF4E7D017B99
-:109D290001755C80755D401299358F50E550701151
-:109D3900AF4E7D027B01755C10755D201299358FE0
-:109D490050E5507010AF4E7D01FB755C80755D402C
-:109D59001299358F50E5507010AF4E7D02FB755C3E
-:109D690010755D201299358F50AF4E7D0112835ABF
-:109D7900E5506026E4900338F0E54E04FF0558E508
-:109D890058AC577002055714F5828C83EFF085584B
-:109D990082855783E550F0029E63054EE54ED394C4
-:109DA900035003029CF9029E63E4900359F0A3F067
-:109DB900A3F0A3F0A3F0A37410F0A3749EF0A3740E
-:109DC90085F07E037F591281D9EF64087003029EE2
-:109DD90063E4900338F0029E63E4900359F0A3F022
-:109DE900A3F0A3F0A3F0A37410F0A3E557F0A3E543
-:109DF90058F07E037F591219C1EF6408605CE49042
-:109E09000338F08055E5562402FFE43555FAA907D1
-:109E19007B017D10129898EF4E7032900359F0A390
-:109E2900F0A3F0A3F0A3F0A37410F0E55624029078
-:109E39000360F0E4355590035FF07E037F5912818A
-:109E4900D9EF64086014E4900338F0800DE49003BE
-:109E590038F080069003387401F09001C0E4F0A353
-:109E6900740AF09001C0E07002A3E070F67E037FEF
-:0B9E7900357D2412916AE49002AFF0E6
-:019E840022BB
-:109E8500FFFEFCF8F0E0C080000103070F1F3F7FD5
-:109E95000000C0C1C1810140C30103C00280C241AD
-:109EA500C60106C00780C7410500C5C1C48104407D
-:109EB500CC010CC00D80CD410F00CFC1CE810E402D
-:109EC5000A00CAC1CB810B40C90109C00880C8413D
-:109ED500D80118C01980D9411B00DBC1DA811A40AD
-:109EE5001E00DEC1DF811F40DD011DC01C80DC417D
-:109EF5001400D4C1D5811540D70117C01680D641AD
-:109F0500D20112C01380D3411100D1C1D0811040BC
-:109F1500F00130C03180F1413300F3C1F2813240AC
-:109F25003600F6C1F7813740F50135C03480F4417C
-:109F35003C00FCC1FD813D40FF013FC03E80FE412C
-:109F4500FA013AC03B80FB413900F9C1F88138403C
-:109F55002800E8C1E9812940EB012BC02A80EA41AC
-:109F6500EE012EC02F80EF412D00EDC1EC812C407C
-:109F7500E40124C02580E5412700E7C1E6812640AC
-:109F85002200E2C1E3812340E10121C02080E041BC
-:109F9500A00160C06180A1416300A3C1A2816240AC
-:109FA5006600A6C1A7816740A50165C06480A4417C
-:109FB5006C00ACC1AD816D40AF016FC06E80AE412C
-:109FC500AA016AC06B80AB416900A9C1A88168403C
-:109FD5007800B8C1B9817940BB017BC07A80BA41AC
-:109FE500BE017EC07F80BF417D00BDC1BC817C407C
-:109FF500B40174C07580B5417700B7C1B6817640AC
-:10A005007200B2C1B3817340B10171C07080B041BB
-:10A01500500090C191815140930153C052809241AB
-:10A02500960156C057809741550095C1948154407B
-:10A035009C015CC05D809D415F009FC19E815E402B
-:10A045005A009AC19B815B40990159C0588098413B
-:10A05500880148C0498089414B008BC18A814A40AB
-:10A065004E008EC18F814F408D014DC04C808C417B
-:10A07500440084C185814540870147C046808641AB
-:10A08500820142C043808341410081C180814040BB
-:10A09500E4FF74F82FF582E43402F583E0700302DF
-:10A0A500A138743A2FF8E620E50302A138EF75F0E0
-:10A0B50008A42400F582E43420AD82FCF583E58212
-:10A0C5002405F582E43583F583E0546064607063AC
-:10A0D500EF25E024EFF582E43402F583E475F00121
-:10A0E50012A29785F082F583E08D828C83F074F857
-:10A0F5002FF582E43402F583E014F07036EF25E0A5
-:10A1050024C7F582E4347FF583E4F0EF25E0FEC350
-:10A11500740C9E75F040A42440F582E5F0347BADC7
-:10A1250082FCEF25E024EFF582E43402F583ECF0C0
-:0CA13500A3EDF00FEF6404600302A0979C
-:01A1410022FB
-:10A14200E709F608DFFA8046E709F208DFFA803EFF
-:10A1520088828C83E709F0A3DFFA8032E309F608EC
-:10A16200DFFA8078E309F208DFFA807088828C8354
-:10A17200E309F0A3DFFA806489828A83E0A3F60808
-:10A18200DFFA805889828A83E0A3F208DFFA804CE2
-:10A1920080D280FA80C680D4806980F280338010B9
-:10A1A20080A680EA809A80A880DA80E280CA803322
-:10A1B20089828A83ECFAE493A3C8C582C8CCC5839A
-:10A1C200CCF0A3C8C582C8CCC583CCDFE9DEE7806A
-:10A1D2000D89828A83E493A3F608DFF9ECFAA9F0E9
-:10A1E200EDFB2289828A83ECFAE0A3C8C582C8CC3F
-:10A1F200C583CCF0A3C8C582C8CCC583CCDFEADE58
-:10A20200E880DB89828A83E493A3F208DFF980CCB9
-:10A2120088F0ED2402B4040050C2F582EB2402B4AB
-:10A22200040050B823234582F582EF4E60AEEF6002
-:09A23200010EE5822390A1927354
-:10A23B00BB010689828A83E0225002E722BBFE0221
-:09A24B00E32289828A83E4932254
-:10A25400BB010CE58229F582E5833AF583E02250BF
-:10A2640006E92582F8E622BBFE06E92582F8E22209
-:0DA27400E58229F582E5833AF583E4932223
-:10A28100C5F0F8A3E028F0C5F0F8E5821582700268
-:06A291001583E038F02205
-:10A29700A3F8E0C5F025F0F0E5821582700215837A
-:06A2A700E0C838F0E822D7
-:10A2AD00BB0110E58229F582E5833AF583E0F5F0EF
-:10A2BD00A3E0225009E92582F886F008E622BBFECC
-:10A2CD000AE92582F8E2F5F008E222E5832AF58312
-:08A2DD00E993F5F0A3E99322D7
-:10A2E50075F008758200EF2FFFEE33FECD33CDCC30
-:10A2F50033CCC58233C5829BED9AEC99E5829840B3
-:10A305000CF582EE9BFEED9AFDEC99FC0FD5F0D68F
-:10A31500E4CEFBE4CDFAE4CCF9A88222B800C1B9B9
-:10A325000059BA002DEC8BF084CFCECDFCE5F0CBF7
-:10A33500F97818EF2FFFEE33FEED33FDEC33FCEB30
-:10A3450033FB10D703994004EB99FB0FD8E5E4F9EB
-:10A35500FA227818EF2FFFEE33FEED33FDEC33FCD8
-:10A36500C933C910D7059BE99A4007EC9BFCE99ACC
-:10A37500F90FD8E0E4C9FAE4CCFB2275F010EF2F11
-:10A38500FFEE33FEED33FDCC33CCC833C810D70711
-:10A395009BEC9AE899400AED9BFDEC9AFCE899F84C
-:0EA3A5000FD5F0DAE4CDFBE4CCFAE4C8F922DF
-:10A3B300EB9FF5F0EA9E42F0E99D42F0E89C45F000
-:01A3C3002277
-:10A3C400E8600FECC313FCED13FDEE13FEEF13FF77
-:03A3D400D8F1229B
-:10A3D700080808E6CF2FF618E6CE3EF618E6CD3D7C
-:07A3E700F618E6CC3CF6225B
-:0CA3EE00ECF0A3EDF0A3EEF0A3EFF022E2
-:10A3FA00A8828583F0D083D08212A41112A41112EC
-:10A40A00A41112A411E473E493A3C583C5F0C58310
-:10A41A00C8C582C8F0A3C583C5F0C583C8C582C8AC
-:01A42A00220F
-:00000001FF
-/*****************************************************************************
- *
- * whiteheat.h -- ConnectTech WhiteHEAT Firmware.
- *
- * Copyright (C) 2000-2002 ConnectTech Inc (http://www.connecttech.com/)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * (10/09/2002) Stuart MacDonald
- * Firmware 4.06
- *
- * (04/09/2000) gkh
- * Updated the firmware with the latest provided by ConnectTech.
- *
- * (01/16/2000) gkh
- * Fixed my intel hex processing tool, so now the firmware actually
- * matches the original file (this was causing a few problems...)
- *
- * (01/15/2000) gkh
- * Added debug loader firmware if DEBUG is #defined:
- * Port 1 LED flashes when the vend_ax program is running
- * Port 2 LED flashes when any SETUP command arrives
- * Port 3 LED flashes when any valid VENDOR request occurs
- * Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
- *
- * version 1.0 (01/09/2000) gkh
- * Original firmware from ConnectTech massaged a little to be program
- * readable.
- *
- *****************************************************************************/
-
-#define whiteheat_DATE "20000106"
diff --git a/firmware/whiteheat_loader.HEX b/firmware/whiteheat_loader.HEX
deleted file mode 100644
index 5f663f6a2849..000000000000
--- a/firmware/whiteheat_loader.HEX
+++ /dev/null
@@ -1,314 +0,0 @@
-:0300000002098D65
-:030033000208FBC5
-:03004300020B00AD
-:03004B000205AA01
-:10010000907FA5E05410FFC4540F4450F50F13E442
-:1001100033F511907FE9E0245EB407004003020349
-:1001200078900128F82828730201BC0201BC020162
-:100130009102013D02015302016F02019A907F007A
-:10014000E511F0907FB57401F0907FB4E04402F0C7
-:10015000020378907F92E0FFC4540F907F00F090EC
-:100160007FB57401F0907FB4E04402F0020378128E
-:100170000A895007E4907F00F08006907F00740F9A
-:10018000F0907FB57401F0907FB4E04402F0020378
-:1001900078907FEAE0F50F020378907F007407F013
-:1001A000907FB57401F0907FB4E04402F07FE87E68
-:1001B00003120D94D206120CCC020378907FEAE071
-:1001C000752800F529A3E0FEE4EE4228907FEEE0DA
-:1001D000752A00F52BA3E0FEE4EE422A907FE8E0CA
-:1001E00064C060030202C9E52B452A70030203784C
-:1001F000C3E52B9440E52A94005008852A2C852BD2
-:100200002D8006752C00752D40907FE9E064A37069
-:1002100034F530F531C3E531952DE530952C505C42
-:10022000E5292531F582E5303528F583E0FF7400B6
-:100230002531F582E4347FF583EFF00531E5317047
-:1002400002053080D0E4F530F531C3E531952DE578
-:1002500030952C501874002531F582E4347FF583F5
-:1002600074CDF00531E5317002053080DDAF29AE87
-:1002700028AD2D7A7F79007B00120BF4907FB5E5D5
-:100280002DF0E52D2529F529E52C3528F528C3E5A0
-:100290002B952DF52BE52A952CF52A907F92E0FFE2
-:1002A000C4540F752E00F52FD39400E52E94005002
-:1002B0000C907FB4E020E1030201E780F4907FB46A
-:1002C000E020E2030201E780F4907FE8E064406010
-:1002D00003020378E52B452A7003020378E4907F3C
-:1002E000C5F0907F92E0FFC4540F752E00F52FD318
-:1002F0009400E52E94005009907FC4E030E109801D
-:10030000F7907FB4E020E3F9907FC5E0752C00F50D
-:100310002D907FE9E064A37034F530F531C3E53109
-:10032000952DE530952C503474C02531F582E43498
-:010330007E4E
-:10033100F583E0FFE5292531F582E5303528F583A0
-:10034100EFF00531E5317002053080D0AF29AE28DC
-:10035100AD2D7A7E79C07BC0120C3FE52D2529F5A4
-:1003610029E52C3528F528C3E52B952DF52BE52A14
-:09037100952CF52A0202D4C322E6
-:10037A00907FE9E070030204521470030204CE2451
-:10038A00FE700302054224FB700302044C1470033E
-:10039A0002044614700302043A147003020440244F
-:1003AA00056003020596120E4440030205A2907FDF
-:1003BA00EBE024FE60161460402402706974119008
-:1003CA007FD4F07400907FD5F00205A2907FEAE016
-:1003DA00FF120B588B258A268927EA496011AE023B
-:1003EA00EE907FD4F0AF01EF907FD5F00205A29096
-:1003FA007FB4E04401F00205A2907FEAE0FF120810
-:10040A00BA8B258A268927EA496011AE02EE907FC7
-:10041A00D4F0AF01EF907FD5F00205A2907FB4E04F
-:10042A004401F00205A2907FB4E04401F00205A263
-:10043A00120E1F0205A2120E2D0205A2120AF702BF
-:10044A0005A2120E110205A2120E4640030205A2CF
-:10045A00907FE8E0247F60241460312402705BA25C
-:10046A0000E433FF25E0FFA202E4334F907F00F05F
-:10047A00E4A3F0907FB57402F00205A2E4907F0035
-:10048A00F0A3F0907FB57402F00205A2907FECE031
-:10049A00F45480FFC4540FFFE054072F25E024B41E
-:1004AA00F582E4347FF583E054FD907F00F0E4A305
-:1004BA00F0907FB57402F00205A2907FB4E0440187
-:1004CA00F00205A2120E4840030205A2907FE8E05E
-:1004DA0024FE601D240260030205A2907FEAE0B4B4
-:1004EA000105C2000205A2907FB4E04401F00205B2
-:1004FA00A2907FEAE07038907FECE0F45480FFC469
-:10050A00540FFFE054072F25E024B4F582E4347F2A
-:10051A00F583E4F0907FECE05480FF131313541F2B
-:10052A00FFE054072F907FD7F0E04420F0806990D5
-:10053A007FB4E04401F08060120E4A505B907FE87D
-:10054A00E024FE60182402704F907FEAE0B40104B0
-:10055A00D2008044907FB4E04401F0803B907FEA6F
-:10056A00E07020907FECE0F45480FFC4540FFFE069
-:10057A0054072F25E024B4F582E4347FF58374010F
-:10058A00F08015907FB4E04401F0800C1201005015
-:10059A0007907FB4E04401F0907FB4E04402F02277
-:1005AA00C0E0C083C082C085C084C086758600C092
-:1005BA00D0C000C001C002C003C006C007907FA51A
-:1005CA00E030E206750D06020676907FA5E020E18E
-:1005DA000CE50D64026006750D07020676AF0DEF95
-:1005EA0024FE604814602C24FE6077240460030211
-:1005FA000676AB09AA0AA90BAF0C050C8F82758384
-:10060A0000120822907FA6F0E50C6508705E750D51
-:10061A00058059907FA6E0AB09AA0AA90BAE0C8EF9
-:10062A008275830012084F750D028040E50824FE8A
-:10063A00B50C07907FA5E04420F0E50814B50C0A34
-:10064A00907FA5E04440F0E4F50D907FA6E0AB0969
-:10065A00AA0AA90BAE0C8E8275830012084F050CEC
-:10066A00800A907FA5E04440F0E4F50D5391DFD075
-:10067A0007D006D003D002D001D000D0D0D086D087
-:0A068A0084D085D082D083D0E03206
-:100694008C338D34907F95E044C0F0E4F535F53625
-:1006A400C3E5369534E53595335069EF2536F58243
-:1006B400E5353EF58374FFF0F46002C322EF25367E
-:1006C400F582E5353EF583E4F06002C322EF25367A
-:1006D400F582E5353EF58374AAF064AA6002C3226C
-:1006E400EF2536F582E5353EF5837455F0645560A3
-:1006F40002C322AD36E5362FF582E5353EF583EDAE
-:10070400F0FCAC05ED6C6002C3220536E5367002E0
-:100714000535808CE4F535F536C3E5369534E53595
-:1007240095335027EF2536F582E5353EF583E065B0
-:10073400366002C322EF2536F582E5353EF583E4C3
-:0D074400F00536E5367002053580CED32273
-:10075100C204D205C203C200C202C201120E3DD2BE
-:10076100E843D820907FAB74FFF0907FA9F0907F91
-:10077100AAF05391EF907F95E044C0F0907F93747D
-:1007810030F0120A19907FAFE04401F0907FAEE0A3
-:10079100440DF0D2AF120E352001427524007523AD
-:1007A100007522007521007F487E927D007C00ABA0
-:1007B10024AA23A922A821C31208A950DB2001D809
-:1007C1007A0079007800E5242401F524EA3523F53F
-:1007D10023E93522F522E83521F52180CA300105CA
-:1007E10012037AC20130041A120E4050131209008A
-:1007F100300007907FD6E030E7F3120D4A120E4227
-:08080100C2031208FF80D62299
-:10080900BB010689828A83E0225002E722BBFE02ED
-:09081900E32289828A83E4932220
-:10082200BB010CE58229F582E5833AF583E022508B
-:1008320006E92582F8E622BBFE06E92582F8E222D5
-:0D084200E58229F582E5833AF583E49322EF
-:10084F00F8BB010DE58229F582E5833AF583E8F0DF
-:10085F00225006E92582C8F622BBFE05E92582C88B
-:02086F00F22273
-:10087100BB0110E58229F582E5833AF583E0F5F0C5
-:10088100A3E0225009E92582F886F008E622BBFEA2
-:100891000AE92582F8E2F5F008E222E5832AF583E8
-:0808A100E993F5F0A3E99322AD
-:1008A900EB9FF5F0EA9E42F0E99D42F0E89C45F0A5
-:0108B900221C
-:0208BA008F2885
-:1008BC00E4F529752AFF752B11752C32AB2AAA2B5E
-:1008CC00A92C900001120822B4031DAF290529EFB1
-:1008DC00B52801221208097E0029FFEE3AA90775F6
-:0E08EC002AFFF52B892C80D47B007A0079003E
-:0108FA0022DB
-:0408FB0053D8EF32AD
-:0108FF0022D6
-:09090000907FD6E04480F0807481
-:10097D00438701000000000000000000000000227D
-:0C098D00787FE4F6D8FD7581390209D4AA
-:10099900020751E493A3F8E493A34003F68001F21C
-:1009A90008DFF48029E493A3F85407240CC8C3335F
-:1009B900C4540F4420C8834004F456800146F6DF2E
-:1009C900E4800B0102040810204080900DECE47EC5
-:1009D900019360BCA3FF543F30E509541FFEE49323
-:1009E900A360010ECF54C025E060A840B8E493A3EA
-:1009F900FAE493A3F8E493A3C8C582C8CAC583CA15
-:100A0900F0A3C8C582C8CAC583CADFE9DEE780BECC
-:100A1900E4907F9CF07F0AFE120D94907F96748972
-:100A2900F0907F9C74CFF07FF47E01120D94907F3B
-:100A390096E054FEF07F0A7E00120D947F057E0039
-:100A4900120D94907F96E04402F0E0547FF07F0508
-:100A59007E00120D94907F96E04440F07F057E0061
-:100A6900120D94907F96E054BFF07F327E00120DF4
-:100A790094907F96E04440F07F327E00120D9422DC
-:100A8900753201E532601B7F01120DD77F007E0EA2
-:100A99007D007C01120694E433F53270057F0F1254
-:100AA9000DD7E532601B7F02120DD77F007E807D56
-:100AB900007C80120694E433F53270057F0F120D25
-:100AC900D7E532601B7F03120DD77F007E207D4062
-:100AD9007C5B120694E433F53270057F0F120DD753
-:0E0AE900E5326005E4FF120DD7E53224FF224E
-:080AF700907FEAE0F510D32224
-:010AFF0032C4
-:100B0000020D6400020DAB00020D2F00020D7C00EF
-:100B1000020DC100020AFF00020E4C00020E4D0041
-:100B2000020E4E00020E4F00020E5000020E510047
-:100B3000020E5200020E5300020E5400020E550027
-:100B4000020E5600020E5700020E5800020E590007
-:080B5000020E5A00020E5B00C8
-:100B5800E4FE752AFF752B11752C12AB2AAA2BA956
-:100B68002C9000011208226402702DAD060EEDB51E
-:100B780007012290000212087185F028F5296228E1
-:100B8800E5286229E529622829FDE5283AA905759D
-:0E0B98002AFFF52B892C80C37B007A007900A0
-:010BA600222C
-:100BA700AB07AA06AC05E4FDE5116011EAFFAE0547
-:100BB7000DEE2410F582E4340FF583EFF0EBAE056C
-:100BC7000D74102EF582E4340FF583EBF0AF050DAD
-:100BD70074102FF582E4340FF583ECF0AF0F7A0F22
-:0D0BE7007B10120D107F0A7E00120D94226B
-:100BF4008E328F338D348A358B36E4FDF537E5112B
-:100C04006012E532FFAE050DEE2413F582E4340FD5
-:100C1400F583EFF0E533AE050D74132EF582E4345D
-:100C24000FF583E533F0AF0F7A0F7B13120D10AF7E
-:0B0C34000FAD34AB36AA35120CF122D4
-:100C3F008E328F338D348A358B36E4F537E537C3F3
-:100C4F00953450200533E533AE327002053214FF70
-:100C5F00E5362537F582E43535F583E0FD120BA730
-:050C6F00053780D922C9
-:100C7400A907E50D7025907FA5E04480F0E925E003
-:100C84004401907FA6F08D08AF03A9077509018A76
-:0D0C94000A890BE4F50C750D03D322C32271
-:100CA100A907E50D7023907FA5E04480F0E925E0D8
-:100CB100907FA6F08D08AF03A9077509018A0A89FB
-:0B0CC1000BE4F50C750D01D322C322DB
-:100CCC00907FD6E054FBF0E04408F0300604E0449A
-:100CDC0002F07FD07E07120D94907FD6E054F7F08F
-:050CEC00E04404F022C9
-:100CF100120C74E50D24FA6010146007240770F3D8
-:0F0D01007F0822E4F50D7F0722E4F50D7F06221F
-:100D1000120CA1E50D24FA6010146007240770F38B
-:0F0D20007F0822E4F50D7F0722E4F50D7F062200
-:100D2F00C0E0C083C082907FC4E4F05391EF907F06
-:0B0D3F00AB7404F0D082D083D0E0320F
-:100D4A00907FD6E030E712E04401F07F147E001273
-:0A0D5A000D94907FD6E054FEF022C5
-:100D6400C0E0C083C082D2015391EF907FAB740185
-:080D7400F0D082D083D0E03200
-:100D7C00C0E0C083C082D2035391EF907FAB740864
-:080D8C00F0D082D083D0E032E8
-:100D94008E388F39E5391539AE38700215384E6002
-:070DA40005120E0080EE2293
-:100DAB00C0E0C083C0825391EF907FAB7402F0D050
-:060DBB0082D083D0E0327B
-:100DC100C0E0C083C0825391EF907FAB7410F0D02C
-:060DD10082D083D0E03265
-:100DD700AE077F217D0174002EF582E4340FAB82CC
-:050DE700FA120D1022BC
-:100DEC00500F00C0F9A4B0999282F880988883C6FD
-:030DFC00A1868E3F
-:010DFF0000F3
-:100E00007400F58690FDA57C05A3E582458370F905
-:010E100022BF
-:0E0E1100907F00E510F0907FB57401F0D322C1
-:0E0E1F00907F00E50EF0907FB57401F0D322B5
-:080E2D00907FEAE0F50ED322EC
-:080E3500E4F50DD2E9D2AF2271
-:030E3D00D20022BE
-:020E4000D322BB
-:020E4200D322B9
-:020E4400D322B7
-:020E4600D322B5
-:020E4800D322B3
-:020E4A00D322B1
-:010E4C003273
-:010E4D003272
-:010E4E003271
-:010E4F003270
-:010E5000326F
-:010E5100326E
-:010E5200326D
-:010E5300326C
-:010E5400326B
-:010E5500326A
-:010E56003269
-:010E57003268
-:010E58003267
-:010E59003266
-:010E5A003265
-:010E5B003264
-:101100001201000100000040470510270100010204
-:10111000000109022000010103A0000904000002EF
-:10112000FF0000040705820240000007050202409C
-:10113000000004030904260341006E0063006800F8
-:101140006F007200200043006800690070007300A7
-:101150002C00200049006E0063002E00280346008A
-:10116000690072006D007700610072006500200068
-:101170004600720061006D00650057006F0072004C
-:101180006B0073002A0343006F006E006600690065
-:101190006700750072006100740069006F006E00E6
-:1011A000200053007400720069006E006700220383
-:1011B00049006E0074006500720066006100630003
-:1011C0006500200053007400720069006E00670023
-:0211D00000001D
-:00000001FF
-/*****************************************************************************
- *
- * whiteheat.h -- ConnectTech WhiteHEAT Firmware.
- *
- * Copyright (C) 2000-2002 ConnectTech Inc (http://www.connecttech.com/)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * (10/09/2002) Stuart MacDonald
- * Firmware 4.06
- *
- * (04/09/2000) gkh
- * Updated the firmware with the latest provided by ConnectTech.
- *
- * (01/16/2000) gkh
- * Fixed my intel hex processing tool, so now the firmware actually
- * matches the original file (this was causing a few problems...)
- *
- * (01/15/2000) gkh
- * Added debug loader firmware if DEBUG is #defined:
- * Port 1 LED flashes when the vend_ax program is running
- * Port 2 LED flashes when any SETUP command arrives
- * Port 3 LED flashes when any valid VENDOR request occurs
- * Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
- *
- * version 1.0 (01/09/2000) gkh
- * Original firmware from ConnectTech massaged a little to be program
- * readable.
- *
- *****************************************************************************/
-
-#define whiteheat_DATE "20000106"
diff --git a/firmware/whiteheat_loader_debug.HEX b/firmware/whiteheat_loader_debug.HEX
deleted file mode 100644
index 5633d588613e..000000000000
--- a/firmware/whiteheat_loader_debug.HEX
+++ /dev/null
@@ -1,403 +0,0 @@
-:10000000000000000302098D0000003303020E709F
-:100010000000004303020B000000004B030205B385
-:100020000000010010907FA5E05410FFC4540F445D
-:1000300050F50F13E4000110000001101033F5110A
-:10004000907FE9E0245EB407004003020300012032
-:1000500000000120107C900128F82828730201BCC0
-:100060000201BC02010001300000013010910201C8
-:100070003D02015302016F02019A907F000001408E
-:100080000000014010E511F0907FB57401F0907F01
-:10009000B4E04402F0000150000001501002037C63
-:1000A000907F92E0FFC4540F907F00F090000160B9
-:1000B00000000160107FB57401F0907FB4E044024D
-:1000C000F002037C1200017000000170100A8950D8
-:1000D00007E4907F00F08006907F00740F0001809D
-:1000E0000000018010F0907FB57401F0907FB4E0C3
-:1000F0004402F0020300019000000190107C907F08
-:10010000EAE0F50F02037C907F007407F00001A085
-:10011000000001A010907FB57401F0907FB4E0441E
-:1001200002F07FE87E0001B0000001B01003120D64
-:10013000D5D206120D0D02037C907FEAE00001C0CB
-:10014000000001C010752900F52AA3E0FEE4EE428C
-:1001500029907FEEE00001D0000001D010752B0047
-:10016000F52CA3E0FEE4EE422B907FE8E00001E0F6
-:10017000000001E01064C060030202C9E52C452BB9
-:10018000700302037C0001F0000001F010C3E52CB5
-:100190009440E52B94005008852B2D852C000200FF
-:1001A00000000200102E8006752D00752E40907FF5
-:1001B000E9E064A370000210000002101034F53171
-:1001C000F532C3E532952EE531952D505C000220C5
-:1001D0000000022010E52A2532F582E5313529F5A7
-:1001E00083E0FF740000023000000230102532F579
-:1001F00082E4347FF583EFF00532E532700002408F
-:10020000000002401002053180D0E4F531F532C320
-:10021000E532952EE5000250000002501031952D78
-:10022000501874002532F582E4347FF583000260B3
-:10023000000002601074CDF00532E5327002053125
-:1002400080DDAF2AAE000270000002701029AD2ED2
-:100250007A7F79007B00120BF4907FB5E500028075
-:1002600000000280102EF0E52E252AF52AE52D3516
-:1002700029F529C3E500029000000290102C952E6C
-:10028000F52CE52B952DF52B907F92E0FF0002A039
-:10029000000002A010C4540F752F00F530D3940055
-:1002A000E52F9400500002B0000002B0100C907FC7
-:1002B000B4E020E1030201E780F4907FB40002C0C3
-:1002C000000002C010E020E2030201E780F4907F0A
-:1002D000E8E06440600002D0000002D01003020396
-:1002E0007CE52C452B700302037CE4907F0002E048
-:1002F000000002E010C5F0907F92E0FFC4540F753B
-:100300002F00F530D30002F0000002F0109400E559
-:100310002F94005009907FC4E030E1098000030071
-:100320000000030010F7907FB4E020E3F9907FC550
-:10033000E0752D00F500031000000310102E907FD3
-:10034000E9E064A3703890206BF0F531F5000320EC
-:10035000000003201032C3E532952EE531952D5073
-:100360003474C025320003300000033010F582E4FD
-:10037000347EF583E0FFE52A2532F582E50003406F
-:100380000000034010313529F583EFF00532E532E6
-:1003900070020531800003500000035010D0AF2AD6
-:1003A000AE29AD2E7A7E79C07BC0120C800003602E
-:1003B0000000036010E52E252AF52AE52D3529F5E4
-:1003C00029C3E52C95000370000003700D2EF52C59
-:1003D000E52B952DF52B0202D4C300000000037D10
-:1003E000012200000000037E10907FE9E07003020C
-:1003F00004561470030204D22400038E0000038EFE
-:1004000010FE700302054624FB70030204501470B2
-:100410000300039E0000039E1002044A14700302AE
-:10042000043E147003020444240003AE000003AE33
-:100430001005600302059A120E7B40030205AB9083
-:100440007F0003BE000003BE10EBE024FE60161424
-:100450006040240270697411900003CE000003CE46
-:10046000107FD4F07400907FD5F00205AB907FEA46
-:10047000E00003DE000003DE10FF120B588B268A1B
-:10048000278928EA496011AE020003EE000003EE5E
-:1004900010EE907FD4F0AF01EF907FD5F00205AB66
-:1004A000900003FE000003FE107FB4E04401F00260
-:1004B00005AB907FEAE0FF120C00040E0000040E72
-:1004C000103F8B268A278928EA496011AE02EE90F8
-:1004D0007F00041E0000041E10D4F0AF01EF907FD7
-:1004E000D5F00205AB907FB4E000042E0000042E8E
-:1004F000104401F00205AB907FB4E04401F0020526
-:10050000AB00043E0000043E10120E520205AB1276
-:100510000E600205AB120AF70200044E0000044E02
-:100520001005AB1208F10205AB120E7D4003020567
-:10053000AB00045E0000045E10907FE8E0247F6062
-:10054000241460312402705BA200046E0000046E6B
-:100550001000E433FF25E0FFA202E4334F907F0058
-:10056000F000047E0000047E10E4A3F0907FB574D8
-:1005700002F00205ABE4907F0000048E0000048EC0
-:1005800010F0A3F0907FB57402F00205AB907FEC01
-:10059000E000049E0000049E10F45480FFC4540F39
-:1005A000FFE054072F25E024B40004AE000004AEA1
-:1005B00010F582E4347FF583E054FD907F00F0E491
-:1005C000A30004BE000004BE10F0907FB57402F0DA
-:1005D0000205AB907FB4E044010004CE000004CEDD
-:1005E00010F00205AB120E7F40030205AB907FE8CE
-:1005F000E00004DE000004DE1024FE601D24026022
-:10060000030205AB907FEAE0B40004EE000004EEC4
-:10061000100105C2000205AB907FB4E04401F00276
-:10062000050004FE000004FE10AB907FEAE0703885
-:10063000907FECE0F45480FFC400050E0000050E2E
-:1006400010540FFFE054072F25E024B4F582E43462
-:100650007F00051E0000051E10F583E4F0907FEC7E
-:10066000E05480FF131313541F00052E0000052EC5
-:1006700010FFE054072F907FD7F0E04420F0806E09
-:100680009000053E0000053E107FB4E04401F0807C
-:1006900065120E815060907FE800054E0000054E07
-:1006A00010E024FE601824027054907FEAE0B40148
-:1006B0000400055E0000055E10D2008049907FB402
-:1006C000E04401F08040907FEA00056E0000056E76
-:1006D00010E07020907FECE0F45480FFC4540FFFD2
-:1006E000E000057E0000057E1054072F25E024B4AD
-:1006F000F582E4347FF583740100058E0000058ED9
-:1007000010F0801A907FB4E04401F08011E4902052
-:100710006A00059E0000059E10F01201005007902F
-:100720007FB4E04401F0907FB40005AE000005AE58
-:1007300004E04402F0000000000005B201220000C5
-:10074000000005B310C0E0C083C082C085C084C073
-:1007500086758600C00005C3000005C310D0C00028
-:10076000C001C002C003C006C007907FA50005D32A
-:10077000000005D310E030E206750D0602067F90FA
-:100780007FA5E020E10005E3000005E3100CE50D86
-:1007900064026006750D0702067FAF0DEF0005F3DA
-:1007A000000005F31024FE604814602C24FE6077DE
-:1007B00024046003020006030000060310067FAB5A
-:1007C00009AA0AA90BAF0C050C8F827583000613CA
-:1007D000000006131000120785907FA6F0E50C6557
-:1007E00008705E750D000623000006231005805971
-:1007F000907FA6E0AB09AA0AA90BAE0C8E000633C7
-:100800000000063310827583001207B2750D028056
-:1008100040E50824FE0006430000064310B50C071F
-:10082000907FA5E04420F0E50814B50C0A000653BB
-:100830000000065310907FA5E04440F0E4F50D90D1
-:100840007FA6E0AB090006630000066310AA0AA9B0
-:100850000BAE0C8E827583001207B2050C00067376
-:100860000000067310800A907FA5E04440F0E4F594
-:100870000D5391DFD0000683000006831007D006D9
-:10088000D003D002D001D000D0D0D086D0000693C3
-:10089000000006930A84D085D082D083D0E0320055
-:1008A0000000069D10C204D205E4F525C203C20073
-:1008B000C202C201120006AD000006AD100E74D2D5
-:1008C000E843D820907FAB74FFF0907FA90006BD6D
-:1008D000000006BD10F0907FAAF05391EF907F9535
-:1008E000E044C0F0900006CD000006CD107F937468
-:1008F00030F0120A1975244875239275220006DD1E
-:10090000000006DD1000752100E4FFFE7E0590204A
-:10091000687401F0A30006ED000006ED10DEFC7E19
-:10092000007F05907FAFE04401F0907FAE0006FDB0
-:10093000000006FD10E0440DF0D2AF120E68300149
-:100940000AE490206900070D0000070D10F0120363
-:100950007EC20130041A120E775013120900071DCF
-:100960000000071D1000300007907FD6E030E7F34D
-:10097000120D8B120E00072D0000072D1079C203F7
-:100980007FFF7EFF7DFF7CFF782112081D00073D61
-:100990000000073D107B007A0079007800C3120840
-:1009A0000C701B752400074D0000074D104875237F
-:1009B00092F522F5216325FF902068E52500075D6B
-:1009C0000000075D0EF0A37401F0A3F0A3F012087D
-:1009D000FF809B000000076B012200000000076CF5
-:1009E00010BB010689828A83E0225002E722BBFE07
-:1009F0000200077C0000077C09E32289828A83E4E5
-:100A0000932200000000078510BB010CE58229F548
-:100A100082E5833AF583E0225000079500000795B0
-:100A20001006E92582F8E622BBFE06E92582F8E2F7
-:100A3000220007A5000007A50DE58229F582E583C0
-:100A40003AF583E493220000000007B210F8BB01DE
-:100A50000DE58229F582E5833AF583E8F00007C2C7
-:100A6000000007C210225006E92582C8F622BBFE0C
-:100A700005E92582C80007D2000007D202F2220051
-:100A8000000007D410BB0110E58229F582E5833A06
-:100A9000F583E0F5F00007E4000007E410A3E0228E
-:100AA0005009E92582F886F008E622BBFE0007F42B
-:100AB000000007F4100AE92582F8E2F5F008E222C6
-:100AC000E5832AF5830008040000080408E993F58B
-:100AD000F0A3E993220000000000080C10EB9FF542
-:100AE000F0EA9E42F0E99D42F0E89C45F000081CC7
-:100AF0000000081C012200000000081D1008080862
-:100B0000E62FFFF618E63EFEF618E63DFD00082D3E
-:100B10000000082D07F618E63CFCF6220000083419
-:100B2000048C348D350000000000083810907F954B
-:100B3000E044C0F0E4F536F537C3E53795000848E2
-:100B4000000008481035E53695345069EF2537F533
-:100B500082E5363EF500085800000858108374FFFF
-:100B6000F0F46002C322EF2537F582E5360008680D
-:100B700000000868103EF583E4F06002C322EF2510
-:100B800037F582E53600087800000878103EF583D6
-:100B900074AAF064AA6002C322EF2537F500088822
-:100BA000000008881082E5363EF5837455F06455E0
-:100BB0006002C322AD000898000008981037E5379E
-:100BC0002FF582E5363EF583EDF0FCAC050008A874
-:100BD000000008A810ED6C6002C3220537E53770ED
-:100BE000020536808C0008B8000008B810E4F5361D
-:100BF000F537C3E5379535E536953450270008C8F5
-:100C0000000008C810EF2537F582E5363EF583E091
-:100C100065376002C30008D8000008D81022EF250D
-:100C200037F582E5363EF583E4F00537E50008E860
-:100C3000000008E808377002053680CED3000000B7
-:100C4000000008F001220000000008F10E907F0073
-:100C5000E510F0907FB57401F0D32200000008FF8A
-:100C6000012200000000090009907FD6E04480F0D6
-:100C7000807400000000097D10438701000000001F
-:100C800000000000000000002200098D0000098D16
-:100C90000C787FE4F6D8FD75813A0209D400000093
-:100CA000000009991002069DE493A3F8E493A34081
-:100CB00003F68001F20009A9000009A91008DFF479
-:100CC0008029E493A3F85407240CC8C3330009B95E
-:100CD000000009B910C4540F4420C8834004F456DE
-:100CE000800146F6DF0009C9000009C910E4800B45
-:100CF0000102040810204080900E2DE47E0009D9E6
-:100D0000000009D910019360BCA3FF543F30E509EE
-:100D1000541FFEE4930009E9000009E910A36001F3
-:100D20000ECF54C025E060A840B8E493A30009F9B1
-:100D3000000009F910FAE493A3F8E493A3C8C5826C
-:100D4000C8CAC583CA000A0900000A0910F0A3C86E
-:100D5000C582C8CAC583CADFE9DEE780BE000A19BA
-:100D600000000A1910E4907F9CF07F0AFE120DD556
-:100D7000907F967489000A2900000A2910F0907F5C
-:100D80009C74CFF07FF47E01120DD5907F000A395C
-:100D900000000A391096E054FEF07F0A7E00120D22
-:100DA000D57F057E00000A4900000A4910120DD5C2
-:100DB000907F96E04402F0E0547FF07F05000A59EE
-:100DC00000000A59107E00120DD5907F96E0444035
-:100DD000F07F057E00000A6900000A6910120DD537
-:100DE000907F96E054BFF07F327E00120D000A79AA
-:100DF00000000A7910D5907F96E04440F07F327E63
-:100E000000120DD522000A8900000A8910753301ED
-:100E1000E533601B7F01120E187F007E0E000A99D9
-:100E200000000A99107D007C01120834E433F53388
-:100E300070057F0F12000AA900000AA9100E18E51C
-:100E400033601B7F02120E187F007E807D000AB97E
-:100E500000000AB910007C80120834E433F53370C6
-:100E6000057F0F120E000AC900000AC91018E533E9
-:100E7000601B7F03120E187F007E207D40000AD980
-:100E800000000AD9107C5B120834E433F533700596
-:100E90007F0F120E18000AE900000AE90DE5336021
-:100EA00005E4FF120E18E53324FF000000000AF6E7
-:100EB0000122000000000AF708907FEAE0F510D355
-:100EC0002200000000000AFF0132000000000B00B9
-:100ED00010020DA500020DEC00020D7000020DBD08
-:100EE00000000B1000000B1010020E0200020AFF9F
-:100EF00000020E8300020E8400000B2000000B2075
-:100F000010020E8500020E8600020E8700020E8877
-:100F100000000B3000000B3010020E8900020E8A18
-:100F200000020E8B00020E8C00000B4000000B40F4
-:100F300010020E8D00020E8E00020E8F00020E9027
-:100F400000000B5000000B5008020E9100020E92A0
-:100F50000000000000000B5810E4FE752BFF752CFC
-:100F600011752D12AB2BAA2CA9000B6800000B6881
-:100F7000102D9000011207856402702DAD060EED54
-:100F8000B5000B7800000B781007012290000212C8
-:100F900007D485F029F52A6229000B8800000B8808
-:100FA00010E529622AE52A622929FDE5293AA905E1
-:100FB00075000B9800000B980E2BFFF52C892D80E7
-:100FC000C37B007A0079000000000BA6012200001C
-:100FD00000000BA706AB07AA06AC050000000BAD8E
-:100FE00010E4FDE5116011EAFFAE050DEE2410F5E9
-:100FF00082000BBD00000BBD10E4340FF583EFF051
-:10100000EBAE050D74102EF582000BCD00000BCD5C
-:1010100010E4340FF583EBF0AF050D74102FF5825B
-:10102000E4000BDD00000BDD10340FF583ECF0AFB6
-:101030000F7A0F7B10120D517F000BED00000BEDAE
-:10104000060A7E00120DD50000000BF301220000FD
-:1010500000000BF40A8E338F348D358A368B3700BF
-:1010600000000BFE10E4FDF538E5116012E533FFDA
-:10107000AE050DEE24000C0E00000C0E1013F582D0
-:10108000E4340FF583EFF0E534AE050D74000C1E6B
-:1010900000000C1E10132EF582E4340FF583E534A6
-:1010A000F0AF0F7A0F000C2E00000C2E107B1312E5
-:1010B0000D51AF0FAD35AB37AA36120D32000C3ED5
-:1010C00000000C3E0122000000000C3F028F2900AE
-:1010D00000000C4110E4F52A752BFF752C11752DBD
-:1010E00032AB2BAA2C000C5100000C5110A92D90F2
-:1010F0000001120785B4031DAF2A052AEF000C6119
-:1011000000000C6110B529012212076C7E0029FF36
-:10111000EE3AA90775000C7100000C710E2BFFF55B
-:101120002C892D80D47B007A0079000000000C7F90
-:101130000122000000000C800A8E338F348D358A26
-:10114000368B370000000C8A10E4F538E538C3957B
-:101150003550200534E534AE33000C9A00000C9A6B
-:10116000107002053314FFE5372538F582E4353673
-:10117000F5000CAA00000CAA0A83E0FD120BA705DB
-:101180003880D90000000CB40122000000000CB52A
-:1011900010A907E50D7025907FA5E04480F0E925B2
-:1011A000E0000CC500000CC5104401907FA6F08D36
-:1011B00008AF03A9077509018A000CD500000CD5FA
-:1011C0000D0A890BE4F50C750D03D322C322000030
-:1011D00000000CE210A907E50D7023907FA5E04404
-:1011E00080F0E925E0000CF200000CF210907FA6E0
-:1011F000F08D08AF03A9077509018A0A89000D025D
-:1012000000000D020B0BE4F50C750D01D322C32277
-:1012100000000D0D10907FD6E054FBF0E04408F084
-:10122000300604E044000D1D00000D1D1002F07F8B
-:10123000D07E07120DD5907FD6E054F7F0000D2D2B
-:1012400000000D2D05E04404F022000000000D32E6
-:1012500010120CB5E50D24FA601014600724077015
-:10126000F3000D4200000D420F7F0822E4F50D7FD0
-:101270000722E4F50D7F062200000D5110120CE24A
-:10128000E50D24FA6010146007240770F3000D6167
-:1012900000000D610F7F0822E4F50D7F0722E4F5C1
-:1012A0000D7F062200000D7010C0E0C083C0829048
-:1012B0007FC4E4F05391EF907F000D8000000D801B
-:1012C0000BAB7404F0D082D083D0E03200000D8BE1
-:1012D00010907FD6E030E712E04401F07F147E00EA
-:1012E00012000D9B00000D9B0A0DD5907FD6E05497
-:1012F000FEF0220000000DA510C0E0C083C082D225
-:10130000015391EF907FAB7401000DB500000DB556
-:1013100008F0D082D083D0E03200000000000DBD84
-:1013200010C0E0C083C082D2035391EF907FAB74B2
-:1013300008000DCD00000DCD08F0D082D083D0E0A4
-:101340003200000000000DD5108E398F3AE53A15B5
-:101350003AAE39700215394E60000DE500000DE51A
-:101360000705120E4180EE2200000DEC10C0E0C017
-:1013700083C0825391EF907FAB7402F0D0000DFCDC
-:1013800000000DFC0682D083D0E0320000000E0287
-:1013900010C0E0C083C0825391EF907FAB7410F017
-:1013A000D0000E1200000E120682D083D0E0320070
-:1013B00000000E1810AE077F217D0174002EF5820B
-:1013C000E4340FAB82000E2800000E2805FA120D3F
-:1013D0005122000000000E2D10500F00C0F9A4B0E3
-:1013E000999282F880988883C6000E3D00000E3DD9
-:1013F00003A1868E00000E400100000000000E4197
-:10140000107400F58690FDA57C05A3E582458370E8
-:10141000F9000E5100000E510122000000000E5292
-:101420000E907F00E50EF0907FB57401F0D322009E
-:1014300000000E6008907FEAE0F50ED32200000065
-:1014400000000E6808E4F50DD2E9D2AF22000000DA
-:1014500000000E700453D8EF3200000000000E743C
-:1014600003D2002200000E7702D3220000000E7982
-:1014700002D3220000000E7B02D3220000000E7D6A
-:1014800002D3220000000E7F02D3220000000E8152
-:1014900002D3220000000E830132000000000E84FF
-:1014A0000132000000000E850132000000000E86AF
-:1014B0000132000000000E870132000000000E889B
-:1014C0000132000000000E890132000000000E8A87
-:1014D0000132000000000E8B0132000000000E8C73
-:1014E0000132000000000E8D0132000000000E8E5F
-:1014F0000132000000000E8F0132000000000E904B
-:101500000132000000000E910132000000000E9236
-:101510000132000000001100101201000100000063
-:1015200040470510270100010200111000001110B2
-:1015300010000109022000010103A00009040000BD
-:10154000020011200000112010FF00000407058296
-:101550000240000007050202400011300000113077
-:1015600010000004030904260341006E00630068B4
-:101570000000114000001140106F00720020004375
-:1015800000680069007000730000115000001150E5
-:10159000102C00200049006E0063002E0028034636
-:1015A000000011600000116010690072006D00778A
-:1015B00000610072006500200000117000001170D1
-:1015C000104600720061006D00650057006F0072E8
-:1015D0000000118000001180106B0073002A03438B
-:1015E000006F006E0066006900001190000011900D
-:1015F000106700750072006100740069006F006E72
-:10160000000011A0000011A010200053007400720F
-:101610000069006E00670022030011B0000011B0E5
-:101620001049006E0074006500720066006100637E
-:10163000000011C0000011C01065002000530074AC
-:1016400000720069006E0067000011D0000011D028
-:091650000200000000000000008F
-:00000001FF
-/*****************************************************************************
- *
- * whiteheat.h -- ConnectTech WhiteHEAT Firmware.
- *
- * Copyright (C) 2000-2002 ConnectTech Inc (http://www.connecttech.com/)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * (10/09/2002) Stuart MacDonald
- * Firmware 4.06
- *
- * (04/09/2000) gkh
- * Updated the firmware with the latest provided by ConnectTech.
- *
- * (01/16/2000) gkh
- * Fixed my intel hex processing tool, so now the firmware actually
- * matches the original file (this was causing a few problems...)
- *
- * (01/15/2000) gkh
- * Added debug loader firmware if DEBUG is #defined:
- * Port 1 LED flashes when the vend_ax program is running
- * Port 2 LED flashes when any SETUP command arrives
- * Port 3 LED flashes when any valid VENDOR request occurs
- * Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
- *
- * version 1.0 (01/09/2000) gkh
- * Original firmware from ConnectTech massaged a little to be program
- * readable.
- *
- *****************************************************************************/
-
-#define whiteheat_DATE "20000106"
diff --git a/firmware/yam/1200.bin.ihex b/firmware/yam/1200.bin.ihex
deleted file mode 100644
index 9d34e5680e38..000000000000
--- a/firmware/yam/1200.bin.ihex
+++ /dev/null
@@ -1,342 +0,0 @@
-:10000000FFF200A5ADFFFE9FFFEFF3CBFFDBFCF29D
-:10001000FFF6FF3CBFFDBFDF6E3F6FF17DB4FDBF5C
-:10002000DF6F3F6FF70BFFDBFDF2FFF6FFFFFFFF18
-:10003000F0CFFFFFFFFEFFFFDFFFFFFFEFFFFFFF40
-:10004000FDFFFFFFFEFFFFFFFFFFF1FFFFFFFFBF11
-:10005000FFFFF7FFFFFBFFFFFFFCFFFEFFFFFFF0CF
-:100060005FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF41
-:10007000FFFFFFFFFFF7FFFFFFF1FFFFFE7FBFFF67
-:10008000FFFFFFFFFFFFFFFFF7FFFBFFFFFFF09FFB
-:10009000FFFFFFFEFFFDFFFFFFFFDFFFFFFFF7FF9B
-:1000A000FFFFFBFFFBFFFFFFF0FFFFFFFFFFFFFF77
-:1000B000F7FFFFFBFFFFFFFEFFFFFFEFFFF05FFF1C
-:1000C000FFFFFEFFFFEFFFFFFBFFFFFFFFFFFFFF55
-:1000D000FFBFFFFFDFF7FFF1FFFFFFFFFFFFFFFFA6
-:1000E000FFFFFFFFFFFBFEFFFFFFFFFFF0FFFFFF34
-:1000F000FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFEB25
-:10010000FFFFFFFDFFBFF1FFFFFFFFDFFFFFFFFB73
-:10011000FFFFFFFFFFFFFFFFFFFFFFF06FFFFFFF8E
-:10012000FEFFFFFFFFFFFFFFFFFFDFFFFFFFFFFF00
-:10013000FFFFF7FFFFF1FFFFF7BFE7FFFFFFFFFB49
-:10014000FFFFFFFFFFFF77FFFFFFF0FFFFFFFFFE57
-:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
-:10016000FFFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFAD
-:10017000FFFFFFFFFFFFFFFFFFF01FFFFFFFFEDBA3
-:10018000FFFFF5A5FD4B6EEF3332DDD34AD692FE6D
-:10019000B33FBDF1FADBFEF7F696BDBDFFBDFFED47
-:1001A0007F6B7FFBDFFEFBFE90CFFFFFFFFEBEEF0E
-:1001B000FFFFDB5FF6FFF68FFDA5DDFFFFFFFF6FA3
-:1001C0007FDBF1FCBFFF6FFFEFFC5B5DDADFF4FF6D
-:1001D000F2FFFDBFFFFFFFD01FFFFFFFFEFFFFFF8E
-:1001E000FFFBEFB7FC33FFFBFF046AF33C36FFF085
-:1001F0000FF10FFFFFFFF315720FF16FFFFE943F3A
-:10020000FFFFFF7BFFFFF0FFFFFFFFFEFFFFFFF0A1
-:10021000F7EFB7FC33FFFFFF046AF33C36FFF00F44
-:10022000F10FFFFFFFF315738FF26FFFFE943FFF97
-:10023000FFFF7D9FFFF00FFFFFFFFEFFFFFFFF9E11
-:10024000FFFCEFD3FBFF7FF55FFE59FFFFFFFCF1E3
-:10025000FE7FFFFFFA17FFE7EFEFFFFF3FF1FFFF22
-:10026000FFFFFFFFF0FFFFFFFFFEF5FFBFFFFCEA10
-:10027000FFF0FFFFBFF93FB1EFFFD7FFFBFFF0FF3C
-:10028000FFF3FFDFFF7BFFFDFFF6FFBFFFFFBFFFB9
-:10029000FFFFDAF0FFFFFFFFFEF2C00100000202E5
-:1002A0000202004040401000000020000001000059
-:1002B000000000001900040400000000000000100D
-:1002C000003CF0AFFFFFFFFEFDBFFFFFFBFFFDFFA8
-:1002D000FF7FFFFFBFFFEFFFFFFDFFFFF1FFDFFF2E
-:1002E000FFFFFFFFFFBFFEFFFFFEFFFFFFFFFFDF80
-:1002F000DBF06FFFFFFFFEF0BFDFFF7FFFFFFFFFC1
-:10030000DFDFFFEFFF9EEFFFFF7FFFF1EFFFFFFF5C
-:10031000F7FABFFFFFFE47EFFFBDF6FFFFDFF5F087
-:10032000F0EFFFFFFFFEF8300000000400010208BC
-:1003300016000000800001020080010C0200000194
-:100340000000200000060020001000140004C1F08E
-:100350002FFFFFFFFEFFFFFFFFFFFFFFFBFFFF7F02
-:10036000ECFFFFFAFFBFFF6FFFE1FFFFFFFFBDFEE6
-:1003700046FFEF7FCDDFFFFFFDFFBDFF7F7FF04F2B
-:10038000FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7E
-:10039000FFFFFFFFFFFFFFFFF1FFFFFFFFFFFFFF7B
-:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFF00FFF5C
-:1003B000FFFFFEFFFFFFFDA4BCCD6D6B6F5BDC3369
-:1003C0005AF6F7F6B33FBDC1FA5AF6F6B6F7FFBDD7
-:1003D000BB3CCECF34EF33BBCCFFFFFFF04FFFFF72
-:1003E000FFFEBFFFFFFFDBFFF6D6FFFDFDBFFFAD4A
-:1003F000BFF97F6FFCDBF1FDBFFF6FFFFFDADBFCB6
-:10040000DBFF768FF6FFCDABFEFBFFD0FFFFFFFFDC
-:10041000FEFF9FFFF420AF6D0BC17BFFFFFFCBFF03
-:100420003FF0EF7F0FF1C33CFFFFFFFFFFFFF80B33
-:100430001D6A64056B9901FFFDEFF02FFFFFFFFEC2
-:10044000FFFFFFF4002FCC0BC37FFFFFFF0ADFBFCE
-:10045000FD7FFFFFF1C3BFFFFFFFFFFFFFF04A0E6D
-:10046000966402979910FFFFFFF0DFFFFFFFFEFF8A
-:10047000FFFFFE84F9D527F17FFFF8EBDFF3CF3FD5
-:100480001FFFF711FFCFFFFE67FFFFFFFFC4FFFF56
-:10049000B3A1FFF9E0FFFFFFF0EFFFFFFFFEF5FF65
-:1004A000FFFB7FE0FFC7FE7F3FFFFD778D7F0FFFE4
-:1004B000C3FFF1BF8FCFFFFFDD7BFFF6FAF7FF40F1
-:1004C0009FF97FD8FFFFFAF01FFFFFFFFEF1C0008A
-:1004D00000030000000000000000400010000010B9
-:1004E00000010010202000001000040105000000A1
-:1004F00000404000003CF01FFFFFFFFEFDBFFFFF7C
-:10050000FFFFFE7F7FFFEFFFFFDFFFFFDFFFEFF764
-:10051000F1FFFFFFFFDFFFFFF7FFFFFFFCFDFF7FA6
-:100520007EFFFFFFDBF06FFFFFFFFEF0BBFFFFFF73
-:10053000FFFFFEEBFD6FFFF7FEF57FFFFF7FBFB113
-:10054000FFFF9FBFFBFFFEFFFEFFF7EBDFBF5FDD9F
-:10055000FFDBFDD0F06FFFFFFFFEF8302000420010
-:100560000000301804080921828002000800010000
-:1005700000000C2010001100448400202084800022
-:100580000000C1F0DFFFFFFFFEFFF7FFFBDDF9FF1B
-:10059000DAFFDCDDFCFBFFBFFB3ED796FE61F7FF19
-:1005A0007FFF3FFDFFDFCFF7DFF7BFFDFFFEEFEF80
-:1005B000FEFFF07FFFFFFFFEFFFFFFFFFFFFFFFFDC
-:1005C000FFFFFFFFFFFFFFFFFFFFFFFFF1FFFFFF49
-:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
-:1005E000FFF02FFFFFFFFEFFFFFFF3BDFD4B74CFBA
-:1005F000735BCB3BDFFEF7FED375ACA1FBDFFEF7F1
-:100600007696B524BDA5AD492F692B525BBDFFFF82
-:10061000F0CFFFFFFFFEBFFFFFFFDBFFF6FEFFCCCB
-:10062000A7FBADFF7F6FFF6D7FDBF1FDBFFF6FFFAE
-:100630006FFFDBFFDBFFF697F6FFB5B5FFFFFFD0DF
-:10064000EFFFFFFFFEFFFFFFFDA5BC43FC7C03E7C0
-:10065000FFFF20FFFFFFCCFD7DF1FFFFFFFFD5591E
-:10066000BA56666AAD9AA99A97A5AABBFFFFF00F82
-:10067000FFFFFFFEFEFBFFFDF7FD43FFFD6BE7FF06
-:10068000FFDFFFFFFFFFFF3FF1FFFFFFFFD559B582
-:10069000A6666AAD9AA9996B5AAAFFFFB7F03FFF09
-:1006A000FFFFFEFFFFFFFE9CF7FDD241FFFFF27F41
-:1006B0008FFFFF3DF3FF17F1FFFFFFFFFF7FDFFC21
-:1006C0008F38FFEF23FFFBF7C8FFFFFFF09FFFFF0F
-:1006D000FFFEF57FFFFDFFE4FFEBFFCFBFFAFFABAF
-:1006E000EFFFFBFFF3FD61FFFFFFFFFAFFFBFD0DD7
-:1006F000FFFEFF437FFEBFD0FDFFFAF03FFFFFFF8D
-:10070000FEF3C0000000020002010060C0400000D3
-:100710000000340400010000000000000008880010
-:100720000003000040004000003CF03FFFFFFFFEE0
-:10073000FD3FFFFFFFFFFFFF7F7FBFFFFFFFFFFFCB
-:10074000FFFFFFF7F1FFFFFFFFFFF7FFFFFFFDFFD9
-:10075000FFFFFFFEFE5FFFFFCBF0DFFFFFFFFEF0BE
-:10076000FFFFFDFFEFE3DEEED9C593FFFFFEFEFFC7
-:10077000FBEEFEF1FFFFFFFFFFFDFFBFF7FFFF7F77
-:10078000AFBDDFDFFBF3F3F0F0AFFFFFFFFEF834A8
-:10079000000661001801A0051700200528200000B0
-:1007A0000500410000400009000120868208400346
-:1007B000803070081402C1F0CFFFFFFFFEFFFFFF83
-:1007C000FFFFBDEFFBFFFFFB9C7FEFDFFFBFEBDE1B
-:1007D000FFC17FFFFB7FFFFFFF5FFFFFFFDFBFEF7B
-:1007E0003FF78FEF7FFFF07FFFFFFFFEFFFFFFFF71
-:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
-:10080000F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
-:10081000FFFFFFFFFFF03FFFFFFFFEFFFFFFFFBDFA
-:10082000DFEF7D6D2B5A5DD2DFF692B6B2B3ACA18D
-:10083000FBDFFEF1EEF5F6BC6BBD7DAF1AEF5F6B33
-:10084000C6FFFFFFF05FFFFFFFFEBFFFFFFFDBFF05
-:10085000F6FFF6B7FDADFDBFF36FFF6FFFDBD1FD18
-:10086000BFFF6FF56BBC5B3CDAEF16AF16FFCDAB8D
-:10087000FF6FFFD0FFFFFFFFFEFFFFFFFCBFFFFF8B
-:10088000FF6C0310C1F3FFF33AF3CAFFAFF1FFFFB0
-:10089000FFFFD996A665A6666A9569696A5A5AFFE6
-:1008A000FF5FF01FFFFFFFFEFFFFFFFFBFFFFFFF28
-:1008B000EA0F50C3F37FFFF3F3C3FFAFF1FFFFFF76
-:1008C000FFD996A665A6666A9569696A5A5AFFFFB6
-:1008D000FFF03FFFFFFFFEFFFFFFFFD7FFFF5FC1FE
-:1008E0003FF75EF5CE9E5F3F17FFF3E1FFFFFFFF8F
-:1008F000D8FFFAFE67FFFEBF5AFFFFAFF5FFFFFF0D
-:10090000F02FFFFFFFFEF5FFFFFDFFF7FFFD4E3D60
-:100910003FE70BBF8FF9FFEBE3FFE1FFFFFCFFC7F2
-:100920009FFF3E39E5FFCF9BF9FFFFC5FFFFFAF0C0
-:100930005FFFFFFFFEF3C00000000000000040006A
-:100940000000006000000000000100000020002006
-:10095000000110080000000000000000003CF04F03
-:10096000FFFFFFFEFDBFFFFFFFFFFFFFFEFFFFBF1B
-:100970003FFFFFBFFFFFFFFBF1FFFFFFFFF7FFF7A9
-:10098000FFEDFFFBFEFF7FFF7FDFFFFFDDF03FFF9F
-:10099000FFFFFEF0FFFFF3FFF7FFFE5FFFF7FFFF34
-:1009A000DFFFFFFFF7FE7BF1FFFDFDFFDFDFFF7DD8
-:1009B00073F9FFC37EFEFFEFD7FFCFD0F06FFFFFCD
-:1009C000FFFEF83000004004000141200004000256
-:1009D000D50900028002010000000A04000700019E
-:1009E000500180026140410C1408C1F09FFFFFFFDD
-:1009F000FEFFFFFFFEFFFFFFFEDFCB5FFEEFFFFE10
-:100A0000FF3FFF7FFDC1FFFF7FFFDFFDFCFDF7EE36
-:100A1000FFFF4EFFDFCFDBEBFFFFF01FFFFFFFFE0F
-:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
-:100A3000FFFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFD4
-:100A4000FFFFFFFFFFFFFFFFFFF02FFFFFFFFE7F16
-:100A5000FFFFFFFDFFFFFFFFFFFFFFFFDFFFFFFFC8
-:100A6000F7FBFFF1FFFFFFFFFFFFFFFFFFFFFFFFB0
-:100A7000FFFF7FFFFFFF7FFFF01FFFFFFFFEDDFF98
-:100A8000FFFFA5FF6F6BE96FDACAFBDDEEF7F6B289
-:100A9000B3A4A15B5BF6D7F4F77BBDBDADCFEF7F11
-:100AA0006B7F3BDFDBFFFF30CFFFFFFFFEBFFFFFB2
-:100AB000FFFFFFF6FE96FFFDB5FDBFAD7FFF6FFFA9
-:100AC000DED1ADADE9FFF1ECEFDE3FCBFFF6FF325B
-:100AD000FFC5BDFFFFFFD0BFFFFFFFFEFEFBFFF422
-:100AE00028BFFFFDFBD3FFFF42FFFFFFEAB3FCC3BC
-:100AF000C1FF33FFC0156B70FFF0F24FFFFC3E9754
-:100B00003CFFFFFDEFF0BFFFFFFFFEFFFFFFFE78A2
-:100B1000BFFFFDF3EF55FF7EFFFFFFEAB3FCC3C14C
-:100B2000FF33FFC0156FFF0FF0F00FFFFC3D6BC3ED
-:100B3000FFFFFEF7F0CFFFFFFFFEFFFFFFFFFCFF11
-:100B4000FF23F87FFF4EFFFFFFFBF917FFF6F1FFD2
-:100B5000CFEFFFFF13DFE62FC7FFFFE7C1FDFFFE6B
-:100B6000FFFFFFF04FFFFFFFFEF5FFFFFFFEAEFFB1
-:100B7000FF7F3B3FFC7FFCEFFFFCE27BFFF1FDEDE5
-:100B8000EFFFFF3573FFFFFEFAFFFFFFFEBFFFFF22
-:100B9000FFFAF08FFFFFFFFEF1C000000000000031
-:100BA000000000800000400000000C0401404000F4
-:100BB00000302804000800000001000100000000CF
-:100BC00038F00FFFFFFFFEFDBFFFFFFFFFFBFF7FC2
-:100BD000FFFF9FFFFFFFFFFFFFFFFFF1FFDFDFFFD3
-:100BE000FFFFFFEDFFFDFFFFFFFFFFBFBFFFFFC3E5
-:100BF000F03FFFFFFFFEF0BFFDFFBFFFFFFDFFFF68
-:100C0000FFFFFFFD7BFF7FFFBDFFF1EFFFFFFDDF7C
-:100C1000FDFBFFFFBFBEFFCD7FFCF7F76FBFD8F036
-:100C2000EFFFFFFFFEF830000000040000A000000E
-:100C3000C0000020340000000C810020A42000101F
-:100C400008044808004093001000381820C1F03F05
-:100C5000FFFFFFFEFFFBFFFFB9DFFEB3FFFFE7FD76
-:100C6000FFFF3BFF7FFFBFFFC1FFFCFFFF3F77FEA2
-:100C7000FECFFFBFFDBFFFFEEDF2FDF7FFF02FFF40
-:100C8000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF75
-:100C9000FFFFFFFFFFFFFFF1FFFFFFFFFFFFFFFF72
-:100CA000FFFFFFFFFFFFFFFFFFFFFFFFF0BFFFFFA3
-:100CB000FFFEFFFFFFF3ADCFEF70C9733BDF5B4A71
-:100CC000F6B7FED7F5BCC133CAD6B76EF7FBBDC5C4
-:100CD00024CF6F2F4D2BBA5AFFFFFFF0AFFFFFFF5E
-:100CE000FEBFFFFFFFFFF6F6D7FFFFADBDFFFFFF23
-:100CF000EFF77FFC5BB1FDBD756FEF6AFD5BFBDB62
-:100D00003ABF8E9FFFBFFDFF6FFFD06FFFFFFFFE5B
-:100D1000FFBBFFF03FFFFFFDFB7FDEFFFF5AD6BFAB
-:100D2000D82ABFBFF1E5FFCCC0A970FFF33C3CFD62
-:100D300057FD980300C3FFFFFFF0AFFFFFFFFEFF6B
-:100D4000FFFFFF3DBFFFFDFBFFDBFFFF0FFC3FD8B9
-:100D50002ABFBFF1EFFFCCC096BEFFF33FFFFD57A8
-:100D6000FD990FFFC3FFFFFFF04FFFFFFFFEFFFFE7
-:100D7000FFF1E7FFFFF38E7BFFA8FFDF7F8E787325
-:100D8000FFF15162FFFC4BFFF3FF7ECFF9FFFDFF48
-:100D9000FF7FFFE0FFFFFFF04FFFFFFFFEF5FFFFCC
-:100DA000FBFDAEFFFCFE6F3FF8FD77AFFE37FE7B2D
-:100DB000FFB18CFFEFFDF8E7BFFFF1FE3EF7FE95B8
-:100DC0003EBFFFFFFFFAF0BFFFFFFFFEF1C00000D4
-:100DD0000104000000008002000010001000100854
-:100DE0004180100000081084000C040261000081A2
-:100DF000000000003DF07FFFFFFFFEFDBFFFFFFF93
-:100E0000FFFF7FFFFEFDBFFFFFFFFFFFFFFFFFF1C3
-:100E10007FBFF77FEFFFEFFFF7FDFFFFFD7FFFBE17
-:100E2000DFFFFFD9F0BFFFFFFFFEF0BBFF7FFBFF3F
-:100E3000FBFFBFFFF37FFBFDEB7FDFFAFFDEF0ED93
-:100E4000FFB1F7F91FB55BFE7EF7BEFD7F5FB5F71B
-:100E5000FFFFD0F04FFFFFFFFEF830010007420117
-:100E6000006A185080000002400101200101241492
-:100E700021100208070800401080580084801810D4
-:100E800040C1F0BFFFFFFFFEFFFFFFF7FFDBB7F33F
-:100E9000DF7CF874FFFF6F7D3F7EEC7FC1F5FFCFF5
-:100EA0006F9FF9DFBEE5E7FFD7F3DDFBFFFCFFBF78
-:100EB000FFF0FFFFFFFFFEFFFFFFFFFFFFFFFFFF52
-:100EC000FFFFFFFFFFFFFFFFFFFFFFF1FFFFFFFF40
-:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
-:100EE000F02FFFFFFFFED7FFFFFFB4CFEF776F7349
-:100EF0003A4A3ACBD4F72ED6BDBDA13BDFD6F7EEAA
-:100F0000D335BDFBBDCEEB2B4D2FBBDAFFFFFEB0C3
-:100F10005FFFFFFFFEBFFFFFFFDF5F36AF3FEDB7B5
-:100F2000F5FDF32BEF77FFFBDAB1BDA377697F4FB8
-:100F3000FFDBFA5BFFF2FEFF96FFFFFEDFFFD0AFA5
-:100F4000FFFFFFFEFFFFFFFD8FFD406F9E835A0FE7
-:100F5000FAC3FFFFFCE97FF301D000FEBFCD3FF0F5
-:100F6000EFFCC50C3FFD680BFFFFFFFEDFF0FFFF4E
-:100F7000FFFFFEFFBBFFFD85FFD46F9FC35A0FFF2E
-:100F8000FFFFFFFCE97FF301F0FBC2BFFC0037EF7E
-:100F9000FCCDBC3FFF0CBFFFFFFFFFFFF05FFFFF7B
-:100FA000FFFEFFFFFFFFD9F7D1B77E7FF1E4FDFF22
-:100FB000FBFBFF5FFF7FB1BC0F67EBB83FFFE2FFBA
-:100FC000E9FFFDE3FF3F9FC2FFFFFFF09FFFFFFF31
-:100FD000FEF57FFFF03FBCFFD5F5CE3FFEFFFE6D77
-:100FE000FFF1BF7BFFF1FDFF4FFF87FFAEFFB1F8C1
-:100FF000FEFFFF7801B9FFFFFFFAF02FFFFFFFFEB2
-:10100000F3C00000000402130200804000901000B2
-:1010100010000200012080121000400800040000AF
-:1010200002000140008000003CF0EFFFFFFFFEFDEA
-:101030001FFFFFFF7FFFFFFFFF7FFF7FF7DFF7FF50
-:10104000F7FBEBD1FFFFFFFFEFF7FFFFFBFFFEFF1B
-:10105000FF7EFFFBFFFFFFDBF0FFFFFFFFFEF0FF68
-:10106000FFB7EBF7DFFFFEF56BE7EDF73EECFF5464
-:10107000EF6FF1F5AF6FF6FDFFDD7BFFEFBF7FFF99
-:10108000FFF7FFF35FF7D0F0CFFFFFFFFEF8300070
-:1010900080400400812C0424000201C802000224C4
-:1010A0000001B442DC4402159002034839100224C6
-:1010B000A0BA000040C1F0BFFFFFFFFEFFFFFFFF2F
-:1010C000FEFCF7F0EEB65DFDF5FFDBF77F7FBEFFC0
-:1010D000C1FEBFFAFA5FFFADFFEFFF7FDF7FFEBF0C
-:1010E000B794BFFFFFF09FFFFFFFFEFFFFFFFFFF73
-:1010F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10E
-:10110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
-:10111000FFFFFFFFF08FFFFFFFFED7FFFFFBB5FFD5
-:10112000EF7CEB2B525B3BDAD4F33696B5BDF1FB8B
-:10113000DAEEF6FED335BDDFADCFEF7ECD6BBBDF94
-:10114000FFFFFDB0EFFFFFFFFEBFFFFFFFD35FF626
-:10115000FFF6FFFDADFDFF7FEFFF6F7FDBF1A5A386
-:101160007F6F6B4FFFDBFBCBFFF6FFF4D7FDBFFEBE
-:10117000DFFFD0CFFFFFFFFEFFFFFFF7DFFFFFFF27
-:101180003F7FFCE5FF20FEFFFFDF7FFFF17FFFFEDB
-:10119000FFF07C3D4FF3C33FFFFF6FC3FF0FFFFF27
-:1011A000AFF02FFFFFFFFEFFFFFBB7E00FFFFF2BAE
-:1011B000FF7DBFFFDFFFFFF89F7FFFF155FFFFFFC0
-:1011C000FD7C3CFFF3C33FFFFFEFC3FFDFFFFFFFEB
-:1011D000F09FFFFFFFFEFFFFFFFFEFFFFF9FBF7FBF
-:1011E000F919478EE79F3F17FFFC81C17EF3D9F9BC
-:1011F00073DFF47FFAFFFFFFFB7F77C7FFFFFFF08E
-:101200002FFFFFFFFEF5F7FFFBFFF73FFCBF3E3F61
-:10121000ECFF81AFFE4FF3BBFFF07EFF6FFF87FF58
-:10122000BBFFD5FCFF7FFC6FFFEFE7FFFFFAF03F4E
-:10123000FFFFFFFEF3C00000000000000000008080
-:101240000030106020000800012080001000040021
-:101250000000000000020080400008203CF06FFF0A
-:10126000FFFFFEF5BFFFFFFEFFFFFFFF7FFE3FFF1B
-:10127000FFFFFFFFEFFFFFF1DFDFFFFFFF7FDFFF7C
-:10128000FDBDFFFFFFFBDFFFFFFFFF5BF0FFFFFF89
-:10129000FFFEF0BFBFBFFFF7FBFFFEEEFAFFFFFF51
-:1012A0003D3BFFFFFEFBF1FFBF7BFFFFEFFFBFFFFB
-:1012B000FFFFFFFFFEFFF7EFFFFBD0F0DFFFFFFFB9
-:1012C000FEF83000000000000B10050100080002CD
-:1012D000010100001001C8080000000042020000E7
-:1012E000008002000040248000C1F03FFFFFFFFEAD
-:1012F000FFFFFFFFF7FDF7FAEFEEF9FDFFF7FEBF87
-:101300001FFD9EFDD1EFFFF77F9FFFEFFFF6FFFE72
-:10131000FE7BFFBDFF7EFFFFFFF03FFFFFFFFEFFF5
-:10132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
-:10133000FFFFFFF1FFFFFFFFFFFFFFFFFFFFFFFFCB
-:10134000FFFFFFFFFFFFFFFFF0AFFFFFFFFEFFFF0D
-:10135000FFF7FFFFFFFF7FFFFFFFDFFDFFFFDFFF67
-:10136000FF5FF1BFFFFFFFFFFFFFFFFFFFFFFFFF7B
-:10137000FFFFFFFFFFFFFFF0DFFFFFFFFEFFEFFFBD
-:10138000F7FFFFFFFFFFFFFFFF3FFBFFFFEFFBFD4F
-:10139000FFF1FFFFFBFFFFFFFFFFFFFFFFFFFFFF6F
-:1013A000FFFFFFFFFFFFF02FFFFFFFFEF7FFFFFF35
-:1013B000FFFFFFFFFDFFFFFFFFFFFF7FFFFFE7FFD7
-:1013C000F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
-:1013D000FFFFFFFFFFF0FFFFFFFFFEFFFFFFFFFF2D
-:1013E000FFFFFFFFFFFFFFFFFFFFCFFFFBFFFBF153
-:1013F000FFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFF01
-:10140000FFFFFFFFF02FFFFFFFFEFFFFFFFFFFFFCC
-:10141000FFFFFFFFFFFFFFFF7BFFFFFF7FFFF1FFEE
-:10142000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFEC
-:10143000FFFFFFF07FFFFFFFFEFFFFFFEFFFFFFF5C
-:10144000FFFFFFFFFFFFFFDF57FFFEBFFBF1FFFFC7
-:10145000FDF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
-:10146000D7FFF07FFFFFFFFEFFFFFFF7DBFFDBFD96
-:10147000F6FFF6FF3CBCBCBFDF6FEF2FF13CBFBCFB
-:10148000BFDF6FFF6FF7DBFFDBFDF6FFF6FFFFFF50
-:1014900001E2EFFFFFFFFEFFFFFFFFFFFFFFFFFF88
-:1014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
-:0614B000FFFFFFFFFFFF3C
-:00000001FF
-/*
- *
- * File yam1k2b5.mcs converted to h format by mcs2h
- *
- * (C) F6FBB 1998
- *
- * Tue Aug 25 20:24:08 1998
- *
- */
diff --git a/firmware/yam/9600.bin.ihex b/firmware/yam/9600.bin.ihex
deleted file mode 100644
index 817a34be22cc..000000000000
--- a/firmware/yam/9600.bin.ihex
+++ /dev/null
@@ -1,342 +0,0 @@
-:10000000FFF200A5ADFFFE9FFFEFFBCBFFDBFEF293
-:10001000FFF6FF9CBFFDBFEF2E3F6FF1FDB4FDBFAC
-:10002000FF6FFF6FFF0BFFDBFFF2FFF6FFFFFFFF2E
-:10003000F06FFFFFFFFEFFFDDFFFFFFFF7FFFFFF9A
-:10004000FBFFFFF7FFFFFFFEFF7FF1FFFEFFBFBFDC
-:10005000FFFFFFFFFFF7FFFFFFFEFFFEFFFFFFF0C9
-:10006000EFFFFFFFFEFFFFFFFFFFFFBFFFFFFFF7F9
-:10007000FFFFF7EFFFFFFFFFFFF1FFFFFF7EFFFF37
-:10008000FFFFFFFFDFFFFFFFFFFFFDFFFFFFF0DFD1
-:10009000FFFFFFFEFFFFDFFFFFFFFFFFFFFFFFFF91
-:1000A000FFFFEFFFF3FBFEFFF1FFFDFFFFFFFFFF91
-:1000B000FFFFFFFFFFFFFFFEFFFFFFDFFFF07FFF00
-:1000C000FFFFFEFFFFEFFFFFFFFFFFFFFFFFFFFF51
-:1000D000FFFFDFFFFFFFF7F1FFFFFFDFFFFFFFFF86
-:1000E000FFFFFFFFFFFFFFFEFFFFFFFFF00FFFFF20
-:1000F000FFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFF91
-:10010000FFFFFFFFFFFFF1FFFFFFFFFFFFFFFFF517
-:10011000FFFFFFFFFFFFFFFFFFFFFFF02FFFFFFFCE
-:10012000FEFFFFFFFFFFFFFBFFFFFFEFFF7FFFEF84
-:10013000FFEFFF7FEFF1FFEFFF7FFFFFFFFFFFFF0D
-:10014000FFFFFFFFFFFEFFFFFFFFF09FFFFFFFFE30
-:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
-:10016000FFFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFAD
-:10017000FFFFFFFFFFFFFFFFFFF0BFFFFFFFFEFFDF
-:10018000FFFFFFBDFFEF7FEF7FFBDFD35AFED7D628
-:10019000F77FBDF1BB5DD6F7FE96FFBDAFADBFEFFC
-:1001A0007F6B7FFBD6FEF7FF10EFFFFFFFFEBEEF7A
-:1001B000FFFFDBFFF6FFF6FFFDBFFDBFFF7FFF7F09
-:1001C000DFDBF1FD35FF6FFF6FFFDBFFCBFFF6FFDE
-:1001D000F2FDFDBFFFFFFFD0EFFFFFFFFEFFFFFFC0
-:1001E000FFFFFFFFFFFFFFFFFFFF55FFCCC03FFFFB
-:1001F000FFF124F0FFFFCFEF3FFFF0FFFFFFFC3FD9
-:10020000FFFFFFFFFFFFF0CFFFFFFFFEFFFFFFFF3E
-:10021000FFFFFFFFFFFFFFFFFF55FFCCC03FFFFFCA
-:10022000F100F0FFFFCFDFFFFFF0FFFFFFFC3FFF1C
-:10023000FFFF7DFFFFF0FFFFFFFFFEFFFFFFFFFF60
-:10024000FFFFFFFFFFFFFFFFDFFE7FDFFFFFFFF18D
-:10025000FFCFFFF3FF97FFFF8FE7FFFFFC71FFFF6B
-:10026000FFFFFFFFF0EFFFFFFFFEF5FFBFFFFFFF08
-:10027000FFFFFFFFFFFFE3F7EFFFFFFC7BFFF13F17
-:10028000FFEFFFCFE3E3FFFFFFFF3FFFFFFFBFFFF6
-:10029000BFFFDAF07FFFFFFFFEF2C00000000000AA
-:1002A000000000000000000000000000000100004D
-:1002B000000000000000000100000200000000003B
-:1002C000013CF0AFFFFFFFFEFDBFFFFFFFFFFFFFA1
-:1002D000FFFFFFFFFFDBFFFFFFFFFFFFF1FF9FFFC0
-:1002E000FFFFF7FFEFFFFFFFFFFFFFFFFFFFFFFF36
-:1002F000DBF07FFFFFFFFEF0BBDFFFFFFFFFFFFF35
-:10030000FFFFFFFFFFFFFFEFFBDFBFF1FEFDF7FF8A
-:10031000FFFFFFFFFEFFFFFFFFFFFFFFFF77FDF285
-:10032000F01FFFFFFFFEF838000000000000000390
-:100330000000000200900000000C010000042400F6
-:100340004001000000400000000002000001C0F079
-:100350004FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF5E
-:10036000FFFFBFFFFF6FFFDFFFD1FFFEFFFFFFFFBC
-:10037000FFFFDFFFFBFFFBEFFFFFEEFFFF7FF0DF85
-:10038000FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7E
-:10039000FFFFFFFFFFFFFFFFF1FFFFFFFFFFFFFF7B
-:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFF08FFFDC
-:1003B000FFFFFEFFFFFFF5ADFF692AED6BFBDF3AA4
-:1003C000DCF496EEB33D35C1BBDDFEF6FED6B5AD31
-:1003D000BFA5AD492F4F2BDA5FFFFFFFF02FFFFFC7
-:1003E000FFFEBFFFFFFB5BF7F6FFF6FFFDBFFDA5BE
-:1003F000F36FF36EFA7BD1FDB5776FE96FFFDBFB2F
-:10040000DBDFF6FFF6FFFD3FFEF7FFD04FFFFFFFFC
-:10041000FEFF9FFFFF0FFFC03F9C03FFFF8BA5FE6A
-:10042000803EC2BFACB124FFFFFFFFFFFF0FFFA361
-:10043000FFFD6BFFFFF0A5FFFFFFF0AFFFFFFFFE2B
-:10044000FFFFFFFF0FFFC03FD46BFFFFDBFFFE8608
-:10045000BFC2BF30A124FFFFFFFFCCFF0FFFA3FFF0
-:10046000056BFFFFF0A5FFFFFFF07FFFFFFFFEFF23
-:10047000FFFFFBC7FFC4FFFF7FFFECFE7FDFD8B9A4
-:1004800047FC36C1DFFFFFF9FFF3FFF7FFFCFFFD7D
-:100490003FFFFFFF3FFFFFFFF07FFFFFFFFEF5FF86
-:1004A000FFFFFFFEFFFF7EBD3FFF2BFE2FF5A3FCEE
-:1004B0005BFE619F7FEFFFFFA7FBFFFFFAFEFF33AD
-:1004C000F1FFBFFFFFFFFAF07FFFFFFFFEF1C0006B
-:1004D0000000000000000000000000400030240484
-:1004E000000100804000080000000201010002003D
-:1004F00000000000013DF02FFFFFFFFEFDBDFFFDEE
-:10050000FFFFFFFFFFFBFFFF7FF6EFBFF7FF73EB80
-:10051000F1FFFFFFDFFFFFFFFFFFF9FFFDFEFFFF22
-:10052000FFFFFFFFD9F0DFFFFFFFFEF0BF7FFFFF00
-:10053000FF7FFFFFDEFFFFEFDDDE77F2FBEDE7F190
-:1005400073FDFDDFFF7DBEDFFFFBFFEFFFEFFFFF72
-:10055000FFFFFFD0F0BFFFFFFFFEF83020020022B8
-:1005600040C0000000080002410212002187810003
-:100570000080040B2801B000820040000000000051
-:100580000000C1F0DFFFFFFFFEFFFFFFFFFFFDFFE9
-:10059000F7FFFE7FED79FFDEEB7F74F7F7E1F9FF00
-:1005A000F65F7FFFFFFFD7DBEFFFBBFFFFFFCCFF57
-:1005B000FFFFF0CFFFFFFFFEFFFFFFFFFFFFFFFF8B
-:1005C000FFFFFFFFFFFFFFFFFFFFFFFFF1FFFFFF49
-:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
-:1005E000FFF00FFFFFFFFEFFFFFFFD3DCD497F6FD7
-:1005F0002BBA5CD2DAF6F33EF7FFBDF1FADFFEF775
-:10060000CCF6BBA5B3ADBF6F7D6F6BDBDFBDFFFE6F
-:10061000B05FFFFFFFFEBFFFFFFBDB57F6FE9FD57E
-:10062000B7FFAFE53FFFFF6FFFDBF1FDBFFF6F6976
-:100630006CDFDADFCBFFF6FF76FDFDBFFFFFFFD0FB
-:100640003FFFFFFFFEFFFFFFFFFDBD0803894F5A7D
-:100650000FF0FFF8BFFFFFFFFFF15AFFFFFFFFF3AF
-:10066000FAA0F0F2BFFFFFFFFFFFFFFFFFFFF0FF69
-:10067000FFFFFFFEFFFFFFFFFCFD006BFFFF5A0FB8
-:10068000F0FFFFFFFFFFFFFFF15AFFFFFFFFB3F592
-:1006900050F0F0FFFFFFD7FFFFFFFFFFFFF07FFFEE
-:1006A000FFFFFEFFFFFFFDBCFFE4E771FFF9C4F4AD
-:1006B0007F7FCFFFFFFFFFF1FFFFFFFBF773BF144B
-:1006C000FFE6FFFFE17DFFFFE7FFFFFFF03FFFFFDA
-:1006D000FFFEF5FFFFFED2FAFFC4F45CBFFAFFFF96
-:1006E000EC7EBFFFFFFFF1FFFFEFFFFF6BDBFFDFE4
-:1006F000F9FBBFFFF1FFBFFFFFFFFBF0BFFFFFFFF5
-:10070000FEF3C00002000000008200000000800034
-:10071000000000400001000000010820000000006F
-:100720000100010000800200013CF05FFFFFFFFEBE
-:10073000FDBFFFFFFFDFFFFFFFFF7FFFDFFFEFFFDB
-:10074000FFFFFFFFF1FFFFFFFFFFF7FFFBFFFDFFD5
-:10075000FFFFFFFFFFFDFFFFC3F0AFFFFFFFFEF056
-:10076000FFDFFFFFF723FFFFFDFFEFFFFE7F7DF7BA
-:10077000FEFF7F71FFFB7FFFFFFF6EFDF7FDFFBFF9
-:10078000FFBFF9FDFFDFEFF0F0AFFFFFFFFEF83036
-:10079000400100830000000C060804262600000625
-:1007A0000300010000000004007008800020012008
-:1007B000000200300000C1F05FFFFFFFFEFFFFFFFF
-:1007C000FFFF7B3FF7FFD7FEFEFBFE3BFEBDFF2F8B
-:1007D000FF71FFFB7FE7FFF9EFFFD7FAFFB7BBFE23
-:1007E000FFFF74FFF7FFF0CFFFFFFFFEFFFFFFFFEC
-:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
-:10080000F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
-:10081000FFFFFFFFFFF08FFFFFFFFEFFFFFFFFB5B2
-:10082000BD6F7CEB7FFBDBD34BEED6F6B7FDACA107
-:10083000FBDFFEF7F496BDB4C5A5AF6F694F7FBA75
-:10084000DBFFFFFFF03FFFFFFFFEBFFFFFFFDBFF10
-:10085000F6FFF6FFBDBFA5BFFF7D7FEFFFFBF1FDFC
-:10086000BFFF6FFF6B7ADBFFDBDFF6FEB6FDFDBF80
-:10087000FEF7FFD0EFFFFFFFFEFFFFFFFFF42FFFAC
-:10088000FC436BFFFFFF0DFFFC333FF05FF1FFFF09
-:10089000FFFFF9DEF04CFE77AFFFFFEFFFF0FFDB6D
-:1008A000FF5FF0EFFFFFFFFEFFFEF7FFF02FFFFD02
-:1008B000437FFFFFF10FFFFC333FFFAFF1FFFFFF6F
-:1008C000FFF6D7FFBCFDBDFFFFFFFFFFF0FFFFFFFF
-:1008D000FFF0EFFFFFFFFEFFFFFFFFFCFFFFFBF15D
-:1008E000BFFFF9FDCFF270FF1F9FF3F1FFFFFFFF86
-:1008F000FCF7FF139FFCFFFF84F7FFFF47FFFFFF9D
-:10090000F0BFFFFFFFFEF5FFFFFFF1FCFFFEFE79EA
-:100910003FFF1D46CFFFCFFC7BFFF1FFFFFFFFED49
-:10092000F3ABFFCBFFF8FFFCF5FFBFFFFFFFFAF0D3
-:100930008FFFFFFFFEF3C200000000000000010077
-:10094000000020002000000408010000000000203A
-:100950000C0000040100010000800000013CF07F59
-:10096000FFFFFFFEFDBFFFFFFDFEFFFFFFFFFEFFDE
-:10097000DFFFFFF7FFFFFFEFF1FFFFFFFFFFFFEBE1
-:10098000FFDFFFFFFBF77FFFFEFFFFBFDBF0FFFF97
-:10099000FFFFFEF0FFFFFFFFFFDFFFFFFF7FF7FF1F
-:1009A000BFBFCFFFFFFF3EF17FFFFFEFFFFFFFFE67
-:1009B000FFFDFFBFBDFEFFFBF7DFFBD0F09FFFFF9A
-:1009C000FFFEF8302000400180C030000020001001
-:1009D00050882000001301000000000000100000FB
-:1009E00000000180080000A00010C1F0EFFFFFFF31
-:1009F000FEFDEF7FFFFFBFFFF7FFEFFBFD77EFBFD0
-:100A0000F77FFFFFBFD17FFFFFF7FFFFFFFFAFFFC4
-:100A1000DFF7FBFFFDFFFCFFFDFFF0FFFFFFFFFE29
-:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
-:100A3000FFFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFD4
-:100A4000FFFFFFFFFFFFFFFFFFF05FFFFFFFFEFF66
-:100A5000FFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFC6
-:100A6000FFFFFFF1FFFFFFFFFFFFFFFFFFFFFFFFA4
-:100A7000FFFFFFFFFFFFFFFFE03FFFFFFFFEDDFF88
-:100A8000FFFFA5FD6F7D6D7F52DF5A4BEEB6EEF294
-:100A9000BBACA15B4DD6F7FEB2BD35B5B5DD6F7F02
-:100AA000E95F52DFBDFFFFF0DFFFFFFFFEBFFFFF8B
-:100AB000FFDBFEF6FFF6FFFDBFFDB5BFF97F6FFF61
-:100AC000DBF1FDBFFF6FFF697FDBFFD3FFF6FEF2B7
-:100AD000FFADBFFFFFFFD0DFFFFFFFFEFFFFFFF512
-:100AE000300FFFFFFD6BCAFFF00FD6BFCF3FFFFFF8
-:100AF000F1FFFFFFCAFEBFFFF005AF0FFFFCF0CF15
-:100B0000F0FFFFFFFFF0EFFFFFFFFEFFFFFFF530FD
-:100B10000FFFFFFC3FCAFF0F0FD6BFFFFFF55FF1CE
-:100B2000FF8BFFC3FFFFFFFFFFFF0FFFFCF0CFF0C6
-:100B3000FFFFFFFFF03FFFFFFFFEFFFFFFFFCFFFC5
-:100B4000FFBF9F3FFEFCFF4FFFFFFFFFFFF7F1FFDF
-:100B5000DFFE7E3F9FF4FC7FFCFFFF3FFF3FFE3F39
-:100B6000FFFFFFF04FFFFFFFFEF5FFFFFBFFFEFF64
-:100B7000FFFFFFBFFBFFF8EDFF8FFFBBFFB1F3EF00
-:100B80008FF7FFFFDBFFFFFFEFBFFD79BFBFFFFF69
-:100B9000FFFBF0DFFFFFFFFEF3C0000000040000DA
-:100BA000000000000000008000040808010100901F
-:100BB000000000040008000000000800040000011C
-:100BC0003CF0DFFFFFFFFEFDBFFFFFFFFFFFFFFF6A
-:100BD000FFFFFFFF9FFFAFDFFFFFFFF1FFFFFFFF03
-:100BE000BFEFFFFFFFEDFFFFFFEFFFBFFFFFFFC303
-:100BF000F03FFFFFFFFEF0FFFDFFFFFFFBFFBBFF2E
-:100C0000FFFF7FF6FF7FFBFDEDFFF1FFFE7FFFFFA4
-:100C1000FF5FFFF7FF7EFFFDFFEFFFFFFFEFF0F04D
-:100C20008FFFFFFFFEF83080000400004002000349
-:100C300000050420000001D0008100200404000011
-:100C4000810408801000C0000000200008C1F06F7F
-:100C5000FFFFFFFEFFFF7FFFFFFFFFF3FDFFEDFC48
-:100C6000FFFF9FFBFDFFFFFFF1FFFF7FFB3EFF9FAD
-:100C7000FFFFFFFFFDF9FFFFFFFDFFFFFFF06FFF2D
-:100C8000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF75
-:100C9000FFFFFFFFFFFFFFF1FFFFFFFFFFFFFFFF72
-:100CA000FFFFFFFFFFFFFFFFFFFFFFFFF0CFFFFF93
-:100CB000FFFEFFFFFFFDBDFFEF7CEB7FFBDBFADC00
-:100CC000EEF7F6D7F52DA1BBDDEEF754F7FB2CB50B
-:100CD000B4BD6B6FEF6FBBDFFFFFFFF01FFFFFFFC8
-:100CE000FEBFFFFFFFFBFFF6FFF6FFFDBFFFBFEFFD
-:100CF0006FFF6FFADBF1C5BDF56FFF6FCADBFFDB7E
-:100D0000FBF697F6FFFDBFFEF7FFD09FFFFFFFFE4C
-:100D1000FFFFFFFFFFFFFFFF8B7FFFFFE763FFFF8B
-:100D2000FFFC77DFF1DBFFD6A83FFFFF082FF0FFC6
-:100D3000C3FFEBFFFFFFFFFF5FF0EFFFFFFFFEFFD3
-:100D4000FFFFFFFFFFFFFF8BFFFFFFFFFFFFFFFF27
-:100D5000FCFFCFF1DBFFD6A83FFFFF082FF0FFC35A
-:100D6000FFEBFFFFFFFFFFFFF05FFFFFFFFEFFFF57
-:100D7000FFFFFFFFFFFFF5BFFFCAFF9FFFFAB9E7C5
-:100D80009FF381FFFFFC73D7FFFF77FFFDFFFCFFA1
-:100D9000FFFFFFCFFFFFFFF01FFFFFFFFEF5FFFF8D
-:100DA000FFF7DEFFFE7EFFBFFFBFF1B3FFFFE3FBF8
-:100DB000FFE11F7FFFF878FFFB1EFFF7FEE7FFFF55
-:100DC000FFBFFFFFFFFAF04FFFFFFFFEF3C0000081
-:100DD00000000000000000000000500000000400BF
-:100DE00001804040200000080000000003000000D7
-:100DF000800000013CF0AFFFFFFFFEFDBFFFFBFFE7
-:100E0000FFFFFFFFFFFEFFFFFFFFFFFFFFEFF7F119
-:100E1000FDFFFFFFDFFFEFFFFFFFFFFFFFFF7FFF94
-:100E2000FFFFFFDBF08FFFFFFFFEF0FFDFFFFF7F25
-:100E3000FFFFFFBED7FFEDBD7EBFFEF67FBF71FF98
-:100E4000FFDAFFF9FFBF7FFEFF6F7FFFFFFFFFFFAE
-:100E50007FFFD0F0CFFFFFFFFEF830420000000020
-:100E600080C100009000C400001220432281840051
-:100E700000140001000880000200020004020000CB
-:100E800010C1F01FFFFFFFFEFFFFFDFFFFDDFEFFB4
-:100E9000B676E5BCF9F7AF5FBFFCDFCFF1FFEF79C6
-:100EA000FFBDFFEFFFFFF76F5FFFFFFDEFEFBFFF3E
-:100EB000FFF09FFFFFFFFEFFFFFFFFFFFFFFFFFFB2
-:100EC000FFFFFFFFFFFFFFFFFFFFFFF1FFFFFFFF40
-:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
-:100EE000F0FFFFFFFFFEDBFFFFFD2DFF692AEF771D
-:100EF000BBDD5ADFF6F6D6F77DBDD1B24AD6B2BE1B
-:100F000097F5BDB3ADFFEF7F696BFBDFFFFFFFF030
-:100F10002FFFFFFFFEBFFFFFFFDBFFF6FE9FD4BFEB
-:100F2000EDAFFF6B6FF7FFDDDB31FDBFFF6F7FFFC5
-:100F3000FFDBFFCBDFF6FFF6FFFDBFFEF7FFD08F35
-:100F4000FFFFFFFEFFFFFFFD1FFF462F9FFFFFFF7D
-:100F5000A5FFFFFFDFB7FFFFF1FFFFFFF7E96ABF64
-:100F6000FFFFFDFFFFFD5557FFFFFFFFAFF04FFFF6
-:100F7000FFFFFEFEDFFFFD1FFF462F9FFFFFFFA5C8
-:100F8000FFFFFFC037FFFFF1998EDC7FE96ABFFFEB
-:100F9000F00FFFFFFD5557FFFFFFFFFFF00FFFFFB3
-:100FA000FFFEFFFFFFFF07FFC0BEFFFFCFEF9FFF6A
-:100FB000FFFBFFE7FFFFA1E3CE3C583FF3FFFDEF50
-:100FC000F9FFFFF7F17FFFCBFFFFFFF02FFFFFFFE0
-:100FD000FEF57FFFF0FFFEFFC475E7B9FFFFFFEFEF
-:100FE000FFC7373BFFF0139E0FF4FFFEFBFFFFF937
-:100FF000FCFFFFFFFFBFFFFFFFFAF0EFFFFFFFFE69
-:10100000F3C0010000020002220000C040004000C6
-:101010000408040A0101102020000004080804004C
-:1010200000000000010000013CF0CFFFFFFFFEFDCB
-:101030003FFFFFFFFFFFFF7FFF7FFF7FFFCF9DFF92
-:10104000FFF7FDF1FFFFFFEEBFFFFFFFFFFEFFFF1A
-:10105000FFFFFFFFFFFFFFDBF06FFFFFFFFEF0FF73
-:10106000FFFFF7F7FFFFFEBFF7FFFF5BFFBFF7FFD5
-:10107000FD7F71FDFFEDF7FEEFFFFF7FFFFFFFFF3D
-:10108000FFFFEFFF7FFFD0F0FFFFFFFFFEF8301103
-:10109000004860408260246000CC008004010000B1
-:1010A00014010C0400300000000808000100C20018
-:1010B0000002008000C1F05FFFFFFFFEFFFFFFFFA7
-:1010C000F77BFFF3EBBFFFF7FFFFFFE75D3FFFF6A7
-:1010D000D1FDFFEBF73DFFFFFF5FFF7F7FF3FFFFDA
-:1010E000EFFDBFFFFFF05FFFFFFFFEFFFFFFFFFF12
-:1010F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10E
-:10110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
-:10111000FFFFFFFFF0DFFFFFFFFEFFFFFFF5B5DF83
-:101120006F7D697FFBDF525FF6F7FEF6F3BDB1DA44
-:10113000CDFEF6EED2BDA5AFBDFF6F7CEB2BFADA8C
-:10114000FFFEDFF04FFFFFFFFEBFFFFFFFDBFFF6FD
-:10115000FFF6FFBDBFCDBFEB6FF76FDFDB51FDBD0E
-:10116000FF6FFF6FFB5BFFDBFFF6FEF6FDFDBFFED3
-:10117000F7FFD0FFFFFFFFFEFFFFFFFA50FFFFFF6B
-:10118000F06FFFFFF096FFFFC62BFFFFF1FCFFFFA4
-:10119000F7DBC3FF00FFFFFFFFFFC14FC3FFFFFFF0
-:1011A000AFF09FFFFFFFFEFFFFFFF5A0FFFFFFF087
-:1011B0006FFFFFF096FFFFC62BFFFFF15AFFFFFF07
-:1011C000F3C3FF00FFFFFFFFFFC14FC3FFFFFFFFA0
-:1011D000F0CFFFFFFFFEFFFFFFFFFCFFFF9FF07F51
-:1011E000FFF9FC4FF3FF27EBFFFC81FC7FFE7BFF49
-:1011F000F7FF127FFFFFFFFF18FFFFFFFFFFFFF06A
-:101200007FFFFFFFFEF5FFFFFFDFFEFFFC7E7FBFDE
-:10121000FFFFAFEFFFDFDFFBFFF1C3FE6FF1CF3F5B
-:10122000FBFFFFCFFEFFFFFE7FBFFFFFBFFAF0DF38
-:10123000FFFFFFFEF3C000000100000000010000FE
-:10124000200001001000000001000200000000006A
-:101250000000000200008000028000023CF02FFF2E
-:10126000FFFFFEFDBFFFFBFDFFFFFFFFFFFFFFFFD7
-:10127000FFFFFFFFFFFFF5F1FF7FFFFFFFFFEFFF26
-:10128000FFFFFFFFFEFFFFFFFFFFFFDBF02FFFFF72
-:10129000FFFEF0FFFFFFFBFFBFFFFFFFFFF7BFFBFE
-:1012A000FFFFFFDFF7FFF1F7BFFBFFFFFF7FDEFF71
-:1012B000FFFFFFFFFFEDF7FFFF7FD0F03FFFFFFFD6
-:1012C000FEF830000000004000000000E000008058
-:1012D0002001019200010100E01C6020300808009C
-:1012E000000000000000008000C1F06FFFFFFFFE63
-:1012F000FFFFFFFFFFDBFEFFFFDFFFFC7FFBBFFF0A
-:10130000FFFFFFFFF1F6FFF77E3FFF7FFFFFFFF7D5
-:10131000FFFFFFEDFFDFFFB7FFF03FFFFFFFFEFF27
-:10132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
-:10133000FFFFFFF1FFFFFFFFFFFFFFFFFFFFFFFFCB
-:10134000FFFFFFFFFFFFFFFFF0FFFFFFFFFEFFFFBD
-:10135000FFFFFFFFDFFFFFFFDFFFFFFFFFBFFFDF3D
-:1013600057EFF1FDFE7FFFFFFFFFFFFFFFDFFBFFFA
-:10137000FFFFFFFFFFFFFFF07FFFFFFFFEFFFFFF0D
-:10138000FFFFFF7FFFFFFFFFFFFFFFFFFBFFDFFF11
-:10139000FFF1FDFF7FBFFFFFFFFFFFFFFFFFFFFF2D
-:1013A000FFFEFFFFFFFFF09FFFFFFFFEF7FDFFFFC8
-:1013B000FFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFF7D
-:1013C000F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
-:1013D000FFFFFFFFFFF06FFFFFFFFEFFFFFFFFFFBD
-:1013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11B
-:1013F000FFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-:10140000FFFFFFFFF0CFFFFFFFFEFFFFFFFFFFFF2C
-:10141000FFFBFFFFFFFEFFFFFB6FFFFEBFFFF1FFC4
-:10142000F7FFFF7FFFFFFFFFFFFFFFFFFFFFFFFD56
-:10143000FFFFFFF0EFFFFFFFFEFFFFFFFFFFFFFFDC
-:10144000FBFFFFFFFEFFFFFF57FFFDBFFFF1FFEFB9
-:10145000FEFFBFFFFFFFFFFFFFFFFFFFFFFFFEFFDE
-:10146000DEFFF0CFFFFFFFFEFFFFFFF7DBFFDBFD3F
-:10147000F6FFF6FF3CBCBCBFDF6FE72FF13CBFFDC2
-:10148000BFDF6FFF6FF7DBFFDBFDF6FFF6FFFFFF50
-:101490000201DFFFFFFFFEFFFFFFFFFFFFFFFFFF78
-:1014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
-:0614B000FFFFFFFFFFFF3C
-:00000001FF
-/*
- *
- * File yam111.mcs converted to h format by mcs2h
- *
- * (C) F6FBB 1998
- *
- * Tue Aug 25 20:23:03 1998
- *
- */
diff --git a/firmware/yamaha/ds1_ctrl.fw.ihex b/firmware/yamaha/ds1_ctrl.fw.ihex
deleted file mode 100644
index aa9b1d7dcb0b..000000000000
--- a/firmware/yamaha/ds1_ctrl.fw.ihex
+++ /dev/null
@@ -1,769 +0,0 @@
-:10000000070000000700240007000C0007001C0088
-:1000100007000600020070002000000040000300FE
-:100020000471000086420000400003000D0F000034
-:10003000100800003A042000820200000D020000B7
-:10004000100800003A04200082120000820E2000F6
-:10005000821A00000D2D0300100800003A04100061
-:100060008DD30200100800003A0418000D010000B2
-:1000700015000200FD000000200000006088030061
-:100080006090030060800300408003004080030014
-:1000900040800300408001007D0A00004080030092
-:1000A000408003004080010002042000820800001C
-:1000B0001A0008000409000086590100070000002A
-:1000C000070026000700000007000000068A010064
-:1000D000070000008D0C0300100800003A0418000F
-:1000E000070026007D080000428001000A1600007B
-:1000F00006A20400070000008D2100001008000087
-:100100003A04080006C2210007000000FD070000B5
-:10011000428001000A0008000409000086930200E2
-:1001200095010000040D09000700000020080000F0
-:10013000F50000007D0B000060F00100FD000000F4
-:1001400006220300408001007D0A00004280030077
-:100150004A8013000A001800201800006090050073
-:100160006088050040800100FD0000004280010021
-:100170000A007000150100004411070086230300E7
-:100180000000030020700000064A030040800100C8
-:100190008D340000100800003A04080006EA21002F
-:1001A000070000008DD30200100800003A04180078
-:1001B0000682010007000000070024008D0F0000E8
-:1001C000100800003A16000002240000025C000043
-:1001D000FD28000020000000408001000D00080004
-:1001E0001508000084095100070000004D000000C0
-:1001F0005D0E0000020E00008D410000100800009E
-:100200003A040800068A2C00070000008D00000058
-:1002100024090000020F00008D45000010080000B6
-:100220003A040800068A2C00070000007D38000010
-:10023000428001000A000800151000008409010036
-:10024000868301000700000006AA010007000000E5
-:10025000FD080000428001000A0018000419000097
-:100260008680210007002800101800003A042800AA
-:10027000020C28000D000000100800003A142800AD
-:100280008D80080020080000FD0200004080010071
-:10029000070020000D02000004991800070000006C
-:1002A0002D400000BD000000FD0200004280010062
-:1002B0000A00080004090000865A05000700000033
-:1002C00000010000200A00007D04000040800100C1
-:1002D000428001000A002000153000004421010086
-:1002E000864903000700000004210000864903003E
-:1002F000070000008D0F0000100800003A0C2800D5
-:100300004439020086C906000700000010180000EA
-:100310003A0428000D81080020080000FD020000BA
-:100320004080010007002000102800003A007800FB
-:100330008D680000100800003A040800068A2800B2
-:10034000070000000D40000015100000049918007F
-:1003500004292900043939000700000006020600BC
-:1003600007000000F50400007D00000020000000F0
-:100370008D00000060080100408001007D04000045
-:10038000428003004A8021000A001800441902003C
-:1003900086582100070000007540000004F171003C
-:1003A00007000000420001000A00280004290000A4
-:1003B00086202100070000000D3C000004A9300049
-:1003C000070000007D070000428001000A000800CD
-:1003D0000409000086DA07007D05000020280000DF
-:1003E00060B0030006F207004080010020300000EA
-:1003F00060A8030040800100FD020000428001006F
-:100400000A0008000409000086FA0700070000003F
-:100410007D050000428001000A0428008D0E0000C6
-:10042000100800003A0C28000D0000001008000021
-:100430003A1428000D00090020080000FD02000009
-:100440004080010007002000FD3D0000200000006A
-:10045000408001007D1000008D8D0000100800001C
-:100460003A040800068A280007000000150800006A
-:100470001A00080084090100865109007D1300005C
-:1004800000052000200F2800608F3300608F3B00A4
-:10049000608F4300608F4B00608F5300608F5B0064
-:1004A000608A030040800100BD7F0000C43D380029
-:1004B000070000007D1A0000751300004280010053
-:1004C0004A0009000A001000048D0B000495130077
-:1004D00007000000200800006090010004110000E7
-:1004E0008620210040000100FD170000428001002D
-:1004F0000A0008000409000086222100070000000D
-:100500007D190000428003004A8009000A001000A3
-:100510002409000064160000FD1100004280030061
-:100520004A802B004A8019008D0000004489210078
-:10053000070000004422000086E10A0007000000D6
-:10054000641A0000242A00007D190000020108003E
-:10055000220110002008000060900300408001008C
-:10056000FD3D00008D0000002008000040800100DB
-:10057000751300007D1A0000420001004A80090046
-:100580000A0010001D020000E4890100E492290025
-:1005900044913000070000000D060000150A00001D
-:1005A0001D0C000025100000E4A90000E42B010050
-:1005B00064040000E4B30100E432020064040000BB
-:1005C0006404000064040000640400000D040000E2
-:1005D000C4B108000700000020080000F50B00006F
-:1005E000400003007D190000428003004A8009009A
-:1005F000240A00000A000800640E0800070000003A
-:1006000022011000200800006010030040000100DB
-:10061000AC6400007D02000020000000408001006A
-:100620007D10000042800100FD1100004A803B0067
-:100630004A8009000A0020009500000044111A00B9
-:1006400044A1000086200D000D04000084B90000C4
-:1006500086210D00FD18000042800100FD10000001
-:100660004A8009000A0028009500000024090100C2
-:10067000642A000086110D00070000000429000014
-:1006800086220D0007000000062A0D000200080067
-:100690008D0000007D38000020080000408001002F
-:1006A0007D120000428001000A00100004390000A1
-:1006B00086D10D000D080000B5FF7F0084B9000051
-:1006C00086A10D0025000000067A0E002D00000016
-:1006D000150000002D0800008DC702002008000052
-:1006E00006C20E000D00000035807F0084B90000B6
-:1006F00086710E00250040008D00000044091100A5
-:10070000070000008D0100000495100007000000A4
-:10071000649100002404000024040000240400006C
-:1007200002011000020028008DC60200200800000F
-:1007300006C20E008D0100002D0400008D00000097
-:1007400004951000070000000D02000084911000C5
-:10075000070000000DC70200200800008D00000007
-:10076000FD38000040800100FD3B0000201000002B
-:1007700060A80300150800008431310084212100A5
-:100780000700000060B0030060A00300408001008B
-:10079000FD2200009500000024090100240400004F
-:1007A0002404000064120000020110002008000070
-:1007B0006090030040800100241900008DFB0000C0
-:1007C0007D390000200800004080050042800300C1
-:1007D0004A840900060600000A04080024040000F8
-:1007E000240400007D110000428001000A0008007E
-:1007F000240A000002052800020C28000D800900D0
-:1008000020080000FD0200004080010007002000D9
-:10081000FD220000428001000A000800950000004F
-:10082000C40D2800241901007D1900004280010038
-:10083000FD1100004A8009000A001000B500000008
-:1008400044311100048D0A0007000000440A08002A
-:100850000495120007000000FD2300002010000096
-:100860004080030044121000070000002008000030
-:100870006090030040800100FD0200004280010002
-:100880000A0008000409000086FA100007000000B2
-:10089000FD3B000000010000100A00007A800B0000
-:1008A0004A80130084090900070000009500000039
-:1008B000043D0100868011000A00100002001000B3
-:1008C0008409090007000000428003004A801100EB
-:1008D000040D0900070000000A001000840D090043
-:1008E000070000007D250000200800004080010076
-:1008F0000D010000100800003A1428007D120000CD
-:10090000428001000A0020007D19000042800100A1
-:100910007D1100004A8031000A00100024310000DF
-:100920000D2801007D3900002008000040800500EE
-:10093000428003004A840900060600000A040800F9
-:1009400002013000243100002404000024040000CF
-:1009500024120000020528004C1A00008601130032
-:10096000020070002D000000000003007D38000030
-:10097000428001000A001000062A13002421000012
-:10098000AD000000020010000D010000240900006D
-:10099000246B00008D3601007D3900002008000026
-:1009A00040800500428003004A84090006060000DA
-:1009B0000A040800643200008D000000240A0000D0
-:1009C000201000007D220000408001000D3C01004D
-:1009D000100800003A04080006D2290007000000B1
-:1009E000202800007D200000408001007D110000D3
-:1009F000428003004A8013000A8033007D380000E3
-:100A0000428001000A00080004090000863A16002E
-:100A1000070000008D000000640903008D470100FD
-:100A20007D3900002008000040800500428003005E
-:100A30004A840900060600000A0408000201380082
-:100A4000240400002404000024120000FD02000021
-:100A5000428001000A0008000409000086A2140078
-:100A600007000000020528004C1A00008639160015
-:100A700007000000642103002C630000FD3D00001E
-:100A8000428001000A0008009500000004090900E6
-:100A900007000000200800004C1A000086611500C5
-:100AA0004080010000000300067A150024210000A8
-:100AB0000D01000024090000246B00008D5B010083
-:100AC0007D390000200800004080050042800300BE
-:100AD0004A840900060600000A040800643A00007F
-:100AE0009500000024120000FD0200004280010079
-:100AF0000A0008000409000086DA1500070000005B
-:100B00008D620100100800003A04080006D2290096
-:100B10000700000006D2140007000000207000004B
-:100B20000A0108002A011000FD200000608803006F
-:100B300060900300408001007D220000428001009F
-:100B4000FD3D00000A0008004A843100040900004D
-:100B500086D816008B0018008D000000049918003C
-:100B60002C31000006AA1700070000004C320000DC
-:100B700086331700070000000419000086301700B4
-:100B80000700000095000000449119002C2200008D
-:100B9000243100006C6300003D0E0000751300005E
-:100BA000FD0B0000420001004A8009000A0010000D
-:100BB000EC8A0300EC9303004C22000086A9170086
-:100BC000070000008D000000049918006C2200004E
-:100BD0002C3200000A053000AB1D300083200000DD
-:100BE000FD180000428001000A000800248901006D
-:100BF000020530008310000075180000420001005B
-:100C00000A0010008D000000240901007513000087
-:100C100042053300CB0C3300CB2C3300CB343300F4
-:100C2000CB3C3300CB443300CB4C3300CB543300AC
-:100C30008B5C300083600000F50200004200010080
-:100C40000A00080004090000867A18000700000066
-:100C50002D1E0000FD050000428001000A00080072
-:100C600024890200020528000D060000100800007B
-:100C70003A0C28008D000000100800003A142800EB
-:100C80008D800A0020080000F502000040000100ED
-:100C90000700220075120000420003004A002100F4
-:100CA0008D00000044091A00070000000D980100A3
-:100CB000100800003A04080006222B00070000007C
-:100CC000F5010000420003004A000D000A00100078
-:100CD00044910800070000002008000040000100C7
-:100CE000F525000044310A0007000000200800003C
-:100CF00060280300400003007D21000042800300C3
-:100D00004A800B000A001000200800006010030059
-:100D1000400003008D000000240100002C010000B1
-:100D2000640E0000641A00006C6300000A010800F1
-:100D30002A0110002008000060100300400003009A
-:100D4000FD200000428001000A0008007D22000012
-:100D5000428001000A00100020080000601003001B
-:100D6000400003007D190000428001000A000800D5
-:100D7000FD220000428003000A001000200800004D
-:100D80006010030040000300040D0900070000008C
-:100D90002008000040000300428003004A800B004E
-:100DA0000A0010002008000060100300400003004B
-:100DB000428003004A8013004A801900040D11008C
-:100DC000048D1900070000000A0008002010000030
-:100DD0006018030060080300400003008D0000005D
-:100DE00044090B000700000020080000400001003B
-:100DF000F5050000420003000A000800200800007A
-:100E000040000100F5000000420001000A00080057
-:100E10000409000086601C00751E000042000300EB
-:100E20004A0401000A0C000006721C0007000000C2
-:100E300002040000020C00007D170000F51A0000FB
-:100E4000428001004A1403004A1C03004A240300A4
-:100E50004A2C03004A3403004A3C03004A4403007E
-:100E60000A4C00003D040000F5130000FD1A0000CC
-:100E7000420003004A000B004A801B004A80130016
-:100E80000A0020004491080044A11900E4890300ED
-:100E9000EC990300025500000A5D000042000300C7
-:100EA0004A000B004A801B004A8013000A00200001
-:100EB0004491080044A11900E4890300EC9903005F
-:100EC000026500000A6D0000420003004A000B00AA
-:100ED0004A0019004A802B004A8013004A802100F2
-:100EE0000A0030004491080044A1190044B12A00CE
-:100EF000E4890300EC990300027500000A7D0000FC
-:100F0000E4A90300020700007D10000015040000A2
-:100F1000428001000A000800E4090100020F0000FD
-:100F2000F52A0000FD190000420001004A80090076
-:100F30000A0010003409000074160000F5290000B2
-:100F4000420001000A0010007C91000075200000A2
-:100F5000420001000A0008000409000086D21E00B9
-:100F6000F5260000F5270000420003004A000900B2
-:100F70000A0010003C0A00007C160000751A0000F0
-:100F8000FD0B0000420001004A8051000A004800A9
-:100F90000700160075100000420001000A2C28000E
-:100FA000121D280012252800321F000007001E0015
-:100FB00007000E007519000042000100F52D000029
-:100FC0004A000D000A0010004491000086B21F0084
-:100FD000420001000A3428005D0E00008D00000070
-:100FE000750300002008000040000100F4D2050055
-:100FF00004D154005C7300008653200007000000F9
-:1010000007000C000700080007000A000D0402009A
-:10101000100800003A040800062233000700000010
-:10102000065A200007000000070008007522000093
-:10103000420001000A002000042100008620210057
-:101040002D1E0000F5020000420001000A00080009
-:101050000409000086922000070000001020000014
-:101060003A0430007D050000C38001000A0008003A
-:101070002489020002052800020C28000D810A00C4
-:1010800020080000F50200004000010007002200D7
-:10109000FD040000428001000A007000000003000F
-:1010A0002070000006FA0600408001000D180200C2
-:1010B000100800003A04080006222B000700000078
-:1010C000FD020000428001000A000800040900003F
-:1010D000868A21000700000006F2010007000000D8
-:1010E00075080000FD0900000D010000060A22003D
-:1010F00095020000750B00007D0900000D00000046
-:1011000015050000420001000A0018000419000043
-:1011100086782800F506000020100000400001003D
-:10112000F5040000200800004000010075070000E1
-:10113000420001004A8009000A001000241100004A
-:101140000409000086BA2200150800000201080008
-:101150000412100006DA22007505000004120800CF
-:1011600007000000020110007505000025040000C2
-:10117000241102000201100020080000601003008A
-:101180004000010024190000867828008D0000002E
-:1011900064040000049D00008688270002011800F6
-:1011A00075050000420001000A0428008D010000BE
-:1011B00024090000020D28000D0000002409000091
-:1011C000021528000D00100020080000F5020000A4
-:1011D000400001000700200075110000FD02000022
-:1011E000428001000A0008000409000086C22300B2
-:1011F0000700000000010000200B0800600B130036
-:10120000600B1B00600A0300400001004200050063
-:101210004A003D004A0035004A002D000A00200027
-:10122000F5060000420001000A142800F504000041
-:10123000420001000A00080015030000040D01002F
-:1012400086CA24001540000095000000040D01002E
-:1012500086B82400220010002A00100006E22400B4
-:10126000070000000431330004A92A000700000031
-:10127000242103000205280024110000240400009A
-:1012800024040000243200002C2900006C630000BC
-:1012900086F325000700000064B10200640400002A
-:1012A000640400008D000000640A0000020D2800A4
-:1012B0008D00100020080000F50200004000010031
-:1012C000070022008D00000004B93800070000006C
-:1012D0006C2903000A013000F50200004200010001
-:1012E0000A0008000409000086BA25000700000073
-:1012F0002C3102000A0528008D0000006C09010055
-:101300000A0D28000D01100020080000F502000061
-:101310004000010007002200241100002404000006
-:10132000240400002432000002013000442903009C
-:10133000867A26000700000002003000F504000055
-:10134000420001000A00080015030000040D01001E
-:1013500086C0260024310000640400000201300031
-:10136000F5020000420001000A0008000409000024
-:1013700086CA260007000000243100000205300064
-:10138000243900008305300083080000F5050000C3
-:10139000420001000A0428008D00000024810000A2
-:1013A000020D28008D000000248100000215280095
-:1013B0008D01100020080000F5020000400001002F
-:1013C0000700220025100000750500004200030000
-:1013D0004A0009000A00100004090A000411120062
-:1013E0000700000020100000600805004000050014
-:1013F000FD060000428001004A0009000A001000BA
-:10140000A500000004090A000411120007000000F2
-:10141000200800006090010040000100F50200007B
-:10142000420001000A00080004090000864228006A
-:1014300007000000060A230007000000060600005F
-:1014400007000000F5020000420001000A00080049
-:101450000409000086922800070000000001000037
-:10146000200B0800608B1300608B1B00608B230037
-:10147000608B2B00608B3300608B3B00608B4300E4
-:10148000608B4B00608B5300608B5B00608B630054
-:10149000608B6B00608B7300608B7B00608F030040
-:1014A000608F0B00608F1300608F1B00608F230024
-:1014B000608F2B00608F3300608F3B00608F430094
-:1014C000608F4B00608F5300608F5B00608F630004
-:1014D000608F6B00608F7300608F7B00608A0300F9
-:1014E00006060000408001008D000000640A000034
-:1014F000020D2800240A00007D0200004280010045
-:101500000A00100024120000FD03000042800100C8
-:101510000A0008000409000086822A000700000073
-:101520008D010000240A000064040000640400002F
-:101530000201080024090000240400002404000023
-:10154000020110000D0002004491000086D92A001B
-:1015500007000000FD010000428001000A000800B1
-:10156000440A000086BB2A00428001000D000A00E8
-:1015700020080000FD02000040800100070020005C
-:101580007D020000201000000606000040800100DF
-:10159000F5020000420001000A00080004090000F2
-:1015A000862A2B00070000007D0300004280010016
-:1015B0000A00080004090000865A2B0007000000FA
-:1015C000750000007D2E0000420001004A800B00E3
-:1015D0002000000004090000860600004000010011
-:1015E0004A8431008B043000830800008D00000025
-:1015F000100800003A1428008D00000010080000B8
-:101600003A0C280075060000420001000A0008009C
-:101610001538000024090100020528000D000B0008
-:1016200020080000F502000040000100060600004E
-:1016300007002200640400006404000006060000A5
-:1016400007000000340100008D7F00003C0900000D
-:10165000121D280012252800321F000007000E006E
-:101660000D0100007D030000200800004080010003
-:10167000F4D2050007000000070008007D03000009
-:10168000428001000A0008000409000086022D00C3
-:101690000700000006060000070000000700000029
-:1016A0001200000007001000070032000700600071
-:1016B000800010001A0048000449000086612D00D7
-:1016C00007000000101200003A0058004501000019
-:1016D000045D5C0007000000800000001A00480064
-:1016E0000449000086B12D00070000001012000020
-:1016F0003A0050000459000086082E004500000002
-:10170000C5000000F5FF7F007DFF7F0024D50700A6
-:101710002442000002015000020520008200000067
-:101720001A0040000441000086392E000700000026
-:10173000653800001A004000204000004D100000F5
-:1017400084C10400861B3000400000000700040034
-:10175000650100004501000020400000400000003D
-:1017600065070000800008001A00400004410000E6
-:1017700086C92E0007000000101200003A00400049
-:101780000441000086222F004D000000CD00000023
-:10179000104800003A042000820800001A004000AF
-:1017A0000441000086312F0007000000204800009F
-:1017B000045900008608300040000000E5070000E2
-:1017C00080042000A0162800E0163200E0163A003F
-:1017D000E0164200601202004000000032000000EB
-:1017E000750040007D00000074D507001205200040
-:1017F000820000001A0040000441000086E12F0032
-:1018000007000000067203000700640007000600DE
-:10181000E50000002000000040000000650A000014
-:1018200020000000400002004000020040000000D4
-:1018300065010000420000000A0070000471000011
-:1018400086A2300007000000068201000700640045
-:101850000000050020700000400000000672030038
-:1018600007006400070000006D300000608802007F
-:10187000609002000A0008006088020040800000BA
-:10188000120010000D10000084910000864131000C
-:101890000D0E000084910000865132000700000008
-:1018A00007003000201000006D3B00004080000069
-:1018B000800000001A000800040900008661310061
-:1018C0000700000020120000ED0D00004080000025
-:1018D000428000000A0010000D00400044951000F6
-:1018E0000700000020100000ED0D00004080000007
-:1018F000428000000A042000820000001A00080054
-:101900000409000086F13100070000006D3B000073
-:10191000428000000A000800150E00008409010042
-:10192000869B3200070060001A000800150C0000BA
-:1019300084090100868332002000000007001A009D
-:10194000ED02000040800000070062006D300000E2
-:10195000428002004A800A00200800004A800A00F3
-:10196000060600004A80100007000000122528002B
-:10197000321F0000F4D2050004D154005C73000053
-:10198000860700000700000007000C0007000A009F
-:1019900007001C00653400004000020020480000E1
-:1019A000605002000A004000604002004000000059
-:1019B000444945000700000020400000E53A0000CF
-:1019C00040000000E5280000420000000A00480036
-:1019D0000449000086683800652C000042000000C1
-:1019E0000A004000D5000000044145000700000047
-:1019F000550600000445050086F23400D5010000BC
-:101A00000445050086F03400652B0000420000000C
-:101A1000E53A00004A0050000A004000D4C34500E7
-:101A2000070000000445450007000000CD0000004D
-:101A30004449440007000000044545000700000039
-:101A40004D010000444955000700000044510400C6
-:101A500086E93400652C0000420000000A004800BE
-:101A600004D14C000700000044C1040086F3340098
-:101A70000700000007001600E52C000042000400EB
-:101A80000A004000204000004000000065290000DE
-:101A9000420000000A00400004410000866035005A
-:101AA000070000000224000006A23600025C0000CD
-:101AB000E5250000420000000A00400074420000DA
-:101AC000E52A0000420000000A00400074420000C5
-:101AD00012015000E5290000420000000A00400009
-:101AE000344200000441450007000000204000008F
-:101AF00040000000E53E0000200000004000000023
-:101B0000E52D0000520140000A005000445104003D
-:101B1000864A3600C5000000E53E00002040000077
-:101B200040000000E52B0000420000000A004000D9
-:101B30005442400007000000E52A00002040000059
-:101B400040000000320150003401040074560000CF
-:101B5000E5290000420002000A00420042000000A5
-:101B60000A0050007C410500E5280000420000000A
-:101B70000A004800C500000044C14C008610370030
-:101B8000E5260000E5270000420002004A00400070
-:101B90000A0050003C4200007C560000E52800008E
-:101BA0002048000040000000121D280012252800D7
-:101BB000721F000065290000420000000A0040007A
-:101BC0000441000086AA370007000E000700160037
-:101BD00007001E00E53E0000420000000A00400031
-:101BE0000441000086E83700652D00004200000037
-:101BF0000A34280065340000420002004A00420016
-:101C0000204000004A004A004A005000F4D205007B
-:101C100004D154005C7300008651380007000000B6
-:101C2000060600000700080007000C000700080077
-:101C300007000A00E5010000450002002040000006
-:101C4000600000006503000040000000652E0000F9
-:101C5000201A0000601A0A004000000065340000ED
-:101C6000420002004A004200204000004A004A00B0
-:101C7000060600004A0050000000000000000000BE
-:101C80000000000000000000000000000000000054
-:101C90000000000000000000000000000000000044
-:101CA0000000000000000000000000000000000034
-:101CB0000000000000000000000000000000000024
-:101CC0000000000000000000000000000000000014
-:101CD0000000000000000000000000000000000004
-:101CE00000000000000000000000000000000000F4
-:101CF00000000000000000000000000000000000E4
-:101D000000000000000000000000000000000000D3
-:101D100000000000000000000000000000000000C3
-:101D200000000000000000000000000000000000B3
-:101D300000000000000000000000000000000000A3
-:101D40000000000000000000000000000000000093
-:101D50000000000000000000000000000000000083
-:101D60000000000000000000000000000000000073
-:101D70000000000000000000000000000000000063
-:101D80000000000000000000000000000000000053
-:101D90000000000000000000000000000000000043
-:101DA0000000000000000000000000000000000033
-:101DB0000000000000000000000000000000000023
-:101DC0000000000000000000000000000000000013
-:101DD0000000000000000000000000000000000003
-:101DE00000000000000000000000000000000000F3
-:101DF00000000000000000000000000000000000E3
-:101E000000000000000000000000000000000000D2
-:101E100000000000000000000000000000000000C2
-:101E200000000000000000000000000000000000B2
-:101E300000000000000000000000000000000000A2
-:101E40000000000000000000000000000000000092
-:101E50000000000000000000000000000000000082
-:101E60000000000000000000000000000000000072
-:101E70000000000000000000000000000000000062
-:101E80000000000000000000000000000000000052
-:101E90000000000000000000000000000000000042
-:101EA0000000000000000000000000000000000032
-:101EB0000000000000000000000000000000000022
-:101EC0000000000000000000000000000000000012
-:101ED0000000000000000000000000000000000002
-:101EE00000000000000000000000000000000000F2
-:101EF00000000000000000000000000000000000E2
-:101F000000000000000000000000000000000000D1
-:101F100000000000000000000000000000000000C1
-:101F200000000000000000000000000000000000B1
-:101F300000000000000000000000000000000000A1
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F70000000000000000000000000000000000061
-:101F80000000000000000000000000000000000051
-:101F90000000000000000000000000000000000041
-:101FA0000000000000000000000000000000000031
-:101FB0000000000000000000000000000000000021
-:101FC0000000000000000000000000000000000011
-:101FD0000000000000000000000000000000000001
-:101FE00000000000000000000000000000000000F1
-:101FF00000000000000000000000000000000000E1
-:1020000000000000000000000000000000000000D0
-:1020100000000000000000000000000000000000C0
-:1020200000000000000000000000000000000000B0
-:1020300000000000000000000000000000000000A0
-:102040000000000000000000000000000000000090
-:102050000000000000000000000000000000000080
-:102060000000000000000000000000000000000070
-:102070000000000000000000000000000000000060
-:102080000000000000000000000000000000000050
-:102090000000000000000000000000000000000040
-:1020A0000000000000000000000000000000000030
-:1020B0000000000000000000000000000000000020
-:1020C0000000000000000000000000000000000010
-:1020D0000000000000000000000000000000000000
-:1020E00000000000000000000000000000000000F0
-:1020F00000000000000000000000000000000000E0
-:1021000000000000000000000000000000000000CF
-:1021100000000000000000000000000000000000BF
-:1021200000000000000000000000000000000000AF
-:10213000000000000000000000000000000000009F
-:10214000000000000000000000000000000000008F
-:10215000000000000000000000000000000000007F
-:10216000000000000000000000000000000000006F
-:10217000000000000000000000000000000000005F
-:10218000000000000000000000000000000000004F
-:10219000000000000000000000000000000000003F
-:1021A000000000000000000000000000000000002F
-:1021B000000000000000000000000000000000001F
-:1021C000000000000000000000000000000000000F
-:1021D00000000000000000000000000000000000FF
-:1021E00000000000000000000000000000000000EF
-:1021F00000000000000000000000000000000000DF
-:1022000000000000000000000000000000000000CE
-:1022100000000000000000000000000000000000BE
-:1022200000000000000000000000000000000000AE
-:10223000000000000000000000000000000000009E
-:10224000000000000000000000000000000000008E
-:10225000000000000000000000000000000000007E
-:10226000000000000000000000000000000000006E
-:10227000000000000000000000000000000000005E
-:10228000000000000000000000000000000000004E
-:10229000000000000000000000000000000000003E
-:1022A000000000000000000000000000000000002E
-:1022B000000000000000000000000000000000001E
-:1022C000000000000000000000000000000000000E
-:1022D00000000000000000000000000000000000FE
-:1022E00000000000000000000000000000000000EE
-:1022F00000000000000000000000000000000000DE
-:1023000000000000000000000000000000000000CD
-:1023100000000000000000000000000000000000BD
-:1023200000000000000000000000000000000000AD
-:10233000000000000000000000000000000000009D
-:10234000000000000000000000000000000000008D
-:10235000000000000000000000000000000000007D
-:10236000000000000000000000000000000000006D
-:10237000000000000000000000000000000000005D
-:10238000000000000000000000000000000000004D
-:10239000000000000000000000000000000000003D
-:1023A000000000000000000000000000000000002D
-:1023B000000000000000000000000000000000001D
-:1023C000000000000000000000000000000000000D
-:1023D00000000000000000000000000000000000FD
-:1023E00000000000000000000000000000000000ED
-:1023F00000000000000000000000000000000000DD
-:1024000000000000000000000000000000000000CC
-:1024100000000000000000000000000000000000BC
-:1024200000000000000000000000000000000000AC
-:10243000000000000000000000000000000000009C
-:10244000000000000000000000000000000000008C
-:10245000000000000000000000000000000000007C
-:10246000000000000000000000000000000000006C
-:10247000000000000000000000000000000000005C
-:10248000000000000000000000000000000000004C
-:10249000000000000000000000000000000000003C
-:1024A000000000000000000000000000000000002C
-:1024B000000000000000000000000000000000001C
-:1024C000000000000000000000000000000000000C
-:1024D00000000000000000000000000000000000FC
-:1024E00000000000000000000000000000000000EC
-:1024F00000000000000000000000000000000000DC
-:1025000000000000000000000000000000000000CB
-:1025100000000000000000000000000000000000BB
-:1025200000000000000000000000000000000000AB
-:10253000000000000000000000000000000000009B
-:10254000000000000000000000000000000000008B
-:10255000000000000000000000000000000000007B
-:10256000000000000000000000000000000000006B
-:10257000000000000000000000000000000000005B
-:10258000000000000000000000000000000000004B
-:10259000000000000000000000000000000000003B
-:1025A000000000000000000000000000000000002B
-:1025B000000000000000000000000000000000001B
-:1025C000000000000000000000000000000000000B
-:1025D00000000000000000000000000000000000FB
-:1025E00000000000000000000000000000000000EB
-:1025F00000000000000000000000000000000000DB
-:1026000000000000000000000000000000000000CA
-:1026100000000000000000000000000000000000BA
-:1026200000000000000000000000000000000000AA
-:10263000000000000000000000000000000000009A
-:10264000000000000000000000000000000000008A
-:10265000000000000000000000000000000000007A
-:10266000000000000000000000000000000000006A
-:10267000000000000000000000000000000000005A
-:10268000000000000000000000000000000000004A
-:10269000000000000000000000000000000000003A
-:1026A000000000000000000000000000000000002A
-:1026B000000000000000000000000000000000001A
-:1026C000000000000000000000000000000000000A
-:1026D00000000000000000000000000000000000FA
-:1026E00000000000000000000000000000000000EA
-:1026F00000000000000000000000000000000000DA
-:1027000000000000000000000000000000000000C9
-:1027100000000000000000000000000000000000B9
-:1027200000000000000000000000000000000000A9
-:102730000000000000000000000000000000000099
-:102740000000000000000000000000000000000089
-:102750000000000000000000000000000000000079
-:102760000000000000000000000000000000000069
-:102770000000000000000000000000000000000059
-:102780000000000000000000000000000000000049
-:102790000000000000000000000000000000000039
-:1027A0000000000000000000000000000000000029
-:1027B0000000000000000000000000000000000019
-:1027C0000000000000000000000000000000000009
-:1027D00000000000000000000000000000000000F9
-:1027E00000000000000000000000000000000000E9
-:1027F00000000000000000000000000000000000D9
-:1028000000000000000000000000000000000000C8
-:1028100000000000000000000000000000000000B8
-:1028200000000000000000000000000000000000A8
-:102830000000000000000000000000000000000098
-:102840000000000000000000000000000000000088
-:102850000000000000000000000000000000000078
-:102860000000000000000000000000000000000068
-:102870000000000000000000000000000000000058
-:102880000000000000000000000000000000000048
-:102890000000000000000000000000000000000038
-:1028A0000000000000000000000000000000000028
-:1028B0000000000000000000000000000000000018
-:1028C0000000000000000000000000000000000008
-:1028D00000000000000000000000000000000000F8
-:1028E00000000000000000000000000000000000E8
-:1028F00000000000000000000000000000000000D8
-:1029000000000000000000000000000000000000C7
-:1029100000000000000000000000000000000000B7
-:1029200000000000000000000000000000000000A7
-:102930000000000000000000000000000000000097
-:102940000000000000000000000000000000000087
-:102950000000000000000000000000000000000077
-:102960000000000000000000000000000000000067
-:102970000000000000000000000000000000000057
-:102980000000000000000000000000000000000047
-:102990000000000000000000000000000000000037
-:1029A0000000000000000000000000000000000027
-:1029B0000000000000000000000000000000000017
-:1029C0000000000000000000000000000000000007
-:1029D00000000000000000000000000000000000F7
-:1029E00000000000000000000000000000000000E7
-:1029F00000000000000000000000000000000000D7
-:102A000000000000000000000000000000000000C6
-:102A100000000000000000000000000000000000B6
-:102A200000000000000000000000000000000000A6
-:102A30000000000000000000000000000000000096
-:102A40000000000000000000000000000000000086
-:102A50000000000000000000000000000000000076
-:102A60000000000000000000000000000000000066
-:102A70000000000000000000000000000000000056
-:102A80000000000000000000000000000000000046
-:102A90000000000000000000000000000000000036
-:102AA0000000000000000000000000000000000026
-:102AB0000000000000000000000000000000000016
-:102AC0000000000000000000000000000000000006
-:102AD00000000000000000000000000000000000F6
-:102AE00000000000000000000000000000000000E6
-:102AF00000000000000000000000000000000000D6
-:102B000000000000000000000000000000000000C5
-:102B100000000000000000000000000000000000B5
-:102B200000000000000000000000000000000000A5
-:102B30000000000000000000000000000000000095
-:102B40000000000000000000000000000000000085
-:102B50000000000000000000000000000000000075
-:102B60000000000000000000000000000000000065
-:102B70000000000000000000000000000000000055
-:102B80000000000000000000000000000000000045
-:102B90000000000000000000000000000000000035
-:102BA0000000000000000000000000000000000025
-:102BB0000000000000000000000000000000000015
-:102BC0000000000000000000000000000000000005
-:102BD00000000000000000000000000000000000F5
-:102BE00000000000000000000000000000000000E5
-:102BF00000000000000000000000000000000000D5
-:102C000000000000000000000000000000000000C4
-:102C100000000000000000000000000000000000B4
-:102C200000000000000000000000000000000000A4
-:102C30000000000000000000000000000000000094
-:102C40000000000000000000000000000000000084
-:102C50000000000000000000000000000000000074
-:102C60000000000000000000000000000000000064
-:102C70000000000000000000000000000000000054
-:102C80000000000000000000000000000000000044
-:102C90000000000000000000000000000000000034
-:102CA0000000000000000000000000000000000024
-:102CB0000000000000000000000000000000000014
-:102CC0000000000000000000000000000000000004
-:102CD00000000000000000000000000000000000F4
-:102CE00000000000000000000000000000000000E4
-:102CF00000000000000000000000000000000000D4
-:102D000000000000000000000000000000000000C3
-:102D100000000000000000000000000000000000B3
-:102D200000000000000000000000000000000000A3
-:102D30000000000000000000000000000000000093
-:102D40000000000000000000000000000000000083
-:102D50000000000000000000000000000000000073
-:102D60000000000000000000000000000000000063
-:102D70000000000000000000000000000000000053
-:102D80000000000000000000000000000000000043
-:102D90000000000000000000000000000000000033
-:102DA0000000000000000000000000000000000023
-:102DB0000000000000000000000000000000000013
-:102DC0000000000000000000000000000000000003
-:102DD00000000000000000000000000000000000F3
-:102DE00000000000000000000000000000000000E3
-:102DF00000000000000000000000000000000000D3
-:102E000000000000000000000000000000000000C2
-:102E100000000000000000000000000000000000B2
-:102E200000000000000000000000000000000000A2
-:102E30000000000000000000000000000000000092
-:102E40000000000000000000000000000000000082
-:102E50000000000000000000000000000000000072
-:102E60000000000000000000000000000000000062
-:102E70000000000000000000000000000000000052
-:102E80000000000000000000000000000000000042
-:102E90000000000000000000000000000000000032
-:102EA0000000000000000000000000000000000022
-:102EB0000000000000000000000000000000000012
-:102EC0000000000000000000000000000000000002
-:102ED00000000000000000000000000000000000F2
-:102EE00000000000000000000000000000000000E2
-:102EF00000000000000000000000000000000000D2
-:102F000000000000000000000000000000000000C1
-:102F100000000000000000000000000000000000B1
-:102F200000000000000000000000000000000000A1
-:102F30000000000000000000000000000000000091
-:102F40000000000000000000000000000000000081
-:102F50000000000000000000000000000000000071
-:102F60000000000000000000000000000000000061
-:102F70000000000000000000000000000000000051
-:102F80000000000000000000000000000000000041
-:102F90000000000000000000000000000000000031
-:102FA0000000000000000000000000000000000021
-:102FB0000000000000000000000000000000000011
-:102FC0000000000000000000000000000000000001
-:102FD00000000000000000000000000000000000F1
-:102FE00000000000000000000000000000000000E1
-:102FF00000000000000000000000000000000000D1
-:00000001FF
diff --git a/firmware/yamaha/ds1_dsp.fw.ihex b/firmware/yamaha/ds1_dsp.fw.ihex
deleted file mode 100644
index acb0ba48f112..000000000000
--- a/firmware/yamaha/ds1_dsp.fw.ihex
+++ /dev/null
@@ -1,9 +0,0 @@
-:1000000081000000A40100000A0000002F00000091
-:1000100053020800170380017B4000003F8400006A
-:100020003C4801003C9401003CD805003C1C000009
-:100030007BC000003F0C05003C5021010000000087
-:1000400000000000000000000000000000000000B0
-:1000500000000000000000000000000000000000A0
-:100060000000000000000000000000000000000090
-:100070000000000000000000000000000000000080
-:00000001FF
diff --git a/firmware/yamaha/ds1e_ctrl.fw.ihex b/firmware/yamaha/ds1e_ctrl.fw.ihex
deleted file mode 100644
index 597f429ee31a..000000000000
--- a/firmware/yamaha/ds1e_ctrl.fw.ihex
+++ /dev/null
@@ -1,769 +0,0 @@
-:10000000070000000700240007000C0007001C0088
-:1000100007000600020070002000000040000300FE
-:100020000471000086420000400003000D0F000034
-:10003000100800003A042000820200000D020000B7
-:10004000100800003A04200082120000820E2000F6
-:100050000D800000100800003A042000821A000001
-:100060000D460300100800003A0410000DEC0200D9
-:10007000100800003A0418000D01000015000200ED
-:10008000FD00000020000000608803006090030075
-:100090006080030040800300408003004080030034
-:1000A000408001007D0A0000408003004080030082
-:1000B0004080010002042000820800001A000800AD
-:1000C00004090000867101000700000007002600F7
-:1000D00007004000070000008D2503001008000005
-:1000E0003A04180007002600024428007D0800009A
-:1000F000428001000A16000006A205000700000069
-:10010000070044000D230000100800003A04080016
-:1001100006FA220007000000FD07000042800100EF
-:100120000A0008000409000086AB020095010000E7
-:10013000040D09000700000020080000F500000081
-:100140007D0B000060F00100FD000000063A030096
-:10015000408001007D0A0000428003004A801300B5
-:100160000A00180020180000609005006088050053
-:1001700040800100FD000000428001000A00700084
-:100180001501000044110700863B03000000030036
-:100190002070000006620300408001000D36000060
-:1001A000100800003A04080006222300070000009F
-:1001B0000DEC0200100800003A041800069A010035
-:1001C00007000000070024008D0F00001008000049
-:1001D0003A16000002240000025C0000FD28000026
-:1001E00020000000408001000D00080015080000FC
-:1001F00084095100070000004D0000005D0E000062
-:10020000020E00000D430000100800003A04080030
-:1002100006122E00070000008D00000024090000D7
-:10022000020F00000D470000100800003A0408000B
-:1002300006122E0007000000800448001012000083
-:100240003A0428008D770000100800003A0C2800BE
-:100250008D060000100800003A142800024428000F
-:100260008D250300100800003A0418008DFF0700D8
-:1002700020080000FD020000408001000700260069
-:1002800007002000FD020000428001000A00080073
-:100290000409000086120500070000000700240082
-:1002A0000DEC0200100800003A0418007D38000030
-:1002B000428001000A0008001510000084090100B6
-:1002C000869B01000700000006B201000700000045
-:1002D000FD080000428001000A0018000419000017
-:1002E00086B8220007002800101800003A042800F1
-:1002F000020C28000D000000100800003A1428002D
-:100300008D80080020080000FD02000040800100F0
-:10031000070020000D0200000499180007000000EB
-:100320002D400000BD000000FD02000042800100E1
-:100330000A00080004090000865A060007000000B1
-:1003400000010000200A00007D0400004080010040
-:10035000428001000A002000153000004421010005
-:10036000866103000700000004210000866103008D
-:10037000070000008D0F0000100800003A0C280054
-:100380004439020086C90700070000001018000069
-:100390003A0428000D81080020080000FD0200003A
-:1003A0004080010007002000102800003A0078007B
-:1003B0008D780000100800003A04080006122A0098
-:1003C000070000000D4000001510000004991800FF
-:1003D000042929000439390007000000060207003B
-:1003E00007000000F50400007D0000002000000070
-:1003F0008D00000060080100408001007D040000C5
-:10040000428003004A8021000A00180044190200BB
-:1004100086902200070000007540000004F1710082
-:1004200007000000420001000A0028000429000023
-:1004300086582200070000000D3C000004A930008F
-:10044000070000007D070000428001000A0008004C
-:100450000409000086DA08007D050000202800005D
-:1004600060B0030006F20800408001002030000068
-:1004700060A8030040800100FD02000042800100EE
-:100480000A0008000409000086FA080007000000BE
-:100490007D050000428001000A0428008D0E000046
-:1004A000100800003A0C28000D00000010080000A1
-:1004B0003A1428000D00090020080000FD02000089
-:1004C0004080010007002000FD3D000020000000EA
-:1004D000408001007D1000008D9D0000100800008C
-:1004E0003A04080006122A00070000001508000060
-:1004F0001A0008008409010086510A007D130000DB
-:1005000000052000200F2800608F3300608F3B0023
-:10051000608F4300608F4B00608F5300608F5B00E3
-:10052000608A0300408001007D10000042800100CD
-:100530000A000800150200008409010086813A00C3
-:1005400007000000BD7F0000C43D38000700000028
-:100550007D1A000075130000428001004A00090066
-:100560000A001000048D0B00049513000700000022
-:10057000200800006090010004110000865822004D
-:1005800040000100FD170000428001000A00080041
-:1005900004090000865A2200070000007D190000AF
-:1005A000428003004A8009000A001000240900006C
-:1005B00064160000FD110000428003004A802B00F9
-:1005C0004A8019008D0000004489210007000000C6
-:1005D0004422000086190C0007000000641A000085
-:1005E000242A00007D1900000201080022011000E9
-:1005F000200800006090030040800100FD3D0000E5
-:100600008D000000200800004080010075130000EC
-:100610007D1A0000420001004A8009000A00100013
-:100620001D020000E4890100E49229004491300099
-:10063000070000000D060000150A00001D0C000058
-:1006400025100000E4A90000E42B01006404000070
-:10065000E4B30100E432020064040000640400001A
-:1006600064040000640400000D040000C4B108002C
-:100670000700000020080000F50B00004000030008
-:100680007D190000428003004A800900240A00000E
-:100690000A000800640E0800070000002201100094
-:1006A000200800006010030040000100AC6400005E
-:1006B0007D02000020000000408001007D1000004D
-:1006C00042800100FD1100004A803B004A80090081
-:1006D0000A0020009500000044111A0044A1000007
-:1006E00086580E000D04000084B9000086590E00E3
-:1006F000FD18000042800100FD1000004A80090042
-:100700000A0028009500000024090100642A000066
-:1007100086490E000700000004290000865A0E00DA
-:100720000700000006620E00020008008D000000B5
-:100730007D38000020080000408001007D1200008C
-:10074000428001000A0010000439000086090F00F1
-:100750000D080000B5FF7F0084B9000086D90E00A7
-:100760002500000006B20F002D000000150000005B
-:100770002D0800000DE002002008000006FA0F001E
-:100780000D00000035807F0084B9000086A90F00AD
-:10079000250040008D000000440911000700000002
-:1007A0008D01000004951000070000006491000016
-:1007B00024040000240400002404000002011000AE
-:1007C000020028000DDF02002008000006FA0F00DA
-:1007D0008D0100002D0400008D0000000495100024
-:1007E000070000000D0200008491100007000000C7
-:1007F0008DDF0200200800008D000000FD380000A1
-:1008000040800100FD3B00002010000060A80300B4
-:100810001508000084313100842121000700000008
-:1008200060B0030060A0030040800100FD220000D2
-:1008300095000000240901002404000024040000A5
-:100840006412000002011000200800006090030004
-:1008500040800100241900000D0F01007D390000C7
-:100860002008000040800500428003004A840900FF
-:10087000060600000A040800240400002404000006
-:100880007D110000428001000A000800240A0000D7
-:1008900002052800020C28000D8009002008000035
-:1008A000FD0200004080010007002000FD22000042
-:1008B000428001000A00080095000000C40D2800D5
-:1008C000241901007D19000042800100FD11000083
-:1008D0004A8009000A001000B500000044311100F0
-:1008E000048D0A0007000000440A08000495120065
-:1008F00007000000FD2300002010000040800300DE
-:10090000441210000700000020080000609003005F
-:1009100040800100FD020000428001000A00080042
-:10092000040900008632120007000000FD3B0000B1
-:1009300000010000100A00007A800B004A801300BA
-:10094000840909000700000095000000043D010033
-:1009500086B812000A001000020010008409090085
-:1009600007000000428003004A801100040D0900C6
-:10097000070000000A001000840D090007000000B5
-:100980007D25000020080000408001000D010000CE
-:10099000100800003A1428007D1200004280010077
-:1009A0000A0020007D190000428001007D11000036
-:1009B0004A8031000A001000243100008D3B010004
-:1009C0007D390000200800004080050042800300BF
-:1009D0004A840900060600000A04080002013000EB
-:1009E000243100002404000024040000241200002C
-:1009F000020528004C1A000086391400020070001D
-:100A00002D000000000003007D380000428001003E
-:100A10000A0010000662140024210000AD0000004E
-:100A2000020010000D01000024090000246B0000EA
-:100A30000D4A01007D3900002008000040800500BB
-:100A4000428003004A840900060600000A040800E8
-:100A5000643200008D000000240A00002010000015
-:100A60007D220000408001008D4F01001008000031
-:100A70003A040800065A2B00070000002028000056
-:100A80007D200000408001007D11000042800300B5
-:100A90004A8013000A8033007D3800004280010044
-:100AA0000A00080004090000867217000700000011
-:100AB0008D000000640903000D5B01007D3900001A
-:100AC0002008000040800500428003004A8409009D
-:100AD000060600000A040800020138002404000091
-:100AE0002404000024120000FD02000042800100E6
-:100AF0000A0008000409000086DA1500070000005B
-:100B0000020528004C1A000086711700070000003B
-:100B1000642103002C630000FD3D000042800100C1
-:100B20000A00080095000000040909000700000001
-:100B3000200800004C1A0000869916004080010031
-:100B40000000030006B21600242100000D01000081
-:100B500024090000246B00000D6F01007D390000A6
-:100B60002008000040800500428003004A840900FC
-:100B7000060600000A040800643A00009500000020
-:100B800024120000FD020000428001000A0008005B
-:100B90000409000086121700070000000D7601000E
-:100BA000100800003A040800065A2B000700000055
-:100BB000060A160007000000207000000A01080065
-:100BC0002A011000FD2000006088030060900300EF
-:100BD000408001007D22000042800100FD3D0000B8
-:100BE0000A0008004A843100040900008610180039
-:100BF0008B0018008D000000049918002C310000B3
-:100C000006E21800070000004C320000866B180056
-:100C100007000000041900008668180007000000A3
-:100C200095000000449119002C220000243100009E
-:100C30006C6300003D0E000075130000FD0B00000A
-:100C4000420001004A8009000A001000EC8A0300FB
-:100C5000EC9303004C22000086E11800070000001E
-:100C60008D000000049918006C2200002C32000056
-:100C70000A053000AB1D300083200000FD18000085
-:100C8000428001000A0008002489010002053000AA
-:100C90008310000075180000420001000A001000D7
-:100CA0008D00000024090100751300004205330087
-:100CB000CB0C3300CB2C3300CB343300CB3C330094
-:100CC000CB443300CB4C3300CB5433008B5C30002F
-:100CD00083600000F5020000420001000A000800E5
-:100CE0000409000086B21900070000002D1E000054
-:100CF000FD050000428001000A000800248902006E
-:100D0000020528000D060000100800003A0C28001B
-:100D10008D000000100800003A1428008D800A00A1
-:100D200020080000F502000040000100070022003A
-:100D300075120000420003004A0021008D000000EF
-:100D400044091A00070000008DAB010010080000E4
-:100D50003A04080006AA2C0007000000F501000074
-:100D6000420003004A000D000A00100044910800F0
-:100D7000070000002008000040000100F5250000E9
-:100D800044310A000700000020080000602803002A
-:100D9000400003007D210000428003004A800B00D8
-:100DA0000A0010002008000060100300400003004B
-:100DB0008D000000240100002C010000640E0000E2
-:100DC000641A00006C6300000A0108002A01100088
-:100DD000200800006010030040000300FD20000018
-:100DE000428001000A0008007D22000042800100CC
-:100DF0000A001000200800006010030040000300FB
-:100E00007D190000428001000A000800FD22000058
-:100E1000428003000A001000200800006010030058
-:100E200040000300040D0900070000002008000036
-:100E300040000300428003004A800B000A001000BB
-:100E400020080000601003004000030042800300FF
-:100E50004A8013004A801900040D1100048D190006
-:100E6000070000000A0008002010000060180300BE
-:100E700060080300400003008D00000044090B00DF
-:100E8000070000002008000040000100F5050000F8
-:100E9000420003000A000800200800004000010092
-:100EA000F5000000420001000A00080004090000EB
-:100EB00086981D00751E0000420003004A040100D0
-:100EC0000A0C000006AA1D00070000000204000032
-:100ED000020C00007D170000F51A0000428001009E
-:100EE0004A1403004A1C03004A2403004A2C03004E
-:100EF0004A3403004A3C03004A4403000A4C000001
-:100F00003D040000F5130000FD1A0000420003003C
-:100F10004A000B004A801B004A8013000A00200090
-:100F20004491080044A11900E4890300EC990300EE
-:100F3000025500000A5D0000420003004A000B0059
-:100F40004A801B004A8013000A00200044910800D8
-:100F500044A11900E4890300EC9903000265000034
-:100F60000A6D0000420003004A000B004A0019000D
-:100F70004A802B004A8013004A8021000A0030007A
-:100F80004491080044A1190044B12A00E4890300F7
-:100F9000EC990300027500000A7D0000E4A903003B
-:100FA000020700007D1000001504000042800100CF
-:100FB0000A000800E4090100020F0000F52A000001
-:100FC000FD190000420001004A8009000A001000DB
-:100FD0003409000074160000F529000042000100E9
-:100FE0000A0010007C910000752000004200010002
-:100FF0000A00080004090000860A2000F526000007
-:10100000F5270000420003004A0009000A00100012
-:101010003C0A00007C160000751A0000FD0B000061
-:10102000420001004A8051000A00480007001600F3
-:1010300075100000420001000A2C2800121D280033
-:1010400012252800321F000007001E0007000E00B6
-:101050007519000042000100F52D00004A000D0046
-:101060000A0010004491000086EA200042000100BE
-:101070000A3428005D0E00008D000000750300009A
-:101080002008000040000100F4D2050004D1540003
-:101090005C730000868B21000700000007000C0035
-:1010A0000700080007000A008D1702001008000062
-:1010B0003A04080006B2340007000000069221003E
-:1010C0000700000007000800752200004200010030
-:1010D0000A00200004210000865822002D1E000076
-:1010E000F5020000420001000A00080004090000A7
-:1010F00086CA210007000000102000003A043000DA
-:101100007D050000C38001000A0008002489020058
-:1011100002052800020C28000D810A0020080000AA
-:10112000F50200004000010007002200FD0400005D
-:10113000428001000A0070000000030020700000DF
-:1011400006FA0700408001008D2B02001008000005
-:101150003A04080006AA2C0007000000FD02000067
-:10116000428001000A0008000409000086C2220033
-:1011700007000000060202000700000075080000DA
-:10118000FD0900000D010000064223009502000049
-:10119000750B00007D0900000D0000001505000022
-:1011A000420001000A0018000419000086002A000D
-:1011B000F50600002010000040000100F5040000CA
-:1011C00020080000400001007507000042000100F7
-:1011D0004A8009000A0010002411000004090000E0
-:1011E00086F2230015080000020108000412100016
-:1011F0000612240075050000041208000700000014
-:1012000002011000750500002504000024110200F1
-:1012100002011000200800006010030040000100DF
-:101220002419000086002A008D00000064040000DC
-:10123000049D0000861029000201180075050000B9
-:10124000420001000A0428008D010000240900006A
-:10125000020D28000D0000002409000002152800DE
-:101260000D00100020080000F50200004000010001
-:101270000700200075110000FD02000042800100FF
-:101280000A0008000409000086FA24000700000094
-:1012900000010000200B0800600B1300600B1B0016
-:1012A000600A030040000100420005004A003D00C2
-:1012B0004A0035004A002D000A002000F506000013
-:1012C000420001000A142800F50400004200010059
-:1012D0000A00080015030000040D01008602260024
-:1012E0001540000095000000040D010086F0250067
-:1012F000220010002A001000061A26000700000035
-:101300000431330004A92A0007000000242103004F
-:1013100002052800024428002411000002014000B8
-:101320002404000024040000243200002C290000C2
-:101330006C630000867327000700000064B10200A0
-:1013400064040000640400008D000000640A0000D2
-:10135000020D28008D00100020080000F50200009A
-:1013600040000100070022008D00000004B9380091
-:10137000070000006C2903000A013000F50200009C
-:10138000420001000A00080004090000860227004C
-:10139000070000002C2100000A0528006C31000025
-:1013A0006C0400006C0400000A45280024110000B1
-:1013B000646B0000020110008D0000006C09010048
-:1013C0000A0D28000D01100020080000F5020000A1
-:1013D0004000010007002200244100002404000016
-:1013E00024040000243200000201300044290300DC
-:1013F00086FA27000700000002003000F504000014
-:10140000420001000A00080015030000040D01005D
-:1014100086402800243100006404000002013000EE
-:10142000F5020000420001000A0008000409000063
-:10143000864A2800070000000244280024310000EA
-:1014400002053000243900008305300083080000C5
-:10145000F5050000420001000A0428008D0000008C
-:1014600024810000020D28008D000000248100006E
-:10147000021528008D01100020080000F502000070
-:101480004000010007002200251000007505000043
-:10149000420003004A0009000A00100004090A0083
-:1014A0000411120007000000201000006008050071
-:1014B00040000500FD060000428001004A000900CE
-:1014C0000A001000A500000004090A00041112001F
-:1014D00007000000200800006090010040000100AB
-:1014E000F5020000420001000A00080004090000A3
-:1014F00086CA2900070000000642240007000000F9
-:101500000606000007000000F5020000420001008E
-:101510000A00080004090000861A2A0007000000DB
-:1015200000010000200B0800608B1300608B1B0083
-:10153000608B2300608B2B00608B3300608B3B0043
-:10154000608B4300608B4B00608B5300608B5B00B3
-:10155000608B6300608B6B00608B7300608B7B0023
-:10156000608F0300608F0B00608F1300608F1B0083
-:10157000608F2300608F2B00608F3300608F3B00F3
-:10158000608F4300608F4B00608F5300608F5B0063
-:10159000608F6300608F6B00608F7300608F7B00D3
-:1015A000608A030006060000408001008D000000F4
-:1015B000640A0000020D2800240A00007D020000D9
-:1015C000428001000A00100024120000FD03000008
-:1015D000428001000A00080004090000860A2C006D
-:1015E000070000008D010000240A000064040000D0
-:1015F0006404000002010800240900002404000023
-:1016000024040000020110000D00020044910000BB
-:1016100086612C0007000000FD01000042800100EF
-:101620000A000800440A000086432C0042800100A2
-:101630000D000A0020080000FD02000040800100AB
-:10164000070020007D0200002010000006060000B8
-:1016500040800100F5020000420001000A0008007D
-:101660000409000086B22C00070000007D03000082
-:10167000428001000A0008000409000086E22C00F4
-:1016800007000000750000007D2E000042000100F0
-:101690004A800B00200000000409000086060000BC
-:1016A000400001004A8431008B04300083080000B0
-:1016B0008D000000100800003A1428008D00000082
-:1016C000100800003A0C28007506000042000100D6
-:1016D0000A0008001538000024090100020528004E
-:1016E0000D000B0020080000F50200004000010082
-:1016F00006060000070022006404000064040000E5
-:101700000606000007000000340100008D7F000085
-:101710003C090000121D280012252800321F00007D
-:1017200007000E000D0100007D03000020080000EE
-:1017300040800100F4D20500070000000700080007
-:101740007D030000428001000A0008000409000037
-:10175000868A2E0007000000060600000700000031
-:101760000700000012000000070010000700320010
-:101770000700600007004600800010001A004800C3
-:101780000449000086F12E0007000000101200003E
-:101790003A00580045010000045D5C0007000000AD
-:1017A000800000001A0048000449000086412F0014
-:1017B00007000000101200003A0050000459000019
-:1017C00086982F0045000000C5000000F5FF7F004F
-:1017D0007DFF7F0024D50700244200000201500055
-:1017E00002052000820000001A00400004410000B1
-:1017F00086C92F0007000000653800001A0040006D
-:10180000204000004D10000084C1040086AB310070
-:1018100040000000070004006501000045010000D1
-:101820002040000040000000650700008000080024
-:101830001A004000044100008659300007000000F3
-:10184000101200003A0040000441000086B230004F
-:101850004D000000CD000000104800003A042000B8
-:10186000820800001A0040000441000086C13000D8
-:10187000070000002048000004590000869831004D
-:1018800040000000E507000080042000A0162800AA
-:10189000E0163200E0163A00E01642006012020044
-:1018A0004000000032000000750040007D00000094
-:1018B00074D5070012052000820000001A004000C5
-:1018C000044100008671310007000000068A030011
-:1018D00007006400E5000000200000004000000058
-:1018E000650A0000200000004000020040000200E5
-:1018F0004000000065010000420000000A00700086
-:101900000471000086323200070000000700060064
-:10191000069A010007006400000005002070000026
-:1019200040000000068A0300070064000700000072
-:101930006D30000060880200609002000A0008001C
-:101940006088020040800000120010000D100000AE
-:101950008491000086D132000D0E000084910000B9
-:1019600086E133000700000007003000201000006F
-:101970006D3B000040800000800000001A0008005D
-:101980000409000086F13200070000002012000068
-:10199000ED0D000040800000428000000A001000B1
-:1019A0000D004000449510000700000020100000CA
-:1019B000ED0D000040800000428000000A0420007D
-:1019C000820000001A00080004090000868133002C
-:1019D000070000006D3B0000428000000A00080084
-:1019E000150E000084090100862B340007006000FA
-:1019F0001A000800150C0000840901008613340049
-:101A00002000000007001A00ED02000040800000E6
-:101A1000070062006D300000428002004A800A0028
-:101A2000200800004A800A00060600004A801000D4
-:101A30000700000012252800321F0000F4D2050024
-:101A400004D154005C73000086070000070000000A
-:101A500007000C0007000A0007001C0065340000A6
-:101A60004000020020480000605002000A004000D0
-:101A700060400200400000004449450007000000AB
-:101A800020400000E53A000040000000E52800008A
-:101A9000420000000A0048000449000086F83900AE
-:101AA000652C0000420000000A004000D500000044
-:101AB00004414500070000005506000004450500EC
-:101AC00086823600D5010000044505008680360078
-:101AD000652B000042000000E53A00004A0050007B
-:101AE0000A004000D4C3450007000000044545003B
-:101AF00007000000CD00000044494400070000003A
-:101B000004454500070000004D0100004449550010
-:101B1000070000004451040086793600652C00005F
-:101B2000420000000A00480004D14C0007000000F9
-:101B300044C1040086833600070000000700160039
-:101B4000E52C0000420004000A0040002040000094
-:101B50004000000065290000420000000A0040002B
-:101B60000441000086F03600070000000224000057
-:101B700006323800025C0000E5250000420000004B
-:101B80000A00400074420000E52A00004200000004
-:101B90000A0040007442000012015000E5290000D4
-:101BA000420000000A0040003442000004414500A9
-:101BB000070000002040000040000000E53E00005B
-:101BC0002000000040000000E52D00005201400010
-:101BD0000A0050004451040086DA3700C5000000B6
-:101BE000E53E00002040000040000000E52B000022
-:101BF000420000000A00400054424000070000007C
-:101C0000E52A0000204000004000000032015000A2
-:101C10003401040074560000E5290000420002006F
-:101C20000A004200420000000A0050007C4105000A
-:101C3000E5280000420000000A004800C50000003E
-:101C400044C14C0086A03800E5260000E5270000CE
-:101C5000420002004A0040000A0050003C420000DE
-:101C60007C560000E52800002048000040000000ED
-:101C7000121D280012252800721F0000652900008F
-:101C8000420000000A00400004410000863A39008A
-:101C900007000E000700160007001E00E53E0000CA
-:101CA000420000000A00400004410000867839002C
-:101CB000652D0000420000000A3428006534000051
-:101CC000420002004A004200204000004A004A0050
-:101CD0004A005000F4D2050004D154005C730000A7
-:101CE00086E1390007000000060600000700080032
-:101CF00007000C000700080007000A00E5010000CB
-:101D00004500020020400000600000006503000064
-:101D100040000000652E0000201A0000601A0A0032
-:101D20004000000065340000420002004A0042000A
-:101D3000204000004A004A00060600004A00500009
-:101D4000FD170000428001000A000800040900009D
-:101D5000865A2200070000007D100000428001002A
-:101D6000FD1100004A8033004A8019000A0020005B
-:101D70009500000044112A0044A1010086903B0018
-:101D80000D04000084B1000086913B00FD180000A6
-:101D900042800100FD1000004A8009000A0038005E
-:101DA0009500000024090100643A000086813B0090
-:101DB000070000000439000086923B000700000085
-:101DC000069A3B000D0000008D0000002008000076
-:101DD0007D38000040800100020070007D1100008D
-:101DE000428001007D1900004A8029000A0030006D
-:101DF0000200380024310000240400002404000004
-:101E0000242A0000020528008D06000010080000AA
-:101E10003A1428000D75000024B10000642200006F
-:101E200086033D0002442800100800003A0C2800F8
-:101E30000D800B0020080000FD0200004080010022
-:101E4000070020008D75000024B100000201100081
-:101E50004421010086493E00101800003A0010009D
-:101E60007D380000428001000A00080004090000DB
-:101E700086483E0000000300064A3E00BD00000008
-:101E80008D00000064310200640A0000020D280089
-:101E90008D800B0020080000FD0200004080010042
-:101EA000070020007D380000428001000A00080081
-:101EB0000409000086323E0000000300FD0200001D
-:101EC000428001000A0008000409000086823D00EB
-:101ED00007000000102800003A0428000D750000DB
-:101EE0002409030064220000020D28006C31020066
-:101EF0000A4528000D810B0020080000FD020000AB
-:101F000040800100070020008D000000240A00002E
-:101F1000064A3E0002011000101800003A001000AE
-:101F2000BD000000103800003A0430007D180000A9
-:101F300042800100FD1800004A8009000A002000CC
-:101F4000AD000000248902002C21070010100000C1
-:101F5000830530008B0D3000BB143000831C300033
-:101F6000832000007D130000428003004A84330078
-:101F7000CBAC3300CBB43300CBBC3300CBC4330089
-:101F8000CBCC3300CBD433008B5C300083600000BB
-:101F90000D1E0000FD050000428001000A00200027
-:101FA000240902008D0600006CA900009D000000BD
-:101FB000FD020000428001000A0008000409000040
-:101FC000866A3F0007000000020528000A0D28006D
-:101FD00002442800101800003A1428008D000C005C
-:101FE00020080000FD0200004080010007002200E0
-:101FF00004390000865822000D1E00007D050000F7
-:10200000428001000A00200024090200A50000000F
-:10201000FD020000428001000A00080004090000DF
-:10202000862A40000700000002052800020C280054
-:10203000102000003A1428000D010C0020080000B8
-:10204000FD02000040800100065A22000700220025
-:102050000000000000000000000000000000000080
-:102060000000000000000000000000000000000070
-:102070000000000000000000000000000000000060
-:102080000000000000000000000000000000000050
-:102090000000000000000000000000000000000040
-:1020A0000000000000000000000000000000000030
-:1020B0000000000000000000000000000000000020
-:1020C0000000000000000000000000000000000010
-:1020D0000000000000000000000000000000000000
-:1020E00000000000000000000000000000000000F0
-:1020F00000000000000000000000000000000000E0
-:1021000000000000000000000000000000000000CF
-:1021100000000000000000000000000000000000BF
-:1021200000000000000000000000000000000000AF
-:10213000000000000000000000000000000000009F
-:10214000000000000000000000000000000000008F
-:10215000000000000000000000000000000000007F
-:10216000000000000000000000000000000000006F
-:10217000000000000000000000000000000000005F
-:10218000000000000000000000000000000000004F
-:10219000000000000000000000000000000000003F
-:1021A000000000000000000000000000000000002F
-:1021B000000000000000000000000000000000001F
-:1021C000000000000000000000000000000000000F
-:1021D00000000000000000000000000000000000FF
-:1021E00000000000000000000000000000000000EF
-:1021F00000000000000000000000000000000000DF
-:1022000000000000000000000000000000000000CE
-:1022100000000000000000000000000000000000BE
-:1022200000000000000000000000000000000000AE
-:10223000000000000000000000000000000000009E
-:10224000000000000000000000000000000000008E
-:10225000000000000000000000000000000000007E
-:10226000000000000000000000000000000000006E
-:10227000000000000000000000000000000000005E
-:10228000000000000000000000000000000000004E
-:10229000000000000000000000000000000000003E
-:1022A000000000000000000000000000000000002E
-:1022B000000000000000000000000000000000001E
-:1022C000000000000000000000000000000000000E
-:1022D00000000000000000000000000000000000FE
-:1022E00000000000000000000000000000000000EE
-:1022F00000000000000000000000000000000000DE
-:1023000000000000000000000000000000000000CD
-:1023100000000000000000000000000000000000BD
-:1023200000000000000000000000000000000000AD
-:10233000000000000000000000000000000000009D
-:10234000000000000000000000000000000000008D
-:10235000000000000000000000000000000000007D
-:10236000000000000000000000000000000000006D
-:10237000000000000000000000000000000000005D
-:10238000000000000000000000000000000000004D
-:10239000000000000000000000000000000000003D
-:1023A000000000000000000000000000000000002D
-:1023B000000000000000000000000000000000001D
-:1023C000000000000000000000000000000000000D
-:1023D00000000000000000000000000000000000FD
-:1023E00000000000000000000000000000000000ED
-:1023F00000000000000000000000000000000000DD
-:1024000000000000000000000000000000000000CC
-:1024100000000000000000000000000000000000BC
-:1024200000000000000000000000000000000000AC
-:10243000000000000000000000000000000000009C
-:10244000000000000000000000000000000000008C
-:10245000000000000000000000000000000000007C
-:10246000000000000000000000000000000000006C
-:10247000000000000000000000000000000000005C
-:10248000000000000000000000000000000000004C
-:10249000000000000000000000000000000000003C
-:1024A000000000000000000000000000000000002C
-:1024B000000000000000000000000000000000001C
-:1024C000000000000000000000000000000000000C
-:1024D00000000000000000000000000000000000FC
-:1024E00000000000000000000000000000000000EC
-:1024F00000000000000000000000000000000000DC
-:1025000000000000000000000000000000000000CB
-:1025100000000000000000000000000000000000BB
-:1025200000000000000000000000000000000000AB
-:10253000000000000000000000000000000000009B
-:10254000000000000000000000000000000000008B
-:10255000000000000000000000000000000000007B
-:10256000000000000000000000000000000000006B
-:10257000000000000000000000000000000000005B
-:10258000000000000000000000000000000000004B
-:10259000000000000000000000000000000000003B
-:1025A000000000000000000000000000000000002B
-:1025B000000000000000000000000000000000001B
-:1025C000000000000000000000000000000000000B
-:1025D00000000000000000000000000000000000FB
-:1025E00000000000000000000000000000000000EB
-:1025F00000000000000000000000000000000000DB
-:1026000000000000000000000000000000000000CA
-:1026100000000000000000000000000000000000BA
-:1026200000000000000000000000000000000000AA
-:10263000000000000000000000000000000000009A
-:10264000000000000000000000000000000000008A
-:10265000000000000000000000000000000000007A
-:10266000000000000000000000000000000000006A
-:10267000000000000000000000000000000000005A
-:10268000000000000000000000000000000000004A
-:10269000000000000000000000000000000000003A
-:1026A000000000000000000000000000000000002A
-:1026B000000000000000000000000000000000001A
-:1026C000000000000000000000000000000000000A
-:1026D00000000000000000000000000000000000FA
-:1026E00000000000000000000000000000000000EA
-:1026F00000000000000000000000000000000000DA
-:1027000000000000000000000000000000000000C9
-:1027100000000000000000000000000000000000B9
-:1027200000000000000000000000000000000000A9
-:102730000000000000000000000000000000000099
-:102740000000000000000000000000000000000089
-:102750000000000000000000000000000000000079
-:102760000000000000000000000000000000000069
-:102770000000000000000000000000000000000059
-:102780000000000000000000000000000000000049
-:102790000000000000000000000000000000000039
-:1027A0000000000000000000000000000000000029
-:1027B0000000000000000000000000000000000019
-:1027C0000000000000000000000000000000000009
-:1027D00000000000000000000000000000000000F9
-:1027E00000000000000000000000000000000000E9
-:1027F00000000000000000000000000000000000D9
-:1028000000000000000000000000000000000000C8
-:1028100000000000000000000000000000000000B8
-:1028200000000000000000000000000000000000A8
-:102830000000000000000000000000000000000098
-:102840000000000000000000000000000000000088
-:102850000000000000000000000000000000000078
-:102860000000000000000000000000000000000068
-:102870000000000000000000000000000000000058
-:102880000000000000000000000000000000000048
-:102890000000000000000000000000000000000038
-:1028A0000000000000000000000000000000000028
-:1028B0000000000000000000000000000000000018
-:1028C0000000000000000000000000000000000008
-:1028D00000000000000000000000000000000000F8
-:1028E00000000000000000000000000000000000E8
-:1028F00000000000000000000000000000000000D8
-:1029000000000000000000000000000000000000C7
-:1029100000000000000000000000000000000000B7
-:1029200000000000000000000000000000000000A7
-:102930000000000000000000000000000000000097
-:102940000000000000000000000000000000000087
-:102950000000000000000000000000000000000077
-:102960000000000000000000000000000000000067
-:102970000000000000000000000000000000000057
-:102980000000000000000000000000000000000047
-:102990000000000000000000000000000000000037
-:1029A0000000000000000000000000000000000027
-:1029B0000000000000000000000000000000000017
-:1029C0000000000000000000000000000000000007
-:1029D00000000000000000000000000000000000F7
-:1029E00000000000000000000000000000000000E7
-:1029F00000000000000000000000000000000000D7
-:102A000000000000000000000000000000000000C6
-:102A100000000000000000000000000000000000B6
-:102A200000000000000000000000000000000000A6
-:102A30000000000000000000000000000000000096
-:102A40000000000000000000000000000000000086
-:102A50000000000000000000000000000000000076
-:102A60000000000000000000000000000000000066
-:102A70000000000000000000000000000000000056
-:102A80000000000000000000000000000000000046
-:102A90000000000000000000000000000000000036
-:102AA0000000000000000000000000000000000026
-:102AB0000000000000000000000000000000000016
-:102AC0000000000000000000000000000000000006
-:102AD00000000000000000000000000000000000F6
-:102AE00000000000000000000000000000000000E6
-:102AF00000000000000000000000000000000000D6
-:102B000000000000000000000000000000000000C5
-:102B100000000000000000000000000000000000B5
-:102B200000000000000000000000000000000000A5
-:102B30000000000000000000000000000000000095
-:102B40000000000000000000000000000000000085
-:102B50000000000000000000000000000000000075
-:102B60000000000000000000000000000000000065
-:102B70000000000000000000000000000000000055
-:102B80000000000000000000000000000000000045
-:102B90000000000000000000000000000000000035
-:102BA0000000000000000000000000000000000025
-:102BB0000000000000000000000000000000000015
-:102BC0000000000000000000000000000000000005
-:102BD00000000000000000000000000000000000F5
-:102BE00000000000000000000000000000000000E5
-:102BF00000000000000000000000000000000000D5
-:102C000000000000000000000000000000000000C4
-:102C100000000000000000000000000000000000B4
-:102C200000000000000000000000000000000000A4
-:102C30000000000000000000000000000000000094
-:102C40000000000000000000000000000000000084
-:102C50000000000000000000000000000000000074
-:102C60000000000000000000000000000000000064
-:102C70000000000000000000000000000000000054
-:102C80000000000000000000000000000000000044
-:102C90000000000000000000000000000000000034
-:102CA0000000000000000000000000000000000024
-:102CB0000000000000000000000000000000000014
-:102CC0000000000000000000000000000000000004
-:102CD00000000000000000000000000000000000F4
-:102CE00000000000000000000000000000000000E4
-:102CF00000000000000000000000000000000000D4
-:102D000000000000000000000000000000000000C3
-:102D100000000000000000000000000000000000B3
-:102D200000000000000000000000000000000000A3
-:102D30000000000000000000000000000000000093
-:102D40000000000000000000000000000000000083
-:102D50000000000000000000000000000000000073
-:102D60000000000000000000000000000000000063
-:102D70000000000000000000000000000000000053
-:102D80000000000000000000000000000000000043
-:102D90000000000000000000000000000000000033
-:102DA0000000000000000000000000000000000023
-:102DB0000000000000000000000000000000000013
-:102DC0000000000000000000000000000000000003
-:102DD00000000000000000000000000000000000F3
-:102DE00000000000000000000000000000000000E3
-:102DF00000000000000000000000000000000000D3
-:102E000000000000000000000000000000000000C2
-:102E100000000000000000000000000000000000B2
-:102E200000000000000000000000000000000000A2
-:102E30000000000000000000000000000000000092
-:102E40000000000000000000000000000000000082
-:102E50000000000000000000000000000000000072
-:102E60000000000000000000000000000000000062
-:102E70000000000000000000000000000000000052
-:102E80000000000000000000000000000000000042
-:102E90000000000000000000000000000000000032
-:102EA0000000000000000000000000000000000022
-:102EB0000000000000000000000000000000000012
-:102EC0000000000000000000000000000000000002
-:102ED00000000000000000000000000000000000F2
-:102EE00000000000000000000000000000000000E2
-:102EF00000000000000000000000000000000000D2
-:102F000000000000000000000000000000000000C1
-:102F100000000000000000000000000000000000B1
-:102F200000000000000000000000000000000000A1
-:102F30000000000000000000000000000000000091
-:102F40000000000000000000000000000000000081
-:102F50000000000000000000000000000000000071
-:102F60000000000000000000000000000000000061
-:102F70000000000000000000000000000000000051
-:102F80000000000000000000000000000000000041
-:102F90000000000000000000000000000000000031
-:102FA0000000000000000000000000000000000021
-:102FB0000000000000000000000000000000000011
-:102FC0000000000000000000000000000000000001
-:102FD00000000000000000000000000000000000F1
-:102FE00000000000000000000000000000000000E1
-:102FF00000000000000000000000000000000000D1
-:00000001FF
diff --git a/firmware/yamaha/yss225_registers.bin.ihex b/firmware/yamaha/yss225_registers.bin.ihex
deleted file mode 100644
index 6dd3d8c4de2b..000000000000
--- a/firmware/yamaha/yss225_registers.bin.ihex
+++ /dev/null
@@ -1,998 +0,0 @@
-:10000000FF000E100F00FF000E110F00FF000E1278
-:100010000F00FF000E130F00FF000E140F00FF0073
-:100020000E150F00FF000E160F00FF000E170F0039
-:10003000FF000E180F00FF000E190F00FF000E1A30
-:100040000F00FF000E1B0F00FF000E1C0F00FF0033
-:100050000E1D0F00FF000E1E0F00FF000E1F0F00F1
-:10006000FF000E200F00FF000E210F00FF000E22E8
-:100070000F00FF000E230F00FF000E240F00FF00F3
-:100080000E250F00FF000E260F00FF000E270F00A9
-:10009000FF000E280F00FF000E290F00FF000E2AA0
-:1000A0000F00FF000E2B0F00FF000E2C0F00FF00B3
-:1000B0000E2D0F00FF000E2E0F00FF000E2F0F0061
-:1000C000FF000E300F00FF000E310F00FF000E3258
-:1000D0000F00FF000E330F00FF000E340F00FF0073
-:1000E0000E350F00FF000E360F00FF000E370F0019
-:1000F000FF000E380F00FF000E390F00FF000E3A10
-:100100000F00FF000E3B0F00FF000E3C0F00FF0032
-:100110000E3D0F00FF000E3E0F00FF000E3F0F00D0
-:10012000FF000E400F00FF000E410F00FF000E42C7
-:100130000F00FF000E430F00FF000E440F00FF00F2
-:100140000E450F00FF000E460F00FF000E470F0088
-:10015000FF000E480F00FF000E490F00FF000E4A7F
-:100160000F00FF000E4B0F00FF000E4C0F00FF00B2
-:100170000E4D0F00FF000E4E0F00FF000E4F0F0040
-:10018000FF000E500F00FF000E510F00FF000E5237
-:100190000F00FF000E530F00FF000E540F00FF0072
-:1001A0000E550F00FF000E560F00FF000E570F00F8
-:1001B000FF000E580F00FF000E590F00FF000E5AEF
-:1001C0000F00FF000E5B0F00FF000E5C0F00FF0032
-:1001D0000E5D0F00FF000E5E0F00FF000E5F0F00B0
-:1001E000FF000E600F00FF000E610F00FF000E62A7
-:1001F0000F00FF000E630F00FF000E640F00FF00F2
-:100200000E650F00FF000E660F00FF000E670F0067
-:10021000FF000E680F00FF000E690F00FF000E6A5E
-:100220000F00FF000E6B0F00FF000E6C0F00FF00B1
-:100230000E6D0F00FF000E6E0F00FF000E6F0F001F
-:10024000FF000E700F00FF000E710F00FF000E7216
-:100250000F00FF000E730F00FF000E740F00FF0071
-:100260000E750F00FF000E760F00FF000E770F00D7
-:10027000FF000E780F00FF000E790F00FF000E7ACE
-:100280000F00FF000E7B0F00FF000E7C0F00FF0031
-:100290000E7D0F00FF000E7E0F00FF000E7F0F008F
-:1002A000FF000E800F00FF000E810F00FF000E8286
-:1002B0000F00FF000E830F00FF000E840F00FF00F1
-:1002C0000E850F00FF000E860F00FF000E870F0047
-:1002D000FF000E880F00FF000E890F00FF000E8A3E
-:1002E0000F00FF000E8B0F00FF000E8C0F00FF00B1
-:1002F0000E8D0F00FF000E8E0F00FF000E8F0F00FF
-:10030000FF000E900F00FF000E910F00FF000E92F5
-:100310000F00FF000E930F00FF000E940F00FF0070
-:100320000E950F00FF000E960F00FF000E970F00B6
-:10033000FF000E980F00FF000E990F00FF000E9AAD
-:100340000F00FF000E9B0F00FF000E9C0F00FF0030
-:100350000E9D0F00FF000E9E0F00FF000E9F0F006E
-:10036000FF000EA00F00FF000EA10F00FF000EA265
-:100370000F00FF000EA30F00FF000EA40F00FF00F0
-:100380000EA50F00FF000EA60F00FF000EA70F0026
-:10039000FF000EA80F00FF000EA90F00FF000EAA1D
-:1003A0000F00FF000EAB0F00FF000EAC0F00FF00B0
-:1003B0000EAD0F00FF000EAE0F00FF000EAF0F00DE
-:1003C000FF000EB00F00FF000EB10F00FF000EB2D5
-:1003D0000F00FF000EB30F00FF000EB40F00FF0070
-:1003E0000EB50F00FF000EB60F00FF000EB70F0096
-:1003F000FF000EB80F00FF000EB90F00FF000EBA8D
-:100400000F00FF000EBB0F00FF000EBC0F00FF002F
-:100410000EBD0F00FF000EBE0F00FF000EBF0F004D
-:10042000FF000EC00F00FF000EC10F00FF000EC244
-:100430000F00FF000EC30F00FF000EC40F00FF00EF
-:100440000EC50F00FF000EC60F00FF000EC70F0005
-:10045000FF000EC80F00FF000EC90F00FF000ECAFC
-:100460000F00FF000ECB0F00FF000ECC0F00FF00AF
-:100470000ECD0F00FF000ECE0F00FF000ECF0F00BD
-:10048000FF000ED00F00FF000ED10F00FF000ED2B4
-:100490000F00FF000ED30F00FF000ED40F00FF006F
-:1004A0000ED50F00FF000ED60F00FF000ED70F0075
-:1004B000FF000ED80F00FF000ED90F00FF000EDA6C
-:1004C0000F00FF000EDB0F00FF000EDC0F00FF002F
-:1004D0000EDD0F00FF000EDE0F00FF000EDF0F002D
-:1004E000FF000EE00F00FF000EE10F00FF000EE224
-:1004F0000F00FF000EE30F00FF000EE40F00FF00EF
-:100500000EE50F00FF000EE60F00FF000EE70F00E4
-:10051000FF000EE80F00FF000EE90F00FF000EEADB
-:100520000F00FF000EEB0F00FF000EEC0F00FF00AE
-:100530000EED0F00FF000EEE0F00FF000EEF0F009C
-:10054000FF000EF00F00FF000EF10F00FF000EF293
-:100550000F00FF000EF30F00FF000EF40F00FF006E
-:100560000EF50F00FF000EF60F00FF000EF70F0054
-:10057000FF000EF80F00FF000EF90F00FF000EFA4B
-:100580000F00FF000EFB0F00FF000EFC0F00FF002E
-:100590000EFD0F00FF000EFE0F00FF000EFF0F000C
-:1005A000FF000E100F00FF000E110F00FF000E12D3
-:1005B0000F00FF000E130F00FF000E140F00FF00CE
-:1005C0000E150F00FF000E160F00FF000E170F0094
-:1005D000FF000E180F00FF000E190F00FF000E1A8B
-:1005E0000F00FF000E1B0F00FF000E1C0F00FF008E
-:1005F0000E1D0F00FF000E1E0F00FF000E1F0F004C
-:10060000FF000E200F00FF000E210F00FF000E2242
-:100610000F00FF000E230F00FF000E240F00FF004D
-:100620000E250F00FF000E260F00FF000E270F0003
-:10063000FF000E280F00FF000E290F00FF000E2AFA
-:100640000F00FF000E2B0F00FF000E2C0F00FF000D
-:100650000E2D0F00FF000E2E0F00FF000E2F0F00BB
-:10066000FF000E300F00FF000E310F00FF000E32B2
-:100670000F00FF000E330F00FF000E340F00FF00CD
-:100680000E350F00FF000E360F00FF000E370F0073
-:10069000FF000E380F00FF000E390F00FF000E3A6A
-:1006A0000F00FF000E3B0F00FF000E3C0F00FF008D
-:1006B0000E3D0F00FF000E3E0F00FF000E3F0F002B
-:1006C000FF000E400F00FF000E410F00FF000E4222
-:1006D0000F00FF000E430F00FF000E440F00FF004D
-:1006E0000E450F00FF000E460F00FF000E470F00E3
-:1006F000FF000E480F00FF000E490F00FF000E4ADA
-:100700000F00FF000E4B0F00FF000E4C0F00FF000C
-:100710000E4D0F00FF000E4E0F00FF000E4F0F009A
-:10072000FF000E500F00FF000E510F00FF000E5291
-:100730000F00FF000E530F00FF000E540F00FF00CC
-:100740000E550F00FF000E560F00FF000E570F0052
-:10075000FF000E580F00FF000E590F00FF000E5A49
-:100760000F00FF000E5B0F00FF000E5C0F00FF008C
-:100770000E5D0F00FF000E5E0F00FF000E5F0F000A
-:10078000FF000E600F00FF000E610F00FF000E6201
-:100790000F00FF000E630F00FF000E640F00FF004C
-:1007A0000E650F00FF000E660F00FF000E670F00C2
-:1007B000FF000E680F00FF000E690F00FF000E6AB9
-:1007C0000F00FF000E6B0F00FF000E6C0F00FF000C
-:1007D0000E6D0F00FF000E6E0F00FF000E6F0F007A
-:1007E000FF000E700F00FF000E710F00FF000E7271
-:1007F0000F00FF000E730F00FF000E740F00FF00CC
-:100800000E750F00FF000E760F00FF000E770F0031
-:10081000FF000E780F00FF000E790F00FF000E7A28
-:100820000F00FF000E7B0F00FF000E7C0F00FF008B
-:100830000E7D0F00FF000E7E0F00FF000E7F0F00E9
-:10084000FF000E800F00FF000E810F00FF000E82E0
-:100850000F00FF000E830F00FF000E840F00FF004B
-:100860000E850F00FF000E860F00FF000E870F00A1
-:10087000FF000E880F00FF000E890F00FF000E8A98
-:100880000F00FF000E8B0F00FF000E8C0F00FF000B
-:100890000E8D0F00FF000E8E0F00FF000E8F0F0059
-:1008A000FF000E900F00FF000E910F00FF000E9250
-:1008B0000F00FF000E930F00FF000E940F00FF00CB
-:1008C0000E950F00FF000E960F00FF000E970F0011
-:1008D000FF000E980F00FF000E990F00FF000E9A08
-:1008E0000F00FF000E9B0F00FF000E9C0F00FF008B
-:1008F0000E9D0F00FF000E9E0F00FF000E9F0F00C9
-:10090000FF000EA00F00FF000EA10F00FF000EA2BF
-:100910000F00FF000EA30F00FF000EA40F00FF004A
-:100920000EA50F00FF000EA60F00FF000EA70F0080
-:10093000FF000EA80F00FF000EA90F00FF000EAA77
-:100940000F00FF000EAB0F00FF000EAC0F00FF000A
-:100950000EAD0F00FF000EAE0F00FF000EAF0F0038
-:10096000FF000EB00F00FF000EB10F00FF000EB22F
-:100970000F00FF000EB30F00FF000EB40F00FF00CA
-:100980000EB50F00FF000EB60F00FF000EB70F00F0
-:10099000FF000EB80F00FF000EB90F00FF000EBAE7
-:1009A0000F00FF000EBB0F00FF000EBC0F00FF008A
-:1009B0000EBD0F00FF000EBE0F00FF000EBF0F00A8
-:1009C000FF000EC00F00FF000EC10F00FF000EC29F
-:1009D0000F00FF000EC30F00FF000EC40F00FF004A
-:1009E0000EC50F00FF000EC60F00FF000EC70F0060
-:1009F000FF000EC80F00FF000EC90F00FF000ECA57
-:100A00000F00FF000ECB0F00FF000ECC0F00FF0009
-:100A10000ECD0F00FF000ECE0F00FF000ECF0F0017
-:100A2000FF000ED00F00FF000ED10F00FF000ED20E
-:100A30000F00FF000ED30F00FF000ED40F00FF00C9
-:100A40000ED50F00FF000ED60F00FF000ED70F00CF
-:100A5000FF000ED80F00FF000ED90F00FF000EDAC6
-:100A60000F00FF000EDB0F00FF000EDC0F00FF0089
-:100A70000EDD0F00FF000EDE0F00FF000EDF0F0087
-:100A8000FF000EE00F00FF000EE10F00FF000EE27E
-:100A90000F00FF000EE30F00FF000EE40F00FF0049
-:100AA0000EE50F00FF000EE60F00FF000EE70F003F
-:100AB000FF000EE80F00FF000EE90F00FF000EEA36
-:100AC0000F00FF000EEB0F00FF000EEC0F00FF0009
-:100AD0000EED0F00FF000EEE0F00FF000EEF0F00F7
-:100AE000FF000EF00F00FF000EF10F00FF000EF2EE
-:100AF0000F00FF000EF30F00FF000EF40F00FF00C9
-:100B00000EF50F00FF000EF60F00FF000EF70F00AE
-:100B1000FF000EF80F00FF000EF90F00FF000EFAA5
-:100B20000F00FF000EFB0F00FF000EFC0F00FF0088
-:100B30000EFD0F00FF000EFE0F00FF000EFF0F0066
-:100B4000FF000802FF000B070A440D000C00FF0025
-:100B50000B070A420D000C00FF000B070A430D00B3
-:100B60000C00FF000B070A7C0D000C00FF000B07B8
-:100B70000A7E0D000C00FF000B070A460D000C005A
-:100B8000FF000B070A490D000C00FF000B070A4786
-:100B90000D000C00FF000B070A4A0D000C00FF00BF
-:100BA0000E100F00FF000E110F00FF000E120F00BD
-:100BB000FF000E130F00FF000E140F00FF000E15B4
-:100BC0000F00FF000E160F00FF000E170F00FF00B2
-:100BD0000E180F00FF000E190F00FF000E1A0F0075
-:100BE000FF000E1B0F00FF000E1C0F00FF000E1D6C
-:100BF0000F00FF000E1E0F00FF000E1F0F00FF0072
-:100C00000E200F00FF000E210F00FF000E220F002C
-:100C1000FF000E230F00FF000E240F00FF000E2523
-:100C20000F00FF000E260F00FF000E270F00FF0031
-:100C30000E280F00FF000E290F00FF000E2A0F00E4
-:100C4000FF000E2B0F00FF000E2C0F00FF000E2DDB
-:100C50000F00FF000E2E0F00FF000E2F0F00FF00F1
-:100C60000E300F00FF000E310F00FF000E320F009C
-:100C7000FF000E330F00FF000E340F00FF000E3593
-:100C80000F00FF000E360F00FF000E370F00FF00B1
-:100C90000E380F00FF000E390F00FF000E3A0F0054
-:100CA000FF000E3B0F00FF000E3C0F00FF000E3D4B
-:100CB0000F00FF000E3E0F00FF000E3F0F00FF0071
-:100CC0000E400F00FF000E410F00FF000E420F000C
-:100CD000FF000E430F00FF000E440F00FF000E4503
-:100CE0000F00FF000E460F00FF000E470F00FF0031
-:100CF0000E480F00FF000E490F00FF000E4A0F00C4
-:100D0000FF000E4B0F00FF000E4C0F00FF000E4DBA
-:100D10000F00FF000E4E0F00FF000E4F0F00FF00F0
-:100D20000E500F00FF000E510F00FF000E520F007B
-:100D3000FF000E530F00FF000E540F00FF000E5572
-:100D40000F00FF000E560F00FF000E570F00FF00B0
-:100D50000E580F00FF000E590F00FF000E5A0F0033
-:100D6000FF000E5B0F00FF000E5C0F00FF000E5D2A
-:100D70000F00FF000E5E0F00FF000E5F0F00FF0070
-:100D80000E600F00FF000E610F00FF000E620F00EB
-:100D9000FF000E630F00FF000E640F00FF000E65E2
-:100DA0000F00FF000E660F00FF000E670F00FF0030
-:100DB0000E680F00FF000E690F00FF000E6A0F00A3
-:100DC000FF000E6B0F00FF000E6C0F00FF000E6D9A
-:100DD0000F00FF000E6E0F00FF000E6F0F00FF00F0
-:100DE0000E700F00FF000E710F00FF000E720F005B
-:100DF000FF000E730F00FF000E740F00FF000E7552
-:100E00000F00FF000E760F00FF000E770F00FF00AF
-:100E10000E780F00FF000E790F00FF000E7A0F0012
-:100E2000FF000E7B0F00FF000E7C0F00FF000E7D09
-:100E30000F00FF000E7E0F00FF000E7F0F00FF006F
-:100E40000E800F00FF000E810F00FF000E820F00CA
-:100E5000FF000E830F00FF000E840F00FF000E85C1
-:100E60000F00FF000E860F00FF000E870F00FF002F
-:100E70000E880F00FF000E890F00FF000E8A0F0082
-:100E8000FF000E8B0F00FF000E8C0F00FF000E8D79
-:100E90000F00FF000E8E0F00FF000E8F0F00FF00EF
-:100EA0000E900F00FF000E910F00FF000E920F003A
-:100EB000FF000E930F00FF000E940F00FF000E9531
-:100EC0000F00FF000E960F00FF000E970F00FF00AF
-:100ED0000E980F00FF000E990F00FF000E9A0F00F2
-:100EE000FF000E9B0F00FF000E9C0F00FF000E9DE9
-:100EF0000F00FF000E9E0F00FF000E9F0F00FF006F
-:100F00000EA00F00FF000EA10F00FF000EA20F00A9
-:100F1000FF000EA30F00FF000EA40F00FF000EA5A0
-:100F20000F00FF000EA60F00FF000EA70F00FF002E
-:100F30000EA80F00FF000EA90F00FF000EAA0F0061
-:100F4000FF000EAB0F00FF000EAC0F00FF000EAD58
-:100F50000F00FF000EAE0F00FF000EAF0F00FF00EE
-:100F60000EB00F00FF000EB10F00FF000EB20F0019
-:100F7000FF000EB30F00FF000EB40F00FF000EB510
-:100F80000F00FF000EB60F00FF000EB70F00FF00AE
-:100F90000EB80F00FF000EB90F00FF000EBA0F00D1
-:100FA000FF000EBB0F00FF000EBC0F00FF000EBDC8
-:100FB0000F00FF000EBE0F00FF000EBF0F00FF006E
-:100FC0000EC00F00FF000EC10F00FF000EC20F0089
-:100FD000FF000EC30F00FF000EC40F00FF000EC580
-:100FE0000F00FF000EC60F00FF000EC70F00FF002E
-:100FF0000EC80F00FF000EC90F00FF000ECA0F0041
-:10100000FF000ECB0F00FF000ECC0F00FF000ECD37
-:101010000F00FF000ECE0F00FF000ECF0F00FF00ED
-:101020000ED00F00FF000ED10F00FF000ED20F00F8
-:10103000FF000ED30F00FF000ED40F00FF000ED5EF
-:101040000F00FF000ED60F00FF000ED70F00FF00AD
-:101050000ED80F00FF000ED90F00FF000EDA0F00B0
-:10106000FF000EDB0F00FF000EDC0F00FF000EDDA7
-:101070000F00FF000EDE0F00FF000EDF0F00FF006D
-:101080000EE00F00FF000EE10F00FF000EE20F0068
-:10109000FF000EE30F00FF000EE40F00FF000EE55F
-:1010A0000F00FF000EE60F00FF000EE70F00FF002D
-:1010B0000EE80F00FF000EE90F00FF000EEA0F0020
-:1010C000FF000EEB0F00FF000EEC0F00FF000EED17
-:1010D0000F00FF000EEE0F00FF000EEF0F00FF00ED
-:1010E0000EF00F00FF000EF10F00FF000EF20F00D8
-:1010F000FF000EF30F00FF000EF40F00FF000EF5CF
-:101100000F00FF000EF60F00FF000EF70F00FF00AC
-:101110000EF80F00FF000EF90F00FF000EFA0F008F
-:10112000FF000EFB0F00FF000EFC0F00FF000EFD86
-:101130000F00FF000EFE0F00FF000EFF0F0009055D
-:101140000B000A000D010C7CFF000D000C1EFF00BF
-:101150000D000C00FF000D000C00FF000D000CF551
-:10116000FF000D000C11FF000D000C20FF000D0012
-:101170000C32FF000D000C40FF000D000C13FF00AF
-:101180000D000C00FF000D000C14FF000D020C768A
-:10119000FF000D000C60FF000D000C80FF000D0231
-:1011A0000C00FF000D000C00FF000D000C00FF0004
-:1011B0000D020C00FF000D000C00FF000D000C00E4
-:1011C000FF000D000C00FF000D000C00FF000D00E3
-:1011D0000C00FF000D000C00FF000D000C00FF00D4
-:1011E0000D000C00FF000D000C00FF000D000C00B6
-:1011F000FF000D000C00FF000D000C00FF000D00B3
-:101200000C00FF000D000C00FF000D000C00FF00A3
-:101210000D000C00FF000D000C00FF000D000C0085
-:10122000FF000D000C00FF000D000C00FF000D0082
-:101230000C00FF000D000C00FF000D000C00FF0073
-:101240000D000C00FF000D000C00FF000D000C0055
-:10125000FF000D000C00FF000D000C00FF000D0052
-:101260000C00FF000D000C00FF000D000C00FF0043
-:101270000D000C00FF000D000C00FF000D000C0025
-:10128000FF000D000C00FF000D000C00FF000D0022
-:101290000C00FF000D000C00FF000D000C00FF0013
-:1012A0000D000C00FF000D000C00FF000D000C00F5
-:1012B000FF000D000C00FF000D000C00FF000D00F2
-:1012C0000C00FF000D000C18FF000D000C19FF00B2
-:1012D0000D010C1AFF000D010C20FF000D010C4048
-:1012E000FF000D010C17FF000D000C00FF000D01A9
-:1012F0000C80FF000D010C20FF000D000C10FF0002
-:101300000D010CA0FF000D030CD1FF000D000C001F
-:10131000FF000D010CF2FF000D020C00FF000D009C
-:101320000C13FF000D000C00FF000D000CF4FF007B
-:101330000D020CE0FF000D000C15FF000D000C006D
-:10134000FF000D000C16FF000D000C00FF000D004B
-:101350000C17FF000D000C20FF000D000C00FF001B
-:101360000D000C20FF000D000C50FF000D000C00C4
-:10137000FF000D000C40FF000D000C00FF000D00F1
-:101380000C71FF000D020C00FF000D000C60FF004F
-:101390000D000C00FF000D000C92FF000D000C0072
-:1013A000FF000D000C80FF000D000C00FF000D0081
-:1013B0000CB3FF000D020C00FF000D000CA0FF009D
-:1013C0000D000C00FF000D000CD4FF000D000C0000
-:1013D000FF000D000C40FF000D000C80FF000D0011
-:1013E0000CF5FF000D000C20FF000D000C70FF003D
-:1013F0000D000CA0FF000D020C11FF000D000C16DB
-:10140000FF000D000C00FF000D000C00FF000D00A0
-:101410000C00FF000D000C20FF000D020C00FF006F
-:101420000D000C20FF000D000C10FF000D000C172C
-:10143000FF000D000C1BFF000D000C1DFF000D0236
-:101440000CDFFF0009050B010A000D000C00FF0076
-:101450000D000C00FF000D000C00FF000D020C0041
-:10146000FF000D000C19FF000D000C1FFF000D0008
-:101470000C00FF000D000C00FF000D000C00FF0031
-:101480000D030CD8FF000D000C00FF000D020C2016
-:10149000FF000D000C19FF000D000C00FF000D00F7
-:1014A0000C00FF000D000C18FF000D010CC0FF0028
-:1014B0000D010CFAFF000D000C1AFF000D000C00CE
-:1014C000FF000D000C00FF000D000C00FF000D00E0
-:1014D0000C00FF000D000C00FF000D000C00FF00D1
-:1014E0000D000C00FF000D000C00FF000D000C00B3
-:1014F000FF000D000C00FF000D000C00FF000D00B0
-:101500000C00FF000D000C00FF000D000C00FF00A0
-:101510000D000C00FF000D000C00FF000D000C0082
-:10152000FF000D000C00FF000D000C00FF000D007F
-:101530000C00FF000D000C00FF000D000C00FF0070
-:101540000D000C00FF000D000C00FF000D000C0052
-:10155000FF000D000C00FF000D000C00FF000D004F
-:101560000C00FF000D000C00FF000D000C00FF0040
-:101570000D000C00FF000D000C00FF000D000C0022
-:10158000FF000D000C00FF000D000C00FF000D001F
-:101590000C00FF000D000C00FF000D000C00FF0010
-:1015A0000D000C00FF000D000C00FF000D000C00F2
-:1015B000FF000D000C00FF000D000C00FF000D00EF
-:1015C0000C00FF000D000C00FF000D020C40FF009E
-:1015D0000D020C60FF000D000C00FF000D000C0060
-:1015E000FF000D000C00FF000D020CC0FF000D02FB
-:1015F0000C80FF000D000C00FF000D020CFBFF0033
-:101600000D020CA0FF000D000C00FF000D000C1BD4
-:10161000FF000D020CD7FF000D000C00FF000D02B3
-:101620000CF7FF000D030C20FF000D030C00FF0062
-:101630000D000C00FF000D000C1CFF000D030C3C06
-:10164000FF000D000C00FF000D030C3FFF000D001C
-:101650000C00FF000D030CC0FF000D000C00FF008C
-:101660000D030CDFFF000D000C00FF000D000C004F
-:10167000FF000D030C5DFF000D000C00FF000D03CB
-:101680000CC0FF000D000C00FF000D030C7DFF00DF
-:101690000D000C00FF000D030CC0FF000D000C003E
-:1016A000FF000D030C9EFF000D000C00FF000D035A
-:1016B0000CC0FF000D000C00FF000D030CBEFF006E
-:1016C0000D000C00FF000D030CC0FF000D000C000E
-:1016D000FF000D000C00FF000D000C00FF000D00CE
-:1016E0000C00FF000D000C1BFF000D000C00FF00A4
-:1016F0000D000C00FF000D000C00FF000D020CDBC4
-:10170000FF000D000C00FF000D020CDBFF000D00C0
-:101710000C00FF000D020CE0FF000D000C00FF00AC
-:101720000D020CFBFF000D000C00FF000D020CC0B1
-:10173000FF000D020C40FF000D020CFBFF000D022C
-:101740000C60FF000D000C1BFF0009050B020A00D6
-:101750000CC4FF000C00FF000C44FF000C07FF004E
-:101760000C44FF000C00FF000C40FF000C25FF00A4
-:101770000C01FF000C06FF000CC4FF000C07FF006B
-:101780000C40FF000C25FF000C01FF000C00FF00C7
-:101790000C46FF000C46FF000C00FF000C00FF0091
-:1017A0000C00FF000C00FF000C00FF000C00FF000D
-:1017B0000C00FF000C00FF000C00FF000C00FF00FD
-:1017C0000C00FF000C00FF000C00FF000C00FF00ED
-:1017D0000C00FF000C00FF000C00FF000C00FF00DD
-:1017E0000C00FF000C00FF000C00FF000C00FF00CD
-:1017F0000C00FF000C00FF000C00FF000C00FF00BD
-:101800000C00FF000C00FF000C00FF000C00FF00AC
-:101810000C00FF000C00FF000C00FF000C00FF009C
-:101820000C00FF000C00FF000C00FF000C00FF008C
-:101830000C00FF000C00FF000C00FF000C00FF007C
-:101840000C00FF000C00FF000C00FF000C00FF006C
-:101850000C46FF000C07FF000C05FF000C05FF0005
-:101860000C05FF000C04FF000C07FF000C05FF0037
-:101870000C04FF000C07FF000C05FF000C44FF00E8
-:101880000C46FF000C44FF000C46FF000C46FF0016
-:101890000C07FF000C05FF000C44FF000C46FF0086
-:1018A0000C05FF000C46FF000C05FF000C46FF0076
-:1018B0000C05FF000C46FF000C05FF000C44FF0068
-:1018C0000C46FF000C05FF000C07FF000C44FF0056
-:1018D0000C46FF000C05FF000C07FF000C44FF0046
-:1018E0000C46FF000C05FF000C07FF000C44FF0036
-:1018F0000C46FF000C05FF000C07FF000C44FF0026
-:101900000C05FF000C05FF000C05FF000C44FF0058
-:101910000C05FF000C05FF000C05FF000C46FF0046
-:101920000C05FF000C46FF000C05FF000C46FF00F5
-:101930000C05FF000C46FF000C05FF000C46FF00E5
-:101940000C07FF000C46FF000C07FF000C44FF00D3
-:1019500009050B030A000C07FF000C40FF000C00F8
-:10196000FF000C00FF000C00FF000C47FF000C0004
-:10197000FF000C40FF000C00FF000C40FF000C06B5
-:10198000FF000C40FF000C00FF000C00FF000C00EB
-:10199000FF000C00FF000C00FF000C00FF000C001B
-:1019A000FF000C00FF000C00FF000C00FF000C000B
-:1019B000FF000C00FF000C00FF000C00FF000C00FB
-:1019C000FF000C00FF000C00FF000C00FF000C00EB
-:1019D000FF000C00FF000C00FF000C00FF000C00DB
-:1019E000FF000C00FF000C00FF000C00FF000C00CB
-:1019F000FF000C00FF000C00FF000C00FF000C00BB
-:101A0000FF000C00FF000C00FF000C00FF000C00AA
-:101A1000FF000C00FF000C00FF000C00FF000C009A
-:101A2000FF000C00FF000C00FF000C00FF000C008A
-:101A3000FF000C00FF000C00FF000C00FF000C007A
-:101A4000FF000C00FF000C00FF000C00FF000C006A
-:101A5000FF000C00FF000C80FF000C80FF000CC09A
-:101A6000FF000C00FF000C00FF000C40FF000C000A
-:101A7000FF000C00FF000C00FF000C40FF000C00FA
-:101A8000FF000C40FF000C00FF000C60FF000C008A
-:101A9000FF000C70FF000C00FF000C40FF000C006A
-:101AA000FF000C40FF000C00FF000C42FF000C0088
-:101AB000FF000C40FF000C00FF000C02FF000C00B8
-:101AC000FF000C40FF000C00FF000C00FF000C00AA
-:101AD000FF000C40FF000C00FF000C00FF000C009A
-:101AE000FF000C40FF000C00FF000C00FF000C008A
-:101AF000FF000C40FF000C00FF000C00FF000C007A
-:101B0000FF000C40FF000C00FF000C00FF000C0069
-:101B1000FF000C42FF000C00FF000C40FF000C0017
-:101B2000FF000C42FF000C00FF000C02FF000C0045
-:101B3000FF000C02FF000C00FF000C02FF000C0075
-:101B4000FF000C42FF000C00FF000CC0FF000C0067
-:101B5000FF000C40FF0009050B040A000C63FF00A6
-:101B60000C03FF000C26FF000C02FF000C2CFF00F2
-:101B70000C00FF000C24FF000C00FF000C2EFF00E7
-:101B80000C02FF000C02FF000C02FF000C00FF0023
-:101B90000C00FF000C00FF000C00FF000C00FF0019
-:101BA0000C00FF000C00FF000C00FF000C00FF0009
-:101BB0000C00FF000C00FF000C00FF000C00FF00F9
-:101BC0000C00FF000C00FF000C00FF000C00FF00E9
-:101BD0000C00FF000C00FF000C00FF000C00FF00D9
-:101BE0000C00FF000C00FF000C00FF000C00FF00C9
-:101BF0000C00FF000C00FF000C00FF000C00FF00B9
-:101C00000C00FF000C00FF000C00FF000C00FF00A8
-:101C10000C00FF000C00FF000C00FF000C00FF0098
-:101C20000C00FF000C00FF000C00FF000C00FF0088
-:101C30000C00FF000C00FF000C00FF000C00FF0078
-:101C40000C00FF000C00FF000C00FF000C00FF0068
-:101C50000C00FF000C00FF000C00FF000C00FF0058
-:101C60000C01FF000C20FF000C00FF000C60FF00C7
-:101C70000C00FF000C20FF000C00FF000C20FF00F8
-:101C80000C00FF000C20FF000C00FF000C20FF00E8
-:101C90000C00FF000C20FF000C00FF000C20FF00D8
-:101CA0000C00FF000C20FF000C00FF000C20FF00C8
-:101CB0000C00FF000C60FF000C00FF000C20FF0078
-:101CC0000C00FF000C60FF000C00FF000C20FF0068
-:101CD0000C00FF000C60FF000C00FF000C20FF0058
-:101CE0000C00FF000C60FF000C00FF000C20FF0048
-:101CF0000C00FF000C60FF000C00FF000C20FF0038
-:101D00000C00FF000C60FF000C00FF000C20FF0027
-:101D10000C00FF000C20FF000C00FF000C22FF0055
-:101D20000C02FF000C22FF000C02FF000C20FF0041
-:101D30000C00FF000C60FF000C00FF000C22FF00F5
-:101D40000C02FF000C62FF000C02FF000C20FF00E1
-:101D50000C01FF000C21FF000C01FF0009010B0624
-:101D60000A000D000C00FF000A020D000C00FF002D
-:101D70000A040D000C00FF000A060D000C00FF0015
-:101D80000A080D000C00FF000A0A0D000C00FF00FD
-:101D90000A0C0D000C00FF000A0E0D000C00FF00E5
-:101DA0000A100D000C00FF000A120D000C00FF00CD
-:101DB0000A140D000C00FF000A160D000C00FF00B5
-:101DC0000A180D000C00FF000A1A0D000C00FF009D
-:101DD0000A1C0D000C00FF000A1E0D000C00FF0085
-:101DE0000A200D000C00FF000A220D000C00FF006D
-:101DF0000A240D000C00FF000A260D000C00FF0055
-:101E00000A280D000C00FF000A2A0D000C00FF003C
-:101E10000A2C0D000C00FF000A2E0D000C00FF0024
-:101E20000A300D000C00FF000A320D000C00FF000C
-:101E30000A340D000C00FF000A360D000C00FF00F4
-:101E40000A380D000C00FF000A3A0D000C00FF00DC
-:101E50000A3C0D000C00FF000A3E0D000C00FF00C4
-:101E60000A400D000C00FF000A420D030C00FF00A9
-:101E70000A440D010C00FF000A460D0A0C21FF0068
-:101E80000A480D0D0C23FF000A4A0D230C1BFF000E
-:101E90000A4C0D370C8FFF000A4E0D450C77FF00E2
-:101EA0000A500D520CE2FF000A520D1C0C92FF006A
-:101EB0000A540D1C0C52FF000A560D070C00FF00BF
-:101EC0000A580D2F0CC6FF000A5A0D0B0C00FF001C
-:101ED0000A5C0D300C06FF000A5E0D170C00FF00B7
-:101EE0000A600D3D0CDAFF000A620D290C00FF00AC
-:101EF0000A640D3E0C41FF000A660D390C00FF001C
-:101F00000A680D4C0C48FF000A6A0D490C00FF00DE
-:101F10000A6C0D4C0C6CFF000A6E0D110CD2FF0008
-:101F20000A700D160C0CFF000A720D000C00FF0069
-:101F30000A740D000C80FF000A760D0F0C00FF00E4
-:101F40000A780D000C80FF000A7A0D130C00FF00C8
-:101F50000A7C0D800C00FF000A7E0D800C80FF00C3
-:101F600009050B070A000D0F0CFFFF000D000C0008
-:101F7000FF000D080C00FF000D080C00FF000D0213
-:101F80000C00FF000D000C00FF000D000C00FF0016
-:101F90000D0F0CFFFF000D000C00FF000D000C00EA
-:101FA000FF000D080C00FF000D080C00FF000D00E5
-:101FB0000C00FF000D0F0CFFFF000D000C00FF00D8
-:101FC0000D000C00FF000D0F0CFFFF000D0F0CFFAC
-:101FD000FF000D000C00FF000D000C00FF000D00C5
-:101FE0000C00FF000D000C00FF000D000C00FF00B6
-:101FF0000D000C00FF000D000C00FF000D000C0098
-:10200000FF000D000C00FF000D000C00FF000D0094
-:102010000C00FF000D000C00FF000D000C00FF0085
-:102020000D000C00FF000D000C00FF000D000C0067
-:10203000FF000D000C00FF000D000C00FF000D0064
-:102040000C00FF000D000C00FF000D000C00FF0055
-:102050000D000C00FF000D000C00FF000D000C0037
-:10206000FF000D000C00FF000D000C00FF000D0034
-:102070000C00FF000D000C00FF000D000C00FF0025
-:102080000D000C00FF000D000C00FF000D000C0007
-:10209000FF000D000C00FF000D000C00FF000D0004
-:1020A0000C00FF000D000C00FF000D000C00FF00F5
-:1020B0000D000C00FF000D000C00FF000D000C00D7
-:1020C000FF000D000C00FF000D000C00FF000D00D4
-:1020D0000C00FF000D000C00FF000D000C00FF00C5
-:1020E0000D000C00FF000D000C00FF000D000C00A7
-:1020F000FF000D000C00FF000D000C00FF000D00A4
-:102100000C00FF000D000C00FF000D000C00FF0094
-:102110000D000C00FF000D000C00FF000D000C0076
-:10212000FF000D000C00FF000D0F0CFFFF000D0F56
-:102130000CFFFF000D0F0CFFFF000D0F0CFFFF0049
-:102140000D020CE9FF000D060C8CFF000D060C8C37
-:10215000FF000D0F0CFFFF000D1A0C75FF000D0D99
-:102160000C8BFF000D040CE9FF000D0B0C16FF009B
-:102170000D1A0C38FF000D0D0CC8FF000D040C6F7C
-:10218000FF000D0B0C91FF000D0F0CFFFF000D0663
-:102190000C40FF000D060C40FF000D020C8FFF00ED
-:1021A0000D0F0CFFFF000D060C62FF000D060C6208
-:1021B000FF000D020C7BFF000D0F0CFFFF000D0652
-:1021C0000C97FF000D060C97FF000D020C52FF004C
-:1021D0000D0F0CFFFF000D060CF6FF000D060CF6B0
-:1021E000FF000D020C19FF000D050C55FF000D0539
-:1021F0000C55FF000D050C55FF000D050C55FF009B
-:102200000D050C55FF000D050C55FF000D050C5577
-:10221000FF000D050C55FF000D140CDAFF000D0D2D
-:102220000C93FF000D040CDAFF000D050C93FF006A
-:102230000D140CDAFF000D0D0C93FF000D040CDAE9
-:10224000FF000D050C93FF000D000C00FF000D00BA
-:102250000C00FF000D000C00FF000D000C00FF0043
-:102260000D020C00FF000E010F00FF000E020F0018
-:10227000FF000E010F01FF000E020F00FF000E0114
-:102280000F02FF000E020F00FF000E010F03FF0000
-:102290000E020F00FF000E010F04FF000E020F00E0
-:1022A000FF000E010F05FF000E020F00FF000E01E0
-:1022B0000F06FF000E020F00FF000E010F07FF00C8
-:1022C0000E020F00FF000E010F08FF000E020F00AC
-:1022D000FF000E010F09FF000E020F00FF000E01AC
-:1022E0000F0AFF000E020F00FF000E010F0BFF0090
-:1022F0000E020F00FF000E010F0CFF000E020F0078
-:10230000FF000E010F0DFF000E020F00FF000E0177
-:102310000F0EFF000E020F00FF000E010F0FFF0057
-:102320000E020F00FF000EB00F20FF000EB10F20B5
-:10233000FF000EB20F20FF000EB30F20FF000EB4FF
-:102340000F20FF000EB50F20FF000EB60F20FF007C
-:102350000EB70F20FF000EB80F20FF000EB90F20A0
-:10236000FF000EBA0F20FF000EBB0F20FF000EBCB7
-:102370000F20FF000EBD0F20FF000EBE0F20FF003C
-:102380000EBF0F20FF000EF00F20FF000EF10F20F8
-:10239000FF000EF20F20FF000EF30F20FF000EF4DF
-:1023A0000F20FF000EF50F20FF000EF60F20FF009C
-:1023B0000EF70F20FF000EF80F20FF000EF90F2080
-:1023C000FF000EFA0F20FF000EFB0F20FF000EFC97
-:1023D0000F20FF000EFD0F20FF000EFE0F20FF005C
-:1023E0000EFF0F20FF000E100FFFFF000E110FFF5A
-:1023F000FF000E120FFFFF000E130FFFFF000E1461
-:102400000FFFFF000E150FFFFF000E160FFFFF005E
-:102410000E170FFFFF000E180FFFFF000E190FFF22
-:10242000FF000E1A0FFFFF000E1B0FFFFF000E1C18
-:102430000FFFFF000E1D0FFFFF000E1E0F40FF00DD
-:102440000E1F0FFFFF000E200FFFFF000E210FFFDA
-:10245000FF000E220FFFFF000E230FFFFF000E24D0
-:102460000FFFFF000E250FFFFF000E260FFFFF00DE
-:102470000E270FFFFF000E280FFFFF000E290FFF92
-:10248000FF000E2A0FFFFF000E2B0FFFFF000E2C88
-:102490000FFFFF000E2D0FFFFF000E2E0F00FF009D
-:1024A0000E2F0F00FF000E300F00FF000E310F0047
-:1024B000FF000E320F00FF000E330F00FF000E343E
-:1024C0000F00FF000E350F00FF000E360F00FF005B
-:1024D0000E370F00FF000E380F00FF000E390F00FF
-:1024E000FF000E3A0F00FF000E3B0F00FF000E3CF6
-:1024F0000F00FF000E3D0F00FF000E3E0F00FF001B
-:102500000E3F0F20FF000E400F00FF000E410F0096
-:10251000FF000E420F00FF000E430F00FF000E44AD
-:102520000F00FF000E450F00FF000E460F00FF00DA
-:102530000E470F00FF000E480F00FF000E490F006E
-:10254000FF000E4A0F00FF000E4B0F00FF000E4C65
-:102550000F00FF000E4D0F00FF000E4E0F0EFF008C
-:102560000E4F0F0EFF000E500F00FF000E510F0018
-:10257000FF000E520F00FF000E530F00FF000E541D
-:102580000F00FF000E550F00FF000E560F00FF005A
-:102590000E570F00FF000E580F00FF000E590F00DE
-:1025A000FF000E5A0F00FF000E5B0F00FF000E5CD5
-:1025B0000F00FF000E5D0F00FF000E5E0F00FF001A
-:1025C0000E5F0F00FF000E600F00FF000E610F0096
-:1025D000FF000E620F00FF000E630F00FF000E648D
-:1025E0000F00FF000E650F00FF000E660F00FF00DA
-:1025F0000E670F00FF000E680F00FF000E690F004E
-:10260000FF000E6A0F00FF000E6B0F00FF000E6C44
-:102610000F40FF000E6D0F00FF000E6E0F40FF0019
-:102620000E6F0F40FF000E700FC0FF000E710FC045
-:10263000FF000E720FC0FF000E730FC0FF000E747C
-:102640000FC0FF000E750FC0FF000E760FC0FF0019
-:102650000E770FC0FF000E780FC0FF000E790FC07D
-:10266000FF000E7A0FC0FF000E7B0FC0FF000E7C34
-:102670000FC0FF000E7D0FC0FF000E7E0FC0FF00D9
-:102680000E7F0FC0FF000E800F00FF000E810F00B5
-:10269000FF000E820F00FF000E830F00FF000E846C
-:1026A0000F00FF000E850F00FF000E860F00FF00D9
-:1026B0000E870F00FF000E880F00FF000E890F002D
-:1026C000FF000E8A0F00FF000E8B0F00FF000E8C24
-:1026D0000F00FF000E8D0F00FF000E8E0F00FF0099
-:1026E0000E8F0F00FF000E900F00FF000E910F00E5
-:1026F000FF000E920F00FF000E930F00FF000E94DC
-:102700000F00FF000E950F00FF000E960F00FF0058
-:102710000E970F00FF000E980F00FF000E990F009C
-:10272000FF000E9A0F00FF000E9B0F00FF000E9C93
-:102730000F00FF000E9D0F00FF000E9E0F00FF0018
-:102740000E9F0F00FF000EA00F00FF000EA10F0054
-:10275000FF000EA20F00FF000EA30F00FF000EA44B
-:102760000F00FF000EA50F00FF000EA60F00FF00D8
-:102770000EA70F00FF000EA80F00FF000EA90F000C
-:10278000FF000EAA0F00FF000EAB0F00FF000EAC03
-:102790000F00FF000EAD0F00FF000EAE0F00FF0098
-:1027A0000EAF0F00FF000EC00F00FF000EC10F00A4
-:1027B000FF000EC20F00FF000EC30F00FF000EC48B
-:1027C0000F00FF000EC50F00FF000EC60F00FF0038
-:1027D0000EC70F00FF000EC80F00FF000EC90F004C
-:1027E000FF000ECA0F00FF000ECB0F00FF000ECC43
-:1027F0000F00FF000ECD0F00FF000ECE0F00FF00F8
-:102800000ECF0F00FF000ED00F00FF000ED10F0003
-:10281000FF000ED20F00FF000ED30F00FF000ED4FA
-:102820000F00FF000ED50F00FF000ED60F00FF00B7
-:102830000ED70F00FF000ED80F00FF000ED90F00BB
-:10284000FF000EDA0F00FF000EDB0F00FF000EDCB2
-:102850000F00FF000EDD0F00FF000EDE0F10FF0067
-:102860000EDF0F10FF000EE00F00FF000EE10F0063
-:10287000FF000EE20F00FF000EE30F00FF000EE46A
-:102880000F00FF000EE50F00FF000EE60F00FF0037
-:102890000EE70F00FF000EE80F00FF000EE90F002B
-:1028A000FF000EEA0F00FF000EEB0F00FF000EEC22
-:1028B0000F00FF000EED0F00FF000EEE0F00FF00F7
-:1028C0000EEF0F00FF000E010F000E020F01FF00C0
-:1028D0000E010F010E020F01FF000E010F020E028A
-:1028E0000F01FF000E010F030E020F01FF000E018A
-:1028F0000F040E020F01FF000E010F050E020F0163
-:10290000FF000E010F060E020F01FF000E010F0760
-:102910000E020F01FF000E010F080E020F01FF0053
-:102920000E010F090E020F01FF000E010F0A0E0229
-:102930000F01FF000E010F0B0E020F01FF000E0131
-:102940000F0C0E020F01FF000E010F0D0E020F0102
-:10295000FF000E010F0E0E020F01FF000E010F0F00
-:102960000E020F01FF0008020B070A460D000C00C3
-:10297000FF000B070A490D000C00FF000B000A4B7B
-:102980000D030C11FF000B000A4D0D010C32FF006E
-:102990000B070A460D000C00FF000B070A490D004B
-:1029A0000C00FF000B070A400D000C00FF000B0796
-:1029B0000A410D000C00FF000B010A400D020C4003
-:1029C000FF000B010A410D020C60FF000B070A40DB
-:1029D0000D000C00FF000B070A410D000C00FF006A
-:1029E0000B070A470D000C00FF000B070A4A0D00F9
-:1029F0000C00FF000B000A470D010C00FF000B004C
-:102A00000A4A0D010C20FF000B070A470D000C00BD
-:102A1000FF000B070A4A0D000C00FF000B070A7CA1
-:102A20000D000C00FF000B070A7E0D000C00FF00DC
-:102A30000B000A000D010C1CFF000B070A7C0D00A7
-:102A40000C00FF000B070A7E0D000C00FF000B07B7
-:102A50000A440D000C00FF000B000A440D010C009D
-:102A6000FF000B070A440D000C00FF000B070A4291
-:102A70000D000C00FF000B070A430D000C00FF00C7
-:102A80000B000A420D010C1AFF000B000A430D0156
-:102A90000C20FF000B070A420D000C00FF000B0783
-:102AA0000A430D000C00FF000B070A400D000C004C
-:102AB000FF000B070A410D000C00FF000B010A404C
-:102AC0000D020C40FF000B010A410D020C60FF00DB
-:102AD0000B070A400D000C00FF000B070A410D0018
-:102AE0000C00FF000B070A440D0F0CFFFF000B0743
-:102AF0000A420D000C00FF000B070A430D000C00FA
-:102B0000FF000B070A400D000C00FF000B070A41F5
-:102B10000D000C00FF000B070A510D060C40FF00D2
-:102B20000B070A500D060C40FF000B070A4F0D0360
-:102B30000C81FF000B070A530D1A0C76FF000B07E0
-:102B40000A540D0D0C8BFF000B070A550D040CE900
-:102B5000FF000B070A560D0B0C17FF000B070A5757
-:102B60000D1A0C38FF000B070A580D0D0CC9FF0099
-:102B70000B070A590D040C6FFF000B070A5A0D0BC7
-:102B80000C91FF000B070A730D140CDAFF000B0702
-:102B90000A740D0D0C93FF000B070A750D040CD978
-:102BA000FF000B070A760D050C93FF000B070A7751
-:102BB0000D140CDAFF000B070A780D0D0C93FF00C3
-:102BC0000B070A790D040CD9FF000B070A7A0D05D3
-:102BD0000C93FF000B070A5E0D030C68FF000B0748
-:102BE0000A5C0D040C31FF000B070A5D0D040C316B
-:102BF000FF000B070A620D030C52FF000B070A606F
-:102C00000D040C76FF000B070A610D040C76FF0023
-:102C10000B070A660D030C2EFF000B070A640D0458
-:102C20000CDAFF000B070A650D040CDAFF000B0736
-:102C30000A6A0D020CF6FF000B070A680D050C620C
-:102C4000FF000B070A690D050C62FF000B060A4620
-:102C50000D0A0C22FF000B060A480D0D0C24FF0084
-:102C60000B060A6E0D110CD3FF000B060A700D1532
-:102C70000CCBFF000B060A520D200C93FF000B0635
-:102C80000A540D200C54FF000B060A4A0D270C1D98
-:102C9000FF000B060A580D2F0CC8FF000B060A5C3C
-:102CA0000D300C07FF000B060A4C0D370C90FF008F
-:102CB0000B060A600D3D0CDBFF000B060A640D3E9F
-:102CC0000C42FF000B060A4E0D450C78FF000B0668
-:102CD0000A680D4C0C48FF000B060A6C0D4C0C6C7E
-:102CE000FF000B060A500D520CE2FF000B060A42D1
-:102CF0000D020CBAFF00FF000E1E0F14FF000EDEC7
-:102D00000F20FF000EDF0F20FF000B060A780D00DA
-:102D10000C40FF000B070A030D0F0CFFFF000B0711
-:102D20000A0B0D0F0CFFFF000B070A020D000C0031
-:102D3000FF000B070A0A0D000C00FF000B070A46F4
-:102D40000D000C00FF000B070A490D000C000905DF
-:102D50000B000A100D000C00FF000D000C00FF001E
-:102D60000D020C00FF000D000C00FF000D000C0018
-:102D7000FF000D000C00FF000D000C00FF000D0017
-:102D80000C00FF000D000C00FF000D000C00FF0008
-:102D90000D000C00FF000D000C00FF000D000C00EA
-:102DA000FF000D000C00FF000D000C00FF000D00E7
-:102DB0000C00FF000D000C00FF000D000C00FF00D8
-:102DC0000D000C00FF000D000C00FF000D000C00BA
-:102DD000FF000D000C00FF000D000C00FF000D00B7
-:102DE0000C00FF000D000C00FF000D000C00FF00A8
-:102DF0000D000C00FF000D000C00FF000D000C008A
-:102E0000FF000D000C00FF000D000C00FF000D0086
-:102E10000C00FF000D000C00FF000D000C00FF0077
-:102E20000D000C00FF000D000C00FF000D000C0059
-:102E3000FF000D000C00FF000D000C00FF000D0056
-:102E40000C00FF000D000C00FF000D000C00FF0047
-:102E50000D000C00FF000D000C00FF000D000C0029
-:102E6000FF000D000C00FF000D000C00FF000D0026
-:102E70000C00FF0009050B010A100D010CC0FF003A
-:102E80000D010CFAFF000D000C1AFF000D000C00E4
-:102E9000FF000D000C00FF000D000C00FF000D00F6
-:102EA0000C00FF000D000C00FF000D000C00FF00E7
-:102EB0000D000C00FF000D000C00FF000D000C00C9
-:102EC000FF000D000C00FF000D000C00FF000D00C6
-:102ED0000C00FF000D000C00FF000D000C00FF00B7
-:102EE0000D000C00FF000D000C00FF000D000C0099
-:102EF000FF000D000C00FF000D000C00FF000D0096
-:102F00000C00FF000D000C00FF000D000C00FF0086
-:102F10000D000C00FF000D000C00FF000D000C0068
-:102F2000FF000D000C00FF000D000C00FF000D0065
-:102F30000C00FF000D000C00FF000D000C00FF0056
-:102F40000D000C00FF000D000C00FF000D000C0038
-:102F5000FF000D000C00FF000D000C00FF000D0035
-:102F60000C00FF000D000C00FF000D000C00FF0026
-:102F70000D000C00FF000D000C00FF000D000C0008
-:102F8000FF000D000C00FF000D000C00FF000D0005
-:102F90000C00FF000D000C00FF00FF00FF00090502
-:102FA0000B020A100C46FF000C46FF000C00FF004D
-:102FB0000C00FF000C00FF000C00FF000C00FF00E5
-:102FC0000C00FF000C00FF000C00FF000C00FF00D5
-:102FD0000C00FF000C00FF000C00FF000C00FF00C5
-:102FE0000C00FF000C00FF000C00FF000C00FF00B5
-:102FF0000C00FF000C00FF000C00FF000C00FF00A5
-:103000000C00FF000C00FF000C00FF000C00FF0094
-:103010000C00FF000C00FF000C00FF000C00FF0084
-:103020000C00FF000C00FF000C00FF000C00FF0074
-:103030000C00FF000C00FF000C00FF000C00FF0064
-:103040000C00FF000C00FF000C00FF000C00FF0054
-:103050000C00FF000C00FF000C00FF000C00FF0044
-:103060000C00FF0009050B030A100C00FF000C0008
-:10307000FF000C00FF000C00FF000C00FF000C0024
-:10308000FF000C00FF000C00FF000C00FF000C0014
-:10309000FF000C00FF000C00FF000C00FF000C0004
-:1030A000FF000C00FF000C00FF000C00FF000C00F4
-:1030B000FF000C00FF000C00FF000C00FF000C00E4
-:1030C000FF000C00FF000C00FF000C00FF000C00D4
-:1030D000FF000C00FF000C00FF000C00FF000C00C4
-:1030E000FF000C00FF000C00FF000C00FF000C00B4
-:1030F000FF000C00FF000C00FF000C00FF000C00A4
-:10310000FF000C00FF000C00FF000C00FF000C0093
-:10311000FF000C00FF000C00FF000C00FF000C0083
-:10312000FF000C00FF000C00FF0009050B040A1053
-:103130000C00FF000C00FF000C00FF000C00FF0063
-:103140000C00FF000C00FF000C00FF000C00FF0053
-:103150000C00FF000C00FF000C00FF000C00FF0043
-:103160000C00FF000C00FF000C00FF000C00FF0033
-:103170000C00FF000C00FF000C00FF000C00FF0023
-:103180000C00FF000C00FF000C00FF000C00FF0013
-:103190000C00FF000C00FF000C00FF000C00FF0003
-:1031A0000C00FF000C00FF000C00FF000C00FF00F3
-:1031B0000C00FF000C00FF000C00FF000C00FF00E3
-:1031C0000C00FF000C00FF000C00FF000C00FF00D3
-:1031D0000C00FF000C00FF000C00FF000C00FF00C3
-:1031E0000C00FF000C00FF000C00FF000C00FF00B3
-:1031F00009010B060A100D000C00FF000A120D0059
-:103200000C00FF000A140D000C00FF000A160D0050
-:103210000C00FF000A180D000C00FF000A1A0D0038
-:103220000C00FF000A1C0D000C00FF000A1E0D0020
-:103230000C00FF000A200D000C00FF000A220D0008
-:103240000C00FF000A240D000C00FF000A260D00F0
-:103250000C00FF000A280D000C00FF000A2A0D00D8
-:103260000C00FF000A2C0D000C00FF000A2E0D00C0
-:103270000C00FF000A300D000C00FF000A320D00A8
-:103280000C00FF000A340D000C00FF000A360D0090
-:103290000C00FF000A380D000C00FF000A3A0D0078
-:1032A0000C00FF000A3C0D000C00FF000A3E0D0060
-:1032B0000C00FF0009050B070A100D0F0CFFFF00A3
-:1032C0000D0F0CFFFF000D000C00FF000D000C00A7
-:1032D000FF000D000C00FF000D000C00FF000D00B2
-:1032E0000C00FF000D000C00FF000D000C00FF00A3
-:1032F0000D000C00FF000D000C00FF000D000C0085
-:10330000FF000D000C00FF000D000C00FF000D0081
-:103310000C00FF000D000C00FF000D000C00FF0072
-:103320000D000C00FF000D000C00FF000D000C0054
-:10333000FF000D000C00FF000D000C00FF000D0051
-:103340000C00FF000D000C00FF000D000C00FF0042
-:103350000D000C00FF000D000C00FF000D000C0024
-:10336000FF000D000C00FF000D000C00FF000D0021
-:103370000C00FF000D000C00FF000D000C00FF0012
-:103380000D000C00FF000D000C00FF000D000C00F4
-:10339000FF000D000C00FF000D000C00FF000D00F1
-:1033A0000C00FF000D000C00FF000D000C00FF00E2
-:1033B0000D000C00FF000D000C00FF000D000C00C4
-:1033C000FF000D000C00FF000D000C00FF000D00C1
-:1033D0000C00FF000D000C00FF000E010F00FF00AD
-:1033E0000E020F00FF000E010F01FF000E020F0082
-:1033F000FF000E010F02FF000E020F00FF000E0182
-:103400000F03FF000E020F00FF000E010F04FF006C
-:103410000E020F00FF000E010F05FF000E020F004D
-:10342000FF000E010F06FF000E020F00FF000E014D
-:103430000F07FF000E020F00FF000EB00F20FF006D
-:103440000EB10F20FF000EB20F20FF000EB30F20B1
-:10345000FF000EB40F20FF000EB50F20FF000EB6C8
-:103460000F20FF000EB70F20FF000EF00F20FF000F
-:103470000EF10F20FF000EF20F20FF000EF30F20C1
-:10348000FF000EF40F20FF000EF50F20FF000EF6D8
-:103490000F20FF000EF70F20FF000E100FFFFF00A0
-:1034A0000E110FFFFF000E120FFFFF000E130FFF94
-:1034B000FF000E140FFFFF000E150FFFFF000E168A
-:1034C0000FFFFF000E170FFFFF000E200FFFFF0082
-:1034D0000E210FFFFF000E220FFFFF000E230FFF34
-:1034E000FF000E240FFFFF000E250FFFFF000E262A
-:1034F0000FFFFF000E270FFFFF000E300F00FF0031
-:103500000E310F00FF000E320F00FF000E330F00D0
-:10351000FF000E340F00FF000E350F00FF000E36C7
-:103520000F00FF000E370F00FF000E400F00FF00DE
-:103530000E410F00FF000E420F00FF000E430F0070
-:10354000FF000E440F00FF000E450F00FF000E4667
-:103550000F00FF000E470F00FF000E500F00FF008E
-:103560000E510F00FF000E520F00FF000E530F0010
-:10357000FF000E540F00FF000E550F00FF000E5607
-:103580000F00FF000E570F00FF000E600F00FF003E
-:103590000E610F00FF000E620F00FF000E630F00B0
-:1035A000FF000E640F00FF000E650F00FF000E66A7
-:1035B0000F00FF000E670F00FF000E700FC0FF002E
-:1035C0000E710FC0FF000E720FC0FF000E730FC010
-:1035D000FF000E740FC0FF000E750FC0FF000E76C7
-:1035E0000FC0FF000E770FC0FF000E800F00FF001E
-:1035F0000E810F00FF000E820F00FF000E830F00F0
-:10360000FF000E840F00FF000E850F00FF000E86E6
-:103610000F00FF000E870F00FF000E900F00FF004D
-:103620000E910F00FF000E920F00FF000E930F008F
-:10363000FF000E940F00FF000E950F00FF000E9686
-:103640000F00FF000E970F00FF000EA00F00FF00FD
-:103650000EA10F00FF000EA20F00FF000EA30F002F
-:10366000FF000EA40F00FF000EA50F00FF000EA626
-:103670000F00FF000EA70F00FF000EC00F00FF009D
-:103680000EC10F00FF000EC20F00FF000EC30F009F
-:10369000FF000EC40F00FF000EC50F00FF000EC696
-:1036A0000F00FF000EC70F00FF000ED00F00FF003D
-:1036B0000ED10F00FF000ED20F00FF000ED30F003F
-:1036C000FF000ED40F00FF000ED50F00FF000ED636
-:1036D0000F00FF000ED70F00FF000EE00F00FF00ED
-:1036E0000EE10F00FF000EE20F00FF000EE30F00DF
-:1036F000FF000EE40F00FF000EE50F00FF000EE6D6
-:103700000F00FF000EE70F00FF000E010F00FF008B
-:103710000E020F01FF000E010F01FF000E020F014C
-:10372000FF000E010F02FF000E020F01FF000E014D
-:103730000F03FF000E020F01FF000E010F04FF0038
-:103740000E020F01FF000E010F05FF000E020F0118
-:10375000FF000E010F06FF000E020F01FF000E0119
-:103760000F07FF000E020F01FF000B070A460D00B6
-:103770000C00FF000B070A490D000C00FF000B07AF
-:103780000A450D0F0CFFFF000B070A480D0F0CFF39
-:10379000FF000B070A7B0D040CCCFF000B070A7D12
-:1037A0000D040CCCFF000B070A7C0D000C00FF0081
-:1037B0000B070A7E0D000C00FF000B070A460D00E8
-:1037C0000C00FF000B070A490D000C00FF000B075F
-:1037D0000A470D000C00FF000B070A4A0D000C0001
-:1037E000FF000B070A4C0D000C00FF000B070A4EF0
-:1037F0000D000C00FF000B070A4C0D000C000B071E
-:103800000A4E0D000C000B070A4C0D000C280B078C
-:103810000A4E0D000C280B070A4C0D000C510B072B
-:103820000A4E0D000C510B070A4C0D000C7A0B07C9
-:103830000A4E0D000C7A0B070A4C0D000CA30B0767
-:103840000A4E0D000CA30B070A4C0D000CCC0B0705
-:103850000A4E0D000CCC0B070A4C0D000CF50B07A3
-:103860000A4E0D000CF50B070A4C0D010C1E0B0740
-:103870000A4E0D010C1E0B070A4C0D010C470B07DD
-:103880000A4E0D010C470B070A4C0D010C700B077B
-:103890000A4E0D010C700B070A4C0D010C990B0719
-:1038A0000A4E0D010C990B070A4C0D010CC20B07B7
-:1038B0000A4E0D010CC20B070A4C0D010CEB0B0755
-:1038C0000A4E0D010CEB0B070A4C0D020C140B07F2
-:1038D0000A4E0D020C140B070A4C0D020C3D0B078F
-:1038E0000A4E0D020C3D0B070A4C0D020C660B072D
-:1038F0000A4E0D020C660B070A4C0D020C8F0B07CB
-:103900000A4E0D020C8F0B070A4C0D020CB80B0768
-:103910000A4E0D020CB80B070A4C0D020CE10B0706
-:103920000A4E0D020CE10B070A4C0D030C0A0B07A3
-:103930000A4E0D030C0A0B070A4C0D030C330B0740
-:103940000A4E0D030C330B070A4C0D030C5C0B07DE
-:103950000A4E0D030C5C0B070A4C0D030C850B077C
-:103960000A4E0D030C850B070A4C0D030CAE0B071A
-:103970000A4E0D030CAE0B070A4C0D030CD70B07B8
-:103980000A4E0D030CD70B070A4C0D040C000B0755
-:103990000A4E0D040C000B070A4C0D040C280B07F3
-:1039A0000A4E0D040C280B070A4C0D040C510B0792
-:1039B0000A4E0D040C510B070A4C0D040C7A0B0730
-:1039C0000A4E0D040C7A0B070A4C0D040CA30B07CE
-:1039D0000A4E0D040CA30B070A4C0D040CCC0B076C
-:1039E0000A4E0D040CCC0B070A4C0D040CF50B070A
-:1039F0000A4E0D040CF50B070A4C0D050C1E0B07A7
-:103A00000A4E0D050C1E0B070A4C0D050C470B0743
-:103A10000A4E0D050C470B070A4C0D050C700B07E1
-:103A20000A4E0D050C700B070A4C0D050C990B077F
-:103A30000A4E0D050C990B070A4C0D050CC20B071D
-:103A40000A4E0D050CC20B070A4C0D050CEB0B07BB
-:103A50000A4E0D050CEB0B070A4C0D060C140B0758
-:103A60000A4E0D060C140B070A4C0D060C3D0B07F5
-:103A70000A4E0D060C3D0B070A4C0D060C660B0793
-:103A80000A4E0D060C660B070A4C0D060C8F0B0731
-:103A90000A4E0D060C8F0B070A4C0D060CB80B07CF
-:103AA0000A4E0D060CB80B070A4C0D060CE10B076D
-:103AB0000A4E0D060CE10B070A4C0D070C0A0B070A
-:103AC0000A4E0D070C0A0B070A4C0D070C330B07A7
-:103AD0000A4E0D070C330B070A4C0D070C5C0B0745
-:103AE0000A4E0D070C5C0B070A4C0D070C850B07E3
-:103AF0000A4E0D070C850B070A4C0D070CAE0B0781
-:103B00000A4E0D070CAE0B070A4C0D070CD70B071E
-:103B10000A4E0D070CD70B070A4C0D080C000B07BB
-:103B20000A4E0D080C000B070A4C0D080C280B0759
-:103B30000A4E0D080C280B070A4C0D080C510B07F8
-:103B40000A4E0D080C510B070A4C0D080C7A0B0796
-:103B50000A4E0D080C7A0B070A4C0D080CA30B0734
-:103B60000A4E0D080CA30B070A4C0D080CCC0B07D2
-:103B70000A4E0D080CCC0B070A4C0D080CF50B0770
-:103B80000A4E0D080CF50B070A4C0D090C1E0B070D
-:103B90000A4E0D090C1E0B070A4C0D090C470B07AA
-:103BA0000A4E0D090C470B070A4C0D090C700B0748
-:103BB0000A4E0D090C700B070A4C0D090C990B07E6
-:103BC0000A4E0D090C990B070A4C0D090CC20B0784
-:103BD0000A4E0D090CC20B070A4C0D090CEB0B0722
-:103BE0000A4E0D090CEB0B070A4C0D0A0C140B07BF
-:103BF0000A4E0D0A0C140B070A4C0D0A0C3D0B075C
-:103C00000A4E0D0A0C3D0B070A4C0D0A0C660B07F9
-:103C10000A4E0D0A0C660B070A4C0D0A0C8F0B0797
-:103C20000A4E0D0A0C8F0B070A4C0D0A0CB80B0735
-:103C30000A4E0D0A0CB80B070A4C0D0A0CE10B07D3
-:103C40000A4E0D0A0CE10B070A4C0D0B0C0A0B0770
-:103C50000A4E0D0B0C0A0B070A4C0D0B0C330B070D
-:103C60000A4E0D0B0C330B070A4C0D0B0C5C0B07AB
-:103C70000A4E0D0B0C5C0B070A4C0D0B0C850B0749
-:103C80000A4E0D0B0C850B070A4C0D0B0CAE0B07E7
-:103C90000A4E0D0B0CAE0B070A4C0D0B0CD70B0785
-:103CA0000A4E0D0B0CD70B070A4C0D0C0C000B0722
-:103CB0000A4E0D0C0C000B070A4C0D0C0C280B07C0
-:103CC0000A4E0D0C0C280B070A4C0D0C0C510B075F
-:103CD0000A4E0D0C0C510B070A4C0D0C0C7A0B07FD
-:103CE0000A4E0D0C0C7A0B070A4C0D0C0CA30B079B
-:103CF0000A4E0D0C0CA30B070A4C0D0C0CCC0B0739
-:103D00000A4E0D0C0CCC0B070A4C0D0C0CF50B07D6
-:103D10000A4E0D0C0CF50B070A4C0D0D0C1E0B0773
-:103D20000A4E0D0D0C1E0B070A4C0D0D0C470B0710
-:103D30000A4E0D0D0C470B070A4C0D0D0C700B07AE
-:103D40000A4E0D0D0C700B070A4C0D0D0C990B074C
-:103D50000A4E0D0D0C990B070A4C0D0D0CC20B07EA
-:103D60000A4E0D0D0CC20B070A4C0D0D0CEB0B0788
-:103D70000A4E0D0D0CEB0B070A4C0D0E0C140B0725
-:103D80000A4E0D0E0C140B070A4C0D0E0C3D0B07C2
-:103D90000A4E0D0E0C3D0B070A4C0D0E0C660B0760
-:103DA0000A4E0D0E0C660B070A4C0D0E0C8F0B07FE
-:103DB0000A4E0D0E0C8F0B070A4C0D0E0CB80B079C
-:103DC0000A4E0D0E0CB80B070A4C0D0E0CE10B073A
-:103DD0000A4E0D0E0CE10B070A4C0D0F0C0A0B07D7
-:103DE0000A4E0D0F0C0A0B070A4C0D0F0C330B0774
-:103DF0000A4E0D0F0C330B070A4C0D0F0C5C0B0712
-:103E00000A4E0D0F0C5C0B070A4C0D0F0C850B07AF
-:103E10000A4E0D0F0C850B070A4C0D0F0CAE0B074D
-:103E20000A4E0D0F0CAE0B070A4C0D0F0CD70B07EB
-:103E30000A4E0D0F0CD70B070A4C0D0F0CFF0B078A
-:0A3E40000A4E0D0F0CFF0800FF00F2
-:00000001FF
diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c
index b573c3b9a328..8cf941c3b511 100644
--- a/fs/affs/amigaffs.c
+++ b/fs/affs/amigaffs.c
@@ -450,7 +450,7 @@ affs_error(struct super_block *sb, const char *function, const char *fmt, ...)
vaf.fmt = fmt;
vaf.va = &args;
pr_crit("error (device %s): %s(): %pV\n", sb->s_id, function, &vaf);
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
pr_warn("Remounting filesystem read-only\n");
sb->s_flags |= MS_RDONLY;
va_end(args);
diff --git a/fs/affs/bitmap.c b/fs/affs/bitmap.c
index 675148950fed..2b2112475ec2 100644
--- a/fs/affs/bitmap.c
+++ b/fs/affs/bitmap.c
@@ -19,7 +19,7 @@ affs_count_free_blocks(struct super_block *sb)
pr_debug("%s()\n", __func__);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
mutex_lock(&AFFS_SB(sb)->s_bmlock);
diff --git a/fs/affs/super.c b/fs/affs/super.c
index 7bf47a41cb4f..884bedab7266 100644
--- a/fs/affs/super.c
+++ b/fs/affs/super.c
@@ -80,7 +80,7 @@ void affs_mark_sb_dirty(struct super_block *sb)
struct affs_sb_info *sbi = AFFS_SB(sb);
unsigned long delay;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
spin_lock(&sbi->work_lock);
@@ -464,7 +464,7 @@ got_root:
* not recommended.
*/
if ((chksum == FS_DCFFS || chksum == MUFS_DCFFS || chksum == FS_DCOFS
- || chksum == MUFS_DCOFS) && !(sb->s_flags & MS_RDONLY)) {
+ || chksum == MUFS_DCOFS) && !sb_rdonly(sb)) {
pr_notice("Dircache FS - mounting %s read only\n", sb->s_id);
sb->s_flags |= MS_RDONLY;
}
@@ -596,7 +596,7 @@ affs_remount(struct super_block *sb, int *flags, char *data)
memcpy(sbi->s_volume, volume, 32);
spin_unlock(&sbi->symlink_lock);
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
return 0;
if (*flags & MS_RDONLY)
diff --git a/fs/aio.c b/fs/aio.c
index b5d69f28d8b1..5a2487217072 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1606,12 +1606,6 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
goto out_put_req;
}
- if ((req->common.ki_flags & IOCB_NOWAIT) &&
- !(req->common.ki_flags & IOCB_DIRECT)) {
- ret = -EOPNOTSUPP;
- goto out_put_req;
- }
-
ret = put_user(KIOCB_KEY, &user_iocb->aio_key);
if (unlikely(ret)) {
pr_debug("EFAULT: aio_key\n");
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
index 24a58bf9ca72..4ac49d038bf3 100644
--- a/fs/autofs4/waitq.c
+++ b/fs/autofs4/waitq.c
@@ -56,19 +56,14 @@ static int autofs4_write(struct autofs_sb_info *sbi,
struct file *file, const void *addr, int bytes)
{
unsigned long sigpipe, flags;
- mm_segment_t fs;
const char *data = (const char *)addr;
ssize_t wr = 0;
sigpipe = sigismember(&current->pending.signal, SIGPIPE);
- /* Save pointer to user space and point back to kernel space */
- fs = get_fs();
- set_fs(KERNEL_DS);
-
mutex_lock(&sbi->pipe_mutex);
while (bytes) {
- wr = __vfs_write(file, data, bytes, &file->f_pos);
+ wr = __kernel_write(file, data, bytes, &file->f_pos);
if (wr <= 0)
break;
data += wr;
@@ -76,8 +71,6 @@ static int autofs4_write(struct autofs_sb_info *sbi,
}
mutex_unlock(&sbi->pipe_mutex);
- set_fs(fs);
-
/* Keep the currently executing process from receiving a
* SIGPIPE unless it was already supposed to get one
*/
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
index 4a4a5a366158..a92355cc453b 100644
--- a/fs/befs/linuxvfs.c
+++ b/fs/befs/linuxvfs.c
@@ -838,7 +838,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
befs_debug(sb, "---> %s", __func__);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
befs_warning(sb,
"No write support. Marking filesystem read-only");
sb->s_flags |= MS_RDONLY;
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c
index 9be82c4e14a4..ce1824f47ba6 100644
--- a/fs/binfmt_aout.c
+++ b/fs/binfmt_aout.c
@@ -341,11 +341,12 @@ static int load_aout_library(struct file *file)
unsigned long error;
int retval;
struct exec ex;
+ loff_t pos = 0;
inode = file_inode(file);
retval = -ENOEXEC;
- error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
+ error = kernel_read(file, &ex, sizeof(ex), &pos);
if (error != sizeof(ex))
goto out;
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index ec45d24875b1..73b01e474fdc 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -409,6 +409,7 @@ static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
{
struct elf_phdr *elf_phdata = NULL;
int retval, size, err = -1;
+ loff_t pos = elf_ex->e_phoff;
/*
* If the size of this structure has changed, then punt, since
@@ -432,8 +433,7 @@ static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
goto out;
/* Read in the program headers */
- retval = kernel_read(elf_file, elf_ex->e_phoff,
- (char *)elf_phdata, size);
+ retval = kernel_read(elf_file, elf_phdata, size, &pos);
if (retval != size) {
err = (retval < 0) ? retval : -EIO;
goto out;
@@ -698,6 +698,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
struct elfhdr interp_elf_ex;
} *loc;
struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
+ loff_t pos;
loc = kmalloc(sizeof(*loc), GFP_KERNEL);
if (!loc) {
@@ -750,9 +751,9 @@ static int load_elf_binary(struct linux_binprm *bprm)
if (!elf_interpreter)
goto out_free_ph;
- retval = kernel_read(bprm->file, elf_ppnt->p_offset,
- elf_interpreter,
- elf_ppnt->p_filesz);
+ pos = elf_ppnt->p_offset;
+ retval = kernel_read(bprm->file, elf_interpreter,
+ elf_ppnt->p_filesz, &pos);
if (retval != elf_ppnt->p_filesz) {
if (retval >= 0)
retval = -EIO;
@@ -776,9 +777,9 @@ static int load_elf_binary(struct linux_binprm *bprm)
would_dump(bprm, interpreter);
/* Get the exec headers */
- retval = kernel_read(interpreter, 0,
- (void *)&loc->interp_elf_ex,
- sizeof(loc->interp_elf_ex));
+ pos = 0;
+ retval = kernel_read(interpreter, &loc->interp_elf_ex,
+ sizeof(loc->interp_elf_ex), &pos);
if (retval != sizeof(loc->interp_elf_ex)) {
if (retval >= 0)
retval = -EIO;
@@ -1175,9 +1176,10 @@ static int load_elf_library(struct file *file)
unsigned long elf_bss, bss, len;
int retval, error, i, j;
struct elfhdr elf_ex;
+ loff_t pos = 0;
error = -ENOEXEC;
- retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
+ retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
if (retval != sizeof(elf_ex))
goto out;
@@ -1201,7 +1203,8 @@ static int load_elf_library(struct file *file)
eppnt = elf_phdata;
error = -ENOEXEC;
- retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
+ pos = elf_ex.e_phoff;
+ retval = kernel_read(file, eppnt, j, &pos);
if (retval != j)
goto out_free_ph;
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index 5aa9199dfb13..e70c039ac190 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -145,6 +145,7 @@ static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
struct elf32_phdr *phdr;
unsigned long size;
int retval, loop;
+ loff_t pos = params->hdr.e_phoff;
if (params->hdr.e_phentsize != sizeof(struct elf_phdr))
return -ENOMEM;
@@ -156,8 +157,7 @@ static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
if (!params->phdrs)
return -ENOMEM;
- retval = kernel_read(file, params->hdr.e_phoff,
- (char *) params->phdrs, size);
+ retval = kernel_read(file, params->phdrs, size, &pos);
if (unlikely(retval != size))
return retval < 0 ? retval : -ENOEXEC;
@@ -199,6 +199,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
char *interpreter_name = NULL;
int executable_stack;
int retval, i;
+ loff_t pos;
kdebug("____ LOAD %d ____", current->pid);
@@ -246,10 +247,9 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
if (!interpreter_name)
goto error;
- retval = kernel_read(bprm->file,
- phdr->p_offset,
- interpreter_name,
- phdr->p_filesz);
+ pos = phdr->p_offset;
+ retval = kernel_read(bprm->file, interpreter_name,
+ phdr->p_filesz, &pos);
if (unlikely(retval != phdr->p_filesz)) {
if (retval >= 0)
retval = -ENOEXEC;
@@ -277,8 +277,9 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
*/
would_dump(bprm, interpreter);
- retval = kernel_read(interpreter, 0, bprm->buf,
- BINPRM_BUF_SIZE);
+ pos = 0;
+ retval = kernel_read(interpreter, bprm->buf,
+ BINPRM_BUF_SIZE, &pos);
if (unlikely(retval != BINPRM_BUF_SIZE)) {
if (retval >= 0)
retval = -ENOEXEC;
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index ce6537c50ec1..475d083f8088 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -176,19 +176,14 @@ static int create_flat_tables(struct linux_binprm *bprm, unsigned long arg_start
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
#define RESERVED 0xC0 /* bit 6,7: reserved */
-static int decompress_exec(
- struct linux_binprm *bprm,
- unsigned long offset,
- char *dst,
- long len,
- int fd)
+static int decompress_exec(struct linux_binprm *bprm, loff_t fpos, char *dst,
+ long len, int fd)
{
unsigned char *buf;
z_stream strm;
- loff_t fpos;
int ret, retval;
- pr_debug("decompress_exec(offset=%lx,buf=%p,len=%lx)\n", offset, dst, len);
+ pr_debug("decompress_exec(offset=%llx,buf=%p,len=%lx)\n", fpos, dst, len);
memset(&strm, 0, sizeof(strm));
strm.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
@@ -202,13 +197,11 @@ static int decompress_exec(
}
/* Read in first chunk of data and parse gzip header. */
- fpos = offset;
- ret = kernel_read(bprm->file, offset, buf, LBUFSIZE);
+ ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos);
strm.next_in = buf;
strm.avail_in = ret;
strm.total_in = 0;
- fpos += ret;
retval = -ENOEXEC;
@@ -274,7 +267,7 @@ static int decompress_exec(
}
while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) {
- ret = kernel_read(bprm->file, fpos, buf, LBUFSIZE);
+ ret = kernel_read(bprm->file, buf, LBUFSIZE, &fpos);
if (ret <= 0)
break;
len -= ret;
@@ -282,7 +275,6 @@ static int decompress_exec(
strm.next_in = buf;
strm.avail_in = ret;
strm.total_in = 0;
- fpos += ret;
}
if (ret < 0) {
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index f4718098ac31..2a46762def31 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -54,7 +54,7 @@ typedef struct {
int size; /* size of magic/mask */
char *magic; /* magic or filename extension */
char *mask; /* mask, NULL for exact match */
- char *interpreter; /* filename of interpreter */
+ const char *interpreter; /* filename of interpreter */
char *name;
struct dentry *dentry;
struct file *interp_file;
@@ -131,27 +131,26 @@ static int load_misc_binary(struct linux_binprm *bprm)
{
Node *fmt;
struct file *interp_file = NULL;
- char iname[BINPRM_BUF_SIZE];
- const char *iname_addr = iname;
int retval;
int fd_binary = -1;
retval = -ENOEXEC;
if (!enabled)
- goto ret;
+ return retval;
/* to keep locking time low, we copy the interpreter string */
read_lock(&entries_lock);
fmt = check_file(bprm);
if (fmt)
- strlcpy(iname, fmt->interpreter, BINPRM_BUF_SIZE);
+ dget(fmt->dentry);
read_unlock(&entries_lock);
if (!fmt)
- goto ret;
+ return retval;
/* Need to be able to load the file after exec */
+ retval = -ENOENT;
if (bprm->interp_flags & BINPRM_FLAGS_PATH_INACCESSIBLE)
- return -ENOENT;
+ goto ret;
if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
retval = remove_arg_zero(bprm);
@@ -195,22 +194,22 @@ static int load_misc_binary(struct linux_binprm *bprm)
bprm->argc++;
/* add the interp as argv[0] */
- retval = copy_strings_kernel(1, &iname_addr, bprm);
+ retval = copy_strings_kernel(1, &fmt->interpreter, bprm);
if (retval < 0)
goto error;
bprm->argc++;
/* Update interp in case binfmt_script needs it. */
- retval = bprm_change_interp(iname, bprm);
+ retval = bprm_change_interp(fmt->interpreter, bprm);
if (retval < 0)
goto error;
- if (fmt->flags & MISC_FMT_OPEN_FILE && fmt->interp_file) {
+ if (fmt->flags & MISC_FMT_OPEN_FILE) {
interp_file = filp_clone_open(fmt->interp_file);
if (!IS_ERR(interp_file))
deny_write_access(interp_file);
} else {
- interp_file = open_exec(iname);
+ interp_file = open_exec(fmt->interpreter);
}
retval = PTR_ERR(interp_file);
if (IS_ERR(interp_file))
@@ -218,12 +217,15 @@ static int load_misc_binary(struct linux_binprm *bprm)
bprm->file = interp_file;
if (fmt->flags & MISC_FMT_CREDENTIALS) {
+ loff_t pos = 0;
+
/*
* No need to call prepare_binprm(), it's already been
* done. bprm->buf is stale, update from interp_file.
*/
memset(bprm->buf, 0, BINPRM_BUF_SIZE);
- retval = kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE);
+ retval = kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE,
+ &pos);
} else
retval = prepare_binprm(bprm);
@@ -235,6 +237,7 @@ static int load_misc_binary(struct linux_binprm *bprm)
goto error;
ret:
+ dput(fmt->dentry);
return retval;
error:
if (fd_binary > 0)
@@ -591,8 +594,13 @@ static struct inode *bm_get_inode(struct super_block *sb, int mode)
static void bm_evict_inode(struct inode *inode)
{
+ Node *e = inode->i_private;
+
+ if (e->flags & MISC_FMT_OPEN_FILE)
+ filp_close(e->interp_file, NULL);
+
clear_inode(inode);
- kfree(inode->i_private);
+ kfree(e);
}
static void kill_node(Node *e)
@@ -600,24 +608,14 @@ static void kill_node(Node *e)
struct dentry *dentry;
write_lock(&entries_lock);
- dentry = e->dentry;
- if (dentry) {
- list_del_init(&e->list);
- e->dentry = NULL;
- }
+ list_del_init(&e->list);
write_unlock(&entries_lock);
- if ((e->flags & MISC_FMT_OPEN_FILE) && e->interp_file) {
- filp_close(e->interp_file, NULL);
- e->interp_file = NULL;
- }
-
- if (dentry) {
- drop_nlink(d_inode(dentry));
- d_drop(dentry);
- dput(dentry);
- simple_release_fs(&bm_mnt, &entry_count);
- }
+ dentry = e->dentry;
+ drop_nlink(d_inode(dentry));
+ d_drop(dentry);
+ dput(dentry);
+ simple_release_fs(&bm_mnt, &entry_count);
}
/* /<entry> */
@@ -662,7 +660,8 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer,
root = file_inode(file)->i_sb->s_root;
inode_lock(d_inode(root));
- kill_node(e);
+ if (!list_empty(&e->list))
+ kill_node(e);
inode_unlock(d_inode(root));
break;
@@ -791,7 +790,7 @@ static ssize_t bm_status_write(struct file *file, const char __user *buffer,
inode_lock(d_inode(root));
while (!list_empty(&entries))
- kill_node(list_entry(entries.next, Node, list));
+ kill_node(list_first_entry(&entries, Node, list));
inode_unlock(d_inode(root));
break;
diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
index afdf4e3cafc2..7cde3f46ad26 100644
--- a/fs/binfmt_script.c
+++ b/fs/binfmt_script.c
@@ -19,7 +19,6 @@ static int load_script(struct linux_binprm *bprm)
const char *i_arg, *i_name;
char *cp;
struct file *file;
- char interp[BINPRM_BUF_SIZE];
int retval;
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
@@ -55,7 +54,7 @@ static int load_script(struct linux_binprm *bprm)
break;
}
for (cp = bprm->buf+2; (*cp == ' ') || (*cp == '\t'); cp++);
- if (*cp == '\0')
+ if (*cp == '\0')
return -ENOEXEC; /* No interpreter name found */
i_name = cp;
i_arg = NULL;
@@ -65,7 +64,6 @@ static int load_script(struct linux_binprm *bprm)
*cp++ = '\0';
if (*cp)
i_arg = cp;
- strcpy (interp, i_name);
/*
* OK, we've parsed out the interpreter name and
* (optional) argument.
@@ -80,24 +78,27 @@ static int load_script(struct linux_binprm *bprm)
if (retval)
return retval;
retval = copy_strings_kernel(1, &bprm->interp, bprm);
- if (retval < 0) return retval;
+ if (retval < 0)
+ return retval;
bprm->argc++;
if (i_arg) {
retval = copy_strings_kernel(1, &i_arg, bprm);
- if (retval < 0) return retval;
+ if (retval < 0)
+ return retval;
bprm->argc++;
}
retval = copy_strings_kernel(1, &i_name, bprm);
- if (retval) return retval;
+ if (retval)
+ return retval;
bprm->argc++;
- retval = bprm_change_interp(interp, bprm);
+ retval = bprm_change_interp(i_name, bprm);
if (retval < 0)
return retval;
/*
* OK, now restart the process with the interpreter's dentry.
*/
- file = open_exec(interp);
+ file = open_exec(i_name);
if (IS_ERR(file))
return PTR_ERR(file);
diff --git a/fs/block_dev.c b/fs/block_dev.c
index bb715b2fcfb8..93d088ffc05c 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1740,6 +1740,8 @@ static int blkdev_open(struct inode * inode, struct file * filp)
*/
filp->f_flags |= O_LARGEFILE;
+ filp->f_mode |= FMODE_NOWAIT;
+
if (filp->f_flags & O_NDELAY)
filp->f_mode |= FMODE_NDELAY;
if (filp->f_flags & O_EXCL)
@@ -1892,6 +1894,9 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (iocb->ki_pos >= size)
return -ENOSPC;
+ if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT)
+ return -EOPNOTSUPP;
+
iov_iter_truncate(from, size - iocb->ki_pos);
blk_start_plug(&plug);
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
index 80e9c18ea64f..a26c63b4ad68 100644
--- a/fs/btrfs/Kconfig
+++ b/fs/btrfs/Kconfig
@@ -6,6 +6,8 @@ config BTRFS_FS
select ZLIB_DEFLATE
select LZO_COMPRESS
select LZO_DECOMPRESS
+ select ZSTD_COMPRESS
+ select ZSTD_DECOMPRESS
select RAID6_PQ
select XOR_BLOCKS
select SRCU
diff --git a/fs/btrfs/Makefile b/fs/btrfs/Makefile
index 128ce17a80b0..962a95aefb81 100644
--- a/fs/btrfs/Makefile
+++ b/fs/btrfs/Makefile
@@ -6,7 +6,7 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
transaction.o inode.o file.o tree-defrag.o \
extent_map.o sysfs.o struct-funcs.o xattr.o ordered-data.o \
extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o \
- export.o tree-log.o free-space-cache.o zlib.o lzo.o \
+ export.o tree-log.o free-space-cache.o zlib.o lzo.o zstd.o \
compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
reada.o backref.o ulist.o qgroup.o send.o dev-replace.o raid56.o \
uuid-tree.o props.o hash.o free-space-tree.o
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 883ecc58fd0d..280384bf34f1 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -107,7 +107,8 @@ static void end_compressed_bio_read(struct bio *bio)
struct inode *inode;
struct page *page;
unsigned long index;
- int ret;
+ unsigned int mirror = btrfs_io_bio(bio)->mirror_num;
+ int ret = 0;
if (bio->bi_status)
cb->errors = 1;
@@ -118,6 +119,21 @@ static void end_compressed_bio_read(struct bio *bio)
if (!refcount_dec_and_test(&cb->pending_bios))
goto out;
+ /*
+ * Record the correct mirror_num in cb->orig_bio so that
+ * read-repair can work properly.
+ */
+ ASSERT(btrfs_io_bio(cb->orig_bio));
+ btrfs_io_bio(cb->orig_bio)->mirror_num = mirror;
+ cb->mirror_num = mirror;
+
+ /*
+ * Some IO in this cb have failed, just skip checksum as there
+ * is no way it could be correct.
+ */
+ if (cb->errors == 1)
+ goto csum_failed;
+
inode = cb->inode;
ret = check_compressed_csum(BTRFS_I(inode), cb,
(u64)bio->bi_iter.bi_sector << 9);
@@ -704,6 +720,7 @@ static struct {
static const struct btrfs_compress_op * const btrfs_compress_op[] = {
&btrfs_zlib_compress,
&btrfs_lzo_compress,
+ &btrfs_zstd_compress,
};
void __init btrfs_init_compress(void)
diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h
index 3b1b0ac15fdc..d2781ff8f994 100644
--- a/fs/btrfs/compression.h
+++ b/fs/btrfs/compression.h
@@ -99,7 +99,8 @@ enum btrfs_compression_type {
BTRFS_COMPRESS_NONE = 0,
BTRFS_COMPRESS_ZLIB = 1,
BTRFS_COMPRESS_LZO = 2,
- BTRFS_COMPRESS_TYPES = 2,
+ BTRFS_COMPRESS_ZSTD = 3,
+ BTRFS_COMPRESS_TYPES = 3,
};
struct btrfs_compress_op {
@@ -127,6 +128,7 @@ struct btrfs_compress_op {
extern const struct btrfs_compress_op btrfs_zlib_compress;
extern const struct btrfs_compress_op btrfs_lzo_compress;
+extern const struct btrfs_compress_op btrfs_zstd_compress;
int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end);
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 2add002662f4..899ddaeeacec 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -270,6 +270,7 @@ struct btrfs_super_block {
BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS | \
BTRFS_FEATURE_INCOMPAT_BIG_METADATA | \
BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO | \
+ BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD | \
BTRFS_FEATURE_INCOMPAT_RAID56 | \
BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF | \
BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA | \
@@ -708,7 +709,6 @@ struct btrfs_delayed_root;
#define BTRFS_FS_OPEN 5
#define BTRFS_FS_QUOTA_ENABLED 6
#define BTRFS_FS_QUOTA_ENABLING 7
-#define BTRFS_FS_QUOTA_DISABLING 8
#define BTRFS_FS_UPDATE_UUID_TREE_GEN 9
#define BTRFS_FS_CREATING_FREE_SPACE_TREE 10
#define BTRFS_FS_BTREE_ERR 11
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 7a93a3e1a847..7c655f9a7a50 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -704,7 +704,7 @@ static u64 __btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info)
u64 result;
int ret;
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
return -EROFS;
mutex_lock(&dev_replace->lock_finishing_cancel_unmount);
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 46329524dd5f..dfdab849037b 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2478,7 +2478,7 @@ static int btrfs_replay_log(struct btrfs_fs_info *fs_info,
return ret;
}
- if (fs_info->sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(fs_info->sb)) {
ret = btrfs_commit_super(fs_info);
if (ret)
return ret;
@@ -2828,6 +2828,8 @@ int open_ctree(struct super_block *sb,
features |= BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF;
if (fs_info->compress_type == BTRFS_COMPRESS_LZO)
features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO;
+ else if (fs_info->compress_type == BTRFS_COMPRESS_ZSTD)
+ features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD;
if (features & BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA)
btrfs_info(fs_info, "has skinny extents");
@@ -2874,7 +2876,7 @@ int open_ctree(struct super_block *sb,
features = btrfs_super_compat_ro_flags(disk_super) &
~BTRFS_FEATURE_COMPAT_RO_SUPP;
- if (!(sb->s_flags & MS_RDONLY) && features) {
+ if (!sb_rdonly(sb) && features) {
btrfs_err(fs_info,
"cannot mount read-write because of unsupported optional features (%llx)",
features);
@@ -3036,7 +3038,7 @@ retry_root_backup:
goto fail_sysfs;
}
- if (!(sb->s_flags & MS_RDONLY) && !btrfs_check_rw_degradable(fs_info)) {
+ if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info)) {
btrfs_warn(fs_info,
"writeable mount is not allowed due to too many missing devices");
goto fail_sysfs;
@@ -3095,7 +3097,7 @@ retry_root_backup:
if (ret)
goto fail_qgroup;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
ret = btrfs_cleanup_fs_roots(fs_info);
if (ret)
goto fail_qgroup;
@@ -3121,7 +3123,7 @@ retry_root_backup:
goto fail_qgroup;
}
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
if (btrfs_test_opt(fs_info, CLEAR_CACHE) &&
@@ -3641,7 +3643,14 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
u64 flags;
do_barriers = !btrfs_test_opt(fs_info, NOBARRIER);
- backup_super_roots(fs_info);
+
+ /*
+ * max_mirrors == 0 indicates we're from commit_transaction,
+ * not from fsync where the tree roots in fs_info have not
+ * been consistent on disk.
+ */
+ if (max_mirrors == 0)
+ backup_super_roots(fs_info);
sb = fs_info->super_for_commit;
dev_item = &sb->dev_item;
@@ -3876,7 +3885,7 @@ void close_ctree(struct btrfs_fs_info *fs_info)
cancel_work_sync(&fs_info->async_reclaim_work);
- if (!(fs_info->sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(fs_info->sb)) {
/*
* If the cleaner thread is stopped and there are
* block groups queued for removal, the deletion will be
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 0f077c5db58e..12ab19a4b93e 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2060,7 +2060,7 @@ int repair_eb_io_failure(struct btrfs_fs_info *fs_info,
unsigned long i, num_pages = num_extent_pages(eb->start, eb->len);
int ret = 0;
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
return -EROFS;
for (i = 0; i < num_pages; i++) {
@@ -2110,7 +2110,7 @@ int clean_io_failure(struct btrfs_fs_info *fs_info,
failrec->start);
goto out;
}
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
goto out;
spin_lock(&io_tree->lock);
@@ -3471,8 +3471,7 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
unsigned int write_flags = 0;
unsigned long nr_written = 0;
- if (wbc->sync_mode == WB_SYNC_ALL)
- write_flags = REQ_SYNC;
+ write_flags = wbc_to_write_flags(wbc);
trace___extent_writepage(page, inode, wbc);
@@ -3718,7 +3717,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
unsigned long i, num_pages;
unsigned long bio_flags = 0;
unsigned long start, end;
- unsigned int write_flags = (epd->sync_io ? REQ_SYNC : 0) | REQ_META;
+ unsigned int write_flags = wbc_to_write_flags(wbc) | REQ_META;
int ret = 0;
clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags);
@@ -4063,9 +4062,6 @@ static void flush_epd_write_bio(struct extent_page_data *epd)
if (epd->bio) {
int ret;
- bio_set_op_attrs(epd->bio, REQ_OP_WRITE,
- epd->sync_io ? REQ_SYNC : 0);
-
ret = submit_one_bio(epd->bio, 0, epd->bio_flags);
BUG_ON(ret < 0); /* -ENOMEM */
epd->bio = NULL;
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 74fd7756cff3..aafcc785f840 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1886,6 +1886,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
loff_t oldsize;
int clean_page = 0;
+ if (!(iocb->ki_flags & IOCB_DIRECT) &&
+ (iocb->ki_flags & IOCB_NOWAIT))
+ return -EOPNOTSUPP;
+
if (!inode_trylock(inode)) {
if (iocb->ki_flags & IOCB_NOWAIT)
return -EAGAIN;
@@ -3112,7 +3116,7 @@ out:
static int btrfs_file_open(struct inode *inode, struct file *filp)
{
- filp->f_mode |= FMODE_AIO_NOWAIT;
+ filp->f_mode |= FMODE_NOWAIT;
return generic_file_open(inode, filp);
}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 17ad018da0a2..d94e3f68b9b1 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -135,6 +135,18 @@ static inline void btrfs_cleanup_ordered_extents(struct inode *inode,
const u64 offset,
const u64 bytes)
{
+ unsigned long index = offset >> PAGE_SHIFT;
+ unsigned long end_index = (offset + bytes - 1) >> PAGE_SHIFT;
+ struct page *page;
+
+ while (index <= end_index) {
+ page = find_get_page(inode->i_mapping, index);
+ index++;
+ if (!page)
+ continue;
+ ClearPagePrivate2(page);
+ put_page(page);
+ }
return __endio_write_update_ordered(inode, offset + PAGE_SIZE,
bytes - PAGE_SIZE, false);
}
@@ -5821,7 +5833,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
if (!IS_ERR(inode) && root != sub_root) {
down_read(&fs_info->cleanup_work_sem);
- if (!(inode->i_sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(inode->i_sb))
ret = btrfs_orphan_cleanup(sub_root);
up_read(&fs_info->cleanup_work_sem);
if (ret) {
@@ -8357,11 +8369,8 @@ static void btrfs_endio_direct_read(struct bio *bio)
struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
blk_status_t err = bio->bi_status;
- if (dip->flags & BTRFS_DIO_ORIG_BIO_SUBMITTED) {
+ if (dip->flags & BTRFS_DIO_ORIG_BIO_SUBMITTED)
err = btrfs_subio_endio_read(inode, io_bio, err);
- if (!err)
- bio->bi_status = 0;
- }
unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset,
dip->logical_offset + dip->bytes - 1);
@@ -8369,7 +8378,7 @@ static void btrfs_endio_direct_read(struct bio *bio)
kfree(dip);
- dio_bio->bi_status = bio->bi_status;
+ dio_bio->bi_status = err;
dio_end_io(dio_bio);
if (io_bio->end_io)
@@ -8387,6 +8396,7 @@ static void __endio_write_update_ordered(struct inode *inode,
btrfs_work_func_t func;
u64 ordered_offset = offset;
u64 ordered_bytes = bytes;
+ u64 last_offset;
int ret;
if (btrfs_is_free_space_inode(BTRFS_I(inode))) {
@@ -8398,6 +8408,7 @@ static void __endio_write_update_ordered(struct inode *inode,
}
again:
+ last_offset = ordered_offset;
ret = btrfs_dec_test_first_ordered_pending(inode, &ordered,
&ordered_offset,
ordered_bytes,
@@ -8409,6 +8420,12 @@ again:
btrfs_queue_work(wq, &ordered->work);
out_test:
/*
+ * If btrfs_dec_test_ordered_pending does not find any ordered extent
+ * in the range, we can exit.
+ */
+ if (ordered_offset == last_offset)
+ return;
+ /*
* our bio might span multiple ordered extents. If we haven't
* completed the accounting for the whole dio, go back and try again
*/
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index ae8fbf9d3de2..6c7a49faf4e0 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -296,8 +296,10 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
if (fs_info->compress_type == BTRFS_COMPRESS_LZO)
comp = "lzo";
- else
+ else if (fs_info->compress_type == BTRFS_COMPRESS_ZLIB)
comp = "zlib";
+ else
+ comp = "zstd";
ret = btrfs_set_prop(inode, "btrfs.compression",
comp, strlen(comp), 0);
if (ret)
@@ -1435,6 +1437,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
if (range->compress_type == BTRFS_COMPRESS_LZO) {
btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
+ } else if (range->compress_type == BTRFS_COMPRESS_ZSTD) {
+ btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
}
ret = defrag_count;
@@ -2769,9 +2773,9 @@ static long btrfs_ioctl_fs_info(struct btrfs_fs_info *fs_info,
}
mutex_unlock(&fs_devices->device_list_mutex);
- fi_args->nodesize = fs_info->super_copy->nodesize;
- fi_args->sectorsize = fs_info->super_copy->sectorsize;
- fi_args->clone_alignment = fs_info->super_copy->sectorsize;
+ fi_args->nodesize = fs_info->nodesize;
+ fi_args->sectorsize = fs_info->sectorsize;
+ fi_args->clone_alignment = fs_info->sectorsize;
if (copy_to_user(arg, fi_args, sizeof(*fi_args)))
ret = -EFAULT;
@@ -3028,7 +3032,7 @@ static int btrfs_cmp_data_prepare(struct inode *src, u64 loff,
out:
if (ret)
btrfs_cmp_data_free(cmp);
- return 0;
+ return ret;
}
static int btrfs_cmp_data(u64 len, struct cmp_pages *cmp)
@@ -4057,6 +4061,10 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
ret = PTR_ERR(new_root);
goto out;
}
+ if (!is_fstree(new_root->objectid)) {
+ ret = -ENOENT;
+ goto out;
+ }
path = btrfs_alloc_path();
if (!path) {
@@ -4422,7 +4430,7 @@ static long btrfs_ioctl_dev_replace(struct btrfs_fs_info *fs_info,
switch (p->cmd) {
case BTRFS_IOCTL_DEV_REPLACE_CMD_START:
- if (fs_info->sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(fs_info->sb)) {
ret = -EROFS;
goto out;
}
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index 09c0266f248d..f6a05f836629 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -390,6 +390,8 @@ static int prop_compression_validate(const char *value, size_t len)
return 0;
else if (!strncmp("zlib", value, len))
return 0;
+ else if (!strncmp("zstd", value, len))
+ return 0;
return -EINVAL;
}
@@ -412,6 +414,8 @@ static int prop_compression_apply(struct inode *inode,
type = BTRFS_COMPRESS_LZO;
else if (!strncmp("zlib", value, 4))
type = BTRFS_COMPRESS_ZLIB;
+ else if (!strncmp("zstd", value, len))
+ type = BTRFS_COMPRESS_ZSTD;
else
return -EINVAL;
@@ -429,6 +433,8 @@ static const char *prop_compression_extract(struct inode *inode)
return "zlib";
case BTRFS_COMPRESS_LZO:
return "lzo";
+ case BTRFS_COMPRESS_ZSTD:
+ return "zstd";
}
return NULL;
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 5c8b61c86e61..e172d4843eae 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -807,7 +807,6 @@ static int btrfs_clean_quota_tree(struct btrfs_trans_handle *trans,
}
ret = 0;
out:
- set_bit(BTRFS_FS_QUOTA_DISABLING, &root->fs_info->flags);
btrfs_free_path(path);
return ret;
}
@@ -953,7 +952,6 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,
if (!fs_info->quota_root)
goto out;
clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
- set_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags);
btrfs_qgroup_wait_for_completion(fs_info, false);
spin_lock(&fs_info->qgroup_lock);
quota_root = fs_info->quota_root;
@@ -1307,6 +1305,8 @@ int btrfs_remove_qgroup(struct btrfs_trans_handle *trans,
}
}
ret = del_qgroup_item(trans, quota_root, qgroupid);
+ if (ret && ret != -ENOENT)
+ goto out;
while (!list_empty(&qgroup->groups)) {
list = list_first_entry(&qgroup->groups,
@@ -2086,8 +2086,6 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
if (test_and_clear_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
- if (test_and_clear_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags))
- clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
spin_lock(&fs_info->qgroup_lock);
while (!list_empty(&fs_info->dirty_qgroups)) {
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 3a49a3c2fca4..9841faef08ea 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -2400,11 +2400,11 @@ void free_reloc_roots(struct list_head *list)
while (!list_empty(list)) {
reloc_root = list_entry(list->next, struct btrfs_root,
root_list);
+ __del_reloc_root(reloc_root);
free_extent_buffer(reloc_root->node);
free_extent_buffer(reloc_root->commit_root);
reloc_root->node = NULL;
reloc_root->commit_root = NULL;
- __del_reloc_root(reloc_root);
}
}
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c
index 9fb9896610e0..95bcc3cce78f 100644
--- a/fs/btrfs/root-tree.c
+++ b/fs/btrfs/root-tree.c
@@ -228,7 +228,7 @@ int btrfs_find_orphan_roots(struct btrfs_fs_info *fs_info)
int ret;
bool can_recover = true;
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
can_recover = false;
path = btrfs_alloc_path();
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 8f1d3d6e7087..8fd195cfe81b 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -539,33 +539,23 @@ static struct btrfs_path *alloc_path_for_send(void)
static int write_buf(struct file *filp, const void *buf, u32 len, loff_t *off)
{
int ret;
- mm_segment_t old_fs;
u32 pos = 0;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
-
while (pos < len) {
- ret = vfs_write(filp, (__force const char __user *)buf + pos,
- len - pos, off);
+ ret = kernel_write(filp, buf + pos, len - pos, off);
/* TODO handle that correctly */
/*if (ret == -ERESTARTSYS) {
continue;
}*/
if (ret < 0)
- goto out;
+ return ret;
if (ret == 0) {
- ret = -EIO;
- goto out;
+ return -EIO;
}
pos += ret;
}
- ret = 0;
-
-out:
- set_fs(old_fs);
- return ret;
+ return 0;
}
static int tlv_put(struct send_ctx *sctx, u16 attr, const void *data, int len)
@@ -2640,7 +2630,7 @@ static int send_create_inode(struct send_ctx *sctx, u64 ino)
} else {
btrfs_warn(sctx->send_root->fs_info, "unexpected inode type %o",
(int)(mode & S_IFMT));
- ret = -ENOTSUPP;
+ ret = -EOPNOTSUPP;
goto out;
}
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 0b7a1d8cd08b..35a128acfbd1 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -103,7 +103,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
{
struct super_block *sb = fs_info->sb;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
@@ -139,7 +139,7 @@ void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function
* Special case: if the error is EROFS, and we're already
* under MS_RDONLY, then it is safe here.
*/
- if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
+ if (errno == -EROFS && sb_rdonly(sb))
return;
#ifdef CONFIG_PRINTK
@@ -514,6 +514,14 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
btrfs_clear_opt(info->mount_opt, NODATASUM);
btrfs_set_fs_incompat(info, COMPRESS_LZO);
no_compress = 0;
+ } else if (strcmp(args[0].from, "zstd") == 0) {
+ compress_type = "zstd";
+ info->compress_type = BTRFS_COMPRESS_ZSTD;
+ btrfs_set_opt(info->mount_opt, COMPRESS);
+ btrfs_clear_opt(info->mount_opt, NODATACOW);
+ btrfs_clear_opt(info->mount_opt, NODATASUM);
+ btrfs_set_fs_incompat(info, COMPRESS_ZSTD);
+ no_compress = 0;
} else if (strncmp(args[0].from, "no", 2) == 0) {
compress_type = "no";
btrfs_clear_opt(info->mount_opt, COMPRESS);
@@ -1230,8 +1238,10 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
if (btrfs_test_opt(info, COMPRESS)) {
if (info->compress_type == BTRFS_COMPRESS_ZLIB)
compress_type = "zlib";
- else
+ else if (info->compress_type == BTRFS_COMPRESS_LZO)
compress_type = "lzo";
+ else
+ compress_type = "zstd";
if (btrfs_test_opt(info, FORCE_COMPRESS))
seq_printf(seq, ",compress-force=%s", compress_type);
else
@@ -1691,8 +1701,7 @@ static inline void btrfs_remount_cleanup(struct btrfs_fs_info *fs_info,
* close or the filesystem is read only.
*/
if (btrfs_raw_test_opt(old_opts, AUTO_DEFRAG) &&
- (!btrfs_raw_test_opt(fs_info->mount_opt, AUTO_DEFRAG) ||
- (fs_info->sb->s_flags & MS_RDONLY))) {
+ (!btrfs_raw_test_opt(fs_info->mount_opt, AUTO_DEFRAG) || sb_rdonly(fs_info->sb))) {
btrfs_cleanup_defrag_inodes(fs_info);
}
@@ -1739,7 +1748,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
btrfs_resize_thread_pool(fs_info,
fs_info->thread_pool_size, old_thread_pool_size);
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
goto out;
if (*flags & MS_RDONLY) {
@@ -1840,7 +1849,7 @@ out:
restore:
/* We've hit an error - don't reset MS_RDONLY */
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
old_flags |= MS_RDONLY;
sb->s_flags = old_flags;
fs_info->mount_opt = old_opts;
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index c2d5f3580b4c..883881b16c86 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -120,7 +120,7 @@ static ssize_t btrfs_feature_attr_store(struct kobject *kobj,
if (!fs_info)
return -EPERM;
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
return -EROFS;
ret = kstrtoul(skip_spaces(buf), 0, &val);
@@ -200,6 +200,7 @@ BTRFS_FEAT_ATTR_INCOMPAT(mixed_backref, MIXED_BACKREF);
BTRFS_FEAT_ATTR_INCOMPAT(default_subvol, DEFAULT_SUBVOL);
BTRFS_FEAT_ATTR_INCOMPAT(mixed_groups, MIXED_GROUPS);
BTRFS_FEAT_ATTR_INCOMPAT(compress_lzo, COMPRESS_LZO);
+BTRFS_FEAT_ATTR_INCOMPAT(compress_zstd, COMPRESS_ZSTD);
BTRFS_FEAT_ATTR_INCOMPAT(big_metadata, BIG_METADATA);
BTRFS_FEAT_ATTR_INCOMPAT(extended_iref, EXTENDED_IREF);
BTRFS_FEAT_ATTR_INCOMPAT(raid56, RAID56);
@@ -212,6 +213,7 @@ static struct attribute *btrfs_supported_feature_attrs[] = {
BTRFS_FEAT_ATTR_PTR(default_subvol),
BTRFS_FEAT_ATTR_PTR(mixed_groups),
BTRFS_FEAT_ATTR_PTR(compress_lzo),
+ BTRFS_FEAT_ATTR_PTR(compress_zstd),
BTRFS_FEAT_ATTR_PTR(big_metadata),
BTRFS_FEAT_ATTR_PTR(extended_iref),
BTRFS_FEAT_ATTR_PTR(raid56),
@@ -388,7 +390,7 @@ static ssize_t btrfs_label_store(struct kobject *kobj,
if (!fs_info)
return -EPERM;
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
return -EROFS;
/*
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index ad7f4bab640b..c800d067fcbf 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -4181,6 +4181,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
struct extent_map *em, *n;
struct list_head extents;
struct extent_map_tree *tree = &inode->extent_tree;
+ u64 logged_start, logged_end;
u64 test_gen;
int ret = 0;
int num = 0;
@@ -4190,10 +4191,11 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
down_write(&inode->dio_sem);
write_lock(&tree->lock);
test_gen = root->fs_info->last_trans_committed;
+ logged_start = start;
+ logged_end = end;
list_for_each_entry_safe(em, n, &tree->modified_extents, list) {
list_del_init(&em->list);
-
/*
* Just an arbitrary number, this can be really CPU intensive
* once we start getting a lot of extents, and really once we
@@ -4208,6 +4210,12 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
if (em->generation <= test_gen)
continue;
+
+ if (em->start < logged_start)
+ logged_start = em->start;
+ if ((em->start + em->len - 1) > logged_end)
+ logged_end = em->start + em->len - 1;
+
/* Need a ref to keep it from getting evicted from cache */
refcount_inc(&em->refs);
set_bit(EXTENT_FLAG_LOGGING, &em->flags);
@@ -4216,7 +4224,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
}
list_sort(NULL, &extents, extent_cmp);
- btrfs_get_logged_extents(inode, logged_list, start, end);
+ btrfs_get_logged_extents(inode, logged_list, logged_start, logged_end);
/*
* Some ordered extents started by fsync might have completed
* before we could collect them into the list logged_list, which
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index c188256a367c..b39737568c22 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2324,7 +2324,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
int seeding_dev = 0;
int ret = 0;
- if ((sb->s_flags & MS_RDONLY) && !fs_info->fs_devices->seeding)
+ if (sb_rdonly(sb) && !fs_info->fs_devices->seeding)
return -EROFS;
bdev = blkdev_get_by_path(device_path, FMODE_WRITE | FMODE_EXCL,
@@ -4053,7 +4053,7 @@ int btrfs_pause_balance(struct btrfs_fs_info *fs_info)
int btrfs_cancel_balance(struct btrfs_fs_info *fs_info)
{
- if (fs_info->sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(fs_info->sb))
return -EROFS;
mutex_lock(&fs_info->balance_mutex);
@@ -6166,7 +6166,7 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
map_length = length;
btrfs_bio_counter_inc_blocked(fs_info);
- ret = __btrfs_map_block(fs_info, bio_op(bio), logical,
+ ret = __btrfs_map_block(fs_info, btrfs_op(bio), logical,
&map_length, &bbio, mirror_num, 1);
if (ret) {
btrfs_bio_counter_dec(fs_info);
diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
new file mode 100644
index 000000000000..607ce47b483a
--- /dev/null
+++ b/fs/btrfs/zstd.c
@@ -0,0 +1,432 @@
+/*
+ * Copyright (c) 2016-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+#include <linux/bio.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/pagemap.h>
+#include <linux/refcount.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/zstd.h>
+#include "compression.h"
+
+#define ZSTD_BTRFS_MAX_WINDOWLOG 17
+#define ZSTD_BTRFS_MAX_INPUT (1 << ZSTD_BTRFS_MAX_WINDOWLOG)
+#define ZSTD_BTRFS_DEFAULT_LEVEL 3
+
+static ZSTD_parameters zstd_get_btrfs_parameters(size_t src_len)
+{
+ ZSTD_parameters params = ZSTD_getParams(ZSTD_BTRFS_DEFAULT_LEVEL,
+ src_len, 0);
+
+ if (params.cParams.windowLog > ZSTD_BTRFS_MAX_WINDOWLOG)
+ params.cParams.windowLog = ZSTD_BTRFS_MAX_WINDOWLOG;
+ WARN_ON(src_len > ZSTD_BTRFS_MAX_INPUT);
+ return params;
+}
+
+struct workspace {
+ void *mem;
+ size_t size;
+ char *buf;
+ struct list_head list;
+};
+
+static void zstd_free_workspace(struct list_head *ws)
+{
+ struct workspace *workspace = list_entry(ws, struct workspace, list);
+
+ kvfree(workspace->mem);
+ kfree(workspace->buf);
+ kfree(workspace);
+}
+
+static struct list_head *zstd_alloc_workspace(void)
+{
+ ZSTD_parameters params =
+ zstd_get_btrfs_parameters(ZSTD_BTRFS_MAX_INPUT);
+ struct workspace *workspace;
+
+ workspace = kzalloc(sizeof(*workspace), GFP_KERNEL);
+ if (!workspace)
+ return ERR_PTR(-ENOMEM);
+
+ workspace->size = max_t(size_t,
+ ZSTD_CStreamWorkspaceBound(params.cParams),
+ ZSTD_DStreamWorkspaceBound(ZSTD_BTRFS_MAX_INPUT));
+ workspace->mem = kvmalloc(workspace->size, GFP_KERNEL);
+ workspace->buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!workspace->mem || !workspace->buf)
+ goto fail;
+
+ INIT_LIST_HEAD(&workspace->list);
+
+ return &workspace->list;
+fail:
+ zstd_free_workspace(&workspace->list);
+ return ERR_PTR(-ENOMEM);
+}
+
+static int zstd_compress_pages(struct list_head *ws,
+ struct address_space *mapping,
+ u64 start,
+ struct page **pages,
+ unsigned long *out_pages,
+ unsigned long *total_in,
+ unsigned long *total_out)
+{
+ struct workspace *workspace = list_entry(ws, struct workspace, list);
+ ZSTD_CStream *stream;
+ int ret = 0;
+ int nr_pages = 0;
+ struct page *in_page = NULL; /* The current page to read */
+ struct page *out_page = NULL; /* The current page to write to */
+ ZSTD_inBuffer in_buf = { NULL, 0, 0 };
+ ZSTD_outBuffer out_buf = { NULL, 0, 0 };
+ unsigned long tot_in = 0;
+ unsigned long tot_out = 0;
+ unsigned long len = *total_out;
+ const unsigned long nr_dest_pages = *out_pages;
+ unsigned long max_out = nr_dest_pages * PAGE_SIZE;
+ ZSTD_parameters params = zstd_get_btrfs_parameters(len);
+
+ *out_pages = 0;
+ *total_out = 0;
+ *total_in = 0;
+
+ /* Initialize the stream */
+ stream = ZSTD_initCStream(params, len, workspace->mem,
+ workspace->size);
+ if (!stream) {
+ pr_warn("BTRFS: ZSTD_initCStream failed\n");
+ ret = -EIO;
+ goto out;
+ }
+
+ /* map in the first page of input data */
+ in_page = find_get_page(mapping, start >> PAGE_SHIFT);
+ in_buf.src = kmap(in_page);
+ in_buf.pos = 0;
+ in_buf.size = min_t(size_t, len, PAGE_SIZE);
+
+
+ /* Allocate and map in the output buffer */
+ out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
+ if (out_page == NULL) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ pages[nr_pages++] = out_page;
+ out_buf.dst = kmap(out_page);
+ out_buf.pos = 0;
+ out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
+
+ while (1) {
+ size_t ret2;
+
+ ret2 = ZSTD_compressStream(stream, &out_buf, &in_buf);
+ if (ZSTD_isError(ret2)) {
+ pr_debug("BTRFS: ZSTD_compressStream returned %d\n",
+ ZSTD_getErrorCode(ret2));
+ ret = -EIO;
+ goto out;
+ }
+
+ /* Check to see if we are making it bigger */
+ if (tot_in + in_buf.pos > 8192 &&
+ tot_in + in_buf.pos <
+ tot_out + out_buf.pos) {
+ ret = -E2BIG;
+ goto out;
+ }
+
+ /* We've reached the end of our output range */
+ if (out_buf.pos >= max_out) {
+ tot_out += out_buf.pos;
+ ret = -E2BIG;
+ goto out;
+ }
+
+ /* Check if we need more output space */
+ if (out_buf.pos == out_buf.size) {
+ tot_out += PAGE_SIZE;
+ max_out -= PAGE_SIZE;
+ kunmap(out_page);
+ if (nr_pages == nr_dest_pages) {
+ out_page = NULL;
+ ret = -E2BIG;
+ goto out;
+ }
+ out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
+ if (out_page == NULL) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ pages[nr_pages++] = out_page;
+ out_buf.dst = kmap(out_page);
+ out_buf.pos = 0;
+ out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
+ }
+
+ /* We've reached the end of the input */
+ if (in_buf.pos >= len) {
+ tot_in += in_buf.pos;
+ break;
+ }
+
+ /* Check if we need more input */
+ if (in_buf.pos == in_buf.size) {
+ tot_in += PAGE_SIZE;
+ kunmap(in_page);
+ put_page(in_page);
+
+ start += PAGE_SIZE;
+ len -= PAGE_SIZE;
+ in_page = find_get_page(mapping, start >> PAGE_SHIFT);
+ in_buf.src = kmap(in_page);
+ in_buf.pos = 0;
+ in_buf.size = min_t(size_t, len, PAGE_SIZE);
+ }
+ }
+ while (1) {
+ size_t ret2;
+
+ ret2 = ZSTD_endStream(stream, &out_buf);
+ if (ZSTD_isError(ret2)) {
+ pr_debug("BTRFS: ZSTD_endStream returned %d\n",
+ ZSTD_getErrorCode(ret2));
+ ret = -EIO;
+ goto out;
+ }
+ if (ret2 == 0) {
+ tot_out += out_buf.pos;
+ break;
+ }
+ if (out_buf.pos >= max_out) {
+ tot_out += out_buf.pos;
+ ret = -E2BIG;
+ goto out;
+ }
+
+ tot_out += PAGE_SIZE;
+ max_out -= PAGE_SIZE;
+ kunmap(out_page);
+ if (nr_pages == nr_dest_pages) {
+ out_page = NULL;
+ ret = -E2BIG;
+ goto out;
+ }
+ out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
+ if (out_page == NULL) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ pages[nr_pages++] = out_page;
+ out_buf.dst = kmap(out_page);
+ out_buf.pos = 0;
+ out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
+ }
+
+ if (tot_out >= tot_in) {
+ ret = -E2BIG;
+ goto out;
+ }
+
+ ret = 0;
+ *total_in = tot_in;
+ *total_out = tot_out;
+out:
+ *out_pages = nr_pages;
+ /* Cleanup */
+ if (in_page) {
+ kunmap(in_page);
+ put_page(in_page);
+ }
+ if (out_page)
+ kunmap(out_page);
+ return ret;
+}
+
+static int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
+{
+ struct workspace *workspace = list_entry(ws, struct workspace, list);
+ struct page **pages_in = cb->compressed_pages;
+ u64 disk_start = cb->start;
+ struct bio *orig_bio = cb->orig_bio;
+ size_t srclen = cb->compressed_len;
+ ZSTD_DStream *stream;
+ int ret = 0;
+ unsigned long page_in_index = 0;
+ unsigned long total_pages_in = DIV_ROUND_UP(srclen, PAGE_SIZE);
+ unsigned long buf_start;
+ unsigned long total_out = 0;
+ ZSTD_inBuffer in_buf = { NULL, 0, 0 };
+ ZSTD_outBuffer out_buf = { NULL, 0, 0 };
+
+ stream = ZSTD_initDStream(
+ ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
+ if (!stream) {
+ pr_debug("BTRFS: ZSTD_initDStream failed\n");
+ ret = -EIO;
+ goto done;
+ }
+
+ in_buf.src = kmap(pages_in[page_in_index]);
+ in_buf.pos = 0;
+ in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
+
+ out_buf.dst = workspace->buf;
+ out_buf.pos = 0;
+ out_buf.size = PAGE_SIZE;
+
+ while (1) {
+ size_t ret2;
+
+ ret2 = ZSTD_decompressStream(stream, &out_buf, &in_buf);
+ if (ZSTD_isError(ret2)) {
+ pr_debug("BTRFS: ZSTD_decompressStream returned %d\n",
+ ZSTD_getErrorCode(ret2));
+ ret = -EIO;
+ goto done;
+ }
+ buf_start = total_out;
+ total_out += out_buf.pos;
+ out_buf.pos = 0;
+
+ ret = btrfs_decompress_buf2page(out_buf.dst, buf_start,
+ total_out, disk_start, orig_bio);
+ if (ret == 0)
+ break;
+
+ if (in_buf.pos >= srclen)
+ break;
+
+ /* Check if we've hit the end of a frame */
+ if (ret2 == 0)
+ break;
+
+ if (in_buf.pos == in_buf.size) {
+ kunmap(pages_in[page_in_index++]);
+ if (page_in_index >= total_pages_in) {
+ in_buf.src = NULL;
+ ret = -EIO;
+ goto done;
+ }
+ srclen -= PAGE_SIZE;
+ in_buf.src = kmap(pages_in[page_in_index]);
+ in_buf.pos = 0;
+ in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
+ }
+ }
+ ret = 0;
+ zero_fill_bio(orig_bio);
+done:
+ if (in_buf.src)
+ kunmap(pages_in[page_in_index]);
+ return ret;
+}
+
+static int zstd_decompress(struct list_head *ws, unsigned char *data_in,
+ struct page *dest_page,
+ unsigned long start_byte,
+ size_t srclen, size_t destlen)
+{
+ struct workspace *workspace = list_entry(ws, struct workspace, list);
+ ZSTD_DStream *stream;
+ int ret = 0;
+ size_t ret2;
+ ZSTD_inBuffer in_buf = { NULL, 0, 0 };
+ ZSTD_outBuffer out_buf = { NULL, 0, 0 };
+ unsigned long total_out = 0;
+ unsigned long pg_offset = 0;
+ char *kaddr;
+
+ stream = ZSTD_initDStream(
+ ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
+ if (!stream) {
+ pr_warn("BTRFS: ZSTD_initDStream failed\n");
+ ret = -EIO;
+ goto finish;
+ }
+
+ destlen = min_t(size_t, destlen, PAGE_SIZE);
+
+ in_buf.src = data_in;
+ in_buf.pos = 0;
+ in_buf.size = srclen;
+
+ out_buf.dst = workspace->buf;
+ out_buf.pos = 0;
+ out_buf.size = PAGE_SIZE;
+
+ ret2 = 1;
+ while (pg_offset < destlen && in_buf.pos < in_buf.size) {
+ unsigned long buf_start;
+ unsigned long buf_offset;
+ unsigned long bytes;
+
+ /* Check if the frame is over and we still need more input */
+ if (ret2 == 0) {
+ pr_debug("BTRFS: ZSTD_decompressStream ended early\n");
+ ret = -EIO;
+ goto finish;
+ }
+ ret2 = ZSTD_decompressStream(stream, &out_buf, &in_buf);
+ if (ZSTD_isError(ret2)) {
+ pr_debug("BTRFS: ZSTD_decompressStream returned %d\n",
+ ZSTD_getErrorCode(ret2));
+ ret = -EIO;
+ goto finish;
+ }
+
+ buf_start = total_out;
+ total_out += out_buf.pos;
+ out_buf.pos = 0;
+
+ if (total_out <= start_byte)
+ continue;
+
+ if (total_out > start_byte && buf_start < start_byte)
+ buf_offset = start_byte - buf_start;
+ else
+ buf_offset = 0;
+
+ bytes = min_t(unsigned long, destlen - pg_offset,
+ out_buf.size - buf_offset);
+
+ kaddr = kmap_atomic(dest_page);
+ memcpy(kaddr + pg_offset, out_buf.dst + buf_offset, bytes);
+ kunmap_atomic(kaddr);
+
+ pg_offset += bytes;
+ }
+ ret = 0;
+finish:
+ if (pg_offset < destlen) {
+ kaddr = kmap_atomic(dest_page);
+ memset(kaddr + pg_offset, 0, destlen - pg_offset);
+ kunmap_atomic(kaddr);
+ }
+ return ret;
+}
+
+const struct btrfs_compress_op btrfs_zstd_compress = {
+ .alloc_workspace = zstd_alloc_workspace,
+ .free_workspace = zstd_free_workspace,
+ .compress_pages = zstd_compress_pages,
+ .decompress_bio = zstd_decompress_bio,
+ .decompress = zstd_decompress,
+};
diff --git a/fs/cachefiles/bind.c b/fs/cachefiles/bind.c
index 3ff867f87d73..d9f001078e08 100644
--- a/fs/cachefiles/bind.c
+++ b/fs/cachefiles/bind.c
@@ -133,7 +133,7 @@ static int cachefiles_daemon_add_cache(struct cachefiles_cache *cache)
goto error_unsupported;
ret = -EROFS;
- if (root->d_sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(root->d_sb))
goto error_unsupported;
/* determine the security of the on-disk cache as this governs
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 1bc709fe330a..b3e3edc09d80 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -152,17 +152,10 @@ static void ceph_invalidatepage(struct page *page, unsigned int offset,
ceph_invalidate_fscache_page(inode, page);
+ WARN_ON(!PageLocked(page));
if (!PagePrivate(page))
return;
- /*
- * We can get non-dirty pages here due to races between
- * set_page_dirty and truncate_complete_page; just spit out a
- * warning, in case we end up with accounting problems later.
- */
- if (!PageDirty(page))
- pr_err("%p invalidatepage %p page not dirty\n", inode, page);
-
ClearPageChecked(page);
dout("%p invalidatepage %p idx %lu full dirty page\n",
@@ -455,13 +448,9 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
if (rc == 0)
goto out;
- if (fsc->mount_options->rsize >= PAGE_SIZE)
- max = (fsc->mount_options->rsize + PAGE_SIZE - 1)
- >> PAGE_SHIFT;
-
- dout("readpages %p file %p nr_pages %d max %d\n", inode,
- file, nr_pages,
- max);
+ max = fsc->mount_options->rsize >> PAGE_SHIFT;
+ dout("readpages %p file %p nr_pages %d max %d\n",
+ inode, file, nr_pages, max);
while (!list_empty(page_list)) {
rc = start_read(inode, page_list, max);
if (rc < 0)
@@ -474,14 +463,22 @@ out:
return rc;
}
+struct ceph_writeback_ctl
+{
+ loff_t i_size;
+ u64 truncate_size;
+ u32 truncate_seq;
+ bool size_stable;
+ bool head_snapc;
+};
+
/*
* Get ref for the oldest snapc for an inode with dirty data... that is, the
* only snap context we are allowed to write back.
*/
-static struct ceph_snap_context *get_oldest_context(struct inode *inode,
- loff_t *snap_size,
- u64 *truncate_size,
- u32 *truncate_seq)
+static struct ceph_snap_context *
+get_oldest_context(struct inode *inode, struct ceph_writeback_ctl *ctl,
+ struct ceph_snap_context *page_snapc)
{
struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_snap_context *snapc = NULL;
@@ -491,30 +488,78 @@ static struct ceph_snap_context *get_oldest_context(struct inode *inode,
list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {
dout(" cap_snap %p snapc %p has %d dirty pages\n", capsnap,
capsnap->context, capsnap->dirty_pages);
- if (capsnap->dirty_pages) {
- snapc = ceph_get_snap_context(capsnap->context);
- if (snap_size)
- *snap_size = capsnap->size;
- if (truncate_size)
- *truncate_size = capsnap->truncate_size;
- if (truncate_seq)
- *truncate_seq = capsnap->truncate_seq;
- break;
+ if (!capsnap->dirty_pages)
+ continue;
+
+ /* get i_size, truncate_{seq,size} for page_snapc? */
+ if (snapc && capsnap->context != page_snapc)
+ continue;
+
+ if (ctl) {
+ if (capsnap->writing) {
+ ctl->i_size = i_size_read(inode);
+ ctl->size_stable = false;
+ } else {
+ ctl->i_size = capsnap->size;
+ ctl->size_stable = true;
+ }
+ ctl->truncate_size = capsnap->truncate_size;
+ ctl->truncate_seq = capsnap->truncate_seq;
+ ctl->head_snapc = false;
}
+
+ if (snapc)
+ break;
+
+ snapc = ceph_get_snap_context(capsnap->context);
+ if (!page_snapc ||
+ page_snapc == snapc ||
+ page_snapc->seq > snapc->seq)
+ break;
}
if (!snapc && ci->i_wrbuffer_ref_head) {
snapc = ceph_get_snap_context(ci->i_head_snapc);
dout(" head snapc %p has %d dirty pages\n",
snapc, ci->i_wrbuffer_ref_head);
- if (truncate_size)
- *truncate_size = ci->i_truncate_size;
- if (truncate_seq)
- *truncate_seq = ci->i_truncate_seq;
+ if (ctl) {
+ ctl->i_size = i_size_read(inode);
+ ctl->truncate_size = ci->i_truncate_size;
+ ctl->truncate_seq = ci->i_truncate_seq;
+ ctl->size_stable = false;
+ ctl->head_snapc = true;
+ }
}
spin_unlock(&ci->i_ceph_lock);
return snapc;
}
+static u64 get_writepages_data_length(struct inode *inode,
+ struct page *page, u64 start)
+{
+ struct ceph_inode_info *ci = ceph_inode(inode);
+ struct ceph_snap_context *snapc = page_snap_context(page);
+ struct ceph_cap_snap *capsnap = NULL;
+ u64 end = i_size_read(inode);
+
+ if (snapc != ci->i_head_snapc) {
+ bool found = false;
+ spin_lock(&ci->i_ceph_lock);
+ list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {
+ if (capsnap->context == snapc) {
+ if (!capsnap->writing)
+ end = capsnap->size;
+ found = true;
+ break;
+ }
+ }
+ spin_unlock(&ci->i_ceph_lock);
+ WARN_ON(!found);
+ }
+ if (end > page_offset(page) + PAGE_SIZE)
+ end = page_offset(page) + PAGE_SIZE;
+ return end > start ? end - start : 0;
+}
+
/*
* Write a single page, but leave the page locked.
*
@@ -526,30 +571,25 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
struct inode *inode;
struct ceph_inode_info *ci;
struct ceph_fs_client *fsc;
- struct ceph_osd_client *osdc;
struct ceph_snap_context *snapc, *oldest;
loff_t page_off = page_offset(page);
- loff_t snap_size = -1;
long writeback_stat;
- u64 truncate_size;
- u32 truncate_seq;
int err, len = PAGE_SIZE;
+ struct ceph_writeback_ctl ceph_wbc;
dout("writepage %p idx %lu\n", page, page->index);
inode = page->mapping->host;
ci = ceph_inode(inode);
fsc = ceph_inode_to_client(inode);
- osdc = &fsc->client->osdc;
/* verify this is a writeable snap context */
snapc = page_snap_context(page);
- if (snapc == NULL) {
+ if (!snapc) {
dout("writepage %p page %p not dirty?\n", inode, page);
return 0;
}
- oldest = get_oldest_context(inode, &snap_size,
- &truncate_size, &truncate_seq);
+ oldest = get_oldest_context(inode, &ceph_wbc, snapc);
if (snapc->seq > oldest->seq) {
dout("writepage %p page %p snapc %p not writeable - noop\n",
inode, page, snapc);
@@ -561,20 +601,18 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
}
ceph_put_snap_context(oldest);
- if (snap_size == -1)
- snap_size = i_size_read(inode);
-
/* is this a partial page at end of file? */
- if (page_off >= snap_size) {
- dout("%p page eof %llu\n", page, snap_size);
+ if (page_off >= ceph_wbc.i_size) {
+ dout("%p page eof %llu\n", page, ceph_wbc.i_size);
+ page->mapping->a_ops->invalidatepage(page, 0, PAGE_SIZE);
return 0;
}
- if (snap_size < page_off + len)
- len = snap_size - page_off;
+ if (ceph_wbc.i_size < page_off + len)
+ len = ceph_wbc.i_size - page_off;
- dout("writepage %p page %p index %lu on %llu~%u snapc %p\n",
- inode, page, page->index, page_off, len, snapc);
+ dout("writepage %p page %p index %lu on %llu~%u snapc %p seq %lld\n",
+ inode, page, page->index, page_off, len, snapc, snapc->seq);
writeback_stat = atomic_long_inc_return(&fsc->writeback_count);
if (writeback_stat >
@@ -582,10 +620,10 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
set_page_writeback(page);
- err = ceph_osdc_writepages(osdc, ceph_vino(inode),
- &ci->i_layout, snapc,
- page_off, len,
- truncate_seq, truncate_size,
+ err = ceph_osdc_writepages(&fsc->client->osdc, ceph_vino(inode),
+ &ci->i_layout, snapc, page_off, len,
+ ceph_wbc.truncate_seq,
+ ceph_wbc.truncate_size,
&inode->i_mtime, &page, 1);
if (err < 0) {
struct writeback_control tmp_wbc;
@@ -746,31 +784,17 @@ static int ceph_writepages_start(struct address_space *mapping,
struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
struct ceph_vino vino = ceph_vino(inode);
- pgoff_t index, start, end;
- int range_whole = 0;
- int should_loop = 1;
- pgoff_t max_pages = 0, max_pages_ever = 0;
+ pgoff_t index, start_index, end = -1;
struct ceph_snap_context *snapc = NULL, *last_snapc = NULL, *pgsnapc;
struct pagevec pvec;
- int done = 0;
int rc = 0;
unsigned int wsize = i_blocksize(inode);
struct ceph_osd_request *req = NULL;
- int do_sync = 0;
- loff_t snap_size, i_size;
- u64 truncate_size;
- u32 truncate_seq;
+ struct ceph_writeback_ctl ceph_wbc;
+ bool should_loop, range_whole = false;
+ bool stop, done = false;
- /*
- * Include a 'sync' in the OSD request if this is a data
- * integrity write (e.g., O_SYNC write or fsync()), or if our
- * cap is being revoked.
- */
- if ((wbc->sync_mode == WB_SYNC_ALL) ||
- ceph_caps_revoking(ci, CEPH_CAP_FILE_BUFFER))
- do_sync = 1;
- dout("writepages_start %p dosync=%d (mode=%s)\n",
- inode, do_sync,
+ dout("writepages_start %p (mode=%s)\n", inode,
wbc->sync_mode == WB_SYNC_NONE ? "NONE" :
(wbc->sync_mode == WB_SYNC_ALL ? "ALL" : "HOLD"));
@@ -783,35 +807,17 @@ static int ceph_writepages_start(struct address_space *mapping,
mapping_set_error(mapping, -EIO);
return -EIO; /* we're in a forced umount, don't write! */
}
- if (fsc->mount_options->wsize && fsc->mount_options->wsize < wsize)
+ if (fsc->mount_options->wsize < wsize)
wsize = fsc->mount_options->wsize;
- if (wsize < PAGE_SIZE)
- wsize = PAGE_SIZE;
- max_pages_ever = wsize >> PAGE_SHIFT;
pagevec_init(&pvec, 0);
- /* where to start/end? */
- if (wbc->range_cyclic) {
- start = mapping->writeback_index; /* Start from prev offset */
- end = -1;
- dout(" cyclic, start at %lu\n", start);
- } else {
- start = wbc->range_start >> PAGE_SHIFT;
- end = wbc->range_end >> PAGE_SHIFT;
- if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
- range_whole = 1;
- should_loop = 0;
- dout(" not cyclic, %lu to %lu\n", start, end);
- }
- index = start;
+ start_index = wbc->range_cyclic ? mapping->writeback_index : 0;
+ index = start_index;
retry:
/* find oldest snap context with dirty data */
- ceph_put_snap_context(snapc);
- snap_size = -1;
- snapc = get_oldest_context(inode, &snap_size,
- &truncate_size, &truncate_seq);
+ snapc = get_oldest_context(inode, &ceph_wbc, NULL);
if (!snapc) {
/* hmm, why does writepages get called when there
is no dirty data? */
@@ -821,40 +827,56 @@ retry:
dout(" oldest snapc is %p seq %lld (%d snaps)\n",
snapc, snapc->seq, snapc->num_snaps);
- i_size = i_size_read(inode);
-
- if (last_snapc && snapc != last_snapc) {
- /* if we switched to a newer snapc, restart our scan at the
- * start of the original file range. */
- dout(" snapc differs from last pass, restarting at %lu\n",
- index);
- index = start;
+ should_loop = false;
+ if (ceph_wbc.head_snapc && snapc != last_snapc) {
+ /* where to start/end? */
+ if (wbc->range_cyclic) {
+ index = start_index;
+ end = -1;
+ if (index > 0)
+ should_loop = true;
+ dout(" cyclic, start at %lu\n", index);
+ } else {
+ index = wbc->range_start >> PAGE_SHIFT;
+ end = wbc->range_end >> PAGE_SHIFT;
+ if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
+ range_whole = true;
+ dout(" not cyclic, %lu to %lu\n", index, end);
+ }
+ } else if (!ceph_wbc.head_snapc) {
+ /* Do not respect wbc->range_{start,end}. Dirty pages
+ * in that range can be associated with newer snapc.
+ * They are not writeable until we write all dirty pages
+ * associated with 'snapc' get written */
+ if (index > 0 || wbc->sync_mode != WB_SYNC_NONE)
+ should_loop = true;
+ dout(" non-head snapc, range whole\n");
}
+
+ ceph_put_snap_context(last_snapc);
last_snapc = snapc;
- while (!done && index <= end) {
- unsigned i;
- int first;
- pgoff_t strip_unit_end = 0;
+ stop = false;
+ while (!stop && index <= end) {
int num_ops = 0, op_idx;
- int pvec_pages, locked_pages = 0;
+ unsigned i, pvec_pages, max_pages, locked_pages = 0;
struct page **pages = NULL, **data_pages;
mempool_t *pool = NULL; /* Becomes non-null if mempool used */
struct page *page;
- int want;
+ pgoff_t strip_unit_end = 0;
u64 offset = 0, len = 0;
- max_pages = max_pages_ever;
+ max_pages = wsize >> PAGE_SHIFT;
get_more_pages:
- first = -1;
- want = min(end - index,
- min((pgoff_t)PAGEVEC_SIZE,
- max_pages - (pgoff_t)locked_pages) - 1)
- + 1;
+ pvec_pages = min_t(unsigned, PAGEVEC_SIZE,
+ max_pages - locked_pages);
+ if (end - index < (u64)(pvec_pages - 1))
+ pvec_pages = (unsigned)(end - index) + 1;
+
pvec_pages = pagevec_lookup_tag(&pvec, mapping, &index,
PAGECACHE_TAG_DIRTY,
- want);
+ pvec_pages);
dout("pagevec_lookup_tag got %d\n", pvec_pages);
if (!pvec_pages && !locked_pages)
break;
@@ -871,11 +893,15 @@ get_more_pages:
unlikely(page->mapping != mapping)) {
dout("!dirty or !mapping %p\n", page);
unlock_page(page);
- break;
+ continue;
}
- if (!wbc->range_cyclic && page->index > end) {
+ if (page->index > end) {
dout("end of range %p\n", page);
- done = 1;
+ /* can't be range_cyclic (1st pass) because
+ * end == -1 in that case. */
+ stop = true;
+ if (ceph_wbc.head_snapc)
+ done = true;
unlock_page(page);
break;
}
@@ -884,39 +910,37 @@ get_more_pages:
unlock_page(page);
break;
}
- if (wbc->sync_mode != WB_SYNC_NONE) {
- dout("waiting on writeback %p\n", page);
- wait_on_page_writeback(page);
- }
- if (page_offset(page) >=
- (snap_size == -1 ? i_size : snap_size)) {
- dout("%p page eof %llu\n", page,
- (snap_size == -1 ? i_size : snap_size));
- done = 1;
+ if (page_offset(page) >= ceph_wbc.i_size) {
+ dout("%p page eof %llu\n",
+ page, ceph_wbc.i_size);
+ /* not done if range_cyclic */
+ stop = true;
unlock_page(page);
break;
}
if (PageWriteback(page)) {
- dout("%p under writeback\n", page);
- unlock_page(page);
- break;
+ if (wbc->sync_mode == WB_SYNC_NONE) {
+ dout("%p under writeback\n", page);
+ unlock_page(page);
+ continue;
+ }
+ dout("waiting on writeback %p\n", page);
+ wait_on_page_writeback(page);
}
/* only if matching snap context */
pgsnapc = page_snap_context(page);
- if (pgsnapc->seq > snapc->seq) {
- dout("page snapc %p %lld > oldest %p %lld\n",
+ if (pgsnapc != snapc) {
+ dout("page snapc %p %lld != oldest %p %lld\n",
pgsnapc, pgsnapc->seq, snapc, snapc->seq);
unlock_page(page);
- if (!locked_pages)
- continue; /* keep looking for snap */
- break;
+ continue;
}
if (!clear_page_dirty_for_io(page)) {
dout("%p !clear_page_dirty_for_io\n", page);
unlock_page(page);
- break;
+ continue;
}
/*
@@ -942,7 +966,7 @@ get_more_pages:
break;
}
- num_ops = 1 + do_sync;
+ num_ops = 1;
strip_unit_end = page->index +
((len - 1) >> PAGE_SHIFT);
@@ -972,8 +996,6 @@ get_more_pages:
}
/* note position of first page in pvec */
- if (first < 0)
- first = i;
dout("%p will write page %p idx %lu\n",
inode, page, page->index);
@@ -984,8 +1006,10 @@ get_more_pages:
BLK_RW_ASYNC);
}
- pages[locked_pages] = page;
- locked_pages++;
+
+ pages[locked_pages++] = page;
+ pvec.pages[i] = NULL;
+
len += PAGE_SIZE;
}
@@ -993,23 +1017,23 @@ get_more_pages:
if (!locked_pages)
goto release_pvec_pages;
if (i) {
- int j;
- BUG_ON(!locked_pages || first < 0);
+ unsigned j, n = 0;
+ /* shift unused page to beginning of pvec */
+ for (j = 0; j < pvec_pages; j++) {
+ if (!pvec.pages[j])
+ continue;
+ if (n < j)
+ pvec.pages[n] = pvec.pages[j];
+ n++;
+ }
+ pvec.nr = n;
if (pvec_pages && i == pvec_pages &&
locked_pages < max_pages) {
dout("reached end pvec, trying for more\n");
- pagevec_reinit(&pvec);
+ pagevec_release(&pvec);
goto get_more_pages;
}
-
- /* shift unused pages over in the pvec... we
- * will need to release them below. */
- for (j = i; j < pvec_pages; j++) {
- dout(" pvec leftover page %p\n", pvec.pages[j]);
- pvec.pages[j-i+first] = pvec.pages[j];
- }
- pvec.nr -= i-first;
}
new_request:
@@ -1019,10 +1043,9 @@ new_request:
req = ceph_osdc_new_request(&fsc->client->osdc,
&ci->i_layout, vino,
offset, &len, 0, num_ops,
- CEPH_OSD_OP_WRITE,
- CEPH_OSD_FLAG_WRITE,
- snapc, truncate_seq,
- truncate_size, false);
+ CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
+ snapc, ceph_wbc.truncate_seq,
+ ceph_wbc.truncate_size, false);
if (IS_ERR(req)) {
req = ceph_osdc_new_request(&fsc->client->osdc,
&ci->i_layout, vino,
@@ -1031,8 +1054,8 @@ new_request:
CEPH_OSD_SLAB_OPS),
CEPH_OSD_OP_WRITE,
CEPH_OSD_FLAG_WRITE,
- snapc, truncate_seq,
- truncate_size, true);
+ snapc, ceph_wbc.truncate_seq,
+ ceph_wbc.truncate_size, true);
BUG_ON(IS_ERR(req));
}
BUG_ON(len < page_offset(pages[locked_pages - 1]) +
@@ -1048,7 +1071,7 @@ new_request:
for (i = 0; i < locked_pages; i++) {
u64 cur_offset = page_offset(pages[i]);
if (offset + len != cur_offset) {
- if (op_idx + do_sync + 1 == req->r_num_ops)
+ if (op_idx + 1 == req->r_num_ops)
break;
osd_req_op_extent_dup_last(req, op_idx,
cur_offset - offset);
@@ -1069,14 +1092,15 @@ new_request:
len += PAGE_SIZE;
}
- if (snap_size != -1) {
- len = min(len, snap_size - offset);
+ if (ceph_wbc.size_stable) {
+ len = min(len, ceph_wbc.i_size - offset);
} else if (i == locked_pages) {
/* writepages_finish() clears writeback pages
* according to the data length, so make sure
* data length covers all locked pages */
u64 min_len = len + 1 - PAGE_SIZE;
- len = min(len, (u64)i_size_read(inode) - offset);
+ len = get_writepages_data_length(inode, pages[i - 1],
+ offset);
len = max(len, min_len);
}
dout("writepages got pages at %llu~%llu\n", offset, len);
@@ -1085,17 +1109,12 @@ new_request:
0, !!pool, false);
osd_req_op_extent_update(req, op_idx, len);
- if (do_sync) {
- op_idx++;
- osd_req_op_init(req, op_idx, CEPH_OSD_OP_STARTSYNC, 0);
- }
BUG_ON(op_idx + 1 != req->r_num_ops);
pool = NULL;
if (i < locked_pages) {
BUG_ON(num_ops <= req->r_num_ops);
num_ops -= req->r_num_ops;
- num_ops += do_sync;
locked_pages -= i;
/* allocate new pages array for next request */
@@ -1127,22 +1146,50 @@ new_request:
if (pages)
goto new_request;
- if (wbc->nr_to_write <= 0)
- done = 1;
+ /*
+ * We stop writing back only if we are not doing
+ * integrity sync. In case of integrity sync we have to
+ * keep going until we have written all the pages
+ * we tagged for writeback prior to entering this loop.
+ */
+ if (wbc->nr_to_write <= 0 && wbc->sync_mode == WB_SYNC_NONE)
+ done = stop = true;
release_pvec_pages:
dout("pagevec_release on %d pages (%p)\n", (int)pvec.nr,
pvec.nr ? pvec.pages[0] : NULL);
pagevec_release(&pvec);
-
- if (locked_pages && !done)
- goto retry;
}
if (should_loop && !done) {
/* more to do; loop back to beginning of file */
dout("writepages looping back to beginning of file\n");
- should_loop = 0;
+ end = start_index - 1; /* OK even when start_index == 0 */
+
+ /* to write dirty pages associated with next snapc,
+ * we need to wait until current writes complete */
+ if (wbc->sync_mode != WB_SYNC_NONE &&
+ start_index == 0 && /* all dirty pages were checked */
+ !ceph_wbc.head_snapc) {
+ struct page *page;
+ unsigned i, nr;
+ index = 0;
+ while ((index <= end) &&
+ (nr = pagevec_lookup_tag(&pvec, mapping, &index,
+ PAGECACHE_TAG_WRITEBACK,
+ PAGEVEC_SIZE))) {
+ for (i = 0; i < nr; i++) {
+ page = pvec.pages[i];
+ if (page_snap_context(page) != snapc)
+ continue;
+ wait_on_page_writeback(page);
+ }
+ pagevec_release(&pvec);
+ cond_resched();
+ }
+ }
+
+ start_index = 0;
index = 0;
goto retry;
}
@@ -1152,8 +1199,8 @@ release_pvec_pages:
out:
ceph_osdc_put_request(req);
- ceph_put_snap_context(snapc);
- dout("writepages done, rc = %d\n", rc);
+ ceph_put_snap_context(last_snapc);
+ dout("writepages dend - startone, rc = %d\n", rc);
return rc;
}
@@ -1165,8 +1212,7 @@ out:
static int context_is_writeable_or_written(struct inode *inode,
struct ceph_snap_context *snapc)
{
- struct ceph_snap_context *oldest = get_oldest_context(inode, NULL,
- NULL, NULL);
+ struct ceph_snap_context *oldest = get_oldest_context(inode, NULL, NULL);
int ret = !oldest || snapc->seq <= oldest->seq;
ceph_put_snap_context(oldest);
@@ -1211,8 +1257,7 @@ retry_locked:
* this page is already dirty in another (older) snap
* context! is it writeable now?
*/
- oldest = get_oldest_context(inode, NULL, NULL, NULL);
-
+ oldest = get_oldest_context(inode, NULL, NULL);
if (snapc->seq > oldest->seq) {
ceph_put_snap_context(oldest);
dout(" page %p snapc %p not current or oldest\n",
diff --git a/fs/ceph/cache.c b/fs/ceph/cache.c
index 174d6e6569a8..a3ab265d3215 100644
--- a/fs/ceph/cache.c
+++ b/fs/ceph/cache.c
@@ -209,7 +209,7 @@ void ceph_fscache_register_inode_cookie(struct inode *inode)
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
/* No caching for filesystem */
- if (fsc->fscache == NULL)
+ if (!fsc->fscache)
return;
/* Only cache for regular files that are read only */
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 7007ae2a5ad2..157fe59fbabe 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -490,13 +490,14 @@ static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap,
}
/*
- * if we are newly issued FILE_SHARED, mark dir not complete; we
- * don't know what happened to this directory while we didn't
- * have the cap.
+ * If FILE_SHARED is newly issued, mark dir not complete. We don't
+ * know what happened to this directory while we didn't have the cap.
+ * If FILE_SHARED is being revoked, also mark dir not complete. It
+ * stops on-going cached readdir.
*/
- if ((issued & CEPH_CAP_FILE_SHARED) &&
- (had & CEPH_CAP_FILE_SHARED) == 0) {
- ci->i_shared_gen++;
+ if ((issued & CEPH_CAP_FILE_SHARED) != (had & CEPH_CAP_FILE_SHARED)) {
+ if (issued & CEPH_CAP_FILE_SHARED)
+ ci->i_shared_gen++;
if (S_ISDIR(ci->vfs_inode.i_mode)) {
dout(" marking %p NOT complete\n", &ci->vfs_inode);
__ceph_dir_clear_complete(ci);
@@ -611,7 +612,7 @@ void ceph_add_cap(struct inode *inode,
}
if (flags & CEPH_CAP_FLAG_AUTH) {
- if (ci->i_auth_cap == NULL ||
+ if (!ci->i_auth_cap ||
ceph_seq_cmp(ci->i_auth_cap->mseq, mseq) < 0) {
ci->i_auth_cap = cap;
cap->mds_wanted = wanted;
@@ -728,7 +729,7 @@ static void __touch_cap(struct ceph_cap *cap)
struct ceph_mds_session *s = cap->session;
spin_lock(&s->s_cap_lock);
- if (s->s_cap_iterator == NULL) {
+ if (!s->s_cap_iterator) {
dout("__touch_cap %p cap %p mds%d\n", &cap->ci->vfs_inode, cap,
s->s_mds);
list_move_tail(&cap->session_caps, &s->s_caps);
@@ -1248,7 +1249,10 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
arg.mode = inode->i_mode;
arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE;
- arg.flags = 0;
+ if (list_empty(&ci->i_cap_snaps))
+ arg.flags = CEPH_CLIENT_CAPS_NO_CAPSNAP;
+ else
+ arg.flags = CEPH_CLIENT_CAPS_PENDING_CAPSNAP;
if (sync)
arg.flags |= CEPH_CLIENT_CAPS_SYNC;
@@ -1454,13 +1458,19 @@ retry:
goto retry;
}
+ // make sure flushsnap messages are sent in proper order.
+ if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
+ __kick_flushing_caps(mdsc, session, ci, 0);
+ ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
+ }
+
__ceph_flush_snaps(ci, session);
out:
spin_unlock(&ci->i_ceph_lock);
if (psession) {
*psession = session;
- } else {
+ } else if (session) {
mutex_unlock(&session->s_mutex);
ceph_put_mds_session(session);
}
@@ -1901,11 +1911,7 @@ ack:
(ci->i_ceph_flags &
(CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS))) {
if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
- spin_lock(&mdsc->cap_dirty_lock);
- oldest_flush_tid = __get_oldest_flush_tid(mdsc);
- spin_unlock(&mdsc->cap_dirty_lock);
- __kick_flushing_caps(mdsc, session, ci,
- oldest_flush_tid);
+ __kick_flushing_caps(mdsc, session, ci, 0);
ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
}
if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)
@@ -2110,7 +2116,7 @@ int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync)
dout("fsync %p%s\n", inode, datasync ? " datasync" : "");
- ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+ ret = file_write_and_wait_range(file, start, end);
if (ret < 0)
goto out;
@@ -3422,7 +3428,7 @@ retry:
tcap = __get_cap_for_mds(ci, target);
if (tcap) {
/* already have caps from the target */
- if (tcap->cap_id != t_cap_id ||
+ if (tcap->cap_id == t_cap_id &&
ceph_seq_cmp(tcap->seq, t_seq) < 0) {
dout(" updating import cap %p mds%d\n", tcap, target);
tcap->cap_id = t_cap_id;
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 4e2d112c982f..d635496ea189 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -24,7 +24,7 @@ static int mdsmap_show(struct seq_file *s, void *p)
struct ceph_fs_client *fsc = s->private;
struct ceph_mdsmap *mdsmap;
- if (fsc->mdsc == NULL || fsc->mdsc->mdsmap == NULL)
+ if (!fsc->mdsc || !fsc->mdsc->mdsmap)
return 0;
mdsmap = fsc->mdsc->mdsmap;
seq_printf(s, "epoch %d\n", mdsmap->m_epoch);
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index ef7240ace576..019c2036d36f 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -377,8 +377,10 @@ more:
}
/* hints to request -> mds selection code */
req->r_direct_mode = USE_AUTH_MDS;
- req->r_direct_hash = ceph_frag_value(frag);
- __set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
+ if (op == CEPH_MDS_OP_READDIR) {
+ req->r_direct_hash = ceph_frag_value(frag);
+ __set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
+ }
if (fi->last_name) {
req->r_path2 = kstrdup(fi->last_name, GFP_KERNEL);
if (!req->r_path2) {
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 3d48c415f3cb..65a6fa12c857 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -175,7 +175,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
dout("init_file %p %p 0%o (regular)\n", inode, file,
inode->i_mode);
cf = kmem_cache_zalloc(ceph_file_cachep, GFP_KERNEL);
- if (cf == NULL) {
+ if (!cf) {
ceph_put_fmode(ceph_inode(inode), fmode); /* clean up */
return -ENOMEM;
}
@@ -562,8 +562,7 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
ssize_t ret;
size_t len = iov_iter_count(to);
- dout("sync_read on file %p %llu~%u %s\n", file, off,
- (unsigned)len,
+ dout("sync_read on file %p %llu~%u %s\n", file, off, (unsigned)len,
(file->f_flags & O_DIRECT) ? "O_DIRECT" : "");
if (!len)
@@ -788,7 +787,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
goto out;
}
- req->r_flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
+ req->r_flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc);
ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid);
@@ -800,7 +799,6 @@ static void ceph_aio_retry_work(struct work_struct *work)
}
req->r_ops[0] = orig_req->r_ops[0];
- osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC, 0);
req->r_mtime = aio_req->mtime;
req->r_data_offset = req->r_ops[0].extent.offset;
@@ -847,8 +845,9 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
if (write && ceph_snap(file_inode(file)) != CEPH_NOSNAP)
return -EROFS;
- dout("sync_direct_read_write (%s) on file %p %lld~%u\n",
- (write ? "write" : "read"), file, pos, (unsigned)count);
+ dout("sync_direct_%s on file %p %lld~%u snapc %p seq %lld\n",
+ (write ? "write" : "read"), file, pos, (unsigned)count,
+ snapc, snapc->seq);
ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count);
if (ret < 0)
@@ -861,7 +860,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
if (ret2 < 0)
dout("invalidate_inode_pages2_range returned %d\n", ret2);
- flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
+ flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
} else {
flags = CEPH_OSD_FLAG_READ;
}
@@ -874,8 +873,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
vino = ceph_vino(inode);
req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
vino, pos, &size, 0,
- /*include a 'startsync' command*/
- write ? 2 : 1,
+ 1,
write ? CEPH_OSD_OP_WRITE :
CEPH_OSD_OP_READ,
flags, snapc,
@@ -887,6 +885,11 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
break;
}
+ if (write)
+ size = min_t(u64, size, fsc->mount_options->wsize);
+ else
+ size = min_t(u64, size, fsc->mount_options->rsize);
+
len = size;
pages = dio_get_pages_alloc(iter, len, &start, &num_pages);
if (IS_ERR(pages)) {
@@ -922,7 +925,6 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
truncate_inode_pages_range(inode->i_mapping, pos,
(pos+len) | (PAGE_SIZE - 1));
- osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC, 0);
req->r_mtime = mtime;
}
@@ -1048,7 +1050,8 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
return -EROFS;
- dout("sync_write on file %p %lld~%u\n", file, pos, (unsigned)count);
+ dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
+ file, pos, (unsigned)count, snapc, snapc->seq);
ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count);
if (ret < 0)
@@ -1060,7 +1063,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
if (ret < 0)
dout("invalidate_inode_pages2_range returned %d\n", ret);
- flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
+ flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
while ((len = iov_iter_count(from)) > 0) {
size_t left;
@@ -1307,6 +1310,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (!prealloc_cf)
return -ENOMEM;
+retry_snap:
inode_lock(inode);
/* We can write back this queue in page reclaim */
@@ -1338,7 +1342,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
goto out;
}
-retry_snap:
/* FIXME: not complete since it doesn't account for being at quota */
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) {
err = -ENOSPC;
@@ -1387,14 +1390,6 @@ retry_snap:
&prealloc_cf);
else
written = ceph_sync_write(iocb, &data, pos, snapc);
- if (written == -EOLDSNAPC) {
- dout("aio_write %p %llx.%llx %llu~%u"
- "got EOLDSNAPC, retrying\n",
- inode, ceph_vinop(inode),
- pos, (unsigned)count);
- inode_lock(inode);
- goto retry_snap;
- }
if (written > 0)
iov_iter_advance(from, written);
ceph_put_snap_context(snapc);
@@ -1428,10 +1423,15 @@ retry_snap:
ceph_cap_string(got));
ceph_put_cap_refs(ci, got);
+ if (written == -EOLDSNAPC) {
+ dout("aio_write %p %llx.%llx %llu~%u" "got EOLDSNAPC, retrying\n",
+ inode, ceph_vinop(inode), pos, (unsigned)count);
+ goto retry_snap;
+ }
+
if (written >= 0) {
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_NEARFULL))
iocb->ki_flags |= IOCB_DSYNC;
-
written = generic_write_sync(iocb, written);
}
@@ -1481,13 +1481,13 @@ static loff_t ceph_llseek(struct file *file, loff_t offset, int whence)
offset += file->f_pos;
break;
case SEEK_DATA:
- if (offset >= i_size) {
+ if (offset < 0 || offset >= i_size) {
ret = -ENXIO;
goto out;
}
break;
case SEEK_HOLE:
- if (offset >= i_size) {
+ if (offset < 0 || offset >= i_size) {
ret = -ENXIO;
goto out;
}
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 220dfd87cbfa..373dab5173ca 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -52,7 +52,7 @@ struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino)
ino_t t = ceph_vino_to_ino(vino);
inode = iget5_locked(sb, t, ceph_ino_compare, ceph_set_ino_cb, &vino);
- if (inode == NULL)
+ if (!inode)
return ERR_PTR(-ENOMEM);
if (inode->i_state & I_NEW) {
dout("get_inode created new inode %p %llx.%llx ino %llx\n",
@@ -133,12 +133,9 @@ static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci,
}
frag = kmalloc(sizeof(*frag), GFP_NOFS);
- if (!frag) {
- pr_err("__get_or_create_frag ENOMEM on %p %llx.%llx "
- "frag %x\n", &ci->vfs_inode,
- ceph_vinop(&ci->vfs_inode), f);
+ if (!frag)
return ERR_PTR(-ENOMEM);
- }
+
frag->frag = f;
frag->split_by = 0;
frag->mds = -1;
@@ -1070,7 +1067,6 @@ out_unlock:
spin_unlock(&dentry->d_lock);
if (old_lease_session)
ceph_put_mds_session(old_lease_session);
- return;
}
/*
@@ -1177,7 +1173,7 @@ retry_lookup:
dn = d_alloc(parent, &dname);
dout("d_alloc %p '%.*s' = %p\n", parent,
dname.len, dname.name, dn);
- if (dn == NULL) {
+ if (!dn) {
dput(parent);
err = -ENOMEM;
goto done;
@@ -1477,7 +1473,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
struct dentry *dn;
struct inode *in;
int err = 0, skipped = 0, ret, i;
- struct inode *snapdir = NULL;
struct ceph_mds_request_head *rhead = req->r_request->front.iov_base;
u32 frag = le32_to_cpu(rhead->args.readdir.frag);
u32 last_hash = 0;
@@ -1510,8 +1505,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
}
if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) {
- snapdir = ceph_get_snapdir(d_inode(parent));
- parent = d_find_alias(snapdir);
dout("readdir_prepopulate %d items under SNAPDIR dn %p\n",
rinfo->dir_nr, parent);
} else {
@@ -1519,15 +1512,18 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
rinfo->dir_nr, parent);
if (rinfo->dir_dir)
ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir);
- }
- if (ceph_frag_is_leftmost(frag) && req->r_readdir_offset == 2 &&
- !(rinfo->hash_order && last_hash)) {
- /* note dir version at start of readdir so we can tell
- * if any dentries get dropped */
- req->r_dir_release_cnt = atomic64_read(&ci->i_release_count);
- req->r_dir_ordered_cnt = atomic64_read(&ci->i_ordered_count);
- req->r_readdir_cache_idx = 0;
+ if (ceph_frag_is_leftmost(frag) &&
+ req->r_readdir_offset == 2 &&
+ !(rinfo->hash_order && last_hash)) {
+ /* note dir version at start of readdir so we can
+ * tell if any dentries get dropped */
+ req->r_dir_release_cnt =
+ atomic64_read(&ci->i_release_count);
+ req->r_dir_ordered_cnt =
+ atomic64_read(&ci->i_ordered_count);
+ req->r_readdir_cache_idx = 0;
+ }
}
cache_ctl.index = req->r_readdir_cache_idx;
@@ -1566,7 +1562,7 @@ retry_lookup:
dn = d_alloc(parent, &dname);
dout("d_alloc %p '%.*s' = %p\n", parent,
dname.len, dname.name, dn);
- if (dn == NULL) {
+ if (!dn) {
dout("d_alloc badness\n");
err = -ENOMEM;
goto out;
@@ -1650,10 +1646,6 @@ out:
req->r_readdir_cache_idx = cache_ctl.index;
}
ceph_readdir_cache_release(&cache_ctl);
- if (snapdir) {
- iput(snapdir);
- dput(parent);
- }
dout("readdir_prepopulate done\n");
return err;
}
@@ -1841,9 +1833,20 @@ retry:
* possibly truncate them.. so write AND block!
*/
if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) {
+ struct ceph_cap_snap *capsnap;
+ to = ci->i_truncate_size;
+ list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {
+ // MDS should have revoked Frw caps
+ WARN_ON_ONCE(capsnap->writing);
+ if (capsnap->dirty_pages && capsnap->size > to)
+ to = capsnap->size;
+ }
+ spin_unlock(&ci->i_ceph_lock);
dout("__do_pending_vmtruncate %p flushing snaps first\n",
inode);
- spin_unlock(&ci->i_ceph_lock);
+
+ truncate_pagecache(inode, to);
+
filemap_write_and_wait_range(&inode->i_data, 0,
inode->i_sb->s_maxbytes);
goto retry;
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 666a9f274832..84edfc60d87a 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -7,7 +7,6 @@
#include <linux/sched.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
-#include <linux/utsname.h>
#include <linux/ratelimit.h>
#include "super.h"
@@ -408,7 +407,7 @@ struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc,
{
struct ceph_mds_session *session;
- if (mds >= mdsc->max_sessions || mdsc->sessions[mds] == NULL)
+ if (mds >= mdsc->max_sessions || !mdsc->sessions[mds])
return NULL;
session = mdsc->sessions[mds];
dout("lookup_mds_session %p %d\n", session,
@@ -483,7 +482,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
dout("register_session realloc to %d\n", newmax);
sa = kcalloc(newmax, sizeof(void *), GFP_NOFS);
- if (sa == NULL)
+ if (!sa)
goto fail_realloc;
if (mdsc->sessions) {
memcpy(sa, mdsc->sessions,
@@ -731,9 +730,16 @@ static int __choose_mds(struct ceph_mds_client *mdsc,
inode = NULL;
if (req->r_inode) {
- inode = req->r_inode;
- ihold(inode);
- } else if (req->r_dentry) {
+ if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) {
+ inode = req->r_inode;
+ ihold(inode);
+ } else {
+ /* req->r_dentry is non-null for LSSNAP request.
+ * fall-thru */
+ WARN_ON_ONCE(!req->r_dentry);
+ }
+ }
+ if (!inode && req->r_dentry) {
/* ignore race with rename; old or new d_parent is okay */
struct dentry *parent;
struct inode *dir;
@@ -877,8 +883,8 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6
void *p;
const char* metadata[][2] = {
- {"hostname", utsname()->nodename},
- {"kernel_version", utsname()->release},
+ {"hostname", mdsc->nodename},
+ {"kernel_version", init_utsname()->release},
{"entity_id", opt->name ? : ""},
{"root", fsopt->server_path ? : "/"},
{NULL, NULL}
@@ -886,7 +892,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6
/* Calculate serialized length of metadata */
metadata_bytes = 4; /* map length */
- for (i = 0; metadata[i][0] != NULL; ++i) {
+ for (i = 0; metadata[i][0]; ++i) {
metadata_bytes += 8 + strlen(metadata[i][0]) +
strlen(metadata[i][1]);
metadata_key_count++;
@@ -919,7 +925,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6
ceph_encode_32(&p, metadata_key_count);
/* Two length-prefixed strings for each entry in the map */
- for (i = 0; metadata[i][0] != NULL; ++i) {
+ for (i = 0; metadata[i][0]; ++i) {
size_t const key_len = strlen(metadata[i][0]);
size_t const val_len = strlen(metadata[i][1]);
@@ -1122,7 +1128,7 @@ static int iterate_session_caps(struct ceph_mds_session *session,
spin_lock(&session->s_cap_lock);
p = p->next;
- if (cap->ci == NULL) {
+ if (!cap->ci) {
dout("iterate_session_caps finishing cap %p removal\n",
cap);
BUG_ON(cap->session != session);
@@ -1748,7 +1754,7 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
int len, pos;
unsigned seq;
- if (dentry == NULL)
+ if (!dentry)
return ERR_PTR(-EINVAL);
retry:
@@ -1771,7 +1777,7 @@ retry:
len--; /* no leading '/' */
path = kmalloc(len+1, GFP_NOFS);
- if (path == NULL)
+ if (!path)
return ERR_PTR(-ENOMEM);
pos = len;
path[pos] = 0; /* trailing null */
@@ -2875,7 +2881,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
}
if (list_empty(&ci->i_cap_snaps)) {
- snap_follows = 0;
+ snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0;
} else {
struct ceph_cap_snap *capsnap =
list_first_entry(&ci->i_cap_snaps,
@@ -3133,7 +3139,7 @@ static void check_new_map(struct ceph_mds_client *mdsc,
newmap->m_epoch, oldmap->m_epoch);
for (i = 0; i < oldmap->m_num_mds && i < mdsc->max_sessions; i++) {
- if (mdsc->sessions[i] == NULL)
+ if (!mdsc->sessions[i])
continue;
s = mdsc->sessions[i];
oldstate = ceph_mdsmap_get_state(oldmap, i);
@@ -3280,7 +3286,7 @@ static void handle_lease(struct ceph_mds_client *mdsc,
mutex_lock(&session->s_mutex);
session->s_seq++;
- if (inode == NULL) {
+ if (!inode) {
dout("handle_lease no inode %llx\n", vino.ino);
goto release;
}
@@ -3438,7 +3444,7 @@ static void delayed_work(struct work_struct *work)
for (i = 0; i < mdsc->max_sessions; i++) {
struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i);
- if (s == NULL)
+ if (!s)
continue;
if (s->s_state == CEPH_MDS_SESSION_CLOSING) {
dout("resending session close request for mds%d\n",
@@ -3490,7 +3496,7 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
fsc->mdsc = mdsc;
mutex_init(&mdsc->mutex);
mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS);
- if (mdsc->mdsmap == NULL) {
+ if (!mdsc->mdsmap) {
kfree(mdsc);
return -ENOMEM;
}
@@ -3532,6 +3538,8 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
init_rwsem(&mdsc->pool_perm_rwsem);
mdsc->pool_perm_tree = RB_ROOT;
+ strncpy(mdsc->nodename, utsname()->nodename,
+ sizeof(mdsc->nodename) - 1);
return 0;
}
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index db57ae98ed34..636d6b2ec49c 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -8,6 +8,7 @@
#include <linux/rbtree.h>
#include <linux/spinlock.h>
#include <linux/refcount.h>
+#include <linux/utsname.h>
#include <linux/ceph/types.h>
#include <linux/ceph/messenger.h>
@@ -368,6 +369,8 @@ struct ceph_mds_client {
struct rw_semaphore pool_perm_rwsem;
struct rb_root pool_perm_tree;
+
+ char nodename[__NEW_UTS_LEN + 1];
};
extern const char *ceph_mds_op_name(int op);
diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 1a748cf88535..33ced4c22732 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -112,7 +112,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
u16 mdsmap_ev;
m = kzalloc(sizeof(*m), GFP_NOFS);
- if (m == NULL)
+ if (!m)
return ERR_PTR(-ENOMEM);
ceph_decode_need(p, end, 1 + 1, bad);
@@ -138,7 +138,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
m->m_num_mds = m->m_max_mds;
m->m_info = kcalloc(m->m_num_mds, sizeof(*m->m_info), GFP_NOFS);
- if (m->m_info == NULL)
+ if (!m->m_info)
goto nomem;
/* pick out active nodes from mds_info (state > 0) */
@@ -232,7 +232,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
if (num_export_targets) {
info->export_targets = kcalloc(num_export_targets,
sizeof(u32), GFP_NOFS);
- if (info->export_targets == NULL)
+ if (!info->export_targets)
goto nomem;
for (j = 0; j < num_export_targets; j++)
info->export_targets[j] =
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index dab5d6732345..1ffc8b426c1c 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -299,7 +299,8 @@ static int cmpu64_rev(const void *a, const void *b)
/*
* build the snap context for a given realm.
*/
-static int build_snap_context(struct ceph_snap_realm *realm)
+static int build_snap_context(struct ceph_snap_realm *realm,
+ struct list_head* dirty_realms)
{
struct ceph_snap_realm *parent = realm->parent;
struct ceph_snap_context *snapc;
@@ -313,7 +314,7 @@ static int build_snap_context(struct ceph_snap_realm *realm)
*/
if (parent) {
if (!parent->cached_context) {
- err = build_snap_context(parent);
+ err = build_snap_context(parent, dirty_realms);
if (err)
goto fail;
}
@@ -332,7 +333,7 @@ static int build_snap_context(struct ceph_snap_realm *realm)
" (unchanged)\n",
realm->ino, realm, realm->cached_context,
realm->cached_context->seq,
- (unsigned int) realm->cached_context->num_snaps);
+ (unsigned int)realm->cached_context->num_snaps);
return 0;
}
@@ -373,7 +374,11 @@ static int build_snap_context(struct ceph_snap_realm *realm)
realm->ino, realm, snapc, snapc->seq,
(unsigned int) snapc->num_snaps);
- ceph_put_snap_context(realm->cached_context);
+ if (realm->cached_context) {
+ ceph_put_snap_context(realm->cached_context);
+ /* queue realm for cap_snap creation */
+ list_add_tail(&realm->dirty_item, dirty_realms);
+ }
realm->cached_context = snapc;
return 0;
@@ -394,15 +399,16 @@ fail:
/*
* rebuild snap context for the given realm and all of its children.
*/
-static void rebuild_snap_realms(struct ceph_snap_realm *realm)
+static void rebuild_snap_realms(struct ceph_snap_realm *realm,
+ struct list_head *dirty_realms)
{
struct ceph_snap_realm *child;
dout("rebuild_snap_realms %llx %p\n", realm->ino, realm);
- build_snap_context(realm);
+ build_snap_context(realm, dirty_realms);
list_for_each_entry(child, &realm->children, child_item)
- rebuild_snap_realms(child);
+ rebuild_snap_realms(child, dirty_realms);
}
@@ -624,13 +630,11 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
{
struct ceph_inode_info *ci;
struct inode *lastinode = NULL;
- struct ceph_snap_realm *child;
dout("queue_realm_cap_snaps %p %llx inodes\n", realm, realm->ino);
spin_lock(&realm->inodes_with_caps_lock);
- list_for_each_entry(ci, &realm->inodes_with_caps,
- i_snap_realm_item) {
+ list_for_each_entry(ci, &realm->inodes_with_caps, i_snap_realm_item) {
struct inode *inode = igrab(&ci->vfs_inode);
if (!inode)
continue;
@@ -643,14 +647,6 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
spin_unlock(&realm->inodes_with_caps_lock);
iput(lastinode);
- list_for_each_entry(child, &realm->children, child_item) {
- dout("queue_realm_cap_snaps %p %llx queue child %p %llx\n",
- realm, realm->ino, child, child->ino);
- list_del_init(&child->dirty_item);
- list_add(&child->dirty_item, &realm->dirty_item);
- }
-
- list_del_init(&realm->dirty_item);
dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino);
}
@@ -721,8 +717,6 @@ more:
if (err < 0)
goto fail;
- /* queue realm for cap_snap creation */
- list_add(&realm->dirty_item, &dirty_realms);
if (realm->seq > mdsc->last_snap_seq)
mdsc->last_snap_seq = realm->seq;
@@ -741,7 +735,7 @@ more:
/* invalidate when we reach the _end_ (root) of the trace */
if (invalidate && p >= e)
- rebuild_snap_realms(realm);
+ rebuild_snap_realms(realm, &dirty_realms);
if (!first_realm)
first_realm = realm;
@@ -758,6 +752,7 @@ more:
while (!list_empty(&dirty_realms)) {
realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
dirty_item);
+ list_del_init(&realm->dirty_item);
queue_realm_cap_snaps(realm);
}
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index aa06a8c24792..e4082afedcb1 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
struct ceph_statfs st;
u64 fsid;
int err;
+ u64 data_pool;
+
+ if (fsc->mdsc->mdsmap->m_num_data_pg_pools == 1) {
+ data_pool = fsc->mdsc->mdsmap->m_data_pg_pools[0];
+ } else {
+ data_pool = CEPH_NOPOOL;
+ }
dout("statfs\n");
- err = ceph_monc_do_statfs(&fsc->client->monc, &st);
+ err = ceph_monc_do_statfs(&fsc->client->monc, data_pool, &st);
if (err < 0)
return err;
@@ -113,7 +120,6 @@ enum {
Opt_rasize,
Opt_caps_wanted_delay_min,
Opt_caps_wanted_delay_max,
- Opt_cap_release_safety,
Opt_readdir_max_entries,
Opt_readdir_max_bytes,
Opt_congestion_kb,
@@ -152,7 +158,6 @@ static match_table_t fsopt_tokens = {
{Opt_rasize, "rasize=%d"},
{Opt_caps_wanted_delay_min, "caps_wanted_delay_min=%d"},
{Opt_caps_wanted_delay_max, "caps_wanted_delay_max=%d"},
- {Opt_cap_release_safety, "cap_release_safety=%d"},
{Opt_readdir_max_entries, "readdir_max_entries=%d"},
{Opt_readdir_max_bytes, "readdir_max_bytes=%d"},
{Opt_congestion_kb, "write_congestion_kb=%d"},
@@ -235,27 +240,43 @@ static int parse_fsopt_token(char *c, void *private)
break;
/* misc */
case Opt_wsize:
- fsopt->wsize = intval;
+ if (intval < PAGE_SIZE || intval > CEPH_MAX_WRITE_SIZE)
+ return -EINVAL;
+ fsopt->wsize = ALIGN(intval, PAGE_SIZE);
break;
case Opt_rsize:
- fsopt->rsize = intval;
+ if (intval < PAGE_SIZE || intval > CEPH_MAX_READ_SIZE)
+ return -EINVAL;
+ fsopt->rsize = ALIGN(intval, PAGE_SIZE);
break;
case Opt_rasize:
- fsopt->rasize = intval;
+ if (intval < 0)
+ return -EINVAL;
+ fsopt->rasize = ALIGN(intval + PAGE_SIZE - 1, PAGE_SIZE);
break;
case Opt_caps_wanted_delay_min:
+ if (intval < 1)
+ return -EINVAL;
fsopt->caps_wanted_delay_min = intval;
break;
case Opt_caps_wanted_delay_max:
+ if (intval < 1)
+ return -EINVAL;
fsopt->caps_wanted_delay_max = intval;
break;
case Opt_readdir_max_entries:
+ if (intval < 1)
+ return -EINVAL;
fsopt->max_readdir = intval;
break;
case Opt_readdir_max_bytes:
+ if (intval < PAGE_SIZE && intval != 0)
+ return -EINVAL;
fsopt->max_readdir_bytes = intval;
break;
case Opt_congestion_kb:
+ if (intval < 1024) /* at least 1M */
+ return -EINVAL;
fsopt->congestion_kb = intval;
break;
case Opt_dirstat:
@@ -392,7 +413,8 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
fsopt->sb_flags = flags;
fsopt->flags = CEPH_MOUNT_OPT_DEFAULT;
- fsopt->rsize = CEPH_RSIZE_DEFAULT;
+ fsopt->wsize = CEPH_MAX_WRITE_SIZE;
+ fsopt->rsize = CEPH_MAX_READ_SIZE;
fsopt->rasize = CEPH_RASIZE_DEFAULT;
fsopt->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL);
if (!fsopt->snapdir_name) {
@@ -402,7 +424,6 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
fsopt->caps_wanted_delay_min = CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT;
fsopt->caps_wanted_delay_max = CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT;
- fsopt->cap_release_safety = CEPH_CAP_RELEASE_SAFETY_DEFAULT;
fsopt->max_readdir = CEPH_MAX_READDIR_DEFAULT;
fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT;
fsopt->congestion_kb = default_congestion_kb();
@@ -508,7 +529,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
seq_printf(m, ",mds_namespace=%s", fsopt->mds_namespace);
if (fsopt->wsize)
seq_printf(m, ",wsize=%d", fsopt->wsize);
- if (fsopt->rsize != CEPH_RSIZE_DEFAULT)
+ if (fsopt->rsize != CEPH_MAX_READ_SIZE)
seq_printf(m, ",rsize=%d", fsopt->rsize);
if (fsopt->rasize != CEPH_RASIZE_DEFAULT)
seq_printf(m, ",rasize=%d", fsopt->rasize);
@@ -520,9 +541,6 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
if (fsopt->caps_wanted_delay_max != CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT)
seq_printf(m, ",caps_wanted_delay_max=%d",
fsopt->caps_wanted_delay_max);
- if (fsopt->cap_release_safety != CEPH_CAP_RELEASE_SAFETY_DEFAULT)
- seq_printf(m, ",cap_release_safety=%d",
- fsopt->cap_release_safety);
if (fsopt->max_readdir != CEPH_MAX_READDIR_DEFAULT)
seq_printf(m, ",readdir_max_entries=%d", fsopt->max_readdir);
if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT)
@@ -576,7 +594,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
}
fsc->client->extra_mon_dispatch = extra_mon_dispatch;
- if (fsopt->mds_namespace == NULL) {
+ if (!fsopt->mds_namespace) {
ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP,
0, true);
} else {
@@ -597,13 +615,13 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
* to be processed in parallel, limit concurrency.
*/
fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1);
- if (fsc->wb_wq == NULL)
+ if (!fsc->wb_wq)
goto fail_client;
fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1);
- if (fsc->pg_inv_wq == NULL)
+ if (!fsc->pg_inv_wq)
goto fail_wb_wq;
fsc->trunc_wq = alloc_workqueue("ceph-trunc", 0, 1);
- if (fsc->trunc_wq == NULL)
+ if (!fsc->trunc_wq)
goto fail_pg_inv_wq;
/* set up mempools */
@@ -674,26 +692,26 @@ static int __init init_caches(void)
__alignof__(struct ceph_inode_info),
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
SLAB_ACCOUNT, ceph_inode_init_once);
- if (ceph_inode_cachep == NULL)
+ if (!ceph_inode_cachep)
return -ENOMEM;
ceph_cap_cachep = KMEM_CACHE(ceph_cap,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_cap_cachep == NULL)
+ if (!ceph_cap_cachep)
goto bad_cap;
ceph_cap_flush_cachep = KMEM_CACHE(ceph_cap_flush,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_cap_flush_cachep == NULL)
+ if (!ceph_cap_flush_cachep)
goto bad_cap_flush;
ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
- if (ceph_dentry_cachep == NULL)
+ if (!ceph_dentry_cachep)
goto bad_dentry;
ceph_file_cachep = KMEM_CACHE(ceph_file_info, SLAB_MEM_SPREAD);
- if (ceph_file_cachep == NULL)
+ if (!ceph_file_cachep)
goto bad_file;
if ((error = ceph_fscache_register()))
@@ -947,20 +965,10 @@ static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc)
return err;
/* set ra_pages based on rasize mount option? */
- if (fsc->mount_options->rasize >= PAGE_SIZE)
- sb->s_bdi->ra_pages =
- (fsc->mount_options->rasize + PAGE_SIZE - 1)
- >> PAGE_SHIFT;
- else
- sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
-
- if (fsc->mount_options->rsize > fsc->mount_options->rasize &&
- fsc->mount_options->rsize >= PAGE_SIZE)
- sb->s_bdi->io_pages =
- (fsc->mount_options->rsize + PAGE_SIZE - 1)
- >> PAGE_SHIFT;
- else if (fsc->mount_options->rsize == 0)
- sb->s_bdi->io_pages = ULONG_MAX;
+ sb->s_bdi->ra_pages = fsc->mount_options->rasize >> PAGE_SHIFT;
+
+ /* set io_pages based on max osd read size */
+ sb->s_bdi->io_pages = fsc->mount_options->rsize >> PAGE_SHIFT;
return 0;
}
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index f02a2225fe42..279a2f401cf5 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -46,12 +46,25 @@
#define ceph_test_mount_opt(fsc, opt) \
(!!((fsc)->mount_options->flags & CEPH_MOUNT_OPT_##opt))
-#define CEPH_RSIZE_DEFAULT (64*1024*1024) /* max read size */
+/* max size of osd read request, limited by libceph */
+#define CEPH_MAX_READ_SIZE CEPH_MSG_MAX_DATA_LEN
+/* osd has a configurable limitaion of max write size.
+ * CEPH_MSG_MAX_DATA_LEN should be small enough. */
+#define CEPH_MAX_WRITE_SIZE CEPH_MSG_MAX_DATA_LEN
#define CEPH_RASIZE_DEFAULT (8192*1024) /* max readahead */
#define CEPH_MAX_READDIR_DEFAULT 1024
#define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024)
#define CEPH_SNAPDIRNAME_DEFAULT ".snap"
+/*
+ * Delay telling the MDS we no longer want caps, in case we reopen
+ * the file. Delay a minimum amount of time, even if we send a cap
+ * message for some other reason. Otherwise, take the oppotunity to
+ * update the mds to avoid sending another message later.
+ */
+#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
+#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
+
struct ceph_mount_options {
int flags;
int sb_flags;
@@ -61,7 +74,6 @@ struct ceph_mount_options {
int rasize; /* max readahead */
int congestion_kb; /* max writeback in flight */
int caps_wanted_delay_min, caps_wanted_delay_max;
- int cap_release_safety;
int max_readdir; /* max readdir result (entires) */
int max_readdir_bytes; /* max readdir result (bytes) */
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index 11263f102e4c..3542b2c364cf 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -777,7 +777,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
spin_unlock(&ci->i_ceph_lock);
/* security module gets xattr while filling trace */
- if (current->journal_info != NULL) {
+ if (current->journal_info) {
pr_warn_ratelimited("sync getxattr %p "
"during filling trace\n", inode);
return -EBUSY;
@@ -809,7 +809,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
memcpy(value, xattr->val, xattr->val_len);
- if (current->journal_info != NULL &&
+ if (current->journal_info &&
!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN))
ci->i_ceph_flags |= CEPH_I_SEC_INITED;
out:
@@ -1058,7 +1058,7 @@ do_sync_unlocked:
up_read(&mdsc->snap_rwsem);
/* security module set xattr while filling trace */
- if (current->journal_info != NULL) {
+ if (current->journal_info) {
pr_warn_ratelimited("sync setxattr %p "
"during filling trace\n", inode);
err = -EBUSY;
@@ -1108,7 +1108,7 @@ bool ceph_security_xattr_deadlock(struct inode *in)
{
struct ceph_inode_info *ci;
bool ret;
- if (in->i_security == NULL)
+ if (!in->i_security)
return false;
ci = ceph_inode(in);
spin_lock(&ci->i_ceph_lock);
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index 9727e1dcacd5..cbb9534b89b4 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -160,8 +160,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
if ((ses->serverDomain == NULL) ||
(ses->serverOS == NULL) ||
(ses->serverNOS == NULL)) {
- seq_printf(m, "\n%d) entry for %s not fully "
- "displayed\n\t", i, ses->serverName);
+ seq_printf(m, "\n%d) Name: %s Uses: %d Capability: 0x%x\tSession Status: %d\t",
+ i, ses->serverName, ses->ses_count,
+ ses->capabilities, ses->status);
+ if (ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST)
+ seq_printf(m, "Guest\t");
+ else if (ses->session_flags & SMB2_SESSION_FLAG_IS_NULL)
+ seq_printf(m, "Anonymous\t");
} else {
seq_printf(m,
"\n%d) Name: %s Domain: %s Uses: %d OS:"
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 180b3356ff86..8c8b75d33f31 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -461,6 +461,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
seq_puts(s, ",nocase");
if (tcon->retry)
seq_puts(s, ",hard");
+ else
+ seq_puts(s, ",soft");
if (tcon->use_persistent)
seq_puts(s, ",persistenthandles");
else if (tcon->use_resilient)
@@ -1447,7 +1449,7 @@ exit_cifs(void)
exit_cifs_idmap();
#endif
#ifdef CONFIG_CIFS_UPCALL
- unregister_key_type(&cifs_spnego_key_type);
+ exit_cifs_spnego();
#endif
cifs_destroy_request_bufs();
cifs_destroy_mids();
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
index 30bf89b1fd9a..5a10e566f0e6 100644
--- a/fs/cifs/cifsfs.h
+++ b/fs/cifs/cifsfs.h
@@ -149,5 +149,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
extern const struct export_operations cifs_export_ops;
#endif /* CONFIG_CIFS_NFSD_EXPORT */
-#define CIFS_VERSION "2.09"
+#define CIFS_VERSION "2.10"
#endif /* _CIFSFS_H */
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 808486c29f0d..de5b2e1fcce5 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -188,6 +188,8 @@ enum smb_version {
#ifdef CONFIG_CIFS_SMB311
Smb_311,
#endif /* SMB311 */
+ Smb_3any,
+ Smb_default,
Smb_version_err
};
@@ -1701,6 +1703,10 @@ extern struct smb_version_values smb20_values;
#define SMB21_VERSION_STRING "2.1"
extern struct smb_version_operations smb21_operations;
extern struct smb_version_values smb21_values;
+#define SMBDEFAULT_VERSION_STRING "default"
+extern struct smb_version_values smbdefault_values;
+#define SMB3ANY_VERSION_STRING "3"
+extern struct smb_version_values smb3any_values;
#define SMB30_VERSION_STRING "3.0"
extern struct smb_version_operations smb30_operations;
extern struct smb_version_values smb30_values;
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 5aa2d278ca84..0bfc2280436d 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -301,6 +301,8 @@ static const match_table_t cifs_smb_version_tokens = {
{ Smb_311, SMB311_VERSION_STRING },
{ Smb_311, ALT_SMB311_VERSION_STRING },
#endif /* SMB311 */
+ { Smb_3any, SMB3ANY_VERSION_STRING },
+ { Smb_default, SMBDEFAULT_VERSION_STRING },
{ Smb_version_err, NULL }
};
@@ -1148,6 +1150,14 @@ cifs_parse_smb_version(char *value, struct smb_vol *vol)
vol->vals = &smb311_values;
break;
#endif /* SMB311 */
+ case Smb_3any:
+ vol->ops = &smb30_operations; /* currently identical with 3.0 */
+ vol->vals = &smb3any_values;
+ break;
+ case Smb_default:
+ vol->ops = &smb30_operations; /* currently identical with 3.0 */
+ vol->vals = &smbdefault_values;
+ break;
default:
cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
return 1;
@@ -1274,9 +1284,9 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
vol->actimeo = CIFS_DEF_ACTIMEO;
- /* FIXME: add autonegotiation for SMB3 or later rather than just SMB3 */
- vol->ops = &smb30_operations; /* both secure and accepted widely */
- vol->vals = &smb30_values;
+ /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
+ vol->ops = &smb30_operations;
+ vol->vals = &smbdefault_values;
vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
@@ -1988,11 +1998,10 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
if (got_version == false)
pr_warn("No dialect specified on mount. Default has changed to "
- "a more secure dialect, SMB3 (vers=3.0), from CIFS "
+ "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
"(SMB1). To use the less secure SMB1 dialect to access "
- "old servers which do not support SMB3 specify vers=1.0"
- " on mount. For somewhat newer servers such as Windows "
- "7 try vers=2.1.\n");
+ "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
+ " on mount.\n");
kfree(mountdata_copy);
return 0;
@@ -2133,6 +2142,7 @@ static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
if (vol->nosharesock)
return 0;
+ /* BB update this for smb3any and default case */
if ((server->vals != vol->vals) || (server->ops != vol->ops))
return 0;
@@ -4144,6 +4154,14 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
server->sec_mode, server->capabilities, server->timeAdj);
+ if (ses->auth_key.response) {
+ cifs_dbg(VFS, "Free previous auth_key.response = %p\n",
+ ses->auth_key.response);
+ kfree(ses->auth_key.response);
+ ses->auth_key.response = NULL;
+ ses->auth_key.len = 0;
+ }
+
if (server->ops->sess_setup)
rc = server->ops->sess_setup(xid, ses, nls_info);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 0786f19d288f..92fdf9c35de2 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -224,6 +224,13 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
+ /* O_SYNC also has bit for O_DSYNC so following check picks up either */
+ if (f_flags & O_SYNC)
+ create_options |= CREATE_WRITE_THROUGH;
+
+ if (f_flags & O_DIRECT)
+ create_options |= CREATE_NO_BUFFER;
+
oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb;
oparms.desired_access = desired_access;
@@ -1102,8 +1109,10 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
struct cifs_tcon *tcon;
unsigned int num, max_num, max_buf;
LOCKING_ANDX_RANGE *buf, *cur;
- int types[] = {LOCKING_ANDX_LARGE_FILES,
- LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
+ static const int types[] = {
+ LOCKING_ANDX_LARGE_FILES,
+ LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES
+ };
int i;
xid = get_xid();
@@ -1434,8 +1443,10 @@ cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
unsigned int xid)
{
int rc = 0, stored_rc;
- int types[] = {LOCKING_ANDX_LARGE_FILES,
- LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
+ static const int types[] = {
+ LOCKING_ANDX_LARGE_FILES,
+ LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES
+ };
unsigned int i;
unsigned int max_num, num, max_buf;
LOCKING_ANDX_RANGE *buf, *cur;
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index a8693632235f..7c732cb44164 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -234,6 +234,8 @@ cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
+ /* old POSIX extensions don't get create time */
+
fattr->cf_mode = le64_to_cpu(info->Permissions);
/*
@@ -2024,6 +2026,19 @@ int cifs_getattr(const struct path *path, struct kstat *stat,
stat->blksize = CIFS_MAX_MSGSIZE;
stat->ino = CIFS_I(inode)->uniqueid;
+ /* old CIFS Unix Extensions doesn't return create time */
+ if (CIFS_I(inode)->createtime) {
+ stat->result_mask |= STATX_BTIME;
+ stat->btime =
+ cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
+ }
+
+ stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
+ if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
+ stat->attributes |= STATX_ATTR_COMPRESSED;
+ if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
+ stat->attributes |= STATX_ATTR_ENCRYPTED;
+
/*
* If on a multiuser mount without unix extensions or cifsacl being
* enabled, and the admin hasn't overridden them, set the ownership
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index fb2934b9b97c..0dafdbae1f8c 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -426,6 +426,7 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
return rc;
}
+#ifdef CONFIG_CIFS_XATTR
static ssize_t
move_smb2_ea_to_cifs(char *dst, size_t dst_size,
struct smb2_file_full_ea_info *src, size_t src_size,
@@ -613,6 +614,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
return rc;
}
+#endif
static bool
smb2_can_echo(struct TCP_Server_Info *server)
@@ -3110,6 +3112,46 @@ struct smb_version_values smb21_values = {
.create_lease_size = sizeof(struct create_lease),
};
+struct smb_version_values smb3any_values = {
+ .version_string = SMB3ANY_VERSION_STRING,
+ .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
+ .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
+ .large_lock_type = 0,
+ .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
+ .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+ .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
+ .header_size = sizeof(struct smb2_hdr),
+ .max_header_size = MAX_SMB2_HDR_SIZE,
+ .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
+ .lock_cmd = SMB2_LOCK,
+ .cap_unix = 0,
+ .cap_nt_find = SMB2_NT_FIND,
+ .cap_large_files = SMB2_LARGE_FILES,
+ .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
+ .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
+ .create_lease_size = sizeof(struct create_lease_v2),
+};
+
+struct smb_version_values smbdefault_values = {
+ .version_string = SMBDEFAULT_VERSION_STRING,
+ .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
+ .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
+ .large_lock_type = 0,
+ .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
+ .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+ .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
+ .header_size = sizeof(struct smb2_hdr),
+ .max_header_size = MAX_SMB2_HDR_SIZE,
+ .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
+ .lock_cmd = SMB2_LOCK,
+ .cap_unix = 0,
+ .cap_nt_find = SMB2_NT_FIND,
+ .cap_large_files = SMB2_LARGE_FILES,
+ .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
+ .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
+ .create_lease_size = sizeof(struct create_lease_v2),
+};
+
struct smb_version_values smb30_values = {
.version_string = SMB30_VERSION_STRING,
.protocol_id = SMB30_PROT_ID,
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 5531e7ee1210..6f0e6343c15e 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -439,7 +439,7 @@ assemble_neg_contexts(struct smb2_negotiate_req *req)
build_encrypt_ctxt((struct smb2_encryption_neg_context *)pneg_ctxt);
req->NegotiateContextOffset = cpu_to_le32(OFFSET_OF_NEG_CONTEXT);
req->NegotiateContextCount = cpu_to_le16(2);
- inc_rfc1001_len(req, 4 + sizeof(struct smb2_preauth_neg_context) + 2
+ inc_rfc1001_len(req, 4 + sizeof(struct smb2_preauth_neg_context)
+ sizeof(struct smb2_encryption_neg_context)); /* calculate hash */
}
#else
@@ -491,10 +491,25 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
req->hdr.sync_hdr.SessionId = 0;
- req->Dialects[0] = cpu_to_le16(ses->server->vals->protocol_id);
-
- req->DialectCount = cpu_to_le16(1); /* One vers= at a time for now */
- inc_rfc1001_len(req, 2);
+ if (strcmp(ses->server->vals->version_string,
+ SMB3ANY_VERSION_STRING) == 0) {
+ req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID);
+ req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID);
+ req->DialectCount = cpu_to_le16(2);
+ inc_rfc1001_len(req, 4);
+ } else if (strcmp(ses->server->vals->version_string,
+ SMBDEFAULT_VERSION_STRING) == 0) {
+ req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID);
+ req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID);
+ req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID);
+ req->DialectCount = cpu_to_le16(3);
+ inc_rfc1001_len(req, 6);
+ } else {
+ /* otherwise send specific dialect */
+ req->Dialects[0] = cpu_to_le16(ses->server->vals->protocol_id);
+ req->DialectCount = cpu_to_le16(1);
+ inc_rfc1001_len(req, 2);
+ }
/* only one of SMB2 signing flags may be set in SMB2 request */
if (ses->sign)
@@ -528,16 +543,43 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
*/
if (rc == -EOPNOTSUPP) {
cifs_dbg(VFS, "Dialect not supported by server. Consider "
- "specifying vers=1.0 or vers=2.1 on mount for accessing"
+ "specifying vers=1.0 or vers=2.0 on mount for accessing"
" older servers\n");
goto neg_exit;
} else if (rc != 0)
goto neg_exit;
+ if (strcmp(ses->server->vals->version_string,
+ SMB3ANY_VERSION_STRING) == 0) {
+ if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) {
+ cifs_dbg(VFS,
+ "SMB2 dialect returned but not requested\n");
+ return -EIO;
+ } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) {
+ cifs_dbg(VFS,
+ "SMB2.1 dialect returned but not requested\n");
+ return -EIO;
+ }
+ } else if (strcmp(ses->server->vals->version_string,
+ SMBDEFAULT_VERSION_STRING) == 0) {
+ if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) {
+ cifs_dbg(VFS,
+ "SMB2 dialect returned but not requested\n");
+ return -EIO;
+ } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) {
+ /* ops set to 3.0 by default for default so update */
+ ses->server->ops = &smb21_operations;
+ }
+ } else if (le16_to_cpu(rsp->DialectRevision) !=
+ ses->server->vals->protocol_id) {
+ /* if requested single dialect ensure returned dialect matched */
+ cifs_dbg(VFS, "Illegal 0x%x dialect returned: not requested\n",
+ le16_to_cpu(rsp->DialectRevision));
+ return -EIO;
+ }
+
cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode);
- /* BB we may eventually want to match the negotiated vs. requested
- dialect, even though we are only requesting one at a time */
if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID))
cifs_dbg(FYI, "negotiated smb2.0 dialect\n");
else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID))
@@ -558,6 +600,8 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
}
server->dialect = le16_to_cpu(rsp->DialectRevision);
+ /* BB: add check that dialect was valid given dialect(s) we asked for */
+
/* SMB2 only has an extended negflavor */
server->negflavor = CIFS_NEGFLAVOR_EXTENDED;
/* set it to the maximum buffer size value we can send with 1 credit */
@@ -606,20 +650,28 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
struct validate_negotiate_info_req vneg_inbuf;
struct validate_negotiate_info_rsp *pneg_rsp;
u32 rsplen;
+ u32 inbuflen; /* max of 4 dialects */
cifs_dbg(FYI, "validate negotiate\n");
/*
* validation ioctl must be signed, so no point sending this if we
- * can not sign it. We could eventually change this to selectively
+ * can not sign it (ie are not known user). Even if signing is not
+ * required (enabled but not negotiated), in those cases we selectively
* sign just this, the first and only signed request on a connection.
- * This is good enough for now since a user who wants better security
- * would also enable signing on the mount. Having validation of
- * negotiate info for signed connections helps reduce attack vectors
+ * Having validation of negotiate info helps reduce attack vectors.
*/
- if (tcon->ses->server->sign == false)
+ if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST)
return 0; /* validation requires signing */
+ if (tcon->ses->user_name == NULL) {
+ cifs_dbg(FYI, "Can't validate negotiate: null user mount\n");
+ return 0; /* validation requires signing */
+ }
+
+ if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL)
+ cifs_dbg(VFS, "Unexpected null user (anonymous) auth flag sent by server\n");
+
vneg_inbuf.Capabilities =
cpu_to_le32(tcon->ses->server->vals->req_capabilities);
memcpy(vneg_inbuf.Guid, tcon->ses->server->client_guid,
@@ -634,9 +686,30 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
else
vneg_inbuf.SecurityMode = 0;
- vneg_inbuf.DialectCount = cpu_to_le16(1);
- vneg_inbuf.Dialects[0] =
- cpu_to_le16(tcon->ses->server->vals->protocol_id);
+
+ if (strcmp(tcon->ses->server->vals->version_string,
+ SMB3ANY_VERSION_STRING) == 0) {
+ vneg_inbuf.Dialects[0] = cpu_to_le16(SMB30_PROT_ID);
+ vneg_inbuf.Dialects[1] = cpu_to_le16(SMB302_PROT_ID);
+ vneg_inbuf.DialectCount = cpu_to_le16(2);
+ /* structure is big enough for 3 dialects, sending only 2 */
+ inbuflen = sizeof(struct validate_negotiate_info_req) - 2;
+ } else if (strcmp(tcon->ses->server->vals->version_string,
+ SMBDEFAULT_VERSION_STRING) == 0) {
+ vneg_inbuf.Dialects[0] = cpu_to_le16(SMB21_PROT_ID);
+ vneg_inbuf.Dialects[1] = cpu_to_le16(SMB30_PROT_ID);
+ vneg_inbuf.Dialects[2] = cpu_to_le16(SMB302_PROT_ID);
+ vneg_inbuf.DialectCount = cpu_to_le16(3);
+ /* structure is big enough for 3 dialects */
+ inbuflen = sizeof(struct validate_negotiate_info_req);
+ } else {
+ /* otherwise specific dialect was requested */
+ vneg_inbuf.Dialects[0] =
+ cpu_to_le16(tcon->ses->server->vals->protocol_id);
+ vneg_inbuf.DialectCount = cpu_to_le16(1);
+ /* structure is big enough for 3 dialects, sending only 1 */
+ inbuflen = sizeof(struct validate_negotiate_info_req) - 4;
+ }
rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */,
@@ -1110,6 +1183,8 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,
while (sess_data->func)
sess_data->func(sess_data);
+ if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign))
+ cifs_dbg(VFS, "signing requested but authenticated as guest\n");
rc = sess_data->result;
out:
kfree(sess_data);
@@ -1634,7 +1709,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
struct cifs_tcon *tcon = oparms->tcon;
struct cifs_ses *ses = tcon->ses;
struct kvec iov[4];
- struct kvec rsp_iov;
+ struct kvec rsp_iov = {NULL, 0};
int resp_buftype;
int uni_path_len;
__le16 *copy_path = NULL;
@@ -1763,7 +1838,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
if (rc != 0) {
cifs_stats_fail_inc(tcon, SMB2_CREATE_HE);
- if (err_buf)
+ if (err_buf && rsp)
*err_buf = kmemdup(rsp, get_rfc1002_length(rsp) + 4,
GFP_KERNEL);
goto creat_exit;
diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h
index 393ed5f4e1b6..6c9653a130c8 100644
--- a/fs/cifs/smb2pdu.h
+++ b/fs/cifs/smb2pdu.h
@@ -716,7 +716,7 @@ struct validate_negotiate_info_req {
__u8 Guid[SMB2_CLIENT_GUID_SIZE];
__le16 SecurityMode;
__le16 DialectCount;
- __le16 Dialects[1]; /* dialect (someday maybe list) client asked for */
+ __le16 Dialects[3]; /* BB expand this if autonegotiate > 3 dialects */
} __packed;
struct validate_negotiate_info_rsp {
diff --git a/fs/coda/dir.c b/fs/coda/dir.c
index c0474ac6cbf2..274ab5586dd0 100644
--- a/fs/coda/dir.c
+++ b/fs/coda/dir.c
@@ -368,9 +368,10 @@ static int coda_venus_readdir(struct file *coda_file, struct dir_context *ctx)
goto out;
while (1) {
+ loff_t pos = ctx->pos - 2;
+
/* read entries from the directory file */
- ret = kernel_read(host_file, ctx->pos - 2, (char *)vdir,
- sizeof(*vdir));
+ ret = kernel_read(host_file, vdir, sizeof(*vdir), &pos);
if (ret < 0) {
pr_err("%s: read dir %s failed %d\n",
__func__, coda_f2s(&cii->c_fid), ret);
diff --git a/fs/coredump.c b/fs/coredump.c
index 592683711c64..0eec03696707 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -161,7 +161,7 @@ static int cn_print_exe_file(struct core_name *cn)
if (!exe_file)
return cn_esc_printf(cn, "%s (path unknown)", current->comm);
- pathbuf = kmalloc(PATH_MAX, GFP_TEMPORARY);
+ pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
if (!pathbuf) {
ret = -ENOMEM;
goto put_exe_file;
diff --git a/fs/dax.c b/fs/dax.c
index 6afcacb3a87b..f001d8c72a06 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -734,7 +734,7 @@ static int dax_writeback_one(struct block_device *bdev,
}
dax_mapping_entry_mkclean(mapping, index, pfn_t_to_pfn(pfn));
- dax_flush(dax_dev, pgoff, kaddr, size);
+ dax_flush(dax_dev, kaddr, size);
/*
* After we have flushed the cache, we can clear the dirty tag. There
* cannot be new dirty data in the pfn after the flush has completed as
@@ -929,7 +929,7 @@ int __dax_zero_page_range(struct block_device *bdev,
return rc;
}
memset(kaddr + offset, 0, size);
- dax_flush(dax_dev, pgoff, kaddr + offset, size);
+ dax_flush(dax_dev, kaddr + offset, size);
dax_read_unlock(id);
}
return 0;
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 5fa2211e49ae..62cf812ed0e5 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -229,6 +229,7 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
{
loff_t offset = dio->iocb->ki_pos;
ssize_t transferred = 0;
+ int err;
/*
* AIO submission can race with bio completion to get here while
@@ -258,8 +259,22 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
if (ret == 0)
ret = transferred;
+ /*
+ * Try again to invalidate clean pages which might have been cached by
+ * non-direct readahead, or faulted in by get_user_pages() if the source
+ * of the write was an mmap'ed region of the file we're writing. Either
+ * one is a pretty crazy thing to do, so we don't support it 100%. If
+ * this invalidation fails, tough, the write still worked...
+ */
+ if (ret > 0 && dio->op == REQ_OP_WRITE &&
+ dio->inode->i_mapping->nrpages) {
+ err = invalidate_inode_pages2_range(dio->inode->i_mapping,
+ offset >> PAGE_SHIFT,
+ (offset + ret - 1) >> PAGE_SHIFT);
+ WARN_ON_ONCE(err);
+ }
+
if (dio->end_io) {
- int err;
// XXX: ki_pos??
err = dio->end_io(dio->iocb, offset, ret, dio->private);
@@ -304,6 +319,7 @@ static void dio_bio_end_aio(struct bio *bio)
struct dio *dio = bio->bi_private;
unsigned long remaining;
unsigned long flags;
+ bool defer_completion = false;
/* cleanup the bio */
dio_bio_complete(dio, bio);
@@ -315,7 +331,19 @@ static void dio_bio_end_aio(struct bio *bio)
spin_unlock_irqrestore(&dio->bio_lock, flags);
if (remaining == 0) {
- if (dio->result && dio->defer_completion) {
+ /*
+ * Defer completion when defer_completion is set or
+ * when the inode has pages mapped and this is AIO write.
+ * We need to invalidate those pages because there is a
+ * chance they contain stale data in the case buffered IO
+ * went in between AIO submission and completion into the
+ * same region.
+ */
+ if (dio->result)
+ defer_completion = dio->defer_completion ||
+ (dio->op == REQ_OP_WRITE &&
+ dio->inode->i_mapping->nrpages);
+ if (defer_completion) {
INIT_WORK(&dio->complete_work, dio_aio_complete_work);
queue_work(dio->inode->i_sb->s_dio_done_wq,
&dio->complete_work);
@@ -1210,10 +1238,19 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
* For AIO O_(D)SYNC writes we need to defer completions to a workqueue
* so that we can call ->fsync.
*/
- if (dio->is_async && iov_iter_rw(iter) == WRITE &&
- ((iocb->ki_filp->f_flags & O_DSYNC) ||
- IS_SYNC(iocb->ki_filp->f_mapping->host))) {
- retval = dio_set_defer_completion(dio);
+ if (dio->is_async && iov_iter_rw(iter) == WRITE) {
+ retval = 0;
+ if ((iocb->ki_filp->f_flags & O_DSYNC) ||
+ IS_SYNC(iocb->ki_filp->f_mapping->host))
+ retval = dio_set_defer_completion(dio);
+ else if (!dio->inode->i_sb->s_dio_done_wq) {
+ /*
+ * In case of AIO write racing with buffered read we
+ * need to defer completion. We can't decide this now,
+ * however the workqueue needs to be initialized here.
+ */
+ retval = sb_init_dio_done_wq(dio->inode->i_sb);
+ }
if (retval) {
/*
* We grab i_mutex only for reads so we don't have
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index 9014479d0160..6b801186baa5 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -568,8 +568,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags
* 1) The lower mount is ro
* 2) The ecryptfs_encrypted_view mount option is specified
*/
- if (path.dentry->d_sb->s_flags & MS_RDONLY ||
- mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
+ if (sb_rdonly(path.dentry->d_sb) || mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
s->s_flags |= MS_RDONLY;
s->s_maxbytes = path.dentry->d_sb->s_maxbytes;
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c
index 039e627194a9..c596e7c03424 100644
--- a/fs/ecryptfs/read_write.c
+++ b/fs/ecryptfs/read_write.c
@@ -47,7 +47,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
if (!lower_file)
return -EIO;
- rc = kernel_write(lower_file, data, size, offset);
+ rc = kernel_write(lower_file, data, size, &offset);
mark_inode_dirty_sync(ecryptfs_inode);
return rc;
}
@@ -237,7 +237,7 @@ int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
if (!lower_file)
return -EIO;
- return kernel_read(lower_file, offset, data, size);
+ return kernel_read(lower_file, data, size, &offset);
}
/**
diff --git a/fs/efs/super.c b/fs/efs/super.c
index 368f7dd21c61..5c42f1e34a2f 100644
--- a/fs/efs/super.c
+++ b/fs/efs/super.c
@@ -306,7 +306,7 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)
}
brelse(bh);
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
#ifdef DEBUG
pr_info("forcing read-only mode\n");
#endif
diff --git a/fs/exec.c b/fs/exec.c
index 01a9fb9d8ac3..5470d3c1892a 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -885,23 +885,6 @@ struct file *open_exec(const char *name)
}
EXPORT_SYMBOL(open_exec);
-int kernel_read(struct file *file, loff_t offset,
- char *addr, unsigned long count)
-{
- mm_segment_t old_fs;
- loff_t pos = offset;
- int result;
-
- old_fs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- result = vfs_read(file, (void __user *)addr, count, &pos);
- set_fs(old_fs);
- return result;
-}
-
-EXPORT_SYMBOL(kernel_read);
-
int kernel_read_file(struct file *file, void **buf, loff_t *size,
loff_t max_size, enum kernel_read_file_id id)
{
@@ -939,8 +922,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size,
pos = 0;
while (pos < i_size) {
- bytes = kernel_read(file, pos, (char *)(*buf) + pos,
- i_size - pos);
+ bytes = kernel_read(file, *buf + pos, i_size - pos, &pos);
if (bytes < 0) {
ret = bytes;
goto out;
@@ -948,7 +930,6 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size,
if (bytes == 0)
break;
- pos += bytes;
}
if (pos != i_size) {
@@ -974,7 +955,7 @@ out:
}
EXPORT_SYMBOL_GPL(kernel_read_file);
-int kernel_read_file_from_path(char *path, void **buf, loff_t *size,
+int kernel_read_file_from_path(const char *path, void **buf, loff_t *size,
loff_t max_size, enum kernel_read_file_id id)
{
struct file *file;
@@ -1429,7 +1410,7 @@ static void free_bprm(struct linux_binprm *bprm)
kfree(bprm);
}
-int bprm_change_interp(char *interp, struct linux_binprm *bprm)
+int bprm_change_interp(const char *interp, struct linux_binprm *bprm)
{
/* If a binfmt changed the interp, free it first. */
if (bprm->interp != bprm->filename)
@@ -1567,6 +1548,7 @@ static void bprm_fill_uid(struct linux_binprm *bprm)
int prepare_binprm(struct linux_binprm *bprm)
{
int retval;
+ loff_t pos = 0;
bprm_fill_uid(bprm);
@@ -1577,7 +1559,7 @@ int prepare_binprm(struct linux_binprm *bprm)
bprm->called_set_creds = 1;
memset(bprm->buf, 0, BINPRM_BUF_SIZE);
- return kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE);
+ return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos);
}
EXPORT_SYMBOL(prepare_binprm);
@@ -1763,9 +1745,9 @@ static int do_execveat_common(int fd, struct filename *filename,
bprm->filename = filename->name;
} else {
if (filename->name[0] == '\0')
- pathbuf = kasprintf(GFP_TEMPORARY, "/dev/fd/%d", fd);
+ pathbuf = kasprintf(GFP_KERNEL, "/dev/fd/%d", fd);
else
- pathbuf = kasprintf(GFP_TEMPORARY, "/dev/fd/%d/%s",
+ pathbuf = kasprintf(GFP_KERNEL, "/dev/fd/%d/%s",
fd, filename->name);
if (!pathbuf) {
retval = -ENOMEM;
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 23ebb92484c6..28de3edd4f4d 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -114,6 +114,7 @@ struct ext2_sb_info {
*/
spinlock_t s_lock;
struct mb_cache *s_ea_block_cache;
+ struct dax_device *s_daxdev;
};
static inline spinlock_t *
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 30163d007b2f..4dca6f348714 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -800,10 +800,10 @@ int ext2_get_block(struct inode *inode, sector_t iblock,
static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
unsigned flags, struct iomap *iomap)
{
- struct block_device *bdev;
unsigned int blkbits = inode->i_blkbits;
unsigned long first_block = offset >> blkbits;
unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits;
+ struct ext2_sb_info *sbi = EXT2_SB(inode->i_sb);
bool new = false, boundary = false;
u32 bno;
int ret;
@@ -814,13 +814,9 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
return ret;
iomap->flags = 0;
- bdev = inode->i_sb->s_bdev;
- iomap->bdev = bdev;
+ iomap->bdev = inode->i_sb->s_bdev;
iomap->offset = (u64)first_block << blkbits;
- if (blk_queue_dax(bdev->bd_queue))
- iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
- else
- iomap->dax_dev = NULL;
+ iomap->dax_dev = sbi->s_daxdev;
if (ret == 0) {
iomap->type = IOMAP_HOLE;
@@ -842,7 +838,6 @@ static int
ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
ssize_t written, unsigned flags, struct iomap *iomap)
{
- fs_put_dax(iomap->dax_dev);
if (iomap->type == IOMAP_MAPPED &&
written < length &&
(flags & IOMAP_WRITE))
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 7b1bc9059863..1458706bd2ec 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -52,7 +52,7 @@ void ext2_error(struct super_block *sb, const char *function,
struct ext2_sb_info *sbi = EXT2_SB(sb);
struct ext2_super_block *es = sbi->s_es;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
spin_lock(&sbi->s_lock);
sbi->s_mount_state |= EXT2_ERROR_FS;
es->s_state |= cpu_to_le16(EXT2_ERROR_FS);
@@ -151,7 +151,7 @@ static void ext2_put_super (struct super_block * sb)
ext2_xattr_destroy_cache(sbi->s_ea_block_cache);
sbi->s_ea_block_cache = NULL;
}
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
struct ext2_super_block *es = sbi->s_es;
spin_lock(&sbi->s_lock);
@@ -171,6 +171,7 @@ static void ext2_put_super (struct super_block * sb)
brelse (sbi->s_sbh);
sb->s_fs_info = NULL;
kfree(sbi->s_blockgroup_lock);
+ fs_put_dax(sbi->s_daxdev);
kfree(sbi);
}
@@ -813,6 +814,7 @@ static unsigned long descriptor_loc(struct super_block *sb,
static int ext2_fill_super(struct super_block *sb, void *data, int silent)
{
+ struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev);
struct buffer_head * bh;
struct ext2_sb_info * sbi;
struct ext2_super_block * es;
@@ -842,6 +844,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
}
sb->s_fs_info = sbi;
sbi->s_sb_block = sb_block;
+ sbi->s_daxdev = dax_dev;
spin_lock_init(&sbi->s_lock);
@@ -940,8 +943,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
le32_to_cpu(features));
goto failed_mount;
}
- if (!(sb->s_flags & MS_RDONLY) &&
- (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
+ if (!sb_rdonly(sb) && (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
ext2_msg(sb, KERN_ERR, "error: couldn't mount RDWR because of "
"unsupported optional features (%x)",
le32_to_cpu(features));
@@ -1170,7 +1172,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
if (EXT2_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL))
ext2_msg(sb, KERN_WARNING,
"warning: mounting ext3 filesystem as ext2");
- if (ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY))
+ if (ext2_setup_super (sb, es, sb_rdonly(sb)))
sb->s_flags |= MS_RDONLY;
ext2_write_super(sb);
return 0;
@@ -1200,6 +1202,7 @@ failed_sbi:
kfree(sbi->s_blockgroup_lock);
kfree(sbi);
failed:
+ fs_put_dax(dax_dev);
return ret;
}
@@ -1301,7 +1304,7 @@ static int ext2_unfreeze(struct super_block *sb)
static void ext2_write_super(struct super_block *sb)
{
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
ext2_sync_fs(sb, 1);
}
@@ -1339,7 +1342,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
"dax flag with busy inodes while remounting");
sbi->s_mount_opt ^= EXT2_MOUNT_DAX;
}
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb)) {
spin_unlock(&sbi->s_lock);
return 0;
}
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 84b9da192238..e2abe01c8c6b 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1526,6 +1526,7 @@ struct ext4_sb_info {
/* Barrier between changing inodes' journal flags and writepages ops. */
struct percpu_rw_semaphore s_journal_flag_rwsem;
+ struct dax_device *s_daxdev;
};
static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb)
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
index dd106b1d5d89..5b342ac67d2e 100644
--- a/fs/ext4/ext4_jbd2.c
+++ b/fs/ext4/ext4_jbd2.c
@@ -47,7 +47,7 @@ static int ext4_journal_check_start(struct super_block *sb)
if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
return -EIO;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
journal = EXT4_SB(sb)->s_journal;
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 57dcaea762c3..b1da660ac3bc 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -223,6 +223,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (IS_DAX(inode))
return ext4_dax_write_iter(iocb, from);
#endif
+ if (!o_direct && (iocb->ki_flags & IOCB_NOWAIT))
+ return -EOPNOTSUPP;
if (!inode_trylock(inode)) {
if (iocb->ki_flags & IOCB_NOWAIT)
@@ -371,7 +373,7 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
return -EIO;
if (unlikely(!(sbi->s_mount_flags & EXT4_MF_MNTDIR_SAMPLED) &&
- !(sb->s_flags & MS_RDONLY))) {
+ !sb_rdonly(sb))) {
sbi->s_mount_flags |= EXT4_MF_MNTDIR_SAMPLED;
/*
* Sample where the filesystem has been mounted and
@@ -431,9 +433,7 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
return ret;
}
- /* Set the flags to support nowait AIO */
- filp->f_mode |= FMODE_AIO_NOWAIT;
-
+ filp->f_mode |= FMODE_NOWAIT;
return dquot_file_open(inode, filp);
}
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c
index aae2c3971cef..f9230580a84b 100644
--- a/fs/ext4/fsync.c
+++ b/fs/ext4/fsync.c
@@ -107,7 +107,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
trace_ext4_sync_file_enter(file, datasync);
- if (inode->i_sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(inode->i_sb)) {
/* Make sure that we read updated s_mount_flags value */
smp_rmb();
if (EXT4_SB(inode->i_sb)->s_mount_flags & EXT4_MF_FS_ABORTED)
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 71e93a23cec3..ee823022aa34 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -1382,7 +1382,7 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
int num, ret = 0, used_blks = 0;
/* This should not happen, but just to be sure check this */
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
ret = 1;
goto out;
}
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index e963508ea35f..31db875bc7a1 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3397,7 +3397,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
unsigned flags, struct iomap *iomap)
{
- struct block_device *bdev;
+ struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
unsigned int blkbits = inode->i_blkbits;
unsigned long first_block = offset >> blkbits;
unsigned long last_block = (offset + length - 1) >> blkbits;
@@ -3466,12 +3466,8 @@ retry:
}
iomap->flags = 0;
- bdev = inode->i_sb->s_bdev;
- iomap->bdev = bdev;
- if (blk_queue_dax(bdev->bd_queue))
- iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
- else
- iomap->dax_dev = NULL;
+ iomap->bdev = inode->i_sb->s_bdev;
+ iomap->dax_dev = sbi->s_daxdev;
iomap->offset = first_block << blkbits;
if (ret == 0) {
@@ -3504,7 +3500,6 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length,
int blkbits = inode->i_blkbits;
bool truncate = false;
- fs_put_dax(iomap->dax_dev);
if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT))
return 0;
diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c
index 77cdce1f17ce..84c54f15f1dd 100644
--- a/fs/ext4/mmp.c
+++ b/fs/ext4/mmp.c
@@ -185,7 +185,7 @@ static int kmmpd(void *data)
goto exit_thread;
}
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
ext4_warning(sb, "kmmpd being stopped since filesystem "
"has been remounted as readonly.");
goto exit_thread;
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 93aece6891f2..b104096fce9e 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -405,7 +405,7 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn)
static void ext4_handle_error(struct super_block *sb)
{
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
if (!test_opt(sb, ERRORS_CONT)) {
@@ -587,8 +587,7 @@ void __ext4_std_error(struct super_block *sb, const char *function,
/* Special case: if the error is EROFS, and we're not already
* inside a transaction, then there's really no point in logging
* an error. */
- if (errno == -EROFS && journal_current_handle() == NULL &&
- (sb->s_flags & MS_RDONLY))
+ if (errno == -EROFS && journal_current_handle() == NULL && sb_rdonly(sb))
return;
if (ext4_error_ratelimit(sb)) {
@@ -628,7 +627,7 @@ void __ext4_abort(struct super_block *sb, const char *function,
sb->s_id, function, line, &vaf);
va_end(args);
- if ((sb->s_flags & MS_RDONLY) == 0) {
+ if (sb_rdonly(sb) == 0) {
ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;
/*
@@ -889,11 +888,11 @@ static void ext4_put_super(struct super_block *sb)
ext4_mb_release(sb);
ext4_ext_release(sb);
- if (!(sb->s_flags & MS_RDONLY) && !aborted) {
+ if (!sb_rdonly(sb) && !aborted) {
ext4_clear_feature_journal_needs_recovery(sb);
es->s_state = cpu_to_le16(sbi->s_mount_state);
}
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
ext4_commit_super(sb, 1);
for (i = 0; i < sbi->s_gdb_count; i++)
@@ -951,6 +950,7 @@ static void ext4_put_super(struct super_block *sb)
if (sbi->s_chksum_driver)
crypto_free_shash(sbi->s_chksum_driver);
kfree(sbi->s_blockgroup_lock);
+ fs_put_dax(sbi->s_daxdev);
kfree(sbi);
}
@@ -2099,7 +2099,7 @@ int ext4_seq_options_show(struct seq_file *seq, void *offset)
struct super_block *sb = seq->private;
int rc;
- seq_puts(seq, (sb->s_flags & MS_RDONLY) ? "ro" : "rw");
+ seq_puts(seq, sb_rdonly(sb) ? "ro" : "rw");
rc = _ext4_show_options(seq, sb, 1);
seq_puts(seq, "\n");
return rc;
@@ -2367,7 +2367,7 @@ static int ext4_check_descriptors(struct super_block *sb,
"Checksum for group %u failed (%u!=%u)",
i, le16_to_cpu(ext4_group_desc_csum(sb, i,
gdp)), le16_to_cpu(gdp->bg_checksum));
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
ext4_unlock_group(sb, i);
return 0;
}
@@ -3135,8 +3135,7 @@ int ext4_register_li_request(struct super_block *sb,
goto out;
}
- if (first_not_zeroed == ngroups ||
- (sb->s_flags & MS_RDONLY) ||
+ if (first_not_zeroed == ngroups || sb_rdonly(sb) ||
!test_opt(sb, INIT_INODE_TABLE))
goto out;
@@ -3398,6 +3397,7 @@ static void ext4_set_resv_clusters(struct super_block *sb)
static int ext4_fill_super(struct super_block *sb, void *data, int silent)
{
+ struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev);
char *orig_data = kstrdup(data, GFP_KERNEL);
struct buffer_head *bh;
struct ext4_super_block *es = NULL;
@@ -3423,6 +3423,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
if ((data && !orig_data) || !sbi)
goto out_free_base;
+ sbi->s_daxdev = dax_dev;
sbi->s_blockgroup_lock =
kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
if (!sbi->s_blockgroup_lock)
@@ -3680,7 +3681,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
* previously didn't change the revision level when setting the flags,
* so there is a chance incompat flags are set on a rev 0 filesystem.
*/
- if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY)))
+ if (!ext4_feature_set_ok(sb, (sb_rdonly(sb))))
goto failed_mount;
blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
@@ -3809,12 +3810,12 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_hash_unsigned = 3;
else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
#ifdef __CHAR_UNSIGNED__
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
es->s_flags |=
cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
sbi->s_hash_unsigned = 3;
#else
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
es->s_flags |=
cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
#endif
@@ -4014,7 +4015,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
needs_recovery = (es->s_last_orphan != 0 ||
ext4_has_feature_journal_needs_recovery(sb));
- if (ext4_has_feature_mmp(sb) && !(sb->s_flags & MS_RDONLY))
+ if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb))
if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block)))
goto failed_mount3a;
@@ -4026,7 +4027,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
err = ext4_load_journal(sb, es, journal_devnum);
if (err)
goto failed_mount3a;
- } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) &&
+ } else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
ext4_has_feature_journal_needs_recovery(sb)) {
ext4_msg(sb, KERN_ERR, "required journal recovery "
"suppressed and not mounted read-only");
@@ -4140,7 +4141,7 @@ no_journal:
goto failed_mount_wq;
}
- if (DUMMY_ENCRYPTION_ENABLED(sbi) && !(sb->s_flags & MS_RDONLY) &&
+ if (DUMMY_ENCRYPTION_ENABLED(sbi) && !sb_rdonly(sb) &&
!ext4_has_feature_encrypt(sb)) {
ext4_set_feature_encrypt(sb);
ext4_commit_super(sb, 1);
@@ -4194,7 +4195,7 @@ no_journal:
goto failed_mount4;
}
- if (ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY))
+ if (ext4_setup_super(sb, es, sb_rdonly(sb)))
sb->s_flags |= MS_RDONLY;
/* determine the minimum size of new large inodes, if present */
@@ -4282,7 +4283,7 @@ no_journal:
#ifdef CONFIG_QUOTA
/* Enable quota usage during mount. */
- if (ext4_has_feature_quota(sb) && !(sb->s_flags & MS_RDONLY)) {
+ if (ext4_has_feature_quota(sb) && !sb_rdonly(sb)) {
err = ext4_enable_quotas(sb);
if (err)
goto failed_mount8;
@@ -4399,6 +4400,7 @@ out_fail:
out_free_base:
kfree(sbi);
kfree(orig_data);
+ fs_put_dax(dax_dev);
return err ? err : ret;
}
@@ -4605,7 +4607,7 @@ static int ext4_load_journal(struct super_block *sb,
* can get read-write access to the device.
*/
if (ext4_has_feature_journal_needs_recovery(sb)) {
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
ext4_msg(sb, KERN_INFO, "INFO: recovery "
"required on readonly filesystem");
if (really_read_only) {
@@ -4760,8 +4762,7 @@ static void ext4_mark_recovery_complete(struct super_block *sb,
if (jbd2_journal_flush(journal) < 0)
goto out;
- if (ext4_has_feature_journal_needs_recovery(sb) &&
- sb->s_flags & MS_RDONLY) {
+ if (ext4_has_feature_journal_needs_recovery(sb) && sb_rdonly(sb)) {
ext4_clear_feature_journal_needs_recovery(sb);
ext4_commit_super(sb, 1);
}
@@ -4817,7 +4818,7 @@ int ext4_force_commit(struct super_block *sb)
{
journal_t *journal;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
journal = EXT4_SB(sb)->s_journal;
@@ -4882,7 +4883,7 @@ static int ext4_freeze(struct super_block *sb)
int error = 0;
journal_t *journal;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
journal = EXT4_SB(sb)->s_journal;
@@ -4917,7 +4918,7 @@ out:
*/
static int ext4_unfreeze(struct super_block *sb)
{
- if ((sb->s_flags & MS_RDONLY) || ext4_forced_shutdown(EXT4_SB(sb)))
+ if (sb_rdonly(sb) || ext4_forced_shutdown(EXT4_SB(sb)))
return 0;
if (EXT4_SB(sb)->s_journal) {
@@ -5055,7 +5056,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
if (*flags & MS_LAZYTIME)
sb->s_flags |= MS_LAZYTIME;
- if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) {
+ if ((bool)(*flags & MS_RDONLY) != sb_rdonly(sb)) {
if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) {
err = -EROFS;
goto restore_opts;
@@ -5150,7 +5151,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
* Reinitialize lazy itable initialization thread based on
* current settings
*/
- if ((sb->s_flags & MS_RDONLY) || !test_opt(sb, INIT_INODE_TABLE))
+ if (sb_rdonly(sb) || !test_opt(sb, INIT_INODE_TABLE))
ext4_unregister_li_request(sb);
else {
ext4_group_t first_not_zeroed;
@@ -5727,7 +5728,7 @@ static inline int ext2_feature_set_ok(struct super_block *sb)
{
if (ext4_has_unknown_ext2_incompat_features(sb))
return 0;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 1;
if (ext4_has_unknown_ext2_ro_compat_features(sb))
return 0;
@@ -5758,7 +5759,7 @@ static inline int ext3_feature_set_ok(struct super_block *sb)
return 0;
if (!ext4_has_feature_journal(sb))
return 0;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 1;
if (ext4_has_unknown_ext3_ro_compat_features(sb))
return 0;
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
index b4b8438c42ef..436b3a1464d9 100644
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@ -207,15 +207,16 @@ static int __f2fs_set_acl(struct inode *inode, int type,
void *value = NULL;
size_t size = 0;
int error;
+ umode_t mode = inode->i_mode;
switch (type) {
case ACL_TYPE_ACCESS:
name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
if (acl && !ipage) {
- error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+ error = posix_acl_update_mode(inode, &mode, &acl);
if (error)
return error;
- set_acl_inode(inode, inode->i_mode);
+ set_acl_inode(inode, mode);
}
break;
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 5b876f6d3f6b..04fe1df052b2 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -230,8 +230,9 @@ void ra_meta_pages_cond(struct f2fs_sb_info *sbi, pgoff_t index)
ra_meta_pages(sbi, index, BIO_MAX_PAGES, META_POR, true);
}
-static int f2fs_write_meta_page(struct page *page,
- struct writeback_control *wbc)
+static int __f2fs_write_meta_page(struct page *page,
+ struct writeback_control *wbc,
+ enum iostat_type io_type)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
@@ -244,7 +245,7 @@ static int f2fs_write_meta_page(struct page *page,
if (unlikely(f2fs_cp_error(sbi)))
goto redirty_out;
- write_meta_page(sbi, page);
+ write_meta_page(sbi, page, io_type);
dec_page_count(sbi, F2FS_DIRTY_META);
if (wbc->for_reclaim)
@@ -263,6 +264,12 @@ redirty_out:
return AOP_WRITEPAGE_ACTIVATE;
}
+static int f2fs_write_meta_page(struct page *page,
+ struct writeback_control *wbc)
+{
+ return __f2fs_write_meta_page(page, wbc, FS_META_IO);
+}
+
static int f2fs_write_meta_pages(struct address_space *mapping,
struct writeback_control *wbc)
{
@@ -283,7 +290,7 @@ static int f2fs_write_meta_pages(struct address_space *mapping,
trace_f2fs_writepages(mapping->host, wbc, META);
diff = nr_pages_to_write(sbi, META, wbc);
- written = sync_meta_pages(sbi, META, wbc->nr_to_write);
+ written = sync_meta_pages(sbi, META, wbc->nr_to_write, FS_META_IO);
mutex_unlock(&sbi->cp_mutex);
wbc->nr_to_write = max((long)0, wbc->nr_to_write - written - diff);
return 0;
@@ -295,7 +302,7 @@ skip_write:
}
long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type,
- long nr_to_write)
+ long nr_to_write, enum iostat_type io_type)
{
struct address_space *mapping = META_MAPPING(sbi);
pgoff_t index = 0, end = ULONG_MAX, prev = ULONG_MAX;
@@ -346,7 +353,7 @@ continue_unlock:
if (!clear_page_dirty_for_io(page))
goto continue_unlock;
- if (mapping->a_ops->writepage(page, &wbc)) {
+ if (__f2fs_write_meta_page(page, &wbc, io_type)) {
unlock_page(page);
break;
}
@@ -581,11 +588,24 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
int recover_orphan_inodes(struct f2fs_sb_info *sbi)
{
block_t start_blk, orphan_blocks, i, j;
- int err;
+ unsigned int s_flags = sbi->sb->s_flags;
+ int err = 0;
if (!is_set_ckpt_flags(sbi, CP_ORPHAN_PRESENT_FLAG))
return 0;
+ if (s_flags & MS_RDONLY) {
+ f2fs_msg(sbi->sb, KERN_INFO, "orphan cleanup on readonly fs");
+ sbi->sb->s_flags &= ~MS_RDONLY;
+ }
+
+#ifdef CONFIG_QUOTA
+ /* Needed for iput() to work correctly and not trash data */
+ sbi->sb->s_flags |= MS_ACTIVE;
+ /* Turn on quotas so that they are updated correctly */
+ f2fs_enable_quota_files(sbi);
+#endif
+
start_blk = __start_cp_addr(sbi) + 1 + __cp_payload(sbi);
orphan_blocks = __start_sum_addr(sbi) - 1 - __cp_payload(sbi);
@@ -601,14 +621,21 @@ int recover_orphan_inodes(struct f2fs_sb_info *sbi)
err = recover_orphan_inode(sbi, ino);
if (err) {
f2fs_put_page(page, 1);
- return err;
+ goto out;
}
}
f2fs_put_page(page, 1);
}
/* clear Orphan Flag */
clear_ckpt_flags(sbi, CP_ORPHAN_PRESENT_FLAG);
- return 0;
+out:
+#ifdef CONFIG_QUOTA
+ /* Turn quotas off */
+ f2fs_quota_off_umount(sbi->sb);
+#endif
+ sbi->sb->s_flags = s_flags; /* Restore MS_RDONLY status */
+
+ return err;
}
static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
@@ -904,7 +931,14 @@ retry:
if (inode) {
unsigned long cur_ino = inode->i_ino;
+ if (is_dir)
+ F2FS_I(inode)->cp_task = current;
+
filemap_fdatawrite(inode->i_mapping);
+
+ if (is_dir)
+ F2FS_I(inode)->cp_task = NULL;
+
iput(inode);
/* We need to give cpu to another writers. */
if (ino == cur_ino) {
@@ -1017,7 +1051,7 @@ retry_flush_nodes:
if (get_pages(sbi, F2FS_DIRTY_NODES)) {
up_write(&sbi->node_write);
- err = sync_node_pages(sbi, &wbc);
+ err = sync_node_pages(sbi, &wbc, false, FS_CP_NODE_IO);
if (err) {
up_write(&sbi->node_change);
f2fs_unlock_all(sbi);
@@ -1115,7 +1149,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
/* Flush all the NAT/SIT pages */
while (get_pages(sbi, F2FS_DIRTY_META)) {
- sync_meta_pages(sbi, META, LONG_MAX);
+ sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
if (unlikely(f2fs_cp_error(sbi)))
return -EIO;
}
@@ -1194,7 +1228,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
/* Flush all the NAT BITS pages */
while (get_pages(sbi, F2FS_DIRTY_META)) {
- sync_meta_pages(sbi, META, LONG_MAX);
+ sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
if (unlikely(f2fs_cp_error(sbi)))
return -EIO;
}
@@ -1249,7 +1283,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
percpu_counter_set(&sbi->alloc_valid_block_count, 0);
/* Here, we only have one bio having CP pack */
- sync_meta_pages(sbi, META_FLUSH, LONG_MAX);
+ sync_meta_pages(sbi, META_FLUSH, LONG_MAX, FS_CP_META_IO);
/* wait for previous submitted meta pages writeback */
wait_on_all_pages_writeback(sbi);
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index fb96bb71da00..36b535207c88 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -457,14 +457,65 @@ out_fail:
return err;
}
+static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr,
+ unsigned nr_pages)
+{
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ struct fscrypt_ctx *ctx = NULL;
+ struct bio *bio;
+
+ if (f2fs_encrypted_file(inode)) {
+ ctx = fscrypt_get_ctx(inode, GFP_NOFS);
+ if (IS_ERR(ctx))
+ return ERR_CAST(ctx);
+
+ /* wait the page to be moved by cleaning */
+ f2fs_wait_on_block_writeback(sbi, blkaddr);
+ }
+
+ bio = bio_alloc(GFP_KERNEL, min_t(int, nr_pages, BIO_MAX_PAGES));
+ if (!bio) {
+ if (ctx)
+ fscrypt_release_ctx(ctx);
+ return ERR_PTR(-ENOMEM);
+ }
+ f2fs_target_device(sbi, blkaddr, bio);
+ bio->bi_end_io = f2fs_read_end_io;
+ bio->bi_private = ctx;
+ bio_set_op_attrs(bio, REQ_OP_READ, 0);
+
+ return bio;
+}
+
+/* This can handle encryption stuffs */
+static int f2fs_submit_page_read(struct inode *inode, struct page *page,
+ block_t blkaddr)
+{
+ struct bio *bio = f2fs_grab_read_bio(inode, blkaddr, 1);
+
+ if (IS_ERR(bio))
+ return PTR_ERR(bio);
+
+ if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
+ bio_put(bio);
+ return -EFAULT;
+ }
+ __submit_bio(F2FS_I_SB(inode), bio, DATA);
+ return 0;
+}
+
static void __set_data_blkaddr(struct dnode_of_data *dn)
{
struct f2fs_node *rn = F2FS_NODE(dn->node_page);
__le32 *addr_array;
+ int base = 0;
+
+ if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
+ base = get_extra_isize(dn->inode);
/* Get physical address of data block */
addr_array = blkaddr_in_node(rn);
- addr_array[dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
+ addr_array[base + dn->ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
}
/*
@@ -508,8 +559,8 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
f2fs_wait_on_page_writeback(dn->node_page, NODE, true);
for (; count > 0; dn->ofs_in_node++) {
- block_t blkaddr =
- datablock_addr(dn->node_page, dn->ofs_in_node);
+ block_t blkaddr = datablock_addr(dn->inode,
+ dn->node_page, dn->ofs_in_node);
if (blkaddr == NULL_ADDR) {
dn->data_blkaddr = NEW_ADDR;
__set_data_blkaddr(dn);
@@ -570,16 +621,6 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index,
struct page *page;
struct extent_info ei = {0,0,0};
int err;
- struct f2fs_io_info fio = {
- .sbi = F2FS_I_SB(inode),
- .type = DATA,
- .op = REQ_OP_READ,
- .op_flags = op_flags,
- .encrypted_page = NULL,
- };
-
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
- return read_mapping_page(mapping, index, NULL);
page = f2fs_grab_cache_page(mapping, index, for_write);
if (!page)
@@ -620,9 +661,7 @@ got_it:
return page;
}
- fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
- fio.page = page;
- err = f2fs_submit_page_bio(&fio);
+ err = f2fs_submit_page_read(inode, page, dn.data_blkaddr);
if (err)
goto put_err;
return page;
@@ -756,7 +795,8 @@ static int __allocate_data_block(struct dnode_of_data *dn)
if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
return -EPERM;
- dn->data_blkaddr = datablock_addr(dn->node_page, dn->ofs_in_node);
+ dn->data_blkaddr = datablock_addr(dn->inode,
+ dn->node_page, dn->ofs_in_node);
if (dn->data_blkaddr == NEW_ADDR)
goto alloc;
@@ -782,7 +822,7 @@ alloc:
static inline bool __force_buffered_io(struct inode *inode, int rw)
{
- return ((f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode)) ||
+ return (f2fs_encrypted_file(inode) ||
(rw == WRITE && test_opt(F2FS_I_SB(inode), LFS)) ||
F2FS_I_SB(inode)->s_ndevs);
}
@@ -814,7 +854,7 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
F2FS_GET_BLOCK_PRE_AIO :
F2FS_GET_BLOCK_PRE_DIO);
}
- if (iocb->ki_pos + iov_iter_count(from) > MAX_INLINE_DATA) {
+ if (iocb->ki_pos + iov_iter_count(from) > MAX_INLINE_DATA(inode)) {
err = f2fs_convert_inline_inode(inode);
if (err)
return err;
@@ -903,7 +943,7 @@ next_dnode:
end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
next_block:
- blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node);
+ blkaddr = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);
if (blkaddr == NEW_ADDR || blkaddr == NULL_ADDR) {
if (create) {
@@ -1040,7 +1080,7 @@ static int get_data_block_dio(struct inode *inode, sector_t iblock,
struct buffer_head *bh_result, int create)
{
return __get_data_block(inode, iblock, bh_result, create,
- F2FS_GET_BLOCK_DIO, NULL);
+ F2FS_GET_BLOCK_DEFAULT, NULL);
}
static int get_data_block_bmap(struct inode *inode, sector_t iblock,
@@ -1146,35 +1186,6 @@ out:
return ret;
}
-static struct bio *f2fs_grab_bio(struct inode *inode, block_t blkaddr,
- unsigned nr_pages)
-{
- struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
- struct fscrypt_ctx *ctx = NULL;
- struct bio *bio;
-
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode)) {
- ctx = fscrypt_get_ctx(inode, GFP_NOFS);
- if (IS_ERR(ctx))
- return ERR_CAST(ctx);
-
- /* wait the page to be moved by cleaning */
- f2fs_wait_on_encrypted_page_writeback(sbi, blkaddr);
- }
-
- bio = bio_alloc(GFP_KERNEL, min_t(int, nr_pages, BIO_MAX_PAGES));
- if (!bio) {
- if (ctx)
- fscrypt_release_ctx(ctx);
- return ERR_PTR(-ENOMEM);
- }
- f2fs_target_device(sbi, blkaddr, bio);
- bio->bi_end_io = f2fs_read_end_io;
- bio->bi_private = ctx;
-
- return bio;
-}
-
/*
* This function was originally taken from fs/mpage.c, and customized for f2fs.
* Major change was from block_size == page_size in f2fs by default.
@@ -1240,7 +1251,7 @@ static int f2fs_mpage_readpages(struct address_space *mapping,
map.m_len = last_block - block_in_file;
if (f2fs_map_blocks(inode, &map, 0,
- F2FS_GET_BLOCK_READ))
+ F2FS_GET_BLOCK_DEFAULT))
goto set_error_page;
}
got_it:
@@ -1271,12 +1282,11 @@ submit_and_realloc:
bio = NULL;
}
if (bio == NULL) {
- bio = f2fs_grab_bio(inode, block_nr, nr_pages);
+ bio = f2fs_grab_read_bio(inode, block_nr, nr_pages);
if (IS_ERR(bio)) {
bio = NULL;
goto set_error_page;
}
- bio_set_op_attrs(bio, REQ_OP_READ, 0);
}
if (bio_add_page(bio, page, blocksize, 0) < blocksize)
@@ -1341,11 +1351,11 @@ static int encrypt_one_page(struct f2fs_io_info *fio)
struct inode *inode = fio->page->mapping->host;
gfp_t gfp_flags = GFP_NOFS;
- if (!f2fs_encrypted_inode(inode) || !S_ISREG(inode->i_mode))
+ if (!f2fs_encrypted_file(inode))
return 0;
/* wait for GCed encrypted page writeback */
- f2fs_wait_on_encrypted_page_writeback(fio->sbi, fio->old_blkaddr);
+ f2fs_wait_on_block_writeback(fio->sbi, fio->old_blkaddr);
retry_encrypt:
fio->encrypted_page = fscrypt_encrypt_page(inode, fio->page,
@@ -1471,7 +1481,8 @@ out:
}
static int __write_data_page(struct page *page, bool *submitted,
- struct writeback_control *wbc)
+ struct writeback_control *wbc,
+ enum iostat_type io_type)
{
struct inode *inode = page->mapping->host;
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
@@ -1492,6 +1503,7 @@ static int __write_data_page(struct page *page, bool *submitted,
.encrypted_page = NULL,
.submitted = false,
.need_lock = LOCK_RETRY,
+ .io_type = io_type,
};
trace_f2fs_writepage(page, DATA);
@@ -1598,7 +1610,7 @@ redirty_out:
static int f2fs_write_data_page(struct page *page,
struct writeback_control *wbc)
{
- return __write_data_page(page, NULL, wbc);
+ return __write_data_page(page, NULL, wbc, FS_DATA_IO);
}
/*
@@ -1607,7 +1619,8 @@ static int f2fs_write_data_page(struct page *page,
* warm/hot data page.
*/
static int f2fs_write_cache_pages(struct address_space *mapping,
- struct writeback_control *wbc)
+ struct writeback_control *wbc,
+ enum iostat_type io_type)
{
int ret = 0;
int done = 0;
@@ -1697,7 +1710,7 @@ continue_unlock:
if (!clear_page_dirty_for_io(page))
goto continue_unlock;
- ret = __write_data_page(page, &submitted, wbc);
+ ret = __write_data_page(page, &submitted, wbc, io_type);
if (unlikely(ret)) {
/*
* keep nr_to_write, since vfs uses this to
@@ -1752,8 +1765,9 @@ continue_unlock:
return ret;
}
-static int f2fs_write_data_pages(struct address_space *mapping,
- struct writeback_control *wbc)
+int __f2fs_write_data_pages(struct address_space *mapping,
+ struct writeback_control *wbc,
+ enum iostat_type io_type)
{
struct inode *inode = mapping->host;
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
@@ -1790,7 +1804,7 @@ static int f2fs_write_data_pages(struct address_space *mapping,
goto skip_write;
blk_start_plug(&plug);
- ret = f2fs_write_cache_pages(mapping, wbc);
+ ret = f2fs_write_cache_pages(mapping, wbc, io_type);
blk_finish_plug(&plug);
if (wbc->sync_mode == WB_SYNC_ALL)
@@ -1809,6 +1823,16 @@ skip_write:
return 0;
}
+static int f2fs_write_data_pages(struct address_space *mapping,
+ struct writeback_control *wbc)
+{
+ struct inode *inode = mapping->host;
+
+ return __f2fs_write_data_pages(mapping, wbc,
+ F2FS_I(inode)->cp_task == current ?
+ FS_CP_DATA_IO : FS_DATA_IO);
+}
+
static void f2fs_write_failed(struct address_space *mapping, loff_t to)
{
struct inode *inode = mapping->host;
@@ -1858,7 +1882,7 @@ restart:
set_new_dnode(&dn, inode, ipage, ipage, 0);
if (f2fs_has_inline_data(inode)) {
- if (pos + len <= MAX_INLINE_DATA) {
+ if (pos + len <= MAX_INLINE_DATA(inode)) {
read_inline_data(page, ipage);
set_inode_flag(inode, FI_DATA_EXIST);
if (inode->i_nlink)
@@ -1956,8 +1980,8 @@ repeat:
f2fs_wait_on_page_writeback(page, DATA, false);
/* wait for GCed encrypted page writeback */
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
- f2fs_wait_on_encrypted_page_writeback(sbi, blkaddr);
+ if (f2fs_encrypted_file(inode))
+ f2fs_wait_on_block_writeback(sbi, blkaddr);
if (len == PAGE_SIZE || PageUptodate(page))
return 0;
@@ -1971,21 +1995,9 @@ repeat:
zero_user_segment(page, 0, PAGE_SIZE);
SetPageUptodate(page);
} else {
- struct bio *bio;
-
- bio = f2fs_grab_bio(inode, blkaddr, 1);
- if (IS_ERR(bio)) {
- err = PTR_ERR(bio);
- goto fail;
- }
- bio->bi_opf = REQ_OP_READ;
- if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
- bio_put(bio);
- err = -EFAULT;
+ err = f2fs_submit_page_read(inode, page, blkaddr);
+ if (err)
goto fail;
- }
-
- __submit_bio(sbi, bio, DATA);
lock_page(page);
if (unlikely(page->mapping != mapping)) {
@@ -2075,10 +2087,13 @@ static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
up_read(&F2FS_I(inode)->dio_rwsem[rw]);
if (rw == WRITE) {
- if (err > 0)
+ if (err > 0) {
+ f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
+ err);
set_inode_flag(inode, FI_UPDATE_WRITE);
- else if (err < 0)
+ } else if (err < 0) {
f2fs_write_failed(mapping, offset + count);
+ }
}
trace_f2fs_direct_IO_exit(inode, offset, count, rw, err);
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 37f9c7f55605..c0c933ad43c8 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -705,6 +705,8 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
struct f2fs_dentry_block *dentry_blk;
unsigned int bit_pos;
int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
+ struct address_space *mapping = page_mapping(page);
+ unsigned long flags;
int i;
f2fs_update_time(F2FS_I_SB(dir), REQ_TIME);
@@ -735,6 +737,11 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
if (bit_pos == NR_DENTRY_IN_BLOCK &&
!truncate_hole(dir, page->index, page->index + 1)) {
+ spin_lock_irqsave(&mapping->tree_lock, flags);
+ radix_tree_tag_clear(&mapping->page_tree, page_index(page),
+ PAGECACHE_TAG_DIRTY);
+ spin_unlock_irqrestore(&mapping->tree_lock, flags);
+
clear_page_dirty_for_io(page);
ClearPagePrivate(page);
ClearPageUptodate(page);
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 94a88b233e98..9a7c90386947 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -91,6 +91,8 @@ extern char *fault_name[FAULT_MAX];
#define F2FS_MOUNT_LFS 0x00040000
#define F2FS_MOUNT_USRQUOTA 0x00080000
#define F2FS_MOUNT_GRPQUOTA 0x00100000
+#define F2FS_MOUNT_PRJQUOTA 0x00200000
+#define F2FS_MOUNT_QUOTA 0x00400000
#define clear_opt(sbi, option) ((sbi)->mount_opt.opt &= ~F2FS_MOUNT_##option)
#define set_opt(sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option)
@@ -110,8 +112,12 @@ struct f2fs_mount_info {
unsigned int opt;
};
-#define F2FS_FEATURE_ENCRYPT 0x0001
-#define F2FS_FEATURE_BLKZONED 0x0002
+#define F2FS_FEATURE_ENCRYPT 0x0001
+#define F2FS_FEATURE_BLKZONED 0x0002
+#define F2FS_FEATURE_ATOMIC_WRITE 0x0004
+#define F2FS_FEATURE_EXTRA_ATTR 0x0008
+#define F2FS_FEATURE_PRJQUOTA 0x0010
+#define F2FS_FEATURE_INODE_CHKSUM 0x0020
#define F2FS_HAS_FEATURE(sb, mask) \
((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -142,6 +148,8 @@ enum {
(BATCHED_TRIM_SEGMENTS(sbi) << (sbi)->log_blocks_per_seg)
#define MAX_DISCARD_BLOCKS(sbi) BLKS_PER_SEC(sbi)
#define DISCARD_ISSUE_RATE 8
+#define DEF_MIN_DISCARD_ISSUE_TIME 50 /* 50 ms, if exists */
+#define DEF_MAX_DISCARD_ISSUE_TIME 60000 /* 60 s, if no candidates */
#define DEF_CP_INTERVAL 60 /* 60 secs */
#define DEF_IDLE_INTERVAL 5 /* 5 secs */
@@ -190,11 +198,18 @@ struct discard_entry {
unsigned char discard_map[SIT_VBLOCK_MAP_SIZE]; /* segment discard bitmap */
};
+/* default discard granularity of inner discard thread, unit: block count */
+#define DEFAULT_DISCARD_GRANULARITY 16
+
/* max discard pend list number */
#define MAX_PLIST_NUM 512
#define plist_idx(blk_num) ((blk_num) >= MAX_PLIST_NUM ? \
(MAX_PLIST_NUM - 1) : (blk_num - 1))
+#define P_ACTIVE 0x01
+#define P_TRIM 0x02
+#define plist_issue(tag) (((tag) & P_ACTIVE) || ((tag) & P_TRIM))
+
enum {
D_PREP,
D_SUBMIT,
@@ -230,11 +245,14 @@ struct discard_cmd_control {
struct task_struct *f2fs_issue_discard; /* discard thread */
struct list_head entry_list; /* 4KB discard entry list */
struct list_head pend_list[MAX_PLIST_NUM];/* store pending entries */
+ unsigned char pend_list_tag[MAX_PLIST_NUM];/* tag for pending entries */
struct list_head wait_list; /* store on-flushing entries */
wait_queue_head_t discard_wait_queue; /* waiting queue for wake-up */
+ unsigned int discard_wake; /* to wake up discard thread */
struct mutex cmd_lock;
unsigned int nr_discards; /* # of discards in the list */
unsigned int max_discards; /* max. discards to be issued */
+ unsigned int discard_granularity; /* discard granularity */
unsigned int undiscard_blks; /* # of undiscard blocks */
atomic_t issued_discard; /* # of issued discard */
atomic_t issing_discard; /* # of issing discard */
@@ -308,6 +326,7 @@ static inline bool __has_cursum_space(struct f2fs_journal *journal,
struct f2fs_flush_device)
#define F2FS_IOC_GARBAGE_COLLECT_RANGE _IOW(F2FS_IOCTL_MAGIC, 11, \
struct f2fs_gc_range)
+#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, __u32)
#define F2FS_IOC_SET_ENCRYPTION_POLICY FS_IOC_SET_ENCRYPTION_POLICY
#define F2FS_IOC_GET_ENCRYPTION_POLICY FS_IOC_GET_ENCRYPTION_POLICY
@@ -332,6 +351,9 @@ static inline bool __has_cursum_space(struct f2fs_journal *journal,
#define F2FS_IOC32_GETVERSION FS_IOC32_GETVERSION
#endif
+#define F2FS_IOC_FSGETXATTR FS_IOC_FSGETXATTR
+#define F2FS_IOC_FSSETXATTR FS_IOC_FSSETXATTR
+
struct f2fs_gc_range {
u32 sync;
u64 start;
@@ -355,16 +377,36 @@ struct f2fs_flush_device {
u32 segments; /* # of segments to flush */
};
+/* for inline stuff */
+#define DEF_INLINE_RESERVED_SIZE 1
+static inline int get_extra_isize(struct inode *inode);
+#define MAX_INLINE_DATA(inode) (sizeof(__le32) * \
+ (CUR_ADDRS_PER_INODE(inode) - \
+ DEF_INLINE_RESERVED_SIZE - \
+ F2FS_INLINE_XATTR_ADDRS))
+
+/* for inline dir */
+#define NR_INLINE_DENTRY(inode) (MAX_INLINE_DATA(inode) * BITS_PER_BYTE / \
+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
+ BITS_PER_BYTE + 1))
+#define INLINE_DENTRY_BITMAP_SIZE(inode) ((NR_INLINE_DENTRY(inode) + \
+ BITS_PER_BYTE - 1) / BITS_PER_BYTE)
+#define INLINE_RESERVED_SIZE(inode) (MAX_INLINE_DATA(inode) - \
+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
+ NR_INLINE_DENTRY(inode) + \
+ INLINE_DENTRY_BITMAP_SIZE(inode)))
+
/*
* For INODE and NODE manager
*/
/* for directory operations */
struct f2fs_dentry_ptr {
struct inode *inode;
- const void *bitmap;
+ void *bitmap;
struct f2fs_dir_entry *dentry;
__u8 (*filename)[F2FS_SLOT_LEN];
int max;
+ int nr_bitmap;
};
static inline void make_dentry_ptr_block(struct inode *inode,
@@ -372,19 +414,26 @@ static inline void make_dentry_ptr_block(struct inode *inode,
{
d->inode = inode;
d->max = NR_DENTRY_IN_BLOCK;
+ d->nr_bitmap = SIZE_OF_DENTRY_BITMAP;
d->bitmap = &t->dentry_bitmap;
d->dentry = t->dentry;
d->filename = t->filename;
}
static inline void make_dentry_ptr_inline(struct inode *inode,
- struct f2fs_dentry_ptr *d, struct f2fs_inline_dentry *t)
+ struct f2fs_dentry_ptr *d, void *t)
{
+ int entry_cnt = NR_INLINE_DENTRY(inode);
+ int bitmap_size = INLINE_DENTRY_BITMAP_SIZE(inode);
+ int reserved_size = INLINE_RESERVED_SIZE(inode);
+
d->inode = inode;
- d->max = NR_INLINE_DENTRY;
- d->bitmap = &t->dentry_bitmap;
- d->dentry = t->dentry;
- d->filename = t->filename;
+ d->max = entry_cnt;
+ d->nr_bitmap = bitmap_size;
+ d->bitmap = t;
+ d->dentry = t + bitmap_size + reserved_size;
+ d->filename = t + bitmap_size + reserved_size +
+ SIZE_OF_DIR_ENTRY * entry_cnt;
}
/*
@@ -473,12 +522,13 @@ struct f2fs_map_blocks {
};
/* for flag in get_data_block */
-#define F2FS_GET_BLOCK_READ 0
-#define F2FS_GET_BLOCK_DIO 1
-#define F2FS_GET_BLOCK_FIEMAP 2
-#define F2FS_GET_BLOCK_BMAP 3
-#define F2FS_GET_BLOCK_PRE_DIO 4
-#define F2FS_GET_BLOCK_PRE_AIO 5
+enum {
+ F2FS_GET_BLOCK_DEFAULT,
+ F2FS_GET_BLOCK_FIEMAP,
+ F2FS_GET_BLOCK_BMAP,
+ F2FS_GET_BLOCK_PRE_DIO,
+ F2FS_GET_BLOCK_PRE_AIO,
+};
/*
* i_advise uses FADVISE_XXX_BIT. We can add additional hints later.
@@ -521,6 +571,7 @@ struct f2fs_inode_info {
f2fs_hash_t chash; /* hash value of given file name */
unsigned int clevel; /* maximum level of given file name */
struct task_struct *task; /* lookup and create consistency */
+ struct task_struct *cp_task; /* separate cp/wb IO stats*/
nid_t i_xattr_nid; /* node id that contains xattrs */
loff_t last_disk_size; /* lastly written file size */
@@ -533,10 +584,15 @@ struct f2fs_inode_info {
struct list_head dirty_list; /* dirty list for dirs and files */
struct list_head gdirty_list; /* linked in global dirty list */
struct list_head inmem_pages; /* inmemory pages managed by f2fs */
+ struct task_struct *inmem_task; /* store inmemory task */
struct mutex inmem_lock; /* lock for inmemory pages */
struct extent_tree *extent_tree; /* cached extent_tree entry */
struct rw_semaphore dio_rwsem[2];/* avoid racing between dio and gc */
struct rw_semaphore i_mmap_sem;
+ struct rw_semaphore i_xattr_sem; /* avoid racing between reading and changing EAs */
+
+ int i_extra_isize; /* size of extra space located in i_addr */
+ kprojid_t i_projid; /* id for project quota */
};
static inline void get_extent_info(struct extent_info *ext,
@@ -823,6 +879,23 @@ enum need_lock_type {
LOCK_RETRY,
};
+enum iostat_type {
+ APP_DIRECT_IO, /* app direct IOs */
+ APP_BUFFERED_IO, /* app buffered IOs */
+ APP_WRITE_IO, /* app write IOs */
+ APP_MAPPED_IO, /* app mapped IOs */
+ FS_DATA_IO, /* data IOs from kworker/fsync/reclaimer */
+ FS_NODE_IO, /* node IOs from kworker/fsync/reclaimer */
+ FS_META_IO, /* meta IOs from kworker/reclaimer */
+ FS_GC_DATA_IO, /* data IOs from forground gc */
+ FS_GC_NODE_IO, /* node IOs from forground gc */
+ FS_CP_DATA_IO, /* data IOs from checkpoint */
+ FS_CP_NODE_IO, /* node IOs from checkpoint */
+ FS_CP_META_IO, /* meta IOs from checkpoint */
+ FS_DISCARD, /* discard */
+ NR_IO_TYPE,
+};
+
struct f2fs_io_info {
struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */
enum page_type type; /* contains DATA/NODE/META/META_FLUSH */
@@ -837,6 +910,7 @@ struct f2fs_io_info {
bool submitted; /* indicate IO submission */
int need_lock; /* indicate we need to lock cp_rwsem */
bool in_list; /* indicate fio is in io_list */
+ enum iostat_type io_type; /* io type */
};
#define is_read_io(rw) ((rw) == READ)
@@ -1028,6 +1102,11 @@ struct f2fs_sb_info {
#endif
spinlock_t stat_lock; /* lock for stat operations */
+ /* For app/fs IO statistics */
+ spinlock_t iostat_lock;
+ unsigned long long write_iostat[NR_IO_TYPE];
+ bool iostat_enable;
+
/* For sysfs suppport */
struct kobject s_kobj;
struct completion s_kobj_unregister;
@@ -1046,10 +1125,19 @@ struct f2fs_sb_info {
/* Reference to checksum algorithm driver via cryptoapi */
struct crypto_shash *s_chksum_driver;
+ /* Precomputed FS UUID checksum for seeding other checksums */
+ __u32 s_chksum_seed;
+
/* For fault injection */
#ifdef CONFIG_F2FS_FAULT_INJECTION
struct f2fs_fault_info fault_info;
#endif
+
+#ifdef CONFIG_QUOTA
+ /* Names of quota files with journalled quota */
+ char *s_qf_names[MAXQUOTAS];
+ int s_jquota_fmt; /* Format of quota to use */
+#endif
};
#ifdef CONFIG_F2FS_FAULT_INJECTION
@@ -1137,6 +1225,27 @@ static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc,
return f2fs_crc32(sbi, buf, buf_size) == blk_crc;
}
+static inline u32 f2fs_chksum(struct f2fs_sb_info *sbi, u32 crc,
+ const void *address, unsigned int length)
+{
+ struct {
+ struct shash_desc shash;
+ char ctx[4];
+ } desc;
+ int err;
+
+ BUG_ON(crypto_shash_descsize(sbi->s_chksum_driver) != sizeof(desc.ctx));
+
+ desc.shash.tfm = sbi->s_chksum_driver;
+ desc.shash.flags = 0;
+ *(u32 *)desc.ctx = crc;
+
+ err = crypto_shash_update(&desc.shash, address, length);
+ BUG_ON(err);
+
+ return *(u32 *)desc.ctx;
+}
+
static inline struct f2fs_inode_info *F2FS_I(struct inode *inode)
{
return container_of(inode, struct f2fs_inode_info, vfs_inode);
@@ -1760,20 +1869,38 @@ static inline bool IS_INODE(struct page *page)
return RAW_IS_INODE(p);
}
+static inline int offset_in_addr(struct f2fs_inode *i)
+{
+ return (i->i_inline & F2FS_EXTRA_ATTR) ?
+ (le16_to_cpu(i->i_extra_isize) / sizeof(__le32)) : 0;
+}
+
static inline __le32 *blkaddr_in_node(struct f2fs_node *node)
{
return RAW_IS_INODE(node) ? node->i.i_addr : node->dn.addr;
}
-static inline block_t datablock_addr(struct page *node_page,
- unsigned int offset)
+static inline int f2fs_has_extra_attr(struct inode *inode);
+static inline block_t datablock_addr(struct inode *inode,
+ struct page *node_page, unsigned int offset)
{
struct f2fs_node *raw_node;
__le32 *addr_array;
+ int base = 0;
+ bool is_inode = IS_INODE(node_page);
raw_node = F2FS_NODE(node_page);
+
+ /* from GC path only */
+ if (!inode) {
+ if (is_inode)
+ base = offset_in_addr(&raw_node->i);
+ } else if (f2fs_has_extra_attr(inode) && is_inode) {
+ base = get_extra_isize(inode);
+ }
+
addr_array = blkaddr_in_node(raw_node);
- return le32_to_cpu(addr_array[offset]);
+ return le32_to_cpu(addr_array[base + offset]);
}
static inline int f2fs_test_bit(unsigned int nr, char *addr)
@@ -1836,6 +1963,20 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr)
*addr ^= mask;
}
+#define F2FS_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
+#define F2FS_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL)
+#define F2FS_FL_INHERITED (FS_PROJINHERIT_FL)
+
+static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags)
+{
+ if (S_ISDIR(mode))
+ return flags;
+ else if (S_ISREG(mode))
+ return flags & F2FS_REG_FLMASK;
+ else
+ return flags & F2FS_OTHER_FLMASK;
+}
+
/* used for f2fs_inode_info->flags */
enum {
FI_NEW_INODE, /* indicate newly allocated inode */
@@ -1864,6 +2005,8 @@ enum {
FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */
FI_NO_PREALLOC, /* indicate skipped preallocated blocks */
FI_HOT_DATA, /* indicate file is hot */
+ FI_EXTRA_ATTR, /* indicate file has extra attribute */
+ FI_PROJ_INHERIT, /* indicate file inherits projectid */
};
static inline void __mark_inode_dirty_flag(struct inode *inode,
@@ -1983,6 +2126,8 @@ static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)
set_bit(FI_DATA_EXIST, &fi->flags);
if (ri->i_inline & F2FS_INLINE_DOTS)
set_bit(FI_INLINE_DOTS, &fi->flags);
+ if (ri->i_inline & F2FS_EXTRA_ATTR)
+ set_bit(FI_EXTRA_ATTR, &fi->flags);
}
static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri)
@@ -1999,6 +2144,13 @@ static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri)
ri->i_inline |= F2FS_DATA_EXIST;
if (is_inode_flag_set(inode, FI_INLINE_DOTS))
ri->i_inline |= F2FS_INLINE_DOTS;
+ if (is_inode_flag_set(inode, FI_EXTRA_ATTR))
+ ri->i_inline |= F2FS_EXTRA_ATTR;
+}
+
+static inline int f2fs_has_extra_attr(struct inode *inode)
+{
+ return is_inode_flag_set(inode, FI_EXTRA_ATTR);
}
static inline int f2fs_has_inline_xattr(struct inode *inode)
@@ -2009,8 +2161,8 @@ static inline int f2fs_has_inline_xattr(struct inode *inode)
static inline unsigned int addrs_per_inode(struct inode *inode)
{
if (f2fs_has_inline_xattr(inode))
- return DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS;
- return DEF_ADDRS_PER_INODE;
+ return CUR_ADDRS_PER_INODE(inode) - F2FS_INLINE_XATTR_ADDRS;
+ return CUR_ADDRS_PER_INODE(inode);
}
static inline void *inline_xattr_addr(struct page *page)
@@ -2069,11 +2221,12 @@ static inline bool f2fs_is_drop_cache(struct inode *inode)
return is_inode_flag_set(inode, FI_DROP_CACHE);
}
-static inline void *inline_data_addr(struct page *page)
+static inline void *inline_data_addr(struct inode *inode, struct page *page)
{
struct f2fs_inode *ri = F2FS_INODE(page);
+ int extra_size = get_extra_isize(inode);
- return (void *)&(ri->i_addr[1]);
+ return (void *)&(ri->i_addr[extra_size + DEF_INLINE_RESERVED_SIZE]);
}
static inline int f2fs_has_inline_dentry(struct inode *inode)
@@ -2164,10 +2317,50 @@ static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
return kmalloc(size, flags);
}
+static inline int get_extra_isize(struct inode *inode)
+{
+ return F2FS_I(inode)->i_extra_isize / sizeof(__le32);
+}
+
#define get_inode_mode(i) \
((is_inode_flag_set(i, FI_ACL_MODE)) ? \
(F2FS_I(i)->i_acl_mode) : ((i)->i_mode))
+#define F2FS_TOTAL_EXTRA_ATTR_SIZE \
+ (offsetof(struct f2fs_inode, i_extra_end) - \
+ offsetof(struct f2fs_inode, i_extra_isize)) \
+
+#define F2FS_OLD_ATTRIBUTE_SIZE (offsetof(struct f2fs_inode, i_addr))
+#define F2FS_FITS_IN_INODE(f2fs_inode, extra_isize, field) \
+ ((offsetof(typeof(*f2fs_inode), field) + \
+ sizeof((f2fs_inode)->field)) \
+ <= (F2FS_OLD_ATTRIBUTE_SIZE + extra_isize)) \
+
+static inline void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
+{
+ int i;
+
+ spin_lock(&sbi->iostat_lock);
+ for (i = 0; i < NR_IO_TYPE; i++)
+ sbi->write_iostat[i] = 0;
+ spin_unlock(&sbi->iostat_lock);
+}
+
+static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi,
+ enum iostat_type type, unsigned long long io_bytes)
+{
+ if (!sbi->iostat_enable)
+ return;
+ spin_lock(&sbi->iostat_lock);
+ sbi->write_iostat[type] += io_bytes;
+
+ if (type == APP_WRITE_IO || type == APP_DIRECT_IO)
+ sbi->write_iostat[APP_BUFFERED_IO] =
+ sbi->write_iostat[APP_WRITE_IO] -
+ sbi->write_iostat[APP_DIRECT_IO];
+ spin_unlock(&sbi->iostat_lock);
+}
+
/*
* file.c
*/
@@ -2187,6 +2380,8 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
* inode.c
*/
void f2fs_set_inode_flags(struct inode *inode);
+bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page);
+void f2fs_inode_chksum_set(struct f2fs_sb_info *sbi, struct page *page);
struct inode *f2fs_iget(struct super_block *sb, unsigned long ino);
struct inode *f2fs_iget_retry(struct super_block *sb, unsigned long ino);
int try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink);
@@ -2255,6 +2450,8 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
*/
int f2fs_inode_dirtied(struct inode *inode, bool sync);
void f2fs_inode_synced(struct inode *inode);
+void f2fs_enable_quota_files(struct f2fs_sb_info *sbi);
+void f2fs_quota_off_umount(struct super_block *sb);
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover);
int f2fs_sync_fs(struct super_block *sb, int sync);
extern __printf(3, 4)
@@ -2285,15 +2482,15 @@ int truncate_xattr_node(struct inode *inode, struct page *page);
int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino);
int remove_inode_page(struct inode *inode);
struct page *new_inode_page(struct inode *inode);
-struct page *new_node_page(struct dnode_of_data *dn,
- unsigned int ofs, struct page *ipage);
+struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs);
void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid);
struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid);
struct page *get_node_page_ra(struct page *parent, int start);
void move_node_page(struct page *node_page, int gc_type);
int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
struct writeback_control *wbc, bool atomic);
-int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc);
+int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc,
+ bool do_balance, enum iostat_type io_type);
void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount);
bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid);
void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid);
@@ -2314,6 +2511,7 @@ void destroy_node_manager_caches(void);
/*
* segment.c
*/
+bool need_SSR(struct f2fs_sb_info *sbi);
void register_inmem_page(struct inode *inode, struct page *page);
void drop_inmem_pages(struct inode *inode);
void drop_inmem_page(struct inode *inode, struct page *page);
@@ -2336,7 +2534,8 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range);
bool exist_trim_candidates(struct f2fs_sb_info *sbi, struct cp_control *cpc);
struct page *get_sum_page(struct f2fs_sb_info *sbi, unsigned int segno);
void update_meta_page(struct f2fs_sb_info *sbi, void *src, block_t blk_addr);
-void write_meta_page(struct f2fs_sb_info *sbi, struct page *page);
+void write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
+ enum iostat_type io_type);
void write_node_page(unsigned int nid, struct f2fs_io_info *fio);
void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio);
int rewrite_data_page(struct f2fs_io_info *fio);
@@ -2353,8 +2552,7 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
struct f2fs_io_info *fio, bool add_list);
void f2fs_wait_on_page_writeback(struct page *page,
enum page_type type, bool ordered);
-void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *sbi,
- block_t blkaddr);
+void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr);
void write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
void write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
int lookup_journal_in_cursum(struct f2fs_journal *journal, int type,
@@ -2377,7 +2575,7 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages,
int type, bool sync);
void ra_meta_pages_cond(struct f2fs_sb_info *sbi, pgoff_t index);
long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type,
- long nr_to_write);
+ long nr_to_write, enum iostat_type io_type);
void add_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type);
void remove_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type);
void release_ino_entry(struct f2fs_sb_info *sbi, bool all);
@@ -2430,6 +2628,9 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
u64 start, u64 len);
void f2fs_set_page_dirty_nobuffers(struct page *page);
+int __f2fs_write_data_pages(struct address_space *mapping,
+ struct writeback_control *wbc,
+ enum iostat_type io_type);
void f2fs_invalidate_page(struct page *page, unsigned int offset,
unsigned int length);
int f2fs_release_page(struct page *page, gfp_t wait);
@@ -2726,10 +2927,10 @@ void destroy_extent_cache(void);
/*
* sysfs.c
*/
-int __init f2fs_register_sysfs(void);
-void f2fs_unregister_sysfs(void);
-int f2fs_init_sysfs(struct f2fs_sb_info *sbi);
-void f2fs_exit_sysfs(struct f2fs_sb_info *sbi);
+int __init f2fs_init_sysfs(void);
+void f2fs_exit_sysfs(void);
+int f2fs_register_sysfs(struct f2fs_sb_info *sbi);
+void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi);
/*
* crypto support
@@ -2739,6 +2940,11 @@ static inline bool f2fs_encrypted_inode(struct inode *inode)
return file_is_encrypt(inode);
}
+static inline bool f2fs_encrypted_file(struct inode *inode)
+{
+ return f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode);
+}
+
static inline void f2fs_set_encrypted_inode(struct inode *inode)
{
#ifdef CONFIG_F2FS_FS_ENCRYPTION
@@ -2761,6 +2967,21 @@ static inline int f2fs_sb_mounted_blkzoned(struct super_block *sb)
return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_BLKZONED);
}
+static inline int f2fs_sb_has_extra_attr(struct super_block *sb)
+{
+ return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_EXTRA_ATTR);
+}
+
+static inline int f2fs_sb_has_project_quota(struct super_block *sb)
+{
+ return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_PRJQUOTA);
+}
+
+static inline int f2fs_sb_has_inode_chksum(struct super_block *sb)
+{
+ return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_INODE_CHKSUM);
+}
+
#ifdef CONFIG_BLK_DEV_ZONED
static inline int get_blkz_type(struct f2fs_sb_info *sbi,
struct block_device *bdev, block_t blkaddr)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 843a0d99f7ea..517e112c8a9a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -98,14 +98,16 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf)
if (!PageUptodate(page))
SetPageUptodate(page);
+ f2fs_update_iostat(sbi, APP_MAPPED_IO, F2FS_BLKSIZE);
+
trace_f2fs_vm_page_mkwrite(page, DATA);
mapped:
/* fill the page */
f2fs_wait_on_page_writeback(page, DATA, false);
/* wait for GCed encrypted page writeback */
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
- f2fs_wait_on_encrypted_page_writeback(sbi, dn.data_blkaddr);
+ if (f2fs_encrypted_file(inode))
+ f2fs_wait_on_block_writeback(sbi, dn.data_blkaddr);
out_sem:
up_read(&F2FS_I(inode)->i_mmap_sem);
@@ -274,9 +276,19 @@ sync_nodes:
goto sync_nodes;
}
- ret = wait_on_node_pages_writeback(sbi, ino);
- if (ret)
- goto out;
+ /*
+ * If it's atomic_write, it's just fine to keep write ordering. So
+ * here we don't need to wait for node write completion, since we use
+ * node chain which serializes node blocks. If one of node writes are
+ * reordered, we can see simply broken chain, resulting in stopping
+ * roll-forward recovery. It means we'll recover all or none node blocks
+ * given fsync mark.
+ */
+ if (!atomic) {
+ ret = wait_on_node_pages_writeback(sbi, ino);
+ if (ret)
+ goto out;
+ }
/* once recovery info is written, don't need to tack this */
remove_ino_entry(sbi, ino, APPEND_INO);
@@ -382,7 +394,8 @@ static loff_t f2fs_seek_block(struct file *file, loff_t offset, int whence)
dn.ofs_in_node++, pgofs++,
data_ofs = (loff_t)pgofs << PAGE_SHIFT) {
block_t blkaddr;
- blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node);
+ blkaddr = datablock_addr(dn.inode,
+ dn.node_page, dn.ofs_in_node);
if (__found_offset(blkaddr, dirty, pgofs, whence)) {
f2fs_put_dnode(&dn);
@@ -467,9 +480,13 @@ int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
struct f2fs_node *raw_node;
int nr_free = 0, ofs = dn->ofs_in_node, len = count;
__le32 *addr;
+ int base = 0;
+
+ if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
+ base = get_extra_isize(dn->inode);
raw_node = F2FS_NODE(dn->node_page);
- addr = blkaddr_in_node(raw_node) + ofs;
+ addr = blkaddr_in_node(raw_node) + base + ofs;
for (; count > 0; count--, addr++, dn->ofs_in_node++) {
block_t blkaddr = le32_to_cpu(*addr);
@@ -647,7 +664,7 @@ int f2fs_getattr(const struct path *path, struct kstat *stat,
struct f2fs_inode_info *fi = F2FS_I(inode);
unsigned int flags;
- flags = fi->i_flags & FS_FL_USER_VISIBLE;
+ flags = fi->i_flags & (FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL);
if (flags & FS_APPEND_FL)
stat->attributes |= STATX_ATTR_APPEND;
if (flags & FS_COMPR_FL)
@@ -927,7 +944,8 @@ next_dnode:
done = min((pgoff_t)ADDRS_PER_PAGE(dn.node_page, inode) -
dn.ofs_in_node, len);
for (i = 0; i < done; i++, blkaddr++, do_replace++, dn.ofs_in_node++) {
- *blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node);
+ *blkaddr = datablock_addr(dn.inode,
+ dn.node_page, dn.ofs_in_node);
if (!is_checkpointed_data(sbi, *blkaddr)) {
if (test_opt(sbi, LFS)) {
@@ -1003,8 +1021,8 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
ADDRS_PER_PAGE(dn.node_page, dst_inode) -
dn.ofs_in_node, len - i);
do {
- dn.data_blkaddr = datablock_addr(dn.node_page,
- dn.ofs_in_node);
+ dn.data_blkaddr = datablock_addr(dn.inode,
+ dn.node_page, dn.ofs_in_node);
truncate_data_blocks_range(&dn, 1);
if (do_replace[i]) {
@@ -1173,7 +1191,8 @@ static int f2fs_do_zero_range(struct dnode_of_data *dn, pgoff_t start,
int ret;
for (; index < end; index++, dn->ofs_in_node++) {
- if (datablock_addr(dn->node_page, dn->ofs_in_node) == NULL_ADDR)
+ if (datablock_addr(dn->inode, dn->node_page,
+ dn->ofs_in_node) == NULL_ADDR)
count++;
}
@@ -1184,8 +1203,8 @@ static int f2fs_do_zero_range(struct dnode_of_data *dn, pgoff_t start,
dn->ofs_in_node = ofs_in_node;
for (index = start; index < end; index++, dn->ofs_in_node++) {
- dn->data_blkaddr =
- datablock_addr(dn->node_page, dn->ofs_in_node);
+ dn->data_blkaddr = datablock_addr(dn->inode,
+ dn->node_page, dn->ofs_in_node);
/*
* reserve_new_blocks will not guarantee entire block
* allocation.
@@ -1495,33 +1514,67 @@ static int f2fs_release_file(struct inode *inode, struct file *filp)
return 0;
}
-#define F2FS_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
-#define F2FS_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL)
-
-static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags)
+static int f2fs_file_flush(struct file *file, fl_owner_t id)
{
- if (S_ISDIR(mode))
- return flags;
- else if (S_ISREG(mode))
- return flags & F2FS_REG_FLMASK;
- else
- return flags & F2FS_OTHER_FLMASK;
+ struct inode *inode = file_inode(file);
+
+ /*
+ * If the process doing a transaction is crashed, we should do
+ * roll-back. Otherwise, other reader/write can see corrupted database
+ * until all the writers close its file. Since this should be done
+ * before dropping file lock, it needs to do in ->flush.
+ */
+ if (f2fs_is_atomic_file(inode) &&
+ F2FS_I(inode)->inmem_task == current)
+ drop_inmem_pages(inode);
+ return 0;
}
static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
{
struct inode *inode = file_inode(filp);
struct f2fs_inode_info *fi = F2FS_I(inode);
- unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE;
+ unsigned int flags = fi->i_flags &
+ (FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL);
return put_user(flags, (int __user *)arg);
}
+static int __f2fs_ioc_setflags(struct inode *inode, unsigned int flags)
+{
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ unsigned int oldflags;
+
+ /* Is it quota file? Do not allow user to mess with it */
+ if (IS_NOQUOTA(inode))
+ return -EPERM;
+
+ flags = f2fs_mask_flags(inode->i_mode, flags);
+
+ oldflags = fi->i_flags;
+
+ if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL))
+ if (!capable(CAP_LINUX_IMMUTABLE))
+ return -EPERM;
+
+ flags = flags & (FS_FL_USER_MODIFIABLE | FS_PROJINHERIT_FL);
+ flags |= oldflags & ~(FS_FL_USER_MODIFIABLE | FS_PROJINHERIT_FL);
+ fi->i_flags = flags;
+
+ if (fi->i_flags & FS_PROJINHERIT_FL)
+ set_inode_flag(inode, FI_PROJ_INHERIT);
+ else
+ clear_inode_flag(inode, FI_PROJ_INHERIT);
+
+ inode->i_ctime = current_time(inode);
+ f2fs_set_inode_flags(inode);
+ f2fs_mark_inode_dirty_sync(inode, false);
+ return 0;
+}
+
static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
{
struct inode *inode = file_inode(filp);
- struct f2fs_inode_info *fi = F2FS_I(inode);
unsigned int flags;
- unsigned int oldflags;
int ret;
if (!inode_owner_or_capable(inode))
@@ -1536,31 +1589,8 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
inode_lock(inode);
- /* Is it quota file? Do not allow user to mess with it */
- if (IS_NOQUOTA(inode)) {
- ret = -EPERM;
- goto unlock_out;
- }
-
- flags = f2fs_mask_flags(inode->i_mode, flags);
-
- oldflags = fi->i_flags;
-
- if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
- if (!capable(CAP_LINUX_IMMUTABLE)) {
- ret = -EPERM;
- goto unlock_out;
- }
- }
-
- flags = flags & FS_FL_USER_MODIFIABLE;
- flags |= oldflags & ~FS_FL_USER_MODIFIABLE;
- fi->i_flags = flags;
+ ret = __f2fs_ioc_setflags(inode, flags);
- inode->i_ctime = current_time(inode);
- f2fs_set_inode_flags(inode);
- f2fs_mark_inode_dirty_sync(inode, false);
-unlock_out:
inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
@@ -1610,10 +1640,12 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
if (ret) {
clear_inode_flag(inode, FI_ATOMIC_FILE);
+ clear_inode_flag(inode, FI_HOT_DATA);
goto out;
}
inc_stat:
+ F2FS_I(inode)->inmem_task = current;
stat_inc_atomic_write(inode);
stat_update_max_atomic_write(inode);
out:
@@ -1647,10 +1679,11 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
if (!ret) {
clear_inode_flag(inode, FI_ATOMIC_FILE);
+ clear_inode_flag(inode, FI_HOT_DATA);
stat_dec_atomic_write(inode);
}
} else {
- ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
+ ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false);
}
err_out:
inode_unlock(inode);
@@ -1786,7 +1819,7 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)
f2fs_stop_checkpoint(sbi, false);
break;
case F2FS_GOING_DOWN_METAFLUSH:
- sync_meta_pages(sbi, META, LONG_MAX);
+ sync_meta_pages(sbi, META, LONG_MAX, FS_META_IO);
f2fs_stop_checkpoint(sbi, false);
break;
default:
@@ -2043,7 +2076,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
*/
while (map.m_lblk < pg_end) {
map.m_len = pg_end - map.m_lblk;
- err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_READ);
+ err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
if (err)
goto out;
@@ -2085,7 +2118,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
do_map:
map.m_len = pg_end - map.m_lblk;
- err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_READ);
+ err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_DEFAULT);
if (err)
goto clear_out;
@@ -2384,6 +2417,210 @@ out:
return ret;
}
+static int f2fs_ioc_get_features(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ u32 sb_feature = le32_to_cpu(F2FS_I_SB(inode)->raw_super->feature);
+
+ /* Must validate to set it with SQLite behavior in Android. */
+ sb_feature |= F2FS_FEATURE_ATOMIC_WRITE;
+
+ return put_user(sb_feature, (u32 __user *)arg);
+}
+
+#ifdef CONFIG_QUOTA
+static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ struct super_block *sb = sbi->sb;
+ struct dquot *transfer_to[MAXQUOTAS] = {};
+ struct page *ipage;
+ kprojid_t kprojid;
+ int err;
+
+ if (!f2fs_sb_has_project_quota(sb)) {
+ if (projid != F2FS_DEF_PROJID)
+ return -EOPNOTSUPP;
+ else
+ return 0;
+ }
+
+ if (!f2fs_has_extra_attr(inode))
+ return -EOPNOTSUPP;
+
+ kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
+
+ if (projid_eq(kprojid, F2FS_I(inode)->i_projid))
+ return 0;
+
+ err = mnt_want_write_file(filp);
+ if (err)
+ return err;
+
+ err = -EPERM;
+ inode_lock(inode);
+
+ /* Is it quota file? Do not allow user to mess with it */
+ if (IS_NOQUOTA(inode))
+ goto out_unlock;
+
+ ipage = get_node_page(sbi, inode->i_ino);
+ if (IS_ERR(ipage)) {
+ err = PTR_ERR(ipage);
+ goto out_unlock;
+ }
+
+ if (!F2FS_FITS_IN_INODE(F2FS_INODE(ipage), fi->i_extra_isize,
+ i_projid)) {
+ err = -EOVERFLOW;
+ f2fs_put_page(ipage, 1);
+ goto out_unlock;
+ }
+ f2fs_put_page(ipage, 1);
+
+ dquot_initialize(inode);
+
+ transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
+ if (!IS_ERR(transfer_to[PRJQUOTA])) {
+ err = __dquot_transfer(inode, transfer_to);
+ dqput(transfer_to[PRJQUOTA]);
+ if (err)
+ goto out_dirty;
+ }
+
+ F2FS_I(inode)->i_projid = kprojid;
+ inode->i_ctime = current_time(inode);
+out_dirty:
+ f2fs_mark_inode_dirty_sync(inode, true);
+out_unlock:
+ inode_unlock(inode);
+ mnt_drop_write_file(filp);
+ return err;
+}
+#else
+static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
+{
+ if (projid != F2FS_DEF_PROJID)
+ return -EOPNOTSUPP;
+ return 0;
+}
+#endif
+
+/* Transfer internal flags to xflags */
+static inline __u32 f2fs_iflags_to_xflags(unsigned long iflags)
+{
+ __u32 xflags = 0;
+
+ if (iflags & FS_SYNC_FL)
+ xflags |= FS_XFLAG_SYNC;
+ if (iflags & FS_IMMUTABLE_FL)
+ xflags |= FS_XFLAG_IMMUTABLE;
+ if (iflags & FS_APPEND_FL)
+ xflags |= FS_XFLAG_APPEND;
+ if (iflags & FS_NODUMP_FL)
+ xflags |= FS_XFLAG_NODUMP;
+ if (iflags & FS_NOATIME_FL)
+ xflags |= FS_XFLAG_NOATIME;
+ if (iflags & FS_PROJINHERIT_FL)
+ xflags |= FS_XFLAG_PROJINHERIT;
+ return xflags;
+}
+
+#define F2FS_SUPPORTED_FS_XFLAGS (FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | \
+ FS_XFLAG_APPEND | FS_XFLAG_NODUMP | \
+ FS_XFLAG_NOATIME | FS_XFLAG_PROJINHERIT)
+
+/* Flags we can manipulate with through EXT4_IOC_FSSETXATTR */
+#define F2FS_FL_XFLAG_VISIBLE (FS_SYNC_FL | \
+ FS_IMMUTABLE_FL | \
+ FS_APPEND_FL | \
+ FS_NODUMP_FL | \
+ FS_NOATIME_FL | \
+ FS_PROJINHERIT_FL)
+
+/* Transfer xflags flags to internal */
+static inline unsigned long f2fs_xflags_to_iflags(__u32 xflags)
+{
+ unsigned long iflags = 0;
+
+ if (xflags & FS_XFLAG_SYNC)
+ iflags |= FS_SYNC_FL;
+ if (xflags & FS_XFLAG_IMMUTABLE)
+ iflags |= FS_IMMUTABLE_FL;
+ if (xflags & FS_XFLAG_APPEND)
+ iflags |= FS_APPEND_FL;
+ if (xflags & FS_XFLAG_NODUMP)
+ iflags |= FS_NODUMP_FL;
+ if (xflags & FS_XFLAG_NOATIME)
+ iflags |= FS_NOATIME_FL;
+ if (xflags & FS_XFLAG_PROJINHERIT)
+ iflags |= FS_PROJINHERIT_FL;
+
+ return iflags;
+}
+
+static int f2fs_ioc_fsgetxattr(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ struct fsxattr fa;
+
+ memset(&fa, 0, sizeof(struct fsxattr));
+ fa.fsx_xflags = f2fs_iflags_to_xflags(fi->i_flags &
+ (FS_FL_USER_VISIBLE | FS_PROJINHERIT_FL));
+
+ if (f2fs_sb_has_project_quota(inode->i_sb))
+ fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
+ fi->i_projid);
+
+ if (copy_to_user((struct fsxattr __user *)arg, &fa, sizeof(fa)))
+ return -EFAULT;
+ return 0;
+}
+
+static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ struct fsxattr fa;
+ unsigned int flags;
+ int err;
+
+ if (copy_from_user(&fa, (struct fsxattr __user *)arg, sizeof(fa)))
+ return -EFAULT;
+
+ /* Make sure caller has proper permission */
+ if (!inode_owner_or_capable(inode))
+ return -EACCES;
+
+ if (fa.fsx_xflags & ~F2FS_SUPPORTED_FS_XFLAGS)
+ return -EOPNOTSUPP;
+
+ flags = f2fs_xflags_to_iflags(fa.fsx_xflags);
+ if (f2fs_mask_flags(inode->i_mode, flags) != flags)
+ return -EOPNOTSUPP;
+
+ err = mnt_want_write_file(filp);
+ if (err)
+ return err;
+
+ inode_lock(inode);
+ flags = (fi->i_flags & ~F2FS_FL_XFLAG_VISIBLE) |
+ (flags & F2FS_FL_XFLAG_VISIBLE);
+ err = __f2fs_ioc_setflags(inode, flags);
+ inode_unlock(inode);
+ mnt_drop_write_file(filp);
+ if (err)
+ return err;
+
+ err = f2fs_ioc_setproject(filp, fa.fsx_projid);
+ if (err)
+ return err;
+
+ return 0;
+}
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
@@ -2426,6 +2663,12 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return f2fs_ioc_move_range(filp, arg);
case F2FS_IOC_FLUSH_DEVICE:
return f2fs_ioc_flush_device(filp, arg);
+ case F2FS_IOC_GET_FEATURES:
+ return f2fs_ioc_get_features(filp, arg);
+ case F2FS_IOC_FSGETXATTR:
+ return f2fs_ioc_fsgetxattr(filp, arg);
+ case F2FS_IOC_FSSETXATTR:
+ return f2fs_ioc_fssetxattr(filp, arg);
default:
return -ENOTTY;
}
@@ -2455,6 +2698,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
ret = __generic_file_write_iter(iocb, from);
blk_finish_plug(&plug);
clear_inode_flag(inode, FI_NO_PREALLOC);
+
+ if (ret > 0)
+ f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret);
}
inode_unlock(inode);
@@ -2491,6 +2737,9 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case F2FS_IOC_DEFRAGMENT:
case F2FS_IOC_MOVE_RANGE:
case F2FS_IOC_FLUSH_DEVICE:
+ case F2FS_IOC_GET_FEATURES:
+ case F2FS_IOC_FSGETXATTR:
+ case F2FS_IOC_FSSETXATTR:
break;
default:
return -ENOIOCTLCMD;
@@ -2506,6 +2755,7 @@ const struct file_operations f2fs_file_operations = {
.open = f2fs_file_open,
.release = f2fs_release_file,
.mmap = f2fs_file_mmap,
+ .flush = f2fs_file_flush,
.fsync = f2fs_sync_file,
.fallocate = f2fs_fallocate,
.unlocked_ioctl = f2fs_ioctl,
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index fa3d2e2df8e7..bfe6a8ccc3a0 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -28,16 +28,21 @@ static int gc_thread_func(void *data)
struct f2fs_sb_info *sbi = data;
struct f2fs_gc_kthread *gc_th = sbi->gc_thread;
wait_queue_head_t *wq = &sbi->gc_thread->gc_wait_queue_head;
- long wait_ms;
+ unsigned int wait_ms;
wait_ms = gc_th->min_sleep_time;
set_freezable();
do {
wait_event_interruptible_timeout(*wq,
- kthread_should_stop() || freezing(current),
+ kthread_should_stop() || freezing(current) ||
+ gc_th->gc_wake,
msecs_to_jiffies(wait_ms));
+ /* give it a try one time */
+ if (gc_th->gc_wake)
+ gc_th->gc_wake = 0;
+
if (try_to_freeze())
continue;
if (kthread_should_stop())
@@ -55,6 +60,9 @@ static int gc_thread_func(void *data)
}
#endif
+ if (!sb_start_write_trylock(sbi->sb))
+ continue;
+
/*
* [GC triggering condition]
* 0. GC is not conducted currently.
@@ -69,19 +77,24 @@ static int gc_thread_func(void *data)
* So, I'd like to wait some time to collect dirty segments.
*/
if (!mutex_trylock(&sbi->gc_mutex))
- continue;
+ goto next;
+
+ if (gc_th->gc_urgent) {
+ wait_ms = gc_th->urgent_sleep_time;
+ goto do_gc;
+ }
if (!is_idle(sbi)) {
increase_sleep_time(gc_th, &wait_ms);
mutex_unlock(&sbi->gc_mutex);
- continue;
+ goto next;
}
if (has_enough_invalid_blocks(sbi))
decrease_sleep_time(gc_th, &wait_ms);
else
increase_sleep_time(gc_th, &wait_ms);
-
+do_gc:
stat_inc_bggc_count(sbi);
/* if return value is not zero, no victim was selected */
@@ -93,6 +106,8 @@ static int gc_thread_func(void *data)
/* balancing f2fs's metadata periodically */
f2fs_balance_fs_bg(sbi);
+next:
+ sb_end_write(sbi->sb);
} while (!kthread_should_stop());
return 0;
@@ -110,11 +125,14 @@ int start_gc_thread(struct f2fs_sb_info *sbi)
goto out;
}
+ gc_th->urgent_sleep_time = DEF_GC_THREAD_URGENT_SLEEP_TIME;
gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
gc_th->gc_idle = 0;
+ gc_th->gc_urgent = 0;
+ gc_th->gc_wake= 0;
sbi->gc_thread = gc_th;
init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);
@@ -259,20 +277,11 @@ static unsigned int get_greedy_cost(struct f2fs_sb_info *sbi,
valid_blocks * 2 : valid_blocks;
}
-static unsigned int get_ssr_cost(struct f2fs_sb_info *sbi,
- unsigned int segno)
-{
- struct seg_entry *se = get_seg_entry(sbi, segno);
-
- return se->ckpt_valid_blocks > se->valid_blocks ?
- se->ckpt_valid_blocks : se->valid_blocks;
-}
-
static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
unsigned int segno, struct victim_sel_policy *p)
{
if (p->alloc_mode == SSR)
- return get_ssr_cost(sbi, segno);
+ return get_seg_entry(sbi, segno)->ckpt_valid_blocks;
/* alloc_mode == LFS */
if (p->gc_mode == GC_GREEDY)
@@ -582,7 +591,7 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
}
*nofs = ofs_of_node(node_page);
- source_blkaddr = datablock_addr(node_page, ofs_in_node);
+ source_blkaddr = datablock_addr(NULL, node_page, ofs_in_node);
f2fs_put_page(node_page, 1);
if (source_blkaddr != blkaddr)
@@ -590,8 +599,12 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
return true;
}
-static void move_encrypted_block(struct inode *inode, block_t bidx,
- unsigned int segno, int off)
+/*
+ * Move data block via META_MAPPING while keeping locked data page.
+ * This can be used to move blocks, aka LBAs, directly on disk.
+ */
+static void move_data_block(struct inode *inode, block_t bidx,
+ unsigned int segno, int off)
{
struct f2fs_io_info fio = {
.sbi = F2FS_I_SB(inode),
@@ -684,6 +697,8 @@ static void move_encrypted_block(struct inode *inode, block_t bidx,
fio.new_blkaddr = newaddr;
f2fs_submit_page_write(&fio);
+ f2fs_update_iostat(fio.sbi, FS_GC_DATA_IO, F2FS_BLKSIZE);
+
f2fs_update_data_blkaddr(&dn, newaddr);
set_inode_flag(inode, FI_APPEND_WRITE);
if (page->index == 0)
@@ -731,6 +746,7 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
.page = page,
.encrypted_page = NULL,
.need_lock = LOCK_REQ,
+ .io_type = FS_GC_DATA_IO,
};
bool is_dirty = PageDirty(page);
int err;
@@ -819,8 +835,7 @@ next_step:
continue;
/* if encrypted inode, let's go phase 3 */
- if (f2fs_encrypted_inode(inode) &&
- S_ISREG(inode->i_mode)) {
+ if (f2fs_encrypted_file(inode)) {
add_gc_inode(gc_list, inode);
continue;
}
@@ -854,14 +869,18 @@ next_step:
continue;
}
locked = true;
+
+ /* wait for all inflight aio data */
+ inode_dio_wait(inode);
}
start_bidx = start_bidx_of_node(nofs, inode)
+ ofs_in_node;
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
- move_encrypted_block(inode, start_bidx, segno, off);
+ if (f2fs_encrypted_file(inode))
+ move_data_block(inode, start_bidx, segno, off);
else
- move_data_page(inode, start_bidx, gc_type, segno, off);
+ move_data_page(inode, start_bidx, gc_type,
+ segno, off);
if (locked) {
up_write(&fi->dio_rwsem[WRITE]);
@@ -898,7 +917,7 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
struct blk_plug plug;
unsigned int segno = start_segno;
unsigned int end_segno = start_segno + sbi->segs_per_sec;
- int sec_freed = 0;
+ int seg_freed = 0;
unsigned char type = IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
SUM_TYPE_DATA : SUM_TYPE_NODE;
@@ -944,6 +963,10 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
gc_type);
stat_inc_seg_count(sbi, type, gc_type);
+
+ if (gc_type == FG_GC &&
+ get_valid_blocks(sbi, segno, false) == 0)
+ seg_freed++;
next:
f2fs_put_page(sum_page, 0);
}
@@ -954,21 +977,17 @@ next:
blk_finish_plug(&plug);
- if (gc_type == FG_GC &&
- get_valid_blocks(sbi, start_segno, true) == 0)
- sec_freed = 1;
-
stat_inc_call_count(sbi->stat_info);
- return sec_freed;
+ return seg_freed;
}
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
bool background, unsigned int segno)
{
int gc_type = sync ? FG_GC : BG_GC;
- int sec_freed = 0;
- int ret;
+ int sec_freed = 0, seg_freed = 0, total_freed = 0;
+ int ret = 0;
struct cp_control cpc;
unsigned int init_segno = segno;
struct gc_inode_list gc_list = {
@@ -976,6 +995,15 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
.iroot = RADIX_TREE_INIT(GFP_NOFS),
};
+ trace_f2fs_gc_begin(sbi->sb, sync, background,
+ get_pages(sbi, F2FS_DIRTY_NODES),
+ get_pages(sbi, F2FS_DIRTY_DENTS),
+ get_pages(sbi, F2FS_DIRTY_IMETA),
+ free_sections(sbi),
+ free_segments(sbi),
+ reserved_segments(sbi),
+ prefree_segments(sbi));
+
cpc.reason = __get_cp_reason(sbi);
gc_more:
if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) {
@@ -1002,17 +1030,20 @@ gc_more:
gc_type = FG_GC;
}
- ret = -EINVAL;
/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
- if (gc_type == BG_GC && !background)
+ if (gc_type == BG_GC && !background) {
+ ret = -EINVAL;
goto stop;
- if (!__get_victim(sbi, &segno, gc_type))
+ }
+ if (!__get_victim(sbi, &segno, gc_type)) {
+ ret = -ENODATA;
goto stop;
- ret = 0;
+ }
- if (do_garbage_collect(sbi, segno, &gc_list, gc_type) &&
- gc_type == FG_GC)
+ seg_freed = do_garbage_collect(sbi, segno, &gc_list, gc_type);
+ if (gc_type == FG_GC && seg_freed == sbi->segs_per_sec)
sec_freed++;
+ total_freed += seg_freed;
if (gc_type == FG_GC)
sbi->cur_victim_sec = NULL_SEGNO;
@@ -1029,6 +1060,16 @@ gc_more:
stop:
SIT_I(sbi)->last_victim[ALLOC_NEXT] = 0;
SIT_I(sbi)->last_victim[FLUSH_DEVICE] = init_segno;
+
+ trace_f2fs_gc_end(sbi->sb, ret, total_freed, sec_freed,
+ get_pages(sbi, F2FS_DIRTY_NODES),
+ get_pages(sbi, F2FS_DIRTY_DENTS),
+ get_pages(sbi, F2FS_DIRTY_IMETA),
+ free_sections(sbi),
+ free_segments(sbi),
+ reserved_segments(sbi),
+ prefree_segments(sbi));
+
mutex_unlock(&sbi->gc_mutex);
put_gc_inode(&gc_list);
diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h
index a993967dcdb9..9325191fab2d 100644
--- a/fs/f2fs/gc.h
+++ b/fs/f2fs/gc.h
@@ -13,6 +13,7 @@
* whether IO subsystem is idle
* or not
*/
+#define DEF_GC_THREAD_URGENT_SLEEP_TIME 500 /* 500 ms */
#define DEF_GC_THREAD_MIN_SLEEP_TIME 30000 /* milliseconds */
#define DEF_GC_THREAD_MAX_SLEEP_TIME 60000
#define DEF_GC_THREAD_NOGC_SLEEP_TIME 300000 /* wait 5 min */
@@ -27,12 +28,15 @@ struct f2fs_gc_kthread {
wait_queue_head_t gc_wait_queue_head;
/* for gc sleep time */
+ unsigned int urgent_sleep_time;
unsigned int min_sleep_time;
unsigned int max_sleep_time;
unsigned int no_gc_sleep_time;
/* for changing gc mode */
unsigned int gc_idle;
+ unsigned int gc_urgent;
+ unsigned int gc_wake;
};
struct gc_inode_list {
@@ -65,25 +69,32 @@ static inline block_t limit_free_user_blocks(struct f2fs_sb_info *sbi)
}
static inline void increase_sleep_time(struct f2fs_gc_kthread *gc_th,
- long *wait)
+ unsigned int *wait)
{
+ unsigned int min_time = gc_th->min_sleep_time;
+ unsigned int max_time = gc_th->max_sleep_time;
+
if (*wait == gc_th->no_gc_sleep_time)
return;
- *wait += gc_th->min_sleep_time;
- if (*wait > gc_th->max_sleep_time)
- *wait = gc_th->max_sleep_time;
+ if ((long long)*wait + (long long)min_time > (long long)max_time)
+ *wait = max_time;
+ else
+ *wait += min_time;
}
static inline void decrease_sleep_time(struct f2fs_gc_kthread *gc_th,
- long *wait)
+ unsigned int *wait)
{
+ unsigned int min_time = gc_th->min_sleep_time;
+
if (*wait == gc_th->no_gc_sleep_time)
*wait = gc_th->max_sleep_time;
- *wait -= gc_th->min_sleep_time;
- if (*wait <= gc_th->min_sleep_time)
- *wait = gc_th->min_sleep_time;
+ if ((long long)*wait - (long long)min_time < (long long)min_time)
+ *wait = min_time;
+ else
+ *wait -= min_time;
}
static inline bool has_enough_invalid_blocks(struct f2fs_sb_info *sbi)
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index e0fd4376e6fb..8322e4e7bb3f 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -22,10 +22,10 @@ bool f2fs_may_inline_data(struct inode *inode)
if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))
return false;
- if (i_size_read(inode) > MAX_INLINE_DATA)
+ if (i_size_read(inode) > MAX_INLINE_DATA(inode))
return false;
- if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
+ if (f2fs_encrypted_file(inode))
return false;
return true;
@@ -44,6 +44,7 @@ bool f2fs_may_inline_dentry(struct inode *inode)
void read_inline_data(struct page *page, struct page *ipage)
{
+ struct inode *inode = page->mapping->host;
void *src_addr, *dst_addr;
if (PageUptodate(page))
@@ -51,12 +52,12 @@ void read_inline_data(struct page *page, struct page *ipage)
f2fs_bug_on(F2FS_P_SB(page), page->index);
- zero_user_segment(page, MAX_INLINE_DATA, PAGE_SIZE);
+ zero_user_segment(page, MAX_INLINE_DATA(inode), PAGE_SIZE);
/* Copy the whole inline data block */
- src_addr = inline_data_addr(ipage);
+ src_addr = inline_data_addr(inode, ipage);
dst_addr = kmap_atomic(page);
- memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
+ memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
flush_dcache_page(page);
kunmap_atomic(dst_addr);
if (!PageUptodate(page))
@@ -67,13 +68,13 @@ void truncate_inline_inode(struct inode *inode, struct page *ipage, u64 from)
{
void *addr;
- if (from >= MAX_INLINE_DATA)
+ if (from >= MAX_INLINE_DATA(inode))
return;
- addr = inline_data_addr(ipage);
+ addr = inline_data_addr(inode, ipage);
f2fs_wait_on_page_writeback(ipage, NODE, true);
- memset(addr + from, 0, MAX_INLINE_DATA - from);
+ memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
set_page_dirty(ipage);
if (from == 0)
@@ -116,6 +117,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
.op_flags = REQ_SYNC | REQ_PRIO,
.page = page,
.encrypted_page = NULL,
+ .io_type = FS_DATA_IO,
};
int dirty, err;
@@ -200,6 +202,8 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
{
void *src_addr, *dst_addr;
struct dnode_of_data dn;
+ struct address_space *mapping = page_mapping(page);
+ unsigned long flags;
int err;
set_new_dnode(&dn, inode, NULL, NULL, 0);
@@ -216,11 +220,16 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
f2fs_wait_on_page_writeback(dn.inode_page, NODE, true);
src_addr = kmap_atomic(page);
- dst_addr = inline_data_addr(dn.inode_page);
- memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
+ dst_addr = inline_data_addr(inode, dn.inode_page);
+ memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
kunmap_atomic(src_addr);
set_page_dirty(dn.inode_page);
+ spin_lock_irqsave(&mapping->tree_lock, flags);
+ radix_tree_tag_clear(&mapping->page_tree, page_index(page),
+ PAGECACHE_TAG_DIRTY);
+ spin_unlock_irqrestore(&mapping->tree_lock, flags);
+
set_inode_flag(inode, FI_APPEND_WRITE);
set_inode_flag(inode, FI_DATA_EXIST);
@@ -255,9 +264,9 @@ process_inline:
f2fs_wait_on_page_writeback(ipage, NODE, true);
- src_addr = inline_data_addr(npage);
- dst_addr = inline_data_addr(ipage);
- memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
+ src_addr = inline_data_addr(inode, npage);
+ dst_addr = inline_data_addr(inode, ipage);
+ memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
set_inode_flag(inode, FI_INLINE_DATA);
set_inode_flag(inode, FI_DATA_EXIST);
@@ -285,11 +294,11 @@ struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
struct fscrypt_name *fname, struct page **res_page)
{
struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
- struct f2fs_inline_dentry *inline_dentry;
struct qstr name = FSTR_TO_QSTR(&fname->disk_name);
struct f2fs_dir_entry *de;
struct f2fs_dentry_ptr d;
struct page *ipage;
+ void *inline_dentry;
f2fs_hash_t namehash;
ipage = get_node_page(sbi, dir->i_ino);
@@ -300,9 +309,9 @@ struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
namehash = f2fs_dentry_hash(&name, fname);
- inline_dentry = inline_data_addr(ipage);
+ inline_dentry = inline_data_addr(dir, ipage);
- make_dentry_ptr_inline(NULL, &d, inline_dentry);
+ make_dentry_ptr_inline(dir, &d, inline_dentry);
de = find_target_dentry(fname, namehash, NULL, &d);
unlock_page(ipage);
if (de)
@@ -316,19 +325,19 @@ struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
int make_empty_inline_dir(struct inode *inode, struct inode *parent,
struct page *ipage)
{
- struct f2fs_inline_dentry *inline_dentry;
struct f2fs_dentry_ptr d;
+ void *inline_dentry;
- inline_dentry = inline_data_addr(ipage);
+ inline_dentry = inline_data_addr(inode, ipage);
- make_dentry_ptr_inline(NULL, &d, inline_dentry);
+ make_dentry_ptr_inline(inode, &d, inline_dentry);
do_make_empty_dir(inode, parent, &d);
set_page_dirty(ipage);
/* update i_size to MAX_INLINE_DATA */
- if (i_size_read(inode) < MAX_INLINE_DATA)
- f2fs_i_size_write(inode, MAX_INLINE_DATA);
+ if (i_size_read(inode) < MAX_INLINE_DATA(inode))
+ f2fs_i_size_write(inode, MAX_INLINE_DATA(inode));
return 0;
}
@@ -337,11 +346,12 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,
* release ipage in this function.
*/
static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
- struct f2fs_inline_dentry *inline_dentry)
+ void *inline_dentry)
{
struct page *page;
struct dnode_of_data dn;
struct f2fs_dentry_block *dentry_blk;
+ struct f2fs_dentry_ptr src, dst;
int err;
page = f2fs_grab_cache_page(dir->i_mapping, 0, false);
@@ -356,25 +366,24 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
goto out;
f2fs_wait_on_page_writeback(page, DATA, true);
- zero_user_segment(page, MAX_INLINE_DATA, PAGE_SIZE);
+ zero_user_segment(page, MAX_INLINE_DATA(dir), PAGE_SIZE);
dentry_blk = kmap_atomic(page);
+ make_dentry_ptr_inline(dir, &src, inline_dentry);
+ make_dentry_ptr_block(dir, &dst, dentry_blk);
+
/* copy data from inline dentry block to new dentry block */
- memcpy(dentry_blk->dentry_bitmap, inline_dentry->dentry_bitmap,
- INLINE_DENTRY_BITMAP_SIZE);
- memset(dentry_blk->dentry_bitmap + INLINE_DENTRY_BITMAP_SIZE, 0,
- SIZE_OF_DENTRY_BITMAP - INLINE_DENTRY_BITMAP_SIZE);
+ memcpy(dst.bitmap, src.bitmap, src.nr_bitmap);
+ memset(dst.bitmap + src.nr_bitmap, 0, dst.nr_bitmap - src.nr_bitmap);
/*
* we do not need to zero out remainder part of dentry and filename
* field, since we have used bitmap for marking the usage status of
* them, besides, we can also ignore copying/zeroing reserved space
* of dentry block, because them haven't been used so far.
*/
- memcpy(dentry_blk->dentry, inline_dentry->dentry,
- sizeof(struct f2fs_dir_entry) * NR_INLINE_DENTRY);
- memcpy(dentry_blk->filename, inline_dentry->filename,
- NR_INLINE_DENTRY * F2FS_SLOT_LEN);
+ memcpy(dst.dentry, src.dentry, SIZE_OF_DIR_ENTRY * src.max);
+ memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
kunmap_atomic(dentry_blk);
if (!PageUptodate(page))
@@ -395,14 +404,13 @@ out:
return err;
}
-static int f2fs_add_inline_entries(struct inode *dir,
- struct f2fs_inline_dentry *inline_dentry)
+static int f2fs_add_inline_entries(struct inode *dir, void *inline_dentry)
{
struct f2fs_dentry_ptr d;
unsigned long bit_pos = 0;
int err = 0;
- make_dentry_ptr_inline(NULL, &d, inline_dentry);
+ make_dentry_ptr_inline(dir, &d, inline_dentry);
while (bit_pos < d.max) {
struct f2fs_dir_entry *de;
@@ -444,19 +452,19 @@ punch_dentry_pages:
}
static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
- struct f2fs_inline_dentry *inline_dentry)
+ void *inline_dentry)
{
- struct f2fs_inline_dentry *backup_dentry;
+ void *backup_dentry;
int err;
backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
- sizeof(struct f2fs_inline_dentry), GFP_F2FS_ZERO);
+ MAX_INLINE_DATA(dir), GFP_F2FS_ZERO);
if (!backup_dentry) {
f2fs_put_page(ipage, 1);
return -ENOMEM;
}
- memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA);
+ memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA(dir));
truncate_inline_inode(dir, ipage, 0);
unlock_page(ipage);
@@ -473,9 +481,9 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
return 0;
recover:
lock_page(ipage);
- memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
+ memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
f2fs_i_depth_write(dir, 0);
- f2fs_i_size_write(dir, MAX_INLINE_DATA);
+ f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
set_page_dirty(ipage);
f2fs_put_page(ipage, 1);
@@ -484,7 +492,7 @@ recover:
}
static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
- struct f2fs_inline_dentry *inline_dentry)
+ void *inline_dentry)
{
if (!F2FS_I(dir)->i_dir_level)
return f2fs_move_inline_dirents(dir, ipage, inline_dentry);
@@ -500,7 +508,7 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
struct page *ipage;
unsigned int bit_pos;
f2fs_hash_t name_hash;
- struct f2fs_inline_dentry *inline_dentry = NULL;
+ void *inline_dentry = NULL;
struct f2fs_dentry_ptr d;
int slots = GET_DENTRY_SLOTS(new_name->len);
struct page *page = NULL;
@@ -510,10 +518,11 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
if (IS_ERR(ipage))
return PTR_ERR(ipage);
- inline_dentry = inline_data_addr(ipage);
- bit_pos = room_for_filename(&inline_dentry->dentry_bitmap,
- slots, NR_INLINE_DENTRY);
- if (bit_pos >= NR_INLINE_DENTRY) {
+ inline_dentry = inline_data_addr(dir, ipage);
+ make_dentry_ptr_inline(dir, &d, inline_dentry);
+
+ bit_pos = room_for_filename(d.bitmap, slots, d.max);
+ if (bit_pos >= d.max) {
err = f2fs_convert_inline_dir(dir, ipage, inline_dentry);
if (err)
return err;
@@ -534,7 +543,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
f2fs_wait_on_page_writeback(ipage, NODE, true);
name_hash = f2fs_dentry_hash(new_name, NULL);
- make_dentry_ptr_inline(NULL, &d, inline_dentry);
f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
set_page_dirty(ipage);
@@ -557,7 +565,8 @@ out:
void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
struct inode *dir, struct inode *inode)
{
- struct f2fs_inline_dentry *inline_dentry;
+ struct f2fs_dentry_ptr d;
+ void *inline_dentry;
int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
unsigned int bit_pos;
int i;
@@ -565,11 +574,12 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
lock_page(page);
f2fs_wait_on_page_writeback(page, NODE, true);
- inline_dentry = inline_data_addr(page);
- bit_pos = dentry - inline_dentry->dentry;
+ inline_dentry = inline_data_addr(dir, page);
+ make_dentry_ptr_inline(dir, &d, inline_dentry);
+
+ bit_pos = dentry - d.dentry;
for (i = 0; i < slots; i++)
- __clear_bit_le(bit_pos + i,
- &inline_dentry->dentry_bitmap);
+ __clear_bit_le(bit_pos + i, d.bitmap);
set_page_dirty(page);
f2fs_put_page(page, 1);
@@ -586,20 +596,21 @@ bool f2fs_empty_inline_dir(struct inode *dir)
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
struct page *ipage;
unsigned int bit_pos = 2;
- struct f2fs_inline_dentry *inline_dentry;
+ void *inline_dentry;
+ struct f2fs_dentry_ptr d;
ipage = get_node_page(sbi, dir->i_ino);
if (IS_ERR(ipage))
return false;
- inline_dentry = inline_data_addr(ipage);
- bit_pos = find_next_bit_le(&inline_dentry->dentry_bitmap,
- NR_INLINE_DENTRY,
- bit_pos);
+ inline_dentry = inline_data_addr(dir, ipage);
+ make_dentry_ptr_inline(dir, &d, inline_dentry);
+
+ bit_pos = find_next_bit_le(d.bitmap, d.max, bit_pos);
f2fs_put_page(ipage, 1);
- if (bit_pos < NR_INLINE_DENTRY)
+ if (bit_pos < d.max)
return false;
return true;
@@ -609,25 +620,27 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
struct fscrypt_str *fstr)
{
struct inode *inode = file_inode(file);
- struct f2fs_inline_dentry *inline_dentry = NULL;
struct page *ipage = NULL;
struct f2fs_dentry_ptr d;
+ void *inline_dentry = NULL;
int err;
- if (ctx->pos == NR_INLINE_DENTRY)
+ make_dentry_ptr_inline(inode, &d, inline_dentry);
+
+ if (ctx->pos == d.max)
return 0;
ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
if (IS_ERR(ipage))
return PTR_ERR(ipage);
- inline_dentry = inline_data_addr(ipage);
+ inline_dentry = inline_data_addr(inode, ipage);
make_dentry_ptr_inline(inode, &d, inline_dentry);
err = f2fs_fill_dentries(ctx, &d, 0, fstr);
if (!err)
- ctx->pos = NR_INLINE_DENTRY;
+ ctx->pos = d.max;
f2fs_put_page(ipage, 1);
return err < 0 ? err : 0;
@@ -652,7 +665,7 @@ int f2fs_inline_data_fiemap(struct inode *inode,
goto out;
}
- ilen = min_t(size_t, MAX_INLINE_DATA, i_size_read(inode));
+ ilen = min_t(size_t, MAX_INLINE_DATA(inode), i_size_read(inode));
if (start >= ilen)
goto out;
if (start + len < ilen)
@@ -661,7 +674,8 @@ int f2fs_inline_data_fiemap(struct inode *inode,
get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni);
byteaddr = (__u64)ni.blk_addr << inode->i_sb->s_blocksize_bits;
- byteaddr += (char *)inline_data_addr(ipage) - (char *)F2FS_INODE(ipage);
+ byteaddr += (char *)inline_data_addr(inode, ipage) -
+ (char *)F2FS_INODE(ipage);
err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
out:
f2fs_put_page(ipage, 1);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 6cd312a17c69..50c88e37ed66 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -49,20 +49,22 @@ void f2fs_set_inode_flags(struct inode *inode)
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
+ int extra_size = get_extra_isize(inode);
+
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
- if (ri->i_addr[0])
- inode->i_rdev =
- old_decode_dev(le32_to_cpu(ri->i_addr[0]));
+ if (ri->i_addr[extra_size])
+ inode->i_rdev = old_decode_dev(
+ le32_to_cpu(ri->i_addr[extra_size]));
else
- inode->i_rdev =
- new_decode_dev(le32_to_cpu(ri->i_addr[1]));
+ inode->i_rdev = new_decode_dev(
+ le32_to_cpu(ri->i_addr[extra_size + 1]));
}
}
static bool __written_first_block(struct f2fs_inode *ri)
{
- block_t addr = le32_to_cpu(ri->i_addr[0]);
+ block_t addr = le32_to_cpu(ri->i_addr[offset_in_addr(ri)]);
if (addr != NEW_ADDR && addr != NULL_ADDR)
return true;
@@ -71,25 +73,27 @@ static bool __written_first_block(struct f2fs_inode *ri)
static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
+ int extra_size = get_extra_isize(inode);
+
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
if (old_valid_dev(inode->i_rdev)) {
- ri->i_addr[0] =
+ ri->i_addr[extra_size] =
cpu_to_le32(old_encode_dev(inode->i_rdev));
- ri->i_addr[1] = 0;
+ ri->i_addr[extra_size + 1] = 0;
} else {
- ri->i_addr[0] = 0;
- ri->i_addr[1] =
+ ri->i_addr[extra_size] = 0;
+ ri->i_addr[extra_size + 1] =
cpu_to_le32(new_encode_dev(inode->i_rdev));
- ri->i_addr[2] = 0;
+ ri->i_addr[extra_size + 2] = 0;
}
}
}
static void __recover_inline_status(struct inode *inode, struct page *ipage)
{
- void *inline_data = inline_data_addr(ipage);
+ void *inline_data = inline_data_addr(inode, ipage);
__le32 *start = inline_data;
- __le32 *end = start + MAX_INLINE_DATA / sizeof(__le32);
+ __le32 *end = start + MAX_INLINE_DATA(inode) / sizeof(__le32);
while (start < end) {
if (*start++) {
@@ -104,12 +108,84 @@ static void __recover_inline_status(struct inode *inode, struct page *ipage)
return;
}
+static bool f2fs_enable_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
+{
+ struct f2fs_inode *ri = &F2FS_NODE(page)->i;
+ int extra_isize = le32_to_cpu(ri->i_extra_isize);
+
+ if (!f2fs_sb_has_inode_chksum(sbi->sb))
+ return false;
+
+ if (!RAW_IS_INODE(F2FS_NODE(page)) || !(ri->i_inline & F2FS_EXTRA_ATTR))
+ return false;
+
+ if (!F2FS_FITS_IN_INODE(ri, extra_isize, i_inode_checksum))
+ return false;
+
+ return true;
+}
+
+static __u32 f2fs_inode_chksum(struct f2fs_sb_info *sbi, struct page *page)
+{
+ struct f2fs_node *node = F2FS_NODE(page);
+ struct f2fs_inode *ri = &node->i;
+ __le32 ino = node->footer.ino;
+ __le32 gen = ri->i_generation;
+ __u32 chksum, chksum_seed;
+ __u32 dummy_cs = 0;
+ unsigned int offset = offsetof(struct f2fs_inode, i_inode_checksum);
+ unsigned int cs_size = sizeof(dummy_cs);
+
+ chksum = f2fs_chksum(sbi, sbi->s_chksum_seed, (__u8 *)&ino,
+ sizeof(ino));
+ chksum_seed = f2fs_chksum(sbi, chksum, (__u8 *)&gen, sizeof(gen));
+
+ chksum = f2fs_chksum(sbi, chksum_seed, (__u8 *)ri, offset);
+ chksum = f2fs_chksum(sbi, chksum, (__u8 *)&dummy_cs, cs_size);
+ offset += cs_size;
+ chksum = f2fs_chksum(sbi, chksum, (__u8 *)ri + offset,
+ F2FS_BLKSIZE - offset);
+ return chksum;
+}
+
+bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page)
+{
+ struct f2fs_inode *ri;
+ __u32 provided, calculated;
+
+ if (!f2fs_enable_inode_chksum(sbi, page) ||
+ PageDirty(page) || PageWriteback(page))
+ return true;
+
+ ri = &F2FS_NODE(page)->i;
+ provided = le32_to_cpu(ri->i_inode_checksum);
+ calculated = f2fs_inode_chksum(sbi, page);
+
+ if (provided != calculated)
+ f2fs_msg(sbi->sb, KERN_WARNING,
+ "checksum invalid, ino = %x, %x vs. %x",
+ ino_of_node(page), provided, calculated);
+
+ return provided == calculated;
+}
+
+void f2fs_inode_chksum_set(struct f2fs_sb_info *sbi, struct page *page)
+{
+ struct f2fs_inode *ri = &F2FS_NODE(page)->i;
+
+ if (!f2fs_enable_inode_chksum(sbi, page))
+ return;
+
+ ri->i_inode_checksum = cpu_to_le32(f2fs_inode_chksum(sbi, page));
+}
+
static int do_read_inode(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct f2fs_inode_info *fi = F2FS_I(inode);
struct page *node_page;
struct f2fs_inode *ri;
+ projid_t i_projid;
/* Check if ino is within scope */
if (check_nid_range(sbi, inode->i_ino)) {
@@ -153,6 +229,9 @@ static int do_read_inode(struct inode *inode)
get_inline_info(inode, ri);
+ fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
+ le16_to_cpu(ri->i_extra_isize) : 0;
+
/* check data exist */
if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode))
__recover_inline_status(inode, node_page);
@@ -166,6 +245,16 @@ static int do_read_inode(struct inode *inode)
if (!need_inode_block_update(sbi, inode->i_ino))
fi->last_disk_size = inode->i_size;
+ if (fi->i_flags & FS_PROJINHERIT_FL)
+ set_inode_flag(inode, FI_PROJ_INHERIT);
+
+ if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi->sb) &&
+ F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_projid))
+ i_projid = (projid_t)le32_to_cpu(ri->i_projid);
+ else
+ i_projid = F2FS_DEF_PROJID;
+ fi->i_projid = make_kprojid(&init_user_ns, i_projid);
+
f2fs_put_page(node_page, 1);
stat_inc_inline_xattr(inode);
@@ -292,6 +381,20 @@ int update_inode(struct inode *inode, struct page *node_page)
ri->i_generation = cpu_to_le32(inode->i_generation);
ri->i_dir_level = F2FS_I(inode)->i_dir_level;
+ if (f2fs_has_extra_attr(inode)) {
+ ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
+
+ if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) &&
+ F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
+ i_projid)) {
+ projid_t i_projid;
+
+ i_projid = from_kprojid(&init_user_ns,
+ F2FS_I(inode)->i_projid);
+ ri->i_projid = cpu_to_le32(i_projid);
+ }
+ }
+
__set_inode_rdev(inode, ri);
set_cold_node(inode, node_page);
@@ -416,6 +519,9 @@ no_delete:
stat_dec_inline_dir(inode);
stat_dec_inline_inode(inode);
+ if (!is_set_ckpt_flags(sbi, CP_ERROR_FLAG))
+ f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
+
/* ino == 0, if f2fs_new_inode() was failed t*/
if (inode->i_ino)
invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino,
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 760d85223c81..a4dab98c4b7b 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -58,6 +58,13 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
goto fail;
}
+ if (f2fs_sb_has_project_quota(sbi->sb) &&
+ (F2FS_I(dir)->i_flags & FS_PROJINHERIT_FL))
+ F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
+ else
+ F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns,
+ F2FS_DEF_PROJID);
+
err = dquot_initialize(inode);
if (err)
goto fail_drop;
@@ -72,6 +79,11 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
set_inode_flag(inode, FI_NEW_INODE);
+ if (f2fs_sb_has_extra_attr(sbi->sb)) {
+ set_inode_flag(inode, FI_EXTRA_ATTR);
+ F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
+ }
+
if (test_opt(sbi, INLINE_XATTR))
set_inode_flag(inode, FI_INLINE_XATTR);
if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
@@ -85,6 +97,15 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
stat_inc_inline_inode(inode);
stat_inc_inline_dir(inode);
+ F2FS_I(inode)->i_flags =
+ f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);
+
+ if (S_ISDIR(inode->i_mode))
+ F2FS_I(inode)->i_flags |= FS_INDEX_FL;
+
+ if (F2FS_I(inode)->i_flags & FS_PROJINHERIT_FL)
+ set_inode_flag(inode, FI_PROJ_INHERIT);
+
trace_f2fs_new_inode(inode, 0);
return inode;
@@ -204,6 +225,11 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
!fscrypt_has_permitted_context(dir, inode))
return -EPERM;
+ if (is_inode_flag_set(dir, FI_PROJ_INHERIT) &&
+ (!projid_eq(F2FS_I(dir)->i_projid,
+ F2FS_I(old_dentry->d_inode)->i_projid)))
+ return -EXDEV;
+
err = dquot_initialize(dir);
if (err)
return err;
@@ -261,6 +287,10 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino)
return 0;
}
+ err = dquot_initialize(dir);
+ if (err)
+ return err;
+
f2fs_balance_fs(sbi, true);
f2fs_lock_op(sbi);
@@ -724,6 +754,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
goto out;
}
+ if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
+ (!projid_eq(F2FS_I(new_dir)->i_projid,
+ F2FS_I(old_dentry->d_inode)->i_projid)))
+ return -EXDEV;
+
err = dquot_initialize(old_dir);
if (err)
goto out;
@@ -912,6 +947,14 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
!fscrypt_has_permitted_context(old_dir, new_inode)))
return -EPERM;
+ if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
+ !projid_eq(F2FS_I(new_dir)->i_projid,
+ F2FS_I(old_dentry->d_inode)->i_projid)) ||
+ (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
+ !projid_eq(F2FS_I(old_dir)->i_projid,
+ F2FS_I(new_dentry->d_inode)->i_projid)))
+ return -EXDEV;
+
err = dquot_initialize(old_dir);
if (err)
goto out;
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index d53fe620939e..fca87835a1da 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -19,6 +19,7 @@
#include "f2fs.h"
#include "node.h"
#include "segment.h"
+#include "xattr.h"
#include "trace.h"
#include <trace/events/f2fs.h>
@@ -554,7 +555,7 @@ static int get_node_path(struct inode *inode, long block,
level = 3;
goto got;
} else {
- BUG();
+ return -E2BIG;
}
got:
return level;
@@ -578,6 +579,8 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
int err = 0;
level = get_node_path(dn->inode, index, offset, noffset);
+ if (level < 0)
+ return level;
nids[0] = dn->inode->i_ino;
npage[0] = dn->inode_page;
@@ -613,7 +616,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
}
dn->nid = nids[i];
- npage[i] = new_node_page(dn, noffset[i], NULL);
+ npage[i] = new_node_page(dn, noffset[i]);
if (IS_ERR(npage[i])) {
alloc_nid_failed(sbi, nids[i]);
err = PTR_ERR(npage[i]);
@@ -654,7 +657,8 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
dn->nid = nids[level];
dn->ofs_in_node = offset[level];
dn->node_page = npage[level];
- dn->data_blkaddr = datablock_addr(dn->node_page, dn->ofs_in_node);
+ dn->data_blkaddr = datablock_addr(dn->inode,
+ dn->node_page, dn->ofs_in_node);
return 0;
release_pages:
@@ -876,6 +880,8 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from)
trace_f2fs_truncate_inode_blocks_enter(inode, from);
level = get_node_path(inode, from, offset, noffset);
+ if (level < 0)
+ return level;
page = get_node_page(sbi, inode->i_ino);
if (IS_ERR(page)) {
@@ -1022,11 +1028,10 @@ struct page *new_inode_page(struct inode *inode)
set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
/* caller should f2fs_put_page(page, 1); */
- return new_node_page(&dn, 0, NULL);
+ return new_node_page(&dn, 0);
}
-struct page *new_node_page(struct dnode_of_data *dn,
- unsigned int ofs, struct page *ipage)
+struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct node_info new_ni;
@@ -1170,6 +1175,11 @@ repeat:
err = -EIO;
goto out_err;
}
+
+ if (!f2fs_inode_chksum_verify(sbi, page)) {
+ err = -EBADMSG;
+ goto out_err;
+ }
page_hit:
if(unlikely(nid != nid_of_node(page))) {
f2fs_msg(sbi->sb, KERN_WARNING, "inconsistent node block, "
@@ -1177,9 +1187,9 @@ page_hit:
nid, nid_of_node(page), ino_of_node(page),
ofs_of_node(page), cpver_of_node(page),
next_blkaddr_of_node(page));
- ClearPageUptodate(page);
err = -EINVAL;
out_err:
+ ClearPageUptodate(page);
f2fs_put_page(page, 1);
return ERR_PTR(err);
}
@@ -1326,7 +1336,8 @@ continue_unlock:
}
static int __write_node_page(struct page *page, bool atomic, bool *submitted,
- struct writeback_control *wbc)
+ struct writeback_control *wbc, bool do_balance,
+ enum iostat_type io_type)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
nid_t nid;
@@ -1339,6 +1350,7 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
.page = page,
.encrypted_page = NULL,
.submitted = false,
+ .io_type = io_type,
};
trace_f2fs_writepage(page, NODE);
@@ -1395,6 +1407,8 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
if (submitted)
*submitted = fio.submitted;
+ if (do_balance)
+ f2fs_balance_fs(sbi, false);
return 0;
redirty_out:
@@ -1405,7 +1419,7 @@ redirty_out:
static int f2fs_write_node_page(struct page *page,
struct writeback_control *wbc)
{
- return __write_node_page(page, false, NULL, wbc);
+ return __write_node_page(page, false, NULL, wbc, false, FS_NODE_IO);
}
int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
@@ -1493,7 +1507,8 @@ continue_unlock:
ret = __write_node_page(page, atomic &&
page == last_page,
- &submitted, wbc);
+ &submitted, wbc, true,
+ FS_NODE_IO);
if (ret) {
unlock_page(page);
f2fs_put_page(last_page, 0);
@@ -1530,7 +1545,8 @@ out:
return ret ? -EIO: 0;
}
-int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
+int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc,
+ bool do_balance, enum iostat_type io_type)
{
pgoff_t index, end;
struct pagevec pvec;
@@ -1608,7 +1624,8 @@ continue_unlock:
set_fsync_mark(page, 0);
set_dentry_mark(page, 0);
- ret = __write_node_page(page, false, &submitted, wbc);
+ ret = __write_node_page(page, false, &submitted,
+ wbc, do_balance, io_type);
if (ret)
unlock_page(page);
else if (submitted)
@@ -1697,7 +1714,7 @@ static int f2fs_write_node_pages(struct address_space *mapping,
diff = nr_pages_to_write(sbi, NODE, wbc);
wbc->sync_mode = WB_SYNC_NONE;
blk_start_plug(&plug);
- sync_node_pages(sbi, wbc);
+ sync_node_pages(sbi, wbc, true, FS_NODE_IO);
blk_finish_plug(&plug);
wbc->nr_to_write = max((long)0, wbc->nr_to_write - diff);
return 0;
@@ -2191,7 +2208,8 @@ int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid;
- nid_t new_xnid = nid_of_node(page);
+ nid_t new_xnid;
+ struct dnode_of_data dn;
struct node_info ni;
struct page *xpage;
@@ -2207,22 +2225,22 @@ int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
recover_xnid:
/* 2: update xattr nid in inode */
- remove_free_nid(sbi, new_xnid);
- f2fs_i_xnid_write(inode, new_xnid);
- if (unlikely(inc_valid_node_count(sbi, inode, false)))
- f2fs_bug_on(sbi, 1);
+ if (!alloc_nid(sbi, &new_xnid))
+ return -ENOSPC;
+
+ set_new_dnode(&dn, inode, NULL, NULL, new_xnid);
+ xpage = new_node_page(&dn, XATTR_NODE_OFFSET);
+ if (IS_ERR(xpage)) {
+ alloc_nid_failed(sbi, new_xnid);
+ return PTR_ERR(xpage);
+ }
+
+ alloc_nid_done(sbi, new_xnid);
update_inode_page(inode);
/* 3: update and set xattr node page dirty */
- xpage = grab_cache_page(NODE_MAPPING(sbi), new_xnid);
- if (!xpage)
- return -ENOMEM;
-
- memcpy(F2FS_NODE(xpage), F2FS_NODE(page), PAGE_SIZE);
+ memcpy(F2FS_NODE(xpage), F2FS_NODE(page), VALID_XATTR_BLOCK_SIZE);
- get_node_info(sbi, new_xnid, &ni);
- ni.ino = inode->i_ino;
- set_node_addr(sbi, &ni, NEW_ADDR, false);
set_page_dirty(xpage);
f2fs_put_page(xpage, 1);
@@ -2262,7 +2280,14 @@ retry:
dst->i_blocks = cpu_to_le64(1);
dst->i_links = cpu_to_le32(1);
dst->i_xattr_nid = 0;
- dst->i_inline = src->i_inline & F2FS_INLINE_XATTR;
+ dst->i_inline = src->i_inline & (F2FS_INLINE_XATTR | F2FS_EXTRA_ATTR);
+ if (dst->i_inline & F2FS_EXTRA_ATTR) {
+ dst->i_extra_isize = src->i_extra_isize;
+ if (f2fs_sb_has_project_quota(sbi->sb) &&
+ F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
+ i_projid))
+ dst->i_projid = src->i_projid;
+ }
new_ni = old_ni;
new_ni.ino = ino;
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index 907d6b7dde6a..9626758bc762 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -69,20 +69,34 @@ static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,
}
static struct fsync_inode_entry *add_fsync_inode(struct f2fs_sb_info *sbi,
- struct list_head *head, nid_t ino)
+ struct list_head *head, nid_t ino, bool quota_inode)
{
struct inode *inode;
struct fsync_inode_entry *entry;
+ int err;
inode = f2fs_iget_retry(sbi->sb, ino);
if (IS_ERR(inode))
return ERR_CAST(inode);
+ err = dquot_initialize(inode);
+ if (err)
+ goto err_out;
+
+ if (quota_inode) {
+ err = dquot_alloc_inode(inode);
+ if (err)
+ goto err_out;
+ }
+
entry = f2fs_kmem_cache_alloc(fsync_entry_slab, GFP_F2FS_ZERO);
entry->inode = inode;
list_add_tail(&entry->list, head);
return entry;
+err_out:
+ iput(inode);
+ return ERR_PTR(err);
}
static void del_fsync_inode(struct fsync_inode_entry *entry)
@@ -107,7 +121,8 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
entry = get_fsync_inode(dir_list, pino);
if (!entry) {
- entry = add_fsync_inode(F2FS_I_SB(inode), dir_list, pino);
+ entry = add_fsync_inode(F2FS_I_SB(inode), dir_list,
+ pino, false);
if (IS_ERR(entry)) {
dir = ERR_CAST(entry);
err = PTR_ERR(entry);
@@ -140,6 +155,13 @@ retry:
err = -EEXIST;
goto out_unmap_put;
}
+
+ err = dquot_initialize(einode);
+ if (err) {
+ iput(einode);
+ goto out_unmap_put;
+ }
+
err = acquire_orphan_inode(F2FS_I_SB(inode));
if (err) {
iput(einode);
@@ -226,18 +248,22 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head,
entry = get_fsync_inode(head, ino_of_node(page));
if (!entry) {
+ bool quota_inode = false;
+
if (!check_only &&
IS_INODE(page) && is_dent_dnode(page)) {
err = recover_inode_page(sbi, page);
if (err)
break;
+ quota_inode = true;
}
/*
* CP | dnode(F) | inode(DF)
* For this case, we should not give up now.
*/
- entry = add_fsync_inode(sbi, head, ino_of_node(page));
+ entry = add_fsync_inode(sbi, head, ino_of_node(page),
+ quota_inode);
if (IS_ERR(entry)) {
err = PTR_ERR(entry);
if (err == -ENOENT) {
@@ -291,7 +317,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
return 0;
/* Get the previous summary */
- for (i = CURSEG_WARM_DATA; i <= CURSEG_COLD_DATA; i++) {
+ for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
struct curseg_info *curseg = CURSEG_I(sbi, i);
if (curseg->segno == segno) {
sum = curseg->sum_blk->entries[blkoff];
@@ -328,10 +354,18 @@ got_it:
f2fs_put_page(node_page, 1);
if (ino != dn->inode->i_ino) {
+ int ret;
+
/* Deallocate previous index in the node page */
inode = f2fs_iget_retry(sbi->sb, ino);
if (IS_ERR(inode))
return PTR_ERR(inode);
+
+ ret = dquot_initialize(inode);
+ if (ret) {
+ iput(inode);
+ return ret;
+ }
} else {
inode = dn->inode;
}
@@ -361,7 +395,8 @@ out:
return 0;
truncate_out:
- if (datablock_addr(tdn.node_page, tdn.ofs_in_node) == blkaddr)
+ if (datablock_addr(tdn.inode, tdn.node_page,
+ tdn.ofs_in_node) == blkaddr)
truncate_data_blocks_range(&tdn, 1);
if (dn->inode->i_ino == nid && !dn->inode_page_locked)
unlock_page(dn->inode_page);
@@ -414,8 +449,8 @@ retry_dn:
for (; start < end; start++, dn.ofs_in_node++) {
block_t src, dest;
- src = datablock_addr(dn.node_page, dn.ofs_in_node);
- dest = datablock_addr(page, dn.ofs_in_node);
+ src = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);
+ dest = datablock_addr(dn.inode, page, dn.ofs_in_node);
/* skip recovering if dest is the same as src */
if (src == dest)
@@ -557,12 +592,27 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
struct list_head dir_list;
int err;
int ret = 0;
+ unsigned long s_flags = sbi->sb->s_flags;
bool need_writecp = false;
+ if (s_flags & MS_RDONLY) {
+ f2fs_msg(sbi->sb, KERN_INFO, "orphan cleanup on readonly fs");
+ sbi->sb->s_flags &= ~MS_RDONLY;
+ }
+
+#ifdef CONFIG_QUOTA
+ /* Needed for iput() to work correctly and not trash data */
+ sbi->sb->s_flags |= MS_ACTIVE;
+ /* Turn on quotas so that they are updated correctly */
+ f2fs_enable_quota_files(sbi);
+#endif
+
fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry",
sizeof(struct fsync_inode_entry));
- if (!fsync_entry_slab)
- return -ENOMEM;
+ if (!fsync_entry_slab) {
+ err = -ENOMEM;
+ goto out;
+ }
INIT_LIST_HEAD(&inode_list);
INIT_LIST_HEAD(&dir_list);
@@ -573,11 +623,11 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
/* step #1: find fsynced inode numbers */
err = find_fsync_dnodes(sbi, &inode_list, check_only);
if (err || list_empty(&inode_list))
- goto out;
+ goto skip;
if (check_only) {
ret = 1;
- goto out;
+ goto skip;
}
need_writecp = true;
@@ -586,7 +636,7 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
err = recover_data(sbi, &inode_list, &dir_list);
if (!err)
f2fs_bug_on(sbi, !list_empty(&inode_list));
-out:
+skip:
destroy_fsync_dnodes(&inode_list);
/* truncate meta pages to be used by the recovery */
@@ -599,8 +649,6 @@ out:
}
clear_sbi_flag(sbi, SBI_POR_DOING);
- if (err)
- set_ckpt_flags(sbi, CP_ERROR_FLAG);
mutex_unlock(&sbi->cp_mutex);
/* let's drop all the directory inodes for clean checkpoint */
@@ -614,5 +662,12 @@ out:
}
kmem_cache_destroy(fsync_entry_slab);
+out:
+#ifdef CONFIG_QUOTA
+ /* Turn quotas off */
+ f2fs_quota_off_umount(sbi->sb);
+#endif
+ sbi->sb->s_flags = s_flags; /* Restore MS_RDONLY status */
+
return ret ? ret: err;
}
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 6f8fc4a6e701..621b9b3d320b 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -17,10 +17,12 @@
#include <linux/swap.h>
#include <linux/timer.h>
#include <linux/freezer.h>
+#include <linux/sched/signal.h>
#include "f2fs.h"
#include "segment.h"
#include "node.h"
+#include "gc.h"
#include "trace.h"
#include <trace/events/f2fs.h>
@@ -167,6 +169,21 @@ found:
return result - size + __reverse_ffz(tmp);
}
+bool need_SSR(struct f2fs_sb_info *sbi)
+{
+ int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
+ int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
+ int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
+
+ if (test_opt(sbi, LFS))
+ return false;
+ if (sbi->gc_thread && sbi->gc_thread->gc_urgent)
+ return true;
+
+ return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs +
+ 2 * reserved_sections(sbi));
+}
+
void register_inmem_page(struct inode *inode, struct page *page)
{
struct f2fs_inode_info *fi = F2FS_I(inode);
@@ -213,9 +230,15 @@ static int __revoke_inmem_pages(struct inode *inode,
struct node_info ni;
trace_f2fs_commit_inmem_page(page, INMEM_REVOKE);
-
+retry:
set_new_dnode(&dn, inode, NULL, NULL, 0);
- if (get_dnode_of_data(&dn, page->index, LOOKUP_NODE)) {
+ err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
+ if (err) {
+ if (err == -ENOMEM) {
+ congestion_wait(BLK_RW_ASYNC, HZ/50);
+ cond_resched();
+ goto retry;
+ }
err = -EAGAIN;
goto next;
}
@@ -248,6 +271,7 @@ void drop_inmem_pages(struct inode *inode)
mutex_unlock(&fi->inmem_lock);
clear_inode_flag(inode, FI_ATOMIC_FILE);
+ clear_inode_flag(inode, FI_HOT_DATA);
stat_dec_atomic_write(inode);
}
@@ -292,6 +316,7 @@ static int __commit_inmem_pages(struct inode *inode,
.type = DATA,
.op = REQ_OP_WRITE,
.op_flags = REQ_SYNC | REQ_PRIO,
+ .io_type = FS_DATA_IO,
};
pgoff_t last_idx = ULONG_MAX;
int err = 0;
@@ -309,17 +334,21 @@ static int __commit_inmem_pages(struct inode *inode,
inode_dec_dirty_pages(inode);
remove_dirty_inode(inode);
}
-
+retry:
fio.page = page;
fio.old_blkaddr = NULL_ADDR;
fio.encrypted_page = NULL;
fio.need_lock = LOCK_DONE;
err = do_write_data_page(&fio);
if (err) {
+ if (err == -ENOMEM) {
+ congestion_wait(BLK_RW_ASYNC, HZ/50);
+ cond_resched();
+ goto retry;
+ }
unlock_page(page);
break;
}
-
/* record old blkaddr for revoking */
cur->old_addr = fio.old_blkaddr;
last_idx = page->index;
@@ -481,6 +510,8 @@ repeat:
if (kthread_should_stop())
return 0;
+ sb_start_intwrite(sbi->sb);
+
if (!llist_empty(&fcc->issue_list)) {
struct flush_cmd *cmd, *next;
int ret;
@@ -499,6 +530,8 @@ repeat:
fcc->dispatch_list = NULL;
}
+ sb_end_intwrite(sbi->sb);
+
wait_event_interruptible(*q,
kthread_should_stop() || !llist_empty(&fcc->issue_list));
goto repeat;
@@ -519,8 +552,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi)
return ret;
}
- if (!atomic_read(&fcc->issing_flush)) {
- atomic_inc(&fcc->issing_flush);
+ if (atomic_inc_return(&fcc->issing_flush) == 1) {
ret = submit_flush_wait(sbi);
atomic_dec(&fcc->issing_flush);
@@ -530,18 +562,39 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi)
init_completion(&cmd.wait);
- atomic_inc(&fcc->issing_flush);
llist_add(&cmd.llnode, &fcc->issue_list);
- if (!fcc->dispatch_list)
+ /* update issue_list before we wake up issue_flush thread */
+ smp_mb();
+
+ if (waitqueue_active(&fcc->flush_wait_queue))
wake_up(&fcc->flush_wait_queue);
if (fcc->f2fs_issue_flush) {
wait_for_completion(&cmd.wait);
atomic_dec(&fcc->issing_flush);
} else {
- llist_del_all(&fcc->issue_list);
- atomic_set(&fcc->issing_flush, 0);
+ struct llist_node *list;
+
+ list = llist_del_all(&fcc->issue_list);
+ if (!list) {
+ wait_for_completion(&cmd.wait);
+ atomic_dec(&fcc->issing_flush);
+ } else {
+ struct flush_cmd *tmp, *next;
+
+ ret = submit_flush_wait(sbi);
+
+ llist_for_each_entry_safe(tmp, next, list, llnode) {
+ if (tmp == &cmd) {
+ cmd.ret = ret;
+ atomic_dec(&fcc->issing_flush);
+ continue;
+ }
+ tmp->ret = ret;
+ complete(&tmp->wait);
+ }
+ }
}
return cmd.ret;
@@ -778,11 +831,14 @@ void __check_sit_bitmap(struct f2fs_sb_info *sbi,
sentry = get_seg_entry(sbi, segno);
offset = GET_BLKOFF_FROM_SEG0(sbi, blk);
- size = min((unsigned long)(end - blk), max_blocks);
+ if (end < START_BLOCK(sbi, segno + 1))
+ size = GET_BLKOFF_FROM_SEG0(sbi, end);
+ else
+ size = max_blocks;
map = (unsigned long *)(sentry->cur_valid_map);
offset = __find_rev_next_bit(map, size, offset);
f2fs_bug_on(sbi, offset != size);
- blk += size;
+ blk = START_BLOCK(sbi, segno + 1);
}
#endif
}
@@ -815,6 +871,8 @@ static void __submit_discard_cmd(struct f2fs_sb_info *sbi,
submit_bio(bio);
list_move_tail(&dc->list, &dcc->wait_list);
__check_sit_bitmap(sbi, dc->start, dc->start + dc->len);
+
+ f2fs_update_iostat(sbi, FS_DISCARD, 1);
}
} else {
__remove_discard_cmd(sbi, dc);
@@ -996,32 +1054,81 @@ static int __queue_discard_cmd(struct f2fs_sb_info *sbi,
return 0;
}
-static void __issue_discard_cmd(struct f2fs_sb_info *sbi, bool issue_cond)
+static int __issue_discard_cmd(struct f2fs_sb_info *sbi, bool issue_cond)
{
struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
struct list_head *pend_list;
struct discard_cmd *dc, *tmp;
struct blk_plug plug;
- int i, iter = 0;
+ int iter = 0, issued = 0;
+ int i;
+ bool io_interrupted = false;
mutex_lock(&dcc->cmd_lock);
f2fs_bug_on(sbi,
!__check_rb_tree_consistence(sbi, &dcc->root));
blk_start_plug(&plug);
- for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
+ for (i = MAX_PLIST_NUM - 1;
+ i >= 0 && plist_issue(dcc->pend_list_tag[i]); i--) {
pend_list = &dcc->pend_list[i];
list_for_each_entry_safe(dc, tmp, pend_list, list) {
f2fs_bug_on(sbi, dc->state != D_PREP);
- if (!issue_cond || is_idle(sbi))
+ /* Hurry up to finish fstrim */
+ if (dcc->pend_list_tag[i] & P_TRIM) {
+ __submit_discard_cmd(sbi, dc);
+ issued++;
+
+ if (fatal_signal_pending(current))
+ break;
+ continue;
+ }
+
+ if (!issue_cond) {
__submit_discard_cmd(sbi, dc);
- if (issue_cond && iter++ > DISCARD_ISSUE_RATE)
+ issued++;
+ continue;
+ }
+
+ if (is_idle(sbi)) {
+ __submit_discard_cmd(sbi, dc);
+ issued++;
+ } else {
+ io_interrupted = true;
+ }
+
+ if (++iter >= DISCARD_ISSUE_RATE)
goto out;
}
+ if (list_empty(pend_list) && dcc->pend_list_tag[i] & P_TRIM)
+ dcc->pend_list_tag[i] &= (~P_TRIM);
}
out:
blk_finish_plug(&plug);
mutex_unlock(&dcc->cmd_lock);
+
+ if (!issued && io_interrupted)
+ issued = -1;
+
+ return issued;
+}
+
+static void __drop_discard_cmd(struct f2fs_sb_info *sbi)
+{
+ struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+ struct list_head *pend_list;
+ struct discard_cmd *dc, *tmp;
+ int i;
+
+ mutex_lock(&dcc->cmd_lock);
+ for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
+ pend_list = &dcc->pend_list[i];
+ list_for_each_entry_safe(dc, tmp, pend_list, list) {
+ f2fs_bug_on(sbi, dc->state != D_PREP);
+ __remove_discard_cmd(sbi, dc);
+ }
+ }
+ mutex_unlock(&dcc->cmd_lock);
}
static void __wait_one_discard_bio(struct f2fs_sb_info *sbi,
@@ -1102,34 +1209,63 @@ void stop_discard_thread(struct f2fs_sb_info *sbi)
}
}
-/* This comes from f2fs_put_super */
+/* This comes from f2fs_put_super and f2fs_trim_fs */
void f2fs_wait_discard_bios(struct f2fs_sb_info *sbi)
{
__issue_discard_cmd(sbi, false);
+ __drop_discard_cmd(sbi);
__wait_discard_cmd(sbi, false);
}
+static void mark_discard_range_all(struct f2fs_sb_info *sbi)
+{
+ struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+ int i;
+
+ mutex_lock(&dcc->cmd_lock);
+ for (i = 0; i < MAX_PLIST_NUM; i++)
+ dcc->pend_list_tag[i] |= P_TRIM;
+ mutex_unlock(&dcc->cmd_lock);
+}
+
static int issue_discard_thread(void *data)
{
struct f2fs_sb_info *sbi = data;
struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
wait_queue_head_t *q = &dcc->discard_wait_queue;
+ unsigned int wait_ms = DEF_MIN_DISCARD_ISSUE_TIME;
+ int issued;
set_freezable();
do {
- wait_event_interruptible(*q, kthread_should_stop() ||
- freezing(current) ||
- atomic_read(&dcc->discard_cmd_cnt));
+ wait_event_interruptible_timeout(*q,
+ kthread_should_stop() || freezing(current) ||
+ dcc->discard_wake,
+ msecs_to_jiffies(wait_ms));
if (try_to_freeze())
continue;
if (kthread_should_stop())
return 0;
- __issue_discard_cmd(sbi, true);
- __wait_discard_cmd(sbi, true);
+ if (dcc->discard_wake) {
+ dcc->discard_wake = 0;
+ if (sbi->gc_thread && sbi->gc_thread->gc_urgent)
+ mark_discard_range_all(sbi);
+ }
+
+ sb_start_intwrite(sbi->sb);
+
+ issued = __issue_discard_cmd(sbi, true);
+ if (issued) {
+ __wait_discard_cmd(sbi, true);
+ wait_ms = DEF_MIN_DISCARD_ISSUE_TIME;
+ } else {
+ wait_ms = DEF_MAX_DISCARD_ISSUE_TIME;
+ }
+
+ sb_end_intwrite(sbi->sb);
- congestion_wait(BLK_RW_SYNC, HZ/50);
} while (!kthread_should_stop());
return 0;
}
@@ -1320,7 +1456,8 @@ static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc)
{
- struct list_head *head = &(SM_I(sbi)->dcc_info->entry_list);
+ struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+ struct list_head *head = &dcc->entry_list;
struct discard_entry *entry, *this;
struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
unsigned long *prefree_map = dirty_i->dirty_segmap[PRE];
@@ -1402,11 +1539,11 @@ skip:
goto find_next;
list_del(&entry->list);
- SM_I(sbi)->dcc_info->nr_discards -= total_len;
+ dcc->nr_discards -= total_len;
kmem_cache_free(discard_entry_slab, entry);
}
- wake_up(&SM_I(sbi)->dcc_info->discard_wait_queue);
+ wake_up_discard_thread(sbi, false);
}
static int create_discard_cmd_control(struct f2fs_sb_info *sbi)
@@ -1424,9 +1561,13 @@ static int create_discard_cmd_control(struct f2fs_sb_info *sbi)
if (!dcc)
return -ENOMEM;
+ dcc->discard_granularity = DEFAULT_DISCARD_GRANULARITY;
INIT_LIST_HEAD(&dcc->entry_list);
- for (i = 0; i < MAX_PLIST_NUM; i++)
+ for (i = 0; i < MAX_PLIST_NUM; i++) {
INIT_LIST_HEAD(&dcc->pend_list[i]);
+ if (i >= dcc->discard_granularity - 1)
+ dcc->pend_list_tag[i] |= P_ACTIVE;
+ }
INIT_LIST_HEAD(&dcc->wait_list);
mutex_init(&dcc->cmd_lock);
atomic_set(&dcc->issued_discard, 0);
@@ -1491,6 +1632,10 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
struct seg_entry *se;
unsigned int segno, offset;
long int new_vblocks;
+ bool exist;
+#ifdef CONFIG_F2FS_CHECK_FS
+ bool mir_exist;
+#endif
segno = GET_SEGNO(sbi, blkaddr);
@@ -1507,17 +1652,25 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
/* Update valid block bitmap */
if (del > 0) {
- if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) {
+ exist = f2fs_test_and_set_bit(offset, se->cur_valid_map);
#ifdef CONFIG_F2FS_CHECK_FS
- if (f2fs_test_and_set_bit(offset,
- se->cur_valid_map_mir))
- f2fs_bug_on(sbi, 1);
- else
- WARN_ON(1);
-#else
+ mir_exist = f2fs_test_and_set_bit(offset,
+ se->cur_valid_map_mir);
+ if (unlikely(exist != mir_exist)) {
+ f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
+ "when setting bitmap, blk:%u, old bit:%d",
+ blkaddr, exist);
f2fs_bug_on(sbi, 1);
+ }
#endif
+ if (unlikely(exist)) {
+ f2fs_msg(sbi->sb, KERN_ERR,
+ "Bitmap was wrongly set, blk:%u", blkaddr);
+ f2fs_bug_on(sbi, 1);
+ se->valid_blocks--;
+ del = 0;
}
+
if (f2fs_discard_en(sbi) &&
!f2fs_test_and_set_bit(offset, se->discard_map))
sbi->discard_blks--;
@@ -1528,17 +1681,25 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
se->ckpt_valid_blocks++;
}
} else {
- if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) {
+ exist = f2fs_test_and_clear_bit(offset, se->cur_valid_map);
#ifdef CONFIG_F2FS_CHECK_FS
- if (!f2fs_test_and_clear_bit(offset,
- se->cur_valid_map_mir))
- f2fs_bug_on(sbi, 1);
- else
- WARN_ON(1);
-#else
+ mir_exist = f2fs_test_and_clear_bit(offset,
+ se->cur_valid_map_mir);
+ if (unlikely(exist != mir_exist)) {
+ f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
+ "when clearing bitmap, blk:%u, old bit:%d",
+ blkaddr, exist);
f2fs_bug_on(sbi, 1);
+ }
#endif
+ if (unlikely(!exist)) {
+ f2fs_msg(sbi->sb, KERN_ERR,
+ "Bitmap was wrongly cleared, blk:%u", blkaddr);
+ f2fs_bug_on(sbi, 1);
+ se->valid_blocks++;
+ del = 0;
}
+
if (f2fs_discard_en(sbi) &&
f2fs_test_and_clear_bit(offset, se->discard_map))
sbi->discard_blks++;
@@ -1900,7 +2061,7 @@ static void __refresh_next_blkoff(struct f2fs_sb_info *sbi,
* This function always allocates a used segment(from dirty seglist) by SSR
* manner, so it should recover the existing segment information of valid blocks
*/
-static void change_curseg(struct f2fs_sb_info *sbi, int type, bool reuse)
+static void change_curseg(struct f2fs_sb_info *sbi, int type)
{
struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
struct curseg_info *curseg = CURSEG_I(sbi, type);
@@ -1921,12 +2082,10 @@ static void change_curseg(struct f2fs_sb_info *sbi, int type, bool reuse)
curseg->alloc_type = SSR;
__next_free_blkoff(sbi, curseg, 0);
- if (reuse) {
- sum_page = get_sum_page(sbi, new_segno);
- sum_node = (struct f2fs_summary_block *)page_address(sum_page);
- memcpy(curseg->sum_blk, sum_node, SUM_ENTRY_SIZE);
- f2fs_put_page(sum_page, 1);
- }
+ sum_page = get_sum_page(sbi, new_segno);
+ sum_node = (struct f2fs_summary_block *)page_address(sum_page);
+ memcpy(curseg->sum_blk, sum_node, SUM_ENTRY_SIZE);
+ f2fs_put_page(sum_page, 1);
}
static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
@@ -1990,7 +2149,7 @@ static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type))
new_curseg(sbi, type, false);
else if (need_SSR(sbi) && get_ssr_segment(sbi, type))
- change_curseg(sbi, type, true);
+ change_curseg(sbi, type);
else
new_curseg(sbi, type, false);
@@ -2083,6 +2242,9 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range)
schedule();
}
+ /* It's time to issue all the filed discards */
+ mark_discard_range_all(sbi);
+ f2fs_wait_discard_bios(sbi);
out:
range->len = F2FS_BLK_TO_BYTES(cpc.trimmed);
return err;
@@ -2202,9 +2364,12 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
mutex_unlock(&sit_i->sentry_lock);
- if (page && IS_NODESEG(type))
+ if (page && IS_NODESEG(type)) {
fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg));
+ f2fs_inode_chksum_set(sbi, page);
+ }
+
if (add_list) {
struct f2fs_bio_info *io;
@@ -2236,7 +2401,8 @@ reallocate:
}
}
-void write_meta_page(struct f2fs_sb_info *sbi, struct page *page)
+void write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
+ enum iostat_type io_type)
{
struct f2fs_io_info fio = {
.sbi = sbi,
@@ -2255,6 +2421,8 @@ void write_meta_page(struct f2fs_sb_info *sbi, struct page *page)
set_page_writeback(page);
f2fs_submit_page_write(&fio);
+
+ f2fs_update_iostat(sbi, io_type, F2FS_BLKSIZE);
}
void write_node_page(unsigned int nid, struct f2fs_io_info *fio)
@@ -2263,6 +2431,8 @@ void write_node_page(unsigned int nid, struct f2fs_io_info *fio)
set_summary(&sum, nid, 0, 0);
do_write_page(&sum, fio);
+
+ f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
}
void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio)
@@ -2276,13 +2446,22 @@ void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio)
set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
do_write_page(&sum, fio);
f2fs_update_data_blkaddr(dn, fio->new_blkaddr);
+
+ f2fs_update_iostat(sbi, fio->io_type, F2FS_BLKSIZE);
}
int rewrite_data_page(struct f2fs_io_info *fio)
{
+ int err;
+
fio->new_blkaddr = fio->old_blkaddr;
stat_inc_inplace_blocks(fio->sbi);
- return f2fs_submit_page_bio(fio);
+
+ err = f2fs_submit_page_bio(fio);
+
+ f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
+
+ return err;
}
void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
@@ -2324,7 +2503,7 @@ void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
/* change the current segment */
if (segno != curseg->segno) {
curseg->next_segno = segno;
- change_curseg(sbi, type, true);
+ change_curseg(sbi, type);
}
curseg->next_blkoff = GET_BLKOFF_FROM_SEG0(sbi, new_blkaddr);
@@ -2343,7 +2522,7 @@ void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
if (recover_curseg) {
if (old_cursegno != curseg->segno) {
curseg->next_segno = old_cursegno;
- change_curseg(sbi, type, true);
+ change_curseg(sbi, type);
}
curseg->next_blkoff = old_blkoff;
}
@@ -2382,8 +2561,7 @@ void f2fs_wait_on_page_writeback(struct page *page,
}
}
-void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *sbi,
- block_t blkaddr)
+void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr)
{
struct page *cpage;
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index 6b871b492fd5..e0a6cc23ace3 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -492,29 +492,11 @@ static inline int overprovision_segments(struct f2fs_sb_info *sbi)
return SM_I(sbi)->ovp_segments;
}
-static inline int overprovision_sections(struct f2fs_sb_info *sbi)
-{
- return GET_SEC_FROM_SEG(sbi, (unsigned int)overprovision_segments(sbi));
-}
-
static inline int reserved_sections(struct f2fs_sb_info *sbi)
{
return GET_SEC_FROM_SEG(sbi, (unsigned int)reserved_segments(sbi));
}
-static inline bool need_SSR(struct f2fs_sb_info *sbi)
-{
- int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
- int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
- int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
-
- if (test_opt(sbi, LFS))
- return false;
-
- return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs +
- 2 * reserved_sections(sbi));
-}
-
static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi,
int freed, int needed)
{
@@ -577,6 +559,10 @@ static inline bool need_inplace_update_policy(struct inode *inode,
if (test_opt(sbi, LFS))
return false;
+ /* if this is cold file, we should overwrite to avoid fragmentation */
+ if (file_is_cold(inode))
+ return true;
+
if (policy & (0x1 << F2FS_IPU_FORCE))
return true;
if (policy & (0x1 << F2FS_IPU_SSR) && need_SSR(sbi))
@@ -799,3 +785,28 @@ static inline long nr_pages_to_write(struct f2fs_sb_info *sbi, int type,
wbc->nr_to_write = desired;
return desired - nr_to_write;
}
+
+static inline void wake_up_discard_thread(struct f2fs_sb_info *sbi, bool force)
+{
+ struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+ bool wakeup = false;
+ int i;
+
+ if (force)
+ goto wake_up;
+
+ mutex_lock(&dcc->cmd_lock);
+ for (i = MAX_PLIST_NUM - 1;
+ i >= 0 && plist_issue(dcc->pend_list_tag[i]); i--) {
+ if (!list_empty(&dcc->pend_list[i])) {
+ wakeup = true;
+ break;
+ }
+ }
+ mutex_unlock(&dcc->cmd_lock);
+ if (!wakeup)
+ return;
+wake_up:
+ dcc->discard_wake = 1;
+ wake_up_interruptible_all(&dcc->discard_wait_queue);
+}
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 32e4c025e97e..89f61eb3d167 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -25,6 +25,7 @@
#include <linux/quotaops.h>
#include <linux/f2fs_fs.h>
#include <linux/sysfs.h>
+#include <linux/quota.h>
#include "f2fs.h"
#include "node.h"
@@ -107,8 +108,20 @@ enum {
Opt_fault_injection,
Opt_lazytime,
Opt_nolazytime,
+ Opt_quota,
+ Opt_noquota,
Opt_usrquota,
Opt_grpquota,
+ Opt_prjquota,
+ Opt_usrjquota,
+ Opt_grpjquota,
+ Opt_prjjquota,
+ Opt_offusrjquota,
+ Opt_offgrpjquota,
+ Opt_offprjjquota,
+ Opt_jqfmt_vfsold,
+ Opt_jqfmt_vfsv0,
+ Opt_jqfmt_vfsv1,
Opt_err,
};
@@ -144,8 +157,20 @@ static match_table_t f2fs_tokens = {
{Opt_fault_injection, "fault_injection=%u"},
{Opt_lazytime, "lazytime"},
{Opt_nolazytime, "nolazytime"},
+ {Opt_quota, "quota"},
+ {Opt_noquota, "noquota"},
{Opt_usrquota, "usrquota"},
{Opt_grpquota, "grpquota"},
+ {Opt_prjquota, "prjquota"},
+ {Opt_usrjquota, "usrjquota=%s"},
+ {Opt_grpjquota, "grpjquota=%s"},
+ {Opt_prjjquota, "prjjquota=%s"},
+ {Opt_offusrjquota, "usrjquota="},
+ {Opt_offgrpjquota, "grpjquota="},
+ {Opt_offprjjquota, "prjjquota="},
+ {Opt_jqfmt_vfsold, "jqfmt=vfsold"},
+ {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
+ {Opt_jqfmt_vfsv1, "jqfmt=vfsv1"},
{Opt_err, NULL},
};
@@ -157,7 +182,7 @@ void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
- printk("%sF2FS-fs (%s): %pV\n", level, sb->s_id, &vaf);
+ printk_ratelimited("%sF2FS-fs (%s): %pV\n", level, sb->s_id, &vaf);
va_end(args);
}
@@ -168,6 +193,104 @@ static void init_once(void *foo)
inode_init_once(&fi->vfs_inode);
}
+#ifdef CONFIG_QUOTA
+static const char * const quotatypes[] = INITQFNAMES;
+#define QTYPE2NAME(t) (quotatypes[t])
+static int f2fs_set_qf_name(struct super_block *sb, int qtype,
+ substring_t *args)
+{
+ struct f2fs_sb_info *sbi = F2FS_SB(sb);
+ char *qname;
+ int ret = -EINVAL;
+
+ if (sb_any_quota_loaded(sb) && !sbi->s_qf_names[qtype]) {
+ f2fs_msg(sb, KERN_ERR,
+ "Cannot change journaled "
+ "quota options when quota turned on");
+ return -EINVAL;
+ }
+ qname = match_strdup(args);
+ if (!qname) {
+ f2fs_msg(sb, KERN_ERR,
+ "Not enough memory for storing quotafile name");
+ return -EINVAL;
+ }
+ if (sbi->s_qf_names[qtype]) {
+ if (strcmp(sbi->s_qf_names[qtype], qname) == 0)
+ ret = 0;
+ else
+ f2fs_msg(sb, KERN_ERR,
+ "%s quota file already specified",
+ QTYPE2NAME(qtype));
+ goto errout;
+ }
+ if (strchr(qname, '/')) {
+ f2fs_msg(sb, KERN_ERR,
+ "quotafile must be on filesystem root");
+ goto errout;
+ }
+ sbi->s_qf_names[qtype] = qname;
+ set_opt(sbi, QUOTA);
+ return 0;
+errout:
+ kfree(qname);
+ return ret;
+}
+
+static int f2fs_clear_qf_name(struct super_block *sb, int qtype)
+{
+ struct f2fs_sb_info *sbi = F2FS_SB(sb);
+
+ if (sb_any_quota_loaded(sb) && sbi->s_qf_names[qtype]) {
+ f2fs_msg(sb, KERN_ERR, "Cannot change journaled quota options"
+ " when quota turned on");
+ return -EINVAL;
+ }
+ kfree(sbi->s_qf_names[qtype]);
+ sbi->s_qf_names[qtype] = NULL;
+ return 0;
+}
+
+static int f2fs_check_quota_options(struct f2fs_sb_info *sbi)
+{
+ /*
+ * We do the test below only for project quotas. 'usrquota' and
+ * 'grpquota' mount options are allowed even without quota feature
+ * to support legacy quotas in quota files.
+ */
+ if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi->sb)) {
+ f2fs_msg(sbi->sb, KERN_ERR, "Project quota feature not enabled. "
+ "Cannot enable project quota enforcement.");
+ return -1;
+ }
+ if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA] ||
+ sbi->s_qf_names[PRJQUOTA]) {
+ if (test_opt(sbi, USRQUOTA) && sbi->s_qf_names[USRQUOTA])
+ clear_opt(sbi, USRQUOTA);
+
+ if (test_opt(sbi, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA])
+ clear_opt(sbi, GRPQUOTA);
+
+ if (test_opt(sbi, PRJQUOTA) && sbi->s_qf_names[PRJQUOTA])
+ clear_opt(sbi, PRJQUOTA);
+
+ if (test_opt(sbi, GRPQUOTA) || test_opt(sbi, USRQUOTA) ||
+ test_opt(sbi, PRJQUOTA)) {
+ f2fs_msg(sbi->sb, KERN_ERR, "old and new quota "
+ "format mixing");
+ return -1;
+ }
+
+ if (!sbi->s_jquota_fmt) {
+ f2fs_msg(sbi->sb, KERN_ERR, "journaled quota format "
+ "not specified");
+ return -1;
+ }
+ }
+ return 0;
+}
+#endif
+
static int parse_options(struct super_block *sb, char *options)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
@@ -175,6 +298,9 @@ static int parse_options(struct super_block *sb, char *options)
substring_t args[MAX_OPT_ARGS];
char *p, *name;
int arg = 0;
+#ifdef CONFIG_QUOTA
+ int ret;
+#endif
if (!options)
return 0;
@@ -386,15 +512,76 @@ static int parse_options(struct super_block *sb, char *options)
sb->s_flags &= ~MS_LAZYTIME;
break;
#ifdef CONFIG_QUOTA
+ case Opt_quota:
case Opt_usrquota:
set_opt(sbi, USRQUOTA);
break;
case Opt_grpquota:
set_opt(sbi, GRPQUOTA);
break;
+ case Opt_prjquota:
+ set_opt(sbi, PRJQUOTA);
+ break;
+ case Opt_usrjquota:
+ ret = f2fs_set_qf_name(sb, USRQUOTA, &args[0]);
+ if (ret)
+ return ret;
+ break;
+ case Opt_grpjquota:
+ ret = f2fs_set_qf_name(sb, GRPQUOTA, &args[0]);
+ if (ret)
+ return ret;
+ break;
+ case Opt_prjjquota:
+ ret = f2fs_set_qf_name(sb, PRJQUOTA, &args[0]);
+ if (ret)
+ return ret;
+ break;
+ case Opt_offusrjquota:
+ ret = f2fs_clear_qf_name(sb, USRQUOTA);
+ if (ret)
+ return ret;
+ break;
+ case Opt_offgrpjquota:
+ ret = f2fs_clear_qf_name(sb, GRPQUOTA);
+ if (ret)
+ return ret;
+ break;
+ case Opt_offprjjquota:
+ ret = f2fs_clear_qf_name(sb, PRJQUOTA);
+ if (ret)
+ return ret;
+ break;
+ case Opt_jqfmt_vfsold:
+ sbi->s_jquota_fmt = QFMT_VFS_OLD;
+ break;
+ case Opt_jqfmt_vfsv0:
+ sbi->s_jquota_fmt = QFMT_VFS_V0;
+ break;
+ case Opt_jqfmt_vfsv1:
+ sbi->s_jquota_fmt = QFMT_VFS_V1;
+ break;
+ case Opt_noquota:
+ clear_opt(sbi, QUOTA);
+ clear_opt(sbi, USRQUOTA);
+ clear_opt(sbi, GRPQUOTA);
+ clear_opt(sbi, PRJQUOTA);
+ break;
#else
+ case Opt_quota:
case Opt_usrquota:
case Opt_grpquota:
+ case Opt_prjquota:
+ case Opt_usrjquota:
+ case Opt_grpjquota:
+ case Opt_prjjquota:
+ case Opt_offusrjquota:
+ case Opt_offgrpjquota:
+ case Opt_offprjjquota:
+ case Opt_jqfmt_vfsold:
+ case Opt_jqfmt_vfsv0:
+ case Opt_jqfmt_vfsv1:
+ case Opt_noquota:
f2fs_msg(sb, KERN_INFO,
"quota operations not supported");
break;
@@ -406,6 +593,10 @@ static int parse_options(struct super_block *sb, char *options)
return -EINVAL;
}
}
+#ifdef CONFIG_QUOTA
+ if (f2fs_check_quota_options(sbi))
+ return -EINVAL;
+#endif
if (F2FS_IO_SIZE_BITS(sbi) && !test_opt(sbi, LFS)) {
f2fs_msg(sb, KERN_ERR,
@@ -439,6 +630,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
init_rwsem(&fi->dio_rwsem[READ]);
init_rwsem(&fi->dio_rwsem[WRITE]);
init_rwsem(&fi->i_mmap_sem);
+ init_rwsem(&fi->i_xattr_sem);
#ifdef CONFIG_QUOTA
memset(&fi->i_dquot, 0, sizeof(fi->i_dquot));
@@ -446,6 +638,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
#endif
/* Will be used by directory only */
fi->i_dir_level = F2FS_SB(sb)->dir_level;
+
return &fi->vfs_inode;
}
@@ -584,7 +777,6 @@ static void destroy_device_list(struct f2fs_sb_info *sbi)
kfree(sbi->devs);
}
-static void f2fs_quota_off_umount(struct super_block *sb);
static void f2fs_put_super(struct super_block *sb)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
@@ -642,7 +834,7 @@ static void f2fs_put_super(struct super_block *sb)
kfree(sbi->ckpt);
- f2fs_exit_sysfs(sbi);
+ f2fs_unregister_sysfs(sbi);
sb->s_fs_info = NULL;
if (sbi->s_chksum_driver)
@@ -651,6 +843,10 @@ static void f2fs_put_super(struct super_block *sb)
destroy_device_list(sbi);
mempool_destroy(sbi->write_io_dummy);
+#ifdef CONFIG_QUOTA
+ for (i = 0; i < MAXQUOTAS; i++)
+ kfree(sbi->s_qf_names[i]);
+#endif
destroy_percpu_info(sbi);
for (i = 0; i < NR_PAGE_TYPE; i++)
kfree(sbi->write_io[i]);
@@ -664,6 +860,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
trace_f2fs_sync_fs(sb, sync);
+ if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
+ return -EAGAIN;
+
if (sync) {
struct cp_control cpc;
@@ -698,6 +897,48 @@ static int f2fs_unfreeze(struct super_block *sb)
return 0;
}
+#ifdef CONFIG_QUOTA
+static int f2fs_statfs_project(struct super_block *sb,
+ kprojid_t projid, struct kstatfs *buf)
+{
+ struct kqid qid;
+ struct dquot *dquot;
+ u64 limit;
+ u64 curblock;
+
+ qid = make_kqid_projid(projid);
+ dquot = dqget(sb, qid);
+ if (IS_ERR(dquot))
+ return PTR_ERR(dquot);
+ spin_lock(&dq_data_lock);
+
+ limit = (dquot->dq_dqb.dqb_bsoftlimit ?
+ dquot->dq_dqb.dqb_bsoftlimit :
+ dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits;
+ if (limit && buf->f_blocks > limit) {
+ curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
+ buf->f_blocks = limit;
+ buf->f_bfree = buf->f_bavail =
+ (buf->f_blocks > curblock) ?
+ (buf->f_blocks - curblock) : 0;
+ }
+
+ limit = dquot->dq_dqb.dqb_isoftlimit ?
+ dquot->dq_dqb.dqb_isoftlimit :
+ dquot->dq_dqb.dqb_ihardlimit;
+ if (limit && buf->f_files > limit) {
+ buf->f_files = limit;
+ buf->f_ffree =
+ (buf->f_files > dquot->dq_dqb.dqb_curinodes) ?
+ (buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
+ }
+
+ spin_unlock(&dq_data_lock);
+ dqput(dquot);
+ return 0;
+}
+#endif
+
static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct super_block *sb = dentry->d_sb;
@@ -733,9 +974,49 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_fsid.val[0] = (u32)id;
buf->f_fsid.val[1] = (u32)(id >> 32);
+#ifdef CONFIG_QUOTA
+ if (is_inode_flag_set(dentry->d_inode, FI_PROJ_INHERIT) &&
+ sb_has_quota_limits_enabled(sb, PRJQUOTA)) {
+ f2fs_statfs_project(sb, F2FS_I(dentry->d_inode)->i_projid, buf);
+ }
+#endif
return 0;
}
+static inline void f2fs_show_quota_options(struct seq_file *seq,
+ struct super_block *sb)
+{
+#ifdef CONFIG_QUOTA
+ struct f2fs_sb_info *sbi = F2FS_SB(sb);
+
+ if (sbi->s_jquota_fmt) {
+ char *fmtname = "";
+
+ switch (sbi->s_jquota_fmt) {
+ case QFMT_VFS_OLD:
+ fmtname = "vfsold";
+ break;
+ case QFMT_VFS_V0:
+ fmtname = "vfsv0";
+ break;
+ case QFMT_VFS_V1:
+ fmtname = "vfsv1";
+ break;
+ }
+ seq_printf(seq, ",jqfmt=%s", fmtname);
+ }
+
+ if (sbi->s_qf_names[USRQUOTA])
+ seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]);
+
+ if (sbi->s_qf_names[GRPQUOTA])
+ seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]);
+
+ if (sbi->s_qf_names[PRJQUOTA])
+ seq_show_option(seq, "prjjquota", sbi->s_qf_names[PRJQUOTA]);
+#endif
+}
+
static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
{
struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);
@@ -809,11 +1090,16 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
sbi->fault_info.inject_rate);
#endif
#ifdef CONFIG_QUOTA
+ if (test_opt(sbi, QUOTA))
+ seq_puts(seq, ",quota");
if (test_opt(sbi, USRQUOTA))
seq_puts(seq, ",usrquota");
if (test_opt(sbi, GRPQUOTA))
seq_puts(seq, ",grpquota");
+ if (test_opt(sbi, PRJQUOTA))
+ seq_puts(seq, ",prjquota");
#endif
+ f2fs_show_quota_options(seq, sbi->sb);
return 0;
}
@@ -862,6 +1148,11 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
#ifdef CONFIG_F2FS_FAULT_INJECTION
struct f2fs_fault_info ffi = sbi->fault_info;
#endif
+#ifdef CONFIG_QUOTA
+ int s_jquota_fmt;
+ char *s_qf_names[MAXQUOTAS];
+ int i, j;
+#endif
/*
* Save the old mount options in case we
@@ -871,6 +1162,23 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
old_sb_flags = sb->s_flags;
active_logs = sbi->active_logs;
+#ifdef CONFIG_QUOTA
+ s_jquota_fmt = sbi->s_jquota_fmt;
+ for (i = 0; i < MAXQUOTAS; i++) {
+ if (sbi->s_qf_names[i]) {
+ s_qf_names[i] = kstrdup(sbi->s_qf_names[i],
+ GFP_KERNEL);
+ if (!s_qf_names[i]) {
+ for (j = 0; j < i; j++)
+ kfree(s_qf_names[j]);
+ return -ENOMEM;
+ }
+ } else {
+ s_qf_names[i] = NULL;
+ }
+ }
+#endif
+
/* recover superblocks we couldn't write due to previous RO mount */
if (!(*flags & MS_RDONLY) && is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)) {
err = f2fs_commit_super(sbi, false);
@@ -952,6 +1260,11 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
goto restore_gc;
}
skip:
+#ifdef CONFIG_QUOTA
+ /* Release old quota file names */
+ for (i = 0; i < MAXQUOTAS; i++)
+ kfree(s_qf_names[i]);
+#endif
/* Update the POSIXACL Flag */
sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
(test_opt(sbi, POSIX_ACL) ? MS_POSIXACL : 0);
@@ -966,6 +1279,13 @@ restore_gc:
stop_gc_thread(sbi);
}
restore_opts:
+#ifdef CONFIG_QUOTA
+ sbi->s_jquota_fmt = s_jquota_fmt;
+ for (i = 0; i < MAXQUOTAS; i++) {
+ kfree(sbi->s_qf_names[i]);
+ sbi->s_qf_names[i] = s_qf_names[i];
+ }
+#endif
sbi->mount_opt = org_mount_opt;
sbi->active_logs = active_logs;
sb->s_flags = old_sb_flags;
@@ -1065,7 +1385,7 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
}
if (len == towrite)
- return err;
+ return 0;
inode->i_version++;
inode->i_mtime = inode->i_ctime = current_time(inode);
f2fs_mark_inode_dirty_sync(inode, false);
@@ -1082,6 +1402,27 @@ static qsize_t *f2fs_get_reserved_space(struct inode *inode)
return &F2FS_I(inode)->i_reserved_quota;
}
+static int f2fs_quota_on_mount(struct f2fs_sb_info *sbi, int type)
+{
+ return dquot_quota_on_mount(sbi->sb, sbi->s_qf_names[type],
+ sbi->s_jquota_fmt, type);
+}
+
+void f2fs_enable_quota_files(struct f2fs_sb_info *sbi)
+{
+ int i, ret;
+
+ for (i = 0; i < MAXQUOTAS; i++) {
+ if (sbi->s_qf_names[i]) {
+ ret = f2fs_quota_on_mount(sbi, i);
+ if (ret < 0)
+ f2fs_msg(sbi->sb, KERN_ERR,
+ "Cannot turn on journaled "
+ "quota: error %d", ret);
+ }
+ }
+}
+
static int f2fs_quota_sync(struct super_block *sb, int type)
{
struct quota_info *dqopt = sb_dqopt(sb);
@@ -1119,7 +1460,7 @@ static int f2fs_quota_on(struct super_block *sb, int type, int format_id,
struct inode *inode;
int err;
- err = f2fs_quota_sync(sb, -1);
+ err = f2fs_quota_sync(sb, type);
if (err)
return err;
@@ -1147,7 +1488,7 @@ static int f2fs_quota_off(struct super_block *sb, int type)
if (!inode || !igrab(inode))
return dquot_quota_off(sb, type);
- f2fs_quota_sync(sb, -1);
+ f2fs_quota_sync(sb, type);
err = dquot_quota_off(sb, type);
if (err)
@@ -1163,7 +1504,7 @@ out_put:
return err;
}
-static void f2fs_quota_off_umount(struct super_block *sb)
+void f2fs_quota_off_umount(struct super_block *sb)
{
int type;
@@ -1171,6 +1512,12 @@ static void f2fs_quota_off_umount(struct super_block *sb)
f2fs_quota_off(sb, type);
}
+int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
+{
+ *projid = F2FS_I(inode)->i_projid;
+ return 0;
+}
+
static const struct dquot_operations f2fs_quota_operations = {
.get_reserved_space = f2fs_get_reserved_space,
.write_dquot = dquot_commit,
@@ -1180,6 +1527,7 @@ static const struct dquot_operations f2fs_quota_operations = {
.write_info = dquot_commit_info,
.alloc_dquot = dquot_alloc,
.destroy_dquot = dquot_destroy,
+ .get_projid = f2fs_get_projid,
.get_next_id = dquot_get_next_id,
};
@@ -1194,12 +1542,12 @@ static const struct quotactl_ops f2fs_quotactl_ops = {
.get_nextdqblk = dquot_get_next_dqblk,
};
#else
-static inline void f2fs_quota_off_umount(struct super_block *sb)
+void f2fs_quota_off_umount(struct super_block *sb)
{
}
#endif
-static struct super_operations f2fs_sops = {
+static const struct super_operations f2fs_sops = {
.alloc_inode = f2fs_alloc_inode,
.drop_inode = f2fs_drop_inode,
.destroy_inode = f2fs_destroy_inode,
@@ -1303,9 +1651,16 @@ static const struct export_operations f2fs_export_ops = {
static loff_t max_file_blocks(void)
{
- loff_t result = (DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS);
+ loff_t result = 0;
loff_t leaf_count = ADDRS_PER_BLOCK;
+ /*
+ * note: previously, result is equal to (DEF_ADDRS_PER_INODE -
+ * F2FS_INLINE_XATTR_ADDRS), but now f2fs try to reserve more
+ * space in inode.i_addr, it will be more safe to reassign
+ * result as zero.
+ */
+
/* two direct node blocks */
result += (leaf_count * 2);
@@ -1922,6 +2277,11 @@ try_onemore:
sb->s_fs_info = sbi;
sbi->raw_super = raw_super;
+ /* precompute checksum seed for metadata */
+ if (f2fs_sb_has_inode_chksum(sb))
+ sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
+ sizeof(raw_super->uuid));
+
/*
* The BLKZONED feature indicates that the drive was formatted with
* zone alignment optimization. This is optional for host-aware
@@ -1956,7 +2316,7 @@ try_onemore:
#ifdef CONFIG_QUOTA
sb->dq_op = &f2fs_quota_operations;
sb->s_qcop = &f2fs_quotactl_ops;
- sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
+ sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
#endif
sb->s_op = &f2fs_sops;
@@ -1980,6 +2340,10 @@ try_onemore:
set_sbi_flag(sbi, SBI_POR_DOING);
spin_lock_init(&sbi->stat_lock);
+ /* init iostat info */
+ spin_lock_init(&sbi->iostat_lock);
+ sbi->iostat_enable = false;
+
for (i = 0; i < NR_PAGE_TYPE; i++) {
int n = (i == META) ? 1: NR_TEMP_TYPE;
int j;
@@ -2098,11 +2462,6 @@ try_onemore:
if (err)
goto free_nm;
- /* if there are nt orphan nodes free them */
- err = recover_orphan_inodes(sbi);
- if (err)
- goto free_node_inode;
-
/* read root inode and dentry */
root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
if (IS_ERR(root)) {
@@ -2122,10 +2481,15 @@ try_onemore:
goto free_root_inode;
}
- err = f2fs_init_sysfs(sbi);
+ err = f2fs_register_sysfs(sbi);
if (err)
goto free_root_inode;
+ /* if there are nt orphan nodes free them */
+ err = recover_orphan_inodes(sbi);
+ if (err)
+ goto free_sysfs;
+
/* recover fsynced data */
if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) {
/*
@@ -2135,7 +2499,7 @@ try_onemore:
if (bdev_read_only(sb->s_bdev) &&
!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
err = -EROFS;
- goto free_sysfs;
+ goto free_meta;
}
if (need_fsck)
@@ -2149,7 +2513,7 @@ try_onemore:
need_fsck = true;
f2fs_msg(sb, KERN_ERR,
"Cannot recover all fsync data errno=%d", err);
- goto free_sysfs;
+ goto free_meta;
}
} else {
err = recover_fsync_data(sbi, true);
@@ -2173,7 +2537,7 @@ skip_recovery:
/* After POR, we can run background GC thread.*/
err = start_gc_thread(sbi);
if (err)
- goto free_sysfs;
+ goto free_meta;
}
kfree(options);
@@ -2191,9 +2555,17 @@ skip_recovery:
f2fs_update_time(sbi, REQ_TIME);
return 0;
-free_sysfs:
+free_meta:
f2fs_sync_inode_meta(sbi);
- f2fs_exit_sysfs(sbi);
+ /*
+ * Some dirty meta pages can be produced by recover_orphan_inodes()
+ * failed by EIO. Then, iput(node_inode) can trigger balance_fs_bg()
+ * followed by write_checkpoint() through f2fs_write_node_pages(), which
+ * falls into an infinite loop in sync_meta_pages().
+ */
+ truncate_inode_pages_final(META_MAPPING(sbi));
+free_sysfs:
+ f2fs_unregister_sysfs(sbi);
free_root_inode:
dput(sb->s_root);
sb->s_root = NULL;
@@ -2202,13 +2574,6 @@ free_node_inode:
mutex_lock(&sbi->umount_mutex);
release_ino_entry(sbi, true);
f2fs_leave_shrinker(sbi);
- /*
- * Some dirty meta pages can be produced by recover_orphan_inodes()
- * failed by EIO. Then, iput(node_inode) can trigger balance_fs_bg()
- * followed by write_checkpoint() through f2fs_write_node_pages(), which
- * falls into an infinite loop in sync_meta_pages().
- */
- truncate_inode_pages_final(META_MAPPING(sbi));
iput(sbi->node_inode);
mutex_unlock(&sbi->umount_mutex);
f2fs_destroy_stats(sbi);
@@ -2228,6 +2593,10 @@ free_options:
for (i = 0; i < NR_PAGE_TYPE; i++)
kfree(sbi->write_io[i]);
destroy_percpu_info(sbi);
+#ifdef CONFIG_QUOTA
+ for (i = 0; i < MAXQUOTAS; i++)
+ kfree(sbi->s_qf_names[i]);
+#endif
kfree(options);
free_sb_buf:
kfree(raw_super);
@@ -2311,7 +2680,7 @@ static int __init init_f2fs_fs(void)
err = create_extent_cache();
if (err)
goto free_checkpoint_caches;
- err = f2fs_register_sysfs();
+ err = f2fs_init_sysfs();
if (err)
goto free_extent_cache;
err = register_shrinker(&f2fs_shrinker_info);
@@ -2330,7 +2699,7 @@ free_filesystem:
free_shrinker:
unregister_shrinker(&f2fs_shrinker_info);
free_sysfs:
- f2fs_unregister_sysfs();
+ f2fs_exit_sysfs();
free_extent_cache:
destroy_extent_cache();
free_checkpoint_caches:
@@ -2350,7 +2719,7 @@ static void __exit exit_f2fs_fs(void)
f2fs_destroy_root_stats();
unregister_filesystem(&f2fs_fs_type);
unregister_shrinker(&f2fs_shrinker_info);
- f2fs_unregister_sysfs();
+ f2fs_exit_sysfs();
destroy_extent_cache();
destroy_checkpoint_caches();
destroy_segment_manager_caches();
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 71191d89917d..e2c258f717cd 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -18,7 +18,6 @@
#include "gc.h"
static struct proc_dir_entry *f2fs_proc_root;
-static struct kset *f2fs_kset;
/* Sysfs support for f2fs */
enum {
@@ -41,6 +40,7 @@ struct f2fs_attr {
const char *, size_t);
int struct_type;
int offset;
+ int id;
};
static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type)
@@ -76,6 +76,34 @@ static ssize_t lifetime_write_kbytes_show(struct f2fs_attr *a,
BD_PART_WRITTEN(sbi)));
}
+static ssize_t features_show(struct f2fs_attr *a,
+ struct f2fs_sb_info *sbi, char *buf)
+{
+ struct super_block *sb = sbi->sb;
+ int len = 0;
+
+ if (!sb->s_bdev->bd_part)
+ return snprintf(buf, PAGE_SIZE, "0\n");
+
+ if (f2fs_sb_has_crypto(sb))
+ len += snprintf(buf, PAGE_SIZE - len, "%s",
+ "encryption");
+ if (f2fs_sb_mounted_blkzoned(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "blkzoned");
+ if (f2fs_sb_has_extra_attr(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "extra_attr");
+ if (f2fs_sb_has_project_quota(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "projquota");
+ if (f2fs_sb_has_inode_chksum(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "inode_checksum");
+ len += snprintf(buf + len, PAGE_SIZE - len, "\n");
+ return len;
+}
+
static ssize_t f2fs_sbi_show(struct f2fs_attr *a,
struct f2fs_sb_info *sbi, char *buf)
{
@@ -124,7 +152,39 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
spin_unlock(&sbi->stat_lock);
return count;
}
+
+ if (!strcmp(a->attr.name, "discard_granularity")) {
+ struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
+ int i;
+
+ if (t == 0 || t > MAX_PLIST_NUM)
+ return -EINVAL;
+ if (t == *ui)
+ return count;
+
+ mutex_lock(&dcc->cmd_lock);
+ for (i = 0; i < MAX_PLIST_NUM; i++) {
+ if (i >= t - 1)
+ dcc->pend_list_tag[i] |= P_ACTIVE;
+ else
+ dcc->pend_list_tag[i] &= (~P_ACTIVE);
+ }
+ mutex_unlock(&dcc->cmd_lock);
+
+ *ui = t;
+ return count;
+ }
+
*ui = t;
+
+ if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0)
+ f2fs_reset_iostat(sbi);
+ if (!strcmp(a->attr.name, "gc_urgent") && t == 1 && sbi->gc_thread) {
+ sbi->gc_thread->gc_wake = 1;
+ wake_up_interruptible_all(&sbi->gc_thread->gc_wait_queue_head);
+ wake_up_discard_thread(sbi, true);
+ }
+
return count;
}
@@ -155,6 +215,30 @@ static void f2fs_sb_release(struct kobject *kobj)
complete(&sbi->s_kobj_unregister);
}
+enum feat_id {
+ FEAT_CRYPTO = 0,
+ FEAT_BLKZONED,
+ FEAT_ATOMIC_WRITE,
+ FEAT_EXTRA_ATTR,
+ FEAT_PROJECT_QUOTA,
+ FEAT_INODE_CHECKSUM,
+};
+
+static ssize_t f2fs_feature_show(struct f2fs_attr *a,
+ struct f2fs_sb_info *sbi, char *buf)
+{
+ switch (a->id) {
+ case FEAT_CRYPTO:
+ case FEAT_BLKZONED:
+ case FEAT_ATOMIC_WRITE:
+ case FEAT_EXTRA_ATTR:
+ case FEAT_PROJECT_QUOTA:
+ case FEAT_INODE_CHECKSUM:
+ return snprintf(buf, PAGE_SIZE, "supported\n");
+ }
+ return 0;
+}
+
#define F2FS_ATTR_OFFSET(_struct_type, _name, _mode, _show, _store, _offset) \
static struct f2fs_attr f2fs_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
@@ -172,12 +256,23 @@ static struct f2fs_attr f2fs_attr_##_name = { \
#define F2FS_GENERAL_RO_ATTR(name) \
static struct f2fs_attr f2fs_attr_##name = __ATTR(name, 0444, name##_show, NULL)
+#define F2FS_FEATURE_RO_ATTR(_name, _id) \
+static struct f2fs_attr f2fs_attr_##_name = { \
+ .attr = {.name = __stringify(_name), .mode = 0444 }, \
+ .show = f2fs_feature_show, \
+ .id = _id, \
+}
+
+F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_urgent_sleep_time,
+ urgent_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_min_sleep_time, min_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_max_sleep_time, max_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle);
+F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_urgent, gc_urgent);
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, max_small_discards, max_discards);
+F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, discard_granularity, discard_granularity);
F2FS_RW_ATTR(RESERVED_BLOCKS, f2fs_sb_info, reserved_blocks, reserved_blocks);
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, batched_trim_sections, trim_sections);
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy);
@@ -191,20 +286,36 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
#ifdef CONFIG_F2FS_FAULT_INJECTION
F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate);
F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
#endif
F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes);
+F2FS_GENERAL_RO_ATTR(features);
+
+#ifdef CONFIG_F2FS_FS_ENCRYPTION
+F2FS_FEATURE_RO_ATTR(encryption, FEAT_CRYPTO);
+#endif
+#ifdef CONFIG_BLK_DEV_ZONED
+F2FS_FEATURE_RO_ATTR(block_zoned, FEAT_BLKZONED);
+#endif
+F2FS_FEATURE_RO_ATTR(atomic_write, FEAT_ATOMIC_WRITE);
+F2FS_FEATURE_RO_ATTR(extra_attr, FEAT_EXTRA_ATTR);
+F2FS_FEATURE_RO_ATTR(project_quota, FEAT_PROJECT_QUOTA);
+F2FS_FEATURE_RO_ATTR(inode_checksum, FEAT_INODE_CHECKSUM);
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
static struct attribute *f2fs_attrs[] = {
+ ATTR_LIST(gc_urgent_sleep_time),
ATTR_LIST(gc_min_sleep_time),
ATTR_LIST(gc_max_sleep_time),
ATTR_LIST(gc_no_gc_sleep_time),
ATTR_LIST(gc_idle),
+ ATTR_LIST(gc_urgent),
ATTR_LIST(reclaim_segments),
ATTR_LIST(max_small_discards),
+ ATTR_LIST(discard_granularity),
ATTR_LIST(batched_trim_sections),
ATTR_LIST(ipu_policy),
ATTR_LIST(min_ipu_util),
@@ -217,26 +328,59 @@ static struct attribute *f2fs_attrs[] = {
ATTR_LIST(dirty_nats_ratio),
ATTR_LIST(cp_interval),
ATTR_LIST(idle_interval),
+ ATTR_LIST(iostat_enable),
#ifdef CONFIG_F2FS_FAULT_INJECTION
ATTR_LIST(inject_rate),
ATTR_LIST(inject_type),
#endif
ATTR_LIST(lifetime_write_kbytes),
+ ATTR_LIST(features),
ATTR_LIST(reserved_blocks),
NULL,
};
+static struct attribute *f2fs_feat_attrs[] = {
+#ifdef CONFIG_F2FS_FS_ENCRYPTION
+ ATTR_LIST(encryption),
+#endif
+#ifdef CONFIG_BLK_DEV_ZONED
+ ATTR_LIST(block_zoned),
+#endif
+ ATTR_LIST(atomic_write),
+ ATTR_LIST(extra_attr),
+ ATTR_LIST(project_quota),
+ ATTR_LIST(inode_checksum),
+ NULL,
+};
+
static const struct sysfs_ops f2fs_attr_ops = {
.show = f2fs_attr_show,
.store = f2fs_attr_store,
};
-static struct kobj_type f2fs_ktype = {
+static struct kobj_type f2fs_sb_ktype = {
.default_attrs = f2fs_attrs,
.sysfs_ops = &f2fs_attr_ops,
.release = f2fs_sb_release,
};
+static struct kobj_type f2fs_ktype = {
+ .sysfs_ops = &f2fs_attr_ops,
+};
+
+static struct kset f2fs_kset = {
+ .kobj = {.ktype = &f2fs_ktype},
+};
+
+static struct kobj_type f2fs_feat_ktype = {
+ .default_attrs = f2fs_feat_attrs,
+ .sysfs_ops = &f2fs_attr_ops,
+};
+
+static struct kobject f2fs_feat = {
+ .kset = &f2fs_kset,
+};
+
static int segment_info_seq_show(struct seq_file *seq, void *offset)
{
struct super_block *sb = seq->private;
@@ -288,6 +432,48 @@ static int segment_bits_seq_show(struct seq_file *seq, void *offset)
return 0;
}
+static int iostat_info_seq_show(struct seq_file *seq, void *offset)
+{
+ struct super_block *sb = seq->private;
+ struct f2fs_sb_info *sbi = F2FS_SB(sb);
+ time64_t now = ktime_get_real_seconds();
+
+ if (!sbi->iostat_enable)
+ return 0;
+
+ seq_printf(seq, "time: %-16llu\n", now);
+
+ /* print app IOs */
+ seq_printf(seq, "app buffered: %-16llu\n",
+ sbi->write_iostat[APP_BUFFERED_IO]);
+ seq_printf(seq, "app direct: %-16llu\n",
+ sbi->write_iostat[APP_DIRECT_IO]);
+ seq_printf(seq, "app mapped: %-16llu\n",
+ sbi->write_iostat[APP_MAPPED_IO]);
+
+ /* print fs IOs */
+ seq_printf(seq, "fs data: %-16llu\n",
+ sbi->write_iostat[FS_DATA_IO]);
+ seq_printf(seq, "fs node: %-16llu\n",
+ sbi->write_iostat[FS_NODE_IO]);
+ seq_printf(seq, "fs meta: %-16llu\n",
+ sbi->write_iostat[FS_META_IO]);
+ seq_printf(seq, "fs gc data: %-16llu\n",
+ sbi->write_iostat[FS_GC_DATA_IO]);
+ seq_printf(seq, "fs gc node: %-16llu\n",
+ sbi->write_iostat[FS_GC_NODE_IO]);
+ seq_printf(seq, "fs cp data: %-16llu\n",
+ sbi->write_iostat[FS_CP_DATA_IO]);
+ seq_printf(seq, "fs cp node: %-16llu\n",
+ sbi->write_iostat[FS_CP_NODE_IO]);
+ seq_printf(seq, "fs cp meta: %-16llu\n",
+ sbi->write_iostat[FS_CP_META_IO]);
+ seq_printf(seq, "fs discard: %-16llu\n",
+ sbi->write_iostat[FS_DISCARD]);
+
+ return 0;
+}
+
#define F2FS_PROC_FILE_DEF(_name) \
static int _name##_open_fs(struct inode *inode, struct file *file) \
{ \
@@ -303,28 +489,47 @@ static const struct file_operations f2fs_seq_##_name##_fops = { \
F2FS_PROC_FILE_DEF(segment_info);
F2FS_PROC_FILE_DEF(segment_bits);
+F2FS_PROC_FILE_DEF(iostat_info);
-int __init f2fs_register_sysfs(void)
+int __init f2fs_init_sysfs(void)
{
- f2fs_proc_root = proc_mkdir("fs/f2fs", NULL);
+ int ret;
- f2fs_kset = kset_create_and_add("f2fs", NULL, fs_kobj);
- if (!f2fs_kset)
- return -ENOMEM;
- return 0;
+ kobject_set_name(&f2fs_kset.kobj, "f2fs");
+ f2fs_kset.kobj.parent = fs_kobj;
+ ret = kset_register(&f2fs_kset);
+ if (ret)
+ return ret;
+
+ ret = kobject_init_and_add(&f2fs_feat, &f2fs_feat_ktype,
+ NULL, "features");
+ if (ret)
+ kset_unregister(&f2fs_kset);
+ else
+ f2fs_proc_root = proc_mkdir("fs/f2fs", NULL);
+ return ret;
}
-void f2fs_unregister_sysfs(void)
+void f2fs_exit_sysfs(void)
{
- kset_unregister(f2fs_kset);
+ kobject_put(&f2fs_feat);
+ kset_unregister(&f2fs_kset);
remove_proc_entry("fs/f2fs", NULL);
+ f2fs_proc_root = NULL;
}
-int f2fs_init_sysfs(struct f2fs_sb_info *sbi)
+int f2fs_register_sysfs(struct f2fs_sb_info *sbi)
{
struct super_block *sb = sbi->sb;
int err;
+ sbi->s_kobj.kset = &f2fs_kset;
+ init_completion(&sbi->s_kobj_unregister);
+ err = kobject_init_and_add(&sbi->s_kobj, &f2fs_sb_ktype, NULL,
+ "%s", sb->s_id);
+ if (err)
+ return err;
+
if (f2fs_proc_root)
sbi->s_proc = proc_mkdir(sb->s_id, f2fs_proc_root);
@@ -333,33 +538,19 @@ int f2fs_init_sysfs(struct f2fs_sb_info *sbi)
&f2fs_seq_segment_info_fops, sb);
proc_create_data("segment_bits", S_IRUGO, sbi->s_proc,
&f2fs_seq_segment_bits_fops, sb);
+ proc_create_data("iostat_info", S_IRUGO, sbi->s_proc,
+ &f2fs_seq_iostat_info_fops, sb);
}
-
- sbi->s_kobj.kset = f2fs_kset;
- init_completion(&sbi->s_kobj_unregister);
- err = kobject_init_and_add(&sbi->s_kobj, &f2fs_ktype, NULL,
- "%s", sb->s_id);
- if (err)
- goto err_out;
return 0;
-err_out:
- if (sbi->s_proc) {
- remove_proc_entry("segment_info", sbi->s_proc);
- remove_proc_entry("segment_bits", sbi->s_proc);
- remove_proc_entry(sb->s_id, f2fs_proc_root);
- }
- return err;
}
-void f2fs_exit_sysfs(struct f2fs_sb_info *sbi)
+void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi)
{
- kobject_del(&sbi->s_kobj);
- kobject_put(&sbi->s_kobj);
- wait_for_completion(&sbi->s_kobj_unregister);
-
if (sbi->s_proc) {
+ remove_proc_entry("iostat_info", sbi->s_proc);
remove_proc_entry("segment_info", sbi->s_proc);
remove_proc_entry("segment_bits", sbi->s_proc);
remove_proc_entry(sbi->sb->s_id, f2fs_proc_root);
}
+ kobject_del(&sbi->s_kobj);
}
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c
index 832c5110abab..7c65540148f8 100644
--- a/fs/f2fs/xattr.c
+++ b/fs/f2fs/xattr.c
@@ -442,7 +442,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
} else {
struct dnode_of_data dn;
set_new_dnode(&dn, inode, NULL, NULL, new_nid);
- xpage = new_node_page(&dn, XATTR_NODE_OFFSET, ipage);
+ xpage = new_node_page(&dn, XATTR_NODE_OFFSET);
if (IS_ERR(xpage)) {
alloc_nid_failed(sbi, new_nid);
return PTR_ERR(xpage);
@@ -473,8 +473,10 @@ int f2fs_getxattr(struct inode *inode, int index, const char *name,
if (len > F2FS_NAME_LEN)
return -ERANGE;
+ down_read(&F2FS_I(inode)->i_xattr_sem);
error = lookup_all_xattrs(inode, ipage, index, len, name,
&entry, &base_addr);
+ up_read(&F2FS_I(inode)->i_xattr_sem);
if (error)
return error;
@@ -503,7 +505,9 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
int error = 0;
size_t rest = buffer_size;
+ down_read(&F2FS_I(inode)->i_xattr_sem);
error = read_all_xattrs(inode, NULL, &base_addr);
+ up_read(&F2FS_I(inode)->i_xattr_sem);
if (error)
return error;
@@ -686,7 +690,9 @@ int f2fs_setxattr(struct inode *inode, int index, const char *name,
f2fs_lock_op(sbi);
/* protect xattr_ver */
down_write(&F2FS_I(inode)->i_sem);
+ down_write(&F2FS_I(inode)->i_xattr_sem);
err = __f2fs_setxattr(inode, index, name, value, size, ipage, flags);
+ up_write(&F2FS_I(inode)->i_xattr_sem);
up_write(&F2FS_I(inode)->i_sem);
f2fs_unlock_op(sbi);
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c
index 1d9a8c4e9de0..48b2336692f9 100644
--- a/fs/fat/fatent.c
+++ b/fs/fat/fatent.c
@@ -309,7 +309,7 @@ static void mark_fsinfo_dirty(struct super_block *sb)
{
struct msdos_sb_info *sbi = MSDOS_SB(sb);
- if (sb->s_flags & MS_RDONLY || sbi->fat_bits != 32)
+ if (sb_rdonly(sb) || sbi->fat_bits != 32)
return;
__mark_inode_dirty(sbi->fsinfo_inode, I_DIRTY_SYNC);
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index a2c05f2ada6d..30c52394a7ad 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -657,7 +657,7 @@ static void fat_set_state(struct super_block *sb,
struct msdos_sb_info *sbi = MSDOS_SB(sb);
/* do not change any thing if mounted read only */
- if ((sb->s_flags & MS_RDONLY) && !force)
+ if (sb_rdonly(sb) && !force)
return;
/* do not change state if fs was dirty */
@@ -787,7 +787,7 @@ static int fat_remount(struct super_block *sb, int *flags, char *data)
/* make sure we update state on remount. */
new_rdonly = *flags & MS_RDONLY;
- if (new_rdonly != (sb->s_flags & MS_RDONLY)) {
+ if (new_rdonly != sb_rdonly(sb)) {
if (new_rdonly)
fat_set_state(sb, 0, 0);
else
diff --git a/fs/fat/misc.c b/fs/fat/misc.c
index 8a8698119ff7..acc3aa30ee54 100644
--- a/fs/fat/misc.c
+++ b/fs/fat/misc.c
@@ -32,7 +32,7 @@ void __fat_fs_error(struct super_block *sb, int report, const char *fmt, ...)
if (opts->errors == FAT_ERRORS_PANIC)
panic("FAT-fs (%s): fs panic from previous error\n", sb->s_id);
- else if (opts->errors == FAT_ERRORS_RO && !(sb->s_flags & MS_RDONLY)) {
+ else if (opts->errors == FAT_ERRORS_RO && !sb_rdonly(sb)) {
sb->s_flags |= MS_RDONLY;
fat_msg(sb, KERN_ERR, "Filesystem has been set read-only");
}
diff --git a/fs/fcntl.c b/fs/fcntl.c
index 3b01b646e528..448a1119f0be 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -741,10 +741,21 @@ static void send_sigio_to_task(struct task_struct *p,
si.si_signo = signum;
si.si_errno = 0;
si.si_code = reason;
+ /*
+ * Posix definies POLL_IN and friends to be signal
+ * specific si_codes for SIG_POLL. Linux extended
+ * these si_codes to other signals in a way that is
+ * ambiguous if other signals also have signal
+ * specific si_codes. In that case use SI_SIGIO instead
+ * to remove the ambiguity.
+ */
+ if ((signum != SIGPOLL) && sig_specific_sicodes(signum))
+ si.si_code = SI_SIGIO;
+
/* Make sure we are called with one of the POLL_*
reasons, otherwise we could leak kernel stack into
userspace. */
- BUG_ON((reason & __SI_MASK) != __SI_POLL);
+ BUG_ON((reason < POLL_IN) || ((reason - POLL_IN) >= NSIGPOLL));
if (reason - POLL_IN >= NSIGPOLL)
si.si_band = ~0L;
else
diff --git a/fs/file_table.c b/fs/file_table.c
index 72e861a35a7f..61517f57f8ef 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -233,12 +233,10 @@ static LLIST_HEAD(delayed_fput_list);
static void delayed_fput(struct work_struct *unused)
{
struct llist_node *node = llist_del_all(&delayed_fput_list);
- struct llist_node *next;
+ struct file *f, *t;
- for (; node; node = next) {
- next = llist_next(node);
- __fput(llist_entry(node, struct file, f_u.fu_llist));
- }
+ llist_for_each_entry_safe(f, t, node, f_u.fu_llist)
+ __fput(f);
}
static void ____fput(struct callback_head *work)
@@ -312,7 +310,7 @@ void put_filp(struct file *file)
}
void __init files_init(void)
-{
+{
filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
percpu_counter_init(&nr_files, 0, GFP_KERNEL);
@@ -331,4 +329,4 @@ void __init files_maxfiles_init(void)
n = ((totalram_pages - memreserve) * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE);
-}
+}
diff --git a/fs/fscache/object-list.c b/fs/fscache/object-list.c
index 67f940892ef8..b5ab06fabc60 100644
--- a/fs/fscache/object-list.c
+++ b/fs/fscache/object-list.c
@@ -262,7 +262,8 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
type = "DT";
break;
default:
- sprintf(_type, "%02u", cookie->def->type);
+ snprintf(_type, sizeof(_type), "%02u",
+ cookie->def->type);
type = _type;
break;
}
diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c
index c5b6b7165489..e9e97803442a 100644
--- a/fs/fuse/cuse.c
+++ b/fs/fuse/cuse.c
@@ -90,7 +90,7 @@ static struct list_head *cuse_conntbl_head(dev_t devt)
static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp);
+ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb);
loff_t pos = 0;
return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE);
@@ -98,7 +98,7 @@ static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to)
static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp);
+ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb);
loff_t pos = 0;
/*
* No locking or generic_write_checks(), the server is
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index c16d00e53264..13c65dd2d37d 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1222,9 +1222,6 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
struct fuse_in *in;
unsigned reqsize;
- if (task_active_pid_ns(current) != fc->pid_ns)
- return -EIO;
-
restart:
spin_lock(&fiq->waitq.lock);
err = -EAGAIN;
@@ -1262,6 +1259,13 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
in = &req->in;
reqsize = in->h.len;
+
+ if (task_active_pid_ns(current) != fc->pid_ns) {
+ rcu_read_lock();
+ in->h.pid = pid_vnr(find_pid_ns(in->h.pid, fc->pid_ns));
+ rcu_read_unlock();
+ }
+
/* If request is too large, reply with an error and restart the read */
if (nbytes < reqsize) {
req->out.h.error = -EIO;
@@ -1823,9 +1827,6 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
struct fuse_req *req;
struct fuse_out_header oh;
- if (task_active_pid_ns(current) != fc->pid_ns)
- return -EIO;
-
if (nbytes < sizeof(struct fuse_out_header))
return -EINVAL;
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 00800c07ba1c..622081b97426 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -923,33 +923,29 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
return err;
}
-int fuse_update_attributes(struct inode *inode, struct kstat *stat,
- struct file *file, bool *refreshed)
+static int fuse_update_get_attr(struct inode *inode, struct file *file,
+ struct kstat *stat)
{
struct fuse_inode *fi = get_fuse_inode(inode);
- int err;
- bool r;
+ int err = 0;
if (time_before64(fi->i_time, get_jiffies_64())) {
- r = true;
forget_all_cached_acls(inode);
err = fuse_do_getattr(inode, stat, file);
- } else {
- r = false;
- err = 0;
- if (stat) {
- generic_fillattr(inode, stat);
- stat->mode = fi->orig_i_mode;
- stat->ino = fi->orig_ino;
- }
+ } else if (stat) {
+ generic_fillattr(inode, stat);
+ stat->mode = fi->orig_i_mode;
+ stat->ino = fi->orig_ino;
}
- if (refreshed != NULL)
- *refreshed = r;
-
return err;
}
+int fuse_update_attributes(struct inode *inode, struct file *file)
+{
+ return fuse_update_get_attr(inode, file, NULL);
+}
+
int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
u64 child_nodeid, struct qstr *name)
{
@@ -1786,7 +1782,7 @@ static int fuse_getattr(const struct path *path, struct kstat *stat,
if (!fuse_allow_current_process(fc))
return -EACCES;
- return fuse_update_attributes(inode, stat, NULL, NULL);
+ return fuse_update_get_attr(inode, NULL, stat);
}
static const struct inode_operations fuse_dir_inode_operations = {
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index d66789804287..cb7dff5c45d7 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -645,7 +645,7 @@ static size_t fuse_async_req_send(struct fuse_conn *fc, struct fuse_req *req,
static size_t fuse_send_read(struct fuse_req *req, struct fuse_io_priv *io,
loff_t pos, size_t count, fl_owner_t owner)
{
- struct file *file = io->file;
+ struct file *file = io->iocb->ki_filp;
struct fuse_file *ff = file->private_data;
struct fuse_conn *fc = ff->fc;
@@ -707,7 +707,8 @@ static void fuse_short_read(struct fuse_req *req, struct inode *inode,
static int fuse_do_readpage(struct file *file, struct page *page)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct kiocb iocb;
+ struct fuse_io_priv io;
struct inode *inode = page->mapping->host;
struct fuse_conn *fc = get_fuse_conn(inode);
struct fuse_req *req;
@@ -735,6 +736,8 @@ static int fuse_do_readpage(struct file *file, struct page *page)
req->num_pages = 1;
req->pages[0] = page;
req->page_descs[0].length = count;
+ init_sync_kiocb(&iocb, file);
+ io = (struct fuse_io_priv) FUSE_IO_PRIV_SYNC(&iocb);
num_read = fuse_send_read(req, &io, pos, count, NULL);
err = req->out.h.error;
@@ -923,7 +926,7 @@ static ssize_t fuse_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
if (fc->auto_inval_data ||
(iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) {
int err;
- err = fuse_update_attributes(inode, NULL, iocb->ki_filp, NULL);
+ err = fuse_update_attributes(inode, iocb->ki_filp);
if (err)
return err;
}
@@ -957,13 +960,18 @@ static void fuse_write_fill(struct fuse_req *req, struct fuse_file *ff,
static size_t fuse_send_write(struct fuse_req *req, struct fuse_io_priv *io,
loff_t pos, size_t count, fl_owner_t owner)
{
- struct file *file = io->file;
+ struct kiocb *iocb = io->iocb;
+ struct file *file = iocb->ki_filp;
struct fuse_file *ff = file->private_data;
struct fuse_conn *fc = ff->fc;
struct fuse_write_in *inarg = &req->misc.write.in;
fuse_write_fill(req, ff, pos, count);
inarg->flags = file->f_flags;
+ if (iocb->ki_flags & IOCB_DSYNC)
+ inarg->flags |= O_DSYNC;
+ if (iocb->ki_flags & IOCB_SYNC)
+ inarg->flags |= O_SYNC;
if (owner != NULL) {
inarg->write_flags |= FUSE_WRITE_LOCKOWNER;
inarg->lock_owner = fuse_lock_owner_id(fc, owner);
@@ -993,14 +1001,14 @@ bool fuse_write_update_size(struct inode *inode, loff_t pos)
return ret;
}
-static size_t fuse_send_write_pages(struct fuse_req *req, struct file *file,
+static size_t fuse_send_write_pages(struct fuse_req *req, struct kiocb *iocb,
struct inode *inode, loff_t pos,
size_t count)
{
size_t res;
unsigned offset;
unsigned i;
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb);
for (i = 0; i < req->num_pages; i++)
fuse_wait_on_page_writeback(inode, req->pages[i]->index);
@@ -1100,7 +1108,7 @@ static inline unsigned fuse_wr_pages(loff_t pos, size_t len)
FUSE_MAX_PAGES_PER_REQ);
}
-static ssize_t fuse_perform_write(struct file *file,
+static ssize_t fuse_perform_write(struct kiocb *iocb,
struct address_space *mapping,
struct iov_iter *ii, loff_t pos)
{
@@ -1133,7 +1141,7 @@ static ssize_t fuse_perform_write(struct file *file,
} else {
size_t num_written;
- num_written = fuse_send_write_pages(req, file, inode,
+ num_written = fuse_send_write_pages(req, iocb, inode,
pos, count);
err = req->out.h.error;
if (!err) {
@@ -1169,7 +1177,7 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (get_fuse_conn(inode)->writeback_cache) {
/* Update size (EOF optimization) and mode (SUID clearing) */
- err = fuse_update_attributes(mapping->host, NULL, file, NULL);
+ err = fuse_update_attributes(mapping->host, file);
if (err)
return err;
@@ -1201,7 +1209,7 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
pos += written;
- written_buffered = fuse_perform_write(file, mapping, from, pos);
+ written_buffered = fuse_perform_write(iocb, mapping, from, pos);
if (written_buffered < 0) {
err = written_buffered;
goto out;
@@ -1220,13 +1228,15 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
written += written_buffered;
iocb->ki_pos = pos + written_buffered;
} else {
- written = fuse_perform_write(file, mapping, from, iocb->ki_pos);
+ written = fuse_perform_write(iocb, mapping, from, iocb->ki_pos);
if (written >= 0)
iocb->ki_pos += written;
}
out:
current->backing_dev_info = NULL;
inode_unlock(inode);
+ if (written > 0)
+ written = generic_write_sync(iocb, written);
return written ? written : err;
}
@@ -1317,7 +1327,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
{
int write = flags & FUSE_DIO_WRITE;
int cuse = flags & FUSE_DIO_CUSE;
- struct file *file = io->file;
+ struct file *file = io->iocb->ki_filp;
struct inode *inode = file->f_mapping->host;
struct fuse_file *ff = file->private_data;
struct fuse_conn *fc = ff->fc;
@@ -1399,8 +1409,7 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io,
loff_t *ppos)
{
ssize_t res;
- struct file *file = io->file;
- struct inode *inode = file_inode(file);
+ struct inode *inode = file_inode(io->iocb->ki_filp);
if (is_bad_inode(inode))
return -EIO;
@@ -1414,15 +1423,14 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io,
static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb->ki_filp);
+ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb);
return __fuse_direct_read(&io, to, &iocb->ki_pos);
}
static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
- struct file *file = iocb->ki_filp;
- struct inode *inode = file_inode(file);
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct inode *inode = file_inode(iocb->ki_filp);
+ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb);
ssize_t res;
if (is_bad_inode(inode))
@@ -2181,9 +2189,6 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX)
return 0;
- if (pid && pid_nr == 0)
- return -EOVERFLOW;
-
fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
err = fuse_simple_request(fc, &args);
@@ -2303,7 +2308,7 @@ static loff_t fuse_lseek(struct file *file, loff_t offset, int whence)
return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes);
fallback:
- err = fuse_update_attributes(inode, NULL, file, NULL);
+ err = fuse_update_attributes(inode, file);
if (!err)
return generic_file_llseek(file, offset, whence);
else
@@ -2323,7 +2328,7 @@ static loff_t fuse_file_llseek(struct file *file, loff_t offset, int whence)
break;
case SEEK_END:
inode_lock(inode);
- retval = fuse_update_attributes(inode, NULL, file, NULL);
+ retval = fuse_update_attributes(inode, file);
if (!retval)
retval = generic_file_llseek(file, offset, whence);
inode_unlock(inode);
@@ -2874,7 +2879,6 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
io->offset = offset;
io->write = (iov_iter_rw(iter) == WRITE);
io->err = 0;
- io->file = file;
/*
* By default, we want to optimize all I/Os with async request
* submission to the client filesystem if supported.
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index bd4d2a3e1ec1..d5773ca67ad2 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -252,16 +252,15 @@ struct fuse_io_priv {
bool should_dirty;
int err;
struct kiocb *iocb;
- struct file *file;
struct completion *done;
bool blocking;
};
-#define FUSE_IO_PRIV_SYNC(f) \
+#define FUSE_IO_PRIV_SYNC(i) \
{ \
.refcnt = KREF_INIT(1), \
.async = 0, \
- .file = f, \
+ .iocb = i, \
}
/**
@@ -905,8 +904,7 @@ u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
void fuse_update_ctime(struct inode *inode);
-int fuse_update_attributes(struct inode *inode, struct kstat *stat,
- struct file *file, bool *refreshed);
+int fuse_update_attributes(struct inode *inode, struct file *file);
void fuse_flush_writepages(struct inode *inode);
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 98e845b7841b..11066d8647d2 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1945,13 +1945,9 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
{
struct gfs2_glock_iter *gi = seq->private;
loff_t n = *pos;
- int ret;
-
- if (gi->last_pos <= *pos)
- n = (*pos - gi->last_pos);
- ret = rhashtable_walk_start(&gi->hti);
- if (ret)
+ rhashtable_walk_enter(&gl_hash_table, &gi->hti);
+ if (rhashtable_walk_start(&gi->hti) != 0)
return NULL;
do {
@@ -1959,6 +1955,7 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
} while (gi->gl && n--);
gi->last_pos = *pos;
+
return gi->gl;
}
@@ -1970,6 +1967,7 @@ static void *gfs2_glock_seq_next(struct seq_file *seq, void *iter_ptr,
(*pos)++;
gi->last_pos = *pos;
gfs2_glock_iter_next(gi);
+
return gi->gl;
}
@@ -1980,6 +1978,7 @@ static void gfs2_glock_seq_stop(struct seq_file *seq, void *iter_ptr)
gi->gl = NULL;
rhashtable_walk_stop(&gi->hti);
+ rhashtable_walk_exit(&gi->hti);
}
static int gfs2_glock_seq_show(struct seq_file *seq, void *iter_ptr)
@@ -2042,12 +2041,10 @@ static int __gfs2_glocks_open(struct inode *inode, struct file *file,
struct gfs2_glock_iter *gi = seq->private;
gi->sdp = inode->i_private;
- gi->last_pos = 0;
seq->buf = kmalloc(GFS2_SEQ_GOODSIZE, GFP_KERNEL | __GFP_NOWARN);
if (seq->buf)
seq->size = GFS2_SEQ_GOODSIZE;
gi->gl = NULL;
- rhashtable_walk_enter(&gl_hash_table, &gi->hti);
}
return ret;
}
@@ -2063,7 +2060,6 @@ static int gfs2_glocks_release(struct inode *inode, struct file *file)
struct gfs2_glock_iter *gi = seq->private;
gi->gl = NULL;
- rhashtable_walk_exit(&gi->hti);
return seq_release_private(inode, file);
}
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index dac6559e2195..cdd1c5f06f45 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -554,7 +554,7 @@ static void iopen_go_callback(struct gfs2_glock *gl, bool remote)
struct gfs2_inode *ip = gl->gl_object;
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
- if (!remote || (sdp->sd_vfs->s_flags & MS_RDONLY))
+ if (!remote || sb_rdonly(sdp->sd_vfs))
return;
if (gl->gl_demote_state == LM_ST_UNLOCKED &&
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 84593587691d..a3711f543405 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -1037,7 +1037,7 @@ void gfs2_online_uevent(struct gfs2_sbd *sdp)
char ro[20];
char spectator[20];
char *envp[] = { ro, spectator, NULL };
- sprintf(ro, "RDONLY=%d", (sb->s_flags & MS_RDONLY) ? 1 : 0);
+ sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
kobject_uevent_env(&sdp->sd_kobj, KOBJ_ONLINE, envp);
}
@@ -1179,7 +1179,7 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent
goto fail_per_node;
}
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
error = gfs2_make_fs_rw(sdp);
if (error) {
fs_err(sdp, "can't make FS RW: %d\n", error);
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index e647938432bd..e700fb162664 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -452,7 +452,7 @@ static int qd_fish(struct gfs2_sbd *sdp, struct gfs2_quota_data **qdp)
*qdp = NULL;
- if (sdp->sd_vfs->s_flags & MS_RDONLY)
+ if (sb_rdonly(sdp->sd_vfs))
return 0;
spin_lock(&qd_lock);
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 113b6095a58d..9395a3db1a60 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -522,7 +522,7 @@ void gfs2_recover_func(struct work_struct *work)
if (!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
ro = 1;
} else {
- if (sdp->sd_vfs->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sdp->sd_vfs)) {
/* check if device itself is read-only */
ro = bdev_read_only(sdp->sd_vfs->s_bdev);
if (!ro) {
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 769841185ce5..8e54f2e3a304 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -893,7 +893,7 @@ restart:
}
spin_unlock(&sdp->sd_jindex_spin);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
error = gfs2_make_fs_ro(sdp);
if (error)
gfs2_io_error(sdp);
@@ -1569,7 +1569,7 @@ static void gfs2_evict_inode(struct inode *inode)
return;
}
- if (inode->i_nlink || (sb->s_flags & MS_RDONLY))
+ if (inode->i_nlink || sb_rdonly(sb))
goto out;
if (test_bit(GIF_ALLOC_FAILED, &ip->i_flags)) {
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
index ca1f97ff898c..9eb9d0a1abd9 100644
--- a/fs/gfs2/sys.c
+++ b/fs/gfs2/sys.c
@@ -645,7 +645,7 @@ int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
char *envp[] = { ro, spectator, NULL };
int sysfs_frees_sdp = 0;
- sprintf(ro, "RDONLY=%d", (sb->s_flags & MS_RDONLY) ? 1 : 0);
+ sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
sdp->sd_kobj.kset = gfs2_kset;
diff --git a/fs/hfs/mdb.c b/fs/hfs/mdb.c
index 482081bcdf70..894994d2c885 100644
--- a/fs/hfs/mdb.c
+++ b/fs/hfs/mdb.c
@@ -210,7 +210,7 @@ int hfs_mdb_get(struct super_block *sb)
pr_warn("filesystem is marked locked, mounting read-only.\n");
sb->s_flags |= MS_RDONLY;
}
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
/* Mark the volume uncleanly unmounted in case we crash */
attrib &= cpu_to_be16(~HFS_SB_ATTRIB_UNMNT);
attrib |= cpu_to_be16(HFS_SB_ATTRIB_INCNSTNT);
@@ -259,7 +259,7 @@ void hfs_mdb_commit(struct super_block *sb)
{
struct hfs_mdb *mdb = HFS_SB(sb)->mdb;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
lock_buffer(HFS_SB(sb)->mdb_bh);
@@ -334,7 +334,7 @@ void hfs_mdb_commit(struct super_block *sb)
void hfs_mdb_close(struct super_block *sb)
{
/* update volume attributes */
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
HFS_SB(sb)->mdb->drAtrb |= cpu_to_be16(HFS_SB_ATTRIB_UNMNT);
HFS_SB(sb)->mdb->drAtrb &= cpu_to_be16(~HFS_SB_ATTRIB_INCNSTNT);
diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index bf6304a350a6..7e0d65e9586c 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -71,7 +71,7 @@ void hfs_mark_mdb_dirty(struct super_block *sb)
struct hfs_sb_info *sbi = HFS_SB(sb);
unsigned long delay;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
spin_lock(&sbi->work_lock);
@@ -115,7 +115,7 @@ static int hfs_remount(struct super_block *sb, int *flags, char *data)
{
sync_filesystem(sb);
*flags |= MS_NODIRATIME;
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
return 0;
if (!(*flags & MS_RDONLY)) {
if (!(HFS_SB(sb)->mdb->drAtrb & cpu_to_be16(HFS_SB_ATTRIB_UNMNT))) {
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index 67aedf4c2e7c..e5bb2de2262a 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -264,7 +264,7 @@ void hfsplus_mark_mdb_dirty(struct super_block *sb)
struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb);
unsigned long delay;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
spin_lock(&sbi->work_lock);
@@ -284,7 +284,7 @@ static void hfsplus_put_super(struct super_block *sb)
cancel_delayed_work_sync(&sbi->sync_work);
- if (!(sb->s_flags & MS_RDONLY) && sbi->s_vhdr) {
+ if (!sb_rdonly(sb) && sbi->s_vhdr) {
struct hfsplus_vh *vhdr = sbi->s_vhdr;
vhdr->modify_date = hfsp_now2mt();
@@ -329,7 +329,7 @@ static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf)
static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
{
sync_filesystem(sb);
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
return 0;
if (!(*flags & MS_RDONLY)) {
struct hfsplus_vh *vhdr = HFSPLUS_SB(sb)->s_vhdr;
@@ -462,7 +462,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
pr_warn("Filesystem is marked locked, mounting read-only.\n");
sb->s_flags |= MS_RDONLY;
} else if ((vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) &&
- !(sb->s_flags & MS_RDONLY)) {
+ !sb_rdonly(sb)) {
pr_warn("write access to a journaled filesystem is not supported, use the force option at your own risk, mounting read-only.\n");
sb->s_flags |= MS_RDONLY;
}
@@ -535,7 +535,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
} else
hfs_find_exit(&fd);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
/*
* H+LX == hfsplusutils, H+Lx == this driver, H+lx is unused
* all three are registered with Apple for our use
diff --git a/fs/hpfs/alloc.c b/fs/hpfs/alloc.c
index d6a4b55d2ab0..098bf0f4f386 100644
--- a/fs/hpfs/alloc.c
+++ b/fs/hpfs/alloc.c
@@ -538,7 +538,7 @@ int hpfs_trim_fs(struct super_block *s, u64 start, u64 end, u64 minlen, unsigned
return 0;
if (start < sbi->sb_dirband_start + sbi->sb_dirband_size && end > sbi->sb_dirband_start) {
hpfs_lock(s);
- if (s->s_flags & MS_RDONLY) {
+ if (sb_rdonly(s)) {
err = -EROFS;
goto unlock_1;
}
@@ -559,7 +559,7 @@ unlock_1:
end_bmp = (end + 0x3fff) >> 14;
while (start_bmp < end_bmp && !err) {
hpfs_lock(s);
- if (s->s_flags & MS_RDONLY) {
+ if (sb_rdonly(s)) {
err = -EROFS;
goto unlock_2;
}
diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c
index 7b9150c2e75c..fa6bbb4f509f 100644
--- a/fs/hpfs/dir.c
+++ b/fs/hpfs/dir.c
@@ -264,7 +264,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, unsigned in
hpfs_result = hpfs_i(result);
if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino;
- if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) {
+ if (de->has_acl || de->has_xtd_perm) if (!sb_rdonly(dir->i_sb)) {
hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures");
goto bail1;
}
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c
index 82067ca22f2b..1516fb4e28f4 100644
--- a/fs/hpfs/super.c
+++ b/fs/hpfs/super.c
@@ -21,7 +21,7 @@
static void mark_dirty(struct super_block *s, int remount)
{
- if (hpfs_sb(s)->sb_chkdsk && (remount || !(s->s_flags & MS_RDONLY))) {
+ if (hpfs_sb(s)->sb_chkdsk && (remount || !sb_rdonly(s))) {
struct buffer_head *bh;
struct hpfs_spare_block *sb;
if ((sb = hpfs_map_sector(s, 17, &bh, 0))) {
@@ -41,7 +41,7 @@ static void unmark_dirty(struct super_block *s)
{
struct buffer_head *bh;
struct hpfs_spare_block *sb;
- if (s->s_flags & MS_RDONLY) return;
+ if (sb_rdonly(s)) return;
sync_blockdev(s->s_bdev);
if ((sb = hpfs_map_sector(s, 17, &bh, 0))) {
sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error;
@@ -73,14 +73,14 @@ void hpfs_error(struct super_block *s, const char *fmt, ...)
mark_dirty(s, 0);
panic("HPFS panic");
} else if (hpfs_sb(s)->sb_err == 1) {
- if (s->s_flags & MS_RDONLY)
+ if (sb_rdonly(s))
pr_cont("; already mounted read-only\n");
else {
pr_cont("; remounting read-only\n");
mark_dirty(s, 0);
s->s_flags |= MS_RDONLY;
}
- } else if (s->s_flags & MS_RDONLY)
+ } else if (sb_rdonly(s))
pr_cont("; going on - but anything won't be destroyed because it's read-only\n");
else
pr_cont("; corrupted filesystem mounted read/write - your computer will explode within 20 seconds ... but you wanted it so!\n");
@@ -607,8 +607,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
}
/* Check version */
- if (!(s->s_flags & MS_RDONLY) &&
- superblock->funcversion != 2 && superblock->funcversion != 3) {
+ if (!sb_rdonly(s) && superblock->funcversion != 2 && superblock->funcversion != 3) {
pr_err("Bad version %d,%d. Mount readonly to go around\n",
(int)superblock->version, (int)superblock->funcversion);
pr_err("please try recent version of HPFS driver at http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi and if it still can't understand this format, contact author - [email protected]\n");
@@ -666,7 +665,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
hpfs_error(s, "improperly stopped");
}
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
spareblock->dirty = 1;
spareblock->old_wrote = 0;
mark_buffer_dirty(bh2);
diff --git a/fs/inode.c b/fs/inode.c
index 210054157a49..d1e35b53bb23 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1570,11 +1570,24 @@ EXPORT_SYMBOL(bmap);
static void update_ovl_inode_times(struct dentry *dentry, struct inode *inode,
bool rcu)
{
- if (!rcu) {
- struct inode *realinode = d_real_inode(dentry);
+ struct dentry *upperdentry;
- if (unlikely(inode != realinode) &&
- (!timespec_equal(&inode->i_mtime, &realinode->i_mtime) ||
+ /*
+ * Nothing to do if in rcu or if non-overlayfs
+ */
+ if (rcu || likely(!(dentry->d_flags & DCACHE_OP_REAL)))
+ return;
+
+ upperdentry = d_real(dentry, NULL, 0, D_REAL_UPPER);
+
+ /*
+ * If file is on lower then we can't update atime, so no worries about
+ * stale mtime/ctime.
+ */
+ if (upperdentry) {
+ struct inode *realinode = d_inode(upperdentry);
+
+ if ((!timespec_equal(&inode->i_mtime, &realinode->i_mtime) ||
!timespec_equal(&inode->i_ctime, &realinode->i_ctime))) {
inode->i_mtime = realinode->i_mtime;
inode->i_ctime = realinode->i_ctime;
diff --git a/fs/internal.h b/fs/internal.h
index fedfe94d84ba..48cee21b4f14 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -71,8 +71,10 @@ extern void __init mnt_init(void);
extern int __mnt_want_write(struct vfsmount *);
extern int __mnt_want_write_file(struct file *);
+extern int mnt_want_write_file_path(struct file *);
extern void __mnt_drop_write(struct vfsmount *);
extern void __mnt_drop_write_file(struct file *);
+extern void mnt_drop_write_file_path(struct file *);
/*
* fs_struct.c
diff --git a/fs/iomap.c b/fs/iomap.c
index 269b24a01f32..be61cf742b5e 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -713,8 +713,24 @@ struct iomap_dio {
static ssize_t iomap_dio_complete(struct iomap_dio *dio)
{
struct kiocb *iocb = dio->iocb;
+ struct inode *inode = file_inode(iocb->ki_filp);
ssize_t ret;
+ /*
+ * Try again to invalidate clean pages which might have been cached by
+ * non-direct readahead, or faulted in by get_user_pages() if the source
+ * of the write was an mmap'ed region of the file we're writing. Either
+ * one is a pretty crazy thing to do, so we don't support it 100%. If
+ * this invalidation fails, tough, the write still worked...
+ */
+ if (!dio->error &&
+ (dio->flags & IOMAP_DIO_WRITE) && inode->i_mapping->nrpages) {
+ ret = invalidate_inode_pages2_range(inode->i_mapping,
+ iocb->ki_pos >> PAGE_SHIFT,
+ (iocb->ki_pos + dio->size - 1) >> PAGE_SHIFT);
+ WARN_ON_ONCE(ret);
+ }
+
if (dio->end_io) {
ret = dio->end_io(iocb,
dio->error ? dio->error : dio->size,
@@ -993,6 +1009,13 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
WARN_ON_ONCE(ret);
ret = 0;
+ if (iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) &&
+ !inode->i_sb->s_dio_done_wq) {
+ ret = sb_init_dio_done_wq(inode->i_sb);
+ if (ret < 0)
+ goto out_free_dio;
+ }
+
inode_dio_begin(inode);
blk_start_plug(&plug);
@@ -1015,13 +1038,6 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
if (ret < 0)
iomap_dio_set_error(dio, ret);
- if (ret >= 0 && iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) &&
- !inode->i_sb->s_dio_done_wq) {
- ret = sb_init_dio_done_wq(inode->i_sb);
- if (ret < 0)
- iomap_dio_set_error(dio, ret);
- }
-
if (!atomic_dec_and_test(&dio->ref)) {
if (!is_sync_kiocb(iocb))
return -EIOCBQUEUED;
@@ -1042,19 +1058,6 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
ret = iomap_dio_complete(dio);
- /*
- * Try again to invalidate clean pages which might have been cached by
- * non-direct readahead, or faulted in by get_user_pages() if the source
- * of the write was an mmap'ed region of the file we're writing. Either
- * one is a pretty crazy thing to do, so we don't support it 100%. If
- * this invalidation fails, tough, the write still worked...
- */
- if (iov_iter_rw(iter) == WRITE) {
- int err = invalidate_inode_pages2_range(mapping,
- start >> PAGE_SHIFT, end >> PAGE_SHIFT);
- WARN_ON_ONCE(err);
- }
-
return ret;
out_free_dio:
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index f1ed935322db..447a24d77b89 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -514,9 +514,11 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
if (sbi->s_fmode != ISOFS_INVALID_MODE)
seq_printf(m, ",fmode=%o", sbi->s_fmode);
+#ifdef CONFIG_JOLIET
if (sbi->s_nls_iocharset &&
strcmp(sbi->s_nls_iocharset->charset, CONFIG_NLS_DEFAULT) != 0)
seq_printf(m, ",iocharset=%s", sbi->s_nls_iocharset->charset);
+#endif
return 0;
}
@@ -737,7 +739,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
root_found:
/* We don't support read-write mounts */
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
error = -EACCES;
goto out_freebh;
}
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index 76fa814df3d1..e96c6b05e43e 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -395,14 +395,14 @@ int jffs2_do_remount_fs(struct super_block *sb, int *flags, char *data)
{
struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
- if (c->flags & JFFS2_SB_FLAG_RO && !(sb->s_flags & MS_RDONLY))
+ if (c->flags & JFFS2_SB_FLAG_RO && !sb_rdonly(sb))
return -EROFS;
/* We stop if it was running, then restart if it needs to.
This also catches the case where it was stopped and this
is just a remount to restart it.
Flush the writebuffer, if neccecary, else we loose it */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
jffs2_stop_garbage_collect_thread(c);
mutex_lock(&c->alloc_sem);
jffs2_flush_wbuf_pad(c);
@@ -590,7 +590,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
sb->s_blocksize = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = JFFS2_SUPER_MAGIC;
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
jffs2_start_garbage_collect_thread(c);
return 0;
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index 5ef21f4c4c77..153f1c6eb169 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -342,7 +342,7 @@ static void jffs2_put_super (struct super_block *sb)
static void jffs2_kill_sb(struct super_block *sb)
{
struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
jffs2_stop_garbage_collect_thread(c);
kill_mtd_super(sb);
kfree(c);
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index b25d28a21212..2cfe487708e0 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -17,7 +17,7 @@
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
#include <linux/crc32.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/jiffies.h>
#include <linux/sched.h>
#include <linux/writeback.h>
@@ -1162,7 +1162,7 @@ static void delayed_wbuf_sync(struct work_struct *work)
struct jffs2_sb_info *c = work_to_sb(work);
struct super_block *sb = OFNI_BS_2SFFJ(c);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
jffs2_dbg(1, "%s()\n", __func__);
jffs2_flush_wbuf_gc(c, 0);
}
@@ -1173,7 +1173,7 @@ void jffs2_dirty_trigger(struct jffs2_sb_info *c)
struct super_block *sb = OFNI_BS_2SFFJ(c);
unsigned long delay;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
delay = msecs_to_jiffies(dirty_writeback_interval * 10);
diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c
index 9895595fd2f2..d8658607bf46 100644
--- a/fs/jfs/jfs_mount.c
+++ b/fs/jfs/jfs_mount.c
@@ -362,7 +362,7 @@ static int chkSuper(struct super_block *sb)
/* validate fs state */
if (j_sb->s_state != cpu_to_le32(FM_CLEAN) &&
- !(sb->s_flags & MS_RDONLY)) {
+ !sb_rdonly(sb)) {
jfs_err("jfs_mount: Mount Failure: File System Dirty.");
rc = -EINVAL;
goto out;
diff --git a/fs/jfs/super.c b/fs/jfs/super.c
index 60726ae7cf26..2f14677169c3 100644
--- a/fs/jfs/super.c
+++ b/fs/jfs/super.c
@@ -76,7 +76,7 @@ static void jfs_handle_error(struct super_block *sb)
{
struct jfs_sb_info *sbi = JFS_SBI(sb);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
updateSuper(sb, FM_DIRTY);
@@ -468,7 +468,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)
return -EINVAL;
if (newLVSize) {
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
pr_err("JFS: resize requires volume to be mounted read-write\n");
return -EROFS;
}
@@ -477,7 +477,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)
return rc;
}
- if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
+ if (sb_rdonly(sb) && !(*flags & MS_RDONLY)) {
/*
* Invalidate any previously read metadata. fsck may have
* changed the on-disk data since we mounted r/o
@@ -493,7 +493,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)
dquot_resume(sb, -1);
return ret;
}
- if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb) && (*flags & MS_RDONLY)) {
rc = dquot_suspend(sb, -1);
if (rc < 0)
return rc;
@@ -502,7 +502,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)
return rc;
}
if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY))
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
rc = jfs_umount_rw(sb);
if (rc)
return rc;
@@ -592,7 +592,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
jfs_err("jfs_mount failed w/return code = %d", rc);
goto out_mount_failed;
}
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
sbi->log = NULL;
else {
rc = jfs_mount_rw(sb, 0);
@@ -652,7 +652,7 @@ static int jfs_freeze(struct super_block *sb)
struct jfs_log *log = sbi->log;
int rc = 0;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
txQuiesce(sb);
rc = lmLogShutdown(log);
if (rc) {
@@ -682,7 +682,7 @@ static int jfs_unfreeze(struct super_block *sb)
struct jfs_log *log = sbi->log;
int rc = 0;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
rc = updateSuper(sb, FM_MOUNT);
if (rc) {
jfs_error(sb, "updateSuper failed\n");
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c
index 27d577dbe51a..96c1d14c18f1 100644
--- a/fs/lockd/clntlock.c
+++ b/fs/lockd/clntlock.c
@@ -235,12 +235,8 @@ reclaimer(void *ptr)
struct net *net = host->net;
req = kmalloc(sizeof(*req), GFP_KERNEL);
- if (!req) {
- printk(KERN_ERR "lockd: reclaimer unable to alloc memory."
- " Locks for %s won't be reclaimed!\n",
- host->h_name);
+ if (!req)
return 0;
- }
allow_signal(SIGKILL);
diff --git a/fs/minix/inode.c b/fs/minix/inode.c
index 6ac76b0434e9..b6829d679643 100644
--- a/fs/minix/inode.c
+++ b/fs/minix/inode.c
@@ -42,7 +42,7 @@ static void minix_put_super(struct super_block *sb)
int i;
struct minix_sb_info *sbi = minix_sb(sb);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */
sbi->s_ms->s_state = sbi->s_mount_state;
mark_buffer_dirty(sbi->s_sbh);
@@ -125,7 +125,7 @@ static int minix_remount (struct super_block * sb, int * flags, char * data)
sync_filesystem(sb);
ms = sbi->s_ms;
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
return 0;
if (*flags & MS_RDONLY) {
if (ms->s_state & MINIX_VALID_FS ||
@@ -293,7 +293,7 @@ static int minix_fill_super(struct super_block *s, void *data, int silent)
if (!s->s_root)
goto out_no_root;
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */
ms->s_state &= ~MINIX_VALID_FS;
mark_buffer_dirty(bh);
diff --git a/fs/namei.c b/fs/namei.c
index 1180f9c58093..c75ea03ca147 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -447,8 +447,7 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask)
umode_t mode = inode->i_mode;
/* Nobody gets write access to a read-only fs. */
- if ((sb->s_flags & MS_RDONLY) &&
- (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
+ if (sb_rdonly(sb) && (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
return -EROFS;
}
return 0;
diff --git a/fs/namespace.c b/fs/namespace.c
index f8893dc6a989..54059b142d6b 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -275,7 +275,7 @@ int __mnt_is_readonly(struct vfsmount *mnt)
{
if (mnt->mnt_flags & MNT_READONLY)
return 1;
- if (mnt->mnt_sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(mnt->mnt_sb))
return 1;
return 0;
}
@@ -431,13 +431,18 @@ int __mnt_want_write_file(struct file *file)
}
/**
- * mnt_want_write_file - get write access to a file's mount
+ * mnt_want_write_file_path - get write access to a file's mount
* @file: the file who's mount on which to take a write
*
* This is like mnt_want_write, but it takes a file and can
* do some optimisations if the file is open for write already
+ *
+ * Called by the vfs for cases when we have an open file at hand, but will do an
+ * inode operation on it (important distinction for files opened on overlayfs,
+ * since the file operations will come from the real underlying file, while
+ * inode operations come from the overlay).
*/
-int mnt_want_write_file(struct file *file)
+int mnt_want_write_file_path(struct file *file)
{
int ret;
@@ -447,6 +452,53 @@ int mnt_want_write_file(struct file *file)
sb_end_write(file->f_path.mnt->mnt_sb);
return ret;
}
+
+static inline int may_write_real(struct file *file)
+{
+ struct dentry *dentry = file->f_path.dentry;
+ struct dentry *upperdentry;
+
+ /* Writable file? */
+ if (file->f_mode & FMODE_WRITER)
+ return 0;
+
+ /* Not overlayfs? */
+ if (likely(!(dentry->d_flags & DCACHE_OP_REAL)))
+ return 0;
+
+ /* File refers to upper, writable layer? */
+ upperdentry = d_real(dentry, NULL, 0, D_REAL_UPPER);
+ if (upperdentry && file_inode(file) == d_inode(upperdentry))
+ return 0;
+
+ /* Lower layer: can't write to real file, sorry... */
+ return -EPERM;
+}
+
+/**
+ * mnt_want_write_file - get write access to a file's mount
+ * @file: the file who's mount on which to take a write
+ *
+ * This is like mnt_want_write, but it takes a file and can
+ * do some optimisations if the file is open for write already
+ *
+ * Mostly called by filesystems from their ioctl operation before performing
+ * modification. On overlayfs this needs to check if the file is on a read-only
+ * lower layer and deny access in that case.
+ */
+int mnt_want_write_file(struct file *file)
+{
+ int ret;
+
+ ret = may_write_real(file);
+ if (!ret) {
+ sb_start_write(file_inode(file)->i_sb);
+ ret = __mnt_want_write_file(file);
+ if (ret)
+ sb_end_write(file_inode(file)->i_sb);
+ }
+ return ret;
+}
EXPORT_SYMBOL_GPL(mnt_want_write_file);
/**
@@ -484,10 +536,16 @@ void __mnt_drop_write_file(struct file *file)
__mnt_drop_write(file->f_path.mnt);
}
-void mnt_drop_write_file(struct file *file)
+void mnt_drop_write_file_path(struct file *file)
{
mnt_drop_write(file->f_path.mnt);
}
+
+void mnt_drop_write_file(struct file *file)
+{
+ __mnt_drop_write(file->f_path.mnt);
+ sb_end_write(file_inode(file)->i_sb);
+}
EXPORT_SYMBOL(mnt_drop_write_file);
static int mnt_make_readonly(struct mount *mnt)
@@ -971,7 +1029,7 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
if (!mnt)
return ERR_PTR(-ENOMEM);
- if (flags & MS_KERNMOUNT)
+ if (flags & SB_KERNMOUNT)
mnt->mnt.mnt_flags = MNT_INTERNAL;
root = mount_fs(type, flags, name, data);
@@ -1003,7 +1061,7 @@ vfs_submount(const struct dentry *mountpoint, struct file_system_type *type,
if (mountpoint->d_sb->s_user_ns != &init_user_ns)
return ERR_PTR(-EPERM);
- return vfs_kern_mount(type, MS_SUBMOUNT, name, data);
+ return vfs_kern_mount(type, SB_SUBMOUNT, name, data);
}
EXPORT_SYMBOL_GPL(vfs_submount);
@@ -1124,12 +1182,10 @@ static LLIST_HEAD(delayed_mntput_list);
static void delayed_mntput(struct work_struct *unused)
{
struct llist_node *node = llist_del_all(&delayed_mntput_list);
- struct llist_node *next;
+ struct mount *m, *t;
- for (; node; node = next) {
- next = llist_next(node);
- cleanup_mnt(llist_entry(node, struct mount, mnt_llist));
- }
+ llist_for_each_entry_safe(m, t, node, mnt_llist)
+ cleanup_mnt(m);
}
static DECLARE_DELAYED_WORK(delayed_mntput_work, delayed_mntput);
@@ -1534,8 +1590,8 @@ static int do_umount(struct mount *mnt, int flags)
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
down_write(&sb->s_umount);
- if (!(sb->s_flags & MS_RDONLY))
- retval = do_remount_sb(sb, MS_RDONLY, NULL, 0);
+ if (!sb_rdonly(sb))
+ retval = do_remount_sb(sb, SB_RDONLY, NULL, 0);
up_write(&sb->s_umount);
return retval;
}
@@ -2059,7 +2115,7 @@ static void unlock_mount(struct mountpoint *where)
static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
{
- if (mnt->mnt.mnt_sb->s_flags & MS_NOUSER)
+ if (mnt->mnt.mnt_sb->s_flags & SB_NOUSER)
return -EINVAL;
if (d_is_dir(mp->m_dentry) !=
@@ -2073,9 +2129,9 @@ static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
* Sanity check the flags to change_mnt_propagation.
*/
-static int flags_to_propagation_type(int flags)
+static int flags_to_propagation_type(int ms_flags)
{
- int type = flags & ~(MS_REC | MS_SILENT);
+ int type = ms_flags & ~(MS_REC | MS_SILENT);
/* Fail if any non-propagation flags are set */
if (type & ~(MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
@@ -2089,18 +2145,18 @@ static int flags_to_propagation_type(int flags)
/*
* recursively change the type of the mountpoint.
*/
-static int do_change_type(struct path *path, int flag)
+static int do_change_type(struct path *path, int ms_flags)
{
struct mount *m;
struct mount *mnt = real_mount(path->mnt);
- int recurse = flag & MS_REC;
+ int recurse = ms_flags & MS_REC;
int type;
int err = 0;
if (path->dentry != path->mnt->mnt_root)
return -EINVAL;
- type = flags_to_propagation_type(flag);
+ type = flags_to_propagation_type(ms_flags);
if (!type)
return -EINVAL;
@@ -2222,8 +2278,8 @@ static int change_mount_flags(struct vfsmount *mnt, int ms_flags)
* If you've mounted a non-root directory somewhere and want to do remount
* on it - tough luck.
*/
-static int do_remount(struct path *path, int flags, int mnt_flags,
- void *data)
+static int do_remount(struct path *path, int ms_flags, int sb_flags,
+ int mnt_flags, void *data)
{
int err;
struct super_block *sb = path->mnt->mnt_sb;
@@ -2267,12 +2323,12 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
return err;
down_write(&sb->s_umount);
- if (flags & MS_BIND)
- err = change_mount_flags(path->mnt, flags);
+ if (ms_flags & MS_BIND)
+ err = change_mount_flags(path->mnt, ms_flags);
else if (!capable(CAP_SYS_ADMIN))
err = -EPERM;
else
- err = do_remount_sb(sb, flags, data, 0);
+ err = do_remount_sb(sb, sb_flags, data, 0);
if (!err) {
lock_mount_hash();
mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK;
@@ -2437,7 +2493,7 @@ static bool mount_too_revealing(struct vfsmount *mnt, int *new_mnt_flags);
* create a new mount for userspace and request it to be added into the
* namespace's tree
*/
-static int do_new_mount(struct path *path, const char *fstype, int flags,
+static int do_new_mount(struct path *path, const char *fstype, int sb_flags,
int mnt_flags, const char *name, void *data)
{
struct file_system_type *type;
@@ -2451,7 +2507,7 @@ static int do_new_mount(struct path *path, const char *fstype, int flags,
if (!type)
return -ENODEV;
- mnt = vfs_kern_mount(type, flags, name, data);
+ mnt = vfs_kern_mount(type, sb_flags, name, data);
if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) &&
!mnt->mnt_sb->s_subtype)
mnt = fs_set_subtype(mnt, fstype);
@@ -2706,8 +2762,8 @@ long do_mount(const char *dev_name, const char __user *dir_name,
const char *type_page, unsigned long flags, void *data_page)
{
struct path path;
+ unsigned int mnt_flags = 0, sb_flags;
int retval = 0;
- int mnt_flags = 0;
/* Discard magic */
if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
@@ -2717,6 +2773,9 @@ long do_mount(const char *dev_name, const char __user *dir_name,
if (data_page)
((char *)data_page)[PAGE_SIZE - 1] = 0;
+ if (flags & MS_NOUSER)
+ return -EINVAL;
+
/* ... and get the mountpoint */
retval = user_path(dir_name, &path);
if (retval)
@@ -2726,7 +2785,7 @@ long do_mount(const char *dev_name, const char __user *dir_name,
type_page, flags, data_page);
if (!retval && !may_mount())
retval = -EPERM;
- if (!retval && (flags & MS_MANDLOCK) && !may_mandlock())
+ if (!retval && (flags & SB_MANDLOCK) && !may_mandlock())
retval = -EPERM;
if (retval)
goto dput_out;
@@ -2748,7 +2807,7 @@ long do_mount(const char *dev_name, const char __user *dir_name,
mnt_flags |= MNT_NODIRATIME;
if (flags & MS_STRICTATIME)
mnt_flags &= ~(MNT_RELATIME | MNT_NOATIME);
- if (flags & MS_RDONLY)
+ if (flags & SB_RDONLY)
mnt_flags |= MNT_READONLY;
/* The default atime for remount is preservation */
@@ -2759,12 +2818,15 @@ long do_mount(const char *dev_name, const char __user *dir_name,
mnt_flags |= path.mnt->mnt_flags & MNT_ATIME_MASK;
}
- flags &= ~(MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_ACTIVE | MS_BORN |
- MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT |
- MS_STRICTATIME | MS_NOREMOTELOCK | MS_SUBMOUNT);
+ sb_flags = flags & (SB_RDONLY |
+ SB_SYNCHRONOUS |
+ SB_MANDLOCK |
+ SB_DIRSYNC |
+ SB_SILENT |
+ SB_POSIXACL);
if (flags & MS_REMOUNT)
- retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
+ retval = do_remount(&path, flags, sb_flags, mnt_flags,
data_page);
else if (flags & MS_BIND)
retval = do_loopback(&path, dev_name, flags & MS_REC);
@@ -2773,7 +2835,7 @@ long do_mount(const char *dev_name, const char __user *dir_name,
else if (flags & MS_MOVE)
retval = do_move_mount(&path, dev_name);
else
- retval = do_new_mount(&path, type_page, flags, mnt_flags,
+ retval = do_new_mount(&path, type_page, sb_flags, mnt_flags,
dev_name, data_page);
dput_out:
path_put(&path);
@@ -3223,7 +3285,7 @@ void put_mnt_ns(struct mnt_namespace *ns)
struct vfsmount *kern_mount_data(struct file_system_type *type, void *data)
{
struct vfsmount *mnt;
- mnt = vfs_kern_mount(type, MS_KERNMOUNT, type->name, data);
+ mnt = vfs_kern_mount(type, SB_KERNMOUNT, type->name, data);
if (!IS_ERR(mnt)) {
/*
* it is a longterm mount, don't release mnt until
@@ -3300,7 +3362,7 @@ static bool mnt_already_visible(struct mnt_namespace *ns, struct vfsmount *new,
mnt_flags = mnt->mnt.mnt_flags;
/* Don't miss readonly hidden in the superblock flags */
- if (mnt->mnt.mnt_sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(mnt->mnt.mnt_sb))
mnt_flags |= MNT_LOCK_READONLY;
/* Verify the mount flags are equal to or more permissive
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
index 5427cdf04c5a..14358de173fb 100644
--- a/fs/nfs/callback_proc.c
+++ b/fs/nfs/callback_proc.c
@@ -51,7 +51,7 @@ __be32 nfs4_callback_getattr(void *argp, void *resp,
goto out_iput;
res->size = i_size_read(inode);
res->change_attr = delegation->change_attr;
- if (nfsi->nrequests != 0)
+ if (nfs_have_writebacks(inode))
res->change_attr++;
res->ctime = inode->i_ctime;
res->mtime = inode->i_mtime;
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index d7df5e67b0c1..606dd3871f66 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -1089,7 +1089,7 @@ bool nfs4_delegation_flush_on_close(const struct inode *inode)
delegation = rcu_dereference(nfsi->delegation);
if (delegation == NULL || !(delegation->type & FMODE_WRITE))
goto out;
- if (nfsi->nrequests < delegation->pagemod_limit)
+ if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit)
ret = false;
out:
rcu_read_unlock();
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 3522b1249019..5ceaeb1f6fb6 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2260,7 +2260,6 @@ static int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, str
spin_lock(&inode->i_lock);
retry = false;
}
- res->jiffies = cache->jiffies;
res->cred = cache->cred;
res->mask = cache->mask;
list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru);
@@ -2296,7 +2295,6 @@ static int nfs_access_get_cached_rcu(struct inode *inode, struct rpc_cred *cred,
goto out;
if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
goto out;
- res->jiffies = cache->jiffies;
res->cred = cache->cred;
res->mask = cache->mask;
err = 0;
@@ -2344,7 +2342,6 @@ void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
if (cache == NULL)
return;
RB_CLEAR_NODE(&cache->rb_node);
- cache->jiffies = set->jiffies;
cache->cred = get_rpccred(set->cred);
cache->mask = set->mask;
@@ -2432,7 +2429,6 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
cache.mask = NFS_MAY_LOOKUP | NFS_MAY_EXECUTE
| NFS_MAY_WRITE | NFS_MAY_READ;
cache.cred = cred;
- cache.jiffies = jiffies;
status = NFS_PROTO(inode)->access(inode, &cache);
if (status != 0) {
if (status == -ESTALE) {
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 6fb9fad2d1e6..d2972d537469 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -616,13 +616,13 @@ nfs_direct_write_scan_commit_list(struct inode *inode,
struct list_head *list,
struct nfs_commit_info *cinfo)
{
- spin_lock(&cinfo->inode->i_lock);
+ mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
#ifdef CONFIG_NFS_V4_1
if (cinfo->ds != NULL && cinfo->ds->nwritten != 0)
NFS_SERVER(inode)->pnfs_curr_ld->recover_commit_reqs(list, cinfo);
#endif
nfs_scan_commit_list(&cinfo->mds->list, list, cinfo, 0);
- spin_unlock(&cinfo->inode->i_lock);
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
}
static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index af330c31f627..0214dd1e1060 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -208,21 +208,19 @@ EXPORT_SYMBOL_GPL(nfs_file_mmap);
* fall back to doing a synchronous write.
*/
static int
-nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end, int datasync)
+nfs_file_fsync_commit(struct file *file, int datasync)
{
struct nfs_open_context *ctx = nfs_file_open_context(file);
struct inode *inode = file_inode(file);
- int have_error, do_resend, status;
+ int do_resend, status;
int ret = 0;
dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync);
nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
- have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
status = nfs_commit_inode(inode, FLUSH_SYNC);
- have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
- if (have_error) {
+ if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
ret = xchg(&ctx->error, 0);
if (ret)
goto out;
@@ -247,10 +245,16 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
trace_nfs_fsync_enter(inode);
do {
+ struct nfs_open_context *ctx = nfs_file_open_context(file);
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+ if (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
+ int ret2 = xchg(&ctx->error, 0);
+ if (ret2)
+ ret = ret2;
+ }
if (ret != 0)
break;
- ret = nfs_file_fsync_commit(file, start, end, datasync);
+ ret = nfs_file_fsync_commit(file, datasync);
if (!ret)
ret = pnfs_sync_inode(inode, !!datasync);
/*
@@ -631,11 +635,11 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
if (result <= 0)
goto out;
- result = generic_write_sync(iocb, result);
- if (result < 0)
- goto out;
written = result;
iocb->ki_pos += written;
+ result = generic_write_sync(iocb, written);
+ if (result < 0)
+ goto out;
/* Return error values */
if (nfs_need_check_write(file, inode)) {
@@ -744,15 +748,18 @@ do_setlk(struct file *filp, int cmd, struct file_lock *fl, int is_local)
goto out;
/*
- * Revalidate the cache if the server has time stamps granular
- * enough to detect subsecond changes. Otherwise, clear the
- * cache to prevent missing any changes.
+ * Invalidate cache to prevent missing any changes. If
+ * the file is mapped, clear the page cache as well so
+ * those mappings will be loaded.
*
* This makes locking act as a cache coherency point.
*/
nfs_sync_mapping(filp->f_mapping);
- if (!NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
+ if (!NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) {
nfs_zap_caches(inode);
+ if (mapping_mapped(filp->f_mapping))
+ nfs_revalidate_mapping(inode, filp->f_mapping);
+ }
out:
return status;
}
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 109279d6d91b..134d9f560240 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1285,7 +1285,6 @@ static bool nfs_file_has_buffered_writers(struct nfs_inode *nfsi)
static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
{
- struct nfs_inode *nfsi = NFS_I(inode);
unsigned long ret = 0;
if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
@@ -1315,7 +1314,7 @@ static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr
if ((fattr->valid & NFS_ATTR_FATTR_PRESIZE)
&& (fattr->valid & NFS_ATTR_FATTR_SIZE)
&& i_size_read(inode) == nfs_size_to_loff_t(fattr->pre_size)
- && nfsi->nrequests == 0) {
+ && !nfs_have_writebacks(inode)) {
i_size_write(inode, nfs_size_to_loff_t(fattr->size));
ret |= NFS_INO_INVALID_ATTR;
}
@@ -1823,7 +1822,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
if (new_isize != cur_isize) {
/* Do we perhaps have any outstanding writes, or has
* the file grown beyond our last write? */
- if (nfsi->nrequests == 0 || new_isize > cur_isize) {
+ if (!nfs_have_writebacks(inode) || new_isize > cur_isize) {
i_size_write(inode, new_isize);
if (!have_writers)
invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
@@ -2012,10 +2011,11 @@ static void init_once(void *foo)
INIT_LIST_HEAD(&nfsi->access_cache_entry_lru);
INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
INIT_LIST_HEAD(&nfsi->commit_info.list);
- nfsi->nrequests = 0;
- nfsi->commit_info.ncommit = 0;
+ atomic_long_set(&nfsi->nrequests, 0);
+ atomic_long_set(&nfsi->commit_info.ncommit, 0);
atomic_set(&nfsi->commit_info.rpcs_out, 0);
init_rwsem(&nfsi->rmdir_sem);
+ mutex_init(&nfsi->commit_mutex);
nfs4_init_once(nfsi);
}
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index dc456416d2be..5bdf952f414b 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -251,7 +251,6 @@ int nfs_iocounter_wait(struct nfs_lock_context *l_ctx);
extern const struct nfs_pageio_ops nfs_pgio_rw_ops;
struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *);
void nfs_pgio_header_free(struct nfs_pgio_header *);
-void nfs_pgio_data_destroy(struct nfs_pgio_header *);
int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
struct rpc_cred *cred, const struct nfs_rpc_ops *rpc_ops,
@@ -769,3 +768,10 @@ static inline bool nfs_error_is_fatal(int err)
return false;
}
}
+
+static inline void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
+{
+ ctx->error = error;
+ smp_wmb();
+ set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
+}
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 40bd05f05e74..ac4f10b7f6c1 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -303,6 +303,17 @@ _nfs4_state_protect(struct nfs_client *clp, unsigned long sp4_mode,
struct rpc_cred *newcred = NULL;
rpc_authflavor_t flavor;
+ if (sp4_mode == NFS_SP4_MACH_CRED_CLEANUP ||
+ sp4_mode == NFS_SP4_MACH_CRED_PNFS_CLEANUP) {
+ /* Using machine creds for cleanup operations
+ * is only relevent if the client credentials
+ * might expire. So don't bother for
+ * RPC_AUTH_UNIX. If file was only exported to
+ * sec=sys, the PUTFH would fail anyway.
+ */
+ if ((*clntp)->cl_auth->au_flavor == RPC_AUTH_UNIX)
+ return false;
+ }
if (test_bit(sp4_mode, &clp->cl_sp4_flags)) {
spin_lock(&clp->cl_lock);
if (clp->cl_machine_cred != NULL)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index d90132642340..6c61e2b99635 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1659,12 +1659,52 @@ update:
return state;
}
+static struct inode *
+nfs4_opendata_get_inode(struct nfs4_opendata *data)
+{
+ struct inode *inode;
+
+ switch (data->o_arg.claim) {
+ case NFS4_OPEN_CLAIM_NULL:
+ case NFS4_OPEN_CLAIM_DELEGATE_CUR:
+ case NFS4_OPEN_CLAIM_DELEGATE_PREV:
+ if (!(data->f_attr.valid & NFS_ATTR_FATTR))
+ return ERR_PTR(-EAGAIN);
+ inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh,
+ &data->f_attr, data->f_label);
+ break;
+ default:
+ inode = d_inode(data->dentry);
+ ihold(inode);
+ nfs_refresh_inode(inode, &data->f_attr);
+ }
+ return inode;
+}
+
static struct nfs4_state *
-_nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
+nfs4_opendata_find_nfs4_state(struct nfs4_opendata *data)
{
+ struct nfs4_state *state;
struct inode *inode;
- struct nfs4_state *state = NULL;
- int ret;
+
+ inode = nfs4_opendata_get_inode(data);
+ if (IS_ERR(inode))
+ return ERR_CAST(inode);
+ if (data->state != NULL && data->state->inode == inode) {
+ state = data->state;
+ atomic_inc(&state->count);
+ } else
+ state = nfs4_get_open_state(inode, data->owner);
+ iput(inode);
+ if (state == NULL)
+ state = ERR_PTR(-ENOMEM);
+ return state;
+}
+
+static struct nfs4_state *
+_nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
+{
+ struct nfs4_state *state;
if (!data->rpc_done) {
state = nfs4_try_open_cached(data);
@@ -1672,29 +1712,17 @@ _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
goto out;
}
- ret = -EAGAIN;
- if (!(data->f_attr.valid & NFS_ATTR_FATTR))
- goto err;
- inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr, data->f_label);
- ret = PTR_ERR(inode);
- if (IS_ERR(inode))
- goto err;
- ret = -ENOMEM;
- state = nfs4_get_open_state(inode, data->owner);
- if (state == NULL)
- goto err_put_inode;
+ state = nfs4_opendata_find_nfs4_state(data);
+ if (IS_ERR(state))
+ goto out;
+
if (data->o_res.delegation_type != 0)
nfs4_opendata_check_deleg(data, state);
update_open_stateid(state, &data->o_res.stateid, NULL,
data->o_arg.fmode);
- iput(inode);
out:
nfs_release_seqid(data->o_arg.seqid);
return state;
-err_put_inode:
- iput(inode);
-err:
- return ERR_PTR(ret);
}
static struct nfs4_state *
@@ -2071,7 +2099,6 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
case NFS4_OPEN_CLAIM_FH:
task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
- nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
}
data->timestamp = jiffies;
if (nfs4_setup_sequence(data->o_arg.server->nfs_client,
@@ -2258,7 +2285,6 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
mask = NFS4_ACCESS_READ;
cache.cred = cred;
- cache.jiffies = jiffies;
nfs_access_set_mask(&cache, opendata->o_res.access_result);
nfs_access_add_cache(state->inode, &cache);
@@ -7318,7 +7344,9 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
1 << (OP_DESTROY_SESSION - 32) |
1 << (OP_DESTROY_CLIENTID - 32)
};
+ unsigned long flags = 0;
unsigned int i;
+ int ret = 0;
if (sp->how == SP4_MACH_CRED) {
/* Print state protect result */
@@ -7334,7 +7362,8 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
for (i = 0; i < NFS4_OP_MAP_NUM_WORDS; i++) {
if (sp->enforce.u.words[i] & ~supported_enforce[i]) {
dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
- return -EINVAL;
+ ret = -EINVAL;
+ goto out;
}
}
@@ -7353,10 +7382,11 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
test_bit(OP_DESTROY_CLIENTID, sp->enforce.u.longs)) {
dfprintk(MOUNT, "sp4_mach_cred:\n");
dfprintk(MOUNT, " minimal mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_MINIMAL, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_MINIMAL, &flags);
} else {
dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
- return -EINVAL;
+ ret = -EINVAL;
+ goto out;
}
if (test_bit(OP_CLOSE, sp->allow.u.longs) &&
@@ -7364,110 +7394,46 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
test_bit(OP_DELEGRETURN, sp->allow.u.longs) &&
test_bit(OP_LOCKU, sp->allow.u.longs)) {
dfprintk(MOUNT, " cleanup mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_CLEANUP, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_CLEANUP, &flags);
}
if (test_bit(OP_LAYOUTRETURN, sp->allow.u.longs)) {
dfprintk(MOUNT, " pnfs cleanup mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_PNFS_CLEANUP,
- &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_PNFS_CLEANUP, &flags);
}
if (test_bit(OP_SECINFO, sp->allow.u.longs) &&
test_bit(OP_SECINFO_NO_NAME, sp->allow.u.longs)) {
dfprintk(MOUNT, " secinfo mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_SECINFO, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_SECINFO, &flags);
}
if (test_bit(OP_TEST_STATEID, sp->allow.u.longs) &&
test_bit(OP_FREE_STATEID, sp->allow.u.longs)) {
dfprintk(MOUNT, " stateid mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_STATEID, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_STATEID, &flags);
}
if (test_bit(OP_WRITE, sp->allow.u.longs)) {
dfprintk(MOUNT, " write mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_WRITE, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_WRITE, &flags);
}
if (test_bit(OP_COMMIT, sp->allow.u.longs)) {
dfprintk(MOUNT, " commit mode enabled\n");
- set_bit(NFS_SP4_MACH_CRED_COMMIT, &clp->cl_sp4_flags);
+ __set_bit(NFS_SP4_MACH_CRED_COMMIT, &flags);
}
}
-
+out:
+ clp->cl_sp4_flags = flags;
return 0;
}
struct nfs41_exchange_id_data {
struct nfs41_exchange_id_res res;
struct nfs41_exchange_id_args args;
- struct rpc_xprt *xprt;
- int rpc_status;
};
-static void nfs4_exchange_id_done(struct rpc_task *task, void *data)
-{
- struct nfs41_exchange_id_data *cdata =
- (struct nfs41_exchange_id_data *)data;
- struct nfs_client *clp = cdata->args.client;
- int status = task->tk_status;
-
- trace_nfs4_exchange_id(clp, status);
-
- if (status == 0)
- status = nfs4_check_cl_exchange_flags(cdata->res.flags);
-
- if (cdata->xprt && status == 0) {
- status = nfs4_detect_session_trunking(clp, &cdata->res,
- cdata->xprt);
- goto out;
- }
-
- if (status == 0)
- status = nfs4_sp4_select_mode(clp, &cdata->res.state_protect);
-
- if (status == 0) {
- clp->cl_clientid = cdata->res.clientid;
- clp->cl_exchange_flags = cdata->res.flags;
- clp->cl_seqid = cdata->res.seqid;
- /* Client ID is not confirmed */
- if (!(cdata->res.flags & EXCHGID4_FLAG_CONFIRMED_R))
- clear_bit(NFS4_SESSION_ESTABLISHED,
- &clp->cl_session->session_state);
-
- kfree(clp->cl_serverowner);
- clp->cl_serverowner = cdata->res.server_owner;
- cdata->res.server_owner = NULL;
-
- /* use the most recent implementation id */
- kfree(clp->cl_implid);
- clp->cl_implid = cdata->res.impl_id;
- cdata->res.impl_id = NULL;
-
- if (clp->cl_serverscope != NULL &&
- !nfs41_same_server_scope(clp->cl_serverscope,
- cdata->res.server_scope)) {
- dprintk("%s: server_scope mismatch detected\n",
- __func__);
- set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state);
- kfree(clp->cl_serverscope);
- clp->cl_serverscope = NULL;
- }
-
- if (clp->cl_serverscope == NULL) {
- clp->cl_serverscope = cdata->res.server_scope;
- cdata->res.server_scope = NULL;
- }
- /* Save the EXCHANGE_ID verifier session trunk tests */
- memcpy(clp->cl_confirm.data, cdata->args.verifier.data,
- sizeof(clp->cl_confirm.data));
- }
-out:
- cdata->rpc_status = status;
- return;
-}
-
static void nfs4_exchange_id_release(void *data)
{
struct nfs41_exchange_id_data *cdata =
@@ -7481,7 +7447,6 @@ static void nfs4_exchange_id_release(void *data)
}
static const struct rpc_call_ops nfs4_exchange_id_call_ops = {
- .rpc_call_done = nfs4_exchange_id_done,
.rpc_release = nfs4_exchange_id_release,
};
@@ -7490,7 +7455,8 @@ static const struct rpc_call_ops nfs4_exchange_id_call_ops = {
*
* Wrapper for EXCHANGE_ID operation.
*/
-static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
+static struct rpc_task *
+nfs4_run_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
u32 sp4_how, struct rpc_xprt *xprt)
{
struct rpc_message msg = {
@@ -7504,17 +7470,15 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
.flags = RPC_TASK_TIMEOUT,
};
struct nfs41_exchange_id_data *calldata;
- struct rpc_task *task;
int status;
if (!atomic_inc_not_zero(&clp->cl_count))
- return -EIO;
+ return ERR_PTR(-EIO);
+ status = -ENOMEM;
calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
- if (!calldata) {
- nfs_put_client(clp);
- return -ENOMEM;
- }
+ if (!calldata)
+ goto out;
nfs4_init_boot_verifier(clp, &calldata->args.verifier);
@@ -7553,34 +7517,22 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
goto out_impl_id;
}
if (xprt) {
- calldata->xprt = xprt;
task_setup_data.rpc_xprt = xprt;
task_setup_data.flags |= RPC_TASK_SOFTCONN;
memcpy(calldata->args.verifier.data, clp->cl_confirm.data,
sizeof(calldata->args.verifier.data));
}
calldata->args.client = clp;
-#ifdef CONFIG_NFS_V4_1_MIGRATION
calldata->args.flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
- EXCHGID4_FLAG_BIND_PRINC_STATEID |
- EXCHGID4_FLAG_SUPP_MOVED_MIGR,
-#else
- calldata->args.flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
- EXCHGID4_FLAG_BIND_PRINC_STATEID,
+ EXCHGID4_FLAG_BIND_PRINC_STATEID;
+#ifdef CONFIG_NFS_V4_1_MIGRATION
+ calldata->args.flags |= EXCHGID4_FLAG_SUPP_MOVED_MIGR;
#endif
msg.rpc_argp = &calldata->args;
msg.rpc_resp = &calldata->res;
task_setup_data.callback_data = calldata;
- task = rpc_run_task(&task_setup_data);
- if (IS_ERR(task))
- return PTR_ERR(task);
-
- status = calldata->rpc_status;
-
- rpc_put_task(task);
-out:
- return status;
+ return rpc_run_task(&task_setup_data);
out_impl_id:
kfree(calldata->res.impl_id);
@@ -7590,8 +7542,69 @@ out_server_owner:
kfree(calldata->res.server_owner);
out_calldata:
kfree(calldata);
+out:
nfs_put_client(clp);
- goto out;
+ return ERR_PTR(status);
+}
+
+/*
+ * _nfs4_proc_exchange_id()
+ *
+ * Wrapper for EXCHANGE_ID operation.
+ */
+static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
+ u32 sp4_how)
+{
+ struct rpc_task *task;
+ struct nfs41_exchange_id_args *argp;
+ struct nfs41_exchange_id_res *resp;
+ int status;
+
+ task = nfs4_run_exchange_id(clp, cred, sp4_how, NULL);
+ if (IS_ERR(task))
+ return PTR_ERR(task);
+
+ argp = task->tk_msg.rpc_argp;
+ resp = task->tk_msg.rpc_resp;
+ status = task->tk_status;
+ if (status != 0)
+ goto out;
+
+ status = nfs4_check_cl_exchange_flags(resp->flags);
+ if (status != 0)
+ goto out;
+
+ status = nfs4_sp4_select_mode(clp, &resp->state_protect);
+ if (status != 0)
+ goto out;
+
+ clp->cl_clientid = resp->clientid;
+ clp->cl_exchange_flags = resp->flags;
+ clp->cl_seqid = resp->seqid;
+ /* Client ID is not confirmed */
+ if (!(resp->flags & EXCHGID4_FLAG_CONFIRMED_R))
+ clear_bit(NFS4_SESSION_ESTABLISHED,
+ &clp->cl_session->session_state);
+
+ if (clp->cl_serverscope != NULL &&
+ !nfs41_same_server_scope(clp->cl_serverscope,
+ resp->server_scope)) {
+ dprintk("%s: server_scope mismatch detected\n",
+ __func__);
+ set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state);
+ }
+
+ swap(clp->cl_serverowner, resp->server_owner);
+ swap(clp->cl_serverscope, resp->server_scope);
+ swap(clp->cl_implid, resp->impl_id);
+
+ /* Save the EXCHANGE_ID verifier session trunk tests */
+ memcpy(clp->cl_confirm.data, argp->verifier.data,
+ sizeof(clp->cl_confirm.data));
+out:
+ trace_nfs4_exchange_id(clp, status);
+ rpc_put_task(task);
+ return status;
}
/*
@@ -7614,13 +7627,13 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
/* try SP4_MACH_CRED if krb5i/p */
if (authflavor == RPC_AUTH_GSS_KRB5I ||
authflavor == RPC_AUTH_GSS_KRB5P) {
- status = _nfs4_proc_exchange_id(clp, cred, SP4_MACH_CRED, NULL);
+ status = _nfs4_proc_exchange_id(clp, cred, SP4_MACH_CRED);
if (!status)
return 0;
}
/* try SP4_NONE */
- return _nfs4_proc_exchange_id(clp, cred, SP4_NONE, NULL);
+ return _nfs4_proc_exchange_id(clp, cred, SP4_NONE);
}
/**
@@ -7642,6 +7655,9 @@ int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
void *data)
{
struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
+ struct rpc_task *task;
+ int status;
+
u32 sp4_how;
dprintk("--> %s try %s\n", __func__,
@@ -7650,7 +7666,17 @@ int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
sp4_how = (adata->clp->cl_sp4_flags == 0 ? SP4_NONE : SP4_MACH_CRED);
/* Test connection for session trunking. Async exchange_id call */
- return _nfs4_proc_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
+ task = nfs4_run_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
+ if (IS_ERR(task))
+ return PTR_ERR(task);
+
+ status = task->tk_status;
+ if (status == 0)
+ status = nfs4_detect_session_trunking(adata->clp,
+ task->tk_msg.rpc_resp, xprt);
+
+ rpc_put_task(task);
+ return status;
}
EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
diff --git a/fs/nfs/nfstrace.h b/fs/nfs/nfstrace.h
index 2ca9167bc97d..551711042ba4 100644
--- a/fs/nfs/nfstrace.h
+++ b/fs/nfs/nfstrace.h
@@ -719,6 +719,254 @@ TRACE_EVENT(nfs_sillyrename_unlink,
__get_str(name)
)
);
+
+TRACE_EVENT(nfs_initiate_read,
+ TP_PROTO(
+ const struct inode *inode,
+ loff_t offset, unsigned long count
+ ),
+
+ TP_ARGS(inode, offset, count),
+
+ TP_STRUCT__entry(
+ __field(loff_t, offset)
+ __field(unsigned long, count)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->offset = offset;
+ __entry->count = count;
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld count=%lu",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->count
+ )
+);
+
+TRACE_EVENT(nfs_readpage_done,
+ TP_PROTO(
+ const struct inode *inode,
+ int status, loff_t offset, bool eof
+ ),
+
+ TP_ARGS(inode, status, offset, eof),
+
+ TP_STRUCT__entry(
+ __field(int, status)
+ __field(loff_t, offset)
+ __field(bool, eof)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->status = status;
+ __entry->offset = offset;
+ __entry->eof = eof;
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld status=%d%s",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->status,
+ __entry->eof ? " eof" : ""
+ )
+);
+
+/*
+ * XXX: I tried using NFS_UNSTABLE and friends in this table, but they
+ * all evaluate to 0 for some reason, even if I include linux/nfs.h.
+ */
+#define nfs_show_stable(stable) \
+ __print_symbolic(stable, \
+ { 0, " (UNSTABLE)" }, \
+ { 1, " (DATA_SYNC)" }, \
+ { 2, " (FILE_SYNC)" })
+
+TRACE_EVENT(nfs_initiate_write,
+ TP_PROTO(
+ const struct inode *inode,
+ loff_t offset, unsigned long count,
+ enum nfs3_stable_how stable
+ ),
+
+ TP_ARGS(inode, offset, count, stable),
+
+ TP_STRUCT__entry(
+ __field(loff_t, offset)
+ __field(unsigned long, count)
+ __field(enum nfs3_stable_how, stable)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->offset = offset;
+ __entry->count = count;
+ __entry->stable = stable;
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld count=%lu stable=%d%s",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->count,
+ __entry->stable, nfs_show_stable(__entry->stable)
+ )
+);
+
+TRACE_EVENT(nfs_writeback_done,
+ TP_PROTO(
+ const struct inode *inode,
+ int status,
+ loff_t offset,
+ struct nfs_writeverf *writeverf
+ ),
+
+ TP_ARGS(inode, status, offset, writeverf),
+
+ TP_STRUCT__entry(
+ __field(int, status)
+ __field(loff_t, offset)
+ __field(enum nfs3_stable_how, stable)
+ __field(unsigned long long, verifier)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->status = status;
+ __entry->offset = offset;
+ __entry->stable = writeverf->committed;
+ memcpy(&__entry->verifier, &writeverf->verifier,
+ sizeof(__entry->verifier));
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld status=%d stable=%d%s "
+ "verifier 0x%016llx",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->status,
+ __entry->stable, nfs_show_stable(__entry->stable),
+ __entry->verifier
+ )
+);
+
+TRACE_EVENT(nfs_initiate_commit,
+ TP_PROTO(
+ const struct nfs_commit_data *data
+ ),
+
+ TP_ARGS(data),
+
+ TP_STRUCT__entry(
+ __field(loff_t, offset)
+ __field(unsigned long, count)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct inode *inode = data->inode;
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->offset = data->args.offset;
+ __entry->count = data->args.count;
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld count=%lu",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->count
+ )
+);
+
+TRACE_EVENT(nfs_commit_done,
+ TP_PROTO(
+ const struct nfs_commit_data *data
+ ),
+
+ TP_ARGS(data),
+
+ TP_STRUCT__entry(
+ __field(int, status)
+ __field(loff_t, offset)
+ __field(unsigned long long, verifier)
+ __field(dev_t, dev)
+ __field(u32, fhandle)
+ __field(u64, fileid)
+ ),
+
+ TP_fast_assign(
+ const struct inode *inode = data->inode;
+ const struct nfs_inode *nfsi = NFS_I(inode);
+
+ __entry->status = data->res.op_status;
+ __entry->offset = data->args.offset;
+ memcpy(&__entry->verifier, &data->verf.verifier,
+ sizeof(__entry->verifier));
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->fileid = nfsi->fileid;
+ __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
+ ),
+
+ TP_printk(
+ "fileid=%02x:%02x:%llu fhandle=0x%08x "
+ "offset=%lld status=%d verifier 0x%016llx",
+ MAJOR(__entry->dev), MINOR(__entry->dev),
+ (unsigned long long)__entry->fileid,
+ __entry->fhandle,
+ __entry->offset, __entry->status,
+ __entry->verifier
+ )
+);
+
#endif /* _TRACE_NFS_H */
#undef TRACE_INCLUDE_PATH
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index de9066a92c0d..d0543e19098a 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -134,19 +134,14 @@ EXPORT_SYMBOL_GPL(nfs_async_iocounter_wait);
/*
* nfs_page_group_lock - lock the head of the page group
* @req - request in group that is to be locked
- * @nonblock - if true don't block waiting for lock
*
- * this lock must be held if modifying the page group list
+ * this lock must be held when traversing or modifying the page
+ * group list
*
- * return 0 on success, < 0 on error: -EDELAY if nonblocking or the
- * result from wait_on_bit_lock
- *
- * NOTE: calling with nonblock=false should always have set the
- * lock bit (see fs/buffer.c and other uses of wait_on_bit_lock
- * with TASK_UNINTERRUPTIBLE), so there is no need to check the result.
+ * return 0 on success, < 0 on error
*/
int
-nfs_page_group_lock(struct nfs_page *req, bool nonblock)
+nfs_page_group_lock(struct nfs_page *req)
{
struct nfs_page *head = req->wb_head;
@@ -155,35 +150,10 @@ nfs_page_group_lock(struct nfs_page *req, bool nonblock)
if (!test_and_set_bit(PG_HEADLOCK, &head->wb_flags))
return 0;
- if (!nonblock) {
- set_bit(PG_CONTENDED1, &head->wb_flags);
- smp_mb__after_atomic();
- return wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK,
- TASK_UNINTERRUPTIBLE);
- }
-
- return -EAGAIN;
-}
-
-/*
- * nfs_page_group_lock_wait - wait for the lock to clear, but don't grab it
- * @req - a request in the group
- *
- * This is a blocking call to wait for the group lock to be cleared.
- */
-void
-nfs_page_group_lock_wait(struct nfs_page *req)
-{
- struct nfs_page *head = req->wb_head;
-
- WARN_ON_ONCE(head != head->wb_head);
-
- if (!test_bit(PG_HEADLOCK, &head->wb_flags))
- return;
set_bit(PG_CONTENDED1, &head->wb_flags);
smp_mb__after_atomic();
- wait_on_bit(&head->wb_flags, PG_HEADLOCK,
- TASK_UNINTERRUPTIBLE);
+ return wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK,
+ TASK_UNINTERRUPTIBLE);
}
/*
@@ -246,7 +216,7 @@ bool nfs_page_group_sync_on_bit(struct nfs_page *req, unsigned int bit)
{
bool ret;
- nfs_page_group_lock(req, false);
+ nfs_page_group_lock(req);
ret = nfs_page_group_sync_on_bit_locked(req, bit);
nfs_page_group_unlock(req);
@@ -288,9 +258,7 @@ nfs_page_group_init(struct nfs_page *req, struct nfs_page *prev)
inode = page_file_mapping(req->wb_page)->host;
set_bit(PG_INODE_REF, &req->wb_flags);
kref_get(&req->wb_kref);
- spin_lock(&inode->i_lock);
- NFS_I(inode)->nrequests++;
- spin_unlock(&inode->i_lock);
+ atomic_long_inc(&NFS_I(inode)->nrequests);
}
}
}
@@ -306,14 +274,11 @@ static void
nfs_page_group_destroy(struct kref *kref)
{
struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref);
+ struct nfs_page *head = req->wb_head;
struct nfs_page *tmp, *next;
- /* subrequests must release the ref on the head request */
- if (req->wb_head != req)
- nfs_release_request(req->wb_head);
-
if (!nfs_page_group_sync_on_bit(req, PG_TEARDOWN))
- return;
+ goto out;
tmp = req;
do {
@@ -324,6 +289,10 @@ nfs_page_group_destroy(struct kref *kref)
nfs_free_request(tmp);
tmp = next;
} while (tmp != req);
+out:
+ /* subrequests must release the ref on the head request */
+ if (head != req)
+ nfs_release_request(head);
}
/**
@@ -465,6 +434,7 @@ void nfs_release_request(struct nfs_page *req)
{
kref_put(&req->wb_kref, nfs_page_group_destroy);
}
+EXPORT_SYMBOL_GPL(nfs_release_request);
/**
* nfs_wait_on_request - Wait for a request to complete.
@@ -483,6 +453,7 @@ nfs_wait_on_request(struct nfs_page *req)
return wait_on_bit_io(&req->wb_flags, PG_BUSY,
TASK_UNINTERRUPTIBLE);
}
+EXPORT_SYMBOL_GPL(nfs_wait_on_request);
/*
* nfs_generic_pg_test - determine if requests can be coalesced
@@ -530,16 +501,6 @@ struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *ops)
}
EXPORT_SYMBOL_GPL(nfs_pgio_header_alloc);
-/*
- * nfs_pgio_header_free - Free a read or write header
- * @hdr: The header to free
- */
-void nfs_pgio_header_free(struct nfs_pgio_header *hdr)
-{
- hdr->rw_ops->rw_free_header(hdr);
-}
-EXPORT_SYMBOL_GPL(nfs_pgio_header_free);
-
/**
* nfs_pgio_data_destroy - make @hdr suitable for reuse
*
@@ -548,14 +509,24 @@ EXPORT_SYMBOL_GPL(nfs_pgio_header_free);
*
* @hdr: A header that has had nfs_generic_pgio called
*/
-void nfs_pgio_data_destroy(struct nfs_pgio_header *hdr)
+static void nfs_pgio_data_destroy(struct nfs_pgio_header *hdr)
{
if (hdr->args.context)
put_nfs_open_context(hdr->args.context);
if (hdr->page_array.pagevec != hdr->page_array.page_array)
kfree(hdr->page_array.pagevec);
}
-EXPORT_SYMBOL_GPL(nfs_pgio_data_destroy);
+
+/*
+ * nfs_pgio_header_free - Free a read or write header
+ * @hdr: The header to free
+ */
+void nfs_pgio_header_free(struct nfs_pgio_header *hdr)
+{
+ nfs_pgio_data_destroy(hdr);
+ hdr->rw_ops->rw_free_header(hdr);
+}
+EXPORT_SYMBOL_GPL(nfs_pgio_header_free);
/**
* nfs_pgio_rpcsetup - Set up arguments for a pageio call
@@ -669,7 +640,6 @@ EXPORT_SYMBOL_GPL(nfs_initiate_pgio);
static void nfs_pgio_error(struct nfs_pgio_header *hdr)
{
set_bit(NFS_IOHDR_REDO, &hdr->flags);
- nfs_pgio_data_destroy(hdr);
hdr->completion_ops->completion(hdr);
}
@@ -680,7 +650,6 @@ static void nfs_pgio_error(struct nfs_pgio_header *hdr)
static void nfs_pgio_release(void *calldata)
{
struct nfs_pgio_header *hdr = calldata;
- nfs_pgio_data_destroy(hdr);
hdr->completion_ops->completion(hdr);
}
@@ -711,12 +680,8 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
const struct nfs_pgio_completion_ops *compl_ops,
const struct nfs_rw_ops *rw_ops,
size_t bsize,
- int io_flags,
- gfp_t gfp_flags)
+ int io_flags)
{
- struct nfs_pgio_mirror *new;
- int i;
-
desc->pg_moreio = 0;
desc->pg_inode = inode;
desc->pg_ops = pg_ops;
@@ -732,23 +697,10 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
desc->pg_mirror_count = 1;
desc->pg_mirror_idx = 0;
- if (pg_ops->pg_get_mirror_count) {
- /* until we have a request, we don't have an lseg and no
- * idea how many mirrors there will be */
- new = kcalloc(NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX,
- sizeof(struct nfs_pgio_mirror), gfp_flags);
- desc->pg_mirrors_dynamic = new;
- desc->pg_mirrors = new;
-
- for (i = 0; i < NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX; i++)
- nfs_pageio_mirror_init(&desc->pg_mirrors[i], bsize);
- } else {
- desc->pg_mirrors_dynamic = NULL;
- desc->pg_mirrors = desc->pg_mirrors_static;
- nfs_pageio_mirror_init(&desc->pg_mirrors[0], bsize);
- }
+ desc->pg_mirrors_dynamic = NULL;
+ desc->pg_mirrors = desc->pg_mirrors_static;
+ nfs_pageio_mirror_init(&desc->pg_mirrors[0], bsize);
}
-EXPORT_SYMBOL_GPL(nfs_pageio_init);
/**
* nfs_pgio_result - Basic pageio error handling
@@ -865,32 +817,52 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
return ret;
}
+static struct nfs_pgio_mirror *
+nfs_pageio_alloc_mirrors(struct nfs_pageio_descriptor *desc,
+ unsigned int mirror_count)
+{
+ struct nfs_pgio_mirror *ret;
+ unsigned int i;
+
+ kfree(desc->pg_mirrors_dynamic);
+ desc->pg_mirrors_dynamic = NULL;
+ if (mirror_count == 1)
+ return desc->pg_mirrors_static;
+ ret = kmalloc_array(mirror_count, sizeof(*ret), GFP_NOFS);
+ if (ret != NULL) {
+ for (i = 0; i < mirror_count; i++)
+ nfs_pageio_mirror_init(&ret[i], desc->pg_bsize);
+ desc->pg_mirrors_dynamic = ret;
+ }
+ return ret;
+}
+
/*
* nfs_pageio_setup_mirroring - determine if mirroring is to be used
* by calling the pg_get_mirror_count op
*/
-static int nfs_pageio_setup_mirroring(struct nfs_pageio_descriptor *pgio,
+static void nfs_pageio_setup_mirroring(struct nfs_pageio_descriptor *pgio,
struct nfs_page *req)
{
- int mirror_count = 1;
-
- if (!pgio->pg_ops->pg_get_mirror_count)
- return 0;
+ unsigned int mirror_count = 1;
- mirror_count = pgio->pg_ops->pg_get_mirror_count(pgio, req);
-
- if (pgio->pg_error < 0)
- return pgio->pg_error;
-
- if (!mirror_count || mirror_count > NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX)
- return -EINVAL;
+ if (pgio->pg_ops->pg_get_mirror_count)
+ mirror_count = pgio->pg_ops->pg_get_mirror_count(pgio, req);
+ if (mirror_count == pgio->pg_mirror_count || pgio->pg_error < 0)
+ return;
- if (WARN_ON_ONCE(!pgio->pg_mirrors_dynamic))
- return -EINVAL;
+ if (!mirror_count || mirror_count > NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX) {
+ pgio->pg_error = -EINVAL;
+ return;
+ }
+ pgio->pg_mirrors = nfs_pageio_alloc_mirrors(pgio, mirror_count);
+ if (pgio->pg_mirrors == NULL) {
+ pgio->pg_error = -ENOMEM;
+ pgio->pg_mirrors = pgio->pg_mirrors_static;
+ mirror_count = 1;
+ }
pgio->pg_mirror_count = mirror_count;
-
- return 0;
}
/*
@@ -1036,7 +1008,7 @@ static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
unsigned int bytes_left = 0;
unsigned int offset, pgbase;
- nfs_page_group_lock(req, false);
+ nfs_page_group_lock(req);
subreq = req;
bytes_left = subreq->wb_bytes;
@@ -1058,7 +1030,7 @@ static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
if (mirror->pg_recoalesce)
return 0;
/* retry add_request for this subreq */
- nfs_page_group_lock(req, false);
+ nfs_page_group_lock(req);
continue;
}
@@ -1155,7 +1127,7 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
for (midx = 0; midx < desc->pg_mirror_count; midx++) {
if (midx) {
- nfs_page_group_lock(req, false);
+ nfs_page_group_lock(req);
/* find the last request */
for (lastreq = req->wb_head;
@@ -1198,8 +1170,8 @@ out_failed:
/* remember fatal errors */
if (nfs_error_is_fatal(desc->pg_error))
- mapping_set_error(desc->pg_inode->i_mapping,
- desc->pg_error);
+ nfs_context_set_write_error(req->wb_context,
+ desc->pg_error);
func = desc->pg_completion_ops->error_cleanup;
for (midx = 0; midx < desc->pg_mirror_count; midx++) {
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index c383d0913b54..3bcd669a3152 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -529,47 +529,6 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg)
}
EXPORT_SYMBOL_GPL(pnfs_put_lseg);
-static void pnfs_free_lseg_async_work(struct work_struct *work)
-{
- struct pnfs_layout_segment *lseg;
- struct pnfs_layout_hdr *lo;
-
- lseg = container_of(work, struct pnfs_layout_segment, pls_work);
- lo = lseg->pls_layout;
-
- pnfs_free_lseg(lseg);
- pnfs_put_layout_hdr(lo);
-}
-
-static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg)
-{
- INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work);
- schedule_work(&lseg->pls_work);
-}
-
-void
-pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg)
-{
- if (!lseg)
- return;
-
- assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock);
-
- dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
- atomic_read(&lseg->pls_refcount),
- test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
- if (atomic_dec_and_test(&lseg->pls_refcount)) {
- struct pnfs_layout_hdr *lo = lseg->pls_layout;
- if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags))
- return;
- pnfs_layout_remove_lseg(lo, lseg);
- if (!pnfs_cache_lseg_for_layoutreturn(lo, lseg)) {
- pnfs_get_layout_hdr(lo);
- pnfs_free_lseg_async(lseg);
- }
- }
-}
-
/*
* is l2 fully contained in l1?
* start1 end1
@@ -1705,7 +1664,7 @@ pnfs_update_layout(struct inode *ino,
.offset = pos,
.length = count,
};
- unsigned pg_offset, seq;
+ unsigned pg_offset;
struct nfs_server *server = NFS_SERVER(ino);
struct nfs_client *clp = server->nfs_client;
struct pnfs_layout_hdr *lo = NULL;
@@ -1795,10 +1754,14 @@ lookup_again:
}
first = true;
- do {
- seq = read_seqbegin(&ctx->state->seqlock);
- nfs4_stateid_copy(&stateid, &ctx->state->stateid);
- } while (read_seqretry(&ctx->state->seqlock, seq));
+ if (nfs4_select_rw_stateid(ctx->state,
+ iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
+ NULL, &stateid, NULL) != 0) {
+ trace_pnfs_update_layout(ino, pos, count,
+ iomode, lo, lseg,
+ PNFS_UPDATE_LAYOUT_INVALID_OPEN);
+ goto out_unlock;
+ }
} else {
nfs4_stateid_copy(&stateid, &lo->plh_stateid);
}
@@ -2274,7 +2237,6 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
nfs_pageio_reset_write_mds(desc);
mirror->pg_recoalesce = 1;
}
- nfs_pgio_data_destroy(hdr);
hdr->release(hdr);
}
@@ -2398,7 +2360,6 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
nfs_pageio_reset_read_mds(desc);
mirror->pg_recoalesce = 1;
}
- nfs_pgio_data_destroy(hdr);
hdr->release(hdr);
}
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 99731e3e332f..87f144f14d1e 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -67,7 +67,6 @@ struct pnfs_layout_segment {
u32 pls_seq;
unsigned long pls_flags;
struct pnfs_layout_hdr *pls_layout;
- struct work_struct pls_work;
};
enum pnfs_try_status {
@@ -230,7 +229,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
/* pnfs.c */
void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
-void pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg);
void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);
void unset_pnfs_layoutdriver(struct nfs_server *);
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
index 25f28fa64c57..60da59be83b6 100644
--- a/fs/nfs/pnfs_nfs.c
+++ b/fs/nfs/pnfs_nfs.c
@@ -83,34 +83,11 @@ pnfs_generic_clear_request_commit(struct nfs_page *req,
}
out:
nfs_request_remove_commit_list(req, cinfo);
- pnfs_put_lseg_locked(freeme);
+ pnfs_put_lseg(freeme);
}
EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit);
static int
-pnfs_generic_transfer_commit_list(struct list_head *src, struct list_head *dst,
- struct nfs_commit_info *cinfo, int max)
-{
- struct nfs_page *req, *tmp;
- int ret = 0;
-
- list_for_each_entry_safe(req, tmp, src, wb_list) {
- if (!nfs_lock_request(req))
- continue;
- kref_get(&req->wb_kref);
- if (cond_resched_lock(&cinfo->inode->i_lock))
- list_safe_reset_next(req, tmp, wb_list);
- nfs_request_remove_commit_list(req, cinfo);
- clear_bit(PG_COMMIT_TO_DS, &req->wb_flags);
- nfs_list_add_request(req, dst);
- ret++;
- if ((ret == max) && !cinfo->dreq)
- break;
- }
- return ret;
-}
-
-static int
pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
struct nfs_commit_info *cinfo,
int max)
@@ -119,15 +96,15 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
struct list_head *dst = &bucket->committing;
int ret;
- lockdep_assert_held(&cinfo->inode->i_lock);
- ret = pnfs_generic_transfer_commit_list(src, dst, cinfo, max);
+ lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
+ ret = nfs_scan_commit_list(src, dst, cinfo, max);
if (ret) {
cinfo->ds->nwritten -= ret;
cinfo->ds->ncommitting += ret;
if (bucket->clseg == NULL)
bucket->clseg = pnfs_get_lseg(bucket->wlseg);
if (list_empty(src)) {
- pnfs_put_lseg_locked(bucket->wlseg);
+ pnfs_put_lseg(bucket->wlseg);
bucket->wlseg = NULL;
}
}
@@ -142,7 +119,7 @@ int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo,
{
int i, rv = 0, cnt;
- lockdep_assert_held(&cinfo->inode->i_lock);
+ lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
for (i = 0; i < cinfo->ds->nbuckets && max != 0; i++) {
cnt = pnfs_generic_scan_ds_commit_list(&cinfo->ds->buckets[i],
cinfo, max);
@@ -162,11 +139,10 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
int nwritten;
int i;
- lockdep_assert_held(&cinfo->inode->i_lock);
+ lockdep_assert_held(&NFS_I(cinfo->inode)->commit_mutex);
restart:
for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {
- nwritten = pnfs_generic_transfer_commit_list(&b->written,
- dst, cinfo, 0);
+ nwritten = nfs_scan_commit_list(&b->written, dst, cinfo, 0);
if (!nwritten)
continue;
cinfo->ds->nwritten -= nwritten;
@@ -953,12 +929,12 @@ pnfs_layout_mark_request_commit(struct nfs_page *req,
struct list_head *list;
struct pnfs_commit_bucket *buckets;
- spin_lock(&cinfo->inode->i_lock);
+ mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
buckets = cinfo->ds->buckets;
list = &buckets[ds_commit_idx].written;
if (list_empty(list)) {
if (!pnfs_is_valid_lseg(lseg)) {
- spin_unlock(&cinfo->inode->i_lock);
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
cinfo->completion_ops->resched_write(cinfo, req);
return;
}
@@ -975,7 +951,7 @@ pnfs_layout_mark_request_commit(struct nfs_page *req,
cinfo->ds->nwritten++;
nfs_request_add_commit_list_locked(req, list, cinfo);
- spin_unlock(&cinfo->inode->i_lock);
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
nfs_mark_page_unstable(req->wb_page, cinfo);
}
EXPORT_SYMBOL_GPL(pnfs_layout_mark_request_commit);
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index a8421d9dab6a..48d7277c60a9 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -25,6 +25,7 @@
#include "iostat.h"
#include "fscache.h"
#include "pnfs.h"
+#include "nfstrace.h"
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
@@ -68,7 +69,7 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
pg_ops = server->pnfs_curr_ld->pg_read_ops;
#endif
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_read_ops,
- server->rsize, 0, GFP_KERNEL);
+ server->rsize, 0);
}
EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
@@ -200,6 +201,7 @@ static void nfs_initiate_read(struct nfs_pgio_header *hdr,
task_setup_data->flags |= swap_flags;
rpc_ops->read_setup(hdr, msg);
+ trace_nfs_initiate_read(inode, hdr->io_start, hdr->good_bytes);
}
static void
@@ -232,6 +234,8 @@ static int nfs_readpage_done(struct rpc_task *task,
return status;
nfs_add_stats(inode, NFSIOS_SERVERREADBYTES, hdr->res.count);
+ trace_nfs_readpage_done(inode, task->tk_status,
+ hdr->args.offset, hdr->res.eof);
if (task->tk_status == -ESTALE) {
set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index d828ef88e7db..c9d24bae3025 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -812,7 +812,7 @@ int nfs_show_stats(struct seq_file *m, struct dentry *root)
* Display all mount option settings
*/
seq_printf(m, "\n\topts:\t");
- seq_puts(m, root->d_sb->s_flags & MS_RDONLY ? "ro" : "rw");
+ seq_puts(m, sb_rdonly(root->d_sb) ? "ro" : "rw");
seq_puts(m, root->d_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : "");
seq_puts(m, root->d_sb->s_flags & MS_NOATIME ? ",noatime" : "");
seq_puts(m, root->d_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : "");
@@ -1691,8 +1691,8 @@ static int nfs_verify_authflavors(struct nfs_parsed_mount_data *args,
rpc_authflavor_t *server_authlist, unsigned int count)
{
rpc_authflavor_t flavor = RPC_AUTH_MAXFLAVOR;
+ bool found_auth_null = false;
unsigned int i;
- int use_auth_null = false;
/*
* If the sec= mount option is used, the specified flavor or AUTH_NULL
@@ -1701,6 +1701,10 @@ static int nfs_verify_authflavors(struct nfs_parsed_mount_data *args,
* AUTH_NULL has a special meaning when it's in the server list - it
* means that the server will ignore the rpc creds, so any flavor
* can be used but still use the sec= that was specified.
+ *
+ * Note also that the MNT procedure in MNTv1 does not return a list
+ * of supported security flavors. In this case, nfs_mount() fabricates
+ * a security flavor list containing just AUTH_NULL.
*/
for (i = 0; i < count; i++) {
flavor = server_authlist[i];
@@ -1709,11 +1713,11 @@ static int nfs_verify_authflavors(struct nfs_parsed_mount_data *args,
goto out;
if (flavor == RPC_AUTH_NULL)
- use_auth_null = true;
+ found_auth_null = true;
}
- if (use_auth_null) {
- flavor = RPC_AUTH_NULL;
+ if (found_auth_null) {
+ flavor = args->auth_info.flavors[0];
goto out;
}
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index b1af5dee5e0a..babebbccae2a 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -102,10 +102,8 @@ static struct nfs_pgio_header *nfs_writehdr_alloc(void)
{
struct nfs_pgio_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
- if (p) {
- memset(p, 0, sizeof(*p));
- p->rw_mode = FMODE_WRITE;
- }
+ memset(p, 0, sizeof(*p));
+ p->rw_mode = FMODE_WRITE;
return p;
}
@@ -147,11 +145,12 @@ static void nfs_io_completion_put(struct nfs_io_completion *ioc)
kref_put(&ioc->refcount, nfs_io_completion_release);
}
-static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
+static struct nfs_page *
+nfs_page_private_request(struct page *page)
{
- ctx->error = error;
- smp_wmb();
- set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
+ if (!PagePrivate(page))
+ return NULL;
+ return (struct nfs_page *)page_private(page);
}
/*
@@ -162,21 +161,41 @@ static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
* returns matching head request with reference held, or NULL if not found.
*/
static struct nfs_page *
-nfs_page_find_head_request_locked(struct nfs_inode *nfsi, struct page *page)
+nfs_page_find_private_request(struct page *page)
{
- struct nfs_page *req = NULL;
-
- if (PagePrivate(page))
- req = (struct nfs_page *)page_private(page);
- else if (unlikely(PageSwapCache(page)))
- req = nfs_page_search_commits_for_head_request_locked(nfsi,
- page);
+ struct address_space *mapping = page_file_mapping(page);
+ struct nfs_page *req;
+ if (!PagePrivate(page))
+ return NULL;
+ spin_lock(&mapping->private_lock);
+ req = nfs_page_private_request(page);
if (req) {
WARN_ON_ONCE(req->wb_head != req);
kref_get(&req->wb_kref);
}
+ spin_unlock(&mapping->private_lock);
+ return req;
+}
+static struct nfs_page *
+nfs_page_find_swap_request(struct page *page)
+{
+ struct inode *inode = page_file_mapping(page)->host;
+ struct nfs_inode *nfsi = NFS_I(inode);
+ struct nfs_page *req = NULL;
+ if (!PageSwapCache(page))
+ return NULL;
+ mutex_lock(&nfsi->commit_mutex);
+ if (PageSwapCache(page)) {
+ req = nfs_page_search_commits_for_head_request_locked(nfsi,
+ page);
+ if (req) {
+ WARN_ON_ONCE(req->wb_head != req);
+ kref_get(&req->wb_kref);
+ }
+ }
+ mutex_unlock(&nfsi->commit_mutex);
return req;
}
@@ -187,12 +206,11 @@ nfs_page_find_head_request_locked(struct nfs_inode *nfsi, struct page *page)
*/
static struct nfs_page *nfs_page_find_head_request(struct page *page)
{
- struct inode *inode = page_file_mapping(page)->host;
- struct nfs_page *req = NULL;
+ struct nfs_page *req;
- spin_lock(&inode->i_lock);
- req = nfs_page_find_head_request_locked(NFS_I(inode), page);
- spin_unlock(&inode->i_lock);
+ req = nfs_page_find_private_request(page);
+ if (!req)
+ req = nfs_page_find_swap_request(page);
return req;
}
@@ -241,9 +259,6 @@ nfs_page_group_search_locked(struct nfs_page *head, unsigned int page_offset)
{
struct nfs_page *req;
- WARN_ON_ONCE(head != head->wb_head);
- WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &head->wb_head->wb_flags));
-
req = head;
do {
if (page_offset >= req->wb_pgbase &&
@@ -269,20 +284,17 @@ static bool nfs_page_group_covers_page(struct nfs_page *req)
unsigned int pos = 0;
unsigned int len = nfs_page_length(req->wb_page);
- nfs_page_group_lock(req, false);
+ nfs_page_group_lock(req);
- do {
+ for (;;) {
tmp = nfs_page_group_search_locked(req->wb_head, pos);
- if (tmp) {
- /* no way this should happen */
- WARN_ON_ONCE(tmp->wb_pgbase != pos);
- pos += tmp->wb_bytes - (pos - tmp->wb_pgbase);
- }
- } while (tmp && pos < len);
+ if (!tmp)
+ break;
+ pos = tmp->wb_pgbase + tmp->wb_bytes;
+ }
nfs_page_group_unlock(req);
- WARN_ON_ONCE(pos > len);
- return pos == len;
+ return pos >= len;
}
/* We can set the PG_uptodate flag if we see that a write request
@@ -333,8 +345,11 @@ static void nfs_end_page_writeback(struct nfs_page *req)
{
struct inode *inode = page_file_mapping(req->wb_page)->host;
struct nfs_server *nfss = NFS_SERVER(inode);
+ bool is_done;
- if (!nfs_page_group_sync_on_bit(req, PG_WB_END))
+ is_done = nfs_page_group_sync_on_bit(req, PG_WB_END);
+ nfs_unlock_request(req);
+ if (!is_done)
return;
end_page_writeback(req->wb_page);
@@ -342,22 +357,6 @@ static void nfs_end_page_writeback(struct nfs_page *req)
clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
}
-
-/* nfs_page_group_clear_bits
- * @req - an nfs request
- * clears all page group related bits from @req
- */
-static void
-nfs_page_group_clear_bits(struct nfs_page *req)
-{
- clear_bit(PG_TEARDOWN, &req->wb_flags);
- clear_bit(PG_UNLOCKPAGE, &req->wb_flags);
- clear_bit(PG_UPTODATE, &req->wb_flags);
- clear_bit(PG_WB_END, &req->wb_flags);
- clear_bit(PG_REMOVE, &req->wb_flags);
-}
-
-
/*
* nfs_unroll_locks_and_wait - unlock all newly locked reqs and wait on @req
*
@@ -366,43 +365,24 @@ nfs_page_group_clear_bits(struct nfs_page *req)
* @inode - inode associated with request page group, must be holding inode lock
* @head - head request of page group, must be holding head lock
* @req - request that couldn't lock and needs to wait on the req bit lock
- * @nonblock - if true, don't actually wait
*
- * NOTE: this must be called holding page_group bit lock and inode spin lock
- * and BOTH will be released before returning.
+ * NOTE: this must be called holding page_group bit lock
+ * which will be released before returning.
*
* returns 0 on success, < 0 on error.
*/
-static int
-nfs_unroll_locks_and_wait(struct inode *inode, struct nfs_page *head,
- struct nfs_page *req, bool nonblock)
- __releases(&inode->i_lock)
+static void
+nfs_unroll_locks(struct inode *inode, struct nfs_page *head,
+ struct nfs_page *req)
{
struct nfs_page *tmp;
- int ret;
/* relinquish all the locks successfully grabbed this run */
- for (tmp = head ; tmp != req; tmp = tmp->wb_this_page)
- nfs_unlock_request(tmp);
-
- WARN_ON_ONCE(test_bit(PG_TEARDOWN, &req->wb_flags));
-
- /* grab a ref on the request that will be waited on */
- kref_get(&req->wb_kref);
-
- nfs_page_group_unlock(head);
- spin_unlock(&inode->i_lock);
-
- /* release ref from nfs_page_find_head_request_locked */
- nfs_release_request(head);
-
- if (!nonblock)
- ret = nfs_wait_on_request(req);
- else
- ret = -EAGAIN;
- nfs_release_request(req);
-
- return ret;
+ for (tmp = head->wb_this_page ; tmp != req; tmp = tmp->wb_this_page) {
+ if (!kref_read(&tmp->wb_kref))
+ continue;
+ nfs_unlock_and_release_request(tmp);
+ }
}
/*
@@ -417,7 +397,8 @@ nfs_unroll_locks_and_wait(struct inode *inode, struct nfs_page *head,
*/
static void
nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
- struct nfs_page *old_head)
+ struct nfs_page *old_head,
+ struct inode *inode)
{
while (destroy_list) {
struct nfs_page *subreq = destroy_list;
@@ -428,33 +409,28 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
WARN_ON_ONCE(old_head != subreq->wb_head);
/* make sure old group is not used */
- subreq->wb_head = subreq;
subreq->wb_this_page = subreq;
- /* subreq is now totally disconnected from page group or any
- * write / commit lists. last chance to wake any waiters */
- nfs_unlock_request(subreq);
+ clear_bit(PG_REMOVE, &subreq->wb_flags);
- if (!test_bit(PG_TEARDOWN, &subreq->wb_flags)) {
- /* release ref on old head request */
- nfs_release_request(old_head);
+ /* Note: races with nfs_page_group_destroy() */
+ if (!kref_read(&subreq->wb_kref)) {
+ /* Check if we raced with nfs_page_group_destroy() */
+ if (test_and_clear_bit(PG_TEARDOWN, &subreq->wb_flags))
+ nfs_free_request(subreq);
+ continue;
+ }
- nfs_page_group_clear_bits(subreq);
+ subreq->wb_head = subreq;
- /* release the PG_INODE_REF reference */
- if (test_and_clear_bit(PG_INODE_REF, &subreq->wb_flags))
- nfs_release_request(subreq);
- else
- WARN_ON_ONCE(1);
- } else {
- WARN_ON_ONCE(test_bit(PG_CLEAN, &subreq->wb_flags));
- /* zombie requests have already released the last
- * reference and were waiting on the rest of the
- * group to complete. Since it's no longer part of a
- * group, simply free the request */
- nfs_page_group_clear_bits(subreq);
- nfs_free_request(subreq);
+ if (test_and_clear_bit(PG_INODE_REF, &subreq->wb_flags)) {
+ nfs_release_request(subreq);
+ atomic_long_dec(&NFS_I(inode)->nrequests);
}
+
+ /* subreq is now totally disconnected from page group or any
+ * write / commit lists. last chance to wake any waiters */
+ nfs_unlock_and_release_request(subreq);
}
}
@@ -464,7 +440,6 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
* operations for this page.
*
* @page - the page used to lookup the "page group" of nfs_page structures
- * @nonblock - if true, don't block waiting for request locks
*
* This function joins all sub requests to the head request by first
* locking all requests in the group, cancelling any pending operations
@@ -478,7 +453,7 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
* error was encountered.
*/
static struct nfs_page *
-nfs_lock_and_join_requests(struct page *page, bool nonblock)
+nfs_lock_and_join_requests(struct page *page)
{
struct inode *inode = page_file_mapping(page)->host;
struct nfs_page *head, *subreq;
@@ -487,43 +462,63 @@ nfs_lock_and_join_requests(struct page *page, bool nonblock)
int ret;
try_again:
- total_bytes = 0;
-
- WARN_ON_ONCE(destroy_list);
-
- spin_lock(&inode->i_lock);
-
/*
* A reference is taken only on the head request which acts as a
* reference to the whole page group - the group will not be destroyed
* until the head reference is released.
*/
- head = nfs_page_find_head_request_locked(NFS_I(inode), page);
-
- if (!head) {
- spin_unlock(&inode->i_lock);
+ head = nfs_page_find_head_request(page);
+ if (!head)
return NULL;
- }
- /* holding inode lock, so always make a non-blocking call to try the
- * page group lock */
- ret = nfs_page_group_lock(head, true);
- if (ret < 0) {
- spin_unlock(&inode->i_lock);
+ /* lock the page head first in order to avoid an ABBA inefficiency */
+ if (!nfs_lock_request(head)) {
+ ret = nfs_wait_on_request(head);
+ nfs_release_request(head);
+ if (ret < 0)
+ return ERR_PTR(ret);
+ goto try_again;
+ }
- if (!nonblock && ret == -EAGAIN) {
- nfs_page_group_lock_wait(head);
- nfs_release_request(head);
- goto try_again;
- }
+ /* Ensure that nobody removed the request before we locked it */
+ if (head != nfs_page_private_request(page) && !PageSwapCache(page)) {
+ nfs_unlock_and_release_request(head);
+ goto try_again;
+ }
- nfs_release_request(head);
+ ret = nfs_page_group_lock(head);
+ if (ret < 0) {
+ nfs_unlock_and_release_request(head);
return ERR_PTR(ret);
}
/* lock each request in the page group */
- subreq = head;
- do {
+ total_bytes = head->wb_bytes;
+ for (subreq = head->wb_this_page; subreq != head;
+ subreq = subreq->wb_this_page) {
+
+ if (!kref_get_unless_zero(&subreq->wb_kref)) {
+ if (subreq->wb_offset == head->wb_offset + total_bytes)
+ total_bytes += subreq->wb_bytes;
+ continue;
+ }
+
+ while (!nfs_lock_request(subreq)) {
+ /*
+ * Unlock page to allow nfs_page_group_sync_on_bit()
+ * to succeed
+ */
+ nfs_page_group_unlock(head);
+ ret = nfs_wait_on_request(subreq);
+ if (!ret)
+ ret = nfs_page_group_lock(head);
+ if (ret < 0) {
+ nfs_unroll_locks(inode, head, subreq);
+ nfs_release_request(subreq);
+ nfs_unlock_and_release_request(head);
+ return ERR_PTR(ret);
+ }
+ }
/*
* Subrequests are always contiguous, non overlapping
* and in order - but may be repeated (mirrored writes).
@@ -535,24 +530,12 @@ try_again:
((subreq->wb_offset + subreq->wb_bytes) >
(head->wb_offset + total_bytes)))) {
nfs_page_group_unlock(head);
- spin_unlock(&inode->i_lock);
+ nfs_unroll_locks(inode, head, subreq);
+ nfs_unlock_and_release_request(subreq);
+ nfs_unlock_and_release_request(head);
return ERR_PTR(-EIO);
}
-
- if (!nfs_lock_request(subreq)) {
- /* releases page group bit lock and
- * inode spin lock and all references */
- ret = nfs_unroll_locks_and_wait(inode, head,
- subreq, nonblock);
-
- if (ret == 0)
- goto try_again;
-
- return ERR_PTR(ret);
- }
-
- subreq = subreq->wb_this_page;
- } while (subreq != head);
+ }
/* Now that all requests are locked, make sure they aren't on any list.
* Commit list removal accounting is done after locks are dropped */
@@ -573,34 +556,30 @@ try_again:
head->wb_bytes = total_bytes;
}
- /*
- * prepare head request to be added to new pgio descriptor
- */
- nfs_page_group_clear_bits(head);
-
- /*
- * some part of the group was still on the inode list - otherwise
- * the group wouldn't be involved in async write.
- * grab a reference for the head request, iff it needs one.
- */
- if (!test_and_set_bit(PG_INODE_REF, &head->wb_flags))
+ /* Postpone destruction of this request */
+ if (test_and_clear_bit(PG_REMOVE, &head->wb_flags)) {
+ set_bit(PG_INODE_REF, &head->wb_flags);
kref_get(&head->wb_kref);
+ atomic_long_inc(&NFS_I(inode)->nrequests);
+ }
nfs_page_group_unlock(head);
- /* drop lock to clean uprequests on destroy list */
- spin_unlock(&inode->i_lock);
+ nfs_destroy_unlinked_subrequests(destroy_list, head, inode);
- nfs_destroy_unlinked_subrequests(destroy_list, head);
+ /* Did we lose a race with nfs_inode_remove_request()? */
+ if (!(PagePrivate(page) || PageSwapCache(page))) {
+ nfs_unlock_and_release_request(head);
+ return NULL;
+ }
- /* still holds ref on head from nfs_page_find_head_request_locked
+ /* still holds ref on head from nfs_page_find_head_request
* and still has lock on head from lock loop */
return head;
}
static void nfs_write_error_remove_page(struct nfs_page *req)
{
- nfs_unlock_request(req);
nfs_end_page_writeback(req);
generic_error_remove_page(page_file_mapping(req->wb_page),
req->wb_page);
@@ -624,12 +603,12 @@ nfs_error_is_fatal_on_server(int err)
* May return an error if the user signalled nfs_wait_on_request().
*/
static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
- struct page *page, bool nonblock)
+ struct page *page)
{
struct nfs_page *req;
int ret = 0;
- req = nfs_lock_and_join_requests(page, nonblock);
+ req = nfs_lock_and_join_requests(page);
if (!req)
goto out;
ret = PTR_ERR(req);
@@ -672,7 +651,7 @@ static int nfs_do_writepage(struct page *page, struct writeback_control *wbc,
int ret;
nfs_pageio_cond_complete(pgio, page_index(page));
- ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE);
+ ret = nfs_page_async_flush(pgio, page);
if (ret == -EAGAIN) {
redirty_page_for_writepage(wbc, page);
ret = 0;
@@ -759,6 +738,7 @@ out_err:
*/
static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
{
+ struct address_space *mapping = page_file_mapping(req->wb_page);
struct nfs_inode *nfsi = NFS_I(inode);
WARN_ON_ONCE(req->wb_this_page != req);
@@ -766,27 +746,30 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
/* Lock the request! */
nfs_lock_request(req);
- spin_lock(&inode->i_lock);
- if (!nfsi->nrequests &&
- NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE))
- inode->i_version++;
/*
* Swap-space should not get truncated. Hence no need to plug the race
* with invalidate/truncate.
*/
+ spin_lock(&mapping->private_lock);
+ if (!nfs_have_writebacks(inode) &&
+ NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE)) {
+ spin_lock(&inode->i_lock);
+ inode->i_version++;
+ spin_unlock(&inode->i_lock);
+ }
if (likely(!PageSwapCache(req->wb_page))) {
set_bit(PG_MAPPED, &req->wb_flags);
SetPagePrivate(req->wb_page);
set_page_private(req->wb_page, (unsigned long)req);
}
- nfsi->nrequests++;
+ spin_unlock(&mapping->private_lock);
+ atomic_long_inc(&nfsi->nrequests);
/* this a head request for a page group - mark it as having an
* extra reference so sub groups can follow suit.
* This flag also informs pgio layer when to bump nrequests when
* adding subrequests. */
WARN_ON(test_and_set_bit(PG_INODE_REF, &req->wb_flags));
kref_get(&req->wb_kref);
- spin_unlock(&inode->i_lock);
}
/*
@@ -794,25 +777,22 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
*/
static void nfs_inode_remove_request(struct nfs_page *req)
{
- struct inode *inode = d_inode(req->wb_context->dentry);
+ struct address_space *mapping = page_file_mapping(req->wb_page);
+ struct inode *inode = mapping->host;
struct nfs_inode *nfsi = NFS_I(inode);
struct nfs_page *head;
+ atomic_long_dec(&nfsi->nrequests);
if (nfs_page_group_sync_on_bit(req, PG_REMOVE)) {
head = req->wb_head;
- spin_lock(&inode->i_lock);
+ spin_lock(&mapping->private_lock);
if (likely(head->wb_page && !PageSwapCache(head->wb_page))) {
set_page_private(head->wb_page, 0);
ClearPagePrivate(head->wb_page);
clear_bit(PG_MAPPED, &head->wb_flags);
}
- nfsi->nrequests--;
- spin_unlock(&inode->i_lock);
- } else {
- spin_lock(&inode->i_lock);
- nfsi->nrequests--;
- spin_unlock(&inode->i_lock);
+ spin_unlock(&mapping->private_lock);
}
if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags))
@@ -868,7 +848,8 @@ nfs_page_search_commits_for_head_request_locked(struct nfs_inode *nfsi,
* number of outstanding requests requiring a commit as well as
* the MM page stats.
*
- * The caller must hold cinfo->inode->i_lock, and the nfs_page lock.
+ * The caller must hold NFS_I(cinfo->inode)->commit_mutex, and the
+ * nfs_page lock.
*/
void
nfs_request_add_commit_list_locked(struct nfs_page *req, struct list_head *dst,
@@ -876,7 +857,7 @@ nfs_request_add_commit_list_locked(struct nfs_page *req, struct list_head *dst,
{
set_bit(PG_CLEAN, &req->wb_flags);
nfs_list_add_request(req, dst);
- cinfo->mds->ncommit++;
+ atomic_long_inc(&cinfo->mds->ncommit);
}
EXPORT_SYMBOL_GPL(nfs_request_add_commit_list_locked);
@@ -896,9 +877,9 @@ EXPORT_SYMBOL_GPL(nfs_request_add_commit_list_locked);
void
nfs_request_add_commit_list(struct nfs_page *req, struct nfs_commit_info *cinfo)
{
- spin_lock(&cinfo->inode->i_lock);
+ mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
nfs_request_add_commit_list_locked(req, &cinfo->mds->list, cinfo);
- spin_unlock(&cinfo->inode->i_lock);
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
if (req->wb_page)
nfs_mark_page_unstable(req->wb_page, cinfo);
}
@@ -922,7 +903,7 @@ nfs_request_remove_commit_list(struct nfs_page *req,
if (!test_and_clear_bit(PG_CLEAN, &(req)->wb_flags))
return;
nfs_list_remove_request(req);
- cinfo->mds->ncommit--;
+ atomic_long_dec(&cinfo->mds->ncommit);
}
EXPORT_SYMBOL_GPL(nfs_request_remove_commit_list);
@@ -967,7 +948,7 @@ nfs_clear_page_commit(struct page *page)
WB_RECLAIMABLE);
}
-/* Called holding inode (/cinfo) lock */
+/* Called holding the request lock on @req */
static void
nfs_clear_request_commit(struct nfs_page *req)
{
@@ -976,9 +957,11 @@ nfs_clear_request_commit(struct nfs_page *req)
struct nfs_commit_info cinfo;
nfs_init_cinfo_from_inode(&cinfo, inode);
+ mutex_lock(&NFS_I(inode)->commit_mutex);
if (!pnfs_clear_request_commit(req, &cinfo)) {
nfs_request_remove_commit_list(req, &cinfo);
}
+ mutex_unlock(&NFS_I(inode)->commit_mutex);
nfs_clear_page_commit(req->wb_page);
}
}
@@ -1023,7 +1006,6 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr)
remove_req:
nfs_inode_remove_request(req);
next:
- nfs_unlock_request(req);
nfs_end_page_writeback(req);
nfs_release_request(req);
}
@@ -1035,10 +1017,10 @@ out:
unsigned long
nfs_reqs_to_commit(struct nfs_commit_info *cinfo)
{
- return cinfo->mds->ncommit;
+ return atomic_long_read(&cinfo->mds->ncommit);
}
-/* cinfo->inode->i_lock held by caller */
+/* NFS_I(cinfo->inode)->commit_mutex held by caller */
int
nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
struct nfs_commit_info *cinfo, int max)
@@ -1046,20 +1028,37 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
struct nfs_page *req, *tmp;
int ret = 0;
+restart:
list_for_each_entry_safe(req, tmp, src, wb_list) {
- if (!nfs_lock_request(req))
- continue;
kref_get(&req->wb_kref);
- if (cond_resched_lock(&cinfo->inode->i_lock))
- list_safe_reset_next(req, tmp, wb_list);
+ if (!nfs_lock_request(req)) {
+ int status;
+
+ /* Prevent deadlock with nfs_lock_and_join_requests */
+ if (!list_empty(dst)) {
+ nfs_release_request(req);
+ continue;
+ }
+ /* Ensure we make progress to prevent livelock */
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
+ status = nfs_wait_on_request(req);
+ nfs_release_request(req);
+ mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
+ if (status < 0)
+ break;
+ goto restart;
+ }
nfs_request_remove_commit_list(req, cinfo);
+ clear_bit(PG_COMMIT_TO_DS, &req->wb_flags);
nfs_list_add_request(req, dst);
ret++;
if ((ret == max) && !cinfo->dreq)
break;
+ cond_resched();
}
return ret;
}
+EXPORT_SYMBOL_GPL(nfs_scan_commit_list);
/*
* nfs_scan_commit - Scan an inode for commit requests
@@ -1076,15 +1075,17 @@ nfs_scan_commit(struct inode *inode, struct list_head *dst,
{
int ret = 0;
- spin_lock(&cinfo->inode->i_lock);
- if (cinfo->mds->ncommit > 0) {
+ if (!atomic_long_read(&cinfo->mds->ncommit))
+ return 0;
+ mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
+ if (atomic_long_read(&cinfo->mds->ncommit) > 0) {
const int max = INT_MAX;
ret = nfs_scan_commit_list(&cinfo->mds->list, dst,
cinfo, max);
ret += pnfs_scan_commit_lists(inode, cinfo, max - ret);
}
- spin_unlock(&cinfo->inode->i_lock);
+ mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
return ret;
}
@@ -1105,43 +1106,21 @@ static struct nfs_page *nfs_try_to_update_request(struct inode *inode,
unsigned int end;
int error;
- if (!PagePrivate(page))
- return NULL;
-
end = offset + bytes;
- spin_lock(&inode->i_lock);
-
- for (;;) {
- req = nfs_page_find_head_request_locked(NFS_I(inode), page);
- if (req == NULL)
- goto out_unlock;
-
- /* should be handled by nfs_flush_incompatible */
- WARN_ON_ONCE(req->wb_head != req);
- WARN_ON_ONCE(req->wb_this_page != req);
-
- rqend = req->wb_offset + req->wb_bytes;
- /*
- * Tell the caller to flush out the request if
- * the offsets are non-contiguous.
- * Note: nfs_flush_incompatible() will already
- * have flushed out requests having wrong owners.
- */
- if (offset > rqend
- || end < req->wb_offset)
- goto out_flushme;
- if (nfs_lock_request(req))
- break;
+ req = nfs_lock_and_join_requests(page);
+ if (IS_ERR_OR_NULL(req))
+ return req;
- /* The request is locked, so wait and then retry */
- spin_unlock(&inode->i_lock);
- error = nfs_wait_on_request(req);
- nfs_release_request(req);
- if (error != 0)
- goto out_err;
- spin_lock(&inode->i_lock);
- }
+ rqend = req->wb_offset + req->wb_bytes;
+ /*
+ * Tell the caller to flush out the request if
+ * the offsets are non-contiguous.
+ * Note: nfs_flush_incompatible() will already
+ * have flushed out requests having wrong owners.
+ */
+ if (offset > rqend || end < req->wb_offset)
+ goto out_flushme;
/* Okay, the request matches. Update the region */
if (offset < req->wb_offset) {
@@ -1152,17 +1131,17 @@ static struct nfs_page *nfs_try_to_update_request(struct inode *inode,
req->wb_bytes = end - req->wb_offset;
else
req->wb_bytes = rqend - req->wb_offset;
-out_unlock:
- if (req)
- nfs_clear_request_commit(req);
- spin_unlock(&inode->i_lock);
return req;
out_flushme:
- spin_unlock(&inode->i_lock);
- nfs_release_request(req);
+ /*
+ * Note: we mark the request dirty here because
+ * nfs_lock_and_join_requests() cannot preserve
+ * commit flags, so we have to replay the write.
+ */
+ nfs_mark_request_dirty(req);
+ nfs_unlock_and_release_request(req);
error = nfs_wb_page(inode, page);
-out_err:
- return ERR_PTR(error);
+ return (error < 0) ? ERR_PTR(error) : NULL;
}
/*
@@ -1227,8 +1206,6 @@ int nfs_flush_incompatible(struct file *file, struct page *page)
l_ctx = req->wb_lock_context;
do_flush = req->wb_page != page ||
!nfs_match_open_context(req->wb_context, ctx);
- /* for now, flush if more than 1 request in page_group */
- do_flush |= req->wb_this_page != req;
if (l_ctx && flctx &&
!(list_empty_careful(&flctx->flc_posix) &&
list_empty_careful(&flctx->flc_flock))) {
@@ -1399,6 +1376,8 @@ static void nfs_initiate_write(struct nfs_pgio_header *hdr,
task_setup_data->priority = priority;
rpc_ops->write_setup(hdr, msg);
+ trace_nfs_initiate_write(hdr->inode, hdr->io_start, hdr->good_bytes,
+ hdr->args.stable);
nfs4_state_protect_write(NFS_SERVER(hdr->inode)->nfs_client,
&task_setup_data->rpc_client, msg, hdr);
@@ -1412,7 +1391,6 @@ static void nfs_redirty_request(struct nfs_page *req)
{
nfs_mark_request_dirty(req);
set_bit(NFS_CONTEXT_RESEND_WRITES, &req->wb_context->flags);
- nfs_unlock_request(req);
nfs_end_page_writeback(req);
nfs_release_request(req);
}
@@ -1452,7 +1430,7 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
pg_ops = server->pnfs_curr_ld->pg_write_ops;
#endif
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_write_ops,
- server->wsize, ioflags, GFP_NOIO);
+ server->wsize, ioflags);
}
EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
@@ -1557,7 +1535,10 @@ static int nfs_writeback_done(struct rpc_task *task,
status = NFS_PROTO(inode)->write_done(task, hdr);
if (status != 0)
return status;
+
nfs_add_stats(inode, NFSIOS_SERVERWRITTENBYTES, hdr->res.count);
+ trace_nfs_writeback_done(inode, task->tk_status,
+ hdr->args.offset, hdr->res.verf);
if (hdr->res.verf->committed < hdr->args.stable &&
task->tk_status >= 0) {
@@ -1686,6 +1667,7 @@ int nfs_initiate_commit(struct rpc_clnt *clnt, struct nfs_commit_data *data,
};
/* Set up the initial task struct. */
nfs_ops->commit_setup(data, &msg);
+ trace_nfs_initiate_commit(data);
dprintk("NFS: initiated commit call\n");
@@ -1810,6 +1792,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata)
/* Call the NFS version-specific code */
NFS_PROTO(data->inode)->commit_done(task, data);
+ trace_nfs_commit_done(data);
}
static void nfs_commit_release_pages(struct nfs_commit_data *data)
@@ -1934,7 +1917,7 @@ int nfs_write_inode(struct inode *inode, struct writeback_control *wbc)
int ret = 0;
/* no commits means nothing needs to be done */
- if (!nfsi->commit_info.ncommit)
+ if (!atomic_long_read(&nfsi->commit_info.ncommit))
return ret;
if (wbc->sync_mode == WB_SYNC_NONE) {
@@ -2015,7 +1998,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
/* blocking call to cancel all requests and join to a single (head)
* request */
- req = nfs_lock_and_join_requests(page, false);
+ req = nfs_lock_and_join_requests(page);
if (IS_ERR(req)) {
ret = PTR_ERR(req);
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
index 7ffe71a8dfb9..6a612d832e7d 100644
--- a/fs/nilfs2/inode.c
+++ b/fs/nilfs2/inode.c
@@ -174,7 +174,7 @@ static int nilfs_writepages(struct address_space *mapping,
struct inode *inode = mapping->host;
int err = 0;
- if (inode->i_sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(inode->i_sb)) {
nilfs_clear_dirty_pages(mapping, false);
return -EROFS;
}
@@ -191,7 +191,7 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
struct inode *inode = page->mapping->host;
int err;
- if (inode->i_sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(inode->i_sb)) {
/*
* It means that filesystem was remounted in read-only
* mode because of error or metadata corruption. But we
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
index 98835ed6bef4..c6bc1033e7d2 100644
--- a/fs/nilfs2/mdt.c
+++ b/fs/nilfs2/mdt.c
@@ -413,7 +413,7 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
struct super_block *sb;
int err = 0;
- if (inode && (inode->i_sb->s_flags & MS_RDONLY)) {
+ if (inode && sb_rdonly(inode->i_sb)) {
/*
* It means that filesystem was remounted in read-only
* mode because of error or metadata corruption. But we
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index 926682981d61..4fc018dfcfae 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -136,7 +136,7 @@ void __nilfs_error(struct super_block *sb, const char *function,
va_end(args);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
nilfs_set_error(sb);
if (nilfs_test_opt(nilfs, ERRORS_RO)) {
@@ -478,7 +478,7 @@ static void nilfs_put_super(struct super_block *sb)
nilfs_detach_log_writer(sb);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
down_write(&nilfs->ns_sem);
nilfs_cleanup_super(sb);
up_write(&nilfs->ns_sem);
@@ -578,7 +578,7 @@ static int nilfs_freeze(struct super_block *sb)
struct the_nilfs *nilfs = sb->s_fs_info;
int err;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
/* Mark super block clean */
@@ -592,7 +592,7 @@ static int nilfs_unfreeze(struct super_block *sb)
{
struct the_nilfs *nilfs = sb->s_fs_info;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
down_write(&nilfs->ns_sem);
@@ -898,7 +898,7 @@ int nilfs_check_feature_compatibility(struct super_block *sb,
}
features = le64_to_cpu(sbp->s_feature_compat_ro) &
~NILFS_FEATURE_COMPAT_RO_SUPP;
- if (!(sb->s_flags & MS_RDONLY) && features) {
+ if (!sb_rdonly(sb) && features) {
nilfs_msg(sb, KERN_ERR,
"couldn't mount RDWR because of unsupported optional features (%llx)",
(unsigned long long)features);
@@ -1083,7 +1083,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent)
goto failed_unload;
}
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
err = nilfs_attach_log_writer(sb, fsroot);
if (err)
goto failed_checkpoint;
@@ -1095,7 +1095,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent)
nilfs_put_root(fsroot);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
down_write(&nilfs->ns_sem);
nilfs_setup_super(sb, true);
up_write(&nilfs->ns_sem);
@@ -1144,7 +1144,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
goto restore_opts;
}
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
goto out;
if (*flags & MS_RDONLY) {
/* Shutting down log writer */
@@ -1338,8 +1338,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags,
if ((flags ^ s->s_flags) & MS_RDONLY) {
nilfs_msg(s, KERN_ERR,
"the device already has a %s mount.",
- (s->s_flags & MS_RDONLY) ?
- "read-only" : "read/write");
+ sb_rdonly(s) ? "read-only" : "read/write");
err = -EBUSY;
goto failed_super;
}
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
index ecb49870a680..3f70f041dbe9 100644
--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -487,7 +487,7 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt)
* When remounting read-only, mark the volume clean if no volume errors
* have occurred.
*/
- if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
+ if (sb_rdonly(sb) && !(*flags & MS_RDONLY)) {
static const char *es = ". Cannot remount read-write.";
/* Remounting read-write. */
@@ -548,7 +548,7 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt)
NVolSetErrors(vol);
return -EROFS;
}
- } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) {
+ } else if (!sb_rdonly(sb) && (*flags & MS_RDONLY)) {
/* Remounting read-only. */
if (!NVolErrors(vol)) {
if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY))
@@ -732,7 +732,7 @@ hotfix_primary_boot_sector:
* on a large sector device contains the whole boot loader or
* just the first 512 bytes).
*/
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
ntfs_warning(sb, "Hot-fix: Recovering invalid primary "
"boot sector from backup copy.");
memcpy(bh_primary->b_data, bh_backup->b_data,
@@ -1789,7 +1789,7 @@ static bool load_system_files(ntfs_volume *vol)
static const char *es3 = ". Run ntfsfix and/or chkdsk.";
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -1928,7 +1928,7 @@ get_ctx_vol_failed:
(unsigned)le16_to_cpu(vol->vol_flags));
}
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -1961,7 +1961,7 @@ get_ctx_vol_failed:
es1 = !vol->logfile_ino ? es1a : es1b;
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -2010,7 +2010,7 @@ get_ctx_vol_failed:
es1 = err < 0 ? es1a : es1b;
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -2028,8 +2028,7 @@ get_ctx_vol_failed:
NVolSetErrors(vol);
}
/* If (still) a read-write mount, mark the volume dirty. */
- if (!(sb->s_flags & MS_RDONLY) &&
- ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) {
+ if (!sb_rdonly(sb) && ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) {
static const char *es1 = "Failed to set dirty bit in volume "
"information flags";
static const char *es2 = ". Run chkdsk.";
@@ -2075,8 +2074,7 @@ get_ctx_vol_failed:
}
#endif
/* If (still) a read-write mount, empty the logfile. */
- if (!(sb->s_flags & MS_RDONLY) &&
- !ntfs_empty_logfile(vol->logfile_ino)) {
+ if (!sb_rdonly(sb) && !ntfs_empty_logfile(vol->logfile_ino)) {
static const char *es1 = "Failed to empty $LogFile";
static const char *es2 = ". Mount in Windows.";
@@ -2121,7 +2119,7 @@ get_ctx_vol_failed:
static const char *es2 = ". Run chkdsk.";
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -2139,8 +2137,7 @@ get_ctx_vol_failed:
NVolSetErrors(vol);
}
/* If (still) a read-write mount, mark the quotas out of date. */
- if (!(sb->s_flags & MS_RDONLY) &&
- !ntfs_mark_quotas_out_of_date(vol)) {
+ if (!sb_rdonly(sb) && !ntfs_mark_quotas_out_of_date(vol)) {
static const char *es1 = "Failed to mark quotas out of date";
static const char *es2 = ". Run chkdsk.";
@@ -2165,7 +2162,7 @@ get_ctx_vol_failed:
static const char *es2 = ". Run chkdsk.";
/* If a read-write mount, convert it to a read-only mount. */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!(vol->on_errors & (ON_ERRORS_REMOUNT_RO |
ON_ERRORS_CONTINUE))) {
ntfs_error(sb, "%s and neither on_errors="
@@ -2183,7 +2180,7 @@ get_ctx_vol_failed:
NVolSetErrors(vol);
}
/* If (still) a read-write mount, stamp the transaction log. */
- if (!(sb->s_flags & MS_RDONLY) && !ntfs_stamp_usnjrnl(vol)) {
+ if (!sb_rdonly(sb) && !ntfs_stamp_usnjrnl(vol)) {
static const char *es1 = "Failed to stamp transaction log "
"($UsnJrnl)";
static const char *es2 = ". Run chkdsk.";
@@ -2314,7 +2311,7 @@ static void ntfs_put_super(struct super_block *sb)
* If a read-write mount and no volume errors have occurred, mark the
* volume clean. Also, re-commit all affected inodes.
*/
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!NVolErrors(vol)) {
if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY))
ntfs_warning(sb, "Failed to clear dirty bit "
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 3f936be379a9..80733496b22a 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -675,7 +675,7 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data)
}
/* We're going to/from readonly mode. */
- if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) {
+ if ((bool)(*flags & MS_RDONLY) != sb_rdonly(sb)) {
/* Disable quota accounting before remounting RO */
if (*flags & MS_RDONLY) {
ret = ocfs2_susp_quotas(osb, 0);
@@ -1063,7 +1063,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
/* Hard readonly mode only if: bdev_read_only, MS_RDONLY,
* heartbeat=none */
if (bdev_read_only(sb->s_bdev)) {
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
status = -EACCES;
mlog(ML_ERROR, "Readonly device detected but readonly "
"mount was not specified.\n");
@@ -1098,7 +1098,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
}
if (!ocfs2_is_hard_readonly(osb)) {
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
ocfs2_set_ro_flag(osb, 0);
}
@@ -1179,7 +1179,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
/* Now we can initialize quotas because we can afford to wait
* for cluster locks recovery now. That also means that truncation
* log recovery can happen but that waits for proper quota setup */
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
status = ocfs2_enable_quotas(osb);
if (status < 0) {
/* We have to err-out specially here because
@@ -2180,8 +2180,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
status = -EINVAL;
goto bail;
}
- if (!(osb->sb->s_flags & MS_RDONLY) &&
- (i = OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, ~OCFS2_FEATURE_RO_COMPAT_SUPP))) {
+ if (!sb_rdonly(osb->sb) && (i = OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, ~OCFS2_FEATURE_RO_COMPAT_SUPP))) {
mlog(ML_ERROR, "couldn't mount RDWR because of "
"unsupported optional features (%x).\n", i);
status = -EINVAL;
@@ -2567,9 +2566,7 @@ static int ocfs2_handle_error(struct super_block *sb)
rv = -EIO;
} else { /* default option */
rv = -EROFS;
- if (sb->s_flags & MS_RDONLY &&
- (ocfs2_is_soft_readonly(osb) ||
- ocfs2_is_hard_readonly(osb)))
+ if (sb_rdonly(sb) && (ocfs2_is_soft_readonly(osb) || ocfs2_is_hard_readonly(osb)))
return rv;
pr_crit("OCFS2: File system is now read-only.\n");
diff --git a/fs/open.c b/fs/open.c
index 35bb784763a4..7ea118471dce 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -96,7 +96,7 @@ long vfs_truncate(const struct path *path, loff_t length)
* write access on the upper inode, not on the overlay inode. For
* non-overlay filesystems d_real() is an identity function.
*/
- upperdentry = d_real(path->dentry, NULL, O_WRONLY);
+ upperdentry = d_real(path->dentry, NULL, O_WRONLY, 0);
error = PTR_ERR(upperdentry);
if (IS_ERR(upperdentry))
goto mnt_drop_write_and_out;
@@ -670,12 +670,12 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
if (!f.file)
goto out;
- error = mnt_want_write_file(f.file);
+ error = mnt_want_write_file_path(f.file);
if (error)
goto out_fput;
audit_file(f.file);
error = chown_common(&f.file->f_path, user, group);
- mnt_drop_write_file(f.file);
+ mnt_drop_write_file_path(f.file);
out_fput:
fdput(f);
out:
@@ -857,7 +857,7 @@ EXPORT_SYMBOL(file_path);
int vfs_open(const struct path *path, struct file *file,
const struct cred *cred)
{
- struct dentry *dentry = d_real(path->dentry, NULL, file->f_flags);
+ struct dentry *dentry = d_real(path->dentry, NULL, file->f_flags, 0);
if (IS_ERR(dentry))
return PTR_ERR(dentry);
diff --git a/fs/orangefs/acl.c b/fs/orangefs/acl.c
index 7a3754488312..9108ef433e6d 100644
--- a/fs/orangefs/acl.c
+++ b/fs/orangefs/acl.c
@@ -35,7 +35,7 @@ struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
* I don't do that for now.
*/
value = kmalloc(ORANGEFS_MAX_XATTR_VALUELEN, GFP_KERNEL);
- if (value == NULL)
+ if (!value)
return ERR_PTR(-ENOMEM);
gossip_debug(GOSSIP_ACL_DEBUG,
@@ -61,9 +61,9 @@ struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
return acl;
}
-int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+static int __orangefs_set_acl(struct inode *inode, struct posix_acl *acl,
+ int type)
{
- struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
int error = 0;
void *value = NULL;
size_t size = 0;
@@ -72,22 +72,6 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
switch (type) {
case ACL_TYPE_ACCESS:
name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
- umode_t mode;
-
- error = posix_acl_update_mode(inode, &mode, &acl);
- if (error) {
- gossip_err("%s: posix_acl_update_mode err: %d\n",
- __func__,
- error);
- return error;
- }
-
- if (inode->i_mode != mode)
- SetModeFlag(orangefs_inode);
- inode->i_mode = mode;
- mark_inode_dirty_sync(inode);
- }
break;
case ACL_TYPE_DEFAULT:
name = XATTR_NAME_POSIX_ACL_DEFAULT;
@@ -132,6 +116,42 @@ out:
return error;
}
+int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+{
+ int error;
+ struct iattr iattr;
+ int rc;
+
+ if (type == ACL_TYPE_ACCESS && acl) {
+ /*
+ * posix_acl_update_mode checks to see if the permissions
+ * described by the ACL can be encoded into the
+ * object's mode. If so, it sets "acl" to NULL
+ * and "mode" to the new desired value. It is up to
+ * us to propagate the new mode back to the server...
+ */
+ error = posix_acl_update_mode(inode, &iattr.ia_mode, &acl);
+ if (error) {
+ gossip_err("%s: posix_acl_update_mode err: %d\n",
+ __func__,
+ error);
+ return error;
+ }
+
+ if (acl) {
+ rc = __orangefs_set_acl(inode, acl, type);
+ } else {
+ iattr.ia_valid = ATTR_MODE;
+ rc = orangefs_inode_setattr(inode, &iattr);
+ }
+
+ return rc;
+
+ } else {
+ return -EINVAL;
+ }
+}
+
int orangefs_init_acl(struct inode *inode, struct inode *dir)
{
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
@@ -146,13 +166,14 @@ int orangefs_init_acl(struct inode *inode, struct inode *dir)
return error;
if (default_acl) {
- error = orangefs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
+ error = __orangefs_set_acl(inode, default_acl,
+ ACL_TYPE_DEFAULT);
posix_acl_release(default_acl);
}
if (acl) {
if (!error)
- error = orangefs_set_acl(inode, acl, ACL_TYPE_ACCESS);
+ error = __orangefs_set_acl(inode, acl, ACL_TYPE_ACCESS);
posix_acl_release(acl);
}
diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c
index c19f0787c9c6..2826859bdc2c 100644
--- a/fs/orangefs/devorangefs-req.c
+++ b/fs/orangefs/devorangefs-req.c
@@ -461,13 +461,10 @@ static ssize_t orangefs_devreq_write_iter(struct kiocb *iocb,
if (op->downcall.type != ORANGEFS_VFS_OP_READDIR)
goto wakeup;
- op->downcall.trailer_buf =
- vmalloc(op->downcall.trailer_size);
- if (op->downcall.trailer_buf == NULL) {
- gossip_err("%s: failed trailer vmalloc.\n",
- __func__);
+ op->downcall.trailer_buf = vmalloc(op->downcall.trailer_size);
+ if (!op->downcall.trailer_buf)
goto Enomem;
- }
+
memset(op->downcall.trailer_buf, 0, op->downcall.trailer_size);
if (!copy_from_iter_full(op->downcall.trailer_buf,
op->downcall.trailer_size, iter)) {
diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c
index 28f38d813ad2..336ecbf8c268 100644
--- a/fs/orangefs/file.c
+++ b/fs/orangefs/file.c
@@ -646,14 +646,11 @@ static int orangefs_fsync(struct file *file,
loff_t end,
int datasync)
{
- int ret = -EINVAL;
+ int ret;
struct orangefs_inode_s *orangefs_inode =
ORANGEFS_I(file_inode(file));
struct orangefs_kernel_op_s *new_op = NULL;
- /* required call */
- filemap_write_and_wait_range(file->f_mapping, start, end);
-
new_op = op_alloc(ORANGEFS_VFS_OP_FSYNC);
if (!new_op)
return -ENOMEM;
diff --git a/fs/orangefs/orangefs-bufmap.c b/fs/orangefs/orangefs-bufmap.c
index 038d67545d9f..7ef473f3d642 100644
--- a/fs/orangefs/orangefs-bufmap.c
+++ b/fs/orangefs/orangefs-bufmap.c
@@ -244,20 +244,14 @@ orangefs_bufmap_alloc(struct ORANGEFS_dev_map_desc *user_desc)
bufmap->buffer_index_array =
kzalloc(DIV_ROUND_UP(bufmap->desc_count, BITS_PER_LONG), GFP_KERNEL);
- if (!bufmap->buffer_index_array) {
- gossip_err("orangefs: could not allocate %d buffer indices\n",
- bufmap->desc_count);
+ if (!bufmap->buffer_index_array)
goto out_free_bufmap;
- }
bufmap->desc_array =
kcalloc(bufmap->desc_count, sizeof(struct orangefs_bufmap_desc),
GFP_KERNEL);
- if (!bufmap->desc_array) {
- gossip_err("orangefs: could not allocate %d descriptors\n",
- bufmap->desc_count);
+ if (!bufmap->desc_array)
goto out_free_index_array;
- }
bufmap->page_count = bufmap->total_size / PAGE_SIZE;
diff --git a/fs/orangefs/orangefs-debugfs.c b/fs/orangefs/orangefs-debugfs.c
index 716ed337f166..5f59917fd631 100644
--- a/fs/orangefs/orangefs-debugfs.c
+++ b/fs/orangefs/orangefs-debugfs.c
@@ -571,11 +571,8 @@ static int orangefs_prepare_cdm_array(char *debug_array_string)
goto out;
}
- cdm_array =
- kzalloc(cdm_element_count * sizeof(struct client_debug_mask),
- GFP_KERNEL);
+ cdm_array = kcalloc(cdm_element_count, sizeof(*cdm_array), GFP_KERNEL);
if (!cdm_array) {
- pr_info("malloc failed for cdm_array!\n");
rc = -ENOMEM;
goto out;
}
diff --git a/fs/orangefs/orangefs-mod.c b/fs/orangefs/orangefs-mod.c
index c1b5174cb5a9..85ef87245a87 100644
--- a/fs/orangefs/orangefs-mod.c
+++ b/fs/orangefs/orangefs-mod.c
@@ -98,7 +98,6 @@ static int __init orangefs_init(void)
orangefs_htable_ops_in_progress =
kcalloc(hash_table_size, sizeof(struct list_head), GFP_KERNEL);
if (!orangefs_htable_ops_in_progress) {
- gossip_err("Failed to initialize op hashtable");
ret = -ENOMEM;
goto cleanup_inode;
}
diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c
index 5a1bed6c8c6a..47f3fb9cbec4 100644
--- a/fs/orangefs/super.c
+++ b/fs/orangefs/super.c
@@ -107,10 +107,8 @@ static struct inode *orangefs_alloc_inode(struct super_block *sb)
struct orangefs_inode_s *orangefs_inode;
orangefs_inode = kmem_cache_alloc(orangefs_inode_cache, GFP_KERNEL);
- if (orangefs_inode == NULL) {
- gossip_err("Failed to allocate orangefs_inode\n");
+ if (!orangefs_inode)
return NULL;
- }
/*
* We want to clear everything except for rw_semaphore and the
diff --git a/fs/orangefs/xattr.c b/fs/orangefs/xattr.c
index 237c9c04dc3b..81ac88bb91ff 100644
--- a/fs/orangefs/xattr.c
+++ b/fs/orangefs/xattr.c
@@ -76,7 +76,7 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name,
if (S_ISLNK(inode->i_mode))
return -EOPNOTSUPP;
- if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
+ if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN)
return -EINVAL;
fsuid = from_kuid(&init_user_ns, current_fsuid());
@@ -169,7 +169,7 @@ static int orangefs_inode_removexattr(struct inode *inode, const char *name,
struct orangefs_kernel_op_s *new_op = NULL;
int ret = -ENOMEM;
- if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
+ if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN)
return -EINVAL;
down_write(&orangefs_inode->xattr_sem);
@@ -233,13 +233,13 @@ int orangefs_inode_setxattr(struct inode *inode, const char *name,
if (size > ORANGEFS_MAX_XATTR_VALUELEN)
return -EINVAL;
- if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
+ if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN)
return -EINVAL;
internal_flag = convert_to_internal_xattr_flags(flags);
/* This is equivalent to a removexattr */
- if (size == 0 && value == NULL) {
+ if (size == 0 && !value) {
gossip_debug(GOSSIP_XATTR_DEBUG,
"removing xattr (%s)\n",
name);
@@ -311,7 +311,7 @@ ssize_t orangefs_listxattr(struct dentry *dentry, char *buffer, size_t size)
int i = 0;
int returned_count = 0;
- if (size > 0 && buffer == NULL) {
+ if (size > 0 && !buffer) {
gossip_err("%s: bogus NULL pointers\n", __func__);
return -EINVAL;
}
@@ -442,7 +442,7 @@ static int orangefs_xattr_get_default(const struct xattr_handler *handler,
}
-static struct xattr_handler orangefs_xattr_default_handler = {
+static const struct xattr_handler orangefs_xattr_default_handler = {
.prefix = "", /* match any name => handlers called with full name */
.get = orangefs_xattr_get_default,
.set = orangefs_xattr_set_default,
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index acb6f97deb97..aad97b30d5e6 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -241,7 +241,7 @@ struct ovl_fh *ovl_encode_fh(struct dentry *lower, bool is_upper)
int buflen = MAX_HANDLE_SZ;
uuid_t *uuid = &lower->d_sb->s_uuid;
- buf = kmalloc(buflen, GFP_TEMPORARY);
+ buf = kmalloc(buflen, GFP_KERNEL);
if (!buf)
return ERR_PTR(-ENOMEM);
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 48b70e6490f3..3309b1912241 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -155,7 +155,7 @@ static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
static void ovl_instantiate(struct dentry *dentry, struct inode *inode,
struct dentry *newdentry, bool hardlink)
{
- ovl_dentry_version_inc(dentry->d_parent);
+ ovl_dentry_version_inc(dentry->d_parent, false);
ovl_dentry_set_upper_alias(dentry);
if (!hardlink) {
ovl_inode_update(inode, newdentry);
@@ -692,7 +692,7 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
if (flags)
ovl_cleanup(wdir, upper);
- ovl_dentry_version_inc(dentry->d_parent);
+ ovl_dentry_version_inc(dentry->d_parent, true);
out_d_drop:
d_drop(dentry);
dput(whiteout);
@@ -742,7 +742,7 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir)
err = vfs_rmdir(dir, upper);
else
err = vfs_unlink(dir, upper, NULL);
- ovl_dentry_version_inc(dentry->d_parent);
+ ovl_dentry_version_inc(dentry->d_parent, ovl_type_origin(dentry));
/*
* Keeping this dentry hashed would mean having to release
@@ -833,7 +833,7 @@ static char *ovl_get_redirect(struct dentry *dentry, bool samedir)
goto out;
}
- buf = ret = kmalloc(buflen, GFP_TEMPORARY);
+ buf = ret = kmalloc(buflen, GFP_KERNEL);
if (!buf)
goto out;
@@ -1089,8 +1089,9 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
drop_nlink(d_inode(new));
}
- ovl_dentry_version_inc(old->d_parent);
- ovl_dentry_version_inc(new->d_parent);
+ ovl_dentry_version_inc(old->d_parent,
+ !overwrite && ovl_type_origin(new));
+ ovl_dentry_version_inc(new->d_parent, ovl_type_origin(old));
out_dput:
dput(newdentry);
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 5bc71642b226..a619addecafc 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -498,6 +498,9 @@ static int ovl_set_nlink_common(struct dentry *dentry,
len = snprintf(buf, sizeof(buf), format,
(int) (inode->i_nlink - realinode->i_nlink));
+ if (WARN_ON(len >= sizeof(buf)))
+ return -EIO;
+
return ovl_do_setxattr(ovl_dentry_upper(dentry),
OVL_XATTR_NLINK, buf, len, 0);
}
@@ -576,10 +579,13 @@ static int ovl_inode_set(struct inode *inode, void *data)
static bool ovl_verify_inode(struct inode *inode, struct dentry *lowerdentry,
struct dentry *upperdentry)
{
- struct inode *lowerinode = lowerdentry ? d_inode(lowerdentry) : NULL;
-
- /* Lower (origin) inode must match, even if NULL */
- if (ovl_inode_lower(inode) != lowerinode)
+ /*
+ * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL.
+ * This happens when finding a copied up overlay inode for a renamed
+ * or hardlinked overlay dentry and lower dentry cannot be followed
+ * by origin because lower fs does not support file handles.
+ */
+ if (lowerdentry && ovl_inode_lower(inode) != d_inode(lowerdentry))
return false;
/*
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index 8aef2b304b2d..c3addd1114f1 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -38,7 +38,7 @@ static int ovl_check_redirect(struct dentry *dentry, struct ovl_lookup_data *d,
return 0;
goto fail;
}
- buf = kzalloc(prelen + res + strlen(post) + 1, GFP_TEMPORARY);
+ buf = kzalloc(prelen + res + strlen(post) + 1, GFP_KERNEL);
if (!buf)
return -ENOMEM;
@@ -103,7 +103,7 @@ static struct ovl_fh *ovl_get_origin_fh(struct dentry *dentry)
if (res == 0)
return NULL;
- fh = kzalloc(res, GFP_TEMPORARY);
+ fh = kzalloc(res, GFP_KERNEL);
if (!fh)
return ERR_PTR(-ENOMEM);
@@ -309,7 +309,7 @@ static int ovl_check_origin(struct dentry *upperdentry,
BUG_ON(*ctrp);
if (!*stackp)
- *stackp = kmalloc(sizeof(struct path), GFP_TEMPORARY);
+ *stackp = kmalloc(sizeof(struct path), GFP_KERNEL);
if (!*stackp) {
dput(origin);
return -ENOMEM;
@@ -418,7 +418,7 @@ int ovl_verify_index(struct dentry *index, struct path *lowerstack,
err = -ENOMEM;
len = index->d_name.len / 2;
- fh = kzalloc(len, GFP_TEMPORARY);
+ fh = kzalloc(len, GFP_KERNEL);
if (!fh)
goto fail;
@@ -478,7 +478,7 @@ int ovl_get_index_name(struct dentry *origin, struct qstr *name)
return PTR_ERR(fh);
err = -ENOMEM;
- n = kzalloc(fh->len * 2, GFP_TEMPORARY);
+ n = kzalloc(fh->len * 2, GFP_KERNEL);
if (n) {
s = bin2hex(n, fh, fh->len);
*name = (struct qstr) QSTR_INIT(n, s - n);
@@ -646,7 +646,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
if (!d.stop && poe->numlower) {
err = -ENOMEM;
stack = kcalloc(ofs->numlower, sizeof(struct path),
- GFP_TEMPORARY);
+ GFP_KERNEL);
if (!stack)
goto out_put_upper;
}
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index e927a62c97ae..d4e8c1a08fb0 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -204,8 +204,8 @@ struct dentry *ovl_i_dentry_upper(struct inode *inode);
struct inode *ovl_inode_upper(struct inode *inode);
struct inode *ovl_inode_lower(struct inode *inode);
struct inode *ovl_inode_real(struct inode *inode);
-struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry);
-void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache);
+struct ovl_dir_cache *ovl_dir_cache(struct inode *inode);
+void ovl_set_dir_cache(struct inode *inode, struct ovl_dir_cache *cache);
bool ovl_dentry_is_opaque(struct dentry *dentry);
bool ovl_dentry_is_whiteout(struct dentry *dentry);
void ovl_dentry_set_opaque(struct dentry *dentry);
@@ -217,7 +217,7 @@ void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect);
void ovl_inode_init(struct inode *inode, struct dentry *upperdentry,
struct dentry *lowerdentry);
void ovl_inode_update(struct inode *inode, struct dentry *upperdentry);
-void ovl_dentry_version_inc(struct dentry *dentry);
+void ovl_dentry_version_inc(struct dentry *dentry, bool impurity);
u64 ovl_dentry_version_get(struct dentry *dentry);
bool ovl_is_whiteout(struct dentry *dentry);
struct file *ovl_path_open(struct path *path, int flags);
@@ -229,6 +229,7 @@ int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
int xerr);
int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry);
void ovl_set_flag(unsigned long flag, struct inode *inode);
+void ovl_clear_flag(unsigned long flag, struct inode *inode);
bool ovl_test_flag(unsigned long flag, struct inode *inode);
bool ovl_inuse_trylock(struct dentry *dentry);
void ovl_inuse_unlock(struct dentry *dentry);
@@ -256,6 +257,7 @@ extern const struct file_operations ovl_dir_operations;
int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list);
void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list);
void ovl_cache_free(struct list_head *list);
+void ovl_dir_cache_free(struct inode *inode);
int ovl_check_d_type_supported(struct path *realpath);
void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt,
struct dentry *dentry, int level);
diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c
index f0fd3adb1693..62e9b22a2077 100644
--- a/fs/overlayfs/readdir.c
+++ b/fs/overlayfs/readdir.c
@@ -15,11 +15,13 @@
#include <linux/rbtree.h>
#include <linux/security.h>
#include <linux/cred.h>
+#include <linux/ratelimit.h>
#include "overlayfs.h"
struct ovl_cache_entry {
unsigned int len;
unsigned int type;
+ u64 real_ino;
u64 ino;
struct list_head l_node;
struct rb_node node;
@@ -32,18 +34,20 @@ struct ovl_dir_cache {
long refcount;
u64 version;
struct list_head entries;
+ struct rb_root root;
};
struct ovl_readdir_data {
struct dir_context ctx;
struct dentry *dentry;
bool is_lowest;
- struct rb_root root;
+ struct rb_root *root;
struct list_head *list;
struct list_head middle;
struct ovl_cache_entry *first_maybe_whiteout;
int count;
int err;
+ bool is_upper;
bool d_type_supported;
};
@@ -58,7 +62,33 @@ struct ovl_dir_file {
static struct ovl_cache_entry *ovl_cache_entry_from_node(struct rb_node *n)
{
- return container_of(n, struct ovl_cache_entry, node);
+ return rb_entry(n, struct ovl_cache_entry, node);
+}
+
+static bool ovl_cache_entry_find_link(const char *name, int len,
+ struct rb_node ***link,
+ struct rb_node **parent)
+{
+ bool found = false;
+ struct rb_node **newp = *link;
+
+ while (!found && *newp) {
+ int cmp;
+ struct ovl_cache_entry *tmp;
+
+ *parent = *newp;
+ tmp = ovl_cache_entry_from_node(*newp);
+ cmp = strncmp(name, tmp->name, len);
+ if (cmp > 0)
+ newp = &tmp->node.rb_right;
+ else if (cmp < 0 || len < tmp->len)
+ newp = &tmp->node.rb_left;
+ else
+ found = true;
+ }
+ *link = newp;
+
+ return found;
}
static struct ovl_cache_entry *ovl_cache_entry_find(struct rb_root *root,
@@ -82,6 +112,32 @@ static struct ovl_cache_entry *ovl_cache_entry_find(struct rb_root *root,
return NULL;
}
+static bool ovl_calc_d_ino(struct ovl_readdir_data *rdd,
+ struct ovl_cache_entry *p)
+{
+ /* Don't care if not doing ovl_iter() */
+ if (!rdd->dentry)
+ return false;
+
+ /* Always recalc d_ino for parent */
+ if (strcmp(p->name, "..") == 0)
+ return true;
+
+ /* If this is lower, then native d_ino will do */
+ if (!rdd->is_upper)
+ return false;
+
+ /*
+ * Recalc d_ino for '.' and for all entries if dir is impure (contains
+ * copied up entries)
+ */
+ if ((p->name[0] == '.' && p->len == 1) ||
+ ovl_test_flag(OVL_IMPURE, d_inode(rdd->dentry)))
+ return true;
+
+ return false;
+}
+
static struct ovl_cache_entry *ovl_cache_entry_new(struct ovl_readdir_data *rdd,
const char *name, int len,
u64 ino, unsigned int d_type)
@@ -97,7 +153,11 @@ static struct ovl_cache_entry *ovl_cache_entry_new(struct ovl_readdir_data *rdd,
p->name[len] = '\0';
p->len = len;
p->type = d_type;
+ p->real_ino = ino;
p->ino = ino;
+ /* Defer setting d_ino for upper entry to ovl_iterate() */
+ if (ovl_calc_d_ino(rdd, p))
+ p->ino = 0;
p->is_whiteout = false;
if (d_type == DT_CHR) {
@@ -111,32 +171,22 @@ static int ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd,
const char *name, int len, u64 ino,
unsigned int d_type)
{
- struct rb_node **newp = &rdd->root.rb_node;
+ struct rb_node **newp = &rdd->root->rb_node;
struct rb_node *parent = NULL;
struct ovl_cache_entry *p;
- while (*newp) {
- int cmp;
- struct ovl_cache_entry *tmp;
-
- parent = *newp;
- tmp = ovl_cache_entry_from_node(*newp);
- cmp = strncmp(name, tmp->name, len);
- if (cmp > 0)
- newp = &tmp->node.rb_right;
- else if (cmp < 0 || len < tmp->len)
- newp = &tmp->node.rb_left;
- else
- return 0;
- }
+ if (ovl_cache_entry_find_link(name, len, &newp, &parent))
+ return 0;
p = ovl_cache_entry_new(rdd, name, len, ino, d_type);
- if (p == NULL)
+ if (p == NULL) {
+ rdd->err = -ENOMEM;
return -ENOMEM;
+ }
list_add_tail(&p->l_node, rdd->list);
rb_link_node(&p->node, parent, newp);
- rb_insert_color(&p->node, &rdd->root);
+ rb_insert_color(&p->node, rdd->root);
return 0;
}
@@ -147,7 +197,7 @@ static int ovl_fill_lowest(struct ovl_readdir_data *rdd,
{
struct ovl_cache_entry *p;
- p = ovl_cache_entry_find(&rdd->root, name, namelen);
+ p = ovl_cache_entry_find(rdd->root, name, namelen);
if (p) {
list_move_tail(&p->l_node, &rdd->middle);
} else {
@@ -172,6 +222,16 @@ void ovl_cache_free(struct list_head *list)
INIT_LIST_HEAD(list);
}
+void ovl_dir_cache_free(struct inode *inode)
+{
+ struct ovl_dir_cache *cache = ovl_dir_cache(inode);
+
+ if (cache) {
+ ovl_cache_free(&cache->entries);
+ kfree(cache);
+ }
+}
+
static void ovl_cache_put(struct ovl_dir_file *od, struct dentry *dentry)
{
struct ovl_dir_cache *cache = od->cache;
@@ -179,8 +239,8 @@ static void ovl_cache_put(struct ovl_dir_file *od, struct dentry *dentry)
WARN_ON(cache->refcount <= 0);
cache->refcount--;
if (!cache->refcount) {
- if (ovl_dir_cache(dentry) == cache)
- ovl_set_dir_cache(dentry, NULL);
+ if (ovl_dir_cache(d_inode(dentry)) == cache)
+ ovl_set_dir_cache(d_inode(dentry), NULL);
ovl_cache_free(&cache->entries);
kfree(cache);
@@ -273,7 +333,8 @@ static void ovl_dir_reset(struct file *file)
od->is_real = false;
}
-static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list)
+static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list,
+ struct rb_root *root)
{
int err;
struct path realpath;
@@ -281,13 +342,14 @@ static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list)
.ctx.actor = ovl_fill_merge,
.dentry = dentry,
.list = list,
- .root = RB_ROOT,
+ .root = root,
.is_lowest = false,
};
int idx, next;
for (idx = 0; idx != -1; idx = next) {
next = ovl_path_next(idx, dentry, &realpath);
+ rdd.is_upper = ovl_dentry_upper(dentry) == realpath.dentry;
if (next != -1) {
err = ovl_dir_read(&realpath, &rdd);
@@ -326,12 +388,13 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry)
int res;
struct ovl_dir_cache *cache;
- cache = ovl_dir_cache(dentry);
+ cache = ovl_dir_cache(d_inode(dentry));
if (cache && ovl_dentry_version_get(dentry) == cache->version) {
+ WARN_ON(!cache->refcount);
cache->refcount++;
return cache;
}
- ovl_set_dir_cache(dentry, NULL);
+ ovl_set_dir_cache(d_inode(dentry), NULL);
cache = kzalloc(sizeof(struct ovl_dir_cache), GFP_KERNEL);
if (!cache)
@@ -339,8 +402,9 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry)
cache->refcount = 1;
INIT_LIST_HEAD(&cache->entries);
+ cache->root = RB_ROOT;
- res = ovl_dir_read_merged(dentry, &cache->entries);
+ res = ovl_dir_read_merged(dentry, &cache->entries, &cache->root);
if (res) {
ovl_cache_free(&cache->entries);
kfree(cache);
@@ -348,22 +412,266 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry)
}
cache->version = ovl_dentry_version_get(dentry);
- ovl_set_dir_cache(dentry, cache);
+ ovl_set_dir_cache(d_inode(dentry), cache);
return cache;
}
+/*
+ * Set d_ino for upper entries. Non-upper entries should always report
+ * the uppermost real inode ino and should not call this function.
+ *
+ * When not all layer are on same fs, report real ino also for upper.
+ *
+ * When all layers are on the same fs, and upper has a reference to
+ * copy up origin, call vfs_getattr() on the overlay entry to make
+ * sure that d_ino will be consistent with st_ino from stat(2).
+ */
+static int ovl_cache_update_ino(struct path *path, struct ovl_cache_entry *p)
+
+{
+ struct dentry *dir = path->dentry;
+ struct dentry *this = NULL;
+ enum ovl_path_type type;
+ u64 ino = p->real_ino;
+ int err = 0;
+
+ if (!ovl_same_sb(dir->d_sb))
+ goto out;
+
+ if (p->name[0] == '.') {
+ if (p->len == 1) {
+ this = dget(dir);
+ goto get;
+ }
+ if (p->len == 2 && p->name[1] == '.') {
+ /* we shall not be moved */
+ this = dget(dir->d_parent);
+ goto get;
+ }
+ }
+ this = lookup_one_len(p->name, dir, p->len);
+ if (IS_ERR_OR_NULL(this) || !this->d_inode) {
+ if (IS_ERR(this)) {
+ err = PTR_ERR(this);
+ this = NULL;
+ goto fail;
+ }
+ goto out;
+ }
+
+get:
+ type = ovl_path_type(this);
+ if (OVL_TYPE_ORIGIN(type)) {
+ struct kstat stat;
+ struct path statpath = *path;
+
+ statpath.dentry = this;
+ err = vfs_getattr(&statpath, &stat, STATX_INO, 0);
+ if (err)
+ goto fail;
+
+ WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev);
+ ino = stat.ino;
+ }
+
+out:
+ p->ino = ino;
+ dput(this);
+ return err;
+
+fail:
+ pr_warn_ratelimited("overlay: failed to look up (%s) for ino (%i)\n",
+ p->name, err);
+ goto out;
+}
+
+static int ovl_fill_plain(struct dir_context *ctx, const char *name,
+ int namelen, loff_t offset, u64 ino,
+ unsigned int d_type)
+{
+ struct ovl_cache_entry *p;
+ struct ovl_readdir_data *rdd =
+ container_of(ctx, struct ovl_readdir_data, ctx);
+
+ rdd->count++;
+ p = ovl_cache_entry_new(rdd, name, namelen, ino, d_type);
+ if (p == NULL) {
+ rdd->err = -ENOMEM;
+ return -ENOMEM;
+ }
+ list_add_tail(&p->l_node, rdd->list);
+
+ return 0;
+}
+
+static int ovl_dir_read_impure(struct path *path, struct list_head *list,
+ struct rb_root *root)
+{
+ int err;
+ struct path realpath;
+ struct ovl_cache_entry *p, *n;
+ struct ovl_readdir_data rdd = {
+ .ctx.actor = ovl_fill_plain,
+ .list = list,
+ .root = root,
+ };
+
+ INIT_LIST_HEAD(list);
+ *root = RB_ROOT;
+ ovl_path_upper(path->dentry, &realpath);
+
+ err = ovl_dir_read(&realpath, &rdd);
+ if (err)
+ return err;
+
+ list_for_each_entry_safe(p, n, list, l_node) {
+ if (strcmp(p->name, ".") != 0 &&
+ strcmp(p->name, "..") != 0) {
+ err = ovl_cache_update_ino(path, p);
+ if (err)
+ return err;
+ }
+ if (p->ino == p->real_ino) {
+ list_del(&p->l_node);
+ kfree(p);
+ } else {
+ struct rb_node **newp = &root->rb_node;
+ struct rb_node *parent = NULL;
+
+ if (WARN_ON(ovl_cache_entry_find_link(p->name, p->len,
+ &newp, &parent)))
+ return -EIO;
+
+ rb_link_node(&p->node, parent, newp);
+ rb_insert_color(&p->node, root);
+ }
+ }
+ return 0;
+}
+
+static struct ovl_dir_cache *ovl_cache_get_impure(struct path *path)
+{
+ int res;
+ struct dentry *dentry = path->dentry;
+ struct ovl_dir_cache *cache;
+
+ cache = ovl_dir_cache(d_inode(dentry));
+ if (cache && ovl_dentry_version_get(dentry) == cache->version)
+ return cache;
+
+ /* Impure cache is not refcounted, free it here */
+ ovl_dir_cache_free(d_inode(dentry));
+ ovl_set_dir_cache(d_inode(dentry), NULL);
+
+ cache = kzalloc(sizeof(struct ovl_dir_cache), GFP_KERNEL);
+ if (!cache)
+ return ERR_PTR(-ENOMEM);
+
+ res = ovl_dir_read_impure(path, &cache->entries, &cache->root);
+ if (res) {
+ ovl_cache_free(&cache->entries);
+ kfree(cache);
+ return ERR_PTR(res);
+ }
+ if (list_empty(&cache->entries)) {
+ /* Good oportunity to get rid of an unnecessary "impure" flag */
+ ovl_do_removexattr(ovl_dentry_upper(dentry), OVL_XATTR_IMPURE);
+ ovl_clear_flag(OVL_IMPURE, d_inode(dentry));
+ kfree(cache);
+ return NULL;
+ }
+
+ cache->version = ovl_dentry_version_get(dentry);
+ ovl_set_dir_cache(d_inode(dentry), cache);
+
+ return cache;
+}
+
+struct ovl_readdir_translate {
+ struct dir_context *orig_ctx;
+ struct ovl_dir_cache *cache;
+ struct dir_context ctx;
+ u64 parent_ino;
+};
+
+static int ovl_fill_real(struct dir_context *ctx, const char *name,
+ int namelen, loff_t offset, u64 ino,
+ unsigned int d_type)
+{
+ struct ovl_readdir_translate *rdt =
+ container_of(ctx, struct ovl_readdir_translate, ctx);
+ struct dir_context *orig_ctx = rdt->orig_ctx;
+
+ if (rdt->parent_ino && strcmp(name, "..") == 0)
+ ino = rdt->parent_ino;
+ else if (rdt->cache) {
+ struct ovl_cache_entry *p;
+
+ p = ovl_cache_entry_find(&rdt->cache->root, name, namelen);
+ if (p)
+ ino = p->ino;
+ }
+
+ return orig_ctx->actor(orig_ctx, name, namelen, offset, ino, d_type);
+}
+
+static int ovl_iterate_real(struct file *file, struct dir_context *ctx)
+{
+ int err;
+ struct ovl_dir_file *od = file->private_data;
+ struct dentry *dir = file->f_path.dentry;
+ struct ovl_readdir_translate rdt = {
+ .ctx.actor = ovl_fill_real,
+ .orig_ctx = ctx,
+ };
+
+ if (OVL_TYPE_MERGE(ovl_path_type(dir->d_parent))) {
+ struct kstat stat;
+ struct path statpath = file->f_path;
+
+ statpath.dentry = dir->d_parent;
+ err = vfs_getattr(&statpath, &stat, STATX_INO, 0);
+ if (err)
+ return err;
+
+ WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev);
+ rdt.parent_ino = stat.ino;
+ }
+
+ if (ovl_test_flag(OVL_IMPURE, d_inode(dir))) {
+ rdt.cache = ovl_cache_get_impure(&file->f_path);
+ if (IS_ERR(rdt.cache))
+ return PTR_ERR(rdt.cache);
+ }
+
+ return iterate_dir(od->realfile, &rdt.ctx);
+}
+
+
static int ovl_iterate(struct file *file, struct dir_context *ctx)
{
struct ovl_dir_file *od = file->private_data;
struct dentry *dentry = file->f_path.dentry;
struct ovl_cache_entry *p;
+ int err;
if (!ctx->pos)
ovl_dir_reset(file);
- if (od->is_real)
+ if (od->is_real) {
+ /*
+ * If parent is merge, then need to adjust d_ino for '..', if
+ * dir is impure then need to adjust d_ino for copied up
+ * entries.
+ */
+ if (ovl_same_sb(dentry->d_sb) &&
+ (ovl_test_flag(OVL_IMPURE, d_inode(dentry)) ||
+ OVL_TYPE_MERGE(ovl_path_type(dentry->d_parent)))) {
+ return ovl_iterate_real(file, ctx);
+ }
return iterate_dir(od->realfile, ctx);
+ }
if (!od->cache) {
struct ovl_dir_cache *cache;
@@ -378,9 +686,15 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx)
while (od->cursor != &od->cache->entries) {
p = list_entry(od->cursor, struct ovl_cache_entry, l_node);
- if (!p->is_whiteout)
+ if (!p->is_whiteout) {
+ if (!p->ino) {
+ err = ovl_cache_update_ino(&file->f_path, p);
+ if (err)
+ return err;
+ }
if (!dir_emit(ctx, p->name, p->len, p->ino, p->type))
break;
+ }
od->cursor = p->l_node.next;
ctx->pos++;
}
@@ -522,8 +836,9 @@ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list)
{
int err;
struct ovl_cache_entry *p;
+ struct rb_root root = RB_ROOT;
- err = ovl_dir_read_merged(dentry, list);
+ err = ovl_dir_read_merged(dentry, list, &root);
if (err)
return err;
@@ -612,12 +927,13 @@ static void ovl_workdir_cleanup_recurse(struct path *path, int level)
int err;
struct inode *dir = path->dentry->d_inode;
LIST_HEAD(list);
+ struct rb_root root = RB_ROOT;
struct ovl_cache_entry *p;
struct ovl_readdir_data rdd = {
.ctx.actor = ovl_fill_merge,
.dentry = NULL,
.list = &list,
- .root = RB_ROOT,
+ .root = &root,
.is_lowest = false,
};
@@ -675,12 +991,13 @@ int ovl_indexdir_cleanup(struct dentry *dentry, struct vfsmount *mnt,
struct inode *dir = dentry->d_inode;
struct path path = { .mnt = mnt, .dentry = dentry };
LIST_HEAD(list);
+ struct rb_root root = RB_ROOT;
struct ovl_cache_entry *p;
struct ovl_readdir_data rdd = {
.ctx.actor = ovl_fill_merge,
.dentry = NULL,
.list = &list,
- .root = RB_ROOT,
+ .root = &root,
.is_lowest = false,
};
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index d86e89f97201..fd5ea4facc62 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -70,20 +70,20 @@ static int ovl_check_append_only(struct inode *inode, int flag)
static struct dentry *ovl_d_real(struct dentry *dentry,
const struct inode *inode,
- unsigned int open_flags)
+ unsigned int open_flags, unsigned int flags)
{
struct dentry *real;
int err;
+ if (flags & D_REAL_UPPER)
+ return ovl_dentry_upper(dentry);
+
if (!d_is_reg(dentry)) {
if (!inode || inode == d_inode(dentry))
return dentry;
goto bug;
}
- if (d_is_negative(dentry))
- return dentry;
-
if (open_flags) {
err = ovl_open_maybe_copy_up(dentry, open_flags);
if (err)
@@ -105,7 +105,7 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
goto bug;
/* Handle recursion */
- real = d_real(real, inode, open_flags);
+ real = d_real(real, inode, open_flags, 0);
if (!inode || inode == d_inode(real))
return real;
@@ -198,6 +198,7 @@ static void ovl_destroy_inode(struct inode *inode)
dput(oi->__upperdentry);
kfree(oi->redirect);
+ ovl_dir_cache_free(inode);
mutex_destroy(&oi->lock);
call_rcu(&inode->i_rcu, ovl_i_callback);
@@ -869,7 +870,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
goto out_free_config;
/* Upper fs should not be r/o */
- if (upperpath.mnt->mnt_sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(upperpath.mnt->mnt_sb)) {
pr_err("overlayfs: upper fs is r/o, try multi-lower layers mount\n");
err = -EINVAL;
goto out_put_upperpath;
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
index f46ad75dc96a..117794582f9f 100644
--- a/fs/overlayfs/util.c
+++ b/fs/overlayfs/util.c
@@ -180,14 +180,14 @@ struct inode *ovl_inode_real(struct inode *inode)
}
-struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry)
+struct ovl_dir_cache *ovl_dir_cache(struct inode *inode)
{
- return OVL_I(d_inode(dentry))->cache;
+ return OVL_I(inode)->cache;
}
-void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache)
+void ovl_set_dir_cache(struct inode *inode, struct ovl_dir_cache *cache)
{
- OVL_I(d_inode(dentry))->cache = cache;
+ OVL_I(inode)->cache = cache;
}
bool ovl_dentry_is_opaque(struct dentry *dentry)
@@ -275,12 +275,19 @@ void ovl_inode_update(struct inode *inode, struct dentry *upperdentry)
}
}
-void ovl_dentry_version_inc(struct dentry *dentry)
+void ovl_dentry_version_inc(struct dentry *dentry, bool impurity)
{
struct inode *inode = d_inode(dentry);
WARN_ON(!inode_is_locked(inode));
- OVL_I(inode)->version++;
+ /*
+ * Version is used by readdir code to keep cache consistent. For merge
+ * dirs all changes need to be noted. For non-merge dirs, cache only
+ * contains impure (ones which have been copied up and have origins)
+ * entries, so only need to note changes to impure entries.
+ */
+ if (OVL_TYPE_MERGE(ovl_path_type(dentry)) || impurity)
+ OVL_I(inode)->version++;
}
u64 ovl_dentry_version_get(struct dentry *dentry)
@@ -382,6 +389,11 @@ void ovl_set_flag(unsigned long flag, struct inode *inode)
set_bit(flag, &OVL_I(inode)->flags);
}
+void ovl_clear_flag(unsigned long flag, struct inode *inode)
+{
+ clear_bit(flag, &OVL_I(inode)->flags);
+}
+
bool ovl_test_flag(unsigned long flag, struct inode *inode)
{
return test_bit(flag, &OVL_I(inode)->flags);
diff --git a/fs/proc/array.c b/fs/proc/array.c
index 88c355574aa0..77a8eacbe032 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -62,6 +62,7 @@
#include <linux/mman.h>
#include <linux/sched/mm.h>
#include <linux/sched/numa_balancing.h>
+#include <linux/sched/task_stack.h>
#include <linux/sched/task.h>
#include <linux/sched/cputime.h>
#include <linux/proc_fs.h>
@@ -118,30 +119,25 @@ static inline void task_name(struct seq_file *m, struct task_struct *p)
* simple bit tests.
*/
static const char * const task_state_array[] = {
- "R (running)", /* 0 */
- "S (sleeping)", /* 1 */
- "D (disk sleep)", /* 2 */
- "T (stopped)", /* 4 */
- "t (tracing stop)", /* 8 */
- "X (dead)", /* 16 */
- "Z (zombie)", /* 32 */
+
+ /* states in TASK_REPORT: */
+ "R (running)", /* 0x00 */
+ "S (sleeping)", /* 0x01 */
+ "D (disk sleep)", /* 0x02 */
+ "T (stopped)", /* 0x04 */
+ "t (tracing stop)", /* 0x08 */
+ "X (dead)", /* 0x10 */
+ "Z (zombie)", /* 0x20 */
+ "P (parked)", /* 0x40 */
+
+ /* states beyond TASK_REPORT: */
+ "I (idle)", /* 0x80 */
};
static inline const char *get_task_state(struct task_struct *tsk)
{
- unsigned int state = (tsk->state | tsk->exit_state) & TASK_REPORT;
-
- /*
- * Parked tasks do not run; they sit in __kthread_parkme().
- * Without this check, we would report them as running, which is
- * clearly wrong, so we report them as sleeping instead.
- */
- if (tsk->state == TASK_PARKED)
- state = TASK_INTERRUPTIBLE;
-
- BUILD_BUG_ON(1 + ilog2(TASK_REPORT) != ARRAY_SIZE(task_state_array)-1);
-
- return task_state_array[fls(state)];
+ BUILD_BUG_ON(1 + ilog2(TASK_REPORT_MAX) != ARRAY_SIZE(task_state_array));
+ return task_state_array[__get_task_state(tsk)];
}
static inline int get_task_umask(struct task_struct *tsk)
@@ -421,7 +417,15 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
* esp and eip are intentionally zeroed out. There is no
* non-racy way to read them without freezing the task.
* Programs that need reliable values can use ptrace(2).
+ *
+ * The only exception is if the task is core dumping because
+ * a program is not able to use ptrace(2) in that case. It is
+ * safe because the task has stopped executing permanently.
*/
+ if (permitted && (task->flags & PF_DUMPCORE)) {
+ eip = KSTK_EIP(task);
+ esp = KSTK_ESP(task);
+ }
}
get_task_comm(tcomm, task);
diff --git a/fs/proc/base.c b/fs/proc/base.c
index e5d89a0d0b8a..ad3b0762cc3e 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -232,7 +232,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,
goto out_mmput;
}
- page = (char *)__get_free_page(GFP_TEMPORARY);
+ page = (char *)__get_free_page(GFP_KERNEL);
if (!page) {
rv = -ENOMEM;
goto out_mmput;
@@ -813,7 +813,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf,
if (!mm)
return 0;
- page = (char *)__get_free_page(GFP_TEMPORARY);
+ page = (char *)__get_free_page(GFP_KERNEL);
if (!page)
return -ENOMEM;
@@ -918,7 +918,7 @@ static ssize_t environ_read(struct file *file, char __user *buf,
if (!mm || !mm->env_end)
return 0;
- page = (char *)__get_free_page(GFP_TEMPORARY);
+ page = (char *)__get_free_page(GFP_KERNEL);
if (!page)
return -ENOMEM;
@@ -1630,7 +1630,7 @@ out:
static int do_proc_readlink(struct path *path, char __user *buffer, int buflen)
{
- char *tmp = (char*)__get_free_page(GFP_TEMPORARY);
+ char *tmp = (char *)__get_free_page(GFP_KERNEL);
char *pathname;
int len;
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 7b40e11ede9b..5589b4bd4b85 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -1474,7 +1474,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
pm.show_pfn = file_ns_capable(file, &init_user_ns, CAP_SYS_ADMIN);
pm.len = (PAGEMAP_WALK_SIZE >> PAGE_SHIFT);
- pm.buffer = kmalloc(pm.len * PM_ENTRY_BYTES, GFP_TEMPORARY);
+ pm.buffer = kmalloc(pm.len * PM_ENTRY_BYTES, GFP_KERNEL);
ret = -ENOMEM;
if (!pm.buffer)
goto out_mm;
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
index dea90b566a6e..b00b766098fa 100644
--- a/fs/proc/task_nommu.c
+++ b/fs/proc/task_nommu.c
@@ -145,7 +145,6 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
int is_pid)
{
struct mm_struct *mm = vma->vm_mm;
- struct proc_maps_private *priv = m->private;
unsigned long ino = 0;
struct file *file;
dev_t dev = 0;
diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c
index b5713fefb4c1..99dff222fe67 100644
--- a/fs/proc_namespace.c
+++ b/fs/proc_namespace.c
@@ -178,7 +178,7 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
} else {
mangle(m, r->mnt_devname ? r->mnt_devname : "none");
}
- seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw");
+ seq_puts(m, sb_rdonly(sb) ? " ro" : " rw");
err = show_sb_opts(m, sb);
if (err)
goto out;
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 8381db9db6d9..50b0556a124f 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1980,7 +1980,9 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
ret = dquot_add_space(transfer_to[cnt], cur_space, rsv_space, 0,
&warn_to[cnt]);
if (ret) {
+ spin_lock(&transfer_to[cnt]->dq_dqb_lock);
dquot_decr_inodes(transfer_to[cnt], inode_usage);
+ spin_unlock(&transfer_to[cnt]->dq_dqb_lock);
goto over_quota;
}
}
diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index 07e08c7d05ca..a9c5dfe6b83e 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -753,7 +753,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
case Q_XGETNEXTQUOTA:
return quota_getnextxquota(sb, type, id, addr);
case Q_XQUOTASYNC:
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
/* XFS quotas are fully coherent now, making this call a noop */
return 0;
diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c
index c0187cda2c1e..a73e5b34db41 100644
--- a/fs/quota/quota_v2.c
+++ b/fs/quota/quota_v2.c
@@ -328,12 +328,16 @@ static int v2_write_dquot(struct dquot *dquot)
if (!dquot->dq_off) {
alloc = true;
down_write(&dqopt->dqio_sem);
+ } else {
+ down_read(&dqopt->dqio_sem);
}
ret = qtree_write_dquot(
sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv,
dquot);
if (alloc)
up_write(&dqopt->dqio_sem);
+ else
+ up_read(&dqopt->dqio_sem);
return ret;
}
diff --git a/fs/read_write.c b/fs/read_write.c
index 61b58c7b6531..f0d4b16873e8 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -112,7 +112,7 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
* In the generic case the entire file is data, so as long as
* offset isn't at the end of the file then the offset is data.
*/
- if (offset >= eof)
+ if ((unsigned long long)offset >= eof)
return -ENXIO;
break;
case SEEK_HOLE:
@@ -120,7 +120,7 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
* There is a virtual hole at the end of the file, so as long as
* offset isn't i_size or larger, return i_size.
*/
- if (offset >= eof)
+ if ((unsigned long long)offset >= eof)
return -ENXIO;
offset = eof;
break;
@@ -413,7 +413,20 @@ ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
else
return -EINVAL;
}
-EXPORT_SYMBOL(__vfs_read);
+
+ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
+{
+ mm_segment_t old_fs;
+ ssize_t result;
+
+ old_fs = get_fs();
+ set_fs(get_ds());
+ /* The cast to a user pointer is valid due to the set_fs() */
+ result = vfs_read(file, (void __user *)buf, count, pos);
+ set_fs(old_fs);
+ return result;
+}
+EXPORT_SYMBOL(kernel_read);
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
@@ -441,8 +454,6 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
return ret;
}
-EXPORT_SYMBOL(vfs_read);
-
static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
@@ -471,9 +482,8 @@ ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,
else
return -EINVAL;
}
-EXPORT_SYMBOL(__vfs_write);
-ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
+ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
{
mm_segment_t old_fs;
const char __user *p;
@@ -496,9 +506,24 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t
inc_syscw(current);
return ret;
}
-
EXPORT_SYMBOL(__kernel_write);
+ssize_t kernel_write(struct file *file, const void *buf, size_t count,
+ loff_t *pos)
+{
+ mm_segment_t old_fs;
+ ssize_t res;
+
+ old_fs = get_fs();
+ set_fs(get_ds());
+ /* The cast to a user pointer is valid due to the set_fs() */
+ res = vfs_write(file, (__force const char __user *)buf, count, pos);
+ set_fs(old_fs);
+
+ return res;
+}
+EXPORT_SYMBOL(kernel_write);
+
ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;
@@ -527,8 +552,6 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
return ret;
}
-EXPORT_SYMBOL(vfs_write);
-
static inline loff_t file_pos_read(struct file *file)
{
return file->f_pos;
@@ -959,9 +982,8 @@ ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
return ret;
}
-EXPORT_SYMBOL(vfs_readv);
-ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
+static ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
unsigned long vlen, loff_t *pos, rwf_t flags)
{
struct iovec iovstack[UIO_FASTIOV];
@@ -978,7 +1000,6 @@ ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
}
return ret;
}
-EXPORT_SYMBOL(vfs_writev);
static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec,
unsigned long vlen, rwf_t flags)
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index 873fc04e9403..11a48affa882 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -1776,7 +1776,7 @@ int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc)
struct reiserfs_transaction_handle th;
int jbegin_count = 1;
- if (inode->i_sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(inode->i_sb))
return -EROFS;
/*
* memory pressure can sometimes initiate write_inode calls with
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index 0c882a0e2a6e..f59c667df15b 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -1918,7 +1918,7 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
* we only want to flush out transactions if we were
* called with error == 0
*/
- if (!error && !(sb->s_flags & MS_RDONLY)) {
+ if (!error && !sb_rdonly(sb)) {
/* end the current trans */
BUG_ON(!th->t_trans_id);
do_journal_end(th, FLUSH_ALL);
diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c
index 4f3f928076f3..64f49cafbc5b 100644
--- a/fs/reiserfs/prints.c
+++ b/fs/reiserfs/prints.c
@@ -386,7 +386,7 @@ void __reiserfs_error(struct super_block *sb, const char *id,
printk(KERN_CRIT "REISERFS error (device %s): %s: %s\n",
sb->s_id, function, error_buf);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return;
reiserfs_info(sb, "Remounting filesystem read-only\n");
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index 306e4e9d172d..5464ec517702 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -121,7 +121,7 @@ void reiserfs_schedule_old_flush(struct super_block *s)
* Avoid scheduling flush when sb is being shut down. It can race
* with journal shutdown and free still queued delayed work.
*/
- if (s->s_flags & MS_RDONLY || !(s->s_flags & MS_ACTIVE))
+ if (sb_rdonly(s) || !(s->s_flags & MS_ACTIVE))
return;
spin_lock(&sbi->old_work_lock);
@@ -151,7 +151,7 @@ static int reiserfs_freeze(struct super_block *s)
reiserfs_cancel_old_flush(s);
reiserfs_write_lock(s);
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
int err = journal_begin(&th, s, 1);
if (err) {
reiserfs_block_writes(&th);
@@ -599,7 +599,7 @@ static void reiserfs_put_super(struct super_block *s)
* change file system state to current state if it was mounted
* with read-write permissions
*/
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
if (!journal_begin(&th, s, 10)) {
reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
1);
@@ -700,7 +700,7 @@ static void reiserfs_dirty_inode(struct inode *inode, int flags)
int err = 0;
- if (inode->i_sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(inode->i_sb)) {
reiserfs_warning(inode->i_sb, "clm-6006",
"writing inode %lu on readonly FS",
inode->i_ino);
@@ -1525,7 +1525,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
reiserfs_write_unlock(s);
reiserfs_xattr_init(s, *mount_flags);
/* remount read-only */
- if (s->s_flags & MS_RDONLY)
+ if (sb_rdonly(s))
/* it is read-only already */
goto out_ok_unlocked;
@@ -1551,7 +1551,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
journal_mark_dirty(&th, SB_BUFFER_WITH_SB(s));
} else {
/* remount read-write */
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
reiserfs_write_unlock(s);
reiserfs_xattr_init(s, *mount_flags);
goto out_ok_unlocked; /* We are read-write already */
@@ -1855,7 +1855,7 @@ static int what_hash(struct super_block *s)
* the super
*/
if (code != UNSET_HASH &&
- !(s->s_flags & MS_RDONLY) &&
+ !sb_rdonly(s) &&
code != sb_hash_function_code(SB_DISK_SUPER_BLOCK(s))) {
set_sb_hash_function_code(SB_DISK_SUPER_BLOCK(s), code);
}
@@ -2052,7 +2052,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
if (replay_only(s))
goto error_unlocked;
- if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) {
+ if (bdev_read_only(s->s_bdev) && !sb_rdonly(s)) {
SWARN(silent, s, "clm-7000",
"Detected readonly device, marking FS readonly");
s->s_flags |= MS_RDONLY;
@@ -2101,7 +2101,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
else
set_bit(REISERFS_3_6, &sbi->s_properties);
- if (!(s->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(s)) {
errval = journal_begin(&th, s, 1);
if (errval) {
diff --git a/fs/signalfd.c b/fs/signalfd.c
index 593b022ac11b..d2c434112f42 100644
--- a/fs/signalfd.c
+++ b/fs/signalfd.c
@@ -95,23 +95,23 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
*/
err |= __put_user(kinfo->si_signo, &uinfo->ssi_signo);
err |= __put_user(kinfo->si_errno, &uinfo->ssi_errno);
- err |= __put_user((short) kinfo->si_code, &uinfo->ssi_code);
- switch (kinfo->si_code & __SI_MASK) {
- case __SI_KILL:
+ err |= __put_user(kinfo->si_code, &uinfo->ssi_code);
+ switch (siginfo_layout(kinfo->si_signo, kinfo->si_code)) {
+ case SIL_KILL:
err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
break;
- case __SI_TIMER:
+ case SIL_TIMER:
err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid);
err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun);
err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
break;
- case __SI_POLL:
+ case SIL_POLL:
err |= __put_user(kinfo->si_band, &uinfo->ssi_band);
err |= __put_user(kinfo->si_fd, &uinfo->ssi_fd);
break;
- case __SI_FAULT:
+ case SIL_FAULT:
err |= __put_user((long) kinfo->si_addr, &uinfo->ssi_addr);
#ifdef __ARCH_SI_TRAPNO
err |= __put_user(kinfo->si_trapno, &uinfo->ssi_trapno);
@@ -128,20 +128,14 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
&uinfo->ssi_addr_lsb);
#endif
break;
- case __SI_CHLD:
+ case SIL_CHLD:
err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
err |= __put_user(kinfo->si_status, &uinfo->ssi_status);
err |= __put_user(kinfo->si_utime, &uinfo->ssi_utime);
err |= __put_user(kinfo->si_stime, &uinfo->ssi_stime);
break;
- case __SI_RT: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ: /* But this is */
- err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
- err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
- err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
- err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
- break;
+ case SIL_RT:
default:
/*
* This case catches also the signals queued by sigqueue().
diff --git a/fs/splice.c b/fs/splice.c
index ae41201d0325..f3084cce0ea6 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -364,22 +364,6 @@ static ssize_t kernel_readv(struct file *file, const struct kvec *vec,
return res;
}
-ssize_t kernel_write(struct file *file, const char *buf, size_t count,
- loff_t pos)
-{
- mm_segment_t old_fs;
- ssize_t res;
-
- old_fs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- res = vfs_write(file, (__force const char __user *)buf, count, &pos);
- set_fs(old_fs);
-
- return res;
-}
-EXPORT_SYMBOL(kernel_write);
-
static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
struct pipe_inode_info *pipe, size_t len,
unsigned int flags)
diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
index ffb093e72b6c..1adb3346b9d6 100644
--- a/fs/squashfs/Kconfig
+++ b/fs/squashfs/Kconfig
@@ -165,6 +165,20 @@ config SQUASHFS_XZ
If unsure, say N.
+config SQUASHFS_ZSTD
+ bool "Include support for ZSTD compressed file systems"
+ depends on SQUASHFS
+ select ZSTD_DECOMPRESS
+ help
+ Saying Y here includes support for reading Squashfs file systems
+ compressed with ZSTD compression. ZSTD gives better compression than
+ the default ZLIB compression, while using less CPU.
+
+ ZSTD is not the standard compression used in Squashfs and so most
+ file systems will be readable without selecting this option.
+
+ If unsure, say N.
+
config SQUASHFS_4K_DEVBLK_SIZE
bool "Use 4K device block size?"
depends on SQUASHFS
diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile
index 246a6f329d89..6655631c53ae 100644
--- a/fs/squashfs/Makefile
+++ b/fs/squashfs/Makefile
@@ -15,3 +15,4 @@ squashfs-$(CONFIG_SQUASHFS_LZ4) += lz4_wrapper.o
squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o
squashfs-$(CONFIG_SQUASHFS_XZ) += xz_wrapper.o
squashfs-$(CONFIG_SQUASHFS_ZLIB) += zlib_wrapper.o
+squashfs-$(CONFIG_SQUASHFS_ZSTD) += zstd_wrapper.o
diff --git a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c
index d2bc13636f79..836639810ea0 100644
--- a/fs/squashfs/decompressor.c
+++ b/fs/squashfs/decompressor.c
@@ -65,6 +65,12 @@ static const struct squashfs_decompressor squashfs_zlib_comp_ops = {
};
#endif
+#ifndef CONFIG_SQUASHFS_ZSTD
+static const struct squashfs_decompressor squashfs_zstd_comp_ops = {
+ NULL, NULL, NULL, NULL, ZSTD_COMPRESSION, "zstd", 0
+};
+#endif
+
static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
NULL, NULL, NULL, NULL, 0, "unknown", 0
};
@@ -75,6 +81,7 @@ static const struct squashfs_decompressor *decompressor[] = {
&squashfs_lzo_comp_ops,
&squashfs_xz_comp_ops,
&squashfs_lzma_unsupported_comp_ops,
+ &squashfs_zstd_comp_ops,
&squashfs_unknown_comp_ops
};
diff --git a/fs/squashfs/decompressor.h b/fs/squashfs/decompressor.h
index a25713c031a5..0f5a8e4e58da 100644
--- a/fs/squashfs/decompressor.h
+++ b/fs/squashfs/decompressor.h
@@ -58,4 +58,8 @@ extern const struct squashfs_decompressor squashfs_lzo_comp_ops;
extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
#endif
+#ifdef CONFIG_SQUASHFS_ZSTD
+extern const struct squashfs_decompressor squashfs_zstd_comp_ops;
+#endif
+
#endif
diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h
index 506f4ba5b983..24d12fd14177 100644
--- a/fs/squashfs/squashfs_fs.h
+++ b/fs/squashfs/squashfs_fs.h
@@ -241,6 +241,7 @@ struct meta_index {
#define LZO_COMPRESSION 3
#define XZ_COMPRESSION 4
#define LZ4_COMPRESSION 5
+#define ZSTD_COMPRESSION 6
struct squashfs_super_block {
__le32 s_magic;
diff --git a/fs/squashfs/zstd_wrapper.c b/fs/squashfs/zstd_wrapper.c
new file mode 100644
index 000000000000..eeaabf881159
--- /dev/null
+++ b/fs/squashfs/zstd_wrapper.c
@@ -0,0 +1,151 @@
+/*
+ * Squashfs - a compressed read only filesystem for Linux
+ *
+ * Copyright (c) 2016-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * zstd_wrapper.c
+ */
+
+#include <linux/mutex.h>
+#include <linux/buffer_head.h>
+#include <linux/slab.h>
+#include <linux/zstd.h>
+#include <linux/vmalloc.h>
+
+#include "squashfs_fs.h"
+#include "squashfs_fs_sb.h"
+#include "squashfs.h"
+#include "decompressor.h"
+#include "page_actor.h"
+
+struct workspace {
+ void *mem;
+ size_t mem_size;
+ size_t window_size;
+};
+
+static void *zstd_init(struct squashfs_sb_info *msblk, void *buff)
+{
+ struct workspace *wksp = kmalloc(sizeof(*wksp), GFP_KERNEL);
+
+ if (wksp == NULL)
+ goto failed;
+ wksp->window_size = max_t(size_t,
+ msblk->block_size, SQUASHFS_METADATA_SIZE);
+ wksp->mem_size = ZSTD_DStreamWorkspaceBound(wksp->window_size);
+ wksp->mem = vmalloc(wksp->mem_size);
+ if (wksp->mem == NULL)
+ goto failed;
+
+ return wksp;
+
+failed:
+ ERROR("Failed to allocate zstd workspace\n");
+ kfree(wksp);
+ return ERR_PTR(-ENOMEM);
+}
+
+
+static void zstd_free(void *strm)
+{
+ struct workspace *wksp = strm;
+
+ if (wksp)
+ vfree(wksp->mem);
+ kfree(wksp);
+}
+
+
+static int zstd_uncompress(struct squashfs_sb_info *msblk, void *strm,
+ struct buffer_head **bh, int b, int offset, int length,
+ struct squashfs_page_actor *output)
+{
+ struct workspace *wksp = strm;
+ ZSTD_DStream *stream;
+ size_t total_out = 0;
+ size_t zstd_err;
+ int k = 0;
+ ZSTD_inBuffer in_buf = { NULL, 0, 0 };
+ ZSTD_outBuffer out_buf = { NULL, 0, 0 };
+
+ stream = ZSTD_initDStream(wksp->window_size, wksp->mem, wksp->mem_size);
+
+ if (!stream) {
+ ERROR("Failed to initialize zstd decompressor\n");
+ goto out;
+ }
+
+ out_buf.size = PAGE_SIZE;
+ out_buf.dst = squashfs_first_page(output);
+
+ do {
+ if (in_buf.pos == in_buf.size && k < b) {
+ int avail = min(length, msblk->devblksize - offset);
+
+ length -= avail;
+ in_buf.src = bh[k]->b_data + offset;
+ in_buf.size = avail;
+ in_buf.pos = 0;
+ offset = 0;
+ }
+
+ if (out_buf.pos == out_buf.size) {
+ out_buf.dst = squashfs_next_page(output);
+ if (out_buf.dst == NULL) {
+ /* Shouldn't run out of pages
+ * before stream is done.
+ */
+ squashfs_finish_page(output);
+ goto out;
+ }
+ out_buf.pos = 0;
+ out_buf.size = PAGE_SIZE;
+ }
+
+ total_out -= out_buf.pos;
+ zstd_err = ZSTD_decompressStream(stream, &out_buf, &in_buf);
+ total_out += out_buf.pos; /* add the additional data produced */
+
+ if (in_buf.pos == in_buf.size && k < b)
+ put_bh(bh[k++]);
+ } while (zstd_err != 0 && !ZSTD_isError(zstd_err));
+
+ squashfs_finish_page(output);
+
+ if (ZSTD_isError(zstd_err)) {
+ ERROR("zstd decompression error: %d\n",
+ (int)ZSTD_getErrorCode(zstd_err));
+ goto out;
+ }
+
+ if (k < b)
+ goto out;
+
+ return (int)total_out;
+
+out:
+ for (; k < b; k++)
+ put_bh(bh[k]);
+
+ return -EIO;
+}
+
+const struct squashfs_decompressor squashfs_zstd_comp_ops = {
+ .init = zstd_init,
+ .free = zstd_free,
+ .decompress = zstd_uncompress,
+ .id = ZSTD_COMPRESSION,
+ .name = "zstd",
+ .supported = 1
+};
diff --git a/fs/super.c b/fs/super.c
index 221cfa1f4e92..166c4ee0d0ed 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -360,7 +360,7 @@ static int grab_super(struct super_block *s) __releases(sb_lock)
s->s_count++;
spin_unlock(&sb_lock);
down_write(&s->s_umount);
- if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) {
+ if ((s->s_flags & SB_BORN) && atomic_inc_not_zero(&s->s_active)) {
put_super(s);
return 1;
}
@@ -390,7 +390,7 @@ bool trylock_super(struct super_block *sb)
{
if (down_read_trylock(&sb->s_umount)) {
if (!hlist_unhashed(&sb->s_instances) &&
- sb->s_root && (sb->s_flags & MS_BORN))
+ sb->s_root && (sb->s_flags & SB_BORN))
return true;
up_read(&sb->s_umount);
}
@@ -419,7 +419,7 @@ void generic_shutdown_super(struct super_block *sb)
if (sb->s_root) {
shrink_dcache_for_umount(sb);
sync_filesystem(sb);
- sb->s_flags &= ~MS_ACTIVE;
+ sb->s_flags &= ~SB_ACTIVE;
fsnotify_unmount_inodes(sb);
cgroup_writeback_umount();
@@ -472,7 +472,7 @@ struct super_block *sget_userns(struct file_system_type *type,
struct super_block *old;
int err;
- if (!(flags & (MS_KERNMOUNT|MS_SUBMOUNT)) &&
+ if (!(flags & (SB_KERNMOUNT|SB_SUBMOUNT)) &&
!(type->fs_flags & FS_USERNS_MOUNT) &&
!capable(CAP_SYS_ADMIN))
return ERR_PTR(-EPERM);
@@ -502,7 +502,7 @@ retry:
}
if (!s) {
spin_unlock(&sb_lock);
- s = alloc_super(type, (flags & ~MS_SUBMOUNT), user_ns);
+ s = alloc_super(type, (flags & ~SB_SUBMOUNT), user_ns);
if (!s)
return ERR_PTR(-ENOMEM);
goto retry;
@@ -547,11 +547,11 @@ struct super_block *sget(struct file_system_type *type,
* mount through to here so always use &init_user_ns
* until that changes.
*/
- if (flags & MS_SUBMOUNT)
+ if (flags & SB_SUBMOUNT)
user_ns = &init_user_ns;
/* Ensure the requestor has permissions over the target filesystem */
- if (!(flags & (MS_KERNMOUNT|MS_SUBMOUNT)) && !ns_capable(user_ns, CAP_SYS_ADMIN))
+ if (!(flags & (SB_KERNMOUNT|SB_SUBMOUNT)) && !ns_capable(user_ns, CAP_SYS_ADMIN))
return ERR_PTR(-EPERM);
return sget_userns(type, test, set, flags, user_ns, data);
@@ -594,7 +594,7 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
- if (sb->s_root && (sb->s_flags & MS_BORN))
+ if (sb->s_root && (sb->s_flags & SB_BORN))
f(sb, arg);
up_read(&sb->s_umount);
@@ -628,7 +628,7 @@ void iterate_supers_type(struct file_system_type *type,
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
- if (sb->s_root && (sb->s_flags & MS_BORN))
+ if (sb->s_root && (sb->s_flags & SB_BORN))
f(sb, arg);
up_read(&sb->s_umount);
@@ -664,7 +664,7 @@ rescan:
else
down_write(&sb->s_umount);
/* still alive? */
- if (sb->s_root && (sb->s_flags & MS_BORN))
+ if (sb->s_root && (sb->s_flags & SB_BORN))
return sb;
if (!excl)
up_read(&sb->s_umount);
@@ -785,7 +785,7 @@ rescan:
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
/* still alive? */
- if (sb->s_root && (sb->s_flags & MS_BORN))
+ if (sb->s_root && (sb->s_flags & SB_BORN))
return sb;
up_read(&sb->s_umount);
/* nope, got unmounted */
@@ -801,13 +801,13 @@ rescan:
/**
* do_remount_sb - asks filesystem to change mount options.
* @sb: superblock in question
- * @flags: numeric part of options
+ * @sb_flags: revised superblock flags
* @data: the rest of options
* @force: whether or not to force the change
*
* Alters the mount options of a mounted file system.
*/
-int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
+int do_remount_sb(struct super_block *sb, int sb_flags, void *data, int force)
{
int retval;
int remount_ro;
@@ -816,11 +816,11 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
return -EBUSY;
#ifdef CONFIG_BLOCK
- if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
+ if (!(sb_flags & SB_RDONLY) && bdev_read_only(sb->s_bdev))
return -EACCES;
#endif
- remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
+ remount_ro = (sb_flags & SB_RDONLY) && !sb_rdonly(sb);
if (remount_ro) {
if (!hlist_empty(&sb->s_pins)) {
@@ -831,7 +831,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
return 0;
if (sb->s_writers.frozen != SB_UNFROZEN)
return -EBUSY;
- remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
+ remount_ro = (sb_flags & SB_RDONLY) && !sb_rdonly(sb);
}
}
shrink_dcache_sb(sb);
@@ -850,7 +850,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
}
if (sb->s_op->remount_fs) {
- retval = sb->s_op->remount_fs(sb, &flags, data);
+ retval = sb->s_op->remount_fs(sb, &sb_flags, data);
if (retval) {
if (!force)
goto cancel_readonly;
@@ -859,7 +859,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
sb->s_type->name, retval);
}
}
- sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
+ sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (sb_flags & MS_RMT_MASK);
/* Needs to be ordered wrt mnt_is_readonly() */
smp_wmb();
sb->s_readonly_remount = 0;
@@ -892,12 +892,12 @@ static void do_emergency_remount(struct work_struct *work)
sb->s_count++;
spin_unlock(&sb_lock);
down_write(&sb->s_umount);
- if (sb->s_root && sb->s_bdev && (sb->s_flags & MS_BORN) &&
- !(sb->s_flags & MS_RDONLY)) {
+ if (sb->s_root && sb->s_bdev && (sb->s_flags & SB_BORN) &&
+ !sb_rdonly(sb)) {
/*
* What lock protects sb->s_flags??
*/
- do_remount_sb(sb, MS_RDONLY, NULL, 1);
+ do_remount_sb(sb, SB_RDONLY, NULL, 1);
}
up_write(&sb->s_umount);
spin_lock(&sb_lock);
@@ -1023,7 +1023,7 @@ struct dentry *mount_ns(struct file_system_type *fs_type,
/* Don't allow mounting unless the caller has CAP_SYS_ADMIN
* over the namespace.
*/
- if (!(flags & MS_KERNMOUNT) && !ns_capable(user_ns, CAP_SYS_ADMIN))
+ if (!(flags & SB_KERNMOUNT) && !ns_capable(user_ns, CAP_SYS_ADMIN))
return ERR_PTR(-EPERM);
sb = sget_userns(fs_type, ns_test_super, ns_set_super, flags,
@@ -1033,13 +1033,13 @@ struct dentry *mount_ns(struct file_system_type *fs_type,
if (!sb->s_root) {
int err;
- err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
+ err = fill_super(sb, data, flags & SB_SILENT ? 1 : 0);
if (err) {
deactivate_locked_super(sb);
return ERR_PTR(err);
}
- sb->s_flags |= MS_ACTIVE;
+ sb->s_flags |= SB_ACTIVE;
}
return dget(sb->s_root);
@@ -1071,7 +1071,7 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
fmode_t mode = FMODE_READ | FMODE_EXCL;
int error = 0;
- if (!(flags & MS_RDONLY))
+ if (!(flags & SB_RDONLY))
mode |= FMODE_WRITE;
bdev = blkdev_get_by_path(dev_name, mode, fs_type);
@@ -1089,14 +1089,14 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
error = -EBUSY;
goto error_bdev;
}
- s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC,
+ s = sget(fs_type, test_bdev_super, set_bdev_super, flags | SB_NOSEC,
bdev);
mutex_unlock(&bdev->bd_fsfreeze_mutex);
if (IS_ERR(s))
goto error_s;
if (s->s_root) {
- if ((flags ^ s->s_flags) & MS_RDONLY) {
+ if ((flags ^ s->s_flags) & SB_RDONLY) {
deactivate_locked_super(s);
error = -EBUSY;
goto error_bdev;
@@ -1116,13 +1116,13 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
s->s_mode = mode;
snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
sb_set_blocksize(s, block_size(bdev));
- error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
+ error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
if (error) {
deactivate_locked_super(s);
goto error;
}
- s->s_flags |= MS_ACTIVE;
+ s->s_flags |= SB_ACTIVE;
bdev->bd_super = s;
}
@@ -1162,12 +1162,12 @@ struct dentry *mount_nodev(struct file_system_type *fs_type,
if (IS_ERR(s))
return ERR_CAST(s);
- error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
+ error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
if (error) {
deactivate_locked_super(s);
return ERR_PTR(error);
}
- s->s_flags |= MS_ACTIVE;
+ s->s_flags |= SB_ACTIVE;
return dget(s->s_root);
}
EXPORT_SYMBOL(mount_nodev);
@@ -1188,12 +1188,12 @@ struct dentry *mount_single(struct file_system_type *fs_type,
if (IS_ERR(s))
return ERR_CAST(s);
if (!s->s_root) {
- error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
+ error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
if (error) {
deactivate_locked_super(s);
return ERR_PTR(error);
}
- s->s_flags |= MS_ACTIVE;
+ s->s_flags |= SB_ACTIVE;
} else {
do_remount_sb(s, flags, data, 0);
}
@@ -1227,7 +1227,7 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
sb = root->d_sb;
BUG_ON(!sb);
WARN_ON(!sb->s_bdi);
- sb->s_flags |= MS_BORN;
+ sb->s_flags |= SB_BORN;
error = security_sb_kern_mount(sb, flags, secdata);
if (error)
@@ -1434,12 +1434,12 @@ int freeze_super(struct super_block *sb)
return -EBUSY;
}
- if (!(sb->s_flags & MS_BORN)) {
+ if (!(sb->s_flags & SB_BORN)) {
up_write(&sb->s_umount);
return 0; /* sic - it's "nothing to do" */
}
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
/* Nothing to do really... */
sb->s_writers.frozen = SB_FREEZE_COMPLETE;
up_write(&sb->s_umount);
@@ -1502,7 +1502,7 @@ int thaw_super(struct super_block *sb)
return -EINVAL;
}
- if (sb->s_flags & MS_RDONLY) {
+ if (sb_rdonly(sb)) {
sb->s_writers.frozen = SB_UNFROZEN;
goto out;
}
diff --git a/fs/sync.c b/fs/sync.c
index 2e3fd7d94d2d..a576aa2e6b09 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -57,7 +57,7 @@ int sync_filesystem(struct super_block *sb)
/*
* No point in syncing out anything if the filesystem is read-only.
*/
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return 0;
ret = __sync_filesystem(sb, 0);
@@ -69,13 +69,13 @@ EXPORT_SYMBOL(sync_filesystem);
static void sync_inodes_one_sb(struct super_block *sb, void *arg)
{
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
sync_inodes_sb(sb);
}
static void sync_fs_one_sb(struct super_block *sb, void *arg)
{
- if (!(sb->s_flags & MS_RDONLY) && sb->s_op->sync_fs)
+ if (!sb_rdonly(sb) && sb->s_op->sync_fs)
sb->s_op->sync_fs(sb, *(int *)arg);
}
diff --git a/fs/sysv/balloc.c b/fs/sysv/balloc.c
index 921c053fc052..862c1f74a583 100644
--- a/fs/sysv/balloc.c
+++ b/fs/sysv/balloc.c
@@ -231,7 +231,7 @@ trust_sb:
Ecount:
printk("sysv_count_free_blocks: free block count was %d, "
"correcting to %d\n", sb_count, count);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
*sbi->s_free_blocks = cpu_to_fs32(sbi, count);
dirty_sb(sb);
}
diff --git a/fs/sysv/ialloc.c b/fs/sysv/ialloc.c
index 53f1b78996dd..eb963fbb7903 100644
--- a/fs/sysv/ialloc.c
+++ b/fs/sysv/ialloc.c
@@ -220,7 +220,7 @@ Einval:
printk("sysv_count_free_inodes: "
"free inode count was %d, correcting to %d\n",
sb_count, count);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
*sbi->s_sb_total_free_inodes = cpu_to_fs16(SYSV_SB(sb), count);
dirty_sb(sb);
}
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c
index 858fb72f9e0f..1c8bf9453a71 100644
--- a/fs/sysv/inode.c
+++ b/fs/sysv/inode.c
@@ -70,7 +70,7 @@ static void sysv_put_super(struct super_block *sb)
{
struct sysv_sb_info *sbi = SYSV_SB(sb);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
/* XXX ext2 also updates the state here */
mark_buffer_dirty(sbi->s_bh1);
if (sbi->s_bh1 != sbi->s_bh2)
diff --git a/fs/sysv/super.c b/fs/sysv/super.c
index eda10959714f..0d56e486b392 100644
--- a/fs/sysv/super.c
+++ b/fs/sysv/super.c
@@ -216,7 +216,7 @@ static int detect_sysv(struct sysv_sb_info *sbi, struct buffer_head *bh)
if (fs16_to_cpu(sbi, sbd->s_nfree) == 0xffff) {
sbi->s_type = FSTYPE_AFS;
sbi->s_forced_ro = 1;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
printk("SysV FS: SCO EAFS on %s detected, "
"forcing read-only mode.\n",
sb->s_id);
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index bffadbb67e47..5496b17b959c 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -1159,7 +1159,7 @@ static int mount_ubifs(struct ubifs_info *c)
long long x, y;
size_t sz;
- c->ro_mount = !!(c->vfs_sb->s_flags & MS_RDONLY);
+ c->ro_mount = !!sb_rdonly(c->vfs_sb);
/* Suppress error messages while probing if MS_SILENT is set */
c->probing = !!(c->vfs_sb->s_flags & MS_SILENT);
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 93c59630512b..99cb81d0077f 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -673,7 +673,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
sbi->s_dmode = uopt.dmode;
write_unlock(&sbi->s_cred_lock);
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ if ((bool)(*flags & MS_RDONLY) == sb_rdonly(sb))
goto out_unlock;
if (*flags & MS_RDONLY)
@@ -1017,7 +1017,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition,
fe = udf_iget_special(sb, &addr);
if (IS_ERR(fe)) {
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n");
else {
udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n");
@@ -1341,7 +1341,7 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block)
* writing to it (we overwrite blocks instead of relocating
* them).
*/
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
ret = -EACCES;
goto out_bh;
}
@@ -2205,7 +2205,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
ret = -EINVAL;
goto error_out;
} else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION &&
- !(sb->s_flags & MS_RDONLY)) {
+ !sb_rdonly(sb)) {
ret = -EACCES;
goto error_out;
}
@@ -2226,7 +2226,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
if (sbi->s_partmaps[sbi->s_partition].s_partition_flags &
UDF_PART_FLAG_READ_ONLY &&
- !(sb->s_flags & MS_RDONLY)) {
+ !sb_rdonly(sb)) {
ret = -EACCES;
goto error_out;
}
@@ -2245,7 +2245,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
le16_to_cpu(ts.year), ts.month, ts.day,
ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
}
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
udf_open_lvid(sb);
lvid_open = true;
}
@@ -2332,7 +2332,7 @@ static void udf_put_super(struct super_block *sb)
if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
unload_nls(sbi->s_nls_map);
#endif
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
udf_close_lvid(sb);
brelse(sbi->s_lvid_bh);
udf_sb_free_partitions(sb);
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
index 0a4f58a5073c..6440003f8ddc 100644
--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -278,7 +278,7 @@ void ufs_error (struct super_block * sb, const char * function,
uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(uspi);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
usb1->fs_clean = UFS_FSBAD;
ubh_mark_buffer_dirty(USPI_UBH(uspi));
ufs_mark_sb_dirty(sb);
@@ -312,7 +312,7 @@ void ufs_panic (struct super_block * sb, const char * function,
uspi = UFS_SB(sb)->s_uspi;
usb1 = ubh_get_usb_first(uspi);
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
usb1->fs_clean = UFS_FSBAD;
ubh_mark_buffer_dirty(USPI_UBH(uspi));
ufs_mark_sb_dirty(sb);
@@ -742,7 +742,7 @@ static void ufs_put_super(struct super_block *sb)
UFSD("ENTER\n");
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
ufs_put_super_internal(sb);
cancel_delayed_work_sync(&sbi->sync_work);
@@ -793,7 +793,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
UFSD("ENTER\n");
#ifndef CONFIG_UFS_FS_WRITE
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
pr_err("ufs was compiled with read-only support, can't be mounted as read-write\n");
return -EROFS;
}
@@ -805,7 +805,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_fs_info = sbi;
sbi->sb = sb;
- UFSD("flag %u\n", (int)(sb->s_flags & MS_RDONLY));
+ UFSD("flag %u\n", (int)(sb_rdonly(sb)));
mutex_init(&sbi->s_lock);
spin_lock_init(&sbi->work_lock);
@@ -902,7 +902,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_sbsize = super_block_size = 2048;
uspi->s_sbbase = 0;
flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!silent)
pr_info("ufstype=old is supported read-only\n");
sb->s_flags |= MS_RDONLY;
@@ -918,7 +918,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_sbbase = 0;
uspi->s_dirblksize = 1024;
flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!silent)
pr_info("ufstype=nextstep is supported read-only\n");
sb->s_flags |= MS_RDONLY;
@@ -934,7 +934,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_sbbase = 0;
uspi->s_dirblksize = 1024;
flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!silent)
pr_info("ufstype=nextstep-cd is supported read-only\n");
sb->s_flags |= MS_RDONLY;
@@ -950,7 +950,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_sbbase = 0;
uspi->s_dirblksize = 1024;
flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!silent)
pr_info("ufstype=openstep is supported read-only\n");
sb->s_flags |= MS_RDONLY;
@@ -965,7 +965,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_sbsize = super_block_size = 2048;
uspi->s_sbbase = 0;
flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
- if (!(sb->s_flags & MS_RDONLY)) {
+ if (!sb_rdonly(sb)) {
if (!silent)
pr_info("ufstype=hp is supported read-only\n");
sb->s_flags |= MS_RDONLY;
@@ -1273,7 +1273,7 @@ magic_found:
/*
* Read cylinder group structures
*/
- if (!(sb->s_flags & MS_RDONLY))
+ if (!sb_rdonly(sb))
if (!ufs_read_cylinder_structures(sb))
goto failed;
@@ -1328,7 +1328,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
return -EINVAL;
}
- if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
+ if ((bool)(*mount_flags & MS_RDONLY) == sb_rdonly(sb)) {
UFS_SB(sb)->s_mount_opt = new_mount_opt;
mutex_unlock(&UFS_SB(sb)->s_lock);
return 0;
diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c
index ef4b48d1ea42..1c713fd5b3e6 100644
--- a/fs/userfaultfd.c
+++ b/fs/userfaultfd.c
@@ -588,6 +588,12 @@ static void userfaultfd_event_wait_completion(struct userfaultfd_ctx *ctx,
break;
if (ACCESS_ONCE(ctx->released) ||
fatal_signal_pending(current)) {
+ /*
+ * &ewq->wq may be queued in fork_event, but
+ * __remove_wait_queue ignores the head
+ * parameter. It would be a problem if it
+ * didn't.
+ */
__remove_wait_queue(&ctx->event_wqh, &ewq->wq);
if (ewq->msg.event == UFFD_EVENT_FORK) {
struct userfaultfd_ctx *new;
@@ -1061,6 +1067,12 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait,
(unsigned long)
uwq->msg.arg.reserved.reserved1;
list_move(&uwq->wq.entry, &fork_event);
+ /*
+ * fork_nctx can be freed as soon as
+ * we drop the lock, unless we take a
+ * reference on it.
+ */
+ userfaultfd_ctx_get(fork_nctx);
spin_unlock(&ctx->event_wqh.lock);
ret = 0;
break;
@@ -1091,19 +1103,53 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait,
if (!ret && msg->event == UFFD_EVENT_FORK) {
ret = resolve_userfault_fork(ctx, fork_nctx, msg);
+ spin_lock(&ctx->event_wqh.lock);
+ if (!list_empty(&fork_event)) {
+ /*
+ * The fork thread didn't abort, so we can
+ * drop the temporary refcount.
+ */
+ userfaultfd_ctx_put(fork_nctx);
+
+ uwq = list_first_entry(&fork_event,
+ typeof(*uwq),
+ wq.entry);
+ /*
+ * If fork_event list wasn't empty and in turn
+ * the event wasn't already released by fork
+ * (the event is allocated on fork kernel
+ * stack), put the event back to its place in
+ * the event_wq. fork_event head will be freed
+ * as soon as we return so the event cannot
+ * stay queued there no matter the current
+ * "ret" value.
+ */
+ list_del(&uwq->wq.entry);
+ __add_wait_queue(&ctx->event_wqh, &uwq->wq);
- if (!ret) {
- spin_lock(&ctx->event_wqh.lock);
- if (!list_empty(&fork_event)) {
- uwq = list_first_entry(&fork_event,
- typeof(*uwq),
- wq.entry);
- list_del(&uwq->wq.entry);
- __add_wait_queue(&ctx->event_wqh, &uwq->wq);
+ /*
+ * Leave the event in the waitqueue and report
+ * error to userland if we failed to resolve
+ * the userfault fork.
+ */
+ if (likely(!ret))
userfaultfd_event_complete(ctx, uwq);
- }
- spin_unlock(&ctx->event_wqh.lock);
+ } else {
+ /*
+ * Here the fork thread aborted and the
+ * refcount from the fork thread on fork_nctx
+ * has already been released. We still hold
+ * the reference we took before releasing the
+ * lock above. If resolve_userfault_fork
+ * failed we've to drop it because the
+ * fork_nctx has to be freed in such case. If
+ * it succeeded we'll hold it because the new
+ * uffd references it.
+ */
+ if (ret)
+ userfaultfd_ctx_put(fork_nctx);
}
+ spin_unlock(&ctx->event_wqh.lock);
}
return ret;
diff --git a/fs/utimes.c b/fs/utimes.c
index 6571d8c848a0..51edb9f9507c 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -22,7 +22,7 @@
*/
SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
{
- struct timespec tv[2];
+ struct timespec64 tv[2];
if (times) {
if (get_user(tv[0].tv_sec, &times->actime) ||
@@ -44,7 +44,7 @@ static bool nsec_valid(long nsec)
return nsec >= 0 && nsec <= 999999999;
}
-static int utimes_common(const struct path *path, struct timespec *times)
+static int utimes_common(const struct path *path, struct timespec64 *times)
{
int error;
struct iattr newattrs;
@@ -115,7 +115,7 @@ out:
* must be owner or have write permission.
* Else, update from *times, must be owner or super user.
*/
-long do_utimes(int dfd, const char __user *filename, struct timespec *times,
+long do_utimes(int dfd, const char __user *filename, struct timespec64 *times,
int flags)
{
int error = -EINVAL;
@@ -167,10 +167,11 @@ out:
SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
struct timespec __user *, utimes, int, flags)
{
- struct timespec tstimes[2];
+ struct timespec64 tstimes[2];
if (utimes) {
- if (copy_from_user(&tstimes, utimes, sizeof(tstimes)))
+ if ((get_timespec64(&tstimes[0], &utimes[0]) ||
+ get_timespec64(&tstimes[1], &utimes[1])))
return -EFAULT;
/* Nothing to do, we must not even check the path. */
@@ -186,7 +187,7 @@ SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
struct timeval __user *, utimes)
{
struct timeval times[2];
- struct timespec tstimes[2];
+ struct timespec64 tstimes[2];
if (utimes) {
if (copy_from_user(&times, utimes, sizeof(times)))
@@ -224,7 +225,7 @@ SYSCALL_DEFINE2(utimes, char __user *, filename,
COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
struct compat_utimbuf __user *, t)
{
- struct timespec tv[2];
+ struct timespec64 tv[2];
if (t) {
if (get_user(tv[0].tv_sec, &t->actime) ||
@@ -238,11 +239,11 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct compat_timespec __user *, t, int, flags)
{
- struct timespec tv[2];
+ struct timespec64 tv[2];
if (t) {
- if (compat_get_timespec(&tv[0], &t[0]) ||
- compat_get_timespec(&tv[1], &t[1]))
+ if (compat_get_timespec64(&tv[0], &t[0]) ||
+ compat_get_timespec64(&tv[1], &t[1]))
return -EFAULT;
if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT)
@@ -253,7 +254,7 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, const char __user *, filename, struct compat_timeval __user *, t)
{
- struct timespec tv[2];
+ struct timespec64 tv[2];
if (t) {
if (get_user(tv[0].tv_sec, &t[0].tv_sec) ||
diff --git a/fs/xattr.c b/fs/xattr.c
index 464c94bf65f9..61cd28ba25f3 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -23,6 +23,7 @@
#include <linux/posix_acl_xattr.h>
#include <linux/uaccess.h>
+#include "internal.h"
static const char *
strcmp_prefix(const char *a, const char *a_prefix)
@@ -249,7 +250,7 @@ xattr_getsecurity(struct inode *inode, const char *name, void *value,
}
memcpy(value, buffer, len);
out:
- security_release_secctx(buffer, len);
+ kfree(buffer);
out_noalloc:
return len;
}
@@ -441,6 +442,12 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value,
if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) ||
(strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0))
posix_acl_fix_xattr_from_user(kvalue, size);
+ else if (strcmp(kname, XATTR_NAME_CAPS) == 0) {
+ error = cap_convert_nscap(d, &kvalue, size);
+ if (error < 0)
+ goto out;
+ size = error;
+ }
}
error = vfs_setxattr(d, kname, kvalue, size, flags);
@@ -496,10 +503,10 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
if (!f.file)
return error;
audit_file(f.file);
- error = mnt_want_write_file(f.file);
+ error = mnt_want_write_file_path(f.file);
if (!error) {
error = setxattr(f.file->f_path.dentry, name, value, size, flags);
- mnt_drop_write_file(f.file);
+ mnt_drop_write_file_path(f.file);
}
fdput(f);
return error;
@@ -728,10 +735,10 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
if (!f.file)
return error;
audit_file(f.file);
- error = mnt_want_write_file(f.file);
+ error = mnt_want_write_file_path(f.file);
if (!error) {
error = removexattr(f.file->f_path.dentry, name);
- mnt_drop_write_file(f.file);
+ mnt_drop_write_file_path(f.file);
}
fdput(f);
return error;
diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
index b008ff3250eb..df3e600835e8 100644
--- a/fs/xfs/libxfs/xfs_ag_resv.c
+++ b/fs/xfs/libxfs/xfs_ag_resv.c
@@ -156,7 +156,8 @@ __xfs_ag_resv_free(
trace_xfs_ag_resv_free(pag, type, 0);
resv = xfs_perag_resv(pag, type);
- pag->pag_mount->m_ag_max_usable += resv->ar_asked;
+ if (pag->pag_agno == 0)
+ pag->pag_mount->m_ag_max_usable += resv->ar_asked;
/*
* AGFL blocks are always considered "free", so whatever
* was reserved at mount time must be given back at umount.
@@ -216,7 +217,14 @@ __xfs_ag_resv_init(
return error;
}
- mp->m_ag_max_usable -= ask;
+ /*
+ * Reduce the maximum per-AG allocation length by however much we're
+ * trying to reserve for an AG. Since this is a filesystem-wide
+ * counter, we only make the adjustment for AG 0. This assumes that
+ * there aren't any AGs hungrier for per-AG reservation than AG 0.
+ */
+ if (pag->pag_agno == 0)
+ mp->m_ag_max_usable -= ask;
resv = xfs_perag_resv(pag, type);
resv->ar_asked = ask;
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index 459f4b4f08fe..044a363119be 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -49,7 +49,6 @@
#include "xfs_rmap.h"
#include "xfs_ag_resv.h"
#include "xfs_refcount.h"
-#include "xfs_rmap_btree.h"
#include "xfs_icache.h"
@@ -192,12 +191,8 @@ xfs_bmap_worst_indlen(
int maxrecs; /* maximum record count at this level */
xfs_mount_t *mp; /* mount structure */
xfs_filblks_t rval; /* return value */
- xfs_filblks_t orig_len;
mp = ip->i_mount;
-
- /* Calculate the worst-case size of the bmbt. */
- orig_len = len;
maxrecs = mp->m_bmap_dmxr[0];
for (level = 0, rval = 0;
level < XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK);
@@ -205,20 +200,12 @@ xfs_bmap_worst_indlen(
len += maxrecs - 1;
do_div(len, maxrecs);
rval += len;
- if (len == 1) {
- rval += XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) -
+ if (len == 1)
+ return rval + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) -
level - 1;
- break;
- }
if (level == 0)
maxrecs = mp->m_bmap_dmxr[1];
}
-
- /* Calculate the worst-case size of the rmapbt. */
- if (xfs_sb_version_hasrmapbt(&mp->m_sb))
- rval += 1 + xfs_rmapbt_calc_size(mp, orig_len) +
- mp->m_rmap_maxlevels;
-
return rval;
}
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index fffae1390d7f..f18e5932aec4 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -80,6 +80,19 @@ xfs_find_bdev_for_inode(
return mp->m_ddev_targp->bt_bdev;
}
+struct dax_device *
+xfs_find_daxdev_for_inode(
+ struct inode *inode)
+{
+ struct xfs_inode *ip = XFS_I(inode);
+ struct xfs_mount *mp = ip->i_mount;
+
+ if (XFS_IS_REALTIME_INODE(ip))
+ return mp->m_rtdev_targp->bt_daxdev;
+ else
+ return mp->m_ddev_targp->bt_daxdev;
+}
+
/*
* We're now finished for good with this page. Update the page state via the
* associated buffer_heads, paying attention to the start and end offsets that
@@ -330,7 +343,8 @@ xfs_end_io(
error = xfs_reflink_end_cow(ip, offset, size);
break;
case XFS_IO_UNWRITTEN:
- error = xfs_iomap_write_unwritten(ip, offset, size);
+ /* writeback should never update isize */
+ error = xfs_iomap_write_unwritten(ip, offset, size, false);
break;
default:
ASSERT(!xfs_ioend_is_append(ioend) || ioend->io_append_trans);
diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h
index cc174ec6c2fd..88c85ea63da0 100644
--- a/fs/xfs/xfs_aops.h
+++ b/fs/xfs/xfs_aops.h
@@ -59,5 +59,6 @@ int xfs_setfilesize(struct xfs_inode *ip, xfs_off_t offset, size_t size);
extern void xfs_count_page_state(struct page *, int *, int *);
extern struct block_device *xfs_find_bdev_for_inode(struct inode *);
+extern struct dax_device *xfs_find_daxdev_for_inode(struct inode *);
#endif /* __XFS_AOPS_H__ */
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index cd9a5400ba4f..bc6c6e10a969 100644
--- a/fs/xfs/xfs_bmap_util.c
+++ b/fs/xfs/xfs_bmap_util.c
@@ -1459,7 +1459,19 @@ xfs_shift_file_space(
return error;
/*
- * The extent shiting code works on extent granularity. So, if
+ * Clean out anything hanging around in the cow fork now that
+ * we've flushed all the dirty data out to disk to avoid having
+ * CoW extents at the wrong offsets.
+ */
+ if (xfs_is_reflink_inode(ip)) {
+ error = xfs_reflink_cancel_cow_range(ip, offset, NULLFILEOFF,
+ true);
+ if (error)
+ return error;
+ }
+
+ /*
+ * The extent shifting code works on extent granularity. So, if
* stop_fsb is not the starting block of extent, we need to split
* the extent at stop_fsb.
*/
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index b1c9711e79a4..2f97c12ca75e 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1258,8 +1258,6 @@ xfs_buf_ioapply_map(
int size;
int offset;
- total_nr_pages = bp->b_page_count;
-
/* skip the pages in the buffer before the start offset */
page_index = 0;
offset = *buf_offset;
@@ -1802,7 +1800,8 @@ xfs_setsize_buftarg_early(
xfs_buftarg_t *
xfs_alloc_buftarg(
struct xfs_mount *mp,
- struct block_device *bdev)
+ struct block_device *bdev,
+ struct dax_device *dax_dev)
{
xfs_buftarg_t *btp;
@@ -1811,6 +1810,7 @@ xfs_alloc_buftarg(
btp->bt_mount = mp;
btp->bt_dev = bdev->bd_dev;
btp->bt_bdev = bdev;
+ btp->bt_daxdev = dax_dev;
if (xfs_setsize_buftarg_early(btp, bdev))
goto error;
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
index 20721261dae5..bf71507ddb16 100644
--- a/fs/xfs/xfs_buf.h
+++ b/fs/xfs/xfs_buf.h
@@ -108,6 +108,7 @@ typedef unsigned int xfs_buf_flags_t;
typedef struct xfs_buftarg {
dev_t bt_dev;
struct block_device *bt_bdev;
+ struct dax_device *bt_daxdev;
struct xfs_mount *bt_mount;
unsigned int bt_meta_sectorsize;
size_t bt_meta_sectormask;
@@ -385,7 +386,7 @@ xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset)
* Handling of buftargs.
*/
extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *,
- struct block_device *);
+ struct block_device *, struct dax_device *);
extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *);
extern void xfs_wait_buftarg(xfs_buftarg_t *);
extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int);
diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c
index bd786a9ac2c3..eaf86f55b7f2 100644
--- a/fs/xfs/xfs_error.c
+++ b/fs/xfs/xfs_error.c
@@ -347,7 +347,7 @@ xfs_verifier_error(
{
struct xfs_mount *mp = bp->b_target->bt_mount;
- xfs_alert(mp, "Metadata %s detected at %pF, %s block 0x%llx",
+ xfs_alert(mp, "Metadata %s detected at %pS, %s block 0x%llx",
bp->b_error == -EFSBADCRC ? "CRC error" : "corruption",
__return_address, bp->b_ops->name, bp->b_bn);
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index ec3e44fcf771..309e26c9dddb 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -58,7 +58,7 @@ xfs_zero_range(
xfs_off_t count,
bool *did_zero)
{
- return iomap_zero_range(VFS_I(ip), pos, count, NULL, &xfs_iomap_ops);
+ return iomap_zero_range(VFS_I(ip), pos, count, did_zero, &xfs_iomap_ops);
}
int
@@ -259,7 +259,11 @@ xfs_file_buffered_aio_read(
trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos);
- xfs_ilock(ip, XFS_IOLOCK_SHARED);
+ if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) {
+ if (iocb->ki_flags & IOCB_NOWAIT)
+ return -EAGAIN;
+ xfs_ilock(ip, XFS_IOLOCK_SHARED);
+ }
ret = generic_file_read_iter(iocb, to);
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
@@ -373,8 +377,6 @@ restart:
*/
spin_lock(&ip->i_flags_lock);
if (iocb->ki_pos > i_size_read(inode)) {
- bool zero = false;
-
spin_unlock(&ip->i_flags_lock);
if (!drained_dio) {
if (*iolock == XFS_IOLOCK_SHARED) {
@@ -395,7 +397,7 @@ restart:
drained_dio = true;
goto restart;
}
- error = xfs_zero_eof(ip, iocb->ki_pos, i_size_read(inode), &zero);
+ error = xfs_zero_eof(ip, iocb->ki_pos, i_size_read(inode), NULL);
if (error)
return error;
} else
@@ -432,7 +434,6 @@ xfs_dio_write_end_io(
struct inode *inode = file_inode(iocb->ki_filp);
struct xfs_inode *ip = XFS_I(inode);
loff_t offset = iocb->ki_pos;
- bool update_size = false;
int error = 0;
trace_xfs_end_io_direct_write(ip, offset, size);
@@ -443,6 +444,21 @@ xfs_dio_write_end_io(
if (size <= 0)
return size;
+ if (flags & IOMAP_DIO_COW) {
+ error = xfs_reflink_end_cow(ip, offset, size);
+ if (error)
+ return error;
+ }
+
+ /*
+ * Unwritten conversion updates the in-core isize after extent
+ * conversion but before updating the on-disk size. Updating isize any
+ * earlier allows a racing dio read to find unwritten extents before
+ * they are converted.
+ */
+ if (flags & IOMAP_DIO_UNWRITTEN)
+ return xfs_iomap_write_unwritten(ip, offset, size, true);
+
/*
* We need to update the in-core inode size here so that we don't end up
* with the on-disk inode size being outside the in-core inode size. We
@@ -457,20 +473,11 @@ xfs_dio_write_end_io(
spin_lock(&ip->i_flags_lock);
if (offset + size > i_size_read(inode)) {
i_size_write(inode, offset + size);
- update_size = true;
- }
- spin_unlock(&ip->i_flags_lock);
-
- if (flags & IOMAP_DIO_COW) {
- error = xfs_reflink_end_cow(ip, offset, size);
- if (error)
- return error;
- }
-
- if (flags & IOMAP_DIO_UNWRITTEN)
- error = xfs_iomap_write_unwritten(ip, offset, size);
- else if (update_size)
+ spin_unlock(&ip->i_flags_lock);
error = xfs_setfilesize(ip, offset, size);
+ } else {
+ spin_unlock(&ip->i_flags_lock);
+ }
return error;
}
@@ -636,6 +643,9 @@ xfs_file_buffered_aio_write(
int enospc = 0;
int iolock;
+ if (iocb->ki_flags & IOCB_NOWAIT)
+ return -EOPNOTSUPP;
+
write_retry:
iolock = XFS_IOLOCK_EXCL;
xfs_ilock(ip, iolock);
@@ -912,7 +922,7 @@ xfs_file_open(
return -EFBIG;
if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
return -EIO;
- file->f_mode |= FMODE_AIO_NOWAIT;
+ file->f_mode |= FMODE_NOWAIT;
return 0;
}
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 5599dda4727a..4ec5b7f45401 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1624,10 +1624,12 @@ xfs_itruncate_extents(
goto out;
/*
- * Clear the reflink flag if we truncated everything.
+ * Clear the reflink flag if there are no data fork blocks and
+ * there are no extents staged in the cow fork.
*/
- if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip)) {
- ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
+ if (xfs_is_reflink_inode(ip) && ip->i_cnextents == 0) {
+ if (ip->i_d.di_nblocks == 0)
+ ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
xfs_inode_clear_cowblocks_tag(ip);
}
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
index 6d0f74ec31e8..a705f34b58fa 100644
--- a/fs/xfs/xfs_inode_item.c
+++ b/fs/xfs/xfs_inode_item.c
@@ -745,7 +745,7 @@ xfs_iflush_done(
*/
iip = INODE_ITEM(blip);
if ((iip->ili_logged && blip->li_lsn == iip->ili_flush_lsn) ||
- lip->li_flags & XFS_LI_FAILED)
+ (blip->li_flags & XFS_LI_FAILED))
need_ail++;
blip = next;
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 5049e8ab6e30..aa75389be8cf 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1088,6 +1088,7 @@ xfs_ioctl_setattr_dax_invalidate(
int *join_flags)
{
struct inode *inode = VFS_I(ip);
+ struct super_block *sb = inode->i_sb;
int error;
*join_flags = 0;
@@ -1100,7 +1101,7 @@ xfs_ioctl_setattr_dax_invalidate(
if (fa->fsx_xflags & FS_XFLAG_DAX) {
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
return -EINVAL;
- if (ip->i_mount->m_sb.sb_blocksize != PAGE_SIZE)
+ if (bdev_dax_supported(sb, sb->s_blocksize) < 0)
return -EINVAL;
}
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 79cb5b3d140c..f179bdf1644d 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -69,6 +69,7 @@ xfs_bmbt_to_iomap(
iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff);
iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount);
iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip));
+ iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip));
}
xfs_extlen_t
@@ -828,7 +829,8 @@ int
xfs_iomap_write_unwritten(
xfs_inode_t *ip,
xfs_off_t offset,
- xfs_off_t count)
+ xfs_off_t count,
+ bool update_isize)
{
xfs_mount_t *mp = ip->i_mount;
xfs_fileoff_t offset_fsb;
@@ -839,6 +841,7 @@ xfs_iomap_write_unwritten(
xfs_trans_t *tp;
xfs_bmbt_irec_t imap;
struct xfs_defer_ops dfops;
+ struct inode *inode = VFS_I(ip);
xfs_fsize_t i_size;
uint resblks;
int error;
@@ -898,7 +901,8 @@ xfs_iomap_write_unwritten(
i_size = XFS_FSB_TO_B(mp, offset_fsb + count_fsb);
if (i_size > offset + count)
i_size = offset + count;
-
+ if (update_isize && i_size > i_size_read(inode))
+ i_size_write(inode, i_size);
i_size = xfs_new_eof(ip, i_size);
if (i_size) {
ip->i_d.di_size = i_size;
@@ -975,7 +979,6 @@ xfs_file_iomap_begin(
int nimaps = 1, error = 0;
bool shared = false, trimmed = false;
unsigned lockmode;
- struct block_device *bdev;
if (XFS_FORCED_SHUTDOWN(mp))
return -EIO;
@@ -1085,13 +1088,6 @@ xfs_file_iomap_begin(
xfs_bmbt_to_iomap(ip, iomap, &imap);
- /* optionally associate a dax device with the iomap bdev */
- bdev = iomap->bdev;
- if (blk_queue_dax(bdev->bd_queue))
- iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name);
- else
- iomap->dax_dev = NULL;
-
if (shared)
iomap->flags |= IOMAP_F_SHARED;
return 0;
@@ -1169,7 +1165,6 @@ xfs_file_iomap_end(
unsigned flags,
struct iomap *iomap)
{
- fs_put_dax(iomap->dax_dev);
if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC)
return xfs_file_iomap_end_delalloc(XFS_I(inode), offset,
length, written, iomap);
diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h
index 00db3ecea084..ee535065c5d0 100644
--- a/fs/xfs/xfs_iomap.h
+++ b/fs/xfs/xfs_iomap.h
@@ -27,7 +27,7 @@ int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t,
struct xfs_bmbt_irec *, int);
int xfs_iomap_write_allocate(struct xfs_inode *, int, xfs_off_t,
struct xfs_bmbt_irec *);
-int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t);
+int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t, bool);
void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *,
struct xfs_bmbt_irec *);
diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h
index 9301c5a6060b..dcd1292664b3 100644
--- a/fs/xfs/xfs_linux.h
+++ b/fs/xfs/xfs_linux.h
@@ -270,7 +270,14 @@ static inline uint64_t howmany_64(uint64_t x, uint32_t y)
#endif /* DEBUG */
#ifdef CONFIG_XFS_RT
-#define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME)
+
+/*
+ * make sure we ignore the inode flag if the filesystem doesn't have a
+ * configured realtime device.
+ */
+#define XFS_IS_REALTIME_INODE(ip) \
+ (((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) && \
+ (ip)->i_mount->m_rtdev_targp)
#else
#define XFS_IS_REALTIME_INODE(ip) (0)
#endif
diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c
index 2f2dc3c09ad0..4246876df7b7 100644
--- a/fs/xfs/xfs_pnfs.c
+++ b/fs/xfs/xfs_pnfs.c
@@ -274,7 +274,7 @@ xfs_fs_commit_blocks(
(end - 1) >> PAGE_SHIFT);
WARN_ON_ONCE(error);
- error = xfs_iomap_write_unwritten(ip, start, length);
+ error = xfs_iomap_write_unwritten(ip, start, length, false);
if (error)
goto out_drop_iolock;
}
diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c
index de9493253edf..a65108594a07 100644
--- a/fs/xfs/xfs_quotaops.c
+++ b/fs/xfs/xfs_quotaops.c
@@ -125,7 +125,7 @@ xfs_fs_set_info(
struct xfs_mount *mp = XFS_M(sb);
struct qc_dqblk newlim;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
if (!XFS_IS_QUOTA_RUNNING(mp))
return -ENOSYS;
@@ -175,7 +175,7 @@ xfs_quota_enable(
{
struct xfs_mount *mp = XFS_M(sb);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
if (!XFS_IS_QUOTA_RUNNING(mp))
return -ENOSYS;
@@ -190,7 +190,7 @@ xfs_quota_disable(
{
struct xfs_mount *mp = XFS_M(sb);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
if (!XFS_IS_QUOTA_RUNNING(mp))
return -ENOSYS;
@@ -208,7 +208,7 @@ xfs_fs_rm_xquota(
struct xfs_mount *mp = XFS_M(sb);
unsigned int flags = 0;
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
if (XFS_IS_QUOTA_ON(mp))
@@ -279,7 +279,7 @@ xfs_fs_set_dqblk(
{
struct xfs_mount *mp = XFS_M(sb);
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
return -EROFS;
if (!XFS_IS_QUOTA_RUNNING(mp))
return -ENOSYS;
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index c1c4c2ea1014..584cf2d573ba 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -210,7 +210,7 @@ xfs_parseargs(
/*
* Copy binary VFS mount flags we are interested in.
*/
- if (sb->s_flags & MS_RDONLY)
+ if (sb_rdonly(sb))
mp->m_flags |= XFS_MOUNT_RDONLY;
if (sb->s_flags & MS_DIRSYNC)
mp->m_flags |= XFS_MOUNT_DIRSYNC;
@@ -714,17 +714,26 @@ STATIC void
xfs_close_devices(
struct xfs_mount *mp)
{
+ struct dax_device *dax_ddev = mp->m_ddev_targp->bt_daxdev;
+
if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
+ struct dax_device *dax_logdev = mp->m_logdev_targp->bt_daxdev;
+
xfs_free_buftarg(mp, mp->m_logdev_targp);
xfs_blkdev_put(logdev);
+ fs_put_dax(dax_logdev);
}
if (mp->m_rtdev_targp) {
struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
+ struct dax_device *dax_rtdev = mp->m_rtdev_targp->bt_daxdev;
+
xfs_free_buftarg(mp, mp->m_rtdev_targp);
xfs_blkdev_put(rtdev);
+ fs_put_dax(dax_rtdev);
}
xfs_free_buftarg(mp, mp->m_ddev_targp);
+ fs_put_dax(dax_ddev);
}
/*
@@ -742,6 +751,8 @@ xfs_open_devices(
struct xfs_mount *mp)
{
struct block_device *ddev = mp->m_super->s_bdev;
+ struct dax_device *dax_ddev = fs_dax_get_by_bdev(ddev);
+ struct dax_device *dax_logdev = NULL, *dax_rtdev = NULL;
struct block_device *logdev = NULL, *rtdev = NULL;
int error;
@@ -752,6 +763,7 @@ xfs_open_devices(
error = xfs_blkdev_get(mp, mp->m_logname, &logdev);
if (error)
goto out;
+ dax_logdev = fs_dax_get_by_bdev(logdev);
}
if (mp->m_rtname) {
@@ -765,24 +777,25 @@ xfs_open_devices(
error = -EINVAL;
goto out_close_rtdev;
}
+ dax_rtdev = fs_dax_get_by_bdev(rtdev);
}
/*
* Setup xfs_mount buffer target pointers
*/
error = -ENOMEM;
- mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev);
+ mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev, dax_ddev);
if (!mp->m_ddev_targp)
goto out_close_rtdev;
if (rtdev) {
- mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev);
+ mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev, dax_rtdev);
if (!mp->m_rtdev_targp)
goto out_free_ddev_targ;
}
if (logdev && logdev != ddev) {
- mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev);
+ mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev, dax_logdev);
if (!mp->m_logdev_targp)
goto out_free_rtdev_targ;
} else {
@@ -798,10 +811,14 @@ xfs_open_devices(
xfs_free_buftarg(mp, mp->m_ddev_targp);
out_close_rtdev:
xfs_blkdev_put(rtdev);
+ fs_put_dax(dax_rtdev);
out_close_logdev:
- if (logdev && logdev != ddev)
+ if (logdev && logdev != ddev) {
xfs_blkdev_put(logdev);
+ fs_put_dax(dax_logdev);
+ }
out:
+ fs_put_dax(dax_ddev);
return error;
}
@@ -1637,6 +1654,16 @@ xfs_fs_fill_super(
"DAX and reflink have not been tested together!");
}
+ if (mp->m_flags & XFS_MOUNT_DISCARD) {
+ struct request_queue *q = bdev_get_queue(sb->s_bdev);
+
+ if (!blk_queue_discard(q)) {
+ xfs_warn(mp, "mounting with \"discard\" option, but "
+ "the device does not support discard");
+ mp->m_flags &= ~XFS_MOUNT_DISCARD;
+ }
+ }
+
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) {
if (mp->m_sb.sb_rblocks) {
xfs_alert(mp,
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index dedf9d789166..fa1505292f6c 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -399,17 +399,12 @@ extern const struct fwnode_operations acpi_device_fwnode_ops;
extern const struct fwnode_operations acpi_data_fwnode_ops;
extern const struct fwnode_operations acpi_static_fwnode_ops;
+bool is_acpi_device_node(const struct fwnode_handle *fwnode);
+bool is_acpi_data_node(const struct fwnode_handle *fwnode);
+
static inline bool is_acpi_node(const struct fwnode_handle *fwnode)
{
- return !IS_ERR_OR_NULL(fwnode) &&
- (fwnode->ops == &acpi_device_fwnode_ops
- || fwnode->ops == &acpi_data_fwnode_ops);
-}
-
-static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)
-{
- return !IS_ERR_OR_NULL(fwnode) &&
- fwnode->ops == &acpi_device_fwnode_ops;
+ return (is_acpi_device_node(fwnode) || is_acpi_data_node(fwnode));
}
#define to_acpi_device_node(__fwnode) \
@@ -422,11 +417,6 @@ static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)
NULL; \
})
-static inline bool is_acpi_data_node(const struct fwnode_handle *fwnode)
-{
- return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
-}
-
#define to_acpi_data_node(__fwnode) \
({ \
typeof(__fwnode) __to_acpi_data_node_fwnode = __fwnode; \
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h
index 0504ef8f3aa3..976f8ac26665 100644
--- a/include/asm-generic/percpu.h
+++ b/include/asm-generic/percpu.h
@@ -115,15 +115,35 @@ do { \
(__ret); \
})
-#define this_cpu_generic_read(pcp) \
+#define __this_cpu_generic_read_nopreempt(pcp) \
({ \
typeof(pcp) __ret; \
preempt_disable_notrace(); \
- __ret = raw_cpu_generic_read(pcp); \
+ __ret = READ_ONCE(*raw_cpu_ptr(&(pcp))); \
preempt_enable_notrace(); \
__ret; \
})
+#define __this_cpu_generic_read_noirq(pcp) \
+({ \
+ typeof(pcp) __ret; \
+ unsigned long __flags; \
+ raw_local_irq_save(__flags); \
+ __ret = raw_cpu_generic_read(pcp); \
+ raw_local_irq_restore(__flags); \
+ __ret; \
+})
+
+#define this_cpu_generic_read(pcp) \
+({ \
+ typeof(pcp) __ret; \
+ if (__native_word(pcp)) \
+ __ret = __this_cpu_generic_read_nopreempt(pcp); \
+ else \
+ __ret = __this_cpu_generic_read_noirq(pcp); \
+ __ret; \
+})
+
#define this_cpu_generic_to_op(pcp, val, op) \
do { \
unsigned long __flags; \
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
index 723e81a6c162..2e51f6e7b3c2 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -75,10 +75,10 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
#define put_user(x, ptr) \
({ \
- void *__p = (ptr); \
+ void __user *__p = (ptr); \
might_fault(); \
access_ok(VERIFY_WRITE, __p, sizeof(*ptr)) ? \
- __put_user((x), ((__typeof__(*(ptr)) *)__p)) : \
+ __put_user((x), ((__typeof__(*(ptr)) __user *)__p)) : \
-EFAULT; \
})
@@ -137,10 +137,10 @@ extern int __put_user_bad(void) __attribute__((noreturn));
#define get_user(x, ptr) \
({ \
- const void *__p = (ptr); \
+ const void __user *__p = (ptr); \
might_fault(); \
access_ok(VERIFY_READ, __p, sizeof(*ptr)) ? \
- __get_user((x), (__typeof__(*(ptr)) *)__p) : \
+ __get_user((x), (__typeof__(*(ptr)) __user *)__p) :\
((x) = (__typeof__(*(ptr)))0,-EFAULT); \
})
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 9fdb54a95976..8acfc1e099e1 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -216,6 +216,7 @@
* .data section
*/
#define DATA_DATA \
+ *(.xiptext) \
*(DATA_MAIN) \
*(.ref.data) \
*(.data..shared_aligned) /* percpu related */ \
diff --git a/include/dt-bindings/clock/gxbb-aoclkc.h b/include/dt-bindings/clock/gxbb-aoclkc.h
index 31751482d13c..9d15e2221fdb 100644
--- a/include/dt-bindings/clock/gxbb-aoclkc.h
+++ b/include/dt-bindings/clock/gxbb-aoclkc.h
@@ -62,5 +62,6 @@
#define CLKID_AO_UART1 3
#define CLKID_AO_UART2 4
#define CLKID_AO_IR_BLASTER 5
+#define CLKID_AO_CEC_32K 6
#endif
diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h
index e3e9f7919c31..c04a76d8facf 100644
--- a/include/dt-bindings/clock/gxbb-clkc.h
+++ b/include/dt-bindings/clock/gxbb-clkc.h
@@ -5,37 +5,96 @@
#ifndef __GXBB_CLKC_H
#define __GXBB_CLKC_H
+#define CLKID_SYS_PLL 0
#define CLKID_HDMI_PLL 2
+#define CLKID_FIXED_PLL 3
#define CLKID_FCLK_DIV2 4
#define CLKID_FCLK_DIV3 5
#define CLKID_FCLK_DIV4 6
+#define CLKID_FCLK_DIV5 7
+#define CLKID_FCLK_DIV7 8
#define CLKID_GP0_PLL 9
#define CLKID_CLK81 12
+#define CLKID_MPLL0 13
+#define CLKID_MPLL1 14
#define CLKID_MPLL2 15
+#define CLKID_DDR 16
+#define CLKID_DOS 17
+#define CLKID_ISA 18
+#define CLKID_PL301 19
+#define CLKID_PERIPHS 20
#define CLKID_SPICC 21
#define CLKID_I2C 22
#define CLKID_SAR_ADC 23
+#define CLKID_SMART_CARD 24
#define CLKID_RNG0 25
#define CLKID_UART0 26
+#define CLKID_SDHC 27
+#define CLKID_STREAM 28
+#define CLKID_ASYNC_FIFO 29
+#define CLKID_SDIO 30
+#define CLKID_ABUF 31
+#define CLKID_HIU_IFACE 32
+#define CLKID_ASSIST_MISC 33
#define CLKID_SPI 34
#define CLKID_ETH 36
+#define CLKID_I2S_SPDIF 35
+#define CLKID_DEMUX 37
#define CLKID_AIU_GLUE 38
#define CLKID_IEC958 39
#define CLKID_I2S_OUT 40
+#define CLKID_AMCLK 41
+#define CLKID_AIFIFO2 42
+#define CLKID_MIXER 43
#define CLKID_MIXER_IFACE 44
+#define CLKID_ADC 45
+#define CLKID_BLKMV 46
#define CLKID_AIU 47
#define CLKID_UART1 48
+#define CLKID_G2D 49
#define CLKID_USB0 50
#define CLKID_USB1 51
+#define CLKID_RESET 52
+#define CLKID_NAND 53
+#define CLKID_DOS_PARSER 54
#define CLKID_USB 55
+#define CLKID_VDIN1 56
+#define CLKID_AHB_ARB0 57
+#define CLKID_EFUSE 58
+#define CLKID_BOOT_ROM 59
+#define CLKID_AHB_DATA_BUS 60
+#define CLKID_AHB_CTRL_BUS 61
+#define CLKID_HDMI_INTR_SYNC 62
#define CLKID_HDMI_PCLK 63
#define CLKID_USB1_DDR_BRIDGE 64
#define CLKID_USB0_DDR_BRIDGE 65
+#define CLKID_MMC_PCLK 66
+#define CLKID_DVIN 67
#define CLKID_UART2 68
#define CLKID_SANA 69
+#define CLKID_VPU_INTR 70
+#define CLKID_SEC_AHB_AHB3_BRIDGE 71
+#define CLKID_CLK81_A53 72
+#define CLKID_VCLK2_VENCI0 73
+#define CLKID_VCLK2_VENCI1 74
+#define CLKID_VCLK2_VENCP0 75
+#define CLKID_VCLK2_VENCP1 76
#define CLKID_GCLK_VENCI_INT0 77
+#define CLKID_GCLK_VENCI_INT 78
+#define CLKID_DAC_CLK 79
#define CLKID_AOCLK_GATE 80
#define CLKID_IEC958_GATE 81
+#define CLKID_ENC480P 82
+#define CLKID_RNG1 83
+#define CLKID_GCLK_VENCI_INT1 84
+#define CLKID_VCLK2_VENCLMCC 85
+#define CLKID_VCLK2_VENCL 86
+#define CLKID_VCLK_OTHER 87
+#define CLKID_EDP 88
+#define CLKID_AO_MEDIA_CPU 89
+#define CLKID_AO_AHB_SRAM 90
+#define CLKID_AO_AHB_BUS 91
+#define CLKID_AO_IFACE 92
#define CLKID_AO_I2C 93
#define CLKID_SD_EMMC_A 94
#define CLKID_SD_EMMC_B 95
@@ -50,5 +109,9 @@
#define CLKID_CTS_AMCLK 107
#define CLKID_CTS_MCLK_I958 110
#define CLKID_CTS_I958 113
+#define CLKID_32K_CLK 114
+#define CLKID_SD_EMMC_A_CLK0 119
+#define CLKID_SD_EMMC_B_CLK0 122
+#define CLKID_SD_EMMC_C_CLK0 125
#endif /* __GXBB_CLKC_H */
diff --git a/include/dt-bindings/clock/meson8b-clkc.h b/include/dt-bindings/clock/meson8b-clkc.h
index e29227fb52a1..a9c0306330b6 100644
--- a/include/dt-bindings/clock/meson8b-clkc.h
+++ b/include/dt-bindings/clock/meson8b-clkc.h
@@ -21,15 +21,85 @@
#define CLKID_ZERO 13
#define CLKID_MPEG_SEL 14
#define CLKID_MPEG_DIV 15
+#define CLKID_DDR 16
+#define CLKID_DOS 17
+#define CLKID_ISA 18
+#define CLKID_PL301 19
+#define CLKID_PERIPHS 20
+#define CLKID_SPICC 21
+#define CLKID_I2C 22
#define CLKID_SAR_ADC 23
+#define CLKID_SMART_CARD 24
#define CLKID_RNG0 25
+#define CLKID_UART0 26
+#define CLKID_SDHC 27
+#define CLKID_STREAM 28
+#define CLKID_ASYNC_FIFO 29
#define CLKID_SDIO 30
+#define CLKID_ABUF 31
+#define CLKID_HIU_IFACE 32
+#define CLKID_ASSIST_MISC 33
+#define CLKID_SPI 34
+#define CLKID_I2S_SPDIF 35
#define CLKID_ETH 36
+#define CLKID_DEMUX 37
+#define CLKID_AIU_GLUE 38
+#define CLKID_IEC958 39
+#define CLKID_I2S_OUT 40
+#define CLKID_AMCLK 41
+#define CLKID_AIFIFO2 42
+#define CLKID_MIXER 43
+#define CLKID_MIXER_IFACE 44
+#define CLKID_ADC 45
+#define CLKID_BLKMV 46
+#define CLKID_AIU 47
+#define CLKID_UART1 48
+#define CLKID_G2D 49
#define CLKID_USB0 50
#define CLKID_USB1 51
+#define CLKID_RESET 52
+#define CLKID_NAND 53
+#define CLKID_DOS_PARSER 54
#define CLKID_USB 55
+#define CLKID_VDIN1 56
+#define CLKID_AHB_ARB0 57
+#define CLKID_EFUSE 58
+#define CLKID_BOOT_ROM 59
+#define CLKID_AHB_DATA_BUS 60
+#define CLKID_AHB_CTRL_BUS 61
+#define CLKID_HDMI_INTR_SYNC 62
+#define CLKID_HDMI_PCLK 63
#define CLKID_USB1_DDR_BRIDGE 64
#define CLKID_USB0_DDR_BRIDGE 65
+#define CLKID_MMC_PCLK 66
+#define CLKID_DVIN 67
+#define CLKID_UART2 68
#define CLKID_SANA 69
+#define CLKID_VPU_INTR 70
+#define CLKID_SEC_AHB_AHB3_BRIDGE 71
+#define CLKID_CLK81_A9 72
+#define CLKID_VCLK2_VENCI0 73
+#define CLKID_VCLK2_VENCI1 74
+#define CLKID_VCLK2_VENCP0 75
+#define CLKID_VCLK2_VENCP1 76
+#define CLKID_GCLK_VENCI_INT 77
+#define CLKID_GCLK_VENCP_INT 78
+#define CLKID_DAC_CLK 79
+#define CLKID_AOCLK_GATE 80
+#define CLKID_IEC958_GATE 81
+#define CLKID_ENC480P 82
+#define CLKID_RNG1 83
+#define CLKID_GCLK_VENCL_INT 84
+#define CLKID_VCLK2_VENCLMCC 85
+#define CLKID_VCLK2_VENCL 86
+#define CLKID_VCLK2_OTHER 87
+#define CLKID_EDP 88
+#define CLKID_AO_MEDIA_CPU 89
+#define CLKID_AO_AHB_SRAM 90
+#define CLKID_AO_AHB_BUS 91
+#define CLKID_AO_IFACE 92
+#define CLKID_MPLL0 93
+#define CLKID_MPLL1 94
+#define CLKID_MPLL2 95
#endif /* __MESON8B_CLKC_H */
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8996.h b/include/dt-bindings/clock/qcom,gcc-msm8996.h
index 1f5c42254798..75b07cf5eed0 100644
--- a/include/dt-bindings/clock/qcom,gcc-msm8996.h
+++ b/include/dt-bindings/clock/qcom,gcc-msm8996.h
@@ -233,6 +233,8 @@
#define GCC_PCIE_CLKREF_CLK 216
#define GCC_RX2_USB2_CLKREF_CLK 217
#define GCC_RX1_USB2_CLKREF_CLK 218
+#define GCC_HLOS1_VOTE_LPASS_CORE_SMMU_CLK 219
+#define GCC_HLOS1_VOTE_LPASS_ADSP_SMMU_CLK 220
#define GCC_SYSTEM_NOC_BCR 0
#define GCC_CONFIG_NOC_BCR 1
diff --git a/include/dt-bindings/clock/r8a77995-cpg-mssr.h b/include/dt-bindings/clock/r8a77995-cpg-mssr.h
new file mode 100644
index 000000000000..4e8ae3dee590
--- /dev/null
+++ b/include/dt-bindings/clock/r8a77995-cpg-mssr.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 Glider bvba
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a77995 CPG Core Clocks */
+#define R8A77995_CLK_Z2 0
+#define R8A77995_CLK_ZG 1
+#define R8A77995_CLK_ZTR 2
+#define R8A77995_CLK_ZT 3
+#define R8A77995_CLK_ZX 4
+#define R8A77995_CLK_S0D1 5
+#define R8A77995_CLK_S1D1 6
+#define R8A77995_CLK_S1D2 7
+#define R8A77995_CLK_S1D4 8
+#define R8A77995_CLK_S2D1 9
+#define R8A77995_CLK_S2D2 10
+#define R8A77995_CLK_S2D4 11
+#define R8A77995_CLK_S3D1 12
+#define R8A77995_CLK_S3D2 13
+#define R8A77995_CLK_S3D4 14
+#define R8A77995_CLK_S1D4C 15
+#define R8A77995_CLK_S3D1C 16
+#define R8A77995_CLK_S3D2C 17
+#define R8A77995_CLK_S3D4C 18
+#define R8A77995_CLK_LB 19
+#define R8A77995_CLK_CL 20
+#define R8A77995_CLK_ZB3 21
+#define R8A77995_CLK_ZB3D2 22
+#define R8A77995_CLK_CR 23
+#define R8A77995_CLK_CRD2 24
+#define R8A77995_CLK_SD0H 25
+#define R8A77995_CLK_SD0 26
+#define R8A77995_CLK_SSP2 27
+#define R8A77995_CLK_SSP1 28
+#define R8A77995_CLK_RPC 29
+#define R8A77995_CLK_RPCD2 30
+#define R8A77995_CLK_ZA2 31
+#define R8A77995_CLK_ZA8 32
+#define R8A77995_CLK_Z2D 33
+#define R8A77995_CLK_CANFD 34
+#define R8A77995_CLK_MSO 35
+#define R8A77995_CLK_R 36
+#define R8A77995_CLK_OSC 37
+#define R8A77995_CLK_LV0 38
+#define R8A77995_CLK_LV1 39
+#define R8A77995_CLK_CP 40
+
+#endif /* __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__ */
diff --git a/include/dt-bindings/clock/rk3228-cru.h b/include/dt-bindings/clock/rk3228-cru.h
index 56f841c22801..55655ab0a4c4 100644
--- a/include/dt-bindings/clock/rk3228-cru.h
+++ b/include/dt-bindings/clock/rk3228-cru.h
@@ -49,6 +49,7 @@
#define SCLK_EMMC_DRV 117
#define SCLK_SDMMC_SAMPLE 118
#define SCLK_SDIO_SAMPLE 119
+#define SCLK_SDIO_SRC 120
#define SCLK_EMMC_SAMPLE 121
#define SCLK_VOP 122
#define SCLK_HDMI_HDCP 123
diff --git a/include/dt-bindings/clock/rv1108-cru.h b/include/dt-bindings/clock/rv1108-cru.h
index ae26f8105914..d8d0e0456dc2 100644
--- a/include/dt-bindings/clock/rv1108-cru.h
+++ b/include/dt-bindings/clock/rv1108-cru.h
@@ -43,12 +43,74 @@
#define SCLK_SDMMC_SAMPLE 84
#define SCLK_SDIO_SAMPLE 85
#define SCLK_EMMC_SAMPLE 86
+#define SCLK_VENC_CORE 87
+#define SCLK_HEVC_CORE 88
+#define SCLK_HEVC_CABAC 89
+#define SCLK_PWM0_PMU 90
+#define SCLK_I2C0_PMU 91
+#define SCLK_WIFI 92
+#define SCLK_CIFOUT 93
+#define SCLK_MIPI_CSI_OUT 94
+#define SCLK_CIF0 95
+#define SCLK_CIF1 96
+#define SCLK_CIF2 97
+#define SCLK_CIF3 98
+#define SCLK_DSP 99
+#define SCLK_DSP_IOP 100
+#define SCLK_DSP_EPP 101
+#define SCLK_DSP_EDP 102
+#define SCLK_DSP_EDAP 103
+#define SCLK_CVBS_HOST 104
+#define SCLK_HDMI_SFR 105
+#define SCLK_HDMI_CEC 106
+#define SCLK_CRYPTO 107
+#define SCLK_SPI 108
+#define SCLK_SARADC 109
+#define SCLK_TSADC 110
+#define SCLK_MAC_PRE 111
+#define SCLK_MAC 112
+#define SCLK_MAC_RX 113
+#define SCLK_MAC_REF 114
+#define SCLK_MAC_REFOUT 115
+#define SCLK_DSP_PFM 116
+#define SCLK_RGA 117
+#define SCLK_I2C1 118
+#define SCLK_I2C2 119
+#define SCLK_I2C3 120
+#define SCLK_PWM 121
+#define SCLK_ISP 122
+#define SCLK_USBPHY 123
+#define SCLK_I2S0_SRC 124
+#define SCLK_I2S1_SRC 125
+#define SCLK_I2S2_SRC 126
+#define SCLK_UART0_SRC 127
+#define SCLK_UART1_SRC 128
+#define SCLK_UART2_SRC 129
+
+#define DCLK_VOP_SRC 185
+#define DCLK_HDMIPHY 186
+#define DCLK_VOP 187
/* aclk gates */
#define ACLK_DMAC 192
#define ACLK_PRE 193
#define ACLK_CORE 194
#define ACLK_ENMCORE 195
+#define ACLK_RKVENC 196
+#define ACLK_RKVDEC 197
+#define ACLK_VPU 198
+#define ACLK_CIF0 199
+#define ACLK_VIO0 200
+#define ACLK_VIO1 201
+#define ACLK_VOP 202
+#define ACLK_IEP 203
+#define ACLK_RGA 204
+#define ACLK_ISP 205
+#define ACLK_CIF1 206
+#define ACLK_CIF2 207
+#define ACLK_CIF3 208
+#define ACLK_PERI 209
+#define ACLK_GMAC 210
/* pclk gates */
#define PCLK_GPIO1 256
@@ -67,10 +129,24 @@
#define PCLK_PWM 269
#define PCLK_TIMER 270
#define PCLK_PERI 271
+#define PCLK_GPIO0_PMU 272
+#define PCLK_I2C0_PMU 273
+#define PCLK_PWM0_PMU 274
+#define PCLK_ISP 275
+#define PCLK_VIO 276
+#define PCLK_MIPI_DSI 277
+#define PCLK_HDMI_CTRL 278
+#define PCLK_SARADC 279
+#define PCLK_DSP_CFG 280
+#define PCLK_BUS 281
+#define PCLK_EFUSE0 282
+#define PCLK_EFUSE1 283
+#define PCLK_WDT 284
+#define PCLK_GMAC 285
/* hclk gates */
#define HCLK_I2S0_8CH 320
-#define HCLK_I2S1_8CH 321
+#define HCLK_I2S1_2CH 321
#define HCLK_I2S2_2CH 322
#define HCLK_NANDC 323
#define HCLK_SDMMC 324
@@ -78,20 +154,37 @@
#define HCLK_EMMC 326
#define HCLK_PERI 327
#define HCLK_SFC 328
+#define HCLK_RKVENC 329
+#define HCLK_RKVDEC 330
+#define HCLK_CIF0 331
+#define HCLK_VIO 332
+#define HCLK_VOP 333
+#define HCLK_IEP 334
+#define HCLK_RGA 335
+#define HCLK_ISP 336
+#define HCLK_CRYPTO_MST 337
+#define HCLK_CRYPTO_SLV 338
+#define HCLK_HOST0 339
+#define HCLK_OTG 340
+#define HCLK_CIF1 341
+#define HCLK_CIF2 342
+#define HCLK_CIF3 343
+#define HCLK_BUS 344
+#define HCLK_VPU 345
-#define CLK_NR_CLKS (HCLK_SFC + 1)
+#define CLK_NR_CLKS (HCLK_VPU + 1)
/* reset id */
-#define SRST_CORE_PO_AD 0
+#define SRST_CORE_PO_AD 0
#define SRST_CORE_AD 1
#define SRST_L2_AD 2
-#define SRST_CPU_NIU_AD 3
+#define SRST_CPU_NIU_AD 3
#define SRST_CORE_PO 4
#define SRST_CORE 5
-#define SRST_L2 6
+#define SRST_L2 6
#define SRST_CORE_DBG 8
#define PRST_DBG 9
-#define RST_DAP 10
+#define RST_DAP 10
#define PRST_DBG_NIU 11
#define ARST_STRC_SYS_AD 15
@@ -158,9 +251,9 @@
#define HRST_SYSBUS 75
#define PRST_USBGRF 76
-#define ARST_PERIPH_NIU 80
-#define HRST_PERIPH_NIU 81
-#define PRST_PERIPH_NIU 82
+#define ARST_PERIPH_NIU 80
+#define HRST_PERIPH_NIU 81
+#define PRST_PERIPH_NIU 82
#define HRST_PERIPH 83
#define HRST_SDMMC 84
#define HRST_SDIO 85
@@ -178,7 +271,7 @@
#define HRST_HOST0_AUX 96
#define HRST_HOST0_ARB 97
#define SRST_HOST0_EHCIPHY 98
-#define SRST_HOST0_UTMI 99
+#define SRST_HOST0_UTMI 99
#define SRST_USBPOR 100
#define SRST_UTMI0 101
#define SRST_UTMI1 102
@@ -225,21 +318,21 @@
#define HRST_VPU_NIU 141
#define ARST_VPU 142
#define HRST_VPU 143
-#define ARST_RKVDEC_NIU 144
-#define HRST_RKVDEC_NIU 145
+#define ARST_RKVDEC_NIU 144
+#define HRST_RKVDEC_NIU 145
#define ARST_RKVDEC 146
#define HRST_RKVDEC 147
#define SRST_RKVDEC_CABAC 148
#define SRST_RKVDEC_CORE 149
-#define ARST_RKVENC_NIU 150
-#define HRST_RKVENC_NIU 151
+#define ARST_RKVENC_NIU 150
+#define HRST_RKVENC_NIU 151
#define ARST_RKVENC 152
#define HRST_RKVENC 153
#define SRST_RKVENC_CORE 154
#define SRST_DSP_CORE 156
#define SRST_DSP_SYS 157
-#define SRST_DSP_GLOBAL 158
+#define SRST_DSP_GLOBAL 158
#define SRST_DSP_OECM 159
#define PRST_DSP_IOP_NIU 160
#define ARST_DSP_EPP_NIU 161
@@ -257,7 +350,7 @@
#define SRST_PMU_I2C0 173
#define PRST_PMU_I2C0 174
#define PRST_PMU_GPIO0 175
-#define PRST_PMU_INTMEM 176
+#define PRST_PMU_INTMEM 176
#define PRST_PMU_PWM0 177
#define SRST_PMU_PWM0 178
#define PRST_PMU_GRF 179
diff --git a/include/dt-bindings/clock/stm32h7-clks.h b/include/dt-bindings/clock/stm32h7-clks.h
new file mode 100644
index 000000000000..6637272b3242
--- /dev/null
+++ b/include/dt-bindings/clock/stm32h7-clks.h
@@ -0,0 +1,165 @@
+/* SYS, CORE AND BUS CLOCKS */
+#define SYS_D1CPRE 0
+#define HCLK 1
+#define PCLK1 2
+#define PCLK2 3
+#define PCLK3 4
+#define PCLK4 5
+#define HSI_DIV 6
+#define HSE_1M 7
+#define I2S_CKIN 8
+#define CK_DSI_PHY 9
+#define HSE_CK 10
+#define LSE_CK 11
+#define CSI_KER_DIV122 12
+#define RTC_CK 13
+#define CPU_SYSTICK 14
+
+/* OSCILLATOR BANK */
+#define OSC_BANK 18
+#define HSI_CK 18
+#define HSI_KER_CK 19
+#define CSI_CK 20
+#define CSI_KER_CK 21
+#define RC48_CK 22
+#define LSI_CK 23
+
+/* MCLOCK BANK */
+#define MCLK_BANK 28
+#define PER_CK 28
+#define PLLSRC 29
+#define SYS_CK 30
+#define TRACEIN_CK 31
+
+/* ODF BANK */
+#define ODF_BANK 32
+#define PLL1_P 32
+#define PLL1_Q 33
+#define PLL1_R 34
+#define PLL2_P 35
+#define PLL2_Q 36
+#define PLL2_R 37
+#define PLL3_P 38
+#define PLL3_Q 39
+#define PLL3_R 40
+
+/* MCO BANK */
+#define MCO_BANK 41
+#define MCO1 41
+#define MCO2 42
+
+/* PERIF BANK */
+#define PERIF_BANK 50
+#define D1SRAM1_CK 50
+#define ITCM_CK 51
+#define DTCM2_CK 52
+#define DTCM1_CK 53
+#define FLITF_CK 54
+#define JPGDEC_CK 55
+#define DMA2D_CK 56
+#define MDMA_CK 57
+#define USB2ULPI_CK 58
+#define USB1ULPI_CK 59
+#define ETH1RX_CK 60
+#define ETH1TX_CK 61
+#define ETH1MAC_CK 62
+#define ART_CK 63
+#define DMA2_CK 64
+#define DMA1_CK 65
+#define D2SRAM3_CK 66
+#define D2SRAM2_CK 67
+#define D2SRAM1_CK 68
+#define HASH_CK 69
+#define CRYPT_CK 70
+#define CAMITF_CK 71
+#define BKPRAM_CK 72
+#define HSEM_CK 73
+#define BDMA_CK 74
+#define CRC_CK 75
+#define GPIOK_CK 76
+#define GPIOJ_CK 77
+#define GPIOI_CK 78
+#define GPIOH_CK 79
+#define GPIOG_CK 80
+#define GPIOF_CK 81
+#define GPIOE_CK 82
+#define GPIOD_CK 83
+#define GPIOC_CK 84
+#define GPIOB_CK 85
+#define GPIOA_CK 86
+#define WWDG1_CK 87
+#define DAC12_CK 88
+#define WWDG2_CK 89
+#define TIM14_CK 90
+#define TIM13_CK 91
+#define TIM12_CK 92
+#define TIM7_CK 93
+#define TIM6_CK 94
+#define TIM5_CK 95
+#define TIM4_CK 96
+#define TIM3_CK 97
+#define TIM2_CK 98
+#define MDIOS_CK 99
+#define OPAMP_CK 100
+#define CRS_CK 101
+#define TIM17_CK 102
+#define TIM16_CK 103
+#define TIM15_CK 104
+#define TIM8_CK 105
+#define TIM1_CK 106
+#define TMPSENS_CK 107
+#define RTCAPB_CK 108
+#define VREF_CK 109
+#define COMP12_CK 110
+#define SYSCFG_CK 111
+
+/* KERNEL BANK */
+#define KERN_BANK 120
+#define SDMMC1_CK 120
+#define QUADSPI_CK 121
+#define FMC_CK 122
+#define USB2OTG_CK 123
+#define USB1OTG_CK 124
+#define ADC12_CK 125
+#define SDMMC2_CK 126
+#define RNG_CK 127
+#define ADC3_CK 128
+#define DSI_CK 129
+#define LTDC_CK 130
+#define USART8_CK 131
+#define USART7_CK 132
+#define HDMICEC_CK 133
+#define I2C3_CK 134
+#define I2C2_CK 135
+#define I2C1_CK 136
+#define UART5_CK 137
+#define UART4_CK 138
+#define USART3_CK 139
+#define USART2_CK 140
+#define SPDIFRX_CK 141
+#define SPI3_CK 142
+#define SPI2_CK 143
+#define LPTIM1_CK 144
+#define FDCAN_CK 145
+#define SWP_CK 146
+#define HRTIM_CK 147
+#define DFSDM1_CK 148
+#define SAI3_CK 149
+#define SAI2_CK 150
+#define SAI1_CK 151
+#define SPI5_CK 152
+#define SPI4_CK 153
+#define SPI1_CK 154
+#define USART6_CK 155
+#define USART1_CK 156
+#define SAI4B_CK 157
+#define SAI4A_CK 158
+#define LPTIM5_CK 159
+#define LPTIM4_CK 160
+#define LPTIM3_CK 161
+#define LPTIM2_CK 162
+#define I2C4_CK 163
+#define SPI6_CK 164
+#define LPUART1_CK 165
+
+#define STM32H7_MAX_CLKS 166
diff --git a/include/dt-bindings/clock/sun4i-a10-ccu.h b/include/dt-bindings/clock/sun4i-a10-ccu.h
new file mode 100644
index 000000000000..c5a53f38d654
--- /dev/null
+++ b/include/dt-bindings/clock/sun4i-a10-ccu.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2017 Priit Laes <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _DT_BINDINGS_CLK_SUN4I_A10_H_
+#define _DT_BINDINGS_CLK_SUN4I_A10_H_
+
+#define CLK_HOSC 1
+#define CLK_CPU 20
+
+/* AHB Gates */
+#define CLK_AHB_OTG 26
+#define CLK_AHB_EHCI0 27
+#define CLK_AHB_OHCI0 28
+#define CLK_AHB_EHCI1 29
+#define CLK_AHB_OHCI1 30
+#define CLK_AHB_SS 31
+#define CLK_AHB_DMA 32
+#define CLK_AHB_BIST 33
+#define CLK_AHB_MMC0 34
+#define CLK_AHB_MMC1 35
+#define CLK_AHB_MMC2 36
+#define CLK_AHB_MMC3 37
+#define CLK_AHB_MS 38
+#define CLK_AHB_NAND 39
+#define CLK_AHB_SDRAM 40
+#define CLK_AHB_ACE 41
+#define CLK_AHB_EMAC 42
+#define CLK_AHB_TS 43
+#define CLK_AHB_SPI0 44
+#define CLK_AHB_SPI1 45
+#define CLK_AHB_SPI2 46
+#define CLK_AHB_SPI3 47
+#define CLK_AHB_PATA 48
+#define CLK_AHB_SATA 49
+#define CLK_AHB_GPS 50
+#define CLK_AHB_HSTIMER 51
+#define CLK_AHB_VE 52
+#define CLK_AHB_TVD 53
+#define CLK_AHB_TVE0 54
+#define CLK_AHB_TVE1 55
+#define CLK_AHB_LCD0 56
+#define CLK_AHB_LCD1 57
+#define CLK_AHB_CSI0 58
+#define CLK_AHB_CSI1 59
+#define CLK_AHB_HDMI0 60
+#define CLK_AHB_HDMI1 61
+#define CLK_AHB_DE_BE0 62
+#define CLK_AHB_DE_BE1 63
+#define CLK_AHB_DE_FE0 64
+#define CLK_AHB_DE_FE1 65
+#define CLK_AHB_GMAC 66
+#define CLK_AHB_MP 67
+#define CLK_AHB_GPU 68
+
+/* APB0 Gates */
+#define CLK_APB0_CODEC 69
+#define CLK_APB0_SPDIF 70
+#define CLK_APB0_I2S0 71
+#define CLK_APB0_AC97 72
+#define CLK_APB0_I2S1 73
+#define CLK_APB0_PIO 74
+#define CLK_APB0_IR0 75
+#define CLK_APB0_IR1 76
+#define CLK_APB0_I2S2 77
+#define CLK_APB0_KEYPAD 78
+
+/* APB1 Gates */
+#define CLK_APB1_I2C0 79
+#define CLK_APB1_I2C1 80
+#define CLK_APB1_I2C2 81
+#define CLK_APB1_I2C3 82
+#define CLK_APB1_CAN 83
+#define CLK_APB1_SCR 84
+#define CLK_APB1_PS20 85
+#define CLK_APB1_PS21 86
+#define CLK_APB1_I2C4 87
+#define CLK_APB1_UART0 88
+#define CLK_APB1_UART1 89
+#define CLK_APB1_UART2 90
+#define CLK_APB1_UART3 91
+#define CLK_APB1_UART4 92
+#define CLK_APB1_UART5 93
+#define CLK_APB1_UART6 94
+#define CLK_APB1_UART7 95
+
+/* IP clocks */
+#define CLK_NAND 96
+#define CLK_MS 97
+#define CLK_MMC0 98
+#define CLK_MMC0_OUTPUT 99
+#define CLK_MMC0_SAMPLE 100
+#define CLK_MMC1 101
+#define CLK_MMC1_OUTPUT 102
+#define CLK_MMC1_SAMPLE 103
+#define CLK_MMC2 104
+#define CLK_MMC2_OUTPUT 105
+#define CLK_MMC2_SAMPLE 106
+#define CLK_MMC3 107
+#define CLK_MMC3_OUTPUT 108
+#define CLK_MMC3_SAMPLE 109
+#define CLK_TS 110
+#define CLK_SS 111
+#define CLK_SPI0 112
+#define CLK_SPI1 113
+#define CLK_SPI2 114
+#define CLK_PATA 115
+#define CLK_IR0 116
+#define CLK_IR1 117
+#define CLK_I2S0 118
+#define CLK_AC97 119
+#define CLK_SPDIF 120
+#define CLK_KEYPAD 121
+#define CLK_SATA 122
+#define CLK_USB_OHCI0 123
+#define CLK_USB_OHCI1 124
+#define CLK_USB_PHY 125
+#define CLK_GPS 126
+#define CLK_SPI3 127
+#define CLK_I2S1 128
+#define CLK_I2S2 129
+
+/* DRAM Gates */
+#define CLK_DRAM_VE 130
+#define CLK_DRAM_CSI0 131
+#define CLK_DRAM_CSI1 132
+#define CLK_DRAM_TS 133
+#define CLK_DRAM_TVD 134
+#define CLK_DRAM_TVE0 135
+#define CLK_DRAM_TVE1 136
+#define CLK_DRAM_OUT 137
+#define CLK_DRAM_DE_FE1 138
+#define CLK_DRAM_DE_FE0 139
+#define CLK_DRAM_DE_BE0 140
+#define CLK_DRAM_DE_BE1 141
+#define CLK_DRAM_MP 142
+#define CLK_DRAM_ACE 143
+
+/* Display Engine Clocks */
+#define CLK_DE_BE0 144
+#define CLK_DE_BE1 145
+#define CLK_DE_FE0 146
+#define CLK_DE_FE1 147
+#define CLK_DE_MP 148
+#define CLK_TCON0_CH0 149
+#define CLK_TCON1_CH0 150
+#define CLK_CSI_SCLK 151
+#define CLK_TVD_SCLK2 152
+#define CLK_TVD 153
+#define CLK_TCON0_CH1_SCLK2 154
+#define CLK_TCON0_CH1 155
+#define CLK_TCON1_CH1_SCLK2 156
+#define CLK_TCON1_CH1 157
+#define CLK_CSI0 158
+#define CLK_CSI1 159
+#define CLK_CODEC 160
+#define CLK_VE 161
+#define CLK_AVS 162
+#define CLK_ACE 163
+#define CLK_HDMI 164
+#define CLK_GPU 165
+
+#endif /* _DT_BINDINGS_CLK_SUN4I_A10_H_ */
diff --git a/include/dt-bindings/clock/sun7i-a20-ccu.h b/include/dt-bindings/clock/sun7i-a20-ccu.h
new file mode 100644
index 000000000000..045a5178da0c
--- /dev/null
+++ b/include/dt-bindings/clock/sun7i-a20-ccu.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 Priit Laes <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _DT_BINDINGS_CLK_SUN7I_A20_H_
+#define _DT_BINDINGS_CLK_SUN7I_A20_H_
+
+#include <dt-bindings/clock/sun4i-a10-ccu.h>
+
+#define CLK_MBUS 166
+#define CLK_HDMI1_SLOW 167
+#define CLK_HDMI1 168
+#define CLK_OUT_A 169
+#define CLK_OUT_B 170
+
+#endif /* _DT_BINDINGS_CLK_SUN7I_A20_H_ */
diff --git a/include/dt-bindings/clock/sun8i-r40-ccu.h b/include/dt-bindings/clock/sun8i-r40-ccu.h
new file mode 100644
index 000000000000..4fa5f69fc297
--- /dev/null
+++ b/include/dt-bindings/clock/sun8i-r40-ccu.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2017 Icenowy Zheng <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _DT_BINDINGS_CLK_SUN8I_R40_H_
+#define _DT_BINDINGS_CLK_SUN8I_R40_H_
+
+#define CLK_CPU 24
+
+#define CLK_BUS_MIPI_DSI 29
+#define CLK_BUS_CE 30
+#define CLK_BUS_DMA 31
+#define CLK_BUS_MMC0 32
+#define CLK_BUS_MMC1 33
+#define CLK_BUS_MMC2 34
+#define CLK_BUS_MMC3 35
+#define CLK_BUS_NAND 36
+#define CLK_BUS_DRAM 37
+#define CLK_BUS_EMAC 38
+#define CLK_BUS_TS 39
+#define CLK_BUS_HSTIMER 40
+#define CLK_BUS_SPI0 41
+#define CLK_BUS_SPI1 42
+#define CLK_BUS_SPI2 43
+#define CLK_BUS_SPI3 44
+#define CLK_BUS_SATA 45
+#define CLK_BUS_OTG 46
+#define CLK_BUS_EHCI0 47
+#define CLK_BUS_EHCI1 48
+#define CLK_BUS_EHCI2 49
+#define CLK_BUS_OHCI0 50
+#define CLK_BUS_OHCI1 51
+#define CLK_BUS_OHCI2 52
+#define CLK_BUS_VE 53
+#define CLK_BUS_MP 54
+#define CLK_BUS_DEINTERLACE 55
+#define CLK_BUS_CSI0 56
+#define CLK_BUS_CSI1 57
+#define CLK_BUS_HDMI1 58
+#define CLK_BUS_HDMI0 59
+#define CLK_BUS_DE 60
+#define CLK_BUS_TVE0 61
+#define CLK_BUS_TVE1 62
+#define CLK_BUS_TVE_TOP 63
+#define CLK_BUS_GMAC 64
+#define CLK_BUS_GPU 65
+#define CLK_BUS_TVD0 66
+#define CLK_BUS_TVD1 67
+#define CLK_BUS_TVD2 68
+#define CLK_BUS_TVD3 69
+#define CLK_BUS_TVD_TOP 70
+#define CLK_BUS_TCON_LCD0 71
+#define CLK_BUS_TCON_LCD1 72
+#define CLK_BUS_TCON_TV0 73
+#define CLK_BUS_TCON_TV1 74
+#define CLK_BUS_TCON_TOP 75
+#define CLK_BUS_CODEC 76
+#define CLK_BUS_SPDIF 77
+#define CLK_BUS_AC97 78
+#define CLK_BUS_PIO 79
+#define CLK_BUS_IR0 80
+#define CLK_BUS_IR1 81
+#define CLK_BUS_THS 82
+#define CLK_BUS_KEYPAD 83
+#define CLK_BUS_I2S0 84
+#define CLK_BUS_I2S1 85
+#define CLK_BUS_I2S2 86
+#define CLK_BUS_I2C0 87
+#define CLK_BUS_I2C1 88
+#define CLK_BUS_I2C2 89
+#define CLK_BUS_I2C3 90
+#define CLK_BUS_CAN 91
+#define CLK_BUS_SCR 92
+#define CLK_BUS_PS20 93
+#define CLK_BUS_PS21 94
+#define CLK_BUS_I2C4 95
+#define CLK_BUS_UART0 96
+#define CLK_BUS_UART1 97
+#define CLK_BUS_UART2 98
+#define CLK_BUS_UART3 99
+#define CLK_BUS_UART4 100
+#define CLK_BUS_UART5 101
+#define CLK_BUS_UART6 102
+#define CLK_BUS_UART7 103
+#define CLK_BUS_DBG 104
+
+#define CLK_THS 105
+#define CLK_NAND 106
+#define CLK_MMC0 107
+#define CLK_MMC1 108
+#define CLK_MMC2 109
+#define CLK_MMC3 110
+#define CLK_TS 111
+#define CLK_CE 112
+#define CLK_SPI0 113
+#define CLK_SPI1 114
+#define CLK_SPI2 115
+#define CLK_SPI3 116
+#define CLK_I2S0 117
+#define CLK_I2S1 118
+#define CLK_I2S2 119
+#define CLK_AC97 120
+#define CLK_SPDIF 121
+#define CLK_KEYPAD 122
+#define CLK_SATA 123
+#define CLK_USB_PHY0 124
+#define CLK_USB_PHY1 125
+#define CLK_USB_PHY2 126
+#define CLK_USB_OHCI0 127
+#define CLK_USB_OHCI1 128
+#define CLK_USB_OHCI2 129
+#define CLK_IR0 130
+#define CLK_IR1 131
+
+#define CLK_DRAM_VE 133
+#define CLK_DRAM_CSI0 134
+#define CLK_DRAM_CSI1 135
+#define CLK_DRAM_TS 136
+#define CLK_DRAM_TVD 137
+#define CLK_DRAM_MP 138
+#define CLK_DRAM_DEINTERLACE 139
+#define CLK_DE 140
+#define CLK_MP 141
+#define CLK_TCON_LCD0 142
+#define CLK_TCON_LCD1 143
+#define CLK_TCON_TV0 144
+#define CLK_TCON_TV1 145
+#define CLK_DEINTERLACE 146
+#define CLK_CSI1_MCLK 147
+#define CLK_CSI_SCLK 148
+#define CLK_CSI0_MCLK 149
+#define CLK_VE 150
+#define CLK_CODEC 151
+#define CLK_AVS 152
+#define CLK_HDMI 153
+#define CLK_HDMI_SLOW 154
+
+#define CLK_DSI_DPHY 156
+#define CLK_TVE0 157
+#define CLK_TVE1 158
+#define CLK_TVD0 159
+#define CLK_TVD1 160
+#define CLK_TVD2 161
+#define CLK_TVD3 162
+#define CLK_GPU 163
+#define CLK_OUTA 164
+#define CLK_OUTB 165
+
+#endif /* _DT_BINDINGS_CLK_SUN8I_R40_H_ */
diff --git a/include/dt-bindings/genpd/k2g.h b/include/dt-bindings/genpd/k2g.h
deleted file mode 100644
index 1f31f17e19eb..000000000000
--- a/include/dt-bindings/genpd/k2g.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * TI K2G SoC Device definitions
- *
- * Copyright (C) 2015-2017 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DT_BINDINGS_GENPD_K2G_H
-#define _DT_BINDINGS_GENPD_K2G_H
-
-/* Documented in http://processors.wiki.ti.com/index.php/TISCI */
-
-#define K2G_DEV_PMMC0 0x0000
-#define K2G_DEV_MLB0 0x0001
-#define K2G_DEV_DSS0 0x0002
-#define K2G_DEV_MCBSP0 0x0003
-#define K2G_DEV_MCASP0 0x0004
-#define K2G_DEV_MCASP1 0x0005
-#define K2G_DEV_MCASP2 0x0006
-#define K2G_DEV_DCAN0 0x0008
-#define K2G_DEV_DCAN1 0x0009
-#define K2G_DEV_EMIF0 0x000a
-#define K2G_DEV_MMCHS0 0x000b
-#define K2G_DEV_MMCHS1 0x000c
-#define K2G_DEV_GPMC0 0x000d
-#define K2G_DEV_ELM0 0x000e
-#define K2G_DEV_SPI0 0x0010
-#define K2G_DEV_SPI1 0x0011
-#define K2G_DEV_SPI2 0x0012
-#define K2G_DEV_SPI3 0x0013
-#define K2G_DEV_ICSS0 0x0014
-#define K2G_DEV_ICSS1 0x0015
-#define K2G_DEV_USB0 0x0016
-#define K2G_DEV_USB1 0x0017
-#define K2G_DEV_NSS0 0x0018
-#define K2G_DEV_PCIE0 0x0019
-#define K2G_DEV_GPIO0 0x001b
-#define K2G_DEV_GPIO1 0x001c
-#define K2G_DEV_TIMER64_0 0x001d
-#define K2G_DEV_TIMER64_1 0x001e
-#define K2G_DEV_TIMER64_2 0x001f
-#define K2G_DEV_TIMER64_3 0x0020
-#define K2G_DEV_TIMER64_4 0x0021
-#define K2G_DEV_TIMER64_5 0x0022
-#define K2G_DEV_TIMER64_6 0x0023
-#define K2G_DEV_MSGMGR0 0x0025
-#define K2G_DEV_BOOTCFG0 0x0026
-#define K2G_DEV_ARM_BOOTROM0 0x0027
-#define K2G_DEV_DSP_BOOTROM0 0x0029
-#define K2G_DEV_DEBUGSS0 0x002b
-#define K2G_DEV_UART0 0x002c
-#define K2G_DEV_UART1 0x002d
-#define K2G_DEV_UART2 0x002e
-#define K2G_DEV_EHRPWM0 0x002f
-#define K2G_DEV_EHRPWM1 0x0030
-#define K2G_DEV_EHRPWM2 0x0031
-#define K2G_DEV_EHRPWM3 0x0032
-#define K2G_DEV_EHRPWM4 0x0033
-#define K2G_DEV_EHRPWM5 0x0034
-#define K2G_DEV_EQEP0 0x0035
-#define K2G_DEV_EQEP1 0x0036
-#define K2G_DEV_EQEP2 0x0037
-#define K2G_DEV_ECAP0 0x0038
-#define K2G_DEV_ECAP1 0x0039
-#define K2G_DEV_I2C0 0x003a
-#define K2G_DEV_I2C1 0x003b
-#define K2G_DEV_I2C2 0x003c
-#define K2G_DEV_EDMA0 0x003f
-#define K2G_DEV_SEMAPHORE0 0x0040
-#define K2G_DEV_INTC0 0x0041
-#define K2G_DEV_GIC0 0x0042
-#define K2G_DEV_QSPI0 0x0043
-#define K2G_DEV_ARM_64B_COUNTER0 0x0044
-#define K2G_DEV_TETRIS0 0x0045
-#define K2G_DEV_CGEM0 0x0046
-#define K2G_DEV_MSMC0 0x0047
-#define K2G_DEV_CBASS0 0x0049
-#define K2G_DEV_BOARD0 0x004c
-#define K2G_DEV_EDMA1 0x004f
-
-#endif
diff --git a/include/dt-bindings/memory/mt8173-larb-port.h b/include/dt-bindings/memory/mt8173-larb-port.h
index 5fef5d1f8f82..111b4b0ec85a 100644
--- a/include/dt-bindings/memory/mt8173-larb-port.h
+++ b/include/dt-bindings/memory/mt8173-larb-port.h
@@ -15,10 +15,6 @@
#define __DTS_IOMMU_PORT_MT8173_H
#define MTK_M4U_ID(larb, port) (((larb) << 5) | (port))
-/* Local arbiter ID */
-#define MTK_M4U_TO_LARB(id) (((id) >> 5) & 0x7)
-/* PortID within the local arbiter */
-#define MTK_M4U_TO_PORT(id) ((id) & 0x1f)
#define M4U_LARB0_ID 0
#define M4U_LARB1_ID 1
diff --git a/include/dt-bindings/mfd/stm32h7-rcc.h b/include/dt-bindings/mfd/stm32h7-rcc.h
new file mode 100644
index 000000000000..461a8e04453a
--- /dev/null
+++ b/include/dt-bindings/mfd/stm32h7-rcc.h
@@ -0,0 +1,136 @@
+/*
+ * This header provides constants for the STM32H7 RCC IP
+ */
+
+#ifndef _DT_BINDINGS_MFD_STM32H7_RCC_H
+#define _DT_BINDINGS_MFD_STM32H7_RCC_H
+
+/* AHB3 */
+#define STM32H7_RCC_AHB3_MDMA 0
+#define STM32H7_RCC_AHB3_DMA2D 4
+#define STM32H7_RCC_AHB3_JPGDEC 5
+#define STM32H7_RCC_AHB3_FMC 12
+#define STM32H7_RCC_AHB3_QUADSPI 14
+#define STM32H7_RCC_AHB3_SDMMC1 16
+#define STM32H7_RCC_AHB3_CPU 31
+
+#define STM32H7_AHB3_RESET(bit) (STM32H7_RCC_AHB3_##bit + (0x7C * 8))
+
+/* AHB1 */
+#define STM32H7_RCC_AHB1_DMA1 0
+#define STM32H7_RCC_AHB1_DMA2 1
+#define STM32H7_RCC_AHB1_ADC12 5
+#define STM32H7_RCC_AHB1_ART 14
+#define STM32H7_RCC_AHB1_ETH1MAC 15
+#define STM32H7_RCC_AHB1_USB1OTG 25
+#define STM32H7_RCC_AHB1_USB2OTG 27
+
+#define STM32H7_AHB1_RESET(bit) (STM32H7_RCC_AHB1_##bit + (0x80 * 8))
+
+/* AHB2 */
+#define STM32H7_RCC_AHB2_CAMITF 0
+#define STM32H7_RCC_AHB2_CRYPT 4
+#define STM32H7_RCC_AHB2_HASH 5
+#define STM32H7_RCC_AHB2_RNG 6
+#define STM32H7_RCC_AHB2_SDMMC2 9
+
+#define STM32H7_AHB2_RESET(bit) (STM32H7_RCC_AHB2_##bit + (0x84 * 8))
+
+/* AHB4 */
+#define STM32H7_RCC_AHB4_GPIOA 0
+#define STM32H7_RCC_AHB4_GPIOB 1
+#define STM32H7_RCC_AHB4_GPIOC 2
+#define STM32H7_RCC_AHB4_GPIOD 3
+#define STM32H7_RCC_AHB4_GPIOE 4
+#define STM32H7_RCC_AHB4_GPIOF 5
+#define STM32H7_RCC_AHB4_GPIOG 6
+#define STM32H7_RCC_AHB4_GPIOH 7
+#define STM32H7_RCC_AHB4_GPIOI 8
+#define STM32H7_RCC_AHB4_GPIOJ 9
+#define STM32H7_RCC_AHB4_GPIOK 10
+#define STM32H7_RCC_AHB4_CRC 19
+#define STM32H7_RCC_AHB4_BDMA 21
+#define STM32H7_RCC_AHB4_ADC3 24
+#define STM32H7_RCC_AHB4_HSEM 25
+
+#define STM32H7_AHB4_RESET(bit) (STM32H7_RCC_AHB4_##bit + (0x88 * 8))
+
+/* APB3 */
+#define STM32H7_RCC_APB3_LTDC 3
+#define STM32H7_RCC_APB3_DSI 4
+
+#define STM32H7_APB3_RESET(bit) (STM32H7_RCC_APB3_##bit + (0x8C * 8))
+
+/* APB1L */
+#define STM32H7_RCC_APB1L_TIM2 0
+#define STM32H7_RCC_APB1L_TIM3 1
+#define STM32H7_RCC_APB1L_TIM4 2
+#define STM32H7_RCC_APB1L_TIM5 3
+#define STM32H7_RCC_APB1L_TIM6 4
+#define STM32H7_RCC_APB1L_TIM7 5
+#define STM32H7_RCC_APB1L_TIM12 6
+#define STM32H7_RCC_APB1L_TIM13 7
+#define STM32H7_RCC_APB1L_TIM14 8
+#define STM32H7_RCC_APB1L_LPTIM1 9
+#define STM32H7_RCC_APB1L_SPI2 14
+#define STM32H7_RCC_APB1L_SPI3 15
+#define STM32H7_RCC_APB1L_SPDIF_RX 16
+#define STM32H7_RCC_APB1L_USART2 17
+#define STM32H7_RCC_APB1L_USART3 18
+#define STM32H7_RCC_APB1L_UART4 19
+#define STM32H7_RCC_APB1L_UART5 20
+#define STM32H7_RCC_APB1L_I2C1 21
+#define STM32H7_RCC_APB1L_I2C2 22
+#define STM32H7_RCC_APB1L_I2C3 23
+#define STM32H7_RCC_APB1L_HDMICEC 27
+#define STM32H7_RCC_APB1L_DAC12 29
+#define STM32H7_RCC_APB1L_USART7 30
+#define STM32H7_RCC_APB1L_USART8 31
+
+#define STM32H7_APB1L_RESET(bit) (STM32H7_RCC_APB1L_##bit + (0x90 * 8))
+
+/* APB1H */
+#define STM32H7_RCC_APB1H_CRS 1
+#define STM32H7_RCC_APB1H_SWP 2
+#define STM32H7_RCC_APB1H_OPAMP 4
+#define STM32H7_RCC_APB1H_MDIOS 5
+#define STM32H7_RCC_APB1H_FDCAN 8
+
+#define STM32H7_APB1H_RESET(bit) (STM32H7_RCC_APB1H_##bit + (0x94 * 8))
+
+/* APB2 */
+#define STM32H7_RCC_APB2_TIM1 0
+#define STM32H7_RCC_APB2_TIM8 1
+#define STM32H7_RCC_APB2_USART1 4
+#define STM32H7_RCC_APB2_USART6 5
+#define STM32H7_RCC_APB2_SPI1 12
+#define STM32H7_RCC_APB2_SPI4 13
+#define STM32H7_RCC_APB2_TIM15 16
+#define STM32H7_RCC_APB2_TIM16 17
+#define STM32H7_RCC_APB2_TIM17 18
+#define STM32H7_RCC_APB2_SPI5 20
+#define STM32H7_RCC_APB2_SAI1 22
+#define STM32H7_RCC_APB2_SAI2 23
+#define STM32H7_RCC_APB2_SAI3 24
+#define STM32H7_RCC_APB2_DFSDM1 28
+#define STM32H7_RCC_APB2_HRTIM 29
+
+#define STM32H7_APB2_RESET(bit) (STM32H7_RCC_APB2_##bit + (0x98 * 8))
+
+/* APB4 */
+#define STM32H7_RCC_APB4_SYSCFG 1
+#define STM32H7_RCC_APB4_LPUART1 3
+#define STM32H7_RCC_APB4_SPI6 5
+#define STM32H7_RCC_APB4_I2C4 7
+#define STM32H7_RCC_APB4_LPTIM2 9
+#define STM32H7_RCC_APB4_LPTIM3 10
+#define STM32H7_RCC_APB4_LPTIM4 11
+#define STM32H7_RCC_APB4_LPTIM5 12
+#define STM32H7_RCC_APB4_COMP12 14
+#define STM32H7_RCC_APB4_VREF 15
+#define STM32H7_RCC_APB4_SAI4 21
+#define STM32H7_RCC_APB4_TMPSENS 26
+
+#define STM32H7_APB4_RESET(bit) (STM32H7_RCC_APB4_##bit + (0x9C * 8))
+
+#endif /* _DT_BINDINGS_MFD_STM32H7_RCC_H */
diff --git a/include/dt-bindings/mips/lantiq_rcu_gphy.h b/include/dt-bindings/mips/lantiq_rcu_gphy.h
new file mode 100644
index 000000000000..fa1a63773342
--- /dev/null
+++ b/include/dt-bindings/mips/lantiq_rcu_gphy.h
@@ -0,0 +1,15 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Copyright (C) 2016 Martin Blumenstingl <[email protected]>
+ * Copyright (C) 2017 Hauke Mehrtens <[email protected]>
+ */
+#ifndef _DT_BINDINGS_MIPS_LANTIQ_RCU_GPHY_H
+#define _DT_BINDINGS_MIPS_LANTIQ_RCU_GPHY_H
+
+#define GPHY_MODE_GE 1
+#define GPHY_MODE_FE 2
+
+#endif /* _DT_BINDINGS_MIPS_LANTIQ_RCU_GPHY_H */
diff --git a/include/dt-bindings/pinctrl/dra.h b/include/dt-bindings/pinctrl/dra.h
index 5c75e80915fc..18ec5df5a581 100644
--- a/include/dt-bindings/pinctrl/dra.h
+++ b/include/dt-bindings/pinctrl/dra.h
@@ -73,5 +73,8 @@
*/
#define DRA7XX_CORE_IOPAD(pa, val) (((pa) & 0xffff) - 0x3400) (val)
+/* DRA7 IODELAY configuration parameters */
+#define A_DELAY_PS(val) ((val) & 0xffff)
+#define G_DELAY_PS(val) ((val) & 0xffff)
#endif
diff --git a/include/dt-bindings/power/mt7622-power.h b/include/dt-bindings/power/mt7622-power.h
new file mode 100644
index 000000000000..1b639269790c
--- /dev/null
+++ b/include/dt-bindings/power/mt7622-power.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2017 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
+#ifndef _DT_BINDINGS_POWER_MT7622_POWER_H
+#define _DT_BINDINGS_POWER_MT7622_POWER_H
+
+#define MT7622_POWER_DOMAIN_ETHSYS 0
+#define MT7622_POWER_DOMAIN_HIF0 1
+#define MT7622_POWER_DOMAIN_HIF1 2
+#define MT7622_POWER_DOMAIN_WB 3
+
+#endif /* _DT_BINDINGS_POWER_MT7622_POWER_H */
diff --git a/include/dt-bindings/power/r8a77995-sysc.h b/include/dt-bindings/power/r8a77995-sysc.h
new file mode 100644
index 000000000000..09d0ed575b73
--- /dev/null
+++ b/include/dt-bindings/power/r8a77995-sysc.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2017 Glider bvba
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+#ifndef __DT_BINDINGS_POWER_R8A77995_SYSC_H__
+#define __DT_BINDINGS_POWER_R8A77995_SYSC_H__
+
+/*
+ * These power domain indices match the numbers of the interrupt bits
+ * representing the power areas in the various Interrupt Registers
+ * (e.g. SYSCISR, Interrupt Status Register)
+ */
+
+#define R8A77995_PD_CA53_CPU0 5
+#define R8A77995_PD_CA53_SCU 21
+
+/* Always-on power area */
+#define R8A77995_PD_ALWAYS_ON 32
+
+#endif /* __DT_BINDINGS_POWER_R8A77995_SYSC_H__ */
diff --git a/include/dt-bindings/power/rk3366-power.h b/include/dt-bindings/power/rk3366-power.h
new file mode 100644
index 000000000000..223a3dce049a
--- /dev/null
+++ b/include/dt-bindings/power/rk3366-power.h
@@ -0,0 +1,24 @@
+#ifndef __DT_BINDINGS_POWER_RK3366_POWER_H__
+#define __DT_BINDINGS_POWER_RK3366_POWER_H__
+
+/* VD_CORE */
+#define RK3366_PD_A53_0 0
+#define RK3366_PD_A53_1 1
+#define RK3366_PD_A53_2 2
+#define RK3366_PD_A53_3 3
+
+/* VD_LOGIC */
+#define RK3366_PD_BUS 4
+#define RK3366_PD_PERI 5
+#define RK3366_PD_VIO 6
+#define RK3366_PD_VIDEO 7
+#define RK3366_PD_RKVDEC 8
+#define RK3366_PD_WIFIBT 9
+#define RK3366_PD_VPU 10
+#define RK3366_PD_GPU 11
+#define RK3366_PD_ALIVE 12
+
+/* VD_PMU */
+#define RK3366_PD_PMU 13
+
+#endif
diff --git a/include/dt-bindings/reset/amlogic,meson8b-clkc-reset.h b/include/dt-bindings/reset/amlogic,meson8b-clkc-reset.h
new file mode 100644
index 000000000000..1f1b56e57346
--- /dev/null
+++ b/include/dt-bindings/reset/amlogic,meson8b-clkc-reset.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2017 Martin Blumenstingl <[email protected]>.
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+#ifndef _DT_BINDINGS_AMLOGIC_MESON8B_CLKC_RESET_H
+#define _DT_BINDINGS_AMLOGIC_MESON8B_CLKC_RESET_H
+
+#define CLKC_RESET_L2_CACHE_SOFT_RESET 0
+#define CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET 1
+#define CLKC_RESET_SCU_SOFT_RESET 2
+#define CLKC_RESET_CPU0_SOFT_RESET 3
+#define CLKC_RESET_CPU1_SOFT_RESET 4
+#define CLKC_RESET_CPU2_SOFT_RESET 5
+#define CLKC_RESET_CPU3_SOFT_RESET 6
+#define CLKC_RESET_A5_GLOBAL_RESET 7
+#define CLKC_RESET_A5_AXI_SOFT_RESET 8
+#define CLKC_RESET_A5_ABP_SOFT_RESET 9
+#define CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET 10
+#define CLKC_RESET_VID_CLK_CNTL_SOFT_RESET 11
+#define CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST 12
+#define CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE 13
+#define CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST 14
+#define CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE 15
+
+#endif /* _DT_BINDINGS_AMLOGIC_MESON8B_CLKC_RESET_H */
diff --git a/include/dt-bindings/reset/snps,hsdk-reset.h b/include/dt-bindings/reset/snps,hsdk-reset.h
new file mode 100644
index 000000000000..e1a643e4bc91
--- /dev/null
+++ b/include/dt-bindings/reset/snps,hsdk-reset.h
@@ -0,0 +1,17 @@
+/**
+ * This header provides index for the HSDK reset controller.
+ */
+#ifndef _DT_BINDINGS_RESET_CONTROLLER_SNPS_HSDK
+#define _DT_BINDINGS_RESET_CONTROLLER_SNPS_HSDK
+
+#define HSDK_APB_RESET 0
+#define HSDK_AXI_RESET 1
+#define HSDK_ETH_RESET 2
+#define HSDK_USB_RESET 3
+#define HSDK_SDIO_RESET 4
+#define HSDK_HDMI_RESET 5
+#define HSDK_GFX_RESET 6
+#define HSDK_DMAC_RESET 7
+#define HSDK_EBI_RESET 8
+
+#endif /*_DT_BINDINGS_RESET_CONTROLLER_SNPS_HSDK*/
diff --git a/include/dt-bindings/reset/sun4i-a10-ccu.h b/include/dt-bindings/reset/sun4i-a10-ccu.h
new file mode 100644
index 000000000000..5f4480bedc8a
--- /dev/null
+++ b/include/dt-bindings/reset/sun4i-a10-ccu.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 Priit Laes <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _DT_BINDINGS_RST_SUN4I_A10_H
+#define _DT_BINDINGS_RST_SUN4I_A10_H
+
+#define RST_USB_PHY0 1
+#define RST_USB_PHY1 2
+#define RST_USB_PHY2 3
+#define RST_GPS 4
+#define RST_DE_BE0 5
+#define RST_DE_BE1 6
+#define RST_DE_FE0 7
+#define RST_DE_FE1 8
+#define RST_DE_MP 9
+#define RST_TVE0 10
+#define RST_TCON0 11
+#define RST_TVE1 12
+#define RST_TCON1 13
+#define RST_CSI0 14
+#define RST_CSI1 15
+#define RST_VE 16
+#define RST_ACE 17
+#define RST_LVDS 18
+#define RST_GPU 19
+#define RST_HDMI_H 20
+#define RST_HDMI_SYS 21
+#define RST_HDMI_AUDIO_DMA 22
+
+#endif /* DT_BINDINGS_RST_SUN4I_A10_H */
diff --git a/include/dt-bindings/reset/sun8i-r40-ccu.h b/include/dt-bindings/reset/sun8i-r40-ccu.h
new file mode 100644
index 000000000000..c5ebcf6672e4
--- /dev/null
+++ b/include/dt-bindings/reset/sun8i-r40-ccu.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2017 Icenowy Zheng <[email protected]>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This file is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _DT_BINDINGS_RST_SUN8I_R40_H_
+#define _DT_BINDINGS_RST_SUN8I_R40_H_
+
+#define RST_USB_PHY0 0
+#define RST_USB_PHY1 1
+#define RST_USB_PHY2 2
+
+#define RST_DRAM 3
+#define RST_MBUS 4
+
+#define RST_BUS_MIPI_DSI 5
+#define RST_BUS_CE 6
+#define RST_BUS_DMA 7
+#define RST_BUS_MMC0 8
+#define RST_BUS_MMC1 9
+#define RST_BUS_MMC2 10
+#define RST_BUS_MMC3 11
+#define RST_BUS_NAND 12
+#define RST_BUS_DRAM 13
+#define RST_BUS_EMAC 14
+#define RST_BUS_TS 15
+#define RST_BUS_HSTIMER 16
+#define RST_BUS_SPI0 17
+#define RST_BUS_SPI1 18
+#define RST_BUS_SPI2 19
+#define RST_BUS_SPI3 20
+#define RST_BUS_SATA 21
+#define RST_BUS_OTG 22
+#define RST_BUS_EHCI0 23
+#define RST_BUS_EHCI1 24
+#define RST_BUS_EHCI2 25
+#define RST_BUS_OHCI0 26
+#define RST_BUS_OHCI1 27
+#define RST_BUS_OHCI2 28
+#define RST_BUS_VE 29
+#define RST_BUS_MP 30
+#define RST_BUS_DEINTERLACE 31
+#define RST_BUS_CSI0 32
+#define RST_BUS_CSI1 33
+#define RST_BUS_HDMI0 34
+#define RST_BUS_HDMI1 35
+#define RST_BUS_DE 36
+#define RST_BUS_TVE0 37
+#define RST_BUS_TVE1 38
+#define RST_BUS_TVE_TOP 39
+#define RST_BUS_GMAC 40
+#define RST_BUS_GPU 41
+#define RST_BUS_TVD0 42
+#define RST_BUS_TVD1 43
+#define RST_BUS_TVD2 44
+#define RST_BUS_TVD3 45
+#define RST_BUS_TVD_TOP 46
+#define RST_BUS_TCON_LCD0 47
+#define RST_BUS_TCON_LCD1 48
+#define RST_BUS_TCON_TV0 49
+#define RST_BUS_TCON_TV1 50
+#define RST_BUS_TCON_TOP 51
+#define RST_BUS_DBG 52
+#define RST_BUS_LVDS 53
+#define RST_BUS_CODEC 54
+#define RST_BUS_SPDIF 55
+#define RST_BUS_AC97 56
+#define RST_BUS_IR0 57
+#define RST_BUS_IR1 58
+#define RST_BUS_THS 59
+#define RST_BUS_KEYPAD 60
+#define RST_BUS_I2S0 61
+#define RST_BUS_I2S1 62
+#define RST_BUS_I2S2 63
+#define RST_BUS_I2C0 64
+#define RST_BUS_I2C1 65
+#define RST_BUS_I2C2 66
+#define RST_BUS_I2C3 67
+#define RST_BUS_CAN 68
+#define RST_BUS_SCR 69
+#define RST_BUS_PS20 70
+#define RST_BUS_PS21 71
+#define RST_BUS_I2C4 72
+#define RST_BUS_UART0 73
+#define RST_BUS_UART1 74
+#define RST_BUS_UART2 75
+#define RST_BUS_UART3 76
+#define RST_BUS_UART4 77
+#define RST_BUS_UART5 78
+#define RST_BUS_UART6 79
+#define RST_BUS_UART7 80
+
+#endif /* _DT_BINDINGS_RST_SUN8I_R40_H_ */
diff --git a/include/linux/audit.h b/include/linux/audit.h
index 2150bdccfbab..cb708eb8accc 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -314,11 +314,7 @@ void audit_core_dumps(long signr);
static inline void audit_seccomp(unsigned long syscall, long signr, int code)
{
- if (!audit_enabled)
- return;
-
- /* Force a record to be reported if a signal was delivered. */
- if (signr || unlikely(!audit_dummy_context()))
+ if (audit_enabled && unlikely(!audit_dummy_context()))
__audit_seccomp(syscall, signr, code);
}
@@ -351,7 +347,7 @@ extern int __audit_socketcall(int nargs, unsigned long *args);
extern int __audit_sockaddr(int len, void *addr);
extern void __audit_fd_pair(int fd1, int fd2);
extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr);
-extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);
+extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout);
extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification);
extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm,
@@ -412,7 +408,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
if (unlikely(!audit_dummy_context()))
__audit_mq_open(oflag, mode, attr);
}
-static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout)
+static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout)
{
if (unlikely(!audit_dummy_context()))
__audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout);
@@ -549,7 +545,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
{ }
static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len,
unsigned int msg_prio,
- const struct timespec *abs_timeout)
+ const struct timespec64 *abs_timeout)
{ }
static inline void audit_mq_notify(mqd_t mqdes,
const struct sigevent *notification)
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
index fb44d6180ca0..18d05b5491f3 100644
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -131,7 +131,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm,
int executable_stack);
extern int transfer_args_to_stack(struct linux_binprm *bprm,
unsigned long *sp_location);
-extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);
+extern int bprm_change_interp(const char *interp, struct linux_binprm *bprm);
extern int copy_strings_kernel(int argc, const char *const *argv,
struct linux_binprm *bprm);
extern int prepare_bprm_creds(struct linux_binprm *bprm);
diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h
index 8b9d6fff002d..f2deb71958b2 100644
--- a/include/linux/bitfield.h
+++ b/include/linux/bitfield.h
@@ -92,7 +92,7 @@
/**
* FIELD_GET() - extract a bitfield element
* @_mask: shifted mask defining the field's length and position
- * @_reg: 32bit value of entire bitfield
+ * @_reg: value of entire bitfield
*
* FIELD_GET() extracts the field specified by @_mask from the
* bitfield passed in as @_reg by masking and shifting it down.
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 460294bb0fa5..02fa42d24b52 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -551,6 +551,7 @@ struct request_queue {
int node;
#ifdef CONFIG_BLK_DEV_IO_TRACE
struct blk_trace *blk_trace;
+ struct mutex blk_trace_mutex;
#endif
/*
* for flush operations
diff --git a/include/linux/capability.h b/include/linux/capability.h
index 6ffb67e10c06..b52e278e4744 100644
--- a/include/linux/capability.h
+++ b/include/linux/capability.h
@@ -248,4 +248,6 @@ extern bool ptracer_capable(struct task_struct *tsk, struct user_namespace *ns);
/* audit system wants to get cap info from files as well */
extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps);
+extern int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size);
+
#endif /* !_LINUX_CAPABILITY_H */
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
index edf5b04b918a..b422170b791a 100644
--- a/include/linux/ceph/ceph_fs.h
+++ b/include/linux/ceph/ceph_fs.h
@@ -167,6 +167,8 @@ struct ceph_mon_request_header {
struct ceph_mon_statfs {
struct ceph_mon_request_header monhdr;
struct ceph_fsid fsid;
+ __u8 contains_data_pool;
+ __le64 data_pool;
} __attribute__ ((packed));
struct ceph_statfs {
@@ -669,7 +671,9 @@ enum {
extern const char *ceph_cap_op_name(int op);
/* flags field in client cap messages (version >= 10) */
-#define CEPH_CLIENT_CAPS_SYNC (0x1)
+#define CEPH_CLIENT_CAPS_SYNC (1<<0)
+#define CEPH_CLIENT_CAPS_NO_CAPSNAP (1<<1)
+#define CEPH_CLIENT_CAPS_PENDING_CAPSNAP (1<<2);
/*
* caps message, used for capability callbacks, acks, requests, etc.
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h
index 8a79587e1317..4c846aabd9f6 100644
--- a/include/linux/ceph/libceph.h
+++ b/include/linux/ceph/libceph.h
@@ -84,17 +84,6 @@ struct ceph_options {
#define CEPH_AUTH_NAME_DEFAULT "guest"
-/*
- * Delay telling the MDS we no longer want caps, in case we reopen
- * the file. Delay a minimum amount of time, even if we send a cap
- * message for some other reason. Otherwise, take the oppotunity to
- * update the mds to avoid sending another message later.
- */
-#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
-#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
-
-#define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4)
-
/* mount state */
enum {
CEPH_MOUNT_MOUNTING,
diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
index d5a3ecea578d..0fa990bf867a 100644
--- a/include/linux/ceph/mon_client.h
+++ b/include/linux/ceph/mon_client.h
@@ -133,8 +133,8 @@ void ceph_monc_renew_subs(struct ceph_mon_client *monc);
extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
unsigned long timeout);
-extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
- struct ceph_statfs *buf);
+int ceph_monc_do_statfs(struct ceph_mon_client *monc, u64 data_pool,
+ struct ceph_statfs *buf);
int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
u64 *newest);
diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h
index b8281feda9c7..01408841c9c4 100644
--- a/include/linux/ceph/rados.h
+++ b/include/linux/ceph/rados.h
@@ -230,7 +230,6 @@ extern const char *ceph_osd_state_name(int s);
\
/* fancy write */ \
f(APPEND, __CEPH_OSD_OP(WR, DATA, 6), "append") \
- f(STARTSYNC, __CEPH_OSD_OP(WR, DATA, 7), "startsync") \
f(SETTRUNC, __CEPH_OSD_OP(WR, DATA, 8), "settrunc") \
f(TRIMTRUNC, __CEPH_OSD_OP(WR, DATA, 9), "trimtrunc") \
\
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index c59c62571e4f..5100ec1b5d55 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -343,6 +343,7 @@ struct clk_hw *clk_hw_register_gate(struct device *dev, const char *name,
u8 clk_gate_flags, spinlock_t *lock);
void clk_unregister_gate(struct clk *clk);
void clk_hw_unregister_gate(struct clk_hw *hw);
+int clk_gate_is_enabled(struct clk_hw *hw);
struct clk_div_table {
unsigned int val;
@@ -565,6 +566,9 @@ struct clk_fractional_divider {
u8 nwidth;
u32 nmask;
u8 flags;
+ void (*approximation)(struct clk_hw *hw,
+ unsigned long rate, unsigned long *parent_rate,
+ unsigned long *m, unsigned long *n);
spinlock_t *lock;
};
diff --git a/include/linux/clk/at91_pmc.h b/include/linux/clk/at91_pmc.h
index 17f413bbbedf..6aca5ce8a99a 100644
--- a/include/linux/clk/at91_pmc.h
+++ b/include/linux/clk/at91_pmc.h
@@ -185,4 +185,29 @@
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
#define AT91_PMC_PCR_GCKEN (0x1 << 29) /* GCK Enable */
+#define AT91_PMC_AUDIO_PLL0 0x14c
+#define AT91_PMC_AUDIO_PLL_PLLEN (1 << 0)
+#define AT91_PMC_AUDIO_PLL_PADEN (1 << 1)
+#define AT91_PMC_AUDIO_PLL_PMCEN (1 << 2)
+#define AT91_PMC_AUDIO_PLL_RESETN (1 << 3)
+#define AT91_PMC_AUDIO_PLL_ND_OFFSET 8
+#define AT91_PMC_AUDIO_PLL_ND_MASK (0x7f << AT91_PMC_AUDIO_PLL_ND_OFFSET)
+#define AT91_PMC_AUDIO_PLL_ND(n) ((n) << AT91_PMC_AUDIO_PLL_ND_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPMC_OFFSET 16
+#define AT91_PMC_AUDIO_PLL_QDPMC_MASK (0x7f << AT91_PMC_AUDIO_PLL_QDPMC_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPMC(n) ((n) << AT91_PMC_AUDIO_PLL_QDPMC_OFFSET)
+
+#define AT91_PMC_AUDIO_PLL1 0x150
+#define AT91_PMC_AUDIO_PLL_FRACR_MASK 0x3fffff
+#define AT91_PMC_AUDIO_PLL_QDPAD_OFFSET 24
+#define AT91_PMC_AUDIO_PLL_QDPAD_MASK (0x7f << AT91_PMC_AUDIO_PLL_QDPAD_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPAD(n) ((n) << AT91_PMC_AUDIO_PLL_QDPAD_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPAD_DIV_OFFSET AT91_PMC_AUDIO_PLL_QDPAD_OFFSET
+#define AT91_PMC_AUDIO_PLL_QDPAD_DIV_MASK (0x3 << AT91_PMC_AUDIO_PLL_QDPAD_DIV_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPAD_DIV(n) ((n) << AT91_PMC_AUDIO_PLL_QDPAD_DIV_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_OFFSET 26
+#define AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MAX 0x1f
+#define AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MASK (AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_MAX << AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_OFFSET)
+#define AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV(n) ((n) << AT91_PMC_AUDIO_PLL_QDPAD_EXTDIV_OFFSET)
+
#endif
diff --git a/include/linux/compat.h b/include/linux/compat.h
index 3fc433303d7a..a5619de3437d 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -171,15 +171,6 @@ extern int get_compat_itimerspec64(struct itimerspec64 *its,
extern int put_compat_itimerspec64(const struct itimerspec64 *its,
struct compat_itimerspec __user *uits);
-/*
- * This function convert a timespec if necessary and returns a *user
- * space* pointer. If no conversion is necessary, it returns the
- * initial pointer. NULL is a legitimate argument and will always
- * output NULL.
- */
-extern int compat_convert_timespec(struct timespec __user **,
- const void __user *);
-
struct compat_iovec {
compat_uptr_t iov_base;
compat_size_t iov_len;
diff --git a/include/linux/cper.h b/include/linux/cper.h
index 4c671fc2081e..723e952fde0d 100644
--- a/include/linux/cper.h
+++ b/include/linux/cper.h
@@ -74,36 +74,36 @@ enum {
* Corrected Machine Check
*/
#define CPER_NOTIFY_CMC \
- UUID_LE(0x2DCE8BB1, 0xBDD7, 0x450e, 0xB9, 0xAD, 0x9C, 0xF4, \
- 0xEB, 0xD4, 0xF8, 0x90)
+ GUID_INIT(0x2DCE8BB1, 0xBDD7, 0x450e, 0xB9, 0xAD, 0x9C, 0xF4, \
+ 0xEB, 0xD4, 0xF8, 0x90)
/* Corrected Platform Error */
#define CPER_NOTIFY_CPE \
- UUID_LE(0x4E292F96, 0xD843, 0x4a55, 0xA8, 0xC2, 0xD4, 0x81, \
- 0xF2, 0x7E, 0xBE, 0xEE)
+ GUID_INIT(0x4E292F96, 0xD843, 0x4a55, 0xA8, 0xC2, 0xD4, 0x81, \
+ 0xF2, 0x7E, 0xBE, 0xEE)
/* Machine Check Exception */
#define CPER_NOTIFY_MCE \
- UUID_LE(0xE8F56FFE, 0x919C, 0x4cc5, 0xBA, 0x88, 0x65, 0xAB, \
- 0xE1, 0x49, 0x13, 0xBB)
+ GUID_INIT(0xE8F56FFE, 0x919C, 0x4cc5, 0xBA, 0x88, 0x65, 0xAB, \
+ 0xE1, 0x49, 0x13, 0xBB)
/* PCI Express Error */
#define CPER_NOTIFY_PCIE \
- UUID_LE(0xCF93C01F, 0x1A16, 0x4dfc, 0xB8, 0xBC, 0x9C, 0x4D, \
- 0xAF, 0x67, 0xC1, 0x04)
+ GUID_INIT(0xCF93C01F, 0x1A16, 0x4dfc, 0xB8, 0xBC, 0x9C, 0x4D, \
+ 0xAF, 0x67, 0xC1, 0x04)
/* INIT Record (for IPF) */
#define CPER_NOTIFY_INIT \
- UUID_LE(0xCC5263E8, 0x9308, 0x454a, 0x89, 0xD0, 0x34, 0x0B, \
- 0xD3, 0x9B, 0xC9, 0x8E)
+ GUID_INIT(0xCC5263E8, 0x9308, 0x454a, 0x89, 0xD0, 0x34, 0x0B, \
+ 0xD3, 0x9B, 0xC9, 0x8E)
/* Non-Maskable Interrupt */
#define CPER_NOTIFY_NMI \
- UUID_LE(0x5BAD89FF, 0xB7E6, 0x42c9, 0x81, 0x4A, 0xCF, 0x24, \
- 0x85, 0xD6, 0xE9, 0x8A)
+ GUID_INIT(0x5BAD89FF, 0xB7E6, 0x42c9, 0x81, 0x4A, 0xCF, 0x24, \
+ 0x85, 0xD6, 0xE9, 0x8A)
/* BOOT Error Record */
#define CPER_NOTIFY_BOOT \
- UUID_LE(0x3D61A466, 0xAB40, 0x409a, 0xA6, 0x98, 0xF3, 0x62, \
- 0xD4, 0x64, 0xB3, 0x8F)
+ GUID_INIT(0x3D61A466, 0xAB40, 0x409a, 0xA6, 0x98, 0xF3, 0x62, \
+ 0xD4, 0x64, 0xB3, 0x8F)
/* DMA Remapping Error */
#define CPER_NOTIFY_DMAR \
- UUID_LE(0x667DD791, 0xC6B3, 0x4c27, 0x8A, 0x6B, 0x0F, 0x8E, \
- 0x72, 0x2D, 0xEB, 0x41)
+ GUID_INIT(0x667DD791, 0xC6B3, 0x4c27, 0x8A, 0x6B, 0x0F, 0x8E, \
+ 0x72, 0x2D, 0xEB, 0x41)
/*
* Flags bits definitions for flags in struct cper_record_header
@@ -170,50 +170,50 @@ enum {
* Processor Generic
*/
#define CPER_SEC_PROC_GENERIC \
- UUID_LE(0x9876CCAD, 0x47B4, 0x4bdb, 0xB6, 0x5E, 0x16, 0xF1, \
- 0x93, 0xC4, 0xF3, 0xDB)
+ GUID_INIT(0x9876CCAD, 0x47B4, 0x4bdb, 0xB6, 0x5E, 0x16, 0xF1, \
+ 0x93, 0xC4, 0xF3, 0xDB)
/* Processor Specific: X86/X86_64 */
#define CPER_SEC_PROC_IA \
- UUID_LE(0xDC3EA0B0, 0xA144, 0x4797, 0xB9, 0x5B, 0x53, 0xFA, \
- 0x24, 0x2B, 0x6E, 0x1D)
+ GUID_INIT(0xDC3EA0B0, 0xA144, 0x4797, 0xB9, 0x5B, 0x53, 0xFA, \
+ 0x24, 0x2B, 0x6E, 0x1D)
/* Processor Specific: IA64 */
#define CPER_SEC_PROC_IPF \
- UUID_LE(0xE429FAF1, 0x3CB7, 0x11D4, 0x0B, 0xCA, 0x07, 0x00, \
- 0x80, 0xC7, 0x3C, 0x88, 0x81)
+ GUID_INIT(0xE429FAF1, 0x3CB7, 0x11D4, 0x0B, 0xCA, 0x07, 0x00, \
+ 0x80, 0xC7, 0x3C, 0x88, 0x81)
/* Processor Specific: ARM */
#define CPER_SEC_PROC_ARM \
- UUID_LE(0xE19E3D16, 0xBC11, 0x11E4, 0x9C, 0xAA, 0xC2, 0x05, \
- 0x1D, 0x5D, 0x46, 0xB0)
+ GUID_INIT(0xE19E3D16, 0xBC11, 0x11E4, 0x9C, 0xAA, 0xC2, 0x05, \
+ 0x1D, 0x5D, 0x46, 0xB0)
/* Platform Memory */
#define CPER_SEC_PLATFORM_MEM \
- UUID_LE(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83, \
- 0xED, 0x7C, 0x83, 0xB1)
+ GUID_INIT(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83, \
+ 0xED, 0x7C, 0x83, 0xB1)
#define CPER_SEC_PCIE \
- UUID_LE(0xD995E954, 0xBBC1, 0x430F, 0xAD, 0x91, 0xB4, 0x4D, \
- 0xCB, 0x3C, 0x6F, 0x35)
+ GUID_INIT(0xD995E954, 0xBBC1, 0x430F, 0xAD, 0x91, 0xB4, 0x4D, \
+ 0xCB, 0x3C, 0x6F, 0x35)
/* Firmware Error Record Reference */
#define CPER_SEC_FW_ERR_REC_REF \
- UUID_LE(0x81212A96, 0x09ED, 0x4996, 0x94, 0x71, 0x8D, 0x72, \
- 0x9C, 0x8E, 0x69, 0xED)
+ GUID_INIT(0x81212A96, 0x09ED, 0x4996, 0x94, 0x71, 0x8D, 0x72, \
+ 0x9C, 0x8E, 0x69, 0xED)
/* PCI/PCI-X Bus */
#define CPER_SEC_PCI_X_BUS \
- UUID_LE(0xC5753963, 0x3B84, 0x4095, 0xBF, 0x78, 0xED, 0xDA, \
- 0xD3, 0xF9, 0xC9, 0xDD)
+ GUID_INIT(0xC5753963, 0x3B84, 0x4095, 0xBF, 0x78, 0xED, 0xDA, \
+ 0xD3, 0xF9, 0xC9, 0xDD)
/* PCI Component/Device */
#define CPER_SEC_PCI_DEV \
- UUID_LE(0xEB5E4685, 0xCA66, 0x4769, 0xB6, 0xA2, 0x26, 0x06, \
- 0x8B, 0x00, 0x13, 0x26)
+ GUID_INIT(0xEB5E4685, 0xCA66, 0x4769, 0xB6, 0xA2, 0x26, 0x06, \
+ 0x8B, 0x00, 0x13, 0x26)
#define CPER_SEC_DMAR_GENERIC \
- UUID_LE(0x5B51FEF7, 0xC79D, 0x4434, 0x8F, 0x1B, 0xAA, 0x62, \
- 0xDE, 0x3E, 0x2C, 0x64)
+ GUID_INIT(0x5B51FEF7, 0xC79D, 0x4434, 0x8F, 0x1B, 0xAA, 0x62, \
+ 0xDE, 0x3E, 0x2C, 0x64)
/* Intel VT for Directed I/O specific DMAr */
#define CPER_SEC_DMAR_VT \
- UUID_LE(0x71761D37, 0x32B2, 0x45cd, 0xA7, 0xD0, 0xB0, 0xFE, \
- 0xDD, 0x93, 0xE8, 0xCF)
+ GUID_INIT(0x71761D37, 0x32B2, 0x45cd, 0xA7, 0xD0, 0xB0, 0xFE, \
+ 0xDD, 0x93, 0xE8, 0xCF)
/* IOMMU specific DMAr */
#define CPER_SEC_DMAR_IOMMU \
- UUID_LE(0x036F84E1, 0x7F37, 0x428c, 0xA7, 0x9E, 0x57, 0x5F, \
- 0xDF, 0xAA, 0x84, 0xEC)
+ GUID_INIT(0x036F84E1, 0x7F37, 0x428c, 0xA7, 0x9E, 0x57, 0x5F, \
+ 0xDF, 0xAA, 0x84, 0xEC)
#define CPER_PROC_VALID_TYPE 0x0001
#define CPER_PROC_VALID_ISA 0x0002
@@ -290,10 +290,10 @@ struct cper_record_header {
__u32 validation_bits;
__u32 record_length;
__u64 timestamp;
- uuid_le platform_id;
- uuid_le partition_id;
- uuid_le creator_id;
- uuid_le notification_type;
+ guid_t platform_id;
+ guid_t partition_id;
+ guid_t creator_id;
+ guid_t notification_type;
__u64 record_id;
__u32 flags;
__u64 persistence_information;
@@ -309,8 +309,8 @@ struct cper_section_descriptor {
__u8 validation_bits;
__u8 reserved; /* must be zero */
__u32 flags;
- uuid_le section_type;
- uuid_le fru_id;
+ guid_t section_type;
+ guid_t fru_id;
__u32 section_severity;
__u8 fru_text[20];
};
@@ -343,7 +343,7 @@ struct cper_sec_proc_ia {
/* IA32/X64 Processor Error Information Structure */
struct cper_ia_err_info {
- uuid_le err_type;
+ guid_t err_type;
__u64 validation_bits;
__u64 check_info;
__u64 target_id;
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index f24bfb2b9a2d..6d508767e144 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -3,8 +3,27 @@
#include <linux/types.h>
+/*
+ * CPU-up CPU-down
+ *
+ * BP AP BP AP
+ *
+ * OFFLINE OFFLINE
+ * | ^
+ * v |
+ * BRINGUP_CPU->AP_OFFLINE BRINGUP_CPU <- AP_IDLE_DEAD (idle thread/play_dead)
+ * | AP_OFFLINE
+ * v (IRQ-off) ,---------------^
+ * AP_ONLNE | (stop_machine)
+ * | TEARDOWN_CPU <- AP_ONLINE_IDLE
+ * | ^
+ * v |
+ * AP_ACTIVE AP_ACTIVE
+ */
+
enum cpuhp_state {
- CPUHP_OFFLINE,
+ CPUHP_INVALID = -1,
+ CPUHP_OFFLINE = 0,
CPUHP_CREATE_THREADS,
CPUHP_PERF_PREPARE,
CPUHP_PERF_X86_PREPARE,
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
index e74655d941b7..a1e6a33a4b03 100644
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -51,7 +51,9 @@ static inline void cpuset_dec(void)
extern int cpuset_init(void);
extern void cpuset_init_smp(void);
+extern void cpuset_force_rebuild(void);
extern void cpuset_update_active_cpus(void);
+extern void cpuset_wait_for_hotplug(void);
extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask);
extern void cpuset_cpus_allowed_fallback(struct task_struct *p);
extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
@@ -164,11 +166,15 @@ static inline bool cpusets_enabled(void) { return false; }
static inline int cpuset_init(void) { return 0; }
static inline void cpuset_init_smp(void) {}
+static inline void cpuset_force_rebuild(void) { }
+
static inline void cpuset_update_active_cpus(void)
{
partition_sched_domains(1, NULL, NULL);
}
+static inline void cpuset_wait_for_hotplug(void) { }
+
static inline void cpuset_cpus_allowed(struct task_struct *p,
struct cpumask *mask)
{
diff --git a/include/linux/dax.h b/include/linux/dax.h
index eb0bff6f1eab..122197124b9d 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -19,8 +19,6 @@ struct dax_operations {
/* copy_from_iter: required operation for fs-dax direct-i/o */
size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t,
struct iov_iter *);
- /* flush: optional driver-specific cache management after writes */
- void (*flush)(struct dax_device *, pgoff_t, void *, size_t);
};
extern struct attribute_group dax_attribute_group;
@@ -57,6 +55,7 @@ static inline void fs_put_dax(struct dax_device *dax_dev)
put_dax(dax_dev);
}
+struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev);
#else
static inline int bdev_dax_supported(struct super_block *sb, int blocksize)
{
@@ -71,6 +70,11 @@ static inline struct dax_device *fs_dax_get_by_host(const char *host)
static inline void fs_put_dax(struct dax_device *dax_dev)
{
}
+
+static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
+{
+ return NULL;
+}
#endif
int dax_read_lock(void);
@@ -84,8 +88,7 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
void **kaddr, pfn_t *pfn);
size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
size_t bytes, struct iov_iter *i);
-void dax_flush(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
- size_t size);
+void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
void dax_write_cache(struct dax_device *dax_dev, bool wc);
bool dax_write_cache_enabled(struct dax_device *dax_dev);
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index aae1cdb76851..ed1a7cf6923a 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -147,7 +147,7 @@ struct dentry_operations {
struct vfsmount *(*d_automount)(struct path *);
int (*d_manage)(const struct path *, bool);
struct dentry *(*d_real)(struct dentry *, const struct inode *,
- unsigned int);
+ unsigned int, unsigned int);
} ____cacheline_aligned;
/*
@@ -562,11 +562,15 @@ static inline struct dentry *d_backing_dentry(struct dentry *upper)
return upper;
}
+/* d_real() flags */
+#define D_REAL_UPPER 0x2 /* return upper dentry or NULL if non-upper */
+
/**
* d_real - Return the real dentry
* @dentry: the dentry to query
* @inode: inode to select the dentry from multiple layers (can be NULL)
- * @flags: open flags to control copy-up behavior
+ * @open_flags: open flags to control copy-up behavior
+ * @flags: flags to control what is returned by this function
*
* If dentry is on a union/overlay, then return the underlying, real dentry.
* Otherwise return the dentry itself.
@@ -575,10 +579,10 @@ static inline struct dentry *d_backing_dentry(struct dentry *upper)
*/
static inline struct dentry *d_real(struct dentry *dentry,
const struct inode *inode,
- unsigned int flags)
+ unsigned int open_flags, unsigned int flags)
{
if (unlikely(dentry->d_flags & DCACHE_OP_REAL))
- return dentry->d_op->d_real(dentry, inode, flags);
+ return dentry->d_op->d_real(dentry, inode, open_flags, flags);
else
return dentry;
}
@@ -593,7 +597,7 @@ static inline struct dentry *d_real(struct dentry *dentry,
static inline struct inode *d_real_inode(const struct dentry *dentry)
{
/* This usage of d_real() results in const dentry */
- return d_backing_inode(d_real((struct dentry *) dentry, NULL, 0));
+ return d_backing_inode(d_real((struct dentry *) dentry, NULL, 0, 0));
}
struct name_snapshot {
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index 4f2b3b2076c4..a5538433c927 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -134,8 +134,6 @@ typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff,
long nr_pages, void **kaddr, pfn_t *pfn);
typedef size_t (*dm_dax_copy_from_iter_fn)(struct dm_target *ti, pgoff_t pgoff,
void *addr, size_t bytes, struct iov_iter *i);
-typedef void (*dm_dax_flush_fn)(struct dm_target *ti, pgoff_t pgoff, void *addr,
- size_t size);
#define PAGE_SECTORS (PAGE_SIZE / 512)
void dm_error(const char *message);
@@ -186,7 +184,6 @@ struct target_type {
dm_io_hints_fn io_hints;
dm_dax_direct_access_fn direct_access;
dm_dax_copy_from_iter_fn dax_copy_from_iter;
- dm_dax_flush_fn dax_flush;
/* For internal device-mapper use. */
struct list_head list;
@@ -387,7 +384,7 @@ struct dm_arg {
* Validate the next argument, either returning it as *value or, if invalid,
* returning -EINVAL and setting *error.
*/
-int dm_read_arg(struct dm_arg *arg, struct dm_arg_set *arg_set,
+int dm_read_arg(const struct dm_arg *arg, struct dm_arg_set *arg_set,
unsigned *value, char **error);
/*
@@ -395,7 +392,7 @@ int dm_read_arg(struct dm_arg *arg, struct dm_arg_set *arg_set,
* arg->min and arg->max further arguments. Either return the size as
* *num_args or, if invalid, return -EINVAL and set *error.
*/
-int dm_read_arg_group(struct dm_arg *arg, struct dm_arg_set *arg_set,
+int dm_read_arg_group(const struct dm_arg *arg, struct dm_arg_set *arg_set,
unsigned *num_args, char **error);
/*
diff --git a/include/linux/device.h b/include/linux/device.h
index c6f27207dbe8..66fe271c2544 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -307,8 +307,6 @@ struct driver_attribute {
size_t count);
};
-#define DRIVER_ATTR(_name, _mode, _show, _store) \
- struct driver_attribute driver_attr_##_name = __ATTR(_name, _mode, _show, _store)
#define DRIVER_ATTR_RW(_name) \
struct driver_attribute driver_attr_##_name = __ATTR_RW(_name)
#define DRIVER_ATTR_RO(_name) \
@@ -838,7 +836,7 @@ struct dev_links_info {
* @driver_data: Private pointer for driver specific info.
* @links: Links to suppliers and consumers of this device.
* @power: For device power management.
- * See Documentation/power/admin-guide/devices.rst for details.
+ * See Documentation/driver-api/pm/devices.rst for details.
* @pm_domain: Provide callbacks that are executed during system suspend,
* hibernation, system resume and during runtime PM transitions
* along with subsystem-level and driver-level callbacks.
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 2189c79cde5d..29ce9815da87 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -550,26 +550,13 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
return dma_free_attrs(dev, size, cpu_addr, dma_handle, 0);
}
-static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,
- dma_addr_t *dma_handle, gfp_t gfp)
-{
- return dma_alloc_attrs(dev, size, dma_handle, gfp,
- DMA_ATTR_NON_CONSISTENT);
-}
-
-static inline void dma_free_noncoherent(struct device *dev, size_t size,
- void *cpu_addr, dma_addr_t dma_handle)
-{
- dma_free_attrs(dev, size, cpu_addr, dma_handle,
- DMA_ATTR_NON_CONSISTENT);
-}
-
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
{
- debug_dma_mapping_error(dev, dma_addr);
+ const struct dma_map_ops *ops = get_dma_ops(dev);
- if (get_dma_ops(dev)->mapping_error)
- return get_dma_ops(dev)->mapping_error(dev, dma_addr);
+ debug_dma_mapping_error(dev, dma_addr);
+ if (ops->mapping_error)
+ return ops->mapping_error(dev, dma_addr);
return 0;
}
@@ -720,10 +707,7 @@ static inline int dma_get_cache_alignment(void)
#endif
/* flags for the coherent memory api */
-#define DMA_MEMORY_MAP 0x01
-#define DMA_MEMORY_IO 0x02
-#define DMA_MEMORY_INCLUDES_CHILDREN 0x04
-#define DMA_MEMORY_EXCLUSIVE 0x08
+#define DMA_MEMORY_EXCLUSIVE 0x01
#ifdef CONFIG_HAVE_GENERIC_DMA_COHERENT
int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
@@ -736,7 +720,7 @@ static inline int
dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
dma_addr_t device_addr, size_t size, int flags)
{
- return 0;
+ return -ENOSYS;
}
static inline void
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 65905c3cb655..66f4a4e79f4b 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -47,10 +47,10 @@ typedef u16 efi_char16_t; /* UNICODE character */
typedef u64 efi_physical_addr_t;
typedef void *efi_handle_t;
-typedef uuid_le efi_guid_t;
+typedef guid_t efi_guid_t;
#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
- UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
+ GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
/*
* Generic EFI table header
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index b6feed6547ce..2a0c453d7235 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -186,6 +186,8 @@ struct f2fs_extent {
#define F2FS_NAME_LEN 255
#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs */
#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */
+#define CUR_ADDRS_PER_INODE(inode) (DEF_ADDRS_PER_INODE - \
+ get_extra_isize(inode))
#define DEF_NIDS_PER_INODE 5 /* Node IDs in an Inode */
#define ADDRS_PER_INODE(inode) addrs_per_inode(inode)
#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */
@@ -205,9 +207,7 @@ struct f2fs_extent {
#define F2FS_INLINE_DENTRY 0x04 /* file inline dentry flag */
#define F2FS_DATA_EXIST 0x08 /* file inline data exist flag */
#define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries */
-
-#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
- F2FS_INLINE_XATTR_ADDRS - 1))
+#define F2FS_EXTRA_ATTR 0x20 /* file having extra attribute */
struct f2fs_inode {
__le16 i_mode; /* file mode */
@@ -235,8 +235,16 @@ struct f2fs_inode {
struct f2fs_extent i_ext; /* caching a largest extent */
- __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */
-
+ union {
+ struct {
+ __le16 i_extra_isize; /* extra inode attribute size */
+ __le16 i_padding; /* padding */
+ __le32 i_projid; /* project id */
+ __le32 i_inode_checksum;/* inode meta checksum */
+ __le32 i_extra_end[0]; /* for attribute size calculation */
+ };
+ __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */
+ };
__le32 i_nid[DEF_NIDS_PER_INODE]; /* direct(2), indirect(2),
double_indirect(1) node id */
} __packed;
@@ -465,7 +473,7 @@ typedef __le32 f2fs_hash_t;
#define MAX_DIR_BUCKETS (1 << ((MAX_DIR_HASH_DEPTH / 2) - 1))
/*
- * space utilization of regular dentry and inline dentry
+ * space utilization of regular dentry and inline dentry (w/o extra reservation)
* regular dentry inline dentry
* bitmap 1 * 27 = 27 1 * 23 = 23
* reserved 1 * 3 = 3 1 * 7 = 7
@@ -501,24 +509,6 @@ struct f2fs_dentry_block {
__u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
} __packed;
-/* for inline dir */
-#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \
- ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
- BITS_PER_BYTE + 1))
-#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + \
- BITS_PER_BYTE - 1) / BITS_PER_BYTE)
-#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \
- ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
- NR_INLINE_DENTRY + INLINE_DENTRY_BITMAP_SIZE))
-
-/* inline directory entry structure */
-struct f2fs_inline_dentry {
- __u8 dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE];
- __u8 reserved[INLINE_RESERVED_SIZE];
- struct f2fs_dir_entry dentry[NR_INLINE_DENTRY];
- __u8 filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN];
-} __packed;
-
/* file types used in inode_info->flags */
enum {
F2FS_FT_UNKNOWN,
@@ -534,4 +524,6 @@ enum {
#define S_SHIFT 12
+#define F2FS_DEF_PROJID 0 /* default project ID */
+
#endif /* _LINUX_F2FS_FS_H */
diff --git a/include/linux/fb.h b/include/linux/fb.h
index a964d076b4dc..f4386b0ccf40 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -400,7 +400,7 @@ struct fb_tile_ops {
#endif /* CONFIG_FB_TILEBLITTING */
/* FBINFO_* = fb_info.flags bit flags */
-#define FBINFO_MODULE 0x0001 /* Low-level driver is a module */
+#define FBINFO_DEFAULT 0
#define FBINFO_HWACCEL_DISABLED 0x0002
/* When FBINFO_HWACCEL_DISABLED is set:
* Hardware acceleration is turned off. Software implementations
@@ -533,14 +533,6 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) {
return a;
}
-#ifdef MODULE
-#define FBINFO_DEFAULT FBINFO_MODULE
-#else
-#define FBINFO_DEFAULT 0
-#endif
-
-// This will go away
-#define FBINFO_FLAG_MODULE FBINFO_MODULE
#define FBINFO_FLAG_DEFAULT FBINFO_DEFAULT
/* This will go away
diff --git a/include/linux/fbcon.h b/include/linux/fbcon.h
new file mode 100644
index 000000000000..f68a7db14165
--- /dev/null
+++ b/include/linux/fbcon.h
@@ -0,0 +1,12 @@
+#ifndef _LINUX_FBCON_H
+#define _LINUX_FBCON_H
+
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE
+void __init fb_console_init(void);
+void __exit fb_console_exit(void);
+#else
+static inline void fb_console_init(void) {}
+static inline void fb_console_exit(void) {}
+#endif
+
+#endif /* _LINUX_FBCON_H */
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 2d0e6748e46e..13dab191a23e 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -148,8 +148,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
/* File was opened by fanotify and shouldn't generate fanotify events */
#define FMODE_NONOTIFY ((__force fmode_t)0x4000000)
-/* File is capable of returning -EAGAIN if AIO will block */
-#define FMODE_AIO_NOWAIT ((__force fmode_t)0x8000000)
+/* File is capable of returning -EAGAIN if I/O will block */
+#define FMODE_NOWAIT ((__force fmode_t)0x8000000)
/*
* Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector
@@ -403,7 +403,7 @@ struct address_space {
unsigned long flags; /* error bits */
spinlock_t private_lock; /* for use by the address_space */
gfp_t gfp_mask; /* implicit gfp mask for allocations */
- struct list_head private_list; /* ditto */
+ struct list_head private_list; /* for use by the address_space */
void *private_data; /* ditto */
errseq_t wb_err;
} __attribute__((aligned(sizeof(long)))) __randomize_layout;
@@ -1235,7 +1235,7 @@ static inline struct inode *file_inode(const struct file *f)
static inline struct dentry *file_dentry(const struct file *file)
{
- return d_real(file->f_path.dentry, file_inode(file), 0);
+ return d_real(file->f_path.dentry, file_inode(file), 0, 0);
}
static inline int locks_lock_file_wait(struct file *filp, struct file_lock *fl)
@@ -1271,6 +1271,33 @@ extern pid_t f_getown(struct file *filp);
extern int send_sigurg(struct fown_struct *fown);
/*
+ * sb->s_flags. Note that these mirror the equivalent MS_* flags where
+ * represented in both.
+ */
+#define SB_RDONLY 1 /* Mount read-only */
+#define SB_NOSUID 2 /* Ignore suid and sgid bits */
+#define SB_NODEV 4 /* Disallow access to device special files */
+#define SB_NOEXEC 8 /* Disallow program execution */
+#define SB_SYNCHRONOUS 16 /* Writes are synced at once */
+#define SB_MANDLOCK 64 /* Allow mandatory locks on an FS */
+#define SB_DIRSYNC 128 /* Directory modifications are synchronous */
+#define SB_NOATIME 1024 /* Do not update access times. */
+#define SB_NODIRATIME 2048 /* Do not update directory access times */
+#define SB_SILENT 32768
+#define SB_POSIXACL (1<<16) /* VFS does not apply the umask */
+#define SB_KERNMOUNT (1<<22) /* this is a kern_mount call */
+#define SB_I_VERSION (1<<23) /* Update inode I_version field */
+#define SB_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */
+
+/* These sb flags are internal to the kernel */
+#define SB_SUBMOUNT (1<<26)
+#define SB_NOREMOTELOCK (1<<27)
+#define SB_NOSEC (1<<28)
+#define SB_BORN (1<<29)
+#define SB_ACTIVE (1<<30)
+#define SB_NOUSER (1<<31)
+
+/*
* Umount options
*/
@@ -1754,13 +1781,10 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
struct iovec **ret_pointer);
extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *);
-extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *);
extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
unsigned long, loff_t *, rwf_t);
-extern ssize_t vfs_writev(struct file *, const struct iovec __user *,
- unsigned long, loff_t *, rwf_t);
extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
loff_t, size_t, unsigned int);
extern int vfs_clone_file_prep_inodes(struct inode *inode_in, loff_t pos_in,
@@ -1836,7 +1860,7 @@ struct super_operations {
* possible to override it selectively if you really wanted to with some
* ioctl() that is not currently implemented.
*
- * Exception: MS_RDONLY is always applied to the entire file system.
+ * Exception: SB_RDONLY is always applied to the entire file system.
*
* Unfortunately, it is possible to change a filesystems flags with it mounted
* with files in use. This means that all of the inodes will not have their
@@ -1845,19 +1869,20 @@ struct super_operations {
*/
#define __IS_FLG(inode, flg) ((inode)->i_sb->s_flags & (flg))
-#define IS_RDONLY(inode) ((inode)->i_sb->s_flags & MS_RDONLY)
-#define IS_SYNC(inode) (__IS_FLG(inode, MS_SYNCHRONOUS) || \
+static inline bool sb_rdonly(const struct super_block *sb) { return sb->s_flags & MS_RDONLY; }
+#define IS_RDONLY(inode) sb_rdonly((inode)->i_sb)
+#define IS_SYNC(inode) (__IS_FLG(inode, SB_SYNCHRONOUS) || \
((inode)->i_flags & S_SYNC))
-#define IS_DIRSYNC(inode) (__IS_FLG(inode, MS_SYNCHRONOUS|MS_DIRSYNC) || \
+#define IS_DIRSYNC(inode) (__IS_FLG(inode, SB_SYNCHRONOUS|SB_DIRSYNC) || \
((inode)->i_flags & (S_SYNC|S_DIRSYNC)))
-#define IS_MANDLOCK(inode) __IS_FLG(inode, MS_MANDLOCK)
-#define IS_NOATIME(inode) __IS_FLG(inode, MS_RDONLY|MS_NOATIME)
-#define IS_I_VERSION(inode) __IS_FLG(inode, MS_I_VERSION)
+#define IS_MANDLOCK(inode) __IS_FLG(inode, SB_MANDLOCK)
+#define IS_NOATIME(inode) __IS_FLG(inode, SB_RDONLY|SB_NOATIME)
+#define IS_I_VERSION(inode) __IS_FLG(inode, SB_I_VERSION)
#define IS_NOQUOTA(inode) ((inode)->i_flags & S_NOQUOTA)
#define IS_APPEND(inode) ((inode)->i_flags & S_APPEND)
#define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE)
-#define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL)
+#define IS_POSIXACL(inode) __IS_FLG(inode, SB_POSIXACL)
#define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD)
#define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME)
@@ -2178,7 +2203,7 @@ static inline int __mandatory_lock(struct inode *ino)
}
/*
- * ... and these candidates should be on MS_MANDLOCK mounted fs,
+ * ... and these candidates should be on SB_MANDLOCK mounted fs,
* otherwise these will be advisory locks
*/
@@ -2788,15 +2813,15 @@ static inline const char *kernel_read_file_id_str(enum kernel_read_file_id id)
return kernel_read_file_str[id];
}
-extern int kernel_read(struct file *, loff_t, char *, unsigned long);
extern int kernel_read_file(struct file *, void **, loff_t *, loff_t,
enum kernel_read_file_id);
-extern int kernel_read_file_from_path(char *, void **, loff_t *, loff_t,
+extern int kernel_read_file_from_path(const char *, void **, loff_t *, loff_t,
enum kernel_read_file_id);
extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t,
enum kernel_read_file_id);
-extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t);
-extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *);
+extern ssize_t kernel_read(struct file *, void *, size_t, loff_t *);
+extern ssize_t kernel_write(struct file *, const void *, size_t, loff_t *);
+extern ssize_t __kernel_write(struct file *, const void *, size_t, loff_t *);
extern struct file * open_exec(const char *);
/* fs/dcache.c -- generic fs support functions */
@@ -3169,7 +3194,7 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags)
return -EOPNOTSUPP;
if (flags & RWF_NOWAIT) {
- if (!(ki->ki_filp->f_mode & FMODE_AIO_NOWAIT))
+ if (!(ki->ki_filp->f_mode & FMODE_NOWAIT))
return -EOPNOTSUPP;
ki->ki_flags |= IOCB_NOWAIT;
}
@@ -3294,7 +3319,7 @@ static inline int check_sticky(struct inode *dir, struct inode *inode)
static inline void inode_has_no_xattr(struct inode *inode)
{
- if (!is_sxid(inode->i_mode) && (inode->i_sb->s_flags & MS_NOSEC))
+ if (!is_sxid(inode->i_mode) && (inode->i_sb->s_flags & SB_NOSEC))
inode->i_flags |= S_NOSEC;
}
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index bcfb9f7c46f5..f780718b7391 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -288,8 +288,6 @@ struct vm_area_struct;
#define GFP_NOWAIT (__GFP_KSWAPD_RECLAIM)
#define GFP_NOIO (__GFP_RECLAIM)
#define GFP_NOFS (__GFP_RECLAIM | __GFP_IO)
-#define GFP_TEMPORARY (__GFP_RECLAIM | __GFP_IO | __GFP_FS | \
- __GFP_RECLAIMABLE)
#define GFP_USER (__GFP_RECLAIM | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
#define GFP_DMA __GFP_DMA
#define GFP_DMA32 __GFP_DMA32
diff --git a/include/linux/i2c-mux-pinctrl.h b/include/linux/i2c-mux-pinctrl.h
deleted file mode 100644
index a65c86429e84..000000000000
--- a/include/linux/i2c-mux-pinctrl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * i2c-mux-pinctrl platform data
- *
- * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _LINUX_I2C_MUX_PINCTRL_H
-#define _LINUX_I2C_MUX_PINCTRL_H
-
-/**
- * struct i2c_mux_pinctrl_platform_data - Platform data for i2c-mux-pinctrl
- * @parent_bus_num: Parent I2C bus number
- * @base_bus_num: Base I2C bus number for the child busses. 0 for dynamic.
- * @bus_count: Number of child busses. Also the number of elements in
- * @pinctrl_states
- * @pinctrl_states: The names of the pinctrl state to select for each child bus
- * @pinctrl_state_idle: The pinctrl state to select when no child bus is being
- * accessed. If NULL, the most recently used pinctrl state will be left
- * selected.
- */
-struct i2c_mux_pinctrl_platform_data {
- int parent_bus_num;
- int base_bus_num;
- int bus_count;
- const char **pinctrl_states;
- const char *pinctrl_state_idle;
-};
-
-#endif
diff --git a/include/linux/i2c/bfin_twi.h b/include/linux/i2c/bfin_twi.h
deleted file mode 100644
index 135a4e0876ae..000000000000
--- a/include/linux/i2c/bfin_twi.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * i2c-bfin-twi.h - interface to ADI TWI controller
- *
- * Copyright 2005-2014 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#ifndef __I2C_BFIN_TWI_H__
-#define __I2C_BFIN_TWI_H__
-
-#include <linux/types.h>
-#include <linux/i2c.h>
-
-/*
- * ADI twi registers layout
- */
-struct bfin_twi_regs {
- u16 clkdiv;
- u16 dummy1;
- u16 control;
- u16 dummy2;
- u16 slave_ctl;
- u16 dummy3;
- u16 slave_stat;
- u16 dummy4;
- u16 slave_addr;
- u16 dummy5;
- u16 master_ctl;
- u16 dummy6;
- u16 master_stat;
- u16 dummy7;
- u16 master_addr;
- u16 dummy8;
- u16 int_stat;
- u16 dummy9;
- u16 int_mask;
- u16 dummy10;
- u16 fifo_ctl;
- u16 dummy11;
- u16 fifo_stat;
- u16 dummy12;
- u32 __pad[20];
- u16 xmt_data8;
- u16 dummy13;
- u16 xmt_data16;
- u16 dummy14;
- u16 rcv_data8;
- u16 dummy15;
- u16 rcv_data16;
- u16 dummy16;
-};
-
-struct bfin_twi_iface {
- int irq;
- spinlock_t lock;
- char read_write;
- u8 command;
- u8 *transPtr;
- int readNum;
- int writeNum;
- int cur_mode;
- int manual_stop;
- int result;
- struct i2c_adapter adap;
- struct completion complete;
- struct i2c_msg *pmsg;
- int msg_num;
- int cur_msg;
- u16 saved_clkdiv;
- u16 saved_control;
- struct bfin_twi_regs __iomem *regs_base;
-};
-
-/* ******************** TWO-WIRE INTERFACE (TWI) MASKS ********************/
-/* TWI_CLKDIV Macros (Use: *pTWI_CLKDIV = CLKLOW(x)|CLKHI(y); ) */
-#define CLKLOW(x) ((x) & 0xFF) /* Periods Clock Is Held Low */
-#define CLKHI(y) (((y)&0xFF)<<0x8) /* Periods Before New Clock Low */
-
-/* TWI_PRESCALE Masks */
-#define PRESCALE 0x007F /* SCLKs Per Internal Time Reference (10MHz) */
-#define TWI_ENA 0x0080 /* TWI Enable */
-#define SCCB 0x0200 /* SCCB Compatibility Enable */
-
-/* TWI_SLAVE_CTL Masks */
-#define SEN 0x0001 /* Slave Enable */
-#define SADD_LEN 0x0002 /* Slave Address Length */
-#define STDVAL 0x0004 /* Slave Transmit Data Valid */
-#define NAK 0x0008 /* NAK Generated At Conclusion Of Transfer */
-#define GEN 0x0010 /* General Call Address Matching Enabled */
-
-/* TWI_SLAVE_STAT Masks */
-#define SDIR 0x0001 /* Slave Transfer Direction (RX/TX*) */
-#define GCALL 0x0002 /* General Call Indicator */
-
-/* TWI_MASTER_CTL Masks */
-#define MEN 0x0001 /* Master Mode Enable */
-#define MADD_LEN 0x0002 /* Master Address Length */
-#define MDIR 0x0004 /* Master Transmit Direction (RX/TX*) */
-#define FAST 0x0008 /* Use Fast Mode Timing Specs */
-#define STOP 0x0010 /* Issue Stop Condition */
-#define RSTART 0x0020 /* Repeat Start or Stop* At End Of Transfer */
-#define DCNT 0x3FC0 /* Data Bytes To Transfer */
-#define SDAOVR 0x4000 /* Serial Data Override */
-#define SCLOVR 0x8000 /* Serial Clock Override */
-
-/* TWI_MASTER_STAT Masks */
-#define MPROG 0x0001 /* Master Transfer In Progress */
-#define LOSTARB 0x0002 /* Lost Arbitration Indicator (Xfer Aborted) */
-#define ANAK 0x0004 /* Address Not Acknowledged */
-#define DNAK 0x0008 /* Data Not Acknowledged */
-#define BUFRDERR 0x0010 /* Buffer Read Error */
-#define BUFWRERR 0x0020 /* Buffer Write Error */
-#define SDASEN 0x0040 /* Serial Data Sense */
-#define SCLSEN 0x0080 /* Serial Clock Sense */
-#define BUSBUSY 0x0100 /* Bus Busy Indicator */
-
-/* TWI_INT_SRC and TWI_INT_ENABLE Masks */
-#define SINIT 0x0001 /* Slave Transfer Initiated */
-#define SCOMP 0x0002 /* Slave Transfer Complete */
-#define SERR 0x0004 /* Slave Transfer Error */
-#define SOVF 0x0008 /* Slave Overflow */
-#define MCOMP 0x0010 /* Master Transfer Complete */
-#define MERR 0x0020 /* Master Transfer Error */
-#define XMTSERV 0x0040 /* Transmit FIFO Service */
-#define RCVSERV 0x0080 /* Receive FIFO Service */
-
-/* TWI_FIFO_CTRL Masks */
-#define XMTFLUSH 0x0001 /* Transmit Buffer Flush */
-#define RCVFLUSH 0x0002 /* Receive Buffer Flush */
-#define XMTINTLEN 0x0004 /* Transmit Buffer Interrupt Length */
-#define RCVINTLEN 0x0008 /* Receive Buffer Interrupt Length */
-
-/* TWI_FIFO_STAT Masks */
-#define XMTSTAT 0x0003 /* Transmit FIFO Status */
-#define XMT_EMPTY 0x0000 /* Transmit FIFO Empty */
-#define XMT_HALF 0x0001 /* Transmit FIFO Has 1 Byte To Write */
-#define XMT_FULL 0x0003 /* Transmit FIFO Full (2 Bytes To Write) */
-
-#define RCVSTAT 0x000C /* Receive FIFO Status */
-#define RCV_EMPTY 0x0000 /* Receive FIFO Empty */
-#define RCV_HALF 0x0004 /* Receive FIFO Has 1 Byte To Read */
-#define RCV_FULL 0x000C /* Receive FIFO Full (2 Bytes To Read) */
-
-#endif
diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h
index 5ba430cc9a87..1fc7abd28b0b 100644
--- a/include/linux/iio/adc/ad_sigma_delta.h
+++ b/include/linux/iio/adc/ad_sigma_delta.h
@@ -111,6 +111,9 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
unsigned int size, unsigned int *val);
+int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
+ unsigned int reset_length);
+
int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan, int *val);
int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
diff --git a/include/linux/input.h b/include/linux/input.h
index a65e3b24fb18..fb5e23c7ed98 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -529,6 +529,7 @@ int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code,
int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file);
int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file);
+int input_ff_flush(struct input_dev *dev, struct file *file);
int input_ff_create_memless(struct input_dev *dev, void *data,
int (*play_effect)(struct input_dev *, void *, struct ff_effect *));
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 176f7569d874..41b8c5757859 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -167,7 +167,11 @@ struct iommu_resv_region {
* @map: map a physically contiguous memory region to an iommu domain
* @unmap: unmap a physically contiguous memory region from an iommu domain
* @map_sg: map a scatter-gather list of physically contiguous memory chunks
- * to an iommu domain
+ * to an iommu domain
+ * @flush_tlb_all: Synchronously flush all hardware TLBs for this domain
+ * @tlb_range_add: Add a given iova range to the flush queue for this domain
+ * @tlb_sync: Flush all queued ranges from the hardware TLBs and empty flush
+ * queue
* @iova_to_phys: translate iova to physical address
* @add_device: add device to iommu grouping
* @remove_device: remove device from iommu grouping
@@ -199,6 +203,10 @@ struct iommu_ops {
size_t size);
size_t (*map_sg)(struct iommu_domain *domain, unsigned long iova,
struct scatterlist *sg, unsigned int nents, int prot);
+ void (*flush_iotlb_all)(struct iommu_domain *domain);
+ void (*iotlb_range_add)(struct iommu_domain *domain,
+ unsigned long iova, size_t size);
+ void (*iotlb_sync)(struct iommu_domain *domain);
phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
int (*add_device)(struct device *dev);
void (*remove_device)(struct device *dev);
@@ -225,6 +233,7 @@ struct iommu_ops {
u32 (*domain_get_windows)(struct iommu_domain *domain);
int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
+ bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);
unsigned long pgsize_bitmap;
};
@@ -291,7 +300,9 @@ extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev);
extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
phys_addr_t paddr, size_t size, int prot);
extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
- size_t size);
+ size_t size);
+extern size_t iommu_unmap_fast(struct iommu_domain *domain,
+ unsigned long iova, size_t size);
extern size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
struct scatterlist *sg,unsigned int nents,
int prot);
@@ -348,6 +359,25 @@ extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr)
extern int report_iommu_fault(struct iommu_domain *domain, struct device *dev,
unsigned long iova, int flags);
+static inline void iommu_flush_tlb_all(struct iommu_domain *domain)
+{
+ if (domain->ops->flush_iotlb_all)
+ domain->ops->flush_iotlb_all(domain);
+}
+
+static inline void iommu_tlb_range_add(struct iommu_domain *domain,
+ unsigned long iova, size_t size)
+{
+ if (domain->ops->iotlb_range_add)
+ domain->ops->iotlb_range_add(domain, iova, size);
+}
+
+static inline void iommu_tlb_sync(struct iommu_domain *domain)
+{
+ if (domain->ops->iotlb_sync)
+ domain->ops->iotlb_sync(domain);
+}
+
static inline size_t iommu_map_sg(struct iommu_domain *domain,
unsigned long iova, struct scatterlist *sg,
unsigned int nents, int prot)
@@ -430,13 +460,19 @@ static inline struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
}
static inline int iommu_map(struct iommu_domain *domain, unsigned long iova,
- phys_addr_t paddr, int gfp_order, int prot)
+ phys_addr_t paddr, size_t size, int prot)
{
return -ENODEV;
}
static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,
- int gfp_order)
+ size_t size)
+{
+ return -ENODEV;
+}
+
+static inline int iommu_unmap_fast(struct iommu_domain *domain, unsigned long iova,
+ int gfp_order)
{
return -ENODEV;
}
@@ -448,6 +484,19 @@ static inline size_t iommu_map_sg(struct iommu_domain *domain,
return -ENODEV;
}
+static inline void iommu_flush_tlb_all(struct iommu_domain *domain)
+{
+}
+
+static inline void iommu_tlb_range_add(struct iommu_domain *domain,
+ unsigned long iova, size_t size)
+{
+}
+
+static inline void iommu_tlb_sync(struct iommu_domain *domain)
+{
+}
+
static inline int iommu_domain_window_enable(struct iommu_domain *domain,
u32 wnd_nr, phys_addr_t paddr,
u64 size, int prot)
diff --git a/include/linux/iova.h b/include/linux/iova.h
index e0a892ae45c0..d179b9bf7814 100644
--- a/include/linux/iova.h
+++ b/include/linux/iova.h
@@ -14,6 +14,7 @@
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/rbtree.h>
+#include <linux/atomic.h>
#include <linux/dma-mapping.h>
/* iova structure */
@@ -36,6 +37,35 @@ struct iova_rcache {
struct iova_cpu_rcache __percpu *cpu_rcaches;
};
+struct iova_domain;
+
+/* Call-Back from IOVA code into IOMMU drivers */
+typedef void (* iova_flush_cb)(struct iova_domain *domain);
+
+/* Destructor for per-entry data */
+typedef void (* iova_entry_dtor)(unsigned long data);
+
+/* Number of entries per Flush Queue */
+#define IOVA_FQ_SIZE 256
+
+/* Timeout (in ms) after which entries are flushed from the Flush-Queue */
+#define IOVA_FQ_TIMEOUT 10
+
+/* Flush Queue entry for defered flushing */
+struct iova_fq_entry {
+ unsigned long iova_pfn;
+ unsigned long pages;
+ unsigned long data;
+ u64 counter; /* Flush counter when this entrie was added */
+};
+
+/* Per-CPU Flush Queue structure */
+struct iova_fq {
+ struct iova_fq_entry entries[IOVA_FQ_SIZE];
+ unsigned head, tail;
+ spinlock_t lock;
+};
+
/* holds all the iova translations for a domain */
struct iova_domain {
spinlock_t iova_rbtree_lock; /* Lock to protect update of rbtree */
@@ -45,6 +75,25 @@ struct iova_domain {
unsigned long start_pfn; /* Lower limit for this domain */
unsigned long dma_32bit_pfn;
struct iova_rcache rcaches[IOVA_RANGE_CACHE_MAX_SIZE]; /* IOVA range caches */
+
+ iova_flush_cb flush_cb; /* Call-Back function to flush IOMMU
+ TLBs */
+
+ iova_entry_dtor entry_dtor; /* IOMMU driver specific destructor for
+ iova entry */
+
+ struct iova_fq __percpu *fq; /* Flush Queue */
+
+ atomic64_t fq_flush_start_cnt; /* Number of TLB flushes that
+ have been started */
+
+ atomic64_t fq_flush_finish_cnt; /* Number of TLB flushes that
+ have been finished */
+
+ struct timer_list fq_timer; /* Timer to regularily empty the
+ flush-queues */
+ atomic_t fq_timer_on; /* 1 when timer is active, 0
+ when not */
};
static inline unsigned long iova_size(struct iova *iova)
@@ -95,6 +144,9 @@ struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size,
bool size_aligned);
void free_iova_fast(struct iova_domain *iovad, unsigned long pfn,
unsigned long size);
+void queue_iova(struct iova_domain *iovad,
+ unsigned long pfn, unsigned long pages,
+ unsigned long data);
unsigned long alloc_iova_fast(struct iova_domain *iovad, unsigned long size,
unsigned long limit_pfn);
struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
@@ -102,6 +154,8 @@ struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to);
void init_iova_domain(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn, unsigned long pfn_32bit);
+int init_iova_flush_queue(struct iova_domain *iovad,
+ iova_flush_cb flush_cb, iova_entry_dtor entry_dtor);
struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
void put_iova_domain(struct iova_domain *iovad);
struct iova *split_and_remove_iova(struct iova_domain *iovad,
@@ -148,6 +202,12 @@ static inline void free_iova_fast(struct iova_domain *iovad,
{
}
+static inline void queue_iova(struct iova_domain *iovad,
+ unsigned long pfn, unsigned long pages,
+ unsigned long data)
+{
+}
+
static inline unsigned long alloc_iova_fast(struct iova_domain *iovad,
unsigned long size,
unsigned long limit_pfn)
@@ -174,6 +234,13 @@ static inline void init_iova_domain(struct iova_domain *iovad,
{
}
+static inline int init_iova_flush_queue(struct iova_domain *iovad,
+ iova_flush_cb flush_cb,
+ iova_entry_dtor entry_dtor)
+{
+ return -ENODEV;
+}
+
static inline struct iova *find_iova(struct iova_domain *iovad,
unsigned long pfn)
{
diff --git a/include/linux/irq.h b/include/linux/irq.h
index b99a784635ff..d4728bf6a537 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -783,10 +783,7 @@ static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)
static inline
struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
{
- if (!cpumask_empty(d->common->effective_affinity))
- return d->common->effective_affinity;
-
- return d->common->affinity;
+ return d->common->effective_affinity;
}
static inline void irq_data_update_effective_affinity(struct irq_data *d,
const struct cpumask *m)
diff --git a/include/linux/irqchip/mips-gic.h b/include/linux/irqchip/mips-gic.h
deleted file mode 100644
index 2b0e56619e53..000000000000
--- a/include/linux/irqchip/mips-gic.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2000, 07 MIPS Technologies, Inc.
- */
-#ifndef __LINUX_IRQCHIP_MIPS_GIC_H
-#define __LINUX_IRQCHIP_MIPS_GIC_H
-
-#include <linux/clocksource.h>
-#include <linux/ioport.h>
-
-#define GIC_MAX_INTRS 256
-
-/* Constants */
-#define GIC_POL_POS 1
-#define GIC_POL_NEG 0
-#define GIC_TRIG_EDGE 1
-#define GIC_TRIG_LEVEL 0
-#define GIC_TRIG_DUAL_ENABLE 1
-#define GIC_TRIG_DUAL_DISABLE 0
-
-#define MSK(n) ((1 << (n)) - 1)
-
-/* Accessors */
-#define GIC_REG(segment, offset) (segment##_##SECTION_OFS + offset##_##OFS)
-
-/* GIC Address Space */
-#define SHARED_SECTION_OFS 0x0000
-#define SHARED_SECTION_SIZE 0x8000
-#define VPE_LOCAL_SECTION_OFS 0x8000
-#define VPE_LOCAL_SECTION_SIZE 0x4000
-#define VPE_OTHER_SECTION_OFS 0xc000
-#define VPE_OTHER_SECTION_SIZE 0x4000
-#define USM_VISIBLE_SECTION_OFS 0x10000
-#define USM_VISIBLE_SECTION_SIZE 0x10000
-
-/* Register Map for Shared Section */
-
-#define GIC_SH_CONFIG_OFS 0x0000
-
-/* Shared Global Counter */
-#define GIC_SH_COUNTER_31_00_OFS 0x0010
-/* 64-bit counter register for CM3 */
-#define GIC_SH_COUNTER_OFS GIC_SH_COUNTER_31_00_OFS
-#define GIC_SH_COUNTER_63_32_OFS 0x0014
-#define GIC_SH_REVISIONID_OFS 0x0020
-
-/* Convert an interrupt number to a byte offset/bit for multi-word registers */
-#define GIC_INTR_OFS(intr) ({ \
- unsigned bits = mips_cm_is64 ? 64 : 32; \
- unsigned reg_idx = (intr) / bits; \
- unsigned reg_width = bits / 8; \
- \
- reg_idx * reg_width; \
-})
-#define GIC_INTR_BIT(intr) ((intr) % (mips_cm_is64 ? 64 : 32))
-
-/* Polarity : Reset Value is always 0 */
-#define GIC_SH_SET_POLARITY_OFS 0x0100
-
-/* Triggering : Reset Value is always 0 */
-#define GIC_SH_SET_TRIGGER_OFS 0x0180
-
-/* Dual edge triggering : Reset Value is always 0 */
-#define GIC_SH_SET_DUAL_OFS 0x0200
-
-/* Set/Clear corresponding bit in Edge Detect Register */
-#define GIC_SH_WEDGE_OFS 0x0280
-
-/* Mask manipulation */
-#define GIC_SH_RMASK_OFS 0x0300
-#define GIC_SH_SMASK_OFS 0x0380
-
-/* Global Interrupt Mask Register (RO) - Bit Set == Interrupt enabled */
-#define GIC_SH_MASK_OFS 0x0400
-
-/* Pending Global Interrupts (RO) */
-#define GIC_SH_PEND_OFS 0x0480
-
-/* Maps Interrupt X to a Pin */
-#define GIC_SH_INTR_MAP_TO_PIN_BASE_OFS 0x0500
-#define GIC_SH_MAP_TO_PIN(intr) (4 * (intr))
-
-/* Maps Interrupt X to a VPE */
-#define GIC_SH_INTR_MAP_TO_VPE_BASE_OFS 0x2000
-#define GIC_SH_MAP_TO_VPE_REG_OFF(intr, vpe) \
- ((32 * (intr)) + (((vpe) / 32) * 4))
-#define GIC_SH_MAP_TO_VPE_REG_BIT(vpe) (1 << ((vpe) % 32))
-
-/* Register Map for Local Section */
-#define GIC_VPE_CTL_OFS 0x0000
-#define GIC_VPE_PEND_OFS 0x0004
-#define GIC_VPE_MASK_OFS 0x0008
-#define GIC_VPE_RMASK_OFS 0x000c
-#define GIC_VPE_SMASK_OFS 0x0010
-#define GIC_VPE_WD_MAP_OFS 0x0040
-#define GIC_VPE_COMPARE_MAP_OFS 0x0044
-#define GIC_VPE_TIMER_MAP_OFS 0x0048
-#define GIC_VPE_FDC_MAP_OFS 0x004c
-#define GIC_VPE_PERFCTR_MAP_OFS 0x0050
-#define GIC_VPE_SWINT0_MAP_OFS 0x0054
-#define GIC_VPE_SWINT1_MAP_OFS 0x0058
-#define GIC_VPE_OTHER_ADDR_OFS 0x0080
-#define GIC_VP_IDENT_OFS 0x0088
-#define GIC_VPE_WD_CONFIG0_OFS 0x0090
-#define GIC_VPE_WD_COUNT0_OFS 0x0094
-#define GIC_VPE_WD_INITIAL0_OFS 0x0098
-#define GIC_VPE_COMPARE_LO_OFS 0x00a0
-/* 64-bit Compare register on CM3 */
-#define GIC_VPE_COMPARE_OFS GIC_VPE_COMPARE_LO_OFS
-#define GIC_VPE_COMPARE_HI_OFS 0x00a4
-
-#define GIC_VPE_EIC_SHADOW_SET_BASE_OFS 0x0100
-#define GIC_VPE_EIC_SS(intr) (4 * (intr))
-
-#define GIC_VPE_EIC_VEC_BASE_OFS 0x0800
-#define GIC_VPE_EIC_VEC(intr) (4 * (intr))
-
-#define GIC_VPE_TENABLE_NMI_OFS 0x1000
-#define GIC_VPE_TENABLE_YQ_OFS 0x1004
-#define GIC_VPE_TENABLE_INT_31_0_OFS 0x1080
-#define GIC_VPE_TENABLE_INT_63_32_OFS 0x1084
-
-/* User Mode Visible Section Register Map */
-#define GIC_UMV_SH_COUNTER_31_00_OFS 0x0000
-#define GIC_UMV_SH_COUNTER_63_32_OFS 0x0004
-
-/* Masks */
-#define GIC_SH_CONFIG_COUNTSTOP_SHF 28
-#define GIC_SH_CONFIG_COUNTSTOP_MSK (MSK(1) << GIC_SH_CONFIG_COUNTSTOP_SHF)
-
-#define GIC_SH_CONFIG_COUNTBITS_SHF 24
-#define GIC_SH_CONFIG_COUNTBITS_MSK (MSK(4) << GIC_SH_CONFIG_COUNTBITS_SHF)
-
-#define GIC_SH_CONFIG_NUMINTRS_SHF 16
-#define GIC_SH_CONFIG_NUMINTRS_MSK (MSK(8) << GIC_SH_CONFIG_NUMINTRS_SHF)
-
-#define GIC_SH_CONFIG_NUMVPES_SHF 0
-#define GIC_SH_CONFIG_NUMVPES_MSK (MSK(8) << GIC_SH_CONFIG_NUMVPES_SHF)
-
-#define GIC_SH_WEDGE_SET(intr) ((intr) | (0x1 << 31))
-#define GIC_SH_WEDGE_CLR(intr) ((intr) & ~(0x1 << 31))
-
-#define GIC_MAP_TO_PIN_SHF 31
-#define GIC_MAP_TO_PIN_MSK (MSK(1) << GIC_MAP_TO_PIN_SHF)
-#define GIC_MAP_TO_NMI_SHF 30
-#define GIC_MAP_TO_NMI_MSK (MSK(1) << GIC_MAP_TO_NMI_SHF)
-#define GIC_MAP_TO_YQ_SHF 29
-#define GIC_MAP_TO_YQ_MSK (MSK(1) << GIC_MAP_TO_YQ_SHF)
-#define GIC_MAP_SHF 0
-#define GIC_MAP_MSK (MSK(6) << GIC_MAP_SHF)
-
-/* GIC_VPE_CTL Masks */
-#define GIC_VPE_CTL_FDC_RTBL_SHF 4
-#define GIC_VPE_CTL_FDC_RTBL_MSK (MSK(1) << GIC_VPE_CTL_FDC_RTBL_SHF)
-#define GIC_VPE_CTL_SWINT_RTBL_SHF 3
-#define GIC_VPE_CTL_SWINT_RTBL_MSK (MSK(1) << GIC_VPE_CTL_SWINT_RTBL_SHF)
-#define GIC_VPE_CTL_PERFCNT_RTBL_SHF 2
-#define GIC_VPE_CTL_PERFCNT_RTBL_MSK (MSK(1) << GIC_VPE_CTL_PERFCNT_RTBL_SHF)
-#define GIC_VPE_CTL_TIMER_RTBL_SHF 1
-#define GIC_VPE_CTL_TIMER_RTBL_MSK (MSK(1) << GIC_VPE_CTL_TIMER_RTBL_SHF)
-#define GIC_VPE_CTL_EIC_MODE_SHF 0
-#define GIC_VPE_CTL_EIC_MODE_MSK (MSK(1) << GIC_VPE_CTL_EIC_MODE_SHF)
-
-/* GIC_VPE_PEND Masks */
-#define GIC_VPE_PEND_WD_SHF 0
-#define GIC_VPE_PEND_WD_MSK (MSK(1) << GIC_VPE_PEND_WD_SHF)
-#define GIC_VPE_PEND_CMP_SHF 1
-#define GIC_VPE_PEND_CMP_MSK (MSK(1) << GIC_VPE_PEND_CMP_SHF)
-#define GIC_VPE_PEND_TIMER_SHF 2
-#define GIC_VPE_PEND_TIMER_MSK (MSK(1) << GIC_VPE_PEND_TIMER_SHF)
-#define GIC_VPE_PEND_PERFCOUNT_SHF 3
-#define GIC_VPE_PEND_PERFCOUNT_MSK (MSK(1) << GIC_VPE_PEND_PERFCOUNT_SHF)
-#define GIC_VPE_PEND_SWINT0_SHF 4
-#define GIC_VPE_PEND_SWINT0_MSK (MSK(1) << GIC_VPE_PEND_SWINT0_SHF)
-#define GIC_VPE_PEND_SWINT1_SHF 5
-#define GIC_VPE_PEND_SWINT1_MSK (MSK(1) << GIC_VPE_PEND_SWINT1_SHF)
-#define GIC_VPE_PEND_FDC_SHF 6
-#define GIC_VPE_PEND_FDC_MSK (MSK(1) << GIC_VPE_PEND_FDC_SHF)
-
-/* GIC_VPE_RMASK Masks */
-#define GIC_VPE_RMASK_WD_SHF 0
-#define GIC_VPE_RMASK_WD_MSK (MSK(1) << GIC_VPE_RMASK_WD_SHF)
-#define GIC_VPE_RMASK_CMP_SHF 1
-#define GIC_VPE_RMASK_CMP_MSK (MSK(1) << GIC_VPE_RMASK_CMP_SHF)
-#define GIC_VPE_RMASK_TIMER_SHF 2
-#define GIC_VPE_RMASK_TIMER_MSK (MSK(1) << GIC_VPE_RMASK_TIMER_SHF)
-#define GIC_VPE_RMASK_PERFCNT_SHF 3
-#define GIC_VPE_RMASK_PERFCNT_MSK (MSK(1) << GIC_VPE_RMASK_PERFCNT_SHF)
-#define GIC_VPE_RMASK_SWINT0_SHF 4
-#define GIC_VPE_RMASK_SWINT0_MSK (MSK(1) << GIC_VPE_RMASK_SWINT0_SHF)
-#define GIC_VPE_RMASK_SWINT1_SHF 5
-#define GIC_VPE_RMASK_SWINT1_MSK (MSK(1) << GIC_VPE_RMASK_SWINT1_SHF)
-#define GIC_VPE_RMASK_FDC_SHF 6
-#define GIC_VPE_RMASK_FDC_MSK (MSK(1) << GIC_VPE_RMASK_FDC_SHF)
-
-/* GIC_VPE_SMASK Masks */
-#define GIC_VPE_SMASK_WD_SHF 0
-#define GIC_VPE_SMASK_WD_MSK (MSK(1) << GIC_VPE_SMASK_WD_SHF)
-#define GIC_VPE_SMASK_CMP_SHF 1
-#define GIC_VPE_SMASK_CMP_MSK (MSK(1) << GIC_VPE_SMASK_CMP_SHF)
-#define GIC_VPE_SMASK_TIMER_SHF 2
-#define GIC_VPE_SMASK_TIMER_MSK (MSK(1) << GIC_VPE_SMASK_TIMER_SHF)
-#define GIC_VPE_SMASK_PERFCNT_SHF 3
-#define GIC_VPE_SMASK_PERFCNT_MSK (MSK(1) << GIC_VPE_SMASK_PERFCNT_SHF)
-#define GIC_VPE_SMASK_SWINT0_SHF 4
-#define GIC_VPE_SMASK_SWINT0_MSK (MSK(1) << GIC_VPE_SMASK_SWINT0_SHF)
-#define GIC_VPE_SMASK_SWINT1_SHF 5
-#define GIC_VPE_SMASK_SWINT1_MSK (MSK(1) << GIC_VPE_SMASK_SWINT1_SHF)
-#define GIC_VPE_SMASK_FDC_SHF 6
-#define GIC_VPE_SMASK_FDC_MSK (MSK(1) << GIC_VPE_SMASK_FDC_SHF)
-
-/* GIC_VP_IDENT fields */
-#define GIC_VP_IDENT_VCNUM_SHF 0
-#define GIC_VP_IDENT_VCNUM_MSK (MSK(6) << GIC_VP_IDENT_VCNUM_SHF)
-
-/* GIC nomenclature for Core Interrupt Pins. */
-#define GIC_CPU_INT0 0 /* Core Interrupt 2 */
-#define GIC_CPU_INT1 1 /* . */
-#define GIC_CPU_INT2 2 /* . */
-#define GIC_CPU_INT3 3 /* . */
-#define GIC_CPU_INT4 4 /* . */
-#define GIC_CPU_INT5 5 /* Core Interrupt 7 */
-
-/* Add 2 to convert GIC CPU pin to core interrupt */
-#define GIC_CPU_PIN_OFFSET 2
-
-/* Add 2 to convert non-EIC hardware interrupt to EIC vector number. */
-#define GIC_CPU_TO_VEC_OFFSET 2
-
-/* Mapped interrupt to pin X, then GIC will generate the vector (X+1). */
-#define GIC_PIN_TO_VEC_OFFSET 1
-
-/* Local GIC interrupts. */
-#define GIC_LOCAL_INT_WD 0 /* GIC watchdog */
-#define GIC_LOCAL_INT_COMPARE 1 /* GIC count and compare timer */
-#define GIC_LOCAL_INT_TIMER 2 /* CPU timer interrupt */
-#define GIC_LOCAL_INT_PERFCTR 3 /* CPU performance counter */
-#define GIC_LOCAL_INT_SWINT0 4 /* CPU software interrupt 0 */
-#define GIC_LOCAL_INT_SWINT1 5 /* CPU software interrupt 1 */
-#define GIC_LOCAL_INT_FDC 6 /* CPU fast debug channel */
-#define GIC_NUM_LOCAL_INTRS 7
-
-/* Convert between local/shared IRQ number and GIC HW IRQ number. */
-#define GIC_LOCAL_HWIRQ_BASE 0
-#define GIC_LOCAL_TO_HWIRQ(x) (GIC_LOCAL_HWIRQ_BASE + (x))
-#define GIC_HWIRQ_TO_LOCAL(x) ((x) - GIC_LOCAL_HWIRQ_BASE)
-#define GIC_SHARED_HWIRQ_BASE GIC_NUM_LOCAL_INTRS
-#define GIC_SHARED_TO_HWIRQ(x) (GIC_SHARED_HWIRQ_BASE + (x))
-#define GIC_HWIRQ_TO_SHARED(x) ((x) - GIC_SHARED_HWIRQ_BASE)
-
-#ifdef CONFIG_MIPS_GIC
-
-extern unsigned int gic_present;
-
-extern void gic_init(unsigned long gic_base_addr,
- unsigned long gic_addrspace_size, unsigned int cpu_vec,
- unsigned int irqbase);
-extern u64 gic_read_count(void);
-extern unsigned int gic_get_count_width(void);
-extern u64 gic_read_compare(void);
-extern void gic_write_compare(u64 cnt);
-extern void gic_write_cpu_compare(u64 cnt, int cpu);
-extern void gic_start_count(void);
-extern void gic_stop_count(void);
-extern int gic_get_c0_compare_int(void);
-extern int gic_get_c0_perfcount_int(void);
-extern int gic_get_c0_fdc_int(void);
-extern int gic_get_usm_range(struct resource *gic_usm_res);
-
-#else /* CONFIG_MIPS_GIC */
-
-#define gic_present 0
-
-static inline int gic_get_usm_range(struct resource *gic_usm_res)
-{
- /* Shouldn't be called. */
- return -1;
-}
-
-#endif /* CONFIG_MIPS_GIC */
-
-/**
- * gic_read_local_vp_id() - read the local VPs VCNUM
- *
- * Read the VCNUM of the local VP from the GIC_VP_IDENT register and
- * return it to the caller. This ID should be used to refer to the VP
- * via the GICs VP-other region, or when calculating an offset to a
- * bit representing the VP in interrupt masks.
- *
- * Return: The VCNUM value for the local VP.
- */
-extern unsigned gic_read_local_vp_id(void);
-
-#endif /* __LINUX_IRQCHIP_MIPS_GIC_H */
diff --git a/include/linux/key.h b/include/linux/key.h
index 044114185120..e315e16b6ff8 100644
--- a/include/linux/key.h
+++ b/include/linux/key.h
@@ -187,6 +187,7 @@ struct key {
#define KEY_FLAG_BUILTIN 8 /* set if key is built in to the kernel */
#define KEY_FLAG_ROOT_CAN_INVAL 9 /* set if key can be invalidated by root without permission */
#define KEY_FLAG_KEEP 10 /* set if key should not be removed */
+#define KEY_FLAG_UID_KEYRING 11 /* set if key is a user or user session keyring */
/* the key type and key description string
* - the desc is used to match a key against search criteria
@@ -243,6 +244,7 @@ extern struct key *key_alloc(struct key_type *type,
#define KEY_ALLOC_NOT_IN_QUOTA 0x0002 /* not in quota */
#define KEY_ALLOC_BUILT_IN 0x0004 /* Key is built into kernel */
#define KEY_ALLOC_BYPASS_RESTRICTION 0x0008 /* Override the check on restricted keyrings */
+#define KEY_ALLOC_UID_KEYRING 0x0010 /* allocating a user or user session keyring */
extern void key_revoke(struct key *key);
extern void key_invalidate(struct key *key);
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index f3d3e6af8838..3eaad2fbf284 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -87,6 +87,7 @@ struct nd_mapping_desc {
struct nvdimm *nvdimm;
u64 start;
u64 size;
+ int position;
};
struct nd_region_desc {
@@ -173,4 +174,19 @@ u64 nd_fletcher64(void *addr, size_t len, bool le);
void nvdimm_flush(struct nd_region *nd_region);
int nvdimm_has_flush(struct nd_region *nd_region);
int nvdimm_has_cache(struct nd_region *nd_region);
+
+#ifdef CONFIG_ARCH_HAS_PMEM_API
+#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
+void arch_wb_cache_pmem(void *addr, size_t size);
+void arch_invalidate_pmem(void *addr, size_t size);
+#else
+#define ARCH_MEMREMAP_PMEM MEMREMAP_WT
+static inline void arch_wb_cache_pmem(void *addr, size_t size)
+{
+}
+static inline void arch_invalidate_pmem(void *addr, size_t size)
+{
+}
+#endif
+
#endif /* __LIBNVDIMM_H__ */
diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h
index 22b5d4e687ce..d1c2901f1542 100644
--- a/include/linux/lsm_audit.h
+++ b/include/linux/lsm_audit.h
@@ -4,7 +4,7 @@
*
* Author : Etienne BASSET <[email protected]>
*
- * All credits to : Stephen Smalley, <[email protected]>
+ * All credits to : Stephen Smalley, <[email protected]>
* All BUGS to : Etienne BASSET <[email protected]>
*/
#ifndef _LSM_COMMON_LOGGING_
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index d1c7bef25691..c9258124e417 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -528,11 +528,6 @@
*
* Security hooks for task operations.
*
- * @task_create:
- * Check permission before creating a child process. See the clone(2)
- * manual page for definitions of the @clone_flags.
- * @clone_flags contains the flags indicating what should be shared.
- * Return 0 if permission is granted.
* @task_alloc:
* @task task being allocated.
* @clone_flags contains the flags indicating what should be shared.
@@ -1505,7 +1500,6 @@ union security_list_options {
int (*file_receive)(struct file *file);
int (*file_open)(struct file *file, const struct cred *cred);
- int (*task_create)(unsigned long clone_flags);
int (*task_alloc)(struct task_struct *task, unsigned long clone_flags);
void (*task_free)(struct task_struct *task);
int (*cred_alloc_blank)(struct cred *cred, gfp_t gfp);
@@ -1779,7 +1773,6 @@ struct security_hook_heads {
struct list_head file_send_sigiotask;
struct list_head file_receive;
struct list_head file_open;
- struct list_head task_create;
struct list_head task_alloc;
struct list_head task_free;
struct list_head cred_alloc_blank;
diff --git a/include/linux/mem_encrypt.h b/include/linux/mem_encrypt.h
index 1255f09f5e42..265a9cd21cb4 100644
--- a/include/linux/mem_encrypt.h
+++ b/include/linux/mem_encrypt.h
@@ -21,7 +21,7 @@
#else /* !CONFIG_ARCH_HAS_MEM_ENCRYPT */
-#define sme_me_mask 0UL
+#define sme_me_mask 0ULL
#endif /* CONFIG_ARCH_HAS_MEM_ENCRYPT */
@@ -30,18 +30,23 @@ static inline bool sme_active(void)
return !!sme_me_mask;
}
-static inline unsigned long sme_get_me_mask(void)
+static inline u64 sme_get_me_mask(void)
{
return sme_me_mask;
}
+#ifdef CONFIG_AMD_MEM_ENCRYPT
/*
* The __sme_set() and __sme_clr() macros are useful for adding or removing
* the encryption mask from a value (e.g. when dealing with pagetable
* entries).
*/
-#define __sme_set(x) ((unsigned long)(x) | sme_me_mask)
-#define __sme_clr(x) ((unsigned long)(x) & ~sme_me_mask)
+#define __sme_set(x) ((x) | sme_me_mask)
+#define __sme_clr(x) ((x) & ~sme_me_mask)
+#else
+#define __sme_set(x) (x)
+#define __sme_clr(x) (x)
+#endif
#endif /* __ASSEMBLY__ */
diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h
index b572955e6de6..15646740e2a8 100644
--- a/include/linux/mfd/tmio.h
+++ b/include/linux/mfd/tmio.h
@@ -144,6 +144,7 @@ struct tmio_nand_data {
struct nand_bbt_descr *badblock_pattern;
struct mtd_partition *partition;
unsigned int num_partitions;
+ const char *const *part_parsers;
};
#define FBIO_TMIO_ACC_WRITE 0x7C639300
diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h
index eaf4ad209c8f..e32dbc4934db 100644
--- a/include/linux/mlx5/device.h
+++ b/include/linux/mlx5/device.h
@@ -980,7 +980,6 @@ enum mlx5_cap_type {
MLX5_CAP_RESERVED,
MLX5_CAP_VECTOR_CALC,
MLX5_CAP_QOS,
- MLX5_CAP_FPGA,
/* NUM OF CAP Types */
MLX5_CAP_NUM
};
@@ -1110,10 +1109,10 @@ enum mlx5_mcam_feature_groups {
MLX5_GET(mcam_reg, (mdev)->caps.mcam, mng_feature_cap_mask.enhanced_features.fld)
#define MLX5_CAP_FPGA(mdev, cap) \
- MLX5_GET(fpga_cap, (mdev)->caps.hca_cur[MLX5_CAP_FPGA], cap)
+ MLX5_GET(fpga_cap, (mdev)->caps.fpga, cap)
#define MLX5_CAP64_FPGA(mdev, cap) \
- MLX5_GET64(fpga_cap, (mdev)->caps.hca_cur[MLX5_CAP_FPGA], cap)
+ MLX5_GET64(fpga_cap, (mdev)->caps.fpga, cap)
enum {
MLX5_CMD_STAT_OK = 0x0,
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
index 02ff700e4f30..401c8972cc3a 100644
--- a/include/linux/mlx5/driver.h
+++ b/include/linux/mlx5/driver.h
@@ -774,6 +774,7 @@ struct mlx5_core_dev {
u32 hca_max[MLX5_CAP_NUM][MLX5_UN_SZ_DW(hca_cap_union)];
u32 pcam[MLX5_ST_SZ_DW(pcam_reg)];
u32 mcam[MLX5_ST_SZ_DW(mcam_reg)];
+ u32 fpga[MLX5_ST_SZ_DW(fpga_cap)];
} caps;
phys_addr_t iseg_base;
struct mlx5_init_seg __iomem *iseg;
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index a528b35a022e..69772347f866 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -327,7 +327,8 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
u8 reserved_at_80[0x18];
u8 log_max_destination[0x8];
- u8 reserved_at_a0[0x18];
+ u8 log_max_flow_counter[0x8];
+ u8 reserved_at_a8[0x10];
u8 log_max_flow[0x8];
u8 reserved_at_c0[0x40];
diff --git a/include/linux/mm.h b/include/linux/mm.h
index f8c10d336e42..065d99deb847 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -240,7 +240,7 @@ extern unsigned int kobjsize(const void *objp);
#if defined(CONFIG_X86_INTEL_MPX)
/* MPX specific bounds table or bounds directory */
-# define VM_MPX VM_HIGH_ARCH_BIT_4
+# define VM_MPX VM_HIGH_ARCH_4
#else
# define VM_MPX VM_NONE
#endif
diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index 7b2e31b1745a..6866e8126982 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -400,6 +400,11 @@ extern void mmu_notifier_synchronize(void);
#else /* CONFIG_MMU_NOTIFIER */
+static inline int mm_has_notifiers(struct mm_struct *mm)
+{
+ return 0;
+}
+
static inline void mmu_notifier_release(struct mm_struct *mm)
{
}
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 356a814e7c8e..c8f89417740b 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1094,8 +1094,14 @@ static inline unsigned long early_pfn_to_nid(unsigned long pfn)
#error Allocator MAX_ORDER exceeds SECTION_SIZE
#endif
-#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
-#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
+static inline unsigned long pfn_to_section_nr(unsigned long pfn)
+{
+ return pfn >> PFN_SECTION_SHIFT;
+}
+static inline unsigned long section_nr_to_pfn(unsigned long sec)
+{
+ return sec << PFN_SECTION_SHIFT;
+}
#define SECTION_ALIGN_UP(pfn) (((pfn) + PAGES_PER_SECTION - 1) & PAGE_SECTION_MASK)
#define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK)
diff --git a/include/linux/module.h b/include/linux/module.h
index e7bdd549e527..fe5aa3736707 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -209,7 +209,7 @@ extern void cleanup_module(void);
#ifdef MODULE
/* Creates an alias so file2alias.c can find device table. */
#define MODULE_DEVICE_TABLE(type, name) \
-extern const typeof(name) __mod_##type##__##name##_device_table \
+extern typeof(name) __mod_##type##__##name##_device_table \
__attribute__ ((unused, alias(__stringify(name))))
#else /* !MODULE */
#define MODULE_DEVICE_TABLE(type, name)
diff --git a/include/linux/msg.h b/include/linux/msg.h
index a001305f5a79..81263fe3f9dc 100644
--- a/include/linux/msg.h
+++ b/include/linux/msg.h
@@ -2,6 +2,7 @@
#define _LINUX_MSG_H
#include <linux/list.h>
+#include <linux/time64.h>
#include <uapi/linux/msg.h>
/* one msg_msg structure for each message */
@@ -17,9 +18,9 @@ struct msg_msg {
/* one msq_queue structure for each present queue on the system */
struct msg_queue {
struct kern_ipc_perm q_perm;
- time_t q_stime; /* last msgsnd time */
- time_t q_rtime; /* last msgrcv time */
- time_t q_ctime; /* last change time */
+ time64_t q_stime; /* last msgsnd time */
+ time64_t q_rtime; /* last msgrcv time */
+ time64_t q_ctime; /* last change time */
unsigned long q_cbytes; /* current number of bytes on queue */
unsigned long q_qnum; /* number of messages in queue */
unsigned long q_qbytes; /* max number of bytes on queue */
@@ -31,12 +32,4 @@ struct msg_queue {
struct list_head q_senders;
} __randomize_layout;
-/* Helper routines for sys_msgsnd and sys_msgrcv */
-extern long do_msgsnd(int msqid, long mtype, void __user *mtext,
- size_t msgsz, int msgflg);
-extern long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
- int msgflg,
- long (*msg_fill)(void __user *, struct msg_msg *,
- size_t));
-
#endif /* _LINUX_MSG_H */
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index f8a2ef239c60..6cd0f6b7658b 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -206,6 +206,15 @@ struct mtd_pairing_scheme {
struct module; /* only needed for owner field in mtd_info */
+/**
+ * struct mtd_debug_info - debugging information for an MTD device.
+ *
+ * @dfs_dir: direntry object of the MTD device debugfs directory
+ */
+struct mtd_debug_info {
+ struct dentry *dfs_dir;
+};
+
struct mtd_info {
u_char type;
uint32_t flags;
@@ -346,6 +355,7 @@ struct mtd_info {
struct module *owner;
struct device dev;
int usecount;
+ struct mtd_debug_info dbg;
};
int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
diff --git a/include/linux/mtd/nand-gpio.h b/include/linux/mtd/nand-gpio.h
index 51534e50f7fc..be4f45d89be2 100644
--- a/include/linux/mtd/nand-gpio.h
+++ b/include/linux/mtd/nand-gpio.h
@@ -1,7 +1,7 @@
#ifndef __LINUX_MTD_NAND_GPIO_H
#define __LINUX_MTD_NAND_GPIO_H
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
struct gpio_nand_platdata {
int gpio_nce;
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/rawnand.h
index 5216d2eb2289..2b05f4273bab 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1,6 +1,4 @@
/*
- * linux/include/linux/mtd/nand.h
- *
* Copyright © 2000-2010 David Woodhouse <[email protected]>
* Steven J. Hill <[email protected]>
* Thomas Gleixner <[email protected]>
@@ -15,8 +13,8 @@
* Changelog:
* See git changelog.
*/
-#ifndef __LINUX_MTD_NAND_H
-#define __LINUX_MTD_NAND_H
+#ifndef __LINUX_MTD_RAWNAND_H
+#define __LINUX_MTD_RAWNAND_H
#include <linux/wait.h>
#include <linux/spinlock.h>
@@ -44,12 +42,6 @@ void nand_release(struct mtd_info *mtd);
/* Internal helper for board drivers which need to override command function */
void nand_wait_ready(struct mtd_info *mtd);
-/* locks all blocks present in the device */
-int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
-
-/* unlocks specified locked blocks */
-int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
-
/* The maximum number of NAND chips in an array */
#define NAND_MAX_CHIPS 8
@@ -89,10 +81,6 @@ int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
#define NAND_CMD_SET_FEATURES 0xef
#define NAND_CMD_RESET 0xff
-#define NAND_CMD_LOCK 0x2a
-#define NAND_CMD_UNLOCK1 0x23
-#define NAND_CMD_UNLOCK2 0x24
-
/* Extended commands for large page devices */
#define NAND_CMD_READSTART 0x30
#define NAND_CMD_RNDOUTSTART 0xE0
@@ -449,14 +437,16 @@ struct nand_jedec_params {
__le16 crc;
} __packed;
+/* The maximum expected count of bytes in the NAND ID sequence */
+#define NAND_MAX_ID_LEN 8
+
/**
* struct nand_id - NAND id structure
- * @data: buffer containing the id bytes. Currently 8 bytes large, but can
- * be extended if required.
+ * @data: buffer containing the id bytes.
* @len: ID length.
*/
struct nand_id {
- u8 data[8];
+ u8 data[NAND_MAX_ID_LEN];
int len;
};
@@ -1028,8 +1018,6 @@ static inline void *nand_get_manufacturer_data(struct nand_chip *chip)
#define NAND_MFR_ATO 0x9b
#define NAND_MFR_WINBOND 0xef
-/* The maximum expected count of bytes in the NAND ID sequence */
-#define NAND_MAX_ID_LEN 8
/*
* A helper for defining older NAND chips where the second ID byte fully
@@ -1246,6 +1234,8 @@ int onfi_init_data_interface(struct nand_chip *chip,
*/
static inline bool nand_is_slc(struct nand_chip *chip)
{
+ WARN(chip->bits_per_cell == 0,
+ "chip->bits_per_cell is used uninitialized\n");
return chip->bits_per_cell == 1;
}
@@ -1328,4 +1318,4 @@ void nand_cleanup(struct nand_chip *chip);
/* Default extended ID decoding function */
void nand_decode_ext_id(struct nand_chip *chip);
-#endif /* __LINUX_MTD_NAND_H */
+#endif /* __LINUX_MTD_RAWNAND_H */
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
index 2251add65fa7..c759d403cbc0 100644
--- a/include/linux/mtd/sh_flctl.h
+++ b/include/linux/mtd/sh_flctl.h
@@ -22,7 +22,7 @@
#include <linux/completion.h>
#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h>
#include <linux/pm_qos.h>
diff --git a/include/linux/mtd/sharpsl.h b/include/linux/mtd/sharpsl.h
index 65e91d0fa981..e1845fc4afbd 100644
--- a/include/linux/mtd/sharpsl.h
+++ b/include/linux/mtd/sharpsl.h
@@ -8,7 +8,7 @@
* published by the Free Software Foundation.
*/
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
@@ -17,4 +17,5 @@ struct sharpsl_nand_platform_data {
const struct mtd_ooblayout_ops *ecc_layout;
struct mtd_partition *partitions;
unsigned int nr_partitions;
+ const char *const *part_parsers;
};
diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h
index 55faa2f07cca..1f0a7fc7772f 100644
--- a/include/linux/mtd/spi-nor.h
+++ b/include/linux/mtd/spi-nor.h
@@ -41,6 +41,8 @@
#define SPINOR_OP_WREN 0x06 /* Write enable */
#define SPINOR_OP_RDSR 0x05 /* Read status register */
#define SPINOR_OP_WRSR 0x01 /* Write status register 1 byte */
+#define SPINOR_OP_RDSR2 0x3f /* Read status register 2 */
+#define SPINOR_OP_WRSR2 0x3e /* Write status register 2 */
#define SPINOR_OP_READ 0x03 /* Read data bytes (low frequency) */
#define SPINOR_OP_READ_FAST 0x0b /* Read data bytes (high frequency) */
#define SPINOR_OP_READ_1_1_2 0x3b /* Read data bytes (Dual Output SPI) */
@@ -56,6 +58,7 @@
#define SPINOR_OP_CHIP_ERASE 0xc7 /* Erase whole flash chip */
#define SPINOR_OP_SE 0xd8 /* Sector erase (usually 64KiB) */
#define SPINOR_OP_RDID 0x9f /* Read JEDEC ID */
+#define SPINOR_OP_RDSFDP 0x5a /* Read SFDP */
#define SPINOR_OP_RDCR 0x35 /* Read configuration register */
#define SPINOR_OP_RDFSR 0x70 /* Read flag status register */
@@ -102,6 +105,7 @@
/* Used for Spansion flashes only. */
#define SPINOR_OP_BRWR 0x17 /* Bank register write */
+#define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */
/* Used for Micron flashes only. */
#define SPINOR_OP_RD_EVCR 0x65 /* Read EVCR register */
@@ -116,6 +120,9 @@
#define SR_BP2 BIT(4) /* Block protect 2 */
#define SR_TB BIT(5) /* Top/Bottom protect */
#define SR_SRWD BIT(7) /* SR write protect */
+/* Spansion/Cypress specific status bits */
+#define SR_E_ERR BIT(5)
+#define SR_P_ERR BIT(6)
#define SR_QUAD_EN_MX BIT(6) /* Macronix Quad I/O */
@@ -128,6 +135,9 @@
/* Configuration Register bits. */
#define CR_QUAD_EN_SPAN BIT(1) /* Spansion Quad I/O */
+/* Status Register 2 bits. */
+#define SR2_QUAD_EN_BIT7 BIT(7)
+
/* Supported SPI protocols */
#define SNOR_PROTO_INST_MASK GENMASK(23, 16)
#define SNOR_PROTO_INST_SHIFT 16
@@ -218,6 +228,7 @@ enum spi_nor_option_flags {
SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
SNOR_F_READY_XSR_RDY = BIT(4),
+ SNOR_F_USE_CLSR = BIT(5),
};
/**
diff --git a/include/linux/mtd/xip.h b/include/linux/mtd/xip.h
index abed4dec5c2f..e373690cce0a 100644
--- a/include/linux/mtd/xip.h
+++ b/include/linux/mtd/xip.h
@@ -30,7 +30,9 @@
* obviously not be running from flash. The __xipram is therefore marking
* those functions so they get relocated to ram.
*/
-#define __xipram noinline __attribute__ ((__section__ (".data")))
+#ifdef CONFIG_XIP_KERNEL
+#define __xipram noinline __attribute__ ((__section__ (".xiptext")))
+#endif
/*
* Each architecture has to provide the following macros. They must access
@@ -90,10 +92,10 @@
#define xip_cpu_idle() do { } while (0)
#endif
-#else
+#endif /* CONFIG_MTD_XIP */
+#ifndef __xipram
#define __xipram
-
-#endif /* CONFIG_MTD_XIP */
+#endif
#endif /* __LINUX_MTD_XIP_H__ */
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index 5cc91d6381a3..a0282ceaa48b 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -49,7 +49,6 @@
struct nfs_access_entry {
struct rb_node rb_node;
struct list_head lru;
- unsigned long jiffies;
struct rpc_cred * cred;
__u32 mask;
struct rcu_head rcu_head;
@@ -154,7 +153,7 @@ struct nfs_inode {
*/
__be32 cookieverf[2];
- unsigned long nrequests;
+ atomic_long_t nrequests;
struct nfs_mds_commit_info commit_info;
/* Open contexts for shared mmap writes */
@@ -163,6 +162,7 @@ struct nfs_inode {
/* Readers: in-flight sillydelete RPC calls */
/* Writers: rmdir */
struct rw_semaphore rmdir_sem;
+ struct mutex commit_mutex;
#if IS_ENABLED(CONFIG_NFS_V4)
struct nfs4_cached_acl *nfs4_acl;
@@ -510,7 +510,7 @@ extern void nfs_commit_free(struct nfs_commit_data *data);
static inline int
nfs_have_writebacks(struct inode *inode)
{
- return NFS_I(inode)->nrequests != 0;
+ return atomic_long_read(&NFS_I(inode)->nrequests) != 0;
}
/*
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index d67b67ae6c8b..d117120c9b6e 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -125,8 +125,7 @@ extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
const struct nfs_pgio_completion_ops *compl_ops,
const struct nfs_rw_ops *rw_ops,
size_t bsize,
- int how,
- gfp_t gfp_flags);
+ int how);
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
struct nfs_page *);
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,
@@ -139,8 +138,7 @@ extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
extern int nfs_wait_on_request(struct nfs_page *);
extern void nfs_unlock_request(struct nfs_page *req);
extern void nfs_unlock_and_release_request(struct nfs_page *);
-extern int nfs_page_group_lock(struct nfs_page *, bool);
-extern void nfs_page_group_lock_wait(struct nfs_page *);
+extern int nfs_page_group_lock(struct nfs_page *);
extern void nfs_page_group_unlock(struct nfs_page *);
extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
extern bool nfs_async_iocounter_wait(struct rpc_task *, struct nfs_lock_context *);
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 62cbcb842f99..164d5359d4ab 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1476,7 +1476,7 @@ struct nfs_pgio_header {
struct nfs_mds_commit_info {
atomic_t rpcs_out;
- unsigned long ncommit;
+ atomic_long_t ncommit;
struct list_head list;
};
diff --git a/include/linux/nvme-fc-driver.h b/include/linux/nvme-fc-driver.h
index 9c5cb4480806..a726f96010d5 100644
--- a/include/linux/nvme-fc-driver.h
+++ b/include/linux/nvme-fc-driver.h
@@ -346,11 +346,6 @@ struct nvme_fc_remote_port {
* indicating an FC transport Aborted status.
* Entrypoint is Mandatory.
*
- * @defer_rcv: Called by the transport to signal the LLLD that it has
- * begun processing of a previously received NVME CMD IU. The LLDD
- * is now free to re-use the rcv buffer associated with the
- * nvmefc_tgt_fcp_req.
- *
* @max_hw_queues: indicates the maximum number of hw queues the LLDD
* supports for cpu affinitization.
* Value is Mandatory. Must be at least 1.
@@ -806,11 +801,19 @@ struct nvmet_fc_target_port {
* outstanding operation (if there was one) to complete, then will
* call the fcp_req_release() callback to return the command's
* exchange context back to the LLDD.
+ * Entrypoint is Mandatory.
*
* @fcp_req_release: Called by the transport to return a nvmefc_tgt_fcp_req
* to the LLDD after all operations on the fcp operation are complete.
* This may be due to the command completing or upon completion of
* abort cleanup.
+ * Entrypoint is Mandatory.
+ *
+ * @defer_rcv: Called by the transport to signal the LLLD that it has
+ * begun processing of a previously received NVME CMD IU. The LLDD
+ * is now free to re-use the rcv buffer associated with the
+ * nvmefc_tgt_fcp_req.
+ * Entrypoint is Optional.
*
* @max_hw_queues: indicates the maximum number of hw queues the LLDD
* supports for cpu affinitization.
diff --git a/include/linux/nvme.h b/include/linux/nvme.h
index 5144f9103723..9310ce77d8e1 100644
--- a/include/linux/nvme.h
+++ b/include/linux/nvme.h
@@ -226,7 +226,9 @@ struct nvme_id_ctrl {
__le16 mntmt;
__le16 mxtmt;
__le32 sanicap;
- __u8 rsvd332[180];
+ __le32 hmminds;
+ __le16 hmmaxd;
+ __u8 rsvd338[174];
__u8 sqes;
__u8 cqes;
__le16 maxcmd;
@@ -469,12 +471,14 @@ enum nvme_opcode {
*
* @NVME_SGL_FMT_ADDRESS: absolute address of the data block
* @NVME_SGL_FMT_OFFSET: relative offset of the in-capsule data block
+ * @NVME_SGL_FMT_TRANSPORT_A: transport defined format, value 0xA
* @NVME_SGL_FMT_INVALIDATE: RDMA transport specific remote invalidation
* request subtype
*/
enum {
NVME_SGL_FMT_ADDRESS = 0x00,
NVME_SGL_FMT_OFFSET = 0x01,
+ NVME_SGL_FMT_TRANSPORT_A = 0x0A,
NVME_SGL_FMT_INVALIDATE = 0x0f,
};
@@ -488,12 +492,16 @@ enum {
*
* For struct nvme_keyed_sgl_desc:
* @NVME_KEY_SGL_FMT_DATA_DESC: keyed data block descriptor
+ *
+ * Transport-specific SGL types:
+ * @NVME_TRANSPORT_SGL_DATA_DESC: Transport SGL data dlock descriptor
*/
enum {
NVME_SGL_FMT_DATA_DESC = 0x00,
NVME_SGL_FMT_SEG_DESC = 0x02,
NVME_SGL_FMT_LAST_SEG_DESC = 0x03,
NVME_KEY_SGL_FMT_DATA_DESC = 0x04,
+ NVME_TRANSPORT_SGL_DATA_DESC = 0x05,
};
struct nvme_sgl_desc {
@@ -1125,19 +1133,6 @@ enum {
NVME_SC_UNWRITTEN_BLOCK = 0x287,
NVME_SC_DNR = 0x4000,
-
-
- /*
- * FC Transport-specific error status values for NVME commands
- *
- * Transport-specific status code values must be in the range 0xB0..0xBF
- */
-
- /* Generic FC failure - catchall */
- NVME_SC_FC_TRANSPORT_ERROR = 0x00B0,
-
- /* I/O failure due to FC ABTS'd */
- NVME_SC_FC_TRANSPORT_ABORTED = 0x00B1,
};
struct nvme_completion {
diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h
index e0d1946270f3..fb908e598348 100644
--- a/include/linux/of_platform.h
+++ b/include/linux/of_platform.h
@@ -57,7 +57,14 @@ extern const struct of_device_id of_default_bus_match_table[];
extern struct platform_device *of_device_alloc(struct device_node *np,
const char *bus_id,
struct device *parent);
+#ifdef CONFIG_OF
extern struct platform_device *of_find_device_by_node(struct device_node *np);
+#else
+static inline struct platform_device *of_find_device_by_node(struct device_node *np)
+{
+ return NULL;
+}
+#endif
/* Platform devices and busses creation */
extern struct platform_device *of_platform_device_create(struct device_node *np,
diff --git a/include/linux/pci.h b/include/linux/pci.h
index f68c58a93dd0..f4f8ee5a7362 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1685,6 +1685,8 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }
#define dev_is_pci(d) (false)
#define dev_is_pf(d) (false)
+static inline bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags)
+{ return false; }
#endif /* CONFIG_PCI */
/* Include architecture-dependent settings and functions */
diff --git a/include/linux/platform_data/hsmmc-omap.h b/include/linux/platform_data/hsmmc-omap.h
index 0ff1e0dba720..73d9098ada2d 100644
--- a/include/linux/platform_data/hsmmc-omap.h
+++ b/include/linux/platform_data/hsmmc-omap.h
@@ -67,6 +67,9 @@ struct omap_hsmmc_platform_data {
#define HSMMC_HAS_HSPE_SUPPORT (1 << 2)
unsigned features;
+ /* string specifying a particular variant of hardware */
+ char *version;
+
int gpio_cd; /* gpio (card detect) */
int gpio_cod; /* gpio (cover detect) */
int gpio_wp; /* gpio (write protect) */
diff --git a/include/linux/platform_data/mtd-davinci.h b/include/linux/platform_data/mtd-davinci.h
index 1cf555aef896..f1a2cf655bdb 100644
--- a/include/linux/platform_data/mtd-davinci.h
+++ b/include/linux/platform_data/mtd-davinci.h
@@ -28,7 +28,7 @@
#ifndef __ARCH_ARM_DAVINCI_NAND_H
#define __ARCH_ARM_DAVINCI_NAND_H
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
#define NANDFCR_OFFSET 0x60
#define NANDFSR_OFFSET 0x64
diff --git a/include/linux/platform_data/mtd-nand-s3c2410.h b/include/linux/platform_data/mtd-nand-s3c2410.h
index f01659026b26..f8c553f92655 100644
--- a/include/linux/platform_data/mtd-nand-s3c2410.h
+++ b/include/linux/platform_data/mtd-nand-s3c2410.h
@@ -12,7 +12,7 @@
#ifndef __MTD_NAND_S3C2410_H
#define __MTD_NAND_S3C2410_H
-#include <linux/mtd/nand.h>
+#include <linux/mtd/rawnand.h>
/**
* struct s3c2410_nand_set - define a set of one or more nand chips
diff --git a/include/linux/i2c/pca954x.h b/include/linux/platform_data/pca954x.h
index 1712677d5904..1712677d5904 100644
--- a/include/linux/i2c/pca954x.h
+++ b/include/linux/platform_data/pca954x.h
diff --git a/include/linux/i2c/tc35876x.h b/include/linux/platform_data/tc35876x.h
index cd6a51c71e7e..cd6a51c71e7e 100644
--- a/include/linux/i2c/tc35876x.h
+++ b/include/linux/platform_data/tc35876x.h
diff --git a/include/linux/i2c/mlxcpld.h b/include/linux/platform_data/x86/mlxcpld.h
index b08dcb183fca..b08dcb183fca 100644
--- a/include/linux/i2c/mlxcpld.h
+++ b/include/linux/platform_data/x86/mlxcpld.h
diff --git a/include/linux/power/bq24190_charger.h b/include/linux/power/bq24190_charger.h
new file mode 100644
index 000000000000..45ce7f116a91
--- /dev/null
+++ b/include/linux/power/bq24190_charger.h
@@ -0,0 +1,18 @@
+/*
+ * Platform data for the TI bq24190 battery charger driver.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _BQ24190_CHARGER_H_
+#define _BQ24190_CHARGER_H_
+
+#include <linux/regulator/machine.h>
+
+struct bq24190_platform_data {
+ const struct regulator_init_data *regulator_init_data;
+};
+
+#endif
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index 11e11685dd1d..43194e02c1ee 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -6,6 +6,7 @@ enum bq27xxx_chip {
BQ27010, /* bq27010, bq27210 */
BQ2750X, /* bq27500 deprecated alias */
BQ2751X, /* bq27510, bq27520 deprecated alias */
+ BQ2752X,
BQ27500, /* bq27500/1 */
BQ27510G1, /* bq27510G1 */
BQ27510G2, /* bq27510G2 */
@@ -15,26 +16,16 @@ enum bq27xxx_chip {
BQ27520G3, /* bq27520G3 */
BQ27520G4, /* bq27520G4 */
BQ27530, /* bq27530, bq27531 */
+ BQ27531,
BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
+ BQ27542,
+ BQ27546,
+ BQ27742,
BQ27545, /* bq27545 */
BQ27421, /* bq27421, bq27425, bq27441, bq27621 */
-};
-
-/**
- * struct bq27xxx_plaform_data - Platform data for bq27xxx devices
- * @name: Name of the battery.
- * @chip: Chip class number of this device.
- * @read: HDQ read callback.
- * This function should provide access to the HDQ bus the battery is
- * connected to.
- * The first parameter is a pointer to the battery device, the second the
- * register to be read. The return value should either be the content of
- * the passed register or an error value.
- */
-struct bq27xxx_platform_data {
- const char *name;
- enum bq27xxx_chip chip;
- int (*read)(struct device *dev, unsigned int);
+ BQ27425,
+ BQ27441,
+ BQ27621,
};
struct bq27xxx_device_info;
@@ -63,7 +54,7 @@ struct bq27xxx_device_info {
struct device *dev;
int id;
enum bq27xxx_chip chip;
- bool ram_chip;
+ u32 opts;
const char *name;
struct bq27xxx_dm_reg *dm_regs;
u32 unseal_key;
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index de89066b72b1..79e90b3d3288 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -332,6 +332,8 @@ extern int power_supply_get_battery_info(struct power_supply *psy,
struct power_supply_battery_info *info);
extern void power_supply_changed(struct power_supply *psy);
extern int power_supply_am_i_supplied(struct power_supply *psy);
+extern int power_supply_set_input_current_limit_from_supplier(
+ struct power_supply *psy);
extern int power_supply_set_battery_charged(struct power_supply *psy);
#ifdef CONFIG_POWER_SUPPLY
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 81da49564ff4..44e630eb3d94 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -510,6 +510,8 @@ struct rproc_vdev {
};
struct rproc *rproc_get_by_phandle(phandle phandle);
+struct rproc *rproc_get_by_child(struct device *dev);
+
struct rproc *rproc_alloc(struct device *dev, const char *name,
const struct rproc_ops *ops,
const char *firmware, int len);
diff --git a/include/linux/remoteproc/qcom_rproc.h b/include/linux/remoteproc/qcom_rproc.h
new file mode 100644
index 000000000000..fa8e38681b4b
--- /dev/null
+++ b/include/linux/remoteproc/qcom_rproc.h
@@ -0,0 +1,22 @@
+#ifndef __QCOM_RPROC_H__
+#define __QCOM_RPROC_H__
+
+struct notifier_block;
+
+#if IS_ENABLED(CONFIG_QCOM_RPROC_COMMON)
+
+int qcom_register_ssr_notifier(struct notifier_block *nb);
+void qcom_unregister_ssr_notifier(struct notifier_block *nb);
+
+#else
+
+static inline int qcom_register_ssr_notifier(struct notifier_block *nb)
+{
+ return 0;
+}
+
+static inline void qcom_unregister_ssr_notifier(struct notifier_block *nb) {}
+
+#endif
+
+#endif
diff --git a/include/linux/reset.h b/include/linux/reset.h
index 13d8681210d5..56463f37f3e6 100644
--- a/include/linux/reset.h
+++ b/include/linux/reset.h
@@ -25,6 +25,11 @@ struct reset_control *__devm_reset_control_get(struct device *dev,
int __must_check device_reset(struct device *dev);
+struct reset_control *devm_reset_control_array_get(struct device *dev,
+ bool shared, bool optional);
+struct reset_control *of_reset_control_array_get(struct device_node *np,
+ bool shared, bool optional);
+
static inline int device_reset_optional(struct device *dev)
{
return device_reset(dev);
@@ -89,6 +94,18 @@ static inline struct reset_control *__devm_reset_control_get(
return optional ? NULL : ERR_PTR(-ENOTSUPP);
}
+static inline struct reset_control *
+devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
+{
+ return optional ? NULL : ERR_PTR(-ENOTSUPP);
+}
+
+static inline struct reset_control *
+of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
+{
+ return optional ? NULL : ERR_PTR(-ENOTSUPP);
+}
+
#endif /* CONFIG_RESET_CONTROLLER */
/**
@@ -374,4 +391,55 @@ static inline struct reset_control *devm_reset_control_get_by_index(
{
return devm_reset_control_get_exclusive_by_index(dev, index);
}
+
+/*
+ * APIs to manage a list of reset controllers
+ */
+static inline struct reset_control *
+devm_reset_control_array_get_exclusive(struct device *dev)
+{
+ return devm_reset_control_array_get(dev, false, false);
+}
+
+static inline struct reset_control *
+devm_reset_control_array_get_shared(struct device *dev)
+{
+ return devm_reset_control_array_get(dev, true, false);
+}
+
+static inline struct reset_control *
+devm_reset_control_array_get_optional_exclusive(struct device *dev)
+{
+ return devm_reset_control_array_get(dev, false, true);
+}
+
+static inline struct reset_control *
+devm_reset_control_array_get_optional_shared(struct device *dev)
+{
+ return devm_reset_control_array_get(dev, true, true);
+}
+
+static inline struct reset_control *
+of_reset_control_array_get_exclusive(struct device_node *node)
+{
+ return of_reset_control_array_get(node, false, false);
+}
+
+static inline struct reset_control *
+of_reset_control_array_get_shared(struct device_node *node)
+{
+ return of_reset_control_array_get(node, true, false);
+}
+
+static inline struct reset_control *
+of_reset_control_array_get_optional_exclusive(struct device_node *node)
+{
+ return of_reset_control_array_get(node, false, true);
+}
+
+static inline struct reset_control *
+of_reset_control_array_get_optional_shared(struct device_node *node)
+{
+ return of_reset_control_array_get(node, true, true);
+}
#endif
diff --git a/include/linux/rpmsg/qcom_glink.h b/include/linux/rpmsg/qcom_glink.h
new file mode 100644
index 000000000000..a622f029836e
--- /dev/null
+++ b/include/linux/rpmsg/qcom_glink.h
@@ -0,0 +1,27 @@
+#ifndef _LINUX_RPMSG_QCOM_GLINK_H
+#define _LINUX_RPMSG_QCOM_GLINK_H
+
+#include <linux/device.h>
+
+struct qcom_glink;
+
+#if IS_ENABLED(CONFIG_RPMSG_QCOM_GLINK_SMEM)
+
+struct qcom_glink *qcom_glink_smem_register(struct device *parent,
+ struct device_node *node);
+void qcom_glink_smem_unregister(struct qcom_glink *glink);
+
+#else
+
+static inline struct qcom_glink *
+qcom_glink_smem_register(struct device *parent,
+ struct device_node *node)
+{
+ return NULL;
+}
+
+static inline void qcom_glink_smem_unregister(struct qcom_glink *glink) {}
+
+#endif
+
+#endif
diff --git a/include/linux/rtc.h b/include/linux/rtc.h
index 0a0f0d14a5fb..e6d0f9c1cafd 100644
--- a/include/linux/rtc.h
+++ b/include/linux/rtc.h
@@ -72,8 +72,6 @@ extern struct class *rtc_class;
* issued through ioctl() ...
*/
struct rtc_class_ops {
- int (*open)(struct device *);
- void (*release)(struct device *);
int (*ioctl)(struct device *, unsigned int, unsigned long);
int (*read_time)(struct device *, struct rtc_time *);
int (*set_time)(struct device *, struct rtc_time *);
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 92fb8dd5a9e4..26a7df4e558c 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -65,25 +65,23 @@ struct task_group;
*/
/* Used in tsk->state: */
-#define TASK_RUNNING 0
-#define TASK_INTERRUPTIBLE 1
-#define TASK_UNINTERRUPTIBLE 2
-#define __TASK_STOPPED 4
-#define __TASK_TRACED 8
+#define TASK_RUNNING 0x0000
+#define TASK_INTERRUPTIBLE 0x0001
+#define TASK_UNINTERRUPTIBLE 0x0002
+#define __TASK_STOPPED 0x0004
+#define __TASK_TRACED 0x0008
/* Used in tsk->exit_state: */
-#define EXIT_DEAD 16
-#define EXIT_ZOMBIE 32
+#define EXIT_DEAD 0x0010
+#define EXIT_ZOMBIE 0x0020
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
-#define TASK_DEAD 64
-#define TASK_WAKEKILL 128
-#define TASK_WAKING 256
-#define TASK_PARKED 512
-#define TASK_NOLOAD 1024
-#define TASK_NEW 2048
-#define TASK_STATE_MAX 4096
-
-#define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPNn"
+#define TASK_PARKED 0x0040
+#define TASK_DEAD 0x0080
+#define TASK_WAKEKILL 0x0100
+#define TASK_WAKING 0x0200
+#define TASK_NOLOAD 0x0400
+#define TASK_NEW 0x0800
+#define TASK_STATE_MAX 0x1000
/* Convenience macros for the sake of set_current_state: */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
@@ -99,7 +97,8 @@ struct task_group;
/* get_task_state(): */
#define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \
TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
- __TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD)
+ __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \
+ TASK_PARKED)
#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0)
@@ -1243,17 +1242,34 @@ static inline pid_t task_pgrp_nr(struct task_struct *tsk)
return task_pgrp_nr_ns(tsk, &init_pid_ns);
}
-static inline char task_state_to_char(struct task_struct *task)
+#define TASK_REPORT_IDLE (TASK_REPORT + 1)
+#define TASK_REPORT_MAX (TASK_REPORT_IDLE << 1)
+
+static inline unsigned int __get_task_state(struct task_struct *tsk)
+{
+ unsigned int tsk_state = READ_ONCE(tsk->state);
+ unsigned int state = (tsk_state | tsk->exit_state) & TASK_REPORT;
+
+ BUILD_BUG_ON_NOT_POWER_OF_2(TASK_REPORT_MAX);
+
+ if (tsk_state == TASK_IDLE)
+ state = TASK_REPORT_IDLE;
+
+ return fls(state);
+}
+
+static inline char __task_state_to_char(unsigned int state)
{
- const char stat_nam[] = TASK_STATE_TO_CHAR_STR;
- unsigned long state = task->state;
+ static const char state_char[] = "RSDTtXZPI";
- state = state ? __ffs(state) + 1 : 0;
+ BUILD_BUG_ON(1 + ilog2(TASK_REPORT_MAX) != sizeof(state_char) - 1);
- /* Make sure the string lines up properly with the number of task states: */
- BUILD_BUG_ON(sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1);
+ return state_char[state];
+}
- return state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?';
+static inline char task_state_to_char(struct task_struct *tsk)
+{
+ return __task_state_to_char(__get_task_state(tsk));
}
/**
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
index 3a19c253bdb1..ae53e413fb13 100644
--- a/include/linux/sched/mm.h
+++ b/include/linux/sched/mm.h
@@ -84,6 +84,12 @@ static inline bool mmget_not_zero(struct mm_struct *mm)
/* mmput gets rid of the mappings and all user-space */
extern void mmput(struct mm_struct *);
+#ifdef CONFIG_MMU
+/* same as above but performs the slow path from the async context. Can
+ * be called from the atomic context as well
+ */
+void mmput_async(struct mm_struct *);
+#endif
/* Grab a reference to a task's mm, if it is not already going away */
extern struct mm_struct *get_task_mm(struct task_struct *task);
diff --git a/include/linux/seccomp.h b/include/linux/seccomp.h
index ecc296c137cd..c8bef436b61d 100644
--- a/include/linux/seccomp.h
+++ b/include/linux/seccomp.h
@@ -3,7 +3,8 @@
#include <uapi/linux/seccomp.h>
-#define SECCOMP_FILTER_FLAG_MASK (SECCOMP_FILTER_FLAG_TSYNC)
+#define SECCOMP_FILTER_FLAG_MASK (SECCOMP_FILTER_FLAG_TSYNC | \
+ SECCOMP_FILTER_FLAG_LOG)
#ifdef CONFIG_SECCOMP
diff --git a/include/linux/security.h b/include/linux/security.h
index 974bb9b0996c..ce6265960d6c 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -90,6 +90,8 @@ extern int cap_inode_setxattr(struct dentry *dentry, const char *name,
extern int cap_inode_removexattr(struct dentry *dentry, const char *name);
extern int cap_inode_need_killpriv(struct dentry *dentry);
extern int cap_inode_killpriv(struct dentry *dentry);
+extern int cap_inode_getsecurity(struct inode *inode, const char *name,
+ void **buffer, bool alloc);
extern int cap_mmap_addr(unsigned long addr);
extern int cap_mmap_file(struct file *file, unsigned long reqprot,
unsigned long prot, unsigned long flags);
@@ -316,7 +318,6 @@ int security_file_send_sigiotask(struct task_struct *tsk,
struct fown_struct *fown, int sig);
int security_file_receive(struct file *file);
int security_file_open(struct file *file, const struct cred *cred);
-int security_task_create(unsigned long clone_flags);
int security_task_alloc(struct task_struct *task, unsigned long clone_flags);
void security_task_free(struct task_struct *task);
int security_cred_alloc_blank(struct cred *cred, gfp_t gfp);
@@ -878,11 +879,6 @@ static inline int security_file_open(struct file *file,
return 0;
}
-static inline int security_task_create(unsigned long clone_flags)
-{
- return 0;
-}
-
static inline int security_task_alloc(struct task_struct *task,
unsigned long clone_flags)
{
diff --git a/include/linux/sem.h b/include/linux/sem.h
index de2deb8676bd..0083128318f6 100644
--- a/include/linux/sem.h
+++ b/include/linux/sem.h
@@ -4,6 +4,7 @@
#include <linux/atomic.h>
#include <linux/rcupdate.h>
#include <linux/cache.h>
+#include <linux/time64.h>
#include <uapi/linux/sem.h>
struct task_struct;
@@ -30,7 +31,7 @@ struct sem {
/* One sem_array data structure for each set of semaphores in the system. */
struct sem_array {
struct kern_ipc_perm sem_perm; /* permissions .. see ipc.h */
- time_t sem_ctime; /* create/last semctl() time */
+ time64_t sem_ctime; /* create/last semctl() time */
struct list_head pending_alter; /* pending operations */
/* that alter the array */
struct list_head pending_const; /* pending complex operations */
diff --git a/include/linux/shm.h b/include/linux/shm.h
index 21a5e6c43385..74a4b3b64352 100644
--- a/include/linux/shm.h
+++ b/include/linux/shm.h
@@ -12,9 +12,9 @@ struct shmid_kernel /* private to the kernel */
struct file *shm_file;
unsigned long shm_nattch;
unsigned long shm_segsz;
- time_t shm_atim;
- time_t shm_dtim;
- time_t shm_ctim;
+ time64_t shm_atim;
+ time64_t shm_dtim;
+ time64_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
struct user_struct *mlock_user;
diff --git a/include/linux/signal.h b/include/linux/signal.h
index e2678b5dbb21..38564e3e54c7 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -21,6 +21,20 @@ static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
int copy_siginfo_to_user(struct siginfo __user *to, const struct siginfo *from);
+enum siginfo_layout {
+ SIL_KILL,
+ SIL_TIMER,
+ SIL_POLL,
+ SIL_FAULT,
+ SIL_CHLD,
+ SIL_RT,
+#ifdef __ARCH_SIGSYS
+ SIL_SYS,
+#endif
+};
+
+enum siginfo_layout siginfo_layout(int sig, int si_code);
+
/*
* Define some primitives to manipulate sigset_t.
*/
@@ -380,10 +394,18 @@ int unhandled_signal(struct task_struct *tsk, int sig);
rt_sigmask(SIGCONT) | rt_sigmask(SIGCHLD) | \
rt_sigmask(SIGWINCH) | rt_sigmask(SIGURG) )
+#define SIG_SPECIFIC_SICODES_MASK (\
+ rt_sigmask(SIGILL) | rt_sigmask(SIGFPE) | \
+ rt_sigmask(SIGSEGV) | rt_sigmask(SIGBUS) | \
+ rt_sigmask(SIGTRAP) | rt_sigmask(SIGCHLD) | \
+ rt_sigmask(SIGPOLL) | rt_sigmask(SIGSYS) | \
+ SIGEMT_MASK )
+
#define sig_kernel_only(sig) siginmask(sig, SIG_KERNEL_ONLY_MASK)
#define sig_kernel_coredump(sig) siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
#define sig_kernel_ignore(sig) siginmask(sig, SIG_KERNEL_IGNORE_MASK)
#define sig_kernel_stop(sig) siginmask(sig, SIG_KERNEL_STOP_MASK)
+#define sig_specific_sicodes(sig) siginmask(sig, SIG_SPECIFIC_SICODES_MASK)
#define sig_fatal(t, signr) \
(!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \
diff --git a/include/linux/soc/mediatek/infracfg.h b/include/linux/soc/mediatek/infracfg.h
index a5714e93fb34..a0182ec2a621 100644
--- a/include/linux/soc/mediatek/infracfg.h
+++ b/include/linux/soc/mediatek/infracfg.h
@@ -20,6 +20,13 @@
#define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22)
#define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23)
+#define MT7622_TOP_AXI_PROT_EN_ETHSYS (BIT(3) | BIT(17))
+#define MT7622_TOP_AXI_PROT_EN_HIF0 (BIT(24) | BIT(25))
+#define MT7622_TOP_AXI_PROT_EN_HIF1 (BIT(26) | BIT(27) | \
+ BIT(28))
+#define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \
+ BIT(7) | BIT(8))
+
int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask);
int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask);
diff --git a/include/linux/string.h b/include/linux/string.h
index e1eeb0a8a969..54d21783e18d 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -434,20 +434,9 @@ __FORTIFY_INLINE char *strcpy(char *p, const char *q)
* @count: The number of bytes to copy
* @pad: Character to use for padding if space is left in destination.
*/
-__FORTIFY_INLINE void memcpy_and_pad(void *dest, size_t dest_len,
- const void *src, size_t count, int pad)
+static inline void memcpy_and_pad(void *dest, size_t dest_len,
+ const void *src, size_t count, int pad)
{
- size_t dest_size = __builtin_object_size(dest, 0);
- size_t src_size = __builtin_object_size(src, 0);
-
- if (__builtin_constant_p(dest_len) && __builtin_constant_p(count)) {
- if (dest_size < dest_len && dest_size < count)
- __write_overflow();
- else if (src_size < dest_len && src_size < count)
- __read_overflow3();
- }
- if (dest_size < dest_len)
- fortify_panic(__func__);
if (dest_len > count) {
memcpy(dest, src, count);
memset(dest + count, pad, dest_len - count);
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
index 50a99a117da7..c1768f9d993b 100644
--- a/include/linux/sunrpc/sched.h
+++ b/include/linux/sunrpc/sched.h
@@ -139,6 +139,8 @@ struct rpc_task_setup {
#define RPC_TASK_RUNNING 0
#define RPC_TASK_QUEUED 1
#define RPC_TASK_ACTIVE 2
+#define RPC_TASK_MSG_RECV 3
+#define RPC_TASK_MSG_RECV_WAIT 4
#define RPC_IS_RUNNING(t) test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
#define rpc_set_running(t) set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h
index 261b48a2701d..86b59e3525a5 100644
--- a/include/linux/sunrpc/xdr.h
+++ b/include/linux/sunrpc/xdr.h
@@ -239,6 +239,19 @@ extern unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
extern int xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, int (*actor)(struct scatterlist *, void *), void *data);
+/**
+ * xdr_stream_remaining - Return the number of bytes remaining in the stream
+ * @xdr: pointer to struct xdr_stream
+ *
+ * Return value:
+ * Number of bytes remaining in @xdr before xdr->end
+ */
+static inline size_t
+xdr_stream_remaining(const struct xdr_stream *xdr)
+{
+ return xdr->nwords << 2;
+}
+
ssize_t xdr_stream_decode_string_dup(struct xdr_stream *xdr, char **str,
size_t maxlen, gfp_t gfp_flags);
/**
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index eab1c749e192..5a7bff41f6b7 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -174,7 +174,7 @@ enum xprt_transports {
struct rpc_xprt {
struct kref kref; /* Reference count */
- struct rpc_xprt_ops * ops; /* transport methods */
+ const struct rpc_xprt_ops *ops; /* transport methods */
const struct rpc_timeout *timeout; /* timeout parms */
struct sockaddr_storage addr; /* server address */
@@ -232,6 +232,7 @@ struct rpc_xprt {
*/
spinlock_t transport_lock; /* lock transport info */
spinlock_t reserve_lock; /* lock slot table */
+ spinlock_t recv_lock; /* lock receive list */
u32 xid; /* Next XID value to use */
struct rpc_task * snd_task; /* Task blocked in send */
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
@@ -372,6 +373,8 @@ void xprt_write_space(struct rpc_xprt *xprt);
void xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result);
struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
void xprt_complete_rqst(struct rpc_task *task, int copied);
+void xprt_pin_rqst(struct rpc_rqst *req);
+void xprt_unpin_rqst(struct rpc_rqst *req);
void xprt_release_rqst_cong(struct rpc_task *task);
void xprt_disconnect_done(struct rpc_xprt *xprt);
void xprt_force_disconnect(struct rpc_xprt *xprt);
diff --git a/include/linux/swait.h b/include/linux/swait.h
index 4a4e180d0a35..73e97a08d3d0 100644
--- a/include/linux/swait.h
+++ b/include/linux/swait.h
@@ -79,9 +79,63 @@ extern void __init_swait_queue_head(struct swait_queue_head *q, const char *name
DECLARE_SWAIT_QUEUE_HEAD(name)
#endif
-static inline int swait_active(struct swait_queue_head *q)
+/**
+ * swait_active -- locklessly test for waiters on the queue
+ * @wq: the waitqueue to test for waiters
+ *
+ * returns true if the wait list is not empty
+ *
+ * NOTE: this function is lockless and requires care, incorrect usage _will_
+ * lead to sporadic and non-obvious failure.
+ *
+ * NOTE2: this function has the same above implications as regular waitqueues.
+ *
+ * Use either while holding swait_queue_head::lock or when used for wakeups
+ * with an extra smp_mb() like:
+ *
+ * CPU0 - waker CPU1 - waiter
+ *
+ * for (;;) {
+ * @cond = true; prepare_to_swait(&wq_head, &wait, state);
+ * smp_mb(); // smp_mb() from set_current_state()
+ * if (swait_active(wq_head)) if (@cond)
+ * wake_up(wq_head); break;
+ * schedule();
+ * }
+ * finish_swait(&wq_head, &wait);
+ *
+ * Because without the explicit smp_mb() it's possible for the
+ * swait_active() load to get hoisted over the @cond store such that we'll
+ * observe an empty wait list while the waiter might not observe @cond.
+ * This, in turn, can trigger missing wakeups.
+ *
+ * Also note that this 'optimization' trades a spin_lock() for an smp_mb(),
+ * which (when the lock is uncontended) are of roughly equal cost.
+ */
+static inline int swait_active(struct swait_queue_head *wq)
+{
+ return !list_empty(&wq->task_list);
+}
+
+/**
+ * swq_has_sleeper - check if there are any waiting processes
+ * @wq: the waitqueue to test for waiters
+ *
+ * Returns true if @wq has waiting processes
+ *
+ * Please refer to the comment for swait_active.
+ */
+static inline bool swq_has_sleeper(struct swait_queue_head *wq)
{
- return !list_empty(&q->task_list);
+ /*
+ * We need to be sure we are in sync with the list_add()
+ * modifications to the wait queue (task_list).
+ *
+ * This memory barrier should be paired with one on the
+ * waiting side.
+ */
+ smp_mb();
+ return swait_active(wq);
}
extern void swake_up(struct swait_queue_head *q);
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 88951b795ee3..a78186d826d7 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -200,6 +200,8 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
+#define SYSCALL_DEFINE_MAXARGS 6
+
#define SYSCALL_DEFINEx(x, sname, ...) \
SYSCALL_METADATA(sname, x, __VA_ARGS__) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
@@ -219,21 +221,25 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event)
} \
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
-#ifdef TIF_FSCHECK
/*
* Called before coming back to user-mode. Returning to user-mode with an
* address limit different than USER_DS can allow to overwrite kernel memory.
*/
static inline void addr_limit_user_check(void)
{
-
+#ifdef TIF_FSCHECK
if (!test_thread_flag(TIF_FSCHECK))
return;
+#endif
- BUG_ON(!segment_eq(get_fs(), USER_DS));
+ if (CHECK_DATA_CORRUPTION(!segment_eq(get_fs(), USER_DS),
+ "Invalid address limit on user-mode return"))
+ force_sig(SIGKILL, current);
+
+#ifdef TIF_FSCHECK
clear_thread_flag(TIF_FSCHECK);
-}
#endif
+}
asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
qid_t id, void __user *addr);
diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h
index 0f175b8f6456..cb889afe576b 100644
--- a/include/linux/tee_drv.h
+++ b/include/linux/tee_drv.h
@@ -28,6 +28,7 @@
#define TEE_SHM_MAPPED 0x1 /* Memory mapped by the kernel */
#define TEE_SHM_DMA_BUF 0x2 /* Memory with dma-buf handle */
+struct device;
struct tee_device;
struct tee_shm;
struct tee_shm_pool;
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index dab11f97e1c6..fd5b959c753c 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -102,6 +102,7 @@ enum thermal_notify_event {
THERMAL_DEVICE_DOWN, /* Thermal device is down */
THERMAL_DEVICE_UP, /* Thermal device is up after a down event */
THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
+ THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */
};
struct thermal_zone_device_ops {
diff --git a/include/linux/time.h b/include/linux/time.h
index 3877136bbdf8..9bc1f945777c 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -178,7 +178,7 @@ extern int do_setitimer(int which, struct itimerval *value,
struct itimerval *ovalue);
extern int do_getitimer(int which, struct itimerval *value);
-extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
+extern long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, int flags);
/*
* Similar to the struct tm in userspace <time.h>, but it needs to be here so
diff --git a/include/linux/timer.h b/include/linux/timer.h
index e6789b8757d5..6383c528b148 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -168,6 +168,20 @@ static inline void init_timer_on_stack_key(struct timer_list *timer,
#define setup_pinned_deferrable_timer_on_stack(timer, fn, data) \
__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE | TIMER_PINNED)
+#define TIMER_DATA_TYPE unsigned long
+#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE)
+
+static inline void timer_setup(struct timer_list *timer,
+ void (*callback)(struct timer_list *),
+ unsigned int flags)
+{
+ __setup_timer(timer, (TIMER_FUNC_TYPE)callback,
+ (TIMER_DATA_TYPE)timer, flags);
+}
+
+#define from_timer(var, callback_timer, timer_fieldname) \
+ container_of(callback_timer, typeof(*var), timer_fieldname)
+
/**
* timer_pending - is a timer pending?
* @timer: the timer in question
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 7f11050746ae..2e0f22298fe9 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -272,6 +272,7 @@ struct trace_event_call {
int perf_refcount;
struct hlist_head __percpu *perf_events;
struct bpf_prog *prog;
+ struct perf_event *bpf_prog_owner;
int (*perf_perm)(struct trace_event_call *,
struct perf_event *);
diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
index b3575ce29148..c18e01252346 100644
--- a/include/linux/user_namespace.h
+++ b/include/linux/user_namespace.h
@@ -112,8 +112,9 @@ extern ssize_t proc_projid_map_write(struct file *, const char __user *, size_t,
extern ssize_t proc_setgroups_write(struct file *, const char __user *, size_t, loff_t *);
extern int proc_setgroups_show(struct seq_file *m, void *v);
extern bool userns_may_setgroups(const struct user_namespace *ns);
+extern bool in_userns(const struct user_namespace *ancestor,
+ const struct user_namespace *child);
extern bool current_in_userns(const struct user_namespace *target_ns);
-
struct ns_common *ns_get_owner(struct ns_common *ns);
#else
@@ -144,6 +145,12 @@ static inline bool userns_may_setgroups(const struct user_namespace *ns)
return true;
}
+static inline bool in_userns(const struct user_namespace *ancestor,
+ const struct user_namespace *child)
+{
+ return true;
+}
+
static inline bool current_in_userns(const struct user_namespace *target_ns)
{
return true;
diff --git a/include/linux/wait.h b/include/linux/wait.h
index dc19880c02f5..87c4641023fb 100644
--- a/include/linux/wait.h
+++ b/include/linux/wait.h
@@ -18,6 +18,7 @@ int default_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int
/* wait_queue_entry::flags */
#define WQ_FLAG_EXCLUSIVE 0x01
#define WQ_FLAG_WOKEN 0x02
+#define WQ_FLAG_BOOKMARK 0x04
/*
* A single wait-queue entry structure:
@@ -184,6 +185,8 @@ __remove_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq
void __wake_up(struct wait_queue_head *wq_head, unsigned int mode, int nr, void *key);
void __wake_up_locked_key(struct wait_queue_head *wq_head, unsigned int mode, void *key);
+void __wake_up_locked_key_bookmark(struct wait_queue_head *wq_head,
+ unsigned int mode, void *key, wait_queue_entry_t *bookmark);
void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode, int nr, void *key);
void __wake_up_locked(struct wait_queue_head *wq_head, unsigned int mode, int nr);
void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr);
diff --git a/include/linux/xxhash.h b/include/linux/xxhash.h
new file mode 100644
index 000000000000..9e1f42cb57e9
--- /dev/null
+++ b/include/linux/xxhash.h
@@ -0,0 +1,236 @@
+/*
+ * xxHash - Extremely Fast Hash algorithm
+ * Copyright (C) 2012-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at:
+ * - xxHash homepage: http://cyan4973.github.io/xxHash/
+ * - xxHash source repository: https://github.com/Cyan4973/xxHash
+ */
+
+/*
+ * Notice extracted from xxHash homepage:
+ *
+ * xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
+ * It also successfully passes all tests from the SMHasher suite.
+ *
+ * Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2
+ * Duo @3GHz)
+ *
+ * Name Speed Q.Score Author
+ * xxHash 5.4 GB/s 10
+ * CrapWow 3.2 GB/s 2 Andrew
+ * MumurHash 3a 2.7 GB/s 10 Austin Appleby
+ * SpookyHash 2.0 GB/s 10 Bob Jenkins
+ * SBox 1.4 GB/s 9 Bret Mulvey
+ * Lookup3 1.2 GB/s 9 Bob Jenkins
+ * SuperFastHash 1.2 GB/s 1 Paul Hsieh
+ * CityHash64 1.05 GB/s 10 Pike & Alakuijala
+ * FNV 0.55 GB/s 5 Fowler, Noll, Vo
+ * CRC32 0.43 GB/s 9
+ * MD5-32 0.33 GB/s 10 Ronald L. Rivest
+ * SHA1-32 0.28 GB/s 10
+ *
+ * Q.Score is a measure of quality of the hash function.
+ * It depends on successfully passing SMHasher test set.
+ * 10 is a perfect score.
+ *
+ * A 64-bits version, named xxh64 offers much better speed,
+ * but for 64-bits applications only.
+ * Name Speed on 64 bits Speed on 32 bits
+ * xxh64 13.8 GB/s 1.9 GB/s
+ * xxh32 6.8 GB/s 6.0 GB/s
+ */
+
+#ifndef XXHASH_H
+#define XXHASH_H
+
+#include <linux/types.h>
+
+/*-****************************
+ * Simple Hash Functions
+ *****************************/
+
+/**
+ * xxh32() - calculate the 32-bit hash of the input with a given seed.
+ *
+ * @input: The data to hash.
+ * @length: The length of the data to hash.
+ * @seed: The seed can be used to alter the result predictably.
+ *
+ * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s
+ *
+ * Return: The 32-bit hash of the data.
+ */
+uint32_t xxh32(const void *input, size_t length, uint32_t seed);
+
+/**
+ * xxh64() - calculate the 64-bit hash of the input with a given seed.
+ *
+ * @input: The data to hash.
+ * @length: The length of the data to hash.
+ * @seed: The seed can be used to alter the result predictably.
+ *
+ * This function runs 2x faster on 64-bit systems, but slower on 32-bit systems.
+ *
+ * Return: The 64-bit hash of the data.
+ */
+uint64_t xxh64(const void *input, size_t length, uint64_t seed);
+
+/*-****************************
+ * Streaming Hash Functions
+ *****************************/
+
+/*
+ * These definitions are only meant to allow allocation of XXH state
+ * statically, on stack, or in a struct for example.
+ * Do not use members directly.
+ */
+
+/**
+ * struct xxh32_state - private xxh32 state, do not use members directly
+ */
+struct xxh32_state {
+ uint32_t total_len_32;
+ uint32_t large_len;
+ uint32_t v1;
+ uint32_t v2;
+ uint32_t v3;
+ uint32_t v4;
+ uint32_t mem32[4];
+ uint32_t memsize;
+};
+
+/**
+ * struct xxh32_state - private xxh64 state, do not use members directly
+ */
+struct xxh64_state {
+ uint64_t total_len;
+ uint64_t v1;
+ uint64_t v2;
+ uint64_t v3;
+ uint64_t v4;
+ uint64_t mem64[4];
+ uint32_t memsize;
+};
+
+/**
+ * xxh32_reset() - reset the xxh32 state to start a new hashing operation
+ *
+ * @state: The xxh32 state to reset.
+ * @seed: Initialize the hash state with this seed.
+ *
+ * Call this function on any xxh32_state to prepare for a new hashing operation.
+ */
+void xxh32_reset(struct xxh32_state *state, uint32_t seed);
+
+/**
+ * xxh32_update() - hash the data given and update the xxh32 state
+ *
+ * @state: The xxh32 state to update.
+ * @input: The data to hash.
+ * @length: The length of the data to hash.
+ *
+ * After calling xxh32_reset() call xxh32_update() as many times as necessary.
+ *
+ * Return: Zero on success, otherwise an error code.
+ */
+int xxh32_update(struct xxh32_state *state, const void *input, size_t length);
+
+/**
+ * xxh32_digest() - produce the current xxh32 hash
+ *
+ * @state: Produce the current xxh32 hash of this state.
+ *
+ * A hash value can be produced at any time. It is still possible to continue
+ * inserting input into the hash state after a call to xxh32_digest(), and
+ * generate new hashes later on, by calling xxh32_digest() again.
+ *
+ * Return: The xxh32 hash stored in the state.
+ */
+uint32_t xxh32_digest(const struct xxh32_state *state);
+
+/**
+ * xxh64_reset() - reset the xxh64 state to start a new hashing operation
+ *
+ * @state: The xxh64 state to reset.
+ * @seed: Initialize the hash state with this seed.
+ */
+void xxh64_reset(struct xxh64_state *state, uint64_t seed);
+
+/**
+ * xxh64_update() - hash the data given and update the xxh64 state
+ * @state: The xxh64 state to update.
+ * @input: The data to hash.
+ * @length: The length of the data to hash.
+ *
+ * After calling xxh64_reset() call xxh64_update() as many times as necessary.
+ *
+ * Return: Zero on success, otherwise an error code.
+ */
+int xxh64_update(struct xxh64_state *state, const void *input, size_t length);
+
+/**
+ * xxh64_digest() - produce the current xxh64 hash
+ *
+ * @state: Produce the current xxh64 hash of this state.
+ *
+ * A hash value can be produced at any time. It is still possible to continue
+ * inserting input into the hash state after a call to xxh64_digest(), and
+ * generate new hashes later on, by calling xxh64_digest() again.
+ *
+ * Return: The xxh64 hash stored in the state.
+ */
+uint64_t xxh64_digest(const struct xxh64_state *state);
+
+/*-**************************
+ * Utils
+ ***************************/
+
+/**
+ * xxh32_copy_state() - copy the source state into the destination state
+ *
+ * @src: The source xxh32 state.
+ * @dst: The destination xxh32 state.
+ */
+void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src);
+
+/**
+ * xxh64_copy_state() - copy the source state into the destination state
+ *
+ * @src: The source xxh64 state.
+ * @dst: The destination xxh64 state.
+ */
+void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src);
+
+#endif /* XXHASH_H */
diff --git a/include/linux/zstd.h b/include/linux/zstd.h
new file mode 100644
index 000000000000..249575e2485f
--- /dev/null
+++ b/include/linux/zstd.h
@@ -0,0 +1,1157 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+#ifndef ZSTD_H
+#define ZSTD_H
+
+/* ====== Dependency ======*/
+#include <linux/types.h> /* size_t */
+
+
+/*-*****************************************************************************
+ * Introduction
+ *
+ * zstd, short for Zstandard, is a fast lossless compression algorithm,
+ * targeting real-time compression scenarios at zlib-level and better
+ * compression ratios. The zstd compression library provides in-memory
+ * compression and decompression functions. The library supports compression
+ * levels from 1 up to ZSTD_maxCLevel() which is 22. Levels >= 20, labeled
+ * ultra, should be used with caution, as they require more memory.
+ * Compression can be done in:
+ * - a single step, reusing a context (described as Explicit memory management)
+ * - unbounded multiple steps (described as Streaming compression)
+ * The compression ratio achievable on small data can be highly improved using
+ * compression with a dictionary in:
+ * - a single step (described as Simple dictionary API)
+ * - a single step, reusing a dictionary (described as Fast dictionary API)
+ ******************************************************************************/
+
+/*====== Helper functions ======*/
+
+/**
+ * enum ZSTD_ErrorCode - zstd error codes
+ *
+ * Functions that return size_t can be checked for errors using ZSTD_isError()
+ * and the ZSTD_ErrorCode can be extracted using ZSTD_getErrorCode().
+ */
+typedef enum {
+ ZSTD_error_no_error,
+ ZSTD_error_GENERIC,
+ ZSTD_error_prefix_unknown,
+ ZSTD_error_version_unsupported,
+ ZSTD_error_parameter_unknown,
+ ZSTD_error_frameParameter_unsupported,
+ ZSTD_error_frameParameter_unsupportedBy32bits,
+ ZSTD_error_frameParameter_windowTooLarge,
+ ZSTD_error_compressionParameter_unsupported,
+ ZSTD_error_init_missing,
+ ZSTD_error_memory_allocation,
+ ZSTD_error_stage_wrong,
+ ZSTD_error_dstSize_tooSmall,
+ ZSTD_error_srcSize_wrong,
+ ZSTD_error_corruption_detected,
+ ZSTD_error_checksum_wrong,
+ ZSTD_error_tableLog_tooLarge,
+ ZSTD_error_maxSymbolValue_tooLarge,
+ ZSTD_error_maxSymbolValue_tooSmall,
+ ZSTD_error_dictionary_corrupted,
+ ZSTD_error_dictionary_wrong,
+ ZSTD_error_dictionaryCreation_failed,
+ ZSTD_error_maxCode
+} ZSTD_ErrorCode;
+
+/**
+ * ZSTD_maxCLevel() - maximum compression level available
+ *
+ * Return: Maximum compression level available.
+ */
+int ZSTD_maxCLevel(void);
+/**
+ * ZSTD_compressBound() - maximum compressed size in worst case scenario
+ * @srcSize: The size of the data to compress.
+ *
+ * Return: The maximum compressed size in the worst case scenario.
+ */
+size_t ZSTD_compressBound(size_t srcSize);
+/**
+ * ZSTD_isError() - tells if a size_t function result is an error code
+ * @code: The function result to check for error.
+ *
+ * Return: Non-zero iff the code is an error.
+ */
+static __attribute__((unused)) unsigned int ZSTD_isError(size_t code)
+{
+ return code > (size_t)-ZSTD_error_maxCode;
+}
+/**
+ * ZSTD_getErrorCode() - translates an error function result to a ZSTD_ErrorCode
+ * @functionResult: The result of a function for which ZSTD_isError() is true.
+ *
+ * Return: The ZSTD_ErrorCode corresponding to the functionResult or 0
+ * if the functionResult isn't an error.
+ */
+static __attribute__((unused)) ZSTD_ErrorCode ZSTD_getErrorCode(
+ size_t functionResult)
+{
+ if (!ZSTD_isError(functionResult))
+ return (ZSTD_ErrorCode)0;
+ return (ZSTD_ErrorCode)(0 - functionResult);
+}
+
+/**
+ * enum ZSTD_strategy - zstd compression search strategy
+ *
+ * From faster to stronger.
+ */
+typedef enum {
+ ZSTD_fast,
+ ZSTD_dfast,
+ ZSTD_greedy,
+ ZSTD_lazy,
+ ZSTD_lazy2,
+ ZSTD_btlazy2,
+ ZSTD_btopt,
+ ZSTD_btopt2
+} ZSTD_strategy;
+
+/**
+ * struct ZSTD_compressionParameters - zstd compression parameters
+ * @windowLog: Log of the largest match distance. Larger means more
+ * compression, and more memory needed during decompression.
+ * @chainLog: Fully searched segment. Larger means more compression, slower,
+ * and more memory (useless for fast).
+ * @hashLog: Dispatch table. Larger means more compression,
+ * slower, and more memory.
+ * @searchLog: Number of searches. Larger means more compression and slower.
+ * @searchLength: Match length searched. Larger means faster decompression,
+ * sometimes less compression.
+ * @targetLength: Acceptable match size for optimal parser (only). Larger means
+ * more compression, and slower.
+ * @strategy: The zstd compression strategy.
+ */
+typedef struct {
+ unsigned int windowLog;
+ unsigned int chainLog;
+ unsigned int hashLog;
+ unsigned int searchLog;
+ unsigned int searchLength;
+ unsigned int targetLength;
+ ZSTD_strategy strategy;
+} ZSTD_compressionParameters;
+
+/**
+ * struct ZSTD_frameParameters - zstd frame parameters
+ * @contentSizeFlag: Controls whether content size will be present in the frame
+ * header (when known).
+ * @checksumFlag: Controls whether a 32-bit checksum is generated at the end
+ * of the frame for error detection.
+ * @noDictIDFlag: Controls whether dictID will be saved into the frame header
+ * when using dictionary compression.
+ *
+ * The default value is all fields set to 0.
+ */
+typedef struct {
+ unsigned int contentSizeFlag;
+ unsigned int checksumFlag;
+ unsigned int noDictIDFlag;
+} ZSTD_frameParameters;
+
+/**
+ * struct ZSTD_parameters - zstd parameters
+ * @cParams: The compression parameters.
+ * @fParams: The frame parameters.
+ */
+typedef struct {
+ ZSTD_compressionParameters cParams;
+ ZSTD_frameParameters fParams;
+} ZSTD_parameters;
+
+/**
+ * ZSTD_getCParams() - returns ZSTD_compressionParameters for selected level
+ * @compressionLevel: The compression level from 1 to ZSTD_maxCLevel().
+ * @estimatedSrcSize: The estimated source size to compress or 0 if unknown.
+ * @dictSize: The dictionary size or 0 if a dictionary isn't being used.
+ *
+ * Return: The selected ZSTD_compressionParameters.
+ */
+ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel,
+ unsigned long long estimatedSrcSize, size_t dictSize);
+
+/**
+ * ZSTD_getParams() - returns ZSTD_parameters for selected level
+ * @compressionLevel: The compression level from 1 to ZSTD_maxCLevel().
+ * @estimatedSrcSize: The estimated source size to compress or 0 if unknown.
+ * @dictSize: The dictionary size or 0 if a dictionary isn't being used.
+ *
+ * The same as ZSTD_getCParams() except also selects the default frame
+ * parameters (all zero).
+ *
+ * Return: The selected ZSTD_parameters.
+ */
+ZSTD_parameters ZSTD_getParams(int compressionLevel,
+ unsigned long long estimatedSrcSize, size_t dictSize);
+
+/*-*************************************
+ * Explicit memory management
+ **************************************/
+
+/**
+ * ZSTD_CCtxWorkspaceBound() - amount of memory needed to initialize a ZSTD_CCtx
+ * @cParams: The compression parameters to be used for compression.
+ *
+ * If multiple compression parameters might be used, the caller must call
+ * ZSTD_CCtxWorkspaceBound() for each set of parameters and use the maximum
+ * size.
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initCCtx().
+ */
+size_t ZSTD_CCtxWorkspaceBound(ZSTD_compressionParameters cParams);
+
+/**
+ * struct ZSTD_CCtx - the zstd compression context
+ *
+ * When compressing many times it is recommended to allocate a context just once
+ * and reuse it for each successive compression operation.
+ */
+typedef struct ZSTD_CCtx_s ZSTD_CCtx;
+/**
+ * ZSTD_initCCtx() - initialize a zstd compression context
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace. Use ZSTD_CCtxWorkspaceBound() to
+ * determine how large the workspace must be.
+ *
+ * Return: A compression context emplaced into workspace.
+ */
+ZSTD_CCtx *ZSTD_initCCtx(void *workspace, size_t workspaceSize);
+
+/**
+ * ZSTD_compressCCtx() - compress src into dst
+ * @ctx: The context. Must have been initialized with a workspace at
+ * least as large as ZSTD_CCtxWorkspaceBound(params.cParams).
+ * @dst: The buffer to compress src into.
+ * @dstCapacity: The size of the destination buffer. May be any size, but
+ * ZSTD_compressBound(srcSize) is guaranteed to be large enough.
+ * @src: The data to compress.
+ * @srcSize: The size of the data to compress.
+ * @params: The parameters to use for compression. See ZSTD_getParams().
+ *
+ * Return: The compressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_compressCCtx(ZSTD_CCtx *ctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize, ZSTD_parameters params);
+
+/**
+ * ZSTD_DCtxWorkspaceBound() - amount of memory needed to initialize a ZSTD_DCtx
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initDCtx().
+ */
+size_t ZSTD_DCtxWorkspaceBound(void);
+
+/**
+ * struct ZSTD_DCtx - the zstd decompression context
+ *
+ * When decompressing many times it is recommended to allocate a context just
+ * once and reuse it for each successive decompression operation.
+ */
+typedef struct ZSTD_DCtx_s ZSTD_DCtx;
+/**
+ * ZSTD_initDCtx() - initialize a zstd decompression context
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace. Use ZSTD_DCtxWorkspaceBound() to
+ * determine how large the workspace must be.
+ *
+ * Return: A decompression context emplaced into workspace.
+ */
+ZSTD_DCtx *ZSTD_initDCtx(void *workspace, size_t workspaceSize);
+
+/**
+ * ZSTD_decompressDCtx() - decompress zstd compressed src into dst
+ * @ctx: The decompression context.
+ * @dst: The buffer to decompress src into.
+ * @dstCapacity: The size of the destination buffer. Must be at least as large
+ * as the decompressed size. If the caller cannot upper bound the
+ * decompressed size, then it's better to use the streaming API.
+ * @src: The zstd compressed data to decompress. Multiple concatenated
+ * frames and skippable frames are allowed.
+ * @srcSize: The exact size of the data to decompress.
+ *
+ * Return: The decompressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_decompressDCtx(ZSTD_DCtx *ctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+
+/*-************************
+ * Simple dictionary API
+ **************************/
+
+/**
+ * ZSTD_compress_usingDict() - compress src into dst using a dictionary
+ * @ctx: The context. Must have been initialized with a workspace at
+ * least as large as ZSTD_CCtxWorkspaceBound(params.cParams).
+ * @dst: The buffer to compress src into.
+ * @dstCapacity: The size of the destination buffer. May be any size, but
+ * ZSTD_compressBound(srcSize) is guaranteed to be large enough.
+ * @src: The data to compress.
+ * @srcSize: The size of the data to compress.
+ * @dict: The dictionary to use for compression.
+ * @dictSize: The size of the dictionary.
+ * @params: The parameters to use for compression. See ZSTD_getParams().
+ *
+ * Compression using a predefined dictionary. The same dictionary must be used
+ * during decompression.
+ *
+ * Return: The compressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_compress_usingDict(ZSTD_CCtx *ctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize, const void *dict, size_t dictSize,
+ ZSTD_parameters params);
+
+/**
+ * ZSTD_decompress_usingDict() - decompress src into dst using a dictionary
+ * @ctx: The decompression context.
+ * @dst: The buffer to decompress src into.
+ * @dstCapacity: The size of the destination buffer. Must be at least as large
+ * as the decompressed size. If the caller cannot upper bound the
+ * decompressed size, then it's better to use the streaming API.
+ * @src: The zstd compressed data to decompress. Multiple concatenated
+ * frames and skippable frames are allowed.
+ * @srcSize: The exact size of the data to decompress.
+ * @dict: The dictionary to use for decompression. The same dictionary
+ * must've been used to compress the data.
+ * @dictSize: The size of the dictionary.
+ *
+ * Return: The decompressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_decompress_usingDict(ZSTD_DCtx *ctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize, const void *dict, size_t dictSize);
+
+/*-**************************
+ * Fast dictionary API
+ ***************************/
+
+/**
+ * ZSTD_CDictWorkspaceBound() - memory needed to initialize a ZSTD_CDict
+ * @cParams: The compression parameters to be used for compression.
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initCDict().
+ */
+size_t ZSTD_CDictWorkspaceBound(ZSTD_compressionParameters cParams);
+
+/**
+ * struct ZSTD_CDict - a digested dictionary to be used for compression
+ */
+typedef struct ZSTD_CDict_s ZSTD_CDict;
+
+/**
+ * ZSTD_initCDict() - initialize a digested dictionary for compression
+ * @dictBuffer: The dictionary to digest. The buffer is referenced by the
+ * ZSTD_CDict so it must outlive the returned ZSTD_CDict.
+ * @dictSize: The size of the dictionary.
+ * @params: The parameters to use for compression. See ZSTD_getParams().
+ * @workspace: The workspace. It must outlive the returned ZSTD_CDict.
+ * @workspaceSize: The workspace size. Must be at least
+ * ZSTD_CDictWorkspaceBound(params.cParams).
+ *
+ * When compressing multiple messages / blocks with the same dictionary it is
+ * recommended to load it just once. The ZSTD_CDict merely references the
+ * dictBuffer, so it must outlive the returned ZSTD_CDict.
+ *
+ * Return: The digested dictionary emplaced into workspace.
+ */
+ZSTD_CDict *ZSTD_initCDict(const void *dictBuffer, size_t dictSize,
+ ZSTD_parameters params, void *workspace, size_t workspaceSize);
+
+/**
+ * ZSTD_compress_usingCDict() - compress src into dst using a ZSTD_CDict
+ * @ctx: The context. Must have been initialized with a workspace at
+ * least as large as ZSTD_CCtxWorkspaceBound(cParams) where
+ * cParams are the compression parameters used to initialize the
+ * cdict.
+ * @dst: The buffer to compress src into.
+ * @dstCapacity: The size of the destination buffer. May be any size, but
+ * ZSTD_compressBound(srcSize) is guaranteed to be large enough.
+ * @src: The data to compress.
+ * @srcSize: The size of the data to compress.
+ * @cdict: The digested dictionary to use for compression.
+ * @params: The parameters to use for compression. See ZSTD_getParams().
+ *
+ * Compression using a digested dictionary. The same dictionary must be used
+ * during decompression.
+ *
+ * Return: The compressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_compress_usingCDict(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize, const ZSTD_CDict *cdict);
+
+
+/**
+ * ZSTD_DDictWorkspaceBound() - memory needed to initialize a ZSTD_DDict
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initDDict().
+ */
+size_t ZSTD_DDictWorkspaceBound(void);
+
+/**
+ * struct ZSTD_DDict - a digested dictionary to be used for decompression
+ */
+typedef struct ZSTD_DDict_s ZSTD_DDict;
+
+/**
+ * ZSTD_initDDict() - initialize a digested dictionary for decompression
+ * @dictBuffer: The dictionary to digest. The buffer is referenced by the
+ * ZSTD_DDict so it must outlive the returned ZSTD_DDict.
+ * @dictSize: The size of the dictionary.
+ * @workspace: The workspace. It must outlive the returned ZSTD_DDict.
+ * @workspaceSize: The workspace size. Must be at least
+ * ZSTD_DDictWorkspaceBound().
+ *
+ * When decompressing multiple messages / blocks with the same dictionary it is
+ * recommended to load it just once. The ZSTD_DDict merely references the
+ * dictBuffer, so it must outlive the returned ZSTD_DDict.
+ *
+ * Return: The digested dictionary emplaced into workspace.
+ */
+ZSTD_DDict *ZSTD_initDDict(const void *dictBuffer, size_t dictSize,
+ void *workspace, size_t workspaceSize);
+
+/**
+ * ZSTD_decompress_usingDDict() - decompress src into dst using a ZSTD_DDict
+ * @ctx: The decompression context.
+ * @dst: The buffer to decompress src into.
+ * @dstCapacity: The size of the destination buffer. Must be at least as large
+ * as the decompressed size. If the caller cannot upper bound the
+ * decompressed size, then it's better to use the streaming API.
+ * @src: The zstd compressed data to decompress. Multiple concatenated
+ * frames and skippable frames are allowed.
+ * @srcSize: The exact size of the data to decompress.
+ * @ddict: The digested dictionary to use for decompression. The same
+ * dictionary must've been used to compress the data.
+ *
+ * Return: The decompressed size or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_decompress_usingDDict(ZSTD_DCtx *dctx, void *dst,
+ size_t dstCapacity, const void *src, size_t srcSize,
+ const ZSTD_DDict *ddict);
+
+
+/*-**************************
+ * Streaming
+ ***************************/
+
+/**
+ * struct ZSTD_inBuffer - input buffer for streaming
+ * @src: Start of the input buffer.
+ * @size: Size of the input buffer.
+ * @pos: Position where reading stopped. Will be updated.
+ * Necessarily 0 <= pos <= size.
+ */
+typedef struct ZSTD_inBuffer_s {
+ const void *src;
+ size_t size;
+ size_t pos;
+} ZSTD_inBuffer;
+
+/**
+ * struct ZSTD_outBuffer - output buffer for streaming
+ * @dst: Start of the output buffer.
+ * @size: Size of the output buffer.
+ * @pos: Position where writing stopped. Will be updated.
+ * Necessarily 0 <= pos <= size.
+ */
+typedef struct ZSTD_outBuffer_s {
+ void *dst;
+ size_t size;
+ size_t pos;
+} ZSTD_outBuffer;
+
+
+
+/*-*****************************************************************************
+ * Streaming compression - HowTo
+ *
+ * A ZSTD_CStream object is required to track streaming operation.
+ * Use ZSTD_initCStream() to initialize a ZSTD_CStream object.
+ * ZSTD_CStream objects can be reused multiple times on consecutive compression
+ * operations. It is recommended to re-use ZSTD_CStream in situations where many
+ * streaming operations will be achieved consecutively. Use one separate
+ * ZSTD_CStream per thread for parallel execution.
+ *
+ * Use ZSTD_compressStream() repetitively to consume input stream.
+ * The function will automatically update both `pos` fields.
+ * Note that it may not consume the entire input, in which case `pos < size`,
+ * and it's up to the caller to present again remaining data.
+ * It returns a hint for the preferred number of bytes to use as an input for
+ * the next function call.
+ *
+ * At any moment, it's possible to flush whatever data remains within internal
+ * buffer, using ZSTD_flushStream(). `output->pos` will be updated. There might
+ * still be some content left within the internal buffer if `output->size` is
+ * too small. It returns the number of bytes left in the internal buffer and
+ * must be called until it returns 0.
+ *
+ * ZSTD_endStream() instructs to finish a frame. It will perform a flush and
+ * write frame epilogue. The epilogue is required for decoders to consider a
+ * frame completed. Similar to ZSTD_flushStream(), it may not be able to flush
+ * the full content if `output->size` is too small. In which case, call again
+ * ZSTD_endStream() to complete the flush. It returns the number of bytes left
+ * in the internal buffer and must be called until it returns 0.
+ ******************************************************************************/
+
+/**
+ * ZSTD_CStreamWorkspaceBound() - memory needed to initialize a ZSTD_CStream
+ * @cParams: The compression parameters to be used for compression.
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initCStream() and ZSTD_initCStream_usingCDict().
+ */
+size_t ZSTD_CStreamWorkspaceBound(ZSTD_compressionParameters cParams);
+
+/**
+ * struct ZSTD_CStream - the zstd streaming compression context
+ */
+typedef struct ZSTD_CStream_s ZSTD_CStream;
+
+/*===== ZSTD_CStream management functions =====*/
+/**
+ * ZSTD_initCStream() - initialize a zstd streaming compression context
+ * @params: The zstd compression parameters.
+ * @pledgedSrcSize: If params.fParams.contentSizeFlag == 1 then the caller must
+ * pass the source size (zero means empty source). Otherwise,
+ * the caller may optionally pass the source size, or zero if
+ * unknown.
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace.
+ * Use ZSTD_CStreamWorkspaceBound(params.cParams) to determine
+ * how large the workspace must be.
+ *
+ * Return: The zstd streaming compression context.
+ */
+ZSTD_CStream *ZSTD_initCStream(ZSTD_parameters params,
+ unsigned long long pledgedSrcSize, void *workspace,
+ size_t workspaceSize);
+
+/**
+ * ZSTD_initCStream_usingCDict() - initialize a streaming compression context
+ * @cdict: The digested dictionary to use for compression.
+ * @pledgedSrcSize: Optionally the source size, or zero if unknown.
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace. Call ZSTD_CStreamWorkspaceBound()
+ * with the cParams used to initialize the cdict to determine
+ * how large the workspace must be.
+ *
+ * Return: The zstd streaming compression context.
+ */
+ZSTD_CStream *ZSTD_initCStream_usingCDict(const ZSTD_CDict *cdict,
+ unsigned long long pledgedSrcSize, void *workspace,
+ size_t workspaceSize);
+
+/*===== Streaming compression functions =====*/
+/**
+ * ZSTD_resetCStream() - reset the context using parameters from creation
+ * @zcs: The zstd streaming compression context to reset.
+ * @pledgedSrcSize: Optionally the source size, or zero if unknown.
+ *
+ * Resets the context using the parameters from creation. Skips dictionary
+ * loading, since it can be reused. If `pledgedSrcSize` is non-zero the frame
+ * content size is always written into the frame header.
+ *
+ * Return: Zero or an error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_resetCStream(ZSTD_CStream *zcs, unsigned long long pledgedSrcSize);
+/**
+ * ZSTD_compressStream() - streaming compress some of input into output
+ * @zcs: The zstd streaming compression context.
+ * @output: Destination buffer. `output->pos` is updated to indicate how much
+ * compressed data was written.
+ * @input: Source buffer. `input->pos` is updated to indicate how much data was
+ * read. Note that it may not consume the entire input, in which case
+ * `input->pos < input->size`, and it's up to the caller to present
+ * remaining data again.
+ *
+ * The `input` and `output` buffers may be any size. Guaranteed to make some
+ * forward progress if `input` and `output` are not empty.
+ *
+ * Return: A hint for the number of bytes to use as the input for the next
+ * function call or an error, which can be checked using
+ * ZSTD_isError().
+ */
+size_t ZSTD_compressStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output,
+ ZSTD_inBuffer *input);
+/**
+ * ZSTD_flushStream() - flush internal buffers into output
+ * @zcs: The zstd streaming compression context.
+ * @output: Destination buffer. `output->pos` is updated to indicate how much
+ * compressed data was written.
+ *
+ * ZSTD_flushStream() must be called until it returns 0, meaning all the data
+ * has been flushed. Since ZSTD_flushStream() causes a block to be ended,
+ * calling it too often will degrade the compression ratio.
+ *
+ * Return: The number of bytes still present within internal buffers or an
+ * error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_flushStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output);
+/**
+ * ZSTD_endStream() - flush internal buffers into output and end the frame
+ * @zcs: The zstd streaming compression context.
+ * @output: Destination buffer. `output->pos` is updated to indicate how much
+ * compressed data was written.
+ *
+ * ZSTD_endStream() must be called until it returns 0, meaning all the data has
+ * been flushed and the frame epilogue has been written.
+ *
+ * Return: The number of bytes still present within internal buffers or an
+ * error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_endStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output);
+
+/**
+ * ZSTD_CStreamInSize() - recommended size for the input buffer
+ *
+ * Return: The recommended size for the input buffer.
+ */
+size_t ZSTD_CStreamInSize(void);
+/**
+ * ZSTD_CStreamOutSize() - recommended size for the output buffer
+ *
+ * When the output buffer is at least this large, it is guaranteed to be large
+ * enough to flush at least one complete compressed block.
+ *
+ * Return: The recommended size for the output buffer.
+ */
+size_t ZSTD_CStreamOutSize(void);
+
+
+
+/*-*****************************************************************************
+ * Streaming decompression - HowTo
+ *
+ * A ZSTD_DStream object is required to track streaming operations.
+ * Use ZSTD_initDStream() to initialize a ZSTD_DStream object.
+ * ZSTD_DStream objects can be re-used multiple times.
+ *
+ * Use ZSTD_decompressStream() repetitively to consume your input.
+ * The function will update both `pos` fields.
+ * If `input->pos < input->size`, some input has not been consumed.
+ * It's up to the caller to present again remaining data.
+ * If `output->pos < output->size`, decoder has flushed everything it could.
+ * Returns 0 iff a frame is completely decoded and fully flushed.
+ * Otherwise it returns a suggested next input size that will never load more
+ * than the current frame.
+ ******************************************************************************/
+
+/**
+ * ZSTD_DStreamWorkspaceBound() - memory needed to initialize a ZSTD_DStream
+ * @maxWindowSize: The maximum window size allowed for compressed frames.
+ *
+ * Return: A lower bound on the size of the workspace that is passed to
+ * ZSTD_initDStream() and ZSTD_initDStream_usingDDict().
+ */
+size_t ZSTD_DStreamWorkspaceBound(size_t maxWindowSize);
+
+/**
+ * struct ZSTD_DStream - the zstd streaming decompression context
+ */
+typedef struct ZSTD_DStream_s ZSTD_DStream;
+/*===== ZSTD_DStream management functions =====*/
+/**
+ * ZSTD_initDStream() - initialize a zstd streaming decompression context
+ * @maxWindowSize: The maximum window size allowed for compressed frames.
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace.
+ * Use ZSTD_DStreamWorkspaceBound(maxWindowSize) to determine
+ * how large the workspace must be.
+ *
+ * Return: The zstd streaming decompression context.
+ */
+ZSTD_DStream *ZSTD_initDStream(size_t maxWindowSize, void *workspace,
+ size_t workspaceSize);
+/**
+ * ZSTD_initDStream_usingDDict() - initialize streaming decompression context
+ * @maxWindowSize: The maximum window size allowed for compressed frames.
+ * @ddict: The digested dictionary to use for decompression.
+ * @workspace: The workspace to emplace the context into. It must outlive
+ * the returned context.
+ * @workspaceSize: The size of workspace.
+ * Use ZSTD_DStreamWorkspaceBound(maxWindowSize) to determine
+ * how large the workspace must be.
+ *
+ * Return: The zstd streaming decompression context.
+ */
+ZSTD_DStream *ZSTD_initDStream_usingDDict(size_t maxWindowSize,
+ const ZSTD_DDict *ddict, void *workspace, size_t workspaceSize);
+
+/*===== Streaming decompression functions =====*/
+/**
+ * ZSTD_resetDStream() - reset the context using parameters from creation
+ * @zds: The zstd streaming decompression context to reset.
+ *
+ * Resets the context using the parameters from creation. Skips dictionary
+ * loading, since it can be reused.
+ *
+ * Return: Zero or an error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_resetDStream(ZSTD_DStream *zds);
+/**
+ * ZSTD_decompressStream() - streaming decompress some of input into output
+ * @zds: The zstd streaming decompression context.
+ * @output: Destination buffer. `output.pos` is updated to indicate how much
+ * decompressed data was written.
+ * @input: Source buffer. `input.pos` is updated to indicate how much data was
+ * read. Note that it may not consume the entire input, in which case
+ * `input.pos < input.size`, and it's up to the caller to present
+ * remaining data again.
+ *
+ * The `input` and `output` buffers may be any size. Guaranteed to make some
+ * forward progress if `input` and `output` are not empty.
+ * ZSTD_decompressStream() will not consume the last byte of the frame until
+ * the entire frame is flushed.
+ *
+ * Return: Returns 0 iff a frame is completely decoded and fully flushed.
+ * Otherwise returns a hint for the number of bytes to use as the input
+ * for the next function call or an error, which can be checked using
+ * ZSTD_isError(). The size hint will never load more than the frame.
+ */
+size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output,
+ ZSTD_inBuffer *input);
+
+/**
+ * ZSTD_DStreamInSize() - recommended size for the input buffer
+ *
+ * Return: The recommended size for the input buffer.
+ */
+size_t ZSTD_DStreamInSize(void);
+/**
+ * ZSTD_DStreamOutSize() - recommended size for the output buffer
+ *
+ * When the output buffer is at least this large, it is guaranteed to be large
+ * enough to flush at least one complete decompressed block.
+ *
+ * Return: The recommended size for the output buffer.
+ */
+size_t ZSTD_DStreamOutSize(void);
+
+
+/* --- Constants ---*/
+#define ZSTD_MAGICNUMBER 0xFD2FB528 /* >= v0.8.0 */
+#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50U
+
+#define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1)
+#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
+
+#define ZSTD_WINDOWLOG_MAX_32 27
+#define ZSTD_WINDOWLOG_MAX_64 27
+#define ZSTD_WINDOWLOG_MAX \
+ ((unsigned int)(sizeof(size_t) == 4 \
+ ? ZSTD_WINDOWLOG_MAX_32 \
+ : ZSTD_WINDOWLOG_MAX_64))
+#define ZSTD_WINDOWLOG_MIN 10
+#define ZSTD_HASHLOG_MAX ZSTD_WINDOWLOG_MAX
+#define ZSTD_HASHLOG_MIN 6
+#define ZSTD_CHAINLOG_MAX (ZSTD_WINDOWLOG_MAX+1)
+#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN
+#define ZSTD_HASHLOG3_MAX 17
+#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1)
+#define ZSTD_SEARCHLOG_MIN 1
+/* only for ZSTD_fast, other strategies are limited to 6 */
+#define ZSTD_SEARCHLENGTH_MAX 7
+/* only for ZSTD_btopt, other strategies are limited to 4 */
+#define ZSTD_SEARCHLENGTH_MIN 3
+#define ZSTD_TARGETLENGTH_MIN 4
+#define ZSTD_TARGETLENGTH_MAX 999
+
+/* for static allocation */
+#define ZSTD_FRAMEHEADERSIZE_MAX 18
+#define ZSTD_FRAMEHEADERSIZE_MIN 6
+static const size_t ZSTD_frameHeaderSize_prefix = 5;
+static const size_t ZSTD_frameHeaderSize_min = ZSTD_FRAMEHEADERSIZE_MIN;
+static const size_t ZSTD_frameHeaderSize_max = ZSTD_FRAMEHEADERSIZE_MAX;
+/* magic number + skippable frame length */
+static const size_t ZSTD_skippableHeaderSize = 8;
+
+
+/*-*************************************
+ * Compressed size functions
+ **************************************/
+
+/**
+ * ZSTD_findFrameCompressedSize() - returns the size of a compressed frame
+ * @src: Source buffer. It should point to the start of a zstd encoded frame
+ * or a skippable frame.
+ * @srcSize: The size of the source buffer. It must be at least as large as the
+ * size of the frame.
+ *
+ * Return: The compressed size of the frame pointed to by `src` or an error,
+ * which can be check with ZSTD_isError().
+ * Suitable to pass to ZSTD_decompress() or similar functions.
+ */
+size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize);
+
+/*-*************************************
+ * Decompressed size functions
+ **************************************/
+/**
+ * ZSTD_getFrameContentSize() - returns the content size in a zstd frame header
+ * @src: It should point to the start of a zstd encoded frame.
+ * @srcSize: The size of the source buffer. It must be at least as large as the
+ * frame header. `ZSTD_frameHeaderSize_max` is always large enough.
+ *
+ * Return: The frame content size stored in the frame header if known.
+ * `ZSTD_CONTENTSIZE_UNKNOWN` if the content size isn't stored in the
+ * frame header. `ZSTD_CONTENTSIZE_ERROR` on invalid input.
+ */
+unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize);
+
+/**
+ * ZSTD_findDecompressedSize() - returns decompressed size of a series of frames
+ * @src: It should point to the start of a series of zstd encoded and/or
+ * skippable frames.
+ * @srcSize: The exact size of the series of frames.
+ *
+ * If any zstd encoded frame in the series doesn't have the frame content size
+ * set, `ZSTD_CONTENTSIZE_UNKNOWN` is returned. But frame content size is always
+ * set when using ZSTD_compress(). The decompressed size can be very large.
+ * If the source is untrusted, the decompressed size could be wrong or
+ * intentionally modified. Always ensure the result fits within the
+ * application's authorized limits. ZSTD_findDecompressedSize() handles multiple
+ * frames, and so it must traverse the input to read each frame header. This is
+ * efficient as most of the data is skipped, however it does mean that all frame
+ * data must be present and valid.
+ *
+ * Return: Decompressed size of all the data contained in the frames if known.
+ * `ZSTD_CONTENTSIZE_UNKNOWN` if the decompressed size is unknown.
+ * `ZSTD_CONTENTSIZE_ERROR` if an error occurred.
+ */
+unsigned long long ZSTD_findDecompressedSize(const void *src, size_t srcSize);
+
+/*-*************************************
+ * Advanced compression functions
+ **************************************/
+/**
+ * ZSTD_checkCParams() - ensure parameter values remain within authorized range
+ * @cParams: The zstd compression parameters.
+ *
+ * Return: Zero or an error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams);
+
+/**
+ * ZSTD_adjustCParams() - optimize parameters for a given srcSize and dictSize
+ * @srcSize: Optionally the estimated source size, or zero if unknown.
+ * @dictSize: Optionally the estimated dictionary size, or zero if unknown.
+ *
+ * Return: The optimized parameters.
+ */
+ZSTD_compressionParameters ZSTD_adjustCParams(
+ ZSTD_compressionParameters cParams, unsigned long long srcSize,
+ size_t dictSize);
+
+/*--- Advanced decompression functions ---*/
+
+/**
+ * ZSTD_isFrame() - returns true iff the buffer starts with a valid frame
+ * @buffer: The source buffer to check.
+ * @size: The size of the source buffer, must be at least 4 bytes.
+ *
+ * Return: True iff the buffer starts with a zstd or skippable frame identifier.
+ */
+unsigned int ZSTD_isFrame(const void *buffer, size_t size);
+
+/**
+ * ZSTD_getDictID_fromDict() - returns the dictionary id stored in a dictionary
+ * @dict: The dictionary buffer.
+ * @dictSize: The size of the dictionary buffer.
+ *
+ * Return: The dictionary id stored within the dictionary or 0 if the
+ * dictionary is not a zstd dictionary. If it returns 0 the
+ * dictionary can still be loaded as a content-only dictionary.
+ */
+unsigned int ZSTD_getDictID_fromDict(const void *dict, size_t dictSize);
+
+/**
+ * ZSTD_getDictID_fromDDict() - returns the dictionary id stored in a ZSTD_DDict
+ * @ddict: The ddict to find the id of.
+ *
+ * Return: The dictionary id stored within `ddict` or 0 if the dictionary is not
+ * a zstd dictionary. If it returns 0 `ddict` will be loaded as a
+ * content-only dictionary.
+ */
+unsigned int ZSTD_getDictID_fromDDict(const ZSTD_DDict *ddict);
+
+/**
+ * ZSTD_getDictID_fromFrame() - returns the dictionary id stored in a zstd frame
+ * @src: Source buffer. It must be a zstd encoded frame.
+ * @srcSize: The size of the source buffer. It must be at least as large as the
+ * frame header. `ZSTD_frameHeaderSize_max` is always large enough.
+ *
+ * Return: The dictionary id required to decompress the frame stored within
+ * `src` or 0 if the dictionary id could not be decoded. It can return
+ * 0 if the frame does not require a dictionary, the dictionary id
+ * wasn't stored in the frame, `src` is not a zstd frame, or `srcSize`
+ * is too small.
+ */
+unsigned int ZSTD_getDictID_fromFrame(const void *src, size_t srcSize);
+
+/**
+ * struct ZSTD_frameParams - zstd frame parameters stored in the frame header
+ * @frameContentSize: The frame content size, or 0 if not present.
+ * @windowSize: The window size, or 0 if the frame is a skippable frame.
+ * @dictID: The dictionary id, or 0 if not present.
+ * @checksumFlag: Whether a checksum was used.
+ */
+typedef struct {
+ unsigned long long frameContentSize;
+ unsigned int windowSize;
+ unsigned int dictID;
+ unsigned int checksumFlag;
+} ZSTD_frameParams;
+
+/**
+ * ZSTD_getFrameParams() - extracts parameters from a zstd or skippable frame
+ * @fparamsPtr: On success the frame parameters are written here.
+ * @src: The source buffer. It must point to a zstd or skippable frame.
+ * @srcSize: The size of the source buffer. `ZSTD_frameHeaderSize_max` is
+ * always large enough to succeed.
+ *
+ * Return: 0 on success. If more data is required it returns how many bytes
+ * must be provided to make forward progress. Otherwise it returns
+ * an error, which can be checked using ZSTD_isError().
+ */
+size_t ZSTD_getFrameParams(ZSTD_frameParams *fparamsPtr, const void *src,
+ size_t srcSize);
+
+/*-*****************************************************************************
+ * Buffer-less and synchronous inner streaming functions
+ *
+ * This is an advanced API, giving full control over buffer management, for
+ * users which need direct control over memory.
+ * But it's also a complex one, with many restrictions (documented below).
+ * Prefer using normal streaming API for an easier experience
+ ******************************************************************************/
+
+/*-*****************************************************************************
+ * Buffer-less streaming compression (synchronous mode)
+ *
+ * A ZSTD_CCtx object is required to track streaming operations.
+ * Use ZSTD_initCCtx() to initialize a context.
+ * ZSTD_CCtx object can be re-used multiple times within successive compression
+ * operations.
+ *
+ * Start by initializing a context.
+ * Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary
+ * compression,
+ * or ZSTD_compressBegin_advanced(), for finer parameter control.
+ * It's also possible to duplicate a reference context which has already been
+ * initialized, using ZSTD_copyCCtx()
+ *
+ * Then, consume your input using ZSTD_compressContinue().
+ * There are some important considerations to keep in mind when using this
+ * advanced function :
+ * - ZSTD_compressContinue() has no internal buffer. It uses externally provided
+ * buffer only.
+ * - Interface is synchronous : input is consumed entirely and produce 1+
+ * (or more) compressed blocks.
+ * - Caller must ensure there is enough space in `dst` to store compressed data
+ * under worst case scenario. Worst case evaluation is provided by
+ * ZSTD_compressBound().
+ * ZSTD_compressContinue() doesn't guarantee recover after a failed
+ * compression.
+ * - ZSTD_compressContinue() presumes prior input ***is still accessible and
+ * unmodified*** (up to maximum distance size, see WindowLog).
+ * It remembers all previous contiguous blocks, plus one separated memory
+ * segment (which can itself consists of multiple contiguous blocks)
+ * - ZSTD_compressContinue() detects that prior input has been overwritten when
+ * `src` buffer overlaps. In which case, it will "discard" the relevant memory
+ * section from its history.
+ *
+ * Finish a frame with ZSTD_compressEnd(), which will write the last block(s)
+ * and optional checksum. It's possible to use srcSize==0, in which case, it
+ * will write a final empty block to end the frame. Without last block mark,
+ * frames will be considered unfinished (corrupted) by decoders.
+ *
+ * `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress some new
+ * frame.
+ ******************************************************************************/
+
+/*===== Buffer-less streaming compression functions =====*/
+size_t ZSTD_compressBegin(ZSTD_CCtx *cctx, int compressionLevel);
+size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx *cctx, const void *dict,
+ size_t dictSize, int compressionLevel);
+size_t ZSTD_compressBegin_advanced(ZSTD_CCtx *cctx, const void *dict,
+ size_t dictSize, ZSTD_parameters params,
+ unsigned long long pledgedSrcSize);
+size_t ZSTD_copyCCtx(ZSTD_CCtx *cctx, const ZSTD_CCtx *preparedCCtx,
+ unsigned long long pledgedSrcSize);
+size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx *cctx, const ZSTD_CDict *cdict,
+ unsigned long long pledgedSrcSize);
+size_t ZSTD_compressContinue(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+size_t ZSTD_compressEnd(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+
+
+
+/*-*****************************************************************************
+ * Buffer-less streaming decompression (synchronous mode)
+ *
+ * A ZSTD_DCtx object is required to track streaming operations.
+ * Use ZSTD_initDCtx() to initialize a context.
+ * A ZSTD_DCtx object can be re-used multiple times.
+ *
+ * First typical operation is to retrieve frame parameters, using
+ * ZSTD_getFrameParams(). It fills a ZSTD_frameParams structure which provide
+ * important information to correctly decode the frame, such as the minimum
+ * rolling buffer size to allocate to decompress data (`windowSize`), and the
+ * dictionary ID used.
+ * Note: content size is optional, it may not be present. 0 means unknown.
+ * Note that these values could be wrong, either because of data malformation,
+ * or because an attacker is spoofing deliberate false information. As a
+ * consequence, check that values remain within valid application range,
+ * especially `windowSize`, before allocation. Each application can set its own
+ * limit, depending on local restrictions. For extended interoperability, it is
+ * recommended to support at least 8 MB.
+ * Frame parameters are extracted from the beginning of the compressed frame.
+ * Data fragment must be large enough to ensure successful decoding, typically
+ * `ZSTD_frameHeaderSize_max` bytes.
+ * Result: 0: successful decoding, the `ZSTD_frameParams` structure is filled.
+ * >0: `srcSize` is too small, provide at least this many bytes.
+ * errorCode, which can be tested using ZSTD_isError().
+ *
+ * Start decompression, with ZSTD_decompressBegin() or
+ * ZSTD_decompressBegin_usingDict(). Alternatively, you can copy a prepared
+ * context, using ZSTD_copyDCtx().
+ *
+ * Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue()
+ * alternatively.
+ * ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize'
+ * to ZSTD_decompressContinue().
+ * ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will
+ * fail.
+ *
+ * The result of ZSTD_decompressContinue() is the number of bytes regenerated
+ * within 'dst' (necessarily <= dstCapacity). It can be zero, which is not an
+ * error; it just means ZSTD_decompressContinue() has decoded some metadata
+ * item. It can also be an error code, which can be tested with ZSTD_isError().
+ *
+ * ZSTD_decompressContinue() needs previous data blocks during decompression, up
+ * to `windowSize`. They should preferably be located contiguously, prior to
+ * current block. Alternatively, a round buffer of sufficient size is also
+ * possible. Sufficient size is determined by frame parameters.
+ * ZSTD_decompressContinue() is very sensitive to contiguity, if 2 blocks don't
+ * follow each other, make sure that either the compressor breaks contiguity at
+ * the same place, or that previous contiguous segment is large enough to
+ * properly handle maximum back-reference.
+ *
+ * A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
+ * Context can then be reset to start a new decompression.
+ *
+ * Note: it's possible to know if next input to present is a header or a block,
+ * using ZSTD_nextInputType(). This information is not required to properly
+ * decode a frame.
+ *
+ * == Special case: skippable frames ==
+ *
+ * Skippable frames allow integration of user-defined data into a flow of
+ * concatenated frames. Skippable frames will be ignored (skipped) by a
+ * decompressor. The format of skippable frames is as follows:
+ * a) Skippable frame ID - 4 Bytes, Little endian format, any value from
+ * 0x184D2A50 to 0x184D2A5F
+ * b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
+ * c) Frame Content - any content (User Data) of length equal to Frame Size
+ * For skippable frames ZSTD_decompressContinue() always returns 0.
+ * For skippable frames ZSTD_getFrameParams() returns fparamsPtr->windowLog==0
+ * what means that a frame is skippable.
+ * Note: If fparamsPtr->frameContentSize==0, it is ambiguous: the frame might
+ * actually be a zstd encoded frame with no content. For purposes of
+ * decompression, it is valid in both cases to skip the frame using
+ * ZSTD_findFrameCompressedSize() to find its size in bytes.
+ * It also returns frame size as fparamsPtr->frameContentSize.
+ ******************************************************************************/
+
+/*===== Buffer-less streaming decompression functions =====*/
+size_t ZSTD_decompressBegin(ZSTD_DCtx *dctx);
+size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx *dctx, const void *dict,
+ size_t dictSize);
+void ZSTD_copyDCtx(ZSTD_DCtx *dctx, const ZSTD_DCtx *preparedDCtx);
+size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx *dctx);
+size_t ZSTD_decompressContinue(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+typedef enum {
+ ZSTDnit_frameHeader,
+ ZSTDnit_blockHeader,
+ ZSTDnit_block,
+ ZSTDnit_lastBlock,
+ ZSTDnit_checksum,
+ ZSTDnit_skippableFrame
+} ZSTD_nextInputType_e;
+ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx *dctx);
+
+/*-*****************************************************************************
+ * Block functions
+ *
+ * Block functions produce and decode raw zstd blocks, without frame metadata.
+ * Frame metadata cost is typically ~18 bytes, which can be non-negligible for
+ * very small blocks (< 100 bytes). User will have to take in charge required
+ * information to regenerate data, such as compressed and content sizes.
+ *
+ * A few rules to respect:
+ * - Compressing and decompressing require a context structure
+ * + Use ZSTD_initCCtx() and ZSTD_initDCtx()
+ * - It is necessary to init context before starting
+ * + compression : ZSTD_compressBegin()
+ * + decompression : ZSTD_decompressBegin()
+ * + variants _usingDict() are also allowed
+ * + copyCCtx() and copyDCtx() work too
+ * - Block size is limited, it must be <= ZSTD_getBlockSizeMax()
+ * + If you need to compress more, cut data into multiple blocks
+ * + Consider using the regular ZSTD_compress() instead, as frame metadata
+ * costs become negligible when source size is large.
+ * - When a block is considered not compressible enough, ZSTD_compressBlock()
+ * result will be zero. In which case, nothing is produced into `dst`.
+ * + User must test for such outcome and deal directly with uncompressed data
+ * + ZSTD_decompressBlock() doesn't accept uncompressed data as input!!!
+ * + In case of multiple successive blocks, decoder must be informed of
+ * uncompressed block existence to follow proper history. Use
+ * ZSTD_insertBlock() in such a case.
+ ******************************************************************************/
+
+/* Define for static allocation */
+#define ZSTD_BLOCKSIZE_ABSOLUTEMAX (128 * 1024)
+/*===== Raw zstd block functions =====*/
+size_t ZSTD_getBlockSizeMax(ZSTD_CCtx *cctx);
+size_t ZSTD_compressBlock(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+size_t ZSTD_decompressBlock(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity,
+ const void *src, size_t srcSize);
+size_t ZSTD_insertBlock(ZSTD_DCtx *dctx, const void *blockStart,
+ size_t blockSize);
+
+#endif /* ZSTD_H */
diff --git a/include/net/act_api.h b/include/net/act_api.h
index 8f3d5d8b5ae0..b944e0eb93be 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -34,7 +34,6 @@ struct tc_action {
struct gnet_stats_queue tcfa_qstats;
struct net_rate_estimator __rcu *tcfa_rate_est;
spinlock_t tcfa_lock;
- struct rcu_head tcfa_rcu;
struct gnet_stats_basic_cpu __percpu *cpu_bstats;
struct gnet_stats_queue __percpu *cpu_qstats;
struct tc_cookie *act_cookie;
@@ -50,7 +49,6 @@ struct tc_action {
#define tcf_qstats common.tcfa_qstats
#define tcf_rate_est common.tcfa_rate_est
#define tcf_lock common.tcfa_lock
-#define tcf_rcu common.tcfa_rcu
/* Update lastuse only if needed, to avoid dirtying a cache line.
* We use a temp variable to avoid fetching jiffies twice.
diff --git a/include/net/dst.h b/include/net/dst.h
index 93568bd0a352..06a6765da074 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -271,7 +271,7 @@ static inline void dst_use_noref(struct dst_entry *dst, unsigned long time)
static inline struct dst_entry *dst_clone(struct dst_entry *dst)
{
if (dst)
- atomic_inc(&dst->__refcnt);
+ dst_hold(dst);
return dst;
}
@@ -312,21 +312,6 @@ static inline void skb_dst_copy(struct sk_buff *nskb, const struct sk_buff *oskb
}
/**
- * skb_dst_force - makes sure skb dst is refcounted
- * @skb: buffer
- *
- * If dst is not yet refcounted, let's do it
- */
-static inline void skb_dst_force(struct sk_buff *skb)
-{
- if (skb_dst_is_noref(skb)) {
- WARN_ON(!rcu_read_lock_held());
- skb->_skb_refdst &= ~SKB_DST_NOREF;
- dst_clone(skb_dst(skb));
- }
-}
-
-/**
* dst_hold_safe - Take a reference on a dst if possible
* @dst: pointer to dst entry
*
@@ -339,16 +324,17 @@ static inline bool dst_hold_safe(struct dst_entry *dst)
}
/**
- * skb_dst_force_safe - makes sure skb dst is refcounted
+ * skb_dst_force - makes sure skb dst is refcounted
* @skb: buffer
*
* If dst is not yet refcounted and not destroyed, grab a ref on it.
*/
-static inline void skb_dst_force_safe(struct sk_buff *skb)
+static inline void skb_dst_force(struct sk_buff *skb)
{
if (skb_dst_is_noref(skb)) {
struct dst_entry *dst = skb_dst(skb);
+ WARN_ON(!rcu_read_lock_held());
if (!dst_hold_safe(dst))
dst = NULL;
diff --git a/include/net/netlink.h b/include/net/netlink.h
index e51cf5f81597..14c289393071 100644
--- a/include/net/netlink.h
+++ b/include/net/netlink.h
@@ -773,7 +773,10 @@ static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
*/
static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
{
- return nla_put(skb, attrtype, sizeof(u8), &value);
+ /* temporary variables to work around GCC PR81715 with asan-stack=1 */
+ u8 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(u8), &tmp);
}
/**
@@ -784,7 +787,9 @@ static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
*/
static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
{
- return nla_put(skb, attrtype, sizeof(u16), &value);
+ u16 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(u16), &tmp);
}
/**
@@ -795,7 +800,9 @@ static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
*/
static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
{
- return nla_put(skb, attrtype, sizeof(__be16), &value);
+ __be16 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(__be16), &tmp);
}
/**
@@ -806,7 +813,9 @@ static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
*/
static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
{
- return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, value);
+ __be16 tmp = value;
+
+ return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
}
/**
@@ -817,7 +826,9 @@ static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
*/
static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
{
- return nla_put(skb, attrtype, sizeof(__le16), &value);
+ __le16 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(__le16), &tmp);
}
/**
@@ -828,7 +839,9 @@ static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
*/
static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
{
- return nla_put(skb, attrtype, sizeof(u32), &value);
+ u32 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(u32), &tmp);
}
/**
@@ -839,7 +852,9 @@ static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
*/
static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
{
- return nla_put(skb, attrtype, sizeof(__be32), &value);
+ __be32 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(__be32), &tmp);
}
/**
@@ -850,7 +865,9 @@ static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
*/
static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
{
- return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, value);
+ __be32 tmp = value;
+
+ return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
}
/**
@@ -861,7 +878,9 @@ static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
*/
static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
{
- return nla_put(skb, attrtype, sizeof(__le32), &value);
+ __le32 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(__le32), &tmp);
}
/**
@@ -874,7 +893,9 @@ static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
u64 value, int padattr)
{
- return nla_put_64bit(skb, attrtype, sizeof(u64), &value, padattr);
+ u64 tmp = value;
+
+ return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
}
/**
@@ -887,7 +908,9 @@ static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
int padattr)
{
- return nla_put_64bit(skb, attrtype, sizeof(__be64), &value, padattr);
+ __be64 tmp = value;
+
+ return nla_put_64bit(skb, attrtype, sizeof(__be64), &tmp, padattr);
}
/**
@@ -900,7 +923,9 @@ static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
int padattr)
{
- return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, value,
+ __be64 tmp = value;
+
+ return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, tmp,
padattr);
}
@@ -914,7 +939,9 @@ static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
int padattr)
{
- return nla_put_64bit(skb, attrtype, sizeof(__le64), &value, padattr);
+ __le64 tmp = value;
+
+ return nla_put_64bit(skb, attrtype, sizeof(__le64), &tmp, padattr);
}
/**
@@ -925,7 +952,9 @@ static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
*/
static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
{
- return nla_put(skb, attrtype, sizeof(s8), &value);
+ s8 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(s8), &tmp);
}
/**
@@ -936,7 +965,9 @@ static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
*/
static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
{
- return nla_put(skb, attrtype, sizeof(s16), &value);
+ s16 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(s16), &tmp);
}
/**
@@ -947,7 +978,9 @@ static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
*/
static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
{
- return nla_put(skb, attrtype, sizeof(s32), &value);
+ s32 tmp = value;
+
+ return nla_put(skb, attrtype, sizeof(s32), &tmp);
}
/**
@@ -960,7 +993,9 @@ static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value,
int padattr)
{
- return nla_put_64bit(skb, attrtype, sizeof(s64), &value, padattr);
+ s64 tmp = value;
+
+ return nla_put_64bit(skb, attrtype, sizeof(s64), &tmp, padattr);
}
/**
@@ -1010,7 +1045,9 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype,
__be32 addr)
{
- return nla_put_be32(skb, attrtype, addr);
+ __be32 tmp = addr;
+
+ return nla_put_be32(skb, attrtype, tmp);
}
/**
diff --git a/include/net/protocol.h b/include/net/protocol.h
index 65ba335b0e7e..4fc75f7ae23b 100644
--- a/include/net/protocol.h
+++ b/include/net/protocol.h
@@ -39,8 +39,8 @@
/* This is used to register protocols. */
struct net_protocol {
- void (*early_demux)(struct sk_buff *skb);
- void (*early_demux_handler)(struct sk_buff *skb);
+ int (*early_demux)(struct sk_buff *skb);
+ int (*early_demux_handler)(struct sk_buff *skb);
int (*handler)(struct sk_buff *skb);
void (*err_handler)(struct sk_buff *skb, u32 info);
unsigned int no_policy:1,
diff --git a/include/net/route.h b/include/net/route.h
index 1b09a9368c68..d538e6db1afe 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -175,7 +175,9 @@ static inline struct rtable *ip_route_output_gre(struct net *net, struct flowi4
fl4->fl4_gre_key = gre_key;
return ip_route_output_key(net, fl4);
}
-
+int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
+ u8 tos, struct net_device *dev,
+ struct in_device *in_dev, u32 *itag);
int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src,
u8 tos, struct net_device *devin);
int ip_route_input_rcu(struct sk_buff *skb, __be32 dst, __be32 src,
@@ -190,7 +192,7 @@ static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src,
rcu_read_lock();
err = ip_route_input_noref(skb, dst, src, tos, devin);
if (!err) {
- skb_dst_force_safe(skb);
+ skb_dst_force(skb);
if (!skb_dst(skb))
err = -EINVAL;
}
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 06b4f515e157..d7d8cba01469 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -127,7 +127,8 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
const union sctp_addr *laddr,
const union sctp_addr *paddr, void *p);
int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
- struct net *net, int pos, void *p);
+ int (*cb_done)(struct sctp_transport *, void *),
+ struct net *net, int *pos, void *p);
int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), void *p);
int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
struct sctp_info *info);
diff --git a/include/net/sctp/ulpevent.h b/include/net/sctp/ulpevent.h
index 1060494ac230..b8c86ec1a8f5 100644
--- a/include/net/sctp/ulpevent.h
+++ b/include/net/sctp/ulpevent.h
@@ -153,8 +153,12 @@ __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event);
static inline int sctp_ulpevent_type_enabled(__u16 sn_type,
struct sctp_event_subscribe *mask)
{
+ int offset = sn_type - SCTP_SN_TYPE_BASE;
char *amask = (char *) mask;
- return amask[sn_type - SCTP_SN_TYPE_BASE];
+
+ if (offset >= sizeof(struct sctp_event_subscribe))
+ return 0;
+ return amask[offset];
}
/* Given an event subscription, is this event enabled? */
diff --git a/include/net/sock.h b/include/net/sock.h
index 03a362568357..a6b9a8d1a6df 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -856,7 +856,7 @@ void sk_stream_write_space(struct sock *sk);
static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb)
{
/* dont let skb dst not refcounted, we are going to leave rcu lock */
- skb_dst_force_safe(skb);
+ skb_dst_force(skb);
if (!sk->sk_backlog.tail)
sk->sk_backlog.head = skb;
diff --git a/include/net/tcp.h b/include/net/tcp.h
index b510f284427a..89974c5286d8 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -345,7 +345,7 @@ void tcp_v4_err(struct sk_buff *skb, u32);
void tcp_shutdown(struct sock *sk, int how);
-void tcp_v4_early_demux(struct sk_buff *skb);
+int tcp_v4_early_demux(struct sk_buff *skb);
int tcp_v4_rcv(struct sk_buff *skb);
int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);
@@ -544,7 +544,6 @@ u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
int min_tso_segs);
void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
int nonagle);
-bool tcp_may_send_now(struct sock *sk);
int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs);
int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs);
void tcp_retransmit_timer(struct sock *sk);
diff --git a/include/net/udp.h b/include/net/udp.h
index 12dfbfe2e2d7..6c759c8594e2 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -259,7 +259,7 @@ static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
return __skb_recv_udp(sk, flags, noblock, &peeked, &off, err);
}
-void udp_v4_early_demux(struct sk_buff *skb);
+int udp_v4_early_demux(struct sk_buff *skb);
bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst);
int udp_get_port(struct sock *sk, unsigned short snum,
int (*saddr_cmp)(const struct sock *,
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index bdb1279a415b..e8608b2dc844 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -285,7 +285,7 @@ enum ib_tm_cap_flags {
IB_TM_CAP_RC = 1 << 0,
};
-struct ib_xrq_caps {
+struct ib_tm_caps {
/* Max size of RNDV header */
u32 max_rndv_hdr_size;
/* Max number of entries in tag matching list */
@@ -358,7 +358,7 @@ struct ib_device_attr {
struct ib_rss_caps rss_caps;
u32 max_wq_type_rq;
u32 raw_packet_caps; /* Use ib_raw_packet_caps enum */
- struct ib_xrq_caps xrq_caps;
+ struct ib_tm_caps tm_caps;
};
enum ib_mtu {
@@ -1739,7 +1739,7 @@ struct ib_mr {
u32 lkey;
u32 rkey;
u64 iova;
- u32 length;
+ u64 length;
unsigned int page_size;
bool need_inval;
union {
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index afb04811b7b9..0a804b1a4726 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -691,12 +691,6 @@ struct Scsi_Host {
unsigned int prot_capabilities;
unsigned char prot_guard_type;
- /*
- * q used for scsi_tgt msgs, async events or any other requests that
- * need to be processed in userspace
- */
- struct request_queue *uspace_req_q;
-
/* legacy crap */
unsigned long base;
unsigned long io_port;
diff --git a/include/soc/mediatek/smi.h b/include/soc/mediatek/smi.h
index 8893c5eacd07..5201e9022c86 100644
--- a/include/soc/mediatek/smi.h
+++ b/include/soc/mediatek/smi.h
@@ -19,7 +19,7 @@
#ifdef CONFIG_MTK_SMI
-#define MTK_LARB_NR_MAX 8
+#define MTK_LARB_NR_MAX 16
#define MTK_SMI_MMU_EN(port) BIT(port)
diff --git a/include/soc/tegra/fuse.h b/include/soc/tegra/fuse.h
index b4c9219e7f95..9b6ea0c72117 100644
--- a/include/soc/tegra/fuse.h
+++ b/include/soc/tegra/fuse.h
@@ -65,6 +65,8 @@ int tegra_fuse_readl(unsigned long offset, u32 *value);
extern struct tegra_sku_info tegra_sku_info;
+struct device *tegra_soc_device_register(void);
+
#endif /* __ASSEMBLY__ */
#endif /* __SOC_TEGRA_FUSE_H__ */
diff --git a/include/sound/hda_verbs.h b/include/sound/hda_verbs.h
index d0509db6d0ec..f89cd5ee1c7a 100644
--- a/include/sound/hda_verbs.h
+++ b/include/sound/hda_verbs.h
@@ -95,6 +95,7 @@ enum {
#define AC_VERB_SET_EAPD_BTLENABLE 0x70c
#define AC_VERB_SET_DIGI_CONVERT_1 0x70d
#define AC_VERB_SET_DIGI_CONVERT_2 0x70e
+#define AC_VERB_SET_DIGI_CONVERT_3 0x73e
#define AC_VERB_SET_VOLUME_KNOB_CONTROL 0x70f
#define AC_VERB_SET_GPIO_DATA 0x715
#define AC_VERB_SET_GPIO_MASK 0x716
diff --git a/include/trace/events/block.h b/include/trace/events/block.h
index f815aaaef755..1fd7ff1a46f7 100644
--- a/include/trace/events/block.h
+++ b/include/trace/events/block.h
@@ -397,7 +397,6 @@ DECLARE_EVENT_CLASS(block_get_rq,
TP_fast_assign(
__entry->dev = bio ? bio_dev(bio) : 0;
- __entry->dev = bio_dev(bio);
__entry->sector = bio ? bio->bi_iter.bi_sector : 0;
__entry->nr_sector = bio ? bio_sectors(bio) : 0;
blk_fill_rwbs(__entry->rwbs,
@@ -414,7 +413,7 @@ DECLARE_EVENT_CLASS(block_get_rq,
/**
* block_getrq - get a free request entry in queue for block IO operations
* @q: queue for operations
- * @bio: pending block IO operation
+ * @bio: pending block IO operation (can be %NULL)
* @rw: low bit indicates a read (%0) or a write (%1)
*
* A request struct for queue @q has been allocated to handle the
@@ -430,7 +429,7 @@ DEFINE_EVENT(block_get_rq, block_getrq,
/**
* block_sleeprq - waiting to get a free request entry in queue for block IO operation
* @q: queue for operation
- * @bio: pending block IO operation
+ * @bio: pending block IO operation (can be %NULL)
* @rw: low bit indicates a read (%0) or a write (%1)
*
* In the case where a request struct cannot be provided for queue @q
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index bc4dd7837e4c..5d216f7fb05a 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -543,14 +543,14 @@ TRACE_EVENT(f2fs_map_blocks,
TRACE_EVENT(f2fs_background_gc,
- TP_PROTO(struct super_block *sb, long wait_ms,
+ TP_PROTO(struct super_block *sb, unsigned int wait_ms,
unsigned int prefree, unsigned int free),
TP_ARGS(sb, wait_ms, prefree, free),
TP_STRUCT__entry(
__field(dev_t, dev)
- __field(long, wait_ms)
+ __field(unsigned int, wait_ms)
__field(unsigned int, prefree)
__field(unsigned int, free)
),
@@ -562,13 +562,120 @@ TRACE_EVENT(f2fs_background_gc,
__entry->free = free;
),
- TP_printk("dev = (%d,%d), wait_ms = %ld, prefree = %u, free = %u",
+ TP_printk("dev = (%d,%d), wait_ms = %u, prefree = %u, free = %u",
show_dev(__entry->dev),
__entry->wait_ms,
__entry->prefree,
__entry->free)
);
+TRACE_EVENT(f2fs_gc_begin,
+
+ TP_PROTO(struct super_block *sb, bool sync, bool background,
+ long long dirty_nodes, long long dirty_dents,
+ long long dirty_imeta, unsigned int free_sec,
+ unsigned int free_seg, int reserved_seg,
+ unsigned int prefree_seg),
+
+ TP_ARGS(sb, sync, background, dirty_nodes, dirty_dents, dirty_imeta,
+ free_sec, free_seg, reserved_seg, prefree_seg),
+
+ TP_STRUCT__entry(
+ __field(dev_t, dev)
+ __field(bool, sync)
+ __field(bool, background)
+ __field(long long, dirty_nodes)
+ __field(long long, dirty_dents)
+ __field(long long, dirty_imeta)
+ __field(unsigned int, free_sec)
+ __field(unsigned int, free_seg)
+ __field(int, reserved_seg)
+ __field(unsigned int, prefree_seg)
+ ),
+
+ TP_fast_assign(
+ __entry->dev = sb->s_dev;
+ __entry->sync = sync;
+ __entry->background = background;
+ __entry->dirty_nodes = dirty_nodes;
+ __entry->dirty_dents = dirty_dents;
+ __entry->dirty_imeta = dirty_imeta;
+ __entry->free_sec = free_sec;
+ __entry->free_seg = free_seg;
+ __entry->reserved_seg = reserved_seg;
+ __entry->prefree_seg = prefree_seg;
+ ),
+
+ TP_printk("dev = (%d,%d), sync = %d, background = %d, nodes = %lld, "
+ "dents = %lld, imeta = %lld, free_sec:%u, free_seg:%u, "
+ "rsv_seg:%d, prefree_seg:%u",
+ show_dev(__entry->dev),
+ __entry->sync,
+ __entry->background,
+ __entry->dirty_nodes,
+ __entry->dirty_dents,
+ __entry->dirty_imeta,
+ __entry->free_sec,
+ __entry->free_seg,
+ __entry->reserved_seg,
+ __entry->prefree_seg)
+);
+
+TRACE_EVENT(f2fs_gc_end,
+
+ TP_PROTO(struct super_block *sb, int ret, int seg_freed,
+ int sec_freed, long long dirty_nodes,
+ long long dirty_dents, long long dirty_imeta,
+ unsigned int free_sec, unsigned int free_seg,
+ int reserved_seg, unsigned int prefree_seg),
+
+ TP_ARGS(sb, ret, seg_freed, sec_freed, dirty_nodes, dirty_dents,
+ dirty_imeta, free_sec, free_seg, reserved_seg, prefree_seg),
+
+ TP_STRUCT__entry(
+ __field(dev_t, dev)
+ __field(int, ret)
+ __field(int, seg_freed)
+ __field(int, sec_freed)
+ __field(long long, dirty_nodes)
+ __field(long long, dirty_dents)
+ __field(long long, dirty_imeta)
+ __field(unsigned int, free_sec)
+ __field(unsigned int, free_seg)
+ __field(int, reserved_seg)
+ __field(unsigned int, prefree_seg)
+ ),
+
+ TP_fast_assign(
+ __entry->dev = sb->s_dev;
+ __entry->ret = ret;
+ __entry->seg_freed = seg_freed;
+ __entry->sec_freed = sec_freed;
+ __entry->dirty_nodes = dirty_nodes;
+ __entry->dirty_dents = dirty_dents;
+ __entry->dirty_imeta = dirty_imeta;
+ __entry->free_sec = free_sec;
+ __entry->free_seg = free_seg;
+ __entry->reserved_seg = reserved_seg;
+ __entry->prefree_seg = prefree_seg;
+ ),
+
+ TP_printk("dev = (%d,%d), ret = %d, seg_freed = %d, sec_freed = %d, "
+ "nodes = %lld, dents = %lld, imeta = %lld, free_sec:%u, "
+ "free_seg:%u, rsv_seg:%d, prefree_seg:%u",
+ show_dev(__entry->dev),
+ __entry->ret,
+ __entry->seg_freed,
+ __entry->sec_freed,
+ __entry->dirty_nodes,
+ __entry->dirty_dents,
+ __entry->dirty_imeta,
+ __entry->free_sec,
+ __entry->free_seg,
+ __entry->reserved_seg,
+ __entry->prefree_seg)
+);
+
TRACE_EVENT(f2fs_get_victim,
TP_PROTO(struct super_block *sb, int type, int gc_type,
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h
index 8ade3eb6c640..dcffedfac431 100644
--- a/include/trace/events/kvm.h
+++ b/include/trace/events/kvm.h
@@ -14,7 +14,9 @@
ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR), \
ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\
ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL), \
- ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH)
+ ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH), ERSN(EPR),\
+ ERSN(SYSTEM_EVENT), ERSN(S390_STSI), ERSN(IOAPIC_EOI), \
+ ERSN(HYPERV)
TRACE_EVENT(kvm_userspace_exit,
TP_PROTO(__u32 reason, int errno),
diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h
index 4c2e4737d7bc..fec6291a6703 100644
--- a/include/trace/events/mmflags.h
+++ b/include/trace/events/mmflags.h
@@ -18,7 +18,6 @@
{(unsigned long)GFP_HIGHUSER_MOVABLE, "GFP_HIGHUSER_MOVABLE"},\
{(unsigned long)GFP_HIGHUSER, "GFP_HIGHUSER"}, \
{(unsigned long)GFP_USER, "GFP_USER"}, \
- {(unsigned long)GFP_TEMPORARY, "GFP_TEMPORARY"}, \
{(unsigned long)GFP_KERNEL_ACCOUNT, "GFP_KERNEL_ACCOUNT"}, \
{(unsigned long)GFP_KERNEL, "GFP_KERNEL"}, \
{(unsigned long)GFP_NOFS, "GFP_NOFS"}, \
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index ae1409ffe99a..3c8b7f625670 100644
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -114,7 +114,10 @@ static inline long __trace_sched_switch_state(bool preempt, struct task_struct *
* Preemption ignores task state, therefore preempted tasks are always
* RUNNING (we will not have dequeued if state != RUNNING).
*/
- return preempt ? TASK_RUNNING | TASK_STATE_MAX : p->state;
+ if (preempt)
+ return TASK_STATE_MAX;
+
+ return __get_task_state(p);
}
#endif /* CREATE_TRACE_POINTS */
@@ -152,12 +155,14 @@ TRACE_EVENT(sched_switch,
TP_printk("prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==> next_comm=%s next_pid=%d next_prio=%d",
__entry->prev_comm, __entry->prev_pid, __entry->prev_prio,
- __entry->prev_state & (TASK_STATE_MAX-1) ?
- __print_flags(__entry->prev_state & (TASK_STATE_MAX-1), "|",
- { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" },
- { 16, "Z" }, { 32, "X" }, { 64, "x" },
- { 128, "K" }, { 256, "W" }, { 512, "P" },
- { 1024, "N" }) : "R",
+
+ (__entry->prev_state & (TASK_REPORT_MAX - 1)) ?
+ __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|",
+ { 0x01, "S" }, { 0x02, "D" }, { 0x04, "T" },
+ { 0x08, "t" }, { 0x10, "X" }, { 0x20, "Z" },
+ { 0x40, "P" }, { 0x80, "I" }) :
+ "R",
+
__entry->prev_state & TASK_STATE_MAX ? "+" : "",
__entry->next_comm, __entry->next_pid, __entry->next_prio)
);
diff --git a/include/trace/events/xdp.h b/include/trace/events/xdp.h
index 862575ac8da9..4e16c43fba10 100644
--- a/include/trace/events/xdp.h
+++ b/include/trace/events/xdp.h
@@ -138,11 +138,11 @@ DEFINE_EVENT_PRINT(xdp_redirect_template, xdp_redirect_map_err,
#define _trace_xdp_redirect_map(dev, xdp, fwd, map, idx) \
trace_xdp_redirect_map(dev, xdp, fwd ? fwd->ifindex : 0, \
- 0, map, idx);
+ 0, map, idx)
#define _trace_xdp_redirect_map_err(dev, xdp, fwd, map, idx, err) \
trace_xdp_redirect_map_err(dev, xdp, fwd ? fwd->ifindex : 0, \
- err, map, idx);
+ err, map, idx)
#endif /* _TRACE_XDP_H */
diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h
index 9c4eca6b374a..e5aa6794cea4 100644
--- a/include/uapi/asm-generic/siginfo.h
+++ b/include/uapi/asm-generic/siginfo.h
@@ -151,29 +151,6 @@ typedef struct siginfo {
#define si_arch _sifields._sigsys._arch
#endif
-#ifdef __KERNEL__
-#define __SI_MASK 0xffff0000u
-#define __SI_KILL (0 << 16)
-#define __SI_TIMER (1 << 16)
-#define __SI_POLL (2 << 16)
-#define __SI_FAULT (3 << 16)
-#define __SI_CHLD (4 << 16)
-#define __SI_RT (5 << 16)
-#define __SI_MESGQ (6 << 16)
-#define __SI_SYS (7 << 16)
-#define __SI_CODE(T,N) ((T) | ((N) & 0xffff))
-#else /* __KERNEL__ */
-#define __SI_KILL 0
-#define __SI_TIMER 0
-#define __SI_POLL 0
-#define __SI_FAULT 0
-#define __SI_CHLD 0
-#define __SI_RT 0
-#define __SI_MESGQ 0
-#define __SI_SYS 0
-#define __SI_CODE(T,N) (N)
-#endif /* __KERNEL__ */
-
/*
* si_code values
* Digital reserves positive values for kernel-generated signals.
@@ -181,8 +158,8 @@ typedef struct siginfo {
#define SI_USER 0 /* sent by kill, sigsend, raise */
#define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
#define SI_QUEUE -1 /* sent by sigqueue */
-#define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */
-#define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */
+#define SI_TIMER -2 /* sent by timer expiration */
+#define SI_MESGQ -3 /* sent by real time mesq state change */
#define SI_ASYNCIO -4 /* sent by AIO completion */
#define SI_SIGIO -5 /* sent by queued SIGIO */
#define SI_TKILL -6 /* sent by tkill system call */
@@ -194,86 +171,86 @@ typedef struct siginfo {
/*
* SIGILL si_codes
*/
-#define ILL_ILLOPC (__SI_FAULT|1) /* illegal opcode */
-#define ILL_ILLOPN (__SI_FAULT|2) /* illegal operand */
-#define ILL_ILLADR (__SI_FAULT|3) /* illegal addressing mode */
-#define ILL_ILLTRP (__SI_FAULT|4) /* illegal trap */
-#define ILL_PRVOPC (__SI_FAULT|5) /* privileged opcode */
-#define ILL_PRVREG (__SI_FAULT|6) /* privileged register */
-#define ILL_COPROC (__SI_FAULT|7) /* coprocessor error */
-#define ILL_BADSTK (__SI_FAULT|8) /* internal stack error */
+#define ILL_ILLOPC 1 /* illegal opcode */
+#define ILL_ILLOPN 2 /* illegal operand */
+#define ILL_ILLADR 3 /* illegal addressing mode */
+#define ILL_ILLTRP 4 /* illegal trap */
+#define ILL_PRVOPC 5 /* privileged opcode */
+#define ILL_PRVREG 6 /* privileged register */
+#define ILL_COPROC 7 /* coprocessor error */
+#define ILL_BADSTK 8 /* internal stack error */
#define NSIGILL 8
/*
* SIGFPE si_codes
*/
-#define FPE_INTDIV (__SI_FAULT|1) /* integer divide by zero */
-#define FPE_INTOVF (__SI_FAULT|2) /* integer overflow */
-#define FPE_FLTDIV (__SI_FAULT|3) /* floating point divide by zero */
-#define FPE_FLTOVF (__SI_FAULT|4) /* floating point overflow */
-#define FPE_FLTUND (__SI_FAULT|5) /* floating point underflow */
-#define FPE_FLTRES (__SI_FAULT|6) /* floating point inexact result */
-#define FPE_FLTINV (__SI_FAULT|7) /* floating point invalid operation */
-#define FPE_FLTSUB (__SI_FAULT|8) /* subscript out of range */
+#define FPE_INTDIV 1 /* integer divide by zero */
+#define FPE_INTOVF 2 /* integer overflow */
+#define FPE_FLTDIV 3 /* floating point divide by zero */
+#define FPE_FLTOVF 4 /* floating point overflow */
+#define FPE_FLTUND 5 /* floating point underflow */
+#define FPE_FLTRES 6 /* floating point inexact result */
+#define FPE_FLTINV 7 /* floating point invalid operation */
+#define FPE_FLTSUB 8 /* subscript out of range */
#define NSIGFPE 8
/*
* SIGSEGV si_codes
*/
-#define SEGV_MAPERR (__SI_FAULT|1) /* address not mapped to object */
-#define SEGV_ACCERR (__SI_FAULT|2) /* invalid permissions for mapped object */
-#define SEGV_BNDERR (__SI_FAULT|3) /* failed address bound checks */
-#define SEGV_PKUERR (__SI_FAULT|4) /* failed protection key checks */
+#define SEGV_MAPERR 1 /* address not mapped to object */
+#define SEGV_ACCERR 2 /* invalid permissions for mapped object */
+#define SEGV_BNDERR 3 /* failed address bound checks */
+#define SEGV_PKUERR 4 /* failed protection key checks */
#define NSIGSEGV 4
/*
* SIGBUS si_codes
*/
-#define BUS_ADRALN (__SI_FAULT|1) /* invalid address alignment */
-#define BUS_ADRERR (__SI_FAULT|2) /* non-existent physical address */
-#define BUS_OBJERR (__SI_FAULT|3) /* object specific hardware error */
+#define BUS_ADRALN 1 /* invalid address alignment */
+#define BUS_ADRERR 2 /* non-existent physical address */
+#define BUS_OBJERR 3 /* object specific hardware error */
/* hardware memory error consumed on a machine check: action required */
-#define BUS_MCEERR_AR (__SI_FAULT|4)
+#define BUS_MCEERR_AR 4
/* hardware memory error detected in process but not consumed: action optional*/
-#define BUS_MCEERR_AO (__SI_FAULT|5)
+#define BUS_MCEERR_AO 5
#define NSIGBUS 5
/*
* SIGTRAP si_codes
*/
-#define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */
-#define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */
-#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */
-#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint/watchpoint */
+#define TRAP_BRKPT 1 /* process breakpoint */
+#define TRAP_TRACE 2 /* process trace trap */
+#define TRAP_BRANCH 3 /* process taken branch trap */
+#define TRAP_HWBKPT 4 /* hardware breakpoint/watchpoint */
#define NSIGTRAP 4
/*
* SIGCHLD si_codes
*/
-#define CLD_EXITED (__SI_CHLD|1) /* child has exited */
-#define CLD_KILLED (__SI_CHLD|2) /* child was killed */
-#define CLD_DUMPED (__SI_CHLD|3) /* child terminated abnormally */
-#define CLD_TRAPPED (__SI_CHLD|4) /* traced child has trapped */
-#define CLD_STOPPED (__SI_CHLD|5) /* child has stopped */
-#define CLD_CONTINUED (__SI_CHLD|6) /* stopped child has continued */
+#define CLD_EXITED 1 /* child has exited */
+#define CLD_KILLED 2 /* child was killed */
+#define CLD_DUMPED 3 /* child terminated abnormally */
+#define CLD_TRAPPED 4 /* traced child has trapped */
+#define CLD_STOPPED 5 /* child has stopped */
+#define CLD_CONTINUED 6 /* stopped child has continued */
#define NSIGCHLD 6
/*
- * SIGPOLL si_codes
+ * SIGPOLL (or any other signal without signal specific si_codes) si_codes
*/
-#define POLL_IN (__SI_POLL|1) /* data input available */
-#define POLL_OUT (__SI_POLL|2) /* output buffers available */
-#define POLL_MSG (__SI_POLL|3) /* input message available */
-#define POLL_ERR (__SI_POLL|4) /* i/o error */
-#define POLL_PRI (__SI_POLL|5) /* high priority input available */
-#define POLL_HUP (__SI_POLL|6) /* device disconnected */
+#define POLL_IN 1 /* data input available */
+#define POLL_OUT 2 /* output buffers available */
+#define POLL_MSG 3 /* input message available */
+#define POLL_ERR 4 /* i/o error */
+#define POLL_PRI 5 /* high priority input available */
+#define POLL_HUP 6 /* device disconnected */
#define NSIGPOLL 6
/*
* SIGSYS si_codes
*/
-#define SYS_SECCOMP (__SI_SYS|1) /* seccomp triggered */
-#define NSIGSYS 1
+#define SYS_SECCOMP 1 /* seccomp triggered */
+#define NSIGSYS 1
/*
* sigevent definitions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 43ab5c402f98..f90860d1f897 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -312,7 +312,7 @@ union bpf_attr {
* jump into another BPF program
* @ctx: context pointer passed to next program
* @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY
- * @index: index inside array that selects specific program to run
+ * @index: 32-bit index inside array that selects specific program to run
* Return: 0 on success or negative error
*
* int bpf_clone_redirect(skb, ifindex, flags)
diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h
index 9aa74f317747..378230c163d5 100644
--- a/include/uapi/linux/btrfs.h
+++ b/include/uapi/linux/btrfs.h
@@ -255,13 +255,7 @@ struct btrfs_ioctl_fs_info_args {
#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO (1ULL << 3)
-/*
- * some patches floated around with a second compression method
- * lets save that incompat here for when they do get in
- * Note we don't actually support it, we're just reserving the
- * number
- */
-#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZOv2 (1ULL << 4)
+#define BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD (1ULL << 4)
/*
* older kernels tried to do bigger metadata blocks, but the
diff --git a/include/uapi/linux/capability.h b/include/uapi/linux/capability.h
index 6fe14d001f68..230e05d35191 100644
--- a/include/uapi/linux/capability.h
+++ b/include/uapi/linux/capability.h
@@ -60,9 +60,13 @@ typedef struct __user_cap_data_struct {
#define VFS_CAP_U32_2 2
#define XATTR_CAPS_SZ_2 (sizeof(__le32)*(1 + 2*VFS_CAP_U32_2))
-#define XATTR_CAPS_SZ XATTR_CAPS_SZ_2
-#define VFS_CAP_U32 VFS_CAP_U32_2
-#define VFS_CAP_REVISION VFS_CAP_REVISION_2
+#define VFS_CAP_REVISION_3 0x03000000
+#define VFS_CAP_U32_3 2
+#define XATTR_CAPS_SZ_3 (sizeof(__le32)*(2 + 2*VFS_CAP_U32_3))
+
+#define XATTR_CAPS_SZ XATTR_CAPS_SZ_3
+#define VFS_CAP_U32 VFS_CAP_U32_3
+#define VFS_CAP_REVISION VFS_CAP_REVISION_3
struct vfs_cap_data {
__le32 magic_etc; /* Little endian */
@@ -72,6 +76,18 @@ struct vfs_cap_data {
} data[VFS_CAP_U32];
};
+/*
+ * same as vfs_cap_data but with a rootid at the end
+ */
+struct vfs_ns_cap_data {
+ __le32 magic_etc;
+ struct {
+ __le32 permitted; /* Little endian */
+ __le32 inheritable; /* Little endian */
+ } data[VFS_CAP_U32];
+ __le32 rootid;
+};
+
#ifndef __KERNEL__
/*
diff --git a/include/uapi/linux/dm-ioctl.h b/include/uapi/linux/dm-ioctl.h
index 412c06a624c8..ccaea525340b 100644
--- a/include/uapi/linux/dm-ioctl.h
+++ b/include/uapi/linux/dm-ioctl.h
@@ -269,9 +269,9 @@ enum {
#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
#define DM_VERSION_MAJOR 4
-#define DM_VERSION_MINOR 36
+#define DM_VERSION_MINOR 37
#define DM_VERSION_PATCHLEVEL 0
-#define DM_VERSION_EXTRA "-ioctl (2017-06-09)"
+#define DM_VERSION_EXTRA "-ioctl (2017-09-20)"
/* Status bits */
#define DM_READONLY_FLAG (1 << 0) /* In/Out */
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 9c041dae8e2c..5bd1b1de4ea0 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -1753,6 +1753,8 @@ enum ethtool_reset_flags {
* %ethtool_link_mode_bit_indices for the link modes, and other
* link features that the link partner advertised through
* autonegotiation; 0 if unknown or not applicable. Read-only.
+ * @transceiver: Used to distinguish different possible PHY types,
+ * reported consistently by PHYLIB. Read-only.
*
* If autonegotiation is disabled, the speed and @duplex represent the
* fixed link mode and are writable if the driver supports multiple
@@ -1804,7 +1806,9 @@ struct ethtool_link_settings {
__u8 eth_tp_mdix;
__u8 eth_tp_mdix_ctrl;
__s8 link_mode_masks_nwords;
- __u32 reserved[8];
+ __u8 transceiver;
+ __u8 reserved1[3];
+ __u32 reserved[7];
__u32 link_mode_masks[0];
/* layout of link_mode_masks fields:
* __u32 map_supported[link_mode_masks_nwords];
diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h
index 7b4567bacfc2..26283fefdf5f 100644
--- a/include/uapi/linux/kfd_ioctl.h
+++ b/include/uapi/linux/kfd_ioctl.h
@@ -23,15 +23,15 @@
#ifndef KFD_IOCTL_H_INCLUDED
#define KFD_IOCTL_H_INCLUDED
-#include <linux/types.h>
+#include <drm/drm.h>
#include <linux/ioctl.h>
#define KFD_IOCTL_MAJOR_VERSION 1
#define KFD_IOCTL_MINOR_VERSION 1
struct kfd_ioctl_get_version_args {
- uint32_t major_version; /* from KFD */
- uint32_t minor_version; /* from KFD */
+ __u32 major_version; /* from KFD */
+ __u32 minor_version; /* from KFD */
};
/* For kfd_ioctl_create_queue_args.queue_type. */
@@ -43,36 +43,36 @@ struct kfd_ioctl_get_version_args {
#define KFD_MAX_QUEUE_PRIORITY 15
struct kfd_ioctl_create_queue_args {
- uint64_t ring_base_address; /* to KFD */
- uint64_t write_pointer_address; /* from KFD */
- uint64_t read_pointer_address; /* from KFD */
- uint64_t doorbell_offset; /* from KFD */
-
- uint32_t ring_size; /* to KFD */
- uint32_t gpu_id; /* to KFD */
- uint32_t queue_type; /* to KFD */
- uint32_t queue_percentage; /* to KFD */
- uint32_t queue_priority; /* to KFD */
- uint32_t queue_id; /* from KFD */
-
- uint64_t eop_buffer_address; /* to KFD */
- uint64_t eop_buffer_size; /* to KFD */
- uint64_t ctx_save_restore_address; /* to KFD */
- uint64_t ctx_save_restore_size; /* to KFD */
+ __u64 ring_base_address; /* to KFD */
+ __u64 write_pointer_address; /* from KFD */
+ __u64 read_pointer_address; /* from KFD */
+ __u64 doorbell_offset; /* from KFD */
+
+ __u32 ring_size; /* to KFD */
+ __u32 gpu_id; /* to KFD */
+ __u32 queue_type; /* to KFD */
+ __u32 queue_percentage; /* to KFD */
+ __u32 queue_priority; /* to KFD */
+ __u32 queue_id; /* from KFD */
+
+ __u64 eop_buffer_address; /* to KFD */
+ __u64 eop_buffer_size; /* to KFD */
+ __u64 ctx_save_restore_address; /* to KFD */
+ __u64 ctx_save_restore_size; /* to KFD */
};
struct kfd_ioctl_destroy_queue_args {
- uint32_t queue_id; /* to KFD */
- uint32_t pad;
+ __u32 queue_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_update_queue_args {
- uint64_t ring_base_address; /* to KFD */
+ __u64 ring_base_address; /* to KFD */
- uint32_t queue_id; /* to KFD */
- uint32_t ring_size; /* to KFD */
- uint32_t queue_percentage; /* to KFD */
- uint32_t queue_priority; /* to KFD */
+ __u32 queue_id; /* to KFD */
+ __u32 ring_size; /* to KFD */
+ __u32 queue_percentage; /* to KFD */
+ __u32 queue_priority; /* to KFD */
};
/* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */
@@ -80,13 +80,13 @@ struct kfd_ioctl_update_queue_args {
#define KFD_IOC_CACHE_POLICY_NONCOHERENT 1
struct kfd_ioctl_set_memory_policy_args {
- uint64_t alternate_aperture_base; /* to KFD */
- uint64_t alternate_aperture_size; /* to KFD */
+ __u64 alternate_aperture_base; /* to KFD */
+ __u64 alternate_aperture_size; /* to KFD */
- uint32_t gpu_id; /* to KFD */
- uint32_t default_policy; /* to KFD */
- uint32_t alternate_policy; /* to KFD */
- uint32_t pad;
+ __u32 gpu_id; /* to KFD */
+ __u32 default_policy; /* to KFD */
+ __u32 alternate_policy; /* to KFD */
+ __u32 pad;
};
/*
@@ -97,26 +97,26 @@ struct kfd_ioctl_set_memory_policy_args {
*/
struct kfd_ioctl_get_clock_counters_args {
- uint64_t gpu_clock_counter; /* from KFD */
- uint64_t cpu_clock_counter; /* from KFD */
- uint64_t system_clock_counter; /* from KFD */
- uint64_t system_clock_freq; /* from KFD */
+ __u64 gpu_clock_counter; /* from KFD */
+ __u64 cpu_clock_counter; /* from KFD */
+ __u64 system_clock_counter; /* from KFD */
+ __u64 system_clock_freq; /* from KFD */
- uint32_t gpu_id; /* to KFD */
- uint32_t pad;
+ __u32 gpu_id; /* to KFD */
+ __u32 pad;
};
#define NUM_OF_SUPPORTED_GPUS 7
struct kfd_process_device_apertures {
- uint64_t lds_base; /* from KFD */
- uint64_t lds_limit; /* from KFD */
- uint64_t scratch_base; /* from KFD */
- uint64_t scratch_limit; /* from KFD */
- uint64_t gpuvm_base; /* from KFD */
- uint64_t gpuvm_limit; /* from KFD */
- uint32_t gpu_id; /* from KFD */
- uint32_t pad;
+ __u64 lds_base; /* from KFD */
+ __u64 lds_limit; /* from KFD */
+ __u64 scratch_base; /* from KFD */
+ __u64 scratch_limit; /* from KFD */
+ __u64 gpuvm_base; /* from KFD */
+ __u64 gpuvm_limit; /* from KFD */
+ __u32 gpu_id; /* from KFD */
+ __u32 pad;
};
struct kfd_ioctl_get_process_apertures_args {
@@ -124,8 +124,8 @@ struct kfd_ioctl_get_process_apertures_args {
process_apertures[NUM_OF_SUPPORTED_GPUS];/* from KFD */
/* from KFD, should be in the range [1 - NUM_OF_SUPPORTED_GPUS] */
- uint32_t num_of_nodes;
- uint32_t pad;
+ __u32 num_of_nodes;
+ __u32 pad;
};
#define MAX_ALLOWED_NUM_POINTS 100
@@ -133,25 +133,25 @@ struct kfd_ioctl_get_process_apertures_args {
#define MAX_ALLOWED_WAC_BUFF_SIZE 128
struct kfd_ioctl_dbg_register_args {
- uint32_t gpu_id; /* to KFD */
- uint32_t pad;
+ __u32 gpu_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_dbg_unregister_args {
- uint32_t gpu_id; /* to KFD */
- uint32_t pad;
+ __u32 gpu_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_dbg_address_watch_args {
- uint64_t content_ptr; /* a pointer to the actual content */
- uint32_t gpu_id; /* to KFD */
- uint32_t buf_size_in_bytes; /*including gpu_id and buf_size */
+ __u64 content_ptr; /* a pointer to the actual content */
+ __u32 gpu_id; /* to KFD */
+ __u32 buf_size_in_bytes; /*including gpu_id and buf_size */
};
struct kfd_ioctl_dbg_wave_control_args {
- uint64_t content_ptr; /* a pointer to the actual content */
- uint32_t gpu_id; /* to KFD */
- uint32_t buf_size_in_bytes; /*including gpu_id and buf_size */
+ __u64 content_ptr; /* a pointer to the actual content */
+ __u32 gpu_id; /* to KFD */
+ __u32 buf_size_in_bytes; /*including gpu_id and buf_size */
};
/* Matching HSA_EVENTTYPE */
@@ -172,44 +172,44 @@ struct kfd_ioctl_dbg_wave_control_args {
#define KFD_SIGNAL_EVENT_LIMIT 256
struct kfd_ioctl_create_event_args {
- uint64_t event_page_offset; /* from KFD */
- uint32_t event_trigger_data; /* from KFD - signal events only */
- uint32_t event_type; /* to KFD */
- uint32_t auto_reset; /* to KFD */
- uint32_t node_id; /* to KFD - only valid for certain
+ __u64 event_page_offset; /* from KFD */
+ __u32 event_trigger_data; /* from KFD - signal events only */
+ __u32 event_type; /* to KFD */
+ __u32 auto_reset; /* to KFD */
+ __u32 node_id; /* to KFD - only valid for certain
event types */
- uint32_t event_id; /* from KFD */
- uint32_t event_slot_index; /* from KFD */
+ __u32 event_id; /* from KFD */
+ __u32 event_slot_index; /* from KFD */
};
struct kfd_ioctl_destroy_event_args {
- uint32_t event_id; /* to KFD */
- uint32_t pad;
+ __u32 event_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_set_event_args {
- uint32_t event_id; /* to KFD */
- uint32_t pad;
+ __u32 event_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_reset_event_args {
- uint32_t event_id; /* to KFD */
- uint32_t pad;
+ __u32 event_id; /* to KFD */
+ __u32 pad;
};
struct kfd_memory_exception_failure {
- uint32_t NotPresent; /* Page not present or supervisor privilege */
- uint32_t ReadOnly; /* Write access to a read-only page */
- uint32_t NoExecute; /* Execute access to a page marked NX */
- uint32_t pad;
+ __u32 NotPresent; /* Page not present or supervisor privilege */
+ __u32 ReadOnly; /* Write access to a read-only page */
+ __u32 NoExecute; /* Execute access to a page marked NX */
+ __u32 pad;
};
/* memory exception data*/
struct kfd_hsa_memory_exception_data {
struct kfd_memory_exception_failure failure;
- uint64_t va;
- uint32_t gpu_id;
- uint32_t pad;
+ __u64 va;
+ __u32 gpu_id;
+ __u32 pad;
};
/* Event data*/
@@ -217,19 +217,19 @@ struct kfd_event_data {
union {
struct kfd_hsa_memory_exception_data memory_exception_data;
}; /* From KFD */
- uint64_t kfd_event_data_ext; /* pointer to an extension structure
+ __u64 kfd_event_data_ext; /* pointer to an extension structure
for future exception types */
- uint32_t event_id; /* to KFD */
- uint32_t pad;
+ __u32 event_id; /* to KFD */
+ __u32 pad;
};
struct kfd_ioctl_wait_events_args {
- uint64_t events_ptr; /* pointed to struct
+ __u64 events_ptr; /* pointed to struct
kfd_event_data array, to KFD */
- uint32_t num_events; /* to KFD */
- uint32_t wait_for_all; /* to KFD */
- uint32_t timeout; /* to KFD */
- uint32_t wait_result; /* from KFD */
+ __u32 num_events; /* to KFD */
+ __u32 wait_for_all; /* to KFD */
+ __u32 timeout; /* to KFD */
+ __u32 wait_result; /* from KFD */
};
struct kfd_ioctl_set_scratch_backing_va_args {
diff --git a/include/uapi/linux/seccomp.h b/include/uapi/linux/seccomp.h
index 0f238a43ff1e..f6bc1dea3247 100644
--- a/include/uapi/linux/seccomp.h
+++ b/include/uapi/linux/seccomp.h
@@ -11,27 +11,34 @@
#define SECCOMP_MODE_FILTER 2 /* uses user-supplied filter. */
/* Valid operations for seccomp syscall. */
-#define SECCOMP_SET_MODE_STRICT 0
-#define SECCOMP_SET_MODE_FILTER 1
+#define SECCOMP_SET_MODE_STRICT 0
+#define SECCOMP_SET_MODE_FILTER 1
+#define SECCOMP_GET_ACTION_AVAIL 2
/* Valid flags for SECCOMP_SET_MODE_FILTER */
#define SECCOMP_FILTER_FLAG_TSYNC 1
+#define SECCOMP_FILTER_FLAG_LOG 2
/*
* All BPF programs must return a 32-bit value.
* The bottom 16-bits are for optional return data.
- * The upper 16-bits are ordered from least permissive values to most.
+ * The upper 16-bits are ordered from least permissive values to most,
+ * as a signed value (so 0x8000000 is negative).
*
* The ordering ensures that a min_t() over composed return values always
* selects the least permissive choice.
*/
-#define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */
-#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
-#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
-#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
-#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
+#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */
+#define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */
+#define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD
+#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
+#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
+#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
+#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */
+#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
/* Masks for the return value sections. */
+#define SECCOMP_RET_ACTION_FULL 0xffff0000U
#define SECCOMP_RET_ACTION 0x7fff0000U
#define SECCOMP_RET_DATA 0x0000ffffU
diff --git a/include/uapi/linux/tee.h b/include/uapi/linux/tee.h
index 370d8845ab21..688782e90140 100644
--- a/include/uapi/linux/tee.h
+++ b/include/uapi/linux/tee.h
@@ -49,6 +49,7 @@
#define TEE_MAX_ARG_SIZE 1024
#define TEE_GEN_CAP_GP (1 << 0)/* GlobalPlatform compliant TEE */
+#define TEE_GEN_CAP_PRIVILEGED (1 << 1)/* Privileged device (for supplicant) */
/*
* TEE Implementation ID
diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h
index ce1169af39d7..2a5d63040a0b 100644
--- a/include/uapi/linux/usb/ch9.h
+++ b/include/uapi/linux/usb/ch9.h
@@ -780,6 +780,7 @@ struct usb_interface_assoc_descriptor {
__u8 iFunction;
} __attribute__ ((packed));
+#define USB_DT_INTERFACE_ASSOCIATION_SIZE 8
/*-------------------------------------------------------------------------*/
diff --git a/include/uapi/rdma/ib_user_verbs.h b/include/uapi/rdma/ib_user_verbs.h
index 9a0b6479fe0c..d4e0b53bfc75 100644
--- a/include/uapi/rdma/ib_user_verbs.h
+++ b/include/uapi/rdma/ib_user_verbs.h
@@ -261,7 +261,7 @@ struct ib_uverbs_ex_query_device_resp {
struct ib_uverbs_rss_caps rss_caps;
__u32 max_wq_type_rq;
__u32 raw_packet_caps;
- struct ib_uverbs_tm_caps xrq_caps;
+ struct ib_uverbs_tm_caps tm_caps;
};
struct ib_uverbs_query_port {
diff --git a/include/xen/arm/page.h b/include/xen/arm/page.h
index 415dbc6e43fd..6adc2a955340 100644
--- a/include/xen/arm/page.h
+++ b/include/xen/arm/page.h
@@ -84,16 +84,6 @@ static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
BUG();
}
-/* TODO: this shouldn't be here but it is because the frontend drivers
- * are using it (its rolled in headers) even though we won't hit the code path.
- * So for right now just punt with this.
- */
-static inline pte_t *lookup_address(unsigned long address, unsigned int *level)
-{
- BUG();
- return NULL;
-}
-
extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
struct gnttab_map_grant_ref *kmap_ops,
struct page **pages, unsigned int count);
diff --git a/init/do_mounts.c b/init/do_mounts.c
index c2de5104aad2..f6d4dd764a52 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -373,7 +373,7 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data)
printk(KERN_INFO
"VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
s->s_type->name,
- s->s_flags & MS_RDONLY ? " readonly" : "",
+ sb_rdonly(s) ? " readonly" : "",
MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
return 0;
}
@@ -420,8 +420,8 @@ retry:
#endif
panic("VFS: Unable to mount root fs on %s", b);
}
- if (!(flags & MS_RDONLY)) {
- flags |= MS_RDONLY;
+ if (!(flags & SB_RDONLY)) {
+ flags |= SB_RDONLY;
goto retry;
}
diff --git a/init/initramfs.c b/init/initramfs.c
index 8a532050043f..e64bf7b4c1ca 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -110,7 +110,7 @@ static void __init free_hash(void)
static long __init do_utime(char *filename, time_t mtime)
{
- struct timespec t[2];
+ struct timespec64 t[2];
t[0].tv_sec = mtime;
t[0].tv_nsec = 0;
diff --git a/ipc/compat.c b/ipc/compat.c
index 9b3c85f8a538..b17bf93d7b49 100644
--- a/ipc/compat.c
+++ b/ipc/compat.c
@@ -34,724 +34,48 @@
#include "util.h"
-struct compat_msgbuf {
- compat_long_t mtype;
- char mtext[1];
-};
-
-struct compat_ipc_perm {
- key_t key;
- __compat_uid_t uid;
- __compat_gid_t gid;
- __compat_uid_t cuid;
- __compat_gid_t cgid;
- compat_mode_t mode;
- unsigned short seq;
-};
-
-struct compat_semid_ds {
- struct compat_ipc_perm sem_perm;
- compat_time_t sem_otime;
- compat_time_t sem_ctime;
- compat_uptr_t sem_base;
- compat_uptr_t sem_pending;
- compat_uptr_t sem_pending_last;
- compat_uptr_t undo;
- unsigned short sem_nsems;
-};
-
-struct compat_msqid_ds {
- struct compat_ipc_perm msg_perm;
- compat_uptr_t msg_first;
- compat_uptr_t msg_last;
- compat_time_t msg_stime;
- compat_time_t msg_rtime;
- compat_time_t msg_ctime;
- compat_ulong_t msg_lcbytes;
- compat_ulong_t msg_lqbytes;
- unsigned short msg_cbytes;
- unsigned short msg_qnum;
- unsigned short msg_qbytes;
- compat_ipc_pid_t msg_lspid;
- compat_ipc_pid_t msg_lrpid;
-};
-
-struct compat_shmid_ds {
- struct compat_ipc_perm shm_perm;
- int shm_segsz;
- compat_time_t shm_atime;
- compat_time_t shm_dtime;
- compat_time_t shm_ctime;
- compat_ipc_pid_t shm_cpid;
- compat_ipc_pid_t shm_lpid;
- unsigned short shm_nattch;
- unsigned short shm_unused;
- compat_uptr_t shm_unused2;
- compat_uptr_t shm_unused3;
-};
-
-struct compat_ipc_kludge {
- compat_uptr_t msgp;
- compat_long_t msgtyp;
-};
-
-struct compat_shminfo64 {
- compat_ulong_t shmmax;
- compat_ulong_t shmmin;
- compat_ulong_t shmmni;
- compat_ulong_t shmseg;
- compat_ulong_t shmall;
- compat_ulong_t __unused1;
- compat_ulong_t __unused2;
- compat_ulong_t __unused3;
- compat_ulong_t __unused4;
-};
-
-struct compat_shm_info {
- compat_int_t used_ids;
- compat_ulong_t shm_tot, shm_rss, shm_swp;
- compat_ulong_t swap_attempts, swap_successes;
-};
-
-static inline int compat_ipc_parse_version(int *cmd)
-{
-#ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
- int version = *cmd & IPC_64;
-
- /* this is tricky: architectures that have support for the old
- * ipc structures in 64 bit binaries need to have IPC_64 set
- * in cmd, the others need to have it cleared */
-#ifndef ipc_parse_version
- *cmd |= IPC_64;
-#else
- *cmd &= ~IPC_64;
-#endif
- return version;
-#else
- /* With the asm-generic APIs, we always use the 64-bit versions. */
- return IPC_64;
-#endif
-}
-
-static inline int __get_compat_ipc64_perm(struct ipc64_perm *p64,
- struct compat_ipc64_perm __user *up64)
-{
- int err;
-
- err = __get_user(p64->uid, &up64->uid);
- err |= __get_user(p64->gid, &up64->gid);
- err |= __get_user(p64->mode, &up64->mode);
- return err;
-}
-
-static inline int __get_compat_ipc_perm(struct ipc64_perm *p,
- struct compat_ipc_perm __user *up)
-{
- int err;
-
- err = __get_user(p->uid, &up->uid);
- err |= __get_user(p->gid, &up->gid);
- err |= __get_user(p->mode, &up->mode);
- return err;
-}
-
-static inline int __put_compat_ipc64_perm(struct ipc64_perm *p64,
- struct compat_ipc64_perm __user *up64)
+int get_compat_ipc64_perm(struct ipc64_perm *to,
+ struct compat_ipc64_perm __user *from)
{
- int err;
-
- err = __put_user(p64->key, &up64->key);
- err |= __put_user(p64->uid, &up64->uid);
- err |= __put_user(p64->gid, &up64->gid);
- err |= __put_user(p64->cuid, &up64->cuid);
- err |= __put_user(p64->cgid, &up64->cgid);
- err |= __put_user(p64->mode, &up64->mode);
- err |= __put_user(p64->seq, &up64->seq);
- return err;
-}
-
-static inline int __put_compat_ipc_perm(struct ipc64_perm *p,
- struct compat_ipc_perm __user *uip)
-{
- int err;
- __compat_uid_t u;
- __compat_gid_t g;
-
- err = __put_user(p->key, &uip->key);
- SET_UID(u, p->uid);
- err |= __put_user(u, &uip->uid);
- SET_GID(g, p->gid);
- err |= __put_user(g, &uip->gid);
- SET_UID(u, p->cuid);
- err |= __put_user(u, &uip->cuid);
- SET_GID(g, p->cgid);
- err |= __put_user(g, &uip->cgid);
- err |= __put_user(p->mode, &uip->mode);
- err |= __put_user(p->seq, &uip->seq);
- return err;
-}
-
-static inline int get_compat_semid64_ds(struct semid64_ds *sem64,
- struct compat_semid64_ds __user *up64)
-{
- if (!access_ok(VERIFY_READ, up64, sizeof(*up64)))
- return -EFAULT;
- return __get_compat_ipc64_perm(&sem64->sem_perm, &up64->sem_perm);
-}
-
-static inline int get_compat_semid_ds(struct semid64_ds *s,
- struct compat_semid_ds __user *up)
-{
- if (!access_ok(VERIFY_READ, up, sizeof(*up)))
+ struct compat_ipc64_perm v;
+ if (copy_from_user(&v, from, sizeof(v)))
return -EFAULT;
- return __get_compat_ipc_perm(&s->sem_perm, &up->sem_perm);
+ to->uid = v.uid;
+ to->gid = v.gid;
+ to->mode = v.mode;
+ return 0;
}
-static inline int put_compat_semid64_ds(struct semid64_ds *sem64,
- struct compat_semid64_ds __user *up64)
+int get_compat_ipc_perm(struct ipc64_perm *to,
+ struct compat_ipc_perm __user *from)
{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64)))
+ struct compat_ipc_perm v;
+ if (copy_from_user(&v, from, sizeof(v)))
return -EFAULT;
- err = __put_compat_ipc64_perm(&sem64->sem_perm, &up64->sem_perm);
- err |= __put_user(sem64->sem_otime, &up64->sem_otime);
- err |= __put_user(sem64->sem_ctime, &up64->sem_ctime);
- err |= __put_user(sem64->sem_nsems, &up64->sem_nsems);
- return err;
+ to->uid = v.uid;
+ to->gid = v.gid;
+ to->mode = v.mode;
+ return 0;
}
-static inline int put_compat_semid_ds(struct semid64_ds *s,
- struct compat_semid_ds __user *up)
+void to_compat_ipc64_perm(struct compat_ipc64_perm *to, struct ipc64_perm *from)
{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up, sizeof(*up)))
- return -EFAULT;
- err = __put_compat_ipc_perm(&s->sem_perm, &up->sem_perm);
- err |= __put_user(s->sem_otime, &up->sem_otime);
- err |= __put_user(s->sem_ctime, &up->sem_ctime);
- err |= __put_user(s->sem_nsems, &up->sem_nsems);
- return err;
+ to->key = from->key;
+ to->uid = from->uid;
+ to->gid = from->gid;
+ to->cuid = from->cuid;
+ to->cgid = from->cgid;
+ to->mode = from->mode;
+ to->seq = from->seq;
}
-static long do_compat_semctl(int first, int second, int third, u32 pad)
+void to_compat_ipc_perm(struct compat_ipc_perm *to, struct ipc64_perm *from)
{
- unsigned long fourth;
- int err, err2;
- struct semid64_ds sem64;
- struct semid64_ds __user *up64;
- int version = compat_ipc_parse_version(&third);
-
- memset(&sem64, 0, sizeof(sem64));
-
- if ((third & (~IPC_64)) == SETVAL)
-#ifdef __BIG_ENDIAN
- fourth = (unsigned long)pad << 32;
-#else
- fourth = pad;
-#endif
- else
- fourth = (unsigned long)compat_ptr(pad);
- switch (third & (~IPC_64)) {
- case IPC_INFO:
- case IPC_RMID:
- case SEM_INFO:
- case GETVAL:
- case GETPID:
- case GETNCNT:
- case GETZCNT:
- case GETALL:
- case SETVAL:
- case SETALL:
- err = sys_semctl(first, second, third, fourth);
- break;
-
- case IPC_STAT:
- case SEM_STAT:
- up64 = compat_alloc_user_space(sizeof(sem64));
- fourth = (unsigned long)up64;
- err = sys_semctl(first, second, third, fourth);
- if (err < 0)
- break;
- if (copy_from_user(&sem64, up64, sizeof(sem64)))
- err2 = -EFAULT;
- else if (version == IPC_64)
- err2 = put_compat_semid64_ds(&sem64, compat_ptr(pad));
- else
- err2 = put_compat_semid_ds(&sem64, compat_ptr(pad));
- if (err2)
- err = -EFAULT;
- break;
-
- case IPC_SET:
- if (version == IPC_64)
- err = get_compat_semid64_ds(&sem64, compat_ptr(pad));
- else
- err = get_compat_semid_ds(&sem64, compat_ptr(pad));
-
- up64 = compat_alloc_user_space(sizeof(sem64));
- if (copy_to_user(up64, &sem64, sizeof(sem64)))
- err = -EFAULT;
- if (err)
- break;
-
- fourth = (unsigned long)up64;
- err = sys_semctl(first, second, third, fourth);
- break;
-
- default:
- err = -EINVAL;
- break;
- }
- return err;
-}
-
-static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
-{
- struct compat_msgbuf __user *msgp = dest;
- size_t msgsz;
-
- if (put_user(msg->m_type, &msgp->mtype))
- return -EFAULT;
-
- msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
- if (store_msg(msgp->mtext, msg, msgsz))
- return -EFAULT;
- return msgsz;
-}
-
-#ifndef COMPAT_SHMLBA
-#define COMPAT_SHMLBA SHMLBA
-#endif
-
-#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
-COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
- u32, third, compat_uptr_t, ptr, u32, fifth)
-{
- int version;
- u32 pad;
-
- version = call >> 16; /* hack for backward compatibility */
- call &= 0xffff;
-
- switch (call) {
- case SEMOP:
- /* struct sembuf is the same on 32 and 64bit :)) */
- return sys_semtimedop(first, compat_ptr(ptr), second, NULL);
- case SEMTIMEDOP:
- return compat_sys_semtimedop(first, compat_ptr(ptr), second,
- compat_ptr(fifth));
- case SEMGET:
- return sys_semget(first, second, third);
- case SEMCTL:
- if (!ptr)
- return -EINVAL;
- if (get_user(pad, (u32 __user *) compat_ptr(ptr)))
- return -EFAULT;
- return do_compat_semctl(first, second, third, pad);
-
- case MSGSND: {
- struct compat_msgbuf __user *up = compat_ptr(ptr);
- compat_long_t type;
-
- if (first < 0 || second < 0)
- return -EINVAL;
-
- if (get_user(type, &up->mtype))
- return -EFAULT;
-
- return do_msgsnd(first, type, up->mtext, second, third);
- }
- case MSGRCV: {
- void __user *uptr = compat_ptr(ptr);
-
- if (first < 0 || second < 0)
- return -EINVAL;
-
- if (!version) {
- struct compat_ipc_kludge ipck;
- if (!uptr)
- return -EINVAL;
- if (copy_from_user(&ipck, uptr, sizeof(ipck)))
- return -EFAULT;
- uptr = compat_ptr(ipck.msgp);
- fifth = ipck.msgtyp;
- }
- return do_msgrcv(first, uptr, second, (s32)fifth, third,
- compat_do_msg_fill);
- }
- case MSGGET:
- return sys_msgget(first, second);
- case MSGCTL:
- return compat_sys_msgctl(first, second, compat_ptr(ptr));
-
- case SHMAT: {
- int err;
- unsigned long raddr;
-
- if (version == 1)
- return -EINVAL;
- err = do_shmat(first, compat_ptr(ptr), second, &raddr,
- COMPAT_SHMLBA);
- if (err < 0)
- return err;
- return put_user(raddr, (compat_ulong_t *)compat_ptr(third));
- }
- case SHMDT:
- return sys_shmdt(compat_ptr(ptr));
- case SHMGET:
- return sys_shmget(first, (unsigned)second, third);
- case SHMCTL:
- return compat_sys_shmctl(first, second, compat_ptr(ptr));
- }
-
- return -ENOSYS;
-}
-#endif
-
-COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
-{
- return do_compat_semctl(semid, semnum, cmd, arg);
-}
-
-COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
- compat_ssize_t, msgsz, int, msgflg)
-{
- struct compat_msgbuf __user *up = compat_ptr(msgp);
- compat_long_t mtype;
-
- if (get_user(mtype, &up->mtype))
- return -EFAULT;
- return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
-}
-
-COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
- compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg)
-{
- return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,
- msgflg, compat_do_msg_fill);
-}
-
-static inline int get_compat_msqid64(struct msqid64_ds *m64,
- struct compat_msqid64_ds __user *up64)
-{
- int err;
-
- if (!access_ok(VERIFY_READ, up64, sizeof(*up64)))
- return -EFAULT;
- err = __get_compat_ipc64_perm(&m64->msg_perm, &up64->msg_perm);
- err |= __get_user(m64->msg_qbytes, &up64->msg_qbytes);
- return err;
-}
-
-static inline int get_compat_msqid(struct msqid64_ds *m,
- struct compat_msqid_ds __user *up)
-{
- int err;
-
- if (!access_ok(VERIFY_READ, up, sizeof(*up)))
- return -EFAULT;
- err = __get_compat_ipc_perm(&m->msg_perm, &up->msg_perm);
- err |= __get_user(m->msg_qbytes, &up->msg_qbytes);
- return err;
-}
-
-static inline int put_compat_msqid64_ds(struct msqid64_ds *m64,
- struct compat_msqid64_ds __user *up64)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64)))
- return -EFAULT;
- err = __put_compat_ipc64_perm(&m64->msg_perm, &up64->msg_perm);
- err |= __put_user(m64->msg_stime, &up64->msg_stime);
- err |= __put_user(m64->msg_rtime, &up64->msg_rtime);
- err |= __put_user(m64->msg_ctime, &up64->msg_ctime);
- err |= __put_user(m64->msg_cbytes, &up64->msg_cbytes);
- err |= __put_user(m64->msg_qnum, &up64->msg_qnum);
- err |= __put_user(m64->msg_qbytes, &up64->msg_qbytes);
- err |= __put_user(m64->msg_lspid, &up64->msg_lspid);
- err |= __put_user(m64->msg_lrpid, &up64->msg_lrpid);
- return err;
-}
-
-static inline int put_compat_msqid_ds(struct msqid64_ds *m,
- struct compat_msqid_ds __user *up)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up, sizeof(*up)))
- return -EFAULT;
- err = __put_compat_ipc_perm(&m->msg_perm, &up->msg_perm);
- err |= __put_user(m->msg_stime, &up->msg_stime);
- err |= __put_user(m->msg_rtime, &up->msg_rtime);
- err |= __put_user(m->msg_ctime, &up->msg_ctime);
- err |= __put_user(m->msg_cbytes, &up->msg_cbytes);
- err |= __put_user(m->msg_qnum, &up->msg_qnum);
- err |= __put_user(m->msg_qbytes, &up->msg_qbytes);
- err |= __put_user(m->msg_lspid, &up->msg_lspid);
- err |= __put_user(m->msg_lrpid, &up->msg_lrpid);
- return err;
-}
-
-COMPAT_SYSCALL_DEFINE3(msgctl, int, first, int, second, void __user *, uptr)
-{
- int err, err2;
- struct msqid64_ds m64;
- int version = compat_ipc_parse_version(&second);
- void __user *p;
-
- memset(&m64, 0, sizeof(m64));
-
- switch (second & (~IPC_64)) {
- case IPC_INFO:
- case IPC_RMID:
- case MSG_INFO:
- err = sys_msgctl(first, second, uptr);
- break;
-
- case IPC_SET:
- if (version == IPC_64)
- err = get_compat_msqid64(&m64, uptr);
- else
- err = get_compat_msqid(&m64, uptr);
-
- if (err)
- break;
- p = compat_alloc_user_space(sizeof(m64));
- if (copy_to_user(p, &m64, sizeof(m64)))
- err = -EFAULT;
- else
- err = sys_msgctl(first, second, p);
- break;
-
- case IPC_STAT:
- case MSG_STAT:
- p = compat_alloc_user_space(sizeof(m64));
- err = sys_msgctl(first, second, p);
- if (err < 0)
- break;
- if (copy_from_user(&m64, p, sizeof(m64)))
- err2 = -EFAULT;
- else if (version == IPC_64)
- err2 = put_compat_msqid64_ds(&m64, uptr);
- else
- err2 = put_compat_msqid_ds(&m64, uptr);
- if (err2)
- err = -EFAULT;
- break;
-
- default:
- err = -EINVAL;
- break;
- }
- return err;
-}
-
-COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
-{
- unsigned long ret;
- long err;
-
- err = do_shmat(shmid, compat_ptr(shmaddr), shmflg, &ret, COMPAT_SHMLBA);
- if (err)
- return err;
- force_successful_syscall_return();
- return (long)ret;
-}
-
-static inline int get_compat_shmid64_ds(struct shmid64_ds *sem64,
- struct compat_shmid64_ds __user *up64)
-{
- if (!access_ok(VERIFY_READ, up64, sizeof(*up64)))
- return -EFAULT;
- return __get_compat_ipc64_perm(&sem64->shm_perm, &up64->shm_perm);
-}
-
-static inline int get_compat_shmid_ds(struct shmid64_ds *s,
- struct compat_shmid_ds __user *up)
-{
- if (!access_ok(VERIFY_READ, up, sizeof(*up)))
- return -EFAULT;
- return __get_compat_ipc_perm(&s->shm_perm, &up->shm_perm);
-}
-
-static inline int put_compat_shmid64_ds(struct shmid64_ds *sem64,
- struct compat_shmid64_ds __user *up64)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64)))
- return -EFAULT;
- err = __put_compat_ipc64_perm(&sem64->shm_perm, &up64->shm_perm);
- err |= __put_user(sem64->shm_atime, &up64->shm_atime);
- err |= __put_user(sem64->shm_dtime, &up64->shm_dtime);
- err |= __put_user(sem64->shm_ctime, &up64->shm_ctime);
- err |= __put_user(sem64->shm_segsz, &up64->shm_segsz);
- err |= __put_user(sem64->shm_nattch, &up64->shm_nattch);
- err |= __put_user(sem64->shm_cpid, &up64->shm_cpid);
- err |= __put_user(sem64->shm_lpid, &up64->shm_lpid);
- return err;
-}
-
-static inline int put_compat_shmid_ds(struct shmid64_ds *s,
- struct compat_shmid_ds __user *up)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up, sizeof(*up)))
- return -EFAULT;
- err = __put_compat_ipc_perm(&s->shm_perm, &up->shm_perm);
- err |= __put_user(s->shm_atime, &up->shm_atime);
- err |= __put_user(s->shm_dtime, &up->shm_dtime);
- err |= __put_user(s->shm_ctime, &up->shm_ctime);
- err |= __put_user(s->shm_segsz, &up->shm_segsz);
- err |= __put_user(s->shm_nattch, &up->shm_nattch);
- err |= __put_user(s->shm_cpid, &up->shm_cpid);
- err |= __put_user(s->shm_lpid, &up->shm_lpid);
- return err;
-}
-
-static inline int put_compat_shminfo64(struct shminfo64 *smi,
- struct compat_shminfo64 __user *up64)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64)))
- return -EFAULT;
- if (smi->shmmax > INT_MAX)
- smi->shmmax = INT_MAX;
- err = __put_user(smi->shmmax, &up64->shmmax);
- err |= __put_user(smi->shmmin, &up64->shmmin);
- err |= __put_user(smi->shmmni, &up64->shmmni);
- err |= __put_user(smi->shmseg, &up64->shmseg);
- err |= __put_user(smi->shmall, &up64->shmall);
- return err;
-}
-
-static inline int put_compat_shminfo(struct shminfo64 *smi,
- struct shminfo __user *up)
-{
- int err;
-
- if (!access_ok(VERIFY_WRITE, up, sizeof(*up)))
- return -EFAULT;
- if (smi->shmmax > INT_MAX)
- smi->shmmax = INT_MAX;
- err = __put_user(smi->shmmax, &up->shmmax);
- err |= __put_user(smi->shmmin, &up->shmmin);
- err |= __put_user(smi->shmmni, &up->shmmni);
- err |= __put_user(smi->shmseg, &up->shmseg);
- err |= __put_user(smi->shmall, &up->shmall);
- return err;
-}
-
-static inline int put_compat_shm_info(struct shm_info __user *ip,
- struct compat_shm_info __user *uip)
-{
- int err;
- struct shm_info si;
-
- if (!access_ok(VERIFY_WRITE, uip, sizeof(*uip)) ||
- copy_from_user(&si, ip, sizeof(si)))
- return -EFAULT;
- err = __put_user(si.used_ids, &uip->used_ids);
- err |= __put_user(si.shm_tot, &uip->shm_tot);
- err |= __put_user(si.shm_rss, &uip->shm_rss);
- err |= __put_user(si.shm_swp, &uip->shm_swp);
- err |= __put_user(si.swap_attempts, &uip->swap_attempts);
- err |= __put_user(si.swap_successes, &uip->swap_successes);
- return err;
-}
-
-COMPAT_SYSCALL_DEFINE3(shmctl, int, first, int, second, void __user *, uptr)
-{
- void __user *p;
- struct shmid64_ds sem64;
- struct shminfo64 smi;
- int err, err2;
- int version = compat_ipc_parse_version(&second);
-
- memset(&sem64, 0, sizeof(sem64));
-
- switch (second & (~IPC_64)) {
- case IPC_RMID:
- case SHM_LOCK:
- case SHM_UNLOCK:
- err = sys_shmctl(first, second, uptr);
- break;
-
- case IPC_INFO:
- p = compat_alloc_user_space(sizeof(smi));
- err = sys_shmctl(first, second, p);
- if (err < 0)
- break;
- if (copy_from_user(&smi, p, sizeof(smi)))
- err2 = -EFAULT;
- else if (version == IPC_64)
- err2 = put_compat_shminfo64(&smi, uptr);
- else
- err2 = put_compat_shminfo(&smi, uptr);
- if (err2)
- err = -EFAULT;
- break;
-
-
- case IPC_SET:
- if (version == IPC_64)
- err = get_compat_shmid64_ds(&sem64, uptr);
- else
- err = get_compat_shmid_ds(&sem64, uptr);
-
- if (err)
- break;
- p = compat_alloc_user_space(sizeof(sem64));
- if (copy_to_user(p, &sem64, sizeof(sem64)))
- err = -EFAULT;
- else
- err = sys_shmctl(first, second, p);
- break;
-
- case IPC_STAT:
- case SHM_STAT:
- p = compat_alloc_user_space(sizeof(sem64));
- err = sys_shmctl(first, second, p);
- if (err < 0)
- break;
- if (copy_from_user(&sem64, p, sizeof(sem64)))
- err2 = -EFAULT;
- else if (version == IPC_64)
- err2 = put_compat_shmid64_ds(&sem64, uptr);
- else
- err2 = put_compat_shmid_ds(&sem64, uptr);
- if (err2)
- err = -EFAULT;
- break;
-
- case SHM_INFO:
- p = compat_alloc_user_space(sizeof(struct shm_info));
- err = sys_shmctl(first, second, p);
- if (err < 0)
- break;
- err2 = put_compat_shm_info(p, uptr);
- if (err2)
- err = -EFAULT;
- break;
-
- default:
- err = -EINVAL;
- break;
- }
- return err;
-}
-
-COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
- unsigned, nsops,
- const struct compat_timespec __user *, timeout)
-{
- struct timespec __user *ts64;
- if (compat_convert_timespec(&ts64, timeout))
- return -EFAULT;
- return sys_semtimedop(semid, tsems, nsops, ts64);
+ to->key = from->key;
+ SET_UID(to->uid, from->uid);
+ SET_GID(to->gid, from->gid);
+ SET_UID(to->cuid, from->cuid);
+ SET_GID(to->cgid, from->cgid);
+ to->mode = from->mode;
+ to->seq = from->seq;
}
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index eb1391b52c6f..d24025626310 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -668,11 +668,11 @@ static void __do_notify(struct mqueue_inode_info *info)
}
static int prepare_timeout(const struct timespec __user *u_abs_timeout,
- struct timespec *ts)
+ struct timespec64 *ts)
{
- if (copy_from_user(ts, u_abs_timeout, sizeof(struct timespec)))
+ if (get_timespec64(ts, u_abs_timeout))
return -EFAULT;
- if (!timespec_valid(ts))
+ if (!timespec64_valid(ts))
return -EINVAL;
return 0;
}
@@ -962,7 +962,7 @@ static inline void pipelined_receive(struct wake_q_head *wake_q,
static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr,
size_t msg_len, unsigned int msg_prio,
- struct timespec *ts)
+ struct timespec64 *ts)
{
struct fd f;
struct inode *inode;
@@ -979,7 +979,7 @@ static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr,
return -EINVAL;
if (ts) {
- expires = timespec_to_ktime(*ts);
+ expires = timespec64_to_ktime(*ts);
timeout = &expires;
}
@@ -1080,7 +1080,7 @@ out:
static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
size_t msg_len, unsigned int __user *u_msg_prio,
- struct timespec *ts)
+ struct timespec64 *ts)
{
ssize_t ret;
struct msg_msg *msg_ptr;
@@ -1092,7 +1092,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
struct posix_msg_tree_node *new_leaf = NULL;
if (ts) {
- expires = timespec_to_ktime(*ts);
+ expires = timespec64_to_ktime(*ts);
timeout = &expires;
}
@@ -1184,7 +1184,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
size_t, msg_len, unsigned int, msg_prio,
const struct timespec __user *, u_abs_timeout)
{
- struct timespec ts, *p = NULL;
+ struct timespec64 ts, *p = NULL;
if (u_abs_timeout) {
int res = prepare_timeout(u_abs_timeout, &ts);
if (res)
@@ -1198,7 +1198,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
size_t, msg_len, unsigned int __user *, u_msg_prio,
const struct timespec __user *, u_abs_timeout)
{
- struct timespec ts, *p = NULL;
+ struct timespec64 ts, *p = NULL;
if (u_abs_timeout) {
int res = prepare_timeout(u_abs_timeout, &ts);
if (res)
@@ -1475,11 +1475,11 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name,
}
static int compat_prepare_timeout(const struct compat_timespec __user *p,
- struct timespec *ts)
+ struct timespec64 *ts)
{
- if (compat_get_timespec(ts, p))
+ if (compat_get_timespec64(ts, p))
return -EFAULT;
- if (!timespec_valid(ts))
+ if (!timespec64_valid(ts))
return -EINVAL;
return 0;
}
@@ -1489,7 +1489,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
compat_size_t, msg_len, unsigned int, msg_prio,
const struct compat_timespec __user *, u_abs_timeout)
{
- struct timespec ts, *p = NULL;
+ struct timespec64 ts, *p = NULL;
if (u_abs_timeout) {
int res = compat_prepare_timeout(u_abs_timeout, &ts);
if (res)
@@ -1504,7 +1504,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
compat_size_t, msg_len, unsigned int __user *, u_msg_prio,
const struct compat_timespec __user *, u_abs_timeout)
{
- struct timespec ts, *p = NULL;
+ struct timespec64 ts, *p = NULL;
if (u_abs_timeout) {
int res = compat_prepare_timeout(u_abs_timeout, &ts);
if (res)
diff --git a/ipc/msg.c b/ipc/msg.c
index df82bc9a5531..06be5a9adfa4 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -133,7 +133,7 @@ static int newque(struct ipc_namespace *ns, struct ipc_params *params)
}
msq->q_stime = msq->q_rtime = 0;
- msq->q_ctime = get_seconds();
+ msq->q_ctime = ktime_get_real_seconds();
msq->q_cbytes = msq->q_qnum = 0;
msq->q_qbytes = ns->msg_ctlmnb;
msq->q_lspid = msq->q_lrpid = 0;
@@ -361,23 +361,17 @@ copy_msqid_from_user(struct msqid64_ds *out, void __user *buf, int version)
* NOTE: no locks must be held, the rwsem is taken inside this function.
*/
static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
- struct msqid_ds __user *buf, int version)
+ struct msqid64_ds *msqid64)
{
struct kern_ipc_perm *ipcp;
- struct msqid64_ds uninitialized_var(msqid64);
struct msg_queue *msq;
int err;
- if (cmd == IPC_SET) {
- if (copy_msqid_from_user(&msqid64, buf, version))
- return -EFAULT;
- }
-
down_write(&msg_ids(ns).rwsem);
rcu_read_lock();
ipcp = ipcctl_pre_down_nolock(ns, &msg_ids(ns), msqid, cmd,
- &msqid64.msg_perm, msqid64.msg_qbytes);
+ &msqid64->msg_perm, msqid64->msg_qbytes);
if (IS_ERR(ipcp)) {
err = PTR_ERR(ipcp);
goto out_unlock1;
@@ -399,20 +393,20 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd,
{
DEFINE_WAKE_Q(wake_q);
- if (msqid64.msg_qbytes > ns->msg_ctlmnb &&
+ if (msqid64->msg_qbytes > ns->msg_ctlmnb &&
!capable(CAP_SYS_RESOURCE)) {
err = -EPERM;
goto out_unlock1;
}
ipc_lock_object(&msq->q_perm);
- err = ipc_update_perm(&msqid64.msg_perm, ipcp);
+ err = ipc_update_perm(&msqid64->msg_perm, ipcp);
if (err)
goto out_unlock0;
- msq->q_qbytes = msqid64.msg_qbytes;
+ msq->q_qbytes = msqid64->msg_qbytes;
- msq->q_ctime = get_seconds();
+ msq->q_ctime = ktime_get_real_seconds();
/*
* Sleeping receivers might be excluded by
* stricter permissions.
@@ -442,111 +436,89 @@ out_up:
return err;
}
-static int msgctl_nolock(struct ipc_namespace *ns, int msqid,
- int cmd, int version, void __user *buf)
+static int msgctl_info(struct ipc_namespace *ns, int msqid,
+ int cmd, struct msginfo *msginfo)
{
int err;
- struct msg_queue *msq;
-
- switch (cmd) {
- case IPC_INFO:
- case MSG_INFO:
- {
- struct msginfo msginfo;
- int max_id;
-
- if (!buf)
- return -EFAULT;
-
- /*
- * We must not return kernel stack data.
- * due to padding, it's not enough
- * to set all member fields.
- */
- err = security_msg_queue_msgctl(NULL, cmd);
- if (err)
- return err;
+ int max_id;
- memset(&msginfo, 0, sizeof(msginfo));
- msginfo.msgmni = ns->msg_ctlmni;
- msginfo.msgmax = ns->msg_ctlmax;
- msginfo.msgmnb = ns->msg_ctlmnb;
- msginfo.msgssz = MSGSSZ;
- msginfo.msgseg = MSGSEG;
- down_read(&msg_ids(ns).rwsem);
- if (cmd == MSG_INFO) {
- msginfo.msgpool = msg_ids(ns).in_use;
- msginfo.msgmap = atomic_read(&ns->msg_hdrs);
- msginfo.msgtql = atomic_read(&ns->msg_bytes);
- } else {
- msginfo.msgmap = MSGMAP;
- msginfo.msgpool = MSGPOOL;
- msginfo.msgtql = MSGTQL;
- }
- max_id = ipc_get_maxid(&msg_ids(ns));
- up_read(&msg_ids(ns).rwsem);
- if (copy_to_user(buf, &msginfo, sizeof(struct msginfo)))
- return -EFAULT;
- return (max_id < 0) ? 0 : max_id;
+ /*
+ * We must not return kernel stack data.
+ * due to padding, it's not enough
+ * to set all member fields.
+ */
+ err = security_msg_queue_msgctl(NULL, cmd);
+ if (err)
+ return err;
+
+ memset(msginfo, 0, sizeof(*msginfo));
+ msginfo->msgmni = ns->msg_ctlmni;
+ msginfo->msgmax = ns->msg_ctlmax;
+ msginfo->msgmnb = ns->msg_ctlmnb;
+ msginfo->msgssz = MSGSSZ;
+ msginfo->msgseg = MSGSEG;
+ down_read(&msg_ids(ns).rwsem);
+ if (cmd == MSG_INFO) {
+ msginfo->msgpool = msg_ids(ns).in_use;
+ msginfo->msgmap = atomic_read(&ns->msg_hdrs);
+ msginfo->msgtql = atomic_read(&ns->msg_bytes);
+ } else {
+ msginfo->msgmap = MSGMAP;
+ msginfo->msgpool = MSGPOOL;
+ msginfo->msgtql = MSGTQL;
}
+ max_id = ipc_get_maxid(&msg_ids(ns));
+ up_read(&msg_ids(ns).rwsem);
+ return (max_id < 0) ? 0 : max_id;
+}
- case MSG_STAT:
- case IPC_STAT:
- {
- struct msqid64_ds tbuf;
- int success_return;
-
- if (!buf)
- return -EFAULT;
-
- memset(&tbuf, 0, sizeof(tbuf));
+static int msgctl_stat(struct ipc_namespace *ns, int msqid,
+ int cmd, struct msqid64_ds *p)
+{
+ int err;
+ struct msg_queue *msq;
+ int success_return;
- rcu_read_lock();
- if (cmd == MSG_STAT) {
- msq = msq_obtain_object(ns, msqid);
- if (IS_ERR(msq)) {
- err = PTR_ERR(msq);
- goto out_unlock;
- }
- success_return = msq->q_perm.id;
- } else {
- msq = msq_obtain_object_check(ns, msqid);
- if (IS_ERR(msq)) {
- err = PTR_ERR(msq);
- goto out_unlock;
- }
- success_return = 0;
- }
+ memset(p, 0, sizeof(*p));
- err = -EACCES;
- if (ipcperms(ns, &msq->q_perm, S_IRUGO))
+ rcu_read_lock();
+ if (cmd == MSG_STAT) {
+ msq = msq_obtain_object(ns, msqid);
+ if (IS_ERR(msq)) {
+ err = PTR_ERR(msq);
goto out_unlock;
-
- err = security_msg_queue_msgctl(msq, cmd);
- if (err)
+ }
+ success_return = msq->q_perm.id;
+ } else {
+ msq = msq_obtain_object_check(ns, msqid);
+ if (IS_ERR(msq)) {
+ err = PTR_ERR(msq);
goto out_unlock;
+ }
+ success_return = 0;
+ }
- kernel_to_ipc64_perm(&msq->q_perm, &tbuf.msg_perm);
- tbuf.msg_stime = msq->q_stime;
- tbuf.msg_rtime = msq->q_rtime;
- tbuf.msg_ctime = msq->q_ctime;
- tbuf.msg_cbytes = msq->q_cbytes;
- tbuf.msg_qnum = msq->q_qnum;
- tbuf.msg_qbytes = msq->q_qbytes;
- tbuf.msg_lspid = msq->q_lspid;
- tbuf.msg_lrpid = msq->q_lrpid;
- rcu_read_unlock();
+ err = -EACCES;
+ if (ipcperms(ns, &msq->q_perm, S_IRUGO))
+ goto out_unlock;
- if (copy_msqid_to_user(buf, &tbuf, version))
- return -EFAULT;
- return success_return;
- }
+ err = security_msg_queue_msgctl(msq, cmd);
+ if (err)
+ goto out_unlock;
+
+ kernel_to_ipc64_perm(&msq->q_perm, &p->msg_perm);
+ p->msg_stime = msq->q_stime;
+ p->msg_rtime = msq->q_rtime;
+ p->msg_ctime = msq->q_ctime;
+ p->msg_cbytes = msq->q_cbytes;
+ p->msg_qnum = msq->q_qnum;
+ p->msg_qbytes = msq->q_qbytes;
+ p->msg_lspid = msq->q_lspid;
+ p->msg_lrpid = msq->q_lrpid;
+ rcu_read_unlock();
- default:
- return -EINVAL;
- }
+ return success_return;
- return err;
out_unlock:
rcu_read_unlock();
return err;
@@ -556,6 +528,8 @@ SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
{
int version;
struct ipc_namespace *ns;
+ struct msqid64_ds msqid64;
+ int err;
if (msqid < 0 || cmd < 0)
return -EINVAL;
@@ -565,18 +539,147 @@ SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
switch (cmd) {
case IPC_INFO:
- case MSG_INFO:
+ case MSG_INFO: {
+ struct msginfo msginfo;
+ err = msgctl_info(ns, msqid, cmd, &msginfo);
+ if (err < 0)
+ return err;
+ if (copy_to_user(buf, &msginfo, sizeof(struct msginfo)))
+ err = -EFAULT;
+ return err;
+ }
case MSG_STAT: /* msqid is an index rather than a msg queue id */
case IPC_STAT:
- return msgctl_nolock(ns, msqid, cmd, version, buf);
+ err = msgctl_stat(ns, msqid, cmd, &msqid64);
+ if (err < 0)
+ return err;
+ if (copy_msqid_to_user(buf, &msqid64, version))
+ err = -EFAULT;
+ return err;
case IPC_SET:
+ if (copy_msqid_from_user(&msqid64, buf, version))
+ return -EFAULT;
+ /* fallthru */
case IPC_RMID:
- return msgctl_down(ns, msqid, cmd, buf, version);
+ return msgctl_down(ns, msqid, cmd, &msqid64);
default:
return -EINVAL;
}
}
+#ifdef CONFIG_COMPAT
+
+struct compat_msqid_ds {
+ struct compat_ipc_perm msg_perm;
+ compat_uptr_t msg_first;
+ compat_uptr_t msg_last;
+ compat_time_t msg_stime;
+ compat_time_t msg_rtime;
+ compat_time_t msg_ctime;
+ compat_ulong_t msg_lcbytes;
+ compat_ulong_t msg_lqbytes;
+ unsigned short msg_cbytes;
+ unsigned short msg_qnum;
+ unsigned short msg_qbytes;
+ compat_ipc_pid_t msg_lspid;
+ compat_ipc_pid_t msg_lrpid;
+};
+
+static int copy_compat_msqid_from_user(struct msqid64_ds *out, void __user *buf,
+ int version)
+{
+ memset(out, 0, sizeof(*out));
+ if (version == IPC_64) {
+ struct compat_msqid64_ds *p = buf;
+ if (get_compat_ipc64_perm(&out->msg_perm, &p->msg_perm))
+ return -EFAULT;
+ if (get_user(out->msg_qbytes, &p->msg_qbytes))
+ return -EFAULT;
+ } else {
+ struct compat_msqid_ds *p = buf;
+ if (get_compat_ipc_perm(&out->msg_perm, &p->msg_perm))
+ return -EFAULT;
+ if (get_user(out->msg_qbytes, &p->msg_qbytes))
+ return -EFAULT;
+ }
+ return 0;
+}
+
+static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,
+ int version)
+{
+ if (version == IPC_64) {
+ struct compat_msqid64_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc64_perm(&v.msg_perm, &in->msg_perm);
+ v.msg_stime = in->msg_stime;
+ v.msg_rtime = in->msg_rtime;
+ v.msg_ctime = in->msg_ctime;
+ v.msg_cbytes = in->msg_cbytes;
+ v.msg_qnum = in->msg_qnum;
+ v.msg_qbytes = in->msg_qbytes;
+ v.msg_lspid = in->msg_lspid;
+ v.msg_lrpid = in->msg_lrpid;
+ return copy_to_user(buf, &v, sizeof(v));
+ } else {
+ struct compat_msqid_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc_perm(&v.msg_perm, &in->msg_perm);
+ v.msg_stime = in->msg_stime;
+ v.msg_rtime = in->msg_rtime;
+ v.msg_ctime = in->msg_ctime;
+ v.msg_cbytes = in->msg_cbytes;
+ v.msg_qnum = in->msg_qnum;
+ v.msg_qbytes = in->msg_qbytes;
+ v.msg_lspid = in->msg_lspid;
+ v.msg_lrpid = in->msg_lrpid;
+ return copy_to_user(buf, &v, sizeof(v));
+ }
+}
+
+COMPAT_SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, void __user *, uptr)
+{
+ struct ipc_namespace *ns;
+ int err;
+ struct msqid64_ds msqid64;
+ int version = compat_ipc_parse_version(&cmd);
+
+ ns = current->nsproxy->ipc_ns;
+
+ if (msqid < 0 || cmd < 0)
+ return -EINVAL;
+
+ switch (cmd & (~IPC_64)) {
+ case IPC_INFO:
+ case MSG_INFO: {
+ struct msginfo msginfo;
+ err = msgctl_info(ns, msqid, cmd, &msginfo);
+ if (err < 0)
+ return err;
+ if (copy_to_user(uptr, &msginfo, sizeof(struct msginfo)))
+ err = -EFAULT;
+ return err;
+ }
+ case IPC_STAT:
+ case MSG_STAT:
+ err = msgctl_stat(ns, msqid, cmd, &msqid64);
+ if (err < 0)
+ return err;
+ if (copy_compat_msqid_to_user(uptr, &msqid64, version))
+ err = -EFAULT;
+ return err;
+ case IPC_SET:
+ if (copy_compat_msqid_from_user(&msqid64, uptr, version))
+ return -EFAULT;
+ /* fallthru */
+ case IPC_RMID:
+ return msgctl_down(ns, msqid, cmd, &msqid64);
+ default:
+ return -EINVAL;
+ }
+}
+#endif
+
static int testmsg(struct msg_msg *msg, long type, int mode)
{
switch (mode) {
@@ -627,7 +730,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
return 0;
}
-long do_msgsnd(int msqid, long mtype, void __user *mtext,
+static long do_msgsnd(int msqid, long mtype, void __user *mtext,
size_t msgsz, int msgflg)
{
struct msg_queue *msq;
@@ -750,6 +853,25 @@ SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
}
+#ifdef CONFIG_COMPAT
+
+struct compat_msgbuf {
+ compat_long_t mtype;
+ char mtext[1];
+};
+
+COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
+ compat_ssize_t, msgsz, int, msgflg)
+{
+ struct compat_msgbuf __user *up = compat_ptr(msgp);
+ compat_long_t mtype;
+
+ if (get_user(mtype, &up->mtype))
+ return -EFAULT;
+ return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
+}
+#endif
+
static inline int convert_mode(long *msgtyp, int msgflg)
{
if (msgflg & MSG_COPY)
@@ -846,7 +968,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
return found ?: ERR_PTR(-EAGAIN);
}
-long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
+static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
long (*msg_handler)(void __user *, struct msg_msg *, size_t))
{
int mode;
@@ -1010,6 +1132,28 @@ SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill);
}
+#ifdef CONFIG_COMPAT
+static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
+{
+ struct compat_msgbuf __user *msgp = dest;
+ size_t msgsz;
+
+ if (put_user(msg->m_type, &msgp->mtype))
+ return -EFAULT;
+
+ msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
+ if (store_msg(msgp->mtext, msg, msgsz))
+ return -EFAULT;
+ return msgsz;
+}
+
+COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
+ compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg)
+{
+ return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,
+ msgflg, compat_do_msg_fill);
+}
+#endif
int msg_init_ns(struct ipc_namespace *ns)
{
@@ -1039,7 +1183,7 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it)
struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
seq_printf(s,
- "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n",
+ "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10llu %10llu %10llu\n",
msq->q_perm.key,
msq->q_perm.id,
msq->q_perm.mode,
diff --git a/ipc/sem.c b/ipc/sem.c
index 013c7981f3c7..f7385bce5fd3 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -512,7 +512,7 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
INIT_LIST_HEAD(&sma->pending_const);
INIT_LIST_HEAD(&sma->list_id);
sma->sem_nsems = nsems;
- sma->sem_ctime = get_seconds();
+ sma->sem_ctime = ktime_get_real_seconds();
retval = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
if (retval < 0) {
@@ -1163,14 +1163,14 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in,
}
}
-static time_t get_semotime(struct sem_array *sma)
+static time64_t get_semotime(struct sem_array *sma)
{
int i;
- time_t res;
+ time64_t res;
res = sma->sems[0].sem_otime;
for (i = 1; i < sma->sem_nsems; i++) {
- time_t to = sma->sems[i].sem_otime;
+ time64_t to = sma->sems[i].sem_otime;
if (to > res)
res = to;
@@ -1178,112 +1178,95 @@ static time_t get_semotime(struct sem_array *sma)
return res;
}
-static int semctl_nolock(struct ipc_namespace *ns, int semid,
- int cmd, int version, void __user *p)
+static int semctl_stat(struct ipc_namespace *ns, int semid,
+ int cmd, struct semid64_ds *semid64)
{
- int err;
struct sem_array *sma;
+ int id = 0;
+ int err;
- switch (cmd) {
- case IPC_INFO:
- case SEM_INFO:
- {
- struct seminfo seminfo;
- int max_id;
-
- err = security_sem_semctl(NULL, cmd);
- if (err)
- return err;
+ memset(semid64, 0, sizeof(*semid64));
- memset(&seminfo, 0, sizeof(seminfo));
- seminfo.semmni = ns->sc_semmni;
- seminfo.semmns = ns->sc_semmns;
- seminfo.semmsl = ns->sc_semmsl;
- seminfo.semopm = ns->sc_semopm;
- seminfo.semvmx = SEMVMX;
- seminfo.semmnu = SEMMNU;
- seminfo.semmap = SEMMAP;
- seminfo.semume = SEMUME;
- down_read(&sem_ids(ns).rwsem);
- if (cmd == SEM_INFO) {
- seminfo.semusz = sem_ids(ns).in_use;
- seminfo.semaem = ns->used_sems;
- } else {
- seminfo.semusz = SEMUSZ;
- seminfo.semaem = SEMAEM;
+ rcu_read_lock();
+ if (cmd == SEM_STAT) {
+ sma = sem_obtain_object(ns, semid);
+ if (IS_ERR(sma)) {
+ err = PTR_ERR(sma);
+ goto out_unlock;
+ }
+ id = sma->sem_perm.id;
+ } else {
+ sma = sem_obtain_object_check(ns, semid);
+ if (IS_ERR(sma)) {
+ err = PTR_ERR(sma);
+ goto out_unlock;
}
- max_id = ipc_get_maxid(&sem_ids(ns));
- up_read(&sem_ids(ns).rwsem);
- if (copy_to_user(p, &seminfo, sizeof(struct seminfo)))
- return -EFAULT;
- return (max_id < 0) ? 0 : max_id;
}
- case IPC_STAT:
- case SEM_STAT:
- {
- struct semid64_ds tbuf;
- int id = 0;
-
- memset(&tbuf, 0, sizeof(tbuf));
- rcu_read_lock();
- if (cmd == SEM_STAT) {
- sma = sem_obtain_object(ns, semid);
- if (IS_ERR(sma)) {
- err = PTR_ERR(sma);
- goto out_unlock;
- }
- id = sma->sem_perm.id;
- } else {
- sma = sem_obtain_object_check(ns, semid);
- if (IS_ERR(sma)) {
- err = PTR_ERR(sma);
- goto out_unlock;
- }
- }
+ err = -EACCES;
+ if (ipcperms(ns, &sma->sem_perm, S_IRUGO))
+ goto out_unlock;
- err = -EACCES;
- if (ipcperms(ns, &sma->sem_perm, S_IRUGO))
- goto out_unlock;
+ err = security_sem_semctl(sma, cmd);
+ if (err)
+ goto out_unlock;
- err = security_sem_semctl(sma, cmd);
- if (err)
- goto out_unlock;
+ kernel_to_ipc64_perm(&sma->sem_perm, &semid64->sem_perm);
+ semid64->sem_otime = get_semotime(sma);
+ semid64->sem_ctime = sma->sem_ctime;
+ semid64->sem_nsems = sma->sem_nsems;
+ rcu_read_unlock();
+ return id;
- kernel_to_ipc64_perm(&sma->sem_perm, &tbuf.sem_perm);
- tbuf.sem_otime = get_semotime(sma);
- tbuf.sem_ctime = sma->sem_ctime;
- tbuf.sem_nsems = sma->sem_nsems;
- rcu_read_unlock();
- if (copy_semid_to_user(p, &tbuf, version))
- return -EFAULT;
- return id;
- }
- default:
- return -EINVAL;
- }
out_unlock:
rcu_read_unlock();
return err;
}
+static int semctl_info(struct ipc_namespace *ns, int semid,
+ int cmd, void __user *p)
+{
+ struct seminfo seminfo;
+ int max_id;
+ int err;
+
+ err = security_sem_semctl(NULL, cmd);
+ if (err)
+ return err;
+
+ memset(&seminfo, 0, sizeof(seminfo));
+ seminfo.semmni = ns->sc_semmni;
+ seminfo.semmns = ns->sc_semmns;
+ seminfo.semmsl = ns->sc_semmsl;
+ seminfo.semopm = ns->sc_semopm;
+ seminfo.semvmx = SEMVMX;
+ seminfo.semmnu = SEMMNU;
+ seminfo.semmap = SEMMAP;
+ seminfo.semume = SEMUME;
+ down_read(&sem_ids(ns).rwsem);
+ if (cmd == SEM_INFO) {
+ seminfo.semusz = sem_ids(ns).in_use;
+ seminfo.semaem = ns->used_sems;
+ } else {
+ seminfo.semusz = SEMUSZ;
+ seminfo.semaem = SEMAEM;
+ }
+ max_id = ipc_get_maxid(&sem_ids(ns));
+ up_read(&sem_ids(ns).rwsem);
+ if (copy_to_user(p, &seminfo, sizeof(struct seminfo)))
+ return -EFAULT;
+ return (max_id < 0) ? 0 : max_id;
+}
+
static int semctl_setval(struct ipc_namespace *ns, int semid, int semnum,
- unsigned long arg)
+ int val)
{
struct sem_undo *un;
struct sem_array *sma;
struct sem *curr;
- int err, val;
+ int err;
DEFINE_WAKE_Q(wake_q);
-#if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN)
- /* big-endian 64bit */
- val = arg >> 32;
-#else
- /* 32bit or little-endian 64bit */
- val = arg;
-#endif
-
if (val > SEMVMX || val < 0)
return -ERANGE;
@@ -1327,7 +1310,7 @@ static int semctl_setval(struct ipc_namespace *ns, int semid, int semnum,
curr->semval = val;
curr->sempid = task_tgid_vnr(current);
- sma->sem_ctime = get_seconds();
+ sma->sem_ctime = ktime_get_real_seconds();
/* maybe some queued-up processes were waiting for this */
do_smart_update(sma, NULL, 0, 0, &wake_q);
sem_unlock(sma, -1);
@@ -1455,7 +1438,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
for (i = 0; i < nsems; i++)
un->semadj[i] = 0;
}
- sma->sem_ctime = get_seconds();
+ sma->sem_ctime = ktime_get_real_seconds();
/* maybe some queued-up processes were waiting for this */
do_smart_update(sma, NULL, 0, 0, &wake_q);
err = 0;
@@ -1532,23 +1515,17 @@ copy_semid_from_user(struct semid64_ds *out, void __user *buf, int version)
* NOTE: no locks must be held, the rwsem is taken inside this function.
*/
static int semctl_down(struct ipc_namespace *ns, int semid,
- int cmd, int version, void __user *p)
+ int cmd, struct semid64_ds *semid64)
{
struct sem_array *sma;
int err;
- struct semid64_ds semid64;
struct kern_ipc_perm *ipcp;
- if (cmd == IPC_SET) {
- if (copy_semid_from_user(&semid64, p, version))
- return -EFAULT;
- }
-
down_write(&sem_ids(ns).rwsem);
rcu_read_lock();
ipcp = ipcctl_pre_down_nolock(ns, &sem_ids(ns), semid, cmd,
- &semid64.sem_perm, 0);
+ &semid64->sem_perm, 0);
if (IS_ERR(ipcp)) {
err = PTR_ERR(ipcp);
goto out_unlock1;
@@ -1568,10 +1545,10 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
goto out_up;
case IPC_SET:
sem_lock(sma, NULL, -1);
- err = ipc_update_perm(&semid64.sem_perm, ipcp);
+ err = ipc_update_perm(&semid64->sem_perm, ipcp);
if (err)
goto out_unlock0;
- sma->sem_ctime = get_seconds();
+ sma->sem_ctime = ktime_get_real_seconds();
break;
default:
err = -EINVAL;
@@ -1592,6 +1569,8 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
int version;
struct ipc_namespace *ns;
void __user *p = (void __user *)arg;
+ struct semid64_ds semid64;
+ int err;
if (semid < 0)
return -EINVAL;
@@ -1602,9 +1581,15 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
switch (cmd) {
case IPC_INFO:
case SEM_INFO:
+ return semctl_info(ns, semid, cmd, p);
case IPC_STAT:
case SEM_STAT:
- return semctl_nolock(ns, semid, cmd, version, p);
+ err = semctl_stat(ns, semid, cmd, &semid64);
+ if (err < 0)
+ return err;
+ if (copy_semid_to_user(p, &semid64, version))
+ err = -EFAULT;
+ return err;
case GETALL:
case GETVAL:
case GETPID:
@@ -1612,15 +1597,120 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
case GETZCNT:
case SETALL:
return semctl_main(ns, semid, semnum, cmd, p);
+ case SETVAL: {
+ int val;
+#if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN)
+ /* big-endian 64bit */
+ val = arg >> 32;
+#else
+ /* 32bit or little-endian 64bit */
+ val = arg;
+#endif
+ return semctl_setval(ns, semid, semnum, val);
+ }
+ case IPC_SET:
+ if (copy_semid_from_user(&semid64, p, version))
+ return -EFAULT;
+ case IPC_RMID:
+ return semctl_down(ns, semid, cmd, &semid64);
+ default:
+ return -EINVAL;
+ }
+}
+
+#ifdef CONFIG_COMPAT
+
+struct compat_semid_ds {
+ struct compat_ipc_perm sem_perm;
+ compat_time_t sem_otime;
+ compat_time_t sem_ctime;
+ compat_uptr_t sem_base;
+ compat_uptr_t sem_pending;
+ compat_uptr_t sem_pending_last;
+ compat_uptr_t undo;
+ unsigned short sem_nsems;
+};
+
+static int copy_compat_semid_from_user(struct semid64_ds *out, void __user *buf,
+ int version)
+{
+ memset(out, 0, sizeof(*out));
+ if (version == IPC_64) {
+ struct compat_semid64_ds *p = buf;
+ return get_compat_ipc64_perm(&out->sem_perm, &p->sem_perm);
+ } else {
+ struct compat_semid_ds *p = buf;
+ return get_compat_ipc_perm(&out->sem_perm, &p->sem_perm);
+ }
+}
+
+static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
+ int version)
+{
+ if (version == IPC_64) {
+ struct compat_semid64_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc64_perm(&v.sem_perm, &in->sem_perm);
+ v.sem_otime = in->sem_otime;
+ v.sem_ctime = in->sem_ctime;
+ v.sem_nsems = in->sem_nsems;
+ return copy_to_user(buf, &v, sizeof(v));
+ } else {
+ struct compat_semid_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc_perm(&v.sem_perm, &in->sem_perm);
+ v.sem_otime = in->sem_otime;
+ v.sem_ctime = in->sem_ctime;
+ v.sem_nsems = in->sem_nsems;
+ return copy_to_user(buf, &v, sizeof(v));
+ }
+}
+
+COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
+{
+ void __user *p = compat_ptr(arg);
+ struct ipc_namespace *ns;
+ struct semid64_ds semid64;
+ int version = compat_ipc_parse_version(&cmd);
+ int err;
+
+ ns = current->nsproxy->ipc_ns;
+
+ if (semid < 0)
+ return -EINVAL;
+
+ switch (cmd & (~IPC_64)) {
+ case IPC_INFO:
+ case SEM_INFO:
+ return semctl_info(ns, semid, cmd, p);
+ case IPC_STAT:
+ case SEM_STAT:
+ err = semctl_stat(ns, semid, cmd, &semid64);
+ if (err < 0)
+ return err;
+ if (copy_compat_semid_to_user(p, &semid64, version))
+ err = -EFAULT;
+ return err;
+ case GETVAL:
+ case GETPID:
+ case GETNCNT:
+ case GETZCNT:
+ case GETALL:
+ case SETALL:
+ return semctl_main(ns, semid, semnum, cmd, p);
case SETVAL:
return semctl_setval(ns, semid, semnum, arg);
- case IPC_RMID:
case IPC_SET:
- return semctl_down(ns, semid, cmd, version, p);
+ if (copy_compat_semid_from_user(&semid64, p, version))
+ return -EFAULT;
+ /* fallthru */
+ case IPC_RMID:
+ return semctl_down(ns, semid, cmd, &semid64);
default:
return -EINVAL;
}
}
+#endif
/* If the task doesn't already have a undo_list, then allocate one
* here. We guarantee there is only one thread using this undo list,
@@ -1766,8 +1856,8 @@ out:
return un;
}
-SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
- unsigned, nsops, const struct timespec __user *, timeout)
+static long do_semtimedop(int semid, struct sembuf __user *tsops,
+ unsigned nsops, const struct timespec64 *timeout)
{
int error = -EINVAL;
struct sem_array *sma;
@@ -1798,17 +1888,12 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
}
if (timeout) {
- struct timespec _timeout;
- if (copy_from_user(&_timeout, timeout, sizeof(*timeout))) {
- error = -EFAULT;
- goto out_free;
- }
- if (_timeout.tv_sec < 0 || _timeout.tv_nsec < 0 ||
- _timeout.tv_nsec >= 1000000000L) {
+ if (timeout->tv_sec < 0 || timeout->tv_nsec < 0 ||
+ timeout->tv_nsec >= 1000000000L) {
error = -EINVAL;
goto out_free;
}
- jiffies_left = timespec_to_jiffies(&_timeout);
+ jiffies_left = timespec64_to_jiffies(timeout);
}
max = 0;
@@ -2023,10 +2108,37 @@ out_free:
return error;
}
+SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
+ unsigned, nsops, const struct timespec __user *, timeout)
+{
+ if (timeout) {
+ struct timespec64 ts;
+ if (get_timespec64(&ts, timeout))
+ return -EFAULT;
+ return do_semtimedop(semid, tsops, nsops, &ts);
+ }
+ return do_semtimedop(semid, tsops, nsops, NULL);
+}
+
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
+ unsigned, nsops,
+ const struct compat_timespec __user *, timeout)
+{
+ if (timeout) {
+ struct timespec64 ts;
+ if (compat_get_timespec64(&ts, timeout))
+ return -EFAULT;
+ return do_semtimedop(semid, tsems, nsops, &ts);
+ }
+ return do_semtimedop(semid, tsems, nsops, NULL);
+}
+#endif
+
SYSCALL_DEFINE3(semop, int, semid, struct sembuf __user *, tsops,
unsigned, nsops)
{
- return sys_semtimedop(semid, tsops, nsops, NULL);
+ return do_semtimedop(semid, tsops, nsops, NULL);
}
/* If CLONE_SYSVSEM is set, establish sharing of SEM_UNDO state between
@@ -2183,7 +2295,7 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it)
struct user_namespace *user_ns = seq_user_ns(s);
struct kern_ipc_perm *ipcp = it;
struct sem_array *sma = container_of(ipcp, struct sem_array, sem_perm);
- time_t sem_otime;
+ time64_t sem_otime;
/*
* The proc interface isn't aware of sem_lock(), it calls
@@ -2196,7 +2308,7 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it)
sem_otime = get_semotime(sma);
seq_printf(s,
- "%10d %10d %4o %10u %5u %5u %5u %5u %10lu %10lu\n",
+ "%10d %10d %4o %10u %5u %5u %5u %5u %10llu %10llu\n",
sma->sem_perm.key,
sma->sem_perm.id,
sma->sem_perm.mode,
diff --git a/ipc/shm.c b/ipc/shm.c
index 8fc97beb5234..badac463e2c8 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -202,7 +202,7 @@ static int __shm_open(struct vm_area_struct *vma)
if (IS_ERR(shp))
return PTR_ERR(shp);
- shp->shm_atim = get_seconds();
+ shp->shm_atim = ktime_get_real_seconds();
shp->shm_lprid = task_tgid_vnr(current);
shp->shm_nattch++;
shm_unlock(shp);
@@ -289,7 +289,7 @@ static void shm_close(struct vm_area_struct *vma)
goto done; /* no-op */
shp->shm_lprid = task_tgid_vnr(current);
- shp->shm_dtim = get_seconds();
+ shp->shm_dtim = ktime_get_real_seconds();
shp->shm_nattch--;
if (shm_may_destroy(ns, shp))
shm_destroy(ns, shp);
@@ -594,7 +594,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
shp->shm_cprid = task_tgid_vnr(current);
shp->shm_lprid = 0;
shp->shm_atim = shp->shm_dtim = 0;
- shp->shm_ctim = get_seconds();
+ shp->shm_ctim = ktime_get_real_seconds();
shp->shm_segsz = size;
shp->shm_nattch = 0;
shp->shm_file = file;
@@ -815,23 +815,17 @@ static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
* NOTE: no locks must be held, the rwsem is taken inside this function.
*/
static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd,
- struct shmid_ds __user *buf, int version)
+ struct shmid64_ds *shmid64)
{
struct kern_ipc_perm *ipcp;
- struct shmid64_ds shmid64;
struct shmid_kernel *shp;
int err;
- if (cmd == IPC_SET) {
- if (copy_shmid_from_user(&shmid64, buf, version))
- return -EFAULT;
- }
-
down_write(&shm_ids(ns).rwsem);
rcu_read_lock();
ipcp = ipcctl_pre_down_nolock(ns, &shm_ids(ns), shmid, cmd,
- &shmid64.shm_perm, 0);
+ &shmid64->shm_perm, 0);
if (IS_ERR(ipcp)) {
err = PTR_ERR(ipcp);
goto out_unlock1;
@@ -851,10 +845,10 @@ static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd,
goto out_up;
case IPC_SET:
ipc_lock_object(&shp->shm_perm);
- err = ipc_update_perm(&shmid64.shm_perm, ipcp);
+ err = ipc_update_perm(&shmid64->shm_perm, ipcp);
if (err)
goto out_unlock0;
- shp->shm_ctim = get_seconds();
+ shp->shm_ctim = ktime_get_real_seconds();
break;
default:
err = -EINVAL;
@@ -870,125 +864,175 @@ out_up:
return err;
}
-static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
- int cmd, int version, void __user *buf)
+static int shmctl_ipc_info(struct ipc_namespace *ns,
+ struct shminfo64 *shminfo)
{
- int err;
- struct shmid_kernel *shp;
-
- /* preliminary security checks for *_INFO */
- if (cmd == IPC_INFO || cmd == SHM_INFO) {
- err = security_shm_shmctl(NULL, cmd);
- if (err)
- return err;
- }
-
- switch (cmd) {
- case IPC_INFO:
- {
- struct shminfo64 shminfo;
-
- memset(&shminfo, 0, sizeof(shminfo));
- shminfo.shmmni = shminfo.shmseg = ns->shm_ctlmni;
- shminfo.shmmax = ns->shm_ctlmax;
- shminfo.shmall = ns->shm_ctlall;
-
- shminfo.shmmin = SHMMIN;
- if (copy_shminfo_to_user(buf, &shminfo, version))
- return -EFAULT;
-
+ int err = security_shm_shmctl(NULL, IPC_INFO);
+ if (!err) {
+ memset(shminfo, 0, sizeof(*shminfo));
+ shminfo->shmmni = shminfo->shmseg = ns->shm_ctlmni;
+ shminfo->shmmax = ns->shm_ctlmax;
+ shminfo->shmall = ns->shm_ctlall;
+ shminfo->shmmin = SHMMIN;
down_read(&shm_ids(ns).rwsem);
err = ipc_get_maxid(&shm_ids(ns));
up_read(&shm_ids(ns).rwsem);
-
if (err < 0)
err = 0;
- goto out;
}
- case SHM_INFO:
- {
- struct shm_info shm_info;
+ return err;
+}
- memset(&shm_info, 0, sizeof(shm_info));
+static int shmctl_shm_info(struct ipc_namespace *ns,
+ struct shm_info *shm_info)
+{
+ int err = security_shm_shmctl(NULL, SHM_INFO);
+ if (!err) {
+ memset(shm_info, 0, sizeof(*shm_info));
down_read(&shm_ids(ns).rwsem);
- shm_info.used_ids = shm_ids(ns).in_use;
- shm_get_stat(ns, &shm_info.shm_rss, &shm_info.shm_swp);
- shm_info.shm_tot = ns->shm_tot;
- shm_info.swap_attempts = 0;
- shm_info.swap_successes = 0;
+ shm_info->used_ids = shm_ids(ns).in_use;
+ shm_get_stat(ns, &shm_info->shm_rss, &shm_info->shm_swp);
+ shm_info->shm_tot = ns->shm_tot;
+ shm_info->swap_attempts = 0;
+ shm_info->swap_successes = 0;
err = ipc_get_maxid(&shm_ids(ns));
up_read(&shm_ids(ns).rwsem);
- if (copy_to_user(buf, &shm_info, sizeof(shm_info))) {
- err = -EFAULT;
- goto out;
+ if (err < 0)
+ err = 0;
+ }
+ return err;
+}
+
+static int shmctl_stat(struct ipc_namespace *ns, int shmid,
+ int cmd, struct shmid64_ds *tbuf)
+{
+ struct shmid_kernel *shp;
+ int result;
+ int err;
+
+ rcu_read_lock();
+ if (cmd == SHM_STAT) {
+ shp = shm_obtain_object(ns, shmid);
+ if (IS_ERR(shp)) {
+ err = PTR_ERR(shp);
+ goto out_unlock;
+ }
+ result = shp->shm_perm.id;
+ } else {
+ shp = shm_obtain_object_check(ns, shmid);
+ if (IS_ERR(shp)) {
+ err = PTR_ERR(shp);
+ goto out_unlock;
}
+ result = 0;
+ }
- err = err < 0 ? 0 : err;
- goto out;
+ err = -EACCES;
+ if (ipcperms(ns, &shp->shm_perm, S_IRUGO))
+ goto out_unlock;
+
+ err = security_shm_shmctl(shp, cmd);
+ if (err)
+ goto out_unlock;
+
+ memset(tbuf, 0, sizeof(*tbuf));
+ kernel_to_ipc64_perm(&shp->shm_perm, &tbuf->shm_perm);
+ tbuf->shm_segsz = shp->shm_segsz;
+ tbuf->shm_atime = shp->shm_atim;
+ tbuf->shm_dtime = shp->shm_dtim;
+ tbuf->shm_ctime = shp->shm_ctim;
+ tbuf->shm_cpid = shp->shm_cprid;
+ tbuf->shm_lpid = shp->shm_lprid;
+ tbuf->shm_nattch = shp->shm_nattch;
+ rcu_read_unlock();
+ return result;
+
+out_unlock:
+ rcu_read_unlock();
+ return err;
+}
+
+static int shmctl_do_lock(struct ipc_namespace *ns, int shmid, int cmd)
+{
+ struct shmid_kernel *shp;
+ struct file *shm_file;
+ int err;
+
+ rcu_read_lock();
+ shp = shm_obtain_object_check(ns, shmid);
+ if (IS_ERR(shp)) {
+ err = PTR_ERR(shp);
+ goto out_unlock1;
}
- case SHM_STAT:
- case IPC_STAT:
- {
- struct shmid64_ds tbuf;
- int result;
-
- rcu_read_lock();
- if (cmd == SHM_STAT) {
- shp = shm_obtain_object(ns, shmid);
- if (IS_ERR(shp)) {
- err = PTR_ERR(shp);
- goto out_unlock;
- }
- result = shp->shm_perm.id;
- } else {
- shp = shm_obtain_object_check(ns, shmid);
- if (IS_ERR(shp)) {
- err = PTR_ERR(shp);
- goto out_unlock;
- }
- result = 0;
- }
- err = -EACCES;
- if (ipcperms(ns, &shp->shm_perm, S_IRUGO))
- goto out_unlock;
+ audit_ipc_obj(&(shp->shm_perm));
+ err = security_shm_shmctl(shp, cmd);
+ if (err)
+ goto out_unlock1;
- err = security_shm_shmctl(shp, cmd);
- if (err)
- goto out_unlock;
+ ipc_lock_object(&shp->shm_perm);
- memset(&tbuf, 0, sizeof(tbuf));
- kernel_to_ipc64_perm(&shp->shm_perm, &tbuf.shm_perm);
- tbuf.shm_segsz = shp->shm_segsz;
- tbuf.shm_atime = shp->shm_atim;
- tbuf.shm_dtime = shp->shm_dtim;
- tbuf.shm_ctime = shp->shm_ctim;
- tbuf.shm_cpid = shp->shm_cprid;
- tbuf.shm_lpid = shp->shm_lprid;
- tbuf.shm_nattch = shp->shm_nattch;
- rcu_read_unlock();
-
- if (copy_shmid_to_user(buf, &tbuf, version))
- err = -EFAULT;
- else
- err = result;
- goto out;
+ /* check if shm_destroy() is tearing down shp */
+ if (!ipc_valid_object(&shp->shm_perm)) {
+ err = -EIDRM;
+ goto out_unlock0;
}
- default:
- return -EINVAL;
+
+ if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) {
+ kuid_t euid = current_euid();
+
+ if (!uid_eq(euid, shp->shm_perm.uid) &&
+ !uid_eq(euid, shp->shm_perm.cuid)) {
+ err = -EPERM;
+ goto out_unlock0;
+ }
+ if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) {
+ err = -EPERM;
+ goto out_unlock0;
+ }
}
-out_unlock:
+ shm_file = shp->shm_file;
+ if (is_file_hugepages(shm_file))
+ goto out_unlock0;
+
+ if (cmd == SHM_LOCK) {
+ struct user_struct *user = current_user();
+
+ err = shmem_lock(shm_file, 1, user);
+ if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) {
+ shp->shm_perm.mode |= SHM_LOCKED;
+ shp->mlock_user = user;
+ }
+ goto out_unlock0;
+ }
+
+ /* SHM_UNLOCK */
+ if (!(shp->shm_perm.mode & SHM_LOCKED))
+ goto out_unlock0;
+ shmem_lock(shm_file, 0, shp->mlock_user);
+ shp->shm_perm.mode &= ~SHM_LOCKED;
+ shp->mlock_user = NULL;
+ get_file(shm_file);
+ ipc_unlock_object(&shp->shm_perm);
+ rcu_read_unlock();
+ shmem_unlock_mapping(shm_file->f_mapping);
+
+ fput(shm_file);
+ return err;
+
+out_unlock0:
+ ipc_unlock_object(&shp->shm_perm);
+out_unlock1:
rcu_read_unlock();
-out:
return err;
}
SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
{
- struct shmid_kernel *shp;
int err, version;
struct ipc_namespace *ns;
+ struct shmid64_ds sem64;
if (cmd < 0 || shmid < 0)
return -EINVAL;
@@ -997,92 +1041,222 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
ns = current->nsproxy->ipc_ns;
switch (cmd) {
- case IPC_INFO:
- case SHM_INFO:
+ case IPC_INFO: {
+ struct shminfo64 shminfo;
+ err = shmctl_ipc_info(ns, &shminfo);
+ if (err < 0)
+ return err;
+ if (copy_shminfo_to_user(buf, &shminfo, version))
+ err = -EFAULT;
+ return err;
+ }
+ case SHM_INFO: {
+ struct shm_info shm_info;
+ err = shmctl_shm_info(ns, &shm_info);
+ if (err < 0)
+ return err;
+ if (copy_to_user(buf, &shm_info, sizeof(shm_info)))
+ err = -EFAULT;
+ return err;
+ }
case SHM_STAT:
- case IPC_STAT:
- return shmctl_nolock(ns, shmid, cmd, version, buf);
- case IPC_RMID:
+ case IPC_STAT: {
+ err = shmctl_stat(ns, shmid, cmd, &sem64);
+ if (err < 0)
+ return err;
+ if (copy_shmid_to_user(buf, &sem64, version))
+ err = -EFAULT;
+ return err;
+ }
case IPC_SET:
- return shmctl_down(ns, shmid, cmd, buf, version);
+ if (copy_shmid_from_user(&sem64, buf, version))
+ return -EFAULT;
+ /* fallthru */
+ case IPC_RMID:
+ return shmctl_down(ns, shmid, cmd, &sem64);
case SHM_LOCK:
case SHM_UNLOCK:
- {
- struct file *shm_file;
+ return shmctl_do_lock(ns, shmid, cmd);
+ default:
+ return -EINVAL;
+ }
+}
- rcu_read_lock();
- shp = shm_obtain_object_check(ns, shmid);
- if (IS_ERR(shp)) {
- err = PTR_ERR(shp);
- goto out_unlock1;
- }
+#ifdef CONFIG_COMPAT
+
+struct compat_shmid_ds {
+ struct compat_ipc_perm shm_perm;
+ int shm_segsz;
+ compat_time_t shm_atime;
+ compat_time_t shm_dtime;
+ compat_time_t shm_ctime;
+ compat_ipc_pid_t shm_cpid;
+ compat_ipc_pid_t shm_lpid;
+ unsigned short shm_nattch;
+ unsigned short shm_unused;
+ compat_uptr_t shm_unused2;
+ compat_uptr_t shm_unused3;
+};
- audit_ipc_obj(&(shp->shm_perm));
- err = security_shm_shmctl(shp, cmd);
- if (err)
- goto out_unlock1;
+struct compat_shminfo64 {
+ compat_ulong_t shmmax;
+ compat_ulong_t shmmin;
+ compat_ulong_t shmmni;
+ compat_ulong_t shmseg;
+ compat_ulong_t shmall;
+ compat_ulong_t __unused1;
+ compat_ulong_t __unused2;
+ compat_ulong_t __unused3;
+ compat_ulong_t __unused4;
+};
- ipc_lock_object(&shp->shm_perm);
+struct compat_shm_info {
+ compat_int_t used_ids;
+ compat_ulong_t shm_tot, shm_rss, shm_swp;
+ compat_ulong_t swap_attempts, swap_successes;
+};
- /* check if shm_destroy() is tearing down shp */
- if (!ipc_valid_object(&shp->shm_perm)) {
- err = -EIDRM;
- goto out_unlock0;
- }
+static int copy_compat_shminfo_to_user(void __user *buf, struct shminfo64 *in,
+ int version)
+{
+ if (in->shmmax > INT_MAX)
+ in->shmmax = INT_MAX;
+ if (version == IPC_64) {
+ struct compat_shminfo64 info;
+ memset(&info, 0, sizeof(info));
+ info.shmmax = in->shmmax;
+ info.shmmin = in->shmmin;
+ info.shmmni = in->shmmni;
+ info.shmseg = in->shmseg;
+ info.shmall = in->shmall;
+ return copy_to_user(buf, &info, sizeof(info));
+ } else {
+ struct shminfo info;
+ memset(&info, 0, sizeof(info));
+ info.shmmax = in->shmmax;
+ info.shmmin = in->shmmin;
+ info.shmmni = in->shmmni;
+ info.shmseg = in->shmseg;
+ info.shmall = in->shmall;
+ return copy_to_user(buf, &info, sizeof(info));
+ }
+}
- if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) {
- kuid_t euid = current_euid();
-
- if (!uid_eq(euid, shp->shm_perm.uid) &&
- !uid_eq(euid, shp->shm_perm.cuid)) {
- err = -EPERM;
- goto out_unlock0;
- }
- if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) {
- err = -EPERM;
- goto out_unlock0;
- }
- }
+static int put_compat_shm_info(struct shm_info *ip,
+ struct compat_shm_info __user *uip)
+{
+ struct compat_shm_info info;
+
+ memset(&info, 0, sizeof(info));
+ info.used_ids = ip->used_ids;
+ info.shm_tot = ip->shm_tot;
+ info.shm_rss = ip->shm_rss;
+ info.shm_swp = ip->shm_swp;
+ info.swap_attempts = ip->swap_attempts;
+ info.swap_successes = ip->swap_successes;
+ return copy_to_user(uip, &info, sizeof(info));
+}
- shm_file = shp->shm_file;
- if (is_file_hugepages(shm_file))
- goto out_unlock0;
+static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,
+ int version)
+{
+ if (version == IPC_64) {
+ struct compat_shmid64_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm);
+ v.shm_atime = in->shm_atime;
+ v.shm_dtime = in->shm_dtime;
+ v.shm_ctime = in->shm_ctime;
+ v.shm_segsz = in->shm_segsz;
+ v.shm_nattch = in->shm_nattch;
+ v.shm_cpid = in->shm_cpid;
+ v.shm_lpid = in->shm_lpid;
+ return copy_to_user(buf, &v, sizeof(v));
+ } else {
+ struct compat_shmid_ds v;
+ memset(&v, 0, sizeof(v));
+ to_compat_ipc_perm(&v.shm_perm, &in->shm_perm);
+ v.shm_perm.key = in->shm_perm.key;
+ v.shm_atime = in->shm_atime;
+ v.shm_dtime = in->shm_dtime;
+ v.shm_ctime = in->shm_ctime;
+ v.shm_segsz = in->shm_segsz;
+ v.shm_nattch = in->shm_nattch;
+ v.shm_cpid = in->shm_cpid;
+ v.shm_lpid = in->shm_lpid;
+ return copy_to_user(buf, &v, sizeof(v));
+ }
+}
- if (cmd == SHM_LOCK) {
- struct user_struct *user = current_user();
+static int copy_compat_shmid_from_user(struct shmid64_ds *out, void __user *buf,
+ int version)
+{
+ memset(out, 0, sizeof(*out));
+ if (version == IPC_64) {
+ struct compat_shmid64_ds *p = buf;
+ return get_compat_ipc64_perm(&out->shm_perm, &p->shm_perm);
+ } else {
+ struct compat_shmid_ds *p = buf;
+ return get_compat_ipc_perm(&out->shm_perm, &p->shm_perm);
+ }
+}
- err = shmem_lock(shm_file, 1, user);
- if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) {
- shp->shm_perm.mode |= SHM_LOCKED;
- shp->mlock_user = user;
- }
- goto out_unlock0;
- }
+COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr)
+{
+ struct ipc_namespace *ns;
+ struct shmid64_ds sem64;
+ int version = compat_ipc_parse_version(&cmd);
+ int err;
- /* SHM_UNLOCK */
- if (!(shp->shm_perm.mode & SHM_LOCKED))
- goto out_unlock0;
- shmem_lock(shm_file, 0, shp->mlock_user);
- shp->shm_perm.mode &= ~SHM_LOCKED;
- shp->mlock_user = NULL;
- get_file(shm_file);
- ipc_unlock_object(&shp->shm_perm);
- rcu_read_unlock();
- shmem_unlock_mapping(shm_file->f_mapping);
+ ns = current->nsproxy->ipc_ns;
+
+ if (cmd < 0 || shmid < 0)
+ return -EINVAL;
- fput(shm_file);
+ switch (cmd) {
+ case IPC_INFO: {
+ struct shminfo64 shminfo;
+ err = shmctl_ipc_info(ns, &shminfo);
+ if (err < 0)
+ return err;
+ if (copy_compat_shminfo_to_user(uptr, &shminfo, version))
+ err = -EFAULT;
+ return err;
+ }
+ case SHM_INFO: {
+ struct shm_info shm_info;
+ err = shmctl_shm_info(ns, &shm_info);
+ if (err < 0)
+ return err;
+ if (put_compat_shm_info(&shm_info, uptr))
+ err = -EFAULT;
return err;
}
+ case IPC_STAT:
+ case SHM_STAT:
+ err = shmctl_stat(ns, shmid, cmd, &sem64);
+ if (err < 0)
+ return err;
+ if (copy_compat_shmid_to_user(uptr, &sem64, version))
+ err = -EFAULT;
+ return err;
+
+ case IPC_SET:
+ if (copy_compat_shmid_from_user(&sem64, uptr, version))
+ return -EFAULT;
+ /* fallthru */
+ case IPC_RMID:
+ return shmctl_down(ns, shmid, cmd, &sem64);
+ case SHM_LOCK:
+ case SHM_UNLOCK:
+ return shmctl_do_lock(ns, shmid, cmd);
+ break;
default:
return -EINVAL;
}
-
-out_unlock0:
- ipc_unlock_object(&shp->shm_perm);
-out_unlock1:
- rcu_read_unlock();
return err;
}
+#endif
/*
* Fix shmaddr, allocate descriptor, map shm, add attach descriptor to lists.
@@ -1267,6 +1441,25 @@ SYSCALL_DEFINE3(shmat, int, shmid, char __user *, shmaddr, int, shmflg)
return (long)ret;
}
+#ifdef CONFIG_COMPAT
+
+#ifndef COMPAT_SHMLBA
+#define COMPAT_SHMLBA SHMLBA
+#endif
+
+COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
+{
+ unsigned long ret;
+ long err;
+
+ err = do_shmat(shmid, compat_ptr(shmaddr), shmflg, &ret, COMPAT_SHMLBA);
+ if (err)
+ return err;
+ force_successful_syscall_return();
+ return (long)ret;
+}
+#endif
+
/*
* detach and kill segment if marked destroyed.
* The work is done in shm_close.
@@ -1397,7 +1590,7 @@ static int sysvipc_shm_proc_show(struct seq_file *s, void *it)
seq_printf(s,
"%10d %10d %4o " SIZE_SPEC " %5u %5u "
- "%5lu %5u %5u %5u %5u %10lu %10lu %10lu "
+ "%5lu %5u %5u %5u %5u %10llu %10llu %10llu "
SIZE_SPEC " " SIZE_SPEC "\n",
shp->shm_perm.key,
shp->shm_perm.id,
diff --git a/ipc/syscall.c b/ipc/syscall.c
index 52429489cde0..667022746ca5 100644
--- a/ipc/syscall.c
+++ b/ipc/syscall.c
@@ -5,12 +5,12 @@
* the individual syscalls instead.
*/
#include <linux/unistd.h>
+#include <linux/syscalls.h>
#ifdef __ARCH_WANT_SYS_IPC
#include <linux/errno.h>
#include <linux/ipc.h>
#include <linux/shm.h>
-#include <linux/syscalls.h>
#include <linux/uaccess.h>
SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
@@ -97,3 +97,91 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
}
}
#endif
+
+#ifdef CONFIG_COMPAT
+#include <linux/compat.h>
+
+#ifndef COMPAT_SHMLBA
+#define COMPAT_SHMLBA SHMLBA
+#endif
+
+struct compat_ipc_kludge {
+ compat_uptr_t msgp;
+ compat_long_t msgtyp;
+};
+
+#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
+COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
+ u32, third, compat_uptr_t, ptr, u32, fifth)
+{
+ int version;
+ u32 pad;
+
+ version = call >> 16; /* hack for backward compatibility */
+ call &= 0xffff;
+
+ switch (call) {
+ case SEMOP:
+ /* struct sembuf is the same on 32 and 64bit :)) */
+ return sys_semtimedop(first, compat_ptr(ptr), second, NULL);
+ case SEMTIMEDOP:
+ return compat_sys_semtimedop(first, compat_ptr(ptr), second,
+ compat_ptr(fifth));
+ case SEMGET:
+ return sys_semget(first, second, third);
+ case SEMCTL:
+ if (!ptr)
+ return -EINVAL;
+ if (get_user(pad, (u32 __user *) compat_ptr(ptr)))
+ return -EFAULT;
+ return compat_sys_semctl(first, second, third, pad);
+
+ case MSGSND:
+ return compat_sys_msgsnd(first, ptr, second, third);
+
+ case MSGRCV: {
+ void __user *uptr = compat_ptr(ptr);
+
+ if (first < 0 || second < 0)
+ return -EINVAL;
+
+ if (!version) {
+ struct compat_ipc_kludge ipck;
+ if (!uptr)
+ return -EINVAL;
+ if (copy_from_user(&ipck, uptr, sizeof(ipck)))
+ return -EFAULT;
+ return compat_sys_msgrcv(first, ipck.msgp, second,
+ ipck.msgtyp, third);
+ }
+ return compat_sys_msgrcv(first, ptr, second, fifth, third);
+ }
+ case MSGGET:
+ return sys_msgget(first, second);
+ case MSGCTL:
+ return compat_sys_msgctl(first, second, compat_ptr(ptr));
+
+ case SHMAT: {
+ int err;
+ unsigned long raddr;
+
+ if (version == 1)
+ return -EINVAL;
+ err = do_shmat(first, compat_ptr(ptr), second, &raddr,
+ COMPAT_SHMLBA);
+ if (err < 0)
+ return err;
+ return put_user(raddr, (compat_ulong_t *)compat_ptr(third));
+ }
+ case SHMDT:
+ return sys_shmdt(compat_ptr(ptr));
+ case SHMGET:
+ return sys_shmget(first, (unsigned)second, third);
+ case SHMCTL:
+ return compat_sys_shmctl(first, second, compat_ptr(ptr));
+ }
+
+ return -ENOSYS;
+}
+#endif
+#endif
diff --git a/ipc/util.h b/ipc/util.h
index 80c9f51c3f07..b21297bc11eb 100644
--- a/ipc/util.h
+++ b/ipc/util.h
@@ -194,4 +194,34 @@ int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
const struct ipc_ops *ops, struct ipc_params *params);
void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
+
+#ifdef CONFIG_COMPAT
+#include <linux/compat.h>
+struct compat_ipc_perm {
+ key_t key;
+ __compat_uid_t uid;
+ __compat_gid_t gid;
+ __compat_uid_t cuid;
+ __compat_gid_t cgid;
+ compat_mode_t mode;
+ unsigned short seq;
+};
+
+void to_compat_ipc_perm(struct compat_ipc_perm *, struct ipc64_perm *);
+void to_compat_ipc64_perm(struct compat_ipc64_perm *, struct ipc64_perm *);
+int get_compat_ipc_perm(struct ipc64_perm *, struct compat_ipc_perm __user *);
+int get_compat_ipc64_perm(struct ipc64_perm *,
+ struct compat_ipc64_perm __user *);
+
+static inline int compat_ipc_parse_version(int *cmd)
+{
+#ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
+ int version = *cmd & IPC_64;
+ *cmd &= ~IPC_64;
+ return version;
+#else
+ return IPC_64;
+#endif
+}
+#endif
#endif
diff --git a/kernel/acct.c b/kernel/acct.c
index 5b1284370367..5e72af29ab73 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -516,7 +516,7 @@ static void do_acct_process(struct bsd_acct_struct *acct)
if (file_start_write_trylock(file)) {
/* it's been opened O_APPEND, so position is irrelevant */
loff_t pos = 0;
- __kernel_write(file, (char *)&ac, sizeof(acct_t), &pos);
+ __kernel_write(file, &ac, sizeof(acct_t), &pos);
file_end_write(file);
}
out:
diff --git a/kernel/audit.h b/kernel/audit.h
index b331d9b83f63..9b110ae17ee3 100644
--- a/kernel/audit.h
+++ b/kernel/audit.h
@@ -182,7 +182,7 @@ struct audit_context {
mqd_t mqdes;
size_t msg_len;
unsigned int msg_prio;
- struct timespec abs_timeout;
+ struct timespec64 abs_timeout;
} mq_sendrecv;
struct {
int oflag;
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index aac1a41f82bd..ecc23e25c9eb 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -1235,11 +1235,11 @@ static void show_special(struct audit_context *context, int *call_panic)
case AUDIT_MQ_SENDRECV:
audit_log_format(ab,
"mqdes=%d msg_len=%zd msg_prio=%u "
- "abs_timeout_sec=%ld abs_timeout_nsec=%ld",
+ "abs_timeout_sec=%lld abs_timeout_nsec=%ld",
context->mq_sendrecv.mqdes,
context->mq_sendrecv.msg_len,
context->mq_sendrecv.msg_prio,
- context->mq_sendrecv.abs_timeout.tv_sec,
+ (long long) context->mq_sendrecv.abs_timeout.tv_sec,
context->mq_sendrecv.abs_timeout.tv_nsec);
break;
case AUDIT_MQ_NOTIFY:
@@ -2083,15 +2083,15 @@ void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
*
*/
void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio,
- const struct timespec *abs_timeout)
+ const struct timespec64 *abs_timeout)
{
struct audit_context *context = current->audit_context;
- struct timespec *p = &context->mq_sendrecv.abs_timeout;
+ struct timespec64 *p = &context->mq_sendrecv.abs_timeout;
if (abs_timeout)
- memcpy(p, abs_timeout, sizeof(struct timespec));
+ memcpy(p, abs_timeout, sizeof(*p));
else
- memset(p, 0, sizeof(struct timespec));
+ memset(p, 0, sizeof(*p));
context->mq_sendrecv.mqdes = mqdes;
context->mq_sendrecv.msg_len = msg_len;
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 917cc04a0a94..7b62df86be1d 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -1022,7 +1022,7 @@ select_insn:
struct bpf_map *map = (struct bpf_map *) (unsigned long) BPF_R2;
struct bpf_array *array = container_of(map, struct bpf_array, map);
struct bpf_prog *prog;
- u64 index = BPF_R3;
+ u32 index = BPF_R3;
if (unlikely(index >= array->map.max_entries))
goto out;
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c
index 959c9a07f318..e093d9a2c4dd 100644
--- a/kernel/bpf/devmap.c
+++ b/kernel/bpf/devmap.c
@@ -75,8 +75,8 @@ static u64 dev_map_bitmap_size(const union bpf_attr *attr)
static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
{
struct bpf_dtab *dtab;
+ int err = -EINVAL;
u64 cost;
- int err;
/* check sanity of attributes */
if (attr->max_entries == 0 || attr->key_size != 4 ||
@@ -108,6 +108,8 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
if (err)
goto free_dtab;
+ err = -ENOMEM;
+
/* A per cpu bitfield with a bit per possible net device */
dtab->flush_needed = __alloc_percpu(dev_map_bitmap_size(attr),
__alignof__(unsigned long));
@@ -128,7 +130,7 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
free_dtab:
free_percpu(dtab->flush_needed);
kfree(dtab);
- return ERR_PTR(-ENOMEM);
+ return ERR_PTR(err);
}
static void dev_map_free(struct bpf_map *map)
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index cb17e1cd1d43..25d074920a00 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -186,15 +186,17 @@ static int bpf_map_alloc_id(struct bpf_map *map)
static void bpf_map_free_id(struct bpf_map *map, bool do_idr_lock)
{
+ unsigned long flags;
+
if (do_idr_lock)
- spin_lock_bh(&map_idr_lock);
+ spin_lock_irqsave(&map_idr_lock, flags);
else
__acquire(&map_idr_lock);
idr_remove(&map_idr, map->id);
if (do_idr_lock)
- spin_unlock_bh(&map_idr_lock);
+ spin_unlock_irqrestore(&map_idr_lock, flags);
else
__release(&map_idr_lock);
}
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 477b6932c3c1..8b8d6ba39e23 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -653,6 +653,10 @@ static void mark_reg_read(const struct bpf_verifier_state *state, u32 regno)
{
struct bpf_verifier_state *parent = state->parent;
+ if (regno == BPF_REG_FP)
+ /* We don't need to worry about FP liveness because it's read-only */
+ return;
+
while (parent) {
/* if read wasn't screened by an earlier write ... */
if (state->regs[regno].live & REG_LIVE_WRITTEN)
@@ -2292,7 +2296,8 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
}
} else {
if (insn->src_reg != BPF_REG_0 || insn->off != 0 ||
- (insn->imm != 16 && insn->imm != 32 && insn->imm != 64)) {
+ (insn->imm != 16 && insn->imm != 32 && insn->imm != 64) ||
+ BPF_CLASS(insn->code) == BPF_ALU64) {
verbose("BPF_END uses reserved fields\n");
return -EINVAL;
}
@@ -2344,6 +2349,7 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
* copy register state to dest reg
*/
regs[insn->dst_reg] = regs[insn->src_reg];
+ regs[insn->dst_reg].live |= REG_LIVE_WRITTEN;
} else {
/* R1 = (u32) R2 */
if (is_pointer_value(env, insn->src_reg)) {
@@ -4204,7 +4210,12 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
}
if (insn->imm == BPF_FUNC_redirect_map) {
- u64 addr = (unsigned long)prog;
+ /* Note, we cannot use prog directly as imm as subsequent
+ * rewrites would still change the prog pointer. The only
+ * stable address we can use is aux, which also works with
+ * prog clones during blinding.
+ */
+ u64 addr = (unsigned long)prog->aux;
struct bpf_insn r4_ld[] = {
BPF_LD_IMM64(BPF_REG_4, addr),
*insn,
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index d6551cd45238..44857278eb8a 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -2311,6 +2311,14 @@ out_release_tset:
list_del_init(&cset->mg_node);
}
spin_unlock_irq(&css_set_lock);
+
+ /*
+ * Re-initialize the cgroup_taskset structure in case it is reused
+ * again in another cgroup_migrate_add_task()/cgroup_migrate_execute()
+ * iteration.
+ */
+ tset->nr_tasks = 0;
+ tset->csets = &tset->src_csets;
return ret;
}
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index 67230ecf2ce1..4657e2924ecb 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -2275,6 +2275,13 @@ retry:
mutex_unlock(&cpuset_mutex);
}
+static bool force_rebuild;
+
+void cpuset_force_rebuild(void)
+{
+ force_rebuild = true;
+}
+
/**
* cpuset_hotplug_workfn - handle CPU/memory hotunplug for a cpuset
*
@@ -2349,8 +2356,10 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
}
/* rebuild sched domains if cpus_allowed has changed */
- if (cpus_updated)
+ if (cpus_updated || force_rebuild) {
+ force_rebuild = false;
rebuild_sched_domains();
+ }
}
void cpuset_update_active_cpus(void)
@@ -2363,6 +2372,11 @@ void cpuset_update_active_cpus(void)
schedule_work(&cpuset_hotplug_work);
}
+void cpuset_wait_for_hotplug(void)
+{
+ flush_work(&cpuset_hotplug_work);
+}
+
/*
* Keep top_cpuset.mems_allowed tracking node_states[N_MEMORY].
* Call this routine anytime after node_states[N_MEMORY] changes.
diff --git a/kernel/compat.c b/kernel/compat.c
index 6f0a0e723a06..772e038d04d9 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -200,29 +200,6 @@ int compat_put_timespec(const struct timespec *ts, void __user *uts)
}
EXPORT_SYMBOL_GPL(compat_put_timespec);
-int compat_convert_timespec(struct timespec __user **kts,
- const void __user *cts)
-{
- struct timespec ts;
- struct timespec __user *uts;
-
- if (!cts || COMPAT_USE_64BIT_TIME) {
- *kts = (struct timespec __user *)cts;
- return 0;
- }
-
- uts = compat_alloc_user_space(sizeof(ts));
- if (!uts)
- return -EFAULT;
- if (compat_get_timespec(&ts, cts))
- return -EFAULT;
- if (copy_to_user(uts, &ts, sizeof(ts)))
- return -EFAULT;
-
- *kts = uts;
- return 0;
-}
-
int get_compat_itimerval(struct itimerval *o, const struct compat_itimerval __user *i)
{
struct compat_itimerval v32;
diff --git a/kernel/cpu.c b/kernel/cpu.c
index acf5308fad51..8de11a29e495 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -46,11 +46,13 @@
* @bringup: Single callback bringup or teardown selector
* @cb_state: The state for a single callback (install/uninstall)
* @result: Result of the operation
- * @done: Signal completion to the issuer of the task
+ * @done_up: Signal completion to the issuer of the task for cpu-up
+ * @done_down: Signal completion to the issuer of the task for cpu-down
*/
struct cpuhp_cpu_state {
enum cpuhp_state state;
enum cpuhp_state target;
+ enum cpuhp_state fail;
#ifdef CONFIG_SMP
struct task_struct *thread;
bool should_run;
@@ -58,18 +60,39 @@ struct cpuhp_cpu_state {
bool single;
bool bringup;
struct hlist_node *node;
+ struct hlist_node *last;
enum cpuhp_state cb_state;
int result;
- struct completion done;
+ struct completion done_up;
+ struct completion done_down;
#endif
};
-static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state);
+static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = {
+ .fail = CPUHP_INVALID,
+};
#if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP)
-static struct lock_class_key cpuhp_state_key;
-static struct lockdep_map cpuhp_state_lock_map =
- STATIC_LOCKDEP_MAP_INIT("cpuhp_state", &cpuhp_state_key);
+static struct lockdep_map cpuhp_state_up_map =
+ STATIC_LOCKDEP_MAP_INIT("cpuhp_state-up", &cpuhp_state_up_map);
+static struct lockdep_map cpuhp_state_down_map =
+ STATIC_LOCKDEP_MAP_INIT("cpuhp_state-down", &cpuhp_state_down_map);
+
+
+static void inline cpuhp_lock_acquire(bool bringup)
+{
+ lock_map_acquire(bringup ? &cpuhp_state_up_map : &cpuhp_state_down_map);
+}
+
+static void inline cpuhp_lock_release(bool bringup)
+{
+ lock_map_release(bringup ? &cpuhp_state_up_map : &cpuhp_state_down_map);
+}
+#else
+
+static void inline cpuhp_lock_acquire(bool bringup) { }
+static void inline cpuhp_lock_release(bool bringup) { }
+
#endif
/**
@@ -123,13 +146,16 @@ static struct cpuhp_step *cpuhp_get_step(enum cpuhp_state state)
/**
* cpuhp_invoke_callback _ Invoke the callbacks for a given state
* @cpu: The cpu for which the callback should be invoked
- * @step: The step in the state machine
+ * @state: The state to do callbacks for
* @bringup: True if the bringup callback should be invoked
+ * @node: For multi-instance, do a single entry callback for install/remove
+ * @lastp: For multi-instance rollback, remember how far we got
*
* Called from cpu hotplug and from the state register machinery.
*/
static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
- bool bringup, struct hlist_node *node)
+ bool bringup, struct hlist_node *node,
+ struct hlist_node **lastp)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
struct cpuhp_step *step = cpuhp_get_step(state);
@@ -137,7 +163,17 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
int (*cb)(unsigned int cpu);
int ret, cnt;
+ if (st->fail == state) {
+ st->fail = CPUHP_INVALID;
+
+ if (!(bringup ? step->startup.single : step->teardown.single))
+ return 0;
+
+ return -EAGAIN;
+ }
+
if (!step->multi_instance) {
+ WARN_ON_ONCE(lastp && *lastp);
cb = bringup ? step->startup.single : step->teardown.single;
if (!cb)
return 0;
@@ -152,6 +188,7 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
/* Single invocation for instance add/remove */
if (node) {
+ WARN_ON_ONCE(lastp && *lastp);
trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
ret = cbm(cpu, node);
trace_cpuhp_exit(cpu, st->state, state, ret);
@@ -161,13 +198,23 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
/* State transition. Invoke on all instances */
cnt = 0;
hlist_for_each(node, &step->list) {
+ if (lastp && node == *lastp)
+ break;
+
trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
ret = cbm(cpu, node);
trace_cpuhp_exit(cpu, st->state, state, ret);
- if (ret)
- goto err;
+ if (ret) {
+ if (!lastp)
+ goto err;
+
+ *lastp = node;
+ return ret;
+ }
cnt++;
}
+ if (lastp)
+ *lastp = NULL;
return 0;
err:
/* Rollback the instances if one failed */
@@ -178,12 +225,39 @@ err:
hlist_for_each(node, &step->list) {
if (!cnt--)
break;
- cbm(cpu, node);
+
+ trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
+ ret = cbm(cpu, node);
+ trace_cpuhp_exit(cpu, st->state, state, ret);
+ /*
+ * Rollback must not fail,
+ */
+ WARN_ON_ONCE(ret);
}
return ret;
}
#ifdef CONFIG_SMP
+static inline void wait_for_ap_thread(struct cpuhp_cpu_state *st, bool bringup)
+{
+ struct completion *done = bringup ? &st->done_up : &st->done_down;
+ wait_for_completion(done);
+}
+
+static inline void complete_ap_thread(struct cpuhp_cpu_state *st, bool bringup)
+{
+ struct completion *done = bringup ? &st->done_up : &st->done_down;
+ complete(done);
+}
+
+/*
+ * The former STARTING/DYING states, ran with IRQs disabled and must not fail.
+ */
+static bool cpuhp_is_atomic_state(enum cpuhp_state state)
+{
+ return CPUHP_AP_IDLE_DEAD <= state && state < CPUHP_AP_ONLINE;
+}
+
/* Serializes the updates to cpu_online_mask, cpu_present_mask */
static DEFINE_MUTEX(cpu_add_remove_lock);
bool cpuhp_tasks_frozen;
@@ -271,14 +345,79 @@ void cpu_hotplug_enable(void)
EXPORT_SYMBOL_GPL(cpu_hotplug_enable);
#endif /* CONFIG_HOTPLUG_CPU */
-static void __cpuhp_kick_ap_work(struct cpuhp_cpu_state *st);
+static inline enum cpuhp_state
+cpuhp_set_state(struct cpuhp_cpu_state *st, enum cpuhp_state target)
+{
+ enum cpuhp_state prev_state = st->state;
+
+ st->rollback = false;
+ st->last = NULL;
+
+ st->target = target;
+ st->single = false;
+ st->bringup = st->state < target;
+
+ return prev_state;
+}
+
+static inline void
+cpuhp_reset_state(struct cpuhp_cpu_state *st, enum cpuhp_state prev_state)
+{
+ st->rollback = true;
+
+ /*
+ * If we have st->last we need to undo partial multi_instance of this
+ * state first. Otherwise start undo at the previous state.
+ */
+ if (!st->last) {
+ if (st->bringup)
+ st->state--;
+ else
+ st->state++;
+ }
+
+ st->target = prev_state;
+ st->bringup = !st->bringup;
+}
+
+/* Regular hotplug invocation of the AP hotplug thread */
+static void __cpuhp_kick_ap(struct cpuhp_cpu_state *st)
+{
+ if (!st->single && st->state == st->target)
+ return;
+
+ st->result = 0;
+ /*
+ * Make sure the above stores are visible before should_run becomes
+ * true. Paired with the mb() above in cpuhp_thread_fun()
+ */
+ smp_mb();
+ st->should_run = true;
+ wake_up_process(st->thread);
+ wait_for_ap_thread(st, st->bringup);
+}
+
+static int cpuhp_kick_ap(struct cpuhp_cpu_state *st, enum cpuhp_state target)
+{
+ enum cpuhp_state prev_state;
+ int ret;
+
+ prev_state = cpuhp_set_state(st, target);
+ __cpuhp_kick_ap(st);
+ if ((ret = st->result)) {
+ cpuhp_reset_state(st, prev_state);
+ __cpuhp_kick_ap(st);
+ }
+
+ return ret;
+}
static int bringup_wait_for_ap(unsigned int cpu)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
/* Wait for the CPU to reach CPUHP_AP_ONLINE_IDLE */
- wait_for_completion(&st->done);
+ wait_for_ap_thread(st, true);
if (WARN_ON_ONCE((!cpu_online(cpu))))
return -ECANCELED;
@@ -286,12 +425,10 @@ static int bringup_wait_for_ap(unsigned int cpu)
stop_machine_unpark(cpu);
kthread_unpark(st->thread);
- /* Should we go further up ? */
- if (st->target > CPUHP_AP_ONLINE_IDLE) {
- __cpuhp_kick_ap_work(st);
- wait_for_completion(&st->done);
- }
- return st->result;
+ if (st->target <= CPUHP_AP_ONLINE_IDLE)
+ return 0;
+
+ return cpuhp_kick_ap(st, st->target);
}
static int bringup_cpu(unsigned int cpu)
@@ -317,32 +454,6 @@ static int bringup_cpu(unsigned int cpu)
/*
* Hotplug state machine related functions
*/
-static void undo_cpu_down(unsigned int cpu, struct cpuhp_cpu_state *st)
-{
- for (st->state++; st->state < st->target; st->state++) {
- struct cpuhp_step *step = cpuhp_get_step(st->state);
-
- if (!step->skip_onerr)
- cpuhp_invoke_callback(cpu, st->state, true, NULL);
- }
-}
-
-static int cpuhp_down_callbacks(unsigned int cpu, struct cpuhp_cpu_state *st,
- enum cpuhp_state target)
-{
- enum cpuhp_state prev_state = st->state;
- int ret = 0;
-
- for (; st->state > target; st->state--) {
- ret = cpuhp_invoke_callback(cpu, st->state, false, NULL);
- if (ret) {
- st->target = prev_state;
- undo_cpu_down(cpu, st);
- break;
- }
- }
- return ret;
-}
static void undo_cpu_up(unsigned int cpu, struct cpuhp_cpu_state *st)
{
@@ -350,7 +461,7 @@ static void undo_cpu_up(unsigned int cpu, struct cpuhp_cpu_state *st)
struct cpuhp_step *step = cpuhp_get_step(st->state);
if (!step->skip_onerr)
- cpuhp_invoke_callback(cpu, st->state, false, NULL);
+ cpuhp_invoke_callback(cpu, st->state, false, NULL, NULL);
}
}
@@ -362,7 +473,7 @@ static int cpuhp_up_callbacks(unsigned int cpu, struct cpuhp_cpu_state *st,
while (st->state < target) {
st->state++;
- ret = cpuhp_invoke_callback(cpu, st->state, true, NULL);
+ ret = cpuhp_invoke_callback(cpu, st->state, true, NULL, NULL);
if (ret) {
st->target = prev_state;
undo_cpu_up(cpu, st);
@@ -379,7 +490,8 @@ static void cpuhp_create(unsigned int cpu)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
- init_completion(&st->done);
+ init_completion(&st->done_up);
+ init_completion(&st->done_down);
}
static int cpuhp_should_run(unsigned int cpu)
@@ -389,69 +501,90 @@ static int cpuhp_should_run(unsigned int cpu)
return st->should_run;
}
-/* Execute the teardown callbacks. Used to be CPU_DOWN_PREPARE */
-static int cpuhp_ap_offline(unsigned int cpu, struct cpuhp_cpu_state *st)
-{
- enum cpuhp_state target = max((int)st->target, CPUHP_TEARDOWN_CPU);
-
- return cpuhp_down_callbacks(cpu, st, target);
-}
-
-/* Execute the online startup callbacks. Used to be CPU_ONLINE */
-static int cpuhp_ap_online(unsigned int cpu, struct cpuhp_cpu_state *st)
-{
- return cpuhp_up_callbacks(cpu, st, st->target);
-}
-
/*
* Execute teardown/startup callbacks on the plugged cpu. Also used to invoke
* callbacks when a state gets [un]installed at runtime.
+ *
+ * Each invocation of this function by the smpboot thread does a single AP
+ * state callback.
+ *
+ * It has 3 modes of operation:
+ * - single: runs st->cb_state
+ * - up: runs ++st->state, while st->state < st->target
+ * - down: runs st->state--, while st->state > st->target
+ *
+ * When complete or on error, should_run is cleared and the completion is fired.
*/
static void cpuhp_thread_fun(unsigned int cpu)
{
struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
- int ret = 0;
+ bool bringup = st->bringup;
+ enum cpuhp_state state;
/*
- * Paired with the mb() in cpuhp_kick_ap_work and
- * cpuhp_invoke_ap_callback, so the work set is consistent visible.
+ * ACQUIRE for the cpuhp_should_run() load of ->should_run. Ensures
+ * that if we see ->should_run we also see the rest of the state.
*/
smp_mb();
- if (!st->should_run)
+
+ if (WARN_ON_ONCE(!st->should_run))
return;
- st->should_run = false;
+ cpuhp_lock_acquire(bringup);
- lock_map_acquire(&cpuhp_state_lock_map);
- /* Single callback invocation for [un]install ? */
if (st->single) {
- if (st->cb_state < CPUHP_AP_ONLINE) {
- local_irq_disable();
- ret = cpuhp_invoke_callback(cpu, st->cb_state,
- st->bringup, st->node);
- local_irq_enable();
+ state = st->cb_state;
+ st->should_run = false;
+ } else {
+ if (bringup) {
+ st->state++;
+ state = st->state;
+ st->should_run = (st->state < st->target);
+ WARN_ON_ONCE(st->state > st->target);
} else {
- ret = cpuhp_invoke_callback(cpu, st->cb_state,
- st->bringup, st->node);
+ state = st->state;
+ st->state--;
+ st->should_run = (st->state > st->target);
+ WARN_ON_ONCE(st->state < st->target);
}
- } else if (st->rollback) {
- BUG_ON(st->state < CPUHP_AP_ONLINE_IDLE);
+ }
+
+ WARN_ON_ONCE(!cpuhp_is_ap_state(state));
- undo_cpu_down(cpu, st);
- st->rollback = false;
+ if (st->rollback) {
+ struct cpuhp_step *step = cpuhp_get_step(state);
+ if (step->skip_onerr)
+ goto next;
+ }
+
+ if (cpuhp_is_atomic_state(state)) {
+ local_irq_disable();
+ st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
+ local_irq_enable();
+
+ /*
+ * STARTING/DYING must not fail!
+ */
+ WARN_ON_ONCE(st->result);
} else {
- /* Cannot happen .... */
- BUG_ON(st->state < CPUHP_AP_ONLINE_IDLE);
-
- /* Regular hotplug work */
- if (st->state < st->target)
- ret = cpuhp_ap_online(cpu, st);
- else if (st->state > st->target)
- ret = cpuhp_ap_offline(cpu, st);
+ st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
+ }
+
+ if (st->result) {
+ /*
+ * If we fail on a rollback, we're up a creek without no
+ * paddle, no way forward, no way back. We loose, thanks for
+ * playing.
+ */
+ WARN_ON_ONCE(st->rollback);
+ st->should_run = false;
}
- lock_map_release(&cpuhp_state_lock_map);
- st->result = ret;
- complete(&st->done);
+
+next:
+ cpuhp_lock_release(bringup);
+
+ if (!st->should_run)
+ complete_ap_thread(st, bringup);
}
/* Invoke a single callback on a remote cpu */
@@ -460,62 +593,64 @@ cpuhp_invoke_ap_callback(int cpu, enum cpuhp_state state, bool bringup,
struct hlist_node *node)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
+ int ret;
if (!cpu_online(cpu))
return 0;
- lock_map_acquire(&cpuhp_state_lock_map);
- lock_map_release(&cpuhp_state_lock_map);
+ cpuhp_lock_acquire(false);
+ cpuhp_lock_release(false);
+
+ cpuhp_lock_acquire(true);
+ cpuhp_lock_release(true);
/*
* If we are up and running, use the hotplug thread. For early calls
* we invoke the thread function directly.
*/
if (!st->thread)
- return cpuhp_invoke_callback(cpu, state, bringup, node);
+ return cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
+ st->rollback = false;
+ st->last = NULL;
+
+ st->node = node;
+ st->bringup = bringup;
st->cb_state = state;
st->single = true;
- st->bringup = bringup;
- st->node = node;
- /*
- * Make sure the above stores are visible before should_run becomes
- * true. Paired with the mb() above in cpuhp_thread_fun()
- */
- smp_mb();
- st->should_run = true;
- wake_up_process(st->thread);
- wait_for_completion(&st->done);
- return st->result;
-}
+ __cpuhp_kick_ap(st);
-/* Regular hotplug invocation of the AP hotplug thread */
-static void __cpuhp_kick_ap_work(struct cpuhp_cpu_state *st)
-{
- st->result = 0;
- st->single = false;
/*
- * Make sure the above stores are visible before should_run becomes
- * true. Paired with the mb() above in cpuhp_thread_fun()
+ * If we failed and did a partial, do a rollback.
*/
- smp_mb();
- st->should_run = true;
- wake_up_process(st->thread);
+ if ((ret = st->result) && st->last) {
+ st->rollback = true;
+ st->bringup = !bringup;
+
+ __cpuhp_kick_ap(st);
+ }
+
+ return ret;
}
static int cpuhp_kick_ap_work(unsigned int cpu)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
- enum cpuhp_state state = st->state;
+ enum cpuhp_state prev_state = st->state;
+ int ret;
+
+ cpuhp_lock_acquire(false);
+ cpuhp_lock_release(false);
+
+ cpuhp_lock_acquire(true);
+ cpuhp_lock_release(true);
+
+ trace_cpuhp_enter(cpu, st->target, prev_state, cpuhp_kick_ap_work);
+ ret = cpuhp_kick_ap(st, st->target);
+ trace_cpuhp_exit(cpu, st->state, prev_state, ret);
- trace_cpuhp_enter(cpu, st->target, state, cpuhp_kick_ap_work);
- lock_map_acquire(&cpuhp_state_lock_map);
- lock_map_release(&cpuhp_state_lock_map);
- __cpuhp_kick_ap_work(st);
- wait_for_completion(&st->done);
- trace_cpuhp_exit(cpu, st->state, state, st->result);
- return st->result;
+ return ret;
}
static struct smp_hotplug_thread cpuhp_threads = {
@@ -581,6 +716,7 @@ static int take_cpu_down(void *_param)
struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
enum cpuhp_state target = max((int)st->target, CPUHP_AP_OFFLINE);
int err, cpu = smp_processor_id();
+ int ret;
/* Ensure this CPU doesn't handle any more interrupts. */
err = __cpu_disable();
@@ -594,8 +730,13 @@ static int take_cpu_down(void *_param)
WARN_ON(st->state != CPUHP_TEARDOWN_CPU);
st->state--;
/* Invoke the former CPU_DYING callbacks */
- for (; st->state > target; st->state--)
- cpuhp_invoke_callback(cpu, st->state, false, NULL);
+ for (; st->state > target; st->state--) {
+ ret = cpuhp_invoke_callback(cpu, st->state, false, NULL, NULL);
+ /*
+ * DYING must not fail!
+ */
+ WARN_ON_ONCE(ret);
+ }
/* Give up timekeeping duties */
tick_handover_do_timer();
@@ -639,7 +780,7 @@ static int takedown_cpu(unsigned int cpu)
*
* Wait for the stop thread to go away.
*/
- wait_for_completion(&st->done);
+ wait_for_ap_thread(st, false);
BUG_ON(st->state != CPUHP_AP_IDLE_DEAD);
/* Interrupts are moved away from the dying cpu, reenable alloc/free */
@@ -658,7 +799,7 @@ static void cpuhp_complete_idle_dead(void *arg)
{
struct cpuhp_cpu_state *st = arg;
- complete(&st->done);
+ complete_ap_thread(st, false);
}
void cpuhp_report_idle_dead(void)
@@ -676,11 +817,32 @@ void cpuhp_report_idle_dead(void)
cpuhp_complete_idle_dead, st, 0);
}
-#else
-#define takedown_cpu NULL
-#endif
+static void undo_cpu_down(unsigned int cpu, struct cpuhp_cpu_state *st)
+{
+ for (st->state++; st->state < st->target; st->state++) {
+ struct cpuhp_step *step = cpuhp_get_step(st->state);
-#ifdef CONFIG_HOTPLUG_CPU
+ if (!step->skip_onerr)
+ cpuhp_invoke_callback(cpu, st->state, true, NULL, NULL);
+ }
+}
+
+static int cpuhp_down_callbacks(unsigned int cpu, struct cpuhp_cpu_state *st,
+ enum cpuhp_state target)
+{
+ enum cpuhp_state prev_state = st->state;
+ int ret = 0;
+
+ for (; st->state > target; st->state--) {
+ ret = cpuhp_invoke_callback(cpu, st->state, false, NULL, NULL);
+ if (ret) {
+ st->target = prev_state;
+ undo_cpu_down(cpu, st);
+ break;
+ }
+ }
+ return ret;
+}
/* Requires cpu_add_remove_lock to be held */
static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
@@ -699,13 +861,13 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
cpuhp_tasks_frozen = tasks_frozen;
- prev_state = st->state;
- st->target = target;
+ prev_state = cpuhp_set_state(st, target);
/*
* If the current CPU state is in the range of the AP hotplug thread,
* then we need to kick the thread.
*/
if (st->state > CPUHP_TEARDOWN_CPU) {
+ st->target = max((int)target, CPUHP_TEARDOWN_CPU);
ret = cpuhp_kick_ap_work(cpu);
/*
* The AP side has done the error rollback already. Just
@@ -720,6 +882,8 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
*/
if (st->state > CPUHP_TEARDOWN_CPU)
goto out;
+
+ st->target = target;
}
/*
* The AP brought itself down to CPUHP_TEARDOWN_CPU. So we need
@@ -727,9 +891,8 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
*/
ret = cpuhp_down_callbacks(cpu, st, target);
if (ret && st->state > CPUHP_TEARDOWN_CPU && st->state < prev_state) {
- st->target = prev_state;
- st->rollback = true;
- cpuhp_kick_ap_work(cpu);
+ cpuhp_reset_state(st, prev_state);
+ __cpuhp_kick_ap(st);
}
out:
@@ -754,11 +917,15 @@ out:
cpu_maps_update_done();
return err;
}
+
int cpu_down(unsigned int cpu)
{
return do_cpu_down(cpu, CPUHP_OFFLINE);
}
EXPORT_SYMBOL(cpu_down);
+
+#else
+#define takedown_cpu NULL
#endif /*CONFIG_HOTPLUG_CPU*/
/**
@@ -772,11 +939,16 @@ void notify_cpu_starting(unsigned int cpu)
{
struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
enum cpuhp_state target = min((int)st->target, CPUHP_AP_ONLINE);
+ int ret;
rcu_cpu_starting(cpu); /* Enables RCU usage on this CPU. */
while (st->state < target) {
st->state++;
- cpuhp_invoke_callback(cpu, st->state, true, NULL);
+ ret = cpuhp_invoke_callback(cpu, st->state, true, NULL, NULL);
+ /*
+ * STARTING must not fail!
+ */
+ WARN_ON_ONCE(ret);
}
}
@@ -794,7 +966,7 @@ void cpuhp_online_idle(enum cpuhp_state state)
return;
st->state = CPUHP_AP_ONLINE_IDLE;
- complete(&st->done);
+ complete_ap_thread(st, true);
}
/* Requires cpu_add_remove_lock to be held */
@@ -829,7 +1001,7 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen, enum cpuhp_state target)
cpuhp_tasks_frozen = tasks_frozen;
- st->target = target;
+ cpuhp_set_state(st, target);
/*
* If the current CPU state is in the range of the AP hotplug thread,
* then we need to kick the thread once more.
@@ -1296,6 +1468,10 @@ static int cpuhp_issue_call(int cpu, enum cpuhp_state state, bool bringup,
struct cpuhp_step *sp = cpuhp_get_step(state);
int ret;
+ /*
+ * If there's nothing to do, we done.
+ * Relies on the union for multi_instance.
+ */
if ((bringup && !sp->startup.single) ||
(!bringup && !sp->teardown.single))
return 0;
@@ -1307,9 +1483,9 @@ static int cpuhp_issue_call(int cpu, enum cpuhp_state state, bool bringup,
if (cpuhp_is_ap_state(state))
ret = cpuhp_invoke_ap_callback(cpu, state, bringup, node);
else
- ret = cpuhp_invoke_callback(cpu, state, bringup, node);
+ ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
#else
- ret = cpuhp_invoke_callback(cpu, state, bringup, node);
+ ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
#endif
BUG_ON(ret && !bringup);
return ret;
@@ -1641,9 +1817,55 @@ static ssize_t show_cpuhp_target(struct device *dev,
}
static DEVICE_ATTR(target, 0644, show_cpuhp_target, write_cpuhp_target);
+
+static ssize_t write_cpuhp_fail(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
+ struct cpuhp_step *sp;
+ int fail, ret;
+
+ ret = kstrtoint(buf, 10, &fail);
+ if (ret)
+ return ret;
+
+ /*
+ * Cannot fail STARTING/DYING callbacks.
+ */
+ if (cpuhp_is_atomic_state(fail))
+ return -EINVAL;
+
+ /*
+ * Cannot fail anything that doesn't have callbacks.
+ */
+ mutex_lock(&cpuhp_state_mutex);
+ sp = cpuhp_get_step(fail);
+ if (!sp->startup.single && !sp->teardown.single)
+ ret = -EINVAL;
+ mutex_unlock(&cpuhp_state_mutex);
+ if (ret)
+ return ret;
+
+ st->fail = fail;
+
+ return count;
+}
+
+static ssize_t show_cpuhp_fail(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
+
+ return sprintf(buf, "%d\n", st->fail);
+}
+
+static DEVICE_ATTR(fail, 0644, show_cpuhp_fail, write_cpuhp_fail);
+
static struct attribute *cpuhp_cpu_attrs[] = {
&dev_attr_state.attr,
&dev_attr_target.attr,
+ &dev_attr_fail.attr,
NULL
};
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 3e691b75b2db..6bc21e202ae4 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -8171,6 +8171,7 @@ static int perf_event_set_bpf_prog(struct perf_event *event, u32 prog_fd)
}
}
event->tp_event->prog = prog;
+ event->tp_event->bpf_prog_owner = event;
return 0;
}
@@ -8185,7 +8186,7 @@ static void perf_event_free_bpf_prog(struct perf_event *event)
return;
prog = event->tp_event->prog;
- if (prog) {
+ if (prog && event->tp_event->bpf_prog_owner == event) {
event->tp_event->prog = NULL;
bpf_prog_put(prog);
}
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index af71a84e12ee..f684d8e5fa2b 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -412,6 +412,19 @@ err:
return NULL;
}
+static bool __always_inline rb_need_aux_wakeup(struct ring_buffer *rb)
+{
+ if (rb->aux_overwrite)
+ return false;
+
+ if (rb->aux_head - rb->aux_wakeup >= rb->aux_watermark) {
+ rb->aux_wakeup = rounddown(rb->aux_head, rb->aux_watermark);
+ return true;
+ }
+
+ return false;
+}
+
/*
* Commit the data written by hardware into the ring buffer by adjusting
* aux_head and posting a PERF_RECORD_AUX into the perf buffer. It is the
@@ -451,10 +464,8 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size)
}
rb->user_page->aux_head = rb->aux_head;
- if (rb->aux_head - rb->aux_wakeup >= rb->aux_watermark) {
+ if (rb_need_aux_wakeup(rb))
wakeup = true;
- rb->aux_wakeup = rounddown(rb->aux_head, rb->aux_watermark);
- }
if (wakeup) {
if (handle->aux_flags & PERF_AUX_FLAG_TRUNCATED)
@@ -484,9 +495,8 @@ int perf_aux_output_skip(struct perf_output_handle *handle, unsigned long size)
rb->aux_head += size;
rb->user_page->aux_head = rb->aux_head;
- if (rb->aux_head - rb->aux_wakeup >= rb->aux_watermark) {
+ if (rb_need_aux_wakeup(rb)) {
perf_output_wakeup(handle);
- rb->aux_wakeup = rounddown(rb->aux_head, rb->aux_watermark);
handle->wakeup = rb->aux_wakeup + rb->aux_watermark;
}
diff --git a/kernel/exit.c b/kernel/exit.c
index a35d8a17e01f..f2cd53e92147 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1600,12 +1600,10 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
struct waitid_info info = {.status = 0};
long err = kernel_waitid(which, upid, &info, options, ru ? &r : NULL);
int signo = 0;
+
if (err > 0) {
signo = SIGCHLD;
err = 0;
- }
-
- if (!err) {
if (ru && copy_to_user(ru, &r, sizeof(struct rusage)))
return -EFAULT;
}
@@ -1615,7 +1613,7 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
user_access_begin();
unsafe_put_user(signo, &infop->si_signo, Efault);
unsafe_put_user(0, &infop->si_errno, Efault);
- unsafe_put_user((short)info.cause, &infop->si_code, Efault);
+ unsafe_put_user(info.cause, &infop->si_code, Efault);
unsafe_put_user(info.pid, &infop->si_pid, Efault);
unsafe_put_user(info.uid, &infop->si_uid, Efault);
unsafe_put_user(info.status, &infop->si_status, Efault);
@@ -1723,16 +1721,15 @@ COMPAT_SYSCALL_DEFINE5(waitid,
if (err > 0) {
signo = SIGCHLD;
err = 0;
- }
-
- if (!err && uru) {
- /* kernel_waitid() overwrites everything in ru */
- if (COMPAT_USE_64BIT_TIME)
- err = copy_to_user(uru, &ru, sizeof(ru));
- else
- err = put_compat_rusage(&ru, uru);
- if (err)
- return -EFAULT;
+ if (uru) {
+ /* kernel_waitid() overwrites everything in ru */
+ if (COMPAT_USE_64BIT_TIME)
+ err = copy_to_user(uru, &ru, sizeof(ru));
+ else
+ err = put_compat_rusage(&ru, uru);
+ if (err)
+ return -EFAULT;
+ }
}
if (!infop)
@@ -1741,7 +1738,7 @@ COMPAT_SYSCALL_DEFINE5(waitid,
user_access_begin();
unsafe_put_user(signo, &infop->si_signo, Efault);
unsafe_put_user(0, &infop->si_errno, Efault);
- unsafe_put_user((short)info.cause, &infop->si_code, Efault);
+ unsafe_put_user(info.cause, &infop->si_code, Efault);
unsafe_put_user(info.pid, &infop->si_pid, Efault);
unsafe_put_user(info.uid, &infop->si_uid, Efault);
unsafe_put_user(info.status, &infop->si_status, Efault);
diff --git a/kernel/extable.c b/kernel/extable.c
index 38c2412401a1..9aa1cc41ecf7 100644
--- a/kernel/extable.c
+++ b/kernel/extable.c
@@ -102,15 +102,7 @@ int core_kernel_data(unsigned long addr)
int __kernel_text_address(unsigned long addr)
{
- if (core_kernel_text(addr))
- return 1;
- if (is_module_text_address(addr))
- return 1;
- if (is_ftrace_trampoline(addr))
- return 1;
- if (is_kprobe_optinsn_slot(addr) || is_kprobe_insn_slot(addr))
- return 1;
- if (is_bpf_text_address(addr))
+ if (kernel_text_address(addr))
return 1;
/*
* There might be init symbols in saved stacktraces.
@@ -127,17 +119,42 @@ int __kernel_text_address(unsigned long addr)
int kernel_text_address(unsigned long addr)
{
+ bool no_rcu;
+ int ret = 1;
+
if (core_kernel_text(addr))
return 1;
+
+ /*
+ * If a stack dump happens while RCU is not watching, then
+ * RCU needs to be notified that it requires to start
+ * watching again. This can happen either by tracing that
+ * triggers a stack trace, or a WARN() that happens during
+ * coming back from idle, or cpu on or offlining.
+ *
+ * is_module_text_address() as well as the kprobe slots
+ * and is_bpf_text_address() require RCU to be watching.
+ */
+ no_rcu = !rcu_is_watching();
+
+ /* Treat this like an NMI as it can happen anywhere */
+ if (no_rcu)
+ rcu_nmi_enter();
+
if (is_module_text_address(addr))
- return 1;
+ goto out;
if (is_ftrace_trampoline(addr))
- return 1;
+ goto out;
if (is_kprobe_optinsn_slot(addr) || is_kprobe_insn_slot(addr))
- return 1;
+ goto out;
if (is_bpf_text_address(addr))
- return 1;
- return 0;
+ goto out;
+ ret = 0;
+out:
+ if (no_rcu)
+ rcu_nmi_exit();
+
+ return ret;
}
/*
diff --git a/kernel/fork.c b/kernel/fork.c
index 6f1b0af00bda..e702cb9ffbd8 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -946,6 +946,24 @@ void mmput(struct mm_struct *mm)
}
EXPORT_SYMBOL_GPL(mmput);
+#ifdef CONFIG_MMU
+static void mmput_async_fn(struct work_struct *work)
+{
+ struct mm_struct *mm = container_of(work, struct mm_struct,
+ async_put_work);
+
+ __mmput(mm);
+}
+
+void mmput_async(struct mm_struct *mm)
+{
+ if (atomic_dec_and_test(&mm->mm_users)) {
+ INIT_WORK(&mm->async_put_work, mmput_async_fn);
+ schedule_work(&mm->async_put_work);
+ }
+}
+#endif
+
/**
* set_mm_exe_file - change a reference to the mm's executable file
*
@@ -1569,10 +1587,6 @@ static __latent_entropy struct task_struct *copy_process(
return ERR_PTR(-EINVAL);
}
- retval = security_task_create(clone_flags);
- if (retval)
- goto fork_out;
-
retval = -ENOMEM;
p = dup_task_struct(current, node);
if (!p)
diff --git a/kernel/futex.c b/kernel/futex.c
index 3d38eaf05492..0518a0bfc746 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -821,8 +821,6 @@ static void get_pi_state(struct futex_pi_state *pi_state)
/*
* Drops a reference to the pi_state object and frees or caches it
* when the last reference is gone.
- *
- * Must be called with the hb lock held.
*/
static void put_pi_state(struct futex_pi_state *pi_state)
{
@@ -837,16 +835,22 @@ static void put_pi_state(struct futex_pi_state *pi_state)
* and has cleaned up the pi_state already
*/
if (pi_state->owner) {
- raw_spin_lock_irq(&pi_state->owner->pi_lock);
- list_del_init(&pi_state->list);
- raw_spin_unlock_irq(&pi_state->owner->pi_lock);
+ struct task_struct *owner;
- rt_mutex_proxy_unlock(&pi_state->pi_mutex, pi_state->owner);
+ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+ owner = pi_state->owner;
+ if (owner) {
+ raw_spin_lock(&owner->pi_lock);
+ list_del_init(&pi_state->list);
+ raw_spin_unlock(&owner->pi_lock);
+ }
+ rt_mutex_proxy_unlock(&pi_state->pi_mutex, owner);
+ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
}
- if (current->pi_state_cache)
+ if (current->pi_state_cache) {
kfree(pi_state);
- else {
+ } else {
/*
* pi_state->list is already empty.
* clear pi_state->owner.
@@ -907,13 +911,14 @@ void exit_pi_state_list(struct task_struct *curr)
raw_spin_unlock_irq(&curr->pi_lock);
spin_lock(&hb->lock);
-
- raw_spin_lock_irq(&curr->pi_lock);
+ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+ raw_spin_lock(&curr->pi_lock);
/*
* We dropped the pi-lock, so re-check whether this
* task still owns the PI-state:
*/
if (head->next != next) {
+ raw_spin_unlock(&pi_state->pi_mutex.wait_lock);
spin_unlock(&hb->lock);
continue;
}
@@ -922,9 +927,10 @@ void exit_pi_state_list(struct task_struct *curr)
WARN_ON(list_empty(&pi_state->list));
list_del_init(&pi_state->list);
pi_state->owner = NULL;
- raw_spin_unlock_irq(&curr->pi_lock);
+ raw_spin_unlock(&curr->pi_lock);
get_pi_state(pi_state);
+ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
spin_unlock(&hb->lock);
rt_mutex_futex_unlock(&pi_state->pi_mutex);
@@ -1208,6 +1214,10 @@ static int attach_to_pi_owner(u32 uval, union futex_key *key,
WARN_ON(!list_empty(&pi_state->list));
list_add(&pi_state->list, &p->pi_state_list);
+ /*
+ * Assignment without holding pi_state->pi_mutex.wait_lock is safe
+ * because there is no concurrency as the object is not published yet.
+ */
pi_state->owner = p;
raw_spin_unlock_irq(&p->pi_lock);
@@ -2878,6 +2888,7 @@ retry:
raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
spin_unlock(&hb->lock);
+ /* drops pi_state->pi_mutex.wait_lock */
ret = wake_futex_pi(uaddr, uval, pi_state);
put_pi_state(pi_state);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index f51b7b6d2451..6fc89fd93824 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -202,7 +202,7 @@ __irq_startup_managed(struct irq_desc *desc, struct cpumask *aff, bool force)
irqd_clr_managed_shutdown(d);
- if (cpumask_any_and(aff, cpu_online_mask) > nr_cpu_ids) {
+ if (cpumask_any_and(aff, cpu_online_mask) >= nr_cpu_ids) {
/*
* Catch code which fiddles with enable_irq() on a managed
* and potentially shutdown IRQ. Chained interrupt
diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c
index f7086b78ad6e..5270a54b9fa4 100644
--- a/kernel/irq/generic-chip.c
+++ b/kernel/irq/generic-chip.c
@@ -322,7 +322,6 @@ int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip,
/* Calc pointer to the next generic chip */
tmp += sizeof(*gc) + num_ct * sizeof(struct irq_chip_type);
}
- d->name = name;
return 0;
}
EXPORT_SYMBOL_GPL(__irq_alloc_domain_generic_chips);
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
index 73be2b3909bd..82afb7ed369f 100644
--- a/kernel/irq/irqdesc.c
+++ b/kernel/irq/irqdesc.c
@@ -421,10 +421,8 @@ static void free_desc(unsigned int irq)
* The sysfs entry must be serialized against a concurrent
* irq_sysfs_init() as well.
*/
- mutex_lock(&sparse_irq_lock);
kobject_del(&desc->kobj);
delete_irq_desc(irq);
- mutex_unlock(&sparse_irq_lock);
/*
* We free the descriptor, masks and stat fields via RCU. That
@@ -462,20 +460,15 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node,
desc = alloc_desc(start + i, node, flags, mask, owner);
if (!desc)
goto err;
- mutex_lock(&sparse_irq_lock);
irq_insert_desc(start + i, desc);
irq_sysfs_add(start + i, desc);
- mutex_unlock(&sparse_irq_lock);
}
+ bitmap_set(allocated_irqs, start, cnt);
return start;
err:
for (i--; i >= 0; i--)
free_desc(start + i);
-
- mutex_lock(&sparse_irq_lock);
- bitmap_clear(allocated_irqs, start, cnt);
- mutex_unlock(&sparse_irq_lock);
return -ENOMEM;
}
@@ -575,6 +568,7 @@ static inline int alloc_descs(unsigned int start, unsigned int cnt, int node,
desc->owner = owner;
}
+ bitmap_set(allocated_irqs, start, cnt);
return start;
}
@@ -670,10 +664,10 @@ void irq_free_descs(unsigned int from, unsigned int cnt)
if (from >= nr_irqs || (from + cnt) > nr_irqs)
return;
+ mutex_lock(&sparse_irq_lock);
for (i = 0; i < cnt; i++)
free_desc(from + i);
- mutex_lock(&sparse_irq_lock);
bitmap_clear(allocated_irqs, from, cnt);
mutex_unlock(&sparse_irq_lock);
}
@@ -720,19 +714,15 @@ __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
from, cnt, 0);
ret = -EEXIST;
if (irq >=0 && start != irq)
- goto err;
+ goto unlock;
if (start + cnt > nr_irqs) {
ret = irq_expand_nr_irqs(start + cnt);
if (ret)
- goto err;
+ goto unlock;
}
-
- bitmap_set(allocated_irqs, start, cnt);
- mutex_unlock(&sparse_irq_lock);
- return alloc_descs(start, cnt, node, affinity, owner);
-
-err:
+ ret = alloc_descs(start, cnt, node, affinity, owner);
+unlock:
mutex_unlock(&sparse_irq_lock);
return ret;
}
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index e84b7056bb08..ac4644e92b49 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -945,7 +945,7 @@ static int virq_debug_show(struct seq_file *m, void *private)
struct irq_desc *desc;
struct irq_domain *domain;
struct radix_tree_iter iter;
- void **slot;
+ void __rcu **slot;
int i;
seq_printf(m, " %-16s %-6s %-10s %-10s %s\n",
@@ -1453,7 +1453,7 @@ out_free_desc:
/* The irq_data was moved, fix the revmap to refer to the new location */
static void irq_domain_fix_revmap(struct irq_data *d)
{
- void **slot;
+ void __rcu **slot;
if (d->hwirq < d->domain->revmap_size)
return; /* Not using radix tree. */
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 573dc52b0806..d00132b5c325 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1643,6 +1643,10 @@ const void *free_irq(unsigned int irq, void *dev_id)
#endif
action = __free_irq(irq, dev_id);
+
+ if (!action)
+ return NULL;
+
devname = action->name;
kfree(action);
return devname;
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 48eadf416c24..3fa4bd59f569 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -315,11 +315,12 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
ops->set_desc(arg, desc);
/* Assumes the domain mutex is held! */
- ret = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg);
+ ret = irq_domain_alloc_irqs_hierarchy(domain, desc->irq, 1,
+ arg);
if (ret)
break;
- irq_set_msi_desc_off(virq, 0, desc);
+ irq_set_msi_desc_off(desc->irq, 0, desc);
}
if (ret) {
diff --git a/kernel/kcmp.c b/kernel/kcmp.c
index ea34ed8bb952..055bb2962a0b 100644
--- a/kernel/kcmp.c
+++ b/kernel/kcmp.c
@@ -131,7 +131,7 @@ static int kcmp_epoll_target(struct task_struct *task1,
if (filp_epoll) {
filp_tgt = get_epoll_tfile_raw_ptr(filp_epoll, slot.tfd, slot.toff);
fput(filp_epoll);
- } else
+ }
if (IS_ERR(filp_tgt))
return PTR_ERR(filp_tgt);
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
index 02f660666ab8..1fefe6dcafd7 100644
--- a/kernel/locking/rwsem-xadd.c
+++ b/kernel/locking/rwsem-xadd.c
@@ -613,6 +613,33 @@ struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem)
DEFINE_WAKE_Q(wake_q);
/*
+ * __rwsem_down_write_failed_common(sem)
+ * rwsem_optimistic_spin(sem)
+ * osq_unlock(sem->osq)
+ * ...
+ * atomic_long_add_return(&sem->count)
+ *
+ * - VS -
+ *
+ * __up_write()
+ * if (atomic_long_sub_return_release(&sem->count) < 0)
+ * rwsem_wake(sem)
+ * osq_is_locked(&sem->osq)
+ *
+ * And __up_write() must observe !osq_is_locked() when it observes the
+ * atomic_long_add_return() in order to not miss a wakeup.
+ *
+ * This boils down to:
+ *
+ * [S.rel] X = 1 [RmW] r0 = (Y += 0)
+ * MB RMB
+ * [RmW] Y += 1 [L] r1 = X
+ *
+ * exists (r0=1 /\ r1=0)
+ */
+ smp_rmb();
+
+ /*
* If a spinner is present, it is not necessary to do the wakeup.
* Try to do wakeup only if the trylock succeeds to minimize
* spinlock contention which may introduce too much delay in the
diff --git a/kernel/locking/test-ww_mutex.c b/kernel/locking/test-ww_mutex.c
index 39f56c870051..0e4cd64ad2c0 100644
--- a/kernel/locking/test-ww_mutex.c
+++ b/kernel/locking/test-ww_mutex.c
@@ -362,7 +362,7 @@ static int *get_random_order(int count)
int *order;
int n, r, tmp;
- order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
+ order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
if (!order)
return order;
diff --git a/kernel/memremap.c b/kernel/memremap.c
index 6bcbfbf1a8fd..403ab9cdb949 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -350,7 +350,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
pgprot_t pgprot = PAGE_KERNEL;
struct dev_pagemap *pgmap;
struct page_map *page_map;
- int error, nid, is_ram;
+ int error, nid, is_ram, i = 0;
align_start = res->start & ~(SECTION_SIZE - 1);
align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE)
@@ -448,6 +448,8 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
list_del(&page->lru);
page->pgmap = pgmap;
percpu_ref_get(ref);
+ if (!(++i % 1024))
+ cond_resched();
}
devres_add(dev, page_map);
return __va(res->start);
diff --git a/kernel/module.c b/kernel/module.c
index 40f983cbea81..de66ec825992 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2707,21 +2707,21 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
}
#endif /* CONFIG_KALLSYMS */
-static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num)
+static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num)
{
if (!debug)
return;
#ifdef CONFIG_DYNAMIC_DEBUG
- if (ddebug_add_module(debug, num, debug->modname))
+ if (ddebug_add_module(debug, num, mod->name))
pr_err("dynamic debug error adding module: %s\n",
debug->modname);
#endif
}
-static void dynamic_debug_remove(struct _ddebug *debug)
+static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
{
if (debug)
- ddebug_remove_module(debug->modname);
+ ddebug_remove_module(mod->name);
}
void * __weak module_alloc(unsigned long size)
@@ -3715,7 +3715,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
goto free_arch_cleanup;
}
- dynamic_debug_setup(info->debug, info->num_debug);
+ dynamic_debug_setup(mod, info->debug, info->num_debug);
/* Ftrace init must be called in the MODULE_STATE_UNFORMED state */
ftrace_module_init(mod);
@@ -3779,7 +3779,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
module_disable_nx(mod);
ddebug_cleanup:
- dynamic_debug_remove(info->debug);
+ dynamic_debug_remove(mod, info->debug);
synchronize_sched();
kfree(mod->args);
free_arch_cleanup:
diff --git a/kernel/params.c b/kernel/params.c
index 60b2d8101355..cc9108c2a1fd 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -224,7 +224,7 @@ char *parse_args(const char *doing,
} \
int param_get_##name(char *buffer, const struct kernel_param *kp) \
{ \
- return scnprintf(buffer, PAGE_SIZE, format, \
+ return scnprintf(buffer, PAGE_SIZE, format "\n", \
*((type *)kp->arg)); \
} \
const struct kernel_param_ops param_ops_##name = { \
@@ -236,14 +236,14 @@ char *parse_args(const char *doing,
EXPORT_SYMBOL(param_ops_##name)
-STANDARD_PARAM_DEF(byte, unsigned char, "%hhu", kstrtou8);
-STANDARD_PARAM_DEF(short, short, "%hi", kstrtos16);
-STANDARD_PARAM_DEF(ushort, unsigned short, "%hu", kstrtou16);
-STANDARD_PARAM_DEF(int, int, "%i", kstrtoint);
-STANDARD_PARAM_DEF(uint, unsigned int, "%u", kstrtouint);
-STANDARD_PARAM_DEF(long, long, "%li", kstrtol);
-STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", kstrtoul);
-STANDARD_PARAM_DEF(ullong, unsigned long long, "%llu", kstrtoull);
+STANDARD_PARAM_DEF(byte, unsigned char, "%hhu", kstrtou8);
+STANDARD_PARAM_DEF(short, short, "%hi", kstrtos16);
+STANDARD_PARAM_DEF(ushort, unsigned short, "%hu", kstrtou16);
+STANDARD_PARAM_DEF(int, int, "%i", kstrtoint);
+STANDARD_PARAM_DEF(uint, unsigned int, "%u", kstrtouint);
+STANDARD_PARAM_DEF(long, long, "%li", kstrtol);
+STANDARD_PARAM_DEF(ulong, unsigned long, "%lu", kstrtoul);
+STANDARD_PARAM_DEF(ullong, unsigned long long, "%llu", kstrtoull);
int param_set_charp(const char *val, const struct kernel_param *kp)
{
@@ -270,7 +270,7 @@ EXPORT_SYMBOL(param_set_charp);
int param_get_charp(char *buffer, const struct kernel_param *kp)
{
- return scnprintf(buffer, PAGE_SIZE, "%s", *((char **)kp->arg));
+ return scnprintf(buffer, PAGE_SIZE, "%s\n", *((char **)kp->arg));
}
EXPORT_SYMBOL(param_get_charp);
@@ -301,7 +301,7 @@ EXPORT_SYMBOL(param_set_bool);
int param_get_bool(char *buffer, const struct kernel_param *kp)
{
/* Y and N chosen as being relatively non-coder friendly */
- return sprintf(buffer, "%c", *(bool *)kp->arg ? 'Y' : 'N');
+ return sprintf(buffer, "%c\n", *(bool *)kp->arg ? 'Y' : 'N');
}
EXPORT_SYMBOL(param_get_bool);
@@ -360,7 +360,7 @@ EXPORT_SYMBOL(param_set_invbool);
int param_get_invbool(char *buffer, const struct kernel_param *kp)
{
- return sprintf(buffer, "%c", (*(bool *)kp->arg) ? 'N' : 'Y');
+ return sprintf(buffer, "%c\n", (*(bool *)kp->arg) ? 'N' : 'Y');
}
EXPORT_SYMBOL(param_get_invbool);
@@ -460,8 +460,9 @@ static int param_array_get(char *buffer, const struct kernel_param *kp)
struct kernel_param p = *kp;
for (i = off = 0; i < (arr->num ? *arr->num : arr->max); i++) {
+ /* Replace \n with comma */
if (i)
- buffer[off++] = ',';
+ buffer[off - 1] = ',';
p.arg = arr->elem + arr->elemsize * i;
check_kparam_locked(p.mod);
ret = arr->ops->get(buffer + off, &p);
@@ -507,7 +508,7 @@ EXPORT_SYMBOL(param_set_copystring);
int param_get_string(char *buffer, const struct kernel_param *kp)
{
const struct kparam_string *kps = kp->str;
- return strlcpy(buffer, kps->string, kps->maxlen);
+ return scnprintf(buffer, PAGE_SIZE, "%s\n", kps->string);
}
EXPORT_SYMBOL(param_get_string);
@@ -549,10 +550,6 @@ static ssize_t param_attr_show(struct module_attribute *mattr,
kernel_param_lock(mk->mod);
count = attribute->param->ops->get(buf, attribute->param);
kernel_param_unlock(mk->mod);
- if (count > 0) {
- strcat(buf, "\n");
- ++count;
- }
return count;
}
@@ -600,7 +597,7 @@ EXPORT_SYMBOL(kernel_param_unlock);
/*
* add_sysfs_param - add a parameter to sysfs
* @mk: struct module_kobject
- * @kparam: the actual parameter definition to add to sysfs
+ * @kp: the actual parameter definition to add to sysfs
* @name: name of parameter
*
* Create a kobject if for a (per-module) parameter if mp NULL, and
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index 74a5a7255b4d..4918314893bc 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -101,6 +101,10 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns
int i;
int err;
+ err = -EINVAL;
+ if (!in_userns(parent_pid_ns->user_ns, user_ns))
+ goto out;
+
err = -ENOSPC;
if (level > MAX_PID_NS_LEVEL)
goto out;
diff --git a/kernel/power/process.c b/kernel/power/process.c
index 78672d324a6e..50f25cb370c6 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -20,8 +20,9 @@
#include <linux/workqueue.h>
#include <linux/kmod.h>
#include <trace/events/power.h>
+#include <linux/cpuset.h>
-/*
+/*
* Timeout for stopping processes
*/
unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
@@ -202,6 +203,8 @@ void thaw_processes(void)
__usermodehelper_set_disable_depth(UMH_FREEZING);
thaw_workqueues();
+ cpuset_wait_for_hotplug();
+
read_lock(&tasklist_lock);
for_each_process_thread(g, p) {
/* No other threads should have PF_SUSPEND_TASK set */
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 3e2b4f519009..ccd2d20e6b06 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -120,22 +120,26 @@ static void s2idle_loop(void)
* frozen processes + suspended devices + idle processors.
* Thus s2idle_enter() should be called right after
* all devices have been suspended.
+ *
+ * Wakeups during the noirq suspend of devices may be spurious,
+ * so prevent them from terminating the loop right away.
*/
error = dpm_noirq_suspend_devices(PMSG_SUSPEND);
if (!error)
s2idle_enter();
+ else if (error == -EBUSY && pm_wakeup_pending())
+ error = 0;
- dpm_noirq_resume_devices(PMSG_RESUME);
- if (error && (error != -EBUSY || !pm_wakeup_pending())) {
- dpm_noirq_end();
- break;
- }
-
- if (s2idle_ops && s2idle_ops->wake)
+ if (!error && s2idle_ops && s2idle_ops->wake)
s2idle_ops->wake();
+ dpm_noirq_resume_devices(PMSG_RESUME);
+
dpm_noirq_end();
+ if (error)
+ break;
+
if (s2idle_ops && s2idle_ops->sync)
s2idle_ops->sync();
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 60f356d91060..84b1367935e4 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -728,8 +728,7 @@ static int ptrace_peek_siginfo(struct task_struct *child,
if (unlikely(in_compat_syscall())) {
compat_siginfo_t __user *uinfo = compat_ptr(data);
- if (copy_siginfo_to_user32(uinfo, &info) ||
- __put_user(info.si_code, &uinfo->si_code)) {
+ if (copy_siginfo_to_user32(uinfo, &info)) {
ret = -EFAULT;
break;
}
@@ -739,8 +738,7 @@ static int ptrace_peek_siginfo(struct task_struct *child,
{
siginfo_t __user *uinfo = (siginfo_t __user *) data;
- if (copy_siginfo_to_user(uinfo, &info) ||
- __put_user(info.si_code, &uinfo->si_code)) {
+ if (copy_siginfo_to_user(uinfo, &info)) {
ret = -EFAULT;
break;
}
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 1250e4bd4b85..b0ad62b0e7b8 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -882,6 +882,11 @@ void rcu_irq_exit(void)
RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_exit() invoked with irqs enabled!!!");
rdtp = this_cpu_ptr(&rcu_dynticks);
+
+ /* Page faults can happen in NMI handlers, so check... */
+ if (rdtp->dynticks_nmi_nesting)
+ return;
+
WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
rdtp->dynticks_nesting < 1);
if (rdtp->dynticks_nesting <= 1) {
@@ -1015,6 +1020,11 @@ void rcu_irq_enter(void)
RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_enter() invoked with irqs enabled!!!");
rdtp = this_cpu_ptr(&rcu_dynticks);
+
+ /* Page faults can happen in NMI handlers, so check... */
+ if (rdtp->dynticks_nmi_nesting)
+ return;
+
oldval = rdtp->dynticks_nesting;
rdtp->dynticks_nesting++;
WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 6d2c7ff9ba98..d17c5da523a0 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1173,6 +1173,10 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
WARN_ON_ONCE(debug_locks && !(lockdep_is_held(&p->pi_lock) ||
lockdep_is_held(&task_rq(p)->lock)));
#endif
+ /*
+ * Clearly, migrating tasks to offline CPUs is a fairly daft thing.
+ */
+ WARN_ON_ONCE(!cpu_online(new_cpu));
#endif
trace_sched_migrate_task(p, new_cpu);
@@ -5162,6 +5166,28 @@ void sched_show_task(struct task_struct *p)
put_task_stack(p);
}
+static inline bool
+state_filter_match(unsigned long state_filter, struct task_struct *p)
+{
+ /* no filter, everything matches */
+ if (!state_filter)
+ return true;
+
+ /* filter, but doesn't match */
+ if (!(p->state & state_filter))
+ return false;
+
+ /*
+ * When looking for TASK_UNINTERRUPTIBLE skip TASK_IDLE (allows
+ * TASK_KILLABLE).
+ */
+ if (state_filter == TASK_UNINTERRUPTIBLE && p->state == TASK_IDLE)
+ return false;
+
+ return true;
+}
+
+
void show_state_filter(unsigned long state_filter)
{
struct task_struct *g, *p;
@@ -5184,7 +5210,7 @@ void show_state_filter(unsigned long state_filter)
*/
touch_nmi_watchdog();
touch_all_softlockup_watchdogs();
- if (!state_filter || (p->state & state_filter))
+ if (state_filter_match(state_filter, p))
sched_show_task(p);
}
@@ -5556,16 +5582,15 @@ static void cpuset_cpu_active(void)
* operation in the resume sequence, just build a single sched
* domain, ignoring cpusets.
*/
- num_cpus_frozen--;
- if (likely(num_cpus_frozen)) {
- partition_sched_domains(1, NULL, NULL);
+ partition_sched_domains(1, NULL, NULL);
+ if (--num_cpus_frozen)
return;
- }
/*
* This is the last CPU online operation. So fall through and
* restore the original sched domains by considering the
* cpuset configurations.
*/
+ cpuset_force_rebuild();
}
cpuset_update_active_cpus();
}
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 8e536d963652..2f93e4a2d9f6 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -181,11 +181,16 @@ static const struct file_operations sched_feat_fops = {
.release = single_release,
};
+__read_mostly bool sched_debug_enabled;
+
static __init int sched_init_debug(void)
{
debugfs_create_file("sched_features", 0644, NULL, NULL,
&sched_feat_fops);
+ debugfs_create_bool("sched_debug", 0644, NULL,
+ &sched_debug_enabled);
+
return 0;
}
late_initcall(sched_init_debug);
@@ -461,8 +466,6 @@ static char *task_group_path(struct task_group *tg)
}
#endif
-static const char stat_nam[] = TASK_STATE_TO_CHAR_STR;
-
static void
print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
{
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index a5d83ed8dd82..70ba32e08a23 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5424,7 +5424,7 @@ wake_affine_llc(struct sched_domain *sd, struct task_struct *p,
return false;
/* if this cache has capacity, come here */
- if (this_stats.has_capacity && this_stats.nr_running < prev_stats.nr_running+1)
+ if (this_stats.has_capacity && this_stats.nr_running+1 < prev_stats.nr_running)
return true;
/*
@@ -7708,7 +7708,7 @@ next_group:
* number.
*
* Return: 1 when packing is required and a task should be moved to
- * this CPU. The amount of the imbalance is returned in *imbalance.
+ * this CPU. The amount of the imbalance is returned in env->imbalance.
*
* @env: The load balancing environment.
* @sds: Statistics of the sched_domain which is to be packed
@@ -8437,6 +8437,12 @@ static int idle_balance(struct rq *this_rq, struct rq_flags *rf)
this_rq->idle_stamp = rq_clock(this_rq);
/*
+ * Do not pull tasks towards !active CPUs...
+ */
+ if (!cpu_active(this_cpu))
+ return 0;
+
+ /*
* This is OK, because current is on_cpu, which avoids it being picked
* for load-balance and preemption/IRQs are still disabled avoiding
* further scheduler activity on it and we're being very careful to
@@ -8543,6 +8549,13 @@ static int active_load_balance_cpu_stop(void *data)
struct rq_flags rf;
rq_lock_irq(busiest_rq, &rf);
+ /*
+ * Between queueing the stop-work and running it is a hole in which
+ * CPUs can become inactive. We should not move tasks from or to
+ * inactive CPUs.
+ */
+ if (!cpu_active(busiest_cpu) || !cpu_active(target_cpu))
+ goto out_unlock;
/* make sure the requested cpu hasn't gone down in the meantime */
if (unlikely(busiest_cpu != smp_processor_id() ||
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 746ac78ff492..14db76cd496f 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1951,6 +1951,8 @@ extern struct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq);
extern struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq);
#ifdef CONFIG_SCHED_DEBUG
+extern bool sched_debug_enabled;
+
extern void print_cfs_stats(struct seq_file *m, int cpu);
extern void print_rt_stats(struct seq_file *m, int cpu);
extern void print_dl_stats(struct seq_file *m, int cpu);
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 5d0062cc10cb..f1cf4f306a82 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -14,11 +14,9 @@ cpumask_var_t sched_domains_tmpmask2;
#ifdef CONFIG_SCHED_DEBUG
-static __read_mostly int sched_debug_enabled;
-
static int __init sched_debug_setup(char *str)
{
- sched_debug_enabled = 1;
+ sched_debug_enabled = true;
return 0;
}
diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c
index d6afed6d0752..98feab7933c7 100644
--- a/kernel/sched/wait.c
+++ b/kernel/sched/wait.c
@@ -53,6 +53,12 @@ void remove_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry
}
EXPORT_SYMBOL(remove_wait_queue);
+/*
+ * Scan threshold to break wait queue walk.
+ * This allows a waker to take a break from holding the
+ * wait queue lock during the wait queue walk.
+ */
+#define WAITQUEUE_WALK_BREAK_CNT 64
/*
* The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just
@@ -63,18 +69,67 @@ EXPORT_SYMBOL(remove_wait_queue);
* started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
* zero in this (rare) case, and we handle it by continuing to scan the queue.
*/
-static void __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,
- int nr_exclusive, int wake_flags, void *key)
+static int __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,
+ int nr_exclusive, int wake_flags, void *key,
+ wait_queue_entry_t *bookmark)
{
wait_queue_entry_t *curr, *next;
+ int cnt = 0;
+
+ if (bookmark && (bookmark->flags & WQ_FLAG_BOOKMARK)) {
+ curr = list_next_entry(bookmark, entry);
+
+ list_del(&bookmark->entry);
+ bookmark->flags = 0;
+ } else
+ curr = list_first_entry(&wq_head->head, wait_queue_entry_t, entry);
- list_for_each_entry_safe(curr, next, &wq_head->head, entry) {
+ if (&curr->entry == &wq_head->head)
+ return nr_exclusive;
+
+ list_for_each_entry_safe_from(curr, next, &wq_head->head, entry) {
unsigned flags = curr->flags;
- int ret = curr->func(curr, mode, wake_flags, key);
+ int ret;
+
+ if (flags & WQ_FLAG_BOOKMARK)
+ continue;
+
+ ret = curr->func(curr, mode, wake_flags, key);
if (ret < 0)
break;
if (ret && (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
break;
+
+ if (bookmark && (++cnt > WAITQUEUE_WALK_BREAK_CNT) &&
+ (&next->entry != &wq_head->head)) {
+ bookmark->flags = WQ_FLAG_BOOKMARK;
+ list_add_tail(&bookmark->entry, &next->entry);
+ break;
+ }
+ }
+ return nr_exclusive;
+}
+
+static void __wake_up_common_lock(struct wait_queue_head *wq_head, unsigned int mode,
+ int nr_exclusive, int wake_flags, void *key)
+{
+ unsigned long flags;
+ wait_queue_entry_t bookmark;
+
+ bookmark.flags = 0;
+ bookmark.private = NULL;
+ bookmark.func = NULL;
+ INIT_LIST_HEAD(&bookmark.entry);
+
+ spin_lock_irqsave(&wq_head->lock, flags);
+ nr_exclusive = __wake_up_common(wq_head, mode, nr_exclusive, wake_flags, key, &bookmark);
+ spin_unlock_irqrestore(&wq_head->lock, flags);
+
+ while (bookmark.flags & WQ_FLAG_BOOKMARK) {
+ spin_lock_irqsave(&wq_head->lock, flags);
+ nr_exclusive = __wake_up_common(wq_head, mode, nr_exclusive,
+ wake_flags, key, &bookmark);
+ spin_unlock_irqrestore(&wq_head->lock, flags);
}
}
@@ -91,11 +146,7 @@ static void __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,
void __wake_up(struct wait_queue_head *wq_head, unsigned int mode,
int nr_exclusive, void *key)
{
- unsigned long flags;
-
- spin_lock_irqsave(&wq_head->lock, flags);
- __wake_up_common(wq_head, mode, nr_exclusive, 0, key);
- spin_unlock_irqrestore(&wq_head->lock, flags);
+ __wake_up_common_lock(wq_head, mode, nr_exclusive, 0, key);
}
EXPORT_SYMBOL(__wake_up);
@@ -104,16 +155,23 @@ EXPORT_SYMBOL(__wake_up);
*/
void __wake_up_locked(struct wait_queue_head *wq_head, unsigned int mode, int nr)
{
- __wake_up_common(wq_head, mode, nr, 0, NULL);
+ __wake_up_common(wq_head, mode, nr, 0, NULL, NULL);
}
EXPORT_SYMBOL_GPL(__wake_up_locked);
void __wake_up_locked_key(struct wait_queue_head *wq_head, unsigned int mode, void *key)
{
- __wake_up_common(wq_head, mode, 1, 0, key);
+ __wake_up_common(wq_head, mode, 1, 0, key, NULL);
}
EXPORT_SYMBOL_GPL(__wake_up_locked_key);
+void __wake_up_locked_key_bookmark(struct wait_queue_head *wq_head,
+ unsigned int mode, void *key, wait_queue_entry_t *bookmark)
+{
+ __wake_up_common(wq_head, mode, 1, 0, key, bookmark);
+}
+EXPORT_SYMBOL_GPL(__wake_up_locked_key_bookmark);
+
/**
* __wake_up_sync_key - wake up threads blocked on a waitqueue.
* @wq_head: the waitqueue
@@ -134,7 +192,6 @@ EXPORT_SYMBOL_GPL(__wake_up_locked_key);
void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode,
int nr_exclusive, void *key)
{
- unsigned long flags;
int wake_flags = 1; /* XXX WF_SYNC */
if (unlikely(!wq_head))
@@ -143,9 +200,7 @@ void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode,
if (unlikely(nr_exclusive != 1))
wake_flags = 0;
- spin_lock_irqsave(&wq_head->lock, flags);
- __wake_up_common(wq_head, mode, nr_exclusive, wake_flags, key);
- spin_unlock_irqrestore(&wq_head->lock, flags);
+ __wake_up_common_lock(wq_head, mode, nr_exclusive, wake_flags, key);
}
EXPORT_SYMBOL_GPL(__wake_up_sync_key);
diff --git a/kernel/seccomp.c b/kernel/seccomp.c
index 98b59b5db90b..bb3a38005b9c 100644
--- a/kernel/seccomp.c
+++ b/kernel/seccomp.c
@@ -17,11 +17,13 @@
#include <linux/audit.h>
#include <linux/compat.h>
#include <linux/coredump.h>
+#include <linux/kmemleak.h>
#include <linux/sched.h>
#include <linux/sched/task_stack.h>
#include <linux/seccomp.h>
#include <linux/slab.h>
#include <linux/syscalls.h>
+#include <linux/sysctl.h>
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
#include <asm/syscall.h>
@@ -42,6 +44,7 @@
* get/put helpers should be used when accessing an instance
* outside of a lifetime-guarded section. In general, this
* is only needed for handling filters shared across tasks.
+ * @log: true if all actions except for SECCOMP_RET_ALLOW should be logged
* @prev: points to a previously installed, or inherited, filter
* @prog: the BPF program to evaluate
*
@@ -57,6 +60,7 @@
*/
struct seccomp_filter {
refcount_t usage;
+ bool log;
struct seccomp_filter *prev;
struct bpf_prog *prog;
};
@@ -171,10 +175,15 @@ static int seccomp_check_filter(struct sock_filter *filter, unsigned int flen)
/**
* seccomp_run_filters - evaluates all seccomp filters against @sd
* @sd: optional seccomp data to be passed to filters
+ * @match: stores struct seccomp_filter that resulted in the return value,
+ * unless filter returned SECCOMP_RET_ALLOW, in which case it will
+ * be unchanged.
*
* Returns valid seccomp BPF response codes.
*/
-static u32 seccomp_run_filters(const struct seccomp_data *sd)
+#define ACTION_ONLY(ret) ((s32)((ret) & (SECCOMP_RET_ACTION_FULL)))
+static u32 seccomp_run_filters(const struct seccomp_data *sd,
+ struct seccomp_filter **match)
{
struct seccomp_data sd_local;
u32 ret = SECCOMP_RET_ALLOW;
@@ -184,7 +193,7 @@ static u32 seccomp_run_filters(const struct seccomp_data *sd)
/* Ensure unexpected behavior doesn't result in failing open. */
if (unlikely(WARN_ON(f == NULL)))
- return SECCOMP_RET_KILL;
+ return SECCOMP_RET_KILL_PROCESS;
if (!sd) {
populate_seccomp_data(&sd_local);
@@ -198,8 +207,10 @@ static u32 seccomp_run_filters(const struct seccomp_data *sd)
for (; f; f = f->prev) {
u32 cur_ret = BPF_PROG_RUN(f->prog, sd);
- if ((cur_ret & SECCOMP_RET_ACTION) < (ret & SECCOMP_RET_ACTION))
+ if (ACTION_ONLY(cur_ret) < ACTION_ONLY(ret)) {
ret = cur_ret;
+ *match = f;
+ }
}
return ret;
}
@@ -444,6 +455,10 @@ static long seccomp_attach_filter(unsigned int flags,
return ret;
}
+ /* Set log flag, if present. */
+ if (flags & SECCOMP_FILTER_FLAG_LOG)
+ filter->log = true;
+
/*
* If there is an existing filter, make it the prev and don't drop its
* task reference.
@@ -458,14 +473,19 @@ static long seccomp_attach_filter(unsigned int flags,
return 0;
}
+void __get_seccomp_filter(struct seccomp_filter *filter)
+{
+ /* Reference count is bounded by the number of total processes. */
+ refcount_inc(&filter->usage);
+}
+
/* get_seccomp_filter - increments the reference count of the filter on @tsk */
void get_seccomp_filter(struct task_struct *tsk)
{
struct seccomp_filter *orig = tsk->seccomp.filter;
if (!orig)
return;
- /* Reference count is bounded by the number of total processes. */
- refcount_inc(&orig->usage);
+ __get_seccomp_filter(orig);
}
static inline void seccomp_filter_free(struct seccomp_filter *filter)
@@ -476,10 +496,8 @@ static inline void seccomp_filter_free(struct seccomp_filter *filter)
}
}
-/* put_seccomp_filter - decrements the ref count of tsk->seccomp.filter */
-void put_seccomp_filter(struct task_struct *tsk)
+static void __put_seccomp_filter(struct seccomp_filter *orig)
{
- struct seccomp_filter *orig = tsk->seccomp.filter;
/* Clean up single-reference branches iteratively. */
while (orig && refcount_dec_and_test(&orig->usage)) {
struct seccomp_filter *freeme = orig;
@@ -488,6 +506,12 @@ void put_seccomp_filter(struct task_struct *tsk)
}
}
+/* put_seccomp_filter - decrements the ref count of tsk->seccomp.filter */
+void put_seccomp_filter(struct task_struct *tsk)
+{
+ __put_seccomp_filter(tsk->seccomp.filter);
+}
+
static void seccomp_init_siginfo(siginfo_t *info, int syscall, int reason)
{
memset(info, 0, sizeof(*info));
@@ -514,6 +538,65 @@ static void seccomp_send_sigsys(int syscall, int reason)
}
#endif /* CONFIG_SECCOMP_FILTER */
+/* For use with seccomp_actions_logged */
+#define SECCOMP_LOG_KILL_PROCESS (1 << 0)
+#define SECCOMP_LOG_KILL_THREAD (1 << 1)
+#define SECCOMP_LOG_TRAP (1 << 2)
+#define SECCOMP_LOG_ERRNO (1 << 3)
+#define SECCOMP_LOG_TRACE (1 << 4)
+#define SECCOMP_LOG_LOG (1 << 5)
+#define SECCOMP_LOG_ALLOW (1 << 6)
+
+static u32 seccomp_actions_logged = SECCOMP_LOG_KILL_PROCESS |
+ SECCOMP_LOG_KILL_THREAD |
+ SECCOMP_LOG_TRAP |
+ SECCOMP_LOG_ERRNO |
+ SECCOMP_LOG_TRACE |
+ SECCOMP_LOG_LOG;
+
+static inline void seccomp_log(unsigned long syscall, long signr, u32 action,
+ bool requested)
+{
+ bool log = false;
+
+ switch (action) {
+ case SECCOMP_RET_ALLOW:
+ break;
+ case SECCOMP_RET_TRAP:
+ log = requested && seccomp_actions_logged & SECCOMP_LOG_TRAP;
+ break;
+ case SECCOMP_RET_ERRNO:
+ log = requested && seccomp_actions_logged & SECCOMP_LOG_ERRNO;
+ break;
+ case SECCOMP_RET_TRACE:
+ log = requested && seccomp_actions_logged & SECCOMP_LOG_TRACE;
+ break;
+ case SECCOMP_RET_LOG:
+ log = seccomp_actions_logged & SECCOMP_LOG_LOG;
+ break;
+ case SECCOMP_RET_KILL_THREAD:
+ log = seccomp_actions_logged & SECCOMP_LOG_KILL_THREAD;
+ break;
+ case SECCOMP_RET_KILL_PROCESS:
+ default:
+ log = seccomp_actions_logged & SECCOMP_LOG_KILL_PROCESS;
+ }
+
+ /*
+ * Force an audit message to be emitted when the action is RET_KILL_*,
+ * RET_LOG, or the FILTER_FLAG_LOG bit was set and the action is
+ * allowed to be logged by the admin.
+ */
+ if (log)
+ return __audit_seccomp(syscall, signr, action);
+
+ /*
+ * Let the audit subsystem decide if the action should be audited based
+ * on whether the current task itself is being audited.
+ */
+ return audit_seccomp(syscall, signr, action);
+}
+
/*
* Secure computing mode 1 allows only read/write/exit/sigreturn.
* To be fully secure this must be combined with rlimit
@@ -539,7 +622,7 @@ static void __secure_computing_strict(int this_syscall)
#ifdef SECCOMP_DEBUG
dump_stack();
#endif
- audit_seccomp(this_syscall, SIGKILL, SECCOMP_RET_KILL);
+ seccomp_log(this_syscall, SIGKILL, SECCOMP_RET_KILL_THREAD, true);
do_exit(SIGKILL);
}
@@ -566,6 +649,7 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
const bool recheck_after_trace)
{
u32 filter_ret, action;
+ struct seccomp_filter *match = NULL;
int data;
/*
@@ -574,9 +658,9 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
*/
rmb();
- filter_ret = seccomp_run_filters(sd);
+ filter_ret = seccomp_run_filters(sd, &match);
data = filter_ret & SECCOMP_RET_DATA;
- action = filter_ret & SECCOMP_RET_ACTION;
+ action = filter_ret & SECCOMP_RET_ACTION_FULL;
switch (action) {
case SECCOMP_RET_ERRNO:
@@ -637,14 +721,25 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
return 0;
+ case SECCOMP_RET_LOG:
+ seccomp_log(this_syscall, 0, action, true);
+ return 0;
+
case SECCOMP_RET_ALLOW:
+ /*
+ * Note that the "match" filter will always be NULL for
+ * this action since SECCOMP_RET_ALLOW is the starting
+ * state in seccomp_run_filters().
+ */
return 0;
- case SECCOMP_RET_KILL:
+ case SECCOMP_RET_KILL_THREAD:
+ case SECCOMP_RET_KILL_PROCESS:
default:
- audit_seccomp(this_syscall, SIGSYS, action);
+ seccomp_log(this_syscall, SIGSYS, action, true);
/* Dump core only if this is the last remaining thread. */
- if (get_nr_threads(current) == 1) {
+ if (action == SECCOMP_RET_KILL_PROCESS ||
+ get_nr_threads(current) == 1) {
siginfo_t info;
/* Show the original registers in the dump. */
@@ -653,13 +748,16 @@ static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
seccomp_init_siginfo(&info, this_syscall, data);
do_coredump(&info);
}
- do_exit(SIGSYS);
+ if (action == SECCOMP_RET_KILL_PROCESS)
+ do_group_exit(SIGSYS);
+ else
+ do_exit(SIGSYS);
}
unreachable();
skip:
- audit_seccomp(this_syscall, 0, action);
+ seccomp_log(this_syscall, 0, action, match ? match->log : false);
return -1;
}
#else
@@ -794,6 +892,29 @@ static inline long seccomp_set_mode_filter(unsigned int flags,
}
#endif
+static long seccomp_get_action_avail(const char __user *uaction)
+{
+ u32 action;
+
+ if (copy_from_user(&action, uaction, sizeof(action)))
+ return -EFAULT;
+
+ switch (action) {
+ case SECCOMP_RET_KILL_PROCESS:
+ case SECCOMP_RET_KILL_THREAD:
+ case SECCOMP_RET_TRAP:
+ case SECCOMP_RET_ERRNO:
+ case SECCOMP_RET_TRACE:
+ case SECCOMP_RET_LOG:
+ case SECCOMP_RET_ALLOW:
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ return 0;
+}
+
/* Common entry point for both prctl and syscall. */
static long do_seccomp(unsigned int op, unsigned int flags,
const char __user *uargs)
@@ -805,6 +926,11 @@ static long do_seccomp(unsigned int op, unsigned int flags,
return seccomp_set_mode_strict();
case SECCOMP_SET_MODE_FILTER:
return seccomp_set_mode_filter(flags, uargs);
+ case SECCOMP_GET_ACTION_AVAIL:
+ if (flags != 0)
+ return -EINVAL;
+
+ return seccomp_get_action_avail(uargs);
default:
return -EINVAL;
}
@@ -908,13 +1034,13 @@ long seccomp_get_filter(struct task_struct *task, unsigned long filter_off,
if (!data)
goto out;
- get_seccomp_filter(task);
+ __get_seccomp_filter(filter);
spin_unlock_irq(&task->sighand->siglock);
if (copy_to_user(data, fprog->filter, bpf_classic_proglen(fprog)))
ret = -EFAULT;
- put_seccomp_filter(task);
+ __put_seccomp_filter(filter);
return ret;
out:
@@ -922,3 +1048,185 @@ out:
return ret;
}
#endif
+
+#ifdef CONFIG_SYSCTL
+
+/* Human readable action names for friendly sysctl interaction */
+#define SECCOMP_RET_KILL_PROCESS_NAME "kill_process"
+#define SECCOMP_RET_KILL_THREAD_NAME "kill_thread"
+#define SECCOMP_RET_TRAP_NAME "trap"
+#define SECCOMP_RET_ERRNO_NAME "errno"
+#define SECCOMP_RET_TRACE_NAME "trace"
+#define SECCOMP_RET_LOG_NAME "log"
+#define SECCOMP_RET_ALLOW_NAME "allow"
+
+static const char seccomp_actions_avail[] =
+ SECCOMP_RET_KILL_PROCESS_NAME " "
+ SECCOMP_RET_KILL_THREAD_NAME " "
+ SECCOMP_RET_TRAP_NAME " "
+ SECCOMP_RET_ERRNO_NAME " "
+ SECCOMP_RET_TRACE_NAME " "
+ SECCOMP_RET_LOG_NAME " "
+ SECCOMP_RET_ALLOW_NAME;
+
+struct seccomp_log_name {
+ u32 log;
+ const char *name;
+};
+
+static const struct seccomp_log_name seccomp_log_names[] = {
+ { SECCOMP_LOG_KILL_PROCESS, SECCOMP_RET_KILL_PROCESS_NAME },
+ { SECCOMP_LOG_KILL_THREAD, SECCOMP_RET_KILL_THREAD_NAME },
+ { SECCOMP_LOG_TRAP, SECCOMP_RET_TRAP_NAME },
+ { SECCOMP_LOG_ERRNO, SECCOMP_RET_ERRNO_NAME },
+ { SECCOMP_LOG_TRACE, SECCOMP_RET_TRACE_NAME },
+ { SECCOMP_LOG_LOG, SECCOMP_RET_LOG_NAME },
+ { SECCOMP_LOG_ALLOW, SECCOMP_RET_ALLOW_NAME },
+ { }
+};
+
+static bool seccomp_names_from_actions_logged(char *names, size_t size,
+ u32 actions_logged)
+{
+ const struct seccomp_log_name *cur;
+ bool append_space = false;
+
+ for (cur = seccomp_log_names; cur->name && size; cur++) {
+ ssize_t ret;
+
+ if (!(actions_logged & cur->log))
+ continue;
+
+ if (append_space) {
+ ret = strscpy(names, " ", size);
+ if (ret < 0)
+ return false;
+
+ names += ret;
+ size -= ret;
+ } else
+ append_space = true;
+
+ ret = strscpy(names, cur->name, size);
+ if (ret < 0)
+ return false;
+
+ names += ret;
+ size -= ret;
+ }
+
+ return true;
+}
+
+static bool seccomp_action_logged_from_name(u32 *action_logged,
+ const char *name)
+{
+ const struct seccomp_log_name *cur;
+
+ for (cur = seccomp_log_names; cur->name; cur++) {
+ if (!strcmp(cur->name, name)) {
+ *action_logged = cur->log;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool seccomp_actions_logged_from_names(u32 *actions_logged, char *names)
+{
+ char *name;
+
+ *actions_logged = 0;
+ while ((name = strsep(&names, " ")) && *name) {
+ u32 action_logged = 0;
+
+ if (!seccomp_action_logged_from_name(&action_logged, name))
+ return false;
+
+ *actions_logged |= action_logged;
+ }
+
+ return true;
+}
+
+static int seccomp_actions_logged_handler(struct ctl_table *ro_table, int write,
+ void __user *buffer, size_t *lenp,
+ loff_t *ppos)
+{
+ char names[sizeof(seccomp_actions_avail)];
+ struct ctl_table table;
+ int ret;
+
+ if (write && !capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+ memset(names, 0, sizeof(names));
+
+ if (!write) {
+ if (!seccomp_names_from_actions_logged(names, sizeof(names),
+ seccomp_actions_logged))
+ return -EINVAL;
+ }
+
+ table = *ro_table;
+ table.data = names;
+ table.maxlen = sizeof(names);
+ ret = proc_dostring(&table, write, buffer, lenp, ppos);
+ if (ret)
+ return ret;
+
+ if (write) {
+ u32 actions_logged;
+
+ if (!seccomp_actions_logged_from_names(&actions_logged,
+ table.data))
+ return -EINVAL;
+
+ if (actions_logged & SECCOMP_LOG_ALLOW)
+ return -EINVAL;
+
+ seccomp_actions_logged = actions_logged;
+ }
+
+ return 0;
+}
+
+static struct ctl_path seccomp_sysctl_path[] = {
+ { .procname = "kernel", },
+ { .procname = "seccomp", },
+ { }
+};
+
+static struct ctl_table seccomp_sysctl_table[] = {
+ {
+ .procname = "actions_avail",
+ .data = (void *) &seccomp_actions_avail,
+ .maxlen = sizeof(seccomp_actions_avail),
+ .mode = 0444,
+ .proc_handler = proc_dostring,
+ },
+ {
+ .procname = "actions_logged",
+ .mode = 0644,
+ .proc_handler = seccomp_actions_logged_handler,
+ },
+ { }
+};
+
+static int __init seccomp_sysctl_init(void)
+{
+ struct ctl_table_header *hdr;
+
+ hdr = register_sysctl_paths(seccomp_sysctl_path, seccomp_sysctl_table);
+ if (!hdr)
+ pr_warn("seccomp: sysctl registration failed\n");
+ else
+ kmemleak_not_leak(hdr);
+
+ return 0;
+}
+
+device_initcall(seccomp_sysctl_init)
+
+#endif /* CONFIG_SYSCTL */
diff --git a/kernel/signal.c b/kernel/signal.c
index ed804a470dcd..800a18f77732 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2686,6 +2686,51 @@ COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
}
#endif
+enum siginfo_layout siginfo_layout(int sig, int si_code)
+{
+ enum siginfo_layout layout = SIL_KILL;
+ if ((si_code > SI_USER) && (si_code < SI_KERNEL)) {
+ static const struct {
+ unsigned char limit, layout;
+ } filter[] = {
+ [SIGILL] = { NSIGILL, SIL_FAULT },
+ [SIGFPE] = { NSIGFPE, SIL_FAULT },
+ [SIGSEGV] = { NSIGSEGV, SIL_FAULT },
+ [SIGBUS] = { NSIGBUS, SIL_FAULT },
+ [SIGTRAP] = { NSIGTRAP, SIL_FAULT },
+#if defined(SIGMET) && defined(NSIGEMT)
+ [SIGEMT] = { NSIGEMT, SIL_FAULT },
+#endif
+ [SIGCHLD] = { NSIGCHLD, SIL_CHLD },
+ [SIGPOLL] = { NSIGPOLL, SIL_POLL },
+#ifdef __ARCH_SIGSYS
+ [SIGSYS] = { NSIGSYS, SIL_SYS },
+#endif
+ };
+ if ((sig < ARRAY_SIZE(filter)) && (si_code <= filter[sig].limit))
+ layout = filter[sig].layout;
+ else if (si_code <= NSIGPOLL)
+ layout = SIL_POLL;
+ } else {
+ if (si_code == SI_TIMER)
+ layout = SIL_TIMER;
+ else if (si_code == SI_SIGIO)
+ layout = SIL_POLL;
+ else if (si_code < 0)
+ layout = SIL_RT;
+ /* Tests to support buggy kernel ABIs */
+#ifdef TRAP_FIXME
+ if ((sig == SIGTRAP) && (si_code == TRAP_FIXME))
+ layout = SIL_FAULT;
+#endif
+#ifdef FPE_FIXME
+ if ((sig == SIGFPE) && (si_code == FPE_FIXME))
+ layout = SIL_FAULT;
+#endif
+ }
+ return layout;
+}
+
#ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER
int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
@@ -2708,22 +2753,20 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
*/
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user((short)from->si_code, &to->si_code);
- switch (from->si_code & __SI_MASK) {
- case __SI_KILL:
+ err |= __put_user(from->si_code, &to->si_code);
+ switch (siginfo_layout(from->si_signo, from->si_code)) {
+ case SIL_KILL:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
- case __SI_TIMER:
- err |= __put_user(from->si_tid, &to->si_tid);
- err |= __put_user(from->si_overrun, &to->si_overrun);
- err |= __put_user(from->si_ptr, &to->si_ptr);
+ case SIL_TIMER:
+ /* Unreached SI_TIMER is negative */
break;
- case __SI_POLL:
+ case SIL_POLL:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
- case __SI_FAULT:
+ case SIL_FAULT:
err |= __put_user(from->si_addr, &to->si_addr);
#ifdef __ARCH_SI_TRAPNO
err |= __put_user(from->si_trapno, &to->si_trapno);
@@ -2748,30 +2791,25 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
err |= __put_user(from->si_pkey, &to->si_pkey);
#endif
break;
- case __SI_CHLD:
+ case SIL_CHLD:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_status, &to->si_status);
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
break;
- case __SI_RT: /* This is not generated by the kernel as of now. */
- case __SI_MESGQ: /* But this is */
+ case SIL_RT:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_ptr, &to->si_ptr);
break;
#ifdef __ARCH_SIGSYS
- case __SI_SYS:
+ case SIL_SYS:
err |= __put_user(from->si_call_addr, &to->si_call_addr);
err |= __put_user(from->si_syscall, &to->si_syscall);
err |= __put_user(from->si_arch, &to->si_arch);
break;
#endif
- default: /* this is just in case for now ... */
- err |= __put_user(from->si_pid, &to->si_pid);
- err |= __put_user(from->si_uid, &to->si_uid);
- break;
}
return err;
}
diff --git a/kernel/sys.c b/kernel/sys.c
index 2855ee73acd0..9aebc2935013 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1896,15 +1896,11 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map)
/*
* Finally, make sure the caller has the rights to
- * change /proc/pid/exe link: only local root should
+ * change /proc/pid/exe link: only local sys admin should
* be allowed to.
*/
if (prctl_map->exe_fd != (u32)-1) {
- struct user_namespace *ns = current_user_ns();
- const struct cred *cred = current_cred();
-
- if (!uid_eq(cred->uid, make_kuid(ns, 0)) ||
- !gid_eq(cred->gid, make_kgid(ns, 0)))
+ if (!ns_capable(current_user_ns(), CAP_SYS_ADMIN))
goto out;
}
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 6648fbbb8157..4da9e622471f 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -367,7 +367,8 @@ static struct ctl_table kern_table[] = {
.data = &sysctl_sched_time_avg,
.maxlen = sizeof(unsigned int),
.mode = 0644,
- .proc_handler = proc_dointvec,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &one,
},
#ifdef CONFIG_SCHEDSTATS
{
@@ -2187,8 +2188,6 @@ static int do_proc_douintvec_conv(unsigned long *lvalp,
if (write) {
if (*lvalp > UINT_MAX)
return -EINVAL;
- if (*lvalp > UINT_MAX)
- return -EINVAL;
*valp = *lvalp;
} else {
unsigned int val = *valp;
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 02e1859f2ca8..58ea8c03662e 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -986,8 +986,9 @@ static ssize_t bin_intvec(struct file *file,
size_t length = oldlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
- result = kernel_read(file, 0, buffer, BUFSZ - 1);
+ result = kernel_read(file, buffer, BUFSZ - 1, &pos);
if (result < 0)
goto out_kfree;
@@ -1016,6 +1017,7 @@ static ssize_t bin_intvec(struct file *file,
size_t length = newlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
str = buffer;
end = str + BUFSZ;
@@ -1029,7 +1031,7 @@ static ssize_t bin_intvec(struct file *file,
str += scnprintf(str, end - str, "%lu\t", value);
}
- result = kernel_write(file, buffer, str - buffer, 0);
+ result = kernel_write(file, buffer, str - buffer, &pos);
if (result < 0)
goto out_kfree;
}
@@ -1057,8 +1059,9 @@ static ssize_t bin_ulongvec(struct file *file,
size_t length = oldlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
- result = kernel_read(file, 0, buffer, BUFSZ - 1);
+ result = kernel_read(file, buffer, BUFSZ - 1, &pos);
if (result < 0)
goto out_kfree;
@@ -1087,6 +1090,7 @@ static ssize_t bin_ulongvec(struct file *file,
size_t length = newlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
str = buffer;
end = str + BUFSZ;
@@ -1100,7 +1104,7 @@ static ssize_t bin_ulongvec(struct file *file,
str += scnprintf(str, end - str, "%lu\t", value);
}
- result = kernel_write(file, buffer, str - buffer, 0);
+ result = kernel_write(file, buffer, str - buffer, &pos);
if (result < 0)
goto out_kfree;
}
@@ -1120,8 +1124,9 @@ static ssize_t bin_uuid(struct file *file,
if (oldval && oldlen) {
char buf[UUID_STRING_LEN + 1];
uuid_t uuid;
+ loff_t pos = 0;
- result = kernel_read(file, 0, buf, sizeof(buf) - 1);
+ result = kernel_read(file, buf, sizeof(buf) - 1, &pos);
if (result < 0)
goto out;
@@ -1154,8 +1159,9 @@ static ssize_t bin_dn_node_address(struct file *file,
char buf[15], *nodep;
unsigned long area, node;
__le16 dnaddr;
+ loff_t pos = 0;
- result = kernel_read(file, 0, buf, sizeof(buf) - 1);
+ result = kernel_read(file, buf, sizeof(buf) - 1, &pos);
if (result < 0)
goto out;
@@ -1188,6 +1194,7 @@ static ssize_t bin_dn_node_address(struct file *file,
__le16 dnaddr;
char buf[15];
int len;
+ loff_t pos = 0;
result = -EINVAL;
if (newlen != sizeof(dnaddr))
@@ -1201,7 +1208,7 @@ static ssize_t bin_dn_node_address(struct file *file,
le16_to_cpu(dnaddr) >> 10,
le16_to_cpu(dnaddr) & 0x3ff);
- result = kernel_write(file, buf, len, 0);
+ result = kernel_write(file, buf, len, &pos);
if (result < 0)
goto out;
}
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 2a685b45b73b..45a3928544ce 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -648,6 +648,12 @@ int blk_trace_startstop(struct request_queue *q, int start)
}
EXPORT_SYMBOL_GPL(blk_trace_startstop);
+/*
+ * When reading or writing the blktrace sysfs files, the references to the
+ * opened sysfs or device files should prevent the underlying block device
+ * from being removed. So no further delete protection is really needed.
+ */
+
/**
* blk_trace_ioctl: - handle the ioctls associated with tracing
* @bdev: the block device
@@ -665,7 +671,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
if (!q)
return -ENXIO;
- mutex_lock(&bdev->bd_mutex);
+ mutex_lock(&q->blk_trace_mutex);
switch (cmd) {
case BLKTRACESETUP:
@@ -691,7 +697,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
break;
}
- mutex_unlock(&bdev->bd_mutex);
+ mutex_unlock(&q->blk_trace_mutex);
return ret;
}
@@ -1727,7 +1733,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
if (q == NULL)
goto out_bdput;
- mutex_lock(&bdev->bd_mutex);
+ mutex_lock(&q->blk_trace_mutex);
if (attr == &dev_attr_enable) {
ret = sprintf(buf, "%u\n", !!q->blk_trace);
@@ -1746,7 +1752,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba);
out_unlock_bdev:
- mutex_unlock(&bdev->bd_mutex);
+ mutex_unlock(&q->blk_trace_mutex);
out_bdput:
bdput(bdev);
out:
@@ -1788,7 +1794,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
if (q == NULL)
goto out_bdput;
- mutex_lock(&bdev->bd_mutex);
+ mutex_lock(&q->blk_trace_mutex);
if (attr == &dev_attr_enable) {
if (value)
@@ -1814,7 +1820,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
}
out_unlock_bdev:
- mutex_unlock(&bdev->bd_mutex);
+ mutex_unlock(&q->blk_trace_mutex);
out_bdput:
bdput(bdev);
out:
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 6abfafd7f173..8319e09e15b9 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -4954,9 +4954,6 @@ static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;
static char ftrace_graph_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
static int ftrace_graph_set_hash(struct ftrace_hash *hash, char *buffer);
-static unsigned long save_global_trampoline;
-static unsigned long save_global_flags;
-
static int __init set_graph_function(char *str)
{
strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE);
@@ -6808,17 +6805,6 @@ void unregister_ftrace_graph(void)
unregister_pm_notifier(&ftrace_suspend_notifier);
unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL);
-#ifdef CONFIG_DYNAMIC_FTRACE
- /*
- * Function graph does not allocate the trampoline, but
- * other global_ops do. We need to reset the ALLOC_TRAMP flag
- * if one was used.
- */
- global_ops.trampoline = save_global_trampoline;
- if (save_global_flags & FTRACE_OPS_FL_ALLOC_TRAMP)
- global_ops.flags |= FTRACE_OPS_FL_ALLOC_TRAMP;
-#endif
-
out:
mutex_unlock(&ftrace_lock);
}
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 5360b7aec57a..752e5daf0896 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4020,11 +4020,17 @@ static int tracing_open(struct inode *inode, struct file *file)
/* If this file was open for write, then erase contents */
if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
int cpu = tracing_get_cpu(inode);
+ struct trace_buffer *trace_buf = &tr->trace_buffer;
+
+#ifdef CONFIG_TRACER_MAX_TRACE
+ if (tr->current_trace->print_max)
+ trace_buf = &tr->max_buffer;
+#endif
if (cpu == RING_BUFFER_ALL_CPUS)
- tracing_reset_online_cpus(&tr->trace_buffer);
+ tracing_reset_online_cpus(trace_buf);
else
- tracing_reset(&tr->trace_buffer, cpu);
+ tracing_reset(trace_buf, cpu);
}
if (file->f_mode & FMODE_READ) {
@@ -5358,6 +5364,13 @@ static int tracing_set_tracer(struct trace_array *tr, const char *buf)
if (t == tr->current_trace)
goto out;
+ /* Some tracers won't work on kernel command line */
+ if (system_state < SYSTEM_RUNNING && t->noboot) {
+ pr_warn("Tracer '%s' is not allowed on command line, ignored\n",
+ t->name);
+ goto out;
+ }
+
/* Some tracers are only allowed for the top level buffer */
if (!trace_ok_for_array(t, tr)) {
ret = -EINVAL;
@@ -5667,7 +5680,7 @@ static int tracing_wait_pipe(struct file *filp)
*
* iter->pos will be 0 if we haven't read anything.
*/
- if (!tracing_is_on() && iter->pos)
+ if (!tracer_tracing_is_on(iter->tr) && iter->pos)
break;
mutex_unlock(&iter->mutex);
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index fb5d54d0d1b3..652c682707cd 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -444,6 +444,8 @@ struct tracer {
#ifdef CONFIG_TRACER_MAX_TRACE
bool use_max_tr;
#endif
+ /* True if tracer cannot be enabled in kernel param */
+ bool noboot;
};
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 181e139a8057..61e7f0678d33 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -702,7 +702,7 @@ static void append_filter_err(struct filter_parse_state *ps,
int pos = ps->lasterr_pos;
char *buf, *pbuf;
- buf = (char *)__get_free_page(GFP_TEMPORARY);
+ buf = (char *)__get_free_page(GFP_KERNEL);
if (!buf)
return;
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c
index cd7480d0a201..dca78fc48439 100644
--- a/kernel/trace/trace_mmiotrace.c
+++ b/kernel/trace/trace_mmiotrace.c
@@ -282,6 +282,7 @@ static struct tracer mmio_tracer __read_mostly =
.close = mmio_close,
.read = mmio_read,
.print_line = mmio_print_line,
+ .noboot = true,
};
__init static int init_mmio_trace(void)
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index bac629af2285..c738e764e2a5 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -656,15 +656,6 @@ int trace_print_lat_context(struct trace_iterator *iter)
return !trace_seq_has_overflowed(s);
}
-static const char state_to_char[] = TASK_STATE_TO_CHAR_STR;
-
-static int task_state_char(unsigned long state)
-{
- int bit = state ? __ffs(state) + 1 : 0;
-
- return bit < sizeof(state_to_char) - 1 ? state_to_char[bit] : '?';
-}
-
/**
* ftrace_find_event - find a registered event
* @type: the type of event to look for
@@ -930,8 +921,8 @@ static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
trace_assign_type(field, iter->ent);
- T = task_state_char(field->next_state);
- S = task_state_char(field->prev_state);
+ T = __task_state_to_char(field->next_state);
+ S = __task_state_to_char(field->prev_state);
trace_find_cmdline(field->next_pid, comm);
trace_seq_printf(&iter->seq,
" %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
@@ -966,8 +957,8 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
trace_assign_type(field, iter->ent);
if (!S)
- S = task_state_char(field->prev_state);
- T = task_state_char(field->next_state);
+ S = __task_state_to_char(field->prev_state);
+ T = __task_state_to_char(field->next_state);
trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",
field->prev_pid,
field->prev_prio,
@@ -1002,8 +993,8 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
trace_assign_type(field, iter->ent);
if (!S)
- S = task_state_char(field->prev_state);
- T = task_state_char(field->next_state);
+ S = __task_state_to_char(field->prev_state);
+ T = __task_state_to_char(field->next_state);
SEQ_PUT_HEX_FIELD(s, field->prev_pid);
SEQ_PUT_HEX_FIELD(s, field->prev_prio);
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c
index ddec53b67646..0c331978b1a6 100644
--- a/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/trace/trace_sched_wakeup.c
@@ -397,10 +397,10 @@ tracing_sched_switch_trace(struct trace_array *tr,
entry = ring_buffer_event_data(event);
entry->prev_pid = prev->pid;
entry->prev_prio = prev->prio;
- entry->prev_state = prev->state;
+ entry->prev_state = __get_task_state(prev);
entry->next_pid = next->pid;
entry->next_prio = next->prio;
- entry->next_state = next->state;
+ entry->next_state = __get_task_state(next);
entry->next_cpu = task_cpu(next);
if (!call_filter_check_discard(call, entry, buffer, event))
@@ -425,10 +425,10 @@ tracing_sched_wakeup_trace(struct trace_array *tr,
entry = ring_buffer_event_data(event);
entry->prev_pid = curr->pid;
entry->prev_prio = curr->prio;
- entry->prev_state = curr->state;
+ entry->prev_state = __get_task_state(curr);
entry->next_pid = wakee->pid;
entry->next_prio = wakee->prio;
- entry->next_state = wakee->state;
+ entry->next_state = __get_task_state(wakee);
entry->next_cpu = task_cpu(wakee);
if (!call_filter_check_discard(call, entry, buffer, event))
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index a4df67cbc711..49cb41412eec 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -96,23 +96,9 @@ check_stack(unsigned long ip, unsigned long *stack)
if (in_nmi())
return;
- /*
- * There's a slight chance that we are tracing inside the
- * RCU infrastructure, and rcu_irq_enter() will not work
- * as expected.
- */
- if (unlikely(rcu_irq_enter_disabled()))
- return;
-
local_irq_save(flags);
arch_spin_lock(&stack_trace_max_lock);
- /*
- * RCU may not be watching, make it see us.
- * The stack trace code uses rcu_sched.
- */
- rcu_irq_enter();
-
/* In case another CPU set the tracer_frame on us */
if (unlikely(!frame_size))
this_size -= tracer_frame;
@@ -205,7 +191,6 @@ check_stack(unsigned long ip, unsigned long *stack)
}
out:
- rcu_irq_exit();
arch_spin_unlock(&stack_trace_max_lock);
local_irq_restore(flags);
}
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index 9c4eef20301c..696afe72d3b1 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -565,7 +565,7 @@ static int perf_call_bpf_enter(struct bpf_prog *prog, struct pt_regs *regs,
struct syscall_tp_t {
unsigned long long regs;
unsigned long syscall_nr;
- unsigned long args[sys_data->nb_args];
+ unsigned long args[SYSCALL_DEFINE_MAXARGS];
} param;
int i;
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
index 2f735cbe05e8..c490f1e4313b 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
@@ -986,17 +986,21 @@ bool userns_may_setgroups(const struct user_namespace *ns)
}
/*
- * Returns true if @ns is the same namespace as or a descendant of
- * @target_ns.
+ * Returns true if @child is the same namespace or a descendant of
+ * @ancestor.
*/
+bool in_userns(const struct user_namespace *ancestor,
+ const struct user_namespace *child)
+{
+ const struct user_namespace *ns;
+ for (ns = child; ns->level > ancestor->level; ns = ns->parent)
+ ;
+ return (ns == ancestor);
+}
+
bool current_in_userns(const struct user_namespace *target_ns)
{
- struct user_namespace *ns;
- for (ns = current_user_ns(); ns; ns = ns->parent) {
- if (ns == target_ns)
- return true;
- }
- return false;
+ return in_userns(target_ns, current_user_ns());
}
static inline struct user_namespace *to_user_ns(struct ns_common *ns)
diff --git a/lib/Kconfig b/lib/Kconfig
index 40b114a11d7c..b1445b22a6de 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -192,6 +192,9 @@ config CRC8
when they need to do cyclic redundancy check according CRC8
algorithm. Module will be called crc8.
+config XXHASH
+ tristate
+
config AUDIT_GENERIC
bool
depends on AUDIT && !AUDIT_ARCH
@@ -246,6 +249,14 @@ config LZ4HC_COMPRESS
config LZ4_DECOMPRESS
tristate
+config ZSTD_COMPRESS
+ select XXHASH
+ tristate
+
+config ZSTD_DECOMPRESS
+ select XXHASH
+ tristate
+
source "lib/xz/Kconfig"
#
@@ -559,9 +570,6 @@ config ARCH_HAS_PMEM_API
config ARCH_HAS_UACCESS_FLUSHCACHE
bool
-config ARCH_HAS_MMIO_FLUSH
- bool
-
config STACKDEPOT
bool
select STACKTRACE
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index b19c491cbc4e..2689b7c50c52 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -219,7 +219,8 @@ config FRAME_WARN
range 0 8192
default 0 if KASAN
default 2048 if GCC_PLUGIN_LATENT_ENTROPY
- default 1024 if !64BIT
+ default 1280 if (!64BIT && PARISC)
+ default 1024 if (!64BIT && !PARISC)
default 2048 if 64BIT
help
Tell gcc to warn at build time for stack frames larger than this.
diff --git a/lib/Makefile b/lib/Makefile
index 469ce5e24e4f..dafa79613fb4 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -103,6 +103,7 @@ obj-$(CONFIG_CRC4) += crc4.o
obj-$(CONFIG_CRC7) += crc7.o
obj-$(CONFIG_LIBCRC32C) += libcrc32c.o
obj-$(CONFIG_CRC8) += crc8.o
+obj-$(CONFIG_XXHASH) += xxhash.o
obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
obj-$(CONFIG_842_COMPRESS) += 842/
@@ -116,6 +117,8 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
obj-$(CONFIG_LZ4_COMPRESS) += lz4/
obj-$(CONFIG_LZ4HC_COMPRESS) += lz4/
obj-$(CONFIG_LZ4_DECOMPRESS) += lz4/
+obj-$(CONFIG_ZSTD_COMPRESS) += zstd/
+obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/
obj-$(CONFIG_XZ_DEC) += xz/
obj-$(CONFIG_RAID6_PQ) += raid6/
diff --git a/lib/idr.c b/lib/idr.c
index 082778cf883e..edd9b2be1651 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -146,12 +146,12 @@ EXPORT_SYMBOL(idr_get_next_ext);
* idr_alloc() and idr_remove() (as long as the ID being removed is not
* the one being replaced!).
*
- * Returns: 0 on success. %-ENOENT indicates that @id was not found.
- * %-EINVAL indicates that @id or @ptr were not valid.
+ * Returns: the old value on success. %-ENOENT indicates that @id was not
+ * found. %-EINVAL indicates that @id or @ptr were not valid.
*/
void *idr_replace(struct idr *idr, void *ptr, int id)
{
- if (WARN_ON_ONCE(id < 0))
+ if (id < 0)
return ERR_PTR(-EINVAL);
return idr_replace_ext(idr, ptr, id);
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 52c8dd6d8e82..1c1c06ddc20a 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -687,8 +687,10 @@ EXPORT_SYMBOL(_copy_from_iter_full_nocache);
static inline bool page_copy_sane(struct page *page, size_t offset, size_t n)
{
- size_t v = n + offset;
- if (likely(n <= v && v <= (PAGE_SIZE << compound_order(page))))
+ struct page *head = compound_head(page);
+ size_t v = n + offset + page_address(page) - page_address(head);
+
+ if (likely(n <= v && v <= (PAGE_SIZE << compound_order(head))))
return true;
WARN_ON(1);
return false;
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index e590523ea476..f237a09a5862 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -294,6 +294,26 @@ static void cleanup_uevent_env(struct subprocess_info *info)
}
#endif
+static void zap_modalias_env(struct kobj_uevent_env *env)
+{
+ static const char modalias_prefix[] = "MODALIAS=";
+ int i;
+
+ for (i = 0; i < env->envp_idx;) {
+ if (strncmp(env->envp[i], modalias_prefix,
+ sizeof(modalias_prefix) - 1)) {
+ i++;
+ continue;
+ }
+
+ if (i != env->envp_idx - 1)
+ memmove(&env->envp[i], &env->envp[i + 1],
+ sizeof(env->envp[i]) * env->envp_idx - 1);
+
+ env->envp_idx--;
+ }
+}
+
/**
* kobject_uevent_env - send an uevent with environmental data
*
@@ -409,16 +429,29 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
}
}
- /*
- * Mark "add" and "remove" events in the object to ensure proper
- * events to userspace during automatic cleanup. If the object did
- * send an "add" event, "remove" will automatically generated by
- * the core, if not already done by the caller.
- */
- if (action == KOBJ_ADD)
+ switch (action) {
+ case KOBJ_ADD:
+ /*
+ * Mark "add" event so we can make sure we deliver "remove"
+ * event to userspace during automatic cleanup. If
+ * the object did send an "add" event, "remove" will
+ * automatically generated by the core, if not already done
+ * by the caller.
+ */
kobj->state_add_uevent_sent = 1;
- else if (action == KOBJ_REMOVE)
+ break;
+
+ case KOBJ_REMOVE:
kobj->state_remove_uevent_sent = 1;
+ break;
+
+ case KOBJ_UNBIND:
+ zap_modalias_env(env);
+ break;
+
+ default:
+ break;
+ }
mutex_lock(&uevent_sock_mutex);
/* we will send an event, so request a new sequence number */
diff --git a/lib/lz4/lz4_decompress.c b/lib/lz4/lz4_decompress.c
index bd3574312b82..141734d255e4 100644
--- a/lib/lz4/lz4_decompress.c
+++ b/lib/lz4/lz4_decompress.c
@@ -85,8 +85,8 @@ static FORCE_INLINE int LZ4_decompress_generic(
const BYTE * const lowLimit = lowPrefix - dictSize;
const BYTE * const dictEnd = (const BYTE *)dictStart + dictSize;
- const unsigned int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };
- const int dec64table[] = { 0, 0, 0, -1, 0, 1, 2, 3 };
+ static const unsigned int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };
+ static const int dec64table[] = { 0, 0, 0, -1, 0, 1, 2, 3 };
const int safeDecode = (endOnInput == endOnInputSize);
const int checkOffset = ((safeDecode) && (dictSize < (int)(64 * KB)));
diff --git a/lib/ratelimit.c b/lib/ratelimit.c
index 08f8043cac61..d01f47135239 100644
--- a/lib/ratelimit.c
+++ b/lib/ratelimit.c
@@ -48,7 +48,9 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
if (time_is_before_jiffies(rs->begin + rs->interval)) {
if (rs->missed) {
if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
- pr_warn("%s: %d callbacks suppressed\n", func, rs->missed);
+ printk_deferred(KERN_WARNING
+ "%s: %d callbacks suppressed\n",
+ func, rs->missed);
rs->missed = 0;
}
}
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 707ca5d677c6..ddd7dde87c3c 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -735,9 +735,9 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
* rhashtable_walk_start - Start a hash table walk
* @iter: Hash table iterator
*
- * Start a hash table walk. Note that we take the RCU lock in all
- * cases including when we return an error. So you must always call
- * rhashtable_walk_stop to clean up.
+ * Start a hash table walk at the current iterator position. Note that we take
+ * the RCU lock in all cases including when we return an error. So you must
+ * always call rhashtable_walk_stop to clean up.
*
* Returns zero if successful.
*
@@ -846,7 +846,8 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_next);
* rhashtable_walk_stop - Finish a hash table walk
* @iter: Hash table iterator
*
- * Finish a hash table walk.
+ * Finish a hash table walk. Does not reset the iterator to the start of the
+ * hash table.
*/
void rhashtable_walk_stop(struct rhashtable_iter *iter)
__releases(RCU)
diff --git a/lib/string_helpers.c b/lib/string_helpers.c
index ecaac2c0526f..29c490e5d478 100644
--- a/lib/string_helpers.c
+++ b/lib/string_helpers.c
@@ -576,7 +576,7 @@ char *kstrdup_quotable_cmdline(struct task_struct *task, gfp_t gfp)
char *buffer, *quoted;
int i, res;
- buffer = kmalloc(PAGE_SIZE, GFP_TEMPORARY);
+ buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!buffer)
return NULL;
@@ -612,7 +612,7 @@ char *kstrdup_quotable_file(struct file *file, gfp_t gfp)
return kstrdup("<unknown>", gfp);
/* We add 11 spaces for ' (deleted)' to be appended */
- temp = kmalloc(PATH_MAX + 11, GFP_TEMPORARY);
+ temp = kmalloc(PATH_MAX + 11, GFP_KERNEL);
if (!temp)
return kstrdup("<no_memory>", gfp);
diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
index 599c6713f2a2..aa1f2669bdd5 100644
--- a/lib/test_bitmap.c
+++ b/lib/test_bitmap.c
@@ -186,13 +186,13 @@ static const unsigned long exp[] __initconst = {
BITMAP_FROM_U64(0x22222222),
BITMAP_FROM_U64(0xffffffff),
BITMAP_FROM_U64(0xfffffffe),
- BITMAP_FROM_U64(0x3333333311111111),
- BITMAP_FROM_U64(0xffffffff77777777)
+ BITMAP_FROM_U64(0x3333333311111111ULL),
+ BITMAP_FROM_U64(0xffffffff77777777ULL)
};
static const unsigned long exp2[] __initconst = {
- BITMAP_FROM_U64(0x3333333311111111),
- BITMAP_FROM_U64(0xffffffff77777777)
+ BITMAP_FROM_U64(0x3333333311111111ULL),
+ BITMAP_FROM_U64(0xffffffff77777777ULL)
};
static const struct test_bitmap_parselist parselist_tests[] __initconst = {
diff --git a/lib/xxhash.c b/lib/xxhash.c
new file mode 100644
index 000000000000..aa61e2a3802f
--- /dev/null
+++ b/lib/xxhash.c
@@ -0,0 +1,500 @@
+/*
+ * xxHash - Extremely Fast Hash algorithm
+ * Copyright (C) 2012-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at:
+ * - xxHash homepage: http://cyan4973.github.io/xxHash/
+ * - xxHash source repository: https://github.com/Cyan4973/xxHash
+ */
+
+#include <asm/unaligned.h>
+#include <linux/errno.h>
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/xxhash.h>
+
+/*-*************************************
+ * Macros
+ **************************************/
+#define xxh_rotl32(x, r) ((x << r) | (x >> (32 - r)))
+#define xxh_rotl64(x, r) ((x << r) | (x >> (64 - r)))
+
+#ifdef __LITTLE_ENDIAN
+# define XXH_CPU_LITTLE_ENDIAN 1
+#else
+# define XXH_CPU_LITTLE_ENDIAN 0
+#endif
+
+/*-*************************************
+ * Constants
+ **************************************/
+static const uint32_t PRIME32_1 = 2654435761U;
+static const uint32_t PRIME32_2 = 2246822519U;
+static const uint32_t PRIME32_3 = 3266489917U;
+static const uint32_t PRIME32_4 = 668265263U;
+static const uint32_t PRIME32_5 = 374761393U;
+
+static const uint64_t PRIME64_1 = 11400714785074694791ULL;
+static const uint64_t PRIME64_2 = 14029467366897019727ULL;
+static const uint64_t PRIME64_3 = 1609587929392839161ULL;
+static const uint64_t PRIME64_4 = 9650029242287828579ULL;
+static const uint64_t PRIME64_5 = 2870177450012600261ULL;
+
+/*-**************************
+ * Utils
+ ***************************/
+void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src)
+{
+ memcpy(dst, src, sizeof(*dst));
+}
+EXPORT_SYMBOL(xxh32_copy_state);
+
+void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src)
+{
+ memcpy(dst, src, sizeof(*dst));
+}
+EXPORT_SYMBOL(xxh64_copy_state);
+
+/*-***************************
+ * Simple Hash Functions
+ ****************************/
+static uint32_t xxh32_round(uint32_t seed, const uint32_t input)
+{
+ seed += input * PRIME32_2;
+ seed = xxh_rotl32(seed, 13);
+ seed *= PRIME32_1;
+ return seed;
+}
+
+uint32_t xxh32(const void *input, const size_t len, const uint32_t seed)
+{
+ const uint8_t *p = (const uint8_t *)input;
+ const uint8_t *b_end = p + len;
+ uint32_t h32;
+
+ if (len >= 16) {
+ const uint8_t *const limit = b_end - 16;
+ uint32_t v1 = seed + PRIME32_1 + PRIME32_2;
+ uint32_t v2 = seed + PRIME32_2;
+ uint32_t v3 = seed + 0;
+ uint32_t v4 = seed - PRIME32_1;
+
+ do {
+ v1 = xxh32_round(v1, get_unaligned_le32(p));
+ p += 4;
+ v2 = xxh32_round(v2, get_unaligned_le32(p));
+ p += 4;
+ v3 = xxh32_round(v3, get_unaligned_le32(p));
+ p += 4;
+ v4 = xxh32_round(v4, get_unaligned_le32(p));
+ p += 4;
+ } while (p <= limit);
+
+ h32 = xxh_rotl32(v1, 1) + xxh_rotl32(v2, 7) +
+ xxh_rotl32(v3, 12) + xxh_rotl32(v4, 18);
+ } else {
+ h32 = seed + PRIME32_5;
+ }
+
+ h32 += (uint32_t)len;
+
+ while (p + 4 <= b_end) {
+ h32 += get_unaligned_le32(p) * PRIME32_3;
+ h32 = xxh_rotl32(h32, 17) * PRIME32_4;
+ p += 4;
+ }
+
+ while (p < b_end) {
+ h32 += (*p) * PRIME32_5;
+ h32 = xxh_rotl32(h32, 11) * PRIME32_1;
+ p++;
+ }
+
+ h32 ^= h32 >> 15;
+ h32 *= PRIME32_2;
+ h32 ^= h32 >> 13;
+ h32 *= PRIME32_3;
+ h32 ^= h32 >> 16;
+
+ return h32;
+}
+EXPORT_SYMBOL(xxh32);
+
+static uint64_t xxh64_round(uint64_t acc, const uint64_t input)
+{
+ acc += input * PRIME64_2;
+ acc = xxh_rotl64(acc, 31);
+ acc *= PRIME64_1;
+ return acc;
+}
+
+static uint64_t xxh64_merge_round(uint64_t acc, uint64_t val)
+{
+ val = xxh64_round(0, val);
+ acc ^= val;
+ acc = acc * PRIME64_1 + PRIME64_4;
+ return acc;
+}
+
+uint64_t xxh64(const void *input, const size_t len, const uint64_t seed)
+{
+ const uint8_t *p = (const uint8_t *)input;
+ const uint8_t *const b_end = p + len;
+ uint64_t h64;
+
+ if (len >= 32) {
+ const uint8_t *const limit = b_end - 32;
+ uint64_t v1 = seed + PRIME64_1 + PRIME64_2;
+ uint64_t v2 = seed + PRIME64_2;
+ uint64_t v3 = seed + 0;
+ uint64_t v4 = seed - PRIME64_1;
+
+ do {
+ v1 = xxh64_round(v1, get_unaligned_le64(p));
+ p += 8;
+ v2 = xxh64_round(v2, get_unaligned_le64(p));
+ p += 8;
+ v3 = xxh64_round(v3, get_unaligned_le64(p));
+ p += 8;
+ v4 = xxh64_round(v4, get_unaligned_le64(p));
+ p += 8;
+ } while (p <= limit);
+
+ h64 = xxh_rotl64(v1, 1) + xxh_rotl64(v2, 7) +
+ xxh_rotl64(v3, 12) + xxh_rotl64(v4, 18);
+ h64 = xxh64_merge_round(h64, v1);
+ h64 = xxh64_merge_round(h64, v2);
+ h64 = xxh64_merge_round(h64, v3);
+ h64 = xxh64_merge_round(h64, v4);
+
+ } else {
+ h64 = seed + PRIME64_5;
+ }
+
+ h64 += (uint64_t)len;
+
+ while (p + 8 <= b_end) {
+ const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
+
+ h64 ^= k1;
+ h64 = xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
+ p += 8;
+ }
+
+ if (p + 4 <= b_end) {
+ h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
+ h64 = xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
+ p += 4;
+ }
+
+ while (p < b_end) {
+ h64 ^= (*p) * PRIME64_5;
+ h64 = xxh_rotl64(h64, 11) * PRIME64_1;
+ p++;
+ }
+
+ h64 ^= h64 >> 33;
+ h64 *= PRIME64_2;
+ h64 ^= h64 >> 29;
+ h64 *= PRIME64_3;
+ h64 ^= h64 >> 32;
+
+ return h64;
+}
+EXPORT_SYMBOL(xxh64);
+
+/*-**************************************************
+ * Advanced Hash Functions
+ ***************************************************/
+void xxh32_reset(struct xxh32_state *statePtr, const uint32_t seed)
+{
+ /* use a local state for memcpy() to avoid strict-aliasing warnings */
+ struct xxh32_state state;
+
+ memset(&state, 0, sizeof(state));
+ state.v1 = seed + PRIME32_1 + PRIME32_2;
+ state.v2 = seed + PRIME32_2;
+ state.v3 = seed + 0;
+ state.v4 = seed - PRIME32_1;
+ memcpy(statePtr, &state, sizeof(state));
+}
+EXPORT_SYMBOL(xxh32_reset);
+
+void xxh64_reset(struct xxh64_state *statePtr, const uint64_t seed)
+{
+ /* use a local state for memcpy() to avoid strict-aliasing warnings */
+ struct xxh64_state state;
+
+ memset(&state, 0, sizeof(state));
+ state.v1 = seed + PRIME64_1 + PRIME64_2;
+ state.v2 = seed + PRIME64_2;
+ state.v3 = seed + 0;
+ state.v4 = seed - PRIME64_1;
+ memcpy(statePtr, &state, sizeof(state));
+}
+EXPORT_SYMBOL(xxh64_reset);
+
+int xxh32_update(struct xxh32_state *state, const void *input, const size_t len)
+{
+ const uint8_t *p = (const uint8_t *)input;
+ const uint8_t *const b_end = p + len;
+
+ if (input == NULL)
+ return -EINVAL;
+
+ state->total_len_32 += (uint32_t)len;
+ state->large_len |= (len >= 16) | (state->total_len_32 >= 16);
+
+ if (state->memsize + len < 16) { /* fill in tmp buffer */
+ memcpy((uint8_t *)(state->mem32) + state->memsize, input, len);
+ state->memsize += (uint32_t)len;
+ return 0;
+ }
+
+ if (state->memsize) { /* some data left from previous update */
+ const uint32_t *p32 = state->mem32;
+
+ memcpy((uint8_t *)(state->mem32) + state->memsize, input,
+ 16 - state->memsize);
+
+ state->v1 = xxh32_round(state->v1, get_unaligned_le32(p32));
+ p32++;
+ state->v2 = xxh32_round(state->v2, get_unaligned_le32(p32));
+ p32++;
+ state->v3 = xxh32_round(state->v3, get_unaligned_le32(p32));
+ p32++;
+ state->v4 = xxh32_round(state->v4, get_unaligned_le32(p32));
+ p32++;
+
+ p += 16-state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p <= b_end - 16) {
+ const uint8_t *const limit = b_end - 16;
+ uint32_t v1 = state->v1;
+ uint32_t v2 = state->v2;
+ uint32_t v3 = state->v3;
+ uint32_t v4 = state->v4;
+
+ do {
+ v1 = xxh32_round(v1, get_unaligned_le32(p));
+ p += 4;
+ v2 = xxh32_round(v2, get_unaligned_le32(p));
+ p += 4;
+ v3 = xxh32_round(v3, get_unaligned_le32(p));
+ p += 4;
+ v4 = xxh32_round(v4, get_unaligned_le32(p));
+ p += 4;
+ } while (p <= limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < b_end) {
+ memcpy(state->mem32, p, (size_t)(b_end-p));
+ state->memsize = (uint32_t)(b_end-p);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(xxh32_update);
+
+uint32_t xxh32_digest(const struct xxh32_state *state)
+{
+ const uint8_t *p = (const uint8_t *)state->mem32;
+ const uint8_t *const b_end = (const uint8_t *)(state->mem32) +
+ state->memsize;
+ uint32_t h32;
+
+ if (state->large_len) {
+ h32 = xxh_rotl32(state->v1, 1) + xxh_rotl32(state->v2, 7) +
+ xxh_rotl32(state->v3, 12) + xxh_rotl32(state->v4, 18);
+ } else {
+ h32 = state->v3 /* == seed */ + PRIME32_5;
+ }
+
+ h32 += state->total_len_32;
+
+ while (p + 4 <= b_end) {
+ h32 += get_unaligned_le32(p) * PRIME32_3;
+ h32 = xxh_rotl32(h32, 17) * PRIME32_4;
+ p += 4;
+ }
+
+ while (p < b_end) {
+ h32 += (*p) * PRIME32_5;
+ h32 = xxh_rotl32(h32, 11) * PRIME32_1;
+ p++;
+ }
+
+ h32 ^= h32 >> 15;
+ h32 *= PRIME32_2;
+ h32 ^= h32 >> 13;
+ h32 *= PRIME32_3;
+ h32 ^= h32 >> 16;
+
+ return h32;
+}
+EXPORT_SYMBOL(xxh32_digest);
+
+int xxh64_update(struct xxh64_state *state, const void *input, const size_t len)
+{
+ const uint8_t *p = (const uint8_t *)input;
+ const uint8_t *const b_end = p + len;
+
+ if (input == NULL)
+ return -EINVAL;
+
+ state->total_len += len;
+
+ if (state->memsize + len < 32) { /* fill in tmp buffer */
+ memcpy(((uint8_t *)state->mem64) + state->memsize, input, len);
+ state->memsize += (uint32_t)len;
+ return 0;
+ }
+
+ if (state->memsize) { /* tmp buffer is full */
+ uint64_t *p64 = state->mem64;
+
+ memcpy(((uint8_t *)p64) + state->memsize, input,
+ 32 - state->memsize);
+
+ state->v1 = xxh64_round(state->v1, get_unaligned_le64(p64));
+ p64++;
+ state->v2 = xxh64_round(state->v2, get_unaligned_le64(p64));
+ p64++;
+ state->v3 = xxh64_round(state->v3, get_unaligned_le64(p64));
+ p64++;
+ state->v4 = xxh64_round(state->v4, get_unaligned_le64(p64));
+
+ p += 32 - state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p + 32 <= b_end) {
+ const uint8_t *const limit = b_end - 32;
+ uint64_t v1 = state->v1;
+ uint64_t v2 = state->v2;
+ uint64_t v3 = state->v3;
+ uint64_t v4 = state->v4;
+
+ do {
+ v1 = xxh64_round(v1, get_unaligned_le64(p));
+ p += 8;
+ v2 = xxh64_round(v2, get_unaligned_le64(p));
+ p += 8;
+ v3 = xxh64_round(v3, get_unaligned_le64(p));
+ p += 8;
+ v4 = xxh64_round(v4, get_unaligned_le64(p));
+ p += 8;
+ } while (p <= limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < b_end) {
+ memcpy(state->mem64, p, (size_t)(b_end-p));
+ state->memsize = (uint32_t)(b_end - p);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(xxh64_update);
+
+uint64_t xxh64_digest(const struct xxh64_state *state)
+{
+ const uint8_t *p = (const uint8_t *)state->mem64;
+ const uint8_t *const b_end = (const uint8_t *)state->mem64 +
+ state->memsize;
+ uint64_t h64;
+
+ if (state->total_len >= 32) {
+ const uint64_t v1 = state->v1;
+ const uint64_t v2 = state->v2;
+ const uint64_t v3 = state->v3;
+ const uint64_t v4 = state->v4;
+
+ h64 = xxh_rotl64(v1, 1) + xxh_rotl64(v2, 7) +
+ xxh_rotl64(v3, 12) + xxh_rotl64(v4, 18);
+ h64 = xxh64_merge_round(h64, v1);
+ h64 = xxh64_merge_round(h64, v2);
+ h64 = xxh64_merge_round(h64, v3);
+ h64 = xxh64_merge_round(h64, v4);
+ } else {
+ h64 = state->v3 + PRIME64_5;
+ }
+
+ h64 += (uint64_t)state->total_len;
+
+ while (p + 8 <= b_end) {
+ const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
+
+ h64 ^= k1;
+ h64 = xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
+ p += 8;
+ }
+
+ if (p + 4 <= b_end) {
+ h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
+ h64 = xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
+ p += 4;
+ }
+
+ while (p < b_end) {
+ h64 ^= (*p) * PRIME64_5;
+ h64 = xxh_rotl64(h64, 11) * PRIME64_1;
+ p++;
+ }
+
+ h64 ^= h64 >> 33;
+ h64 *= PRIME64_2;
+ h64 ^= h64 >> 29;
+ h64 *= PRIME64_3;
+ h64 ^= h64 >> 32;
+
+ return h64;
+}
+EXPORT_SYMBOL(xxh64_digest);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("xxHash");
diff --git a/lib/zstd/Makefile b/lib/zstd/Makefile
new file mode 100644
index 000000000000..dd0a359c135b
--- /dev/null
+++ b/lib/zstd/Makefile
@@ -0,0 +1,18 @@
+obj-$(CONFIG_ZSTD_COMPRESS) += zstd_compress.o
+obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd_decompress.o
+
+ccflags-y += -O3
+
+# Object files unique to zstd_compress and zstd_decompress
+zstd_compress-y := fse_compress.o huf_compress.o compress.o
+zstd_decompress-y := huf_decompress.o decompress.o
+
+# These object files are shared between the modules.
+# Always add them to zstd_compress.
+# Unless both zstd_compress and zstd_decompress are built in
+# then also add them to zstd_decompress.
+zstd_compress-y += entropy_common.o fse_decompress.o zstd_common.o
+
+ifneq ($(CONFIG_ZSTD_COMPRESS)$(CONFIG_ZSTD_DECOMPRESS),yy)
+ zstd_decompress-y += entropy_common.o fse_decompress.o zstd_common.o
+endif
diff --git a/lib/zstd/bitstream.h b/lib/zstd/bitstream.h
new file mode 100644
index 000000000000..a826b99e1d63
--- /dev/null
+++ b/lib/zstd/bitstream.h
@@ -0,0 +1,374 @@
+/*
+ * bitstream
+ * Part of FSE library
+ * header file (to include)
+ * Copyright (C) 2013-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+#ifndef BITSTREAM_H_MODULE
+#define BITSTREAM_H_MODULE
+
+/*
+* This API consists of small unitary functions, which must be inlined for best performance.
+* Since link-time-optimization is not available for all compilers,
+* these functions are defined into a .h to be included.
+*/
+
+/*-****************************************
+* Dependencies
+******************************************/
+#include "error_private.h" /* error codes and messages */
+#include "mem.h" /* unaligned access routines */
+
+/*=========================================
+* Target specific
+=========================================*/
+#define STREAM_ACCUMULATOR_MIN_32 25
+#define STREAM_ACCUMULATOR_MIN_64 57
+#define STREAM_ACCUMULATOR_MIN ((U32)(ZSTD_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64))
+
+/*-******************************************
+* bitStream encoding API (write forward)
+********************************************/
+/* bitStream can mix input from multiple sources.
+* A critical property of these streams is that they encode and decode in **reverse** direction.
+* So the first bit sequence you add will be the last to be read, like a LIFO stack.
+*/
+typedef struct {
+ size_t bitContainer;
+ int bitPos;
+ char *startPtr;
+ char *ptr;
+ char *endPtr;
+} BIT_CStream_t;
+
+ZSTD_STATIC size_t BIT_initCStream(BIT_CStream_t *bitC, void *dstBuffer, size_t dstCapacity);
+ZSTD_STATIC void BIT_addBits(BIT_CStream_t *bitC, size_t value, unsigned nbBits);
+ZSTD_STATIC void BIT_flushBits(BIT_CStream_t *bitC);
+ZSTD_STATIC size_t BIT_closeCStream(BIT_CStream_t *bitC);
+
+/* Start with initCStream, providing the size of buffer to write into.
+* bitStream will never write outside of this buffer.
+* `dstCapacity` must be >= sizeof(bitD->bitContainer), otherwise @return will be an error code.
+*
+* bits are first added to a local register.
+* Local register is size_t, hence 64-bits on 64-bits systems, or 32-bits on 32-bits systems.
+* Writing data into memory is an explicit operation, performed by the flushBits function.
+* Hence keep track how many bits are potentially stored into local register to avoid register overflow.
+* After a flushBits, a maximum of 7 bits might still be stored into local register.
+*
+* Avoid storing elements of more than 24 bits if you want compatibility with 32-bits bitstream readers.
+*
+* Last operation is to close the bitStream.
+* The function returns the final size of CStream in bytes.
+* If data couldn't fit into `dstBuffer`, it will return a 0 ( == not storable)
+*/
+
+/*-********************************************
+* bitStream decoding API (read backward)
+**********************************************/
+typedef struct {
+ size_t bitContainer;
+ unsigned bitsConsumed;
+ const char *ptr;
+ const char *start;
+} BIT_DStream_t;
+
+typedef enum {
+ BIT_DStream_unfinished = 0,
+ BIT_DStream_endOfBuffer = 1,
+ BIT_DStream_completed = 2,
+ BIT_DStream_overflow = 3
+} BIT_DStream_status; /* result of BIT_reloadDStream() */
+/* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
+
+ZSTD_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, size_t srcSize);
+ZSTD_STATIC size_t BIT_readBits(BIT_DStream_t *bitD, unsigned nbBits);
+ZSTD_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t *bitD);
+ZSTD_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t *bitD);
+
+/* Start by invoking BIT_initDStream().
+* A chunk of the bitStream is then stored into a local register.
+* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
+* You can then retrieve bitFields stored into the local register, **in reverse order**.
+* Local register is explicitly reloaded from memory by the BIT_reloadDStream() method.
+* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BIT_DStream_unfinished.
+* Otherwise, it can be less than that, so proceed accordingly.
+* Checking if DStream has reached its end can be performed with BIT_endOfDStream().
+*/
+
+/*-****************************************
+* unsafe API
+******************************************/
+ZSTD_STATIC void BIT_addBitsFast(BIT_CStream_t *bitC, size_t value, unsigned nbBits);
+/* faster, but works only if value is "clean", meaning all high bits above nbBits are 0 */
+
+ZSTD_STATIC void BIT_flushBitsFast(BIT_CStream_t *bitC);
+/* unsafe version; does not check buffer overflow */
+
+ZSTD_STATIC size_t BIT_readBitsFast(BIT_DStream_t *bitD, unsigned nbBits);
+/* faster, but works only if nbBits >= 1 */
+
+/*-**************************************************************
+* Internal functions
+****************************************************************/
+ZSTD_STATIC unsigned BIT_highbit32(register U32 val) { return 31 - __builtin_clz(val); }
+
+/*===== Local Constants =====*/
+static const unsigned BIT_mask[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF,
+ 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF,
+ 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF}; /* up to 26 bits */
+
+/*-**************************************************************
+* bitStream encoding
+****************************************************************/
+/*! BIT_initCStream() :
+ * `dstCapacity` must be > sizeof(void*)
+ * @return : 0 if success,
+ otherwise an error code (can be tested using ERR_isError() ) */
+ZSTD_STATIC size_t BIT_initCStream(BIT_CStream_t *bitC, void *startPtr, size_t dstCapacity)
+{
+ bitC->bitContainer = 0;
+ bitC->bitPos = 0;
+ bitC->startPtr = (char *)startPtr;
+ bitC->ptr = bitC->startPtr;
+ bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->ptr);
+ if (dstCapacity <= sizeof(bitC->ptr))
+ return ERROR(dstSize_tooSmall);
+ return 0;
+}
+
+/*! BIT_addBits() :
+ can add up to 26 bits into `bitC`.
+ Does not check for register overflow ! */
+ZSTD_STATIC void BIT_addBits(BIT_CStream_t *bitC, size_t value, unsigned nbBits)
+{
+ bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos;
+ bitC->bitPos += nbBits;
+}
+
+/*! BIT_addBitsFast() :
+ * works only if `value` is _clean_, meaning all high bits above nbBits are 0 */
+ZSTD_STATIC void BIT_addBitsFast(BIT_CStream_t *bitC, size_t value, unsigned nbBits)
+{
+ bitC->bitContainer |= value << bitC->bitPos;
+ bitC->bitPos += nbBits;
+}
+
+/*! BIT_flushBitsFast() :
+ * unsafe version; does not check buffer overflow */
+ZSTD_STATIC void BIT_flushBitsFast(BIT_CStream_t *bitC)
+{
+ size_t const nbBytes = bitC->bitPos >> 3;
+ ZSTD_writeLEST(bitC->ptr, bitC->bitContainer);
+ bitC->ptr += nbBytes;
+ bitC->bitPos &= 7;
+ bitC->bitContainer >>= nbBytes * 8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
+}
+
+/*! BIT_flushBits() :
+ * safe version; check for buffer overflow, and prevents it.
+ * note : does not signal buffer overflow. This will be revealed later on using BIT_closeCStream() */
+ZSTD_STATIC void BIT_flushBits(BIT_CStream_t *bitC)
+{
+ size_t const nbBytes = bitC->bitPos >> 3;
+ ZSTD_writeLEST(bitC->ptr, bitC->bitContainer);
+ bitC->ptr += nbBytes;
+ if (bitC->ptr > bitC->endPtr)
+ bitC->ptr = bitC->endPtr;
+ bitC->bitPos &= 7;
+ bitC->bitContainer >>= nbBytes * 8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
+}
+
+/*! BIT_closeCStream() :
+ * @return : size of CStream, in bytes,
+ or 0 if it could not fit into dstBuffer */
+ZSTD_STATIC size_t BIT_closeCStream(BIT_CStream_t *bitC)
+{
+ BIT_addBitsFast(bitC, 1, 1); /* endMark */
+ BIT_flushBits(bitC);
+
+ if (bitC->ptr >= bitC->endPtr)
+ return 0; /* doesn't fit within authorized budget : cancel */
+
+ return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0);
+}
+
+/*-********************************************************
+* bitStream decoding
+**********************************************************/
+/*! BIT_initDStream() :
+* Initialize a BIT_DStream_t.
+* `bitD` : a pointer to an already allocated BIT_DStream_t structure.
+* `srcSize` must be the *exact* size of the bitStream, in bytes.
+* @return : size of stream (== srcSize) or an errorCode if a problem is detected
+*/
+ZSTD_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, size_t srcSize)
+{
+ if (srcSize < 1) {
+ memset(bitD, 0, sizeof(*bitD));
+ return ERROR(srcSize_wrong);
+ }
+
+ if (srcSize >= sizeof(bitD->bitContainer)) { /* normal case */
+ bitD->start = (const char *)srcBuffer;
+ bitD->ptr = (const char *)srcBuffer + srcSize - sizeof(bitD->bitContainer);
+ bitD->bitContainer = ZSTD_readLEST(bitD->ptr);
+ {
+ BYTE const lastByte = ((const BYTE *)srcBuffer)[srcSize - 1];
+ bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */
+ if (lastByte == 0)
+ return ERROR(GENERIC); /* endMark not present */
+ }
+ } else {
+ bitD->start = (const char *)srcBuffer;
+ bitD->ptr = bitD->start;
+ bitD->bitContainer = *(const BYTE *)(bitD->start);
+ switch (srcSize) {
+ case 7: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[6]) << (sizeof(bitD->bitContainer) * 8 - 16);
+ case 6: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[5]) << (sizeof(bitD->bitContainer) * 8 - 24);
+ case 5: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[4]) << (sizeof(bitD->bitContainer) * 8 - 32);
+ case 4: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[3]) << 24;
+ case 3: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[2]) << 16;
+ case 2: bitD->bitContainer += (size_t)(((const BYTE *)(srcBuffer))[1]) << 8;
+ default:;
+ }
+ {
+ BYTE const lastByte = ((const BYTE *)srcBuffer)[srcSize - 1];
+ bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0;
+ if (lastByte == 0)
+ return ERROR(GENERIC); /* endMark not present */
+ }
+ bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize) * 8;
+ }
+
+ return srcSize;
+}
+
+ZSTD_STATIC size_t BIT_getUpperBits(size_t bitContainer, U32 const start) { return bitContainer >> start; }
+
+ZSTD_STATIC size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits) { return (bitContainer >> start) & BIT_mask[nbBits]; }
+
+ZSTD_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) { return bitContainer & BIT_mask[nbBits]; }
+
+/*! BIT_lookBits() :
+ * Provides next n bits from local register.
+ * local register is not modified.
+ * On 32-bits, maxNbBits==24.
+ * On 64-bits, maxNbBits==56.
+ * @return : value extracted
+ */
+ZSTD_STATIC size_t BIT_lookBits(const BIT_DStream_t *bitD, U32 nbBits)
+{
+ U32 const bitMask = sizeof(bitD->bitContainer) * 8 - 1;
+ return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask - nbBits) & bitMask);
+}
+
+/*! BIT_lookBitsFast() :
+* unsafe version; only works only if nbBits >= 1 */
+ZSTD_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t *bitD, U32 nbBits)
+{
+ U32 const bitMask = sizeof(bitD->bitContainer) * 8 - 1;
+ return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask + 1) - nbBits) & bitMask);
+}
+
+ZSTD_STATIC void BIT_skipBits(BIT_DStream_t *bitD, U32 nbBits) { bitD->bitsConsumed += nbBits; }
+
+/*! BIT_readBits() :
+ * Read (consume) next n bits from local register and update.
+ * Pay attention to not read more than nbBits contained into local register.
+ * @return : extracted value.
+ */
+ZSTD_STATIC size_t BIT_readBits(BIT_DStream_t *bitD, U32 nbBits)
+{
+ size_t const value = BIT_lookBits(bitD, nbBits);
+ BIT_skipBits(bitD, nbBits);
+ return value;
+}
+
+/*! BIT_readBitsFast() :
+* unsafe version; only works only if nbBits >= 1 */
+ZSTD_STATIC size_t BIT_readBitsFast(BIT_DStream_t *bitD, U32 nbBits)
+{
+ size_t const value = BIT_lookBitsFast(bitD, nbBits);
+ BIT_skipBits(bitD, nbBits);
+ return value;
+}
+
+/*! BIT_reloadDStream() :
+* Refill `bitD` from buffer previously set in BIT_initDStream() .
+* This function is safe, it guarantees it will not read beyond src buffer.
+* @return : status of `BIT_DStream_t` internal register.
+ if status == BIT_DStream_unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */
+ZSTD_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t *bitD)
+{
+ if (bitD->bitsConsumed > (sizeof(bitD->bitContainer) * 8)) /* should not happen => corruption detected */
+ return BIT_DStream_overflow;
+
+ if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
+ bitD->ptr -= bitD->bitsConsumed >> 3;
+ bitD->bitsConsumed &= 7;
+ bitD->bitContainer = ZSTD_readLEST(bitD->ptr);
+ return BIT_DStream_unfinished;
+ }
+ if (bitD->ptr == bitD->start) {
+ if (bitD->bitsConsumed < sizeof(bitD->bitContainer) * 8)
+ return BIT_DStream_endOfBuffer;
+ return BIT_DStream_completed;
+ }
+ {
+ U32 nbBytes = bitD->bitsConsumed >> 3;
+ BIT_DStream_status result = BIT_DStream_unfinished;
+ if (bitD->ptr - nbBytes < bitD->start) {
+ nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
+ result = BIT_DStream_endOfBuffer;
+ }
+ bitD->ptr -= nbBytes;
+ bitD->bitsConsumed -= nbBytes * 8;
+ bitD->bitContainer = ZSTD_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
+ return result;
+ }
+}
+
+/*! BIT_endOfDStream() :
+* @return Tells if DStream has exactly reached its end (all bits consumed).
+*/
+ZSTD_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t *DStream)
+{
+ return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer) * 8));
+}
+
+#endif /* BITSTREAM_H_MODULE */
diff --git a/lib/zstd/compress.c b/lib/zstd/compress.c
new file mode 100644
index 000000000000..f9166cf4f7a9
--- /dev/null
+++ b/lib/zstd/compress.c
@@ -0,0 +1,3484 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+/*-*************************************
+* Dependencies
+***************************************/
+#include "fse.h"
+#include "huf.h"
+#include "mem.h"
+#include "zstd_internal.h" /* includes zstd.h */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h> /* memset */
+
+/*-*************************************
+* Constants
+***************************************/
+static const U32 g_searchStrength = 8; /* control skip over incompressible data */
+#define HASH_READ_SIZE 8
+typedef enum { ZSTDcs_created = 0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e;
+
+/*-*************************************
+* Helper functions
+***************************************/
+size_t ZSTD_compressBound(size_t srcSize) { return FSE_compressBound(srcSize) + 12; }
+
+/*-*************************************
+* Sequence storage
+***************************************/
+static void ZSTD_resetSeqStore(seqStore_t *ssPtr)
+{
+ ssPtr->lit = ssPtr->litStart;
+ ssPtr->sequences = ssPtr->sequencesStart;
+ ssPtr->longLengthID = 0;
+}
+
+/*-*************************************
+* Context memory management
+***************************************/
+struct ZSTD_CCtx_s {
+ const BYTE *nextSrc; /* next block here to continue on curr prefix */
+ const BYTE *base; /* All regular indexes relative to this position */
+ const BYTE *dictBase; /* extDict indexes relative to this position */
+ U32 dictLimit; /* below that point, need extDict */
+ U32 lowLimit; /* below that point, no more data */
+ U32 nextToUpdate; /* index from which to continue dictionary update */
+ U32 nextToUpdate3; /* index from which to continue dictionary update */
+ U32 hashLog3; /* dispatch table : larger == faster, more memory */
+ U32 loadedDictEnd; /* index of end of dictionary */
+ U32 forceWindow; /* force back-references to respect limit of 1<<wLog, even for dictionary */
+ U32 forceRawDict; /* Force loading dictionary in "content-only" mode (no header analysis) */
+ ZSTD_compressionStage_e stage;
+ U32 rep[ZSTD_REP_NUM];
+ U32 repToConfirm[ZSTD_REP_NUM];
+ U32 dictID;
+ ZSTD_parameters params;
+ void *workSpace;
+ size_t workSpaceSize;
+ size_t blockSize;
+ U64 frameContentSize;
+ struct xxh64_state xxhState;
+ ZSTD_customMem customMem;
+
+ seqStore_t seqStore; /* sequences storage ptrs */
+ U32 *hashTable;
+ U32 *hashTable3;
+ U32 *chainTable;
+ HUF_CElt *hufTable;
+ U32 flagStaticTables;
+ HUF_repeat flagStaticHufTable;
+ FSE_CTable offcodeCTable[FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)];
+ FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)];
+ FSE_CTable litlengthCTable[FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)];
+ unsigned tmpCounters[HUF_COMPRESS_WORKSPACE_SIZE_U32];
+};
+
+size_t ZSTD_CCtxWorkspaceBound(ZSTD_compressionParameters cParams)
+{
+ size_t const blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, (size_t)1 << cParams.windowLog);
+ U32 const divider = (cParams.searchLength == 3) ? 3 : 4;
+ size_t const maxNbSeq = blockSize / divider;
+ size_t const tokenSpace = blockSize + 11 * maxNbSeq;
+ size_t const chainSize = (cParams.strategy == ZSTD_fast) ? 0 : (1 << cParams.chainLog);
+ size_t const hSize = ((size_t)1) << cParams.hashLog;
+ U32 const hashLog3 = (cParams.searchLength > 3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, cParams.windowLog);
+ size_t const h3Size = ((size_t)1) << hashLog3;
+ size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
+ size_t const optSpace =
+ ((MaxML + 1) + (MaxLL + 1) + (MaxOff + 1) + (1 << Litbits)) * sizeof(U32) + (ZSTD_OPT_NUM + 1) * (sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
+ size_t const workspaceSize = tableSpace + (256 * sizeof(U32)) /* huffTable */ + tokenSpace +
+ (((cParams.strategy == ZSTD_btopt) || (cParams.strategy == ZSTD_btopt2)) ? optSpace : 0);
+
+ return ZSTD_ALIGN(sizeof(ZSTD_stack)) + ZSTD_ALIGN(sizeof(ZSTD_CCtx)) + ZSTD_ALIGN(workspaceSize);
+}
+
+static ZSTD_CCtx *ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
+{
+ ZSTD_CCtx *cctx;
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+ cctx = (ZSTD_CCtx *)ZSTD_malloc(sizeof(ZSTD_CCtx), customMem);
+ if (!cctx)
+ return NULL;
+ memset(cctx, 0, sizeof(ZSTD_CCtx));
+ cctx->customMem = customMem;
+ return cctx;
+}
+
+ZSTD_CCtx *ZSTD_initCCtx(void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ ZSTD_CCtx *cctx = ZSTD_createCCtx_advanced(stackMem);
+ if (cctx) {
+ cctx->workSpace = ZSTD_stackAllocAll(cctx->customMem.opaque, &cctx->workSpaceSize);
+ }
+ return cctx;
+}
+
+size_t ZSTD_freeCCtx(ZSTD_CCtx *cctx)
+{
+ if (cctx == NULL)
+ return 0; /* support free on NULL */
+ ZSTD_free(cctx->workSpace, cctx->customMem);
+ ZSTD_free(cctx, cctx->customMem);
+ return 0; /* reserved as a potential error code in the future */
+}
+
+const seqStore_t *ZSTD_getSeqStore(const ZSTD_CCtx *ctx) /* hidden interface */ { return &(ctx->seqStore); }
+
+static ZSTD_parameters ZSTD_getParamsFromCCtx(const ZSTD_CCtx *cctx) { return cctx->params; }
+
+/** ZSTD_checkParams() :
+ ensure param values remain within authorized range.
+ @return : 0, or an error code if one value is beyond authorized range */
+size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
+{
+#define CLAMPCHECK(val, min, max) \
+ { \
+ if ((val < min) | (val > max)) \
+ return ERROR(compressionParameter_unsupported); \
+ }
+ CLAMPCHECK(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
+ CLAMPCHECK(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
+ CLAMPCHECK(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
+ CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
+ CLAMPCHECK(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
+ CLAMPCHECK(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
+ if ((U32)(cParams.strategy) > (U32)ZSTD_btopt2)
+ return ERROR(compressionParameter_unsupported);
+ return 0;
+}
+
+/** ZSTD_cycleLog() :
+ * condition for correct operation : hashLog > 1 */
+static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
+{
+ U32 const btScale = ((U32)strat >= (U32)ZSTD_btlazy2);
+ return hashLog - btScale;
+}
+
+/** ZSTD_adjustCParams() :
+ optimize `cPar` for a given input (`srcSize` and `dictSize`).
+ mostly downsizing to reduce memory consumption and initialization.
+ Both `srcSize` and `dictSize` are optional (use 0 if unknown),
+ but if both are 0, no optimization can be done.
+ Note : cPar is considered validated at this stage. Use ZSTD_checkParams() to ensure that. */
+ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
+{
+ if (srcSize + dictSize == 0)
+ return cPar; /* no size information available : no adjustment */
+
+ /* resize params, to use less memory when necessary */
+ {
+ U32 const minSrcSize = (srcSize == 0) ? 500 : 0;
+ U64 const rSize = srcSize + dictSize + minSrcSize;
+ if (rSize < ((U64)1 << ZSTD_WINDOWLOG_MAX)) {
+ U32 const srcLog = MAX(ZSTD_HASHLOG_MIN, ZSTD_highbit32((U32)(rSize)-1) + 1);
+ if (cPar.windowLog > srcLog)
+ cPar.windowLog = srcLog;
+ }
+ }
+ if (cPar.hashLog > cPar.windowLog)
+ cPar.hashLog = cPar.windowLog;
+ {
+ U32 const cycleLog = ZSTD_cycleLog(cPar.chainLog, cPar.strategy);
+ if (cycleLog > cPar.windowLog)
+ cPar.chainLog -= (cycleLog - cPar.windowLog);
+ }
+
+ if (cPar.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN)
+ cPar.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* required for frame header */
+
+ return cPar;
+}
+
+static U32 ZSTD_equivalentParams(ZSTD_parameters param1, ZSTD_parameters param2)
+{
+ return (param1.cParams.hashLog == param2.cParams.hashLog) & (param1.cParams.chainLog == param2.cParams.chainLog) &
+ (param1.cParams.strategy == param2.cParams.strategy) & ((param1.cParams.searchLength == 3) == (param2.cParams.searchLength == 3));
+}
+
+/*! ZSTD_continueCCtx() :
+ reuse CCtx without reset (note : requires no dictionary) */
+static size_t ZSTD_continueCCtx(ZSTD_CCtx *cctx, ZSTD_parameters params, U64 frameContentSize)
+{
+ U32 const end = (U32)(cctx->nextSrc - cctx->base);
+ cctx->params = params;
+ cctx->frameContentSize = frameContentSize;
+ cctx->lowLimit = end;
+ cctx->dictLimit = end;
+ cctx->nextToUpdate = end + 1;
+ cctx->stage = ZSTDcs_init;
+ cctx->dictID = 0;
+ cctx->loadedDictEnd = 0;
+ {
+ int i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ cctx->rep[i] = repStartValue[i];
+ }
+ cctx->seqStore.litLengthSum = 0; /* force reset of btopt stats */
+ xxh64_reset(&cctx->xxhState, 0);
+ return 0;
+}
+
+typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset, ZSTDcrp_fullReset } ZSTD_compResetPolicy_e;
+
+/*! ZSTD_resetCCtx_advanced() :
+ note : `params` must be validated */
+static size_t ZSTD_resetCCtx_advanced(ZSTD_CCtx *zc, ZSTD_parameters params, U64 frameContentSize, ZSTD_compResetPolicy_e const crp)
+{
+ if (crp == ZSTDcrp_continue)
+ if (ZSTD_equivalentParams(params, zc->params)) {
+ zc->flagStaticTables = 0;
+ zc->flagStaticHufTable = HUF_repeat_none;
+ return ZSTD_continueCCtx(zc, params, frameContentSize);
+ }
+
+ {
+ size_t const blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, (size_t)1 << params.cParams.windowLog);
+ U32 const divider = (params.cParams.searchLength == 3) ? 3 : 4;
+ size_t const maxNbSeq = blockSize / divider;
+ size_t const tokenSpace = blockSize + 11 * maxNbSeq;
+ size_t const chainSize = (params.cParams.strategy == ZSTD_fast) ? 0 : (1 << params.cParams.chainLog);
+ size_t const hSize = ((size_t)1) << params.cParams.hashLog;
+ U32 const hashLog3 = (params.cParams.searchLength > 3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, params.cParams.windowLog);
+ size_t const h3Size = ((size_t)1) << hashLog3;
+ size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
+ void *ptr;
+
+ /* Check if workSpace is large enough, alloc a new one if needed */
+ {
+ size_t const optSpace = ((MaxML + 1) + (MaxLL + 1) + (MaxOff + 1) + (1 << Litbits)) * sizeof(U32) +
+ (ZSTD_OPT_NUM + 1) * (sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
+ size_t const neededSpace = tableSpace + (256 * sizeof(U32)) /* huffTable */ + tokenSpace +
+ (((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btopt2)) ? optSpace : 0);
+ if (zc->workSpaceSize < neededSpace) {
+ ZSTD_free(zc->workSpace, zc->customMem);
+ zc->workSpace = ZSTD_malloc(neededSpace, zc->customMem);
+ if (zc->workSpace == NULL)
+ return ERROR(memory_allocation);
+ zc->workSpaceSize = neededSpace;
+ }
+ }
+
+ if (crp != ZSTDcrp_noMemset)
+ memset(zc->workSpace, 0, tableSpace); /* reset tables only */
+ xxh64_reset(&zc->xxhState, 0);
+ zc->hashLog3 = hashLog3;
+ zc->hashTable = (U32 *)(zc->workSpace);
+ zc->chainTable = zc->hashTable + hSize;
+ zc->hashTable3 = zc->chainTable + chainSize;
+ ptr = zc->hashTable3 + h3Size;
+ zc->hufTable = (HUF_CElt *)ptr;
+ zc->flagStaticTables = 0;
+ zc->flagStaticHufTable = HUF_repeat_none;
+ ptr = ((U32 *)ptr) + 256; /* note : HUF_CElt* is incomplete type, size is simulated using U32 */
+
+ zc->nextToUpdate = 1;
+ zc->nextSrc = NULL;
+ zc->base = NULL;
+ zc->dictBase = NULL;
+ zc->dictLimit = 0;
+ zc->lowLimit = 0;
+ zc->params = params;
+ zc->blockSize = blockSize;
+ zc->frameContentSize = frameContentSize;
+ {
+ int i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ zc->rep[i] = repStartValue[i];
+ }
+
+ if ((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btopt2)) {
+ zc->seqStore.litFreq = (U32 *)ptr;
+ zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1 << Litbits);
+ zc->seqStore.matchLengthFreq = zc->seqStore.litLengthFreq + (MaxLL + 1);
+ zc->seqStore.offCodeFreq = zc->seqStore.matchLengthFreq + (MaxML + 1);
+ ptr = zc->seqStore.offCodeFreq + (MaxOff + 1);
+ zc->seqStore.matchTable = (ZSTD_match_t *)ptr;
+ ptr = zc->seqStore.matchTable + ZSTD_OPT_NUM + 1;
+ zc->seqStore.priceTable = (ZSTD_optimal_t *)ptr;
+ ptr = zc->seqStore.priceTable + ZSTD_OPT_NUM + 1;
+ zc->seqStore.litLengthSum = 0;
+ }
+ zc->seqStore.sequencesStart = (seqDef *)ptr;
+ ptr = zc->seqStore.sequencesStart + maxNbSeq;
+ zc->seqStore.llCode = (BYTE *)ptr;
+ zc->seqStore.mlCode = zc->seqStore.llCode + maxNbSeq;
+ zc->seqStore.ofCode = zc->seqStore.mlCode + maxNbSeq;
+ zc->seqStore.litStart = zc->seqStore.ofCode + maxNbSeq;
+
+ zc->stage = ZSTDcs_init;
+ zc->dictID = 0;
+ zc->loadedDictEnd = 0;
+
+ return 0;
+ }
+}
+
+/* ZSTD_invalidateRepCodes() :
+ * ensures next compression will not use repcodes from previous block.
+ * Note : only works with regular variant;
+ * do not use with extDict variant ! */
+void ZSTD_invalidateRepCodes(ZSTD_CCtx *cctx)
+{
+ int i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ cctx->rep[i] = 0;
+}
+
+/*! ZSTD_copyCCtx() :
+* Duplicate an existing context `srcCCtx` into another one `dstCCtx`.
+* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
+* @return : 0, or an error code */
+size_t ZSTD_copyCCtx(ZSTD_CCtx *dstCCtx, const ZSTD_CCtx *srcCCtx, unsigned long long pledgedSrcSize)
+{
+ if (srcCCtx->stage != ZSTDcs_init)
+ return ERROR(stage_wrong);
+
+ memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem));
+ {
+ ZSTD_parameters params = srcCCtx->params;
+ params.fParams.contentSizeFlag = (pledgedSrcSize > 0);
+ ZSTD_resetCCtx_advanced(dstCCtx, params, pledgedSrcSize, ZSTDcrp_noMemset);
+ }
+
+ /* copy tables */
+ {
+ size_t const chainSize = (srcCCtx->params.cParams.strategy == ZSTD_fast) ? 0 : (1 << srcCCtx->params.cParams.chainLog);
+ size_t const hSize = ((size_t)1) << srcCCtx->params.cParams.hashLog;
+ size_t const h3Size = (size_t)1 << srcCCtx->hashLog3;
+ size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
+ memcpy(dstCCtx->workSpace, srcCCtx->workSpace, tableSpace);
+ }
+
+ /* copy dictionary offsets */
+ dstCCtx->nextToUpdate = srcCCtx->nextToUpdate;
+ dstCCtx->nextToUpdate3 = srcCCtx->nextToUpdate3;
+ dstCCtx->nextSrc = srcCCtx->nextSrc;
+ dstCCtx->base = srcCCtx->base;
+ dstCCtx->dictBase = srcCCtx->dictBase;
+ dstCCtx->dictLimit = srcCCtx->dictLimit;
+ dstCCtx->lowLimit = srcCCtx->lowLimit;
+ dstCCtx->loadedDictEnd = srcCCtx->loadedDictEnd;
+ dstCCtx->dictID = srcCCtx->dictID;
+
+ /* copy entropy tables */
+ dstCCtx->flagStaticTables = srcCCtx->flagStaticTables;
+ dstCCtx->flagStaticHufTable = srcCCtx->flagStaticHufTable;
+ if (srcCCtx->flagStaticTables) {
+ memcpy(dstCCtx->litlengthCTable, srcCCtx->litlengthCTable, sizeof(dstCCtx->litlengthCTable));
+ memcpy(dstCCtx->matchlengthCTable, srcCCtx->matchlengthCTable, sizeof(dstCCtx->matchlengthCTable));
+ memcpy(dstCCtx->offcodeCTable, srcCCtx->offcodeCTable, sizeof(dstCCtx->offcodeCTable));
+ }
+ if (srcCCtx->flagStaticHufTable) {
+ memcpy(dstCCtx->hufTable, srcCCtx->hufTable, 256 * 4);
+ }
+
+ return 0;
+}
+
+/*! ZSTD_reduceTable() :
+* reduce table indexes by `reducerValue` */
+static void ZSTD_reduceTable(U32 *const table, U32 const size, U32 const reducerValue)
+{
+ U32 u;
+ for (u = 0; u < size; u++) {
+ if (table[u] < reducerValue)
+ table[u] = 0;
+ else
+ table[u] -= reducerValue;
+ }
+}
+
+/*! ZSTD_reduceIndex() :
+* rescale all indexes to avoid future overflow (indexes are U32) */
+static void ZSTD_reduceIndex(ZSTD_CCtx *zc, const U32 reducerValue)
+{
+ {
+ U32 const hSize = 1 << zc->params.cParams.hashLog;
+ ZSTD_reduceTable(zc->hashTable, hSize, reducerValue);
+ }
+
+ {
+ U32 const chainSize = (zc->params.cParams.strategy == ZSTD_fast) ? 0 : (1 << zc->params.cParams.chainLog);
+ ZSTD_reduceTable(zc->chainTable, chainSize, reducerValue);
+ }
+
+ {
+ U32 const h3Size = (zc->hashLog3) ? 1 << zc->hashLog3 : 0;
+ ZSTD_reduceTable(zc->hashTable3, h3Size, reducerValue);
+ }
+}
+
+/*-*******************************************************
+* Block entropic compression
+*********************************************************/
+
+/* See doc/zstd_compression_format.md for detailed format description */
+
+size_t ZSTD_noCompressBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ if (srcSize + ZSTD_blockHeaderSize > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+ memcpy((BYTE *)dst + ZSTD_blockHeaderSize, src, srcSize);
+ ZSTD_writeLE24(dst, (U32)(srcSize << 2) + (U32)bt_raw);
+ return ZSTD_blockHeaderSize + srcSize;
+}
+
+static size_t ZSTD_noCompressLiterals(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ BYTE *const ostart = (BYTE * const)dst;
+ U32 const flSize = 1 + (srcSize > 31) + (srcSize > 4095);
+
+ if (srcSize + flSize > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+
+ switch (flSize) {
+ case 1: /* 2 - 1 - 5 */ ostart[0] = (BYTE)((U32)set_basic + (srcSize << 3)); break;
+ case 2: /* 2 - 2 - 12 */ ZSTD_writeLE16(ostart, (U16)((U32)set_basic + (1 << 2) + (srcSize << 4))); break;
+ default: /*note : should not be necessary : flSize is within {1,2,3} */
+ case 3: /* 2 - 2 - 20 */ ZSTD_writeLE32(ostart, (U32)((U32)set_basic + (3 << 2) + (srcSize << 4))); break;
+ }
+
+ memcpy(ostart + flSize, src, srcSize);
+ return srcSize + flSize;
+}
+
+static size_t ZSTD_compressRleLiteralsBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ BYTE *const ostart = (BYTE * const)dst;
+ U32 const flSize = 1 + (srcSize > 31) + (srcSize > 4095);
+
+ (void)dstCapacity; /* dstCapacity already guaranteed to be >=4, hence large enough */
+
+ switch (flSize) {
+ case 1: /* 2 - 1 - 5 */ ostart[0] = (BYTE)((U32)set_rle + (srcSize << 3)); break;
+ case 2: /* 2 - 2 - 12 */ ZSTD_writeLE16(ostart, (U16)((U32)set_rle + (1 << 2) + (srcSize << 4))); break;
+ default: /*note : should not be necessary : flSize is necessarily within {1,2,3} */
+ case 3: /* 2 - 2 - 20 */ ZSTD_writeLE32(ostart, (U32)((U32)set_rle + (3 << 2) + (srcSize << 4))); break;
+ }
+
+ ostart[flSize] = *(const BYTE *)src;
+ return flSize + 1;
+}
+
+static size_t ZSTD_minGain(size_t srcSize) { return (srcSize >> 6) + 2; }
+
+static size_t ZSTD_compressLiterals(ZSTD_CCtx *zc, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t const minGain = ZSTD_minGain(srcSize);
+ size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB);
+ BYTE *const ostart = (BYTE *)dst;
+ U32 singleStream = srcSize < 256;
+ symbolEncodingType_e hType = set_compressed;
+ size_t cLitSize;
+
+/* small ? don't even attempt compression (speed opt) */
+#define LITERAL_NOENTROPY 63
+ {
+ size_t const minLitSize = zc->flagStaticHufTable == HUF_repeat_valid ? 6 : LITERAL_NOENTROPY;
+ if (srcSize <= minLitSize)
+ return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
+ }
+
+ if (dstCapacity < lhSize + 1)
+ return ERROR(dstSize_tooSmall); /* not enough space for compression */
+ {
+ HUF_repeat repeat = zc->flagStaticHufTable;
+ int const preferRepeat = zc->params.cParams.strategy < ZSTD_lazy ? srcSize <= 1024 : 0;
+ if (repeat == HUF_repeat_valid && lhSize == 3)
+ singleStream = 1;
+ cLitSize = singleStream ? HUF_compress1X_repeat(ostart + lhSize, dstCapacity - lhSize, src, srcSize, 255, 11, zc->tmpCounters,
+ sizeof(zc->tmpCounters), zc->hufTable, &repeat, preferRepeat)
+ : HUF_compress4X_repeat(ostart + lhSize, dstCapacity - lhSize, src, srcSize, 255, 11, zc->tmpCounters,
+ sizeof(zc->tmpCounters), zc->hufTable, &repeat, preferRepeat);
+ if (repeat != HUF_repeat_none) {
+ hType = set_repeat;
+ } /* reused the existing table */
+ else {
+ zc->flagStaticHufTable = HUF_repeat_check;
+ } /* now have a table to reuse */
+ }
+
+ if ((cLitSize == 0) | (cLitSize >= srcSize - minGain)) {
+ zc->flagStaticHufTable = HUF_repeat_none;
+ return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
+ }
+ if (cLitSize == 1) {
+ zc->flagStaticHufTable = HUF_repeat_none;
+ return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize);
+ }
+
+ /* Build header */
+ switch (lhSize) {
+ case 3: /* 2 - 2 - 10 - 10 */
+ {
+ U32 const lhc = hType + ((!singleStream) << 2) + ((U32)srcSize << 4) + ((U32)cLitSize << 14);
+ ZSTD_writeLE24(ostart, lhc);
+ break;
+ }
+ case 4: /* 2 - 2 - 14 - 14 */
+ {
+ U32 const lhc = hType + (2 << 2) + ((U32)srcSize << 4) + ((U32)cLitSize << 18);
+ ZSTD_writeLE32(ostart, lhc);
+ break;
+ }
+ default: /* should not be necessary, lhSize is only {3,4,5} */
+ case 5: /* 2 - 2 - 18 - 18 */
+ {
+ U32 const lhc = hType + (3 << 2) + ((U32)srcSize << 4) + ((U32)cLitSize << 22);
+ ZSTD_writeLE32(ostart, lhc);
+ ostart[4] = (BYTE)(cLitSize >> 10);
+ break;
+ }
+ }
+ return lhSize + cLitSize;
+}
+
+static const BYTE LL_Code[64] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 17, 18, 18,
+ 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23,
+ 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24};
+
+static const BYTE ML_Code[128] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38,
+ 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
+
+void ZSTD_seqToCodes(const seqStore_t *seqStorePtr)
+{
+ BYTE const LL_deltaCode = 19;
+ BYTE const ML_deltaCode = 36;
+ const seqDef *const sequences = seqStorePtr->sequencesStart;
+ BYTE *const llCodeTable = seqStorePtr->llCode;
+ BYTE *const ofCodeTable = seqStorePtr->ofCode;
+ BYTE *const mlCodeTable = seqStorePtr->mlCode;
+ U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
+ U32 u;
+ for (u = 0; u < nbSeq; u++) {
+ U32 const llv = sequences[u].litLength;
+ U32 const mlv = sequences[u].matchLength;
+ llCodeTable[u] = (llv > 63) ? (BYTE)ZSTD_highbit32(llv) + LL_deltaCode : LL_Code[llv];
+ ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offset);
+ mlCodeTable[u] = (mlv > 127) ? (BYTE)ZSTD_highbit32(mlv) + ML_deltaCode : ML_Code[mlv];
+ }
+ if (seqStorePtr->longLengthID == 1)
+ llCodeTable[seqStorePtr->longLengthPos] = MaxLL;
+ if (seqStorePtr->longLengthID == 2)
+ mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
+}
+
+ZSTD_STATIC size_t ZSTD_compressSequences_internal(ZSTD_CCtx *zc, void *dst, size_t dstCapacity)
+{
+ const int longOffsets = zc->params.cParams.windowLog > STREAM_ACCUMULATOR_MIN;
+ const seqStore_t *seqStorePtr = &(zc->seqStore);
+ FSE_CTable *CTable_LitLength = zc->litlengthCTable;
+ FSE_CTable *CTable_OffsetBits = zc->offcodeCTable;
+ FSE_CTable *CTable_MatchLength = zc->matchlengthCTable;
+ U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
+ const seqDef *const sequences = seqStorePtr->sequencesStart;
+ const BYTE *const ofCodeTable = seqStorePtr->ofCode;
+ const BYTE *const llCodeTable = seqStorePtr->llCode;
+ const BYTE *const mlCodeTable = seqStorePtr->mlCode;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstCapacity;
+ BYTE *op = ostart;
+ size_t const nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart;
+ BYTE *seqHead;
+
+ U32 *count;
+ S16 *norm;
+ U32 *workspace;
+ size_t workspaceSize = sizeof(zc->tmpCounters);
+ {
+ size_t spaceUsed32 = 0;
+ count = (U32 *)zc->tmpCounters + spaceUsed32;
+ spaceUsed32 += MaxSeq + 1;
+ norm = (S16 *)((U32 *)zc->tmpCounters + spaceUsed32);
+ spaceUsed32 += ALIGN(sizeof(S16) * (MaxSeq + 1), sizeof(U32)) >> 2;
+
+ workspace = (U32 *)zc->tmpCounters + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+ }
+
+ /* Compress literals */
+ {
+ const BYTE *const literals = seqStorePtr->litStart;
+ size_t const litSize = seqStorePtr->lit - literals;
+ size_t const cSize = ZSTD_compressLiterals(zc, op, dstCapacity, literals, litSize);
+ if (ZSTD_isError(cSize))
+ return cSize;
+ op += cSize;
+ }
+
+ /* Sequences Header */
+ if ((oend - op) < 3 /*max nbSeq Size*/ + 1 /*seqHead */)
+ return ERROR(dstSize_tooSmall);
+ if (nbSeq < 0x7F)
+ *op++ = (BYTE)nbSeq;
+ else if (nbSeq < LONGNBSEQ)
+ op[0] = (BYTE)((nbSeq >> 8) + 0x80), op[1] = (BYTE)nbSeq, op += 2;
+ else
+ op[0] = 0xFF, ZSTD_writeLE16(op + 1, (U16)(nbSeq - LONGNBSEQ)), op += 3;
+ if (nbSeq == 0)
+ return op - ostart;
+
+ /* seqHead : flags for FSE encoding type */
+ seqHead = op++;
+
+#define MIN_SEQ_FOR_DYNAMIC_FSE 64
+#define MAX_SEQ_FOR_STATIC_FSE 1000
+
+ /* convert length/distances into codes */
+ ZSTD_seqToCodes(seqStorePtr);
+
+ /* CTable for Literal Lengths */
+ {
+ U32 max = MaxLL;
+ size_t const mostFrequent = FSE_countFast_wksp(count, &max, llCodeTable, nbSeq, workspace);
+ if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
+ *op++ = llCodeTable[0];
+ FSE_buildCTable_rle(CTable_LitLength, (BYTE)max);
+ LLtype = set_rle;
+ } else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
+ LLtype = set_repeat;
+ } else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LL_defaultNormLog - 1)))) {
+ FSE_buildCTable_wksp(CTable_LitLength, LL_defaultNorm, MaxLL, LL_defaultNormLog, workspace, workspaceSize);
+ LLtype = set_basic;
+ } else {
+ size_t nbSeq_1 = nbSeq;
+ const U32 tableLog = FSE_optimalTableLog(LLFSELog, nbSeq, max);
+ if (count[llCodeTable[nbSeq - 1]] > 1) {
+ count[llCodeTable[nbSeq - 1]]--;
+ nbSeq_1--;
+ }
+ FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
+ {
+ size_t const NCountSize = FSE_writeNCount(op, oend - op, norm, max, tableLog); /* overflow protected */
+ if (FSE_isError(NCountSize))
+ return NCountSize;
+ op += NCountSize;
+ }
+ FSE_buildCTable_wksp(CTable_LitLength, norm, max, tableLog, workspace, workspaceSize);
+ LLtype = set_compressed;
+ }
+ }
+
+ /* CTable for Offsets */
+ {
+ U32 max = MaxOff;
+ size_t const mostFrequent = FSE_countFast_wksp(count, &max, ofCodeTable, nbSeq, workspace);
+ if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
+ *op++ = ofCodeTable[0];
+ FSE_buildCTable_rle(CTable_OffsetBits, (BYTE)max);
+ Offtype = set_rle;
+ } else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
+ Offtype = set_repeat;
+ } else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (OF_defaultNormLog - 1)))) {
+ FSE_buildCTable_wksp(CTable_OffsetBits, OF_defaultNorm, MaxOff, OF_defaultNormLog, workspace, workspaceSize);
+ Offtype = set_basic;
+ } else {
+ size_t nbSeq_1 = nbSeq;
+ const U32 tableLog = FSE_optimalTableLog(OffFSELog, nbSeq, max);
+ if (count[ofCodeTable[nbSeq - 1]] > 1) {
+ count[ofCodeTable[nbSeq - 1]]--;
+ nbSeq_1--;
+ }
+ FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
+ {
+ size_t const NCountSize = FSE_writeNCount(op, oend - op, norm, max, tableLog); /* overflow protected */
+ if (FSE_isError(NCountSize))
+ return NCountSize;
+ op += NCountSize;
+ }
+ FSE_buildCTable_wksp(CTable_OffsetBits, norm, max, tableLog, workspace, workspaceSize);
+ Offtype = set_compressed;
+ }
+ }
+
+ /* CTable for MatchLengths */
+ {
+ U32 max = MaxML;
+ size_t const mostFrequent = FSE_countFast_wksp(count, &max, mlCodeTable, nbSeq, workspace);
+ if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
+ *op++ = *mlCodeTable;
+ FSE_buildCTable_rle(CTable_MatchLength, (BYTE)max);
+ MLtype = set_rle;
+ } else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
+ MLtype = set_repeat;
+ } else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (ML_defaultNormLog - 1)))) {
+ FSE_buildCTable_wksp(CTable_MatchLength, ML_defaultNorm, MaxML, ML_defaultNormLog, workspace, workspaceSize);
+ MLtype = set_basic;
+ } else {
+ size_t nbSeq_1 = nbSeq;
+ const U32 tableLog = FSE_optimalTableLog(MLFSELog, nbSeq, max);
+ if (count[mlCodeTable[nbSeq - 1]] > 1) {
+ count[mlCodeTable[nbSeq - 1]]--;
+ nbSeq_1--;
+ }
+ FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
+ {
+ size_t const NCountSize = FSE_writeNCount(op, oend - op, norm, max, tableLog); /* overflow protected */
+ if (FSE_isError(NCountSize))
+ return NCountSize;
+ op += NCountSize;
+ }
+ FSE_buildCTable_wksp(CTable_MatchLength, norm, max, tableLog, workspace, workspaceSize);
+ MLtype = set_compressed;
+ }
+ }
+
+ *seqHead = (BYTE)((LLtype << 6) + (Offtype << 4) + (MLtype << 2));
+ zc->flagStaticTables = 0;
+
+ /* Encoding Sequences */
+ {
+ BIT_CStream_t blockStream;
+ FSE_CState_t stateMatchLength;
+ FSE_CState_t stateOffsetBits;
+ FSE_CState_t stateLitLength;
+
+ CHECK_E(BIT_initCStream(&blockStream, op, oend - op), dstSize_tooSmall); /* not enough space remaining */
+
+ /* first symbols */
+ FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq - 1]);
+ FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, ofCodeTable[nbSeq - 1]);
+ FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq - 1]);
+ BIT_addBits(&blockStream, sequences[nbSeq - 1].litLength, LL_bits[llCodeTable[nbSeq - 1]]);
+ if (ZSTD_32bits())
+ BIT_flushBits(&blockStream);
+ BIT_addBits(&blockStream, sequences[nbSeq - 1].matchLength, ML_bits[mlCodeTable[nbSeq - 1]]);
+ if (ZSTD_32bits())
+ BIT_flushBits(&blockStream);
+ if (longOffsets) {
+ U32 const ofBits = ofCodeTable[nbSeq - 1];
+ int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN - 1);
+ if (extraBits) {
+ BIT_addBits(&blockStream, sequences[nbSeq - 1].offset, extraBits);
+ BIT_flushBits(&blockStream);
+ }
+ BIT_addBits(&blockStream, sequences[nbSeq - 1].offset >> extraBits, ofBits - extraBits);
+ } else {
+ BIT_addBits(&blockStream, sequences[nbSeq - 1].offset, ofCodeTable[nbSeq - 1]);
+ }
+ BIT_flushBits(&blockStream);
+
+ {
+ size_t n;
+ for (n = nbSeq - 2; n < nbSeq; n--) { /* intentional underflow */
+ BYTE const llCode = llCodeTable[n];
+ BYTE const ofCode = ofCodeTable[n];
+ BYTE const mlCode = mlCodeTable[n];
+ U32 const llBits = LL_bits[llCode];
+ U32 const ofBits = ofCode; /* 32b*/ /* 64b*/
+ U32 const mlBits = ML_bits[mlCode];
+ /* (7)*/ /* (7)*/
+ FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
+ FSE_encodeSymbol(&blockStream, &stateMatchLength, mlCode); /* 24 */ /* 24 */
+ if (ZSTD_32bits())
+ BIT_flushBits(&blockStream); /* (7)*/
+ FSE_encodeSymbol(&blockStream, &stateLitLength, llCode); /* 16 */ /* 33 */
+ if (ZSTD_32bits() || (ofBits + mlBits + llBits >= 64 - 7 - (LLFSELog + MLFSELog + OffFSELog)))
+ BIT_flushBits(&blockStream); /* (7)*/
+ BIT_addBits(&blockStream, sequences[n].litLength, llBits);
+ if (ZSTD_32bits() && ((llBits + mlBits) > 24))
+ BIT_flushBits(&blockStream);
+ BIT_addBits(&blockStream, sequences[n].matchLength, mlBits);
+ if (ZSTD_32bits())
+ BIT_flushBits(&blockStream); /* (7)*/
+ if (longOffsets) {
+ int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN - 1);
+ if (extraBits) {
+ BIT_addBits(&blockStream, sequences[n].offset, extraBits);
+ BIT_flushBits(&blockStream); /* (7)*/
+ }
+ BIT_addBits(&blockStream, sequences[n].offset >> extraBits, ofBits - extraBits); /* 31 */
+ } else {
+ BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
+ }
+ BIT_flushBits(&blockStream); /* (7)*/
+ }
+ }
+
+ FSE_flushCState(&blockStream, &stateMatchLength);
+ FSE_flushCState(&blockStream, &stateOffsetBits);
+ FSE_flushCState(&blockStream, &stateLitLength);
+
+ {
+ size_t const streamSize = BIT_closeCStream(&blockStream);
+ if (streamSize == 0)
+ return ERROR(dstSize_tooSmall); /* not enough space */
+ op += streamSize;
+ }
+ }
+ return op - ostart;
+}
+
+ZSTD_STATIC size_t ZSTD_compressSequences(ZSTD_CCtx *zc, void *dst, size_t dstCapacity, size_t srcSize)
+{
+ size_t const cSize = ZSTD_compressSequences_internal(zc, dst, dstCapacity);
+ size_t const minGain = ZSTD_minGain(srcSize);
+ size_t const maxCSize = srcSize - minGain;
+ /* If the srcSize <= dstCapacity, then there is enough space to write a
+ * raw uncompressed block. Since we ran out of space, the block must not
+ * be compressible, so fall back to a raw uncompressed block.
+ */
+ int const uncompressibleError = cSize == ERROR(dstSize_tooSmall) && srcSize <= dstCapacity;
+ int i;
+
+ if (ZSTD_isError(cSize) && !uncompressibleError)
+ return cSize;
+ if (cSize >= maxCSize || uncompressibleError) {
+ zc->flagStaticHufTable = HUF_repeat_none;
+ return 0;
+ }
+ /* confirm repcodes */
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ zc->rep[i] = zc->repToConfirm[i];
+ return cSize;
+}
+
+/*! ZSTD_storeSeq() :
+ Store a sequence (literal length, literals, offset code and match length code) into seqStore_t.
+ `offsetCode` : distance to match, or 0 == repCode.
+ `matchCode` : matchLength - MINMATCH
+*/
+ZSTD_STATIC void ZSTD_storeSeq(seqStore_t *seqStorePtr, size_t litLength, const void *literals, U32 offsetCode, size_t matchCode)
+{
+ /* copy Literals */
+ ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
+ seqStorePtr->lit += litLength;
+
+ /* literal Length */
+ if (litLength > 0xFFFF) {
+ seqStorePtr->longLengthID = 1;
+ seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
+ }
+ seqStorePtr->sequences[0].litLength = (U16)litLength;
+
+ /* match offset */
+ seqStorePtr->sequences[0].offset = offsetCode + 1;
+
+ /* match Length */
+ if (matchCode > 0xFFFF) {
+ seqStorePtr->longLengthID = 2;
+ seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
+ }
+ seqStorePtr->sequences[0].matchLength = (U16)matchCode;
+
+ seqStorePtr->sequences++;
+}
+
+/*-*************************************
+* Match length counter
+***************************************/
+static unsigned ZSTD_NbCommonBytes(register size_t val)
+{
+ if (ZSTD_isLittleEndian()) {
+ if (ZSTD_64bits()) {
+ return (__builtin_ctzll((U64)val) >> 3);
+ } else { /* 32 bits */
+ return (__builtin_ctz((U32)val) >> 3);
+ }
+ } else { /* Big Endian CPU */
+ if (ZSTD_64bits()) {
+ return (__builtin_clzll(val) >> 3);
+ } else { /* 32 bits */
+ return (__builtin_clz((U32)val) >> 3);
+ }
+ }
+}
+
+static size_t ZSTD_count(const BYTE *pIn, const BYTE *pMatch, const BYTE *const pInLimit)
+{
+ const BYTE *const pStart = pIn;
+ const BYTE *const pInLoopLimit = pInLimit - (sizeof(size_t) - 1);
+
+ while (pIn < pInLoopLimit) {
+ size_t const diff = ZSTD_readST(pMatch) ^ ZSTD_readST(pIn);
+ if (!diff) {
+ pIn += sizeof(size_t);
+ pMatch += sizeof(size_t);
+ continue;
+ }
+ pIn += ZSTD_NbCommonBytes(diff);
+ return (size_t)(pIn - pStart);
+ }
+ if (ZSTD_64bits())
+ if ((pIn < (pInLimit - 3)) && (ZSTD_read32(pMatch) == ZSTD_read32(pIn))) {
+ pIn += 4;
+ pMatch += 4;
+ }
+ if ((pIn < (pInLimit - 1)) && (ZSTD_read16(pMatch) == ZSTD_read16(pIn))) {
+ pIn += 2;
+ pMatch += 2;
+ }
+ if ((pIn < pInLimit) && (*pMatch == *pIn))
+ pIn++;
+ return (size_t)(pIn - pStart);
+}
+
+/** ZSTD_count_2segments() :
+* can count match length with `ip` & `match` in 2 different segments.
+* convention : on reaching mEnd, match count continue starting from iStart
+*/
+static size_t ZSTD_count_2segments(const BYTE *ip, const BYTE *match, const BYTE *iEnd, const BYTE *mEnd, const BYTE *iStart)
+{
+ const BYTE *const vEnd = MIN(ip + (mEnd - match), iEnd);
+ size_t const matchLength = ZSTD_count(ip, match, vEnd);
+ if (match + matchLength != mEnd)
+ return matchLength;
+ return matchLength + ZSTD_count(ip + matchLength, iStart, iEnd);
+}
+
+/*-*************************************
+* Hashes
+***************************************/
+static const U32 prime3bytes = 506832829U;
+static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32 - 24)) * prime3bytes) >> (32 - h); }
+ZSTD_STATIC size_t ZSTD_hash3Ptr(const void *ptr, U32 h) { return ZSTD_hash3(ZSTD_readLE32(ptr), h); } /* only in zstd_opt.h */
+
+static const U32 prime4bytes = 2654435761U;
+static U32 ZSTD_hash4(U32 u, U32 h) { return (u * prime4bytes) >> (32 - h); }
+static size_t ZSTD_hash4Ptr(const void *ptr, U32 h) { return ZSTD_hash4(ZSTD_read32(ptr), h); }
+
+static const U64 prime5bytes = 889523592379ULL;
+static size_t ZSTD_hash5(U64 u, U32 h) { return (size_t)(((u << (64 - 40)) * prime5bytes) >> (64 - h)); }
+static size_t ZSTD_hash5Ptr(const void *p, U32 h) { return ZSTD_hash5(ZSTD_readLE64(p), h); }
+
+static const U64 prime6bytes = 227718039650203ULL;
+static size_t ZSTD_hash6(U64 u, U32 h) { return (size_t)(((u << (64 - 48)) * prime6bytes) >> (64 - h)); }
+static size_t ZSTD_hash6Ptr(const void *p, U32 h) { return ZSTD_hash6(ZSTD_readLE64(p), h); }
+
+static const U64 prime7bytes = 58295818150454627ULL;
+static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u << (64 - 56)) * prime7bytes) >> (64 - h)); }
+static size_t ZSTD_hash7Ptr(const void *p, U32 h) { return ZSTD_hash7(ZSTD_readLE64(p), h); }
+
+static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL;
+static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u)*prime8bytes) >> (64 - h)); }
+static size_t ZSTD_hash8Ptr(const void *p, U32 h) { return ZSTD_hash8(ZSTD_readLE64(p), h); }
+
+static size_t ZSTD_hashPtr(const void *p, U32 hBits, U32 mls)
+{
+ switch (mls) {
+ // case 3: return ZSTD_hash3Ptr(p, hBits);
+ default:
+ case 4: return ZSTD_hash4Ptr(p, hBits);
+ case 5: return ZSTD_hash5Ptr(p, hBits);
+ case 6: return ZSTD_hash6Ptr(p, hBits);
+ case 7: return ZSTD_hash7Ptr(p, hBits);
+ case 8: return ZSTD_hash8Ptr(p, hBits);
+ }
+}
+
+/*-*************************************
+* Fast Scan
+***************************************/
+static void ZSTD_fillHashTable(ZSTD_CCtx *zc, const void *end, const U32 mls)
+{
+ U32 *const hashTable = zc->hashTable;
+ U32 const hBits = zc->params.cParams.hashLog;
+ const BYTE *const base = zc->base;
+ const BYTE *ip = base + zc->nextToUpdate;
+ const BYTE *const iend = ((const BYTE *)end) - HASH_READ_SIZE;
+ const size_t fastHashFillStep = 3;
+
+ while (ip <= iend) {
+ hashTable[ZSTD_hashPtr(ip, hBits, mls)] = (U32)(ip - base);
+ ip += fastHashFillStep;
+ }
+}
+
+FORCE_INLINE
+void ZSTD_compressBlock_fast_generic(ZSTD_CCtx *cctx, const void *src, size_t srcSize, const U32 mls)
+{
+ U32 *const hashTable = cctx->hashTable;
+ U32 const hBits = cctx->params.cParams.hashLog;
+ seqStore_t *seqStorePtr = &(cctx->seqStore);
+ const BYTE *const base = cctx->base;
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const U32 lowestIndex = cctx->dictLimit;
+ const BYTE *const lowest = base + lowestIndex;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - HASH_READ_SIZE;
+ U32 offset_1 = cctx->rep[0], offset_2 = cctx->rep[1];
+ U32 offsetSaved = 0;
+
+ /* init */
+ ip += (ip == lowest);
+ {
+ U32 const maxRep = (U32)(ip - lowest);
+ if (offset_2 > maxRep)
+ offsetSaved = offset_2, offset_2 = 0;
+ if (offset_1 > maxRep)
+ offsetSaved = offset_1, offset_1 = 0;
+ }
+
+ /* Main Search Loop */
+ while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */
+ size_t mLength;
+ size_t const h = ZSTD_hashPtr(ip, hBits, mls);
+ U32 const curr = (U32)(ip - base);
+ U32 const matchIndex = hashTable[h];
+ const BYTE *match = base + matchIndex;
+ hashTable[h] = curr; /* update hash table */
+
+ if ((offset_1 > 0) & (ZSTD_read32(ip + 1 - offset_1) == ZSTD_read32(ip + 1))) {
+ mLength = ZSTD_count(ip + 1 + 4, ip + 1 + 4 - offset_1, iend) + 4;
+ ip++;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH);
+ } else {
+ U32 offset;
+ if ((matchIndex <= lowestIndex) || (ZSTD_read32(match) != ZSTD_read32(ip))) {
+ ip += ((ip - anchor) >> g_searchStrength) + 1;
+ continue;
+ }
+ mLength = ZSTD_count(ip + 4, match + 4, iend) + 4;
+ offset = (U32)(ip - match);
+ while (((ip > anchor) & (match > lowest)) && (ip[-1] == match[-1])) {
+ ip--;
+ match--;
+ mLength++;
+ } /* catch up */
+ offset_2 = offset_1;
+ offset_1 = offset;
+
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH);
+ }
+
+ /* match found */
+ ip += mLength;
+ anchor = ip;
+
+ if (ip <= ilimit) {
+ /* Fill Table */
+ hashTable[ZSTD_hashPtr(base + curr + 2, hBits, mls)] = curr + 2; /* here because curr+2 could be > iend-8 */
+ hashTable[ZSTD_hashPtr(ip - 2, hBits, mls)] = (U32)(ip - 2 - base);
+ /* check immediate repcode */
+ while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) {
+ /* store sequence */
+ size_t const rLength = ZSTD_count(ip + 4, ip + 4 - offset_2, iend) + 4;
+ {
+ U32 const tmpOff = offset_2;
+ offset_2 = offset_1;
+ offset_1 = tmpOff;
+ } /* swap offset_2 <=> offset_1 */
+ hashTable[ZSTD_hashPtr(ip, hBits, mls)] = (U32)(ip - base);
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength - MINMATCH);
+ ip += rLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ }
+ }
+ }
+
+ /* save reps for next block */
+ cctx->repToConfirm[0] = offset_1 ? offset_1 : offsetSaved;
+ cctx->repToConfirm[1] = offset_2 ? offset_2 : offsetSaved;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+static void ZSTD_compressBlock_fast(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ const U32 mls = ctx->params.cParams.searchLength;
+ switch (mls) {
+ default: /* includes case 3 */
+ case 4: ZSTD_compressBlock_fast_generic(ctx, src, srcSize, 4); return;
+ case 5: ZSTD_compressBlock_fast_generic(ctx, src, srcSize, 5); return;
+ case 6: ZSTD_compressBlock_fast_generic(ctx, src, srcSize, 6); return;
+ case 7: ZSTD_compressBlock_fast_generic(ctx, src, srcSize, 7); return;
+ }
+}
+
+static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const U32 mls)
+{
+ U32 *hashTable = ctx->hashTable;
+ const U32 hBits = ctx->params.cParams.hashLog;
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const base = ctx->base;
+ const BYTE *const dictBase = ctx->dictBase;
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const U32 lowestIndex = ctx->lowLimit;
+ const BYTE *const dictStart = dictBase + lowestIndex;
+ const U32 dictLimit = ctx->dictLimit;
+ const BYTE *const lowPrefixPtr = base + dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1];
+
+ /* Search Loop */
+ while (ip < ilimit) { /* < instead of <=, because (ip+1) */
+ const size_t h = ZSTD_hashPtr(ip, hBits, mls);
+ const U32 matchIndex = hashTable[h];
+ const BYTE *matchBase = matchIndex < dictLimit ? dictBase : base;
+ const BYTE *match = matchBase + matchIndex;
+ const U32 curr = (U32)(ip - base);
+ const U32 repIndex = curr + 1 - offset_1; /* offset_1 expected <= curr +1 */
+ const BYTE *repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *repMatch = repBase + repIndex;
+ size_t mLength;
+ hashTable[h] = curr; /* update hash table */
+
+ if ((((U32)((dictLimit - 1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > lowestIndex)) &&
+ (ZSTD_read32(repMatch) == ZSTD_read32(ip + 1))) {
+ const BYTE *repMatchEnd = repIndex < dictLimit ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip + 1 + EQUAL_READ32, repMatch + EQUAL_READ32, iend, repMatchEnd, lowPrefixPtr) + EQUAL_READ32;
+ ip++;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH);
+ } else {
+ if ((matchIndex < lowestIndex) || (ZSTD_read32(match) != ZSTD_read32(ip))) {
+ ip += ((ip - anchor) >> g_searchStrength) + 1;
+ continue;
+ }
+ {
+ const BYTE *matchEnd = matchIndex < dictLimit ? dictEnd : iend;
+ const BYTE *lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
+ U32 offset;
+ mLength = ZSTD_count_2segments(ip + EQUAL_READ32, match + EQUAL_READ32, iend, matchEnd, lowPrefixPtr) + EQUAL_READ32;
+ while (((ip > anchor) & (match > lowMatchPtr)) && (ip[-1] == match[-1])) {
+ ip--;
+ match--;
+ mLength++;
+ } /* catch up */
+ offset = curr - matchIndex;
+ offset_2 = offset_1;
+ offset_1 = offset;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH);
+ }
+ }
+
+ /* found a match : store it */
+ ip += mLength;
+ anchor = ip;
+
+ if (ip <= ilimit) {
+ /* Fill Table */
+ hashTable[ZSTD_hashPtr(base + curr + 2, hBits, mls)] = curr + 2;
+ hashTable[ZSTD_hashPtr(ip - 2, hBits, mls)] = (U32)(ip - 2 - base);
+ /* check immediate repcode */
+ while (ip <= ilimit) {
+ U32 const curr2 = (U32)(ip - base);
+ U32 const repIndex2 = curr2 - offset_2;
+ const BYTE *repMatch2 = repIndex2 < dictLimit ? dictBase + repIndex2 : base + repIndex2;
+ if ((((U32)((dictLimit - 1) - repIndex2) >= 3) & (repIndex2 > lowestIndex)) /* intentional overflow */
+ && (ZSTD_read32(repMatch2) == ZSTD_read32(ip))) {
+ const BYTE *const repEnd2 = repIndex2 < dictLimit ? dictEnd : iend;
+ size_t repLength2 =
+ ZSTD_count_2segments(ip + EQUAL_READ32, repMatch2 + EQUAL_READ32, iend, repEnd2, lowPrefixPtr) + EQUAL_READ32;
+ U32 tmpOffset = offset_2;
+ offset_2 = offset_1;
+ offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, repLength2 - MINMATCH);
+ hashTable[ZSTD_hashPtr(ip, hBits, mls)] = curr2;
+ ip += repLength2;
+ anchor = ip;
+ continue;
+ }
+ break;
+ }
+ }
+ }
+
+ /* save reps for next block */
+ ctx->repToConfirm[0] = offset_1;
+ ctx->repToConfirm[1] = offset_2;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ U32 const mls = ctx->params.cParams.searchLength;
+ switch (mls) {
+ default: /* includes case 3 */
+ case 4: ZSTD_compressBlock_fast_extDict_generic(ctx, src, srcSize, 4); return;
+ case 5: ZSTD_compressBlock_fast_extDict_generic(ctx, src, srcSize, 5); return;
+ case 6: ZSTD_compressBlock_fast_extDict_generic(ctx, src, srcSize, 6); return;
+ case 7: ZSTD_compressBlock_fast_extDict_generic(ctx, src, srcSize, 7); return;
+ }
+}
+
+/*-*************************************
+* Double Fast
+***************************************/
+static void ZSTD_fillDoubleHashTable(ZSTD_CCtx *cctx, const void *end, const U32 mls)
+{
+ U32 *const hashLarge = cctx->hashTable;
+ U32 const hBitsL = cctx->params.cParams.hashLog;
+ U32 *const hashSmall = cctx->chainTable;
+ U32 const hBitsS = cctx->params.cParams.chainLog;
+ const BYTE *const base = cctx->base;
+ const BYTE *ip = base + cctx->nextToUpdate;
+ const BYTE *const iend = ((const BYTE *)end) - HASH_READ_SIZE;
+ const size_t fastHashFillStep = 3;
+
+ while (ip <= iend) {
+ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip - base);
+ hashLarge[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip - base);
+ ip += fastHashFillStep;
+ }
+}
+
+FORCE_INLINE
+void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx *cctx, const void *src, size_t srcSize, const U32 mls)
+{
+ U32 *const hashLong = cctx->hashTable;
+ const U32 hBitsL = cctx->params.cParams.hashLog;
+ U32 *const hashSmall = cctx->chainTable;
+ const U32 hBitsS = cctx->params.cParams.chainLog;
+ seqStore_t *seqStorePtr = &(cctx->seqStore);
+ const BYTE *const base = cctx->base;
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const U32 lowestIndex = cctx->dictLimit;
+ const BYTE *const lowest = base + lowestIndex;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - HASH_READ_SIZE;
+ U32 offset_1 = cctx->rep[0], offset_2 = cctx->rep[1];
+ U32 offsetSaved = 0;
+
+ /* init */
+ ip += (ip == lowest);
+ {
+ U32 const maxRep = (U32)(ip - lowest);
+ if (offset_2 > maxRep)
+ offsetSaved = offset_2, offset_2 = 0;
+ if (offset_1 > maxRep)
+ offsetSaved = offset_1, offset_1 = 0;
+ }
+
+ /* Main Search Loop */
+ while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */
+ size_t mLength;
+ size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8);
+ size_t const h = ZSTD_hashPtr(ip, hBitsS, mls);
+ U32 const curr = (U32)(ip - base);
+ U32 const matchIndexL = hashLong[h2];
+ U32 const matchIndexS = hashSmall[h];
+ const BYTE *matchLong = base + matchIndexL;
+ const BYTE *match = base + matchIndexS;
+ hashLong[h2] = hashSmall[h] = curr; /* update hash tables */
+
+ if ((offset_1 > 0) & (ZSTD_read32(ip + 1 - offset_1) == ZSTD_read32(ip + 1))) { /* note : by construction, offset_1 <= curr */
+ mLength = ZSTD_count(ip + 1 + 4, ip + 1 + 4 - offset_1, iend) + 4;
+ ip++;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH);
+ } else {
+ U32 offset;
+ if ((matchIndexL > lowestIndex) && (ZSTD_read64(matchLong) == ZSTD_read64(ip))) {
+ mLength = ZSTD_count(ip + 8, matchLong + 8, iend) + 8;
+ offset = (U32)(ip - matchLong);
+ while (((ip > anchor) & (matchLong > lowest)) && (ip[-1] == matchLong[-1])) {
+ ip--;
+ matchLong--;
+ mLength++;
+ } /* catch up */
+ } else if ((matchIndexS > lowestIndex) && (ZSTD_read32(match) == ZSTD_read32(ip))) {
+ size_t const h3 = ZSTD_hashPtr(ip + 1, hBitsL, 8);
+ U32 const matchIndex3 = hashLong[h3];
+ const BYTE *match3 = base + matchIndex3;
+ hashLong[h3] = curr + 1;
+ if ((matchIndex3 > lowestIndex) && (ZSTD_read64(match3) == ZSTD_read64(ip + 1))) {
+ mLength = ZSTD_count(ip + 9, match3 + 8, iend) + 8;
+ ip++;
+ offset = (U32)(ip - match3);
+ while (((ip > anchor) & (match3 > lowest)) && (ip[-1] == match3[-1])) {
+ ip--;
+ match3--;
+ mLength++;
+ } /* catch up */
+ } else {
+ mLength = ZSTD_count(ip + 4, match + 4, iend) + 4;
+ offset = (U32)(ip - match);
+ while (((ip > anchor) & (match > lowest)) && (ip[-1] == match[-1])) {
+ ip--;
+ match--;
+ mLength++;
+ } /* catch up */
+ }
+ } else {
+ ip += ((ip - anchor) >> g_searchStrength) + 1;
+ continue;
+ }
+
+ offset_2 = offset_1;
+ offset_1 = offset;
+
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH);
+ }
+
+ /* match found */
+ ip += mLength;
+ anchor = ip;
+
+ if (ip <= ilimit) {
+ /* Fill Table */
+ hashLong[ZSTD_hashPtr(base + curr + 2, hBitsL, 8)] = hashSmall[ZSTD_hashPtr(base + curr + 2, hBitsS, mls)] =
+ curr + 2; /* here because curr+2 could be > iend-8 */
+ hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = hashSmall[ZSTD_hashPtr(ip - 2, hBitsS, mls)] = (U32)(ip - 2 - base);
+
+ /* check immediate repcode */
+ while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) {
+ /* store sequence */
+ size_t const rLength = ZSTD_count(ip + 4, ip + 4 - offset_2, iend) + 4;
+ {
+ U32 const tmpOff = offset_2;
+ offset_2 = offset_1;
+ offset_1 = tmpOff;
+ } /* swap offset_2 <=> offset_1 */
+ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip - base);
+ hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip - base);
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength - MINMATCH);
+ ip += rLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ }
+ }
+ }
+
+ /* save reps for next block */
+ cctx->repToConfirm[0] = offset_1 ? offset_1 : offsetSaved;
+ cctx->repToConfirm[1] = offset_2 ? offset_2 : offsetSaved;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+static void ZSTD_compressBlock_doubleFast(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ const U32 mls = ctx->params.cParams.searchLength;
+ switch (mls) {
+ default: /* includes case 3 */
+ case 4: ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 4); return;
+ case 5: ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 5); return;
+ case 6: ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 6); return;
+ case 7: ZSTD_compressBlock_doubleFast_generic(ctx, src, srcSize, 7); return;
+ }
+}
+
+static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const U32 mls)
+{
+ U32 *const hashLong = ctx->hashTable;
+ U32 const hBitsL = ctx->params.cParams.hashLog;
+ U32 *const hashSmall = ctx->chainTable;
+ U32 const hBitsS = ctx->params.cParams.chainLog;
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const base = ctx->base;
+ const BYTE *const dictBase = ctx->dictBase;
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const U32 lowestIndex = ctx->lowLimit;
+ const BYTE *const dictStart = dictBase + lowestIndex;
+ const U32 dictLimit = ctx->dictLimit;
+ const BYTE *const lowPrefixPtr = base + dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1];
+
+ /* Search Loop */
+ while (ip < ilimit) { /* < instead of <=, because (ip+1) */
+ const size_t hSmall = ZSTD_hashPtr(ip, hBitsS, mls);
+ const U32 matchIndex = hashSmall[hSmall];
+ const BYTE *matchBase = matchIndex < dictLimit ? dictBase : base;
+ const BYTE *match = matchBase + matchIndex;
+
+ const size_t hLong = ZSTD_hashPtr(ip, hBitsL, 8);
+ const U32 matchLongIndex = hashLong[hLong];
+ const BYTE *matchLongBase = matchLongIndex < dictLimit ? dictBase : base;
+ const BYTE *matchLong = matchLongBase + matchLongIndex;
+
+ const U32 curr = (U32)(ip - base);
+ const U32 repIndex = curr + 1 - offset_1; /* offset_1 expected <= curr +1 */
+ const BYTE *repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *repMatch = repBase + repIndex;
+ size_t mLength;
+ hashSmall[hSmall] = hashLong[hLong] = curr; /* update hash table */
+
+ if ((((U32)((dictLimit - 1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > lowestIndex)) &&
+ (ZSTD_read32(repMatch) == ZSTD_read32(ip + 1))) {
+ const BYTE *repMatchEnd = repIndex < dictLimit ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip + 1 + 4, repMatch + 4, iend, repMatchEnd, lowPrefixPtr) + 4;
+ ip++;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH);
+ } else {
+ if ((matchLongIndex > lowestIndex) && (ZSTD_read64(matchLong) == ZSTD_read64(ip))) {
+ const BYTE *matchEnd = matchLongIndex < dictLimit ? dictEnd : iend;
+ const BYTE *lowMatchPtr = matchLongIndex < dictLimit ? dictStart : lowPrefixPtr;
+ U32 offset;
+ mLength = ZSTD_count_2segments(ip + 8, matchLong + 8, iend, matchEnd, lowPrefixPtr) + 8;
+ offset = curr - matchLongIndex;
+ while (((ip > anchor) & (matchLong > lowMatchPtr)) && (ip[-1] == matchLong[-1])) {
+ ip--;
+ matchLong--;
+ mLength++;
+ } /* catch up */
+ offset_2 = offset_1;
+ offset_1 = offset;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH);
+
+ } else if ((matchIndex > lowestIndex) && (ZSTD_read32(match) == ZSTD_read32(ip))) {
+ size_t const h3 = ZSTD_hashPtr(ip + 1, hBitsL, 8);
+ U32 const matchIndex3 = hashLong[h3];
+ const BYTE *const match3Base = matchIndex3 < dictLimit ? dictBase : base;
+ const BYTE *match3 = match3Base + matchIndex3;
+ U32 offset;
+ hashLong[h3] = curr + 1;
+ if ((matchIndex3 > lowestIndex) && (ZSTD_read64(match3) == ZSTD_read64(ip + 1))) {
+ const BYTE *matchEnd = matchIndex3 < dictLimit ? dictEnd : iend;
+ const BYTE *lowMatchPtr = matchIndex3 < dictLimit ? dictStart : lowPrefixPtr;
+ mLength = ZSTD_count_2segments(ip + 9, match3 + 8, iend, matchEnd, lowPrefixPtr) + 8;
+ ip++;
+ offset = curr + 1 - matchIndex3;
+ while (((ip > anchor) & (match3 > lowMatchPtr)) && (ip[-1] == match3[-1])) {
+ ip--;
+ match3--;
+ mLength++;
+ } /* catch up */
+ } else {
+ const BYTE *matchEnd = matchIndex < dictLimit ? dictEnd : iend;
+ const BYTE *lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
+ mLength = ZSTD_count_2segments(ip + 4, match + 4, iend, matchEnd, lowPrefixPtr) + 4;
+ offset = curr - matchIndex;
+ while (((ip > anchor) & (match > lowMatchPtr)) && (ip[-1] == match[-1])) {
+ ip--;
+ match--;
+ mLength++;
+ } /* catch up */
+ }
+ offset_2 = offset_1;
+ offset_1 = offset;
+ ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH);
+
+ } else {
+ ip += ((ip - anchor) >> g_searchStrength) + 1;
+ continue;
+ }
+ }
+
+ /* found a match : store it */
+ ip += mLength;
+ anchor = ip;
+
+ if (ip <= ilimit) {
+ /* Fill Table */
+ hashSmall[ZSTD_hashPtr(base + curr + 2, hBitsS, mls)] = curr + 2;
+ hashLong[ZSTD_hashPtr(base + curr + 2, hBitsL, 8)] = curr + 2;
+ hashSmall[ZSTD_hashPtr(ip - 2, hBitsS, mls)] = (U32)(ip - 2 - base);
+ hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = (U32)(ip - 2 - base);
+ /* check immediate repcode */
+ while (ip <= ilimit) {
+ U32 const curr2 = (U32)(ip - base);
+ U32 const repIndex2 = curr2 - offset_2;
+ const BYTE *repMatch2 = repIndex2 < dictLimit ? dictBase + repIndex2 : base + repIndex2;
+ if ((((U32)((dictLimit - 1) - repIndex2) >= 3) & (repIndex2 > lowestIndex)) /* intentional overflow */
+ && (ZSTD_read32(repMatch2) == ZSTD_read32(ip))) {
+ const BYTE *const repEnd2 = repIndex2 < dictLimit ? dictEnd : iend;
+ size_t const repLength2 =
+ ZSTD_count_2segments(ip + EQUAL_READ32, repMatch2 + EQUAL_READ32, iend, repEnd2, lowPrefixPtr) + EQUAL_READ32;
+ U32 tmpOffset = offset_2;
+ offset_2 = offset_1;
+ offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, repLength2 - MINMATCH);
+ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = curr2;
+ hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = curr2;
+ ip += repLength2;
+ anchor = ip;
+ continue;
+ }
+ break;
+ }
+ }
+ }
+
+ /* save reps for next block */
+ ctx->repToConfirm[0] = offset_1;
+ ctx->repToConfirm[1] = offset_2;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+static void ZSTD_compressBlock_doubleFast_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ U32 const mls = ctx->params.cParams.searchLength;
+ switch (mls) {
+ default: /* includes case 3 */
+ case 4: ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 4); return;
+ case 5: ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 5); return;
+ case 6: ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 6); return;
+ case 7: ZSTD_compressBlock_doubleFast_extDict_generic(ctx, src, srcSize, 7); return;
+ }
+}
+
+/*-*************************************
+* Binary Tree search
+***************************************/
+/** ZSTD_insertBt1() : add one or multiple positions to tree.
+* ip : assumed <= iend-8 .
+* @return : nb of positions added */
+static U32 ZSTD_insertBt1(ZSTD_CCtx *zc, const BYTE *const ip, const U32 mls, const BYTE *const iend, U32 nbCompares, U32 extDict)
+{
+ U32 *const hashTable = zc->hashTable;
+ U32 const hashLog = zc->params.cParams.hashLog;
+ size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
+ U32 *const bt = zc->chainTable;
+ U32 const btLog = zc->params.cParams.chainLog - 1;
+ U32 const btMask = (1 << btLog) - 1;
+ U32 matchIndex = hashTable[h];
+ size_t commonLengthSmaller = 0, commonLengthLarger = 0;
+ const BYTE *const base = zc->base;
+ const BYTE *const dictBase = zc->dictBase;
+ const U32 dictLimit = zc->dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const BYTE *match;
+ const U32 curr = (U32)(ip - base);
+ const U32 btLow = btMask >= curr ? 0 : curr - btMask;
+ U32 *smallerPtr = bt + 2 * (curr & btMask);
+ U32 *largerPtr = smallerPtr + 1;
+ U32 dummy32; /* to be nullified at the end */
+ U32 const windowLow = zc->lowLimit;
+ U32 matchEndIdx = curr + 8;
+ size_t bestLength = 8;
+
+ hashTable[h] = curr; /* Update Hash Table */
+
+ while (nbCompares-- && (matchIndex > windowLow)) {
+ U32 *const nextPtr = bt + 2 * (matchIndex & btMask);
+ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
+
+ if ((!extDict) || (matchIndex + matchLength >= dictLimit)) {
+ match = base + matchIndex;
+ if (match[matchLength] == ip[matchLength])
+ matchLength += ZSTD_count(ip + matchLength + 1, match + matchLength + 1, iend) + 1;
+ } else {
+ match = dictBase + matchIndex;
+ matchLength += ZSTD_count_2segments(ip + matchLength, match + matchLength, iend, dictEnd, prefixStart);
+ if (matchIndex + matchLength >= dictLimit)
+ match = base + matchIndex; /* to prepare for next usage of match[matchLength] */
+ }
+
+ if (matchLength > bestLength) {
+ bestLength = matchLength;
+ if (matchLength > matchEndIdx - matchIndex)
+ matchEndIdx = matchIndex + (U32)matchLength;
+ }
+
+ if (ip + matchLength == iend) /* equal : no way to know if inf or sup */
+ break; /* drop , to guarantee consistency ; miss a bit of compression, but other solutions can corrupt the tree */
+
+ if (match[matchLength] < ip[matchLength]) { /* necessarily within correct buffer */
+ /* match is smaller than curr */
+ *smallerPtr = matchIndex; /* update smaller idx */
+ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */
+ if (matchIndex <= btLow) {
+ smallerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ smallerPtr = nextPtr + 1; /* new "smaller" => larger of match */
+ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to curr) */
+ } else {
+ /* match is larger than curr */
+ *largerPtr = matchIndex;
+ commonLengthLarger = matchLength;
+ if (matchIndex <= btLow) {
+ largerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ largerPtr = nextPtr;
+ matchIndex = nextPtr[0];
+ }
+ }
+
+ *smallerPtr = *largerPtr = 0;
+ if (bestLength > 384)
+ return MIN(192, (U32)(bestLength - 384)); /* speed optimization */
+ if (matchEndIdx > curr + 8)
+ return matchEndIdx - curr - 8;
+ return 1;
+}
+
+static size_t ZSTD_insertBtAndFindBestMatch(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iend, size_t *offsetPtr, U32 nbCompares, const U32 mls,
+ U32 extDict)
+{
+ U32 *const hashTable = zc->hashTable;
+ U32 const hashLog = zc->params.cParams.hashLog;
+ size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
+ U32 *const bt = zc->chainTable;
+ U32 const btLog = zc->params.cParams.chainLog - 1;
+ U32 const btMask = (1 << btLog) - 1;
+ U32 matchIndex = hashTable[h];
+ size_t commonLengthSmaller = 0, commonLengthLarger = 0;
+ const BYTE *const base = zc->base;
+ const BYTE *const dictBase = zc->dictBase;
+ const U32 dictLimit = zc->dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const U32 curr = (U32)(ip - base);
+ const U32 btLow = btMask >= curr ? 0 : curr - btMask;
+ const U32 windowLow = zc->lowLimit;
+ U32 *smallerPtr = bt + 2 * (curr & btMask);
+ U32 *largerPtr = bt + 2 * (curr & btMask) + 1;
+ U32 matchEndIdx = curr + 8;
+ U32 dummy32; /* to be nullified at the end */
+ size_t bestLength = 0;
+
+ hashTable[h] = curr; /* Update Hash Table */
+
+ while (nbCompares-- && (matchIndex > windowLow)) {
+ U32 *const nextPtr = bt + 2 * (matchIndex & btMask);
+ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
+ const BYTE *match;
+
+ if ((!extDict) || (matchIndex + matchLength >= dictLimit)) {
+ match = base + matchIndex;
+ if (match[matchLength] == ip[matchLength])
+ matchLength += ZSTD_count(ip + matchLength + 1, match + matchLength + 1, iend) + 1;
+ } else {
+ match = dictBase + matchIndex;
+ matchLength += ZSTD_count_2segments(ip + matchLength, match + matchLength, iend, dictEnd, prefixStart);
+ if (matchIndex + matchLength >= dictLimit)
+ match = base + matchIndex; /* to prepare for next usage of match[matchLength] */
+ }
+
+ if (matchLength > bestLength) {
+ if (matchLength > matchEndIdx - matchIndex)
+ matchEndIdx = matchIndex + (U32)matchLength;
+ if ((4 * (int)(matchLength - bestLength)) > (int)(ZSTD_highbit32(curr - matchIndex + 1) - ZSTD_highbit32((U32)offsetPtr[0] + 1)))
+ bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + curr - matchIndex;
+ if (ip + matchLength == iend) /* equal : no way to know if inf or sup */
+ break; /* drop, to guarantee consistency (miss a little bit of compression) */
+ }
+
+ if (match[matchLength] < ip[matchLength]) {
+ /* match is smaller than curr */
+ *smallerPtr = matchIndex; /* update smaller idx */
+ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */
+ if (matchIndex <= btLow) {
+ smallerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ smallerPtr = nextPtr + 1; /* new "smaller" => larger of match */
+ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to curr) */
+ } else {
+ /* match is larger than curr */
+ *largerPtr = matchIndex;
+ commonLengthLarger = matchLength;
+ if (matchIndex <= btLow) {
+ largerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ largerPtr = nextPtr;
+ matchIndex = nextPtr[0];
+ }
+ }
+
+ *smallerPtr = *largerPtr = 0;
+
+ zc->nextToUpdate = (matchEndIdx > curr + 8) ? matchEndIdx - 8 : curr + 1;
+ return bestLength;
+}
+
+static void ZSTD_updateTree(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iend, const U32 nbCompares, const U32 mls)
+{
+ const BYTE *const base = zc->base;
+ const U32 target = (U32)(ip - base);
+ U32 idx = zc->nextToUpdate;
+
+ while (idx < target)
+ idx += ZSTD_insertBt1(zc, base + idx, mls, iend, nbCompares, 0);
+}
+
+/** ZSTD_BtFindBestMatch() : Tree updater, providing best match */
+static size_t ZSTD_BtFindBestMatch(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts, const U32 mls)
+{
+ if (ip < zc->base + zc->nextToUpdate)
+ return 0; /* skipped area */
+ ZSTD_updateTree(zc, ip, iLimit, maxNbAttempts, mls);
+ return ZSTD_insertBtAndFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, mls, 0);
+}
+
+static size_t ZSTD_BtFindBestMatch_selectMLS(ZSTD_CCtx *zc, /* Index table will be updated */
+ const BYTE *ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts, const U32 matchLengthSearch)
+{
+ switch (matchLengthSearch) {
+ default: /* includes case 3 */
+ case 4: return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4);
+ case 5: return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5);
+ case 7:
+ case 6: return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6);
+ }
+}
+
+static void ZSTD_updateTree_extDict(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iend, const U32 nbCompares, const U32 mls)
+{
+ const BYTE *const base = zc->base;
+ const U32 target = (U32)(ip - base);
+ U32 idx = zc->nextToUpdate;
+
+ while (idx < target)
+ idx += ZSTD_insertBt1(zc, base + idx, mls, iend, nbCompares, 1);
+}
+
+/** Tree updater, providing best match */
+static size_t ZSTD_BtFindBestMatch_extDict(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts,
+ const U32 mls)
+{
+ if (ip < zc->base + zc->nextToUpdate)
+ return 0; /* skipped area */
+ ZSTD_updateTree_extDict(zc, ip, iLimit, maxNbAttempts, mls);
+ return ZSTD_insertBtAndFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, mls, 1);
+}
+
+static size_t ZSTD_BtFindBestMatch_selectMLS_extDict(ZSTD_CCtx *zc, /* Index table will be updated */
+ const BYTE *ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts,
+ const U32 matchLengthSearch)
+{
+ switch (matchLengthSearch) {
+ default: /* includes case 3 */
+ case 4: return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4);
+ case 5: return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5);
+ case 7:
+ case 6: return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6);
+ }
+}
+
+/* *********************************
+* Hash Chain
+***********************************/
+#define NEXT_IN_CHAIN(d, mask) chainTable[(d)&mask]
+
+/* Update chains up to ip (excluded)
+ Assumption : always within prefix (i.e. not within extDict) */
+FORCE_INLINE
+U32 ZSTD_insertAndFindFirstIndex(ZSTD_CCtx *zc, const BYTE *ip, U32 mls)
+{
+ U32 *const hashTable = zc->hashTable;
+ const U32 hashLog = zc->params.cParams.hashLog;
+ U32 *const chainTable = zc->chainTable;
+ const U32 chainMask = (1 << zc->params.cParams.chainLog) - 1;
+ const BYTE *const base = zc->base;
+ const U32 target = (U32)(ip - base);
+ U32 idx = zc->nextToUpdate;
+
+ while (idx < target) { /* catch up */
+ size_t const h = ZSTD_hashPtr(base + idx, hashLog, mls);
+ NEXT_IN_CHAIN(idx, chainMask) = hashTable[h];
+ hashTable[h] = idx;
+ idx++;
+ }
+
+ zc->nextToUpdate = target;
+ return hashTable[ZSTD_hashPtr(ip, hashLog, mls)];
+}
+
+/* inlining is important to hardwire a hot branch (template emulation) */
+FORCE_INLINE
+size_t ZSTD_HcFindBestMatch_generic(ZSTD_CCtx *zc, /* Index table will be updated */
+ const BYTE *const ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts, const U32 mls,
+ const U32 extDict)
+{
+ U32 *const chainTable = zc->chainTable;
+ const U32 chainSize = (1 << zc->params.cParams.chainLog);
+ const U32 chainMask = chainSize - 1;
+ const BYTE *const base = zc->base;
+ const BYTE *const dictBase = zc->dictBase;
+ const U32 dictLimit = zc->dictLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const U32 lowLimit = zc->lowLimit;
+ const U32 curr = (U32)(ip - base);
+ const U32 minChain = curr > chainSize ? curr - chainSize : 0;
+ int nbAttempts = maxNbAttempts;
+ size_t ml = EQUAL_READ32 - 1;
+
+ /* HC4 match finder */
+ U32 matchIndex = ZSTD_insertAndFindFirstIndex(zc, ip, mls);
+
+ for (; (matchIndex > lowLimit) & (nbAttempts > 0); nbAttempts--) {
+ const BYTE *match;
+ size_t currMl = 0;
+ if ((!extDict) || matchIndex >= dictLimit) {
+ match = base + matchIndex;
+ if (match[ml] == ip[ml]) /* potentially better */
+ currMl = ZSTD_count(ip, match, iLimit);
+ } else {
+ match = dictBase + matchIndex;
+ if (ZSTD_read32(match) == ZSTD_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */
+ currMl = ZSTD_count_2segments(ip + EQUAL_READ32, match + EQUAL_READ32, iLimit, dictEnd, prefixStart) + EQUAL_READ32;
+ }
+
+ /* save best solution */
+ if (currMl > ml) {
+ ml = currMl;
+ *offsetPtr = curr - matchIndex + ZSTD_REP_MOVE;
+ if (ip + currMl == iLimit)
+ break; /* best possible, and avoid read overflow*/
+ }
+
+ if (matchIndex <= minChain)
+ break;
+ matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask);
+ }
+
+ return ml;
+}
+
+FORCE_INLINE size_t ZSTD_HcFindBestMatch_selectMLS(ZSTD_CCtx *zc, const BYTE *ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts,
+ const U32 matchLengthSearch)
+{
+ switch (matchLengthSearch) {
+ default: /* includes case 3 */
+ case 4: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4, 0);
+ case 5: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5, 0);
+ case 7:
+ case 6: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6, 0);
+ }
+}
+
+FORCE_INLINE size_t ZSTD_HcFindBestMatch_extDict_selectMLS(ZSTD_CCtx *zc, const BYTE *ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts,
+ const U32 matchLengthSearch)
+{
+ switch (matchLengthSearch) {
+ default: /* includes case 3 */
+ case 4: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4, 1);
+ case 5: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5, 1);
+ case 7:
+ case 6: return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6, 1);
+ }
+}
+
+/* *******************************
+* Common parser - lazy strategy
+*********************************/
+FORCE_INLINE
+void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const U32 searchMethod, const U32 depth)
+{
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ const BYTE *const base = ctx->base + ctx->dictLimit;
+
+ U32 const maxSearches = 1 << ctx->params.cParams.searchLog;
+ U32 const mls = ctx->params.cParams.searchLength;
+
+ typedef size_t (*searchMax_f)(ZSTD_CCtx * zc, const BYTE *ip, const BYTE *iLimit, size_t *offsetPtr, U32 maxNbAttempts, U32 matchLengthSearch);
+ searchMax_f const searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS;
+ U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1], savedOffset = 0;
+
+ /* init */
+ ip += (ip == base);
+ ctx->nextToUpdate3 = ctx->nextToUpdate;
+ {
+ U32 const maxRep = (U32)(ip - base);
+ if (offset_2 > maxRep)
+ savedOffset = offset_2, offset_2 = 0;
+ if (offset_1 > maxRep)
+ savedOffset = offset_1, offset_1 = 0;
+ }
+
+ /* Match Loop */
+ while (ip < ilimit) {
+ size_t matchLength = 0;
+ size_t offset = 0;
+ const BYTE *start = ip + 1;
+
+ /* check repCode */
+ if ((offset_1 > 0) & (ZSTD_read32(ip + 1) == ZSTD_read32(ip + 1 - offset_1))) {
+ /* repcode : we take it */
+ matchLength = ZSTD_count(ip + 1 + EQUAL_READ32, ip + 1 + EQUAL_READ32 - offset_1, iend) + EQUAL_READ32;
+ if (depth == 0)
+ goto _storeSequence;
+ }
+
+ /* first search (depth 0) */
+ {
+ size_t offsetFound = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offsetFound, maxSearches, mls);
+ if (ml2 > matchLength)
+ matchLength = ml2, start = ip, offset = offsetFound;
+ }
+
+ if (matchLength < EQUAL_READ32) {
+ ip += ((ip - anchor) >> g_searchStrength) + 1; /* jump faster over incompressible sections */
+ continue;
+ }
+
+ /* let's try to find a better solution */
+ if (depth >= 1)
+ while (ip < ilimit) {
+ ip++;
+ if ((offset) && ((offset_1 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_1)))) {
+ size_t const mlRep = ZSTD_count(ip + EQUAL_READ32, ip + EQUAL_READ32 - offset_1, iend) + EQUAL_READ32;
+ int const gain2 = (int)(mlRep * 3);
+ int const gain1 = (int)(matchLength * 3 - ZSTD_highbit32((U32)offset + 1) + 1);
+ if ((mlRep >= EQUAL_READ32) && (gain2 > gain1))
+ matchLength = mlRep, offset = 0, start = ip;
+ }
+ {
+ size_t offset2 = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls);
+ int const gain2 = (int)(ml2 * 4 - ZSTD_highbit32((U32)offset2 + 1)); /* raw approx */
+ int const gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 4);
+ if ((ml2 >= EQUAL_READ32) && (gain2 > gain1)) {
+ matchLength = ml2, offset = offset2, start = ip;
+ continue; /* search a better one */
+ }
+ }
+
+ /* let's find an even better one */
+ if ((depth == 2) && (ip < ilimit)) {
+ ip++;
+ if ((offset) && ((offset_1 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_1)))) {
+ size_t const ml2 = ZSTD_count(ip + EQUAL_READ32, ip + EQUAL_READ32 - offset_1, iend) + EQUAL_READ32;
+ int const gain2 = (int)(ml2 * 4);
+ int const gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 1);
+ if ((ml2 >= EQUAL_READ32) && (gain2 > gain1))
+ matchLength = ml2, offset = 0, start = ip;
+ }
+ {
+ size_t offset2 = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls);
+ int const gain2 = (int)(ml2 * 4 - ZSTD_highbit32((U32)offset2 + 1)); /* raw approx */
+ int const gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 7);
+ if ((ml2 >= EQUAL_READ32) && (gain2 > gain1)) {
+ matchLength = ml2, offset = offset2, start = ip;
+ continue;
+ }
+ }
+ }
+ break; /* nothing found : store previous solution */
+ }
+
+ /* NOTE:
+ * start[-offset+ZSTD_REP_MOVE-1] is undefined behavior.
+ * (-offset+ZSTD_REP_MOVE-1) is unsigned, and is added to start, which
+ * overflows the pointer, which is undefined behavior.
+ */
+ /* catch up */
+ if (offset) {
+ while ((start > anchor) && (start > base + offset - ZSTD_REP_MOVE) &&
+ (start[-1] == (start-offset+ZSTD_REP_MOVE)[-1])) /* only search for offset within prefix */
+ {
+ start--;
+ matchLength++;
+ }
+ offset_2 = offset_1;
+ offset_1 = (U32)(offset - ZSTD_REP_MOVE);
+ }
+
+ /* store sequence */
+_storeSequence:
+ {
+ size_t const litLength = start - anchor;
+ ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH);
+ anchor = ip = start + matchLength;
+ }
+
+ /* check immediate repcode */
+ while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) {
+ /* store sequence */
+ matchLength = ZSTD_count(ip + EQUAL_READ32, ip + EQUAL_READ32 - offset_2, iend) + EQUAL_READ32;
+ offset = offset_2;
+ offset_2 = offset_1;
+ offset_1 = (U32)offset; /* swap repcodes */
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength - MINMATCH);
+ ip += matchLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ }
+ }
+
+ /* Save reps for next block */
+ ctx->repToConfirm[0] = offset_1 ? offset_1 : savedOffset;
+ ctx->repToConfirm[1] = offset_2 ? offset_2 : savedOffset;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+static void ZSTD_compressBlock_btlazy2(ZSTD_CCtx *ctx, const void *src, size_t srcSize) { ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 1, 2); }
+
+static void ZSTD_compressBlock_lazy2(ZSTD_CCtx *ctx, const void *src, size_t srcSize) { ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 2); }
+
+static void ZSTD_compressBlock_lazy(ZSTD_CCtx *ctx, const void *src, size_t srcSize) { ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 1); }
+
+static void ZSTD_compressBlock_greedy(ZSTD_CCtx *ctx, const void *src, size_t srcSize) { ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 0); }
+
+FORCE_INLINE
+void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const U32 searchMethod, const U32 depth)
+{
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ const BYTE *const base = ctx->base;
+ const U32 dictLimit = ctx->dictLimit;
+ const U32 lowestIndex = ctx->lowLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const BYTE *const dictBase = ctx->dictBase;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const dictStart = dictBase + ctx->lowLimit;
+
+ const U32 maxSearches = 1 << ctx->params.cParams.searchLog;
+ const U32 mls = ctx->params.cParams.searchLength;
+
+ typedef size_t (*searchMax_f)(ZSTD_CCtx * zc, const BYTE *ip, const BYTE *iLimit, size_t *offsetPtr, U32 maxNbAttempts, U32 matchLengthSearch);
+ searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS_extDict : ZSTD_HcFindBestMatch_extDict_selectMLS;
+
+ U32 offset_1 = ctx->rep[0], offset_2 = ctx->rep[1];
+
+ /* init */
+ ctx->nextToUpdate3 = ctx->nextToUpdate;
+ ip += (ip == prefixStart);
+
+ /* Match Loop */
+ while (ip < ilimit) {
+ size_t matchLength = 0;
+ size_t offset = 0;
+ const BYTE *start = ip + 1;
+ U32 curr = (U32)(ip - base);
+
+ /* check repCode */
+ {
+ const U32 repIndex = (U32)(curr + 1 - offset_1);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ if (ZSTD_read32(ip + 1) == ZSTD_read32(repMatch)) {
+ /* repcode detected we should take it */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ matchLength =
+ ZSTD_count_2segments(ip + 1 + EQUAL_READ32, repMatch + EQUAL_READ32, iend, repEnd, prefixStart) + EQUAL_READ32;
+ if (depth == 0)
+ goto _storeSequence;
+ }
+ }
+
+ /* first search (depth 0) */
+ {
+ size_t offsetFound = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offsetFound, maxSearches, mls);
+ if (ml2 > matchLength)
+ matchLength = ml2, start = ip, offset = offsetFound;
+ }
+
+ if (matchLength < EQUAL_READ32) {
+ ip += ((ip - anchor) >> g_searchStrength) + 1; /* jump faster over incompressible sections */
+ continue;
+ }
+
+ /* let's try to find a better solution */
+ if (depth >= 1)
+ while (ip < ilimit) {
+ ip++;
+ curr++;
+ /* check repCode */
+ if (offset) {
+ const U32 repIndex = (U32)(curr - offset_1);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ if (ZSTD_read32(ip) == ZSTD_read32(repMatch)) {
+ /* repcode detected */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ size_t const repLength =
+ ZSTD_count_2segments(ip + EQUAL_READ32, repMatch + EQUAL_READ32, iend, repEnd, prefixStart) +
+ EQUAL_READ32;
+ int const gain2 = (int)(repLength * 3);
+ int const gain1 = (int)(matchLength * 3 - ZSTD_highbit32((U32)offset + 1) + 1);
+ if ((repLength >= EQUAL_READ32) && (gain2 > gain1))
+ matchLength = repLength, offset = 0, start = ip;
+ }
+ }
+
+ /* search match, depth 1 */
+ {
+ size_t offset2 = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls);
+ int const gain2 = (int)(ml2 * 4 - ZSTD_highbit32((U32)offset2 + 1)); /* raw approx */
+ int const gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 4);
+ if ((ml2 >= EQUAL_READ32) && (gain2 > gain1)) {
+ matchLength = ml2, offset = offset2, start = ip;
+ continue; /* search a better one */
+ }
+ }
+
+ /* let's find an even better one */
+ if ((depth == 2) && (ip < ilimit)) {
+ ip++;
+ curr++;
+ /* check repCode */
+ if (offset) {
+ const U32 repIndex = (U32)(curr - offset_1);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ if (ZSTD_read32(ip) == ZSTD_read32(repMatch)) {
+ /* repcode detected */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ size_t repLength = ZSTD_count_2segments(ip + EQUAL_READ32, repMatch + EQUAL_READ32, iend,
+ repEnd, prefixStart) +
+ EQUAL_READ32;
+ int gain2 = (int)(repLength * 4);
+ int gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 1);
+ if ((repLength >= EQUAL_READ32) && (gain2 > gain1))
+ matchLength = repLength, offset = 0, start = ip;
+ }
+ }
+
+ /* search match, depth 2 */
+ {
+ size_t offset2 = 99999999;
+ size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls);
+ int const gain2 = (int)(ml2 * 4 - ZSTD_highbit32((U32)offset2 + 1)); /* raw approx */
+ int const gain1 = (int)(matchLength * 4 - ZSTD_highbit32((U32)offset + 1) + 7);
+ if ((ml2 >= EQUAL_READ32) && (gain2 > gain1)) {
+ matchLength = ml2, offset = offset2, start = ip;
+ continue;
+ }
+ }
+ }
+ break; /* nothing found : store previous solution */
+ }
+
+ /* catch up */
+ if (offset) {
+ U32 const matchIndex = (U32)((start - base) - (offset - ZSTD_REP_MOVE));
+ const BYTE *match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex;
+ const BYTE *const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart;
+ while ((start > anchor) && (match > mStart) && (start[-1] == match[-1])) {
+ start--;
+ match--;
+ matchLength++;
+ } /* catch up */
+ offset_2 = offset_1;
+ offset_1 = (U32)(offset - ZSTD_REP_MOVE);
+ }
+
+ /* store sequence */
+ _storeSequence : {
+ size_t const litLength = start - anchor;
+ ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH);
+ anchor = ip = start + matchLength;
+ }
+
+ /* check immediate repcode */
+ while (ip <= ilimit) {
+ const U32 repIndex = (U32)((ip - base) - offset_2);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ if (ZSTD_read32(ip) == ZSTD_read32(repMatch)) {
+ /* repcode detected we should take it */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ matchLength =
+ ZSTD_count_2segments(ip + EQUAL_READ32, repMatch + EQUAL_READ32, iend, repEnd, prefixStart) + EQUAL_READ32;
+ offset = offset_2;
+ offset_2 = offset_1;
+ offset_1 = (U32)offset; /* swap offset history */
+ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength - MINMATCH);
+ ip += matchLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ }
+ break;
+ }
+ }
+
+ /* Save reps for next block */
+ ctx->repToConfirm[0] = offset_1;
+ ctx->repToConfirm[1] = offset_2;
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+void ZSTD_compressBlock_greedy_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize) { ZSTD_compressBlock_lazy_extDict_generic(ctx, src, srcSize, 0, 0); }
+
+static void ZSTD_compressBlock_lazy_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ ZSTD_compressBlock_lazy_extDict_generic(ctx, src, srcSize, 0, 1);
+}
+
+static void ZSTD_compressBlock_lazy2_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ ZSTD_compressBlock_lazy_extDict_generic(ctx, src, srcSize, 0, 2);
+}
+
+static void ZSTD_compressBlock_btlazy2_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+ ZSTD_compressBlock_lazy_extDict_generic(ctx, src, srcSize, 1, 2);
+}
+
+/* The optimal parser */
+#include "zstd_opt.h"
+
+static void ZSTD_compressBlock_btopt(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+#ifdef ZSTD_OPT_H_91842398743
+ ZSTD_compressBlock_opt_generic(ctx, src, srcSize, 0);
+#else
+ (void)ctx;
+ (void)src;
+ (void)srcSize;
+ return;
+#endif
+}
+
+static void ZSTD_compressBlock_btopt2(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+#ifdef ZSTD_OPT_H_91842398743
+ ZSTD_compressBlock_opt_generic(ctx, src, srcSize, 1);
+#else
+ (void)ctx;
+ (void)src;
+ (void)srcSize;
+ return;
+#endif
+}
+
+static void ZSTD_compressBlock_btopt_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+#ifdef ZSTD_OPT_H_91842398743
+ ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize, 0);
+#else
+ (void)ctx;
+ (void)src;
+ (void)srcSize;
+ return;
+#endif
+}
+
+static void ZSTD_compressBlock_btopt2_extDict(ZSTD_CCtx *ctx, const void *src, size_t srcSize)
+{
+#ifdef ZSTD_OPT_H_91842398743
+ ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize, 1);
+#else
+ (void)ctx;
+ (void)src;
+ (void)srcSize;
+ return;
+#endif
+}
+
+typedef void (*ZSTD_blockCompressor)(ZSTD_CCtx *ctx, const void *src, size_t srcSize);
+
+static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict)
+{
+ static const ZSTD_blockCompressor blockCompressor[2][8] = {
+ {ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy, ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2,
+ ZSTD_compressBlock_btlazy2, ZSTD_compressBlock_btopt, ZSTD_compressBlock_btopt2},
+ {ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict, ZSTD_compressBlock_lazy_extDict,
+ ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict, ZSTD_compressBlock_btopt_extDict, ZSTD_compressBlock_btopt2_extDict}};
+
+ return blockCompressor[extDict][(U32)strat];
+}
+
+static size_t ZSTD_compressBlock_internal(ZSTD_CCtx *zc, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->params.cParams.strategy, zc->lowLimit < zc->dictLimit);
+ const BYTE *const base = zc->base;
+ const BYTE *const istart = (const BYTE *)src;
+ const U32 curr = (U32)(istart - base);
+ if (srcSize < MIN_CBLOCK_SIZE + ZSTD_blockHeaderSize + 1)
+ return 0; /* don't even attempt compression below a certain srcSize */
+ ZSTD_resetSeqStore(&(zc->seqStore));
+ if (curr > zc->nextToUpdate + 384)
+ zc->nextToUpdate = curr - MIN(192, (U32)(curr - zc->nextToUpdate - 384)); /* update tree not updated after finding very long rep matches */
+ blockCompressor(zc, src, srcSize);
+ return ZSTD_compressSequences(zc, dst, dstCapacity, srcSize);
+}
+
+/*! ZSTD_compress_generic() :
+* Compress a chunk of data into one or multiple blocks.
+* All blocks will be terminated, all input will be consumed.
+* Function will issue an error if there is not enough `dstCapacity` to hold the compressed content.
+* Frame is supposed already started (header already produced)
+* @return : compressed size, or an error code
+*/
+static size_t ZSTD_compress_generic(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, U32 lastFrameChunk)
+{
+ size_t blockSize = cctx->blockSize;
+ size_t remaining = srcSize;
+ const BYTE *ip = (const BYTE *)src;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *op = ostart;
+ U32 const maxDist = 1 << cctx->params.cParams.windowLog;
+
+ if (cctx->params.fParams.checksumFlag && srcSize)
+ xxh64_update(&cctx->xxhState, src, srcSize);
+
+ while (remaining) {
+ U32 const lastBlock = lastFrameChunk & (blockSize >= remaining);
+ size_t cSize;
+
+ if (dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE)
+ return ERROR(dstSize_tooSmall); /* not enough space to store compressed block */
+ if (remaining < blockSize)
+ blockSize = remaining;
+
+ /* preemptive overflow correction */
+ if (cctx->lowLimit > (3U << 29)) {
+ U32 const cycleMask = (1 << ZSTD_cycleLog(cctx->params.cParams.hashLog, cctx->params.cParams.strategy)) - 1;
+ U32 const curr = (U32)(ip - cctx->base);
+ U32 const newCurr = (curr & cycleMask) + (1 << cctx->params.cParams.windowLog);
+ U32 const correction = curr - newCurr;
+ ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_64 <= 30);
+ ZSTD_reduceIndex(cctx, correction);
+ cctx->base += correction;
+ cctx->dictBase += correction;
+ cctx->lowLimit -= correction;
+ cctx->dictLimit -= correction;
+ if (cctx->nextToUpdate < correction)
+ cctx->nextToUpdate = 0;
+ else
+ cctx->nextToUpdate -= correction;
+ }
+
+ if ((U32)(ip + blockSize - cctx->base) > cctx->loadedDictEnd + maxDist) {
+ /* enforce maxDist */
+ U32 const newLowLimit = (U32)(ip + blockSize - cctx->base) - maxDist;
+ if (cctx->lowLimit < newLowLimit)
+ cctx->lowLimit = newLowLimit;
+ if (cctx->dictLimit < cctx->lowLimit)
+ cctx->dictLimit = cctx->lowLimit;
+ }
+
+ cSize = ZSTD_compressBlock_internal(cctx, op + ZSTD_blockHeaderSize, dstCapacity - ZSTD_blockHeaderSize, ip, blockSize);
+ if (ZSTD_isError(cSize))
+ return cSize;
+
+ if (cSize == 0) { /* block is not compressible */
+ U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw) << 1) + (U32)(blockSize << 3);
+ if (blockSize + ZSTD_blockHeaderSize > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+ ZSTD_writeLE32(op, cBlockHeader24); /* no pb, 4th byte will be overwritten */
+ memcpy(op + ZSTD_blockHeaderSize, ip, blockSize);
+ cSize = ZSTD_blockHeaderSize + blockSize;
+ } else {
+ U32 const cBlockHeader24 = lastBlock + (((U32)bt_compressed) << 1) + (U32)(cSize << 3);
+ ZSTD_writeLE24(op, cBlockHeader24);
+ cSize += ZSTD_blockHeaderSize;
+ }
+
+ remaining -= blockSize;
+ dstCapacity -= cSize;
+ ip += blockSize;
+ op += cSize;
+ }
+
+ if (lastFrameChunk && (op > ostart))
+ cctx->stage = ZSTDcs_ending;
+ return op - ostart;
+}
+
+static size_t ZSTD_writeFrameHeader(void *dst, size_t dstCapacity, ZSTD_parameters params, U64 pledgedSrcSize, U32 dictID)
+{
+ BYTE *const op = (BYTE *)dst;
+ U32 const dictIDSizeCode = (dictID > 0) + (dictID >= 256) + (dictID >= 65536); /* 0-3 */
+ U32 const checksumFlag = params.fParams.checksumFlag > 0;
+ U32 const windowSize = 1U << params.cParams.windowLog;
+ U32 const singleSegment = params.fParams.contentSizeFlag && (windowSize >= pledgedSrcSize);
+ BYTE const windowLogByte = (BYTE)((params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
+ U32 const fcsCode =
+ params.fParams.contentSizeFlag ? (pledgedSrcSize >= 256) + (pledgedSrcSize >= 65536 + 256) + (pledgedSrcSize >= 0xFFFFFFFFU) : 0; /* 0-3 */
+ BYTE const frameHeaderDecriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag << 2) + (singleSegment << 5) + (fcsCode << 6));
+ size_t pos;
+
+ if (dstCapacity < ZSTD_frameHeaderSize_max)
+ return ERROR(dstSize_tooSmall);
+
+ ZSTD_writeLE32(dst, ZSTD_MAGICNUMBER);
+ op[4] = frameHeaderDecriptionByte;
+ pos = 5;
+ if (!singleSegment)
+ op[pos++] = windowLogByte;
+ switch (dictIDSizeCode) {
+ default: /* impossible */
+ case 0: break;
+ case 1:
+ op[pos] = (BYTE)(dictID);
+ pos++;
+ break;
+ case 2:
+ ZSTD_writeLE16(op + pos, (U16)dictID);
+ pos += 2;
+ break;
+ case 3:
+ ZSTD_writeLE32(op + pos, dictID);
+ pos += 4;
+ break;
+ }
+ switch (fcsCode) {
+ default: /* impossible */
+ case 0:
+ if (singleSegment)
+ op[pos++] = (BYTE)(pledgedSrcSize);
+ break;
+ case 1:
+ ZSTD_writeLE16(op + pos, (U16)(pledgedSrcSize - 256));
+ pos += 2;
+ break;
+ case 2:
+ ZSTD_writeLE32(op + pos, (U32)(pledgedSrcSize));
+ pos += 4;
+ break;
+ case 3:
+ ZSTD_writeLE64(op + pos, (U64)(pledgedSrcSize));
+ pos += 8;
+ break;
+ }
+ return pos;
+}
+
+static size_t ZSTD_compressContinue_internal(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, U32 frame, U32 lastFrameChunk)
+{
+ const BYTE *const ip = (const BYTE *)src;
+ size_t fhSize = 0;
+
+ if (cctx->stage == ZSTDcs_created)
+ return ERROR(stage_wrong); /* missing init (ZSTD_compressBegin) */
+
+ if (frame && (cctx->stage == ZSTDcs_init)) {
+ fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->params, cctx->frameContentSize, cctx->dictID);
+ if (ZSTD_isError(fhSize))
+ return fhSize;
+ dstCapacity -= fhSize;
+ dst = (char *)dst + fhSize;
+ cctx->stage = ZSTDcs_ongoing;
+ }
+
+ /* Check if blocks follow each other */
+ if (src != cctx->nextSrc) {
+ /* not contiguous */
+ ptrdiff_t const delta = cctx->nextSrc - ip;
+ cctx->lowLimit = cctx->dictLimit;
+ cctx->dictLimit = (U32)(cctx->nextSrc - cctx->base);
+ cctx->dictBase = cctx->base;
+ cctx->base -= delta;
+ cctx->nextToUpdate = cctx->dictLimit;
+ if (cctx->dictLimit - cctx->lowLimit < HASH_READ_SIZE)
+ cctx->lowLimit = cctx->dictLimit; /* too small extDict */
+ }
+
+ /* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */
+ if ((ip + srcSize > cctx->dictBase + cctx->lowLimit) & (ip < cctx->dictBase + cctx->dictLimit)) {
+ ptrdiff_t const highInputIdx = (ip + srcSize) - cctx->dictBase;
+ U32 const lowLimitMax = (highInputIdx > (ptrdiff_t)cctx->dictLimit) ? cctx->dictLimit : (U32)highInputIdx;
+ cctx->lowLimit = lowLimitMax;
+ }
+
+ cctx->nextSrc = ip + srcSize;
+
+ if (srcSize) {
+ size_t const cSize = frame ? ZSTD_compress_generic(cctx, dst, dstCapacity, src, srcSize, lastFrameChunk)
+ : ZSTD_compressBlock_internal(cctx, dst, dstCapacity, src, srcSize);
+ if (ZSTD_isError(cSize))
+ return cSize;
+ return cSize + fhSize;
+ } else
+ return fhSize;
+}
+
+size_t ZSTD_compressContinue(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1, 0);
+}
+
+size_t ZSTD_getBlockSizeMax(ZSTD_CCtx *cctx) { return MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, 1 << cctx->params.cParams.windowLog); }
+
+size_t ZSTD_compressBlock(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t const blockSizeMax = ZSTD_getBlockSizeMax(cctx);
+ if (srcSize > blockSizeMax)
+ return ERROR(srcSize_wrong);
+ return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0, 0);
+}
+
+/*! ZSTD_loadDictionaryContent() :
+ * @return : 0, or an error code
+ */
+static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx *zc, const void *src, size_t srcSize)
+{
+ const BYTE *const ip = (const BYTE *)src;
+ const BYTE *const iend = ip + srcSize;
+
+ /* input becomes curr prefix */
+ zc->lowLimit = zc->dictLimit;
+ zc->dictLimit = (U32)(zc->nextSrc - zc->base);
+ zc->dictBase = zc->base;
+ zc->base += ip - zc->nextSrc;
+ zc->nextToUpdate = zc->dictLimit;
+ zc->loadedDictEnd = zc->forceWindow ? 0 : (U32)(iend - zc->base);
+
+ zc->nextSrc = iend;
+ if (srcSize <= HASH_READ_SIZE)
+ return 0;
+
+ switch (zc->params.cParams.strategy) {
+ case ZSTD_fast: ZSTD_fillHashTable(zc, iend, zc->params.cParams.searchLength); break;
+
+ case ZSTD_dfast: ZSTD_fillDoubleHashTable(zc, iend, zc->params.cParams.searchLength); break;
+
+ case ZSTD_greedy:
+ case ZSTD_lazy:
+ case ZSTD_lazy2:
+ if (srcSize >= HASH_READ_SIZE)
+ ZSTD_insertAndFindFirstIndex(zc, iend - HASH_READ_SIZE, zc->params.cParams.searchLength);
+ break;
+
+ case ZSTD_btlazy2:
+ case ZSTD_btopt:
+ case ZSTD_btopt2:
+ if (srcSize >= HASH_READ_SIZE)
+ ZSTD_updateTree(zc, iend - HASH_READ_SIZE, iend, 1 << zc->params.cParams.searchLog, zc->params.cParams.searchLength);
+ break;
+
+ default:
+ return ERROR(GENERIC); /* strategy doesn't exist; impossible */
+ }
+
+ zc->nextToUpdate = (U32)(iend - zc->base);
+ return 0;
+}
+
+/* Dictionaries that assign zero probability to symbols that show up causes problems
+ when FSE encoding. Refuse dictionaries that assign zero probability to symbols
+ that we may encounter during compression.
+ NOTE: This behavior is not standard and could be improved in the future. */
+static size_t ZSTD_checkDictNCount(short *normalizedCounter, unsigned dictMaxSymbolValue, unsigned maxSymbolValue)
+{
+ U32 s;
+ if (dictMaxSymbolValue < maxSymbolValue)
+ return ERROR(dictionary_corrupted);
+ for (s = 0; s <= maxSymbolValue; ++s) {
+ if (normalizedCounter[s] == 0)
+ return ERROR(dictionary_corrupted);
+ }
+ return 0;
+}
+
+/* Dictionary format :
+ * See :
+ * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#dictionary-format
+ */
+/*! ZSTD_loadZstdDictionary() :
+ * @return : 0, or an error code
+ * assumptions : magic number supposed already checked
+ * dictSize supposed > 8
+ */
+static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx *cctx, const void *dict, size_t dictSize)
+{
+ const BYTE *dictPtr = (const BYTE *)dict;
+ const BYTE *const dictEnd = dictPtr + dictSize;
+ short offcodeNCount[MaxOff + 1];
+ unsigned offcodeMaxValue = MaxOff;
+
+ dictPtr += 4; /* skip magic number */
+ cctx->dictID = cctx->params.fParams.noDictIDFlag ? 0 : ZSTD_readLE32(dictPtr);
+ dictPtr += 4;
+
+ {
+ size_t const hufHeaderSize = HUF_readCTable_wksp(cctx->hufTable, 255, dictPtr, dictEnd - dictPtr, cctx->tmpCounters, sizeof(cctx->tmpCounters));
+ if (HUF_isError(hufHeaderSize))
+ return ERROR(dictionary_corrupted);
+ dictPtr += hufHeaderSize;
+ }
+
+ {
+ unsigned offcodeLog;
+ size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(offcodeHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (offcodeLog > OffFSELog)
+ return ERROR(dictionary_corrupted);
+ /* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
+ CHECK_E(FSE_buildCTable_wksp(cctx->offcodeCTable, offcodeNCount, offcodeMaxValue, offcodeLog, cctx->tmpCounters, sizeof(cctx->tmpCounters)),
+ dictionary_corrupted);
+ dictPtr += offcodeHeaderSize;
+ }
+
+ {
+ short matchlengthNCount[MaxML + 1];
+ unsigned matchlengthMaxValue = MaxML, matchlengthLog;
+ size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(matchlengthHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (matchlengthLog > MLFSELog)
+ return ERROR(dictionary_corrupted);
+ /* Every match length code must have non-zero probability */
+ CHECK_F(ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
+ CHECK_E(
+ FSE_buildCTable_wksp(cctx->matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, cctx->tmpCounters, sizeof(cctx->tmpCounters)),
+ dictionary_corrupted);
+ dictPtr += matchlengthHeaderSize;
+ }
+
+ {
+ short litlengthNCount[MaxLL + 1];
+ unsigned litlengthMaxValue = MaxLL, litlengthLog;
+ size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(litlengthHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (litlengthLog > LLFSELog)
+ return ERROR(dictionary_corrupted);
+ /* Every literal length code must have non-zero probability */
+ CHECK_F(ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
+ CHECK_E(FSE_buildCTable_wksp(cctx->litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog, cctx->tmpCounters, sizeof(cctx->tmpCounters)),
+ dictionary_corrupted);
+ dictPtr += litlengthHeaderSize;
+ }
+
+ if (dictPtr + 12 > dictEnd)
+ return ERROR(dictionary_corrupted);
+ cctx->rep[0] = ZSTD_readLE32(dictPtr + 0);
+ cctx->rep[1] = ZSTD_readLE32(dictPtr + 4);
+ cctx->rep[2] = ZSTD_readLE32(dictPtr + 8);
+ dictPtr += 12;
+
+ {
+ size_t const dictContentSize = (size_t)(dictEnd - dictPtr);
+ U32 offcodeMax = MaxOff;
+ if (dictContentSize <= ((U32)-1) - 128 KB) {
+ U32 const maxOffset = (U32)dictContentSize + 128 KB; /* The maximum offset that must be supported */
+ offcodeMax = ZSTD_highbit32(maxOffset); /* Calculate minimum offset code required to represent maxOffset */
+ }
+ /* All offset values <= dictContentSize + 128 KB must be representable */
+ CHECK_F(ZSTD_checkDictNCount(offcodeNCount, offcodeMaxValue, MIN(offcodeMax, MaxOff)));
+ /* All repCodes must be <= dictContentSize and != 0*/
+ {
+ U32 u;
+ for (u = 0; u < 3; u++) {
+ if (cctx->rep[u] == 0)
+ return ERROR(dictionary_corrupted);
+ if (cctx->rep[u] > dictContentSize)
+ return ERROR(dictionary_corrupted);
+ }
+ }
+
+ cctx->flagStaticTables = 1;
+ cctx->flagStaticHufTable = HUF_repeat_valid;
+ return ZSTD_loadDictionaryContent(cctx, dictPtr, dictContentSize);
+ }
+}
+
+/** ZSTD_compress_insertDictionary() :
+* @return : 0, or an error code */
+static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx *cctx, const void *dict, size_t dictSize)
+{
+ if ((dict == NULL) || (dictSize <= 8))
+ return 0;
+
+ /* dict as pure content */
+ if ((ZSTD_readLE32(dict) != ZSTD_DICT_MAGIC) || (cctx->forceRawDict))
+ return ZSTD_loadDictionaryContent(cctx, dict, dictSize);
+
+ /* dict as zstd dictionary */
+ return ZSTD_loadZstdDictionary(cctx, dict, dictSize);
+}
+
+/*! ZSTD_compressBegin_internal() :
+* @return : 0, or an error code */
+static size_t ZSTD_compressBegin_internal(ZSTD_CCtx *cctx, const void *dict, size_t dictSize, ZSTD_parameters params, U64 pledgedSrcSize)
+{
+ ZSTD_compResetPolicy_e const crp = dictSize ? ZSTDcrp_fullReset : ZSTDcrp_continue;
+ CHECK_F(ZSTD_resetCCtx_advanced(cctx, params, pledgedSrcSize, crp));
+ return ZSTD_compress_insertDictionary(cctx, dict, dictSize);
+}
+
+/*! ZSTD_compressBegin_advanced() :
+* @return : 0, or an error code */
+size_t ZSTD_compressBegin_advanced(ZSTD_CCtx *cctx, const void *dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize)
+{
+ /* compression parameters verification and optimization */
+ CHECK_F(ZSTD_checkCParams(params.cParams));
+ return ZSTD_compressBegin_internal(cctx, dict, dictSize, params, pledgedSrcSize);
+}
+
+size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx *cctx, const void *dict, size_t dictSize, int compressionLevel)
+{
+ ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
+ return ZSTD_compressBegin_internal(cctx, dict, dictSize, params, 0);
+}
+
+size_t ZSTD_compressBegin(ZSTD_CCtx *cctx, int compressionLevel) { return ZSTD_compressBegin_usingDict(cctx, NULL, 0, compressionLevel); }
+
+/*! ZSTD_writeEpilogue() :
+* Ends a frame.
+* @return : nb of bytes written into dst (or an error code) */
+static size_t ZSTD_writeEpilogue(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity)
+{
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *op = ostart;
+ size_t fhSize = 0;
+
+ if (cctx->stage == ZSTDcs_created)
+ return ERROR(stage_wrong); /* init missing */
+
+ /* special case : empty frame */
+ if (cctx->stage == ZSTDcs_init) {
+ fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->params, 0, 0);
+ if (ZSTD_isError(fhSize))
+ return fhSize;
+ dstCapacity -= fhSize;
+ op += fhSize;
+ cctx->stage = ZSTDcs_ongoing;
+ }
+
+ if (cctx->stage != ZSTDcs_ending) {
+ /* write one last empty block, make it the "last" block */
+ U32 const cBlockHeader24 = 1 /* last block */ + (((U32)bt_raw) << 1) + 0;
+ if (dstCapacity < 4)
+ return ERROR(dstSize_tooSmall);
+ ZSTD_writeLE32(op, cBlockHeader24);
+ op += ZSTD_blockHeaderSize;
+ dstCapacity -= ZSTD_blockHeaderSize;
+ }
+
+ if (cctx->params.fParams.checksumFlag) {
+ U32 const checksum = (U32)xxh64_digest(&cctx->xxhState);
+ if (dstCapacity < 4)
+ return ERROR(dstSize_tooSmall);
+ ZSTD_writeLE32(op, checksum);
+ op += 4;
+ }
+
+ cctx->stage = ZSTDcs_created; /* return to "created but no init" status */
+ return op - ostart;
+}
+
+size_t ZSTD_compressEnd(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t endResult;
+ size_t const cSize = ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1, 1);
+ if (ZSTD_isError(cSize))
+ return cSize;
+ endResult = ZSTD_writeEpilogue(cctx, (char *)dst + cSize, dstCapacity - cSize);
+ if (ZSTD_isError(endResult))
+ return endResult;
+ return cSize + endResult;
+}
+
+static size_t ZSTD_compress_internal(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize,
+ ZSTD_parameters params)
+{
+ CHECK_F(ZSTD_compressBegin_internal(cctx, dict, dictSize, params, srcSize));
+ return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
+}
+
+size_t ZSTD_compress_usingDict(ZSTD_CCtx *ctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize,
+ ZSTD_parameters params)
+{
+ return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
+}
+
+size_t ZSTD_compressCCtx(ZSTD_CCtx *ctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, ZSTD_parameters params)
+{
+ return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, NULL, 0, params);
+}
+
+/* ===== Dictionary API ===== */
+
+struct ZSTD_CDict_s {
+ void *dictBuffer;
+ const void *dictContent;
+ size_t dictContentSize;
+ ZSTD_CCtx *refContext;
+}; /* typedef'd tp ZSTD_CDict within "zstd.h" */
+
+size_t ZSTD_CDictWorkspaceBound(ZSTD_compressionParameters cParams) { return ZSTD_CCtxWorkspaceBound(cParams) + ZSTD_ALIGN(sizeof(ZSTD_CDict)); }
+
+static ZSTD_CDict *ZSTD_createCDict_advanced(const void *dictBuffer, size_t dictSize, unsigned byReference, ZSTD_parameters params, ZSTD_customMem customMem)
+{
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+
+ {
+ ZSTD_CDict *const cdict = (ZSTD_CDict *)ZSTD_malloc(sizeof(ZSTD_CDict), customMem);
+ ZSTD_CCtx *const cctx = ZSTD_createCCtx_advanced(customMem);
+
+ if (!cdict || !cctx) {
+ ZSTD_free(cdict, customMem);
+ ZSTD_freeCCtx(cctx);
+ return NULL;
+ }
+
+ if ((byReference) || (!dictBuffer) || (!dictSize)) {
+ cdict->dictBuffer = NULL;
+ cdict->dictContent = dictBuffer;
+ } else {
+ void *const internalBuffer = ZSTD_malloc(dictSize, customMem);
+ if (!internalBuffer) {
+ ZSTD_free(cctx, customMem);
+ ZSTD_free(cdict, customMem);
+ return NULL;
+ }
+ memcpy(internalBuffer, dictBuffer, dictSize);
+ cdict->dictBuffer = internalBuffer;
+ cdict->dictContent = internalBuffer;
+ }
+
+ {
+ size_t const errorCode = ZSTD_compressBegin_advanced(cctx, cdict->dictContent, dictSize, params, 0);
+ if (ZSTD_isError(errorCode)) {
+ ZSTD_free(cdict->dictBuffer, customMem);
+ ZSTD_free(cdict, customMem);
+ ZSTD_freeCCtx(cctx);
+ return NULL;
+ }
+ }
+
+ cdict->refContext = cctx;
+ cdict->dictContentSize = dictSize;
+ return cdict;
+ }
+}
+
+ZSTD_CDict *ZSTD_initCDict(const void *dict, size_t dictSize, ZSTD_parameters params, void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ return ZSTD_createCDict_advanced(dict, dictSize, 1, params, stackMem);
+}
+
+size_t ZSTD_freeCDict(ZSTD_CDict *cdict)
+{
+ if (cdict == NULL)
+ return 0; /* support free on NULL */
+ {
+ ZSTD_customMem const cMem = cdict->refContext->customMem;
+ ZSTD_freeCCtx(cdict->refContext);
+ ZSTD_free(cdict->dictBuffer, cMem);
+ ZSTD_free(cdict, cMem);
+ return 0;
+ }
+}
+
+static ZSTD_parameters ZSTD_getParamsFromCDict(const ZSTD_CDict *cdict) { return ZSTD_getParamsFromCCtx(cdict->refContext); }
+
+size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx *cctx, const ZSTD_CDict *cdict, unsigned long long pledgedSrcSize)
+{
+ if (cdict->dictContentSize)
+ CHECK_F(ZSTD_copyCCtx(cctx, cdict->refContext, pledgedSrcSize))
+ else {
+ ZSTD_parameters params = cdict->refContext->params;
+ params.fParams.contentSizeFlag = (pledgedSrcSize > 0);
+ CHECK_F(ZSTD_compressBegin_advanced(cctx, NULL, 0, params, pledgedSrcSize));
+ }
+ return 0;
+}
+
+/*! ZSTD_compress_usingCDict() :
+* Compression using a digested Dictionary.
+* Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times.
+* Note that compression level is decided during dictionary creation */
+size_t ZSTD_compress_usingCDict(ZSTD_CCtx *cctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const ZSTD_CDict *cdict)
+{
+ CHECK_F(ZSTD_compressBegin_usingCDict(cctx, cdict, srcSize));
+
+ if (cdict->refContext->params.fParams.contentSizeFlag == 1) {
+ cctx->params.fParams.contentSizeFlag = 1;
+ cctx->frameContentSize = srcSize;
+ } else {
+ cctx->params.fParams.contentSizeFlag = 0;
+ }
+
+ return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
+}
+
+/* ******************************************************************
+* Streaming
+********************************************************************/
+
+typedef enum { zcss_init, zcss_load, zcss_flush, zcss_final } ZSTD_cStreamStage;
+
+struct ZSTD_CStream_s {
+ ZSTD_CCtx *cctx;
+ ZSTD_CDict *cdictLocal;
+ const ZSTD_CDict *cdict;
+ char *inBuff;
+ size_t inBuffSize;
+ size_t inToCompress;
+ size_t inBuffPos;
+ size_t inBuffTarget;
+ size_t blockSize;
+ char *outBuff;
+ size_t outBuffSize;
+ size_t outBuffContentSize;
+ size_t outBuffFlushedSize;
+ ZSTD_cStreamStage stage;
+ U32 checksum;
+ U32 frameEnded;
+ U64 pledgedSrcSize;
+ U64 inputProcessed;
+ ZSTD_parameters params;
+ ZSTD_customMem customMem;
+}; /* typedef'd to ZSTD_CStream within "zstd.h" */
+
+size_t ZSTD_CStreamWorkspaceBound(ZSTD_compressionParameters cParams)
+{
+ size_t const inBuffSize = (size_t)1 << cParams.windowLog;
+ size_t const blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, inBuffSize);
+ size_t const outBuffSize = ZSTD_compressBound(blockSize) + 1;
+
+ return ZSTD_CCtxWorkspaceBound(cParams) + ZSTD_ALIGN(sizeof(ZSTD_CStream)) + ZSTD_ALIGN(inBuffSize) + ZSTD_ALIGN(outBuffSize);
+}
+
+ZSTD_CStream *ZSTD_createCStream_advanced(ZSTD_customMem customMem)
+{
+ ZSTD_CStream *zcs;
+
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+
+ zcs = (ZSTD_CStream *)ZSTD_malloc(sizeof(ZSTD_CStream), customMem);
+ if (zcs == NULL)
+ return NULL;
+ memset(zcs, 0, sizeof(ZSTD_CStream));
+ memcpy(&zcs->customMem, &customMem, sizeof(ZSTD_customMem));
+ zcs->cctx = ZSTD_createCCtx_advanced(customMem);
+ if (zcs->cctx == NULL) {
+ ZSTD_freeCStream(zcs);
+ return NULL;
+ }
+ return zcs;
+}
+
+size_t ZSTD_freeCStream(ZSTD_CStream *zcs)
+{
+ if (zcs == NULL)
+ return 0; /* support free on NULL */
+ {
+ ZSTD_customMem const cMem = zcs->customMem;
+ ZSTD_freeCCtx(zcs->cctx);
+ zcs->cctx = NULL;
+ ZSTD_freeCDict(zcs->cdictLocal);
+ zcs->cdictLocal = NULL;
+ ZSTD_free(zcs->inBuff, cMem);
+ zcs->inBuff = NULL;
+ ZSTD_free(zcs->outBuff, cMem);
+ zcs->outBuff = NULL;
+ ZSTD_free(zcs, cMem);
+ return 0;
+ }
+}
+
+/*====== Initialization ======*/
+
+size_t ZSTD_CStreamInSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX; }
+size_t ZSTD_CStreamOutSize(void) { return ZSTD_compressBound(ZSTD_BLOCKSIZE_ABSOLUTEMAX) + ZSTD_blockHeaderSize + 4 /* 32-bits hash */; }
+
+static size_t ZSTD_resetCStream_internal(ZSTD_CStream *zcs, unsigned long long pledgedSrcSize)
+{
+ if (zcs->inBuffSize == 0)
+ return ERROR(stage_wrong); /* zcs has not been init at least once => can't reset */
+
+ if (zcs->cdict)
+ CHECK_F(ZSTD_compressBegin_usingCDict(zcs->cctx, zcs->cdict, pledgedSrcSize))
+ else
+ CHECK_F(ZSTD_compressBegin_advanced(zcs->cctx, NULL, 0, zcs->params, pledgedSrcSize));
+
+ zcs->inToCompress = 0;
+ zcs->inBuffPos = 0;
+ zcs->inBuffTarget = zcs->blockSize;
+ zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
+ zcs->stage = zcss_load;
+ zcs->frameEnded = 0;
+ zcs->pledgedSrcSize = pledgedSrcSize;
+ zcs->inputProcessed = 0;
+ return 0; /* ready to go */
+}
+
+size_t ZSTD_resetCStream(ZSTD_CStream *zcs, unsigned long long pledgedSrcSize)
+{
+
+ zcs->params.fParams.contentSizeFlag = (pledgedSrcSize > 0);
+
+ return ZSTD_resetCStream_internal(zcs, pledgedSrcSize);
+}
+
+static size_t ZSTD_initCStream_advanced(ZSTD_CStream *zcs, const void *dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize)
+{
+ /* allocate buffers */
+ {
+ size_t const neededInBuffSize = (size_t)1 << params.cParams.windowLog;
+ if (zcs->inBuffSize < neededInBuffSize) {
+ zcs->inBuffSize = neededInBuffSize;
+ ZSTD_free(zcs->inBuff, zcs->customMem);
+ zcs->inBuff = (char *)ZSTD_malloc(neededInBuffSize, zcs->customMem);
+ if (zcs->inBuff == NULL)
+ return ERROR(memory_allocation);
+ }
+ zcs->blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, neededInBuffSize);
+ }
+ if (zcs->outBuffSize < ZSTD_compressBound(zcs->blockSize) + 1) {
+ zcs->outBuffSize = ZSTD_compressBound(zcs->blockSize) + 1;
+ ZSTD_free(zcs->outBuff, zcs->customMem);
+ zcs->outBuff = (char *)ZSTD_malloc(zcs->outBuffSize, zcs->customMem);
+ if (zcs->outBuff == NULL)
+ return ERROR(memory_allocation);
+ }
+
+ if (dict && dictSize >= 8) {
+ ZSTD_freeCDict(zcs->cdictLocal);
+ zcs->cdictLocal = ZSTD_createCDict_advanced(dict, dictSize, 0, params, zcs->customMem);
+ if (zcs->cdictLocal == NULL)
+ return ERROR(memory_allocation);
+ zcs->cdict = zcs->cdictLocal;
+ } else
+ zcs->cdict = NULL;
+
+ zcs->checksum = params.fParams.checksumFlag > 0;
+ zcs->params = params;
+
+ return ZSTD_resetCStream_internal(zcs, pledgedSrcSize);
+}
+
+ZSTD_CStream *ZSTD_initCStream(ZSTD_parameters params, unsigned long long pledgedSrcSize, void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ ZSTD_CStream *const zcs = ZSTD_createCStream_advanced(stackMem);
+ if (zcs) {
+ size_t const code = ZSTD_initCStream_advanced(zcs, NULL, 0, params, pledgedSrcSize);
+ if (ZSTD_isError(code)) {
+ return NULL;
+ }
+ }
+ return zcs;
+}
+
+ZSTD_CStream *ZSTD_initCStream_usingCDict(const ZSTD_CDict *cdict, unsigned long long pledgedSrcSize, void *workspace, size_t workspaceSize)
+{
+ ZSTD_parameters const params = ZSTD_getParamsFromCDict(cdict);
+ ZSTD_CStream *const zcs = ZSTD_initCStream(params, pledgedSrcSize, workspace, workspaceSize);
+ if (zcs) {
+ zcs->cdict = cdict;
+ if (ZSTD_isError(ZSTD_resetCStream_internal(zcs, pledgedSrcSize))) {
+ return NULL;
+ }
+ }
+ return zcs;
+}
+
+/*====== Compression ======*/
+
+typedef enum { zsf_gather, zsf_flush, zsf_end } ZSTD_flush_e;
+
+ZSTD_STATIC size_t ZSTD_limitCopy(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t const length = MIN(dstCapacity, srcSize);
+ memcpy(dst, src, length);
+ return length;
+}
+
+static size_t ZSTD_compressStream_generic(ZSTD_CStream *zcs, void *dst, size_t *dstCapacityPtr, const void *src, size_t *srcSizePtr, ZSTD_flush_e const flush)
+{
+ U32 someMoreWork = 1;
+ const char *const istart = (const char *)src;
+ const char *const iend = istart + *srcSizePtr;
+ const char *ip = istart;
+ char *const ostart = (char *)dst;
+ char *const oend = ostart + *dstCapacityPtr;
+ char *op = ostart;
+
+ while (someMoreWork) {
+ switch (zcs->stage) {
+ case zcss_init:
+ return ERROR(init_missing); /* call ZBUFF_compressInit() first ! */
+
+ case zcss_load:
+ /* complete inBuffer */
+ {
+ size_t const toLoad = zcs->inBuffTarget - zcs->inBuffPos;
+ size_t const loaded = ZSTD_limitCopy(zcs->inBuff + zcs->inBuffPos, toLoad, ip, iend - ip);
+ zcs->inBuffPos += loaded;
+ ip += loaded;
+ if ((zcs->inBuffPos == zcs->inToCompress) || (!flush && (toLoad != loaded))) {
+ someMoreWork = 0;
+ break; /* not enough input to get a full block : stop there, wait for more */
+ }
+ }
+ /* compress curr block (note : this stage cannot be stopped in the middle) */
+ {
+ void *cDst;
+ size_t cSize;
+ size_t const iSize = zcs->inBuffPos - zcs->inToCompress;
+ size_t oSize = oend - op;
+ if (oSize >= ZSTD_compressBound(iSize))
+ cDst = op; /* compress directly into output buffer (avoid flush stage) */
+ else
+ cDst = zcs->outBuff, oSize = zcs->outBuffSize;
+ cSize = (flush == zsf_end) ? ZSTD_compressEnd(zcs->cctx, cDst, oSize, zcs->inBuff + zcs->inToCompress, iSize)
+ : ZSTD_compressContinue(zcs->cctx, cDst, oSize, zcs->inBuff + zcs->inToCompress, iSize);
+ if (ZSTD_isError(cSize))
+ return cSize;
+ if (flush == zsf_end)
+ zcs->frameEnded = 1;
+ /* prepare next block */
+ zcs->inBuffTarget = zcs->inBuffPos + zcs->blockSize;
+ if (zcs->inBuffTarget > zcs->inBuffSize)
+ zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize; /* note : inBuffSize >= blockSize */
+ zcs->inToCompress = zcs->inBuffPos;
+ if (cDst == op) {
+ op += cSize;
+ break;
+ } /* no need to flush */
+ zcs->outBuffContentSize = cSize;
+ zcs->outBuffFlushedSize = 0;
+ zcs->stage = zcss_flush; /* pass-through to flush stage */
+ }
+
+ case zcss_flush: {
+ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
+ size_t const flushed = ZSTD_limitCopy(op, oend - op, zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
+ op += flushed;
+ zcs->outBuffFlushedSize += flushed;
+ if (toFlush != flushed) {
+ someMoreWork = 0;
+ break;
+ } /* dst too small to store flushed data : stop there */
+ zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
+ zcs->stage = zcss_load;
+ break;
+ }
+
+ case zcss_final:
+ someMoreWork = 0; /* do nothing */
+ break;
+
+ default:
+ return ERROR(GENERIC); /* impossible */
+ }
+ }
+
+ *srcSizePtr = ip - istart;
+ *dstCapacityPtr = op - ostart;
+ zcs->inputProcessed += *srcSizePtr;
+ if (zcs->frameEnded)
+ return 0;
+ {
+ size_t hintInSize = zcs->inBuffTarget - zcs->inBuffPos;
+ if (hintInSize == 0)
+ hintInSize = zcs->blockSize;
+ return hintInSize;
+ }
+}
+
+size_t ZSTD_compressStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output, ZSTD_inBuffer *input)
+{
+ size_t sizeRead = input->size - input->pos;
+ size_t sizeWritten = output->size - output->pos;
+ size_t const result =
+ ZSTD_compressStream_generic(zcs, (char *)(output->dst) + output->pos, &sizeWritten, (const char *)(input->src) + input->pos, &sizeRead, zsf_gather);
+ input->pos += sizeRead;
+ output->pos += sizeWritten;
+ return result;
+}
+
+/*====== Finalize ======*/
+
+/*! ZSTD_flushStream() :
+* @return : amount of data remaining to flush */
+size_t ZSTD_flushStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output)
+{
+ size_t srcSize = 0;
+ size_t sizeWritten = output->size - output->pos;
+ size_t const result = ZSTD_compressStream_generic(zcs, (char *)(output->dst) + output->pos, &sizeWritten, &srcSize,
+ &srcSize, /* use a valid src address instead of NULL */
+ zsf_flush);
+ output->pos += sizeWritten;
+ if (ZSTD_isError(result))
+ return result;
+ return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
+}
+
+size_t ZSTD_endStream(ZSTD_CStream *zcs, ZSTD_outBuffer *output)
+{
+ BYTE *const ostart = (BYTE *)(output->dst) + output->pos;
+ BYTE *const oend = (BYTE *)(output->dst) + output->size;
+ BYTE *op = ostart;
+
+ if ((zcs->pledgedSrcSize) && (zcs->inputProcessed != zcs->pledgedSrcSize))
+ return ERROR(srcSize_wrong); /* pledgedSrcSize not respected */
+
+ if (zcs->stage != zcss_final) {
+ /* flush whatever remains */
+ size_t srcSize = 0;
+ size_t sizeWritten = output->size - output->pos;
+ size_t const notEnded =
+ ZSTD_compressStream_generic(zcs, ostart, &sizeWritten, &srcSize, &srcSize, zsf_end); /* use a valid src address instead of NULL */
+ size_t const remainingToFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
+ op += sizeWritten;
+ if (remainingToFlush) {
+ output->pos += sizeWritten;
+ return remainingToFlush + ZSTD_BLOCKHEADERSIZE /* final empty block */ + (zcs->checksum * 4);
+ }
+ /* create epilogue */
+ zcs->stage = zcss_final;
+ zcs->outBuffContentSize = !notEnded ? 0 : ZSTD_compressEnd(zcs->cctx, zcs->outBuff, zcs->outBuffSize, NULL,
+ 0); /* write epilogue, including final empty block, into outBuff */
+ }
+
+ /* flush epilogue */
+ {
+ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
+ size_t const flushed = ZSTD_limitCopy(op, oend - op, zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
+ op += flushed;
+ zcs->outBuffFlushedSize += flushed;
+ output->pos += op - ostart;
+ if (toFlush == flushed)
+ zcs->stage = zcss_init; /* end reached */
+ return toFlush - flushed;
+ }
+}
+
+/*-===== Pre-defined compression levels =====-*/
+
+#define ZSTD_DEFAULT_CLEVEL 1
+#define ZSTD_MAX_CLEVEL 22
+int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
+
+static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL + 1] = {
+ {
+ /* "default" */
+ /* W, C, H, S, L, TL, strat */
+ {18, 12, 12, 1, 7, 16, ZSTD_fast}, /* level 0 - never used */
+ {19, 13, 14, 1, 7, 16, ZSTD_fast}, /* level 1 */
+ {19, 15, 16, 1, 6, 16, ZSTD_fast}, /* level 2 */
+ {20, 16, 17, 1, 5, 16, ZSTD_dfast}, /* level 3.*/
+ {20, 18, 18, 1, 5, 16, ZSTD_dfast}, /* level 4.*/
+ {20, 15, 18, 3, 5, 16, ZSTD_greedy}, /* level 5 */
+ {21, 16, 19, 2, 5, 16, ZSTD_lazy}, /* level 6 */
+ {21, 17, 20, 3, 5, 16, ZSTD_lazy}, /* level 7 */
+ {21, 18, 20, 3, 5, 16, ZSTD_lazy2}, /* level 8 */
+ {21, 20, 20, 3, 5, 16, ZSTD_lazy2}, /* level 9 */
+ {21, 19, 21, 4, 5, 16, ZSTD_lazy2}, /* level 10 */
+ {22, 20, 22, 4, 5, 16, ZSTD_lazy2}, /* level 11 */
+ {22, 20, 22, 5, 5, 16, ZSTD_lazy2}, /* level 12 */
+ {22, 21, 22, 5, 5, 16, ZSTD_lazy2}, /* level 13 */
+ {22, 21, 22, 6, 5, 16, ZSTD_lazy2}, /* level 14 */
+ {22, 21, 21, 5, 5, 16, ZSTD_btlazy2}, /* level 15 */
+ {23, 22, 22, 5, 5, 16, ZSTD_btlazy2}, /* level 16 */
+ {23, 21, 22, 4, 5, 24, ZSTD_btopt}, /* level 17 */
+ {23, 23, 22, 6, 5, 32, ZSTD_btopt}, /* level 18 */
+ {23, 23, 22, 6, 3, 48, ZSTD_btopt}, /* level 19 */
+ {25, 25, 23, 7, 3, 64, ZSTD_btopt2}, /* level 20 */
+ {26, 26, 23, 7, 3, 256, ZSTD_btopt2}, /* level 21 */
+ {27, 27, 25, 9, 3, 512, ZSTD_btopt2}, /* level 22 */
+ },
+ {
+ /* for srcSize <= 256 KB */
+ /* W, C, H, S, L, T, strat */
+ {0, 0, 0, 0, 0, 0, ZSTD_fast}, /* level 0 - not used */
+ {18, 13, 14, 1, 6, 8, ZSTD_fast}, /* level 1 */
+ {18, 14, 13, 1, 5, 8, ZSTD_dfast}, /* level 2 */
+ {18, 16, 15, 1, 5, 8, ZSTD_dfast}, /* level 3 */
+ {18, 15, 17, 1, 5, 8, ZSTD_greedy}, /* level 4.*/
+ {18, 16, 17, 4, 5, 8, ZSTD_greedy}, /* level 5.*/
+ {18, 16, 17, 3, 5, 8, ZSTD_lazy}, /* level 6.*/
+ {18, 17, 17, 4, 4, 8, ZSTD_lazy}, /* level 7 */
+ {18, 17, 17, 4, 4, 8, ZSTD_lazy2}, /* level 8 */
+ {18, 17, 17, 5, 4, 8, ZSTD_lazy2}, /* level 9 */
+ {18, 17, 17, 6, 4, 8, ZSTD_lazy2}, /* level 10 */
+ {18, 18, 17, 6, 4, 8, ZSTD_lazy2}, /* level 11.*/
+ {18, 18, 17, 7, 4, 8, ZSTD_lazy2}, /* level 12.*/
+ {18, 19, 17, 6, 4, 8, ZSTD_btlazy2}, /* level 13 */
+ {18, 18, 18, 4, 4, 16, ZSTD_btopt}, /* level 14.*/
+ {18, 18, 18, 4, 3, 16, ZSTD_btopt}, /* level 15.*/
+ {18, 19, 18, 6, 3, 32, ZSTD_btopt}, /* level 16.*/
+ {18, 19, 18, 8, 3, 64, ZSTD_btopt}, /* level 17.*/
+ {18, 19, 18, 9, 3, 128, ZSTD_btopt}, /* level 18.*/
+ {18, 19, 18, 10, 3, 256, ZSTD_btopt}, /* level 19.*/
+ {18, 19, 18, 11, 3, 512, ZSTD_btopt2}, /* level 20.*/
+ {18, 19, 18, 12, 3, 512, ZSTD_btopt2}, /* level 21.*/
+ {18, 19, 18, 13, 3, 512, ZSTD_btopt2}, /* level 22.*/
+ },
+ {
+ /* for srcSize <= 128 KB */
+ /* W, C, H, S, L, T, strat */
+ {17, 12, 12, 1, 7, 8, ZSTD_fast}, /* level 0 - not used */
+ {17, 12, 13, 1, 6, 8, ZSTD_fast}, /* level 1 */
+ {17, 13, 16, 1, 5, 8, ZSTD_fast}, /* level 2 */
+ {17, 16, 16, 2, 5, 8, ZSTD_dfast}, /* level 3 */
+ {17, 13, 15, 3, 4, 8, ZSTD_greedy}, /* level 4 */
+ {17, 15, 17, 4, 4, 8, ZSTD_greedy}, /* level 5 */
+ {17, 16, 17, 3, 4, 8, ZSTD_lazy}, /* level 6 */
+ {17, 15, 17, 4, 4, 8, ZSTD_lazy2}, /* level 7 */
+ {17, 17, 17, 4, 4, 8, ZSTD_lazy2}, /* level 8 */
+ {17, 17, 17, 5, 4, 8, ZSTD_lazy2}, /* level 9 */
+ {17, 17, 17, 6, 4, 8, ZSTD_lazy2}, /* level 10 */
+ {17, 17, 17, 7, 4, 8, ZSTD_lazy2}, /* level 11 */
+ {17, 17, 17, 8, 4, 8, ZSTD_lazy2}, /* level 12 */
+ {17, 18, 17, 6, 4, 8, ZSTD_btlazy2}, /* level 13.*/
+ {17, 17, 17, 7, 3, 8, ZSTD_btopt}, /* level 14.*/
+ {17, 17, 17, 7, 3, 16, ZSTD_btopt}, /* level 15.*/
+ {17, 18, 17, 7, 3, 32, ZSTD_btopt}, /* level 16.*/
+ {17, 18, 17, 7, 3, 64, ZSTD_btopt}, /* level 17.*/
+ {17, 18, 17, 7, 3, 256, ZSTD_btopt}, /* level 18.*/
+ {17, 18, 17, 8, 3, 256, ZSTD_btopt}, /* level 19.*/
+ {17, 18, 17, 9, 3, 256, ZSTD_btopt2}, /* level 20.*/
+ {17, 18, 17, 10, 3, 256, ZSTD_btopt2}, /* level 21.*/
+ {17, 18, 17, 11, 3, 512, ZSTD_btopt2}, /* level 22.*/
+ },
+ {
+ /* for srcSize <= 16 KB */
+ /* W, C, H, S, L, T, strat */
+ {14, 12, 12, 1, 7, 6, ZSTD_fast}, /* level 0 - not used */
+ {14, 14, 14, 1, 6, 6, ZSTD_fast}, /* level 1 */
+ {14, 14, 14, 1, 4, 6, ZSTD_fast}, /* level 2 */
+ {14, 14, 14, 1, 4, 6, ZSTD_dfast}, /* level 3.*/
+ {14, 14, 14, 4, 4, 6, ZSTD_greedy}, /* level 4.*/
+ {14, 14, 14, 3, 4, 6, ZSTD_lazy}, /* level 5.*/
+ {14, 14, 14, 4, 4, 6, ZSTD_lazy2}, /* level 6 */
+ {14, 14, 14, 5, 4, 6, ZSTD_lazy2}, /* level 7 */
+ {14, 14, 14, 6, 4, 6, ZSTD_lazy2}, /* level 8.*/
+ {14, 15, 14, 6, 4, 6, ZSTD_btlazy2}, /* level 9.*/
+ {14, 15, 14, 3, 3, 6, ZSTD_btopt}, /* level 10.*/
+ {14, 15, 14, 6, 3, 8, ZSTD_btopt}, /* level 11.*/
+ {14, 15, 14, 6, 3, 16, ZSTD_btopt}, /* level 12.*/
+ {14, 15, 14, 6, 3, 24, ZSTD_btopt}, /* level 13.*/
+ {14, 15, 15, 6, 3, 48, ZSTD_btopt}, /* level 14.*/
+ {14, 15, 15, 6, 3, 64, ZSTD_btopt}, /* level 15.*/
+ {14, 15, 15, 6, 3, 96, ZSTD_btopt}, /* level 16.*/
+ {14, 15, 15, 6, 3, 128, ZSTD_btopt}, /* level 17.*/
+ {14, 15, 15, 6, 3, 256, ZSTD_btopt}, /* level 18.*/
+ {14, 15, 15, 7, 3, 256, ZSTD_btopt}, /* level 19.*/
+ {14, 15, 15, 8, 3, 256, ZSTD_btopt2}, /* level 20.*/
+ {14, 15, 15, 9, 3, 256, ZSTD_btopt2}, /* level 21.*/
+ {14, 15, 15, 10, 3, 256, ZSTD_btopt2}, /* level 22.*/
+ },
+};
+
+/*! ZSTD_getCParams() :
+* @return ZSTD_compressionParameters structure for a selected compression level, `srcSize` and `dictSize`.
+* Size values are optional, provide 0 if not known or unused */
+ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSize, size_t dictSize)
+{
+ ZSTD_compressionParameters cp;
+ size_t const addedSize = srcSize ? 0 : 500;
+ U64 const rSize = srcSize + dictSize ? srcSize + dictSize + addedSize : (U64)-1;
+ U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB); /* intentional underflow for srcSizeHint == 0 */
+ if (compressionLevel <= 0)
+ compressionLevel = ZSTD_DEFAULT_CLEVEL; /* 0 == default; no negative compressionLevel yet */
+ if (compressionLevel > ZSTD_MAX_CLEVEL)
+ compressionLevel = ZSTD_MAX_CLEVEL;
+ cp = ZSTD_defaultCParameters[tableID][compressionLevel];
+ if (ZSTD_32bits()) { /* auto-correction, for 32-bits mode */
+ if (cp.windowLog > ZSTD_WINDOWLOG_MAX)
+ cp.windowLog = ZSTD_WINDOWLOG_MAX;
+ if (cp.chainLog > ZSTD_CHAINLOG_MAX)
+ cp.chainLog = ZSTD_CHAINLOG_MAX;
+ if (cp.hashLog > ZSTD_HASHLOG_MAX)
+ cp.hashLog = ZSTD_HASHLOG_MAX;
+ }
+ cp = ZSTD_adjustCParams(cp, srcSize, dictSize);
+ return cp;
+}
+
+/*! ZSTD_getParams() :
+* same as ZSTD_getCParams(), but @return a `ZSTD_parameters` object (instead of `ZSTD_compressionParameters`).
+* All fields of `ZSTD_frameParameters` are set to default (0) */
+ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSize, size_t dictSize)
+{
+ ZSTD_parameters params;
+ ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, srcSize, dictSize);
+ memset(&params, 0, sizeof(params));
+ params.cParams = cParams;
+ return params;
+}
+
+EXPORT_SYMBOL(ZSTD_maxCLevel);
+EXPORT_SYMBOL(ZSTD_compressBound);
+
+EXPORT_SYMBOL(ZSTD_CCtxWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initCCtx);
+EXPORT_SYMBOL(ZSTD_compressCCtx);
+EXPORT_SYMBOL(ZSTD_compress_usingDict);
+
+EXPORT_SYMBOL(ZSTD_CDictWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initCDict);
+EXPORT_SYMBOL(ZSTD_compress_usingCDict);
+
+EXPORT_SYMBOL(ZSTD_CStreamWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initCStream);
+EXPORT_SYMBOL(ZSTD_initCStream_usingCDict);
+EXPORT_SYMBOL(ZSTD_resetCStream);
+EXPORT_SYMBOL(ZSTD_compressStream);
+EXPORT_SYMBOL(ZSTD_flushStream);
+EXPORT_SYMBOL(ZSTD_endStream);
+EXPORT_SYMBOL(ZSTD_CStreamInSize);
+EXPORT_SYMBOL(ZSTD_CStreamOutSize);
+
+EXPORT_SYMBOL(ZSTD_getCParams);
+EXPORT_SYMBOL(ZSTD_getParams);
+EXPORT_SYMBOL(ZSTD_checkCParams);
+EXPORT_SYMBOL(ZSTD_adjustCParams);
+
+EXPORT_SYMBOL(ZSTD_compressBegin);
+EXPORT_SYMBOL(ZSTD_compressBegin_usingDict);
+EXPORT_SYMBOL(ZSTD_compressBegin_advanced);
+EXPORT_SYMBOL(ZSTD_copyCCtx);
+EXPORT_SYMBOL(ZSTD_compressBegin_usingCDict);
+EXPORT_SYMBOL(ZSTD_compressContinue);
+EXPORT_SYMBOL(ZSTD_compressEnd);
+
+EXPORT_SYMBOL(ZSTD_getBlockSizeMax);
+EXPORT_SYMBOL(ZSTD_compressBlock);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("Zstd Compressor");
diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c
new file mode 100644
index 000000000000..b17846725ca0
--- /dev/null
+++ b/lib/zstd/decompress.c
@@ -0,0 +1,2528 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+/* ***************************************************************
+* Tuning parameters
+*****************************************************************/
+/*!
+* MAXWINDOWSIZE_DEFAULT :
+* maximum window size accepted by DStream, by default.
+* Frames requiring more memory will be rejected.
+*/
+#ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
+#define ZSTD_MAXWINDOWSIZE_DEFAULT ((1 << ZSTD_WINDOWLOG_MAX) + 1) /* defined within zstd.h */
+#endif
+
+/*-*******************************************************
+* Dependencies
+*********************************************************/
+#include "fse.h"
+#include "huf.h"
+#include "mem.h" /* low level memory routines */
+#include "zstd_internal.h"
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h> /* memcpy, memmove, memset */
+
+#define ZSTD_PREFETCH(ptr) __builtin_prefetch(ptr, 0, 0)
+
+/*-*************************************
+* Macros
+***************************************/
+#define ZSTD_isError ERR_isError /* for inlining */
+#define FSE_isError ERR_isError
+#define HUF_isError ERR_isError
+
+/*_*******************************************************
+* Memory operations
+**********************************************************/
+static void ZSTD_copy4(void *dst, const void *src) { memcpy(dst, src, 4); }
+
+/*-*************************************************************
+* Context management
+***************************************************************/
+typedef enum {
+ ZSTDds_getFrameHeaderSize,
+ ZSTDds_decodeFrameHeader,
+ ZSTDds_decodeBlockHeader,
+ ZSTDds_decompressBlock,
+ ZSTDds_decompressLastBlock,
+ ZSTDds_checkChecksum,
+ ZSTDds_decodeSkippableHeader,
+ ZSTDds_skipFrame
+} ZSTD_dStage;
+
+typedef struct {
+ FSE_DTable LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
+ FSE_DTable OFTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
+ FSE_DTable MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
+ HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
+ U64 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32 / 2];
+ U32 rep[ZSTD_REP_NUM];
+} ZSTD_entropyTables_t;
+
+struct ZSTD_DCtx_s {
+ const FSE_DTable *LLTptr;
+ const FSE_DTable *MLTptr;
+ const FSE_DTable *OFTptr;
+ const HUF_DTable *HUFptr;
+ ZSTD_entropyTables_t entropy;
+ const void *previousDstEnd; /* detect continuity */
+ const void *base; /* start of curr segment */
+ const void *vBase; /* virtual start of previous segment if it was just before curr one */
+ const void *dictEnd; /* end of previous segment */
+ size_t expected;
+ ZSTD_frameParams fParams;
+ blockType_e bType; /* used in ZSTD_decompressContinue(), to transfer blockType between header decoding and block decoding stages */
+ ZSTD_dStage stage;
+ U32 litEntropy;
+ U32 fseEntropy;
+ struct xxh64_state xxhState;
+ size_t headerSize;
+ U32 dictID;
+ const BYTE *litPtr;
+ ZSTD_customMem customMem;
+ size_t litSize;
+ size_t rleSize;
+ BYTE litBuffer[ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH];
+ BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
+}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
+
+size_t ZSTD_DCtxWorkspaceBound(void) { return ZSTD_ALIGN(sizeof(ZSTD_stack)) + ZSTD_ALIGN(sizeof(ZSTD_DCtx)); }
+
+size_t ZSTD_decompressBegin(ZSTD_DCtx *dctx)
+{
+ dctx->expected = ZSTD_frameHeaderSize_prefix;
+ dctx->stage = ZSTDds_getFrameHeaderSize;
+ dctx->previousDstEnd = NULL;
+ dctx->base = NULL;
+ dctx->vBase = NULL;
+ dctx->dictEnd = NULL;
+ dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
+ dctx->litEntropy = dctx->fseEntropy = 0;
+ dctx->dictID = 0;
+ ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
+ memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */
+ dctx->LLTptr = dctx->entropy.LLTable;
+ dctx->MLTptr = dctx->entropy.MLTable;
+ dctx->OFTptr = dctx->entropy.OFTable;
+ dctx->HUFptr = dctx->entropy.hufTable;
+ return 0;
+}
+
+ZSTD_DCtx *ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
+{
+ ZSTD_DCtx *dctx;
+
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+
+ dctx = (ZSTD_DCtx *)ZSTD_malloc(sizeof(ZSTD_DCtx), customMem);
+ if (!dctx)
+ return NULL;
+ memcpy(&dctx->customMem, &customMem, sizeof(customMem));
+ ZSTD_decompressBegin(dctx);
+ return dctx;
+}
+
+ZSTD_DCtx *ZSTD_initDCtx(void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ return ZSTD_createDCtx_advanced(stackMem);
+}
+
+size_t ZSTD_freeDCtx(ZSTD_DCtx *dctx)
+{
+ if (dctx == NULL)
+ return 0; /* support free on NULL */
+ ZSTD_free(dctx, dctx->customMem);
+ return 0; /* reserved as a potential error code in the future */
+}
+
+void ZSTD_copyDCtx(ZSTD_DCtx *dstDCtx, const ZSTD_DCtx *srcDCtx)
+{
+ size_t const workSpaceSize = (ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH) + ZSTD_frameHeaderSize_max;
+ memcpy(dstDCtx, srcDCtx, sizeof(ZSTD_DCtx) - workSpaceSize); /* no need to copy workspace */
+}
+
+static void ZSTD_refDDict(ZSTD_DCtx *dstDCtx, const ZSTD_DDict *ddict);
+
+/*-*************************************************************
+* Decompression section
+***************************************************************/
+
+/*! ZSTD_isFrame() :
+ * Tells if the content of `buffer` starts with a valid Frame Identifier.
+ * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
+ * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
+ * Note 3 : Skippable Frame Identifiers are considered valid. */
+unsigned ZSTD_isFrame(const void *buffer, size_t size)
+{
+ if (size < 4)
+ return 0;
+ {
+ U32 const magic = ZSTD_readLE32(buffer);
+ if (magic == ZSTD_MAGICNUMBER)
+ return 1;
+ if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START)
+ return 1;
+ }
+ return 0;
+}
+
+/** ZSTD_frameHeaderSize() :
+* srcSize must be >= ZSTD_frameHeaderSize_prefix.
+* @return : size of the Frame Header */
+static size_t ZSTD_frameHeaderSize(const void *src, size_t srcSize)
+{
+ if (srcSize < ZSTD_frameHeaderSize_prefix)
+ return ERROR(srcSize_wrong);
+ {
+ BYTE const fhd = ((const BYTE *)src)[4];
+ U32 const dictID = fhd & 3;
+ U32 const singleSegment = (fhd >> 5) & 1;
+ U32 const fcsId = fhd >> 6;
+ return ZSTD_frameHeaderSize_prefix + !singleSegment + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId] + (singleSegment && !fcsId);
+ }
+}
+
+/** ZSTD_getFrameParams() :
+* decode Frame Header, or require larger `srcSize`.
+* @return : 0, `fparamsPtr` is correctly filled,
+* >0, `srcSize` is too small, result is expected `srcSize`,
+* or an error code, which can be tested using ZSTD_isError() */
+size_t ZSTD_getFrameParams(ZSTD_frameParams *fparamsPtr, const void *src, size_t srcSize)
+{
+ const BYTE *ip = (const BYTE *)src;
+
+ if (srcSize < ZSTD_frameHeaderSize_prefix)
+ return ZSTD_frameHeaderSize_prefix;
+ if (ZSTD_readLE32(src) != ZSTD_MAGICNUMBER) {
+ if ((ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+ if (srcSize < ZSTD_skippableHeaderSize)
+ return ZSTD_skippableHeaderSize; /* magic number + skippable frame length */
+ memset(fparamsPtr, 0, sizeof(*fparamsPtr));
+ fparamsPtr->frameContentSize = ZSTD_readLE32((const char *)src + 4);
+ fparamsPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */
+ return 0;
+ }
+ return ERROR(prefix_unknown);
+ }
+
+ /* ensure there is enough `srcSize` to fully read/decode frame header */
+ {
+ size_t const fhsize = ZSTD_frameHeaderSize(src, srcSize);
+ if (srcSize < fhsize)
+ return fhsize;
+ }
+
+ {
+ BYTE const fhdByte = ip[4];
+ size_t pos = 5;
+ U32 const dictIDSizeCode = fhdByte & 3;
+ U32 const checksumFlag = (fhdByte >> 2) & 1;
+ U32 const singleSegment = (fhdByte >> 5) & 1;
+ U32 const fcsID = fhdByte >> 6;
+ U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX;
+ U32 windowSize = 0;
+ U32 dictID = 0;
+ U64 frameContentSize = 0;
+ if ((fhdByte & 0x08) != 0)
+ return ERROR(frameParameter_unsupported); /* reserved bits, which must be zero */
+ if (!singleSegment) {
+ BYTE const wlByte = ip[pos++];
+ U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
+ if (windowLog > ZSTD_WINDOWLOG_MAX)
+ return ERROR(frameParameter_windowTooLarge); /* avoids issue with 1 << windowLog */
+ windowSize = (1U << windowLog);
+ windowSize += (windowSize >> 3) * (wlByte & 7);
+ }
+
+ switch (dictIDSizeCode) {
+ default: /* impossible */
+ case 0: break;
+ case 1:
+ dictID = ip[pos];
+ pos++;
+ break;
+ case 2:
+ dictID = ZSTD_readLE16(ip + pos);
+ pos += 2;
+ break;
+ case 3:
+ dictID = ZSTD_readLE32(ip + pos);
+ pos += 4;
+ break;
+ }
+ switch (fcsID) {
+ default: /* impossible */
+ case 0:
+ if (singleSegment)
+ frameContentSize = ip[pos];
+ break;
+ case 1: frameContentSize = ZSTD_readLE16(ip + pos) + 256; break;
+ case 2: frameContentSize = ZSTD_readLE32(ip + pos); break;
+ case 3: frameContentSize = ZSTD_readLE64(ip + pos); break;
+ }
+ if (!windowSize)
+ windowSize = (U32)frameContentSize;
+ if (windowSize > windowSizeMax)
+ return ERROR(frameParameter_windowTooLarge);
+ fparamsPtr->frameContentSize = frameContentSize;
+ fparamsPtr->windowSize = windowSize;
+ fparamsPtr->dictID = dictID;
+ fparamsPtr->checksumFlag = checksumFlag;
+ }
+ return 0;
+}
+
+/** ZSTD_getFrameContentSize() :
+* compatible with legacy mode
+* @return : decompressed size of the single frame pointed to be `src` if known, otherwise
+* - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
+* - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */
+unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
+{
+ {
+ ZSTD_frameParams fParams;
+ if (ZSTD_getFrameParams(&fParams, src, srcSize) != 0)
+ return ZSTD_CONTENTSIZE_ERROR;
+ if (fParams.windowSize == 0) {
+ /* Either skippable or empty frame, size == 0 either way */
+ return 0;
+ } else if (fParams.frameContentSize != 0) {
+ return fParams.frameContentSize;
+ } else {
+ return ZSTD_CONTENTSIZE_UNKNOWN;
+ }
+ }
+}
+
+/** ZSTD_findDecompressedSize() :
+ * compatible with legacy mode
+ * `srcSize` must be the exact length of some number of ZSTD compressed and/or
+ * skippable frames
+ * @return : decompressed size of the frames contained */
+unsigned long long ZSTD_findDecompressedSize(const void *src, size_t srcSize)
+{
+ {
+ unsigned long long totalDstSize = 0;
+ while (srcSize >= ZSTD_frameHeaderSize_prefix) {
+ const U32 magicNumber = ZSTD_readLE32(src);
+
+ if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+ size_t skippableSize;
+ if (srcSize < ZSTD_skippableHeaderSize)
+ return ERROR(srcSize_wrong);
+ skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize;
+ if (srcSize < skippableSize) {
+ return ZSTD_CONTENTSIZE_ERROR;
+ }
+
+ src = (const BYTE *)src + skippableSize;
+ srcSize -= skippableSize;
+ continue;
+ }
+
+ {
+ unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
+ if (ret >= ZSTD_CONTENTSIZE_ERROR)
+ return ret;
+
+ /* check for overflow */
+ if (totalDstSize + ret < totalDstSize)
+ return ZSTD_CONTENTSIZE_ERROR;
+ totalDstSize += ret;
+ }
+ {
+ size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
+ if (ZSTD_isError(frameSrcSize)) {
+ return ZSTD_CONTENTSIZE_ERROR;
+ }
+
+ src = (const BYTE *)src + frameSrcSize;
+ srcSize -= frameSrcSize;
+ }
+ }
+
+ if (srcSize) {
+ return ZSTD_CONTENTSIZE_ERROR;
+ }
+
+ return totalDstSize;
+ }
+}
+
+/** ZSTD_decodeFrameHeader() :
+* `headerSize` must be the size provided by ZSTD_frameHeaderSize().
+* @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
+static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx *dctx, const void *src, size_t headerSize)
+{
+ size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, headerSize);
+ if (ZSTD_isError(result))
+ return result; /* invalid header */
+ if (result > 0)
+ return ERROR(srcSize_wrong); /* headerSize too small */
+ if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
+ return ERROR(dictionary_wrong);
+ if (dctx->fParams.checksumFlag)
+ xxh64_reset(&dctx->xxhState, 0);
+ return 0;
+}
+
+typedef struct {
+ blockType_e blockType;
+ U32 lastBlock;
+ U32 origSize;
+} blockProperties_t;
+
+/*! ZSTD_getcBlockSize() :
+* Provides the size of compressed block from block header `src` */
+size_t ZSTD_getcBlockSize(const void *src, size_t srcSize, blockProperties_t *bpPtr)
+{
+ if (srcSize < ZSTD_blockHeaderSize)
+ return ERROR(srcSize_wrong);
+ {
+ U32 const cBlockHeader = ZSTD_readLE24(src);
+ U32 const cSize = cBlockHeader >> 3;
+ bpPtr->lastBlock = cBlockHeader & 1;
+ bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
+ bpPtr->origSize = cSize; /* only useful for RLE */
+ if (bpPtr->blockType == bt_rle)
+ return 1;
+ if (bpPtr->blockType == bt_reserved)
+ return ERROR(corruption_detected);
+ return cSize;
+ }
+}
+
+static size_t ZSTD_copyRawBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ if (srcSize > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+ memcpy(dst, src, srcSize);
+ return srcSize;
+}
+
+static size_t ZSTD_setRleBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize, size_t regenSize)
+{
+ if (srcSize != 1)
+ return ERROR(srcSize_wrong);
+ if (regenSize > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+ memset(dst, *(const BYTE *)src, regenSize);
+ return regenSize;
+}
+
+/*! ZSTD_decodeLiteralsBlock() :
+ @return : nb of bytes read from src (< srcSize ) */
+size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx *dctx, const void *src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
+{
+ if (srcSize < MIN_CBLOCK_SIZE)
+ return ERROR(corruption_detected);
+
+ {
+ const BYTE *const istart = (const BYTE *)src;
+ symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
+
+ switch (litEncType) {
+ case set_repeat:
+ if (dctx->litEntropy == 0)
+ return ERROR(dictionary_corrupted);
+ /* fall-through */
+ case set_compressed:
+ if (srcSize < 5)
+ return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
+ {
+ size_t lhSize, litSize, litCSize;
+ U32 singleStream = 0;
+ U32 const lhlCode = (istart[0] >> 2) & 3;
+ U32 const lhc = ZSTD_readLE32(istart);
+ switch (lhlCode) {
+ case 0:
+ case 1:
+ default: /* note : default is impossible, since lhlCode into [0..3] */
+ /* 2 - 2 - 10 - 10 */
+ singleStream = !lhlCode;
+ lhSize = 3;
+ litSize = (lhc >> 4) & 0x3FF;
+ litCSize = (lhc >> 14) & 0x3FF;
+ break;
+ case 2:
+ /* 2 - 2 - 14 - 14 */
+ lhSize = 4;
+ litSize = (lhc >> 4) & 0x3FFF;
+ litCSize = lhc >> 18;
+ break;
+ case 3:
+ /* 2 - 2 - 18 - 18 */
+ lhSize = 5;
+ litSize = (lhc >> 4) & 0x3FFFF;
+ litCSize = (lhc >> 22) + (istart[4] << 10);
+ break;
+ }
+ if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX)
+ return ERROR(corruption_detected);
+ if (litCSize + lhSize > srcSize)
+ return ERROR(corruption_detected);
+
+ if (HUF_isError(
+ (litEncType == set_repeat)
+ ? (singleStream ? HUF_decompress1X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, dctx->HUFptr)
+ : HUF_decompress4X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, dctx->HUFptr))
+ : (singleStream
+ ? HUF_decompress1X2_DCtx_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize, litCSize,
+ dctx->entropy.workspace, sizeof(dctx->entropy.workspace))
+ : HUF_decompress4X_hufOnly_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize, litCSize,
+ dctx->entropy.workspace, sizeof(dctx->entropy.workspace)))))
+ return ERROR(corruption_detected);
+
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ dctx->litEntropy = 1;
+ if (litEncType == set_compressed)
+ dctx->HUFptr = dctx->entropy.hufTable;
+ memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
+ return litCSize + lhSize;
+ }
+
+ case set_basic: {
+ size_t litSize, lhSize;
+ U32 const lhlCode = ((istart[0]) >> 2) & 3;
+ switch (lhlCode) {
+ case 0:
+ case 2:
+ default: /* note : default is impossible, since lhlCode into [0..3] */
+ lhSize = 1;
+ litSize = istart[0] >> 3;
+ break;
+ case 1:
+ lhSize = 2;
+ litSize = ZSTD_readLE16(istart) >> 4;
+ break;
+ case 3:
+ lhSize = 3;
+ litSize = ZSTD_readLE24(istart) >> 4;
+ break;
+ }
+
+ if (lhSize + litSize + WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
+ if (litSize + lhSize > srcSize)
+ return ERROR(corruption_detected);
+ memcpy(dctx->litBuffer, istart + lhSize, litSize);
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
+ return lhSize + litSize;
+ }
+ /* direct reference into compressed stream */
+ dctx->litPtr = istart + lhSize;
+ dctx->litSize = litSize;
+ return lhSize + litSize;
+ }
+
+ case set_rle: {
+ U32 const lhlCode = ((istart[0]) >> 2) & 3;
+ size_t litSize, lhSize;
+ switch (lhlCode) {
+ case 0:
+ case 2:
+ default: /* note : default is impossible, since lhlCode into [0..3] */
+ lhSize = 1;
+ litSize = istart[0] >> 3;
+ break;
+ case 1:
+ lhSize = 2;
+ litSize = ZSTD_readLE16(istart) >> 4;
+ break;
+ case 3:
+ lhSize = 3;
+ litSize = ZSTD_readLE24(istart) >> 4;
+ if (srcSize < 4)
+ return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
+ break;
+ }
+ if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX)
+ return ERROR(corruption_detected);
+ memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ return lhSize + 1;
+ }
+ default:
+ return ERROR(corruption_detected); /* impossible */
+ }
+ }
+}
+
+typedef union {
+ FSE_decode_t realData;
+ U32 alignedBy4;
+} FSE_decode_t4;
+
+static const FSE_decode_t4 LL_defaultDTable[(1 << LL_DEFAULTNORMLOG) + 1] = {
+ {{LL_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
+ {{0, 0, 4}}, /* 0 : base, symbol, bits */
+ {{16, 0, 4}},
+ {{32, 1, 5}},
+ {{0, 3, 5}},
+ {{0, 4, 5}},
+ {{0, 6, 5}},
+ {{0, 7, 5}},
+ {{0, 9, 5}},
+ {{0, 10, 5}},
+ {{0, 12, 5}},
+ {{0, 14, 6}},
+ {{0, 16, 5}},
+ {{0, 18, 5}},
+ {{0, 19, 5}},
+ {{0, 21, 5}},
+ {{0, 22, 5}},
+ {{0, 24, 5}},
+ {{32, 25, 5}},
+ {{0, 26, 5}},
+ {{0, 27, 6}},
+ {{0, 29, 6}},
+ {{0, 31, 6}},
+ {{32, 0, 4}},
+ {{0, 1, 4}},
+ {{0, 2, 5}},
+ {{32, 4, 5}},
+ {{0, 5, 5}},
+ {{32, 7, 5}},
+ {{0, 8, 5}},
+ {{32, 10, 5}},
+ {{0, 11, 5}},
+ {{0, 13, 6}},
+ {{32, 16, 5}},
+ {{0, 17, 5}},
+ {{32, 19, 5}},
+ {{0, 20, 5}},
+ {{32, 22, 5}},
+ {{0, 23, 5}},
+ {{0, 25, 4}},
+ {{16, 25, 4}},
+ {{32, 26, 5}},
+ {{0, 28, 6}},
+ {{0, 30, 6}},
+ {{48, 0, 4}},
+ {{16, 1, 4}},
+ {{32, 2, 5}},
+ {{32, 3, 5}},
+ {{32, 5, 5}},
+ {{32, 6, 5}},
+ {{32, 8, 5}},
+ {{32, 9, 5}},
+ {{32, 11, 5}},
+ {{32, 12, 5}},
+ {{0, 15, 6}},
+ {{32, 17, 5}},
+ {{32, 18, 5}},
+ {{32, 20, 5}},
+ {{32, 21, 5}},
+ {{32, 23, 5}},
+ {{32, 24, 5}},
+ {{0, 35, 6}},
+ {{0, 34, 6}},
+ {{0, 33, 6}},
+ {{0, 32, 6}},
+}; /* LL_defaultDTable */
+
+static const FSE_decode_t4 ML_defaultDTable[(1 << ML_DEFAULTNORMLOG) + 1] = {
+ {{ML_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
+ {{0, 0, 6}}, /* 0 : base, symbol, bits */
+ {{0, 1, 4}},
+ {{32, 2, 5}},
+ {{0, 3, 5}},
+ {{0, 5, 5}},
+ {{0, 6, 5}},
+ {{0, 8, 5}},
+ {{0, 10, 6}},
+ {{0, 13, 6}},
+ {{0, 16, 6}},
+ {{0, 19, 6}},
+ {{0, 22, 6}},
+ {{0, 25, 6}},
+ {{0, 28, 6}},
+ {{0, 31, 6}},
+ {{0, 33, 6}},
+ {{0, 35, 6}},
+ {{0, 37, 6}},
+ {{0, 39, 6}},
+ {{0, 41, 6}},
+ {{0, 43, 6}},
+ {{0, 45, 6}},
+ {{16, 1, 4}},
+ {{0, 2, 4}},
+ {{32, 3, 5}},
+ {{0, 4, 5}},
+ {{32, 6, 5}},
+ {{0, 7, 5}},
+ {{0, 9, 6}},
+ {{0, 12, 6}},
+ {{0, 15, 6}},
+ {{0, 18, 6}},
+ {{0, 21, 6}},
+ {{0, 24, 6}},
+ {{0, 27, 6}},
+ {{0, 30, 6}},
+ {{0, 32, 6}},
+ {{0, 34, 6}},
+ {{0, 36, 6}},
+ {{0, 38, 6}},
+ {{0, 40, 6}},
+ {{0, 42, 6}},
+ {{0, 44, 6}},
+ {{32, 1, 4}},
+ {{48, 1, 4}},
+ {{16, 2, 4}},
+ {{32, 4, 5}},
+ {{32, 5, 5}},
+ {{32, 7, 5}},
+ {{32, 8, 5}},
+ {{0, 11, 6}},
+ {{0, 14, 6}},
+ {{0, 17, 6}},
+ {{0, 20, 6}},
+ {{0, 23, 6}},
+ {{0, 26, 6}},
+ {{0, 29, 6}},
+ {{0, 52, 6}},
+ {{0, 51, 6}},
+ {{0, 50, 6}},
+ {{0, 49, 6}},
+ {{0, 48, 6}},
+ {{0, 47, 6}},
+ {{0, 46, 6}},
+}; /* ML_defaultDTable */
+
+static const FSE_decode_t4 OF_defaultDTable[(1 << OF_DEFAULTNORMLOG) + 1] = {
+ {{OF_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
+ {{0, 0, 5}}, /* 0 : base, symbol, bits */
+ {{0, 6, 4}},
+ {{0, 9, 5}},
+ {{0, 15, 5}},
+ {{0, 21, 5}},
+ {{0, 3, 5}},
+ {{0, 7, 4}},
+ {{0, 12, 5}},
+ {{0, 18, 5}},
+ {{0, 23, 5}},
+ {{0, 5, 5}},
+ {{0, 8, 4}},
+ {{0, 14, 5}},
+ {{0, 20, 5}},
+ {{0, 2, 5}},
+ {{16, 7, 4}},
+ {{0, 11, 5}},
+ {{0, 17, 5}},
+ {{0, 22, 5}},
+ {{0, 4, 5}},
+ {{16, 8, 4}},
+ {{0, 13, 5}},
+ {{0, 19, 5}},
+ {{0, 1, 5}},
+ {{16, 6, 4}},
+ {{0, 10, 5}},
+ {{0, 16, 5}},
+ {{0, 28, 5}},
+ {{0, 27, 5}},
+ {{0, 26, 5}},
+ {{0, 25, 5}},
+ {{0, 24, 5}},
+}; /* OF_defaultDTable */
+
+/*! ZSTD_buildSeqTable() :
+ @return : nb bytes read from src,
+ or an error code if it fails, testable with ZSTD_isError()
+*/
+static size_t ZSTD_buildSeqTable(FSE_DTable *DTableSpace, const FSE_DTable **DTablePtr, symbolEncodingType_e type, U32 max, U32 maxLog, const void *src,
+ size_t srcSize, const FSE_decode_t4 *defaultTable, U32 flagRepeatTable, void *workspace, size_t workspaceSize)
+{
+ const void *const tmpPtr = defaultTable; /* bypass strict aliasing */
+ switch (type) {
+ case set_rle:
+ if (!srcSize)
+ return ERROR(srcSize_wrong);
+ if ((*(const BYTE *)src) > max)
+ return ERROR(corruption_detected);
+ FSE_buildDTable_rle(DTableSpace, *(const BYTE *)src);
+ *DTablePtr = DTableSpace;
+ return 1;
+ case set_basic: *DTablePtr = (const FSE_DTable *)tmpPtr; return 0;
+ case set_repeat:
+ if (!flagRepeatTable)
+ return ERROR(corruption_detected);
+ return 0;
+ default: /* impossible */
+ case set_compressed: {
+ U32 tableLog;
+ S16 *norm = (S16 *)workspace;
+ size_t const spaceUsed32 = ALIGN(sizeof(S16) * (MaxSeq + 1), sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(GENERIC);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+ {
+ size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
+ if (FSE_isError(headerSize))
+ return ERROR(corruption_detected);
+ if (tableLog > maxLog)
+ return ERROR(corruption_detected);
+ FSE_buildDTable_wksp(DTableSpace, norm, max, tableLog, workspace, workspaceSize);
+ *DTablePtr = DTableSpace;
+ return headerSize;
+ }
+ }
+ }
+}
+
+size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx *dctx, int *nbSeqPtr, const void *src, size_t srcSize)
+{
+ const BYTE *const istart = (const BYTE *const)src;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *ip = istart;
+
+ /* check */
+ if (srcSize < MIN_SEQUENCES_SIZE)
+ return ERROR(srcSize_wrong);
+
+ /* SeqHead */
+ {
+ int nbSeq = *ip++;
+ if (!nbSeq) {
+ *nbSeqPtr = 0;
+ return 1;
+ }
+ if (nbSeq > 0x7F) {
+ if (nbSeq == 0xFF) {
+ if (ip + 2 > iend)
+ return ERROR(srcSize_wrong);
+ nbSeq = ZSTD_readLE16(ip) + LONGNBSEQ, ip += 2;
+ } else {
+ if (ip >= iend)
+ return ERROR(srcSize_wrong);
+ nbSeq = ((nbSeq - 0x80) << 8) + *ip++;
+ }
+ }
+ *nbSeqPtr = nbSeq;
+ }
+
+ /* FSE table descriptors */
+ if (ip + 4 > iend)
+ return ERROR(srcSize_wrong); /* minimum possible size */
+ {
+ symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
+ symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
+ symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
+ ip++;
+
+ /* Build DTables */
+ {
+ size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr, LLtype, MaxLL, LLFSELog, ip, iend - ip,
+ LL_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
+ if (ZSTD_isError(llhSize))
+ return ERROR(corruption_detected);
+ ip += llhSize;
+ }
+ {
+ size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr, OFtype, MaxOff, OffFSELog, ip, iend - ip,
+ OF_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
+ if (ZSTD_isError(ofhSize))
+ return ERROR(corruption_detected);
+ ip += ofhSize;
+ }
+ {
+ size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr, MLtype, MaxML, MLFSELog, ip, iend - ip,
+ ML_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
+ if (ZSTD_isError(mlhSize))
+ return ERROR(corruption_detected);
+ ip += mlhSize;
+ }
+ }
+
+ return ip - istart;
+}
+
+typedef struct {
+ size_t litLength;
+ size_t matchLength;
+ size_t offset;
+ const BYTE *match;
+} seq_t;
+
+typedef struct {
+ BIT_DStream_t DStream;
+ FSE_DState_t stateLL;
+ FSE_DState_t stateOffb;
+ FSE_DState_t stateML;
+ size_t prevOffset[ZSTD_REP_NUM];
+ const BYTE *base;
+ size_t pos;
+ uPtrDiff gotoDict;
+} seqState_t;
+
+FORCE_NOINLINE
+size_t ZSTD_execSequenceLast7(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
+ const BYTE *const vBase, const BYTE *const dictEnd)
+{
+ BYTE *const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
+ const BYTE *const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE *match = oLitEnd - sequence.offset;
+
+ /* check */
+ if (oMatchEnd > oend)
+ return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
+ if (iLitEnd > litLimit)
+ return ERROR(corruption_detected); /* over-read beyond lit buffer */
+ if (oLitEnd <= oend_w)
+ return ERROR(GENERIC); /* Precondition */
+
+ /* copy literals */
+ if (op < oend_w) {
+ ZSTD_wildcopy(op, *litPtr, oend_w - op);
+ *litPtr += oend_w - op;
+ op = oend_w;
+ }
+ while (op < oLitEnd)
+ *op++ = *(*litPtr)++;
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - base)) {
+ /* offset beyond prefix */
+ if (sequence.offset > (size_t)(oLitEnd - vBase))
+ return ERROR(corruption_detected);
+ match = dictEnd - (base - match);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currPrefixSegment */
+ {
+ size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = base;
+ }
+ }
+ while (op < oMatchEnd)
+ *op++ = *match++;
+ return sequenceLength;
+}
+
+static seq_t ZSTD_decodeSequence(seqState_t *seqState)
+{
+ seq_t seq;
+
+ U32 const llCode = FSE_peekSymbol(&seqState->stateLL);
+ U32 const mlCode = FSE_peekSymbol(&seqState->stateML);
+ U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */
+
+ U32 const llBits = LL_bits[llCode];
+ U32 const mlBits = ML_bits[mlCode];
+ U32 const ofBits = ofCode;
+ U32 const totalBits = llBits + mlBits + ofBits;
+
+ static const U32 LL_base[MaxLL + 1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18,
+ 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000};
+
+ static const U32 ML_base[MaxML + 1] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41,
+ 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 0x1003, 0x2003, 0x4003, 0x8003, 0x10003};
+
+ static const U32 OF_base[MaxOff + 1] = {0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, 0xFD, 0x1FD,
+ 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD,
+ 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD};
+
+ /* sequence */
+ {
+ size_t offset;
+ if (!ofCode)
+ offset = 0;
+ else {
+ offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
+ if (ZSTD_32bits())
+ BIT_reloadDStream(&seqState->DStream);
+ }
+
+ if (ofCode <= 1) {
+ offset += (llCode == 0);
+ if (offset) {
+ size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
+ temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
+ if (offset != 1)
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset = temp;
+ } else {
+ offset = seqState->prevOffset[0];
+ }
+ } else {
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset;
+ }
+ seq.offset = offset;
+ }
+
+ seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
+ if (ZSTD_32bits() && (mlBits + llBits > 24))
+ BIT_reloadDStream(&seqState->DStream);
+
+ seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
+ if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog)))
+ BIT_reloadDStream(&seqState->DStream);
+
+ /* ANS state update */
+ FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
+ FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
+ if (ZSTD_32bits())
+ BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
+ FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
+
+ seq.match = NULL;
+
+ return seq;
+}
+
+FORCE_INLINE
+size_t ZSTD_execSequence(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
+ const BYTE *const vBase, const BYTE *const dictEnd)
+{
+ BYTE *const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
+ const BYTE *const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE *match = oLitEnd - sequence.offset;
+
+ /* check */
+ if (oMatchEnd > oend)
+ return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
+ if (iLitEnd > litLimit)
+ return ERROR(corruption_detected); /* over-read beyond lit buffer */
+ if (oLitEnd > oend_w)
+ return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
+
+ /* copy Literals */
+ ZSTD_copy8(op, *litPtr);
+ if (sequence.litLength > 8)
+ ZSTD_wildcopy(op + 8, (*litPtr) + 8,
+ sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
+ op = oLitEnd;
+ *litPtr = iLitEnd; /* update for next sequence */
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - base)) {
+ /* offset beyond prefix */
+ if (sequence.offset > (size_t)(oLitEnd - vBase))
+ return ERROR(corruption_detected);
+ match = dictEnd + (match - base);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currPrefixSegment */
+ {
+ size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = base;
+ if (op > oend_w || sequence.matchLength < MINMATCH) {
+ U32 i;
+ for (i = 0; i < sequence.matchLength; ++i)
+ op[i] = match[i];
+ return sequenceLength;
+ }
+ }
+ }
+ /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
+
+ /* match within prefix */
+ if (sequence.offset < 8) {
+ /* close range match, overlap */
+ static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
+ static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */
+ int const sub2 = dec64table[sequence.offset];
+ op[0] = match[0];
+ op[1] = match[1];
+ op[2] = match[2];
+ op[3] = match[3];
+ match += dec32table[sequence.offset];
+ ZSTD_copy4(op + 4, match);
+ match -= sub2;
+ } else {
+ ZSTD_copy8(op, match);
+ }
+ op += 8;
+ match += 8;
+
+ if (oMatchEnd > oend - (16 - MINMATCH)) {
+ if (op < oend_w) {
+ ZSTD_wildcopy(op, match, oend_w - op);
+ match += oend_w - op;
+ op = oend_w;
+ }
+ while (op < oMatchEnd)
+ *op++ = *match++;
+ } else {
+ ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */
+ }
+ return sequenceLength;
+}
+
+static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDstSize, const void *seqStart, size_t seqSize)
+{
+ const BYTE *ip = (const BYTE *)seqStart;
+ const BYTE *const iend = ip + seqSize;
+ BYTE *const ostart = (BYTE * const)dst;
+ BYTE *const oend = ostart + maxDstSize;
+ BYTE *op = ostart;
+ const BYTE *litPtr = dctx->litPtr;
+ const BYTE *const litEnd = litPtr + dctx->litSize;
+ const BYTE *const base = (const BYTE *)(dctx->base);
+ const BYTE *const vBase = (const BYTE *)(dctx->vBase);
+ const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd);
+ int nbSeq;
+
+ /* Build Decoding Tables */
+ {
+ size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, seqSize);
+ if (ZSTD_isError(seqHSize))
+ return seqHSize;
+ ip += seqHSize;
+ }
+
+ /* Regen sequences */
+ if (nbSeq) {
+ seqState_t seqState;
+ dctx->fseEntropy = 1;
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ seqState.prevOffset[i] = dctx->entropy.rep[i];
+ }
+ CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected);
+ FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
+ FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
+ FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
+
+ for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq;) {
+ nbSeq--;
+ {
+ seq_t const sequence = ZSTD_decodeSequence(&seqState);
+ size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
+ if (ZSTD_isError(oneSeqSize))
+ return oneSeqSize;
+ op += oneSeqSize;
+ }
+ }
+
+ /* check if reached exact end */
+ if (nbSeq)
+ return ERROR(corruption_detected);
+ /* save reps for next block */
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]);
+ }
+ }
+
+ /* last literal segment */
+ {
+ size_t const lastLLSize = litEnd - litPtr;
+ if (lastLLSize > (size_t)(oend - op))
+ return ERROR(dstSize_tooSmall);
+ memcpy(op, litPtr, lastLLSize);
+ op += lastLLSize;
+ }
+
+ return op - ostart;
+}
+
+FORCE_INLINE seq_t ZSTD_decodeSequenceLong_generic(seqState_t *seqState, int const longOffsets)
+{
+ seq_t seq;
+
+ U32 const llCode = FSE_peekSymbol(&seqState->stateLL);
+ U32 const mlCode = FSE_peekSymbol(&seqState->stateML);
+ U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */
+
+ U32 const llBits = LL_bits[llCode];
+ U32 const mlBits = ML_bits[mlCode];
+ U32 const ofBits = ofCode;
+ U32 const totalBits = llBits + mlBits + ofBits;
+
+ static const U32 LL_base[MaxLL + 1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18,
+ 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000};
+
+ static const U32 ML_base[MaxML + 1] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41,
+ 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 0x1003, 0x2003, 0x4003, 0x8003, 0x10003};
+
+ static const U32 OF_base[MaxOff + 1] = {0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, 0xFD, 0x1FD,
+ 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD,
+ 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD};
+
+ /* sequence */
+ {
+ size_t offset;
+ if (!ofCode)
+ offset = 0;
+ else {
+ if (longOffsets) {
+ int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN);
+ offset = OF_base[ofCode] + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
+ if (ZSTD_32bits() || extraBits)
+ BIT_reloadDStream(&seqState->DStream);
+ if (extraBits)
+ offset += BIT_readBitsFast(&seqState->DStream, extraBits);
+ } else {
+ offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
+ if (ZSTD_32bits())
+ BIT_reloadDStream(&seqState->DStream);
+ }
+ }
+
+ if (ofCode <= 1) {
+ offset += (llCode == 0);
+ if (offset) {
+ size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
+ temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
+ if (offset != 1)
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset = temp;
+ } else {
+ offset = seqState->prevOffset[0];
+ }
+ } else {
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset;
+ }
+ seq.offset = offset;
+ }
+
+ seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
+ if (ZSTD_32bits() && (mlBits + llBits > 24))
+ BIT_reloadDStream(&seqState->DStream);
+
+ seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
+ if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog)))
+ BIT_reloadDStream(&seqState->DStream);
+
+ {
+ size_t const pos = seqState->pos + seq.litLength;
+ seq.match = seqState->base + pos - seq.offset; /* single memory segment */
+ if (seq.offset > pos)
+ seq.match += seqState->gotoDict; /* separate memory segment */
+ seqState->pos = pos + seq.matchLength;
+ }
+
+ /* ANS state update */
+ FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
+ FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
+ if (ZSTD_32bits())
+ BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
+ FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
+
+ return seq;
+}
+
+static seq_t ZSTD_decodeSequenceLong(seqState_t *seqState, unsigned const windowSize)
+{
+ if (ZSTD_highbit32(windowSize) > STREAM_ACCUMULATOR_MIN) {
+ return ZSTD_decodeSequenceLong_generic(seqState, 1);
+ } else {
+ return ZSTD_decodeSequenceLong_generic(seqState, 0);
+ }
+}
+
+FORCE_INLINE
+size_t ZSTD_execSequenceLong(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
+ const BYTE *const vBase, const BYTE *const dictEnd)
+{
+ BYTE *const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
+ const BYTE *const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE *match = sequence.match;
+
+ /* check */
+ if (oMatchEnd > oend)
+ return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
+ if (iLitEnd > litLimit)
+ return ERROR(corruption_detected); /* over-read beyond lit buffer */
+ if (oLitEnd > oend_w)
+ return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
+
+ /* copy Literals */
+ ZSTD_copy8(op, *litPtr);
+ if (sequence.litLength > 8)
+ ZSTD_wildcopy(op + 8, (*litPtr) + 8,
+ sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
+ op = oLitEnd;
+ *litPtr = iLitEnd; /* update for next sequence */
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - base)) {
+ /* offset beyond prefix */
+ if (sequence.offset > (size_t)(oLitEnd - vBase))
+ return ERROR(corruption_detected);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currPrefixSegment */
+ {
+ size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = base;
+ if (op > oend_w || sequence.matchLength < MINMATCH) {
+ U32 i;
+ for (i = 0; i < sequence.matchLength; ++i)
+ op[i] = match[i];
+ return sequenceLength;
+ }
+ }
+ }
+ /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
+
+ /* match within prefix */
+ if (sequence.offset < 8) {
+ /* close range match, overlap */
+ static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
+ static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */
+ int const sub2 = dec64table[sequence.offset];
+ op[0] = match[0];
+ op[1] = match[1];
+ op[2] = match[2];
+ op[3] = match[3];
+ match += dec32table[sequence.offset];
+ ZSTD_copy4(op + 4, match);
+ match -= sub2;
+ } else {
+ ZSTD_copy8(op, match);
+ }
+ op += 8;
+ match += 8;
+
+ if (oMatchEnd > oend - (16 - MINMATCH)) {
+ if (op < oend_w) {
+ ZSTD_wildcopy(op, match, oend_w - op);
+ match += oend_w - op;
+ op = oend_w;
+ }
+ while (op < oMatchEnd)
+ *op++ = *match++;
+ } else {
+ ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */
+ }
+ return sequenceLength;
+}
+
+static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx *dctx, void *dst, size_t maxDstSize, const void *seqStart, size_t seqSize)
+{
+ const BYTE *ip = (const BYTE *)seqStart;
+ const BYTE *const iend = ip + seqSize;
+ BYTE *const ostart = (BYTE * const)dst;
+ BYTE *const oend = ostart + maxDstSize;
+ BYTE *op = ostart;
+ const BYTE *litPtr = dctx->litPtr;
+ const BYTE *const litEnd = litPtr + dctx->litSize;
+ const BYTE *const base = (const BYTE *)(dctx->base);
+ const BYTE *const vBase = (const BYTE *)(dctx->vBase);
+ const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd);
+ unsigned const windowSize = dctx->fParams.windowSize;
+ int nbSeq;
+
+ /* Build Decoding Tables */
+ {
+ size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, seqSize);
+ if (ZSTD_isError(seqHSize))
+ return seqHSize;
+ ip += seqHSize;
+ }
+
+ /* Regen sequences */
+ if (nbSeq) {
+#define STORED_SEQS 4
+#define STOSEQ_MASK (STORED_SEQS - 1)
+#define ADVANCED_SEQS 4
+ seq_t *sequences = (seq_t *)dctx->entropy.workspace;
+ int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
+ seqState_t seqState;
+ int seqNb;
+ ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.workspace) >= sizeof(seq_t) * STORED_SEQS);
+ dctx->fseEntropy = 1;
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ seqState.prevOffset[i] = dctx->entropy.rep[i];
+ }
+ seqState.base = base;
+ seqState.pos = (size_t)(op - base);
+ seqState.gotoDict = (uPtrDiff)dictEnd - (uPtrDiff)base; /* cast to avoid undefined behaviour */
+ CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected);
+ FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
+ FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
+ FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
+
+ /* prepare in advance */
+ for (seqNb = 0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && seqNb < seqAdvance; seqNb++) {
+ sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, windowSize);
+ }
+ if (seqNb < seqAdvance)
+ return ERROR(corruption_detected);
+
+ /* decode and decompress */
+ for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && seqNb < nbSeq; seqNb++) {
+ seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, windowSize);
+ size_t const oneSeqSize =
+ ZSTD_execSequenceLong(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd);
+ if (ZSTD_isError(oneSeqSize))
+ return oneSeqSize;
+ ZSTD_PREFETCH(sequence.match);
+ sequences[seqNb & STOSEQ_MASK] = sequence;
+ op += oneSeqSize;
+ }
+ if (seqNb < nbSeq)
+ return ERROR(corruption_detected);
+
+ /* finish queue */
+ seqNb -= seqAdvance;
+ for (; seqNb < nbSeq; seqNb++) {
+ size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd);
+ if (ZSTD_isError(oneSeqSize))
+ return oneSeqSize;
+ op += oneSeqSize;
+ }
+
+ /* save reps for next block */
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]);
+ }
+ }
+
+ /* last literal segment */
+ {
+ size_t const lastLLSize = litEnd - litPtr;
+ if (lastLLSize > (size_t)(oend - op))
+ return ERROR(dstSize_tooSmall);
+ memcpy(op, litPtr, lastLLSize);
+ op += lastLLSize;
+ }
+
+ return op - ostart;
+}
+
+static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{ /* blockType == blockCompressed */
+ const BYTE *ip = (const BYTE *)src;
+
+ if (srcSize >= ZSTD_BLOCKSIZE_ABSOLUTEMAX)
+ return ERROR(srcSize_wrong);
+
+ /* Decode literals section */
+ {
+ size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
+ if (ZSTD_isError(litCSize))
+ return litCSize;
+ ip += litCSize;
+ srcSize -= litCSize;
+ }
+ if (sizeof(size_t) > 4) /* do not enable prefetching on 32-bits x86, as it's performance detrimental */
+ /* likely because of register pressure */
+ /* if that's the correct cause, then 32-bits ARM should be affected differently */
+ /* it would be good to test this on ARM real hardware, to see if prefetch version improves speed */
+ if (dctx->fParams.windowSize > (1 << 23))
+ return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize);
+ return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize);
+}
+
+static void ZSTD_checkContinuity(ZSTD_DCtx *dctx, const void *dst)
+{
+ if (dst != dctx->previousDstEnd) { /* not contiguous */
+ dctx->dictEnd = dctx->previousDstEnd;
+ dctx->vBase = (const char *)dst - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->base));
+ dctx->base = dst;
+ dctx->previousDstEnd = dst;
+ }
+}
+
+size_t ZSTD_decompressBlock(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t dSize;
+ ZSTD_checkContinuity(dctx, dst);
+ dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
+ dctx->previousDstEnd = (char *)dst + dSize;
+ return dSize;
+}
+
+/** ZSTD_insertBlock() :
+ insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
+size_t ZSTD_insertBlock(ZSTD_DCtx *dctx, const void *blockStart, size_t blockSize)
+{
+ ZSTD_checkContinuity(dctx, blockStart);
+ dctx->previousDstEnd = (const char *)blockStart + blockSize;
+ return blockSize;
+}
+
+size_t ZSTD_generateNxBytes(void *dst, size_t dstCapacity, BYTE byte, size_t length)
+{
+ if (length > dstCapacity)
+ return ERROR(dstSize_tooSmall);
+ memset(dst, byte, length);
+ return length;
+}
+
+/** ZSTD_findFrameCompressedSize() :
+ * compatible with legacy mode
+ * `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
+ * `srcSize` must be at least as large as the frame contained
+ * @return : the compressed size of the frame starting at `src` */
+size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
+{
+ if (srcSize >= ZSTD_skippableHeaderSize && (ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+ return ZSTD_skippableHeaderSize + ZSTD_readLE32((const BYTE *)src + 4);
+ } else {
+ const BYTE *ip = (const BYTE *)src;
+ const BYTE *const ipstart = ip;
+ size_t remainingSize = srcSize;
+ ZSTD_frameParams fParams;
+
+ size_t const headerSize = ZSTD_frameHeaderSize(ip, remainingSize);
+ if (ZSTD_isError(headerSize))
+ return headerSize;
+
+ /* Frame Header */
+ {
+ size_t const ret = ZSTD_getFrameParams(&fParams, ip, remainingSize);
+ if (ZSTD_isError(ret))
+ return ret;
+ if (ret > 0)
+ return ERROR(srcSize_wrong);
+ }
+
+ ip += headerSize;
+ remainingSize -= headerSize;
+
+ /* Loop on each block */
+ while (1) {
+ blockProperties_t blockProperties;
+ size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
+ if (ZSTD_isError(cBlockSize))
+ return cBlockSize;
+
+ if (ZSTD_blockHeaderSize + cBlockSize > remainingSize)
+ return ERROR(srcSize_wrong);
+
+ ip += ZSTD_blockHeaderSize + cBlockSize;
+ remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
+
+ if (blockProperties.lastBlock)
+ break;
+ }
+
+ if (fParams.checksumFlag) { /* Frame content checksum */
+ if (remainingSize < 4)
+ return ERROR(srcSize_wrong);
+ ip += 4;
+ remainingSize -= 4;
+ }
+
+ return ip - ipstart;
+ }
+}
+
+/*! ZSTD_decompressFrame() :
+* @dctx must be properly initialized */
+static size_t ZSTD_decompressFrame(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void **srcPtr, size_t *srcSizePtr)
+{
+ const BYTE *ip = (const BYTE *)(*srcPtr);
+ BYTE *const ostart = (BYTE * const)dst;
+ BYTE *const oend = ostart + dstCapacity;
+ BYTE *op = ostart;
+ size_t remainingSize = *srcSizePtr;
+
+ /* check */
+ if (remainingSize < ZSTD_frameHeaderSize_min + ZSTD_blockHeaderSize)
+ return ERROR(srcSize_wrong);
+
+ /* Frame Header */
+ {
+ size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
+ if (ZSTD_isError(frameHeaderSize))
+ return frameHeaderSize;
+ if (remainingSize < frameHeaderSize + ZSTD_blockHeaderSize)
+ return ERROR(srcSize_wrong);
+ CHECK_F(ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize));
+ ip += frameHeaderSize;
+ remainingSize -= frameHeaderSize;
+ }
+
+ /* Loop on each block */
+ while (1) {
+ size_t decodedSize;
+ blockProperties_t blockProperties;
+ size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
+ if (ZSTD_isError(cBlockSize))
+ return cBlockSize;
+
+ ip += ZSTD_blockHeaderSize;
+ remainingSize -= ZSTD_blockHeaderSize;
+ if (cBlockSize > remainingSize)
+ return ERROR(srcSize_wrong);
+
+ switch (blockProperties.blockType) {
+ case bt_compressed: decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend - op, ip, cBlockSize); break;
+ case bt_raw: decodedSize = ZSTD_copyRawBlock(op, oend - op, ip, cBlockSize); break;
+ case bt_rle: decodedSize = ZSTD_generateNxBytes(op, oend - op, *ip, blockProperties.origSize); break;
+ case bt_reserved:
+ default: return ERROR(corruption_detected);
+ }
+
+ if (ZSTD_isError(decodedSize))
+ return decodedSize;
+ if (dctx->fParams.checksumFlag)
+ xxh64_update(&dctx->xxhState, op, decodedSize);
+ op += decodedSize;
+ ip += cBlockSize;
+ remainingSize -= cBlockSize;
+ if (blockProperties.lastBlock)
+ break;
+ }
+
+ if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
+ U32 const checkCalc = (U32)xxh64_digest(&dctx->xxhState);
+ U32 checkRead;
+ if (remainingSize < 4)
+ return ERROR(checksum_wrong);
+ checkRead = ZSTD_readLE32(ip);
+ if (checkRead != checkCalc)
+ return ERROR(checksum_wrong);
+ ip += 4;
+ remainingSize -= 4;
+ }
+
+ /* Allow caller to get size read */
+ *srcPtr = ip;
+ *srcSizePtr = remainingSize;
+ return op - ostart;
+}
+
+static const void *ZSTD_DDictDictContent(const ZSTD_DDict *ddict);
+static size_t ZSTD_DDictDictSize(const ZSTD_DDict *ddict);
+
+static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize,
+ const ZSTD_DDict *ddict)
+{
+ void *const dststart = dst;
+
+ if (ddict) {
+ if (dict) {
+ /* programmer error, these two cases should be mutually exclusive */
+ return ERROR(GENERIC);
+ }
+
+ dict = ZSTD_DDictDictContent(ddict);
+ dictSize = ZSTD_DDictDictSize(ddict);
+ }
+
+ while (srcSize >= ZSTD_frameHeaderSize_prefix) {
+ U32 magicNumber;
+
+ magicNumber = ZSTD_readLE32(src);
+ if (magicNumber != ZSTD_MAGICNUMBER) {
+ if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+ size_t skippableSize;
+ if (srcSize < ZSTD_skippableHeaderSize)
+ return ERROR(srcSize_wrong);
+ skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize;
+ if (srcSize < skippableSize) {
+ return ERROR(srcSize_wrong);
+ }
+
+ src = (const BYTE *)src + skippableSize;
+ srcSize -= skippableSize;
+ continue;
+ } else {
+ return ERROR(prefix_unknown);
+ }
+ }
+
+ if (ddict) {
+ /* we were called from ZSTD_decompress_usingDDict */
+ ZSTD_refDDict(dctx, ddict);
+ } else {
+ /* this will initialize correctly with no dict if dict == NULL, so
+ * use this in all cases but ddict */
+ CHECK_F(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize));
+ }
+ ZSTD_checkContinuity(dctx, dst);
+
+ {
+ const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity, &src, &srcSize);
+ if (ZSTD_isError(res))
+ return res;
+ /* don't need to bounds check this, ZSTD_decompressFrame will have
+ * already */
+ dst = (BYTE *)dst + res;
+ dstCapacity -= res;
+ }
+ }
+
+ if (srcSize)
+ return ERROR(srcSize_wrong); /* input not entirely consumed */
+
+ return (BYTE *)dst - (BYTE *)dststart;
+}
+
+size_t ZSTD_decompress_usingDict(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize)
+{
+ return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL);
+}
+
+size_t ZSTD_decompressDCtx(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
+}
+
+/*-**************************************
+* Advanced Streaming Decompression API
+* Bufferless and synchronous
+****************************************/
+size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx *dctx) { return dctx->expected; }
+
+ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx *dctx)
+{
+ switch (dctx->stage) {
+ default: /* should not happen */
+ case ZSTDds_getFrameHeaderSize:
+ case ZSTDds_decodeFrameHeader: return ZSTDnit_frameHeader;
+ case ZSTDds_decodeBlockHeader: return ZSTDnit_blockHeader;
+ case ZSTDds_decompressBlock: return ZSTDnit_block;
+ case ZSTDds_decompressLastBlock: return ZSTDnit_lastBlock;
+ case ZSTDds_checkChecksum: return ZSTDnit_checksum;
+ case ZSTDds_decodeSkippableHeader:
+ case ZSTDds_skipFrame: return ZSTDnit_skippableFrame;
+ }
+}
+
+int ZSTD_isSkipFrame(ZSTD_DCtx *dctx) { return dctx->stage == ZSTDds_skipFrame; } /* for zbuff */
+
+/** ZSTD_decompressContinue() :
+* @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity)
+* or an error code, which can be tested using ZSTD_isError() */
+size_t ZSTD_decompressContinue(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ /* Sanity check */
+ if (srcSize != dctx->expected)
+ return ERROR(srcSize_wrong);
+ if (dstCapacity)
+ ZSTD_checkContinuity(dctx, dst);
+
+ switch (dctx->stage) {
+ case ZSTDds_getFrameHeaderSize:
+ if (srcSize != ZSTD_frameHeaderSize_prefix)
+ return ERROR(srcSize_wrong); /* impossible */
+ if ((ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
+ memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix);
+ dctx->expected = ZSTD_skippableHeaderSize - ZSTD_frameHeaderSize_prefix; /* magic number + skippable frame length */
+ dctx->stage = ZSTDds_decodeSkippableHeader;
+ return 0;
+ }
+ dctx->headerSize = ZSTD_frameHeaderSize(src, ZSTD_frameHeaderSize_prefix);
+ if (ZSTD_isError(dctx->headerSize))
+ return dctx->headerSize;
+ memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix);
+ if (dctx->headerSize > ZSTD_frameHeaderSize_prefix) {
+ dctx->expected = dctx->headerSize - ZSTD_frameHeaderSize_prefix;
+ dctx->stage = ZSTDds_decodeFrameHeader;
+ return 0;
+ }
+ dctx->expected = 0; /* not necessary to copy more */
+
+ case ZSTDds_decodeFrameHeader:
+ memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
+ CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize));
+ dctx->expected = ZSTD_blockHeaderSize;
+ dctx->stage = ZSTDds_decodeBlockHeader;
+ return 0;
+
+ case ZSTDds_decodeBlockHeader: {
+ blockProperties_t bp;
+ size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
+ if (ZSTD_isError(cBlockSize))
+ return cBlockSize;
+ dctx->expected = cBlockSize;
+ dctx->bType = bp.blockType;
+ dctx->rleSize = bp.origSize;
+ if (cBlockSize) {
+ dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock;
+ return 0;
+ }
+ /* empty block */
+ if (bp.lastBlock) {
+ if (dctx->fParams.checksumFlag) {
+ dctx->expected = 4;
+ dctx->stage = ZSTDds_checkChecksum;
+ } else {
+ dctx->expected = 0; /* end of frame */
+ dctx->stage = ZSTDds_getFrameHeaderSize;
+ }
+ } else {
+ dctx->expected = 3; /* go directly to next header */
+ dctx->stage = ZSTDds_decodeBlockHeader;
+ }
+ return 0;
+ }
+ case ZSTDds_decompressLastBlock:
+ case ZSTDds_decompressBlock: {
+ size_t rSize;
+ switch (dctx->bType) {
+ case bt_compressed: rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize); break;
+ case bt_raw: rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize); break;
+ case bt_rle: rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize); break;
+ case bt_reserved: /* should never happen */
+ default: return ERROR(corruption_detected);
+ }
+ if (ZSTD_isError(rSize))
+ return rSize;
+ if (dctx->fParams.checksumFlag)
+ xxh64_update(&dctx->xxhState, dst, rSize);
+
+ if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */
+ if (dctx->fParams.checksumFlag) { /* another round for frame checksum */
+ dctx->expected = 4;
+ dctx->stage = ZSTDds_checkChecksum;
+ } else {
+ dctx->expected = 0; /* ends here */
+ dctx->stage = ZSTDds_getFrameHeaderSize;
+ }
+ } else {
+ dctx->stage = ZSTDds_decodeBlockHeader;
+ dctx->expected = ZSTD_blockHeaderSize;
+ dctx->previousDstEnd = (char *)dst + rSize;
+ }
+ return rSize;
+ }
+ case ZSTDds_checkChecksum: {
+ U32 const h32 = (U32)xxh64_digest(&dctx->xxhState);
+ U32 const check32 = ZSTD_readLE32(src); /* srcSize == 4, guaranteed by dctx->expected */
+ if (check32 != h32)
+ return ERROR(checksum_wrong);
+ dctx->expected = 0;
+ dctx->stage = ZSTDds_getFrameHeaderSize;
+ return 0;
+ }
+ case ZSTDds_decodeSkippableHeader: {
+ memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
+ dctx->expected = ZSTD_readLE32(dctx->headerBuffer + 4);
+ dctx->stage = ZSTDds_skipFrame;
+ return 0;
+ }
+ case ZSTDds_skipFrame: {
+ dctx->expected = 0;
+ dctx->stage = ZSTDds_getFrameHeaderSize;
+ return 0;
+ }
+ default:
+ return ERROR(GENERIC); /* impossible */
+ }
+}
+
+static size_t ZSTD_refDictContent(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
+{
+ dctx->dictEnd = dctx->previousDstEnd;
+ dctx->vBase = (const char *)dict - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->base));
+ dctx->base = dict;
+ dctx->previousDstEnd = (const char *)dict + dictSize;
+ return 0;
+}
+
+/* ZSTD_loadEntropy() :
+ * dict : must point at beginning of a valid zstd dictionary
+ * @return : size of entropy tables read */
+static size_t ZSTD_loadEntropy(ZSTD_entropyTables_t *entropy, const void *const dict, size_t const dictSize)
+{
+ const BYTE *dictPtr = (const BYTE *)dict;
+ const BYTE *const dictEnd = dictPtr + dictSize;
+
+ if (dictSize <= 8)
+ return ERROR(dictionary_corrupted);
+ dictPtr += 8; /* skip header = magic + dictID */
+
+ {
+ size_t const hSize = HUF_readDTableX4_wksp(entropy->hufTable, dictPtr, dictEnd - dictPtr, entropy->workspace, sizeof(entropy->workspace));
+ if (HUF_isError(hSize))
+ return ERROR(dictionary_corrupted);
+ dictPtr += hSize;
+ }
+
+ {
+ short offcodeNCount[MaxOff + 1];
+ U32 offcodeMaxValue = MaxOff, offcodeLog;
+ size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(offcodeHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (offcodeLog > OffFSELog)
+ return ERROR(dictionary_corrupted);
+ CHECK_E(FSE_buildDTable_wksp(entropy->OFTable, offcodeNCount, offcodeMaxValue, offcodeLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
+ dictPtr += offcodeHeaderSize;
+ }
+
+ {
+ short matchlengthNCount[MaxML + 1];
+ unsigned matchlengthMaxValue = MaxML, matchlengthLog;
+ size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(matchlengthHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (matchlengthLog > MLFSELog)
+ return ERROR(dictionary_corrupted);
+ CHECK_E(FSE_buildDTable_wksp(entropy->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
+ dictPtr += matchlengthHeaderSize;
+ }
+
+ {
+ short litlengthNCount[MaxLL + 1];
+ unsigned litlengthMaxValue = MaxLL, litlengthLog;
+ size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd - dictPtr);
+ if (FSE_isError(litlengthHeaderSize))
+ return ERROR(dictionary_corrupted);
+ if (litlengthLog > LLFSELog)
+ return ERROR(dictionary_corrupted);
+ CHECK_E(FSE_buildDTable_wksp(entropy->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
+ dictPtr += litlengthHeaderSize;
+ }
+
+ if (dictPtr + 12 > dictEnd)
+ return ERROR(dictionary_corrupted);
+ {
+ int i;
+ size_t const dictContentSize = (size_t)(dictEnd - (dictPtr + 12));
+ for (i = 0; i < 3; i++) {
+ U32 const rep = ZSTD_readLE32(dictPtr);
+ dictPtr += 4;
+ if (rep == 0 || rep >= dictContentSize)
+ return ERROR(dictionary_corrupted);
+ entropy->rep[i] = rep;
+ }
+ }
+
+ return dictPtr - (const BYTE *)dict;
+}
+
+static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
+{
+ if (dictSize < 8)
+ return ZSTD_refDictContent(dctx, dict, dictSize);
+ {
+ U32 const magic = ZSTD_readLE32(dict);
+ if (magic != ZSTD_DICT_MAGIC) {
+ return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */
+ }
+ }
+ dctx->dictID = ZSTD_readLE32((const char *)dict + 4);
+
+ /* load entropy tables */
+ {
+ size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
+ if (ZSTD_isError(eSize))
+ return ERROR(dictionary_corrupted);
+ dict = (const char *)dict + eSize;
+ dictSize -= eSize;
+ }
+ dctx->litEntropy = dctx->fseEntropy = 1;
+
+ /* reference dictionary content */
+ return ZSTD_refDictContent(dctx, dict, dictSize);
+}
+
+size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
+{
+ CHECK_F(ZSTD_decompressBegin(dctx));
+ if (dict && dictSize)
+ CHECK_E(ZSTD_decompress_insertDictionary(dctx, dict, dictSize), dictionary_corrupted);
+ return 0;
+}
+
+/* ====== ZSTD_DDict ====== */
+
+struct ZSTD_DDict_s {
+ void *dictBuffer;
+ const void *dictContent;
+ size_t dictSize;
+ ZSTD_entropyTables_t entropy;
+ U32 dictID;
+ U32 entropyPresent;
+ ZSTD_customMem cMem;
+}; /* typedef'd to ZSTD_DDict within "zstd.h" */
+
+size_t ZSTD_DDictWorkspaceBound(void) { return ZSTD_ALIGN(sizeof(ZSTD_stack)) + ZSTD_ALIGN(sizeof(ZSTD_DDict)); }
+
+static const void *ZSTD_DDictDictContent(const ZSTD_DDict *ddict) { return ddict->dictContent; }
+
+static size_t ZSTD_DDictDictSize(const ZSTD_DDict *ddict) { return ddict->dictSize; }
+
+static void ZSTD_refDDict(ZSTD_DCtx *dstDCtx, const ZSTD_DDict *ddict)
+{
+ ZSTD_decompressBegin(dstDCtx); /* init */
+ if (ddict) { /* support refDDict on NULL */
+ dstDCtx->dictID = ddict->dictID;
+ dstDCtx->base = ddict->dictContent;
+ dstDCtx->vBase = ddict->dictContent;
+ dstDCtx->dictEnd = (const BYTE *)ddict->dictContent + ddict->dictSize;
+ dstDCtx->previousDstEnd = dstDCtx->dictEnd;
+ if (ddict->entropyPresent) {
+ dstDCtx->litEntropy = 1;
+ dstDCtx->fseEntropy = 1;
+ dstDCtx->LLTptr = ddict->entropy.LLTable;
+ dstDCtx->MLTptr = ddict->entropy.MLTable;
+ dstDCtx->OFTptr = ddict->entropy.OFTable;
+ dstDCtx->HUFptr = ddict->entropy.hufTable;
+ dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
+ dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
+ dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
+ } else {
+ dstDCtx->litEntropy = 0;
+ dstDCtx->fseEntropy = 0;
+ }
+ }
+}
+
+static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict *ddict)
+{
+ ddict->dictID = 0;
+ ddict->entropyPresent = 0;
+ if (ddict->dictSize < 8)
+ return 0;
+ {
+ U32 const magic = ZSTD_readLE32(ddict->dictContent);
+ if (magic != ZSTD_DICT_MAGIC)
+ return 0; /* pure content mode */
+ }
+ ddict->dictID = ZSTD_readLE32((const char *)ddict->dictContent + 4);
+
+ /* load entropy tables */
+ CHECK_E(ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted);
+ ddict->entropyPresent = 1;
+ return 0;
+}
+
+static ZSTD_DDict *ZSTD_createDDict_advanced(const void *dict, size_t dictSize, unsigned byReference, ZSTD_customMem customMem)
+{
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+
+ {
+ ZSTD_DDict *const ddict = (ZSTD_DDict *)ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
+ if (!ddict)
+ return NULL;
+ ddict->cMem = customMem;
+
+ if ((byReference) || (!dict) || (!dictSize)) {
+ ddict->dictBuffer = NULL;
+ ddict->dictContent = dict;
+ } else {
+ void *const internalBuffer = ZSTD_malloc(dictSize, customMem);
+ if (!internalBuffer) {
+ ZSTD_freeDDict(ddict);
+ return NULL;
+ }
+ memcpy(internalBuffer, dict, dictSize);
+ ddict->dictBuffer = internalBuffer;
+ ddict->dictContent = internalBuffer;
+ }
+ ddict->dictSize = dictSize;
+ ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
+ /* parse dictionary content */
+ {
+ size_t const errorCode = ZSTD_loadEntropy_inDDict(ddict);
+ if (ZSTD_isError(errorCode)) {
+ ZSTD_freeDDict(ddict);
+ return NULL;
+ }
+ }
+
+ return ddict;
+ }
+}
+
+/*! ZSTD_initDDict() :
+* Create a digested dictionary, to start decompression without startup delay.
+* `dict` content is copied inside DDict.
+* Consequently, `dict` can be released after `ZSTD_DDict` creation */
+ZSTD_DDict *ZSTD_initDDict(const void *dict, size_t dictSize, void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ return ZSTD_createDDict_advanced(dict, dictSize, 1, stackMem);
+}
+
+size_t ZSTD_freeDDict(ZSTD_DDict *ddict)
+{
+ if (ddict == NULL)
+ return 0; /* support free on NULL */
+ {
+ ZSTD_customMem const cMem = ddict->cMem;
+ ZSTD_free(ddict->dictBuffer, cMem);
+ ZSTD_free(ddict, cMem);
+ return 0;
+ }
+}
+
+/*! ZSTD_getDictID_fromDict() :
+ * Provides the dictID stored within dictionary.
+ * if @return == 0, the dictionary is not conformant with Zstandard specification.
+ * It can still be loaded, but as a content-only dictionary. */
+unsigned ZSTD_getDictID_fromDict(const void *dict, size_t dictSize)
+{
+ if (dictSize < 8)
+ return 0;
+ if (ZSTD_readLE32(dict) != ZSTD_DICT_MAGIC)
+ return 0;
+ return ZSTD_readLE32((const char *)dict + 4);
+}
+
+/*! ZSTD_getDictID_fromDDict() :
+ * Provides the dictID of the dictionary loaded into `ddict`.
+ * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
+ * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
+unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict *ddict)
+{
+ if (ddict == NULL)
+ return 0;
+ return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
+}
+
+/*! ZSTD_getDictID_fromFrame() :
+ * Provides the dictID required to decompressed the frame stored within `src`.
+ * If @return == 0, the dictID could not be decoded.
+ * This could for one of the following reasons :
+ * - The frame does not require a dictionary to be decoded (most common case).
+ * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
+ * Note : this use case also happens when using a non-conformant dictionary.
+ * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
+ * - This is not a Zstandard frame.
+ * When identifying the exact failure cause, it's possible to used ZSTD_getFrameParams(), which will provide a more precise error code. */
+unsigned ZSTD_getDictID_fromFrame(const void *src, size_t srcSize)
+{
+ ZSTD_frameParams zfp = {0, 0, 0, 0};
+ size_t const hError = ZSTD_getFrameParams(&zfp, src, srcSize);
+ if (ZSTD_isError(hError))
+ return 0;
+ return zfp.dictID;
+}
+
+/*! ZSTD_decompress_usingDDict() :
+* Decompression using a pre-digested Dictionary
+* Use dictionary without significant overhead. */
+size_t ZSTD_decompress_usingDDict(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const ZSTD_DDict *ddict)
+{
+ /* pass content and size in case legacy frames are encountered */
+ return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, NULL, 0, ddict);
+}
+
+/*=====================================
+* Streaming decompression
+*====================================*/
+
+typedef enum { zdss_init, zdss_loadHeader, zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
+
+/* *** Resource management *** */
+struct ZSTD_DStream_s {
+ ZSTD_DCtx *dctx;
+ ZSTD_DDict *ddictLocal;
+ const ZSTD_DDict *ddict;
+ ZSTD_frameParams fParams;
+ ZSTD_dStreamStage stage;
+ char *inBuff;
+ size_t inBuffSize;
+ size_t inPos;
+ size_t maxWindowSize;
+ char *outBuff;
+ size_t outBuffSize;
+ size_t outStart;
+ size_t outEnd;
+ size_t blockSize;
+ BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; /* tmp buffer to store frame header */
+ size_t lhSize;
+ ZSTD_customMem customMem;
+ void *legacyContext;
+ U32 previousLegacyVersion;
+ U32 legacyVersion;
+ U32 hostageByte;
+}; /* typedef'd to ZSTD_DStream within "zstd.h" */
+
+size_t ZSTD_DStreamWorkspaceBound(size_t maxWindowSize)
+{
+ size_t const blockSize = MIN(maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
+ size_t const inBuffSize = blockSize;
+ size_t const outBuffSize = maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
+ return ZSTD_DCtxWorkspaceBound() + ZSTD_ALIGN(sizeof(ZSTD_DStream)) + ZSTD_ALIGN(inBuffSize) + ZSTD_ALIGN(outBuffSize);
+}
+
+static ZSTD_DStream *ZSTD_createDStream_advanced(ZSTD_customMem customMem)
+{
+ ZSTD_DStream *zds;
+
+ if (!customMem.customAlloc || !customMem.customFree)
+ return NULL;
+
+ zds = (ZSTD_DStream *)ZSTD_malloc(sizeof(ZSTD_DStream), customMem);
+ if (zds == NULL)
+ return NULL;
+ memset(zds, 0, sizeof(ZSTD_DStream));
+ memcpy(&zds->customMem, &customMem, sizeof(ZSTD_customMem));
+ zds->dctx = ZSTD_createDCtx_advanced(customMem);
+ if (zds->dctx == NULL) {
+ ZSTD_freeDStream(zds);
+ return NULL;
+ }
+ zds->stage = zdss_init;
+ zds->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
+ return zds;
+}
+
+ZSTD_DStream *ZSTD_initDStream(size_t maxWindowSize, void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
+ ZSTD_DStream *zds = ZSTD_createDStream_advanced(stackMem);
+ if (!zds) {
+ return NULL;
+ }
+
+ zds->maxWindowSize = maxWindowSize;
+ zds->stage = zdss_loadHeader;
+ zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0;
+ ZSTD_freeDDict(zds->ddictLocal);
+ zds->ddictLocal = NULL;
+ zds->ddict = zds->ddictLocal;
+ zds->legacyVersion = 0;
+ zds->hostageByte = 0;
+
+ {
+ size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
+ size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
+
+ zds->inBuff = (char *)ZSTD_malloc(blockSize, zds->customMem);
+ zds->inBuffSize = blockSize;
+ zds->outBuff = (char *)ZSTD_malloc(neededOutSize, zds->customMem);
+ zds->outBuffSize = neededOutSize;
+ if (zds->inBuff == NULL || zds->outBuff == NULL) {
+ ZSTD_freeDStream(zds);
+ return NULL;
+ }
+ }
+ return zds;
+}
+
+ZSTD_DStream *ZSTD_initDStream_usingDDict(size_t maxWindowSize, const ZSTD_DDict *ddict, void *workspace, size_t workspaceSize)
+{
+ ZSTD_DStream *zds = ZSTD_initDStream(maxWindowSize, workspace, workspaceSize);
+ if (zds) {
+ zds->ddict = ddict;
+ }
+ return zds;
+}
+
+size_t ZSTD_freeDStream(ZSTD_DStream *zds)
+{
+ if (zds == NULL)
+ return 0; /* support free on null */
+ {
+ ZSTD_customMem const cMem = zds->customMem;
+ ZSTD_freeDCtx(zds->dctx);
+ zds->dctx = NULL;
+ ZSTD_freeDDict(zds->ddictLocal);
+ zds->ddictLocal = NULL;
+ ZSTD_free(zds->inBuff, cMem);
+ zds->inBuff = NULL;
+ ZSTD_free(zds->outBuff, cMem);
+ zds->outBuff = NULL;
+ ZSTD_free(zds, cMem);
+ return 0;
+ }
+}
+
+/* *** Initialization *** */
+
+size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX + ZSTD_blockHeaderSize; }
+size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX; }
+
+size_t ZSTD_resetDStream(ZSTD_DStream *zds)
+{
+ zds->stage = zdss_loadHeader;
+ zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0;
+ zds->legacyVersion = 0;
+ zds->hostageByte = 0;
+ return ZSTD_frameHeaderSize_prefix;
+}
+
+/* ***** Decompression ***** */
+
+ZSTD_STATIC size_t ZSTD_limitCopy(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
+{
+ size_t const length = MIN(dstCapacity, srcSize);
+ memcpy(dst, src, length);
+ return length;
+}
+
+size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inBuffer *input)
+{
+ const char *const istart = (const char *)(input->src) + input->pos;
+ const char *const iend = (const char *)(input->src) + input->size;
+ const char *ip = istart;
+ char *const ostart = (char *)(output->dst) + output->pos;
+ char *const oend = (char *)(output->dst) + output->size;
+ char *op = ostart;
+ U32 someMoreWork = 1;
+
+ while (someMoreWork) {
+ switch (zds->stage) {
+ case zdss_init:
+ ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
+ /* fall-through */
+
+ case zdss_loadHeader: {
+ size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize);
+ if (ZSTD_isError(hSize))
+ return hSize;
+ if (hSize != 0) { /* need more input */
+ size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */
+ if (toLoad > (size_t)(iend - ip)) { /* not enough input to load full header */
+ memcpy(zds->headerBuffer + zds->lhSize, ip, iend - ip);
+ zds->lhSize += iend - ip;
+ input->pos = input->size;
+ return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) +
+ ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
+ }
+ memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad);
+ zds->lhSize = hSize;
+ ip += toLoad;
+ break;
+ }
+
+ /* check for single-pass mode opportunity */
+ if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
+ && (U64)(size_t)(oend - op) >= zds->fParams.frameContentSize) {
+ size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend - istart);
+ if (cSize <= (size_t)(iend - istart)) {
+ size_t const decompressedSize = ZSTD_decompress_usingDDict(zds->dctx, op, oend - op, istart, cSize, zds->ddict);
+ if (ZSTD_isError(decompressedSize))
+ return decompressedSize;
+ ip = istart + cSize;
+ op += decompressedSize;
+ zds->dctx->expected = 0;
+ zds->stage = zdss_init;
+ someMoreWork = 0;
+ break;
+ }
+ }
+
+ /* Consume header */
+ ZSTD_refDDict(zds->dctx, zds->ddict);
+ {
+ size_t const h1Size = ZSTD_nextSrcSizeToDecompress(zds->dctx); /* == ZSTD_frameHeaderSize_prefix */
+ CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer, h1Size));
+ {
+ size_t const h2Size = ZSTD_nextSrcSizeToDecompress(zds->dctx);
+ CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer + h1Size, h2Size));
+ }
+ }
+
+ zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
+ if (zds->fParams.windowSize > zds->maxWindowSize)
+ return ERROR(frameParameter_windowTooLarge);
+
+ /* Buffers are preallocated, but double check */
+ {
+ size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
+ size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
+ if (zds->inBuffSize < blockSize) {
+ return ERROR(GENERIC);
+ }
+ if (zds->outBuffSize < neededOutSize) {
+ return ERROR(GENERIC);
+ }
+ zds->blockSize = blockSize;
+ }
+ zds->stage = zdss_read;
+ }
+ /* pass-through */
+
+ case zdss_read: {
+ size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
+ if (neededInSize == 0) { /* end of frame */
+ zds->stage = zdss_init;
+ someMoreWork = 0;
+ break;
+ }
+ if ((size_t)(iend - ip) >= neededInSize) { /* decode directly from src */
+ const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx);
+ size_t const decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart,
+ (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart), ip, neededInSize);
+ if (ZSTD_isError(decodedSize))
+ return decodedSize;
+ ip += neededInSize;
+ if (!decodedSize && !isSkipFrame)
+ break; /* this was just a header */
+ zds->outEnd = zds->outStart + decodedSize;
+ zds->stage = zdss_flush;
+ break;
+ }
+ if (ip == iend) {
+ someMoreWork = 0;
+ break;
+ } /* no more input */
+ zds->stage = zdss_load;
+ /* pass-through */
+ }
+
+ case zdss_load: {
+ size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
+ size_t const toLoad = neededInSize - zds->inPos; /* should always be <= remaining space within inBuff */
+ size_t loadedSize;
+ if (toLoad > zds->inBuffSize - zds->inPos)
+ return ERROR(corruption_detected); /* should never happen */
+ loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend - ip);
+ ip += loadedSize;
+ zds->inPos += loadedSize;
+ if (loadedSize < toLoad) {
+ someMoreWork = 0;
+ break;
+ } /* not enough input, wait for more */
+
+ /* decode loaded input */
+ {
+ const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx);
+ size_t const decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
+ zds->inBuff, neededInSize);
+ if (ZSTD_isError(decodedSize))
+ return decodedSize;
+ zds->inPos = 0; /* input is consumed */
+ if (!decodedSize && !isSkipFrame) {
+ zds->stage = zdss_read;
+ break;
+ } /* this was just a header */
+ zds->outEnd = zds->outStart + decodedSize;
+ zds->stage = zdss_flush;
+ /* pass-through */
+ }
+ }
+
+ case zdss_flush: {
+ size_t const toFlushSize = zds->outEnd - zds->outStart;
+ size_t const flushedSize = ZSTD_limitCopy(op, oend - op, zds->outBuff + zds->outStart, toFlushSize);
+ op += flushedSize;
+ zds->outStart += flushedSize;
+ if (flushedSize == toFlushSize) { /* flush completed */
+ zds->stage = zdss_read;
+ if (zds->outStart + zds->blockSize > zds->outBuffSize)
+ zds->outStart = zds->outEnd = 0;
+ break;
+ }
+ /* cannot complete flush */
+ someMoreWork = 0;
+ break;
+ }
+ default:
+ return ERROR(GENERIC); /* impossible */
+ }
+ }
+
+ /* result */
+ input->pos += (size_t)(ip - istart);
+ output->pos += (size_t)(op - ostart);
+ {
+ size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds->dctx);
+ if (!nextSrcSizeHint) { /* frame fully decoded */
+ if (zds->outEnd == zds->outStart) { /* output fully flushed */
+ if (zds->hostageByte) {
+ if (input->pos >= input->size) {
+ zds->stage = zdss_read;
+ return 1;
+ } /* can't release hostage (not present) */
+ input->pos++; /* release hostage */
+ }
+ return 0;
+ }
+ if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */
+ input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */
+ zds->hostageByte = 1;
+ }
+ return 1;
+ }
+ nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds->dctx) == ZSTDnit_block); /* preload header of next block */
+ if (zds->inPos > nextSrcSizeHint)
+ return ERROR(GENERIC); /* should never happen */
+ nextSrcSizeHint -= zds->inPos; /* already loaded*/
+ return nextSrcSizeHint;
+ }
+}
+
+EXPORT_SYMBOL(ZSTD_DCtxWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initDCtx);
+EXPORT_SYMBOL(ZSTD_decompressDCtx);
+EXPORT_SYMBOL(ZSTD_decompress_usingDict);
+
+EXPORT_SYMBOL(ZSTD_DDictWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initDDict);
+EXPORT_SYMBOL(ZSTD_decompress_usingDDict);
+
+EXPORT_SYMBOL(ZSTD_DStreamWorkspaceBound);
+EXPORT_SYMBOL(ZSTD_initDStream);
+EXPORT_SYMBOL(ZSTD_initDStream_usingDDict);
+EXPORT_SYMBOL(ZSTD_resetDStream);
+EXPORT_SYMBOL(ZSTD_decompressStream);
+EXPORT_SYMBOL(ZSTD_DStreamInSize);
+EXPORT_SYMBOL(ZSTD_DStreamOutSize);
+
+EXPORT_SYMBOL(ZSTD_findFrameCompressedSize);
+EXPORT_SYMBOL(ZSTD_getFrameContentSize);
+EXPORT_SYMBOL(ZSTD_findDecompressedSize);
+
+EXPORT_SYMBOL(ZSTD_isFrame);
+EXPORT_SYMBOL(ZSTD_getDictID_fromDict);
+EXPORT_SYMBOL(ZSTD_getDictID_fromDDict);
+EXPORT_SYMBOL(ZSTD_getDictID_fromFrame);
+
+EXPORT_SYMBOL(ZSTD_getFrameParams);
+EXPORT_SYMBOL(ZSTD_decompressBegin);
+EXPORT_SYMBOL(ZSTD_decompressBegin_usingDict);
+EXPORT_SYMBOL(ZSTD_copyDCtx);
+EXPORT_SYMBOL(ZSTD_nextSrcSizeToDecompress);
+EXPORT_SYMBOL(ZSTD_decompressContinue);
+EXPORT_SYMBOL(ZSTD_nextInputType);
+
+EXPORT_SYMBOL(ZSTD_decompressBlock);
+EXPORT_SYMBOL(ZSTD_insertBlock);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("Zstd Decompressor");
diff --git a/lib/zstd/entropy_common.c b/lib/zstd/entropy_common.c
new file mode 100644
index 000000000000..2b0a643c32c4
--- /dev/null
+++ b/lib/zstd/entropy_common.c
@@ -0,0 +1,243 @@
+/*
+ * Common functions of New Generation Entropy library
+ * Copyright (C) 2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+
+/* *************************************
+* Dependencies
+***************************************/
+#include "error_private.h" /* ERR_*, ERROR */
+#include "fse.h"
+#include "huf.h"
+#include "mem.h"
+
+/*=== Version ===*/
+unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; }
+
+/*=== Error Management ===*/
+unsigned FSE_isError(size_t code) { return ERR_isError(code); }
+
+unsigned HUF_isError(size_t code) { return ERR_isError(code); }
+
+/*-**************************************************************
+* FSE NCount encoding-decoding
+****************************************************************/
+size_t FSE_readNCount(short *normalizedCounter, unsigned *maxSVPtr, unsigned *tableLogPtr, const void *headerBuffer, size_t hbSize)
+{
+ const BYTE *const istart = (const BYTE *)headerBuffer;
+ const BYTE *const iend = istart + hbSize;
+ const BYTE *ip = istart;
+ int nbBits;
+ int remaining;
+ int threshold;
+ U32 bitStream;
+ int bitCount;
+ unsigned charnum = 0;
+ int previous0 = 0;
+
+ if (hbSize < 4)
+ return ERROR(srcSize_wrong);
+ bitStream = ZSTD_readLE32(ip);
+ nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
+ if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX)
+ return ERROR(tableLog_tooLarge);
+ bitStream >>= 4;
+ bitCount = 4;
+ *tableLogPtr = nbBits;
+ remaining = (1 << nbBits) + 1;
+ threshold = 1 << nbBits;
+ nbBits++;
+
+ while ((remaining > 1) & (charnum <= *maxSVPtr)) {
+ if (previous0) {
+ unsigned n0 = charnum;
+ while ((bitStream & 0xFFFF) == 0xFFFF) {
+ n0 += 24;
+ if (ip < iend - 5) {
+ ip += 2;
+ bitStream = ZSTD_readLE32(ip) >> bitCount;
+ } else {
+ bitStream >>= 16;
+ bitCount += 16;
+ }
+ }
+ while ((bitStream & 3) == 3) {
+ n0 += 3;
+ bitStream >>= 2;
+ bitCount += 2;
+ }
+ n0 += bitStream & 3;
+ bitCount += 2;
+ if (n0 > *maxSVPtr)
+ return ERROR(maxSymbolValue_tooSmall);
+ while (charnum < n0)
+ normalizedCounter[charnum++] = 0;
+ if ((ip <= iend - 7) || (ip + (bitCount >> 3) <= iend - 4)) {
+ ip += bitCount >> 3;
+ bitCount &= 7;
+ bitStream = ZSTD_readLE32(ip) >> bitCount;
+ } else {
+ bitStream >>= 2;
+ }
+ }
+ {
+ int const max = (2 * threshold - 1) - remaining;
+ int count;
+
+ if ((bitStream & (threshold - 1)) < (U32)max) {
+ count = bitStream & (threshold - 1);
+ bitCount += nbBits - 1;
+ } else {
+ count = bitStream & (2 * threshold - 1);
+ if (count >= threshold)
+ count -= max;
+ bitCount += nbBits;
+ }
+
+ count--; /* extra accuracy */
+ remaining -= count < 0 ? -count : count; /* -1 means +1 */
+ normalizedCounter[charnum++] = (short)count;
+ previous0 = !count;
+ while (remaining < threshold) {
+ nbBits--;
+ threshold >>= 1;
+ }
+
+ if ((ip <= iend - 7) || (ip + (bitCount >> 3) <= iend - 4)) {
+ ip += bitCount >> 3;
+ bitCount &= 7;
+ } else {
+ bitCount -= (int)(8 * (iend - 4 - ip));
+ ip = iend - 4;
+ }
+ bitStream = ZSTD_readLE32(ip) >> (bitCount & 31);
+ }
+ } /* while ((remaining>1) & (charnum<=*maxSVPtr)) */
+ if (remaining != 1)
+ return ERROR(corruption_detected);
+ if (bitCount > 32)
+ return ERROR(corruption_detected);
+ *maxSVPtr = charnum - 1;
+
+ ip += (bitCount + 7) >> 3;
+ return ip - istart;
+}
+
+/*! HUF_readStats() :
+ Read compact Huffman tree, saved by HUF_writeCTable().
+ `huffWeight` is destination buffer.
+ `rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32.
+ @return : size read from `src` , or an error Code .
+ Note : Needed by HUF_readCTable() and HUF_readDTableX?() .
+*/
+size_t HUF_readStats_wksp(BYTE *huffWeight, size_t hwSize, U32 *rankStats, U32 *nbSymbolsPtr, U32 *tableLogPtr, const void *src, size_t srcSize, void *workspace, size_t workspaceSize)
+{
+ U32 weightTotal;
+ const BYTE *ip = (const BYTE *)src;
+ size_t iSize;
+ size_t oSize;
+
+ if (!srcSize)
+ return ERROR(srcSize_wrong);
+ iSize = ip[0];
+ /* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
+
+ if (iSize >= 128) { /* special header */
+ oSize = iSize - 127;
+ iSize = ((oSize + 1) / 2);
+ if (iSize + 1 > srcSize)
+ return ERROR(srcSize_wrong);
+ if (oSize >= hwSize)
+ return ERROR(corruption_detected);
+ ip += 1;
+ {
+ U32 n;
+ for (n = 0; n < oSize; n += 2) {
+ huffWeight[n] = ip[n / 2] >> 4;
+ huffWeight[n + 1] = ip[n / 2] & 15;
+ }
+ }
+ } else { /* header compressed with FSE (normal case) */
+ if (iSize + 1 > srcSize)
+ return ERROR(srcSize_wrong);
+ oSize = FSE_decompress_wksp(huffWeight, hwSize - 1, ip + 1, iSize, 6, workspace, workspaceSize); /* max (hwSize-1) values decoded, as last one is implied */
+ if (FSE_isError(oSize))
+ return oSize;
+ }
+
+ /* collect weight stats */
+ memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32));
+ weightTotal = 0;
+ {
+ U32 n;
+ for (n = 0; n < oSize; n++) {
+ if (huffWeight[n] >= HUF_TABLELOG_MAX)
+ return ERROR(corruption_detected);
+ rankStats[huffWeight[n]]++;
+ weightTotal += (1 << huffWeight[n]) >> 1;
+ }
+ }
+ if (weightTotal == 0)
+ return ERROR(corruption_detected);
+
+ /* get last non-null symbol weight (implied, total must be 2^n) */
+ {
+ U32 const tableLog = BIT_highbit32(weightTotal) + 1;
+ if (tableLog > HUF_TABLELOG_MAX)
+ return ERROR(corruption_detected);
+ *tableLogPtr = tableLog;
+ /* determine last weight */
+ {
+ U32 const total = 1 << tableLog;
+ U32 const rest = total - weightTotal;
+ U32 const verif = 1 << BIT_highbit32(rest);
+ U32 const lastWeight = BIT_highbit32(rest) + 1;
+ if (verif != rest)
+ return ERROR(corruption_detected); /* last value must be a clean power of 2 */
+ huffWeight[oSize] = (BYTE)lastWeight;
+ rankStats[lastWeight]++;
+ }
+ }
+
+ /* check tree construction validity */
+ if ((rankStats[1] < 2) || (rankStats[1] & 1))
+ return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */
+
+ /* results */
+ *nbSymbolsPtr = (U32)(oSize + 1);
+ return iSize + 1;
+}
diff --git a/lib/zstd/error_private.h b/lib/zstd/error_private.h
new file mode 100644
index 000000000000..1a60b31f706c
--- /dev/null
+++ b/lib/zstd/error_private.h
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+/* Note : this module is expected to remain private, do not expose it */
+
+#ifndef ERROR_H_MODULE
+#define ERROR_H_MODULE
+
+/* ****************************************
+* Dependencies
+******************************************/
+#include <linux/types.h> /* size_t */
+#include <linux/zstd.h> /* enum list */
+
+/* ****************************************
+* Compiler-specific
+******************************************/
+#define ERR_STATIC static __attribute__((unused))
+
+/*-****************************************
+* Customization (error_public.h)
+******************************************/
+typedef ZSTD_ErrorCode ERR_enum;
+#define PREFIX(name) ZSTD_error_##name
+
+/*-****************************************
+* Error codes handling
+******************************************/
+#define ERROR(name) ((size_t)-PREFIX(name))
+
+ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
+
+ERR_STATIC ERR_enum ERR_getErrorCode(size_t code)
+{
+ if (!ERR_isError(code))
+ return (ERR_enum)0;
+ return (ERR_enum)(0 - code);
+}
+
+#endif /* ERROR_H_MODULE */
diff --git a/lib/zstd/fse.h b/lib/zstd/fse.h
new file mode 100644
index 000000000000..7460ab04b191
--- /dev/null
+++ b/lib/zstd/fse.h
@@ -0,0 +1,575 @@
+/*
+ * FSE : Finite State Entropy codec
+ * Public Prototypes declaration
+ * Copyright (C) 2013-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+#ifndef FSE_H
+#define FSE_H
+
+/*-*****************************************
+* Dependencies
+******************************************/
+#include <linux/types.h> /* size_t, ptrdiff_t */
+
+/*-*****************************************
+* FSE_PUBLIC_API : control library symbols visibility
+******************************************/
+#define FSE_PUBLIC_API
+
+/*------ Version ------*/
+#define FSE_VERSION_MAJOR 0
+#define FSE_VERSION_MINOR 9
+#define FSE_VERSION_RELEASE 0
+
+#define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE
+#define FSE_QUOTE(str) #str
+#define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str)
+#define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION)
+
+#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR * 100 * 100 + FSE_VERSION_MINOR * 100 + FSE_VERSION_RELEASE)
+FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
+
+/*-*****************************************
+* Tool functions
+******************************************/
+FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */
+
+/* Error Management */
+FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
+
+/*-*****************************************
+* FSE detailed API
+******************************************/
+/*!
+FSE_compress() does the following:
+1. count symbol occurrence from source[] into table count[]
+2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
+3. save normalized counters to memory buffer using writeNCount()
+4. build encoding table 'CTable' from normalized counters
+5. encode the data stream using encoding table 'CTable'
+
+FSE_decompress() does the following:
+1. read normalized counters with readNCount()
+2. build decoding table 'DTable' from normalized counters
+3. decode the data stream using decoding table 'DTable'
+
+The following API allows targeting specific sub-functions for advanced tasks.
+For example, it's possible to compress several blocks using the same 'CTable',
+or to save and provide normalized distribution using external method.
+*/
+
+/* *** COMPRESSION *** */
+/*! FSE_optimalTableLog():
+ dynamically downsize 'tableLog' when conditions are met.
+ It saves CPU time, by using smaller tables, while preserving or even improving compression ratio.
+ @return : recommended tableLog (necessarily <= 'maxTableLog') */
+FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
+
+/*! FSE_normalizeCount():
+ normalize counts so that sum(count[]) == Power_of_2 (2^tableLog)
+ 'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1).
+ @return : tableLog,
+ or an errorCode, which can be tested using FSE_isError() */
+FSE_PUBLIC_API size_t FSE_normalizeCount(short *normalizedCounter, unsigned tableLog, const unsigned *count, size_t srcSize, unsigned maxSymbolValue);
+
+/*! FSE_NCountWriteBound():
+ Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'.
+ Typically useful for allocation purpose. */
+FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
+
+/*! FSE_writeNCount():
+ Compactly save 'normalizedCounter' into 'buffer'.
+ @return : size of the compressed table,
+ or an errorCode, which can be tested using FSE_isError(). */
+FSE_PUBLIC_API size_t FSE_writeNCount(void *buffer, size_t bufferSize, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
+
+/*! Constructor and Destructor of FSE_CTable.
+ Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
+typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */
+
+/*! FSE_compress_usingCTable():
+ Compress `src` using `ct` into `dst` which must be already allocated.
+ @return : size of compressed data (<= `dstCapacity`),
+ or 0 if compressed data could not fit into `dst`,
+ or an errorCode, which can be tested using FSE_isError() */
+FSE_PUBLIC_API size_t FSE_compress_usingCTable(void *dst, size_t dstCapacity, const void *src, size_t srcSize, const FSE_CTable *ct);
+
+/*!
+Tutorial :
+----------
+The first step is to count all symbols. FSE_count() does this job very fast.
+Result will be saved into 'count', a table of unsigned int, which must be already allocated, and have 'maxSymbolValuePtr[0]+1' cells.
+'src' is a table of bytes of size 'srcSize'. All values within 'src' MUST be <= maxSymbolValuePtr[0]
+maxSymbolValuePtr[0] will be updated, with its real value (necessarily <= original value)
+FSE_count() will return the number of occurrence of the most frequent symbol.
+This can be used to know if there is a single symbol within 'src', and to quickly evaluate its compressibility.
+If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()).
+
+The next step is to normalize the frequencies.
+FSE_normalizeCount() will ensure that sum of frequencies is == 2 ^'tableLog'.
+It also guarantees a minimum of 1 to any Symbol with frequency >= 1.
+You can use 'tableLog'==0 to mean "use default tableLog value".
+If you are unsure of which tableLog value to use, you can ask FSE_optimalTableLog(),
+which will provide the optimal valid tableLog given sourceSize, maxSymbolValue, and a user-defined maximum (0 means "default").
+
+The result of FSE_normalizeCount() will be saved into a table,
+called 'normalizedCounter', which is a table of signed short.
+'normalizedCounter' must be already allocated, and have at least 'maxSymbolValue+1' cells.
+The return value is tableLog if everything proceeded as expected.
+It is 0 if there is a single symbol within distribution.
+If there is an error (ex: invalid tableLog value), the function will return an ErrorCode (which can be tested using FSE_isError()).
+
+'normalizedCounter' can be saved in a compact manner to a memory area using FSE_writeNCount().
+'buffer' must be already allocated.
+For guaranteed success, buffer size must be at least FSE_headerBound().
+The result of the function is the number of bytes written into 'buffer'.
+If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError(); ex : buffer size too small).
+
+'normalizedCounter' can then be used to create the compression table 'CTable'.
+The space required by 'CTable' must be already allocated, using FSE_createCTable().
+You can then use FSE_buildCTable() to fill 'CTable'.
+If there is an error, both functions will return an ErrorCode (which can be tested using FSE_isError()).
+
+'CTable' can then be used to compress 'src', with FSE_compress_usingCTable().
+Similar to FSE_count(), the convention is that 'src' is assumed to be a table of char of size 'srcSize'
+The function returns the size of compressed data (without header), necessarily <= `dstCapacity`.
+If it returns '0', compressed data could not fit into 'dst'.
+If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()).
+*/
+
+/* *** DECOMPRESSION *** */
+
+/*! FSE_readNCount():
+ Read compactly saved 'normalizedCounter' from 'rBuffer'.
+ @return : size read from 'rBuffer',
+ or an errorCode, which can be tested using FSE_isError().
+ maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
+FSE_PUBLIC_API size_t FSE_readNCount(short *normalizedCounter, unsigned *maxSymbolValuePtr, unsigned *tableLogPtr, const void *rBuffer, size_t rBuffSize);
+
+/*! Constructor and Destructor of FSE_DTable.
+ Note that its size depends on 'tableLog' */
+typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
+
+/*! FSE_buildDTable():
+ Builds 'dt', which must be already allocated, using FSE_createDTable().
+ return : 0, or an errorCode, which can be tested using FSE_isError() */
+FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable *dt, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void *workspace, size_t workspaceSize);
+
+/*! FSE_decompress_usingDTable():
+ Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
+ into `dst` which must be already allocated.
+ @return : size of regenerated data (necessarily <= `dstCapacity`),
+ or an errorCode, which can be tested using FSE_isError() */
+FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void *dst, size_t dstCapacity, const void *cSrc, size_t cSrcSize, const FSE_DTable *dt);
+
+/*!
+Tutorial :
+----------
+(Note : these functions only decompress FSE-compressed blocks.
+ If block is uncompressed, use memcpy() instead
+ If block is a single repeated byte, use memset() instead )
+
+The first step is to obtain the normalized frequencies of symbols.
+This can be performed by FSE_readNCount() if it was saved using FSE_writeNCount().
+'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short.
+In practice, that means it's necessary to know 'maxSymbolValue' beforehand,
+or size the table to handle worst case situations (typically 256).
+FSE_readNCount() will provide 'tableLog' and 'maxSymbolValue'.
+The result of FSE_readNCount() is the number of bytes read from 'rBuffer'.
+Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that.
+If there is an error, the function will return an error code, which can be tested using FSE_isError().
+
+The next step is to build the decompression tables 'FSE_DTable' from 'normalizedCounter'.
+This is performed by the function FSE_buildDTable().
+The space required by 'FSE_DTable' must be already allocated using FSE_createDTable().
+If there is an error, the function will return an error code, which can be tested using FSE_isError().
+
+`FSE_DTable` can then be used to decompress `cSrc`, with FSE_decompress_usingDTable().
+`cSrcSize` must be strictly correct, otherwise decompression will fail.
+FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<=`dstCapacity`).
+If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small)
+*/
+
+/* *** Dependency *** */
+#include "bitstream.h"
+
+/* *****************************************
+* Static allocation
+*******************************************/
+/* FSE buffer bounds */
+#define FSE_NCOUNTBOUND 512
+#define FSE_BLOCKBOUND(size) (size + (size >> 7))
+#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
+
+/* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */
+#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1 << (maxTableLog - 1)) + ((maxSymbolValue + 1) * 2))
+#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1 << maxTableLog))
+
+/* *****************************************
+* FSE advanced API
+*******************************************/
+/* FSE_count_wksp() :
+ * Same as FSE_count(), but using an externally provided scratch buffer.
+ * `workSpace` size must be table of >= `1024` unsigned
+ */
+size_t FSE_count_wksp(unsigned *count, unsigned *maxSymbolValuePtr, const void *source, size_t sourceSize, unsigned *workSpace);
+
+/* FSE_countFast_wksp() :
+ * Same as FSE_countFast(), but using an externally provided scratch buffer.
+ * `workSpace` must be a table of minimum `1024` unsigned
+ */
+size_t FSE_countFast_wksp(unsigned *count, unsigned *maxSymbolValuePtr, const void *src, size_t srcSize, unsigned *workSpace);
+
+/*! FSE_count_simple
+ * Same as FSE_countFast(), but does not use any additional memory (not even on stack).
+ * This function is unsafe, and will segfault if any value within `src` is `> *maxSymbolValuePtr` (presuming it's also the size of `count`).
+*/
+size_t FSE_count_simple(unsigned *count, unsigned *maxSymbolValuePtr, const void *src, size_t srcSize);
+
+unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
+/**< same as FSE_optimalTableLog(), which used `minus==2` */
+
+size_t FSE_buildCTable_raw(FSE_CTable *ct, unsigned nbBits);
+/**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */
+
+size_t FSE_buildCTable_rle(FSE_CTable *ct, unsigned char symbolValue);
+/**< build a fake FSE_CTable, designed to compress always the same symbolValue */
+
+/* FSE_buildCTable_wksp() :
+ * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
+ * `wkspSize` must be >= `(1<<tableLog)`.
+ */
+size_t FSE_buildCTable_wksp(FSE_CTable *ct, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void *workSpace, size_t wkspSize);
+
+size_t FSE_buildDTable_raw(FSE_DTable *dt, unsigned nbBits);
+/**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */
+
+size_t FSE_buildDTable_rle(FSE_DTable *dt, unsigned char symbolValue);
+/**< build a fake FSE_DTable, designed to always generate the same symbolValue */
+
+size_t FSE_decompress_wksp(void *dst, size_t dstCapacity, const void *cSrc, size_t cSrcSize, unsigned maxLog, void *workspace, size_t workspaceSize);
+/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DTABLE_SIZE_U32(maxLog)` */
+
+/* *****************************************
+* FSE symbol compression API
+*******************************************/
+/*!
+ This API consists of small unitary functions, which highly benefit from being inlined.
+ Hence their body are included in next section.
+*/
+typedef struct {
+ ptrdiff_t value;
+ const void *stateTable;
+ const void *symbolTT;
+ unsigned stateLog;
+} FSE_CState_t;
+
+static void FSE_initCState(FSE_CState_t *CStatePtr, const FSE_CTable *ct);
+
+static void FSE_encodeSymbol(BIT_CStream_t *bitC, FSE_CState_t *CStatePtr, unsigned symbol);
+
+static void FSE_flushCState(BIT_CStream_t *bitC, const FSE_CState_t *CStatePtr);
+
+/**<
+These functions are inner components of FSE_compress_usingCTable().
+They allow the creation of custom streams, mixing multiple tables and bit sources.
+
+A key property to keep in mind is that encoding and decoding are done **in reverse direction**.
+So the first symbol you will encode is the last you will decode, like a LIFO stack.
+
+You will need a few variables to track your CStream. They are :
+
+FSE_CTable ct; // Provided by FSE_buildCTable()
+BIT_CStream_t bitStream; // bitStream tracking structure
+FSE_CState_t state; // State tracking structure (can have several)
+
+
+The first thing to do is to init bitStream and state.
+ size_t errorCode = BIT_initCStream(&bitStream, dstBuffer, maxDstSize);
+ FSE_initCState(&state, ct);
+
+Note that BIT_initCStream() can produce an error code, so its result should be tested, using FSE_isError();
+You can then encode your input data, byte after byte.
+FSE_encodeSymbol() outputs a maximum of 'tableLog' bits at a time.
+Remember decoding will be done in reverse direction.
+ FSE_encodeByte(&bitStream, &state, symbol);
+
+At any time, you can also add any bit sequence.
+Note : maximum allowed nbBits is 25, for compatibility with 32-bits decoders
+ BIT_addBits(&bitStream, bitField, nbBits);
+
+The above methods don't commit data to memory, they just store it into local register, for speed.
+Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
+Writing data to memory is a manual operation, performed by the flushBits function.
+ BIT_flushBits(&bitStream);
+
+Your last FSE encoding operation shall be to flush your last state value(s).
+ FSE_flushState(&bitStream, &state);
+
+Finally, you must close the bitStream.
+The function returns the size of CStream in bytes.
+If data couldn't fit into dstBuffer, it will return a 0 ( == not compressible)
+If there is an error, it returns an errorCode (which can be tested using FSE_isError()).
+ size_t size = BIT_closeCStream(&bitStream);
+*/
+
+/* *****************************************
+* FSE symbol decompression API
+*******************************************/
+typedef struct {
+ size_t state;
+ const void *table; /* precise table may vary, depending on U16 */
+} FSE_DState_t;
+
+static void FSE_initDState(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD, const FSE_DTable *dt);
+
+static unsigned char FSE_decodeSymbol(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD);
+
+static unsigned FSE_endOfDState(const FSE_DState_t *DStatePtr);
+
+/**<
+Let's now decompose FSE_decompress_usingDTable() into its unitary components.
+You will decode FSE-encoded symbols from the bitStream,
+and also any other bitFields you put in, **in reverse order**.
+
+You will need a few variables to track your bitStream. They are :
+
+BIT_DStream_t DStream; // Stream context
+FSE_DState_t DState; // State context. Multiple ones are possible
+FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
+
+The first thing to do is to init the bitStream.
+ errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
+
+You should then retrieve your initial state(s)
+(in reverse flushing order if you have several ones) :
+ errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
+
+You can then decode your data, symbol after symbol.
+For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
+Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
+ unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
+
+You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
+Note : maximum allowed nbBits is 25, for 32-bits compatibility
+ size_t bitField = BIT_readBits(&DStream, nbBits);
+
+All above operations only read from local register (which size depends on size_t).
+Refueling the register from memory is manually performed by the reload method.
+ endSignal = FSE_reloadDStream(&DStream);
+
+BIT_reloadDStream() result tells if there is still some more data to read from DStream.
+BIT_DStream_unfinished : there is still some data left into the DStream.
+BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
+BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
+BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
+
+When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
+to properly detect the exact end of stream.
+After each decoded symbol, check if DStream is fully consumed using this simple test :
+ BIT_reloadDStream(&DStream) >= BIT_DStream_completed
+
+When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
+Checking if DStream has reached its end is performed by :
+ BIT_endOfDStream(&DStream);
+Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
+ FSE_endOfDState(&DState);
+*/
+
+/* *****************************************
+* FSE unsafe API
+*******************************************/
+static unsigned char FSE_decodeSymbolFast(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD);
+/* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
+
+/* *****************************************
+* Implementation of inlined functions
+*******************************************/
+typedef struct {
+ int deltaFindState;
+ U32 deltaNbBits;
+} FSE_symbolCompressionTransform; /* total 8 bytes */
+
+ZSTD_STATIC void FSE_initCState(FSE_CState_t *statePtr, const FSE_CTable *ct)
+{
+ const void *ptr = ct;
+ const U16 *u16ptr = (const U16 *)ptr;
+ const U32 tableLog = ZSTD_read16(ptr);
+ statePtr->value = (ptrdiff_t)1 << tableLog;
+ statePtr->stateTable = u16ptr + 2;
+ statePtr->symbolTT = ((const U32 *)ct + 1 + (tableLog ? (1 << (tableLog - 1)) : 1));
+ statePtr->stateLog = tableLog;
+}
+
+/*! FSE_initCState2() :
+* Same as FSE_initCState(), but the first symbol to include (which will be the last to be read)
+* uses the smallest state value possible, saving the cost of this symbol */
+ZSTD_STATIC void FSE_initCState2(FSE_CState_t *statePtr, const FSE_CTable *ct, U32 symbol)
+{
+ FSE_initCState(statePtr, ct);
+ {
+ const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform *)(statePtr->symbolTT))[symbol];
+ const U16 *stateTable = (const U16 *)(statePtr->stateTable);
+ U32 nbBitsOut = (U32)((symbolTT.deltaNbBits + (1 << 15)) >> 16);
+ statePtr->value = (nbBitsOut << 16) - symbolTT.deltaNbBits;
+ statePtr->value = stateTable[(statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
+ }
+}
+
+ZSTD_STATIC void FSE_encodeSymbol(BIT_CStream_t *bitC, FSE_CState_t *statePtr, U32 symbol)
+{
+ const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform *)(statePtr->symbolTT))[symbol];
+ const U16 *const stateTable = (const U16 *)(statePtr->stateTable);
+ U32 nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
+ BIT_addBits(bitC, statePtr->value, nbBitsOut);
+ statePtr->value = stateTable[(statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
+}
+
+ZSTD_STATIC void FSE_flushCState(BIT_CStream_t *bitC, const FSE_CState_t *statePtr)
+{
+ BIT_addBits(bitC, statePtr->value, statePtr->stateLog);
+ BIT_flushBits(bitC);
+}
+
+/* ====== Decompression ====== */
+
+typedef struct {
+ U16 tableLog;
+ U16 fastMode;
+} FSE_DTableHeader; /* sizeof U32 */
+
+typedef struct {
+ unsigned short newState;
+ unsigned char symbol;
+ unsigned char nbBits;
+} FSE_decode_t; /* size == U32 */
+
+ZSTD_STATIC void FSE_initDState(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD, const FSE_DTable *dt)
+{
+ const void *ptr = dt;
+ const FSE_DTableHeader *const DTableH = (const FSE_DTableHeader *)ptr;
+ DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
+ BIT_reloadDStream(bitD);
+ DStatePtr->table = dt + 1;
+}
+
+ZSTD_STATIC BYTE FSE_peekSymbol(const FSE_DState_t *DStatePtr)
+{
+ FSE_decode_t const DInfo = ((const FSE_decode_t *)(DStatePtr->table))[DStatePtr->state];
+ return DInfo.symbol;
+}
+
+ZSTD_STATIC void FSE_updateState(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD)
+{
+ FSE_decode_t const DInfo = ((const FSE_decode_t *)(DStatePtr->table))[DStatePtr->state];
+ U32 const nbBits = DInfo.nbBits;
+ size_t const lowBits = BIT_readBits(bitD, nbBits);
+ DStatePtr->state = DInfo.newState + lowBits;
+}
+
+ZSTD_STATIC BYTE FSE_decodeSymbol(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD)
+{
+ FSE_decode_t const DInfo = ((const FSE_decode_t *)(DStatePtr->table))[DStatePtr->state];
+ U32 const nbBits = DInfo.nbBits;
+ BYTE const symbol = DInfo.symbol;
+ size_t const lowBits = BIT_readBits(bitD, nbBits);
+
+ DStatePtr->state = DInfo.newState + lowBits;
+ return symbol;
+}
+
+/*! FSE_decodeSymbolFast() :
+ unsafe, only works if no symbol has a probability > 50% */
+ZSTD_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t *DStatePtr, BIT_DStream_t *bitD)
+{
+ FSE_decode_t const DInfo = ((const FSE_decode_t *)(DStatePtr->table))[DStatePtr->state];
+ U32 const nbBits = DInfo.nbBits;
+ BYTE const symbol = DInfo.symbol;
+ size_t const lowBits = BIT_readBitsFast(bitD, nbBits);
+
+ DStatePtr->state = DInfo.newState + lowBits;
+ return symbol;
+}
+
+ZSTD_STATIC unsigned FSE_endOfDState(const FSE_DState_t *DStatePtr) { return DStatePtr->state == 0; }
+
+/* **************************************************************
+* Tuning parameters
+****************************************************************/
+/*!MEMORY_USAGE :
+* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
+* Increasing memory usage improves compression ratio
+* Reduced memory usage can improve speed, due to cache effect
+* Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
+#ifndef FSE_MAX_MEMORY_USAGE
+#define FSE_MAX_MEMORY_USAGE 14
+#endif
+#ifndef FSE_DEFAULT_MEMORY_USAGE
+#define FSE_DEFAULT_MEMORY_USAGE 13
+#endif
+
+/*!FSE_MAX_SYMBOL_VALUE :
+* Maximum symbol value authorized.
+* Required for proper stack allocation */
+#ifndef FSE_MAX_SYMBOL_VALUE
+#define FSE_MAX_SYMBOL_VALUE 255
+#endif
+
+/* **************************************************************
+* template functions type & suffix
+****************************************************************/
+#define FSE_FUNCTION_TYPE BYTE
+#define FSE_FUNCTION_EXTENSION
+#define FSE_DECODE_TYPE FSE_decode_t
+
+/* ***************************************************************
+* Constants
+*****************************************************************/
+#define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE - 2)
+#define FSE_MAX_TABLESIZE (1U << FSE_MAX_TABLELOG)
+#define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE - 1)
+#define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE - 2)
+#define FSE_MIN_TABLELOG 5
+
+#define FSE_TABLELOG_ABSOLUTE_MAX 15
+#if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
+#error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
+#endif
+
+#define FSE_TABLESTEP(tableSize) ((tableSize >> 1) + (tableSize >> 3) + 3)
+
+#endif /* FSE_H */
diff --git a/lib/zstd/fse_compress.c b/lib/zstd/fse_compress.c
new file mode 100644
index 000000000000..ef3d1741d532
--- /dev/null
+++ b/lib/zstd/fse_compress.c
@@ -0,0 +1,795 @@
+/*
+ * FSE : Finite State Entropy encoder
+ * Copyright (C) 2013-2015, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+
+/* **************************************************************
+* Compiler specifics
+****************************************************************/
+#define FORCE_INLINE static __always_inline
+
+/* **************************************************************
+* Includes
+****************************************************************/
+#include "bitstream.h"
+#include "fse.h"
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/math64.h>
+#include <linux/string.h> /* memcpy, memset */
+
+/* **************************************************************
+* Error Management
+****************************************************************/
+#define FSE_STATIC_ASSERT(c) \
+ { \
+ enum { FSE_static_assert = 1 / (int)(!!(c)) }; \
+ } /* use only *after* variable declarations */
+
+/* **************************************************************
+* Templates
+****************************************************************/
+/*
+ designed to be included
+ for type-specific functions (template emulation in C)
+ Objective is to write these functions only once, for improved maintenance
+*/
+
+/* safety checks */
+#ifndef FSE_FUNCTION_EXTENSION
+#error "FSE_FUNCTION_EXTENSION must be defined"
+#endif
+#ifndef FSE_FUNCTION_TYPE
+#error "FSE_FUNCTION_TYPE must be defined"
+#endif
+
+/* Function names */
+#define FSE_CAT(X, Y) X##Y
+#define FSE_FUNCTION_NAME(X, Y) FSE_CAT(X, Y)
+#define FSE_TYPE_NAME(X, Y) FSE_CAT(X, Y)
+
+/* Function templates */
+
+/* FSE_buildCTable_wksp() :
+ * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
+ * wkspSize should be sized to handle worst case situation, which is `1<<max_tableLog * sizeof(FSE_FUNCTION_TYPE)`
+ * workSpace must also be properly aligned with FSE_FUNCTION_TYPE requirements
+ */
+size_t FSE_buildCTable_wksp(FSE_CTable *ct, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void *workspace, size_t workspaceSize)
+{
+ U32 const tableSize = 1 << tableLog;
+ U32 const tableMask = tableSize - 1;
+ void *const ptr = ct;
+ U16 *const tableU16 = ((U16 *)ptr) + 2;
+ void *const FSCT = ((U32 *)ptr) + 1 /* header */ + (tableLog ? tableSize >> 1 : 1);
+ FSE_symbolCompressionTransform *const symbolTT = (FSE_symbolCompressionTransform *)(FSCT);
+ U32 const step = FSE_TABLESTEP(tableSize);
+ U32 highThreshold = tableSize - 1;
+
+ U32 *cumul;
+ FSE_FUNCTION_TYPE *tableSymbol;
+ size_t spaceUsed32 = 0;
+
+ cumul = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += FSE_MAX_SYMBOL_VALUE + 2;
+ tableSymbol = (FSE_FUNCTION_TYPE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(sizeof(FSE_FUNCTION_TYPE) * ((size_t)1 << tableLog), sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ /* CTable header */
+ tableU16[-2] = (U16)tableLog;
+ tableU16[-1] = (U16)maxSymbolValue;
+
+ /* For explanations on how to distribute symbol values over the table :
+ * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
+
+ /* symbol start positions */
+ {
+ U32 u;
+ cumul[0] = 0;
+ for (u = 1; u <= maxSymbolValue + 1; u++) {
+ if (normalizedCounter[u - 1] == -1) { /* Low proba symbol */
+ cumul[u] = cumul[u - 1] + 1;
+ tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u - 1);
+ } else {
+ cumul[u] = cumul[u - 1] + normalizedCounter[u - 1];
+ }
+ }
+ cumul[maxSymbolValue + 1] = tableSize + 1;
+ }
+
+ /* Spread symbols */
+ {
+ U32 position = 0;
+ U32 symbol;
+ for (symbol = 0; symbol <= maxSymbolValue; symbol++) {
+ int nbOccurences;
+ for (nbOccurences = 0; nbOccurences < normalizedCounter[symbol]; nbOccurences++) {
+ tableSymbol[position] = (FSE_FUNCTION_TYPE)symbol;
+ position = (position + step) & tableMask;
+ while (position > highThreshold)
+ position = (position + step) & tableMask; /* Low proba area */
+ }
+ }
+
+ if (position != 0)
+ return ERROR(GENERIC); /* Must have gone through all positions */
+ }
+
+ /* Build table */
+ {
+ U32 u;
+ for (u = 0; u < tableSize; u++) {
+ FSE_FUNCTION_TYPE s = tableSymbol[u]; /* note : static analyzer may not understand tableSymbol is properly initialized */
+ tableU16[cumul[s]++] = (U16)(tableSize + u); /* TableU16 : sorted by symbol order; gives next state value */
+ }
+ }
+
+ /* Build Symbol Transformation Table */
+ {
+ unsigned total = 0;
+ unsigned s;
+ for (s = 0; s <= maxSymbolValue; s++) {
+ switch (normalizedCounter[s]) {
+ case 0: break;
+
+ case -1:
+ case 1:
+ symbolTT[s].deltaNbBits = (tableLog << 16) - (1 << tableLog);
+ symbolTT[s].deltaFindState = total - 1;
+ total++;
+ break;
+ default: {
+ U32 const maxBitsOut = tableLog - BIT_highbit32(normalizedCounter[s] - 1);
+ U32 const minStatePlus = normalizedCounter[s] << maxBitsOut;
+ symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus;
+ symbolTT[s].deltaFindState = total - normalizedCounter[s];
+ total += normalizedCounter[s];
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*-**************************************************************
+* FSE NCount encoding-decoding
+****************************************************************/
+size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
+{
+ size_t const maxHeaderSize = (((maxSymbolValue + 1) * tableLog) >> 3) + 3;
+ return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */
+}
+
+static size_t FSE_writeNCount_generic(void *header, size_t headerBufferSize, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
+ unsigned writeIsSafe)
+{
+ BYTE *const ostart = (BYTE *)header;
+ BYTE *out = ostart;
+ BYTE *const oend = ostart + headerBufferSize;
+ int nbBits;
+ const int tableSize = 1 << tableLog;
+ int remaining;
+ int threshold;
+ U32 bitStream;
+ int bitCount;
+ unsigned charnum = 0;
+ int previous0 = 0;
+
+ bitStream = 0;
+ bitCount = 0;
+ /* Table Size */
+ bitStream += (tableLog - FSE_MIN_TABLELOG) << bitCount;
+ bitCount += 4;
+
+ /* Init */
+ remaining = tableSize + 1; /* +1 for extra accuracy */
+ threshold = tableSize;
+ nbBits = tableLog + 1;
+
+ while (remaining > 1) { /* stops at 1 */
+ if (previous0) {
+ unsigned start = charnum;
+ while (!normalizedCounter[charnum])
+ charnum++;
+ while (charnum >= start + 24) {
+ start += 24;
+ bitStream += 0xFFFFU << bitCount;
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ out[0] = (BYTE)bitStream;
+ out[1] = (BYTE)(bitStream >> 8);
+ out += 2;
+ bitStream >>= 16;
+ }
+ while (charnum >= start + 3) {
+ start += 3;
+ bitStream += 3 << bitCount;
+ bitCount += 2;
+ }
+ bitStream += (charnum - start) << bitCount;
+ bitCount += 2;
+ if (bitCount > 16) {
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ out[0] = (BYTE)bitStream;
+ out[1] = (BYTE)(bitStream >> 8);
+ out += 2;
+ bitStream >>= 16;
+ bitCount -= 16;
+ }
+ }
+ {
+ int count = normalizedCounter[charnum++];
+ int const max = (2 * threshold - 1) - remaining;
+ remaining -= count < 0 ? -count : count;
+ count++; /* +1 for extra accuracy */
+ if (count >= threshold)
+ count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
+ bitStream += count << bitCount;
+ bitCount += nbBits;
+ bitCount -= (count < max);
+ previous0 = (count == 1);
+ if (remaining < 1)
+ return ERROR(GENERIC);
+ while (remaining < threshold)
+ nbBits--, threshold >>= 1;
+ }
+ if (bitCount > 16) {
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ out[0] = (BYTE)bitStream;
+ out[1] = (BYTE)(bitStream >> 8);
+ out += 2;
+ bitStream >>= 16;
+ bitCount -= 16;
+ }
+ }
+
+ /* flush remaining bitStream */
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ out[0] = (BYTE)bitStream;
+ out[1] = (BYTE)(bitStream >> 8);
+ out += (bitCount + 7) / 8;
+
+ if (charnum > maxSymbolValue + 1)
+ return ERROR(GENERIC);
+
+ return (out - ostart);
+}
+
+size_t FSE_writeNCount(void *buffer, size_t bufferSize, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
+{
+ if (tableLog > FSE_MAX_TABLELOG)
+ return ERROR(tableLog_tooLarge); /* Unsupported */
+ if (tableLog < FSE_MIN_TABLELOG)
+ return ERROR(GENERIC); /* Unsupported */
+
+ if (bufferSize < FSE_NCountWriteBound(maxSymbolValue, tableLog))
+ return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 0);
+
+ return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1);
+}
+
+/*-**************************************************************
+* Counting histogram
+****************************************************************/
+/*! FSE_count_simple
+ This function counts byte values within `src`, and store the histogram into table `count`.
+ It doesn't use any additional memory.
+ But this function is unsafe : it doesn't check that all values within `src` can fit into `count`.
+ For this reason, prefer using a table `count` with 256 elements.
+ @return : count of most numerous element
+*/
+size_t FSE_count_simple(unsigned *count, unsigned *maxSymbolValuePtr, const void *src, size_t srcSize)
+{
+ const BYTE *ip = (const BYTE *)src;
+ const BYTE *const end = ip + srcSize;
+ unsigned maxSymbolValue = *maxSymbolValuePtr;
+ unsigned max = 0;
+
+ memset(count, 0, (maxSymbolValue + 1) * sizeof(*count));
+ if (srcSize == 0) {
+ *maxSymbolValuePtr = 0;
+ return 0;
+ }
+
+ while (ip < end)
+ count[*ip++]++;
+
+ while (!count[maxSymbolValue])
+ maxSymbolValue--;
+ *maxSymbolValuePtr = maxSymbolValue;
+
+ {
+ U32 s;
+ for (s = 0; s <= maxSymbolValue; s++)
+ if (count[s] > max)
+ max = count[s];
+ }
+
+ return (size_t)max;
+}
+
+/* FSE_count_parallel_wksp() :
+ * Same as FSE_count_parallel(), but using an externally provided scratch buffer.
+ * `workSpace` size must be a minimum of `1024 * sizeof(unsigned)`` */
+static size_t FSE_count_parallel_wksp(unsigned *count, unsigned *maxSymbolValuePtr, const void *source, size_t sourceSize, unsigned checkMax,
+ unsigned *const workSpace)
+{
+ const BYTE *ip = (const BYTE *)source;
+ const BYTE *const iend = ip + sourceSize;
+ unsigned maxSymbolValue = *maxSymbolValuePtr;
+ unsigned max = 0;
+ U32 *const Counting1 = workSpace;
+ U32 *const Counting2 = Counting1 + 256;
+ U32 *const Counting3 = Counting2 + 256;
+ U32 *const Counting4 = Counting3 + 256;
+
+ memset(Counting1, 0, 4 * 256 * sizeof(unsigned));
+
+ /* safety checks */
+ if (!sourceSize) {
+ memset(count, 0, maxSymbolValue + 1);
+ *maxSymbolValuePtr = 0;
+ return 0;
+ }
+ if (!maxSymbolValue)
+ maxSymbolValue = 255; /* 0 == default */
+
+ /* by stripes of 16 bytes */
+ {
+ U32 cached = ZSTD_read32(ip);
+ ip += 4;
+ while (ip < iend - 15) {
+ U32 c = cached;
+ cached = ZSTD_read32(ip);
+ ip += 4;
+ Counting1[(BYTE)c]++;
+ Counting2[(BYTE)(c >> 8)]++;
+ Counting3[(BYTE)(c >> 16)]++;
+ Counting4[c >> 24]++;
+ c = cached;
+ cached = ZSTD_read32(ip);
+ ip += 4;
+ Counting1[(BYTE)c]++;
+ Counting2[(BYTE)(c >> 8)]++;
+ Counting3[(BYTE)(c >> 16)]++;
+ Counting4[c >> 24]++;
+ c = cached;
+ cached = ZSTD_read32(ip);
+ ip += 4;
+ Counting1[(BYTE)c]++;
+ Counting2[(BYTE)(c >> 8)]++;
+ Counting3[(BYTE)(c >> 16)]++;
+ Counting4[c >> 24]++;
+ c = cached;
+ cached = ZSTD_read32(ip);
+ ip += 4;
+ Counting1[(BYTE)c]++;
+ Counting2[(BYTE)(c >> 8)]++;
+ Counting3[(BYTE)(c >> 16)]++;
+ Counting4[c >> 24]++;
+ }
+ ip -= 4;
+ }
+
+ /* finish last symbols */
+ while (ip < iend)
+ Counting1[*ip++]++;
+
+ if (checkMax) { /* verify stats will fit into destination table */
+ U32 s;
+ for (s = 255; s > maxSymbolValue; s--) {
+ Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
+ if (Counting1[s])
+ return ERROR(maxSymbolValue_tooSmall);
+ }
+ }
+
+ {
+ U32 s;
+ for (s = 0; s <= maxSymbolValue; s++) {
+ count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
+ if (count[s] > max)
+ max = count[s];
+ }
+ }
+
+ while (!count[maxSymbolValue])
+ maxSymbolValue--;
+ *maxSymbolValuePtr = maxSymbolValue;
+ return (size_t)max;
+}
+
+/* FSE_countFast_wksp() :
+ * Same as FSE_countFast(), but using an externally provided scratch buffer.
+ * `workSpace` size must be table of >= `1024` unsigned */
+size_t FSE_countFast_wksp(unsigned *count, unsigned *maxSymbolValuePtr, const void *source, size_t sourceSize, unsigned *workSpace)
+{
+ if (sourceSize < 1500)
+ return FSE_count_simple(count, maxSymbolValuePtr, source, sourceSize);
+ return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 0, workSpace);
+}
+
+/* FSE_count_wksp() :
+ * Same as FSE_count(), but using an externally provided scratch buffer.
+ * `workSpace` size must be table of >= `1024` unsigned */
+size_t FSE_count_wksp(unsigned *count, unsigned *maxSymbolValuePtr, const void *source, size_t sourceSize, unsigned *workSpace)
+{
+ if (*maxSymbolValuePtr < 255)
+ return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 1, workSpace);
+ *maxSymbolValuePtr = 255;
+ return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace);
+}
+
+/*-**************************************************************
+* FSE Compression Code
+****************************************************************/
+/*! FSE_sizeof_CTable() :
+ FSE_CTable is a variable size structure which contains :
+ `U16 tableLog;`
+ `U16 maxSymbolValue;`
+ `U16 nextStateNumber[1 << tableLog];` // This size is variable
+ `FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];` // This size is variable
+Allocation is manual (C standard does not support variable-size structures).
+*/
+size_t FSE_sizeof_CTable(unsigned maxSymbolValue, unsigned tableLog)
+{
+ if (tableLog > FSE_MAX_TABLELOG)
+ return ERROR(tableLog_tooLarge);
+ return FSE_CTABLE_SIZE_U32(tableLog, maxSymbolValue) * sizeof(U32);
+}
+
+/* provides the minimum logSize to safely represent a distribution */
+static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
+{
+ U32 minBitsSrc = BIT_highbit32((U32)(srcSize - 1)) + 1;
+ U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
+ U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
+ return minBits;
+}
+
+unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus)
+{
+ U32 maxBitsSrc = BIT_highbit32((U32)(srcSize - 1)) - minus;
+ U32 tableLog = maxTableLog;
+ U32 minBits = FSE_minTableLog(srcSize, maxSymbolValue);
+ if (tableLog == 0)
+ tableLog = FSE_DEFAULT_TABLELOG;
+ if (maxBitsSrc < tableLog)
+ tableLog = maxBitsSrc; /* Accuracy can be reduced */
+ if (minBits > tableLog)
+ tableLog = minBits; /* Need a minimum to safely represent all symbol values */
+ if (tableLog < FSE_MIN_TABLELOG)
+ tableLog = FSE_MIN_TABLELOG;
+ if (tableLog > FSE_MAX_TABLELOG)
+ tableLog = FSE_MAX_TABLELOG;
+ return tableLog;
+}
+
+unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue)
+{
+ return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 2);
+}
+
+/* Secondary normalization method.
+ To be used when primary method fails. */
+
+static size_t FSE_normalizeM2(short *norm, U32 tableLog, const unsigned *count, size_t total, U32 maxSymbolValue)
+{
+ short const NOT_YET_ASSIGNED = -2;
+ U32 s;
+ U32 distributed = 0;
+ U32 ToDistribute;
+
+ /* Init */
+ U32 const lowThreshold = (U32)(total >> tableLog);
+ U32 lowOne = (U32)((total * 3) >> (tableLog + 1));
+
+ for (s = 0; s <= maxSymbolValue; s++) {
+ if (count[s] == 0) {
+ norm[s] = 0;
+ continue;
+ }
+ if (count[s] <= lowThreshold) {
+ norm[s] = -1;
+ distributed++;
+ total -= count[s];
+ continue;
+ }
+ if (count[s] <= lowOne) {
+ norm[s] = 1;
+ distributed++;
+ total -= count[s];
+ continue;
+ }
+
+ norm[s] = NOT_YET_ASSIGNED;
+ }
+ ToDistribute = (1 << tableLog) - distributed;
+
+ if ((total / ToDistribute) > lowOne) {
+ /* risk of rounding to zero */
+ lowOne = (U32)((total * 3) / (ToDistribute * 2));
+ for (s = 0; s <= maxSymbolValue; s++) {
+ if ((norm[s] == NOT_YET_ASSIGNED) && (count[s] <= lowOne)) {
+ norm[s] = 1;
+ distributed++;
+ total -= count[s];
+ continue;
+ }
+ }
+ ToDistribute = (1 << tableLog) - distributed;
+ }
+
+ if (distributed == maxSymbolValue + 1) {
+ /* all values are pretty poor;
+ probably incompressible data (should have already been detected);
+ find max, then give all remaining points to max */
+ U32 maxV = 0, maxC = 0;
+ for (s = 0; s <= maxSymbolValue; s++)
+ if (count[s] > maxC)
+ maxV = s, maxC = count[s];
+ norm[maxV] += (short)ToDistribute;
+ return 0;
+ }
+
+ if (total == 0) {
+ /* all of the symbols were low enough for the lowOne or lowThreshold */
+ for (s = 0; ToDistribute > 0; s = (s + 1) % (maxSymbolValue + 1))
+ if (norm[s] > 0)
+ ToDistribute--, norm[s]++;
+ return 0;
+ }
+
+ {
+ U64 const vStepLog = 62 - tableLog;
+ U64 const mid = (1ULL << (vStepLog - 1)) - 1;
+ U64 const rStep = div_u64((((U64)1 << vStepLog) * ToDistribute) + mid, (U32)total); /* scale on remaining */
+ U64 tmpTotal = mid;
+ for (s = 0; s <= maxSymbolValue; s++) {
+ if (norm[s] == NOT_YET_ASSIGNED) {
+ U64 const end = tmpTotal + (count[s] * rStep);
+ U32 const sStart = (U32)(tmpTotal >> vStepLog);
+ U32 const sEnd = (U32)(end >> vStepLog);
+ U32 const weight = sEnd - sStart;
+ if (weight < 1)
+ return ERROR(GENERIC);
+ norm[s] = (short)weight;
+ tmpTotal = end;
+ }
+ }
+ }
+
+ return 0;
+}
+
+size_t FSE_normalizeCount(short *normalizedCounter, unsigned tableLog, const unsigned *count, size_t total, unsigned maxSymbolValue)
+{
+ /* Sanity checks */
+ if (tableLog == 0)
+ tableLog = FSE_DEFAULT_TABLELOG;
+ if (tableLog < FSE_MIN_TABLELOG)
+ return ERROR(GENERIC); /* Unsupported size */
+ if (tableLog > FSE_MAX_TABLELOG)
+ return ERROR(tableLog_tooLarge); /* Unsupported size */
+ if (tableLog < FSE_minTableLog(total, maxSymbolValue))
+ return ERROR(GENERIC); /* Too small tableLog, compression potentially impossible */
+
+ {
+ U32 const rtbTable[] = {0, 473195, 504333, 520860, 550000, 700000, 750000, 830000};
+ U64 const scale = 62 - tableLog;
+ U64 const step = div_u64((U64)1 << 62, (U32)total); /* <== here, one division ! */
+ U64 const vStep = 1ULL << (scale - 20);
+ int stillToDistribute = 1 << tableLog;
+ unsigned s;
+ unsigned largest = 0;
+ short largestP = 0;
+ U32 lowThreshold = (U32)(total >> tableLog);
+
+ for (s = 0; s <= maxSymbolValue; s++) {
+ if (count[s] == total)
+ return 0; /* rle special case */
+ if (count[s] == 0) {
+ normalizedCounter[s] = 0;
+ continue;
+ }
+ if (count[s] <= lowThreshold) {
+ normalizedCounter[s] = -1;
+ stillToDistribute--;
+ } else {
+ short proba = (short)((count[s] * step) >> scale);
+ if (proba < 8) {
+ U64 restToBeat = vStep * rtbTable[proba];
+ proba += (count[s] * step) - ((U64)proba << scale) > restToBeat;
+ }
+ if (proba > largestP)
+ largestP = proba, largest = s;
+ normalizedCounter[s] = proba;
+ stillToDistribute -= proba;
+ }
+ }
+ if (-stillToDistribute >= (normalizedCounter[largest] >> 1)) {
+ /* corner case, need another normalization method */
+ size_t const errorCode = FSE_normalizeM2(normalizedCounter, tableLog, count, total, maxSymbolValue);
+ if (FSE_isError(errorCode))
+ return errorCode;
+ } else
+ normalizedCounter[largest] += (short)stillToDistribute;
+ }
+
+ return tableLog;
+}
+
+/* fake FSE_CTable, for raw (uncompressed) input */
+size_t FSE_buildCTable_raw(FSE_CTable *ct, unsigned nbBits)
+{
+ const unsigned tableSize = 1 << nbBits;
+ const unsigned tableMask = tableSize - 1;
+ const unsigned maxSymbolValue = tableMask;
+ void *const ptr = ct;
+ U16 *const tableU16 = ((U16 *)ptr) + 2;
+ void *const FSCT = ((U32 *)ptr) + 1 /* header */ + (tableSize >> 1); /* assumption : tableLog >= 1 */
+ FSE_symbolCompressionTransform *const symbolTT = (FSE_symbolCompressionTransform *)(FSCT);
+ unsigned s;
+
+ /* Sanity checks */
+ if (nbBits < 1)
+ return ERROR(GENERIC); /* min size */
+
+ /* header */
+ tableU16[-2] = (U16)nbBits;
+ tableU16[-1] = (U16)maxSymbolValue;
+
+ /* Build table */
+ for (s = 0; s < tableSize; s++)
+ tableU16[s] = (U16)(tableSize + s);
+
+ /* Build Symbol Transformation Table */
+ {
+ const U32 deltaNbBits = (nbBits << 16) - (1 << nbBits);
+ for (s = 0; s <= maxSymbolValue; s++) {
+ symbolTT[s].deltaNbBits = deltaNbBits;
+ symbolTT[s].deltaFindState = s - 1;
+ }
+ }
+
+ return 0;
+}
+
+/* fake FSE_CTable, for rle input (always same symbol) */
+size_t FSE_buildCTable_rle(FSE_CTable *ct, BYTE symbolValue)
+{
+ void *ptr = ct;
+ U16 *tableU16 = ((U16 *)ptr) + 2;
+ void *FSCTptr = (U32 *)ptr + 2;
+ FSE_symbolCompressionTransform *symbolTT = (FSE_symbolCompressionTransform *)FSCTptr;
+
+ /* header */
+ tableU16[-2] = (U16)0;
+ tableU16[-1] = (U16)symbolValue;
+
+ /* Build table */
+ tableU16[0] = 0;
+ tableU16[1] = 0; /* just in case */
+
+ /* Build Symbol Transformation Table */
+ symbolTT[symbolValue].deltaNbBits = 0;
+ symbolTT[symbolValue].deltaFindState = 0;
+
+ return 0;
+}
+
+static size_t FSE_compress_usingCTable_generic(void *dst, size_t dstSize, const void *src, size_t srcSize, const FSE_CTable *ct, const unsigned fast)
+{
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *ip = iend;
+
+ BIT_CStream_t bitC;
+ FSE_CState_t CState1, CState2;
+
+ /* init */
+ if (srcSize <= 2)
+ return 0;
+ {
+ size_t const initError = BIT_initCStream(&bitC, dst, dstSize);
+ if (FSE_isError(initError))
+ return 0; /* not enough space available to write a bitstream */
+ }
+
+#define FSE_FLUSHBITS(s) (fast ? BIT_flushBitsFast(s) : BIT_flushBits(s))
+
+ if (srcSize & 1) {
+ FSE_initCState2(&CState1, ct, *--ip);
+ FSE_initCState2(&CState2, ct, *--ip);
+ FSE_encodeSymbol(&bitC, &CState1, *--ip);
+ FSE_FLUSHBITS(&bitC);
+ } else {
+ FSE_initCState2(&CState2, ct, *--ip);
+ FSE_initCState2(&CState1, ct, *--ip);
+ }
+
+ /* join to mod 4 */
+ srcSize -= 2;
+ if ((sizeof(bitC.bitContainer) * 8 > FSE_MAX_TABLELOG * 4 + 7) && (srcSize & 2)) { /* test bit 2 */
+ FSE_encodeSymbol(&bitC, &CState2, *--ip);
+ FSE_encodeSymbol(&bitC, &CState1, *--ip);
+ FSE_FLUSHBITS(&bitC);
+ }
+
+ /* 2 or 4 encoding per loop */
+ while (ip > istart) {
+
+ FSE_encodeSymbol(&bitC, &CState2, *--ip);
+
+ if (sizeof(bitC.bitContainer) * 8 < FSE_MAX_TABLELOG * 2 + 7) /* this test must be static */
+ FSE_FLUSHBITS(&bitC);
+
+ FSE_encodeSymbol(&bitC, &CState1, *--ip);
+
+ if (sizeof(bitC.bitContainer) * 8 > FSE_MAX_TABLELOG * 4 + 7) { /* this test must be static */
+ FSE_encodeSymbol(&bitC, &CState2, *--ip);
+ FSE_encodeSymbol(&bitC, &CState1, *--ip);
+ }
+
+ FSE_FLUSHBITS(&bitC);
+ }
+
+ FSE_flushCState(&bitC, &CState2);
+ FSE_flushCState(&bitC, &CState1);
+ return BIT_closeCStream(&bitC);
+}
+
+size_t FSE_compress_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const FSE_CTable *ct)
+{
+ unsigned const fast = (dstSize >= FSE_BLOCKBOUND(srcSize));
+
+ if (fast)
+ return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 1);
+ else
+ return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 0);
+}
+
+size_t FSE_compressBound(size_t size) { return FSE_COMPRESSBOUND(size); }
diff --git a/lib/zstd/fse_decompress.c b/lib/zstd/fse_decompress.c
new file mode 100644
index 000000000000..a84300e5a013
--- /dev/null
+++ b/lib/zstd/fse_decompress.c
@@ -0,0 +1,332 @@
+/*
+ * FSE : Finite State Entropy decoder
+ * Copyright (C) 2013-2015, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+
+/* **************************************************************
+* Compiler specifics
+****************************************************************/
+#define FORCE_INLINE static __always_inline
+
+/* **************************************************************
+* Includes
+****************************************************************/
+#include "bitstream.h"
+#include "fse.h"
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/string.h> /* memcpy, memset */
+
+/* **************************************************************
+* Error Management
+****************************************************************/
+#define FSE_isError ERR_isError
+#define FSE_STATIC_ASSERT(c) \
+ { \
+ enum { FSE_static_assert = 1 / (int)(!!(c)) }; \
+ } /* use only *after* variable declarations */
+
+/* check and forward error code */
+#define CHECK_F(f) \
+ { \
+ size_t const e = f; \
+ if (FSE_isError(e)) \
+ return e; \
+ }
+
+/* **************************************************************
+* Templates
+****************************************************************/
+/*
+ designed to be included
+ for type-specific functions (template emulation in C)
+ Objective is to write these functions only once, for improved maintenance
+*/
+
+/* safety checks */
+#ifndef FSE_FUNCTION_EXTENSION
+#error "FSE_FUNCTION_EXTENSION must be defined"
+#endif
+#ifndef FSE_FUNCTION_TYPE
+#error "FSE_FUNCTION_TYPE must be defined"
+#endif
+
+/* Function names */
+#define FSE_CAT(X, Y) X##Y
+#define FSE_FUNCTION_NAME(X, Y) FSE_CAT(X, Y)
+#define FSE_TYPE_NAME(X, Y) FSE_CAT(X, Y)
+
+/* Function templates */
+
+size_t FSE_buildDTable_wksp(FSE_DTable *dt, const short *normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void *workspace, size_t workspaceSize)
+{
+ void *const tdPtr = dt + 1; /* because *dt is unsigned, 32-bits aligned on 32-bits */
+ FSE_DECODE_TYPE *const tableDecode = (FSE_DECODE_TYPE *)(tdPtr);
+ U16 *symbolNext = (U16 *)workspace;
+
+ U32 const maxSV1 = maxSymbolValue + 1;
+ U32 const tableSize = 1 << tableLog;
+ U32 highThreshold = tableSize - 1;
+
+ /* Sanity Checks */
+ if (workspaceSize < sizeof(U16) * (FSE_MAX_SYMBOL_VALUE + 1))
+ return ERROR(tableLog_tooLarge);
+ if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE)
+ return ERROR(maxSymbolValue_tooLarge);
+ if (tableLog > FSE_MAX_TABLELOG)
+ return ERROR(tableLog_tooLarge);
+
+ /* Init, lay down lowprob symbols */
+ {
+ FSE_DTableHeader DTableH;
+ DTableH.tableLog = (U16)tableLog;
+ DTableH.fastMode = 1;
+ {
+ S16 const largeLimit = (S16)(1 << (tableLog - 1));
+ U32 s;
+ for (s = 0; s < maxSV1; s++) {
+ if (normalizedCounter[s] == -1) {
+ tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
+ symbolNext[s] = 1;
+ } else {
+ if (normalizedCounter[s] >= largeLimit)
+ DTableH.fastMode = 0;
+ symbolNext[s] = normalizedCounter[s];
+ }
+ }
+ }
+ memcpy(dt, &DTableH, sizeof(DTableH));
+ }
+
+ /* Spread symbols */
+ {
+ U32 const tableMask = tableSize - 1;
+ U32 const step = FSE_TABLESTEP(tableSize);
+ U32 s, position = 0;
+ for (s = 0; s < maxSV1; s++) {
+ int i;
+ for (i = 0; i < normalizedCounter[s]; i++) {
+ tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
+ position = (position + step) & tableMask;
+ while (position > highThreshold)
+ position = (position + step) & tableMask; /* lowprob area */
+ }
+ }
+ if (position != 0)
+ return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
+ }
+
+ /* Build Decoding table */
+ {
+ U32 u;
+ for (u = 0; u < tableSize; u++) {
+ FSE_FUNCTION_TYPE const symbol = (FSE_FUNCTION_TYPE)(tableDecode[u].symbol);
+ U16 nextState = symbolNext[symbol]++;
+ tableDecode[u].nbBits = (BYTE)(tableLog - BIT_highbit32((U32)nextState));
+ tableDecode[u].newState = (U16)((nextState << tableDecode[u].nbBits) - tableSize);
+ }
+ }
+
+ return 0;
+}
+
+/*-*******************************************************
+* Decompression (Byte symbols)
+*********************************************************/
+size_t FSE_buildDTable_rle(FSE_DTable *dt, BYTE symbolValue)
+{
+ void *ptr = dt;
+ FSE_DTableHeader *const DTableH = (FSE_DTableHeader *)ptr;
+ void *dPtr = dt + 1;
+ FSE_decode_t *const cell = (FSE_decode_t *)dPtr;
+
+ DTableH->tableLog = 0;
+ DTableH->fastMode = 0;
+
+ cell->newState = 0;
+ cell->symbol = symbolValue;
+ cell->nbBits = 0;
+
+ return 0;
+}
+
+size_t FSE_buildDTable_raw(FSE_DTable *dt, unsigned nbBits)
+{
+ void *ptr = dt;
+ FSE_DTableHeader *const DTableH = (FSE_DTableHeader *)ptr;
+ void *dPtr = dt + 1;
+ FSE_decode_t *const dinfo = (FSE_decode_t *)dPtr;
+ const unsigned tableSize = 1 << nbBits;
+ const unsigned tableMask = tableSize - 1;
+ const unsigned maxSV1 = tableMask + 1;
+ unsigned s;
+
+ /* Sanity checks */
+ if (nbBits < 1)
+ return ERROR(GENERIC); /* min size */
+
+ /* Build Decoding Table */
+ DTableH->tableLog = (U16)nbBits;
+ DTableH->fastMode = 1;
+ for (s = 0; s < maxSV1; s++) {
+ dinfo[s].newState = 0;
+ dinfo[s].symbol = (BYTE)s;
+ dinfo[s].nbBits = (BYTE)nbBits;
+ }
+
+ return 0;
+}
+
+FORCE_INLINE size_t FSE_decompress_usingDTable_generic(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const FSE_DTable *dt,
+ const unsigned fast)
+{
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *op = ostart;
+ BYTE *const omax = op + maxDstSize;
+ BYTE *const olimit = omax - 3;
+
+ BIT_DStream_t bitD;
+ FSE_DState_t state1;
+ FSE_DState_t state2;
+
+ /* Init */
+ CHECK_F(BIT_initDStream(&bitD, cSrc, cSrcSize));
+
+ FSE_initDState(&state1, &bitD, dt);
+ FSE_initDState(&state2, &bitD, dt);
+
+#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
+
+ /* 4 symbols per loop */
+ for (; (BIT_reloadDStream(&bitD) == BIT_DStream_unfinished) & (op < olimit); op += 4) {
+ op[0] = FSE_GETSYMBOL(&state1);
+
+ if (FSE_MAX_TABLELOG * 2 + 7 > sizeof(bitD.bitContainer) * 8) /* This test must be static */
+ BIT_reloadDStream(&bitD);
+
+ op[1] = FSE_GETSYMBOL(&state2);
+
+ if (FSE_MAX_TABLELOG * 4 + 7 > sizeof(bitD.bitContainer) * 8) /* This test must be static */
+ {
+ if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) {
+ op += 2;
+ break;
+ }
+ }
+
+ op[2] = FSE_GETSYMBOL(&state1);
+
+ if (FSE_MAX_TABLELOG * 2 + 7 > sizeof(bitD.bitContainer) * 8) /* This test must be static */
+ BIT_reloadDStream(&bitD);
+
+ op[3] = FSE_GETSYMBOL(&state2);
+ }
+
+ /* tail */
+ /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
+ while (1) {
+ if (op > (omax - 2))
+ return ERROR(dstSize_tooSmall);
+ *op++ = FSE_GETSYMBOL(&state1);
+ if (BIT_reloadDStream(&bitD) == BIT_DStream_overflow) {
+ *op++ = FSE_GETSYMBOL(&state2);
+ break;
+ }
+
+ if (op > (omax - 2))
+ return ERROR(dstSize_tooSmall);
+ *op++ = FSE_GETSYMBOL(&state2);
+ if (BIT_reloadDStream(&bitD) == BIT_DStream_overflow) {
+ *op++ = FSE_GETSYMBOL(&state1);
+ break;
+ }
+ }
+
+ return op - ostart;
+}
+
+size_t FSE_decompress_usingDTable(void *dst, size_t originalSize, const void *cSrc, size_t cSrcSize, const FSE_DTable *dt)
+{
+ const void *ptr = dt;
+ const FSE_DTableHeader *DTableH = (const FSE_DTableHeader *)ptr;
+ const U32 fastMode = DTableH->fastMode;
+
+ /* select fast mode (static) */
+ if (fastMode)
+ return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
+ return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
+}
+
+size_t FSE_decompress_wksp(void *dst, size_t dstCapacity, const void *cSrc, size_t cSrcSize, unsigned maxLog, void *workspace, size_t workspaceSize)
+{
+ const BYTE *const istart = (const BYTE *)cSrc;
+ const BYTE *ip = istart;
+ unsigned tableLog;
+ unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
+ size_t NCountLength;
+
+ FSE_DTable *dt;
+ short *counting;
+ size_t spaceUsed32 = 0;
+
+ FSE_STATIC_ASSERT(sizeof(FSE_DTable) == sizeof(U32));
+
+ dt = (FSE_DTable *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += FSE_DTABLE_SIZE_U32(maxLog);
+ counting = (short *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(sizeof(short) * (FSE_MAX_SYMBOL_VALUE + 1), sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ /* normal FSE decoding mode */
+ NCountLength = FSE_readNCount(counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
+ if (FSE_isError(NCountLength))
+ return NCountLength;
+ // if (NCountLength >= cSrcSize) return ERROR(srcSize_wrong); /* too small input size; supposed to be already checked in NCountLength, only remaining
+ // case : NCountLength==cSrcSize */
+ if (tableLog > maxLog)
+ return ERROR(tableLog_tooLarge);
+ ip += NCountLength;
+ cSrcSize -= NCountLength;
+
+ CHECK_F(FSE_buildDTable_wksp(dt, counting, maxSymbolValue, tableLog, workspace, workspaceSize));
+
+ return FSE_decompress_usingDTable(dst, dstCapacity, ip, cSrcSize, dt); /* always return, even if it is an error code */
+}
diff --git a/lib/zstd/huf.h b/lib/zstd/huf.h
new file mode 100644
index 000000000000..2143da28d952
--- /dev/null
+++ b/lib/zstd/huf.h
@@ -0,0 +1,212 @@
+/*
+ * Huffman coder, part of New Generation Entropy library
+ * header file
+ * Copyright (C) 2013-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+#ifndef HUF_H_298734234
+#define HUF_H_298734234
+
+/* *** Dependencies *** */
+#include <linux/types.h> /* size_t */
+
+/* *** Tool functions *** */
+#define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */
+size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */
+
+/* Error Management */
+unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */
+
+/* *** Advanced function *** */
+
+/** HUF_compress4X_wksp() :
+* Same as HUF_compress2(), but uses externally allocated `workSpace`, which must be a table of >= 1024 unsigned */
+size_t HUF_compress4X_wksp(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void *workSpace,
+ size_t wkspSize); /**< `workSpace` must be a table of at least HUF_COMPRESS_WORKSPACE_SIZE_U32 unsigned */
+
+/* *** Dependencies *** */
+#include "mem.h" /* U32 */
+
+/* *** Constants *** */
+#define HUF_TABLELOG_MAX 12 /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
+#define HUF_TABLELOG_DEFAULT 11 /* tableLog by default, when not specified */
+#define HUF_SYMBOLVALUE_MAX 255
+
+#define HUF_TABLELOG_ABSOLUTEMAX 15 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
+#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
+#error "HUF_TABLELOG_MAX is too large !"
+#endif
+
+/* ****************************************
+* Static allocation
+******************************************/
+/* HUF buffer bounds */
+#define HUF_CTABLEBOUND 129
+#define HUF_BLOCKBOUND(size) (size + (size >> 8) + 8) /* only true if incompressible pre-filtered with fast heuristic */
+#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
+
+/* static allocation of HUF's Compression Table */
+#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
+ U32 name##hb[maxSymbolValue + 1]; \
+ void *name##hv = &(name##hb); \
+ HUF_CElt *name = (HUF_CElt *)(name##hv) /* no final ; */
+
+/* static allocation of HUF's DTable */
+typedef U32 HUF_DTable;
+#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1 << (maxTableLog)))
+#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = {((U32)((maxTableLog)-1) * 0x01000001)}
+#define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = {((U32)(maxTableLog)*0x01000001)}
+
+/* The workspace must have alignment at least 4 and be at least this large */
+#define HUF_COMPRESS_WORKSPACE_SIZE (6 << 10)
+#define HUF_COMPRESS_WORKSPACE_SIZE_U32 (HUF_COMPRESS_WORKSPACE_SIZE / sizeof(U32))
+
+/* The workspace must have alignment at least 4 and be at least this large */
+#define HUF_DECOMPRESS_WORKSPACE_SIZE (3 << 10)
+#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
+
+/* ****************************************
+* Advanced decompression functions
+******************************************/
+size_t HUF_decompress4X_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize); /**< decodes RLE and uncompressed */
+size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace,
+ size_t workspaceSize); /**< considers RLE and uncompressed as errors */
+size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace,
+ size_t workspaceSize); /**< single-symbol decoder */
+size_t HUF_decompress4X4_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace,
+ size_t workspaceSize); /**< double-symbols decoder */
+
+/* ****************************************
+* HUF detailed API
+******************************************/
+/*!
+HUF_compress() does the following:
+1. count symbol occurrence from source[] into table count[] using FSE_count()
+2. (optional) refine tableLog using HUF_optimalTableLog()
+3. build Huffman table from count using HUF_buildCTable()
+4. save Huffman table to memory buffer using HUF_writeCTable_wksp()
+5. encode the data stream using HUF_compress4X_usingCTable()
+
+The following API allows targeting specific sub-functions for advanced tasks.
+For example, it's possible to compress several blocks using the same 'CTable',
+or to save and regenerate 'CTable' using external methods.
+*/
+/* FSE_count() : find it within "fse.h" */
+unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
+typedef struct HUF_CElt_s HUF_CElt; /* incomplete type */
+size_t HUF_writeCTable_wksp(void *dst, size_t maxDstSize, const HUF_CElt *CTable, unsigned maxSymbolValue, unsigned huffLog, void *workspace, size_t workspaceSize);
+size_t HUF_compress4X_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const HUF_CElt *CTable);
+
+typedef enum {
+ HUF_repeat_none, /**< Cannot use the previous table */
+ HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1,
+ 4}X_repeat */
+ HUF_repeat_valid /**< Can use the previous table and it is asumed to be valid */
+} HUF_repeat;
+/** HUF_compress4X_repeat() :
+* Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
+* If it uses hufTable it does not modify hufTable or repeat.
+* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
+* If preferRepeat then the old table will always be used if valid. */
+size_t HUF_compress4X_repeat(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void *workSpace,
+ size_t wkspSize, HUF_CElt *hufTable, HUF_repeat *repeat,
+ int preferRepeat); /**< `workSpace` must be a table of at least HUF_COMPRESS_WORKSPACE_SIZE_U32 unsigned */
+
+/** HUF_buildCTable_wksp() :
+ * Same as HUF_buildCTable(), but using externally allocated scratch buffer.
+ * `workSpace` must be aligned on 4-bytes boundaries, and be at least as large as a table of 1024 unsigned.
+ */
+size_t HUF_buildCTable_wksp(HUF_CElt *tree, const U32 *count, U32 maxSymbolValue, U32 maxNbBits, void *workSpace, size_t wkspSize);
+
+/*! HUF_readStats() :
+ Read compact Huffman tree, saved by HUF_writeCTable().
+ `huffWeight` is destination buffer.
+ @return : size read from `src` , or an error Code .
+ Note : Needed by HUF_readCTable() and HUF_readDTableXn() . */
+size_t HUF_readStats_wksp(BYTE *huffWeight, size_t hwSize, U32 *rankStats, U32 *nbSymbolsPtr, U32 *tableLogPtr, const void *src, size_t srcSize,
+ void *workspace, size_t workspaceSize);
+
+/** HUF_readCTable() :
+* Loading a CTable saved with HUF_writeCTable() */
+size_t HUF_readCTable_wksp(HUF_CElt *CTable, unsigned maxSymbolValue, const void *src, size_t srcSize, void *workspace, size_t workspaceSize);
+
+/*
+HUF_decompress() does the following:
+1. select the decompression algorithm (X2, X4) based on pre-computed heuristics
+2. build Huffman table from save, using HUF_readDTableXn()
+3. decode 1 or 4 segments in parallel using HUF_decompressSXn_usingDTable
+*/
+
+/** HUF_selectDecoder() :
+* Tells which decoder is likely to decode faster,
+* based on a set of pre-determined metrics.
+* @return : 0==HUF_decompress4X2, 1==HUF_decompress4X4 .
+* Assumption : 0 < cSrcSize < dstSize <= 128 KB */
+U32 HUF_selectDecoder(size_t dstSize, size_t cSrcSize);
+
+size_t HUF_readDTableX2_wksp(HUF_DTable *DTable, const void *src, size_t srcSize, void *workspace, size_t workspaceSize);
+size_t HUF_readDTableX4_wksp(HUF_DTable *DTable, const void *src, size_t srcSize, void *workspace, size_t workspaceSize);
+
+size_t HUF_decompress4X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable);
+size_t HUF_decompress4X2_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable);
+size_t HUF_decompress4X4_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable);
+
+/* single stream variants */
+
+size_t HUF_compress1X_wksp(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void *workSpace,
+ size_t wkspSize); /**< `workSpace` must be a table of at least HUF_COMPRESS_WORKSPACE_SIZE_U32 unsigned */
+size_t HUF_compress1X_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const HUF_CElt *CTable);
+/** HUF_compress1X_repeat() :
+* Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
+* If it uses hufTable it does not modify hufTable or repeat.
+* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
+* If preferRepeat then the old table will always be used if valid. */
+size_t HUF_compress1X_repeat(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void *workSpace,
+ size_t wkspSize, HUF_CElt *hufTable, HUF_repeat *repeat,
+ int preferRepeat); /**< `workSpace` must be a table of at least HUF_COMPRESS_WORKSPACE_SIZE_U32 unsigned */
+
+size_t HUF_decompress1X_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize);
+size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace,
+ size_t workspaceSize); /**< single-symbol decoder */
+size_t HUF_decompress1X4_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace,
+ size_t workspaceSize); /**< double-symbols decoder */
+
+size_t HUF_decompress1X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize,
+ const HUF_DTable *DTable); /**< automatic selection of sing or double symbol decoder, based on DTable */
+size_t HUF_decompress1X2_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable);
+size_t HUF_decompress1X4_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable);
+
+#endif /* HUF_H_298734234 */
diff --git a/lib/zstd/huf_compress.c b/lib/zstd/huf_compress.c
new file mode 100644
index 000000000000..40055a7016e6
--- /dev/null
+++ b/lib/zstd/huf_compress.c
@@ -0,0 +1,770 @@
+/*
+ * Huffman encoder, part of New Generation Entropy library
+ * Copyright (C) 2013-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+
+/* **************************************************************
+* Includes
+****************************************************************/
+#include "bitstream.h"
+#include "fse.h" /* header compression */
+#include "huf.h"
+#include <linux/kernel.h>
+#include <linux/string.h> /* memcpy, memset */
+
+/* **************************************************************
+* Error Management
+****************************************************************/
+#define HUF_STATIC_ASSERT(c) \
+ { \
+ enum { HUF_static_assert = 1 / (int)(!!(c)) }; \
+ } /* use only *after* variable declarations */
+#define CHECK_V_F(e, f) \
+ size_t const e = f; \
+ if (ERR_isError(e)) \
+ return f
+#define CHECK_F(f) \
+ { \
+ CHECK_V_F(_var_err__, f); \
+ }
+
+/* **************************************************************
+* Utils
+****************************************************************/
+unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue)
+{
+ return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1);
+}
+
+/* *******************************************************
+* HUF : Huffman block compression
+*********************************************************/
+/* HUF_compressWeights() :
+ * Same as FSE_compress(), but dedicated to huff0's weights compression.
+ * The use case needs much less stack memory.
+ * Note : all elements within weightTable are supposed to be <= HUF_TABLELOG_MAX.
+ */
+#define MAX_FSE_TABLELOG_FOR_HUFF_HEADER 6
+size_t HUF_compressWeights_wksp(void *dst, size_t dstSize, const void *weightTable, size_t wtSize, void *workspace, size_t workspaceSize)
+{
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *op = ostart;
+ BYTE *const oend = ostart + dstSize;
+
+ U32 maxSymbolValue = HUF_TABLELOG_MAX;
+ U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER;
+
+ FSE_CTable *CTable;
+ U32 *count;
+ S16 *norm;
+ size_t spaceUsed32 = 0;
+
+ HUF_STATIC_ASSERT(sizeof(FSE_CTable) == sizeof(U32));
+
+ CTable = (FSE_CTable *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += FSE_CTABLE_SIZE_U32(MAX_FSE_TABLELOG_FOR_HUFF_HEADER, HUF_TABLELOG_MAX);
+ count = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += HUF_TABLELOG_MAX + 1;
+ norm = (S16 *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(sizeof(S16) * (HUF_TABLELOG_MAX + 1), sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ /* init conditions */
+ if (wtSize <= 1)
+ return 0; /* Not compressible */
+
+ /* Scan input and build symbol stats */
+ {
+ CHECK_V_F(maxCount, FSE_count_simple(count, &maxSymbolValue, weightTable, wtSize));
+ if (maxCount == wtSize)
+ return 1; /* only a single symbol in src : rle */
+ if (maxCount == 1)
+ return 0; /* each symbol present maximum once => not compressible */
+ }
+
+ tableLog = FSE_optimalTableLog(tableLog, wtSize, maxSymbolValue);
+ CHECK_F(FSE_normalizeCount(norm, tableLog, count, wtSize, maxSymbolValue));
+
+ /* Write table description header */
+ {
+ CHECK_V_F(hSize, FSE_writeNCount(op, oend - op, norm, maxSymbolValue, tableLog));
+ op += hSize;
+ }
+
+ /* Compress */
+ CHECK_F(FSE_buildCTable_wksp(CTable, norm, maxSymbolValue, tableLog, workspace, workspaceSize));
+ {
+ CHECK_V_F(cSize, FSE_compress_usingCTable(op, oend - op, weightTable, wtSize, CTable));
+ if (cSize == 0)
+ return 0; /* not enough space for compressed data */
+ op += cSize;
+ }
+
+ return op - ostart;
+}
+
+struct HUF_CElt_s {
+ U16 val;
+ BYTE nbBits;
+}; /* typedef'd to HUF_CElt within "huf.h" */
+
+/*! HUF_writeCTable_wksp() :
+ `CTable` : Huffman tree to save, using huf representation.
+ @return : size of saved CTable */
+size_t HUF_writeCTable_wksp(void *dst, size_t maxDstSize, const HUF_CElt *CTable, U32 maxSymbolValue, U32 huffLog, void *workspace, size_t workspaceSize)
+{
+ BYTE *op = (BYTE *)dst;
+ U32 n;
+
+ BYTE *bitsToWeight;
+ BYTE *huffWeight;
+ size_t spaceUsed32 = 0;
+
+ bitsToWeight = (BYTE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(HUF_TABLELOG_MAX + 1, sizeof(U32)) >> 2;
+ huffWeight = (BYTE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(HUF_SYMBOLVALUE_MAX, sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ /* check conditions */
+ if (maxSymbolValue > HUF_SYMBOLVALUE_MAX)
+ return ERROR(maxSymbolValue_tooLarge);
+
+ /* convert to weight */
+ bitsToWeight[0] = 0;
+ for (n = 1; n < huffLog + 1; n++)
+ bitsToWeight[n] = (BYTE)(huffLog + 1 - n);
+ for (n = 0; n < maxSymbolValue; n++)
+ huffWeight[n] = bitsToWeight[CTable[n].nbBits];
+
+ /* attempt weights compression by FSE */
+ {
+ CHECK_V_F(hSize, HUF_compressWeights_wksp(op + 1, maxDstSize - 1, huffWeight, maxSymbolValue, workspace, workspaceSize));
+ if ((hSize > 1) & (hSize < maxSymbolValue / 2)) { /* FSE compressed */
+ op[0] = (BYTE)hSize;
+ return hSize + 1;
+ }
+ }
+
+ /* write raw values as 4-bits (max : 15) */
+ if (maxSymbolValue > (256 - 128))
+ return ERROR(GENERIC); /* should not happen : likely means source cannot be compressed */
+ if (((maxSymbolValue + 1) / 2) + 1 > maxDstSize)
+ return ERROR(dstSize_tooSmall); /* not enough space within dst buffer */
+ op[0] = (BYTE)(128 /*special case*/ + (maxSymbolValue - 1));
+ huffWeight[maxSymbolValue] = 0; /* to be sure it doesn't cause msan issue in final combination */
+ for (n = 0; n < maxSymbolValue; n += 2)
+ op[(n / 2) + 1] = (BYTE)((huffWeight[n] << 4) + huffWeight[n + 1]);
+ return ((maxSymbolValue + 1) / 2) + 1;
+}
+
+size_t HUF_readCTable_wksp(HUF_CElt *CTable, U32 maxSymbolValue, const void *src, size_t srcSize, void *workspace, size_t workspaceSize)
+{
+ U32 *rankVal;
+ BYTE *huffWeight;
+ U32 tableLog = 0;
+ U32 nbSymbols = 0;
+ size_t readSize;
+ size_t spaceUsed32 = 0;
+
+ rankVal = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += HUF_TABLELOG_ABSOLUTEMAX + 1;
+ huffWeight = (BYTE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(HUF_SYMBOLVALUE_MAX + 1, sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ /* get symbol weights */
+ readSize = HUF_readStats_wksp(huffWeight, HUF_SYMBOLVALUE_MAX + 1, rankVal, &nbSymbols, &tableLog, src, srcSize, workspace, workspaceSize);
+ if (ERR_isError(readSize))
+ return readSize;
+
+ /* check result */
+ if (tableLog > HUF_TABLELOG_MAX)
+ return ERROR(tableLog_tooLarge);
+ if (nbSymbols > maxSymbolValue + 1)
+ return ERROR(maxSymbolValue_tooSmall);
+
+ /* Prepare base value per rank */
+ {
+ U32 n, nextRankStart = 0;
+ for (n = 1; n <= tableLog; n++) {
+ U32 curr = nextRankStart;
+ nextRankStart += (rankVal[n] << (n - 1));
+ rankVal[n] = curr;
+ }
+ }
+
+ /* fill nbBits */
+ {
+ U32 n;
+ for (n = 0; n < nbSymbols; n++) {
+ const U32 w = huffWeight[n];
+ CTable[n].nbBits = (BYTE)(tableLog + 1 - w);
+ }
+ }
+
+ /* fill val */
+ {
+ U16 nbPerRank[HUF_TABLELOG_MAX + 2] = {0}; /* support w=0=>n=tableLog+1 */
+ U16 valPerRank[HUF_TABLELOG_MAX + 2] = {0};
+ {
+ U32 n;
+ for (n = 0; n < nbSymbols; n++)
+ nbPerRank[CTable[n].nbBits]++;
+ }
+ /* determine stating value per rank */
+ valPerRank[tableLog + 1] = 0; /* for w==0 */
+ {
+ U16 min = 0;
+ U32 n;
+ for (n = tableLog; n > 0; n--) { /* start at n=tablelog <-> w=1 */
+ valPerRank[n] = min; /* get starting value within each rank */
+ min += nbPerRank[n];
+ min >>= 1;
+ }
+ }
+ /* assign value within rank, symbol order */
+ {
+ U32 n;
+ for (n = 0; n <= maxSymbolValue; n++)
+ CTable[n].val = valPerRank[CTable[n].nbBits]++;
+ }
+ }
+
+ return readSize;
+}
+
+typedef struct nodeElt_s {
+ U32 count;
+ U16 parent;
+ BYTE byte;
+ BYTE nbBits;
+} nodeElt;
+
+static U32 HUF_setMaxHeight(nodeElt *huffNode, U32 lastNonNull, U32 maxNbBits)
+{
+ const U32 largestBits = huffNode[lastNonNull].nbBits;
+ if (largestBits <= maxNbBits)
+ return largestBits; /* early exit : no elt > maxNbBits */
+
+ /* there are several too large elements (at least >= 2) */
+ {
+ int totalCost = 0;
+ const U32 baseCost = 1 << (largestBits - maxNbBits);
+ U32 n = lastNonNull;
+
+ while (huffNode[n].nbBits > maxNbBits) {
+ totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits));
+ huffNode[n].nbBits = (BYTE)maxNbBits;
+ n--;
+ } /* n stops at huffNode[n].nbBits <= maxNbBits */
+ while (huffNode[n].nbBits == maxNbBits)
+ n--; /* n end at index of smallest symbol using < maxNbBits */
+
+ /* renorm totalCost */
+ totalCost >>= (largestBits - maxNbBits); /* note : totalCost is necessarily a multiple of baseCost */
+
+ /* repay normalized cost */
+ {
+ U32 const noSymbol = 0xF0F0F0F0;
+ U32 rankLast[HUF_TABLELOG_MAX + 2];
+ int pos;
+
+ /* Get pos of last (smallest) symbol per rank */
+ memset(rankLast, 0xF0, sizeof(rankLast));
+ {
+ U32 currNbBits = maxNbBits;
+ for (pos = n; pos >= 0; pos--) {
+ if (huffNode[pos].nbBits >= currNbBits)
+ continue;
+ currNbBits = huffNode[pos].nbBits; /* < maxNbBits */
+ rankLast[maxNbBits - currNbBits] = pos;
+ }
+ }
+
+ while (totalCost > 0) {
+ U32 nBitsToDecrease = BIT_highbit32(totalCost) + 1;
+ for (; nBitsToDecrease > 1; nBitsToDecrease--) {
+ U32 highPos = rankLast[nBitsToDecrease];
+ U32 lowPos = rankLast[nBitsToDecrease - 1];
+ if (highPos == noSymbol)
+ continue;
+ if (lowPos == noSymbol)
+ break;
+ {
+ U32 const highTotal = huffNode[highPos].count;
+ U32 const lowTotal = 2 * huffNode[lowPos].count;
+ if (highTotal <= lowTotal)
+ break;
+ }
+ }
+ /* only triggered when no more rank 1 symbol left => find closest one (note : there is necessarily at least one !) */
+ /* HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary */
+ while ((nBitsToDecrease <= HUF_TABLELOG_MAX) && (rankLast[nBitsToDecrease] == noSymbol))
+ nBitsToDecrease++;
+ totalCost -= 1 << (nBitsToDecrease - 1);
+ if (rankLast[nBitsToDecrease - 1] == noSymbol)
+ rankLast[nBitsToDecrease - 1] = rankLast[nBitsToDecrease]; /* this rank is no longer empty */
+ huffNode[rankLast[nBitsToDecrease]].nbBits++;
+ if (rankLast[nBitsToDecrease] == 0) /* special case, reached largest symbol */
+ rankLast[nBitsToDecrease] = noSymbol;
+ else {
+ rankLast[nBitsToDecrease]--;
+ if (huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits - nBitsToDecrease)
+ rankLast[nBitsToDecrease] = noSymbol; /* this rank is now empty */
+ }
+ } /* while (totalCost > 0) */
+
+ while (totalCost < 0) { /* Sometimes, cost correction overshoot */
+ if (rankLast[1] == noSymbol) { /* special case : no rank 1 symbol (using maxNbBits-1); let's create one from largest rank 0
+ (using maxNbBits) */
+ while (huffNode[n].nbBits == maxNbBits)
+ n--;
+ huffNode[n + 1].nbBits--;
+ rankLast[1] = n + 1;
+ totalCost++;
+ continue;
+ }
+ huffNode[rankLast[1] + 1].nbBits--;
+ rankLast[1]++;
+ totalCost++;
+ }
+ }
+ } /* there are several too large elements (at least >= 2) */
+
+ return maxNbBits;
+}
+
+typedef struct {
+ U32 base;
+ U32 curr;
+} rankPos;
+
+static void HUF_sort(nodeElt *huffNode, const U32 *count, U32 maxSymbolValue)
+{
+ rankPos rank[32];
+ U32 n;
+
+ memset(rank, 0, sizeof(rank));
+ for (n = 0; n <= maxSymbolValue; n++) {
+ U32 r = BIT_highbit32(count[n] + 1);
+ rank[r].base++;
+ }
+ for (n = 30; n > 0; n--)
+ rank[n - 1].base += rank[n].base;
+ for (n = 0; n < 32; n++)
+ rank[n].curr = rank[n].base;
+ for (n = 0; n <= maxSymbolValue; n++) {
+ U32 const c = count[n];
+ U32 const r = BIT_highbit32(c + 1) + 1;
+ U32 pos = rank[r].curr++;
+ while ((pos > rank[r].base) && (c > huffNode[pos - 1].count))
+ huffNode[pos] = huffNode[pos - 1], pos--;
+ huffNode[pos].count = c;
+ huffNode[pos].byte = (BYTE)n;
+ }
+}
+
+/** HUF_buildCTable_wksp() :
+ * Same as HUF_buildCTable(), but using externally allocated scratch buffer.
+ * `workSpace` must be aligned on 4-bytes boundaries, and be at least as large as a table of 1024 unsigned.
+ */
+#define STARTNODE (HUF_SYMBOLVALUE_MAX + 1)
+typedef nodeElt huffNodeTable[2 * HUF_SYMBOLVALUE_MAX + 1 + 1];
+size_t HUF_buildCTable_wksp(HUF_CElt *tree, const U32 *count, U32 maxSymbolValue, U32 maxNbBits, void *workSpace, size_t wkspSize)
+{
+ nodeElt *const huffNode0 = (nodeElt *)workSpace;
+ nodeElt *const huffNode = huffNode0 + 1;
+ U32 n, nonNullRank;
+ int lowS, lowN;
+ U16 nodeNb = STARTNODE;
+ U32 nodeRoot;
+
+ /* safety checks */
+ if (wkspSize < sizeof(huffNodeTable))
+ return ERROR(GENERIC); /* workSpace is not large enough */
+ if (maxNbBits == 0)
+ maxNbBits = HUF_TABLELOG_DEFAULT;
+ if (maxSymbolValue > HUF_SYMBOLVALUE_MAX)
+ return ERROR(GENERIC);
+ memset(huffNode0, 0, sizeof(huffNodeTable));
+
+ /* sort, decreasing order */
+ HUF_sort(huffNode, count, maxSymbolValue);
+
+ /* init for parents */
+ nonNullRank = maxSymbolValue;
+ while (huffNode[nonNullRank].count == 0)
+ nonNullRank--;
+ lowS = nonNullRank;
+ nodeRoot = nodeNb + lowS - 1;
+ lowN = nodeNb;
+ huffNode[nodeNb].count = huffNode[lowS].count + huffNode[lowS - 1].count;
+ huffNode[lowS].parent = huffNode[lowS - 1].parent = nodeNb;
+ nodeNb++;
+ lowS -= 2;
+ for (n = nodeNb; n <= nodeRoot; n++)
+ huffNode[n].count = (U32)(1U << 30);
+ huffNode0[0].count = (U32)(1U << 31); /* fake entry, strong barrier */
+
+ /* create parents */
+ while (nodeNb <= nodeRoot) {
+ U32 n1 = (huffNode[lowS].count < huffNode[lowN].count) ? lowS-- : lowN++;
+ U32 n2 = (huffNode[lowS].count < huffNode[lowN].count) ? lowS-- : lowN++;
+ huffNode[nodeNb].count = huffNode[n1].count + huffNode[n2].count;
+ huffNode[n1].parent = huffNode[n2].parent = nodeNb;
+ nodeNb++;
+ }
+
+ /* distribute weights (unlimited tree height) */
+ huffNode[nodeRoot].nbBits = 0;
+ for (n = nodeRoot - 1; n >= STARTNODE; n--)
+ huffNode[n].nbBits = huffNode[huffNode[n].parent].nbBits + 1;
+ for (n = 0; n <= nonNullRank; n++)
+ huffNode[n].nbBits = huffNode[huffNode[n].parent].nbBits + 1;
+
+ /* enforce maxTableLog */
+ maxNbBits = HUF_setMaxHeight(huffNode, nonNullRank, maxNbBits);
+
+ /* fill result into tree (val, nbBits) */
+ {
+ U16 nbPerRank[HUF_TABLELOG_MAX + 1] = {0};
+ U16 valPerRank[HUF_TABLELOG_MAX + 1] = {0};
+ if (maxNbBits > HUF_TABLELOG_MAX)
+ return ERROR(GENERIC); /* check fit into table */
+ for (n = 0; n <= nonNullRank; n++)
+ nbPerRank[huffNode[n].nbBits]++;
+ /* determine stating value per rank */
+ {
+ U16 min = 0;
+ for (n = maxNbBits; n > 0; n--) {
+ valPerRank[n] = min; /* get starting value within each rank */
+ min += nbPerRank[n];
+ min >>= 1;
+ }
+ }
+ for (n = 0; n <= maxSymbolValue; n++)
+ tree[huffNode[n].byte].nbBits = huffNode[n].nbBits; /* push nbBits per symbol, symbol order */
+ for (n = 0; n <= maxSymbolValue; n++)
+ tree[n].val = valPerRank[tree[n].nbBits]++; /* assign value within rank, symbol order */
+ }
+
+ return maxNbBits;
+}
+
+static size_t HUF_estimateCompressedSize(HUF_CElt *CTable, const unsigned *count, unsigned maxSymbolValue)
+{
+ size_t nbBits = 0;
+ int s;
+ for (s = 0; s <= (int)maxSymbolValue; ++s) {
+ nbBits += CTable[s].nbBits * count[s];
+ }
+ return nbBits >> 3;
+}
+
+static int HUF_validateCTable(const HUF_CElt *CTable, const unsigned *count, unsigned maxSymbolValue)
+{
+ int bad = 0;
+ int s;
+ for (s = 0; s <= (int)maxSymbolValue; ++s) {
+ bad |= (count[s] != 0) & (CTable[s].nbBits == 0);
+ }
+ return !bad;
+}
+
+static void HUF_encodeSymbol(BIT_CStream_t *bitCPtr, U32 symbol, const HUF_CElt *CTable)
+{
+ BIT_addBitsFast(bitCPtr, CTable[symbol].val, CTable[symbol].nbBits);
+}
+
+size_t HUF_compressBound(size_t size) { return HUF_COMPRESSBOUND(size); }
+
+#define HUF_FLUSHBITS(s) BIT_flushBits(s)
+
+#define HUF_FLUSHBITS_1(stream) \
+ if (sizeof((stream)->bitContainer) * 8 < HUF_TABLELOG_MAX * 2 + 7) \
+ HUF_FLUSHBITS(stream)
+
+#define HUF_FLUSHBITS_2(stream) \
+ if (sizeof((stream)->bitContainer) * 8 < HUF_TABLELOG_MAX * 4 + 7) \
+ HUF_FLUSHBITS(stream)
+
+size_t HUF_compress1X_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const HUF_CElt *CTable)
+{
+ const BYTE *ip = (const BYTE *)src;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ BYTE *op = ostart;
+ size_t n;
+ BIT_CStream_t bitC;
+
+ /* init */
+ if (dstSize < 8)
+ return 0; /* not enough space to compress */
+ {
+ size_t const initErr = BIT_initCStream(&bitC, op, oend - op);
+ if (HUF_isError(initErr))
+ return 0;
+ }
+
+ n = srcSize & ~3; /* join to mod 4 */
+ switch (srcSize & 3) {
+ case 3: HUF_encodeSymbol(&bitC, ip[n + 2], CTable); HUF_FLUSHBITS_2(&bitC);
+ case 2: HUF_encodeSymbol(&bitC, ip[n + 1], CTable); HUF_FLUSHBITS_1(&bitC);
+ case 1: HUF_encodeSymbol(&bitC, ip[n + 0], CTable); HUF_FLUSHBITS(&bitC);
+ case 0:
+ default:;
+ }
+
+ for (; n > 0; n -= 4) { /* note : n&3==0 at this stage */
+ HUF_encodeSymbol(&bitC, ip[n - 1], CTable);
+ HUF_FLUSHBITS_1(&bitC);
+ HUF_encodeSymbol(&bitC, ip[n - 2], CTable);
+ HUF_FLUSHBITS_2(&bitC);
+ HUF_encodeSymbol(&bitC, ip[n - 3], CTable);
+ HUF_FLUSHBITS_1(&bitC);
+ HUF_encodeSymbol(&bitC, ip[n - 4], CTable);
+ HUF_FLUSHBITS(&bitC);
+ }
+
+ return BIT_closeCStream(&bitC);
+}
+
+size_t HUF_compress4X_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const HUF_CElt *CTable)
+{
+ size_t const segmentSize = (srcSize + 3) / 4; /* first 3 segments */
+ const BYTE *ip = (const BYTE *)src;
+ const BYTE *const iend = ip + srcSize;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ BYTE *op = ostart;
+
+ if (dstSize < 6 + 1 + 1 + 1 + 8)
+ return 0; /* minimum space to compress successfully */
+ if (srcSize < 12)
+ return 0; /* no saving possible : too small input */
+ op += 6; /* jumpTable */
+
+ {
+ CHECK_V_F(cSize, HUF_compress1X_usingCTable(op, oend - op, ip, segmentSize, CTable));
+ if (cSize == 0)
+ return 0;
+ ZSTD_writeLE16(ostart, (U16)cSize);
+ op += cSize;
+ }
+
+ ip += segmentSize;
+ {
+ CHECK_V_F(cSize, HUF_compress1X_usingCTable(op, oend - op, ip, segmentSize, CTable));
+ if (cSize == 0)
+ return 0;
+ ZSTD_writeLE16(ostart + 2, (U16)cSize);
+ op += cSize;
+ }
+
+ ip += segmentSize;
+ {
+ CHECK_V_F(cSize, HUF_compress1X_usingCTable(op, oend - op, ip, segmentSize, CTable));
+ if (cSize == 0)
+ return 0;
+ ZSTD_writeLE16(ostart + 4, (U16)cSize);
+ op += cSize;
+ }
+
+ ip += segmentSize;
+ {
+ CHECK_V_F(cSize, HUF_compress1X_usingCTable(op, oend - op, ip, iend - ip, CTable));
+ if (cSize == 0)
+ return 0;
+ op += cSize;
+ }
+
+ return op - ostart;
+}
+
+static size_t HUF_compressCTable_internal(BYTE *const ostart, BYTE *op, BYTE *const oend, const void *src, size_t srcSize, unsigned singleStream,
+ const HUF_CElt *CTable)
+{
+ size_t const cSize =
+ singleStream ? HUF_compress1X_usingCTable(op, oend - op, src, srcSize, CTable) : HUF_compress4X_usingCTable(op, oend - op, src, srcSize, CTable);
+ if (HUF_isError(cSize)) {
+ return cSize;
+ }
+ if (cSize == 0) {
+ return 0;
+ } /* uncompressible */
+ op += cSize;
+ /* check compressibility */
+ if ((size_t)(op - ostart) >= srcSize - 1) {
+ return 0;
+ }
+ return op - ostart;
+}
+
+/* `workSpace` must a table of at least 1024 unsigned */
+static size_t HUF_compress_internal(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog,
+ unsigned singleStream, void *workSpace, size_t wkspSize, HUF_CElt *oldHufTable, HUF_repeat *repeat, int preferRepeat)
+{
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ BYTE *op = ostart;
+
+ U32 *count;
+ size_t const countSize = sizeof(U32) * (HUF_SYMBOLVALUE_MAX + 1);
+ HUF_CElt *CTable;
+ size_t const CTableSize = sizeof(HUF_CElt) * (HUF_SYMBOLVALUE_MAX + 1);
+
+ /* checks & inits */
+ if (wkspSize < sizeof(huffNodeTable) + countSize + CTableSize)
+ return ERROR(GENERIC);
+ if (!srcSize)
+ return 0; /* Uncompressed (note : 1 means rle, so first byte must be correct) */
+ if (!dstSize)
+ return 0; /* cannot fit within dst budget */
+ if (srcSize > HUF_BLOCKSIZE_MAX)
+ return ERROR(srcSize_wrong); /* curr block size limit */
+ if (huffLog > HUF_TABLELOG_MAX)
+ return ERROR(tableLog_tooLarge);
+ if (!maxSymbolValue)
+ maxSymbolValue = HUF_SYMBOLVALUE_MAX;
+ if (!huffLog)
+ huffLog = HUF_TABLELOG_DEFAULT;
+
+ count = (U32 *)workSpace;
+ workSpace = (BYTE *)workSpace + countSize;
+ wkspSize -= countSize;
+ CTable = (HUF_CElt *)workSpace;
+ workSpace = (BYTE *)workSpace + CTableSize;
+ wkspSize -= CTableSize;
+
+ /* Heuristic : If we don't need to check the validity of the old table use the old table for small inputs */
+ if (preferRepeat && repeat && *repeat == HUF_repeat_valid) {
+ return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, singleStream, oldHufTable);
+ }
+
+ /* Scan input and build symbol stats */
+ {
+ CHECK_V_F(largest, FSE_count_wksp(count, &maxSymbolValue, (const BYTE *)src, srcSize, (U32 *)workSpace));
+ if (largest == srcSize) {
+ *ostart = ((const BYTE *)src)[0];
+ return 1;
+ } /* single symbol, rle */
+ if (largest <= (srcSize >> 7) + 1)
+ return 0; /* Fast heuristic : not compressible enough */
+ }
+
+ /* Check validity of previous table */
+ if (repeat && *repeat == HUF_repeat_check && !HUF_validateCTable(oldHufTable, count, maxSymbolValue)) {
+ *repeat = HUF_repeat_none;
+ }
+ /* Heuristic : use existing table for small inputs */
+ if (preferRepeat && repeat && *repeat != HUF_repeat_none) {
+ return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, singleStream, oldHufTable);
+ }
+
+ /* Build Huffman Tree */
+ huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue);
+ {
+ CHECK_V_F(maxBits, HUF_buildCTable_wksp(CTable, count, maxSymbolValue, huffLog, workSpace, wkspSize));
+ huffLog = (U32)maxBits;
+ /* Zero the unused symbols so we can check it for validity */
+ memset(CTable + maxSymbolValue + 1, 0, CTableSize - (maxSymbolValue + 1) * sizeof(HUF_CElt));
+ }
+
+ /* Write table description header */
+ {
+ CHECK_V_F(hSize, HUF_writeCTable_wksp(op, dstSize, CTable, maxSymbolValue, huffLog, workSpace, wkspSize));
+ /* Check if using the previous table will be beneficial */
+ if (repeat && *repeat != HUF_repeat_none) {
+ size_t const oldSize = HUF_estimateCompressedSize(oldHufTable, count, maxSymbolValue);
+ size_t const newSize = HUF_estimateCompressedSize(CTable, count, maxSymbolValue);
+ if (oldSize <= hSize + newSize || hSize + 12 >= srcSize) {
+ return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, singleStream, oldHufTable);
+ }
+ }
+ /* Use the new table */
+ if (hSize + 12ul >= srcSize) {
+ return 0;
+ }
+ op += hSize;
+ if (repeat) {
+ *repeat = HUF_repeat_none;
+ }
+ if (oldHufTable) {
+ memcpy(oldHufTable, CTable, CTableSize);
+ } /* Save the new table */
+ }
+ return HUF_compressCTable_internal(ostart, op, oend, src, srcSize, singleStream, CTable);
+}
+
+size_t HUF_compress1X_wksp(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void *workSpace,
+ size_t wkspSize)
+{
+ return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, 1 /* single stream */, workSpace, wkspSize, NULL, NULL, 0);
+}
+
+size_t HUF_compress1X_repeat(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void *workSpace,
+ size_t wkspSize, HUF_CElt *hufTable, HUF_repeat *repeat, int preferRepeat)
+{
+ return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, 1 /* single stream */, workSpace, wkspSize, hufTable, repeat,
+ preferRepeat);
+}
+
+size_t HUF_compress4X_wksp(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void *workSpace,
+ size_t wkspSize)
+{
+ return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, 0 /* 4 streams */, workSpace, wkspSize, NULL, NULL, 0);
+}
+
+size_t HUF_compress4X_repeat(void *dst, size_t dstSize, const void *src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void *workSpace,
+ size_t wkspSize, HUF_CElt *hufTable, HUF_repeat *repeat, int preferRepeat)
+{
+ return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, 0 /* 4 streams */, workSpace, wkspSize, hufTable, repeat,
+ preferRepeat);
+}
diff --git a/lib/zstd/huf_decompress.c b/lib/zstd/huf_decompress.c
new file mode 100644
index 000000000000..6526482047dc
--- /dev/null
+++ b/lib/zstd/huf_decompress.c
@@ -0,0 +1,960 @@
+/*
+ * Huffman decoder, part of New Generation Entropy library
+ * Copyright (C) 2013-2016, Yann Collet.
+ *
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ *
+ * You can contact the author at :
+ * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ */
+
+/* **************************************************************
+* Compiler specifics
+****************************************************************/
+#define FORCE_INLINE static __always_inline
+
+/* **************************************************************
+* Dependencies
+****************************************************************/
+#include "bitstream.h" /* BIT_* */
+#include "fse.h" /* header compression */
+#include "huf.h"
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/string.h> /* memcpy, memset */
+
+/* **************************************************************
+* Error Management
+****************************************************************/
+#define HUF_STATIC_ASSERT(c) \
+ { \
+ enum { HUF_static_assert = 1 / (int)(!!(c)) }; \
+ } /* use only *after* variable declarations */
+
+/*-***************************/
+/* generic DTableDesc */
+/*-***************************/
+
+typedef struct {
+ BYTE maxTableLog;
+ BYTE tableType;
+ BYTE tableLog;
+ BYTE reserved;
+} DTableDesc;
+
+static DTableDesc HUF_getDTableDesc(const HUF_DTable *table)
+{
+ DTableDesc dtd;
+ memcpy(&dtd, table, sizeof(dtd));
+ return dtd;
+}
+
+/*-***************************/
+/* single-symbol decoding */
+/*-***************************/
+
+typedef struct {
+ BYTE byte;
+ BYTE nbBits;
+} HUF_DEltX2; /* single-symbol decoding */
+
+size_t HUF_readDTableX2_wksp(HUF_DTable *DTable, const void *src, size_t srcSize, void *workspace, size_t workspaceSize)
+{
+ U32 tableLog = 0;
+ U32 nbSymbols = 0;
+ size_t iSize;
+ void *const dtPtr = DTable + 1;
+ HUF_DEltX2 *const dt = (HUF_DEltX2 *)dtPtr;
+
+ U32 *rankVal;
+ BYTE *huffWeight;
+ size_t spaceUsed32 = 0;
+
+ rankVal = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += HUF_TABLELOG_ABSOLUTEMAX + 1;
+ huffWeight = (BYTE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(HUF_SYMBOLVALUE_MAX + 1, sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ HUF_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable));
+ /* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
+
+ iSize = HUF_readStats_wksp(huffWeight, HUF_SYMBOLVALUE_MAX + 1, rankVal, &nbSymbols, &tableLog, src, srcSize, workspace, workspaceSize);
+ if (HUF_isError(iSize))
+ return iSize;
+
+ /* Table header */
+ {
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ if (tableLog > (U32)(dtd.maxTableLog + 1))
+ return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */
+ dtd.tableType = 0;
+ dtd.tableLog = (BYTE)tableLog;
+ memcpy(DTable, &dtd, sizeof(dtd));
+ }
+
+ /* Calculate starting value for each rank */
+ {
+ U32 n, nextRankStart = 0;
+ for (n = 1; n < tableLog + 1; n++) {
+ U32 const curr = nextRankStart;
+ nextRankStart += (rankVal[n] << (n - 1));
+ rankVal[n] = curr;
+ }
+ }
+
+ /* fill DTable */
+ {
+ U32 n;
+ for (n = 0; n < nbSymbols; n++) {
+ U32 const w = huffWeight[n];
+ U32 const length = (1 << w) >> 1;
+ U32 u;
+ HUF_DEltX2 D;
+ D.byte = (BYTE)n;
+ D.nbBits = (BYTE)(tableLog + 1 - w);
+ for (u = rankVal[w]; u < rankVal[w] + length; u++)
+ dt[u] = D;
+ rankVal[w] += length;
+ }
+ }
+
+ return iSize;
+}
+
+static BYTE HUF_decodeSymbolX2(BIT_DStream_t *Dstream, const HUF_DEltX2 *dt, const U32 dtLog)
+{
+ size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
+ BYTE const c = dt[val].byte;
+ BIT_skipBits(Dstream, dt[val].nbBits);
+ return c;
+}
+
+#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) *ptr++ = HUF_decodeSymbolX2(DStreamPtr, dt, dtLog)
+
+#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
+ if (ZSTD_64bits() || (HUF_TABLELOG_MAX <= 12)) \
+ HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
+
+#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
+ if (ZSTD_64bits()) \
+ HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
+
+FORCE_INLINE size_t HUF_decodeStreamX2(BYTE *p, BIT_DStream_t *const bitDPtr, BYTE *const pEnd, const HUF_DEltX2 *const dt, const U32 dtLog)
+{
+ BYTE *const pStart = p;
+
+ /* up to 4 symbols at a time */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd - 4)) {
+ HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+ }
+
+ /* closer to the end */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd))
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+
+ /* no more data to retrieve from bitstream, hence no need to reload */
+ while (p < pEnd)
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+
+ return pEnd - pStart;
+}
+
+static size_t HUF_decompress1X2_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ BYTE *op = (BYTE *)dst;
+ BYTE *const oend = op + dstSize;
+ const void *dtPtr = DTable + 1;
+ const HUF_DEltX2 *const dt = (const HUF_DEltX2 *)dtPtr;
+ BIT_DStream_t bitD;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ U32 const dtLog = dtd.tableLog;
+
+ {
+ size_t const errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+
+ HUF_decodeStreamX2(op, &bitD, oend, dt, dtLog);
+
+ /* check */
+ if (!BIT_endOfDStream(&bitD))
+ return ERROR(corruption_detected);
+
+ return dstSize;
+}
+
+size_t HUF_decompress1X2_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ if (dtd.tableType != 0)
+ return ERROR(GENERIC);
+ return HUF_decompress1X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
+}
+
+size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable *DCtx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ const BYTE *ip = (const BYTE *)cSrc;
+
+ size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, workspace, workspaceSize);
+ if (HUF_isError(hSize))
+ return hSize;
+ if (hSize >= cSrcSize)
+ return ERROR(srcSize_wrong);
+ ip += hSize;
+ cSrcSize -= hSize;
+
+ return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx);
+}
+
+static size_t HUF_decompress4X2_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ /* Check */
+ if (cSrcSize < 10)
+ return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
+
+ {
+ const BYTE *const istart = (const BYTE *)cSrc;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ const void *const dtPtr = DTable + 1;
+ const HUF_DEltX2 *const dt = (const HUF_DEltX2 *)dtPtr;
+
+ /* Init */
+ BIT_DStream_t bitD1;
+ BIT_DStream_t bitD2;
+ BIT_DStream_t bitD3;
+ BIT_DStream_t bitD4;
+ size_t const length1 = ZSTD_readLE16(istart);
+ size_t const length2 = ZSTD_readLE16(istart + 2);
+ size_t const length3 = ZSTD_readLE16(istart + 4);
+ size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6);
+ const BYTE *const istart1 = istart + 6; /* jumpTable */
+ const BYTE *const istart2 = istart1 + length1;
+ const BYTE *const istart3 = istart2 + length2;
+ const BYTE *const istart4 = istart3 + length3;
+ const size_t segmentSize = (dstSize + 3) / 4;
+ BYTE *const opStart2 = ostart + segmentSize;
+ BYTE *const opStart3 = opStart2 + segmentSize;
+ BYTE *const opStart4 = opStart3 + segmentSize;
+ BYTE *op1 = ostart;
+ BYTE *op2 = opStart2;
+ BYTE *op3 = opStart3;
+ BYTE *op4 = opStart4;
+ U32 endSignal;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ U32 const dtLog = dtd.tableLog;
+
+ if (length4 > cSrcSize)
+ return ERROR(corruption_detected); /* overflow */
+ {
+ size_t const errorCode = BIT_initDStream(&bitD1, istart1, length1);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD2, istart2, length2);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD3, istart3, length3);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD4, istart4, length4);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+
+ /* 16-32 symbols per loop (4-8 symbols per stream) */
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ for (; (endSignal == BIT_DStream_unfinished) && (op4 < (oend - 7));) {
+ HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ }
+
+ /* check corruption */
+ if (op1 > opStart2)
+ return ERROR(corruption_detected);
+ if (op2 > opStart3)
+ return ERROR(corruption_detected);
+ if (op3 > opStart4)
+ return ERROR(corruption_detected);
+ /* note : op4 supposed already verified within main loop */
+
+ /* finish bitStreams one by one */
+ HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
+ HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
+ HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
+ HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
+
+ /* check */
+ endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
+ if (!endSignal)
+ return ERROR(corruption_detected);
+
+ /* decoded size */
+ return dstSize;
+ }
+}
+
+size_t HUF_decompress4X2_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ if (dtd.tableType != 0)
+ return ERROR(GENERIC);
+ return HUF_decompress4X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
+}
+
+size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ const BYTE *ip = (const BYTE *)cSrc;
+
+ size_t const hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, workspace, workspaceSize);
+ if (HUF_isError(hSize))
+ return hSize;
+ if (hSize >= cSrcSize)
+ return ERROR(srcSize_wrong);
+ ip += hSize;
+ cSrcSize -= hSize;
+
+ return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx);
+}
+
+/* *************************/
+/* double-symbols decoding */
+/* *************************/
+typedef struct {
+ U16 sequence;
+ BYTE nbBits;
+ BYTE length;
+} HUF_DEltX4; /* double-symbols decoding */
+
+typedef struct {
+ BYTE symbol;
+ BYTE weight;
+} sortedSymbol_t;
+
+/* HUF_fillDTableX4Level2() :
+ * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */
+static void HUF_fillDTableX4Level2(HUF_DEltX4 *DTable, U32 sizeLog, const U32 consumed, const U32 *rankValOrigin, const int minWeight,
+ const sortedSymbol_t *sortedSymbols, const U32 sortedListSize, U32 nbBitsBaseline, U16 baseSeq)
+{
+ HUF_DEltX4 DElt;
+ U32 rankVal[HUF_TABLELOG_MAX + 1];
+
+ /* get pre-calculated rankVal */
+ memcpy(rankVal, rankValOrigin, sizeof(rankVal));
+
+ /* fill skipped values */
+ if (minWeight > 1) {
+ U32 i, skipSize = rankVal[minWeight];
+ ZSTD_writeLE16(&(DElt.sequence), baseSeq);
+ DElt.nbBits = (BYTE)(consumed);
+ DElt.length = 1;
+ for (i = 0; i < skipSize; i++)
+ DTable[i] = DElt;
+ }
+
+ /* fill DTable */
+ {
+ U32 s;
+ for (s = 0; s < sortedListSize; s++) { /* note : sortedSymbols already skipped */
+ const U32 symbol = sortedSymbols[s].symbol;
+ const U32 weight = sortedSymbols[s].weight;
+ const U32 nbBits = nbBitsBaseline - weight;
+ const U32 length = 1 << (sizeLog - nbBits);
+ const U32 start = rankVal[weight];
+ U32 i = start;
+ const U32 end = start + length;
+
+ ZSTD_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
+ DElt.nbBits = (BYTE)(nbBits + consumed);
+ DElt.length = 2;
+ do {
+ DTable[i++] = DElt;
+ } while (i < end); /* since length >= 1 */
+
+ rankVal[weight] += length;
+ }
+ }
+}
+
+typedef U32 rankVal_t[HUF_TABLELOG_MAX][HUF_TABLELOG_MAX + 1];
+typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1];
+
+static void HUF_fillDTableX4(HUF_DEltX4 *DTable, const U32 targetLog, const sortedSymbol_t *sortedList, const U32 sortedListSize, const U32 *rankStart,
+ rankVal_t rankValOrigin, const U32 maxWeight, const U32 nbBitsBaseline)
+{
+ U32 rankVal[HUF_TABLELOG_MAX + 1];
+ const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */
+ const U32 minBits = nbBitsBaseline - maxWeight;
+ U32 s;
+
+ memcpy(rankVal, rankValOrigin, sizeof(rankVal));
+
+ /* fill DTable */
+ for (s = 0; s < sortedListSize; s++) {
+ const U16 symbol = sortedList[s].symbol;
+ const U32 weight = sortedList[s].weight;
+ const U32 nbBits = nbBitsBaseline - weight;
+ const U32 start = rankVal[weight];
+ const U32 length = 1 << (targetLog - nbBits);
+
+ if (targetLog - nbBits >= minBits) { /* enough room for a second symbol */
+ U32 sortedRank;
+ int minWeight = nbBits + scaleLog;
+ if (minWeight < 1)
+ minWeight = 1;
+ sortedRank = rankStart[minWeight];
+ HUF_fillDTableX4Level2(DTable + start, targetLog - nbBits, nbBits, rankValOrigin[nbBits], minWeight, sortedList + sortedRank,
+ sortedListSize - sortedRank, nbBitsBaseline, symbol);
+ } else {
+ HUF_DEltX4 DElt;
+ ZSTD_writeLE16(&(DElt.sequence), symbol);
+ DElt.nbBits = (BYTE)(nbBits);
+ DElt.length = 1;
+ {
+ U32 const end = start + length;
+ U32 u;
+ for (u = start; u < end; u++)
+ DTable[u] = DElt;
+ }
+ }
+ rankVal[weight] += length;
+ }
+}
+
+size_t HUF_readDTableX4_wksp(HUF_DTable *DTable, const void *src, size_t srcSize, void *workspace, size_t workspaceSize)
+{
+ U32 tableLog, maxW, sizeOfSort, nbSymbols;
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ U32 const maxTableLog = dtd.maxTableLog;
+ size_t iSize;
+ void *dtPtr = DTable + 1; /* force compiler to avoid strict-aliasing */
+ HUF_DEltX4 *const dt = (HUF_DEltX4 *)dtPtr;
+ U32 *rankStart;
+
+ rankValCol_t *rankVal;
+ U32 *rankStats;
+ U32 *rankStart0;
+ sortedSymbol_t *sortedSymbol;
+ BYTE *weightList;
+ size_t spaceUsed32 = 0;
+
+ HUF_STATIC_ASSERT((sizeof(rankValCol_t) & 3) == 0);
+
+ rankVal = (rankValCol_t *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += (sizeof(rankValCol_t) * HUF_TABLELOG_MAX) >> 2;
+ rankStats = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += HUF_TABLELOG_MAX + 1;
+ rankStart0 = (U32 *)workspace + spaceUsed32;
+ spaceUsed32 += HUF_TABLELOG_MAX + 2;
+ sortedSymbol = (sortedSymbol_t *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(sizeof(sortedSymbol_t) * (HUF_SYMBOLVALUE_MAX + 1), sizeof(U32)) >> 2;
+ weightList = (BYTE *)((U32 *)workspace + spaceUsed32);
+ spaceUsed32 += ALIGN(HUF_SYMBOLVALUE_MAX + 1, sizeof(U32)) >> 2;
+
+ if ((spaceUsed32 << 2) > workspaceSize)
+ return ERROR(tableLog_tooLarge);
+ workspace = (U32 *)workspace + spaceUsed32;
+ workspaceSize -= (spaceUsed32 << 2);
+
+ rankStart = rankStart0 + 1;
+ memset(rankStats, 0, sizeof(U32) * (2 * HUF_TABLELOG_MAX + 2 + 1));
+
+ HUF_STATIC_ASSERT(sizeof(HUF_DEltX4) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */
+ if (maxTableLog > HUF_TABLELOG_MAX)
+ return ERROR(tableLog_tooLarge);
+ /* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
+
+ iSize = HUF_readStats_wksp(weightList, HUF_SYMBOLVALUE_MAX + 1, rankStats, &nbSymbols, &tableLog, src, srcSize, workspace, workspaceSize);
+ if (HUF_isError(iSize))
+ return iSize;
+
+ /* check result */
+ if (tableLog > maxTableLog)
+ return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */
+
+ /* find maxWeight */
+ for (maxW = tableLog; rankStats[maxW] == 0; maxW--) {
+ } /* necessarily finds a solution before 0 */
+
+ /* Get start index of each weight */
+ {
+ U32 w, nextRankStart = 0;
+ for (w = 1; w < maxW + 1; w++) {
+ U32 curr = nextRankStart;
+ nextRankStart += rankStats[w];
+ rankStart[w] = curr;
+ }
+ rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
+ sizeOfSort = nextRankStart;
+ }
+
+ /* sort symbols by weight */
+ {
+ U32 s;
+ for (s = 0; s < nbSymbols; s++) {
+ U32 const w = weightList[s];
+ U32 const r = rankStart[w]++;
+ sortedSymbol[r].symbol = (BYTE)s;
+ sortedSymbol[r].weight = (BYTE)w;
+ }
+ rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
+ }
+
+ /* Build rankVal */
+ {
+ U32 *const rankVal0 = rankVal[0];
+ {
+ int const rescale = (maxTableLog - tableLog) - 1; /* tableLog <= maxTableLog */
+ U32 nextRankVal = 0;
+ U32 w;
+ for (w = 1; w < maxW + 1; w++) {
+ U32 curr = nextRankVal;
+ nextRankVal += rankStats[w] << (w + rescale);
+ rankVal0[w] = curr;
+ }
+ }
+ {
+ U32 const minBits = tableLog + 1 - maxW;
+ U32 consumed;
+ for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) {
+ U32 *const rankValPtr = rankVal[consumed];
+ U32 w;
+ for (w = 1; w < maxW + 1; w++) {
+ rankValPtr[w] = rankVal0[w] >> consumed;
+ }
+ }
+ }
+ }
+
+ HUF_fillDTableX4(dt, maxTableLog, sortedSymbol, sizeOfSort, rankStart0, rankVal, maxW, tableLog + 1);
+
+ dtd.tableLog = (BYTE)maxTableLog;
+ dtd.tableType = 1;
+ memcpy(DTable, &dtd, sizeof(dtd));
+ return iSize;
+}
+
+static U32 HUF_decodeSymbolX4(void *op, BIT_DStream_t *DStream, const HUF_DEltX4 *dt, const U32 dtLog)
+{
+ size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
+ memcpy(op, dt + val, 2);
+ BIT_skipBits(DStream, dt[val].nbBits);
+ return dt[val].length;
+}
+
+static U32 HUF_decodeLastSymbolX4(void *op, BIT_DStream_t *DStream, const HUF_DEltX4 *dt, const U32 dtLog)
+{
+ size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
+ memcpy(op, dt + val, 1);
+ if (dt[val].length == 1)
+ BIT_skipBits(DStream, dt[val].nbBits);
+ else {
+ if (DStream->bitsConsumed < (sizeof(DStream->bitContainer) * 8)) {
+ BIT_skipBits(DStream, dt[val].nbBits);
+ if (DStream->bitsConsumed > (sizeof(DStream->bitContainer) * 8))
+ /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
+ DStream->bitsConsumed = (sizeof(DStream->bitContainer) * 8);
+ }
+ }
+ return 1;
+}
+
+#define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
+
+#define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
+ if (ZSTD_64bits() || (HUF_TABLELOG_MAX <= 12)) \
+ ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
+
+#define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
+ if (ZSTD_64bits()) \
+ ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
+
+FORCE_INLINE size_t HUF_decodeStreamX4(BYTE *p, BIT_DStream_t *bitDPtr, BYTE *const pEnd, const HUF_DEltX4 *const dt, const U32 dtLog)
+{
+ BYTE *const pStart = p;
+
+ /* up to 8 symbols at a time */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd - (sizeof(bitDPtr->bitContainer) - 1))) {
+ HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
+ HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
+ }
+
+ /* closer to end : up to 2 symbols at a time */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd - 2))
+ HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
+
+ while (p <= pEnd - 2)
+ HUF_DECODE_SYMBOLX4_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
+
+ if (p < pEnd)
+ p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
+
+ return p - pStart;
+}
+
+static size_t HUF_decompress1X4_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ BIT_DStream_t bitD;
+
+ /* Init */
+ {
+ size_t const errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+
+ /* decode */
+ {
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ const void *const dtPtr = DTable + 1; /* force compiler to not use strict-aliasing */
+ const HUF_DEltX4 *const dt = (const HUF_DEltX4 *)dtPtr;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ HUF_decodeStreamX4(ostart, &bitD, oend, dt, dtd.tableLog);
+ }
+
+ /* check */
+ if (!BIT_endOfDStream(&bitD))
+ return ERROR(corruption_detected);
+
+ /* decoded size */
+ return dstSize;
+}
+
+size_t HUF_decompress1X4_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ if (dtd.tableType != 1)
+ return ERROR(GENERIC);
+ return HUF_decompress1X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
+}
+
+size_t HUF_decompress1X4_DCtx_wksp(HUF_DTable *DCtx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ const BYTE *ip = (const BYTE *)cSrc;
+
+ size_t const hSize = HUF_readDTableX4_wksp(DCtx, cSrc, cSrcSize, workspace, workspaceSize);
+ if (HUF_isError(hSize))
+ return hSize;
+ if (hSize >= cSrcSize)
+ return ERROR(srcSize_wrong);
+ ip += hSize;
+ cSrcSize -= hSize;
+
+ return HUF_decompress1X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx);
+}
+
+static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ if (cSrcSize < 10)
+ return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
+
+ {
+ const BYTE *const istart = (const BYTE *)cSrc;
+ BYTE *const ostart = (BYTE *)dst;
+ BYTE *const oend = ostart + dstSize;
+ const void *const dtPtr = DTable + 1;
+ const HUF_DEltX4 *const dt = (const HUF_DEltX4 *)dtPtr;
+
+ /* Init */
+ BIT_DStream_t bitD1;
+ BIT_DStream_t bitD2;
+ BIT_DStream_t bitD3;
+ BIT_DStream_t bitD4;
+ size_t const length1 = ZSTD_readLE16(istart);
+ size_t const length2 = ZSTD_readLE16(istart + 2);
+ size_t const length3 = ZSTD_readLE16(istart + 4);
+ size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6);
+ const BYTE *const istart1 = istart + 6; /* jumpTable */
+ const BYTE *const istart2 = istart1 + length1;
+ const BYTE *const istart3 = istart2 + length2;
+ const BYTE *const istart4 = istart3 + length3;
+ size_t const segmentSize = (dstSize + 3) / 4;
+ BYTE *const opStart2 = ostart + segmentSize;
+ BYTE *const opStart3 = opStart2 + segmentSize;
+ BYTE *const opStart4 = opStart3 + segmentSize;
+ BYTE *op1 = ostart;
+ BYTE *op2 = opStart2;
+ BYTE *op3 = opStart3;
+ BYTE *op4 = opStart4;
+ U32 endSignal;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ U32 const dtLog = dtd.tableLog;
+
+ if (length4 > cSrcSize)
+ return ERROR(corruption_detected); /* overflow */
+ {
+ size_t const errorCode = BIT_initDStream(&bitD1, istart1, length1);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD2, istart2, length2);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD3, istart3, length3);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+ {
+ size_t const errorCode = BIT_initDStream(&bitD4, istart4, length4);
+ if (HUF_isError(errorCode))
+ return errorCode;
+ }
+
+ /* 16-32 symbols per loop (4-8 symbols per stream) */
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ for (; (endSignal == BIT_DStream_unfinished) & (op4 < (oend - (sizeof(bitD4.bitContainer) - 1)));) {
+ HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
+ HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
+ HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
+ HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
+ HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
+ HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
+ HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
+ HUF_DECODE_SYMBOLX4_0(op4, &bitD4);
+
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ }
+
+ /* check corruption */
+ if (op1 > opStart2)
+ return ERROR(corruption_detected);
+ if (op2 > opStart3)
+ return ERROR(corruption_detected);
+ if (op3 > opStart4)
+ return ERROR(corruption_detected);
+ /* note : op4 already verified within main loop */
+
+ /* finish bitStreams one by one */
+ HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
+ HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
+ HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
+ HUF_decodeStreamX4(op4, &bitD4, oend, dt, dtLog);
+
+ /* check */
+ {
+ U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
+ if (!endCheck)
+ return ERROR(corruption_detected);
+ }
+
+ /* decoded size */
+ return dstSize;
+ }
+}
+
+size_t HUF_decompress4X4_usingDTable(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc dtd = HUF_getDTableDesc(DTable);
+ if (dtd.tableType != 1)
+ return ERROR(GENERIC);
+ return HUF_decompress4X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable);
+}
+
+size_t HUF_decompress4X4_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ const BYTE *ip = (const BYTE *)cSrc;
+
+ size_t hSize = HUF_readDTableX4_wksp(dctx, cSrc, cSrcSize, workspace, workspaceSize);
+ if (HUF_isError(hSize))
+ return hSize;
+ if (hSize >= cSrcSize)
+ return ERROR(srcSize_wrong);
+ ip += hSize;
+ cSrcSize -= hSize;
+
+ return HUF_decompress4X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx);
+}
+
+/* ********************************/
+/* Generic decompression selector */
+/* ********************************/
+
+size_t HUF_decompress1X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ return dtd.tableType ? HUF_decompress1X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable)
+ : HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable);
+}
+
+size_t HUF_decompress4X_usingDTable(void *dst, size_t maxDstSize, const void *cSrc, size_t cSrcSize, const HUF_DTable *DTable)
+{
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ return dtd.tableType ? HUF_decompress4X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable)
+ : HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable);
+}
+
+typedef struct {
+ U32 tableTime;
+ U32 decode256Time;
+} algo_time_t;
+static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] = {
+ /* single, double, quad */
+ {{0, 0}, {1, 1}, {2, 2}}, /* Q==0 : impossible */
+ {{0, 0}, {1, 1}, {2, 2}}, /* Q==1 : impossible */
+ {{38, 130}, {1313, 74}, {2151, 38}}, /* Q == 2 : 12-18% */
+ {{448, 128}, {1353, 74}, {2238, 41}}, /* Q == 3 : 18-25% */
+ {{556, 128}, {1353, 74}, {2238, 47}}, /* Q == 4 : 25-32% */
+ {{714, 128}, {1418, 74}, {2436, 53}}, /* Q == 5 : 32-38% */
+ {{883, 128}, {1437, 74}, {2464, 61}}, /* Q == 6 : 38-44% */
+ {{897, 128}, {1515, 75}, {2622, 68}}, /* Q == 7 : 44-50% */
+ {{926, 128}, {1613, 75}, {2730, 75}}, /* Q == 8 : 50-56% */
+ {{947, 128}, {1729, 77}, {3359, 77}}, /* Q == 9 : 56-62% */
+ {{1107, 128}, {2083, 81}, {4006, 84}}, /* Q ==10 : 62-69% */
+ {{1177, 128}, {2379, 87}, {4785, 88}}, /* Q ==11 : 69-75% */
+ {{1242, 128}, {2415, 93}, {5155, 84}}, /* Q ==12 : 75-81% */
+ {{1349, 128}, {2644, 106}, {5260, 106}}, /* Q ==13 : 81-87% */
+ {{1455, 128}, {2422, 124}, {4174, 124}}, /* Q ==14 : 87-93% */
+ {{722, 128}, {1891, 145}, {1936, 146}}, /* Q ==15 : 93-99% */
+};
+
+/** HUF_selectDecoder() :
+* Tells which decoder is likely to decode faster,
+* based on a set of pre-determined metrics.
+* @return : 0==HUF_decompress4X2, 1==HUF_decompress4X4 .
+* Assumption : 0 < cSrcSize < dstSize <= 128 KB */
+U32 HUF_selectDecoder(size_t dstSize, size_t cSrcSize)
+{
+ /* decoder timing evaluation */
+ U32 const Q = (U32)(cSrcSize * 16 / dstSize); /* Q < 16 since dstSize > cSrcSize */
+ U32 const D256 = (U32)(dstSize >> 8);
+ U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256);
+ U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256);
+ DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, for cache eviction */
+
+ return DTime1 < DTime0;
+}
+
+typedef size_t (*decompressionAlgo)(void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize);
+
+size_t HUF_decompress4X_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ /* validation checks */
+ if (dstSize == 0)
+ return ERROR(dstSize_tooSmall);
+ if (cSrcSize > dstSize)
+ return ERROR(corruption_detected); /* invalid */
+ if (cSrcSize == dstSize) {
+ memcpy(dst, cSrc, dstSize);
+ return dstSize;
+ } /* not compressed */
+ if (cSrcSize == 1) {
+ memset(dst, *(const BYTE *)cSrc, dstSize);
+ return dstSize;
+ } /* RLE */
+
+ {
+ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
+ return algoNb ? HUF_decompress4X4_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize)
+ : HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize);
+ }
+}
+
+size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ /* validation checks */
+ if (dstSize == 0)
+ return ERROR(dstSize_tooSmall);
+ if ((cSrcSize >= dstSize) || (cSrcSize <= 1))
+ return ERROR(corruption_detected); /* invalid */
+
+ {
+ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
+ return algoNb ? HUF_decompress4X4_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize)
+ : HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize);
+ }
+}
+
+size_t HUF_decompress1X_DCtx_wksp(HUF_DTable *dctx, void *dst, size_t dstSize, const void *cSrc, size_t cSrcSize, void *workspace, size_t workspaceSize)
+{
+ /* validation checks */
+ if (dstSize == 0)
+ return ERROR(dstSize_tooSmall);
+ if (cSrcSize > dstSize)
+ return ERROR(corruption_detected); /* invalid */
+ if (cSrcSize == dstSize) {
+ memcpy(dst, cSrc, dstSize);
+ return dstSize;
+ } /* not compressed */
+ if (cSrcSize == 1) {
+ memset(dst, *(const BYTE *)cSrc, dstSize);
+ return dstSize;
+ } /* RLE */
+
+ {
+ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
+ return algoNb ? HUF_decompress1X4_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize)
+ : HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workspace, workspaceSize);
+ }
+}
diff --git a/lib/zstd/mem.h b/lib/zstd/mem.h
new file mode 100644
index 000000000000..3a0f34c8706c
--- /dev/null
+++ b/lib/zstd/mem.h
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+#ifndef MEM_H_MODULE
+#define MEM_H_MODULE
+
+/*-****************************************
+* Dependencies
+******************************************/
+#include <asm/unaligned.h>
+#include <linux/string.h> /* memcpy */
+#include <linux/types.h> /* size_t, ptrdiff_t */
+
+/*-****************************************
+* Compiler specifics
+******************************************/
+#define ZSTD_STATIC static __inline __attribute__((unused))
+
+/*-**************************************************************
+* Basic Types
+*****************************************************************/
+typedef uint8_t BYTE;
+typedef uint16_t U16;
+typedef int16_t S16;
+typedef uint32_t U32;
+typedef int32_t S32;
+typedef uint64_t U64;
+typedef int64_t S64;
+typedef ptrdiff_t iPtrDiff;
+typedef uintptr_t uPtrDiff;
+
+/*-**************************************************************
+* Memory I/O
+*****************************************************************/
+ZSTD_STATIC unsigned ZSTD_32bits(void) { return sizeof(size_t) == 4; }
+ZSTD_STATIC unsigned ZSTD_64bits(void) { return sizeof(size_t) == 8; }
+
+#if defined(__LITTLE_ENDIAN)
+#define ZSTD_LITTLE_ENDIAN 1
+#else
+#define ZSTD_LITTLE_ENDIAN 0
+#endif
+
+ZSTD_STATIC unsigned ZSTD_isLittleEndian(void) { return ZSTD_LITTLE_ENDIAN; }
+
+ZSTD_STATIC U16 ZSTD_read16(const void *memPtr) { return get_unaligned((const U16 *)memPtr); }
+
+ZSTD_STATIC U32 ZSTD_read32(const void *memPtr) { return get_unaligned((const U32 *)memPtr); }
+
+ZSTD_STATIC U64 ZSTD_read64(const void *memPtr) { return get_unaligned((const U64 *)memPtr); }
+
+ZSTD_STATIC size_t ZSTD_readST(const void *memPtr) { return get_unaligned((const size_t *)memPtr); }
+
+ZSTD_STATIC void ZSTD_write16(void *memPtr, U16 value) { put_unaligned(value, (U16 *)memPtr); }
+
+ZSTD_STATIC void ZSTD_write32(void *memPtr, U32 value) { put_unaligned(value, (U32 *)memPtr); }
+
+ZSTD_STATIC void ZSTD_write64(void *memPtr, U64 value) { put_unaligned(value, (U64 *)memPtr); }
+
+/*=== Little endian r/w ===*/
+
+ZSTD_STATIC U16 ZSTD_readLE16(const void *memPtr) { return get_unaligned_le16(memPtr); }
+
+ZSTD_STATIC void ZSTD_writeLE16(void *memPtr, U16 val) { put_unaligned_le16(val, memPtr); }
+
+ZSTD_STATIC U32 ZSTD_readLE24(const void *memPtr) { return ZSTD_readLE16(memPtr) + (((const BYTE *)memPtr)[2] << 16); }
+
+ZSTD_STATIC void ZSTD_writeLE24(void *memPtr, U32 val)
+{
+ ZSTD_writeLE16(memPtr, (U16)val);
+ ((BYTE *)memPtr)[2] = (BYTE)(val >> 16);
+}
+
+ZSTD_STATIC U32 ZSTD_readLE32(const void *memPtr) { return get_unaligned_le32(memPtr); }
+
+ZSTD_STATIC void ZSTD_writeLE32(void *memPtr, U32 val32) { put_unaligned_le32(val32, memPtr); }
+
+ZSTD_STATIC U64 ZSTD_readLE64(const void *memPtr) { return get_unaligned_le64(memPtr); }
+
+ZSTD_STATIC void ZSTD_writeLE64(void *memPtr, U64 val64) { put_unaligned_le64(val64, memPtr); }
+
+ZSTD_STATIC size_t ZSTD_readLEST(const void *memPtr)
+{
+ if (ZSTD_32bits())
+ return (size_t)ZSTD_readLE32(memPtr);
+ else
+ return (size_t)ZSTD_readLE64(memPtr);
+}
+
+ZSTD_STATIC void ZSTD_writeLEST(void *memPtr, size_t val)
+{
+ if (ZSTD_32bits())
+ ZSTD_writeLE32(memPtr, (U32)val);
+ else
+ ZSTD_writeLE64(memPtr, (U64)val);
+}
+
+/*=== Big endian r/w ===*/
+
+ZSTD_STATIC U32 ZSTD_readBE32(const void *memPtr) { return get_unaligned_be32(memPtr); }
+
+ZSTD_STATIC void ZSTD_writeBE32(void *memPtr, U32 val32) { put_unaligned_be32(val32, memPtr); }
+
+ZSTD_STATIC U64 ZSTD_readBE64(const void *memPtr) { return get_unaligned_be64(memPtr); }
+
+ZSTD_STATIC void ZSTD_writeBE64(void *memPtr, U64 val64) { put_unaligned_be64(val64, memPtr); }
+
+ZSTD_STATIC size_t ZSTD_readBEST(const void *memPtr)
+{
+ if (ZSTD_32bits())
+ return (size_t)ZSTD_readBE32(memPtr);
+ else
+ return (size_t)ZSTD_readBE64(memPtr);
+}
+
+ZSTD_STATIC void ZSTD_writeBEST(void *memPtr, size_t val)
+{
+ if (ZSTD_32bits())
+ ZSTD_writeBE32(memPtr, (U32)val);
+ else
+ ZSTD_writeBE64(memPtr, (U64)val);
+}
+
+/* function safe only for comparisons */
+ZSTD_STATIC U32 ZSTD_readMINMATCH(const void *memPtr, U32 length)
+{
+ switch (length) {
+ default:
+ case 4: return ZSTD_read32(memPtr);
+ case 3:
+ if (ZSTD_isLittleEndian())
+ return ZSTD_read32(memPtr) << 8;
+ else
+ return ZSTD_read32(memPtr) >> 8;
+ }
+}
+
+#endif /* MEM_H_MODULE */
diff --git a/lib/zstd/zstd_common.c b/lib/zstd/zstd_common.c
new file mode 100644
index 000000000000..a282624ee155
--- /dev/null
+++ b/lib/zstd/zstd_common.c
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+/*-*************************************
+* Dependencies
+***************************************/
+#include "error_private.h"
+#include "zstd_internal.h" /* declaration of ZSTD_isError, ZSTD_getErrorName, ZSTD_getErrorCode, ZSTD_getErrorString, ZSTD_versionNumber */
+#include <linux/kernel.h>
+
+/*=**************************************************************
+* Custom allocator
+****************************************************************/
+
+#define stack_push(stack, size) \
+ ({ \
+ void *const ptr = ZSTD_PTR_ALIGN((stack)->ptr); \
+ (stack)->ptr = (char *)ptr + (size); \
+ (stack)->ptr <= (stack)->end ? ptr : NULL; \
+ })
+
+ZSTD_customMem ZSTD_initStack(void *workspace, size_t workspaceSize)
+{
+ ZSTD_customMem stackMem = {ZSTD_stackAlloc, ZSTD_stackFree, workspace};
+ ZSTD_stack *stack = (ZSTD_stack *)workspace;
+ /* Verify preconditions */
+ if (!workspace || workspaceSize < sizeof(ZSTD_stack) || workspace != ZSTD_PTR_ALIGN(workspace)) {
+ ZSTD_customMem error = {NULL, NULL, NULL};
+ return error;
+ }
+ /* Initialize the stack */
+ stack->ptr = workspace;
+ stack->end = (char *)workspace + workspaceSize;
+ stack_push(stack, sizeof(ZSTD_stack));
+ return stackMem;
+}
+
+void *ZSTD_stackAllocAll(void *opaque, size_t *size)
+{
+ ZSTD_stack *stack = (ZSTD_stack *)opaque;
+ *size = (BYTE const *)stack->end - (BYTE *)ZSTD_PTR_ALIGN(stack->ptr);
+ return stack_push(stack, *size);
+}
+
+void *ZSTD_stackAlloc(void *opaque, size_t size)
+{
+ ZSTD_stack *stack = (ZSTD_stack *)opaque;
+ return stack_push(stack, size);
+}
+void ZSTD_stackFree(void *opaque, void *address)
+{
+ (void)opaque;
+ (void)address;
+}
+
+void *ZSTD_malloc(size_t size, ZSTD_customMem customMem) { return customMem.customAlloc(customMem.opaque, size); }
+
+void ZSTD_free(void *ptr, ZSTD_customMem customMem)
+{
+ if (ptr != NULL)
+ customMem.customFree(customMem.opaque, ptr);
+}
diff --git a/lib/zstd/zstd_internal.h b/lib/zstd/zstd_internal.h
new file mode 100644
index 000000000000..1a79fab9e13a
--- /dev/null
+++ b/lib/zstd/zstd_internal.h
@@ -0,0 +1,263 @@
+/**
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+#ifndef ZSTD_CCOMMON_H_MODULE
+#define ZSTD_CCOMMON_H_MODULE
+
+/*-*******************************************************
+* Compiler specifics
+*********************************************************/
+#define FORCE_INLINE static __always_inline
+#define FORCE_NOINLINE static noinline
+
+/*-*************************************
+* Dependencies
+***************************************/
+#include "error_private.h"
+#include "mem.h"
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/xxhash.h>
+#include <linux/zstd.h>
+
+/*-*************************************
+* shared macros
+***************************************/
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define CHECK_F(f) \
+ { \
+ size_t const errcod = f; \
+ if (ERR_isError(errcod)) \
+ return errcod; \
+ } /* check and Forward error code */
+#define CHECK_E(f, e) \
+ { \
+ size_t const errcod = f; \
+ if (ERR_isError(errcod)) \
+ return ERROR(e); \
+ } /* check and send Error code */
+#define ZSTD_STATIC_ASSERT(c) \
+ { \
+ enum { ZSTD_static_assert = 1 / (int)(!!(c)) }; \
+ }
+
+/*-*************************************
+* Common constants
+***************************************/
+#define ZSTD_OPT_NUM (1 << 12)
+#define ZSTD_DICT_MAGIC 0xEC30A437 /* v0.7+ */
+
+#define ZSTD_REP_NUM 3 /* number of repcodes */
+#define ZSTD_REP_CHECK (ZSTD_REP_NUM) /* number of repcodes to check by the optimal parser */
+#define ZSTD_REP_MOVE (ZSTD_REP_NUM - 1)
+#define ZSTD_REP_MOVE_OPT (ZSTD_REP_NUM)
+static const U32 repStartValue[ZSTD_REP_NUM] = {1, 4, 8};
+
+#define KB *(1 << 10)
+#define MB *(1 << 20)
+#define GB *(1U << 30)
+
+#define BIT7 128
+#define BIT6 64
+#define BIT5 32
+#define BIT4 16
+#define BIT1 2
+#define BIT0 1
+
+#define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
+static const size_t ZSTD_fcs_fieldSize[4] = {0, 2, 4, 8};
+static const size_t ZSTD_did_fieldSize[4] = {0, 1, 2, 4};
+
+#define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
+static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
+typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
+
+#define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
+#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
+
+#define HufLog 12
+typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
+
+#define LONGNBSEQ 0x7F00
+
+#define MINMATCH 3
+#define EQUAL_READ32 4
+
+#define Litbits 8
+#define MaxLit ((1 << Litbits) - 1)
+#define MaxML 52
+#define MaxLL 35
+#define MaxOff 28
+#define MaxSeq MAX(MaxLL, MaxML) /* Assumption : MaxOff < MaxLL,MaxML */
+#define MLFSELog 9
+#define LLFSELog 9
+#define OffFSELog 8
+
+static const U32 LL_bits[MaxLL + 1] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
+static const S16 LL_defaultNorm[MaxLL + 1] = {4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, -1, -1, -1, -1};
+#define LL_DEFAULTNORMLOG 6 /* for static allocation */
+static const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
+
+static const U32 ML_bits[MaxML + 1] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
+static const S16 ML_defaultNorm[MaxML + 1] = {1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1};
+#define ML_DEFAULTNORMLOG 6 /* for static allocation */
+static const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
+
+static const S16 OF_defaultNorm[MaxOff + 1] = {1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1};
+#define OF_DEFAULTNORMLOG 5 /* for static allocation */
+static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
+
+/*-*******************************************
+* Shared functions to include for inlining
+*********************************************/
+ZSTD_STATIC void ZSTD_copy8(void *dst, const void *src) {
+ memcpy(dst, src, 8);
+}
+/*! ZSTD_wildcopy() :
+* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
+#define WILDCOPY_OVERLENGTH 8
+ZSTD_STATIC void ZSTD_wildcopy(void *dst, const void *src, ptrdiff_t length)
+{
+ const BYTE* ip = (const BYTE*)src;
+ BYTE* op = (BYTE*)dst;
+ BYTE* const oend = op + length;
+ /* Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81388.
+ * Avoid the bad case where the loop only runs once by handling the
+ * special case separately. This doesn't trigger the bug because it
+ * doesn't involve pointer/integer overflow.
+ */
+ if (length <= 8)
+ return ZSTD_copy8(dst, src);
+ do {
+ ZSTD_copy8(op, ip);
+ op += 8;
+ ip += 8;
+ } while (op < oend);
+}
+
+/*-*******************************************
+* Private interfaces
+*********************************************/
+typedef struct ZSTD_stats_s ZSTD_stats_t;
+
+typedef struct {
+ U32 off;
+ U32 len;
+} ZSTD_match_t;
+
+typedef struct {
+ U32 price;
+ U32 off;
+ U32 mlen;
+ U32 litlen;
+ U32 rep[ZSTD_REP_NUM];
+} ZSTD_optimal_t;
+
+typedef struct seqDef_s {
+ U32 offset;
+ U16 litLength;
+ U16 matchLength;
+} seqDef;
+
+typedef struct {
+ seqDef *sequencesStart;
+ seqDef *sequences;
+ BYTE *litStart;
+ BYTE *lit;
+ BYTE *llCode;
+ BYTE *mlCode;
+ BYTE *ofCode;
+ U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
+ U32 longLengthPos;
+ /* opt */
+ ZSTD_optimal_t *priceTable;
+ ZSTD_match_t *matchTable;
+ U32 *matchLengthFreq;
+ U32 *litLengthFreq;
+ U32 *litFreq;
+ U32 *offCodeFreq;
+ U32 matchLengthSum;
+ U32 matchSum;
+ U32 litLengthSum;
+ U32 litSum;
+ U32 offCodeSum;
+ U32 log2matchLengthSum;
+ U32 log2matchSum;
+ U32 log2litLengthSum;
+ U32 log2litSum;
+ U32 log2offCodeSum;
+ U32 factor;
+ U32 staticPrices;
+ U32 cachedPrice;
+ U32 cachedLitLength;
+ const BYTE *cachedLiterals;
+} seqStore_t;
+
+const seqStore_t *ZSTD_getSeqStore(const ZSTD_CCtx *ctx);
+void ZSTD_seqToCodes(const seqStore_t *seqStorePtr);
+int ZSTD_isSkipFrame(ZSTD_DCtx *dctx);
+
+/*= Custom memory allocation functions */
+typedef void *(*ZSTD_allocFunction)(void *opaque, size_t size);
+typedef void (*ZSTD_freeFunction)(void *opaque, void *address);
+typedef struct {
+ ZSTD_allocFunction customAlloc;
+ ZSTD_freeFunction customFree;
+ void *opaque;
+} ZSTD_customMem;
+
+void *ZSTD_malloc(size_t size, ZSTD_customMem customMem);
+void ZSTD_free(void *ptr, ZSTD_customMem customMem);
+
+/*====== stack allocation ======*/
+
+typedef struct {
+ void *ptr;
+ const void *end;
+} ZSTD_stack;
+
+#define ZSTD_ALIGN(x) ALIGN(x, sizeof(size_t))
+#define ZSTD_PTR_ALIGN(p) PTR_ALIGN(p, sizeof(size_t))
+
+ZSTD_customMem ZSTD_initStack(void *workspace, size_t workspaceSize);
+
+void *ZSTD_stackAllocAll(void *opaque, size_t *size);
+void *ZSTD_stackAlloc(void *opaque, size_t size);
+void ZSTD_stackFree(void *opaque, void *address);
+
+/*====== common function ======*/
+
+ZSTD_STATIC U32 ZSTD_highbit32(U32 val) { return 31 - __builtin_clz(val); }
+
+/* hidden functions */
+
+/* ZSTD_invalidateRepCodes() :
+ * ensures next compression will not use repcodes from previous block.
+ * Note : only works with regular variant;
+ * do not use with extDict variant ! */
+void ZSTD_invalidateRepCodes(ZSTD_CCtx *cctx);
+
+size_t ZSTD_freeCCtx(ZSTD_CCtx *cctx);
+size_t ZSTD_freeDCtx(ZSTD_DCtx *dctx);
+size_t ZSTD_freeCDict(ZSTD_CDict *cdict);
+size_t ZSTD_freeDDict(ZSTD_DDict *cdict);
+size_t ZSTD_freeCStream(ZSTD_CStream *zcs);
+size_t ZSTD_freeDStream(ZSTD_DStream *zds);
+
+#endif /* ZSTD_CCOMMON_H_MODULE */
diff --git a/lib/zstd/zstd_opt.h b/lib/zstd/zstd_opt.h
new file mode 100644
index 000000000000..55e1b4cba808
--- /dev/null
+++ b/lib/zstd/zstd_opt.h
@@ -0,0 +1,1014 @@
+/**
+ * Copyright (c) 2016-present, Przemyslaw Skibinski, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of https://github.com/facebook/zstd.
+ * An additional grant of patent rights can be found in the PATENTS file in the
+ * same directory.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation. This program is dual-licensed; you may select
+ * either version 2 of the GNU General Public License ("GPL") or BSD license
+ * ("BSD").
+ */
+
+/* Note : this file is intended to be included within zstd_compress.c */
+
+#ifndef ZSTD_OPT_H_91842398743
+#define ZSTD_OPT_H_91842398743
+
+#define ZSTD_LITFREQ_ADD 2
+#define ZSTD_FREQ_DIV 4
+#define ZSTD_MAX_PRICE (1 << 30)
+
+/*-*************************************
+* Price functions for optimal parser
+***************************************/
+FORCE_INLINE void ZSTD_setLog2Prices(seqStore_t *ssPtr)
+{
+ ssPtr->log2matchLengthSum = ZSTD_highbit32(ssPtr->matchLengthSum + 1);
+ ssPtr->log2litLengthSum = ZSTD_highbit32(ssPtr->litLengthSum + 1);
+ ssPtr->log2litSum = ZSTD_highbit32(ssPtr->litSum + 1);
+ ssPtr->log2offCodeSum = ZSTD_highbit32(ssPtr->offCodeSum + 1);
+ ssPtr->factor = 1 + ((ssPtr->litSum >> 5) / ssPtr->litLengthSum) + ((ssPtr->litSum << 1) / (ssPtr->litSum + ssPtr->matchSum));
+}
+
+ZSTD_STATIC void ZSTD_rescaleFreqs(seqStore_t *ssPtr, const BYTE *src, size_t srcSize)
+{
+ unsigned u;
+
+ ssPtr->cachedLiterals = NULL;
+ ssPtr->cachedPrice = ssPtr->cachedLitLength = 0;
+ ssPtr->staticPrices = 0;
+
+ if (ssPtr->litLengthSum == 0) {
+ if (srcSize <= 1024)
+ ssPtr->staticPrices = 1;
+
+ for (u = 0; u <= MaxLit; u++)
+ ssPtr->litFreq[u] = 0;
+ for (u = 0; u < srcSize; u++)
+ ssPtr->litFreq[src[u]]++;
+
+ ssPtr->litSum = 0;
+ ssPtr->litLengthSum = MaxLL + 1;
+ ssPtr->matchLengthSum = MaxML + 1;
+ ssPtr->offCodeSum = (MaxOff + 1);
+ ssPtr->matchSum = (ZSTD_LITFREQ_ADD << Litbits);
+
+ for (u = 0; u <= MaxLit; u++) {
+ ssPtr->litFreq[u] = 1 + (ssPtr->litFreq[u] >> ZSTD_FREQ_DIV);
+ ssPtr->litSum += ssPtr->litFreq[u];
+ }
+ for (u = 0; u <= MaxLL; u++)
+ ssPtr->litLengthFreq[u] = 1;
+ for (u = 0; u <= MaxML; u++)
+ ssPtr->matchLengthFreq[u] = 1;
+ for (u = 0; u <= MaxOff; u++)
+ ssPtr->offCodeFreq[u] = 1;
+ } else {
+ ssPtr->matchLengthSum = 0;
+ ssPtr->litLengthSum = 0;
+ ssPtr->offCodeSum = 0;
+ ssPtr->matchSum = 0;
+ ssPtr->litSum = 0;
+
+ for (u = 0; u <= MaxLit; u++) {
+ ssPtr->litFreq[u] = 1 + (ssPtr->litFreq[u] >> (ZSTD_FREQ_DIV + 1));
+ ssPtr->litSum += ssPtr->litFreq[u];
+ }
+ for (u = 0; u <= MaxLL; u++) {
+ ssPtr->litLengthFreq[u] = 1 + (ssPtr->litLengthFreq[u] >> (ZSTD_FREQ_DIV + 1));
+ ssPtr->litLengthSum += ssPtr->litLengthFreq[u];
+ }
+ for (u = 0; u <= MaxML; u++) {
+ ssPtr->matchLengthFreq[u] = 1 + (ssPtr->matchLengthFreq[u] >> ZSTD_FREQ_DIV);
+ ssPtr->matchLengthSum += ssPtr->matchLengthFreq[u];
+ ssPtr->matchSum += ssPtr->matchLengthFreq[u] * (u + 3);
+ }
+ ssPtr->matchSum *= ZSTD_LITFREQ_ADD;
+ for (u = 0; u <= MaxOff; u++) {
+ ssPtr->offCodeFreq[u] = 1 + (ssPtr->offCodeFreq[u] >> ZSTD_FREQ_DIV);
+ ssPtr->offCodeSum += ssPtr->offCodeFreq[u];
+ }
+ }
+
+ ZSTD_setLog2Prices(ssPtr);
+}
+
+FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t *ssPtr, U32 litLength, const BYTE *literals)
+{
+ U32 price, u;
+
+ if (ssPtr->staticPrices)
+ return ZSTD_highbit32((U32)litLength + 1) + (litLength * 6);
+
+ if (litLength == 0)
+ return ssPtr->log2litLengthSum - ZSTD_highbit32(ssPtr->litLengthFreq[0] + 1);
+
+ /* literals */
+ if (ssPtr->cachedLiterals == literals) {
+ U32 const additional = litLength - ssPtr->cachedLitLength;
+ const BYTE *literals2 = ssPtr->cachedLiterals + ssPtr->cachedLitLength;
+ price = ssPtr->cachedPrice + additional * ssPtr->log2litSum;
+ for (u = 0; u < additional; u++)
+ price -= ZSTD_highbit32(ssPtr->litFreq[literals2[u]] + 1);
+ ssPtr->cachedPrice = price;
+ ssPtr->cachedLitLength = litLength;
+ } else {
+ price = litLength * ssPtr->log2litSum;
+ for (u = 0; u < litLength; u++)
+ price -= ZSTD_highbit32(ssPtr->litFreq[literals[u]] + 1);
+
+ if (litLength >= 12) {
+ ssPtr->cachedLiterals = literals;
+ ssPtr->cachedPrice = price;
+ ssPtr->cachedLitLength = litLength;
+ }
+ }
+
+ /* literal Length */
+ {
+ const BYTE LL_deltaCode = 19;
+ const BYTE llCode = (litLength > 63) ? (BYTE)ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength];
+ price += LL_bits[llCode] + ssPtr->log2litLengthSum - ZSTD_highbit32(ssPtr->litLengthFreq[llCode] + 1);
+ }
+
+ return price;
+}
+
+FORCE_INLINE U32 ZSTD_getPrice(seqStore_t *seqStorePtr, U32 litLength, const BYTE *literals, U32 offset, U32 matchLength, const int ultra)
+{
+ /* offset */
+ U32 price;
+ BYTE const offCode = (BYTE)ZSTD_highbit32(offset + 1);
+
+ if (seqStorePtr->staticPrices)
+ return ZSTD_getLiteralPrice(seqStorePtr, litLength, literals) + ZSTD_highbit32((U32)matchLength + 1) + 16 + offCode;
+
+ price = offCode + seqStorePtr->log2offCodeSum - ZSTD_highbit32(seqStorePtr->offCodeFreq[offCode] + 1);
+ if (!ultra && offCode >= 20)
+ price += (offCode - 19) * 2;
+
+ /* match Length */
+ {
+ const BYTE ML_deltaCode = 36;
+ const BYTE mlCode = (matchLength > 127) ? (BYTE)ZSTD_highbit32(matchLength) + ML_deltaCode : ML_Code[matchLength];
+ price += ML_bits[mlCode] + seqStorePtr->log2matchLengthSum - ZSTD_highbit32(seqStorePtr->matchLengthFreq[mlCode] + 1);
+ }
+
+ return price + ZSTD_getLiteralPrice(seqStorePtr, litLength, literals) + seqStorePtr->factor;
+}
+
+ZSTD_STATIC void ZSTD_updatePrice(seqStore_t *seqStorePtr, U32 litLength, const BYTE *literals, U32 offset, U32 matchLength)
+{
+ U32 u;
+
+ /* literals */
+ seqStorePtr->litSum += litLength * ZSTD_LITFREQ_ADD;
+ for (u = 0; u < litLength; u++)
+ seqStorePtr->litFreq[literals[u]] += ZSTD_LITFREQ_ADD;
+
+ /* literal Length */
+ {
+ const BYTE LL_deltaCode = 19;
+ const BYTE llCode = (litLength > 63) ? (BYTE)ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength];
+ seqStorePtr->litLengthFreq[llCode]++;
+ seqStorePtr->litLengthSum++;
+ }
+
+ /* match offset */
+ {
+ BYTE const offCode = (BYTE)ZSTD_highbit32(offset + 1);
+ seqStorePtr->offCodeSum++;
+ seqStorePtr->offCodeFreq[offCode]++;
+ }
+
+ /* match Length */
+ {
+ const BYTE ML_deltaCode = 36;
+ const BYTE mlCode = (matchLength > 127) ? (BYTE)ZSTD_highbit32(matchLength) + ML_deltaCode : ML_Code[matchLength];
+ seqStorePtr->matchLengthFreq[mlCode]++;
+ seqStorePtr->matchLengthSum++;
+ }
+
+ ZSTD_setLog2Prices(seqStorePtr);
+}
+
+#define SET_PRICE(pos, mlen_, offset_, litlen_, price_) \
+ { \
+ while (last_pos < pos) { \
+ opt[last_pos + 1].price = ZSTD_MAX_PRICE; \
+ last_pos++; \
+ } \
+ opt[pos].mlen = mlen_; \
+ opt[pos].off = offset_; \
+ opt[pos].litlen = litlen_; \
+ opt[pos].price = price_; \
+ }
+
+/* Update hashTable3 up to ip (excluded)
+ Assumption : always within prefix (i.e. not within extDict) */
+FORCE_INLINE
+U32 ZSTD_insertAndFindFirstIndexHash3(ZSTD_CCtx *zc, const BYTE *ip)
+{
+ U32 *const hashTable3 = zc->hashTable3;
+ U32 const hashLog3 = zc->hashLog3;
+ const BYTE *const base = zc->base;
+ U32 idx = zc->nextToUpdate3;
+ const U32 target = zc->nextToUpdate3 = (U32)(ip - base);
+ const size_t hash3 = ZSTD_hash3Ptr(ip, hashLog3);
+
+ while (idx < target) {
+ hashTable3[ZSTD_hash3Ptr(base + idx, hashLog3)] = idx;
+ idx++;
+ }
+
+ return hashTable3[hash3];
+}
+
+/*-*************************************
+* Binary Tree search
+***************************************/
+static U32 ZSTD_insertBtAndGetAllMatches(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iLimit, U32 nbCompares, const U32 mls, U32 extDict,
+ ZSTD_match_t *matches, const U32 minMatchLen)
+{
+ const BYTE *const base = zc->base;
+ const U32 curr = (U32)(ip - base);
+ const U32 hashLog = zc->params.cParams.hashLog;
+ const size_t h = ZSTD_hashPtr(ip, hashLog, mls);
+ U32 *const hashTable = zc->hashTable;
+ U32 matchIndex = hashTable[h];
+ U32 *const bt = zc->chainTable;
+ const U32 btLog = zc->params.cParams.chainLog - 1;
+ const U32 btMask = (1U << btLog) - 1;
+ size_t commonLengthSmaller = 0, commonLengthLarger = 0;
+ const BYTE *const dictBase = zc->dictBase;
+ const U32 dictLimit = zc->dictLimit;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const U32 btLow = btMask >= curr ? 0 : curr - btMask;
+ const U32 windowLow = zc->lowLimit;
+ U32 *smallerPtr = bt + 2 * (curr & btMask);
+ U32 *largerPtr = bt + 2 * (curr & btMask) + 1;
+ U32 matchEndIdx = curr + 8;
+ U32 dummy32; /* to be nullified at the end */
+ U32 mnum = 0;
+
+ const U32 minMatch = (mls == 3) ? 3 : 4;
+ size_t bestLength = minMatchLen - 1;
+
+ if (minMatch == 3) { /* HC3 match finder */
+ U32 const matchIndex3 = ZSTD_insertAndFindFirstIndexHash3(zc, ip);
+ if (matchIndex3 > windowLow && (curr - matchIndex3 < (1 << 18))) {
+ const BYTE *match;
+ size_t currMl = 0;
+ if ((!extDict) || matchIndex3 >= dictLimit) {
+ match = base + matchIndex3;
+ if (match[bestLength] == ip[bestLength])
+ currMl = ZSTD_count(ip, match, iLimit);
+ } else {
+ match = dictBase + matchIndex3;
+ if (ZSTD_readMINMATCH(match, MINMATCH) ==
+ ZSTD_readMINMATCH(ip, MINMATCH)) /* assumption : matchIndex3 <= dictLimit-4 (by table construction) */
+ currMl = ZSTD_count_2segments(ip + MINMATCH, match + MINMATCH, iLimit, dictEnd, prefixStart) + MINMATCH;
+ }
+
+ /* save best solution */
+ if (currMl > bestLength) {
+ bestLength = currMl;
+ matches[mnum].off = ZSTD_REP_MOVE_OPT + curr - matchIndex3;
+ matches[mnum].len = (U32)currMl;
+ mnum++;
+ if (currMl > ZSTD_OPT_NUM)
+ goto update;
+ if (ip + currMl == iLimit)
+ goto update; /* best possible, and avoid read overflow*/
+ }
+ }
+ }
+
+ hashTable[h] = curr; /* Update Hash Table */
+
+ while (nbCompares-- && (matchIndex > windowLow)) {
+ U32 *nextPtr = bt + 2 * (matchIndex & btMask);
+ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
+ const BYTE *match;
+
+ if ((!extDict) || (matchIndex + matchLength >= dictLimit)) {
+ match = base + matchIndex;
+ if (match[matchLength] == ip[matchLength]) {
+ matchLength += ZSTD_count(ip + matchLength + 1, match + matchLength + 1, iLimit) + 1;
+ }
+ } else {
+ match = dictBase + matchIndex;
+ matchLength += ZSTD_count_2segments(ip + matchLength, match + matchLength, iLimit, dictEnd, prefixStart);
+ if (matchIndex + matchLength >= dictLimit)
+ match = base + matchIndex; /* to prepare for next usage of match[matchLength] */
+ }
+
+ if (matchLength > bestLength) {
+ if (matchLength > matchEndIdx - matchIndex)
+ matchEndIdx = matchIndex + (U32)matchLength;
+ bestLength = matchLength;
+ matches[mnum].off = ZSTD_REP_MOVE_OPT + curr - matchIndex;
+ matches[mnum].len = (U32)matchLength;
+ mnum++;
+ if (matchLength > ZSTD_OPT_NUM)
+ break;
+ if (ip + matchLength == iLimit) /* equal : no way to know if inf or sup */
+ break; /* drop, to guarantee consistency (miss a little bit of compression) */
+ }
+
+ if (match[matchLength] < ip[matchLength]) {
+ /* match is smaller than curr */
+ *smallerPtr = matchIndex; /* update smaller idx */
+ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */
+ if (matchIndex <= btLow) {
+ smallerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ smallerPtr = nextPtr + 1; /* new "smaller" => larger of match */
+ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to curr) */
+ } else {
+ /* match is larger than curr */
+ *largerPtr = matchIndex;
+ commonLengthLarger = matchLength;
+ if (matchIndex <= btLow) {
+ largerPtr = &dummy32;
+ break;
+ } /* beyond tree size, stop the search */
+ largerPtr = nextPtr;
+ matchIndex = nextPtr[0];
+ }
+ }
+
+ *smallerPtr = *largerPtr = 0;
+
+update:
+ zc->nextToUpdate = (matchEndIdx > curr + 8) ? matchEndIdx - 8 : curr + 1;
+ return mnum;
+}
+
+/** Tree updater, providing best match */
+static U32 ZSTD_BtGetAllMatches(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iLimit, const U32 maxNbAttempts, const U32 mls, ZSTD_match_t *matches,
+ const U32 minMatchLen)
+{
+ if (ip < zc->base + zc->nextToUpdate)
+ return 0; /* skipped area */
+ ZSTD_updateTree(zc, ip, iLimit, maxNbAttempts, mls);
+ return ZSTD_insertBtAndGetAllMatches(zc, ip, iLimit, maxNbAttempts, mls, 0, matches, minMatchLen);
+}
+
+static U32 ZSTD_BtGetAllMatches_selectMLS(ZSTD_CCtx *zc, /* Index table will be updated */
+ const BYTE *ip, const BYTE *const iHighLimit, const U32 maxNbAttempts, const U32 matchLengthSearch,
+ ZSTD_match_t *matches, const U32 minMatchLen)
+{
+ switch (matchLengthSearch) {
+ case 3: return ZSTD_BtGetAllMatches(zc, ip, iHighLimit, maxNbAttempts, 3, matches, minMatchLen);
+ default:
+ case 4: return ZSTD_BtGetAllMatches(zc, ip, iHighLimit, maxNbAttempts, 4, matches, minMatchLen);
+ case 5: return ZSTD_BtGetAllMatches(zc, ip, iHighLimit, maxNbAttempts, 5, matches, minMatchLen);
+ case 7:
+ case 6: return ZSTD_BtGetAllMatches(zc, ip, iHighLimit, maxNbAttempts, 6, matches, minMatchLen);
+ }
+}
+
+/** Tree updater, providing best match */
+static U32 ZSTD_BtGetAllMatches_extDict(ZSTD_CCtx *zc, const BYTE *const ip, const BYTE *const iLimit, const U32 maxNbAttempts, const U32 mls,
+ ZSTD_match_t *matches, const U32 minMatchLen)
+{
+ if (ip < zc->base + zc->nextToUpdate)
+ return 0; /* skipped area */
+ ZSTD_updateTree_extDict(zc, ip, iLimit, maxNbAttempts, mls);
+ return ZSTD_insertBtAndGetAllMatches(zc, ip, iLimit, maxNbAttempts, mls, 1, matches, minMatchLen);
+}
+
+static U32 ZSTD_BtGetAllMatches_selectMLS_extDict(ZSTD_CCtx *zc, /* Index table will be updated */
+ const BYTE *ip, const BYTE *const iHighLimit, const U32 maxNbAttempts, const U32 matchLengthSearch,
+ ZSTD_match_t *matches, const U32 minMatchLen)
+{
+ switch (matchLengthSearch) {
+ case 3: return ZSTD_BtGetAllMatches_extDict(zc, ip, iHighLimit, maxNbAttempts, 3, matches, minMatchLen);
+ default:
+ case 4: return ZSTD_BtGetAllMatches_extDict(zc, ip, iHighLimit, maxNbAttempts, 4, matches, minMatchLen);
+ case 5: return ZSTD_BtGetAllMatches_extDict(zc, ip, iHighLimit, maxNbAttempts, 5, matches, minMatchLen);
+ case 7:
+ case 6: return ZSTD_BtGetAllMatches_extDict(zc, ip, iHighLimit, maxNbAttempts, 6, matches, minMatchLen);
+ }
+}
+
+/*-*******************************
+* Optimal parser
+*********************************/
+FORCE_INLINE
+void ZSTD_compressBlock_opt_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const int ultra)
+{
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ const BYTE *const base = ctx->base;
+ const BYTE *const prefixStart = base + ctx->dictLimit;
+
+ const U32 maxSearches = 1U << ctx->params.cParams.searchLog;
+ const U32 sufficient_len = ctx->params.cParams.targetLength;
+ const U32 mls = ctx->params.cParams.searchLength;
+ const U32 minMatch = (ctx->params.cParams.searchLength == 3) ? 3 : 4;
+
+ ZSTD_optimal_t *opt = seqStorePtr->priceTable;
+ ZSTD_match_t *matches = seqStorePtr->matchTable;
+ const BYTE *inr;
+ U32 offset, rep[ZSTD_REP_NUM];
+
+ /* init */
+ ctx->nextToUpdate3 = ctx->nextToUpdate;
+ ZSTD_rescaleFreqs(seqStorePtr, (const BYTE *)src, srcSize);
+ ip += (ip == prefixStart);
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ rep[i] = ctx->rep[i];
+ }
+
+ /* Match Loop */
+ while (ip < ilimit) {
+ U32 cur, match_num, last_pos, litlen, price;
+ U32 u, mlen, best_mlen, best_off, litLength;
+ memset(opt, 0, sizeof(ZSTD_optimal_t));
+ last_pos = 0;
+ litlen = (U32)(ip - anchor);
+
+ /* check repCode */
+ {
+ U32 i, last_i = ZSTD_REP_CHECK + (ip == anchor);
+ for (i = (ip == anchor); i < last_i; i++) {
+ const S32 repCur = (i == ZSTD_REP_MOVE_OPT) ? (rep[0] - 1) : rep[i];
+ if ((repCur > 0) && (repCur < (S32)(ip - prefixStart)) &&
+ (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(ip - repCur, minMatch))) {
+ mlen = (U32)ZSTD_count(ip + minMatch, ip + minMatch - repCur, iend) + minMatch;
+ if (mlen > sufficient_len || mlen >= ZSTD_OPT_NUM) {
+ best_mlen = mlen;
+ best_off = i;
+ cur = 0;
+ last_pos = 1;
+ goto _storeSequence;
+ }
+ best_off = i - (ip == anchor);
+ do {
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
+ if (mlen > last_pos || price < opt[mlen].price)
+ SET_PRICE(mlen, mlen, i, litlen, price); /* note : macro modifies last_pos */
+ mlen--;
+ } while (mlen >= minMatch);
+ }
+ }
+ }
+
+ match_num = ZSTD_BtGetAllMatches_selectMLS(ctx, ip, iend, maxSearches, mls, matches, minMatch);
+
+ if (!last_pos && !match_num) {
+ ip++;
+ continue;
+ }
+
+ if (match_num && (matches[match_num - 1].len > sufficient_len || matches[match_num - 1].len >= ZSTD_OPT_NUM)) {
+ best_mlen = matches[match_num - 1].len;
+ best_off = matches[match_num - 1].off;
+ cur = 0;
+ last_pos = 1;
+ goto _storeSequence;
+ }
+
+ /* set prices using matches at position = 0 */
+ best_mlen = (last_pos) ? last_pos : minMatch;
+ for (u = 0; u < match_num; u++) {
+ mlen = (u > 0) ? matches[u - 1].len + 1 : best_mlen;
+ best_mlen = matches[u].len;
+ while (mlen <= best_mlen) {
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off - 1, mlen - MINMATCH, ultra);
+ if (mlen > last_pos || price < opt[mlen].price)
+ SET_PRICE(mlen, mlen, matches[u].off, litlen, price); /* note : macro modifies last_pos */
+ mlen++;
+ }
+ }
+
+ if (last_pos < minMatch) {
+ ip++;
+ continue;
+ }
+
+ /* initialize opt[0] */
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ opt[0].rep[i] = rep[i];
+ }
+ opt[0].mlen = 1;
+ opt[0].litlen = litlen;
+
+ /* check further positions */
+ for (cur = 1; cur <= last_pos; cur++) {
+ inr = ip + cur;
+
+ if (opt[cur - 1].mlen == 1) {
+ litlen = opt[cur - 1].litlen + 1;
+ if (cur > litlen) {
+ price = opt[cur - litlen].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr - litlen);
+ } else
+ price = ZSTD_getLiteralPrice(seqStorePtr, litlen, anchor);
+ } else {
+ litlen = 1;
+ price = opt[cur - 1].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr - 1);
+ }
+
+ if (cur > last_pos || price <= opt[cur].price)
+ SET_PRICE(cur, 1, 0, litlen, price);
+
+ if (cur == last_pos)
+ break;
+
+ if (inr > ilimit) /* last match must start at a minimum distance of 8 from oend */
+ continue;
+
+ mlen = opt[cur].mlen;
+ if (opt[cur].off > ZSTD_REP_MOVE_OPT) {
+ opt[cur].rep[2] = opt[cur - mlen].rep[1];
+ opt[cur].rep[1] = opt[cur - mlen].rep[0];
+ opt[cur].rep[0] = opt[cur].off - ZSTD_REP_MOVE_OPT;
+ } else {
+ opt[cur].rep[2] = (opt[cur].off > 1) ? opt[cur - mlen].rep[1] : opt[cur - mlen].rep[2];
+ opt[cur].rep[1] = (opt[cur].off > 0) ? opt[cur - mlen].rep[0] : opt[cur - mlen].rep[1];
+ opt[cur].rep[0] =
+ ((opt[cur].off == ZSTD_REP_MOVE_OPT) && (mlen != 1)) ? (opt[cur - mlen].rep[0] - 1) : (opt[cur - mlen].rep[opt[cur].off]);
+ }
+
+ best_mlen = minMatch;
+ {
+ U32 i, last_i = ZSTD_REP_CHECK + (mlen != 1);
+ for (i = (opt[cur].mlen != 1); i < last_i; i++) { /* check rep */
+ const S32 repCur = (i == ZSTD_REP_MOVE_OPT) ? (opt[cur].rep[0] - 1) : opt[cur].rep[i];
+ if ((repCur > 0) && (repCur < (S32)(inr - prefixStart)) &&
+ (ZSTD_readMINMATCH(inr, minMatch) == ZSTD_readMINMATCH(inr - repCur, minMatch))) {
+ mlen = (U32)ZSTD_count(inr + minMatch, inr + minMatch - repCur, iend) + minMatch;
+
+ if (mlen > sufficient_len || cur + mlen >= ZSTD_OPT_NUM) {
+ best_mlen = mlen;
+ best_off = i;
+ last_pos = cur + 1;
+ goto _storeSequence;
+ }
+
+ best_off = i - (opt[cur].mlen != 1);
+ if (mlen > best_mlen)
+ best_mlen = mlen;
+
+ do {
+ if (opt[cur].mlen == 1) {
+ litlen = opt[cur].litlen;
+ if (cur > litlen) {
+ price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, inr - litlen,
+ best_off, mlen - MINMATCH, ultra);
+ } else
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
+ } else {
+ litlen = 0;
+ price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, best_off, mlen - MINMATCH, ultra);
+ }
+
+ if (cur + mlen > last_pos || price <= opt[cur + mlen].price)
+ SET_PRICE(cur + mlen, mlen, i, litlen, price);
+ mlen--;
+ } while (mlen >= minMatch);
+ }
+ }
+ }
+
+ match_num = ZSTD_BtGetAllMatches_selectMLS(ctx, inr, iend, maxSearches, mls, matches, best_mlen);
+
+ if (match_num > 0 && (matches[match_num - 1].len > sufficient_len || cur + matches[match_num - 1].len >= ZSTD_OPT_NUM)) {
+ best_mlen = matches[match_num - 1].len;
+ best_off = matches[match_num - 1].off;
+ last_pos = cur + 1;
+ goto _storeSequence;
+ }
+
+ /* set prices using matches at position = cur */
+ for (u = 0; u < match_num; u++) {
+ mlen = (u > 0) ? matches[u - 1].len + 1 : best_mlen;
+ best_mlen = matches[u].len;
+
+ while (mlen <= best_mlen) {
+ if (opt[cur].mlen == 1) {
+ litlen = opt[cur].litlen;
+ if (cur > litlen)
+ price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip + cur - litlen,
+ matches[u].off - 1, mlen - MINMATCH, ultra);
+ else
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off - 1, mlen - MINMATCH, ultra);
+ } else {
+ litlen = 0;
+ price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off - 1, mlen - MINMATCH, ultra);
+ }
+
+ if (cur + mlen > last_pos || (price < opt[cur + mlen].price))
+ SET_PRICE(cur + mlen, mlen, matches[u].off, litlen, price);
+
+ mlen++;
+ }
+ }
+ }
+
+ best_mlen = opt[last_pos].mlen;
+ best_off = opt[last_pos].off;
+ cur = last_pos - best_mlen;
+
+ /* store sequence */
+_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
+ opt[0].mlen = 1;
+
+ while (1) {
+ mlen = opt[cur].mlen;
+ offset = opt[cur].off;
+ opt[cur].mlen = best_mlen;
+ opt[cur].off = best_off;
+ best_mlen = mlen;
+ best_off = offset;
+ if (mlen > cur)
+ break;
+ cur -= mlen;
+ }
+
+ for (u = 0; u <= last_pos;) {
+ u += opt[u].mlen;
+ }
+
+ for (cur = 0; cur < last_pos;) {
+ mlen = opt[cur].mlen;
+ if (mlen == 1) {
+ ip++;
+ cur++;
+ continue;
+ }
+ offset = opt[cur].off;
+ cur += mlen;
+ litLength = (U32)(ip - anchor);
+
+ if (offset > ZSTD_REP_MOVE_OPT) {
+ rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = offset - ZSTD_REP_MOVE_OPT;
+ offset--;
+ } else {
+ if (offset != 0) {
+ best_off = (offset == ZSTD_REP_MOVE_OPT) ? (rep[0] - 1) : (rep[offset]);
+ if (offset != 1)
+ rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = best_off;
+ }
+ if (litLength == 0)
+ offset--;
+ }
+
+ ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH);
+ ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH);
+ anchor = ip = ip + mlen;
+ }
+ } /* for (cur=0; cur < last_pos; ) */
+
+ /* Save reps for next block */
+ {
+ int i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ ctx->repToConfirm[i] = rep[i];
+ }
+
+ /* Last Literals */
+ {
+ size_t const lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+FORCE_INLINE
+void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx *ctx, const void *src, size_t srcSize, const int ultra)
+{
+ seqStore_t *seqStorePtr = &(ctx->seqStore);
+ const BYTE *const istart = (const BYTE *)src;
+ const BYTE *ip = istart;
+ const BYTE *anchor = istart;
+ const BYTE *const iend = istart + srcSize;
+ const BYTE *const ilimit = iend - 8;
+ const BYTE *const base = ctx->base;
+ const U32 lowestIndex = ctx->lowLimit;
+ const U32 dictLimit = ctx->dictLimit;
+ const BYTE *const prefixStart = base + dictLimit;
+ const BYTE *const dictBase = ctx->dictBase;
+ const BYTE *const dictEnd = dictBase + dictLimit;
+
+ const U32 maxSearches = 1U << ctx->params.cParams.searchLog;
+ const U32 sufficient_len = ctx->params.cParams.targetLength;
+ const U32 mls = ctx->params.cParams.searchLength;
+ const U32 minMatch = (ctx->params.cParams.searchLength == 3) ? 3 : 4;
+
+ ZSTD_optimal_t *opt = seqStorePtr->priceTable;
+ ZSTD_match_t *matches = seqStorePtr->matchTable;
+ const BYTE *inr;
+
+ /* init */
+ U32 offset, rep[ZSTD_REP_NUM];
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ rep[i] = ctx->rep[i];
+ }
+
+ ctx->nextToUpdate3 = ctx->nextToUpdate;
+ ZSTD_rescaleFreqs(seqStorePtr, (const BYTE *)src, srcSize);
+ ip += (ip == prefixStart);
+
+ /* Match Loop */
+ while (ip < ilimit) {
+ U32 cur, match_num, last_pos, litlen, price;
+ U32 u, mlen, best_mlen, best_off, litLength;
+ U32 curr = (U32)(ip - base);
+ memset(opt, 0, sizeof(ZSTD_optimal_t));
+ last_pos = 0;
+ opt[0].litlen = (U32)(ip - anchor);
+
+ /* check repCode */
+ {
+ U32 i, last_i = ZSTD_REP_CHECK + (ip == anchor);
+ for (i = (ip == anchor); i < last_i; i++) {
+ const S32 repCur = (i == ZSTD_REP_MOVE_OPT) ? (rep[0] - 1) : rep[i];
+ const U32 repIndex = (U32)(curr - repCur);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if ((repCur > 0 && repCur <= (S32)curr) &&
+ (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ && (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch))) {
+ /* repcode detected we should take it */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ mlen = (U32)ZSTD_count_2segments(ip + minMatch, repMatch + minMatch, iend, repEnd, prefixStart) + minMatch;
+
+ if (mlen > sufficient_len || mlen >= ZSTD_OPT_NUM) {
+ best_mlen = mlen;
+ best_off = i;
+ cur = 0;
+ last_pos = 1;
+ goto _storeSequence;
+ }
+
+ best_off = i - (ip == anchor);
+ litlen = opt[0].litlen;
+ do {
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
+ if (mlen > last_pos || price < opt[mlen].price)
+ SET_PRICE(mlen, mlen, i, litlen, price); /* note : macro modifies last_pos */
+ mlen--;
+ } while (mlen >= minMatch);
+ }
+ }
+ }
+
+ match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, ip, iend, maxSearches, mls, matches, minMatch); /* first search (depth 0) */
+
+ if (!last_pos && !match_num) {
+ ip++;
+ continue;
+ }
+
+ {
+ U32 i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ opt[0].rep[i] = rep[i];
+ }
+ opt[0].mlen = 1;
+
+ if (match_num && (matches[match_num - 1].len > sufficient_len || matches[match_num - 1].len >= ZSTD_OPT_NUM)) {
+ best_mlen = matches[match_num - 1].len;
+ best_off = matches[match_num - 1].off;
+ cur = 0;
+ last_pos = 1;
+ goto _storeSequence;
+ }
+
+ best_mlen = (last_pos) ? last_pos : minMatch;
+
+ /* set prices using matches at position = 0 */
+ for (u = 0; u < match_num; u++) {
+ mlen = (u > 0) ? matches[u - 1].len + 1 : best_mlen;
+ best_mlen = matches[u].len;
+ litlen = opt[0].litlen;
+ while (mlen <= best_mlen) {
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off - 1, mlen - MINMATCH, ultra);
+ if (mlen > last_pos || price < opt[mlen].price)
+ SET_PRICE(mlen, mlen, matches[u].off, litlen, price);
+ mlen++;
+ }
+ }
+
+ if (last_pos < minMatch) {
+ ip++;
+ continue;
+ }
+
+ /* check further positions */
+ for (cur = 1; cur <= last_pos; cur++) {
+ inr = ip + cur;
+
+ if (opt[cur - 1].mlen == 1) {
+ litlen = opt[cur - 1].litlen + 1;
+ if (cur > litlen) {
+ price = opt[cur - litlen].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr - litlen);
+ } else
+ price = ZSTD_getLiteralPrice(seqStorePtr, litlen, anchor);
+ } else {
+ litlen = 1;
+ price = opt[cur - 1].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr - 1);
+ }
+
+ if (cur > last_pos || price <= opt[cur].price)
+ SET_PRICE(cur, 1, 0, litlen, price);
+
+ if (cur == last_pos)
+ break;
+
+ if (inr > ilimit) /* last match must start at a minimum distance of 8 from oend */
+ continue;
+
+ mlen = opt[cur].mlen;
+ if (opt[cur].off > ZSTD_REP_MOVE_OPT) {
+ opt[cur].rep[2] = opt[cur - mlen].rep[1];
+ opt[cur].rep[1] = opt[cur - mlen].rep[0];
+ opt[cur].rep[0] = opt[cur].off - ZSTD_REP_MOVE_OPT;
+ } else {
+ opt[cur].rep[2] = (opt[cur].off > 1) ? opt[cur - mlen].rep[1] : opt[cur - mlen].rep[2];
+ opt[cur].rep[1] = (opt[cur].off > 0) ? opt[cur - mlen].rep[0] : opt[cur - mlen].rep[1];
+ opt[cur].rep[0] =
+ ((opt[cur].off == ZSTD_REP_MOVE_OPT) && (mlen != 1)) ? (opt[cur - mlen].rep[0] - 1) : (opt[cur - mlen].rep[opt[cur].off]);
+ }
+
+ best_mlen = minMatch;
+ {
+ U32 i, last_i = ZSTD_REP_CHECK + (mlen != 1);
+ for (i = (mlen != 1); i < last_i; i++) {
+ const S32 repCur = (i == ZSTD_REP_MOVE_OPT) ? (opt[cur].rep[0] - 1) : opt[cur].rep[i];
+ const U32 repIndex = (U32)(curr + cur - repCur);
+ const BYTE *const repBase = repIndex < dictLimit ? dictBase : base;
+ const BYTE *const repMatch = repBase + repIndex;
+ if ((repCur > 0 && repCur <= (S32)(curr + cur)) &&
+ (((U32)((dictLimit - 1) - repIndex) >= 3) & (repIndex > lowestIndex)) /* intentional overflow */
+ && (ZSTD_readMINMATCH(inr, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch))) {
+ /* repcode detected */
+ const BYTE *const repEnd = repIndex < dictLimit ? dictEnd : iend;
+ mlen = (U32)ZSTD_count_2segments(inr + minMatch, repMatch + minMatch, iend, repEnd, prefixStart) + minMatch;
+
+ if (mlen > sufficient_len || cur + mlen >= ZSTD_OPT_NUM) {
+ best_mlen = mlen;
+ best_off = i;
+ last_pos = cur + 1;
+ goto _storeSequence;
+ }
+
+ best_off = i - (opt[cur].mlen != 1);
+ if (mlen > best_mlen)
+ best_mlen = mlen;
+
+ do {
+ if (opt[cur].mlen == 1) {
+ litlen = opt[cur].litlen;
+ if (cur > litlen) {
+ price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, inr - litlen,
+ best_off, mlen - MINMATCH, ultra);
+ } else
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
+ } else {
+ litlen = 0;
+ price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, best_off, mlen - MINMATCH, ultra);
+ }
+
+ if (cur + mlen > last_pos || price <= opt[cur + mlen].price)
+ SET_PRICE(cur + mlen, mlen, i, litlen, price);
+ mlen--;
+ } while (mlen >= minMatch);
+ }
+ }
+ }
+
+ match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, inr, iend, maxSearches, mls, matches, minMatch);
+
+ if (match_num > 0 && (matches[match_num - 1].len > sufficient_len || cur + matches[match_num - 1].len >= ZSTD_OPT_NUM)) {
+ best_mlen = matches[match_num - 1].len;
+ best_off = matches[match_num - 1].off;
+ last_pos = cur + 1;
+ goto _storeSequence;
+ }
+
+ /* set prices using matches at position = cur */
+ for (u = 0; u < match_num; u++) {
+ mlen = (u > 0) ? matches[u - 1].len + 1 : best_mlen;
+ best_mlen = matches[u].len;
+
+ while (mlen <= best_mlen) {
+ if (opt[cur].mlen == 1) {
+ litlen = opt[cur].litlen;
+ if (cur > litlen)
+ price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip + cur - litlen,
+ matches[u].off - 1, mlen - MINMATCH, ultra);
+ else
+ price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off - 1, mlen - MINMATCH, ultra);
+ } else {
+ litlen = 0;
+ price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off - 1, mlen - MINMATCH, ultra);
+ }
+
+ if (cur + mlen > last_pos || (price < opt[cur + mlen].price))
+ SET_PRICE(cur + mlen, mlen, matches[u].off, litlen, price);
+
+ mlen++;
+ }
+ }
+ } /* for (cur = 1; cur <= last_pos; cur++) */
+
+ best_mlen = opt[last_pos].mlen;
+ best_off = opt[last_pos].off;
+ cur = last_pos - best_mlen;
+
+ /* store sequence */
+_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
+ opt[0].mlen = 1;
+
+ while (1) {
+ mlen = opt[cur].mlen;
+ offset = opt[cur].off;
+ opt[cur].mlen = best_mlen;
+ opt[cur].off = best_off;
+ best_mlen = mlen;
+ best_off = offset;
+ if (mlen > cur)
+ break;
+ cur -= mlen;
+ }
+
+ for (u = 0; u <= last_pos;) {
+ u += opt[u].mlen;
+ }
+
+ for (cur = 0; cur < last_pos;) {
+ mlen = opt[cur].mlen;
+ if (mlen == 1) {
+ ip++;
+ cur++;
+ continue;
+ }
+ offset = opt[cur].off;
+ cur += mlen;
+ litLength = (U32)(ip - anchor);
+
+ if (offset > ZSTD_REP_MOVE_OPT) {
+ rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = offset - ZSTD_REP_MOVE_OPT;
+ offset--;
+ } else {
+ if (offset != 0) {
+ best_off = (offset == ZSTD_REP_MOVE_OPT) ? (rep[0] - 1) : (rep[offset]);
+ if (offset != 1)
+ rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = best_off;
+ }
+
+ if (litLength == 0)
+ offset--;
+ }
+
+ ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH);
+ ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH);
+ anchor = ip = ip + mlen;
+ }
+ } /* for (cur=0; cur < last_pos; ) */
+
+ /* Save reps for next block */
+ {
+ int i;
+ for (i = 0; i < ZSTD_REP_NUM; i++)
+ ctx->repToConfirm[i] = rep[i];
+ }
+
+ /* Last Literals */
+ {
+ size_t lastLLSize = iend - anchor;
+ memcpy(seqStorePtr->lit, anchor, lastLLSize);
+ seqStorePtr->lit += lastLLSize;
+ }
+}
+
+#endif /* ZSTD_OPT_H_91842398743 */
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index f028a9a472fd..e19606bb41a0 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -569,8 +569,10 @@ static int cgwb_create(struct backing_dev_info *bdi,
/* need to create a new one */
wb = kmalloc(sizeof(*wb), gfp);
- if (!wb)
- return -ENOMEM;
+ if (!wb) {
+ ret = -ENOMEM;
+ goto out_put;
+ }
ret = wb_init(wb, bdi, blkcg_css->id, gfp);
if (ret)
diff --git a/mm/compaction.c b/mm/compaction.c
index fb548e4c7bd4..03d31a875341 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1999,17 +1999,14 @@ void wakeup_kcompactd(pg_data_t *pgdat, int order, int classzone_idx)
if (pgdat->kcompactd_max_order < order)
pgdat->kcompactd_max_order = order;
- /*
- * Pairs with implicit barrier in wait_event_freezable()
- * such that wakeups are not missed in the lockless
- * waitqueue_active() call.
- */
- smp_acquire__after_ctrl_dep();
-
if (pgdat->kcompactd_classzone_idx > classzone_idx)
pgdat->kcompactd_classzone_idx = classzone_idx;
- if (!waitqueue_active(&pgdat->kcompactd_wait))
+ /*
+ * Pairs with implicit barrier in wait_event_freezable()
+ * such that wakeups are not missed.
+ */
+ if (!wq_has_sleeper(&pgdat->kcompactd_wait))
return;
if (!kcompactd_node_suitable(pgdat))
diff --git a/mm/filemap.c b/mm/filemap.c
index 9d21afd692b9..594d73fef8b4 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -620,6 +620,14 @@ int file_check_and_advance_wb_err(struct file *file)
trace_file_check_and_advance_wb_err(file, old);
spin_unlock(&file->f_lock);
}
+
+ /*
+ * We're mostly using this function as a drop in replacement for
+ * filemap_check_errors. Clear AS_EIO/AS_ENOSPC to emulate the effect
+ * that the legacy code would have had on these flags.
+ */
+ clear_bit(AS_EIO, &mapping->flags);
+ clear_bit(AS_ENOSPC, &mapping->flags);
return err;
}
EXPORT_SYMBOL(file_check_and_advance_wb_err);
@@ -909,13 +917,33 @@ static void wake_up_page_bit(struct page *page, int bit_nr)
wait_queue_head_t *q = page_waitqueue(page);
struct wait_page_key key;
unsigned long flags;
+ wait_queue_entry_t bookmark;
key.page = page;
key.bit_nr = bit_nr;
key.page_match = 0;
+ bookmark.flags = 0;
+ bookmark.private = NULL;
+ bookmark.func = NULL;
+ INIT_LIST_HEAD(&bookmark.entry);
+
spin_lock_irqsave(&q->lock, flags);
- __wake_up_locked_key(q, TASK_NORMAL, &key);
+ __wake_up_locked_key_bookmark(q, TASK_NORMAL, &key, &bookmark);
+
+ while (bookmark.flags & WQ_FLAG_BOOKMARK) {
+ /*
+ * Take a breather from holding the lock,
+ * allow pages that finish wake up asynchronously
+ * to acquire the lock and remove themselves
+ * from wait queue
+ */
+ spin_unlock_irqrestore(&q->lock, flags);
+ cpu_relax();
+ spin_lock_irqsave(&q->lock, flags);
+ __wake_up_locked_key_bookmark(q, TASK_NORMAL, &key, &bookmark);
+ }
+
/*
* It is possible for other pages to have collided on the waitqueue
* hash, so in that case check for a page match. That prevents a long-
@@ -1897,9 +1925,8 @@ static void shrink_readahead_size_eio(struct file *filp,
}
/**
- * do_generic_file_read - generic file read routine
- * @filp: the file to read
- * @ppos: current file position
+ * generic_file_buffered_read - generic file read routine
+ * @iocb: the iocb to read
* @iter: data destination
* @written: already copied
*
@@ -1909,12 +1936,14 @@ static void shrink_readahead_size_eio(struct file *filp,
* This is really ugly. But the goto's actually try to clarify some
* of the logic when it comes to error handling etc.
*/
-static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos,
+static ssize_t generic_file_buffered_read(struct kiocb *iocb,
struct iov_iter *iter, ssize_t written)
{
+ struct file *filp = iocb->ki_filp;
struct address_space *mapping = filp->f_mapping;
struct inode *inode = mapping->host;
struct file_ra_state *ra = &filp->f_ra;
+ loff_t *ppos = &iocb->ki_pos;
pgoff_t index;
pgoff_t last_index;
pgoff_t prev_index;
@@ -1947,6 +1976,8 @@ find_page:
page = find_get_page(mapping, index);
if (!page) {
+ if (iocb->ki_flags & IOCB_NOWAIT)
+ goto would_block;
page_cache_sync_readahead(mapping,
ra, filp,
index, last_index - index);
@@ -1960,6 +1991,11 @@ find_page:
index, last_index - index);
}
if (!PageUptodate(page)) {
+ if (iocb->ki_flags & IOCB_NOWAIT) {
+ put_page(page);
+ goto would_block;
+ }
+
/*
* See comment in do_read_cache_page on why
* wait_on_page_locked is used to avoid unnecessarily
@@ -2141,6 +2177,8 @@ no_cached_page:
goto readpage;
}
+would_block:
+ error = -EAGAIN;
out:
ra->prev_pos = prev_index;
ra->prev_pos <<= PAGE_SHIFT;
@@ -2162,14 +2200,14 @@ out:
ssize_t
generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
- struct file *file = iocb->ki_filp;
- ssize_t retval = 0;
size_t count = iov_iter_count(iter);
+ ssize_t retval = 0;
if (!count)
goto out; /* skip atime */
if (iocb->ki_flags & IOCB_DIRECT) {
+ struct file *file = iocb->ki_filp;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
loff_t size;
@@ -2210,7 +2248,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
goto out;
}
- retval = do_generic_file_read(file, &iocb->ki_pos, iter, retval);
+ retval = generic_file_buffered_read(iocb, iter, retval);
out:
return retval;
}
@@ -2896,9 +2934,15 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
* we're writing. Either one is a pretty crazy thing to do,
* so we don't support it 100%. If this invalidation
* fails, tough, the write still worked...
+ *
+ * Most of the time we do not need this since dio_complete() will do
+ * the invalidation for us. However there are some file systems that
+ * do not end up with dio_complete() being called, so let's not break
+ * them by removing it completely
*/
- invalidate_inode_pages2_range(mapping,
- pos >> PAGE_SHIFT, end);
+ if (mapping->nrpages)
+ invalidate_inode_pages2_range(mapping,
+ pos >> PAGE_SHIFT, end);
if (written > 0) {
pos += written;
diff --git a/mm/ksm.c b/mm/ksm.c
index 15dd7415f7b3..6cb60f46cce5 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -1990,6 +1990,7 @@ static void stable_tree_append(struct rmap_item *rmap_item,
*/
static void cmp_and_merge_page(struct page *page, struct rmap_item *rmap_item)
{
+ struct mm_struct *mm = rmap_item->mm;
struct rmap_item *tree_rmap_item;
struct page *tree_page = NULL;
struct stable_node *stable_node;
@@ -2062,9 +2063,11 @@ static void cmp_and_merge_page(struct page *page, struct rmap_item *rmap_item)
if (ksm_use_zero_pages && (checksum == zero_checksum)) {
struct vm_area_struct *vma;
- vma = find_mergeable_vma(rmap_item->mm, rmap_item->address);
+ down_read(&mm->mmap_sem);
+ vma = find_mergeable_vma(mm, rmap_item->address);
err = try_to_merge_one_page(vma, page,
ZERO_PAGE(rmap_item->address));
+ up_read(&mm->mmap_sem);
/*
* In case of failure, the page was not really empty, so we
* need to continue. Otherwise we're done.
diff --git a/mm/list_lru.c b/mm/list_lru.c
index 7a40fa2be858..f141f0c80ff3 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -325,12 +325,12 @@ static int memcg_init_list_lru_node(struct list_lru_node *nlru)
{
int size = memcg_nr_cache_ids;
- nlru->memcg_lrus = kmalloc(size * sizeof(void *), GFP_KERNEL);
+ nlru->memcg_lrus = kvmalloc(size * sizeof(void *), GFP_KERNEL);
if (!nlru->memcg_lrus)
return -ENOMEM;
if (__memcg_init_list_lru_node(nlru->memcg_lrus, 0, size)) {
- kfree(nlru->memcg_lrus);
+ kvfree(nlru->memcg_lrus);
return -ENOMEM;
}
@@ -340,7 +340,7 @@ static int memcg_init_list_lru_node(struct list_lru_node *nlru)
static void memcg_destroy_list_lru_node(struct list_lru_node *nlru)
{
__memcg_destroy_list_lru_node(nlru->memcg_lrus, 0, memcg_nr_cache_ids);
- kfree(nlru->memcg_lrus);
+ kvfree(nlru->memcg_lrus);
}
static int memcg_update_list_lru_node(struct list_lru_node *nlru,
@@ -351,12 +351,12 @@ static int memcg_update_list_lru_node(struct list_lru_node *nlru,
BUG_ON(old_size > new_size);
old = nlru->memcg_lrus;
- new = kmalloc(new_size * sizeof(void *), GFP_KERNEL);
+ new = kvmalloc(new_size * sizeof(void *), GFP_KERNEL);
if (!new)
return -ENOMEM;
if (__memcg_init_list_lru_node(new, old_size, new_size)) {
- kfree(new);
+ kvfree(new);
return -ENOMEM;
}
@@ -373,7 +373,7 @@ static int memcg_update_list_lru_node(struct list_lru_node *nlru,
nlru->memcg_lrus = new;
spin_unlock_irq(&nlru->lock);
- kfree(old);
+ kvfree(old);
return 0;
}
diff --git a/mm/madvise.c b/mm/madvise.c
index 21261ff0466f..25bade36e9ca 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -625,18 +625,26 @@ static int madvise_inject_error(int behavior,
{
struct page *page;
struct zone *zone;
+ unsigned int order;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
- for (; start < end; start += PAGE_SIZE <<
- compound_order(compound_head(page))) {
+
+ for (; start < end; start += PAGE_SIZE << order) {
int ret;
ret = get_user_pages_fast(start, 1, 0, &page);
if (ret != 1)
return ret;
+ /*
+ * When soft offlining hugepages, after migrating the page
+ * we dissolve it, therefore in the second loop "page" will
+ * no longer be a compound page, and order will be 0.
+ */
+ order = compound_order(compound_head(page));
+
if (PageHWPoison(page)) {
put_page(page);
continue;
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 15af3da5af02..d5f3a62887cf 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1777,6 +1777,10 @@ static void drain_local_stock(struct work_struct *dummy)
struct memcg_stock_pcp *stock;
unsigned long flags;
+ /*
+ * The only protection from memory hotplug vs. drain_stock races is
+ * that we always operate on local CPU stock here with IRQ disabled
+ */
local_irq_save(flags);
stock = this_cpu_ptr(&memcg_stock);
@@ -1821,27 +1825,33 @@ static void drain_all_stock(struct mem_cgroup *root_memcg)
/* If someone's already draining, avoid adding running more workers. */
if (!mutex_trylock(&percpu_charge_mutex))
return;
- /* Notify other cpus that system-wide "drain" is running */
- get_online_cpus();
+ /*
+ * Notify other cpus that system-wide "drain" is running
+ * We do not care about races with the cpu hotplug because cpu down
+ * as well as workers from this path always operate on the local
+ * per-cpu data. CPU up doesn't touch memcg_stock at all.
+ */
curcpu = get_cpu();
for_each_online_cpu(cpu) {
struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu);
struct mem_cgroup *memcg;
memcg = stock->cached;
- if (!memcg || !stock->nr_pages)
+ if (!memcg || !stock->nr_pages || !css_tryget(&memcg->css))
continue;
- if (!mem_cgroup_is_descendant(memcg, root_memcg))
+ if (!mem_cgroup_is_descendant(memcg, root_memcg)) {
+ css_put(&memcg->css);
continue;
+ }
if (!test_and_set_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) {
if (cpu == curcpu)
drain_local_stock(&stock->work);
else
schedule_work_on(cpu, &stock->work);
}
+ css_put(&memcg->css);
}
put_cpu();
- put_online_cpus();
mutex_unlock(&percpu_charge_mutex);
}
@@ -5648,7 +5658,8 @@ static void uncharge_batch(const struct uncharge_gather *ug)
static void uncharge_page(struct page *page, struct uncharge_gather *ug)
{
VM_BUG_ON_PAGE(PageLRU(page), page);
- VM_BUG_ON_PAGE(!PageHWPoison(page) && page_count(page), page);
+ VM_BUG_ON_PAGE(page_count(page) && !is_zone_device_page(page) &&
+ !PageHWPoison(page) , page);
if (!page->mem_cgroup)
return;
diff --git a/mm/memory.c b/mm/memory.c
index ec4e15494901..a728bed16c20 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -845,7 +845,7 @@ struct page *_vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
* vm_normal_page() so that we do not have to special case all
* call site of vm_normal_page().
*/
- if (likely(pfn < highest_memmap_pfn)) {
+ if (likely(pfn <= highest_memmap_pfn)) {
struct page *page = pfn_to_page(pfn);
if (is_device_public_page(page)) {
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index e882cb6da994..d4b5f29906b9 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -328,6 +328,7 @@ int __ref __add_pages(int nid, unsigned long phys_start_pfn,
if (err && (err != -EEXIST))
break;
err = 0;
+ cond_resched();
}
vmemmap_populate_print_last();
out:
@@ -337,7 +338,7 @@ EXPORT_SYMBOL_GPL(__add_pages);
#ifdef CONFIG_MEMORY_HOTREMOVE
/* find the smallest valid pfn in the range [start_pfn, end_pfn) */
-static int find_smallest_section_pfn(int nid, struct zone *zone,
+static unsigned long find_smallest_section_pfn(int nid, struct zone *zone,
unsigned long start_pfn,
unsigned long end_pfn)
{
@@ -362,7 +363,7 @@ static int find_smallest_section_pfn(int nid, struct zone *zone,
}
/* find the biggest valid pfn in the range [start_pfn, end_pfn). */
-static int find_biggest_section_pfn(int nid, struct zone *zone,
+static unsigned long find_biggest_section_pfn(int nid, struct zone *zone,
unsigned long start_pfn,
unsigned long end_pfn)
{
@@ -550,7 +551,7 @@ static int __remove_section(struct zone *zone, struct mem_section *ms,
return ret;
scn_nr = __section_nr(ms);
- start_pfn = section_nr_to_pfn(scn_nr);
+ start_pfn = section_nr_to_pfn((unsigned long)scn_nr);
__remove_zone(zone, start_pfn);
sparse_remove_one_section(zone, ms, map_offset);
diff --git a/mm/nommu.c b/mm/nommu.c
index 53d5175a5c14..17c00d93de2e 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1164,17 +1164,12 @@ static int do_mmap_private(struct vm_area_struct *vma,
if (vma->vm_file) {
/* read the contents of a file into the copy */
- mm_segment_t old_fs;
loff_t fpos;
fpos = vma->vm_pgoff;
fpos <<= PAGE_SHIFT;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- ret = __vfs_read(vma->vm_file, base, len, &fpos);
- set_fs(old_fs);
-
+ ret = kernel_read(vma->vm_file, base, len, &fpos);
if (ret < 0)
goto error_free;
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 99736e026712..dee0f75c3013 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -40,6 +40,7 @@
#include <linux/ratelimit.h>
#include <linux/kthread.h>
#include <linux/init.h>
+#include <linux/mmu_notifier.h>
#include <asm/tlb.h>
#include "internal.h"
@@ -495,6 +496,21 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)
}
/*
+ * If the mm has notifiers then we would need to invalidate them around
+ * unmap_page_range and that is risky because notifiers can sleep and
+ * what they do is basically undeterministic. So let's have a short
+ * sleep to give the oom victim some more time.
+ * TODO: we really want to get rid of this ugly hack and make sure that
+ * notifiers cannot block for unbounded amount of time and add
+ * mmu_notifier_invalidate_range_{start,end} around unmap_page_range
+ */
+ if (mm_has_notifiers(mm)) {
+ up_read(&mm->mmap_sem);
+ schedule_timeout_idle(HZ);
+ goto unlock_oom;
+ }
+
+ /*
* MMF_OOM_SKIP is set by exit_mmap when the OOM reaper can't
* work on the mm anymore. The check for MMF_OOM_SKIP must run
* under mmap_sem for reading because it serializes against the
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index c841af88836a..77e4d3c5c57b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1190,7 +1190,7 @@ static void __meminit __init_single_pfn(unsigned long pfn, unsigned long zone,
}
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
-static void init_reserved_page(unsigned long pfn)
+static void __meminit init_reserved_page(unsigned long pfn)
{
pg_data_t *pgdat;
int nid, zid;
@@ -5367,6 +5367,7 @@ not_early:
__init_single_page(page, pfn, zone, nid);
set_pageblock_migratetype(page, MIGRATE_MOVABLE);
+ cond_resched();
} else {
__init_single_pfn(pfn, zone, nid);
}
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 8e2d7137510c..57abca62d4db 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -142,7 +142,7 @@ static noinline depot_stack_handle_t save_stack(gfp_t flags)
.nr_entries = 0,
.entries = entries,
.max_entries = PAGE_OWNER_STACK_DEPTH,
- .skip = 0
+ .skip = 2
};
depot_stack_handle_t handle;
diff --git a/mm/percpu-stats.c b/mm/percpu-stats.c
index 6142484e88f7..7a58460bfd27 100644
--- a/mm/percpu-stats.c
+++ b/mm/percpu-stats.c
@@ -73,7 +73,7 @@ static void chunk_map_stats(struct seq_file *m, struct pcpu_chunk *chunk,
last_alloc + 1 : 0;
as_len = 0;
- start = chunk->start_offset;
+ start = chunk->start_offset / PCPU_MIN_ALLOC_SIZE;
/*
* If a bit is set in the allocation map, the bound_map identifies
diff --git a/mm/percpu.c b/mm/percpu.c
index 59d44d61f5f1..aa121cef76de 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -353,6 +353,8 @@ static void pcpu_next_md_free_region(struct pcpu_chunk *chunk, int *bit_off,
block->contig_hint_start);
return;
}
+ /* reset to satisfy the second predicate above */
+ block_off = 0;
*bits = block->right_free;
*bit_off = (i + 1) * PCPU_BITMAP_BLOCK_BITS - block->right_free;
@@ -407,6 +409,8 @@ static void pcpu_next_fit_region(struct pcpu_chunk *chunk, int alloc_bits,
*bit_off = pcpu_block_off_to_off(i, block->first_free);
return;
}
+ /* reset to satisfy the second predicate above */
+ block_off = 0;
*bit_off = ALIGN(PCPU_BITMAP_BLOCK_BITS - block->right_free,
align);
diff --git a/mm/rodata_test.c b/mm/rodata_test.c
index 6bb4deb12e78..d908c8769b48 100644
--- a/mm/rodata_test.c
+++ b/mm/rodata_test.c
@@ -14,7 +14,7 @@
#include <linux/uaccess.h>
#include <asm/sections.h>
-const int rodata_test_data = 0xC3;
+static const int rodata_test_data = 0xC3;
void rodata_test(void)
{
diff --git a/mm/shmem.c b/mm/shmem.c
index ace53a582be5..07a1d22807be 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3685,7 +3685,7 @@ SYSCALL_DEFINE2(memfd_create,
if (len > MFD_NAME_MAX_LEN + 1)
return -EINVAL;
- name = kmalloc(len + MFD_NAME_PREFIX_LEN, GFP_TEMPORARY);
+ name = kmalloc(len + MFD_NAME_PREFIX_LEN, GFP_KERNEL);
if (!name)
return -ENOMEM;
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 904a83be82de..80164599ca5d 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -165,9 +165,9 @@ static int init_memcg_params(struct kmem_cache *s,
if (!memcg_nr_cache_ids)
return 0;
- arr = kzalloc(sizeof(struct memcg_cache_array) +
- memcg_nr_cache_ids * sizeof(void *),
- GFP_KERNEL);
+ arr = kvzalloc(sizeof(struct memcg_cache_array) +
+ memcg_nr_cache_ids * sizeof(void *),
+ GFP_KERNEL);
if (!arr)
return -ENOMEM;
@@ -178,15 +178,23 @@ static int init_memcg_params(struct kmem_cache *s,
static void destroy_memcg_params(struct kmem_cache *s)
{
if (is_root_cache(s))
- kfree(rcu_access_pointer(s->memcg_params.memcg_caches));
+ kvfree(rcu_access_pointer(s->memcg_params.memcg_caches));
+}
+
+static void free_memcg_params(struct rcu_head *rcu)
+{
+ struct memcg_cache_array *old;
+
+ old = container_of(rcu, struct memcg_cache_array, rcu);
+ kvfree(old);
}
static int update_memcg_params(struct kmem_cache *s, int new_array_size)
{
struct memcg_cache_array *old, *new;
- new = kzalloc(sizeof(struct memcg_cache_array) +
- new_array_size * sizeof(void *), GFP_KERNEL);
+ new = kvzalloc(sizeof(struct memcg_cache_array) +
+ new_array_size * sizeof(void *), GFP_KERNEL);
if (!new)
return -ENOMEM;
@@ -198,7 +206,7 @@ static int update_memcg_params(struct kmem_cache *s, int new_array_size)
rcu_assign_pointer(s->memcg_params.memcg_caches, new);
if (old)
- kfree_rcu(old, rcu);
+ call_rcu(&old->rcu, free_memcg_params);
return 0;
}
diff --git a/mm/slub.c b/mm/slub.c
index d39a5d3834b3..163352c537ab 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4597,7 +4597,7 @@ static int list_locations(struct kmem_cache *s, char *buf,
struct kmem_cache_node *n;
if (!map || !alloc_loc_track(&t, PAGE_SIZE / sizeof(struct location),
- GFP_TEMPORARY)) {
+ GFP_KERNEL)) {
kfree(map);
return sprintf(buf, "Out of memory\n");
}
diff --git a/mm/swap.c b/mm/swap.c
index 9295ae960d66..a77d68f2c1b6 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -575,7 +575,7 @@ static void lru_lazyfree_fn(struct page *page, struct lruvec *lruvec,
void *arg)
{
if (PageLRU(page) && PageAnon(page) && PageSwapBacked(page) &&
- !PageUnevictable(page)) {
+ !PageSwapCache(page) && !PageUnevictable(page)) {
bool active = PageActive(page);
del_page_from_lru_list(page, lruvec,
@@ -665,7 +665,7 @@ void deactivate_file_page(struct page *page)
void mark_page_lazyfree(struct page *page)
{
if (PageLRU(page) && PageAnon(page) && PageSwapBacked(page) &&
- !PageUnevictable(page)) {
+ !PageSwapCache(page) && !PageUnevictable(page)) {
struct pagevec *pvec = &get_cpu_var(lru_lazyfree_pvecs);
get_page(page);
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 71ce2d1ccbf7..ed91091d1e68 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -242,6 +242,17 @@ int add_to_swap(struct page *page)
* clear SWAP_HAS_CACHE flag.
*/
goto fail;
+ /*
+ * Normally the page will be dirtied in unmap because its pte should be
+ * dirty. A special case is MADV_FREE page. The page'e pte could have
+ * dirty bit cleared but the page's SwapBacked bit is still set because
+ * clearing the dirty bit and SwapBacked bit has no lock protected. For
+ * such page, unmap will not set dirty bit for it, so page reclaim will
+ * not write the page out. This can cause data corruption when the page
+ * is swap in later. Always setting the dirty bit for the page solves
+ * the problem.
+ */
+ set_page_dirty(page);
return 1;
diff --git a/mm/z3fold.c b/mm/z3fold.c
index 486550df32be..b2ba2ba585f3 100644
--- a/mm/z3fold.c
+++ b/mm/z3fold.c
@@ -250,6 +250,7 @@ static void __release_z3fold_page(struct z3fold_header *zhdr, bool locked)
WARN_ON(!list_empty(&zhdr->buddy));
set_bit(PAGE_STALE, &page->private);
+ clear_bit(NEEDS_COMPACTING, &page->private);
spin_lock(&pool->lock);
if (!list_empty(&page->lru))
list_del(&page->lru);
@@ -303,7 +304,6 @@ static void free_pages_work(struct work_struct *w)
list_del(&zhdr->buddy);
if (WARN_ON(!test_bit(PAGE_STALE, &page->private)))
continue;
- clear_bit(NEEDS_COMPACTING, &page->private);
spin_unlock(&pool->stale_lock);
cancel_work_sync(&zhdr->work);
free_z3fold_page(page);
@@ -624,10 +624,8 @@ lookup:
* stale pages list. cancel_work_sync() can sleep so we must make
* sure it won't be called in case we're in atomic context.
*/
- if (zhdr && (can_sleep || !work_pending(&zhdr->work) ||
- !unlikely(work_busy(&zhdr->work)))) {
+ if (zhdr && (can_sleep || !work_pending(&zhdr->work))) {
list_del(&zhdr->buddy);
- clear_bit(NEEDS_COMPACTING, &page->private);
spin_unlock(&pool->stale_lock);
if (can_sleep)
cancel_work_sync(&zhdr->work);
@@ -875,16 +873,18 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries)
goto next;
}
next:
+ spin_lock(&pool->lock);
if (test_bit(PAGE_HEADLESS, &page->private)) {
if (ret == 0) {
+ spin_unlock(&pool->lock);
free_z3fold_page(page);
return 0;
}
} else if (kref_put(&zhdr->refcount, release_z3fold_page)) {
atomic64_dec(&pool->pages_nr);
+ spin_unlock(&pool->lock);
return 0;
}
- spin_lock(&pool->lock);
/*
* Add to the beginning of LRU.
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
index e2ed69850489..0bc31de9071a 100644
--- a/net/8021q/vlan_core.c
+++ b/net/8021q/vlan_core.c
@@ -21,6 +21,12 @@ bool vlan_do_receive(struct sk_buff **skbp)
if (unlikely(!skb))
return false;
+ if (unlikely(!(vlan_dev->flags & IFF_UP))) {
+ kfree_skb(skb);
+ *skbp = NULL;
+ return false;
+ }
+
skb->dev = vlan_dev;
if (unlikely(skb->pkt_type == PACKET_OTHERHOST)) {
/* Our lower layer thinks this is not local, let's make sure.
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index ddfa86648f95..903a190319b9 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -272,6 +272,7 @@ static int p9_fd_read(struct p9_client *client, void *v, int len)
{
int ret;
struct p9_trans_fd *ts = NULL;
+ loff_t pos;
if (client && client->status != Disconnected)
ts = client->trans;
@@ -282,7 +283,8 @@ static int p9_fd_read(struct p9_client *client, void *v, int len)
if (!(ts->rd->f_flags & O_NONBLOCK))
p9_debug(P9_DEBUG_ERROR, "blocking read ...\n");
- ret = kernel_read(ts->rd, ts->rd->f_pos, v, len);
+ pos = ts->rd->f_pos;
+ ret = kernel_read(ts->rd, v, len, &pos);
if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
client->status = Disconnected;
return ret;
@@ -420,8 +422,7 @@ error:
static int p9_fd_write(struct p9_client *client, void *v, int len)
{
- int ret;
- mm_segment_t oldfs;
+ ssize_t ret;
struct p9_trans_fd *ts = NULL;
if (client && client->status != Disconnected)
@@ -433,12 +434,7 @@ static int p9_fd_write(struct p9_client *client, void *v, int len)
if (!(ts->wr->f_flags & O_NONBLOCK))
p9_debug(P9_DEBUG_ERROR, "blocking write ...\n");
- oldfs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- ret = vfs_write(ts->wr, (__force void __user *)v, len, &ts->wr->f_pos);
- set_fs(oldfs);
-
+ ret = kernel_write(ts->wr, v, len, &ts->wr->f_pos);
if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
client->status = Disconnected;
return ret;
diff --git a/net/bluetooth/Kconfig b/net/bluetooth/Kconfig
index c18115d22f00..db82a40875e8 100644
--- a/net/bluetooth/Kconfig
+++ b/net/bluetooth/Kconfig
@@ -126,14 +126,4 @@ config BT_DEBUGFS
Provide extensive information about internal Bluetooth states
in debugfs.
-config BT_LEGACY_IOCTL
- bool "Enable legacy ioctl interfaces"
- depends on BT && BT_BREDR
- default y
- help
- Enable support for legacy ioctl interfaces. This is only needed
- for old and deprecated applications using direct ioctl calls for
- controller management. Since Linux 3.4 all configuration and
- setup is done via mgmt interface and this is no longer needed.
-
source "drivers/bluetooth/Kconfig"
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index 0bad296fe0af..65d734c165bd 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -878,7 +878,6 @@ static int hci_sock_release(struct socket *sock)
return 0;
}
-#ifdef CONFIG_BT_LEGACY_IOCTL
static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
{
bdaddr_t bdaddr;
@@ -1050,7 +1049,6 @@ done:
release_sock(sk);
return err;
}
-#endif
static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
int addr_len)
@@ -1971,11 +1969,7 @@ static const struct proto_ops hci_sock_ops = {
.getname = hci_sock_getname,
.sendmsg = hci_sock_sendmsg,
.recvmsg = hci_sock_recvmsg,
-#ifdef CONFIG_BT_LEGACY_IOCTL
.ioctl = hci_sock_ioctl,
-#else
- .ioctl = sock_no_ioctl,
-#endif
.poll = datagram_poll,
.listen = sock_no_listen,
.shutdown = sock_no_shutdown,
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 303c779bfe38..43ba91c440bc 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -58,7 +58,7 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
u8 code, u8 ident, u16 dlen, void *data);
static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
void *data);
-static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
+static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size);
static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
@@ -1473,7 +1473,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
set_bit(CONF_REQ_SENT, &chan->conf_state);
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf), buf);
+ l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
chan->num_conf_req++;
}
@@ -2987,12 +2987,15 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
return len;
}
-static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
+static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val, size_t size)
{
struct l2cap_conf_opt *opt = *ptr;
BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
+ if (size < L2CAP_CONF_OPT_SIZE + len)
+ return;
+
opt->type = type;
opt->len = len;
@@ -3017,7 +3020,7 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
*ptr += L2CAP_CONF_OPT_SIZE + len;
}
-static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
+static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size)
{
struct l2cap_conf_efs efs;
@@ -3045,7 +3048,7 @@ static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
}
l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
- (unsigned long) &efs);
+ (unsigned long) &efs, size);
}
static void l2cap_ack_timeout(struct work_struct *work)
@@ -3191,11 +3194,12 @@ static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
chan->ack_win = chan->tx_win;
}
-static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
+static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
{
struct l2cap_conf_req *req = data;
struct l2cap_conf_rfc rfc = { .mode = chan->mode };
void *ptr = req->data;
+ void *endptr = data + data_size;
u16 size;
BT_DBG("chan %p", chan);
@@ -3220,7 +3224,7 @@ static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
done:
if (chan->imtu != L2CAP_DEFAULT_MTU)
- l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
+ l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, endptr - ptr);
switch (chan->mode) {
case L2CAP_MODE_BASIC:
@@ -3239,7 +3243,7 @@ done:
rfc.max_pdu_size = 0;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
- (unsigned long) &rfc);
+ (unsigned long) &rfc, endptr - ptr);
break;
case L2CAP_MODE_ERTM:
@@ -3259,21 +3263,21 @@ done:
L2CAP_DEFAULT_TX_WINDOW);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
- (unsigned long) &rfc);
+ (unsigned long) &rfc, endptr - ptr);
if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
- l2cap_add_opt_efs(&ptr, chan);
+ l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
if (test_bit(FLAG_EXT_CTRL, &chan->flags))
l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
- chan->tx_win);
+ chan->tx_win, endptr - ptr);
if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
if (chan->fcs == L2CAP_FCS_NONE ||
test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
chan->fcs = L2CAP_FCS_NONE;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
- chan->fcs);
+ chan->fcs, endptr - ptr);
}
break;
@@ -3291,17 +3295,17 @@ done:
rfc.max_pdu_size = cpu_to_le16(size);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
- (unsigned long) &rfc);
+ (unsigned long) &rfc, endptr - ptr);
if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
- l2cap_add_opt_efs(&ptr, chan);
+ l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
if (chan->fcs == L2CAP_FCS_NONE ||
test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
chan->fcs = L2CAP_FCS_NONE;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
- chan->fcs);
+ chan->fcs, endptr - ptr);
}
break;
}
@@ -3312,10 +3316,11 @@ done:
return ptr - data;
}
-static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
+static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
{
struct l2cap_conf_rsp *rsp = data;
void *ptr = rsp->data;
+ void *endptr = data + data_size;
void *req = chan->conf_req;
int len = chan->conf_len;
int type, hint, olen;
@@ -3417,7 +3422,7 @@ done:
return -ECONNREFUSED;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
- (unsigned long) &rfc);
+ (unsigned long) &rfc, endptr - ptr);
}
if (result == L2CAP_CONF_SUCCESS) {
@@ -3430,7 +3435,7 @@ done:
chan->omtu = mtu;
set_bit(CONF_MTU_DONE, &chan->conf_state);
}
- l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
+ l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr);
if (remote_efs) {
if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
@@ -3444,7 +3449,7 @@ done:
l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
sizeof(efs),
- (unsigned long) &efs);
+ (unsigned long) &efs, endptr - ptr);
} else {
/* Send PENDING Conf Rsp */
result = L2CAP_CONF_PENDING;
@@ -3477,7 +3482,7 @@ done:
set_bit(CONF_MODE_DONE, &chan->conf_state);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
- sizeof(rfc), (unsigned long) &rfc);
+ sizeof(rfc), (unsigned long) &rfc, endptr - ptr);
if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
chan->remote_id = efs.id;
@@ -3491,7 +3496,7 @@ done:
le32_to_cpu(efs.sdu_itime);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
sizeof(efs),
- (unsigned long) &efs);
+ (unsigned long) &efs, endptr - ptr);
}
break;
@@ -3505,7 +3510,7 @@ done:
set_bit(CONF_MODE_DONE, &chan->conf_state);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
- (unsigned long) &rfc);
+ (unsigned long) &rfc, endptr - ptr);
break;
@@ -3527,10 +3532,11 @@ done:
}
static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
- void *data, u16 *result)
+ void *data, size_t size, u16 *result)
{
struct l2cap_conf_req *req = data;
void *ptr = req->data;
+ void *endptr = data + size;
int type, olen;
unsigned long val;
struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
@@ -3548,13 +3554,13 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
chan->imtu = L2CAP_DEFAULT_MIN_MTU;
} else
chan->imtu = val;
- l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
+ l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, endptr - ptr);
break;
case L2CAP_CONF_FLUSH_TO:
chan->flush_to = val;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
- 2, chan->flush_to);
+ 2, chan->flush_to, endptr - ptr);
break;
case L2CAP_CONF_RFC:
@@ -3568,13 +3574,13 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
chan->fcs = 0;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
- sizeof(rfc), (unsigned long) &rfc);
+ sizeof(rfc), (unsigned long) &rfc, endptr - ptr);
break;
case L2CAP_CONF_EWS:
chan->ack_win = min_t(u16, val, chan->ack_win);
l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
- chan->tx_win);
+ chan->tx_win, endptr - ptr);
break;
case L2CAP_CONF_EFS:
@@ -3587,7 +3593,7 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
return -ECONNREFUSED;
l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
- (unsigned long) &efs);
+ (unsigned long) &efs, endptr - ptr);
break;
case L2CAP_CONF_FCS:
@@ -3692,7 +3698,7 @@ void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
return;
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf), buf);
+ l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
chan->num_conf_req++;
}
@@ -3900,7 +3906,7 @@ sendresp:
u8 buf[128];
set_bit(CONF_REQ_SENT, &chan->conf_state);
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf), buf);
+ l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
chan->num_conf_req++;
}
@@ -3978,7 +3984,7 @@ static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
break;
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, req), req);
+ l2cap_build_conf_req(chan, req, sizeof(req)), req);
chan->num_conf_req++;
break;
@@ -4090,7 +4096,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
}
/* Complete config. */
- len = l2cap_parse_conf_req(chan, rsp);
+ len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp));
if (len < 0) {
l2cap_send_disconn_req(chan, ECONNRESET);
goto unlock;
@@ -4124,7 +4130,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
u8 buf[64];
l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf), buf);
+ l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
chan->num_conf_req++;
}
@@ -4184,7 +4190,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn,
char buf[64];
len = l2cap_parse_conf_rsp(chan, rsp->data, len,
- buf, &result);
+ buf, sizeof(buf), &result);
if (len < 0) {
l2cap_send_disconn_req(chan, ECONNRESET);
goto done;
@@ -4214,7 +4220,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn,
/* throw out any old stored conf requests */
result = L2CAP_CONF_SUCCESS;
len = l2cap_parse_conf_rsp(chan, rsp->data, len,
- req, &result);
+ req, sizeof(req), &result);
if (len < 0) {
l2cap_send_disconn_req(chan, ECONNRESET);
goto done;
@@ -4791,7 +4797,7 @@ static void l2cap_do_create(struct l2cap_chan *chan, int result,
set_bit(CONF_REQ_SENT, &chan->conf_state);
l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf), buf);
+ l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
chan->num_conf_req++;
}
}
@@ -7465,7 +7471,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
set_bit(CONF_REQ_SENT, &chan->conf_state);
l2cap_send_cmd(conn, l2cap_get_ident(conn),
L2CAP_CONF_REQ,
- l2cap_build_conf_req(chan, buf),
+ l2cap_build_conf_req(chan, buf, sizeof(buf)),
buf);
chan->num_conf_req++;
}
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index 875675765531..63edc6e5f026 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -676,7 +676,8 @@ bad:
/*
* Do a synchronous statfs().
*/
-int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
+int ceph_monc_do_statfs(struct ceph_mon_client *monc, u64 data_pool,
+ struct ceph_statfs *buf)
{
struct ceph_mon_generic_request *req;
struct ceph_mon_statfs *h;
@@ -696,6 +697,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
goto out;
req->u.st = buf;
+ req->request->hdr.version = cpu_to_le16(2);
mutex_lock(&monc->mutex);
register_generic_request(req);
@@ -705,6 +707,8 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
h->monhdr.session_mon = cpu_to_le16(-1);
h->monhdr.session_mon_tid = 0;
h->fsid = monc->monmap->fsid;
+ h->contains_data_pool = (data_pool != CEPH_NOPOOL);
+ h->data_pool = cpu_to_le64(data_pool);
send_generic_request(monc, req);
mutex_unlock(&monc->mutex);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index dcfbdd74dfd1..e02f01f534e2 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -863,8 +863,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst,
dst->cls.method_len = src->cls.method_len;
dst->cls.indata_len = cpu_to_le32(src->cls.indata_len);
break;
- case CEPH_OSD_OP_STARTSYNC:
- break;
case CEPH_OSD_OP_WATCH:
dst->watch.cookie = cpu_to_le64(src->watch.cookie);
dst->watch.ver = cpu_to_le64(0);
@@ -916,9 +914,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst,
* if the file was recently truncated, we include information about its
* old and new size so that the object can be updated appropriately. (we
* avoid synchronously deleting truncated objects because it's slow.)
- *
- * if @do_sync, include a 'startsync' command so that the osd will flush
- * data quickly.
*/
struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
struct ceph_file_layout *layout,
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index f358d0bfa76b..79d14d70b7ea 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -2445,19 +2445,34 @@ static void apply_upmap(struct ceph_osdmap *osdmap,
pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid);
if (pg) {
- for (i = 0; i < raw->size; i++) {
- for (j = 0; j < pg->pg_upmap_items.len; j++) {
- int from = pg->pg_upmap_items.from_to[j][0];
- int to = pg->pg_upmap_items.from_to[j][1];
-
- if (from == raw->osds[i]) {
- if (!(to != CRUSH_ITEM_NONE &&
- to < osdmap->max_osd &&
- osdmap->osd_weight[to] == 0))
- raw->osds[i] = to;
+ /*
+ * Note: this approach does not allow a bidirectional swap,
+ * e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1].
+ */
+ for (i = 0; i < pg->pg_upmap_items.len; i++) {
+ int from = pg->pg_upmap_items.from_to[i][0];
+ int to = pg->pg_upmap_items.from_to[i][1];
+ int pos = -1;
+ bool exists = false;
+
+ /* make sure replacement doesn't already appear */
+ for (j = 0; j < raw->size; j++) {
+ int osd = raw->osds[j];
+
+ if (osd == to) {
+ exists = true;
break;
}
+ /* ignore mapping if target is marked out */
+ if (osd == from && pos < 0 &&
+ !(to != CRUSH_ITEM_NONE &&
+ to < osdmap->max_osd &&
+ osdmap->osd_weight[to] == 0)) {
+ pos = j;
+ }
}
+ if (!exists && pos >= 0)
+ raw->osds[pos] = to;
}
}
}
diff --git a/net/compat.c b/net/compat.c
index 6ded6c821d7a..22381719718c 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -185,6 +185,13 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg, struct sock *sk,
ucmsg = cmsg_compat_nxthdr(kmsg, ucmsg, ucmlen);
}
+ /*
+ * check the length of messages copied in is the same as the
+ * what we get from the first loop
+ */
+ if ((char *)kcmsg - (char *)kcmsg_base != kcmlen)
+ goto Einval;
+
/* Ok, looks like we made it. Hook it up and return success. */
kmsg->msg_control = kcmsg_base;
kmsg->msg_controllen = kcmlen;
diff --git a/net/core/dev.c b/net/core/dev.c
index fb766d906148..588b473194a8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1948,8 +1948,12 @@ again:
goto again;
}
out_unlock:
- if (pt_prev)
- pt_prev->func(skb2, skb->dev, pt_prev, skb->dev);
+ if (pt_prev) {
+ if (!skb_orphan_frags_rx(skb2, GFP_ATOMIC))
+ pt_prev->func(skb2, skb->dev, pt_prev, skb->dev);
+ else
+ kfree_skb(skb2);
+ }
rcu_read_unlock();
}
EXPORT_SYMBOL_GPL(dev_queue_xmit_nit);
@@ -3892,6 +3896,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
__skb_pull(skb, off);
else if (off < 0)
__skb_push(skb, -off);
+ skb->mac_header += off;
switch (act) {
case XDP_REDIRECT:
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 6a582ae4c5d9..3228411ada0f 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -525,6 +525,8 @@ convert_link_ksettings_to_legacy_settings(
= link_ksettings->base.eth_tp_mdix;
legacy_settings->eth_tp_mdix_ctrl
= link_ksettings->base.eth_tp_mdix_ctrl;
+ legacy_settings->transceiver
+ = link_ksettings->base.transceiver;
return retval;
}
diff --git a/net/core/filter.c b/net/core/filter.c
index 3a50a9b021e2..74b8c91fb5f4 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -989,10 +989,14 @@ static bool __sk_filter_charge(struct sock *sk, struct sk_filter *fp)
bool sk_filter_charge(struct sock *sk, struct sk_filter *fp)
{
- bool ret = __sk_filter_charge(sk, fp);
- if (ret)
- refcount_inc(&fp->refcnt);
- return ret;
+ if (!refcount_inc_not_zero(&fp->refcnt))
+ return false;
+
+ if (!__sk_filter_charge(sk, fp)) {
+ sk_filter_release(fp);
+ return false;
+ }
+ return true;
}
static struct bpf_prog *bpf_migrate_filter(struct bpf_prog *fp)
@@ -1794,7 +1798,7 @@ struct redirect_info {
u32 flags;
struct bpf_map *map;
struct bpf_map *map_to_flush;
- const struct bpf_prog *map_owner;
+ unsigned long map_owner;
};
static DEFINE_PER_CPU(struct redirect_info, redirect_info);
@@ -2500,27 +2504,31 @@ void xdp_do_flush_map(void)
}
EXPORT_SYMBOL_GPL(xdp_do_flush_map);
+static inline bool xdp_map_invalid(const struct bpf_prog *xdp_prog,
+ unsigned long aux)
+{
+ return (unsigned long)xdp_prog->aux != aux;
+}
+
static int xdp_do_redirect_map(struct net_device *dev, struct xdp_buff *xdp,
struct bpf_prog *xdp_prog)
{
struct redirect_info *ri = this_cpu_ptr(&redirect_info);
- const struct bpf_prog *map_owner = ri->map_owner;
+ unsigned long map_owner = ri->map_owner;
struct bpf_map *map = ri->map;
+ struct net_device *fwd = NULL;
u32 index = ri->ifindex;
- struct net_device *fwd;
int err;
ri->ifindex = 0;
ri->map = NULL;
- ri->map_owner = NULL;
+ ri->map_owner = 0;
- /* This is really only caused by a deliberately crappy
- * BPF program, normally we would never hit that case,
- * so no need to inform someone via tracepoints either,
- * just bail out.
- */
- if (unlikely(map_owner != xdp_prog))
- return -EINVAL;
+ if (unlikely(xdp_map_invalid(xdp_prog, map_owner))) {
+ err = -EFAULT;
+ map = NULL;
+ goto err;
+ }
fwd = __dev_map_lookup_elem(map, index);
if (!fwd) {
@@ -2576,13 +2584,27 @@ int xdp_do_generic_redirect(struct net_device *dev, struct sk_buff *skb,
struct bpf_prog *xdp_prog)
{
struct redirect_info *ri = this_cpu_ptr(&redirect_info);
+ unsigned long map_owner = ri->map_owner;
+ struct bpf_map *map = ri->map;
+ struct net_device *fwd = NULL;
u32 index = ri->ifindex;
- struct net_device *fwd;
unsigned int len;
int err = 0;
- fwd = dev_get_by_index_rcu(dev_net(dev), index);
ri->ifindex = 0;
+ ri->map = NULL;
+ ri->map_owner = 0;
+
+ if (map) {
+ if (unlikely(xdp_map_invalid(xdp_prog, map_owner))) {
+ err = -EFAULT;
+ map = NULL;
+ goto err;
+ }
+ fwd = __dev_map_lookup_elem(map, index);
+ } else {
+ fwd = dev_get_by_index_rcu(dev_net(dev), index);
+ }
if (unlikely(!fwd)) {
err = -EINVAL;
goto err;
@@ -2600,10 +2622,12 @@ int xdp_do_generic_redirect(struct net_device *dev, struct sk_buff *skb,
}
skb->dev = fwd;
- _trace_xdp_redirect(dev, xdp_prog, index);
+ map ? _trace_xdp_redirect_map(dev, xdp_prog, fwd, map, index)
+ : _trace_xdp_redirect(dev, xdp_prog, index);
return 0;
err:
- _trace_xdp_redirect_err(dev, xdp_prog, index, err);
+ map ? _trace_xdp_redirect_map_err(dev, xdp_prog, fwd, map, index, err)
+ : _trace_xdp_redirect_err(dev, xdp_prog, index, err);
return err;
}
EXPORT_SYMBOL_GPL(xdp_do_generic_redirect);
@@ -2618,7 +2642,7 @@ BPF_CALL_2(bpf_xdp_redirect, u32, ifindex, u64, flags)
ri->ifindex = ifindex;
ri->flags = flags;
ri->map = NULL;
- ri->map_owner = NULL;
+ ri->map_owner = 0;
return XDP_REDIRECT;
}
@@ -2632,7 +2656,7 @@ static const struct bpf_func_proto bpf_xdp_redirect_proto = {
};
BPF_CALL_4(bpf_xdp_redirect_map, struct bpf_map *, map, u32, ifindex, u64, flags,
- const struct bpf_prog *, map_owner)
+ unsigned long, map_owner)
{
struct redirect_info *ri = this_cpu_ptr(&redirect_info);
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c
index 0385dece1f6f..7c1ffd6f9501 100644
--- a/net/core/gen_estimator.c
+++ b/net/core/gen_estimator.c
@@ -83,10 +83,10 @@ static void est_timer(unsigned long arg)
u64 rate, brate;
est_fetch_counters(est, &b);
- brate = (b.bytes - est->last_bytes) << (8 - est->ewma_log);
+ brate = (b.bytes - est->last_bytes) << (10 - est->ewma_log - est->intvl_log);
brate -= (est->avbps >> est->ewma_log);
- rate = (u64)(b.packets - est->last_packets) << (8 - est->ewma_log);
+ rate = (u64)(b.packets - est->last_packets) << (10 - est->ewma_log - est->intvl_log);
rate -= (est->avpps >> est->ewma_log);
write_seqcount_begin(&est->seq);
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index a78fd61da0ec..d4bcdcc68e92 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -3854,6 +3854,9 @@ static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev,
return -EMSGSIZE;
ifsm = nlmsg_data(nlh);
+ ifsm->family = PF_UNSPEC;
+ ifsm->pad1 = 0;
+ ifsm->pad2 = 0;
ifsm->ifindex = dev->ifindex;
ifsm->filter_mask = filter_mask;
diff --git a/net/core/sock.c b/net/core/sock.c
index 9b7b6bbb2a23..23953b741a41 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1654,6 +1654,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
sock_copy(newsk, sk);
+ newsk->sk_prot_creator = sk->sk_prot;
+
/* SANITY */
if (likely(newsk->sk_net_refcnt))
get_net(sock_net(newsk));
@@ -1682,13 +1684,16 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
sock_reset_flag(newsk, SOCK_DONE);
- filter = rcu_dereference_protected(newsk->sk_filter, 1);
+ rcu_read_lock();
+ filter = rcu_dereference(sk->sk_filter);
if (filter != NULL)
/* though it's an empty new sock, the charging may fail
* if sysctl_optmem_max was changed between creation of
* original socket and cloning
*/
is_charged = sk_filter_charge(newsk, filter);
+ RCU_INIT_POINTER(newsk->sk_filter, filter);
+ rcu_read_unlock();
if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) {
/* We need to make sure that we don't uncharge the new
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 2afa99506f8b..865e29e62bad 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1301,28 +1301,33 @@ int dsa_slave_create(struct dsa_port *port, const char *name)
p->old_duplex = -1;
port->netdev = slave_dev;
- ret = register_netdev(slave_dev);
- if (ret) {
- netdev_err(master, "error %d registering interface %s\n",
- ret, slave_dev->name);
- port->netdev = NULL;
- free_percpu(p->stats64);
- free_netdev(slave_dev);
- return ret;
- }
netif_carrier_off(slave_dev);
ret = dsa_slave_phy_setup(p, slave_dev);
if (ret) {
netdev_err(master, "error %d setting up slave phy\n", ret);
- unregister_netdev(slave_dev);
- free_percpu(p->stats64);
- free_netdev(slave_dev);
- return ret;
+ goto out_free;
+ }
+
+ ret = register_netdev(slave_dev);
+ if (ret) {
+ netdev_err(master, "error %d registering interface %s\n",
+ ret, slave_dev->name);
+ goto out_phy;
}
return 0;
+
+out_phy:
+ phy_disconnect(p->phy);
+ if (of_phy_is_fixed_link(p->dp->dn))
+ of_phy_deregister_fixed_link(p->dp->dn);
+out_free:
+ free_percpu(p->stats64);
+ free_netdev(slave_dev);
+ port->netdev = NULL;
+ return ret;
}
void dsa_slave_destroy(struct net_device *slave_dev)
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
index 416bb304a281..1859c473b21a 100644
--- a/net/ipv4/gre_offload.c
+++ b/net/ipv4/gre_offload.c
@@ -86,7 +86,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
greh = (struct gre_base_hdr *)skb_transport_header(skb);
pcsum = (__sum16 *)(greh + 1);
- if (gso_partial) {
+ if (gso_partial && skb_is_gso(skb)) {
unsigned int partial_adj;
/* Adjust checksum to account for the fact that
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 4089c013cb03..c039c937ba90 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -266,7 +266,7 @@ static inline int sk_reuseport_match(struct inet_bind_bucket *tb,
#if IS_ENABLED(CONFIG_IPV6)
if (tb->fast_sk_family == AF_INET6)
return ipv6_rcv_saddr_equal(&tb->fast_v6_rcv_saddr,
- &sk->sk_v6_rcv_saddr,
+ inet6_rcv_saddr(sk),
tb->fast_rcv_saddr,
sk->sk_rcv_saddr,
tb->fast_ipv6_only,
@@ -321,13 +321,14 @@ tb_found:
goto fail_unlock;
}
success:
- if (!hlist_empty(&tb->owners)) {
+ if (hlist_empty(&tb->owners)) {
tb->fastreuse = reuse;
if (sk->sk_reuseport) {
tb->fastreuseport = FASTREUSEPORT_ANY;
tb->fastuid = uid;
tb->fast_rcv_saddr = sk->sk_rcv_saddr;
tb->fast_ipv6_only = ipv6_only_sock(sk);
+ tb->fast_sk_family = sk->sk_family;
#if IS_ENABLED(CONFIG_IPV6)
tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
#endif
@@ -354,6 +355,7 @@ success:
tb->fastuid = uid;
tb->fast_rcv_saddr = sk->sk_rcv_saddr;
tb->fast_ipv6_only = ipv6_only_sock(sk);
+ tb->fast_sk_family = sk->sk_family;
#if IS_ENABLED(CONFIG_IPV6)
tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
#endif
@@ -916,7 +918,6 @@ static void inet_child_forget(struct sock *sk, struct request_sock *req,
tcp_sk(child)->fastopen_rsk = NULL;
}
inet_csk_destroy_sock(child);
- reqsk_put(req);
}
struct sock *inet_csk_reqsk_queue_add(struct sock *sk,
@@ -987,6 +988,7 @@ void inet_csk_listen_stop(struct sock *sk)
sock_hold(child);
inet_child_forget(sk, req, child);
+ reqsk_put(req);
bh_unlock_sock(child);
local_bh_enable();
sock_put(child);
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c
index e7eb590c86ce..b20c8ac64081 100644
--- a/net/ipv4/inetpeer.c
+++ b/net/ipv4/inetpeer.c
@@ -128,9 +128,9 @@ static struct inet_peer *lookup(const struct inetpeer_addr *daddr,
break;
}
if (cmp == -1)
- pp = &(*pp)->rb_left;
+ pp = &next->rb_left;
else
- pp = &(*pp)->rb_right;
+ pp = &next->rb_right;
}
*parent_p = parent;
*pp_p = pp;
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 0162fb955b33..467e44d7587d 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -259,7 +259,6 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
struct ip_tunnel *tunnel;
struct erspanhdr *ershdr;
const struct iphdr *iph;
- __be32 session_id;
__be32 index;
int len;
@@ -275,8 +274,7 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,
/* The original GRE header does not have key field,
* Use ERSPAN 10-bit session ID as key.
*/
- session_id = cpu_to_be32(ntohs(ershdr->session_id));
- tpi->key = session_id;
+ tpi->key = cpu_to_be32(ntohs(ershdr->session_id) & ID_MASK);
index = ershdr->md.index;
tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex,
tpi->flags | TUNNEL_KEY,
@@ -733,7 +731,7 @@ static netdev_tx_t erspan_xmit(struct sk_buff *skb,
if (skb_cow_head(skb, dev->needed_headroom))
goto free_skb;
- if (skb->len > dev->mtu) {
+ if (skb->len - dev->hard_header_len > dev->mtu) {
pskb_trim(skb, dev->mtu);
truncate = true;
}
@@ -1223,6 +1221,7 @@ static int gre_tap_init(struct net_device *dev)
{
__gre_tunnel_init(dev);
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+ netif_keep_dst(dev);
return ip_tunnel_init(dev);
}
@@ -1246,13 +1245,16 @@ static int erspan_tunnel_init(struct net_device *dev)
tunnel->tun_hlen = 8;
tunnel->parms.iph.protocol = IPPROTO_GRE;
- t_hlen = tunnel->hlen + sizeof(struct iphdr) + sizeof(struct erspanhdr);
+ tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen +
+ sizeof(struct erspanhdr);
+ t_hlen = tunnel->hlen + sizeof(struct iphdr);
dev->needed_headroom = LL_MAX_HEADER + t_hlen + 4;
dev->mtu = ETH_DATA_LEN - t_hlen - 4;
dev->features |= GRE_FEATURES;
dev->hw_features |= GRE_FEATURES;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+ netif_keep_dst(dev);
return ip_tunnel_init(dev);
}
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
index fa2dc8f692c6..57fc13c6ab2b 100644
--- a/net/ipv4/ip_input.c
+++ b/net/ipv4/ip_input.c
@@ -311,9 +311,10 @@ drop:
static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
const struct iphdr *iph = ip_hdr(skb);
- struct rtable *rt;
+ int (*edemux)(struct sk_buff *skb);
struct net_device *dev = skb->dev;
- void (*edemux)(struct sk_buff *skb);
+ struct rtable *rt;
+ int err;
/* if ingress device is enslaved to an L3 master device pass the
* skb to its handler for processing
@@ -331,7 +332,9 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
ipprot = rcu_dereference(inet_protos[protocol]);
if (ipprot && (edemux = READ_ONCE(ipprot->early_demux))) {
- edemux(skb);
+ err = edemux(skb);
+ if (unlikely(err))
+ goto drop_error;
/* must reload iph, skb->head might have changed */
iph = ip_hdr(skb);
}
@@ -342,13 +345,10 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
* how the packet travels inside Linux networking.
*/
if (!skb_valid_dst(skb)) {
- int err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
- iph->tos, dev);
- if (unlikely(err)) {
- if (err == -EXDEV)
- __NET_INC_STATS(net, LINUX_MIB_IPRPFILTER);
- goto drop;
- }
+ err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
+ iph->tos, dev);
+ if (unlikely(err))
+ goto drop_error;
}
#ifdef CONFIG_IP_ROUTE_CLASSID
@@ -399,6 +399,11 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
drop:
kfree_skb(skb);
return NET_RX_DROP;
+
+drop_error:
+ if (err == -EXDEV)
+ __NET_INC_STATS(net, LINUX_MIB_IPRPFILTER);
+ goto drop;
}
/*
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index e558e4f9597b..a599aa83fdad 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -1207,7 +1207,6 @@ e_inval:
void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
{
struct in_pktinfo *pktinfo = PKTINFO_SKB_CB(skb);
- bool l3slave = ipv4_l3mdev_skb(IPCB(skb)->flags);
bool prepare = (inet_sk(sk)->cmsg_flags & IP_CMSG_PKTINFO) ||
ipv6_sk_rxinfo(sk);
@@ -1221,8 +1220,13 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
* (e.g., process binds socket to eth0 for Tx which is
* redirected to loopback in the rtable/dst).
*/
- if (pktinfo->ipi_ifindex == LOOPBACK_IFINDEX || l3slave)
+ struct rtable *rt = skb_rtable(skb);
+ bool l3slave = ipv4_l3mdev_skb(IPCB(skb)->flags);
+
+ if (pktinfo->ipi_ifindex == LOOPBACK_IFINDEX)
pktinfo->ipi_ifindex = inet_iif(skb);
+ else if (l3slave && rt && rt->rt_iif)
+ pktinfo->ipi_ifindex = rt->rt_iif;
pktinfo->ipi_spec_dst.s_addr = fib_compute_spec_dst(skb);
} else {
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index e1856bfa753d..e9805ad664ac 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -176,7 +176,7 @@ skip_key_lookup:
return cand;
t = rcu_dereference(itn->collect_md_tun);
- if (t)
+ if (t && t->dev->flags & IFF_UP)
return t;
if (itn->fb_tunnel_dev && itn->fb_tunnel_dev->flags & IFF_UP)
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
index 5ed63d250950..89453cf62158 100644
--- a/net/ipv4/ip_vti.c
+++ b/net/ipv4/ip_vti.c
@@ -168,6 +168,7 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,
struct ip_tunnel_parm *parms = &tunnel->parms;
struct dst_entry *dst = skb_dst(skb);
struct net_device *tdev; /* Device to other host */
+ int pkt_len = skb->len;
int err;
int mtu;
@@ -229,7 +230,7 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,
err = dst_output(tunnel->net, skb->sk, skb);
if (net_xmit_eval(err) == 0)
- err = skb->len;
+ err = pkt_len;
iptunnel_xmit_stats(dev, err);
return NETDEV_TX_OK;
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 94d4cd2d5ea4..3d9f1c2f81c5 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1520,43 +1520,56 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
EXPORT_SYMBOL(rt_dst_alloc);
/* called in rcu_read_lock() section */
-static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
- u8 tos, struct net_device *dev, int our)
+int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
+ u8 tos, struct net_device *dev,
+ struct in_device *in_dev, u32 *itag)
{
- struct rtable *rth;
- struct in_device *in_dev = __in_dev_get_rcu(dev);
- unsigned int flags = RTCF_MULTICAST;
- u32 itag = 0;
int err;
/* Primary sanity checks. */
-
if (!in_dev)
return -EINVAL;
if (ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr) ||
skb->protocol != htons(ETH_P_IP))
- goto e_inval;
+ return -EINVAL;
if (ipv4_is_loopback(saddr) && !IN_DEV_ROUTE_LOCALNET(in_dev))
- goto e_inval;
+ return -EINVAL;
if (ipv4_is_zeronet(saddr)) {
if (!ipv4_is_local_multicast(daddr))
- goto e_inval;
+ return -EINVAL;
} else {
err = fib_validate_source(skb, saddr, 0, tos, 0, dev,
- in_dev, &itag);
+ in_dev, itag);
if (err < 0)
- goto e_err;
+ return err;
}
+ return 0;
+}
+
+/* called in rcu_read_lock() section */
+static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
+ u8 tos, struct net_device *dev, int our)
+{
+ struct in_device *in_dev = __in_dev_get_rcu(dev);
+ unsigned int flags = RTCF_MULTICAST;
+ struct rtable *rth;
+ u32 itag = 0;
+ int err;
+
+ err = ip_mc_validate_source(skb, daddr, saddr, tos, dev, in_dev, &itag);
+ if (err)
+ return err;
+
if (our)
flags |= RTCF_LOCAL;
rth = rt_dst_alloc(dev_net(dev)->loopback_dev, flags, RTN_MULTICAST,
IN_DEV_CONF_GET(in_dev, NOPOLICY), false, false);
if (!rth)
- goto e_nobufs;
+ return -ENOBUFS;
#ifdef CONFIG_IP_ROUTE_CLASSID
rth->dst.tclassid = itag;
@@ -1572,13 +1585,6 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
skb_dst_set(skb, &rth->dst);
return 0;
-
-e_nobufs:
- return -ENOBUFS;
-e_inval:
- return -EINVAL;
-e_err:
- return err;
}
@@ -2507,7 +2513,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
struct rtable *ort = (struct rtable *) dst_orig;
struct rtable *rt;
- rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE, 0);
+ rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_DEAD, 0);
if (rt) {
struct dst_entry *new = &rt->dst;
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index d9416b5162bc..85164d4d3e53 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1503,23 +1503,23 @@ csum_err:
}
EXPORT_SYMBOL(tcp_v4_do_rcv);
-void tcp_v4_early_demux(struct sk_buff *skb)
+int tcp_v4_early_demux(struct sk_buff *skb)
{
const struct iphdr *iph;
const struct tcphdr *th;
struct sock *sk;
if (skb->pkt_type != PACKET_HOST)
- return;
+ return 0;
if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct tcphdr)))
- return;
+ return 0;
iph = ip_hdr(skb);
th = tcp_hdr(skb);
if (th->doff < sizeof(struct tcphdr) / 4)
- return;
+ return 0;
sk = __inet_lookup_established(dev_net(skb->dev), &tcp_hashinfo,
iph->saddr, th->source,
@@ -1538,6 +1538,7 @@ void tcp_v4_early_demux(struct sk_buff *skb)
skb_dst_set_noref(skb, dst);
}
}
+ return 0;
}
bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 5b6690d05abb..0bc9e46a5369 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -991,6 +991,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
struct tcp_skb_cb *tcb;
struct tcp_out_options opts;
unsigned int tcp_options_size, tcp_header_size;
+ struct sk_buff *oskb = NULL;
struct tcp_md5sig_key *md5;
struct tcphdr *th;
int err;
@@ -998,12 +999,10 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
BUG_ON(!skb || !tcp_skb_pcount(skb));
tp = tcp_sk(sk);
- skb->skb_mstamp = tp->tcp_mstamp;
if (clone_it) {
TCP_SKB_CB(skb)->tx.in_flight = TCP_SKB_CB(skb)->end_seq
- tp->snd_una;
- tcp_rate_skb_sent(sk, skb);
-
+ oskb = skb;
if (unlikely(skb_cloned(skb)))
skb = pskb_copy(skb, gfp_mask);
else
@@ -1011,6 +1010,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
if (unlikely(!skb))
return -ENOBUFS;
}
+ skb->skb_mstamp = tp->tcp_mstamp;
inet = inet_sk(sk);
tcb = TCP_SKB_CB(skb);
@@ -1122,12 +1122,15 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
- if (likely(err <= 0))
- return err;
-
- tcp_enter_cwr(sk);
-
- return net_xmit_eval(err);
+ if (unlikely(err > 0)) {
+ tcp_enter_cwr(sk);
+ err = net_xmit_eval(err);
+ }
+ if (!err && oskb) {
+ oskb->skb_mstamp = tp->tcp_mstamp;
+ tcp_rate_skb_sent(sk, oskb);
+ }
+ return err;
}
/* This routine just queues the buffer for sending.
@@ -1803,40 +1806,6 @@ static bool tcp_snd_wnd_test(const struct tcp_sock *tp,
return !after(end_seq, tcp_wnd_end(tp));
}
-/* This checks if the data bearing packet SKB (usually tcp_send_head(sk))
- * should be put on the wire right now. If so, it returns the number of
- * packets allowed by the congestion window.
- */
-static unsigned int tcp_snd_test(const struct sock *sk, struct sk_buff *skb,
- unsigned int cur_mss, int nonagle)
-{
- const struct tcp_sock *tp = tcp_sk(sk);
- unsigned int cwnd_quota;
-
- tcp_init_tso_segs(skb, cur_mss);
-
- if (!tcp_nagle_test(tp, skb, cur_mss, nonagle))
- return 0;
-
- cwnd_quota = tcp_cwnd_test(tp, skb);
- if (cwnd_quota && !tcp_snd_wnd_test(tp, skb, cur_mss))
- cwnd_quota = 0;
-
- return cwnd_quota;
-}
-
-/* Test if sending is allowed right now. */
-bool tcp_may_send_now(struct sock *sk)
-{
- const struct tcp_sock *tp = tcp_sk(sk);
- struct sk_buff *skb = tcp_send_head(sk);
-
- return skb &&
- tcp_snd_test(sk, skb, tcp_current_mss(sk),
- (tcp_skb_is_last(sk, skb) ?
- tp->nonagle : TCP_NAGLE_PUSH));
-}
-
/* Trim TSO SKB to LEN bytes, put the remaining data into a new packet
* which is put after SKB on the list. It is very much like
* tcp_fragment() except that it may make several kinds of assumptions
@@ -2869,10 +2838,11 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
skb_headroom(skb) >= 0xFFFF)) {
struct sk_buff *nskb;
- skb->skb_mstamp = tp->tcp_mstamp;
nskb = __pskb_copy(skb, MAX_TCP_HEADER, GFP_ATOMIC);
err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) :
-ENOBUFS;
+ if (!err)
+ skb->skb_mstamp = tp->tcp_mstamp;
} else {
err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
}
@@ -3419,6 +3389,10 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
goto done;
}
+ /* data was not sent, this is our new send_head */
+ sk->sk_send_head = syn_data;
+ tp->packets_out -= tcp_skb_pcount(syn_data);
+
fallback:
/* Send a regular SYN with Fast Open cookie request option */
if (fo->cookie.len > 0)
@@ -3471,6 +3445,11 @@ int tcp_connect(struct sock *sk)
*/
tp->snd_nxt = tp->write_seq;
tp->pushed_seq = tp->write_seq;
+ buff = tcp_send_head(sk);
+ if (unlikely(buff)) {
+ tp->snd_nxt = TCP_SKB_CB(buff)->seq;
+ tp->pushed_seq = TCP_SKB_CB(buff)->seq;
+ }
TCP_INC_STATS(sock_net(sk), TCP_MIB_ACTIVEOPENS);
/* Timer for repeating the SYN until an answer. */
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index ef29df8648e4..5676237d2b0f 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -2221,9 +2221,10 @@ static struct sock *__udp4_lib_demux_lookup(struct net *net,
return NULL;
}
-void udp_v4_early_demux(struct sk_buff *skb)
+int udp_v4_early_demux(struct sk_buff *skb)
{
struct net *net = dev_net(skb->dev);
+ struct in_device *in_dev = NULL;
const struct iphdr *iph;
const struct udphdr *uh;
struct sock *sk = NULL;
@@ -2234,24 +2235,24 @@ void udp_v4_early_demux(struct sk_buff *skb)
/* validate the packet */
if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr)))
- return;
+ return 0;
iph = ip_hdr(skb);
uh = udp_hdr(skb);
if (skb->pkt_type == PACKET_BROADCAST ||
skb->pkt_type == PACKET_MULTICAST) {
- struct in_device *in_dev = __in_dev_get_rcu(skb->dev);
+ in_dev = __in_dev_get_rcu(skb->dev);
if (!in_dev)
- return;
+ return 0;
/* we are supposed to accept bcast packets */
if (skb->pkt_type == PACKET_MULTICAST) {
ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr,
iph->protocol);
if (!ours)
- return;
+ return 0;
}
sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr,
@@ -2263,7 +2264,7 @@ void udp_v4_early_demux(struct sk_buff *skb)
}
if (!sk || !refcount_inc_not_zero(&sk->sk_refcnt))
- return;
+ return 0;
skb->sk = sk;
skb->destructor = sock_efree;
@@ -2272,12 +2273,23 @@ void udp_v4_early_demux(struct sk_buff *skb)
if (dst)
dst = dst_check(dst, 0);
if (dst) {
+ u32 itag = 0;
+
/* set noref for now.
* any place which wants to hold dst has to call
* dst_hold_safe()
*/
skb_dst_set_noref(skb, dst);
+
+ /* for unconnected multicast sockets we need to validate
+ * the source on each packet
+ */
+ if (!inet_sk(sk)->inet_daddr && in_dev)
+ return ip_mc_validate_source(skb, iph->daddr,
+ iph->saddr, iph->tos,
+ skb->dev, in_dev, &itag);
}
+ return 0;
}
int udp_rcv(struct sk_buff *skb)
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index 97658bfc1b58..e360d55be555 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -120,7 +120,7 @@ static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
* will be using a length value equal to only one MSS sized
* segment instead of the entire frame.
*/
- if (gso_partial) {
+ if (gso_partial && skb_is_gso(skb)) {
uh->len = htons(skb_shinfo(skb)->gso_size +
SKB_GSO_CB(skb)->data_offset +
skb->head - (unsigned char *)uh);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index c2e2a78787ec..4a96ebbf8eda 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1399,10 +1399,18 @@ static inline int ipv6_saddr_preferred(int type)
return 0;
}
-static inline bool ipv6_use_optimistic_addr(struct inet6_dev *idev)
+static bool ipv6_use_optimistic_addr(struct net *net,
+ struct inet6_dev *idev)
{
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- return idev && idev->cnf.optimistic_dad && idev->cnf.use_optimistic;
+ if (!idev)
+ return false;
+ if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad)
+ return false;
+ if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic)
+ return false;
+
+ return true;
#else
return false;
#endif
@@ -1472,7 +1480,7 @@ static int ipv6_get_saddr_eval(struct net *net,
/* Rule 3: Avoid deprecated and optimistic addresses */
u8 avoid = IFA_F_DEPRECATED;
- if (!ipv6_use_optimistic_addr(score->ifa->idev))
+ if (!ipv6_use_optimistic_addr(net, score->ifa->idev))
avoid |= IFA_F_OPTIMISTIC;
ret = ipv6_saddr_preferred(score->addr_type) ||
!(score->ifa->flags & avoid);
@@ -2460,7 +2468,8 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
int max_addresses = in6_dev->cnf.max_addresses;
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- if (in6_dev->cnf.optimistic_dad &&
+ if ((net->ipv6.devconf_all->optimistic_dad ||
+ in6_dev->cnf.optimistic_dad) &&
!net->ipv6.devconf_all->forwarding && sllao)
addr_flags |= IFA_F_OPTIMISTIC;
#endif
@@ -3051,7 +3060,8 @@ void addrconf_add_linklocal(struct inet6_dev *idev,
u32 addr_flags = flags | IFA_F_PERMANENT;
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- if (idev->cnf.optimistic_dad &&
+ if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad ||
+ idev->cnf.optimistic_dad) &&
!dev_net(idev->dev)->ipv6.devconf_all->forwarding)
addr_flags |= IFA_F_OPTIMISTIC;
#endif
@@ -3810,7 +3820,8 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
goto out;
if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
- idev->cnf.accept_dad < 1 ||
+ (dev_net(dev)->ipv6.devconf_all->accept_dad < 1 &&
+ idev->cnf.accept_dad < 1) ||
!(ifp->flags&IFA_F_TENTATIVE) ||
ifp->flags & IFA_F_NODAD) {
bump_id = ifp->flags & IFA_F_TENTATIVE;
@@ -3841,7 +3852,7 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
*/
if (ifp->flags & IFA_F_OPTIMISTIC) {
ip6_ins_rt(ifp->rt);
- if (ipv6_use_optimistic_addr(idev)) {
+ if (ipv6_use_optimistic_addr(dev_net(dev), idev)) {
/* Because optimistic nodes can use this address,
* notify listeners. If DAD fails, RTM_DELADDR is sent.
*/
@@ -3897,7 +3908,9 @@ static void addrconf_dad_work(struct work_struct *w)
action = DAD_ABORT;
ifp->state = INET6_IFADDR_STATE_POSTDAD;
- if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6 &&
+ if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 ||
+ idev->cnf.accept_dad > 1) &&
+ !idev->cnf.disable_ipv6 &&
!(ifp->flags & IFA_F_STABLE_PRIVACY)) {
struct in6_addr addr;
@@ -4940,9 +4953,10 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
/* Don't send DELADDR notification for TENTATIVE address,
* since NEWADDR notification is sent only after removing
- * TENTATIVE flag.
+ * TENTATIVE flag, if DAD has not failed.
*/
- if (ifa->flags & IFA_F_TENTATIVE && event == RTM_DELADDR)
+ if (ifa->flags & IFA_F_TENTATIVE && !(ifa->flags & IFA_F_DADFAILED) &&
+ event == RTM_DELADDR)
return;
skb = nlmsg_new(inet6_ifaddr_msgsize(), GFP_ATOMIC);
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index b7a72d409334..1602b491b281 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -940,24 +940,25 @@ done:
}
static int ip6gre_header(struct sk_buff *skb, struct net_device *dev,
- unsigned short type,
- const void *daddr, const void *saddr, unsigned int len)
+ unsigned short type, const void *daddr,
+ const void *saddr, unsigned int len)
{
struct ip6_tnl *t = netdev_priv(dev);
- struct ipv6hdr *ipv6h = skb_push(skb, t->hlen);
- __be16 *p = (__be16 *)(ipv6h+1);
+ struct ipv6hdr *ipv6h;
+ __be16 *p;
- ip6_flow_hdr(ipv6h, 0,
- ip6_make_flowlabel(dev_net(dev), skb,
- t->fl.u.ip6.flowlabel, true,
- &t->fl.u.ip6));
+ ipv6h = skb_push(skb, t->hlen + sizeof(*ipv6h));
+ ip6_flow_hdr(ipv6h, 0, ip6_make_flowlabel(dev_net(dev), skb,
+ t->fl.u.ip6.flowlabel,
+ true, &t->fl.u.ip6));
ipv6h->hop_limit = t->parms.hop_limit;
ipv6h->nexthdr = NEXTHDR_GRE;
ipv6h->saddr = t->parms.laddr;
ipv6h->daddr = t->parms.raddr;
- p[0] = t->parms.o_flags;
- p[1] = htons(type);
+ p = (__be16 *)(ipv6h + 1);
+ p[0] = t->parms.o_flags;
+ p[1] = htons(type);
/*
* Set the source hardware address.
@@ -1310,6 +1311,7 @@ static void ip6gre_tap_setup(struct net_device *dev)
dev->features |= NETIF_F_NETNS_LOCAL;
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+ netif_keep_dst(dev);
}
static bool ip6gre_netlink_encap_parms(struct nlattr *data[],
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
index cdb3728faca7..4a87f9428ca5 100644
--- a/net/ipv6/ip6_offload.c
+++ b/net/ipv6/ip6_offload.c
@@ -105,7 +105,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
for (skb = segs; skb; skb = skb->next) {
ipv6h = (struct ipv6hdr *)(skb_mac_header(skb) + nhoff);
- if (gso_partial)
+ if (gso_partial && skb_is_gso(skb))
payload_len = skb_shinfo(skb)->gso_size +
SKB_GSO_CB(skb)->data_offset +
skb->head - (unsigned char *)(ipv6h + 1);
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 10a693a19323..a1c24443cd9e 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -171,7 +171,7 @@ ip6_tnl_lookup(struct net *net, const struct in6_addr *remote, const struct in6_
}
t = rcu_dereference(ip6n->collect_md_tun);
- if (t)
+ if (t && t->dev->flags & IFF_UP)
return t;
t = rcu_dereference(ip6n->tnls_wc[0]);
@@ -1043,6 +1043,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
struct dst_entry *dst = NULL, *ndst = NULL;
struct net_device *tdev;
int mtu;
+ unsigned int eth_hlen = t->dev->type == ARPHRD_ETHER ? ETH_HLEN : 0;
unsigned int psh_hlen = sizeof(struct ipv6hdr) + t->encap_hlen;
unsigned int max_headroom = psh_hlen;
bool use_cache = false;
@@ -1124,7 +1125,7 @@ route_lookup:
t->parms.name);
goto tx_err_dst_release;
}
- mtu = dst_mtu(dst) - psh_hlen - t->tun_hlen;
+ mtu = dst_mtu(dst) - eth_hlen - psh_hlen - t->tun_hlen;
if (encap_limit >= 0) {
max_headroom += 8;
mtu -= 8;
@@ -1133,7 +1134,7 @@ route_lookup:
mtu = IPV6_MIN_MTU;
if (skb_dst(skb) && !t->parms.collect_md)
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
- if (skb->len - t->tun_hlen > mtu && !skb_is_gso(skb)) {
+ if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) {
*pmtu = mtu;
err = -EMSGSIZE;
goto tx_err_dst_release;
@@ -2259,6 +2260,9 @@ static int __init ip6_tunnel_init(void)
{
int err;
+ if (!ipv6_mod_enabled())
+ return -EOPNOTSUPP;
+
err = register_pernet_device(&ip6_tnl_net_ops);
if (err < 0)
goto out_pernet;
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 79444a4bfd6d..bcdc2d557de1 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -445,6 +445,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
struct dst_entry *dst = skb_dst(skb);
struct net_device *tdev;
struct xfrm_state *x;
+ int pkt_len = skb->len;
int err = -1;
int mtu;
@@ -502,7 +503,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
u64_stats_update_begin(&tstats->syncp);
- tstats->tx_bytes += skb->len;
+ tstats->tx_bytes += pkt_len;
tstats->tx_packets++;
u64_stats_update_end(&tstats->syncp);
} else {
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 26cc9f483b6d..a96d5b385d8f 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1325,7 +1325,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
struct dst_entry *new = NULL;
rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1,
- DST_OBSOLETE_NONE, 0);
+ DST_OBSOLETE_DEAD, 0);
if (rt) {
rt6_info_init(rt);
diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c
index 7ff54db73a48..825b8e01f947 100644
--- a/net/ipv6/seg6_local.c
+++ b/net/ipv6/seg6_local.c
@@ -72,10 +72,6 @@ static struct ipv6_sr_hdr *get_srh(struct sk_buff *skb)
srh = (struct ipv6_sr_hdr *)(skb->data + srhoff);
- /* make sure it's a Segment Routing header (Routing Type 4) */
- if (srh->type != IPV6_SRCRT_TYPE_4)
- return NULL;
-
len = (srh->hdrlen + 1) << 3;
if (!pskb_may_pull(skb, srhoff + len))
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index e2ecfb137297..40d7234c27b9 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1015,6 +1015,7 @@ static void udp6_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb,
*/
offset = skb_transport_offset(skb);
skb->csum = skb_checksum(skb, offset, skb->len - offset, 0);
+ csum = skb->csum;
skb->ip_summed = CHECKSUM_NONE;
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index ee485df73ccd..02d61101b108 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1314,6 +1314,9 @@ again:
hlist_del_init(&session->hlist);
+ if (test_and_set_bit(0, &session->dead))
+ goto again;
+
if (session->ref != NULL)
(*session->ref)(session);
@@ -1685,14 +1688,12 @@ EXPORT_SYMBOL_GPL(l2tp_tunnel_create);
/* This function is used by the netlink TUNNEL_DELETE command.
*/
-int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel)
+void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel)
{
- l2tp_tunnel_inc_refcount(tunnel);
- if (false == queue_work(l2tp_wq, &tunnel->del_work)) {
- l2tp_tunnel_dec_refcount(tunnel);
- return 1;
+ if (!test_and_set_bit(0, &tunnel->dead)) {
+ l2tp_tunnel_inc_refcount(tunnel);
+ queue_work(l2tp_wq, &tunnel->del_work);
}
- return 0;
}
EXPORT_SYMBOL_GPL(l2tp_tunnel_delete);
@@ -1750,6 +1751,9 @@ EXPORT_SYMBOL_GPL(__l2tp_session_unhash);
*/
int l2tp_session_delete(struct l2tp_session *session)
{
+ if (test_and_set_bit(0, &session->dead))
+ return 0;
+
if (session->ref)
(*session->ref)(session);
__l2tp_session_unhash(session);
diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h
index a305e0c5925a..67c79d9b5c6c 100644
--- a/net/l2tp/l2tp_core.h
+++ b/net/l2tp/l2tp_core.h
@@ -76,6 +76,7 @@ struct l2tp_session_cfg {
struct l2tp_session {
int magic; /* should be
* L2TP_SESSION_MAGIC */
+ long dead;
struct l2tp_tunnel *tunnel; /* back pointer to tunnel
* context */
@@ -160,6 +161,9 @@ struct l2tp_tunnel_cfg {
struct l2tp_tunnel {
int magic; /* Should be L2TP_TUNNEL_MAGIC */
+
+ unsigned long dead;
+
struct rcu_head rcu;
rwlock_t hlist_lock; /* protect session_hlist */
bool acpt_newsess; /* Indicates whether this
@@ -254,7 +258,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id,
u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
struct l2tp_tunnel **tunnelp);
void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel);
-int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
+void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
struct l2tp_session *l2tp_session_create(int priv_size,
struct l2tp_tunnel *tunnel,
u32 session_id, u32 peer_session_id,
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c
index 87da9ef61860..014a7bc2a872 100644
--- a/net/l2tp/l2tp_eth.c
+++ b/net/l2tp/l2tp_eth.c
@@ -44,7 +44,6 @@ struct l2tp_eth {
struct net_device *dev;
struct sock *tunnel_sock;
struct l2tp_session *session;
- struct list_head list;
atomic_long_t tx_bytes;
atomic_long_t tx_packets;
atomic_long_t tx_dropped;
@@ -58,17 +57,6 @@ struct l2tp_eth_sess {
struct net_device *dev;
};
-/* per-net private data for this module */
-static unsigned int l2tp_eth_net_id;
-struct l2tp_eth_net {
- struct list_head l2tp_eth_dev_list;
- spinlock_t l2tp_eth_lock;
-};
-
-static inline struct l2tp_eth_net *l2tp_eth_pernet(struct net *net)
-{
- return net_generic(net, l2tp_eth_net_id);
-}
static int l2tp_eth_dev_init(struct net_device *dev)
{
@@ -84,12 +72,6 @@ static int l2tp_eth_dev_init(struct net_device *dev)
static void l2tp_eth_dev_uninit(struct net_device *dev)
{
- struct l2tp_eth *priv = netdev_priv(dev);
- struct l2tp_eth_net *pn = l2tp_eth_pernet(dev_net(dev));
-
- spin_lock(&pn->l2tp_eth_lock);
- list_del_init(&priv->list);
- spin_unlock(&pn->l2tp_eth_lock);
dev_put(dev);
}
@@ -273,7 +255,6 @@ static int l2tp_eth_create(struct net *net, struct l2tp_tunnel *tunnel,
struct l2tp_eth *priv;
struct l2tp_eth_sess *spriv;
int rc;
- struct l2tp_eth_net *pn;
if (cfg->ifname) {
strlcpy(name, cfg->ifname, IFNAMSIZ);
@@ -305,7 +286,6 @@ static int l2tp_eth_create(struct net *net, struct l2tp_tunnel *tunnel,
priv = netdev_priv(dev);
priv->dev = dev;
priv->session = session;
- INIT_LIST_HEAD(&priv->list);
priv->tunnel_sock = tunnel->sock;
session->recv_skb = l2tp_eth_dev_recv;
@@ -326,10 +306,6 @@ static int l2tp_eth_create(struct net *net, struct l2tp_tunnel *tunnel,
strlcpy(session->ifname, dev->name, IFNAMSIZ);
dev_hold(dev);
- pn = l2tp_eth_pernet(dev_net(dev));
- spin_lock(&pn->l2tp_eth_lock);
- list_add(&priv->list, &pn->l2tp_eth_dev_list);
- spin_unlock(&pn->l2tp_eth_lock);
return 0;
@@ -342,22 +318,6 @@ out:
return rc;
}
-static __net_init int l2tp_eth_init_net(struct net *net)
-{
- struct l2tp_eth_net *pn = net_generic(net, l2tp_eth_net_id);
-
- INIT_LIST_HEAD(&pn->l2tp_eth_dev_list);
- spin_lock_init(&pn->l2tp_eth_lock);
-
- return 0;
-}
-
-static struct pernet_operations l2tp_eth_net_ops = {
- .init = l2tp_eth_init_net,
- .id = &l2tp_eth_net_id,
- .size = sizeof(struct l2tp_eth_net),
-};
-
static const struct l2tp_nl_cmd_ops l2tp_eth_nl_cmd_ops = {
.session_create = l2tp_eth_create,
@@ -371,25 +331,18 @@ static int __init l2tp_eth_init(void)
err = l2tp_nl_register_ops(L2TP_PWTYPE_ETH, &l2tp_eth_nl_cmd_ops);
if (err)
- goto out;
-
- err = register_pernet_device(&l2tp_eth_net_ops);
- if (err)
- goto out_unreg;
+ goto err;
pr_info("L2TP ethernet pseudowire support (L2TPv3)\n");
return 0;
-out_unreg:
- l2tp_nl_unregister_ops(L2TP_PWTYPE_ETH);
-out:
+err:
return err;
}
static void __exit l2tp_eth_exit(void)
{
- unregister_pernet_device(&l2tp_eth_net_ops);
l2tp_nl_unregister_ops(L2TP_PWTYPE_ETH);
}
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index 50e3ee9a9d61..bc6e8bfc5be4 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -437,11 +437,11 @@ static void pppol2tp_session_close(struct l2tp_session *session)
BUG_ON(session->magic != L2TP_SESSION_MAGIC);
- if (sock) {
+ if (sock)
inet_shutdown(sock, SEND_SHUTDOWN);
- /* Don't let the session go away before our socket does */
- l2tp_session_inc_refcount(session);
- }
+
+ /* Don't let the session go away before our socket does */
+ l2tp_session_inc_refcount(session);
}
/* Really kill the session socket. (Called from sock_put() if
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
index f236c0bc7b3f..51063d9ed0f7 100644
--- a/net/netfilter/ipset/ip_set_hash_gen.h
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
@@ -1041,12 +1041,24 @@ out:
static int
mtype_head(struct ip_set *set, struct sk_buff *skb)
{
- const struct htype *h = set->data;
+ struct htype *h = set->data;
const struct htable *t;
struct nlattr *nested;
size_t memsize;
u8 htable_bits;
+ /* If any members have expired, set->elements will be wrong
+ * mytype_expire function will update it with the right count.
+ * we do not hold set->lock here, so grab it first.
+ * set->elements can still be incorrect in the case of a huge set,
+ * because elements might time out during the listing.
+ */
+ if (SET_WITH_TIMEOUT(set)) {
+ spin_lock_bh(&set->lock);
+ mtype_expire(set, h);
+ spin_unlock_bh(&set->lock);
+ }
+
rcu_read_lock_bh();
t = rcu_dereference_bh_nfnl(h->table);
memsize = mtype_ahash_memsize(h, t) + set->ext_size;
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
index f393a7086025..af8345fc4fbd 100644
--- a/net/netfilter/nf_nat_core.c
+++ b/net/netfilter/nf_nat_core.c
@@ -429,7 +429,7 @@ nf_nat_setup_info(struct nf_conn *ct,
srchash = hash_by_src(net,
&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
- lock = &nf_nat_locks[srchash % ARRAY_SIZE(nf_nat_locks)];
+ lock = &nf_nat_locks[srchash % CONNTRACK_LOCKS];
spin_lock_bh(lock);
hlist_add_head_rcu(&ct->nat_bysource,
&nf_nat_bysource[srchash]);
@@ -532,9 +532,9 @@ static void __nf_nat_cleanup_conntrack(struct nf_conn *ct)
unsigned int h;
h = hash_by_src(nf_ct_net(ct), &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
- spin_lock_bh(&nf_nat_locks[h % ARRAY_SIZE(nf_nat_locks)]);
+ spin_lock_bh(&nf_nat_locks[h % CONNTRACK_LOCKS]);
hlist_del_rcu(&ct->nat_bysource);
- spin_unlock_bh(&nf_nat_locks[h % ARRAY_SIZE(nf_nat_locks)]);
+ spin_unlock_bh(&nf_nat_locks[h % CONNTRACK_LOCKS]);
}
static int nf_nat_proto_clean(struct nf_conn *ct, void *data)
@@ -807,8 +807,8 @@ static int __init nf_nat_init(void)
/* Leave them the same for the moment. */
nf_nat_htable_size = nf_conntrack_htable_size;
- if (nf_nat_htable_size < ARRAY_SIZE(nf_nat_locks))
- nf_nat_htable_size = ARRAY_SIZE(nf_nat_locks);
+ if (nf_nat_htable_size < CONNTRACK_LOCKS)
+ nf_nat_htable_size = CONNTRACK_LOCKS;
nf_nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size, 0);
if (!nf_nat_bysource)
@@ -821,7 +821,7 @@ static int __init nf_nat_init(void)
return ret;
}
- for (i = 0; i < ARRAY_SIZE(nf_nat_locks); i++)
+ for (i = 0; i < CONNTRACK_LOCKS; i++)
spin_lock_init(&nf_nat_locks[i]);
nf_ct_helper_expectfn_register(&follow_master_nat);
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 327807731b44..94c11cf0459d 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2270,10 +2270,13 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
mutex_unlock(nlk->cb_mutex);
+ ret = 0;
if (cb->start)
- cb->start(cb);
+ ret = cb->start(cb);
+
+ if (!ret)
+ ret = netlink_dump(sk);
- ret = netlink_dump(sk);
sock_put(sk);
if (ret)
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 76cf273a56c7..c3aec6227c91 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -1112,7 +1112,8 @@ static int ovs_nla_init_match_and_action(struct net *net,
if (!a[OVS_FLOW_ATTR_KEY]) {
OVS_NLERR(log,
"Flow key attribute not present in set flow.");
- return -EINVAL;
+ error = -EINVAL;
+ goto error;
}
*acts = get_flow_actions(net, a[OVS_FLOW_ATTR_ACTIONS], key,
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index c26172995511..bec01a3daf5b 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1684,10 +1684,6 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
mutex_lock(&fanout_mutex);
- err = -EINVAL;
- if (!po->running)
- goto out;
-
err = -EALREADY;
if (po->fanout)
goto out;
@@ -1749,7 +1745,10 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
list_add(&match->list, &fanout_list);
}
err = -EINVAL;
- if (match->type == type &&
+
+ spin_lock(&po->bind_lock);
+ if (po->running &&
+ match->type == type &&
match->prot_hook.type == po->prot_hook.type &&
match->prot_hook.dev == po->prot_hook.dev) {
err = -ENOSPC;
@@ -1761,6 +1760,13 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
err = 0;
}
}
+ spin_unlock(&po->bind_lock);
+
+ if (err && !refcount_read(&match->sk_ref)) {
+ list_del(&match->list);
+ kfree(match);
+ }
+
out:
if (err && rollover) {
kfree(rollover);
@@ -2834,6 +2840,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
struct virtio_net_hdr vnet_hdr = { 0 };
int offset = 0;
struct packet_sock *po = pkt_sk(sk);
+ bool has_vnet_hdr = false;
int hlen, tlen, linear;
int extra_len = 0;
@@ -2877,6 +2884,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
err = packet_snd_vnet_parse(msg, &len, &vnet_hdr);
if (err)
goto out_unlock;
+ has_vnet_hdr = true;
}
if (unlikely(sock_flag(sk, SOCK_NOFCS))) {
@@ -2935,7 +2943,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
skb->priority = sk->sk_priority;
skb->mark = sockc.mark;
- if (po->has_vnet_hdr) {
+ if (has_vnet_hdr) {
err = virtio_net_hdr_to_skb(skb, &vnet_hdr, vio_le());
if (err)
goto out_free;
@@ -3063,13 +3071,15 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
int ret = 0;
bool unlisted = false;
- if (po->fanout)
- return -EINVAL;
-
lock_sock(sk);
spin_lock(&po->bind_lock);
rcu_read_lock();
+ if (po->fanout) {
+ ret = -EINVAL;
+ goto out_unlock;
+ }
+
if (name) {
dev = dev_get_by_name_rcu(sock_net(sk), name);
if (!dev) {
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index a306974e2fb4..da6fa82c98a8 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -53,10 +53,13 @@ static void tcf_action_goto_chain_exec(const struct tc_action *a,
res->goto_tp = rcu_dereference_bh(chain->filter_chain);
}
-static void free_tcf(struct rcu_head *head)
+/* XXX: For standalone actions, we don't need a RCU grace period either, because
+ * actions are always connected to filters and filters are already destroyed in
+ * RCU callbacks, so after a RCU grace period actions are already disconnected
+ * from filters. Readers later can not find us.
+ */
+static void free_tcf(struct tc_action *p)
{
- struct tc_action *p = container_of(head, struct tc_action, tcfa_rcu);
-
free_percpu(p->cpu_bstats);
free_percpu(p->cpu_qstats);
@@ -76,11 +79,7 @@ static void tcf_idr_remove(struct tcf_idrinfo *idrinfo, struct tc_action *p)
idr_remove_ext(&idrinfo->action_idr, p->tcfa_index);
spin_unlock_bh(&idrinfo->lock);
gen_kill_estimator(&p->tcfa_rate_est);
- /*
- * gen_estimator est_timer() might access p->tcfa_lock
- * or bstats, wait a RCU grace period before freeing p
- */
- call_rcu(&p->tcfa_rcu, free_tcf);
+ free_tcf(p);
}
int __tcf_idr_release(struct tc_action *p, bool bind, bool strict)
@@ -181,7 +180,7 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
idr_for_each_entry_ext(idr, p, id) {
ret = __tcf_idr_release(p, false, true);
if (ret == ACT_P_DELETED) {
- module_put(p->ops->owner);
+ module_put(ops->owner);
n_i++;
} else if (ret < 0) {
goto nla_put_failure;
@@ -259,7 +258,7 @@ void tcf_idr_cleanup(struct tc_action *a, struct nlattr *est)
{
if (est)
gen_kill_estimator(&a->tcfa_rate_est);
- call_rcu(&a->tcfa_rcu, free_tcf);
+ free_tcf(a);
}
EXPORT_SYMBOL(tcf_idr_cleanup);
@@ -515,13 +514,15 @@ EXPORT_SYMBOL(tcf_action_exec);
int tcf_action_destroy(struct list_head *actions, int bind)
{
+ const struct tc_action_ops *ops;
struct tc_action *a, *tmp;
int ret = 0;
list_for_each_entry_safe(a, tmp, actions, list) {
+ ops = a->ops;
ret = __tcf_idr_release(a, bind, true);
if (ret == ACT_P_DELETED)
- module_put(a->ops->owner);
+ module_put(ops->owner);
else if (ret < 0)
return ret;
}
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index c743f03cfebd..0b2219adf520 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -182,7 +182,7 @@ static struct tcf_chain *tcf_chain_create(struct tcf_block *block,
list_add_tail(&chain->list, &block->chain_list);
chain->block = block;
chain->index = chain_index;
- chain->refcnt = 0;
+ chain->refcnt = 1;
return chain;
}
@@ -194,21 +194,20 @@ static void tcf_chain_flush(struct tcf_chain *chain)
RCU_INIT_POINTER(*chain->p_filter_chain, NULL);
while ((tp = rtnl_dereference(chain->filter_chain)) != NULL) {
RCU_INIT_POINTER(chain->filter_chain, tp->next);
+ tcf_chain_put(chain);
tcf_proto_destroy(tp);
}
}
static void tcf_chain_destroy(struct tcf_chain *chain)
{
- /* May be already removed from the list by the previous call. */
- if (!list_empty(&chain->list))
- list_del_init(&chain->list);
+ list_del(&chain->list);
+ kfree(chain);
+}
- /* There might still be a reference held when we got here from
- * tcf_block_put. Wait for the user to drop reference before free.
- */
- if (!chain->refcnt)
- kfree(chain);
+static void tcf_chain_hold(struct tcf_chain *chain)
+{
+ ++chain->refcnt;
}
struct tcf_chain *tcf_chain_get(struct tcf_block *block, u32 chain_index,
@@ -217,24 +216,19 @@ struct tcf_chain *tcf_chain_get(struct tcf_block *block, u32 chain_index,
struct tcf_chain *chain;
list_for_each_entry(chain, &block->chain_list, list) {
- if (chain->index == chain_index)
- goto incref;
+ if (chain->index == chain_index) {
+ tcf_chain_hold(chain);
+ return chain;
+ }
}
- chain = create ? tcf_chain_create(block, chain_index) : NULL;
-incref:
- if (chain)
- chain->refcnt++;
- return chain;
+ return create ? tcf_chain_create(block, chain_index) : NULL;
}
EXPORT_SYMBOL(tcf_chain_get);
void tcf_chain_put(struct tcf_chain *chain)
{
- /* Destroy unused chain, with exception of chain 0, which is the
- * default one and has to be always present.
- */
- if (--chain->refcnt == 0 && !chain->filter_chain && chain->index != 0)
+ if (--chain->refcnt == 0)
tcf_chain_destroy(chain);
}
EXPORT_SYMBOL(tcf_chain_put);
@@ -279,10 +273,31 @@ void tcf_block_put(struct tcf_block *block)
if (!block)
return;
- list_for_each_entry_safe(chain, tmp, &block->chain_list, list) {
+ /* XXX: Standalone actions are not allowed to jump to any chain, and
+ * bound actions should be all removed after flushing. However,
+ * filters are destroyed in RCU callbacks, we have to hold the chains
+ * first, otherwise we would always race with RCU callbacks on this list
+ * without proper locking.
+ */
+
+ /* Wait for existing RCU callbacks to cool down. */
+ rcu_barrier();
+
+ /* Hold a refcnt for all chains, except 0, in case they are gone. */
+ list_for_each_entry(chain, &block->chain_list, list)
+ if (chain->index)
+ tcf_chain_hold(chain);
+
+ /* No race on the list, because no chain could be destroyed. */
+ list_for_each_entry(chain, &block->chain_list, list)
tcf_chain_flush(chain);
- tcf_chain_destroy(chain);
- }
+
+ /* Wait for RCU callbacks to release the reference count. */
+ rcu_barrier();
+
+ /* At this point, all the chains should have refcnt == 1. */
+ list_for_each_entry_safe(chain, tmp, &block->chain_list, list)
+ tcf_chain_put(chain);
kfree(block);
}
EXPORT_SYMBOL(tcf_block_put);
@@ -360,6 +375,7 @@ static void tcf_chain_tp_insert(struct tcf_chain *chain,
rcu_assign_pointer(*chain->p_filter_chain, tp);
RCU_INIT_POINTER(tp->next, tcf_chain_tp_prev(chain_info));
rcu_assign_pointer(*chain_info->pprev, tp);
+ tcf_chain_hold(chain);
}
static void tcf_chain_tp_remove(struct tcf_chain *chain,
@@ -371,6 +387,7 @@ static void tcf_chain_tp_remove(struct tcf_chain *chain,
if (chain->p_filter_chain && tp == chain->filter_chain)
RCU_INIT_POINTER(*chain->p_filter_chain, next);
RCU_INIT_POINTER(*chain_info->pprev, next);
+ tcf_chain_put(chain);
}
static struct tcf_proto *tcf_chain_tp_find(struct tcf_chain *chain,
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index 1a267e77c6de..d230cb4c8094 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -922,28 +922,28 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
if (!tc_flags_valid(fnew->flags)) {
err = -EINVAL;
- goto errout;
+ goto errout_idr;
}
}
err = fl_set_parms(net, tp, fnew, &mask, base, tb, tca[TCA_RATE], ovr);
if (err)
- goto errout;
+ goto errout_idr;
err = fl_check_assign_mask(head, &mask);
if (err)
- goto errout;
+ goto errout_idr;
if (!tc_skip_sw(fnew->flags)) {
if (!fold && fl_lookup(head, &fnew->mkey)) {
err = -EEXIST;
- goto errout;
+ goto errout_idr;
}
err = rhashtable_insert_fast(&head->ht, &fnew->ht_node,
head->ht_params);
if (err)
- goto errout;
+ goto errout_idr;
}
if (!tc_skip_hw(fnew->flags)) {
@@ -952,7 +952,7 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
&mask.key,
fnew);
if (err)
- goto errout;
+ goto errout_idr;
}
if (!tc_in_hw(fnew->flags))
@@ -981,6 +981,9 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
kfree(tb);
return 0;
+errout_idr:
+ if (fnew->handle)
+ idr_remove_ext(&head->handle_idr, fnew->handle);
errout:
tcf_exts_destroy(&fnew->exts);
kfree(fnew);
diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c
index 21cc45caf842..eeac606c95ab 100644
--- a/net/sched/cls_matchall.c
+++ b/net/sched/cls_matchall.c
@@ -32,6 +32,7 @@ static int mall_classify(struct sk_buff *skb, const struct tcf_proto *tp,
if (tc_skip_sw(head->flags))
return -1;
+ *res = head->res;
return tcf_exts_exec(skb, &head->exts, res);
}
diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
index 98c05db85bcb..b1f6ed48bc72 100644
--- a/net/sched/cls_rsvp.h
+++ b/net/sched/cls_rsvp.h
@@ -389,7 +389,7 @@ static unsigned int gen_handle(struct tcf_proto *tp, unsigned salt)
if ((data->hgenerator += 0x10000) == 0)
data->hgenerator = 0x10000;
h = data->hgenerator|salt;
- if (rsvp_get(tp, h) == 0)
+ if (!rsvp_get(tp, h))
return h;
}
return 0;
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 92237e75dbbc..bf8c81e07c70 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -685,6 +685,7 @@ void qdisc_reset(struct Qdisc *qdisc)
qdisc->gso_skb = NULL;
}
qdisc->q.qlen = 0;
+ qdisc->qstats.backlog = 0;
}
EXPORT_SYMBOL(qdisc_reset);
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index daaf214e5201..3f88b75488b0 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -958,6 +958,8 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
}
if (cl != NULL) {
+ int old_flags;
+
if (parentid) {
if (cl->cl_parent &&
cl->cl_parent->cl_common.classid != parentid)
@@ -978,6 +980,8 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
}
sch_tree_lock(sch);
+ old_flags = cl->cl_flags;
+
if (rsc != NULL)
hfsc_change_rsc(cl, rsc, cur_time);
if (fsc != NULL)
@@ -986,10 +990,21 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
hfsc_change_usc(cl, usc, cur_time);
if (cl->qdisc->q.qlen != 0) {
- if (cl->cl_flags & HFSC_RSC)
- update_ed(cl, qdisc_peek_len(cl->qdisc));
- if (cl->cl_flags & HFSC_FSC)
- update_vf(cl, 0, cur_time);
+ int len = qdisc_peek_len(cl->qdisc);
+
+ if (cl->cl_flags & HFSC_RSC) {
+ if (old_flags & HFSC_RSC)
+ update_ed(cl, len);
+ else
+ init_ed(cl, len);
+ }
+
+ if (cl->cl_flags & HFSC_FSC) {
+ if (old_flags & HFSC_FSC)
+ update_vf(cl, 0, cur_time);
+ else
+ init_vf(cl, len);
+ }
}
sch_tree_unlock(sch);
diff --git a/net/sctp/sctp_diag.c b/net/sctp/sctp_diag.c
index e99518e79b52..a72a7d925d46 100644
--- a/net/sctp/sctp_diag.c
+++ b/net/sctp/sctp_diag.c
@@ -279,9 +279,11 @@ out:
return err;
}
-static int sctp_sock_dump(struct sock *sk, void *p)
+static int sctp_sock_dump(struct sctp_transport *tsp, void *p)
{
+ struct sctp_endpoint *ep = tsp->asoc->ep;
struct sctp_comm_param *commp = p;
+ struct sock *sk = ep->base.sk;
struct sk_buff *skb = commp->skb;
struct netlink_callback *cb = commp->cb;
const struct inet_diag_req_v2 *r = commp->r;
@@ -289,9 +291,7 @@ static int sctp_sock_dump(struct sock *sk, void *p)
int err = 0;
lock_sock(sk);
- if (!sctp_sk(sk)->ep)
- goto release;
- list_for_each_entry(assoc, &sctp_sk(sk)->ep->asocs, asocs) {
+ list_for_each_entry(assoc, &ep->asocs, asocs) {
if (cb->args[4] < cb->args[1])
goto next;
@@ -309,7 +309,6 @@ static int sctp_sock_dump(struct sock *sk, void *p)
cb->nlh->nlmsg_seq,
NLM_F_MULTI, cb->nlh,
commp->net_admin) < 0) {
- cb->args[3] = 1;
err = 1;
goto release;
}
@@ -327,40 +326,30 @@ next:
cb->args[4]++;
}
cb->args[1] = 0;
- cb->args[2]++;
cb->args[3] = 0;
cb->args[4] = 0;
release:
release_sock(sk);
- sock_put(sk);
return err;
}
-static int sctp_get_sock(struct sctp_transport *tsp, void *p)
+static int sctp_sock_filter(struct sctp_transport *tsp, void *p)
{
struct sctp_endpoint *ep = tsp->asoc->ep;
struct sctp_comm_param *commp = p;
struct sock *sk = ep->base.sk;
- struct netlink_callback *cb = commp->cb;
const struct inet_diag_req_v2 *r = commp->r;
struct sctp_association *assoc =
list_entry(ep->asocs.next, struct sctp_association, asocs);
/* find the ep only once through the transports by this condition */
if (tsp->asoc != assoc)
- goto out;
+ return 0;
if (r->sdiag_family != AF_UNSPEC && sk->sk_family != r->sdiag_family)
- goto out;
-
- sock_hold(sk);
- cb->args[5] = (long)sk;
+ return 0;
return 1;
-
-out:
- cb->args[2]++;
- return 0;
}
static int sctp_ep_dump(struct sctp_endpoint *ep, void *p)
@@ -474,6 +463,7 @@ static void sctp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
.r = r,
.net_admin = netlink_net_capable(cb->skb, CAP_NET_ADMIN),
};
+ int pos = cb->args[2];
/* eps hashtable dumps
* args:
@@ -503,12 +493,9 @@ skip:
if (!(idiag_states & ~(TCPF_LISTEN | TCPF_CLOSE)))
goto done;
-next:
- cb->args[5] = 0;
- sctp_for_each_transport(sctp_get_sock, net, cb->args[2], &commp);
-
- if (cb->args[5] && !sctp_sock_dump((struct sock *)cb->args[5], &commp))
- goto next;
+ sctp_for_each_transport(sctp_sock_filter, sctp_sock_dump,
+ net, &pos, &commp);
+ cb->args[2] = pos;
done:
cb->args[1] = cb->args[4];
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 1b00a1e09b93..d4730ada7f32 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4658,29 +4658,39 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
- struct net *net, int pos, void *p) {
+ int (*cb_done)(struct sctp_transport *, void *),
+ struct net *net, int *pos, void *p) {
struct rhashtable_iter hti;
- void *obj;
- int err;
-
- err = sctp_transport_walk_start(&hti);
- if (err)
- return err;
+ struct sctp_transport *tsp;
+ int ret;
- obj = sctp_transport_get_idx(net, &hti, pos + 1);
- for (; !IS_ERR_OR_NULL(obj); obj = sctp_transport_get_next(net, &hti)) {
- struct sctp_transport *transport = obj;
+again:
+ ret = sctp_transport_walk_start(&hti);
+ if (ret)
+ return ret;
- if (!sctp_transport_hold(transport))
+ tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
+ for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
+ if (!sctp_transport_hold(tsp))
continue;
- err = cb(transport, p);
- sctp_transport_put(transport);
- if (err)
+ ret = cb(tsp, p);
+ if (ret)
break;
+ (*pos)++;
+ sctp_transport_put(tsp);
}
sctp_transport_walk_stop(&hti);
- return err;
+ if (ret) {
+ if (cb_done && !cb_done(tsp, p)) {
+ (*pos)++;
+ sctp_transport_put(tsp);
+ goto again;
+ }
+ sctp_transport_put(tsp);
+ }
+
+ return ret;
}
EXPORT_SYMBOL_GPL(sctp_for_each_transport);
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 8c6d24b2995d..745f145d4c4d 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -282,6 +282,7 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
__be32 *subnet, u8 *prefix_len)
{
struct dst_entry *dst = sk_dst_get(clcsock->sk);
+ struct in_device *in_dev;
struct sockaddr_in addr;
int rc = -ENOENT;
int len;
@@ -298,14 +299,17 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
/* get address to which the internal TCP socket is bound */
kernel_getsockname(clcsock, (struct sockaddr *)&addr, &len);
/* analyze IPv4 specific data of net_device belonging to TCP socket */
- for_ifa(dst->dev->ip_ptr) {
- if (ifa->ifa_address != addr.sin_addr.s_addr)
+ rcu_read_lock();
+ in_dev = __in_dev_get_rcu(dst->dev);
+ for_ifa(in_dev) {
+ if (!inet_ifa_match(addr.sin_addr.s_addr, ifa))
continue;
*prefix_len = inet_mask_len(ifa->ifa_mask);
*subnet = ifa->ifa_address & ifa->ifa_mask;
rc = 0;
break;
- } endfor_ifa(dst->dev->ip_ptr);
+ } endfor_ifa(in_dev);
+ rcu_read_unlock();
out_rel:
dst_release(dst);
@@ -509,7 +513,7 @@ decline_rdma:
/* RDMA setup failed, switch back to TCP */
smc->use_fallback = true;
if (reason_code && (reason_code != SMC_CLC_DECL_REPLY)) {
- rc = smc_clc_send_decline(smc, reason_code, 0);
+ rc = smc_clc_send_decline(smc, reason_code);
if (rc < sizeof(struct smc_clc_msg_decline))
goto out_err;
}
@@ -804,8 +808,6 @@ static void smc_listen_work(struct work_struct *work)
rc = local_contact;
if (rc == -ENOMEM)
reason_code = SMC_CLC_DECL_MEM;/* insufficient memory*/
- else if (rc == -ENOLINK)
- reason_code = SMC_CLC_DECL_SYNCERR; /* synchr. error */
goto decline_rdma;
}
link = &new_smc->conn.lgr->lnk[SMC_SINGLE_LINK];
@@ -899,7 +901,7 @@ decline_rdma:
smc_conn_free(&new_smc->conn);
new_smc->use_fallback = true;
if (reason_code && (reason_code != SMC_CLC_DECL_REPLY)) {
- rc = smc_clc_send_decline(new_smc, reason_code, 0);
+ rc = smc_clc_send_decline(new_smc, reason_code);
if (rc < sizeof(struct smc_clc_msg_decline))
goto out_err;
}
diff --git a/net/smc/smc.h b/net/smc/smc.h
index 6e44313e4467..0ccd6fa387ad 100644
--- a/net/smc/smc.h
+++ b/net/smc/smc.h
@@ -149,7 +149,7 @@ struct smc_connection {
atomic_t sndbuf_space; /* remaining space in sndbuf */
u16 tx_cdc_seq; /* sequence # for CDC send */
spinlock_t send_lock; /* protect wr_sends */
- struct work_struct tx_work; /* retry of smc_cdc_msg_send */
+ struct delayed_work tx_work; /* retry of smc_cdc_msg_send */
struct smc_host_cdc_msg local_rx_ctrl; /* filled during event_handl.
* .prod cf. TCP rcv_nxt
diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c
index 3934913ab835..b7dd2743fb5c 100644
--- a/net/smc/smc_clc.c
+++ b/net/smc/smc_clc.c
@@ -95,9 +95,10 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
}
if (clcm->type == SMC_CLC_DECLINE) {
reason_code = SMC_CLC_DECL_REPLY;
- if (ntohl(((struct smc_clc_msg_decline *)buf)->peer_diagnosis)
- == SMC_CLC_DECL_SYNCERR)
+ if (((struct smc_clc_msg_decline *)buf)->hdr.flag) {
smc->conn.lgr->sync_err = true;
+ smc_lgr_terminate(smc->conn.lgr);
+ }
}
out:
@@ -105,8 +106,7 @@ out:
}
/* send CLC DECLINE message across internal TCP socket */
-int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info,
- u8 out_of_sync)
+int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info)
{
struct smc_clc_msg_decline dclc;
struct msghdr msg;
@@ -118,7 +118,7 @@ int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info,
dclc.hdr.type = SMC_CLC_DECLINE;
dclc.hdr.length = htons(sizeof(struct smc_clc_msg_decline));
dclc.hdr.version = SMC_CLC_V1;
- dclc.hdr.flag = out_of_sync ? 1 : 0;
+ dclc.hdr.flag = (peer_diag_info == SMC_CLC_DECL_SYNCERR) ? 1 : 0;
memcpy(dclc.id_for_peer, local_systemid, sizeof(local_systemid));
dclc.peer_diagnosis = htonl(peer_diag_info);
memcpy(dclc.trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
diff --git a/net/smc/smc_clc.h b/net/smc/smc_clc.h
index 13db8ce177c9..1c55414041d4 100644
--- a/net/smc/smc_clc.h
+++ b/net/smc/smc_clc.h
@@ -106,8 +106,7 @@ struct smc_ib_device;
int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
u8 expected_type);
-int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info,
- u8 out_of_sync);
+int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info);
int smc_clc_send_proposal(struct smc_sock *smc, struct smc_ib_device *smcibdev,
u8 ibport);
int smc_clc_send_confirm(struct smc_sock *smc);
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c
index 3c2e166b5d22..f0d16fb825f7 100644
--- a/net/smc/smc_close.c
+++ b/net/smc/smc_close.c
@@ -174,15 +174,15 @@ int smc_close_active(struct smc_sock *smc)
{
struct smc_cdc_conn_state_flags *txflags =
&smc->conn.local_tx_ctrl.conn_state_flags;
- long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT;
struct smc_connection *conn = &smc->conn;
struct sock *sk = &smc->sk;
int old_state;
+ long timeout;
int rc = 0;
- if (sock_flag(sk, SOCK_LINGER) &&
- !(current->flags & PF_EXITING))
- timeout = sk->sk_lingertime;
+ timeout = current->flags & PF_EXITING ?
+ 0 : sock_flag(sk, SOCK_LINGER) ?
+ sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
again:
old_state = sk->sk_state;
@@ -208,7 +208,7 @@ again:
case SMC_ACTIVE:
smc_close_stream_wait(smc, timeout);
release_sock(sk);
- cancel_work_sync(&conn->tx_work);
+ cancel_delayed_work_sync(&conn->tx_work);
lock_sock(sk);
if (sk->sk_state == SMC_ACTIVE) {
/* send close request */
@@ -234,7 +234,7 @@ again:
if (!smc_cdc_rxed_any_close(conn))
smc_close_stream_wait(smc, timeout);
release_sock(sk);
- cancel_work_sync(&conn->tx_work);
+ cancel_delayed_work_sync(&conn->tx_work);
lock_sock(sk);
if (sk->sk_err != ECONNABORTED) {
/* confirm close from peer */
@@ -263,7 +263,9 @@ again:
/* peer sending PeerConnectionClosed will cause transition */
break;
case SMC_PROCESSABORT:
- cancel_work_sync(&conn->tx_work);
+ release_sock(sk);
+ cancel_delayed_work_sync(&conn->tx_work);
+ lock_sock(sk);
smc_close_abort(conn);
sk->sk_state = SMC_CLOSED;
smc_close_wait_tx_pends(smc);
@@ -411,13 +413,14 @@ void smc_close_sock_put_work(struct work_struct *work)
int smc_close_shutdown_write(struct smc_sock *smc)
{
struct smc_connection *conn = &smc->conn;
- long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT;
struct sock *sk = &smc->sk;
int old_state;
+ long timeout;
int rc = 0;
- if (sock_flag(sk, SOCK_LINGER))
- timeout = sk->sk_lingertime;
+ timeout = current->flags & PF_EXITING ?
+ 0 : sock_flag(sk, SOCK_LINGER) ?
+ sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
again:
old_state = sk->sk_state;
@@ -425,7 +428,7 @@ again:
case SMC_ACTIVE:
smc_close_stream_wait(smc, timeout);
release_sock(sk);
- cancel_work_sync(&conn->tx_work);
+ cancel_delayed_work_sync(&conn->tx_work);
lock_sock(sk);
/* send close wr request */
rc = smc_close_wr(conn);
@@ -439,7 +442,7 @@ again:
if (!smc_cdc_rxed_any_close(conn))
smc_close_stream_wait(smc, timeout);
release_sock(sk);
- cancel_work_sync(&conn->tx_work);
+ cancel_delayed_work_sync(&conn->tx_work);
lock_sock(sk);
/* confirm close from peer */
rc = smc_close_wr(conn);
diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
index 1a16d51e2330..20b66e79c5d6 100644
--- a/net/smc/smc_core.c
+++ b/net/smc/smc_core.c
@@ -25,8 +25,9 @@
#include "smc_cdc.h"
#include "smc_close.h"
-#define SMC_LGR_NUM_INCR 256
-#define SMC_LGR_FREE_DELAY (600 * HZ)
+#define SMC_LGR_NUM_INCR 256
+#define SMC_LGR_FREE_DELAY_SERV (600 * HZ)
+#define SMC_LGR_FREE_DELAY_CLNT (SMC_LGR_FREE_DELAY_SERV + 10)
static u32 smc_lgr_num; /* unique link group number */
@@ -107,8 +108,15 @@ static void smc_lgr_unregister_conn(struct smc_connection *conn)
__smc_lgr_unregister_conn(conn);
}
write_unlock_bh(&lgr->conns_lock);
- if (reduced && !lgr->conns_num)
- schedule_delayed_work(&lgr->free_work, SMC_LGR_FREE_DELAY);
+ if (!reduced || lgr->conns_num)
+ return;
+ /* client link group creation always follows the server link group
+ * creation. For client use a somewhat higher removal delay time,
+ * otherwise there is a risk of out-of-sync link groups.
+ */
+ mod_delayed_work(system_wq, &lgr->free_work,
+ lgr->role == SMC_CLNT ? SMC_LGR_FREE_DELAY_CLNT :
+ SMC_LGR_FREE_DELAY_SERV);
}
static void smc_lgr_free_work(struct work_struct *work)
diff --git a/net/smc/smc_ib.c b/net/smc/smc_ib.c
index 547e0e113b17..0b5852299158 100644
--- a/net/smc/smc_ib.c
+++ b/net/smc/smc_ib.c
@@ -380,6 +380,7 @@ static int smc_ib_fill_gid_and_mac(struct smc_ib_device *smcibdev, u8 ibport)
ndev = smcibdev->ibdev->get_netdev(smcibdev->ibdev, ibport);
if (ndev) {
memcpy(&smcibdev->mac, ndev->dev_addr, ETH_ALEN);
+ dev_put(ndev);
} else if (!rc) {
memcpy(&smcibdev->mac[ibport - 1][0],
&smcibdev->gid[ibport - 1].raw[8], 3);
diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c
index 78f7af28ae4f..31f8453c25c5 100644
--- a/net/smc/smc_pnet.c
+++ b/net/smc/smc_pnet.c
@@ -181,8 +181,10 @@ static int smc_pnet_enter(struct smc_pnetentry *new_pnetelem)
sizeof(new_pnetelem->ndev->name)) ||
smc_pnet_same_ibname(pnetelem,
new_pnetelem->smcibdev->ibdev->name,
- new_pnetelem->ib_port))
+ new_pnetelem->ib_port)) {
+ dev_put(pnetelem->ndev);
goto found;
+ }
}
list_add_tail(&new_pnetelem->list, &smc_pnettable.pnetlist);
rc = 0;
diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c
index b17a333e9bb0..3e631ae4b6b6 100644
--- a/net/smc/smc_rx.c
+++ b/net/smc/smc_rx.c
@@ -148,6 +148,8 @@ int smc_rx_recvmsg(struct smc_sock *smc, struct msghdr *msg, size_t len,
read_done = sock_intr_errno(timeo);
break;
}
+ if (!timeo)
+ return -EAGAIN;
}
if (!atomic_read(&conn->bytes_to_rcv)) {
diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c
index 3c656beb8820..3866573288dd 100644
--- a/net/smc/smc_tx.c
+++ b/net/smc/smc_tx.c
@@ -24,6 +24,8 @@
#include "smc_cdc.h"
#include "smc_tx.h"
+#define SMC_TX_WORK_DELAY HZ
+
/***************************** sndbuf producer *******************************/
/* callback implementation for sk.sk_write_space()
@@ -406,7 +408,8 @@ int smc_tx_sndbuf_nonempty(struct smc_connection *conn)
goto out_unlock;
}
rc = 0;
- schedule_work(&conn->tx_work);
+ schedule_delayed_work(&conn->tx_work,
+ SMC_TX_WORK_DELAY);
}
goto out_unlock;
}
@@ -430,7 +433,7 @@ out_unlock:
*/
static void smc_tx_work(struct work_struct *work)
{
- struct smc_connection *conn = container_of(work,
+ struct smc_connection *conn = container_of(to_delayed_work(work),
struct smc_connection,
tx_work);
struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
@@ -468,7 +471,8 @@ void smc_tx_consumer_update(struct smc_connection *conn)
if (!rc)
rc = smc_cdc_msg_send(conn, wr_buf, pend);
if (rc < 0) {
- schedule_work(&conn->tx_work);
+ schedule_delayed_work(&conn->tx_work,
+ SMC_TX_WORK_DELAY);
return;
}
smc_curs_write(&conn->rx_curs_confirmed,
@@ -487,6 +491,6 @@ void smc_tx_consumer_update(struct smc_connection *conn)
void smc_tx_init(struct smc_sock *smc)
{
smc->sk.sk_write_space = smc_tx_write_space;
- INIT_WORK(&smc->conn.tx_work, smc_tx_work);
+ INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work);
spin_lock_init(&smc->conn.send_lock);
}
diff --git a/net/smc/smc_wr.c b/net/smc/smc_wr.c
index ab56bda66783..525d91e0d57e 100644
--- a/net/smc/smc_wr.c
+++ b/net/smc/smc_wr.c
@@ -244,7 +244,7 @@ int smc_wr_tx_send(struct smc_link *link, struct smc_wr_tx_pend_priv *priv)
int rc;
ib_req_notify_cq(link->smcibdev->roce_cq_send,
- IB_CQ_SOLICITED_MASK | IB_CQ_REPORT_MISSED_EVENTS);
+ IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS);
pend = container_of(priv, struct smc_wr_tx_pend, priv);
rc = ib_post_send(link->roce_qp, &link->wr_tx_ibs[pend->idx],
&failed_wr);
diff --git a/net/sunrpc/backchannel_rqst.c b/net/sunrpc/backchannel_rqst.c
index ac701c28f44f..c2c68a15b59d 100644
--- a/net/sunrpc/backchannel_rqst.c
+++ b/net/sunrpc/backchannel_rqst.c
@@ -171,10 +171,10 @@ int xprt_setup_bc(struct rpc_xprt *xprt, unsigned int min_reqs)
/*
* Add the temporary list to the backchannel preallocation list
*/
- spin_lock_bh(&xprt->bc_pa_lock);
+ spin_lock(&xprt->bc_pa_lock);
list_splice(&tmp_list, &xprt->bc_pa_list);
xprt_inc_alloc_count(xprt, min_reqs);
- spin_unlock_bh(&xprt->bc_pa_lock);
+ spin_unlock(&xprt->bc_pa_lock);
dprintk("RPC: setup backchannel transport done\n");
return 0;
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 2e49d1f892b7..2ad827db2704 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1903,6 +1903,14 @@ call_connect_status(struct rpc_task *task)
task->tk_status = 0;
switch (status) {
case -ECONNREFUSED:
+ /* A positive refusal suggests a rebind is needed. */
+ if (RPC_IS_SOFTCONN(task))
+ break;
+ if (clnt->cl_autobind) {
+ rpc_force_rebind(clnt);
+ task->tk_action = call_bind;
+ return;
+ }
case -ECONNRESET:
case -ECONNABORTED:
case -ENETUNREACH:
@@ -2139,10 +2147,6 @@ call_status(struct rpc_task *task)
rpc_delay(task, 3*HZ);
case -ETIMEDOUT:
task->tk_action = call_timeout;
- if (!(task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT)
- && task->tk_client->cl_discrtry)
- xprt_conditional_disconnect(req->rq_xprt,
- req->rq_connect_cookie);
break;
case -ECONNREFUSED:
case -ECONNRESET:
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 399fab5d1936..ff8e06cd067e 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -1013,7 +1013,7 @@ static int receive_cb_reply(struct svc_sock *svsk, struct svc_rqst *rqstp)
if (!bc_xprt)
return -EAGAIN;
- spin_lock_bh(&bc_xprt->transport_lock);
+ spin_lock(&bc_xprt->recv_lock);
req = xprt_lookup_rqst(bc_xprt, xid);
if (!req)
goto unlock_notfound;
@@ -1031,7 +1031,7 @@ static int receive_cb_reply(struct svc_sock *svsk, struct svc_rqst *rqstp)
memcpy(dst->iov_base, src->iov_base, src->iov_len);
xprt_complete_rqst(req->rq_task, rqstp->rq_arg.len);
rqstp->rq_arg.len = 0;
- spin_unlock_bh(&bc_xprt->transport_lock);
+ spin_unlock(&bc_xprt->recv_lock);
return 0;
unlock_notfound:
printk(KERN_NOTICE
@@ -1040,7 +1040,7 @@ unlock_notfound:
__func__, ntohl(calldir),
bc_xprt, ntohl(xid));
unlock_eagain:
- spin_unlock_bh(&bc_xprt->transport_lock);
+ spin_unlock(&bc_xprt->recv_lock);
return -EAGAIN;
}
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 4654a9934269..e741ec2b4d8e 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -844,6 +844,50 @@ struct rpc_rqst *xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid)
}
EXPORT_SYMBOL_GPL(xprt_lookup_rqst);
+/**
+ * xprt_pin_rqst - Pin a request on the transport receive list
+ * @req: Request to pin
+ *
+ * Caller must ensure this is atomic with the call to xprt_lookup_rqst()
+ * so should be holding the xprt transport lock.
+ */
+void xprt_pin_rqst(struct rpc_rqst *req)
+{
+ set_bit(RPC_TASK_MSG_RECV, &req->rq_task->tk_runstate);
+}
+EXPORT_SYMBOL_GPL(xprt_pin_rqst);
+
+/**
+ * xprt_unpin_rqst - Unpin a request on the transport receive list
+ * @req: Request to pin
+ *
+ * Caller should be holding the xprt transport lock.
+ */
+void xprt_unpin_rqst(struct rpc_rqst *req)
+{
+ struct rpc_task *task = req->rq_task;
+
+ clear_bit(RPC_TASK_MSG_RECV, &task->tk_runstate);
+ if (test_bit(RPC_TASK_MSG_RECV_WAIT, &task->tk_runstate))
+ wake_up_bit(&task->tk_runstate, RPC_TASK_MSG_RECV);
+}
+EXPORT_SYMBOL_GPL(xprt_unpin_rqst);
+
+static void xprt_wait_on_pinned_rqst(struct rpc_rqst *req)
+__must_hold(&req->rq_xprt->recv_lock)
+{
+ struct rpc_task *task = req->rq_task;
+
+ if (task && test_bit(RPC_TASK_MSG_RECV, &task->tk_runstate)) {
+ spin_unlock(&req->rq_xprt->recv_lock);
+ set_bit(RPC_TASK_MSG_RECV_WAIT, &task->tk_runstate);
+ wait_on_bit(&task->tk_runstate, RPC_TASK_MSG_RECV,
+ TASK_UNINTERRUPTIBLE);
+ clear_bit(RPC_TASK_MSG_RECV_WAIT, &task->tk_runstate);
+ spin_lock(&req->rq_xprt->recv_lock);
+ }
+}
+
static void xprt_update_rtt(struct rpc_task *task)
{
struct rpc_rqst *req = task->tk_rqstp;
@@ -966,13 +1010,13 @@ void xprt_transmit(struct rpc_task *task)
/*
* Add to the list only if we're expecting a reply
*/
- spin_lock_bh(&xprt->transport_lock);
/* Update the softirq receive buffer */
memcpy(&req->rq_private_buf, &req->rq_rcv_buf,
sizeof(req->rq_private_buf));
/* Add request to the receive list */
+ spin_lock(&xprt->recv_lock);
list_add_tail(&req->rq_list, &xprt->recv);
- spin_unlock_bh(&xprt->transport_lock);
+ spin_unlock(&xprt->recv_lock);
xprt_reset_majortimeo(req);
/* Turn off autodisconnect */
del_singleshot_timer_sync(&xprt->timer);
@@ -1287,12 +1331,16 @@ void xprt_release(struct rpc_task *task)
task->tk_ops->rpc_count_stats(task, task->tk_calldata);
else if (task->tk_client)
rpc_count_iostats(task, task->tk_client->cl_metrics);
+ spin_lock(&xprt->recv_lock);
+ if (!list_empty(&req->rq_list)) {
+ list_del(&req->rq_list);
+ xprt_wait_on_pinned_rqst(req);
+ }
+ spin_unlock(&xprt->recv_lock);
spin_lock_bh(&xprt->transport_lock);
xprt->ops->release_xprt(xprt, task);
if (xprt->ops->release_request)
xprt->ops->release_request(task);
- if (!list_empty(&req->rq_list))
- list_del(&req->rq_list);
xprt->last_used = jiffies;
xprt_schedule_autodisconnect(xprt);
spin_unlock_bh(&xprt->transport_lock);
@@ -1318,6 +1366,7 @@ static void xprt_init(struct rpc_xprt *xprt, struct net *net)
spin_lock_init(&xprt->transport_lock);
spin_lock_init(&xprt->reserve_lock);
+ spin_lock_init(&xprt->recv_lock);
INIT_LIST_HEAD(&xprt->free);
INIT_LIST_HEAD(&xprt->recv);
diff --git a/net/sunrpc/xprtrdma/backchannel.c b/net/sunrpc/xprtrdma/backchannel.c
index 03f6b5840764..d31d0ac5ada9 100644
--- a/net/sunrpc/xprtrdma/backchannel.c
+++ b/net/sunrpc/xprtrdma/backchannel.c
@@ -49,6 +49,7 @@ static int rpcrdma_bc_setup_rqst(struct rpcrdma_xprt *r_xprt,
if (IS_ERR(rb))
goto out_fail;
req->rl_rdmabuf = rb;
+ xdr_buf_init(&req->rl_hdrbuf, rb->rg_base, rdmab_length(rb));
size = r_xprt->rx_data.inline_rsize;
rb = rpcrdma_alloc_regbuf(size, DMA_TO_DEVICE, GFP_KERNEL);
@@ -202,20 +203,24 @@ size_t xprt_rdma_bc_maxpayload(struct rpc_xprt *xprt)
*/
int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)
{
- struct rpc_xprt *xprt = rqst->rq_xprt;
- struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
+ struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(rqst->rq_xprt);
struct rpcrdma_req *req = rpcr_to_rdmar(rqst);
- struct rpcrdma_msg *headerp;
-
- headerp = rdmab_to_msg(req->rl_rdmabuf);
- headerp->rm_xid = rqst->rq_xid;
- headerp->rm_vers = rpcrdma_version;
- headerp->rm_credit =
- cpu_to_be32(r_xprt->rx_buf.rb_bc_srv_max_requests);
- headerp->rm_type = rdma_msg;
- headerp->rm_body.rm_chunks[0] = xdr_zero;
- headerp->rm_body.rm_chunks[1] = xdr_zero;
- headerp->rm_body.rm_chunks[2] = xdr_zero;
+ __be32 *p;
+
+ rpcrdma_set_xdrlen(&req->rl_hdrbuf, 0);
+ xdr_init_encode(&req->rl_stream, &req->rl_hdrbuf,
+ req->rl_rdmabuf->rg_base);
+
+ p = xdr_reserve_space(&req->rl_stream, 28);
+ if (unlikely(!p))
+ return -EIO;
+ *p++ = rqst->rq_xid;
+ *p++ = rpcrdma_version;
+ *p++ = cpu_to_be32(r_xprt->rx_buf.rb_bc_srv_max_requests);
+ *p++ = rdma_msg;
+ *p++ = xdr_zero;
+ *p++ = xdr_zero;
+ *p = xdr_zero;
if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, RPCRDMA_HDRLEN_MIN,
&rqst->rq_snd_buf, rpcrdma_noch))
@@ -271,9 +276,6 @@ void xprt_rdma_bc_free_rqst(struct rpc_rqst *rqst)
* @xprt: transport receiving the call
* @rep: receive buffer containing the call
*
- * Called in the RPC reply handler, which runs in a tasklet.
- * Be quick about it.
- *
* Operational assumptions:
* o Backchannel credits are ignored, just as the NFS server
* forechannel currently does
@@ -284,7 +286,6 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
struct rpcrdma_rep *rep)
{
struct rpc_xprt *xprt = &r_xprt->rx_xprt;
- struct rpcrdma_msg *headerp;
struct svc_serv *bc_serv;
struct rpcrdma_req *req;
struct rpc_rqst *rqst;
@@ -292,24 +293,15 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
size_t size;
__be32 *p;
- headerp = rdmab_to_msg(rep->rr_rdmabuf);
+ p = xdr_inline_decode(&rep->rr_stream, 0);
+ size = xdr_stream_remaining(&rep->rr_stream);
+
#ifdef RPCRDMA_BACKCHANNEL_DEBUG
pr_info("RPC: %s: callback XID %08x, length=%u\n",
- __func__, be32_to_cpu(headerp->rm_xid), rep->rr_len);
- pr_info("RPC: %s: %*ph\n", __func__, rep->rr_len, headerp);
+ __func__, be32_to_cpup(p), size);
+ pr_info("RPC: %s: %*ph\n", __func__, size, p);
#endif
- /* Sanity check:
- * Need at least enough bytes for RPC/RDMA header, as code
- * here references the header fields by array offset. Also,
- * backward calls are always inline, so ensure there
- * are some bytes beyond the RPC/RDMA header.
- */
- if (rep->rr_len < RPCRDMA_HDRLEN_MIN + 24)
- goto out_short;
- p = (__be32 *)((unsigned char *)headerp + RPCRDMA_HDRLEN_MIN);
- size = rep->rr_len - RPCRDMA_HDRLEN_MIN;
-
/* Grab a free bc rqst */
spin_lock(&xprt->bc_pa_lock);
if (list_empty(&xprt->bc_pa_list)) {
@@ -325,7 +317,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
/* Prepare rqst */
rqst->rq_reply_bytes_recvd = 0;
rqst->rq_bytes_sent = 0;
- rqst->rq_xid = headerp->rm_xid;
+ rqst->rq_xid = *p;
rqst->rq_private_buf.len = size;
set_bit(RPC_BC_PA_IN_USE, &rqst->rq_bc_pa_state);
@@ -337,9 +329,9 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt,
buf->len = size;
/* The receive buffer has to be hooked to the rpcrdma_req
- * so that it can be reposted after the server is done
- * parsing it but just before sending the backward
- * direction reply.
+ * so that it is not released while the req is pointing
+ * to its buffer, and so that it can be reposted after
+ * the Upper Layer is done decoding it.
*/
req = rpcr_to_rdmar(rqst);
dprintk("RPC: %s: attaching rep %p to req %p\n",
@@ -367,13 +359,4 @@ out_overflow:
* when the connection is re-established.
*/
return;
-
-out_short:
- pr_warn("RPC/RDMA short backward direction call\n");
-
- if (rpcrdma_ep_post_recv(&r_xprt->rx_ia, rep))
- xprt_disconnect_done(xprt);
- else
- pr_warn("RPC: %s: reposting rep %p\n",
- __func__, rep);
}
diff --git a/net/sunrpc/xprtrdma/fmr_ops.c b/net/sunrpc/xprtrdma/fmr_ops.c
index d3f84bb1d443..6c7151341194 100644
--- a/net/sunrpc/xprtrdma/fmr_ops.c
+++ b/net/sunrpc/xprtrdma/fmr_ops.c
@@ -177,7 +177,7 @@ fmr_op_maxpages(struct rpcrdma_xprt *r_xprt)
/* Use the ib_map_phys_fmr() verb to register a memory region
* for remote access via RDMA READ or RDMA WRITE.
*/
-static int
+static struct rpcrdma_mr_seg *
fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
int nsegs, bool writing, struct rpcrdma_mw **out)
{
@@ -188,7 +188,7 @@ fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
mw = rpcrdma_get_mw(r_xprt);
if (!mw)
- return -ENOBUFS;
+ return ERR_PTR(-ENOBUFS);
pageoff = offset_in_page(seg1->mr_offset);
seg1->mr_offset -= pageoff; /* start of page */
@@ -232,13 +232,13 @@ fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
mw->mw_offset = dma_pages[0] + pageoff;
*out = mw;
- return mw->mw_nents;
+ return seg;
out_dmamap_err:
pr_err("rpcrdma: failed to DMA map sg %p sg_nents %d\n",
mw->mw_sg, i);
rpcrdma_put_mw(r_xprt, mw);
- return -EIO;
+ return ERR_PTR(-EIO);
out_maperr:
pr_err("rpcrdma: ib_map_phys_fmr %u@0x%llx+%i (%d) status %i\n",
@@ -247,7 +247,7 @@ out_maperr:
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
mw->mw_sg, mw->mw_nents, mw->mw_dir);
rpcrdma_put_mw(r_xprt, mw);
- return -EIO;
+ return ERR_PTR(-EIO);
}
/* Invalidate all memory regions that were registered for "req".
diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c
index 6aea36a38bfd..df062e086bdb 100644
--- a/net/sunrpc/xprtrdma/frwr_ops.c
+++ b/net/sunrpc/xprtrdma/frwr_ops.c
@@ -344,7 +344,7 @@ frwr_wc_localinv_wake(struct ib_cq *cq, struct ib_wc *wc)
/* Post a REG_MR Work Request to register a memory region
* for remote access via RDMA READ or RDMA WRITE.
*/
-static int
+static struct rpcrdma_mr_seg *
frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
int nsegs, bool writing, struct rpcrdma_mw **out)
{
@@ -364,7 +364,7 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
rpcrdma_defer_mr_recovery(mw);
mw = rpcrdma_get_mw(r_xprt);
if (!mw)
- return -ENOBUFS;
+ return ERR_PTR(-ENOBUFS);
} while (mw->frmr.fr_state != FRMR_IS_INVALID);
frmr = &mw->frmr;
frmr->fr_state = FRMR_IS_VALID;
@@ -401,7 +401,7 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
if (unlikely(n != mw->mw_nents))
goto out_mapmr_err;
- dprintk("RPC: %s: Using frmr %p to map %u segments (%u bytes)\n",
+ dprintk("RPC: %s: Using frmr %p to map %u segments (%llu bytes)\n",
__func__, frmr, mw->mw_nents, mr->length);
key = (u8)(mr->rkey & 0x000000FF);
@@ -429,25 +429,25 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
mw->mw_offset = mr->iova;
*out = mw;
- return mw->mw_nents;
+ return seg;
out_dmamap_err:
pr_err("rpcrdma: failed to DMA map sg %p sg_nents %d\n",
mw->mw_sg, i);
frmr->fr_state = FRMR_IS_INVALID;
rpcrdma_put_mw(r_xprt, mw);
- return -EIO;
+ return ERR_PTR(-EIO);
out_mapmr_err:
pr_err("rpcrdma: failed to map mr %p (%d/%d)\n",
frmr->fr_mr, n, mw->mw_nents);
rpcrdma_defer_mr_recovery(mw);
- return -EIO;
+ return ERR_PTR(-EIO);
out_senderr:
pr_err("rpcrdma: FRMR registration ib_post_send returned %i\n", rc);
rpcrdma_defer_mr_recovery(mw);
- return -ENOTCONN;
+ return ERR_PTR(-ENOTCONN);
}
/* Invalidate all memory regions that were registered for "req".
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c
index ca4d6e4528f3..f1889f4d4803 100644
--- a/net/sunrpc/xprtrdma/rpc_rdma.c
+++ b/net/sunrpc/xprtrdma/rpc_rdma.c
@@ -169,40 +169,41 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt,
return rqst->rq_rcv_buf.buflen <= ia->ri_max_inline_read;
}
-/* Split "vec" on page boundaries into segments. FMR registers pages,
- * not a byte range. Other modes coalesce these segments into a single
- * MR when they can.
+/* Split @vec on page boundaries into SGEs. FMR registers pages, not
+ * a byte range. Other modes coalesce these SGEs into a single MR
+ * when they can.
+ *
+ * Returns pointer to next available SGE, and bumps the total number
+ * of SGEs consumed.
*/
-static int
-rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg, int n)
+static struct rpcrdma_mr_seg *
+rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg,
+ unsigned int *n)
{
- size_t page_offset;
- u32 remaining;
+ u32 remaining, page_offset;
char *base;
base = vec->iov_base;
page_offset = offset_in_page(base);
remaining = vec->iov_len;
- while (remaining && n < RPCRDMA_MAX_SEGS) {
- seg[n].mr_page = NULL;
- seg[n].mr_offset = base;
- seg[n].mr_len = min_t(u32, PAGE_SIZE - page_offset, remaining);
- remaining -= seg[n].mr_len;
- base += seg[n].mr_len;
- ++n;
+ while (remaining) {
+ seg->mr_page = NULL;
+ seg->mr_offset = base;
+ seg->mr_len = min_t(u32, PAGE_SIZE - page_offset, remaining);
+ remaining -= seg->mr_len;
+ base += seg->mr_len;
+ ++seg;
+ ++(*n);
page_offset = 0;
}
- return n;
+ return seg;
}
-/*
- * Chunk assembly from upper layer xdr_buf.
- *
- * Prepare the passed-in xdr_buf into representation as RPC/RDMA chunk
- * elements. Segments are then coalesced when registered, if possible
- * within the selected memreg mode.
+/* Convert @xdrbuf into SGEs no larger than a page each. As they
+ * are registered, these SGEs are then coalesced into RDMA segments
+ * when the selected memreg mode supports it.
*
- * Returns positive number of segments converted, or a negative errno.
+ * Returns positive number of SGEs consumed, or a negative errno.
*/
static int
@@ -210,47 +211,41 @@ rpcrdma_convert_iovs(struct rpcrdma_xprt *r_xprt, struct xdr_buf *xdrbuf,
unsigned int pos, enum rpcrdma_chunktype type,
struct rpcrdma_mr_seg *seg)
{
- int len, n, p, page_base;
+ unsigned long page_base;
+ unsigned int len, n;
struct page **ppages;
n = 0;
- if (pos == 0) {
- n = rpcrdma_convert_kvec(&xdrbuf->head[0], seg, n);
- if (n == RPCRDMA_MAX_SEGS)
- goto out_overflow;
- }
+ if (pos == 0)
+ seg = rpcrdma_convert_kvec(&xdrbuf->head[0], seg, &n);
len = xdrbuf->page_len;
ppages = xdrbuf->pages + (xdrbuf->page_base >> PAGE_SHIFT);
page_base = offset_in_page(xdrbuf->page_base);
- p = 0;
- while (len && n < RPCRDMA_MAX_SEGS) {
- if (!ppages[p]) {
- /* alloc the pagelist for receiving buffer */
- ppages[p] = alloc_page(GFP_ATOMIC);
- if (!ppages[p])
+ while (len) {
+ if (unlikely(!*ppages)) {
+ /* XXX: Certain upper layer operations do
+ * not provide receive buffer pages.
+ */
+ *ppages = alloc_page(GFP_ATOMIC);
+ if (!*ppages)
return -EAGAIN;
}
- seg[n].mr_page = ppages[p];
- seg[n].mr_offset = (void *)(unsigned long) page_base;
- seg[n].mr_len = min_t(u32, PAGE_SIZE - page_base, len);
- if (seg[n].mr_len > PAGE_SIZE)
- goto out_overflow;
- len -= seg[n].mr_len;
+ seg->mr_page = *ppages;
+ seg->mr_offset = (char *)page_base;
+ seg->mr_len = min_t(u32, PAGE_SIZE - page_base, len);
+ len -= seg->mr_len;
+ ++ppages;
+ ++seg;
++n;
- ++p;
- page_base = 0; /* page offset only applies to first page */
+ page_base = 0;
}
- /* Message overflows the seg array */
- if (len && n == RPCRDMA_MAX_SEGS)
- goto out_overflow;
-
/* When encoding a Read chunk, the tail iovec contains an
* XDR pad and may be omitted.
*/
if (type == rpcrdma_readch && r_xprt->rx_ia.ri_implicit_roundup)
- return n;
+ goto out;
/* When encoding a Write chunk, some servers need to see an
* extra segment for non-XDR-aligned Write chunks. The upper
@@ -258,30 +253,81 @@ rpcrdma_convert_iovs(struct rpcrdma_xprt *r_xprt, struct xdr_buf *xdrbuf,
* for this purpose.
*/
if (type == rpcrdma_writech && r_xprt->rx_ia.ri_implicit_roundup)
- return n;
+ goto out;
- if (xdrbuf->tail[0].iov_len) {
- n = rpcrdma_convert_kvec(&xdrbuf->tail[0], seg, n);
- if (n == RPCRDMA_MAX_SEGS)
- goto out_overflow;
- }
+ if (xdrbuf->tail[0].iov_len)
+ seg = rpcrdma_convert_kvec(&xdrbuf->tail[0], seg, &n);
+out:
+ if (unlikely(n > RPCRDMA_MAX_SEGS))
+ return -EIO;
return n;
+}
-out_overflow:
- pr_err("rpcrdma: segment array overflow\n");
- return -EIO;
+static inline int
+encode_item_present(struct xdr_stream *xdr)
+{
+ __be32 *p;
+
+ p = xdr_reserve_space(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EMSGSIZE;
+
+ *p = xdr_one;
+ return 0;
}
-static inline __be32 *
+static inline int
+encode_item_not_present(struct xdr_stream *xdr)
+{
+ __be32 *p;
+
+ p = xdr_reserve_space(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EMSGSIZE;
+
+ *p = xdr_zero;
+ return 0;
+}
+
+static void
xdr_encode_rdma_segment(__be32 *iptr, struct rpcrdma_mw *mw)
{
*iptr++ = cpu_to_be32(mw->mw_handle);
*iptr++ = cpu_to_be32(mw->mw_length);
- return xdr_encode_hyper(iptr, mw->mw_offset);
+ xdr_encode_hyper(iptr, mw->mw_offset);
}
-/* XDR-encode the Read list. Supports encoding a list of read
+static int
+encode_rdma_segment(struct xdr_stream *xdr, struct rpcrdma_mw *mw)
+{
+ __be32 *p;
+
+ p = xdr_reserve_space(xdr, 4 * sizeof(*p));
+ if (unlikely(!p))
+ return -EMSGSIZE;
+
+ xdr_encode_rdma_segment(p, mw);
+ return 0;
+}
+
+static int
+encode_read_segment(struct xdr_stream *xdr, struct rpcrdma_mw *mw,
+ u32 position)
+{
+ __be32 *p;
+
+ p = xdr_reserve_space(xdr, 6 * sizeof(*p));
+ if (unlikely(!p))
+ return -EMSGSIZE;
+
+ *p++ = xdr_one; /* Item present */
+ *p++ = cpu_to_be32(position);
+ xdr_encode_rdma_segment(p, mw);
+ return 0;
+}
+
+/* Register and XDR encode the Read list. Supports encoding a list of read
* segments that belong to a single read chunk.
*
* Encoding key for single-list chunks (HLOO = Handle32 Length32 Offset64):
@@ -290,23 +336,20 @@ xdr_encode_rdma_segment(__be32 *iptr, struct rpcrdma_mw *mw)
* N elements, position P (same P for all chunks of same arg!):
* 1 - PHLOO - 1 - PHLOO - ... - 1 - PHLOO - 0
*
- * Returns a pointer to the XDR word in the RDMA header following
- * the end of the Read list, or an error pointer.
+ * Returns zero on success, or a negative errno if a failure occurred.
+ * @xdr is advanced to the next position in the stream.
+ *
+ * Only a single @pos value is currently supported.
*/
-static __be32 *
-rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
- struct rpcrdma_req *req, struct rpc_rqst *rqst,
- __be32 *iptr, enum rpcrdma_chunktype rtype)
+static noinline int
+rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
+ struct rpc_rqst *rqst, enum rpcrdma_chunktype rtype)
{
+ struct xdr_stream *xdr = &req->rl_stream;
struct rpcrdma_mr_seg *seg;
struct rpcrdma_mw *mw;
unsigned int pos;
- int n, nsegs;
-
- if (rtype == rpcrdma_noch) {
- *iptr++ = xdr_zero; /* item not present */
- return iptr;
- }
+ int nsegs;
pos = rqst->rq_snd_buf.head[0].iov_len;
if (rtype == rpcrdma_areadch)
@@ -315,40 +358,33 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_snd_buf, pos,
rtype, seg);
if (nsegs < 0)
- return ERR_PTR(nsegs);
+ return nsegs;
do {
- n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
- false, &mw);
- if (n < 0)
- return ERR_PTR(n);
+ seg = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
+ false, &mw);
+ if (IS_ERR(seg))
+ return PTR_ERR(seg);
rpcrdma_push_mw(mw, &req->rl_registered);
- *iptr++ = xdr_one; /* item present */
-
- /* All read segments in this chunk
- * have the same "position".
- */
- *iptr++ = cpu_to_be32(pos);
- iptr = xdr_encode_rdma_segment(iptr, mw);
+ if (encode_read_segment(xdr, mw, pos) < 0)
+ return -EMSGSIZE;
dprintk("RPC: %5u %s: pos %u %u@0x%016llx:0x%08x (%s)\n",
rqst->rq_task->tk_pid, __func__, pos,
mw->mw_length, (unsigned long long)mw->mw_offset,
- mw->mw_handle, n < nsegs ? "more" : "last");
+ mw->mw_handle, mw->mw_nents < nsegs ? "more" : "last");
r_xprt->rx_stats.read_chunk_count++;
- seg += n;
- nsegs -= n;
+ nsegs -= mw->mw_nents;
} while (nsegs);
- /* Finish Read list */
- *iptr++ = xdr_zero; /* Next item not present */
- return iptr;
+ return 0;
}
-/* XDR-encode the Write list. Supports encoding a list containing
- * one array of plain segments that belong to a single write chunk.
+/* Register and XDR encode the Write list. Supports encoding a list
+ * containing one array of plain segments that belong to a single
+ * write chunk.
*
* Encoding key for single-list chunks (HLOO = Handle32 Length32 Offset64):
*
@@ -356,66 +392,65 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
* N elements:
* 1 - N - HLOO - HLOO - ... - HLOO - 0
*
- * Returns a pointer to the XDR word in the RDMA header following
- * the end of the Write list, or an error pointer.
+ * Returns zero on success, or a negative errno if a failure occurred.
+ * @xdr is advanced to the next position in the stream.
+ *
+ * Only a single Write chunk is currently supported.
*/
-static __be32 *
+static noinline int
rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
- struct rpc_rqst *rqst, __be32 *iptr,
- enum rpcrdma_chunktype wtype)
+ struct rpc_rqst *rqst, enum rpcrdma_chunktype wtype)
{
+ struct xdr_stream *xdr = &req->rl_stream;
struct rpcrdma_mr_seg *seg;
struct rpcrdma_mw *mw;
- int n, nsegs, nchunks;
+ int nsegs, nchunks;
__be32 *segcount;
- if (wtype != rpcrdma_writech) {
- *iptr++ = xdr_zero; /* no Write list present */
- return iptr;
- }
-
seg = req->rl_segments;
nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf,
rqst->rq_rcv_buf.head[0].iov_len,
wtype, seg);
if (nsegs < 0)
- return ERR_PTR(nsegs);
+ return nsegs;
- *iptr++ = xdr_one; /* Write list present */
- segcount = iptr++; /* save location of segment count */
+ if (encode_item_present(xdr) < 0)
+ return -EMSGSIZE;
+ segcount = xdr_reserve_space(xdr, sizeof(*segcount));
+ if (unlikely(!segcount))
+ return -EMSGSIZE;
+ /* Actual value encoded below */
nchunks = 0;
do {
- n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
- true, &mw);
- if (n < 0)
- return ERR_PTR(n);
+ seg = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
+ true, &mw);
+ if (IS_ERR(seg))
+ return PTR_ERR(seg);
rpcrdma_push_mw(mw, &req->rl_registered);
- iptr = xdr_encode_rdma_segment(iptr, mw);
+ if (encode_rdma_segment(xdr, mw) < 0)
+ return -EMSGSIZE;
dprintk("RPC: %5u %s: %u@0x016%llx:0x%08x (%s)\n",
rqst->rq_task->tk_pid, __func__,
mw->mw_length, (unsigned long long)mw->mw_offset,
- mw->mw_handle, n < nsegs ? "more" : "last");
+ mw->mw_handle, mw->mw_nents < nsegs ? "more" : "last");
r_xprt->rx_stats.write_chunk_count++;
r_xprt->rx_stats.total_rdma_request += seg->mr_len;
nchunks++;
- seg += n;
- nsegs -= n;
+ nsegs -= mw->mw_nents;
} while (nsegs);
/* Update count of segments in this Write chunk */
*segcount = cpu_to_be32(nchunks);
- /* Finish Write list */
- *iptr++ = xdr_zero; /* Next item not present */
- return iptr;
+ return 0;
}
-/* XDR-encode the Reply chunk. Supports encoding an array of plain
- * segments that belong to a single write (reply) chunk.
+/* Register and XDR encode the Reply chunk. Supports encoding an array
+ * of plain segments that belong to a single write (reply) chunk.
*
* Encoding key for single-list chunks (HLOO = Handle32 Length32 Offset64):
*
@@ -423,58 +458,57 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
* N elements:
* 1 - N - HLOO - HLOO - ... - HLOO
*
- * Returns a pointer to the XDR word in the RDMA header following
- * the end of the Reply chunk, or an error pointer.
+ * Returns zero on success, or a negative errno if a failure occurred.
+ * @xdr is advanced to the next position in the stream.
*/
-static __be32 *
-rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt,
- struct rpcrdma_req *req, struct rpc_rqst *rqst,
- __be32 *iptr, enum rpcrdma_chunktype wtype)
+static noinline int
+rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
+ struct rpc_rqst *rqst, enum rpcrdma_chunktype wtype)
{
+ struct xdr_stream *xdr = &req->rl_stream;
struct rpcrdma_mr_seg *seg;
struct rpcrdma_mw *mw;
- int n, nsegs, nchunks;
+ int nsegs, nchunks;
__be32 *segcount;
- if (wtype != rpcrdma_replych) {
- *iptr++ = xdr_zero; /* no Reply chunk present */
- return iptr;
- }
-
seg = req->rl_segments;
nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg);
if (nsegs < 0)
- return ERR_PTR(nsegs);
+ return nsegs;
- *iptr++ = xdr_one; /* Reply chunk present */
- segcount = iptr++; /* save location of segment count */
+ if (encode_item_present(xdr) < 0)
+ return -EMSGSIZE;
+ segcount = xdr_reserve_space(xdr, sizeof(*segcount));
+ if (unlikely(!segcount))
+ return -EMSGSIZE;
+ /* Actual value encoded below */
nchunks = 0;
do {
- n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
- true, &mw);
- if (n < 0)
- return ERR_PTR(n);
+ seg = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs,
+ true, &mw);
+ if (IS_ERR(seg))
+ return PTR_ERR(seg);
rpcrdma_push_mw(mw, &req->rl_registered);
- iptr = xdr_encode_rdma_segment(iptr, mw);
+ if (encode_rdma_segment(xdr, mw) < 0)
+ return -EMSGSIZE;
dprintk("RPC: %5u %s: %u@0x%016llx:0x%08x (%s)\n",
rqst->rq_task->tk_pid, __func__,
mw->mw_length, (unsigned long long)mw->mw_offset,
- mw->mw_handle, n < nsegs ? "more" : "last");
+ mw->mw_handle, mw->mw_nents < nsegs ? "more" : "last");
r_xprt->rx_stats.reply_chunk_count++;
r_xprt->rx_stats.total_rdma_request += seg->mr_len;
nchunks++;
- seg += n;
- nsegs -= n;
+ nsegs -= mw->mw_nents;
} while (nsegs);
/* Update count of segments in the Reply chunk */
*segcount = cpu_to_be32(nchunks);
- return iptr;
+ return 0;
}
/* Prepare the RPC-over-RDMA header SGE.
@@ -651,37 +685,52 @@ rpcrdma_unmap_sges(struct rpcrdma_ia *ia, struct rpcrdma_req *req)
req->rl_mapped_sges = 0;
}
-/*
- * Marshal a request: the primary job of this routine is to choose
- * the transfer modes. See comments below.
+/**
+ * rpcrdma_marshal_req - Marshal and send one RPC request
+ * @r_xprt: controlling transport
+ * @rqst: RPC request to be marshaled
+ *
+ * For the RPC in "rqst", this function:
+ * - Chooses the transfer mode (eg., RDMA_MSG or RDMA_NOMSG)
+ * - Registers Read, Write, and Reply chunks
+ * - Constructs the transport header
+ * - Posts a Send WR to send the transport header and request
*
- * Returns zero on success, otherwise a negative errno.
+ * Returns:
+ * %0 if the RPC was sent successfully,
+ * %-ENOTCONN if the connection was lost,
+ * %-EAGAIN if not enough pages are available for on-demand reply buffer,
+ * %-ENOBUFS if no MRs are available to register chunks,
+ * %-EMSGSIZE if the transport header is too small,
+ * %-EIO if a permanent problem occurred while marshaling.
*/
-
int
-rpcrdma_marshal_req(struct rpc_rqst *rqst)
+rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
{
- struct rpc_xprt *xprt = rqst->rq_xprt;
- struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
struct rpcrdma_req *req = rpcr_to_rdmar(rqst);
+ struct xdr_stream *xdr = &req->rl_stream;
enum rpcrdma_chunktype rtype, wtype;
- struct rpcrdma_msg *headerp;
bool ddp_allowed;
- ssize_t hdrlen;
- size_t rpclen;
- __be32 *iptr;
+ __be32 *p;
+ int ret;
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
if (test_bit(RPC_BC_PA_IN_USE, &rqst->rq_bc_pa_state))
return rpcrdma_bc_marshal_reply(rqst);
#endif
- headerp = rdmab_to_msg(req->rl_rdmabuf);
- /* don't byte-swap XID, it's already done in request */
- headerp->rm_xid = rqst->rq_xid;
- headerp->rm_vers = rpcrdma_version;
- headerp->rm_credit = cpu_to_be32(r_xprt->rx_buf.rb_max_requests);
- headerp->rm_type = rdma_msg;
+ rpcrdma_set_xdrlen(&req->rl_hdrbuf, 0);
+ xdr_init_encode(xdr, &req->rl_hdrbuf,
+ req->rl_rdmabuf->rg_base);
+
+ /* Fixed header fields */
+ ret = -EMSGSIZE;
+ p = xdr_reserve_space(xdr, 4 * sizeof(*p));
+ if (!p)
+ goto out_err;
+ *p++ = rqst->rq_xid;
+ *p++ = rpcrdma_version;
+ *p++ = cpu_to_be32(r_xprt->rx_buf.rb_max_requests);
/* When the ULP employs a GSS flavor that guarantees integrity
* or privacy, direct data placement of individual data items
@@ -721,22 +770,17 @@ rpcrdma_marshal_req(struct rpc_rqst *rqst)
* by themselves are larger than the inline threshold.
*/
if (rpcrdma_args_inline(r_xprt, rqst)) {
+ *p++ = rdma_msg;
rtype = rpcrdma_noch;
- rpclen = rqst->rq_snd_buf.len;
} else if (ddp_allowed && rqst->rq_snd_buf.flags & XDRBUF_WRITE) {
+ *p++ = rdma_msg;
rtype = rpcrdma_readch;
- rpclen = rqst->rq_snd_buf.head[0].iov_len +
- rqst->rq_snd_buf.tail[0].iov_len;
} else {
r_xprt->rx_stats.nomsg_call_count++;
- headerp->rm_type = htonl(RDMA_NOMSG);
+ *p++ = rdma_nomsg;
rtype = rpcrdma_areadch;
- rpclen = 0;
}
- req->rl_xid = rqst->rq_xid;
- rpcrdma_insert_req(&r_xprt->rx_buf, req);
-
/* This implementation supports the following combinations
* of chunk lists in one RPC-over-RDMA Call message:
*
@@ -759,79 +803,50 @@ rpcrdma_marshal_req(struct rpc_rqst *rqst)
* send a Call message with a Position Zero Read chunk and a
* regular Read chunk at the same time.
*/
- iptr = headerp->rm_body.rm_chunks;
- iptr = rpcrdma_encode_read_list(r_xprt, req, rqst, iptr, rtype);
- if (IS_ERR(iptr))
+ if (rtype != rpcrdma_noch) {
+ ret = rpcrdma_encode_read_list(r_xprt, req, rqst, rtype);
+ if (ret)
+ goto out_err;
+ }
+ ret = encode_item_not_present(xdr);
+ if (ret)
goto out_err;
- iptr = rpcrdma_encode_write_list(r_xprt, req, rqst, iptr, wtype);
- if (IS_ERR(iptr))
+
+ if (wtype == rpcrdma_writech) {
+ ret = rpcrdma_encode_write_list(r_xprt, req, rqst, wtype);
+ if (ret)
+ goto out_err;
+ }
+ ret = encode_item_not_present(xdr);
+ if (ret)
goto out_err;
- iptr = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, iptr, wtype);
- if (IS_ERR(iptr))
+
+ if (wtype != rpcrdma_replych)
+ ret = encode_item_not_present(xdr);
+ else
+ ret = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, wtype);
+ if (ret)
goto out_err;
- hdrlen = (unsigned char *)iptr - (unsigned char *)headerp;
- dprintk("RPC: %5u %s: %s/%s: hdrlen %zd rpclen %zd\n",
+ dprintk("RPC: %5u %s: %s/%s: hdrlen %u rpclen\n",
rqst->rq_task->tk_pid, __func__,
transfertypes[rtype], transfertypes[wtype],
- hdrlen, rpclen);
+ xdr_stream_pos(xdr));
- if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, hdrlen,
+ if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req,
+ xdr_stream_pos(xdr),
&rqst->rq_snd_buf, rtype)) {
- iptr = ERR_PTR(-EIO);
+ ret = -EIO;
goto out_err;
}
return 0;
out_err:
- if (PTR_ERR(iptr) != -ENOBUFS) {
- pr_err("rpcrdma: rpcrdma_marshal_req failed, status %ld\n",
- PTR_ERR(iptr));
+ if (ret != -ENOBUFS) {
+ pr_err("rpcrdma: header marshaling failed (%d)\n", ret);
r_xprt->rx_stats.failed_marshal_count++;
}
- return PTR_ERR(iptr);
-}
-
-/*
- * Chase down a received write or reply chunklist to get length
- * RDMA'd by server. See map at rpcrdma_create_chunks()! :-)
- */
-static int
-rpcrdma_count_chunks(struct rpcrdma_rep *rep, int wrchunk, __be32 **iptrp)
-{
- unsigned int i, total_len;
- struct rpcrdma_write_chunk *cur_wchunk;
- char *base = (char *)rdmab_to_msg(rep->rr_rdmabuf);
-
- i = be32_to_cpu(**iptrp);
- cur_wchunk = (struct rpcrdma_write_chunk *) (*iptrp + 1);
- total_len = 0;
- while (i--) {
- struct rpcrdma_segment *seg = &cur_wchunk->wc_target;
- ifdebug(FACILITY) {
- u64 off;
- xdr_decode_hyper((__be32 *)&seg->rs_offset, &off);
- dprintk("RPC: %s: chunk %d@0x%016llx:0x%08x\n",
- __func__,
- be32_to_cpu(seg->rs_length),
- (unsigned long long)off,
- be32_to_cpu(seg->rs_handle));
- }
- total_len += be32_to_cpu(seg->rs_length);
- ++cur_wchunk;
- }
- /* check and adjust for properly terminated write chunk */
- if (wrchunk) {
- __be32 *w = (__be32 *) cur_wchunk;
- if (*w++ != xdr_zero)
- return -1;
- cur_wchunk = (struct rpcrdma_write_chunk *) w;
- }
- if ((char *)cur_wchunk > base + rep->rr_len)
- return -1;
-
- *iptrp = (__be32 *) cur_wchunk;
- return total_len;
+ return ret;
}
/**
@@ -949,37 +964,254 @@ rpcrdma_mark_remote_invalidation(struct list_head *mws,
}
}
-#if defined(CONFIG_SUNRPC_BACKCHANNEL)
/* By convention, backchannel calls arrive via rdma_msg type
* messages, and never populate the chunk lists. This makes
* the RPC/RDMA header small and fixed in size, so it is
* straightforward to check the RPC header's direction field.
*/
static bool
-rpcrdma_is_bcall(struct rpcrdma_msg *headerp)
+rpcrdma_is_bcall(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep,
+ __be32 xid, __be32 proc)
+#if defined(CONFIG_SUNRPC_BACKCHANNEL)
{
- __be32 *p = (__be32 *)headerp;
+ struct xdr_stream *xdr = &rep->rr_stream;
+ __be32 *p;
- if (headerp->rm_type != rdma_msg)
+ if (proc != rdma_msg)
return false;
- if (headerp->rm_body.rm_chunks[0] != xdr_zero)
+
+ /* Peek at stream contents without advancing. */
+ p = xdr_inline_decode(xdr, 0);
+
+ /* Chunk lists */
+ if (*p++ != xdr_zero)
return false;
- if (headerp->rm_body.rm_chunks[1] != xdr_zero)
+ if (*p++ != xdr_zero)
return false;
- if (headerp->rm_body.rm_chunks[2] != xdr_zero)
+ if (*p++ != xdr_zero)
return false;
- /* sanity */
- if (p[7] != headerp->rm_xid)
+ /* RPC header */
+ if (*p++ != xid)
return false;
- /* call direction */
- if (p[8] != cpu_to_be32(RPC_CALL))
+ if (*p != cpu_to_be32(RPC_CALL))
return false;
+ /* Now that we are sure this is a backchannel call,
+ * advance to the RPC header.
+ */
+ p = xdr_inline_decode(xdr, 3 * sizeof(*p));
+ if (unlikely(!p))
+ goto out_short;
+
+ rpcrdma_bc_receive_call(r_xprt, rep);
+ return true;
+
+out_short:
+ pr_warn("RPC/RDMA short backward direction call\n");
+ if (rpcrdma_ep_post_recv(&r_xprt->rx_ia, rep))
+ xprt_disconnect_done(&r_xprt->rx_xprt);
return true;
}
+#else /* CONFIG_SUNRPC_BACKCHANNEL */
+{
+ return false;
+}
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
+static int decode_rdma_segment(struct xdr_stream *xdr, u32 *length)
+{
+ __be32 *p;
+
+ p = xdr_inline_decode(xdr, 4 * sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+
+ ifdebug(FACILITY) {
+ u64 offset;
+ u32 handle;
+
+ handle = be32_to_cpup(p++);
+ *length = be32_to_cpup(p++);
+ xdr_decode_hyper(p, &offset);
+ dprintk("RPC: %s: segment %u@0x%016llx:0x%08x\n",
+ __func__, *length, (unsigned long long)offset,
+ handle);
+ } else {
+ *length = be32_to_cpup(p + 1);
+ }
+
+ return 0;
+}
+
+static int decode_write_chunk(struct xdr_stream *xdr, u32 *length)
+{
+ u32 segcount, seglength;
+ __be32 *p;
+
+ p = xdr_inline_decode(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+
+ *length = 0;
+ segcount = be32_to_cpup(p);
+ while (segcount--) {
+ if (decode_rdma_segment(xdr, &seglength))
+ return -EIO;
+ *length += seglength;
+ }
+
+ dprintk("RPC: %s: segcount=%u, %u bytes\n",
+ __func__, be32_to_cpup(p), *length);
+ return 0;
+}
+
+/* In RPC-over-RDMA Version One replies, a Read list is never
+ * expected. This decoder is a stub that returns an error if
+ * a Read list is present.
+ */
+static int decode_read_list(struct xdr_stream *xdr)
+{
+ __be32 *p;
+
+ p = xdr_inline_decode(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+ if (unlikely(*p != xdr_zero))
+ return -EIO;
+ return 0;
+}
+
+/* Supports only one Write chunk in the Write list
+ */
+static int decode_write_list(struct xdr_stream *xdr, u32 *length)
+{
+ u32 chunklen;
+ bool first;
+ __be32 *p;
+
+ *length = 0;
+ first = true;
+ do {
+ p = xdr_inline_decode(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+ if (*p == xdr_zero)
+ break;
+ if (!first)
+ return -EIO;
+
+ if (decode_write_chunk(xdr, &chunklen))
+ return -EIO;
+ *length += chunklen;
+ first = false;
+ } while (true);
+ return 0;
+}
+
+static int decode_reply_chunk(struct xdr_stream *xdr, u32 *length)
+{
+ __be32 *p;
+
+ p = xdr_inline_decode(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+
+ *length = 0;
+ if (*p != xdr_zero)
+ if (decode_write_chunk(xdr, length))
+ return -EIO;
+ return 0;
+}
+
+static int
+rpcrdma_decode_msg(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep,
+ struct rpc_rqst *rqst)
+{
+ struct xdr_stream *xdr = &rep->rr_stream;
+ u32 writelist, replychunk, rpclen;
+ char *base;
+
+ /* Decode the chunk lists */
+ if (decode_read_list(xdr))
+ return -EIO;
+ if (decode_write_list(xdr, &writelist))
+ return -EIO;
+ if (decode_reply_chunk(xdr, &replychunk))
+ return -EIO;
+
+ /* RDMA_MSG sanity checks */
+ if (unlikely(replychunk))
+ return -EIO;
+
+ /* Build the RPC reply's Payload stream in rqst->rq_rcv_buf */
+ base = (char *)xdr_inline_decode(xdr, 0);
+ rpclen = xdr_stream_remaining(xdr);
+ r_xprt->rx_stats.fixup_copy_count +=
+ rpcrdma_inline_fixup(rqst, base, rpclen, writelist & 3);
+
+ r_xprt->rx_stats.total_rdma_reply += writelist;
+ return rpclen + xdr_align_size(writelist);
+}
+
+static noinline int
+rpcrdma_decode_nomsg(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep)
+{
+ struct xdr_stream *xdr = &rep->rr_stream;
+ u32 writelist, replychunk;
+
+ /* Decode the chunk lists */
+ if (decode_read_list(xdr))
+ return -EIO;
+ if (decode_write_list(xdr, &writelist))
+ return -EIO;
+ if (decode_reply_chunk(xdr, &replychunk))
+ return -EIO;
+
+ /* RDMA_NOMSG sanity checks */
+ if (unlikely(writelist))
+ return -EIO;
+ if (unlikely(!replychunk))
+ return -EIO;
+
+ /* Reply chunk buffer already is the reply vector */
+ r_xprt->rx_stats.total_rdma_reply += replychunk;
+ return replychunk;
+}
+
+static noinline int
+rpcrdma_decode_error(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep,
+ struct rpc_rqst *rqst)
+{
+ struct xdr_stream *xdr = &rep->rr_stream;
+ __be32 *p;
+
+ p = xdr_inline_decode(xdr, sizeof(*p));
+ if (unlikely(!p))
+ return -EIO;
+
+ switch (*p) {
+ case err_vers:
+ p = xdr_inline_decode(xdr, 2 * sizeof(*p));
+ if (!p)
+ break;
+ dprintk("RPC: %5u: %s: server reports version error (%u-%u)\n",
+ rqst->rq_task->tk_pid, __func__,
+ be32_to_cpup(p), be32_to_cpu(*(p + 1)));
+ break;
+ case err_chunk:
+ dprintk("RPC: %5u: %s: server reports header decoding error\n",
+ rqst->rq_task->tk_pid, __func__);
+ break;
+ default:
+ dprintk("RPC: %5u: %s: server reports unrecognized error %d\n",
+ rqst->rq_task->tk_pid, __func__, be32_to_cpup(p));
+ }
+
+ r_xprt->rx_stats.bad_reply_count++;
+ return -EREMOTEIO;
+}
+
/* Process received RPC/RDMA messages.
*
* Errors must result in the RPC task either being awakened, or
@@ -991,51 +1223,48 @@ rpcrdma_reply_handler(struct work_struct *work)
struct rpcrdma_rep *rep =
container_of(work, struct rpcrdma_rep, rr_work);
struct rpcrdma_xprt *r_xprt = rep->rr_rxprt;
- struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
struct rpc_xprt *xprt = &r_xprt->rx_xprt;
- struct rpcrdma_msg *headerp;
+ struct xdr_stream *xdr = &rep->rr_stream;
struct rpcrdma_req *req;
struct rpc_rqst *rqst;
- __be32 *iptr;
- int rdmalen, status, rmerr;
+ __be32 *p, xid, vers, proc;
unsigned long cwnd;
- struct list_head mws;
+ int status;
dprintk("RPC: %s: incoming rep %p\n", __func__, rep);
- if (rep->rr_len == RPCRDMA_BAD_LEN)
+ if (rep->rr_hdrbuf.head[0].iov_len == 0)
goto out_badstatus;
- if (rep->rr_len < RPCRDMA_HDRLEN_ERR)
+
+ xdr_init_decode(xdr, &rep->rr_hdrbuf,
+ rep->rr_hdrbuf.head[0].iov_base);
+
+ /* Fixed transport header fields */
+ p = xdr_inline_decode(xdr, 4 * sizeof(*p));
+ if (unlikely(!p))
goto out_shortreply;
+ xid = *p++;
+ vers = *p++;
+ p++; /* credits */
+ proc = *p++;
- headerp = rdmab_to_msg(rep->rr_rdmabuf);
-#if defined(CONFIG_SUNRPC_BACKCHANNEL)
- if (rpcrdma_is_bcall(headerp))
- goto out_bcall;
-#endif
+ if (rpcrdma_is_bcall(r_xprt, rep, xid, proc))
+ return;
/* Match incoming rpcrdma_rep to an rpcrdma_req to
* get context for handling any incoming chunks.
*/
- spin_lock(&buf->rb_lock);
- req = rpcrdma_lookup_req_locked(&r_xprt->rx_buf,
- headerp->rm_xid);
- if (!req)
- goto out_nomatch;
- if (req->rl_reply)
- goto out_duplicate;
-
- list_replace_init(&req->rl_registered, &mws);
- rpcrdma_mark_remote_invalidation(&mws, rep);
-
- /* Avoid races with signals and duplicate replies
- * by marking this req as matched.
- */
+ spin_lock(&xprt->recv_lock);
+ rqst = xprt_lookup_rqst(xprt, xid);
+ if (!rqst)
+ goto out_norqst;
+ xprt_pin_rqst(rqst);
+ spin_unlock(&xprt->recv_lock);
+ req = rpcr_to_rdmar(rqst);
req->rl_reply = rep;
- spin_unlock(&buf->rb_lock);
dprintk("RPC: %s: reply %p completes request %p (xid 0x%08x)\n",
- __func__, rep, req, be32_to_cpu(headerp->rm_xid));
+ __func__, rep, req, be32_to_cpu(xid));
/* Invalidate and unmap the data payloads before waking the
* waiting application. This guarantees the memory regions
@@ -1044,99 +1273,42 @@ rpcrdma_reply_handler(struct work_struct *work)
* waking the next RPC waits until this RPC has relinquished
* all its Send Queue entries.
*/
- if (!list_empty(&mws))
- r_xprt->rx_ia.ri_ops->ro_unmap_sync(r_xprt, &mws);
+ if (!list_empty(&req->rl_registered)) {
+ rpcrdma_mark_remote_invalidation(&req->rl_registered, rep);
+ r_xprt->rx_ia.ri_ops->ro_unmap_sync(r_xprt,
+ &req->rl_registered);
+ }
- /* Perform XID lookup, reconstruction of the RPC reply, and
- * RPC completion while holding the transport lock to ensure
- * the rep, rqst, and rq_task pointers remain stable.
- */
- spin_lock_bh(&xprt->transport_lock);
- rqst = xprt_lookup_rqst(xprt, headerp->rm_xid);
- if (!rqst)
- goto out_norqst;
xprt->reestablish_timeout = 0;
- if (headerp->rm_vers != rpcrdma_version)
+ if (vers != rpcrdma_version)
goto out_badversion;
- /* check for expected message types */
- /* The order of some of these tests is important. */
- switch (headerp->rm_type) {
+ switch (proc) {
case rdma_msg:
- /* never expect read chunks */
- /* never expect reply chunks (two ways to check) */
- if (headerp->rm_body.rm_chunks[0] != xdr_zero ||
- (headerp->rm_body.rm_chunks[1] == xdr_zero &&
- headerp->rm_body.rm_chunks[2] != xdr_zero))
- goto badheader;
- if (headerp->rm_body.rm_chunks[1] != xdr_zero) {
- /* count any expected write chunks in read reply */
- /* start at write chunk array count */
- iptr = &headerp->rm_body.rm_chunks[2];
- rdmalen = rpcrdma_count_chunks(rep, 1, &iptr);
- /* check for validity, and no reply chunk after */
- if (rdmalen < 0 || *iptr++ != xdr_zero)
- goto badheader;
- rep->rr_len -=
- ((unsigned char *)iptr - (unsigned char *)headerp);
- status = rep->rr_len + rdmalen;
- r_xprt->rx_stats.total_rdma_reply += rdmalen;
- /* special case - last chunk may omit padding */
- if (rdmalen &= 3) {
- rdmalen = 4 - rdmalen;
- status += rdmalen;
- }
- } else {
- /* else ordinary inline */
- rdmalen = 0;
- iptr = (__be32 *)((unsigned char *)headerp +
- RPCRDMA_HDRLEN_MIN);
- rep->rr_len -= RPCRDMA_HDRLEN_MIN;
- status = rep->rr_len;
- }
-
- r_xprt->rx_stats.fixup_copy_count +=
- rpcrdma_inline_fixup(rqst, (char *)iptr, rep->rr_len,
- rdmalen);
+ status = rpcrdma_decode_msg(r_xprt, rep, rqst);
break;
-
case rdma_nomsg:
- /* never expect read or write chunks, always reply chunks */
- if (headerp->rm_body.rm_chunks[0] != xdr_zero ||
- headerp->rm_body.rm_chunks[1] != xdr_zero ||
- headerp->rm_body.rm_chunks[2] != xdr_one)
- goto badheader;
- iptr = (__be32 *)((unsigned char *)headerp +
- RPCRDMA_HDRLEN_MIN);
- rdmalen = rpcrdma_count_chunks(rep, 0, &iptr);
- if (rdmalen < 0)
- goto badheader;
- r_xprt->rx_stats.total_rdma_reply += rdmalen;
- /* Reply chunk buffer already is the reply vector - no fixup. */
- status = rdmalen;
+ status = rpcrdma_decode_nomsg(r_xprt, rep);
break;
-
case rdma_error:
- goto out_rdmaerr;
-
-badheader:
+ status = rpcrdma_decode_error(r_xprt, rep, rqst);
+ break;
default:
- dprintk("RPC: %5u %s: invalid rpcrdma reply (type %u)\n",
- rqst->rq_task->tk_pid, __func__,
- be32_to_cpu(headerp->rm_type));
status = -EIO;
- r_xprt->rx_stats.bad_reply_count++;
- break;
}
+ if (status < 0)
+ goto out_badheader;
out:
+ spin_lock(&xprt->recv_lock);
cwnd = xprt->cwnd;
xprt->cwnd = atomic_read(&r_xprt->rx_buf.rb_credits) << RPC_CWNDSHIFT;
if (xprt->cwnd > cwnd)
xprt_release_rqst_cong(rqst->rq_task);
xprt_complete_rqst(rqst->rq_task, status);
- spin_unlock_bh(&xprt->transport_lock);
+ xprt_unpin_rqst(rqst);
+ spin_unlock(&xprt->recv_lock);
dprintk("RPC: %s: xprt_complete_rqst(0x%p, 0x%p, %d)\n",
__func__, xprt, rqst, status);
return;
@@ -1149,72 +1321,38 @@ out_badstatus:
}
return;
-#if defined(CONFIG_SUNRPC_BACKCHANNEL)
-out_bcall:
- rpcrdma_bc_receive_call(r_xprt, rep);
- return;
-#endif
-
/* If the incoming reply terminated a pending RPC, the next
* RPC call will post a replacement receive buffer as it is
* being marshaled.
*/
out_badversion:
dprintk("RPC: %s: invalid version %d\n",
- __func__, be32_to_cpu(headerp->rm_vers));
+ __func__, be32_to_cpu(vers));
status = -EIO;
r_xprt->rx_stats.bad_reply_count++;
goto out;
-out_rdmaerr:
- rmerr = be32_to_cpu(headerp->rm_body.rm_error.rm_err);
- switch (rmerr) {
- case ERR_VERS:
- pr_err("%s: server reports header version error (%u-%u)\n",
- __func__,
- be32_to_cpu(headerp->rm_body.rm_error.rm_vers_low),
- be32_to_cpu(headerp->rm_body.rm_error.rm_vers_high));
- break;
- case ERR_CHUNK:
- pr_err("%s: server reports header decoding error\n",
- __func__);
- break;
- default:
- pr_err("%s: server reports unknown error %d\n",
- __func__, rmerr);
- }
- status = -EREMOTEIO;
+out_badheader:
+ dprintk("RPC: %5u %s: invalid rpcrdma reply (type %u)\n",
+ rqst->rq_task->tk_pid, __func__, be32_to_cpu(proc));
r_xprt->rx_stats.bad_reply_count++;
+ status = -EIO;
goto out;
-/* The req was still available, but by the time the transport_lock
+/* The req was still available, but by the time the recv_lock
* was acquired, the rqst and task had been released. Thus the RPC
* has already been terminated.
*/
out_norqst:
- spin_unlock_bh(&xprt->transport_lock);
- rpcrdma_buffer_put(req);
- dprintk("RPC: %s: race, no rqst left for req %p\n",
- __func__, req);
- return;
+ spin_unlock(&xprt->recv_lock);
+ dprintk("RPC: %s: no match for incoming xid 0x%08x\n",
+ __func__, be32_to_cpu(xid));
+ goto repost;
out_shortreply:
dprintk("RPC: %s: short/invalid reply\n", __func__);
goto repost;
-out_nomatch:
- spin_unlock(&buf->rb_lock);
- dprintk("RPC: %s: no match for incoming xid 0x%08x len %d\n",
- __func__, be32_to_cpu(headerp->rm_xid),
- rep->rr_len);
- goto repost;
-
-out_duplicate:
- spin_unlock(&buf->rb_lock);
- dprintk("RPC: %s: "
- "duplicate reply %p to RPC request %p: xid 0x%08x\n",
- __func__, rep, req, be32_to_cpu(headerp->rm_xid));
-
/* If no pending RPC transaction was matched, post a replacement
* receive buffer before returning.
*/
diff --git a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
index c676ed0efb5a..ec37ad83b068 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c
@@ -52,7 +52,7 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
if (src->iov_len < 24)
goto out_shortreply;
- spin_lock_bh(&xprt->transport_lock);
+ spin_lock(&xprt->recv_lock);
req = xprt_lookup_rqst(xprt, xid);
if (!req)
goto out_notfound;
@@ -69,17 +69,20 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
else if (credits > r_xprt->rx_buf.rb_bc_max_requests)
credits = r_xprt->rx_buf.rb_bc_max_requests;
+ spin_lock_bh(&xprt->transport_lock);
cwnd = xprt->cwnd;
xprt->cwnd = credits << RPC_CWNDSHIFT;
if (xprt->cwnd > cwnd)
xprt_release_rqst_cong(req->rq_task);
+ spin_unlock_bh(&xprt->transport_lock);
+
ret = 0;
xprt_complete_rqst(req->rq_task, rcvbuf->len);
rcvbuf->len = 0;
out_unlock:
- spin_unlock_bh(&xprt->transport_lock);
+ spin_unlock(&xprt->recv_lock);
out:
return ret;
@@ -266,7 +269,7 @@ xprt_rdma_bc_put(struct rpc_xprt *xprt)
module_put(THIS_MODULE);
}
-static struct rpc_xprt_ops xprt_rdma_bc_procs = {
+static const struct rpc_xprt_ops xprt_rdma_bc_procs = {
.reserve_xprt = xprt_reserve_xprt_cong,
.release_xprt = xprt_release_xprt_cong,
.alloc_slot = xprt_alloc_slot,
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index d1c458e5ec4d..c84e2b644e13 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -149,7 +149,7 @@ static struct ctl_table sunrpc_table[] = {
#endif
-static struct rpc_xprt_ops xprt_rdma_procs; /*forward reference */
+static const struct rpc_xprt_ops xprt_rdma_procs;
static void
xprt_rdma_format_addresses4(struct rpc_xprt *xprt, struct sockaddr *sap)
@@ -559,6 +559,7 @@ rpcrdma_get_rdmabuf(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
r_xprt->rx_stats.hardway_register_count += size;
req->rl_rdmabuf = rb;
+ xdr_buf_init(&req->rl_hdrbuf, rb->rg_base, rdmab_length(rb));
return true;
}
@@ -684,7 +685,6 @@ xprt_rdma_free(struct rpc_task *task)
dprintk("RPC: %s: called on 0x%p\n", __func__, req->rl_reply);
- rpcrdma_remove_req(&r_xprt->rx_buf, req);
if (!list_empty(&req->rl_registered))
ia->ri_ops->ro_unmap_safe(r_xprt, req, !RPC_IS_ASYNC(task));
rpcrdma_unmap_sges(ia, req);
@@ -730,7 +730,7 @@ xprt_rdma_send_request(struct rpc_task *task)
if (unlikely(!list_empty(&req->rl_registered)))
r_xprt->rx_ia.ri_ops->ro_unmap_safe(r_xprt, req, false);
- rc = rpcrdma_marshal_req(rqst);
+ rc = rpcrdma_marshal_req(r_xprt, rqst);
if (rc < 0)
goto failed_marshal;
@@ -811,7 +811,7 @@ xprt_rdma_disable_swap(struct rpc_xprt *xprt)
* Plumbing for rpc transport switch and kernel module
*/
-static struct rpc_xprt_ops xprt_rdma_procs = {
+static const struct rpc_xprt_ops xprt_rdma_procs = {
.reserve_xprt = xprt_reserve_xprt_cong,
.release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */
.alloc_slot = xprt_alloc_slot,
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index e4171f2abe37..11a1fbf7e59e 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -139,14 +139,11 @@ rpcrdma_wc_send(struct ib_cq *cq, struct ib_wc *wc)
static void
rpcrdma_update_granted_credits(struct rpcrdma_rep *rep)
{
- struct rpcrdma_msg *rmsgp = rdmab_to_msg(rep->rr_rdmabuf);
struct rpcrdma_buffer *buffer = &rep->rr_rxprt->rx_buf;
+ __be32 *p = rep->rr_rdmabuf->rg_base;
u32 credits;
- if (rep->rr_len < RPCRDMA_HDRLEN_ERR)
- return;
-
- credits = be32_to_cpu(rmsgp->rm_credit);
+ credits = be32_to_cpup(p + 2);
if (credits == 0)
credits = 1; /* don't deadlock */
else if (credits > buffer->rb_max_requests)
@@ -173,21 +170,19 @@ rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
goto out_fail;
/* status == SUCCESS means all fields in wc are trustworthy */
- if (wc->opcode != IB_WC_RECV)
- return;
-
dprintk("RPC: %s: rep %p opcode 'recv', length %u: success\n",
__func__, rep, wc->byte_len);
- rep->rr_len = wc->byte_len;
+ rpcrdma_set_xdrlen(&rep->rr_hdrbuf, wc->byte_len);
rep->rr_wc_flags = wc->wc_flags;
rep->rr_inv_rkey = wc->ex.invalidate_rkey;
ib_dma_sync_single_for_cpu(rdmab_device(rep->rr_rdmabuf),
rdmab_addr(rep->rr_rdmabuf),
- rep->rr_len, DMA_FROM_DEVICE);
+ wc->byte_len, DMA_FROM_DEVICE);
- rpcrdma_update_granted_credits(rep);
+ if (wc->byte_len >= RPCRDMA_HDRLEN_ERR)
+ rpcrdma_update_granted_credits(rep);
out_schedule:
queue_work(rpcrdma_receive_wq, &rep->rr_work);
@@ -198,7 +193,7 @@ out_fail:
pr_err("rpcrdma: Recv: %s (%u/0x%x)\n",
ib_wc_status_msg(wc->status),
wc->status, wc->vendor_err);
- rep->rr_len = RPCRDMA_BAD_LEN;
+ rpcrdma_set_xdrlen(&rep->rr_hdrbuf, 0);
goto out_schedule;
}
@@ -974,6 +969,8 @@ rpcrdma_create_rep(struct rpcrdma_xprt *r_xprt)
rc = PTR_ERR(rep->rr_rdmabuf);
goto out_free;
}
+ xdr_buf_init(&rep->rr_hdrbuf, rep->rr_rdmabuf->rg_base,
+ rdmab_length(rep->rr_rdmabuf));
rep->rr_cqe.done = rpcrdma_wc_receive;
rep->rr_rxprt = r_xprt;
@@ -1004,7 +1001,6 @@ rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt)
spin_lock_init(&buf->rb_recovery_lock);
INIT_LIST_HEAD(&buf->rb_mws);
INIT_LIST_HEAD(&buf->rb_all);
- INIT_LIST_HEAD(&buf->rb_pending);
INIT_LIST_HEAD(&buf->rb_stale_mrs);
INIT_DELAYED_WORK(&buf->rb_refresh_worker,
rpcrdma_mr_refresh_worker);
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h
index b282d3f8cdd8..e26a97d2f922 100644
--- a/net/sunrpc/xprtrdma/xprt_rdma.h
+++ b/net/sunrpc/xprtrdma/xprt_rdma.h
@@ -218,18 +218,17 @@ enum {
struct rpcrdma_rep {
struct ib_cqe rr_cqe;
- unsigned int rr_len;
int rr_wc_flags;
u32 rr_inv_rkey;
+ struct rpcrdma_regbuf *rr_rdmabuf;
struct rpcrdma_xprt *rr_rxprt;
struct work_struct rr_work;
+ struct xdr_buf rr_hdrbuf;
+ struct xdr_stream rr_stream;
struct list_head rr_list;
struct ib_recv_wr rr_recv_wr;
- struct rpcrdma_regbuf *rr_rdmabuf;
};
-#define RPCRDMA_BAD_LEN (~0U)
-
/*
* struct rpcrdma_mw - external memory region metadata
*
@@ -341,11 +340,12 @@ enum {
struct rpcrdma_buffer;
struct rpcrdma_req {
struct list_head rl_list;
- __be32 rl_xid;
unsigned int rl_mapped_sges;
unsigned int rl_connect_cookie;
struct rpcrdma_buffer *rl_buffer;
struct rpcrdma_rep *rl_reply;
+ struct xdr_stream rl_stream;
+ struct xdr_buf rl_hdrbuf;
struct ib_send_wr rl_send_wr;
struct ib_sge rl_send_sge[RPCRDMA_MAX_SEND_SGES];
struct rpcrdma_regbuf *rl_rdmabuf; /* xprt header */
@@ -403,7 +403,6 @@ struct rpcrdma_buffer {
int rb_send_count, rb_recv_count;
struct list_head rb_send_bufs;
struct list_head rb_recv_bufs;
- struct list_head rb_pending;
u32 rb_max_requests;
atomic_t rb_credits; /* most recent credit grant */
@@ -440,24 +439,27 @@ struct rpcrdma_create_data_internal {
* Statistics for RPCRDMA
*/
struct rpcrdma_stats {
+ /* accessed when sending a call */
unsigned long read_chunk_count;
unsigned long write_chunk_count;
unsigned long reply_chunk_count;
-
unsigned long long total_rdma_request;
- unsigned long long total_rdma_reply;
+ /* rarely accessed error counters */
unsigned long long pullup_copy_count;
- unsigned long long fixup_copy_count;
unsigned long hardway_register_count;
unsigned long failed_marshal_count;
unsigned long bad_reply_count;
- unsigned long nomsg_call_count;
- unsigned long bcall_count;
unsigned long mrs_recovered;
unsigned long mrs_orphaned;
unsigned long mrs_allocated;
+
+ /* accessed when receiving a reply */
+ unsigned long long total_rdma_reply;
+ unsigned long long fixup_copy_count;
unsigned long local_inv_needed;
+ unsigned long nomsg_call_count;
+ unsigned long bcall_count;
};
/*
@@ -465,7 +467,8 @@ struct rpcrdma_stats {
*/
struct rpcrdma_xprt;
struct rpcrdma_memreg_ops {
- int (*ro_map)(struct rpcrdma_xprt *,
+ struct rpcrdma_mr_seg *
+ (*ro_map)(struct rpcrdma_xprt *,
struct rpcrdma_mr_seg *, int, bool,
struct rpcrdma_mw **);
void (*ro_unmap_sync)(struct rpcrdma_xprt *,
@@ -552,34 +555,6 @@ void rpcrdma_destroy_req(struct rpcrdma_req *);
int rpcrdma_buffer_create(struct rpcrdma_xprt *);
void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
-static inline void
-rpcrdma_insert_req(struct rpcrdma_buffer *buffers, struct rpcrdma_req *req)
-{
- spin_lock(&buffers->rb_lock);
- if (list_empty(&req->rl_list))
- list_add_tail(&req->rl_list, &buffers->rb_pending);
- spin_unlock(&buffers->rb_lock);
-}
-
-static inline struct rpcrdma_req *
-rpcrdma_lookup_req_locked(struct rpcrdma_buffer *buffers, __be32 xid)
-{
- struct rpcrdma_req *pos;
-
- list_for_each_entry(pos, &buffers->rb_pending, rl_list)
- if (pos->rl_xid == xid)
- return pos;
- return NULL;
-}
-
-static inline void
-rpcrdma_remove_req(struct rpcrdma_buffer *buffers, struct rpcrdma_req *req)
-{
- spin_lock(&buffers->rb_lock);
- list_del(&req->rl_list);
- spin_unlock(&buffers->rb_lock);
-}
-
struct rpcrdma_mw *rpcrdma_get_mw(struct rpcrdma_xprt *);
void rpcrdma_put_mw(struct rpcrdma_xprt *, struct rpcrdma_mw *);
struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
@@ -638,10 +613,16 @@ enum rpcrdma_chunktype {
bool rpcrdma_prepare_send_sges(struct rpcrdma_ia *, struct rpcrdma_req *,
u32, struct xdr_buf *, enum rpcrdma_chunktype);
void rpcrdma_unmap_sges(struct rpcrdma_ia *, struct rpcrdma_req *);
-int rpcrdma_marshal_req(struct rpc_rqst *);
+int rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst);
void rpcrdma_set_max_header_sizes(struct rpcrdma_xprt *);
void rpcrdma_reply_handler(struct work_struct *work);
+static inline void rpcrdma_set_xdrlen(struct xdr_buf *xdr, size_t len)
+{
+ xdr->head[0].iov_len = len;
+ xdr->len = len;
+}
+
/* RPC/RDMA module init - xprtrdma/transport.c
*/
extern unsigned int xprt_rdma_max_inline_read;
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 4f154d388748..9b5de31aa429 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -969,10 +969,12 @@ static void xs_local_data_read_skb(struct rpc_xprt *xprt,
return;
/* Look up and lock the request corresponding to the given XID */
- spin_lock_bh(&xprt->transport_lock);
+ spin_lock(&xprt->recv_lock);
rovr = xprt_lookup_rqst(xprt, *xp);
if (!rovr)
goto out_unlock;
+ xprt_pin_rqst(rovr);
+ spin_unlock(&xprt->recv_lock);
task = rovr->rq_task;
copied = rovr->rq_private_buf.buflen;
@@ -981,13 +983,16 @@ static void xs_local_data_read_skb(struct rpc_xprt *xprt,
if (xs_local_copy_to_xdr(&rovr->rq_private_buf, skb)) {
dprintk("RPC: sk_buff copy failed\n");
- goto out_unlock;
+ spin_lock(&xprt->recv_lock);
+ goto out_unpin;
}
+ spin_lock(&xprt->recv_lock);
xprt_complete_rqst(task, copied);
-
+out_unpin:
+ xprt_unpin_rqst(rovr);
out_unlock:
- spin_unlock_bh(&xprt->transport_lock);
+ spin_unlock(&xprt->recv_lock);
}
static void xs_local_data_receive(struct sock_xprt *transport)
@@ -1050,10 +1055,12 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt,
return;
/* Look up and lock the request corresponding to the given XID */
- spin_lock_bh(&xprt->transport_lock);
+ spin_lock(&xprt->recv_lock);
rovr = xprt_lookup_rqst(xprt, *xp);
if (!rovr)
goto out_unlock;
+ xprt_pin_rqst(rovr);
+ spin_unlock(&xprt->recv_lock);
task = rovr->rq_task;
if ((copied = rovr->rq_private_buf.buflen) > repsize)
@@ -1062,16 +1069,21 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt,
/* Suck it into the iovec, verify checksum if not done by hw. */
if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
__UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
- goto out_unlock;
+ spin_lock(&xprt->recv_lock);
+ goto out_unpin;
}
__UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
+ spin_lock_bh(&xprt->transport_lock);
xprt_adjust_cwnd(xprt, task, copied);
+ spin_unlock_bh(&xprt->transport_lock);
+ spin_lock(&xprt->recv_lock);
xprt_complete_rqst(task, copied);
-
+out_unpin:
+ xprt_unpin_rqst(rovr);
out_unlock:
- spin_unlock_bh(&xprt->transport_lock);
+ spin_unlock(&xprt->recv_lock);
}
static void xs_udp_data_receive(struct sock_xprt *transport)
@@ -1277,25 +1289,12 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt,
}
len = desc->count;
- if (len > transport->tcp_reclen - transport->tcp_offset) {
- struct xdr_skb_reader my_desc;
-
- len = transport->tcp_reclen - transport->tcp_offset;
- memcpy(&my_desc, desc, sizeof(my_desc));
- my_desc.count = len;
- r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
- &my_desc, xdr_skb_read_bits);
- desc->count -= r;
- desc->offset += r;
- } else
- r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
+ if (len > transport->tcp_reclen - transport->tcp_offset)
+ desc->count = transport->tcp_reclen - transport->tcp_offset;
+ r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied,
desc, xdr_skb_read_bits);
- if (r > 0) {
- transport->tcp_copied += r;
- transport->tcp_offset += r;
- }
- if (r != len) {
+ if (desc->count) {
/* Error when copying to the receive buffer,
* usually because we weren't able to allocate
* additional buffer pages. All we can do now
@@ -1315,6 +1314,10 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt,
return;
}
+ transport->tcp_copied += r;
+ transport->tcp_offset += r;
+ desc->count = len - r;
+
dprintk("RPC: XID %08x read %zd bytes\n",
ntohl(transport->tcp_xid), r);
dprintk("RPC: xprt = %p, tcp_copied = %lu, tcp_offset = %u, "
@@ -1343,21 +1346,24 @@ static inline int xs_tcp_read_reply(struct rpc_xprt *xprt,
dprintk("RPC: read reply XID %08x\n", ntohl(transport->tcp_xid));
/* Find and lock the request corresponding to this xid */
- spin_lock_bh(&xprt->transport_lock);
+ spin_lock(&xprt->recv_lock);
req = xprt_lookup_rqst(xprt, transport->tcp_xid);
if (!req) {
dprintk("RPC: XID %08x request not found!\n",
ntohl(transport->tcp_xid));
- spin_unlock_bh(&xprt->transport_lock);
+ spin_unlock(&xprt->recv_lock);
return -1;
}
+ xprt_pin_rqst(req);
+ spin_unlock(&xprt->recv_lock);
xs_tcp_read_common(xprt, desc, req);
+ spin_lock(&xprt->recv_lock);
if (!(transport->tcp_flags & TCP_RCV_COPY_DATA))
xprt_complete_rqst(req->rq_task, transport->tcp_copied);
-
- spin_unlock_bh(&xprt->transport_lock);
+ xprt_unpin_rqst(req);
+ spin_unlock(&xprt->recv_lock);
return 0;
}
@@ -1376,11 +1382,9 @@ static int xs_tcp_read_callback(struct rpc_xprt *xprt,
container_of(xprt, struct sock_xprt, xprt);
struct rpc_rqst *req;
- /* Look up and lock the request corresponding to the given XID */
- spin_lock_bh(&xprt->transport_lock);
+ /* Look up the request corresponding to the given XID */
req = xprt_lookup_bc_request(xprt, transport->tcp_xid);
if (req == NULL) {
- spin_unlock_bh(&xprt->transport_lock);
printk(KERN_WARNING "Callback slot table overflowed\n");
xprt_force_disconnect(xprt);
return -1;
@@ -1391,7 +1395,6 @@ static int xs_tcp_read_callback(struct rpc_xprt *xprt,
if (!(transport->tcp_flags & TCP_RCV_COPY_DATA))
xprt_complete_bc_request(req, transport->tcp_copied);
- spin_unlock_bh(&xprt->transport_lock);
return 0;
}
@@ -1516,6 +1519,7 @@ static void xs_tcp_data_receive(struct sock_xprt *transport)
.arg.data = xprt,
};
unsigned long total = 0;
+ int loop;
int read = 0;
mutex_lock(&transport->recv_mutex);
@@ -1524,20 +1528,20 @@ static void xs_tcp_data_receive(struct sock_xprt *transport)
goto out;
/* We use rd_desc to pass struct xprt to xs_tcp_data_recv */
- for (;;) {
+ for (loop = 0; loop < 64; loop++) {
lock_sock(sk);
read = tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv);
if (read <= 0) {
clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
release_sock(sk);
- if (!test_bit(XPRT_SOCK_DATA_READY, &transport->sock_state))
- break;
- } else {
- release_sock(sk);
- total += read;
+ break;
}
+ release_sock(sk);
+ total += read;
rd_desc.count = 65536;
}
+ if (test_bit(XPRT_SOCK_DATA_READY, &transport->sock_state))
+ queue_work(xprtiod_workqueue, &transport->recv_worker);
out:
mutex_unlock(&transport->recv_mutex);
trace_xs_tcp_data_ready(xprt, read, total);
@@ -2724,7 +2728,7 @@ static void bc_destroy(struct rpc_xprt *xprt)
module_put(THIS_MODULE);
}
-static struct rpc_xprt_ops xs_local_ops = {
+static const struct rpc_xprt_ops xs_local_ops = {
.reserve_xprt = xprt_reserve_xprt,
.release_xprt = xs_tcp_release_xprt,
.alloc_slot = xprt_alloc_slot,
@@ -2742,7 +2746,7 @@ static struct rpc_xprt_ops xs_local_ops = {
.disable_swap = xs_disable_swap,
};
-static struct rpc_xprt_ops xs_udp_ops = {
+static const struct rpc_xprt_ops xs_udp_ops = {
.set_buffer_size = xs_udp_set_buffer_size,
.reserve_xprt = xprt_reserve_xprt_cong,
.release_xprt = xprt_release_xprt_cong,
@@ -2764,7 +2768,7 @@ static struct rpc_xprt_ops xs_udp_ops = {
.inject_disconnect = xs_inject_disconnect,
};
-static struct rpc_xprt_ops xs_tcp_ops = {
+static const struct rpc_xprt_ops xs_tcp_ops = {
.reserve_xprt = xprt_reserve_xprt,
.release_xprt = xs_tcp_release_xprt,
.alloc_slot = xprt_lock_and_alloc_slot,
@@ -2795,7 +2799,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
* The rpc_xprt_ops for the server backchannel
*/
-static struct rpc_xprt_ops bc_tcp_ops = {
+static const struct rpc_xprt_ops bc_tcp_ops = {
.reserve_xprt = xprt_reserve_xprt,
.release_xprt = xprt_release_xprt,
.alloc_slot = xprt_alloc_slot,
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 7d99029df342..a140dd4a84af 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -233,7 +233,7 @@ static int tipc_bcast_xmit(struct net *net, struct sk_buff_head *pkts,
struct sk_buff_head xmitq;
int rc = 0;
- __skb_queue_head_init(&xmitq);
+ skb_queue_head_init(&xmitq);
tipc_bcast_lock(net);
if (tipc_link_bc_peers(l))
rc = tipc_link_xmit(l, pkts, &xmitq);
@@ -263,7 +263,7 @@ static int tipc_rcast_xmit(struct net *net, struct sk_buff_head *pkts,
u32 dst, selector;
selector = msg_link_selector(buf_msg(skb_peek(pkts)));
- __skb_queue_head_init(&_pkts);
+ skb_queue_head_init(&_pkts);
list_for_each_entry_safe(n, tmp, &dests->list, list) {
dst = n->value;
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 6ef379f004ac..17146c16ee2d 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -551,7 +551,7 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
return false;
if (msg_errcode(msg))
return false;
- *err = -TIPC_ERR_NO_NAME;
+ *err = TIPC_ERR_NO_NAME;
if (skb_linearize(skb))
return false;
msg = buf_msg(skb);
@@ -568,6 +568,14 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
msg_set_destnode(msg, dnode);
msg_set_destport(msg, dport);
*err = TIPC_OK;
+
+ if (!skb_cloned(skb))
+ return true;
+
+ /* Unclone buffer in case it was bundled */
+ if (pskb_expand_head(skb, BUF_HEADROOM, BUF_TAILROOM, GFP_ATOMIC))
+ return false;
+
return true;
}
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index fa596fa71ba7..7d80040a37b6 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -639,7 +639,7 @@ sendpage_end:
return ret;
}
-void tls_sw_free_resources(struct sock *sk)
+static void tls_sw_free_resources(struct sock *sk)
{
struct tls_context *tls_ctx = tls_get_ctx(sk);
struct tls_sw_context *ctx = tls_sw_ctx(tls_ctx);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 0df8023f480b..690874293cfc 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -9987,6 +9987,9 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
if (err)
return err;
+ if (!setup.chandef.chan)
+ return -EINVAL;
+
err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
&setup.beacon_rate);
if (err)
@@ -10903,6 +10906,9 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
if (err)
return err;
+ if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
+ !tb[NL80211_REKEY_DATA_KCK])
+ return -EINVAL;
if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
return -ERANGE;
if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 2e3a10e79ca9..061d0c3a420a 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -265,6 +265,8 @@ objtool_args += --no-fp
endif
ifdef CONFIG_GCOV_KERNEL
objtool_args += --no-unreachable
+else
+objtool_args += $(call cc-ifversion, -lt, 0405, --no-unreachable)
endif
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index fb3522fd8702..ae8a1357d01d 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -37,6 +37,7 @@ warning-2 += $(call cc-option, -Wlogical-op)
warning-2 += $(call cc-option, -Wmissing-field-initializers)
warning-2 += $(call cc-option, -Wsign-compare)
warning-2 += $(call cc-option, -Wmaybe-uninitialized)
+warning-2 += $(call cc-option, -Wunused-macros)
warning-3 := -Wbad-function-cast
warning-3 += -Wcast-qual
diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst
deleted file mode 100644
index b27290035253..000000000000
--- a/scripts/Makefile.fwinst
+++ /dev/null
@@ -1,70 +0,0 @@
-# ==========================================================================
-# Installing firmware
-#
-# We don't include the .config, so all firmware files are in $(fw-shipped-)
-# rather than in $(fw-shipped-y) or $(fw-shipped-m).
-# ==========================================================================
-
-INSTALL := install
-src := $(obj)
-
-# For modules_install installing firmware, we want to see .config
-# But for firmware_install, we don't care, but don't want to require it.
--include $(objtree)/.config
-
-include scripts/Kbuild.include
-include $(src)/Makefile
-
-include scripts/Makefile.host
-
-mod-fw := $(fw-shipped-m)
-# If CONFIG_FIRMWARE_IN_KERNEL isn't set, then install the
-# firmware for in-kernel drivers too.
-ifndef CONFIG_FIRMWARE_IN_KERNEL
-mod-fw += $(fw-shipped-y)
-endif
-
-ifneq ($(KBUILD_SRC),)
-# Create output directory if not already present
-_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
-
-firmware-dirs := $(sort $(addprefix $(objtree)/$(obj)/,$(dir $(fw-external-y) $(fw-shipped-all))))
-# Create directories for firmware in subdirectories
-_dummy := $(foreach d,$(firmware-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
-endif
-
-installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw))
-
-installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all))
-
-quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@)
- cmd_install = mkdir -p $(@D); $(INSTALL) -m0644 $< $@
-
-$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/%
- $(call cmd,install)
-
-PHONY += __fw_install __fw_modinst FORCE
-
-.PHONY: $(PHONY)
-
-__fw_install: $(installed-fw)
-
-__fw_modinst: $(installed-mod-fw)
- @:
-
-__fw_modbuild: $(addprefix $(obj)/,$(mod-fw))
- @:
-
-FORCE:
-
-# Read all saved command lines and dependencies for the $(targets) we
-# may be building using $(if_changed{,_dep}). As an optimization, we
-# don't need to read them if the target does not exist; we will rebuild
-# anyway in that case.
-
-targets := $(wildcard $(sort $(targets)))
-cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
-
-ifneq ($(cmd_files),)
- include $(cmd_files)
-endif
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index dd2c262aebbf..8b80bac055e4 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -6390,7 +6390,7 @@ sub process {
exit(0);
}
- if (!$is_patch && $file !~ /cover-letter\.patch$/) {
+ if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
ERROR("NOT_UNIFIED_DIFF",
"Does not appear to be a unified-diff format patch\n");
}
diff --git a/scripts/dtc/dtx_diff b/scripts/dtc/dtx_diff
index f9a3d8d23c64..8c4fbad2055e 100755
--- a/scripts/dtc/dtx_diff
+++ b/scripts/dtc/dtx_diff
@@ -86,6 +86,7 @@ eod
compile_to_dts() {
dtx="$1"
+ dtc_include="$2"
if [ -d "${dtx}" ] ; then
@@ -113,7 +114,7 @@ compile_to_dts() {
# ----- input is DTS (source)
if ( cpp ${cpp_flags} -x assembler-with-cpp ${dtx} \
- | ${DTC} -I dts ) ; then
+ | ${DTC} ${dtc_include} -I dts ) ; then
return
fi
@@ -320,18 +321,13 @@ fi
cpp_flags="\
-nostdinc \
- -I${srctree}/arch/${ARCH}/boot/dts \
-I${srctree}/scripts/dtc/include-prefixes \
- -I${srctree}/drivers/of/testcase-data \
-undef -D__DTS__"
-dtc_flags="\
- -i ${srctree}/arch/${ARCH}/boot/dts/ \
- -i ${srctree}/kernel/dts \
- ${dtx_path_1_dtc_include} \
- ${dtx_path_2_dtc_include}"
-
-DTC="${DTC} ${dtc_flags} -O dts -qq -f ${dtc_sort} -o -"
+DTC="\
+ ${DTC} \
+ -i ${srctree}/scripts/dtc/include-prefixes \
+ -O dts -qq -f ${dtc_sort} -o -"
# ----- do the diff or decompile
@@ -339,11 +335,11 @@ DTC="${DTC} ${dtc_flags} -O dts -qq -f ${dtc_sort} -o -"
if (( ${cmd_diff} )) ; then
diff ${diff_flags} --label "${dtx_file_1}" --label "${dtx_file_2}" \
- <(compile_to_dts "${dtx_file_1}") \
- <(compile_to_dts "${dtx_file_2}")
+ <(compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}") \
+ <(compile_to_dts "${dtx_file_2}" "${dtx_path_2_dtc_include}")
else
- compile_to_dts "${dtx_file_1}"
+ compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}"
fi
diff --git a/scripts/gdb/linux/Makefile b/scripts/gdb/linux/Makefile
index 8b00031f5349..ab3cfe727a4e 100644
--- a/scripts/gdb/linux/Makefile
+++ b/scripts/gdb/linux/Makefile
@@ -1,6 +1,6 @@
always := gdb-scripts
-SRCTREE := $(shell cd $(srctree) && /bin/pwd)
+SRCTREE := $(abspath $(srctree))
$(obj)/gdb-scripts:
ifneq ($(KBUILD_SRC),)
diff --git a/scripts/mkversion b/scripts/mkversion
deleted file mode 100644
index c12addc9c7ef..000000000000
--- a/scripts/mkversion
+++ /dev/null
@@ -1,6 +0,0 @@
-if [ ! -f .version ]
-then
- echo 1
-else
- expr 0`cat .version` + 1
-fi
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index b920d186ad4a..98314b400a95 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -47,6 +47,12 @@ enum export {
export_unused_gpl, export_gpl_future, export_unknown
};
+/* In kernel, this size is defined in linux/module.h;
+ * here we use Elf_Addr instead of long for covering cross-compile
+ */
+
+#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
+
#define PRINTF __attribute__ ((format (printf, 1, 2)))
PRINTF void fatal(const char *fmt, ...)
@@ -2111,6 +2117,23 @@ static void check_exports(struct module *mod)
}
}
+static int check_modname_len(struct module *mod)
+{
+ const char *mod_name;
+
+ mod_name = strrchr(mod->name, '/');
+ if (mod_name == NULL)
+ mod_name = mod->name;
+ else
+ mod_name++;
+ if (strlen(mod_name) >= MODULE_NAME_LEN) {
+ merror("module name is too long [%s.ko]\n", mod->name);
+ return 1;
+ }
+
+ return 0;
+}
+
/**
* Header for the generated file
**/
@@ -2150,11 +2173,6 @@ static void add_staging_flag(struct buffer *b, const char *name)
buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
}
-/* In kernel, this size is defined in linux/module.h;
- * here we use Elf_Addr instead of long for covering cross-compile
- */
-#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
-
/**
* Record CRCs for unresolved symbols
**/
@@ -2485,6 +2503,7 @@ int main(int argc, char **argv)
buf.pos = 0;
+ err |= check_modname_len(mod);
add_header(&buf, mod);
add_intree_flag(&buf, !external_module);
add_staging_flag(&buf, mod->name);
diff --git a/scripts/package/Makefile b/scripts/package/Makefile
index 71b4a8af9d4d..73f9f3192b9f 100644
--- a/scripts/package/Makefile
+++ b/scripts/package/Makefile
@@ -50,8 +50,6 @@ rpm-pkg rpm: FORCE
$(MAKE) clean
$(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec
$(call cmd,src_tar,$(KERNELPATH),kernel.spec)
- $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version
- mv -f $(objtree)/.tmp_version $(objtree)/.version
rpmbuild $(RPMOPTS) --target $(UTS_MACHINE) -ta $(KERNELPATH).tar.gz
rm $(KERNELPATH).tar.gz kernel.spec
@@ -60,9 +58,6 @@ rpm-pkg rpm: FORCE
binrpm-pkg: FORCE
$(MAKE) KBUILD_SRC=
$(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec
- $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version
- mv -f $(objtree)/.tmp_version $(objtree)/.version
-
rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \
$(UTS_MACHINE) -bb $(objtree)/binkernel.spec
rm binkernel.spec
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index aad67000e4dd..0bc87473f68f 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -92,12 +92,10 @@ else
fi
sourcename=$KDEB_SOURCENAME
tmpdir="$objtree/debian/tmp"
-fwdir="$objtree/debian/fwtmp"
kernel_headers_dir="$objtree/debian/hdrtmp"
libc_headers_dir="$objtree/debian/headertmp"
dbg_dir="$objtree/debian/dbgtmp"
packagename=linux-image-$version
-fwpackagename=linux-firmware-image-$version
kernel_headers_packagename=linux-headers-$version
libc_headers_packagename=linux-libc-dev
dbg_packagename=$packagename-dbg
@@ -126,10 +124,9 @@ esac
BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
# Setup the directory structure
-rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
+rm -rf "$tmpdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
mkdir -m 755 -p "$tmpdir/DEBIAN"
mkdir -p "$tmpdir/lib" "$tmpdir/boot"
-mkdir -p "$fwdir/lib/firmware/$version/"
mkdir -p "$kernel_headers_dir/lib/modules/$version/"
# Build and install the kernel
@@ -306,7 +303,6 @@ else
cat <<EOF >> debian/control
Package: $packagename
-Suggests: $fwpackagename
Architecture: any
Description: Linux kernel, version $version
This package contains the Linux kernel, modules and corresponding other
@@ -345,22 +341,6 @@ Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
This is useful for people who need to build external modules
EOF
-# Do we have firmware? Move it out of the way and build it into a package.
-if [ -e "$tmpdir/lib/firmware" ]; then
- mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
- rmdir "$tmpdir/lib/firmware"
-
- cat <<EOF >> debian/control
-
-Package: $fwpackagename
-Architecture: all
-Description: Linux kernel firmware, version $version
- This package contains firmware from the Linux kernel, version $version.
-EOF
-
- create_package "$fwpackagename" "$fwdir"
-fi
-
cat <<EOF >> debian/control
Package: $libc_headers_packagename
diff --git a/scripts/package/buildtar b/scripts/package/buildtar
index e046bff33589..51f947118256 100755
--- a/scripts/package/buildtar
+++ b/scripts/package/buildtar
@@ -24,20 +24,19 @@ tarball="${objtree}/linux-${KERNELRELEASE}-${ARCH}.tar"
#
case "${1}" in
tar-pkg)
- compress="cat"
- file_ext=""
+ opts=
;;
targz-pkg)
- compress="gzip"
- file_ext=".gz"
+ opts=--gzip
+ tarball=${tarball}.gz
;;
tarbz2-pkg)
- compress="bzip2"
- file_ext=".bz2"
+ opts=--bzip2
+ tarball=${tarball}.bz2
;;
tarxz-pkg)
- compress="xz"
- file_ext=".xz"
+ opts=--xz
+ tarball=${tarball}.xz
;;
*)
echo "Unknown tarball target \"${1}\" requested, please add it to ${0}." >&2
@@ -51,13 +50,14 @@ esac
#
rm -rf -- "${tmpdir}"
mkdir -p -- "${tmpdir}/boot"
-
+dirs=boot
#
# Try to install modules
#
-if grep -q '^CONFIG_MODULES=y' "${objtree}/.config"; then
+if grep -q '^CONFIG_MODULES=y' "${KCONFIG_CONFIG}"; then
make ARCH="${ARCH}" O="${objtree}" KBUILD_SRC= INSTALL_MOD_PATH="${tmpdir}" modules_install
+ dirs="$dirs lib"
fi
@@ -65,7 +65,7 @@ fi
# Install basic kernel files
#
cp -v -- "${objtree}/System.map" "${tmpdir}/boot/System.map-${KERNELRELEASE}"
-cp -v -- "${objtree}/.config" "${tmpdir}/boot/config-${KERNELRELEASE}"
+cp -v -- "${KCONFIG_CONFIG}" "${tmpdir}/boot/config-${KERNELRELEASE}"
cp -v -- "${objtree}/vmlinux" "${tmpdir}/boot/vmlinux-${KERNELRELEASE}"
@@ -124,14 +124,12 @@ esac
#
# Create the tarball
#
-(
- opts=
- if tar --owner=root --group=root --help >/dev/null 2>&1; then
- opts="--owner=root --group=root"
- fi
- tar cf - -C "$tmpdir" boot/ lib/ $opts | ${compress} > "${tarball}${file_ext}"
-)
+if tar --owner=root --group=root --help >/dev/null 2>&1; then
+ opts="$opts --owner=root --group=root"
+fi
+
+tar cf $tarball -C $tmpdir $opts $dirs
-echo "Tarball successfully created in ${tarball}${file_ext}"
+echo "Tarball successfully created in $tarball"
exit 0
diff --git a/scripts/package/mkspec b/scripts/package/mkspec
index bb43f153fd8e..f47f17aae135 100755
--- a/scripts/package/mkspec
+++ b/scripts/package/mkspec
@@ -27,9 +27,7 @@ __KERNELRELEASE=`echo $KERNELRELEASE | sed -e "s/-/_/g"`
echo "Name: kernel"
echo "Summary: The Linux Kernel"
echo "Version: $__KERNELRELEASE"
-# we need to determine the NEXT version number so that uname and
-# rpm -q will agree
-echo "Release: `. $srctree/scripts/mkversion`"
+echo "Release: $(cat .version 2>/dev/null || echo 1)"
echo "License: GPL"
echo "Group: System Environment/Kernel"
echo "Vendor: The Linux Community"
@@ -77,7 +75,7 @@ fi
echo "%build"
if ! $PREBUILT; then
-echo "make clean && make %{?_smp_mflags}"
+echo "make clean && make %{?_smp_mflags} KBUILD_BUILD_VERSION=%{release}"
echo ""
fi
@@ -88,11 +86,8 @@ echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules'
echo "%else"
echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules'
echo "%endif"
-echo 'mkdir -p $RPM_BUILD_ROOT'"/lib/firmware/$KERNELRELEASE"
-echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{?_smp_mflags} KBUILD_SRC= mod-fw= modules_install'
-echo 'INSTALL_FW_PATH=$RPM_BUILD_ROOT'"/lib/firmware/$KERNELRELEASE"
-echo 'make INSTALL_FW_PATH=$INSTALL_FW_PATH' firmware_install
+echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{?_smp_mflags} KBUILD_SRC= modules_install'
echo "%ifarch ia64"
echo 'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/efi/vmlinuz-$KERNELRELEASE"
echo 'ln -s '"efi/vmlinuz-$KERNELRELEASE" '$RPM_BUILD_ROOT'"/boot/"
@@ -119,7 +114,7 @@ if ! $PREBUILT; then
echo 'rm -f $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE/build"
echo 'rm -f $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE/source"
echo "mkdir -p "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE"
-echo "EXCLUDES=\"$RCS_TAR_IGNORE --exclude .tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude=firmware --exclude .config.old --exclude .missing-syscalls.d\""
+echo "EXCLUDES=\"$RCS_TAR_IGNORE --exclude .tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude .config.old --exclude .missing-syscalls.d\""
echo "tar "'$EXCLUDES'" -cf- . | (cd "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE;tar xvf -)"
echo 'cd $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE"
echo "ln -sf /usr/src/kernels/$KERNELRELEASE build"
@@ -154,7 +149,6 @@ echo '%defattr (-, root, root)'
echo "/lib/modules/$KERNELRELEASE"
echo "%exclude /lib/modules/$KERNELRELEASE/build"
echo "%exclude /lib/modules/$KERNELRELEASE/source"
-echo "/lib/firmware/$KERNELRELEASE"
echo "/boot/*"
echo ""
echo "%files headers"
diff --git a/scripts/selinux/genheaders/genheaders.c b/scripts/selinux/genheaders/genheaders.c
index 6a24569c3578..672b069dcfea 100644
--- a/scripts/selinux/genheaders/genheaders.c
+++ b/scripts/selinux/genheaders/genheaders.c
@@ -129,11 +129,16 @@ int main(int argc, char *argv[])
for (i = 0; secclass_map[i].name; i++) {
struct security_class_mapping *map = &secclass_map[i];
for (j = 0; map->perms[j]; j++) {
+ if (j >= 32) {
+ fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n",
+ map->name, map->perms[j]);
+ exit(5);
+ }
fprintf(fout, "#define %s__%s", map->name,
map->perms[j]);
for (k = 0; k < max(1, 40 - strlen(map->name) - strlen(map->perms[j])); k++)
fprintf(fout, " ");
- fprintf(fout, "0x%08xUL\n", (1<<j));
+ fprintf(fout, "0x%08xU\n", (1<<j));
}
}
diff --git a/scripts/spelling.txt b/scripts/spelling.txt
index 400ef35169c5..aa0cc49ad1ad 100644
--- a/scripts/spelling.txt
+++ b/scripts/spelling.txt
@@ -53,6 +53,7 @@ acumulator||accumulator
adapater||adapter
addional||additional
additionaly||additionally
+additonal||additional
addres||address
adddress||address
addreses||addresses
@@ -67,6 +68,8 @@ adviced||advised
afecting||affecting
againt||against
agaist||against
+aggreataon||aggregation
+aggreation||aggregation
albumns||albums
alegorical||allegorical
algined||aligned
@@ -80,6 +83,8 @@ aligment||alignment
alignement||alignment
allign||align
alligned||aligned
+alllocate||allocate
+alloated||allocated
allocatote||allocate
allocatrd||allocated
allocte||allocate
@@ -171,6 +176,7 @@ availale||available
availavility||availability
availble||available
availiable||available
+availible||available
avalable||available
avaliable||available
aysnc||async
@@ -203,6 +209,7 @@ broadcat||broadcast
cacluated||calculated
caculation||calculation
calender||calendar
+calescing||coalescing
calle||called
callibration||calibration
calucate||calculate
@@ -210,6 +217,7 @@ calulate||calculate
cancelation||cancellation
cancle||cancel
capabilites||capabilities
+capabilty||capability
capabitilies||capabilities
capatibilities||capabilities
capapbilities||capabilities
@@ -302,6 +310,7 @@ containts||contains
contaisn||contains
contant||contact
contence||contents
+continious||continuous
continous||continuous
continously||continuously
continueing||continuing
@@ -393,6 +402,7 @@ differrence||difference
diffrent||different
diffrentiate||differentiate
difinition||definition
+dimesions||dimensions
diplay||display
direectly||directly
disassocation||disassociation
@@ -449,6 +459,7 @@ equiped||equipped
equivelant||equivalent
equivilant||equivalent
eror||error
+errorr||error
estbalishment||establishment
etsablishment||establishment
etsbalishment||establishment
@@ -481,6 +492,7 @@ failied||failed
faillure||failure
failue||failure
failuer||failure
+failng||failing
faireness||fairness
falied||failed
faliure||failure
@@ -493,6 +505,7 @@ fetaure||feature
fetaures||features
fileystem||filesystem
fimware||firmware
+firware||firmware
finanize||finalize
findn||find
finilizes||finalizes
@@ -502,6 +515,7 @@ folloing||following
followign||following
followings||following
follwing||following
+fonud||found
forseeable||foreseeable
forse||force
fortan||fortran
@@ -532,6 +546,7 @@ grabing||grabbing
grahical||graphical
grahpical||graphical
grapic||graphic
+grranted||granted
guage||gauge
guarenteed||guaranteed
guarentee||guarantee
@@ -543,6 +558,7 @@ happend||happened
harware||hardware
heirarchically||hierarchically
helpfull||helpful
+hybernate||hibernate
hierachy||hierarchy
hierarchie||hierarchy
howver||however
@@ -565,16 +581,19 @@ implemenation||implementation
implementaiton||implementation
implementated||implemented
implemention||implementation
+implementd||implemented
implemetation||implementation
implemntation||implementation
implentation||implementation
implmentation||implementation
implmenting||implementing
+incative||inactive
incomming||incoming
incompatabilities||incompatibilities
incompatable||incompatible
inconsistant||inconsistent
increas||increase
+incremeted||incremented
incrment||increment
indendation||indentation
indended||intended
@@ -619,6 +638,7 @@ interger||integer
intermittant||intermittent
internel||internal
interoprability||interoperability
+interuupt||interrupt
interrface||interface
interrrupt||interrupt
interrup||interrupt
@@ -638,8 +658,10 @@ intrrupt||interrupt
intterrupt||interrupt
intuative||intuitive
invaid||invalid
+invald||invalid
invalde||invalid
invalide||invalid
+invalidiate||invalidate
invalud||invalid
invididual||individual
invokation||invocation
@@ -713,6 +735,7 @@ misformed||malformed
mispelled||misspelled
mispelt||misspelt
mising||missing
+mismactch||mismatch
missmanaged||mismanaged
missmatch||mismatch
miximum||maximum
@@ -731,6 +754,7 @@ multidimensionnal||multidimensional
multple||multiple
mumber||number
muticast||multicast
+mutilcast||multicast
mutiple||multiple
mutli||multi
nams||names
@@ -834,6 +858,7 @@ posible||possible
positon||position
possibilites||possibilities
powerfull||powerful
+preample||preamble
preapre||prepare
preceeded||preceded
preceeding||preceding
@@ -1059,6 +1084,7 @@ sturcture||structure
subdirectoires||subdirectories
suble||subtle
substract||subtract
+submition||submission
succesfully||successfully
succesful||successful
successed||succeeded
@@ -1078,6 +1104,7 @@ suppoted||supported
suppported||supported
suppport||support
supress||suppress
+surpressed||suppressed
surpresses||suppresses
susbsystem||subsystem
suspeneded||suspended
@@ -1091,6 +1118,7 @@ swithced||switched
swithcing||switching
swithed||switched
swithing||switching
+swtich||switch
symetric||symmetric
synax||syntax
synchonized||synchronized
@@ -1111,7 +1139,9 @@ therfore||therefore
thier||their
threds||threads
threshhold||threshold
+thresold||threshold
throught||through
+troughput||throughput
thses||these
tiggered||triggered
tipically||typically
@@ -1120,6 +1150,7 @@ tmis||this
torerable||tolerable
tramsmitted||transmitted
tramsmit||transmit
+tranasction||transaction
tranfer||transfer
transciever||transceiver
transferd||transferred
@@ -1133,6 +1164,7 @@ trasmission||transmission
treshold||threshold
trigerring||triggering
trun||turn
+tunning||tuning
ture||true
tyep||type
udpate||update
@@ -1199,6 +1231,7 @@ visiters||visitors
vitual||virtual
wakeus||wakeups
wating||waiting
+wiat||wait
wether||whether
whataver||whatever
whcih||which
diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install
index 677756ae34c9..067459760a7b 100755
--- a/scripts/sphinx-pre-install
+++ b/scripts/sphinx-pre-install
@@ -40,7 +40,6 @@ my $virtualenv = 1;
#
my %texlive = (
- 'adjustbox.sty' => 'texlive-adjustbox',
'amsfonts.sty' => 'texlive-amsfonts',
'amsmath.sty' => 'texlive-amsmath',
'amssymb.sty' => 'texlive-amsfonts',
diff --git a/security/apparmor/.gitignore b/security/apparmor/.gitignore
index 9cdec70d72b8..d5b291e94264 100644
--- a/security/apparmor/.gitignore
+++ b/security/apparmor/.gitignore
@@ -1,5 +1,6 @@
#
# Generated include files
#
+net_names.h
capability_names.h
rlim_names.h
diff --git a/security/apparmor/Makefile b/security/apparmor/Makefile
index a16b195274de..dafdd387d42b 100644
--- a/security/apparmor/Makefile
+++ b/security/apparmor/Makefile
@@ -4,11 +4,44 @@ obj-$(CONFIG_SECURITY_APPARMOR) += apparmor.o
apparmor-y := apparmorfs.o audit.o capability.o context.o ipc.o lib.o match.o \
path.o domain.o policy.o policy_unpack.o procattr.o lsm.o \
- resource.o secid.o file.o policy_ns.o label.o
+ resource.o secid.o file.o policy_ns.o label.o mount.o net.o
apparmor-$(CONFIG_SECURITY_APPARMOR_HASH) += crypto.o
-clean-files := capability_names.h rlim_names.h
+clean-files := capability_names.h rlim_names.h net_names.h
+# Build a lower case string table of address family names
+# Transform lines from
+# #define AF_LOCAL 1 /* POSIX name for AF_UNIX */
+# #define AF_INET 2 /* Internet IP Protocol */
+# to
+# [1] = "local",
+# [2] = "inet",
+#
+# and build the securityfs entries for the mapping.
+# Transforms lines from
+# #define AF_INET 2 /* Internet IP Protocol */
+# to
+# #define AA_SFS_AF_MASK "local inet"
+quiet_cmd_make-af = GEN $@
+cmd_make-af = echo "static const char *address_family_names[] = {" > $@ ;\
+ sed $< >>$@ -r -n -e "/AF_MAX/d" -e "/AF_LOCAL/d" -e "/AF_ROUTE/d" -e \
+ 's/^\#define[ \t]+AF_([A-Z0-9_]+)[ \t]+([0-9]+)(.*)/[\2] = "\L\1",/p';\
+ echo "};" >> $@ ;\
+ printf '%s' '\#define AA_SFS_AF_MASK "' >> $@ ;\
+ sed -r -n -e "/AF_MAX/d" -e "/AF_LOCAL/d" -e "/AF_ROUTE/d" -e \
+ 's/^\#define[ \t]+AF_([A-Z0-9_]+)[ \t]+([0-9]+)(.*)/\L\1/p'\
+ $< | tr '\n' ' ' | sed -e 's/ $$/"\n/' >> $@
+
+# Build a lower case string table of sock type names
+# Transform lines from
+# SOCK_STREAM = 1,
+# to
+# [1] = "stream",
+quiet_cmd_make-sock = GEN $@
+cmd_make-sock = echo "static const char *sock_type_names[] = {" >> $@ ;\
+ sed $^ >>$@ -r -n \
+ -e 's/^\tSOCK_([A-Z0-9_]+)[\t]+=[ \t]+([0-9]+)(.*)/[\2] = "\L\1",/p';\
+ echo "};" >> $@
# Build a lower case string table of capability names
# Transforms lines from
@@ -61,6 +94,7 @@ cmd_make-rlim = echo "static const char *const rlim_names[RLIM_NLIMITS] = {" \
tr '\n' ' ' | sed -e 's/ $$/"\n/' >> $@
$(obj)/capability.o : $(obj)/capability_names.h
+$(obj)/net.o : $(obj)/net_names.h
$(obj)/resource.o : $(obj)/rlim_names.h
$(obj)/capability_names.h : $(srctree)/include/uapi/linux/capability.h \
$(src)/Makefile
@@ -68,3 +102,8 @@ $(obj)/capability_names.h : $(srctree)/include/uapi/linux/capability.h \
$(obj)/rlim_names.h : $(srctree)/include/uapi/asm-generic/resource.h \
$(src)/Makefile
$(call cmd,make-rlim)
+$(obj)/net_names.h : $(srctree)/include/linux/socket.h \
+ $(srctree)/include/linux/net.h \
+ $(src)/Makefile
+ $(call cmd,make-af)
+ $(call cmd,make-sock)
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
index 853c2ec8e0c9..518d5928661b 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -32,6 +32,7 @@
#include "include/audit.h"
#include "include/context.h"
#include "include/crypto.h"
+#include "include/ipc.h"
#include "include/policy_ns.h"
#include "include/label.h"
#include "include/policy.h"
@@ -248,8 +249,10 @@ static struct dentry *aafs_create(const char *name, umode_t mode,
inode_lock(dir);
dentry = lookup_one_len(name, parent, strlen(name));
- if (IS_ERR(dentry))
+ if (IS_ERR(dentry)) {
+ error = PTR_ERR(dentry);
goto fail_lock;
+ }
if (d_really_is_positive(dentry)) {
error = -EEXIST;
@@ -1443,6 +1446,10 @@ void __aafs_profile_migrate_dents(struct aa_profile *old,
{
int i;
+ AA_BUG(!old);
+ AA_BUG(!new);
+ AA_BUG(!mutex_is_locked(&profiles_ns(old)->lock));
+
for (i = 0; i < AAFS_PROF_SIZEOF; i++) {
new->dents[i] = old->dents[i];
if (new->dents[i])
@@ -1506,6 +1513,9 @@ int __aafs_profile_mkdir(struct aa_profile *profile, struct dentry *parent)
struct dentry *dent = NULL, *dir;
int error;
+ AA_BUG(!profile);
+ AA_BUG(!mutex_is_locked(&profiles_ns(profile)->lock));
+
if (!parent) {
struct aa_profile *p;
p = aa_deref_parent(profile);
@@ -1731,6 +1741,7 @@ void __aafs_ns_rmdir(struct aa_ns *ns)
if (!ns)
return;
+ AA_BUG(!mutex_is_locked(&ns->lock));
list_for_each_entry(child, &ns->base.profiles, base.list)
__aafs_profile_rmdir(child);
@@ -1903,6 +1914,10 @@ static struct aa_ns *__next_ns(struct aa_ns *root, struct aa_ns *ns)
{
struct aa_ns *parent, *next;
+ AA_BUG(!root);
+ AA_BUG(!ns);
+ AA_BUG(ns != root && !mutex_is_locked(&ns->parent->lock));
+
/* is next namespace a child */
if (!list_empty(&ns->sub_ns)) {
next = list_first_entry(&ns->sub_ns, typeof(*ns), base.list);
@@ -1937,6 +1952,9 @@ static struct aa_ns *__next_ns(struct aa_ns *root, struct aa_ns *ns)
static struct aa_profile *__first_profile(struct aa_ns *root,
struct aa_ns *ns)
{
+ AA_BUG(!root);
+ AA_BUG(ns && !mutex_is_locked(&ns->lock));
+
for (; ns; ns = __next_ns(root, ns)) {
if (!list_empty(&ns->base.profiles))
return list_first_entry(&ns->base.profiles,
@@ -1959,6 +1977,8 @@ static struct aa_profile *__next_profile(struct aa_profile *p)
struct aa_profile *parent;
struct aa_ns *ns = p->ns;
+ AA_BUG(!mutex_is_locked(&profiles_ns(p)->lock));
+
/* is next profile a child */
if (!list_empty(&p->base.profiles))
return list_first_entry(&p->base.profiles, typeof(*p),
@@ -2127,6 +2147,11 @@ static struct aa_sfs_entry aa_sfs_entry_ptrace[] = {
{ }
};
+static struct aa_sfs_entry aa_sfs_entry_signal[] = {
+ AA_SFS_FILE_STRING("mask", AA_SFS_SIG_MASK),
+ { }
+};
+
static struct aa_sfs_entry aa_sfs_entry_domain[] = {
AA_SFS_FILE_BOOLEAN("change_hat", 1),
AA_SFS_FILE_BOOLEAN("change_hatv", 1),
@@ -2151,9 +2176,14 @@ static struct aa_sfs_entry aa_sfs_entry_policy[] = {
{ }
};
+static struct aa_sfs_entry aa_sfs_entry_mount[] = {
+ AA_SFS_FILE_STRING("mask", "mount umount pivot_root"),
+ { }
+};
+
static struct aa_sfs_entry aa_sfs_entry_ns[] = {
AA_SFS_FILE_BOOLEAN("profile", 1),
- AA_SFS_FILE_BOOLEAN("pivot_root", 1),
+ AA_SFS_FILE_BOOLEAN("pivot_root", 0),
{ }
};
@@ -2172,22 +2202,25 @@ static struct aa_sfs_entry aa_sfs_entry_features[] = {
AA_SFS_DIR("policy", aa_sfs_entry_policy),
AA_SFS_DIR("domain", aa_sfs_entry_domain),
AA_SFS_DIR("file", aa_sfs_entry_file),
+ AA_SFS_DIR("network", aa_sfs_entry_network),
+ AA_SFS_DIR("mount", aa_sfs_entry_mount),
AA_SFS_DIR("namespaces", aa_sfs_entry_ns),
AA_SFS_FILE_U64("capability", VFS_CAP_FLAGS_MASK),
AA_SFS_DIR("rlimit", aa_sfs_entry_rlimit),
AA_SFS_DIR("caps", aa_sfs_entry_caps),
AA_SFS_DIR("ptrace", aa_sfs_entry_ptrace),
+ AA_SFS_DIR("signal", aa_sfs_entry_signal),
AA_SFS_DIR("query", aa_sfs_entry_query),
{ }
};
static struct aa_sfs_entry aa_sfs_entry_apparmor[] = {
- AA_SFS_FILE_FOPS(".access", 0640, &aa_sfs_access),
+ AA_SFS_FILE_FOPS(".access", 0666, &aa_sfs_access),
AA_SFS_FILE_FOPS(".stacked", 0444, &seq_ns_stacked_fops),
AA_SFS_FILE_FOPS(".ns_stacked", 0444, &seq_ns_nsstacked_fops),
- AA_SFS_FILE_FOPS(".ns_level", 0666, &seq_ns_level_fops),
- AA_SFS_FILE_FOPS(".ns_name", 0640, &seq_ns_name_fops),
- AA_SFS_FILE_FOPS("profiles", 0440, &aa_sfs_profiles_fops),
+ AA_SFS_FILE_FOPS(".ns_level", 0444, &seq_ns_level_fops),
+ AA_SFS_FILE_FOPS(".ns_name", 0444, &seq_ns_name_fops),
+ AA_SFS_FILE_FOPS("profiles", 0444, &aa_sfs_profiles_fops),
AA_SFS_DIR("features", aa_sfs_entry_features),
{ }
};
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
index 17a601c67b62..dd754b7850a8 100644
--- a/security/apparmor/domain.c
+++ b/security/apparmor/domain.c
@@ -374,8 +374,8 @@ static const char *next_name(int xtype, const char *name)
*
* Returns: refcounted label, or NULL on failure (MAYBE NULL)
*/
-static struct aa_label *x_table_lookup(struct aa_profile *profile, u32 xindex,
- const char **name)
+struct aa_label *x_table_lookup(struct aa_profile *profile, u32 xindex,
+ const char **name)
{
struct aa_label *label = NULL;
u32 xtype = xindex & AA_X_TYPE_MASK;
diff --git a/security/apparmor/file.c b/security/apparmor/file.c
index 3382518b87fa..db80221891c6 100644
--- a/security/apparmor/file.c
+++ b/security/apparmor/file.c
@@ -21,6 +21,7 @@
#include "include/context.h"
#include "include/file.h"
#include "include/match.h"
+#include "include/net.h"
#include "include/path.h"
#include "include/policy.h"
#include "include/label.h"
@@ -566,6 +567,32 @@ static int __file_path_perm(const char *op, struct aa_label *label,
return error;
}
+static int __file_sock_perm(const char *op, struct aa_label *label,
+ struct aa_label *flabel, struct file *file,
+ u32 request, u32 denied)
+{
+ struct socket *sock = (struct socket *) file->private_data;
+ int error;
+
+ AA_BUG(!sock);
+
+ /* revalidation due to label out of date. No revocation at this time */
+ if (!denied && aa_label_is_subset(flabel, label))
+ return 0;
+
+ /* TODO: improve to skip profiles cached in flabel */
+ error = aa_sock_file_perm(label, op, request, sock);
+ if (denied) {
+ /* TODO: improve to skip profiles checked above */
+ /* check every profile in file label to is cached */
+ last_error(error, aa_sock_file_perm(flabel, op, request, sock));
+ }
+ if (!error)
+ update_file_ctx(file_ctx(file), label, request);
+
+ return error;
+}
+
/**
* aa_file_perm - do permission revalidation check & audit for @file
* @op: operation being checked
@@ -610,6 +637,9 @@ int aa_file_perm(const char *op, struct aa_label *label, struct file *file,
error = __file_path_perm(op, label, flabel, file, request,
denied);
+ else if (S_ISSOCK(file_inode(file)->i_mode))
+ error = __file_sock_perm(op, label, flabel, file, request,
+ denied);
done:
rcu_read_unlock();
diff --git a/security/apparmor/include/apparmor.h b/security/apparmor/include/apparmor.h
index aaf893f4e4f5..829082c35faa 100644
--- a/security/apparmor/include/apparmor.h
+++ b/security/apparmor/include/apparmor.h
@@ -27,7 +27,9 @@
#define AA_CLASS_NET 4
#define AA_CLASS_RLIMITS 5
#define AA_CLASS_DOMAIN 6
+#define AA_CLASS_MOUNT 7
#define AA_CLASS_PTRACE 9
+#define AA_CLASS_SIGNAL 10
#define AA_CLASS_LABEL 16
#define AA_CLASS_LAST AA_CLASS_LABEL
diff --git a/security/apparmor/include/audit.h b/security/apparmor/include/audit.h
index c68839a44351..ff4316e1068d 100644
--- a/security/apparmor/include/audit.h
+++ b/security/apparmor/include/audit.h
@@ -71,6 +71,10 @@ enum audit_type {
#define OP_FMPROT "file_mprotect"
#define OP_INHERIT "file_inherit"
+#define OP_PIVOTROOT "pivotroot"
+#define OP_MOUNT "mount"
+#define OP_UMOUNT "umount"
+
#define OP_CREATE "create"
#define OP_POST_CREATE "post_create"
#define OP_BIND "bind"
@@ -86,6 +90,7 @@ enum audit_type {
#define OP_SHUTDOWN "socket_shutdown"
#define OP_PTRACE "ptrace"
+#define OP_SIGNAL "signal"
#define OP_EXEC "exec"
@@ -116,20 +121,36 @@ struct apparmor_audit_data {
/* these entries require a custom callback fn */
struct {
struct aa_label *peer;
- struct {
- const char *target;
- kuid_t ouid;
- } fs;
+ union {
+ struct {
+ kuid_t ouid;
+ const char *target;
+ } fs;
+ struct {
+ int type, protocol;
+ struct sock *peer_sk;
+ void *addr;
+ int addrlen;
+ } net;
+ int signal;
+ struct {
+ int rlim;
+ unsigned long max;
+ } rlim;
+ };
};
struct {
- const char *name;
- long pos;
+ struct aa_profile *profile;
const char *ns;
+ long pos;
} iface;
struct {
- int rlim;
- unsigned long max;
- } rlim;
+ const char *src_name;
+ const char *type;
+ const char *trans;
+ const char *data;
+ unsigned long flags;
+ } mnt;
};
};
diff --git a/security/apparmor/include/domain.h b/security/apparmor/include/domain.h
index 24c5976d6143..ac9862ff7cdf 100644
--- a/security/apparmor/include/domain.h
+++ b/security/apparmor/include/domain.h
@@ -15,6 +15,8 @@
#include <linux/binfmts.h>
#include <linux/types.h>
+#include "label.h"
+
#ifndef __AA_DOMAIN_H
#define __AA_DOMAIN_H
@@ -29,6 +31,9 @@ struct aa_domain {
#define AA_CHANGE_ONEXEC 4
#define AA_CHANGE_STACK 8
+struct aa_label *x_table_lookup(struct aa_profile *profile, u32 xindex,
+ const char **name);
+
int apparmor_bprm_set_creds(struct linux_binprm *bprm);
void aa_free_domain_entries(struct aa_domain *domain);
diff --git a/security/apparmor/include/ipc.h b/security/apparmor/include/ipc.h
index 656fdb81c8a0..5ffc218d1e74 100644
--- a/security/apparmor/include/ipc.h
+++ b/security/apparmor/include/ipc.h
@@ -27,8 +27,14 @@ struct aa_profile;
#define AA_PTRACE_PERM_MASK (AA_PTRACE_READ | AA_PTRACE_TRACE | \
AA_MAY_BE_READ | AA_MAY_BE_TRACED)
+#define AA_SIGNAL_PERM_MASK (MAY_READ | MAY_WRITE)
+
+#define AA_SFS_SIG_MASK "hup int quit ill trap abrt bus fpe kill usr1 " \
+ "segv usr2 pipe alrm term stkflt chld cont stop stp ttin ttou urg " \
+ "xcpu xfsz vtalrm prof winch io pwr sys emt lost"
int aa_may_ptrace(struct aa_label *tracer, struct aa_label *tracee,
u32 request);
+int aa_may_signal(struct aa_label *sender, struct aa_label *target, int sig);
#endif /* __AA_IPC_H */
diff --git a/security/apparmor/include/label.h b/security/apparmor/include/label.h
index 9a283b722755..af22dcbbcb8a 100644
--- a/security/apparmor/include/label.h
+++ b/security/apparmor/include/label.h
@@ -310,6 +310,7 @@ bool aa_update_label_name(struct aa_ns *ns, struct aa_label *label, gfp_t gfp);
#define FLAG_SHOW_MODE 1
#define FLAG_VIEW_SUBNS 2
#define FLAG_HIDDEN_UNCONFINED 4
+#define FLAG_ABS_ROOT 8
int aa_label_snxprint(char *str, size_t size, struct aa_ns *view,
struct aa_label *label, int flags);
int aa_label_asxprint(char **strp, struct aa_ns *ns, struct aa_label *label,
diff --git a/security/apparmor/include/mount.h b/security/apparmor/include/mount.h
new file mode 100644
index 000000000000..25d6067fa6ef
--- /dev/null
+++ b/security/apparmor/include/mount.h
@@ -0,0 +1,54 @@
+/*
+ * AppArmor security module
+ *
+ * This file contains AppArmor file mediation function definitions.
+ *
+ * Copyright 2017 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ */
+
+#ifndef __AA_MOUNT_H
+#define __AA_MOUNT_H
+
+#include <linux/fs.h>
+#include <linux/path.h>
+
+#include "domain.h"
+#include "policy.h"
+
+/* mount perms */
+#define AA_MAY_PIVOTROOT 0x01
+#define AA_MAY_MOUNT 0x02
+#define AA_MAY_UMOUNT 0x04
+#define AA_AUDIT_DATA 0x40
+#define AA_MNT_CONT_MATCH 0x40
+
+#define AA_MS_IGNORE_MASK (MS_KERNMOUNT | MS_NOSEC | MS_ACTIVE | MS_BORN)
+
+int aa_remount(struct aa_label *label, const struct path *path,
+ unsigned long flags, void *data);
+
+int aa_bind_mount(struct aa_label *label, const struct path *path,
+ const char *old_name, unsigned long flags);
+
+
+int aa_mount_change_type(struct aa_label *label, const struct path *path,
+ unsigned long flags);
+
+int aa_move_mount(struct aa_label *label, const struct path *path,
+ const char *old_name);
+
+int aa_new_mount(struct aa_label *label, const char *dev_name,
+ const struct path *path, const char *type, unsigned long flags,
+ void *data);
+
+int aa_umount(struct aa_label *label, struct vfsmount *mnt, int flags);
+
+int aa_pivotroot(struct aa_label *label, const struct path *old_path,
+ const struct path *new_path);
+
+#endif /* __AA_MOUNT_H */
diff --git a/security/apparmor/include/net.h b/security/apparmor/include/net.h
new file mode 100644
index 000000000000..140c8efcf364
--- /dev/null
+++ b/security/apparmor/include/net.h
@@ -0,0 +1,114 @@
+/*
+ * AppArmor security module
+ *
+ * This file contains AppArmor network mediation definitions.
+ *
+ * Copyright (C) 1998-2008 Novell/SUSE
+ * Copyright 2009-2017 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ */
+
+#ifndef __AA_NET_H
+#define __AA_NET_H
+
+#include <net/sock.h>
+#include <linux/path.h>
+
+#include "apparmorfs.h"
+#include "label.h"
+#include "perms.h"
+#include "policy.h"
+
+#define AA_MAY_SEND AA_MAY_WRITE
+#define AA_MAY_RECEIVE AA_MAY_READ
+
+#define AA_MAY_SHUTDOWN AA_MAY_DELETE
+
+#define AA_MAY_CONNECT AA_MAY_OPEN
+#define AA_MAY_ACCEPT 0x00100000
+
+#define AA_MAY_BIND 0x00200000
+#define AA_MAY_LISTEN 0x00400000
+
+#define AA_MAY_SETOPT 0x01000000
+#define AA_MAY_GETOPT 0x02000000
+
+#define NET_PERMS_MASK (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CREATE | \
+ AA_MAY_SHUTDOWN | AA_MAY_BIND | AA_MAY_LISTEN | \
+ AA_MAY_CONNECT | AA_MAY_ACCEPT | AA_MAY_SETATTR | \
+ AA_MAY_GETATTR | AA_MAY_SETOPT | AA_MAY_GETOPT)
+
+#define NET_FS_PERMS (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CREATE | \
+ AA_MAY_SHUTDOWN | AA_MAY_CONNECT | AA_MAY_RENAME |\
+ AA_MAY_SETATTR | AA_MAY_GETATTR | AA_MAY_CHMOD | \
+ AA_MAY_CHOWN | AA_MAY_CHGRP | AA_MAY_LOCK | \
+ AA_MAY_MPROT)
+
+#define NET_PEER_MASK (AA_MAY_SEND | AA_MAY_RECEIVE | AA_MAY_CONNECT | \
+ AA_MAY_ACCEPT)
+struct aa_sk_ctx {
+ struct aa_label *label;
+ struct aa_label *peer;
+ struct path path;
+};
+
+#define SK_CTX(X) ((X)->sk_security)
+#define SOCK_ctx(X) SOCK_INODE(X)->i_security
+#define DEFINE_AUDIT_NET(NAME, OP, SK, F, T, P) \
+ struct lsm_network_audit NAME ## _net = { .sk = (SK), \
+ .family = (F)}; \
+ DEFINE_AUDIT_DATA(NAME, \
+ ((SK) && (F) != AF_UNIX) ? LSM_AUDIT_DATA_NET : \
+ LSM_AUDIT_DATA_NONE, \
+ OP); \
+ NAME.u.net = &(NAME ## _net); \
+ aad(&NAME)->net.type = (T); \
+ aad(&NAME)->net.protocol = (P)
+
+#define DEFINE_AUDIT_SK(NAME, OP, SK) \
+ DEFINE_AUDIT_NET(NAME, OP, SK, (SK)->sk_family, (SK)->sk_type, \
+ (SK)->sk_protocol)
+
+/* struct aa_net - network confinement data
+ * @allow: basic network families permissions
+ * @audit: which network permissions to force audit
+ * @quiet: which network permissions to quiet rejects
+ */
+struct aa_net {
+ u16 allow[AF_MAX];
+ u16 audit[AF_MAX];
+ u16 quiet[AF_MAX];
+};
+
+
+extern struct aa_sfs_entry aa_sfs_entry_network[];
+
+void audit_net_cb(struct audit_buffer *ab, void *va);
+int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa,
+ u32 request, u16 family, int type);
+int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family,
+ int type, int protocol);
+static inline int aa_profile_af_sk_perm(struct aa_profile *profile,
+ struct common_audit_data *sa,
+ u32 request,
+ struct sock *sk)
+{
+ return aa_profile_af_perm(profile, sa, request, sk->sk_family,
+ sk->sk_type);
+}
+int aa_sk_perm(const char *op, u32 request, struct sock *sk);
+
+int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request,
+ struct socket *sock);
+
+
+static inline void aa_free_net_rules(struct aa_net *new)
+{
+ /* NOP */
+}
+
+#endif /* __AA_NET_H */
diff --git a/security/apparmor/include/perms.h b/security/apparmor/include/perms.h
index 2b27bb79aec4..af04d5a7d73d 100644
--- a/security/apparmor/include/perms.h
+++ b/security/apparmor/include/perms.h
@@ -135,9 +135,10 @@ extern struct aa_perms allperms;
void aa_perm_mask_to_str(char *str, const char *chrs, u32 mask);
-void aa_audit_perm_names(struct audit_buffer *ab, const char **names, u32 mask);
+void aa_audit_perm_names(struct audit_buffer *ab, const char * const *names,
+ u32 mask);
void aa_audit_perm_mask(struct audit_buffer *ab, u32 mask, const char *chrs,
- u32 chrsmask, const char **names, u32 namesmask);
+ u32 chrsmask, const char * const *names, u32 namesmask);
void aa_apply_modes_to_perms(struct aa_profile *profile,
struct aa_perms *perms);
void aa_compute_perms(struct aa_dfa *dfa, unsigned int state,
diff --git a/security/apparmor/include/policy.h b/security/apparmor/include/policy.h
index 17fe41a9cac3..4364088a0b9e 100644
--- a/security/apparmor/include/policy.h
+++ b/security/apparmor/include/policy.h
@@ -30,6 +30,7 @@
#include "file.h"
#include "lib.h"
#include "label.h"
+#include "net.h"
#include "perms.h"
#include "resource.h"
@@ -111,6 +112,7 @@ struct aa_data {
* @policy: general match rules governing policy
* @file: The set of rules governing basic file access and domain transitions
* @caps: capabilities for the profile
+ * @net: network controls for the profile
* @rlimits: rlimits for the profile
*
* @dents: dentries for the profiles file entries in apparmorfs
@@ -148,6 +150,7 @@ struct aa_profile {
struct aa_policydb policy;
struct aa_file_rules file;
struct aa_caps caps;
+ struct aa_net net;
struct aa_rlimit rlimits;
struct aa_loaddata *rawdata;
@@ -220,6 +223,16 @@ static inline unsigned int PROFILE_MEDIATES_SAFE(struct aa_profile *profile,
return 0;
}
+static inline unsigned int PROFILE_MEDIATES_AF(struct aa_profile *profile,
+ u16 AF) {
+ unsigned int state = PROFILE_MEDIATES(profile, AA_CLASS_NET);
+ u16 be_af = cpu_to_be16(AF);
+
+ if (!state)
+ return 0;
+ return aa_dfa_match_len(profile->policy.dfa, state, (char *) &be_af, 2);
+}
+
/**
* aa_get_profile - increment refcount on profile @p
* @p: profile (MAYBE NULL)
diff --git a/security/apparmor/include/sig_names.h b/security/apparmor/include/sig_names.h
new file mode 100644
index 000000000000..92e62fe95292
--- /dev/null
+++ b/security/apparmor/include/sig_names.h
@@ -0,0 +1,98 @@
+#include <linux/signal.h>
+
+#define SIGUNKNOWN 0
+#define MAXMAPPED_SIG 35
+/* provide a mapping of arch signal to internal signal # for mediation
+ * those that are always an alias SIGCLD for SIGCLHD and SIGPOLL for SIGIO
+ * map to the same entry those that may/or may not get a separate entry
+ */
+static const int sig_map[MAXMAPPED_SIG] = {
+ [0] = MAXMAPPED_SIG, /* existence test */
+ [SIGHUP] = 1,
+ [SIGINT] = 2,
+ [SIGQUIT] = 3,
+ [SIGILL] = 4,
+ [SIGTRAP] = 5, /* -, 5, - */
+ [SIGABRT] = 6, /* SIGIOT: -, 6, - */
+ [SIGBUS] = 7, /* 10, 7, 10 */
+ [SIGFPE] = 8,
+ [SIGKILL] = 9,
+ [SIGUSR1] = 10, /* 30, 10, 16 */
+ [SIGSEGV] = 11,
+ [SIGUSR2] = 12, /* 31, 12, 17 */
+ [SIGPIPE] = 13,
+ [SIGALRM] = 14,
+ [SIGTERM] = 15,
+#ifdef SIGSTKFLT
+ [SIGSTKFLT] = 16, /* -, 16, - */
+#endif
+ [SIGCHLD] = 17, /* 20, 17, 18. SIGCHLD -, -, 18 */
+ [SIGCONT] = 18, /* 19, 18, 25 */
+ [SIGSTOP] = 19, /* 17, 19, 23 */
+ [SIGTSTP] = 20, /* 18, 20, 24 */
+ [SIGTTIN] = 21, /* 21, 21, 26 */
+ [SIGTTOU] = 22, /* 22, 22, 27 */
+ [SIGURG] = 23, /* 16, 23, 21 */
+ [SIGXCPU] = 24, /* 24, 24, 30 */
+ [SIGXFSZ] = 25, /* 25, 25, 31 */
+ [SIGVTALRM] = 26, /* 26, 26, 28 */
+ [SIGPROF] = 27, /* 27, 27, 29 */
+ [SIGWINCH] = 28, /* 28, 28, 20 */
+ [SIGIO] = 29, /* SIGPOLL: 23, 29, 22 */
+ [SIGPWR] = 30, /* 29, 30, 19. SIGINFO 29, -, - */
+#ifdef SIGSYS
+ [SIGSYS] = 31, /* 12, 31, 12. often SIG LOST/UNUSED */
+#endif
+#ifdef SIGEMT
+ [SIGEMT] = 32, /* 7, - , 7 */
+#endif
+#if defined(SIGLOST) && SIGPWR != SIGLOST /* sparc */
+ [SIGLOST] = 33, /* unused on Linux */
+#endif
+#if defined(SIGUNUSED) && \
+ defined(SIGLOST) && defined(SIGSYS) && SIGLOST != SIGSYS
+ [SIGUNUSED] = 34, /* -, 31, - */
+#endif
+};
+
+/* this table is ordered post sig_map[sig] mapping */
+static const char *const sig_names[MAXMAPPED_SIG + 1] = {
+ "unknown",
+ "hup",
+ "int",
+ "quit",
+ "ill",
+ "trap",
+ "abrt",
+ "bus",
+ "fpe",
+ "kill",
+ "usr1",
+ "segv",
+ "usr2",
+ "pipe",
+ "alrm",
+ "term",
+ "stkflt",
+ "chld",
+ "cont",
+ "stop",
+ "stp",
+ "ttin",
+ "ttou",
+ "urg",
+ "xcpu",
+ "xfsz",
+ "vtalrm",
+ "prof",
+ "winch",
+ "io",
+ "pwr",
+ "sys",
+ "emt",
+ "lost",
+ "unused",
+
+ "exists", /* always last existence test mapped to MAXMAPPED_SIG */
+};
+
diff --git a/security/apparmor/ipc.c b/security/apparmor/ipc.c
index 11e66b5bbc42..66fb9ede9447 100644
--- a/security/apparmor/ipc.c
+++ b/security/apparmor/ipc.c
@@ -20,6 +20,7 @@
#include "include/context.h"
#include "include/policy.h"
#include "include/ipc.h"
+#include "include/sig_names.h"
/**
* audit_ptrace_mask - convert mask to permission string
@@ -121,3 +122,101 @@ int aa_may_ptrace(struct aa_label *tracer, struct aa_label *tracee,
}
+static inline int map_signal_num(int sig)
+{
+ if (sig > SIGRTMAX)
+ return SIGUNKNOWN;
+ else if (sig >= SIGRTMIN)
+ return sig - SIGRTMIN + 128; /* rt sigs mapped to 128 */
+ else if (sig <= MAXMAPPED_SIG)
+ return sig_map[sig];
+ return SIGUNKNOWN;
+}
+
+/**
+ * audit_file_mask - convert mask to permission string
+ * @buffer: buffer to write string to (NOT NULL)
+ * @mask: permission mask to convert
+ */
+static void audit_signal_mask(struct audit_buffer *ab, u32 mask)
+{
+ if (mask & MAY_READ)
+ audit_log_string(ab, "receive");
+ if (mask & MAY_WRITE)
+ audit_log_string(ab, "send");
+}
+
+/**
+ * audit_cb - call back for signal specific audit fields
+ * @ab: audit_buffer (NOT NULL)
+ * @va: audit struct to audit values of (NOT NULL)
+ */
+static void audit_signal_cb(struct audit_buffer *ab, void *va)
+{
+ struct common_audit_data *sa = va;
+
+ if (aad(sa)->request & AA_SIGNAL_PERM_MASK) {
+ audit_log_format(ab, " requested_mask=");
+ audit_signal_mask(ab, aad(sa)->request);
+ if (aad(sa)->denied & AA_SIGNAL_PERM_MASK) {
+ audit_log_format(ab, " denied_mask=");
+ audit_signal_mask(ab, aad(sa)->denied);
+ }
+ }
+ if (aad(sa)->signal <= MAXMAPPED_SIG)
+ audit_log_format(ab, " signal=%s", sig_names[aad(sa)->signal]);
+ else
+ audit_log_format(ab, " signal=rtmin+%d",
+ aad(sa)->signal - 128);
+ audit_log_format(ab, " peer=");
+ aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer,
+ FLAGS_NONE, GFP_ATOMIC);
+}
+
+/* TODO: update to handle compound name&name2, conditionals */
+static void profile_match_signal(struct aa_profile *profile, const char *label,
+ int signal, struct aa_perms *perms)
+{
+ unsigned int state;
+
+ /* TODO: secondary cache check <profile, profile, perm> */
+ state = aa_dfa_next(profile->policy.dfa,
+ profile->policy.start[AA_CLASS_SIGNAL],
+ signal);
+ state = aa_dfa_match(profile->policy.dfa, state, label);
+ aa_compute_perms(profile->policy.dfa, state, perms);
+}
+
+static int profile_signal_perm(struct aa_profile *profile,
+ struct aa_profile *peer, u32 request,
+ struct common_audit_data *sa)
+{
+ struct aa_perms perms;
+
+ if (profile_unconfined(profile) ||
+ !PROFILE_MEDIATES(profile, AA_CLASS_SIGNAL))
+ return 0;
+
+ aad(sa)->peer = &peer->label;
+ profile_match_signal(profile, peer->base.hname, aad(sa)->signal,
+ &perms);
+ aa_apply_modes_to_perms(profile, &perms);
+ return aa_check_perms(profile, &perms, request, sa, audit_signal_cb);
+}
+
+static int aa_signal_cross_perm(struct aa_profile *sender,
+ struct aa_profile *target,
+ struct common_audit_data *sa)
+{
+ return xcheck(profile_signal_perm(sender, target, MAY_WRITE, sa),
+ profile_signal_perm(target, sender, MAY_READ, sa));
+}
+
+int aa_may_signal(struct aa_label *sender, struct aa_label *target, int sig)
+{
+ DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, OP_SIGNAL);
+
+ aad(&sa)->signal = map_signal_num(sig);
+ return xcheck_labels_profiles(sender, target, aa_signal_cross_perm,
+ &sa);
+}
diff --git a/security/apparmor/label.c b/security/apparmor/label.c
index e052eaba1cf6..c5b99b954580 100644
--- a/security/apparmor/label.c
+++ b/security/apparmor/label.c
@@ -49,7 +49,7 @@ static void free_proxy(struct aa_proxy *proxy)
/* p->label will not updated any more as p is dead */
aa_put_label(rcu_dereference_protected(proxy->label, true));
memset(proxy, 0, sizeof(*proxy));
- proxy->label = (struct aa_label *) PROXY_POISON;
+ RCU_INIT_POINTER(proxy->label, (struct aa_label *)PROXY_POISON);
kfree(proxy);
}
}
@@ -1450,9 +1450,11 @@ bool aa_update_label_name(struct aa_ns *ns, struct aa_label *label, gfp_t gfp)
* cached label name is present and visible
* @label->hname only exists if label is namespace hierachical
*/
-static inline bool use_label_hname(struct aa_ns *ns, struct aa_label *label)
+static inline bool use_label_hname(struct aa_ns *ns, struct aa_label *label,
+ int flags)
{
- if (label->hname && labels_ns(label) == ns)
+ if (label->hname && (!ns || labels_ns(label) == ns) &&
+ !(flags & ~FLAG_SHOW_MODE))
return true;
return false;
@@ -1495,7 +1497,7 @@ static int aa_profile_snxprint(char *str, size_t size, struct aa_ns *view,
view = profiles_ns(profile);
if (view != profile->ns &&
- (!prev_ns || (prev_ns && *prev_ns != profile->ns))) {
+ (!prev_ns || (*prev_ns != profile->ns))) {
if (prev_ns)
*prev_ns = profile->ns;
ns_name = aa_ns_name(view, profile->ns,
@@ -1605,8 +1607,13 @@ int aa_label_snxprint(char *str, size_t size, struct aa_ns *ns,
AA_BUG(!str && size != 0);
AA_BUG(!label);
- if (!ns)
+ if (flags & FLAG_ABS_ROOT) {
+ ns = root_ns;
+ len = snprintf(str, size, "=");
+ update_for_len(total, len, size, str);
+ } else if (!ns) {
ns = labels_ns(label);
+ }
label_for_each(i, label, profile) {
if (aa_ns_visible(ns, profile->ns, flags & FLAG_VIEW_SUBNS)) {
@@ -1710,10 +1717,8 @@ void aa_label_xaudit(struct audit_buffer *ab, struct aa_ns *ns,
AA_BUG(!ab);
AA_BUG(!label);
- if (!ns)
- ns = labels_ns(label);
-
- if (!use_label_hname(ns, label) || display_mode(ns, label, flags)) {
+ if (!use_label_hname(ns, label, flags) ||
+ display_mode(ns, label, flags)) {
len = aa_label_asxprint(&name, ns, label, flags, gfp);
if (len == -1) {
AA_DEBUG("label print error");
@@ -1738,10 +1743,7 @@ void aa_label_seq_xprint(struct seq_file *f, struct aa_ns *ns,
AA_BUG(!f);
AA_BUG(!label);
- if (!ns)
- ns = labels_ns(label);
-
- if (!use_label_hname(ns, label)) {
+ if (!use_label_hname(ns, label, flags)) {
char *str;
int len;
@@ -1764,10 +1766,7 @@ void aa_label_xprintk(struct aa_ns *ns, struct aa_label *label, int flags,
{
AA_BUG(!label);
- if (!ns)
- ns = labels_ns(label);
-
- if (!use_label_hname(ns, label)) {
+ if (!use_label_hname(ns, label, flags)) {
char *str;
int len;
@@ -1874,6 +1873,9 @@ struct aa_label *aa_label_parse(struct aa_label *base, const char *str,
if (*str == '&')
str++;
}
+ if (*str == '=')
+ base = &root_ns->unconfined->label;
+
error = vec_setup(profile, vec, len, gfp);
if (error)
return ERR_PTR(error);
diff --git a/security/apparmor/lib.c b/security/apparmor/lib.c
index 08ca26bcca77..8818621b5d95 100644
--- a/security/apparmor/lib.c
+++ b/security/apparmor/lib.c
@@ -211,7 +211,8 @@ void aa_perm_mask_to_str(char *str, const char *chrs, u32 mask)
*str = '\0';
}
-void aa_audit_perm_names(struct audit_buffer *ab, const char **names, u32 mask)
+void aa_audit_perm_names(struct audit_buffer *ab, const char * const *names,
+ u32 mask)
{
const char *fmt = "%s";
unsigned int i, perm = 1;
@@ -229,7 +230,7 @@ void aa_audit_perm_names(struct audit_buffer *ab, const char **names, u32 mask)
}
void aa_audit_perm_mask(struct audit_buffer *ab, u32 mask, const char *chrs,
- u32 chrsmask, const char **names, u32 namesmask)
+ u32 chrsmask, const char * const *names, u32 namesmask)
{
char str[33];
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 7a82c0f61452..72b915dfcaf7 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -33,11 +33,13 @@
#include "include/context.h"
#include "include/file.h"
#include "include/ipc.h"
+#include "include/net.h"
#include "include/path.h"
#include "include/label.h"
#include "include/policy.h"
#include "include/policy_ns.h"
#include "include/procattr.h"
+#include "include/mount.h"
/* Flag indicating whether initialization completed */
int apparmor_initialized;
@@ -511,6 +513,65 @@ static int apparmor_file_mprotect(struct vm_area_struct *vma,
!(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0);
}
+static int apparmor_sb_mount(const char *dev_name, const struct path *path,
+ const char *type, unsigned long flags, void *data)
+{
+ struct aa_label *label;
+ int error = 0;
+
+ /* Discard magic */
+ if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+ flags &= ~MS_MGC_MSK;
+
+ flags &= ~AA_MS_IGNORE_MASK;
+
+ label = __begin_current_label_crit_section();
+ if (!unconfined(label)) {
+ if (flags & MS_REMOUNT)
+ error = aa_remount(label, path, flags, data);
+ else if (flags & MS_BIND)
+ error = aa_bind_mount(label, path, dev_name, flags);
+ else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE |
+ MS_UNBINDABLE))
+ error = aa_mount_change_type(label, path, flags);
+ else if (flags & MS_MOVE)
+ error = aa_move_mount(label, path, dev_name);
+ else
+ error = aa_new_mount(label, dev_name, path, type,
+ flags, data);
+ }
+ __end_current_label_crit_section(label);
+
+ return error;
+}
+
+static int apparmor_sb_umount(struct vfsmount *mnt, int flags)
+{
+ struct aa_label *label;
+ int error = 0;
+
+ label = __begin_current_label_crit_section();
+ if (!unconfined(label))
+ error = aa_umount(label, mnt, flags);
+ __end_current_label_crit_section(label);
+
+ return error;
+}
+
+static int apparmor_sb_pivotroot(const struct path *old_path,
+ const struct path *new_path)
+{
+ struct aa_label *label;
+ int error = 0;
+
+ label = aa_get_current_label();
+ if (!unconfined(label))
+ error = aa_pivotroot(label, old_path, new_path);
+ aa_put_label(label);
+
+ return error;
+}
+
static int apparmor_getprocattr(struct task_struct *task, char *name,
char **value)
{
@@ -656,12 +717,398 @@ static int apparmor_task_setrlimit(struct task_struct *task,
return error;
}
+static int apparmor_task_kill(struct task_struct *target, struct siginfo *info,
+ int sig, u32 secid)
+{
+ struct aa_label *cl, *tl;
+ int error;
+
+ if (secid)
+ /* TODO: after secid to label mapping is done.
+ * Dealing with USB IO specific behavior
+ */
+ return 0;
+ cl = __begin_current_label_crit_section();
+ tl = aa_get_task_label(target);
+ error = aa_may_signal(cl, tl, sig);
+ aa_put_label(tl);
+ __end_current_label_crit_section(cl);
+
+ return error;
+}
+
+/**
+ * apparmor_sk_alloc_security - allocate and attach the sk_security field
+ */
+static int apparmor_sk_alloc_security(struct sock *sk, int family, gfp_t flags)
+{
+ struct aa_sk_ctx *ctx;
+
+ ctx = kzalloc(sizeof(*ctx), flags);
+ if (!ctx)
+ return -ENOMEM;
+
+ SK_CTX(sk) = ctx;
+
+ return 0;
+}
+
+/**
+ * apparmor_sk_free_security - free the sk_security field
+ */
+static void apparmor_sk_free_security(struct sock *sk)
+{
+ struct aa_sk_ctx *ctx = SK_CTX(sk);
+
+ SK_CTX(sk) = NULL;
+ aa_put_label(ctx->label);
+ aa_put_label(ctx->peer);
+ path_put(&ctx->path);
+ kfree(ctx);
+}
+
+/**
+ * apparmor_clone_security - clone the sk_security field
+ */
+static void apparmor_sk_clone_security(const struct sock *sk,
+ struct sock *newsk)
+{
+ struct aa_sk_ctx *ctx = SK_CTX(sk);
+ struct aa_sk_ctx *new = SK_CTX(newsk);
+
+ new->label = aa_get_label(ctx->label);
+ new->peer = aa_get_label(ctx->peer);
+ new->path = ctx->path;
+ path_get(&new->path);
+}
+
+static int aa_sock_create_perm(struct aa_label *label, int family, int type,
+ int protocol)
+{
+ AA_BUG(!label);
+ AA_BUG(in_interrupt());
+
+ return aa_af_perm(label, OP_CREATE, AA_MAY_CREATE, family, type,
+ protocol);
+}
+
+
+/**
+ * apparmor_socket_create - check perms before creating a new socket
+ */
+static int apparmor_socket_create(int family, int type, int protocol, int kern)
+{
+ struct aa_label *label;
+ int error = 0;
+
+ label = begin_current_label_crit_section();
+ if (!(kern || unconfined(label)))
+ error = aa_sock_create_perm(label, family, type, protocol);
+ end_current_label_crit_section(label);
+
+ return error;
+}
+
+/**
+ * apparmor_socket_post_create - setup the per-socket security struct
+ *
+ * Note:
+ * - kernel sockets currently labeled unconfined but we may want to
+ * move to a special kernel label
+ * - socket may not have sk here if created with sock_create_lite or
+ * sock_alloc. These should be accept cases which will be handled in
+ * sock_graft.
+ */
+static int apparmor_socket_post_create(struct socket *sock, int family,
+ int type, int protocol, int kern)
+{
+ struct aa_label *label;
+
+ if (kern) {
+ struct aa_ns *ns = aa_get_current_ns();
+
+ label = aa_get_label(ns_unconfined(ns));
+ aa_put_ns(ns);
+ } else
+ label = aa_get_current_label();
+
+ if (sock->sk) {
+ struct aa_sk_ctx *ctx = SK_CTX(sock->sk);
+
+ aa_put_label(ctx->label);
+ ctx->label = aa_get_label(label);
+ }
+ aa_put_label(label);
+
+ return 0;
+}
+
+/**
+ * apparmor_socket_bind - check perms before bind addr to socket
+ */
+static int apparmor_socket_bind(struct socket *sock,
+ struct sockaddr *address, int addrlen)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(!address);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(OP_BIND, AA_MAY_BIND, sock->sk);
+}
+
+/**
+ * apparmor_socket_connect - check perms before connecting @sock to @address
+ */
+static int apparmor_socket_connect(struct socket *sock,
+ struct sockaddr *address, int addrlen)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(!address);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(OP_CONNECT, AA_MAY_CONNECT, sock->sk);
+}
+
+/**
+ * apparmor_socket_list - check perms before allowing listen
+ */
+static int apparmor_socket_listen(struct socket *sock, int backlog)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(OP_LISTEN, AA_MAY_LISTEN, sock->sk);
+}
+
+/**
+ * apparmor_socket_accept - check perms before accepting a new connection.
+ *
+ * Note: while @newsock is created and has some information, the accept
+ * has not been done.
+ */
+static int apparmor_socket_accept(struct socket *sock, struct socket *newsock)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(!newsock);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(OP_ACCEPT, AA_MAY_ACCEPT, sock->sk);
+}
+
+static int aa_sock_msg_perm(const char *op, u32 request, struct socket *sock,
+ struct msghdr *msg, int size)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(!msg);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(op, request, sock->sk);
+}
+
+/**
+ * apparmor_socket_sendmsg - check perms before sending msg to another socket
+ */
+static int apparmor_socket_sendmsg(struct socket *sock,
+ struct msghdr *msg, int size)
+{
+ return aa_sock_msg_perm(OP_SENDMSG, AA_MAY_SEND, sock, msg, size);
+}
+
+/**
+ * apparmor_socket_recvmsg - check perms before receiving a message
+ */
+static int apparmor_socket_recvmsg(struct socket *sock,
+ struct msghdr *msg, int size, int flags)
+{
+ return aa_sock_msg_perm(OP_RECVMSG, AA_MAY_RECEIVE, sock, msg, size);
+}
+
+/* revaliation, get/set attr, shutdown */
+static int aa_sock_perm(const char *op, u32 request, struct socket *sock)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(op, request, sock->sk);
+}
+
+/**
+ * apparmor_socket_getsockname - check perms before getting the local address
+ */
+static int apparmor_socket_getsockname(struct socket *sock)
+{
+ return aa_sock_perm(OP_GETSOCKNAME, AA_MAY_GETATTR, sock);
+}
+
+/**
+ * apparmor_socket_getpeername - check perms before getting remote address
+ */
+static int apparmor_socket_getpeername(struct socket *sock)
+{
+ return aa_sock_perm(OP_GETPEERNAME, AA_MAY_GETATTR, sock);
+}
+
+/* revaliation, get/set attr, opt */
+static int aa_sock_opt_perm(const char *op, u32 request, struct socket *sock,
+ int level, int optname)
+{
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+ AA_BUG(in_interrupt());
+
+ return aa_sk_perm(op, request, sock->sk);
+}
+
+/**
+ * apparmor_getsockopt - check perms before getting socket options
+ */
+static int apparmor_socket_getsockopt(struct socket *sock, int level,
+ int optname)
+{
+ return aa_sock_opt_perm(OP_GETSOCKOPT, AA_MAY_GETOPT, sock,
+ level, optname);
+}
+
+/**
+ * apparmor_setsockopt - check perms before setting socket options
+ */
+static int apparmor_socket_setsockopt(struct socket *sock, int level,
+ int optname)
+{
+ return aa_sock_opt_perm(OP_SETSOCKOPT, AA_MAY_SETOPT, sock,
+ level, optname);
+}
+
+/**
+ * apparmor_socket_shutdown - check perms before shutting down @sock conn
+ */
+static int apparmor_socket_shutdown(struct socket *sock, int how)
+{
+ return aa_sock_perm(OP_SHUTDOWN, AA_MAY_SHUTDOWN, sock);
+}
+
+/**
+ * apparmor_socket_sock_recv_skb - check perms before associating skb to sk
+ *
+ * Note: can not sleep may be called with locks held
+ *
+ * dont want protocol specific in __skb_recv_datagram()
+ * to deny an incoming connection socket_sock_rcv_skb()
+ */
+static int apparmor_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
+{
+ return 0;
+}
+
+
+static struct aa_label *sk_peer_label(struct sock *sk)
+{
+ struct aa_sk_ctx *ctx = SK_CTX(sk);
+
+ if (ctx->peer)
+ return ctx->peer;
+
+ return ERR_PTR(-ENOPROTOOPT);
+}
+
+/**
+ * apparmor_socket_getpeersec_stream - get security context of peer
+ *
+ * Note: for tcp only valid if using ipsec or cipso on lan
+ */
+static int apparmor_socket_getpeersec_stream(struct socket *sock,
+ char __user *optval,
+ int __user *optlen,
+ unsigned int len)
+{
+ char *name;
+ int slen, error = 0;
+ struct aa_label *label;
+ struct aa_label *peer;
+
+ label = begin_current_label_crit_section();
+ peer = sk_peer_label(sock->sk);
+ if (IS_ERR(peer)) {
+ error = PTR_ERR(peer);
+ goto done;
+ }
+ slen = aa_label_asxprint(&name, labels_ns(label), peer,
+ FLAG_SHOW_MODE | FLAG_VIEW_SUBNS |
+ FLAG_HIDDEN_UNCONFINED, GFP_KERNEL);
+ /* don't include terminating \0 in slen, it breaks some apps */
+ if (slen < 0) {
+ error = -ENOMEM;
+ } else {
+ if (slen > len) {
+ error = -ERANGE;
+ } else if (copy_to_user(optval, name, slen)) {
+ error = -EFAULT;
+ goto out;
+ }
+ if (put_user(slen, optlen))
+ error = -EFAULT;
+out:
+ kfree(name);
+
+ }
+
+done:
+ end_current_label_crit_section(label);
+
+ return error;
+}
+
+/**
+ * apparmor_socket_getpeersec_dgram - get security label of packet
+ * @sock: the peer socket
+ * @skb: packet data
+ * @secid: pointer to where to put the secid of the packet
+ *
+ * Sets the netlabel socket state on sk from parent
+ */
+static int apparmor_socket_getpeersec_dgram(struct socket *sock,
+ struct sk_buff *skb, u32 *secid)
+
+{
+ /* TODO: requires secid support */
+ return -ENOPROTOOPT;
+}
+
+/**
+ * apparmor_sock_graft - Initialize newly created socket
+ * @sk: child sock
+ * @parent: parent socket
+ *
+ * Note: could set off of SOCK_CTX(parent) but need to track inode and we can
+ * just set sk security information off of current creating process label
+ * Labeling of sk for accept case - probably should be sock based
+ * instead of task, because of the case where an implicitly labeled
+ * socket is shared by different tasks.
+ */
+static void apparmor_sock_graft(struct sock *sk, struct socket *parent)
+{
+ struct aa_sk_ctx *ctx = SK_CTX(sk);
+
+ if (!ctx->label)
+ ctx->label = aa_get_current_label();
+}
+
static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check),
LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme),
LSM_HOOK_INIT(capget, apparmor_capget),
LSM_HOOK_INIT(capable, apparmor_capable),
+ LSM_HOOK_INIT(sb_mount, apparmor_sb_mount),
+ LSM_HOOK_INIT(sb_umount, apparmor_sb_umount),
+ LSM_HOOK_INIT(sb_pivotroot, apparmor_sb_pivotroot),
+
LSM_HOOK_INIT(path_link, apparmor_path_link),
LSM_HOOK_INIT(path_unlink, apparmor_path_unlink),
LSM_HOOK_INIT(path_symlink, apparmor_path_symlink),
@@ -686,6 +1133,30 @@ static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(getprocattr, apparmor_getprocattr),
LSM_HOOK_INIT(setprocattr, apparmor_setprocattr),
+ LSM_HOOK_INIT(sk_alloc_security, apparmor_sk_alloc_security),
+ LSM_HOOK_INIT(sk_free_security, apparmor_sk_free_security),
+ LSM_HOOK_INIT(sk_clone_security, apparmor_sk_clone_security),
+
+ LSM_HOOK_INIT(socket_create, apparmor_socket_create),
+ LSM_HOOK_INIT(socket_post_create, apparmor_socket_post_create),
+ LSM_HOOK_INIT(socket_bind, apparmor_socket_bind),
+ LSM_HOOK_INIT(socket_connect, apparmor_socket_connect),
+ LSM_HOOK_INIT(socket_listen, apparmor_socket_listen),
+ LSM_HOOK_INIT(socket_accept, apparmor_socket_accept),
+ LSM_HOOK_INIT(socket_sendmsg, apparmor_socket_sendmsg),
+ LSM_HOOK_INIT(socket_recvmsg, apparmor_socket_recvmsg),
+ LSM_HOOK_INIT(socket_getsockname, apparmor_socket_getsockname),
+ LSM_HOOK_INIT(socket_getpeername, apparmor_socket_getpeername),
+ LSM_HOOK_INIT(socket_getsockopt, apparmor_socket_getsockopt),
+ LSM_HOOK_INIT(socket_setsockopt, apparmor_socket_setsockopt),
+ LSM_HOOK_INIT(socket_shutdown, apparmor_socket_shutdown),
+ LSM_HOOK_INIT(socket_sock_rcv_skb, apparmor_socket_sock_rcv_skb),
+ LSM_HOOK_INIT(socket_getpeersec_stream,
+ apparmor_socket_getpeersec_stream),
+ LSM_HOOK_INIT(socket_getpeersec_dgram,
+ apparmor_socket_getpeersec_dgram),
+ LSM_HOOK_INIT(sock_graft, apparmor_sock_graft),
+
LSM_HOOK_INIT(cred_alloc_blank, apparmor_cred_alloc_blank),
LSM_HOOK_INIT(cred_free, apparmor_cred_free),
LSM_HOOK_INIT(cred_prepare, apparmor_cred_prepare),
@@ -696,6 +1167,7 @@ static struct security_hook_list apparmor_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(bprm_committed_creds, apparmor_bprm_committed_creds),
LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit),
+ LSM_HOOK_INIT(task_kill, apparmor_task_kill),
};
/*
diff --git a/security/apparmor/mount.c b/security/apparmor/mount.c
new file mode 100644
index 000000000000..82a64b58041d
--- /dev/null
+++ b/security/apparmor/mount.c
@@ -0,0 +1,696 @@
+/*
+ * AppArmor security module
+ *
+ * This file contains AppArmor mediation of files
+ *
+ * Copyright (C) 1998-2008 Novell/SUSE
+ * Copyright 2009-2017 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ */
+
+#include <linux/fs.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+
+#include "include/apparmor.h"
+#include "include/audit.h"
+#include "include/context.h"
+#include "include/domain.h"
+#include "include/file.h"
+#include "include/match.h"
+#include "include/mount.h"
+#include "include/path.h"
+#include "include/policy.h"
+
+
+static void audit_mnt_flags(struct audit_buffer *ab, unsigned long flags)
+{
+ if (flags & MS_RDONLY)
+ audit_log_format(ab, "ro");
+ else
+ audit_log_format(ab, "rw");
+ if (flags & MS_NOSUID)
+ audit_log_format(ab, ", nosuid");
+ if (flags & MS_NODEV)
+ audit_log_format(ab, ", nodev");
+ if (flags & MS_NOEXEC)
+ audit_log_format(ab, ", noexec");
+ if (flags & MS_SYNCHRONOUS)
+ audit_log_format(ab, ", sync");
+ if (flags & MS_REMOUNT)
+ audit_log_format(ab, ", remount");
+ if (flags & MS_MANDLOCK)
+ audit_log_format(ab, ", mand");
+ if (flags & MS_DIRSYNC)
+ audit_log_format(ab, ", dirsync");
+ if (flags & MS_NOATIME)
+ audit_log_format(ab, ", noatime");
+ if (flags & MS_NODIRATIME)
+ audit_log_format(ab, ", nodiratime");
+ if (flags & MS_BIND)
+ audit_log_format(ab, flags & MS_REC ? ", rbind" : ", bind");
+ if (flags & MS_MOVE)
+ audit_log_format(ab, ", move");
+ if (flags & MS_SILENT)
+ audit_log_format(ab, ", silent");
+ if (flags & MS_POSIXACL)
+ audit_log_format(ab, ", acl");
+ if (flags & MS_UNBINDABLE)
+ audit_log_format(ab, flags & MS_REC ? ", runbindable" :
+ ", unbindable");
+ if (flags & MS_PRIVATE)
+ audit_log_format(ab, flags & MS_REC ? ", rprivate" :
+ ", private");
+ if (flags & MS_SLAVE)
+ audit_log_format(ab, flags & MS_REC ? ", rslave" :
+ ", slave");
+ if (flags & MS_SHARED)
+ audit_log_format(ab, flags & MS_REC ? ", rshared" :
+ ", shared");
+ if (flags & MS_RELATIME)
+ audit_log_format(ab, ", relatime");
+ if (flags & MS_I_VERSION)
+ audit_log_format(ab, ", iversion");
+ if (flags & MS_STRICTATIME)
+ audit_log_format(ab, ", strictatime");
+ if (flags & MS_NOUSER)
+ audit_log_format(ab, ", nouser");
+}
+
+/**
+ * audit_cb - call back for mount specific audit fields
+ * @ab: audit_buffer (NOT NULL)
+ * @va: audit struct to audit values of (NOT NULL)
+ */
+static void audit_cb(struct audit_buffer *ab, void *va)
+{
+ struct common_audit_data *sa = va;
+
+ if (aad(sa)->mnt.type) {
+ audit_log_format(ab, " fstype=");
+ audit_log_untrustedstring(ab, aad(sa)->mnt.type);
+ }
+ if (aad(sa)->mnt.src_name) {
+ audit_log_format(ab, " srcname=");
+ audit_log_untrustedstring(ab, aad(sa)->mnt.src_name);
+ }
+ if (aad(sa)->mnt.trans) {
+ audit_log_format(ab, " trans=");
+ audit_log_untrustedstring(ab, aad(sa)->mnt.trans);
+ }
+ if (aad(sa)->mnt.flags) {
+ audit_log_format(ab, " flags=\"");
+ audit_mnt_flags(ab, aad(sa)->mnt.flags);
+ audit_log_format(ab, "\"");
+ }
+ if (aad(sa)->mnt.data) {
+ audit_log_format(ab, " options=");
+ audit_log_untrustedstring(ab, aad(sa)->mnt.data);
+ }
+}
+
+/**
+ * audit_mount - handle the auditing of mount operations
+ * @profile: the profile being enforced (NOT NULL)
+ * @op: operation being mediated (NOT NULL)
+ * @name: name of object being mediated (MAYBE NULL)
+ * @src_name: src_name of object being mediated (MAYBE_NULL)
+ * @type: type of filesystem (MAYBE_NULL)
+ * @trans: name of trans (MAYBE NULL)
+ * @flags: filesystem idependent mount flags
+ * @data: filesystem mount flags
+ * @request: permissions requested
+ * @perms: the permissions computed for the request (NOT NULL)
+ * @info: extra information message (MAYBE NULL)
+ * @error: 0 if operation allowed else failure error code
+ *
+ * Returns: %0 or error on failure
+ */
+static int audit_mount(struct aa_profile *profile, const char *op,
+ const char *name, const char *src_name,
+ const char *type, const char *trans,
+ unsigned long flags, const void *data, u32 request,
+ struct aa_perms *perms, const char *info, int error)
+{
+ int audit_type = AUDIT_APPARMOR_AUTO;
+ DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, op);
+
+ if (likely(!error)) {
+ u32 mask = perms->audit;
+
+ if (unlikely(AUDIT_MODE(profile) == AUDIT_ALL))
+ mask = 0xffff;
+
+ /* mask off perms that are not being force audited */
+ request &= mask;
+
+ if (likely(!request))
+ return 0;
+ audit_type = AUDIT_APPARMOR_AUDIT;
+ } else {
+ /* only report permissions that were denied */
+ request = request & ~perms->allow;
+
+ if (request & perms->kill)
+ audit_type = AUDIT_APPARMOR_KILL;
+
+ /* quiet known rejects, assumes quiet and kill do not overlap */
+ if ((request & perms->quiet) &&
+ AUDIT_MODE(profile) != AUDIT_NOQUIET &&
+ AUDIT_MODE(profile) != AUDIT_ALL)
+ request &= ~perms->quiet;
+
+ if (!request)
+ return error;
+ }
+
+ aad(&sa)->name = name;
+ aad(&sa)->mnt.src_name = src_name;
+ aad(&sa)->mnt.type = type;
+ aad(&sa)->mnt.trans = trans;
+ aad(&sa)->mnt.flags = flags;
+ if (data && (perms->audit & AA_AUDIT_DATA))
+ aad(&sa)->mnt.data = data;
+ aad(&sa)->info = info;
+ aad(&sa)->error = error;
+
+ return aa_audit(audit_type, profile, &sa, audit_cb);
+}
+
+/**
+ * match_mnt_flags - Do an ordered match on mount flags
+ * @dfa: dfa to match against
+ * @state: state to start in
+ * @flags: mount flags to match against
+ *
+ * Mount flags are encoded as an ordered match. This is done instead of
+ * checking against a simple bitmask, to allow for logical operations
+ * on the flags.
+ *
+ * Returns: next state after flags match
+ */
+static unsigned int match_mnt_flags(struct aa_dfa *dfa, unsigned int state,
+ unsigned long flags)
+{
+ unsigned int i;
+
+ for (i = 0; i <= 31 ; ++i) {
+ if ((1 << i) & flags)
+ state = aa_dfa_next(dfa, state, i + 1);
+ }
+
+ return state;
+}
+
+/**
+ * compute_mnt_perms - compute mount permission associated with @state
+ * @dfa: dfa to match against (NOT NULL)
+ * @state: state match finished in
+ *
+ * Returns: mount permissions
+ */
+static struct aa_perms compute_mnt_perms(struct aa_dfa *dfa,
+ unsigned int state)
+{
+ struct aa_perms perms;
+
+ perms.kill = 0;
+ perms.allow = dfa_user_allow(dfa, state);
+ perms.audit = dfa_user_audit(dfa, state);
+ perms.quiet = dfa_user_quiet(dfa, state);
+ perms.xindex = dfa_user_xindex(dfa, state);
+
+ return perms;
+}
+
+static const char * const mnt_info_table[] = {
+ "match succeeded",
+ "failed mntpnt match",
+ "failed srcname match",
+ "failed type match",
+ "failed flags match",
+ "failed data match"
+};
+
+/*
+ * Returns 0 on success else element that match failed in, this is the
+ * index into the mnt_info_table above
+ */
+static int do_match_mnt(struct aa_dfa *dfa, unsigned int start,
+ const char *mntpnt, const char *devname,
+ const char *type, unsigned long flags,
+ void *data, bool binary, struct aa_perms *perms)
+{
+ unsigned int state;
+
+ AA_BUG(!dfa);
+ AA_BUG(!perms);
+
+ state = aa_dfa_match(dfa, start, mntpnt);
+ state = aa_dfa_null_transition(dfa, state);
+ if (!state)
+ return 1;
+
+ if (devname)
+ state = aa_dfa_match(dfa, state, devname);
+ state = aa_dfa_null_transition(dfa, state);
+ if (!state)
+ return 2;
+
+ if (type)
+ state = aa_dfa_match(dfa, state, type);
+ state = aa_dfa_null_transition(dfa, state);
+ if (!state)
+ return 3;
+
+ state = match_mnt_flags(dfa, state, flags);
+ if (!state)
+ return 4;
+ *perms = compute_mnt_perms(dfa, state);
+ if (perms->allow & AA_MAY_MOUNT)
+ return 0;
+
+ /* only match data if not binary and the DFA flags data is expected */
+ if (data && !binary && (perms->allow & AA_MNT_CONT_MATCH)) {
+ state = aa_dfa_null_transition(dfa, state);
+ if (!state)
+ return 4;
+
+ state = aa_dfa_match(dfa, state, data);
+ if (!state)
+ return 5;
+ *perms = compute_mnt_perms(dfa, state);
+ if (perms->allow & AA_MAY_MOUNT)
+ return 0;
+ }
+
+ /* failed at end of flags match */
+ return 4;
+}
+
+
+static int path_flags(struct aa_profile *profile, const struct path *path)
+{
+ AA_BUG(!profile);
+ AA_BUG(!path);
+
+ return profile->path_flags |
+ (S_ISDIR(path->dentry->d_inode->i_mode) ? PATH_IS_DIR : 0);
+}
+
+/**
+ * match_mnt_path_str - handle path matching for mount
+ * @profile: the confining profile
+ * @mntpath: for the mntpnt (NOT NULL)
+ * @buffer: buffer to be used to lookup mntpath
+ * @devnme: string for the devname/src_name (MAY BE NULL OR ERRPTR)
+ * @type: string for the dev type (MAYBE NULL)
+ * @flags: mount flags to match
+ * @data: fs mount data (MAYBE NULL)
+ * @binary: whether @data is binary
+ * @devinfo: error str if (IS_ERR(@devname))
+ *
+ * Returns: 0 on success else error
+ */
+static int match_mnt_path_str(struct aa_profile *profile,
+ const struct path *mntpath, char *buffer,
+ const char *devname, const char *type,
+ unsigned long flags, void *data, bool binary,
+ const char *devinfo)
+{
+ struct aa_perms perms = { };
+ const char *mntpnt = NULL, *info = NULL;
+ int pos, error;
+
+ AA_BUG(!profile);
+ AA_BUG(!mntpath);
+ AA_BUG(!buffer);
+
+ error = aa_path_name(mntpath, path_flags(profile, mntpath), buffer,
+ &mntpnt, &info, profile->disconnected);
+ if (error)
+ goto audit;
+ if (IS_ERR(devname)) {
+ error = PTR_ERR(devname);
+ devname = NULL;
+ info = devinfo;
+ goto audit;
+ }
+
+ error = -EACCES;
+ pos = do_match_mnt(profile->policy.dfa,
+ profile->policy.start[AA_CLASS_MOUNT],
+ mntpnt, devname, type, flags, data, binary, &perms);
+ if (pos) {
+ info = mnt_info_table[pos];
+ goto audit;
+ }
+ error = 0;
+
+audit:
+ return audit_mount(profile, OP_MOUNT, mntpnt, devname, type, NULL,
+ flags, data, AA_MAY_MOUNT, &perms, info, error);
+}
+
+/**
+ * match_mnt - handle path matching for mount
+ * @profile: the confining profile
+ * @mntpath: for the mntpnt (NOT NULL)
+ * @buffer: buffer to be used to lookup mntpath
+ * @devpath: path devname/src_name (MAYBE NULL)
+ * @devbuffer: buffer to be used to lookup devname/src_name
+ * @type: string for the dev type (MAYBE NULL)
+ * @flags: mount flags to match
+ * @data: fs mount data (MAYBE NULL)
+ * @binary: whether @data is binary
+ *
+ * Returns: 0 on success else error
+ */
+static int match_mnt(struct aa_profile *profile, const struct path *path,
+ char *buffer, struct path *devpath, char *devbuffer,
+ const char *type, unsigned long flags, void *data,
+ bool binary)
+{
+ const char *devname = NULL, *info = NULL;
+ int error = -EACCES;
+
+ AA_BUG(!profile);
+ AA_BUG(devpath && !devbuffer);
+
+ if (devpath) {
+ error = aa_path_name(devpath, path_flags(profile, devpath),
+ devbuffer, &devname, &info,
+ profile->disconnected);
+ if (error)
+ devname = ERR_PTR(error);
+ }
+
+ return match_mnt_path_str(profile, path, buffer, devname, type, flags,
+ data, binary, info);
+}
+
+int aa_remount(struct aa_label *label, const struct path *path,
+ unsigned long flags, void *data)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL;
+ bool binary;
+ int error;
+
+ AA_BUG(!label);
+ AA_BUG(!path);
+
+ binary = path->dentry->d_sb->s_type->fs_flags & FS_BINARY_MOUNTDATA;
+
+ get_buffers(buffer);
+ error = fn_for_each_confined(label, profile,
+ match_mnt(profile, path, buffer, NULL, NULL, NULL,
+ flags, data, binary));
+ put_buffers(buffer);
+
+ return error;
+}
+
+int aa_bind_mount(struct aa_label *label, const struct path *path,
+ const char *dev_name, unsigned long flags)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL, *old_buffer = NULL;
+ struct path old_path;
+ int error;
+
+ AA_BUG(!label);
+ AA_BUG(!path);
+
+ if (!dev_name || !*dev_name)
+ return -EINVAL;
+
+ flags &= MS_REC | MS_BIND;
+
+ error = kern_path(dev_name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &old_path);
+ if (error)
+ return error;
+
+ get_buffers(buffer, old_buffer);
+ error = fn_for_each_confined(label, profile,
+ match_mnt(profile, path, buffer, &old_path, old_buffer,
+ NULL, flags, NULL, false));
+ put_buffers(buffer, old_buffer);
+ path_put(&old_path);
+
+ return error;
+}
+
+int aa_mount_change_type(struct aa_label *label, const struct path *path,
+ unsigned long flags)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL;
+ int error;
+
+ AA_BUG(!label);
+ AA_BUG(!path);
+
+ /* These are the flags allowed by do_change_type() */
+ flags &= (MS_REC | MS_SILENT | MS_SHARED | MS_PRIVATE | MS_SLAVE |
+ MS_UNBINDABLE);
+
+ get_buffers(buffer);
+ error = fn_for_each_confined(label, profile,
+ match_mnt(profile, path, buffer, NULL, NULL, NULL,
+ flags, NULL, false));
+ put_buffers(buffer);
+
+ return error;
+}
+
+int aa_move_mount(struct aa_label *label, const struct path *path,
+ const char *orig_name)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL, *old_buffer = NULL;
+ struct path old_path;
+ int error;
+
+ AA_BUG(!label);
+ AA_BUG(!path);
+
+ if (!orig_name || !*orig_name)
+ return -EINVAL;
+
+ error = kern_path(orig_name, LOOKUP_FOLLOW, &old_path);
+ if (error)
+ return error;
+
+ get_buffers(buffer, old_buffer);
+ error = fn_for_each_confined(label, profile,
+ match_mnt(profile, path, buffer, &old_path, old_buffer,
+ NULL, MS_MOVE, NULL, false));
+ put_buffers(buffer, old_buffer);
+ path_put(&old_path);
+
+ return error;
+}
+
+int aa_new_mount(struct aa_label *label, const char *dev_name,
+ const struct path *path, const char *type, unsigned long flags,
+ void *data)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL, *dev_buffer = NULL;
+ bool binary = true;
+ int error;
+ int requires_dev = 0;
+ struct path tmp_path, *dev_path = NULL;
+
+ AA_BUG(!label);
+ AA_BUG(!path);
+
+ if (type) {
+ struct file_system_type *fstype;
+
+ fstype = get_fs_type(type);
+ if (!fstype)
+ return -ENODEV;
+ binary = fstype->fs_flags & FS_BINARY_MOUNTDATA;
+ requires_dev = fstype->fs_flags & FS_REQUIRES_DEV;
+ put_filesystem(fstype);
+
+ if (requires_dev) {
+ if (!dev_name || !*dev_name)
+ return -ENOENT;
+
+ error = kern_path(dev_name, LOOKUP_FOLLOW, &tmp_path);
+ if (error)
+ return error;
+ dev_path = &tmp_path;
+ }
+ }
+
+ get_buffers(buffer, dev_buffer);
+ if (dev_path) {
+ error = fn_for_each_confined(label, profile,
+ match_mnt(profile, path, buffer, dev_path, dev_buffer,
+ type, flags, data, binary));
+ } else {
+ error = fn_for_each_confined(label, profile,
+ match_mnt_path_str(profile, path, buffer, dev_name,
+ type, flags, data, binary, NULL));
+ }
+ put_buffers(buffer, dev_buffer);
+ if (dev_path)
+ path_put(dev_path);
+
+ return error;
+}
+
+static int profile_umount(struct aa_profile *profile, struct path *path,
+ char *buffer)
+{
+ struct aa_perms perms = { };
+ const char *name = NULL, *info = NULL;
+ unsigned int state;
+ int error;
+
+ AA_BUG(!profile);
+ AA_BUG(!path);
+
+ error = aa_path_name(path, path_flags(profile, path), buffer, &name,
+ &info, profile->disconnected);
+ if (error)
+ goto audit;
+
+ state = aa_dfa_match(profile->policy.dfa,
+ profile->policy.start[AA_CLASS_MOUNT],
+ name);
+ perms = compute_mnt_perms(profile->policy.dfa, state);
+ if (AA_MAY_UMOUNT & ~perms.allow)
+ error = -EACCES;
+
+audit:
+ return audit_mount(profile, OP_UMOUNT, name, NULL, NULL, NULL, 0, NULL,
+ AA_MAY_UMOUNT, &perms, info, error);
+}
+
+int aa_umount(struct aa_label *label, struct vfsmount *mnt, int flags)
+{
+ struct aa_profile *profile;
+ char *buffer = NULL;
+ int error;
+ struct path path = { .mnt = mnt, .dentry = mnt->mnt_root };
+
+ AA_BUG(!label);
+ AA_BUG(!mnt);
+
+ get_buffers(buffer);
+ error = fn_for_each_confined(label, profile,
+ profile_umount(profile, &path, buffer));
+ put_buffers(buffer);
+
+ return error;
+}
+
+/* helper fn for transition on pivotroot
+ *
+ * Returns: label for transition or ERR_PTR. Does not return NULL
+ */
+static struct aa_label *build_pivotroot(struct aa_profile *profile,
+ const struct path *new_path,
+ char *new_buffer,
+ const struct path *old_path,
+ char *old_buffer)
+{
+ const char *old_name, *new_name = NULL, *info = NULL;
+ const char *trans_name = NULL;
+ struct aa_perms perms = { };
+ unsigned int state;
+ int error;
+
+ AA_BUG(!profile);
+ AA_BUG(!new_path);
+ AA_BUG(!old_path);
+
+ if (profile_unconfined(profile))
+ return aa_get_newest_label(&profile->label);
+
+ error = aa_path_name(old_path, path_flags(profile, old_path),
+ old_buffer, &old_name, &info,
+ profile->disconnected);
+ if (error)
+ goto audit;
+ error = aa_path_name(new_path, path_flags(profile, new_path),
+ new_buffer, &new_name, &info,
+ profile->disconnected);
+ if (error)
+ goto audit;
+
+ error = -EACCES;
+ state = aa_dfa_match(profile->policy.dfa,
+ profile->policy.start[AA_CLASS_MOUNT],
+ new_name);
+ state = aa_dfa_null_transition(profile->policy.dfa, state);
+ state = aa_dfa_match(profile->policy.dfa, state, old_name);
+ perms = compute_mnt_perms(profile->policy.dfa, state);
+
+ if (AA_MAY_PIVOTROOT & perms.allow)
+ error = 0;
+
+audit:
+ error = audit_mount(profile, OP_PIVOTROOT, new_name, old_name,
+ NULL, trans_name, 0, NULL, AA_MAY_PIVOTROOT,
+ &perms, info, error);
+ if (error)
+ return ERR_PTR(error);
+
+ return aa_get_newest_label(&profile->label);
+}
+
+int aa_pivotroot(struct aa_label *label, const struct path *old_path,
+ const struct path *new_path)
+{
+ struct aa_profile *profile;
+ struct aa_label *target = NULL;
+ char *old_buffer = NULL, *new_buffer = NULL, *info = NULL;
+ int error;
+
+ AA_BUG(!label);
+ AA_BUG(!old_path);
+ AA_BUG(!new_path);
+
+ get_buffers(old_buffer, new_buffer);
+ target = fn_label_build(label, profile, GFP_ATOMIC,
+ build_pivotroot(profile, new_path, new_buffer,
+ old_path, old_buffer));
+ if (!target) {
+ info = "label build failed";
+ error = -ENOMEM;
+ goto fail;
+ } else if (!IS_ERR(target)) {
+ error = aa_replace_current_label(target);
+ if (error) {
+ /* TODO: audit target */
+ aa_put_label(target);
+ goto out;
+ }
+ } else
+ /* already audited error */
+ error = PTR_ERR(target);
+out:
+ put_buffers(old_buffer, new_buffer);
+
+ return error;
+
+fail:
+ /* TODO: add back in auditing of new_name and old_name */
+ error = fn_for_each(label, profile,
+ audit_mount(profile, OP_PIVOTROOT, NULL /*new_name */,
+ NULL /* old_name */,
+ NULL, NULL,
+ 0, NULL, AA_MAY_PIVOTROOT, &nullperms, info,
+ error));
+ goto out;
+}
diff --git a/security/apparmor/net.c b/security/apparmor/net.c
new file mode 100644
index 000000000000..33d54435f8d6
--- /dev/null
+++ b/security/apparmor/net.c
@@ -0,0 +1,184 @@
+/*
+ * AppArmor security module
+ *
+ * This file contains AppArmor network mediation
+ *
+ * Copyright (C) 1998-2008 Novell/SUSE
+ * Copyright 2009-2017 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ */
+
+#include "include/apparmor.h"
+#include "include/audit.h"
+#include "include/context.h"
+#include "include/label.h"
+#include "include/net.h"
+#include "include/policy.h"
+
+#include "net_names.h"
+
+
+struct aa_sfs_entry aa_sfs_entry_network[] = {
+ AA_SFS_FILE_STRING("af_mask", AA_SFS_AF_MASK),
+ { }
+};
+
+static const char * const net_mask_names[] = {
+ "unknown",
+ "send",
+ "receive",
+ "unknown",
+
+ "create",
+ "shutdown",
+ "connect",
+ "unknown",
+
+ "setattr",
+ "getattr",
+ "setcred",
+ "getcred",
+
+ "chmod",
+ "chown",
+ "chgrp",
+ "lock",
+
+ "mmap",
+ "mprot",
+ "unknown",
+ "unknown",
+
+ "accept",
+ "bind",
+ "listen",
+ "unknown",
+
+ "setopt",
+ "getopt",
+ "unknown",
+ "unknown",
+
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+};
+
+
+/* audit callback for net specific fields */
+void audit_net_cb(struct audit_buffer *ab, void *va)
+{
+ struct common_audit_data *sa = va;
+
+ audit_log_format(ab, " family=");
+ if (address_family_names[sa->u.net->family])
+ audit_log_string(ab, address_family_names[sa->u.net->family]);
+ else
+ audit_log_format(ab, "\"unknown(%d)\"", sa->u.net->family);
+ audit_log_format(ab, " sock_type=");
+ if (sock_type_names[aad(sa)->net.type])
+ audit_log_string(ab, sock_type_names[aad(sa)->net.type]);
+ else
+ audit_log_format(ab, "\"unknown(%d)\"", aad(sa)->net.type);
+ audit_log_format(ab, " protocol=%d", aad(sa)->net.protocol);
+
+ if (aad(sa)->request & NET_PERMS_MASK) {
+ audit_log_format(ab, " requested_mask=");
+ aa_audit_perm_mask(ab, aad(sa)->request, NULL, 0,
+ net_mask_names, NET_PERMS_MASK);
+
+ if (aad(sa)->denied & NET_PERMS_MASK) {
+ audit_log_format(ab, " denied_mask=");
+ aa_audit_perm_mask(ab, aad(sa)->denied, NULL, 0,
+ net_mask_names, NET_PERMS_MASK);
+ }
+ }
+ if (aad(sa)->peer) {
+ audit_log_format(ab, " peer=");
+ aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer,
+ FLAGS_NONE, GFP_ATOMIC);
+ }
+}
+
+
+/* Generic af perm */
+int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa,
+ u32 request, u16 family, int type)
+{
+ struct aa_perms perms = { };
+
+ AA_BUG(family >= AF_MAX);
+ AA_BUG(type < 0 || type >= SOCK_MAX);
+
+ if (profile_unconfined(profile))
+ return 0;
+
+ perms.allow = (profile->net.allow[family] & (1 << type)) ?
+ ALL_PERMS_MASK : 0;
+ perms.audit = (profile->net.audit[family] & (1 << type)) ?
+ ALL_PERMS_MASK : 0;
+ perms.quiet = (profile->net.quiet[family] & (1 << type)) ?
+ ALL_PERMS_MASK : 0;
+ aa_apply_modes_to_perms(profile, &perms);
+
+ return aa_check_perms(profile, &perms, request, sa, audit_net_cb);
+}
+
+int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family,
+ int type, int protocol)
+{
+ struct aa_profile *profile;
+ DEFINE_AUDIT_NET(sa, op, NULL, family, type, protocol);
+
+ return fn_for_each_confined(label, profile,
+ aa_profile_af_perm(profile, &sa, request, family,
+ type));
+}
+
+static int aa_label_sk_perm(struct aa_label *label, const char *op, u32 request,
+ struct sock *sk)
+{
+ struct aa_profile *profile;
+ DEFINE_AUDIT_SK(sa, op, sk);
+
+ AA_BUG(!label);
+ AA_BUG(!sk);
+
+ if (unconfined(label))
+ return 0;
+
+ return fn_for_each_confined(label, profile,
+ aa_profile_af_sk_perm(profile, &sa, request, sk));
+}
+
+int aa_sk_perm(const char *op, u32 request, struct sock *sk)
+{
+ struct aa_label *label;
+ int error;
+
+ AA_BUG(!sk);
+ AA_BUG(in_interrupt());
+
+ /* TODO: switch to begin_current_label ???? */
+ label = begin_current_label_crit_section();
+ error = aa_label_sk_perm(label, op, request, sk);
+ end_current_label_crit_section(label);
+
+ return error;
+}
+
+
+int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request,
+ struct socket *sock)
+{
+ AA_BUG(!label);
+ AA_BUG(!sock);
+ AA_BUG(!sock->sk);
+
+ return aa_label_sk_perm(label, op, request, sock->sk);
+}
diff --git a/security/apparmor/policy.c b/security/apparmor/policy.c
index 244ea4a4a8f0..4243b0c3f0e4 100644
--- a/security/apparmor/policy.c
+++ b/security/apparmor/policy.c
@@ -289,85 +289,6 @@ fail:
return NULL;
}
-/**
- * aa_new_null_profile - create or find a null-X learning profile
- * @parent: profile that caused this profile to be created (NOT NULL)
- * @hat: true if the null- learning profile is a hat
- * @base: name to base the null profile off of
- * @gfp: type of allocation
- *
- * Find/Create a null- complain mode profile used in learning mode. The
- * name of the profile is unique and follows the format of parent//null-XXX.
- * where XXX is based on the @name or if that fails or is not supplied
- * a unique number
- *
- * null profiles are added to the profile list but the list does not
- * hold a count on them so that they are automatically released when
- * not in use.
- *
- * Returns: new refcounted profile else NULL on failure
- */
-struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
- const char *base, gfp_t gfp)
-{
- struct aa_profile *profile;
- char *name;
-
- AA_BUG(!parent);
-
- if (base) {
- name = kmalloc(strlen(parent->base.hname) + 8 + strlen(base),
- gfp);
- if (name) {
- sprintf(name, "%s//null-%s", parent->base.hname, base);
- goto name;
- }
- /* fall through to try shorter uniq */
- }
-
- name = kmalloc(strlen(parent->base.hname) + 2 + 7 + 8, gfp);
- if (!name)
- return NULL;
- sprintf(name, "%s//null-%x", parent->base.hname,
- atomic_inc_return(&parent->ns->uniq_null));
-
-name:
- /* lookup to see if this is a dup creation */
- profile = aa_find_child(parent, basename(name));
- if (profile)
- goto out;
-
- profile = aa_alloc_profile(name, NULL, gfp);
- if (!profile)
- goto fail;
-
- profile->mode = APPARMOR_COMPLAIN;
- profile->label.flags |= FLAG_NULL;
- if (hat)
- profile->label.flags |= FLAG_HAT;
- profile->path_flags = parent->path_flags;
-
- /* released on free_profile */
- rcu_assign_pointer(profile->parent, aa_get_profile(parent));
- profile->ns = aa_get_ns(parent->ns);
- profile->file.dfa = aa_get_dfa(nulldfa);
- profile->policy.dfa = aa_get_dfa(nulldfa);
-
- mutex_lock(&profile->ns->lock);
- __add_profile(&parent->base.profiles, profile);
- mutex_unlock(&profile->ns->lock);
-
- /* refcount released by caller */
-out:
- kfree(name);
-
- return profile;
-
-fail:
- aa_free_profile(profile);
- return NULL;
-}
-
/* TODO: profile accounting - setup in remove */
/**
@@ -559,6 +480,93 @@ struct aa_profile *aa_fqlookupn_profile(struct aa_label *base,
}
/**
+ * aa_new_null_profile - create or find a null-X learning profile
+ * @parent: profile that caused this profile to be created (NOT NULL)
+ * @hat: true if the null- learning profile is a hat
+ * @base: name to base the null profile off of
+ * @gfp: type of allocation
+ *
+ * Find/Create a null- complain mode profile used in learning mode. The
+ * name of the profile is unique and follows the format of parent//null-XXX.
+ * where XXX is based on the @name or if that fails or is not supplied
+ * a unique number
+ *
+ * null profiles are added to the profile list but the list does not
+ * hold a count on them so that they are automatically released when
+ * not in use.
+ *
+ * Returns: new refcounted profile else NULL on failure
+ */
+struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
+ const char *base, gfp_t gfp)
+{
+ struct aa_profile *p, *profile;
+ const char *bname;
+ char *name;
+
+ AA_BUG(!parent);
+
+ if (base) {
+ name = kmalloc(strlen(parent->base.hname) + 8 + strlen(base),
+ gfp);
+ if (name) {
+ sprintf(name, "%s//null-%s", parent->base.hname, base);
+ goto name;
+ }
+ /* fall through to try shorter uniq */
+ }
+
+ name = kmalloc(strlen(parent->base.hname) + 2 + 7 + 8, gfp);
+ if (!name)
+ return NULL;
+ sprintf(name, "%s//null-%x", parent->base.hname,
+ atomic_inc_return(&parent->ns->uniq_null));
+
+name:
+ /* lookup to see if this is a dup creation */
+ bname = basename(name);
+ profile = aa_find_child(parent, bname);
+ if (profile)
+ goto out;
+
+ profile = aa_alloc_profile(name, NULL, gfp);
+ if (!profile)
+ goto fail;
+
+ profile->mode = APPARMOR_COMPLAIN;
+ profile->label.flags |= FLAG_NULL;
+ if (hat)
+ profile->label.flags |= FLAG_HAT;
+ profile->path_flags = parent->path_flags;
+
+ /* released on free_profile */
+ rcu_assign_pointer(profile->parent, aa_get_profile(parent));
+ profile->ns = aa_get_ns(parent->ns);
+ profile->file.dfa = aa_get_dfa(nulldfa);
+ profile->policy.dfa = aa_get_dfa(nulldfa);
+
+ mutex_lock(&profile->ns->lock);
+ p = __find_child(&parent->base.profiles, bname);
+ if (p) {
+ aa_free_profile(profile);
+ profile = aa_get_profile(p);
+ } else {
+ __add_profile(&parent->base.profiles, profile);
+ }
+ mutex_unlock(&profile->ns->lock);
+
+ /* refcount released by caller */
+out:
+ kfree(name);
+
+ return profile;
+
+fail:
+ aa_free_profile(profile);
+ return NULL;
+}
+
+/**
* replacement_allowed - test to see if replacement is allowed
* @profile: profile to test if it can be replaced (MAYBE NULL)
* @noreplace: true if replacement shouldn't be allowed but addition is okay
diff --git a/security/apparmor/policy_ns.c b/security/apparmor/policy_ns.c
index 351d3bab3a3d..62a3589c62ab 100644
--- a/security/apparmor/policy_ns.c
+++ b/security/apparmor/policy_ns.c
@@ -112,6 +112,8 @@ static struct aa_ns *alloc_ns(const char *prefix, const char *name)
ns->unconfined->label.flags |= FLAG_IX_ON_NAME_ERROR |
FLAG_IMMUTIBLE | FLAG_NS_COUNT | FLAG_UNCONFINED;
ns->unconfined->mode = APPARMOR_UNCONFINED;
+ ns->unconfined->file.dfa = aa_get_dfa(nulldfa);
+ ns->unconfined->policy.dfa = aa_get_dfa(nulldfa);
/* ns and ns->unconfined share ns->unconfined refcount */
ns->unconfined->ns = ns;
diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c
index c600f4dd1783..5a2aec358322 100644
--- a/security/apparmor/policy_unpack.c
+++ b/security/apparmor/policy_unpack.c
@@ -85,9 +85,9 @@ static void audit_cb(struct audit_buffer *ab, void *va)
audit_log_format(ab, " ns=");
audit_log_untrustedstring(ab, aad(sa)->iface.ns);
}
- if (aad(sa)->iface.name) {
+ if (aad(sa)->name) {
audit_log_format(ab, " name=");
- audit_log_untrustedstring(ab, aad(sa)->iface.name);
+ audit_log_untrustedstring(ab, aad(sa)->name);
}
if (aad(sa)->iface.pos)
audit_log_format(ab, " offset=%ld", aad(sa)->iface.pos);
@@ -114,9 +114,9 @@ static int audit_iface(struct aa_profile *new, const char *ns_name,
aad(&sa)->iface.pos = e->pos - e->start;
aad(&sa)->iface.ns = ns_name;
if (new)
- aad(&sa)->iface.name = new->base.hname;
+ aad(&sa)->name = new->base.hname;
else
- aad(&sa)->iface.name = name;
+ aad(&sa)->name = name;
aad(&sa)->info = info;
aad(&sa)->error = error;
@@ -275,6 +275,19 @@ fail:
return 0;
}
+static bool unpack_u16(struct aa_ext *e, u16 *data, const char *name)
+{
+ if (unpack_nameX(e, AA_U16, name)) {
+ if (!inbounds(e, sizeof(u16)))
+ return 0;
+ if (data)
+ *data = le16_to_cpu(get_unaligned((__le16 *) e->pos));
+ e->pos += sizeof(u16);
+ return 1;
+ }
+ return 0;
+}
+
static bool unpack_u32(struct aa_ext *e, u32 *data, const char *name)
{
if (unpack_nameX(e, AA_U32, name)) {
@@ -448,7 +461,7 @@ fail:
*/
static bool unpack_trans_table(struct aa_ext *e, struct aa_profile *profile)
{
- void *pos = e->pos;
+ void *saved_pos = e->pos;
/* exec table is optional */
if (unpack_nameX(e, AA_STRUCT, "xtable")) {
@@ -511,7 +524,7 @@ static bool unpack_trans_table(struct aa_ext *e, struct aa_profile *profile)
fail:
aa_free_domain_entries(&profile->file.trans);
- e->pos = pos;
+ e->pos = saved_pos;
return 0;
}
@@ -583,7 +596,8 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
{
struct aa_profile *profile = NULL;
const char *tmpname, *tmpns = NULL, *name = NULL;
- size_t ns_len;
+ const char *info = "failed to unpack profile";
+ size_t size = 0, ns_len;
struct rhashtable_params params = { 0 };
char *key = NULL;
struct aa_data *data;
@@ -604,8 +618,10 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
tmpname = aa_splitn_fqname(name, strlen(name), &tmpns, &ns_len);
if (tmpns) {
*ns_name = kstrndup(tmpns, ns_len, GFP_KERNEL);
- if (!*ns_name)
+ if (!*ns_name) {
+ info = "out of memory";
goto fail;
+ }
name = tmpname;
}
@@ -624,12 +640,15 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
if (IS_ERR(profile->xmatch)) {
error = PTR_ERR(profile->xmatch);
profile->xmatch = NULL;
+ info = "bad xmatch";
goto fail;
}
/* xmatch_len is not optional if xmatch is set */
if (profile->xmatch) {
- if (!unpack_u32(e, &tmp, NULL))
+ if (!unpack_u32(e, &tmp, NULL)) {
+ info = "missing xmatch len";
goto fail;
+ }
profile->xmatch_len = tmp;
}
@@ -637,8 +656,11 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
(void) unpack_str(e, &profile->disconnected, "disconnected");
/* per profile debug flags (complain, audit) */
- if (!unpack_nameX(e, AA_STRUCT, "flags"))
+ if (!unpack_nameX(e, AA_STRUCT, "flags")) {
+ info = "profile missing flags";
goto fail;
+ }
+ info = "failed to unpack profile flags";
if (!unpack_u32(e, &tmp, NULL))
goto fail;
if (tmp & PACKED_FLAG_HAT)
@@ -667,6 +689,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
/* set a default value if path_flags field is not present */
profile->path_flags = PATH_MEDIATE_DELETED;
+ info = "failed to unpack profile capabilities";
if (!unpack_u32(e, &(profile->caps.allow.cap[0]), NULL))
goto fail;
if (!unpack_u32(e, &(profile->caps.audit.cap[0]), NULL))
@@ -676,6 +699,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
if (!unpack_u32(e, &tmpcap.cap[0], NULL))
goto fail;
+ info = "failed to unpack upper profile capabilities";
if (unpack_nameX(e, AA_STRUCT, "caps64")) {
/* optional upper half of 64 bit caps */
if (!unpack_u32(e, &(profile->caps.allow.cap[1]), NULL))
@@ -690,6 +714,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
goto fail;
}
+ info = "failed to unpack extended profile capabilities";
if (unpack_nameX(e, AA_STRUCT, "capsx")) {
/* optional extended caps mediation mask */
if (!unpack_u32(e, &(profile->caps.extended.cap[0]), NULL))
@@ -700,11 +725,46 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
goto fail;
}
- if (!unpack_rlimits(e, profile))
+ if (!unpack_rlimits(e, profile)) {
+ info = "failed to unpack profile rlimits";
goto fail;
+ }
+
+ size = unpack_array(e, "net_allowed_af");
+ if (size) {
+
+ for (i = 0; i < size; i++) {
+ /* discard extraneous rules that this kernel will
+ * never request
+ */
+ if (i >= AF_MAX) {
+ u16 tmp;
+
+ if (!unpack_u16(e, &tmp, NULL) ||
+ !unpack_u16(e, &tmp, NULL) ||
+ !unpack_u16(e, &tmp, NULL))
+ goto fail;
+ continue;
+ }
+ if (!unpack_u16(e, &profile->net.allow[i], NULL))
+ goto fail;
+ if (!unpack_u16(e, &profile->net.audit[i], NULL))
+ goto fail;
+ if (!unpack_u16(e, &profile->net.quiet[i], NULL))
+ goto fail;
+ }
+ if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+ goto fail;
+ }
+ if (VERSION_LT(e->version, v7)) {
+ /* pre v7 policy always allowed these */
+ profile->net.allow[AF_UNIX] = 0xffff;
+ profile->net.allow[AF_NETLINK] = 0xffff;
+ }
if (unpack_nameX(e, AA_STRUCT, "policydb")) {
/* generic policy dfa - optional and may be NULL */
+ info = "failed to unpack policydb";
profile->policy.dfa = unpack_dfa(e);
if (IS_ERR(profile->policy.dfa)) {
error = PTR_ERR(profile->policy.dfa);
@@ -734,6 +794,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
if (IS_ERR(profile->file.dfa)) {
error = PTR_ERR(profile->file.dfa);
profile->file.dfa = NULL;
+ info = "failed to unpack profile file rules";
goto fail;
} else if (profile->file.dfa) {
if (!unpack_u32(e, &profile->file.start, "dfa_start"))
@@ -746,10 +807,13 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
} else
profile->file.dfa = aa_get_dfa(nulldfa);
- if (!unpack_trans_table(e, profile))
+ if (!unpack_trans_table(e, profile)) {
+ info = "failed to unpack profile transition table";
goto fail;
+ }
if (unpack_nameX(e, AA_STRUCT, "data")) {
+ info = "out of memory";
profile->data = kzalloc(sizeof(*profile->data), GFP_KERNEL);
if (!profile->data)
goto fail;
@@ -761,8 +825,10 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
params.hashfn = strhash;
params.obj_cmpfn = datacmp;
- if (rhashtable_init(profile->data, &params))
+ if (rhashtable_init(profile->data, &params)) {
+ info = "failed to init key, value hash table";
goto fail;
+ }
while (unpack_strdup(e, &key, NULL)) {
data = kzalloc(sizeof(*data), GFP_KERNEL);
@@ -784,12 +850,16 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
profile->data->p);
}
- if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+ if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
+ info = "failed to unpack end of key, value data table";
goto fail;
+ }
}
- if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+ if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
+ info = "failed to unpack end of profile";
goto fail;
+ }
return profile;
@@ -798,8 +868,7 @@ fail:
name = NULL;
else if (!name)
name = "unknown";
- audit_iface(profile, NULL, name, "failed to unpack profile", e,
- error);
+ audit_iface(profile, NULL, name, info, e, error);
aa_free_profile(profile);
return ERR_PTR(error);
@@ -832,7 +901,7 @@ static int verify_header(struct aa_ext *e, int required, const char **ns)
* if not specified use previous version
* Mask off everything that is not kernel abi version
*/
- if (VERSION_LT(e->version, v5) && VERSION_GT(e->version, v7)) {
+ if (VERSION_LT(e->version, v5) || VERSION_GT(e->version, v7)) {
audit_iface(NULL, NULL, NULL, "unsupported interface version",
e, error);
return error;
diff --git a/security/commoncap.c b/security/commoncap.c
index d8e26fb9781d..c25e0d27537f 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -82,8 +82,11 @@ int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
if (ns == cred->user_ns)
return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
- /* Have we tried all of the parent namespaces? */
- if (ns == &init_user_ns)
+ /*
+ * If we're already at a lower level than we're looking for,
+ * we're done searching.
+ */
+ if (ns->level <= cred->user_ns->level)
return -EPERM;
/*
@@ -291,10 +294,10 @@ int cap_capset(struct cred *new,
*
* Determine if an inode having a change applied that's marked ATTR_KILL_PRIV
* affects the security markings on that inode, and if it is, should
- * inode_killpriv() be invoked or the change rejected?
+ * inode_killpriv() be invoked or the change rejected.
*
- * Returns 0 if granted; +ve if granted, but inode_killpriv() is required; and
- * -ve to deny the change.
+ * Returns 1 if security.capability has a value, meaning inode_killpriv()
+ * is required, 0 otherwise, meaning inode_killpriv() is not required.
*/
int cap_inode_need_killpriv(struct dentry *dentry)
{
@@ -323,6 +326,209 @@ int cap_inode_killpriv(struct dentry *dentry)
return error;
}
+static bool rootid_owns_currentns(kuid_t kroot)
+{
+ struct user_namespace *ns;
+
+ if (!uid_valid(kroot))
+ return false;
+
+ for (ns = current_user_ns(); ; ns = ns->parent) {
+ if (from_kuid(ns, kroot) == 0)
+ return true;
+ if (ns == &init_user_ns)
+ break;
+ }
+
+ return false;
+}
+
+static __u32 sansflags(__u32 m)
+{
+ return m & ~VFS_CAP_FLAGS_EFFECTIVE;
+}
+
+static bool is_v2header(size_t size, __le32 magic)
+{
+ __u32 m = le32_to_cpu(magic);
+ if (size != XATTR_CAPS_SZ_2)
+ return false;
+ return sansflags(m) == VFS_CAP_REVISION_2;
+}
+
+static bool is_v3header(size_t size, __le32 magic)
+{
+ __u32 m = le32_to_cpu(magic);
+
+ if (size != XATTR_CAPS_SZ_3)
+ return false;
+ return sansflags(m) == VFS_CAP_REVISION_3;
+}
+
+/*
+ * getsecurity: We are called for security.* before any attempt to read the
+ * xattr from the inode itself.
+ *
+ * This gives us a chance to read the on-disk value and convert it. If we
+ * return -EOPNOTSUPP, then vfs_getxattr() will call the i_op handler.
+ *
+ * Note we are not called by vfs_getxattr_alloc(), but that is only called
+ * by the integrity subsystem, which really wants the unconverted values -
+ * so that's good.
+ */
+int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
+ bool alloc)
+{
+ int size, ret;
+ kuid_t kroot;
+ uid_t root, mappedroot;
+ char *tmpbuf = NULL;
+ struct vfs_cap_data *cap;
+ struct vfs_ns_cap_data *nscap;
+ struct dentry *dentry;
+ struct user_namespace *fs_ns;
+
+ if (strcmp(name, "capability") != 0)
+ return -EOPNOTSUPP;
+
+ dentry = d_find_alias(inode);
+ if (!dentry)
+ return -EINVAL;
+
+ size = sizeof(struct vfs_ns_cap_data);
+ ret = (int) vfs_getxattr_alloc(dentry, XATTR_NAME_CAPS,
+ &tmpbuf, size, GFP_NOFS);
+ dput(dentry);
+
+ if (ret < 0)
+ return ret;
+
+ fs_ns = inode->i_sb->s_user_ns;
+ cap = (struct vfs_cap_data *) tmpbuf;
+ if (is_v2header((size_t) ret, cap->magic_etc)) {
+ /* If this is sizeof(vfs_cap_data) then we're ok with the
+ * on-disk value, so return that. */
+ if (alloc)
+ *buffer = tmpbuf;
+ else
+ kfree(tmpbuf);
+ return ret;
+ } else if (!is_v3header((size_t) ret, cap->magic_etc)) {
+ kfree(tmpbuf);
+ return -EINVAL;
+ }
+
+ nscap = (struct vfs_ns_cap_data *) tmpbuf;
+ root = le32_to_cpu(nscap->rootid);
+ kroot = make_kuid(fs_ns, root);
+
+ /* If the root kuid maps to a valid uid in current ns, then return
+ * this as a nscap. */
+ mappedroot = from_kuid(current_user_ns(), kroot);
+ if (mappedroot != (uid_t)-1 && mappedroot != (uid_t)0) {
+ if (alloc) {
+ *buffer = tmpbuf;
+ nscap->rootid = cpu_to_le32(mappedroot);
+ } else
+ kfree(tmpbuf);
+ return size;
+ }
+
+ if (!rootid_owns_currentns(kroot)) {
+ kfree(tmpbuf);
+ return -EOPNOTSUPP;
+ }
+
+ /* This comes from a parent namespace. Return as a v2 capability */
+ size = sizeof(struct vfs_cap_data);
+ if (alloc) {
+ *buffer = kmalloc(size, GFP_ATOMIC);
+ if (*buffer) {
+ struct vfs_cap_data *cap = *buffer;
+ __le32 nsmagic, magic;
+ magic = VFS_CAP_REVISION_2;
+ nsmagic = le32_to_cpu(nscap->magic_etc);
+ if (nsmagic & VFS_CAP_FLAGS_EFFECTIVE)
+ magic |= VFS_CAP_FLAGS_EFFECTIVE;
+ memcpy(&cap->data, &nscap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
+ cap->magic_etc = cpu_to_le32(magic);
+ }
+ }
+ kfree(tmpbuf);
+ return size;
+}
+
+static kuid_t rootid_from_xattr(const void *value, size_t size,
+ struct user_namespace *task_ns)
+{
+ const struct vfs_ns_cap_data *nscap = value;
+ uid_t rootid = 0;
+
+ if (size == XATTR_CAPS_SZ_3)
+ rootid = le32_to_cpu(nscap->rootid);
+
+ return make_kuid(task_ns, rootid);
+}
+
+static bool validheader(size_t size, __le32 magic)
+{
+ return is_v2header(size, magic) || is_v3header(size, magic);
+}
+
+/*
+ * User requested a write of security.capability. If needed, update the
+ * xattr to change from v2 to v3, or to fixup the v3 rootid.
+ *
+ * If all is ok, we return the new size, on error return < 0.
+ */
+int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size)
+{
+ struct vfs_ns_cap_data *nscap;
+ uid_t nsrootid;
+ const struct vfs_cap_data *cap = *ivalue;
+ __u32 magic, nsmagic;
+ struct inode *inode = d_backing_inode(dentry);
+ struct user_namespace *task_ns = current_user_ns(),
+ *fs_ns = inode->i_sb->s_user_ns;
+ kuid_t rootid;
+ size_t newsize;
+
+ if (!*ivalue)
+ return -EINVAL;
+ if (!validheader(size, cap->magic_etc))
+ return -EINVAL;
+ if (!capable_wrt_inode_uidgid(inode, CAP_SETFCAP))
+ return -EPERM;
+ if (size == XATTR_CAPS_SZ_2)
+ if (ns_capable(inode->i_sb->s_user_ns, CAP_SETFCAP))
+ /* user is privileged, just write the v2 */
+ return size;
+
+ rootid = rootid_from_xattr(*ivalue, size, task_ns);
+ if (!uid_valid(rootid))
+ return -EINVAL;
+
+ nsrootid = from_kuid(fs_ns, rootid);
+ if (nsrootid == -1)
+ return -EINVAL;
+
+ newsize = sizeof(struct vfs_ns_cap_data);
+ nscap = kmalloc(newsize, GFP_ATOMIC);
+ if (!nscap)
+ return -ENOMEM;
+ nscap->rootid = cpu_to_le32(nsrootid);
+ nsmagic = VFS_CAP_REVISION_3;
+ magic = le32_to_cpu(cap->magic_etc);
+ if (magic & VFS_CAP_FLAGS_EFFECTIVE)
+ nsmagic |= VFS_CAP_FLAGS_EFFECTIVE;
+ nscap->magic_etc = cpu_to_le32(nsmagic);
+ memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
+
+ kvfree(*ivalue);
+ *ivalue = nscap;
+ return newsize;
+}
+
/*
* Calculate the new process capability sets from the capability sets attached
* to a file.
@@ -376,7 +582,10 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data
__u32 magic_etc;
unsigned tocopy, i;
int size;
- struct vfs_cap_data caps;
+ struct vfs_ns_cap_data data, *nscaps = &data;
+ struct vfs_cap_data *caps = (struct vfs_cap_data *) &data;
+ kuid_t rootkuid;
+ struct user_namespace *fs_ns = inode->i_sb->s_user_ns;
memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data));
@@ -384,18 +593,20 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data
return -ENODATA;
size = __vfs_getxattr((struct dentry *)dentry, inode,
- XATTR_NAME_CAPS, &caps, XATTR_CAPS_SZ);
+ XATTR_NAME_CAPS, &data, XATTR_CAPS_SZ);
if (size == -ENODATA || size == -EOPNOTSUPP)
/* no data, that's ok */
return -ENODATA;
+
if (size < 0)
return size;
if (size < sizeof(magic_etc))
return -EINVAL;
- cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps.magic_etc);
+ cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps->magic_etc);
+ rootkuid = make_kuid(fs_ns, 0);
switch (magic_etc & VFS_CAP_REVISION_MASK) {
case VFS_CAP_REVISION_1:
if (size != XATTR_CAPS_SZ_1)
@@ -407,15 +618,27 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data
return -EINVAL;
tocopy = VFS_CAP_U32_2;
break;
+ case VFS_CAP_REVISION_3:
+ if (size != XATTR_CAPS_SZ_3)
+ return -EINVAL;
+ tocopy = VFS_CAP_U32_3;
+ rootkuid = make_kuid(fs_ns, le32_to_cpu(nscaps->rootid));
+ break;
+
default:
return -EINVAL;
}
+ /* Limit the caps to the mounter of the filesystem
+ * or the more limited uid specified in the xattr.
+ */
+ if (!rootid_owns_currentns(rootkuid))
+ return -ENODATA;
CAP_FOR_EACH_U32(i) {
if (i >= tocopy)
break;
- cpu_caps->permitted.cap[i] = le32_to_cpu(caps.data[i].permitted);
- cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable);
+ cpu_caps->permitted.cap[i] = le32_to_cpu(caps->data[i].permitted);
+ cpu_caps->inheritable.cap[i] = le32_to_cpu(caps->data[i].inheritable);
}
cpu_caps->permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
@@ -453,8 +676,8 @@ static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_c
rc = get_vfs_caps_from_disk(bprm->file->f_path.dentry, &vcaps);
if (rc < 0) {
if (rc == -EINVAL)
- printk(KERN_NOTICE "%s: get_vfs_caps_from_disk returned %d for %s\n",
- __func__, rc, bprm->filename);
+ printk(KERN_NOTICE "Invalid argument reading file caps for %s\n",
+ bprm->filename);
else if (rc == -ENODATA)
rc = 0;
goto out;
@@ -633,15 +856,19 @@ skip:
int cap_inode_setxattr(struct dentry *dentry, const char *name,
const void *value, size_t size, int flags)
{
- if (!strcmp(name, XATTR_NAME_CAPS)) {
- if (!capable(CAP_SETFCAP))
- return -EPERM;
+ /* Ignore non-security xattrs */
+ if (strncmp(name, XATTR_SECURITY_PREFIX,
+ sizeof(XATTR_SECURITY_PREFIX) - 1) != 0)
+ return 0;
+
+ /*
+ * For XATTR_NAME_CAPS the check will be done in
+ * cap_convert_nscap(), called by setxattr()
+ */
+ if (strcmp(name, XATTR_NAME_CAPS) == 0)
return 0;
- }
- if (!strncmp(name, XATTR_SECURITY_PREFIX,
- sizeof(XATTR_SECURITY_PREFIX) - 1) &&
- !capable(CAP_SYS_ADMIN))
+ if (!capable(CAP_SYS_ADMIN))
return -EPERM;
return 0;
}
@@ -659,15 +886,22 @@ int cap_inode_setxattr(struct dentry *dentry, const char *name,
*/
int cap_inode_removexattr(struct dentry *dentry, const char *name)
{
- if (!strcmp(name, XATTR_NAME_CAPS)) {
- if (!capable(CAP_SETFCAP))
+ /* Ignore non-security xattrs */
+ if (strncmp(name, XATTR_SECURITY_PREFIX,
+ sizeof(XATTR_SECURITY_PREFIX) - 1) != 0)
+ return 0;
+
+ if (strcmp(name, XATTR_NAME_CAPS) == 0) {
+ /* security.capability gets namespaced */
+ struct inode *inode = d_backing_inode(dentry);
+ if (!inode)
+ return -EINVAL;
+ if (!capable_wrt_inode_uidgid(inode, CAP_SETFCAP))
return -EPERM;
return 0;
}
- if (!strncmp(name, XATTR_SECURITY_PREFIX,
- sizeof(XATTR_SECURITY_PREFIX) - 1) &&
- !capable(CAP_SYS_ADMIN))
+ if (!capable(CAP_SYS_ADMIN))
return -EPERM;
return 0;
}
@@ -1054,6 +1288,7 @@ struct security_hook_list capability_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(bprm_set_creds, cap_bprm_set_creds),
LSM_HOOK_INIT(inode_need_killpriv, cap_inode_need_killpriv),
LSM_HOOK_INIT(inode_killpriv, cap_inode_killpriv),
+ LSM_HOOK_INIT(inode_getsecurity, cap_inode_getsecurity),
LSM_HOOK_INIT(mmap_addr, cap_mmap_addr),
LSM_HOOK_INIT(mmap_file, cap_mmap_file),
LSM_HOOK_INIT(task_fix_setuid, cap_task_fix_setuid),
diff --git a/security/keys/Kconfig b/security/keys/Kconfig
index a7a23b5541f8..91eafada3164 100644
--- a/security/keys/Kconfig
+++ b/security/keys/Kconfig
@@ -45,10 +45,8 @@ config BIG_KEYS
bool "Large payload keys"
depends on KEYS
depends on TMPFS
- depends on (CRYPTO_ANSI_CPRNG = y || CRYPTO_DRBG = y)
select CRYPTO_AES
- select CRYPTO_ECB
- select CRYPTO_RNG
+ select CRYPTO_GCM
help
This option provides support for holding large keys within the kernel
(for example Kerberos ticket caches). The data may be stored out to
diff --git a/security/keys/big_key.c b/security/keys/big_key.c
index 835c1ab30d01..e607830b6154 100644
--- a/security/keys/big_key.c
+++ b/security/keys/big_key.c
@@ -1,5 +1,6 @@
/* Large capacity key type
*
+ * Copyright (C) 2017 Jason A. Donenfeld <[email protected]>. All Rights Reserved.
* Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
* Written by David Howells ([email protected])
*
@@ -16,10 +17,10 @@
#include <linux/shmem_fs.h>
#include <linux/err.h>
#include <linux/scatterlist.h>
+#include <linux/random.h>
#include <keys/user-type.h>
#include <keys/big_key-type.h>
-#include <crypto/rng.h>
-#include <crypto/skcipher.h>
+#include <crypto/aead.h>
/*
* Layout of key payload words.
@@ -49,7 +50,12 @@ enum big_key_op {
/*
* Key size for big_key data encryption
*/
-#define ENC_KEY_SIZE 16
+#define ENC_KEY_SIZE 32
+
+/*
+ * Authentication tag length
+ */
+#define ENC_AUTHTAG_SIZE 16
/*
* big_key defined keys take an arbitrary string as the description and an
@@ -64,57 +70,62 @@ struct key_type key_type_big_key = {
.destroy = big_key_destroy,
.describe = big_key_describe,
.read = big_key_read,
+ /* no ->update(); don't add it without changing big_key_crypt() nonce */
};
/*
- * Crypto names for big_key data encryption
+ * Crypto names for big_key data authenticated encryption
*/
-static const char big_key_rng_name[] = "stdrng";
-static const char big_key_alg_name[] = "ecb(aes)";
+static const char big_key_alg_name[] = "gcm(aes)";
/*
- * Crypto algorithms for big_key data encryption
+ * Crypto algorithms for big_key data authenticated encryption
*/
-static struct crypto_rng *big_key_rng;
-static struct crypto_skcipher *big_key_skcipher;
+static struct crypto_aead *big_key_aead;
/*
- * Generate random key to encrypt big_key data
+ * Since changing the key affects the entire object, we need a mutex.
*/
-static inline int big_key_gen_enckey(u8 *key)
-{
- return crypto_rng_get_bytes(big_key_rng, key, ENC_KEY_SIZE);
-}
+static DEFINE_MUTEX(big_key_aead_lock);
/*
* Encrypt/decrypt big_key data
*/
static int big_key_crypt(enum big_key_op op, u8 *data, size_t datalen, u8 *key)
{
- int ret = -EINVAL;
+ int ret;
struct scatterlist sgio;
- SKCIPHER_REQUEST_ON_STACK(req, big_key_skcipher);
-
- if (crypto_skcipher_setkey(big_key_skcipher, key, ENC_KEY_SIZE)) {
+ struct aead_request *aead_req;
+ /* We always use a zero nonce. The reason we can get away with this is
+ * because we're using a different randomly generated key for every
+ * different encryption. Notably, too, key_type_big_key doesn't define
+ * an .update function, so there's no chance we'll wind up reusing the
+ * key to encrypt updated data. Simply put: one key, one encryption.
+ */
+ u8 zero_nonce[crypto_aead_ivsize(big_key_aead)];
+
+ aead_req = aead_request_alloc(big_key_aead, GFP_KERNEL);
+ if (!aead_req)
+ return -ENOMEM;
+
+ memset(zero_nonce, 0, sizeof(zero_nonce));
+ sg_init_one(&sgio, data, datalen + (op == BIG_KEY_ENC ? ENC_AUTHTAG_SIZE : 0));
+ aead_request_set_crypt(aead_req, &sgio, &sgio, datalen, zero_nonce);
+ aead_request_set_callback(aead_req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
+ aead_request_set_ad(aead_req, 0);
+
+ mutex_lock(&big_key_aead_lock);
+ if (crypto_aead_setkey(big_key_aead, key, ENC_KEY_SIZE)) {
ret = -EAGAIN;
goto error;
}
-
- skcipher_request_set_tfm(req, big_key_skcipher);
- skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
- NULL, NULL);
-
- sg_init_one(&sgio, data, datalen);
- skcipher_request_set_crypt(req, &sgio, &sgio, datalen, NULL);
-
if (op == BIG_KEY_ENC)
- ret = crypto_skcipher_encrypt(req);
+ ret = crypto_aead_encrypt(aead_req);
else
- ret = crypto_skcipher_decrypt(req);
-
- skcipher_request_zero(req);
-
+ ret = crypto_aead_decrypt(aead_req);
error:
+ mutex_unlock(&big_key_aead_lock);
+ aead_request_free(aead_req);
return ret;
}
@@ -146,15 +157,13 @@ int big_key_preparse(struct key_preparsed_payload *prep)
*
* File content is stored encrypted with randomly generated key.
*/
- size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher));
+ size_t enclen = datalen + ENC_AUTHTAG_SIZE;
+ loff_t pos = 0;
- /* prepare aligned data to encrypt */
data = kmalloc(enclen, GFP_KERNEL);
if (!data)
return -ENOMEM;
-
memcpy(data, prep->data, datalen);
- memset(data + datalen, 0x00, enclen - datalen);
/* generate random key */
enckey = kmalloc(ENC_KEY_SIZE, GFP_KERNEL);
@@ -162,13 +171,12 @@ int big_key_preparse(struct key_preparsed_payload *prep)
ret = -ENOMEM;
goto error;
}
-
- ret = big_key_gen_enckey(enckey);
- if (ret)
+ ret = get_random_bytes_wait(enckey, ENC_KEY_SIZE);
+ if (unlikely(ret))
goto err_enckey;
/* encrypt aligned data */
- ret = big_key_crypt(BIG_KEY_ENC, data, enclen, enckey);
+ ret = big_key_crypt(BIG_KEY_ENC, data, datalen, enckey);
if (ret)
goto err_enckey;
@@ -179,7 +187,7 @@ int big_key_preparse(struct key_preparsed_payload *prep)
goto err_enckey;
}
- written = kernel_write(file, data, enclen, 0);
+ written = kernel_write(file, data, enclen, &pos);
if (written != enclen) {
ret = written;
if (written >= 0)
@@ -194,7 +202,7 @@ int big_key_preparse(struct key_preparsed_payload *prep)
*path = file->f_path;
path_get(path);
fput(file);
- kfree(data);
+ kzfree(data);
} else {
/* Just store the data in a buffer */
void *data = kmalloc(datalen, GFP_KERNEL);
@@ -210,9 +218,9 @@ int big_key_preparse(struct key_preparsed_payload *prep)
err_fput:
fput(file);
err_enckey:
- kfree(enckey);
+ kzfree(enckey);
error:
- kfree(data);
+ kzfree(data);
return ret;
}
@@ -226,7 +234,7 @@ void big_key_free_preparse(struct key_preparsed_payload *prep)
path_put(path);
}
- kfree(prep->payload.data[big_key_data]);
+ kzfree(prep->payload.data[big_key_data]);
}
/*
@@ -258,7 +266,7 @@ void big_key_destroy(struct key *key)
path->mnt = NULL;
path->dentry = NULL;
}
- kfree(key->payload.data[big_key_data]);
+ kzfree(key->payload.data[big_key_data]);
key->payload.data[big_key_data] = NULL;
}
@@ -294,7 +302,8 @@ long big_key_read(const struct key *key, char __user *buffer, size_t buflen)
struct file *file;
u8 *data;
u8 *enckey = (u8 *)key->payload.data[big_key_data];
- size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher));
+ size_t enclen = datalen + ENC_AUTHTAG_SIZE;
+ loff_t pos = 0;
data = kmalloc(enclen, GFP_KERNEL);
if (!data)
@@ -307,7 +316,7 @@ long big_key_read(const struct key *key, char __user *buffer, size_t buflen)
}
/* read file to kernel and decrypt */
- ret = kernel_read(file, 0, data, enclen);
+ ret = kernel_read(file, data, enclen, &pos);
if (ret >= 0 && ret != enclen) {
ret = -EIO;
goto err_fput;
@@ -326,7 +335,7 @@ long big_key_read(const struct key *key, char __user *buffer, size_t buflen)
err_fput:
fput(file);
error:
- kfree(data);
+ kzfree(data);
} else {
ret = datalen;
if (copy_to_user(buffer, key->payload.data[big_key_data],
@@ -342,47 +351,31 @@ error:
*/
static int __init big_key_init(void)
{
- struct crypto_skcipher *cipher;
- struct crypto_rng *rng;
int ret;
- rng = crypto_alloc_rng(big_key_rng_name, 0, 0);
- if (IS_ERR(rng)) {
- pr_err("Can't alloc rng: %ld\n", PTR_ERR(rng));
- return PTR_ERR(rng);
- }
-
- big_key_rng = rng;
-
- /* seed RNG */
- ret = crypto_rng_reset(rng, NULL, crypto_rng_seedsize(rng));
- if (ret) {
- pr_err("Can't reset rng: %d\n", ret);
- goto error_rng;
- }
-
/* init block cipher */
- cipher = crypto_alloc_skcipher(big_key_alg_name, 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(cipher)) {
- ret = PTR_ERR(cipher);
+ big_key_aead = crypto_alloc_aead(big_key_alg_name, 0, CRYPTO_ALG_ASYNC);
+ if (IS_ERR(big_key_aead)) {
+ ret = PTR_ERR(big_key_aead);
pr_err("Can't alloc crypto: %d\n", ret);
- goto error_rng;
+ return ret;
+ }
+ ret = crypto_aead_setauthsize(big_key_aead, ENC_AUTHTAG_SIZE);
+ if (ret < 0) {
+ pr_err("Can't set crypto auth tag len: %d\n", ret);
+ goto free_aead;
}
-
- big_key_skcipher = cipher;
ret = register_key_type(&key_type_big_key);
if (ret < 0) {
pr_err("Can't register type: %d\n", ret);
- goto error_cipher;
+ goto free_aead;
}
return 0;
-error_cipher:
- crypto_free_skcipher(big_key_skcipher);
-error_rng:
- crypto_free_rng(big_key_rng);
+free_aead:
+ crypto_free_aead(big_key_aead);
return ret;
}
diff --git a/security/keys/internal.h b/security/keys/internal.h
index 1c02c6547038..503adbae7b0d 100644
--- a/security/keys/internal.h
+++ b/security/keys/internal.h
@@ -141,7 +141,7 @@ extern key_ref_t keyring_search_aux(key_ref_t keyring_ref,
extern key_ref_t search_my_process_keyrings(struct keyring_search_context *ctx);
extern key_ref_t search_process_keyrings(struct keyring_search_context *ctx);
-extern struct key *find_keyring_by_name(const char *name, bool skip_perm_check);
+extern struct key *find_keyring_by_name(const char *name, bool uid_keyring);
extern int install_user_keyrings(void);
extern int install_thread_keyring_to_cred(struct cred *);
diff --git a/security/keys/key.c b/security/keys/key.c
index 83da68d98b40..eb914a838840 100644
--- a/security/keys/key.c
+++ b/security/keys/key.c
@@ -54,10 +54,10 @@ void __key_check(const struct key *key)
struct key_user *key_user_lookup(kuid_t uid)
{
struct key_user *candidate = NULL, *user;
- struct rb_node *parent = NULL;
- struct rb_node **p;
+ struct rb_node *parent, **p;
try_again:
+ parent = NULL;
p = &key_user_tree.rb_node;
spin_lock(&key_user_lock);
@@ -302,6 +302,8 @@ struct key *key_alloc(struct key_type *type, const char *desc,
key->flags |= 1 << KEY_FLAG_IN_QUOTA;
if (flags & KEY_ALLOC_BUILT_IN)
key->flags |= 1 << KEY_FLAG_BUILTIN;
+ if (flags & KEY_ALLOC_UID_KEYRING)
+ key->flags |= 1 << KEY_FLAG_UID_KEYRING;
#ifdef KEY_DEBUGGING
key->magic = KEY_DEBUG_MAGIC;
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
index ab0b337c84b4..365ff85d7e27 100644
--- a/security/keys/keyctl.c
+++ b/security/keys/keyctl.c
@@ -766,12 +766,17 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
key = key_ref_to_ptr(key_ref);
+ if (test_bit(KEY_FLAG_NEGATIVE, &key->flags)) {
+ ret = -ENOKEY;
+ goto error2;
+ }
+
/* see if we can read it directly */
ret = key_permission(key_ref, KEY_NEED_READ);
if (ret == 0)
goto can_read_key;
if (ret != -EACCES)
- goto error;
+ goto error2;
/* we can't; see if it's searchable from this process's keyrings
* - we automatically take account of the fact that it may be
@@ -1406,11 +1411,9 @@ long keyctl_assume_authority(key_serial_t id)
}
ret = keyctl_change_reqkey_auth(authkey);
- if (ret < 0)
- goto error;
+ if (ret == 0)
+ ret = authkey->serial;
key_put(authkey);
-
- ret = authkey->serial;
error:
return ret;
}
diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index de81793f9920..4fa82a8a9c0e 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -423,7 +423,7 @@ static void keyring_describe(const struct key *keyring, struct seq_file *m)
}
struct keyring_read_iterator_context {
- size_t qty;
+ size_t buflen;
size_t count;
key_serial_t __user *buffer;
};
@@ -435,9 +435,9 @@ static int keyring_read_iterator(const void *object, void *data)
int ret;
kenter("{%s,%d},,{%zu/%zu}",
- key->type->name, key->serial, ctx->count, ctx->qty);
+ key->type->name, key->serial, ctx->count, ctx->buflen);
- if (ctx->count >= ctx->qty)
+ if (ctx->count >= ctx->buflen)
return 1;
ret = put_user(key->serial, ctx->buffer);
@@ -472,16 +472,12 @@ static long keyring_read(const struct key *keyring,
return 0;
/* Calculate how much data we could return */
- ctx.qty = nr_keys * sizeof(key_serial_t);
-
if (!buffer || !buflen)
- return ctx.qty;
-
- if (buflen > ctx.qty)
- ctx.qty = buflen;
+ return nr_keys * sizeof(key_serial_t);
/* Copy the IDs of the subscribed keys into the buffer */
ctx.buffer = (key_serial_t __user *)buffer;
+ ctx.buflen = buflen;
ctx.count = 0;
ret = assoc_array_iterate(&keyring->keys, keyring_read_iterator, &ctx);
if (ret < 0) {
@@ -1101,15 +1097,15 @@ found:
/*
* Find a keyring with the specified name.
*
- * All named keyrings in the current user namespace are searched, provided they
- * grant Search permission directly to the caller (unless this check is
- * skipped). Keyrings whose usage points have reached zero or who have been
- * revoked are skipped.
+ * Only keyrings that have nonzero refcount, are not revoked, and are owned by a
+ * user in the current user namespace are considered. If @uid_keyring is %true,
+ * the keyring additionally must have been allocated as a user or user session
+ * keyring; otherwise, it must grant Search permission directly to the caller.
*
* Returns a pointer to the keyring with the keyring's refcount having being
* incremented on success. -ENOKEY is returned if a key could not be found.
*/
-struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
+struct key *find_keyring_by_name(const char *name, bool uid_keyring)
{
struct key *keyring;
int bucket;
@@ -1137,10 +1133,15 @@ struct key *find_keyring_by_name(const char *name, bool skip_perm_check)
if (strcmp(keyring->description, name) != 0)
continue;
- if (!skip_perm_check &&
- key_permission(make_key_ref(keyring, 0),
- KEY_NEED_SEARCH) < 0)
- continue;
+ if (uid_keyring) {
+ if (!test_bit(KEY_FLAG_UID_KEYRING,
+ &keyring->flags))
+ continue;
+ } else {
+ if (key_permission(make_key_ref(keyring, 0),
+ KEY_NEED_SEARCH) < 0)
+ continue;
+ }
/* we've got a match but we might end up racing with
* key_cleanup() if the keyring is currently 'dead'
diff --git a/security/keys/proc.c b/security/keys/proc.c
index bf08d02b6646..de834309d100 100644
--- a/security/keys/proc.c
+++ b/security/keys/proc.c
@@ -187,7 +187,7 @@ static int proc_keys_show(struct seq_file *m, void *v)
struct keyring_search_context ctx = {
.index_key.type = key->type,
.index_key.description = key->description,
- .cred = current_cred(),
+ .cred = m->file->f_cred,
.match_data.cmp = lookup_user_key_possessed,
.match_data.raw_data = key,
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
@@ -207,11 +207,7 @@ static int proc_keys_show(struct seq_file *m, void *v)
}
}
- /* check whether the current task is allowed to view the key (assuming
- * non-possession)
- * - the caller holds a spinlock, and thus the RCU read lock, making our
- * access to __current_cred() safe
- */
+ /* check whether the current task is allowed to view the key */
rc = key_task_permission(key_ref, ctx.cred, KEY_NEED_VIEW);
if (rc < 0)
return 0;
diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c
index 86bced9fdbdf..293d3598153b 100644
--- a/security/keys/process_keys.c
+++ b/security/keys/process_keys.c
@@ -77,7 +77,8 @@ int install_user_keyrings(void)
if (IS_ERR(uid_keyring)) {
uid_keyring = keyring_alloc(buf, user->uid, INVALID_GID,
cred, user_keyring_perm,
- KEY_ALLOC_IN_QUOTA,
+ KEY_ALLOC_UID_KEYRING |
+ KEY_ALLOC_IN_QUOTA,
NULL, NULL);
if (IS_ERR(uid_keyring)) {
ret = PTR_ERR(uid_keyring);
@@ -94,7 +95,8 @@ int install_user_keyrings(void)
session_keyring =
keyring_alloc(buf, user->uid, INVALID_GID,
cred, user_keyring_perm,
- KEY_ALLOC_IN_QUOTA,
+ KEY_ALLOC_UID_KEYRING |
+ KEY_ALLOC_IN_QUOTA,
NULL, NULL);
if (IS_ERR(session_keyring)) {
ret = PTR_ERR(session_keyring);
diff --git a/security/keys/request_key_auth.c b/security/keys/request_key_auth.c
index afe9d22ab361..6ebf1af8fce9 100644
--- a/security/keys/request_key_auth.c
+++ b/security/keys/request_key_auth.c
@@ -120,6 +120,18 @@ static void request_key_auth_revoke(struct key *key)
}
}
+static void free_request_key_auth(struct request_key_auth *rka)
+{
+ if (!rka)
+ return;
+ key_put(rka->target_key);
+ key_put(rka->dest_keyring);
+ if (rka->cred)
+ put_cred(rka->cred);
+ kfree(rka->callout_info);
+ kfree(rka);
+}
+
/*
* Destroy an instantiation authorisation token key.
*/
@@ -129,15 +141,7 @@ static void request_key_auth_destroy(struct key *key)
kenter("{%d}", key->serial);
- if (rka->cred) {
- put_cred(rka->cred);
- rka->cred = NULL;
- }
-
- key_put(rka->target_key);
- key_put(rka->dest_keyring);
- kfree(rka->callout_info);
- kfree(rka);
+ free_request_key_auth(rka);
}
/*
@@ -151,22 +155,18 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info,
const struct cred *cred = current->cred;
struct key *authkey = NULL;
char desc[20];
- int ret;
+ int ret = -ENOMEM;
kenter("%d,", target->serial);
/* allocate a auth record */
- rka = kmalloc(sizeof(*rka), GFP_KERNEL);
- if (!rka) {
- kleave(" = -ENOMEM");
- return ERR_PTR(-ENOMEM);
- }
- rka->callout_info = kmalloc(callout_len, GFP_KERNEL);
- if (!rka->callout_info) {
- kleave(" = -ENOMEM");
- kfree(rka);
- return ERR_PTR(-ENOMEM);
- }
+ rka = kzalloc(sizeof(*rka), GFP_KERNEL);
+ if (!rka)
+ goto error;
+ rka->callout_info = kmemdup(callout_info, callout_len, GFP_KERNEL);
+ if (!rka->callout_info)
+ goto error_free_rka;
+ rka->callout_len = callout_len;
/* see if the calling process is already servicing the key request of
* another process */
@@ -176,8 +176,12 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info,
/* if the auth key has been revoked, then the key we're
* servicing is already instantiated */
- if (test_bit(KEY_FLAG_REVOKED, &cred->request_key_auth->flags))
- goto auth_key_revoked;
+ if (test_bit(KEY_FLAG_REVOKED,
+ &cred->request_key_auth->flags)) {
+ up_read(&cred->request_key_auth->sem);
+ ret = -EKEYREVOKED;
+ goto error_free_rka;
+ }
irka = cred->request_key_auth->payload.data[0];
rka->cred = get_cred(irka->cred);
@@ -193,8 +197,6 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info,
rka->target_key = key_get(target);
rka->dest_keyring = key_get(dest_keyring);
- memcpy(rka->callout_info, callout_info, callout_len);
- rka->callout_len = callout_len;
/* allocate the auth key */
sprintf(desc, "%x", target->serial);
@@ -205,32 +207,22 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info,
KEY_USR_VIEW, KEY_ALLOC_NOT_IN_QUOTA, NULL);
if (IS_ERR(authkey)) {
ret = PTR_ERR(authkey);
- goto error_alloc;
+ goto error_free_rka;
}
/* construct the auth key */
ret = key_instantiate_and_link(authkey, rka, 0, NULL, NULL);
if (ret < 0)
- goto error_inst;
+ goto error_put_authkey;
kleave(" = {%d,%d}", authkey->serial, refcount_read(&authkey->usage));
return authkey;
-auth_key_revoked:
- up_read(&cred->request_key_auth->sem);
- kfree(rka->callout_info);
- kfree(rka);
- kleave("= -EKEYREVOKED");
- return ERR_PTR(-EKEYREVOKED);
-
-error_inst:
- key_revoke(authkey);
+error_put_authkey:
key_put(authkey);
-error_alloc:
- key_put(rka->target_key);
- key_put(rka->dest_keyring);
- kfree(rka->callout_info);
- kfree(rka);
+error_free_rka:
+ free_request_key_auth(rka);
+error:
kleave("= %d", ret);
return ERR_PTR(ret);
}
diff --git a/security/lsm_audit.c b/security/lsm_audit.c
index 28d4c3a528ab..67703dbe29ea 100644
--- a/security/lsm_audit.c
+++ b/security/lsm_audit.c
@@ -2,7 +2,7 @@
* common LSM auditing functions
*
* Based on code written for SELinux by :
- * Stephen Smalley, <[email protected]>
+ * Stephen Smalley, <[email protected]>
* James Morris <[email protected]>
* Author : Etienne Basset, <[email protected]>
*
diff --git a/security/security.c b/security/security.c
index afc34f46c6c5..4bf0f571b4ef 100644
--- a/security/security.c
+++ b/security/security.c
@@ -974,11 +974,6 @@ int security_file_open(struct file *file, const struct cred *cred)
return fsnotify_perm(file, MAY_OPEN);
}
-int security_task_create(unsigned long clone_flags)
-{
- return call_int_hook(task_create, 0, clone_flags);
-}
-
int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
{
return call_int_hook(task_alloc, 0, task, clone_flags);
diff --git a/security/selinux/avc.c b/security/selinux/avc.c
index 4b4293194aee..2380b8d72cec 100644
--- a/security/selinux/avc.c
+++ b/security/selinux/avc.c
@@ -1,7 +1,7 @@
/*
* Implementation of the kernel access vector cache (AVC).
*
- * Authors: Stephen Smalley, <[email protected]>
+ * Authors: Stephen Smalley, <[email protected]>
* James Morris <[email protected]>
*
* Update: KaiGai, Kohei <[email protected]>
@@ -346,27 +346,26 @@ static struct avc_xperms_decision_node
struct avc_xperms_decision_node *xpd_node;
struct extended_perms_decision *xpd;
- xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep,
- GFP_ATOMIC | __GFP_NOMEMALLOC);
+ xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep, GFP_NOWAIT);
if (!xpd_node)
return NULL;
xpd = &xpd_node->xpd;
if (which & XPERMS_ALLOWED) {
xpd->allowed = kmem_cache_zalloc(avc_xperms_data_cachep,
- GFP_ATOMIC | __GFP_NOMEMALLOC);
+ GFP_NOWAIT);
if (!xpd->allowed)
goto error;
}
if (which & XPERMS_AUDITALLOW) {
xpd->auditallow = kmem_cache_zalloc(avc_xperms_data_cachep,
- GFP_ATOMIC | __GFP_NOMEMALLOC);
+ GFP_NOWAIT);
if (!xpd->auditallow)
goto error;
}
if (which & XPERMS_DONTAUDIT) {
xpd->dontaudit = kmem_cache_zalloc(avc_xperms_data_cachep,
- GFP_ATOMIC | __GFP_NOMEMALLOC);
+ GFP_NOWAIT);
if (!xpd->dontaudit)
goto error;
}
@@ -394,8 +393,7 @@ static struct avc_xperms_node *avc_xperms_alloc(void)
{
struct avc_xperms_node *xp_node;
- xp_node = kmem_cache_zalloc(avc_xperms_cachep,
- GFP_ATOMIC|__GFP_NOMEMALLOC);
+ xp_node = kmem_cache_zalloc(avc_xperms_cachep, GFP_NOWAIT);
if (!xp_node)
return xp_node;
INIT_LIST_HEAD(&xp_node->xpd_head);
@@ -548,7 +546,7 @@ static struct avc_node *avc_alloc_node(void)
{
struct avc_node *node;
- node = kmem_cache_zalloc(avc_node_cachep, GFP_ATOMIC|__GFP_NOMEMALLOC);
+ node = kmem_cache_zalloc(avc_node_cachep, GFP_NOWAIT);
if (!node)
goto out;
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index ad3b0f53ede0..f5d304736852 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -3,7 +3,7 @@
*
* This file contains the SELinux hook function implementations.
*
- * Authors: Stephen Smalley, <[email protected]>
+ * Authors: Stephen Smalley, <[email protected]>
* Chris Vance, <[email protected]>
* Wayne Salamon, <[email protected]>
* James Morris <[email protected]>
@@ -815,7 +815,9 @@ static int selinux_set_mnt_opts(struct super_block *sb,
if (!strcmp(sb->s_type->name, "debugfs") ||
!strcmp(sb->s_type->name, "tracefs") ||
!strcmp(sb->s_type->name, "sysfs") ||
- !strcmp(sb->s_type->name, "pstore"))
+ !strcmp(sb->s_type->name, "pstore") ||
+ !strcmp(sb->s_type->name, "cgroup") ||
+ !strcmp(sb->s_type->name, "cgroup2"))
sbsec->flags |= SE_SBGENFS;
if (!sbsec->behavior) {
@@ -1303,6 +1305,7 @@ static inline u16 socket_type_to_security_class(int family, int type, int protoc
case SOCK_SEQPACKET:
return SECCLASS_UNIX_STREAM_SOCKET;
case SOCK_DGRAM:
+ case SOCK_RAW:
return SECCLASS_UNIX_DGRAM_SOCKET;
}
break;
@@ -2317,6 +2320,7 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
int rc;
+ u32 av;
if (!nnp && !nosuid)
return 0; /* neither NNP nor nosuid */
@@ -2325,24 +2329,40 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
return 0; /* No change in credentials */
/*
- * The only transitions we permit under NNP or nosuid
- * are transitions to bounded SIDs, i.e. SIDs that are
- * guaranteed to only be allowed a subset of the permissions
- * of the current SID.
+ * If the policy enables the nnp_nosuid_transition policy capability,
+ * then we permit transitions under NNP or nosuid if the
+ * policy allows the corresponding permission between
+ * the old and new contexts.
*/
- rc = security_bounded_transition(old_tsec->sid, new_tsec->sid);
- if (rc) {
- /*
- * On failure, preserve the errno values for NNP vs nosuid.
- * NNP: Operation not permitted for caller.
- * nosuid: Permission denied to file.
- */
+ if (selinux_policycap_nnp_nosuid_transition) {
+ av = 0;
if (nnp)
- return -EPERM;
- else
- return -EACCES;
+ av |= PROCESS2__NNP_TRANSITION;
+ if (nosuid)
+ av |= PROCESS2__NOSUID_TRANSITION;
+ rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
+ SECCLASS_PROCESS2, av, NULL);
+ if (!rc)
+ return 0;
}
- return 0;
+
+ /*
+ * We also permit NNP or nosuid transitions to bounded SIDs,
+ * i.e. SIDs that are guaranteed to only be allowed a subset
+ * of the permissions of the current SID.
+ */
+ rc = security_bounded_transition(old_tsec->sid, new_tsec->sid);
+ if (!rc)
+ return 0;
+
+ /*
+ * On failure, preserve the errno values for NNP vs nosuid.
+ * NNP: Operation not permitted for caller.
+ * nosuid: Permission denied to file.
+ */
+ if (nnp)
+ return -EPERM;
+ return -EACCES;
}
static int selinux_bprm_set_creds(struct linux_binprm *bprm)
diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h
index 0999df03af8b..a5004e9de11a 100644
--- a/security/selinux/include/avc.h
+++ b/security/selinux/include/avc.h
@@ -1,7 +1,7 @@
/*
* Access vector cache interface for object managers.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SELINUX_AVC_H_
#define _SELINUX_AVC_H_
diff --git a/security/selinux/include/avc_ss.h b/security/selinux/include/avc_ss.h
index d5c328452df0..37d57dadd476 100644
--- a/security/selinux/include/avc_ss.h
+++ b/security/selinux/include/avc_ss.h
@@ -1,7 +1,7 @@
/*
* Access vector cache interface for the security server.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SELINUX_AVC_SS_H_
#define _SELINUX_AVC_SS_H_
diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
index b9fe3434b036..35ffb29a69cb 100644
--- a/security/selinux/include/classmap.h
+++ b/security/selinux/include/classmap.h
@@ -48,6 +48,8 @@ struct security_class_mapping secclass_map[] = {
"setrlimit", "rlimitinh", "dyntransition", "setcurrent",
"execmem", "execstack", "execheap", "setkeycreate",
"setsockcreate", "getrlimit", NULL } },
+ { "process2",
+ { "nnp_transition", "nosuid_transition", NULL } },
{ "system",
{ "ipc_info", "syslog_read", "syslog_mod",
"syslog_console", "module_request", "module_load", NULL } },
diff --git a/security/selinux/include/objsec.h b/security/selinux/include/objsec.h
index 6ebc61e370ff..1649cd18eb0b 100644
--- a/security/selinux/include/objsec.h
+++ b/security/selinux/include/objsec.h
@@ -3,7 +3,7 @@
*
* This file contains the SELinux security data structures for kernel objects.
*
- * Author(s): Stephen Smalley, <[email protected]>
+ * Author(s): Stephen Smalley, <[email protected]>
* Chris Vance, <[email protected]>
* Wayne Salamon, <[email protected]>
* James Morris <[email protected]>
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
index e91f08c16c0b..28dfb2f93e4d 100644
--- a/security/selinux/include/security.h
+++ b/security/selinux/include/security.h
@@ -1,7 +1,7 @@
/*
* Security server interface.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*
*/
@@ -73,6 +73,7 @@ enum {
POLICYDB_CAPABILITY_EXTSOCKCLASS,
POLICYDB_CAPABILITY_ALWAYSNETWORK,
POLICYDB_CAPABILITY_CGROUPSECLABEL,
+ POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION,
__POLICYDB_CAPABILITY_MAX
};
#define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)
@@ -84,6 +85,7 @@ extern int selinux_policycap_openperm;
extern int selinux_policycap_extsockclass;
extern int selinux_policycap_alwaysnetwork;
extern int selinux_policycap_cgroupseclabel;
+extern int selinux_policycap_nnp_nosuid_transition;
/*
* type_datum properties
diff --git a/security/selinux/ss/avtab.c b/security/selinux/ss/avtab.c
index 3628d3a868b6..2c3c7d010d8a 100644
--- a/security/selinux/ss/avtab.c
+++ b/security/selinux/ss/avtab.c
@@ -1,7 +1,7 @@
/*
* Implementation of the access vector table type.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/* Updated: Frank Mayer <[email protected]> and Karl MacMillan <[email protected]>
diff --git a/security/selinux/ss/avtab.h b/security/selinux/ss/avtab.h
index d946c9dc3c9c..725853cadc42 100644
--- a/security/selinux/ss/avtab.h
+++ b/security/selinux/ss/avtab.h
@@ -5,7 +5,7 @@
* table is used to represent the type enforcement
* tables.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/* Updated: Frank Mayer <[email protected]> and Karl MacMillan <[email protected]>
diff --git a/security/selinux/ss/constraint.h b/security/selinux/ss/constraint.h
index 96fd947c494b..33ae2aec4f36 100644
--- a/security/selinux/ss/constraint.h
+++ b/security/selinux/ss/constraint.h
@@ -10,7 +10,7 @@
* process from labeling an object with a different user
* identity.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_CONSTRAINT_H_
#define _SS_CONSTRAINT_H_
diff --git a/security/selinux/ss/context.h b/security/selinux/ss/context.h
index 212e3479a0d9..a2c0f37c42ae 100644
--- a/security/selinux/ss/context.h
+++ b/security/selinux/ss/context.h
@@ -10,7 +10,7 @@
* security server and can be changed without affecting
* clients of the security server.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_CONTEXT_H_
#define _SS_CONTEXT_H_
diff --git a/security/selinux/ss/ebitmap.c b/security/selinux/ss/ebitmap.c
index ad38299164c3..fc28149a4f2e 100644
--- a/security/selinux/ss/ebitmap.c
+++ b/security/selinux/ss/ebitmap.c
@@ -1,7 +1,7 @@
/*
* Implementation of the extensible bitmap type.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
* Updated: Hewlett-Packard <[email protected]>
diff --git a/security/selinux/ss/ebitmap.h b/security/selinux/ss/ebitmap.h
index 6d5a9ac4251f..da1325dda550 100644
--- a/security/selinux/ss/ebitmap.h
+++ b/security/selinux/ss/ebitmap.h
@@ -9,7 +9,7 @@
* an explicitly specified starting bit position within
* the total bitmap.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_EBITMAP_H_
#define _SS_EBITMAP_H_
diff --git a/security/selinux/ss/hashtab.c b/security/selinux/ss/hashtab.c
index 3858706a29fb..686c3917064c 100644
--- a/security/selinux/ss/hashtab.c
+++ b/security/selinux/ss/hashtab.c
@@ -1,7 +1,7 @@
/*
* Implementation of the hash table type.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#include <linux/kernel.h>
#include <linux/slab.h>
diff --git a/security/selinux/ss/hashtab.h b/security/selinux/ss/hashtab.h
index 953872cd84ab..009fb5e06172 100644
--- a/security/selinux/ss/hashtab.h
+++ b/security/selinux/ss/hashtab.h
@@ -5,7 +5,7 @@
* functions for hash computation and key comparison are
* provided by the creator of the table.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_HASHTAB_H_
#define _SS_HASHTAB_H_
diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c
index e1088842232c..d9dc34f4fade 100644
--- a/security/selinux/ss/mls.c
+++ b/security/selinux/ss/mls.c
@@ -1,7 +1,7 @@
/*
* Implementation of the multi-level security (MLS) policy.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
* Updated: Trusted Computer Solutions, Inc. <[email protected]>
diff --git a/security/selinux/ss/mls.h b/security/selinux/ss/mls.h
index e4369e3e6366..0f0a1d65b2ce 100644
--- a/security/selinux/ss/mls.h
+++ b/security/selinux/ss/mls.h
@@ -1,7 +1,7 @@
/*
* Multi-level security (MLS) policy operations.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
* Updated: Trusted Computer Solutions, Inc. <[email protected]>
diff --git a/security/selinux/ss/mls_types.h b/security/selinux/ss/mls_types.h
index e93648774137..47f3702cd596 100644
--- a/security/selinux/ss/mls_types.h
+++ b/security/selinux/ss/mls_types.h
@@ -1,7 +1,7 @@
/*
* Type definitions for the multi-level security (MLS) policy.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
* Updated: Trusted Computer Solutions, Inc. <[email protected]>
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
index aa6500abb178..6e8c8056d7ad 100644
--- a/security/selinux/ss/policydb.c
+++ b/security/selinux/ss/policydb.c
@@ -1,7 +1,7 @@
/*
* Implementation of the policy database.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h
index 5d23eed35fa7..215f8f30ac5a 100644
--- a/security/selinux/ss/policydb.h
+++ b/security/selinux/ss/policydb.h
@@ -2,7 +2,7 @@
* A policy database (policydb) specifies the
* configuration data for the security policy.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
/*
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 2f02fa67ec2e..e4a1c0dc561a 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1,7 +1,7 @@
/*
* Implementation of the security services.
*
- * Authors : Stephen Smalley, <[email protected]>
+ * Authors : Stephen Smalley, <[email protected]>
* James Morris <[email protected]>
*
* Updated: Trusted Computer Solutions, Inc. <[email protected]>
@@ -76,7 +76,8 @@ char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX] = {
"open_perms",
"extended_socket_class",
"always_check_network",
- "cgroup_seclabel"
+ "cgroup_seclabel",
+ "nnp_nosuid_transition"
};
int selinux_policycap_netpeer;
@@ -84,6 +85,7 @@ int selinux_policycap_openperm;
int selinux_policycap_extsockclass;
int selinux_policycap_alwaysnetwork;
int selinux_policycap_cgroupseclabel;
+int selinux_policycap_nnp_nosuid_transition;
static DEFINE_RWLOCK(policy_rwlock);
@@ -2009,6 +2011,9 @@ static void security_load_policycaps(void)
selinux_policycap_cgroupseclabel =
ebitmap_get_bit(&policydb.policycaps,
POLICYDB_CAPABILITY_CGROUPSECLABEL);
+ selinux_policycap_nnp_nosuid_transition =
+ ebitmap_get_bit(&policydb.policycaps,
+ POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION);
for (i = 0; i < ARRAY_SIZE(selinux_policycap_names); i++)
pr_info("SELinux: policy capability %s=%d\n",
diff --git a/security/selinux/ss/services.h b/security/selinux/ss/services.h
index 6abcd8729ec3..3d9fa9556b4f 100644
--- a/security/selinux/ss/services.h
+++ b/security/selinux/ss/services.h
@@ -1,7 +1,7 @@
/*
* Implementation of the security services.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_SERVICES_H_
#define _SS_SERVICES_H_
diff --git a/security/selinux/ss/sidtab.c b/security/selinux/ss/sidtab.c
index c5f436b15d19..6ae08efc5ae7 100644
--- a/security/selinux/ss/sidtab.c
+++ b/security/selinux/ss/sidtab.c
@@ -1,7 +1,7 @@
/*
* Implementation of the SID table type.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#include <linux/kernel.h>
#include <linux/slab.h>
diff --git a/security/selinux/ss/sidtab.h b/security/selinux/ss/sidtab.h
index 84dc154d9389..de5d0ea583d2 100644
--- a/security/selinux/ss/sidtab.h
+++ b/security/selinux/ss/sidtab.h
@@ -2,7 +2,7 @@
* A security identifier table (sidtab) is a hash table
* of security context structures indexed by SID value.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_SIDTAB_H_
#define _SS_SIDTAB_H_
diff --git a/security/selinux/ss/symtab.c b/security/selinux/ss/symtab.c
index 160326ee99e5..d1a6745849a7 100644
--- a/security/selinux/ss/symtab.c
+++ b/security/selinux/ss/symtab.c
@@ -1,7 +1,7 @@
/*
* Implementation of the symbol table type.
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#include <linux/kernel.h>
#include <linux/string.h>
diff --git a/security/selinux/ss/symtab.h b/security/selinux/ss/symtab.h
index ca422b42fbc0..0bc12d587d3a 100644
--- a/security/selinux/ss/symtab.h
+++ b/security/selinux/ss/symtab.h
@@ -4,7 +4,7 @@
* is arbitrary. The symbol table type is implemented
* using the hash table type (hashtab).
*
- * Author : Stephen Smalley, <[email protected]>
+ * Author : Stephen Smalley, <[email protected]>
*/
#ifndef _SS_SYMTAB_H_
#define _SS_SYMTAB_H_
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index 319add31b4a4..286171a16ed2 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -1473,7 +1473,7 @@ static int smack_inode_removexattr(struct dentry *dentry, const char *name)
* @inode: the object
* @name: attribute name
* @buffer: where to put the result
- * @alloc: unused
+ * @alloc: duplicate memory
*
* Returns the size of the attribute or an error code
*/
@@ -1486,43 +1486,38 @@ static int smack_inode_getsecurity(struct inode *inode,
struct super_block *sbp;
struct inode *ip = (struct inode *)inode;
struct smack_known *isp;
- int ilen;
- int rc = 0;
- if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
+ if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
isp = smk_of_inode(inode);
- ilen = strlen(isp->smk_known);
- *buffer = isp->smk_known;
- return ilen;
- }
+ else {
+ /*
+ * The rest of the Smack xattrs are only on sockets.
+ */
+ sbp = ip->i_sb;
+ if (sbp->s_magic != SOCKFS_MAGIC)
+ return -EOPNOTSUPP;
- /*
- * The rest of the Smack xattrs are only on sockets.
- */
- sbp = ip->i_sb;
- if (sbp->s_magic != SOCKFS_MAGIC)
- return -EOPNOTSUPP;
+ sock = SOCKET_I(ip);
+ if (sock == NULL || sock->sk == NULL)
+ return -EOPNOTSUPP;
- sock = SOCKET_I(ip);
- if (sock == NULL || sock->sk == NULL)
- return -EOPNOTSUPP;
-
- ssp = sock->sk->sk_security;
+ ssp = sock->sk->sk_security;
- if (strcmp(name, XATTR_SMACK_IPIN) == 0)
- isp = ssp->smk_in;
- else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
- isp = ssp->smk_out;
- else
- return -EOPNOTSUPP;
+ if (strcmp(name, XATTR_SMACK_IPIN) == 0)
+ isp = ssp->smk_in;
+ else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
+ isp = ssp->smk_out;
+ else
+ return -EOPNOTSUPP;
+ }
- ilen = strlen(isp->smk_known);
- if (rc == 0) {
- *buffer = isp->smk_known;
- rc = ilen;
+ if (alloc) {
+ *buffer = kstrdup(isp->smk_known, GFP_KERNEL);
+ if (*buffer == NULL)
+ return -ENOMEM;
}
- return rc;
+ return strlen(isp->smk_known);
}
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
index fec1dfdb14ad..4490a699030b 100644
--- a/sound/core/compress_offload.c
+++ b/sound/core/compress_offload.c
@@ -948,14 +948,13 @@ static const struct file_operations snd_compr_file_ops = {
static int snd_compress_dev_register(struct snd_device *device)
{
int ret = -EINVAL;
- char str[16];
struct snd_compr *compr;
if (snd_BUG_ON(!device || !device->device_data))
return -EBADFD;
compr = device->device_data;
- pr_debug("reg %s for device %s, direction %d\n", str, compr->name,
+ pr_debug("reg device %s, direction %d\n", compr->name,
compr->direction);
/* register compressed device */
ret = snd_register_device(SNDRV_DEVICE_TYPE_COMPRESS,
diff --git a/sound/core/device.c b/sound/core/device.c
index 8918838b1999..cb0e46f66cc9 100644
--- a/sound/core/device.c
+++ b/sound/core/device.c
@@ -128,7 +128,7 @@ void snd_device_disconnect(struct snd_card *card, void *device_data)
if (dev)
__snd_device_disconnect(dev);
else
- dev_dbg(card->dev, "device disconnect %p (from %pF), not found\n",
+ dev_dbg(card->dev, "device disconnect %p (from %pS), not found\n",
device_data, __builtin_return_address(0));
}
EXPORT_SYMBOL_GPL(snd_device_disconnect);
@@ -152,7 +152,7 @@ void snd_device_free(struct snd_card *card, void *device_data)
if (dev)
__snd_device_free(dev);
else
- dev_dbg(card->dev, "device free %p (from %pF), not found\n",
+ dev_dbg(card->dev, "device free %p (from %pS), not found\n",
device_data, __builtin_return_address(0));
}
EXPORT_SYMBOL(snd_device_free);
diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
index 3a1cc7b97e46..b719d0bd833e 100644
--- a/sound/core/pcm_compat.c
+++ b/sound/core/pcm_compat.c
@@ -547,6 +547,7 @@ struct snd_pcm_mmap_status_x32 {
u32 pad2; /* alignment */
struct timespec tstamp;
s32 suspended_state;
+ s32 pad3;
struct timespec audio_tstamp;
} __packed;
diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c
index c4acf17e9f5e..e40a2cba5002 100644
--- a/sound/core/seq_device.c
+++ b/sound/core/seq_device.c
@@ -148,8 +148,10 @@ void snd_seq_device_load_drivers(void)
flush_work(&autoload_work);
}
EXPORT_SYMBOL(snd_seq_device_load_drivers);
+#define cancel_autoload_drivers() cancel_work_sync(&autoload_work)
#else
#define queue_autoload_drivers() /* NOP */
+#define cancel_autoload_drivers() /* NOP */
#endif
/*
@@ -159,6 +161,7 @@ static int snd_seq_device_dev_free(struct snd_device *device)
{
struct snd_seq_device *dev = device->device_data;
+ cancel_autoload_drivers();
put_device(&dev->dev);
return 0;
}
diff --git a/sound/firewire/motu/motu-stream.c b/sound/firewire/motu/motu-stream.c
index dc5541c8b359..73e7a5e527fc 100644
--- a/sound/firewire/motu/motu-stream.c
+++ b/sound/firewire/motu/motu-stream.c
@@ -253,24 +253,21 @@ int snd_motu_stream_start_duplex(struct snd_motu *motu, unsigned int rate)
if (err < 0) {
dev_err(&motu->unit->device,
"fail to start isochronous comm: %d\n", err);
- stop_both_streams(motu);
- return err;
+ goto stop_streams;
}
err = start_isoc_ctx(motu, &motu->rx_stream);
if (err < 0) {
dev_err(&motu->unit->device,
"fail to start IT context: %d\n", err);
- stop_both_streams(motu);
- return err;
+ goto stop_streams;
}
err = protocol->switch_fetching_mode(motu, true);
if (err < 0) {
dev_err(&motu->unit->device,
"fail to enable frame fetching: %d\n", err);
- stop_both_streams(motu);
- return err;
+ goto stop_streams;
}
}
@@ -281,12 +278,15 @@ int snd_motu_stream_start_duplex(struct snd_motu *motu, unsigned int rate)
dev_err(&motu->unit->device,
"fail to start IR context: %d", err);
amdtp_stream_stop(&motu->rx_stream);
- stop_both_streams(motu);
- return err;
+ goto stop_streams;
}
}
return 0;
+
+stop_streams:
+ stop_both_streams(motu);
+ return err;
}
void snd_motu_stream_stop_duplex(struct snd_motu *motu)
diff --git a/sound/oss/sound_firmware.h b/sound/oss/sound_firmware.h
index da4c67e005ed..2be465277ba0 100644
--- a/sound/oss/sound_firmware.h
+++ b/sound/oss/sound_firmware.h
@@ -21,7 +21,7 @@ static inline int mod_firmware_load(const char *fn, char **fp)
loff_t size;
int err;
- err = kernel_read_file_from_path((char *)fn, (void **)fp, &size,
+ err = kernel_read_file_from_path(fn, (void **)fp, &size,
131072, READING_FIRMWARE);
if (err < 0)
return 0;
diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c
index 976a3d23557e..70d023a85bf5 100644
--- a/sound/pci/asihpi/asihpi.c
+++ b/sound/pci/asihpi/asihpi.c
@@ -558,12 +558,10 @@ static void snd_card_asihpi_pcm_int_start(struct snd_pcm_substream *substream)
struct snd_card_asihpi_pcm *dpcm;
struct snd_card_asihpi *card;
- BUG_ON(!substream);
-
dpcm = (struct snd_card_asihpi_pcm *)substream->runtime->private_data;
card = snd_pcm_substream_chip(substream);
- BUG_ON(in_interrupt());
+ WARN_ON(in_interrupt());
tasklet_disable(&card->t);
card->llmode_streampriv = dpcm;
tasklet_enable(&card->t);
@@ -578,8 +576,6 @@ static void snd_card_asihpi_pcm_int_stop(struct snd_pcm_substream *substream)
struct snd_card_asihpi_pcm *dpcm;
struct snd_card_asihpi *card;
- BUG_ON(!substream);
-
dpcm = (struct snd_card_asihpi_pcm *)substream->runtime->private_data;
card = snd_pcm_substream_chip(substream);
diff --git a/sound/pci/asihpi/hpioctl.c b/sound/pci/asihpi/hpioctl.c
index 7e3aa50b21f9..5badd08e1d69 100644
--- a/sound/pci/asihpi/hpioctl.c
+++ b/sound/pci/asihpi/hpioctl.c
@@ -103,6 +103,7 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
void __user *puhr;
union hpi_message_buffer_v1 *hm;
union hpi_response_buffer_v1 *hr;
+ u16 msg_size;
u16 res_max_size;
u32 uncopied_bytes;
int err = 0;
@@ -127,22 +128,25 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
}
/* Now read the message size and data from user space. */
- if (get_user(hm->h.size, (u16 __user *)puhm)) {
+ if (get_user(msg_size, (u16 __user *)puhm)) {
err = -EFAULT;
goto out;
}
- if (hm->h.size > sizeof(*hm))
- hm->h.size = sizeof(*hm);
+ if (msg_size > sizeof(*hm))
+ msg_size = sizeof(*hm);
/* printk(KERN_INFO "message size %d\n", hm->h.wSize); */
- uncopied_bytes = copy_from_user(hm, puhm, hm->h.size);
+ uncopied_bytes = copy_from_user(hm, puhm, msg_size);
if (uncopied_bytes) {
HPI_DEBUG_LOG(ERROR, "uncopied bytes %d\n", uncopied_bytes);
err = -EFAULT;
goto out;
}
+ /* Override h.size in case it is changed between two userspace fetches */
+ hm->h.size = msg_size;
+
if (get_user(res_max_size, (u16 __user *)puhr)) {
err = -EFAULT;
goto out;
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c
index 7326695bca33..d68f99e076a8 100644
--- a/sound/pci/echoaudio/echoaudio.c
+++ b/sound/pci/echoaudio/echoaudio.c
@@ -1272,11 +1272,11 @@ static int snd_echo_mixer_info(struct snd_kcontrol *kcontrol,
chip = snd_kcontrol_chip(kcontrol);
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 1;
uinfo->value.integer.min = ECHOGAIN_MINOUT;
uinfo->value.integer.max = ECHOGAIN_MAXOUT;
uinfo->dimen.d[0] = num_busses_out(chip);
uinfo->dimen.d[1] = num_busses_in(chip);
- uinfo->count = uinfo->dimen.d[0] * uinfo->dimen.d[1];
return 0;
}
@@ -1344,11 +1344,11 @@ static int snd_echo_vmixer_info(struct snd_kcontrol *kcontrol,
chip = snd_kcontrol_chip(kcontrol);
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 1;
uinfo->value.integer.min = ECHOGAIN_MINOUT;
uinfo->value.integer.max = ECHOGAIN_MAXOUT;
uinfo->dimen.d[0] = num_busses_out(chip);
uinfo->dimen.d[1] = num_pipes_out(chip);
- uinfo->count = uinfo->dimen.d[0] * uinfo->dimen.d[1];
return 0;
}
@@ -1728,6 +1728,7 @@ static int snd_echo_vumeters_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 96;
uinfo->value.integer.min = ECHOGAIN_MINOUT;
uinfo->value.integer.max = 0;
#ifdef ECHOCARD_HAS_VMIXER
@@ -1737,7 +1738,6 @@ static int snd_echo_vumeters_info(struct snd_kcontrol *kcontrol,
#endif
uinfo->dimen.d[1] = 16; /* 16 channels */
uinfo->dimen.d[2] = 2; /* 0=level, 1=peak */
- uinfo->count = uinfo->dimen.d[0] * uinfo->dimen.d[1] * uinfo->dimen.d[2];
return 0;
}
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 2b64fabd5faa..c19c81d230bd 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -906,6 +906,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid,
hda_nid_t pin_nid, u32 stream_tag, int format)
{
struct hdmi_spec *spec = codec->spec;
+ unsigned int param;
int err;
err = spec->ops.pin_hbr_setup(codec, pin_nid, is_hbr_format(format));
@@ -915,6 +916,26 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid,
return err;
}
+ if (is_haswell_plus(codec)) {
+
+ /*
+ * on recent platforms IEC Coding Type is required for HBR
+ * support, read current Digital Converter settings and set
+ * ICT bitfield if needed.
+ */
+ param = snd_hda_codec_read(codec, cvt_nid, 0,
+ AC_VERB_GET_DIGI_CONVERT_1, 0);
+
+ param = (param >> 16) & ~(AC_DIG3_ICT);
+
+ /* on recent platforms ICT mode is required for HBR support */
+ if (is_hbr_format(format))
+ param |= 0x1;
+
+ snd_hda_codec_write(codec, cvt_nid, 0,
+ AC_VERB_SET_DIGI_CONVERT_3, param);
+ }
+
snd_hda_codec_setup_stream(codec, cvt_nid, stream_tag, 0, format);
return 0;
}
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c
index 97ac80af4447..8f20dec97843 100644
--- a/sound/pci/maestro3.c
+++ b/sound/pci/maestro3.c
@@ -2622,22 +2622,18 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
err = request_firmware(&chip->assp_kernel_image,
"ess/maestro3_assp_kernel.fw", &pci->dev);
- if (err < 0) {
- snd_m3_free(chip);
- return err;
- }
+ if (err < 0)
+ goto free_chip;
err = request_firmware(&chip->assp_minisrc_image,
"ess/maestro3_assp_minisrc.fw", &pci->dev);
- if (err < 0) {
- snd_m3_free(chip);
- return err;
- }
+ if (err < 0)
+ goto free_chip;
+
+ err = pci_request_regions(pci, card->driver);
+ if (err < 0)
+ goto free_chip;
- if ((err = pci_request_regions(pci, card->driver)) < 0) {
- snd_m3_free(chip);
- return err;
- }
chip->iobase = pci_resource_start(pci, 0);
/* just to be sure */
@@ -2655,8 +2651,8 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
if (request_irq(pci->irq, snd_m3_interrupt, IRQF_SHARED,
KBUILD_MODNAME, chip)) {
dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
- snd_m3_free(chip);
- return -ENOMEM;
+ err = -ENOMEM;
+ goto free_chip;
}
chip->irq = pci->irq;
@@ -2666,10 +2662,9 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
dev_warn(card->dev, "can't allocate apm buffer\n");
#endif
- if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
- snd_m3_free(chip);
- return err;
- }
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
+ if (err < 0)
+ goto free_chip;
if ((err = snd_m3_mixer(chip)) < 0)
return err;
@@ -2699,6 +2694,10 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
*chip_ret = chip;
return 0;
+
+free_chip:
+ snd_m3_free(chip);
+ return err;
}
/*
@@ -2741,23 +2740,19 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
break;
}
- if ((err = snd_m3_create(card, pci,
- external_amp[dev],
- amp_gpio[dev],
- &chip)) < 0) {
- snd_card_free(card);
- return err;
- }
+ err = snd_m3_create(card, pci, external_amp[dev], amp_gpio[dev], &chip);
+ if (err < 0)
+ goto free_card;
+
card->private_data = chip;
sprintf(card->shortname, "ESS %s PCI", card->driver);
sprintf(card->longname, "%s at 0x%lx, irq %d",
card->shortname, chip->iobase, chip->irq);
- if ((err = snd_card_register(card)) < 0) {
- snd_card_free(card);
- return err;
- }
+ err = snd_card_register(card);
+ if (err < 0)
+ goto free_card;
#if 0 /* TODO: not supported yet */
/* TODO enable MIDI IRQ and I/O */
@@ -2772,6 +2767,10 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
pci_set_drvdata(pci, card);
dev++;
return 0;
+
+free_card:
+ snd_card_free(card);
+ return err;
}
static void snd_m3_remove(struct pci_dev *pci)
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index 0ff41f9ab434..9f0f73875f01 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -793,11 +793,8 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp)
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S200 | HDSP_PROGRAM);
hdsp_write (hdsp, HDSP_fifoData, 0);
- if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0) {
- hdsp->io_type = Multiface;
- dev_info(hdsp->card->dev, "Multiface found\n");
- return 0;
- }
+ if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0)
+ goto set_multi;
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
hdsp_write(hdsp, HDSP_fifoData, 0);
@@ -810,20 +807,14 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp)
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S300);
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
hdsp_write(hdsp, HDSP_fifoData, 0);
- if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) == 0) {
- hdsp->io_type = Multiface;
- dev_info(hdsp->card->dev, "Multiface found\n");
- return 0;
- }
+ if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) == 0)
+ goto set_multi;
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S300);
hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
hdsp_write(hdsp, HDSP_fifoData, 0);
- if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0) {
- hdsp->io_type = Multiface;
- dev_info(hdsp->card->dev, "Multiface found\n");
- return 0;
- }
+ if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0)
+ goto set_multi;
hdsp->io_type = RPM;
dev_info(hdsp->card->dev, "RPM found\n");
@@ -838,6 +829,11 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp)
hdsp->io_type = Digiface;
}
return 0;
+
+set_multi:
+ hdsp->io_type = Multiface;
+ dev_info(hdsp->card->dev, "Multiface found\n");
+ return 0;
}
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index 25284d8d9758..f20d42714e4d 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -6949,10 +6949,8 @@ static int snd_hdspm_probe(struct pci_dev *pci,
hdspm->pci = pci;
err = snd_hdspm_create(card, hdspm);
- if (err < 0) {
- snd_card_free(card);
- return err;
- }
+ if (err < 0)
+ goto free_card;
if (hdspm->io_type != MADIface) {
snprintf(card->shortname, sizeof(card->shortname), "%s_%x",
@@ -6970,15 +6968,17 @@ static int snd_hdspm_probe(struct pci_dev *pci,
}
err = snd_card_register(card);
- if (err < 0) {
- snd_card_free(card);
- return err;
- }
+ if (err < 0)
+ goto free_card;
pci_set_drvdata(pci, card);
dev++;
return 0;
+
+free_card:
+ snd_card_free(card);
+ return err;
}
static void snd_hdspm_remove(struct pci_dev *pci)
diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c
index 4faf3e1ed06a..eafdee384059 100644
--- a/sound/pci/ymfpci/ymfpci.c
+++ b/sound/pci/ymfpci/ymfpci.c
@@ -268,10 +268,9 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci,
if ((err = snd_ymfpci_create(card, pci,
old_legacy_ctrl,
&chip)) < 0) {
- snd_card_free(card);
release_and_free_resource(mpu_res);
release_and_free_resource(fm_res);
- return err;
+ goto free_card;
}
chip->fm_res = fm_res;
chip->mpu_res = mpu_res;
@@ -283,35 +282,31 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci,
card->shortname,
chip->reg_area_phys,
chip->irq);
- if ((err = snd_ymfpci_pcm(chip, 0)) < 0) {
- snd_card_free(card);
- return err;
- }
- if ((err = snd_ymfpci_pcm_spdif(chip, 1)) < 0) {
- snd_card_free(card);
- return err;
- }
+ err = snd_ymfpci_pcm(chip, 0);
+ if (err < 0)
+ goto free_card;
+
+ err = snd_ymfpci_pcm_spdif(chip, 1);
+ if (err < 0)
+ goto free_card;
+
err = snd_ymfpci_mixer(chip, rear_switch[dev]);
- if (err < 0) {
- snd_card_free(card);
- return err;
- }
+ if (err < 0)
+ goto free_card;
+
if (chip->ac97->ext_id & AC97_EI_SDAC) {
err = snd_ymfpci_pcm_4ch(chip, 2);
- if (err < 0) {
- snd_card_free(card);
- return err;
- }
+ if (err < 0)
+ goto free_card;
+
err = snd_ymfpci_pcm2(chip, 3);
- if (err < 0) {
- snd_card_free(card);
- return err;
- }
- }
- if ((err = snd_ymfpci_timer(chip, 0)) < 0) {
- snd_card_free(card);
- return err;
+ if (err < 0)
+ goto free_card;
}
+ err = snd_ymfpci_timer(chip, 0);
+ if (err < 0)
+ goto free_card;
+
if (chip->mpu_res) {
if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI,
mpu_port[dev],
@@ -336,21 +331,24 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci,
legacy_ctrl &= ~YMFPCI_LEGACY_FMEN;
pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
} else if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
- snd_card_free(card);
dev_err(card->dev, "cannot create opl3 hwdep\n");
- return err;
+ goto free_card;
}
}
snd_ymfpci_create_gameport(chip, dev, legacy_ctrl, legacy_ctrl2);
- if ((err = snd_card_register(card)) < 0) {
- snd_card_free(card);
- return err;
- }
+ err = snd_card_register(card);
+ if (err < 0)
+ goto free_card;
+
pci_set_drvdata(pci, card);
dev++;
return 0;
+
+free_card:
+ snd_card_free(card);
+ return err;
}
static void snd_card_ymfpci_remove(struct pci_dev *pci)
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c
index edfd58248082..8ca2e41e5827 100644
--- a/sound/pci/ymfpci/ymfpci_main.c
+++ b/sound/pci/ymfpci/ymfpci_main.c
@@ -2399,59 +2399,60 @@ int snd_ymfpci_create(struct snd_card *card,
dev_err(chip->card->dev,
"unable to grab memory region 0x%lx-0x%lx\n",
chip->reg_area_phys, chip->reg_area_phys + 0x8000 - 1);
- snd_ymfpci_free(chip);
- return -EBUSY;
+ err = -EBUSY;
+ goto free_chip;
}
if (request_irq(pci->irq, snd_ymfpci_interrupt, IRQF_SHARED,
KBUILD_MODNAME, chip)) {
dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq);
- snd_ymfpci_free(chip);
- return -EBUSY;
+ err = -EBUSY;
+ goto free_chip;
}
chip->irq = pci->irq;
snd_ymfpci_aclink_reset(pci);
if (snd_ymfpci_codec_ready(chip, 0) < 0) {
- snd_ymfpci_free(chip);
- return -EIO;
+ err = -EIO;
+ goto free_chip;
}
err = snd_ymfpci_request_firmware(chip);
if (err < 0) {
dev_err(chip->card->dev, "firmware request failed: %d\n", err);
- snd_ymfpci_free(chip);
- return err;
+ goto free_chip;
}
snd_ymfpci_download_image(chip);
udelay(100); /* seems we need a delay after downloading image.. */
if (snd_ymfpci_memalloc(chip) < 0) {
- snd_ymfpci_free(chip);
- return -EIO;
+ err = -EIO;
+ goto free_chip;
}
- if ((err = snd_ymfpci_ac3_init(chip)) < 0) {
- snd_ymfpci_free(chip);
- return err;
- }
+ err = snd_ymfpci_ac3_init(chip);
+ if (err < 0)
+ goto free_chip;
#ifdef CONFIG_PM_SLEEP
chip->saved_regs = kmalloc(YDSXGR_NUM_SAVED_REGS * sizeof(u32),
GFP_KERNEL);
if (chip->saved_regs == NULL) {
- snd_ymfpci_free(chip);
- return -ENOMEM;
+ err = -ENOMEM;
+ goto free_chip;
}
#endif
- if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
- snd_ymfpci_free(chip);
- return err;
- }
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
+ if (err < 0)
+ goto free_chip;
snd_ymfpci_proc_init(card, chip);
*rchip = chip;
return 0;
+
+free_chip:
+ snd_ymfpci_free(chip);
+ return err;
}
diff --git a/sound/soc/atmel/atmel-classd.c b/sound/soc/atmel/atmel-classd.c
index 0cd7caaed9c4..8445edd06737 100644
--- a/sound/soc/atmel/atmel-classd.c
+++ b/sound/soc/atmel/atmel-classd.c
@@ -32,7 +32,6 @@ struct atmel_classd {
struct regmap *regmap;
struct clk *pclk;
struct clk *gclk;
- struct clk *aclk;
int irq;
const struct atmel_classd_pdata *pdata;
};
@@ -330,11 +329,6 @@ static int atmel_classd_codec_dai_startup(struct snd_pcm_substream *substream,
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
- int ret;
-
- ret = clk_prepare_enable(dd->aclk);
- if (ret)
- return ret;
return clk_prepare_enable(dd->gclk);
}
@@ -357,31 +351,31 @@ static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai,
return 0;
}
-#define CLASSD_ACLK_RATE_11M2896_MPY_8 (112896 * 100 * 8)
-#define CLASSD_ACLK_RATE_12M288_MPY_8 (12288 * 1000 * 8)
+#define CLASSD_GCLK_RATE_11M2896_MPY_8 (112896 * 100 * 8)
+#define CLASSD_GCLK_RATE_12M288_MPY_8 (12288 * 1000 * 8)
static struct {
int rate;
int sample_rate;
int dsp_clk;
- unsigned long aclk_rate;
+ unsigned long gclk_rate;
} const sample_rates[] = {
{ 8000, CLASSD_INTPMR_FRAME_8K,
- CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_ACLK_RATE_12M288_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_GCLK_RATE_12M288_MPY_8 },
{ 16000, CLASSD_INTPMR_FRAME_16K,
- CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_ACLK_RATE_12M288_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_GCLK_RATE_12M288_MPY_8 },
{ 32000, CLASSD_INTPMR_FRAME_32K,
- CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_ACLK_RATE_12M288_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_GCLK_RATE_12M288_MPY_8 },
{ 48000, CLASSD_INTPMR_FRAME_48K,
- CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_ACLK_RATE_12M288_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_GCLK_RATE_12M288_MPY_8 },
{ 96000, CLASSD_INTPMR_FRAME_96K,
- CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_ACLK_RATE_12M288_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_12M288, CLASSD_GCLK_RATE_12M288_MPY_8 },
{ 22050, CLASSD_INTPMR_FRAME_22K,
- CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_ACLK_RATE_11M2896_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_GCLK_RATE_11M2896_MPY_8 },
{ 44100, CLASSD_INTPMR_FRAME_44K,
- CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_ACLK_RATE_11M2896_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_GCLK_RATE_11M2896_MPY_8 },
{ 88200, CLASSD_INTPMR_FRAME_88K,
- CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_ACLK_RATE_11M2896_MPY_8 },
+ CLASSD_INTPMR_DSP_CLK_FREQ_11M2896, CLASSD_GCLK_RATE_11M2896_MPY_8 },
};
static int
@@ -410,13 +404,12 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
}
dev_dbg(codec->dev,
- "Selected SAMPLE_RATE of %dHz, ACLK_RATE of %ldHz\n",
- sample_rates[best].rate, sample_rates[best].aclk_rate);
+ "Selected SAMPLE_RATE of %dHz, GCLK_RATE of %ldHz\n",
+ sample_rates[best].rate, sample_rates[best].gclk_rate);
clk_disable_unprepare(dd->gclk);
- clk_disable_unprepare(dd->aclk);
- ret = clk_set_rate(dd->aclk, sample_rates[best].aclk_rate);
+ ret = clk_set_rate(dd->gclk, sample_rates[best].gclk_rate);
if (ret)
return ret;
@@ -426,10 +419,6 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
snd_soc_update_bits(codec, CLASSD_INTPMR, mask, val);
- ret = clk_prepare_enable(dd->aclk);
- if (ret)
- return ret;
-
return clk_prepare_enable(dd->gclk);
}
@@ -441,7 +430,6 @@ atmel_classd_codec_dai_shutdown(struct snd_pcm_substream *substream,
struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
clk_disable_unprepare(dd->gclk);
- clk_disable_unprepare(dd->aclk);
}
static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream,
@@ -596,13 +584,6 @@ static int atmel_classd_probe(struct platform_device *pdev)
return ret;
}
- dd->aclk = devm_clk_get(dev, "aclk");
- if (IS_ERR(dd->aclk)) {
- ret = PTR_ERR(dd->aclk);
- dev_err(dev, "failed to get audio clock: %d\n", ret);
- return ret;
- }
-
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
io_base = devm_ioremap_resource(dev, res);
if (IS_ERR(io_base)) {
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 6a7778a44853..a98647ac497c 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -3600,7 +3600,7 @@ static const struct rt5645_platform_data buddy_platform_data = {
.level_trigger_irq = true,
};
-static struct dmi_system_id dmi_platform_intel_broadwell[] = {
+static const struct dmi_system_id dmi_platform_intel_broadwell[] = {
{
.ident = "Chrome Buddy",
.matches = {
diff --git a/sound/usb/6fire/chip.c b/sound/usb/6fire/chip.c
index bc2a24f7a791..c7641cb50616 100644
--- a/sound/usb/6fire/chip.c
+++ b/sound/usb/6fire/chip.c
@@ -143,37 +143,32 @@ static int usb6fire_chip_probe(struct usb_interface *intf,
chip->card = card;
ret = usb6fire_comm_init(chip);
- if (ret < 0) {
- usb6fire_chip_destroy(chip);
- return ret;
- }
+ if (ret < 0)
+ goto destroy_chip;
ret = usb6fire_midi_init(chip);
- if (ret < 0) {
- usb6fire_chip_destroy(chip);
- return ret;
- }
+ if (ret < 0)
+ goto destroy_chip;
ret = usb6fire_pcm_init(chip);
- if (ret < 0) {
- usb6fire_chip_destroy(chip);
- return ret;
- }
+ if (ret < 0)
+ goto destroy_chip;
ret = usb6fire_control_init(chip);
- if (ret < 0) {
- usb6fire_chip_destroy(chip);
- return ret;
- }
+ if (ret < 0)
+ goto destroy_chip;
ret = snd_card_register(card);
if (ret < 0) {
dev_err(&intf->dev, "cannot register card.");
- usb6fire_chip_destroy(chip);
- return ret;
+ goto destroy_chip;
}
usb_set_intfdata(intf, chip);
return 0;
+
+destroy_chip:
+ usb6fire_chip_destroy(chip);
+ return ret;
}
static void usb6fire_chip_disconnect(struct usb_interface *intf)
diff --git a/sound/usb/card.c b/sound/usb/card.c
index 3dc36d913550..23d1d23aefec 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -221,6 +221,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
struct usb_interface_descriptor *altsd;
void *control_header;
int i, protocol;
+ int rest_bytes;
/* find audiocontrol interface */
host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
@@ -235,6 +236,15 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
return -EINVAL;
}
+ rest_bytes = (void *)(host_iface->extra + host_iface->extralen) -
+ control_header;
+
+ /* just to be sure -- this shouldn't hit at all */
+ if (rest_bytes <= 0) {
+ dev_err(&dev->dev, "invalid control header\n");
+ return -EINVAL;
+ }
+
switch (protocol) {
default:
dev_warn(&dev->dev,
@@ -245,11 +255,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
case UAC_VERSION_1: {
struct uac1_ac_header_descriptor *h1 = control_header;
+ if (rest_bytes < sizeof(*h1)) {
+ dev_err(&dev->dev, "too short v1 buffer descriptor\n");
+ return -EINVAL;
+ }
+
if (!h1->bInCollection) {
dev_info(&dev->dev, "skipping empty audio interface (v1)\n");
return -EINVAL;
}
+ if (rest_bytes < h1->bLength) {
+ dev_err(&dev->dev, "invalid buffer length (v1)\n");
+ return -EINVAL;
+ }
+
if (h1->bLength < sizeof(*h1) + h1->bInCollection) {
dev_err(&dev->dev, "invalid UAC_HEADER (v1)\n");
return -EINVAL;
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 913552078285..b8cb57aeec77 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1137,6 +1137,8 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
case USB_ID(0x047F, 0x02F7): /* Plantronics BT-600 */
case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */
case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */
+ case USB_ID(0x047F, 0xC022): /* Plantronics C310 */
+ case USB_ID(0x047F, 0xC036): /* Plantronics C520-M */
case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */
case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */
case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */
diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c
index b49d6e953d52..159da1f3924e 100644
--- a/sound/usb/usx2y/us122l.c
+++ b/sound/usb/usx2y/us122l.c
@@ -508,8 +508,7 @@ static bool us122l_create_card(struct snd_card *card)
err = us122l_create_usbmidi(card);
if (err < 0) {
snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
- us122l_stop(us122l);
- return false;
+ goto stop;
}
err = usb_stream_hwdep_new(card);
if (err < 0) {
@@ -518,10 +517,13 @@ static bool us122l_create_card(struct snd_card *card)
list_for_each(p, &us122l->midi_list)
snd_usbmidi_disconnect(p);
- us122l_stop(us122l);
- return false;
+ goto stop;
}
return true;
+
+stop:
+ us122l_stop(us122l);
+ return false;
}
static void snd_us122l_free(struct snd_card *card)
diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
index fe926cb9192e..e229abd21652 100644
--- a/sound/usb/usx2y/usb_stream.c
+++ b/sound/usb/usx2y/usb_stream.c
@@ -191,7 +191,8 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
}
pg = get_order(read_size);
- sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO, pg);
+ sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO|
+ __GFP_NOWARN, pg);
if (!sk->s) {
snd_printk(KERN_WARNING "couldn't __get_free_pages()\n");
goto out;
@@ -211,7 +212,8 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
pg = get_order(write_size);
sk->write_page =
- (void *)__get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO, pg);
+ (void *)__get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO|
+ __GFP_NOWARN, pg);
if (!sk->write_page) {
snd_printk(KERN_WARNING "couldn't __get_free_pages()\n");
usb_stream_free(sk);
@@ -352,20 +354,22 @@ static int submit_urbs(struct usb_stream_kernel *sk,
int err;
prepare_inurb(sk->idle_outurb->number_of_packets, sk->idle_inurb);
err = usb_submit_urb(sk->idle_inurb, GFP_ATOMIC);
- if (err < 0) {
- snd_printk(KERN_ERR "%i\n", err);
- return err;
- }
+ if (err < 0)
+ goto report_failure;
+
sk->idle_inurb = sk->completed_inurb;
sk->completed_inurb = inurb;
err = usb_submit_urb(sk->idle_outurb, GFP_ATOMIC);
- if (err < 0) {
- snd_printk(KERN_ERR "%i\n", err);
- return err;
- }
+ if (err < 0)
+ goto report_failure;
+
sk->idle_outurb = sk->completed_outurb;
sk->completed_outurb = outurb;
return 0;
+
+report_failure:
+ snd_printk(KERN_ERR "%i\n", err);
+ return err;
}
#ifdef DEBUG_LOOP_BACK
diff --git a/tools/arch/s390/include/uapi/asm/kvm.h b/tools/arch/s390/include/uapi/asm/kvm.h
index 69d09c39bbcd..cd7359e23d86 100644
--- a/tools/arch/s390/include/uapi/asm/kvm.h
+++ b/tools/arch/s390/include/uapi/asm/kvm.h
@@ -88,6 +88,12 @@ struct kvm_s390_io_adapter_req {
/* kvm attributes for KVM_S390_VM_TOD */
#define KVM_S390_VM_TOD_LOW 0
#define KVM_S390_VM_TOD_HIGH 1
+#define KVM_S390_VM_TOD_EXT 2
+
+struct kvm_s390_vm_tod_clock {
+ __u8 epoch_idx;
+ __u64 tod;
+};
/* kvm attributes for KVM_S390_VM_CPU_MODEL */
/* processor related attributes are r/w */
diff --git a/tools/arch/x86/include/asm/cpufeatures.h b/tools/arch/x86/include/asm/cpufeatures.h
index 8ea315a11fe0..2519c6c801c9 100644
--- a/tools/arch/x86/include/asm/cpufeatures.h
+++ b/tools/arch/x86/include/asm/cpufeatures.h
@@ -196,6 +196,7 @@
#define X86_FEATURE_HW_PSTATE ( 7*32+ 8) /* AMD HW-PState */
#define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9) /* AMD ProcFeedbackInterface */
+#define X86_FEATURE_SME ( 7*32+10) /* AMD Secure Memory Encryption */
#define X86_FEATURE_INTEL_PPIN ( 7*32+14) /* Intel Processor Inventory Number */
#define X86_FEATURE_INTEL_PT ( 7*32+15) /* Intel Processor Trace */
@@ -287,6 +288,7 @@
#define X86_FEATURE_PFTHRESHOLD (15*32+12) /* pause filter threshold */
#define X86_FEATURE_AVIC (15*32+13) /* Virtual Interrupt Controller */
#define X86_FEATURE_V_VMSAVE_VMLOAD (15*32+15) /* Virtual VMSAVE VMLOAD */
+#define X86_FEATURE_VGIF (15*32+16) /* Virtual GIF */
/* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */
#define X86_FEATURE_AVX512VBMI (16*32+ 1) /* AVX512 Vector Bit Manipulation instructions*/
diff --git a/tools/arch/x86/include/asm/disabled-features.h b/tools/arch/x86/include/asm/disabled-features.h
index 5dff775af7cd..c10c9128f54e 100644
--- a/tools/arch/x86/include/asm/disabled-features.h
+++ b/tools/arch/x86/include/asm/disabled-features.h
@@ -21,11 +21,13 @@
# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))
# define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31))
# define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31))
+# define DISABLE_PCID 0
#else
# define DISABLE_VME 0
# define DISABLE_K6_MTRR 0
# define DISABLE_CYRIX_ARR 0
# define DISABLE_CENTAUR_MCR 0
+# define DISABLE_PCID (1<<(X86_FEATURE_PCID & 31))
#endif /* CONFIG_X86_64 */
#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
@@ -49,7 +51,7 @@
#define DISABLED_MASK1 0
#define DISABLED_MASK2 0
#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR)
-#define DISABLED_MASK4 0
+#define DISABLED_MASK4 (DISABLE_PCID)
#define DISABLED_MASK5 0
#define DISABLED_MASK6 0
#define DISABLED_MASK7 0
diff --git a/tools/include/asm-generic/hugetlb_encode.h b/tools/include/asm-generic/hugetlb_encode.h
new file mode 100644
index 000000000000..e4732d3c2998
--- /dev/null
+++ b/tools/include/asm-generic/hugetlb_encode.h
@@ -0,0 +1,34 @@
+#ifndef _ASM_GENERIC_HUGETLB_ENCODE_H_
+#define _ASM_GENERIC_HUGETLB_ENCODE_H_
+
+/*
+ * Several system calls take a flag to request "hugetlb" huge pages.
+ * Without further specification, these system calls will use the
+ * system's default huge page size. If a system supports multiple
+ * huge page sizes, the desired huge page size can be specified in
+ * bits [26:31] of the flag arguments. The value in these 6 bits
+ * will encode the log2 of the huge page size.
+ *
+ * The following definitions are associated with this huge page size
+ * encoding in flag arguments. System call specific header files
+ * that use this encoding should include this file. They can then
+ * provide definitions based on these with their own specific prefix.
+ * for example:
+ * #define MAP_HUGE_SHIFT HUGETLB_FLAG_ENCODE_SHIFT
+ */
+
+#define HUGETLB_FLAG_ENCODE_SHIFT 26
+#define HUGETLB_FLAG_ENCODE_MASK 0x3f
+
+#define HUGETLB_FLAG_ENCODE_64KB (16 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_512KB (19 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_1MB (20 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_2MB (21 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_8MB (23 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_16MB (24 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_256MB (28 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_1GB (30 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_2GB (31 << HUGETLB_FLAG_ENCODE_SHIFT)
+#define HUGETLB_FLAG_ENCODE_16GB (34 << HUGETLB_FLAG_ENCODE_SHIFT)
+
+#endif /* _ASM_GENERIC_HUGETLB_ENCODE_H_ */
diff --git a/tools/include/linux/compiler-gcc.h b/tools/include/linux/compiler-gcc.h
index bd39b2090ad1..3723b9f8f964 100644
--- a/tools/include/linux/compiler-gcc.h
+++ b/tools/include/linux/compiler-gcc.h
@@ -21,11 +21,14 @@
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define noinline __attribute__((noinline))
-
+#ifndef __packed
#define __packed __attribute__((packed))
-
+#endif
+#ifndef __noreturn
#define __noreturn __attribute__((noreturn))
-
+#endif
+#ifndef __aligned
#define __aligned(x) __attribute__((aligned(x)))
+#endif
#define __printf(a, b) __attribute__((format(printf, a, b)))
#define __scanf(a, b) __attribute__((format(scanf, a, b)))
diff --git a/tools/include/uapi/asm-generic/mman-common.h b/tools/include/uapi/asm-generic/mman-common.h
index 8c27db0c5c08..203268f9231e 100644
--- a/tools/include/uapi/asm-generic/mman-common.h
+++ b/tools/include/uapi/asm-generic/mman-common.h
@@ -58,20 +58,12 @@
overrides the coredump filter bits */
#define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag */
+#define MADV_WIPEONFORK 18 /* Zero memory on fork, child only */
+#define MADV_KEEPONFORK 19 /* Undo MADV_WIPEONFORK */
+
/* compatibility flags */
#define MAP_FILE 0
-/*
- * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size.
- * This gives us 6 bits, which is enough until someone invents 128 bit address
- * spaces.
- *
- * Assume these are all power of twos.
- * When 0 use the default page size.
- */
-#define MAP_HUGE_SHIFT 26
-#define MAP_HUGE_MASK 0x3f
-
#define PKEY_DISABLE_ACCESS 0x1
#define PKEY_DISABLE_WRITE 0x2
#define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS |\
diff --git a/tools/include/uapi/drm/drm.h b/tools/include/uapi/drm/drm.h
index 101593ab10ac..97677cd6964d 100644
--- a/tools/include/uapi/drm/drm.h
+++ b/tools/include/uapi/drm/drm.h
@@ -700,6 +700,7 @@ struct drm_prime_handle {
struct drm_syncobj_create {
__u32 handle;
+#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
__u32 flags;
};
@@ -718,6 +719,24 @@ struct drm_syncobj_handle {
__u32 pad;
};
+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
+struct drm_syncobj_wait {
+ __u64 handles;
+ /* absolute timeout */
+ __s64 timeout_nsec;
+ __u32 count_handles;
+ __u32 flags;
+ __u32 first_signaled; /* only valid when not waiting all */
+ __u32 pad;
+};
+
+struct drm_syncobj_array {
+ __u64 handles;
+ __u32 count_handles;
+ __u32 pad;
+};
+
#if defined(__cplusplus)
}
#endif
@@ -840,6 +859,9 @@ extern "C" {
#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait)
+#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
+#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
/**
* Device specific ioctls should only be in their respective headers
diff --git a/tools/include/uapi/drm/i915_drm.h b/tools/include/uapi/drm/i915_drm.h
index 7ccbd6a2bbe0..6598fb76d2c2 100644
--- a/tools/include/uapi/drm/i915_drm.h
+++ b/tools/include/uapi/drm/i915_drm.h
@@ -260,6 +260,8 @@ typedef struct _drm_i915_sarea {
#define DRM_I915_GEM_CONTEXT_GETPARAM 0x34
#define DRM_I915_GEM_CONTEXT_SETPARAM 0x35
#define DRM_I915_PERF_OPEN 0x36
+#define DRM_I915_PERF_ADD_CONFIG 0x37
+#define DRM_I915_PERF_REMOVE_CONFIG 0x38
#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
@@ -315,6 +317,8 @@ typedef struct _drm_i915_sarea {
#define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param)
#define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param)
#define DRM_IOCTL_I915_PERF_OPEN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_OPEN, struct drm_i915_perf_open_param)
+#define DRM_IOCTL_I915_PERF_ADD_CONFIG DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_ADD_CONFIG, struct drm_i915_perf_oa_config)
+#define DRM_IOCTL_I915_PERF_REMOVE_CONFIG DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_REMOVE_CONFIG, __u64)
/* Allow drivers to submit batchbuffers directly to hardware, relying
* on the security mechanisms provided by hardware.
@@ -431,6 +435,11 @@ typedef struct drm_i915_irq_wait {
*/
#define I915_PARAM_HAS_EXEC_BATCH_FIRST 48
+/* Query whether DRM_I915_GEM_EXECBUFFER2 supports supplying an array of
+ * drm_i915_gem_exec_fence structures. See I915_EXEC_FENCE_ARRAY.
+ */
+#define I915_PARAM_HAS_EXEC_FENCE_ARRAY 49
+
typedef struct drm_i915_getparam {
__s32 param;
/*
@@ -812,6 +821,17 @@ struct drm_i915_gem_exec_object2 {
__u64 rsvd2;
};
+struct drm_i915_gem_exec_fence {
+ /**
+ * User's handle for a drm_syncobj to wait on or signal.
+ */
+ __u32 handle;
+
+#define I915_EXEC_FENCE_WAIT (1<<0)
+#define I915_EXEC_FENCE_SIGNAL (1<<1)
+ __u32 flags;
+};
+
struct drm_i915_gem_execbuffer2 {
/**
* List of gem_exec_object2 structs
@@ -826,7 +846,11 @@ struct drm_i915_gem_execbuffer2 {
__u32 DR1;
__u32 DR4;
__u32 num_cliprects;
- /** This is a struct drm_clip_rect *cliprects */
+ /**
+ * This is a struct drm_clip_rect *cliprects if I915_EXEC_FENCE_ARRAY
+ * is not set. If I915_EXEC_FENCE_ARRAY is set, then this is a
+ * struct drm_i915_gem_exec_fence *fences.
+ */
__u64 cliprects_ptr;
#define I915_EXEC_RING_MASK (7<<0)
#define I915_EXEC_DEFAULT (0<<0)
@@ -927,7 +951,14 @@ struct drm_i915_gem_execbuffer2 {
* element).
*/
#define I915_EXEC_BATCH_FIRST (1<<18)
-#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_BATCH_FIRST<<1))
+
+/* Setting I915_FENCE_ARRAY implies that num_cliprects and cliprects_ptr
+ * define an array of i915_gem_exec_fence structures which specify a set of
+ * dma fences to wait upon or signal.
+ */
+#define I915_EXEC_FENCE_ARRAY (1<<19)
+
+#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_ARRAY<<1))
#define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
#define i915_execbuffer2_set_context_id(eb2, context) \
@@ -1467,6 +1498,22 @@ enum drm_i915_perf_record_type {
DRM_I915_PERF_RECORD_MAX /* non-ABI */
};
+/**
+ * Structure to upload perf dynamic configuration into the kernel.
+ */
+struct drm_i915_perf_oa_config {
+ /** String formatted like "%08x-%04x-%04x-%04x-%012x" */
+ char uuid[36];
+
+ __u32 n_mux_regs;
+ __u32 n_boolean_regs;
+ __u32 n_flex_regs;
+
+ __u64 __user mux_regs_ptr;
+ __u64 __user boolean_regs_ptr;
+ __u64 __user flex_regs_ptr;
+};
+
#if defined(__cplusplus)
}
#endif
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 461811e57140..43ab5c402f98 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -143,12 +143,6 @@ enum bpf_attach_type {
#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
-enum bpf_sockmap_flags {
- BPF_SOCKMAP_UNSPEC,
- BPF_SOCKMAP_STRPARSER,
- __MAX_BPF_SOCKMAP_FLAG
-};
-
/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command
* to the given target_fd cgroup the descendent cgroup will be able to
* override effective bpf program that was inherited from this cgroup
@@ -368,9 +362,20 @@ union bpf_attr {
* int bpf_redirect(ifindex, flags)
* redirect to another netdev
* @ifindex: ifindex of the net device
- * @flags: bit 0 - if set, redirect to ingress instead of egress
- * other bits - reserved
- * Return: TC_ACT_REDIRECT
+ * @flags:
+ * cls_bpf:
+ * bit 0 - if set, redirect to ingress instead of egress
+ * other bits - reserved
+ * xdp_bpf:
+ * all bits - reserved
+ * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error
+ * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error
+ * int bpf_redirect_map(map, key, flags)
+ * redirect to endpoint in map
+ * @map: pointer to dev map
+ * @key: index in map to lookup
+ * @flags: --
+ * Return: XDP_REDIRECT on success or XDP_ABORT on error
*
* u32 bpf_get_route_realm(skb)
* retrieve a dst's tclassid
@@ -632,7 +637,7 @@ union bpf_attr {
FN(skb_adjust_room), \
FN(redirect_map), \
FN(sk_redirect_map), \
- FN(sock_map_update),
+ FN(sock_map_update), \
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
* function eBPF program intends to call
@@ -753,20 +758,23 @@ struct bpf_sock {
__u32 family;
__u32 type;
__u32 protocol;
+ __u32 mark;
+ __u32 priority;
};
#define XDP_PACKET_HEADROOM 256
/* User return codes for XDP prog type.
* A valid XDP program must return one of these defined values. All other
- * return codes are reserved for future use. Unknown return codes will result
- * in packet drop.
+ * return codes are reserved for future use. Unknown return codes will
+ * result in packet drops and a warning via bpf_warn_invalid_xdp_action().
*/
enum xdp_action {
XDP_ABORTED = 0,
XDP_DROP,
XDP_PASS,
XDP_TX,
+ XDP_REDIRECT,
};
/* user accessible metadata for XDP packet hook
diff --git a/tools/include/uapi/linux/kvm.h b/tools/include/uapi/linux/kvm.h
index 6cd63c18708a..838887587411 100644
--- a/tools/include/uapi/linux/kvm.h
+++ b/tools/include/uapi/linux/kvm.h
@@ -711,7 +711,8 @@ struct kvm_ppc_one_seg_page_size {
struct kvm_ppc_smmu_info {
__u64 flags;
__u32 slb_size;
- __u32 pad;
+ __u16 data_keys; /* # storage keys supported for data */
+ __u16 instr_keys; /* # storage keys supported for instructions */
struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ];
};
diff --git a/tools/include/uapi/linux/mman.h b/tools/include/uapi/linux/mman.h
index 81d8edf11789..a937480d7cd3 100644
--- a/tools/include/uapi/linux/mman.h
+++ b/tools/include/uapi/linux/mman.h
@@ -1,7 +1,8 @@
#ifndef _UAPI_LINUX_MMAN_H
#define _UAPI_LINUX_MMAN_H
-#include <uapi/asm/mman.h>
+#include <asm/mman.h>
+#include <asm-generic/hugetlb_encode.h>
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
@@ -10,4 +11,25 @@
#define OVERCOMMIT_ALWAYS 1
#define OVERCOMMIT_NEVER 2
+/*
+ * Huge page size encoding when MAP_HUGETLB is specified, and a huge page
+ * size other than the default is desired. See hugetlb_encode.h.
+ * All known huge page size encodings are provided here. It is the
+ * responsibility of the application to know which sizes are supported on
+ * the running system. See mmap(2) man page for details.
+ */
+#define MAP_HUGE_SHIFT HUGETLB_FLAG_ENCODE_SHIFT
+#define MAP_HUGE_MASK HUGETLB_FLAG_ENCODE_MASK
+
+#define MAP_HUGE_64KB HUGETLB_FLAG_ENCODE_64KB
+#define MAP_HUGE_512KB HUGETLB_FLAG_ENCODE_512KB
+#define MAP_HUGE_1MB HUGETLB_FLAG_ENCODE_1MB
+#define MAP_HUGE_2MB HUGETLB_FLAG_ENCODE_2MB
+#define MAP_HUGE_8MB HUGETLB_FLAG_ENCODE_8MB
+#define MAP_HUGE_16MB HUGETLB_FLAG_ENCODE_16MB
+#define MAP_HUGE_256MB HUGETLB_FLAG_ENCODE_256MB
+#define MAP_HUGE_1GB HUGETLB_FLAG_ENCODE_1GB
+#define MAP_HUGE_2GB HUGETLB_FLAG_ENCODE_2GB
+#define MAP_HUGE_16GB HUGETLB_FLAG_ENCODE_16GB
+
#endif /* _UAPI_LINUX_MMAN_H */
diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
index 2a37ae925d85..140ae638cfd6 100644
--- a/tools/include/uapi/linux/perf_event.h
+++ b/tools/include/uapi/linux/perf_event.h
@@ -139,8 +139,9 @@ enum perf_event_sample_format {
PERF_SAMPLE_IDENTIFIER = 1U << 16,
PERF_SAMPLE_TRANSACTION = 1U << 17,
PERF_SAMPLE_REGS_INTR = 1U << 18,
+ PERF_SAMPLE_PHYS_ADDR = 1U << 19,
- PERF_SAMPLE_MAX = 1U << 19, /* non-ABI */
+ PERF_SAMPLE_MAX = 1U << 20, /* non-ABI */
};
/*
@@ -814,6 +815,7 @@ enum perf_event_type {
* { u64 transaction; } && PERF_SAMPLE_TRANSACTION
* { u64 abi; # enum perf_sample_regs_abi
* u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
+ * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR
* };
*/
PERF_RECORD_SAMPLE = 9,
diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile
index 4563ba7ede6f..1e83e3c07448 100644
--- a/tools/lib/api/Makefile
+++ b/tools/lib/api/Makefile
@@ -17,13 +17,19 @@ MAKEFLAGS += --no-print-directory
LIBFILE = $(OUTPUT)libapi.a
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
-CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC
+CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -fPIC
+ifeq ($(DEBUG),0)
ifeq ($(CC_NO_CLANG), 0)
CFLAGS += -O3
else
CFLAGS += -O6
endif
+endif
+
+ifeq ($(DEBUG),0)
+ CFLAGS += -D_FORTIFY_SOURCE
+endif
# Treat warnings as errors unless directed not to
ifneq ($(WERROR),0)
diff --git a/tools/objtool/Documentation/stack-validation.txt b/tools/objtool/Documentation/stack-validation.txt
index 6a1af43862df..3995735a878f 100644
--- a/tools/objtool/Documentation/stack-validation.txt
+++ b/tools/objtool/Documentation/stack-validation.txt
@@ -194,10 +194,10 @@ they mean, and suggestions for how to fix them.
If it's a GCC-compiled .c file, the error may be because the function
uses an inline asm() statement which has a "call" instruction. An
asm() statement with a call instruction must declare the use of the
- stack pointer in its output operand. For example, on x86_64:
+ stack pointer in its output operand. On x86_64, this means adding
+ the ASM_CALL_CONSTRAINT as an output constraint:
- register void *__sp asm("rsp");
- asm volatile("call func" : "+r" (__sp));
+ asm volatile("call func" : ASM_CALL_CONSTRAINT);
Otherwise the stack frame may not get created before the call.
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index 0e8c8ec4fd4e..34a579f806e3 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -208,14 +208,14 @@ int arch_decode_instruction(struct elf *elf, struct section *sec,
break;
case 0x89:
- if (rex == 0x48 && modrm == 0xe5) {
+ if (rex_w && !rex_r && modrm_mod == 3 && modrm_reg == 4) {
- /* mov %rsp, %rbp */
+ /* mov %rsp, reg */
*type = INSN_STACK;
op->src.type = OP_SRC_REG;
op->src.reg = CFI_SP;
op->dest.type = OP_DEST_REG;
- op->dest.reg = CFI_BP;
+ op->dest.reg = op_to_cfi_reg[modrm_rm][rex_b];
break;
}
@@ -284,11 +284,16 @@ int arch_decode_instruction(struct elf *elf, struct section *sec,
case 0x8d:
if (sib == 0x24 && rex_w && !rex_b && !rex_x) {
- /* lea disp(%rsp), reg */
*type = INSN_STACK;
- op->src.type = OP_SRC_ADD;
+ if (!insn.displacement.value) {
+ /* lea (%rsp), reg */
+ op->src.type = OP_SRC_REG;
+ } else {
+ /* lea disp(%rsp), reg */
+ op->src.type = OP_SRC_ADD;
+ op->src.offset = insn.displacement.value;
+ }
op->src.reg = CFI_SP;
- op->src.offset = insn.displacement.value;
op->dest.type = OP_DEST_REG;
op->dest.reg = op_to_cfi_reg[modrm_reg][rex_r];
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index f744617c9946..a0c518ecf085 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1203,24 +1203,39 @@ static int update_insn_state(struct instruction *insn, struct insn_state *state)
switch (op->src.type) {
case OP_SRC_REG:
- if (op->src.reg == CFI_SP && op->dest.reg == CFI_BP) {
+ if (op->src.reg == CFI_SP && op->dest.reg == CFI_BP &&
+ cfa->base == CFI_SP &&
+ regs[CFI_BP].base == CFI_CFA &&
+ regs[CFI_BP].offset == -cfa->offset) {
+
+ /* mov %rsp, %rbp */
+ cfa->base = op->dest.reg;
+ state->bp_scratch = false;
+ }
- if (cfa->base == CFI_SP &&
- regs[CFI_BP].base == CFI_CFA &&
- regs[CFI_BP].offset == -cfa->offset) {
+ else if (op->src.reg == CFI_SP &&
+ op->dest.reg == CFI_BP && state->drap) {
- /* mov %rsp, %rbp */
- cfa->base = op->dest.reg;
- state->bp_scratch = false;
- }
+ /* drap: mov %rsp, %rbp */
+ regs[CFI_BP].base = CFI_BP;
+ regs[CFI_BP].offset = -state->stack_size;
+ state->bp_scratch = false;
+ }
- else if (state->drap) {
+ else if (op->src.reg == CFI_SP && cfa->base == CFI_SP) {
- /* drap: mov %rsp, %rbp */
- regs[CFI_BP].base = CFI_BP;
- regs[CFI_BP].offset = -state->stack_size;
- state->bp_scratch = false;
- }
+ /*
+ * mov %rsp, %reg
+ *
+ * This is needed for the rare case where GCC
+ * does:
+ *
+ * mov %rsp, %rax
+ * ...
+ * mov %rax, %rsp
+ */
+ state->vals[op->dest.reg].base = CFI_CFA;
+ state->vals[op->dest.reg].offset = -state->stack_size;
}
else if (op->dest.reg == cfa->base) {
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 6e9f980a7d26..24460155c82c 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -175,19 +175,20 @@ static int read_sections(struct elf *elf)
return -1;
}
- sec->data = elf_getdata(s, NULL);
- if (!sec->data) {
- WARN_ELF("elf_getdata");
- return -1;
- }
-
- if (sec->data->d_off != 0 ||
- sec->data->d_size != sec->sh.sh_size) {
- WARN("unexpected data attributes for %s", sec->name);
- return -1;
+ if (sec->sh.sh_size != 0) {
+ sec->data = elf_getdata(s, NULL);
+ if (!sec->data) {
+ WARN_ELF("elf_getdata");
+ return -1;
+ }
+ if (sec->data->d_off != 0 ||
+ sec->data->d_size != sec->sh.sh_size) {
+ WARN("unexpected data attributes for %s",
+ sec->name);
+ return -1;
+ }
}
-
- sec->len = sec->data->d_size;
+ sec->len = sec->sh.sh_size;
}
/* sanity check, one more call to elf_nextscn() should return NULL */
@@ -508,6 +509,7 @@ struct section *elf_create_rela_section(struct elf *elf, struct section *base)
strcat(relaname, base->name);
sec = elf_create_section(elf, relaname, sizeof(GElf_Rela), 0);
+ free(relaname);
if (!sec)
return NULL;
@@ -561,6 +563,7 @@ int elf_write(struct elf *elf)
struct section *sec;
Elf_Scn *s;
+ /* Update section headers for changed sections: */
list_for_each_entry(sec, &elf->sections, list) {
if (sec->changed) {
s = elf_getscn(elf->elf, sec->idx);
@@ -568,13 +571,17 @@ int elf_write(struct elf *elf)
WARN_ELF("elf_getscn");
return -1;
}
- if (!gelf_update_shdr (s, &sec->sh)) {
+ if (!gelf_update_shdr(s, &sec->sh)) {
WARN_ELF("gelf_update_shdr");
return -1;
}
}
}
+ /* Make sure the new section header entries get updated properly. */
+ elf_flagelf(elf->elf, ELF_C_SET, ELF_F_DIRTY);
+
+ /* Write all changes to the file. */
if (elf_update(elf->elf, ELF_C_WRITE) < 0) {
WARN_ELF("elf_update");
return -1;
diff --git a/tools/perf/Documentation/intel-pt.txt b/tools/perf/Documentation/intel-pt.txt
index ab1b0825130a..76971d2e4164 100644
--- a/tools/perf/Documentation/intel-pt.txt
+++ b/tools/perf/Documentation/intel-pt.txt
@@ -873,7 +873,7 @@ amended to take the number of elements as a parameter.
$ cat ~/.perfconfig
[intel-pt]
- mispred-all
+ mispred-all = on
$ perf record -e intel_pt//u ./sort 3000
Bubble sorting array of 3000 elements
diff --git a/tools/perf/Documentation/perf-mem.txt b/tools/perf/Documentation/perf-mem.txt
index 73496320fca3..4be08a1e3f8d 100644
--- a/tools/perf/Documentation/perf-mem.txt
+++ b/tools/perf/Documentation/perf-mem.txt
@@ -59,6 +59,10 @@ OPTIONS
--ldload::
Specify desired latency for loads event.
+-p::
+--phys-data::
+ Record/Report sample physical addresses
+
SEE ALSO
--------
linkperf:perf-record[1], linkperf:perf-report[1]
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index 9bdea047c5db..e397453e5a46 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -249,7 +249,10 @@ OPTIONS
-d::
--data::
- Record the sample addresses.
+ Record the sample virtual addresses.
+
+--phys-data::
+ Record the sample physical addresses.
-T::
--timestamp::
diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index 9fa84617181e..383a98d992ed 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -137,6 +137,7 @@ OPTIONS
- mem: type of memory access for the data at the time of the sample
- snoop: type of snoop (if any) for the data at the time of the sample
- dcacheline: the cacheline the data address is on at the time of the sample
+ - phys_daddr: physical address of data being executed on at the time of sample
And the default sort keys are changed to local_weight, mem, sym, dso,
symbol_daddr, dso_daddr, snoop, tlb, locked, see '--mem-mode'.
diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
index 5ee8796be96e..18dfcfa38454 100644
--- a/tools/perf/Documentation/perf-script.txt
+++ b/tools/perf/Documentation/perf-script.txt
@@ -117,7 +117,7 @@ OPTIONS
Comma separated list of fields to print. Options are:
comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff,
srcline, period, iregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff,
- callindent, insn, insnlen, synth.
+ callindent, insn, insnlen, synth, phys_addr.
Field list can be prepended with the type, trace, sw or hw,
to indicate to which event type the field list applies.
e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace
diff --git a/tools/perf/Documentation/perf-trace.txt b/tools/perf/Documentation/perf-trace.txt
index c1e3288a2dfb..d53bea6bd571 100644
--- a/tools/perf/Documentation/perf-trace.txt
+++ b/tools/perf/Documentation/perf-trace.txt
@@ -37,7 +37,7 @@ OPTIONS
--expr::
--event::
List of syscalls and other perf events (tracepoints, HW cache events,
- etc) to show.
+ etc) to show. Globbing is supported, e.g.: "epoll_*", "*msg*", etc.
See 'perf list' for a complete list of events.
Prefixing with ! shows all syscalls but the ones specified. You may
need to escape it.
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index 62072822dc85..627b7cada144 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -1,34 +1,8 @@
tools/perf
-tools/arch/alpha/include/asm/barrier.h
-tools/arch/arm/include/asm/barrier.h
-tools/arch/arm64/include/asm/barrier.h
-tools/arch/ia64/include/asm/barrier.h
-tools/arch/mips/include/asm/barrier.h
-tools/arch/powerpc/include/asm/barrier.h
-tools/arch/s390/include/asm/barrier.h
-tools/arch/sh/include/asm/barrier.h
-tools/arch/sparc/include/asm/barrier.h
-tools/arch/sparc/include/asm/barrier_32.h
-tools/arch/sparc/include/asm/barrier_64.h
-tools/arch/tile/include/asm/barrier.h
-tools/arch/x86/include/asm/barrier.h
-tools/arch/x86/include/asm/cmpxchg.h
-tools/arch/x86/include/asm/cpufeatures.h
-tools/arch/x86/include/asm/disabled-features.h
-tools/arch/x86/include/asm/required-features.h
-tools/arch/x86/include/uapi/asm/svm.h
-tools/arch/x86/include/uapi/asm/vmx.h
-tools/arch/x86/include/uapi/asm/kvm.h
-tools/arch/x86/include/uapi/asm/kvm_perf.h
-tools/arch/x86/lib/memcpy_64.S
-tools/arch/x86/lib/memset_64.S
-tools/arch/s390/include/uapi/asm/kvm_perf.h
-tools/arch/s390/include/uapi/asm/sie.h
-tools/arch/xtensa/include/asm/barrier.h
+tools/arch
tools/scripts
tools/build
-tools/arch/x86/include/asm/atomic.h
-tools/arch/x86/include/asm/rmwcc.h
+tools/include
tools/lib/traceevent
tools/lib/api
tools/lib/bpf
@@ -42,60 +16,3 @@ tools/lib/find_bit.c
tools/lib/bitmap.c
tools/lib/str_error_r.c
tools/lib/vsprintf.c
-tools/include/asm/alternative-asm.h
-tools/include/asm/atomic.h
-tools/include/asm/barrier.h
-tools/include/asm/bug.h
-tools/include/asm-generic/atomic-gcc.h
-tools/include/asm-generic/barrier.h
-tools/include/asm-generic/bitops/arch_hweight.h
-tools/include/asm-generic/bitops/atomic.h
-tools/include/asm-generic/bitops/const_hweight.h
-tools/include/asm-generic/bitops/__ffs.h
-tools/include/asm-generic/bitops/__ffz.h
-tools/include/asm-generic/bitops/__fls.h
-tools/include/asm-generic/bitops/find.h
-tools/include/asm-generic/bitops/fls64.h
-tools/include/asm-generic/bitops/fls.h
-tools/include/asm-generic/bitops/hweight.h
-tools/include/asm-generic/bitops.h
-tools/include/linux/atomic.h
-tools/include/linux/bitops.h
-tools/include/linux/compiler.h
-tools/include/linux/compiler-gcc.h
-tools/include/linux/coresight-pmu.h
-tools/include/linux/bug.h
-tools/include/linux/filter.h
-tools/include/linux/hash.h
-tools/include/linux/kernel.h
-tools/include/linux/list.h
-tools/include/linux/log2.h
-tools/include/uapi/asm-generic/fcntl.h
-tools/include/uapi/asm-generic/ioctls.h
-tools/include/uapi/asm-generic/mman-common.h
-tools/include/uapi/asm-generic/mman.h
-tools/include/uapi/drm/drm.h
-tools/include/uapi/drm/i915_drm.h
-tools/include/uapi/linux/bpf.h
-tools/include/uapi/linux/bpf_common.h
-tools/include/uapi/linux/fcntl.h
-tools/include/uapi/linux/hw_breakpoint.h
-tools/include/uapi/linux/kvm.h
-tools/include/uapi/linux/mman.h
-tools/include/uapi/linux/perf_event.h
-tools/include/uapi/linux/sched.h
-tools/include/uapi/linux/stat.h
-tools/include/uapi/linux/vhost.h
-tools/include/uapi/sound/asound.h
-tools/include/linux/poison.h
-tools/include/linux/rbtree.h
-tools/include/linux/rbtree_augmented.h
-tools/include/linux/refcount.h
-tools/include/linux/string.h
-tools/include/linux/stringify.h
-tools/include/linux/types.h
-tools/include/linux/err.h
-tools/include/linux/bitmap.h
-tools/include/linux/time64.h
-tools/arch/*/include/uapi/asm/mman.h
-tools/arch/*/include/uapi/asm/perf_regs.h
diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
index bd518b623d7a..5bd7b9260cc0 100644
--- a/tools/perf/arch/s390/util/Build
+++ b/tools/perf/arch/s390/util/Build
@@ -1,5 +1,4 @@
libperf-y += header.o
-libperf-y += sym-handling.o
libperf-y += kvm-stat.o
libperf-$(CONFIG_DWARF) += dwarf-regs.o
diff --git a/tools/perf/arch/s390/util/sym-handling.c b/tools/perf/arch/s390/util/sym-handling.c
deleted file mode 100644
index e103f6e46afe..000000000000
--- a/tools/perf/arch/s390/util/sym-handling.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Architecture specific ELF symbol handling and relocation mapping.
- *
- * Copyright 2017 IBM Corp.
- * Author(s): Thomas Richter <[email protected]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License (version 2 only)
- * as published by the Free Software Foundation.
- */
-
-#include "symbol.h"
-
-#ifdef HAVE_LIBELF_SUPPORT
-bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
-{
- if (ehdr.e_type == ET_EXEC)
- return false;
- return ehdr.e_type == ET_REL || ehdr.e_type == ET_DYN;
-}
-
-void arch__adjust_sym_map_offset(GElf_Sym *sym,
- GElf_Shdr *shdr __maybe_unused,
- struct map *map)
-{
- if (map->type == MAP__FUNCTION)
- sym->st_value += map->start;
-}
-#endif
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 3ddcc6e2abeb..a1d82e33282c 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -59,7 +59,7 @@ static int set_config(struct perf_config_set *set, const char *file_name,
fprintf(fp, "[%s]\n", section->name);
perf_config_items__for_each_entry(&section->items, item) {
- if (!use_system_config && section->from_system_config)
+ if (!use_system_config && item->from_system_config)
continue;
if (item->value)
fprintf(fp, "\t%s = %s\n",
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index a1497c516d85..24ee68ecdd42 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -627,7 +627,6 @@ static const struct {
{ "GFP_HIGHUSER_MOVABLE", "HUM" },
{ "GFP_HIGHUSER", "HU" },
{ "GFP_USER", "U" },
- { "GFP_TEMPORARY", "TMP" },
{ "GFP_KERNEL_ACCOUNT", "KAC" },
{ "GFP_KERNEL", "K" },
{ "GFP_NOFS", "NF" },
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index e001c0290793..0f15634ef82c 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -23,6 +23,7 @@ struct perf_mem {
bool hide_unresolved;
bool dump_raw;
bool force;
+ bool phys_addr;
int operation;
const char *cpu_list;
DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
@@ -101,6 +102,9 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
rec_argv[i++] = "-d";
+ if (mem->phys_addr)
+ rec_argv[i++] = "--phys-data";
+
for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
if (!perf_mem_events[j].record)
continue;
@@ -161,30 +165,60 @@ dump_raw_samples(struct perf_tool *tool,
if (al.map != NULL)
al.map->dso->hit = 1;
- if (symbol_conf.field_sep) {
- fmt = "%d%s%d%s0x%"PRIx64"%s0x%"PRIx64"%s%"PRIu64
- "%s0x%"PRIx64"%s%s:%s\n";
+ if (mem->phys_addr) {
+ if (symbol_conf.field_sep) {
+ fmt = "%d%s%d%s0x%"PRIx64"%s0x%"PRIx64"%s0x%016"PRIx64
+ "%s%"PRIu64"%s0x%"PRIx64"%s%s:%s\n";
+ } else {
+ fmt = "%5d%s%5d%s0x%016"PRIx64"%s0x016%"PRIx64
+ "%s0x%016"PRIx64"%s%5"PRIu64"%s0x%06"PRIx64
+ "%s%s:%s\n";
+ symbol_conf.field_sep = " ";
+ }
+
+ printf(fmt,
+ sample->pid,
+ symbol_conf.field_sep,
+ sample->tid,
+ symbol_conf.field_sep,
+ sample->ip,
+ symbol_conf.field_sep,
+ sample->addr,
+ symbol_conf.field_sep,
+ sample->phys_addr,
+ symbol_conf.field_sep,
+ sample->weight,
+ symbol_conf.field_sep,
+ sample->data_src,
+ symbol_conf.field_sep,
+ al.map ? (al.map->dso ? al.map->dso->long_name : "???") : "???",
+ al.sym ? al.sym->name : "???");
} else {
- fmt = "%5d%s%5d%s0x%016"PRIx64"%s0x016%"PRIx64
- "%s%5"PRIu64"%s0x%06"PRIx64"%s%s:%s\n";
- symbol_conf.field_sep = " ";
- }
+ if (symbol_conf.field_sep) {
+ fmt = "%d%s%d%s0x%"PRIx64"%s0x%"PRIx64"%s%"PRIu64
+ "%s0x%"PRIx64"%s%s:%s\n";
+ } else {
+ fmt = "%5d%s%5d%s0x%016"PRIx64"%s0x016%"PRIx64
+ "%s%5"PRIu64"%s0x%06"PRIx64"%s%s:%s\n";
+ symbol_conf.field_sep = " ";
+ }
- printf(fmt,
- sample->pid,
- symbol_conf.field_sep,
- sample->tid,
- symbol_conf.field_sep,
- sample->ip,
- symbol_conf.field_sep,
- sample->addr,
- symbol_conf.field_sep,
- sample->weight,
- symbol_conf.field_sep,
- sample->data_src,
- symbol_conf.field_sep,
- al.map ? (al.map->dso ? al.map->dso->long_name : "???") : "???",
- al.sym ? al.sym->name : "???");
+ printf(fmt,
+ sample->pid,
+ symbol_conf.field_sep,
+ sample->tid,
+ symbol_conf.field_sep,
+ sample->ip,
+ symbol_conf.field_sep,
+ sample->addr,
+ symbol_conf.field_sep,
+ sample->weight,
+ symbol_conf.field_sep,
+ sample->data_src,
+ symbol_conf.field_sep,
+ al.map ? (al.map->dso ? al.map->dso->long_name : "???") : "???",
+ al.sym ? al.sym->name : "???");
+ }
out_put:
addr_location__put(&al);
return 0;
@@ -224,7 +258,10 @@ static int report_raw_events(struct perf_mem *mem)
if (ret < 0)
goto out_delete;
- printf("# PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL\n");
+ if (mem->phys_addr)
+ printf("# PID, TID, IP, ADDR, PHYS ADDR, LOCAL WEIGHT, DSRC, SYMBOL\n");
+ else
+ printf("# PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL\n");
ret = perf_session__process_events(session);
@@ -254,9 +291,16 @@ static int report_events(int argc, const char **argv, struct perf_mem *mem)
* there is no weight (cost) associated with stores, so don't print
* the column
*/
- if (!(mem->operation & MEM_OPERATION_LOAD))
- rep_argv[i++] = "--sort=mem,sym,dso,symbol_daddr,"
- "dso_daddr,tlb,locked";
+ if (!(mem->operation & MEM_OPERATION_LOAD)) {
+ if (mem->phys_addr)
+ rep_argv[i++] = "--sort=mem,sym,dso,symbol_daddr,"
+ "dso_daddr,tlb,locked,phys_daddr";
+ else
+ rep_argv[i++] = "--sort=mem,sym,dso,symbol_daddr,"
+ "dso_daddr,tlb,locked";
+ } else if (mem->phys_addr)
+ rep_argv[i++] = "--sort=local_weight,mem,sym,dso,symbol_daddr,"
+ "dso_daddr,snoop,tlb,locked,phys_daddr";
for (j = 1; j < argc; j++, i++)
rep_argv[i] = argv[j];
@@ -373,6 +417,7 @@ int cmd_mem(int argc, const char **argv)
"separator for columns, no spaces will be added"
" between columns '.' is reserved."),
OPT_BOOLEAN('f', "force", &mem.force, "don't complain, do it"),
+ OPT_BOOLEAN('p', "phys-data", &mem.phys_addr, "Record/Report sample physical addresses"),
OPT_END()
};
const char *const mem_subcommands[] = { "record", "report", NULL };
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 36d7117a7562..56f8142ff97f 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1604,6 +1604,8 @@ static struct option __record_options[] = {
OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
"per thread counts"),
OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
+ OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr,
+ "Record the sample physical addresses"),
OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"),
OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,
&record.opts.sample_time_set,
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 378f76cdf923..3d4c3b5e1868 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -87,6 +87,7 @@ enum perf_output_field {
PERF_OUTPUT_BRSTACKINSN = 1U << 23,
PERF_OUTPUT_BRSTACKOFF = 1U << 24,
PERF_OUTPUT_SYNTH = 1U << 25,
+ PERF_OUTPUT_PHYS_ADDR = 1U << 26,
};
struct output_option {
@@ -119,6 +120,7 @@ struct output_option {
{.str = "brstackinsn", .field = PERF_OUTPUT_BRSTACKINSN},
{.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF},
{.str = "synth", .field = PERF_OUTPUT_SYNTH},
+ {.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR},
};
enum {
@@ -175,7 +177,8 @@ static struct {
PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
PERF_OUTPUT_PERIOD | PERF_OUTPUT_ADDR |
- PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT,
+ PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT |
+ PERF_OUTPUT_PHYS_ADDR,
.invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
},
@@ -382,6 +385,11 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
PERF_OUTPUT_IREGS))
return -EINVAL;
+ if (PRINT_FIELD(PHYS_ADDR) &&
+ perf_evsel__check_stype(evsel, PERF_SAMPLE_PHYS_ADDR, "PHYS_ADDR",
+ PERF_OUTPUT_PHYS_ADDR))
+ return -EINVAL;
+
return 0;
}
@@ -1446,6 +1454,9 @@ static void process_event(struct perf_script *script,
if (perf_evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
print_sample_bpf_output(sample);
print_insn(sample, attr, thread, machine);
+
+ if (PRINT_FIELD(PHYS_ADDR))
+ printf("%16" PRIx64, sample->phys_addr);
printf("\n");
}
@@ -2729,7 +2740,7 @@ int cmd_script(int argc, const char **argv)
"Valid types: hw,sw,trace,raw,synth. "
"Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
"addr,symoff,period,iregs,brstack,brstacksym,flags,"
- "bpf-output,callindent,insn,insnlen,brstackinsn,synth",
+ "bpf-output,callindent,insn,insnlen,brstackinsn,synth,phys_addr",
parse_output_fields),
OPT_BOOLEAN('a', "all-cpus", &system_wide,
"system-wide collection from all CPUs"),
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 866da7aa54bf..69523ed55894 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -707,7 +707,7 @@ try_again:
process_interval();
}
}
- wait(&status);
+ waitpid(child_pid, &status, 0);
if (workload_exec_errno) {
const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
@@ -1257,7 +1257,7 @@ static bool collect_data(struct perf_evsel *counter,
if (counter->merged_stat)
return false;
cb(counter, data, true);
- if (!no_merge)
+ if (!no_merge && counter->auto_merge_stats)
collect_all_aliases(counter, cb, data);
return true;
}
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index d59cdadf3a79..771ddab94bb0 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1261,6 +1261,7 @@ static int trace__read_syscall_info(struct trace *trace, int id)
static int trace__validate_ev_qualifier(struct trace *trace)
{
int err = 0, i;
+ size_t nr_allocated;
struct str_node *pos;
trace->ev_qualifier_ids.nr = strlist__nr_entries(trace->ev_qualifier);
@@ -1274,13 +1275,18 @@ static int trace__validate_ev_qualifier(struct trace *trace)
goto out;
}
+ nr_allocated = trace->ev_qualifier_ids.nr;
i = 0;
strlist__for_each_entry(pos, trace->ev_qualifier) {
const char *sc = pos->s;
- int id = syscalltbl__id(trace->sctbl, sc);
+ int id = syscalltbl__id(trace->sctbl, sc), match_next = -1;
if (id < 0) {
+ id = syscalltbl__strglobmatch_first(trace->sctbl, sc, &match_next);
+ if (id >= 0)
+ goto matches;
+
if (err == 0) {
fputs("Error:\tInvalid syscall ", trace->output);
err = -EINVAL;
@@ -1290,13 +1296,37 @@ static int trace__validate_ev_qualifier(struct trace *trace)
fputs(sc, trace->output);
}
-
+matches:
trace->ev_qualifier_ids.entries[i++] = id;
+ if (match_next == -1)
+ continue;
+
+ while (1) {
+ id = syscalltbl__strglobmatch_next(trace->sctbl, sc, &match_next);
+ if (id < 0)
+ break;
+ if (nr_allocated == trace->ev_qualifier_ids.nr) {
+ void *entries;
+
+ nr_allocated += 8;
+ entries = realloc(trace->ev_qualifier_ids.entries,
+ nr_allocated * sizeof(trace->ev_qualifier_ids.entries[0]));
+ if (entries == NULL) {
+ err = -ENOMEM;
+ fputs("\nError:\t Not enough memory for parsing\n", trace->output);
+ goto out_free;
+ }
+ trace->ev_qualifier_ids.entries = entries;
+ }
+ trace->ev_qualifier_ids.nr++;
+ trace->ev_qualifier_ids.entries[i++] = id;
+ }
}
if (err < 0) {
fputs("\nHint:\ttry 'perf list syscalls:sys_enter_*'"
"\nHint:\tand: 'man syscalls'\n", trace->output);
+out_free:
zfree(&trace->ev_qualifier_ids.entries);
trace->ev_qualifier_ids.nr = 0;
}
@@ -2814,7 +2844,7 @@ static int trace__parse_events_option(const struct option *opt, const char *str,
struct trace *trace = (struct trace *)opt->value;
const char *s = str;
char *sep = NULL, *lists[2] = { NULL, NULL, };
- int len = strlen(str) + 1, err = -1, list;
+ int len = strlen(str) + 1, err = -1, list, idx;
char *strace_groups_dir = system_path(STRACE_GROUPS_DIR);
char group_name[PATH_MAX];
@@ -2831,7 +2861,8 @@ static int trace__parse_events_option(const struct option *opt, const char *str,
*sep = '\0';
list = 0;
- if (syscalltbl__id(trace->sctbl, s) >= 0) {
+ if (syscalltbl__id(trace->sctbl, s) >= 0 ||
+ syscalltbl__strglobmatch_first(trace->sctbl, s, &idx) >= 0) {
list = 1;
} else {
path__join(group_name, sizeof(group_name), strace_groups_dir, s);
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index e0279babe0c0..2f19e03c5c40 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -467,15 +467,21 @@ int main(int argc, const char **argv)
* - cannot execute it externally (since it would just do
* the same thing over again)
*
- * So we just directly call the internal command handler, and
- * die if that one cannot handle it.
+ * So we just directly call the internal command handler. If that one
+ * fails to handle this, then maybe we just run a renamed perf binary
+ * that contains a dash in its name. To handle this scenario, we just
+ * fall through and ignore the "xxxx" part of the command string.
*/
if (strstarts(cmd, "perf-")) {
cmd += 5;
argv[0] = cmd;
handle_internal_command(argc, argv);
- fprintf(stderr, "cannot handle %s internally", cmd);
- goto out;
+ /*
+ * If the command is handled, the above function does not
+ * return undo changes and fall through in such a case.
+ */
+ cmd -= 5;
+ argv[0] = cmd;
}
if (strstarts(cmd, "trace")) {
#ifdef HAVE_LIBAUDIT_SUPPORT
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index 2c010dd6a79d..dc442ba21bf6 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -43,6 +43,7 @@ struct record_opts {
bool no_samples;
bool raw_samples;
bool sample_address;
+ bool sample_phys_addr;
bool sample_weight;
bool sample_time;
bool sample_time_set;
diff --git a/tools/perf/pmu-events/arch/powerpc/power9/frontend.json b/tools/perf/pmu-events/arch/powerpc/power9/frontend.json
index 7e62c46d7a20..c63a919eda98 100644
--- a/tools/perf/pmu-events/arch/powerpc/power9/frontend.json
+++ b/tools/perf/pmu-events/arch/powerpc/power9/frontend.json
@@ -80,11 +80,6 @@
"BriefDescription": "Load Missed L1, counted at execution time (can be greater than loads finished). LMQ merges are not included in this count. i.e. if a load instruction misses on an address that is already allocated on the LMQ, this event will not increment for that load). Note that this count is per slice, so if a load spans multiple slices this event will increment multiple times for a single load."
},
{,
- "EventCode": "0x400F0",
- "EventName": "PM_LD_MISS_L1",
- "BriefDescription": "Load Missed L1, counted at execution time (can be greater than loads finished). LMQ merges are not included in this count. i.e. if a load instruction misses on an address that is already allocated on the LMQ, this event will not increment for that load). Note that this count is per slice, so if a load spans multiple slices this event will increment multiple times for a single load."
- },
- {,
"EventCode": "0x2E01A",
"EventName": "PM_CMPLU_STALL_LSU_FLUSH_NEXT",
"BriefDescription": "Completion stall of one cycle because the LSU requested to flush the next iop in the sequence. It takes 1 cycle for the ISU to process this request before the LSU instruction is allowed to complete"
@@ -374,4 +369,4 @@
"EventName": "PM_IPTEG_FROM_L31_ECO_MOD",
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another core's ECO L3 on the same chip due to a instruction side request"
}
-] \ No newline at end of file
+]
diff --git a/tools/perf/pmu-events/arch/powerpc/power9/other.json b/tools/perf/pmu-events/arch/powerpc/power9/other.json
index 00f3d2a21f31..54cc3be00fc2 100644
--- a/tools/perf/pmu-events/arch/powerpc/power9/other.json
+++ b/tools/perf/pmu-events/arch/powerpc/power9/other.json
@@ -605,11 +605,6 @@
"BriefDescription": "RC retries on PB for any load from core (excludes DCBFs)"
},
{,
- "EventCode": "0x3689E",
- "EventName": "PM_L2_RTY_LD",
- "BriefDescription": "RC retries on PB for any load from core (excludes DCBFs)"
- },
- {,
"EventCode": "0xE08C",
"EventName": "PM_LSU0_ERAT_HIT",
"BriefDescription": "Primary ERAT hit. There is no secondary ERAT"
@@ -715,11 +710,6 @@
"BriefDescription": "Lifetime, sample of RD machine 0 valid"
},
{,
- "EventCode": "0x468B4",
- "EventName": "PM_L3_RD0_BUSY",
- "BriefDescription": "Lifetime, sample of RD machine 0 valid"
- },
- {,
"EventCode": "0x46080",
"EventName": "PM_L2_DISP_ALL_L2MISS",
"BriefDescription": "All successful Ld/St dispatches for this thread that were an L2 miss (excludes i_l2mru_tch_reqs)"
@@ -850,21 +840,11 @@
"BriefDescription": "RC mach 0 Busy. Used by PMU to sample ave RC lifetime (mach0 used as sample point)"
},
{,
- "EventCode": "0x2608C",
- "EventName": "PM_RC0_BUSY",
- "BriefDescription": "RC mach 0 Busy. Used by PMU to sample ave RC lifetime (mach0 used as sample point)"
- },
- {,
"EventCode": "0x36082",
"EventName": "PM_L2_LD_DISP",
"BriefDescription": "All successful I-or-D side load dispatches for this thread (excludes i_l2mru_tch_reqs)."
},
{,
- "EventCode": "0x1609E",
- "EventName": "PM_L2_LD_DISP",
- "BriefDescription": "All successful D side load dispatches for this thread (L2 miss + L2 hits)"
- },
- {,
"EventCode": "0xF8B0",
"EventName": "PM_L3_SW_PREF",
"BriefDescription": "L3 load prefetch, sourced from a software prefetch stream, was sent to the nest"
@@ -1040,11 +1020,6 @@
"BriefDescription": "L3 castouts in Mepf state for this thread"
},
{,
- "EventCode": "0x168A0",
- "EventName": "PM_L3_CO_MEPF",
- "BriefDescription": "L3 CO of line in Mep state (includes casthrough to memory). The Mepf state indicates that a line was brought in to satisfy an L3 prefetch request"
- },
- {,
"EventCode": "0x460A2",
"EventName": "PM_L3_LAT_CI_HIT",
"BriefDescription": "L3 Lateral Castins Hit"
@@ -1150,11 +1125,6 @@
"BriefDescription": "RC retries on PB for any store from core (excludes DCBFs)"
},
{,
- "EventCode": "0x4689E",
- "EventName": "PM_L2_RTY_ST",
- "BriefDescription": "RC retries on PB for any store from core (excludes DCBFs)"
- },
- {,
"EventCode": "0x24040",
"EventName": "PM_INST_FROM_L2_MEPF",
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state. due to an instruction fetch (not prefetch)"
@@ -1255,11 +1225,6 @@
"BriefDescription": "CO mach 0 Busy. Used by PMU to sample ave CO lifetime (mach0 used as sample point)"
},
{,
- "EventCode": "0x4608C",
- "EventName": "PM_CO0_BUSY",
- "BriefDescription": "CO mach 0 Busy. Used by PMU to sample ave CO lifetime (mach0 used as sample point)"
- },
- {,
"EventCode": "0x2C122",
"EventName": "PM_MRK_DATA_FROM_L3_DISP_CONFLICT_CYC",
"BriefDescription": "Duration in cycles to reload from local core's L3 with dispatch conflict due to a marked load"
@@ -1395,11 +1360,6 @@
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's Memory due to a instruction side request"
},
{,
- "EventCode": "0x40006",
- "EventName": "PM_ISLB_MISS",
- "BriefDescription": "Number of ISLB misses for this thread"
- },
- {,
"EventCode": "0xD8A8",
"EventName": "PM_ISLB_MISS",
"BriefDescription": "Instruction SLB miss - Total of all segment sizes"
@@ -1515,11 +1475,6 @@
"BriefDescription": "All successful I-side dispatches for this thread (excludes i_l2mru_tch reqs)."
},
{,
- "EventCode": "0x3609E",
- "EventName": "PM_L2_INST",
- "BriefDescription": "All successful I-side dispatches that were an L2 miss for this thread (excludes i_l2mru_tch reqs)"
- },
- {,
"EventCode": "0x3504C",
"EventName": "PM_IPTEG_FROM_DL4",
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on a different Node or Group (Distant) due to a instruction side request"
@@ -1690,11 +1645,6 @@
"BriefDescription": "All successful I-or-D side load dispatches for this thread that were L2 hits (excludes i_l2mru_tch_reqs)"
},
{,
- "EventCode": "0x2609E",
- "EventName": "PM_L2_LD_HIT",
- "BriefDescription": "All successful D side load dispatches for this thread that were L2 hits for this thread"
- },
- {,
"EventCode": "0x168AC",
"EventName": "PM_L3_CI_USAGE",
"BriefDescription": "Rotating sample of 16 CI or CO actives"
@@ -1795,21 +1745,11 @@
"BriefDescription": "Rotating sample of 8 WI valid"
},
{,
- "EventCode": "0x260B6",
- "EventName": "PM_L3_WI0_BUSY",
- "BriefDescription": "Rotating sample of 8 WI valid (duplicate)"
- },
- {,
"EventCode": "0x368AC",
"EventName": "PM_L3_CO0_BUSY",
"BriefDescription": "Lifetime, sample of CO machine 0 valid"
},
{,
- "EventCode": "0x468AC",
- "EventName": "PM_L3_CO0_BUSY",
- "BriefDescription": "Lifetime, sample of CO machine 0 valid"
- },
- {,
"EventCode": "0x2E040",
"EventName": "PM_DPTEG_FROM_L2_MEPF",
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 hit without dispatch conflicts on Mepf state. due to a data side request. When using Radix Page Translation, this count excludes PDE reloads. Only PTE reloads are included"
@@ -1840,11 +1780,6 @@
"BriefDescription": "L3 PF received retry port 0, every retry counted"
},
{,
- "EventCode": "0x260AE",
- "EventName": "PM_L3_P0_PF_RTY",
- "BriefDescription": "L3 PF received retry port 0, every retry counted"
- },
- {,
"EventCode": "0x268B2",
"EventName": "PM_L3_LOC_GUESS_WRONG",
"BriefDescription": "Initial scope=node (LNS) but data from out side local node (near or far or rem). Prediction too Low"
@@ -1895,11 +1830,6 @@
"BriefDescription": "Lifetime, sample of snooper machine 0 valid"
},
{,
- "EventCode": "0x460AC",
- "EventName": "PM_L3_SN0_BUSY",
- "BriefDescription": "Lifetime, sample of snooper machine 0 valid"
- },
- {,
"EventCode": "0x3005C",
"EventName": "PM_BFU_BUSY",
"BriefDescription": "Cycles in which all 4 Binary Floating Point units are busy. The BFU is running at capacity"
@@ -1935,11 +1865,6 @@
"BriefDescription": "Lifetime, sample of PF machine 0 valid"
},
{,
- "EventCode": "0x460B4",
- "EventName": "PM_L3_PF0_BUSY",
- "BriefDescription": "Lifetime, sample of PF machine 0 valid"
- },
- {,
"EventCode": "0xC0B0",
"EventName": "PM_LSU_FLUSH_UE",
"BriefDescription": "Correctable ECC error on reload data, reported at critical data forward time"
@@ -2085,11 +2010,6 @@
"BriefDescription": "L3 CO received retry port 1 (memory only), every retry counted"
},
{,
- "EventCode": "0x468AE",
- "EventName": "PM_L3_P1_CO_RTY",
- "BriefDescription": "L3 CO received retry port 3 (memory only), every retry counted"
- },
- {,
"EventCode": "0xC0AC",
"EventName": "PM_LSU_FLUSH_EMSH",
"BriefDescription": "An ERAT miss was detected after a set-p hit. Erat tracker indicates fail due to tlbmiss and the instruction gets flushed because the instruction was working on the wrong address"
@@ -2195,11 +2115,6 @@
"BriefDescription": "SNP dispatched for a write and was M (true M); for DMA cacheinj this will pulse if rty/push is required (won't pulse if cacheinj is accepted)"
},
{,
- "EventCode": "0x46886",
- "EventName": "PM_L2_SN_M_WR_DONE",
- "BriefDescription": "SNP dispatched for a write and was M (true M); for DMA cacheinj this will pulse if rty/push is required (won't pulse if cacheinj is accepted)"
- },
- {,
"EventCode": "0x489C",
"EventName": "PM_BR_CORECT_PRED_TAKEN_CMPL",
"BriefDescription": "Conditional Branch Completed in which the HW correctly predicted the direction as taken. Counted at completion time"
@@ -2290,21 +2205,11 @@
"BriefDescription": "SN mach 0 Busy. Used by PMU to sample ave SN lifetime (mach0 used as sample point)"
},
{,
- "EventCode": "0x26090",
- "EventName": "PM_SN0_BUSY",
- "BriefDescription": "SN mach 0 Busy. Used by PMU to sample ave SN lifetime (mach0 used as sample point)"
- },
- {,
"EventCode": "0x360AE",
"EventName": "PM_L3_P0_CO_RTY",
"BriefDescription": "L3 CO received retry port 0 (memory only), every retry counted"
},
{,
- "EventCode": "0x460AE",
- "EventName": "PM_L3_P0_CO_RTY",
- "BriefDescription": "L3 CO received retry port 0 (memory only), every retry counted"
- },
- {,
"EventCode": "0x168A8",
"EventName": "PM_L3_WI_USAGE",
"BriefDescription": "Lifetime, sample of Write Inject machine 0 valid"
@@ -2340,26 +2245,11 @@
"BriefDescription": "L3 PF received retry port 1, every retry counted"
},
{,
- "EventCode": "0x268AE",
- "EventName": "PM_L3_P1_PF_RTY",
- "BriefDescription": "L3 PF received retry port 3, every retry counted"
- },
- {,
"EventCode": "0x46082",
"EventName": "PM_L2_ST_DISP",
"BriefDescription": "All successful D-side store dispatches for this thread "
},
{,
- "EventCode": "0x1689E",
- "EventName": "PM_L2_ST_DISP",
- "BriefDescription": "All successful D-side store dispatches for this thread (L2 miss + L2 hits)"
- },
- {,
- "EventCode": "0x36880",
- "EventName": "PM_L2_INST_MISS",
- "BriefDescription": "All successful I-side dispatches that were an L2 miss for this thread (excludes i_l2mru_tch reqs)"
- },
- {,
"EventCode": "0x4609E",
"EventName": "PM_L2_INST_MISS",
"BriefDescription": "All successful I-side dispatches that were an L2 miss for this thread (excludes i_l2mru_tch reqs)"
@@ -2430,11 +2320,6 @@
"BriefDescription": "# PPC Dispatched"
},
{,
- "EventCode": "0x300F2",
- "EventName": "PM_INST_DISP",
- "BriefDescription": "# PPC Dispatched"
- },
- {,
"EventCode": "0x4E05E",
"EventName": "PM_TM_OUTER_TBEGIN_DISP",
"BriefDescription": "Number of outer tbegin instructions dispatched. The dispatch unit determines whether the tbegin instruction is outer or nested. This is a speculative count, which includes flushed instructions"
@@ -2460,11 +2345,6 @@
"BriefDescription": "All successful D-side store dispatches for this thread that were L2 hits"
},
{,
- "EventCode": "0x2689E",
- "EventName": "PM_L2_ST_HIT",
- "BriefDescription": "All successful D-side store dispatches that were L2 hits for this thread"
- },
- {,
"EventCode": "0x360A8",
"EventName": "PM_L3_CO",
"BriefDescription": "L3 castout occurring (does not include casthrough or log writes (cinj/dmaw))"
diff --git a/tools/perf/pmu-events/arch/powerpc/power9/pipeline.json b/tools/perf/pmu-events/arch/powerpc/power9/pipeline.json
index 47a82568a8df..bc2db636dabf 100644
--- a/tools/perf/pmu-events/arch/powerpc/power9/pipeline.json
+++ b/tools/perf/pmu-events/arch/powerpc/power9/pipeline.json
@@ -420,11 +420,6 @@
"BriefDescription": "Final Pump Scope (Group) ended up larger than Initial Pump Scope (Chip) for an instruction fetch"
},
{,
- "EventCode": "0x10016",
- "EventName": "PM_DSLB_MISS",
- "BriefDescription": "Data SLB Miss - Total of all segment sizes"
- },
- {,
"EventCode": "0xD0A8",
"EventName": "PM_DSLB_MISS",
"BriefDescription": "Data SLB Miss - Total of all segment sizes"
@@ -554,4 +549,4 @@
"EventName": "PM_MRK_DATA_FROM_L21_SHR_CYC",
"BriefDescription": "Duration in cycles to reload with Shared (S) data from another core's L2 on the same chip due to a marked load"
}
-] \ No newline at end of file
+]
diff --git a/tools/perf/pmu-events/arch/powerpc/power9/pmc.json b/tools/perf/pmu-events/arch/powerpc/power9/pmc.json
index a2c95a99e168..3ef8a10aac86 100644
--- a/tools/perf/pmu-events/arch/powerpc/power9/pmc.json
+++ b/tools/perf/pmu-events/arch/powerpc/power9/pmc.json
@@ -5,11 +5,6 @@
"BriefDescription": "Branches that are not strongly biased"
},
{,
- "EventCode": "0x40036",
- "EventName": "PM_BR_2PATH",
- "BriefDescription": "Branches that are not strongly biased"
- },
- {,
"EventCode": "0x40056",
"EventName": "PM_MEM_LOC_THRESH_LSU_HIGH",
"BriefDescription": "Local memory above threshold for LSU medium"
@@ -124,4 +119,4 @@
"EventName": "PM_1FLOP_CMPL",
"BriefDescription": "one flop (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg) operation completed"
}
-] \ No newline at end of file
+]
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 761c5a448c56..466a462b26d1 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -237,6 +237,11 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
thread__find_addr_map(thread, cpumode, MAP__FUNCTION, addr, &al);
if (!al.map || !al.map->dso) {
+ if (cpumode == PERF_RECORD_MISC_HYPERVISOR) {
+ pr_debug("Hypervisor address can not be resolved - skipping\n");
+ return 0;
+ }
+
pr_debug("thread__find_addr_map failed\n");
return -1;
}
diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
index 2a7b9b47bbcb..9ba1d216a89f 100644
--- a/tools/perf/tests/dwarf-unwind.c
+++ b/tools/perf/tests/dwarf-unwind.c
@@ -6,7 +6,7 @@
#include "debug.h"
#include "machine.h"
#include "event.h"
-#include "unwind.h"
+#include "../util/unwind.h"
#include "perf_regs.h"
#include "map.h"
#include "thread.h"
diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-parsing.c
index 6d028f42b3cf..c3858487159d 100644
--- a/tools/perf/tests/sample-parsing.c
+++ b/tools/perf/tests/sample-parsing.c
@@ -141,6 +141,9 @@ static bool samples_same(const struct perf_sample *s1,
}
}
+ if (type & PERF_SAMPLE_PHYS_ADDR)
+ COMP(phys_addr);
+
return true;
}
@@ -206,6 +209,7 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 read_format)
.mask = sample_regs,
.regs = regs,
},
+ .phys_addr = 113,
};
struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},};
struct perf_sample sample_out;
@@ -305,7 +309,7 @@ int test__sample_parsing(struct test *test __maybe_unused, int subtest __maybe_u
* were added. Please actually update the test rather than just change
* the condition below.
*/
- if (PERF_SAMPLE_MAX > PERF_SAMPLE_REGS_INTR << 1) {
+ if (PERF_SAMPLE_MAX > PERF_SAMPLE_PHYS_ADDR << 1) {
pr_debug("sample format has changed, some new PERF_SAMPLE_ bit was introduced - test needs updating\n");
return -1;
}
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
index ba0aee576a2b..786fecaf578e 100644
--- a/tools/perf/ui/browsers/annotate.c
+++ b/tools/perf/ui/browsers/annotate.c
@@ -829,7 +829,8 @@ static int annotate_browser__run(struct annotate_browser *browser,
"q/ESC/CTRL+C Exit\n\n"
"ENTER Go to target\n"
"ESC Exit\n"
- "H Cycle thru hottest instructions\n"
+ "H Go to hottest instruction\n"
+ "TAB/shift+TAB Cycle thru hottest instructions\n"
"j Toggle showing jump to target arrows\n"
"J Toggle showing number of jump sources on targets\n"
"n Search next string\n"
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index f4bc2462bc2c..13dfb0a0bdeb 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -931,12 +931,8 @@ static int hist_browser__show_callchain_list(struct hist_browser *browser,
browser->show_dso);
if (symbol_conf.show_branchflag_count) {
- if (need_percent)
- callchain_list_counts__printf_value(node, chain, NULL,
- buf, sizeof(buf));
- else
- callchain_list_counts__printf_value(NULL, chain, NULL,
- buf, sizeof(buf));
+ callchain_list_counts__printf_value(chain, NULL,
+ buf, sizeof(buf));
if (asprintf(&alloc_str2, "%s%s", str, buf) < 0)
str = "Not enough memory!";
diff --git a/tools/perf/ui/progress.c b/tools/perf/ui/progress.c
index a0f24c7115c5..ae91c8148edf 100644
--- a/tools/perf/ui/progress.c
+++ b/tools/perf/ui/progress.c
@@ -1,3 +1,4 @@
+#include <linux/kernel.h>
#include "../cache.h"
#include "progress.h"
@@ -14,10 +15,14 @@ struct ui_progress_ops *ui_progress__ops = &null_progress__ops;
void ui_progress__update(struct ui_progress *p, u64 adv)
{
+ u64 last = p->curr;
+
p->curr += adv;
if (p->curr >= p->next) {
- p->next += p->step;
+ u64 nr = DIV_ROUND_UP(p->curr - last, p->step);
+
+ p->next += nr * p->step;
ui_progress__ops->update(p);
}
}
@@ -25,7 +30,7 @@ void ui_progress__update(struct ui_progress *p, u64 adv)
void ui_progress__init(struct ui_progress *p, u64 total, const char *title)
{
p->curr = 0;
- p->next = p->step = total / 16;
+ p->next = p->step = total / 16 ?: 1;
p->total = total;
p->title = title;
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 5c95b8301c67..8bdb7a500181 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -124,12 +124,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_node *node,
str = callchain_list__sym_name(chain, bf, sizeof(bf), false);
if (symbol_conf.show_branchflag_count) {
- if (!period)
- callchain_list_counts__printf_value(node, chain, NULL,
- buf, sizeof(buf));
- else
- callchain_list_counts__printf_value(NULL, chain, NULL,
- buf, sizeof(buf));
+ callchain_list_counts__printf_value(chain, NULL,
+ buf, sizeof(buf));
if (asprintf(&alloc_str, "%s%s", str, buf) < 0)
str = "Not enough memory!";
@@ -313,7 +309,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root,
if (symbol_conf.show_branchflag_count)
ret += callchain_list_counts__printf_value(
- NULL, chain, fp, NULL, 0);
+ chain, fp, NULL, 0);
ret += fprintf(fp, "\n");
if (++entries_printed == callchain_param.print_limit)
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index f320b0777e0d..be09d77cade0 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -65,8 +65,6 @@ static int parse_callchain_mode(const char *value)
callchain_param.mode = CHAIN_FOLDED;
return 0;
}
-
- pr_err("Invalid callchain mode: %s\n", value);
return -1;
}
@@ -82,8 +80,6 @@ static int parse_callchain_order(const char *value)
callchain_param.order_set = true;
return 0;
}
-
- pr_err("Invalid callchain order: %s\n", value);
return -1;
}
@@ -105,8 +101,6 @@ static int parse_callchain_sort_key(const char *value)
callchain_param.branch_callstack = 1;
return 0;
}
-
- pr_err("Invalid callchain sort key: %s\n", value);
return -1;
}
@@ -124,8 +118,6 @@ static int parse_callchain_value(const char *value)
callchain_param.value = CCVAL_COUNT;
return 0;
}
-
- pr_err("Invalid callchain config key: %s\n", value);
return -1;
}
@@ -319,12 +311,27 @@ int perf_callchain_config(const char *var, const char *value)
return ret;
}
- if (!strcmp(var, "print-type"))
- return parse_callchain_mode(value);
- if (!strcmp(var, "order"))
- return parse_callchain_order(value);
- if (!strcmp(var, "sort-key"))
- return parse_callchain_sort_key(value);
+ if (!strcmp(var, "print-type")){
+ int ret;
+ ret = parse_callchain_mode(value);
+ if (ret == -1)
+ pr_err("Invalid callchain mode: %s\n", value);
+ return ret;
+ }
+ if (!strcmp(var, "order")){
+ int ret;
+ ret = parse_callchain_order(value);
+ if (ret == -1)
+ pr_err("Invalid callchain order: %s\n", value);
+ return ret;
+ }
+ if (!strcmp(var, "sort-key")){
+ int ret;
+ ret = parse_callchain_sort_key(value);
+ if (ret == -1)
+ pr_err("Invalid callchain sort key: %s\n", value);
+ return ret;
+ }
if (!strcmp(var, "threshold")) {
callchain_param.min_percent = strtod(value, &endptr);
if (value == endptr) {
@@ -588,7 +595,7 @@ fill_node(struct callchain_node *node, struct callchain_cursor *cursor)
call->cycles_count =
cursor_node->branch_flags.cycles;
call->iter_count = cursor_node->nr_loop_iter;
- call->samples_count = cursor_node->samples;
+ call->iter_cycles = cursor_node->iter_cycles;
}
}
@@ -722,7 +729,7 @@ static enum match_result match_chain(struct callchain_cursor_node *node,
cnode->cycles_count +=
node->branch_flags.cycles;
cnode->iter_count += node->nr_loop_iter;
- cnode->samples_count += node->samples;
+ cnode->iter_cycles += node->iter_cycles;
}
}
@@ -998,7 +1005,7 @@ int callchain_merge(struct callchain_cursor *cursor,
int callchain_cursor_append(struct callchain_cursor *cursor,
u64 ip, struct map *map, struct symbol *sym,
bool branch, struct branch_flags *flags,
- int nr_loop_iter, int samples, u64 branch_from)
+ int nr_loop_iter, u64 iter_cycles, u64 branch_from)
{
struct callchain_cursor_node *node = *cursor->last;
@@ -1016,7 +1023,7 @@ int callchain_cursor_append(struct callchain_cursor *cursor,
node->sym = sym;
node->branch = branch;
node->nr_loop_iter = nr_loop_iter;
- node->samples = samples;
+ node->iter_cycles = iter_cycles;
if (flags)
memcpy(&node->branch_flags, flags,
@@ -1306,7 +1313,7 @@ static int branch_to_str(char *bf, int bfsize,
static int branch_from_str(char *bf, int bfsize,
u64 branch_count,
u64 cycles_count, u64 iter_count,
- u64 samples_count)
+ u64 iter_cycles)
{
int printed = 0, i = 0;
u64 cycles;
@@ -1318,9 +1325,13 @@ static int branch_from_str(char *bf, int bfsize,
bf + printed, bfsize - printed);
}
- if (iter_count && samples_count) {
- printed += count_pri64_printf(i++, "iterations",
- iter_count / samples_count,
+ if (iter_count) {
+ printed += count_pri64_printf(i++, "iter",
+ iter_count,
+ bf + printed, bfsize - printed);
+
+ printed += count_pri64_printf(i++, "avg_cycles",
+ iter_cycles / iter_count,
bf + printed, bfsize - printed);
}
@@ -1333,7 +1344,7 @@ static int branch_from_str(char *bf, int bfsize,
static int counts_str_build(char *bf, int bfsize,
u64 branch_count, u64 predicted_count,
u64 abort_count, u64 cycles_count,
- u64 iter_count, u64 samples_count,
+ u64 iter_count, u64 iter_cycles,
struct branch_type_stat *brtype_stat)
{
int printed;
@@ -1346,7 +1357,7 @@ static int counts_str_build(char *bf, int bfsize,
predicted_count, abort_count, brtype_stat);
} else {
printed = branch_from_str(bf, bfsize, branch_count,
- cycles_count, iter_count, samples_count);
+ cycles_count, iter_count, iter_cycles);
}
if (!printed)
@@ -1358,14 +1369,14 @@ static int counts_str_build(char *bf, int bfsize,
static int callchain_counts_printf(FILE *fp, char *bf, int bfsize,
u64 branch_count, u64 predicted_count,
u64 abort_count, u64 cycles_count,
- u64 iter_count, u64 samples_count,
+ u64 iter_count, u64 iter_cycles,
struct branch_type_stat *brtype_stat)
{
char str[256];
counts_str_build(str, sizeof(str), branch_count,
predicted_count, abort_count, cycles_count,
- iter_count, samples_count, brtype_stat);
+ iter_count, iter_cycles, brtype_stat);
if (fp)
return fprintf(fp, "%s", str);
@@ -1373,31 +1384,23 @@ static int callchain_counts_printf(FILE *fp, char *bf, int bfsize,
return scnprintf(bf, bfsize, "%s", str);
}
-int callchain_list_counts__printf_value(struct callchain_node *node,
- struct callchain_list *clist,
+int callchain_list_counts__printf_value(struct callchain_list *clist,
FILE *fp, char *bf, int bfsize)
{
u64 branch_count, predicted_count;
u64 abort_count, cycles_count;
- u64 iter_count = 0, samples_count = 0;
+ u64 iter_count, iter_cycles;
branch_count = clist->branch_count;
predicted_count = clist->predicted_count;
abort_count = clist->abort_count;
cycles_count = clist->cycles_count;
-
- if (node) {
- struct callchain_list *call;
-
- list_for_each_entry(call, &node->val, list) {
- iter_count += call->iter_count;
- samples_count += call->samples_count;
- }
- }
+ iter_count = clist->iter_count;
+ iter_cycles = clist->iter_cycles;
return callchain_counts_printf(fp, bf, bfsize, branch_count,
predicted_count, abort_count,
- cycles_count, iter_count, samples_count,
+ cycles_count, iter_count, iter_cycles,
&clist->brtype_stat);
}
@@ -1523,7 +1526,8 @@ int callchain_cursor__copy(struct callchain_cursor *dst,
rc = callchain_cursor_append(dst, node->ip, node->map, node->sym,
node->branch, &node->branch_flags,
- node->nr_loop_iter, node->samples,
+ node->nr_loop_iter,
+ node->iter_cycles,
node->branch_from);
if (rc)
break;
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 97738201464a..1ed6fc61d0a5 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -119,7 +119,7 @@ struct callchain_list {
u64 abort_count;
u64 cycles_count;
u64 iter_count;
- u64 samples_count;
+ u64 iter_cycles;
struct branch_type_stat brtype_stat;
char *srcline;
struct list_head list;
@@ -139,7 +139,7 @@ struct callchain_cursor_node {
struct branch_flags branch_flags;
u64 branch_from;
int nr_loop_iter;
- int samples;
+ u64 iter_cycles;
struct callchain_cursor_node *next;
};
@@ -201,7 +201,7 @@ static inline void callchain_cursor_reset(struct callchain_cursor *cursor)
int callchain_cursor_append(struct callchain_cursor *cursor, u64 ip,
struct map *map, struct symbol *sym,
bool branch, struct branch_flags *flags,
- int nr_loop_iter, int samples, u64 branch_from);
+ int nr_loop_iter, u64 iter_cycles, u64 branch_from);
/* Close a cursor writing session. Initialize for the reader */
static inline void callchain_cursor_commit(struct callchain_cursor *cursor)
@@ -282,8 +282,7 @@ char *callchain_node__scnprintf_value(struct callchain_node *node,
int callchain_node__fprintf_value(struct callchain_node *node,
FILE *fp, u64 total);
-int callchain_list_counts__printf_value(struct callchain_node *node,
- struct callchain_list *clist,
+int callchain_list_counts__printf_value(struct callchain_list *clist,
FILE *fp, char *bf, int bfsize);
void free_callchain(struct callchain_root *root);
diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
index e84bbc8ec058..263f5a906ba5 100644
--- a/tools/perf/util/data.c
+++ b/tools/perf/util/data.c
@@ -10,6 +10,16 @@
#include "util.h"
#include "debug.h"
+#ifndef O_CLOEXEC
+#ifdef __sparc__
+#define O_CLOEXEC 0x400000
+#elif defined(__alpha__) || defined(__hppa__)
+#define O_CLOEXEC 010000000
+#else
+#define O_CLOEXEC 02000000
+#endif
+#endif
+
static bool check_pipe(struct perf_data_file *file)
{
struct stat st;
@@ -96,7 +106,8 @@ static int open_file_write(struct perf_data_file *file)
if (check_backup(file))
return -1;
- fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
+ fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC,
+ S_IRUSR|S_IWUSR);
if (fd < 0)
pr_err("failed to open %s : %s\n", file->path,
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 423ac82605f3..ee7bcc898d35 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -200,6 +200,7 @@ struct perf_sample {
u32 cpu;
u32 raw_size;
u64 data_src;
+ u64 phys_addr;
u32 flags;
u16 insn_len;
u8 cpumode;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index d9bd632ed7db..0dccdb89572c 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -271,12 +271,17 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
return evsel;
}
+static bool perf_event_can_profile_kernel(void)
+{
+ return geteuid() == 0 || perf_event_paranoid() == -1;
+}
+
struct perf_evsel *perf_evsel__new_cycles(bool precise)
{
struct perf_event_attr attr = {
.type = PERF_TYPE_HARDWARE,
.config = PERF_COUNT_HW_CPU_CYCLES,
- .exclude_kernel = geteuid() != 0,
+ .exclude_kernel = !perf_event_can_profile_kernel(),
};
struct perf_evsel *evsel;
@@ -955,6 +960,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
if (opts->sample_address)
perf_evsel__set_sample_bit(evsel, DATA_SRC);
+ if (opts->sample_phys_addr)
+ perf_evsel__set_sample_bit(evsel, PHYS_ADDR);
+
if (opts->no_buffering) {
attr->watermark = 0;
attr->wakeup_events = 1;
@@ -1464,7 +1472,7 @@ static void __p_sample_type(char *buf, size_t size, u64 value)
bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW),
bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER),
bit_name(IDENTIFIER), bit_name(REGS_INTR), bit_name(DATA_SRC),
- bit_name(WEIGHT),
+ bit_name(WEIGHT), bit_name(PHYS_ADDR),
{ .name = NULL, }
};
#undef bit_name
@@ -2206,6 +2214,12 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
}
}
+ data->phys_addr = 0;
+ if (type & PERF_SAMPLE_PHYS_ADDR) {
+ data->phys_addr = *array;
+ array++;
+ }
+
return 0;
}
@@ -2311,6 +2325,9 @@ size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
}
}
+ if (type & PERF_SAMPLE_PHYS_ADDR)
+ result += sizeof(u64);
+
return result;
}
@@ -2500,6 +2517,11 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
}
}
+ if (type & PERF_SAMPLE_PHYS_ADDR) {
+ *array = sample->phys_addr;
+ array++;
+ }
+
return 0;
}
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 351d3b2d8887..dd2c4b5112a5 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -131,6 +131,7 @@ struct perf_evsel {
bool cmdline_group_boundary;
struct list_head config_terms;
int bpf_fd;
+ bool auto_merge_stats;
bool merged_stat;
const char * metric_expr;
const char * metric_name;
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 9453b2e27015..e60d8d8ea4c2 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -167,6 +167,10 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
symlen = unresolved_col_width + 4 + 2;
hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO);
}
+
+ hists__new_col_len(hists, HISTC_MEM_PHYS_DADDR,
+ unresolved_col_width + 4 + 2);
+
} else {
symlen = unresolved_col_width + 4 + 2;
hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, symlen);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index ee3670a388df..e60dda26a920 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -47,6 +47,7 @@ enum hist_column {
HISTC_GLOBAL_WEIGHT,
HISTC_MEM_DADDR_SYMBOL,
HISTC_MEM_DADDR_DSO,
+ HISTC_MEM_PHYS_DADDR,
HISTC_MEM_LOCKED,
HISTC_MEM_TLB,
HISTC_MEM_LVL,
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 5c8eacaca4f4..df709363ef69 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1635,10 +1635,12 @@ static void ip__resolve_ams(struct thread *thread,
ams->al_addr = al.addr;
ams->sym = al.sym;
ams->map = al.map;
+ ams->phys_addr = 0;
}
static void ip__resolve_data(struct thread *thread,
- u8 m, struct addr_map_symbol *ams, u64 addr)
+ u8 m, struct addr_map_symbol *ams,
+ u64 addr, u64 phys_addr)
{
struct addr_location al;
@@ -1658,6 +1660,7 @@ static void ip__resolve_data(struct thread *thread,
ams->al_addr = al.addr;
ams->sym = al.sym;
ams->map = al.map;
+ ams->phys_addr = phys_addr;
}
struct mem_info *sample__resolve_mem(struct perf_sample *sample,
@@ -1669,12 +1672,18 @@ struct mem_info *sample__resolve_mem(struct perf_sample *sample,
return NULL;
ip__resolve_ams(al->thread, &mi->iaddr, sample->ip);
- ip__resolve_data(al->thread, al->cpumode, &mi->daddr, sample->addr);
+ ip__resolve_data(al->thread, al->cpumode, &mi->daddr,
+ sample->addr, sample->phys_addr);
mi->data_src.val = sample->data_src;
return mi;
}
+struct iterations {
+ int nr_loop_iter;
+ u64 cycles;
+};
+
static int add_callchain_ip(struct thread *thread,
struct callchain_cursor *cursor,
struct symbol **parent,
@@ -1683,11 +1692,12 @@ static int add_callchain_ip(struct thread *thread,
u64 ip,
bool branch,
struct branch_flags *flags,
- int nr_loop_iter,
- int samples,
+ struct iterations *iter,
u64 branch_from)
{
struct addr_location al;
+ int nr_loop_iter = 0;
+ u64 iter_cycles = 0;
al.filtered = 0;
al.sym = NULL;
@@ -1737,9 +1747,15 @@ static int add_callchain_ip(struct thread *thread,
if (symbol_conf.hide_unresolved && al.sym == NULL)
return 0;
+
+ if (iter) {
+ nr_loop_iter = iter->nr_loop_iter;
+ iter_cycles = iter->cycles;
+ }
+
return callchain_cursor_append(cursor, al.addr, al.map, al.sym,
- branch, flags, nr_loop_iter, samples,
- branch_from);
+ branch, flags, nr_loop_iter,
+ iter_cycles, branch_from);
}
struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
@@ -1760,6 +1776,18 @@ struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
return bi;
}
+static void save_iterations(struct iterations *iter,
+ struct branch_entry *be, int nr)
+{
+ int i;
+
+ iter->nr_loop_iter = nr;
+ iter->cycles = 0;
+
+ for (i = 0; i < nr; i++)
+ iter->cycles += be[i].flags.cycles;
+}
+
#define CHASHSZ 127
#define CHASHBITS 7
#define NO_ENTRY 0xff
@@ -1767,7 +1795,8 @@ struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
#define PERF_MAX_BRANCH_DEPTH 127
/* Remove loops. */
-static int remove_loops(struct branch_entry *l, int nr)
+static int remove_loops(struct branch_entry *l, int nr,
+ struct iterations *iter)
{
int i, j, off;
unsigned char chash[CHASHSZ];
@@ -1792,8 +1821,18 @@ static int remove_loops(struct branch_entry *l, int nr)
break;
}
if (is_loop) {
- memmove(l + i, l + i + off,
- (nr - (i + off)) * sizeof(*l));
+ j = nr - (i + off);
+ if (j > 0) {
+ save_iterations(iter + i + off,
+ l + i, off);
+
+ memmove(iter + i, iter + i + off,
+ j * sizeof(*iter));
+
+ memmove(l + i, l + i + off,
+ j * sizeof(*l));
+ }
+
nr -= off;
}
}
@@ -1883,7 +1922,7 @@ static int resolve_lbr_callchain_sample(struct thread *thread,
err = add_callchain_ip(thread, cursor, parent,
root_al, &cpumode, ip,
- branch, flags, 0, 0,
+ branch, flags, NULL,
branch_from);
if (err)
return (err < 0) ? err : 0;
@@ -1909,7 +1948,6 @@ static int thread__resolve_callchain_sample(struct thread *thread,
int i, j, err, nr_entries;
int skip_idx = -1;
int first_call = 0;
- int nr_loop_iter;
if (chain)
chain_nr = chain->nr;
@@ -1942,6 +1980,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,
if (branch && callchain_param.branch_callstack) {
int nr = min(max_stack, (int)branch->nr);
struct branch_entry be[nr];
+ struct iterations iter[nr];
if (branch->nr > PERF_MAX_BRANCH_DEPTH) {
pr_warning("corrupted branch chain. skipping...\n");
@@ -1972,38 +2011,21 @@ static int thread__resolve_callchain_sample(struct thread *thread,
be[i] = branch->entries[branch->nr - i - 1];
}
- nr_loop_iter = nr;
- nr = remove_loops(be, nr);
-
- /*
- * Get the number of iterations.
- * It's only approximation, but good enough in practice.
- */
- if (nr_loop_iter > nr)
- nr_loop_iter = nr_loop_iter - nr + 1;
- else
- nr_loop_iter = 0;
+ memset(iter, 0, sizeof(struct iterations) * nr);
+ nr = remove_loops(be, nr, iter);
for (i = 0; i < nr; i++) {
- if (i == nr - 1)
- err = add_callchain_ip(thread, cursor, parent,
- root_al,
- NULL, be[i].to,
- true, &be[i].flags,
- nr_loop_iter, 1,
- be[i].from);
- else
- err = add_callchain_ip(thread, cursor, parent,
- root_al,
- NULL, be[i].to,
- true, &be[i].flags,
- 0, 0, be[i].from);
+ err = add_callchain_ip(thread, cursor, parent,
+ root_al,
+ NULL, be[i].to,
+ true, &be[i].flags,
+ NULL, be[i].from);
if (!err)
err = add_callchain_ip(thread, cursor, parent, root_al,
NULL, be[i].from,
true, &be[i].flags,
- 0, 0, 0);
+ &iter[i], 0);
if (err == -EINVAL)
break;
if (err)
@@ -2037,7 +2059,7 @@ check_calls:
err = add_callchain_ip(thread, cursor, parent,
root_al, &cpumode, ip,
- false, NULL, 0, 0, 0);
+ false, NULL, NULL, 0);
if (err)
return (err < 0) ? err : 0;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index f44aeba51d1f..f6257fb4f08c 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -310,7 +310,7 @@ static struct perf_evsel *
__add_event(struct list_head *list, int *idx,
struct perf_event_attr *attr,
char *name, struct cpu_map *cpus,
- struct list_head *config_terms)
+ struct list_head *config_terms, bool auto_merge_stats)
{
struct perf_evsel *evsel;
@@ -324,6 +324,7 @@ __add_event(struct list_head *list, int *idx,
evsel->cpus = cpu_map__get(cpus);
evsel->own_cpus = cpu_map__get(cpus);
evsel->system_wide = !!cpus;
+ evsel->auto_merge_stats = auto_merge_stats;
if (name)
evsel->name = strdup(name);
@@ -339,7 +340,7 @@ static int add_event(struct list_head *list, int *idx,
struct perf_event_attr *attr, char *name,
struct list_head *config_terms)
{
- return __add_event(list, idx, attr, name, NULL, config_terms) ? 0 : -ENOMEM;
+ return __add_event(list, idx, attr, name, NULL, config_terms, false) ? 0 : -ENOMEM;
}
static int parse_aliases(char *str, const char *names[][PERF_EVSEL__MAX_ALIASES], int size)
@@ -1209,9 +1210,9 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
get_config_name(head_config), &config_terms);
}
-int parse_events_add_pmu(struct parse_events_state *parse_state,
+static int __parse_events_add_pmu(struct parse_events_state *parse_state,
struct list_head *list, char *name,
- struct list_head *head_config)
+ struct list_head *head_config, bool auto_merge_stats)
{
struct perf_event_attr attr;
struct perf_pmu_info info;
@@ -1232,7 +1233,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
if (!head_config) {
attr.type = pmu->type;
- evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu->cpus, NULL);
+ evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu->cpus, NULL, auto_merge_stats);
return evsel ? 0 : -ENOMEM;
}
@@ -1254,7 +1255,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
evsel = __add_event(list, &parse_state->idx, &attr,
get_config_name(head_config), pmu->cpus,
- &config_terms);
+ &config_terms, auto_merge_stats);
if (evsel) {
evsel->unit = info.unit;
evsel->scale = info.scale;
@@ -1267,6 +1268,13 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
return evsel ? 0 : -ENOMEM;
}
+int parse_events_add_pmu(struct parse_events_state *parse_state,
+ struct list_head *list, char *name,
+ struct list_head *head_config)
+{
+ return __parse_events_add_pmu(parse_state, list, name, head_config, false);
+}
+
int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
char *str, struct list_head **listp)
{
@@ -1296,8 +1304,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
return -1;
list_add_tail(&term->list, head);
- if (!parse_events_add_pmu(parse_state, list,
- pmu->name, head)) {
+ if (!__parse_events_add_pmu(parse_state, list,
+ pmu->name, head, true)) {
pr_debug("%s -> %s/%s/\n", str,
pmu->name, alias->str);
ok++;
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index ac863691605f..a7ebd9fe8e40 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1120,6 +1120,9 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
if (sample_type & PERF_SAMPLE_DATA_SRC)
printf(" . data_src: 0x%"PRIx64"\n", sample->data_src);
+ if (sample_type & PERF_SAMPLE_PHYS_ADDR)
+ printf(" .. phys_addr: 0x%"PRIx64"\n", sample->phys_addr);
+
if (sample_type & PERF_SAMPLE_TRANSACTION)
printf("... transaction: %" PRIx64 "\n", sample->transaction);
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 12359bd986db..eb3ab902a1c0 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1316,6 +1316,47 @@ struct sort_entry sort_mem_dcacheline = {
};
static int64_t
+sort__phys_daddr_cmp(struct hist_entry *left, struct hist_entry *right)
+{
+ uint64_t l = 0, r = 0;
+
+ if (left->mem_info)
+ l = left->mem_info->daddr.phys_addr;
+ if (right->mem_info)
+ r = right->mem_info->daddr.phys_addr;
+
+ return (int64_t)(r - l);
+}
+
+static int hist_entry__phys_daddr_snprintf(struct hist_entry *he, char *bf,
+ size_t size, unsigned int width)
+{
+ uint64_t addr = 0;
+ size_t ret = 0;
+ size_t len = BITS_PER_LONG / 4;
+
+ addr = he->mem_info->daddr.phys_addr;
+
+ ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", he->level);
+
+ ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", len, addr);
+
+ ret += repsep_snprintf(bf + ret, size - ret, "%-*s", width - ret, "");
+
+ if (ret > width)
+ bf[width] = '\0';
+
+ return width;
+}
+
+struct sort_entry sort_mem_phys_daddr = {
+ .se_header = "Data Physical Address",
+ .se_cmp = sort__phys_daddr_cmp,
+ .se_snprintf = hist_entry__phys_daddr_snprintf,
+ .se_width_idx = HISTC_MEM_PHYS_DADDR,
+};
+
+static int64_t
sort__abort_cmp(struct hist_entry *left, struct hist_entry *right)
{
if (!left->branch_info || !right->branch_info)
@@ -1547,6 +1588,7 @@ static struct sort_dimension memory_sort_dimensions[] = {
DIM(SORT_MEM_LVL, "mem", sort_mem_lvl),
DIM(SORT_MEM_SNOOP, "snoop", sort_mem_snoop),
DIM(SORT_MEM_DCACHELINE, "dcacheline", sort_mem_dcacheline),
+ DIM(SORT_MEM_PHYS_DADDR, "phys_daddr", sort_mem_phys_daddr),
};
#undef DIM
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index b7c75597e18f..f36dc4980a6c 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -245,6 +245,7 @@ enum sort_type {
SORT_MEM_SNOOP,
SORT_MEM_DCACHELINE,
SORT_MEM_IADDR_SYMBOL,
+ SORT_MEM_PHYS_DADDR,
};
/*
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 5c39f420111e..9cf781f0d8a2 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -810,12 +810,6 @@ static u64 ref_reloc(struct kmap *kmap)
void __weak arch__sym_update(struct symbol *s __maybe_unused,
GElf_Sym *sym __maybe_unused) { }
-void __weak arch__adjust_sym_map_offset(GElf_Sym *sym, GElf_Shdr *shdr,
- struct map *map __maybe_unused)
-{
- sym->st_value -= shdr->sh_addr - shdr->sh_offset;
-}
-
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
struct symsrc *runtime_ss, int kmodule)
{
@@ -996,7 +990,7 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
/* Adjust symbol to map to file offset */
if (adjust_kernel_syms)
- arch__adjust_sym_map_offset(&sym, &shdr, map);
+ sym.st_value -= shdr.sh_addr - shdr.sh_offset;
if (strcmp(section_name,
(curr_dso->short_name +
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index d00a012cfdfb..aad99e7e179b 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -186,6 +186,7 @@ struct addr_map_symbol {
struct symbol *sym;
u64 addr;
u64 al_addr;
+ u64 phys_addr;
};
struct branch_info {
@@ -343,9 +344,6 @@ int setup_intlist(struct intlist **list, const char *list_str,
#ifdef HAVE_LIBELF_SUPPORT
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
void arch__sym_update(struct symbol *s, GElf_Sym *sym);
-void arch__adjust_sym_map_offset(GElf_Sym *sym,
- GElf_Shdr *shdr __maybe_unused,
- struct map *map __maybe_unused);
#endif
#define SYMBOL_A 0
diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c
index bbb4c1957578..6eea7cff3d4e 100644
--- a/tools/perf/util/syscalltbl.c
+++ b/tools/perf/util/syscalltbl.c
@@ -15,10 +15,11 @@
#include "syscalltbl.h"
#include <stdlib.h>
+#include <linux/compiler.h>
#ifdef HAVE_SYSCALL_TABLE
-#include <linux/compiler.h>
#include <string.h>
+#include "string2.h"
#include "util.h"
#if defined(__x86_64__)
@@ -105,6 +106,27 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
return sc ? sc->id : -1;
}
+int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
+{
+ int i;
+ struct syscall *syscalls = tbl->syscalls.entries;
+
+ for (i = *idx + 1; i < tbl->syscalls.nr_entries; ++i) {
+ if (strglobmatch(syscalls[i].name, syscall_glob)) {
+ *idx = i;
+ return syscalls[i].id;
+ }
+ }
+
+ return -1;
+}
+
+int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
+{
+ *idx = -1;
+ return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);
+}
+
#else /* HAVE_SYSCALL_TABLE */
#include <libaudit.h>
@@ -131,4 +153,15 @@ int syscalltbl__id(struct syscalltbl *tbl, const char *name)
{
return audit_name_to_syscall(name, tbl->audit_machine);
}
+
+int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
+ const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
+{
+ return -1;
+}
+
+int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
+{
+ return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);
+}
#endif /* HAVE_SYSCALL_TABLE */
diff --git a/tools/perf/util/syscalltbl.h b/tools/perf/util/syscalltbl.h
index e2951510484f..e9fb8786da7c 100644
--- a/tools/perf/util/syscalltbl.h
+++ b/tools/perf/util/syscalltbl.h
@@ -17,4 +17,7 @@ void syscalltbl__delete(struct syscalltbl *tbl);
const char *syscalltbl__name(const struct syscalltbl *tbl, int id);
int syscalltbl__id(struct syscalltbl *tbl, const char *name);
+int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
+int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx);
+
#endif /* __PERF_SYSCALLTBL_H */
diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile
index d6e1c02ddcfe..4c5a481a850c 100644
--- a/tools/power/cpupower/Makefile
+++ b/tools/power/cpupower/Makefile
@@ -26,7 +26,7 @@ endif
ifneq ($(OUTPUT),)
# check that the output directory actually exists
-OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd)
+OUTDIR := $(realpath $(OUTPUT))
$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
endif
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
index 1e8b6116ba3c..9dc8f078a83c 100644
--- a/tools/scripts/Makefile.include
+++ b/tools/scripts/Makefile.include
@@ -1,7 +1,7 @@
ifneq ($(O),)
ifeq ($(origin O), command line)
- dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
- ABSOLUTE_O := $(shell cd $(O) ; pwd)
+ ABSOLUTE_O := $(realpath $(O))
+ dummy := $(if $(ABSOLUTE_O),,$(error O=$(O) does not exist))
OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
COMMAND_O := O=$(ABSOLUTE_O)
ifeq ($(objtree),)
@@ -12,7 +12,7 @@ endif
# check that the output directory actually exists
ifneq ($(OUTPUT),)
-OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd)
+OUTDIR := $(realpath $(OUTPUT))
$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
endif
diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
index 4c2fa98ef39d..bef419d4266d 100644
--- a/tools/testing/nvdimm/test/nfit.c
+++ b/tools/testing/nvdimm/test/nfit.c
@@ -1527,9 +1527,6 @@ static void nfit_test1_setup(struct nfit_test *t)
set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
- set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
- set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
- set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
}
static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
@@ -1546,8 +1543,8 @@ static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
else {
memcpy(iobuf, mmio->addr.base + dpa, len);
- /* give us some some coverage of the mmio_flush_range() API */
- mmio_flush_range(mmio->addr.base + dpa, len);
+ /* give us some some coverage of the arch_invalidate_pmem() API */
+ arch_invalidate_pmem(mmio->addr.base + dpa, len);
}
nd_region_release_lane(nd_region, lane);
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 26ce4f7168be..ff805643b5f7 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -52,6 +52,10 @@ override LDFLAGS =
override MAKEFLAGS =
endif
+ifneq ($(KBUILD_SRC),)
+override LDFLAGS =
+endif
+
BUILD := $(O)
ifndef BUILD
BUILD := $(KBUILD_OUTPUT)
@@ -62,32 +66,32 @@ endif
export BUILD
all:
- for TARGET in $(TARGETS); do \
+ @for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
mkdir $$BUILD_TARGET -p; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET;\
done;
run_tests: all
- for TARGET in $(TARGETS); do \
+ @for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests;\
done;
hotplug:
- for TARGET in $(TARGETS_HOTPLUG); do \
+ @for TARGET in $(TARGETS_HOTPLUG); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET;\
done;
run_hotplug: hotplug
- for TARGET in $(TARGETS_HOTPLUG); do \
+ @for TARGET in $(TARGETS_HOTPLUG); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET run_full_test;\
done;
clean_hotplug:
- for TARGET in $(TARGETS_HOTPLUG); do \
+ @for TARGET in $(TARGETS_HOTPLUG); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\
done;
@@ -103,7 +107,7 @@ install:
ifdef INSTALL_PATH
@# Ask all targets to install their files
mkdir -p $(INSTALL_PATH)
- for TARGET in $(TARGETS); do \
+ @for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \
done;
@@ -128,7 +132,7 @@ else
endif
clean:
- for TARGET in $(TARGETS); do \
+ @for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \
make OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\
done;
diff --git a/tools/testing/selftests/bpf/bpf_util.h b/tools/testing/selftests/bpf/bpf_util.h
index 20ecbaa0d85d..6c53a8906eff 100644
--- a/tools/testing/selftests/bpf/bpf_util.h
+++ b/tools/testing/selftests/bpf/bpf_util.h
@@ -12,6 +12,7 @@ static inline unsigned int bpf_num_possible_cpus(void)
unsigned int start, end, possible_cpus = 0;
char buff[128];
FILE *fp;
+ int n;
fp = fopen(fcpu, "r");
if (!fp) {
@@ -20,17 +21,17 @@ static inline unsigned int bpf_num_possible_cpus(void)
}
while (fgets(buff, sizeof(buff), fp)) {
- if (sscanf(buff, "%u-%u", &start, &end) == 2) {
- possible_cpus = start == 0 ? end + 1 : 0;
- break;
+ n = sscanf(buff, "%u-%u", &start, &end);
+ if (n == 0) {
+ printf("Failed to retrieve # possible CPUs!\n");
+ exit(1);
+ } else if (n == 1) {
+ end = start;
}
+ possible_cpus = start == 0 ? end + 1 : 0;
+ break;
}
-
fclose(fp);
- if (!possible_cpus) {
- printf("Failed to retrieve # possible CPUs!\n");
- exit(1);
- }
return possible_cpus;
}
diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 8eb09950258b..26f3250bdcd2 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -6629,6 +6629,22 @@ static struct bpf_test tests[] = {
.result = REJECT,
.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
},
+ {
+ "invalid 64-bit BPF_END",
+ .insns = {
+ BPF_MOV32_IMM(BPF_REG_0, 0),
+ {
+ .code = BPF_ALU64 | BPF_END | BPF_TO_LE,
+ .dst_reg = BPF_REG_0,
+ .src_reg = 0,
+ .off = 0,
+ .imm = 32,
+ },
+ BPF_EXIT_INSN(),
+ },
+ .errstr = "BPF_END uses reserved fields",
+ .result = REJECT,
+ },
};
static int probe_filter_length(const struct bpf_insn *fp)
diff --git a/tools/testing/selftests/breakpoints/Makefile b/tools/testing/selftests/breakpoints/Makefile
index 6b214b7b10fb..247b0a1899d7 100644
--- a/tools/testing/selftests/breakpoints/Makefile
+++ b/tools/testing/selftests/breakpoints/Makefile
@@ -2,14 +2,14 @@
uname_M := $(shell uname -m 2>/dev/null || echo not)
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
+TEST_GEN_PROGS := step_after_suspend_test
+
ifeq ($(ARCH),x86)
-TEST_GEN_PROGS := breakpoint_test
+TEST_GEN_PROGS += breakpoint_test
endif
ifneq (,$(filter $(ARCH),aarch64 arm64))
-TEST_GEN_PROGS := breakpoint_test_arm64
+TEST_GEN_PROGS += breakpoint_test_arm64
endif
-TEST_GEN_PROGS += step_after_suspend_test
-
include ../lib.mk
diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc
index 2a1cb9908746..a4fd4c851a5b 100644
--- a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc
+++ b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc
@@ -1,6 +1,8 @@
#!/bin/sh
# description: Register/unregister many kprobe events
+[ -f kprobe_events ] || exit_unsupported # this is configurable
+
# ftrace fentry skip size depends on the machine architecture.
# Currently HAVE_KPROBES_ON_FTRACE defined on x86 and powerpc64le
case `uname -m` in
diff --git a/tools/testing/selftests/futex/Makefile b/tools/testing/selftests/futex/Makefile
index 7c647f619d63..f0c0369ccb79 100644
--- a/tools/testing/selftests/futex/Makefile
+++ b/tools/testing/selftests/futex/Makefile
@@ -7,14 +7,17 @@ TEST_PROGS := run.sh
include ../lib.mk
all:
- for DIR in $(SUBDIRS); do \
+ @for DIR in $(SUBDIRS); do \
BUILD_TARGET=$(OUTPUT)/$$DIR; \
mkdir $$BUILD_TARGET -p; \
make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\
+ if [ -e $$DIR/$(TEST_PROGS) ]; then
+ rsync -a $$DIR/$(TEST_PROGS) $$BUILD_TARGET/;
+ fi
done
override define RUN_TESTS
- $(OUTPUT)/run.sh
+ @cd $(OUTPUT); ./run.sh
endef
override define INSTALL_RULE
@@ -33,7 +36,7 @@ override define EMIT_TESTS
endef
override define CLEAN
- for DIR in $(SUBDIRS); do \
+ @for DIR in $(SUBDIRS); do \
BUILD_TARGET=$(OUTPUT)/$$DIR; \
mkdir $$BUILD_TARGET -p; \
make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\
diff --git a/tools/testing/selftests/intel_pstate/Makefile b/tools/testing/selftests/intel_pstate/Makefile
index 849a90ffe8dd..a97e24edde39 100644
--- a/tools/testing/selftests/intel_pstate/Makefile
+++ b/tools/testing/selftests/intel_pstate/Makefile
@@ -1,7 +1,9 @@
CFLAGS := $(CFLAGS) -Wall -D_GNU_SOURCE
LDLIBS := $(LDLIBS) -lm
+ifeq (,$(filter $(ARCH),x86))
TEST_GEN_FILES := msr aperf
+endif
TEST_PROGS := run.sh
diff --git a/tools/testing/selftests/intel_pstate/run.sh b/tools/testing/selftests/intel_pstate/run.sh
index 7868c106b8b1..d3ab48f91cd6 100755
--- a/tools/testing/selftests/intel_pstate/run.sh
+++ b/tools/testing/selftests/intel_pstate/run.sh
@@ -29,13 +29,12 @@
EVALUATE_ONLY=0
-max_cpus=$(($(nproc)-1))
+if ! uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ | grep -q x86; then
+ echo "$0 # Skipped: Test can only run on x86 architectures."
+ exit 0
+fi
-# compile programs
-gcc aperf.c -Wall -D_GNU_SOURCE -o aperf -lm
-[ $? -ne 0 ] && echo "Problem compiling aperf.c." && exit 1
-gcc -o msr msr.c -lm
-[ $? -ne 0 ] && echo "Problem compiling msr.c." && exit 1
+max_cpus=$(($(nproc)-1))
function run_test () {
diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
index 693616651da5..f65886af7c0c 100644
--- a/tools/testing/selftests/lib.mk
+++ b/tools/testing/selftests/lib.mk
@@ -6,7 +6,14 @@ ifeq (0,$(MAKELEVEL))
OUTPUT := $(shell pwd)
endif
+# The following are built by lib.mk common compile rules.
+# TEST_CUSTOM_PROGS should be used by tests that require
+# custom build rule and prevent common build rule use.
+# TEST_PROGS are for test shell scripts.
+# TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests
+# and install targets. Common clean doesn't touch them.
TEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS))
+TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED))
TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES))
all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
@@ -20,17 +27,28 @@ define RUN_TESTS
test_num=`echo $$test_num+1 | bc`; \
echo "selftests: $$BASENAME_TEST"; \
echo "========================================"; \
- if [ ! -x $$BASENAME_TEST ]; then \
+ if [ ! -x $$TEST ]; then \
echo "selftests: Warning: file $$BASENAME_TEST is not executable, correct this.";\
echo "not ok 1..$$test_num selftests: $$BASENAME_TEST [FAIL]"; \
else \
- cd `dirname $$TEST` > /dev/null; (./$$BASENAME_TEST && echo "ok 1..$$test_num selftests: $$BASENAME_TEST [PASS]") || echo "not ok 1..$$test_num selftests: $$BASENAME_TEST [FAIL]"; cd - > /dev/null;\
+ cd `dirname $$TEST` > /dev/null; (./$$BASENAME_TEST > /tmp/$$BASENAME_TEST 2>&1 && echo "ok 1..$$test_num selftests: $$BASENAME_TEST [PASS]") || echo "not ok 1..$$test_num selftests: $$BASENAME_TEST [FAIL]"; cd - > /dev/null;\
fi; \
done;
endef
run_tests: all
- $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_PROGS))
+ifneq ($(KBUILD_SRC),)
+ @if [ "X$(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)" != "X" ]; then
+ @rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT)
+ fi
+ @if [ "X$(TEST_PROGS)" != "X" ]; then
+ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(OUTPUT)/$(TEST_PROGS))
+ else
+ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS))
+ fi
+else
+ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
+endif
define INSTALL_RULE
@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
@@ -38,10 +56,10 @@ define INSTALL_RULE
echo "rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/"; \
rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/; \
fi
- @if [ "X$(TEST_GEN_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then \
+ @if [ "X$(TEST_GEN_PROGS)$(TEST_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then \
mkdir -p ${INSTALL_PATH}; \
- echo "rsync -a $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/"; \
- rsync -a $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/; \
+ echo "rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/"; \
+ rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/; \
fi
endef
@@ -53,15 +71,20 @@ else
endif
define EMIT_TESTS
- @for TEST in $(TEST_GEN_PROGS) $(TEST_PROGS); do \
+ @for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
BASENAME_TEST=`basename $$TEST`; \
- echo "(./$$BASENAME_TEST && echo \"selftests: $$BASENAME_TEST [PASS]\") || echo \"selftests: $$BASENAME_TEST [FAIL]\""; \
+ echo "(./$$BASENAME_TEST > /tmp/$$BASENAME_TEST 2>&1 && echo \"selftests: $$BASENAME_TEST [PASS]\") || echo \"selftests: $$BASENAME_TEST [FAIL]\""; \
done;
endef
emit_tests:
$(EMIT_TESTS)
+# define if isn't already. It is undefined in make O= case.
+ifeq ($(RM),)
+RM := rm -f
+endif
+
define CLEAN
$(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)
endef
@@ -69,6 +92,15 @@ endef
clean:
$(CLEAN)
+# When make O= with kselftest target from main level
+# the following aren't defined.
+#
+ifneq ($(KBUILD_SRC),)
+LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
+COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
+LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
+endif
+
$(OUTPUT)/%:%.c
$(LINK.c) $^ $(LDLIBS) -o $@
diff --git a/tools/testing/selftests/memfd/run_tests.sh b/tools/testing/selftests/memfd/run_tests.sh
index daabb350697c..daabb350697c 100644..100755
--- a/tools/testing/selftests/memfd/run_tests.sh
+++ b/tools/testing/selftests/memfd/run_tests.sh
diff --git a/tools/testing/selftests/mqueue/Makefile b/tools/testing/selftests/mqueue/Makefile
index 79a664aeb8d7..0f5e347b068d 100644
--- a/tools/testing/selftests/mqueue/Makefile
+++ b/tools/testing/selftests/mqueue/Makefile
@@ -5,8 +5,8 @@ TEST_GEN_PROGS := mq_open_tests mq_perf_tests
include ../lib.mk
override define RUN_TESTS
- @./mq_open_tests /test1 || echo "selftests: mq_open_tests [FAIL]"
- @./mq_perf_tests || echo "selftests: mq_perf_tests [FAIL]"
+ $(OUTPUT)/mq_open_tests /test1 || echo "selftests: mq_open_tests [FAIL]"
+ $(OUTPUT)//mq_perf_tests || echo "selftests: mq_perf_tests [FAIL]"
endef
override define EMIT_TESTS
diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore
index 9801253e4802..c612d6e38c62 100644
--- a/tools/testing/selftests/net/.gitignore
+++ b/tools/testing/selftests/net/.gitignore
@@ -6,3 +6,4 @@ reuseport_bpf
reuseport_bpf_cpu
reuseport_bpf_numa
reuseport_dualstack
+reuseaddr_conflict
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index de1f5772b878..d86bca991f45 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -5,9 +5,9 @@ CFLAGS += -I../../../../usr/include/
TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh rtnetlink.sh
TEST_GEN_FILES = socket
-TEST_GEN_FILES += psock_fanout psock_tpacket
-TEST_GEN_FILES += reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
-TEST_GEN_FILES += reuseport_dualstack msg_zerocopy
+TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy
+TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
+TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict
include ../lib.mk
diff --git a/tools/testing/selftests/net/msg_zerocopy.c b/tools/testing/selftests/net/msg_zerocopy.c
index 40232af5b023..3ab6ec403905 100644
--- a/tools/testing/selftests/net/msg_zerocopy.c
+++ b/tools/testing/selftests/net/msg_zerocopy.c
@@ -55,7 +55,7 @@
#include <unistd.h>
#ifndef SO_EE_ORIGIN_ZEROCOPY
-#define SO_EE_ORIGIN_ZEROCOPY SO_EE_ORIGIN_UPAGE
+#define SO_EE_ORIGIN_ZEROCOPY 5
#endif
#ifndef SO_ZEROCOPY
diff --git a/tools/testing/selftests/net/netdevice.sh b/tools/testing/selftests/net/netdevice.sh
index 4e00568d70c2..90cb903c3381 100755
--- a/tools/testing/selftests/net/netdevice.sh
+++ b/tools/testing/selftests/net/netdevice.sh
@@ -178,7 +178,7 @@ if [ "$(id -u)" -ne 0 ];then
exit 0
fi
-ip -Version 2>/dev/null >/dev/null
+ip link show 2>/dev/null >/dev/null
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without the ip tool"
exit 0
diff --git a/tools/testing/selftests/net/reuseaddr_conflict.c b/tools/testing/selftests/net/reuseaddr_conflict.c
new file mode 100644
index 000000000000..7c5b12664b03
--- /dev/null
+++ b/tools/testing/selftests/net/reuseaddr_conflict.c
@@ -0,0 +1,114 @@
+/*
+ * Test for the regression introduced by
+ *
+ * b9470c27607b ("inet: kill smallest_size and smallest_port")
+ *
+ * If we open an ipv4 socket on a port with reuseaddr we shouldn't reset the tb
+ * when we open the ipv6 conterpart, which is what was happening previously.
+ */
+#include <errno.h>
+#include <error.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#define PORT 9999
+
+int open_port(int ipv6, int any)
+{
+ int fd = -1;
+ int reuseaddr = 1;
+ int v6only = 1;
+ int addrlen;
+ int ret = -1;
+ struct sockaddr *addr;
+ int family = ipv6 ? AF_INET6 : AF_INET;
+
+ struct sockaddr_in6 addr6 = {
+ .sin6_family = AF_INET6,
+ .sin6_port = htons(PORT),
+ .sin6_addr = in6addr_any
+ };
+ struct sockaddr_in addr4 = {
+ .sin_family = AF_INET,
+ .sin_port = htons(PORT),
+ .sin_addr.s_addr = any ? htonl(INADDR_ANY) : inet_addr("127.0.0.1"),
+ };
+
+
+ if (ipv6) {
+ addr = (struct sockaddr*)&addr6;
+ addrlen = sizeof(addr6);
+ } else {
+ addr = (struct sockaddr*)&addr4;
+ addrlen = sizeof(addr4);
+ }
+
+ if ((fd = socket(family, SOCK_STREAM, IPPROTO_TCP)) < 0) {
+ perror("socket");
+ goto out;
+ }
+
+ if (ipv6 && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&v6only,
+ sizeof(v6only)) < 0) {
+ perror("setsockopt IPV6_V6ONLY");
+ goto out;
+ }
+
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
+ sizeof(reuseaddr)) < 0) {
+ perror("setsockopt SO_REUSEADDR");
+ goto out;
+ }
+
+ if (bind(fd, addr, addrlen) < 0) {
+ perror("bind");
+ goto out;
+ }
+
+ if (any)
+ return fd;
+
+ if (listen(fd, 1) < 0) {
+ perror("listen");
+ goto out;
+ }
+ return fd;
+out:
+ close(fd);
+ return ret;
+}
+
+int main(void)
+{
+ int listenfd;
+ int fd1, fd2;
+
+ fprintf(stderr, "Opening 127.0.0.1:%d\n", PORT);
+ listenfd = open_port(0, 0);
+ if (listenfd < 0)
+ error(1, errno, "Couldn't open listen socket");
+ fprintf(stderr, "Opening INADDR_ANY:%d\n", PORT);
+ fd1 = open_port(0, 1);
+ if (fd1 >= 0)
+ error(1, 0, "Was allowed to create an ipv4 reuseport on a already bound non-reuseport socket");
+ fprintf(stderr, "Opening in6addr_any:%d\n", PORT);
+ fd1 = open_port(1, 1);
+ if (fd1 < 0)
+ error(1, errno, "Couldn't open ipv6 reuseport");
+ fprintf(stderr, "Opening INADDR_ANY:%d\n", PORT);
+ fd2 = open_port(0, 1);
+ if (fd2 >= 0)
+ error(1, 0, "Was allowed to create an ipv4 reuseport on a already bound non-reuseport socket");
+ close(fd1);
+ fprintf(stderr, "Opening INADDR_ANY:%d after closing ipv6 socket\n", PORT);
+ fd1 = open_port(0, 1);
+ if (fd1 >= 0)
+ error(1, 0, "Was allowed to create an ipv4 reuseport on an already bound non-reuseport socket with no ipv6");
+ fprintf(stderr, "Success");
+ return 0;
+}
diff --git a/tools/testing/selftests/networking/timestamping/rxtimestamp.c b/tools/testing/selftests/networking/timestamping/rxtimestamp.c
index 00f286661dcd..dd4162fc0419 100644
--- a/tools/testing/selftests/networking/timestamping/rxtimestamp.c
+++ b/tools/testing/selftests/networking/timestamping/rxtimestamp.c
@@ -341,7 +341,7 @@ int main(int argc, char **argv)
return 0;
case 'n':
t = atoi(optarg);
- if (t > ARRAY_SIZE(test_cases))
+ if (t >= ARRAY_SIZE(test_cases))
error(1, 0, "Invalid test case: %d", t);
all_tests = false;
test_cases[t].enabled = true;
diff --git a/tools/testing/selftests/seccomp/Makefile b/tools/testing/selftests/seccomp/Makefile
index aeb0c805f3ca..553d870b4ca9 100644
--- a/tools/testing/selftests/seccomp/Makefile
+++ b/tools/testing/selftests/seccomp/Makefile
@@ -1,8 +1,16 @@
-TEST_GEN_PROGS := seccomp_bpf
-CFLAGS += -Wl,-no-as-needed -Wall
-LDFLAGS += -lpthread
+all:
include ../lib.mk
-$(TEST_GEN_PROGS): seccomp_bpf.c ../kselftest_harness.h
- $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
+.PHONY: all clean
+
+BINARIES := seccomp_bpf seccomp_benchmark
+CFLAGS += -Wl,-no-as-needed -Wall
+
+seccomp_bpf: seccomp_bpf.c ../kselftest_harness.h
+ $(CC) $(CFLAGS) $(LDFLAGS) -lpthread $< -o $@
+
+TEST_PROGS += $(BINARIES)
+EXTRA_CLEAN := $(BINARIES)
+
+all: $(BINARIES)
diff --git a/tools/testing/selftests/seccomp/seccomp_benchmark.c b/tools/testing/selftests/seccomp/seccomp_benchmark.c
new file mode 100644
index 000000000000..5838c8697ec3
--- /dev/null
+++ b/tools/testing/selftests/seccomp/seccomp_benchmark.c
@@ -0,0 +1,99 @@
+/*
+ * Strictly speaking, this is not a test. But it can report during test
+ * runs so relative performace can be measured.
+ */
+#define _GNU_SOURCE
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <linux/filter.h>
+#include <linux/seccomp.h>
+#include <sys/prctl.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+unsigned long long timing(clockid_t clk_id, unsigned long long samples)
+{
+ pid_t pid, ret;
+ unsigned long long i;
+ struct timespec start, finish;
+
+ pid = getpid();
+ assert(clock_gettime(clk_id, &start) == 0);
+ for (i = 0; i < samples; i++) {
+ ret = syscall(__NR_getpid);
+ assert(pid == ret);
+ }
+ assert(clock_gettime(clk_id, &finish) == 0);
+
+ i = finish.tv_sec - start.tv_sec;
+ i *= 1000000000;
+ i += finish.tv_nsec - start.tv_nsec;
+
+ printf("%lu.%09lu - %lu.%09lu = %llu\n",
+ finish.tv_sec, finish.tv_nsec,
+ start.tv_sec, start.tv_nsec,
+ i);
+
+ return i;
+}
+
+unsigned long long calibrate(void)
+{
+ unsigned long long i;
+
+ printf("Calibrating reasonable sample size...\n");
+
+ for (i = 5; ; i++) {
+ unsigned long long samples = 1 << i;
+
+ /* Find something that takes more than 5 seconds to run. */
+ if (timing(CLOCK_REALTIME, samples) / 1000000000ULL > 5)
+ return samples;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ struct sock_filter filter[] = {
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ };
+ struct sock_fprog prog = {
+ .len = (unsigned short)ARRAY_SIZE(filter),
+ .filter = filter,
+ };
+ long ret;
+ unsigned long long samples;
+ unsigned long long native, filtered;
+
+ if (argc > 1)
+ samples = strtoull(argv[1], NULL, 0);
+ else
+ samples = calibrate();
+
+ printf("Benchmarking %llu samples...\n", samples);
+
+ native = timing(CLOCK_PROCESS_CPUTIME_ID, samples) / samples;
+ printf("getpid native: %llu ns\n", native);
+
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ assert(ret == 0);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+ assert(ret == 0);
+
+ filtered = timing(CLOCK_PROCESS_CPUTIME_ID, samples) / samples;
+ printf("getpid RET_ALLOW: %llu ns\n", filtered);
+
+ printf("Estimated seccomp overhead per syscall: %llu ns\n",
+ filtered - native);
+
+ if (filtered == native)
+ printf("Trying running again with more samples.\n");
+
+ return 0;
+}
diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
index 4d6f92a9df6b..24dbf634e2dd 100644
--- a/tools/testing/selftests/seccomp/seccomp_bpf.c
+++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
@@ -6,10 +6,18 @@
*/
#include <sys/types.h>
-#include <asm/siginfo.h>
-#define __have_siginfo_t 1
-#define __have_sigval_t 1
-#define __have_sigevent_t 1
+
+/*
+ * glibc 2.26 and later have SIGSYS in siginfo_t. Before that,
+ * we need to use the kernel's siginfo.h file and trick glibc
+ * into accepting it.
+ */
+#if !__GLIBC_PREREQ(2, 26)
+# include <asm/siginfo.h>
+# define __have_siginfo_t 1
+# define __have_sigval_t 1
+# define __have_sigevent_t 1
+#endif
#include <errno.h>
#include <linux/filter.h>
@@ -68,17 +76,7 @@
#define SECCOMP_MODE_FILTER 2
#endif
-#ifndef SECCOMP_RET_KILL
-#define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */
-#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
-#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
-#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
-#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
-
-/* Masks for the return value sections. */
-#define SECCOMP_RET_ACTION 0x7fff0000U
-#define SECCOMP_RET_DATA 0x0000ffffU
-
+#ifndef SECCOMP_RET_ALLOW
struct seccomp_data {
int nr;
__u32 arch;
@@ -87,6 +85,70 @@ struct seccomp_data {
};
#endif
+#ifndef SECCOMP_RET_KILL_PROCESS
+#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */
+#define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */
+#endif
+#ifndef SECCOMP_RET_KILL
+#define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD
+#define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
+#define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
+#define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
+#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
+#endif
+#ifndef SECCOMP_RET_LOG
+#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */
+#endif
+
+#ifndef __NR_seccomp
+# if defined(__i386__)
+# define __NR_seccomp 354
+# elif defined(__x86_64__)
+# define __NR_seccomp 317
+# elif defined(__arm__)
+# define __NR_seccomp 383
+# elif defined(__aarch64__)
+# define __NR_seccomp 277
+# elif defined(__hppa__)
+# define __NR_seccomp 338
+# elif defined(__powerpc__)
+# define __NR_seccomp 358
+# elif defined(__s390__)
+# define __NR_seccomp 348
+# else
+# warning "seccomp syscall number unknown for this architecture"
+# define __NR_seccomp 0xffff
+# endif
+#endif
+
+#ifndef SECCOMP_SET_MODE_STRICT
+#define SECCOMP_SET_MODE_STRICT 0
+#endif
+
+#ifndef SECCOMP_SET_MODE_FILTER
+#define SECCOMP_SET_MODE_FILTER 1
+#endif
+
+#ifndef SECCOMP_GET_ACTION_AVAIL
+#define SECCOMP_GET_ACTION_AVAIL 2
+#endif
+
+#ifndef SECCOMP_FILTER_FLAG_TSYNC
+#define SECCOMP_FILTER_FLAG_TSYNC 1
+#endif
+
+#ifndef SECCOMP_FILTER_FLAG_LOG
+#define SECCOMP_FILTER_FLAG_LOG 2
+#endif
+
+#ifndef seccomp
+int seccomp(unsigned int op, unsigned int flags, void *args)
+{
+ errno = 0;
+ return syscall(__NR_seccomp, op, flags, args);
+}
+#endif
+
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))
#elif __BYTE_ORDER == __BIG_ENDIAN
@@ -136,7 +198,7 @@ TEST(no_new_privs_support)
}
}
-/* Tests kernel support by checking for a copy_from_user() fault on * NULL. */
+/* Tests kernel support by checking for a copy_from_user() fault on NULL. */
TEST(mode_filter_support)
{
long ret;
@@ -342,6 +404,28 @@ TEST(empty_prog)
EXPECT_EQ(EINVAL, errno);
}
+TEST(log_all)
+{
+ struct sock_filter filter[] = {
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG),
+ };
+ struct sock_fprog prog = {
+ .len = (unsigned short)ARRAY_SIZE(filter),
+ .filter = filter,
+ };
+ long ret;
+ pid_t parent = getppid();
+
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+ ASSERT_EQ(0, ret);
+
+ /* getppid() should succeed and be logged (no check for logging) */
+ EXPECT_EQ(parent, syscall(__NR_getppid));
+}
+
TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS)
{
struct sock_filter filter[] = {
@@ -520,6 +604,117 @@ TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
close(fd);
}
+/* This is a thread task to die via seccomp filter violation. */
+void *kill_thread(void *data)
+{
+ bool die = (bool)data;
+
+ if (die) {
+ prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
+ return (void *)SIBLING_EXIT_FAILURE;
+ }
+
+ return (void *)SIBLING_EXIT_UNKILLED;
+}
+
+/* Prepare a thread that will kill itself or both of us. */
+void kill_thread_or_group(struct __test_metadata *_metadata, bool kill_process)
+{
+ pthread_t thread;
+ void *status;
+ /* Kill only when calling __NR_prctl. */
+ struct sock_filter filter_thread[] = {
+ BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+ offsetof(struct seccomp_data, nr)),
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_THREAD),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ };
+ struct sock_fprog prog_thread = {
+ .len = (unsigned short)ARRAY_SIZE(filter_thread),
+ .filter = filter_thread,
+ };
+ struct sock_filter filter_process[] = {
+ BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+ offsetof(struct seccomp_data, nr)),
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_PROCESS),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ };
+ struct sock_fprog prog_process = {
+ .len = (unsigned short)ARRAY_SIZE(filter_process),
+ .filter = filter_process,
+ };
+
+ ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+ TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+ }
+
+ ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0,
+ kill_process ? &prog_process : &prog_thread));
+
+ /*
+ * Add the KILL_THREAD rule again to make sure that the KILL_PROCESS
+ * flag cannot be downgraded by a new filter.
+ */
+ ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog_thread));
+
+ /* Start a thread that will exit immediately. */
+ ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)false));
+ ASSERT_EQ(0, pthread_join(thread, &status));
+ ASSERT_EQ(SIBLING_EXIT_UNKILLED, (unsigned long)status);
+
+ /* Start a thread that will die immediately. */
+ ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)true));
+ ASSERT_EQ(0, pthread_join(thread, &status));
+ ASSERT_NE(SIBLING_EXIT_FAILURE, (unsigned long)status);
+
+ /*
+ * If we get here, only the spawned thread died. Let the parent know
+ * the whole process didn't die (i.e. this thread, the spawner,
+ * stayed running).
+ */
+ exit(42);
+}
+
+TEST(KILL_thread)
+{
+ int status;
+ pid_t child_pid;
+
+ child_pid = fork();
+ ASSERT_LE(0, child_pid);
+ if (child_pid == 0) {
+ kill_thread_or_group(_metadata, false);
+ _exit(38);
+ }
+
+ ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+
+ /* If only the thread was killed, we'll see exit 42. */
+ ASSERT_TRUE(WIFEXITED(status));
+ ASSERT_EQ(42, WEXITSTATUS(status));
+}
+
+TEST(KILL_process)
+{
+ int status;
+ pid_t child_pid;
+
+ child_pid = fork();
+ ASSERT_LE(0, child_pid);
+ if (child_pid == 0) {
+ kill_thread_or_group(_metadata, true);
+ _exit(38);
+ }
+
+ ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+
+ /* If the entire process was killed, we'll see SIGSYS. */
+ ASSERT_TRUE(WIFSIGNALED(status));
+ ASSERT_EQ(SIGSYS, WTERMSIG(status));
+}
+
/* TODO(wad) add 64-bit versus 32-bit arg tests. */
TEST(arg_out_of_range)
{
@@ -541,26 +736,30 @@ TEST(arg_out_of_range)
EXPECT_EQ(EINVAL, errno);
}
+#define ERRNO_FILTER(name, errno) \
+ struct sock_filter _read_filter_##name[] = { \
+ BPF_STMT(BPF_LD|BPF_W|BPF_ABS, \
+ offsetof(struct seccomp_data, nr)), \
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), \
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | errno), \
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), \
+ }; \
+ struct sock_fprog prog_##name = { \
+ .len = (unsigned short)ARRAY_SIZE(_read_filter_##name), \
+ .filter = _read_filter_##name, \
+ }
+
+/* Make sure basic errno values are correctly passed through a filter. */
TEST(ERRNO_valid)
{
- struct sock_filter filter[] = {
- BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
- offsetof(struct seccomp_data, nr)),
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
- };
- struct sock_fprog prog = {
- .len = (unsigned short)ARRAY_SIZE(filter),
- .filter = filter,
- };
+ ERRNO_FILTER(valid, E2BIG);
long ret;
pid_t parent = getppid();
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
ASSERT_EQ(0, ret);
- ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_valid);
ASSERT_EQ(0, ret);
EXPECT_EQ(parent, syscall(__NR_getppid));
@@ -568,26 +767,17 @@ TEST(ERRNO_valid)
EXPECT_EQ(E2BIG, errno);
}
+/* Make sure an errno of zero is correctly handled by the arch code. */
TEST(ERRNO_zero)
{
- struct sock_filter filter[] = {
- BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
- offsetof(struct seccomp_data, nr)),
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
- };
- struct sock_fprog prog = {
- .len = (unsigned short)ARRAY_SIZE(filter),
- .filter = filter,
- };
+ ERRNO_FILTER(zero, 0);
long ret;
pid_t parent = getppid();
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
ASSERT_EQ(0, ret);
- ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_zero);
ASSERT_EQ(0, ret);
EXPECT_EQ(parent, syscall(__NR_getppid));
@@ -595,26 +785,21 @@ TEST(ERRNO_zero)
EXPECT_EQ(0, read(0, NULL, 0));
}
+/*
+ * The SECCOMP_RET_DATA mask is 16 bits wide, but errno is smaller.
+ * This tests that the errno value gets capped correctly, fixed by
+ * 580c57f10768 ("seccomp: cap SECCOMP_RET_ERRNO data to MAX_ERRNO").
+ */
TEST(ERRNO_capped)
{
- struct sock_filter filter[] = {
- BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
- offsetof(struct seccomp_data, nr)),
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 4096),
- BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
- };
- struct sock_fprog prog = {
- .len = (unsigned short)ARRAY_SIZE(filter),
- .filter = filter,
- };
+ ERRNO_FILTER(capped, 4096);
long ret;
pid_t parent = getppid();
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
ASSERT_EQ(0, ret);
- ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_capped);
ASSERT_EQ(0, ret);
EXPECT_EQ(parent, syscall(__NR_getppid));
@@ -622,6 +807,37 @@ TEST(ERRNO_capped)
EXPECT_EQ(4095, errno);
}
+/*
+ * Filters are processed in reverse order: last applied is executed first.
+ * Since only the SECCOMP_RET_ACTION mask is tested for return values, the
+ * SECCOMP_RET_DATA mask results will follow the most recently applied
+ * matching filter return (and not the lowest or highest value).
+ */
+TEST(ERRNO_order)
+{
+ ERRNO_FILTER(first, 11);
+ ERRNO_FILTER(second, 13);
+ ERRNO_FILTER(third, 12);
+ long ret;
+ pid_t parent = getppid();
+
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_first);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_second);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_third);
+ ASSERT_EQ(0, ret);
+
+ EXPECT_EQ(parent, syscall(__NR_getppid));
+ EXPECT_EQ(-1, read(0, NULL, 0));
+ EXPECT_EQ(12, errno);
+}
+
FIXTURE_DATA(TRAP) {
struct sock_fprog prog;
};
@@ -676,7 +892,7 @@ TEST_F_SIGNAL(TRAP, ign, SIGSYS)
syscall(__NR_getpid);
}
-static struct siginfo TRAP_info;
+static siginfo_t TRAP_info;
static volatile int TRAP_nr;
static void TRAP_action(int nr, siginfo_t *info, void *void_context)
{
@@ -735,6 +951,7 @@ TEST_F(TRAP, handler)
FIXTURE_DATA(precedence) {
struct sock_fprog allow;
+ struct sock_fprog log;
struct sock_fprog trace;
struct sock_fprog error;
struct sock_fprog trap;
@@ -746,6 +963,13 @@ FIXTURE_SETUP(precedence)
struct sock_filter allow_insns[] = {
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
};
+ struct sock_filter log_insns[] = {
+ BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+ offsetof(struct seccomp_data, nr)),
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG),
+ };
struct sock_filter trace_insns[] = {
BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
offsetof(struct seccomp_data, nr)),
@@ -782,6 +1006,7 @@ FIXTURE_SETUP(precedence)
memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \
self->_x.len = (unsigned short)ARRAY_SIZE(_x##_insns)
FILTER_ALLOC(allow);
+ FILTER_ALLOC(log);
FILTER_ALLOC(trace);
FILTER_ALLOC(error);
FILTER_ALLOC(trap);
@@ -792,6 +1017,7 @@ FIXTURE_TEARDOWN(precedence)
{
#define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)
FILTER_FREE(allow);
+ FILTER_FREE(log);
FILTER_FREE(trace);
FILTER_FREE(error);
FILTER_FREE(trap);
@@ -809,6 +1035,8 @@ TEST_F(precedence, allow_ok)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
@@ -833,6 +1061,8 @@ TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
@@ -864,6 +1094,8 @@ TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS)
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
@@ -885,6 +1117,8 @@ TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
@@ -910,6 +1144,8 @@ TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS)
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
@@ -931,6 +1167,8 @@ TEST_F(precedence, errno_is_third)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
@@ -949,6 +1187,8 @@ TEST_F(precedence, errno_is_third_in_any_order)
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
@@ -971,6 +1211,8 @@ TEST_F(precedence, trace_is_fourth)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
ASSERT_EQ(0, ret);
/* Should work just fine. */
@@ -992,12 +1234,54 @@ TEST_F(precedence, trace_is_fourth_in_any_order)
ASSERT_EQ(0, ret);
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
/* Should work just fine. */
EXPECT_EQ(parent, syscall(__NR_getppid));
/* No ptracer */
EXPECT_EQ(-1, syscall(__NR_getpid));
}
+TEST_F(precedence, log_is_fifth)
+{
+ pid_t mypid, parent;
+ long ret;
+
+ mypid = getpid();
+ parent = getppid();
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+ ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
+ /* Should work just fine. */
+ EXPECT_EQ(parent, syscall(__NR_getppid));
+ /* Should also work just fine */
+ EXPECT_EQ(mypid, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, log_is_fifth_in_any_order)
+{
+ pid_t mypid, parent;
+ long ret;
+
+ mypid = getpid();
+ parent = getppid();
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ ASSERT_EQ(0, ret);
+
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
+ ASSERT_EQ(0, ret);
+ ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+ ASSERT_EQ(0, ret);
+ /* Should work just fine. */
+ EXPECT_EQ(parent, syscall(__NR_getppid));
+ /* Should also work just fine */
+ EXPECT_EQ(mypid, syscall(__NR_getpid));
+}
+
#ifndef PTRACE_O_TRACESECCOMP
#define PTRACE_O_TRACESECCOMP 0x00000080
#endif
@@ -1262,6 +1546,13 @@ TEST_F(TRACE_poke, getpid_runs_normally)
# error "Do not know how to find your architecture's registers and syscalls"
#endif
+/* When the syscall return can't be changed, stub out the tests for it. */
+#ifdef SYSCALL_NUM_RET_SHARE_REG
+# define EXPECT_SYSCALL_RETURN(val, action) EXPECT_EQ(-1, action)
+#else
+# define EXPECT_SYSCALL_RETURN(val, action) EXPECT_EQ(val, action)
+#endif
+
/* Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for
* architectures without HAVE_ARCH_TRACEHOOK (e.g. User-mode Linux).
*/
@@ -1357,7 +1648,7 @@ void change_syscall(struct __test_metadata *_metadata,
#ifdef SYSCALL_NUM_RET_SHARE_REG
TH_LOG("Can't modify syscall return on this architecture");
#else
- regs.SYSCALL_RET = 1;
+ regs.SYSCALL_RET = EPERM;
#endif
#ifdef HAVE_GETREGS
@@ -1426,6 +1717,8 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
if (nr == __NR_getpid)
change_syscall(_metadata, tracee, __NR_getppid);
+ if (nr == __NR_open)
+ change_syscall(_metadata, tracee, -1);
}
FIXTURE_DATA(TRACE_syscall) {
@@ -1480,6 +1773,28 @@ FIXTURE_TEARDOWN(TRACE_syscall)
free(self->prog.filter);
}
+TEST_F(TRACE_syscall, ptrace_syscall_redirected)
+{
+ /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
+ teardown_trace_fixture(_metadata, self->tracer);
+ self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
+ true);
+
+ /* Tracer will redirect getpid to getppid. */
+ EXPECT_NE(self->mypid, syscall(__NR_getpid));
+}
+
+TEST_F(TRACE_syscall, ptrace_syscall_dropped)
+{
+ /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
+ teardown_trace_fixture(_metadata, self->tracer);
+ self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
+ true);
+
+ /* Tracer should skip the open syscall, resulting in EPERM. */
+ EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_open));
+}
+
TEST_F(TRACE_syscall, syscall_allowed)
{
long ret;
@@ -1520,13 +1835,8 @@ TEST_F(TRACE_syscall, syscall_dropped)
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
ASSERT_EQ(0, ret);
-#ifdef SYSCALL_NUM_RET_SHARE_REG
- /* gettid has been skipped */
- EXPECT_EQ(-1, syscall(__NR_gettid));
-#else
/* gettid has been skipped and an altered return value stored. */
- EXPECT_EQ(1, syscall(__NR_gettid));
-#endif
+ EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_gettid));
EXPECT_NE(self->mytid, syscall(__NR_gettid));
}
@@ -1557,6 +1867,7 @@ TEST_F(TRACE_syscall, skip_after_RET_TRACE)
ASSERT_EQ(0, ret);
/* Tracer will redirect getpid to getppid, and we should see EPERM. */
+ errno = 0;
EXPECT_EQ(-1, syscall(__NR_getpid));
EXPECT_EQ(EPERM, errno);
}
@@ -1654,47 +1965,6 @@ TEST_F_SIGNAL(TRACE_syscall, kill_after_ptrace, SIGSYS)
EXPECT_NE(self->mypid, syscall(__NR_getpid));
}
-#ifndef __NR_seccomp
-# if defined(__i386__)
-# define __NR_seccomp 354
-# elif defined(__x86_64__)
-# define __NR_seccomp 317
-# elif defined(__arm__)
-# define __NR_seccomp 383
-# elif defined(__aarch64__)
-# define __NR_seccomp 277
-# elif defined(__hppa__)
-# define __NR_seccomp 338
-# elif defined(__powerpc__)
-# define __NR_seccomp 358
-# elif defined(__s390__)
-# define __NR_seccomp 348
-# else
-# warning "seccomp syscall number unknown for this architecture"
-# define __NR_seccomp 0xffff
-# endif
-#endif
-
-#ifndef SECCOMP_SET_MODE_STRICT
-#define SECCOMP_SET_MODE_STRICT 0
-#endif
-
-#ifndef SECCOMP_SET_MODE_FILTER
-#define SECCOMP_SET_MODE_FILTER 1
-#endif
-
-#ifndef SECCOMP_FILTER_FLAG_TSYNC
-#define SECCOMP_FILTER_FLAG_TSYNC 1
-#endif
-
-#ifndef seccomp
-int seccomp(unsigned int op, unsigned int flags, void *args)
-{
- errno = 0;
- return syscall(__NR_seccomp, op, flags, args);
-}
-#endif
-
TEST(seccomp_syscall)
{
struct sock_filter filter[] = {
@@ -1783,6 +2053,67 @@ TEST(seccomp_syscall_mode_lock)
}
}
+/*
+ * Test detection of known and unknown filter flags. Userspace needs to be able
+ * to check if a filter flag is supported by the current kernel and a good way
+ * of doing that is by attempting to enter filter mode, with the flag bit in
+ * question set, and a NULL pointer for the _args_ parameter. EFAULT indicates
+ * that the flag is valid and EINVAL indicates that the flag is invalid.
+ */
+TEST(detect_seccomp_filter_flags)
+{
+ unsigned int flags[] = { SECCOMP_FILTER_FLAG_TSYNC,
+ SECCOMP_FILTER_FLAG_LOG };
+ unsigned int flag, all_flags;
+ int i;
+ long ret;
+
+ /* Test detection of known-good filter flags */
+ for (i = 0, all_flags = 0; i < ARRAY_SIZE(flags); i++) {
+ flag = flags[i];
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
+ ASSERT_NE(ENOSYS, errno) {
+ TH_LOG("Kernel does not support seccomp syscall!");
+ }
+ EXPECT_EQ(-1, ret);
+ EXPECT_EQ(EFAULT, errno) {
+ TH_LOG("Failed to detect that a known-good filter flag (0x%X) is supported!",
+ flag);
+ }
+
+ all_flags |= flag;
+ }
+
+ /* Test detection of all known-good filter flags */
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, all_flags, NULL);
+ EXPECT_EQ(-1, ret);
+ EXPECT_EQ(EFAULT, errno) {
+ TH_LOG("Failed to detect that all known-good filter flags (0x%X) are supported!",
+ all_flags);
+ }
+
+ /* Test detection of an unknown filter flag */
+ flag = -1;
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
+ EXPECT_EQ(-1, ret);
+ EXPECT_EQ(EINVAL, errno) {
+ TH_LOG("Failed to detect that an unknown filter flag (0x%X) is unsupported!",
+ flag);
+ }
+
+ /*
+ * Test detection of an unknown filter flag that may simply need to be
+ * added to this test
+ */
+ flag = flags[ARRAY_SIZE(flags) - 1] << 1;
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
+ EXPECT_EQ(-1, ret);
+ EXPECT_EQ(EINVAL, errno) {
+ TH_LOG("Failed to detect that an unknown filter flag (0x%X) is unsupported! Does a new flag need to be added to this test?",
+ flag);
+ }
+}
+
TEST(TSYNC_first)
{
struct sock_filter filter[] = {
@@ -2421,6 +2752,99 @@ TEST(syscall_restart)
_metadata->passed = 0;
}
+TEST_SIGNAL(filter_flag_log, SIGSYS)
+{
+ struct sock_filter allow_filter[] = {
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ };
+ struct sock_filter kill_filter[] = {
+ BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+ offsetof(struct seccomp_data, nr)),
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+ };
+ struct sock_fprog allow_prog = {
+ .len = (unsigned short)ARRAY_SIZE(allow_filter),
+ .filter = allow_filter,
+ };
+ struct sock_fprog kill_prog = {
+ .len = (unsigned short)ARRAY_SIZE(kill_filter),
+ .filter = kill_filter,
+ };
+ long ret;
+ pid_t parent = getppid();
+
+ ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ ASSERT_EQ(0, ret);
+
+ /* Verify that the FILTER_FLAG_LOG flag isn't accepted in strict mode */
+ ret = seccomp(SECCOMP_SET_MODE_STRICT, SECCOMP_FILTER_FLAG_LOG,
+ &allow_prog);
+ ASSERT_NE(ENOSYS, errno) {
+ TH_LOG("Kernel does not support seccomp syscall!");
+ }
+ EXPECT_NE(0, ret) {
+ TH_LOG("Kernel accepted FILTER_FLAG_LOG flag in strict mode!");
+ }
+ EXPECT_EQ(EINVAL, errno) {
+ TH_LOG("Kernel returned unexpected errno for FILTER_FLAG_LOG flag in strict mode!");
+ }
+
+ /* Verify that a simple, permissive filter can be added with no flags */
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &allow_prog);
+ EXPECT_EQ(0, ret);
+
+ /* See if the same filter can be added with the FILTER_FLAG_LOG flag */
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG,
+ &allow_prog);
+ ASSERT_NE(EINVAL, errno) {
+ TH_LOG("Kernel does not support the FILTER_FLAG_LOG flag!");
+ }
+ EXPECT_EQ(0, ret);
+
+ /* Ensure that the kill filter works with the FILTER_FLAG_LOG flag */
+ ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG,
+ &kill_prog);
+ EXPECT_EQ(0, ret);
+
+ EXPECT_EQ(parent, syscall(__NR_getppid));
+ /* getpid() should never return. */
+ EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST(get_action_avail)
+{
+ __u32 actions[] = { SECCOMP_RET_KILL_THREAD, SECCOMP_RET_TRAP,
+ SECCOMP_RET_ERRNO, SECCOMP_RET_TRACE,
+ SECCOMP_RET_LOG, SECCOMP_RET_ALLOW };
+ __u32 unknown_action = 0x10000000U;
+ int i;
+ long ret;
+
+ ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[0]);
+ ASSERT_NE(ENOSYS, errno) {
+ TH_LOG("Kernel does not support seccomp syscall!");
+ }
+ ASSERT_NE(EINVAL, errno) {
+ TH_LOG("Kernel does not support SECCOMP_GET_ACTION_AVAIL operation!");
+ }
+ EXPECT_EQ(ret, 0);
+
+ for (i = 0; i < ARRAY_SIZE(actions); i++) {
+ ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[i]);
+ EXPECT_EQ(ret, 0) {
+ TH_LOG("Expected action (0x%X) not available!",
+ actions[i]);
+ }
+ }
+
+ /* Check that an unknown action is handled properly (EOPNOTSUPP) */
+ ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &unknown_action);
+ EXPECT_EQ(ret, -1);
+ EXPECT_EQ(errno, EOPNOTSUPP);
+}
+
/*
* TODO:
* - add microbenchmarks
@@ -2429,6 +2853,8 @@ TEST(syscall_restart)
* - endianness checking when appropriate
* - 64-bit arg prodding
* - arch value testing (x86 modes especially)
+ * - verify that FILTER_FLAG_LOG filters generate log messages
+ * - verify that RET_LOG generates log messages
* - ...
*/
diff --git a/tools/testing/selftests/sigaltstack/sas.c b/tools/testing/selftests/sigaltstack/sas.c
index 7d406c3973ba..97bb150837df 100644
--- a/tools/testing/selftests/sigaltstack/sas.c
+++ b/tools/testing/selftests/sigaltstack/sas.c
@@ -39,7 +39,11 @@ void my_usr1(int sig, siginfo_t *si, void *u)
stack_t stk;
struct stk_data *p;
+#if __s390x__
+ register unsigned long sp asm("%15");
+#else
register unsigned long sp asm("sp");
+#endif
if (sp < (unsigned long)sstack ||
sp >= (unsigned long)sstack + SIGSTKSZ) {
diff --git a/tools/testing/selftests/sync/Makefile b/tools/testing/selftests/sync/Makefile
index 4981c6b6d050..8e04d0afcbd7 100644
--- a/tools/testing/selftests/sync/Makefile
+++ b/tools/testing/selftests/sync/Makefile
@@ -2,12 +2,16 @@ CFLAGS += -O2 -g -std=gnu89 -pthread -Wall -Wextra
CFLAGS += -I../../../../usr/include/
LDFLAGS += -pthread
-TEST_PROGS = sync_test
-
-all: $(TEST_PROGS)
+.PHONY: all clean
include ../lib.mk
+# lib.mk TEST_CUSTOM_PROGS var is for custom tests that need special
+# build rules. lib.mk will run and install them.
+
+TEST_CUSTOM_PROGS := $(OUTPUT)/sync_test
+all: $(TEST_CUSTOM_PROGS)
+
OBJS = sync_test.o sync.o
TESTS += sync_alloc.o
@@ -18,6 +22,16 @@ TESTS += sync_stress_parallelism.o
TESTS += sync_stress_consumer.o
TESTS += sync_stress_merge.o
-sync_test: $(OBJS) $(TESTS)
+OBJS := $(patsubst %,$(OUTPUT)/%,$(OBJS))
+TESTS := $(patsubst %,$(OUTPUT)/%,$(TESTS))
+
+$(TEST_CUSTOM_PROGS): $(TESTS) $(OBJS)
+ $(CC) -o $(TEST_CUSTOM_PROGS) $(OBJS) $(TESTS) $(CFLAGS) $(LDFLAGS)
+
+$(OBJS): $(OUTPUT)/%.o: %.c
+ $(CC) -c $^ -o $@
+
+$(TESTS): $(OUTPUT)/%.o: %.c
+ $(CC) -c $^ -o $@
-EXTRA_CLEAN := sync_test $(OBJS) $(TESTS)
+EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(OBJS) $(TESTS)
diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c
index 9c92b7bd5641..50da45437daa 100644
--- a/tools/testing/selftests/timers/set-timer-lat.c
+++ b/tools/testing/selftests/timers/set-timer-lat.c
@@ -143,7 +143,8 @@ int setup_timer(int clock_id, int flags, int interval, timer_t *tm1)
printf("%-22s %s missing CAP_WAKE_ALARM? : [UNSUPPORTED]\n",
clockstring(clock_id),
flags ? "ABSTIME":"RELTIME");
- return 0;
+ /* Indicate timer isn't set, so caller doesn't wait */
+ return 1;
}
printf("%s - timer_create() failed\n", clockstring(clock_id));
return -1;
@@ -213,8 +214,9 @@ int do_timer(int clock_id, int flags)
int err;
err = setup_timer(clock_id, flags, interval, &tm1);
+ /* Unsupported case - return 0 to not fail the test */
if (err)
- return err;
+ return err == 1 ? 0 : err;
while (alarmcount < 5)
sleep(1);
@@ -228,18 +230,17 @@ int do_timer_oneshot(int clock_id, int flags)
timer_t tm1;
const int interval = 0;
struct timeval timeout;
- fd_set fds;
int err;
err = setup_timer(clock_id, flags, interval, &tm1);
+ /* Unsupported case - return 0 to not fail the test */
if (err)
- return err;
+ return err == 1 ? 0 : err;
memset(&timeout, 0, sizeof(timeout));
timeout.tv_sec = 5;
- FD_ZERO(&fds);
do {
- err = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
+ err = select(0, NULL, NULL, NULL, &timeout);
} while (err == -1 && errno == EINTR);
timer_delete(tm1);
diff --git a/tools/testing/selftests/watchdog/Makefile b/tools/testing/selftests/watchdog/Makefile
index f863c664e3d1..ee068511fd0b 100644
--- a/tools/testing/selftests/watchdog/Makefile
+++ b/tools/testing/selftests/watchdog/Makefile
@@ -1,8 +1,3 @@
-TEST_PROGS := watchdog-test
-
-all: $(TEST_PROGS)
+TEST_GEN_PROGS := watchdog-test
include ../lib.mk
-
-clean:
- rm -fr $(TEST_PROGS)
diff --git a/tools/testing/selftests/x86/mpx-mini-test.c b/tools/testing/selftests/x86/mpx-mini-test.c
index a8df159a8924..ec0f6b45ce8b 100644
--- a/tools/testing/selftests/x86/mpx-mini-test.c
+++ b/tools/testing/selftests/x86/mpx-mini-test.c
@@ -391,8 +391,7 @@ void handler(int signum, siginfo_t *si, void *vucontext)
br_count++;
dprintf1("#BR 0x%jx (total seen: %d)\n", status, br_count);
-#define __SI_FAULT (3 << 16)
-#define SEGV_BNDERR (__SI_FAULT|3) /* failed address bound checks */
+#define SEGV_BNDERR 3 /* failed address bound checks */
dprintf2("Saw a #BR! status 0x%jx at %016lx br_reason: %jx\n",
status, ip, br_reason);
diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c
index 3237bc010e1c..23927845518d 100644
--- a/tools/testing/selftests/x86/protection_keys.c
+++ b/tools/testing/selftests/x86/protection_keys.c
@@ -212,19 +212,18 @@ void dump_mem(void *dumpme, int len_bytes)
}
}
-#define __SI_FAULT (3 << 16)
-#define SEGV_BNDERR (__SI_FAULT|3) /* failed address bound checks */
-#define SEGV_PKUERR (__SI_FAULT|4)
+#define SEGV_BNDERR 3 /* failed address bound checks */
+#define SEGV_PKUERR 4
static char *si_code_str(int si_code)
{
- if (si_code & SEGV_MAPERR)
+ if (si_code == SEGV_MAPERR)
return "SEGV_MAPERR";
- if (si_code & SEGV_ACCERR)
+ if (si_code == SEGV_ACCERR)
return "SEGV_ACCERR";
- if (si_code & SEGV_BNDERR)
+ if (si_code == SEGV_BNDERR)
return "SEGV_BNDERR";
- if (si_code & SEGV_PKUERR)
+ if (si_code == SEGV_PKUERR)
return "SEGV_PKUERR";
return "UNKNOWN";
}
diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
index bb298a200cd3..57bcb27dcf30 100644
--- a/virt/kvm/async_pf.c
+++ b/virt/kvm/async_pf.c
@@ -106,11 +106,7 @@ static void async_pf_execute(struct work_struct *work)
trace_kvm_async_pf_completed(addr, gva);
- /*
- * This memory barrier pairs with prepare_to_wait's set_current_state()
- */
- smp_mb();
- if (swait_active(&vcpu->wq))
+ if (swq_has_sleeper(&vcpu->wq))
swake_up(&vcpu->wq);
mmput(mm);
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 6ed1c2021198..9deb5a245b83 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -674,6 +674,7 @@ out_err_no_irq_srcu:
out_err_no_srcu:
hardware_disable_all();
out_err_no_disable:
+ refcount_set(&kvm->users_count, 0);
for (i = 0; i < KVM_NR_BUSES; i++)
kfree(kvm_get_bus(kvm, i));
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++)
@@ -2186,7 +2187,7 @@ bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
struct swait_queue_head *wqp;
wqp = kvm_arch_vcpu_wq(vcpu);
- if (swait_active(wqp)) {
+ if (swq_has_sleeper(wqp)) {
swake_up(wqp);
++vcpu->stat.halt_wakeup;
return true;